@burdenoff/microfe-botmanor 2026.1106.1 → 2026.1109.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/dist/botlit/BotlitRoutes.d.ts +2 -0
  2. package/dist/botlit/BotlitRoutes.js +40 -37
  3. package/dist/botlit/BotlitRoutes.js.map +1 -1
  4. package/dist/botlit/BotmanorRoot.d.ts +3 -0
  5. package/dist/botlit/BotmanorRoot.js +1 -2
  6. package/dist/botlit/BotmanorRoot.js.map +1 -1
  7. package/dist/botlit/BotmanorRootInner.d.ts +3 -0
  8. package/dist/botlit/BotmanorRootInner.js +9 -10
  9. package/dist/botlit/BotmanorRootInner.js.map +1 -1
  10. package/dist/botlit/components/AgentApprovalPanel.d.ts +20 -0
  11. package/dist/botlit/components/AgentApprovalPanel.js +49 -50
  12. package/dist/botlit/components/AgentApprovalPanel.js.map +1 -1
  13. package/dist/botlit/components/AiOperationsPanel.d.ts +14 -0
  14. package/dist/botlit/components/AiOperationsPanel.js +253 -0
  15. package/dist/botlit/components/AiOperationsPanel.js.map +1 -0
  16. package/dist/botlit/components/AssistantChannelPanel.d.ts +3 -0
  17. package/dist/botlit/components/AssistantChannelPanel.js +12 -13
  18. package/dist/botlit/components/AssistantChannelPanel.js.map +1 -1
  19. package/dist/botlit/components/AssistantRuntimeSetupPanel.d.ts +4 -0
  20. package/dist/botlit/components/AssistantRuntimeSetupPanel.js +14 -14
  21. package/dist/botlit/components/AssistantRuntimeSetupPanel.js.map +1 -1
  22. package/dist/botlit/components/AssistantWebsitePanel.d.ts +5 -0
  23. package/dist/botlit/components/AssistantWebsitePanel.js +15 -16
  24. package/dist/botlit/components/AssistantWebsitePanel.js.map +1 -1
  25. package/dist/botlit/components/Badge.d.ts +9 -0
  26. package/dist/botlit/components/Badge.js +1 -2
  27. package/dist/botlit/components/Badge.js.map +1 -1
  28. package/dist/botlit/components/Button.d.ts +10 -0
  29. package/dist/botlit/components/Button.js +1 -2
  30. package/dist/botlit/components/Button.js.map +1 -1
  31. package/dist/botlit/components/Card.d.ts +16 -0
  32. package/dist/botlit/components/Card.js +1 -2
  33. package/dist/botlit/components/Card.js.map +1 -1
  34. package/dist/botlit/components/ChannelSelectorSheet.d.ts +23 -0
  35. package/dist/botlit/components/ChannelSelectorSheet.js +1 -2
  36. package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
  37. package/dist/botlit/components/EmptyState.d.ts +12 -0
  38. package/dist/botlit/components/EmptyState.js +1 -2
  39. package/dist/botlit/components/EmptyState.js.map +1 -1
  40. package/dist/botlit/components/ErrorState.d.ts +10 -0
  41. package/dist/botlit/components/ErrorState.js +5 -6
  42. package/dist/botlit/components/ErrorState.js.map +1 -1
  43. package/dist/botlit/components/Input.d.ts +27 -0
  44. package/dist/botlit/components/Input.js +2 -3
  45. package/dist/botlit/components/Input.js.map +1 -1
  46. package/dist/botlit/components/KnowledgeSourceImportPanel.d.ts +3 -0
  47. package/dist/botlit/components/KnowledgeSourceImportPanel.js +12 -13
  48. package/dist/botlit/components/KnowledgeSourceImportPanel.js.map +1 -1
  49. package/dist/botlit/components/ModelRegistrationPanel.d.ts +5 -0
  50. package/dist/botlit/components/ModelRegistrationPanel.js +1 -2
  51. package/dist/botlit/components/ModelRegistrationPanel.js.map +1 -1
  52. package/dist/botlit/components/PageLayout.d.ts +12 -0
  53. package/dist/botlit/components/PageLayout.js +1 -2
  54. package/dist/botlit/components/PageLayout.js.map +1 -1
  55. package/dist/botlit/components/QuotaExhaustedDialog.d.ts +9 -0
  56. package/dist/botlit/components/QuotaExhaustedDialog.js +1 -2
  57. package/dist/botlit/components/QuotaExhaustedDialog.js.map +1 -1
  58. package/dist/botlit/components/RetentionStatusPanel.d.ts +2 -0
  59. package/dist/botlit/components/RetentionStatusPanel.js +18 -19
  60. package/dist/botlit/components/RetentionStatusPanel.js.map +1 -1
  61. package/dist/botlit/components/RouteLoader.d.ts +23 -0
  62. package/dist/botlit/components/RouteLoader.js +1 -2
  63. package/dist/botlit/components/RouteLoader.js.map +1 -1
  64. package/dist/botlit/components/VersionHistoryPanel.d.ts +12 -0
  65. package/dist/botlit/components/VersionHistoryPanel.js +23 -24
  66. package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
  67. package/dist/botlit/components/WorkspaceRequired.d.ts +18 -0
  68. package/dist/botlit/components/WorkspaceRequired.js +1 -2
  69. package/dist/botlit/components/WorkspaceRequired.js.map +1 -1
  70. package/dist/botlit/components/index.d.ts +14 -0
  71. package/dist/botlit/hooks/index.d.ts +36 -0
  72. package/dist/botlit/hooks/index.js +15 -13
  73. package/dist/botlit/hooks/internal/mutationInput.d.ts +56 -0
  74. package/dist/botlit/hooks/internal/mutationInput.js +1 -2
  75. package/dist/botlit/hooks/internal/mutationInput.js.map +1 -1
  76. package/dist/botlit/hooks/internal/workspaceGateway.d.ts +54 -0
  77. package/dist/botlit/hooks/internal/workspaceGateway.js +17 -19
  78. package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
  79. package/dist/botlit/hooks/useA2A.d.ts +104 -0
  80. package/dist/botlit/hooks/useA2A.js +45 -45
  81. package/dist/botlit/hooks/useA2A.js.map +1 -1
  82. package/dist/botlit/hooks/useAgentApprovals.d.ts +62 -0
  83. package/dist/botlit/hooks/useAgentApprovals.js +38 -39
  84. package/dist/botlit/hooks/useAgentApprovals.js.map +1 -1
  85. package/dist/botlit/hooks/useAgents.d.ts +105 -0
  86. package/dist/botlit/hooks/useAgents.js +53 -54
  87. package/dist/botlit/hooks/useAgents.js.map +1 -1
  88. package/dist/botlit/hooks/useAiOperations.d.ts +95 -0
  89. package/dist/botlit/hooks/useAiOperations.js +154 -0
  90. package/dist/botlit/hooks/useAiOperations.js.map +1 -0
  91. package/dist/botlit/hooks/useAssistantChannels.d.ts +16 -0
  92. package/dist/botlit/hooks/useAssistantChannels.js +1 -2
  93. package/dist/botlit/hooks/useAssistantChannels.js.map +1 -1
  94. package/dist/botlit/hooks/useAssistantRuntimeSetup.d.ts +17 -0
  95. package/dist/botlit/hooks/useAssistantRuntimeSetup.js +1 -2
  96. package/dist/botlit/hooks/useAssistantRuntimeSetup.js.map +1 -1
  97. package/dist/botlit/hooks/useAssistantWebsites.d.ts +18 -0
  98. package/dist/botlit/hooks/useAssistantWebsites.js +1 -2
  99. package/dist/botlit/hooks/useAssistantWebsites.js.map +1 -1
  100. package/dist/botlit/hooks/useBotWorkflow.d.ts +22 -0
  101. package/dist/botlit/hooks/useBotWorkflow.js +1 -2
  102. package/dist/botlit/hooks/useBotWorkflow.js.map +1 -1
  103. package/dist/botlit/hooks/useBots.d.ts +68 -0
  104. package/dist/botlit/hooks/useBots.js +32 -33
  105. package/dist/botlit/hooks/useBots.js.map +1 -1
  106. package/dist/botlit/hooks/useBuckets.d.ts +57 -0
  107. package/dist/botlit/hooks/useBuckets.js +38 -39
  108. package/dist/botlit/hooks/useBuckets.js.map +1 -1
  109. package/dist/botlit/hooks/useChannels.d.ts +87 -0
  110. package/dist/botlit/hooks/useChannels.js +73 -73
  111. package/dist/botlit/hooks/useChannels.js.map +1 -1
  112. package/dist/botlit/hooks/useConversations.d.ts +42 -0
  113. package/dist/botlit/hooks/useConversations.js +1 -2
  114. package/dist/botlit/hooks/useConversations.js.map +1 -1
  115. package/dist/botlit/hooks/useExecutions.d.ts +87 -0
  116. package/dist/botlit/hooks/useExecutions.js +37 -37
  117. package/dist/botlit/hooks/useExecutions.js.map +1 -1
  118. package/dist/botlit/hooks/useKnowledgeBases.d.ts +79 -0
  119. package/dist/botlit/hooks/useKnowledgeBases.js +40 -39
  120. package/dist/botlit/hooks/useKnowledgeBases.js.map +1 -1
  121. package/dist/botlit/hooks/useKnowledgeSourceImports.d.ts +21 -0
  122. package/dist/botlit/hooks/useKnowledgeSourceImports.js +1 -2
  123. package/dist/botlit/hooks/useKnowledgeSourceImports.js.map +1 -1
  124. package/dist/botlit/hooks/useLLMProviders.d.ts +66 -0
  125. package/dist/botlit/hooks/useLLMProviders.js +25 -26
  126. package/dist/botlit/hooks/useLLMProviders.js.map +1 -1
  127. package/dist/botlit/hooks/useMCPServers.d.ts +71 -0
  128. package/dist/botlit/hooks/useMCPServers.js +40 -38
  129. package/dist/botlit/hooks/useMCPServers.js.map +1 -1
  130. package/dist/botlit/hooks/usePolicies.d.ts +60 -0
  131. package/dist/botlit/hooks/usePolicies.js +49 -49
  132. package/dist/botlit/hooks/usePolicies.js.map +1 -1
  133. package/dist/botlit/hooks/usePromptTemplates.d.ts +88 -0
  134. package/dist/botlit/hooks/usePromptTemplates.js +57 -57
  135. package/dist/botlit/hooks/usePromptTemplates.js.map +1 -1
  136. package/dist/botlit/hooks/useRetention.d.ts +26 -0
  137. package/dist/botlit/hooks/useRetention.js +3 -3
  138. package/dist/botlit/hooks/useRetention.js.map +1 -1
  139. package/dist/botlit/hooks/useRetrievalProfiles.d.ts +75 -0
  140. package/dist/botlit/hooks/useRetrievalProfiles.js +47 -47
  141. package/dist/botlit/hooks/useRetrievalProfiles.js.map +1 -1
  142. package/dist/botlit/hooks/useSkills.d.ts +64 -0
  143. package/dist/botlit/hooks/useSkills.js +53 -53
  144. package/dist/botlit/hooks/useSkills.js.map +1 -1
  145. package/dist/botlit/hooks/useStore.d.ts +112 -0
  146. package/dist/botlit/hooks/useStore.js +55 -55
  147. package/dist/botlit/hooks/useStore.js.map +1 -1
  148. package/dist/botlit/hooks/useUserPlatformConnection.d.ts +80 -0
  149. package/dist/botlit/hooks/useUserPlatformConnection.js +19 -19
  150. package/dist/botlit/hooks/useUserPlatformConnection.js.map +1 -1
  151. package/dist/botlit/index.d.ts +16 -0
  152. package/dist/botlit/index.js +12 -11
  153. package/dist/botlit/pages/A2AAgentDetailPage.d.ts +6 -0
  154. package/dist/botlit/pages/A2AAgentDetailPage.js +171 -178
  155. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
  156. package/dist/botlit/pages/A2ARegistryPage.d.ts +2 -0
  157. package/dist/botlit/pages/A2ARegistryPage.js +25 -26
  158. package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
  159. package/dist/botlit/pages/AgentApprovalsPage.d.ts +2 -0
  160. package/dist/botlit/pages/AgentApprovalsPage.js +32 -33
  161. package/dist/botlit/pages/AgentApprovalsPage.js.map +1 -1
  162. package/dist/botlit/pages/AgentBuilderPage.d.ts +2 -0
  163. package/dist/botlit/pages/AgentBuilderPage.js +59 -60
  164. package/dist/botlit/pages/AgentBuilderPage.js.map +1 -1
  165. package/dist/botlit/pages/AgentDetailPage.d.ts +2 -0
  166. package/dist/botlit/pages/AgentDetailPage.js +202 -190
  167. package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
  168. package/dist/botlit/pages/AgentsListPage.d.ts +2 -0
  169. package/dist/botlit/pages/AgentsListPage.js +71 -72
  170. package/dist/botlit/pages/AgentsListPage.js.map +1 -1
  171. package/dist/botlit/pages/AiOperationsPage.d.ts +2 -0
  172. package/dist/botlit/pages/AiOperationsPage.js +165 -0
  173. package/dist/botlit/pages/AiOperationsPage.js.map +1 -0
  174. package/dist/botlit/pages/BotChannelsTab.d.ts +7 -0
  175. package/dist/botlit/pages/BotChannelsTab.js +120 -122
  176. package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
  177. package/dist/botlit/pages/BotDetailPage.d.ts +7 -0
  178. package/dist/botlit/pages/BotDetailPage.js +246 -237
  179. package/dist/botlit/pages/BotDetailPage.js.map +1 -1
  180. package/dist/botlit/pages/BotWorkflowTab.d.ts +11 -0
  181. package/dist/botlit/pages/BotWorkflowTab.js +20 -21
  182. package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
  183. package/dist/botlit/pages/BotsListPage.d.ts +2 -0
  184. package/dist/botlit/pages/BotsListPage.js +52 -53
  185. package/dist/botlit/pages/BotsListPage.js.map +1 -1
  186. package/dist/botlit/pages/BucketsPage.d.ts +2 -0
  187. package/dist/botlit/pages/BucketsPage.js +260 -261
  188. package/dist/botlit/pages/BucketsPage.js.map +1 -1
  189. package/dist/botlit/pages/ChannelDetailPage.d.ts +6 -0
  190. package/dist/botlit/pages/ChannelDetailPage.js +97 -96
  191. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
  192. package/dist/botlit/pages/ChannelRoutesPage.d.ts +2 -0
  193. package/dist/botlit/pages/ChannelRoutesPage.js +23 -24
  194. package/dist/botlit/pages/ChannelRoutesPage.js.map +1 -1
  195. package/dist/botlit/pages/ChannelsPage.d.ts +2 -0
  196. package/dist/botlit/pages/ChannelsPage.js +44 -45
  197. package/dist/botlit/pages/ChannelsPage.js.map +1 -1
  198. package/dist/botlit/pages/ChatPage.d.ts +1 -0
  199. package/dist/botlit/pages/ChatPage.js +10 -11
  200. package/dist/botlit/pages/ChatPage.js.map +1 -1
  201. package/dist/botlit/pages/ConversationDetailPage.d.ts +2 -0
  202. package/dist/botlit/pages/ConversationsPage.d.ts +2 -0
  203. package/dist/botlit/pages/DashboardPage.d.ts +2 -0
  204. package/dist/botlit/pages/DashboardPage.js +37 -38
  205. package/dist/botlit/pages/DashboardPage.js.map +1 -1
  206. package/dist/botlit/pages/ExecutionDetailPage.d.ts +2 -0
  207. package/dist/botlit/pages/ExecutionDetailPage.js +47 -48
  208. package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -1
  209. package/dist/botlit/pages/ExecutionsPage.d.ts +2 -0
  210. package/dist/botlit/pages/ExecutionsPage.js +72 -70
  211. package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
  212. package/dist/botlit/pages/InstalledPackagesPage.d.ts +2 -0
  213. package/dist/botlit/pages/InstalledPackagesPage.js +77 -78
  214. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
  215. package/dist/botlit/pages/KnowledgeBaseDetailPage.d.ts +6 -0
  216. package/dist/botlit/pages/KnowledgeBaseDetailPage.js +171 -181
  217. package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -1
  218. package/dist/botlit/pages/KnowledgeBasesPage.d.ts +2 -0
  219. package/dist/botlit/pages/KnowledgeBasesPage.js +30 -31
  220. package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
  221. package/dist/botlit/pages/MCPServerDetailPage.d.ts +6 -0
  222. package/dist/botlit/pages/MCPServerDetailPage.js +82 -83
  223. package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -1
  224. package/dist/botlit/pages/MCPServersPage.d.ts +2 -0
  225. package/dist/botlit/pages/MCPServersPage.js +54 -55
  226. package/dist/botlit/pages/MCPServersPage.js.map +1 -1
  227. package/dist/botlit/pages/PoliciesPage.d.ts +2 -0
  228. package/dist/botlit/pages/PoliciesPage.js +25 -26
  229. package/dist/botlit/pages/PoliciesPage.js.map +1 -1
  230. package/dist/botlit/pages/PolicyDetailPage.d.ts +6 -0
  231. package/dist/botlit/pages/PolicyDetailPage.js +257 -259
  232. package/dist/botlit/pages/PolicyDetailPage.js.map +1 -1
  233. package/dist/botlit/pages/PromptStudioPage.d.ts +2 -0
  234. package/dist/botlit/pages/PromptStudioPage.js +35 -35
  235. package/dist/botlit/pages/PromptStudioPage.js.map +1 -1
  236. package/dist/botlit/pages/PromptTemplateDetailPage.d.ts +6 -0
  237. package/dist/botlit/pages/PromptTemplateDetailPage.js +363 -362
  238. package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -1
  239. package/dist/botlit/pages/PromptTemplatesPage.d.ts +2 -0
  240. package/dist/botlit/pages/PromptTemplatesPage.js +26 -27
  241. package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -1
  242. package/dist/botlit/pages/RetrievalProfileDetailPage.d.ts +6 -0
  243. package/dist/botlit/pages/RetrievalProfileDetailPage.js +150 -158
  244. package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -1
  245. package/dist/botlit/pages/RetrievalProfilesPage.d.ts +2 -0
  246. package/dist/botlit/pages/RetrievalProfilesPage.js +24 -25
  247. package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
  248. package/dist/botlit/pages/SettingsPage.d.ts +2 -0
  249. package/dist/botlit/pages/SettingsPage.js +124 -125
  250. package/dist/botlit/pages/SettingsPage.js.map +1 -1
  251. package/dist/botlit/pages/SkillDetailPage.d.ts +6 -0
  252. package/dist/botlit/pages/SkillDetailPage.js +216 -217
  253. package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
  254. package/dist/botlit/pages/SkillsPage.d.ts +2 -0
  255. package/dist/botlit/pages/SkillsPage.js +24 -25
  256. package/dist/botlit/pages/SkillsPage.js.map +1 -1
  257. package/dist/botlit/pages/StorePackageDetailPage.d.ts +2 -0
  258. package/dist/botlit/pages/StorePackageDetailPage.js +38 -39
  259. package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
  260. package/dist/botlit/pages/StorePage.d.ts +2 -0
  261. package/dist/botlit/pages/StorePage.js +135 -136
  262. package/dist/botlit/pages/StorePage.js.map +1 -1
  263. package/dist/botlit/pages/index.d.ts +39 -0
  264. package/dist/botlit/permissions/PermissionRequired.d.ts +20 -0
  265. package/dist/botlit/permissions/PermissionRequired.js +10 -11
  266. package/dist/botlit/permissions/PermissionRequired.js.map +1 -1
  267. package/dist/botlit/permissions/botmanorPermissions.d.ts +82 -0
  268. package/dist/botlit/permissions/botmanorPermissions.js +1 -2
  269. package/dist/botlit/permissions/botmanorPermissions.js.map +1 -1
  270. package/dist/botlit/permissions/index.d.ts +7 -0
  271. package/dist/botlit/permissions/index.js +4 -3
  272. package/dist/botlit/permissions/useBotmanorPermissions.d.ts +41 -0
  273. package/dist/botlit/permissions/useBotmanorPermissions.js +1 -2
  274. package/dist/botlit/permissions/useBotmanorPermissions.js.map +1 -1
  275. package/dist/botlit/providers/BotlitProvider.d.ts +14 -0
  276. package/dist/botlit/providers/BotlitProvider.js +3 -3
  277. package/dist/botlit/providers/BotlitProvider.js.map +1 -1
  278. package/dist/botlit/store/botlitStore.d.ts +85 -0
  279. package/dist/botlit/store/botlitStore.js +1 -2
  280. package/dist/botlit/store/botlitStore.js.map +1 -1
  281. package/dist/botlit/store/renamedKeyStorage.d.ts +13 -0
  282. package/dist/botlit/store/renamedKeyStorage.js +1 -2
  283. package/dist/botlit/store/renamedKeyStorage.js.map +1 -1
  284. package/dist/botlit/types/index.d.ts +1008 -0
  285. package/dist/botlit/utils/cn.d.ts +2 -0
  286. package/dist/botlit/utils/cn.js +1 -2
  287. package/dist/botlit/utils/cn.js.map +1 -1
  288. package/dist/botlit/utils/embedding-models.d.ts +9 -0
  289. package/dist/botlit/utils/embedding-models.js +1 -2
  290. package/dist/botlit/utils/embedding-models.js.map +1 -1
  291. package/dist/botlit/utils/errors.d.ts +19 -0
  292. package/dist/botlit/utils/errors.js +1 -2
  293. package/dist/botlit/utils/errors.js.map +1 -1
  294. package/dist/botlit/utils/formatters.d.ts +38 -0
  295. package/dist/botlit/utils/formatters.js +0 -1
  296. package/dist/botlit/utils/formatters.js.map +1 -1
  297. package/dist/botlit/utils/navigation.d.ts +19 -0
  298. package/dist/botlit/utils/navigation.js +1 -2
  299. package/dist/botlit/utils/navigation.js.map +1 -1
  300. package/dist/botlit/utils/policyConfig.d.ts +68 -0
  301. package/dist/botlit/utils/policyConfig.js +2 -3
  302. package/dist/botlit/utils/policyConfig.js.map +1 -1
  303. package/dist/botlit/utils/unions.d.ts +25 -0
  304. package/dist/botlit/utils/unions.js +1 -2
  305. package/dist/botlit/utils/unions.js.map +1 -1
  306. package/dist/dev/App.d.ts +2 -0
  307. package/dist/dev/main.d.ts +0 -0
  308. package/dist/generated/global-operations.d.ts +197 -0
  309. package/dist/generated/global-operations.js +1 -2
  310. package/dist/generated/global-operations.js.map +1 -1
  311. package/dist/generated/global-types.d.ts +27678 -0
  312. package/dist/generated/global-types.js +1 -2
  313. package/dist/generated/global-types.js.map +1 -1
  314. package/dist/generated/wspace-operations.d.ts +5489 -0
  315. package/dist/generated/wspace-operations.js +172 -75
  316. package/dist/generated/wspace-operations.js.map +1 -1
  317. package/dist/generated/wspace-types.d.ts +152017 -0
  318. package/dist/generated/wspace-types.js +6 -5
  319. package/dist/generated/wspace-types.js.map +1 -1
  320. package/dist/index.d.ts +5 -0
  321. package/dist/shared/hooks/useTr.d.ts +16 -0
  322. package/dist/shared/hooks/useTr.js +1 -2
  323. package/dist/shared/hooks/useTr.js.map +1 -1
  324. package/dist/stories/Badge.stories.d.ts +11 -0
  325. package/dist/stories/Button.stories.d.ts +13 -0
  326. package/dist/stories/EmptyState.stories.d.ts +8 -0
  327. package/dist/stories/StatusBadge.stories.d.ts +9 -0
  328. package/dist/test/fixtures.d.ts +39 -0
  329. package/dist/test/happydom.d.ts +1 -0
  330. package/dist/test/renderPage.d.ts +18 -0
  331. package/dist/test/setup.d.ts +9 -0
  332. package/dist/utils/nativeBridge.d.ts +2 -0
  333. package/dist/utils/nativeBridge.js +1 -2
  334. package/package.json +87 -60
@@ -0,0 +1,23 @@
1
+ import { FC, ReactNode } from 'react';
2
+ import { GlobalChannelData } from '../hooks/useUserPlatformConnection';
3
+ interface ChannelSelectorSheetProps {
4
+ /** Controls visibility of the sheet */
5
+ open: boolean;
6
+ /** Callback when sheet is closed */
7
+ onClose: () => void;
8
+ /** Callback when a channel is selected */
9
+ onSelectChannel: (channelId: string, platform: string) => void;
10
+ /** Available channels to display (already filtered by backend) */
11
+ availableChannels: GlobalChannelData[];
12
+ /** Platform icons mapping */
13
+ platformIcons: Record<string, ReactNode>;
14
+ /** Platform metadata mapping */
15
+ platformMeta: Record<string, {
16
+ label: string;
17
+ badgeClass: string;
18
+ accentBg: string;
19
+ accentText: string;
20
+ }>;
21
+ }
22
+ export declare const ChannelSelectorSheet: FC<ChannelSelectorSheetProps>;
23
+ export {};
@@ -3,7 +3,7 @@ import { Badge as t } from "./Badge.js";
3
3
  import { useEffect as n } from "react";
4
4
  import { Fragment as r, jsx as i, jsxs as a } from "react/jsx-runtime";
5
5
  import { X as o } from "lucide-react";
6
- //#region src/botlit/components/ChannelSelectorSheet.tsx
6
+ // src/botlit/components/ChannelSelectorSheet.tsx
7
7
  var s = ({ open: s, onClose: c, onSelectChannel: l, availableChannels: u, platformIcons: d, platformMeta: f }) => (n(() => (s ? document.body.style.overflow = "hidden" : document.body.style.overflow = "", () => {
8
8
  document.body.style.overflow = "";
9
9
  }), [s]), n(() => {
@@ -124,7 +124,6 @@ var s = ({ open: s, onClose: c, onSelectChannel: l, availableChannels: u, platfo
124
124
  })
125
125
  ]
126
126
  })] }) : null);
127
- //#endregion
128
127
  export { s as ChannelSelectorSheet };
129
128
 
130
129
  //# sourceMappingURL=ChannelSelectorSheet.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChannelSelectorSheet.js","names":[],"sources":["../../../src/botlit/components/ChannelSelectorSheet.tsx"],"sourcesContent":["/**\n * ChannelSelectorSheet\n * @module botlit/components\n *\n * A slide-in sheet component that displays available communication channels\n * for selection when setting up bot integrations.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { useEffect } from 'react';\nimport { X } from 'lucide-react';\nimport { Button } from './Button';\nimport { Badge } from './Badge';\nimport type { GlobalChannelData } from '../hooks/useUserPlatformConnection';\n\ninterface ChannelSelectorSheetProps {\n /** Controls visibility of the sheet */\n open: boolean;\n /** Callback when sheet is closed */\n onClose: () => void;\n /** Callback when a channel is selected */\n onSelectChannel: (channelId: string, platform: string) => void;\n /** Available channels to display (already filtered by backend) */\n availableChannels: GlobalChannelData[];\n /** Platform icons mapping */\n platformIcons: Record<string, ReactNode>;\n /** Platform metadata mapping */\n platformMeta: Record<\n string,\n { label: string; badgeClass: string; accentBg: string; accentText: string }\n >;\n}\n\nexport const ChannelSelectorSheet: FC<ChannelSelectorSheetProps> = ({\n open,\n onClose,\n onSelectChannel,\n availableChannels,\n platformIcons,\n platformMeta,\n}) => {\n // Lock body scroll when sheet is open\n useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [open]);\n\n // Close on Escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && open) {\n onClose();\n }\n };\n window.addEventListener('keydown', handleEscape);\n return () => window.removeEventListener('keydown', handleEscape);\n }, [open, onClose]);\n\n if (!open) return null;\n\n return (\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 bg-black/50 z-40 transition-opacity duration-300\"\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Sheet */}\n <div\n className=\"fixed inset-y-0 right-0 z-50 w-full sm:max-w-md bg-bg-surface shadow-xl transform transition-transform duration-300 ease-out flex flex-col\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"channel-selector-title\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-border-subtle shrink-0\">\n <div>\n <h2 id=\"channel-selector-title\" className=\"text-lg font-semibold\">\n Select a Channel\n </h2>\n <p className=\"text-sm text-text-secondary mt-0.5\">\n Choose a platform to connect to your bot\n </p>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onClose}\n className=\"shrink-0\"\n aria-label=\"Close\"\n >\n <X size={18} />\n </Button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n {availableChannels.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <p className=\"text-sm text-text-secondary\">No channels available to configure.</p>\n <p className=\"text-xs text-text-secondary mt-2\">\n All available channels have already been connected to this bot.\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {availableChannels.map((channel) => {\n const platform = channel.platform as string;\n const meta = platformMeta[platform] || {\n label: platform,\n badgeClass: 'bg-gray-100 text-gray-700',\n accentBg: 'bg-gray-500/10',\n accentText: 'text-gray-600',\n };\n const icon = platformIcons[platform];\n\n return (\n <button\n key={channel.id}\n onClick={() => {\n onSelectChannel(channel.id, platform);\n onClose();\n }}\n className=\"w-full text-left p-4 rounded-lg border border-border-subtle bg-bg-surface hover:bg-bg-sunken/50 transition-colors focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] focus:ring-offset-2\"\n >\n <div className=\"flex items-start gap-3\">\n {/* Icon */}\n <div className={`p-2 rounded-md ${meta.accentBg} shrink-0`}>\n <span className={meta.accentText}>{icon}</span>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <h3 className=\"font-medium text-sm\">{channel.name}</h3>\n <Badge className={`text-xs ${meta.badgeClass}`}>{meta.label}</Badge>\n </div>\n {channel.description && (\n <p className=\"text-xs text-text-secondary line-clamp-2\">\n {channel.description}\n </p>\n )}\n </div>\n\n {/* Arrow indicator */}\n <div className=\"shrink-0 self-center text-text-secondary\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 12L10 8L6 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-4 border-t border-border-subtle shrink-0\">\n <Button variant=\"outline\" onClick={onClose} className=\"w-full\">\n Cancel\n </Button>\n </div>\n </div>\n </>\n );\n};\n"],"mappings":";;;;;;AAiCA,IAAa,KAAuD,EAClE,SACA,YACA,oBACA,sBACA,kBACA,uBAGA,SACM,IACF,SAAS,KAAK,MAAM,WAAW,WAE/B,SAAS,KAAK,MAAM,WAAW,UAEpB;AACX,UAAS,KAAK,MAAM,WAAW;IAEhC,CAAC,EAAK,CAAC,EAGV,QAAgB;CACd,IAAM,KAAgB,MAAqB;AACzC,EAAI,EAAE,QAAQ,YAAY,KACxB,GAAS;;AAIb,QADA,OAAO,iBAAiB,WAAW,EAAa,QACnC,OAAO,oBAAoB,WAAW,EAAa;GAC/D,CAAC,GAAM,EAAQ,CAAC,EAEd,IAGH,kBAAA,GAAA,EAAA,UAAA,CAEE,kBAAC,OAAD;CACE,WAAU;CACV,SAAS;CACT,eAAY;CACZ,CAAA,EAGF,kBAAC,OAAD;CACE,WAAU;CACV,MAAK;CACL,cAAW;CACX,mBAAgB;WAJlB;EAOE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,IAAG;IAAyB,WAAU;cAAwB;IAE7D,CAAA,EACL,kBAAC,KAAD;IAAG,WAAU;cAAqC;IAE9C,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD;IACE,SAAQ;IACR,MAAK;IACL,SAAS;IACT,WAAU;IACV,cAAW;cAEX,kBAAC,GAAD,EAAG,MAAM,IAAM,CAAA;IACR,CAAA,CACL;;EAGN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAkB,WAAW,IAC5B,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAAuC,CAAA,EAClF,kBAAC,KAAD;KAAG,WAAU;eAAmC;KAE5C,CAAA,CACA;QAEN,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAkB,KAAK,MAAY;KAClC,IAAM,IAAW,EAAQ,UACnB,IAAO,EAAa,MAAa;MACrC,OAAO;MACP,YAAY;MACZ,UAAU;MACV,YAAY;MACb,EACK,IAAO,EAAc;AAE3B,YACE,kBAAC,UAAD;MAEE,eAAe;AAEb,OADA,EAAgB,EAAQ,IAAI,EAAS,EACrC,GAAS;;MAEX,WAAU;gBAEV,kBAAC,OAAD;OAAK,WAAU;iBAAf;QAEE,kBAAC,OAAD;SAAK,WAAW,kBAAkB,EAAK,SAAS;mBAC9C,kBAAC,QAAD;UAAM,WAAW,EAAK;oBAAa;UAAY,CAAA;SAC3C,CAAA;QAGN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,MAAD;WAAI,WAAU;qBAAuB,EAAQ;WAAU,CAAA,EACvD,kBAAC,GAAD;WAAO,WAAW,WAAW,EAAK;qBAAe,EAAK;WAAc,CAAA,CAChE;aACL,EAAQ,eACP,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAQ;UACP,CAAA,CAEF;;QAGN,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,OAAD;UACE,OAAM;UACN,QAAO;UACP,SAAQ;UACR,MAAK;UACL,OAAM;oBAEN,kBAAC,QAAD;WACE,GAAE;WACF,QAAO;WACP,aAAY;WACZ,eAAc;WACd,gBAAe;WACf,CAAA;UACE,CAAA;SACF,CAAA;QACF;;MACC,EA7CF,EAAQ,GA6CN;MAEX;IACE,CAAA;GAEJ,CAAA;EAGN,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IAAQ,SAAQ;IAAU,SAAS;IAAS,WAAU;cAAS;IAEtD,CAAA;GACL,CAAA;EACF;GACL,EAAA,CAAA,GAzHa"}
1
+ {"version":3,"file":"ChannelSelectorSheet.js","names":["_Fragment","ChannelSelectorSheet","useEffect","open","handleEscape","onClose","Fragment","Button","X","availableChannels","platform","channel","meta","platformMeta","icon","platformIcons","onSelectChannel","Badge"],"sources":["../../../src/botlit/components/ChannelSelectorSheet.tsx"],"sourcesContent":["/**\n * ChannelSelectorSheet\n * @module botlit/components\n *\n * A slide-in sheet component that displays available communication channels\n * for selection when setting up bot integrations.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { useEffect } from 'react';\nimport { X } from 'lucide-react';\nimport { Button } from './Button';\nimport { Badge } from './Badge';\nimport type { GlobalChannelData } from '../hooks/useUserPlatformConnection';\n\ninterface ChannelSelectorSheetProps {\n /** Controls visibility of the sheet */\n open: boolean;\n /** Callback when sheet is closed */\n onClose: () => void;\n /** Callback when a channel is selected */\n onSelectChannel: (channelId: string, platform: string) => void;\n /** Available channels to display (already filtered by backend) */\n availableChannels: GlobalChannelData[];\n /** Platform icons mapping */\n platformIcons: Record<string, ReactNode>;\n /** Platform metadata mapping */\n platformMeta: Record<\n string,\n { label: string; badgeClass: string; accentBg: string; accentText: string }\n >;\n}\n\nexport const ChannelSelectorSheet: FC<ChannelSelectorSheetProps> = ({\n open,\n onClose,\n onSelectChannel,\n availableChannels,\n platformIcons,\n platformMeta,\n}) => {\n // Lock body scroll when sheet is open\n useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [open]);\n\n // Close on Escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && open) {\n onClose();\n }\n };\n window.addEventListener('keydown', handleEscape);\n return () => window.removeEventListener('keydown', handleEscape);\n }, [open, onClose]);\n\n if (!open) return null;\n\n return (\n <>\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 bg-black/50 z-40 transition-opacity duration-300\"\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Sheet */}\n <div\n className=\"fixed inset-y-0 right-0 z-50 w-full sm:max-w-md bg-bg-surface shadow-xl transform transition-transform duration-300 ease-out flex flex-col\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"channel-selector-title\"\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-border-subtle shrink-0\">\n <div>\n <h2 id=\"channel-selector-title\" className=\"text-lg font-semibold\">\n Select a Channel\n </h2>\n <p className=\"text-sm text-text-secondary mt-0.5\">\n Choose a platform to connect to your bot\n </p>\n </div>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onClose}\n className=\"shrink-0\"\n aria-label=\"Close\"\n >\n <X size={18} />\n </Button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n {availableChannels.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <p className=\"text-sm text-text-secondary\">No channels available to configure.</p>\n <p className=\"text-xs text-text-secondary mt-2\">\n All available channels have already been connected to this bot.\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {availableChannels.map((channel) => {\n const platform = channel.platform as string;\n const meta = platformMeta[platform] || {\n label: platform,\n badgeClass: 'bg-gray-100 text-gray-700',\n accentBg: 'bg-gray-500/10',\n accentText: 'text-gray-600',\n };\n const icon = platformIcons[platform];\n\n return (\n <button\n key={channel.id}\n onClick={() => {\n onSelectChannel(channel.id, platform);\n onClose();\n }}\n className=\"w-full text-left p-4 rounded-lg border border-border-subtle bg-bg-surface hover:bg-bg-sunken/50 transition-colors focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] focus:ring-offset-2\"\n >\n <div className=\"flex items-start gap-3\">\n {/* Icon */}\n <div className={`p-2 rounded-md ${meta.accentBg} shrink-0`}>\n <span className={meta.accentText}>{icon}</span>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <h3 className=\"font-medium text-sm\">{channel.name}</h3>\n <Badge className={`text-xs ${meta.badgeClass}`}>{meta.label}</Badge>\n </div>\n {channel.description && (\n <p className=\"text-xs text-text-secondary line-clamp-2\">\n {channel.description}\n </p>\n )}\n </div>\n\n {/* Arrow indicator */}\n <div className=\"shrink-0 self-center text-text-secondary\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 12L10 8L6 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-6 py-4 border-t border-border-subtle shrink-0\">\n <Button variant=\"outline\" onClick={onClose} className=\"w-full\">\n Cancel\n </Button>\n </div>\n </div>\n </>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { FC, ReactNode } from 'react';
2
+ interface EmptyStateProps {
3
+ icon?: ReactNode;
4
+ /** Boff UI 2.0 illustration name → /illustrations/<name>.webp */
5
+ illustration?: string;
6
+ title: string;
7
+ description?: string;
8
+ action?: ReactNode;
9
+ className?: string;
10
+ }
11
+ export declare const EmptyState: FC<EmptyStateProps>;
12
+ export {};
@@ -1,7 +1,7 @@
1
1
  import { cn as e } from "../utils/cn.js";
2
2
  import { IllustratedEmptyState 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/EmptyState.tsx
4
+ // src/botlit/components/EmptyState.tsx
5
5
  var i = ({ icon: i, illustration: a, title: o, description: s, action: c, className: l }) => a ? /* @__PURE__ */ n(t, {
6
6
  illustration: a,
7
7
  title: o,
@@ -29,7 +29,6 @@ var i = ({ icon: i, illustration: a, title: o, description: s, action: c, classN
29
29
  })
30
30
  ]
31
31
  });
32
- //#endregion
33
32
  export { i as EmptyState };
34
33
 
35
34
  //# sourceMappingURL=EmptyState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyState.js","names":[],"sources":["../../../src/botlit/components/EmptyState.tsx"],"sourcesContent":["/**\n * Empty State Component\n * @module botlit/components\n *\n * Boff UI 2.0: when an `illustration` name is supplied, this renders the\n * on-brand fe-libs `IllustratedEmptyState` (host serves /illustrations/<name>.webp).\n * The legacy `icon`-based layout is preserved as a graceful fallback so existing\n * call sites keep working unchanged.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface EmptyStateProps {\n icon?: ReactNode;\n /** Boff UI 2.0 illustration name → /illustrations/<name>.webp */\n illustration?: string;\n title: string;\n description?: string;\n action?: ReactNode;\n className?: string;\n}\n\nexport const EmptyState: FC<EmptyStateProps> = ({\n icon,\n illustration,\n title,\n description,\n action,\n className,\n}) => {\n if (illustration) {\n return (\n <IllustratedEmptyState\n illustration={illustration}\n title={title}\n description={description}\n action={action}\n className={className}\n />\n );\n }\n\n return (\n <div\n className={cn('flex flex-col items-center justify-center py-12 px-4 text-center', className)}\n >\n {icon && <div className=\"mb-4 text-text-secondary opacity-50\">{icon}</div>}\n <h3 className=\"text-lg font-medium text-text-primary\">{title}</h3>\n {description && <p className=\"mt-2 text-sm text-text-secondary max-w-sm\">{description}</p>}\n {action && <div className=\"mt-6\">{action}</div>}\n </div>\n );\n};\n"],"mappings":";;;;AAwBA,IAAa,KAAmC,EAC9C,SACA,iBACA,UACA,gBACA,WACA,mBAEI,IAEA,kBAAC,GAAD;CACgB;CACP;CACM;CACL;CACG;CACX,CAAA,GAKJ,kBAAC,OAAD;CACE,WAAW,EAAG,oEAAoE,EAAU;WAD9F;EAGG,KAAQ,kBAAC,OAAD;GAAK,WAAU;aAAuC;GAAW,CAAA;EAC1E,kBAAC,MAAD;GAAI,WAAU;aAAyC;GAAW,CAAA;EACjE,KAAe,kBAAC,KAAD;GAAG,WAAU;aAA6C;GAAgB,CAAA;EACzF,KAAU,kBAAC,OAAD;GAAK,WAAU;aAAQ;GAAa,CAAA;EAC3C"}
1
+ {"version":3,"file":"EmptyState.js","names":["EmptyState","illustration","IllustratedEmptyState","cn","className","icon","title","description","action"],"sources":["../../../src/botlit/components/EmptyState.tsx"],"sourcesContent":["/**\n * Empty State Component\n * @module botlit/components\n *\n * Boff UI 2.0: when an `illustration` name is supplied, this renders the\n * on-brand fe-libs `IllustratedEmptyState` (host serves /illustrations/<name>.webp).\n * The legacy `icon`-based layout is preserved as a graceful fallback so existing\n * call sites keep working unchanged.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface EmptyStateProps {\n icon?: ReactNode;\n /** Boff UI 2.0 illustration name → /illustrations/<name>.webp */\n illustration?: string;\n title: string;\n description?: string;\n action?: ReactNode;\n className?: string;\n}\n\nexport const EmptyState: FC<EmptyStateProps> = ({\n icon,\n illustration,\n title,\n description,\n action,\n className,\n}) => {\n if (illustration) {\n return (\n <IllustratedEmptyState\n illustration={illustration}\n title={title}\n description={description}\n action={action}\n className={className}\n />\n );\n }\n\n return (\n <div\n className={cn('flex flex-col items-center justify-center py-12 px-4 text-center', className)}\n >\n {icon && <div className=\"mb-4 text-text-secondary opacity-50\">{icon}</div>}\n <h3 className=\"text-lg font-medium text-text-primary\">{title}</h3>\n {description && <p className=\"mt-2 text-sm text-text-secondary max-w-sm\">{description}</p>}\n {action && <div className=\"mt-6\">{action}</div>}\n </div>\n );\n};\n"],"mappings":";;;;AAwBA,IAAaA,KAAmC,EAC9C,SACA,iBACA,UACA,gBACA,WACA,mBAEIC,IAEA,kBAACC,GAAD;CACgB;CACP;CACM;CACL;CACG;AACZ,CAAA,IAKH,kBAAC,OAAD;CACE,WAAWC,EAAG,oEAAoEC,CAAS;CAD7F,UAAA;EAGGC,KAAQ,kBAAC,OAAD;GAAK,WAAU;GAAuC,UAAAA;EAAU,CAAA;EACzE,kBAAC,MAAD;GAAI,WAAU;GAAyC,UAAAC;EAAU,CAAA;EAChEC,KAAe,kBAAC,KAAD;GAAG,WAAU;GAA6C,UAAAA;EAAe,CAAA;EACxFC,KAAU,kBAAC,OAAD;GAAK,WAAU;GAAQ,UAAAA;EAAY,CAAA;CAC3C"}
@@ -0,0 +1,10 @@
1
+ import { FC } from 'react';
2
+ interface ErrorStateProps {
3
+ /** What failed to load, e.g. "agents". Used to build the default title. */
4
+ resource: string;
5
+ error?: Error;
6
+ onRetry?: () => void;
7
+ className?: string;
8
+ }
9
+ export declare const ErrorState: FC<ErrorStateProps>;
10
+ export {};
@@ -1,14 +1,14 @@
1
1
  import { useTr as e } from "../../shared/hooks/useTr.js";
2
- import { cn as t } from "../utils/cn.js";
3
- import { Button as n } from "./Button.js";
2
+ import { Button as t } from "./Button.js";
3
+ import { cn as n } from "../utils/cn.js";
4
4
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
5
  import { AlertTriangle as a, RefreshCw as o } from "lucide-react";
6
- //#region src/botlit/components/ErrorState.tsx
6
+ // src/botlit/components/ErrorState.tsx
7
7
  var s = ({ resource: s, error: c, onRetry: l, className: u }) => {
8
8
  let d = e();
9
9
  return /* @__PURE__ */ i("div", {
10
10
  role: "alert",
11
- className: t("flex flex-col items-center justify-center gap-3 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-4 py-12 text-center", u),
11
+ className: n("flex flex-col items-center justify-center gap-3 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-4 py-12 text-center", u),
12
12
  children: [
13
13
  /* @__PURE__ */ r(a, {
14
14
  size: 28,
@@ -21,7 +21,7 @@ var s = ({ resource: s, error: c, onRetry: l, className: u }) => {
21
21
  className: "mt-2 max-w-md text-sm text-text-secondary",
22
22
  children: c?.message ?? d("error.loadDescription", "The request to the workspace gateway failed.")
23
23
  })] }),
24
- l && /* @__PURE__ */ r(n, {
24
+ l && /* @__PURE__ */ r(t, {
25
25
  variant: "outline",
26
26
  size: "sm",
27
27
  leftIcon: /* @__PURE__ */ r(o, { size: 14 }),
@@ -31,7 +31,6 @@ var s = ({ resource: s, error: c, onRetry: l, className: u }) => {
31
31
  ]
32
32
  });
33
33
  };
34
- //#endregion
35
34
  export { s as ErrorState };
36
35
 
37
36
  //# sourceMappingURL=ErrorState.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorState.js","names":[],"sources":["../../../src/botlit/components/ErrorState.tsx"],"sourcesContent":["/**\n * Error State Component\n * @module botlit/components\n *\n * Rendered when a gateway request FAILED. This is deliberately distinct from\n * `EmptyState` — \"we asked and there is nothing yet\" and \"we could not ask\"\n * are different situations and must not look the same to the user.\n */\n\nimport type { FC } from 'react';\nimport { AlertTriangle, RefreshCw } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { Button } from './Button';\nimport { cn } from '../utils/cn';\n\ninterface ErrorStateProps {\n /** What failed to load, e.g. \"agents\". Used to build the default title. */\n resource: string;\n error?: Error;\n onRetry?: () => void;\n className?: string;\n}\n\nexport const ErrorState: FC<ErrorStateProps> = ({ resource, error, onRetry, className }) => {\n const t = useTr();\n return (\n <div\n role=\"alert\"\n className={cn(\n 'flex flex-col items-center justify-center gap-3 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-4 py-12 text-center',\n className\n )}\n >\n <AlertTriangle size={28} className=\"text-status-error-text\" />\n <div>\n <h3 className=\"text-lg font-medium text-text-primary\">\n {t('error.loadTitle', \"Couldn't load {{resource}}\", { resource })}\n </h3>\n <p className=\"mt-2 max-w-md text-sm text-text-secondary\">\n {error?.message ??\n t('error.loadDescription', 'The request to the workspace gateway failed.')}\n </p>\n </div>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" leftIcon={<RefreshCw size={14} />} onClick={onRetry}>\n {t('common.tryAgain', 'Try again')}\n </Button>\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;AAuBA,IAAa,KAAmC,EAAE,aAAU,UAAO,YAAS,mBAAgB;CAC1F,IAAM,IAAI,GAAO;AACjB,QACE,kBAAC,OAAD;EACE,MAAK;EACL,WAAW,EACT,iJACA,EACD;YALH;GAOE,kBAAC,GAAD;IAAe,MAAM;IAAI,WAAU;IAA2B,CAAA;GAC9D,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAE,mBAAmB,8BAA8B,EAAE,aAAU,CAAC;IAC9D,CAAA,EACL,kBAAC,KAAD;IAAG,WAAU;cACV,GAAO,WACN,EAAE,yBAAyB,+CAA+C;IAC1E,CAAA,CACA,EAAA,CAAA;GACL,KACC,kBAAC,GAAD;IAAQ,SAAQ;IAAU,MAAK;IAAK,UAAU,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA;IAAE,SAAS;cAC7E,EAAE,mBAAmB,YAAY;IAC3B,CAAA;GAEP"}
1
+ {"version":3,"file":"ErrorState.js","names":["ErrorState","t","useTr","cn","className","AlertTriangle","error","onRetry","Button","RefreshCw"],"sources":["../../../src/botlit/components/ErrorState.tsx"],"sourcesContent":["/**\n * Error State Component\n * @module botlit/components\n *\n * Rendered when a gateway request FAILED. This is deliberately distinct from\n * `EmptyState` — \"we asked and there is nothing yet\" and \"we could not ask\"\n * are different situations and must not look the same to the user.\n */\n\nimport type { FC } from 'react';\nimport { AlertTriangle, RefreshCw } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { Button } from './Button';\nimport { cn } from '../utils/cn';\n\ninterface ErrorStateProps {\n /** What failed to load, e.g. \"agents\". Used to build the default title. */\n resource: string;\n error?: Error;\n onRetry?: () => void;\n className?: string;\n}\n\nexport const ErrorState: FC<ErrorStateProps> = ({ resource, error, onRetry, className }) => {\n const t = useTr();\n return (\n <div\n role=\"alert\"\n className={cn(\n 'flex flex-col items-center justify-center gap-3 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-4 py-12 text-center',\n className\n )}\n >\n <AlertTriangle size={28} className=\"text-status-error-text\" />\n <div>\n <h3 className=\"text-lg font-medium text-text-primary\">\n {t('error.loadTitle', \"Couldn't load {{resource}}\", { resource })}\n </h3>\n <p className=\"mt-2 max-w-md text-sm text-text-secondary\">\n {error?.message ??\n t('error.loadDescription', 'The request to the workspace gateway failed.')}\n </p>\n </div>\n {onRetry && (\n <Button variant=\"outline\" size=\"sm\" leftIcon={<RefreshCw size={14} />} onClick={onRetry}>\n {t('common.tryAgain', 'Try again')}\n </Button>\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;AAuBA,IAAaA,KAAmC,EAAE,aAAU,UAAO,YAAS,mBAAgB;CAC1F,IAAMC,IAAIC,EAAM;CAChB,OACE,kBAAC,OAAD;EACE,MAAK;EACL,WAAWC,EACT,iJACAC,CACF;EALF,UAAA;GAOE,kBAACC,GAAD;IAAe,MAAM;IAAI,WAAU;GAA0B,CAAA;GAC7D,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;IACX,UAAAJ,EAAE,mBAAmB,8BAA8B,EAAE,YAAS,CAAC;GAC9D,CAAA,GACJ,kBAAC,KAAD;IAAG,WAAU;IACV,UAAAK,GAAO,WACNL,EAAE,yBAAyB,8CAA8C;GAC1E,CAAA,CACA,EAAA,CAAA;GACJM,KACC,kBAACC,GAAD;IAAQ,SAAQ;IAAU,MAAK;IAAK,UAAU,kBAACC,GAAD,EAAW,MAAM,GAAK,CAAA;IAAG,SAASF;IAC7E,UAAAN,EAAE,mBAAmB,WAAW;GAC3B,CAAA;EAEP;;AAET"}
@@ -0,0 +1,27 @@
1
+ import { FC, InputHTMLAttributes, TextareaHTMLAttributes } from 'react';
2
+ interface InputProps extends InputHTMLAttributes<HTMLInputElement> {
3
+ error?: string;
4
+ }
5
+ export declare const Input: import('react').ForwardRefExoticComponent<InputProps & import('react').RefAttributes<HTMLInputElement>>;
6
+ interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {
7
+ error?: string;
8
+ }
9
+ export declare const Textarea: import('react').ForwardRefExoticComponent<TextareaProps & import('react').RefAttributes<HTMLTextAreaElement>>;
10
+ interface LabelProps {
11
+ children: React.ReactNode;
12
+ htmlFor?: string;
13
+ required?: boolean;
14
+ className?: string;
15
+ }
16
+ export declare const Label: FC<LabelProps>;
17
+ interface FormFieldProps {
18
+ label: string;
19
+ htmlFor?: string;
20
+ required?: boolean;
21
+ error?: string;
22
+ description?: string;
23
+ children: React.ReactNode;
24
+ className?: string;
25
+ }
26
+ export declare const FormField: FC<FormFieldProps>;
27
+ export {};
@@ -1,7 +1,7 @@
1
1
  import { cn as e } from "../utils/cn.js";
2
2
  import { forwardRef as t } from "react";
3
3
  import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
- //#region src/botlit/components/Input.tsx
4
+ // src/botlit/components/Input.tsx
5
5
  var i = t(({ className: t, type: i = "text", error: a, ...o }, s) => /* @__PURE__ */ r("div", {
6
6
  className: "w-full",
7
7
  children: [/* @__PURE__ */ n("input", {
@@ -53,7 +53,6 @@ var o = ({ children: t, htmlFor: i, required: a, className: o }) => /* @__PURE__
53
53
  })
54
54
  ]
55
55
  });
56
- //#endregion
57
- export { s as FormField, i as Input, a as Textarea };
56
+ export { s as FormField, i as Input, o as Label, a as Textarea };
58
57
 
59
58
  //# sourceMappingURL=Input.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Input.js","names":[],"sources":["../../../src/botlit/components/Input.tsx"],"sourcesContent":["/**\n * Input Components\n * @module botlit/components\n */\n\nimport type { FC, InputHTMLAttributes, TextareaHTMLAttributes } from 'react';\nimport { forwardRef } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n error?: string;\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, type = 'text', error, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n <input\n type={type}\n className={cn(\n 'flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm',\n 'ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium',\n 'placeholder:text-text-secondary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n error && 'border-status-error-border focus-visible:ring-destructive',\n className\n )}\n ref={ref}\n {...props}\n />\n {error && <p className=\"mt-1 text-xs text-status-error-text\">{error}</p>}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n\ninterface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n error?: string;\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, error, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n <textarea\n className={cn(\n 'flex min-h-[80px] w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm',\n 'ring-offset-background placeholder:text-text-secondary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n error && 'border-status-error-border focus-visible:ring-destructive',\n className\n )}\n ref={ref}\n {...props}\n />\n {error && <p className=\"mt-1 text-xs text-status-error-text\">{error}</p>}\n </div>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n\ninterface LabelProps {\n children: React.ReactNode;\n htmlFor?: string;\n required?: boolean;\n className?: string;\n}\n\nexport const Label: FC<LabelProps> = ({ children, htmlFor, required, className }) => {\n return (\n <label\n htmlFor={htmlFor}\n className={cn(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className\n )}\n >\n {children}\n {required && <span className=\"text-status-error-text ml-1\">*</span>}\n </label>\n );\n};\n\ninterface FormFieldProps {\n label: string;\n htmlFor?: string;\n required?: boolean;\n error?: string;\n description?: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const FormField: FC<FormFieldProps> = ({\n label,\n htmlFor,\n required,\n error,\n description,\n children,\n className,\n}) => {\n return (\n <div className={cn('space-y-2', className)}>\n <Label htmlFor={htmlFor} required={required}>\n {label}\n </Label>\n {children}\n {description && !error && <p className=\"text-xs text-text-secondary\">{description}</p>}\n {error && <p className=\"text-xs text-status-error-text\">{error}</p>}\n </div>\n );\n};\n"],"mappings":";;;;AAaA,IAAa,IAAQ,GAClB,EAAE,cAAW,UAAO,QAAQ,UAAO,GAAG,KAAS,MAE5C,kBAAC,OAAD;CAAK,WAAU;WAAf,CACE,kBAAC,SAAD;EACQ;EACN,WAAW,EACT,4FACA,0FACA,mCACA,4HACA,mDACA,KAAS,6DACT,EACD;EACI;EACL,GAAI;EACJ,CAAA,EACD,KAAS,kBAAC,KAAD;EAAG,WAAU;YAAuC;EAAU,CAAA,CACpE;GAGX;AAED,EAAM,cAAc;AAMpB,IAAa,IAAW,GACrB,EAAE,cAAW,UAAO,GAAG,KAAS,MAE7B,kBAAC,OAAD;CAAK,WAAU;WAAf,CACE,kBAAC,YAAD;EACE,WAAW,EACT,oGACA,0DACA,4HACA,mDACA,KAAS,6DACT,EACD;EACI;EACL,GAAI;EACJ,CAAA,EACD,KAAS,kBAAC,KAAD;EAAG,WAAU;YAAuC;EAAU,CAAA,CACpE;GAGX;AAED,EAAS,cAAc;AASvB,IAAa,KAAyB,EAAE,aAAU,YAAS,aAAU,mBAEjE,kBAAC,SAAD;CACW;CACT,WAAW,EACT,8FACA,EACD;WALH,CAOG,GACA,KAAY,kBAAC,QAAD;EAAM,WAAU;YAA8B;EAAQ,CAAA,CAC7D;IAcC,KAAiC,EAC5C,UACA,YACA,aACA,UACA,gBACA,aACA,mBAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,aAAa,EAAU;WAA1C;EACE,kBAAC,GAAD;GAAgB;GAAmB;aAChC;GACK,CAAA;EACP;EACA,KAAe,CAAC,KAAS,kBAAC,KAAD;GAAG,WAAU;aAA+B;GAAgB,CAAA;EACrF,KAAS,kBAAC,KAAD;GAAG,WAAU;aAAkC;GAAU,CAAA;EAC/D"}
1
+ {"version":3,"file":"Input.js","names":["Input","forwardRef","props","cn","error","className","Textarea","Label","children","required","FormField","label","description"],"sources":["../../../src/botlit/components/Input.tsx"],"sourcesContent":["/**\n * Input Components\n * @module botlit/components\n */\n\nimport type { FC, InputHTMLAttributes, TextareaHTMLAttributes } from 'react';\nimport { forwardRef } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n error?: string;\n}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n ({ className, type = 'text', error, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n <input\n type={type}\n className={cn(\n 'flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm',\n 'ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium',\n 'placeholder:text-text-secondary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n error && 'border-status-error-border focus-visible:ring-destructive',\n className\n )}\n ref={ref}\n {...props}\n />\n {error && <p className=\"mt-1 text-xs text-status-error-text\">{error}</p>}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n\ninterface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n error?: string;\n}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, error, ...props }, ref) => {\n return (\n <div className=\"w-full\">\n <textarea\n className={cn(\n 'flex min-h-[80px] w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm',\n 'ring-offset-background placeholder:text-text-secondary',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n error && 'border-status-error-border focus-visible:ring-destructive',\n className\n )}\n ref={ref}\n {...props}\n />\n {error && <p className=\"mt-1 text-xs text-status-error-text\">{error}</p>}\n </div>\n );\n }\n);\n\nTextarea.displayName = 'Textarea';\n\ninterface LabelProps {\n children: React.ReactNode;\n htmlFor?: string;\n required?: boolean;\n className?: string;\n}\n\nexport const Label: FC<LabelProps> = ({ children, htmlFor, required, className }) => {\n return (\n <label\n htmlFor={htmlFor}\n className={cn(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n className\n )}\n >\n {children}\n {required && <span className=\"text-status-error-text ml-1\">*</span>}\n </label>\n );\n};\n\ninterface FormFieldProps {\n label: string;\n htmlFor?: string;\n required?: boolean;\n error?: string;\n description?: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport const FormField: FC<FormFieldProps> = ({\n label,\n htmlFor,\n required,\n error,\n description,\n children,\n className,\n}) => {\n return (\n <div className={cn('space-y-2', className)}>\n <Label htmlFor={htmlFor} required={required}>\n {label}\n </Label>\n {children}\n {description && !error && <p className=\"text-xs text-text-secondary\">{description}</p>}\n {error && <p className=\"text-xs text-status-error-text\">{error}</p>}\n </div>\n );\n};\n"],"mappings":";;;;AAaA,IAAaA,IAAQC,GAClB,EAAE,cAAW,UAAO,QAAQ,UAAO,GAAGC,KAAS,MAE5C,kBAAC,OAAD;CAAK,WAAU;CAAf,UAAA,CACE,kBAAC,SAAD;EACQ;EACN,WAAWC,EACT,4FACA,0FACA,mCACA,4HACA,mDACAC,KAAS,6DACTC,CACF;EACK;EACL,GAAIH;CACL,CAAA,GACAE,KAAS,kBAAC,KAAD;EAAG,WAAU;EAAuC,UAAAA;CAAS,CAAA,CACpE;A,EAGX;AAEA,EAAM,cAAc;AAMpB,IAAaE,IAAWL,GACrB,EAAE,cAAW,UAAO,GAAGC,KAAS,MAE7B,kBAAC,OAAD;CAAK,WAAU;CAAf,UAAA,CACE,kBAAC,YAAD;EACE,WAAWC,EACT,oGACA,0DACA,4HACA,mDACAC,KAAS,6DACTC,CACF;EACK;EACL,GAAIH;CACL,CAAA,GACAE,KAAS,kBAAC,KAAD;EAAG,WAAU;EAAuC,UAAAA;CAAS,CAAA,CACpE;A,EAGX;AAEA,EAAS,cAAc;AASvB,IAAaG,KAAyB,EAAE,aAAU,YAAS,aAAU,mBAEjE,kBAAC,SAAD;CACW;CACT,WAAWJ,EACT,8FACAE,CACF;CALF,UAAA,CAOGG,GACAC,KAAY,kBAAC,QAAD;EAAM,WAAU;EAA8B,UAAA;CAAO,CAAA,CAC7D;A,IAcEC,KAAiC,EAC5C,UACA,YACA,aACA,UACA,gBACA,aACA,mBAGE,kBAAC,OAAD;CAAK,WAAWP,EAAG,aAAaE,CAAS;CAAzC,UAAA;EACE,kBAACE,GAAD;GAAgB;GAAmB;GAChC,UAAAI;EACI,CAAA;EACNH;EACAI,KAAe,CAACR,KAAS,kBAAC,KAAD;GAAG,WAAU;GAA+B,UAAAQ;EAAe,CAAA;EACpFR,KAAS,kBAAC,KAAD;GAAG,WAAU;GAAkC,UAAAA;EAAS,CAAA;CAC/D"}
@@ -0,0 +1,3 @@
1
+ export declare function KnowledgeSourceImportPanel({ knowledgeBaseId }: {
2
+ knowledgeBaseId: string;
3
+ }): import('react').JSX.Element;
@@ -1,15 +1,15 @@
1
- import { useBotlit as e } from "../providers/BotlitProvider.js";
2
- import { Button as t } from "./Button.js";
3
- import { useKnowledgeSourceImports as n } from "../hooks/useKnowledgeSourceImports.js";
1
+ import { useKnowledgeSourceImports as e } from "../hooks/useKnowledgeSourceImports.js";
2
+ import { useBotlit as t } from "../providers/BotlitProvider.js";
3
+ import { Button as n } from "./Button.js";
4
4
  import { useRef as r, useState as i } from "react";
5
5
  import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
- //#region src/botlit/components/KnowledgeSourceImportPanel.tsx
7
- function s({ knowledgeBaseId: t }) {
8
- let { workspaceId: n, currentUser: r } = e();
9
- return /* @__PURE__ */ a(c, { knowledgeBaseId: t }, `${n}:${r?.id}:${t}`);
6
+ // src/botlit/components/KnowledgeSourceImportPanel.tsx
7
+ function s({ knowledgeBaseId: e }) {
8
+ let { workspaceId: n, currentUser: r } = t();
9
+ return /* @__PURE__ */ a(c, { knowledgeBaseId: e }, `${n}:${r?.id}:${e}`);
10
10
  }
11
- function c({ knowledgeBaseId: e }) {
12
- let s = n(e), [c, l] = i("website"), [u, d] = i(""), [f, p] = i(""), [m, h] = i(""), g = r(null);
11
+ function c({ knowledgeBaseId: t }) {
12
+ let s = e(t), [c, l] = i("website"), [u, d] = i(""), [f, p] = i(""), [m, h] = i(""), g = r(null);
13
13
  return /* @__PURE__ */ o("section", {
14
14
  className: "space-y-4 rounded-lg border border-border-default p-5",
15
15
  children: [
@@ -63,7 +63,7 @@ function c({ knowledgeBaseId: e }) {
63
63
  className: "text-sm text-text-secondary",
64
64
  children: "Website imports capture one static page without signing in. Cross-origin redirects and embedded documents are rejected. Text sources must fit within 240 KiB; split larger sources."
65
65
  }),
66
- /* @__PURE__ */ a(t, {
66
+ /* @__PURE__ */ a(n, {
67
67
  disabled: !u.trim() || !f.trim(),
68
68
  isLoading: s.queue.isPending,
69
69
  onClick: async () => {
@@ -108,7 +108,7 @@ function c({ knowledgeBaseId: e }) {
108
108
  e.title,
109
109
  " · ",
110
110
  e.status.toLowerCase()
111
- ] }), e.status === "BLOCKED" && /* @__PURE__ */ a(t, {
111
+ ] }), e.status === "BLOCKED" && /* @__PURE__ */ a(n, {
112
112
  variant: "outline",
113
113
  isLoading: s.retry.isPending,
114
114
  onClick: async () => {
@@ -121,7 +121,7 @@ function c({ knowledgeBaseId: e }) {
121
121
  children: "Retry import"
122
122
  })]
123
123
  }, e.id)),
124
- /* @__PURE__ */ a(t, {
124
+ /* @__PURE__ */ a(n, {
125
125
  variant: "outline",
126
126
  onClick: () => void s.imports.refetch(),
127
127
  children: "Refresh imports"
@@ -129,7 +129,6 @@ function c({ knowledgeBaseId: e }) {
129
129
  ]
130
130
  });
131
131
  }
132
- //#endregion
133
132
  export { s as KnowledgeSourceImportPanel };
134
133
 
135
134
  //# sourceMappingURL=KnowledgeSourceImportPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"KnowledgeSourceImportPanel.js","names":[],"sources":["../../../src/botlit/components/KnowledgeSourceImportPanel.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport { useKnowledgeSourceImports } from '../hooks/useKnowledgeSourceImports';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { Button } from './Button';\n\nexport function KnowledgeSourceImportPanel({ knowledgeBaseId }: { knowledgeBaseId: string }) {\n const { workspaceId, currentUser } = useBotlit();\n return (\n <ScopedImportPanel\n key={`${workspaceId}:${currentUser?.id}:${knowledgeBaseId}`}\n knowledgeBaseId={knowledgeBaseId}\n />\n );\n}\nfunction ScopedImportPanel({ knowledgeBaseId }: { knowledgeBaseId: string }) {\n const sources = useKnowledgeSourceImports(knowledgeBaseId);\n const [kind, setKind] = useState('website'),\n [title, setTitle] = useState(''),\n [value, setValue] = useState(''),\n [message, setMessage] = useState('');\n const pending = useRef<{ id: string; fingerprint: string } | null>(null);\n return (\n <section className=\"space-y-4 rounded-lg border border-border-default p-5\">\n <h2 className=\"text-lg font-semibold\">Import website or text knowledge</h2>\n <p className=\"text-sm text-text-secondary\">\n Fluidgrids captures each source and checkpoints embedding batches. Course content uses the\n BuildMyIQ course import. Use a new knowledge base for the first managed import.\n </p>\n <label className=\"grid gap-2 text-sm\">\n Source type\n <select\n className=\"h-10 rounded-md border border-border-default bg-bg-surface px-3\"\n value={kind}\n disabled={sources.queue.isPending}\n onChange={(event) => {\n setKind(event.target.value);\n setValue('');\n }}\n >\n <option value=\"website\">Public website page</option>\n <option value=\"text\">Text or Markdown</option>\n </select>\n </label>\n <label className=\"grid gap-2 text-sm\">\n Title\n <input\n className=\"h-10 rounded-md border border-border-default bg-bg-surface px-3\"\n value={title}\n maxLength={255}\n disabled={sources.queue.isPending}\n onChange={(event) => setTitle(event.target.value)}\n />\n </label>\n <label className=\"grid gap-2 text-sm\">\n {kind === 'website' ? 'Exact public HTTPS page' : 'Source text'}\n <textarea\n className=\"rounded-md border border-border-default bg-bg-surface p-3\"\n rows={kind === 'website' ? 2 : 6}\n value={value}\n disabled={sources.queue.isPending}\n onChange={(event) => setValue(event.target.value)}\n />\n </label>\n <p className=\"text-sm text-text-secondary\">\n Website imports capture one static page without signing in. Cross-origin redirects and\n embedded documents are rejected. Text sources must fit within 240 KiB; split larger sources.\n </p>\n <Button\n disabled={!title.trim() || !value.trim()}\n isLoading={sources.queue.isPending}\n onClick={async () => {\n if (\n (kind === 'text' && new TextEncoder().encode(value).length > 245760) ||\n (kind === 'website' && value.length > 2048)\n ) {\n setMessage('The source is too large. Split it into smaller sources.');\n return;\n }\n const fingerprint = JSON.stringify([kind, title, value]);\n if (pending.current?.fingerprint !== fingerprint)\n pending.current = { id: crypto.randomUUID(), fingerprint };\n try {\n await sources.queue.mutateAsync({\n clientRequestId: pending.current.id,\n title,\n ...(kind === 'website' ? { sourceUrl: value.trim() } : { content: value }),\n });\n pending.current = null;\n setValue('');\n setMessage('Source queued. Its progress will appear below.');\n } catch {\n setMessage(\n 'Admission could not be confirmed. Retry the same source to reuse its request ID. Check the source, embedding configuration and management permission.'\n );\n }\n }}\n >\n Queue import\n </Button>\n {message && <p role=\"status\">{message}</p>}\n {sources.imports.isError ? (\n <p role=\"alert\">\n Imports could not be loaded. Knowledge management permission is required.\n </p>\n ) : sources.imports.isPending ? (\n <p role=\"status\">Loading imports…</p>\n ) : (\n sources.imports.data?.map((row) => (\n <div key={row.id} className=\"flex items-center justify-between gap-3 text-sm\">\n <span>\n {row.title} · {row.status.toLowerCase()}\n </span>\n {row.status === 'BLOCKED' && (\n <Button\n variant=\"outline\"\n isLoading={sources.retry.isPending}\n onClick={async () => {\n try {\n await sources.retry.mutateAsync(row.id);\n setMessage('Import recovery queued.');\n } catch {\n setMessage(\n 'Recovery failed. The embedding profile must still match the original import.'\n );\n }\n }}\n >\n Retry import\n </Button>\n )}\n </div>\n ))\n )}\n <Button variant=\"outline\" onClick={() => void sources.imports.refetch()}>\n Refresh imports\n </Button>\n </section>\n );\n}\n"],"mappings":";;;;;;AAKA,SAAgB,EAA2B,EAAE,sBAAgD;CAC3F,IAAM,EAAE,gBAAa,mBAAgB,GAAW;AAChD,QACE,kBAAC,GAAD,EAEmB,oBACjB,EAFK,GAAG,EAAY,GAAG,GAAa,GAAG,GAAG,IAE1C;;AAGN,SAAS,EAAkB,EAAE,sBAAgD;CAC3E,IAAM,IAAU,EAA0B,EAAgB,EACpD,CAAC,GAAM,KAAW,EAAS,UAAU,EACzC,CAAC,GAAO,KAAY,EAAS,GAAG,EAChC,CAAC,GAAO,KAAY,EAAS,GAAG,EAChC,CAAC,GAAS,KAAc,EAAS,GAAG,EAChC,IAAU,EAAmD,KAAK;AACxE,QACE,kBAAC,WAAD;EAAS,WAAU;YAAnB;GACE,kBAAC,MAAD;IAAI,WAAU;cAAwB;IAAqC,CAAA;GAC3E,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAGvC,CAAA;GACJ,kBAAC,SAAD;IAAO,WAAU;cAAjB,CAAsC,eAEpC,kBAAC,UAAD;KACE,WAAU;KACV,OAAO;KACP,UAAU,EAAQ,MAAM;KACxB,WAAW,MAAU;AAEnB,MADA,EAAQ,EAAM,OAAO,MAAM,EAC3B,EAAS,GAAG;;eANhB,CASE,kBAAC,UAAD;MAAQ,OAAM;gBAAU;MAA4B,CAAA,EACpD,kBAAC,UAAD;MAAQ,OAAM;gBAAO;MAAyB,CAAA,CACvC;OACH;;GACR,kBAAC,SAAD;IAAO,WAAU;cAAjB,CAAsC,SAEpC,kBAAC,SAAD;KACE,WAAU;KACV,OAAO;KACP,WAAW;KACX,UAAU,EAAQ,MAAM;KACxB,WAAW,MAAU,EAAS,EAAM,OAAO,MAAM;KACjD,CAAA,CACI;;GACR,kBAAC,SAAD;IAAO,WAAU;cAAjB,CACG,MAAS,YAAY,4BAA4B,eAClD,kBAAC,YAAD;KACE,WAAU;KACV,MAAM,MAAS,YAAY,IAAI;KACxB;KACP,UAAU,EAAQ,MAAM;KACxB,WAAW,MAAU,EAAS,EAAM,OAAO,MAAM;KACjD,CAAA,CACI;;GACR,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAGvC,CAAA;GACJ,kBAAC,GAAD;IACE,UAAU,CAAC,EAAM,MAAM,IAAI,CAAC,EAAM,MAAM;IACxC,WAAW,EAAQ,MAAM;IACzB,SAAS,YAAY;AACnB,SACG,MAAS,UAAU,IAAI,aAAa,CAAC,OAAO,EAAM,CAAC,SAAS,UAC5D,MAAS,aAAa,EAAM,SAAS,MACtC;AACA,QAAW,0DAA0D;AACrE;;KAEF,IAAM,IAAc,KAAK,UAAU;MAAC;MAAM;MAAO;MAAM,CAAC;AACxD,KAAI,EAAQ,SAAS,gBAAgB,MACnC,EAAQ,UAAU;MAAE,IAAI,OAAO,YAAY;MAAE;MAAa;AAC5D,SAAI;AAQF,MAPA,MAAM,EAAQ,MAAM,YAAY;OAC9B,iBAAiB,EAAQ,QAAQ;OACjC;OACA,GAAI,MAAS,YAAY,EAAE,WAAW,EAAM,MAAM,EAAE,GAAG,EAAE,SAAS,GAAO;OAC1E,CAAC,EACF,EAAQ,UAAU,MAClB,EAAS,GAAG,EACZ,EAAW,iDAAiD;aACtD;AACN,QACE,wJACD;;;cAGN;IAEQ,CAAA;GACR,KAAW,kBAAC,KAAD;IAAG,MAAK;cAAU;IAAY,CAAA;GACzC,EAAQ,QAAQ,UACf,kBAAC,KAAD;IAAG,MAAK;cAAQ;IAEZ,CAAA,GACF,EAAQ,QAAQ,YAClB,kBAAC,KAAD;IAAG,MAAK;cAAS;IAAoB,CAAA,GAErC,EAAQ,QAAQ,MAAM,KAAK,MACzB,kBAAC,OAAD;IAAkB,WAAU;cAA5B,CACE,kBAAC,QAAD,EAAA,UAAA;KACG,EAAI;KAAM;KAAI,EAAI,OAAO,aAAa;KAClC,EAAA,CAAA,EACN,EAAI,WAAW,aACd,kBAAC,GAAD;KACE,SAAQ;KACR,WAAW,EAAQ,MAAM;KACzB,SAAS,YAAY;AACnB,UAAI;AAEF,OADA,MAAM,EAAQ,MAAM,YAAY,EAAI,GAAG,EACvC,EAAW,0BAA0B;cAC/B;AACN,SACE,+EACD;;;eAGN;KAEQ,CAAA,CAEP;MAtBI,EAAI,GAsBR,CACN;GAEJ,kBAAC,GAAD;IAAQ,SAAQ;IAAU,eAAe,KAAK,EAAQ,QAAQ,SAAS;cAAE;IAEhE,CAAA;GACD"}
1
+ {"version":3,"file":"KnowledgeSourceImportPanel.js","names":["KnowledgeSourceImportPanel","useBotlit","ScopedImportPanel","workspaceId","currentUser","knowledgeBaseId","sources","useKnowledgeSourceImports","kind","setKind","useState","title","setTitle","value","setValue","message","setMessage","pending","useRef","event","Button","fingerprint","row"],"sources":["../../../src/botlit/components/KnowledgeSourceImportPanel.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport { useKnowledgeSourceImports } from '../hooks/useKnowledgeSourceImports';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { Button } from './Button';\n\nexport function KnowledgeSourceImportPanel({ knowledgeBaseId }: { knowledgeBaseId: string }) {\n const { workspaceId, currentUser } = useBotlit();\n return (\n <ScopedImportPanel\n key={`${workspaceId}:${currentUser?.id}:${knowledgeBaseId}`}\n knowledgeBaseId={knowledgeBaseId}\n />\n );\n}\nfunction ScopedImportPanel({ knowledgeBaseId }: { knowledgeBaseId: string }) {\n const sources = useKnowledgeSourceImports(knowledgeBaseId);\n const [kind, setKind] = useState('website'),\n [title, setTitle] = useState(''),\n [value, setValue] = useState(''),\n [message, setMessage] = useState('');\n const pending = useRef<{ id: string; fingerprint: string } | null>(null);\n return (\n <section className=\"space-y-4 rounded-lg border border-border-default p-5\">\n <h2 className=\"text-lg font-semibold\">Import website or text knowledge</h2>\n <p className=\"text-sm text-text-secondary\">\n Fluidgrids captures each source and checkpoints embedding batches. Course content uses the\n BuildMyIQ course import. Use a new knowledge base for the first managed import.\n </p>\n <label className=\"grid gap-2 text-sm\">\n Source type\n <select\n className=\"h-10 rounded-md border border-border-default bg-bg-surface px-3\"\n value={kind}\n disabled={sources.queue.isPending}\n onChange={(event) => {\n setKind(event.target.value);\n setValue('');\n }}\n >\n <option value=\"website\">Public website page</option>\n <option value=\"text\">Text or Markdown</option>\n </select>\n </label>\n <label className=\"grid gap-2 text-sm\">\n Title\n <input\n className=\"h-10 rounded-md border border-border-default bg-bg-surface px-3\"\n value={title}\n maxLength={255}\n disabled={sources.queue.isPending}\n onChange={(event) => setTitle(event.target.value)}\n />\n </label>\n <label className=\"grid gap-2 text-sm\">\n {kind === 'website' ? 'Exact public HTTPS page' : 'Source text'}\n <textarea\n className=\"rounded-md border border-border-default bg-bg-surface p-3\"\n rows={kind === 'website' ? 2 : 6}\n value={value}\n disabled={sources.queue.isPending}\n onChange={(event) => setValue(event.target.value)}\n />\n </label>\n <p className=\"text-sm text-text-secondary\">\n Website imports capture one static page without signing in. Cross-origin redirects and\n embedded documents are rejected. Text sources must fit within 240 KiB; split larger sources.\n </p>\n <Button\n disabled={!title.trim() || !value.trim()}\n isLoading={sources.queue.isPending}\n onClick={async () => {\n if (\n (kind === 'text' && new TextEncoder().encode(value).length > 245760) ||\n (kind === 'website' && value.length > 2048)\n ) {\n setMessage('The source is too large. Split it into smaller sources.');\n return;\n }\n const fingerprint = JSON.stringify([kind, title, value]);\n if (pending.current?.fingerprint !== fingerprint)\n pending.current = { id: crypto.randomUUID(), fingerprint };\n try {\n await sources.queue.mutateAsync({\n clientRequestId: pending.current.id,\n title,\n ...(kind === 'website' ? { sourceUrl: value.trim() } : { content: value }),\n });\n pending.current = null;\n setValue('');\n setMessage('Source queued. Its progress will appear below.');\n } catch {\n setMessage(\n 'Admission could not be confirmed. Retry the same source to reuse its request ID. Check the source, embedding configuration and management permission.'\n );\n }\n }}\n >\n Queue import\n </Button>\n {message && <p role=\"status\">{message}</p>}\n {sources.imports.isError ? (\n <p role=\"alert\">\n Imports could not be loaded. Knowledge management permission is required.\n </p>\n ) : sources.imports.isPending ? (\n <p role=\"status\">Loading imports…</p>\n ) : (\n sources.imports.data?.map((row) => (\n <div key={row.id} className=\"flex items-center justify-between gap-3 text-sm\">\n <span>\n {row.title} · {row.status.toLowerCase()}\n </span>\n {row.status === 'BLOCKED' && (\n <Button\n variant=\"outline\"\n isLoading={sources.retry.isPending}\n onClick={async () => {\n try {\n await sources.retry.mutateAsync(row.id);\n setMessage('Import recovery queued.');\n } catch {\n setMessage(\n 'Recovery failed. The embedding profile must still match the original import.'\n );\n }\n }}\n >\n Retry import\n </Button>\n )}\n </div>\n ))\n )}\n <Button variant=\"outline\" onClick={() => void sources.imports.refetch()}>\n Refresh imports\n </Button>\n </section>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { LLMProviderRecord } from '../hooks/useLLMProviders';
2
+ export declare function ModelRegistrationPanel({ providers, onCreated, }: {
3
+ providers: LLMProviderRecord[];
4
+ onCreated: () => void;
5
+ }): import('react').JSX.Element;
@@ -5,7 +5,7 @@ import { FormField as o, Input as s } from "./Input.js";
5
5
  import { useState as c } from "react";
6
6
  import { jsx as l, jsxs as u } from "react/jsx-runtime";
7
7
  import { toast as d } from "sonner";
8
- //#region src/botlit/components/ModelRegistrationPanel.tsx
8
+ // src/botlit/components/ModelRegistrationPanel.tsx
9
9
  function f({ providers: f, onCreated: p }) {
10
10
  let { createModel: m, isCreating: h } = e(), [g, _] = c(""), [v, y] = c(""), [b, x] = c(""), [S, C] = c("answer"), [w, T] = c(""), [E, D] = c("8192"), [O, k] = c("2048"), [A, j] = c("0"), [M, N] = c("0"), P = f.filter((e) => e.isActive), F = P.find((e) => e.id === g), I = F?.type === "AWS_BEDROCK" ? b.trim() === "amazon.titan-embed-text-v2:0" : [
11
11
  "OPENAI",
@@ -168,7 +168,6 @@ function f({ providers: f, onCreated: p }) {
168
168
  ]
169
169
  })] });
170
170
  }
171
- //#endregion
172
171
  export { f as ModelRegistrationPanel };
173
172
 
174
173
  //# sourceMappingURL=ModelRegistrationPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ModelRegistrationPanel.js","names":[],"sources":["../../../src/botlit/components/ModelRegistrationPanel.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useCreateLLMModel, type LLMProviderRecord } from '../hooks/useLLMProviders';\nimport { Button } from './Button';\nimport { Card, CardContent, CardHeader, CardTitle } from './Card';\nimport { FormField, Input } from './Input';\n\nexport function ModelRegistrationPanel({\n providers,\n onCreated,\n}: {\n providers: LLMProviderRecord[];\n onCreated: () => void;\n}) {\n const { createModel, isCreating } = useCreateLLMModel();\n const [providerId, setProviderId] = useState('');\n const [name, setName] = useState('');\n const [modelId, setModelId] = useState('');\n const [purpose, setPurpose] = useState('answer');\n const [embeddingDimensions, setEmbeddingDimensions] = useState('');\n const [contextWindow, setContextWindow] = useState('8192');\n const [maxOutputTokens, setMaxOutputTokens] = useState('2048');\n const [inputPrice, setInputPrice] = useState('0');\n const [outputPrice, setOutputPrice] = useState('0');\n const activeProviders = providers.filter((provider) => provider.isActive);\n const selectedProvider = activeProviders.find((provider) => provider.id === providerId);\n const embeddingSupported =\n selectedProvider?.type === 'AWS_BEDROCK'\n ? modelId.trim() === 'amazon.titan-embed-text-v2:0'\n : ['OPENAI', 'AZURE_OPENAI', 'CUSTOM'].includes(selectedProvider?.type ?? '');\n const valid =\n activeProviders.some((provider) => provider.id === providerId) &&\n Boolean(name.trim() && modelId.trim()) &&\n Number.isSafeInteger(Number(contextWindow)) &&\n Number(contextWindow) > 0 &&\n (purpose !== 'embedding' ||\n (embeddingSupported &&\n Number.isInteger(Number(embeddingDimensions)) &&\n Number(embeddingDimensions) > 0 &&\n Number(embeddingDimensions) <= 16000)) &&\n (purpose === 'embedding' ||\n (Number.isSafeInteger(Number(maxOutputTokens)) && Number(maxOutputTokens) > 0)) &&\n (purpose === 'embedding' ? [inputPrice] : [inputPrice, outputPrice]).every(\n (value) => value.trim() !== '' && Number.isFinite(Number(value)) && Number(value) >= 0\n );\n return (\n <Card>\n <CardHeader>\n <CardTitle>Register model</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Register an answer or embedding model available through your provider. Model access and\n billing limits must already be configured.\n </p>\n <FormField label=\"Model provider\">\n <select\n aria-label=\"Model provider\"\n value={providerId}\n onChange={(event) => {\n setProviderId(event.target.value);\n const provider = activeProviders.find((entry) => entry.id === event.target.value);\n setEmbeddingDimensions(\n provider?.type === 'AWS_BEDROCK'\n ? String(provider.metadata?.embeddingDimensions ?? 1024)\n : ''\n );\n }}\n className=\"h-10 w-full rounded-md border bg-bg-surface px-3\"\n >\n <option value=\"\">Choose an active provider</option>\n {activeProviders.map((provider) => (\n <option key={provider.id} value={provider.id}>\n {provider.name}\n </option>\n ))}\n </select>\n </FormField>\n <FormField label=\"Model name\">\n <Input\n aria-label=\"Model name\"\n value={name}\n maxLength={255}\n onChange={(event) => setName(event.target.value)}\n />\n </FormField>\n <FormField label=\"Provider model ID\">\n <Input\n aria-label=\"Provider model ID\"\n value={modelId}\n maxLength={255}\n onChange={(event) => {\n setModelId(event.target.value);\n const defaultDimensions: Record<string, number> = {\n 'text-embedding-3-small': 1536,\n 'text-embedding-3-large': 3072,\n 'text-embedding-ada-002': 1536,\n };\n const dimensions = defaultDimensions[event.target.value.trim()];\n if (dimensions) setEmbeddingDimensions(String(dimensions));\n }}\n />\n </FormField>\n <FormField label=\"Model purpose\">\n <select\n aria-label=\"Model purpose\"\n value={purpose}\n onChange={(event) => setPurpose(event.target.value)}\n className=\"h-10 w-full rounded-md border bg-bg-surface px-3\"\n >\n <option value=\"answer\">Answer generation</option>\n <option value=\"embedding\">Content embeddings</option>\n </select>\n </FormField>\n {purpose === 'embedding' && (\n <FormField label=\"Embedding dimensions\">\n <Input\n aria-label=\"Embedding dimensions\"\n type=\"number\"\n min={1}\n max={16000}\n disabled={selectedProvider?.type === 'AWS_BEDROCK'}\n value={embeddingDimensions}\n onChange={(event) => setEmbeddingDimensions(event.target.value)}\n />\n <p className=\"text-sm text-text-secondary\">\n Use the vector size returned by this deployment. Supported: Titan Text Embeddings V2\n and OpenAI-compatible embedding endpoints.\n </p>\n </FormField>\n )}\n <FormField label=\"Context window\">\n <Input\n aria-label=\"Context window\"\n type=\"number\"\n min={1}\n value={contextWindow}\n onChange={(event) => setContextWindow(event.target.value)}\n />\n </FormField>\n {purpose === 'answer' && (\n <FormField label=\"Maximum output tokens\">\n <Input\n aria-label=\"Maximum output tokens\"\n type=\"number\"\n min={1}\n value={maxOutputTokens}\n onChange={(event) => setMaxOutputTokens(event.target.value)}\n />\n </FormField>\n )}\n <FormField label=\"Input price per million tokens\">\n <Input\n aria-label=\"Input price per million tokens\"\n type=\"number\"\n min={0}\n step=\"any\"\n value={inputPrice}\n onChange={(event) => setInputPrice(event.target.value)}\n />\n </FormField>\n {purpose === 'answer' && (\n <FormField label=\"Output price per million tokens\">\n <Input\n aria-label=\"Output price per million tokens\"\n type=\"number\"\n min={0}\n step=\"any\"\n value={outputPrice}\n onChange={(event) => setOutputPrice(event.target.value)}\n />\n </FormField>\n )}\n <Button\n disabled={!valid}\n isLoading={isCreating}\n onClick={async () => {\n try {\n await createModel({\n providerId,\n name: name.trim(),\n modelId: modelId.trim(),\n contextWindow: Number(contextWindow),\n maxOutputTokens: purpose === 'embedding' ? 0 : Number(maxOutputTokens),\n inputPricePerMToken: Number(inputPrice),\n outputPricePerMToken: purpose === 'embedding' ? 0 : Number(outputPrice),\n supportsStreaming: purpose === 'answer',\n supportsFunctionCalling: false,\n supportsVision: false,\n metadata: {\n purpose,\n ...(purpose === 'embedding'\n ? { embeddingDimensions: Number(embeddingDimensions) }\n : {}),\n },\n });\n setName('');\n setModelId('');\n onCreated();\n toast.success('Model registered.');\n } catch (error) {\n toast.error(error instanceof Error ? error.message : 'Model registration failed.');\n }\n }}\n >\n Register model\n </Button>\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ModelRegistrationPanel.js","names":["ModelRegistrationPanel","useCreateLLMModel","providerId","setProviderId","useState","name","setName","modelId","setModelId","purpose","setPurpose","embeddingDimensions","setEmbeddingDimensions","contextWindow","setContextWindow","maxOutputTokens","setMaxOutputTokens","inputPrice","setInputPrice","outputPrice","setOutputPrice","activeProviders","providers","provider","selectedProvider","embeddingSupported","valid","value","Card","CardHeader","CardTitle","CardContent","FormField","event","entry","Input","dimensions","Button","isCreating","createModel","onCreated","toast","error"],"sources":["../../../src/botlit/components/ModelRegistrationPanel.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { toast } from 'sonner';\nimport { useCreateLLMModel, type LLMProviderRecord } from '../hooks/useLLMProviders';\nimport { Button } from './Button';\nimport { Card, CardContent, CardHeader, CardTitle } from './Card';\nimport { FormField, Input } from './Input';\n\nexport function ModelRegistrationPanel({\n providers,\n onCreated,\n}: {\n providers: LLMProviderRecord[];\n onCreated: () => void;\n}) {\n const { createModel, isCreating } = useCreateLLMModel();\n const [providerId, setProviderId] = useState('');\n const [name, setName] = useState('');\n const [modelId, setModelId] = useState('');\n const [purpose, setPurpose] = useState('answer');\n const [embeddingDimensions, setEmbeddingDimensions] = useState('');\n const [contextWindow, setContextWindow] = useState('8192');\n const [maxOutputTokens, setMaxOutputTokens] = useState('2048');\n const [inputPrice, setInputPrice] = useState('0');\n const [outputPrice, setOutputPrice] = useState('0');\n const activeProviders = providers.filter((provider) => provider.isActive);\n const selectedProvider = activeProviders.find((provider) => provider.id === providerId);\n const embeddingSupported =\n selectedProvider?.type === 'AWS_BEDROCK'\n ? modelId.trim() === 'amazon.titan-embed-text-v2:0'\n : ['OPENAI', 'AZURE_OPENAI', 'CUSTOM'].includes(selectedProvider?.type ?? '');\n const valid =\n activeProviders.some((provider) => provider.id === providerId) &&\n Boolean(name.trim() && modelId.trim()) &&\n Number.isSafeInteger(Number(contextWindow)) &&\n Number(contextWindow) > 0 &&\n (purpose !== 'embedding' ||\n (embeddingSupported &&\n Number.isInteger(Number(embeddingDimensions)) &&\n Number(embeddingDimensions) > 0 &&\n Number(embeddingDimensions) <= 16000)) &&\n (purpose === 'embedding' ||\n (Number.isSafeInteger(Number(maxOutputTokens)) && Number(maxOutputTokens) > 0)) &&\n (purpose === 'embedding' ? [inputPrice] : [inputPrice, outputPrice]).every(\n (value) => value.trim() !== '' && Number.isFinite(Number(value)) && Number(value) >= 0\n );\n return (\n <Card>\n <CardHeader>\n <CardTitle>Register model</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm text-text-secondary\">\n Register an answer or embedding model available through your provider. Model access and\n billing limits must already be configured.\n </p>\n <FormField label=\"Model provider\">\n <select\n aria-label=\"Model provider\"\n value={providerId}\n onChange={(event) => {\n setProviderId(event.target.value);\n const provider = activeProviders.find((entry) => entry.id === event.target.value);\n setEmbeddingDimensions(\n provider?.type === 'AWS_BEDROCK'\n ? String(provider.metadata?.embeddingDimensions ?? 1024)\n : ''\n );\n }}\n className=\"h-10 w-full rounded-md border bg-bg-surface px-3\"\n >\n <option value=\"\">Choose an active provider</option>\n {activeProviders.map((provider) => (\n <option key={provider.id} value={provider.id}>\n {provider.name}\n </option>\n ))}\n </select>\n </FormField>\n <FormField label=\"Model name\">\n <Input\n aria-label=\"Model name\"\n value={name}\n maxLength={255}\n onChange={(event) => setName(event.target.value)}\n />\n </FormField>\n <FormField label=\"Provider model ID\">\n <Input\n aria-label=\"Provider model ID\"\n value={modelId}\n maxLength={255}\n onChange={(event) => {\n setModelId(event.target.value);\n const defaultDimensions: Record<string, number> = {\n 'text-embedding-3-small': 1536,\n 'text-embedding-3-large': 3072,\n 'text-embedding-ada-002': 1536,\n };\n const dimensions = defaultDimensions[event.target.value.trim()];\n if (dimensions) setEmbeddingDimensions(String(dimensions));\n }}\n />\n </FormField>\n <FormField label=\"Model purpose\">\n <select\n aria-label=\"Model purpose\"\n value={purpose}\n onChange={(event) => setPurpose(event.target.value)}\n className=\"h-10 w-full rounded-md border bg-bg-surface px-3\"\n >\n <option value=\"answer\">Answer generation</option>\n <option value=\"embedding\">Content embeddings</option>\n </select>\n </FormField>\n {purpose === 'embedding' && (\n <FormField label=\"Embedding dimensions\">\n <Input\n aria-label=\"Embedding dimensions\"\n type=\"number\"\n min={1}\n max={16000}\n disabled={selectedProvider?.type === 'AWS_BEDROCK'}\n value={embeddingDimensions}\n onChange={(event) => setEmbeddingDimensions(event.target.value)}\n />\n <p className=\"text-sm text-text-secondary\">\n Use the vector size returned by this deployment. Supported: Titan Text Embeddings V2\n and OpenAI-compatible embedding endpoints.\n </p>\n </FormField>\n )}\n <FormField label=\"Context window\">\n <Input\n aria-label=\"Context window\"\n type=\"number\"\n min={1}\n value={contextWindow}\n onChange={(event) => setContextWindow(event.target.value)}\n />\n </FormField>\n {purpose === 'answer' && (\n <FormField label=\"Maximum output tokens\">\n <Input\n aria-label=\"Maximum output tokens\"\n type=\"number\"\n min={1}\n value={maxOutputTokens}\n onChange={(event) => setMaxOutputTokens(event.target.value)}\n />\n </FormField>\n )}\n <FormField label=\"Input price per million tokens\">\n <Input\n aria-label=\"Input price per million tokens\"\n type=\"number\"\n min={0}\n step=\"any\"\n value={inputPrice}\n onChange={(event) => setInputPrice(event.target.value)}\n />\n </FormField>\n {purpose === 'answer' && (\n <FormField label=\"Output price per million tokens\">\n <Input\n aria-label=\"Output price per million tokens\"\n type=\"number\"\n min={0}\n step=\"any\"\n value={outputPrice}\n onChange={(event) => setOutputPrice(event.target.value)}\n />\n </FormField>\n )}\n <Button\n disabled={!valid}\n isLoading={isCreating}\n onClick={async () => {\n try {\n await createModel({\n providerId,\n name: name.trim(),\n modelId: modelId.trim(),\n contextWindow: Number(contextWindow),\n maxOutputTokens: purpose === 'embedding' ? 0 : Number(maxOutputTokens),\n inputPricePerMToken: Number(inputPrice),\n outputPricePerMToken: purpose === 'embedding' ? 0 : Number(outputPrice),\n supportsStreaming: purpose === 'answer',\n supportsFunctionCalling: false,\n supportsVision: false,\n metadata: {\n purpose,\n ...(purpose === 'embedding'\n ? { embeddingDimensions: Number(embeddingDimensions) }\n : {}),\n },\n });\n setName('');\n setModelId('');\n onCreated();\n toast.success('Model registered.');\n } catch (error) {\n toast.error(error instanceof Error ? error.message : 'Model registration failed.');\n }\n }}\n >\n Register model\n </Button>\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { FC, ReactNode } from 'react';
2
+ interface PageLayoutProps {
3
+ title: ReactNode;
4
+ description?: ReactNode;
5
+ actions?: ReactNode;
6
+ children: ReactNode;
7
+ className?: string;
8
+ /** Render the aurora hero backdrop behind the header (one per MFE). */
9
+ hero?: boolean;
10
+ }
11
+ export declare const PageLayout: FC<PageLayoutProps>;
12
+ export {};
@@ -1,7 +1,7 @@
1
1
  import { cn as e } from "../utils/cn.js";
2
2
  import { AuroraBackground 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/PageLayout.tsx
4
+ // src/botlit/components/PageLayout.tsx
5
5
  var i = ({ title: i, description: a, actions: o, children: s, className: c, hero: l = !1 }) => /* @__PURE__ */ r("div", {
6
6
  className: e("flex flex-col h-full", c),
7
7
  children: [/* @__PURE__ */ r("div", {
@@ -28,7 +28,6 @@ var i = ({ title: i, description: a, actions: o, children: s, className: c, hero
28
28
  children: s
29
29
  })]
30
30
  });
31
- //#endregion
32
31
  export { i as PageLayout };
33
32
 
34
33
  //# sourceMappingURL=PageLayout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/botlit/components/PageLayout.tsx"],"sourcesContent":["/**\n * Page Layout Component\n * @module botlit/components\n *\n * Boff UI 2.0: the page header uses a seam border and can optionally host the\n * living-glass `AuroraBackground` (the ONE hero backdrop per MFE — opt in via\n * `hero`). The aurora sits behind the header content at -z-10 and never moves\n * page content. Reduced-motion is honoured by the primitive.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { AuroraBackground } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n /** Render the aurora hero backdrop behind the header (one per MFE). */\n hero?: boolean;\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n actions,\n children,\n className,\n hero = false,\n}) => {\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Page Header */}\n <div\n className={cn(\n 'relative flex items-center justify-between gap-4 px-6 py-4 border-b border-border-seam',\n hero ? 'overflow-hidden bg-hero-mesh' : 'bg-bg-surface'\n )}\n >\n {hero && <AuroraBackground intensity=\"subtle\" />}\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-semibold tracking-tight text-text-primary\">{title}</h1>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n </div>\n {actions && <div className=\"flex flex-shrink-0 items-center gap-3\">{actions}</div>}\n </div>\n\n {/* Page Content */}\n <div className=\"flex-1 overflow-auto p-6\">{children}</div>\n </div>\n );\n};\n"],"mappings":";;;;AAwBA,IAAa,KAAmC,EAC9C,UACA,gBACA,YACA,aACA,cACA,UAAO,SAGL,kBAAC,OAAD;CAAK,WAAW,EAAG,wBAAwB,EAAU;WAArD,CAEE,kBAAC,OAAD;EACE,WAAW,EACT,0FACA,IAAO,iCAAiC,gBACzC;YAJH;GAMG,KAAQ,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA;GAChD,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAA2D;KAAW,CAAA,EACnF,KAAe,kBAAC,KAAD;KAAG,WAAU;eAAoC;KAAgB,CAAA,CAC7E;;GACL,KAAW,kBAAC,OAAD;IAAK,WAAU;cAAyC;IAAc,CAAA;GAC9E;KAGN,kBAAC,OAAD;EAAK,WAAU;EAA4B;EAAe,CAAA,CACtD"}
1
+ {"version":3,"file":"PageLayout.js","names":["PageLayout","cn","className","hero","AuroraBackground","title","description","actions"],"sources":["../../../src/botlit/components/PageLayout.tsx"],"sourcesContent":["/**\n * Page Layout Component\n * @module botlit/components\n *\n * Boff UI 2.0: the page header uses a seam border and can optionally host the\n * living-glass `AuroraBackground` (the ONE hero backdrop per MFE — opt in via\n * `hero`). The aurora sits behind the header content at -z-10 and never moves\n * page content. Reduced-motion is honoured by the primitive.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { AuroraBackground } from '@burdenoff/fe-libs/ui';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n /** Render the aurora hero backdrop behind the header (one per MFE). */\n hero?: boolean;\n}\n\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n actions,\n children,\n className,\n hero = false,\n}) => {\n return (\n <div className={cn('flex flex-col h-full', className)}>\n {/* Page Header */}\n <div\n className={cn(\n 'relative flex items-center justify-between gap-4 px-6 py-4 border-b border-border-seam',\n hero ? 'overflow-hidden bg-hero-mesh' : 'bg-bg-surface'\n )}\n >\n {hero && <AuroraBackground intensity=\"subtle\" />}\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-semibold tracking-tight text-text-primary\">{title}</h1>\n {description && <p className=\"mt-1 text-sm text-text-secondary\">{description}</p>}\n </div>\n {actions && <div className=\"flex flex-shrink-0 items-center gap-3\">{actions}</div>}\n </div>\n\n {/* Page Content */}\n <div className=\"flex-1 overflow-auto p-6\">{children}</div>\n </div>\n );\n};\n"],"mappings":";;;;AAwBA,IAAaA,KAAmC,EAC9C,UACA,gBACA,YACA,aACA,cACA,UAAO,SAGL,kBAAC,OAAD;CAAK,WAAWC,EAAG,wBAAwBC,CAAS;CAApD,UAAA,CAEE,kBAAC,OAAD;EACE,WAAWD,EACT,0FACAE,IAAO,iCAAiC,eAC1C;EAJF,UAAA;GAMGA,KAAQ,kBAACC,GAAD,EAAkB,WAAU,SAAU,CAAA;GAC/C,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;KAA2D,UAAAC;IAAU,CAAA,GAClFC,KAAe,kBAAC,KAAD;KAAG,WAAU;KAAoC,UAAAA;IAAe,CAAA,CAC7E;;GACJC,KAAW,kBAAC,OAAD;IAAK,WAAU;IAAyC,UAAAA;GAAa,CAAA;EAC9E;CAGL,CAAA,GAAA,kBAAC,OAAD;EAAK,WAAU;EAA4B;CAAc,CAAA,CACtD"}
@@ -0,0 +1,9 @@
1
+ interface QuotaExhaustedDialogProps {
2
+ open: boolean;
3
+ title: string;
4
+ description: string;
5
+ onClose: () => void;
6
+ onViewBilling: () => void;
7
+ }
8
+ export declare function QuotaExhaustedDialog({ open, title, description, onClose, onViewBilling, }: QuotaExhaustedDialogProps): import('react').JSX.Element;
9
+ export {};
@@ -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;