@burdenoff/microfe-botmanor 2026.1108.1 → 2026.1109.2
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 +40 -52
- 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 +35 -0
- package/dist/botlit/hooks/index.js +16 -16
- 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 +62 -0
- package/dist/botlit/hooks/useBuckets.js +91 -58
- 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/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 +15 -0
- package/dist/botlit/index.js +11 -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/BucketDetailPage.d.ts +2 -0
- package/dist/botlit/pages/BucketDetailPage.js +251 -0
- package/dist/botlit/pages/BucketDetailPage.js.map +1 -0
- 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/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 +38 -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 +88 -84
- 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/index.js +5 -6
- 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
- package/dist/botlit/hooks/useConversations.js +0 -64
- package/dist/botlit/hooks/useConversations.js.map +0 -1
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { useBotlit as e } from "../providers/BotlitProvider.js";
|
|
2
|
+
import { useTr as t } from "../../shared/hooks/useTr.js";
|
|
3
|
+
import { PageLayout as n } from "../components/PageLayout.js";
|
|
4
4
|
import { BOTMANOR_PERMISSIONS as r } from "../permissions/botmanorPermissions.js";
|
|
5
5
|
import { BotmanorPermissionGate as i } from "../permissions/useBotmanorPermissions.js";
|
|
6
|
-
import {
|
|
7
|
-
import { Button as
|
|
8
|
-
import "../
|
|
9
|
-
import { Card as s, CardContent as c, CardDescription as l, CardHeader as u, CardTitle as d } from "../components/Card.js";
|
|
6
|
+
import { Card as a, CardContent as o, CardDescription as s, CardHeader as c, CardTitle as l } from "../components/Card.js";
|
|
7
|
+
import { Button as u } from "../components/Button.js";
|
|
8
|
+
import { Input as d } from "../components/Input.js";
|
|
10
9
|
import { Badge as f, StatusBadge as p } from "../components/Badge.js";
|
|
11
10
|
import { EmptyState as m } from "../components/EmptyState.js";
|
|
12
|
-
import {
|
|
13
|
-
import { ErrorState as g } from "../components/ErrorState.js";
|
|
14
|
-
import { routeMetadataString as _, useChannelConnectors as v, useChannelRoutes as y } from "../hooks/useChannels.js";
|
|
11
|
+
import { ErrorState as h } from "../components/ErrorState.js";
|
|
15
12
|
import "../hooks/index.js";
|
|
13
|
+
import { formatRelativeTime as g } from "../utils/formatters.js";
|
|
14
|
+
import { routeMetadataString as _, useChannelConnectors as v, useChannelRoutes as y } from "../hooks/useChannels.js";
|
|
15
|
+
import "../permissions/index.js";
|
|
16
16
|
import { useMemo as b, useState as x } from "react";
|
|
17
17
|
import { GlassCard as S, PagePurpose as C } from "@burdenoff/fe-libs/ui";
|
|
18
18
|
import { Fragment as w, jsx as T, jsxs as E } from "react/jsx-runtime";
|
|
19
19
|
import { Link as D } from "react-router";
|
|
20
20
|
import { ArrowRight as O, Filter as k, Globe as A, Hash as j, MessageSquare as M, Plus as N, Search as P, Settings as F, Slack as I, Webhook as L } from "lucide-react";
|
|
21
|
-
|
|
21
|
+
// src/botlit/pages/ChannelsPage.tsx
|
|
22
22
|
var R = ({ type: e, className: t }) => {
|
|
23
23
|
switch (e) {
|
|
24
24
|
case "SLACK": return /* @__PURE__ */ T(I, { className: t });
|
|
@@ -29,17 +29,17 @@ var R = ({ type: e, className: t }) => {
|
|
|
29
29
|
default: return /* @__PURE__ */ T(M, { className: t });
|
|
30
30
|
}
|
|
31
31
|
}, z = () => {
|
|
32
|
-
let A =
|
|
32
|
+
let A = t(), { getPath: j } = e(), [I, L] = x(""), [z, B] = x("connectors"), V = b(() => ({ search: I }), [I]), { data: H, loading: U, error: W, refetch: G } = v(V), { data: K, loading: q, error: J, refetch: Y } = y(), X = b(() => {
|
|
33
33
|
let e = /* @__PURE__ */ new Map();
|
|
34
|
-
for (let t of
|
|
34
|
+
for (let t of K) e.set(t.connectorId, (e.get(t.connectorId) ?? 0) + 1);
|
|
35
35
|
return e;
|
|
36
|
-
}, [
|
|
37
|
-
return /* @__PURE__ */ T(
|
|
36
|
+
}, [K]);
|
|
37
|
+
return /* @__PURE__ */ T(n, {
|
|
38
38
|
title: A("botlit.channels.title", "Channels"),
|
|
39
39
|
description: A("botlit.channels.description", "Connect agents to messaging platforms and configure routing"),
|
|
40
40
|
actions: /* @__PURE__ */ E("div", {
|
|
41
41
|
className: "flex gap-2",
|
|
42
|
-
children: [/* @__PURE__ */ T(
|
|
42
|
+
children: [/* @__PURE__ */ T(u, {
|
|
43
43
|
variant: "outline",
|
|
44
44
|
children: /* @__PURE__ */ T(D, {
|
|
45
45
|
to: j("channels/routes"),
|
|
@@ -47,7 +47,7 @@ var R = ({ type: e, className: t }) => {
|
|
|
47
47
|
})
|
|
48
48
|
}), /* @__PURE__ */ T(i, {
|
|
49
49
|
permission: r.CHANNEL_CREATE,
|
|
50
|
-
children: /* @__PURE__ */ T(
|
|
50
|
+
children: /* @__PURE__ */ T(u, {
|
|
51
51
|
leftIcon: /* @__PURE__ */ T(N, { size: 16 }),
|
|
52
52
|
children: /* @__PURE__ */ T(D, {
|
|
53
53
|
to: j("channels/new"),
|
|
@@ -71,7 +71,7 @@ var R = ({ type: e, className: t }) => {
|
|
|
71
71
|
children: [
|
|
72
72
|
A("botlit.channels.tabs.connectors", "Connectors"),
|
|
73
73
|
" (",
|
|
74
|
-
|
|
74
|
+
H.length,
|
|
75
75
|
")"
|
|
76
76
|
]
|
|
77
77
|
}), /* @__PURE__ */ E("button", {
|
|
@@ -80,7 +80,7 @@ var R = ({ type: e, className: t }) => {
|
|
|
80
80
|
children: [
|
|
81
81
|
A("botlit.channels.tabs.routes", "Routes"),
|
|
82
82
|
" (",
|
|
83
|
-
|
|
83
|
+
K.length,
|
|
84
84
|
")"
|
|
85
85
|
]
|
|
86
86
|
})]
|
|
@@ -89,36 +89,36 @@ var R = ({ type: e, className: t }) => {
|
|
|
89
89
|
className: "flex items-center gap-4",
|
|
90
90
|
children: [/* @__PURE__ */ E("div", {
|
|
91
91
|
className: "relative flex-1 max-w-md",
|
|
92
|
-
children: [/* @__PURE__ */ T(P, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ T(
|
|
92
|
+
children: [/* @__PURE__ */ T(P, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ T(d, {
|
|
93
93
|
placeholder: A("botlit.channels.searchPlaceholder", "Search {{tab}}...", { tab: z }),
|
|
94
94
|
value: I,
|
|
95
95
|
onChange: (e) => L(e.target.value),
|
|
96
96
|
className: "pl-9"
|
|
97
97
|
})]
|
|
98
|
-
}), /* @__PURE__ */ T(
|
|
98
|
+
}), /* @__PURE__ */ T(u, {
|
|
99
99
|
variant: "outline",
|
|
100
100
|
leftIcon: /* @__PURE__ */ T(k, { size: 16 }),
|
|
101
101
|
children: A("botlit.channels.filters.filters", "Filters")
|
|
102
102
|
})]
|
|
103
103
|
}),
|
|
104
|
-
z === "connectors" && /* @__PURE__ */ T(w, { children:
|
|
104
|
+
z === "connectors" && /* @__PURE__ */ T(w, { children: U ? /* @__PURE__ */ T("div", {
|
|
105
105
|
className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
|
|
106
106
|
children: [
|
|
107
107
|
1,
|
|
108
108
|
2,
|
|
109
109
|
3
|
|
110
110
|
].map((e) => /* @__PURE__ */ T("div", { className: "h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
|
|
111
|
-
}) :
|
|
111
|
+
}) : W ? /* @__PURE__ */ T(h, {
|
|
112
112
|
resource: "channel connectors",
|
|
113
|
-
error:
|
|
114
|
-
onRetry: () => void
|
|
115
|
-
}) :
|
|
113
|
+
error: W,
|
|
114
|
+
onRetry: () => void G()
|
|
115
|
+
}) : H.length > 0 ? /* @__PURE__ */ T("div", {
|
|
116
116
|
className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
|
|
117
|
-
children:
|
|
117
|
+
children: H.map((e) => /* @__PURE__ */ T(D, {
|
|
118
118
|
to: j(`channels/${e.id}`),
|
|
119
|
-
children: /* @__PURE__ */ E(
|
|
119
|
+
children: /* @__PURE__ */ E(a, {
|
|
120
120
|
className: "h-full hover:border-primary/50 transition-colors cursor-pointer",
|
|
121
|
-
children: [/* @__PURE__ */ T(
|
|
121
|
+
children: [/* @__PURE__ */ T(c, { children: /* @__PURE__ */ E("div", {
|
|
122
122
|
className: "flex items-start justify-between",
|
|
123
123
|
children: [/* @__PURE__ */ E("div", {
|
|
124
124
|
className: "flex items-center gap-3",
|
|
@@ -128,15 +128,15 @@ var R = ({ type: e, className: t }) => {
|
|
|
128
128
|
type: e.type,
|
|
129
129
|
className: "h-5 w-5 text-primary"
|
|
130
130
|
})
|
|
131
|
-
}), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T(
|
|
131
|
+
}), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T(l, {
|
|
132
132
|
className: "text-base",
|
|
133
133
|
children: e.name
|
|
134
|
-
}), /* @__PURE__ */ T(
|
|
134
|
+
}), /* @__PURE__ */ T(s, {
|
|
135
135
|
className: "text-xs",
|
|
136
136
|
children: e.description
|
|
137
137
|
})] })]
|
|
138
138
|
}), /* @__PURE__ */ T(p, { status: e.status })]
|
|
139
|
-
}) }), /* @__PURE__ */ T(
|
|
139
|
+
}) }), /* @__PURE__ */ T(o, { children: /* @__PURE__ */ E("div", {
|
|
140
140
|
className: "space-y-3",
|
|
141
141
|
children: [
|
|
142
142
|
/* @__PURE__ */ E("div", {
|
|
@@ -157,7 +157,7 @@ var R = ({ type: e, className: t }) => {
|
|
|
157
157
|
children: A("botlit.channels.list.activeRoutes", "Active Routes")
|
|
158
158
|
}), /* @__PURE__ */ T(f, {
|
|
159
159
|
variant: "secondary",
|
|
160
|
-
children:
|
|
160
|
+
children: X.get(e.id) ?? 0
|
|
161
161
|
})]
|
|
162
162
|
}),
|
|
163
163
|
/* @__PURE__ */ E("div", {
|
|
@@ -165,7 +165,7 @@ var R = ({ type: e, className: t }) => {
|
|
|
165
165
|
children: [
|
|
166
166
|
A("botlit.botsList.createdLabel", "Created"),
|
|
167
167
|
" ",
|
|
168
|
-
|
|
168
|
+
g(e.createdAt)
|
|
169
169
|
]
|
|
170
170
|
})
|
|
171
171
|
]
|
|
@@ -178,7 +178,7 @@ var R = ({ type: e, className: t }) => {
|
|
|
178
178
|
description: A("botlit.channels.empty.connectors.description", "Connect messaging platforms to deploy agents across multiple channels."),
|
|
179
179
|
action: /* @__PURE__ */ T(i, {
|
|
180
180
|
permission: r.CHANNEL_CREATE,
|
|
181
|
-
children: /* @__PURE__ */ T(
|
|
181
|
+
children: /* @__PURE__ */ T(u, {
|
|
182
182
|
leftIcon: /* @__PURE__ */ T(N, { size: 16 }),
|
|
183
183
|
children: /* @__PURE__ */ T(D, {
|
|
184
184
|
to: j("channels/new"),
|
|
@@ -187,20 +187,20 @@ var R = ({ type: e, className: t }) => {
|
|
|
187
187
|
})
|
|
188
188
|
})
|
|
189
189
|
}) }),
|
|
190
|
-
z === "routes" && /* @__PURE__ */ T(w, { children:
|
|
190
|
+
z === "routes" && /* @__PURE__ */ T(w, { children: q ? /* @__PURE__ */ T("div", {
|
|
191
191
|
className: "space-y-4",
|
|
192
192
|
children: [
|
|
193
193
|
1,
|
|
194
194
|
2,
|
|
195
195
|
3
|
|
196
196
|
].map((e) => /* @__PURE__ */ T("div", { className: "h-20 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
|
|
197
|
-
}) :
|
|
197
|
+
}) : J ? /* @__PURE__ */ T(h, {
|
|
198
198
|
resource: "channel routes",
|
|
199
|
-
error:
|
|
200
|
-
onRetry: () => void
|
|
201
|
-
}) :
|
|
199
|
+
error: J,
|
|
200
|
+
onRetry: () => void Y()
|
|
201
|
+
}) : K.length > 0 ? /* @__PURE__ */ T("div", {
|
|
202
202
|
className: "space-y-4",
|
|
203
|
-
children:
|
|
203
|
+
children: K.map((e) => /* @__PURE__ */ T(a, { children: /* @__PURE__ */ T(o, {
|
|
204
204
|
className: "py-4",
|
|
205
205
|
children: /* @__PURE__ */ E("div", {
|
|
206
206
|
className: "flex items-center justify-between",
|
|
@@ -227,10 +227,10 @@ var R = ({ type: e, className: t }) => {
|
|
|
227
227
|
className: "flex items-center gap-2",
|
|
228
228
|
children: [/* @__PURE__ */ T("span", {
|
|
229
229
|
className: "text-xs text-text-secondary",
|
|
230
|
-
children:
|
|
230
|
+
children: g(e.createdAt)
|
|
231
231
|
}), /* @__PURE__ */ T(i, {
|
|
232
232
|
permission: r.CHANNEL_UPDATE,
|
|
233
|
-
children: /* @__PURE__ */ T(
|
|
233
|
+
children: /* @__PURE__ */ T(u, {
|
|
234
234
|
variant: "ghost",
|
|
235
235
|
size: "icon",
|
|
236
236
|
children: /* @__PURE__ */ T(F, { size: 16 })
|
|
@@ -245,7 +245,7 @@ var R = ({ type: e, className: t }) => {
|
|
|
245
245
|
description: A("botlit.channels.empty.routes.description", "Create routes to connect channel locations to specific bots."),
|
|
246
246
|
action: /* @__PURE__ */ T(i, {
|
|
247
247
|
permission: r.CHANNEL_CREATE,
|
|
248
|
-
children: /* @__PURE__ */ T(
|
|
248
|
+
children: /* @__PURE__ */ T(u, {
|
|
249
249
|
leftIcon: /* @__PURE__ */ T(N, { size: 16 }),
|
|
250
250
|
children: A("botlit.channels.actions.createRoute", "Create Route")
|
|
251
251
|
})
|
|
@@ -320,7 +320,6 @@ var R = ({ type: e, className: t }) => {
|
|
|
320
320
|
})
|
|
321
321
|
});
|
|
322
322
|
};
|
|
323
|
-
//#endregion
|
|
324
323
|
export { z as ChannelsPage };
|
|
325
324
|
|
|
326
325
|
//# sourceMappingURL=ChannelsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChannelsPage.js","names":[],"sources":["../../../src/botlit/pages/ChannelsPage.tsx"],"sourcesContent":["/**\n * Channels Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { Link } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n Plus,\n Search as SearchIcon,\n Filter,\n MessageSquare,\n Globe,\n Slack,\n Hash,\n Webhook,\n ArrowRight,\n Settings,\n} from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { PagePurpose, 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 } from '../components/Input';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport {\n useChannelConnectors,\n useChannelRoutes,\n routeMetadataString,\n type ChannelConnectorRecord,\n type ChannelRouteRecord,\n} from '../hooks';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport type { ChannelType } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nconst ChannelIcon: FC<{ type: string; className?: string }> = ({ type, className }) => {\n switch (type) {\n case 'SLACK':\n return <Slack className={className} />;\n case 'DISCORD':\n return <Hash className={className} />;\n case 'TEAMS':\n return <MessageSquare className={className} />;\n case 'WEB_WIDGET':\n return <Globe className={className} />;\n case 'WEBHOOK':\n return <Webhook className={className} />;\n default:\n return <MessageSquare className={className} />;\n }\n};\n\nexport const ChannelsPage: FC = () => {\n const t = useTr();\n const { getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const [activeTab, setActiveTab] = useState<'connectors' | 'routes'>('connectors');\n const connectorFilter = useMemo(() => ({ search }), [search]);\n const {\n data: connectors,\n loading: loadingConnectors,\n error: connectorsError,\n refetch: refetchConnectors,\n } = useChannelConnectors(connectorFilter);\n const {\n data: routes,\n loading: loadingRoutes,\n error: routesError,\n refetch: refetchRoutes,\n } = useChannelRoutes();\n\n // Routes are keyed by connector, so the per-connector count is derived here\n // rather than assuming a field the service does not return.\n const routeCountByConnector = useMemo(() => {\n const counts = new Map<string, number>();\n for (const route of routes) {\n counts.set(route.connectorId, (counts.get(route.connectorId) ?? 0) + 1);\n }\n return counts;\n }, [routes]);\n\n return (\n <PageLayout\n title={t('botlit.channels.title', 'Channels')}\n description={t(\n 'botlit.channels.description',\n 'Connect agents to messaging platforms and configure routing'\n )}\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\">\n <Link to={getPath('channels/routes')}>\n {t('botlit.channels.actions.viewRoutes', 'View Routes')}\n </Link>\n </Button>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button leftIcon={<Plus size={16} />}>\n <Link to={getPath('channels/new')}>\n {t('botlit.channels.actions.addChannel', 'Add Channel')}\n </Link>\n </Button>\n </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<MessageSquare size={18} />}>\n {t(\n 'botlit.channels.purpose',\n 'Channels are where your bots actually talk to people. Connect a messaging platform — a website chat widget, Slack, Microsoft Teams, Discord, WhatsApp or a custom webhook — then add a route that points an incoming location at the bot that should answer. Use this page to manage those connectors and routing rules in one place.'\n )}\n </PagePurpose>\n\n {/* Tabs */}\n <div className=\"flex gap-1 border-b border-border-subtle\">\n <button\n onClick={() => setActiveTab('connectors')}\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\n activeTab === 'connectors'\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n }`}\n >\n {t('botlit.channels.tabs.connectors', 'Connectors')} ({connectors.length})\n </button>\n <button\n onClick={() => setActiveTab('routes')}\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\n activeTab === 'routes'\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n }`}\n >\n {t('botlit.channels.tabs.routes', 'Routes')} ({routes.length})\n </button>\n </div>\n\n {/* Search */}\n <div className=\"flex items-center gap-4\">\n <div className=\"relative flex-1 max-w-md\">\n <SearchIcon className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder={t('botlit.channels.searchPlaceholder', 'Search {{tab}}...', {\n tab: activeTab,\n })}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <Button variant=\"outline\" leftIcon={<Filter size={16} />}>\n {t('botlit.channels.filters.filters', 'Filters')}\n </Button>\n </div>\n\n {/* Connectors Tab */}\n {activeTab === 'connectors' && (\n <>\n {loadingConnectors ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {[1, 2, 3].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 ) : connectorsError ? (\n <ErrorState\n resource=\"channel connectors\"\n error={connectorsError}\n onRetry={() => void refetchConnectors()}\n />\n ) : connectors.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {connectors.map((connector: ChannelConnectorRecord) => (\n <Link key={connector.id} to={getPath(`channels/${connector.id}`)}>\n <Card className=\"h-full hover:border-primary/50 transition-colors cursor-pointer\">\n <CardHeader>\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2 bg-action-primary-bg/10 rounded-lg\">\n <ChannelIcon type={connector.type} className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <CardTitle className=\"text-base\">{connector.name}</CardTitle>\n <CardDescription className=\"text-xs\">\n {connector.description}\n </CardDescription>\n </div>\n </div>\n <StatusBadge status={connector.status} />\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {/* Type */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">\n {t('botlit.channels.list.type', 'Type')}\n </span>\n <Badge variant=\"outline\" className=\"capitalize\">\n {connector.type.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n\n {/* Routes */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">\n {t('botlit.channels.list.activeRoutes', 'Active Routes')}\n </span>\n <Badge variant=\"secondary\">\n {routeCountByConnector.get(connector.id) ?? 0}\n </Badge>\n </div>\n\n {/* Footer */}\n <div className=\"pt-3 border-t border-border-subtle text-xs text-text-secondary\">\n {t('botlit.botsList.createdLabel', 'Created')}{' '}\n {formatRelativeTime(connector.createdAt)}\n </div>\n </div>\n </CardContent>\n </Card>\n </Link>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-notifications\"\n title={t('botlit.channels.empty.connectors.title', 'No channel connectors')}\n description={t(\n 'botlit.channels.empty.connectors.description',\n 'Connect messaging platforms to deploy agents across multiple channels.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button leftIcon={<Plus size={16} />}>\n <Link to={getPath('channels/new')}>\n {t('botlit.channels.actions.addChannel', 'Add Channel')}\n </Link>\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </>\n )}\n\n {/* Routes Tab */}\n {activeTab === 'routes' && (\n <>\n {loadingRoutes ? (\n <div className=\"space-y-4\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-20 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : routesError ? (\n <ErrorState\n resource=\"channel routes\"\n error={routesError}\n onRetry={() => void refetchRoutes()}\n />\n ) : routes.length > 0 ? (\n <div className=\"space-y-4\">\n {routes.map((route: ChannelRouteRecord) => (\n <Card key={route.id}>\n <CardContent className=\"py-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2 text-sm\">\n <Badge variant=\"outline\">\n {routeMetadataString(route, 'locationName') ?? route.locationId}\n </Badge>\n <ArrowRight size={16} className=\"text-text-secondary\" />\n <Badge variant=\"secondary\">\n {routeMetadataString(route, 'appName') ??\n route.appId ??\n MISSING_VALUE}\n </Badge>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary\">\n {formatRelativeTime(route.createdAt)}\n </span>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_UPDATE}>\n <Button variant=\"ghost\" size=\"icon\">\n <Settings size={16} />\n </Button>\n </BotmanorPermissionGate>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title={t('botlit.channels.empty.routes.title', 'No routes configured')}\n description={t(\n 'botlit.channels.empty.routes.description',\n 'Create routes to connect channel locations to specific bots.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button leftIcon={<Plus size={16} />}>\n {t('botlit.channels.actions.createRoute', 'Create Route')}\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </>\n )}\n\n {/* Available Integrations */}\n <GlassCard treatment=\"glass\" glow className=\"p-6\">\n <div className=\"mb-4\">\n <h2 className=\"text-lg font-semibold tracking-tight text-text-primary\">\n {t('botlit.channels.integrations.title', 'Available Integrations')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {t(\n 'botlit.channels.integrations.description',\n 'Connect to popular messaging platforms'\n )}\n </p>\n </div>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4\">\n {[\n {\n type: 'WEB_WIDGET' as ChannelType,\n name: t('botlit.channels.integrations.webWidget', 'Web Widget'),\n desc: t('botlit.channels.integrations.webWidgetDesc', 'Embed on websites'),\n },\n {\n type: 'SLACK' as ChannelType,\n name: t('botlit.channels.integrations.slack', 'Slack'),\n desc: t('botlit.channels.integrations.slackDesc', 'Workspace integration'),\n },\n {\n type: 'TEAMS' as ChannelType,\n name: t('botlit.channels.integrations.teams', 'MS Teams'),\n desc: t('botlit.channels.integrations.teamsDesc', 'Teams app'),\n },\n {\n type: 'DISCORD' as ChannelType,\n name: t('botlit.channels.integrations.discord', 'Discord'),\n desc: t('botlit.channels.integrations.discordDesc', 'Bot integration'),\n },\n {\n type: 'WHATSAPP' as ChannelType,\n name: t('botlit.channels.integrations.whatsapp', 'WhatsApp'),\n desc: t('botlit.channels.integrations.whatsappDesc', 'Business API'),\n },\n {\n type: 'WEBHOOK' as ChannelType,\n name: t('botlit.channels.integrations.webhook', 'Webhook'),\n desc: t('botlit.channels.integrations.webhookDesc', 'Custom integration'),\n },\n ].map((integration) => (\n <button\n key={integration.type}\n className=\"p-4 text-center border border-border-subtle rounded-lg hover:bg-accent transition-colors\"\n >\n <ChannelIcon\n type={integration.type}\n className=\"h-8 w-8 mx-auto text-text-secondary\"\n />\n <p className=\"mt-2 font-medium text-sm\">{integration.name}</p>\n <p className=\"text-xs text-text-secondary\">{integration.desc}</p>\n </button>\n ))}\n </div>\n </GlassCard>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChannelsPage.js","names":["SearchIcon","_Fragment","ChannelIcon","type","Slack","Hash","MessageSquare","Globe","Webhook","ChannelsPage","t","useTr","useBotlit","search","setSearch","useState","activeTab","setActiveTab","connectorFilter","useMemo","connectors","loadingConnectors","connectorsError","refetchConnectors","useChannelConnectors","routes","loadingRoutes","routesError","refetchRoutes","useChannelRoutes","routeCountByConnector","counts","route","PageLayout","Button","Link","getPath","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Plus","PagePurpose","Search","Input","Filter","Fragment","i","ErrorState","connector","Card","CardHeader","CardTitle","CardDescription","StatusBadge","CardContent","Badge","formatRelativeTime","EmptyState","routeMetadataString","ArrowRight","Settings","GlassCard","integration"],"sources":["../../../src/botlit/pages/ChannelsPage.tsx"],"sourcesContent":["/**\n * Channels Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { Link } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n Plus,\n Search as SearchIcon,\n Filter,\n MessageSquare,\n Globe,\n Slack,\n Hash,\n Webhook,\n ArrowRight,\n Settings,\n} from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { PagePurpose, 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 } from '../components/Input';\nimport { Badge, StatusBadge } from '../components/Badge';\nimport { EmptyState } from '../components/EmptyState';\nimport { ErrorState } from '../components/ErrorState';\nimport {\n useChannelConnectors,\n useChannelRoutes,\n routeMetadataString,\n type ChannelConnectorRecord,\n type ChannelRouteRecord,\n} from '../hooks';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport type { ChannelType } from '../types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nconst ChannelIcon: FC<{ type: string; className?: string }> = ({ type, className }) => {\n switch (type) {\n case 'SLACK':\n return <Slack className={className} />;\n case 'DISCORD':\n return <Hash className={className} />;\n case 'TEAMS':\n return <MessageSquare className={className} />;\n case 'WEB_WIDGET':\n return <Globe className={className} />;\n case 'WEBHOOK':\n return <Webhook className={className} />;\n default:\n return <MessageSquare className={className} />;\n }\n};\n\nexport const ChannelsPage: FC = () => {\n const t = useTr();\n const { getPath } = useBotlit();\n const [search, setSearch] = useState('');\n const [activeTab, setActiveTab] = useState<'connectors' | 'routes'>('connectors');\n const connectorFilter = useMemo(() => ({ search }), [search]);\n const {\n data: connectors,\n loading: loadingConnectors,\n error: connectorsError,\n refetch: refetchConnectors,\n } = useChannelConnectors(connectorFilter);\n const {\n data: routes,\n loading: loadingRoutes,\n error: routesError,\n refetch: refetchRoutes,\n } = useChannelRoutes();\n\n // Routes are keyed by connector, so the per-connector count is derived here\n // rather than assuming a field the service does not return.\n const routeCountByConnector = useMemo(() => {\n const counts = new Map<string, number>();\n for (const route of routes) {\n counts.set(route.connectorId, (counts.get(route.connectorId) ?? 0) + 1);\n }\n return counts;\n }, [routes]);\n\n return (\n <PageLayout\n title={t('botlit.channels.title', 'Channels')}\n description={t(\n 'botlit.channels.description',\n 'Connect agents to messaging platforms and configure routing'\n )}\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\">\n <Link to={getPath('channels/routes')}>\n {t('botlit.channels.actions.viewRoutes', 'View Routes')}\n </Link>\n </Button>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button leftIcon={<Plus size={16} />}>\n <Link to={getPath('channels/new')}>\n {t('botlit.channels.actions.addChannel', 'Add Channel')}\n </Link>\n </Button>\n </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<MessageSquare size={18} />}>\n {t(\n 'botlit.channels.purpose',\n 'Channels are where your bots actually talk to people. Connect a messaging platform — a website chat widget, Slack, Microsoft Teams, Discord, WhatsApp or a custom webhook — then add a route that points an incoming location at the bot that should answer. Use this page to manage those connectors and routing rules in one place.'\n )}\n </PagePurpose>\n\n {/* Tabs */}\n <div className=\"flex gap-1 border-b border-border-subtle\">\n <button\n onClick={() => setActiveTab('connectors')}\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\n activeTab === 'connectors'\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n }`}\n >\n {t('botlit.channels.tabs.connectors', 'Connectors')} ({connectors.length})\n </button>\n <button\n onClick={() => setActiveTab('routes')}\n className={`px-4 py-2 text-sm font-medium border-b-2 transition-colors ${\n activeTab === 'routes'\n ? 'border-primary text-primary'\n : 'border-transparent text-text-secondary hover:text-text-primary'\n }`}\n >\n {t('botlit.channels.tabs.routes', 'Routes')} ({routes.length})\n </button>\n </div>\n\n {/* Search */}\n <div className=\"flex items-center gap-4\">\n <div className=\"relative flex-1 max-w-md\">\n <SearchIcon className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder={t('botlit.channels.searchPlaceholder', 'Search {{tab}}...', {\n tab: activeTab,\n })}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <Button variant=\"outline\" leftIcon={<Filter size={16} />}>\n {t('botlit.channels.filters.filters', 'Filters')}\n </Button>\n </div>\n\n {/* Connectors Tab */}\n {activeTab === 'connectors' && (\n <>\n {loadingConnectors ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {[1, 2, 3].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 ) : connectorsError ? (\n <ErrorState\n resource=\"channel connectors\"\n error={connectorsError}\n onRetry={() => void refetchConnectors()}\n />\n ) : connectors.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {connectors.map((connector: ChannelConnectorRecord) => (\n <Link key={connector.id} to={getPath(`channels/${connector.id}`)}>\n <Card className=\"h-full hover:border-primary/50 transition-colors cursor-pointer\">\n <CardHeader>\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"p-2 bg-action-primary-bg/10 rounded-lg\">\n <ChannelIcon type={connector.type} className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <CardTitle className=\"text-base\">{connector.name}</CardTitle>\n <CardDescription className=\"text-xs\">\n {connector.description}\n </CardDescription>\n </div>\n </div>\n <StatusBadge status={connector.status} />\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {/* Type */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">\n {t('botlit.channels.list.type', 'Type')}\n </span>\n <Badge variant=\"outline\" className=\"capitalize\">\n {connector.type.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n\n {/* Routes */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-text-secondary\">\n {t('botlit.channels.list.activeRoutes', 'Active Routes')}\n </span>\n <Badge variant=\"secondary\">\n {routeCountByConnector.get(connector.id) ?? 0}\n </Badge>\n </div>\n\n {/* Footer */}\n <div className=\"pt-3 border-t border-border-subtle text-xs text-text-secondary\">\n {t('botlit.botsList.createdLabel', 'Created')}{' '}\n {formatRelativeTime(connector.createdAt)}\n </div>\n </div>\n </CardContent>\n </Card>\n </Link>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-notifications\"\n title={t('botlit.channels.empty.connectors.title', 'No channel connectors')}\n description={t(\n 'botlit.channels.empty.connectors.description',\n 'Connect messaging platforms to deploy agents across multiple channels.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button leftIcon={<Plus size={16} />}>\n <Link to={getPath('channels/new')}>\n {t('botlit.channels.actions.addChannel', 'Add Channel')}\n </Link>\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </>\n )}\n\n {/* Routes Tab */}\n {activeTab === 'routes' && (\n <>\n {loadingRoutes ? (\n <div className=\"space-y-4\">\n {[1, 2, 3].map((i) => (\n <div\n key={i}\n className=\"h-20 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\"\n />\n ))}\n </div>\n ) : routesError ? (\n <ErrorState\n resource=\"channel routes\"\n error={routesError}\n onRetry={() => void refetchRoutes()}\n />\n ) : routes.length > 0 ? (\n <div className=\"space-y-4\">\n {routes.map((route: ChannelRouteRecord) => (\n <Card key={route.id}>\n <CardContent className=\"py-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2 text-sm\">\n <Badge variant=\"outline\">\n {routeMetadataString(route, 'locationName') ?? route.locationId}\n </Badge>\n <ArrowRight size={16} className=\"text-text-secondary\" />\n <Badge variant=\"secondary\">\n {routeMetadataString(route, 'appName') ??\n route.appId ??\n MISSING_VALUE}\n </Badge>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-text-secondary\">\n {formatRelativeTime(route.createdAt)}\n </span>\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_UPDATE}>\n <Button variant=\"ghost\" size=\"icon\">\n <Settings size={16} />\n </Button>\n </BotmanorPermissionGate>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-search\"\n title={t('botlit.channels.empty.routes.title', 'No routes configured')}\n description={t(\n 'botlit.channels.empty.routes.description',\n 'Create routes to connect channel locations to specific bots.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.CHANNEL_CREATE}>\n <Button leftIcon={<Plus size={16} />}>\n {t('botlit.channels.actions.createRoute', 'Create Route')}\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </>\n )}\n\n {/* Available Integrations */}\n <GlassCard treatment=\"glass\" glow className=\"p-6\">\n <div className=\"mb-4\">\n <h2 className=\"text-lg font-semibold tracking-tight text-text-primary\">\n {t('botlit.channels.integrations.title', 'Available Integrations')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {t(\n 'botlit.channels.integrations.description',\n 'Connect to popular messaging platforms'\n )}\n </p>\n </div>\n <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4\">\n {[\n {\n type: 'WEB_WIDGET' as ChannelType,\n name: t('botlit.channels.integrations.webWidget', 'Web Widget'),\n desc: t('botlit.channels.integrations.webWidgetDesc', 'Embed on websites'),\n },\n {\n type: 'SLACK' as ChannelType,\n name: t('botlit.channels.integrations.slack', 'Slack'),\n desc: t('botlit.channels.integrations.slackDesc', 'Workspace integration'),\n },\n {\n type: 'TEAMS' as ChannelType,\n name: t('botlit.channels.integrations.teams', 'MS Teams'),\n desc: t('botlit.channels.integrations.teamsDesc', 'Teams app'),\n },\n {\n type: 'DISCORD' as ChannelType,\n name: t('botlit.channels.integrations.discord', 'Discord'),\n desc: t('botlit.channels.integrations.discordDesc', 'Bot integration'),\n },\n {\n type: 'WHATSAPP' as ChannelType,\n name: t('botlit.channels.integrations.whatsapp', 'WhatsApp'),\n desc: t('botlit.channels.integrations.whatsappDesc', 'Business API'),\n },\n {\n type: 'WEBHOOK' as ChannelType,\n name: t('botlit.channels.integrations.webhook', 'Webhook'),\n desc: t('botlit.channels.integrations.webhookDesc', 'Custom integration'),\n },\n ].map((integration) => (\n <button\n key={integration.type}\n className=\"p-4 text-center border border-border-subtle rounded-lg hover:bg-accent transition-colors\"\n >\n <ChannelIcon\n type={integration.type}\n className=\"h-8 w-8 mx-auto text-text-secondary\"\n />\n <p className=\"mt-2 font-medium text-sm\">{integration.name}</p>\n <p className=\"text-xs text-text-secondary\">{integration.desc}</p>\n </button>\n ))}\n </div>\n </GlassCard>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ChatPage(): import('react').JSX.Element;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { PageLayout as e } from "../components/PageLayout.js";
|
|
2
|
+
import { Button as t } from "../components/Button.js";
|
|
3
|
+
import { useAgents as n } from "../hooks/useAgents.js";
|
|
4
|
+
import { useBotlit as r } from "../providers/BotlitProvider.js";
|
|
5
5
|
import { useState as i } from "react";
|
|
6
6
|
import { Fragment as a, jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
7
7
|
import { useParams as c } from "react-router";
|
|
8
8
|
import { WorkflowAssistantPanel as l } from "@burdenoff/fe-libs/shared/assistant";
|
|
9
|
-
|
|
9
|
+
// src/botlit/pages/ChatPage.tsx
|
|
10
10
|
function u() {
|
|
11
|
-
let { workspaceId:
|
|
12
|
-
return /* @__PURE__ */ o(d, {}, `${
|
|
11
|
+
let { workspaceId: e, currentUser: t } = r();
|
|
12
|
+
return /* @__PURE__ */ o(d, {}, `${e}:${t?.id}`);
|
|
13
13
|
}
|
|
14
14
|
function d() {
|
|
15
|
-
let { agentId: u } = c(), { currentUser: d, workspaceId: f, authToken: p } =
|
|
16
|
-
return /* @__PURE__ */ o(
|
|
15
|
+
let { agentId: u } = c(), { currentUser: d, workspaceId: f, authToken: p } = r(), m = n(), [h, g] = i(""), _ = u ?? h, v = m.data?.find((e) => e.id === _ && e.status === "ACTIVE");
|
|
16
|
+
return /* @__PURE__ */ o(e, {
|
|
17
17
|
title: v ? `Chat with ${v.name}` : "AI Chat",
|
|
18
18
|
description: "Ask questions grounded in your assistant’s knowledge. Your conversation is saved securely.",
|
|
19
19
|
children: /* @__PURE__ */ o("div", {
|
|
@@ -23,7 +23,7 @@ function d() {
|
|
|
23
23
|
children: "Loading assistants…"
|
|
24
24
|
}) : m.error ? /* @__PURE__ */ s("div", {
|
|
25
25
|
role: "alert",
|
|
26
|
-
children: [/* @__PURE__ */ o("p", { children: "Assistants could not be loaded. Check your access and try again." }), /* @__PURE__ */ o(
|
|
26
|
+
children: [/* @__PURE__ */ o("p", { children: "Assistants could not be loaded. Check your access and try again." }), /* @__PURE__ */ o(t, {
|
|
27
27
|
variant: "outline",
|
|
28
28
|
onClick: () => void m.refetch(),
|
|
29
29
|
children: "Reload assistants"
|
|
@@ -58,7 +58,6 @@ function d() {
|
|
|
58
58
|
})
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
|
-
//#endregion
|
|
62
61
|
export { u as ChatPage };
|
|
63
62
|
|
|
64
63
|
//# sourceMappingURL=ChatPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPage.js","names":[],"sources":["../../../src/botlit/pages/ChatPage.tsx"],"sourcesContent":["/** Authenticated Botmanor agent chat with canonical, owner-scoped workflow history. */\nimport { useState } from 'react';\nimport { useParams } from 'react-router';\nimport { WorkflowAssistantPanel } from '@burdenoff/fe-libs/shared/assistant';\nimport { PageLayout } from '../components/PageLayout';\nimport { Button } from '../components/Button';\nimport { useAgents } from '../hooks/useAgents';\nimport { useBotlit } from '../providers/BotlitProvider';\n\nexport function ChatPage() {\n const { workspaceId, currentUser } = useBotlit();\n return <ScopedChatPage key={`${workspaceId}:${currentUser?.id}`} />;\n}\n\nfunction ScopedChatPage() {\n const { agentId } = useParams();\n const { currentUser, workspaceId, authToken } = useBotlit();\n const agents = useAgents();\n const [chosen, setChosen] = useState('');\n const selectedId = agentId ?? chosen;\n const selected = agents.data?.find(\n (agent) => agent.id === selectedId && agent.status === 'ACTIVE'\n );\n return (\n <PageLayout\n title={selected ? `Chat with ${selected.name}` : 'AI Chat'}\n description=\"Ask questions grounded in your assistant’s knowledge. Your conversation is saved securely.\"\n >\n <div className=\"mx-auto flex w-full max-w-4xl flex-col gap-4 p-4\">\n {!currentUser?.id || !workspaceId ? (\n <p>Sign in and choose a workspace to use an assistant.</p>\n ) : agents.loading ? (\n <p role=\"status\">Loading assistants…</p>\n ) : agents.error ? (\n <div role=\"alert\">\n <p>Assistants could not be loaded. Check your access and try again.</p>\n <Button variant=\"outline\" onClick={() => void agents.refetch()}>\n Reload assistants\n </Button>\n </div>\n ) : (\n <>\n {!agentId && (\n <label className=\"grid gap-2 text-sm font-medium\">\n Assistant\n <select\n className=\"h-10 rounded-md border border-border-default bg-bg-surface px-3\"\n value={chosen}\n onChange={(event) => setChosen(event.target.value)}\n >\n <option value=\"\">Choose an assistant</option>\n {agents.data\n ?.filter((agent) => agent.status === 'ACTIVE')\n .map((agent) => (\n <option key={agent.id} value={agent.id}>\n {agent.name}\n </option>\n ))}\n </select>\n </label>\n )}\n {selected ? (\n <WorkflowAssistantPanel\n target={{ kind: 'botmanor', agentId: selected.id }}\n context={{ workspaceId, authContext: { accessToken: authToken } }}\n ownerId={currentUser.id}\n title={selected.name}\n description=\"Answers from this assistant’s configured knowledge.\"\n />\n ) : (\n <p>\n {selectedId\n ? 'This assistant is unavailable. Choose an active assistant you can access.'\n : 'Choose an assistant to begin.'}\n </p>\n )}\n </>\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AASA,
|
|
1
|
+
{"version":3,"file":"ChatPage.js","names":["_Fragment","ChatPage","useBotlit","ScopedChatPage","workspaceId","currentUser","useParams","agents","useAgents","chosen","setChosen","useState","selectedId","agentId","selected","agent","PageLayout","Button","Fragment","event","WorkflowAssistantPanel","authToken"],"sources":["../../../src/botlit/pages/ChatPage.tsx"],"sourcesContent":["/** Authenticated Botmanor agent chat with canonical, owner-scoped workflow history. */\nimport { useState } from 'react';\nimport { useParams } from 'react-router';\nimport { WorkflowAssistantPanel } from '@burdenoff/fe-libs/shared/assistant';\nimport { PageLayout } from '../components/PageLayout';\nimport { Button } from '../components/Button';\nimport { useAgents } from '../hooks/useAgents';\nimport { useBotlit } from '../providers/BotlitProvider';\n\nexport function ChatPage() {\n const { workspaceId, currentUser } = useBotlit();\n return <ScopedChatPage key={`${workspaceId}:${currentUser?.id}`} />;\n}\n\nfunction ScopedChatPage() {\n const { agentId } = useParams();\n const { currentUser, workspaceId, authToken } = useBotlit();\n const agents = useAgents();\n const [chosen, setChosen] = useState('');\n const selectedId = agentId ?? chosen;\n const selected = agents.data?.find(\n (agent) => agent.id === selectedId && agent.status === 'ACTIVE'\n );\n return (\n <PageLayout\n title={selected ? `Chat with ${selected.name}` : 'AI Chat'}\n description=\"Ask questions grounded in your assistant’s knowledge. Your conversation is saved securely.\"\n >\n <div className=\"mx-auto flex w-full max-w-4xl flex-col gap-4 p-4\">\n {!currentUser?.id || !workspaceId ? (\n <p>Sign in and choose a workspace to use an assistant.</p>\n ) : agents.loading ? (\n <p role=\"status\">Loading assistants…</p>\n ) : agents.error ? (\n <div role=\"alert\">\n <p>Assistants could not be loaded. Check your access and try again.</p>\n <Button variant=\"outline\" onClick={() => void agents.refetch()}>\n Reload assistants\n </Button>\n </div>\n ) : (\n <>\n {!agentId && (\n <label className=\"grid gap-2 text-sm font-medium\">\n Assistant\n <select\n className=\"h-10 rounded-md border border-border-default bg-bg-surface px-3\"\n value={chosen}\n onChange={(event) => setChosen(event.target.value)}\n >\n <option value=\"\">Choose an assistant</option>\n {agents.data\n ?.filter((agent) => agent.status === 'ACTIVE')\n .map((agent) => (\n <option key={agent.id} value={agent.id}>\n {agent.name}\n </option>\n ))}\n </select>\n </label>\n )}\n {selected ? (\n <WorkflowAssistantPanel\n target={{ kind: 'botmanor', agentId: selected.id }}\n context={{ workspaceId, authContext: { accessToken: authToken } }}\n ownerId={currentUser.id}\n title={selected.name}\n description=\"Answers from this assistant’s configured knowledge.\"\n />\n ) : (\n <p>\n {selectedId\n ? 'This assistant is unavailable. Choose an active assistant you can access.'\n : 'Choose an assistant to begin.'}\n </p>\n )}\n </>\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;AASA,SAAgBC,IAAW;CACzB,IAAM,EAAE,gBAAa,mBAAgBC,EAAU;CAC/C,OAAO,kBAACC,GAAD,CAA2D,GAAtC,GAAGC,EAAY,GAAGC,GAAa,IAAO;AACpE;AAEA,SAASF,IAAiB;CACxB,IAAM,EAAE,eAAYG,EAAU,GACxB,EAAE,gBAAa,gBAAa,iBAAcJ,EAAU,GACpDK,IAASC,EAAU,GACnB,CAACC,GAAQC,KAAaC,EAAS,EAAE,GACjCC,IAAaC,KAAWJ,GACxBK,IAAWP,EAAO,MAAM,MAC3B,MAAUQ,EAAM,OAAOH,KAAcG,EAAM,WAAW,QACzD;CACA,OACE,kBAACC,GAAD;EACE,OAAOF,IAAW,aAAaA,EAAS,SAAS;EACjD,aAAY;EAEZ,UAAA,kBAAC,OAAD;GAAK,WAAU;GACZ,UAAA,CAACT,GAAa,MAAM,CAACD,IACpB,kBAAC,KAAD,EAAA,UAAG,sDAAsD,CAAA,IACvDG,EAAO,UACT,kBAAC,KAAD;IAAG,MAAK;IAAS,UAAA;GAAsB,CAAA,IACrCA,EAAO,QACT,kBAAC,OAAD;IAAK,MAAK;IAAV,UAAA,CACE,kBAAC,KAAD,EAAA,UAAG,mEAAmE,CAAA,GACtE,kBAACU,GAAD;KAAQ,SAAQ;KAAU,eAAe,KAAKV,EAAO,QAAQ;KAAG,UAAA;IAExD,CAAA,CACL;GAEL,CAAA,IAAA,kBAAAP,GAAA,EAAA,UAAA,CACG,CAACa,KACA,kBAAC,SAAD;IAAO,WAAU;IAAjB,UAAA,CAAkD,aAEhD,kBAAC,UAAD;KACE,WAAU;KACV,OAAOJ;KACP,WAAW,MAAUC,EAAUS,EAAM,OAAO,KAAK;KAHnD,UAAA,CAKE,kBAAC,UAAD;MAAQ,OAAM;MAAG,UAAA;KAA2B,CAAA,GAC3CZ,EAAO,MACJ,QAAQ,MAAUQ,EAAM,WAAW,QAAQ,CAAC,CAC7C,KAAK,MACJ,kBAAC,UAAD;MAAuB,OAAOA,EAAM;MACjC,UAAAA,EAAM;KACD,GAFKA,EAAM,EAEX,CACT,CACG;IACH,CAAA,CAAA;GAER,CAAA,GAAAD,IACC,kBAACM,GAAD;IACE,QAAQ;KAAE,MAAM;KAAY,SAASN,EAAS;IAAG;IACjD,SAAS;KAAE;KAAa,aAAa,EAAE,aAAaO,EAAU;IAAE;IAChE,SAAShB,EAAY;IACrB,OAAOS,EAAS;IAChB,aAAY;GACb,CAAA,IAED,kBAAC,KAAD,EAAA,UACGF,IACG,8EACA,gCACH,CAAA,CAEL,EAAA,CAAA;EAED,CAAA;CACK,CAAA;AAEhB"}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import { useTr as e } from "../../shared/hooks/useTr.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { BOTMANOR_PERMISSIONS as
|
|
7
|
-
import { BotmanorPermissionGate as
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
2
|
+
import { PageLayout as t } from "../components/PageLayout.js";
|
|
3
|
+
import { Card as n, CardContent as r, CardHeader as i, CardTitle as a } from "../components/Card.js";
|
|
4
|
+
import { Button as o } from "../components/Button.js";
|
|
5
|
+
import { StatusBadge as s } from "../components/Badge.js";
|
|
6
|
+
import { BOTMANOR_PERMISSIONS as c } from "../permissions/botmanorPermissions.js";
|
|
7
|
+
import { BotmanorPermissionGate as l } from "../permissions/useBotmanorPermissions.js";
|
|
8
|
+
import { useBots as u } from "../hooks/useBots.js";
|
|
9
|
+
import { useAgents as d } from "../hooks/useAgents.js";
|
|
10
|
+
import { useBotlit as f } from "../providers/BotlitProvider.js";
|
|
11
|
+
import { formatNumber as p } from "../utils/formatters.js";
|
|
10
12
|
import "../permissions/index.js";
|
|
11
|
-
import { Card as l, CardContent as u, CardHeader as d, CardTitle as f } from "../components/Card.js";
|
|
12
|
-
import { StatusBadge as p } from "../components/Badge.js";
|
|
13
13
|
import { GlassCard as m, GradientText as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
|
|
14
14
|
import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
15
15
|
import { Link as b } from "react-router";
|
|
16
16
|
import { AppWindow as x, ArrowRight as S, BookOpen as C, Bot as w, Plus as T, Zap as E } from "lucide-react";
|
|
17
|
-
|
|
17
|
+
// src/botlit/pages/DashboardPage.tsx
|
|
18
18
|
var D = () => {
|
|
19
|
-
let D = e(), { currentUser: O, navigateTo: k, getPath: A } =
|
|
19
|
+
let D = e(), { currentUser: O, navigateTo: k, getPath: A } = f(), { data: j, loading: M } = u(), { data: N, loading: P } = d(), F = [{
|
|
20
20
|
label: D("botlit.dashboard.stats.totalBots", "Total Bots"),
|
|
21
21
|
value: j?.length || 0,
|
|
22
22
|
icon: /* @__PURE__ */ v(x, { className: "h-5 w-5" }),
|
|
@@ -27,23 +27,23 @@ var D = () => {
|
|
|
27
27
|
icon: /* @__PURE__ */ v(w, { className: "h-5 w-5" }),
|
|
28
28
|
hero: !1
|
|
29
29
|
}], I = O?.name ? O.name.split(" ")[0] : "";
|
|
30
|
-
return /* @__PURE__ */ v(
|
|
30
|
+
return /* @__PURE__ */ v(t, {
|
|
31
31
|
hero: !0,
|
|
32
32
|
title: /* @__PURE__ */ y(_, { children: [D("botlit.dashboard.title", "Welcome back"), I ? /* @__PURE__ */ y(_, { children: [", ", /* @__PURE__ */ v(h, { children: I })] }) : null] }),
|
|
33
33
|
description: D("botlit.dashboard.description", "Here's an overview of your AI agents and bots"),
|
|
34
34
|
actions: /* @__PURE__ */ y("div", {
|
|
35
35
|
className: "flex gap-2",
|
|
36
|
-
children: [/* @__PURE__ */ v(
|
|
37
|
-
permission:
|
|
38
|
-
children: /* @__PURE__ */ v(
|
|
36
|
+
children: [/* @__PURE__ */ v(l, {
|
|
37
|
+
permission: c.APP_CREATE,
|
|
38
|
+
children: /* @__PURE__ */ v(o, {
|
|
39
39
|
variant: "outline",
|
|
40
40
|
leftIcon: /* @__PURE__ */ v(T, { size: 16 }),
|
|
41
41
|
onClick: () => k("bots/new"),
|
|
42
42
|
children: D("botlit.dashboard.actions.newBot", "New Bot")
|
|
43
43
|
})
|
|
44
|
-
}), /* @__PURE__ */ v(
|
|
45
|
-
permission:
|
|
46
|
-
children: /* @__PURE__ */ v(
|
|
44
|
+
}), /* @__PURE__ */ v(l, {
|
|
45
|
+
permission: c.AGENT_CREATE,
|
|
46
|
+
children: /* @__PURE__ */ v(o, {
|
|
47
47
|
leftIcon: /* @__PURE__ */ v(w, { size: 16 }),
|
|
48
48
|
onClick: () => k("agents/new"),
|
|
49
49
|
children: D("botlit.dashboard.actions.createAgent", "Create Agent")
|
|
@@ -59,10 +59,10 @@ var D = () => {
|
|
|
59
59
|
}),
|
|
60
60
|
/* @__PURE__ */ v("div", {
|
|
61
61
|
className: "grid grid-cols-1 md:grid-cols-2 gap-4",
|
|
62
|
-
children: F.map((e) => /* @__PURE__ */ v(
|
|
62
|
+
children: F.map((e) => /* @__PURE__ */ v(n, {
|
|
63
63
|
treatment: e.hero ? "glass" : "metric",
|
|
64
64
|
glow: e.hero,
|
|
65
|
-
children: /* @__PURE__ */ v(
|
|
65
|
+
children: /* @__PURE__ */ v(r, {
|
|
66
66
|
className: "pt-6",
|
|
67
67
|
children: /* @__PURE__ */ y("div", {
|
|
68
68
|
className: "flex items-center gap-4",
|
|
@@ -82,18 +82,18 @@ var D = () => {
|
|
|
82
82
|
}),
|
|
83
83
|
/* @__PURE__ */ y("div", {
|
|
84
84
|
className: "grid grid-cols-1 lg:grid-cols-2 gap-6",
|
|
85
|
-
children: [/* @__PURE__ */ y(
|
|
85
|
+
children: [/* @__PURE__ */ y(n, {
|
|
86
86
|
treatment: "insight",
|
|
87
|
-
children: [/* @__PURE__ */ y(
|
|
87
|
+
children: [/* @__PURE__ */ y(i, {
|
|
88
88
|
className: "flex flex-row items-center justify-between",
|
|
89
|
-
children: [/* @__PURE__ */ v(
|
|
89
|
+
children: [/* @__PURE__ */ v(a, { children: D("botlit.dashboard.recentBots.title", "Recent Bots") }), /* @__PURE__ */ v(o, {
|
|
90
90
|
variant: "ghost",
|
|
91
91
|
size: "sm",
|
|
92
92
|
rightIcon: /* @__PURE__ */ v(S, { size: 16 }),
|
|
93
93
|
onClick: () => k("bots"),
|
|
94
94
|
children: D("botlit.common.viewAll", "View All")
|
|
95
95
|
})]
|
|
96
|
-
}), /* @__PURE__ */ v(
|
|
96
|
+
}), /* @__PURE__ */ v(r, { children: M ? /* @__PURE__ */ v("div", {
|
|
97
97
|
className: "space-y-3",
|
|
98
98
|
children: [
|
|
99
99
|
1,
|
|
@@ -121,16 +121,16 @@ var D = () => {
|
|
|
121
121
|
D("botlit.common.executions", "executions")
|
|
122
122
|
]
|
|
123
123
|
})] })]
|
|
124
|
-
}), /* @__PURE__ */ v(
|
|
124
|
+
}), /* @__PURE__ */ v(s, { status: e.status })]
|
|
125
125
|
}, e.id))
|
|
126
126
|
}) : /* @__PURE__ */ y("div", {
|
|
127
127
|
className: "text-center py-8 text-text-secondary",
|
|
128
128
|
children: [
|
|
129
129
|
/* @__PURE__ */ v(x, { className: "h-8 w-8 mx-auto mb-2 opacity-50" }),
|
|
130
130
|
/* @__PURE__ */ v("p", { children: D("botlit.dashboard.recentBots.emptyTitle", "No bots yet") }),
|
|
131
|
-
/* @__PURE__ */ v(
|
|
132
|
-
permission:
|
|
133
|
-
children: /* @__PURE__ */ v(
|
|
131
|
+
/* @__PURE__ */ v(l, {
|
|
132
|
+
permission: c.APP_CREATE,
|
|
133
|
+
children: /* @__PURE__ */ v(o, {
|
|
134
134
|
variant: "outline",
|
|
135
135
|
size: "sm",
|
|
136
136
|
className: "mt-3",
|
|
@@ -140,18 +140,18 @@ var D = () => {
|
|
|
140
140
|
})
|
|
141
141
|
]
|
|
142
142
|
}) })]
|
|
143
|
-
}), /* @__PURE__ */ y(
|
|
143
|
+
}), /* @__PURE__ */ y(n, {
|
|
144
144
|
treatment: "insight",
|
|
145
|
-
children: [/* @__PURE__ */ y(
|
|
145
|
+
children: [/* @__PURE__ */ y(i, {
|
|
146
146
|
className: "flex flex-row items-center justify-between",
|
|
147
|
-
children: [/* @__PURE__ */ v(
|
|
147
|
+
children: [/* @__PURE__ */ v(a, { children: D("botlit.dashboard.activeAgents.title", "Active Agents") }), /* @__PURE__ */ v(o, {
|
|
148
148
|
variant: "ghost",
|
|
149
149
|
size: "sm",
|
|
150
150
|
rightIcon: /* @__PURE__ */ v(S, { size: 16 }),
|
|
151
151
|
onClick: () => k("agents"),
|
|
152
152
|
children: D("botlit.common.viewAll", "View All")
|
|
153
153
|
})]
|
|
154
|
-
}), /* @__PURE__ */ v(
|
|
154
|
+
}), /* @__PURE__ */ v(r, { children: P ? /* @__PURE__ */ v("div", {
|
|
155
155
|
className: "space-y-3",
|
|
156
156
|
children: [
|
|
157
157
|
1,
|
|
@@ -174,7 +174,7 @@ var D = () => {
|
|
|
174
174
|
}), /* @__PURE__ */ y("p", {
|
|
175
175
|
className: "text-xs text-text-secondary",
|
|
176
176
|
children: [
|
|
177
|
-
|
|
177
|
+
p(e.executionCount ?? 0),
|
|
178
178
|
" ",
|
|
179
179
|
D("botlit.common.executions", "executions")
|
|
180
180
|
]
|
|
@@ -186,9 +186,9 @@ var D = () => {
|
|
|
186
186
|
children: [
|
|
187
187
|
/* @__PURE__ */ v(w, { className: "h-8 w-8 mx-auto mb-2 opacity-50" }),
|
|
188
188
|
/* @__PURE__ */ v("p", { children: D("botlit.dashboard.activeAgents.emptyTitle", "No active agents") }),
|
|
189
|
-
/* @__PURE__ */ v(
|
|
190
|
-
permission:
|
|
191
|
-
children: /* @__PURE__ */ v(
|
|
189
|
+
/* @__PURE__ */ v(l, {
|
|
190
|
+
permission: c.AGENT_CREATE,
|
|
191
|
+
children: /* @__PURE__ */ v(o, {
|
|
192
192
|
variant: "outline",
|
|
193
193
|
size: "sm",
|
|
194
194
|
className: "mt-3",
|
|
@@ -248,7 +248,6 @@ var D = () => {
|
|
|
248
248
|
})
|
|
249
249
|
});
|
|
250
250
|
};
|
|
251
|
-
//#endregion
|
|
252
251
|
export { D as DashboardPage };
|
|
253
252
|
|
|
254
253
|
//# sourceMappingURL=DashboardPage.js.map
|