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