@burdenoff/microfe-botmanor 2026.1108.1 → 2026.1109.1

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 (334) hide show
  1. package/dist/botlit/BotlitRoutes.d.ts +2 -0
  2. package/dist/botlit/BotlitRoutes.js +24 -25
  3. package/dist/botlit/BotlitRoutes.js.map +1 -1
  4. package/dist/botlit/BotmanorRoot.d.ts +3 -0
  5. package/dist/botlit/BotmanorRoot.js +1 -2
  6. package/dist/botlit/BotmanorRoot.js.map +1 -1
  7. package/dist/botlit/BotmanorRootInner.d.ts +3 -0
  8. package/dist/botlit/BotmanorRootInner.js +9 -10
  9. package/dist/botlit/BotmanorRootInner.js.map +1 -1
  10. package/dist/botlit/components/AgentApprovalPanel.d.ts +20 -0
  11. package/dist/botlit/components/AgentApprovalPanel.js +49 -50
  12. package/dist/botlit/components/AgentApprovalPanel.js.map +1 -1
  13. package/dist/botlit/components/AiOperationsPanel.d.ts +14 -0
  14. package/dist/botlit/components/AiOperationsPanel.js +54 -55
  15. package/dist/botlit/components/AiOperationsPanel.js.map +1 -1
  16. package/dist/botlit/components/AssistantChannelPanel.d.ts +3 -0
  17. package/dist/botlit/components/AssistantChannelPanel.js +12 -13
  18. package/dist/botlit/components/AssistantChannelPanel.js.map +1 -1
  19. package/dist/botlit/components/AssistantRuntimeSetupPanel.d.ts +4 -0
  20. package/dist/botlit/components/AssistantRuntimeSetupPanel.js +14 -14
  21. package/dist/botlit/components/AssistantRuntimeSetupPanel.js.map +1 -1
  22. package/dist/botlit/components/AssistantWebsitePanel.d.ts +5 -0
  23. package/dist/botlit/components/AssistantWebsitePanel.js +15 -16
  24. package/dist/botlit/components/AssistantWebsitePanel.js.map +1 -1
  25. package/dist/botlit/components/Badge.d.ts +9 -0
  26. package/dist/botlit/components/Badge.js +1 -2
  27. package/dist/botlit/components/Badge.js.map +1 -1
  28. package/dist/botlit/components/Button.d.ts +10 -0
  29. package/dist/botlit/components/Button.js +1 -2
  30. package/dist/botlit/components/Button.js.map +1 -1
  31. package/dist/botlit/components/Card.d.ts +16 -0
  32. package/dist/botlit/components/Card.js +1 -2
  33. package/dist/botlit/components/Card.js.map +1 -1
  34. package/dist/botlit/components/ChannelSelectorSheet.d.ts +23 -0
  35. package/dist/botlit/components/ChannelSelectorSheet.js +1 -2
  36. package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
  37. package/dist/botlit/components/EmptyState.d.ts +12 -0
  38. package/dist/botlit/components/EmptyState.js +1 -2
  39. package/dist/botlit/components/EmptyState.js.map +1 -1
  40. package/dist/botlit/components/ErrorState.d.ts +10 -0
  41. package/dist/botlit/components/ErrorState.js +5 -6
  42. package/dist/botlit/components/ErrorState.js.map +1 -1
  43. package/dist/botlit/components/Input.d.ts +27 -0
  44. package/dist/botlit/components/Input.js +1 -2
  45. package/dist/botlit/components/Input.js.map +1 -1
  46. package/dist/botlit/components/KnowledgeSourceImportPanel.d.ts +3 -0
  47. package/dist/botlit/components/KnowledgeSourceImportPanel.js +12 -13
  48. package/dist/botlit/components/KnowledgeSourceImportPanel.js.map +1 -1
  49. package/dist/botlit/components/ModelRegistrationPanel.d.ts +5 -0
  50. package/dist/botlit/components/ModelRegistrationPanel.js +1 -2
  51. package/dist/botlit/components/ModelRegistrationPanel.js.map +1 -1
  52. package/dist/botlit/components/PageLayout.d.ts +12 -0
  53. package/dist/botlit/components/PageLayout.js +1 -2
  54. package/dist/botlit/components/PageLayout.js.map +1 -1
  55. package/dist/botlit/components/QuotaExhaustedDialog.d.ts +9 -0
  56. package/dist/botlit/components/QuotaExhaustedDialog.js +1 -2
  57. package/dist/botlit/components/QuotaExhaustedDialog.js.map +1 -1
  58. package/dist/botlit/components/RetentionStatusPanel.d.ts +2 -0
  59. package/dist/botlit/components/RetentionStatusPanel.js +18 -19
  60. package/dist/botlit/components/RetentionStatusPanel.js.map +1 -1
  61. package/dist/botlit/components/RouteLoader.d.ts +23 -0
  62. package/dist/botlit/components/RouteLoader.js +1 -2
  63. package/dist/botlit/components/RouteLoader.js.map +1 -1
  64. package/dist/botlit/components/VersionHistoryPanel.d.ts +12 -0
  65. package/dist/botlit/components/VersionHistoryPanel.js +23 -24
  66. package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
  67. package/dist/botlit/components/WorkspaceRequired.d.ts +18 -0
  68. package/dist/botlit/components/WorkspaceRequired.js +1 -2
  69. package/dist/botlit/components/WorkspaceRequired.js.map +1 -1
  70. package/dist/botlit/components/index.d.ts +14 -0
  71. package/dist/botlit/hooks/index.d.ts +36 -0
  72. package/dist/botlit/hooks/index.js +15 -14
  73. package/dist/botlit/hooks/internal/mutationInput.d.ts +56 -0
  74. package/dist/botlit/hooks/internal/mutationInput.js +1 -2
  75. package/dist/botlit/hooks/internal/mutationInput.js.map +1 -1
  76. package/dist/botlit/hooks/internal/workspaceGateway.d.ts +54 -0
  77. package/dist/botlit/hooks/internal/workspaceGateway.js +17 -19
  78. package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
  79. package/dist/botlit/hooks/useA2A.d.ts +104 -0
  80. package/dist/botlit/hooks/useA2A.js +45 -45
  81. package/dist/botlit/hooks/useA2A.js.map +1 -1
  82. package/dist/botlit/hooks/useAgentApprovals.d.ts +62 -0
  83. package/dist/botlit/hooks/useAgentApprovals.js +38 -39
  84. package/dist/botlit/hooks/useAgentApprovals.js.map +1 -1
  85. package/dist/botlit/hooks/useAgents.d.ts +105 -0
  86. package/dist/botlit/hooks/useAgents.js +53 -54
  87. package/dist/botlit/hooks/useAgents.js.map +1 -1
  88. package/dist/botlit/hooks/useAiOperations.d.ts +95 -0
  89. package/dist/botlit/hooks/useAiOperations.js +20 -19
  90. package/dist/botlit/hooks/useAiOperations.js.map +1 -1
  91. package/dist/botlit/hooks/useAssistantChannels.d.ts +16 -0
  92. package/dist/botlit/hooks/useAssistantChannels.js +1 -2
  93. package/dist/botlit/hooks/useAssistantChannels.js.map +1 -1
  94. package/dist/botlit/hooks/useAssistantRuntimeSetup.d.ts +17 -0
  95. package/dist/botlit/hooks/useAssistantRuntimeSetup.js +1 -2
  96. package/dist/botlit/hooks/useAssistantRuntimeSetup.js.map +1 -1
  97. package/dist/botlit/hooks/useAssistantWebsites.d.ts +18 -0
  98. package/dist/botlit/hooks/useAssistantWebsites.js +1 -2
  99. package/dist/botlit/hooks/useAssistantWebsites.js.map +1 -1
  100. package/dist/botlit/hooks/useBotWorkflow.d.ts +22 -0
  101. package/dist/botlit/hooks/useBotWorkflow.js +1 -2
  102. package/dist/botlit/hooks/useBotWorkflow.js.map +1 -1
  103. package/dist/botlit/hooks/useBots.d.ts +68 -0
  104. package/dist/botlit/hooks/useBots.js +32 -33
  105. package/dist/botlit/hooks/useBots.js.map +1 -1
  106. package/dist/botlit/hooks/useBuckets.d.ts +57 -0
  107. package/dist/botlit/hooks/useBuckets.js +38 -39
  108. package/dist/botlit/hooks/useBuckets.js.map +1 -1
  109. package/dist/botlit/hooks/useChannels.d.ts +87 -0
  110. package/dist/botlit/hooks/useChannels.js +73 -73
  111. package/dist/botlit/hooks/useChannels.js.map +1 -1
  112. package/dist/botlit/hooks/useConversations.d.ts +42 -0
  113. package/dist/botlit/hooks/useConversations.js +1 -2
  114. package/dist/botlit/hooks/useConversations.js.map +1 -1
  115. package/dist/botlit/hooks/useExecutions.d.ts +87 -0
  116. package/dist/botlit/hooks/useExecutions.js +37 -37
  117. package/dist/botlit/hooks/useExecutions.js.map +1 -1
  118. package/dist/botlit/hooks/useKnowledgeBases.d.ts +79 -0
  119. package/dist/botlit/hooks/useKnowledgeBases.js +40 -39
  120. package/dist/botlit/hooks/useKnowledgeBases.js.map +1 -1
  121. package/dist/botlit/hooks/useKnowledgeSourceImports.d.ts +21 -0
  122. package/dist/botlit/hooks/useKnowledgeSourceImports.js +1 -2
  123. package/dist/botlit/hooks/useKnowledgeSourceImports.js.map +1 -1
  124. package/dist/botlit/hooks/useLLMProviders.d.ts +66 -0
  125. package/dist/botlit/hooks/useLLMProviders.js +25 -26
  126. package/dist/botlit/hooks/useLLMProviders.js.map +1 -1
  127. package/dist/botlit/hooks/useMCPServers.d.ts +71 -0
  128. package/dist/botlit/hooks/useMCPServers.js +40 -38
  129. package/dist/botlit/hooks/useMCPServers.js.map +1 -1
  130. package/dist/botlit/hooks/usePolicies.d.ts +60 -0
  131. package/dist/botlit/hooks/usePolicies.js +49 -49
  132. package/dist/botlit/hooks/usePolicies.js.map +1 -1
  133. package/dist/botlit/hooks/usePromptTemplates.d.ts +88 -0
  134. package/dist/botlit/hooks/usePromptTemplates.js +57 -57
  135. package/dist/botlit/hooks/usePromptTemplates.js.map +1 -1
  136. package/dist/botlit/hooks/useRetention.d.ts +26 -0
  137. package/dist/botlit/hooks/useRetention.js +3 -3
  138. package/dist/botlit/hooks/useRetention.js.map +1 -1
  139. package/dist/botlit/hooks/useRetrievalProfiles.d.ts +75 -0
  140. package/dist/botlit/hooks/useRetrievalProfiles.js +47 -47
  141. package/dist/botlit/hooks/useRetrievalProfiles.js.map +1 -1
  142. package/dist/botlit/hooks/useSkills.d.ts +64 -0
  143. package/dist/botlit/hooks/useSkills.js +53 -53
  144. package/dist/botlit/hooks/useSkills.js.map +1 -1
  145. package/dist/botlit/hooks/useStore.d.ts +112 -0
  146. package/dist/botlit/hooks/useStore.js +55 -55
  147. package/dist/botlit/hooks/useStore.js.map +1 -1
  148. package/dist/botlit/hooks/useUserPlatformConnection.d.ts +80 -0
  149. package/dist/botlit/hooks/useUserPlatformConnection.js +19 -19
  150. package/dist/botlit/hooks/useUserPlatformConnection.js.map +1 -1
  151. package/dist/botlit/index.d.ts +16 -0
  152. package/dist/botlit/index.js +12 -11
  153. package/dist/botlit/pages/A2AAgentDetailPage.d.ts +6 -0
  154. package/dist/botlit/pages/A2AAgentDetailPage.js +171 -178
  155. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
  156. package/dist/botlit/pages/A2ARegistryPage.d.ts +2 -0
  157. package/dist/botlit/pages/A2ARegistryPage.js +25 -26
  158. package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
  159. package/dist/botlit/pages/AgentApprovalsPage.d.ts +2 -0
  160. package/dist/botlit/pages/AgentApprovalsPage.js +32 -33
  161. package/dist/botlit/pages/AgentApprovalsPage.js.map +1 -1
  162. package/dist/botlit/pages/AgentBuilderPage.d.ts +2 -0
  163. package/dist/botlit/pages/AgentBuilderPage.js +59 -60
  164. package/dist/botlit/pages/AgentBuilderPage.js.map +1 -1
  165. package/dist/botlit/pages/AgentDetailPage.d.ts +2 -0
  166. package/dist/botlit/pages/AgentDetailPage.js +83 -84
  167. package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
  168. package/dist/botlit/pages/AgentsListPage.d.ts +2 -0
  169. package/dist/botlit/pages/AgentsListPage.js +71 -72
  170. package/dist/botlit/pages/AgentsListPage.js.map +1 -1
  171. package/dist/botlit/pages/AiOperationsPage.d.ts +2 -0
  172. package/dist/botlit/pages/AiOperationsPage.js +52 -53
  173. package/dist/botlit/pages/AiOperationsPage.js.map +1 -1
  174. package/dist/botlit/pages/BotChannelsTab.d.ts +7 -0
  175. package/dist/botlit/pages/BotChannelsTab.js +120 -122
  176. package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
  177. package/dist/botlit/pages/BotDetailPage.d.ts +7 -0
  178. package/dist/botlit/pages/BotDetailPage.js +353 -358
  179. package/dist/botlit/pages/BotDetailPage.js.map +1 -1
  180. package/dist/botlit/pages/BotWorkflowTab.d.ts +11 -0
  181. package/dist/botlit/pages/BotWorkflowTab.js +20 -21
  182. package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
  183. package/dist/botlit/pages/BotsListPage.d.ts +2 -0
  184. package/dist/botlit/pages/BotsListPage.js +52 -53
  185. package/dist/botlit/pages/BotsListPage.js.map +1 -1
  186. package/dist/botlit/pages/BucketsPage.d.ts +2 -0
  187. package/dist/botlit/pages/BucketsPage.js +260 -261
  188. package/dist/botlit/pages/BucketsPage.js.map +1 -1
  189. package/dist/botlit/pages/ChannelDetailPage.d.ts +6 -0
  190. package/dist/botlit/pages/ChannelDetailPage.js +97 -96
  191. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
  192. package/dist/botlit/pages/ChannelRoutesPage.d.ts +2 -0
  193. package/dist/botlit/pages/ChannelRoutesPage.js +23 -24
  194. package/dist/botlit/pages/ChannelRoutesPage.js.map +1 -1
  195. package/dist/botlit/pages/ChannelsPage.d.ts +2 -0
  196. package/dist/botlit/pages/ChannelsPage.js +44 -45
  197. package/dist/botlit/pages/ChannelsPage.js.map +1 -1
  198. package/dist/botlit/pages/ChatPage.d.ts +1 -0
  199. package/dist/botlit/pages/ChatPage.js +10 -11
  200. package/dist/botlit/pages/ChatPage.js.map +1 -1
  201. package/dist/botlit/pages/ConversationDetailPage.d.ts +2 -0
  202. package/dist/botlit/pages/ConversationsPage.d.ts +2 -0
  203. package/dist/botlit/pages/DashboardPage.d.ts +2 -0
  204. package/dist/botlit/pages/DashboardPage.js +37 -38
  205. package/dist/botlit/pages/DashboardPage.js.map +1 -1
  206. package/dist/botlit/pages/ExecutionDetailPage.d.ts +2 -0
  207. package/dist/botlit/pages/ExecutionDetailPage.js +47 -48
  208. package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -1
  209. package/dist/botlit/pages/ExecutionsPage.d.ts +2 -0
  210. package/dist/botlit/pages/ExecutionsPage.js +72 -70
  211. package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
  212. package/dist/botlit/pages/InstalledPackagesPage.d.ts +2 -0
  213. package/dist/botlit/pages/InstalledPackagesPage.js +77 -78
  214. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
  215. package/dist/botlit/pages/KnowledgeBaseDetailPage.d.ts +6 -0
  216. package/dist/botlit/pages/KnowledgeBaseDetailPage.js +171 -181
  217. package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -1
  218. package/dist/botlit/pages/KnowledgeBasesPage.d.ts +2 -0
  219. package/dist/botlit/pages/KnowledgeBasesPage.js +30 -31
  220. package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
  221. package/dist/botlit/pages/MCPServerDetailPage.d.ts +6 -0
  222. package/dist/botlit/pages/MCPServerDetailPage.js +82 -83
  223. package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -1
  224. package/dist/botlit/pages/MCPServersPage.d.ts +2 -0
  225. package/dist/botlit/pages/MCPServersPage.js +54 -55
  226. package/dist/botlit/pages/MCPServersPage.js.map +1 -1
  227. package/dist/botlit/pages/PoliciesPage.d.ts +2 -0
  228. package/dist/botlit/pages/PoliciesPage.js +25 -26
  229. package/dist/botlit/pages/PoliciesPage.js.map +1 -1
  230. package/dist/botlit/pages/PolicyDetailPage.d.ts +6 -0
  231. package/dist/botlit/pages/PolicyDetailPage.js +257 -259
  232. package/dist/botlit/pages/PolicyDetailPage.js.map +1 -1
  233. package/dist/botlit/pages/PromptStudioPage.d.ts +2 -0
  234. package/dist/botlit/pages/PromptStudioPage.js +35 -35
  235. package/dist/botlit/pages/PromptStudioPage.js.map +1 -1
  236. package/dist/botlit/pages/PromptTemplateDetailPage.d.ts +6 -0
  237. package/dist/botlit/pages/PromptTemplateDetailPage.js +363 -362
  238. package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -1
  239. package/dist/botlit/pages/PromptTemplatesPage.d.ts +2 -0
  240. package/dist/botlit/pages/PromptTemplatesPage.js +26 -27
  241. package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -1
  242. package/dist/botlit/pages/RetrievalProfileDetailPage.d.ts +6 -0
  243. package/dist/botlit/pages/RetrievalProfileDetailPage.js +150 -158
  244. package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -1
  245. package/dist/botlit/pages/RetrievalProfilesPage.d.ts +2 -0
  246. package/dist/botlit/pages/RetrievalProfilesPage.js +24 -25
  247. package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
  248. package/dist/botlit/pages/SettingsPage.d.ts +2 -0
  249. package/dist/botlit/pages/SettingsPage.js +124 -125
  250. package/dist/botlit/pages/SettingsPage.js.map +1 -1
  251. package/dist/botlit/pages/SkillDetailPage.d.ts +6 -0
  252. package/dist/botlit/pages/SkillDetailPage.js +216 -217
  253. package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
  254. package/dist/botlit/pages/SkillsPage.d.ts +2 -0
  255. package/dist/botlit/pages/SkillsPage.js +24 -25
  256. package/dist/botlit/pages/SkillsPage.js.map +1 -1
  257. package/dist/botlit/pages/StorePackageDetailPage.d.ts +2 -0
  258. package/dist/botlit/pages/StorePackageDetailPage.js +38 -39
  259. package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
  260. package/dist/botlit/pages/StorePage.d.ts +2 -0
  261. package/dist/botlit/pages/StorePage.js +135 -136
  262. package/dist/botlit/pages/StorePage.js.map +1 -1
  263. package/dist/botlit/pages/index.d.ts +39 -0
  264. package/dist/botlit/permissions/PermissionRequired.d.ts +20 -0
  265. package/dist/botlit/permissions/PermissionRequired.js +10 -11
  266. package/dist/botlit/permissions/PermissionRequired.js.map +1 -1
  267. package/dist/botlit/permissions/botmanorPermissions.d.ts +82 -0
  268. package/dist/botlit/permissions/botmanorPermissions.js +1 -2
  269. package/dist/botlit/permissions/botmanorPermissions.js.map +1 -1
  270. package/dist/botlit/permissions/index.d.ts +7 -0
  271. package/dist/botlit/permissions/index.js +4 -3
  272. package/dist/botlit/permissions/useBotmanorPermissions.d.ts +41 -0
  273. package/dist/botlit/permissions/useBotmanorPermissions.js +1 -2
  274. package/dist/botlit/permissions/useBotmanorPermissions.js.map +1 -1
  275. package/dist/botlit/providers/BotlitProvider.d.ts +14 -0
  276. package/dist/botlit/providers/BotlitProvider.js +3 -3
  277. package/dist/botlit/providers/BotlitProvider.js.map +1 -1
  278. package/dist/botlit/store/botlitStore.d.ts +85 -0
  279. package/dist/botlit/store/botlitStore.js +1 -2
  280. package/dist/botlit/store/botlitStore.js.map +1 -1
  281. package/dist/botlit/store/renamedKeyStorage.d.ts +13 -0
  282. package/dist/botlit/store/renamedKeyStorage.js +1 -2
  283. package/dist/botlit/store/renamedKeyStorage.js.map +1 -1
  284. package/dist/botlit/types/index.d.ts +1008 -0
  285. package/dist/botlit/utils/cn.d.ts +2 -0
  286. package/dist/botlit/utils/cn.js +1 -2
  287. package/dist/botlit/utils/cn.js.map +1 -1
  288. package/dist/botlit/utils/embedding-models.d.ts +9 -0
  289. package/dist/botlit/utils/embedding-models.js +1 -2
  290. package/dist/botlit/utils/embedding-models.js.map +1 -1
  291. package/dist/botlit/utils/errors.d.ts +19 -0
  292. package/dist/botlit/utils/errors.js +1 -2
  293. package/dist/botlit/utils/errors.js.map +1 -1
  294. package/dist/botlit/utils/formatters.d.ts +38 -0
  295. package/dist/botlit/utils/formatters.js +0 -1
  296. package/dist/botlit/utils/formatters.js.map +1 -1
  297. package/dist/botlit/utils/navigation.d.ts +19 -0
  298. package/dist/botlit/utils/navigation.js +1 -2
  299. package/dist/botlit/utils/navigation.js.map +1 -1
  300. package/dist/botlit/utils/policyConfig.d.ts +68 -0
  301. package/dist/botlit/utils/policyConfig.js +2 -3
  302. package/dist/botlit/utils/policyConfig.js.map +1 -1
  303. package/dist/botlit/utils/unions.d.ts +25 -0
  304. package/dist/botlit/utils/unions.js +1 -2
  305. package/dist/botlit/utils/unions.js.map +1 -1
  306. package/dist/dev/App.d.ts +2 -0
  307. package/dist/dev/main.d.ts +0 -0
  308. package/dist/generated/global-operations.d.ts +197 -0
  309. package/dist/generated/global-operations.js +1 -2
  310. package/dist/generated/global-operations.js.map +1 -1
  311. package/dist/generated/global-types.d.ts +27678 -0
  312. package/dist/generated/global-types.js +1 -2
  313. package/dist/generated/global-types.js.map +1 -1
  314. package/dist/generated/wspace-operations.d.ts +5489 -0
  315. package/dist/generated/wspace-operations.js +64 -60
  316. package/dist/generated/wspace-operations.js.map +1 -1
  317. package/dist/generated/wspace-types.d.ts +152017 -0
  318. package/dist/generated/wspace-types.js +1 -2
  319. package/dist/generated/wspace-types.js.map +1 -1
  320. package/dist/index.d.ts +5 -0
  321. package/dist/shared/hooks/useTr.d.ts +16 -0
  322. package/dist/shared/hooks/useTr.js +1 -2
  323. package/dist/shared/hooks/useTr.js.map +1 -1
  324. package/dist/stories/Badge.stories.d.ts +11 -0
  325. package/dist/stories/Button.stories.d.ts +13 -0
  326. package/dist/stories/EmptyState.stories.d.ts +8 -0
  327. package/dist/stories/StatusBadge.stories.d.ts +9 -0
  328. package/dist/test/fixtures.d.ts +39 -0
  329. package/dist/test/happydom.d.ts +1 -0
  330. package/dist/test/renderPage.d.ts +18 -0
  331. package/dist/test/setup.d.ts +9 -0
  332. package/dist/utils/nativeBridge.d.ts +2 -0
  333. package/dist/utils/nativeBridge.js +1 -2
  334. package/package.json +87 -60
@@ -1 +1 @@
1
- {"version":3,"file":"MCPServerDetailPage.js","names":[],"sources":["../../../src/botlit/pages/MCPServerDetailPage.tsx"],"sourcesContent":["/**\n * MCP Server Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Server,\n Plug,\n PlugZap,\n Wrench,\n Settings,\n Save,\n RefreshCw,\n AlertTriangle,\n CheckCircle,\n XCircle,\n Clock,\n ExternalLink,\n Edit,\n Trash2,\n} from 'lucide-react';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport { StatusBadge, Badge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { toast } from 'sonner';\nimport {\n useMCPServer,\n useMCPTools,\n useMCPResources,\n useCreateMCPServer,\n useUpdateMCPServer,\n useUpdateMCPTool,\n useDeleteMCPServer,\n useTestMCPConnection,\n isMCPServerHealthy,\n mcpServerDescription,\n mcpServerEndpoint,\n type MCPToolRecord,\n} from '../hooks';\nimport type { McpToolRiskLevel } from '../../generated/wspace-types';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport type { MCPTransport, MCPAuthMethod } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate, useBotmanorCan } from '../permissions';\n\ninterface MCPServerDetailPageProps {\n isNew?: boolean;\n}\n\n/** Reads a string the UI stored on the connection's free-form config. */\nfunction configString(\n config: Record<string, unknown> | undefined,\n key: string\n): string | undefined {\n const value = config?.[key];\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nexport const MCPServerDetailPage: FC<MCPServerDetailPageProps> = ({ isNew }) => {\n const { serverId } = useParams();\n const { navigateTo } = useBotlit();\n const can = useBotmanorCan();\n const { data: server, loading, refetch } = useMCPServer(isNew ? undefined : serverId);\n const { data: tools } = useMCPTools(isNew ? undefined : serverId);\n const { data: resources } = useMCPResources(isNew ? undefined : serverId);\n const [connectServer, connectResult] = useCreateMCPServer();\n const [updateServer, updateResult] = useUpdateMCPServer();\n const [deleteServer, deleteResult] = useDeleteMCPServer();\n const [testConnection, testResult] = useTestMCPConnection();\n const [updateTool, updateToolResult] = useUpdateMCPTool();\n\n const [isEditing, setIsEditing] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n transport: 'HTTP_JSON' as MCPTransport,\n baseUrl: '',\n authMethod: 'NONE' as MCPAuthMethod,\n secretRefId: '',\n });\n\n const [selectedToolName, setSelectedToolName] = useState<string | null>(null);\n const selectedTool = useMemo(\n () => tools.find((tool) => tool.name === selectedToolName) ?? null,\n [tools, selectedToolName]\n );\n\n const handleCreate = async () => {\n if (!formData.name || !formData.baseUrl) return;\n try {\n const created = await connectServer({\n name: formData.name,\n type: formData.transport,\n config: {\n url: formData.baseUrl,\n description: formData.description,\n authMethod: formData.authMethod,\n secretRefId: formData.secretRefId || undefined,\n },\n });\n toast.success(`Connected \"${created.name}\"`);\n navigateTo(`mcp/${created.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to connect MCP server');\n }\n };\n\n const handleTestConnection = async () => {\n if (!serverId) return;\n try {\n const ok = await testConnection(serverId);\n if (ok) {\n toast.success('MCP server is reachable');\n } else {\n toast.error('MCP server did not respond');\n }\n void refetch();\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to test MCP connection');\n }\n };\n\n const handleUpdate = async () => {\n if (!serverId || !formData.name) return;\n try {\n await updateServer({\n serverId,\n input: {\n name: formData.name,\n // `config` is replaced wholesale by the service — resend every field\n // the form owns so an edit never drops the endpoint or auth settings.\n config: {\n url: formData.baseUrl,\n description: formData.description,\n authMethod: formData.authMethod,\n secretRefId: formData.secretRefId || undefined,\n },\n },\n });\n toast.success('MCP server updated');\n void refetch();\n setIsEditing(false);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update MCP server');\n }\n };\n\n const handleDelete = async () => {\n if (!serverId) return;\n try {\n await deleteServer(serverId);\n if (isNative()) void nativeNotify('success');\n toast.success('MCP server disconnected');\n navigateTo('mcp');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n toast.error(err instanceof Error ? err.message : 'Failed to disconnect MCP server');\n }\n };\n\n const startEditing = () => {\n if (!server) return;\n setFormData({\n name: server.name,\n description: mcpServerDescription(server) ?? '',\n transport: server.type as MCPTransport,\n baseUrl: mcpServerEndpoint(server) ?? '',\n authMethod: (configString(server.config, 'authMethod') ?? 'NONE') as MCPAuthMethod,\n secretRefId: configString(server.config, 'secretRefId') ?? '',\n });\n setIsEditing(true);\n };\n\n const riskBadgeVariant = (\n riskLevel: McpToolRiskLevel\n ): 'default' | 'success' | 'warning' | 'destructive' => {\n switch (riskLevel) {\n case 'HIGH':\n return 'destructive';\n case 'MEDIUM':\n return 'warning';\n case 'LOW':\n default:\n return 'success';\n }\n };\n\n const handleUpdateToolRisk = async (toolId: string, riskLevel: McpToolRiskLevel) => {\n try {\n await updateTool({ toolId, input: { riskLevel } });\n toast.success('Tool risk level updated');\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update tool risk level');\n }\n };\n\n const getHealthIcon = (status?: string) => {\n switch (status) {\n case 'CONNECTED':\n return <CheckCircle className=\"h-5 w-5 text-status-success-text\" />;\n case 'CONNECTING':\n return <AlertTriangle className=\"h-5 w-5 text-status-warning-text\" />;\n case 'ERROR':\n case 'DISCONNECTED':\n return <XCircle className=\"h-5 w-5 text-status-error-text\" />;\n default:\n return <Clock className=\"h-5 w-5 text-text-secondary\" />;\n }\n };\n\n if (isNew) {\n return (\n <PageLayout\n title=\"Add MCP Server\"\n description=\"Connect a new Model Context Protocol server\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('mcp')}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleCreate}\n isLoading={connectResult.loading}\n disabled={!formData.name || !formData.baseUrl}\n >\n Connect\n </Button>\n </div>\n }\n >\n <div className=\"max-w-2xl space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Server Configuration</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Server Name\" required>\n <Input\n placeholder=\"e.g., GitHub MCP Server\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"What capabilities does this server provide?\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n />\n </FormField>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Transport\" required>\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.transport}\n onChange={(e) =>\n setFormData({ ...formData, transport: e.target.value as MCPTransport })\n }\n >\n <option value=\"HTTP_JSON\">HTTP JSON</option>\n <option value=\"JSON_RPC\">JSON RPC</option>\n <option value=\"SSE\">Server-Sent Events</option>\n <option value=\"CUSTOM\">Custom</option>\n </select>\n </FormField>\n\n <FormField label=\"Auth Method\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.authMethod}\n onChange={(e) =>\n setFormData({ ...formData, authMethod: e.target.value as MCPAuthMethod })\n }\n >\n <option value=\"NONE\">None</option>\n <option value=\"API_KEY\">API Key</option>\n <option value=\"OAUTH\">OAuth</option>\n <option value=\"CUSTOM_HEADER\">Custom Header</option>\n </select>\n </FormField>\n </div>\n\n <FormField label=\"Base URL\" required>\n <Input\n placeholder=\"e.g., https://mcp.example.com\"\n value={formData.baseUrl}\n onChange={(e) => setFormData({ ...formData, baseUrl: e.target.value })}\n />\n </FormField>\n\n {formData.authMethod !== 'NONE' && (\n <FormField label=\"Secret Reference ID\">\n <Input\n placeholder=\"e.g., secret-mcp-github\"\n value={formData.secretRefId}\n onChange={(e) => setFormData({ ...formData, secretRefId: e.target.value })}\n />\n </FormField>\n )}\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n }\n\n if (loading) {\n return (\n <PageLayout title=\"Loading...\">\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!server) {\n return (\n <PageLayout title=\"Server Not Found\">\n <EmptyState\n illustration=\"empty-generic\"\n title=\"Server Not Found\"\n description=\"This MCP server doesn't exist.\"\n action={<Button onClick={() => navigateTo('mcp')}>Back to MCP Servers</Button>}\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('mcp')}>\n <ArrowLeft size={20} />\n </Button>\n <div className=\"p-2 rounded-lg bg-action-primary-bg/10\">\n {isMCPServerHealthy(server.status) ? (\n <PlugZap className=\"h-6 w-6 text-status-success-text\" />\n ) : (\n <Plug className=\"h-6 w-6 text-text-secondary\" />\n )}\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{server.name}</span>\n <StatusBadge status={server.status} />\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">\n {mcpServerDescription(server)}\n </p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.MCP_TEST}>\n <Button\n variant=\"outline\"\n leftIcon={<RefreshCw size={16} />}\n onClick={handleTestConnection}\n isLoading={testResult.loading}\n >\n Test\n </Button>\n </BotmanorPermissionGate>\n {isEditing ? (\n <>\n <Button variant=\"outline\" onClick={() => setIsEditing(false)}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleUpdate}\n isLoading={updateResult.loading}\n >\n Save\n </Button>\n </>\n ) : (\n <>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.MCP_UPDATE}>\n <Button variant=\"outline\" leftIcon={<Edit size={16} />} onClick={startEditing}>\n Edit\n </Button>\n </BotmanorPermissionGate>\n {showDeleteConfirm ? (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowDeleteConfirm(false)}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => {\n nativeImpact('medium');\n void handleDelete();\n }}\n isLoading={deleteResult.loading}\n >\n Confirm\n </Button>\n </div>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.MCP_DELETE}>\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n onClick={() => setShowDeleteConfirm(true)}\n >\n Delete\n </Button>\n </BotmanorPermissionGate>\n )}\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Server size={18} />}>\n This is one connected MCP server and everything it exposes to your agents — its health,\n the tools and resources it provides, and its connection settings. Check that it is healthy\n and that the right tools are available, then your agents can call them (subject to your\n tool policies) to take real actions.\n </PagePurpose>\n\n {/* Health Status */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <GlassCard treatment=\"glass\" glow className=\"p-6 text-center\">\n <div className=\"p-3 rounded-full bg-action-primary-bg/10 w-fit mx-auto mb-2\">\n {getHealthIcon(server.status)}\n </div>\n <p className=\"text-lg font-bold capitalize text-text-primary\">\n {server.status.toLowerCase()}\n </p>\n <p className=\"text-sm text-text-secondary\">Health Status</p>\n </GlassCard>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{tools.length}</p>\n <p className=\"text-sm text-text-secondary\">Tools Available</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{resources.length}</p>\n <p className=\"text-sm text-text-secondary\">Resources</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">\n {server.lastConnectedAt ? formatRelativeTime(server.lastConnectedAt) : 'Never'}\n </p>\n <p className=\"text-sm text-text-secondary\">Last Connected</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Connection Details */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Server size={18} />\n Connection Details\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary\">Transport</p>\n <Badge variant=\"outline\" className=\"capitalize mt-1\">\n {server.type.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Base URL</p>\n <p className=\"font-medium text-sm truncate\">\n {mcpServerEndpoint(server) ?? MISSING_VALUE}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Auth Method</p>\n <Badge variant=\"outline\" className=\"capitalize mt-1\">\n {(configString(server.config, 'authMethod') ?? 'NONE')\n .toLowerCase()\n .replace('_', ' ')}\n </Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Last Tested</p>\n <p className=\"font-medium\">\n {server.lastErrorAt ? formatRelativeTime(server.lastErrorAt) : 'Never'}\n </p>\n </div>\n </div>\n {server.errorMessage && (\n <div className=\"mt-4 p-3 bg-status-error-bg-subtle rounded-lg text-sm text-status-error-text\">\n <strong>Error:</strong> {server.errorMessage}\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Tools Catalog */}\n <div className=\"grid grid-cols-12 gap-6\">\n <div className=\"col-span-5\">\n <Card className=\"h-full\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench size={18} />\n Tools ({tools.length})\n </CardTitle>\n <CardDescription>Available tools from this MCP server</CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n {tools.length > 0 ? (\n <div className=\"divide-y divide-border-subtle max-h-96 overflow-auto\">\n {tools.map((tool: MCPToolRecord) => (\n <button\n key={tool.id}\n type=\"button\"\n className={`w-full text-left p-4 hover:bg-accent transition-colors ${\n selectedTool?.id === tool.id ? 'bg-accent' : ''\n }`}\n onClick={() => setSelectedToolName(tool.name)}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"font-medium truncate\">{tool.name}</p>\n <Badge variant={riskBadgeVariant(tool.riskLevel)} className=\"shrink-0\">\n {tool.riskLevel}\n </Badge>\n </div>\n <p className=\"text-sm text-text-secondary line-clamp-1\">\n {tool.description}\n </p>\n </button>\n ))}\n </div>\n ) : (\n <div className=\"p-8 text-center text-text-secondary\">\n <Wrench className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>No tools available</p>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n\n <div className=\"col-span-7\">\n {selectedTool ? (\n <Card className=\"h-full\">\n <CardHeader>\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <CardTitle>{selectedTool.name}</CardTitle>\n <CardDescription>{selectedTool.description}</CardDescription>\n </div>\n <Badge variant={riskBadgeVariant(selectedTool.riskLevel)}>\n {selectedTool.riskLevel}\n </Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {/* Risk Level */}\n <div>\n <p className=\"text-sm font-medium mb-2\">Risk Level</p>\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={selectedTool.riskLevel}\n disabled={updateToolResult.loading || !can(BOTMANOR_PERMISSIONS.MCP_UPDATE)}\n onChange={(e) =>\n void handleUpdateToolRisk(\n selectedTool.id,\n e.target.value as McpToolRiskLevel\n )\n }\n >\n <option value=\"LOW\">Low — safe read/notify actions</option>\n <option value=\"MEDIUM\">Medium — state-changing actions</option>\n <option value=\"HIGH\">High — destructive or sensitive actions</option>\n </select>\n <p className=\"text-xs text-text-secondary mt-1\">\n Agents can only invoke tools up to the maximum risk level allowed by your\n workspace tool policies.\n </p>\n </div>\n\n {/* Input Schema */}\n <div>\n <p className=\"text-sm font-medium mb-2\">Input Schema</p>\n <div className=\"p-3 bg-bg-sunken rounded-lg font-mono text-xs overflow-auto max-h-96\">\n <pre>{JSON.stringify(selectedTool.inputSchema, null, 2)}</pre>\n </div>\n </div>\n </CardContent>\n </Card>\n ) : (\n <Card className=\"h-full\">\n <CardContent className=\"h-full flex items-center justify-center\">\n <EmptyState\n illustration=\"onboarding\"\n title=\"Select a tool\"\n description=\"Choose a tool from the list to view its details\"\n />\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n\n {/* Resources */}\n {resources.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Resources</CardTitle>\n <CardDescription>Available resources exposed by this server</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {resources.map(\n (resource: {\n uri: string;\n name: string;\n description?: string | null;\n mimeType?: string | null;\n }) => (\n <div\n key={resource.uri}\n className=\"p-4 border border-border-subtle rounded-lg hover:bg-accent/50 transition-colors\"\n >\n <div className=\"flex items-start justify-between\">\n <div>\n <p className=\"font-medium\">{resource.name}</p>\n <p className=\"text-sm text-text-secondary\">{resource.description}</p>\n </div>\n <ExternalLink size={14} className=\"text-text-secondary\" />\n </div>\n <div className=\"mt-2 flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-xs font-mono\">\n {resource.mimeType || 'unknown'}\n </Badge>\n <span className=\"text-xs text-text-secondary truncate\">{resource.uri}</span>\n </div>\n </div>\n )\n )}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Metadata */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Settings size={18} />\n Metadata\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-6 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(server.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(server.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Last Connected</p>\n <p className=\"font-medium\">\n {server.lastConnectedAt ? formatRelativeTime(server.lastConnectedAt) : 'Never'}\n </p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Credentials</p>\n <Badge variant={server.credentialsHash ? 'success' : 'secondary'}>\n {server.credentialsHash ? 'Configured' : 'None'}\n </Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA2DA,SAAS,EACP,GACA,GACoB;CACpB,IAAM,IAAQ,IAAS;AACvB,QAAO,OAAO,KAAU,YAAY,MAAU,KAAK,IAAQ,KAAA;;AAG7D,IAAa,KAAqD,EAAE,eAAY;CAC9E,IAAM,EAAE,gBAAa,IAAW,EAC1B,EAAE,kBAAe,GAAW,EAC5B,KAAM,GAAgB,EACtB,EAAE,MAAM,GAAQ,aAAS,eAAY,EAAa,IAAQ,KAAA,IAAY,EAAS,EAC/E,EAAE,MAAM,MAAU,GAAY,IAAQ,KAAA,IAAY,EAAS,EAC3D,EAAE,MAAM,MAAc,GAAgB,IAAQ,KAAA,IAAY,EAAS,EACnE,CAAC,IAAe,MAAiB,IAAoB,EACrD,CAAC,IAAc,MAAgB,IAAoB,EACnD,CAAC,IAAc,MAAgB,IAAoB,EACnD,CAAC,IAAgB,MAAc,IAAsB,EACrD,CAAC,IAAY,MAAoB,IAAkB,EAEnD,CAAC,IAAW,KAAgB,EAAS,GAAM,EAC3C,CAAC,IAAmB,KAAwB,EAAS,GAAM,EAE3D,CAAC,GAAU,KAAe,EAAS;EACvC,MAAM;EACN,aAAa;EACb,WAAW;EACX,SAAS;EACT,YAAY;EACZ,aAAa;EACd,CAAC,EAEI,CAAC,GAAkB,MAAuB,EAAwB,KAAK,EACvE,IAAe,SACb,EAAM,MAAM,MAAS,EAAK,SAAS,EAAiB,IAAI,MAC9D,CAAC,GAAO,EAAiB,CAC1B,EAEK,KAAe,YAAY;AAC3B,SAAC,EAAS,QAAQ,CAAC,EAAS,SAChC,KAAI;GACF,IAAM,IAAU,MAAM,GAAc;IAClC,MAAM,EAAS;IACf,MAAM,EAAS;IACf,QAAQ;KACN,KAAK,EAAS;KACd,aAAa,EAAS;KACtB,YAAY,EAAS;KACrB,aAAa,EAAS,eAAe,KAAA;KACtC;IACF,CAAC;AAEF,GADA,EAAM,QAAQ,cAAc,EAAQ,KAAK,GAAG,EAC5C,EAAW,OAAO,EAAQ,KAAK;WACxB,GAAK;AACZ,KAAM,MAAM,aAAe,QAAQ,EAAI,UAAU,+BAA+B;;IAI9E,KAAuB,YAAY;AAClC,QACL,KAAI;AAOG,GANM,MAAM,GAAe,EAAS,GAEvC,EAAM,QAAQ,0BAA0B,GAExC,EAAM,MAAM,6BAA6B,EAEtC,GAAS;WACP,GAAK;AACZ,KAAM,MAAM,aAAe,QAAQ,EAAI,UAAU,gCAAgC;;IAI/E,KAAe,YAAY;AAC3B,SAAC,KAAY,CAAC,EAAS,MAC3B,KAAI;AAiBF,GAhBA,MAAM,GAAa;IACjB;IACA,OAAO;KACL,MAAM,EAAS;KAGf,QAAQ;MACN,KAAK,EAAS;MACd,aAAa,EAAS;MACtB,YAAY,EAAS;MACrB,aAAa,EAAS,eAAe,KAAA;MACtC;KACF;IACF,CAAC,EACF,EAAM,QAAQ,qBAAqB,EAC9B,GAAS,EACd,EAAa,GAAM;WACZ,GAAK;AACZ,KAAM,MAAM,aAAe,QAAQ,EAAI,UAAU,8BAA8B;;IAI7E,KAAe,YAAY;AAC1B,QACL,KAAI;AAIF,GAHA,MAAM,GAAa,EAAS,EACxB,GAAU,IAAO,EAAa,UAAU,EAC5C,EAAM,QAAQ,0BAA0B,EACxC,EAAW,MAAM;WACV,GAAK;AAEZ,GADI,GAAU,IAAO,EAAa,QAAQ,EAC1C,EAAM,MAAM,aAAe,QAAQ,EAAI,UAAU,kCAAkC;;IAIjF,WAAqB;AACpB,QACL,EAAY;GACV,MAAM,EAAO;GACb,aAAa,EAAqB,EAAO,IAAI;GAC7C,WAAW,EAAO;GAClB,SAAS,EAAkB,EAAO,IAAI;GACtC,YAAa,EAAa,EAAO,QAAQ,aAAa,IAAI;GAC1D,aAAa,EAAa,EAAO,QAAQ,cAAc,IAAI;GAC5D,CAAC,EACF,EAAa,GAAK;IAGd,KACJ,MACsD;AACtD,UAAQ,GAAR;GACE,KAAK,OACH,QAAO;GACT,KAAK,SACH,QAAO;GAET,QACE,QAAO;;IAIP,KAAuB,OAAO,GAAgB,MAAgC;AAClF,MAAI;AAEF,GADA,MAAM,GAAW;IAAE;IAAQ,OAAO,EAAE,cAAW;IAAE,CAAC,EAClD,EAAM,QAAQ,0BAA0B;WACjC,GAAK;AACZ,KAAM,MAAM,aAAe,QAAQ,EAAI,UAAU,mCAAmC;;;AA2IxF,QAzHI,IAEA,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD;IAAQ,SAAQ;IAAU,eAAe,EAAW,MAAM;cAAE;IAEnD,CAAA,EACT,kBAAC,GAAD;IACE,UAAU,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;IAC5B,SAAS;IACT,WAAW,GAAc;IACzB,UAAU,CAAC,EAAS,QAAQ,CAAC,EAAS;cACvC;IAEQ,CAAA,CACL;;YAGR,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,wBAAgC,CAAA,EAChC,CAAA,EACb,kBAAC,GAAD;IAAa,WAAU;cAAvB;KACE,kBAAC,GAAD;MAAW,OAAM;MAAc,UAAA;gBAC7B,kBAAC,GAAD;OACE,aAAY;OACZ,OAAO,EAAS;OAChB,WAAW,MAAM,EAAY;QAAE,GAAG;QAAU,MAAM,EAAE,OAAO;QAAO,CAAC;OACnE,CAAA;MACQ,CAAA;KAEZ,kBAAC,GAAD;MAAW,OAAM;gBACf,kBAAC,IAAD;OACE,aAAY;OACZ,OAAO,EAAS;OAChB,WAAW,MAAM,EAAY;QAAE,GAAG;QAAU,aAAa,EAAE,OAAO;QAAO,CAAC;OAC1E,MAAM;OACN,CAAA;MACQ,CAAA;KAEZ,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD;OAAW,OAAM;OAAY,UAAA;iBAC3B,kBAAC,UAAD;QACE,WAAU;QACV,OAAO,EAAS;QAChB,WAAW,MACT,EAAY;SAAE,GAAG;SAAU,WAAW,EAAE,OAAO;SAAuB,CAAC;kBAJ3E;SAOE,kBAAC,UAAD;UAAQ,OAAM;oBAAY;UAAkB,CAAA;SAC5C,kBAAC,UAAD;UAAQ,OAAM;oBAAW;UAAiB,CAAA;SAC1C,kBAAC,UAAD;UAAQ,OAAM;oBAAM;UAA2B,CAAA;SAC/C,kBAAC,UAAD;UAAQ,OAAM;oBAAS;UAAe,CAAA;SAC/B;;OACC,CAAA,EAEZ,kBAAC,GAAD;OAAW,OAAM;iBACf,kBAAC,UAAD;QACE,WAAU;QACV,OAAO,EAAS;QAChB,WAAW,MACT,EAAY;SAAE,GAAG;SAAU,YAAY,EAAE,OAAO;SAAwB,CAAC;kBAJ7E;SAOE,kBAAC,UAAD;UAAQ,OAAM;oBAAO;UAAa,CAAA;SAClC,kBAAC,UAAD;UAAQ,OAAM;oBAAU;UAAgB,CAAA;SACxC,kBAAC,UAAD;UAAQ,OAAM;oBAAQ;UAAc,CAAA;SACpC,kBAAC,UAAD;UAAQ,OAAM;oBAAgB;UAAsB,CAAA;SAC7C;;OACC,CAAA,CACR;;KAEN,kBAAC,GAAD;MAAW,OAAM;MAAW,UAAA;gBAC1B,kBAAC,GAAD;OACE,aAAY;OACZ,OAAO,EAAS;OAChB,WAAW,MAAM,EAAY;QAAE,GAAG;QAAU,SAAS,EAAE,OAAO;QAAO,CAAC;OACtE,CAAA;MACQ,CAAA;KAEX,EAAS,eAAe,UACvB,kBAAC,GAAD;MAAW,OAAM;gBACf,kBAAC,GAAD;OACE,aAAY;OACZ,OAAO,EAAS;OAChB,WAAW,MAAM,EAAY;QAAE,GAAG;QAAU,aAAa,EAAE,OAAO;QAAO,CAAC;OAC1E,CAAA;MACQ,CAAA;KAEF;MACT,EAAA,CAAA;GACH,CAAA;EACK,CAAA,GAIb,KAEA,kBAAC,GAAD;EAAY,OAAM;YAChB,kBAAC,OAAD,EAAK,WAAU,+DAAgE,CAAA;EACpE,CAAA,GAIZ,IAcH,kBAAC,GAAD;EACE,OACE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,GAAD;KAAQ,SAAQ;KAAQ,MAAK;KAAO,eAAe,EAAW,MAAM;eAClE,kBAAC,IAAD,EAAW,MAAM,IAAM,CAAA;KAChB,CAAA;IACT,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAmB,EAAO,OAAO,GAChC,kBAAC,GAAD,EAAS,WAAU,oCAAqC,CAAA,GAExD,kBAAC,GAAD,EAAM,WAAU,+BAAgC,CAAA;KAE9C,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,QAAD,EAAA,UAAO,EAAO,MAAY,CAAA,EAC1B,kBAAC,GAAD,EAAa,QAAQ,EAAO,QAAU,CAAA,CAClC;QACN,kBAAC,KAAD;KAAG,WAAU;eACV,EAAqB,EAAO;KAC3B,CAAA,CACA,EAAA,CAAA;IACF;;EAER,SACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD;IAAwB,YAAY,EAAqB;cACvD,kBAAC,GAAD;KACE,SAAQ;KACR,UAAU,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;KACjC,SAAS;KACT,WAAW,GAAW;eACvB;KAEQ,CAAA;IACc,CAAA,EACxB,KACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;IAAQ,SAAQ;IAAU,eAAe,EAAa,GAAM;cAAE;IAErD,CAAA,EACT,kBAAC,GAAD;IACE,UAAU,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;IAC5B,SAAS;IACT,WAAW,GAAa;cACzB;IAEQ,CAAA,CACR,EAAA,CAAA,GAEH,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD;IAAwB,YAAY,EAAqB;cACvD,kBAAC,GAAD;KAAQ,SAAQ;KAAU,UAAU,kBAAC,IAAD,EAAM,MAAM,IAAM,CAAA;KAAE,SAAS;eAAc;KAEtE,CAAA;IACc,CAAA,EACxB,KACC,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAQ,SAAQ;KAAU,MAAK;KAAK,eAAe,EAAqB,GAAM;eAAE;KAEvE,CAAA,EACT,kBAAC,GAAD;KACE,SAAQ;KACR,MAAK;KACL,eAAe;AAER,MADL,EAAa,SAAS,EACjB,IAAc;;KAErB,WAAW,GAAa;eACzB;KAEQ,CAAA,CACL;QAEN,kBAAC,GAAD;IAAwB,YAAY,EAAqB;cACvD,kBAAC,GAAD;KACE,SAAQ;KACR,UAAU,kBAAC,GAAD,EAAQ,MAAM,IAAM,CAAA;KAC9B,eAAe,EAAqB,GAAK;eAC1C;KAEQ,CAAA;IACc,CAAA,CAE1B,EAAA,CAAA,CAED;;YAGR,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,IAAD;KAAa,MAAM,kBAAC,GAAD,EAAQ,MAAM,IAAM,CAAA;eAAE;KAK3B,CAAA;IAGd,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,IAAD;OAAW,WAAU;OAAQ,MAAA;OAAK,WAAU;iBAA5C;QACE,kBAAC,OAAD;SAAK,WAAU;qBA5OF,MAAoB;AACzC,kBAAQ,GAAR;WACE,KAAK,YACH,QAAO,kBAAC,IAAD,EAAa,WAAU,oCAAqC,CAAA;WACrE,KAAK,aACH,QAAO,kBAAC,IAAD,EAAe,WAAU,oCAAqC,CAAA;WACvE,KAAK;WACL,KAAK,eACH,QAAO,kBAAC,GAAD,EAAS,WAAU,kCAAmC,CAAA;WAC/D,QACE,QAAO,kBAAC,IAAD,EAAO,WAAU,+BAAgC,CAAA;;YAmOnC,EAAO,OAAO;SACzB,CAAA;QACN,kBAAC,KAAD;SAAG,WAAU;mBACV,EAAO,OAAO,aAAa;SAC1B,CAAA;QACJ,kBAAC,KAAD;SAAG,WAAU;mBAA8B;SAAiB,CAAA;QAClD;;MACZ,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;OAAa,WAAU;iBAAvB,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAwC,EAAM;QAAW,CAAA,EACtE,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAmB,CAAA,CAClD;UACT,CAAA;MACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;OAAa,WAAU;iBAAvB,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAwC,EAAU;QAAW,CAAA,EAC1E,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAa,CAAA,CAC5C;UACT,CAAA;MACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;OAAa,WAAU;iBAAvB,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAO,kBAAkB,EAAmB,EAAO,gBAAgB,GAAG;QACrE,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAkB,CAAA,CACjD;UACT,CAAA;MACH;;IAGN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KAAW,WAAU;eAArB,CACE,kBAAC,GAAD,EAAQ,MAAM,IAAM,CAAA,EAAA,qBAEV;QACD,CAAA,EACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAa,CAAA,EACxD,kBAAC,GAAD;OAAO,SAAQ;OAAU,WAAU;iBAChC,EAAO,KAAK,aAAa,CAAC,QAAQ,KAAK,IAAI;OACtC,CAAA,CACJ,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAY,CAAA,EACvD,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAkB,EAAO,IAAA;OACxB,CAAA,CACA,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAe,CAAA,EAC1D,kBAAC,GAAD;OAAO,SAAQ;OAAU,WAAU;kBAC/B,EAAa,EAAO,QAAQ,aAAa,IAAI,QAC5C,aAAa,CACb,QAAQ,KAAK,IAAI;OACd,CAAA,CACJ,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAe,CAAA,EAC1D,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAO,cAAc,EAAmB,EAAO,YAAY,GAAG;OAC7D,CAAA,CACA,EAAA,CAAA;MACF;QACL,EAAO,gBACN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,UAAD,EAAA,UAAQ,UAAe,CAAA;;MAAE,EAAO;MAC5B;OAEI,EAAA,CAAA,CACT,EAAA,CAAA;IAGP,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD;OAAM,WAAU;iBAAhB,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;QAAW,WAAU;kBAArB;SACE,kBAAC,GAAD,EAAQ,MAAM,IAAM,CAAA;;SACZ,EAAM;SAAO;SACX;WACZ,kBAAC,GAAD,EAAA,UAAiB,wCAAsD,CAAA,CAC5D,EAAA,CAAA,EACb,kBAAC,GAAD;QAAa,WAAU;kBACpB,EAAM,SAAS,IACd,kBAAC,OAAD;SAAK,WAAU;mBACZ,EAAM,KAAK,MACV,kBAAC,UAAD;UAEE,MAAK;UACL,WAAW,0DACT,GAAc,OAAO,EAAK,KAAK,cAAc;UAE/C,eAAe,GAAoB,EAAK,KAAK;oBAN/C,CAQE,kBAAC,OAAD;WAAK,WAAU;qBAAf,CACE,kBAAC,KAAD;YAAG,WAAU;sBAAwB,EAAK;YAAS,CAAA,EACnD,kBAAC,GAAD;YAAO,SAAS,EAAiB,EAAK,UAAU;YAAE,WAAU;sBACzD,EAAK;YACA,CAAA,CACJ;cACN,kBAAC,KAAD;WAAG,WAAU;qBACV,EAAK;WACJ,CAAA,CACG;YAhBF,EAAK,GAgBH,CACT;SACE,CAAA,GAEN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,mCAAoC,CAAA,EACtD,kBAAC,KAAD,EAAA,UAAG,sBAAsB,CAAA,CACrB;;QAEI,CAAA,CACT;;MACH,CAAA,EAEN,kBAAC,OAAD;MAAK,WAAU;gBACZ,IACC,kBAAC,GAAD;OAAM,WAAU;iBAAhB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAY,EAAa,MAAiB,CAAA,EAC1C,kBAAC,GAAD,EAAA,UAAkB,EAAa,aAA8B,CAAA,CACzD,EAAA,CAAA,EACN,kBAAC,GAAD;SAAO,SAAS,EAAiB,EAAa,UAAU;mBACrD,EAAa;SACR,CAAA,CACJ;WACK,CAAA,EACb,kBAAC,GAAD;QAAa,WAAU;kBAAvB,CAEE,kBAAC,OAAD,EAAA,UAAA;SACE,kBAAC,KAAD;UAAG,WAAU;oBAA2B;UAAc,CAAA;SACtD,kBAAC,UAAD;UACE,WAAU;UACV,OAAO,EAAa;UACpB,UAAU,GAAiB,WAAW,CAAC,GAAI,EAAqB,WAAW;UAC3E,WAAW,MACT,KAAK,GACH,EAAa,IACb,EAAE,OAAO,MACV;oBARL;WAWE,kBAAC,UAAD;YAAQ,OAAM;sBAAM;YAAuC,CAAA;WAC3D,kBAAC,UAAD;YAAQ,OAAM;sBAAS;YAAwC,CAAA;WAC/D,kBAAC,UAAD;YAAQ,OAAM;sBAAO;YAAgD,CAAA;WAC9D;;SACT,kBAAC,KAAD;UAAG,WAAU;oBAAmC;UAG5C,CAAA;SACA,EAAA,CAAA,EAGN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;mBAA2B;SAAgB,CAAA,EACxD,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,OAAD,EAAA,UAAM,KAAK,UAAU,EAAa,aAAa,MAAM,EAAE,EAAO,CAAA;SAC1D,CAAA,CACF,EAAA,CAAA,CACM;UACT;WAEP,kBAAC,GAAD;OAAM,WAAU;iBACd,kBAAC,GAAD;QAAa,WAAU;kBACrB,kBAAC,GAAD;SACE,cAAa;SACb,OAAM;SACN,aAAY;SACZ,CAAA;QACU,CAAA;OACT,CAAA;MAEL,CAAA,CACF;;IAGL,EAAU,SAAS,KAClB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAW,aAAqB,CAAA,EAChC,kBAAC,GAAD,EAAA,UAAiB,8CAA4D,CAAA,CAClE,EAAA,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAU,KACR,MAMC,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAe,EAAS;QAAS,CAAA,EAC9C,kBAAC,KAAD;QAAG,WAAU;kBAA+B,EAAS;QAAgB,CAAA,CACjE,EAAA,CAAA,EACN,kBAAC,GAAD;QAAc,MAAM;QAAI,WAAU;QAAwB,CAAA,CACtD;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QAAO,SAAQ;QAAU,WAAU;kBAChC,EAAS,YAAY;QAChB,CAAA,EACR,kBAAC,QAAD;QAAM,WAAU;kBAAwC,EAAS;QAAW,CAAA,CACxE;SACF;QAhBC,EAAS,IAgBV,CAET;KACG,CAAA,EACM,CAAA,CACT,EAAA,CAAA;IAIT,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KAAW,WAAU;eAArB,CACE,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA,EAAA,WAEZ;QACD,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsB;OAAW,CAAA,EAC9C,kBAAC,KAAD;OAAG,WAAU;iBAAe,EAAmB,EAAO,UAAU;OAAK,CAAA,CACjE,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsB;OAAW,CAAA,EAC9C,kBAAC,KAAD;OAAG,WAAU;iBAAe,EAAmB,EAAO,UAAU;OAAK,CAAA,CACjE,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsB;OAAkB,CAAA,EACrD,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAO,kBAAkB,EAAmB,EAAO,gBAAgB,GAAG;OACrE,CAAA,CACA,EAAA,CAAA;MACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAsB;OAAe,CAAA,EAClD,kBAAC,GAAD;OAAO,SAAS,EAAO,kBAAkB,YAAY;iBAClD,EAAO,kBAAkB,eAAe;OACnC,CAAA,CACJ,EAAA,CAAA;MACF;QACM,CAAA,CACT,EAAA,CAAA;IACH;;EACK,CAAA,GAjXX,kBAAC,GAAD;EAAY,OAAM;YAChB,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,QAAQ,kBAAC,GAAD;IAAQ,eAAe,EAAW,MAAM;cAAE;IAA4B,CAAA;GAC9E,CAAA;EACS,CAAA"}
1
+ {"version":3,"file":"MCPServerDetailPage.js","names":["Textarea","_Fragment","Textarea$1","configString","value","config","key","MCPServerDetailPage","useParams","useBotlit","can","useBotmanorCan","server","useMCPServer","isNew","serverId","tools","useMCPTools","resources","useMCPResources","connectServer","connectResult","useCreateMCPServer","updateServer","updateResult","useUpdateMCPServer","deleteServer","deleteResult","useDeleteMCPServer","testConnection","testResult","useTestMCPConnection","updateTool","updateToolResult","useUpdateMCPTool","isEditing","setIsEditing","useState","showDeleteConfirm","setShowDeleteConfirm","formData","setFormData","selectedToolName","setSelectedToolName","selectedTool","useMemo","tool","handleCreate","created","toast","navigateTo","err","handleTestConnection","refetch","handleUpdate","handleDelete","isNative","nativeNotify","startEditing","mcpServerDescription","mcpServerEndpoint","riskBadgeVariant","riskLevel","handleUpdateToolRisk","PageLayout","Button","Save","Card","CardHeader","CardTitle","CardContent","FormField","Input","loading","ArrowLeft","isMCPServerHealthy","PlugZap","Plug","StatusBadge","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","RefreshCw","Fragment","Edit","nativeImpact","Trash2","PagePurpose","Server","GlassCard","status","CheckCircle","AlertTriangle","XCircle","Clock","formatRelativeTime","Badge","Wrench","CardDescription","EmptyState","resource","ExternalLink","Settings"],"sources":["../../../src/botlit/pages/MCPServerDetailPage.tsx"],"sourcesContent":["/**\n * MCP Server Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Server,\n Plug,\n PlugZap,\n Wrench,\n Settings,\n Save,\n RefreshCw,\n AlertTriangle,\n CheckCircle,\n XCircle,\n Clock,\n ExternalLink,\n Edit,\n Trash2,\n} from 'lucide-react';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport { StatusBadge, Badge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { toast } from 'sonner';\nimport {\n useMCPServer,\n useMCPTools,\n useMCPResources,\n useCreateMCPServer,\n useUpdateMCPServer,\n useUpdateMCPTool,\n useDeleteMCPServer,\n useTestMCPConnection,\n isMCPServerHealthy,\n mcpServerDescription,\n mcpServerEndpoint,\n type MCPToolRecord,\n} from '../hooks';\nimport type { McpToolRiskLevel } from '../../generated/wspace-types';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport type { MCPTransport, MCPAuthMethod } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate, useBotmanorCan } from '../permissions';\n\ninterface MCPServerDetailPageProps {\n isNew?: boolean;\n}\n\n/** Reads a string the UI stored on the connection's free-form config. */\nfunction configString(\n config: Record<string, unknown> | undefined,\n key: string\n): string | undefined {\n const value = config?.[key];\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nexport const MCPServerDetailPage: FC<MCPServerDetailPageProps> = ({ isNew }) => {\n const { serverId } = useParams();\n const { navigateTo } = useBotlit();\n const can = useBotmanorCan();\n const { data: server, loading, refetch } = useMCPServer(isNew ? undefined : serverId);\n const { data: tools } = useMCPTools(isNew ? undefined : serverId);\n const { data: resources } = useMCPResources(isNew ? undefined : serverId);\n const [connectServer, connectResult] = useCreateMCPServer();\n const [updateServer, updateResult] = useUpdateMCPServer();\n const [deleteServer, deleteResult] = useDeleteMCPServer();\n const [testConnection, testResult] = useTestMCPConnection();\n const [updateTool, updateToolResult] = useUpdateMCPTool();\n\n const [isEditing, setIsEditing] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n transport: 'HTTP_JSON' as MCPTransport,\n baseUrl: '',\n authMethod: 'NONE' as MCPAuthMethod,\n secretRefId: '',\n });\n\n const [selectedToolName, setSelectedToolName] = useState<string | null>(null);\n const selectedTool = useMemo(\n () => tools.find((tool) => tool.name === selectedToolName) ?? null,\n [tools, selectedToolName]\n );\n\n const handleCreate = async () => {\n if (!formData.name || !formData.baseUrl) return;\n try {\n const created = await connectServer({\n name: formData.name,\n type: formData.transport,\n config: {\n url: formData.baseUrl,\n description: formData.description,\n authMethod: formData.authMethod,\n secretRefId: formData.secretRefId || undefined,\n },\n });\n toast.success(`Connected \"${created.name}\"`);\n navigateTo(`mcp/${created.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to connect MCP server');\n }\n };\n\n const handleTestConnection = async () => {\n if (!serverId) return;\n try {\n const ok = await testConnection(serverId);\n if (ok) {\n toast.success('MCP server is reachable');\n } else {\n toast.error('MCP server did not respond');\n }\n void refetch();\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to test MCP connection');\n }\n };\n\n const handleUpdate = async () => {\n if (!serverId || !formData.name) return;\n try {\n await updateServer({\n serverId,\n input: {\n name: formData.name,\n // `config` is replaced wholesale by the service — resend every field\n // the form owns so an edit never drops the endpoint or auth settings.\n config: {\n url: formData.baseUrl,\n description: formData.description,\n authMethod: formData.authMethod,\n secretRefId: formData.secretRefId || undefined,\n },\n },\n });\n toast.success('MCP server updated');\n void refetch();\n setIsEditing(false);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update MCP server');\n }\n };\n\n const handleDelete = async () => {\n if (!serverId) return;\n try {\n await deleteServer(serverId);\n if (isNative()) void nativeNotify('success');\n toast.success('MCP server disconnected');\n navigateTo('mcp');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n toast.error(err instanceof Error ? err.message : 'Failed to disconnect MCP server');\n }\n };\n\n const startEditing = () => {\n if (!server) return;\n setFormData({\n name: server.name,\n description: mcpServerDescription(server) ?? '',\n transport: server.type as MCPTransport,\n baseUrl: mcpServerEndpoint(server) ?? '',\n authMethod: (configString(server.config, 'authMethod') ?? 'NONE') as MCPAuthMethod,\n secretRefId: configString(server.config, 'secretRefId') ?? '',\n });\n setIsEditing(true);\n };\n\n const riskBadgeVariant = (\n riskLevel: McpToolRiskLevel\n ): 'default' | 'success' | 'warning' | 'destructive' => {\n switch (riskLevel) {\n case 'HIGH':\n return 'destructive';\n case 'MEDIUM':\n return 'warning';\n case 'LOW':\n default:\n return 'success';\n }\n };\n\n const handleUpdateToolRisk = async (toolId: string, riskLevel: McpToolRiskLevel) => {\n try {\n await updateTool({ toolId, input: { riskLevel } });\n toast.success('Tool risk level updated');\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update tool risk level');\n }\n };\n\n const getHealthIcon = (status?: string) => {\n switch (status) {\n case 'CONNECTED':\n return <CheckCircle className=\"h-5 w-5 text-status-success-text\" />;\n case 'CONNECTING':\n return <AlertTriangle className=\"h-5 w-5 text-status-warning-text\" />;\n case 'ERROR':\n case 'DISCONNECTED':\n return <XCircle className=\"h-5 w-5 text-status-error-text\" />;\n default:\n return <Clock className=\"h-5 w-5 text-text-secondary\" />;\n }\n };\n\n if (isNew) {\n return (\n <PageLayout\n title=\"Add MCP Server\"\n description=\"Connect a new Model Context Protocol server\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('mcp')}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleCreate}\n isLoading={connectResult.loading}\n disabled={!formData.name || !formData.baseUrl}\n >\n Connect\n </Button>\n </div>\n }\n >\n <div className=\"max-w-2xl space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Server Configuration</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Server Name\" required>\n <Input\n placeholder=\"e.g., GitHub MCP Server\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"What capabilities does this server provide?\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n />\n </FormField>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Transport\" required>\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.transport}\n onChange={(e) =>\n setFormData({ ...formData, transport: e.target.value as MCPTransport })\n }\n >\n <option value=\"HTTP_JSON\">HTTP JSON</option>\n <option value=\"JSON_RPC\">JSON RPC</option>\n <option value=\"SSE\">Server-Sent Events</option>\n <option value=\"CUSTOM\">Custom</option>\n </select>\n </FormField>\n\n <FormField label=\"Auth Method\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.authMethod}\n onChange={(e) =>\n setFormData({ ...formData, authMethod: e.target.value as MCPAuthMethod })\n }\n >\n <option value=\"NONE\">None</option>\n <option value=\"API_KEY\">API Key</option>\n <option value=\"OAUTH\">OAuth</option>\n <option value=\"CUSTOM_HEADER\">Custom Header</option>\n </select>\n </FormField>\n </div>\n\n <FormField label=\"Base URL\" required>\n <Input\n placeholder=\"e.g., https://mcp.example.com\"\n value={formData.baseUrl}\n onChange={(e) => setFormData({ ...formData, baseUrl: e.target.value })}\n />\n </FormField>\n\n {formData.authMethod !== 'NONE' && (\n <FormField label=\"Secret Reference ID\">\n <Input\n placeholder=\"e.g., secret-mcp-github\"\n value={formData.secretRefId}\n onChange={(e) => setFormData({ ...formData, secretRefId: e.target.value })}\n />\n </FormField>\n )}\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n }\n\n if (loading) {\n return (\n <PageLayout title=\"Loading...\">\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!server) {\n return (\n <PageLayout title=\"Server Not Found\">\n <EmptyState\n illustration=\"empty-generic\"\n title=\"Server Not Found\"\n description=\"This MCP server doesn't exist.\"\n action={<Button onClick={() => navigateTo('mcp')}>Back to MCP Servers</Button>}\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('mcp')}>\n <ArrowLeft size={20} />\n </Button>\n <div className=\"p-2 rounded-lg bg-action-primary-bg/10\">\n {isMCPServerHealthy(server.status) ? (\n <PlugZap className=\"h-6 w-6 text-status-success-text\" />\n ) : (\n <Plug className=\"h-6 w-6 text-text-secondary\" />\n )}\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{server.name}</span>\n <StatusBadge status={server.status} />\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">\n {mcpServerDescription(server)}\n </p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.MCP_TEST}>\n <Button\n variant=\"outline\"\n leftIcon={<RefreshCw size={16} />}\n onClick={handleTestConnection}\n isLoading={testResult.loading}\n >\n Test\n </Button>\n </BotmanorPermissionGate>\n {isEditing ? (\n <>\n <Button variant=\"outline\" onClick={() => setIsEditing(false)}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleUpdate}\n isLoading={updateResult.loading}\n >\n Save\n </Button>\n </>\n ) : (\n <>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.MCP_UPDATE}>\n <Button variant=\"outline\" leftIcon={<Edit size={16} />} onClick={startEditing}>\n Edit\n </Button>\n </BotmanorPermissionGate>\n {showDeleteConfirm ? (\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowDeleteConfirm(false)}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n onClick={() => {\n nativeImpact('medium');\n void handleDelete();\n }}\n isLoading={deleteResult.loading}\n >\n Confirm\n </Button>\n </div>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.MCP_DELETE}>\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n onClick={() => setShowDeleteConfirm(true)}\n >\n Delete\n </Button>\n </BotmanorPermissionGate>\n )}\n </>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Server size={18} />}>\n This is one connected MCP server and everything it exposes to your agents — its health,\n the tools and resources it provides, and its connection settings. Check that it is healthy\n and that the right tools are available, then your agents can call them (subject to your\n tool policies) to take real actions.\n </PagePurpose>\n\n {/* Health Status */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <GlassCard treatment=\"glass\" glow className=\"p-6 text-center\">\n <div className=\"p-3 rounded-full bg-action-primary-bg/10 w-fit mx-auto mb-2\">\n {getHealthIcon(server.status)}\n </div>\n <p className=\"text-lg font-bold capitalize text-text-primary\">\n {server.status.toLowerCase()}\n </p>\n <p className=\"text-sm text-text-secondary\">Health Status</p>\n </GlassCard>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{tools.length}</p>\n <p className=\"text-sm text-text-secondary\">Tools Available</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{resources.length}</p>\n <p className=\"text-sm text-text-secondary\">Resources</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">\n {server.lastConnectedAt ? formatRelativeTime(server.lastConnectedAt) : 'Never'}\n </p>\n <p className=\"text-sm text-text-secondary\">Last Connected</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Connection Details */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Server size={18} />\n Connection Details\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary\">Transport</p>\n <Badge variant=\"outline\" className=\"capitalize mt-1\">\n {server.type.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Base URL</p>\n <p className=\"font-medium text-sm truncate\">\n {mcpServerEndpoint(server) ?? MISSING_VALUE}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Auth Method</p>\n <Badge variant=\"outline\" className=\"capitalize mt-1\">\n {(configString(server.config, 'authMethod') ?? 'NONE')\n .toLowerCase()\n .replace('_', ' ')}\n </Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Last Tested</p>\n <p className=\"font-medium\">\n {server.lastErrorAt ? formatRelativeTime(server.lastErrorAt) : 'Never'}\n </p>\n </div>\n </div>\n {server.errorMessage && (\n <div className=\"mt-4 p-3 bg-status-error-bg-subtle rounded-lg text-sm text-status-error-text\">\n <strong>Error:</strong> {server.errorMessage}\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Tools Catalog */}\n <div className=\"grid grid-cols-12 gap-6\">\n <div className=\"col-span-5\">\n <Card className=\"h-full\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench size={18} />\n Tools ({tools.length})\n </CardTitle>\n <CardDescription>Available tools from this MCP server</CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n {tools.length > 0 ? (\n <div className=\"divide-y divide-border-subtle max-h-96 overflow-auto\">\n {tools.map((tool: MCPToolRecord) => (\n <button\n key={tool.id}\n type=\"button\"\n className={`w-full text-left p-4 hover:bg-accent transition-colors ${\n selectedTool?.id === tool.id ? 'bg-accent' : ''\n }`}\n onClick={() => setSelectedToolName(tool.name)}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"font-medium truncate\">{tool.name}</p>\n <Badge variant={riskBadgeVariant(tool.riskLevel)} className=\"shrink-0\">\n {tool.riskLevel}\n </Badge>\n </div>\n <p className=\"text-sm text-text-secondary line-clamp-1\">\n {tool.description}\n </p>\n </button>\n ))}\n </div>\n ) : (\n <div className=\"p-8 text-center text-text-secondary\">\n <Wrench className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>No tools available</p>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n\n <div className=\"col-span-7\">\n {selectedTool ? (\n <Card className=\"h-full\">\n <CardHeader>\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <CardTitle>{selectedTool.name}</CardTitle>\n <CardDescription>{selectedTool.description}</CardDescription>\n </div>\n <Badge variant={riskBadgeVariant(selectedTool.riskLevel)}>\n {selectedTool.riskLevel}\n </Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {/* Risk Level */}\n <div>\n <p className=\"text-sm font-medium mb-2\">Risk Level</p>\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={selectedTool.riskLevel}\n disabled={updateToolResult.loading || !can(BOTMANOR_PERMISSIONS.MCP_UPDATE)}\n onChange={(e) =>\n void handleUpdateToolRisk(\n selectedTool.id,\n e.target.value as McpToolRiskLevel\n )\n }\n >\n <option value=\"LOW\">Low — safe read/notify actions</option>\n <option value=\"MEDIUM\">Medium — state-changing actions</option>\n <option value=\"HIGH\">High — destructive or sensitive actions</option>\n </select>\n <p className=\"text-xs text-text-secondary mt-1\">\n Agents can only invoke tools up to the maximum risk level allowed by your\n workspace tool policies.\n </p>\n </div>\n\n {/* Input Schema */}\n <div>\n <p className=\"text-sm font-medium mb-2\">Input Schema</p>\n <div className=\"p-3 bg-bg-sunken rounded-lg font-mono text-xs overflow-auto max-h-96\">\n <pre>{JSON.stringify(selectedTool.inputSchema, null, 2)}</pre>\n </div>\n </div>\n </CardContent>\n </Card>\n ) : (\n <Card className=\"h-full\">\n <CardContent className=\"h-full flex items-center justify-center\">\n <EmptyState\n illustration=\"onboarding\"\n title=\"Select a tool\"\n description=\"Choose a tool from the list to view its details\"\n />\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n\n {/* Resources */}\n {resources.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Resources</CardTitle>\n <CardDescription>Available resources exposed by this server</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {resources.map(\n (resource: {\n uri: string;\n name: string;\n description?: string | null;\n mimeType?: string | null;\n }) => (\n <div\n key={resource.uri}\n className=\"p-4 border border-border-subtle rounded-lg hover:bg-accent/50 transition-colors\"\n >\n <div className=\"flex items-start justify-between\">\n <div>\n <p className=\"font-medium\">{resource.name}</p>\n <p className=\"text-sm text-text-secondary\">{resource.description}</p>\n </div>\n <ExternalLink size={14} className=\"text-text-secondary\" />\n </div>\n <div className=\"mt-2 flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-xs font-mono\">\n {resource.mimeType || 'unknown'}\n </Badge>\n <span className=\"text-xs text-text-secondary truncate\">{resource.uri}</span>\n </div>\n </div>\n )\n )}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Metadata */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Settings size={18} />\n Metadata\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-6 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(server.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(server.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Last Connected</p>\n <p className=\"font-medium\">\n {server.lastConnectedAt ? formatRelativeTime(server.lastConnectedAt) : 'Never'}\n </p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Credentials</p>\n <Badge variant={server.credentialsHash ? 'success' : 'secondary'}>\n {server.credentialsHash ? 'Configured' : 'None'}\n </Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { FC } from 'react';
2
+ export declare const MCPServersPage: FC;
@@ -1,31 +1,31 @@
1
- import { useTr as e } from "../../shared/hooks/useTr.js";
2
- import { useBotlit as t } from "../providers/BotlitProvider.js";
3
- import { isMCPServerHealthy as n, mcpServerDescription as r, mcpServerEndpoint as i, useCreateMCPServer as a, useDeleteMCPServer as o, useMCPServers as s, useTestMCPConnection as c } from "../hooks/useMCPServers.js";
4
- import { formatRelativeTime as l } from "../utils/formatters.js";
5
- import { BOTMANOR_PERMISSIONS as u } from "../permissions/botmanorPermissions.js";
6
- import { BotmanorPermissionGate as d } from "../permissions/useBotmanorPermissions.js";
7
- import { PageLayout as f } from "../components/PageLayout.js";
8
- import { Button as p } from "../components/Button.js";
1
+ import { useBotlit as e } from "../providers/BotlitProvider.js";
2
+ import { useTr as t } from "../../shared/hooks/useTr.js";
3
+ import { PageLayout as n } from "../components/PageLayout.js";
4
+ import { Card as r, CardContent as i, CardDescription as a, CardHeader as o, CardTitle as s } from "../components/Card.js";
5
+ import { BOTMANOR_PERMISSIONS as c } from "../permissions/botmanorPermissions.js";
6
+ import { BotmanorPermissionGate as l } from "../permissions/useBotmanorPermissions.js";
7
+ import { Button as u } from "../components/Button.js";
8
+ import { FormField as d, Input as f } from "../components/Input.js";
9
+ import { Badge as p, StatusBadge as m } from "../components/Badge.js";
10
+ import { EmptyState as h } from "../components/EmptyState.js";
11
+ import { ErrorState as g } from "../components/ErrorState.js";
12
+ import { isMCPServerHealthy as _, mcpServerDescription as v, mcpServerEndpoint as y, useCreateMCPServer as b, useDeleteMCPServer as x, useMCPServers as S, useTestMCPConnection as C } from "../hooks/useMCPServers.js";
13
+ import { formatRelativeTime as w } from "../utils/formatters.js";
9
14
  import "../permissions/index.js";
10
- import { Card as m, CardContent as h, CardDescription as g, CardHeader as _, CardTitle as v } from "../components/Card.js";
11
- import { Badge as y, StatusBadge as b } from "../components/Badge.js";
12
- import { EmptyState as x } from "../components/EmptyState.js";
13
- import { FormField as S, Input as C } from "../components/Input.js";
14
- import { ErrorState as w } from "../components/ErrorState.js";
15
15
  import { useState as T } from "react";
16
16
  import { GlassCard as E, PagePurpose as D } from "@burdenoff/fe-libs/ui";
17
17
  import { jsx as O, jsxs as k } from "react/jsx-runtime";
18
18
  import { Plug as A, PlugZap as j, Plus as M, Settings as N, Trash2 as P } from "lucide-react";
19
19
  import { toast as F } from "sonner";
20
- //#region src/botlit/pages/MCPServersPage.tsx
20
+ // src/botlit/pages/MCPServersPage.tsx
21
21
  var I = () => {
22
- let I = e(), { navigateTo: L } = t(), { data: R, loading: z, error: B, refetch: V } = s(), [H, U] = a(), [W, G] = o(), [K, q] = c(), [J, Y] = T(!1), [X, Z] = T({
22
+ let I = t(), { navigateTo: L } = e(), { data: R, loading: z, error: B, refetch: V } = S(), [H, U] = b(), [W, G] = x(), [K, q] = C(), [J, Y] = T(!1), [X, Z] = T({
23
23
  name: "",
24
24
  description: "",
25
25
  transport: "HTTP_JSON",
26
26
  baseUrl: ""
27
27
  }), Q = async () => {
28
- if (!(!X.name || !X.baseUrl)) {
28
+ if (X.name && X.baseUrl) {
29
29
  try {
30
30
  await H({
31
31
  name: X.name,
@@ -59,12 +59,12 @@ var I = () => {
59
59
  F.error(e instanceof Error ? e.message : I("botlit.mcpServers.toast.testError", "Failed to test MCP connection"));
60
60
  }
61
61
  };
62
- return /* @__PURE__ */ O(f, {
62
+ return /* @__PURE__ */ O(n, {
63
63
  title: I("botlit.mcpServers.title", "MCP Servers"),
64
64
  description: I("botlit.mcpServers.description", "Connect Model Context Protocol servers to extend agent capabilities"),
65
- actions: /* @__PURE__ */ O(d, {
66
- permission: u.MCP_CREATE,
67
- children: /* @__PURE__ */ O(p, {
65
+ actions: /* @__PURE__ */ O(l, {
66
+ permission: c.MCP_CREATE,
67
+ children: /* @__PURE__ */ O(u, {
68
68
  leftIcon: /* @__PURE__ */ O(M, { size: 16 }),
69
69
  onClick: () => Y(!0),
70
70
  children: I("botlit.mcpServers.actions.add", "Add MCP Server")
@@ -84,30 +84,30 @@ var I = () => {
84
84
  2,
85
85
  3
86
86
  ].map((e) => /* @__PURE__ */ O("div", { className: "h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
87
- }) : B ? /* @__PURE__ */ O(w, {
87
+ }) : B ? /* @__PURE__ */ O(g, {
88
88
  resource: "MCP servers",
89
89
  error: B,
90
90
  onRetry: () => void V()
91
91
  }) : R.length > 0 ? /* @__PURE__ */ O("div", {
92
92
  className: "grid grid-cols-1 md:grid-cols-2 gap-4",
93
- children: R.map((e) => /* @__PURE__ */ k(m, { children: [/* @__PURE__ */ k(_, {
93
+ children: R.map((e) => /* @__PURE__ */ k(r, { children: [/* @__PURE__ */ k(o, {
94
94
  className: "flex flex-row items-start justify-between",
95
95
  children: [/* @__PURE__ */ k("div", {
96
96
  className: "flex items-start gap-3",
97
97
  children: [/* @__PURE__ */ O("div", {
98
- className: `p-2 rounded-lg ${n(e.status) ? "bg-status-success-bg-subtle" : "bg-bg-sunken"}`,
99
- children: n(e.status) ? /* @__PURE__ */ O(j, { className: "h-5 w-5 text-status-success-text" }) : /* @__PURE__ */ O(A, { className: "h-5 w-5 text-text-secondary" })
100
- }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O(v, {
98
+ className: `p-2 rounded-lg ${_(e.status) ? "bg-status-success-bg-subtle" : "bg-bg-sunken"}`,
99
+ children: _(e.status) ? /* @__PURE__ */ O(j, { className: "h-5 w-5 text-status-success-text" }) : /* @__PURE__ */ O(A, { className: "h-5 w-5 text-text-secondary" })
100
+ }), /* @__PURE__ */ k("div", { children: [/* @__PURE__ */ O(s, {
101
101
  className: "text-base",
102
102
  children: e.name
103
- }), /* @__PURE__ */ O(g, { children: r(e) })] })]
104
- }), /* @__PURE__ */ O(b, { status: e.status })]
105
- }), /* @__PURE__ */ O(h, { children: /* @__PURE__ */ k("div", {
103
+ }), /* @__PURE__ */ O(a, { children: v(e) })] })]
104
+ }), /* @__PURE__ */ O(m, { status: e.status })]
105
+ }), /* @__PURE__ */ O(i, { children: /* @__PURE__ */ k("div", {
106
106
  className: "space-y-4",
107
107
  children: [
108
108
  /* @__PURE__ */ k("div", {
109
109
  className: "flex flex-wrap items-center gap-4 text-sm",
110
- children: [/* @__PURE__ */ O(y, {
110
+ children: [/* @__PURE__ */ O(p, {
111
111
  variant: "outline",
112
112
  className: "capitalize",
113
113
  children: e.type.toLowerCase().replace("_", " ")
@@ -116,13 +116,13 @@ var I = () => {
116
116
  children: [
117
117
  I("botlit.botsList.createdLabel", "Created"),
118
118
  " ",
119
- l(e.lastConnectedAt)
119
+ w(e.lastConnectedAt)
120
120
  ]
121
121
  })]
122
122
  }),
123
- i(e) && /* @__PURE__ */ O("p", {
123
+ y(e) && /* @__PURE__ */ O("p", {
124
124
  className: "truncate text-sm text-text-secondary",
125
- children: i(e)
125
+ children: y(e)
126
126
  }),
127
127
  e.errorMessage && /* @__PURE__ */ O("p", {
128
128
  className: "text-sm text-status-error-text",
@@ -131,9 +131,9 @@ var I = () => {
131
131
  /* @__PURE__ */ k("div", {
132
132
  className: "flex items-center gap-2 pt-2 border-t border-border-subtle",
133
133
  children: [
134
- /* @__PURE__ */ O(d, {
135
- permission: u.MCP_TEST,
136
- children: /* @__PURE__ */ O(p, {
134
+ /* @__PURE__ */ O(l, {
135
+ permission: c.MCP_TEST,
136
+ children: /* @__PURE__ */ O(u, {
137
137
  variant: "outline",
138
138
  size: "sm",
139
139
  onClick: () => void ee(e),
@@ -141,16 +141,16 @@ var I = () => {
141
141
  children: I("botlit.mcpServers.actions.testConnection", "Test connection")
142
142
  })
143
143
  }),
144
- /* @__PURE__ */ O(p, {
144
+ /* @__PURE__ */ O(u, {
145
145
  variant: "ghost",
146
146
  size: "sm",
147
147
  leftIcon: /* @__PURE__ */ O(N, { size: 14 }),
148
148
  onClick: () => L(`mcp/${e.id}`),
149
149
  children: I("botlit.mcpServers.actions.configure", "Configure")
150
150
  }),
151
- /* @__PURE__ */ O(d, {
152
- permission: u.MCP_DELETE,
153
- children: /* @__PURE__ */ O(p, {
151
+ /* @__PURE__ */ O(l, {
152
+ permission: c.MCP_DELETE,
153
+ children: /* @__PURE__ */ O(u, {
154
154
  variant: "ghost",
155
155
  size: "icon",
156
156
  className: "ml-auto",
@@ -164,13 +164,13 @@ var I = () => {
164
164
  })
165
165
  ]
166
166
  }) })] }, e.id))
167
- }) : /* @__PURE__ */ O(x, {
167
+ }) : /* @__PURE__ */ O(h, {
168
168
  illustration: "empty-generic",
169
169
  title: I("botlit.mcpServers.empty.title", "No MCP servers connected"),
170
170
  description: I("botlit.mcpServers.empty.description", "Connect MCP servers to give your agents access to external tools and resources."),
171
- action: /* @__PURE__ */ O(d, {
172
- permission: u.MCP_CREATE,
173
- children: /* @__PURE__ */ O(p, {
171
+ action: /* @__PURE__ */ O(l, {
172
+ permission: c.MCP_CREATE,
173
+ children: /* @__PURE__ */ O(u, {
174
174
  leftIcon: /* @__PURE__ */ O(M, { size: 16 }),
175
175
  onClick: () => Y(!0),
176
176
  children: I("botlit.mcpServers.actions.add", "Add MCP Server")
@@ -245,15 +245,15 @@ var I = () => {
245
245
  }),
246
246
  J && /* @__PURE__ */ O("div", {
247
247
  className: "fixed inset-0 bg-black/50 flex items-center justify-center z-50",
248
- children: /* @__PURE__ */ k(m, {
248
+ children: /* @__PURE__ */ k(r, {
249
249
  className: "w-full max-w-lg",
250
- children: [/* @__PURE__ */ k(_, { children: [/* @__PURE__ */ O(v, { children: I("botlit.mcpServers.form.title", "Add MCP Server") }), /* @__PURE__ */ O(g, { children: I("botlit.mcpServers.form.description", "Connect a new MCP server") })] }), /* @__PURE__ */ k(h, {
250
+ children: [/* @__PURE__ */ k(o, { children: [/* @__PURE__ */ O(s, { children: I("botlit.mcpServers.form.title", "Add MCP Server") }), /* @__PURE__ */ O(a, { children: I("botlit.mcpServers.form.description", "Connect a new MCP server") })] }), /* @__PURE__ */ k(i, {
251
251
  className: "space-y-4",
252
252
  children: [
253
- /* @__PURE__ */ O(S, {
253
+ /* @__PURE__ */ O(d, {
254
254
  label: I("botlit.mcpServers.form.nameLabel", "Server Name"),
255
255
  required: !0,
256
- children: /* @__PURE__ */ O(C, {
256
+ children: /* @__PURE__ */ O(f, {
257
257
  placeholder: I("botlit.mcpServers.form.namePlaceholder", "e.g., GitHub"),
258
258
  value: X.name,
259
259
  onChange: (e) => Z({
@@ -262,9 +262,9 @@ var I = () => {
262
262
  })
263
263
  })
264
264
  }),
265
- /* @__PURE__ */ O(S, {
265
+ /* @__PURE__ */ O(d, {
266
266
  label: I("botlit.mcpServers.form.descriptionLabel", "Description"),
267
- children: /* @__PURE__ */ O(C, {
267
+ children: /* @__PURE__ */ O(f, {
268
268
  placeholder: I("botlit.mcpServers.form.descriptionPlaceholder", "What does this server do?"),
269
269
  value: X.description,
270
270
  onChange: (e) => Z({
@@ -273,7 +273,7 @@ var I = () => {
273
273
  })
274
274
  })
275
275
  }),
276
- /* @__PURE__ */ O(S, {
276
+ /* @__PURE__ */ O(d, {
277
277
  label: I("botlit.mcpServers.form.transportLabel", "Transport"),
278
278
  children: /* @__PURE__ */ k("select", {
279
279
  className: "flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
@@ -302,10 +302,10 @@ var I = () => {
302
302
  ]
303
303
  })
304
304
  }),
305
- /* @__PURE__ */ O(S, {
305
+ /* @__PURE__ */ O(d, {
306
306
  label: I("botlit.mcpServers.form.baseUrlLabel", "Base URL"),
307
307
  required: !0,
308
- children: /* @__PURE__ */ O(C, {
308
+ children: /* @__PURE__ */ O(f, {
309
309
  placeholder: I("botlit.mcpServers.form.baseUrlPlaceholder", "e.g., https://mcp.example.com"),
310
310
  value: X.baseUrl,
311
311
  onChange: (e) => Z({
@@ -316,11 +316,11 @@ var I = () => {
316
316
  }),
317
317
  /* @__PURE__ */ k("div", {
318
318
  className: "flex justify-end gap-2 pt-4",
319
- children: [/* @__PURE__ */ O(p, {
319
+ children: [/* @__PURE__ */ O(u, {
320
320
  variant: "outline",
321
321
  onClick: () => Y(!1),
322
322
  children: I("botlit.mcpServers.actions.cancel", "Cancel")
323
- }), /* @__PURE__ */ O(p, {
323
+ }), /* @__PURE__ */ O(u, {
324
324
  onClick: Q,
325
325
  isLoading: U.loading,
326
326
  disabled: !X.name || !X.baseUrl,
@@ -335,7 +335,6 @@ var I = () => {
335
335
  })
336
336
  });
337
337
  };
338
- //#endregion
339
338
  export { I as MCPServersPage };
340
339
 
341
340
  //# sourceMappingURL=MCPServersPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MCPServersPage.js","names":[],"sources":["../../../src/botlit/pages/MCPServersPage.tsx"],"sourcesContent":["/**\n * MCP Servers Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useState } from 'react';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { Plus, Plug, PlugZap, Settings, Trash2 } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, FormField } from '../components/Input';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport {\n useMCPServers,\n useCreateMCPServer,\n useDeleteMCPServer,\n useTestMCPConnection,\n isMCPServerHealthy,\n mcpServerDescription,\n mcpServerEndpoint,\n type MCPServerRecord,\n} from '../hooks/useMCPServers';\nimport { formatRelativeTime } from '../utils/formatters';\nimport type { MCPTransport } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nexport const MCPServersPage: FC = () => {\n const t = useTr();\n const { navigateTo } = useBotlit();\n const { data: servers, loading, error, refetch } = useMCPServers();\n const [connectServer, connectResult] = useCreateMCPServer();\n const [deleteServer, deleteResult] = useDeleteMCPServer();\n const [testConnection, testResult] = useTestMCPConnection();\n const [showAddModal, setShowAddModal] = useState(false);\n const [newServer, setNewServer] = useState({\n name: '',\n description: '',\n transport: 'HTTP_JSON' as MCPTransport,\n baseUrl: '',\n });\n\n const handleConnect = async () => {\n if (!newServer.name || !newServer.baseUrl) return;\n\n try {\n await connectServer({\n name: newServer.name,\n type: newServer.transport,\n config: {\n url: newServer.baseUrl,\n description: newServer.description,\n },\n });\n } catch (err) {\n // Keep the dialog open so the operator can correct and retry — closing it\n // here is what made failed writes look like successes.\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.mcpServers.toast.connectError', 'Failed to connect MCP server')\n );\n return;\n }\n\n toast.success(\n t('botlit.mcpServers.toast.connectSuccess', 'Connected \"{{name}}\"', {\n name: newServer.name,\n })\n );\n void refetch();\n setNewServer({ name: '', description: '', transport: 'HTTP_JSON', baseUrl: '' });\n setShowAddModal(false);\n };\n\n const handleDisconnect = async (server: MCPServerRecord) => {\n try {\n await deleteServer(server.id);\n toast.success(\n t('botlit.mcpServers.toast.disconnectSuccess', 'Disconnected \"{{name}}\"', {\n name: server.name,\n })\n );\n void refetch();\n } catch (err) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.mcpServers.toast.disconnectError', 'Failed to disconnect MCP server')\n );\n }\n };\n\n const handleTest = async (server: MCPServerRecord) => {\n try {\n const ok = await testConnection(server.id);\n if (ok) {\n toast.success(\n t('botlit.mcpServers.toast.reachable', '\"{{name}}\" is reachable', {\n name: server.name,\n })\n );\n } else {\n toast.error(\n t('botlit.mcpServers.toast.unreachable', '\"{{name}}\" did not respond', {\n name: server.name,\n })\n );\n }\n void refetch();\n } catch (err) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.mcpServers.toast.testError', 'Failed to test MCP connection')\n );\n }\n };\n\n return (\n <PageLayout\n title={t('botlit.mcpServers.title', 'MCP Servers')}\n description={t(\n 'botlit.mcpServers.description',\n 'Connect Model Context Protocol servers to extend agent capabilities'\n )}\n actions={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.MCP_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => setShowAddModal(true)}>\n {t('botlit.mcpServers.actions.add', 'Add MCP Server')}\n </Button>\n </BotmanorPermissionGate>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Plug size={18} />}>\n {t(\n 'botlit.mcpServers.purpose',\n 'MCP (Model Context Protocol) servers are how your agents reach the outside world — they expose real tools an agent can call, like searching the web, reading a GitHub repo, querying a database or posting to Slack. Connect a server here and its tools become available to your agents (gated by your tool policies), turning a chatbot into something that can take action.'\n )}\n </PagePurpose>\n\n {/* Server List */}\n {loading ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource=\"MCP servers\" error={error} onRetry={() => void refetch()} />\n ) : servers.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {servers.map((server: MCPServerRecord) => (\n <Card key={server.id}>\n <CardHeader className=\"flex flex-row items-start justify-between\">\n <div className=\"flex items-start gap-3\">\n <div\n className={`p-2 rounded-lg ${\n isMCPServerHealthy(server.status)\n ? 'bg-status-success-bg-subtle'\n : 'bg-bg-sunken'\n }`}\n >\n {isMCPServerHealthy(server.status) ? (\n <PlugZap className=\"h-5 w-5 text-status-success-text\" />\n ) : (\n <Plug className=\"h-5 w-5 text-text-secondary\" />\n )}\n </div>\n <div>\n <CardTitle className=\"text-base\">{server.name}</CardTitle>\n <CardDescription>{mcpServerDescription(server)}</CardDescription>\n </div>\n </div>\n <StatusBadge status={server.status} />\n </CardHeader>\n <CardContent>\n <div className=\"space-y-4\">\n {/* Transport Info */}\n <div className=\"flex flex-wrap items-center gap-4 text-sm\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {server.type.toLowerCase().replace('_', ' ')}\n </Badge>\n {server.lastConnectedAt && (\n <span className=\"text-text-secondary\">\n {t('botlit.botsList.createdLabel', 'Created')}{' '}\n {formatRelativeTime(server.lastConnectedAt)}\n </span>\n )}\n </div>\n\n {/* Endpoint */}\n {mcpServerEndpoint(server) && (\n <p className=\"truncate text-sm text-text-secondary\">\n {mcpServerEndpoint(server)}\n </p>\n )}\n\n {server.errorMessage && (\n <p className=\"text-sm text-status-error-text\">{server.errorMessage}</p>\n )}\n\n {/* Actions */}\n <div className=\"flex items-center gap-2 pt-2 border-t border-border-subtle\">\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.MCP_TEST}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void handleTest(server)}\n isLoading={testResult.loading}\n >\n {t('botlit.mcpServers.actions.testConnection', 'Test connection')}\n </Button>\n </BotmanorPermissionGate>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n leftIcon={<Settings size={14} />}\n onClick={() => navigateTo(`mcp/${server.id}`)}\n >\n {t('botlit.mcpServers.actions.configure', 'Configure')}\n </Button>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.MCP_DELETE}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"ml-auto\"\n aria-label={`Disconnect ${server.name}`}\n onClick={() => void handleDisconnect(server)}\n isLoading={deleteResult.loading}\n >\n <Trash2 size={16} />\n </Button>\n </BotmanorPermissionGate>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-generic\"\n title={t('botlit.mcpServers.empty.title', 'No MCP servers connected')}\n description={t(\n 'botlit.mcpServers.empty.description',\n 'Connect MCP servers to give your agents access to external tools and resources.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.MCP_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => setShowAddModal(true)}>\n {t('botlit.mcpServers.actions.add', 'Add MCP Server')}\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n\n {/* Available MCP Servers */}\n <GlassCard treatment=\"glass\" glow className=\"p-6\">\n <div className=\"mb-4\">\n <h2 className=\"text-lg font-semibold tracking-tight text-text-primary\">\n {t('botlit.mcpServers.presets.title', 'Popular MCP Servers')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.mcpServers.presets.description', 'Quick-add common MCP servers')}\n </p>\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n {[\n {\n name: t('botlit.mcpServers.presets.github', 'GitHub'),\n description: t(\n 'botlit.mcpServers.presets.githubDesc',\n 'Repository management and code operations'\n ),\n baseUrl: 'https://mcp.github.com',\n },\n {\n name: t('botlit.mcpServers.presets.filesystem', 'Filesystem'),\n description: t(\n 'botlit.mcpServers.presets.filesystemDesc',\n 'Local file system access'\n ),\n baseUrl: 'http://localhost:3001',\n },\n {\n name: t('botlit.mcpServers.presets.braveSearch', 'Brave Search'),\n description: t(\n 'botlit.mcpServers.presets.braveSearchDesc',\n 'Web search capabilities'\n ),\n baseUrl: 'https://mcp.search.brave.com',\n },\n {\n name: t('botlit.mcpServers.presets.postgres', 'PostgreSQL'),\n description: t(\n 'botlit.mcpServers.presets.postgresDesc',\n 'Database queries and management'\n ),\n baseUrl: 'http://localhost:3002',\n },\n {\n name: t('botlit.mcpServers.presets.slack', 'Slack'),\n description: t(\n 'botlit.mcpServers.presets.slackDesc',\n 'Slack messaging integration'\n ),\n baseUrl: 'https://mcp.slack.com',\n },\n {\n name: t('botlit.mcpServers.presets.puppeteer', 'Puppeteer'),\n description: t('botlit.mcpServers.presets.puppeteerDesc', 'Browser automation'),\n baseUrl: 'http://localhost:3003',\n },\n ].map((preset) => (\n <button\n key={preset.name}\n className=\"p-4 text-left border border-border-subtle rounded-lg hover:bg-accent transition-colors\"\n onClick={() => {\n setNewServer({\n name: preset.name,\n description: preset.description,\n transport: 'HTTP_JSON',\n baseUrl: preset.baseUrl,\n });\n setShowAddModal(true);\n }}\n >\n <p className=\"font-medium\">{preset.name}</p>\n <p className=\"text-sm text-text-secondary mt-1\">{preset.description}</p>\n </button>\n ))}\n </div>\n </GlassCard>\n\n {/* Add Server Modal */}\n {showAddModal && (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <Card className=\"w-full max-w-lg\">\n <CardHeader>\n <CardTitle>{t('botlit.mcpServers.form.title', 'Add MCP Server')}</CardTitle>\n <CardDescription>\n {t('botlit.mcpServers.form.description', 'Connect a new MCP server')}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label={t('botlit.mcpServers.form.nameLabel', 'Server Name')} required>\n <Input\n placeholder={t('botlit.mcpServers.form.namePlaceholder', 'e.g., GitHub')}\n value={newServer.name}\n onChange={(e) => setNewServer({ ...newServer, name: e.target.value })}\n />\n </FormField>\n <FormField label={t('botlit.mcpServers.form.descriptionLabel', 'Description')}>\n <Input\n placeholder={t(\n 'botlit.mcpServers.form.descriptionPlaceholder',\n 'What does this server do?'\n )}\n value={newServer.description}\n onChange={(e) => setNewServer({ ...newServer, description: e.target.value })}\n />\n </FormField>\n <FormField label={t('botlit.mcpServers.form.transportLabel', 'Transport')}>\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={newServer.transport}\n onChange={(e) =>\n setNewServer({ ...newServer, transport: e.target.value as MCPTransport })\n }\n >\n <option value=\"HTTP_JSON\">HTTP JSON</option>\n <option value=\"JSON_RPC\">JSON RPC</option>\n <option value=\"SSE\">Server-Sent Events</option>\n <option value=\"CUSTOM\">Custom</option>\n </select>\n </FormField>\n <FormField label={t('botlit.mcpServers.form.baseUrlLabel', 'Base URL')} required>\n <Input\n placeholder={t(\n 'botlit.mcpServers.form.baseUrlPlaceholder',\n 'e.g., https://mcp.example.com'\n )}\n value={newServer.baseUrl}\n onChange={(e) => setNewServer({ ...newServer, baseUrl: e.target.value })}\n />\n </FormField>\n <div className=\"flex justify-end gap-2 pt-4\">\n <Button variant=\"outline\" onClick={() => setShowAddModal(false)}>\n {t('botlit.mcpServers.actions.cancel', 'Cancel')}\n </Button>\n <Button\n onClick={handleConnect}\n isLoading={connectResult.loading}\n disabled={!newServer.name || !newServer.baseUrl}\n >\n {t('botlit.mcpServers.actions.connect', 'Connect')}\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"MCPServersPage.js","names":["MCPServersPage","t","useTr","useBotlit","servers","useMCPServers","connectServer","connectResult","useCreateMCPServer","deleteServer","deleteResult","useDeleteMCPServer","testConnection","testResult","useTestMCPConnection","showAddModal","setShowAddModal","useState","newServer","setNewServer","handleConnect","err","toast","refetch","handleDisconnect","server","handleTest","PageLayout","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Button","Plus","PagePurpose","Plug","loading","i","error","ErrorState","Card","CardHeader","isMCPServerHealthy","PlugZap","CardTitle","CardDescription","mcpServerDescription","StatusBadge","CardContent","Badge","formatRelativeTime","mcpServerEndpoint","Settings","navigateTo","Trash2","EmptyState","GlassCard","preset","FormField","Input"],"sources":["../../../src/botlit/pages/MCPServersPage.tsx"],"sourcesContent":["/**\n * MCP Servers Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useState } from 'react';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { Plus, Plug, PlugZap, Settings, Trash2 } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, FormField } from '../components/Input';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport {\n useMCPServers,\n useCreateMCPServer,\n useDeleteMCPServer,\n useTestMCPConnection,\n isMCPServerHealthy,\n mcpServerDescription,\n mcpServerEndpoint,\n type MCPServerRecord,\n} from '../hooks/useMCPServers';\nimport { formatRelativeTime } from '../utils/formatters';\nimport type { MCPTransport } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nexport const MCPServersPage: FC = () => {\n const t = useTr();\n const { navigateTo } = useBotlit();\n const { data: servers, loading, error, refetch } = useMCPServers();\n const [connectServer, connectResult] = useCreateMCPServer();\n const [deleteServer, deleteResult] = useDeleteMCPServer();\n const [testConnection, testResult] = useTestMCPConnection();\n const [showAddModal, setShowAddModal] = useState(false);\n const [newServer, setNewServer] = useState({\n name: '',\n description: '',\n transport: 'HTTP_JSON' as MCPTransport,\n baseUrl: '',\n });\n\n const handleConnect = async () => {\n if (!newServer.name || !newServer.baseUrl) return;\n\n try {\n await connectServer({\n name: newServer.name,\n type: newServer.transport,\n config: {\n url: newServer.baseUrl,\n description: newServer.description,\n },\n });\n } catch (err) {\n // Keep the dialog open so the operator can correct and retry — closing it\n // here is what made failed writes look like successes.\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.mcpServers.toast.connectError', 'Failed to connect MCP server')\n );\n return;\n }\n\n toast.success(\n t('botlit.mcpServers.toast.connectSuccess', 'Connected \"{{name}}\"', {\n name: newServer.name,\n })\n );\n void refetch();\n setNewServer({ name: '', description: '', transport: 'HTTP_JSON', baseUrl: '' });\n setShowAddModal(false);\n };\n\n const handleDisconnect = async (server: MCPServerRecord) => {\n try {\n await deleteServer(server.id);\n toast.success(\n t('botlit.mcpServers.toast.disconnectSuccess', 'Disconnected \"{{name}}\"', {\n name: server.name,\n })\n );\n void refetch();\n } catch (err) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.mcpServers.toast.disconnectError', 'Failed to disconnect MCP server')\n );\n }\n };\n\n const handleTest = async (server: MCPServerRecord) => {\n try {\n const ok = await testConnection(server.id);\n if (ok) {\n toast.success(\n t('botlit.mcpServers.toast.reachable', '\"{{name}}\" is reachable', {\n name: server.name,\n })\n );\n } else {\n toast.error(\n t('botlit.mcpServers.toast.unreachable', '\"{{name}}\" did not respond', {\n name: server.name,\n })\n );\n }\n void refetch();\n } catch (err) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.mcpServers.toast.testError', 'Failed to test MCP connection')\n );\n }\n };\n\n return (\n <PageLayout\n title={t('botlit.mcpServers.title', 'MCP Servers')}\n description={t(\n 'botlit.mcpServers.description',\n 'Connect Model Context Protocol servers to extend agent capabilities'\n )}\n actions={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.MCP_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => setShowAddModal(true)}>\n {t('botlit.mcpServers.actions.add', 'Add MCP Server')}\n </Button>\n </BotmanorPermissionGate>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Plug size={18} />}>\n {t(\n 'botlit.mcpServers.purpose',\n 'MCP (Model Context Protocol) servers are how your agents reach the outside world — they expose real tools an agent can call, like searching the web, reading a GitHub repo, querying a database or posting to Slack. Connect a server here and its tools become available to your agents (gated by your tool policies), turning a chatbot into something that can take action.'\n )}\n </PagePurpose>\n\n {/* Server List */}\n {loading ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource=\"MCP servers\" error={error} onRetry={() => void refetch()} />\n ) : servers.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {servers.map((server: MCPServerRecord) => (\n <Card key={server.id}>\n <CardHeader className=\"flex flex-row items-start justify-between\">\n <div className=\"flex items-start gap-3\">\n <div\n className={`p-2 rounded-lg ${\n isMCPServerHealthy(server.status)\n ? 'bg-status-success-bg-subtle'\n : 'bg-bg-sunken'\n }`}\n >\n {isMCPServerHealthy(server.status) ? (\n <PlugZap className=\"h-5 w-5 text-status-success-text\" />\n ) : (\n <Plug className=\"h-5 w-5 text-text-secondary\" />\n )}\n </div>\n <div>\n <CardTitle className=\"text-base\">{server.name}</CardTitle>\n <CardDescription>{mcpServerDescription(server)}</CardDescription>\n </div>\n </div>\n <StatusBadge status={server.status} />\n </CardHeader>\n <CardContent>\n <div className=\"space-y-4\">\n {/* Transport Info */}\n <div className=\"flex flex-wrap items-center gap-4 text-sm\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {server.type.toLowerCase().replace('_', ' ')}\n </Badge>\n {server.lastConnectedAt && (\n <span className=\"text-text-secondary\">\n {t('botlit.botsList.createdLabel', 'Created')}{' '}\n {formatRelativeTime(server.lastConnectedAt)}\n </span>\n )}\n </div>\n\n {/* Endpoint */}\n {mcpServerEndpoint(server) && (\n <p className=\"truncate text-sm text-text-secondary\">\n {mcpServerEndpoint(server)}\n </p>\n )}\n\n {server.errorMessage && (\n <p className=\"text-sm text-status-error-text\">{server.errorMessage}</p>\n )}\n\n {/* Actions */}\n <div className=\"flex items-center gap-2 pt-2 border-t border-border-subtle\">\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.MCP_TEST}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void handleTest(server)}\n isLoading={testResult.loading}\n >\n {t('botlit.mcpServers.actions.testConnection', 'Test connection')}\n </Button>\n </BotmanorPermissionGate>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n leftIcon={<Settings size={14} />}\n onClick={() => navigateTo(`mcp/${server.id}`)}\n >\n {t('botlit.mcpServers.actions.configure', 'Configure')}\n </Button>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.MCP_DELETE}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"ml-auto\"\n aria-label={`Disconnect ${server.name}`}\n onClick={() => void handleDisconnect(server)}\n isLoading={deleteResult.loading}\n >\n <Trash2 size={16} />\n </Button>\n </BotmanorPermissionGate>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-generic\"\n title={t('botlit.mcpServers.empty.title', 'No MCP servers connected')}\n description={t(\n 'botlit.mcpServers.empty.description',\n 'Connect MCP servers to give your agents access to external tools and resources.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.MCP_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => setShowAddModal(true)}>\n {t('botlit.mcpServers.actions.add', 'Add MCP Server')}\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n\n {/* Available MCP Servers */}\n <GlassCard treatment=\"glass\" glow className=\"p-6\">\n <div className=\"mb-4\">\n <h2 className=\"text-lg font-semibold tracking-tight text-text-primary\">\n {t('botlit.mcpServers.presets.title', 'Popular MCP Servers')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.mcpServers.presets.description', 'Quick-add common MCP servers')}\n </p>\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n {[\n {\n name: t('botlit.mcpServers.presets.github', 'GitHub'),\n description: t(\n 'botlit.mcpServers.presets.githubDesc',\n 'Repository management and code operations'\n ),\n baseUrl: 'https://mcp.github.com',\n },\n {\n name: t('botlit.mcpServers.presets.filesystem', 'Filesystem'),\n description: t(\n 'botlit.mcpServers.presets.filesystemDesc',\n 'Local file system access'\n ),\n baseUrl: 'http://localhost:3001',\n },\n {\n name: t('botlit.mcpServers.presets.braveSearch', 'Brave Search'),\n description: t(\n 'botlit.mcpServers.presets.braveSearchDesc',\n 'Web search capabilities'\n ),\n baseUrl: 'https://mcp.search.brave.com',\n },\n {\n name: t('botlit.mcpServers.presets.postgres', 'PostgreSQL'),\n description: t(\n 'botlit.mcpServers.presets.postgresDesc',\n 'Database queries and management'\n ),\n baseUrl: 'http://localhost:3002',\n },\n {\n name: t('botlit.mcpServers.presets.slack', 'Slack'),\n description: t(\n 'botlit.mcpServers.presets.slackDesc',\n 'Slack messaging integration'\n ),\n baseUrl: 'https://mcp.slack.com',\n },\n {\n name: t('botlit.mcpServers.presets.puppeteer', 'Puppeteer'),\n description: t('botlit.mcpServers.presets.puppeteerDesc', 'Browser automation'),\n baseUrl: 'http://localhost:3003',\n },\n ].map((preset) => (\n <button\n key={preset.name}\n className=\"p-4 text-left border border-border-subtle rounded-lg hover:bg-accent transition-colors\"\n onClick={() => {\n setNewServer({\n name: preset.name,\n description: preset.description,\n transport: 'HTTP_JSON',\n baseUrl: preset.baseUrl,\n });\n setShowAddModal(true);\n }}\n >\n <p className=\"font-medium\">{preset.name}</p>\n <p className=\"text-sm text-text-secondary mt-1\">{preset.description}</p>\n </button>\n ))}\n </div>\n </GlassCard>\n\n {/* Add Server Modal */}\n {showAddModal && (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <Card className=\"w-full max-w-lg\">\n <CardHeader>\n <CardTitle>{t('botlit.mcpServers.form.title', 'Add MCP Server')}</CardTitle>\n <CardDescription>\n {t('botlit.mcpServers.form.description', 'Connect a new MCP server')}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label={t('botlit.mcpServers.form.nameLabel', 'Server Name')} required>\n <Input\n placeholder={t('botlit.mcpServers.form.namePlaceholder', 'e.g., GitHub')}\n value={newServer.name}\n onChange={(e) => setNewServer({ ...newServer, name: e.target.value })}\n />\n </FormField>\n <FormField label={t('botlit.mcpServers.form.descriptionLabel', 'Description')}>\n <Input\n placeholder={t(\n 'botlit.mcpServers.form.descriptionPlaceholder',\n 'What does this server do?'\n )}\n value={newServer.description}\n onChange={(e) => setNewServer({ ...newServer, description: e.target.value })}\n />\n </FormField>\n <FormField label={t('botlit.mcpServers.form.transportLabel', 'Transport')}>\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={newServer.transport}\n onChange={(e) =>\n setNewServer({ ...newServer, transport: e.target.value as MCPTransport })\n }\n >\n <option value=\"HTTP_JSON\">HTTP JSON</option>\n <option value=\"JSON_RPC\">JSON RPC</option>\n <option value=\"SSE\">Server-Sent Events</option>\n <option value=\"CUSTOM\">Custom</option>\n </select>\n </FormField>\n <FormField label={t('botlit.mcpServers.form.baseUrlLabel', 'Base URL')} required>\n <Input\n placeholder={t(\n 'botlit.mcpServers.form.baseUrlPlaceholder',\n 'e.g., https://mcp.example.com'\n )}\n value={newServer.baseUrl}\n onChange={(e) => setNewServer({ ...newServer, baseUrl: e.target.value })}\n />\n </FormField>\n <div className=\"flex justify-end gap-2 pt-4\">\n <Button variant=\"outline\" onClick={() => setShowAddModal(false)}>\n {t('botlit.mcpServers.actions.cancel', 'Cancel')}\n </Button>\n <Button\n onClick={handleConnect}\n isLoading={connectResult.loading}\n disabled={!newServer.name || !newServer.baseUrl}\n >\n {t('botlit.mcpServers.actions.connect', 'Connect')}\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { FC } from 'react';
2
+ export declare const PoliciesPage: FC;