@burdenoff/microfe-vibecontrols 2026.511.1 → 2026.512.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +2 -5
- package/dist/components/agent-manager/AgentManagerAdminBar.js +69 -61
- package/dist/components/agent-manager/AgentManagerAdminBar.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerCenter.js +56 -50
- package/dist/components/agent-manager/AgentManagerCenter.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerChatPane.js +87 -74
- package/dist/components/agent-manager/AgentManagerChatPane.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerDetailPanel.js +5 -5
- package/dist/components/agent-manager/AgentManagerDetailPanel.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerInputArea.js +159 -157
- package/dist/components/agent-manager/AgentManagerInputArea.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerMessageItem.js +32 -28
- package/dist/components/agent-manager/AgentManagerMessageItem.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerSessionItem.js +24 -24
- package/dist/components/agent-manager/AgentManagerSessionItem.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerSessionList.js +32 -24
- package/dist/components/agent-manager/AgentManagerSessionList.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerSidebar.js +3 -3
- package/dist/components/agent-manager/AgentManagerSidebar.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerTabBar.js +2 -2
- package/dist/components/agent-manager/AgentManagerTabBar.js.map +1 -1
- package/dist/components/agent-manager/BridleConfigPanel.js +1 -1
- package/dist/components/agent-manager/BridleConfigPanel.js.map +1 -1
- package/dist/components/agent-manager/ProfilesPanel.js +260 -0
- package/dist/components/agent-manager/ProfilesPanel.js.map +1 -0
- package/dist/components/agent-manager/controls/ModelSelector.js +75 -58
- package/dist/components/agent-manager/controls/ModelSelector.js.map +1 -1
- package/dist/components/agent-manager/controls/SdkSelector.js +85 -61
- package/dist/components/agent-manager/controls/SdkSelector.js.map +1 -1
- package/dist/components/agent-manager/detail/SessionConfigPanel.js +2 -2
- package/dist/components/agent-manager/detail/SessionConfigPanel.js.map +1 -1
- package/dist/components/agent-manager/detail/SessionLogsPanel.js +1 -1
- package/dist/components/agent-manager/detail/SessionLogsPanel.js.map +1 -1
- package/dist/components/agent-manager/detail/SessionStatsPanel.js +1 -1
- package/dist/components/agent-manager/detail/SessionStatsPanel.js.map +1 -1
- package/dist/components/agent-manager/detail/SessionToolsPanel.js +1 -1
- package/dist/components/agent-manager/detail/SessionToolsPanel.js.map +1 -1
- package/dist/components/agent-manager/dialogs/ExportSessionDialog.js +1 -1
- package/dist/components/agent-manager/dialogs/ExportSessionDialog.js.map +1 -1
- package/dist/components/agent-manager/dialogs/NewSessionDialog.js +129 -108
- package/dist/components/agent-manager/dialogs/NewSessionDialog.js.map +1 -1
- package/dist/components/agent-manager/dialogs/SessionSearchDialog.js +1 -1
- package/dist/components/agent-manager/dialogs/SessionSearchDialog.js.map +1 -1
- package/dist/components/agent-manager/index.js +16 -0
- package/dist/components/agent-manager/modelDefaults.js +10 -0
- package/dist/components/agent-manager/modelDefaults.js.map +1 -0
- package/dist/components/agents/AgentCard.js +33 -30
- package/dist/components/agents/AgentCard.js.map +1 -1
- package/dist/components/agents/AgentForm.js +277 -239
- package/dist/components/agents/AgentForm.js.map +1 -1
- package/dist/components/agents/AgentStatusBadge.js +19 -8
- package/dist/components/agents/AgentStatusBadge.js.map +1 -1
- package/dist/components/agents/OpenInBrowserEditorButton.js +67 -65
- package/dist/components/agents/OpenInBrowserEditorButton.js.map +1 -1
- package/dist/components/agents/backup/AgentBackupTab.js +186 -185
- package/dist/components/agents/backup/AgentBackupTab.js.map +1 -1
- package/dist/components/ai/AIContextsTab.js +1 -1
- package/dist/components/ai/AIContextsTab.js.map +1 -1
- package/dist/components/ai/AIOverviewTab.js +2 -2
- package/dist/components/ai/AIOverviewTab.js.map +1 -1
- package/dist/components/ai/AIPlaygroundTab.js +97 -97
- package/dist/components/ai/AIPlaygroundTab.js.map +1 -1
- package/dist/components/ai/AIPromptsTab.js +4 -4
- package/dist/components/ai/AIPromptsTab.js.map +1 -1
- package/dist/components/ai/AIProviderCredentialsCard.js +234 -0
- package/dist/components/ai/AIProviderCredentialsCard.js.map +1 -0
- package/dist/components/ai/AISessionsTab.js +17 -1
- package/dist/components/ai/AISessionsTab.js.map +1 -1
- package/dist/components/ai/AIStatsTab.js +1 -1
- package/dist/components/ai/AIStatsTab.js.map +1 -1
- package/dist/components/ai/ClaudeCredentialsCard.js +1 -1
- package/dist/components/ai/ClaudeCredentialsCard.js.map +1 -1
- package/dist/components/ai/PluginHarnessPicker.js +84 -53
- package/dist/components/ai/PluginHarnessPicker.js.map +1 -1
- package/dist/components/aliases/AliasManager.js +386 -0
- package/dist/components/aliases/AliasManager.js.map +1 -0
- package/dist/components/aliases/aliasReservedNames.js +32 -0
- package/dist/components/aliases/aliasReservedNames.js.map +1 -0
- package/dist/components/gitops/CIDurationChart.js +11 -11
- package/dist/components/gitops/VibeGitOpsTab.js +128 -100
- package/dist/components/gitops/VibeGitOpsTab.js.map +1 -1
- package/dist/components/graph/AgentGraphView.js +61 -62
- package/dist/components/graph/AgentGraphView.js.map +1 -1
- package/dist/components/graph/AgentNode.js +17 -18
- package/dist/components/graph/AgentNode.js.map +1 -1
- package/dist/components/graph/TargetNode.js +31 -32
- package/dist/components/graph/TargetNode.js.map +1 -1
- package/dist/components/logs/LogViewer.js +121 -119
- package/dist/components/logs/LogViewer.js.map +1 -1
- package/dist/components/sessions/TerminalPanel.js +449 -458
- package/dist/components/sessions/TerminalPanel.js.map +1 -1
- package/dist/components/shared/AgentSelector.js +87 -67
- package/dist/components/shared/AgentSelector.js.map +1 -1
- package/dist/components/shared/AgentSetupBanner.js +64 -61
- package/dist/components/shared/AgentSetupBanner.js.map +1 -1
- package/dist/components/vibecalendar/expandOccurrences.js.map +1 -1
- package/dist/constants/pluginCatalog.js +29 -1
- package/dist/constants/pluginCatalog.js.map +1 -1
- package/dist/generated/wspace-operations.js +126 -103
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.js.map +1 -1
- package/dist/hooks/useActiveAgentProfile.js +51 -0
- package/dist/hooks/useActiveAgentProfile.js.map +1 -0
- package/dist/hooks/useAgentEvents.js +1 -0
- package/dist/hooks/useAgentEvents.js.map +1 -1
- package/dist/hooks/useAgentManagerStreaming.js +1 -1
- package/dist/hooks/useAgentManagerStreaming.js.map +1 -1
- package/dist/hooks/useCachedInitialData.js +4 -2
- package/dist/hooks/useCachedInitialData.js.map +1 -1
- package/dist/hooks/usePluginAvailability.js +93 -61
- package/dist/hooks/usePluginAvailability.js.map +1 -1
- package/dist/index.js +10 -10
- package/dist/microfe-vibecontrols.css +1 -1
- package/dist/node_modules/d3-scale/src/continuous.js +20 -20
- package/dist/node_modules/d3-scale/src/diverging.js +30 -30
- package/dist/node_modules/d3-scale/src/sequential.js +25 -25
- package/dist/pages/AgentDetailsPage.js +801 -736
- package/dist/pages/AgentDetailsPage.js.map +1 -1
- package/dist/pages/AgentsLandingPage.js +4 -4
- package/dist/pages/AgentsLandingPage.js.map +1 -1
- package/dist/pages/AgentsPage.js +351 -295
- package/dist/pages/AgentsPage.js.map +1 -1
- package/dist/pages/SessionsPage.js +618 -615
- package/dist/pages/SessionsPage.js.map +1 -1
- package/dist/pages/TargetsPage.js +5 -2
- package/dist/pages/TargetsPage.js.map +1 -1
- package/dist/pages/VibeDetailsPage.js +582 -555
- package/dist/pages/VibeDetailsPage.js.map +1 -1
- package/dist/pages/ai/AIPage.js +107 -103
- package/dist/pages/ai/AIPage.js.map +1 -1
- package/dist/pages/ai/AISessionDetailPage.js +167 -163
- package/dist/pages/ai/AISessionDetailPage.js.map +1 -1
- package/dist/pages/ai/AgentManagerPage.js +94 -90
- package/dist/pages/ai/AgentManagerPage.js.map +1 -1
- package/dist/pages/tunnels/TunnelDetailsPage.js.map +1 -1
- package/dist/services/aiApi.js +119 -112
- package/dist/services/aiApi.js.map +1 -1
- package/dist/services/iframeToken.js +29 -0
- package/dist/services/iframeToken.js.map +1 -0
- package/dist/services/schedulerApi.js +14 -13
- package/dist/services/schedulerApi.js.map +1 -1
- package/dist/store/agentManagerStore.js +61 -14
- package/dist/store/agentManagerStore.js.map +1 -1
- package/dist/store/vibeControlsStore.js +21 -1
- package/dist/store/vibeControlsStore.js.map +1 -1
- package/dist/translations/en.js.map +1 -1
- package/dist/utils/agentApiPath.js +9 -0
- package/dist/utils/agentApiPath.js.map +1 -0
- package/package.json +3 -3
- package/dist/VibeControlsRoot.d.ts +0 -36
- package/dist/VibeControlsRoot.d.ts.map +0 -1
- package/dist/VibeControlsRoutes.d.ts +0 -2
- package/dist/VibeControlsRoutes.d.ts.map +0 -1
- package/dist/components/actions/ActionCard.d.ts +0 -32
- package/dist/components/actions/ActionCard.d.ts.map +0 -1
- package/dist/components/actions/ActionForm.d.ts +0 -39
- package/dist/components/actions/ActionForm.d.ts.map +0 -1
- package/dist/components/actions/ActionTypeBadge.d.ts +0 -9
- package/dist/components/actions/ActionTypeBadge.d.ts.map +0 -1
- package/dist/components/actions/ExecutionHistory.d.ts +0 -23
- package/dist/components/actions/ExecutionHistory.d.ts.map +0 -1
- package/dist/components/actions/index.d.ts +0 -6
- package/dist/components/actions/index.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerAdminBar.d.ts +0 -13
- package/dist/components/agent-manager/AgentManagerAdminBar.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerBulkActions.d.ts +0 -13
- package/dist/components/agent-manager/AgentManagerBulkActions.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerCenter.d.ts +0 -8
- package/dist/components/agent-manager/AgentManagerCenter.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerChatPane.d.ts +0 -9
- package/dist/components/agent-manager/AgentManagerChatPane.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerDetailPanel.d.ts +0 -13
- package/dist/components/agent-manager/AgentManagerDetailPanel.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerInputArea.d.ts +0 -14
- package/dist/components/agent-manager/AgentManagerInputArea.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerLayout.d.ts +0 -10
- package/dist/components/agent-manager/AgentManagerLayout.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerMessageItem.d.ts +0 -10
- package/dist/components/agent-manager/AgentManagerMessageItem.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerMessageList.d.ts +0 -12
- package/dist/components/agent-manager/AgentManagerMessageList.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerSessionItem.d.ts +0 -12
- package/dist/components/agent-manager/AgentManagerSessionItem.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerSessionList.d.ts +0 -16
- package/dist/components/agent-manager/AgentManagerSessionList.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerSidebar.d.ts +0 -14
- package/dist/components/agent-manager/AgentManagerSidebar.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerStreamingIndicator.d.ts +0 -8
- package/dist/components/agent-manager/AgentManagerStreamingIndicator.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerTab.d.ts +0 -15
- package/dist/components/agent-manager/AgentManagerTab.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerTabBar.d.ts +0 -10
- package/dist/components/agent-manager/AgentManagerTabBar.d.ts.map +0 -1
- package/dist/components/agent-manager/BridleConfigPanel.d.ts +0 -13
- package/dist/components/agent-manager/BridleConfigPanel.d.ts.map +0 -1
- package/dist/components/agent-manager/PluginInstallModal.d.ts +0 -9
- package/dist/components/agent-manager/PluginInstallModal.d.ts.map +0 -1
- package/dist/components/agent-manager/controls/ContextLevelToggle.d.ts +0 -23
- package/dist/components/agent-manager/controls/ContextLevelToggle.d.ts.map +0 -1
- package/dist/components/agent-manager/controls/FileAttachButton.d.ts +0 -13
- package/dist/components/agent-manager/controls/FileAttachButton.d.ts.map +0 -1
- package/dist/components/agent-manager/controls/McpServerSelector.d.ts +0 -10
- package/dist/components/agent-manager/controls/McpServerSelector.d.ts.map +0 -1
- package/dist/components/agent-manager/controls/ModelSelector.d.ts +0 -10
- package/dist/components/agent-manager/controls/ModelSelector.d.ts.map +0 -1
- package/dist/components/agent-manager/controls/SdkSelector.d.ts +0 -13
- package/dist/components/agent-manager/controls/SdkSelector.d.ts.map +0 -1
- package/dist/components/agent-manager/controls/VoiceToggle.d.ts +0 -13
- package/dist/components/agent-manager/controls/VoiceToggle.d.ts.map +0 -1
- package/dist/components/agent-manager/detail/SessionConfigPanel.d.ts +0 -14
- package/dist/components/agent-manager/detail/SessionConfigPanel.d.ts.map +0 -1
- package/dist/components/agent-manager/detail/SessionLogsPanel.d.ts +0 -13
- package/dist/components/agent-manager/detail/SessionLogsPanel.d.ts.map +0 -1
- package/dist/components/agent-manager/detail/SessionStatsPanel.d.ts +0 -12
- package/dist/components/agent-manager/detail/SessionStatsPanel.d.ts.map +0 -1
- package/dist/components/agent-manager/detail/SessionToolsPanel.d.ts +0 -12
- package/dist/components/agent-manager/detail/SessionToolsPanel.d.ts.map +0 -1
- package/dist/components/agent-manager/dialogs/ExportSessionDialog.d.ts +0 -15
- package/dist/components/agent-manager/dialogs/ExportSessionDialog.d.ts.map +0 -1
- package/dist/components/agent-manager/dialogs/NewSessionDialog.d.ts +0 -14
- package/dist/components/agent-manager/dialogs/NewSessionDialog.d.ts.map +0 -1
- package/dist/components/agent-manager/dialogs/RenameSessionDialog.d.ts +0 -15
- package/dist/components/agent-manager/dialogs/RenameSessionDialog.d.ts.map +0 -1
- package/dist/components/agent-manager/dialogs/SessionSearchDialog.d.ts +0 -15
- package/dist/components/agent-manager/dialogs/SessionSearchDialog.d.ts.map +0 -1
- package/dist/components/agent-manager/index.d.ts +0 -16
- package/dist/components/agent-manager/index.d.ts.map +0 -1
- package/dist/components/agents/AgentCard.d.ts +0 -30
- package/dist/components/agents/AgentCard.d.ts.map +0 -1
- package/dist/components/agents/AgentForm.d.ts +0 -29
- package/dist/components/agents/AgentForm.d.ts.map +0 -1
- package/dist/components/agents/AgentList.d.ts +0 -19
- package/dist/components/agents/AgentList.d.ts.map +0 -1
- package/dist/components/agents/AgentStatusBadge.d.ts +0 -12
- package/dist/components/agents/AgentStatusBadge.d.ts.map +0 -1
- package/dist/components/agents/OpenInBrowserEditorButton.d.ts +0 -16
- package/dist/components/agents/OpenInBrowserEditorButton.d.ts.map +0 -1
- package/dist/components/agents/PluginUIPanel.d.ts +0 -38
- package/dist/components/agents/PluginUIPanel.d.ts.map +0 -1
- package/dist/components/agents/backup/AgentBackupTab.d.ts +0 -11
- package/dist/components/agents/backup/AgentBackupTab.d.ts.map +0 -1
- package/dist/components/agents/index.d.ts +0 -8
- package/dist/components/agents/index.d.ts.map +0 -1
- package/dist/components/agents/types.d.ts +0 -72
- package/dist/components/agents/types.d.ts.map +0 -1
- package/dist/components/ai/AIAssistantPanel.d.ts +0 -8
- package/dist/components/ai/AIAssistantPanel.d.ts.map +0 -1
- package/dist/components/ai/AIContextsTab.d.ts +0 -6
- package/dist/components/ai/AIContextsTab.d.ts.map +0 -1
- package/dist/components/ai/AIOverviewTab.d.ts +0 -7
- package/dist/components/ai/AIOverviewTab.d.ts.map +0 -1
- package/dist/components/ai/AIPlaygroundTab.d.ts +0 -6
- package/dist/components/ai/AIPlaygroundTab.d.ts.map +0 -1
- package/dist/components/ai/AIPromptsTab.d.ts +0 -6
- package/dist/components/ai/AIPromptsTab.d.ts.map +0 -1
- package/dist/components/ai/AISessionsTab.d.ts +0 -7
- package/dist/components/ai/AISessionsTab.d.ts.map +0 -1
- package/dist/components/ai/AIStatsTab.d.ts +0 -6
- package/dist/components/ai/AIStatsTab.d.ts.map +0 -1
- package/dist/components/ai/AITasksTab.d.ts +0 -5
- package/dist/components/ai/AITasksTab.d.ts.map +0 -1
- package/dist/components/ai/AITemplatesTab.d.ts +0 -6
- package/dist/components/ai/AITemplatesTab.d.ts.map +0 -1
- package/dist/components/ai/ClaudeCredentialsCard.d.ts +0 -6
- package/dist/components/ai/ClaudeCredentialsCard.d.ts.map +0 -1
- package/dist/components/ai/PluginHarnessPicker.d.ts +0 -31
- package/dist/components/ai/PluginHarnessPicker.d.ts.map +0 -1
- package/dist/components/analytics/AnalyticsBreakdownChart.d.ts +0 -12
- package/dist/components/analytics/AnalyticsBreakdownChart.d.ts.map +0 -1
- package/dist/components/analytics/AnalyticsBreakdownTable.d.ts +0 -13
- package/dist/components/analytics/AnalyticsBreakdownTable.d.ts.map +0 -1
- package/dist/components/analytics/AnalyticsEntityTabs.d.ts +0 -9
- package/dist/components/analytics/AnalyticsEntityTabs.d.ts.map +0 -1
- package/dist/components/analytics/AnalyticsFilterBar.d.ts +0 -15
- package/dist/components/analytics/AnalyticsFilterBar.d.ts.map +0 -1
- package/dist/components/analytics/AnalyticsKpiGrid.d.ts +0 -10
- package/dist/components/analytics/AnalyticsKpiGrid.d.ts.map +0 -1
- package/dist/components/analytics/AnalyticsTimeSeriesChart.d.ts +0 -16
- package/dist/components/analytics/AnalyticsTimeSeriesChart.d.ts.map +0 -1
- package/dist/components/analytics/SandboxAnalyticsSection.d.ts +0 -9
- package/dist/components/analytics/SandboxAnalyticsSection.d.ts.map +0 -1
- package/dist/components/analytics/index.d.ts +0 -9
- package/dist/components/analytics/index.d.ts.map +0 -1
- package/dist/components/analytics/types.d.ts +0 -28
- package/dist/components/analytics/types.d.ts.map +0 -1
- package/dist/components/assistant/AIAssistantPanel.d.ts +0 -5
- package/dist/components/assistant/AIAssistantPanel.d.ts.map +0 -1
- package/dist/components/assistant/AssistantChatArea.d.ts +0 -4
- package/dist/components/assistant/AssistantChatArea.d.ts.map +0 -1
- package/dist/components/assistant/AssistantChatInput.d.ts +0 -10
- package/dist/components/assistant/AssistantChatInput.d.ts.map +0 -1
- package/dist/components/assistant/AssistantConversationList.d.ts +0 -4
- package/dist/components/assistant/AssistantConversationList.d.ts.map +0 -1
- package/dist/components/assistant/AssistantExportMenu.d.ts +0 -4
- package/dist/components/assistant/AssistantExportMenu.d.ts.map +0 -1
- package/dist/components/assistant/AssistantMarkdownRenderer.d.ts +0 -8
- package/dist/components/assistant/AssistantMarkdownRenderer.d.ts.map +0 -1
- package/dist/components/assistant/AssistantMessageItem.d.ts +0 -10
- package/dist/components/assistant/AssistantMessageItem.d.ts.map +0 -1
- package/dist/components/assistant/AssistantMessageList.d.ts +0 -10
- package/dist/components/assistant/AssistantMessageList.d.ts.map +0 -1
- package/dist/components/assistant/AssistantModeSelector.d.ts +0 -10
- package/dist/components/assistant/AssistantModeSelector.d.ts.map +0 -1
- package/dist/components/assistant/AssistantWelcome.d.ts +0 -10
- package/dist/components/assistant/AssistantWelcome.d.ts.map +0 -1
- package/dist/components/assistant/index.d.ts +0 -11
- package/dist/components/assistant/index.d.ts.map +0 -1
- package/dist/components/audit/AuditDeleteDialog.d.ts +0 -12
- package/dist/components/audit/AuditDeleteDialog.d.ts.map +0 -1
- package/dist/components/audit/AuditExportButton.d.ts +0 -8
- package/dist/components/audit/AuditExportButton.d.ts.map +0 -1
- package/dist/components/audit/AuditLogDetail.d.ts +0 -9
- package/dist/components/audit/AuditLogDetail.d.ts.map +0 -1
- package/dist/components/audit/AuditLogFilters.d.ts +0 -15
- package/dist/components/audit/AuditLogFilters.d.ts.map +0 -1
- package/dist/components/audit/AuditLogStats.d.ts +0 -9
- package/dist/components/audit/AuditLogStats.d.ts.map +0 -1
- package/dist/components/audit/AuditLogTable.d.ts +0 -21
- package/dist/components/audit/AuditLogTable.d.ts.map +0 -1
- package/dist/components/audit/index.d.ts +0 -7
- package/dist/components/audit/index.d.ts.map +0 -1
- package/dist/components/catalog/CatalogCard.d.ts +0 -22
- package/dist/components/catalog/CatalogCard.d.ts.map +0 -1
- package/dist/components/catalog/CatalogForm.d.ts +0 -18
- package/dist/components/catalog/CatalogForm.d.ts.map +0 -1
- package/dist/components/catalog/index.d.ts +0 -5
- package/dist/components/catalog/index.d.ts.map +0 -1
- package/dist/components/docs/DocsCompileStatus.d.ts +0 -9
- package/dist/components/docs/DocsCompileStatus.d.ts.map +0 -1
- package/dist/components/docs/DocsEditPanel.d.ts +0 -26
- package/dist/components/docs/DocsEditPanel.d.ts.map +0 -1
- package/dist/components/docs/DocsEmptyState.d.ts +0 -7
- package/dist/components/docs/DocsEmptyState.d.ts.map +0 -1
- package/dist/components/docs/DocsPageEditor.d.ts +0 -13
- package/dist/components/docs/DocsPageEditor.d.ts.map +0 -1
- package/dist/components/docs/DocsPageTree.d.ts +0 -12
- package/dist/components/docs/DocsPageTree.d.ts.map +0 -1
- package/dist/components/docs/DocsPreviewPanel.d.ts +0 -17
- package/dist/components/docs/DocsPreviewPanel.d.ts.map +0 -1
- package/dist/components/docs/DocsSettingsPanel.d.ts +0 -15
- package/dist/components/docs/DocsSettingsPanel.d.ts.map +0 -1
- package/dist/components/docs/DocsTabPanel.d.ts +0 -8
- package/dist/components/docs/DocsTabPanel.d.ts.map +0 -1
- package/dist/components/docs/index.d.ts +0 -10
- package/dist/components/docs/index.d.ts.map +0 -1
- package/dist/components/docs/previewHtml.d.ts +0 -2
- package/dist/components/docs/previewHtml.d.ts.map +0 -1
- package/dist/components/docs/types.d.ts +0 -59
- package/dist/components/docs/types.d.ts.map +0 -1
- package/dist/components/gitops/CIDurationChart.d.ts +0 -12
- package/dist/components/gitops/CIDurationChart.d.ts.map +0 -1
- package/dist/components/gitops/CIFailedRuns.d.ts +0 -13
- package/dist/components/gitops/CIFailedRuns.d.ts.map +0 -1
- package/dist/components/gitops/CIPipelineRunsTable.d.ts +0 -13
- package/dist/components/gitops/CIPipelineRunsTable.d.ts.map +0 -1
- package/dist/components/gitops/CISuccessRateChart.d.ts +0 -13
- package/dist/components/gitops/CISuccessRateChart.d.ts.map +0 -1
- package/dist/components/gitops/CITab.d.ts +0 -15
- package/dist/components/gitops/CITab.d.ts.map +0 -1
- package/dist/components/gitops/CIWorkflowList.d.ts +0 -13
- package/dist/components/gitops/CIWorkflowList.d.ts.map +0 -1
- package/dist/components/gitops/GitOpsProviderCard.d.ts +0 -14
- package/dist/components/gitops/GitOpsProviderCard.d.ts.map +0 -1
- package/dist/components/gitops/GitOpsSetup.d.ts +0 -16
- package/dist/components/gitops/GitOpsSetup.d.ts.map +0 -1
- package/dist/components/gitops/GitOpsSkeleton.d.ts +0 -12
- package/dist/components/gitops/GitOpsSkeleton.d.ts.map +0 -1
- package/dist/components/gitops/GitOpsStatusBadge.d.ts +0 -14
- package/dist/components/gitops/GitOpsStatusBadge.d.ts.map +0 -1
- package/dist/components/gitops/ProviderIcon.d.ts +0 -14
- package/dist/components/gitops/ProviderIcon.d.ts.map +0 -1
- package/dist/components/gitops/RepoActivityCard.d.ts +0 -12
- package/dist/components/gitops/RepoActivityCard.d.ts.map +0 -1
- package/dist/components/gitops/RepoIssuesCard.d.ts +0 -12
- package/dist/components/gitops/RepoIssuesCard.d.ts.map +0 -1
- package/dist/components/gitops/RepoLanguagesCard.d.ts +0 -13
- package/dist/components/gitops/RepoLanguagesCard.d.ts.map +0 -1
- package/dist/components/gitops/RepoOverviewCard.d.ts +0 -13
- package/dist/components/gitops/RepoOverviewCard.d.ts.map +0 -1
- package/dist/components/gitops/RepoPullRequestsCard.d.ts +0 -12
- package/dist/components/gitops/RepoPullRequestsCard.d.ts.map +0 -1
- package/dist/components/gitops/RepoSecurityCard.d.ts +0 -12
- package/dist/components/gitops/RepoSecurityCard.d.ts.map +0 -1
- package/dist/components/gitops/RepoStatsTab.d.ts +0 -15
- package/dist/components/gitops/RepoStatsTab.d.ts.map +0 -1
- package/dist/components/gitops/VibeGitOpsTab.d.ts +0 -12
- package/dist/components/gitops/VibeGitOpsTab.d.ts.map +0 -1
- package/dist/components/gitops/index.d.ts +0 -21
- package/dist/components/gitops/index.d.ts.map +0 -1
- package/dist/components/gitops/types.d.ts +0 -90
- package/dist/components/gitops/types.d.ts.map +0 -1
- package/dist/components/graph/AgentGraphView.d.ts +0 -44
- package/dist/components/graph/AgentGraphView.d.ts.map +0 -1
- package/dist/components/graph/AgentNode.d.ts +0 -6
- package/dist/components/graph/AgentNode.d.ts.map +0 -1
- package/dist/components/graph/ConnectionPermissionsDialog.d.ts +0 -26
- package/dist/components/graph/ConnectionPermissionsDialog.d.ts.map +0 -1
- package/dist/components/graph/TargetNode.d.ts +0 -6
- package/dist/components/graph/TargetNode.d.ts.map +0 -1
- package/dist/components/health/AgentHealthCard.d.ts +0 -9
- package/dist/components/health/AgentHealthCard.d.ts.map +0 -1
- package/dist/components/health/HealthDashboard.d.ts +0 -10
- package/dist/components/health/HealthDashboard.d.ts.map +0 -1
- package/dist/components/health/SystemStatus.d.ts +0 -11
- package/dist/components/health/SystemStatus.d.ts.map +0 -1
- package/dist/components/health/index.d.ts +0 -5
- package/dist/components/health/index.d.ts.map +0 -1
- package/dist/components/health/types.d.ts +0 -50
- package/dist/components/health/types.d.ts.map +0 -1
- package/dist/components/idp-components/ComponentCard.d.ts +0 -24
- package/dist/components/idp-components/ComponentCard.d.ts.map +0 -1
- package/dist/components/idp-components/ComponentForm.d.ts +0 -22
- package/dist/components/idp-components/ComponentForm.d.ts.map +0 -1
- package/dist/components/idp-components/index.d.ts +0 -5
- package/dist/components/idp-components/index.d.ts.map +0 -1
- package/dist/components/logs/LogViewer.d.ts +0 -13
- package/dist/components/logs/LogViewer.d.ts.map +0 -1
- package/dist/components/notes/NoteCard.d.ts +0 -13
- package/dist/components/notes/NoteCard.d.ts.map +0 -1
- package/dist/components/notes/NoteEditor.d.ts +0 -31
- package/dist/components/notes/NoteEditor.d.ts.map +0 -1
- package/dist/components/notes/NoteList.d.ts +0 -15
- package/dist/components/notes/NoteList.d.ts.map +0 -1
- package/dist/components/notes/NotesTabPanel.d.ts +0 -18
- package/dist/components/notes/NotesTabPanel.d.ts.map +0 -1
- package/dist/components/notes/index.d.ts +0 -7
- package/dist/components/notes/index.d.ts.map +0 -1
- package/dist/components/notes/types.d.ts +0 -58
- package/dist/components/notes/types.d.ts.map +0 -1
- package/dist/components/scorecard/ScorecardPanel.d.ts +0 -9
- package/dist/components/scorecard/ScorecardPanel.d.ts.map +0 -1
- package/dist/components/scorecard/index.d.ts +0 -3
- package/dist/components/scorecard/index.d.ts.map +0 -1
- package/dist/components/sessions/CollaboratorsList.d.ts +0 -18
- package/dist/components/sessions/CollaboratorsList.d.ts.map +0 -1
- package/dist/components/sessions/ControlStatusBar.d.ts +0 -31
- package/dist/components/sessions/ControlStatusBar.d.ts.map +0 -1
- package/dist/components/sessions/SessionCard.d.ts +0 -24
- package/dist/components/sessions/SessionCard.d.ts.map +0 -1
- package/dist/components/sessions/SessionForm.d.ts +0 -20
- package/dist/components/sessions/SessionForm.d.ts.map +0 -1
- package/dist/components/sessions/SessionList.d.ts +0 -25
- package/dist/components/sessions/SessionList.d.ts.map +0 -1
- package/dist/components/sessions/SessionShareDialog.d.ts +0 -15
- package/dist/components/sessions/SessionShareDialog.d.ts.map +0 -1
- package/dist/components/sessions/SessionStatusBadge.d.ts +0 -9
- package/dist/components/sessions/SessionStatusBadge.d.ts.map +0 -1
- package/dist/components/sessions/SharedTerminalPanel.d.ts +0 -72
- package/dist/components/sessions/SharedTerminalPanel.d.ts.map +0 -1
- package/dist/components/sessions/TerminalPanel.d.ts +0 -69
- package/dist/components/sessions/TerminalPanel.d.ts.map +0 -1
- package/dist/components/sessions/index.d.ts +0 -11
- package/dist/components/sessions/index.d.ts.map +0 -1
- package/dist/components/sessions/types.d.ts +0 -67
- package/dist/components/sessions/types.d.ts.map +0 -1
- package/dist/components/settings/AdvancedSection.d.ts +0 -22
- package/dist/components/settings/AdvancedSection.d.ts.map +0 -1
- package/dist/components/settings/ConfigEditor.d.ts +0 -14
- package/dist/components/settings/ConfigEditor.d.ts.map +0 -1
- package/dist/components/settings/ConfigSection.d.ts +0 -12
- package/dist/components/settings/ConfigSection.d.ts.map +0 -1
- package/dist/components/settings/NotificationsSection.d.ts +0 -14
- package/dist/components/settings/NotificationsSection.d.ts.map +0 -1
- package/dist/components/settings/PreferencesSection.d.ts +0 -14
- package/dist/components/settings/PreferencesSection.d.ts.map +0 -1
- package/dist/components/settings/ProfileSection.d.ts +0 -14
- package/dist/components/settings/ProfileSection.d.ts.map +0 -1
- package/dist/components/settings/SecuritySection.d.ts +0 -11
- package/dist/components/settings/SecuritySection.d.ts.map +0 -1
- package/dist/components/settings/SettingsForm.d.ts +0 -58
- package/dist/components/settings/SettingsForm.d.ts.map +0 -1
- package/dist/components/settings/WorkspaceDefaultsSection.d.ts +0 -27
- package/dist/components/settings/WorkspaceDefaultsSection.d.ts.map +0 -1
- package/dist/components/settings/index.d.ts +0 -4
- package/dist/components/settings/index.d.ts.map +0 -1
- package/dist/components/settings/types.d.ts +0 -55
- package/dist/components/settings/types.d.ts.map +0 -1
- package/dist/components/shared/AgentEventsConnector.d.ts +0 -6
- package/dist/components/shared/AgentEventsConnector.d.ts.map +0 -1
- package/dist/components/shared/AgentSelector.d.ts +0 -25
- package/dist/components/shared/AgentSelector.d.ts.map +0 -1
- package/dist/components/shared/AgentSetupBanner.d.ts +0 -21
- package/dist/components/shared/AgentSetupBanner.d.ts.map +0 -1
- package/dist/components/shared/Card.d.ts +0 -29
- package/dist/components/shared/Card.d.ts.map +0 -1
- package/dist/components/shared/ConfirmDialog.d.ts +0 -14
- package/dist/components/shared/ConfirmDialog.d.ts.map +0 -1
- package/dist/components/shared/EmptyState.d.ts +0 -11
- package/dist/components/shared/EmptyState.d.ts.map +0 -1
- package/dist/components/shared/EntityTagPicker.d.ts +0 -8
- package/dist/components/shared/EntityTagPicker.d.ts.map +0 -1
- package/dist/components/shared/ErrorState.d.ts +0 -11
- package/dist/components/shared/ErrorState.d.ts.map +0 -1
- package/dist/components/shared/FilterDropdown.d.ts +0 -20
- package/dist/components/shared/FilterDropdown.d.ts.map +0 -1
- package/dist/components/shared/GetHelpButton.d.ts +0 -27
- package/dist/components/shared/GetHelpButton.d.ts.map +0 -1
- package/dist/components/shared/InstallTabs.d.ts +0 -18
- package/dist/components/shared/InstallTabs.d.ts.map +0 -1
- package/dist/components/shared/LoadingState.d.ts +0 -7
- package/dist/components/shared/LoadingState.d.ts.map +0 -1
- package/dist/components/shared/NotificationToast.d.ts +0 -40
- package/dist/components/shared/NotificationToast.d.ts.map +0 -1
- package/dist/components/shared/PageHeader.d.ts +0 -14
- package/dist/components/shared/PageHeader.d.ts.map +0 -1
- package/dist/components/shared/PluginGate.d.ts +0 -35
- package/dist/components/shared/PluginGate.d.ts.map +0 -1
- package/dist/components/shared/QuotaExhaustedDialog.d.ts +0 -12
- package/dist/components/shared/QuotaExhaustedDialog.d.ts.map +0 -1
- package/dist/components/shared/RequireAgentReachable.d.ts +0 -14
- package/dist/components/shared/RequireAgentReachable.d.ts.map +0 -1
- package/dist/components/shared/SearchInput.d.ts +0 -9
- package/dist/components/shared/SearchInput.d.ts.map +0 -1
- package/dist/components/shared/SearchableSelect.d.ts +0 -48
- package/dist/components/shared/SearchableSelect.d.ts.map +0 -1
- package/dist/components/shared/SelectionCheckbox.d.ts +0 -11
- package/dist/components/shared/SelectionCheckbox.d.ts.map +0 -1
- package/dist/components/shared/SessionNotificationBanner.d.ts +0 -47
- package/dist/components/shared/SessionNotificationBanner.d.ts.map +0 -1
- package/dist/components/shared/StatCard.d.ts +0 -17
- package/dist/components/shared/StatCard.d.ts.map +0 -1
- package/dist/components/shared/StatusBadge.d.ts +0 -11
- package/dist/components/shared/StatusBadge.d.ts.map +0 -1
- package/dist/components/shared/TagFilter.d.ts +0 -11
- package/dist/components/shared/TagFilter.d.ts.map +0 -1
- package/dist/components/shared/index.d.ts +0 -32
- package/dist/components/shared/index.d.ts.map +0 -1
- package/dist/components/targets/TargetCard.d.ts +0 -45
- package/dist/components/targets/TargetCard.d.ts.map +0 -1
- package/dist/components/targets/index.d.ts +0 -3
- package/dist/components/targets/index.d.ts.map +0 -1
- package/dist/components/templates/TemplateCard.d.ts +0 -19
- package/dist/components/templates/TemplateCard.d.ts.map +0 -1
- package/dist/components/templates/index.d.ts +0 -3
- package/dist/components/templates/index.d.ts.map +0 -1
- package/dist/components/tunnels/DomainVerificationBadge.d.ts +0 -6
- package/dist/components/tunnels/DomainVerificationBadge.d.ts.map +0 -1
- package/dist/components/tunnels/ProviderBadge.d.ts +0 -6
- package/dist/components/tunnels/ProviderBadge.d.ts.map +0 -1
- package/dist/components/tunnels/TunnelCard.d.ts +0 -13
- package/dist/components/tunnels/TunnelCard.d.ts.map +0 -1
- package/dist/components/tunnels/TunnelCreateWizard.d.ts +0 -2
- package/dist/components/tunnels/TunnelCreateWizard.d.ts.map +0 -1
- package/dist/components/tunnels/TunnelStatusBadge.d.ts +0 -6
- package/dist/components/tunnels/TunnelStatusBadge.d.ts.map +0 -1
- package/dist/components/vibe/VibeAgentEmptyState.d.ts +0 -8
- package/dist/components/vibe/VibeAgentEmptyState.d.ts.map +0 -1
- package/dist/components/vibecalendar/LogsDrawer.d.ts +0 -12
- package/dist/components/vibecalendar/LogsDrawer.d.ts.map +0 -1
- package/dist/components/vibecalendar/ScheduleTaskModal.d.ts +0 -33
- package/dist/components/vibecalendar/ScheduleTaskModal.d.ts.map +0 -1
- package/dist/components/vibecalendar/VibeCalAgendaView.d.ts +0 -11
- package/dist/components/vibecalendar/VibeCalAgendaView.d.ts.map +0 -1
- package/dist/components/vibecalendar/VibeCalDayView.d.ts +0 -12
- package/dist/components/vibecalendar/VibeCalDayView.d.ts.map +0 -1
- package/dist/components/vibecalendar/VibeCalMonthView.d.ts +0 -12
- package/dist/components/vibecalendar/VibeCalMonthView.d.ts.map +0 -1
- package/dist/components/vibecalendar/VibeCalWeekView.d.ts +0 -12
- package/dist/components/vibecalendar/VibeCalWeekView.d.ts.map +0 -1
- package/dist/components/vibecalendar/VibeCalendarHeader.d.ts +0 -12
- package/dist/components/vibecalendar/VibeCalendarHeader.d.ts.map +0 -1
- package/dist/components/vibecalendar/VibeTaskBlock.d.ts +0 -12
- package/dist/components/vibecalendar/VibeTaskBlock.d.ts.map +0 -1
- package/dist/components/vibecalendar/expandOccurrences.d.ts +0 -37
- package/dist/components/vibecalendar/expandOccurrences.d.ts.map +0 -1
- package/dist/components/vibecalendar/index.d.ts +0 -11
- package/dist/components/vibecalendar/index.d.ts.map +0 -1
- package/dist/components/vibecalendar/types.d.ts +0 -53
- package/dist/components/vibecalendar/types.d.ts.map +0 -1
- package/dist/components/vibedeck/VibeDeckButtonForm.d.ts +0 -54
- package/dist/components/vibedeck/VibeDeckButtonForm.d.ts.map +0 -1
- package/dist/components/vibedeck/VibeDeckButtonTile.d.ts +0 -48
- package/dist/components/vibedeck/VibeDeckButtonTile.d.ts.map +0 -1
- package/dist/components/vibedeck/VibeDeckExecutionLog.d.ts +0 -25
- package/dist/components/vibedeck/VibeDeckExecutionLog.d.ts.map +0 -1
- package/dist/components/vibedeck/VibeDeckForm.d.ts +0 -21
- package/dist/components/vibedeck/VibeDeckForm.d.ts.map +0 -1
- package/dist/components/vibedeck/VibeDeckGrid.d.ts +0 -51
- package/dist/components/vibedeck/VibeDeckGrid.d.ts.map +0 -1
- package/dist/components/vibedeck/VibeDeckShareDialog.d.ts +0 -10
- package/dist/components/vibedeck/VibeDeckShareDialog.d.ts.map +0 -1
- package/dist/components/vibedeck/VibeDeckSwitcher.d.ts +0 -28
- package/dist/components/vibedeck/VibeDeckSwitcher.d.ts.map +0 -1
- package/dist/components/vibedeck/index.d.ts +0 -9
- package/dist/components/vibedeck/index.d.ts.map +0 -1
- package/dist/components/vibes/VibeCard.d.ts +0 -19
- package/dist/components/vibes/VibeCard.d.ts.map +0 -1
- package/dist/components/vibes/VibeForm.d.ts +0 -15
- package/dist/components/vibes/VibeForm.d.ts.map +0 -1
- package/dist/components/vibes/VibeList.d.ts +0 -20
- package/dist/components/vibes/VibeList.d.ts.map +0 -1
- package/dist/components/vibes/icons.d.ts +0 -6
- package/dist/components/vibes/icons.d.ts.map +0 -1
- package/dist/components/vibes/index.d.ts +0 -5
- package/dist/components/vibes/index.d.ts.map +0 -1
- package/dist/components/vibes/types.d.ts +0 -71
- package/dist/components/vibes/types.d.ts.map +0 -1
- package/dist/components/webhooks/WebhookCard.d.ts +0 -12
- package/dist/components/webhooks/WebhookCard.d.ts.map +0 -1
- package/dist/components/webhooks/WebhookForm.d.ts +0 -11
- package/dist/components/webhooks/WebhookForm.d.ts.map +0 -1
- package/dist/components/webhooks/WebhookList.d.ts +0 -14
- package/dist/components/webhooks/WebhookList.d.ts.map +0 -1
- package/dist/components/webhooks/index.d.ts +0 -5
- package/dist/components/webhooks/index.d.ts.map +0 -1
- package/dist/components/webhooks/types.d.ts +0 -58
- package/dist/components/webhooks/types.d.ts.map +0 -1
- package/dist/config/assistantUsecases.d.ts +0 -18
- package/dist/config/assistantUsecases.d.ts.map +0 -1
- package/dist/config/index.d.ts +0 -24
- package/dist/config/index.d.ts.map +0 -1
- package/dist/constants/permissions.d.ts +0 -112
- package/dist/constants/permissions.d.ts.map +0 -1
- package/dist/constants/pluginCatalog.d.ts +0 -36
- package/dist/constants/pluginCatalog.d.ts.map +0 -1
- package/dist/dev/main.d.ts +0 -2
- package/dist/dev/main.d.ts.map +0 -1
- package/dist/generated/global-operations.d.ts +0 -2
- package/dist/generated/global-operations.d.ts.map +0 -1
- package/dist/generated/global-types.d.ts +0 -21253
- package/dist/generated/global-types.d.ts.map +0 -1
- package/dist/generated/wspace-operations.d.ts +0 -15218
- package/dist/generated/wspace-operations.d.ts.map +0 -1
- package/dist/generated/wspace-types.d.ts +0 -55252
- package/dist/generated/wspace-types.d.ts.map +0 -1
- package/dist/hooks/index.d.ts +0 -7
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/useAgentConnectivity.d.ts +0 -47
- package/dist/hooks/useAgentConnectivity.d.ts.map +0 -1
- package/dist/hooks/useAgentEvents.d.ts +0 -36
- package/dist/hooks/useAgentEvents.d.ts.map +0 -1
- package/dist/hooks/useAgentManagerKeyboard.d.ts +0 -17
- package/dist/hooks/useAgentManagerKeyboard.d.ts.map +0 -1
- package/dist/hooks/useAgentManagerStreaming.d.ts +0 -19
- package/dist/hooks/useAgentManagerStreaming.d.ts.map +0 -1
- package/dist/hooks/useAssistantHeartbeat.d.ts +0 -4
- package/dist/hooks/useAssistantHeartbeat.d.ts.map +0 -1
- package/dist/hooks/useAssistantKeyboardShortcuts.d.ts +0 -18
- package/dist/hooks/useAssistantKeyboardShortcuts.d.ts.map +0 -1
- package/dist/hooks/useCachedInitialData.d.ts +0 -120
- package/dist/hooks/useCachedInitialData.d.ts.map +0 -1
- package/dist/hooks/useEntityTags.d.ts +0 -24
- package/dist/hooks/useEntityTags.d.ts.map +0 -1
- package/dist/hooks/useFileUpload.d.ts +0 -15
- package/dist/hooks/useFileUpload.d.ts.map +0 -1
- package/dist/hooks/useInitialDataLoader.d.ts +0 -48
- package/dist/hooks/useInitialDataLoader.d.ts.map +0 -1
- package/dist/hooks/useMcpServers.d.ts +0 -14
- package/dist/hooks/useMcpServers.d.ts.map +0 -1
- package/dist/hooks/useOpenAssistantHelp.d.ts +0 -2
- package/dist/hooks/useOpenAssistantHelp.d.ts.map +0 -1
- package/dist/hooks/usePluginAvailability.d.ts +0 -35
- package/dist/hooks/usePluginAvailability.d.ts.map +0 -1
- package/dist/hooks/useQueryBackedTab.d.ts +0 -2
- package/dist/hooks/useQueryBackedTab.d.ts.map +0 -1
- package/dist/hooks/useSessionSearch.d.ts +0 -24
- package/dist/hooks/useSessionSearch.d.ts.map +0 -1
- package/dist/hooks/useVoiceMode.d.ts +0 -17
- package/dist/hooks/useVoiceMode.d.ts.map +0 -1
- package/dist/index.d.ts +0 -17
- package/dist/index.d.ts.map +0 -1
- package/dist/lib/vibeFeatures.d.ts +0 -29
- package/dist/lib/vibeFeatures.d.ts.map +0 -1
- package/dist/node_modules/@xyflow/react/dist/esm/index.js +0 -3281
- package/dist/node_modules/@xyflow/react/dist/esm/index.js.map +0 -1
- package/dist/node_modules/@xyflow/system/dist/esm/index.js +0 -1845
- package/dist/node_modules/@xyflow/system/dist/esm/index.js.map +0 -1
- package/dist/node_modules/classcat/index.js +0 -12
- package/dist/node_modules/classcat/index.js.map +0 -1
- package/dist/node_modules/d3-dispatch/src/dispatch.js +0 -67
- package/dist/node_modules/d3-dispatch/src/dispatch.js.map +0 -1
- package/dist/node_modules/d3-drag/src/constant.js +0 -6
- package/dist/node_modules/d3-drag/src/constant.js.map +0 -1
- package/dist/node_modules/d3-drag/src/drag.js +0 -116
- package/dist/node_modules/d3-drag/src/drag.js.map +0 -1
- package/dist/node_modules/d3-drag/src/event.js +0 -64
- package/dist/node_modules/d3-drag/src/event.js.map +0 -1
- package/dist/node_modules/d3-drag/src/nodrag.js +0 -17
- package/dist/node_modules/d3-drag/src/nodrag.js.map +0 -1
- package/dist/node_modules/d3-drag/src/noevent.js +0 -15
- package/dist/node_modules/d3-drag/src/noevent.js.map +0 -1
- package/dist/node_modules/d3-ease/src/cubic.js +0 -8
- package/dist/node_modules/d3-ease/src/cubic.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/transform/decompose.js +0 -24
- package/dist/node_modules/d3-interpolate/src/transform/decompose.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/transform/index.js +0 -56
- package/dist/node_modules/d3-interpolate/src/transform/index.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/transform/parse.js +0 -14
- package/dist/node_modules/d3-interpolate/src/transform/parse.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/zoom.js +0 -43
- package/dist/node_modules/d3-interpolate/src/zoom.js.map +0 -1
- package/dist/node_modules/d3-selection/src/array.js +0 -8
- package/dist/node_modules/d3-selection/src/array.js.map +0 -1
- package/dist/node_modules/d3-selection/src/constant.js +0 -10
- package/dist/node_modules/d3-selection/src/constant.js.map +0 -1
- package/dist/node_modules/d3-selection/src/creator.js +0 -22
- package/dist/node_modules/d3-selection/src/creator.js.map +0 -1
- package/dist/node_modules/d3-selection/src/matcher.js +0 -15
- package/dist/node_modules/d3-selection/src/matcher.js.map +0 -1
- package/dist/node_modules/d3-selection/src/namespace.js +0 -13
- package/dist/node_modules/d3-selection/src/namespace.js.map +0 -1
- package/dist/node_modules/d3-selection/src/namespaces.js +0 -12
- package/dist/node_modules/d3-selection/src/namespaces.js.map +0 -1
- package/dist/node_modules/d3-selection/src/pointer.js +0 -20
- package/dist/node_modules/d3-selection/src/pointer.js.map +0 -1
- package/dist/node_modules/d3-selection/src/select.js +0 -9
- package/dist/node_modules/d3-selection/src/select.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/append.js +0 -12
- package/dist/node_modules/d3-selection/src/selection/append.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/attr.js +0 -46
- package/dist/node_modules/d3-selection/src/selection/attr.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/call.js +0 -9
- package/dist/node_modules/d3-selection/src/selection/call.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/classed.js +0 -55
- package/dist/node_modules/d3-selection/src/selection/classed.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/clone.js +0 -16
- package/dist/node_modules/d3-selection/src/selection/clone.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/data.js +0 -38
- package/dist/node_modules/d3-selection/src/selection/data.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/datum.js +0 -8
- package/dist/node_modules/d3-selection/src/selection/datum.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/dispatch.js +0 -23
- package/dist/node_modules/d3-selection/src/selection/dispatch.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/each.js +0 -9
- package/dist/node_modules/d3-selection/src/selection/each.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/empty.js +0 -8
- package/dist/node_modules/d3-selection/src/selection/empty.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/enter.js +0 -28
- package/dist/node_modules/d3-selection/src/selection/enter.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/exit.js +0 -10
- package/dist/node_modules/d3-selection/src/selection/exit.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/filter.js +0 -12
- package/dist/node_modules/d3-selection/src/selection/filter.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/html.js +0 -21
- package/dist/node_modules/d3-selection/src/selection/html.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/index.js +0 -87
- package/dist/node_modules/d3-selection/src/selection/index.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/insert.js +0 -16
- package/dist/node_modules/d3-selection/src/selection/insert.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/iterator.js +0 -8
- package/dist/node_modules/d3-selection/src/selection/iterator.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/join.js +0 -9
- package/dist/node_modules/d3-selection/src/selection/join.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/lower.js +0 -11
- package/dist/node_modules/d3-selection/src/selection/lower.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/merge.js +0 -11
- package/dist/node_modules/d3-selection/src/selection/merge.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/node.js +0 -12
- package/dist/node_modules/d3-selection/src/selection/node.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/nodes.js +0 -8
- package/dist/node_modules/d3-selection/src/selection/nodes.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/on.js +0 -58
- package/dist/node_modules/d3-selection/src/selection/on.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/order.js +0 -9
- package/dist/node_modules/d3-selection/src/selection/order.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/property.js +0 -24
- package/dist/node_modules/d3-selection/src/selection/property.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/raise.js +0 -11
- package/dist/node_modules/d3-selection/src/selection/raise.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/remove.js +0 -12
- package/dist/node_modules/d3-selection/src/selection/remove.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/select.js +0 -12
- package/dist/node_modules/d3-selection/src/selection/select.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/selectAll.js +0 -18
- package/dist/node_modules/d3-selection/src/selection/selectAll.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/selectChild.js +0 -18
- package/dist/node_modules/d3-selection/src/selection/selectChild.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/selectChildren.js +0 -18
- package/dist/node_modules/d3-selection/src/selection/selectChildren.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/size.js +0 -10
- package/dist/node_modules/d3-selection/src/selection/size.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/sort.js +0 -20
- package/dist/node_modules/d3-selection/src/selection/sort.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/sparse.js +0 -8
- package/dist/node_modules/d3-selection/src/selection/sparse.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/style.js +0 -28
- package/dist/node_modules/d3-selection/src/selection/style.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/text.js +0 -21
- package/dist/node_modules/d3-selection/src/selection/text.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selector.js +0 -11
- package/dist/node_modules/d3-selection/src/selector.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selectorAll.js +0 -13
- package/dist/node_modules/d3-selection/src/selectorAll.js.map +0 -1
- package/dist/node_modules/d3-selection/src/sourceEvent.js +0 -10
- package/dist/node_modules/d3-selection/src/sourceEvent.js.map +0 -1
- package/dist/node_modules/d3-selection/src/window.js +0 -8
- package/dist/node_modules/d3-selection/src/window.js.map +0 -1
- package/dist/node_modules/d3-timer/src/timeout.js +0 -12
- package/dist/node_modules/d3-timer/src/timeout.js.map +0 -1
- package/dist/node_modules/d3-timer/src/timer.js +0 -55
- package/dist/node_modules/d3-timer/src/timer.js.map +0 -1
- package/dist/node_modules/d3-transition/src/index.js +0 -3
- package/dist/node_modules/d3-transition/src/interrupt.js +0 -18
- package/dist/node_modules/d3-transition/src/interrupt.js.map +0 -1
- package/dist/node_modules/d3-transition/src/selection/index.js +0 -7
- package/dist/node_modules/d3-transition/src/selection/index.js.map +0 -1
- package/dist/node_modules/d3-transition/src/selection/interrupt.js +0 -11
- package/dist/node_modules/d3-transition/src/selection/interrupt.js.map +0 -1
- package/dist/node_modules/d3-transition/src/selection/transition.js +0 -25
- package/dist/node_modules/d3-transition/src/selection/transition.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/attr.js +0 -51
- package/dist/node_modules/d3-transition/src/transition/attr.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/attrTween.js +0 -40
- package/dist/node_modules/d3-transition/src/transition/attrTween.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/delay.js +0 -20
- package/dist/node_modules/d3-transition/src/transition/delay.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/duration.js +0 -20
- package/dist/node_modules/d3-transition/src/transition/duration.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/ease.js +0 -16
- package/dist/node_modules/d3-transition/src/transition/ease.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/easeVarying.js +0 -17
- package/dist/node_modules/d3-transition/src/transition/easeVarying.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/end.js +0 -18
- package/dist/node_modules/d3-transition/src/transition/end.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/filter.js +0 -12
- package/dist/node_modules/d3-transition/src/transition/filter.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/index.js +0 -69
- package/dist/node_modules/d3-transition/src/transition/index.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/interpolate.js +0 -13
- package/dist/node_modules/d3-transition/src/transition/interpolate.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/merge.js +0 -12
- package/dist/node_modules/d3-transition/src/transition/merge.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/on.js +0 -23
- package/dist/node_modules/d3-transition/src/transition/on.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/remove.js +0 -15
- package/dist/node_modules/d3-transition/src/transition/remove.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/schedule.js +0 -71
- package/dist/node_modules/d3-transition/src/transition/schedule.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/select.js +0 -14
- package/dist/node_modules/d3-transition/src/transition/select.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/selectAll.js +0 -17
- package/dist/node_modules/d3-transition/src/transition/selectAll.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/selection.js +0 -10
- package/dist/node_modules/d3-transition/src/transition/selection.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/style.js +0 -47
- package/dist/node_modules/d3-transition/src/transition/style.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/styleTween.js +0 -25
- package/dist/node_modules/d3-transition/src/transition/styleTween.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/text.js +0 -19
- package/dist/node_modules/d3-transition/src/transition/text.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/textTween.js +0 -25
- package/dist/node_modules/d3-transition/src/transition/textTween.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/transition.js +0 -19
- package/dist/node_modules/d3-transition/src/transition/transition.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/tween.js +0 -56
- package/dist/node_modules/d3-transition/src/transition/tween.js.map +0 -1
- package/dist/node_modules/d3-zoom/src/constant.js +0 -6
- package/dist/node_modules/d3-zoom/src/constant.js.map +0 -1
- package/dist/node_modules/d3-zoom/src/event.js +0 -30
- package/dist/node_modules/d3-zoom/src/event.js.map +0 -1
- package/dist/node_modules/d3-zoom/src/index.js +0 -2
- package/dist/node_modules/d3-zoom/src/noevent.js +0 -11
- package/dist/node_modules/d3-zoom/src/noevent.js.map +0 -1
- package/dist/node_modules/d3-zoom/src/transform.js +0 -50
- package/dist/node_modules/d3-zoom/src/transform.js.map +0 -1
- package/dist/node_modules/d3-zoom/src/zoom.js +0 -219
- package/dist/node_modules/d3-zoom/src/zoom.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +0 -56
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js +0 -54
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +0 -54
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +0 -46
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/shim/index.js +0 -12
- package/dist/node_modules/use-sync-external-store/shim/index.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/shim/with-selector.js +0 -12
- package/dist/node_modules/use-sync-external-store/shim/with-selector.js.map +0 -1
- package/dist/node_modules/zustand/esm/traditional.js +0 -17
- package/dist/node_modules/zustand/esm/traditional.js.map +0 -1
- package/dist/node_modules/zustand/esm/vanilla/shallow.js +0 -21
- package/dist/node_modules/zustand/esm/vanilla/shallow.js.map +0 -1
- package/dist/node_modules/zustand/esm/vanilla.js +0 -20
- package/dist/node_modules/zustand/esm/vanilla.js.map +0 -1
- package/dist/pages/ActionsPage.d.ts +0 -2
- package/dist/pages/ActionsPage.d.ts.map +0 -1
- package/dist/pages/AgentDetailsPage.d.ts +0 -5
- package/dist/pages/AgentDetailsPage.d.ts.map +0 -1
- package/dist/pages/AgentGraphPage.d.ts +0 -9
- package/dist/pages/AgentGraphPage.d.ts.map +0 -1
- package/dist/pages/AgentsLandingPage.d.ts +0 -12
- package/dist/pages/AgentsLandingPage.d.ts.map +0 -1
- package/dist/pages/AgentsPage.d.ts +0 -5
- package/dist/pages/AgentsPage.d.ts.map +0 -1
- package/dist/pages/AnalyticsPage.d.ts +0 -2
- package/dist/pages/AnalyticsPage.d.ts.map +0 -1
- package/dist/pages/CatalogDetailPage.d.ts +0 -2
- package/dist/pages/CatalogDetailPage.d.ts.map +0 -1
- package/dist/pages/CatalogDocsPage.d.ts +0 -2
- package/dist/pages/CatalogDocsPage.d.ts.map +0 -1
- package/dist/pages/CatalogPage.d.ts +0 -2
- package/dist/pages/CatalogPage.d.ts.map +0 -1
- package/dist/pages/ComponentDetailPage.d.ts +0 -2
- package/dist/pages/ComponentDetailPage.d.ts.map +0 -1
- package/dist/pages/ComponentDocsPage.d.ts +0 -2
- package/dist/pages/ComponentDocsPage.d.ts.map +0 -1
- package/dist/pages/ComponentsPage.d.ts +0 -2
- package/dist/pages/ComponentsPage.d.ts.map +0 -1
- package/dist/pages/GettingStartedPage.d.ts +0 -16
- package/dist/pages/GettingStartedPage.d.ts.map +0 -1
- package/dist/pages/HealthPage.d.ts +0 -2
- package/dist/pages/HealthPage.d.ts.map +0 -1
- package/dist/pages/LogsPage.d.ts +0 -2
- package/dist/pages/LogsPage.d.ts.map +0 -1
- package/dist/pages/NoteDetailsPage.d.ts +0 -2
- package/dist/pages/NoteDetailsPage.d.ts.map +0 -1
- package/dist/pages/OverviewPage.d.ts +0 -9
- package/dist/pages/OverviewPage.d.ts.map +0 -1
- package/dist/pages/SessionDetailsPage.d.ts +0 -6
- package/dist/pages/SessionDetailsPage.d.ts.map +0 -1
- package/dist/pages/SessionsPage.d.ts +0 -6
- package/dist/pages/SessionsPage.d.ts.map +0 -1
- package/dist/pages/SettingsPage.d.ts +0 -2
- package/dist/pages/SettingsPage.d.ts.map +0 -1
- package/dist/pages/SharedSessionPage.d.ts +0 -13
- package/dist/pages/SharedSessionPage.d.ts.map +0 -1
- package/dist/pages/SharedVibeDeckPage.d.ts +0 -8
- package/dist/pages/SharedVibeDeckPage.d.ts.map +0 -1
- package/dist/pages/TargetDetailsPage.d.ts +0 -13
- package/dist/pages/TargetDetailsPage.d.ts.map +0 -1
- package/dist/pages/TargetsPage.d.ts +0 -8
- package/dist/pages/TargetsPage.d.ts.map +0 -1
- package/dist/pages/TemplateDetailPage.d.ts +0 -2
- package/dist/pages/TemplateDetailPage.d.ts.map +0 -1
- package/dist/pages/TemplatesPage.d.ts +0 -2
- package/dist/pages/TemplatesPage.d.ts.map +0 -1
- package/dist/pages/TunnelsLandingPage.d.ts +0 -8
- package/dist/pages/TunnelsLandingPage.d.ts.map +0 -1
- package/dist/pages/VibeAuditPage.d.ts +0 -2
- package/dist/pages/VibeAuditPage.d.ts.map +0 -1
- package/dist/pages/VibeCalendarPage.d.ts +0 -9
- package/dist/pages/VibeCalendarPage.d.ts.map +0 -1
- package/dist/pages/VibeDeckPage.d.ts +0 -2
- package/dist/pages/VibeDeckPage.d.ts.map +0 -1
- package/dist/pages/VibeDetailsPage.d.ts +0 -5
- package/dist/pages/VibeDetailsPage.d.ts.map +0 -1
- package/dist/pages/VibeDocsPage.d.ts +0 -2
- package/dist/pages/VibeDocsPage.d.ts.map +0 -1
- package/dist/pages/VibeTaskDetailPage.d.ts +0 -9
- package/dist/pages/VibeTaskDetailPage.d.ts.map +0 -1
- package/dist/pages/VibesPage.d.ts +0 -5
- package/dist/pages/VibesPage.d.ts.map +0 -1
- package/dist/pages/WebhooksPage.d.ts +0 -5
- package/dist/pages/WebhooksPage.d.ts.map +0 -1
- package/dist/pages/ai/AIPage.d.ts +0 -6
- package/dist/pages/ai/AIPage.d.ts.map +0 -1
- package/dist/pages/ai/AISessionDetailPage.d.ts +0 -5
- package/dist/pages/ai/AISessionDetailPage.d.ts.map +0 -1
- package/dist/pages/ai/AgentManagerPage.d.ts +0 -9
- package/dist/pages/ai/AgentManagerPage.d.ts.map +0 -1
- package/dist/pages/index.d.ts +0 -17
- package/dist/pages/index.d.ts.map +0 -1
- package/dist/pages/tunnels/AuditTab.d.ts +0 -8
- package/dist/pages/tunnels/AuditTab.d.ts.map +0 -1
- package/dist/pages/tunnels/DomainsTab.d.ts +0 -2
- package/dist/pages/tunnels/DomainsTab.d.ts.map +0 -1
- package/dist/pages/tunnels/ProvidersTab.d.ts +0 -2
- package/dist/pages/tunnels/ProvidersTab.d.ts.map +0 -1
- package/dist/pages/tunnels/SessionsTab.d.ts +0 -8
- package/dist/pages/tunnels/SessionsTab.d.ts.map +0 -1
- package/dist/pages/tunnels/TunnelDetailsPage.d.ts +0 -2
- package/dist/pages/tunnels/TunnelDetailsPage.d.ts.map +0 -1
- package/dist/pages/tunnels/TunnelsTab.d.ts +0 -2
- package/dist/pages/tunnels/TunnelsTab.d.ts.map +0 -1
- package/dist/pages/tunnels/UsageTab.d.ts +0 -8
- package/dist/pages/tunnels/UsageTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelAuditTab.d.ts +0 -4
- package/dist/pages/tunnels/tabs/TunnelAuditTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelCliTab.d.ts +0 -8
- package/dist/pages/tunnels/tabs/TunnelCliTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelDomainsTab.d.ts +0 -8
- package/dist/pages/tunnels/tabs/TunnelDomainsTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelEndpointsTab.d.ts +0 -8
- package/dist/pages/tunnels/tabs/TunnelEndpointsTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelOverviewTab.d.ts +0 -8
- package/dist/pages/tunnels/tabs/TunnelOverviewTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelSessionsTab.d.ts +0 -4
- package/dist/pages/tunnels/tabs/TunnelSessionsTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelSettingsTab.d.ts +0 -9
- package/dist/pages/tunnels/tabs/TunnelSettingsTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelUsageTab.d.ts +0 -4
- package/dist/pages/tunnels/tabs/TunnelUsageTab.d.ts.map +0 -1
- package/dist/plugin.d.ts +0 -4
- package/dist/plugin.d.ts.map +0 -1
- package/dist/providers/AgentEventsProvider.d.ts +0 -79
- package/dist/providers/AgentEventsProvider.d.ts.map +0 -1
- package/dist/providers/VibeControlsProvider.d.ts +0 -29
- package/dist/providers/VibeControlsProvider.d.ts.map +0 -1
- package/dist/services/aiApi.d.ts +0 -310
- package/dist/services/aiApi.d.ts.map +0 -1
- package/dist/services/assistantApi.d.ts +0 -71
- package/dist/services/assistantApi.d.ts.map +0 -1
- package/dist/services/assistantExportService.d.ts +0 -9
- package/dist/services/assistantExportService.d.ts.map +0 -1
- package/dist/services/schedulerApi.d.ts +0 -18
- package/dist/services/schedulerApi.d.ts.map +0 -1
- package/dist/shared/hooks/useTr.d.ts +0 -17
- package/dist/shared/hooks/useTr.d.ts.map +0 -1
- package/dist/store/agentManagerStore.d.ts +0 -65
- package/dist/store/agentManagerStore.d.ts.map +0 -1
- package/dist/store/assistantStore.d.ts +0 -56
- package/dist/store/assistantStore.d.ts.map +0 -1
- package/dist/store/vibeControlsStore.d.ts +0 -68
- package/dist/store/vibeControlsStore.d.ts.map +0 -1
- package/dist/translations/en.d.ts +0 -2174
- package/dist/translations/en.d.ts.map +0 -1
- package/dist/types/agentManager.d.ts +0 -72
- package/dist/types/agentManager.d.ts.map +0 -1
- package/dist/types/assistant.d.ts +0 -58
- package/dist/types/assistant.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -134
- package/dist/types/index.d.ts.map +0 -1
- package/dist/utils/agentStatus.d.ts +0 -42
- package/dist/utils/agentStatus.d.ts.map +0 -1
- package/dist/utils/aiSessionNotFound.d.ts +0 -2
- package/dist/utils/aiSessionNotFound.d.ts.map +0 -1
- package/dist/utils/nativeBridge.d.ts +0 -3
- package/dist/utils/nativeBridge.d.ts.map +0 -1
- package/dist/utils/pageContext.d.ts +0 -23
- package/dist/utils/pageContext.d.ts.map +0 -1
- package/dist/utils/quotaUtils.d.ts +0 -8
- package/dist/utils/quotaUtils.d.ts.map +0 -1
- package/dist/utils/relativeTime.d.ts +0 -3
- package/dist/utils/relativeTime.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentBackupTab.js","names":[],"sources":["../../../../src/components/agents/backup/AgentBackupTab.tsx"],"sourcesContent":["/**\n * AgentBackupTab — UI for managing SQLite database backups of a VibeControls agent.\n * Talks directly to the agent's REST API via its tunnel URL.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n Database,\n Upload,\n RefreshCw,\n Settings,\n Play,\n Clock,\n CheckCircle2,\n XCircle,\n Loader2,\n Trash2,\n RotateCcw,\n Wifi,\n} from 'lucide-react';\nimport { useTr } from '../../../shared/hooks/useTr';\n\ninterface BackupConfig {\n enabled: boolean;\n scheduleIntervalMs: number;\n changeOnlyBackup: boolean;\n storageTarget: 'wspace' | 'custom-s3';\n customS3?: {\n endpoint: string;\n bucket: string;\n region: string;\n accessKeyId: string;\n secretAccessKey: string;\n pathPrefix?: string;\n };\n retentionDays?: number;\n maxBackups?: number;\n}\n\ninterface BackupRecord {\n id: string;\n timestamp: string;\n agentName: string;\n dbSizeBytes: number;\n sha256Hash: string;\n storageTarget: string;\n storagePath: string;\n durationMs: number;\n status: string;\n error?: string;\n}\n\ninterface BackupStatus {\n enabled: boolean;\n schedulerRunning: boolean;\n lastBackupTime: string | null;\n lastBackupHash: string | null;\n nextScheduledBackup: string | null;\n totalBackups: number;\n storageTarget: string;\n}\n\ninterface AgentBackupTabProps {\n agentTunnelUrl: string;\n agentApiKey: string;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction formatTime(iso: string): string {\n return new Date(iso).toLocaleString();\n}\n\nexport function AgentBackupTab({ agentTunnelUrl, agentApiKey }: AgentBackupTabProps) {\n const tr = useTr();\n const [config, setConfig] = useState<BackupConfig | null>(null);\n const [status, setStatus] = useState<BackupStatus | null>(null);\n const [backups, setBackups] = useState<BackupRecord[]>([]);\n const [loading, setLoading] = useState(true);\n const [actionLoading, setActionLoading] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [successMsg, setSuccessMsg] = useState<string | null>(null);\n const [showConfig, setShowConfig] = useState(false);\n\n const apiUrl = agentTunnelUrl.replace(/\\/+$/, '');\n\n const apiFetch = useCallback(\n async (path: string, options?: RequestInit) => {\n const res = await fetch(`${apiUrl}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n 'x-agent-api-key': agentApiKey,\n ...options?.headers,\n },\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(text || `HTTP ${res.status}`);\n }\n return res.json();\n },\n [apiUrl, agentApiKey]\n );\n\n const refresh = useCallback(async () => {\n try {\n setLoading(true);\n setError(null);\n const [configRes, statusRes, listRes] = await Promise.all([\n apiFetch('/api/backup/config'),\n apiFetch('/api/backup/status'),\n apiFetch('/api/backup/list?limit=20'),\n ]);\n setConfig(configRes.config);\n setStatus(statusRes.status);\n setBackups(listRes.backups || []);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n setError(\n msg === 'Failed to fetch'\n ? `Cannot reach agent REST API at ${apiUrl}. Ensure the agent is running and its tunnel URL is accessible.`\n : msg\n );\n } finally {\n setLoading(false);\n }\n }, [apiFetch, apiUrl]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n // Clear success message after 3s\n useEffect(() => {\n if (successMsg) {\n const t = setTimeout(() => setSuccessMsg(null), 3000);\n return () => clearTimeout(t);\n }\n }, [successMsg]);\n\n const handleRunBackup = async (force: boolean) => {\n try {\n setActionLoading('backup');\n setError(null);\n const res = await apiFetch(`/api/backup/run?force=${force}`, { method: 'POST' });\n const b = res.backup;\n if (b.error === 'Skipped: no changes') {\n setSuccessMsg('No changes detected — backup skipped');\n } else {\n setSuccessMsg(\n `Backup completed: ${formatBytes(b.dbSizeBytes)} in ${formatDuration(b.durationMs)}`\n );\n }\n await refresh();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setActionLoading(null);\n }\n };\n\n const handleRestore = async (backupId: string, dryRun: boolean) => {\n try {\n setActionLoading(`restore-${backupId}`);\n setError(null);\n const res = await apiFetch('/api/backup/restore', {\n method: 'POST',\n body: JSON.stringify({ backupId, dryRun }),\n });\n if (res.success) {\n setSuccessMsg(res.message);\n } else {\n setError(res.message);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setActionLoading(null);\n }\n };\n\n const handleToggleEnabled = async () => {\n try {\n setActionLoading('toggle');\n const res = await apiFetch('/api/backup/config', {\n method: 'PUT',\n body: JSON.stringify({ enabled: !config?.enabled }),\n });\n setConfig(res.config);\n setSuccessMsg(res.config.enabled ? 'Backup enabled' : 'Backup disabled');\n await refresh();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setActionLoading(null);\n }\n };\n\n const handleTestConnection = async () => {\n try {\n setActionLoading('test');\n const res = await apiFetch('/api/backup/test-connection', { method: 'POST' });\n if (res.ok) {\n setSuccessMsg(`Connection OK: ${res.message}`);\n } else {\n setError(`Connection failed: ${res.message}`);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setActionLoading(null);\n }\n };\n\n const handleDeleteBackup = async (backupId: string) => {\n try {\n setActionLoading(`delete-${backupId}`);\n await apiFetch(`/api/backup/backups/${backupId}`, { method: 'DELETE' });\n setSuccessMsg('Backup deleted');\n await refresh();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setActionLoading(null);\n }\n };\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-text-secondary\">\n <Loader2 className=\"w-5 h-5 animate-spin mr-2\" />\n {tr('vibecontrols.agents.backup.loading', 'Loading backup settings...')}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Status Messages */}\n {error && (\n <div className=\"flex items-center gap-2 rounded-lg border border-status-error-border bg-status-error-bg-subtle p-3 text-sm text-status-error-text\">\n <XCircle className=\"w-4 h-4 shrink-0\" />\n {error}\n <button onClick={() => setError(null)} className=\"ml-auto text-xs underline\">\n Dismiss\n </button>\n </div>\n )}\n {successMsg && (\n <div className=\"flex items-center gap-2 rounded-lg border border-status-success-border bg-status-success-bg-subtle p-3 text-sm text-status-success-text\">\n <CheckCircle2 className=\"w-4 h-4 shrink-0\" />\n {successMsg}\n </div>\n )}\n\n {/* Status Card */}\n <div className=\"rounded-lg border border-border-default bg-bg-surface p-5\">\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-2\">\n <Database className=\"w-5 h-5 text-action-primary-bg\" />\n <h3 className=\"font-semibold text-text-primary\">\n {tr('vibecontrols.agents.backup.title', 'Database Backup')}\n </h3>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={refresh}\n className=\"p-2 rounded-lg hover:bg-bg-sunken transition-colors text-text-secondary\"\n title=\"Refresh\"\n >\n <RefreshCw className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => setShowConfig(!showConfig)}\n className=\"p-2 rounded-lg hover:bg-bg-sunken transition-colors text-text-secondary\"\n title=\"Settings\"\n >\n <Settings className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 mb-4\">\n <div>\n <p className=\"text-xs text-text-muted mb-1\">\n {tr('vibecontrols.agents.backup.status', 'Status')}\n </p>\n <div className=\"flex items-center gap-1.5\">\n {config?.enabled ? (\n <>\n <div className=\"h-2 w-2 rounded-full bg-status-success-bg\" />\n <span className=\"text-sm font-medium text-text-primary\">\n {tr('vibecontrols.agents.backup.enabled', 'Enabled')}\n </span>\n </>\n ) : (\n <>\n <div className=\"h-2 w-2 rounded-full bg-text-tertiary\" />\n <span className=\"text-sm font-medium text-text-secondary\">\n {tr('vibecontrols.agents.backup.disabled', 'Disabled')}\n </span>\n </>\n )}\n </div>\n </div>\n <div>\n <p className=\"text-xs text-text-muted mb-1\">\n {tr('vibecontrols.agents.backup.scheduler', 'Scheduler')}\n </p>\n <span className=\"text-sm font-medium text-text-primary\">\n {status?.schedulerRunning ? 'Running' : 'Stopped'}\n </span>\n </div>\n <div>\n <p className=\"text-xs text-text-muted mb-1\">\n {tr('vibecontrols.agents.backup.totalBackups', 'Total Backups')}\n </p>\n <span className=\"text-sm font-medium text-text-primary\">\n {status?.totalBackups ?? 0}\n </span>\n </div>\n <div>\n <p className=\"text-xs text-text-muted mb-1\">\n {tr('vibecontrols.agents.backup.target', 'Target')}\n </p>\n <span className=\"text-sm font-medium text-text-primary\">\n {status?.storageTarget ?? 'N/A'}\n </span>\n </div>\n </div>\n\n {status?.lastBackupTime && (\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-text-muted\">\n <span>\n <Clock className=\"w-3 h-3 inline mr-1\" />\n Last: {formatTime(status.lastBackupTime)}\n </span>\n {status.nextScheduledBackup && (\n <span>Next: {formatTime(status.nextScheduledBackup)}</span>\n )}\n </div>\n )}\n\n {/* Action Buttons */}\n <div className=\"flex flex-wrap gap-2 mt-4 pt-4 border-t border-border-subtle\">\n <button\n onClick={() => handleRunBackup(true)}\n disabled={!!actionLoading}\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg bg-action-primary-bg text-action-primary-text text-sm font-medium hover:bg-action-primary-bg-hover disabled:opacity-50 transition-colors\"\n >\n {actionLoading === 'backup' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Upload className=\"w-4 h-4\" />\n )}\n {tr('vibecontrols.agents.backup.backupNow', 'Backup Now')}\n </button>\n <button\n onClick={() => handleRunBackup(false)}\n disabled={!!actionLoading}\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg bg-bg-sunken text-text-primary text-sm font-medium hover:bg-bg-canvas border border-border-default disabled:opacity-50 transition-colors\"\n >\n <Play className=\"w-4 h-4\" />\n {tr('vibecontrols.agents.backup.backupIfChanged', 'Backup if Changed')}\n </button>\n <button\n onClick={handleToggleEnabled}\n disabled={!!actionLoading}\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg bg-bg-sunken text-text-primary text-sm font-medium hover:bg-bg-canvas border border-border-default disabled:opacity-50 transition-colors\"\n >\n {actionLoading === 'toggle' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : config?.enabled ? (\n <XCircle className=\"w-4 h-4\" />\n ) : (\n <CheckCircle2 className=\"w-4 h-4\" />\n )}\n {config?.enabled\n ? tr('vibecontrols.agents.backup.disableSchedule', 'Disable Schedule')\n : tr('vibecontrols.agents.backup.enableSchedule', 'Enable Schedule')}\n </button>\n <button\n onClick={handleTestConnection}\n disabled={!!actionLoading}\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg bg-bg-sunken text-text-primary text-sm font-medium hover:bg-bg-canvas border border-border-default disabled:opacity-50 transition-colors\"\n >\n {actionLoading === 'test' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Wifi className=\"w-4 h-4\" />\n )}\n {tr('vibecontrols.agents.backup.testConnection', 'Test Connection')}\n </button>\n </div>\n </div>\n\n {/* Configuration Panel (collapsible) */}\n {showConfig && config && (\n <div className=\"rounded-lg border border-border-default bg-bg-surface p-5\">\n <h4 className=\"font-semibold text-text-primary mb-3 flex items-center gap-2\">\n <Settings className=\"w-4 h-4\" />\n {tr('vibecontrols.agents.backup.configuration', 'Configuration')}\n </h4>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 text-sm\">\n <div>\n <span className=\"text-text-muted\">Schedule Interval:</span>{' '}\n <span className=\"text-text-primary font-medium\">\n {config.scheduleIntervalMs >= 3600000\n ? `${config.scheduleIntervalMs / 3600000}h`\n : `${config.scheduleIntervalMs / 60000}m`}\n </span>\n </div>\n <div>\n <span className=\"text-text-muted\">Change Detection:</span>{' '}\n <span className=\"text-text-primary font-medium\">\n {config.changeOnlyBackup ? 'On' : 'Off'}\n </span>\n </div>\n <div>\n <span className=\"text-text-muted\">Storage Target:</span>{' '}\n <span className=\"text-text-primary font-medium\">{config.storageTarget}</span>\n </div>\n {config.customS3 && (\n <>\n <div>\n <span className=\"text-text-muted\">S3 Bucket:</span>{' '}\n <span className=\"text-text-primary font-medium\">{config.customS3.bucket}</span>\n </div>\n <div>\n <span className=\"text-text-muted\">S3 Region:</span>{' '}\n <span className=\"text-text-primary font-medium\">{config.customS3.region}</span>\n </div>\n </>\n )}\n {config.retentionDays && (\n <div>\n <span className=\"text-text-muted\">Retention:</span>{' '}\n <span className=\"text-text-primary font-medium\">{config.retentionDays} days</span>\n </div>\n )}\n {config.maxBackups && (\n <div>\n <span className=\"text-text-muted\">Max Backups:</span>{' '}\n <span className=\"text-text-primary font-medium\">{config.maxBackups}</span>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Backup History */}\n <div className=\"rounded-lg border border-border-default bg-bg-surface p-5\">\n <h4 className=\"font-semibold text-text-primary mb-3 flex items-center gap-2\">\n <Clock className=\"w-4 h-4\" />\n {tr('vibecontrols.agents.backup.history', 'Backup History')}\n <span className=\"text-xs text-text-muted font-normal\">({backups.length} shown)</span>\n </h4>\n\n {backups.length === 0 ? (\n <p className=\"text-sm text-text-muted py-4 text-center\">\n {tr(\n 'vibecontrols.agents.backup.noBackups',\n 'No backups yet. Click \"Backup Now\" to create one.'\n )}\n </p>\n ) : (\n <div className=\"space-y-2\">\n {backups.map((b) => (\n <div\n key={b.id}\n className=\"flex items-center justify-between p-3 rounded-lg border border-border-subtle hover:bg-bg-sunken transition-colors\"\n >\n <div className=\"flex items-center gap-3 min-w-0\">\n <div\n className={`w-8 h-8 rounded-lg flex items-center justify-center shrink-0 ${\n b.status === 'completed'\n ? 'border border-status-success-border bg-status-success-bg-subtle'\n : 'border border-status-error-border bg-status-error-bg-subtle'\n }`}\n >\n {b.status === 'completed' ? (\n <CheckCircle2 className=\"w-4 h-4 text-status-success-text\" />\n ) : (\n <XCircle className=\"w-4 h-4 text-status-error-text\" />\n )}\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {formatTime(b.timestamp)}\n </p>\n <p className=\"text-xs text-text-muted truncate\">\n {formatBytes(b.dbSizeBytes)} · {formatDuration(b.durationMs)} ·{' '}\n {b.storageTarget}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n <button\n onClick={() => handleRestore(b.id, true)}\n disabled={!!actionLoading}\n className=\"p-1.5 rounded hover:bg-bg-canvas text-text-secondary transition-colors\"\n title=\"Validate (dry run)\"\n >\n {actionLoading === `restore-${b.id}` ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <CheckCircle2 className=\"w-4 h-4\" />\n )}\n </button>\n <button\n onClick={() => {\n if (confirm('Restore this backup? The agent will need to restart.')) {\n handleRestore(b.id, false);\n }\n }}\n disabled={!!actionLoading}\n className=\"p-1.5 rounded hover:bg-bg-canvas text-text-secondary transition-colors\"\n title=\"Restore\"\n >\n <RotateCcw className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleDeleteBackup(b.id)}\n disabled={!!actionLoading}\n className=\"p-1.5 rounded text-text-secondary transition-colors hover:bg-status-error-bg/80 hover:text-status-error-text\"\n title=\"Delete\"\n >\n {actionLoading === `delete-${b.id}` ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Trash2 className=\"w-4 h-4\" />\n )}\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AgentBackupTab.js","names":[],"sources":["../../../../src/components/agents/backup/AgentBackupTab.tsx"],"sourcesContent":["/**\n * AgentBackupTab — UI for managing SQLite database backups of a VibeControls agent.\n * Talks directly to the agent's REST API via its tunnel URL.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport {\n Database,\n Upload,\n RefreshCw,\n Settings,\n Play,\n Clock,\n CheckCircle2,\n XCircle,\n Loader2,\n Trash2,\n RotateCcw,\n Wifi,\n} from 'lucide-react';\nimport { useTr } from '../../../shared/hooks/useTr';\nimport { agentApiPath } from '@/utils/agentApiPath';\n\ninterface BackupConfig {\n enabled: boolean;\n scheduleIntervalMs: number;\n changeOnlyBackup: boolean;\n storageTarget: 'wspace' | 'custom-s3';\n customS3?: {\n endpoint: string;\n bucket: string;\n region: string;\n accessKeyId: string;\n secretAccessKey: string;\n pathPrefix?: string;\n };\n retentionDays?: number;\n maxBackups?: number;\n}\n\ninterface BackupRecord {\n id: string;\n timestamp: string;\n agentName: string;\n dbSizeBytes: number;\n sha256Hash: string;\n storageTarget: string;\n storagePath: string;\n durationMs: number;\n status: string;\n error?: string;\n}\n\ninterface BackupStatus {\n enabled: boolean;\n schedulerRunning: boolean;\n lastBackupTime: string | null;\n lastBackupHash: string | null;\n nextScheduledBackup: string | null;\n totalBackups: number;\n storageTarget: string;\n}\n\ninterface AgentBackupTabProps {\n agentTunnelUrl: string;\n agentApiKey: string;\n /** Canonical CLI profile name on the remote agent. */\n profile: string;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction formatTime(iso: string): string {\n return new Date(iso).toLocaleString();\n}\n\nexport function AgentBackupTab({ agentTunnelUrl, agentApiKey, profile }: AgentBackupTabProps) {\n const tr = useTr();\n const [config, setConfig] = useState<BackupConfig | null>(null);\n const [status, setStatus] = useState<BackupStatus | null>(null);\n const [backups, setBackups] = useState<BackupRecord[]>([]);\n const [loading, setLoading] = useState(true);\n const [actionLoading, setActionLoading] = useState<string | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [successMsg, setSuccessMsg] = useState<string | null>(null);\n const [showConfig, setShowConfig] = useState(false);\n\n const apiUrl = agentTunnelUrl.replace(/\\/+$/, '');\n\n const apiFetch = useCallback(\n async (path: string, options?: RequestInit) => {\n const res = await fetch(`${apiUrl}${path}`, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n 'x-agent-api-key': agentApiKey,\n ...options?.headers,\n },\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(text || `HTTP ${res.status}`);\n }\n return res.json();\n },\n [apiUrl, agentApiKey]\n );\n\n const refresh = useCallback(async () => {\n try {\n setLoading(true);\n setError(null);\n const [configRes, statusRes, listRes] = await Promise.all([\n apiFetch(agentApiPath(profile, '/backup/config')),\n apiFetch(agentApiPath(profile, '/backup/status')),\n apiFetch(`${agentApiPath(profile, '/backup/list')}?limit=20`),\n ]);\n setConfig(configRes.config);\n setStatus(statusRes.status);\n setBackups(listRes.backups || []);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n setError(\n msg === 'Failed to fetch'\n ? `Cannot reach agent REST API at ${apiUrl}. Ensure the agent is running and its tunnel URL is accessible.`\n : msg\n );\n } finally {\n setLoading(false);\n }\n }, [apiFetch, apiUrl]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n // Clear success message after 3s\n useEffect(() => {\n if (successMsg) {\n const t = setTimeout(() => setSuccessMsg(null), 3000);\n return () => clearTimeout(t);\n }\n }, [successMsg]);\n\n const handleRunBackup = async (force: boolean) => {\n try {\n setActionLoading('backup');\n setError(null);\n const res = await apiFetch(`${agentApiPath(profile, '/backup/run')}?force=${force}`, {\n method: 'POST',\n });\n const b = res.backup;\n if (b.error === 'Skipped: no changes') {\n setSuccessMsg('No changes detected — backup skipped');\n } else {\n setSuccessMsg(\n `Backup completed: ${formatBytes(b.dbSizeBytes)} in ${formatDuration(b.durationMs)}`\n );\n }\n await refresh();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setActionLoading(null);\n }\n };\n\n const handleRestore = async (backupId: string, dryRun: boolean) => {\n try {\n setActionLoading(`restore-${backupId}`);\n setError(null);\n const res = await apiFetch(agentApiPath(profile, '/backup/restore'), {\n method: 'POST',\n body: JSON.stringify({ backupId, dryRun }),\n });\n if (res.success) {\n setSuccessMsg(res.message);\n } else {\n setError(res.message);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setActionLoading(null);\n }\n };\n\n const handleToggleEnabled = async () => {\n try {\n setActionLoading('toggle');\n const res = await apiFetch(agentApiPath(profile, '/backup/config'), {\n method: 'PUT',\n body: JSON.stringify({ enabled: !config?.enabled }),\n });\n setConfig(res.config);\n setSuccessMsg(res.config.enabled ? 'Backup enabled' : 'Backup disabled');\n await refresh();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setActionLoading(null);\n }\n };\n\n const handleTestConnection = async () => {\n try {\n setActionLoading('test');\n const res = await apiFetch(agentApiPath(profile, '/backup/test-connection'), {\n method: 'POST',\n });\n if (res.ok) {\n setSuccessMsg(`Connection OK: ${res.message}`);\n } else {\n setError(`Connection failed: ${res.message}`);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setActionLoading(null);\n }\n };\n\n const handleDeleteBackup = async (backupId: string) => {\n try {\n setActionLoading(`delete-${backupId}`);\n await apiFetch(agentApiPath(profile, `/backup/backups/${backupId}`), {\n method: 'DELETE',\n });\n setSuccessMsg('Backup deleted');\n await refresh();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setActionLoading(null);\n }\n };\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center py-12 text-text-secondary\">\n <Loader2 className=\"w-5 h-5 animate-spin mr-2\" />\n {tr('vibecontrols.agents.backup.loading', 'Loading backup settings...')}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Status Messages */}\n {error && (\n <div className=\"flex items-center gap-2 rounded-lg border border-status-error-border bg-status-error-bg-subtle p-3 text-sm text-status-error-text\">\n <XCircle className=\"w-4 h-4 shrink-0\" />\n {error}\n <button onClick={() => setError(null)} className=\"ml-auto text-xs underline\">\n Dismiss\n </button>\n </div>\n )}\n {successMsg && (\n <div className=\"flex items-center gap-2 rounded-lg border border-status-success-border bg-status-success-bg-subtle p-3 text-sm text-status-success-text\">\n <CheckCircle2 className=\"w-4 h-4 shrink-0\" />\n {successMsg}\n </div>\n )}\n\n {/* Status Card */}\n <div className=\"rounded-lg border border-border-default bg-bg-surface p-5\">\n <div className=\"flex items-center justify-between mb-4\">\n <div className=\"flex items-center gap-2\">\n <Database className=\"w-5 h-5 text-action-primary-bg\" />\n <h3 className=\"font-semibold text-text-primary\">\n {tr('vibecontrols.agents.backup.title', 'Database Backup')}\n </h3>\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={refresh}\n className=\"p-2 rounded-lg hover:bg-bg-sunken transition-colors text-text-secondary\"\n title=\"Refresh\"\n >\n <RefreshCw className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => setShowConfig(!showConfig)}\n className=\"p-2 rounded-lg hover:bg-bg-sunken transition-colors text-text-secondary\"\n title=\"Settings\"\n >\n <Settings className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4 mb-4\">\n <div>\n <p className=\"text-xs text-text-muted mb-1\">\n {tr('vibecontrols.agents.backup.status', 'Status')}\n </p>\n <div className=\"flex items-center gap-1.5\">\n {config?.enabled ? (\n <>\n <div className=\"h-2 w-2 rounded-full bg-status-success-bg\" />\n <span className=\"text-sm font-medium text-text-primary\">\n {tr('vibecontrols.agents.backup.enabled', 'Enabled')}\n </span>\n </>\n ) : (\n <>\n <div className=\"h-2 w-2 rounded-full bg-text-tertiary\" />\n <span className=\"text-sm font-medium text-text-secondary\">\n {tr('vibecontrols.agents.backup.disabled', 'Disabled')}\n </span>\n </>\n )}\n </div>\n </div>\n <div>\n <p className=\"text-xs text-text-muted mb-1\">\n {tr('vibecontrols.agents.backup.scheduler', 'Scheduler')}\n </p>\n <span className=\"text-sm font-medium text-text-primary\">\n {status?.schedulerRunning ? 'Running' : 'Stopped'}\n </span>\n </div>\n <div>\n <p className=\"text-xs text-text-muted mb-1\">\n {tr('vibecontrols.agents.backup.totalBackups', 'Total Backups')}\n </p>\n <span className=\"text-sm font-medium text-text-primary\">\n {status?.totalBackups ?? 0}\n </span>\n </div>\n <div>\n <p className=\"text-xs text-text-muted mb-1\">\n {tr('vibecontrols.agents.backup.target', 'Target')}\n </p>\n <span className=\"text-sm font-medium text-text-primary\">\n {status?.storageTarget ?? 'N/A'}\n </span>\n </div>\n </div>\n\n {status?.lastBackupTime && (\n <div className=\"flex flex-wrap items-center gap-3 text-xs text-text-muted\">\n <span>\n <Clock className=\"w-3 h-3 inline mr-1\" />\n Last: {formatTime(status.lastBackupTime)}\n </span>\n {status.nextScheduledBackup && (\n <span>Next: {formatTime(status.nextScheduledBackup)}</span>\n )}\n </div>\n )}\n\n {/* Action Buttons */}\n <div className=\"flex flex-wrap gap-2 mt-4 pt-4 border-t border-border-subtle\">\n <button\n onClick={() => handleRunBackup(true)}\n disabled={!!actionLoading}\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg bg-action-primary-bg text-action-primary-text text-sm font-medium hover:bg-action-primary-bg-hover disabled:opacity-50 transition-colors\"\n >\n {actionLoading === 'backup' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Upload className=\"w-4 h-4\" />\n )}\n {tr('vibecontrols.agents.backup.backupNow', 'Backup Now')}\n </button>\n <button\n onClick={() => handleRunBackup(false)}\n disabled={!!actionLoading}\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg bg-bg-sunken text-text-primary text-sm font-medium hover:bg-bg-canvas border border-border-default disabled:opacity-50 transition-colors\"\n >\n <Play className=\"w-4 h-4\" />\n {tr('vibecontrols.agents.backup.backupIfChanged', 'Backup if Changed')}\n </button>\n <button\n onClick={handleToggleEnabled}\n disabled={!!actionLoading}\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg bg-bg-sunken text-text-primary text-sm font-medium hover:bg-bg-canvas border border-border-default disabled:opacity-50 transition-colors\"\n >\n {actionLoading === 'toggle' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : config?.enabled ? (\n <XCircle className=\"w-4 h-4\" />\n ) : (\n <CheckCircle2 className=\"w-4 h-4\" />\n )}\n {config?.enabled\n ? tr('vibecontrols.agents.backup.disableSchedule', 'Disable Schedule')\n : tr('vibecontrols.agents.backup.enableSchedule', 'Enable Schedule')}\n </button>\n <button\n onClick={handleTestConnection}\n disabled={!!actionLoading}\n className=\"flex items-center gap-2 px-3 py-1.5 rounded-lg bg-bg-sunken text-text-primary text-sm font-medium hover:bg-bg-canvas border border-border-default disabled:opacity-50 transition-colors\"\n >\n {actionLoading === 'test' ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Wifi className=\"w-4 h-4\" />\n )}\n {tr('vibecontrols.agents.backup.testConnection', 'Test Connection')}\n </button>\n </div>\n </div>\n\n {/* Configuration Panel (collapsible) */}\n {showConfig && config && (\n <div className=\"rounded-lg border border-border-default bg-bg-surface p-5\">\n <h4 className=\"font-semibold text-text-primary mb-3 flex items-center gap-2\">\n <Settings className=\"w-4 h-4\" />\n {tr('vibecontrols.agents.backup.configuration', 'Configuration')}\n </h4>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4 text-sm\">\n <div>\n <span className=\"text-text-muted\">Schedule Interval:</span>{' '}\n <span className=\"text-text-primary font-medium\">\n {config.scheduleIntervalMs >= 3600000\n ? `${config.scheduleIntervalMs / 3600000}h`\n : `${config.scheduleIntervalMs / 60000}m`}\n </span>\n </div>\n <div>\n <span className=\"text-text-muted\">Change Detection:</span>{' '}\n <span className=\"text-text-primary font-medium\">\n {config.changeOnlyBackup ? 'On' : 'Off'}\n </span>\n </div>\n <div>\n <span className=\"text-text-muted\">Storage Target:</span>{' '}\n <span className=\"text-text-primary font-medium\">{config.storageTarget}</span>\n </div>\n {config.customS3 && (\n <>\n <div>\n <span className=\"text-text-muted\">S3 Bucket:</span>{' '}\n <span className=\"text-text-primary font-medium\">{config.customS3.bucket}</span>\n </div>\n <div>\n <span className=\"text-text-muted\">S3 Region:</span>{' '}\n <span className=\"text-text-primary font-medium\">{config.customS3.region}</span>\n </div>\n </>\n )}\n {config.retentionDays && (\n <div>\n <span className=\"text-text-muted\">Retention:</span>{' '}\n <span className=\"text-text-primary font-medium\">{config.retentionDays} days</span>\n </div>\n )}\n {config.maxBackups && (\n <div>\n <span className=\"text-text-muted\">Max Backups:</span>{' '}\n <span className=\"text-text-primary font-medium\">{config.maxBackups}</span>\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Backup History */}\n <div className=\"rounded-lg border border-border-default bg-bg-surface p-5\">\n <h4 className=\"font-semibold text-text-primary mb-3 flex items-center gap-2\">\n <Clock className=\"w-4 h-4\" />\n {tr('vibecontrols.agents.backup.history', 'Backup History')}\n <span className=\"text-xs text-text-muted font-normal\">({backups.length} shown)</span>\n </h4>\n\n {backups.length === 0 ? (\n <p className=\"text-sm text-text-muted py-4 text-center\">\n {tr(\n 'vibecontrols.agents.backup.noBackups',\n 'No backups yet. Click \"Backup Now\" to create one.'\n )}\n </p>\n ) : (\n <div className=\"space-y-2\">\n {backups.map((b) => (\n <div\n key={b.id}\n className=\"flex items-center justify-between p-3 rounded-lg border border-border-subtle hover:bg-bg-sunken transition-colors\"\n >\n <div className=\"flex items-center gap-3 min-w-0\">\n <div\n className={`w-8 h-8 rounded-lg flex items-center justify-center shrink-0 ${\n b.status === 'completed'\n ? 'border border-status-success-border bg-status-success-bg-subtle'\n : 'border border-status-error-border bg-status-error-bg-subtle'\n }`}\n >\n {b.status === 'completed' ? (\n <CheckCircle2 className=\"w-4 h-4 text-status-success-text\" />\n ) : (\n <XCircle className=\"w-4 h-4 text-status-error-text\" />\n )}\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {formatTime(b.timestamp)}\n </p>\n <p className=\"text-xs text-text-muted truncate\">\n {formatBytes(b.dbSizeBytes)} · {formatDuration(b.durationMs)} ·{' '}\n {b.storageTarget}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n <button\n onClick={() => handleRestore(b.id, true)}\n disabled={!!actionLoading}\n className=\"p-1.5 rounded hover:bg-bg-canvas text-text-secondary transition-colors\"\n title=\"Validate (dry run)\"\n >\n {actionLoading === `restore-${b.id}` ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <CheckCircle2 className=\"w-4 h-4\" />\n )}\n </button>\n <button\n onClick={() => {\n if (confirm('Restore this backup? The agent will need to restart.')) {\n handleRestore(b.id, false);\n }\n }}\n disabled={!!actionLoading}\n className=\"p-1.5 rounded hover:bg-bg-canvas text-text-secondary transition-colors\"\n title=\"Restore\"\n >\n <RotateCcw className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => handleDeleteBackup(b.id)}\n disabled={!!actionLoading}\n className=\"p-1.5 rounded text-text-secondary transition-colors hover:bg-status-error-bg/80 hover:text-status-error-text\"\n title=\"Delete\"\n >\n {actionLoading === `delete-${b.id}` ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Trash2 className=\"w-4 h-4\" />\n )}\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -42,7 +42,7 @@ var x = [
|
|
|
42
42
|
content: "",
|
|
43
43
|
tags: []
|
|
44
44
|
};
|
|
45
|
-
function C({
|
|
45
|
+
function C({ agent: C }) {
|
|
46
46
|
let w = e(), [T, E] = p([]), [te, D] = p(!0), [O, k] = p(null), [A, j] = p("all"), [M, N] = p(!1), [P, F] = p(null), [I, L] = p(S), [R, z] = p(""), [B, V] = p(!1), [H, U] = p([]), [W, G] = p(!1), [K, q] = p(/* @__PURE__ */ new Set()), J = u(async () => {
|
|
47
47
|
D(!0), k(null);
|
|
48
48
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AIContextsTab.js","names":[],"sources":["../../../src/components/ai/AIContextsTab.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, useMemo } from 'react';\nimport { Plus, X, FileText, Trash2, Pencil } from 'lucide-react';\nimport {\n Card,\n LoadingState,\n ErrorState,\n EmptyState,\n ConfirmDialog,\n SelectionCheckbox,\n} from '@/components/shared';\nimport type { AIContext } from '@/services/aiApi';\nimport { fetchContexts, createContext, updateContext, deleteContext } from '@/services/aiApi';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface AIContextsTabProps {\n agentId: string;\n}\n\nconst contextTypes = [\n { value: 'all', label: 'All Types' },\n { value: 'system', label: 'System' },\n { value: 'user', label: 'User' },\n { value: 'file', label: 'File' },\n { value: 'project', label: 'Project' },\n { value: 'custom', label: 'Custom' },\n];\n\ninterface ContextFormData {\n name: string;\n type: string;\n content: string;\n tags: string[];\n}\n\nconst emptyForm: ContextFormData = { name: '', type: 'custom', content: '', tags: [] };\n\nexport function AIContextsTab({ agentId }: AIContextsTabProps) {\n const tr = useTr();\n const [contexts, setContexts] = useState<AIContext[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [typeFilter, setTypeFilter] = useState('all');\n const [showForm, setShowForm] = useState(false);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [formData, setFormData] = useState<ContextFormData>(emptyForm);\n const [tagInput, setTagInput] = useState('');\n const [saving, setSaving] = useState(false);\n const [deleteIds, setDeleteIds] = useState<string[]>([]);\n const [deleting, setDeleting] = useState(false);\n const [selectedContextIds, setSelectedContextIds] = useState<Set<string>>(new Set());\n\n const loadContexts = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const params: Record<string, unknown> = {};\n if (typeFilter !== 'all') params.type = typeFilter;\n const result = await fetchContexts(agentId, params);\n setContexts(result);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load contexts');\n } finally {\n setLoading(false);\n }\n }, [agentId, typeFilter]);\n\n useEffect(() => {\n loadContexts();\n }, [loadContexts]);\n\n const selectedContexts = useMemo(\n () => contexts.filter((context) => selectedContextIds.has(context.id)),\n [contexts, selectedContextIds]\n );\n const allVisibleSelected =\n contexts.length > 0 && contexts.every((context) => selectedContextIds.has(context.id));\n const partiallySelected =\n contexts.some((context) => selectedContextIds.has(context.id)) && !allVisibleSelected;\n\n const openCreate = () => {\n setEditingId(null);\n setFormData(emptyForm);\n setTagInput('');\n setShowForm(true);\n };\n\n const openEdit = (ctx: AIContext) => {\n setEditingId(ctx.id);\n setFormData({ name: ctx.name, type: ctx.type, content: ctx.content, tags: ctx.tags ?? [] });\n setTagInput('');\n setShowForm(true);\n };\n\n const handleSave = async () => {\n setSaving(true);\n try {\n if (editingId) {\n await updateContext(agentId, editingId, formData);\n } else {\n await createContext(agentId, formData);\n }\n setShowForm(false);\n await loadContexts();\n } catch (err) {\n console.error('Failed to save context:', err);\n } finally {\n setSaving(false);\n }\n };\n\n const handleDelete = async () => {\n if (deleteIds.length === 0) return;\n setDeleting(true);\n try {\n await Promise.allSettled(deleteIds.map((deleteId) => deleteContext(agentId, deleteId)));\n setSelectedContextIds((prev) => {\n const next = new Set(prev);\n deleteIds.forEach((deleteId) => next.delete(deleteId));\n return next;\n });\n setDeleteIds([]);\n await loadContexts();\n } catch (err) {\n console.error('Failed to delete context:', err);\n } finally {\n setDeleting(false);\n }\n };\n\n const addTag = () => {\n const tag = tagInput.trim();\n if (tag && !formData.tags.includes(tag)) {\n setFormData((prev) => ({ ...prev, tags: [...prev.tags, tag] }));\n }\n setTagInput('');\n };\n\n const removeTag = (tag: string) => {\n setFormData((prev) => ({ ...prev, tags: prev.tags.filter((t) => t !== tag) }));\n };\n\n const toggleContextSelection = (contextId: string, checked: boolean) => {\n setSelectedContextIds((prev) => {\n const next = new Set(prev);\n if (checked) {\n next.add(contextId);\n } else {\n next.delete(contextId);\n }\n return next;\n });\n };\n\n const toggleAllVisibleContexts = (checked: boolean) => {\n setSelectedContextIds((prev) => {\n const next = new Set(prev);\n contexts.forEach((context) => {\n if (checked) {\n next.add(context.id);\n } else {\n next.delete(context.id);\n }\n });\n return next;\n });\n };\n\n const clearSelection = () => setSelectedContextIds(new Set());\n\n if (loading)\n return <LoadingState message={tr('vibecontrols.ai.contexts.loading', 'Loading contexts...')} />;\n if (error)\n return (\n <ErrorState\n title={tr('vibecontrols.ai.contexts.loadFailed', 'Failed to load contexts')}\n message={error}\n onRetry={loadContexts}\n />\n );\n\n return (\n <div className=\"space-y-4\">\n {/* Toolbar */}\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2\">\n <select\n value={typeFilter}\n onChange={(e) => setTypeFilter(e.target.value)}\n className=\"px-3 py-2 bg-bg-sunken border border-border-default rounded-md text-text-primary text-sm\"\n >\n {contextTypes.map((t) => (\n <option key={t.value} value={t.value}>\n {t.label}\n </option>\n ))}\n </select>\n <div className=\"flex-1\" />\n <button\n onClick={openCreate}\n className=\"flex items-center gap-2 px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors text-sm\"\n >\n <Plus className=\"w-4 h-4\" />\n {tr('vibecontrols.ai.contexts.newContext', 'New Context')}\n </button>\n </div>\n\n {contexts.length > 0 && (\n <div className=\"rounded-lg border border-border-default bg-bg-surface p-4\">\n <div className=\"flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <SelectionCheckbox\n checked={allVisibleSelected}\n indeterminate={partiallySelected}\n onChange={toggleAllVisibleContexts}\n ariaLabel=\"Select all visible contexts\"\n />\n <span className=\"text-sm font-medium text-text-primary\">\n {tr('vibecontrols.ai.contexts.selectAllVisible', 'Select all visible')}\n </span>\n </div>\n {selectedContextIds.size > 0 && (\n <button\n onClick={clearSelection}\n className=\"text-sm text-text-secondary hover:text-text-primary\"\n >\n {tr('vibecontrols.ai.contexts.clearSelection', 'Clear selection')}\n </button>\n )}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"rounded-full bg-bg-sunken px-3 py-1 text-sm font-medium text-text-secondary\">\n {selectedContextIds.size} {tr('vibecontrols.ai.contexts.selected', 'selected')}\n </span>\n <button\n onClick={() => setDeleteIds(selectedContexts.map((context) => context.id))}\n disabled={selectedContexts.length === 0}\n className=\"rounded-md border border-status-error-border px-3 py-2 text-sm font-medium text-status-error-text hover:bg-status-error-bg disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {tr('vibecontrols.ai.contexts.deleteSelected', 'Delete Selected')}\n {selectedContexts.length > 0 ? ` (${selectedContexts.length})` : ''}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Context List */}\n {contexts.length === 0 ? (\n <EmptyState\n icon={<FileText className=\"w-8 h-8 text-text-secondary\" />}\n title={tr('vibecontrols.ai.contexts.emptyTitle', 'No contexts yet')}\n description={tr(\n 'vibecontrols.ai.contexts.emptyDescription',\n 'Create contexts to provide additional information to your AI sessions'\n )}\n action={\n <button\n onClick={openCreate}\n className=\"flex items-center gap-2 px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors\"\n >\n <Plus className=\"w-4 h-4\" />\n {tr('vibecontrols.ai.contexts.newContext', 'New Context')}\n </button>\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {contexts.map((ctx) => (\n <Card\n key={ctx.id}\n className={`p-4 ${selectedContextIds.has(ctx.id) ? 'border-action-primary-bg ring-1 ring-action-primary-bg/25' : ''}`}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-start gap-3 min-w-0 flex-1\">\n <div onClick={(event) => event.stopPropagation()}>\n <SelectionCheckbox\n checked={selectedContextIds.has(ctx.id)}\n onChange={(checked) => toggleContextSelection(ctx.id, checked)}\n ariaLabel={`Select context ${ctx.name}`}\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <h4 className=\"font-semibold text-text-primary truncate\">{ctx.name}</h4>\n <span className=\"px-1.5 py-0.5 text-xs bg-action-primary-bg/10 text-action-primary-bg rounded\">\n {ctx.type}\n </span>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n <button\n onClick={() => openEdit(ctx)}\n className=\"p-1.5 hover:bg-bg-sunken rounded-md transition-colors\"\n title=\"Edit\"\n >\n <Pencil className=\"w-3.5 h-3.5 text-text-secondary\" />\n </button>\n <button\n onClick={() => setDeleteIds([ctx.id])}\n className=\"p-1.5 hover:bg-status-error-bg rounded-md transition-colors\"\n title=\"Delete\"\n >\n <Trash2 className=\"w-3.5 h-3.5 text-status-error-text\" />\n </button>\n </div>\n </div>\n <pre className=\"mt-2 text-xs text-text-secondary bg-bg-sunken rounded p-2 max-h-20 overflow-auto whitespace-pre-wrap\">\n {ctx.content}\n </pre>\n {ctx.tags.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1\">\n {ctx.tags.map((tag) => (\n <span\n key={tag}\n className=\"px-1.5 py-0.5 text-xs bg-bg-sunken text-text-secondary rounded\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </Card>\n ))}\n </div>\n )}\n\n {/* Create/Edit Dialog */}\n {showForm && (\n <div\n className=\"fixed inset-0 bg-bg-overlay flex items-center justify-center z-50 p-4\"\n onClick={() => setShowForm(false)}\n >\n <div\n className=\"bg-bg-surface border border-border-default rounded-lg shadow-xl w-full max-w-lg max-h-[90vh] overflow-y-auto p-6\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">\n {editingId\n ? tr('vibecontrols.ai.contexts.editContext', 'Edit Context')\n : tr('vibecontrols.ai.contexts.newContext', 'New Context')}\n </h3>\n <button\n onClick={() => setShowForm(false)}\n className=\"p-1 hover:bg-bg-sunken rounded-md\"\n >\n <X className=\"w-4 h-4 text-text-secondary\" />\n </button>\n </div>\n\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {tr('vibecontrols.ai.contexts.name', 'Name')}\n </label>\n <input\n type=\"text\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n className=\"w-full px-3 py-2 bg-bg-sunken border border-border-default rounded-md text-text-primary text-sm focus:outline-none focus:border-border-strong\"\n placeholder={tr('vibecontrols.ai.contexts.namePlaceholder', 'Context name')}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {tr('vibecontrols.ai.contexts.type', 'Type')}\n </label>\n <select\n value={formData.type}\n onChange={(e) => setFormData({ ...formData, type: e.target.value })}\n className=\"w-full px-3 py-2 bg-bg-sunken border border-border-default rounded-md text-text-primary text-sm\"\n >\n {contextTypes\n .filter((t) => t.value !== 'all')\n .map((t) => (\n <option key={t.value} value={t.value}>\n {t.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {tr('vibecontrols.ai.contexts.content', 'Content')}\n </label>\n <textarea\n value={formData.content}\n onChange={(e) => setFormData({ ...formData, content: e.target.value })}\n rows={8}\n className=\"w-full px-3 py-2 bg-bg-sunken border border-border-default rounded-md text-text-primary text-sm font-mono focus:outline-none focus:border-border-strong\"\n placeholder={tr(\n 'vibecontrols.ai.contexts.contentPlaceholder',\n 'Context content...'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {tr('vibecontrols.ai.contexts.tags', 'Tags')}\n </label>\n <div className=\"flex flex-wrap gap-1 mb-2\">\n {formData.tags.map((tag) => (\n <span\n key={tag}\n className=\"flex items-center gap-1 px-2 py-0.5 text-xs bg-bg-sunken text-text-primary rounded\"\n >\n {tag}\n <button onClick={() => removeTag(tag)}>\n <X className=\"w-3 h-3 text-text-secondary hover:text-status-error-text\" />\n </button>\n </span>\n ))}\n </div>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={tagInput}\n onChange={(e) => setTagInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n addTag();\n }\n }}\n className=\"flex-1 px-3 py-1.5 bg-bg-sunken border border-border-default rounded text-sm text-text-primary focus:outline-none focus:border-border-strong\"\n placeholder={tr('vibecontrols.ai.contexts.addTagPlaceholder', 'Add a tag...')}\n />\n <button\n onClick={addTag}\n className=\"px-3 py-1.5 text-xs bg-bg-sunken border border-border-default rounded hover:bg-bg-surface transition-colors\"\n >\n {tr('vibecontrols.ai.contexts.add', 'Add')}\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 mt-6\">\n <button\n onClick={() => setShowForm(false)}\n className=\"px-4 py-2 text-sm text-text-secondary hover:bg-bg-sunken rounded-md transition-colors\"\n >\n {tr('vibecontrols.ai.contexts.cancel', 'Cancel')}\n </button>\n <button\n onClick={handleSave}\n disabled={saving || !formData.name || !formData.content}\n className=\"px-4 py-2 text-sm bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors disabled:opacity-50\"\n >\n {saving\n ? tr('vibecontrols.ai.contexts.saving', 'Saving...')\n : editingId\n ? tr('vibecontrols.ai.contexts.update', 'Update')\n : tr('vibecontrols.ai.contexts.create', 'Create')}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Delete Confirmation */}\n <ConfirmDialog\n isOpen={deleteIds.length > 0}\n title={deleteIds.length > 1 ? 'Delete Contexts' : 'Delete Context'}\n message={\n deleteIds.length > 1\n ? `Are you sure you want to delete ${deleteIds.length} selected contexts? This action cannot be undone.`\n : 'Are you sure you want to delete this context? This action cannot be undone.'\n }\n confirmLabel={deleting ? 'Deleting...' : 'Delete'}\n variant=\"danger\"\n onConfirm={handleDelete}\n onClose={() => setDeleteIds([])}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AIContextsTab.js","names":[],"sources":["../../../src/components/ai/AIContextsTab.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, useMemo } from 'react';\nimport { Plus, X, FileText, Trash2, Pencil } from 'lucide-react';\nimport {\n Card,\n LoadingState,\n ErrorState,\n EmptyState,\n ConfirmDialog,\n SelectionCheckbox,\n} from '@/components/shared';\nimport type { AIContext, AgentRef } from '@/services/aiApi';\nimport { fetchContexts, createContext, updateContext, deleteContext } from '@/services/aiApi';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface AIContextsTabProps {\n agent: AgentRef;\n}\n\nconst contextTypes = [\n { value: 'all', label: 'All Types' },\n { value: 'system', label: 'System' },\n { value: 'user', label: 'User' },\n { value: 'file', label: 'File' },\n { value: 'project', label: 'Project' },\n { value: 'custom', label: 'Custom' },\n];\n\ninterface ContextFormData {\n name: string;\n type: string;\n content: string;\n tags: string[];\n}\n\nconst emptyForm: ContextFormData = { name: '', type: 'custom', content: '', tags: [] };\n\nexport function AIContextsTab({ agent }: AIContextsTabProps) {\n const tr = useTr();\n const [contexts, setContexts] = useState<AIContext[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [typeFilter, setTypeFilter] = useState('all');\n const [showForm, setShowForm] = useState(false);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [formData, setFormData] = useState<ContextFormData>(emptyForm);\n const [tagInput, setTagInput] = useState('');\n const [saving, setSaving] = useState(false);\n const [deleteIds, setDeleteIds] = useState<string[]>([]);\n const [deleting, setDeleting] = useState(false);\n const [selectedContextIds, setSelectedContextIds] = useState<Set<string>>(new Set());\n\n const loadContexts = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const params: Record<string, unknown> = {};\n if (typeFilter !== 'all') params.type = typeFilter;\n const result = await fetchContexts(agent, params);\n setContexts(result);\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load contexts');\n } finally {\n setLoading(false);\n }\n }, [agent, typeFilter]);\n\n useEffect(() => {\n loadContexts();\n }, [loadContexts]);\n\n const selectedContexts = useMemo(\n () => contexts.filter((context) => selectedContextIds.has(context.id)),\n [contexts, selectedContextIds]\n );\n const allVisibleSelected =\n contexts.length > 0 && contexts.every((context) => selectedContextIds.has(context.id));\n const partiallySelected =\n contexts.some((context) => selectedContextIds.has(context.id)) && !allVisibleSelected;\n\n const openCreate = () => {\n setEditingId(null);\n setFormData(emptyForm);\n setTagInput('');\n setShowForm(true);\n };\n\n const openEdit = (ctx: AIContext) => {\n setEditingId(ctx.id);\n setFormData({ name: ctx.name, type: ctx.type, content: ctx.content, tags: ctx.tags ?? [] });\n setTagInput('');\n setShowForm(true);\n };\n\n const handleSave = async () => {\n setSaving(true);\n try {\n if (editingId) {\n await updateContext(agent, editingId, formData);\n } else {\n await createContext(agent, formData);\n }\n setShowForm(false);\n await loadContexts();\n } catch (err) {\n console.error('Failed to save context:', err);\n } finally {\n setSaving(false);\n }\n };\n\n const handleDelete = async () => {\n if (deleteIds.length === 0) return;\n setDeleting(true);\n try {\n await Promise.allSettled(deleteIds.map((deleteId) => deleteContext(agent, deleteId)));\n setSelectedContextIds((prev) => {\n const next = new Set(prev);\n deleteIds.forEach((deleteId) => next.delete(deleteId));\n return next;\n });\n setDeleteIds([]);\n await loadContexts();\n } catch (err) {\n console.error('Failed to delete context:', err);\n } finally {\n setDeleting(false);\n }\n };\n\n const addTag = () => {\n const tag = tagInput.trim();\n if (tag && !formData.tags.includes(tag)) {\n setFormData((prev) => ({ ...prev, tags: [...prev.tags, tag] }));\n }\n setTagInput('');\n };\n\n const removeTag = (tag: string) => {\n setFormData((prev) => ({ ...prev, tags: prev.tags.filter((t) => t !== tag) }));\n };\n\n const toggleContextSelection = (contextId: string, checked: boolean) => {\n setSelectedContextIds((prev) => {\n const next = new Set(prev);\n if (checked) {\n next.add(contextId);\n } else {\n next.delete(contextId);\n }\n return next;\n });\n };\n\n const toggleAllVisibleContexts = (checked: boolean) => {\n setSelectedContextIds((prev) => {\n const next = new Set(prev);\n contexts.forEach((context) => {\n if (checked) {\n next.add(context.id);\n } else {\n next.delete(context.id);\n }\n });\n return next;\n });\n };\n\n const clearSelection = () => setSelectedContextIds(new Set());\n\n if (loading)\n return <LoadingState message={tr('vibecontrols.ai.contexts.loading', 'Loading contexts...')} />;\n if (error)\n return (\n <ErrorState\n title={tr('vibecontrols.ai.contexts.loadFailed', 'Failed to load contexts')}\n message={error}\n onRetry={loadContexts}\n />\n );\n\n return (\n <div className=\"space-y-4\">\n {/* Toolbar */}\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2\">\n <select\n value={typeFilter}\n onChange={(e) => setTypeFilter(e.target.value)}\n className=\"px-3 py-2 bg-bg-sunken border border-border-default rounded-md text-text-primary text-sm\"\n >\n {contextTypes.map((t) => (\n <option key={t.value} value={t.value}>\n {t.label}\n </option>\n ))}\n </select>\n <div className=\"flex-1\" />\n <button\n onClick={openCreate}\n className=\"flex items-center gap-2 px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors text-sm\"\n >\n <Plus className=\"w-4 h-4\" />\n {tr('vibecontrols.ai.contexts.newContext', 'New Context')}\n </button>\n </div>\n\n {contexts.length > 0 && (\n <div className=\"rounded-lg border border-border-default bg-bg-surface p-4\">\n <div className=\"flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <SelectionCheckbox\n checked={allVisibleSelected}\n indeterminate={partiallySelected}\n onChange={toggleAllVisibleContexts}\n ariaLabel=\"Select all visible contexts\"\n />\n <span className=\"text-sm font-medium text-text-primary\">\n {tr('vibecontrols.ai.contexts.selectAllVisible', 'Select all visible')}\n </span>\n </div>\n {selectedContextIds.size > 0 && (\n <button\n onClick={clearSelection}\n className=\"text-sm text-text-secondary hover:text-text-primary\"\n >\n {tr('vibecontrols.ai.contexts.clearSelection', 'Clear selection')}\n </button>\n )}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"rounded-full bg-bg-sunken px-3 py-1 text-sm font-medium text-text-secondary\">\n {selectedContextIds.size} {tr('vibecontrols.ai.contexts.selected', 'selected')}\n </span>\n <button\n onClick={() => setDeleteIds(selectedContexts.map((context) => context.id))}\n disabled={selectedContexts.length === 0}\n className=\"rounded-md border border-status-error-border px-3 py-2 text-sm font-medium text-status-error-text hover:bg-status-error-bg disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {tr('vibecontrols.ai.contexts.deleteSelected', 'Delete Selected')}\n {selectedContexts.length > 0 ? ` (${selectedContexts.length})` : ''}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Context List */}\n {contexts.length === 0 ? (\n <EmptyState\n icon={<FileText className=\"w-8 h-8 text-text-secondary\" />}\n title={tr('vibecontrols.ai.contexts.emptyTitle', 'No contexts yet')}\n description={tr(\n 'vibecontrols.ai.contexts.emptyDescription',\n 'Create contexts to provide additional information to your AI sessions'\n )}\n action={\n <button\n onClick={openCreate}\n className=\"flex items-center gap-2 px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors\"\n >\n <Plus className=\"w-4 h-4\" />\n {tr('vibecontrols.ai.contexts.newContext', 'New Context')}\n </button>\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {contexts.map((ctx) => (\n <Card\n key={ctx.id}\n className={`p-4 ${selectedContextIds.has(ctx.id) ? 'border-action-primary-bg ring-1 ring-action-primary-bg/25' : ''}`}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-start gap-3 min-w-0 flex-1\">\n <div onClick={(event) => event.stopPropagation()}>\n <SelectionCheckbox\n checked={selectedContextIds.has(ctx.id)}\n onChange={(checked) => toggleContextSelection(ctx.id, checked)}\n ariaLabel={`Select context ${ctx.name}`}\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <h4 className=\"font-semibold text-text-primary truncate\">{ctx.name}</h4>\n <span className=\"px-1.5 py-0.5 text-xs bg-action-primary-bg/10 text-action-primary-bg rounded\">\n {ctx.type}\n </span>\n </div>\n </div>\n </div>\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n <button\n onClick={() => openEdit(ctx)}\n className=\"p-1.5 hover:bg-bg-sunken rounded-md transition-colors\"\n title=\"Edit\"\n >\n <Pencil className=\"w-3.5 h-3.5 text-text-secondary\" />\n </button>\n <button\n onClick={() => setDeleteIds([ctx.id])}\n className=\"p-1.5 hover:bg-status-error-bg rounded-md transition-colors\"\n title=\"Delete\"\n >\n <Trash2 className=\"w-3.5 h-3.5 text-status-error-text\" />\n </button>\n </div>\n </div>\n <pre className=\"mt-2 text-xs text-text-secondary bg-bg-sunken rounded p-2 max-h-20 overflow-auto whitespace-pre-wrap\">\n {ctx.content}\n </pre>\n {ctx.tags.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1\">\n {ctx.tags.map((tag) => (\n <span\n key={tag}\n className=\"px-1.5 py-0.5 text-xs bg-bg-sunken text-text-secondary rounded\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </Card>\n ))}\n </div>\n )}\n\n {/* Create/Edit Dialog */}\n {showForm && (\n <div\n className=\"fixed inset-0 bg-bg-overlay flex items-center justify-center z-50 p-4\"\n onClick={() => setShowForm(false)}\n >\n <div\n className=\"bg-bg-surface border border-border-default rounded-lg shadow-xl w-full max-w-lg max-h-[90vh] overflow-y-auto p-6\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">\n {editingId\n ? tr('vibecontrols.ai.contexts.editContext', 'Edit Context')\n : tr('vibecontrols.ai.contexts.newContext', 'New Context')}\n </h3>\n <button\n onClick={() => setShowForm(false)}\n className=\"p-1 hover:bg-bg-sunken rounded-md\"\n >\n <X className=\"w-4 h-4 text-text-secondary\" />\n </button>\n </div>\n\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {tr('vibecontrols.ai.contexts.name', 'Name')}\n </label>\n <input\n type=\"text\"\n value={formData.name}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n className=\"w-full px-3 py-2 bg-bg-sunken border border-border-default rounded-md text-text-primary text-sm focus:outline-none focus:border-border-strong\"\n placeholder={tr('vibecontrols.ai.contexts.namePlaceholder', 'Context name')}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {tr('vibecontrols.ai.contexts.type', 'Type')}\n </label>\n <select\n value={formData.type}\n onChange={(e) => setFormData({ ...formData, type: e.target.value })}\n className=\"w-full px-3 py-2 bg-bg-sunken border border-border-default rounded-md text-text-primary text-sm\"\n >\n {contextTypes\n .filter((t) => t.value !== 'all')\n .map((t) => (\n <option key={t.value} value={t.value}>\n {t.label}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {tr('vibecontrols.ai.contexts.content', 'Content')}\n </label>\n <textarea\n value={formData.content}\n onChange={(e) => setFormData({ ...formData, content: e.target.value })}\n rows={8}\n className=\"w-full px-3 py-2 bg-bg-sunken border border-border-default rounded-md text-text-primary text-sm font-mono focus:outline-none focus:border-border-strong\"\n placeholder={tr(\n 'vibecontrols.ai.contexts.contentPlaceholder',\n 'Context content...'\n )}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1\">\n {tr('vibecontrols.ai.contexts.tags', 'Tags')}\n </label>\n <div className=\"flex flex-wrap gap-1 mb-2\">\n {formData.tags.map((tag) => (\n <span\n key={tag}\n className=\"flex items-center gap-1 px-2 py-0.5 text-xs bg-bg-sunken text-text-primary rounded\"\n >\n {tag}\n <button onClick={() => removeTag(tag)}>\n <X className=\"w-3 h-3 text-text-secondary hover:text-status-error-text\" />\n </button>\n </span>\n ))}\n </div>\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={tagInput}\n onChange={(e) => setTagInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n addTag();\n }\n }}\n className=\"flex-1 px-3 py-1.5 bg-bg-sunken border border-border-default rounded text-sm text-text-primary focus:outline-none focus:border-border-strong\"\n placeholder={tr('vibecontrols.ai.contexts.addTagPlaceholder', 'Add a tag...')}\n />\n <button\n onClick={addTag}\n className=\"px-3 py-1.5 text-xs bg-bg-sunken border border-border-default rounded hover:bg-bg-surface transition-colors\"\n >\n {tr('vibecontrols.ai.contexts.add', 'Add')}\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 mt-6\">\n <button\n onClick={() => setShowForm(false)}\n className=\"px-4 py-2 text-sm text-text-secondary hover:bg-bg-sunken rounded-md transition-colors\"\n >\n {tr('vibecontrols.ai.contexts.cancel', 'Cancel')}\n </button>\n <button\n onClick={handleSave}\n disabled={saving || !formData.name || !formData.content}\n className=\"px-4 py-2 text-sm bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors disabled:opacity-50\"\n >\n {saving\n ? tr('vibecontrols.ai.contexts.saving', 'Saving...')\n : editingId\n ? tr('vibecontrols.ai.contexts.update', 'Update')\n : tr('vibecontrols.ai.contexts.create', 'Create')}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Delete Confirmation */}\n <ConfirmDialog\n isOpen={deleteIds.length > 0}\n title={deleteIds.length > 1 ? 'Delete Contexts' : 'Delete Context'}\n message={\n deleteIds.length > 1\n ? `Are you sure you want to delete ${deleteIds.length} selected contexts? This action cannot be undone.`\n : 'Are you sure you want to delete this context? This action cannot be undone.'\n }\n confirmLabel={deleting ? 'Deleting...' : 'Delete'}\n variant=\"danger\"\n onConfirm={handleDelete}\n onClose={() => setDeleteIds([])}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ var v = {
|
|
|
17
17
|
error: "bg-status-error-bg text-status-error-text",
|
|
18
18
|
terminated: "bg-bg-sunken text-text-secondary"
|
|
19
19
|
};
|
|
20
|
-
function y({
|
|
20
|
+
function y({ agent: y, onNavigateToSession: b }) {
|
|
21
21
|
let x = e(), [S, C] = l(null), [w, T] = l([]), [E, D] = l([]), [O, k] = l(!0), [A, j] = l(null);
|
|
22
22
|
return c(() => {
|
|
23
23
|
let e = !1;
|
|
@@ -43,7 +43,7 @@ function y({ agentId: y, onNavigateToSession: b }) {
|
|
|
43
43
|
return t(), () => {
|
|
44
44
|
e = !0;
|
|
45
45
|
};
|
|
46
|
-
}, [y]), O ? /* @__PURE__ */ m(t, { message: x("vibecontrols.ai.overview.loading", "Loading AI overview...") }) : A ? /* @__PURE__ */ m(n, {
|
|
46
|
+
}, [y.id, y.profile]), O ? /* @__PURE__ */ m(t, { message: x("vibecontrols.ai.overview.loading", "Loading AI overview...") }) : A ? /* @__PURE__ */ m(n, {
|
|
47
47
|
title: x("vibecontrols.ai.overview.loadFailed", "Failed to load overview"),
|
|
48
48
|
message: A
|
|
49
49
|
}) : /* @__PURE__ */ h("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AIOverviewTab.js","names":[],"sources":["../../../src/components/ai/AIOverviewTab.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Activity, Zap, Clock, MessageSquare } from 'lucide-react';\nimport { StatCard, Card, LoadingState, ErrorState } from '@/components/shared';\nimport { MotionList, MotionItem } from '@burdenoff/fe-libs/shared/motion';\nimport type { AIStatsOverview, AISession, AIDispatch } from '@/services/aiApi';\nimport { fetchStatsOverview, fetchSessions, fetchDispatchHistory } from '@/services/aiApi';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface AIOverviewTabProps {\n agentId: string;\n onNavigateToSession?: (sessionId: string) => void;\n}\n\nconst statusColors: Record<string, string> = {\n active: 'bg-status-success-bg text-status-success-text',\n idle: 'bg-status-warning-bg text-status-warning-text',\n processing: 'bg-action-primary-bg/20 text-action-primary-bg',\n error: 'bg-status-error-bg text-status-error-text',\n terminated: 'bg-bg-sunken text-text-secondary',\n};\n\nexport function AIOverviewTab({ agentId, onNavigateToSession }: AIOverviewTabProps) {\n const tr = useTr();\n const [stats, setStats] = useState<AIStatsOverview | null>(null);\n const [recentSessions, setRecentSessions] = useState<AISession[]>([]);\n const [recentPrompts, setRecentPrompts] = useState<AIDispatch[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n async function load() {\n setLoading(true);\n setError(null);\n try {\n const [s, sess, hist] = await Promise.all([\n fetchStatsOverview(agentId),\n fetchSessions(agentId, { limit: 5, sort: 'updatedAt:desc' }),\n fetchDispatchHistory(agentId, { limit: 5 }),\n ]);\n if (cancelled) return;\n setStats(s);\n setRecentSessions(sess);\n setRecentPrompts(hist);\n } catch (err) {\n if (!cancelled) setError(err instanceof Error ? err.message : 'Failed to load overview');\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n load();\n return () => {\n cancelled = true;\n };\n }, [agentId]);\n\n if (loading)\n return (\n <LoadingState message={tr('vibecontrols.ai.overview.loading', 'Loading AI overview...')} />\n );\n if (error)\n return (\n <ErrorState\n title={tr('vibecontrols.ai.overview.loadFailed', 'Failed to load overview')}\n message={error}\n />\n );\n\n return (\n <div className=\"space-y-6\">\n {/* Quick Stats */}\n <MotionList stagger={0.04} className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4\">\n <MotionItem>\n <StatCard\n title={tr('vibecontrols.ai.overview.activeSessions', 'Active Sessions')}\n value={stats?.activeSessions ?? 0}\n icon={<Activity className=\"w-5 h-5\" />}\n variant=\"success\"\n />\n </MotionItem>\n <MotionItem>\n <StatCard\n title={tr('vibecontrols.ai.overview.totalTokens', 'Total Tokens')}\n value={stats?.totalTokens?.toLocaleString() ?? '0'}\n subtitle={`In: ${stats?.inputTokens?.toLocaleString() ?? 0} / Out: ${stats?.outputTokens?.toLocaleString() ?? 0}`}\n icon={<Zap className=\"w-5 h-5\" />}\n />\n </MotionItem>\n <MotionItem>\n <StatCard\n title={tr('vibecontrols.ai.overview.queuedPrompts', 'Queued Prompts')}\n value={stats?.queuedPrompts ?? 0}\n icon={<Clock className=\"w-5 h-5\" />}\n variant={stats?.queuedPrompts && stats.queuedPrompts > 0 ? 'warning' : 'default'}\n />\n </MotionItem>\n <MotionItem>\n <StatCard\n title={tr('vibecontrols.ai.overview.totalSessions', 'Total Sessions')}\n value={stats?.totalSessions ?? 0}\n icon={<MessageSquare className=\"w-5 h-5\" />}\n />\n </MotionItem>\n </MotionList>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Recent Sessions */}\n <Card className=\"p-0\">\n <div className=\"px-4 py-3 border-b border-border-default\">\n <h3 className=\"font-semibold text-text-primary\">\n {tr('vibecontrols.ai.overview.recentSessions', 'Recent Sessions')}\n </h3>\n </div>\n <div className=\"divide-y divide-border-default\">\n {recentSessions.length === 0 ? (\n <p className=\"px-4 py-6 text-sm text-text-secondary text-center\">\n {tr('vibecontrols.ai.overview.noSessions', 'No sessions yet')}\n </p>\n ) : (\n recentSessions.map((session) => (\n <button\n key={session.id}\n onClick={() => onNavigateToSession?.(session.id)}\n className=\"flex w-full flex-col items-start gap-2 px-4 py-3 text-left transition-colors hover:bg-bg-sunken sm:flex-row sm:items-center sm:justify-between\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium text-text-primary text-sm truncate\">\n {session.name}\n </div>\n <div className=\"text-xs text-text-secondary\">{session.agentType}</div>\n </div>\n <span\n className={`rounded-full px-2 py-0.5 text-xs font-medium ${statusColors[session.status] ?? 'bg-bg-sunken text-text-secondary'}`}\n >\n {session.status}\n </span>\n </button>\n ))\n )}\n </div>\n </Card>\n\n {/* Recent Prompts */}\n <Card className=\"p-0\">\n <div className=\"px-4 py-3 border-b border-border-default\">\n <h3 className=\"font-semibold text-text-primary\">\n {tr('vibecontrols.ai.overview.recentPrompts', 'Recent Prompts')}\n </h3>\n </div>\n <div className=\"divide-y divide-border-default\">\n {recentPrompts.length === 0 ? (\n <p className=\"px-4 py-6 text-sm text-text-secondary text-center\">\n {tr('vibecontrols.ai.overview.noPrompts', 'No prompts dispatched yet')}\n </p>\n ) : (\n recentPrompts.map((dispatch) => (\n <div key={dispatch.id} className=\"px-4 py-3\">\n <div className=\"text-sm text-text-primary line-clamp-2\">{dispatch.prompt}</div>\n <div className=\"mt-1 flex flex-wrap items-center gap-2 text-xs text-text-secondary\">\n <span>{dispatch.status}</span>\n {dispatch.createdAt && (\n <span>{new Date(dispatch.createdAt).toLocaleString()}</span>\n )}\n </div>\n </div>\n ))\n )}\n </div>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AIOverviewTab.js","names":[],"sources":["../../../src/components/ai/AIOverviewTab.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { Activity, Zap, Clock, MessageSquare } from 'lucide-react';\nimport { StatCard, Card, LoadingState, ErrorState } from '@/components/shared';\nimport { MotionList, MotionItem } from '@burdenoff/fe-libs/shared/motion';\nimport type { AIStatsOverview, AISession, AIDispatch, AgentRef } from '@/services/aiApi';\nimport { fetchStatsOverview, fetchSessions, fetchDispatchHistory } from '@/services/aiApi';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface AIOverviewTabProps {\n agent: AgentRef;\n onNavigateToSession?: (sessionId: string) => void;\n}\n\nconst statusColors: Record<string, string> = {\n active: 'bg-status-success-bg text-status-success-text',\n idle: 'bg-status-warning-bg text-status-warning-text',\n processing: 'bg-action-primary-bg/20 text-action-primary-bg',\n error: 'bg-status-error-bg text-status-error-text',\n terminated: 'bg-bg-sunken text-text-secondary',\n};\n\nexport function AIOverviewTab({ agent, onNavigateToSession }: AIOverviewTabProps) {\n const tr = useTr();\n const [stats, setStats] = useState<AIStatsOverview | null>(null);\n const [recentSessions, setRecentSessions] = useState<AISession[]>([]);\n const [recentPrompts, setRecentPrompts] = useState<AIDispatch[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n async function load() {\n setLoading(true);\n setError(null);\n try {\n const [s, sess, hist] = await Promise.all([\n fetchStatsOverview(agent),\n fetchSessions(agent, { limit: 5, sort: 'updatedAt:desc' }),\n fetchDispatchHistory(agent, { limit: 5 }),\n ]);\n if (cancelled) return;\n setStats(s);\n setRecentSessions(sess);\n setRecentPrompts(hist);\n } catch (err) {\n if (!cancelled) setError(err instanceof Error ? err.message : 'Failed to load overview');\n } finally {\n if (!cancelled) setLoading(false);\n }\n }\n load();\n return () => {\n cancelled = true;\n };\n }, [agent.id, agent.profile]);\n\n if (loading)\n return (\n <LoadingState message={tr('vibecontrols.ai.overview.loading', 'Loading AI overview...')} />\n );\n if (error)\n return (\n <ErrorState\n title={tr('vibecontrols.ai.overview.loadFailed', 'Failed to load overview')}\n message={error}\n />\n );\n\n return (\n <div className=\"space-y-6\">\n {/* Quick Stats */}\n <MotionList stagger={0.04} className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4\">\n <MotionItem>\n <StatCard\n title={tr('vibecontrols.ai.overview.activeSessions', 'Active Sessions')}\n value={stats?.activeSessions ?? 0}\n icon={<Activity className=\"w-5 h-5\" />}\n variant=\"success\"\n />\n </MotionItem>\n <MotionItem>\n <StatCard\n title={tr('vibecontrols.ai.overview.totalTokens', 'Total Tokens')}\n value={stats?.totalTokens?.toLocaleString() ?? '0'}\n subtitle={`In: ${stats?.inputTokens?.toLocaleString() ?? 0} / Out: ${stats?.outputTokens?.toLocaleString() ?? 0}`}\n icon={<Zap className=\"w-5 h-5\" />}\n />\n </MotionItem>\n <MotionItem>\n <StatCard\n title={tr('vibecontrols.ai.overview.queuedPrompts', 'Queued Prompts')}\n value={stats?.queuedPrompts ?? 0}\n icon={<Clock className=\"w-5 h-5\" />}\n variant={stats?.queuedPrompts && stats.queuedPrompts > 0 ? 'warning' : 'default'}\n />\n </MotionItem>\n <MotionItem>\n <StatCard\n title={tr('vibecontrols.ai.overview.totalSessions', 'Total Sessions')}\n value={stats?.totalSessions ?? 0}\n icon={<MessageSquare className=\"w-5 h-5\" />}\n />\n </MotionItem>\n </MotionList>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-6\">\n {/* Recent Sessions */}\n <Card className=\"p-0\">\n <div className=\"px-4 py-3 border-b border-border-default\">\n <h3 className=\"font-semibold text-text-primary\">\n {tr('vibecontrols.ai.overview.recentSessions', 'Recent Sessions')}\n </h3>\n </div>\n <div className=\"divide-y divide-border-default\">\n {recentSessions.length === 0 ? (\n <p className=\"px-4 py-6 text-sm text-text-secondary text-center\">\n {tr('vibecontrols.ai.overview.noSessions', 'No sessions yet')}\n </p>\n ) : (\n recentSessions.map((session) => (\n <button\n key={session.id}\n onClick={() => onNavigateToSession?.(session.id)}\n className=\"flex w-full flex-col items-start gap-2 px-4 py-3 text-left transition-colors hover:bg-bg-sunken sm:flex-row sm:items-center sm:justify-between\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium text-text-primary text-sm truncate\">\n {session.name}\n </div>\n <div className=\"text-xs text-text-secondary\">{session.agentType}</div>\n </div>\n <span\n className={`rounded-full px-2 py-0.5 text-xs font-medium ${statusColors[session.status] ?? 'bg-bg-sunken text-text-secondary'}`}\n >\n {session.status}\n </span>\n </button>\n ))\n )}\n </div>\n </Card>\n\n {/* Recent Prompts */}\n <Card className=\"p-0\">\n <div className=\"px-4 py-3 border-b border-border-default\">\n <h3 className=\"font-semibold text-text-primary\">\n {tr('vibecontrols.ai.overview.recentPrompts', 'Recent Prompts')}\n </h3>\n </div>\n <div className=\"divide-y divide-border-default\">\n {recentPrompts.length === 0 ? (\n <p className=\"px-4 py-6 text-sm text-text-secondary text-center\">\n {tr('vibecontrols.ai.overview.noPrompts', 'No prompts dispatched yet')}\n </p>\n ) : (\n recentPrompts.map((dispatch) => (\n <div key={dispatch.id} className=\"px-4 py-3\">\n <div className=\"text-sm text-text-primary line-clamp-2\">{dispatch.prompt}</div>\n <div className=\"mt-1 flex flex-wrap items-center gap-2 text-xs text-text-secondary\">\n <span>{dispatch.status}</span>\n {dispatch.createdAt && (\n <span>{new Date(dispatch.createdAt).toLocaleString()}</span>\n )}\n </div>\n </div>\n ))\n )}\n </div>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAaA,IAAM,IAAuC;CAC3C,QAAQ;CACR,MAAM;CACN,YAAY;CACZ,OAAO;CACP,YAAY;CACb;AAED,SAAgB,EAAc,EAAE,UAAO,0BAA2C;CAChF,IAAM,IAAK,GAAO,EACZ,CAAC,GAAO,KAAY,EAAiC,KAAK,EAC1D,CAAC,GAAgB,KAAqB,EAAsB,EAAE,CAAC,EAC/D,CAAC,GAAe,KAAoB,EAAuB,EAAE,CAAC,EAC9D,CAAC,GAAS,KAAc,EAAS,GAAK,EACtC,CAAC,GAAO,KAAY,EAAwB,KAAK;AAyCvD,QAvCA,QAAgB;EACd,IAAI,IAAY;EAChB,eAAe,IAAO;AAEpB,GADA,EAAW,GAAK,EAChB,EAAS,KAAK;AACd,OAAI;IACF,IAAM,CAAC,GAAG,GAAM,KAAQ,MAAM,QAAQ,IAAI;KACxC,EAAmB,EAAM;KACzB,EAAc,GAAO;MAAE,OAAO;MAAG,MAAM;MAAkB,CAAC;KAC1D,EAAqB,GAAO,EAAE,OAAO,GAAG,CAAC;KAC1C,CAAC;AACF,QAAI,EAAW;AAGf,IAFA,EAAS,EAAE,EACX,EAAkB,EAAK,EACvB,EAAiB,EAAK;YACf,GAAK;AACZ,IAAK,KAAW,EAAS,aAAe,QAAQ,EAAI,UAAU,0BAA0B;aAChF;AACR,IAAK,KAAW,EAAW,GAAM;;;AAIrC,SADA,GAAM,QACO;AACX,OAAY;;IAEb,CAAC,EAAM,IAAI,EAAM,QAAQ,CAAC,EAEzB,IAEA,kBAAC,GAAD,EAAc,SAAS,EAAG,oCAAoC,yBAAyB,EAAI,CAAA,GAE3F,IAEA,kBAAC,GAAD;EACE,OAAO,EAAG,uCAAuC,0BAA0B;EAC3E,SAAS;EACT,CAAA,GAIJ,kBAAC,OAAD;EAAK,WAAU;YAAf,CAEE,kBAAC,GAAD;GAAY,SAAS;GAAM,WAAU;aAArC;IACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KACE,OAAO,EAAG,2CAA2C,kBAAkB;KACvE,OAAO,GAAO,kBAAkB;KAChC,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;KACtC,SAAQ;KACR,CAAA,EACS,CAAA;IACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KACE,OAAO,EAAG,wCAAwC,eAAe;KACjE,OAAO,GAAO,aAAa,gBAAgB,IAAI;KAC/C,UAAU,OAAO,GAAO,aAAa,gBAAgB,IAAI,EAAE,UAAU,GAAO,cAAc,gBAAgB,IAAI;KAC9G,MAAM,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA;KACjC,CAAA,EACS,CAAA;IACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KACE,OAAO,EAAG,0CAA0C,iBAAiB;KACrE,OAAO,GAAO,iBAAiB;KAC/B,MAAM,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;KACnC,SAAS,GAAO,iBAAiB,EAAM,gBAAgB,IAAI,YAAY;KACvE,CAAA,EACS,CAAA;IACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KACE,OAAO,EAAG,0CAA0C,iBAAiB;KACrE,OAAO,GAAO,iBAAiB;KAC/B,MAAM,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA;KAC3C,CAAA,EACS,CAAA;IACF;MAEb,kBAAC,OAAD;GAAK,WAAU;aAAf,CAEE,kBAAC,GAAD;IAAM,WAAU;cAAhB,CACE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAG,2CAA2C,kBAAkB;MAC9D,CAAA;KACD,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAe,WAAW,IACzB,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAG,uCAAuC,kBAAkB;MAC3D,CAAA,GAEJ,EAAe,KAAK,MAClB,kBAAC,UAAD;MAEE,eAAe,IAAsB,EAAQ,GAAG;MAChD,WAAU;gBAHZ,CAKE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAQ;QACL,CAAA,EACN,kBAAC,OAAD;QAAK,WAAU;kBAA+B,EAAQ;QAAgB,CAAA,CAClE;UACN,kBAAC,QAAD;OACE,WAAW,gDAAgD,EAAa,EAAQ,WAAW;iBAE1F,EAAQ;OACJ,CAAA,CACA;QAfF,EAAQ,GAeN,CACT;KAEA,CAAA,CACD;OAGP,kBAAC,GAAD;IAAM,WAAU;cAAhB,CACE,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAG,0CAA0C,iBAAiB;MAC5D,CAAA;KACD,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAc,WAAW,IACxB,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAG,sCAAsC,4BAA4B;MACpE,CAAA,GAEJ,EAAc,KAAK,MACjB,kBAAC,OAAD;MAAuB,WAAU;gBAAjC,CACE,kBAAC,OAAD;OAAK,WAAU;iBAA0C,EAAS;OAAa,CAAA,EAC/E,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD,EAAA,UAAO,EAAS,QAAc,CAAA,EAC7B,EAAS,aACR,kBAAC,QAAD,EAAA,UAAO,IAAI,KAAK,EAAS,UAAU,CAAC,gBAAgB,EAAQ,CAAA,CAE1D;SACF;QARI,EAAS,GAQb,CACN;KAEA,CAAA,CACD;MACH;KACF"}
|