@burdenoff/microfe-botmanor 2026.1106.1 → 2026.1109.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/dist/botlit/BotlitRoutes.d.ts +2 -0
  2. package/dist/botlit/BotlitRoutes.js +40 -37
  3. package/dist/botlit/BotlitRoutes.js.map +1 -1
  4. package/dist/botlit/BotmanorRoot.d.ts +3 -0
  5. package/dist/botlit/BotmanorRoot.js +1 -2
  6. package/dist/botlit/BotmanorRoot.js.map +1 -1
  7. package/dist/botlit/BotmanorRootInner.d.ts +3 -0
  8. package/dist/botlit/BotmanorRootInner.js +9 -10
  9. package/dist/botlit/BotmanorRootInner.js.map +1 -1
  10. package/dist/botlit/components/AgentApprovalPanel.d.ts +20 -0
  11. package/dist/botlit/components/AgentApprovalPanel.js +49 -50
  12. package/dist/botlit/components/AgentApprovalPanel.js.map +1 -1
  13. package/dist/botlit/components/AiOperationsPanel.d.ts +14 -0
  14. package/dist/botlit/components/AiOperationsPanel.js +253 -0
  15. package/dist/botlit/components/AiOperationsPanel.js.map +1 -0
  16. package/dist/botlit/components/AssistantChannelPanel.d.ts +3 -0
  17. package/dist/botlit/components/AssistantChannelPanel.js +12 -13
  18. package/dist/botlit/components/AssistantChannelPanel.js.map +1 -1
  19. package/dist/botlit/components/AssistantRuntimeSetupPanel.d.ts +4 -0
  20. package/dist/botlit/components/AssistantRuntimeSetupPanel.js +14 -14
  21. package/dist/botlit/components/AssistantRuntimeSetupPanel.js.map +1 -1
  22. package/dist/botlit/components/AssistantWebsitePanel.d.ts +5 -0
  23. package/dist/botlit/components/AssistantWebsitePanel.js +15 -16
  24. package/dist/botlit/components/AssistantWebsitePanel.js.map +1 -1
  25. package/dist/botlit/components/Badge.d.ts +9 -0
  26. package/dist/botlit/components/Badge.js +1 -2
  27. package/dist/botlit/components/Badge.js.map +1 -1
  28. package/dist/botlit/components/Button.d.ts +10 -0
  29. package/dist/botlit/components/Button.js +1 -2
  30. package/dist/botlit/components/Button.js.map +1 -1
  31. package/dist/botlit/components/Card.d.ts +16 -0
  32. package/dist/botlit/components/Card.js +1 -2
  33. package/dist/botlit/components/Card.js.map +1 -1
  34. package/dist/botlit/components/ChannelSelectorSheet.d.ts +23 -0
  35. package/dist/botlit/components/ChannelSelectorSheet.js +1 -2
  36. package/dist/botlit/components/ChannelSelectorSheet.js.map +1 -1
  37. package/dist/botlit/components/EmptyState.d.ts +12 -0
  38. package/dist/botlit/components/EmptyState.js +1 -2
  39. package/dist/botlit/components/EmptyState.js.map +1 -1
  40. package/dist/botlit/components/ErrorState.d.ts +10 -0
  41. package/dist/botlit/components/ErrorState.js +5 -6
  42. package/dist/botlit/components/ErrorState.js.map +1 -1
  43. package/dist/botlit/components/Input.d.ts +27 -0
  44. package/dist/botlit/components/Input.js +2 -3
  45. package/dist/botlit/components/Input.js.map +1 -1
  46. package/dist/botlit/components/KnowledgeSourceImportPanel.d.ts +3 -0
  47. package/dist/botlit/components/KnowledgeSourceImportPanel.js +12 -13
  48. package/dist/botlit/components/KnowledgeSourceImportPanel.js.map +1 -1
  49. package/dist/botlit/components/ModelRegistrationPanel.d.ts +5 -0
  50. package/dist/botlit/components/ModelRegistrationPanel.js +1 -2
  51. package/dist/botlit/components/ModelRegistrationPanel.js.map +1 -1
  52. package/dist/botlit/components/PageLayout.d.ts +12 -0
  53. package/dist/botlit/components/PageLayout.js +1 -2
  54. package/dist/botlit/components/PageLayout.js.map +1 -1
  55. package/dist/botlit/components/QuotaExhaustedDialog.d.ts +9 -0
  56. package/dist/botlit/components/QuotaExhaustedDialog.js +1 -2
  57. package/dist/botlit/components/QuotaExhaustedDialog.js.map +1 -1
  58. package/dist/botlit/components/RetentionStatusPanel.d.ts +2 -0
  59. package/dist/botlit/components/RetentionStatusPanel.js +18 -19
  60. package/dist/botlit/components/RetentionStatusPanel.js.map +1 -1
  61. package/dist/botlit/components/RouteLoader.d.ts +23 -0
  62. package/dist/botlit/components/RouteLoader.js +1 -2
  63. package/dist/botlit/components/RouteLoader.js.map +1 -1
  64. package/dist/botlit/components/VersionHistoryPanel.d.ts +12 -0
  65. package/dist/botlit/components/VersionHistoryPanel.js +23 -24
  66. package/dist/botlit/components/VersionHistoryPanel.js.map +1 -1
  67. package/dist/botlit/components/WorkspaceRequired.d.ts +18 -0
  68. package/dist/botlit/components/WorkspaceRequired.js +1 -2
  69. package/dist/botlit/components/WorkspaceRequired.js.map +1 -1
  70. package/dist/botlit/components/index.d.ts +14 -0
  71. package/dist/botlit/hooks/index.d.ts +36 -0
  72. package/dist/botlit/hooks/index.js +15 -13
  73. package/dist/botlit/hooks/internal/mutationInput.d.ts +56 -0
  74. package/dist/botlit/hooks/internal/mutationInput.js +1 -2
  75. package/dist/botlit/hooks/internal/mutationInput.js.map +1 -1
  76. package/dist/botlit/hooks/internal/workspaceGateway.d.ts +54 -0
  77. package/dist/botlit/hooks/internal/workspaceGateway.js +17 -19
  78. package/dist/botlit/hooks/internal/workspaceGateway.js.map +1 -1
  79. package/dist/botlit/hooks/useA2A.d.ts +104 -0
  80. package/dist/botlit/hooks/useA2A.js +45 -45
  81. package/dist/botlit/hooks/useA2A.js.map +1 -1
  82. package/dist/botlit/hooks/useAgentApprovals.d.ts +62 -0
  83. package/dist/botlit/hooks/useAgentApprovals.js +38 -39
  84. package/dist/botlit/hooks/useAgentApprovals.js.map +1 -1
  85. package/dist/botlit/hooks/useAgents.d.ts +105 -0
  86. package/dist/botlit/hooks/useAgents.js +53 -54
  87. package/dist/botlit/hooks/useAgents.js.map +1 -1
  88. package/dist/botlit/hooks/useAiOperations.d.ts +95 -0
  89. package/dist/botlit/hooks/useAiOperations.js +154 -0
  90. package/dist/botlit/hooks/useAiOperations.js.map +1 -0
  91. package/dist/botlit/hooks/useAssistantChannels.d.ts +16 -0
  92. package/dist/botlit/hooks/useAssistantChannels.js +1 -2
  93. package/dist/botlit/hooks/useAssistantChannels.js.map +1 -1
  94. package/dist/botlit/hooks/useAssistantRuntimeSetup.d.ts +17 -0
  95. package/dist/botlit/hooks/useAssistantRuntimeSetup.js +1 -2
  96. package/dist/botlit/hooks/useAssistantRuntimeSetup.js.map +1 -1
  97. package/dist/botlit/hooks/useAssistantWebsites.d.ts +18 -0
  98. package/dist/botlit/hooks/useAssistantWebsites.js +1 -2
  99. package/dist/botlit/hooks/useAssistantWebsites.js.map +1 -1
  100. package/dist/botlit/hooks/useBotWorkflow.d.ts +22 -0
  101. package/dist/botlit/hooks/useBotWorkflow.js +1 -2
  102. package/dist/botlit/hooks/useBotWorkflow.js.map +1 -1
  103. package/dist/botlit/hooks/useBots.d.ts +68 -0
  104. package/dist/botlit/hooks/useBots.js +32 -33
  105. package/dist/botlit/hooks/useBots.js.map +1 -1
  106. package/dist/botlit/hooks/useBuckets.d.ts +57 -0
  107. package/dist/botlit/hooks/useBuckets.js +38 -39
  108. package/dist/botlit/hooks/useBuckets.js.map +1 -1
  109. package/dist/botlit/hooks/useChannels.d.ts +87 -0
  110. package/dist/botlit/hooks/useChannels.js +73 -73
  111. package/dist/botlit/hooks/useChannels.js.map +1 -1
  112. package/dist/botlit/hooks/useConversations.d.ts +42 -0
  113. package/dist/botlit/hooks/useConversations.js +1 -2
  114. package/dist/botlit/hooks/useConversations.js.map +1 -1
  115. package/dist/botlit/hooks/useExecutions.d.ts +87 -0
  116. package/dist/botlit/hooks/useExecutions.js +37 -37
  117. package/dist/botlit/hooks/useExecutions.js.map +1 -1
  118. package/dist/botlit/hooks/useKnowledgeBases.d.ts +79 -0
  119. package/dist/botlit/hooks/useKnowledgeBases.js +40 -39
  120. package/dist/botlit/hooks/useKnowledgeBases.js.map +1 -1
  121. package/dist/botlit/hooks/useKnowledgeSourceImports.d.ts +21 -0
  122. package/dist/botlit/hooks/useKnowledgeSourceImports.js +1 -2
  123. package/dist/botlit/hooks/useKnowledgeSourceImports.js.map +1 -1
  124. package/dist/botlit/hooks/useLLMProviders.d.ts +66 -0
  125. package/dist/botlit/hooks/useLLMProviders.js +25 -26
  126. package/dist/botlit/hooks/useLLMProviders.js.map +1 -1
  127. package/dist/botlit/hooks/useMCPServers.d.ts +71 -0
  128. package/dist/botlit/hooks/useMCPServers.js +40 -38
  129. package/dist/botlit/hooks/useMCPServers.js.map +1 -1
  130. package/dist/botlit/hooks/usePolicies.d.ts +60 -0
  131. package/dist/botlit/hooks/usePolicies.js +49 -49
  132. package/dist/botlit/hooks/usePolicies.js.map +1 -1
  133. package/dist/botlit/hooks/usePromptTemplates.d.ts +88 -0
  134. package/dist/botlit/hooks/usePromptTemplates.js +57 -57
  135. package/dist/botlit/hooks/usePromptTemplates.js.map +1 -1
  136. package/dist/botlit/hooks/useRetention.d.ts +26 -0
  137. package/dist/botlit/hooks/useRetention.js +3 -3
  138. package/dist/botlit/hooks/useRetention.js.map +1 -1
  139. package/dist/botlit/hooks/useRetrievalProfiles.d.ts +75 -0
  140. package/dist/botlit/hooks/useRetrievalProfiles.js +47 -47
  141. package/dist/botlit/hooks/useRetrievalProfiles.js.map +1 -1
  142. package/dist/botlit/hooks/useSkills.d.ts +64 -0
  143. package/dist/botlit/hooks/useSkills.js +53 -53
  144. package/dist/botlit/hooks/useSkills.js.map +1 -1
  145. package/dist/botlit/hooks/useStore.d.ts +112 -0
  146. package/dist/botlit/hooks/useStore.js +55 -55
  147. package/dist/botlit/hooks/useStore.js.map +1 -1
  148. package/dist/botlit/hooks/useUserPlatformConnection.d.ts +80 -0
  149. package/dist/botlit/hooks/useUserPlatformConnection.js +19 -19
  150. package/dist/botlit/hooks/useUserPlatformConnection.js.map +1 -1
  151. package/dist/botlit/index.d.ts +16 -0
  152. package/dist/botlit/index.js +12 -11
  153. package/dist/botlit/pages/A2AAgentDetailPage.d.ts +6 -0
  154. package/dist/botlit/pages/A2AAgentDetailPage.js +171 -178
  155. package/dist/botlit/pages/A2AAgentDetailPage.js.map +1 -1
  156. package/dist/botlit/pages/A2ARegistryPage.d.ts +2 -0
  157. package/dist/botlit/pages/A2ARegistryPage.js +25 -26
  158. package/dist/botlit/pages/A2ARegistryPage.js.map +1 -1
  159. package/dist/botlit/pages/AgentApprovalsPage.d.ts +2 -0
  160. package/dist/botlit/pages/AgentApprovalsPage.js +32 -33
  161. package/dist/botlit/pages/AgentApprovalsPage.js.map +1 -1
  162. package/dist/botlit/pages/AgentBuilderPage.d.ts +2 -0
  163. package/dist/botlit/pages/AgentBuilderPage.js +59 -60
  164. package/dist/botlit/pages/AgentBuilderPage.js.map +1 -1
  165. package/dist/botlit/pages/AgentDetailPage.d.ts +2 -0
  166. package/dist/botlit/pages/AgentDetailPage.js +202 -190
  167. package/dist/botlit/pages/AgentDetailPage.js.map +1 -1
  168. package/dist/botlit/pages/AgentsListPage.d.ts +2 -0
  169. package/dist/botlit/pages/AgentsListPage.js +71 -72
  170. package/dist/botlit/pages/AgentsListPage.js.map +1 -1
  171. package/dist/botlit/pages/AiOperationsPage.d.ts +2 -0
  172. package/dist/botlit/pages/AiOperationsPage.js +165 -0
  173. package/dist/botlit/pages/AiOperationsPage.js.map +1 -0
  174. package/dist/botlit/pages/BotChannelsTab.d.ts +7 -0
  175. package/dist/botlit/pages/BotChannelsTab.js +120 -122
  176. package/dist/botlit/pages/BotChannelsTab.js.map +1 -1
  177. package/dist/botlit/pages/BotDetailPage.d.ts +7 -0
  178. package/dist/botlit/pages/BotDetailPage.js +246 -237
  179. package/dist/botlit/pages/BotDetailPage.js.map +1 -1
  180. package/dist/botlit/pages/BotWorkflowTab.d.ts +11 -0
  181. package/dist/botlit/pages/BotWorkflowTab.js +20 -21
  182. package/dist/botlit/pages/BotWorkflowTab.js.map +1 -1
  183. package/dist/botlit/pages/BotsListPage.d.ts +2 -0
  184. package/dist/botlit/pages/BotsListPage.js +52 -53
  185. package/dist/botlit/pages/BotsListPage.js.map +1 -1
  186. package/dist/botlit/pages/BucketsPage.d.ts +2 -0
  187. package/dist/botlit/pages/BucketsPage.js +260 -261
  188. package/dist/botlit/pages/BucketsPage.js.map +1 -1
  189. package/dist/botlit/pages/ChannelDetailPage.d.ts +6 -0
  190. package/dist/botlit/pages/ChannelDetailPage.js +97 -96
  191. package/dist/botlit/pages/ChannelDetailPage.js.map +1 -1
  192. package/dist/botlit/pages/ChannelRoutesPage.d.ts +2 -0
  193. package/dist/botlit/pages/ChannelRoutesPage.js +23 -24
  194. package/dist/botlit/pages/ChannelRoutesPage.js.map +1 -1
  195. package/dist/botlit/pages/ChannelsPage.d.ts +2 -0
  196. package/dist/botlit/pages/ChannelsPage.js +44 -45
  197. package/dist/botlit/pages/ChannelsPage.js.map +1 -1
  198. package/dist/botlit/pages/ChatPage.d.ts +1 -0
  199. package/dist/botlit/pages/ChatPage.js +10 -11
  200. package/dist/botlit/pages/ChatPage.js.map +1 -1
  201. package/dist/botlit/pages/ConversationDetailPage.d.ts +2 -0
  202. package/dist/botlit/pages/ConversationsPage.d.ts +2 -0
  203. package/dist/botlit/pages/DashboardPage.d.ts +2 -0
  204. package/dist/botlit/pages/DashboardPage.js +37 -38
  205. package/dist/botlit/pages/DashboardPage.js.map +1 -1
  206. package/dist/botlit/pages/ExecutionDetailPage.d.ts +2 -0
  207. package/dist/botlit/pages/ExecutionDetailPage.js +47 -48
  208. package/dist/botlit/pages/ExecutionDetailPage.js.map +1 -1
  209. package/dist/botlit/pages/ExecutionsPage.d.ts +2 -0
  210. package/dist/botlit/pages/ExecutionsPage.js +72 -70
  211. package/dist/botlit/pages/ExecutionsPage.js.map +1 -1
  212. package/dist/botlit/pages/InstalledPackagesPage.d.ts +2 -0
  213. package/dist/botlit/pages/InstalledPackagesPage.js +77 -78
  214. package/dist/botlit/pages/InstalledPackagesPage.js.map +1 -1
  215. package/dist/botlit/pages/KnowledgeBaseDetailPage.d.ts +6 -0
  216. package/dist/botlit/pages/KnowledgeBaseDetailPage.js +171 -181
  217. package/dist/botlit/pages/KnowledgeBaseDetailPage.js.map +1 -1
  218. package/dist/botlit/pages/KnowledgeBasesPage.d.ts +2 -0
  219. package/dist/botlit/pages/KnowledgeBasesPage.js +30 -31
  220. package/dist/botlit/pages/KnowledgeBasesPage.js.map +1 -1
  221. package/dist/botlit/pages/MCPServerDetailPage.d.ts +6 -0
  222. package/dist/botlit/pages/MCPServerDetailPage.js +82 -83
  223. package/dist/botlit/pages/MCPServerDetailPage.js.map +1 -1
  224. package/dist/botlit/pages/MCPServersPage.d.ts +2 -0
  225. package/dist/botlit/pages/MCPServersPage.js +54 -55
  226. package/dist/botlit/pages/MCPServersPage.js.map +1 -1
  227. package/dist/botlit/pages/PoliciesPage.d.ts +2 -0
  228. package/dist/botlit/pages/PoliciesPage.js +25 -26
  229. package/dist/botlit/pages/PoliciesPage.js.map +1 -1
  230. package/dist/botlit/pages/PolicyDetailPage.d.ts +6 -0
  231. package/dist/botlit/pages/PolicyDetailPage.js +257 -259
  232. package/dist/botlit/pages/PolicyDetailPage.js.map +1 -1
  233. package/dist/botlit/pages/PromptStudioPage.d.ts +2 -0
  234. package/dist/botlit/pages/PromptStudioPage.js +35 -35
  235. package/dist/botlit/pages/PromptStudioPage.js.map +1 -1
  236. package/dist/botlit/pages/PromptTemplateDetailPage.d.ts +6 -0
  237. package/dist/botlit/pages/PromptTemplateDetailPage.js +363 -362
  238. package/dist/botlit/pages/PromptTemplateDetailPage.js.map +1 -1
  239. package/dist/botlit/pages/PromptTemplatesPage.d.ts +2 -0
  240. package/dist/botlit/pages/PromptTemplatesPage.js +26 -27
  241. package/dist/botlit/pages/PromptTemplatesPage.js.map +1 -1
  242. package/dist/botlit/pages/RetrievalProfileDetailPage.d.ts +6 -0
  243. package/dist/botlit/pages/RetrievalProfileDetailPage.js +150 -158
  244. package/dist/botlit/pages/RetrievalProfileDetailPage.js.map +1 -1
  245. package/dist/botlit/pages/RetrievalProfilesPage.d.ts +2 -0
  246. package/dist/botlit/pages/RetrievalProfilesPage.js +24 -25
  247. package/dist/botlit/pages/RetrievalProfilesPage.js.map +1 -1
  248. package/dist/botlit/pages/SettingsPage.d.ts +2 -0
  249. package/dist/botlit/pages/SettingsPage.js +124 -125
  250. package/dist/botlit/pages/SettingsPage.js.map +1 -1
  251. package/dist/botlit/pages/SkillDetailPage.d.ts +6 -0
  252. package/dist/botlit/pages/SkillDetailPage.js +216 -217
  253. package/dist/botlit/pages/SkillDetailPage.js.map +1 -1
  254. package/dist/botlit/pages/SkillsPage.d.ts +2 -0
  255. package/dist/botlit/pages/SkillsPage.js +24 -25
  256. package/dist/botlit/pages/SkillsPage.js.map +1 -1
  257. package/dist/botlit/pages/StorePackageDetailPage.d.ts +2 -0
  258. package/dist/botlit/pages/StorePackageDetailPage.js +38 -39
  259. package/dist/botlit/pages/StorePackageDetailPage.js.map +1 -1
  260. package/dist/botlit/pages/StorePage.d.ts +2 -0
  261. package/dist/botlit/pages/StorePage.js +135 -136
  262. package/dist/botlit/pages/StorePage.js.map +1 -1
  263. package/dist/botlit/pages/index.d.ts +39 -0
  264. package/dist/botlit/permissions/PermissionRequired.d.ts +20 -0
  265. package/dist/botlit/permissions/PermissionRequired.js +10 -11
  266. package/dist/botlit/permissions/PermissionRequired.js.map +1 -1
  267. package/dist/botlit/permissions/botmanorPermissions.d.ts +82 -0
  268. package/dist/botlit/permissions/botmanorPermissions.js +1 -2
  269. package/dist/botlit/permissions/botmanorPermissions.js.map +1 -1
  270. package/dist/botlit/permissions/index.d.ts +7 -0
  271. package/dist/botlit/permissions/index.js +4 -3
  272. package/dist/botlit/permissions/useBotmanorPermissions.d.ts +41 -0
  273. package/dist/botlit/permissions/useBotmanorPermissions.js +1 -2
  274. package/dist/botlit/permissions/useBotmanorPermissions.js.map +1 -1
  275. package/dist/botlit/providers/BotlitProvider.d.ts +14 -0
  276. package/dist/botlit/providers/BotlitProvider.js +3 -3
  277. package/dist/botlit/providers/BotlitProvider.js.map +1 -1
  278. package/dist/botlit/store/botlitStore.d.ts +85 -0
  279. package/dist/botlit/store/botlitStore.js +1 -2
  280. package/dist/botlit/store/botlitStore.js.map +1 -1
  281. package/dist/botlit/store/renamedKeyStorage.d.ts +13 -0
  282. package/dist/botlit/store/renamedKeyStorage.js +1 -2
  283. package/dist/botlit/store/renamedKeyStorage.js.map +1 -1
  284. package/dist/botlit/types/index.d.ts +1008 -0
  285. package/dist/botlit/utils/cn.d.ts +2 -0
  286. package/dist/botlit/utils/cn.js +1 -2
  287. package/dist/botlit/utils/cn.js.map +1 -1
  288. package/dist/botlit/utils/embedding-models.d.ts +9 -0
  289. package/dist/botlit/utils/embedding-models.js +1 -2
  290. package/dist/botlit/utils/embedding-models.js.map +1 -1
  291. package/dist/botlit/utils/errors.d.ts +19 -0
  292. package/dist/botlit/utils/errors.js +1 -2
  293. package/dist/botlit/utils/errors.js.map +1 -1
  294. package/dist/botlit/utils/formatters.d.ts +38 -0
  295. package/dist/botlit/utils/formatters.js +0 -1
  296. package/dist/botlit/utils/formatters.js.map +1 -1
  297. package/dist/botlit/utils/navigation.d.ts +19 -0
  298. package/dist/botlit/utils/navigation.js +1 -2
  299. package/dist/botlit/utils/navigation.js.map +1 -1
  300. package/dist/botlit/utils/policyConfig.d.ts +68 -0
  301. package/dist/botlit/utils/policyConfig.js +2 -3
  302. package/dist/botlit/utils/policyConfig.js.map +1 -1
  303. package/dist/botlit/utils/unions.d.ts +25 -0
  304. package/dist/botlit/utils/unions.js +1 -2
  305. package/dist/botlit/utils/unions.js.map +1 -1
  306. package/dist/dev/App.d.ts +2 -0
  307. package/dist/dev/main.d.ts +0 -0
  308. package/dist/generated/global-operations.d.ts +197 -0
  309. package/dist/generated/global-operations.js +1 -2
  310. package/dist/generated/global-operations.js.map +1 -1
  311. package/dist/generated/global-types.d.ts +27678 -0
  312. package/dist/generated/global-types.js +1 -2
  313. package/dist/generated/global-types.js.map +1 -1
  314. package/dist/generated/wspace-operations.d.ts +5489 -0
  315. package/dist/generated/wspace-operations.js +172 -75
  316. package/dist/generated/wspace-operations.js.map +1 -1
  317. package/dist/generated/wspace-types.d.ts +152017 -0
  318. package/dist/generated/wspace-types.js +6 -5
  319. package/dist/generated/wspace-types.js.map +1 -1
  320. package/dist/index.d.ts +5 -0
  321. package/dist/shared/hooks/useTr.d.ts +16 -0
  322. package/dist/shared/hooks/useTr.js +1 -2
  323. package/dist/shared/hooks/useTr.js.map +1 -1
  324. package/dist/stories/Badge.stories.d.ts +11 -0
  325. package/dist/stories/Button.stories.d.ts +13 -0
  326. package/dist/stories/EmptyState.stories.d.ts +8 -0
  327. package/dist/stories/StatusBadge.stories.d.ts +9 -0
  328. package/dist/test/fixtures.d.ts +39 -0
  329. package/dist/test/happydom.d.ts +1 -0
  330. package/dist/test/renderPage.d.ts +18 -0
  331. package/dist/test/setup.d.ts +9 -0
  332. package/dist/utils/nativeBridge.d.ts +2 -0
  333. package/dist/utils/nativeBridge.js +1 -2
  334. package/package.json +87 -60
@@ -1 +1 @@
1
- {"version":3,"file":"BotDetailPage.js","names":[],"sources":["../../../src/botlit/pages/BotDetailPage.tsx"],"sourcesContent":["/**\n * Bot Detail Page\n * @module botlit/pages\n *\n * Displays bot details using real GraphQL BotApp type:\n * - routingStrategy (flat enum: SINGLE, ROUND_ROBIN, INTELLIGENT, CUSTOM)\n * - defaultAgentId\n * - tagIds, executionCount, etc.\n */\n\nimport type { FC } from 'react';\nimport { useState, useEffect, lazy, Suspense } from 'react';\nimport { useParams, useSearchParams, Link } from 'react-router';\nimport {\n ArrowLeft,\n Bot,\n BarChart3,\n Save,\n MessageSquare,\n Shield,\n Radio,\n GitBranch,\n Layers,\n Edit,\n Trash2,\n Workflow,\n} from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { isQuotaExhaustedError } from '@burdenoff/fe-libs/shared/utils';\nimport { toast } from 'sonner';\nimport { PagePurpose, NextSteps, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useBot, useCreateBot, useUpdateBot, useDeleteBot } from '../hooks/useBots';\nimport { useAgents } from '../hooks/useAgents';\nimport { QuotaExhaustedDialog } from '../components/QuotaExhaustedDialog';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { formatNumber, formatRelativeTime } from '../utils/formatters';\nimport { cn } from '../utils/cn';\nimport { toUnion } from '../utils/unions';\nimport type { BotAppRecord } from '../hooks/useBots';\nimport { BotChannelsTab } from './BotChannelsTab';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate, useBotmanorCan } from '../permissions';\n\n/**\n * The workflow tab pulls the FluidGrids SDK (builder hooks + generated\n * operations). Loading it lazily keeps that graph out of the bot detail chunk\n * for every visitor who never opens the tab.\n */\nconst BotWorkflowTab = lazy(() =>\n import('./BotWorkflowTab').then((m) => ({ default: m.BotWorkflowTab }))\n);\n\n/** Routing strategies the bot form offers. */\nconst ROUTING_STRATEGIES = ['SINGLE', 'ROUND_ROBIN', 'INTELLIGENT', 'CUSTOM'] as const;\ntype BotRoutingStrategy = (typeof ROUTING_STRATEGIES)[number];\n\n/** The only bot kind this page creates; `BotAppType` also has ANALYST/AUTOMATION/SPECIALIST. */\nconst DEFAULT_BOT_TYPE = 'ASSISTANT';\n\n/** Editable subset of a bot app — one field per `UpdateBotAppInput` field. */\ninterface BotAppForm {\n name: string;\n slug: string;\n description: string;\n icon: string;\n routingStrategy: BotRoutingStrategy;\n welcomeMessage: string;\n fallbackMessage: string;\n defaultAgentId: string;\n}\n\nconst DEFAULT_FORM: BotAppForm = {\n name: '',\n slug: '',\n description: '',\n icon: '\\u{1F916}',\n routingStrategy: 'SINGLE',\n welcomeMessage: '',\n fallbackMessage: '',\n defaultAgentId: '',\n};\n\nfunction toForm(bot: BotAppRecord): BotAppForm {\n return {\n name: bot.name,\n slug: bot.slug,\n description: bot.description ?? '',\n icon: bot.icon || DEFAULT_FORM.icon,\n routingStrategy: toUnion(bot.routingStrategy, ROUTING_STRATEGIES, 'SINGLE'),\n welcomeMessage: bot.welcomeMessage ?? '',\n fallbackMessage: bot.fallbackMessage ?? '',\n defaultAgentId: bot.defaultAgentId ?? '',\n };\n}\n// Uses real GraphQL BotApp type: flat fields (routingStrategy, defaultAgentId, tagIds, executionCount, etc.)\n\ninterface BotDetailPageProps {\n isNew?: boolean;\n isEditing?: boolean;\n}\n\ntype TabType =\n | 'overview'\n | 'workflow'\n | 'routing'\n | 'agents'\n | 'channels'\n | 'guardrails'\n | 'releases';\n\nconst TAB_IDS: readonly TabType[] = [\n 'overview',\n 'workflow',\n 'routing',\n 'agents',\n 'channels',\n 'guardrails',\n 'releases',\n];\n\n/**\n * Resolve the tab a bot detail URL should open on.\n *\n * `?code`+`?state` is the Slack OAuth return, which must land on Channels; an\n * explicit `?tab=` (used by the bots list \"Design\" action and by bot creation)\n * wins otherwise.\n */\nfunction initialTabFrom(params: URLSearchParams): TabType {\n if (params.get('code') && params.get('state')) return 'channels';\n const requested = params.get('tab');\n return TAB_IDS.find((tab) => tab === requested) ?? 'overview';\n}\n\nexport const BotDetailPage: FC<BotDetailPageProps> = ({ isNew, isEditing }) => {\n const t = useTr();\n const { botId } = useParams();\n const [searchParams] = useSearchParams();\n const can = useBotmanorCan();\n const { navigateTo, getPath, workspaceId, navigate } = useBotlit();\n const { data: bot, loading, refetch: refetchBot } = useBot(isNew ? undefined : botId);\n const { data: agents } = useAgents();\n const [createBot, createBotResult] = useCreateBot();\n const [updateBot, updateBotResult] = useUpdateBot();\n const [deleteBot, deleteBotResult] = useDeleteBot();\n\n // Auto-switch to channels tab when Slack OAuth redirects back with ?code+?state,\n // or to whatever `?tab=` asked for (the bots-list \"Design\" affordance).\n const [activeTab, setActiveTab] = useState<TabType>(() => initialTabFrom(searchParams));\n const [formData, setFormData] = useState<BotAppForm>(DEFAULT_FORM);\n const [showQuotaDialog, setShowQuotaDialog] = useState(false);\n\n const handleViewBilling = () => {\n if (navigate) {\n navigate('/billing');\n return;\n }\n window.location.assign('/billing');\n };\n\n // Update form when bot loads\n useEffect(() => {\n if (bot && !isNew) {\n setFormData(toForm(bot));\n }\n }, [bot, isNew]);\n\n const handleCreate = async () => {\n if (!formData.name || !workspaceId) return;\n try {\n const newBot = await createBot({\n workspaceId,\n name: formData.name,\n slug: formData.slug || formData.name.toLowerCase().replace(/\\s+/g, '-'),\n type: DEFAULT_BOT_TYPE,\n routingStrategy: formData.routingStrategy,\n description: formData.description || undefined,\n icon: formData.icon || undefined,\n });\n toast.success(\n `${t('botlit.botDetail.create.successPrefix', 'Bot')} \"${formData.name}\" ${t('botlit.botDetail.create.successSuffix', 'created successfully')}`\n );\n // Land the fresh bot on the Workflow tab — designing its behaviour is the\n // first real step, and the tab's zero state walks the user into the builder.\n if (newBot?.id) navigateTo(`bots/${newBot.id}?tab=workflow`);\n } catch (err: unknown) {\n if (isQuotaExhaustedError(err)) {\n setShowQuotaDialog(true);\n return;\n }\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.botDetail.create.error', 'Failed to create bot');\n toast.error(message);\n }\n };\n\n const handleUpdate = async () => {\n if (!botId) return;\n try {\n await updateBot({\n botId,\n input: {\n name: formData.name,\n slug: formData.slug,\n description: formData.description || null,\n icon: formData.icon || null,\n routingStrategy: formData.routingStrategy,\n welcomeMessage: formData.welcomeMessage || null,\n fallbackMessage: formData.fallbackMessage || null,\n defaultAgentId: formData.defaultAgentId || null,\n },\n });\n await refetchBot();\n toast.success(\n `${t('botlit.botDetail.update.successPrefix', 'Bot')} \"${formData.name}\" ${t('botlit.botDetail.update.successSuffix', 'updated successfully')}`\n );\n if (isEditing) navigateTo(`bots/${botId}`);\n } catch (err: unknown) {\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.botDetail.update.error', 'Failed to update bot');\n toast.error(message);\n }\n };\n\n if (isNew) {\n return (\n <>\n <PageLayout\n title={t('botlit.botDetail.createPage.title', 'Create New Bot')}\n description={t('botlit.botDetail.createPage.description', 'Set up a new AI-powered bot')}\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('bots')}>\n {t('botlit.common.cancel', 'Cancel')}\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleCreate}\n isLoading={createBotResult.loading}\n disabled={!formData.name || !workspaceId}\n >\n {t('botlit.botDetail.createPage.actions.createBot', 'Create Bot')}\n </Button>\n </div>\n }\n >\n <Card className=\"max-w-2xl\">\n <CardContent className=\"pt-6 space-y-6\">\n <div className=\"flex items-center gap-4\">\n <button\n className=\"text-5xl p-4 rounded-lg border-2 border-dashed border-border-subtle hover:border-primary transition-colors\"\n onClick={() => {\n const icons = ['🤖', '💼', '🎧', '📊', '🎯', '🔧', '📚', '💡', '🚀', '⚡'];\n const current = icons.indexOf(formData.icon);\n setFormData({ ...formData, icon: icons[(current + 1) % icons.length] });\n }}\n >\n {formData.icon}\n </button>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botDetail.form.clickToChangeIcon', 'Click to change icon')}\n </p>\n </div>\n\n <FormField\n label={t('botlit.botDetail.form.botName', 'Bot Name')}\n required\n htmlFor=\"name\"\n >\n <Input\n id=\"name\"\n placeholder={t(\n 'botlit.botDetail.form.botNamePlaceholder',\n 'e.g., Customer Support Bot'\n )}\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label={t('botlit.botDetail.form.slug', 'Slug')} htmlFor=\"slug\">\n <Input\n id=\"slug\"\n placeholder={t('botlit.botDetail.form.slugPlaceholder', 'customer-support-bot')}\n value={formData.slug}\n onChange={(e) => setFormData({ ...formData, slug: e.target.value })}\n />\n </FormField>\n\n <FormField\n label={t('botlit.botDetail.form.description', 'Description')}\n htmlFor=\"description\"\n >\n <Textarea\n id=\"description\"\n placeholder={t(\n 'botlit.botDetail.form.descriptionPlaceholder',\n 'Describe what this bot does...'\n )}\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={4}\n />\n </FormField>\n\n <FormField label={t('botlit.botDetail.form.routingStrategy', 'Routing Strategy')}>\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.routingStrategy}\n onChange={(e) =>\n setFormData({\n ...formData,\n routingStrategy: toUnion(e.target.value, ROUTING_STRATEGIES, 'SINGLE'),\n })\n }\n >\n <option value=\"SINGLE\">{t('botlit.botDetail.routing.single', 'Single')}</option>\n <option value=\"ROUND_ROBIN\">\n {t('botlit.botDetail.routing.roundRobin', 'Round Robin')}\n </option>\n <option value=\"INTELLIGENT\">\n {t('botlit.botDetail.routing.intelligent', 'Intelligent')}\n </option>\n <option value=\"CUSTOM\">{t('botlit.botDetail.routing.custom', 'Custom')}</option>\n </select>\n </FormField>\n </CardContent>\n </Card>\n </PageLayout>\n <QuotaExhaustedDialog\n open={showQuotaDialog}\n title={t('botlit.usage.botQuota.title', 'Bot Limit Reached')}\n description={t(\n 'botlit.usage.botQuota.description',\n 'You have reached the number of bots allowed on your current plan.'\n )}\n onClose={() => setShowQuotaDialog(false)}\n onViewBilling={handleViewBilling}\n />\n </>\n );\n }\n\n if (loading) {\n return (\n <PageLayout title={t('botlit.common.loading', 'Loading...')}>\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!bot) {\n return (\n <PageLayout title={t('botlit.botDetail.notFound.title', 'Bot Not Found')}>\n <EmptyState\n illustration=\"empty-agents\"\n title={t('botlit.botDetail.notFound.title', 'Bot Not Found')}\n description={t(\n 'botlit.botDetail.notFound.description',\n \"The bot you're looking for doesn't exist.\"\n )}\n action={\n <Button onClick={() => navigateTo('bots')}>\n {t('botlit.botDetail.notFound.backAction', 'Back to Bots')}\n </Button>\n }\n />\n </PageLayout>\n );\n }\n\n // Edit mode\n if (isEditing && bot) {\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo(`bots/${botId}`)}>\n <ArrowLeft size={20} />\n </Button>\n <span>{t('botlit.botDetail.editPage.title', 'Edit Bot')}</span>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo(`bots/${botId}`)}>\n {t('botlit.common.cancel', 'Cancel')}\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleUpdate}\n isLoading={updateBotResult.loading}\n disabled={!formData.name}\n >\n {t('botlit.botDetail.editPage.actions.saveChanges', 'Save Changes')}\n </Button>\n </div>\n }\n >\n <Card className=\"max-w-2xl\">\n <CardContent className=\"pt-6 space-y-6\">\n <div className=\"flex items-center gap-4\">\n <button\n className=\"text-5xl p-4 rounded-lg border-2 border-dashed border-border-subtle hover:border-primary transition-colors\"\n onClick={() => {\n const icons = ['🤖', '💼', '🎧', '📊', '🎯', '🔧', '📚', '💡', '🚀', '⚡'];\n const currentIcon = formData.icon;\n const current = icons.indexOf(currentIcon);\n setFormData({ ...formData, icon: icons[(current + 1) % icons.length] });\n }}\n >\n {formData.icon}\n </button>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botDetail.form.clickToChangeIcon', 'Click to change icon')}\n </p>\n </div>\n\n <FormField\n label={t('botlit.botDetail.form.botName', 'Bot Name')}\n required\n htmlFor=\"edit-name\"\n >\n <Input\n id=\"edit-name\"\n placeholder={t(\n 'botlit.botDetail.form.botNamePlaceholder',\n 'e.g., Customer Support Bot'\n )}\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label={t('botlit.botDetail.form.slug', 'Slug')} htmlFor=\"edit-slug\">\n <Input\n id=\"edit-slug\"\n placeholder={t('botlit.botDetail.form.slugPlaceholder', 'customer-support-bot')}\n value={formData.slug}\n onChange={(e) => setFormData({ ...formData, slug: e.target.value })}\n />\n </FormField>\n\n <FormField\n label={t('botlit.botDetail.form.description', 'Description')}\n htmlFor=\"edit-description\"\n >\n <Textarea\n id=\"edit-description\"\n placeholder={t(\n 'botlit.botDetail.form.descriptionPlaceholder',\n 'Describe what this bot does...'\n )}\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={4}\n />\n </FormField>\n\n <FormField label={t('botlit.botDetail.form.routingStrategy', 'Routing Strategy')}>\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.routingStrategy}\n onChange={(e) =>\n setFormData({\n ...formData,\n routingStrategy: toUnion(e.target.value, ROUTING_STRATEGIES, 'SINGLE'),\n })\n }\n >\n <option value=\"SINGLE\">{t('botlit.botDetail.routing.single', 'Single')}</option>\n <option value=\"ROUND_ROBIN\">\n {t('botlit.botDetail.routing.roundRobin', 'Round Robin')}\n </option>\n <option value=\"INTELLIGENT\">\n {t('botlit.botDetail.routing.intelligent', 'Intelligent')}\n </option>\n <option value=\"CUSTOM\">{t('botlit.botDetail.routing.custom', 'Custom')}</option>\n </select>\n </FormField>\n\n <FormField\n label={t('botlit.botDetail.form.welcomeMessage', 'Welcome Message')}\n htmlFor=\"edit-welcome\"\n >\n <Textarea\n id=\"edit-welcome\"\n placeholder={t(\n 'botlit.botDetail.form.welcomeMessagePlaceholder',\n 'Welcome message shown to users...'\n )}\n value={formData.welcomeMessage}\n onChange={(e) => setFormData({ ...formData, welcomeMessage: e.target.value })}\n rows={3}\n />\n </FormField>\n\n <FormField\n label={t('botlit.botDetail.form.fallbackMessage', 'Fallback Message')}\n htmlFor=\"edit-fallback\"\n >\n <Input\n id=\"edit-fallback\"\n placeholder={t(\n 'botlit.botDetail.form.fallbackMessagePlaceholder',\n \"Message when agent can't respond...\"\n )}\n value={formData.fallbackMessage}\n onChange={(e) => setFormData({ ...formData, fallbackMessage: e.target.value })}\n />\n </FormField>\n\n <FormField label={t('botlit.botDetail.form.defaultAgent', 'Default Agent')}>\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.defaultAgentId}\n onChange={(e) => setFormData({ ...formData, defaultAgentId: e.target.value })}\n >\n <option value=\"\">\n {t('botlit.botDetail.form.noDefaultAgent', 'No default agent')}\n </option>\n {agents?.map((agent: { id: string; name: string }) => (\n <option key={agent.id} value={agent.id}>\n {agent.name}\n </option>\n ))}\n </select>\n </FormField>\n </CardContent>\n </Card>\n </PageLayout>\n );\n }\n\n const tabs: { id: TabType; label: string; icon: React.ReactNode }[] = [\n {\n id: 'overview',\n label: t('botlit.botDetail.tabs.overview', 'Overview'),\n icon: <BarChart3 size={16} />,\n },\n {\n id: 'workflow',\n label: t('botlit.botDetail.tabs.workflow', 'Workflow'),\n icon: <Workflow size={16} />,\n },\n {\n id: 'routing',\n label: t('botlit.botDetail.tabs.routing', 'Routing'),\n icon: <GitBranch size={16} />,\n },\n { id: 'agents', label: t('botlit.botDetail.tabs.agents', 'Agents'), icon: <Bot size={16} /> },\n {\n id: 'channels',\n label: t('botlit.botDetail.tabs.channels', 'Channels'),\n icon: <Radio size={16} />,\n },\n {\n id: 'guardrails',\n label: t('botlit.botDetail.tabs.guardrails', 'Guardrails'),\n icon: <Shield size={16} />,\n },\n {\n id: 'releases',\n label: t('botlit.botDetail.tabs.releases', 'Releases'),\n icon: <Layers size={16} />,\n },\n ];\n\n // Find default agent details if set\n const defaultAgent = bot.defaultAgentId\n ? agents?.find((a: { id: string }) => a.id === bot.defaultAgentId)\n : null;\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('bots')}>\n <ArrowLeft size={20} />\n </Button>\n <span className=\"text-3xl\">{bot.icon}</span>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{bot.name}</span>\n <StatusBadge status={bot.status} />\n <Badge variant=\"outline\">{bot.slug}</Badge>\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">{bot.description}</p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {bot.status === 'DRAFT' || bot.status === 'ARCHIVED' ? (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_UPDATE}>\n <Button\n variant=\"default\"\n isLoading={updateBotResult.loading}\n onClick={async () => {\n try {\n if (!botId) return;\n await updateBot({ botId, input: { status: 'ACTIVE' } });\n await refetchBot();\n toast.success(\n `${t('botlit.botDetail.activate.successPrefix', 'Bot')} \"${bot.name}\" ${t('botlit.botDetail.activate.successSuffix', 'activated')}`\n );\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.botDetail.activate.error', 'Failed to activate bot')\n );\n }\n }}\n >\n {t('botlit.botDetail.actions.activate', 'Activate')}\n </Button>\n </BotmanorPermissionGate>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_UPDATE}>\n <Button\n variant=\"outline\"\n isLoading={updateBotResult.loading}\n onClick={async () => {\n try {\n if (!botId) return;\n await updateBot({ botId, input: { status: 'DRAFT' } });\n await refetchBot();\n toast.success(\n `${t('botlit.botDetail.deactivate.successPrefix', 'Bot')} \"${bot.name}\" ${t('botlit.botDetail.deactivate.successSuffix', 'deactivated')}`\n );\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.botDetail.deactivate.error', 'Failed to deactivate bot')\n );\n }\n }}\n >\n {t('botlit.botDetail.actions.deactivate', 'Deactivate')}\n </Button>\n </BotmanorPermissionGate>\n )}\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_UPDATE}>\n <Button\n variant=\"outline\"\n leftIcon={<Edit size={16} />}\n onClick={() => navigateTo(`bots/${botId}/edit`)}\n >\n {t('botlit.botDetail.actions.editBot', 'Edit Bot')}\n </Button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_EXECUTE}>\n <Button\n variant=\"outline\"\n leftIcon={<MessageSquare size={16} />}\n onClick={() => {\n const agentId = bot?.defaultAgentId;\n navigateTo(agentId ? `chat/${agentId}` : 'chat');\n }}\n >\n {t('botlit.botDetail.actions.testBot', 'Test Bot')}\n </Button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_DELETE}>\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n isLoading={deleteBotResult.loading}\n onClick={async () => {\n if (!botId) return;\n if (\n !confirm(\n `${t('botlit.botDetail.delete.confirmPrefix', 'Are you sure you want to delete')} \"${bot.name}\"? ${t('botlit.botDetail.delete.confirmSuffix', 'This action cannot be undone.')}`\n )\n )\n return;\n try {\n await deleteBot(botId);\n toast.success(\n `${t('botlit.botDetail.delete.successPrefix', 'Bot')} \"${bot.name}\" ${t('botlit.botDetail.delete.successSuffix', 'deleted successfully')}`\n );\n navigateTo('bots');\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.botDetail.delete.error', 'Failed to delete bot')\n );\n }\n }}\n >\n {t('botlit.common.delete', 'Delete')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Bot size={18} />}>\n {t(\n 'botlit.botDetail.purpose',\n 'This is everything that makes up a single bot — the agent that answers, how requests are routed, which channels it is live on, its guardrails and its release history. Use the tabs to wire it up: assign a default agent, connect a channel and activate it so real users can start chatting.'\n )}\n </PagePurpose>\n\n {/* Tabs */}\n <div className=\"flex gap-1 border-b border-border-subtle overflow-x-auto\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex items-center gap-2 px-4 py-2 text-sm font-medium border-b-2 transition-colors whitespace-nowrap',\n activeTab === tab.id\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n )}\n >\n {tab.icon}\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-6\">\n <NextSteps\n storageKey={`botlit-bot-${botId}`}\n steps={[\n {\n id: 'workflow',\n label: t('botlit.botDetail.nextSteps.workflow', 'Design the workflow'),\n description: t(\n 'botlit.botDetail.nextSteps.workflowDesc',\n 'Lay out what the bot does on the FluidGrids canvas.'\n ),\n icon: <Workflow size={16} />,\n onClick: () => setActiveTab('workflow'),\n done: Boolean(bot.workflowId),\n },\n {\n id: 'agent',\n label: t('botlit.botDetail.nextSteps.agent', 'Assign a default agent'),\n description: t(\n 'botlit.botDetail.nextSteps.agentDesc',\n 'Choose which agent answers when this bot is messaged.'\n ),\n icon: <Bot size={16} />,\n onClick: () => setActiveTab('agents'),\n done: Boolean(bot.defaultAgentId),\n },\n {\n id: 'channel',\n label: t('botlit.botDetail.nextSteps.channel', 'Connect a channel'),\n description: t(\n 'botlit.botDetail.nextSteps.channelDesc',\n 'Put the bot on Slack, a web widget or another channel.'\n ),\n icon: <Radio size={16} />,\n onClick: () => setActiveTab('channels'),\n },\n {\n id: 'test',\n label: t('botlit.botDetail.nextSteps.test', 'Test the bot'),\n description: t(\n 'botlit.botDetail.nextSteps.testDesc',\n 'Send a message to check the experience end to end.'\n ),\n icon: <MessageSquare size={16} />,\n onClick: () => {\n const agentId = bot?.defaultAgentId;\n navigateTo(agentId ? `chat/${agentId}` : 'chat');\n },\n },\n {\n id: 'activate',\n label: t('botlit.botDetail.nextSteps.activate', 'Activate the bot'),\n description: t(\n 'botlit.botDetail.nextSteps.activateDesc',\n 'Make it live so it starts handling conversations.'\n ),\n icon: <Shield size={16} />,\n onClick: () => navigateTo(`bots/${botId}/edit`),\n done: bot.status === 'ACTIVE',\n },\n ]}\n />\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n {/* Quick Info */}\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Status</p>\n <StatusBadge status={bot.status} />\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Visibility</p>\n <Badge variant=\"outline\">{bot.visibility}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Routing Strategy</p>\n <Badge variant=\"outline\">{bot.routingStrategy}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Default Agent</p>\n <p className=\"font-medium\">\n {bot.defaultAgentId ? '1 agent assigned' : 'No agents'}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Channels</p>\n <p className=\"font-medium\">0 channels</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(bot.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Executions</p>\n <p className=\"font-medium\">{formatNumber(bot.executionCount)}</p>\n </div>\n </CardContent>\n </Card>\n\n {/* Default Agent Preview */}\n <GlassCard treatment=\"glass\" glow className=\"lg:col-span-2 p-6\">\n <div className=\"mb-4 flex flex-row items-center justify-between\">\n <div>\n <h3 className=\"text-lg font-semibold tracking-tight text-text-primary\">\n Default Agent\n </h3>\n <p className=\"text-sm text-text-secondary\">Agent configured for this bot</p>\n </div>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setActiveTab('agents')}>\n Manage\n </Button>\n </div>\n <div>\n {defaultAgent ? (\n <div className=\"space-y-3\">\n <Link\n to={getPath(`agents/${(defaultAgent as { id: string }).id}`)}\n className=\"flex items-center justify-between p-3 rounded-lg border border-border-subtle hover:bg-accent transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <span className=\"text-2xl\">🤖</span>\n <div>\n <p className=\"font-medium text-text-primary\">\n {(defaultAgent as { name: string }).name}\n </p>\n <p className=\"text-xs text-text-secondary\">Default Agent</p>\n </div>\n </div>\n <StatusBadge status={(defaultAgent as { status: string }).status} />\n </Link>\n </div>\n ) : (\n <div className=\"text-center py-8 text-text-secondary\">\n <Bot className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>No default agent assigned</p>\n <Button size=\"sm\" className=\"mt-3\" onClick={() => setActiveTab('agents')}>\n Assign Agent\n </Button>\n </div>\n )}\n </div>\n </GlassCard>\n\n {/* Tags */}\n {(bot.tagIds || []).length > 0 && (\n <Card className=\"lg:col-span-3\">\n <CardHeader>\n <CardTitle>Tags</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-wrap gap-2\">\n {(bot.tagIds || []).map((tagId: string) => (\n <Badge key={tagId} variant=\"outline\">\n {tagId}\n </Badge>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n )}\n\n {/* Workflow Tab */}\n {activeTab === 'workflow' && botId && (\n <Suspense\n fallback={\n <div className=\"h-64 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n }\n >\n <BotWorkflowTab\n botId={botId}\n botName={bot.name}\n workflowId={bot.workflowId}\n onWorkflowChanged={async () => {\n await refetchBot();\n }}\n />\n </Suspense>\n )}\n\n {/* Routing Tab */}\n {activeTab === 'routing' && (\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Routing Configuration</CardTitle>\n <CardDescription>How requests are routed to agents</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Strategy</p>\n <Badge variant=\"outline\" className=\"mt-1\">\n {bot.routingStrategy}\n </Badge>\n </div>\n {bot.defaultAgentId && (\n <div>\n <p className=\"text-sm text-text-secondary\">Default Agent</p>\n <p className=\"font-mono text-sm mt-1\">{bot.defaultAgentId}</p>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Routing Rules</CardTitle>\n <CardDescription>No routing rules configured</CardDescription>\n </CardHeader>\n <CardContent>\n <p className=\"text-text-secondary\">\n No routing rules configured. Routing rules will be available in a future update.\n </p>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Agents Tab */}\n {activeTab === 'agents' && (\n <Card>\n <CardHeader>\n <CardTitle>Default Agent</CardTitle>\n <CardDescription>Select the default agent for this bot</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {defaultAgent && (\n <div className=\"flex items-center justify-between p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-2xl\">🤖</span>\n <div>\n <p className=\"font-medium\">{(defaultAgent as { name: string }).name}</p>\n <Badge variant=\"success\">Default</Badge>\n </div>\n </div>\n <StatusBadge status={(defaultAgent as { status: string }).status} />\n </div>\n )}\n\n <div className=\"flex items-center gap-3\">\n <select\n className=\"flex h-10 flex-1 rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={bot.defaultAgentId || ''}\n disabled={!can(BOTMANOR_PERMISSIONS.APP_UPDATE)}\n onChange={async (e) => {\n if (botId) {\n try {\n await updateBot({\n botId,\n input: { defaultAgentId: e.target.value || null },\n });\n toast.success(\n e.target.value ? 'Default agent assigned' : 'Default agent removed'\n );\n } catch (err: unknown) {\n const message =\n err instanceof Error ? err.message : 'Failed to assign agent';\n toast.error(message);\n }\n }\n }}\n >\n <option value=\"\">No default agent</option>\n {agents?.map((agent: { id: string; name: string }) => (\n <option key={agent.id} value={agent.id}>\n {agent.name}\n </option>\n ))}\n </select>\n </div>\n\n {!defaultAgent && !agents?.length && (\n <div className=\"text-center py-8 text-text-secondary\">\n <Bot className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>No agents available. Create an agent first.</p>\n </div>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Channels Tab */}\n {activeTab === 'channels' && botId && <BotChannelsTab botId={botId} botName={bot.name} />}\n\n {/* Guardrails Tab */}\n {activeTab === 'guardrails' && (\n <Card>\n <CardHeader>\n <CardTitle>Policy Bindings</CardTitle>\n <CardDescription>Guardrails and policies attached to this bot</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"text-center py-8 text-text-secondary\">\n <Shield className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>Not configured</p>\n <p className=\"text-sm mt-1\">\n Policy bindings will be available in a future update.\n </p>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Releases Tab */}\n {activeTab === 'releases' && (\n <Card>\n <CardHeader>\n <CardTitle>Release Tracks</CardTitle>\n <CardDescription>Version deployments across environments</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"text-center py-8 text-text-secondary\">\n <Layers className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>Not configured</p>\n <p className=\"text-sm mt-1\">Release tracks will be available in a future update.</p>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"BotDetailPage.js","names":["_Fragment","Textarea","Textarea$1","BotWorkflowTab","lazy","m","ROUTING_STRATEGIES","DEFAULT_BOT_TYPE","DEFAULT_FORM","toForm","bot","toUnion","TAB_IDS","initialTabFrom","params","requested","tab","BotDetailPage","t","useTr","useParams","searchParams","useSearchParams","can","useBotmanorCan","useBotlit","refetchBot","useBot","isNew","botId","agents","useAgents","createBot","createBotResult","useCreateBot","updateBot","updateBotResult","useUpdateBot","deleteBot","deleteBotResult","useDeleteBot","activeTab","setActiveTab","useState","formData","setFormData","showQuotaDialog","setShowQuotaDialog","handleViewBilling","navigate","handleCreate","workspaceId","newBot","toast","navigateTo","err","isQuotaExhaustedError","message","handleUpdate","isEditing","Fragment","PageLayout","Button","Save","Card","CardContent","icons","current","FormField","Input","QuotaExhaustedDialog","loading","EmptyState","ArrowLeft","currentIcon","agent","tabs","BarChart3","Workflow","GitBranch","Bot","Radio","Shield","ShieldCheck","Layers","defaultAgent","a","StatusBadge","Badge","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Edit","MessageSquare","agentId","Trash2","PagePurpose","cn","NextSteps","CardHeader","CardTitle","formatRelativeTime","formatNumber","GlassCard","Link","getPath","tagId","Suspense","CardDescription","BotChannelsTab","AiOperationsPanel"],"sources":["../../../src/botlit/pages/BotDetailPage.tsx"],"sourcesContent":["/**\n * Bot Detail Page\n * @module botlit/pages\n *\n * Displays bot details using real GraphQL BotApp type:\n * - routingStrategy (flat enum: SINGLE, ROUND_ROBIN, INTELLIGENT, CUSTOM)\n * - defaultAgentId\n * - tagIds, executionCount, etc.\n */\n\nimport type { FC } from 'react';\nimport { useState, useEffect, lazy, Suspense } from 'react';\nimport { useParams, useSearchParams, Link } from 'react-router';\nimport {\n ArrowLeft,\n Bot,\n BarChart3,\n Save,\n MessageSquare,\n Shield,\n Radio,\n GitBranch,\n Layers,\n Edit,\n Trash2,\n Workflow,\n ShieldCheck,\n} from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { isQuotaExhaustedError } from '@burdenoff/fe-libs/shared/utils';\nimport { toast } from 'sonner';\nimport { PagePurpose, NextSteps, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { AiOperationsPanel } from '../components/AiOperationsPanel';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useBot, useCreateBot, useUpdateBot, useDeleteBot } from '../hooks/useBots';\nimport { useAgents } from '../hooks/useAgents';\nimport { QuotaExhaustedDialog } from '../components/QuotaExhaustedDialog';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { formatNumber, formatRelativeTime } from '../utils/formatters';\nimport { cn } from '../utils/cn';\nimport { toUnion } from '../utils/unions';\nimport type { BotAppRecord } from '../hooks/useBots';\nimport { BotChannelsTab } from './BotChannelsTab';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate, useBotmanorCan } from '../permissions';\n\n/**\n * The workflow tab pulls the FluidGrids SDK (builder hooks + generated\n * operations). Loading it lazily keeps that graph out of the bot detail chunk\n * for every visitor who never opens the tab.\n */\nconst BotWorkflowTab = lazy(() =>\n import('./BotWorkflowTab').then((m) => ({ default: m.BotWorkflowTab }))\n);\n\n/** Routing strategies the bot form offers. */\nconst ROUTING_STRATEGIES = ['SINGLE', 'ROUND_ROBIN', 'INTELLIGENT', 'CUSTOM'] as const;\ntype BotRoutingStrategy = (typeof ROUTING_STRATEGIES)[number];\n\n/** The only bot kind this page creates; `BotAppType` also has ANALYST/AUTOMATION/SPECIALIST. */\nconst DEFAULT_BOT_TYPE = 'ASSISTANT';\n\n/** Editable subset of a bot app — one field per `UpdateBotAppInput` field. */\ninterface BotAppForm {\n name: string;\n slug: string;\n description: string;\n icon: string;\n routingStrategy: BotRoutingStrategy;\n welcomeMessage: string;\n fallbackMessage: string;\n defaultAgentId: string;\n}\n\nconst DEFAULT_FORM: BotAppForm = {\n name: '',\n slug: '',\n description: '',\n icon: '\\u{1F916}',\n routingStrategy: 'SINGLE',\n welcomeMessage: '',\n fallbackMessage: '',\n defaultAgentId: '',\n};\n\nfunction toForm(bot: BotAppRecord): BotAppForm {\n return {\n name: bot.name,\n slug: bot.slug,\n description: bot.description ?? '',\n icon: bot.icon || DEFAULT_FORM.icon,\n routingStrategy: toUnion(bot.routingStrategy, ROUTING_STRATEGIES, 'SINGLE'),\n welcomeMessage: bot.welcomeMessage ?? '',\n fallbackMessage: bot.fallbackMessage ?? '',\n defaultAgentId: bot.defaultAgentId ?? '',\n };\n}\n// Uses real GraphQL BotApp type: flat fields (routingStrategy, defaultAgentId, tagIds, executionCount, etc.)\n\ninterface BotDetailPageProps {\n isNew?: boolean;\n isEditing?: boolean;\n}\n\ntype TabType =\n | 'overview'\n | 'workflow'\n | 'routing'\n | 'agents'\n | 'channels'\n | 'guardrails'\n | 'aiOperations'\n | 'releases';\n\nconst TAB_IDS: readonly TabType[] = [\n 'overview',\n 'workflow',\n 'routing',\n 'agents',\n 'channels',\n 'guardrails',\n 'aiOperations',\n 'releases',\n];\n\n/**\n * Resolve the tab a bot detail URL should open on.\n *\n * `?code`+`?state` is the Slack OAuth return, which must land on Channels; an\n * explicit `?tab=` (used by the bots list \"Design\" action and by bot creation)\n * wins otherwise.\n */\nfunction initialTabFrom(params: URLSearchParams): TabType {\n if (params.get('code') && params.get('state')) return 'channels';\n const requested = params.get('tab');\n return TAB_IDS.find((tab) => tab === requested) ?? 'overview';\n}\n\nexport const BotDetailPage: FC<BotDetailPageProps> = ({ isNew, isEditing }) => {\n const t = useTr();\n const { botId } = useParams();\n const [searchParams] = useSearchParams();\n const can = useBotmanorCan();\n const { navigateTo, getPath, workspaceId, navigate } = useBotlit();\n const { data: bot, loading, refetch: refetchBot } = useBot(isNew ? undefined : botId);\n const { data: agents } = useAgents();\n const [createBot, createBotResult] = useCreateBot();\n const [updateBot, updateBotResult] = useUpdateBot();\n const [deleteBot, deleteBotResult] = useDeleteBot();\n\n // Auto-switch to channels tab when Slack OAuth redirects back with ?code+?state,\n // or to whatever `?tab=` asked for (the bots-list \"Design\" affordance).\n const [activeTab, setActiveTab] = useState<TabType>(() => initialTabFrom(searchParams));\n const [formData, setFormData] = useState<BotAppForm>(DEFAULT_FORM);\n const [showQuotaDialog, setShowQuotaDialog] = useState(false);\n\n const handleViewBilling = () => {\n if (navigate) {\n navigate('/billing');\n return;\n }\n window.location.assign('/billing');\n };\n\n // Update form when bot loads\n useEffect(() => {\n if (bot && !isNew) {\n setFormData(toForm(bot));\n }\n }, [bot, isNew]);\n\n const handleCreate = async () => {\n if (!formData.name || !workspaceId) return;\n try {\n const newBot = await createBot({\n workspaceId,\n name: formData.name,\n slug: formData.slug || formData.name.toLowerCase().replace(/\\s+/g, '-'),\n type: DEFAULT_BOT_TYPE,\n routingStrategy: formData.routingStrategy,\n description: formData.description || undefined,\n icon: formData.icon || undefined,\n });\n toast.success(\n `${t('botlit.botDetail.create.successPrefix', 'Bot')} \"${formData.name}\" ${t('botlit.botDetail.create.successSuffix', 'created successfully')}`\n );\n // Land the fresh bot on the Workflow tab — designing its behaviour is the\n // first real step, and the tab's zero state walks the user into the builder.\n if (newBot?.id) navigateTo(`bots/${newBot.id}?tab=workflow`);\n } catch (err: unknown) {\n if (isQuotaExhaustedError(err)) {\n setShowQuotaDialog(true);\n return;\n }\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.botDetail.create.error', 'Failed to create bot');\n toast.error(message);\n }\n };\n\n const handleUpdate = async () => {\n if (!botId) return;\n try {\n await updateBot({\n botId,\n input: {\n name: formData.name,\n slug: formData.slug,\n description: formData.description || null,\n icon: formData.icon || null,\n routingStrategy: formData.routingStrategy,\n welcomeMessage: formData.welcomeMessage || null,\n fallbackMessage: formData.fallbackMessage || null,\n defaultAgentId: formData.defaultAgentId || null,\n },\n });\n await refetchBot();\n toast.success(\n `${t('botlit.botDetail.update.successPrefix', 'Bot')} \"${formData.name}\" ${t('botlit.botDetail.update.successSuffix', 'updated successfully')}`\n );\n if (isEditing) navigateTo(`bots/${botId}`);\n } catch (err: unknown) {\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.botDetail.update.error', 'Failed to update bot');\n toast.error(message);\n }\n };\n\n if (isNew) {\n return (\n <>\n <PageLayout\n title={t('botlit.botDetail.createPage.title', 'Create New Bot')}\n description={t('botlit.botDetail.createPage.description', 'Set up a new AI-powered bot')}\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('bots')}>\n {t('botlit.common.cancel', 'Cancel')}\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleCreate}\n isLoading={createBotResult.loading}\n disabled={!formData.name || !workspaceId}\n >\n {t('botlit.botDetail.createPage.actions.createBot', 'Create Bot')}\n </Button>\n </div>\n }\n >\n <Card className=\"max-w-2xl\">\n <CardContent className=\"pt-6 space-y-6\">\n <div className=\"flex items-center gap-4\">\n <button\n className=\"text-5xl p-4 rounded-lg border-2 border-dashed border-border-subtle hover:border-primary transition-colors\"\n onClick={() => {\n const icons = ['🤖', '💼', '🎧', '📊', '🎯', '🔧', '📚', '💡', '🚀', '⚡'];\n const current = icons.indexOf(formData.icon);\n setFormData({ ...formData, icon: icons[(current + 1) % icons.length] });\n }}\n >\n {formData.icon}\n </button>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botDetail.form.clickToChangeIcon', 'Click to change icon')}\n </p>\n </div>\n\n <FormField\n label={t('botlit.botDetail.form.botName', 'Bot Name')}\n required\n htmlFor=\"name\"\n >\n <Input\n id=\"name\"\n placeholder={t(\n 'botlit.botDetail.form.botNamePlaceholder',\n 'e.g., Customer Support Bot'\n )}\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label={t('botlit.botDetail.form.slug', 'Slug')} htmlFor=\"slug\">\n <Input\n id=\"slug\"\n placeholder={t('botlit.botDetail.form.slugPlaceholder', 'customer-support-bot')}\n value={formData.slug}\n onChange={(e) => setFormData({ ...formData, slug: e.target.value })}\n />\n </FormField>\n\n <FormField\n label={t('botlit.botDetail.form.description', 'Description')}\n htmlFor=\"description\"\n >\n <Textarea\n id=\"description\"\n placeholder={t(\n 'botlit.botDetail.form.descriptionPlaceholder',\n 'Describe what this bot does...'\n )}\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={4}\n />\n </FormField>\n\n <FormField label={t('botlit.botDetail.form.routingStrategy', 'Routing Strategy')}>\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.routingStrategy}\n onChange={(e) =>\n setFormData({\n ...formData,\n routingStrategy: toUnion(e.target.value, ROUTING_STRATEGIES, 'SINGLE'),\n })\n }\n >\n <option value=\"SINGLE\">{t('botlit.botDetail.routing.single', 'Single')}</option>\n <option value=\"ROUND_ROBIN\">\n {t('botlit.botDetail.routing.roundRobin', 'Round Robin')}\n </option>\n <option value=\"INTELLIGENT\">\n {t('botlit.botDetail.routing.intelligent', 'Intelligent')}\n </option>\n <option value=\"CUSTOM\">{t('botlit.botDetail.routing.custom', 'Custom')}</option>\n </select>\n </FormField>\n </CardContent>\n </Card>\n </PageLayout>\n <QuotaExhaustedDialog\n open={showQuotaDialog}\n title={t('botlit.usage.botQuota.title', 'Bot Limit Reached')}\n description={t(\n 'botlit.usage.botQuota.description',\n 'You have reached the number of bots allowed on your current plan.'\n )}\n onClose={() => setShowQuotaDialog(false)}\n onViewBilling={handleViewBilling}\n />\n </>\n );\n }\n\n if (loading) {\n return (\n <PageLayout title={t('botlit.common.loading', 'Loading...')}>\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!bot) {\n return (\n <PageLayout title={t('botlit.botDetail.notFound.title', 'Bot Not Found')}>\n <EmptyState\n illustration=\"empty-agents\"\n title={t('botlit.botDetail.notFound.title', 'Bot Not Found')}\n description={t(\n 'botlit.botDetail.notFound.description',\n \"The bot you're looking for doesn't exist.\"\n )}\n action={\n <Button onClick={() => navigateTo('bots')}>\n {t('botlit.botDetail.notFound.backAction', 'Back to Bots')}\n </Button>\n }\n />\n </PageLayout>\n );\n }\n\n // Edit mode\n if (isEditing && bot) {\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo(`bots/${botId}`)}>\n <ArrowLeft size={20} />\n </Button>\n <span>{t('botlit.botDetail.editPage.title', 'Edit Bot')}</span>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo(`bots/${botId}`)}>\n {t('botlit.common.cancel', 'Cancel')}\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleUpdate}\n isLoading={updateBotResult.loading}\n disabled={!formData.name}\n >\n {t('botlit.botDetail.editPage.actions.saveChanges', 'Save Changes')}\n </Button>\n </div>\n }\n >\n <Card className=\"max-w-2xl\">\n <CardContent className=\"pt-6 space-y-6\">\n <div className=\"flex items-center gap-4\">\n <button\n className=\"text-5xl p-4 rounded-lg border-2 border-dashed border-border-subtle hover:border-primary transition-colors\"\n onClick={() => {\n const icons = ['🤖', '💼', '🎧', '📊', '🎯', '🔧', '📚', '💡', '🚀', '⚡'];\n const currentIcon = formData.icon;\n const current = icons.indexOf(currentIcon);\n setFormData({ ...formData, icon: icons[(current + 1) % icons.length] });\n }}\n >\n {formData.icon}\n </button>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botDetail.form.clickToChangeIcon', 'Click to change icon')}\n </p>\n </div>\n\n <FormField\n label={t('botlit.botDetail.form.botName', 'Bot Name')}\n required\n htmlFor=\"edit-name\"\n >\n <Input\n id=\"edit-name\"\n placeholder={t(\n 'botlit.botDetail.form.botNamePlaceholder',\n 'e.g., Customer Support Bot'\n )}\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label={t('botlit.botDetail.form.slug', 'Slug')} htmlFor=\"edit-slug\">\n <Input\n id=\"edit-slug\"\n placeholder={t('botlit.botDetail.form.slugPlaceholder', 'customer-support-bot')}\n value={formData.slug}\n onChange={(e) => setFormData({ ...formData, slug: e.target.value })}\n />\n </FormField>\n\n <FormField\n label={t('botlit.botDetail.form.description', 'Description')}\n htmlFor=\"edit-description\"\n >\n <Textarea\n id=\"edit-description\"\n placeholder={t(\n 'botlit.botDetail.form.descriptionPlaceholder',\n 'Describe what this bot does...'\n )}\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={4}\n />\n </FormField>\n\n <FormField label={t('botlit.botDetail.form.routingStrategy', 'Routing Strategy')}>\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.routingStrategy}\n onChange={(e) =>\n setFormData({\n ...formData,\n routingStrategy: toUnion(e.target.value, ROUTING_STRATEGIES, 'SINGLE'),\n })\n }\n >\n <option value=\"SINGLE\">{t('botlit.botDetail.routing.single', 'Single')}</option>\n <option value=\"ROUND_ROBIN\">\n {t('botlit.botDetail.routing.roundRobin', 'Round Robin')}\n </option>\n <option value=\"INTELLIGENT\">\n {t('botlit.botDetail.routing.intelligent', 'Intelligent')}\n </option>\n <option value=\"CUSTOM\">{t('botlit.botDetail.routing.custom', 'Custom')}</option>\n </select>\n </FormField>\n\n <FormField\n label={t('botlit.botDetail.form.welcomeMessage', 'Welcome Message')}\n htmlFor=\"edit-welcome\"\n >\n <Textarea\n id=\"edit-welcome\"\n placeholder={t(\n 'botlit.botDetail.form.welcomeMessagePlaceholder',\n 'Welcome message shown to users...'\n )}\n value={formData.welcomeMessage}\n onChange={(e) => setFormData({ ...formData, welcomeMessage: e.target.value })}\n rows={3}\n />\n </FormField>\n\n <FormField\n label={t('botlit.botDetail.form.fallbackMessage', 'Fallback Message')}\n htmlFor=\"edit-fallback\"\n >\n <Input\n id=\"edit-fallback\"\n placeholder={t(\n 'botlit.botDetail.form.fallbackMessagePlaceholder',\n \"Message when agent can't respond...\"\n )}\n value={formData.fallbackMessage}\n onChange={(e) => setFormData({ ...formData, fallbackMessage: e.target.value })}\n />\n </FormField>\n\n <FormField label={t('botlit.botDetail.form.defaultAgent', 'Default Agent')}>\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.defaultAgentId}\n onChange={(e) => setFormData({ ...formData, defaultAgentId: e.target.value })}\n >\n <option value=\"\">\n {t('botlit.botDetail.form.noDefaultAgent', 'No default agent')}\n </option>\n {agents?.map((agent: { id: string; name: string }) => (\n <option key={agent.id} value={agent.id}>\n {agent.name}\n </option>\n ))}\n </select>\n </FormField>\n </CardContent>\n </Card>\n </PageLayout>\n );\n }\n\n const tabs: { id: TabType; label: string; icon: React.ReactNode }[] = [\n {\n id: 'overview',\n label: t('botlit.botDetail.tabs.overview', 'Overview'),\n icon: <BarChart3 size={16} />,\n },\n {\n id: 'workflow',\n label: t('botlit.botDetail.tabs.workflow', 'Workflow'),\n icon: <Workflow size={16} />,\n },\n {\n id: 'routing',\n label: t('botlit.botDetail.tabs.routing', 'Routing'),\n icon: <GitBranch size={16} />,\n },\n { id: 'agents', label: t('botlit.botDetail.tabs.agents', 'Agents'), icon: <Bot size={16} /> },\n {\n id: 'channels',\n label: t('botlit.botDetail.tabs.channels', 'Channels'),\n icon: <Radio size={16} />,\n },\n {\n id: 'guardrails',\n label: t('botlit.botDetail.tabs.guardrails', 'Guardrails'),\n icon: <Shield size={16} />,\n },\n {\n id: 'aiOperations',\n label: t('botlit.botDetail.tabs.aiOperations', 'AI Operations'),\n icon: <ShieldCheck size={16} />,\n },\n {\n id: 'releases',\n label: t('botlit.botDetail.tabs.releases', 'Releases'),\n icon: <Layers size={16} />,\n },\n ];\n\n // Find default agent details if set\n const defaultAgent = bot.defaultAgentId\n ? agents?.find((a: { id: string }) => a.id === bot.defaultAgentId)\n : null;\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('bots')}>\n <ArrowLeft size={20} />\n </Button>\n <span className=\"text-3xl\">{bot.icon}</span>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{bot.name}</span>\n <StatusBadge status={bot.status} />\n <Badge variant=\"outline\">{bot.slug}</Badge>\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">{bot.description}</p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {bot.status === 'DRAFT' || bot.status === 'ARCHIVED' ? (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_UPDATE}>\n <Button\n variant=\"default\"\n isLoading={updateBotResult.loading}\n onClick={async () => {\n try {\n if (!botId) return;\n await updateBot({ botId, input: { status: 'ACTIVE' } });\n await refetchBot();\n toast.success(\n `${t('botlit.botDetail.activate.successPrefix', 'Bot')} \"${bot.name}\" ${t('botlit.botDetail.activate.successSuffix', 'activated')}`\n );\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.botDetail.activate.error', 'Failed to activate bot')\n );\n }\n }}\n >\n {t('botlit.botDetail.actions.activate', 'Activate')}\n </Button>\n </BotmanorPermissionGate>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_UPDATE}>\n <Button\n variant=\"outline\"\n isLoading={updateBotResult.loading}\n onClick={async () => {\n try {\n if (!botId) return;\n await updateBot({ botId, input: { status: 'DRAFT' } });\n await refetchBot();\n toast.success(\n `${t('botlit.botDetail.deactivate.successPrefix', 'Bot')} \"${bot.name}\" ${t('botlit.botDetail.deactivate.successSuffix', 'deactivated')}`\n );\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.botDetail.deactivate.error', 'Failed to deactivate bot')\n );\n }\n }}\n >\n {t('botlit.botDetail.actions.deactivate', 'Deactivate')}\n </Button>\n </BotmanorPermissionGate>\n )}\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_UPDATE}>\n <Button\n variant=\"outline\"\n leftIcon={<Edit size={16} />}\n onClick={() => navigateTo(`bots/${botId}/edit`)}\n >\n {t('botlit.botDetail.actions.editBot', 'Edit Bot')}\n </Button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.AGENT_EXECUTE}>\n <Button\n variant=\"outline\"\n leftIcon={<MessageSquare size={16} />}\n onClick={() => {\n const agentId = bot?.defaultAgentId;\n navigateTo(agentId ? `chat/${agentId}` : 'chat');\n }}\n >\n {t('botlit.botDetail.actions.testBot', 'Test Bot')}\n </Button>\n </BotmanorPermissionGate>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_DELETE}>\n <Button\n variant=\"destructive\"\n leftIcon={<Trash2 size={16} />}\n isLoading={deleteBotResult.loading}\n onClick={async () => {\n if (!botId) return;\n if (\n !confirm(\n `${t('botlit.botDetail.delete.confirmPrefix', 'Are you sure you want to delete')} \"${bot.name}\"? ${t('botlit.botDetail.delete.confirmSuffix', 'This action cannot be undone.')}`\n )\n )\n return;\n try {\n await deleteBot(botId);\n toast.success(\n `${t('botlit.botDetail.delete.successPrefix', 'Bot')} \"${bot.name}\" ${t('botlit.botDetail.delete.successSuffix', 'deleted successfully')}`\n );\n navigateTo('bots');\n } catch (err: unknown) {\n toast.error(\n err instanceof Error\n ? err.message\n : t('botlit.botDetail.delete.error', 'Failed to delete bot')\n );\n }\n }}\n >\n {t('botlit.common.delete', 'Delete')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Bot size={18} />}>\n {t(\n 'botlit.botDetail.purpose',\n 'This is everything that makes up a single bot — the agent that answers, how requests are routed, which channels it is live on, its guardrails and its release history. Use the tabs to wire it up: assign a default agent, connect a channel and activate it so real users can start chatting.'\n )}\n </PagePurpose>\n\n {/* Tabs */}\n <div className=\"flex gap-1 border-b border-border-subtle overflow-x-auto\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex items-center gap-2 px-4 py-2 text-sm font-medium border-b-2 transition-colors whitespace-nowrap',\n activeTab === tab.id\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n )}\n >\n {tab.icon}\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Overview Tab */}\n {activeTab === 'overview' && (\n <div className=\"space-y-6\">\n <NextSteps\n storageKey={`botlit-bot-${botId}`}\n steps={[\n {\n id: 'workflow',\n label: t('botlit.botDetail.nextSteps.workflow', 'Design the workflow'),\n description: t(\n 'botlit.botDetail.nextSteps.workflowDesc',\n 'Lay out what the bot does on the FluidGrids canvas.'\n ),\n icon: <Workflow size={16} />,\n onClick: () => setActiveTab('workflow'),\n done: Boolean(bot.workflowId),\n },\n {\n id: 'agent',\n label: t('botlit.botDetail.nextSteps.agent', 'Assign a default agent'),\n description: t(\n 'botlit.botDetail.nextSteps.agentDesc',\n 'Choose which agent answers when this bot is messaged.'\n ),\n icon: <Bot size={16} />,\n onClick: () => setActiveTab('agents'),\n done: Boolean(bot.defaultAgentId),\n },\n {\n id: 'channel',\n label: t('botlit.botDetail.nextSteps.channel', 'Connect a channel'),\n description: t(\n 'botlit.botDetail.nextSteps.channelDesc',\n 'Put the bot on Slack, a web widget or another channel.'\n ),\n icon: <Radio size={16} />,\n onClick: () => setActiveTab('channels'),\n },\n {\n id: 'test',\n label: t('botlit.botDetail.nextSteps.test', 'Test the bot'),\n description: t(\n 'botlit.botDetail.nextSteps.testDesc',\n 'Send a message to check the experience end to end.'\n ),\n icon: <MessageSquare size={16} />,\n onClick: () => {\n const agentId = bot?.defaultAgentId;\n navigateTo(agentId ? `chat/${agentId}` : 'chat');\n },\n },\n {\n id: 'activate',\n label: t('botlit.botDetail.nextSteps.activate', 'Activate the bot'),\n description: t(\n 'botlit.botDetail.nextSteps.activateDesc',\n 'Make it live so it starts handling conversations.'\n ),\n icon: <Shield size={16} />,\n onClick: () => navigateTo(`bots/${botId}/edit`),\n done: bot.status === 'ACTIVE',\n },\n ]}\n />\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n {/* Quick Info */}\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Status</p>\n <StatusBadge status={bot.status} />\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Visibility</p>\n <Badge variant=\"outline\">{bot.visibility}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Routing Strategy</p>\n <Badge variant=\"outline\">{bot.routingStrategy}</Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Default Agent</p>\n <p className=\"font-medium\">\n {bot.defaultAgentId ? '1 agent assigned' : 'No agents'}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Channels</p>\n <p className=\"font-medium\">0 channels</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(bot.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Executions</p>\n <p className=\"font-medium\">{formatNumber(bot.executionCount)}</p>\n </div>\n </CardContent>\n </Card>\n\n {/* Default Agent Preview */}\n <GlassCard treatment=\"glass\" glow className=\"lg:col-span-2 p-6\">\n <div className=\"mb-4 flex flex-row items-center justify-between\">\n <div>\n <h3 className=\"text-lg font-semibold tracking-tight text-text-primary\">\n Default Agent\n </h3>\n <p className=\"text-sm text-text-secondary\">Agent configured for this bot</p>\n </div>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setActiveTab('agents')}>\n Manage\n </Button>\n </div>\n <div>\n {defaultAgent ? (\n <div className=\"space-y-3\">\n <Link\n to={getPath(`agents/${(defaultAgent as { id: string }).id}`)}\n className=\"flex items-center justify-between p-3 rounded-lg border border-border-subtle hover:bg-accent transition-colors\"\n >\n <div className=\"flex items-center gap-3\">\n <span className=\"text-2xl\">🤖</span>\n <div>\n <p className=\"font-medium text-text-primary\">\n {(defaultAgent as { name: string }).name}\n </p>\n <p className=\"text-xs text-text-secondary\">Default Agent</p>\n </div>\n </div>\n <StatusBadge status={(defaultAgent as { status: string }).status} />\n </Link>\n </div>\n ) : (\n <div className=\"text-center py-8 text-text-secondary\">\n <Bot className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>No default agent assigned</p>\n <Button size=\"sm\" className=\"mt-3\" onClick={() => setActiveTab('agents')}>\n Assign Agent\n </Button>\n </div>\n )}\n </div>\n </GlassCard>\n\n {/* Tags */}\n {(bot.tagIds || []).length > 0 && (\n <Card className=\"lg:col-span-3\">\n <CardHeader>\n <CardTitle>Tags</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-wrap gap-2\">\n {(bot.tagIds || []).map((tagId: string) => (\n <Badge key={tagId} variant=\"outline\">\n {tagId}\n </Badge>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </div>\n )}\n\n {/* Workflow Tab */}\n {activeTab === 'workflow' && botId && (\n <Suspense\n fallback={\n <div className=\"h-64 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n }\n >\n <BotWorkflowTab\n botId={botId}\n botName={bot.name}\n workflowId={bot.workflowId}\n onWorkflowChanged={async () => {\n await refetchBot();\n }}\n />\n </Suspense>\n )}\n\n {/* Routing Tab */}\n {activeTab === 'routing' && (\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Routing Configuration</CardTitle>\n <CardDescription>How requests are routed to agents</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Strategy</p>\n <Badge variant=\"outline\" className=\"mt-1\">\n {bot.routingStrategy}\n </Badge>\n </div>\n {bot.defaultAgentId && (\n <div>\n <p className=\"text-sm text-text-secondary\">Default Agent</p>\n <p className=\"font-mono text-sm mt-1\">{bot.defaultAgentId}</p>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Routing Rules</CardTitle>\n <CardDescription>No routing rules configured</CardDescription>\n </CardHeader>\n <CardContent>\n <p className=\"text-text-secondary\">\n No routing rules configured. Routing rules will be available in a future update.\n </p>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Agents Tab */}\n {activeTab === 'agents' && (\n <Card>\n <CardHeader>\n <CardTitle>Default Agent</CardTitle>\n <CardDescription>Select the default agent for this bot</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {defaultAgent && (\n <div className=\"flex items-center justify-between p-4 border border-border-subtle rounded-lg\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-2xl\">🤖</span>\n <div>\n <p className=\"font-medium\">{(defaultAgent as { name: string }).name}</p>\n <Badge variant=\"success\">Default</Badge>\n </div>\n </div>\n <StatusBadge status={(defaultAgent as { status: string }).status} />\n </div>\n )}\n\n <div className=\"flex items-center gap-3\">\n <select\n className=\"flex h-10 flex-1 rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={bot.defaultAgentId || ''}\n disabled={!can(BOTMANOR_PERMISSIONS.APP_UPDATE)}\n onChange={async (e) => {\n if (botId) {\n try {\n await updateBot({\n botId,\n input: { defaultAgentId: e.target.value || null },\n });\n toast.success(\n e.target.value ? 'Default agent assigned' : 'Default agent removed'\n );\n } catch (err: unknown) {\n const message =\n err instanceof Error ? err.message : 'Failed to assign agent';\n toast.error(message);\n }\n }\n }}\n >\n <option value=\"\">No default agent</option>\n {agents?.map((agent: { id: string; name: string }) => (\n <option key={agent.id} value={agent.id}>\n {agent.name}\n </option>\n ))}\n </select>\n </div>\n\n {!defaultAgent && !agents?.length && (\n <div className=\"text-center py-8 text-text-secondary\">\n <Bot className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>No agents available. Create an agent first.</p>\n </div>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Channels Tab */}\n {activeTab === 'channels' && botId && <BotChannelsTab botId={botId} botName={bot.name} />}\n\n {/* AI Operations Tab (supervisor findings for this bot app, BOFF-3839) */}\n {activeTab === 'aiOperations' && botId && (\n <AiOperationsPanel\n filter={{ subjectType: 'APP', subjectId: botId }}\n description={t(\n 'botlit.botDetail.aiOperationsDescription',\n 'What the supervisor flagged for this bot — drift, evidence and the recommended action.'\n )}\n />\n )}\n\n {/* Guardrails Tab */}\n {activeTab === 'guardrails' && (\n <Card>\n <CardHeader>\n <CardTitle>Policy Bindings</CardTitle>\n <CardDescription>Guardrails and policies attached to this bot</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"text-center py-8 text-text-secondary\">\n <Shield className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>Not configured</p>\n <p className=\"text-sm mt-1\">\n Policy bindings will be available in a future update.\n </p>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Releases Tab */}\n {activeTab === 'releases' && (\n <Card>\n <CardHeader>\n <CardTitle>Release Tracks</CardTitle>\n <CardDescription>Version deployments across environments</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"text-center py-8 text-text-secondary\">\n <Layers className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>Not configured</p>\n <p className=\"text-sm mt-1\">Release tracks will be available in a future update.</p>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { FC } from 'react';
2
+ interface BotWorkflowTabProps {
3
+ botId: string;
4
+ botName: string;
5
+ /** `BotApp.workflowId` — the bound workflow definition id, if any. */
6
+ workflowId: string | null | undefined;
7
+ /** Refetch the bot so the tab reflects the new binding. */
8
+ onWorkflowChanged: () => Promise<void> | void;
9
+ }
10
+ export declare const BotWorkflowTab: FC<BotWorkflowTabProps>;
11
+ export {};
@@ -1,19 +1,19 @@
1
1
  import { useTr as e } from "../../shared/hooks/useTr.js";
2
- import { useBotlit as t } from "../providers/BotlitProvider.js";
3
- import { useUpdateBot as n } from "../hooks/useBots.js";
4
- import { BOTMANOR_PERMISSIONS as r } from "../permissions/botmanorPermissions.js";
5
- import { BotmanorPermissionGate as i } from "../permissions/useBotmanorPermissions.js";
6
- import { Button as a } from "../components/Button.js";
7
- import "../permissions/index.js";
8
- import { Card as o, CardContent as s, CardDescription as c, CardHeader as l, CardTitle as u } from "../components/Card.js";
2
+ import { useBotWorkflowDefinition as t, useCreateBotWorkflow as n } from "../hooks/useBotWorkflow.js";
3
+ import { Card as r, CardContent as i, CardDescription as a, CardHeader as o, CardTitle as s } from "../components/Card.js";
4
+ import { BOTMANOR_PERMISSIONS as c } from "../permissions/botmanorPermissions.js";
5
+ import { BotmanorPermissionGate as l } from "../permissions/useBotmanorPermissions.js";
6
+ import { Button as u } from "../components/Button.js";
9
7
  import { Badge as d, StatusBadge as f } from "../components/Badge.js";
10
8
  import { EmptyState as p } from "../components/EmptyState.js";
11
- import { useBotWorkflowDefinition as m, useCreateBotWorkflow as h } from "../hooks/useBotWorkflow.js";
9
+ import { useUpdateBot as m } from "../hooks/useBots.js";
10
+ import { useBotlit as h } from "../providers/BotlitProvider.js";
11
+ import "../permissions/index.js";
12
12
  import { useCallback as g, useState as _ } from "react";
13
13
  import { jsx as v, jsxs as y } from "react/jsx-runtime";
14
14
  import { ExternalLink as b, Sparkles as x, Unlink as S, Workflow as C } from "lucide-react";
15
15
  import { toast as w } from "sonner";
16
- //#region src/botlit/pages/BotWorkflowTab.tsx
16
+ // src/botlit/pages/BotWorkflowTab.tsx
17
17
  var T = "v1", E = "internal:api", D = "1.0.0", O = "onManualTrigger", k = "Trigger Manually", A = "Runs the flow when you click 'Test workflow', or when this bot is invoked.", j = [
18
18
  "trigger",
19
19
  "manual",
@@ -85,7 +85,7 @@ function N(e, t) {
85
85
  };
86
86
  }
87
87
  var P = ({ botId: E, botName: D, workflowId: O, onWorkflowChanged: k }) => {
88
- let A = e(), { navigateTo: j } = t(), { createWorkflow: P } = h(), [F] = n(), [I, L] = _(!1), { workflow: R, loading: z } = m(void 0, O ?? void 0), B = g((e, t) => {
88
+ let A = e(), { navigateTo: j } = h(), { createWorkflow: P } = n(), [F] = m(), [I, L] = _(!1), { workflow: R, loading: z } = t(void 0, O ?? void 0), B = g((e, t) => {
89
89
  j(`workflows/workflow/${e}/${t || T}`);
90
90
  }, [j]), V = g(async () => {
91
91
  L(!0);
@@ -139,10 +139,10 @@ var P = ({ botId: E, botName: D, workflowId: O, onWorkflowChanged: k }) => {
139
139
  ]);
140
140
  return O ? /* @__PURE__ */ v("div", {
141
141
  className: "space-y-6",
142
- children: /* @__PURE__ */ y(o, { children: [/* @__PURE__ */ y(l, { children: [/* @__PURE__ */ y(u, {
142
+ children: /* @__PURE__ */ y(r, { children: [/* @__PURE__ */ y(o, { children: [/* @__PURE__ */ y(s, {
143
143
  className: "flex items-center gap-2",
144
144
  children: [/* @__PURE__ */ v(C, { size: 18 }), A("botlit.botDetail.workflow.bound.title", "Bound workflow")]
145
- }), /* @__PURE__ */ v(c, { children: A("botlit.botDetail.workflow.bound.description", "This workflow defines what the bot does when it is invoked.") })] }), /* @__PURE__ */ y(s, {
145
+ }), /* @__PURE__ */ v(a, { children: A("botlit.botDetail.workflow.bound.description", "This workflow defines what the bot does when it is invoked.") })] }), /* @__PURE__ */ y(i, {
146
146
  className: "space-y-6",
147
147
  children: [z ? /* @__PURE__ */ v("div", { className: "h-24 rounded-lg bg-bg-sunken motion-safe:animate-vc-shimmer" }) : R ? /* @__PURE__ */ y("div", {
148
148
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
@@ -192,14 +192,14 @@ var P = ({ botId: E, botName: D, workflowId: O, onWorkflowChanged: k }) => {
192
192
  })
193
193
  ] }), /* @__PURE__ */ y("div", {
194
194
  className: "flex flex-wrap gap-2",
195
- children: [R && /* @__PURE__ */ v(a, {
195
+ children: [R && /* @__PURE__ */ v(u, {
196
196
  leftIcon: /* @__PURE__ */ v(b, { size: 16 }),
197
197
  disabled: I,
198
198
  onClick: () => B(R.workflowKey, R.version),
199
199
  children: A("botlit.botDetail.workflow.actions.openBuilder", "Open in builder")
200
- }), /* @__PURE__ */ v(i, {
201
- permission: r.APP_UPDATE,
202
- children: /* @__PURE__ */ v(a, {
200
+ }), /* @__PURE__ */ v(l, {
201
+ permission: c.APP_UPDATE,
202
+ children: /* @__PURE__ */ v(u, {
203
203
  variant: "outline",
204
204
  leftIcon: /* @__PURE__ */ v(S, { size: 16 }),
205
205
  isLoading: I,
@@ -210,15 +210,15 @@ var P = ({ botId: E, botName: D, workflowId: O, onWorkflowChanged: k }) => {
210
210
  })]
211
211
  })]
212
212
  })] })
213
- }) : /* @__PURE__ */ v(o, { children: /* @__PURE__ */ v(s, {
213
+ }) : /* @__PURE__ */ v(r, { children: /* @__PURE__ */ v(i, {
214
214
  className: "pt-6",
215
215
  children: /* @__PURE__ */ v(p, {
216
216
  illustration: "empty-generic",
217
217
  title: A("botlit.botDetail.workflow.empty.title", "Design this bot as a workflow"),
218
218
  description: A("botlit.botDetail.workflow.empty.description", "A bot's behaviour is designed as a FluidGrids workflow — the visual canvas where you wire triggers, agents, tools and conditions together. Start one and we will create it, bind it to this bot and open the builder for you."),
219
- action: /* @__PURE__ */ v(i, {
220
- permission: r.APP_UPDATE,
221
- children: /* @__PURE__ */ v(a, {
219
+ action: /* @__PURE__ */ v(l, {
220
+ permission: c.APP_UPDATE,
221
+ children: /* @__PURE__ */ v(u, {
222
222
  leftIcon: /* @__PURE__ */ v(x, { size: 16 }),
223
223
  isLoading: I,
224
224
  disabled: I,
@@ -229,7 +229,6 @@ var P = ({ botId: E, botName: D, workflowId: O, onWorkflowChanged: k }) => {
229
229
  })
230
230
  }) });
231
231
  };
232
- //#endregion
233
232
  export { P as BotWorkflowTab };
234
233
 
235
234
  //# sourceMappingURL=BotWorkflowTab.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BotWorkflowTab.js","names":[],"sources":["../../../src/botlit/pages/BotWorkflowTab.tsx"],"sourcesContent":["/**\n * BotWorkflowTab\n * @module botlit/pages\n *\n * Shown inside BotDetailPage → \"Workflow\" tab.\n *\n * A bot's behaviour is designed as a FluidGrids workflow. `BotApp.workflowId`\n * holds the binding (validated server-side by `assertWorkflowBindingsResolvable`\n * on wspace-botlit-svc), and the FluidGrids builder is already mounted INSIDE\n * BotManor at `workflows/workflow/:id/:version` — so this tab never leaves the\n * product.\n *\n * Flow:\n * 1. Bound → resolve the definition by id (`useWorkflowDefinition`), show\n * name / key / version / status, \"Open in builder\", \"Unbind\".\n * A binding that no longer resolves falls back to the raw id so\n * the user can still clear it.\n * 2. Not bound → zero state whose primary action creates a seeded workflow\n * definition, binds it via `updateBotApp(workflowId)` and drops\n * the user straight into the embedded builder.\n *\n * IMPORTANT — seed graph shape. `BotlitFluidGridsBridge.extractTriggerNodeIds`\n * reads nodes from `definitionJson.data.nodes` (NOT the top level) and treats a\n * node as a trigger when its `type` is `trigger`/`trigger:*`/`*_trigger`, OR its\n * `kind[]` / `data.nodeData.kind[]` contains `trigger`. The seed below uses the\n * workflow service's own BUILTIN manual trigger (`internal:api`, \"Trigger\n * Manually\") — the node the executor resolves as the entry point — and carries\n * `kind: ['trigger', ...]` in both places, so a freshly designed bot is\n * immediately runnable instead of failing with `WORKFLOW_NO_TRIGGER_NODE`.\n */\n\nimport type { FC } from 'react';\nimport { useCallback, useState } from 'react';\nimport { ExternalLink, Sparkles, Unlink, Workflow } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { useTr } from '../../shared/hooks/useTr';\nimport {\n useCreateBotWorkflow as useCreateWorkflow,\n useBotWorkflowDefinition as useWorkflowDefinition,\n} from '../hooks/useBotWorkflow';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useUpdateBot } from '../hooks/useBots';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Seed graph\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** First version minted for a bot's workflow — matches the builder's own default. */\nconst INITIAL_VERSION = 'v1';\n\n/**\n * BUILTIN \"Trigger Manually\" node (`MANUAL_TRIGGER_MANIFEST` in\n * wspace-workflow-svc). The executor resolves this type as a workflow's entry\n * node, and the builder renders it from the seeded node registry.\n */\nconst MANUAL_TRIGGER_NODE_TYPE = 'internal:api';\nconst MANUAL_TRIGGER_NODE_VERSION = '1.0.0';\nconst MANUAL_TRIGGER_OPERATION = 'onManualTrigger';\nconst MANUAL_TRIGGER_NAME = 'Trigger Manually';\nconst MANUAL_TRIGGER_DESCRIPTION =\n \"Runs the flow when you click 'Test workflow', or when this bot is invoked.\";\n\n/** `kind[]` the BotManor bridge scans for when classifying a node as a trigger. */\nconst MANUAL_TRIGGER_KIND = ['trigger', 'manual', 'entry'];\n\n/** Node shape written into `definitionJson.data.nodes`. */\ntype SeedNode = {\n id: string;\n type: string;\n position: { x: number; y: number };\n /** Top-level kind — the bridge's second trigger-detection path. */\n kind: string[];\n data: {\n operation_name: string;\n operation_type: string;\n version: string;\n nodeData: {\n nodeType: string;\n name: string;\n description: string;\n version: string;\n /** The bridge's third trigger-detection path. */\n kind: string[];\n operations: { name: string; type: string; role: string; description: string }[];\n };\n args: {\n context: { node: { id: string; type: string; kind: string[] } };\n state: Record<string, never>;\n credentials: never[];\n };\n };\n};\n\n/**\n * `definitionJson` document. Mirrors what the builder itself persists\n * (`useSaveWorkflow`) so the graph round-trips through the builder unchanged.\n */\ntype SeedDefinition = {\n key: string;\n name: string;\n description: string;\n workflow_type: string;\n data: {\n id: string;\n workflowKey: string;\n version: string;\n name: string;\n nodes: SeedNode[];\n edges: never[];\n sidebar: { active: string; panels: { nodeProperties: { selectedNode: null } } };\n stickyNotes: never[];\n };\n meta: { creator: string; version: string };\n tags: string[];\n};\n\n/**\n * Generate an opaque id. `crypto.randomUUID` is unavailable on insecure origins\n * and in some test environments, so fall back to a time+random token rather than\n * throwing mid-create.\n */\nfunction generateId(): string {\n const webCrypto = globalThis.crypto as Crypto | undefined;\n if (webCrypto && typeof webCrypto.randomUUID === 'function') {\n return webCrypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/** Build the starter graph: one manual trigger, nothing else. */\nfunction buildSeedDefinition(workflowKey: string, name: string): SeedDefinition {\n const triggerNode: SeedNode = {\n id: generateId(),\n type: MANUAL_TRIGGER_NODE_TYPE,\n position: { x: 160, y: 160 },\n kind: MANUAL_TRIGGER_KIND,\n data: {\n operation_name: MANUAL_TRIGGER_OPERATION,\n operation_type: 'trigger',\n version: MANUAL_TRIGGER_NODE_VERSION,\n nodeData: {\n nodeType: MANUAL_TRIGGER_NODE_TYPE,\n name: MANUAL_TRIGGER_NAME,\n description: MANUAL_TRIGGER_DESCRIPTION,\n version: MANUAL_TRIGGER_NODE_VERSION,\n kind: MANUAL_TRIGGER_KIND,\n operations: [\n {\n name: MANUAL_TRIGGER_OPERATION,\n type: 'trigger',\n role: 'trigger',\n description: MANUAL_TRIGGER_DESCRIPTION,\n },\n ],\n },\n args: {\n context: {\n node: {\n id: MANUAL_TRIGGER_NODE_TYPE,\n type: MANUAL_TRIGGER_NODE_TYPE,\n kind: MANUAL_TRIGGER_KIND,\n },\n },\n state: {},\n credentials: [],\n },\n },\n };\n\n return {\n key: workflowKey,\n name,\n description: name,\n workflow_type: 'query-conditional',\n data: {\n id: workflowKey,\n workflowKey,\n version: INITIAL_VERSION,\n name,\n nodes: [triggerNode],\n edges: [],\n sidebar: { active: 'store-browse', panels: { nodeProperties: { selectedNode: null } } },\n stickyNotes: [],\n },\n meta: { creator: 'botlit_bot_design', version: INITIAL_VERSION },\n tags: [],\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface BotWorkflowTabProps {\n botId: string;\n botName: string;\n /** `BotApp.workflowId` — the bound workflow definition id, if any. */\n workflowId: string | null | undefined;\n /** Refetch the bot so the tab reflects the new binding. */\n onWorkflowChanged: () => Promise<void> | void;\n}\n\nexport const BotWorkflowTab: FC<BotWorkflowTabProps> = ({\n botId,\n botName,\n workflowId,\n onWorkflowChanged,\n}) => {\n const t = useTr();\n const { navigateTo } = useBotlit();\n const { createWorkflow } = useCreateWorkflow();\n const [updateBot] = useUpdateBot();\n const [busy, setBusy] = useState(false);\n\n // Resolve by id — `BotApp.workflowId` stores the definition's opaque id, not\n // its workflowKey (which is what the builder route takes). The hook refetches\n // on its own when the bound id changes, so binding/unbinding only has to\n // refresh the bot.\n const { workflow, loading: workflowLoading } = useWorkflowDefinition(\n undefined,\n workflowId ?? undefined\n );\n\n const openBuilder = useCallback(\n (workflowKey: string, version: string) => {\n navigateTo(`workflows/workflow/${workflowKey}/${version || INITIAL_VERSION}`);\n },\n [navigateTo]\n );\n\n const handleDesign = useCallback(async () => {\n setBusy(true);\n try {\n const workflowKey = generateId();\n const name = `${botName} workflow`;\n const created = await createWorkflow({\n workflowKey,\n version: INITIAL_VERSION,\n name,\n description: t(\n 'botlit.botDetail.workflow.createdDescription',\n 'Behaviour designed for this BotManor bot.'\n ),\n definitionJson: buildSeedDefinition(workflowKey, name),\n });\n\n if (!created) {\n throw new Error(\n t('botlit.botDetail.workflow.createError', 'Failed to create the workflow')\n );\n }\n\n await updateBot({ botId, input: { workflowId: created.id } });\n await onWorkflowChanged();\n toast.success(\n t('botlit.botDetail.workflow.createSuccess', 'Workflow created and bound to this bot')\n );\n openBuilder(created.workflowKey, created.version);\n } catch (err: unknown) {\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.botDetail.workflow.createError', 'Failed to create the workflow');\n toast.error(message);\n } finally {\n setBusy(false);\n }\n }, [botId, botName, createWorkflow, onWorkflowChanged, openBuilder, t, updateBot]);\n\n const handleUnbind = useCallback(async () => {\n if (\n !confirm(\n t(\n 'botlit.botDetail.workflow.unbindConfirm',\n 'Unbind this workflow from the bot? The workflow itself is not deleted.'\n )\n )\n ) {\n return;\n }\n setBusy(true);\n try {\n await updateBot({ botId, input: { workflowId: null } });\n await onWorkflowChanged();\n toast.success(t('botlit.botDetail.workflow.unbindSuccess', 'Workflow unbound'));\n } catch (err: unknown) {\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.botDetail.workflow.unbindError', 'Failed to unbind the workflow');\n toast.error(message);\n } finally {\n setBusy(false);\n }\n }, [botId, onWorkflowChanged, t, updateBot]);\n\n // ── Not bound ─────────────────────────────────────────────────────────────\n if (!workflowId) {\n return (\n <Card>\n <CardContent className=\"pt-6\">\n <EmptyState\n illustration=\"empty-generic\"\n title={t('botlit.botDetail.workflow.empty.title', 'Design this bot as a workflow')}\n description={t(\n 'botlit.botDetail.workflow.empty.description',\n \"A bot's behaviour is designed as a FluidGrids workflow — the visual canvas where you wire triggers, agents, tools and conditions together. Start one and we will create it, bind it to this bot and open the builder for you.\"\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_UPDATE}>\n <Button\n leftIcon={<Sparkles size={16} />}\n isLoading={busy}\n disabled={busy}\n onClick={() => void handleDesign()}\n >\n {t('botlit.botDetail.workflow.empty.action', 'Design in workflow builder')}\n </Button>\n </BotmanorPermissionGate>\n }\n />\n </CardContent>\n </Card>\n );\n }\n\n // ── Bound ─────────────────────────────────────────────────────────────────\n return (\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Workflow size={18} />\n {t('botlit.botDetail.workflow.bound.title', 'Bound workflow')}\n </CardTitle>\n <CardDescription>\n {t(\n 'botlit.botDetail.workflow.bound.description',\n 'This workflow defines what the bot does when it is invoked.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n {workflowLoading ? (\n <div className=\"h-24 rounded-lg bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ) : workflow ? (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botDetail.workflow.fields.name', 'Name')}\n </p>\n <p className=\"font-medium text-text-primary\">{workflow.name}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botDetail.workflow.fields.key', 'Key')}\n </p>\n <p className=\"mt-1 break-all font-mono text-sm text-text-primary\">\n {workflow.workflowKey}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botDetail.workflow.fields.version', 'Version')}\n </p>\n <Badge variant=\"outline\" className=\"mt-1\">\n {workflow.version}\n </Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botDetail.workflow.fields.status', 'Status')}\n </p>\n <div className=\"mt-1\">\n <StatusBadge status={workflow.status} />\n </div>\n </div>\n </div>\n ) : (\n <div>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botDetail.workflow.fields.workflowId', 'Workflow ID')}\n </p>\n <p className=\"mt-1 break-all font-mono text-sm text-text-primary\">{workflowId}</p>\n <p className=\"mt-2 text-sm text-text-secondary\">\n {t(\n 'botlit.botDetail.workflow.unresolved',\n 'This workflow could not be loaded — it may have been deleted. Unbind it and design a new one.'\n )}\n </p>\n </div>\n )}\n\n <div className=\"flex flex-wrap gap-2\">\n {workflow && (\n <Button\n leftIcon={<ExternalLink size={16} />}\n disabled={busy}\n onClick={() => openBuilder(workflow.workflowKey, workflow.version)}\n >\n {t('botlit.botDetail.workflow.actions.openBuilder', 'Open in builder')}\n </Button>\n )}\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_UPDATE}>\n <Button\n variant=\"outline\"\n leftIcon={<Unlink size={16} />}\n isLoading={busy}\n disabled={busy}\n onClick={() => void handleUnbind()}\n >\n {t('botlit.botDetail.workflow.actions.unbind', 'Unbind')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"BotWorkflowTab.js","names":["useCreateWorkflow","useWorkflowDefinition","INITIAL_VERSION","MANUAL_TRIGGER_NODE_TYPE","MANUAL_TRIGGER_NODE_VERSION","MANUAL_TRIGGER_OPERATION","MANUAL_TRIGGER_NAME","MANUAL_TRIGGER_DESCRIPTION","MANUAL_TRIGGER_KIND","generateId","webCrypto","buildSeedDefinition","workflowKey","name","BotWorkflowTab","t","useTr","useBotlit","useCreateBotWorkflow","updateBot","useUpdateBot","busy","setBusy","useState","workflowLoading","useBotWorkflowDefinition","workflowId","openBuilder","useCallback","version","navigateTo","handleDesign","botName","created","createWorkflow","onWorkflowChanged","toast","err","message","botId","handleUnbind","Card","CardHeader","CardTitle","Workflow","CardDescription","CardContent","workflow","Badge","StatusBadge","Button","ExternalLink","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Unlink","EmptyState","Sparkles"],"sources":["../../../src/botlit/pages/BotWorkflowTab.tsx"],"sourcesContent":["/**\n * BotWorkflowTab\n * @module botlit/pages\n *\n * Shown inside BotDetailPage → \"Workflow\" tab.\n *\n * A bot's behaviour is designed as a FluidGrids workflow. `BotApp.workflowId`\n * holds the binding (validated server-side by `assertWorkflowBindingsResolvable`\n * on wspace-botlit-svc), and the FluidGrids builder is already mounted INSIDE\n * BotManor at `workflows/workflow/:id/:version` — so this tab never leaves the\n * product.\n *\n * Flow:\n * 1. Bound → resolve the definition by id (`useWorkflowDefinition`), show\n * name / key / version / status, \"Open in builder\", \"Unbind\".\n * A binding that no longer resolves falls back to the raw id so\n * the user can still clear it.\n * 2. Not bound → zero state whose primary action creates a seeded workflow\n * definition, binds it via `updateBotApp(workflowId)` and drops\n * the user straight into the embedded builder.\n *\n * IMPORTANT — seed graph shape. `BotlitFluidGridsBridge.extractTriggerNodeIds`\n * reads nodes from `definitionJson.data.nodes` (NOT the top level) and treats a\n * node as a trigger when its `type` is `trigger`/`trigger:*`/`*_trigger`, OR its\n * `kind[]` / `data.nodeData.kind[]` contains `trigger`. The seed below uses the\n * workflow service's own BUILTIN manual trigger (`internal:api`, \"Trigger\n * Manually\") — the node the executor resolves as the entry point — and carries\n * `kind: ['trigger', ...]` in both places, so a freshly designed bot is\n * immediately runnable instead of failing with `WORKFLOW_NO_TRIGGER_NODE`.\n */\n\nimport type { FC } from 'react';\nimport { useCallback, useState } from 'react';\nimport { ExternalLink, Sparkles, Unlink, Workflow } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { useTr } from '../../shared/hooks/useTr';\nimport {\n useCreateBotWorkflow as useCreateWorkflow,\n useBotWorkflowDefinition as useWorkflowDefinition,\n} from '../hooks/useBotWorkflow';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useUpdateBot } from '../hooks/useBots';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Seed graph\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** First version minted for a bot's workflow — matches the builder's own default. */\nconst INITIAL_VERSION = 'v1';\n\n/**\n * BUILTIN \"Trigger Manually\" node (`MANUAL_TRIGGER_MANIFEST` in\n * wspace-workflow-svc). The executor resolves this type as a workflow's entry\n * node, and the builder renders it from the seeded node registry.\n */\nconst MANUAL_TRIGGER_NODE_TYPE = 'internal:api';\nconst MANUAL_TRIGGER_NODE_VERSION = '1.0.0';\nconst MANUAL_TRIGGER_OPERATION = 'onManualTrigger';\nconst MANUAL_TRIGGER_NAME = 'Trigger Manually';\nconst MANUAL_TRIGGER_DESCRIPTION =\n \"Runs the flow when you click 'Test workflow', or when this bot is invoked.\";\n\n/** `kind[]` the BotManor bridge scans for when classifying a node as a trigger. */\nconst MANUAL_TRIGGER_KIND = ['trigger', 'manual', 'entry'];\n\n/** Node shape written into `definitionJson.data.nodes`. */\ntype SeedNode = {\n id: string;\n type: string;\n position: { x: number; y: number };\n /** Top-level kind — the bridge's second trigger-detection path. */\n kind: string[];\n data: {\n operation_name: string;\n operation_type: string;\n version: string;\n nodeData: {\n nodeType: string;\n name: string;\n description: string;\n version: string;\n /** The bridge's third trigger-detection path. */\n kind: string[];\n operations: { name: string; type: string; role: string; description: string }[];\n };\n args: {\n context: { node: { id: string; type: string; kind: string[] } };\n state: Record<string, never>;\n credentials: never[];\n };\n };\n};\n\n/**\n * `definitionJson` document. Mirrors what the builder itself persists\n * (`useSaveWorkflow`) so the graph round-trips through the builder unchanged.\n */\ntype SeedDefinition = {\n key: string;\n name: string;\n description: string;\n workflow_type: string;\n data: {\n id: string;\n workflowKey: string;\n version: string;\n name: string;\n nodes: SeedNode[];\n edges: never[];\n sidebar: { active: string; panels: { nodeProperties: { selectedNode: null } } };\n stickyNotes: never[];\n };\n meta: { creator: string; version: string };\n tags: string[];\n};\n\n/**\n * Generate an opaque id. `crypto.randomUUID` is unavailable on insecure origins\n * and in some test environments, so fall back to a time+random token rather than\n * throwing mid-create.\n */\nfunction generateId(): string {\n const webCrypto = globalThis.crypto as Crypto | undefined;\n if (webCrypto && typeof webCrypto.randomUUID === 'function') {\n return webCrypto.randomUUID();\n }\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/** Build the starter graph: one manual trigger, nothing else. */\nfunction buildSeedDefinition(workflowKey: string, name: string): SeedDefinition {\n const triggerNode: SeedNode = {\n id: generateId(),\n type: MANUAL_TRIGGER_NODE_TYPE,\n position: { x: 160, y: 160 },\n kind: MANUAL_TRIGGER_KIND,\n data: {\n operation_name: MANUAL_TRIGGER_OPERATION,\n operation_type: 'trigger',\n version: MANUAL_TRIGGER_NODE_VERSION,\n nodeData: {\n nodeType: MANUAL_TRIGGER_NODE_TYPE,\n name: MANUAL_TRIGGER_NAME,\n description: MANUAL_TRIGGER_DESCRIPTION,\n version: MANUAL_TRIGGER_NODE_VERSION,\n kind: MANUAL_TRIGGER_KIND,\n operations: [\n {\n name: MANUAL_TRIGGER_OPERATION,\n type: 'trigger',\n role: 'trigger',\n description: MANUAL_TRIGGER_DESCRIPTION,\n },\n ],\n },\n args: {\n context: {\n node: {\n id: MANUAL_TRIGGER_NODE_TYPE,\n type: MANUAL_TRIGGER_NODE_TYPE,\n kind: MANUAL_TRIGGER_KIND,\n },\n },\n state: {},\n credentials: [],\n },\n },\n };\n\n return {\n key: workflowKey,\n name,\n description: name,\n workflow_type: 'query-conditional',\n data: {\n id: workflowKey,\n workflowKey,\n version: INITIAL_VERSION,\n name,\n nodes: [triggerNode],\n edges: [],\n sidebar: { active: 'store-browse', panels: { nodeProperties: { selectedNode: null } } },\n stickyNotes: [],\n },\n meta: { creator: 'botlit_bot_design', version: INITIAL_VERSION },\n tags: [],\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Component\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface BotWorkflowTabProps {\n botId: string;\n botName: string;\n /** `BotApp.workflowId` — the bound workflow definition id, if any. */\n workflowId: string | null | undefined;\n /** Refetch the bot so the tab reflects the new binding. */\n onWorkflowChanged: () => Promise<void> | void;\n}\n\nexport const BotWorkflowTab: FC<BotWorkflowTabProps> = ({\n botId,\n botName,\n workflowId,\n onWorkflowChanged,\n}) => {\n const t = useTr();\n const { navigateTo } = useBotlit();\n const { createWorkflow } = useCreateWorkflow();\n const [updateBot] = useUpdateBot();\n const [busy, setBusy] = useState(false);\n\n // Resolve by id — `BotApp.workflowId` stores the definition's opaque id, not\n // its workflowKey (which is what the builder route takes). The hook refetches\n // on its own when the bound id changes, so binding/unbinding only has to\n // refresh the bot.\n const { workflow, loading: workflowLoading } = useWorkflowDefinition(\n undefined,\n workflowId ?? undefined\n );\n\n const openBuilder = useCallback(\n (workflowKey: string, version: string) => {\n navigateTo(`workflows/workflow/${workflowKey}/${version || INITIAL_VERSION}`);\n },\n [navigateTo]\n );\n\n const handleDesign = useCallback(async () => {\n setBusy(true);\n try {\n const workflowKey = generateId();\n const name = `${botName} workflow`;\n const created = await createWorkflow({\n workflowKey,\n version: INITIAL_VERSION,\n name,\n description: t(\n 'botlit.botDetail.workflow.createdDescription',\n 'Behaviour designed for this BotManor bot.'\n ),\n definitionJson: buildSeedDefinition(workflowKey, name),\n });\n\n if (!created) {\n throw new Error(\n t('botlit.botDetail.workflow.createError', 'Failed to create the workflow')\n );\n }\n\n await updateBot({ botId, input: { workflowId: created.id } });\n await onWorkflowChanged();\n toast.success(\n t('botlit.botDetail.workflow.createSuccess', 'Workflow created and bound to this bot')\n );\n openBuilder(created.workflowKey, created.version);\n } catch (err: unknown) {\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.botDetail.workflow.createError', 'Failed to create the workflow');\n toast.error(message);\n } finally {\n setBusy(false);\n }\n }, [botId, botName, createWorkflow, onWorkflowChanged, openBuilder, t, updateBot]);\n\n const handleUnbind = useCallback(async () => {\n if (\n !confirm(\n t(\n 'botlit.botDetail.workflow.unbindConfirm',\n 'Unbind this workflow from the bot? The workflow itself is not deleted.'\n )\n )\n ) {\n return;\n }\n setBusy(true);\n try {\n await updateBot({ botId, input: { workflowId: null } });\n await onWorkflowChanged();\n toast.success(t('botlit.botDetail.workflow.unbindSuccess', 'Workflow unbound'));\n } catch (err: unknown) {\n const message =\n err instanceof Error\n ? err.message\n : t('botlit.botDetail.workflow.unbindError', 'Failed to unbind the workflow');\n toast.error(message);\n } finally {\n setBusy(false);\n }\n }, [botId, onWorkflowChanged, t, updateBot]);\n\n // ── Not bound ─────────────────────────────────────────────────────────────\n if (!workflowId) {\n return (\n <Card>\n <CardContent className=\"pt-6\">\n <EmptyState\n illustration=\"empty-generic\"\n title={t('botlit.botDetail.workflow.empty.title', 'Design this bot as a workflow')}\n description={t(\n 'botlit.botDetail.workflow.empty.description',\n \"A bot's behaviour is designed as a FluidGrids workflow — the visual canvas where you wire triggers, agents, tools and conditions together. Start one and we will create it, bind it to this bot and open the builder for you.\"\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_UPDATE}>\n <Button\n leftIcon={<Sparkles size={16} />}\n isLoading={busy}\n disabled={busy}\n onClick={() => void handleDesign()}\n >\n {t('botlit.botDetail.workflow.empty.action', 'Design in workflow builder')}\n </Button>\n </BotmanorPermissionGate>\n }\n />\n </CardContent>\n </Card>\n );\n }\n\n // ── Bound ─────────────────────────────────────────────────────────────────\n return (\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Workflow size={18} />\n {t('botlit.botDetail.workflow.bound.title', 'Bound workflow')}\n </CardTitle>\n <CardDescription>\n {t(\n 'botlit.botDetail.workflow.bound.description',\n 'This workflow defines what the bot does when it is invoked.'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n {workflowLoading ? (\n <div className=\"h-24 rounded-lg bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ) : workflow ? (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botDetail.workflow.fields.name', 'Name')}\n </p>\n <p className=\"font-medium text-text-primary\">{workflow.name}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botDetail.workflow.fields.key', 'Key')}\n </p>\n <p className=\"mt-1 break-all font-mono text-sm text-text-primary\">\n {workflow.workflowKey}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botDetail.workflow.fields.version', 'Version')}\n </p>\n <Badge variant=\"outline\" className=\"mt-1\">\n {workflow.version}\n </Badge>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botDetail.workflow.fields.status', 'Status')}\n </p>\n <div className=\"mt-1\">\n <StatusBadge status={workflow.status} />\n </div>\n </div>\n </div>\n ) : (\n <div>\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.botDetail.workflow.fields.workflowId', 'Workflow ID')}\n </p>\n <p className=\"mt-1 break-all font-mono text-sm text-text-primary\">{workflowId}</p>\n <p className=\"mt-2 text-sm text-text-secondary\">\n {t(\n 'botlit.botDetail.workflow.unresolved',\n 'This workflow could not be loaded — it may have been deleted. Unbind it and design a new one.'\n )}\n </p>\n </div>\n )}\n\n <div className=\"flex flex-wrap gap-2\">\n {workflow && (\n <Button\n leftIcon={<ExternalLink size={16} />}\n disabled={busy}\n onClick={() => openBuilder(workflow.workflowKey, workflow.version)}\n >\n {t('botlit.botDetail.workflow.actions.openBuilder', 'Open in builder')}\n </Button>\n )}\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.APP_UPDATE}>\n <Button\n variant=\"outline\"\n leftIcon={<Unlink size={16} />}\n isLoading={busy}\n disabled={busy}\n onClick={() => void handleUnbind()}\n >\n {t('botlit.botDetail.workflow.actions.unbind', 'Unbind')}\n </Button>\n </BotmanorPermissionGate>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { FC } from 'react';
2
+ export declare const BotsListPage: FC;