@burdenoff/microfe-botmanor 2026.1106.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 +40 -37
  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 +253 -0
  15. package/dist/botlit/components/AiOperationsPanel.js.map +1 -0
  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 +2 -3
  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 -13
  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 +154 -0
  90. package/dist/botlit/hooks/useAiOperations.js.map +1 -0
  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 +202 -190
  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 +165 -0
  173. package/dist/botlit/pages/AiOperationsPage.js.map +1 -0
  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 +246 -237
  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 +172 -75
  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 +6 -5
  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,24 +1,24 @@
1
- import { useTr as e } from "../../shared/hooks/useTr.js";
2
- import { useBotlit as t } from "../providers/BotlitProvider.js";
3
- import { formatRelativeTime as n } from "../utils/formatters.js";
1
+ import { useBotlit as e } from "../providers/BotlitProvider.js";
2
+ import { useTr as t } from "../../shared/hooks/useTr.js";
3
+ import { PageLayout as n } from "../components/PageLayout.js";
4
4
  import { BOTMANOR_PERMISSIONS as r } from "../permissions/botmanorPermissions.js";
5
5
  import { BotmanorPermissionGate as i } from "../permissions/useBotmanorPermissions.js";
6
- import { PageLayout as a } from "../components/PageLayout.js";
7
- import { Button as o } from "../components/Button.js";
8
- import "../permissions/index.js";
9
- import { Card as s, CardContent as c, CardDescription as l, CardHeader as u, CardTitle as d } from "../components/Card.js";
6
+ import { Card as a, CardContent as o, CardDescription as s, CardHeader as c, CardTitle as l } from "../components/Card.js";
7
+ import { Button as u } from "../components/Button.js";
8
+ import { Input as d } from "../components/Input.js";
10
9
  import { Badge as f, StatusBadge as p } from "../components/Badge.js";
11
10
  import { EmptyState as m } from "../components/EmptyState.js";
12
- import { Input as h } from "../components/Input.js";
13
- import { ErrorState as g } from "../components/ErrorState.js";
14
- import { routeMetadataString as _, useChannelConnectors as v, useChannelRoutes as y } from "../hooks/useChannels.js";
11
+ import { ErrorState as h } from "../components/ErrorState.js";
15
12
  import "../hooks/index.js";
13
+ import { formatRelativeTime as g } from "../utils/formatters.js";
14
+ import { routeMetadataString as _, useChannelConnectors as v, useChannelRoutes as y } from "../hooks/useChannels.js";
15
+ import "../permissions/index.js";
16
16
  import { useMemo as b, useState as x } from "react";
17
17
  import { GlassCard as S, PagePurpose as C } from "@burdenoff/fe-libs/ui";
18
18
  import { Fragment as w, jsx as T, jsxs as E } from "react/jsx-runtime";
19
19
  import { Link as D } from "react-router";
20
20
  import { ArrowRight as O, Filter as k, Globe as A, Hash as j, MessageSquare as M, Plus as N, Search as P, Settings as F, Slack as I, Webhook as L } from "lucide-react";
21
- //#region src/botlit/pages/ChannelsPage.tsx
21
+ // src/botlit/pages/ChannelsPage.tsx
22
22
  var R = ({ type: e, className: t }) => {
23
23
  switch (e) {
24
24
  case "SLACK": return /* @__PURE__ */ T(I, { className: t });
@@ -29,17 +29,17 @@ var R = ({ type: e, className: t }) => {
29
29
  default: return /* @__PURE__ */ T(M, { className: t });
30
30
  }
31
31
  }, z = () => {
32
- let A = e(), { getPath: j } = t(), [I, L] = x(""), [z, B] = x("connectors"), { data: V, loading: H, error: U, refetch: W } = v(b(() => ({ search: I }), [I])), { data: G, loading: K, error: q, refetch: J } = y(), Y = b(() => {
32
+ let A = t(), { getPath: j } = e(), [I, L] = x(""), [z, B] = x("connectors"), V = b(() => ({ search: I }), [I]), { data: H, loading: U, error: W, refetch: G } = v(V), { data: K, loading: q, error: J, refetch: Y } = y(), X = b(() => {
33
33
  let e = /* @__PURE__ */ new Map();
34
- for (let t of G) e.set(t.connectorId, (e.get(t.connectorId) ?? 0) + 1);
34
+ for (let t of K) e.set(t.connectorId, (e.get(t.connectorId) ?? 0) + 1);
35
35
  return e;
36
- }, [G]);
37
- return /* @__PURE__ */ T(a, {
36
+ }, [K]);
37
+ return /* @__PURE__ */ T(n, {
38
38
  title: A("botlit.channels.title", "Channels"),
39
39
  description: A("botlit.channels.description", "Connect agents to messaging platforms and configure routing"),
40
40
  actions: /* @__PURE__ */ E("div", {
41
41
  className: "flex gap-2",
42
- children: [/* @__PURE__ */ T(o, {
42
+ children: [/* @__PURE__ */ T(u, {
43
43
  variant: "outline",
44
44
  children: /* @__PURE__ */ T(D, {
45
45
  to: j("channels/routes"),
@@ -47,7 +47,7 @@ var R = ({ type: e, className: t }) => {
47
47
  })
48
48
  }), /* @__PURE__ */ T(i, {
49
49
  permission: r.CHANNEL_CREATE,
50
- children: /* @__PURE__ */ T(o, {
50
+ children: /* @__PURE__ */ T(u, {
51
51
  leftIcon: /* @__PURE__ */ T(N, { size: 16 }),
52
52
  children: /* @__PURE__ */ T(D, {
53
53
  to: j("channels/new"),
@@ -71,7 +71,7 @@ var R = ({ type: e, className: t }) => {
71
71
  children: [
72
72
  A("botlit.channels.tabs.connectors", "Connectors"),
73
73
  " (",
74
- V.length,
74
+ H.length,
75
75
  ")"
76
76
  ]
77
77
  }), /* @__PURE__ */ E("button", {
@@ -80,7 +80,7 @@ var R = ({ type: e, className: t }) => {
80
80
  children: [
81
81
  A("botlit.channels.tabs.routes", "Routes"),
82
82
  " (",
83
- G.length,
83
+ K.length,
84
84
  ")"
85
85
  ]
86
86
  })]
@@ -89,36 +89,36 @@ var R = ({ type: e, className: t }) => {
89
89
  className: "flex items-center gap-4",
90
90
  children: [/* @__PURE__ */ E("div", {
91
91
  className: "relative flex-1 max-w-md",
92
- children: [/* @__PURE__ */ T(P, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ T(h, {
92
+ children: [/* @__PURE__ */ T(P, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ T(d, {
93
93
  placeholder: A("botlit.channels.searchPlaceholder", "Search {{tab}}...", { tab: z }),
94
94
  value: I,
95
95
  onChange: (e) => L(e.target.value),
96
96
  className: "pl-9"
97
97
  })]
98
- }), /* @__PURE__ */ T(o, {
98
+ }), /* @__PURE__ */ T(u, {
99
99
  variant: "outline",
100
100
  leftIcon: /* @__PURE__ */ T(k, { size: 16 }),
101
101
  children: A("botlit.channels.filters.filters", "Filters")
102
102
  })]
103
103
  }),
104
- z === "connectors" && /* @__PURE__ */ T(w, { children: H ? /* @__PURE__ */ T("div", {
104
+ z === "connectors" && /* @__PURE__ */ T(w, { children: U ? /* @__PURE__ */ T("div", {
105
105
  className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
106
106
  children: [
107
107
  1,
108
108
  2,
109
109
  3
110
110
  ].map((e) => /* @__PURE__ */ T("div", { className: "h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
111
- }) : U ? /* @__PURE__ */ T(g, {
111
+ }) : W ? /* @__PURE__ */ T(h, {
112
112
  resource: "channel connectors",
113
- error: U,
114
- onRetry: () => void W()
115
- }) : V.length > 0 ? /* @__PURE__ */ T("div", {
113
+ error: W,
114
+ onRetry: () => void G()
115
+ }) : H.length > 0 ? /* @__PURE__ */ T("div", {
116
116
  className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
117
- children: V.map((e) => /* @__PURE__ */ T(D, {
117
+ children: H.map((e) => /* @__PURE__ */ T(D, {
118
118
  to: j(`channels/${e.id}`),
119
- children: /* @__PURE__ */ E(s, {
119
+ children: /* @__PURE__ */ E(a, {
120
120
  className: "h-full hover:border-primary/50 transition-colors cursor-pointer",
121
- children: [/* @__PURE__ */ T(u, { children: /* @__PURE__ */ E("div", {
121
+ children: [/* @__PURE__ */ T(c, { children: /* @__PURE__ */ E("div", {
122
122
  className: "flex items-start justify-between",
123
123
  children: [/* @__PURE__ */ E("div", {
124
124
  className: "flex items-center gap-3",
@@ -128,15 +128,15 @@ var R = ({ type: e, className: t }) => {
128
128
  type: e.type,
129
129
  className: "h-5 w-5 text-primary"
130
130
  })
131
- }), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T(d, {
131
+ }), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T(l, {
132
132
  className: "text-base",
133
133
  children: e.name
134
- }), /* @__PURE__ */ T(l, {
134
+ }), /* @__PURE__ */ T(s, {
135
135
  className: "text-xs",
136
136
  children: e.description
137
137
  })] })]
138
138
  }), /* @__PURE__ */ T(p, { status: e.status })]
139
- }) }), /* @__PURE__ */ T(c, { children: /* @__PURE__ */ E("div", {
139
+ }) }), /* @__PURE__ */ T(o, { children: /* @__PURE__ */ E("div", {
140
140
  className: "space-y-3",
141
141
  children: [
142
142
  /* @__PURE__ */ E("div", {
@@ -157,7 +157,7 @@ var R = ({ type: e, className: t }) => {
157
157
  children: A("botlit.channels.list.activeRoutes", "Active Routes")
158
158
  }), /* @__PURE__ */ T(f, {
159
159
  variant: "secondary",
160
- children: Y.get(e.id) ?? 0
160
+ children: X.get(e.id) ?? 0
161
161
  })]
162
162
  }),
163
163
  /* @__PURE__ */ E("div", {
@@ -165,7 +165,7 @@ var R = ({ type: e, className: t }) => {
165
165
  children: [
166
166
  A("botlit.botsList.createdLabel", "Created"),
167
167
  " ",
168
- n(e.createdAt)
168
+ g(e.createdAt)
169
169
  ]
170
170
  })
171
171
  ]
@@ -178,7 +178,7 @@ var R = ({ type: e, className: t }) => {
178
178
  description: A("botlit.channels.empty.connectors.description", "Connect messaging platforms to deploy agents across multiple channels."),
179
179
  action: /* @__PURE__ */ T(i, {
180
180
  permission: r.CHANNEL_CREATE,
181
- children: /* @__PURE__ */ T(o, {
181
+ children: /* @__PURE__ */ T(u, {
182
182
  leftIcon: /* @__PURE__ */ T(N, { size: 16 }),
183
183
  children: /* @__PURE__ */ T(D, {
184
184
  to: j("channels/new"),
@@ -187,20 +187,20 @@ var R = ({ type: e, className: t }) => {
187
187
  })
188
188
  })
189
189
  }) }),
190
- z === "routes" && /* @__PURE__ */ T(w, { children: K ? /* @__PURE__ */ T("div", {
190
+ z === "routes" && /* @__PURE__ */ T(w, { children: q ? /* @__PURE__ */ T("div", {
191
191
  className: "space-y-4",
192
192
  children: [
193
193
  1,
194
194
  2,
195
195
  3
196
196
  ].map((e) => /* @__PURE__ */ T("div", { className: "h-20 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
197
- }) : q ? /* @__PURE__ */ T(g, {
197
+ }) : J ? /* @__PURE__ */ T(h, {
198
198
  resource: "channel routes",
199
- error: q,
200
- onRetry: () => void J()
201
- }) : G.length > 0 ? /* @__PURE__ */ T("div", {
199
+ error: J,
200
+ onRetry: () => void Y()
201
+ }) : K.length > 0 ? /* @__PURE__ */ T("div", {
202
202
  className: "space-y-4",
203
- children: G.map((e) => /* @__PURE__ */ T(s, { children: /* @__PURE__ */ T(c, {
203
+ children: K.map((e) => /* @__PURE__ */ T(a, { children: /* @__PURE__ */ T(o, {
204
204
  className: "py-4",
205
205
  children: /* @__PURE__ */ E("div", {
206
206
  className: "flex items-center justify-between",
@@ -227,10 +227,10 @@ var R = ({ type: e, className: t }) => {
227
227
  className: "flex items-center gap-2",
228
228
  children: [/* @__PURE__ */ T("span", {
229
229
  className: "text-xs text-text-secondary",
230
- children: n(e.createdAt)
230
+ children: g(e.createdAt)
231
231
  }), /* @__PURE__ */ T(i, {
232
232
  permission: r.CHANNEL_UPDATE,
233
- children: /* @__PURE__ */ T(o, {
233
+ children: /* @__PURE__ */ T(u, {
234
234
  variant: "ghost",
235
235
  size: "icon",
236
236
  children: /* @__PURE__ */ T(F, { size: 16 })
@@ -245,7 +245,7 @@ var R = ({ type: e, className: t }) => {
245
245
  description: A("botlit.channels.empty.routes.description", "Create routes to connect channel locations to specific bots."),
246
246
  action: /* @__PURE__ */ T(i, {
247
247
  permission: r.CHANNEL_CREATE,
248
- children: /* @__PURE__ */ T(o, {
248
+ children: /* @__PURE__ */ T(u, {
249
249
  leftIcon: /* @__PURE__ */ T(N, { size: 16 }),
250
250
  children: A("botlit.channels.actions.createRoute", "Create Route")
251
251
  })
@@ -320,7 +320,6 @@ var R = ({ type: e, className: t }) => {
320
320
  })
321
321
  });
322
322
  };
323
- //#endregion
324
323
  export { z as ChannelsPage };
325
324
 
326
325
  //# sourceMappingURL=ChannelsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChannelsPage.js","names":[],"sources":["../../../src/botlit/pages/ChannelsPage.tsx"],"sourcesContent":["/**\n * Channels Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { Link } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n Plus,\n Search as SearchIcon,\n Filter,\n MessageSquare,\n Globe,\n Slack,\n Hash,\n Webhook,\n ArrowRight,\n Settings,\n} from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input } from '../components/Input';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport {\n useChannelConnectors,\n useChannelRoutes,\n routeMetadataString,\n type ChannelConnectorRecord,\n type ChannelRouteRecord,\n} from '../hooks';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport type { ChannelType } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nconst ChannelIcon: FC<{ type: string; className?: string }> = ({ type, className }) => {\n switch (type) {\n case 'SLACK':\n return <Slack className={className} />;\n case 'DISCORD':\n return <Hash className={className} />;\n case 'TEAMS':\n return <MessageSquare className={className} />;\n case 'WEB_WIDGET':\n return <Globe className={className} />;\n case 'WEBHOOK':\n return <Webhook className={className} />;\n default:\n return <MessageSquare className={className} />;\n }\n};\n\nexport const ChannelsPage: FC = () => {\n const t = useTr();\n const { getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const [activeTab, setActiveTab] = useState<'connectors' | 'routes'>('connectors');\n const connectorFilter = useMemo(() => ({ search }), [search]);\n const {\n data: connectors,\n loading: loadingConnectors,\n error: connectorsError,\n refetch: refetchConnectors,\n } = useChannelConnectors(connectorFilter);\n const {\n data: routes,\n loading: loadingRoutes,\n error: routesError,\n refetch: refetchRoutes,\n } = useChannelRoutes();\n\n // Routes are keyed by connector, so the per-connector count is derived here\n // rather than assuming a field the service does not return.\n const routeCountByConnector = useMemo(() => {\n const counts = new Map<string, number>();\n for (const route of routes) {\n counts.set(route.connectorId, (counts.get(route.connectorId) ?? 0) + 1);\n }\n return counts;\n }, [routes]);\n\n return (\n <PageLayout\n title={t('botlit.channels.title', 'Channels')}\n description={t(\n 'botlit.channels.description',\n 'Connect agents to messaging platforms and configure routing'\n )}\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\">\n <Link to={getPath('channels/routes')}>\n {t('botlit.channels.actions.viewRoutes', 'View Routes')}\n </Link>\n </Button>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button leftIcon={<Plus size={16} />}>\n <Link to={getPath('channels/new')}>\n {t('botlit.channels.actions.addChannel', 'Add Channel')}\n </Link>\n </Button>\n </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<MessageSquare size={18} />}>\n {t(\n 'botlit.channels.purpose',\n 'Channels are where your bots actually talk to people. Connect a messaging platform — a website chat widget, Slack, Microsoft Teams, Discord, WhatsApp or a custom webhook — then add a route that points an incoming location at the bot that should answer. Use this page to manage those connectors and routing rules in one place.'\n )}\n </PagePurpose>\n\n {/* Tabs */}\n <div className=\"flex gap-1 border-b border-border-subtle\">\n <button\n onClick={() => setActiveTab('connectors')}\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\n activeTab === 'connectors'\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n }`}\n >\n {t('botlit.channels.tabs.connectors', 'Connectors')} ({connectors.length})\n </button>\n <button\n onClick={() => setActiveTab('routes')}\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\n activeTab === 'routes'\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n }`}\n >\n {t('botlit.channels.tabs.routes', 'Routes')} ({routes.length})\n </button>\n </div>\n\n {/* Search */}\n <div className=\"flex items-center gap-4\">\n <div className=\"relative flex-1 max-w-md\">\n <SearchIcon className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder={t('botlit.channels.searchPlaceholder', 'Search {{tab}}...', {\n tab: activeTab,\n })}\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 {t('botlit.channels.filters.filters', 'Filters')}\n </Button>\n </div>\n\n {/* Connectors Tab */}\n {activeTab === 'connectors' && (\n <>\n {loadingConnectors ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : connectorsError ? (\n <ErrorState\n resource=\"channel connectors\"\n error={connectorsError}\n onRetry={() => void refetchConnectors()}\n />\n ) : connectors.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {connectors.map((connector: ChannelConnectorRecord) => (\n <Link key={connector.id} to={getPath(`channels/${connector.id}`)}>\n <Card className=\"h-full hover:border-primary/50 transition-colors cursor-pointer\">\n <CardHeader>\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2 bg-action-primary-bg/10 rounded-lg\">\n <ChannelIcon type={connector.type} className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <CardTitle className=\"text-base\">{connector.name}</CardTitle>\n <CardDescription className=\"text-xs\">\n {connector.description}\n </CardDescription>\n </div>\n </div>\n <StatusBadge status={connector.status} />\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {/* Type */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">\n {t('botlit.channels.list.type', 'Type')}\n </span>\n <Badge variant=\"outline\" className=\"capitalize\">\n {connector.type.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n\n {/* Routes */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">\n {t('botlit.channels.list.activeRoutes', 'Active Routes')}\n </span>\n <Badge variant=\"secondary\">\n {routeCountByConnector.get(connector.id) ?? 0}\n </Badge>\n </div>\n\n {/* Footer */}\n <div className=\"pt-3 border-t border-border-subtle text-xs text-text-secondary\">\n {t('botlit.botsList.createdLabel', 'Created')}{' '}\n {formatRelativeTime(connector.createdAt)}\n </div>\n </div>\n </CardContent>\n </Card>\n </Link>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-notifications\"\n title={t('botlit.channels.empty.connectors.title', 'No channel connectors')}\n description={t(\n 'botlit.channels.empty.connectors.description',\n 'Connect messaging platforms to deploy agents across multiple channels.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button leftIcon={<Plus size={16} />}>\n <Link to={getPath('channels/new')}>\n {t('botlit.channels.actions.addChannel', 'Add Channel')}\n </Link>\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </>\n )}\n\n {/* Routes Tab */}\n {activeTab === 'routes' && (\n <>\n {loadingRoutes ? (\n <div className=\"space-y-4\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-20 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : routesError ? (\n <ErrorState\n resource=\"channel routes\"\n error={routesError}\n onRetry={() => void refetchRoutes()}\n />\n ) : routes.length > 0 ? (\n <div className=\"space-y-4\">\n {routes.map((route: ChannelRouteRecord) => (\n <Card key={route.id}>\n <CardContent className=\"py-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2 text-sm\">\n <Badge variant=\"outline\">\n {routeMetadataString(route, 'locationName') ?? route.locationId}\n </Badge>\n <ArrowRight size={16} className=\"text-text-secondary\" />\n <Badge variant=\"secondary\">\n {routeMetadataString(route, 'appName') ??\n route.appId ??\n MISSING_VALUE}\n </Badge>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary\">\n {formatRelativeTime(route.createdAt)}\n </span>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_UPDATE}>\n <Button variant=\"ghost\" size=\"icon\">\n <Settings size={16} />\n </Button>\n </BotmanorPermissionGate>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title={t('botlit.channels.empty.routes.title', 'No routes configured')}\n description={t(\n 'botlit.channels.empty.routes.description',\n 'Create routes to connect channel locations to specific bots.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button leftIcon={<Plus size={16} />}>\n {t('botlit.channels.actions.createRoute', 'Create Route')}\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </>\n )}\n\n {/* Available Integrations */}\n <GlassCard treatment=\"glass\" glow className=\"p-6\">\n <div className=\"mb-4\">\n <h2 className=\"text-lg font-semibold tracking-tight text-text-primary\">\n {t('botlit.channels.integrations.title', 'Available Integrations')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {t(\n 'botlit.channels.integrations.description',\n 'Connect to popular messaging platforms'\n )}\n </p>\n </div>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4\">\n {[\n {\n type: 'WEB_WIDGET' as ChannelType,\n name: t('botlit.channels.integrations.webWidget', 'Web Widget'),\n desc: t('botlit.channels.integrations.webWidgetDesc', 'Embed on websites'),\n },\n {\n type: 'SLACK' as ChannelType,\n name: t('botlit.channels.integrations.slack', 'Slack'),\n desc: t('botlit.channels.integrations.slackDesc', 'Workspace integration'),\n },\n {\n type: 'TEAMS' as ChannelType,\n name: t('botlit.channels.integrations.teams', 'MS Teams'),\n desc: t('botlit.channels.integrations.teamsDesc', 'Teams app'),\n },\n {\n type: 'DISCORD' as ChannelType,\n name: t('botlit.channels.integrations.discord', 'Discord'),\n desc: t('botlit.channels.integrations.discordDesc', 'Bot integration'),\n },\n {\n type: 'WHATSAPP' as ChannelType,\n name: t('botlit.channels.integrations.whatsapp', 'WhatsApp'),\n desc: t('botlit.channels.integrations.whatsappDesc', 'Business API'),\n },\n {\n type: 'WEBHOOK' as ChannelType,\n name: t('botlit.channels.integrations.webhook', 'Webhook'),\n desc: t('botlit.channels.integrations.webhookDesc', 'Custom integration'),\n },\n ].map((integration) => (\n <button\n key={integration.type}\n className=\"p-4 text-center border border-border-subtle rounded-lg hover:bg-accent transition-colors\"\n >\n <ChannelIcon\n type={integration.type}\n className=\"h-8 w-8 mx-auto text-text-secondary\"\n />\n <p className=\"mt-2 font-medium text-sm\">{integration.name}</p>\n <p className=\"text-xs text-text-secondary\">{integration.desc}</p>\n </button>\n ))}\n </div>\n </GlassCard>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"ChannelsPage.js","names":["SearchIcon","_Fragment","ChannelIcon","type","Slack","Hash","MessageSquare","Globe","Webhook","ChannelsPage","t","useTr","useBotlit","search","setSearch","useState","activeTab","setActiveTab","connectorFilter","useMemo","connectors","loadingConnectors","connectorsError","refetchConnectors","useChannelConnectors","routes","loadingRoutes","routesError","refetchRoutes","useChannelRoutes","routeCountByConnector","counts","route","PageLayout","Button","Link","getPath","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Plus","PagePurpose","Search","Input","Filter","Fragment","i","ErrorState","connector","Card","CardHeader","CardTitle","CardDescription","StatusBadge","CardContent","Badge","formatRelativeTime","EmptyState","routeMetadataString","ArrowRight","Settings","GlassCard","integration"],"sources":["../../../src/botlit/pages/ChannelsPage.tsx"],"sourcesContent":["/**\n * Channels Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { Link } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n Plus,\n Search as SearchIcon,\n Filter,\n MessageSquare,\n Globe,\n Slack,\n Hash,\n Webhook,\n ArrowRight,\n Settings,\n} from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input } from '../components/Input';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport {\n useChannelConnectors,\n useChannelRoutes,\n routeMetadataString,\n type ChannelConnectorRecord,\n type ChannelRouteRecord,\n} from '../hooks';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport type { ChannelType } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nconst ChannelIcon: FC<{ type: string; className?: string }> = ({ type, className }) => {\n switch (type) {\n case 'SLACK':\n return <Slack className={className} />;\n case 'DISCORD':\n return <Hash className={className} />;\n case 'TEAMS':\n return <MessageSquare className={className} />;\n case 'WEB_WIDGET':\n return <Globe className={className} />;\n case 'WEBHOOK':\n return <Webhook className={className} />;\n default:\n return <MessageSquare className={className} />;\n }\n};\n\nexport const ChannelsPage: FC = () => {\n const t = useTr();\n const { getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const [activeTab, setActiveTab] = useState<'connectors' | 'routes'>('connectors');\n const connectorFilter = useMemo(() => ({ search }), [search]);\n const {\n data: connectors,\n loading: loadingConnectors,\n error: connectorsError,\n refetch: refetchConnectors,\n } = useChannelConnectors(connectorFilter);\n const {\n data: routes,\n loading: loadingRoutes,\n error: routesError,\n refetch: refetchRoutes,\n } = useChannelRoutes();\n\n // Routes are keyed by connector, so the per-connector count is derived here\n // rather than assuming a field the service does not return.\n const routeCountByConnector = useMemo(() => {\n const counts = new Map<string, number>();\n for (const route of routes) {\n counts.set(route.connectorId, (counts.get(route.connectorId) ?? 0) + 1);\n }\n return counts;\n }, [routes]);\n\n return (\n <PageLayout\n title={t('botlit.channels.title', 'Channels')}\n description={t(\n 'botlit.channels.description',\n 'Connect agents to messaging platforms and configure routing'\n )}\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\">\n <Link to={getPath('channels/routes')}>\n {t('botlit.channels.actions.viewRoutes', 'View Routes')}\n </Link>\n </Button>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button leftIcon={<Plus size={16} />}>\n <Link to={getPath('channels/new')}>\n {t('botlit.channels.actions.addChannel', 'Add Channel')}\n </Link>\n </Button>\n </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<MessageSquare size={18} />}>\n {t(\n 'botlit.channels.purpose',\n 'Channels are where your bots actually talk to people. Connect a messaging platform — a website chat widget, Slack, Microsoft Teams, Discord, WhatsApp or a custom webhook — then add a route that points an incoming location at the bot that should answer. Use this page to manage those connectors and routing rules in one place.'\n )}\n </PagePurpose>\n\n {/* Tabs */}\n <div className=\"flex gap-1 border-b border-border-subtle\">\n <button\n onClick={() => setActiveTab('connectors')}\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\n activeTab === 'connectors'\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n }`}\n >\n {t('botlit.channels.tabs.connectors', 'Connectors')} ({connectors.length})\n </button>\n <button\n onClick={() => setActiveTab('routes')}\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\n activeTab === 'routes'\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n }`}\n >\n {t('botlit.channels.tabs.routes', 'Routes')} ({routes.length})\n </button>\n </div>\n\n {/* Search */}\n <div className=\"flex items-center gap-4\">\n <div className=\"relative flex-1 max-w-md\">\n <SearchIcon className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder={t('botlit.channels.searchPlaceholder', 'Search {{tab}}...', {\n tab: activeTab,\n })}\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 {t('botlit.channels.filters.filters', 'Filters')}\n </Button>\n </div>\n\n {/* Connectors Tab */}\n {activeTab === 'connectors' && (\n <>\n {loadingConnectors ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : connectorsError ? (\n <ErrorState\n resource=\"channel connectors\"\n error={connectorsError}\n onRetry={() => void refetchConnectors()}\n />\n ) : connectors.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {connectors.map((connector: ChannelConnectorRecord) => (\n <Link key={connector.id} to={getPath(`channels/${connector.id}`)}>\n <Card className=\"h-full hover:border-primary/50 transition-colors cursor-pointer\">\n <CardHeader>\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2 bg-action-primary-bg/10 rounded-lg\">\n <ChannelIcon type={connector.type} className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <CardTitle className=\"text-base\">{connector.name}</CardTitle>\n <CardDescription className=\"text-xs\">\n {connector.description}\n </CardDescription>\n </div>\n </div>\n <StatusBadge status={connector.status} />\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {/* Type */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">\n {t('botlit.channels.list.type', 'Type')}\n </span>\n <Badge variant=\"outline\" className=\"capitalize\">\n {connector.type.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n\n {/* Routes */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">\n {t('botlit.channels.list.activeRoutes', 'Active Routes')}\n </span>\n <Badge variant=\"secondary\">\n {routeCountByConnector.get(connector.id) ?? 0}\n </Badge>\n </div>\n\n {/* Footer */}\n <div className=\"pt-3 border-t border-border-subtle text-xs text-text-secondary\">\n {t('botlit.botsList.createdLabel', 'Created')}{' '}\n {formatRelativeTime(connector.createdAt)}\n </div>\n </div>\n </CardContent>\n </Card>\n </Link>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-notifications\"\n title={t('botlit.channels.empty.connectors.title', 'No channel connectors')}\n description={t(\n 'botlit.channels.empty.connectors.description',\n 'Connect messaging platforms to deploy agents across multiple channels.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button leftIcon={<Plus size={16} />}>\n <Link to={getPath('channels/new')}>\n {t('botlit.channels.actions.addChannel', 'Add Channel')}\n </Link>\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </>\n )}\n\n {/* Routes Tab */}\n {activeTab === 'routes' && (\n <>\n {loadingRoutes ? (\n <div className=\"space-y-4\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-20 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : routesError ? (\n <ErrorState\n resource=\"channel routes\"\n error={routesError}\n onRetry={() => void refetchRoutes()}\n />\n ) : routes.length > 0 ? (\n <div className=\"space-y-4\">\n {routes.map((route: ChannelRouteRecord) => (\n <Card key={route.id}>\n <CardContent className=\"py-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2 text-sm\">\n <Badge variant=\"outline\">\n {routeMetadataString(route, 'locationName') ?? route.locationId}\n </Badge>\n <ArrowRight size={16} className=\"text-text-secondary\" />\n <Badge variant=\"secondary\">\n {routeMetadataString(route, 'appName') ??\n route.appId ??\n MISSING_VALUE}\n </Badge>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary\">\n {formatRelativeTime(route.createdAt)}\n </span>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_UPDATE}>\n <Button variant=\"ghost\" size=\"icon\">\n <Settings size={16} />\n </Button>\n </BotmanorPermissionGate>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title={t('botlit.channels.empty.routes.title', 'No routes configured')}\n description={t(\n 'botlit.channels.empty.routes.description',\n 'Create routes to connect channel locations to specific bots.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button leftIcon={<Plus size={16} />}>\n {t('botlit.channels.actions.createRoute', 'Create Route')}\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </>\n )}\n\n {/* Available Integrations */}\n <GlassCard treatment=\"glass\" glow className=\"p-6\">\n <div className=\"mb-4\">\n <h2 className=\"text-lg font-semibold tracking-tight text-text-primary\">\n {t('botlit.channels.integrations.title', 'Available Integrations')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {t(\n 'botlit.channels.integrations.description',\n 'Connect to popular messaging platforms'\n )}\n </p>\n </div>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4\">\n {[\n {\n type: 'WEB_WIDGET' as ChannelType,\n name: t('botlit.channels.integrations.webWidget', 'Web Widget'),\n desc: t('botlit.channels.integrations.webWidgetDesc', 'Embed on websites'),\n },\n {\n type: 'SLACK' as ChannelType,\n name: t('botlit.channels.integrations.slack', 'Slack'),\n desc: t('botlit.channels.integrations.slackDesc', 'Workspace integration'),\n },\n {\n type: 'TEAMS' as ChannelType,\n name: t('botlit.channels.integrations.teams', 'MS Teams'),\n desc: t('botlit.channels.integrations.teamsDesc', 'Teams app'),\n },\n {\n type: 'DISCORD' as ChannelType,\n name: t('botlit.channels.integrations.discord', 'Discord'),\n desc: t('botlit.channels.integrations.discordDesc', 'Bot integration'),\n },\n {\n type: 'WHATSAPP' as ChannelType,\n name: t('botlit.channels.integrations.whatsapp', 'WhatsApp'),\n desc: t('botlit.channels.integrations.whatsappDesc', 'Business API'),\n },\n {\n type: 'WEBHOOK' as ChannelType,\n name: t('botlit.channels.integrations.webhook', 'Webhook'),\n desc: t('botlit.channels.integrations.webhookDesc', 'Custom integration'),\n },\n ].map((integration) => (\n <button\n key={integration.type}\n className=\"p-4 text-center border border-border-subtle rounded-lg hover:bg-accent transition-colors\"\n >\n <ChannelIcon\n type={integration.type}\n className=\"h-8 w-8 mx-auto text-text-secondary\"\n />\n <p className=\"mt-2 font-medium text-sm\">{integration.name}</p>\n <p className=\"text-xs text-text-secondary\">{integration.desc}</p>\n </button>\n ))}\n </div>\n </GlassCard>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function ChatPage(): import('react').JSX.Element;
@@ -1,19 +1,19 @@
1
- import { useBotlit as e } from "../providers/BotlitProvider.js";
2
- import { useAgents as t } from "../hooks/useAgents.js";
3
- import { PageLayout as n } from "../components/PageLayout.js";
4
- import { Button as r } from "../components/Button.js";
1
+ import { PageLayout as e } from "../components/PageLayout.js";
2
+ import { Button as t } from "../components/Button.js";
3
+ import { useAgents as n } from "../hooks/useAgents.js";
4
+ import { useBotlit as r } from "../providers/BotlitProvider.js";
5
5
  import { useState as i } from "react";
6
6
  import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
7
7
  import { useParams as c } from "react-router";
8
8
  import { WorkflowAssistantPanel as l } from "@burdenoff/fe-libs/shared/assistant";
9
- //#region src/botlit/pages/ChatPage.tsx
9
+ // src/botlit/pages/ChatPage.tsx
10
10
  function u() {
11
- let { workspaceId: t, currentUser: n } = e();
12
- return /* @__PURE__ */ o(d, {}, `${t}:${n?.id}`);
11
+ let { workspaceId: e, currentUser: t } = r();
12
+ return /* @__PURE__ */ o(d, {}, `${e}:${t?.id}`);
13
13
  }
14
14
  function d() {
15
- let { agentId: u } = c(), { currentUser: d, workspaceId: f, authToken: p } = e(), m = t(), [h, g] = i(""), _ = u ?? h, v = m.data?.find((e) => e.id === _ && e.status === "ACTIVE");
16
- return /* @__PURE__ */ o(n, {
15
+ let { agentId: u } = c(), { currentUser: d, workspaceId: f, authToken: p } = r(), m = n(), [h, g] = i(""), _ = u ?? h, v = m.data?.find((e) => e.id === _ && e.status === "ACTIVE");
16
+ return /* @__PURE__ */ o(e, {
17
17
  title: v ? `Chat with ${v.name}` : "AI Chat",
18
18
  description: "Ask questions grounded in your assistant’s knowledge. Your conversation is saved securely.",
19
19
  children: /* @__PURE__ */ o("div", {
@@ -23,7 +23,7 @@ function d() {
23
23
  children: "Loading assistants…"
24
24
  }) : m.error ? /* @__PURE__ */ s("div", {
25
25
  role: "alert",
26
- children: [/* @__PURE__ */ o("p", { children: "Assistants could not be loaded. Check your access and try again." }), /* @__PURE__ */ o(r, {
26
+ children: [/* @__PURE__ */ o("p", { children: "Assistants could not be loaded. Check your access and try again." }), /* @__PURE__ */ o(t, {
27
27
  variant: "outline",
28
28
  onClick: () => void m.refetch(),
29
29
  children: "Reload assistants"
@@ -58,7 +58,6 @@ function d() {
58
58
  })
59
59
  });
60
60
  }
61
- //#endregion
62
61
  export { u as ChatPage };
63
62
 
64
63
  //# sourceMappingURL=ChatPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatPage.js","names":[],"sources":["../../../src/botlit/pages/ChatPage.tsx"],"sourcesContent":["/** Authenticated Botmanor agent chat with canonical, owner-scoped workflow history. */\nimport { useState } from 'react';\nimport { useParams } from 'react-router';\nimport { WorkflowAssistantPanel } from '@burdenoff/fe-libs/shared/assistant';\nimport { PageLayout } from '../components/PageLayout';\nimport { Button } from '../components/Button';\nimport { useAgents } from '../hooks/useAgents';\nimport { useBotlit } from '../providers/BotlitProvider';\n\nexport function ChatPage() {\n const { workspaceId, currentUser } = useBotlit();\n return <ScopedChatPage key={`${workspaceId}:${currentUser?.id}`} />;\n}\n\nfunction ScopedChatPage() {\n const { agentId } = useParams();\n const { currentUser, workspaceId, authToken } = useBotlit();\n const agents = useAgents();\n const [chosen, setChosen] = useState('');\n const selectedId = agentId ?? chosen;\n const selected = agents.data?.find(\n (agent) => agent.id === selectedId && agent.status === 'ACTIVE'\n );\n return (\n <PageLayout\n title={selected ? `Chat with ${selected.name}` : 'AI Chat'}\n description=\"Ask questions grounded in your assistant’s knowledge. Your conversation is saved securely.\"\n >\n <div className=\"mx-auto flex w-full max-w-4xl flex-col gap-4 p-4\">\n {!currentUser?.id || !workspaceId ? (\n <p>Sign in and choose a workspace to use an assistant.</p>\n ) : agents.loading ? (\n <p role=\"status\">Loading assistants…</p>\n ) : agents.error ? (\n <div role=\"alert\">\n <p>Assistants could not be loaded. Check your access and try again.</p>\n <Button variant=\"outline\" onClick={() => void agents.refetch()}>\n Reload assistants\n </Button>\n </div>\n ) : (\n <>\n {!agentId && (\n <label className=\"grid gap-2 text-sm font-medium\">\n Assistant\n <select\n className=\"h-10 rounded-md border border-border-default bg-bg-surface px-3\"\n value={chosen}\n onChange={(event) => setChosen(event.target.value)}\n >\n <option value=\"\">Choose an assistant</option>\n {agents.data\n ?.filter((agent) => agent.status === 'ACTIVE')\n .map((agent) => (\n <option key={agent.id} value={agent.id}>\n {agent.name}\n </option>\n ))}\n </select>\n </label>\n )}\n {selected ? (\n <WorkflowAssistantPanel\n target={{ kind: 'botmanor', agentId: selected.id }}\n context={{ workspaceId, authContext: { accessToken: authToken } }}\n ownerId={currentUser.id}\n title={selected.name}\n description=\"Answers from this assistant’s configured knowledge.\"\n />\n ) : (\n <p>\n {selectedId\n ? 'This assistant is unavailable. Choose an active assistant you can access.'\n : 'Choose an assistant to begin.'}\n </p>\n )}\n </>\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AASA,SAAgB,IAAW;CACzB,IAAM,EAAE,gBAAa,mBAAgB,GAAW;AAChD,QAAO,kBAAC,GAAD,EAA4D,EAAvC,GAAG,EAAY,GAAG,GAAa,KAAQ;;AAGrE,SAAS,IAAiB;CACxB,IAAM,EAAE,eAAY,GAAW,EACzB,EAAE,gBAAa,gBAAa,iBAAc,GAAW,EACrD,IAAS,GAAW,EACpB,CAAC,GAAQ,KAAa,EAAS,GAAG,EAClC,IAAa,KAAW,GACxB,IAAW,EAAO,MAAM,MAC3B,MAAU,EAAM,OAAO,KAAc,EAAM,WAAW,SACxD;AACD,QACE,kBAAC,GAAD;EACE,OAAO,IAAW,aAAa,EAAS,SAAS;EACjD,aAAY;YAEZ,kBAAC,OAAD;GAAK,WAAU;aACZ,CAAC,GAAa,MAAM,CAAC,IACpB,kBAAC,KAAD,EAAA,UAAG,uDAAuD,CAAA,GACxD,EAAO,UACT,kBAAC,KAAD;IAAG,MAAK;cAAS;IAAuB,CAAA,GACtC,EAAO,QACT,kBAAC,OAAD;IAAK,MAAK;cAAV,CACE,kBAAC,KAAD,EAAA,UAAG,oEAAoE,CAAA,EACvE,kBAAC,GAAD;KAAQ,SAAQ;KAAU,eAAe,KAAK,EAAO,SAAS;eAAE;KAEvD,CAAA,CACL;QAEN,kBAAA,GAAA,EAAA,UAAA,CACG,CAAC,KACA,kBAAC,SAAD;IAAO,WAAU;cAAjB,CAAkD,aAEhD,kBAAC,UAAD;KACE,WAAU;KACV,OAAO;KACP,WAAW,MAAU,EAAU,EAAM,OAAO,MAAM;eAHpD,CAKE,kBAAC,UAAD;MAAQ,OAAM;gBAAG;MAA4B,CAAA,EAC5C,EAAO,MACJ,QAAQ,MAAU,EAAM,WAAW,SAAS,CAC7C,KAAK,MACJ,kBAAC,UAAD;MAAuB,OAAO,EAAM;gBACjC,EAAM;MACA,EAFI,EAAM,GAEV,CACT,CACG;OACH;OAET,IACC,kBAAC,GAAD;IACE,QAAQ;KAAE,MAAM;KAAY,SAAS,EAAS;KAAI;IAClD,SAAS;KAAE;KAAa,aAAa,EAAE,aAAa,GAAW;KAAE;IACjE,SAAS,EAAY;IACrB,OAAO,EAAS;IAChB,aAAY;IACZ,CAAA,GAEF,kBAAC,KAAD,EAAA,UACG,IACG,8EACA,iCACF,CAAA,CAEL,EAAA,CAAA;GAED,CAAA;EACK,CAAA"}
1
+ {"version":3,"file":"ChatPage.js","names":["_Fragment","ChatPage","useBotlit","ScopedChatPage","workspaceId","currentUser","useParams","agents","useAgents","chosen","setChosen","useState","selectedId","agentId","selected","agent","PageLayout","Button","Fragment","event","WorkflowAssistantPanel","authToken"],"sources":["../../../src/botlit/pages/ChatPage.tsx"],"sourcesContent":["/** Authenticated Botmanor agent chat with canonical, owner-scoped workflow history. */\nimport { useState } from 'react';\nimport { useParams } from 'react-router';\nimport { WorkflowAssistantPanel } from '@burdenoff/fe-libs/shared/assistant';\nimport { PageLayout } from '../components/PageLayout';\nimport { Button } from '../components/Button';\nimport { useAgents } from '../hooks/useAgents';\nimport { useBotlit } from '../providers/BotlitProvider';\n\nexport function ChatPage() {\n const { workspaceId, currentUser } = useBotlit();\n return <ScopedChatPage key={`${workspaceId}:${currentUser?.id}`} />;\n}\n\nfunction ScopedChatPage() {\n const { agentId } = useParams();\n const { currentUser, workspaceId, authToken } = useBotlit();\n const agents = useAgents();\n const [chosen, setChosen] = useState('');\n const selectedId = agentId ?? chosen;\n const selected = agents.data?.find(\n (agent) => agent.id === selectedId && agent.status === 'ACTIVE'\n );\n return (\n <PageLayout\n title={selected ? `Chat with ${selected.name}` : 'AI Chat'}\n description=\"Ask questions grounded in your assistant’s knowledge. Your conversation is saved securely.\"\n >\n <div className=\"mx-auto flex w-full max-w-4xl flex-col gap-4 p-4\">\n {!currentUser?.id || !workspaceId ? (\n <p>Sign in and choose a workspace to use an assistant.</p>\n ) : agents.loading ? (\n <p role=\"status\">Loading assistants…</p>\n ) : agents.error ? (\n <div role=\"alert\">\n <p>Assistants could not be loaded. Check your access and try again.</p>\n <Button variant=\"outline\" onClick={() => void agents.refetch()}>\n Reload assistants\n </Button>\n </div>\n ) : (\n <>\n {!agentId && (\n <label className=\"grid gap-2 text-sm font-medium\">\n Assistant\n <select\n className=\"h-10 rounded-md border border-border-default bg-bg-surface px-3\"\n value={chosen}\n onChange={(event) => setChosen(event.target.value)}\n >\n <option value=\"\">Choose an assistant</option>\n {agents.data\n ?.filter((agent) => agent.status === 'ACTIVE')\n .map((agent) => (\n <option key={agent.id} value={agent.id}>\n {agent.name}\n </option>\n ))}\n </select>\n </label>\n )}\n {selected ? (\n <WorkflowAssistantPanel\n target={{ kind: 'botmanor', agentId: selected.id }}\n context={{ workspaceId, authContext: { accessToken: authToken } }}\n ownerId={currentUser.id}\n title={selected.name}\n description=\"Answers from this assistant’s configured knowledge.\"\n />\n ) : (\n <p>\n {selectedId\n ? 'This assistant is unavailable. Choose an active assistant you can access.'\n : 'Choose an assistant to begin.'}\n </p>\n )}\n </>\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AASA,SAAgBC,IAAW;CACzB,IAAM,EAAE,gBAAa,mBAAgBC,EAAU;CAC/C,OAAO,kBAACC,GAAD,CAA2D,GAAtC,GAAGC,EAAY,GAAGC,GAAa,IAAO;AACpE;AAEA,SAASF,IAAiB;CACxB,IAAM,EAAE,eAAYG,EAAU,GACxB,EAAE,gBAAa,gBAAa,iBAAcJ,EAAU,GACpDK,IAASC,EAAU,GACnB,CAACC,GAAQC,KAAaC,EAAS,EAAE,GACjCC,IAAaC,KAAWJ,GACxBK,IAAWP,EAAO,MAAM,MAC3B,MAAUQ,EAAM,OAAOH,KAAcG,EAAM,WAAW,QACzD;CACA,OACE,kBAACC,GAAD;EACE,OAAOF,IAAW,aAAaA,EAAS,SAAS;EACjD,aAAY;EAEZ,UAAA,kBAAC,OAAD;GAAK,WAAU;GACZ,UAAA,CAACT,GAAa,MAAM,CAACD,IACpB,kBAAC,KAAD,EAAA,UAAG,sDAAsD,CAAA,IACvDG,EAAO,UACT,kBAAC,KAAD;IAAG,MAAK;IAAS,UAAA;GAAsB,CAAA,IACrCA,EAAO,QACT,kBAAC,OAAD;IAAK,MAAK;IAAV,UAAA,CACE,kBAAC,KAAD,EAAA,UAAG,mEAAmE,CAAA,GACtE,kBAACU,GAAD;KAAQ,SAAQ;KAAU,eAAe,KAAKV,EAAO,QAAQ;KAAG,UAAA;IAExD,CAAA,CACL;GAEL,CAAA,IAAA,kBAAAP,GAAA,EAAA,UAAA,CACG,CAACa,KACA,kBAAC,SAAD;IAAO,WAAU;IAAjB,UAAA,CAAkD,aAEhD,kBAAC,UAAD;KACE,WAAU;KACV,OAAOJ;KACP,WAAW,MAAUC,EAAUS,EAAM,OAAO,KAAK;KAHnD,UAAA,CAKE,kBAAC,UAAD;MAAQ,OAAM;MAAG,UAAA;KAA2B,CAAA,GAC3CZ,EAAO,MACJ,QAAQ,MAAUQ,EAAM,WAAW,QAAQ,CAAC,CAC7C,KAAK,MACJ,kBAAC,UAAD;MAAuB,OAAOA,EAAM;MACjC,UAAAA,EAAM;KACD,GAFKA,EAAM,EAEX,CACT,CACG;IACH,CAAA,CAAA;GAER,CAAA,GAAAD,IACC,kBAACM,GAAD;IACE,QAAQ;KAAE,MAAM;KAAY,SAASN,EAAS;IAAG;IACjD,SAAS;KAAE;KAAa,aAAa,EAAE,aAAaO,EAAU;IAAE;IAChE,SAAShB,EAAY;IACrB,OAAOS,EAAS;IAChB,aAAY;GACb,CAAA,IAED,kBAAC,KAAD,EAAA,UACGF,IACG,8EACA,gCACH,CAAA,CAEL,EAAA,CAAA;EAED,CAAA;CACK,CAAA;AAEhB"}
@@ -0,0 +1,2 @@
1
+ import { FC } from 'react';
2
+ export declare const ConversationDetailPage: FC;
@@ -0,0 +1,2 @@
1
+ import { FC } from 'react';
2
+ export declare const ConversationsPage: FC;
@@ -0,0 +1,2 @@
1
+ import { FC } from 'react';
2
+ export declare const DashboardPage: FC;
@@ -1,22 +1,22 @@
1
1
  import { useTr as e } from "../../shared/hooks/useTr.js";
2
- import { useBotlit as t } from "../providers/BotlitProvider.js";
3
- import { useBots as n } from "../hooks/useBots.js";
4
- import { useAgents as r } from "../hooks/useAgents.js";
5
- import { formatNumber as i } from "../utils/formatters.js";
6
- import { BOTMANOR_PERMISSIONS as a } from "../permissions/botmanorPermissions.js";
7
- import { BotmanorPermissionGate as o } from "../permissions/useBotmanorPermissions.js";
8
- import { PageLayout as s } from "../components/PageLayout.js";
9
- import { Button as c } from "../components/Button.js";
2
+ import { PageLayout as t } from "../components/PageLayout.js";
3
+ import { Card as n, CardContent as r, CardHeader as i, CardTitle as a } from "../components/Card.js";
4
+ import { Button as o } from "../components/Button.js";
5
+ import { StatusBadge as s } from "../components/Badge.js";
6
+ import { BOTMANOR_PERMISSIONS as c } from "../permissions/botmanorPermissions.js";
7
+ import { BotmanorPermissionGate as l } from "../permissions/useBotmanorPermissions.js";
8
+ import { useBots as u } from "../hooks/useBots.js";
9
+ import { useAgents as d } from "../hooks/useAgents.js";
10
+ import { useBotlit as f } from "../providers/BotlitProvider.js";
11
+ import { formatNumber as p } from "../utils/formatters.js";
10
12
  import "../permissions/index.js";
11
- import { Card as l, CardContent as u, CardHeader as d, CardTitle as f } from "../components/Card.js";
12
- import { StatusBadge as p } from "../components/Badge.js";
13
13
  import { GlassCard as m, GradientText as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
14
14
  import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
15
15
  import { Link as b } from "react-router";
16
16
  import { AppWindow as x, ArrowRight as S, BookOpen as C, Bot as w, Plus as T, Zap as E } from "lucide-react";
17
- //#region src/botlit/pages/DashboardPage.tsx
17
+ // src/botlit/pages/DashboardPage.tsx
18
18
  var D = () => {
19
- let D = e(), { currentUser: O, navigateTo: k, getPath: A } = t(), { data: j, loading: M } = n(), { data: N, loading: P } = r(), F = [{
19
+ let D = e(), { currentUser: O, navigateTo: k, getPath: A } = f(), { data: j, loading: M } = u(), { data: N, loading: P } = d(), F = [{
20
20
  label: D("botlit.dashboard.stats.totalBots", "Total Bots"),
21
21
  value: j?.length || 0,
22
22
  icon: /* @__PURE__ */ v(x, { className: "h-5 w-5" }),
@@ -27,23 +27,23 @@ var D = () => {
27
27
  icon: /* @__PURE__ */ v(w, { className: "h-5 w-5" }),
28
28
  hero: !1
29
29
  }], I = O?.name ? O.name.split(" ")[0] : "";
30
- return /* @__PURE__ */ v(s, {
30
+ return /* @__PURE__ */ v(t, {
31
31
  hero: !0,
32
32
  title: /* @__PURE__ */ y(_, { children: [D("botlit.dashboard.title", "Welcome back"), I ? /* @__PURE__ */ y(_, { children: [", ", /* @__PURE__ */ v(h, { children: I })] }) : null] }),
33
33
  description: D("botlit.dashboard.description", "Here's an overview of your AI agents and bots"),
34
34
  actions: /* @__PURE__ */ y("div", {
35
35
  className: "flex gap-2",
36
- children: [/* @__PURE__ */ v(o, {
37
- permission: a.APP_CREATE,
38
- children: /* @__PURE__ */ v(c, {
36
+ children: [/* @__PURE__ */ v(l, {
37
+ permission: c.APP_CREATE,
38
+ children: /* @__PURE__ */ v(o, {
39
39
  variant: "outline",
40
40
  leftIcon: /* @__PURE__ */ v(T, { size: 16 }),
41
41
  onClick: () => k("bots/new"),
42
42
  children: D("botlit.dashboard.actions.newBot", "New Bot")
43
43
  })
44
- }), /* @__PURE__ */ v(o, {
45
- permission: a.AGENT_CREATE,
46
- children: /* @__PURE__ */ v(c, {
44
+ }), /* @__PURE__ */ v(l, {
45
+ permission: c.AGENT_CREATE,
46
+ children: /* @__PURE__ */ v(o, {
47
47
  leftIcon: /* @__PURE__ */ v(w, { size: 16 }),
48
48
  onClick: () => k("agents/new"),
49
49
  children: D("botlit.dashboard.actions.createAgent", "Create Agent")
@@ -59,10 +59,10 @@ var D = () => {
59
59
  }),
60
60
  /* @__PURE__ */ v("div", {
61
61
  className: "grid grid-cols-1 md:grid-cols-2 gap-4",
62
- children: F.map((e) => /* @__PURE__ */ v(l, {
62
+ children: F.map((e) => /* @__PURE__ */ v(n, {
63
63
  treatment: e.hero ? "glass" : "metric",
64
64
  glow: e.hero,
65
- children: /* @__PURE__ */ v(u, {
65
+ children: /* @__PURE__ */ v(r, {
66
66
  className: "pt-6",
67
67
  children: /* @__PURE__ */ y("div", {
68
68
  className: "flex items-center gap-4",
@@ -82,18 +82,18 @@ var D = () => {
82
82
  }),
83
83
  /* @__PURE__ */ y("div", {
84
84
  className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
85
- children: [/* @__PURE__ */ y(l, {
85
+ children: [/* @__PURE__ */ y(n, {
86
86
  treatment: "insight",
87
- children: [/* @__PURE__ */ y(d, {
87
+ children: [/* @__PURE__ */ y(i, {
88
88
  className: "flex flex-row items-center justify-between",
89
- children: [/* @__PURE__ */ v(f, { children: D("botlit.dashboard.recentBots.title", "Recent Bots") }), /* @__PURE__ */ v(c, {
89
+ children: [/* @__PURE__ */ v(a, { children: D("botlit.dashboard.recentBots.title", "Recent Bots") }), /* @__PURE__ */ v(o, {
90
90
  variant: "ghost",
91
91
  size: "sm",
92
92
  rightIcon: /* @__PURE__ */ v(S, { size: 16 }),
93
93
  onClick: () => k("bots"),
94
94
  children: D("botlit.common.viewAll", "View All")
95
95
  })]
96
- }), /* @__PURE__ */ v(u, { children: M ? /* @__PURE__ */ v("div", {
96
+ }), /* @__PURE__ */ v(r, { children: M ? /* @__PURE__ */ v("div", {
97
97
  className: "space-y-3",
98
98
  children: [
99
99
  1,
@@ -121,16 +121,16 @@ var D = () => {
121
121
  D("botlit.common.executions", "executions")
122
122
  ]
123
123
  })] })]
124
- }), /* @__PURE__ */ v(p, { status: e.status })]
124
+ }), /* @__PURE__ */ v(s, { status: e.status })]
125
125
  }, e.id))
126
126
  }) : /* @__PURE__ */ y("div", {
127
127
  className: "text-center py-8 text-text-secondary",
128
128
  children: [
129
129
  /* @__PURE__ */ v(x, { className: "h-8 w-8 mx-auto mb-2 opacity-50" }),
130
130
  /* @__PURE__ */ v("p", { children: D("botlit.dashboard.recentBots.emptyTitle", "No bots yet") }),
131
- /* @__PURE__ */ v(o, {
132
- permission: a.APP_CREATE,
133
- children: /* @__PURE__ */ v(c, {
131
+ /* @__PURE__ */ v(l, {
132
+ permission: c.APP_CREATE,
133
+ children: /* @__PURE__ */ v(o, {
134
134
  variant: "outline",
135
135
  size: "sm",
136
136
  className: "mt-3",
@@ -140,18 +140,18 @@ var D = () => {
140
140
  })
141
141
  ]
142
142
  }) })]
143
- }), /* @__PURE__ */ y(l, {
143
+ }), /* @__PURE__ */ y(n, {
144
144
  treatment: "insight",
145
- children: [/* @__PURE__ */ y(d, {
145
+ children: [/* @__PURE__ */ y(i, {
146
146
  className: "flex flex-row items-center justify-between",
147
- children: [/* @__PURE__ */ v(f, { children: D("botlit.dashboard.activeAgents.title", "Active Agents") }), /* @__PURE__ */ v(c, {
147
+ children: [/* @__PURE__ */ v(a, { children: D("botlit.dashboard.activeAgents.title", "Active Agents") }), /* @__PURE__ */ v(o, {
148
148
  variant: "ghost",
149
149
  size: "sm",
150
150
  rightIcon: /* @__PURE__ */ v(S, { size: 16 }),
151
151
  onClick: () => k("agents"),
152
152
  children: D("botlit.common.viewAll", "View All")
153
153
  })]
154
- }), /* @__PURE__ */ v(u, { children: P ? /* @__PURE__ */ v("div", {
154
+ }), /* @__PURE__ */ v(r, { children: P ? /* @__PURE__ */ v("div", {
155
155
  className: "space-y-3",
156
156
  children: [
157
157
  1,
@@ -174,7 +174,7 @@ var D = () => {
174
174
  }), /* @__PURE__ */ y("p", {
175
175
  className: "text-xs text-text-secondary",
176
176
  children: [
177
- i(e.executionCount ?? 0),
177
+ p(e.executionCount ?? 0),
178
178
  " ",
179
179
  D("botlit.common.executions", "executions")
180
180
  ]
@@ -186,9 +186,9 @@ var D = () => {
186
186
  children: [
187
187
  /* @__PURE__ */ v(w, { className: "h-8 w-8 mx-auto mb-2 opacity-50" }),
188
188
  /* @__PURE__ */ v("p", { children: D("botlit.dashboard.activeAgents.emptyTitle", "No active agents") }),
189
- /* @__PURE__ */ v(o, {
190
- permission: a.AGENT_CREATE,
191
- children: /* @__PURE__ */ v(c, {
189
+ /* @__PURE__ */ v(l, {
190
+ permission: c.AGENT_CREATE,
191
+ children: /* @__PURE__ */ v(o, {
192
192
  variant: "outline",
193
193
  size: "sm",
194
194
  className: "mt-3",
@@ -248,7 +248,6 @@ var D = () => {
248
248
  })
249
249
  });
250
250
  };
251
- //#endregion
252
251
  export { D as DashboardPage };
253
252
 
254
253
  //# sourceMappingURL=DashboardPage.js.map