@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,23 +1,23 @@
|
|
|
1
1
|
import { useBotlit as e } from "../providers/BotlitProvider.js";
|
|
2
|
-
import {
|
|
2
|
+
import { PageLayout as t } from "../components/PageLayout.js";
|
|
3
3
|
import { BOTMANOR_PERMISSIONS as n } from "../permissions/botmanorPermissions.js";
|
|
4
4
|
import { BotmanorPermissionGate as r } from "../permissions/useBotmanorPermissions.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import "../
|
|
8
|
-
import { Card as o, CardContent as s, CardDescription as c, CardHeader as l, CardTitle as u } from "../components/Card.js";
|
|
5
|
+
import { EmptyState as i } from "../components/EmptyState.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";
|
|
9
8
|
import { Badge as d } from "../components/Badge.js";
|
|
10
|
-
import { EmptyState as f } from "../components/EmptyState.js";
|
|
11
|
-
import { useInstallPackage as p, useStorePackage as m } from "../hooks/useStore.js";
|
|
12
9
|
import "../hooks/index.js";
|
|
10
|
+
import { formatRelativeTime as f } from "../utils/formatters.js";
|
|
11
|
+
import { useInstallPackage as p, useStorePackage as m } from "../hooks/useStore.js";
|
|
13
12
|
import { InstallMode as h } from "../../generated/wspace-types.js";
|
|
13
|
+
import "../permissions/index.js";
|
|
14
14
|
import { useMemo as g, useState as _ } from "react";
|
|
15
15
|
import { PagePurpose as v } from "@burdenoff/fe-libs/ui";
|
|
16
16
|
import { jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
17
17
|
import { useParams as x } from "react-router";
|
|
18
18
|
import { AlertTriangle as S, ArrowLeft as C, CheckCircle as w, Download as T, ExternalLink as E, FileText as D, GitBranch as O, Globe as k, Package as A, Shield as j, Tag as M } from "lucide-react";
|
|
19
19
|
import { toast as N } from "sonner";
|
|
20
|
-
|
|
20
|
+
// src/botlit/pages/StorePackageDetailPage.tsx
|
|
21
21
|
var P = {
|
|
22
22
|
APP: "Bot",
|
|
23
23
|
AGENT: "Agent",
|
|
@@ -101,14 +101,14 @@ var z = () => {
|
|
|
101
101
|
N.success(`Installed "${q.name ?? z.slug}"`), K(!1), L("store/installed");
|
|
102
102
|
}
|
|
103
103
|
};
|
|
104
|
-
return B ? /* @__PURE__ */ y(
|
|
104
|
+
return B ? /* @__PURE__ */ y(t, {
|
|
105
105
|
title: "Loading...",
|
|
106
106
|
children: /* @__PURE__ */ y("div", { className: "h-96 bg-bg-sunken motion-safe:animate-vc-shimmer rounded-lg" })
|
|
107
|
-
}) : z ? /* @__PURE__ */ b(
|
|
107
|
+
}) : z ? /* @__PURE__ */ b(t, {
|
|
108
108
|
title: /* @__PURE__ */ b("div", {
|
|
109
109
|
className: "flex items-center gap-3",
|
|
110
110
|
children: [
|
|
111
|
-
/* @__PURE__ */ y(
|
|
111
|
+
/* @__PURE__ */ y(u, {
|
|
112
112
|
variant: "ghost",
|
|
113
113
|
size: "icon",
|
|
114
114
|
onClick: () => L("store"),
|
|
@@ -139,14 +139,14 @@ var z = () => {
|
|
|
139
139
|
href: q.homepage,
|
|
140
140
|
target: "_blank",
|
|
141
141
|
rel: "noopener noreferrer",
|
|
142
|
-
children: /* @__PURE__ */ y(
|
|
142
|
+
children: /* @__PURE__ */ y(u, {
|
|
143
143
|
variant: "outline",
|
|
144
144
|
leftIcon: /* @__PURE__ */ y(E, { size: 16 }),
|
|
145
145
|
children: "Homepage"
|
|
146
146
|
})
|
|
147
147
|
}), /* @__PURE__ */ y(r, {
|
|
148
148
|
permission: n.STORE_CREATE,
|
|
149
|
-
children: /* @__PURE__ */ y(
|
|
149
|
+
children: /* @__PURE__ */ y(u, {
|
|
150
150
|
leftIcon: /* @__PURE__ */ y(T, { size: 16 }),
|
|
151
151
|
onClick: () => K(!0),
|
|
152
152
|
children: "Install"
|
|
@@ -163,10 +163,10 @@ var z = () => {
|
|
|
163
163
|
/* @__PURE__ */ b("div", {
|
|
164
164
|
className: "grid grid-cols-2 md:grid-cols-4 gap-4",
|
|
165
165
|
children: [
|
|
166
|
-
/* @__PURE__ */ y(
|
|
166
|
+
/* @__PURE__ */ y(a, {
|
|
167
167
|
treatment: "glass",
|
|
168
168
|
glow: !0,
|
|
169
|
-
children: /* @__PURE__ */ b(
|
|
169
|
+
children: /* @__PURE__ */ b(o, {
|
|
170
170
|
className: "pt-6 text-center",
|
|
171
171
|
children: [/* @__PURE__ */ y(d, {
|
|
172
172
|
variant: "outline",
|
|
@@ -178,7 +178,7 @@ var z = () => {
|
|
|
178
178
|
})]
|
|
179
179
|
})
|
|
180
180
|
}),
|
|
181
|
-
/* @__PURE__ */ y(
|
|
181
|
+
/* @__PURE__ */ y(a, { children: /* @__PURE__ */ b(o, {
|
|
182
182
|
className: "pt-6 text-center",
|
|
183
183
|
children: [/* @__PURE__ */ b("p", {
|
|
184
184
|
className: "text-lg font-bold",
|
|
@@ -188,14 +188,14 @@ var z = () => {
|
|
|
188
188
|
children: "Version"
|
|
189
189
|
})]
|
|
190
190
|
}) }),
|
|
191
|
-
/* @__PURE__ */ y(
|
|
191
|
+
/* @__PURE__ */ y(a, { children: /* @__PURE__ */ b(o, {
|
|
192
192
|
className: "pt-6 text-center",
|
|
193
193
|
children: [/* @__PURE__ */ y(F, { risk: q.risk }), /* @__PURE__ */ y("p", {
|
|
194
194
|
className: "text-sm text-text-secondary mt-1",
|
|
195
195
|
children: "Security"
|
|
196
196
|
})]
|
|
197
197
|
}) }),
|
|
198
|
-
/* @__PURE__ */ y(
|
|
198
|
+
/* @__PURE__ */ y(a, { children: /* @__PURE__ */ b(o, {
|
|
199
199
|
className: "pt-6 text-center",
|
|
200
200
|
children: [/* @__PURE__ */ y("p", {
|
|
201
201
|
className: "text-lg font-bold",
|
|
@@ -207,7 +207,7 @@ var z = () => {
|
|
|
207
207
|
}) })
|
|
208
208
|
]
|
|
209
209
|
}),
|
|
210
|
-
/* @__PURE__ */ b(
|
|
210
|
+
/* @__PURE__ */ b(a, { children: [/* @__PURE__ */ y(c, { children: /* @__PURE__ */ y(l, { children: "Description" }) }), /* @__PURE__ */ b(o, { children: [/* @__PURE__ */ y("p", {
|
|
211
211
|
className: "text-text-primary",
|
|
212
212
|
children: q.description ?? "—"
|
|
213
213
|
}), q.tags.length > 0 && /* @__PURE__ */ b("div", {
|
|
@@ -220,17 +220,17 @@ var z = () => {
|
|
|
220
220
|
children: e
|
|
221
221
|
}, e))]
|
|
222
222
|
})] })] }),
|
|
223
|
-
z.readme && /* @__PURE__ */ b(
|
|
223
|
+
z.readme && /* @__PURE__ */ b(a, { children: [/* @__PURE__ */ y(c, { children: /* @__PURE__ */ b(l, {
|
|
224
224
|
className: "flex items-center gap-2",
|
|
225
225
|
children: [/* @__PURE__ */ y(D, { size: 18 }), "README"]
|
|
226
|
-
}) }), /* @__PURE__ */ y(
|
|
226
|
+
}) }), /* @__PURE__ */ y(o, { children: /* @__PURE__ */ y("div", {
|
|
227
227
|
className: "prose prose-sm max-w-none dark:prose-invert",
|
|
228
228
|
children: /* @__PURE__ */ y("pre", {
|
|
229
229
|
className: "whitespace-pre-wrap text-sm",
|
|
230
230
|
children: z.readme
|
|
231
231
|
})
|
|
232
232
|
}) })] }),
|
|
233
|
-
/* @__PURE__ */ b(
|
|
233
|
+
/* @__PURE__ */ b(a, { children: [/* @__PURE__ */ y(c, { children: /* @__PURE__ */ y(l, { children: "Author & Links" }) }), /* @__PURE__ */ y(o, { children: /* @__PURE__ */ b("div", {
|
|
234
234
|
className: "grid grid-cols-2 md:grid-cols-4 gap-6",
|
|
235
235
|
children: [
|
|
236
236
|
/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
|
|
@@ -254,7 +254,7 @@ var z = () => {
|
|
|
254
254
|
children: "Published"
|
|
255
255
|
}), /* @__PURE__ */ y("p", {
|
|
256
256
|
className: "font-medium mt-1",
|
|
257
|
-
children:
|
|
257
|
+
children: f(z.publishedAt)
|
|
258
258
|
})] }),
|
|
259
259
|
q.repository && /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
|
|
260
260
|
className: "text-sm text-text-secondary",
|
|
@@ -278,11 +278,11 @@ var z = () => {
|
|
|
278
278
|
})] })
|
|
279
279
|
]
|
|
280
280
|
}) })] }),
|
|
281
|
-
q.dependencies.length > 0 && /* @__PURE__ */ b(
|
|
281
|
+
q.dependencies.length > 0 && /* @__PURE__ */ b(a, { children: [/* @__PURE__ */ b(c, { children: [/* @__PURE__ */ y(l, { children: "Dependencies" }), /* @__PURE__ */ b(s, { children: [
|
|
282
282
|
"This package depends on ",
|
|
283
283
|
q.dependencies.length,
|
|
284
284
|
" other package(s)"
|
|
285
|
-
] })] }), /* @__PURE__ */ y(
|
|
285
|
+
] })] }), /* @__PURE__ */ y(o, { children: /* @__PURE__ */ y("div", {
|
|
286
286
|
className: "flex flex-wrap gap-2",
|
|
287
287
|
children: q.dependencies.map((e) => /* @__PURE__ */ b(d, {
|
|
288
288
|
variant: "outline",
|
|
@@ -296,10 +296,10 @@ var z = () => {
|
|
|
296
296
|
}) })] }),
|
|
297
297
|
/* @__PURE__ */ b("div", {
|
|
298
298
|
className: "grid grid-cols-1 md:grid-cols-2 gap-6",
|
|
299
|
-
children: [/* @__PURE__ */ b(
|
|
299
|
+
children: [/* @__PURE__ */ b(a, { children: [/* @__PURE__ */ y(c, { children: /* @__PURE__ */ b(l, {
|
|
300
300
|
className: "flex items-center gap-2",
|
|
301
301
|
children: [/* @__PURE__ */ y(w, { size: 18 }), "Compatibility"]
|
|
302
|
-
}) }), /* @__PURE__ */ y(
|
|
302
|
+
}) }), /* @__PURE__ */ y(o, { children: /* @__PURE__ */ y("div", {
|
|
303
303
|
className: "space-y-2",
|
|
304
304
|
children: Object.keys(q.compatibility).length === 0 ? /* @__PURE__ */ y("p", {
|
|
305
305
|
className: "text-sm text-text-secondary",
|
|
@@ -314,10 +314,10 @@ var z = () => {
|
|
|
314
314
|
children: t
|
|
315
315
|
})]
|
|
316
316
|
}, e))
|
|
317
|
-
}) })] }), /* @__PURE__ */ b(
|
|
317
|
+
}) })] }), /* @__PURE__ */ b(a, { children: [/* @__PURE__ */ y(c, { children: /* @__PURE__ */ b(l, {
|
|
318
318
|
className: "flex items-center gap-2",
|
|
319
319
|
children: [/* @__PURE__ */ y(j, { size: 18 }), "Security"]
|
|
320
|
-
}) }), /* @__PURE__ */ y(
|
|
320
|
+
}) }), /* @__PURE__ */ y(o, { children: /* @__PURE__ */ b("div", {
|
|
321
321
|
className: "space-y-3",
|
|
322
322
|
children: [
|
|
323
323
|
/* @__PURE__ */ b("div", {
|
|
@@ -351,7 +351,7 @@ var z = () => {
|
|
|
351
351
|
]
|
|
352
352
|
}) })] })]
|
|
353
353
|
}),
|
|
354
|
-
/* @__PURE__ */ b(
|
|
354
|
+
/* @__PURE__ */ b(a, { children: [/* @__PURE__ */ y(c, { children: /* @__PURE__ */ y(l, { children: "Integrity" }) }), /* @__PURE__ */ y(o, { children: /* @__PURE__ */ b("div", {
|
|
355
355
|
className: "space-y-2",
|
|
356
356
|
children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
|
|
357
357
|
className: "text-sm text-text-secondary",
|
|
@@ -370,14 +370,14 @@ var z = () => {
|
|
|
370
370
|
]
|
|
371
371
|
}), G && /* @__PURE__ */ y("div", {
|
|
372
372
|
className: "fixed inset-0 bg-black/50 flex items-center justify-center z-50",
|
|
373
|
-
children: /* @__PURE__ */ b(
|
|
373
|
+
children: /* @__PURE__ */ b(a, {
|
|
374
374
|
className: "w-full max-w-md",
|
|
375
|
-
children: [/* @__PURE__ */ b(
|
|
375
|
+
children: [/* @__PURE__ */ b(c, { children: [/* @__PURE__ */ y(l, { children: "Install Package" }), /* @__PURE__ */ b(s, { children: [
|
|
376
376
|
"Install ",
|
|
377
377
|
q.name ?? z.slug,
|
|
378
378
|
" v",
|
|
379
379
|
z.version
|
|
380
|
-
] })] }), /* @__PURE__ */ b(
|
|
380
|
+
] })] }), /* @__PURE__ */ b(o, {
|
|
381
381
|
className: "space-y-4",
|
|
382
382
|
children: [
|
|
383
383
|
/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
|
|
@@ -434,11 +434,11 @@ var z = () => {
|
|
|
434
434
|
}),
|
|
435
435
|
/* @__PURE__ */ b("div", {
|
|
436
436
|
className: "flex justify-end gap-2 pt-4",
|
|
437
|
-
children: [/* @__PURE__ */ y(
|
|
437
|
+
children: [/* @__PURE__ */ y(u, {
|
|
438
438
|
variant: "outline",
|
|
439
439
|
onClick: () => K(!1),
|
|
440
440
|
children: "Cancel"
|
|
441
|
-
}), /* @__PURE__ */ y(
|
|
441
|
+
}), /* @__PURE__ */ y(u, {
|
|
442
442
|
onClick: () => void J(),
|
|
443
443
|
isLoading: H,
|
|
444
444
|
leftIcon: /* @__PURE__ */ y(T, { size: 16 }),
|
|
@@ -449,20 +449,19 @@ var z = () => {
|
|
|
449
449
|
})]
|
|
450
450
|
})
|
|
451
451
|
})]
|
|
452
|
-
}) : /* @__PURE__ */ y(
|
|
452
|
+
}) : /* @__PURE__ */ y(t, {
|
|
453
453
|
title: "Package Not Found",
|
|
454
|
-
children: /* @__PURE__ */ y(
|
|
454
|
+
children: /* @__PURE__ */ y(i, {
|
|
455
455
|
illustration: "empty-search",
|
|
456
456
|
title: "Package Not Found",
|
|
457
457
|
description: "This package doesn't exist.",
|
|
458
|
-
action: /* @__PURE__ */ y(
|
|
458
|
+
action: /* @__PURE__ */ y(u, {
|
|
459
459
|
onClick: () => L("store"),
|
|
460
460
|
children: "Back to Store"
|
|
461
461
|
})
|
|
462
462
|
})
|
|
463
463
|
});
|
|
464
464
|
};
|
|
465
|
-
//#endregion
|
|
466
465
|
export { z as StorePackageDetailPage };
|
|
467
466
|
|
|
468
467
|
//# sourceMappingURL=StorePackageDetailPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorePackageDetailPage.js","names":[],"sources":["../../../src/botlit/pages/StorePackageDetailPage.tsx"],"sourcesContent":["/**\n * Store Package Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n ArrowLeft,\n Package,\n Download,\n Shield,\n ExternalLink,\n FileText,\n Tag,\n GitBranch,\n CheckCircle,\n AlertTriangle,\n Globe,\n} from 'lucide-react';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose } 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 { Badge } from '../components/Badge';\nimport { toast } from 'sonner';\nimport { useStorePackage, useInstallPackage } from '../hooks';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport { InstallMode as GqlInstallMode } from '../../generated/wspace-types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nconst KindLabel: Record<string, string> = {\n APP: 'Bot',\n AGENT: 'Agent',\n MCP_PACK: 'MCP Pack',\n PROMPT_TEMPLATE: 'Prompt Template',\n PROMPT: 'Prompt',\n SKILL: 'Skill',\n RETRIEVAL_PROFILE: 'Retrieval Profile',\n POLICY_BUNDLE: 'Policy Bundle',\n CHANNEL_TEMPLATE: 'Channel Template',\n A2A_AGENT: 'A2A Agent',\n KB_TEMPLATE: 'KB Template',\n KNOWLEDGE_BASE: 'Knowledge Base',\n INTEGRATION: 'Integration',\n TEMPLATE: 'Template',\n TOOL: 'Tool',\n WORKFLOW: 'Workflow',\n};\n\nconst RiskBadge: FC<{ risk: string | undefined }> = ({ risk }) => {\n const variants: Record<string, 'success' | 'warning' | 'destructive'> = {\n low: 'success',\n medium: 'warning',\n high: 'destructive',\n };\n if (!risk) {\n return <Badge variant=\"secondary\">Risk unknown</Badge>;\n }\n return (\n <Badge variant={variants[risk] ?? 'secondary'} className=\"capitalize\">\n {risk} Risk\n </Badge>\n );\n};\n\ninterface PackageDependencyView {\n slug: string;\n version: string;\n}\n\n/**\n * The manifest is free-form JSON on the service, so every field is read\n * defensively — a package published without a section must not blank the page.\n */\ninterface ManifestView {\n name?: string;\n slug?: string;\n description?: string;\n icon?: string;\n license?: string;\n homepage?: string;\n repository?: string;\n authorName?: string;\n authorUrl?: string;\n tags: string[];\n dependencies: PackageDependencyView[];\n compatibility: Record<string, string>;\n risk?: string;\n requiresSecrets: boolean;\n networkEgress?: string;\n checksum?: string;\n signature?: string;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nfunction readManifest(manifest: Record<string, unknown>): ManifestView {\n const info = asRecord(manifest.package);\n const author = asRecord(info.author);\n const security = asRecord(manifest.security);\n const integrity = asRecord(manifest.integrity);\n const compatibilitySource = asRecord(manifest.compatibility);\n\n const compatibility: Record<string, string> = {};\n for (const [key, value] of Object.entries(compatibilitySource)) {\n const text = asString(value);\n if (text) compatibility[key] = text;\n }\n\n const dependencies: PackageDependencyView[] = Array.isArray(manifest.dependencies)\n ? manifest.dependencies.flatMap((entry) => {\n const dep = asRecord(entry);\n const slug = asString(dep.slug);\n return slug ? [{ slug, version: asString(dep.version) ?? '*' }] : [];\n })\n : [];\n\n return {\n name: asString(info.name),\n slug: asString(info.slug),\n description: asString(info.description),\n icon: asString(info.icon),\n license: asString(info.license),\n homepage: asString(info.homepage),\n repository: asString(info.repository),\n authorName: asString(author.name),\n authorUrl: asString(author.url),\n tags: Array.isArray(info.tags)\n ? info.tags.filter((tag): tag is string => typeof tag === 'string')\n : [],\n dependencies,\n compatibility,\n risk: asString(security.risk),\n requiresSecrets: security.requiresSecrets === true,\n networkEgress: asString(asRecord(security.network).egress),\n checksum: asString(integrity.checksum),\n signature: asString(integrity.signature),\n };\n}\n\nexport const StorePackageDetailPage: FC = () => {\n const { slug } = useParams();\n const { navigateTo } = useBotlit();\n const decodedSlug = slug ? decodeURIComponent(slug) : undefined;\n const { data: pkg, loading } = useStorePackage(decodedSlug);\n const { install, loading: installLoading } = useInstallPackage();\n\n const [installMode, setInstallMode] = useState<GqlInstallMode>(GqlInstallMode.Linked);\n const [showInstallDialog, setShowInstallDialog] = useState(false);\n\n const manifest = useMemo(() => readManifest(pkg?.manifest ?? {}), [pkg?.manifest]);\n\n const handleInstall = async () => {\n if (!pkg) return;\n try {\n await install({ packageId: pkg.id, mode: installMode });\n } catch (err) {\n // Keep the dialog open so a failed install is never mistaken for a success.\n toast.error(err instanceof Error ? err.message : 'Failed to install package');\n return;\n }\n toast.success(`Installed \"${manifest.name ?? pkg.slug}\"`);\n setShowInstallDialog(false);\n navigateTo('store/installed');\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 (!pkg) {\n return (\n <PageLayout title=\"Package Not Found\">\n <EmptyState\n illustration=\"empty-search\"\n title=\"Package Not Found\"\n description=\"This package doesn't exist.\"\n action={<Button onClick={() => navigateTo('store')}>Back to Store</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('store')}>\n <ArrowLeft size={20} />\n </Button>\n <div className=\"p-2 rounded-lg bg-action-primary-bg/10\">\n {manifest.icon ? (\n <span className=\"text-2xl\">{manifest.icon}</span>\n ) : (\n <Package className=\"h-6 w-6 text-primary\" />\n )}\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{manifest.name ?? pkg.slug}</span>\n <Badge variant=\"outline\">v{pkg.version}</Badge>\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">{pkg.slug}</p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {manifest.homepage && (\n <a href={manifest.homepage} target=\"_blank\" rel=\"noopener noreferrer\">\n <Button variant=\"outline\" leftIcon={<ExternalLink size={16} />}>\n Homepage\n </Button>\n </a>\n )}\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.STORE_CREATE}>\n <Button leftIcon={<Download size={16} />} onClick={() => setShowInstallDialog(true)}>\n Install\n </Button>\n </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Package size={18} />}>\n This is a store package — a ready-made bot, agent, skill, tool pack or template you can\n install into your workspace. Review what it does, its security posture and version, then\n install it (linked so it stays updated, or forked as your own copy) to get a head start\n instead of building from scratch.\n </PagePurpose>\n\n {/* Overview Cards */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card treatment=\"glass\" glow>\n <CardContent className=\"pt-6 text-center\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {KindLabel[pkg.kind] ?? pkg.kind}\n </Badge>\n <p className=\"text-sm text-text-secondary mt-1\">Type</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-lg font-bold\">v{pkg.version}</p>\n <p className=\"text-sm text-text-secondary\">Version</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <RiskBadge risk={manifest.risk} />\n <p className=\"text-sm text-text-secondary mt-1\">Security</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-lg font-bold\">{manifest.license ?? MISSING_VALUE}</p>\n <p className=\"text-sm text-text-secondary\">License</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Description */}\n <Card>\n <CardHeader>\n <CardTitle>Description</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-text-primary\">{manifest.description ?? MISSING_VALUE}</p>\n {manifest.tags.length > 0 && (\n <div className=\"flex items-center gap-2 mt-4\">\n <Tag size={14} className=\"text-text-secondary\" />\n {manifest.tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* README */}\n {pkg.readme && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n README\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"prose prose-sm max-w-none dark:prose-invert\">\n <pre className=\"whitespace-pre-wrap text-sm\">{pkg.readme}</pre>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Author & Links */}\n <Card>\n <CardHeader>\n <CardTitle>Author & Links</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary\">Author</p>\n <div className=\"flex items-center gap-2 mt-1\">\n <span className=\"font-medium\">{manifest.authorName ?? MISSING_VALUE}</span>\n {manifest.authorUrl && (\n <a\n href={manifest.authorUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline\"\n >\n <ExternalLink size={12} />\n </a>\n )}\n </div>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Published</p>\n <p className=\"font-medium mt-1\">{formatRelativeTime(pkg.publishedAt)}</p>\n </div>\n {manifest.repository && (\n <div>\n <p className=\"text-sm text-text-secondary\">Repository</p>\n <a\n href={manifest.repository}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 mt-1 text-primary hover:underline\"\n >\n <GitBranch size={14} />\n View Source\n </a>\n </div>\n )}\n {manifest.homepage && (\n <div>\n <p className=\"text-sm text-text-secondary\">Homepage</p>\n <a\n href={manifest.homepage}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 mt-1 text-primary hover:underline\"\n >\n <Globe size={14} />\n Visit Site\n </a>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n\n {/* Dependencies */}\n {manifest.dependencies.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Dependencies</CardTitle>\n <CardDescription>\n This package depends on {manifest.dependencies.length} other package(s)\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-wrap gap-2\">\n {manifest.dependencies.map((dep) => (\n <Badge key={dep.slug} variant=\"outline\" className=\"font-mono\">\n {dep.slug}@{dep.version}\n </Badge>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Compatibility & Security */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <CheckCircle size={18} />\n Compatibility\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n {Object.keys(manifest.compatibility).length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n This package does not declare compatibility ranges.\n </p>\n ) : (\n Object.entries(manifest.compatibility).map(([target, range]) => (\n <div key={target} className=\"flex justify-between\">\n <span className=\"text-text-secondary capitalize\">{target}</span>\n <Badge variant=\"outline\">{range}</Badge>\n </div>\n ))\n )}\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Security\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-text-secondary\">Risk Level</span>\n <RiskBadge risk={manifest.risk} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-text-secondary\">Requires Secrets</span>\n <Badge variant={manifest.requiresSecrets ? 'warning' : 'secondary'}>\n {manifest.requiresSecrets ? 'Yes' : 'No'}\n </Badge>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-text-secondary\">Network Egress</span>\n <Badge\n variant={\n manifest.networkEgress === 'any'\n ? 'warning'\n : manifest.networkEgress === 'restricted'\n ? 'secondary'\n : 'success'\n }\n className=\"capitalize\"\n >\n {manifest.networkEgress ?? 'unknown'}\n </Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Integrity */}\n <Card>\n <CardHeader>\n <CardTitle>Integrity</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <div>\n <p className=\"text-sm text-text-secondary\">Checksum</p>\n <p className=\"font-mono text-sm break-all\">{manifest.checksum ?? MISSING_VALUE}</p>\n </div>\n {manifest.signature && (\n <div>\n <p className=\"text-sm text-text-secondary\">Signature</p>\n <p className=\"font-mono text-sm break-all\">{manifest.signature}</p>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Install Dialog */}\n {showInstallDialog && (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <Card className=\"w-full max-w-md\">\n <CardHeader>\n <CardTitle>Install Package</CardTitle>\n <CardDescription>\n Install {manifest.name ?? pkg.slug} v{pkg.version}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm font-medium mb-2\">Install Mode</p>\n <div className=\"space-y-2\">\n <label className=\"flex items-start gap-3 p-3 border border-border-subtle rounded-lg cursor-pointer hover:bg-accent\">\n <input\n type=\"radio\"\n name=\"mode\"\n value=\"LINKED\"\n checked={installMode === GqlInstallMode.Linked}\n onChange={() => setInstallMode(GqlInstallMode.Linked)}\n className=\"mt-1\"\n />\n <div>\n <p className=\"font-medium\">Linked</p>\n <p className=\"text-sm text-text-secondary\">\n Stay in sync with store updates. Recommended for most cases.\n </p>\n </div>\n </label>\n <label className=\"flex items-start gap-3 p-3 border border-border-subtle rounded-lg cursor-pointer hover:bg-accent\">\n <input\n type=\"radio\"\n name=\"mode\"\n value=\"FORKED\"\n checked={installMode === GqlInstallMode.Forked}\n onChange={() => setInstallMode(GqlInstallMode.Forked)}\n className=\"mt-1\"\n />\n <div>\n <p className=\"font-medium\">Forked</p>\n <p className=\"text-sm text-text-secondary\">\n Create a local copy you can customize. No automatic updates.\n </p>\n </div>\n </label>\n </div>\n </div>\n\n {manifest.requiresSecrets && (\n <div className=\"p-3 bg-status-warning-bg-subtle rounded-lg\">\n <div className=\"flex items-center gap-2 text-status-warning-text\">\n <AlertTriangle size={16} />\n <span className=\"text-sm font-medium\">Requires Secrets</span>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n This package requires secret configuration after installation.\n </p>\n </div>\n )}\n\n <div className=\"flex justify-end gap-2 pt-4\">\n <Button variant=\"outline\" onClick={() => setShowInstallDialog(false)}>\n Cancel\n </Button>\n <Button\n onClick={() => void handleInstall()}\n isLoading={installLoading}\n leftIcon={<Download size={16} />}\n >\n Install\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StorePackageDetailPage.js","names":["GqlInstallMode","KindLabel","RiskBadge","risk","Badge","asRecord","value","asString","readManifest","info","manifest","author","security","integrity","compatibilitySource","compatibility","key","text","dependencies","dep","entry","slug","tag","StorePackageDetailPage","useParams","useBotlit","pkg","useStorePackage","installLoading","useInstallPackage","installMode","setInstallMode","useState","InstallMode","showInstallDialog","setShowInstallDialog","useMemo","handleInstall","install","err","toast","navigateTo","loading","PageLayout","Button","ArrowLeft","Package","ExternalLink","BotmanorPermissionGate","BOTMANOR_PERMISSIONS","Download","PagePurpose","Card","CardContent","CardHeader","CardTitle","Tag","FileText","formatRelativeTime","GitBranch","Globe","CardDescription","CheckCircle","target","range","Shield","AlertTriangle","EmptyState"],"sources":["../../../src/botlit/pages/StorePackageDetailPage.tsx"],"sourcesContent":["/**\n * Store Package Detail Page\n * @module botlit/pages\n */\n\nimport type { FC } from 'react';\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router';\nimport { useBotlit } from '../providers/BotlitProvider';\nimport {\n ArrowLeft,\n Package,\n Download,\n Shield,\n ExternalLink,\n FileText,\n Tag,\n GitBranch,\n CheckCircle,\n AlertTriangle,\n Globe,\n} from 'lucide-react';\nimport { PageLayout } from '../components/PageLayout';\nimport { PagePurpose } 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 { Badge } from '../components/Badge';\nimport { toast } from 'sonner';\nimport { useStorePackage, useInstallPackage } from '../hooks';\nimport { formatRelativeTime, MISSING_VALUE } from '../utils/formatters';\nimport { InstallMode as GqlInstallMode } from '../../generated/wspace-types';\nimport { BOTMANOR_PERMISSIONS, BotmanorPermissionGate } from '../permissions';\n\nconst KindLabel: Record<string, string> = {\n APP: 'Bot',\n AGENT: 'Agent',\n MCP_PACK: 'MCP Pack',\n PROMPT_TEMPLATE: 'Prompt Template',\n PROMPT: 'Prompt',\n SKILL: 'Skill',\n RETRIEVAL_PROFILE: 'Retrieval Profile',\n POLICY_BUNDLE: 'Policy Bundle',\n CHANNEL_TEMPLATE: 'Channel Template',\n A2A_AGENT: 'A2A Agent',\n KB_TEMPLATE: 'KB Template',\n KNOWLEDGE_BASE: 'Knowledge Base',\n INTEGRATION: 'Integration',\n TEMPLATE: 'Template',\n TOOL: 'Tool',\n WORKFLOW: 'Workflow',\n};\n\nconst RiskBadge: FC<{ risk: string | undefined }> = ({ risk }) => {\n const variants: Record<string, 'success' | 'warning' | 'destructive'> = {\n low: 'success',\n medium: 'warning',\n high: 'destructive',\n };\n if (!risk) {\n return <Badge variant=\"secondary\">Risk unknown</Badge>;\n }\n return (\n <Badge variant={variants[risk] ?? 'secondary'} className=\"capitalize\">\n {risk} Risk\n </Badge>\n );\n};\n\ninterface PackageDependencyView {\n slug: string;\n version: string;\n}\n\n/**\n * The manifest is free-form JSON on the service, so every field is read\n * defensively — a package published without a section must not blank the page.\n */\ninterface ManifestView {\n name?: string;\n slug?: string;\n description?: string;\n icon?: string;\n license?: string;\n homepage?: string;\n repository?: string;\n authorName?: string;\n authorUrl?: string;\n tags: string[];\n dependencies: PackageDependencyView[];\n compatibility: Record<string, string>;\n risk?: string;\n requiresSecrets: boolean;\n networkEgress?: string;\n checksum?: string;\n signature?: string;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' && value !== '' ? value : undefined;\n}\n\nfunction readManifest(manifest: Record<string, unknown>): ManifestView {\n const info = asRecord(manifest.package);\n const author = asRecord(info.author);\n const security = asRecord(manifest.security);\n const integrity = asRecord(manifest.integrity);\n const compatibilitySource = asRecord(manifest.compatibility);\n\n const compatibility: Record<string, string> = {};\n for (const [key, value] of Object.entries(compatibilitySource)) {\n const text = asString(value);\n if (text) compatibility[key] = text;\n }\n\n const dependencies: PackageDependencyView[] = Array.isArray(manifest.dependencies)\n ? manifest.dependencies.flatMap((entry) => {\n const dep = asRecord(entry);\n const slug = asString(dep.slug);\n return slug ? [{ slug, version: asString(dep.version) ?? '*' }] : [];\n })\n : [];\n\n return {\n name: asString(info.name),\n slug: asString(info.slug),\n description: asString(info.description),\n icon: asString(info.icon),\n license: asString(info.license),\n homepage: asString(info.homepage),\n repository: asString(info.repository),\n authorName: asString(author.name),\n authorUrl: asString(author.url),\n tags: Array.isArray(info.tags)\n ? info.tags.filter((tag): tag is string => typeof tag === 'string')\n : [],\n dependencies,\n compatibility,\n risk: asString(security.risk),\n requiresSecrets: security.requiresSecrets === true,\n networkEgress: asString(asRecord(security.network).egress),\n checksum: asString(integrity.checksum),\n signature: asString(integrity.signature),\n };\n}\n\nexport const StorePackageDetailPage: FC = () => {\n const { slug } = useParams();\n const { navigateTo } = useBotlit();\n const decodedSlug = slug ? decodeURIComponent(slug) : undefined;\n const { data: pkg, loading } = useStorePackage(decodedSlug);\n const { install, loading: installLoading } = useInstallPackage();\n\n const [installMode, setInstallMode] = useState<GqlInstallMode>(GqlInstallMode.Linked);\n const [showInstallDialog, setShowInstallDialog] = useState(false);\n\n const manifest = useMemo(() => readManifest(pkg?.manifest ?? {}), [pkg?.manifest]);\n\n const handleInstall = async () => {\n if (!pkg) return;\n try {\n await install({ packageId: pkg.id, mode: installMode });\n } catch (err) {\n // Keep the dialog open so a failed install is never mistaken for a success.\n toast.error(err instanceof Error ? err.message : 'Failed to install package');\n return;\n }\n toast.success(`Installed \"${manifest.name ?? pkg.slug}\"`);\n setShowInstallDialog(false);\n navigateTo('store/installed');\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 (!pkg) {\n return (\n <PageLayout title=\"Package Not Found\">\n <EmptyState\n illustration=\"empty-search\"\n title=\"Package Not Found\"\n description=\"This package doesn't exist.\"\n action={<Button onClick={() => navigateTo('store')}>Back to Store</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('store')}>\n <ArrowLeft size={20} />\n </Button>\n <div className=\"p-2 rounded-lg bg-action-primary-bg/10\">\n {manifest.icon ? (\n <span className=\"text-2xl\">{manifest.icon}</span>\n ) : (\n <Package className=\"h-6 w-6 text-primary\" />\n )}\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <span>{manifest.name ?? pkg.slug}</span>\n <Badge variant=\"outline\">v{pkg.version}</Badge>\n </div>\n <p className=\"text-sm font-normal text-text-secondary\">{pkg.slug}</p>\n </div>\n </div>\n }\n actions={\n <div className=\"flex gap-2\">\n {manifest.homepage && (\n <a href={manifest.homepage} target=\"_blank\" rel=\"noopener noreferrer\">\n <Button variant=\"outline\" leftIcon={<ExternalLink size={16} />}>\n Homepage\n </Button>\n </a>\n )}\n <BotmanorPermissionGate permission={BOTMANOR_PERMISSIONS.STORE_CREATE}>\n <Button leftIcon={<Download size={16} />} onClick={() => setShowInstallDialog(true)}>\n Install\n </Button>\n </BotmanorPermissionGate>\n </div>\n }\n >\n <div className=\"space-y-6\">\n <PagePurpose icon={<Package size={18} />}>\n This is a store package — a ready-made bot, agent, skill, tool pack or template you can\n install into your workspace. Review what it does, its security posture and version, then\n install it (linked so it stays updated, or forked as your own copy) to get a head start\n instead of building from scratch.\n </PagePurpose>\n\n {/* Overview Cards */}\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card treatment=\"glass\" glow>\n <CardContent className=\"pt-6 text-center\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {KindLabel[pkg.kind] ?? pkg.kind}\n </Badge>\n <p className=\"text-sm text-text-secondary mt-1\">Type</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-lg font-bold\">v{pkg.version}</p>\n <p className=\"text-sm text-text-secondary\">Version</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <RiskBadge risk={manifest.risk} />\n <p className=\"text-sm text-text-secondary mt-1\">Security</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-6 text-center\">\n <p className=\"text-lg font-bold\">{manifest.license ?? MISSING_VALUE}</p>\n <p className=\"text-sm text-text-secondary\">License</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Description */}\n <Card>\n <CardHeader>\n <CardTitle>Description</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-text-primary\">{manifest.description ?? MISSING_VALUE}</p>\n {manifest.tags.length > 0 && (\n <div className=\"flex items-center gap-2 mt-4\">\n <Tag size={14} className=\"text-text-secondary\" />\n {manifest.tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* README */}\n {pkg.readme && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileText size={18} />\n README\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"prose prose-sm max-w-none dark:prose-invert\">\n <pre className=\"whitespace-pre-wrap text-sm\">{pkg.readme}</pre>\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Author & Links */}\n <Card>\n <CardHeader>\n <CardTitle>Author & Links</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-6\">\n <div>\n <p className=\"text-sm text-text-secondary\">Author</p>\n <div className=\"flex items-center gap-2 mt-1\">\n <span className=\"font-medium\">{manifest.authorName ?? MISSING_VALUE}</span>\n {manifest.authorUrl && (\n <a\n href={manifest.authorUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary hover:underline\"\n >\n <ExternalLink size={12} />\n </a>\n )}\n </div>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Published</p>\n <p className=\"font-medium mt-1\">{formatRelativeTime(pkg.publishedAt)}</p>\n </div>\n {manifest.repository && (\n <div>\n <p className=\"text-sm text-text-secondary\">Repository</p>\n <a\n href={manifest.repository}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 mt-1 text-primary hover:underline\"\n >\n <GitBranch size={14} />\n View Source\n </a>\n </div>\n )}\n {manifest.homepage && (\n <div>\n <p className=\"text-sm text-text-secondary\">Homepage</p>\n <a\n href={manifest.homepage}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1 mt-1 text-primary hover:underline\"\n >\n <Globe size={14} />\n Visit Site\n </a>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n\n {/* Dependencies */}\n {manifest.dependencies.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Dependencies</CardTitle>\n <CardDescription>\n This package depends on {manifest.dependencies.length} other package(s)\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-wrap gap-2\">\n {manifest.dependencies.map((dep) => (\n <Badge key={dep.slug} variant=\"outline\" className=\"font-mono\">\n {dep.slug}@{dep.version}\n </Badge>\n ))}\n </div>\n </CardContent>\n </Card>\n )}\n\n {/* Compatibility & Security */}\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <CheckCircle size={18} />\n Compatibility\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n {Object.keys(manifest.compatibility).length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n This package does not declare compatibility ranges.\n </p>\n ) : (\n Object.entries(manifest.compatibility).map(([target, range]) => (\n <div key={target} className=\"flex justify-between\">\n <span className=\"text-text-secondary capitalize\">{target}</span>\n <Badge variant=\"outline\">{range}</Badge>\n </div>\n ))\n )}\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Shield size={18} />\n Security\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-text-secondary\">Risk Level</span>\n <RiskBadge risk={manifest.risk} />\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-text-secondary\">Requires Secrets</span>\n <Badge variant={manifest.requiresSecrets ? 'warning' : 'secondary'}>\n {manifest.requiresSecrets ? 'Yes' : 'No'}\n </Badge>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-text-secondary\">Network Egress</span>\n <Badge\n variant={\n manifest.networkEgress === 'any'\n ? 'warning'\n : manifest.networkEgress === 'restricted'\n ? 'secondary'\n : 'success'\n }\n className=\"capitalize\"\n >\n {manifest.networkEgress ?? 'unknown'}\n </Badge>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Integrity */}\n <Card>\n <CardHeader>\n <CardTitle>Integrity</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <div>\n <p className=\"text-sm text-text-secondary\">Checksum</p>\n <p className=\"font-mono text-sm break-all\">{manifest.checksum ?? MISSING_VALUE}</p>\n </div>\n {manifest.signature && (\n <div>\n <p className=\"text-sm text-text-secondary\">Signature</p>\n <p className=\"font-mono text-sm break-all\">{manifest.signature}</p>\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Install Dialog */}\n {showInstallDialog && (\n <div className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\">\n <Card className=\"w-full max-w-md\">\n <CardHeader>\n <CardTitle>Install Package</CardTitle>\n <CardDescription>\n Install {manifest.name ?? pkg.slug} v{pkg.version}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-sm font-medium mb-2\">Install Mode</p>\n <div className=\"space-y-2\">\n <label className=\"flex items-start gap-3 p-3 border border-border-subtle rounded-lg cursor-pointer hover:bg-accent\">\n <input\n type=\"radio\"\n name=\"mode\"\n value=\"LINKED\"\n checked={installMode === GqlInstallMode.Linked}\n onChange={() => setInstallMode(GqlInstallMode.Linked)}\n className=\"mt-1\"\n />\n <div>\n <p className=\"font-medium\">Linked</p>\n <p className=\"text-sm text-text-secondary\">\n Stay in sync with store updates. Recommended for most cases.\n </p>\n </div>\n </label>\n <label className=\"flex items-start gap-3 p-3 border border-border-subtle rounded-lg cursor-pointer hover:bg-accent\">\n <input\n type=\"radio\"\n name=\"mode\"\n value=\"FORKED\"\n checked={installMode === GqlInstallMode.Forked}\n onChange={() => setInstallMode(GqlInstallMode.Forked)}\n className=\"mt-1\"\n />\n <div>\n <p className=\"font-medium\">Forked</p>\n <p className=\"text-sm text-text-secondary\">\n Create a local copy you can customize. No automatic updates.\n </p>\n </div>\n </label>\n </div>\n </div>\n\n {manifest.requiresSecrets && (\n <div className=\"p-3 bg-status-warning-bg-subtle rounded-lg\">\n <div className=\"flex items-center gap-2 text-status-warning-text\">\n <AlertTriangle size={16} />\n <span className=\"text-sm font-medium\">Requires Secrets</span>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n This package requires secret configuration after installation.\n </p>\n </div>\n )}\n\n <div className=\"flex justify-end gap-2 pt-4\">\n <Button variant=\"outline\" onClick={() => setShowInstallDialog(false)}>\n Cancel\n </Button>\n <Button\n onClick={() => void handleInstall()}\n isLoading={installLoading}\n leftIcon={<Download size={16} />}\n >\n Install\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </PageLayout>\n );\n};\n"],"mappings":"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"}
|