@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KnowledgeBaseDetailPage.js","names":[],"sources":["../../../src/botlit/pages/KnowledgeBaseDetailPage.tsx"],"sourcesContent":["/**\n * Knowledge Base Detail Page\n * @module botlit/pages\n *\n * A `KnowledgeBase` on wspace-botlit-svc is an embedding index owned by the\n * platform: `indexStatus`, `embeddingModel`/`embeddingDimensions`, the chunking\n * configuration and the document/chunk/vector counters. It carries no vector\n * store connection, no ingestion-flow references and no visibility column, so\n * this page renders only what the type actually exposes.\n */\n\nimport type { FC } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n ArrowLeft,\n Database,\n Settings,\n Save,\n FileText,\n Layers,\n RefreshCw,\n Boxes,\n} from 'lucide-react';\nimport { useLLMModels, useLLMProviders } from '../hooks/useLLMProviders';\nimport { configuredEmbeddingModels } from '../utils/embedding-models';\nimport { KnowledgeSourceImportPanel } from '../components/KnowledgeSourceImportPanel';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../components/EmptyState';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport { StatusBadge } from '../components/Badge';\nimport {\n useKnowledgeBase,\n useKnowledgeDocuments,\n useCreateKnowledgeBase,\n useUpdateKnowledgeBase,\n useRebuildKnowledgeBaseIndex,\n type KnowledgeBaseRecord,\n} from '../hooks/useKnowledgeBases';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\ninterface KnowledgeBaseDetailPageProps {\n isNew?: boolean;\n}\n\n/**\n * Chunking strategies the service actually implements.\n *\n * `SEMANTIC` was offered here until 2026-07-26 but no ingestion path ever\n * implemented it — and, until the same change, `chunkingStrategy` was not\n * persisted at all, so every option in this list was equally inert. The\n * service now validates the value and rejects anything it cannot honour, so\n * listing SEMANTIC would surface a VALIDATION_FAILED error on save. It stays\n * out until real embedding-based splitting exists in the ingestion pipeline.\n */\nconst CHUNKING_STRATEGIES = ['RECURSIVE', 'FIXED', 'SENTENCE'] as const;\n\ninterface KnowledgeBaseForm {\n name: string;\n description: string;\n embeddingModel: string;\n embeddingDimensions: number;\n chunkingStrategy: string;\n chunkSize: number;\n chunkOverlap: number;\n}\n\nconst DEFAULT_FORM: KnowledgeBaseForm = {\n name: '',\n description: '',\n embeddingModel: '',\n embeddingDimensions: 0,\n chunkingStrategy: 'RECURSIVE',\n chunkSize: 512,\n chunkOverlap: 50,\n};\n\nfunction toForm(kb: KnowledgeBaseRecord): KnowledgeBaseForm {\n return {\n name: kb.name,\n description: kb.description ?? '',\n embeddingModel: kb.embeddingModel,\n embeddingDimensions: kb.embeddingDimensions,\n chunkingStrategy: kb.chunkingStrategy,\n chunkSize: kb.chunkSize,\n chunkOverlap: kb.chunkOverlap,\n };\n}\n\n/** `Number('')` is 0 and `Number('abc')` is NaN — keep the previous value instead. */\nfunction toNumber(value: string, fallback: number): number {\n const parsed = Number(value);\n return value.trim() !== '' && Number.isFinite(parsed) ? parsed : fallback;\n}\n\nexport const KnowledgeBaseDetailPage: FC<KnowledgeBaseDetailPageProps> = ({ isNew }) => {\n const { kbId } = useParams();\n const {\n data: models,\n loading: modelsLoading,\n error: modelsError,\n refetch: refetchModels,\n } = useLLMModels();\n const {\n data: providers,\n loading: providersLoading,\n error: providersError,\n refetch: refetchProviders,\n } = useLLMProviders();\n const catalogLoading = modelsLoading || providersLoading;\n const catalogError = modelsError || providersError;\n const embeddingModels = useMemo(\n () => configuredEmbeddingModels(models ?? [], providers ?? []),\n [models, providers]\n );\n const { navigateTo } = useBotlit();\n const { data: kb, loading, refetch } = useKnowledgeBase(isNew ? undefined : kbId);\n const { data: documents } = useKnowledgeDocuments(isNew ? undefined : kbId);\n const [createKB, createKBResult] = useCreateKnowledgeBase();\n const [updateKB, updateKBResult] = useUpdateKnowledgeBase();\n const [rebuildIndex, rebuildResult] = useRebuildKnowledgeBaseIndex();\n\n const [isEditing, setIsEditing] = useState(false);\n const [formData, setFormData] = useState<KnowledgeBaseForm>(DEFAULT_FORM);\n\n useEffect(() => {\n if (kb && !isNew) {\n setFormData(toForm(kb));\n }\n }, [kb, isNew]);\n\n const handleCreate = async () => {\n if (catalogLoading || catalogError) return;\n if (!formData.name.trim()) {\n toast.error('Name is required');\n return;\n }\n if (!embeddingModels.some((model) => model.id === formData.embeddingModel)) {\n toast.error('Choose a configured embedding model. Register one in Settings first.');\n return;\n }\n try {\n const newKB = await createKB({\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n embeddingModel: formData.embeddingModel,\n embeddingDimensions: formData.embeddingDimensions,\n chunkingStrategy: formData.chunkingStrategy,\n chunkSize: formData.chunkSize,\n chunkOverlap: formData.chunkOverlap,\n });\n toast.success(`Knowledge base \"${newKB.name}\" created`);\n navigateTo(`knowledge/${newKB.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to create knowledge base');\n }\n };\n\n const handleUpdate = async () => {\n if (!kbId || !formData.name.trim()) {\n toast.error('Name is required');\n return;\n }\n try {\n // `UpdateKnowledgeBaseInput` does not accept the embedding model or its\n // dimensions — changing those would invalidate every stored vector.\n await updateKB({\n kbId,\n input: {\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n chunkingStrategy: formData.chunkingStrategy,\n chunkSize: formData.chunkSize,\n chunkOverlap: formData.chunkOverlap,\n },\n });\n await refetch();\n toast.success('Knowledge base updated');\n setIsEditing(false);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update knowledge base');\n }\n };\n\n const handleRebuild = async () => {\n if (!kbId) return;\n try {\n await rebuildIndex(kbId);\n await refetch();\n toast.success('Re-indexing started');\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to rebuild the index');\n }\n };\n\n const renderConfigFields = (includeEmbedding: boolean) => (\n <>\n <FormField label=\"Name\" required>\n <Input\n placeholder=\"e.g., Product Documentation\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"What kind of knowledge will this store?\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n />\n </FormField>\n\n {includeEmbedding && (\n <FormField label=\"Embedding Model\" required>\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n aria-label=\"Embedding Model\"\n disabled={catalogLoading || Boolean(catalogError)}\n value={formData.embeddingModel}\n onChange={(e) => {\n const model = embeddingModels.find((entry) => entry.id === e.target.value);\n setFormData({\n ...formData,\n embeddingModel: e.target.value,\n embeddingDimensions: model?.dimensions ?? formData.embeddingDimensions,\n });\n }}\n >\n <option value=\"\">Choose a configured embedding model</option>\n {embeddingModels.map((model) => (\n <option key={model.id} value={model.id}>\n {model.label} ({model.dimensions}d)\n </option>\n ))}\n </select>\n {catalogLoading && <p role=\"status\">Loading configured embedding models…</p>}\n {catalogError && (\n <div role=\"alert\">\n <p>Could not load configured models. Try loading the catalog again.</p>\n <Button\n variant=\"secondary\"\n onClick={() => {\n void refetchModels();\n void refetchProviders();\n }}\n >\n Retry model catalog\n </Button>\n </div>\n )}\n {!catalogLoading && !catalogError && embeddingModels.length === 0 && (\n <p className=\"text-sm text-text-secondary\">\n Register an embedding model with an active provider in Settings first.\n </p>\n )}\n </FormField>\n )}\n\n <div className=\"grid grid-cols-3 gap-4\">\n <FormField label=\"Chunking Strategy\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.chunkingStrategy}\n onChange={(e) => setFormData({ ...formData, chunkingStrategy: e.target.value })}\n >\n {CHUNKING_STRATEGIES.map((strategy) => (\n <option key={strategy} value={strategy}>\n {strategy}\n </option>\n ))}\n </select>\n </FormField>\n\n <FormField label=\"Chunk Size\">\n <Input\n type=\"number\"\n value={formData.chunkSize}\n onChange={(e) =>\n setFormData({\n ...formData,\n chunkSize: toNumber(e.target.value, DEFAULT_FORM.chunkSize),\n })\n }\n />\n </FormField>\n\n <FormField label=\"Chunk Overlap\">\n <Input\n type=\"number\"\n value={formData.chunkOverlap}\n onChange={(e) =>\n setFormData({\n ...formData,\n chunkOverlap: toNumber(e.target.value, DEFAULT_FORM.chunkOverlap),\n })\n }\n />\n </FormField>\n </div>\n </>\n );\n\n if (isNew) {\n return (\n <PageLayout\n title=\"Create Knowledge Base\"\n description=\"Set up an embedding index your agents can retrieve from\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('knowledge')}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleCreate}\n isLoading={createKBResult.loading}\n disabled={catalogLoading || Boolean(catalogError) || !formData.name.trim()}\n >\n Create\n </Button>\n </div>\n }\n >\n <div className=\"max-w-3xl space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Index Configuration</CardTitle>\n <CardDescription>\n The embedding model and its vector width are fixed once documents are indexed.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">{renderConfigFields(true)}</CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n }\n\n if (loading) {\n return (\n <PageLayout title=\"Loading...\">\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!kb) {\n return (\n <PageLayout title=\"Knowledge Base Not Found\">\n <EmptyState\n illustration=\"empty-files\"\n title=\"Knowledge Base Not Found\"\n description=\"This knowledge base doesn't exist.\"\n action={<Button onClick={() => navigateTo('knowledge')}>Back to Knowledge Bases</Button>}\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('knowledge')}>\n <ArrowLeft size={20} />\n </Button>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{kb.name}</span>\n <StatusBadge status={kb.indexStatus} />\n </div>\n {kb.description && (\n <p className=\"text-sm font-normal text-text-secondary\">{kb.description}</p>\n )}\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.KNOWLEDGE_MANAGE}>\n <Button\n variant=\"outline\"\n leftIcon={<RefreshCw size={16} />}\n onClick={handleRebuild}\n isLoading={rebuildResult.loading}\n >\n Rebuild Index\n </Button>\n </BotmanorPermissionGate>\n {isEditing ? (\n <>\n <Button\n variant=\"outline\"\n onClick={() => {\n setFormData(toForm(kb));\n setIsEditing(false);\n }}\n >\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleUpdate}\n isLoading={updateKBResult.loading}\n >\n Save\n </Button>\n </>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.KNOWLEDGE_UPDATE}>\n <Button leftIcon={<Settings size={16} />} onClick={() => setIsEditing(true)}>\n Configure\n </Button>\n </BotmanorPermissionGate>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Database size={18} />}>\n This knowledge base is one searchable library your agents can draw on. Review how its\n documents are chunked and indexed, rebuild the index when content changes, and confirm it\n is healthy — so agents retrieve accurate, up-to-date passages and can cite them in their\n answers.\n </PagePurpose>\n\n {/* Index counters */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <GlassCard treatment=\"glass\" glow className=\"p-6 text-center\">\n <div className=\"p-3 rounded-full bg-action-primary-bg/10 w-fit mx-auto mb-2\">\n <Database className=\"h-5 w-5 text-primary\" />\n </div>\n <p className=\"text-lg font-bold text-text-primary capitalize\">\n {kb.indexStatus.toLowerCase()}\n </p>\n <p className=\"text-sm text-text-secondary\">Index Status</p>\n </GlassCard>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{kb.totalDocuments}</p>\n <p className=\"text-sm text-text-secondary\">Documents</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{kb.totalChunks}</p>\n <p className=\"text-sm text-text-secondary\">Chunks</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{kb.vectorCount}</p>\n <p className=\"text-sm text-text-secondary\">Vectors</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Index configuration */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Layers size={18} />\n Index Configuration\n </CardTitle>\n <CardDescription>\n How documents are embedded and split before they are indexed\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {isEditing ? (\n renderConfigFields(false)\n ) : (\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary\">Embedding Model</p>\n <p className=\"font-medium font-mono text-sm\">{kb.embeddingModel}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Dimensions</p>\n <p className=\"font-medium\">{kb.embeddingDimensions}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Chunking Strategy</p>\n <p className=\"font-medium\">{kb.chunkingStrategy}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Chunk Size</p>\n <p className=\"font-medium\">{kb.chunkSize}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Chunk Overlap</p>\n <p className=\"font-medium\">{kb.chunkOverlap}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Last Indexed</p>\n <p className=\"font-medium\">\n {kb.lastIndexedAt ? formatRelativeTime(kb.lastIndexedAt) : 'Never'}\n </p>\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Source imports are listed and queued under knowledge-base:manage. */}\n {!isNew && kbId && (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.KNOWLEDGE_MANAGE}>\n <KnowledgeSourceImportPanel knowledgeBaseId={kbId} />\n </BotmanorPermissionGate>\n )}\n {/* Documents */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n Documents ({documents.length})\n </CardTitle>\n <CardDescription>Source documents indexed into this knowledge base</CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n {documents.length > 0 ? (\n <div className=\"divide-y divide-border-subtle\">\n {documents.map((document) => (\n <div key={document.id} className=\"flex items-center justify-between gap-4 p-4\">\n <div className=\"min-w-0\">\n <p className=\"font-medium truncate\">{document.title}</p>\n <p className=\"text-sm text-text-secondary\">\n {document.chunkCount} chunks · added {formatRelativeTime(document.addedAt)}\n </p>\n {document.processingError && (\n <p className=\"mt-1 text-sm text-status-error-text\">\n {document.processingError}\n </p>\n )}\n </div>\n <StatusBadge status={document.status} />\n </div>\n ))}\n </div>\n ) : (\n <div className=\"p-8 text-center text-text-secondary\">\n <Boxes className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>No documents indexed yet</p>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Metadata */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Settings size={18} />\n Metadata\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-6 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(kb.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(kb.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Last Indexed</p>\n <p className=\"font-medium\">\n {kb.lastIndexedAt ? formatRelativeTime(kb.lastIndexedAt) : MISSING_VALUE}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"KnowledgeBaseDetailPage.js","names":["_Fragment","Textarea","Textarea$1","CHUNKING_STRATEGIES","DEFAULT_FORM","toForm","kb","toNumber","parsed","value","fallback","KnowledgeBaseDetailPage","useParams","models","modelsLoading","modelsError","refetchModels","useLLMModels","providers","providersLoading","providersError","refetchProviders","useLLMProviders","catalogLoading","catalogError","embeddingModels","useMemo","configuredEmbeddingModels","useBotlit","useKnowledgeBase","isNew","kbId","documents","useKnowledgeDocuments","createKB","createKBResult","useCreateKnowledgeBase","updateKB","updateKBResult","useUpdateKnowledgeBase","rebuildIndex","rebuildResult","useRebuildKnowledgeBaseIndex","isEditing","setIsEditing","useState","formData","setFormData","handleCreate","model","newKB","toast","navigateTo","err","handleUpdate","refetch","handleRebuild","renderConfigFields","Fragment","FormField","Input","includeEmbedding","entry","Button","strategy","PageLayout","Save","Card","CardHeader","CardTitle","CardDescription","CardContent","loading","ArrowLeft","StatusBadge","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","RefreshCw","Settings","PagePurpose","Database","GlassCard","Layers","formatRelativeTime","KnowledgeSourceImportPanel","FileText","document","Boxes","EmptyState"],"sources":["../../../src/botlit/pages/KnowledgeBaseDetailPage.tsx"],"sourcesContent":["/**\n * Knowledge Base Detail Page\n * @module botlit/pages\n *\n * A `KnowledgeBase` on wspace-botlit-svc is an embedding index owned by the\n * platform: `indexStatus`, `embeddingModel`/`embeddingDimensions`, the chunking\n * configuration and the document/chunk/vector counters. It carries no vector\n * store connection, no ingestion-flow references and no visibility column, so\n * this page renders only what the type actually exposes.\n */\n\nimport type { FC } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { toast } from 'sonner';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n ArrowLeft,\n Database,\n Settings,\n Save,\n FileText,\n Layers,\n RefreshCw,\n Boxes,\n} from 'lucide-react';\nimport { useLLMModels, useLLMProviders } from '../hooks/useLLMProviders';\nimport { configuredEmbeddingModels } from '../utils/embedding-models';\nimport { KnowledgeSourceImportPanel } from '../components/KnowledgeSourceImportPanel';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { EmptyState } from '../components/EmptyState';\nimport { Card, CardHeader, CardTitle, CardContent, CardDescription } from '../components/Card';\nimport { Button } from '../components/Button';\nimport { Input, Textarea, FormField } from '../components/Input';\nimport { StatusBadge } from '../components/Badge';\nimport {\n useKnowledgeBase,\n useKnowledgeDocuments,\n useCreateKnowledgeBase,\n useUpdateKnowledgeBase,\n useRebuildKnowledgeBaseIndex,\n type KnowledgeBaseRecord,\n} from '../hooks/useKnowledgeBases';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\ninterface KnowledgeBaseDetailPageProps {\n isNew?: boolean;\n}\n\n/**\n * Chunking strategies the service actually implements.\n *\n * `SEMANTIC` was offered here until 2026-07-26 but no ingestion path ever\n * implemented it — and, until the same change, `chunkingStrategy` was not\n * persisted at all, so every option in this list was equally inert. The\n * service now validates the value and rejects anything it cannot honour, so\n * listing SEMANTIC would surface a VALIDATION_FAILED error on save. It stays\n * out until real embedding-based splitting exists in the ingestion pipeline.\n */\nconst CHUNKING_STRATEGIES = ['RECURSIVE', 'FIXED', 'SENTENCE'] as const;\n\ninterface KnowledgeBaseForm {\n name: string;\n description: string;\n embeddingModel: string;\n embeddingDimensions: number;\n chunkingStrategy: string;\n chunkSize: number;\n chunkOverlap: number;\n}\n\nconst DEFAULT_FORM: KnowledgeBaseForm = {\n name: '',\n description: '',\n embeddingModel: '',\n embeddingDimensions: 0,\n chunkingStrategy: 'RECURSIVE',\n chunkSize: 512,\n chunkOverlap: 50,\n};\n\nfunction toForm(kb: KnowledgeBaseRecord): KnowledgeBaseForm {\n return {\n name: kb.name,\n description: kb.description ?? '',\n embeddingModel: kb.embeddingModel,\n embeddingDimensions: kb.embeddingDimensions,\n chunkingStrategy: kb.chunkingStrategy,\n chunkSize: kb.chunkSize,\n chunkOverlap: kb.chunkOverlap,\n };\n}\n\n/** `Number('')` is 0 and `Number('abc')` is NaN — keep the previous value instead. */\nfunction toNumber(value: string, fallback: number): number {\n const parsed = Number(value);\n return value.trim() !== '' && Number.isFinite(parsed) ? parsed : fallback;\n}\n\nexport const KnowledgeBaseDetailPage: FC<KnowledgeBaseDetailPageProps> = ({ isNew }) => {\n const { kbId } = useParams();\n const {\n data: models,\n loading: modelsLoading,\n error: modelsError,\n refetch: refetchModels,\n } = useLLMModels();\n const {\n data: providers,\n loading: providersLoading,\n error: providersError,\n refetch: refetchProviders,\n } = useLLMProviders();\n const catalogLoading = modelsLoading || providersLoading;\n const catalogError = modelsError || providersError;\n const embeddingModels = useMemo(\n () => configuredEmbeddingModels(models ?? [], providers ?? []),\n [models, providers]\n );\n const { navigateTo } = useBotlit();\n const { data: kb, loading, refetch } = useKnowledgeBase(isNew ? undefined : kbId);\n const { data: documents } = useKnowledgeDocuments(isNew ? undefined : kbId);\n const [createKB, createKBResult] = useCreateKnowledgeBase();\n const [updateKB, updateKBResult] = useUpdateKnowledgeBase();\n const [rebuildIndex, rebuildResult] = useRebuildKnowledgeBaseIndex();\n\n const [isEditing, setIsEditing] = useState(false);\n const [formData, setFormData] = useState<KnowledgeBaseForm>(DEFAULT_FORM);\n\n useEffect(() => {\n if (kb && !isNew) {\n setFormData(toForm(kb));\n }\n }, [kb, isNew]);\n\n const handleCreate = async () => {\n if (catalogLoading || catalogError) return;\n if (!formData.name.trim()) {\n toast.error('Name is required');\n return;\n }\n if (!embeddingModels.some((model) => model.id === formData.embeddingModel)) {\n toast.error('Choose a configured embedding model. Register one in Settings first.');\n return;\n }\n try {\n const newKB = await createKB({\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n embeddingModel: formData.embeddingModel,\n embeddingDimensions: formData.embeddingDimensions,\n chunkingStrategy: formData.chunkingStrategy,\n chunkSize: formData.chunkSize,\n chunkOverlap: formData.chunkOverlap,\n });\n toast.success(`Knowledge base \"${newKB.name}\" created`);\n navigateTo(`knowledge/${newKB.id}`);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to create knowledge base');\n }\n };\n\n const handleUpdate = async () => {\n if (!kbId || !formData.name.trim()) {\n toast.error('Name is required');\n return;\n }\n try {\n // `UpdateKnowledgeBaseInput` does not accept the embedding model or its\n // dimensions — changing those would invalidate every stored vector.\n await updateKB({\n kbId,\n input: {\n name: formData.name.trim(),\n description: formData.description.trim() || null,\n chunkingStrategy: formData.chunkingStrategy,\n chunkSize: formData.chunkSize,\n chunkOverlap: formData.chunkOverlap,\n },\n });\n await refetch();\n toast.success('Knowledge base updated');\n setIsEditing(false);\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to update knowledge base');\n }\n };\n\n const handleRebuild = async () => {\n if (!kbId) return;\n try {\n await rebuildIndex(kbId);\n await refetch();\n toast.success('Re-indexing started');\n } catch (err) {\n toast.error(err instanceof Error ? err.message : 'Failed to rebuild the index');\n }\n };\n\n const renderConfigFields = (includeEmbedding: boolean) => (\n <>\n <FormField label=\"Name\" required>\n <Input\n placeholder=\"e.g., Product Documentation\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n />\n </FormField>\n\n <FormField label=\"Description\">\n <Textarea\n placeholder=\"What kind of knowledge will this store?\"\n value={formData.description}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n />\n </FormField>\n\n {includeEmbedding && (\n <FormField label=\"Embedding Model\" required>\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n aria-label=\"Embedding Model\"\n disabled={catalogLoading || Boolean(catalogError)}\n value={formData.embeddingModel}\n onChange={(e) => {\n const model = embeddingModels.find((entry) => entry.id === e.target.value);\n setFormData({\n ...formData,\n embeddingModel: e.target.value,\n embeddingDimensions: model?.dimensions ?? formData.embeddingDimensions,\n });\n }}\n >\n <option value=\"\">Choose a configured embedding model</option>\n {embeddingModels.map((model) => (\n <option key={model.id} value={model.id}>\n {model.label} ({model.dimensions}d)\n </option>\n ))}\n </select>\n {catalogLoading && <p role=\"status\">Loading configured embedding models…</p>}\n {catalogError && (\n <div role=\"alert\">\n <p>Could not load configured models. Try loading the catalog again.</p>\n <Button\n variant=\"secondary\"\n onClick={() => {\n void refetchModels();\n void refetchProviders();\n }}\n >\n Retry model catalog\n </Button>\n </div>\n )}\n {!catalogLoading && !catalogError && embeddingModels.length === 0 && (\n <p className=\"text-sm text-text-secondary\">\n Register an embedding model with an active provider in Settings first.\n </p>\n )}\n </FormField>\n )}\n\n <div className=\"grid grid-cols-3 gap-4\">\n <FormField label=\"Chunking Strategy\">\n <select\n className=\"flex h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\"\n value={formData.chunkingStrategy}\n onChange={(e) => setFormData({ ...formData, chunkingStrategy: e.target.value })}\n >\n {CHUNKING_STRATEGIES.map((strategy) => (\n <option key={strategy} value={strategy}>\n {strategy}\n </option>\n ))}\n </select>\n </FormField>\n\n <FormField label=\"Chunk Size\">\n <Input\n type=\"number\"\n value={formData.chunkSize}\n onChange={(e) =>\n setFormData({\n ...formData,\n chunkSize: toNumber(e.target.value, DEFAULT_FORM.chunkSize),\n })\n }\n />\n </FormField>\n\n <FormField label=\"Chunk Overlap\">\n <Input\n type=\"number\"\n value={formData.chunkOverlap}\n onChange={(e) =>\n setFormData({\n ...formData,\n chunkOverlap: toNumber(e.target.value, DEFAULT_FORM.chunkOverlap),\n })\n }\n />\n </FormField>\n </div>\n </>\n );\n\n if (isNew) {\n return (\n <PageLayout\n title=\"Create Knowledge Base\"\n description=\"Set up an embedding index your agents can retrieve from\"\n actions={\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" onClick={() => navigateTo('knowledge')}>\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleCreate}\n isLoading={createKBResult.loading}\n disabled={catalogLoading || Boolean(catalogError) || !formData.name.trim()}\n >\n Create\n </Button>\n </div>\n }\n >\n <div className=\"max-w-3xl space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Index Configuration</CardTitle>\n <CardDescription>\n The embedding model and its vector width are fixed once documents are indexed.\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">{renderConfigFields(true)}</CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n }\n\n if (loading) {\n return (\n <PageLayout title=\"Loading...\">\n <div className=\"h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg\" />\n </PageLayout>\n );\n }\n\n if (!kb) {\n return (\n <PageLayout title=\"Knowledge Base Not Found\">\n <EmptyState\n illustration=\"empty-files\"\n title=\"Knowledge Base Not Found\"\n description=\"This knowledge base doesn't exist.\"\n action={<Button onClick={() => navigateTo('knowledge')}>Back to Knowledge Bases</Button>}\n />\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigateTo('knowledge')}>\n <ArrowLeft size={20} />\n </Button>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{kb.name}</span>\n <StatusBadge status={kb.indexStatus} />\n </div>\n {kb.description && (\n <p className=\"text-sm font-normal text-text-secondary\">{kb.description}</p>\n )}\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.KNOWLEDGE_MANAGE}>\n <Button\n variant=\"outline\"\n leftIcon={<RefreshCw size={16} />}\n onClick={handleRebuild}\n isLoading={rebuildResult.loading}\n >\n Rebuild Index\n </Button>\n </BotmanorPermissionGate>\n {isEditing ? (\n <>\n <Button\n variant=\"outline\"\n onClick={() => {\n setFormData(toForm(kb));\n setIsEditing(false);\n }}\n >\n Cancel\n </Button>\n <Button\n leftIcon={<Save size={16} />}\n onClick={handleUpdate}\n isLoading={updateKBResult.loading}\n >\n Save\n </Button>\n </>\n ) : (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.KNOWLEDGE_UPDATE}>\n <Button leftIcon={<Settings size={16} />} onClick={() => setIsEditing(true)}>\n Configure\n </Button>\n </BotmanorPermissionGate>\n )}\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Database size={18} />}>\n This knowledge base is one searchable library your agents can draw on. Review how its\n documents are chunked and indexed, rebuild the index when content changes, and confirm it\n is healthy — so agents retrieve accurate, up-to-date passages and can cite them in their\n answers.\n </PagePurpose>\n\n {/* Index counters */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <GlassCard treatment=\"glass\" glow className=\"p-6 text-center\">\n <div className=\"p-3 rounded-full bg-action-primary-bg/10 w-fit mx-auto mb-2\">\n <Database className=\"h-5 w-5 text-primary\" />\n </div>\n <p className=\"text-lg font-bold text-text-primary capitalize\">\n {kb.indexStatus.toLowerCase()}\n </p>\n <p className=\"text-sm text-text-secondary\">Index Status</p>\n </GlassCard>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{kb.totalDocuments}</p>\n <p className=\"text-sm text-text-secondary\">Documents</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{kb.totalChunks}</p>\n <p className=\"text-sm text-text-secondary\">Chunks</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-3xl font-bold text-text-primary\">{kb.vectorCount}</p>\n <p className=\"text-sm text-text-secondary\">Vectors</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Index configuration */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Layers size={18} />\n Index Configuration\n </CardTitle>\n <CardDescription>\n How documents are embedded and split before they are indexed\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {isEditing ? (\n renderConfigFields(false)\n ) : (\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary\">Embedding Model</p>\n <p className=\"font-medium font-mono text-sm\">{kb.embeddingModel}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Dimensions</p>\n <p className=\"font-medium\">{kb.embeddingDimensions}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Chunking Strategy</p>\n <p className=\"font-medium\">{kb.chunkingStrategy}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Chunk Size</p>\n <p className=\"font-medium\">{kb.chunkSize}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Chunk Overlap</p>\n <p className=\"font-medium\">{kb.chunkOverlap}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Last Indexed</p>\n <p className=\"font-medium\">\n {kb.lastIndexedAt ? formatRelativeTime(kb.lastIndexedAt) : 'Never'}\n </p>\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Source imports are listed and queued under knowledge-base:manage. */}\n {!isNew && kbId && (\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.KNOWLEDGE_MANAGE}>\n <KnowledgeSourceImportPanel knowledgeBaseId={kbId} />\n </BotmanorPermissionGate>\n )}\n {/* Documents */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n Documents ({documents.length})\n </CardTitle>\n <CardDescription>Source documents indexed into this knowledge base</CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n {documents.length > 0 ? (\n <div className=\"divide-y divide-border-subtle\">\n {documents.map((document) => (\n <div key={document.id} className=\"flex items-center justify-between gap-4 p-4\">\n <div className=\"min-w-0\">\n <p className=\"font-medium truncate\">{document.title}</p>\n <p className=\"text-sm text-text-secondary\">\n {document.chunkCount} chunks · added {formatRelativeTime(document.addedAt)}\n </p>\n {document.processingError && (\n <p className=\"mt-1 text-sm text-status-error-text\">\n {document.processingError}\n </p>\n )}\n </div>\n <StatusBadge status={document.status} />\n </div>\n ))}\n </div>\n ) : (\n <div className=\"p-8 text-center text-text-secondary\">\n <Boxes className=\"h-8 w-8 mx-auto mb-2 opacity-50\" />\n <p>No documents indexed yet</p>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Metadata */}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Settings size={18} />\n Metadata\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-6 text-sm\">\n <div>\n <p className=\"text-text-secondary\">Created</p>\n <p className=\"font-medium\">{formatRelativeTime(kb.createdAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Updated</p>\n <p className=\"font-medium\">{formatRelativeTime(kb.updatedAt)}</p>\n </div>\n <div>\n <p className=\"text-text-secondary\">Last Indexed</p>\n <p className=\"font-medium\">\n {kb.lastIndexedAt ? formatRelativeTime(kb.lastIndexedAt) : MISSING_VALUE}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { BOTMANOR_PERMISSIONS as
|
|
6
|
-
import { BotmanorPermissionGate as
|
|
7
|
-
import { PageLayout as o } from "../components/PageLayout.js";
|
|
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
|
+
import { Card as r, CardContent as i } from "../components/Card.js";
|
|
5
|
+
import { BOTMANOR_PERMISSIONS as a } from "../permissions/botmanorPermissions.js";
|
|
6
|
+
import { BotmanorPermissionGate as o } from "../permissions/useBotmanorPermissions.js";
|
|
8
7
|
import { Button as s } from "../components/Button.js";
|
|
8
|
+
import { Input as c } from "../components/Input.js";
|
|
9
|
+
import { StatusBadge as l } from "../components/Badge.js";
|
|
10
|
+
import { EmptyState as u } from "../components/EmptyState.js";
|
|
11
|
+
import { ErrorState as d } from "../components/ErrorState.js";
|
|
12
|
+
import { useKnowledgeBases as f } from "../hooks/useKnowledgeBases.js";
|
|
13
|
+
import { formatRelativeTime as p } from "../utils/formatters.js";
|
|
9
14
|
import "../permissions/index.js";
|
|
10
|
-
import { Card as c, CardContent as l } from "../components/Card.js";
|
|
11
|
-
import { StatusBadge as u } from "../components/Badge.js";
|
|
12
|
-
import { EmptyState as d } from "../components/EmptyState.js";
|
|
13
|
-
import { Input as f } from "../components/Input.js";
|
|
14
|
-
import { ErrorState as p } from "../components/ErrorState.js";
|
|
15
15
|
import { GlassCard as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
|
|
16
16
|
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
17
17
|
import { useParams as v } from "react-router";
|
|
18
18
|
import { BookOpen as y, FileText as b, Plus as x, Search as S } from "lucide-react";
|
|
19
|
-
|
|
19
|
+
// src/botlit/pages/KnowledgeBasesPage.tsx
|
|
20
20
|
var C = () => {
|
|
21
|
-
let C =
|
|
22
|
-
return /* @__PURE__ */ g(
|
|
21
|
+
let C = t(), { botId: w } = v(), { navigateTo: T } = e(), { data: E, loading: D, error: O, refetch: k } = f(w ? { search: w } : void 0);
|
|
22
|
+
return /* @__PURE__ */ g(n, {
|
|
23
23
|
title: C("botlit.knowledgeBases.title", "Knowledge Bases"),
|
|
24
24
|
description: C("botlit.knowledgeBases.description", "Manage knowledge sources for your AI agents"),
|
|
25
|
-
actions: /* @__PURE__ */ g(
|
|
26
|
-
permission:
|
|
25
|
+
actions: /* @__PURE__ */ g(o, {
|
|
26
|
+
permission: a.KNOWLEDGE_CREATE,
|
|
27
27
|
children: /* @__PURE__ */ g(s, {
|
|
28
28
|
leftIcon: /* @__PURE__ */ g(x, { size: 16 }),
|
|
29
29
|
onClick: () => T("knowledge/new"),
|
|
@@ -66,7 +66,7 @@ var C = () => {
|
|
|
66
66
|
className: "flex items-center gap-4",
|
|
67
67
|
children: /* @__PURE__ */ _("div", {
|
|
68
68
|
className: "relative flex-1 max-w-md",
|
|
69
|
-
children: [/* @__PURE__ */ g(S, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ g(
|
|
69
|
+
children: [/* @__PURE__ */ g(S, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ g(c, {
|
|
70
70
|
placeholder: C("botlit.knowledgeBases.searchPlaceholder", "Search knowledge bases..."),
|
|
71
71
|
className: "pl-9"
|
|
72
72
|
})]
|
|
@@ -79,16 +79,16 @@ var C = () => {
|
|
|
79
79
|
2,
|
|
80
80
|
3
|
|
81
81
|
].map((e) => /* @__PURE__ */ g("div", { className: "h-48 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" }, e))
|
|
82
|
-
}) : O ? /* @__PURE__ */ g(
|
|
82
|
+
}) : O ? /* @__PURE__ */ g(d, {
|
|
83
83
|
resource: "knowledge bases",
|
|
84
84
|
error: O,
|
|
85
85
|
onRetry: () => void k()
|
|
86
86
|
}) : E.length > 0 ? /* @__PURE__ */ _("div", {
|
|
87
87
|
className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",
|
|
88
|
-
children: [E.map((e) => /* @__PURE__ */ g(
|
|
88
|
+
children: [E.map((e) => /* @__PURE__ */ g(r, {
|
|
89
89
|
className: "hover:shadow-md transition-shadow cursor-pointer",
|
|
90
90
|
onClick: () => T(`knowledge/${e.id}`),
|
|
91
|
-
children: /* @__PURE__ */ _(
|
|
91
|
+
children: /* @__PURE__ */ _(i, {
|
|
92
92
|
className: "pt-6",
|
|
93
93
|
children: [
|
|
94
94
|
/* @__PURE__ */ _("div", {
|
|
@@ -96,7 +96,7 @@ var C = () => {
|
|
|
96
96
|
children: [/* @__PURE__ */ g("div", {
|
|
97
97
|
className: "p-3 rounded-lg bg-action-primary-bg/10",
|
|
98
98
|
children: /* @__PURE__ */ g(y, { className: "h-6 w-6 text-primary" })
|
|
99
|
-
}), /* @__PURE__ */ g(
|
|
99
|
+
}), /* @__PURE__ */ g(l, { status: e.indexStatus || e.status || "UNKNOWN" })]
|
|
100
100
|
}),
|
|
101
101
|
/* @__PURE__ */ g("h3", {
|
|
102
102
|
className: "font-semibold text-text-primary mb-1",
|
|
@@ -123,17 +123,17 @@ var C = () => {
|
|
|
123
123
|
children: [
|
|
124
124
|
C("botlit.botsList.createdLabel", "Created"),
|
|
125
125
|
" ",
|
|
126
|
-
|
|
126
|
+
p(e.createdAt)
|
|
127
127
|
]
|
|
128
128
|
})
|
|
129
129
|
]
|
|
130
130
|
})
|
|
131
|
-
}, e.id)), /* @__PURE__ */ g(
|
|
132
|
-
permission:
|
|
133
|
-
children: /* @__PURE__ */ g(
|
|
131
|
+
}, e.id)), /* @__PURE__ */ g(o, {
|
|
132
|
+
permission: a.KNOWLEDGE_CREATE,
|
|
133
|
+
children: /* @__PURE__ */ g(r, {
|
|
134
134
|
className: "border-dashed cursor-pointer hover:border-primary/50 transition-colors",
|
|
135
135
|
onClick: () => T("knowledge/new"),
|
|
136
|
-
children: /* @__PURE__ */ _(
|
|
136
|
+
children: /* @__PURE__ */ _(i, {
|
|
137
137
|
className: "h-full flex flex-col items-center justify-center py-12",
|
|
138
138
|
children: [/* @__PURE__ */ g("div", {
|
|
139
139
|
className: "p-4 rounded-full bg-bg-sunken mb-4",
|
|
@@ -145,12 +145,12 @@ var C = () => {
|
|
|
145
145
|
})
|
|
146
146
|
})
|
|
147
147
|
})]
|
|
148
|
-
}) : /* @__PURE__ */ g(
|
|
148
|
+
}) : /* @__PURE__ */ g(u, {
|
|
149
149
|
illustration: "empty-files",
|
|
150
150
|
title: C("botlit.knowledgeBases.empty.title", "No knowledge bases yet"),
|
|
151
151
|
description: C("botlit.knowledgeBases.empty.description", "Create a knowledge base to give your agents access to your documents and data."),
|
|
152
|
-
action: /* @__PURE__ */ g(
|
|
153
|
-
permission:
|
|
152
|
+
action: /* @__PURE__ */ g(o, {
|
|
153
|
+
permission: a.KNOWLEDGE_CREATE,
|
|
154
154
|
children: /* @__PURE__ */ g(s, {
|
|
155
155
|
leftIcon: /* @__PURE__ */ g(x, { size: 16 }),
|
|
156
156
|
onClick: () => T("knowledge/new"),
|
|
@@ -162,7 +162,6 @@ var C = () => {
|
|
|
162
162
|
})
|
|
163
163
|
});
|
|
164
164
|
};
|
|
165
|
-
//#endregion
|
|
166
165
|
export { C as KnowledgeBasesPage };
|
|
167
166
|
|
|
168
167
|
//# sourceMappingURL=KnowledgeBasesPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KnowledgeBasesPage.js","names":[],"sources":["../../../src/botlit/pages/KnowledgeBasesPage.tsx"],"sourcesContent":["/**\n * Knowledge Bases Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useParams } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { Plus, Search, BookOpen, FileText } from 'lucide-react';\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 { useKnowledgeBases } from '../hooks/useKnowledgeBases';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nexport const KnowledgeBasesPage: FC = () => {\n const t = useTr();\n const { botId } = useParams();\n const { navigateTo } = useBotlit();\n const {\n data: knowledgeBases,\n loading,\n error,\n refetch,\n } = useKnowledgeBases(botId ? { search: botId } : undefined);\n\n return (\n <PageLayout\n title={t('botlit.knowledgeBases.title', 'Knowledge Bases')}\n description={t(\n 'botlit.knowledgeBases.description',\n 'Manage knowledge sources for your AI agents'\n )}\n actions={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.KNOWLEDGE_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => navigateTo('knowledge/new')}>\n {t('botlit.knowledgeBases.actions.create', 'Create Knowledge Base')}\n </Button>\n </BotmanorPermissionGate>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<BookOpen size={18} />}>\n {t(\n 'botlit.knowledgeBases.purpose',\n \"A knowledge base is the private library your agents read from to answer questions about your business. Upload documents, FAQs, policies or product data here, and they get indexed so agents can retrieve and cite the right passage instead of guessing. Create a knowledge base whenever you want answers grounded in your own content rather than the model's general training.\"\n )}\n </PagePurpose>\n\n {/* Summary */}\n {knowledgeBases.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.knowledgeBases.summary.knowledgeBases', 'Knowledge bases')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {knowledgeBases.length}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"col-span-2 p-4 sm:col-span-2\">\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.knowledgeBases.summary.totalDocuments', 'Total documents')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {knowledgeBases.reduce(\n (\n sum: number,\n kb: { totalDocuments?: number | null; documentCount?: number | null }\n ) => sum + (kb.totalDocuments ?? kb.documentCount ?? 0),\n 0\n )}\n </p>\n </GlassCard>\n </div>\n ) : null}\n\n {/* Toolbar */}\n <div className=\"flex items-center 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(\n 'botlit.knowledgeBases.searchPlaceholder',\n 'Search knowledge bases...'\n )}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n {/* Content */}\n {loading ? (\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 ) : error ? (\n <ErrorState resource=\"knowledge bases\" error={error} onRetry={() => void refetch()} />\n ) : knowledgeBases.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {knowledgeBases.map(\n (kb: {\n id: string;\n name: string;\n description?: string | null;\n status?: string;\n indexStatus?: string;\n totalDocuments?: number | null;\n documentCount?: number | null;\n createdAt: string;\n }) => (\n <Card\n key={kb.id}\n className=\"hover:shadow-md transition-shadow cursor-pointer\"\n onClick={() => navigateTo(`knowledge/${kb.id}`)}\n >\n <CardContent className=\"pt-6\">\n <div className=\"flex items-start justify-between mb-4\">\n <div className=\"p-3 rounded-lg bg-action-primary-bg/10\">\n <BookOpen className=\"h-6 w-6 text-primary\" />\n </div>\n <StatusBadge status={kb.indexStatus || kb.status || 'UNKNOWN'} />\n </div>\n <h3 className=\"font-semibold text-text-primary mb-1\">{kb.name}</h3>\n <p className=\"text-sm text-text-secondary line-clamp-2 mb-4\">\n {kb.description}\n </p>\n <div className=\"flex items-center gap-4 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <FileText size={14} />\n {kb.totalDocuments ?? kb.documentCount ?? 0}{' '}\n {t('botlit.knowledgeBases.documentLabel', 'documents')}\n </span>\n </div>\n <div className=\"mt-3 pt-3 border-t border-border-subtle text-xs text-text-secondary\">\n {t('botlit.botsList.createdLabel', 'Created')}{' '}\n {formatRelativeTime(kb.createdAt)}\n </div>\n </CardContent>\n </Card>\n )\n )}\n\n {/* Add New Card */}\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.KNOWLEDGE_CREATE}>\n <Card\n className=\"border-dashed cursor-pointer hover:border-primary/50 transition-colors\"\n onClick={() => navigateTo('knowledge/new')}\n >\n <CardContent className=\"h-full flex flex-col items-center justify-center py-12\">\n <div className=\"p-4 rounded-full bg-bg-sunken mb-4\">\n <Plus className=\"h-8 w-8 text-text-secondary\" />\n </div>\n <p className=\"font-medium text-text-secondary\">\n {t('botlit.knowledgeBases.actions.add', 'Add Knowledge Base')}\n </p>\n </CardContent>\n </Card>\n </BotmanorPermissionGate>\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-files\"\n title={t('botlit.knowledgeBases.empty.title', 'No knowledge bases yet')}\n description={t(\n 'botlit.knowledgeBases.empty.description',\n 'Create a knowledge base to give your agents access to your documents and data.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.KNOWLEDGE_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => navigateTo('knowledge/new')}>\n {t('botlit.knowledgeBases.actions.create', 'Create Knowledge Base')}\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"KnowledgeBasesPage.js","names":["KnowledgeBasesPage","t","useTr","useParams","useBotlit","knowledgeBases","useKnowledgeBases","botId","PageLayout","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Button","Plus","navigateTo","PagePurpose","BookOpen","GlassCard","sum","kb","Search","Input","loading","i","error","ErrorState","refetch","Card","CardContent","StatusBadge","FileText","formatRelativeTime","EmptyState"],"sources":["../../../src/botlit/pages/KnowledgeBasesPage.tsx"],"sourcesContent":["/**\n * Knowledge Bases Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useParams } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport { Plus, Search, BookOpen, FileText } from 'lucide-react';\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 { useKnowledgeBases } from '../hooks/useKnowledgeBases';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nexport const KnowledgeBasesPage: FC = () => {\n const t = useTr();\n const { botId } = useParams();\n const { navigateTo } = useBotlit();\n const {\n data: knowledgeBases,\n loading,\n error,\n refetch,\n } = useKnowledgeBases(botId ? { search: botId } : undefined);\n\n return (\n <PageLayout\n title={t('botlit.knowledgeBases.title', 'Knowledge Bases')}\n description={t(\n 'botlit.knowledgeBases.description',\n 'Manage knowledge sources for your AI agents'\n )}\n actions={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.KNOWLEDGE_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => navigateTo('knowledge/new')}>\n {t('botlit.knowledgeBases.actions.create', 'Create Knowledge Base')}\n </Button>\n </BotmanorPermissionGate>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<BookOpen size={18} />}>\n {t(\n 'botlit.knowledgeBases.purpose',\n \"A knowledge base is the private library your agents read from to answer questions about your business. Upload documents, FAQs, policies or product data here, and they get indexed so agents can retrieve and cite the right passage instead of guessing. Create a knowledge base whenever you want answers grounded in your own content rather than the model's general training.\"\n )}\n </PagePurpose>\n\n {/* Summary */}\n {knowledgeBases.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.knowledgeBases.summary.knowledgeBases', 'Knowledge bases')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {knowledgeBases.length}\n </p>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"col-span-2 p-4 sm:col-span-2\">\n <p className=\"text-sm text-text-secondary\">\n {t('botlit.knowledgeBases.summary.totalDocuments', 'Total documents')}\n </p>\n <p className=\"mt-1 text-2xl font-semibold tabular-nums text-text-primary\">\n {knowledgeBases.reduce(\n (\n sum: number,\n kb: { totalDocuments?: number | null; documentCount?: number | null }\n ) => sum + (kb.totalDocuments ?? kb.documentCount ?? 0),\n 0\n )}\n </p>\n </GlassCard>\n </div>\n ) : null}\n\n {/* Toolbar */}\n <div className=\"flex items-center 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(\n 'botlit.knowledgeBases.searchPlaceholder',\n 'Search knowledge bases...'\n )}\n className=\"pl-9\"\n />\n </div>\n </div>\n\n {/* Content */}\n {loading ? (\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 ) : error ? (\n <ErrorState resource=\"knowledge bases\" error={error} onRetry={() => void refetch()} />\n ) : knowledgeBases.length > 0 ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {knowledgeBases.map(\n (kb: {\n id: string;\n name: string;\n description?: string | null;\n status?: string;\n indexStatus?: string;\n totalDocuments?: number | null;\n documentCount?: number | null;\n createdAt: string;\n }) => (\n <Card\n key={kb.id}\n className=\"hover:shadow-md transition-shadow cursor-pointer\"\n onClick={() => navigateTo(`knowledge/${kb.id}`)}\n >\n <CardContent className=\"pt-6\">\n <div className=\"flex items-start justify-between mb-4\">\n <div className=\"p-3 rounded-lg bg-action-primary-bg/10\">\n <BookOpen className=\"h-6 w-6 text-primary\" />\n </div>\n <StatusBadge status={kb.indexStatus || kb.status || 'UNKNOWN'} />\n </div>\n <h3 className=\"font-semibold text-text-primary mb-1\">{kb.name}</h3>\n <p className=\"text-sm text-text-secondary line-clamp-2 mb-4\">\n {kb.description}\n </p>\n <div className=\"flex items-center gap-4 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <FileText size={14} />\n {kb.totalDocuments ?? kb.documentCount ?? 0}{' '}\n {t('botlit.knowledgeBases.documentLabel', 'documents')}\n </span>\n </div>\n <div className=\"mt-3 pt-3 border-t border-border-subtle text-xs text-text-secondary\">\n {t('botlit.botsList.createdLabel', 'Created')}{' '}\n {formatRelativeTime(kb.createdAt)}\n </div>\n </CardContent>\n </Card>\n )\n )}\n\n {/* Add New Card */}\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.KNOWLEDGE_CREATE}>\n <Card\n className=\"border-dashed cursor-pointer hover:border-primary/50 transition-colors\"\n onClick={() => navigateTo('knowledge/new')}\n >\n <CardContent className=\"h-full flex flex-col items-center justify-center py-12\">\n <div className=\"p-4 rounded-full bg-bg-sunken mb-4\">\n <Plus className=\"h-8 w-8 text-text-secondary\" />\n </div>\n <p className=\"font-medium text-text-secondary\">\n {t('botlit.knowledgeBases.actions.add', 'Add Knowledge Base')}\n </p>\n </CardContent>\n </Card>\n </BotmanorPermissionGate>\n </div>\n ) : (\n <EmptyState\n illustration=\"empty-files\"\n title={t('botlit.knowledgeBases.empty.title', 'No knowledge bases yet')}\n description={t(\n 'botlit.knowledgeBases.empty.description',\n 'Create a knowledge base to give your agents access to your documents and data.'\n )}\n action={\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.KNOWLEDGE_CREATE}>\n <Button leftIcon={<Plus size={16} />} onClick={() => navigateTo('knowledge/new')}>\n {t('botlit.knowledgeBases.actions.create', 'Create Knowledge Base')}\n </Button>\n </BotmanorPermissionGate>\n }\n />\n )}\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|