@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 +1 @@
1
- {"version":3,"file":"AgentsListPage.js","names":[],"sources":["../../../src/botlit/pages/AgentsListPage.tsx"],"sourcesContent":["/**\n * Agents List Page\n * @module botlit/pages\n */\n\nimport type { ChangeEvent, FC } from 'react';\nimport { useState } from 'react';\nimport { useParams, Link } from 'react-router';\nimport {\n Bot,\n Plus,\n Search,\n Grid3X3,\n List,\n MoreVertical,\n MessageSquare,\n Trash2,\n Settings,\n Play,\n ShieldCheck,\n} from 'lucide-react';\nimport { toast } from 'sonner';\nimport { isNative, nativeConfirm, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport { useTr } from '../../shared/hooks/useTr';\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 { StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport { useAgents, useDeleteAgent, type AgentRecord } from '../hooks/useAgents';\nimport { useBotlitStore } from '../store/botlitStore';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { formatRelativeTime, formatNumber } from '../utils/formatters';\nimport { cn } from '../utils/cn';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nexport const AgentsListPage: FC = () => {\n const t = useTr();\n const { botId } = useParams();\n const { navigateTo, getPath } = useBotlit();\n const { data: agents, loading, error, refetch } = useAgents();\n const [deleteAgent] = useDeleteAgent();\n const { viewMode, setViewMode, agentFilter, updateAgentFilter } = useBotlitStore();\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\n\n const handleSearch = (e: ChangeEvent<HTMLInputElement>) => {\n updateAgentFilter({ search: e.target.value });\n };\n\n const handleDelete = async (agent: { id: string; name: string }) => {\n const confirmed = await nativeConfirm({\n title: t('botlit.agentsList.delete.title', 'Delete agent?'),\n message: t(\n 'botlit.agentsList.delete.message',\n 'Are you sure you want to delete \"{{name}}\"?',\n {\n name: agent.name,\n }\n ),\n okButtonTitle: t('botlit.agentsList.delete.okButton', 'Delete'),\n cancelButtonTitle: t('botlit.agentsList.delete.cancelButton', 'Cancel'),\n });\n const ok =\n confirmed === null\n ? confirm(\n t('botlit.agentsList.delete.message', 'Are you sure you want to delete \"{{name}}\"?', {\n name: agent.name,\n })\n )\n : confirmed;\n if (ok) {\n nativeImpact('medium');\n try {\n await deleteAgent(agent.id);\n toast.success(\n t('botlit.agentsList.delete.success', 'Agent \"{{name}}\" deleted successfully', {\n name: agent.name,\n })\n );\n if (isNative()) void nativeNotify('success');\n } catch (err: unknown) {\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.agentsList.delete.error', 'Failed to delete agent');\n toast.error(message);\n if (isNative()) void nativeNotify('error');\n }\n }\n setMenuOpen(null);\n };\n\n const filteredAgents = agents.filter((agent) => {\n if (agentFilter.search) {\n const search = agentFilter.search.toLowerCase();\n return (\n agent.name.toLowerCase().includes(search) ||\n (agent.description?.toLowerCase().includes(search) ?? false)\n );\n }\n return true;\n });\n\n return (\n <PageLayout\n title={\n botId\n ? t('botlit.agentsList.titleBot', 'Bot Agents')\n : t('botlit.agentsList.title', 'All Agents')\n }\n description={\n botId\n ? t('botlit.agentsList.descriptionBot', 'Manage agents for this bot')\n : t('botlit.agentsList.description', 'View and manage all your AI agents')\n }\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n leftIcon={<ShieldCheck size={16} />}\n onClick={() => navigateTo('agents/approvals')}\n >\n {t('botlit.agentsList.actions.approvals', 'Approvals')}\n </Button>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_CREATE}>\n <Button\n leftIcon={<Plus size={16} />}\n onClick={() => navigateTo(botId ? `bots/${botId}/agents/new` : 'agents/new')}\n >\n {t('botlit.agentsList.actions.createAgent', 'Create Agent')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Bot size={18} />}>\n {t(\n 'botlit.agentsList.purpose',\n 'Agents are the reasoning workers behind your bots — each one bundles a model, a system prompt, tools and knowledge into a callable AI. Build an agent here to handle a specific job (answer support questions, summarise documents, run a workflow), then test it in chat and connect it to a bot or channel.'\n )}\n </PagePurpose>\n\n {/* Summary */}\n {agents.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\">\n {t('botlit.agentsList.summary.total', 'Total agents')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {agents.length}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.agentsList.summary.active', 'Active')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {agents.filter((agent) => agent.status === 'ACTIVE').length}\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\">\n {t('botlit.agentsList.summary.executions', 'Total executions')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {formatNumber(agents.reduce((sum, agent) => sum + (agent.executionCount ?? 0), 0))}\n </p>\n </GlassCard>\n </div>\n ) : null}\n\n {/* Toolbar */}\n <div className=\"flex items-center justify-between 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={t('botlit.agentsList.searchPlaceholder', 'Search agents...')}\n value={agentFilter.search || ''}\n onChange={handleSearch}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant={viewMode === 'grid' ? 'secondary' : 'ghost'}\n size=\"icon\"\n onClick={() => setViewMode('grid')}\n >\n <Grid3X3 size={18} />\n </Button>\n <Button\n variant={viewMode === 'list' ? 'secondary' : 'ghost'}\n size=\"icon\"\n onClick={() => setViewMode('list')}\n >\n <List size={18} />\n </Button>\n </div>\n </div>\n\n {/* Content */}\n {loading ? (\n <div\n className={cn(\n 'gap-4',\n viewMode === 'grid'\n ? 'grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3'\n : 'flex flex-col'\n )}\n >\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n className=\"h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource=\"agents\" error={error} onRetry={() => void refetch()} />\n ) : filteredAgents.length > 0 ? (\n viewMode === 'grid' ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {filteredAgents.map((agent: AgentRecord) => (\n <Card\n key={agent.id}\n className=\"group hover:shadow-md transition-shadow cursor-pointer relative\"\n onClick={() => navigateTo(`agents/${agent.id}`)}\n >\n <CardContent className=\"pt-6\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-4xl\">🤖</span>\n <div>\n <h3 className=\"font-semibold text-text-primary\">{agent.name}</h3>\n <div className=\"flex items-center gap-2 mt-1\">\n <StatusBadge status={agent.status} />\n </div>\n </div>\n </div>\n <div className=\"relative\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={(e) => {\n e.stopPropagation();\n setMenuOpen(menuOpen === agent.id ? null : agent.id);\n }}\n >\n <MoreVertical size={16} />\n </Button>\n {menuOpen === agent.id && (\n <div className=\"absolute right-0 top-full mt-1 w-48 bg-popover border border-border-subtle rounded-md shadow-lg z-10\">\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_EXECUTE}>\n <button\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2\"\n onClick={(e) => {\n e.stopPropagation();\n navigateTo(`agents/${agent.id}/chat`);\n setMenuOpen(null);\n }}\n >\n <Play size={16} />\n {t('botlit.agentsList.menu.testAgent', 'Test Agent')}\n </button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_UPDATE}>\n <button\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2\"\n onClick={(e) => {\n e.stopPropagation();\n navigateTo(`agents/${agent.id}/edit`);\n setMenuOpen(null);\n }}\n >\n <Settings size={16} />\n {t('botlit.agentsList.menu.editAgent', 'Edit Agent')}\n </button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_DELETE}>\n <button\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-accent text-status-error-text flex items-center gap-2\"\n onClick={(e) => {\n e.stopPropagation();\n handleDelete(agent);\n }}\n >\n <Trash2 size={16} />\n {t('botlit.agentsList.menu.delete', 'Delete')}\n </button>\n </BotmanorPermissionGate>\n </div>\n )}\n </div>\n </div>\n <p className=\"mt-3 text-sm text-text-secondary line-clamp-2\">\n {agent.description}\n </p>\n <div className=\"mt-4 flex items-center gap-4 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <MessageSquare size={14} />\n {formatNumber(agent.executionCount)}{' '}\n {t('botlit.agentsList.card.executions', 'executions')}\n </span>\n </div>\n <div className=\"mt-3 pt-3 border-t border-border-subtle flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">\n {t('botlit.agentsList.card.created', 'Created')}{' '}\n {formatRelativeTime(agent.createdAt)}\n </span>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_EXECUTE}>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n leftIcon={<Play size={14} />}\n onClick={(e) => {\n e.stopPropagation();\n navigateTo(`agents/${agent.id}/chat`);\n }}\n >\n {t('botlit.agentsList.card.test', 'Test')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n ) : (\n <div className=\"space-y-2\">\n {filteredAgents.map((agent: AgentRecord) => (\n <Card\n key={agent.id}\n className=\"hover:shadow-md transition-shadow cursor-pointer\"\n onClick={() => navigateTo(`agents/${agent.id}`)}\n >\n <CardContent className=\"py-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <span className=\"text-3xl\">🤖</span>\n <div>\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold text-text-primary\">{agent.name}</h3>\n <StatusBadge status={agent.status} />\n </div>\n <p className=\"text-sm text-text-secondary line-clamp-1\">\n {agent.description}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-4 text-sm text-text-secondary\">\n <span>{formatNumber(agent.executionCount)} executions</span>\n <span>{formatRelativeTime(agent.createdAt)}</span>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_EXECUTE}>\n <Button variant=\"outline\" size=\"sm\" leftIcon={<Play size={14} />}>\n <Link to={getPath(`agents/${agent.id}/chat`)}>Test</Link>\n </Button>\n </BotmanorPermissionGate>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )\n ) : (\n <EmptyState\n illustration=\"empty-agents\"\n title={t('botlit.agentsList.empty.title', 'No agents yet')}\n description={t(\n 'botlit.agentsList.empty.description',\n 'Create your first AI agent to start building intelligent automations.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_CREATE}>\n <Button\n leftIcon={<Plus size={16} />}\n onClick={() => navigateTo(botId ? `bots/${botId}/agents/new` : 'agents/new')}\n >\n {t('botlit.agentsList.actions.createAgent', 'Create Agent')}\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"AgentsListPage.js","names":["AgentsListPage","t","useTr","useParams","useBotlit","agents","useAgents","deleteAgent","useDeleteAgent","useBotlitStore","menuOpen","setMenuOpen","useState","handleSearch","handleDelete","confirmed","nativeConfirm","agent","toast","isNative","nativeNotify","err","message","filteredAgents","agentFilter","search","PageLayout","botId","Button","ShieldCheck","navigateTo","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Plus","PagePurpose","Bot","GlassCard","formatNumber","sum","Search","Input","viewMode","setViewMode","Grid3X3","List","loading","cn","i","error","ErrorState","refetch","Card","CardContent","StatusBadge","e","MoreVertical","Play","Settings","Trash2","MessageSquare","formatRelativeTime","Link","getPath","EmptyState"],"sources":["../../../src/botlit/pages/AgentsListPage.tsx"],"sourcesContent":["/**\n * Agents List Page\n * @module botlit/pages\n */\n\nimport type { ChangeEvent, FC } from 'react';\nimport { useState } from 'react';\nimport { useParams, Link } from 'react-router';\nimport {\n Bot,\n Plus,\n Search,\n Grid3X3,\n List,\n MoreVertical,\n MessageSquare,\n Trash2,\n Settings,\n Play,\n ShieldCheck,\n} from 'lucide-react';\nimport { toast } from 'sonner';\nimport { isNative, nativeConfirm, nativeImpact, nativeNotify } from '../../utils/nativeBridge';\nimport { useTr } from '../../shared/hooks/useTr';\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 { StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport { useAgents, useDeleteAgent, type AgentRecord } from '../hooks/useAgents';\nimport { useBotlitStore } from '../store/botlitStore';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { formatRelativeTime, formatNumber } from '../utils/formatters';\nimport { cn } from '../utils/cn';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nexport const AgentsListPage: FC = () => {\n const t = useTr();\n const { botId } = useParams();\n const { navigateTo, getPath } = useBotlit();\n const { data: agents, loading, error, refetch } = useAgents();\n const [deleteAgent] = useDeleteAgent();\n const { viewMode, setViewMode, agentFilter, updateAgentFilter } = useBotlitStore();\n const [menuOpen, setMenuOpen] = useState<string | null>(null);\n\n const handleSearch = (e: ChangeEvent<HTMLInputElement>) => {\n updateAgentFilter({ search: e.target.value });\n };\n\n const handleDelete = async (agent: { id: string; name: string }) => {\n const confirmed = await nativeConfirm({\n title: t('botlit.agentsList.delete.title', 'Delete agent?'),\n message: t(\n 'botlit.agentsList.delete.message',\n 'Are you sure you want to delete \"{{name}}\"?',\n {\n name: agent.name,\n }\n ),\n okButtonTitle: t('botlit.agentsList.delete.okButton', 'Delete'),\n cancelButtonTitle: t('botlit.agentsList.delete.cancelButton', 'Cancel'),\n });\n const ok =\n confirmed === null\n ? confirm(\n t('botlit.agentsList.delete.message', 'Are you sure you want to delete \"{{name}}\"?', {\n name: agent.name,\n })\n )\n : confirmed;\n if (ok) {\n nativeImpact('medium');\n try {\n await deleteAgent(agent.id);\n toast.success(\n t('botlit.agentsList.delete.success', 'Agent \"{{name}}\" deleted successfully', {\n name: agent.name,\n })\n );\n if (isNative()) void nativeNotify('success');\n } catch (err: unknown) {\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.agentsList.delete.error', 'Failed to delete agent');\n toast.error(message);\n if (isNative()) void nativeNotify('error');\n }\n }\n setMenuOpen(null);\n };\n\n const filteredAgents = agents.filter((agent) => {\n if (agentFilter.search) {\n const search = agentFilter.search.toLowerCase();\n return (\n agent.name.toLowerCase().includes(search) ||\n (agent.description?.toLowerCase().includes(search) ?? false)\n );\n }\n return true;\n });\n\n return (\n <PageLayout\n title={\n botId\n ? t('botlit.agentsList.titleBot', 'Bot Agents')\n : t('botlit.agentsList.title', 'All Agents')\n }\n description={\n botId\n ? t('botlit.agentsList.descriptionBot', 'Manage agents for this bot')\n : t('botlit.agentsList.description', 'View and manage all your AI agents')\n }\n actions={\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n leftIcon={<ShieldCheck size={16} />}\n onClick={() => navigateTo('agents/approvals')}\n >\n {t('botlit.agentsList.actions.approvals', 'Approvals')}\n </Button>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_CREATE}>\n <Button\n leftIcon={<Plus size={16} />}\n onClick={() => navigateTo(botId ? `bots/${botId}/agents/new` : 'agents/new')}\n >\n {t('botlit.agentsList.actions.createAgent', 'Create Agent')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Bot size={18} />}>\n {t(\n 'botlit.agentsList.purpose',\n 'Agents are the reasoning workers behind your bots — each one bundles a model, a system prompt, tools and knowledge into a callable AI. Build an agent here to handle a specific job (answer support questions, summarise documents, run a workflow), then test it in chat and connect it to a bot or channel.'\n )}\n </PagePurpose>\n\n {/* Summary */}\n {agents.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\">\n {t('botlit.agentsList.summary.total', 'Total agents')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {agents.length}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"p-4\">\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.agentsList.summary.active', 'Active')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {agents.filter((agent) => agent.status === 'ACTIVE').length}\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\">\n {t('botlit.agentsList.summary.executions', 'Total executions')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {formatNumber(agents.reduce((sum, agent) => sum + (agent.executionCount ?? 0), 0))}\n </p>\n </GlassCard>\n </div>\n ) : null}\n\n {/* Toolbar */}\n <div className=\"flex items-center justify-between 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={t('botlit.agentsList.searchPlaceholder', 'Search agents...')}\n value={agentFilter.search || ''}\n onChange={handleSearch}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Button\n variant={viewMode === 'grid' ? 'secondary' : 'ghost'}\n size=\"icon\"\n onClick={() => setViewMode('grid')}\n >\n <Grid3X3 size={18} />\n </Button>\n <Button\n variant={viewMode === 'list' ? 'secondary' : 'ghost'}\n size=\"icon\"\n onClick={() => setViewMode('list')}\n >\n <List size={18} />\n </Button>\n </div>\n </div>\n\n {/* Content */}\n {loading ? (\n <div\n className={cn(\n 'gap-4',\n viewMode === 'grid'\n ? 'grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3'\n : 'flex flex-col'\n )}\n >\n {[1, 2, 3, 4, 5, 6].map((i) => (\n <div\n key={i}\n className=\"h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : error ? (\n <ErrorState resource=\"agents\" error={error} onRetry={() => void refetch()} />\n ) : filteredAgents.length > 0 ? (\n viewMode === 'grid' ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {filteredAgents.map((agent: AgentRecord) => (\n <Card\n key={agent.id}\n className=\"group hover:shadow-md transition-shadow cursor-pointer relative\"\n onClick={() => navigateTo(`agents/${agent.id}`)}\n >\n <CardContent className=\"pt-6\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-4xl\">🤖</span>\n <div>\n <h3 className=\"font-semibold text-text-primary\">{agent.name}</h3>\n <div className=\"flex items-center gap-2 mt-1\">\n <StatusBadge status={agent.status} />\n </div>\n </div>\n </div>\n <div className=\"relative\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n onClick={(e) => {\n e.stopPropagation();\n setMenuOpen(menuOpen === agent.id ? null : agent.id);\n }}\n >\n <MoreVertical size={16} />\n </Button>\n {menuOpen === agent.id && (\n <div className=\"absolute right-0 top-full mt-1 w-48 bg-popover border border-border-subtle rounded-md shadow-lg z-10\">\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_EXECUTE}>\n <button\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2\"\n onClick={(e) => {\n e.stopPropagation();\n navigateTo(`agents/${agent.id}/chat`);\n setMenuOpen(null);\n }}\n >\n <Play size={16} />\n {t('botlit.agentsList.menu.testAgent', 'Test Agent')}\n </button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_UPDATE}>\n <button\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-accent flex items-center gap-2\"\n onClick={(e) => {\n e.stopPropagation();\n navigateTo(`agents/${agent.id}/edit`);\n setMenuOpen(null);\n }}\n >\n <Settings size={16} />\n {t('botlit.agentsList.menu.editAgent', 'Edit Agent')}\n </button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_DELETE}>\n <button\n className=\"w-full px-4 py-2 text-left text-sm hover:bg-accent text-status-error-text flex items-center gap-2\"\n onClick={(e) => {\n e.stopPropagation();\n handleDelete(agent);\n }}\n >\n <Trash2 size={16} />\n {t('botlit.agentsList.menu.delete', 'Delete')}\n </button>\n </BotmanorPermissionGate>\n </div>\n )}\n </div>\n </div>\n <p className=\"mt-3 text-sm text-text-secondary line-clamp-2\">\n {agent.description}\n </p>\n <div className=\"mt-4 flex items-center gap-4 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <MessageSquare size={14} />\n {formatNumber(agent.executionCount)}{' '}\n {t('botlit.agentsList.card.executions', 'executions')}\n </span>\n </div>\n <div className=\"mt-3 pt-3 border-t border-border-subtle flex items-center justify-between\">\n <span className=\"text-xs text-text-secondary\">\n {t('botlit.agentsList.card.created', 'Created')}{' '}\n {formatRelativeTime(agent.createdAt)}\n </span>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_EXECUTE}>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n leftIcon={<Play size={14} />}\n onClick={(e) => {\n e.stopPropagation();\n navigateTo(`agents/${agent.id}/chat`);\n }}\n >\n {t('botlit.agentsList.card.test', 'Test')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n ) : (\n <div className=\"space-y-2\">\n {filteredAgents.map((agent: AgentRecord) => (\n <Card\n key={agent.id}\n className=\"hover:shadow-md transition-shadow cursor-pointer\"\n onClick={() => navigateTo(`agents/${agent.id}`)}\n >\n <CardContent className=\"py-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <span className=\"text-3xl\">🤖</span>\n <div>\n <div className=\"flex items-center gap-2\">\n <h3 className=\"font-semibold text-text-primary\">{agent.name}</h3>\n <StatusBadge status={agent.status} />\n </div>\n <p className=\"text-sm text-text-secondary line-clamp-1\">\n {agent.description}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-4 text-sm text-text-secondary\">\n <span>{formatNumber(agent.executionCount)} executions</span>\n <span>{formatRelativeTime(agent.createdAt)}</span>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_EXECUTE}>\n <Button variant=\"outline\" size=\"sm\" leftIcon={<Play size={14} />}>\n <Link to={getPath(`agents/${agent.id}/chat`)}>Test</Link>\n </Button>\n </BotmanorPermissionGate>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )\n ) : (\n <EmptyState\n illustration=\"empty-agents\"\n title={t('botlit.agentsList.empty.title', 'No agents yet')}\n description={t(\n 'botlit.agentsList.empty.description',\n 'Create your first AI agent to start building intelligent automations.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_CREATE}>\n <Button\n leftIcon={<Plus size={16} />}\n onClick={() => navigateTo(botId ? `bots/${botId}/agents/new` : 'agents/new')}\n >\n {t('botlit.agentsList.actions.createAgent', 'Create Agent')}\n </Button>\n </BotmanorPermissionGate>\n }\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 AiOperationsPage: FC;
@@ -0,0 +1,165 @@
1
+ import { useTr as e } from "../../shared/hooks/useTr.js";
2
+ import { PageLayout as t } from "../components/PageLayout.js";
3
+ import { AiOperationsPanel as n } from "../components/AiOperationsPanel.js";
4
+ import { Badge as r } from "../components/Badge.js";
5
+ import { Button as i } from "../components/Button.js";
6
+ import { Card as a, CardContent as o, CardHeader as s, CardTitle as c } from "../components/Card.js";
7
+ import { ErrorState as l } from "../components/ErrorState.js";
8
+ import { Input as u, Label as d } from "../components/Input.js";
9
+ import { useConfigureSupervisor as f, useRunSupervisorNow as p, useSupervisorConfig as m, useSupervisorRuns as h } from "../hooks/useAiOperations.js";
10
+ import "../hooks/index.js";
11
+ import { formatRelativeTime as g } from "../utils/formatters.js";
12
+ import { useState as _ } from "react";
13
+ import { jsx as v, jsxs as y } from "react/jsx-runtime";
14
+ import { Play as b, ShieldCheck as x } from "lucide-react";
15
+ // src/botlit/pages/AiOperationsPage.tsx
16
+ var S = "0 9 * * *", C = "UTC", w = () => {
17
+ let t = e(), { data: n, loading: r, error: i, refetch: p } = m(), [h, b] = f(), [w, T] = _(null), [E, D] = _(null), [O, k] = _(null), A = n?.enabled ?? !1, j = w ?? n?.cron ?? S, M = E ?? n?.timezone ?? C, N = b.loading || r, P = async (e) => {
18
+ k(null);
19
+ try {
20
+ await h(e), await p();
21
+ } catch (e) {
22
+ k(e instanceof Error ? e.message : String(e));
23
+ }
24
+ };
25
+ return i ? /* @__PURE__ */ v(l, {
26
+ resource: t("botlit.aiOperations.configErrorTitle", "Supervisor configuration"),
27
+ error: i,
28
+ onRetry: () => void p()
29
+ }) : /* @__PURE__ */ y(a, { children: [/* @__PURE__ */ v(s, { children: /* @__PURE__ */ y(c, {
30
+ className: "flex items-center gap-2 text-base",
31
+ children: [/* @__PURE__ */ v(x, { className: "h-4 w-4" }), t("botlit.aiOperations.configTitle", "Scheduled fleet review")]
32
+ }) }), /* @__PURE__ */ y(o, {
33
+ className: "space-y-4",
34
+ children: [
35
+ /* @__PURE__ */ y("label", {
36
+ className: "flex items-center gap-2 text-sm text-text-primary",
37
+ children: [/* @__PURE__ */ v("input", {
38
+ type: "checkbox",
39
+ className: "h-4 w-4",
40
+ checked: A,
41
+ disabled: N,
42
+ onChange: (e) => void P({
43
+ enabled: e.target.checked,
44
+ cron: j,
45
+ timezone: M
46
+ })
47
+ }), t("botlit.aiOperations.configEnable", "Run the supervisor automatically every day")]
48
+ }),
49
+ /* @__PURE__ */ y("div", {
50
+ className: "grid gap-4 sm:grid-cols-2",
51
+ children: [/* @__PURE__ */ y("div", {
52
+ className: "space-y-1.5",
53
+ children: [/* @__PURE__ */ v(d, {
54
+ htmlFor: "supervisor-cron",
55
+ children: t("botlit.aiOperations.cronLabel", "Cron (FluidGrids schedule)")
56
+ }), /* @__PURE__ */ v(u, {
57
+ id: "supervisor-cron",
58
+ value: j,
59
+ disabled: N,
60
+ onChange: (e) => T(e.target.value),
61
+ onBlur: () => void P({
62
+ enabled: A,
63
+ cron: j,
64
+ timezone: M
65
+ }),
66
+ placeholder: S
67
+ })]
68
+ }), /* @__PURE__ */ y("div", {
69
+ className: "space-y-1.5",
70
+ children: [/* @__PURE__ */ v(d, {
71
+ htmlFor: "supervisor-timezone",
72
+ children: t("botlit.aiOperations.timezoneLabel", "Timezone")
73
+ }), /* @__PURE__ */ v(u, {
74
+ id: "supervisor-timezone",
75
+ value: M,
76
+ disabled: N,
77
+ onChange: (e) => D(e.target.value),
78
+ onBlur: () => void P({
79
+ enabled: A,
80
+ cron: j,
81
+ timezone: M
82
+ }),
83
+ placeholder: C
84
+ })]
85
+ })]
86
+ }),
87
+ n?.lastRunAt && /* @__PURE__ */ v("p", {
88
+ className: "text-xs text-text-tertiary",
89
+ children: t("botlit.aiOperations.lastRun", "Last review: {{time}}", { time: g(n.lastRunAt) })
90
+ }),
91
+ O && /* @__PURE__ */ v("p", {
92
+ className: "text-sm text-status-error-text",
93
+ role: "alert",
94
+ children: O
95
+ })
96
+ ]
97
+ })] });
98
+ }, T = () => {
99
+ let t = e(), { data: n, loading: i, error: l } = h();
100
+ return l || !i && n.length === 0 ? null : /* @__PURE__ */ y(a, { children: [/* @__PURE__ */ v(s, { children: /* @__PURE__ */ v(c, {
101
+ className: "text-base",
102
+ children: t("botlit.aiOperations.runHistoryTitle", "Review history")
103
+ }) }), /* @__PURE__ */ v(o, { children: /* @__PURE__ */ v("ul", {
104
+ className: "divide-y divide-border-subtle",
105
+ children: n.map((e) => /* @__PURE__ */ y("li", {
106
+ className: "flex items-center justify-between gap-3 py-2 text-sm",
107
+ children: [/* @__PURE__ */ y("div", {
108
+ className: "flex items-center gap-2",
109
+ children: [/* @__PURE__ */ v(r, {
110
+ variant: e.status === "COMPLETED" ? "success" : e.status === "FAILED" ? "destructive" : "secondary",
111
+ children: e.status
112
+ }), /* @__PURE__ */ v("span", {
113
+ className: "text-text-secondary",
114
+ children: t("botlit.aiOperations.runMeta", "{{trigger}} · {{findings}} findings · {{notified}} notified", {
115
+ trigger: e.trigger,
116
+ findings: e.findings,
117
+ notified: e.notified
118
+ })
119
+ })]
120
+ }), /* @__PURE__ */ v("span", {
121
+ className: "text-xs text-text-tertiary whitespace-nowrap",
122
+ children: g(e.startedAt)
123
+ })]
124
+ }, e.id))
125
+ }) })] });
126
+ }, E = () => {
127
+ let r = e(), [a, o] = p(), [s, c] = _(null), [l, u] = _(null), d = o.loading, f = async () => {
128
+ c(null), u(null);
129
+ try {
130
+ let e = await a();
131
+ u(e.run ? r("botlit.aiOperations.runNowSummary", "Review finished: {{status}}, {{findings}} new findings.", {
132
+ status: e.run.status,
133
+ findings: e.findings
134
+ }) : r("botlit.aiOperations.runNowSkipped", "Nothing to run — enable the scheduled review first."));
135
+ } catch (e) {
136
+ c(e instanceof Error ? e.message : String(e));
137
+ }
138
+ };
139
+ return /* @__PURE__ */ v(t, {
140
+ title: r("botlit.aiOperations.title", "AI Operations"),
141
+ description: r("botlit.aiOperations.description", "Supervisor findings across your agent fleet — what drifted, the evidence, and the recommended action."),
142
+ actions: /* @__PURE__ */ y(i, {
143
+ variant: "outline",
144
+ onClick: () => void f(),
145
+ disabled: d,
146
+ children: [/* @__PURE__ */ v(b, { className: "h-4 w-4" }), r("botlit.aiOperations.runNow", "Run review now")]
147
+ }),
148
+ children: /* @__PURE__ */ y("div", {
149
+ className: "space-y-6",
150
+ children: [
151
+ (s || l) && /* @__PURE__ */ v("p", {
152
+ className: s ? "text-sm text-status-error-text" : "text-sm text-status-success-text",
153
+ role: "status",
154
+ children: s ?? l
155
+ }),
156
+ /* @__PURE__ */ v(n, {}),
157
+ /* @__PURE__ */ v(w, {}),
158
+ /* @__PURE__ */ v(T, {})
159
+ ]
160
+ })
161
+ });
162
+ };
163
+ export { E as AiOperationsPage };
164
+
165
+ //# sourceMappingURL=AiOperationsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AiOperationsPage.js","names":["DEFAULT_CRON","DEFAULT_TIMEZONE","SupervisorConfigSection","useTr","config","useSupervisorConfig","configure","configureState","useConfigureSupervisor","cron","setCron","useState","timezone","setTimezone","saveError","setSaveError","enabled","effectiveCron","effectiveTimezone","busy","loading","save","next","refetch","configureError","error","ErrorState","Card","CardHeader","CardTitle","ShieldCheck","CardContent","event","Label","Input","formatRelativeTime","RunHistorySection","runs","useSupervisorRuns","Badge","run","AiOperationsPage","t","runNow","runNowState","useRunSupervisorNow","runError","setRunError","runSummary","setRunSummary","onRunNow","result","PageLayout","Button","Play","AiOperationsPanel"],"sources":["../../../src/botlit/pages/AiOperationsPage.tsx"],"sourcesContent":["/**\n * AI Operations Page (BOFF-3839)\n * @module botlit/pages\n *\n * The workspace-wide supervisor feed at /botmanor/ai: decision cards, the\n * supervisor schedule configuration (FluidGrids owns the cron — enabling\n * provisions it, disabling removes it), a run-now action and the run\n * history. The same decision-card panel renders narrowed on the agent and\n * bot detail pages.\n */\n\nimport type { FC } from 'react';\nimport { useState } from 'react';\nimport { Play, ShieldCheck } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { PageLayout } from '../components/PageLayout';\nimport { AiOperationsPanel } from '../components/AiOperationsPanel';\nimport { Badge } from '../components/Badge';\nimport { Button } from '../components/Button';\nimport { Card, CardContent, CardHeader, CardTitle } from '../components/Card';\nimport { ErrorState } from '../components/ErrorState';\nimport { Input, Label } from '../components/Input';\nimport {\n useConfigureSupervisor,\n useRunSupervisorNow,\n useSupervisorConfig,\n useSupervisorRuns,\n} from '../hooks';\nimport { formatRelativeTime } from '../utils/formatters';\n\nconst DEFAULT_CRON = '0 9 * * *';\nconst DEFAULT_TIMEZONE = 'UTC';\n\n/** Schedule configuration: enable switch + cadence, provisioned in FluidGrids. */\nconst SupervisorConfigSection: FC = () => {\n const t = useTr();\n const { data: config, loading, error, refetch } = useSupervisorConfig();\n const [configure, configureState] = useConfigureSupervisor();\n const [cron, setCron] = useState<string | null>(null);\n const [timezone, setTimezone] = useState<string | null>(null);\n const [saveError, setSaveError] = useState<string | null>(null);\n\n const enabled = config?.enabled ?? false;\n const effectiveCron = cron ?? config?.cron ?? DEFAULT_CRON;\n const effectiveTimezone = timezone ?? config?.timezone ?? DEFAULT_TIMEZONE;\n const busy = configureState.loading || loading;\n\n const save = async (next: { enabled: boolean; cron: string; timezone: string }) => {\n setSaveError(null);\n try {\n await configure(next);\n await refetch();\n } catch (configureError) {\n setSaveError(\n configureError instanceof Error ? configureError.message : String(configureError)\n );\n }\n };\n\n if (error) {\n return (\n <ErrorState\n resource={t('botlit.aiOperations.configErrorTitle', 'Supervisor configuration')}\n error={error}\n onRetry={() => void refetch()}\n />\n );\n }\n\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <ShieldCheck className=\"h-4 w-4\" />\n {t('botlit.aiOperations.configTitle', 'Scheduled fleet review')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <label className=\"flex items-center gap-2 text-sm text-text-primary\">\n <input\n type=\"checkbox\"\n className=\"h-4 w-4\"\n checked={enabled}\n disabled={busy}\n onChange={(event) =>\n void save({\n enabled: event.target.checked,\n cron: effectiveCron,\n timezone: effectiveTimezone,\n })\n }\n />\n {t('botlit.aiOperations.configEnable', 'Run the supervisor automatically every day')}\n </label>\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"supervisor-cron\">\n {t('botlit.aiOperations.cronLabel', 'Cron (FluidGrids schedule)')}\n </Label>\n <Input\n id=\"supervisor-cron\"\n value={effectiveCron}\n disabled={busy}\n onChange={(event) => setCron(event.target.value)}\n onBlur={() =>\n void save({ enabled, cron: effectiveCron, timezone: effectiveTimezone })\n }\n placeholder={DEFAULT_CRON}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"supervisor-timezone\">\n {t('botlit.aiOperations.timezoneLabel', 'Timezone')}\n </Label>\n <Input\n id=\"supervisor-timezone\"\n value={effectiveTimezone}\n disabled={busy}\n onChange={(event) => setTimezone(event.target.value)}\n onBlur={() =>\n void save({ enabled, cron: effectiveCron, timezone: effectiveTimezone })\n }\n placeholder={DEFAULT_TIMEZONE}\n />\n </div>\n </div>\n {config?.lastRunAt && (\n <p className=\"text-xs text-text-tertiary\">\n {t('botlit.aiOperations.lastRun', 'Last review: {{time}}', {\n time: formatRelativeTime(config.lastRunAt),\n })}\n </p>\n )}\n {saveError && (\n <p className=\"text-sm text-status-error-text\" role=\"alert\">\n {saveError}\n </p>\n )}\n </CardContent>\n </Card>\n );\n};\n\n/** Recent supervisor runs (both triggers), newest first. */\nconst RunHistorySection: FC = () => {\n const t = useTr();\n const { data: runs, loading, error } = useSupervisorRuns();\n\n if (error || (!loading && runs.length === 0)) return null;\n\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">\n {t('botlit.aiOperations.runHistoryTitle', 'Review history')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <ul className=\"divide-y divide-border-subtle\">\n {runs.map((run) => (\n <li key={run.id} className=\"flex items-center justify-between gap-3 py-2 text-sm\">\n <div className=\"flex items-center gap-2\">\n <Badge\n variant={\n run.status === 'COMPLETED'\n ? 'success'\n : run.status === 'FAILED'\n ? 'destructive'\n : 'secondary'\n }\n >\n {run.status}\n </Badge>\n <span className=\"text-text-secondary\">\n {t(\n 'botlit.aiOperations.runMeta',\n '{{trigger}} · {{findings}} findings · {{notified}} notified',\n {\n trigger: run.trigger,\n findings: run.findings,\n notified: run.notified,\n }\n )}\n </span>\n </div>\n <span className=\"text-xs text-text-tertiary whitespace-nowrap\">\n {formatRelativeTime(run.startedAt)}\n </span>\n </li>\n ))}\n </ul>\n </CardContent>\n </Card>\n );\n};\n\nexport const AiOperationsPage: FC = () => {\n const t = useTr();\n const [runNow, runNowState] = useRunSupervisorNow();\n const [runError, setRunError] = useState<string | null>(null);\n const [runSummary, setRunSummary] = useState<string | null>(null);\n const busy = runNowState.loading;\n\n const onRunNow = async () => {\n setRunError(null);\n setRunSummary(null);\n try {\n const result = await runNow();\n setRunSummary(\n result.run\n ? t(\n 'botlit.aiOperations.runNowSummary',\n 'Review finished: {{status}}, {{findings}} new findings.',\n {\n status: result.run.status,\n findings: result.findings,\n }\n )\n : t(\n 'botlit.aiOperations.runNowSkipped',\n 'Nothing to run — enable the scheduled review first.'\n )\n );\n } catch (error) {\n setRunError(error instanceof Error ? error.message : String(error));\n }\n };\n\n return (\n <PageLayout\n title={t('botlit.aiOperations.title', 'AI Operations')}\n description={t(\n 'botlit.aiOperations.description',\n 'Supervisor findings across your agent fleet — what drifted, the evidence, and the recommended action.'\n )}\n actions={\n <Button variant=\"outline\" onClick={() => void onRunNow()} disabled={busy}>\n <Play className=\"h-4 w-4\" />\n {t('botlit.aiOperations.runNow', 'Run review now')}\n </Button>\n }\n >\n <div className=\"space-y-6\">\n {(runError || runSummary) && (\n <p\n className={\n runError ? 'text-sm text-status-error-text' : 'text-sm text-status-success-text'\n }\n role=\"status\"\n >\n {runError ?? runSummary}\n </p>\n )}\n <AiOperationsPanel />\n <SupervisorConfigSection />\n <RunHistorySection />\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { FC } from 'react';
2
+ interface BotChannelsTabProps {
3
+ botId: string;
4
+ botName: string;
5
+ }
6
+ export declare const BotChannelsTab: FC<BotChannelsTabProps>;
7
+ export {};