@burdenoff/microfe-botmanor 2026.1108.1 → 2026.1109.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/dist/botlit/BotlitRoutes.d.ts +2 -0
  2. package/dist/botlit/BotlitRoutes.js +24 -25
  3. package/dist/botlit/BotlitRoutes.js.map +1 -1
  4. package/dist/botlit/BotmanorRoot.d.ts +3 -0
  5. package/dist/botlit/BotmanorRoot.js +1 -2
  6. package/dist/botlit/BotmanorRoot.js.map +1 -1
  7. package/dist/botlit/BotmanorRootInner.d.ts +3 -0
  8. package/dist/botlit/BotmanorRootInner.js +9 -10
  9. package/dist/botlit/BotmanorRootInner.js.map +1 -1
  10. package/dist/botlit/components/AgentApprovalPanel.d.ts +20 -0
  11. package/dist/botlit/components/AgentApprovalPanel.js +49 -50
  12. package/dist/botlit/components/AgentApprovalPanel.js.map +1 -1
  13. package/dist/botlit/components/AiOperationsPanel.d.ts +14 -0
  14. package/dist/botlit/components/AiOperationsPanel.js +54 -55
  15. package/dist/botlit/components/AiOperationsPanel.js.map +1 -1
  16. package/dist/botlit/components/AssistantChannelPanel.d.ts +3 -0
  17. package/dist/botlit/components/AssistantChannelPanel.js +12 -13
  18. package/dist/botlit/components/AssistantChannelPanel.js.map +1 -1
  19. package/dist/botlit/components/AssistantRuntimeSetupPanel.d.ts +4 -0
  20. package/dist/botlit/components/AssistantRuntimeSetupPanel.js +14 -14
  21. package/dist/botlit/components/AssistantRuntimeSetupPanel.js.map +1 -1
  22. package/dist/botlit/components/AssistantWebsitePanel.d.ts +5 -0
  23. package/dist/botlit/components/AssistantWebsitePanel.js +15 -16
  24. package/dist/botlit/components/AssistantWebsitePanel.js.map +1 -1
  25. package/dist/botlit/components/Badge.d.ts +9 -0
  26. package/dist/botlit/components/Badge.js +1 -2
  27. package/dist/botlit/components/Badge.js.map +1 -1
  28. package/dist/botlit/components/Button.d.ts +10 -0
  29. package/dist/botlit/components/Button.js +1 -2
  30. package/dist/botlit/components/Button.js.map +1 -1
  31. package/dist/botlit/components/Card.d.ts +16 -0
  32. package/dist/botlit/components/Card.js +1 -2
  33. package/dist/botlit/components/Card.js.map +1 -1
  34. package/dist/botlit/components/ChannelSelectorSheet.d.ts +23 -0
  35. package/dist/botlit/components/ChannelSelectorSheet.js +1 -2
  36. package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
  37. package/dist/botlit/components/EmptyState.d.ts +12 -0
  38. package/dist/botlit/components/EmptyState.js +1 -2
  39. package/dist/botlit/components/EmptyState.js.map +1 -1
  40. package/dist/botlit/components/ErrorState.d.ts +10 -0
  41. package/dist/botlit/components/ErrorState.js +5 -6
  42. package/dist/botlit/components/ErrorState.js.map +1 -1
  43. package/dist/botlit/components/Input.d.ts +27 -0
  44. package/dist/botlit/components/Input.js +1 -2
  45. package/dist/botlit/components/Input.js.map +1 -1
  46. package/dist/botlit/components/KnowledgeSourceImportPanel.d.ts +3 -0
  47. package/dist/botlit/components/KnowledgeSourceImportPanel.js +12 -13
  48. package/dist/botlit/components/KnowledgeSourceImportPanel.js.map +1 -1
  49. package/dist/botlit/components/ModelRegistrationPanel.d.ts +5 -0
  50. package/dist/botlit/components/ModelRegistrationPanel.js +1 -2
  51. package/dist/botlit/components/ModelRegistrationPanel.js.map +1 -1
  52. package/dist/botlit/components/PageLayout.d.ts +12 -0
  53. package/dist/botlit/components/PageLayout.js +1 -2
  54. package/dist/botlit/components/PageLayout.js.map +1 -1
  55. package/dist/botlit/components/QuotaExhaustedDialog.d.ts +9 -0
  56. package/dist/botlit/components/QuotaExhaustedDialog.js +1 -2
  57. package/dist/botlit/components/QuotaExhaustedDialog.js.map +1 -1
  58. package/dist/botlit/components/RetentionStatusPanel.d.ts +2 -0
  59. package/dist/botlit/components/RetentionStatusPanel.js +18 -19
  60. package/dist/botlit/components/RetentionStatusPanel.js.map +1 -1
  61. package/dist/botlit/components/RouteLoader.d.ts +23 -0
  62. package/dist/botlit/components/RouteLoader.js +1 -2
  63. package/dist/botlit/components/RouteLoader.js.map +1 -1
  64. package/dist/botlit/components/VersionHistoryPanel.d.ts +12 -0
  65. package/dist/botlit/components/VersionHistoryPanel.js +23 -24
  66. package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
  67. package/dist/botlit/components/WorkspaceRequired.d.ts +18 -0
  68. package/dist/botlit/components/WorkspaceRequired.js +1 -2
  69. package/dist/botlit/components/WorkspaceRequired.js.map +1 -1
  70. package/dist/botlit/components/index.d.ts +14 -0
  71. package/dist/botlit/hooks/index.d.ts +36 -0
  72. package/dist/botlit/hooks/index.js +15 -14
  73. package/dist/botlit/hooks/internal/mutationInput.d.ts +56 -0
  74. package/dist/botlit/hooks/internal/mutationInput.js +1 -2
  75. package/dist/botlit/hooks/internal/mutationInput.js.map +1 -1
  76. package/dist/botlit/hooks/internal/workspaceGateway.d.ts +54 -0
  77. package/dist/botlit/hooks/internal/workspaceGateway.js +17 -19
  78. package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
  79. package/dist/botlit/hooks/useA2A.d.ts +104 -0
  80. package/dist/botlit/hooks/useA2A.js +45 -45
  81. package/dist/botlit/hooks/useA2A.js.map +1 -1
  82. package/dist/botlit/hooks/useAgentApprovals.d.ts +62 -0
  83. package/dist/botlit/hooks/useAgentApprovals.js +38 -39
  84. package/dist/botlit/hooks/useAgentApprovals.js.map +1 -1
  85. package/dist/botlit/hooks/useAgents.d.ts +105 -0
  86. package/dist/botlit/hooks/useAgents.js +53 -54
  87. package/dist/botlit/hooks/useAgents.js.map +1 -1
  88. package/dist/botlit/hooks/useAiOperations.d.ts +95 -0
  89. package/dist/botlit/hooks/useAiOperations.js +20 -19
  90. package/dist/botlit/hooks/useAiOperations.js.map +1 -1
  91. package/dist/botlit/hooks/useAssistantChannels.d.ts +16 -0
  92. package/dist/botlit/hooks/useAssistantChannels.js +1 -2
  93. package/dist/botlit/hooks/useAssistantChannels.js.map +1 -1
  94. package/dist/botlit/hooks/useAssistantRuntimeSetup.d.ts +17 -0
  95. package/dist/botlit/hooks/useAssistantRuntimeSetup.js +1 -2
  96. package/dist/botlit/hooks/useAssistantRuntimeSetup.js.map +1 -1
  97. package/dist/botlit/hooks/useAssistantWebsites.d.ts +18 -0
  98. package/dist/botlit/hooks/useAssistantWebsites.js +1 -2
  99. package/dist/botlit/hooks/useAssistantWebsites.js.map +1 -1
  100. package/dist/botlit/hooks/useBotWorkflow.d.ts +22 -0
  101. package/dist/botlit/hooks/useBotWorkflow.js +1 -2
  102. package/dist/botlit/hooks/useBotWorkflow.js.map +1 -1
  103. package/dist/botlit/hooks/useBots.d.ts +68 -0
  104. package/dist/botlit/hooks/useBots.js +32 -33
  105. package/dist/botlit/hooks/useBots.js.map +1 -1
  106. package/dist/botlit/hooks/useBuckets.d.ts +57 -0
  107. package/dist/botlit/hooks/useBuckets.js +38 -39
  108. package/dist/botlit/hooks/useBuckets.js.map +1 -1
  109. package/dist/botlit/hooks/useChannels.d.ts +87 -0
  110. package/dist/botlit/hooks/useChannels.js +73 -73
  111. package/dist/botlit/hooks/useChannels.js.map +1 -1
  112. package/dist/botlit/hooks/useConversations.d.ts +42 -0
  113. package/dist/botlit/hooks/useConversations.js +1 -2
  114. package/dist/botlit/hooks/useConversations.js.map +1 -1
  115. package/dist/botlit/hooks/useExecutions.d.ts +87 -0
  116. package/dist/botlit/hooks/useExecutions.js +37 -37
  117. package/dist/botlit/hooks/useExecutions.js.map +1 -1
  118. package/dist/botlit/hooks/useKnowledgeBases.d.ts +79 -0
  119. package/dist/botlit/hooks/useKnowledgeBases.js +40 -39
  120. package/dist/botlit/hooks/useKnowledgeBases.js.map +1 -1
  121. package/dist/botlit/hooks/useKnowledgeSourceImports.d.ts +21 -0
  122. package/dist/botlit/hooks/useKnowledgeSourceImports.js +1 -2
  123. package/dist/botlit/hooks/useKnowledgeSourceImports.js.map +1 -1
  124. package/dist/botlit/hooks/useLLMProviders.d.ts +66 -0
  125. package/dist/botlit/hooks/useLLMProviders.js +25 -26
  126. package/dist/botlit/hooks/useLLMProviders.js.map +1 -1
  127. package/dist/botlit/hooks/useMCPServers.d.ts +71 -0
  128. package/dist/botlit/hooks/useMCPServers.js +40 -38
  129. package/dist/botlit/hooks/useMCPServers.js.map +1 -1
  130. package/dist/botlit/hooks/usePolicies.d.ts +60 -0
  131. package/dist/botlit/hooks/usePolicies.js +49 -49
  132. package/dist/botlit/hooks/usePolicies.js.map +1 -1
  133. package/dist/botlit/hooks/usePromptTemplates.d.ts +88 -0
  134. package/dist/botlit/hooks/usePromptTemplates.js +57 -57
  135. package/dist/botlit/hooks/usePromptTemplates.js.map +1 -1
  136. package/dist/botlit/hooks/useRetention.d.ts +26 -0
  137. package/dist/botlit/hooks/useRetention.js +3 -3
  138. package/dist/botlit/hooks/useRetention.js.map +1 -1
  139. package/dist/botlit/hooks/useRetrievalProfiles.d.ts +75 -0
  140. package/dist/botlit/hooks/useRetrievalProfiles.js +47 -47
  141. package/dist/botlit/hooks/useRetrievalProfiles.js.map +1 -1
  142. package/dist/botlit/hooks/useSkills.d.ts +64 -0
  143. package/dist/botlit/hooks/useSkills.js +53 -53
  144. package/dist/botlit/hooks/useSkills.js.map +1 -1
  145. package/dist/botlit/hooks/useStore.d.ts +112 -0
  146. package/dist/botlit/hooks/useStore.js +55 -55
  147. package/dist/botlit/hooks/useStore.js.map +1 -1
  148. package/dist/botlit/hooks/useUserPlatformConnection.d.ts +80 -0
  149. package/dist/botlit/hooks/useUserPlatformConnection.js +19 -19
  150. package/dist/botlit/hooks/useUserPlatformConnection.js.map +1 -1
  151. package/dist/botlit/index.d.ts +16 -0
  152. package/dist/botlit/index.js +12 -11
  153. package/dist/botlit/pages/A2AAgentDetailPage.d.ts +6 -0
  154. package/dist/botlit/pages/A2AAgentDetailPage.js +171 -178
  155. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
  156. package/dist/botlit/pages/A2ARegistryPage.d.ts +2 -0
  157. package/dist/botlit/pages/A2ARegistryPage.js +25 -26
  158. package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
  159. package/dist/botlit/pages/AgentApprovalsPage.d.ts +2 -0
  160. package/dist/botlit/pages/AgentApprovalsPage.js +32 -33
  161. package/dist/botlit/pages/AgentApprovalsPage.js.map +1 -1
  162. package/dist/botlit/pages/AgentBuilderPage.d.ts +2 -0
  163. package/dist/botlit/pages/AgentBuilderPage.js +59 -60
  164. package/dist/botlit/pages/AgentBuilderPage.js.map +1 -1
  165. package/dist/botlit/pages/AgentDetailPage.d.ts +2 -0
  166. package/dist/botlit/pages/AgentDetailPage.js +83 -84
  167. package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
  168. package/dist/botlit/pages/AgentsListPage.d.ts +2 -0
  169. package/dist/botlit/pages/AgentsListPage.js +71 -72
  170. package/dist/botlit/pages/AgentsListPage.js.map +1 -1
  171. package/dist/botlit/pages/AiOperationsPage.d.ts +2 -0
  172. package/dist/botlit/pages/AiOperationsPage.js +52 -53
  173. package/dist/botlit/pages/AiOperationsPage.js.map +1 -1
  174. package/dist/botlit/pages/BotChannelsTab.d.ts +7 -0
  175. package/dist/botlit/pages/BotChannelsTab.js +120 -122
  176. package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
  177. package/dist/botlit/pages/BotDetailPage.d.ts +7 -0
  178. package/dist/botlit/pages/BotDetailPage.js +353 -358
  179. package/dist/botlit/pages/BotDetailPage.js.map +1 -1
  180. package/dist/botlit/pages/BotWorkflowTab.d.ts +11 -0
  181. package/dist/botlit/pages/BotWorkflowTab.js +20 -21
  182. package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
  183. package/dist/botlit/pages/BotsListPage.d.ts +2 -0
  184. package/dist/botlit/pages/BotsListPage.js +52 -53
  185. package/dist/botlit/pages/BotsListPage.js.map +1 -1
  186. package/dist/botlit/pages/BucketsPage.d.ts +2 -0
  187. package/dist/botlit/pages/BucketsPage.js +260 -261
  188. package/dist/botlit/pages/BucketsPage.js.map +1 -1
  189. package/dist/botlit/pages/ChannelDetailPage.d.ts +6 -0
  190. package/dist/botlit/pages/ChannelDetailPage.js +97 -96
  191. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
  192. package/dist/botlit/pages/ChannelRoutesPage.d.ts +2 -0
  193. package/dist/botlit/pages/ChannelRoutesPage.js +23 -24
  194. package/dist/botlit/pages/ChannelRoutesPage.js.map +1 -1
  195. package/dist/botlit/pages/ChannelsPage.d.ts +2 -0
  196. package/dist/botlit/pages/ChannelsPage.js +44 -45
  197. package/dist/botlit/pages/ChannelsPage.js.map +1 -1
  198. package/dist/botlit/pages/ChatPage.d.ts +1 -0
  199. package/dist/botlit/pages/ChatPage.js +10 -11
  200. package/dist/botlit/pages/ChatPage.js.map +1 -1
  201. package/dist/botlit/pages/ConversationDetailPage.d.ts +2 -0
  202. package/dist/botlit/pages/ConversationsPage.d.ts +2 -0
  203. package/dist/botlit/pages/DashboardPage.d.ts +2 -0
  204. package/dist/botlit/pages/DashboardPage.js +37 -38
  205. package/dist/botlit/pages/DashboardPage.js.map +1 -1
  206. package/dist/botlit/pages/ExecutionDetailPage.d.ts +2 -0
  207. package/dist/botlit/pages/ExecutionDetailPage.js +47 -48
  208. package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -1
  209. package/dist/botlit/pages/ExecutionsPage.d.ts +2 -0
  210. package/dist/botlit/pages/ExecutionsPage.js +72 -70
  211. package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
  212. package/dist/botlit/pages/InstalledPackagesPage.d.ts +2 -0
  213. package/dist/botlit/pages/InstalledPackagesPage.js +77 -78
  214. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
  215. package/dist/botlit/pages/KnowledgeBaseDetailPage.d.ts +6 -0
  216. package/dist/botlit/pages/KnowledgeBaseDetailPage.js +171 -181
  217. package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -1
  218. package/dist/botlit/pages/KnowledgeBasesPage.d.ts +2 -0
  219. package/dist/botlit/pages/KnowledgeBasesPage.js +30 -31
  220. package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
  221. package/dist/botlit/pages/MCPServerDetailPage.d.ts +6 -0
  222. package/dist/botlit/pages/MCPServerDetailPage.js +82 -83
  223. package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -1
  224. package/dist/botlit/pages/MCPServersPage.d.ts +2 -0
  225. package/dist/botlit/pages/MCPServersPage.js +54 -55
  226. package/dist/botlit/pages/MCPServersPage.js.map +1 -1
  227. package/dist/botlit/pages/PoliciesPage.d.ts +2 -0
  228. package/dist/botlit/pages/PoliciesPage.js +25 -26
  229. package/dist/botlit/pages/PoliciesPage.js.map +1 -1
  230. package/dist/botlit/pages/PolicyDetailPage.d.ts +6 -0
  231. package/dist/botlit/pages/PolicyDetailPage.js +257 -259
  232. package/dist/botlit/pages/PolicyDetailPage.js.map +1 -1
  233. package/dist/botlit/pages/PromptStudioPage.d.ts +2 -0
  234. package/dist/botlit/pages/PromptStudioPage.js +35 -35
  235. package/dist/botlit/pages/PromptStudioPage.js.map +1 -1
  236. package/dist/botlit/pages/PromptTemplateDetailPage.d.ts +6 -0
  237. package/dist/botlit/pages/PromptTemplateDetailPage.js +363 -362
  238. package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -1
  239. package/dist/botlit/pages/PromptTemplatesPage.d.ts +2 -0
  240. package/dist/botlit/pages/PromptTemplatesPage.js +26 -27
  241. package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -1
  242. package/dist/botlit/pages/RetrievalProfileDetailPage.d.ts +6 -0
  243. package/dist/botlit/pages/RetrievalProfileDetailPage.js +150 -158
  244. package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -1
  245. package/dist/botlit/pages/RetrievalProfilesPage.d.ts +2 -0
  246. package/dist/botlit/pages/RetrievalProfilesPage.js +24 -25
  247. package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
  248. package/dist/botlit/pages/SettingsPage.d.ts +2 -0
  249. package/dist/botlit/pages/SettingsPage.js +124 -125
  250. package/dist/botlit/pages/SettingsPage.js.map +1 -1
  251. package/dist/botlit/pages/SkillDetailPage.d.ts +6 -0
  252. package/dist/botlit/pages/SkillDetailPage.js +216 -217
  253. package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
  254. package/dist/botlit/pages/SkillsPage.d.ts +2 -0
  255. package/dist/botlit/pages/SkillsPage.js +24 -25
  256. package/dist/botlit/pages/SkillsPage.js.map +1 -1
  257. package/dist/botlit/pages/StorePackageDetailPage.d.ts +2 -0
  258. package/dist/botlit/pages/StorePackageDetailPage.js +38 -39
  259. package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
  260. package/dist/botlit/pages/StorePage.d.ts +2 -0
  261. package/dist/botlit/pages/StorePage.js +135 -136
  262. package/dist/botlit/pages/StorePage.js.map +1 -1
  263. package/dist/botlit/pages/index.d.ts +39 -0
  264. package/dist/botlit/permissions/PermissionRequired.d.ts +20 -0
  265. package/dist/botlit/permissions/PermissionRequired.js +10 -11
  266. package/dist/botlit/permissions/PermissionRequired.js.map +1 -1
  267. package/dist/botlit/permissions/botmanorPermissions.d.ts +82 -0
  268. package/dist/botlit/permissions/botmanorPermissions.js +1 -2
  269. package/dist/botlit/permissions/botmanorPermissions.js.map +1 -1
  270. package/dist/botlit/permissions/index.d.ts +7 -0
  271. package/dist/botlit/permissions/index.js +4 -3
  272. package/dist/botlit/permissions/useBotmanorPermissions.d.ts +41 -0
  273. package/dist/botlit/permissions/useBotmanorPermissions.js +1 -2
  274. package/dist/botlit/permissions/useBotmanorPermissions.js.map +1 -1
  275. package/dist/botlit/providers/BotlitProvider.d.ts +14 -0
  276. package/dist/botlit/providers/BotlitProvider.js +3 -3
  277. package/dist/botlit/providers/BotlitProvider.js.map +1 -1
  278. package/dist/botlit/store/botlitStore.d.ts +85 -0
  279. package/dist/botlit/store/botlitStore.js +1 -2
  280. package/dist/botlit/store/botlitStore.js.map +1 -1
  281. package/dist/botlit/store/renamedKeyStorage.d.ts +13 -0
  282. package/dist/botlit/store/renamedKeyStorage.js +1 -2
  283. package/dist/botlit/store/renamedKeyStorage.js.map +1 -1
  284. package/dist/botlit/types/index.d.ts +1008 -0
  285. package/dist/botlit/utils/cn.d.ts +2 -0
  286. package/dist/botlit/utils/cn.js +1 -2
  287. package/dist/botlit/utils/cn.js.map +1 -1
  288. package/dist/botlit/utils/embedding-models.d.ts +9 -0
  289. package/dist/botlit/utils/embedding-models.js +1 -2
  290. package/dist/botlit/utils/embedding-models.js.map +1 -1
  291. package/dist/botlit/utils/errors.d.ts +19 -0
  292. package/dist/botlit/utils/errors.js +1 -2
  293. package/dist/botlit/utils/errors.js.map +1 -1
  294. package/dist/botlit/utils/formatters.d.ts +38 -0
  295. package/dist/botlit/utils/formatters.js +0 -1
  296. package/dist/botlit/utils/formatters.js.map +1 -1
  297. package/dist/botlit/utils/navigation.d.ts +19 -0
  298. package/dist/botlit/utils/navigation.js +1 -2
  299. package/dist/botlit/utils/navigation.js.map +1 -1
  300. package/dist/botlit/utils/policyConfig.d.ts +68 -0
  301. package/dist/botlit/utils/policyConfig.js +2 -3
  302. package/dist/botlit/utils/policyConfig.js.map +1 -1
  303. package/dist/botlit/utils/unions.d.ts +25 -0
  304. package/dist/botlit/utils/unions.js +1 -2
  305. package/dist/botlit/utils/unions.js.map +1 -1
  306. package/dist/dev/App.d.ts +2 -0
  307. package/dist/dev/main.d.ts +0 -0
  308. package/dist/generated/global-operations.d.ts +197 -0
  309. package/dist/generated/global-operations.js +1 -2
  310. package/dist/generated/global-operations.js.map +1 -1
  311. package/dist/generated/global-types.d.ts +27678 -0
  312. package/dist/generated/global-types.js +1 -2
  313. package/dist/generated/global-types.js.map +1 -1
  314. package/dist/generated/wspace-operations.d.ts +5489 -0
  315. package/dist/generated/wspace-operations.js +64 -60
  316. package/dist/generated/wspace-operations.js.map +1 -1
  317. package/dist/generated/wspace-types.d.ts +152017 -0
  318. package/dist/generated/wspace-types.js +1 -2
  319. package/dist/generated/wspace-types.js.map +1 -1
  320. package/dist/index.d.ts +5 -0
  321. package/dist/shared/hooks/useTr.d.ts +16 -0
  322. package/dist/shared/hooks/useTr.js +1 -2
  323. package/dist/shared/hooks/useTr.js.map +1 -1
  324. package/dist/stories/Badge.stories.d.ts +11 -0
  325. package/dist/stories/Button.stories.d.ts +13 -0
  326. package/dist/stories/EmptyState.stories.d.ts +8 -0
  327. package/dist/stories/StatusBadge.stories.d.ts +9 -0
  328. package/dist/test/fixtures.d.ts +39 -0
  329. package/dist/test/happydom.d.ts +1 -0
  330. package/dist/test/renderPage.d.ts +18 -0
  331. package/dist/test/setup.d.ts +9 -0
  332. package/dist/utils/nativeBridge.d.ts +2 -0
  333. package/dist/utils/nativeBridge.js +1 -2
  334. package/package.json +87 -60
@@ -1,6 +1,6 @@
1
1
  import { AlertDialog as e, AlertDialogAction as t, AlertDialogCancel as n, AlertDialogContent as r, AlertDialogDescription as i, AlertDialogFooter as a, AlertDialogHeader as o, AlertDialogTitle as s } from "@burdenoff/fe-libs/ui";
2
2
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
3
- //#region src/botlit/components/QuotaExhaustedDialog.tsx
3
+ // src/botlit/components/QuotaExhaustedDialog.tsx
4
4
  function u({ open: u, title: d, description: f, onClose: p, onViewBilling: m }) {
5
5
  return /* @__PURE__ */ c(e, {
6
6
  open: u,
@@ -14,7 +14,6 @@ function u({ open: u, title: d, description: f, onClose: p, onViewBilling: m })
14
14
  })] })] })
15
15
  });
16
16
  }
17
- //#endregion
18
17
  export { u as QuotaExhaustedDialog };
19
18
 
20
19
  //# sourceMappingURL=QuotaExhaustedDialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QuotaExhaustedDialog.js","names":[],"sources":["../../../src/botlit/components/QuotaExhaustedDialog.tsx"],"sourcesContent":["import {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@burdenoff/fe-libs/ui';\n\ninterface QuotaExhaustedDialogProps {\n open: boolean;\n title: string;\n description: string;\n onClose: () => void;\n onViewBilling: () => void;\n}\n\nexport function QuotaExhaustedDialog({\n open,\n title,\n description,\n onClose,\n onViewBilling,\n}: QuotaExhaustedDialogProps) {\n return (\n <AlertDialog open={open} onOpenChange={(nextOpen) => !nextOpen && onClose()}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n <AlertDialogDescription>{description}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel onClick={onClose}>Dismiss</AlertDialogCancel>\n <AlertDialogAction onClick={onViewBilling}>View Billing</AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n"],"mappings":";;;AAmBA,SAAgB,EAAqB,EACnC,SACA,UACA,gBACA,YACA,oBAC4B;AAC5B,QACE,kBAAC,GAAD;EAAmB;EAAM,eAAe,MAAa,CAAC,KAAY,GAAS;YACzE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAmB,GAAyB,CAAA,EAC5C,kBAAC,GAAD,EAAA,UAAyB,GAAqC,CAAA,CAC5C,EAAA,CAAA,EACpB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;GAAmB,SAAS;aAAS;GAA2B,CAAA,EAChE,kBAAC,GAAD;GAAmB,SAAS;aAAe;GAAgC,CAAA,CACzD,EAAA,CAAA,CACD,EAAA,CAAA;EACT,CAAA"}
1
+ {"version":3,"file":"QuotaExhaustedDialog.js","names":["QuotaExhaustedDialog","AlertDialog","nextOpen","onClose","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","title","AlertDialogDescription","description","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","onViewBilling"],"sources":["../../../src/botlit/components/QuotaExhaustedDialog.tsx"],"sourcesContent":["import {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from '@burdenoff/fe-libs/ui';\n\ninterface QuotaExhaustedDialogProps {\n open: boolean;\n title: string;\n description: string;\n onClose: () => void;\n onViewBilling: () => void;\n}\n\nexport function QuotaExhaustedDialog({\n open,\n title,\n description,\n onClose,\n onViewBilling,\n}: QuotaExhaustedDialogProps) {\n return (\n <AlertDialog open={open} onOpenChange={(nextOpen) => !nextOpen && onClose()}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n <AlertDialogDescription>{description}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel onClick={onClose}>Dismiss</AlertDialogCancel>\n <AlertDialogAction onClick={onViewBilling}>View Billing</AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n"],"mappings":";;;AAmBA,SAAgBA,EAAqB,EACnC,SACA,UACA,gBACA,YACA,oBAC4B;CAC5B,OACE,kBAACC,GAAD;EAAmB;EAAM,eAAe,MAAa,CAACC,KAAYC,EAAQ;EACxE,UAAA,kBAACC,GAAD,EAAA,UAAA,CACE,kBAACC,GAAD,EAAA,UAAA,CACE,kBAACC,GAAD,EAAA,UAAmBC,EAAwB,CAAA,GAC3C,kBAACC,GAAD,EAAA,UAAyBC,EAAoC,CAAA,CAC5C,EAAA,CAAA,GACnB,kBAACC,GAAD,EAAA,UAAA,CACE,kBAACC,GAAD;GAAmB,SAASR;GAAS,UAAA;EAA0B,CAAA,GAC/D,kBAACS,GAAD;GAAmB,SAASC;GAAe,UAAA;EAA+B,CAAA,CACzD,EAAA,CAAA,CACD,EAAA,CAAA;CACT,CAAA;AAEjB"}
@@ -0,0 +1,2 @@
1
+ import { FC } from 'react';
2
+ export declare const RetentionStatusPanel: FC;
@@ -1,16 +1,16 @@
1
- import { formatRelativeTime as e } from "../utils/formatters.js";
2
- import { BOTMANOR_PERMISSIONS as t } from "../permissions/botmanorPermissions.js";
3
- import { BotmanorPermissionGate as n } from "../permissions/useBotmanorPermissions.js";
4
- import { Button as r } from "./Button.js";
5
- import "../permissions/index.js";
6
- import { Card as i, CardContent as a, CardDescription as o, CardHeader as s, CardTitle as c } from "./Card.js";
7
- import { Badge as l } from "./Badge.js";
8
- import { useApplyRetention as u, useRetentionStatus as d } from "../hooks/useRetention.js";
1
+ import { Card as e, CardContent as t, CardDescription as n, CardHeader as r, CardTitle as i } from "./Card.js";
2
+ import { BOTMANOR_PERMISSIONS as a } from "../permissions/botmanorPermissions.js";
3
+ import { BotmanorPermissionGate as o } from "../permissions/useBotmanorPermissions.js";
4
+ import { Button as s } from "./Button.js";
5
+ import { Badge as c } from "./Badge.js";
9
6
  import "../hooks/index.js";
7
+ import { formatRelativeTime as l } from "../utils/formatters.js";
8
+ import { useApplyRetention as u, useRetentionStatus as d } from "../hooks/useRetention.js";
9
+ import "../permissions/index.js";
10
10
  import { jsx as f, jsxs as p } from "react/jsx-runtime";
11
11
  import { Archive as m, RefreshCw as h } from "lucide-react";
12
12
  import { toast as g } from "sonner";
13
- //#region src/botlit/components/RetentionStatusPanel.tsx
13
+ // src/botlit/components/RetentionStatusPanel.tsx
14
14
  function _(e, t) {
15
15
  return e == null ? "Kept for the life of the workspace" : e === 0 ? t : `${e} day${e === 1 ? "" : "s"}`;
16
16
  }
@@ -26,23 +26,23 @@ var v = () => {
26
26
  };
27
27
  if (b) return null;
28
28
  let T = v?.recentRuns[0];
29
- return /* @__PURE__ */ p(i, {
29
+ return /* @__PURE__ */ p(e, {
30
30
  "data-testid": "retention-status-panel",
31
- children: [/* @__PURE__ */ f(s, {
31
+ children: [/* @__PURE__ */ f(r, {
32
32
  className: "pb-2",
33
33
  children: /* @__PURE__ */ p("div", {
34
34
  className: "flex flex-wrap items-start justify-between gap-3",
35
- children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ p(c, {
35
+ children: [/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ p(i, {
36
36
  className: "flex items-center gap-2 text-base",
37
37
  children: [/* @__PURE__ */ f(m, { size: 18 }), "Data retention"]
38
- }), /* @__PURE__ */ p(o, { children: [
38
+ }), /* @__PURE__ */ p(n, { children: [
39
39
  "Active retention policies are enforced every hour. When a workspace is deleted, its BotManor data is erased after",
40
40
  " ",
41
41
  v ? `${v.endOfTermErasureGraceDays} days` : "the grace period",
42
42
  "."
43
- ] })] }), /* @__PURE__ */ f(n, {
44
- permission: t.POLICY_UPDATE,
45
- children: /* @__PURE__ */ f(r, {
43
+ ] })] }), /* @__PURE__ */ f(o, {
44
+ permission: a.POLICY_UPDATE,
45
+ children: /* @__PURE__ */ f(s, {
46
46
  variant: "outline",
47
47
  size: "sm",
48
48
  leftIcon: /* @__PURE__ */ f(h, { size: 14 }),
@@ -53,7 +53,7 @@ var v = () => {
53
53
  })
54
54
  })]
55
55
  })
56
- }), /* @__PURE__ */ f(a, { children: y && !v ? /* @__PURE__ */ f("div", { className: "h-16 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }) : v ? /* @__PURE__ */ p("div", {
56
+ }), /* @__PURE__ */ f(t, { children: y && !v ? /* @__PURE__ */ f("div", { className: "h-16 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }) : v ? /* @__PURE__ */ p("div", {
57
57
  className: "grid grid-cols-1 sm:grid-cols-3 gap-4 text-sm",
58
58
  children: [
59
59
  /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("p", {
@@ -77,7 +77,7 @@ var v = () => {
77
77
  children: "Last pass"
78
78
  }), T ? /* @__PURE__ */ p("p", {
79
79
  className: "font-medium flex flex-wrap items-center gap-2",
80
- children: [/* @__PURE__ */ f("span", { children: e(T.finishedAt) }), /* @__PURE__ */ f(l, {
80
+ children: [/* @__PURE__ */ f("span", { children: l(T.finishedAt) }), /* @__PURE__ */ f(c, {
81
81
  variant: T.status === "COMPLETED" ? "success" : "destructive",
82
82
  children: T.status === "COMPLETED" ? `${T.executionsPurged + T.a2aMessagesPurged} erased` : "Failed"
83
83
  })]
@@ -89,7 +89,6 @@ var v = () => {
89
89
  }) : null })]
90
90
  });
91
91
  };
92
- //#endregion
93
92
  export { v as RetentionStatusPanel };
94
93
 
95
94
  //# sourceMappingURL=RetentionStatusPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RetentionStatusPanel.js","names":[],"sources":["../../../src/botlit/components/RetentionStatusPanel.tsx"],"sourcesContent":["/**\n * Retention status panel (BOFF-9661)\n * @module botlit/components\n *\n * Shows the retention periods in force for the workspace (the shortest of its\n * ACTIVE retention policies), the end-of-term erasure grace period and the\n * most recent retention passes, and lets a policy editor run a pass now.\n */\n\nimport type { FC } from 'react';\nimport { toast } from 'sonner';\nimport { Archive, RefreshCw } from 'lucide-react';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from './Card';\nimport { Button } from './Button';\nimport { Badge } from './Badge';\nimport { useApplyRetention, useRetentionStatus } from '../hooks';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nfunction describePeriod(days: number | null | undefined, zeroLabel: string): string {\n if (days === null || days === undefined) return 'Kept for the life of the workspace';\n if (days === 0) return zeroLabel;\n return `${days} day${days === 1 ? '' : 's'}`;\n}\n\nexport const RetentionStatusPanel: FC = () => {\n const { data: status, loading, error, refetch } = useRetentionStatus();\n const { apply, loading: applying } = useApplyRetention();\n\n const handleApply = async () => {\n try {\n const run = await apply();\n if (run.status === 'COMPLETED') {\n toast.success(\n `Retention applied: ${run.executionsPurged} run payloads and ${run.a2aMessagesPurged} agent messages erased`\n );\n } else {\n toast.error(run.errorMessage ?? 'The retention pass failed');\n }\n } catch (applyError) {\n toast.error(applyError instanceof Error ? applyError.message : 'Failed to apply retention');\n }\n await refetch();\n };\n\n if (error) {\n return null;\n }\n\n const lastRun = status?.recentRuns[0];\n\n return (\n <Card data-testid=\"retention-status-panel\">\n <CardHeader className=\"pb-2\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Archive size={18} />\n Data retention\n </CardTitle>\n <CardDescription>\n Active retention policies are enforced every hour. When a workspace is deleted, its\n BotManor data is erased after{' '}\n {status ? `${status.endOfTermErasureGraceDays} days` : 'the grace period'}.\n </CardDescription>\n </div>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.POLICY_UPDATE}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n leftIcon={<RefreshCw size={14} />}\n onClick={() => void handleApply()}\n isLoading={applying}\n disabled={loading || !status || status.activePolicyCount === 0}\n >\n Apply now\n </Button>\n </BotmanorPermissionGate>\n </div>\n </CardHeader>\n <CardContent>\n {loading && !status ? (\n <div className=\"h-16 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n ) : status ? (\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Run inputs and outputs</p>\n <p className=\"font-medium\" data-testid=\"retention-execution-days\">\n {describePeriod(status.executionDataRetentionDays, 'Erased when the run ends')}\n </p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Assistant conversations</p>\n <p className=\"font-medium\" data-testid=\"retention-conversation-days\">\n {describePeriod(status.conversationRetentionDays, 'Erased when the run ends')}\n </p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Last pass</p>\n {lastRun ? (\n <p className=\"font-medium flex flex-wrap items-center gap-2\">\n <span>{formatRelativeTime(lastRun.finishedAt)}</span>\n <Badge variant={lastRun.status === 'COMPLETED' ? 'success' : 'destructive'}>\n {lastRun.status === 'COMPLETED'\n ? `${lastRun.executionsPurged + lastRun.a2aMessagesPurged} erased`\n : 'Failed'}\n </Badge>\n </p>\n ) : (\n <p className=\"font-medium\">\n {status.activePolicyCount === 0 ? 'No active retention policy' : 'Not run yet'}\n </p>\n )}\n </div>\n </div>\n ) : null}\n </CardContent>\n </Card>\n );\n};\n"],"mappings":";;;;;;;;;;;;;AAmBA,SAAS,EAAe,GAAiC,GAA2B;AAGlF,QAFI,KAAS,OAAmC,uCAC5C,MAAS,IAAU,IAChB,GAAG,EAAK,MAAM,MAAS,IAAI,KAAK;;AAGzC,IAAa,UAAiC;CAC5C,IAAM,EAAE,MAAM,GAAQ,YAAS,UAAO,eAAY,GAAoB,EAChE,EAAE,UAAO,SAAS,MAAa,GAAmB,EAElD,IAAc,YAAY;AAC9B,MAAI;GACF,IAAM,IAAM,MAAM,GAAO;AACzB,GAAI,EAAI,WAAW,cACjB,EAAM,QACJ,sBAAsB,EAAI,iBAAiB,oBAAoB,EAAI,kBAAkB,wBACtF,GAED,EAAM,MAAM,EAAI,gBAAgB,4BAA4B;WAEvD,GAAY;AACnB,KAAM,MAAM,aAAsB,QAAQ,EAAW,UAAU,4BAA4B;;AAE7F,QAAM,GAAS;;AAGjB,KAAI,EACF,QAAO;CAGT,IAAM,IAAU,GAAQ,WAAW;AAEnC,QACE,kBAAC,GAAD;EAAM,eAAY;YAAlB,CACE,kBAAC,GAAD;GAAY,WAAU;aACpB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;KAAW,WAAU;eAArB,CACE,kBAAC,GAAD,EAAS,MAAM,IAAM,CAAA,EAAA,iBAEX;QACZ,kBAAC,GAAD,EAAA,UAAA;KAAiB;KAEe;KAC7B,IAAS,GAAG,EAAO,0BAA0B,SAAS;KAAmB;KAC1D,EAAA,CAAA,CACd,EAAA,CAAA,EACN,kBAAC,GAAD;KAAwB,YAAY,EAAqB;eACvD,kBAAC,GAAD;MACE,SAAQ;MACR,MAAK;MACL,UAAU,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;MACjC,eAAe,KAAK,GAAa;MACjC,WAAW;MACX,UAAU,KAAW,CAAC,KAAU,EAAO,sBAAsB;gBAC9D;MAEQ,CAAA;KACc,CAAA,CACrB;;GACK,CAAA,EACb,kBAAC,GAAD,EAAA,UACG,KAAW,CAAC,IACX,kBAAC,OAAD,EAAK,WAAU,+DAAgE,CAAA,GAC7E,IACF,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;KAAG,WAAU;eAAsB;KAA0B,CAAA,EAC7D,kBAAC,KAAD;KAAG,WAAU;KAAc,eAAY;eACpC,EAAe,EAAO,4BAA4B,2BAA2B;KAC5E,CAAA,CACA,EAAA,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;KAAG,WAAU;eAAsB;KAA2B,CAAA,EAC9D,kBAAC,KAAD;KAAG,WAAU;KAAc,eAAY;eACpC,EAAe,EAAO,2BAA2B,2BAA2B;KAC3E,CAAA,CACA,EAAA,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;KAAG,WAAU;eAAsB;KAAa,CAAA,EAC/C,IACC,kBAAC,KAAD;KAAG,WAAU;eAAb,CACE,kBAAC,QAAD,EAAA,UAAO,EAAmB,EAAQ,WAAW,EAAQ,CAAA,EACrD,kBAAC,GAAD;MAAO,SAAS,EAAQ,WAAW,cAAc,YAAY;gBAC1D,EAAQ,WAAW,cAChB,GAAG,EAAQ,mBAAmB,EAAQ,kBAAkB,WACxD;MACE,CAAA,CACN;SAEJ,kBAAC,KAAD;KAAG,WAAU;eACV,EAAO,sBAAsB,IAAI,+BAA+B;KAC/D,CAAA,CAEF,EAAA,CAAA;IACF;OACJ,MACQ,CAAA,CACT"}
1
+ {"version":3,"file":"RetentionStatusPanel.js","names":["describePeriod","days","zeroLabel","RetentionStatusPanel","status","useRetentionStatus","applying","useApplyRetention","handleApply","run","apply","toast","applyError","refetch","error","lastRun","Card","CardHeader","CardTitle","Archive","CardDescription","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Button","RefreshCw","loading","CardContent","formatRelativeTime","Badge"],"sources":["../../../src/botlit/components/RetentionStatusPanel.tsx"],"sourcesContent":["/**\n * Retention status panel (BOFF-9661)\n * @module botlit/components\n *\n * Shows the retention periods in force for the workspace (the shortest of its\n * ACTIVE retention policies), the end-of-term erasure grace period and the\n * most recent retention passes, and lets a policy editor run a pass now.\n */\n\nimport type { FC } from 'react';\nimport { toast } from 'sonner';\nimport { Archive, RefreshCw } from 'lucide-react';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from './Card';\nimport { Button } from './Button';\nimport { Badge } from './Badge';\nimport { useApplyRetention, useRetentionStatus } from '../hooks';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nfunction describePeriod(days: number | null | undefined, zeroLabel: string): string {\n if (days === null || days === undefined) return 'Kept for the life of the workspace';\n if (days === 0) return zeroLabel;\n return `${days} day${days === 1 ? '' : 's'}`;\n}\n\nexport const RetentionStatusPanel: FC = () => {\n const { data: status, loading, error, refetch } = useRetentionStatus();\n const { apply, loading: applying } = useApplyRetention();\n\n const handleApply = async () => {\n try {\n const run = await apply();\n if (run.status === 'COMPLETED') {\n toast.success(\n `Retention applied: ${run.executionsPurged} run payloads and ${run.a2aMessagesPurged} agent messages erased`\n );\n } else {\n toast.error(run.errorMessage ?? 'The retention pass failed');\n }\n } catch (applyError) {\n toast.error(applyError instanceof Error ? applyError.message : 'Failed to apply retention');\n }\n await refetch();\n };\n\n if (error) {\n return null;\n }\n\n const lastRun = status?.recentRuns[0];\n\n return (\n <Card data-testid=\"retention-status-panel\">\n <CardHeader className=\"pb-2\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Archive size={18} />\n Data retention\n </CardTitle>\n <CardDescription>\n Active retention policies are enforced every hour. When a workspace is deleted, its\n BotManor data is erased after{' '}\n {status ? `${status.endOfTermErasureGraceDays} days` : 'the grace period'}.\n </CardDescription>\n </div>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.POLICY_UPDATE}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n leftIcon={<RefreshCw size={14} />}\n onClick={() => void handleApply()}\n isLoading={applying}\n disabled={loading || !status || status.activePolicyCount === 0}\n >\n Apply now\n </Button>\n </BotmanorPermissionGate>\n </div>\n </CardHeader>\n <CardContent>\n {loading && !status ? (\n <div className=\"h-16 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n ) : status ? (\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Run inputs and outputs</p>\n <p className=\"font-medium\" data-testid=\"retention-execution-days\">\n {describePeriod(status.executionDataRetentionDays, 'Erased when the run ends')}\n </p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Assistant conversations</p>\n <p className=\"font-medium\" data-testid=\"retention-conversation-days\">\n {describePeriod(status.conversationRetentionDays, 'Erased when the run ends')}\n </p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Last pass</p>\n {lastRun ? (\n <p className=\"font-medium flex flex-wrap items-center gap-2\">\n <span>{formatRelativeTime(lastRun.finishedAt)}</span>\n <Badge variant={lastRun.status === 'COMPLETED' ? 'success' : 'destructive'}>\n {lastRun.status === 'COMPLETED'\n ? `${lastRun.executionsPurged + lastRun.a2aMessagesPurged} erased`\n : 'Failed'}\n </Badge>\n </p>\n ) : (\n <p className=\"font-medium\">\n {status.activePolicyCount === 0 ? 'No active retention policy' : 'Not run yet'}\n </p>\n )}\n </div>\n </div>\n ) : null}\n </CardContent>\n </Card>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { FC } from 'react';
2
+ /**
3
+ * The single loading surface for BotManor — a calm glass-skeleton scaffold
4
+ * (header + metric row + content block) instead of a bare spinner, so a cold
5
+ * load reads as the page settling in rather than a hole in the middle of an
6
+ * otherwise fully-drawn shell.
7
+ *
8
+ * It is deliberately used for EVERY pre-content state — the lazy
9
+ * implementation chunk, the gateway-client handshake and the per-route lazy
10
+ * page — so the content region never flips between loading idioms (and never
11
+ * goes empty) between first paint and the page rendering.
12
+ *
13
+ * Boff UI 2.0: semantic tokens only, shimmer gated behind `motion-safe` so it
14
+ * is static under `prefers-reduced-motion`.
15
+ */
16
+ export interface RouteLoaderProps {
17
+ /**
18
+ * Announced to assistive tech and shown under the skeleton. Defaults to a
19
+ * generic BotManor message; pass a route-specific one where it helps.
20
+ */
21
+ label?: string;
22
+ }
23
+ export declare const RouteLoader: FC<RouteLoaderProps>;
@@ -1,7 +1,7 @@
1
1
  import { useTr as e } from "../../shared/hooks/useTr.js";
2
2
  import { GlassCard as t } from "@burdenoff/fe-libs/ui";
3
3
  import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
- //#region src/botlit/components/RouteLoader.tsx
4
+ // src/botlit/components/RouteLoader.tsx
5
5
  var i = ({ label: i }) => {
6
6
  let a = e(), o = i ?? a("botlit.common.loadingBotlit", "Loading BotManor…");
7
7
  return /* @__PURE__ */ r("div", {
@@ -50,7 +50,6 @@ var i = ({ label: i }) => {
50
50
  ]
51
51
  });
52
52
  };
53
- //#endregion
54
53
  export { i as RouteLoader };
55
54
 
56
55
  //# sourceMappingURL=RouteLoader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RouteLoader.js","names":[],"sources":["../../../src/botlit/components/RouteLoader.tsx"],"sourcesContent":["/**\n * Route Loader\n * @module botlit/components\n */\n\nimport type { FC } from 'react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { useTr } from '../../shared/hooks/useTr';\n\n/**\n * The single loading surface for BotManor — a calm glass-skeleton scaffold\n * (header + metric row + content block) instead of a bare spinner, so a cold\n * load reads as the page settling in rather than a hole in the middle of an\n * otherwise fully-drawn shell.\n *\n * It is deliberately used for EVERY pre-content state — the lazy\n * implementation chunk, the gateway-client handshake and the per-route lazy\n * page — so the content region never flips between loading idioms (and never\n * goes empty) between first paint and the page rendering.\n *\n * Boff UI 2.0: semantic tokens only, shimmer gated behind `motion-safe` so it\n * is static under `prefers-reduced-motion`.\n */\nexport interface RouteLoaderProps {\n /**\n * Announced to assistive tech and shown under the skeleton. Defaults to a\n * generic BotManor message; pass a route-specific one where it helps.\n */\n label?: string;\n}\n\nexport const RouteLoader: FC<RouteLoaderProps> = ({ label }) => {\n const t = useTr();\n const resolvedLabel = label ?? t('botlit.common.loadingBotlit', 'Loading BotManor…');\n return (\n <div\n className=\"mx-auto flex w-full max-w-6xl flex-col gap-6 px-4 py-6 sm:px-6\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n aria-label={label}\n >\n {/* Header skeleton */}\n <div className=\"flex flex-col gap-3\">\n <div className=\"h-7 w-48 rounded-md bg-muted/60 motion-safe:animate-vc-shimmer\" />\n <div className=\"h-4 w-72 max-w-full rounded bg-muted/40 motion-safe:animate-vc-shimmer\" />\n </div>\n\n {/* Metric row skeleton */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {[0, 1, 2].map((index) => (\n <GlassCard\n key={index}\n treatment=\"metric\"\n className=\"flex flex-col gap-3 border-border-seam p-5\"\n >\n <div className=\"h-3 w-20 rounded bg-muted/50 motion-safe:animate-vc-shimmer\" />\n <div className=\"h-8 w-24 rounded-md bg-muted/60 motion-safe:animate-vc-shimmer\" />\n </GlassCard>\n ))}\n </div>\n\n {/* Content block skeleton */}\n <GlassCard treatment=\"glass\" className=\"flex flex-col gap-4 border-border-seam p-6\">\n {[0, 1, 2, 3].map((index) => (\n <div key={index} className=\"flex items-center gap-4\">\n <div className=\"h-10 w-10 shrink-0 rounded-full bg-muted/50 motion-safe:animate-vc-shimmer\" />\n <div className=\"flex flex-1 flex-col gap-2\">\n <div className=\"h-4 w-1/3 rounded bg-muted/50 motion-safe:animate-vc-shimmer\" />\n <div className=\"h-3 w-2/3 rounded bg-muted/30 motion-safe:animate-vc-shimmer\" />\n </div>\n </div>\n ))}\n </GlassCard>\n\n <p className=\"text-center text-sm text-text-secondary\">{resolvedLabel}</p>\n </div>\n );\n};\n"],"mappings":";;;;AA+BA,IAAa,KAAqC,EAAE,eAAY;CAC9D,IAAM,IAAI,GAAO,EACX,IAAgB,KAAS,EAAE,+BAA+B,oBAAoB;AACpF,QACE,kBAAC,OAAD;EACE,WAAU;EACV,MAAK;EACL,aAAU;EACV,aAAU;EACV,cAAY;YALd;GAQE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAK,WAAU,kEAAmE,CAAA,EAClF,kBAAC,OAAD,EAAK,WAAU,0EAA2E,CAAA,CACtF;;GAGN,kBAAC,OAAD;IAAK,WAAU;cACZ;KAAC;KAAG;KAAG;KAAE,CAAC,KAAK,MACd,kBAAC,GAAD;KAEE,WAAU;KACV,WAAU;eAHZ,CAKE,kBAAC,OAAD,EAAK,WAAU,+DAAgE,CAAA,EAC/E,kBAAC,OAAD,EAAK,WAAU,kEAAmE,CAAA,CACxE;OANL,EAMK,CACZ;IACE,CAAA;GAGN,kBAAC,GAAD;IAAW,WAAU;IAAQ,WAAU;cACpC;KAAC;KAAG;KAAG;KAAG;KAAE,CAAC,KAAK,MACjB,kBAAC,OAAD;KAAiB,WAAU;eAA3B,CACE,kBAAC,OAAD,EAAK,WAAU,8EAA+E,CAAA,EAC9F,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD,EAAK,WAAU,gEAAiE,CAAA,EAChF,kBAAC,OAAD,EAAK,WAAU,gEAAiE,CAAA,CAC5E;QACF;OANI,EAMJ,CACN;IACQ,CAAA;GAEZ,kBAAC,KAAD;IAAG,WAAU;cAA2C;IAAkB,CAAA;GACtE"}
1
+ {"version":3,"file":"RouteLoader.js","names":["RouteLoader","t","useTr","resolvedLabel","label","GlassCard","index"],"sources":["../../../src/botlit/components/RouteLoader.tsx"],"sourcesContent":["/**\n * Route Loader\n * @module botlit/components\n */\n\nimport type { FC } from 'react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { useTr } from '../../shared/hooks/useTr';\n\n/**\n * The single loading surface for BotManor — a calm glass-skeleton scaffold\n * (header + metric row + content block) instead of a bare spinner, so a cold\n * load reads as the page settling in rather than a hole in the middle of an\n * otherwise fully-drawn shell.\n *\n * It is deliberately used for EVERY pre-content state — the lazy\n * implementation chunk, the gateway-client handshake and the per-route lazy\n * page — so the content region never flips between loading idioms (and never\n * goes empty) between first paint and the page rendering.\n *\n * Boff UI 2.0: semantic tokens only, shimmer gated behind `motion-safe` so it\n * is static under `prefers-reduced-motion`.\n */\nexport interface RouteLoaderProps {\n /**\n * Announced to assistive tech and shown under the skeleton. Defaults to a\n * generic BotManor message; pass a route-specific one where it helps.\n */\n label?: string;\n}\n\nexport const RouteLoader: FC<RouteLoaderProps> = ({ label }) => {\n const t = useTr();\n const resolvedLabel = label ?? t('botlit.common.loadingBotlit', 'Loading BotManor…');\n return (\n <div\n className=\"mx-auto flex w-full max-w-6xl flex-col gap-6 px-4 py-6 sm:px-6\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n aria-label={label}\n >\n {/* Header skeleton */}\n <div className=\"flex flex-col gap-3\">\n <div className=\"h-7 w-48 rounded-md bg-muted/60 motion-safe:animate-vc-shimmer\" />\n <div className=\"h-4 w-72 max-w-full rounded bg-muted/40 motion-safe:animate-vc-shimmer\" />\n </div>\n\n {/* Metric row skeleton */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {[0, 1, 2].map((index) => (\n <GlassCard\n key={index}\n treatment=\"metric\"\n className=\"flex flex-col gap-3 border-border-seam p-5\"\n >\n <div className=\"h-3 w-20 rounded bg-muted/50 motion-safe:animate-vc-shimmer\" />\n <div className=\"h-8 w-24 rounded-md bg-muted/60 motion-safe:animate-vc-shimmer\" />\n </GlassCard>\n ))}\n </div>\n\n {/* Content block skeleton */}\n <GlassCard treatment=\"glass\" className=\"flex flex-col gap-4 border-border-seam p-6\">\n {[0, 1, 2, 3].map((index) => (\n <div key={index} className=\"flex items-center gap-4\">\n <div className=\"h-10 w-10 shrink-0 rounded-full bg-muted/50 motion-safe:animate-vc-shimmer\" />\n <div className=\"flex flex-1 flex-col gap-2\">\n <div className=\"h-4 w-1/3 rounded bg-muted/50 motion-safe:animate-vc-shimmer\" />\n <div className=\"h-3 w-2/3 rounded bg-muted/30 motion-safe:animate-vc-shimmer\" />\n </div>\n </div>\n ))}\n </GlassCard>\n\n <p className=\"text-center text-sm text-text-secondary\">{resolvedLabel}</p>\n </div>\n );\n};\n"],"mappings":";;;;AA+BA,IAAaA,KAAqC,EAAE,eAAY;CAC9D,IAAMC,IAAIC,EAAM,GACVC,IAAgBC,KAASH,EAAE,+BAA+B,mBAAmB;CACnF,OACE,kBAAC,OAAD;EACE,WAAU;EACV,MAAK;EACL,aAAU;EACV,aAAU;EACV,cAAYG;EALd,UAAA;GAQE,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,OAAD,EAAK,WAAU,iEAAkE,CAAA,GACjF,kBAAC,OAAD,EAAK,WAAU,yEAA0E,CAAA,CACtF;;GAGL,kBAAC,OAAD;IAAK,WAAU;IACZ,UAAA;KAAC;KAAG;KAAG;IAAC,CAAC,CAAC,KAAK,MACd,kBAACC,GAAD;KAEE,WAAU;KACV,WAAU;KAHZ,UAAA,CAKE,kBAAC,OAAD,EAAK,WAAU,8DAA+D,CAAA,GAC9E,kBAAC,OAAD,EAAK,WAAU,iEAAkE,CAAA,CACxE;IANJ,GAAAC,CAMI,CACZ;GACE,CAAA;GAGL,kBAACD,GAAD;IAAW,WAAU;IAAQ,WAAU;IACpC,UAAA;KAAC;KAAG;KAAG;KAAG;IAAC,CAAC,CAAC,KAAK,MACjB,kBAAC,OAAD;KAAiB,WAAU;KAA3B,UAAA,CACE,kBAAC,OAAD,EAAK,WAAU,6EAA8E,CAAA,GAC7F,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAAC,OAAD,EAAK,WAAU,+DAAgE,CAAA,GAC/E,kBAAC,OAAD,EAAK,WAAU,+DAAgE,CAAA,CAC5E;KACF,CAAA,CAAA;IANK,GAAAC,CAML,CACN;GACQ,CAAA;GAEX,kBAAC,KAAD;IAAG,WAAU;IAA2C,UAAAH;GAAiB,CAAA;EACtE;;AAET"}
@@ -0,0 +1,12 @@
1
+ import { FC } from 'react';
2
+ interface VersionHistoryPanelProps {
3
+ agentId: string;
4
+ /** The agent's current draft version id (if any) — enables the Publish action. */
5
+ draftVersionId?: string | null;
6
+ /** The agent's current live (published) version id — hidden from the rollback list. */
7
+ currentVersionId?: string | null;
8
+ /** Called after a successful publish or rollback so the caller can refetch the agent itself. */
9
+ onChanged?: () => void;
10
+ }
11
+ export declare const VersionHistoryPanel: FC<VersionHistoryPanelProps>;
12
+ export {};
@@ -1,23 +1,23 @@
1
1
  import { useTr as e } from "../../shared/hooks/useTr.js";
2
- import { useAgentVersions as t, usePublishAgentVersion as n, useRollbackAgentVersion as r } from "../hooks/useAgents.js";
3
- import { formatRelativeTime as i } from "../utils/formatters.js";
4
- import { BOTMANOR_PERMISSIONS as a } from "../permissions/botmanorPermissions.js";
5
- import { BotmanorPermissionGate as o } from "../permissions/useBotmanorPermissions.js";
6
- import { Button as s } from "./Button.js";
2
+ import { Card as t, CardContent as n, CardDescription as r, CardHeader as i, CardTitle as a } from "./Card.js";
3
+ import { Button as o } from "./Button.js";
4
+ import { BOTMANOR_PERMISSIONS as s } from "../permissions/botmanorPermissions.js";
5
+ import { BotmanorPermissionGate as c } from "../permissions/useBotmanorPermissions.js";
6
+ import { Badge as l } from "./Badge.js";
7
+ import { useAgentVersions as u, usePublishAgentVersion as d, useRollbackAgentVersion as f } from "../hooks/useAgents.js";
8
+ import { formatRelativeTime as p } from "../utils/formatters.js";
7
9
  import "../permissions/index.js";
8
- import { Card as c, CardContent as l, CardDescription as u, CardHeader as d, CardTitle as f } from "./Card.js";
9
- import { Badge as p } from "./Badge.js";
10
10
  import { useState as m } from "react";
11
11
  import { AlertDialog as h, AlertDialogAction as g, AlertDialogCancel as _, AlertDialogContent as v, AlertDialogDescription as y, AlertDialogFooter as b, AlertDialogHeader as x, AlertDialogTitle as S, Dialog as ee, DialogContent as C, DialogDescription as w, DialogFooter as T, DialogHeader as E, DialogTitle as D, Textarea as O } from "@burdenoff/fe-libs/ui";
12
12
  import { jsx as k, jsxs as A } from "react/jsx-runtime";
13
13
  import { CheckCircle2 as j, History as M, Rocket as N, RotateCcw as P } from "lucide-react";
14
14
  import { toast as F } from "sonner";
15
- //#region src/botlit/components/VersionHistoryPanel.tsx
15
+ // src/botlit/components/VersionHistoryPanel.tsx
16
16
  function I(e) {
17
17
  return e === "DRAFT" ? "secondary" : e === "PUBLISHED" ? "success" : "outline";
18
18
  }
19
19
  var L = ({ agentId: L, draftVersionId: R, currentVersionId: te, onChanged: z }) => {
20
- let B = e(), { data: V, loading: H, refetch: U } = t(L), [W, G] = n(), [K, q] = r(), [J, Y] = m(!1), [X, Z] = m(""), [Q, $] = m(null), ne = async () => {
20
+ let B = e(), { data: V, loading: H, refetch: U } = u(L), [W, G] = d(), [K, q] = f(), [J, Y] = m(!1), [X, Z] = m(""), [Q, $] = m(null), ne = async () => {
21
21
  if (R) try {
22
22
  let e = await W({
23
23
  agentId: L,
@@ -42,20 +42,20 @@ var L = ({ agentId: L, draftVersionId: R, currentVersionId: te, onChanged: z })
42
42
  return /* @__PURE__ */ A("div", {
43
43
  className: "space-y-6",
44
44
  children: [
45
- /* @__PURE__ */ A(c, { children: [/* @__PURE__ */ A(d, {
45
+ /* @__PURE__ */ A(t, { children: [/* @__PURE__ */ A(i, {
46
46
  className: "flex flex-row items-start justify-between gap-4",
47
- children: [/* @__PURE__ */ A("div", { children: [/* @__PURE__ */ A(f, {
47
+ children: [/* @__PURE__ */ A("div", { children: [/* @__PURE__ */ A(a, {
48
48
  className: "flex items-center gap-2",
49
49
  children: [/* @__PURE__ */ k(M, { size: 18 }), B("botlit.agentDetail.versions.title", "Version History")]
50
- }), /* @__PURE__ */ k(u, { children: B("botlit.agentDetail.versions.description", "Every published configuration change, with a diff-able changelog. Publish the current draft or roll back to any prior version.") })] }), R && /* @__PURE__ */ k(o, {
51
- permission: a.AGENT_PUBLISH,
52
- children: /* @__PURE__ */ k(s, {
50
+ }), /* @__PURE__ */ k(r, { children: B("botlit.agentDetail.versions.description", "Every published configuration change, with a diff-able changelog. Publish the current draft or roll back to any prior version.") })] }), R && /* @__PURE__ */ k(c, {
51
+ permission: s.AGENT_PUBLISH,
52
+ children: /* @__PURE__ */ k(o, {
53
53
  leftIcon: /* @__PURE__ */ k(N, { size: 16 }),
54
54
  onClick: () => Y(!0),
55
55
  children: B("botlit.agentDetail.versions.publishDraft", "Publish Draft")
56
56
  })
57
57
  })]
58
- }), /* @__PURE__ */ k(l, { children: H ? /* @__PURE__ */ k("div", { className: "h-32 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }) : V.length === 0 ? /* @__PURE__ */ k("p", {
58
+ }), /* @__PURE__ */ k(n, { children: H ? /* @__PURE__ */ k("div", { className: "h-32 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }) : V.length === 0 ? /* @__PURE__ */ k("p", {
59
59
  className: "text-text-secondary",
60
60
  children: B("botlit.agentDetail.versions.empty", "No version history yet.")
61
61
  }) : /* @__PURE__ */ k("ul", {
@@ -74,11 +74,11 @@ var L = ({ agentId: L, draftVersionId: R, currentVersionId: te, onChanged: z })
74
74
  className: "font-mono font-medium",
75
75
  children: ["v", e.version]
76
76
  }),
77
- /* @__PURE__ */ k(p, {
77
+ /* @__PURE__ */ k(l, {
78
78
  variant: I(e.status),
79
79
  children: e.status
80
80
  }),
81
- t && /* @__PURE__ */ A(p, {
81
+ t && /* @__PURE__ */ A(l, {
82
82
  variant: "outline",
83
83
  className: "flex items-center gap-1",
84
84
  children: [/* @__PURE__ */ k(j, { size: 12 }), B("botlit.agentDetail.versions.liveNow", "Live now")]
@@ -91,12 +91,12 @@ var L = ({ agentId: L, draftVersionId: R, currentVersionId: te, onChanged: z })
91
91
  }),
92
92
  /* @__PURE__ */ k("p", {
93
93
  className: "text-xs text-text-secondary",
94
- children: e.status === "DRAFT" ? `${B("botlit.agentDetail.versions.updated", "Updated")} ${i(e.createdAt)}` : `${B("botlit.agentDetail.versions.published", "Published")} ${i(e.publishedAt ?? e.createdAt)}`
94
+ children: e.status === "DRAFT" ? `${B("botlit.agentDetail.versions.updated", "Updated")} ${p(e.createdAt)}` : `${B("botlit.agentDetail.versions.published", "Published")} ${p(e.publishedAt ?? e.createdAt)}`
95
95
  })
96
96
  ]
97
- }), n && /* @__PURE__ */ k(o, {
98
- permission: a.AGENT_ROLLBACK,
99
- children: /* @__PURE__ */ k(s, {
97
+ }), n && /* @__PURE__ */ k(c, {
98
+ permission: s.AGENT_ROLLBACK,
99
+ children: /* @__PURE__ */ k(o, {
100
100
  variant: "outline",
101
101
  size: "sm",
102
102
  leftIcon: /* @__PURE__ */ k(P, { size: 14 }),
@@ -118,11 +118,11 @@ var L = ({ agentId: L, draftVersionId: R, currentVersionId: te, onChanged: z })
118
118
  placeholder: B("botlit.agentDetail.versions.publishDialog.placeholder", "e.g. Tightened the system prompt and switched to gpt-4o"),
119
119
  rows: 4
120
120
  }),
121
- /* @__PURE__ */ A(T, { children: [/* @__PURE__ */ k(s, {
121
+ /* @__PURE__ */ A(T, { children: [/* @__PURE__ */ k(o, {
122
122
  variant: "outline",
123
123
  onClick: () => Y(!1),
124
124
  children: B("botlit.common.cancel", "Cancel")
125
- }), /* @__PURE__ */ k(s, {
125
+ }), /* @__PURE__ */ k(o, {
126
126
  isLoading: G.loading,
127
127
  onClick: () => void ne(),
128
128
  children: B("botlit.agentDetail.versions.publishDialog.confirm", "Publish")
@@ -144,7 +144,6 @@ var L = ({ agentId: L, draftVersionId: R, currentVersionId: te, onChanged: z })
144
144
  ]
145
145
  });
146
146
  };
147
- //#endregion
148
147
  export { L as VersionHistoryPanel };
149
148
 
150
149
  //# sourceMappingURL=VersionHistoryPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VersionHistoryPanel.js","names":[],"sources":["../../../src/botlit/components/VersionHistoryPanel.tsx"],"sourcesContent":["/**\n * Version History Panel (BOFF-4381)\n * @module botlit/components\n *\n * Real, discoverable UI for agent versioning: shows the full version\n * history (draft/published/historical), lets a workspace admin publish the\n * current draft with a changelog, and roll back to any prior published\n * version with a confirmation step.\n */\n\nimport { useState, type FC } from 'react';\nimport { History, Rocket, RotateCcw, CheckCircle2 } from 'lucide-react';\nimport { toast } from 'sonner';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from './Card';\nimport { Button } from './Button';\nimport { Badge } from './Badge';\nimport {\n useAgentVersions,\n usePublishAgentVersion,\n useRollbackAgentVersion,\n type AgentVersionRecord,\n} from '../hooks/useAgents';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\ninterface VersionHistoryPanelProps {\n agentId: string;\n /** The agent's current draft version id (if any) — enables the Publish action. */\n draftVersionId?: string | null;\n /** The agent's current live (published) version id — hidden from the rollback list. */\n currentVersionId?: string | null;\n /** Called after a successful publish or rollback so the caller can refetch the agent itself. */\n onChanged?: () => void;\n}\n\nfunction versionStatusVariant(\n status: AgentVersionRecord['status']\n): 'secondary' | 'success' | 'outline' {\n if (status === 'DRAFT') return 'secondary';\n if (status === 'PUBLISHED') return 'success';\n return 'outline';\n}\n\nexport const VersionHistoryPanel: FC<VersionHistoryPanelProps> = ({\n agentId,\n draftVersionId,\n currentVersionId,\n onChanged,\n}) => {\n const t = useTr();\n\n const { data: versions, loading, refetch } = useAgentVersions(agentId);\n const [publishAgentVersion, publishState] = usePublishAgentVersion();\n const [rollbackAgentVersion, rollbackState] = useRollbackAgentVersion();\n\n const [publishOpen, setPublishOpen] = useState(false);\n const [changelogDraft, setChangelogDraft] = useState('');\n const [rollbackTarget, setRollbackTarget] = useState<AgentVersionRecord | null>(null);\n\n const handlePublish = async (): Promise<void> => {\n if (!draftVersionId) return;\n try {\n const published = await publishAgentVersion({\n agentId,\n versionId: draftVersionId,\n changelog: changelogDraft,\n });\n toast.success(\n `${t('botlit.agentDetail.versions.publishSuccessPrefix', 'Published version')} ${published.version}`\n );\n setPublishOpen(false);\n setChangelogDraft('');\n await refetch();\n onChanged?.();\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.agentDetail.versions.publishError', 'Failed to publish version')\n );\n }\n };\n\n const handleRollback = async (): Promise<void> => {\n if (!rollbackTarget) return;\n try {\n const restored = await rollbackAgentVersion({ agentId, targetVersionId: rollbackTarget.id });\n toast.success(\n `${t('botlit.agentDetail.versions.rollbackSuccessPrefix', 'Rolled back to version')} ${rollbackTarget.version} (${t('botlit.agentDetail.versions.rollbackSuccessSuffix', 'now')} ${restored.version})`\n );\n setRollbackTarget(null);\n await refetch();\n onChanged?.();\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.agentDetail.versions.rollbackError', 'Failed to roll back agent version')\n );\n }\n };\n\n return (\n <div className=\"space-y-6\">\n <Card>\n <CardHeader className=\"flex flex-row items-start justify-between gap-4\">\n <div>\n <CardTitle className=\"flex items-center gap-2\">\n <History size={18} />\n {t('botlit.agentDetail.versions.title', 'Version History')}\n </CardTitle>\n <CardDescription>\n {t(\n 'botlit.agentDetail.versions.description',\n 'Every published configuration change, with a diff-able changelog. Publish the current draft or roll back to any prior version.'\n )}\n </CardDescription>\n </div>\n {draftVersionId && (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_PUBLISH}>\n <Button leftIcon={<Rocket size={16} />} onClick={() => setPublishOpen(true)}>\n {t('botlit.agentDetail.versions.publishDraft', 'Publish Draft')}\n </Button>\n </BotmanorPermissionGate>\n )}\n </CardHeader>\n <CardContent>\n {loading ? (\n <div className=\"h-32 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n ) : versions.length === 0 ? (\n <p className=\"text-text-secondary\">\n {t('botlit.agentDetail.versions.empty', 'No version history yet.')}\n </p>\n ) : (\n <ul className=\"space-y-3\">\n {versions.map((version) => {\n const isCurrent = version.id === currentVersionId;\n const canRollback = version.status !== 'DRAFT' && !isCurrent;\n return (\n <li\n key={version.id}\n className=\"flex items-start justify-between gap-4 p-4 border border-border-subtle rounded-lg\"\n >\n <div className=\"space-y-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-mono font-medium\">v{version.version}</span>\n <Badge variant={versionStatusVariant(version.status)}>\n {version.status}\n </Badge>\n {isCurrent && (\n <Badge variant=\"outline\" className=\"flex items-center gap-1\">\n <CheckCircle2 size={12} />\n {t('botlit.agentDetail.versions.liveNow', 'Live now')}\n </Badge>\n )}\n </div>\n <p className=\"text-sm text-text-secondary break-words\">\n {version.changelog ||\n t('botlit.agentDetail.versions.noChangelog', 'No description')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {version.status === 'DRAFT'\n ? `${t('botlit.agentDetail.versions.updated', 'Updated')} ${formatRelativeTime(version.createdAt)}`\n : `${t('botlit.agentDetail.versions.published', 'Published')} ${formatRelativeTime(version.publishedAt ?? version.createdAt)}`}\n </p>\n </div>\n {canRollback && (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_ROLLBACK}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n leftIcon={<RotateCcw size={14} />}\n onClick={() => setRollbackTarget(version)}\n >\n {t('botlit.agentDetail.versions.rollback', 'Roll back')}\n </Button>\n </BotmanorPermissionGate>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </CardContent>\n </Card>\n\n {/* Publish dialog */}\n <Dialog open={publishOpen} onOpenChange={setPublishOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n {t('botlit.agentDetail.versions.publishDialog.title', 'Publish this version')}\n </DialogTitle>\n <DialogDescription>\n {t(\n 'botlit.agentDetail.versions.publishDialog.description',\n \"This makes the draft's prompt, model, tools, and policy settings live for the agent. Describe what changed.\"\n )}\n </DialogDescription>\n </DialogHeader>\n <Textarea\n value={changelogDraft}\n onChange={(e) => setChangelogDraft(e.target.value)}\n placeholder={t(\n 'botlit.agentDetail.versions.publishDialog.placeholder',\n 'e.g. Tightened the system prompt and switched to gpt-4o'\n )}\n rows={4}\n />\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setPublishOpen(false)}>\n {t('botlit.common.cancel', 'Cancel')}\n </Button>\n <Button isLoading={publishState.loading} onClick={() => void handlePublish()}>\n {t('botlit.agentDetail.versions.publishDialog.confirm', 'Publish')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Rollback confirmation */}\n <AlertDialog\n open={rollbackTarget !== null}\n onOpenChange={(open) => !open && setRollbackTarget(null)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {t('botlit.agentDetail.versions.rollbackDialog.title', 'Roll back to this version?')}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {rollbackTarget &&\n `${t('botlit.agentDetail.versions.rollbackDialog.descriptionPrefix', 'This immediately restores the agent to version')} ${rollbackTarget.version}${t('botlit.agentDetail.versions.rollbackDialog.descriptionSuffix', '. The current live config is kept in history and can be restored the same way.')}`}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel onClick={() => setRollbackTarget(null)}>\n {t('botlit.common.cancel', 'Cancel')}\n </AlertDialogCancel>\n <AlertDialogAction\n disabled={rollbackState.loading}\n onClick={() => void handleRollback()}\n >\n {t('botlit.agentDetail.versions.rollbackDialog.confirm', 'Roll back')}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"VersionHistoryPanel.js","names":["versionStatusVariant","status","VersionHistoryPanel","t","useTr","versions","useAgentVersions","agentId","publishAgentVersion","publishState","usePublishAgentVersion","rollbackAgentVersion","rollbackState","useRollbackAgentVersion","publishOpen","setPublishOpen","useState","changelogDraft","setChangelogDraft","rollbackTarget","setRollbackTarget","handlePublish","draftVersionId","published","toast","refetch","onChanged","err","handleRollback","restored","Card","CardHeader","CardTitle","History","CardDescription","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Button","Rocket","CardContent","loading","isCurrent","version","currentVersionId","canRollback","Badge","CheckCircle2","formatRelativeTime","RotateCcw","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Textarea","DialogFooter","AlertDialog","open","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction"],"sources":["../../../src/botlit/components/VersionHistoryPanel.tsx"],"sourcesContent":["/**\n * Version History Panel (BOFF-4381)\n * @module botlit/components\n *\n * Real, discoverable UI for agent versioning: shows the full version\n * history (draft/published/historical), lets a workspace admin publish the\n * current draft with a changelog, and roll back to any prior published\n * version with a confirmation step.\n */\n\nimport { useState, type FC } from 'react';\nimport { History, Rocket, RotateCcw, CheckCircle2 } from 'lucide-react';\nimport { toast } from 'sonner';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from './Card';\nimport { Button } from './Button';\nimport { Badge } from './Badge';\nimport {\n useAgentVersions,\n usePublishAgentVersion,\n useRollbackAgentVersion,\n type AgentVersionRecord,\n} from '../hooks/useAgents';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\ninterface VersionHistoryPanelProps {\n agentId: string;\n /** The agent's current draft version id (if any) — enables the Publish action. */\n draftVersionId?: string | null;\n /** The agent's current live (published) version id — hidden from the rollback list. */\n currentVersionId?: string | null;\n /** Called after a successful publish or rollback so the caller can refetch the agent itself. */\n onChanged?: () => void;\n}\n\nfunction versionStatusVariant(\n status: AgentVersionRecord['status']\n): 'secondary' | 'success' | 'outline' {\n if (status === 'DRAFT') return 'secondary';\n if (status === 'PUBLISHED') return 'success';\n return 'outline';\n}\n\nexport const VersionHistoryPanel: FC<VersionHistoryPanelProps> = ({\n agentId,\n draftVersionId,\n currentVersionId,\n onChanged,\n}) => {\n const t = useTr();\n\n const { data: versions, loading, refetch } = useAgentVersions(agentId);\n const [publishAgentVersion, publishState] = usePublishAgentVersion();\n const [rollbackAgentVersion, rollbackState] = useRollbackAgentVersion();\n\n const [publishOpen, setPublishOpen] = useState(false);\n const [changelogDraft, setChangelogDraft] = useState('');\n const [rollbackTarget, setRollbackTarget] = useState<AgentVersionRecord | null>(null);\n\n const handlePublish = async (): Promise<void> => {\n if (!draftVersionId) return;\n try {\n const published = await publishAgentVersion({\n agentId,\n versionId: draftVersionId,\n changelog: changelogDraft,\n });\n toast.success(\n `${t('botlit.agentDetail.versions.publishSuccessPrefix', 'Published version')} ${published.version}`\n );\n setPublishOpen(false);\n setChangelogDraft('');\n await refetch();\n onChanged?.();\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.agentDetail.versions.publishError', 'Failed to publish version')\n );\n }\n };\n\n const handleRollback = async (): Promise<void> => {\n if (!rollbackTarget) return;\n try {\n const restored = await rollbackAgentVersion({ agentId, targetVersionId: rollbackTarget.id });\n toast.success(\n `${t('botlit.agentDetail.versions.rollbackSuccessPrefix', 'Rolled back to version')} ${rollbackTarget.version} (${t('botlit.agentDetail.versions.rollbackSuccessSuffix', 'now')} ${restored.version})`\n );\n setRollbackTarget(null);\n await refetch();\n onChanged?.();\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.agentDetail.versions.rollbackError', 'Failed to roll back agent version')\n );\n }\n };\n\n return (\n <div className=\"space-y-6\">\n <Card>\n <CardHeader className=\"flex flex-row items-start justify-between gap-4\">\n <div>\n <CardTitle className=\"flex items-center gap-2\">\n <History size={18} />\n {t('botlit.agentDetail.versions.title', 'Version History')}\n </CardTitle>\n <CardDescription>\n {t(\n 'botlit.agentDetail.versions.description',\n 'Every published configuration change, with a diff-able changelog. Publish the current draft or roll back to any prior version.'\n )}\n </CardDescription>\n </div>\n {draftVersionId && (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_PUBLISH}>\n <Button leftIcon={<Rocket size={16} />} onClick={() => setPublishOpen(true)}>\n {t('botlit.agentDetail.versions.publishDraft', 'Publish Draft')}\n </Button>\n </BotmanorPermissionGate>\n )}\n </CardHeader>\n <CardContent>\n {loading ? (\n <div className=\"h-32 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n ) : versions.length === 0 ? (\n <p className=\"text-text-secondary\">\n {t('botlit.agentDetail.versions.empty', 'No version history yet.')}\n </p>\n ) : (\n <ul className=\"space-y-3\">\n {versions.map((version) => {\n const isCurrent = version.id === currentVersionId;\n const canRollback = version.status !== 'DRAFT' && !isCurrent;\n return (\n <li\n key={version.id}\n className=\"flex items-start justify-between gap-4 p-4 border border-border-subtle rounded-lg\"\n >\n <div className=\"space-y-1 min-w-0\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-mono font-medium\">v{version.version}</span>\n <Badge variant={versionStatusVariant(version.status)}>\n {version.status}\n </Badge>\n {isCurrent && (\n <Badge variant=\"outline\" className=\"flex items-center gap-1\">\n <CheckCircle2 size={12} />\n {t('botlit.agentDetail.versions.liveNow', 'Live now')}\n </Badge>\n )}\n </div>\n <p className=\"text-sm text-text-secondary break-words\">\n {version.changelog ||\n t('botlit.agentDetail.versions.noChangelog', 'No description')}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {version.status === 'DRAFT'\n ? `${t('botlit.agentDetail.versions.updated', 'Updated')} ${formatRelativeTime(version.createdAt)}`\n : `${t('botlit.agentDetail.versions.published', 'Published')} ${formatRelativeTime(version.publishedAt ?? version.createdAt)}`}\n </p>\n </div>\n {canRollback && (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_ROLLBACK}>\n <Button\n variant=\"outline\"\n size=\"sm\"\n leftIcon={<RotateCcw size={14} />}\n onClick={() => setRollbackTarget(version)}\n >\n {t('botlit.agentDetail.versions.rollback', 'Roll back')}\n </Button>\n </BotmanorPermissionGate>\n )}\n </li>\n );\n })}\n </ul>\n )}\n </CardContent>\n </Card>\n\n {/* Publish dialog */}\n <Dialog open={publishOpen} onOpenChange={setPublishOpen}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>\n {t('botlit.agentDetail.versions.publishDialog.title', 'Publish this version')}\n </DialogTitle>\n <DialogDescription>\n {t(\n 'botlit.agentDetail.versions.publishDialog.description',\n \"This makes the draft's prompt, model, tools, and policy settings live for the agent. Describe what changed.\"\n )}\n </DialogDescription>\n </DialogHeader>\n <Textarea\n value={changelogDraft}\n onChange={(e) => setChangelogDraft(e.target.value)}\n placeholder={t(\n 'botlit.agentDetail.versions.publishDialog.placeholder',\n 'e.g. Tightened the system prompt and switched to gpt-4o'\n )}\n rows={4}\n />\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setPublishOpen(false)}>\n {t('botlit.common.cancel', 'Cancel')}\n </Button>\n <Button isLoading={publishState.loading} onClick={() => void handlePublish()}>\n {t('botlit.agentDetail.versions.publishDialog.confirm', 'Publish')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n {/* Rollback confirmation */}\n <AlertDialog\n open={rollbackTarget !== null}\n onOpenChange={(open) => !open && setRollbackTarget(null)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {t('botlit.agentDetail.versions.rollbackDialog.title', 'Roll back to this version?')}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {rollbackTarget &&\n `${t('botlit.agentDetail.versions.rollbackDialog.descriptionPrefix', 'This immediately restores the agent to version')} ${rollbackTarget.version}${t('botlit.agentDetail.versions.rollbackDialog.descriptionSuffix', '. The current live config is kept in history and can be restored the same way.')}`}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel onClick={() => setRollbackTarget(null)}>\n {t('botlit.common.cancel', 'Cancel')}\n </AlertDialogCancel>\n <AlertDialogAction\n disabled={rollbackState.loading}\n onClick={() => void handleRollback()}\n >\n {t('botlit.agentDetail.versions.rollbackDialog.confirm', 'Roll back')}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { FC } from 'react';
2
+ /**
3
+ * Shown when BotManor is mounted without an active workspace.
4
+ *
5
+ * Every BotManor query is workspace-scoped and every write is rejected without
6
+ * `x-workspace-id`, so the module genuinely cannot run — but a single muted
7
+ * sentence in a tall empty region reads as a broken page. This uses the shared
8
+ * guidance pattern (purpose → illustrated zero state → next steps) so the user
9
+ * is told what BotManor is for and what to do next, and the steps land on real
10
+ * routes the moment a workspace becomes active.
11
+ */
12
+ export interface WorkspaceRequiredProps {
13
+ /** Absolute path BotManor is mounted at in the host shell, e.g. `/botmanor`. */
14
+ basePath: string;
15
+ /** Host shell navigation. Absent in standalone/dev mounts. */
16
+ navigate?: (path: string) => void;
17
+ }
18
+ export declare const WorkspaceRequired: FC<WorkspaceRequiredProps>;
@@ -3,7 +3,7 @@ import { joinPath as t } from "../utils/navigation.js";
3
3
  import { EmphasisPanel as n, IllustratedEmptyState as r, NextSteps as i, PagePurpose as a } from "@burdenoff/fe-libs/ui";
4
4
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
5
5
  import { Bot as c, MessagesSquare as l, Sparkles as u } from "lucide-react";
6
- //#region src/botlit/components/WorkspaceRequired.tsx
6
+ // src/botlit/components/WorkspaceRequired.tsx
7
7
  var d = ({ basePath: d, navigate: f }) => {
8
8
  let p = e(), m = (e) => {
9
9
  f?.(t(d, e));
@@ -65,7 +65,6 @@ var d = ({ basePath: d, navigate: f }) => {
65
65
  ]
66
66
  });
67
67
  };
68
- //#endregion
69
68
  export { d as WorkspaceRequired };
70
69
 
71
70
  //# sourceMappingURL=WorkspaceRequired.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspaceRequired.js","names":[],"sources":["../../../src/botlit/components/WorkspaceRequired.tsx"],"sourcesContent":["/**\n * Workspace Required Gate\n * @module botlit/components\n */\n\nimport type { FC } from 'react';\nimport { Bot, MessagesSquare, Sparkles } from 'lucide-react';\nimport {\n EmphasisPanel,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { joinPath } from '../utils/navigation';\n\n/**\n * Shown when BotManor is mounted without an active workspace.\n *\n * Every BotManor query is workspace-scoped and every write is rejected without\n * `x-workspace-id`, so the module genuinely cannot run — but a single muted\n * sentence in a tall empty region reads as a broken page. This uses the shared\n * guidance pattern (purpose → illustrated zero state → next steps) so the user\n * is told what BotManor is for and what to do next, and the steps land on real\n * routes the moment a workspace becomes active.\n */\nexport interface WorkspaceRequiredProps {\n /** Absolute path BotManor is mounted at in the host shell, e.g. `/botmanor`. */\n basePath: string;\n /** Host shell navigation. Absent in standalone/dev mounts. */\n navigate?: (path: string) => void;\n}\n\nexport const WorkspaceRequired: FC<WorkspaceRequiredProps> = ({ basePath, navigate }) => {\n const t = useTr();\n const go = (relativePath: string) => {\n navigate?.(joinPath(basePath, relativePath));\n };\n\n return (\n <div className=\"mx-auto flex h-full min-h-[60vh] w-full max-w-2xl flex-col justify-center gap-6 px-4 py-10\">\n {/* The 'story': plain-language purpose of this module for a first-time user. */}\n <PagePurpose icon={<Bot className=\"size-4\" aria-hidden=\"true\" />}>\n {t(\n 'workspaceRequired.purpose',\n 'BotManor is where you build and run AI agents — you give an agent a prompt, a model, the knowledge it may read and the tools it may call, then publish it to a channel such as web chat, Slack or an API so your team and customers can talk to it.'\n )}\n </PagePurpose>\n\n {/* The single emphasis zone for this screen: the get-started callout. */}\n <EmphasisPanel className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"onboarding\"\n title={t('workspaceRequired.emptyTitle', 'Pick a workspace to start building')}\n description={t(\n 'workspaceRequired.emptyDescription',\n 'Agents, knowledge bases and channels live inside a workspace so they stay scoped to the right team. Select or create an active workspace from the shell to load your BotManor workspace.'\n )}\n />\n </EmphasisPanel>\n\n {/* Dismissable, reopenable next-step guidance wired to real routes. */}\n <NextSteps\n storageKey=\"botlit-get-started\"\n title={t('workspaceRequired.nextStepsTitle', 'Once your workspace is active')}\n steps={[\n {\n id: 'open-agents',\n label: t('workspaceRequired.openAgents', 'Open your agents'),\n description: t(\n 'workspaceRequired.openAgentsDescription',\n 'Browse, search and manage every agent in this workspace.'\n ),\n icon: <Bot className=\"size-4\" aria-hidden=\"true\" />,\n onClick: () => go('agents'),\n },\n {\n id: 'build-agent',\n label: t('workspaceRequired.buildAgent', 'Build an agent'),\n description: t(\n 'workspaceRequired.buildAgentDescription',\n 'Pick a model, write the prompt and wire up the tools it may call.'\n ),\n icon: <Sparkles className=\"size-4\" aria-hidden=\"true\" />,\n onClick: () => go('agents/new'),\n },\n {\n id: 'connect-channel',\n label: t('workspaceRequired.connectChannel', 'Connect a channel'),\n description: t(\n 'workspaceRequired.connectChannelDescription',\n 'Publish an agent to web chat, Slack or an API so people can reach it.'\n ),\n icon: <MessagesSquare className=\"size-4\" aria-hidden=\"true\" />,\n onClick: () => go('channels'),\n },\n ]}\n />\n </div>\n );\n};\n"],"mappings":";;;;;;AAiCA,IAAa,KAAiD,EAAE,aAAU,kBAAe;CACvF,IAAM,IAAI,GAAO,EACX,KAAM,MAAyB;AACnC,MAAW,EAAS,GAAU,EAAa,CAAC;;AAG9C,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GAEE,kBAAC,GAAD;IAAa,MAAM,kBAAC,GAAD;KAAK,WAAU;KAAS,eAAY;KAAS,CAAA;cAC7D,EACC,6BACA,sPACD;IACW,CAAA;GAGd,kBAAC,GAAD;IAAe,WAAU;cACvB,kBAAC,GAAD;KACE,cAAa;KACb,OAAO,EAAE,gCAAgC,qCAAqC;KAC9E,aAAa,EACX,sCACA,2LACD;KACD,CAAA;IACY,CAAA;GAGhB,kBAAC,GAAD;IACE,YAAW;IACX,OAAO,EAAE,oCAAoC,gCAAgC;IAC7E,OAAO;KACL;MACE,IAAI;MACJ,OAAO,EAAE,gCAAgC,mBAAmB;MAC5D,aAAa,EACX,2CACA,2DACD;MACD,MAAM,kBAAC,GAAD;OAAK,WAAU;OAAS,eAAY;OAAS,CAAA;MACnD,eAAe,EAAG,SAAS;MAC5B;KACD;MACE,IAAI;MACJ,OAAO,EAAE,gCAAgC,iBAAiB;MAC1D,aAAa,EACX,2CACA,oEACD;MACD,MAAM,kBAAC,GAAD;OAAU,WAAU;OAAS,eAAY;OAAS,CAAA;MACxD,eAAe,EAAG,aAAa;MAChC;KACD;MACE,IAAI;MACJ,OAAO,EAAE,oCAAoC,oBAAoB;MACjE,aAAa,EACX,+CACA,wEACD;MACD,MAAM,kBAAC,GAAD;OAAgB,WAAU;OAAS,eAAY;OAAS,CAAA;MAC9D,eAAe,EAAG,WAAW;MAC9B;KACF;IACD,CAAA;GACE"}
1
+ {"version":3,"file":"WorkspaceRequired.js","names":["WorkspaceRequired","t","useTr","go","joinPath","basePath","relativePath","PagePurpose","Bot","EmphasisPanel","IllustratedEmptyState","NextSteps","Sparkles","MessagesSquare"],"sources":["../../../src/botlit/components/WorkspaceRequired.tsx"],"sourcesContent":["/**\n * Workspace Required Gate\n * @module botlit/components\n */\n\nimport type { FC } from 'react';\nimport { Bot, MessagesSquare, Sparkles } from 'lucide-react';\nimport {\n EmphasisPanel,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { joinPath } from '../utils/navigation';\n\n/**\n * Shown when BotManor is mounted without an active workspace.\n *\n * Every BotManor query is workspace-scoped and every write is rejected without\n * `x-workspace-id`, so the module genuinely cannot run — but a single muted\n * sentence in a tall empty region reads as a broken page. This uses the shared\n * guidance pattern (purpose → illustrated zero state → next steps) so the user\n * is told what BotManor is for and what to do next, and the steps land on real\n * routes the moment a workspace becomes active.\n */\nexport interface WorkspaceRequiredProps {\n /** Absolute path BotManor is mounted at in the host shell, e.g. `/botmanor`. */\n basePath: string;\n /** Host shell navigation. Absent in standalone/dev mounts. */\n navigate?: (path: string) => void;\n}\n\nexport const WorkspaceRequired: FC<WorkspaceRequiredProps> = ({ basePath, navigate }) => {\n const t = useTr();\n const go = (relativePath: string) => {\n navigate?.(joinPath(basePath, relativePath));\n };\n\n return (\n <div className=\"mx-auto flex h-full min-h-[60vh] w-full max-w-2xl flex-col justify-center gap-6 px-4 py-10\">\n {/* The 'story': plain-language purpose of this module for a first-time user. */}\n <PagePurpose icon={<Bot className=\"size-4\" aria-hidden=\"true\" />}>\n {t(\n 'workspaceRequired.purpose',\n 'BotManor is where you build and run AI agents — you give an agent a prompt, a model, the knowledge it may read and the tools it may call, then publish it to a channel such as web chat, Slack or an API so your team and customers can talk to it.'\n )}\n </PagePurpose>\n\n {/* The single emphasis zone for this screen: the get-started callout. */}\n <EmphasisPanel className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"onboarding\"\n title={t('workspaceRequired.emptyTitle', 'Pick a workspace to start building')}\n description={t(\n 'workspaceRequired.emptyDescription',\n 'Agents, knowledge bases and channels live inside a workspace so they stay scoped to the right team. Select or create an active workspace from the shell to load your BotManor workspace.'\n )}\n />\n </EmphasisPanel>\n\n {/* Dismissable, reopenable next-step guidance wired to real routes. */}\n <NextSteps\n storageKey=\"botlit-get-started\"\n title={t('workspaceRequired.nextStepsTitle', 'Once your workspace is active')}\n steps={[\n {\n id: 'open-agents',\n label: t('workspaceRequired.openAgents', 'Open your agents'),\n description: t(\n 'workspaceRequired.openAgentsDescription',\n 'Browse, search and manage every agent in this workspace.'\n ),\n icon: <Bot className=\"size-4\" aria-hidden=\"true\" />,\n onClick: () => go('agents'),\n },\n {\n id: 'build-agent',\n label: t('workspaceRequired.buildAgent', 'Build an agent'),\n description: t(\n 'workspaceRequired.buildAgentDescription',\n 'Pick a model, write the prompt and wire up the tools it may call.'\n ),\n icon: <Sparkles className=\"size-4\" aria-hidden=\"true\" />,\n onClick: () => go('agents/new'),\n },\n {\n id: 'connect-channel',\n label: t('workspaceRequired.connectChannel', 'Connect a channel'),\n description: t(\n 'workspaceRequired.connectChannelDescription',\n 'Publish an agent to web chat, Slack or an API so people can reach it.'\n ),\n icon: <MessagesSquare className=\"size-4\" aria-hidden=\"true\" />,\n onClick: () => go('channels'),\n },\n ]}\n />\n </div>\n );\n};\n"],"mappings":";;;;;;AAiCA,IAAaA,KAAiD,EAAE,aAAU,kBAAe;CACvF,IAAMC,IAAIC,EAAM,GACVC,KAAM,MAAyB;EACnC,IAAWC,EAASC,GAAUC,CAAY,CAAC;CAC7C;CAEA,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GAEE,kBAACC,GAAD;IAAa,MAAM,kBAACC,GAAD;KAAK,WAAU;KAAS,eAAY;IAAQ,CAAA;IAC5D,UAAAP,EACC,6BACA,qPACF;GACW,CAAA;GAGb,kBAACQ,GAAD;IAAe,WAAU;IACvB,UAAA,kBAACC,GAAD;KACE,cAAa;KACb,OAAOT,EAAE,gCAAgC,oCAAoC;KAC7E,aAAaA,EACX,sCACA,0LACF;IACD,CAAA;GACY,CAAA;GAGf,kBAACU,GAAD;IACE,YAAW;IACX,OAAOV,EAAE,oCAAoC,+BAA+B;IAC5E,OAAO;KACL;MACE,IAAI;MACJ,OAAOA,EAAE,gCAAgC,kBAAkB;MAC3D,aAAaA,EACX,2CACA,0DACF;MACA,MAAM,kBAACO,GAAD;OAAK,WAAU;OAAS,eAAY;MAAQ,CAAA;MAClD,eAAeL,EAAG,QAAQ;KAC5B;KACA;MACE,IAAI;MACJ,OAAOF,EAAE,gCAAgC,gBAAgB;MACzD,aAAaA,EACX,2CACA,mEACF;MACA,MAAM,kBAACW,GAAD;OAAU,WAAU;OAAS,eAAY;MAAQ,CAAA;MACvD,eAAeT,EAAG,YAAY;KAChC;KACA;MACE,IAAI;MACJ,OAAOF,EAAE,oCAAoC,mBAAmB;MAChE,aAAaA,EACX,+CACA,uEACF;MACA,MAAM,kBAACY,GAAD;OAAgB,WAAU;OAAS,eAAY;MAAQ,CAAA;MAC7D,eAAeV,EAAG,UAAU;KAC9B;IACF;GACD,CAAA;EACE;;AAET"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Components Index
3
+ * @module botlit/components
4
+ */
5
+ export { PageLayout } from './PageLayout';
6
+ export { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from './Card';
7
+ export { Button } from './Button';
8
+ export { Input, Textarea, Label, FormField } from './Input';
9
+ export { Badge, StatusBadge } from './Badge';
10
+ export { EmptyState } from './EmptyState';
11
+ export { ErrorState } from './ErrorState';
12
+ export { ChannelSelectorSheet } from './ChannelSelectorSheet';
13
+ export { RouteLoader, type RouteLoaderProps } from './RouteLoader';
14
+ export { WorkspaceRequired, type WorkspaceRequiredProps } from './WorkspaceRequired';
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Hooks Index
3
+ * @module botlit/hooks
4
+ */
5
+ export { useBots, useBot, useCreateBot, useUpdateBot, useDeleteBot, botKeys } from './useBots';
6
+ export { useAgents, useAgent, useCreateAgent, useUpdateAgent, useDeleteAgent, agentKeys, } from './useAgents';
7
+ export { useKnowledgeBases, useKnowledgeBase, useKnowledgeDocuments, useCreateKnowledgeBase, useUpdateKnowledgeBase, useDeleteKnowledgeBase, useRebuildKnowledgeBaseIndex, knowledgeBaseKeys, } from './useKnowledgeBases';
8
+ export type { KnowledgeBaseRecord, KnowledgeDocumentRecord } from './useKnowledgeBases';
9
+ export { useRetrievalProfiles, useRetrievalProfile, useCreateRetrievalProfile, useUpdateRetrievalProfile, useDeleteRetrievalProfile, retrievalProfileKeys, } from './useRetrievalProfiles';
10
+ export type { RetrievalProfileRecord } from './useRetrievalProfiles';
11
+ export { useMCPServers, useMCPServer, useMCPResources, useMCPTools, useCreateMCPServer, useUpdateMCPServer, useUpdateMCPTool, useDeleteMCPServer, useTestMCPConnection, isMCPServerHealthy, isMCPServerUnhealthy, mcpServerEndpoint, mcpServerDescription, mcpServerKeys, } from './useMCPServers';
12
+ export type { MCPServerRecord, MCPToolRecord, MCPResourceRecord } from './useMCPServers';
13
+ export { useA2AAgents, useA2AAgent, useRegisterA2AAgent, useUpdateA2AAgent, useDeleteA2AAgent, useValidateA2AAgent, validateAgentCard, a2aAgentSkillCount, a2aKeys, } from './useA2A';
14
+ export type { A2AAgentRecord } from './useA2A';
15
+ export { useChannelConnectors, useChannelConnector, useCreateChannelConnector, useUpdateChannelConnector, useDeleteChannelConnector, useChannelRoutes, useBotChannelRoutes, useChannelRoute, useCreateChannelRoute, useUpdateChannelRoute, useDeleteChannelRoute, routeMetadataString, channelKeys, } from './useChannels';
16
+ export type { ChannelConnectorRecord, ChannelRouteRecord } from './useChannels';
17
+ export { usePolicies, usePolicy, useCreatePolicy, useUpdatePolicy, useDeletePolicy, usePoliciesByType, policyKeys, } from './usePolicies';
18
+ export type { PolicyRecord } from './usePolicies';
19
+ export { useRetentionStatus, useApplyRetention } from './useRetention';
20
+ export type { RetentionRunRecord, RetentionStatusRecord } from './useRetention';
21
+ export { useSkills, useSkill, useCreateSkill, useUpdateSkill, useDeleteSkill, skillKeys, } from './useSkills';
22
+ export type { SkillRecord } from './useSkills';
23
+ export { usePromptTemplates, usePromptTemplate, useCreatePromptTemplate, useUpdatePromptTemplate, useDeletePromptTemplate, useRenderPromptTemplate, promptTemplateVariables, promptTemplateKeys, } from './usePromptTemplates';
24
+ export type { PromptTemplateRecord } from './usePromptTemplates';
25
+ export { useExecutions, useExecution, useCreateExecution, useUpdateExecutionStatus, useExecutionMetrics, summariseExecutions, executionKeys, } from './useExecutions';
26
+ export type { ExecutionRecord, ExecutionRollup } from './useExecutions';
27
+ export { useBuckets, useBucketTree, useBucket, useCreateBucket, useUpdateBucket, useDeleteBucket, buildBucketTree, bucketKeys, } from './useBuckets';
28
+ export type { BucketRecord, BucketTreeNode } from './useBuckets';
29
+ export { useStorePackages, useStorePackage, useInstalledPackages, useInstalledPackage, useInstallPackage, useUpdateInstalledPackage, useUninstallPackage, usePinPackageVersion, useForkPackage, useCheckPackageUpdates, storePackageName, storePackageDescription, storeKeys, } from './useStore';
30
+ export type { StoreFilter, StoreSortBy, StorePackageRecord, InstalledPackageRecord, OutdatedPackage, } from './useStore';
31
+ export { useConversations, useConversation, useSendMessage, conversationKeys, } from './useConversations';
32
+ export { useLLMProviders, useConfigureLLMProvider, llmProviderKeys } from './useLLMProviders';
33
+ export { useMyUserPlatformConnection, useInitiateSlackConnect, useCompleteSlackConnect, useLinkIntegrationConnection, useToggleSlackNotifications, useRevokeSlackConnection, useGlobalChannels, } from './useUserPlatformConnection';
34
+ export type { UserPlatformConnectionData, GlobalChannelData } from './useUserPlatformConnection';
35
+ export { useAiPredictions, useSetAiPredictionStatus, useSupervisorConfig, useConfigureSupervisor, useRunSupervisorNow, useSupervisorRuns, aiOperationsKeys, predictionSeverity, predictionSubjectName, } from './useAiOperations';
36
+ export type { AiPredictionRecord, AiPredictionsFilter, SupervisorConfigRecord, SupervisorRunRecord, RunSupervisorNowResult, } from './useAiOperations';