@xenosystem/agent-interface-ui 0.1.3
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/LICENSE +67 -0
- package/dist/adapters/agentHostPlatformBridge.d.ts +24 -0
- package/dist/adapters/agentHostPlatformBridge.d.ts.map +1 -0
- package/dist/adapters/agentHostPlatformBridge.js +1244 -0
- package/dist/adapters/agentHostPlatformBridge.js.map +1 -0
- package/dist/adapters/hubAgentPlatformBridge.d.ts +17 -0
- package/dist/adapters/hubAgentPlatformBridge.d.ts.map +1 -0
- package/dist/adapters/hubAgentPlatformBridge.js +109 -0
- package/dist/adapters/hubAgentPlatformBridge.js.map +1 -0
- package/dist/adapters/xenoAgentCompatibilityBridge.d.ts +14 -0
- package/dist/adapters/xenoAgentCompatibilityBridge.d.ts.map +1 -0
- package/dist/adapters/xenoAgentCompatibilityBridge.js +237 -0
- package/dist/adapters/xenoAgentCompatibilityBridge.js.map +1 -0
- package/dist/adapters/xenoAgentHostCatalog.d.ts +40 -0
- package/dist/adapters/xenoAgentHostCatalog.d.ts.map +1 -0
- package/dist/adapters/xenoAgentHostCatalog.js +228 -0
- package/dist/adapters/xenoAgentHostCatalog.js.map +1 -0
- package/dist/components/agent/AIStatusIndicator.d.ts +25 -0
- package/dist/components/agent/AIStatusIndicator.d.ts.map +1 -0
- package/dist/components/agent/AIStatusIndicator.js +85 -0
- package/dist/components/agent/AIStatusIndicator.js.map +1 -0
- package/dist/components/agent/AgentInterface.d.ts +21 -0
- package/dist/components/agent/AgentInterface.d.ts.map +1 -0
- package/dist/components/agent/AgentInterface.js +7586 -0
- package/dist/components/agent/AgentInterface.js.map +1 -0
- package/dist/components/agent/AgentOnboarding.d.ts +16 -0
- package/dist/components/agent/AgentOnboarding.d.ts.map +1 -0
- package/dist/components/agent/AgentOnboarding.js +423 -0
- package/dist/components/agent/AgentOnboarding.js.map +1 -0
- package/dist/components/agent/AgentPtyTerminalPanel.d.ts +13 -0
- package/dist/components/agent/AgentPtyTerminalPanel.d.ts.map +1 -0
- package/dist/components/agent/AgentPtyTerminalPanel.js +129 -0
- package/dist/components/agent/AgentPtyTerminalPanel.js.map +1 -0
- package/dist/components/agent/AgentView.d.ts +143 -0
- package/dist/components/agent/AgentView.d.ts.map +1 -0
- package/dist/components/agent/AgentView.js +7250 -0
- package/dist/components/agent/AgentView.js.map +1 -0
- package/dist/components/agent/AgentWorkbenchCliPanel.d.ts +15 -0
- package/dist/components/agent/AgentWorkbenchCliPanel.d.ts.map +1 -0
- package/dist/components/agent/AgentWorkbenchCliPanel.js +275 -0
- package/dist/components/agent/AgentWorkbenchCliPanel.js.map +1 -0
- package/dist/components/agent/AgentWorkbenchPanel.d.ts +791 -0
- package/dist/components/agent/AgentWorkbenchPanel.d.ts.map +1 -0
- package/dist/components/agent/AgentWorkbenchPanel.js +584 -0
- package/dist/components/agent/AgentWorkbenchPanel.js.map +1 -0
- package/dist/components/agent/AgentWorkspaceBrowserPanel.d.ts +11 -0
- package/dist/components/agent/AgentWorkspaceBrowserPanel.d.ts.map +1 -0
- package/dist/components/agent/AgentWorkspaceBrowserPanel.js +198 -0
- package/dist/components/agent/AgentWorkspaceBrowserPanel.js.map +1 -0
- package/dist/components/agent/AssistantTurnStatusNotice.d.ts +16 -0
- package/dist/components/agent/AssistantTurnStatusNotice.d.ts.map +1 -0
- package/dist/components/agent/AssistantTurnStatusNotice.js +54 -0
- package/dist/components/agent/AssistantTurnStatusNotice.js.map +1 -0
- package/dist/components/agent/CommandToolCard.d.ts +11 -0
- package/dist/components/agent/CommandToolCard.d.ts.map +1 -0
- package/dist/components/agent/CommandToolCard.js +29 -0
- package/dist/components/agent/CommandToolCard.js.map +1 -0
- package/dist/components/agent/FleetPanel.d.ts +28 -0
- package/dist/components/agent/FleetPanel.d.ts.map +1 -0
- package/dist/components/agent/FleetPanel.js +175 -0
- package/dist/components/agent/FleetPanel.js.map +1 -0
- package/dist/components/agent/GhostTextArea.d.ts +13 -0
- package/dist/components/agent/GhostTextArea.d.ts.map +1 -0
- package/dist/components/agent/GhostTextArea.js +21 -0
- package/dist/components/agent/GhostTextArea.js.map +1 -0
- package/dist/components/agent/IntakePanel.d.ts +29 -0
- package/dist/components/agent/IntakePanel.d.ts.map +1 -0
- package/dist/components/agent/IntakePanel.js +81 -0
- package/dist/components/agent/IntakePanel.js.map +1 -0
- package/dist/components/agent/KnowledgePanel.d.ts +25 -0
- package/dist/components/agent/KnowledgePanel.d.ts.map +1 -0
- package/dist/components/agent/KnowledgePanel.js +99 -0
- package/dist/components/agent/KnowledgePanel.js.map +1 -0
- package/dist/components/agent/MonacoDiffWorkbenchEditor.d.ts +9 -0
- package/dist/components/agent/MonacoDiffWorkbenchEditor.d.ts.map +1 -0
- package/dist/components/agent/MonacoDiffWorkbenchEditor.js +204 -0
- package/dist/components/agent/MonacoDiffWorkbenchEditor.js.map +1 -0
- package/dist/components/agent/MonacoWorkbenchEditor.d.ts +15 -0
- package/dist/components/agent/MonacoWorkbenchEditor.d.ts.map +1 -0
- package/dist/components/agent/MonacoWorkbenchEditor.js +380 -0
- package/dist/components/agent/MonacoWorkbenchEditor.js.map +1 -0
- package/dist/components/agent/PermissionDialog.d.ts +34 -0
- package/dist/components/agent/PermissionDialog.d.ts.map +1 -0
- package/dist/components/agent/PermissionDialog.js +67 -0
- package/dist/components/agent/PermissionDialog.js.map +1 -0
- package/dist/components/agent/PluginManager.d.ts +20 -0
- package/dist/components/agent/PluginManager.d.ts.map +1 -0
- package/dist/components/agent/PluginManager.js +506 -0
- package/dist/components/agent/PluginManager.js.map +1 -0
- package/dist/components/agent/RunReviewPanel.d.ts +52 -0
- package/dist/components/agent/RunReviewPanel.d.ts.map +1 -0
- package/dist/components/agent/RunReviewPanel.js +236 -0
- package/dist/components/agent/RunReviewPanel.js.map +1 -0
- package/dist/components/agent/SessionsPanel.d.ts +30 -0
- package/dist/components/agent/SessionsPanel.d.ts.map +1 -0
- package/dist/components/agent/SessionsPanel.js +247 -0
- package/dist/components/agent/SessionsPanel.js.map +1 -0
- package/dist/components/agent/acp/AcpAgentConfigForm.d.ts +19 -0
- package/dist/components/agent/acp/AcpAgentConfigForm.d.ts.map +1 -0
- package/dist/components/agent/acp/AcpAgentConfigForm.js +85 -0
- package/dist/components/agent/acp/AcpAgentConfigForm.js.map +1 -0
- package/dist/components/agent/acp/AcpAgentDiagnosticsPanel.d.ts +10 -0
- package/dist/components/agent/acp/AcpAgentDiagnosticsPanel.d.ts.map +1 -0
- package/dist/components/agent/acp/AcpAgentDiagnosticsPanel.js +80 -0
- package/dist/components/agent/acp/AcpAgentDiagnosticsPanel.js.map +1 -0
- package/dist/components/agent/acp/AcpAgentManager.d.ts +3 -0
- package/dist/components/agent/acp/AcpAgentManager.d.ts.map +1 -0
- package/dist/components/agent/acp/AcpAgentManager.js +152 -0
- package/dist/components/agent/acp/AcpAgentManager.js.map +1 -0
- package/dist/components/agent/acp/AcpAgentTestResultPanel.d.ts +9 -0
- package/dist/components/agent/acp/AcpAgentTestResultPanel.d.ts.map +1 -0
- package/dist/components/agent/acp/AcpAgentTestResultPanel.js +24 -0
- package/dist/components/agent/acp/AcpAgentTestResultPanel.js.map +1 -0
- package/dist/components/agent/acp/AcpApprovalPanel.d.ts +29 -0
- package/dist/components/agent/acp/AcpApprovalPanel.d.ts.map +1 -0
- package/dist/components/agent/acp/AcpApprovalPanel.js +37 -0
- package/dist/components/agent/acp/AcpApprovalPanel.js.map +1 -0
- package/dist/components/agent/acp/AcpCertificationPanel.d.ts +10 -0
- package/dist/components/agent/acp/AcpCertificationPanel.d.ts.map +1 -0
- package/dist/components/agent/acp/AcpCertificationPanel.js +41 -0
- package/dist/components/agent/acp/AcpCertificationPanel.js.map +1 -0
- package/dist/components/agent/acp/AcpLiveProviderWorkflowPanel.d.ts +11 -0
- package/dist/components/agent/acp/AcpLiveProviderWorkflowPanel.d.ts.map +1 -0
- package/dist/components/agent/acp/AcpLiveProviderWorkflowPanel.js +32 -0
- package/dist/components/agent/acp/AcpLiveProviderWorkflowPanel.js.map +1 -0
- package/dist/components/agent/acp/AcpProviderManagerPanel.d.ts +7 -0
- package/dist/components/agent/acp/AcpProviderManagerPanel.d.ts.map +1 -0
- package/dist/components/agent/acp/AcpProviderManagerPanel.js +69 -0
- package/dist/components/agent/acp/AcpProviderManagerPanel.js.map +1 -0
- package/dist/components/agent/acp/AcpProviderModelsPanel.d.ts +7 -0
- package/dist/components/agent/acp/AcpProviderModelsPanel.d.ts.map +1 -0
- package/dist/components/agent/acp/AcpProviderModelsPanel.js +108 -0
- package/dist/components/agent/acp/AcpProviderModelsPanel.js.map +1 -0
- package/dist/components/agent/acp/AcpSupportBundlePanel.d.ts +8 -0
- package/dist/components/agent/acp/AcpSupportBundlePanel.d.ts.map +1 -0
- package/dist/components/agent/acp/AcpSupportBundlePanel.js +56 -0
- package/dist/components/agent/acp/AcpSupportBundlePanel.js.map +1 -0
- package/dist/components/agent/compactionSummary.d.ts +28 -0
- package/dist/components/agent/compactionSummary.d.ts.map +1 -0
- package/dist/components/agent/compactionSummary.js +41 -0
- package/dist/components/agent/compactionSummary.js.map +1 -0
- package/dist/components/agent/monacoWorkbenchShared.d.ts +13 -0
- package/dist/components/agent/monacoWorkbenchShared.d.ts.map +1 -0
- package/dist/components/agent/monacoWorkbenchShared.js +226 -0
- package/dist/components/agent/monacoWorkbenchShared.js.map +1 -0
- package/dist/components/agent/settings/EntitySettingsLayout.d.ts +61 -0
- package/dist/components/agent/settings/EntitySettingsLayout.d.ts.map +1 -0
- package/dist/components/agent/settings/EntitySettingsLayout.js +72 -0
- package/dist/components/agent/settings/EntitySettingsLayout.js.map +1 -0
- package/dist/components/agent/settings/SettingsNavigation.d.ts +8 -0
- package/dist/components/agent/settings/SettingsNavigation.d.ts.map +1 -0
- package/dist/components/agent/settings/SettingsNavigation.js +39 -0
- package/dist/components/agent/settings/SettingsNavigation.js.map +1 -0
- package/dist/components/agent/settings/sections/AccessMembersSection.d.ts +3 -0
- package/dist/components/agent/settings/sections/AccessMembersSection.d.ts.map +1 -0
- package/dist/components/agent/settings/sections/AccessMembersSection.js +31 -0
- package/dist/components/agent/settings/sections/AccessMembersSection.js.map +1 -0
- package/dist/components/agent/settings/sections/AgentPermissionRulesPanel.d.ts +25 -0
- package/dist/components/agent/settings/sections/AgentPermissionRulesPanel.d.ts.map +1 -0
- package/dist/components/agent/settings/sections/AgentPermissionRulesPanel.js +56 -0
- package/dist/components/agent/settings/sections/AgentPermissionRulesPanel.js.map +1 -0
- package/dist/components/agent/settings/sections/DangerZoneSection.d.ts +3 -0
- package/dist/components/agent/settings/sections/DangerZoneSection.d.ts.map +1 -0
- package/dist/components/agent/settings/sections/DangerZoneSection.js +19 -0
- package/dist/components/agent/settings/sections/DangerZoneSection.js.map +1 -0
- package/dist/components/agent/settings/sections/DefaultAgentConfigSection.d.ts +3 -0
- package/dist/components/agent/settings/sections/DefaultAgentConfigSection.d.ts.map +1 -0
- package/dist/components/agent/settings/sections/DefaultAgentConfigSection.js +66 -0
- package/dist/components/agent/settings/sections/DefaultAgentConfigSection.js.map +1 -0
- package/dist/components/agent/settings/sections/EnvironmentSecretsSection.d.ts +3 -0
- package/dist/components/agent/settings/sections/EnvironmentSecretsSection.d.ts.map +1 -0
- package/dist/components/agent/settings/sections/EnvironmentSecretsSection.js +87 -0
- package/dist/components/agent/settings/sections/EnvironmentSecretsSection.js.map +1 -0
- package/dist/components/agent/settings/sections/ExportBackupSection.d.ts +3 -0
- package/dist/components/agent/settings/sections/ExportBackupSection.d.ts.map +1 -0
- package/dist/components/agent/settings/sections/ExportBackupSection.js +23 -0
- package/dist/components/agent/settings/sections/ExportBackupSection.js.map +1 -0
- package/dist/components/agent/settings/sections/GeneralSection.d.ts +3 -0
- package/dist/components/agent/settings/sections/GeneralSection.d.ts.map +1 -0
- package/dist/components/agent/settings/sections/GeneralSection.js +15 -0
- package/dist/components/agent/settings/sections/GeneralSection.js.map +1 -0
- package/dist/components/agent/settings/sections/IntegrationsSection.d.ts +3 -0
- package/dist/components/agent/settings/sections/IntegrationsSection.d.ts.map +1 -0
- package/dist/components/agent/settings/sections/IntegrationsSection.js +40 -0
- package/dist/components/agent/settings/sections/IntegrationsSection.js.map +1 -0
- package/dist/components/agent/settings/sections/NotificationsSection.d.ts +3 -0
- package/dist/components/agent/settings/sections/NotificationsSection.d.ts.map +1 -0
- package/dist/components/agent/settings/sections/NotificationsSection.js +28 -0
- package/dist/components/agent/settings/sections/NotificationsSection.js.map +1 -0
- package/dist/components/agent/settings/sections/ResourceLimitsSection.d.ts +3 -0
- package/dist/components/agent/settings/sections/ResourceLimitsSection.d.ts.map +1 -0
- package/dist/components/agent/settings/sections/ResourceLimitsSection.js +17 -0
- package/dist/components/agent/settings/sections/ResourceLimitsSection.js.map +1 -0
- package/dist/components/agent/settings/sections/SecurityComplianceSection.d.ts +3 -0
- package/dist/components/agent/settings/sections/SecurityComplianceSection.d.ts.map +1 -0
- package/dist/components/agent/settings/sections/SecurityComplianceSection.js +28 -0
- package/dist/components/agent/settings/sections/SecurityComplianceSection.js.map +1 -0
- package/dist/components/agent/settings/sections/UsageAnalyticsSection.d.ts +3 -0
- package/dist/components/agent/settings/sections/UsageAnalyticsSection.d.ts.map +1 -0
- package/dist/components/agent/settings/sections/UsageAnalyticsSection.js +17 -0
- package/dist/components/agent/settings/sections/UsageAnalyticsSection.js.map +1 -0
- package/dist/components/agent/settings/sections/WorkspaceDirectoryAccessSection.d.ts +54 -0
- package/dist/components/agent/settings/sections/WorkspaceDirectoryAccessSection.d.ts.map +1 -0
- package/dist/components/agent/settings/sections/WorkspaceDirectoryAccessSection.js +333 -0
- package/dist/components/agent/settings/sections/WorkspaceDirectoryAccessSection.js.map +1 -0
- package/dist/components/agent/settings/shared/CheckboxField.d.ts +13 -0
- package/dist/components/agent/settings/shared/CheckboxField.d.ts.map +1 -0
- package/dist/components/agent/settings/shared/CheckboxField.js +8 -0
- package/dist/components/agent/settings/shared/CheckboxField.js.map +1 -0
- package/dist/components/agent/settings/shared/InputField.d.ts +15 -0
- package/dist/components/agent/settings/shared/InputField.d.ts.map +1 -0
- package/dist/components/agent/settings/shared/InputField.js +7 -0
- package/dist/components/agent/settings/shared/InputField.js.map +1 -0
- package/dist/components/agent/settings/shared/MembersTable.d.ts +11 -0
- package/dist/components/agent/settings/shared/MembersTable.d.ts.map +1 -0
- package/dist/components/agent/settings/shared/MembersTable.js +7 -0
- package/dist/components/agent/settings/shared/MembersTable.js.map +1 -0
- package/dist/components/agent/settings/shared/SettingRow.d.ts +11 -0
- package/dist/components/agent/settings/shared/SettingRow.d.ts.map +1 -0
- package/dist/components/agent/settings/shared/SettingRow.js +6 -0
- package/dist/components/agent/settings/shared/SettingRow.js.map +1 -0
- package/dist/components/agent/settings/shared/SettingsCard.d.ts +11 -0
- package/dist/components/agent/settings/shared/SettingsCard.d.ts.map +1 -0
- package/dist/components/agent/settings/shared/SettingsCard.js +8 -0
- package/dist/components/agent/settings/shared/SettingsCard.js.map +1 -0
- package/dist/components/agent/settings/shared/ToggleSwitch.d.ts +8 -0
- package/dist/components/agent/settings/shared/ToggleSwitch.d.ts.map +1 -0
- package/dist/components/agent/settings/shared/ToggleSwitch.js +6 -0
- package/dist/components/agent/settings/shared/ToggleSwitch.js.map +1 -0
- package/dist/components/agent/settings/shared/UsageChart.d.ts +12 -0
- package/dist/components/agent/settings/shared/UsageChart.d.ts.map +1 -0
- package/dist/components/agent/settings/shared/UsageChart.js +16 -0
- package/dist/components/agent/settings/shared/UsageChart.js.map +1 -0
- package/dist/components/agent/toolCardDisplay.d.ts +24 -0
- package/dist/components/agent/toolCardDisplay.d.ts.map +1 -0
- package/dist/components/agent/toolCardDisplay.js +85 -0
- package/dist/components/agent/toolCardDisplay.js.map +1 -0
- package/dist/components/product/XenoAgentProductHeader.d.ts +18 -0
- package/dist/components/product/XenoAgentProductHeader.d.ts.map +1 -0
- package/dist/components/product/XenoAgentProductHeader.js +25 -0
- package/dist/components/product/XenoAgentProductHeader.js.map +1 -0
- package/dist/components/product/XenoAgentSessionTabs.d.ts +18 -0
- package/dist/components/product/XenoAgentSessionTabs.d.ts.map +1 -0
- package/dist/components/product/XenoAgentSessionTabs.js +103 -0
- package/dist/components/product/XenoAgentSessionTabs.js.map +1 -0
- package/dist/components/ui/CodeBlock.d.ts +8 -0
- package/dist/components/ui/CodeBlock.d.ts.map +1 -0
- package/dist/components/ui/CodeBlock.js +89 -0
- package/dist/components/ui/CodeBlock.js.map +1 -0
- package/dist/components/ui/XenoLogo.d.ts +11 -0
- package/dist/components/ui/XenoLogo.d.ts.map +1 -0
- package/dist/components/ui/XenoLogo.js +9 -0
- package/dist/components/ui/XenoLogo.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +127 -0
- package/dist/index.js.map +1 -0
- package/dist/platformApiTypes.d.ts +3992 -0
- package/dist/platformApiTypes.d.ts.map +1 -0
- package/dist/platformApiTypes.js +2 -0
- package/dist/platformApiTypes.js.map +1 -0
- package/dist/platformBridge.d.ts +9 -0
- package/dist/platformBridge.d.ts.map +1 -0
- package/dist/platformBridge.js +19 -0
- package/dist/platformBridge.js.map +1 -0
- package/dist/providerSelector.d.ts +28 -0
- package/dist/providerSelector.d.ts.map +1 -0
- package/dist/providerSelector.js +104 -0
- package/dist/providerSelector.js.map +1 -0
- package/dist/services/connectionMode.d.ts +13 -0
- package/dist/services/connectionMode.d.ts.map +1 -0
- package/dist/services/connectionMode.js +31 -0
- package/dist/services/connectionMode.js.map +1 -0
- package/dist/sessionTabs.d.ts +48 -0
- package/dist/sessionTabs.d.ts.map +1 -0
- package/dist/sessionTabs.js +106 -0
- package/dist/sessionTabs.js.map +1 -0
- package/dist/stores/acpAgentStore.d.ts +264 -0
- package/dist/stores/acpAgentStore.d.ts.map +1 -0
- package/dist/stores/acpAgentStore.js +825 -0
- package/dist/stores/acpAgentStore.js.map +1 -0
- package/dist/stores/agentChatStore.d.ts +529 -0
- package/dist/stores/agentChatStore.d.ts.map +1 -0
- package/dist/stores/agentChatStore.js +5309 -0
- package/dist/stores/agentChatStore.js.map +1 -0
- package/dist/stores/agentIdeStore.d.ts +9 -0
- package/dist/stores/agentIdeStore.d.ts.map +1 -0
- package/dist/stores/agentIdeStore.js +8 -0
- package/dist/stores/agentIdeStore.js.map +1 -0
- package/dist/stores/agentSearchStore.d.ts +174 -0
- package/dist/stores/agentSearchStore.d.ts.map +1 -0
- package/dist/stores/agentSearchStore.js +305 -0
- package/dist/stores/agentSearchStore.js.map +1 -0
- package/dist/stores/authStore.d.ts +26 -0
- package/dist/stores/authStore.d.ts.map +1 -0
- package/dist/stores/authStore.js +163 -0
- package/dist/stores/authStore.js.map +1 -0
- package/dist/stores/entitySettingsStore.d.ts +236 -0
- package/dist/stores/entitySettingsStore.d.ts.map +1 -0
- package/dist/stores/entitySettingsStore.js +916 -0
- package/dist/stores/entitySettingsStore.js.map +1 -0
- package/dist/stores/permissionStore.d.ts +25 -0
- package/dist/stores/permissionStore.d.ts.map +1 -0
- package/dist/stores/permissionStore.js +58 -0
- package/dist/stores/permissionStore.js.map +1 -0
- package/dist/stores/suggestionStore.d.ts +29 -0
- package/dist/stores/suggestionStore.d.ts.map +1 -0
- package/dist/stores/suggestionStore.js +160 -0
- package/dist/stores/suggestionStore.js.map +1 -0
- package/dist/stores/tabStore.d.ts +30 -0
- package/dist/stores/tabStore.d.ts.map +1 -0
- package/dist/stores/tabStore.js +252 -0
- package/dist/stores/tabStore.js.map +1 -0
- package/dist/stores/themeStore.d.ts +13 -0
- package/dist/stores/themeStore.d.ts.map +1 -0
- package/dist/stores/themeStore.js +77 -0
- package/dist/stores/themeStore.js.map +1 -0
- package/dist/stores/workspaceStore.d.ts +175 -0
- package/dist/stores/workspaceStore.d.ts.map +1 -0
- package/dist/stores/workspaceStore.js +694 -0
- package/dist/stores/workspaceStore.js.map +1 -0
- package/dist/stores/xenoChatStore.d.ts +88 -0
- package/dist/stores/xenoChatStore.d.ts.map +1 -0
- package/dist/stores/xenoChatStore.js +572 -0
- package/dist/stores/xenoChatStore.js.map +1 -0
- package/dist/toolCardProjection.d.ts +33 -0
- package/dist/toolCardProjection.d.ts.map +1 -0
- package/dist/toolCardProjection.js +62 -0
- package/dist/toolCardProjection.js.map +1 -0
- package/dist/types/agentEditor.d.ts +39 -0
- package/dist/types/agentEditor.d.ts.map +1 -0
- package/dist/types/agentEditor.js +2 -0
- package/dist/types/agentEditor.js.map +1 -0
- package/dist/types/agentRuntimeProvider.d.ts +2 -0
- package/dist/types/agentRuntimeProvider.d.ts.map +1 -0
- package/dist/types/agentRuntimeProvider.js +2 -0
- package/dist/types/agentRuntimeProvider.js.map +1 -0
- package/dist/utils/acpExecutionAuthority.d.ts +18 -0
- package/dist/utils/acpExecutionAuthority.d.ts.map +1 -0
- package/dist/utils/acpExecutionAuthority.js +22 -0
- package/dist/utils/acpExecutionAuthority.js.map +1 -0
- package/dist/utils/agentAttachedContextPrompt.d.ts +2 -0
- package/dist/utils/agentAttachedContextPrompt.d.ts.map +1 -0
- package/dist/utils/agentAttachedContextPrompt.js +2 -0
- package/dist/utils/agentAttachedContextPrompt.js.map +1 -0
- package/dist/utils/agentModelContext.d.ts +2 -0
- package/dist/utils/agentModelContext.d.ts.map +1 -0
- package/dist/utils/agentModelContext.js +2 -0
- package/dist/utils/agentModelContext.js.map +1 -0
- package/dist/utils/agentReasoningEffort.d.ts +3 -0
- package/dist/utils/agentReasoningEffort.d.ts.map +1 -0
- package/dist/utils/agentReasoningEffort.js +2 -0
- package/dist/utils/agentReasoningEffort.js.map +1 -0
- package/dist/utils/agentRuntimeProvider.d.ts +3 -0
- package/dist/utils/agentRuntimeProvider.d.ts.map +1 -0
- package/dist/utils/agentRuntimeProvider.js +2 -0
- package/dist/utils/agentRuntimeProvider.js.map +1 -0
- package/dist/utils/cloudModels.d.ts +3 -0
- package/dist/utils/cloudModels.d.ts.map +1 -0
- package/dist/utils/cloudModels.js +181 -0
- package/dist/utils/cloudModels.js.map +1 -0
- package/dist/utils/conversationRuntime.d.ts +3 -0
- package/dist/utils/conversationRuntime.d.ts.map +1 -0
- package/dist/utils/conversationRuntime.js +2 -0
- package/dist/utils/conversationRuntime.js.map +1 -0
- package/dist/utils/fileCreateIntent.d.ts +16 -0
- package/dist/utils/fileCreateIntent.d.ts.map +1 -0
- package/dist/utils/fileCreateIntent.js +123 -0
- package/dist/utils/fileCreateIntent.js.map +1 -0
- package/dist/utils/legacyAgentRuntimeEvents.d.ts +2 -0
- package/dist/utils/legacyAgentRuntimeEvents.d.ts.map +1 -0
- package/dist/utils/legacyAgentRuntimeEvents.js +2 -0
- package/dist/utils/legacyAgentRuntimeEvents.js.map +1 -0
- package/dist/utils/markdownWindowsPaths.d.ts +2 -0
- package/dist/utils/markdownWindowsPaths.d.ts.map +1 -0
- package/dist/utils/markdownWindowsPaths.js +2 -0
- package/dist/utils/markdownWindowsPaths.js.map +1 -0
- package/dist/utils/workspaceSelectionContinuation.d.ts +2 -0
- package/dist/utils/workspaceSelectionContinuation.d.ts.map +1 -0
- package/dist/utils/workspaceSelectionContinuation.js +2 -0
- package/dist/utils/workspaceSelectionContinuation.js.map +1 -0
- package/package.json +53 -0
- package/src/agent.css +1156 -0
- package/src/foundation.css +62 -0
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { getAgentPlatformBridge } from '../../platformBridge';
|
|
3
|
+
/**
|
|
4
|
+
* PluginManager - SDK PluginHost + MCP manager surface.
|
|
5
|
+
*
|
|
6
|
+
* State is owned by the main-process PluginMcpManagerService under ~/.xeno.
|
|
7
|
+
* This renderer only manages UI state and sends scoped commands over IPC.
|
|
8
|
+
*/
|
|
9
|
+
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
10
|
+
import { AlertTriangle, Check, Eye, Package, Pause, Play, PlugZap, Plus, RefreshCw, Search, Server, ShieldAlert, ShieldCheck, Trash2, Upload, Download, } from 'lucide-react';
|
|
11
|
+
function asStringArray(value) {
|
|
12
|
+
return Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : [];
|
|
13
|
+
}
|
|
14
|
+
function asRecord(value) {
|
|
15
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
16
|
+
}
|
|
17
|
+
function asPolicy(value) {
|
|
18
|
+
return value === 'none' || value === 'prompts' || value === 'resources' || value === 'context' || value === 'all' ? value : 'context';
|
|
19
|
+
}
|
|
20
|
+
function asTrust(value, fallback = {}) {
|
|
21
|
+
const record = asRecord(value);
|
|
22
|
+
const state = record.state === 'trusted' || record.state === 'blocked' || record.state === 'review-required' ? record.state : fallback.state || 'review-required';
|
|
23
|
+
const riskLevel = record.riskLevel === 'low' || record.riskLevel === 'medium' || record.riskLevel === 'high' ? record.riskLevel : fallback.riskLevel || 'medium';
|
|
24
|
+
const signatureStatus = record.signatureStatus === 'verified' || record.signatureStatus === 'unsigned' || record.signatureStatus === 'unknown' ? record.signatureStatus : fallback.signatureStatus || 'unknown';
|
|
25
|
+
return {
|
|
26
|
+
state,
|
|
27
|
+
riskLevel,
|
|
28
|
+
signatureStatus,
|
|
29
|
+
integrityHash: typeof record.integrityHash === 'string' ? record.integrityHash : fallback.integrityHash,
|
|
30
|
+
manifestHash: typeof record.manifestHash === 'string' ? record.manifestHash : fallback.manifestHash,
|
|
31
|
+
approvedConfigHash: typeof record.approvedConfigHash === 'string' ? record.approvedConfigHash : fallback.approvedConfigHash,
|
|
32
|
+
currentConfigHash: typeof record.currentConfigHash === 'string' ? record.currentConfigHash : fallback.currentConfigHash,
|
|
33
|
+
configDrift: typeof record.configDrift === 'boolean' ? record.configDrift : fallback.configDrift,
|
|
34
|
+
approvedAt: typeof record.approvedAt === 'number' ? record.approvedAt : fallback.approvedAt,
|
|
35
|
+
deniedAt: typeof record.deniedAt === 'number' ? record.deniedAt : fallback.deniedAt,
|
|
36
|
+
reasons: asStringArray(record.reasons),
|
|
37
|
+
requiresApproval: typeof record.requiresApproval === 'boolean' ? record.requiresApproval : fallback.requiresApproval ?? state !== 'trusted',
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function asPlugin(value) {
|
|
41
|
+
const record = asRecord(value);
|
|
42
|
+
if (typeof record.name !== 'string')
|
|
43
|
+
return null;
|
|
44
|
+
return {
|
|
45
|
+
name: record.name,
|
|
46
|
+
version: typeof record.version === 'string' ? record.version : 'unknown',
|
|
47
|
+
description: typeof record.description === 'string' ? record.description : '',
|
|
48
|
+
status: ['installed', 'active', 'disabled', 'error', 'updating'].includes(String(record.status)) ? record.status : 'installed',
|
|
49
|
+
installedAt: typeof record.installedAt === 'string' ? record.installedAt : '',
|
|
50
|
+
path: typeof record.path === 'string' ? record.path : '',
|
|
51
|
+
capabilities: asStringArray(record.capabilities),
|
|
52
|
+
permissions: asStringArray(record.permissions),
|
|
53
|
+
tools: asStringArray(record.tools),
|
|
54
|
+
prompts: asStringArray(record.prompts),
|
|
55
|
+
commands: asStringArray(record.commands),
|
|
56
|
+
panels: asStringArray(record.panels),
|
|
57
|
+
keywords: asStringArray(record.keywords),
|
|
58
|
+
error: typeof record.error === 'string' ? record.error : undefined,
|
|
59
|
+
trust: asTrust(record.trust, { riskLevel: 'medium', requiresApproval: true }),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function asMcpTool(value, fallbackServer = '') {
|
|
63
|
+
const record = asRecord(value);
|
|
64
|
+
const name = typeof record.name === 'string' ? record.name : '';
|
|
65
|
+
if (!name)
|
|
66
|
+
return null;
|
|
67
|
+
return {
|
|
68
|
+
server: typeof record.server === 'string' ? record.server : fallbackServer,
|
|
69
|
+
name,
|
|
70
|
+
description: typeof record.description === 'string' ? record.description : '',
|
|
71
|
+
inputSchema: asRecord(record.inputSchema),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function asMcpPrompt(value, fallbackServer = '') {
|
|
75
|
+
const record = asRecord(value);
|
|
76
|
+
const name = typeof record.name === 'string' ? record.name : '';
|
|
77
|
+
if (!name)
|
|
78
|
+
return null;
|
|
79
|
+
return {
|
|
80
|
+
server: typeof record.server === 'string' ? record.server : fallbackServer,
|
|
81
|
+
name,
|
|
82
|
+
description: typeof record.description === 'string' ? record.description : '',
|
|
83
|
+
arguments: Array.isArray(record.arguments) ? record.arguments : [],
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function asMcpResource(value, fallbackServer = '') {
|
|
87
|
+
const record = asRecord(value);
|
|
88
|
+
const uri = typeof record.uri === 'string' ? record.uri : '';
|
|
89
|
+
if (!uri)
|
|
90
|
+
return null;
|
|
91
|
+
return {
|
|
92
|
+
server: typeof record.server === 'string' ? record.server : fallbackServer,
|
|
93
|
+
uri,
|
|
94
|
+
name: typeof record.name === 'string' ? record.name : undefined,
|
|
95
|
+
description: typeof record.description === 'string' ? record.description : undefined,
|
|
96
|
+
mimeType: typeof record.mimeType === 'string' ? record.mimeType : undefined,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function asMcpServer(value) {
|
|
100
|
+
const record = asRecord(value);
|
|
101
|
+
if (typeof record.name !== 'string')
|
|
102
|
+
return null;
|
|
103
|
+
const serverName = record.name;
|
|
104
|
+
return {
|
|
105
|
+
name: serverName,
|
|
106
|
+
transport: record.transport === 'sse' ? 'sse' : 'stdio',
|
|
107
|
+
command: typeof record.command === 'string' ? record.command : undefined,
|
|
108
|
+
args: asStringArray(record.args),
|
|
109
|
+
cwd: typeof record.cwd === 'string' ? record.cwd : undefined,
|
|
110
|
+
url: typeof record.url === 'string' ? record.url : undefined,
|
|
111
|
+
approvalRequired: record.approvalRequired !== false,
|
|
112
|
+
approvalState: record.approvalState === 'approved' || record.approvalState === 'denied' ? record.approvalState : undefined,
|
|
113
|
+
disabled: !!record.disabled,
|
|
114
|
+
scope: typeof record.scope === 'string' ? record.scope : 'user',
|
|
115
|
+
source: record.source === 'sdk-config' ? 'sdk-config' : 'hub',
|
|
116
|
+
sourcePath: typeof record.sourcePath === 'string' ? record.sourcePath : '',
|
|
117
|
+
status: ['configured', 'connecting', 'ready', 'error', 'disconnected', 'skipped'].includes(String(record.status)) ? record.status : 'configured',
|
|
118
|
+
tools: Array.isArray(record.tools) ? record.tools.map((tool) => asMcpTool(tool, serverName)).filter((tool) => !!tool) : [],
|
|
119
|
+
prompts: Array.isArray(record.prompts) ? record.prompts.map((prompt) => asMcpPrompt(prompt, serverName)).filter((prompt) => !!prompt) : [],
|
|
120
|
+
resources: Array.isArray(record.resources) ? record.resources.map((resource) => asMcpResource(resource, serverName)).filter((resource) => !!resource) : [],
|
|
121
|
+
trust: asTrust(record.trust, { state: record.approvalState === 'approved' ? 'trusted' : 'review-required', riskLevel: record.transport === 'sse' ? 'medium' : 'high', requiresApproval: record.approvalState !== 'approved' }),
|
|
122
|
+
error: typeof record.error === 'string' ? record.error : undefined,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function asScopedPolicy(value) {
|
|
126
|
+
const record = asRecord(value);
|
|
127
|
+
const scopeRecord = asRecord(record.scope);
|
|
128
|
+
const type = scopeRecord.type === 'workspace' || scopeRecord.type === 'team' || scopeRecord.type === 'agent' || scopeRecord.type === 'global'
|
|
129
|
+
? scopeRecord.type
|
|
130
|
+
: 'global';
|
|
131
|
+
if (typeof record.id !== 'string')
|
|
132
|
+
return null;
|
|
133
|
+
return {
|
|
134
|
+
id: record.id,
|
|
135
|
+
scope: {
|
|
136
|
+
type,
|
|
137
|
+
workspaceId: typeof scopeRecord.workspaceId === 'string' ? scopeRecord.workspaceId : undefined,
|
|
138
|
+
teamId: typeof scopeRecord.teamId === 'string' ? scopeRecord.teamId : undefined,
|
|
139
|
+
agentId: typeof scopeRecord.agentId === 'string' ? scopeRecord.agentId : undefined,
|
|
140
|
+
},
|
|
141
|
+
pluginAllowlist: asStringArray(record.pluginAllowlist),
|
|
142
|
+
pluginDenylist: asStringArray(record.pluginDenylist),
|
|
143
|
+
mcpServerAllowlist: asStringArray(record.mcpServerAllowlist),
|
|
144
|
+
mcpServerDenylist: asStringArray(record.mcpServerDenylist),
|
|
145
|
+
mcpRegistryPolicy: record.mcpRegistryPolicy ? asPolicy(record.mcpRegistryPolicy) : undefined,
|
|
146
|
+
enabled: record.enabled !== false,
|
|
147
|
+
updatedAt: typeof record.updatedAt === 'number' ? record.updatedAt : 0,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
function asSnapshot(value) {
|
|
151
|
+
const record = asRecord(value);
|
|
152
|
+
const plugins = Array.isArray(record.plugins) ? record.plugins.map(asPlugin).filter((plugin) => !!plugin) : [];
|
|
153
|
+
const mcpServers = Array.isArray(record.mcpServers) ? record.mcpServers.map(asMcpServer).filter((server) => !!server) : [];
|
|
154
|
+
const mcpTools = Array.isArray(record.mcpTools) ? record.mcpTools.map((tool) => asMcpTool(tool)).filter((tool) => !!tool) : mcpServers.flatMap((server) => server.tools);
|
|
155
|
+
const mcpPrompts = Array.isArray(record.mcpPrompts) ? record.mcpPrompts.map((prompt) => asMcpPrompt(prompt)).filter((prompt) => !!prompt) : mcpServers.flatMap((server) => server.prompts);
|
|
156
|
+
const mcpResources = Array.isArray(record.mcpResources) ? record.mcpResources.map((resource) => asMcpResource(resource)).filter((resource) => !!resource) : mcpServers.flatMap((server) => server.resources);
|
|
157
|
+
const scopedPolicies = Array.isArray(record.scopedPolicies) ? record.scopedPolicies.map(asScopedPolicy).filter((policy) => !!policy) : [];
|
|
158
|
+
const effectiveRecord = asRecord(record.effectivePolicy);
|
|
159
|
+
return {
|
|
160
|
+
plugins,
|
|
161
|
+
activePluginTools: asStringArray(record.activePluginTools),
|
|
162
|
+
mcpServers,
|
|
163
|
+
mcpTools,
|
|
164
|
+
mcpPrompts,
|
|
165
|
+
mcpResources,
|
|
166
|
+
mcpRegistryPolicy: asPolicy(record.mcpRegistryPolicy),
|
|
167
|
+
scopedPolicies,
|
|
168
|
+
effectivePolicy: {
|
|
169
|
+
caller: asRecord(effectiveRecord.caller),
|
|
170
|
+
mcpRegistryPolicy: asPolicy(effectiveRecord.mcpRegistryPolicy || record.mcpRegistryPolicy),
|
|
171
|
+
pluginAllowlist: asStringArray(effectiveRecord.pluginAllowlist),
|
|
172
|
+
pluginDenylist: asStringArray(effectiveRecord.pluginDenylist),
|
|
173
|
+
mcpServerAllowlist: asStringArray(effectiveRecord.mcpServerAllowlist),
|
|
174
|
+
mcpServerDenylist: asStringArray(effectiveRecord.mcpServerDenylist),
|
|
175
|
+
matchedPolicyIds: asStringArray(effectiveRecord.matchedPolicyIds),
|
|
176
|
+
},
|
|
177
|
+
stats: {
|
|
178
|
+
pluginCount: plugins.length,
|
|
179
|
+
activePluginCount: plugins.filter((plugin) => plugin.status === 'active').length,
|
|
180
|
+
activePluginToolCount: asStringArray(record.activePluginTools).length,
|
|
181
|
+
mcpServerCount: mcpServers.length,
|
|
182
|
+
connectedMcpServerCount: mcpServers.filter((server) => server.status === 'ready').length,
|
|
183
|
+
mcpToolCount: mcpTools.length,
|
|
184
|
+
mcpPromptCount: mcpPrompts.length,
|
|
185
|
+
mcpResourceCount: mcpResources.length,
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function asMarketplaceListing(value) {
|
|
190
|
+
const record = asRecord(value);
|
|
191
|
+
if (typeof record.name !== 'string')
|
|
192
|
+
return null;
|
|
193
|
+
return {
|
|
194
|
+
name: record.name,
|
|
195
|
+
version: typeof record.version === 'string' ? record.version : 'latest',
|
|
196
|
+
description: typeof record.description === 'string' ? record.description : '',
|
|
197
|
+
keywords: asStringArray(record.keywords),
|
|
198
|
+
verified: record.verified === true,
|
|
199
|
+
downloads: typeof record.downloads === 'number' ? record.downloads : undefined,
|
|
200
|
+
rating: typeof record.rating === 'number' ? record.rating : undefined,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
function statusTone(status) {
|
|
204
|
+
if (status === 'active' || status === 'ready' || status === 'approved' || status === 'success' || status === 'trusted')
|
|
205
|
+
return 'text-emerald-300/80 bg-emerald-400/[0.08] border-emerald-300/[0.12]';
|
|
206
|
+
if (status === 'error' || status === 'denied' || status === 'blocked' || status === 'high')
|
|
207
|
+
return 'text-red-300/80 bg-red-400/[0.08] border-red-300/[0.12]';
|
|
208
|
+
if (status === 'connecting' || status === 'updating' || status === 'info' || status === 'review-required' || status === 'medium')
|
|
209
|
+
return 'text-amber-300/80 bg-amber-400/[0.08] border-amber-300/[0.12]';
|
|
210
|
+
return 'text-white/45 bg-white/[0.04] border-white/[0.08]';
|
|
211
|
+
}
|
|
212
|
+
function Pill({ children, tone }) {
|
|
213
|
+
return (_jsx("span", { className: `px-1.5 py-0.5 border rounded-sm text-[10px] font-mono ${tone || 'text-white/35 bg-white/[0.04] border-white/[0.07]'}`, children: children }));
|
|
214
|
+
}
|
|
215
|
+
function csvToList(value) {
|
|
216
|
+
return value.split(',').map((entry) => entry.trim()).filter(Boolean);
|
|
217
|
+
}
|
|
218
|
+
function listToCsv(value) {
|
|
219
|
+
return value.join(', ');
|
|
220
|
+
}
|
|
221
|
+
function formatJson(value) {
|
|
222
|
+
try {
|
|
223
|
+
return JSON.stringify(value, null, 2);
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
return String(value);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
function formatMcpResponse(result) {
|
|
230
|
+
const preview = asRecord(result.preview);
|
|
231
|
+
const metadata = asRecord(preview.metadata);
|
|
232
|
+
const redactedFields = asStringArray(metadata.redactedFields);
|
|
233
|
+
const warnings = asStringArray(metadata.riskWarnings);
|
|
234
|
+
const previewText = typeof preview.textPreview === 'string' ? preview.textPreview : '';
|
|
235
|
+
const meta = [
|
|
236
|
+
`audit: ${result.auditId || 'not-recorded'}`,
|
|
237
|
+
`kind: ${typeof preview.kind === 'string' ? preview.kind : 'unknown'}`,
|
|
238
|
+
`source: ${typeof metadata.source === 'string' ? metadata.source : 'unknown'}`,
|
|
239
|
+
`content-types: ${asStringArray(metadata.contentTypes).join(', ') || 'unknown'}`,
|
|
240
|
+
`items: ${typeof preview.itemCount === 'number' ? preview.itemCount : 0}`,
|
|
241
|
+
`bytes: ${typeof preview.byteLength === 'number' ? preview.byteLength : 0}`,
|
|
242
|
+
`preview-bytes: ${typeof metadata.previewByteLength === 'number' ? metadata.previewByteLength : 0}`,
|
|
243
|
+
metadata.redacted === true ? `redacted: yes (${redactedFields.join(', ') || 'sensitive fields'})` : 'redacted: no',
|
|
244
|
+
preview.truncated === true ? 'truncated: yes' : 'truncated: no',
|
|
245
|
+
warnings.length > 0 ? `warnings: ${warnings.join(' | ')}` : 'warnings: none',
|
|
246
|
+
].join('\n');
|
|
247
|
+
return `${meta}\n\n${previewText || formatJson(result.result)}`;
|
|
248
|
+
}
|
|
249
|
+
function formatMcpError(result, fallback) {
|
|
250
|
+
const denial = asRecord(result.denial);
|
|
251
|
+
const reasons = asStringArray(denial.reasons);
|
|
252
|
+
const remediation = Array.isArray(denial.remediation)
|
|
253
|
+
? denial.remediation.map((item) => {
|
|
254
|
+
const record = asRecord(item);
|
|
255
|
+
return typeof record.label === 'string' && typeof record.description === 'string'
|
|
256
|
+
? `${record.label}: ${record.description}`
|
|
257
|
+
: '';
|
|
258
|
+
}).filter(Boolean)
|
|
259
|
+
: [];
|
|
260
|
+
return [
|
|
261
|
+
result.error || (typeof denial.message === 'string' ? denial.message : fallback),
|
|
262
|
+
reasons.length > 0 ? `Reasons:\n${reasons.map((reason) => `- ${reason}`).join('\n')}` : '',
|
|
263
|
+
remediation.length > 0 ? `Remediation:\n${remediation.map((item) => `- ${item}`).join('\n')}` : '',
|
|
264
|
+
].filter(Boolean).join('\n\n');
|
|
265
|
+
}
|
|
266
|
+
function parseJsonObject(value) {
|
|
267
|
+
const trimmed = value.trim();
|
|
268
|
+
if (!trimmed)
|
|
269
|
+
return {};
|
|
270
|
+
const parsed = JSON.parse(trimmed);
|
|
271
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
|
|
272
|
+
}
|
|
273
|
+
function scopeLabel(scope) {
|
|
274
|
+
if (scope.type === 'agent')
|
|
275
|
+
return `agent:${scope.workspaceId || '*'}:${scope.teamId || '*'}:${scope.agentId || '*'}`;
|
|
276
|
+
if (scope.type === 'team')
|
|
277
|
+
return `team:${scope.workspaceId || '*'}:${scope.teamId || '*'}`;
|
|
278
|
+
if (scope.type === 'workspace')
|
|
279
|
+
return `workspace:${scope.workspaceId || '*'}`;
|
|
280
|
+
return 'global';
|
|
281
|
+
}
|
|
282
|
+
export function PluginManager({ className = '', caller }) {
|
|
283
|
+
const [tab, setTab] = useState('plugins');
|
|
284
|
+
const [snapshot, setSnapshot] = useState(() => asSnapshot(null));
|
|
285
|
+
const [loading, setLoading] = useState(true);
|
|
286
|
+
const [busy, setBusy] = useState(null);
|
|
287
|
+
const [error, setError] = useState(null);
|
|
288
|
+
const [installInput, setInstallInput] = useState('');
|
|
289
|
+
const [marketplaceQuery, setMarketplaceQuery] = useState('');
|
|
290
|
+
const [marketplaceResults, setMarketplaceResults] = useState([]);
|
|
291
|
+
const [mcpName, setMcpName] = useState('');
|
|
292
|
+
const [mcpTransport, setMcpTransport] = useState('stdio');
|
|
293
|
+
const [mcpTarget, setMcpTarget] = useState('');
|
|
294
|
+
const [mcpArgs, setMcpArgs] = useState('');
|
|
295
|
+
const [scopeType, setScopeType] = useState('agent');
|
|
296
|
+
const [scopeWorkspaceId, setScopeWorkspaceId] = useState(caller?.workspaceId || '');
|
|
297
|
+
const [scopeTeamId, setScopeTeamId] = useState(caller?.teamId || '');
|
|
298
|
+
const [scopeAgentId, setScopeAgentId] = useState(caller?.agentId || '');
|
|
299
|
+
const [policyPluginAllow, setPolicyPluginAllow] = useState('');
|
|
300
|
+
const [policyPluginDeny, setPolicyPluginDeny] = useState('');
|
|
301
|
+
const [policyMcpAllow, setPolicyMcpAllow] = useState('');
|
|
302
|
+
const [policyMcpDeny, setPolicyMcpDeny] = useState('');
|
|
303
|
+
const [policyMcpExposure, setPolicyMcpExposure] = useState('context');
|
|
304
|
+
const [projectCwd, setProjectCwd] = useState(caller?.allowedDirectories?.[0] || '');
|
|
305
|
+
const [mcpInputJson, setMcpInputJson] = useState('{}');
|
|
306
|
+
const [resultPanel, setResultPanel] = useState(null);
|
|
307
|
+
useEffect(() => {
|
|
308
|
+
setScopeWorkspaceId(caller?.workspaceId || '');
|
|
309
|
+
setScopeTeamId(caller?.teamId || '');
|
|
310
|
+
setScopeAgentId(caller?.agentId || '');
|
|
311
|
+
setProjectCwd((current) => current || caller?.allowedDirectories?.[0] || '');
|
|
312
|
+
}, [caller?.agentId, caller?.allowedDirectories, caller?.teamId, caller?.workspaceId]);
|
|
313
|
+
const snapshotRequest = useMemo(() => ({
|
|
314
|
+
includeSdkConfigured: true,
|
|
315
|
+
cwd: caller?.allowedDirectories?.[0],
|
|
316
|
+
workspaceId: caller?.workspaceId,
|
|
317
|
+
teamId: caller?.teamId,
|
|
318
|
+
agentId: caller?.agentId,
|
|
319
|
+
allowedDirectories: caller?.allowedDirectories,
|
|
320
|
+
}), [caller?.agentId, caller?.allowedDirectories, caller?.teamId, caller?.workspaceId]);
|
|
321
|
+
const loadSnapshot = useCallback(async () => {
|
|
322
|
+
setLoading(true);
|
|
323
|
+
setError(null);
|
|
324
|
+
try {
|
|
325
|
+
const result = await getAgentPlatformBridge().pluginMcp.snapshot(snapshotRequest);
|
|
326
|
+
if (!result.success)
|
|
327
|
+
throw new Error('Failed to load plugin/MCP manager state.');
|
|
328
|
+
setSnapshot(asSnapshot(result.snapshot));
|
|
329
|
+
}
|
|
330
|
+
catch (err) {
|
|
331
|
+
setError(err instanceof Error ? err.message : 'Failed to load plugin/MCP manager state.');
|
|
332
|
+
}
|
|
333
|
+
finally {
|
|
334
|
+
setLoading(false);
|
|
335
|
+
}
|
|
336
|
+
}, [snapshotRequest]);
|
|
337
|
+
useEffect(() => {
|
|
338
|
+
void loadSnapshot();
|
|
339
|
+
}, [loadSnapshot]);
|
|
340
|
+
const runAction = useCallback(async (label, action) => {
|
|
341
|
+
setBusy(label);
|
|
342
|
+
setError(null);
|
|
343
|
+
try {
|
|
344
|
+
const result = await action();
|
|
345
|
+
if (!result.success)
|
|
346
|
+
throw new Error(result.error || `${label} failed.`);
|
|
347
|
+
if (result.snapshot)
|
|
348
|
+
setSnapshot(asSnapshot(result.snapshot));
|
|
349
|
+
else
|
|
350
|
+
await loadSnapshot();
|
|
351
|
+
}
|
|
352
|
+
catch (err) {
|
|
353
|
+
setError(err instanceof Error ? err.message : `${label} failed.`);
|
|
354
|
+
}
|
|
355
|
+
finally {
|
|
356
|
+
setBusy(null);
|
|
357
|
+
}
|
|
358
|
+
}, [loadSnapshot]);
|
|
359
|
+
const activePluginCount = useMemo(() => snapshot.plugins.filter((plugin) => plugin.status === 'active').length, [snapshot.plugins]);
|
|
360
|
+
const buildScope = useCallback(() => ({
|
|
361
|
+
type: scopeType,
|
|
362
|
+
workspaceId: scopeType === 'global' ? undefined : scopeWorkspaceId.trim() || undefined,
|
|
363
|
+
teamId: scopeType === 'team' || scopeType === 'agent' ? scopeTeamId.trim() || undefined : undefined,
|
|
364
|
+
agentId: scopeType === 'agent' ? scopeAgentId.trim() || undefined : undefined,
|
|
365
|
+
}), [scopeAgentId, scopeTeamId, scopeType, scopeWorkspaceId]);
|
|
366
|
+
const installPlugin = async (value = installInput) => {
|
|
367
|
+
const input = value.trim();
|
|
368
|
+
if (!input)
|
|
369
|
+
return;
|
|
370
|
+
const looksLocal = /^[a-zA-Z]:[\\/]/.test(input) || input.startsWith('\\\\') || input.startsWith('/') || input.includes('\\');
|
|
371
|
+
await runAction('install plugin', async () => looksLocal
|
|
372
|
+
? getAgentPlatformBridge().pluginMcp.installLocalPlugin({ pluginPath: input, caller })
|
|
373
|
+
: getAgentPlatformBridge().pluginMcp.installPlugin({ packageName: input, caller }));
|
|
374
|
+
setInstallInput('');
|
|
375
|
+
};
|
|
376
|
+
const searchMarketplace = async () => {
|
|
377
|
+
setBusy('search marketplace');
|
|
378
|
+
setError(null);
|
|
379
|
+
try {
|
|
380
|
+
const result = await getAgentPlatformBridge().pluginMcp.searchMarketplace({ query: marketplaceQuery.trim(), limit: 24, caller });
|
|
381
|
+
if (!result.success)
|
|
382
|
+
throw new Error(result.error || 'Marketplace search failed.');
|
|
383
|
+
setMarketplaceResults((Array.isArray(result.listings) ? result.listings : []).map(asMarketplaceListing).filter((listing) => !!listing));
|
|
384
|
+
}
|
|
385
|
+
catch (err) {
|
|
386
|
+
setError(err instanceof Error ? err.message : 'Marketplace search failed.');
|
|
387
|
+
}
|
|
388
|
+
finally {
|
|
389
|
+
setBusy(null);
|
|
390
|
+
}
|
|
391
|
+
};
|
|
392
|
+
const addMcpServer = async () => {
|
|
393
|
+
const name = mcpName.trim();
|
|
394
|
+
const target = mcpTarget.trim();
|
|
395
|
+
if (!name || !target)
|
|
396
|
+
return;
|
|
397
|
+
await runAction('add MCP server', async () => getAgentPlatformBridge().pluginMcp.upsertMcpServer({
|
|
398
|
+
caller,
|
|
399
|
+
server: {
|
|
400
|
+
name,
|
|
401
|
+
transport: mcpTransport,
|
|
402
|
+
...(mcpTransport === 'stdio'
|
|
403
|
+
? { command: target, args: mcpArgs.trim().split(/\s+/).filter(Boolean) }
|
|
404
|
+
: { url: target }),
|
|
405
|
+
approvalRequired: true,
|
|
406
|
+
},
|
|
407
|
+
}));
|
|
408
|
+
setMcpName('');
|
|
409
|
+
setMcpTarget('');
|
|
410
|
+
setMcpArgs('');
|
|
411
|
+
};
|
|
412
|
+
const saveScopedPolicy = async () => {
|
|
413
|
+
await runAction('save scoped policy', async () => getAgentPlatformBridge().pluginMcp.setScopedPolicy({
|
|
414
|
+
caller,
|
|
415
|
+
policy: {
|
|
416
|
+
scope: buildScope(),
|
|
417
|
+
pluginAllowlist: csvToList(policyPluginAllow),
|
|
418
|
+
pluginDenylist: csvToList(policyPluginDeny),
|
|
419
|
+
mcpServerAllowlist: csvToList(policyMcpAllow),
|
|
420
|
+
mcpServerDenylist: csvToList(policyMcpDeny),
|
|
421
|
+
mcpRegistryPolicy: policyMcpExposure,
|
|
422
|
+
enabled: true,
|
|
423
|
+
},
|
|
424
|
+
}));
|
|
425
|
+
};
|
|
426
|
+
const syncProjectMcp = async (direction) => {
|
|
427
|
+
await runAction(`${direction} project MCP`, async () => getAgentPlatformBridge().pluginMcp.syncProjectMcp({
|
|
428
|
+
cwd: projectCwd,
|
|
429
|
+
direction,
|
|
430
|
+
caller,
|
|
431
|
+
}));
|
|
432
|
+
};
|
|
433
|
+
const previewTool = async (tool) => {
|
|
434
|
+
setBusy(`call ${tool.name}`);
|
|
435
|
+
setResultPanel(null);
|
|
436
|
+
setError(null);
|
|
437
|
+
try {
|
|
438
|
+
const input = parseJsonObject(mcpInputJson);
|
|
439
|
+
const result = await getAgentPlatformBridge().pluginMcp.callMcpTool({ serverName: tool.server, toolName: tool.name, input, caller });
|
|
440
|
+
if (!result.success) {
|
|
441
|
+
setResultPanel({ title: `tool:${tool.server}/${tool.name}`, status: 'error', body: formatMcpError(result, `MCP tool ${tool.name} failed.`) });
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
setResultPanel({ title: `tool:${tool.server}/${tool.name}`, status: 'success', body: formatMcpResponse(result) });
|
|
445
|
+
}
|
|
446
|
+
catch (err) {
|
|
447
|
+
setResultPanel({ title: `tool:${tool.server}/${tool.name}`, status: 'error', body: err instanceof Error ? err.message : 'Tool call failed.' });
|
|
448
|
+
}
|
|
449
|
+
finally {
|
|
450
|
+
setBusy(null);
|
|
451
|
+
}
|
|
452
|
+
};
|
|
453
|
+
const previewPrompt = async (prompt) => {
|
|
454
|
+
setBusy(`prompt ${prompt.name}`);
|
|
455
|
+
setResultPanel(null);
|
|
456
|
+
setError(null);
|
|
457
|
+
try {
|
|
458
|
+
const input = parseJsonObject(mcpInputJson);
|
|
459
|
+
const result = await getAgentPlatformBridge().pluginMcp.getMcpPrompt({ serverName: prompt.server, promptName: prompt.name, input, caller });
|
|
460
|
+
if (!result.success) {
|
|
461
|
+
setResultPanel({ title: `prompt:${prompt.server}/${prompt.name}`, status: 'error', body: formatMcpError(result, `MCP prompt ${prompt.name} failed.`) });
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
setResultPanel({ title: `prompt:${prompt.server}/${prompt.name}`, status: 'success', body: formatMcpResponse(result) });
|
|
465
|
+
}
|
|
466
|
+
catch (err) {
|
|
467
|
+
setResultPanel({ title: `prompt:${prompt.server}/${prompt.name}`, status: 'error', body: err instanceof Error ? err.message : 'Prompt preview failed.' });
|
|
468
|
+
}
|
|
469
|
+
finally {
|
|
470
|
+
setBusy(null);
|
|
471
|
+
}
|
|
472
|
+
};
|
|
473
|
+
const previewResource = async (resource) => {
|
|
474
|
+
setBusy(`resource ${resource.name || resource.uri}`);
|
|
475
|
+
setResultPanel(null);
|
|
476
|
+
setError(null);
|
|
477
|
+
try {
|
|
478
|
+
const result = await getAgentPlatformBridge().pluginMcp.readMcpResource({ serverName: resource.server, uri: resource.uri, caller });
|
|
479
|
+
if (!result.success) {
|
|
480
|
+
setResultPanel({ title: `resource:${resource.server}/${resource.name || resource.uri}`, status: 'error', body: formatMcpError(result, `MCP resource ${resource.uri} failed.`) });
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
setResultPanel({ title: `resource:${resource.server}/${resource.name || resource.uri}`, status: 'success', body: formatMcpResponse(result) });
|
|
484
|
+
}
|
|
485
|
+
catch (err) {
|
|
486
|
+
setResultPanel({ title: `resource:${resource.server}/${resource.name || resource.uri}`, status: 'error', body: err instanceof Error ? err.message : 'Resource preview failed.' });
|
|
487
|
+
}
|
|
488
|
+
finally {
|
|
489
|
+
setBusy(null);
|
|
490
|
+
}
|
|
491
|
+
};
|
|
492
|
+
return (_jsxs("div", { className: `flex flex-col h-full bg-[#151515] ${className}`, children: [_jsxs("div", { className: "px-4 py-3 border-b border-white/[0.06] flex items-center justify-between", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Package, { className: "w-4 h-4 text-white/45", strokeWidth: 1.5 }), _jsx("span", { className: "text-[13px] font-medium text-white/75", children: "PluginHost / MCP" }), _jsxs(Pill, { children: [snapshot.stats.pluginCount, " plugins"] }), _jsxs(Pill, { children: [snapshot.stats.mcpServerCount, " mcp"] }), _jsxs(Pill, { tone: statusTone('info'), children: [snapshot.effectivePolicy.matchedPolicyIds.length, " scoped policies"] })] }), _jsx("button", { onClick: () => void loadSnapshot(), disabled: loading || !!busy, className: "p-1 text-white/35 hover:text-white/70 disabled:opacity-30 transition-colors", "aria-label": "Refresh plugin and MCP state", children: _jsx(RefreshCw, { className: `w-3.5 h-3.5 ${loading ? 'animate-spin' : ''}`, strokeWidth: 1.5 }) })] }), _jsxs("div", { className: "px-4 py-2 border-b border-white/[0.06] flex items-center gap-2", children: [['marketplace', 'plugins', 'mcp'].map((item) => (_jsx("button", { onClick: () => setTab(item), className: `px-2 py-1 text-[11px] border rounded-sm transition-colors ${tab === item ? 'text-white/80 bg-white/[0.08] border-white/[0.14]' : 'text-white/35 border-white/[0.06] hover:text-white/60'}`, children: item === 'mcp' ? 'MCP Servers' : item[0].toUpperCase() + item.slice(1) }, item))), _jsx("span", { className: "ml-auto text-[10px] text-white/25", children: busy ? `Working: ${busy}` : `${activePluginCount} active plugins, ${snapshot.stats.connectedMcpServerCount} connected MCP servers` })] }), error && (_jsxs("div", { className: "mx-4 mt-3 px-3 py-2 border border-red-300/[0.12] bg-red-400/[0.06] text-[11px] text-red-200/80 flex items-center gap-2", children: [_jsx(AlertTriangle, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }), error] })), tab === 'marketplace' && (_jsxs("div", { className: "flex-1 min-h-0 flex flex-col", children: [_jsxs("div", { className: "px-4 py-3 border-b border-white/[0.06] flex gap-2", children: [_jsx("input", { value: marketplaceQuery, onChange: (event) => setMarketplaceQuery(event.target.value), onKeyDown: (event) => { if (event.key === 'Enter')
|
|
493
|
+
void searchMarketplace(); }, placeholder: "Search SDK marketplace packages...", className: "flex-1 px-2.5 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 focus:outline-none focus:border-white/[0.18]" }), _jsxs("button", { onClick: () => void searchMarketplace(), disabled: !!busy, className: "px-2.5 py-1.5 text-[11px] text-white/65 bg-white/[0.08] border border-white/[0.10] rounded-sm hover:bg-white/[0.14] disabled:opacity-30 flex items-center gap-1", children: [_jsx(Search, { className: "w-3 h-3", strokeWidth: 1.5 }), "Search"] })] }), _jsx("div", { className: "flex-1 overflow-auto divide-y divide-white/[0.05]", children: marketplaceResults.length === 0 ? (_jsxs("div", { className: "px-4 py-10 text-center", children: [_jsx(Package, { className: "w-9 h-9 text-white/10 mx-auto mb-3", strokeWidth: 1.5 }), _jsx("p", { className: "text-[12px] text-white/35", children: "Search the SDK marketplace" }), _jsx("p", { className: "text-[11px] text-white/20 mt-1", children: "Install verified or internal plugin packages into the durable Hub PluginHost." })] })) : marketplaceResults.map((listing) => (_jsx("div", { className: "px-4 py-3 hover:bg-white/[0.02]", children: _jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(PlugZap, { className: "w-3.5 h-3.5 text-white/35", strokeWidth: 1.5 }), _jsx("span", { className: "text-[12px] text-white/80 font-mono truncate", children: listing.name }), _jsxs(Pill, { children: ["v", listing.version] }), listing.verified && _jsx(Pill, { tone: statusTone('success'), children: "verified" })] }), _jsx("p", { className: "text-[11px] text-white/40 mt-1", children: listing.description || 'No description provided.' }), _jsxs("div", { className: "flex flex-wrap gap-1 mt-2", children: [(listing.keywords || []).slice(0, 8).map((keyword) => _jsx(Pill, { children: keyword }, keyword)), typeof listing.downloads === 'number' && _jsxs(Pill, { children: [listing.downloads.toLocaleString(), " downloads"] })] })] }), _jsx("button", { onClick: () => void installPlugin(listing.name), disabled: !!busy, className: "px-2.5 py-1.5 text-[11px] text-white/65 bg-white/[0.08] border border-white/[0.10] rounded-sm hover:bg-white/[0.14] disabled:opacity-30 shrink-0", children: "Install" })] }) }, listing.name))) })] })), tab === 'plugins' && (_jsxs("div", { className: "flex-1 min-h-0 flex flex-col", children: [_jsx("div", { className: "px-4 py-3 border-b border-white/[0.06]", children: _jsxs("div", { className: "flex gap-2", children: [_jsx("input", { value: installInput, onChange: (event) => setInstallInput(event.target.value), onKeyDown: (event) => { if (event.key === 'Enter')
|
|
494
|
+
void installPlugin(); }, placeholder: "npm package or local plugin path...", className: "flex-1 px-2.5 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 focus:outline-none focus:border-white/[0.18]", disabled: !!busy }), _jsxs("button", { onClick: () => void installPlugin(), disabled: !!busy || !installInput.trim(), className: "px-2.5 py-1.5 text-[11px] text-white/65 bg-white/[0.08] border border-white/[0.10] rounded-sm hover:bg-white/[0.14] disabled:opacity-30 flex items-center gap-1", children: [_jsx(Plus, { className: "w-3 h-3", strokeWidth: 1.5 }), "Install"] })] }) }), _jsx("div", { className: "flex-1 overflow-auto", children: loading ? (_jsx("div", { className: "px-4 py-8 text-center text-[12px] text-white/30", children: "Loading PluginHost state..." })) : snapshot.plugins.length === 0 ? (_jsxs("div", { className: "px-4 py-10 text-center", children: [_jsx(Package, { className: "w-9 h-9 text-white/10 mx-auto mb-3", strokeWidth: 1.5 }), _jsx("p", { className: "text-[12px] text-white/35", children: "No SDK plugins installed" }), _jsx("p", { className: "text-[11px] text-white/20 mt-1", children: "Install a local plugin path or npm package to extend agent capabilities." })] })) : (_jsx("div", { className: "divide-y divide-white/[0.05]", children: snapshot.plugins.map((plugin) => (_jsx("div", { className: "px-4 py-3 hover:bg-white/[0.02]", children: _jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(PlugZap, { className: "w-3.5 h-3.5 text-white/35", strokeWidth: 1.5 }), _jsx("span", { className: "text-[12px] text-white/80 font-mono truncate", children: plugin.name }), _jsxs(Pill, { children: ["v", plugin.version] }), _jsx(Pill, { tone: statusTone(plugin.status), children: plugin.status }), _jsx(Pill, { tone: statusTone(plugin.trust.state), children: plugin.trust.state }), _jsxs(Pill, { tone: statusTone(plugin.trust.riskLevel), children: ["risk:", plugin.trust.riskLevel] }), snapshot.effectivePolicy.pluginDenylist.includes(plugin.name) && _jsx(Pill, { tone: statusTone('error'), children: "denied in scope" })] }), _jsx("p", { className: "text-[11px] text-white/40 mt-1 truncate", children: plugin.description || plugin.path }), plugin.trust.reasons.length > 0 && (_jsx("p", { className: "text-[10px] text-white/28 mt-1 truncate", children: plugin.trust.reasons.join(' ') })), _jsxs("div", { className: "flex flex-wrap gap-1 mt-2", children: [plugin.capabilities.map((capability) => _jsx(Pill, { children: capability }, capability)), plugin.tools.slice(0, 8).map((tool) => _jsx(Pill, { tone: "text-cyan-200/70 bg-cyan-400/[0.07] border-cyan-300/[0.10]", children: tool }, tool))] }), plugin.error && _jsx("p", { className: "text-[11px] text-red-300/70 mt-2", children: plugin.error })] }), _jsxs("div", { className: "flex items-center gap-1 shrink-0", children: [plugin.trust.state !== 'trusted' && (_jsx("button", { onClick: () => void runAction(`trust ${plugin.name}`, () => getAgentPlatformBridge().pluginMcp.setPluginTrust({ name: plugin.name, decision: 'approved', caller })), className: "p-1.5 text-white/30 hover:text-emerald-200/80", "aria-label": `Trust ${plugin.name}`, children: _jsx(ShieldCheck, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) })), plugin.trust.state !== 'blocked' && (_jsx("button", { onClick: () => void runAction(`block ${plugin.name}`, () => getAgentPlatformBridge().pluginMcp.setPluginTrust({ name: plugin.name, decision: 'denied', caller })), className: "p-1.5 text-white/25 hover:text-amber-200/80", "aria-label": `Block ${plugin.name}`, children: _jsx(ShieldAlert, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) })), plugin.status === 'active' ? (_jsx("button", { onClick: () => void runAction(`deactivate ${plugin.name}`, () => getAgentPlatformBridge().pluginMcp.deactivatePlugin({ name: plugin.name, caller })), className: "p-1.5 text-white/35 hover:text-amber-200/80", "aria-label": `Deactivate ${plugin.name}`, children: _jsx(Pause, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) })) : (_jsx("button", { onClick: () => void runAction(`activate ${plugin.name}`, () => getAgentPlatformBridge().pluginMcp.activatePlugin({ name: plugin.name, caller })), disabled: plugin.trust.state !== 'trusted', className: "p-1.5 text-white/35 hover:text-emerald-200/80 disabled:opacity-25 disabled:hover:text-white/35", "aria-label": `Activate ${plugin.name}`, children: _jsx(Play, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) })), _jsx("button", { onClick: () => void runAction(`remove ${plugin.name}`, () => getAgentPlatformBridge().pluginMcp.uninstallPlugin({ name: plugin.name, removeFiles: false, caller })), className: "p-1.5 text-white/25 hover:text-red-300/80", "aria-label": `Remove ${plugin.name}`, children: _jsx(Trash2, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) })] })] }) }, plugin.name))) })) })] })), tab === 'mcp' && (_jsxs("div", { className: "flex-1 min-h-0 flex", children: [_jsxs("div", { className: "w-[58%] min-w-0 border-r border-white/[0.06] flex flex-col", children: [_jsxs("div", { className: "px-4 py-3 border-b border-white/[0.06] grid grid-cols-[120px_95px_1fr_1fr_auto] gap-2", children: [_jsx("input", { value: mcpName, onChange: (event) => setMcpName(event.target.value), placeholder: "server-name", className: "px-2.5 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 focus:outline-none focus:border-white/[0.18]" }), _jsxs("select", { value: mcpTransport, onChange: (event) => setMcpTransport(event.target.value === 'sse' ? 'sse' : 'stdio'), className: "px-2 py-1.5 text-[12px] text-white/70 bg-[#232323] border border-white/[0.08] rounded-sm focus:outline-none", children: [_jsx("option", { value: "stdio", children: "stdio" }), _jsx("option", { value: "sse", children: "sse" })] }), _jsx("input", { value: mcpTarget, onChange: (event) => setMcpTarget(event.target.value), placeholder: mcpTransport === 'stdio' ? 'command, e.g. npx' : 'https://server/sse', className: "px-2.5 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 focus:outline-none focus:border-white/[0.18]" }), _jsx("input", { value: mcpArgs, onChange: (event) => setMcpArgs(event.target.value), placeholder: "args for stdio...", disabled: mcpTransport === 'sse', className: "px-2.5 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 focus:outline-none focus:border-white/[0.18] disabled:opacity-30" }), _jsxs("button", { onClick: () => void addMcpServer(), disabled: !!busy || !mcpName.trim() || !mcpTarget.trim(), className: "px-2.5 py-1.5 text-[11px] text-white/65 bg-white/[0.08] border border-white/[0.10] rounded-sm hover:bg-white/[0.14] disabled:opacity-30 flex items-center gap-1", children: [_jsx(Plus, { className: "w-3 h-3", strokeWidth: 1.5 }), "Add"] })] }), _jsxs("div", { className: "px-4 py-2 border-b border-white/[0.06] flex items-center gap-2", children: [_jsx("span", { className: "text-[10px] uppercase tracking-[0.18em] text-white/25", children: "Global exposure" }), ['none', 'prompts', 'resources', 'context', 'all'].map((policy) => (_jsx("button", { onClick: () => void runAction(`set MCP policy ${policy}`, () => getAgentPlatformBridge().pluginMcp.setMcpRegistryPolicy({ policy, caller })), className: `px-1.5 py-0.5 border rounded-sm text-[10px] ${snapshot.mcpRegistryPolicy === policy ? 'text-white/80 bg-white/[0.08] border-white/[0.14]' : 'text-white/35 border-white/[0.06]'}`, children: policy }, policy))), _jsx("button", { onClick: () => void runAction('reload MCP', () => getAgentPlatformBridge().pluginMcp.reloadMcp({ connect: true, ...snapshotRequest })), disabled: !!busy, className: "ml-auto px-2 py-1 text-[11px] text-white/55 bg-white/[0.06] border border-white/[0.08] rounded-sm hover:bg-white/[0.12] disabled:opacity-30", children: "Reload approved" })] }), _jsx("div", { className: "flex-1 overflow-auto", children: loading ? (_jsx("div", { className: "px-4 py-8 text-center text-[12px] text-white/30", children: "Loading MCP registry..." })) : snapshot.mcpServers.length === 0 ? (_jsxs("div", { className: "px-4 py-10 text-center", children: [_jsx(Server, { className: "w-9 h-9 text-white/10 mx-auto mb-3", strokeWidth: 1.5 }), _jsx("p", { className: "text-[12px] text-white/35", children: "No MCP servers configured" }), _jsx("p", { className: "text-[11px] text-white/20 mt-1", children: "Add a stdio or SSE server, approve it, then reload to discover tools." })] })) : (_jsx("div", { className: "divide-y divide-white/[0.05]", children: snapshot.mcpServers.map((server) => (_jsx("div", { className: "px-4 py-3 hover:bg-white/[0.02]", children: _jsxs("div", { className: "flex items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Server, { className: "w-3.5 h-3.5 text-white/35", strokeWidth: 1.5 }), _jsx("span", { className: "text-[12px] text-white/80 font-mono truncate", children: server.name }), _jsx(Pill, { children: server.transport }), _jsx(Pill, { tone: statusTone(server.status), children: server.status }), _jsx(Pill, { tone: statusTone(server.approvalState || 'pending'), children: server.approvalState || 'pending' }), _jsx(Pill, { tone: statusTone(server.trust.state), children: server.trust.state }), _jsxs(Pill, { tone: statusTone(server.trust.riskLevel), children: ["risk:", server.trust.riskLevel] }), server.trust.configDrift && _jsx(Pill, { tone: statusTone('error'), children: "config drift" }), _jsx(Pill, { children: server.scope })] }), _jsx("p", { className: "text-[11px] text-white/38 mt-1 font-mono truncate", children: server.transport === 'stdio' ? [server.command, ...server.args].filter(Boolean).join(' ') : server.url }), server.trust.reasons.length > 0 && (_jsx("p", { className: "text-[10px] text-white/28 mt-1 truncate", children: server.trust.reasons.join(' ') })), _jsxs("div", { className: "flex flex-wrap gap-1 mt-2", children: [server.tools.slice(0, 8).map((tool) => (_jsx("button", { onClick: () => void previewTool(tool), className: "hover:opacity-80", children: _jsxs(Pill, { tone: "text-cyan-200/70 bg-cyan-400/[0.07] border-cyan-300/[0.10]", children: ["tool:", tool.name] }) }, `tool:${tool.name}`))), server.prompts.slice(0, 5).map((prompt) => (_jsx("button", { onClick: () => void previewPrompt(prompt), className: "hover:opacity-80", children: _jsxs(Pill, { children: ["prompt:", prompt.name] }) }, `prompt:${prompt.name}`))), server.resources.slice(0, 5).map((resource) => (_jsx("button", { onClick: () => void previewResource(resource), className: "hover:opacity-80", children: _jsxs(Pill, { children: ["resource:", resource.name || resource.uri] }) }, `resource:${resource.uri}`)))] }), server.error && _jsx("p", { className: "text-[11px] text-red-300/70 mt-2", children: server.error })] }), _jsxs("div", { className: "flex items-center gap-1 shrink-0", children: [_jsx("button", { onClick: () => void runAction(`approve ${server.name}`, () => getAgentPlatformBridge().pluginMcp.setMcpApproval({ name: server.name, decision: 'approved', caller })), className: "p-1.5 text-white/30 hover:text-emerald-200/80", "aria-label": `Approve ${server.name}`, children: _jsx(ShieldCheck, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) }), _jsx("button", { onClick: () => void runAction(`deny ${server.name}`, () => getAgentPlatformBridge().pluginMcp.setMcpApproval({ name: server.name, decision: 'denied', caller })), className: "p-1.5 text-white/30 hover:text-amber-200/80", "aria-label": `Deny ${server.name}`, children: _jsx(ShieldAlert, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) }), _jsx("button", { onClick: () => void runAction(`connect ${server.name}`, () => getAgentPlatformBridge().pluginMcp.reloadMcp({ connect: true, ...snapshotRequest })), className: "p-1.5 text-white/30 hover:text-cyan-200/80", "aria-label": `Connect ${server.name}`, children: _jsx(Check, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) }), server.source === 'hub' && (_jsx("button", { onClick: () => void runAction(`remove ${server.name}`, () => getAgentPlatformBridge().pluginMcp.removeMcpServer({ name: server.name, caller })), className: "p-1.5 text-white/25 hover:text-red-300/80", "aria-label": `Remove ${server.name}`, children: _jsx(Trash2, { className: "w-3.5 h-3.5", strokeWidth: 1.5 }) }))] })] }) }, `${server.source}:${server.name}`))) })) })] }), _jsxs("div", { className: "flex-1 min-w-0 flex flex-col", children: [_jsxs("div", { className: "px-4 py-3 border-b border-white/[0.06] space-y-3", children: [_jsxs("div", { children: [_jsx("div", { className: "text-[10px] uppercase tracking-[0.18em] text-white/25 mb-2", children: "Scoped policy" }), _jsxs("div", { className: "grid grid-cols-4 gap-2", children: [_jsxs("select", { value: scopeType, onChange: (event) => setScopeType(event.target.value), className: "px-2 py-1.5 text-[12px] text-white/70 bg-[#232323] border border-white/[0.08] rounded-sm focus:outline-none", children: [_jsx("option", { value: "global", children: "global" }), _jsx("option", { value: "workspace", children: "workspace" }), _jsx("option", { value: "team", children: "team" }), _jsx("option", { value: "agent", children: "agent" })] }), _jsx("input", { value: scopeWorkspaceId, onChange: (event) => setScopeWorkspaceId(event.target.value), placeholder: "workspace id", disabled: scopeType === 'global', className: "px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 disabled:opacity-30" }), _jsx("input", { value: scopeTeamId, onChange: (event) => setScopeTeamId(event.target.value), placeholder: "team id", disabled: scopeType === 'global' || scopeType === 'workspace', className: "px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 disabled:opacity-30" }), _jsx("input", { value: scopeAgentId, onChange: (event) => setScopeAgentId(event.target.value), placeholder: "agent id", disabled: scopeType !== 'agent', className: "px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20 disabled:opacity-30" })] })] }), _jsxs("div", { className: "grid grid-cols-2 gap-2", children: [_jsx("input", { value: policyPluginAllow, onChange: (event) => setPolicyPluginAllow(event.target.value), placeholder: "plugin allowlist, comma separated", className: "px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20" }), _jsx("input", { value: policyPluginDeny, onChange: (event) => setPolicyPluginDeny(event.target.value), placeholder: "plugin denylist, comma separated", className: "px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20" }), _jsx("input", { value: policyMcpAllow, onChange: (event) => setPolicyMcpAllow(event.target.value), placeholder: "MCP allowlist, comma separated", className: "px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20" }), _jsx("input", { value: policyMcpDeny, onChange: (event) => setPolicyMcpDeny(event.target.value), placeholder: "MCP denylist, comma separated", className: "px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20" })] }), _jsxs("div", { className: "flex gap-2 items-center", children: [_jsx("select", { value: policyMcpExposure, onChange: (event) => setPolicyMcpExposure(asPolicy(event.target.value)), className: "px-2 py-1.5 text-[12px] text-white/70 bg-[#232323] border border-white/[0.08] rounded-sm focus:outline-none", children: ['none', 'prompts', 'resources', 'context', 'all'].map((policy) => _jsx("option", { value: policy, children: policy }, policy)) }), _jsx("button", { onClick: () => void saveScopedPolicy(), disabled: !!busy, className: "px-2.5 py-1.5 text-[11px] text-white/65 bg-white/[0.08] border border-white/[0.10] rounded-sm hover:bg-white/[0.14] disabled:opacity-30", children: "Save scope" }), _jsx("button", { onClick: () => void runAction('delete scoped policy', () => getAgentPlatformBridge().pluginMcp.deleteScopedPolicy({ scope: buildScope(), caller })), disabled: !!busy, className: "px-2.5 py-1.5 text-[11px] text-white/45 border border-white/[0.08] rounded-sm hover:text-red-300/80 disabled:opacity-30", children: "Delete scope" })] }), _jsxs("div", { className: "text-[10px] text-white/30", children: ["Effective: ", snapshot.effectivePolicy.mcpRegistryPolicy, ". Matched: ", snapshot.effectivePolicy.matchedPolicyIds.join(', ') || 'global defaults', "."] })] }), _jsxs("div", { className: "px-4 py-3 border-b border-white/[0.06] space-y-2", children: [_jsx("div", { className: "text-[10px] uppercase tracking-[0.18em] text-white/25", children: "Project MCP sync" }), _jsxs("div", { className: "flex gap-2", children: [_jsx("input", { value: projectCwd, onChange: (event) => setProjectCwd(event.target.value), placeholder: "workspace root for .xeno/mcp.json", className: "flex-1 px-2 py-1.5 text-[12px] text-white/80 bg-[#232323] border border-white/[0.08] rounded-sm placeholder-white/20" }), _jsxs("button", { onClick: () => void syncProjectMcp('import'), disabled: !!busy || !projectCwd.trim(), className: "px-2 py-1 text-[11px] text-white/55 bg-white/[0.06] border border-white/[0.08] rounded-sm hover:bg-white/[0.12] disabled:opacity-30 flex items-center gap-1", children: [_jsx(Download, { className: "w-3 h-3", strokeWidth: 1.5 }), "Import"] }), _jsxs("button", { onClick: () => void syncProjectMcp('export'), disabled: !!busy || !projectCwd.trim(), className: "px-2 py-1 text-[11px] text-white/55 bg-white/[0.06] border border-white/[0.08] rounded-sm hover:bg-white/[0.12] disabled:opacity-30 flex items-center gap-1", children: [_jsx(Upload, { className: "w-3 h-3", strokeWidth: 1.5 }), "Export"] })] })] }), _jsxs("div", { className: "px-4 py-3 border-b border-white/[0.06] space-y-2", children: [_jsx("div", { className: "text-[10px] uppercase tracking-[0.18em] text-white/25", children: "MCP preview input" }), _jsx("textarea", { value: mcpInputJson, onChange: (event) => setMcpInputJson(event.target.value), className: "w-full h-20 px-2 py-1.5 text-[11px] font-mono text-white/70 bg-[#111] border border-white/[0.08] rounded-sm focus:outline-none focus:border-white/[0.18]" }), _jsx("div", { className: "text-[10px] text-white/25", children: "Click a tool, prompt, or resource pill on the left. Tool/prompt calls use this JSON object as input." })] }), _jsx("div", { className: "flex-1 min-h-0 overflow-auto", children: resultPanel ? (_jsxs("div", { className: "p-4", children: [_jsxs("div", { className: "flex items-center gap-2 mb-2", children: [_jsx(Eye, { className: "w-3.5 h-3.5 text-white/35", strokeWidth: 1.5 }), _jsx("span", { className: "text-[12px] text-white/75 font-mono", children: resultPanel.title }), _jsx(Pill, { tone: statusTone(resultPanel.status), children: resultPanel.status })] }), _jsx("pre", { className: "p-3 bg-[#0f0f0f] border border-white/[0.07] rounded-sm text-[11px] text-white/62 whitespace-pre-wrap break-words overflow-auto", children: resultPanel.body })] })) : (_jsx("div", { className: "p-4 space-y-3", children: _jsxs("div", { children: [_jsx("div", { className: "text-[10px] uppercase tracking-[0.18em] text-white/25 mb-2", children: "Configured scoped policies" }), snapshot.scopedPolicies.length === 0 ? (_jsx("p", { className: "text-[11px] text-white/30", children: "No workspace/team/agent plugin policies saved yet." })) : (_jsx("div", { className: "space-y-2", children: snapshot.scopedPolicies.map((policy) => (_jsxs("button", { onClick: () => {
|
|
495
|
+
setScopeType(policy.scope.type);
|
|
496
|
+
setScopeWorkspaceId(policy.scope.workspaceId || '');
|
|
497
|
+
setScopeTeamId(policy.scope.teamId || '');
|
|
498
|
+
setScopeAgentId(policy.scope.agentId || '');
|
|
499
|
+
setPolicyPluginAllow(listToCsv(policy.pluginAllowlist));
|
|
500
|
+
setPolicyPluginDeny(listToCsv(policy.pluginDenylist));
|
|
501
|
+
setPolicyMcpAllow(listToCsv(policy.mcpServerAllowlist));
|
|
502
|
+
setPolicyMcpDeny(listToCsv(policy.mcpServerDenylist));
|
|
503
|
+
setPolicyMcpExposure(policy.mcpRegistryPolicy || 'context');
|
|
504
|
+
}, className: "w-full text-left p-2 border border-white/[0.07] bg-white/[0.025] hover:bg-white/[0.05] rounded-sm", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-[11px] text-white/65 font-mono", children: scopeLabel(policy.scope) }), _jsx(Pill, { tone: policy.enabled ? statusTone('success') : undefined, children: policy.enabled ? 'enabled' : 'disabled' }), policy.mcpRegistryPolicy && _jsx(Pill, { children: policy.mcpRegistryPolicy })] }), _jsxs("p", { className: "text-[10px] text-white/28 mt-1 truncate", children: ["plugins allow [", listToCsv(policy.pluginAllowlist) || '*', "], deny [", listToCsv(policy.pluginDenylist) || '-', "], mcp allow [", listToCsv(policy.mcpServerAllowlist) || '*', "], deny [", listToCsv(policy.mcpServerDenylist) || '-', "]"] })] }, policy.id))) }))] }) })) })] })] }))] }));
|
|
505
|
+
}
|
|
506
|
+
//# sourceMappingURL=PluginManager.js.map
|