@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":"ChannelDetailPage.js","names":[],"sources":["../../../src/botlit/pages/ChannelDetailPage.tsx"],"sourcesContent":["/**\n * Channel Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { useParams, useSearchParams } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Radio,\n MessageSquare,\n Globe,\n Hash,\n Shield,\n Settings,\n Save,\n Plus,\n ExternalLink,\n Palette,\n Edit,\n Trash2,\n X,\n Slack,\n Bell,\n BellOff,\n CheckCircle2,\n Unlink,\n Loader2,\n} from 'lucide-react';\nimport { PagePurpose, NextSteps, 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 {\n useChannelConnector,\n useChannelRoutes,\n useCreateChannelConnector,\n useUpdateChannelConnector,\n useDeleteChannelConnector,\n useCreateChannelRoute,\n routeMetadataString,\n useBots,\n useMyUserPlatformConnection,\n useInitiateSlackConnect,\n useLinkIntegrationConnection,\n useToggleSlackNotifications,\n useRevokeSlackConnection,\n} from '../hooks';\nimport { readWidgetConfig, WIDGET_METADATA_KEY } from '../hooks/useChannels';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { toUnion } from '../utils/unions';\nimport type { ChannelType, Visibility } from '../types';\n\n/** Channel types the UI can render icons/labels for. */\nconst CHANNEL_TYPES: ChannelType[] = [\n 'WEB_WIDGET',\n 'SLACK',\n 'TEAMS',\n 'DISCORD',\n 'WHATSAPP',\n 'WEBHOOK',\n 'CUSTOM',\n];\n\nconst VISIBILITIES: Visibility[] = ['PRIVATE', 'WORKSPACE', 'PUBLIC'];\n\n/** Splits a comma-separated form field into a trimmed, non-empty list. */\nfunction splitList(value: string): string[] {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\nimport { toast } from 'sonner';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\ninterface ChannelDetailPageProps {\n isNew?: boolean;\n}\n\nconst ChannelIcon: FC<{ type: ChannelType }> = ({ type }) => {\n switch (type) {\n case 'SLACK':\n return <Hash size={18} />;\n case 'WEB_WIDGET':\n return <Globe size={18} />;\n case 'TEAMS':\n return <MessageSquare size={18} />;\n default:\n return <Radio size={18} />;\n }\n};\n\nexport const ChannelDetailPage: FC<ChannelDetailPageProps> = ({ isNew }) => {\n const { connectorId } = useParams();\n const { navigateTo } = useBotlit();\n const [searchParams, setSearchParams] = useSearchParams();\n const { data: connector, loading } = useChannelConnector(isNew ? undefined : connectorId);\n const { data: routes, refetch: refetchRoutes } = useChannelRoutes(connectorId);\n const { data: bots } = useBots();\n const [createConnector, createConnectorResult] = useCreateChannelConnector();\n const [updateConnector, updateConnectorResult] = useUpdateChannelConnector();\n const [deleteConnector, deleteConnectorResult] = useDeleteChannelConnector();\n const [createRoute, createRouteResult] = useCreateChannelRoute();\n\n // Phase 7: Slack personal account connect\n const slackChannelId =\n connector?.type === 'SLACK' && connector?.credentialsRefId\n ? connector.credentialsRefId\n : undefined;\n const {\n data: slackConnection,\n loading: slackConnectionLoading,\n refetch: refetchSlackConnection,\n } = useMyUserPlatformConnection(slackChannelId);\n const { initiate: initiateSlack } = useInitiateSlackConnect();\n const { link: linkIntegration, loading: linking } = useLinkIntegrationConnection();\n const { toggle: toggleNotifications, loading: togglingNotifications } =\n useToggleSlackNotifications();\n const { revoke: revokeConnection, loading: revoking } = useRevokeSlackConnection();\n const [oauthError, setOauthError] = useState<string | null>(null);\n\n // After integrations OAuth flow: link integration connection to channel\n // URL params: ?integrationConnectionId=<id>&channelId=<id>\n //\n // The ref — not an empty dependency list — is what makes this run once: the\n // params are consumed exactly once per visit, while the effect still declares\n // everything it reads.\n const oauthLinkConsumed = useRef(false);\n useEffect(() => {\n if (oauthLinkConsumed.current) return;\n\n const integrationConnectionId = searchParams.get('integrationConnectionId');\n const channelId = searchParams.get('channelId');\n if (!integrationConnectionId || !channelId) return;\n\n oauthLinkConsumed.current = true;\n\n // Clean the URL immediately so a refresh doesn't re-trigger\n const cleaned = new URLSearchParams(searchParams);\n cleaned.delete('integrationConnectionId');\n cleaned.delete('channelId');\n setSearchParams(cleaned, { replace: true });\n\n setOauthError(null);\n void linkIntegration(integrationConnectionId, channelId).then((connection) => {\n if (connection) {\n void refetchSlackConnection();\n } else {\n setOauthError('Failed to link Slack connection. Please try again.');\n }\n });\n }, [searchParams, setSearchParams, linkIntegration, refetchSlackConnection]);\n\n const handleSlackConnect = () => {\n if (!slackChannelId) return;\n // Slack appends ?code=...&state=... to the redirect_uri we supply\n const redirectUri = `${window.location.origin}${window.location.pathname}`;\n initiateSlack(slackChannelId, redirectUri);\n };\n\n const handleToggleNotifications = async () => {\n if (!slackConnection) return;\n const updated = await toggleNotifications(\n slackConnection.id,\n !slackConnection.notificationsEnabled\n );\n if (updated) {\n await refetchSlackConnection();\n }\n };\n\n const handleRevokeSlack = async () => {\n if (!slackConnection) return;\n const ok = await revokeConnection(slackConnection.id);\n if (ok) {\n await refetchSlackConnection();\n }\n };\n\n const [isEditing, setIsEditing] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [showAddRoute, setShowAddRoute] = useState(false);\n const [newRoute, setNewRoute] = useState({ locationId: '', locationName: '', botId: '' });\n\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n type: 'WEB_WIDGET' as ChannelType,\n visibility: 'PRIVATE' as Visibility,\n credentialsRefId: '',\n });\n\n const [widgetConfig, setWidgetConfig] = useState({\n allowedOrigins: '',\n primaryColor: '#3b82f6',\n fontFamily: 'Inter, sans-serif',\n starterPrompts: '',\n });\n\n /**\n * The connector has no widget column — the appearance settings are stored\n * under `metadata.webWidget`, which is where the detail view reads them back.\n */\n const buildWidgetMetadata = (): Record<string, unknown> | undefined => {\n if (formData.type !== 'WEB_WIDGET') return undefined;\n return {\n [WIDGET_METADATA_KEY]: {\n allowedOrigins: splitList(widgetConfig.allowedOrigins),\n primaryColor: widgetConfig.primaryColor,\n fontFamily: widgetConfig.fontFamily,\n starterPrompts: splitList(widgetConfig.starterPrompts),\n },\n };\n };\n\n const handleCreate = async () => {\n if (!formData.name) return;\n try {\n const created = await createConnector({\n name: formData.name,\n type: formData.type,\n description: formData.description || undefined,\n visibility: formData.visibility,\n credentialsRefId: formData.credentialsRefId || undefined,\n metadata: buildWidgetMetadata(),\n });\n toast.success(`Channel \"${created.name}\" created`);\n navigateTo(`channels/${created.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to create channel connector');\n }\n };\n\n const handleUpdate = async () => {\n if (!connectorId || !formData.name) return;\n try {\n await updateConnector({\n connectorId,\n input: {\n name: formData.name,\n description: formData.description || undefined,\n visibility: formData.visibility,\n credentialsRefId: formData.credentialsRefId || undefined,\n metadata: buildWidgetMetadata(),\n },\n });\n toast.success('Channel updated');\n setIsEditing(false);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update channel connector');\n }\n };\n\n const handleDelete = async () => {\n if (!connectorId) return;\n try {\n await deleteConnector(connectorId);\n if (isNative()) void nativeNotify('success');\n navigateTo('channels');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n throw err;\n }\n };\n\n const handleAddRoute = async () => {\n if (!connectorId || !newRoute.locationId || !newRoute.botId) return;\n const selectedBot = bots?.find((a: { id: string; name: string }) => a.id === newRoute.botId);\n try {\n await createRoute({\n connectorId,\n locationId: newRoute.locationId,\n appId: newRoute.botId,\n metadata: {\n locationName: newRoute.locationName || newRoute.locationId,\n appName: selectedBot?.name,\n },\n });\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to create route');\n return;\n }\n toast.success('Route created');\n void refetchRoutes();\n setNewRoute({ locationId: '', locationName: '', botId: '' });\n setShowAddRoute(false);\n };\n\n const startEditing = () => {\n if (!connector) return;\n setFormData({\n name: connector.name,\n description: connector.description || '',\n type: toUnion(connector.type, CHANNEL_TYPES, 'CUSTOM'),\n visibility: toUnion(connector.visibility, VISIBILITIES, 'PRIVATE'),\n credentialsRefId: connector.credentialsRefId || '',\n });\n const saved = readWidgetConfig(connector);\n if (saved) {\n setWidgetConfig({\n allowedOrigins: saved.allowedOrigins.join(', '),\n primaryColor: saved.primaryColor,\n fontFamily: saved.fontFamily,\n starterPrompts: saved.starterPrompts.join(', '),\n });\n }\n setIsEditing(true);\n };\n\n if (isNew) {\n return (\n <PageLayout\n title=\"Create Channel Connector\"\n description=\"Set up a new channel for your AI agents\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('channels')}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleCreate}\n isLoading={createConnectorResult.loading || updateConnectorResult.loading}\n disabled={!formData.name}\n >\n Create\n </Button>\n </div>\n }\n >\n <div className=\"max-w-2xl space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Connector Name\" required>\n <Input\n placeholder=\"e.g., Production Web Widget\"\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 is this channel connector for?\"\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=\"Channel Type\" 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.type}\n onChange={(e) =>\n setFormData({ ...formData, type: e.target.value as ChannelType })\n }\n >\n <option value=\"WEB_WIDGET\">Web Widget</option>\n <option value=\"SLACK\">Slack</option>\n <option value=\"TEAMS\">Microsoft Teams</option>\n <option value=\"DISCORD\">Discord</option>\n <option value=\"WHATSAPP\">WhatsApp</option>\n <option value=\"WEBHOOK\">Webhook</option>\n <option value=\"CUSTOM\">Custom</option>\n </select>\n </FormField>\n\n <FormField label=\"Visibility\">\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.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n </div>\n\n {formData.type !== 'WEB_WIDGET' && (\n <FormField label=\"Credentials Reference\">\n <Input\n placeholder=\"e.g., secret-slack-token\"\n value={formData.credentialsRefId}\n onChange={(e) => setFormData({ ...formData, credentialsRefId: e.target.value })}\n />\n </FormField>\n )}\n </CardContent>\n </Card>\n\n {formData.type === 'WEB_WIDGET' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Palette size={18} />\n Widget Configuration\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Allowed Origins\" description=\"Comma-separated list of domains\">\n <Input\n placeholder=\"e.g., https://example.com, https://app.example.com\"\n value={widgetConfig.allowedOrigins}\n onChange={(e) =>\n setWidgetConfig({ ...widgetConfig, allowedOrigins: e.target.value })\n }\n />\n </FormField>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Primary Color\">\n <div className=\"flex gap-2\">\n <input\n type=\"color\"\n value={widgetConfig.primaryColor}\n onChange={(e) =>\n setWidgetConfig({ ...widgetConfig, primaryColor: e.target.value })\n }\n className=\"h-10 w-16 rounded border border-border-default\"\n />\n <Input\n value={widgetConfig.primaryColor}\n onChange={(e) =>\n setWidgetConfig({ ...widgetConfig, primaryColor: e.target.value })\n }\n />\n </div>\n </FormField>\n\n <FormField label=\"Font Family\">\n <Input\n value={widgetConfig.fontFamily}\n onChange={(e) =>\n setWidgetConfig({ ...widgetConfig, fontFamily: e.target.value })\n }\n />\n </FormField>\n </div>\n\n <FormField label=\"Starter Prompts\" description=\"One per line\">\n <Textarea\n placeholder=\"What can you help me with?\"\n value={widgetConfig.starterPrompts}\n onChange={(e) =>\n setWidgetConfig({ ...widgetConfig, starterPrompts: e.target.value })\n }\n rows={3}\n />\n </FormField>\n </CardContent>\n </Card>\n )}\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 (!connector) {\n return (\n <PageLayout title=\"Connector Not Found\">\n <EmptyState\n illustration=\"empty-notifications\"\n title=\"Connector Not Found\"\n description=\"This channel connector doesn't exist.\"\n action={<Button onClick={() => navigateTo('channels')}>Back to Channels</Button>}\n />\n </PageLayout>\n );\n }\n\n const connectorRoutes =\n routes?.filter((r: { connectorId: string }) => r.connectorId === connector.id) || [];\n const connectorType = toUnion(connector.type, CHANNEL_TYPES, 'CUSTOM');\n const savedWidgetConfig = readWidgetConfig(connector);\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('channels')}>\n <ArrowLeft size={20} />\n </Button>\n <div className=\"p-2 rounded-lg bg-action-primary-bg/10\">\n <ChannelIcon type={connectorType} />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{connector.name}</span>\n <StatusBadge status={connector.status} />\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">{connector.description}</p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button\n variant=\"outline\"\n leftIcon={<Plus size={16} />}\n onClick={() => setShowAddRoute(true)}\n >\n Add Route\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={updateConnectorResult.loading}\n >\n Save\n </Button>\n </>\n ) : (\n <>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_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={deleteConnectorResult.loading}\n >\n Confirm\n </Button>\n </div>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_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={<Radio size={18} />}>\n This connector links BotManor to one messaging platform. From here you add routes — each\n mapping a specific location on the channel (a Slack channel, a widget, a number) to the\n bot that should answer there — tweak the connector&rsquo;s settings, and manage its\n connection. Set up at least one route so messages on this channel reach a bot.\n </PagePurpose>\n\n <NextSteps\n storageKey={`botlit-channel-${connector.id}`}\n steps={[\n {\n id: 'route',\n label: 'Add a route',\n description: 'Point an incoming location on this channel at one of your bots.',\n icon: <Plus size={16} />,\n onClick: () => setShowAddRoute(true),\n done: connectorRoutes.length > 0,\n },\n {\n id: 'edit',\n label: 'Review connector settings',\n description: 'Confirm the name, visibility and channel-specific configuration.',\n icon: <Settings size={16} />,\n onClick: startEditing,\n },\n {\n id: 'bots',\n label: 'Check your bots',\n description: 'Make sure the bot you are routing to is active and configured.',\n icon: <MessageSquare size={16} />,\n onClick: () => navigateTo('bots'),\n },\n ]}\n />\n\n {/* Add Route Modal */}\n {showAddRoute && (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle>Add Route</CardTitle>\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setShowAddRoute(false)}>\n <X size={16} />\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Location ID\" required>\n <Input\n placeholder=\"e.g., #general or channel ID\"\n value={newRoute.locationId}\n onChange={(e) => setNewRoute({ ...newRoute, locationId: e.target.value })}\n />\n </FormField>\n <FormField label=\"Location Name\">\n <Input\n placeholder=\"Friendly name (optional)\"\n value={newRoute.locationName}\n onChange={(e) => setNewRoute({ ...newRoute, locationName: e.target.value })}\n />\n </FormField>\n </div>\n <FormField label=\"Connect to Bot\" 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={newRoute.botId}\n onChange={(e) => setNewRoute({ ...newRoute, botId: e.target.value })}\n >\n <option value=\"\">Select a bot...</option>\n {bots?.map((bot: { id: string; name: string }) => (\n <option key={bot.id} value={bot.id}>\n {bot.name}\n </option>\n ))}\n </select>\n </FormField>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" onClick={() => setShowAddRoute(false)}>\n Cancel\n </Button>\n <Button\n onClick={handleAddRoute}\n isLoading={createRouteResult.loading}\n disabled={!newRoute.locationId || !newRoute.botId}\n >\n Add Route\n </Button>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Edit Form */}\n {isEditing && (\n <Card>\n <CardHeader>\n <CardTitle>Edit Channel</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Connector Name\" required>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={2}\n />\n </FormField>\n <FormField label=\"Visibility\">\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.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n </CardContent>\n </Card>\n )}\n\n {/* Overview Cards */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <div className=\"p-3 rounded-full bg-action-primary-bg/10 w-fit mx-auto mb-2\">\n <ChannelIcon type={connectorType} />\n </div>\n <p className=\"text-lg font-bold capitalize\">\n {connector.type.toLowerCase().replace('_', ' ')}\n </p>\n <p className=\"text-sm text-text-secondary\">Channel Type</p>\n </CardContent>\n </Card>\n <GlassCard treatment=\"glass\" glow className=\"p-6 text-center\">\n <p className=\"text-3xl font-bold tabular-nums text-text-primary\">\n {connectorRoutes.length}\n </p>\n <p className=\"text-sm text-text-secondary\">Active Routes</p>\n </GlassCard>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary capitalize\">\n {connector.visibility.toLowerCase()}\n </p>\n <p className=\"text-sm text-text-secondary\">Visibility</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{connector.revision}</p>\n <p className=\"text-sm text-text-secondary\">Revision</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Web Widget Configuration */}\n {savedWidgetConfig && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Palette size={18} />\n Widget Configuration\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary\">Allowed Origins</p>\n {savedWidgetConfig.allowedOrigins.length > 0 ? (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {savedWidgetConfig.allowedOrigins.map((origin) => (\n <Badge key={origin} variant=\"outline\" className=\"font-mono text-xs\">\n {origin}\n </Badge>\n ))}\n </div>\n ) : (\n <p className=\"font-medium\">Any origin</p>\n )}\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Theme</p>\n <div className=\"flex items-center gap-2 mt-1\">\n <div\n className=\"w-6 h-6 rounded border border-border-subtle\"\n style={{ backgroundColor: savedWidgetConfig.primaryColor }}\n />\n <span className=\"font-mono text-sm\">{savedWidgetConfig.primaryColor}</span>\n </div>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Font Family</p>\n <p className=\"font-medium\">{savedWidgetConfig.fontFamily}</p>\n </div>\n </div>\n {savedWidgetConfig.starterPrompts.length > 0 && (\n <div className=\"mt-4 pt-4 border-t border-border-subtle\">\n <p className=\"text-sm text-text-secondary mb-2\">Starter Prompts</p>\n <div className=\"flex flex-wrap gap-2\">\n {savedWidgetConfig.starterPrompts.map((prompt, i) => (\n <Badge key={i} variant=\"secondary\">\n {prompt}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Routes */}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <div>\n <CardTitle>Routes</CardTitle>\n <CardDescription>Routes connect this channel to your bots</CardDescription>\n </div>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n leftIcon={<Plus size={14} />}\n onClick={() => setShowAddRoute(true)}\n >\n Add Route\n </Button>\n </BotmanorPermissionGate>\n </CardHeader>\n <CardContent>\n {connectorRoutes.length > 0 ? (\n <div className=\"space-y-3\">\n {connectorRoutes.map(\n (route: {\n id: string;\n locationId: string;\n appId: string;\n revision: number;\n metadata?: Record<string, unknown> | null;\n }) => (\n <div\n key={route.id}\n className=\"flex items-center justify-between p-4 border border-border-subtle rounded-lg\"\n >\n <div className=\"flex items-center gap-4\">\n <div className=\"p-2 rounded-lg bg-bg-sunken\">\n <MessageSquare size={18} className=\"text-text-secondary\" />\n </div>\n <div>\n <p className=\"font-medium\">\n {routeMetadataString(route, 'locationName') ?? route.locationId}\n </p>\n <p className=\"text-sm text-text-secondary\">\n Connected to: {routeMetadataString(route, 'appName') ?? route.appId}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\">Rev {route.revision}</Badge>\n <Button variant=\"ghost\" size=\"sm\">\n <ExternalLink size={14} />\n </Button>\n </div>\n </div>\n )\n )}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-data\"\n title=\"No routes configured\"\n description=\"Add a route to connect this channel to a bot.\"\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => setShowAddRoute(true)}>\n Add Route\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </CardContent>\n </Card>\n\n {/* Slack Personal Account Connect (Phase 7) */}\n {connector.type === 'SLACK' && connector.credentialsRefId && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Slack size={18} />\n Your Slack Account\n </CardTitle>\n <CardDescription>\n Connect your personal Slack account to receive direct messages from this bot\n </CardDescription>\n </CardHeader>\n <CardContent>\n {/* OAuth error banner */}\n {oauthError && (\n <div className=\"mb-4 flex items-start gap-2 rounded-lg border border-status-error-border/40 bg-status-error-bg/10 px-3 py-2 text-sm text-status-error-text\">\n <span>{oauthError}</span>\n <button\n onClick={() => setOauthError(null)}\n className=\"ml-auto cursor-pointer text-status-error-text/70 hover:text-status-error-text\"\n >\n <X size={14} />\n </button>\n </div>\n )}\n\n {/* Linking integration connection */}\n {linking ? (\n <div className=\"flex items-center gap-2 py-4 text-text-secondary\">\n <Loader2 size={16} className=\"animate-spin\" />\n <span className=\"text-sm\">Linking Slack connection...</span>\n </div>\n ) : slackConnectionLoading ? (\n <div className=\"flex items-center gap-2 py-4 text-text-secondary\">\n <Loader2 size={16} className=\"animate-spin\" />\n <span className=\"text-sm\">Checking connection...</span>\n </div>\n ) : slackConnection && slackConnection.dmAllowed ? (\n <div className=\"space-y-4\">\n {/* Connected state */}\n <div className=\"flex items-center gap-3 p-3 rounded-lg bg-bg-sunken\">\n <CheckCircle2 size={20} className=\"text-green-600 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"font-medium text-sm\">\n {slackConnection.externalDisplayName ||\n slackConnection.externalUsername ||\n slackConnection.externalUserId}\n </p>\n {slackConnection.externalUsername && slackConnection.externalDisplayName && (\n <p className=\"text-xs text-text-secondary\">\n @{slackConnection.externalUsername}\n </p>\n )}\n {slackConnection.connectedAt && (\n <p className=\"text-xs text-text-secondary\">\n Connected {new Date(slackConnection.connectedAt).toLocaleDateString()}\n </p>\n )}\n </div>\n <div className=\"flex items-center gap-1\">\n {slackConnection.isTokenExpired && (\n <Badge\n variant=\"outline\"\n className=\"text-xs text-amber-600 border-amber-400\"\n >\n Token expired\n </Badge>\n )}\n </div>\n </div>\n\n {/* Notification toggle */}\n <div className=\"flex items-center justify-between p-3 border border-border-subtle rounded-lg\">\n <div className=\"flex items-center gap-2\">\n {slackConnection.notificationsEnabled ? (\n <Bell size={16} className=\"text-primary\" />\n ) : (\n <BellOff size={16} className=\"text-text-secondary\" />\n )}\n <div>\n <p className=\"text-sm font-medium\">DM Notifications</p>\n <p className=\"text-xs text-text-secondary\">\n {slackConnection.notificationsEnabled\n ? 'You will receive bot DMs'\n : 'DM notifications are paused'}\n </p>\n </div>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleToggleNotifications}\n isLoading={togglingNotifications}\n >\n {slackConnection.notificationsEnabled ? 'Disable' : 'Enable'}\n </Button>\n </div>\n\n {/* Reconnect (if token expired) or Disconnect */}\n <div className=\"flex gap-2 justify-end pt-2\">\n {slackConnection.isTokenExpired && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n leftIcon={<Slack size={14} />}\n onClick={handleSlackConnect}\n >\n Reconnect\n </Button>\n )}\n <Button\n variant=\"destructive\"\n size=\"sm\"\n leftIcon={<Unlink size={14} />}\n onClick={handleRevokeSlack}\n isLoading={revoking}\n >\n Disconnect\n </Button>\n </div>\n </div>\n ) : (\n /* Not connected state */\n <div className=\"flex flex-col items-center gap-4 py-8 text-center\">\n <div className=\"p-4 rounded-full bg-bg-sunken\">\n <Slack size={32} className=\"text-text-secondary\" />\n </div>\n <div>\n <p className=\"font-medium\">No personal account connected</p>\n <p className=\"text-sm text-text-secondary mt-1\">\n Connect your Slack account so the bot can send you direct messages\n </p>\n </div>\n <Button leftIcon={<Slack size={16} />} onClick={handleSlackConnect}>\n Connect with Slack\n </Button>\n </div>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Policy Bindings */}\n {connector.defaultPolicyBindings && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Default Policy Bindings\n </CardTitle>\n <CardDescription>\n Default policies applied to all routes on this connector\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {Object.entries(connector.defaultPolicyBindings).map(([key, value]) =>\n value ? (\n <div key={key} className=\"p-3 bg-bg-sunken rounded-lg\">\n <p className=\"text-xs text-text-secondary capitalize\">\n {key.replace('PolicyId', '').replace(/([A-Z])/g, ' $1')}\n </p>\n <p className=\"font-medium text-sm truncate\">{String(value)}</p>\n </div>\n ) : null\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(connector.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(connector.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Credentials</p>\n <p className=\"font-medium\">{connector.credentialsRefId || 'Not configured'}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Tags</p>\n <div className=\"flex gap-1\">\n {connector.tags.length > 0 ? (\n connector.tags.map((tag: string) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"ChannelDetailPage.js","names":["Textarea","_Fragment","Textarea$1","CHANNEL_TYPES","VISIBILITIES","splitList","value","entry","ChannelIcon","type","Hash","Globe","MessageSquare","Radio","ChannelDetailPage","useParams","useBotlit","searchParams","setSearchParams","useSearchParams","connector","useChannelConnector","isNew","connectorId","routes","refetchRoutes","useChannelRoutes","bots","useBots","createConnector","createConnectorResult","useCreateChannelConnector","updateConnector","updateConnectorResult","useUpdateChannelConnector","deleteConnector","deleteConnectorResult","useDeleteChannelConnector","createRoute","createRouteResult","useCreateChannelRoute","slackChannelId","slackConnection","slackConnectionLoading","refetchSlackConnection","useMyUserPlatformConnection","initiateSlack","useInitiateSlackConnect","linkIntegration","linking","useLinkIntegrationConnection","toggleNotifications","togglingNotifications","useToggleSlackNotifications","revokeConnection","revoking","useRevokeSlackConnection","oauthError","setOauthError","useState","oauthLinkConsumed","useRef","integrationConnectionId","channelId","cleaned","connection","handleSlackConnect","redirectUri","handleToggleNotifications","handleRevokeSlack","isEditing","setIsEditing","showDeleteConfirm","setShowDeleteConfirm","showAddRoute","setShowAddRoute","newRoute","setNewRoute","formData","setFormData","widgetConfig","setWidgetConfig","buildWidgetMetadata","WIDGET_METADATA_KEY","handleCreate","created","toast","navigateTo","err","handleUpdate","handleDelete","isNative","nativeNotify","handleAddRoute","selectedBot","a","startEditing","toUnion","saved","readWidgetConfig","PageLayout","Button","Save","Card","CardHeader","CardTitle","CardContent","FormField","Input","Palette","loading","EmptyState","connectorRoutes","r","connectorType","savedWidgetConfig","ArrowLeft","StatusBadge","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Plus","Fragment","Edit","nativeImpact","Trash2","PagePurpose","NextSteps","Settings","X","bot","GlassCard","Badge","origin","prompt","i","CardDescription","routeMetadataString","route","ExternalLink","Slack","Loader2","CheckCircle2","Bell","BellOff","Unlink","Shield","key","formatRelativeTime","tag"],"sources":["../../../src/botlit/pages/ChannelDetailPage.tsx"],"sourcesContent":["/**\n * Channel Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { useParams, useSearchParams } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { isNative, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport {\n ArrowLeft,\n Radio,\n MessageSquare,\n Globe,\n Hash,\n Shield,\n Settings,\n Save,\n Plus,\n ExternalLink,\n Palette,\n Edit,\n Trash2,\n X,\n Slack,\n Bell,\n BellOff,\n CheckCircle2,\n Unlink,\n Loader2,\n} from 'lucide-react';\nimport { PagePurpose, NextSteps, 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 {\n useChannelConnector,\n useChannelRoutes,\n useCreateChannelConnector,\n useUpdateChannelConnector,\n useDeleteChannelConnector,\n useCreateChannelRoute,\n routeMetadataString,\n useBots,\n useMyUserPlatformConnection,\n useInitiateSlackConnect,\n useLinkIntegrationConnection,\n useToggleSlackNotifications,\n useRevokeSlackConnection,\n} from '../hooks';\nimport { readWidgetConfig, WIDGET_METADATA_KEY } from '../hooks/useChannels';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { toUnion } from '../utils/unions';\nimport type { ChannelType, Visibility } from '../types';\n\n/** Channel types the UI can render icons/labels for. */\nconst CHANNEL_TYPES: ChannelType[] = [\n 'WEB_WIDGET',\n 'SLACK',\n 'TEAMS',\n 'DISCORD',\n 'WHATSAPP',\n 'WEBHOOK',\n 'CUSTOM',\n];\n\nconst VISIBILITIES: Visibility[] = ['PRIVATE', 'WORKSPACE', 'PUBLIC'];\n\n/** Splits a comma-separated form field into a trimmed, non-empty list. */\nfunction splitList(value: string): string[] {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\nimport { toast } from 'sonner';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\ninterface ChannelDetailPageProps {\n isNew?: boolean;\n}\n\nconst ChannelIcon: FC<{ type: ChannelType }> = ({ type }) => {\n switch (type) {\n case 'SLACK':\n return <Hash size={18} />;\n case 'WEB_WIDGET':\n return <Globe size={18} />;\n case 'TEAMS':\n return <MessageSquare size={18} />;\n default:\n return <Radio size={18} />;\n }\n};\n\nexport const ChannelDetailPage: FC<ChannelDetailPageProps> = ({ isNew }) => {\n const { connectorId } = useParams();\n const { navigateTo } = useBotlit();\n const [searchParams, setSearchParams] = useSearchParams();\n const { data: connector, loading } = useChannelConnector(isNew ? undefined : connectorId);\n const { data: routes, refetch: refetchRoutes } = useChannelRoutes(connectorId);\n const { data: bots } = useBots();\n const [createConnector, createConnectorResult] = useCreateChannelConnector();\n const [updateConnector, updateConnectorResult] = useUpdateChannelConnector();\n const [deleteConnector, deleteConnectorResult] = useDeleteChannelConnector();\n const [createRoute, createRouteResult] = useCreateChannelRoute();\n\n // Phase 7: Slack personal account connect\n const slackChannelId =\n connector?.type === 'SLACK' && connector?.credentialsRefId\n ? connector.credentialsRefId\n : undefined;\n const {\n data: slackConnection,\n loading: slackConnectionLoading,\n refetch: refetchSlackConnection,\n } = useMyUserPlatformConnection(slackChannelId);\n const { initiate: initiateSlack } = useInitiateSlackConnect();\n const { link: linkIntegration, loading: linking } = useLinkIntegrationConnection();\n const { toggle: toggleNotifications, loading: togglingNotifications } =\n useToggleSlackNotifications();\n const { revoke: revokeConnection, loading: revoking } = useRevokeSlackConnection();\n const [oauthError, setOauthError] = useState<string | null>(null);\n\n // After integrations OAuth flow: link integration connection to channel\n // URL params: ?integrationConnectionId=<id>&channelId=<id>\n //\n // The ref — not an empty dependency list — is what makes this run once: the\n // params are consumed exactly once per visit, while the effect still declares\n // everything it reads.\n const oauthLinkConsumed = useRef(false);\n useEffect(() => {\n if (oauthLinkConsumed.current) return;\n\n const integrationConnectionId = searchParams.get('integrationConnectionId');\n const channelId = searchParams.get('channelId');\n if (!integrationConnectionId || !channelId) return;\n\n oauthLinkConsumed.current = true;\n\n // Clean the URL immediately so a refresh doesn't re-trigger\n const cleaned = new URLSearchParams(searchParams);\n cleaned.delete('integrationConnectionId');\n cleaned.delete('channelId');\n setSearchParams(cleaned, { replace: true });\n\n setOauthError(null);\n void linkIntegration(integrationConnectionId, channelId).then((connection) => {\n if (connection) {\n void refetchSlackConnection();\n } else {\n setOauthError('Failed to link Slack connection. Please try again.');\n }\n });\n }, [searchParams, setSearchParams, linkIntegration, refetchSlackConnection]);\n\n const handleSlackConnect = () => {\n if (!slackChannelId) return;\n // Slack appends ?code=...&state=... to the redirect_uri we supply\n const redirectUri = `${window.location.origin}${window.location.pathname}`;\n initiateSlack(slackChannelId, redirectUri);\n };\n\n const handleToggleNotifications = async () => {\n if (!slackConnection) return;\n const updated = await toggleNotifications(\n slackConnection.id,\n !slackConnection.notificationsEnabled\n );\n if (updated) {\n await refetchSlackConnection();\n }\n };\n\n const handleRevokeSlack = async () => {\n if (!slackConnection) return;\n const ok = await revokeConnection(slackConnection.id);\n if (ok) {\n await refetchSlackConnection();\n }\n };\n\n const [isEditing, setIsEditing] = useState(false);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [showAddRoute, setShowAddRoute] = useState(false);\n const [newRoute, setNewRoute] = useState({ locationId: '', locationName: '', botId: '' });\n\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n type: 'WEB_WIDGET' as ChannelType,\n visibility: 'PRIVATE' as Visibility,\n credentialsRefId: '',\n });\n\n const [widgetConfig, setWidgetConfig] = useState({\n allowedOrigins: '',\n primaryColor: '#3b82f6',\n fontFamily: 'Inter, sans-serif',\n starterPrompts: '',\n });\n\n /**\n * The connector has no widget column — the appearance settings are stored\n * under `metadata.webWidget`, which is where the detail view reads them back.\n */\n const buildWidgetMetadata = (): Record<string, unknown> | undefined => {\n if (formData.type !== 'WEB_WIDGET') return undefined;\n return {\n [WIDGET_METADATA_KEY]: {\n allowedOrigins: splitList(widgetConfig.allowedOrigins),\n primaryColor: widgetConfig.primaryColor,\n fontFamily: widgetConfig.fontFamily,\n starterPrompts: splitList(widgetConfig.starterPrompts),\n },\n };\n };\n\n const handleCreate = async () => {\n if (!formData.name) return;\n try {\n const created = await createConnector({\n name: formData.name,\n type: formData.type,\n description: formData.description || undefined,\n visibility: formData.visibility,\n credentialsRefId: formData.credentialsRefId || undefined,\n metadata: buildWidgetMetadata(),\n });\n toast.success(`Channel \"${created.name}\" created`);\n navigateTo(`channels/${created.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to create channel connector');\n }\n };\n\n const handleUpdate = async () => {\n if (!connectorId || !formData.name) return;\n try {\n await updateConnector({\n connectorId,\n input: {\n name: formData.name,\n description: formData.description || undefined,\n visibility: formData.visibility,\n credentialsRefId: formData.credentialsRefId || undefined,\n metadata: buildWidgetMetadata(),\n },\n });\n toast.success('Channel updated');\n setIsEditing(false);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update channel connector');\n }\n };\n\n const handleDelete = async () => {\n if (!connectorId) return;\n try {\n await deleteConnector(connectorId);\n if (isNative()) void nativeNotify('success');\n navigateTo('channels');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n throw err;\n }\n };\n\n const handleAddRoute = async () => {\n if (!connectorId || !newRoute.locationId || !newRoute.botId) return;\n const selectedBot = bots?.find((a: { id: string; name: string }) => a.id === newRoute.botId);\n try {\n await createRoute({\n connectorId,\n locationId: newRoute.locationId,\n appId: newRoute.botId,\n metadata: {\n locationName: newRoute.locationName || newRoute.locationId,\n appName: selectedBot?.name,\n },\n });\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to create route');\n return;\n }\n toast.success('Route created');\n void refetchRoutes();\n setNewRoute({ locationId: '', locationName: '', botId: '' });\n setShowAddRoute(false);\n };\n\n const startEditing = () => {\n if (!connector) return;\n setFormData({\n name: connector.name,\n description: connector.description || '',\n type: toUnion(connector.type, CHANNEL_TYPES, 'CUSTOM'),\n visibility: toUnion(connector.visibility, VISIBILITIES, 'PRIVATE'),\n credentialsRefId: connector.credentialsRefId || '',\n });\n const saved = readWidgetConfig(connector);\n if (saved) {\n setWidgetConfig({\n allowedOrigins: saved.allowedOrigins.join(', '),\n primaryColor: saved.primaryColor,\n fontFamily: saved.fontFamily,\n starterPrompts: saved.starterPrompts.join(', '),\n });\n }\n setIsEditing(true);\n };\n\n if (isNew) {\n return (\n <PageLayout\n title=\"Create Channel Connector\"\n description=\"Set up a new channel for your AI agents\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('channels')}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleCreate}\n isLoading={createConnectorResult.loading || updateConnectorResult.loading}\n disabled={!formData.name}\n >\n Create\n </Button>\n </div>\n }\n >\n <div className=\"max-w-2xl space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Basic Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Connector Name\" required>\n <Input\n placeholder=\"e.g., Production Web Widget\"\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 is this channel connector for?\"\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=\"Channel Type\" 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.type}\n onChange={(e) =>\n setFormData({ ...formData, type: e.target.value as ChannelType })\n }\n >\n <option value=\"WEB_WIDGET\">Web Widget</option>\n <option value=\"SLACK\">Slack</option>\n <option value=\"TEAMS\">Microsoft Teams</option>\n <option value=\"DISCORD\">Discord</option>\n <option value=\"WHATSAPP\">WhatsApp</option>\n <option value=\"WEBHOOK\">Webhook</option>\n <option value=\"CUSTOM\">Custom</option>\n </select>\n </FormField>\n\n <FormField label=\"Visibility\">\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.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n </div>\n\n {formData.type !== 'WEB_WIDGET' && (\n <FormField label=\"Credentials Reference\">\n <Input\n placeholder=\"e.g., secret-slack-token\"\n value={formData.credentialsRefId}\n onChange={(e) => setFormData({ ...formData, credentialsRefId: e.target.value })}\n />\n </FormField>\n )}\n </CardContent>\n </Card>\n\n {formData.type === 'WEB_WIDGET' && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Palette size={18} />\n Widget Configuration\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Allowed Origins\" description=\"Comma-separated list of domains\">\n <Input\n placeholder=\"e.g., https://example.com, https://app.example.com\"\n value={widgetConfig.allowedOrigins}\n onChange={(e) =>\n setWidgetConfig({ ...widgetConfig, allowedOrigins: e.target.value })\n }\n />\n </FormField>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Primary Color\">\n <div className=\"flex gap-2\">\n <input\n type=\"color\"\n value={widgetConfig.primaryColor}\n onChange={(e) =>\n setWidgetConfig({ ...widgetConfig, primaryColor: e.target.value })\n }\n className=\"h-10 w-16 rounded border border-border-default\"\n />\n <Input\n value={widgetConfig.primaryColor}\n onChange={(e) =>\n setWidgetConfig({ ...widgetConfig, primaryColor: e.target.value })\n }\n />\n </div>\n </FormField>\n\n <FormField label=\"Font Family\">\n <Input\n value={widgetConfig.fontFamily}\n onChange={(e) =>\n setWidgetConfig({ ...widgetConfig, fontFamily: e.target.value })\n }\n />\n </FormField>\n </div>\n\n <FormField label=\"Starter Prompts\" description=\"One per line\">\n <Textarea\n placeholder=\"What can you help me with?\"\n value={widgetConfig.starterPrompts}\n onChange={(e) =>\n setWidgetConfig({ ...widgetConfig, starterPrompts: e.target.value })\n }\n rows={3}\n />\n </FormField>\n </CardContent>\n </Card>\n )}\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 (!connector) {\n return (\n <PageLayout title=\"Connector Not Found\">\n <EmptyState\n illustration=\"empty-notifications\"\n title=\"Connector Not Found\"\n description=\"This channel connector doesn't exist.\"\n action={<Button onClick={() => navigateTo('channels')}>Back to Channels</Button>}\n />\n </PageLayout>\n );\n }\n\n const connectorRoutes =\n routes?.filter((r: { connectorId: string }) => r.connectorId === connector.id) || [];\n const connectorType = toUnion(connector.type, CHANNEL_TYPES, 'CUSTOM');\n const savedWidgetConfig = readWidgetConfig(connector);\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('channels')}>\n <ArrowLeft size={20} />\n </Button>\n <div className=\"p-2 rounded-lg bg-action-primary-bg/10\">\n <ChannelIcon type={connectorType} />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{connector.name}</span>\n <StatusBadge status={connector.status} />\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">{connector.description}</p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button\n variant=\"outline\"\n leftIcon={<Plus size={16} />}\n onClick={() => setShowAddRoute(true)}\n >\n Add Route\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={updateConnectorResult.loading}\n >\n Save\n </Button>\n </>\n ) : (\n <>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_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={deleteConnectorResult.loading}\n >\n Confirm\n </Button>\n </div>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_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={<Radio size={18} />}>\n This connector links BotManor to one messaging platform. From here you add routes — each\n mapping a specific location on the channel (a Slack channel, a widget, a number) to the\n bot that should answer there — tweak the connector&rsquo;s settings, and manage its\n connection. Set up at least one route so messages on this channel reach a bot.\n </PagePurpose>\n\n <NextSteps\n storageKey={`botlit-channel-${connector.id}`}\n steps={[\n {\n id: 'route',\n label: 'Add a route',\n description: 'Point an incoming location on this channel at one of your bots.',\n icon: <Plus size={16} />,\n onClick: () => setShowAddRoute(true),\n done: connectorRoutes.length > 0,\n },\n {\n id: 'edit',\n label: 'Review connector settings',\n description: 'Confirm the name, visibility and channel-specific configuration.',\n icon: <Settings size={16} />,\n onClick: startEditing,\n },\n {\n id: 'bots',\n label: 'Check your bots',\n description: 'Make sure the bot you are routing to is active and configured.',\n icon: <MessageSquare size={16} />,\n onClick: () => navigateTo('bots'),\n },\n ]}\n />\n\n {/* Add Route Modal */}\n {showAddRoute && (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle>Add Route</CardTitle>\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setShowAddRoute(false)}>\n <X size={16} />\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <FormField label=\"Location ID\" required>\n <Input\n placeholder=\"e.g., #general or channel ID\"\n value={newRoute.locationId}\n onChange={(e) => setNewRoute({ ...newRoute, locationId: e.target.value })}\n />\n </FormField>\n <FormField label=\"Location Name\">\n <Input\n placeholder=\"Friendly name (optional)\"\n value={newRoute.locationName}\n onChange={(e) => setNewRoute({ ...newRoute, locationName: e.target.value })}\n />\n </FormField>\n </div>\n <FormField label=\"Connect to Bot\" 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={newRoute.botId}\n onChange={(e) => setNewRoute({ ...newRoute, botId: e.target.value })}\n >\n <option value=\"\">Select a bot...</option>\n {bots?.map((bot: { id: string; name: string }) => (\n <option key={bot.id} value={bot.id}>\n {bot.name}\n </option>\n ))}\n </select>\n </FormField>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" onClick={() => setShowAddRoute(false)}>\n Cancel\n </Button>\n <Button\n onClick={handleAddRoute}\n isLoading={createRouteResult.loading}\n disabled={!newRoute.locationId || !newRoute.botId}\n >\n Add Route\n </Button>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Edit Form */}\n {isEditing && (\n <Card>\n <CardHeader>\n <CardTitle>Edit Channel</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <FormField label=\"Connector Name\" required>\n <Input\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n <FormField label=\"Description\">\n <Textarea\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={2}\n />\n </FormField>\n <FormField label=\"Visibility\">\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.visibility}\n onChange={(e) =>\n setFormData({ ...formData, visibility: e.target.value as Visibility })\n }\n >\n <option value=\"PRIVATE\">Private</option>\n <option value=\"WORKSPACE\">Workspace</option>\n <option value=\"PUBLIC\">Public</option>\n </select>\n </FormField>\n </CardContent>\n </Card>\n )}\n\n {/* Overview Cards */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <div className=\"p-3 rounded-full bg-action-primary-bg/10 w-fit mx-auto mb-2\">\n <ChannelIcon type={connectorType} />\n </div>\n <p className=\"text-lg font-bold capitalize\">\n {connector.type.toLowerCase().replace('_', ' ')}\n </p>\n <p className=\"text-sm text-text-secondary\">Channel Type</p>\n </CardContent>\n </Card>\n <GlassCard treatment=\"glass\" glow className=\"p-6 text-center\">\n <p className=\"text-3xl font-bold tabular-nums text-text-primary\">\n {connectorRoutes.length}\n </p>\n <p className=\"text-sm text-text-secondary\">Active Routes</p>\n </GlassCard>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary capitalize\">\n {connector.visibility.toLowerCase()}\n </p>\n <p className=\"text-sm text-text-secondary\">Visibility</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{connector.revision}</p>\n <p className=\"text-sm text-text-secondary\">Revision</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Web Widget Configuration */}\n {savedWidgetConfig && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Palette size={18} />\n Widget Configuration\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary\">Allowed Origins</p>\n {savedWidgetConfig.allowedOrigins.length > 0 ? (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {savedWidgetConfig.allowedOrigins.map((origin) => (\n <Badge key={origin} variant=\"outline\" className=\"font-mono text-xs\">\n {origin}\n </Badge>\n ))}\n </div>\n ) : (\n <p className=\"font-medium\">Any origin</p>\n )}\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Theme</p>\n <div className=\"flex items-center gap-2 mt-1\">\n <div\n className=\"w-6 h-6 rounded border border-border-subtle\"\n style={{ backgroundColor: savedWidgetConfig.primaryColor }}\n />\n <span className=\"font-mono text-sm\">{savedWidgetConfig.primaryColor}</span>\n </div>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Font Family</p>\n <p className=\"font-medium\">{savedWidgetConfig.fontFamily}</p>\n </div>\n </div>\n {savedWidgetConfig.starterPrompts.length > 0 && (\n <div className=\"mt-4 pt-4 border-t border-border-subtle\">\n <p className=\"text-sm text-text-secondary mb-2\">Starter Prompts</p>\n <div className=\"flex flex-wrap gap-2\">\n {savedWidgetConfig.starterPrompts.map((prompt, i) => (\n <Badge key={i} variant=\"secondary\">\n {prompt}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Routes */}\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <div>\n <CardTitle>Routes</CardTitle>\n <CardDescription>Routes connect this channel to your bots</CardDescription>\n </div>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n leftIcon={<Plus size={14} />}\n onClick={() => setShowAddRoute(true)}\n >\n Add Route\n </Button>\n </BotmanorPermissionGate>\n </CardHeader>\n <CardContent>\n {connectorRoutes.length > 0 ? (\n <div className=\"space-y-3\">\n {connectorRoutes.map(\n (route: {\n id: string;\n locationId: string;\n appId: string;\n revision: number;\n metadata?: Record<string, unknown> | null;\n }) => (\n <div\n key={route.id}\n className=\"flex items-center justify-between p-4 border border-border-subtle rounded-lg\"\n >\n <div className=\"flex items-center gap-4\">\n <div className=\"p-2 rounded-lg bg-bg-sunken\">\n <MessageSquare size={18} className=\"text-text-secondary\" />\n </div>\n <div>\n <p className=\"font-medium\">\n {routeMetadataString(route, 'locationName') ?? route.locationId}\n </p>\n <p className=\"text-sm text-text-secondary\">\n Connected to: {routeMetadataString(route, 'appName') ?? route.appId}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\">Rev {route.revision}</Badge>\n <Button variant=\"ghost\" size=\"sm\">\n <ExternalLink size={14} />\n </Button>\n </div>\n </div>\n )\n )}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-data\"\n title=\"No routes configured\"\n description=\"Add a route to connect this channel to a bot.\"\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => setShowAddRoute(true)}>\n Add Route\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </CardContent>\n </Card>\n\n {/* Slack Personal Account Connect (Phase 7) */}\n {connector.type === 'SLACK' && connector.credentialsRefId && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Slack size={18} />\n Your Slack Account\n </CardTitle>\n <CardDescription>\n Connect your personal Slack account to receive direct messages from this bot\n </CardDescription>\n </CardHeader>\n <CardContent>\n {/* OAuth error banner */}\n {oauthError && (\n <div className=\"mb-4 flex items-start gap-2 rounded-lg border border-status-error-border/40 bg-status-error-bg/10 px-3 py-2 text-sm text-status-error-text\">\n <span>{oauthError}</span>\n <button\n onClick={() => setOauthError(null)}\n className=\"ml-auto cursor-pointer text-status-error-text/70 hover:text-status-error-text\"\n >\n <X size={14} />\n </button>\n </div>\n )}\n\n {/* Linking integration connection */}\n {linking ? (\n <div className=\"flex items-center gap-2 py-4 text-text-secondary\">\n <Loader2 size={16} className=\"animate-spin\" />\n <span className=\"text-sm\">Linking Slack connection...</span>\n </div>\n ) : slackConnectionLoading ? (\n <div className=\"flex items-center gap-2 py-4 text-text-secondary\">\n <Loader2 size={16} className=\"animate-spin\" />\n <span className=\"text-sm\">Checking connection...</span>\n </div>\n ) : slackConnection && slackConnection.dmAllowed ? (\n <div className=\"space-y-4\">\n {/* Connected state */}\n <div className=\"flex items-center gap-3 p-3 rounded-lg bg-bg-sunken\">\n <CheckCircle2 size={20} className=\"text-green-600 shrink-0\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"font-medium text-sm\">\n {slackConnection.externalDisplayName ||\n slackConnection.externalUsername ||\n slackConnection.externalUserId}\n </p>\n {slackConnection.externalUsername && slackConnection.externalDisplayName && (\n <p className=\"text-xs text-text-secondary\">\n @{slackConnection.externalUsername}\n </p>\n )}\n {slackConnection.connectedAt && (\n <p className=\"text-xs text-text-secondary\">\n Connected {new Date(slackConnection.connectedAt).toLocaleDateString()}\n </p>\n )}\n </div>\n <div className=\"flex items-center gap-1\">\n {slackConnection.isTokenExpired && (\n <Badge\n variant=\"outline\"\n className=\"text-xs text-amber-600 border-amber-400\"\n >\n Token expired\n </Badge>\n )}\n </div>\n </div>\n\n {/* Notification toggle */}\n <div className=\"flex items-center justify-between p-3 border border-border-subtle rounded-lg\">\n <div className=\"flex items-center gap-2\">\n {slackConnection.notificationsEnabled ? (\n <Bell size={16} className=\"text-primary\" />\n ) : (\n <BellOff size={16} className=\"text-text-secondary\" />\n )}\n <div>\n <p className=\"text-sm font-medium\">DM Notifications</p>\n <p className=\"text-xs text-text-secondary\">\n {slackConnection.notificationsEnabled\n ? 'You will receive bot DMs'\n : 'DM notifications are paused'}\n </p>\n </div>\n </div>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleToggleNotifications}\n isLoading={togglingNotifications}\n >\n {slackConnection.notificationsEnabled ? 'Disable' : 'Enable'}\n </Button>\n </div>\n\n {/* Reconnect (if token expired) or Disconnect */}\n <div className=\"flex gap-2 justify-end pt-2\">\n {slackConnection.isTokenExpired && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n leftIcon={<Slack size={14} />}\n onClick={handleSlackConnect}\n >\n Reconnect\n </Button>\n )}\n <Button\n variant=\"destructive\"\n size=\"sm\"\n leftIcon={<Unlink size={14} />}\n onClick={handleRevokeSlack}\n isLoading={revoking}\n >\n Disconnect\n </Button>\n </div>\n </div>\n ) : (\n /* Not connected state */\n <div className=\"flex flex-col items-center gap-4 py-8 text-center\">\n <div className=\"p-4 rounded-full bg-bg-sunken\">\n <Slack size={32} className=\"text-text-secondary\" />\n </div>\n <div>\n <p className=\"font-medium\">No personal account connected</p>\n <p className=\"text-sm text-text-secondary mt-1\">\n Connect your Slack account so the bot can send you direct messages\n </p>\n </div>\n <Button leftIcon={<Slack size={16} />} onClick={handleSlackConnect}>\n Connect with Slack\n </Button>\n </div>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Policy Bindings */}\n {connector.defaultPolicyBindings && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Default Policy Bindings\n </CardTitle>\n <CardDescription>\n Default policies applied to all routes on this connector\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n {Object.entries(connector.defaultPolicyBindings).map(([key, value]) =>\n value ? (\n <div key={key} className=\"p-3 bg-bg-sunken rounded-lg\">\n <p className=\"text-xs text-text-secondary capitalize\">\n {key.replace('PolicyId', '').replace(/([A-Z])/g, ' $1')}\n </p>\n <p className=\"font-medium text-sm truncate\">{String(value)}</p>\n </div>\n ) : null\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(connector.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(connector.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Credentials</p>\n <p className=\"font-medium\">{connector.credentialsRefId || 'Not configured'}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Tags</p>\n <div className=\"flex gap-1\">\n {connector.tags.length > 0 ? (\n connector.tags.map((tag: string) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))\n ) : (\n <span className=\"text-text-secondary\">None</span>\n )}\n </div>\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 ChannelRoutesPage: FC;
@@ -1,37 +1,37 @@
1
1
  import { useBotlit as e } from "../providers/BotlitProvider.js";
2
2
  import { useBots as t } from "../hooks/useBots.js";
3
- import { formatRelativeTime as n } from "../utils/formatters.js";
4
- import { PageLayout as r } from "../components/PageLayout.js";
5
- import { Button as i } from "../components/Button.js";
6
- import { Card as a, CardContent as o } from "../components/Card.js";
3
+ import { PageLayout as n } from "../components/PageLayout.js";
4
+ import { Card as r, CardContent as i } from "../components/Card.js";
5
+ import { Button as a } from "../components/Button.js";
6
+ import { Input as o } from "../components/Input.js";
7
7
  import { Badge as s } from "../components/Badge.js";
8
8
  import { EmptyState as c } from "../components/EmptyState.js";
9
- import { Input as l } from "../components/Input.js";
10
- import { ErrorState as u } from "../components/ErrorState.js";
11
- import { routeMetadataString as d, useChannelConnectors as f, useChannelRoutes as p } from "../hooks/useChannels.js";
12
9
  import "../hooks/index.js";
10
+ import { ErrorState as l } from "../components/ErrorState.js";
11
+ import { routeMetadataString as u, useChannelConnectors as d, useChannelRoutes as f } from "../hooks/useChannels.js";
12
+ import { formatRelativeTime as p } from "../utils/formatters.js";
13
13
  import { useState as m } from "react";
14
14
  import { GlassCard as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
15
15
  import { jsx as _, jsxs as v } from "react/jsx-runtime";
16
16
  import { Link as y } from "react-router";
17
17
  import { AppWindow as b, ExternalLink as x, Filter as S, MessageSquare as C, Plus as w, Radio as T, Route as E, Search as D } from "lucide-react";
18
- //#region src/botlit/pages/ChannelRoutesPage.tsx
18
+ // src/botlit/pages/ChannelRoutesPage.tsx
19
19
  var O = () => {
20
- let { navigateTo: O, getPath: k } = e(), [A, j] = m(""), { data: M, loading: N, error: P, refetch: F } = p(), { data: I } = f(), { data: L } = t(), R = (e) => I?.find((t) => t.id === e)?.name || e, z = (e) => L?.find((t) => t.id === e)?.name || e, B = M.filter((e) => {
20
+ let { navigateTo: O, getPath: k } = e(), [A, j] = m(""), { data: M, loading: N, error: P, refetch: F } = f(), { data: I } = d(), { data: L } = t(), R = (e) => I?.find((t) => t.id === e)?.name || e, z = (e) => L?.find((t) => t.id === e)?.name || e, B = M.filter((e) => {
21
21
  if (!A) return !0;
22
- let t = A.toLowerCase(), n = d(e, "locationName");
22
+ let t = A.toLowerCase(), n = u(e, "locationName");
23
23
  return e.locationId.toLowerCase().includes(t) || (n?.toLowerCase().includes(t) ?? !1) || R(e.connectorId).toLowerCase().includes(t) || z(e.appId).toLowerCase().includes(t);
24
24
  });
25
- return /* @__PURE__ */ _(r, {
25
+ return /* @__PURE__ */ _(n, {
26
26
  title: "Channel Routes",
27
27
  description: "Manage connections between channels and bots",
28
28
  actions: /* @__PURE__ */ v("div", {
29
29
  className: "flex gap-2",
30
- children: [/* @__PURE__ */ _(i, {
30
+ children: [/* @__PURE__ */ _(a, {
31
31
  variant: "outline",
32
32
  onClick: () => O("channels"),
33
33
  children: "View Connectors"
34
- }), /* @__PURE__ */ _(i, {
34
+ }), /* @__PURE__ */ _(a, {
35
35
  leftIcon: /* @__PURE__ */ _(w, { size: 16 }),
36
36
  children: "Create Route"
37
37
  })]
@@ -86,13 +86,13 @@ var O = () => {
86
86
  className: "flex items-center gap-4",
87
87
  children: [/* @__PURE__ */ v("div", {
88
88
  className: "relative flex-1 max-w-md",
89
- children: [/* @__PURE__ */ _(D, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ _(l, {
89
+ children: [/* @__PURE__ */ _(D, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ _(o, {
90
90
  placeholder: "Search routes...",
91
91
  value: A,
92
92
  onChange: (e) => j(e.target.value),
93
93
  className: "pl-9"
94
94
  })]
95
- }), /* @__PURE__ */ _(i, {
95
+ }), /* @__PURE__ */ _(a, {
96
96
  variant: "outline",
97
97
  leftIcon: /* @__PURE__ */ _(S, { size: 16 }),
98
98
  children: "Filters"
@@ -106,15 +106,15 @@ var O = () => {
106
106
  3,
107
107
  4
108
108
  ].map((e) => /* @__PURE__ */ _("div", { className: "h-24 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
109
- }) : P ? /* @__PURE__ */ _(u, {
109
+ }) : P ? /* @__PURE__ */ _(l, {
110
110
  resource: "channel routes",
111
111
  error: P,
112
112
  onRetry: () => void F()
113
113
  }) : B.length > 0 ? /* @__PURE__ */ _("div", {
114
114
  className: "space-y-3",
115
- children: B.map((e) => /* @__PURE__ */ _(a, {
115
+ children: B.map((e) => /* @__PURE__ */ _(r, {
116
116
  className: "hover:shadow-md transition-shadow",
117
- children: /* @__PURE__ */ v(o, {
117
+ children: /* @__PURE__ */ v(i, {
118
118
  className: "py-4",
119
119
  children: [
120
120
  /* @__PURE__ */ v("div", {
@@ -128,7 +128,7 @@ var O = () => {
128
128
  className: "flex items-center gap-2",
129
129
  children: [/* @__PURE__ */ _("h3", {
130
130
  className: "font-medium text-text-primary",
131
- children: d(e, "locationName") ?? e.locationId
131
+ children: u(e, "locationName") ?? e.locationId
132
132
  }), /* @__PURE__ */ v(s, {
133
133
  variant: "outline",
134
134
  children: ["Rev ", e.revision]
@@ -154,19 +154,19 @@ var O = () => {
154
154
  className: "flex items-center gap-3",
155
155
  children: [/* @__PURE__ */ _("span", {
156
156
  className: "text-sm text-text-secondary",
157
- children: n(e.updatedAt)
157
+ children: p(e.updatedAt)
158
158
  }), /* @__PURE__ */ v("div", {
159
159
  className: "flex gap-2",
160
160
  children: [/* @__PURE__ */ _(y, {
161
161
  to: k(`channels/${e.connectorId}`),
162
- children: /* @__PURE__ */ _(i, {
162
+ children: /* @__PURE__ */ _(a, {
163
163
  variant: "ghost",
164
164
  size: "sm",
165
165
  children: /* @__PURE__ */ _(x, { size: 14 })
166
166
  })
167
167
  }), /* @__PURE__ */ _(y, {
168
168
  to: k(`bots/${e.appId}`),
169
- children: /* @__PURE__ */ _(i, {
169
+ children: /* @__PURE__ */ _(a, {
170
170
  variant: "ghost",
171
171
  size: "sm",
172
172
  children: "View Bot"
@@ -203,7 +203,7 @@ var O = () => {
203
203
  illustration: "empty-search",
204
204
  title: "No routes found",
205
205
  description: A ? "No routes match your search criteria." : "Create a route to connect a channel to a bot.",
206
- action: /* @__PURE__ */ _(i, {
206
+ action: /* @__PURE__ */ _(a, {
207
207
  leftIcon: /* @__PURE__ */ _(w, { size: 16 }),
208
208
  children: "Create Route"
209
209
  })
@@ -212,7 +212,6 @@ var O = () => {
212
212
  })
213
213
  });
214
214
  };
215
- //#endregion
216
215
  export { O as ChannelRoutesPage };
217
216
 
218
217
  //# sourceMappingURL=ChannelRoutesPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChannelRoutesPage.js","names":[],"sources":["../../../src/botlit/pages/ChannelRoutesPage.tsx"],"sourcesContent":["/**\n * Channel Routes Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useState } from 'react';\nimport { Link } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n Search,\n Plus,\n Route,\n MessageSquare,\n AppWindow,\n Radio,\n Filter,\n ExternalLink,\n} from 'lucide-react';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardContent } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input } from '../components/Input';\nimport { Badge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useChannelConnectors, useChannelRoutes, useBots, routeMetadataString } from '../hooks';\nimport { ErrorState } from '../components/ErrorState';\nimport { formatRelativeTime } from '../utils/formatters';\n\nexport const ChannelRoutesPage: FC = () => {\n const { navigateTo, getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const { data: routes, loading, error, refetch } = useChannelRoutes();\n const { data: connectors } = useChannelConnectors();\n const { data: bots } = useBots();\n\n const getConnectorName = (connectorId: string) =>\n connectors?.find((c: { id: string; name: string }) => c.id === connectorId)?.name ||\n connectorId;\n\n const getBotName = (botId: string) =>\n bots?.find((a: { id: string; name: string }) => a.id === botId)?.name || botId;\n\n const filteredRoutes = routes.filter((route) => {\n if (!search) return true;\n const searchLower = search.toLowerCase();\n const locationName = routeMetadataString(route, 'locationName');\n return (\n route.locationId.toLowerCase().includes(searchLower) ||\n (locationName?.toLowerCase().includes(searchLower) ?? false) ||\n getConnectorName(route.connectorId).toLowerCase().includes(searchLower) ||\n getBotName(route.appId).toLowerCase().includes(searchLower)\n );\n });\n\n return (\n <PageLayout\n title=\"Channel Routes\"\n description=\"Manage connections between channels and bots\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('channels')}>\n View Connectors\n </Button>\n <Button leftIcon={<Plus size={16} />}>Create Route</Button>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Route size={18} />}>\n A route is the rule that decides which bot answers an incoming message. It maps a specific\n location on a channel connector — a Slack channel, a website widget, a WhatsApp number —\n to one of your bots, and can attach policy bindings and routing overrides. Manage those\n mappings here so the right conversation always reaches the right bot.\n </PagePurpose>\n\n {/* Summary */}\n {routes.length > 0 ? (\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3\">\n <GlassCard treatment=\"glass\" glow className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Active routes</p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {routes.length}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Connectors used</p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {new Set(routes.map((r) => r.connectorId)).size}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"col-span-2 p-4 sm:col-span-1\">\n <p className=\"text-sm text-text-secondary\">Bots routed to</p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {new Set(routes.map((r) => r.appId)).size}\n </p>\n </GlassCard>\n </div>\n ) : null}\n\n {/* Toolbar */}\n <div className=\"flex items-center gap-4\">\n <div className=\"relative flex-1 max-w-md\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search routes...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <Button variant=\"outline\" leftIcon={<Filter size={16} />}>\n Filters\n </Button>\n </div>\n\n {/* Routes List */}\n {loading ? (\n <div className=\"space-y-3\">\n {[1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className=\"h-24 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource=\"channel routes\" error={error} onRetry={() => void refetch()} />\n ) : filteredRoutes.length > 0 ? (\n <div className=\"space-y-3\">\n {filteredRoutes.map((route) => (\n <Card key={route.id} className=\"hover:shadow-md transition-shadow\">\n <CardContent className=\"py-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <div className=\"p-3 rounded-lg bg-action-primary-bg/10\">\n <Route className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-medium text-text-primary\">\n {routeMetadataString(route, 'locationName') ?? route.locationId}\n </h3>\n <Badge variant=\"outline\">Rev {route.revision}</Badge>\n </div>\n <div className=\"flex items-center gap-4 mt-1 text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Radio size={14} />\n {getConnectorName(route.connectorId)}\n </span>\n <span className=\"flex items-center gap-1\">\n <AppWindow size={14} />\n {getBotName(route.appId)}\n </span>\n <span className=\"flex items-center gap-1\">\n <MessageSquare size={14} />\n {route.locationId}\n </span>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-text-secondary\">\n {formatRelativeTime(route.updatedAt)}\n </span>\n <div className=\"flex gap-2\">\n <Link to={getPath(`channels/${route.connectorId}`)}>\n <Button variant=\"ghost\" size=\"sm\">\n <ExternalLink size={14} />\n </Button>\n </Link>\n <Link to={getPath(`bots/${route.appId}`)}>\n <Button variant=\"ghost\" size=\"sm\">\n View Bot\n </Button>\n </Link>\n </div>\n </div>\n </div>\n\n {/* Policy Bindings */}\n {route.policyBindings && Object.values(route.policyBindings).some(Boolean) && (\n <div className=\"mt-3 pt-3 border-t border-border-subtle\">\n <p className=\"text-xs text-text-secondary mb-2\">Policy Bindings</p>\n <div className=\"flex gap-2\">\n {Object.entries(route.policyBindings).map(([key, value]) =>\n value ? (\n <Badge key={key} variant=\"secondary\" className=\"text-xs\">\n {key.replace('PolicyId', '')}\n </Badge>\n ) : null\n )}\n </div>\n </div>\n )}\n\n {/* Routing Overrides */}\n {Array.isArray(route.routingOverrides) && route.routingOverrides.length > 0 && (\n <div className=\"mt-3 pt-3 border-t border-border-subtle\">\n <p className=\"text-xs text-text-secondary mb-2\">\n {route.routingOverrides.length} routing override(s)\n </p>\n </div>\n )}\n </CardContent>\n </Card>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title=\"No routes found\"\n description={\n search\n ? 'No routes match your search criteria.'\n : 'Create a route to connect a channel to a bot.'\n }\n action={<Button leftIcon={<Plus size={16} />}>Create Route</Button>}\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"ChannelRoutesPage.js","names":["Route","Route$1","ChannelRoutesPage","useBotlit","search","setSearch","useState","routes","useChannelRoutes","connectors","useChannelConnectors","bots","useBots","getConnectorName","c","connectorId","getBotName","a","botId","filteredRoutes","searchLower","locationName","routeMetadataString","route","PageLayout","Button","navigateTo","Plus","PagePurpose","GlassCard","r","Search","Input","Filter","loading","i","error","ErrorState","refetch","Card","CardContent","Badge","Radio","AppWindow","MessageSquare","formatRelativeTime","Link","getPath","ExternalLink","key","value","EmptyState"],"sources":["../../../src/botlit/pages/ChannelRoutesPage.tsx"],"sourcesContent":["/**\n * Channel Routes Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useState } from 'react';\nimport { Link } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n Search,\n Plus,\n Route,\n MessageSquare,\n AppWindow,\n Radio,\n Filter,\n ExternalLink,\n} from 'lucide-react';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardContent } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input } from '../components/Input';\nimport { Badge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useChannelConnectors, useChannelRoutes, useBots, routeMetadataString } from '../hooks';\nimport { ErrorState } from '../components/ErrorState';\nimport { formatRelativeTime } from '../utils/formatters';\n\nexport const ChannelRoutesPage: FC = () => {\n const { navigateTo, getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const { data: routes, loading, error, refetch } = useChannelRoutes();\n const { data: connectors } = useChannelConnectors();\n const { data: bots } = useBots();\n\n const getConnectorName = (connectorId: string) =>\n connectors?.find((c: { id: string; name: string }) => c.id === connectorId)?.name ||\n connectorId;\n\n const getBotName = (botId: string) =>\n bots?.find((a: { id: string; name: string }) => a.id === botId)?.name || botId;\n\n const filteredRoutes = routes.filter((route) => {\n if (!search) return true;\n const searchLower = search.toLowerCase();\n const locationName = routeMetadataString(route, 'locationName');\n return (\n route.locationId.toLowerCase().includes(searchLower) ||\n (locationName?.toLowerCase().includes(searchLower) ?? false) ||\n getConnectorName(route.connectorId).toLowerCase().includes(searchLower) ||\n getBotName(route.appId).toLowerCase().includes(searchLower)\n );\n });\n\n return (\n <PageLayout\n title=\"Channel Routes\"\n description=\"Manage connections between channels and bots\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('channels')}>\n View Connectors\n </Button>\n <Button leftIcon={<Plus size={16} />}>Create Route</Button>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Route size={18} />}>\n A route is the rule that decides which bot answers an incoming message. It maps a specific\n location on a channel connector — a Slack channel, a website widget, a WhatsApp number —\n to one of your bots, and can attach policy bindings and routing overrides. Manage those\n mappings here so the right conversation always reaches the right bot.\n </PagePurpose>\n\n {/* Summary */}\n {routes.length > 0 ? (\n <div className=\"grid grid-cols-2 gap-4 sm:grid-cols-3\">\n <GlassCard treatment=\"glass\" glow className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Active routes</p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {routes.length}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">Connectors used</p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {new Set(routes.map((r) => r.connectorId)).size}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"col-span-2 p-4 sm:col-span-1\">\n <p className=\"text-sm text-text-secondary\">Bots routed to</p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {new Set(routes.map((r) => r.appId)).size}\n </p>\n </GlassCard>\n </div>\n ) : null}\n\n {/* Toolbar */}\n <div className=\"flex items-center gap-4\">\n <div className=\"relative flex-1 max-w-md\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search routes...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <Button variant=\"outline\" leftIcon={<Filter size={16} />}>\n Filters\n </Button>\n </div>\n\n {/* Routes List */}\n {loading ? (\n <div className=\"space-y-3\">\n {[1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className=\"h-24 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource=\"channel routes\" error={error} onRetry={() => void refetch()} />\n ) : filteredRoutes.length > 0 ? (\n <div className=\"space-y-3\">\n {filteredRoutes.map((route) => (\n <Card key={route.id} className=\"hover:shadow-md transition-shadow\">\n <CardContent className=\"py-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <div className=\"p-3 rounded-lg bg-action-primary-bg/10\">\n <Route className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-medium text-text-primary\">\n {routeMetadataString(route, 'locationName') ?? route.locationId}\n </h3>\n <Badge variant=\"outline\">Rev {route.revision}</Badge>\n </div>\n <div className=\"flex items-center gap-4 mt-1 text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Radio size={14} />\n {getConnectorName(route.connectorId)}\n </span>\n <span className=\"flex items-center gap-1\">\n <AppWindow size={14} />\n {getBotName(route.appId)}\n </span>\n <span className=\"flex items-center gap-1\">\n <MessageSquare size={14} />\n {route.locationId}\n </span>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-text-secondary\">\n {formatRelativeTime(route.updatedAt)}\n </span>\n <div className=\"flex gap-2\">\n <Link to={getPath(`channels/${route.connectorId}`)}>\n <Button variant=\"ghost\" size=\"sm\">\n <ExternalLink size={14} />\n </Button>\n </Link>\n <Link to={getPath(`bots/${route.appId}`)}>\n <Button variant=\"ghost\" size=\"sm\">\n View Bot\n </Button>\n </Link>\n </div>\n </div>\n </div>\n\n {/* Policy Bindings */}\n {route.policyBindings && Object.values(route.policyBindings).some(Boolean) && (\n <div className=\"mt-3 pt-3 border-t border-border-subtle\">\n <p className=\"text-xs text-text-secondary mb-2\">Policy Bindings</p>\n <div className=\"flex gap-2\">\n {Object.entries(route.policyBindings).map(([key, value]) =>\n value ? (\n <Badge key={key} variant=\"secondary\" className=\"text-xs\">\n {key.replace('PolicyId', '')}\n </Badge>\n ) : null\n )}\n </div>\n </div>\n )}\n\n {/* Routing Overrides */}\n {Array.isArray(route.routingOverrides) && route.routingOverrides.length > 0 && (\n <div className=\"mt-3 pt-3 border-t border-border-subtle\">\n <p className=\"text-xs text-text-secondary mb-2\">\n {route.routingOverrides.length} routing override(s)\n </p>\n </div>\n )}\n </CardContent>\n </Card>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title=\"No routes found\"\n description={\n search\n ? 'No routes match your search criteria.'\n : 'Create a route to connect a channel to a bot.'\n }\n action={<Button leftIcon={<Plus size={16} />}>Create Route</Button>}\n />\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 ChannelsPage: FC;