@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
|
@@ -65,7 +65,10 @@ function u() {
|
|
|
65
65
|
},
|
|
66
66
|
skip: !d,
|
|
67
67
|
fetchPolicy: "cache-first"
|
|
68
|
-
}), { agents: Kt, refetch: qt } = ce(), [Jt] = e(
|
|
68
|
+
}), { agents: Kt, refetch: qt } = ce(), [Jt] = e({
|
|
69
|
+
refetchQueries: ["VibeControlsInitialData", "ListTargets"],
|
|
70
|
+
awaitRefetchQueries: !0
|
|
71
|
+
}), [Yt] = ae(), [Xt] = re(), [Zt] = ne(), [J] = t(), [Qt] = ee(), [$t] = ie(), [en] = n({ fetchPolicy: "network-only" }), Y = i(() => (Gt?.targets?.items ?? []).map((e) => ({
|
|
69
72
|
id: e.id,
|
|
70
73
|
type: e.type || "DIRECT",
|
|
71
74
|
name: e.name,
|
|
@@ -162,7 +165,7 @@ function u() {
|
|
|
162
165
|
tags: G ? G.split(",").map((e) => e.trim()) : void 0,
|
|
163
166
|
metadata: B ? { description: B } : void 0
|
|
164
167
|
}
|
|
165
|
-
} }), v(!1), At(""), Nt(""), It(""), zt(""), Vt(""), Ut(""), Wt(""), q();
|
|
168
|
+
} }), v(!1), At(""), Nt(""), It(""), zt(""), Vt(""), Ut(""), Wt(""), q(), qt();
|
|
166
169
|
} catch (e) {
|
|
167
170
|
if (pe(e)) {
|
|
168
171
|
v(!1), w(!0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TargetsPage.js","names":[],"sources":["../../src/pages/TargetsPage.tsx"],"sourcesContent":["/**\n * Targets Page — Manage all targets (servers, workstations, environments).\n *\n * Targets are the first-class entity. Each target can have agents installed,\n * and supports two access types: Direct and SSH.\n */\n\nimport { useState, useMemo, useCallback, useEffect } from 'react';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { VIBE_PERMISSIONS } from '../constants/permissions';\nimport { isNative, nativeNotify } from '../utils/nativeBridge';\nimport { useLazyQuery } from '@apollo/client/react';\nimport {\n Plus,\n RefreshCw,\n Trash2,\n Server,\n Grid,\n List,\n CheckCircle,\n XCircle,\n Loader2,\n X,\n Check,\n Pencil,\n CheckSquare,\n XSquare,\n} from 'lucide-react';\nimport {\n PageHeader,\n SearchInput,\n FilterDropdown,\n EmptyState,\n LoadingState,\n ConfirmDialog,\n AgentSetupBanner,\n SearchableSelect,\n GetHelpButton,\n} from '@/components/shared';\nimport { TargetCard } from '@/components/targets';\nimport type { TargetCardTarget } from '@/components/targets';\nimport { MotionPage, MotionList, MotionItem } from '@burdenoff/fe-libs/shared/motion';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { AnimatePresence } from 'framer-motion';\nimport { useVibeControls, useVibeNavigate } from '@/providers/VibeControlsProvider';\nimport { useCachedInitialData } from '@/hooks/useCachedInitialData';\nimport { useSearchParams } from 'react-router-dom';\nimport {\n useListTargetsQuery,\n useCreateTargetMutation,\n useUpdateTargetMutation,\n useTestTargetMutation,\n useStartTerminalMutation,\n useDeleteTargetMutation,\n useInstallAgentOnTargetMutation,\n useUninstallAgentFromTargetMutation,\n useGetInstallAgentJobStatusLazyQuery,\n} from '@/generated/wspace-operations';\nimport { getQuotaDialogContent, isQuotaExhaustedError } from '@/utils/quotaUtils';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype TargetStatus = 'connected' | 'disconnected' | 'unknown';\n\ntype TargetKind = 'DIRECT' | 'SSH';\n\ninterface SshTarget {\n id: string;\n type: TargetKind;\n name: string;\n label: string | null;\n host: string | null;\n port: number | null;\n username: string | null;\n status: TargetStatus;\n connectionId: string | null;\n tags: string[];\n metadata: Record<string, unknown> | null;\n createdAt: string;\n agents: Array<{ id: string; name: string; version: string; isActive: boolean }>;\n}\n\ninterface AgentOption {\n id: string;\n name: string;\n isActive: boolean;\n tunnelUrl: string | null;\n agentApiKey: string | null;\n}\n\ninterface InstallJob {\n id: string;\n status: 'pending' | 'running' | 'completed' | 'failed';\n steps: Array<{ name: string; status: string; message?: string }>;\n currentStep: number;\n result?: { agentUrl?: string; backendAgentId?: string };\n error?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction mapStatus(s: string): TargetStatus {\n if (s === 'connected') return 'connected';\n if (s === 'disconnected') return 'disconnected';\n return 'unknown';\n}\n\nconst stepLabels: Record<string, string> = {\n connect: 'Connecting to server',\n detect_os: 'Detecting OS',\n install_bun: 'Installing Bun runtime',\n install_agent: 'Installing VibeControls Agent',\n configure: 'Configuring agent',\n start: 'Starting agent',\n verify: 'Verifying health',\n retrieve: 'Retrieving agent details',\n register: 'Registering with backend',\n};\n\ntype ViewMode = 'grid' | 'list';\n\nconst statusConfig: Record<TargetStatus, { label: string }> = {\n connected: { label: 'Connected' },\n disconnected: { label: 'Disconnected' },\n unknown: { label: 'Unknown' },\n};\n\nconst typeBadgeClass: Record<TargetKind, string> = {\n DIRECT: 'bg-action-primary-bg/10 text-action-primary-bg',\n SSH: 'bg-status-success-bg-subtle text-status-success-text',\n};\n\nconst targetStatusBadgeClass: Record<TargetStatus, string> = {\n connected: 'bg-status-success-bg-subtle text-status-success-text',\n disconnected: 'bg-status-error-bg-subtle text-status-error-text',\n unknown: 'bg-bg-sunken text-text-secondary',\n};\n\nfunction isAgentInstalled(target: SshTarget): boolean {\n return target.agents.length > 0;\n}\n\n// ---------------------------------------------------------------------------\n// Targets Page\n// ---------------------------------------------------------------------------\n\nexport function TargetsPage() {\n const { t } = useI18n();\n const { workspaceId } = useVibeControls();\n const navigate = useVibeNavigate();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const [searchParams] = useSearchParams();\n const selectedTargetId = searchParams.get('selectedTargetId');\n\n // UI state\n const [searchQuery, setSearchQuery] = useState('');\n const [agentFilter, setAgentFilter] = useState<string | null>(null);\n const [typeFilter, setTypeFilter] = useState('all');\n const [statusFilter, setStatusFilter] = useState('all');\n const [viewMode, setViewMode] = useState<ViewMode>('grid');\n const [showAddForm, setShowAddForm] = useState(false);\n const [deleteTargetId, setDeleteTargetId] = useState<string | null>(null);\n const [bulkDeleteOpen, setBulkDeleteOpen] = useState(false);\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [testResult, setTestResult] = useState<{\n id: string;\n success: boolean;\n message: string;\n } | null>(null);\n const [showQuotaExhausted, setShowQuotaExhausted] = useState(false);\n\n const tr = useCallback(\n (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n },\n [t]\n );\n\n // Install progress state\n const [installJobTarget, setInstallJobTarget] = useState<SshTarget | null>(null);\n const [installJob, setInstallJob] = useState<InstallJob | null>(null);\n const [installJobId, setInstallJobId] = useState<string | null>(null);\n\n // Edit target modal state\n const [editTarget, setEditTarget] = useState<SshTarget | null>(null);\n const [editLoading, setEditLoading] = useState(false);\n const [editError, setEditError] = useState<string | null>(null);\n const [editName, setEditName] = useState('');\n const [editLabel, setEditLabel] = useState('');\n const [editHost, setEditHost] = useState('');\n const [editPort, setEditPort] = useState(22);\n const [editUsername, setEditUsername] = useState('');\n const [editAuthMethod, setEditAuthMethod] = useState<'password' | 'key'>('key');\n const [editPassword, setEditPassword] = useState('');\n const [editKeyPath, setEditKeyPath] = useState('');\n const [editTags, setEditTags] = useState('');\n\n // Form state\n const [formType, setFormType] = useState<'DIRECT' | 'SSH'>('DIRECT');\n const [formName, setFormName] = useState('');\n const [formDescription, setFormDescription] = useState('');\n const [formAgent, setFormAgent] = useState('');\n const [formHost, setFormHost] = useState('');\n const [formPort, setFormPort] = useState(22);\n const [formUsername, setFormUsername] = useState('');\n const [formAuthMethod, setFormAuthMethod] = useState<'password' | 'key'>('key');\n const [formPassword, setFormPassword] = useState('');\n const [formKeyPath, setFormKeyPath] = useState('');\n const [formLabel, setFormLabel] = useState('');\n const [formTags, setFormTags] = useState('');\n\n // Queries - use cache-and-network for silent background refresh\n const {\n data: targetsData,\n loading,\n refetch: refetchTargets,\n } = useListTargetsQuery({\n variables: { workspaceId: workspaceId || '', limit: 50, offset: 0 },\n skip: !workspaceId,\n fetchPolicy: 'cache-first',\n });\n\n // Use cached initial data for related entities already prefetched on initial load.\n const { agents: cachedAgents, refetch: refetchInitialData } = useCachedInitialData();\n\n // Mutations\n const [createTarget] = useCreateTargetMutation();\n const [updateTarget] = useUpdateTargetMutation();\n const [testTarget] = useTestTargetMutation();\n const [startTerminal] = useStartTerminalMutation();\n const [deleteTarget] = useDeleteTargetMutation();\n const [installAgentOnTarget] = useInstallAgentOnTargetMutation();\n const [uninstallAgent] = useUninstallAgentFromTargetMutation();\n const [fetchInstallJobStatus] = useGetInstallAgentJobStatusLazyQuery({\n fetchPolicy: 'network-only',\n });\n\n // Derived data\n const targets: SshTarget[] = useMemo(() => {\n const raw = targetsData?.targets?.items ?? [];\n return raw.map((t: (typeof raw)[number]) => ({\n id: t.id,\n type: (t.type || 'DIRECT') as TargetKind,\n name: t.name,\n label: t.label || null,\n host: t.host || null,\n port: t.port || null,\n username: t.username || null,\n status: mapStatus(t.status),\n connectionId: t.connectionId || null,\n tags: t.tags,\n metadata: (t.metadata as Record<string, unknown> | null) ?? null,\n createdAt: t.createdAt,\n agents: (t.agents || []).map((a: (typeof t.agents)[number]) => ({\n id: a.id,\n name: a.name,\n version: a.version,\n isActive: a.isActive,\n })),\n }));\n }, [targetsData]);\n\n const agents: AgentOption[] = useMemo(() => {\n return cachedAgents.map((a) => ({\n id: a.id,\n name: a.name,\n isActive: a.isActive,\n tunnelUrl: a.tunnelUrl ?? null,\n agentApiKey: null,\n }));\n }, [cachedAgents]);\n\n const filtered = useMemo(() => {\n let items = targets;\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n items = items.filter(\n (t: SshTarget) =>\n t.name.toLowerCase().includes(q) ||\n t.host?.toLowerCase().includes(q) ||\n t.label?.toLowerCase().includes(q)\n );\n }\n if (agentFilter) {\n items = items.filter((t: SshTarget) => t.agents.some((a) => a.id === agentFilter));\n }\n if (typeFilter !== 'all') {\n items = items.filter((t: SshTarget) => t.type === typeFilter);\n }\n if (statusFilter !== 'all') {\n items = items.filter((t: SshTarget) => t.status === statusFilter);\n }\n return items;\n }, [targets, searchQuery, agentFilter, typeFilter, statusFilter]);\n\n useEffect(() => {\n if (!selectedTargetId) return;\n\n const target = filtered.find((item) => item.id === selectedTargetId);\n if (!target) return;\n\n const timeout = window.setTimeout(() => {\n document\n .getElementById(`target-row-${selectedTargetId}`)\n ?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }, 150);\n\n return () => window.clearTimeout(timeout);\n }, [filtered, selectedTargetId]);\n\n const connectedCount = targets.filter((t: SshTarget) => t.status === 'connected').length;\n const allFilteredSelected =\n filtered.length > 0 && filtered.every((t: SshTarget) => selectedIds.has(t.id));\n const hasSelection = selectedIds.size > 0;\n\n // Install job polling\n useEffect(() => {\n if (!installJobId || !installJobTarget) return;\n\n let cancelled = false;\n\n const pollJob = () => {\n void fetchInstallJobStatus({\n variables: { targetId: installJobTarget.id, jobId: installJobId },\n })\n .then((result) => {\n if (cancelled) return;\n const data = result.data?.installAgentJobStatus;\n if (!data) return;\n if (!data.steps) data.steps = [];\n setInstallJob({\n id: data.jobId,\n status: data.status,\n currentStep: data.currentStep ?? 0,\n steps: data.steps ?? [],\n result: data.result ?? undefined,\n error: data.error ?? undefined,\n });\n if (data.status === 'completed' || data.status === 'failed') {\n if (data.status === 'completed') {\n void refetchTargets();\n }\n }\n })\n .catch(() => {\n // Polling error — will retry on next interval\n });\n };\n\n pollJob();\n const interval = setInterval(pollJob, 2000);\n\n return () => {\n cancelled = true;\n clearInterval(interval);\n };\n }, [installJobId, installJobTarget, fetchInstallJobStatus, refetchTargets]);\n\n // Handlers\n const handleCreate = useCallback(async () => {\n if (!formName || !workspaceId) return;\n if (formType !== 'DIRECT' && (!formAgent || !formHost || !formUsername)) return;\n try {\n await createTarget({\n variables: {\n workspaceId,\n input: {\n type: formType as string,\n name: formName,\n sourceAgentId: formType !== 'DIRECT' ? formAgent : undefined,\n host: formType !== 'DIRECT' ? formHost : undefined,\n port: formType !== 'DIRECT' ? formPort : undefined,\n username: formType !== 'DIRECT' ? formUsername : undefined,\n password:\n formType === 'SSH' && formAuthMethod === 'password' ? formPassword : undefined,\n privateKeyPath:\n formType === 'SSH' && formAuthMethod === 'key' ? formKeyPath : undefined,\n label: formLabel || undefined,\n tags: formTags ? formTags.split(',').map((t: string) => t.trim()) : undefined,\n metadata: formDescription ? { description: formDescription } : undefined,\n },\n },\n });\n setShowAddForm(false);\n setFormName('');\n setFormHost('');\n setFormUsername('');\n setFormPassword('');\n setFormKeyPath('');\n setFormLabel('');\n setFormTags('');\n void refetchTargets();\n } catch (err) {\n if (isQuotaExhaustedError(err)) {\n setShowAddForm(false);\n setShowQuotaExhausted(true);\n return;\n }\n\n throw err;\n }\n }, [\n formName,\n formAgent,\n formHost,\n formPort,\n formUsername,\n formAuthMethod,\n formPassword,\n formKeyPath,\n formLabel,\n formTags,\n formDescription,\n formType,\n workspaceId,\n createTarget,\n refetchTargets,\n ]);\n\n const handleTest = useCallback(\n async (id: string) => {\n const result = await testTarget({ variables: { id } });\n const data = result.data?.testTarget;\n if (data) {\n setTestResult({ id, success: data.success, message: data.message || '' });\n setTimeout(() => setTestResult(null), 5000);\n void refetchTargets();\n }\n },\n [testTarget, refetchTargets]\n );\n\n const handleStartTerminal = useCallback(\n async (id: string) => {\n try {\n const result = await startTerminal({ variables: { targetId: id } });\n if (result.error && isQuotaExhaustedError(result.error)) {\n setShowQuotaExhausted(true);\n return;\n }\n\n const data = result.data?.startTerminal;\n if (data?.sessionId) {\n navigate(`/sessions/${data.sessionId}`);\n }\n } catch (err) {\n if (isQuotaExhaustedError(err)) {\n setShowQuotaExhausted(true);\n return;\n }\n\n throw err;\n }\n },\n [startTerminal, navigate]\n );\n\n const handleDeleteSingle = useCallback(async () => {\n if (!deleteTargetId) return;\n try {\n await deleteTarget({ variables: { id: deleteTargetId } });\n if (isNative()) void nativeNotify('success');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n throw err;\n }\n setDeleteTargetId(null);\n setSelectedIds((prev) => {\n const next = new Set(prev);\n next.delete(deleteTargetId);\n return next;\n });\n void refetchTargets();\n }, [deleteTargetId, deleteTarget, refetchTargets]);\n\n const handleBulkDelete = useCallback(async () => {\n const ids = Array.from(selectedIds);\n await Promise.all(ids.map((id: string) => deleteTarget({ variables: { id } })));\n setSelectedIds(new Set());\n setBulkDeleteOpen(false);\n void refetchTargets();\n }, [selectedIds, deleteTarget, refetchTargets]);\n\n const handleInstallAgent = useCallback(\n async (target: SshTarget) => {\n setInstallJobTarget(target);\n setInstallJob(null);\n setInstallJobId(null);\n\n const sourceAgent = agents.find((a: AgentOption) => a.isActive);\n if (!sourceAgent) return;\n\n const result = await installAgentOnTarget({\n variables: { targetId: target.id, sourceAgentId: sourceAgent.id },\n });\n const data = result.data?.installAgentOnTarget;\n if (data?.jobId) {\n setInstallJobId(data.jobId);\n }\n },\n [installAgentOnTarget, agents]\n );\n\n const handleUninstallAgent = useCallback(\n async (target: SshTarget) => {\n await uninstallAgent({ variables: { targetId: target.id } });\n void refetchTargets();\n },\n [uninstallAgent, refetchTargets]\n );\n\n const handleOpenEdit = useCallback((target: SshTarget) => {\n setEditTarget(target);\n setEditName(target.name);\n setEditLabel(target.label ?? '');\n setEditHost(target.host ?? '');\n setEditPort(target.port ?? 22);\n setEditUsername(target.username ?? '');\n setEditAuthMethod('key');\n setEditPassword('');\n setEditKeyPath('');\n setEditTags(target.tags.join(', '));\n setEditError(null);\n }, []);\n\n const handleSaveEdit = useCallback(async () => {\n if (!editTarget) return;\n if (!editName.trim()) {\n setEditError('Name is required');\n return;\n }\n setEditLoading(true);\n setEditError(null);\n try {\n await updateTarget({\n variables: {\n id: editTarget.id,\n input: {\n name: editName.trim(),\n label: editLabel.trim() || null,\n host: editHost.trim() || undefined,\n port: editPort || undefined,\n username: editUsername.trim() || undefined,\n password:\n editTarget.type === 'SSH' && editAuthMethod === 'password' && editPassword\n ? editPassword\n : undefined,\n privateKeyPath:\n editTarget.type === 'SSH' && editAuthMethod === 'key' && editKeyPath\n ? editKeyPath\n : undefined,\n tags: editTags\n ? editTags\n .split(',')\n .map((t: string) => t.trim())\n .filter(Boolean)\n : [],\n },\n },\n });\n setEditTarget(null);\n void refetchTargets();\n } catch (err) {\n setEditError(err instanceof Error ? err.message : 'Failed to update target');\n } finally {\n setEditLoading(false);\n }\n }, [\n editTarget,\n editName,\n editLabel,\n editHost,\n editPort,\n editUsername,\n editAuthMethod,\n editPassword,\n editKeyPath,\n editTags,\n updateTarget,\n refetchTargets,\n ]);\n\n const closeInstallDialog = useCallback(() => {\n setInstallJobTarget(null);\n setInstallJob(null);\n setInstallJobId(null);\n }, []);\n\n const toggleSelectAll = useCallback(() => {\n if (allFilteredSelected) {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n filtered.forEach((t: SshTarget) => next.delete(t.id));\n return next;\n });\n } else {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n filtered.forEach((t: SshTarget) => next.add(t.id));\n return next;\n });\n }\n }, [allFilteredSelected, filtered]);\n\n const toggleSelect = useCallback((id: string) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n // Stats\n const stats = {\n total: targets.length,\n connected: connectedCount,\n };\n\n const localizedTypeOptions = useMemo(\n () => [\n { value: 'all', label: tr('targets.filterTypeAll', 'All Types') },\n { value: 'DIRECT', label: tr('targets.typeDirect', 'Direct') },\n { value: 'SSH', label: 'SSH' },\n ],\n [tr]\n );\n\n const localizedStatusOptions = useMemo(\n () => [\n { value: 'all', label: tr('targets.filterStatusAll', 'All Statuses') },\n { value: 'connected', label: tr('targets.connected', 'Connected') },\n { value: 'disconnected', label: tr('targets.disconnected', 'Disconnected') },\n { value: 'unknown', label: tr('targets.unknown', 'Unknown') },\n ],\n [tr]\n );\n\n const isFiltered = searchQuery || agentFilter || typeFilter !== 'all' || statusFilter !== 'all';\n\n if (permissionsLoading)\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <p className=\"text-text-secondary\">Loading permissions...</p>\n </div>\n );\n if (!hasPermission(VIBE_PERMISSIONS.TARGET_LIST))\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-center space-y-2\">\n <h2 className=\"text-lg font-semibold text-foreground\">Access Denied</h2>\n <p className=\"text-sm text-text-secondary\">\n You don't have permission to access this page.\n </p>\n </div>\n </div>\n );\n\n // Loading state (only show on first load, not on background refetch)\n if (loading && targets.length === 0) {\n return (\n <MotionPage className=\"space-y-6 p-4 sm:p-6 bg-bg-surface min-h-screen\">\n <PageHeader\n title={tr('nav.targets', 'Targets')}\n description={tr(\n 'targets.description',\n 'Manage your servers, workstations, and environments.'\n )}\n />\n <LoadingState message={tr('targets.loading', 'Loading targets...')} />\n </MotionPage>\n );\n }\n\n return (\n <MotionPage className=\"space-y-6 p-4 sm:p-6 bg-bg-surface min-h-screen\">\n {/* Test result toast */}\n {testResult && (\n <div\n className={`fixed top-4 right-4 z-[10000] rounded-md px-4 py-3 shadow-lg text-sm ${\n testResult.success\n ? 'bg-status-success-bg text-status-success-text'\n : 'bg-status-error-bg text-status-error-text'\n }`}\n >\n {testResult.success\n ? tr('targets.connectionSuccessful', 'Connection successful')\n : tr('targets.connectionFailed', 'Connection failed')}\n : {testResult.message}\n </div>\n )}\n\n <PageHeader\n title={tr('nav.targets', 'Targets')}\n description={`${stats.connected} of ${stats.total} targets online`}\n actions={\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2\">\n <button\n onClick={() => void refetchTargets()}\n disabled={loading}\n className=\"flex items-center justify-center gap-2 px-3 py-2 text-text-secondary hover:bg-bg-sunken rounded-md transition-colors disabled:opacity-50\"\n title={tr('targets.refreshTitle', 'Refresh targets')}\n >\n <RefreshCw className={`w-4 h-4 ${loading ? 'animate-spin' : ''}`} />\n </button>\n <button\n onClick={() => setShowAddForm(true)}\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('targets.addTarget', 'Add Target')}\n </button>\n </div>\n }\n />\n\n {/* Agent setup banner */}\n {agents.length === 0 && !loading && (\n <AgentSetupBanner variant=\"full\" dismissKey=\"vibecontrols-targets-setup-banner\" />\n )}\n\n {/* Filters Bar */}\n <div className=\"space-y-3\">\n {/* Row 1: Search + View Toggle */}\n <div className=\"flex items-center gap-2\">\n <SearchInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder={tr('targets.searchPlaceholder', 'Search targets...')}\n className=\"flex-1 sm:w-64 sm:flex-none\"\n />\n {/* View Toggle */}\n <div className=\"flex items-center gap-1 bg-bg-sunken rounded-md p-1 flex-shrink-0\">\n <button\n onClick={() => setViewMode('grid')}\n className={`p-1.5 sm:p-2 rounded ${viewMode === 'grid' ? 'bg-bg-surface shadow-sm' : 'hover:bg-bg-surface/50'}`}\n title={tr('targets.gridViewTitle', 'Grid view')}\n >\n <Grid className=\"w-4 h-4 text-text-secondary\" />\n </button>\n <button\n onClick={() => setViewMode('list')}\n className={`p-1.5 sm:p-2 rounded ${viewMode === 'list' ? 'bg-bg-surface shadow-sm' : 'hover:bg-bg-surface/50'}`}\n title={tr('targets.listViewTitle', 'List view')}\n >\n <List className=\"w-4 h-4 text-text-secondary\" />\n </button>\n </div>\n </div>\n\n {/* Row 2: Filters */}\n <div className=\"flex items-center gap-2 sm:gap-3 flex-wrap\">\n <FilterDropdown\n label={tr('sessions.filterType', 'Type')}\n value={typeFilter}\n options={localizedTypeOptions}\n onChange={setTypeFilter}\n />\n <FilterDropdown\n label={tr('sessions.filterStatus', 'Status')}\n value={statusFilter}\n options={localizedStatusOptions}\n onChange={setStatusFilter}\n />\n <SearchableSelect\n value={agentFilter ?? ''}\n onChange={(v: string) => setAgentFilter(v || null)}\n options={agents.map((a: AgentOption) => ({ value: a.id, label: a.name }))}\n placeholder={tr('targets.allAgents', 'All agents')}\n className=\"w-full sm:min-w-[180px] sm:w-auto\"\n dropdownAlign=\"left\"\n clearable\n />\n </div>\n </div>\n\n {/* Select All & Bulk Actions */}\n {filtered.length > 0 && (\n <div className=\"flex items-center gap-2 flex-wrap\">\n <div className=\"ml-auto flex items-center gap-2\">\n <button\n onClick={toggleSelectAll}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary transition-colors\"\n >\n <CheckSquare className=\"w-3.5 h-3.5\" />\n {allFilteredSelected\n ? tr('targets.deselectAll', 'Deselect All')\n : tr('targets.selectAll', 'Select All')}\n </button>\n </div>\n </div>\n )}\n\n {/* Bulk Action Bar */}\n {hasSelection && (\n <div className=\"flex flex-col sm:flex-row items-start sm:items-center gap-3 px-4 py-2 bg-action-primary-bg/10 border border-action-primary-bg/20 rounded-lg\">\n <span className=\"text-sm font-medium text-text-primary\">\n {selectedIds.size} {tr('nav.targets', 'target')}\n {selectedIds.size !== 1 ? 's' : ''} {tr('sessions.selected', 'selected')}\n </span>\n <div className=\"flex items-center gap-1.5 sm:ml-auto\">\n <button\n onClick={() => setBulkDeleteOpen(true)}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-status-error-text bg-status-error-bg border border-status-error-text/20 rounded-md hover:bg-status-error-bg/80 transition-colors\"\n >\n <Trash2 className=\"w-3 h-3\" /> {tr('common.delete', 'Delete')}\n </button>\n <button\n onClick={() => setSelectedIds(new Set())}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary transition-colors\"\n >\n <XSquare className=\"w-3 h-3\" /> {tr('sessions.deselect', 'Deselect')}\n </button>\n </div>\n </div>\n )}\n\n {/* Results Count */}\n {isFiltered ? (\n <p className=\"text-sm text-text-secondary\">\n {tr('targets.showingResults', 'Showing {{filtered}} of {{total}} targets')\n .replace('{{filtered}}', String(filtered.length))\n .replace('{{total}}', String(targets.length))}\n {loading && (\n <span className=\"ml-2 text-text-muted\">\n ({tr('sessions.refreshing', 'refreshing...')})\n </span>\n )}\n </p>\n ) : null}\n\n {/* Targets Display */}\n {filtered.length > 0 ? (\n <AnimatePresence mode=\"wait\">\n {viewMode === 'grid' ? (\n <MotionList\n key=\"grid-view\"\n stagger={0.04}\n className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\"\n >\n {filtered.map((target: SshTarget) => (\n <MotionItem key={target.id}>\n <TargetCard\n target={target as TargetCardTarget}\n onTest={(id) => void handleTest(id)}\n onTerminal={(id) => void handleStartTerminal(id)}\n onOpenDetail={(id) => navigate(`/targets/${id}`)}\n onEdit={(t) => handleOpenEdit(t as SshTarget)}\n onInstallAgent={(t) => void handleInstallAgent(t as SshTarget)}\n onUninstallAgent={(t) => void handleUninstallAgent(t as SshTarget)}\n onDelete={(id) => setDeleteTargetId(id)}\n selected={selectedIds.has(target.id)}\n onToggleSelect={() => toggleSelect(target.id)}\n highlighted={selectedTargetId === target.id}\n />\n </MotionItem>\n ))}\n </MotionList>\n ) : (\n <MotionList key=\"list-view\" stagger={0.04} className=\"space-y-2\">\n {filtered.map((target: SshTarget) => {\n const installed = isAgentInstalled(target);\n const isSelectedTarget = selectedTargetId === target.id;\n return (\n <MotionItem key={target.id} variant=\"fadeRight\">\n <div\n id={`target-row-${target.id}`}\n className={`p-4 rounded-lg border transition-colors ${\n isSelectedTarget\n ? 'border-action-primary-bg bg-action-primary-bg/5 shadow-sm'\n : 'border-border-default hover:bg-bg-sunken/30'\n }`}\n >\n {/* Row 1: Info */}\n <div className=\"flex items-start gap-3\">\n <input\n type=\"checkbox\"\n checked={selectedIds.has(target.id)}\n onChange={() => toggleSelect(target.id)}\n className=\"rounded border-border-default mt-1\"\n />\n <div className=\"flex min-w-0 flex-1 flex-wrap items-start gap-2\">\n <span\n className={`inline-flex items-center px-2 py-0.5 text-xs font-semibold rounded ${typeBadgeClass[target.type]}`}\n >\n {target.type}\n </span>\n <span\n className={`inline-flex items-center px-2 py-0.5 text-xs font-semibold rounded ${targetStatusBadgeClass[target.status]}`}\n >\n {tr(\n `targets.status.${target.status}`,\n statusConfig[target.status].label\n )}\n </span>\n <div className=\"min-w-0 basis-full\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-medium\">{target.name}</span>\n {target.label && (\n <span className=\"text-text-secondary text-sm\">{target.label}</span>\n )}\n {installed && (\n <span className=\"inline-flex items-center gap-1 rounded-full border border-status-success-border px-2 py-0.5 text-xs bg-status-success-bg-subtle text-status-success-text\">\n <CheckCircle size={10} />\n {tr('targets.agentInstalled', 'Agent Installed')}\n </span>\n )}\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-2 text-sm text-text-secondary sm:gap-3\">\n {target.host && (\n <code className=\"text-xs\">\n {target.username ? `${target.username}@` : ''}\n {target.host}\n {target.port ? `:${target.port}` : ''}\n </code>\n )}\n {target.agents.length > 0 && (\n <span className=\"text-text-tertiary\">\n {tr('targets.via', 'via')} {target.agents[0].name}\n </span>\n )}\n </div>\n {target.tags.length > 0 && (\n <div className=\"mt-1.5 flex flex-wrap gap-1\">\n {target.tags.map((tag: string) => (\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 </div>\n </div>\n </div>\n {/* Row 2: Actions */}\n <div className=\"mt-3 flex flex-wrap items-center gap-2 pl-0 sm:pl-7\">\n <button\n onClick={() => void handleTest(target.id)}\n title={tr('targets.testConnectivity', 'Test connectivity')}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-md border border-border-default bg-bg-surface hover:bg-bg-sunken transition-colors\"\n >\n {tr('targets.test', 'Test')}\n </button>\n <button\n onClick={() => void handleStartTerminal(target.id)}\n title={tr('targets.openTerminal', 'Open terminal')}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-md border border-border-default bg-bg-surface hover:bg-bg-sunken transition-colors\"\n >\n {tr('targets.terminal', 'Terminal')}\n </button>\n <button\n onClick={() => handleOpenEdit(target)}\n title=\"Edit target configuration\"\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-md border border-border-default bg-bg-surface hover:bg-bg-sunken transition-colors\"\n >\n <Pencil size={14} />\n Edit\n </button>\n {target.type !== 'DIRECT' && !installed && (\n <button\n onClick={() => void handleInstallAgent(target)}\n title={tr('targets.installAgent', 'Install agent')}\n className=\"flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg-hover transition-colors\"\n >\n {tr('targets.installAgent', 'Install Agent')}\n </button>\n )}\n {target.type !== 'DIRECT' && installed && (\n <button\n onClick={() => void handleUninstallAgent(target)}\n title={tr('targets.uninstallAgent', 'Uninstall agent')}\n className=\"flex items-center gap-1.5 rounded-md border border-status-error-text/20 px-3 py-1.5 text-xs font-medium text-status-error-text hover:bg-status-error-bg/80 transition-colors\"\n >\n {tr('targets.uninstall', 'Uninstall')}\n </button>\n )}\n <div className=\"hidden flex-1 sm:block\" />\n <button\n onClick={() => setDeleteTargetId(target.id)}\n title={tr('targets.deleteTarget', 'Delete target')}\n className=\"flex items-center gap-1.5 rounded-md border border-status-error-border px-3 py-1.5 text-xs font-medium text-status-error-text hover:bg-status-error-bg/80 transition-colors\"\n >\n <X size={14} />\n {tr('common.delete', 'Delete')}\n </button>\n </div>\n </div>\n </MotionItem>\n );\n })}\n </MotionList>\n )}\n </AnimatePresence>\n ) : (\n <EmptyState\n icon={<Server className=\"w-8 h-8 text-text-secondary\" />}\n title={\n isFiltered\n ? tr('targets.emptyNoTargetsFound', 'No targets found')\n : tr('targets.emptyNoTargetsConfigured', 'No targets configured')\n }\n description={\n isFiltered\n ? tr('targets.emptyAdjustSearch', 'Try adjusting your search or filters')\n : tr(\n 'targets.emptyDescription',\n 'Add a target to start managing servers, workstations, and environments.'\n )\n }\n action={\n !isFiltered ? (\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setShowAddForm(true)}\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('targets.addTarget', 'Add Target')}\n </button>\n <GetHelpButton prompt=\"What is a Target in VibeControls and how do I create one?\" />\n </div>\n ) : undefined\n }\n />\n )}\n\n {/* Active sessions live on the dedicated /vibecontrols/sessions page —\n intentionally not surfaced here so the Targets tab stays focused on\n target lifecycle (add/edit/delete + drill into a target's agents). */}\n\n {/* Add Target modal */}\n {showAddForm && (\n <div className=\"fixed inset-0 z-50 flex items-start justify-center pt-16 overflow-y-auto\">\n <div\n className=\"fixed inset-0 bg-bg-overlay backdrop-blur-sm\"\n onClick={() => setShowAddForm(false)}\n />\n <div\n className=\"relative bg-bg-elevated rounded-xl shadow-2xl border border-border-default max-w-lg w-full mx-4 p-6 space-y-4 mb-8\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <h2 className=\"text-lg font-semibold\">{tr('targets.addTarget', 'Add Target')}</h2>\n <button\n onClick={() => setShowAddForm(false)}\n className=\"p-1 rounded-lg hover:bg-bg-sunken transition-colors\"\n >\n <X size={18} />\n </button>\n </div>\n\n <div className=\"space-y-4\">\n {/* Target Type */}\n <div>\n <label className=\"text-sm font-medium block mb-1.5\">\n {tr('targets.targetType', 'Target Type')}\n </label>\n <div className=\"grid grid-cols-2 gap-2\">\n {(['DIRECT', 'SSH'] as const).map((t) => (\n <button\n key={t}\n onClick={() => setFormType(t)}\n className={`px-3 py-2 text-sm font-medium rounded-lg border transition-colors ${\n formType === t\n ? 'border-action-primary-bg bg-action-primary-bg/10 text-action-primary-bg'\n : 'border-border-default hover:bg-bg-sunken text-text-secondary'\n }`}\n >\n {t}\n </button>\n ))}\n </div>\n <p className=\"text-xs text-text-tertiary mt-1\">\n {formType === 'DIRECT'\n ? tr(\n 'targets.targetTypeDirectHint',\n 'A local machine where you will install the agent manually.'\n )\n : tr('targets.targetTypeSshHint', 'A remote server accessible via SSH.')}\n </p>\n </div>\n\n {/* Name */}\n <div>\n <label className=\"text-sm font-medium\">{tr('webhooks.name', 'Name')}</label>\n <input\n value={formName}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setFormName(e.target.value)}\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder={\n formType === 'DIRECT'\n ? tr('targets.namePlaceholderDirect', 'My Laptop')\n : tr('targets.namePlaceholderServer', 'Production Server')\n }\n />\n </div>\n\n {/* Description (all types) */}\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.descriptionOptional', 'Description (optional)')}\n </label>\n <input\n value={formDescription}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setFormDescription(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder={tr(\n 'targets.descriptionPlaceholder',\n 'Brief description of this target'\n )}\n />\n </div>\n\n {/* Connection fields — only for SSH */}\n {formType !== 'DIRECT' && (\n <>\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.sourceAgent', 'Source Agent')}\n </label>\n <select\n value={formAgent}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) =>\n setFormAgent(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n >\n <option value=\"\">\n {tr('targets.selectAgentConnectFrom', 'Select an agent to connect from')}\n </option>\n {agents.map((a: AgentOption) => (\n <option key={a.id} value={a.id}>\n {a.name}\n </option>\n ))}\n </select>\n <p className=\"text-xs text-text-tertiary mt-0.5\">\n {tr('targets.agentConnectionHintPrefix', 'The agent that will establish the')}{' '}\n {formType}{' '}\n {tr('targets.agentConnectionHintSuffix', 'connection to this target.')}\n </p>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\n <div>\n <label className=\"text-sm font-medium\">{tr('targets.host', 'Host')}</label>\n <input\n value={formHost}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setFormHost(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder={tr('targets.hostPlaceholder', '192.168.1.100')}\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">{tr('tunnels.port', 'Port')}</label>\n <input\n type=\"number\"\n value={formPort}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setFormPort(Number(e.target.value))\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n />\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.username', 'Username')}\n </label>\n <input\n value={formUsername}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setFormUsername(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder={tr('targets.usernamePlaceholder', 'root')}\n />\n </div>\n {formType === 'SSH' && (\n <>\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.authentication', 'Authentication')}\n </label>\n <div className=\"flex gap-4 mt-1\">\n <label className=\"flex items-center gap-2 cursor-pointer text-sm\">\n <input\n type=\"radio\"\n checked={formAuthMethod === 'password'}\n onChange={() => setFormAuthMethod('password')}\n />\n {tr('targets.password', 'Password')}\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer text-sm\">\n <input\n type=\"radio\"\n checked={formAuthMethod === 'key'}\n onChange={() => setFormAuthMethod('key')}\n />\n {tr('targets.privateKey', 'Private Key')}\n </label>\n </div>\n </div>\n {formAuthMethod === 'password' ? (\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.password', 'Password')}\n </label>\n <input\n type=\"password\"\n value={formPassword}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setFormPassword(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n />\n </div>\n ) : (\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.privateKeyPath', 'Private Key Path')}\n </label>\n <input\n value={formKeyPath}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setFormKeyPath(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder={tr('targets.privateKeyPathPlaceholder', '~/.ssh/id_rsa')}\n />\n </div>\n )}\n </>\n )}\n </>\n )}\n\n {/* Label + Tags (all types) */}\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.labelOptional', 'Label (optional)')}\n </label>\n <input\n value={formLabel}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setFormLabel(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder={tr('targets.labelPlaceholder', 'web-server-01')}\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.tagsCommaSeparated', 'Tags (comma-separated)')}\n </label>\n <input\n value={formTags}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setFormTags(e.target.value)}\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder={tr('targets.tagsPlaceholder', 'production, web')}\n />\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 pt-2 border-t border-border-default\">\n <button\n onClick={() => setShowAddForm(false)}\n className=\"px-4 py-2 text-sm rounded-md border border-border-default hover:bg-bg-sunken transition-colors\"\n >\n {tr('common.cancel', 'Cancel')}\n </button>\n <button\n onClick={() => void handleCreate()}\n className=\"px-4 py-2 text-sm rounded-md bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg-hover transition-colors\"\n >\n {tr('targets.addTarget', 'Add Target')}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Edit Target modal */}\n {editTarget && (\n <div className=\"fixed inset-0 z-50 flex items-start justify-center pt-16 overflow-y-auto\">\n <div\n className=\"fixed inset-0 bg-bg-overlay backdrop-blur-sm\"\n onClick={() => !editLoading && setEditTarget(null)}\n />\n <div\n className=\"relative bg-bg-elevated rounded-xl shadow-2xl border border-border-default max-w-lg w-full mx-4 p-6 space-y-4 mb-8\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <h2 className=\"text-lg font-semibold\">Edit Target</h2>\n <p className=\"text-sm text-text-secondary mt-0.5\">{editTarget.name}</p>\n </div>\n <button\n onClick={() => setEditTarget(null)}\n disabled={editLoading}\n className=\"p-1 rounded-lg hover:bg-bg-sunken transition-colors disabled:opacity-50\"\n >\n <X size={18} />\n </button>\n </div>\n\n {editError && (\n <div className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle p-3 text-sm text-status-error-text\">\n {editError}\n </div>\n )}\n\n <div className=\"space-y-4\">\n {/* Name */}\n <div>\n <label className=\"text-sm font-medium\">Name</label>\n <input\n value={editName}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setEditName(e.target.value)}\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder=\"Production Server\"\n />\n </div>\n\n {/* Label */}\n <div>\n <label className=\"text-sm font-medium\">Label (optional)</label>\n <input\n value={editLabel}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditLabel(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder=\"web-server-01\"\n />\n </div>\n\n {/* Connection fields — only for non-DIRECT targets */}\n {editTarget.type !== 'DIRECT' && (\n <>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"text-sm font-medium\">Host</label>\n <input\n value={editHost}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditHost(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder=\"192.168.1.100\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Port</label>\n <input\n type=\"number\"\n value={editPort}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditPort(Number(e.target.value))\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n />\n </div>\n </div>\n\n <div>\n <label className=\"text-sm font-medium\">Username</label>\n <input\n value={editUsername}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditUsername(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder=\"root\"\n />\n </div>\n\n {editTarget.type === 'SSH' && (\n <>\n <div>\n <label className=\"text-sm font-medium\">Update credentials (optional)</label>\n <div className=\"flex gap-4 mt-1\">\n <label className=\"flex items-center gap-2 cursor-pointer text-sm\">\n <input\n type=\"radio\"\n checked={editAuthMethod === 'password'}\n onChange={() => setEditAuthMethod('password')}\n />\n Password\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer text-sm\">\n <input\n type=\"radio\"\n checked={editAuthMethod === 'key'}\n onChange={() => setEditAuthMethod('key')}\n />\n Private Key\n </label>\n </div>\n <p className=\"text-xs text-text-tertiary mt-0.5\">\n Leave blank to keep existing credentials.\n </p>\n </div>\n {editAuthMethod === 'password' ? (\n <div>\n <label className=\"text-sm font-medium\">New Password</label>\n <input\n type=\"password\"\n value={editPassword}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditPassword(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder=\"Leave blank to keep current\"\n />\n </div>\n ) : (\n <div>\n <label className=\"text-sm font-medium\">New Private Key Path</label>\n <input\n value={editKeyPath}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditKeyPath(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder=\"Leave blank to keep current (~/.ssh/id_rsa)\"\n />\n </div>\n )}\n </>\n )}\n </>\n )}\n\n {/* Tags */}\n <div>\n <label className=\"text-sm font-medium\">Tags (comma-separated)</label>\n <input\n value={editTags}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setEditTags(e.target.value)}\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder=\"production, web\"\n />\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 pt-2 border-t border-border-default\">\n <button\n onClick={() => setEditTarget(null)}\n disabled={editLoading}\n className=\"px-4 py-2 text-sm rounded-lg border border-border-default hover:bg-bg-sunken transition-colors disabled:opacity-50\"\n >\n Cancel\n </button>\n <button\n onClick={() => void handleSaveEdit()}\n disabled={editLoading}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm text-action-primary-text transition-colors hover:bg-action-primary-bg-hover disabled:opacity-50\"\n >\n {editLoading ? 'Saving...' : 'Save Changes'}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Single delete confirmation */}\n <ConfirmDialog\n isOpen={!!deleteTargetId}\n onClose={() => setDeleteTargetId(null)}\n onConfirm={() => void handleDeleteSingle()}\n title={tr('targets.deleteTarget', 'Delete Target')}\n message={tr(\n 'targets.deleteTargetMessage',\n 'This will remove the target and its connection from the agent. Active terminals will be disconnected.'\n )}\n confirmLabel={tr('common.delete', 'Delete')}\n variant=\"danger\"\n />\n\n {/* Bulk delete confirmation */}\n <ConfirmDialog\n isOpen={bulkDeleteOpen}\n onClose={() => setBulkDeleteOpen(false)}\n onConfirm={() => void handleBulkDelete()}\n title={tr('targets.deleteSelectedTargets', 'Delete Selected Targets')}\n message={`${tr('targets.confirmDeleteSelectedPrefix', 'Are you sure you want to delete')} ${selectedIds.size} ${tr('nav.targets', 'target')}${selectedIds.size === 1 ? '' : 's'}? ${tr('targets.confirmDeleteSelectedSuffix', 'This action cannot be undone.')}`}\n confirmLabel={tr('targets.deleteAll', 'Delete All')}\n variant=\"danger\"\n />\n\n {/* Install progress dialog */}\n {installJobTarget && (\n <div className=\"fixed inset-0 bg-bg-overlay flex items-center justify-center z-50\">\n <div className=\"bg-bg-elevated rounded-xl shadow-xl max-w-md w-full mx-4 p-6\">\n <div className=\"flex items-start justify-between gap-3\">\n <h2 className=\"text-lg font-semibold break-words\">\n {tr('targets.installingAgentOn', 'Installing Agent on')} {installJobTarget.name}\n </h2>\n {installJob?.status !== 'running' && (\n <button onClick={closeInstallDialog} className=\"p-1 rounded hover:bg-bg-sunken\">\n <X size={16} />\n </button>\n )}\n </div>\n\n <div className=\"space-y-2 mt-4\">\n {installJob && installJob.steps ? (\n installJob.steps.map((step: InstallJob['steps'][number], idx: number) => (\n <div key={idx} className=\"flex items-center gap-3\">\n {step.status === 'running' && (\n <Loader2 className=\"animate-spin text-action-primary-bg\" size={16} />\n )}\n {step.status === 'completed' && (\n <CheckCircle className=\"text-status-success-text\" size={16} />\n )}\n {step.status === 'failed' && (\n <XCircle className=\"text-status-error-text\" size={16} />\n )}\n {step.status === 'skipped' && (\n <Check className=\"text-text-tertiary\" size={16} />\n )}\n {step.status === 'pending' && (\n <div className=\"w-4 h-4 rounded-full border-2 border-border-default\" />\n )}\n <div>\n <div className=\"text-sm font-medium\">\n {tr(`targets.installStep.${step.name}`, stepLabels[step.name] ?? step.name)}\n </div>\n {step.message && (\n <div className=\"text-xs text-text-tertiary\">{step.message}</div>\n )}\n </div>\n </div>\n ))\n ) : (\n <div className=\"flex items-center gap-3\">\n <Loader2 className=\"animate-spin text-action-primary-bg\" size={16} />\n <span className=\"text-sm\">\n {tr('targets.startingInstallJob', 'Starting install job...')}\n </span>\n </div>\n )}\n </div>\n\n {installJob?.status === 'completed' && (\n <div className=\"mt-4 rounded-lg border border-status-success-border bg-status-success-bg-subtle p-3 text-sm text-status-success-text\">\n {tr('targets.agentInstalledSuccess', 'Agent installed successfully!')}\n </div>\n )}\n {installJob?.status === 'failed' && (\n <div className=\"mt-4 rounded-lg border border-status-error-border bg-status-error-bg-subtle p-3 text-sm text-status-error-text\">\n {installJob.error ?? tr('targets.installationFailed', 'Installation failed.')}\n </div>\n )}\n\n <button\n onClick={closeInstallDialog}\n disabled={installJob?.status === 'running'}\n className=\"mt-4 w-full px-4 py-2 rounded-md border border-border-default hover:bg-bg-sunken transition-colors disabled:opacity-50 disabled:cursor-not-allowed text-sm font-medium\"\n >\n {!installJob || installJob.status === 'running'\n ? tr('targets.installing', 'Installing...')\n : tr('common.close', 'Close')}\n </button>\n </div>\n </div>\n )}\n\n <ConfirmDialog\n isOpen={showQuotaExhausted}\n onClose={() => setShowQuotaExhausted(false)}\n onConfirm={() => {\n setShowQuotaExhausted(false);\n navigate('/billing');\n }}\n title={getQuotaDialogContent('environment').title}\n message={getQuotaDialogContent('environment').message}\n confirmLabel=\"View Billing\"\n cancelLabel=\"Dismiss\"\n variant=\"warning\"\n />\n </MotionPage>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TargetsPage.js","names":[],"sources":["../../src/pages/TargetsPage.tsx"],"sourcesContent":["/**\n * Targets Page — Manage all targets (servers, workstations, environments).\n *\n * Targets are the first-class entity. Each target can have agents installed,\n * and supports two access types: Direct and SSH.\n */\n\nimport { useState, useMemo, useCallback, useEffect } from 'react';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { VIBE_PERMISSIONS } from '../constants/permissions';\nimport { isNative, nativeNotify } from '../utils/nativeBridge';\nimport { useLazyQuery } from '@apollo/client/react';\nimport {\n Plus,\n RefreshCw,\n Trash2,\n Server,\n Grid,\n List,\n CheckCircle,\n XCircle,\n Loader2,\n X,\n Check,\n Pencil,\n CheckSquare,\n XSquare,\n} from 'lucide-react';\nimport {\n PageHeader,\n SearchInput,\n FilterDropdown,\n EmptyState,\n LoadingState,\n ConfirmDialog,\n AgentSetupBanner,\n SearchableSelect,\n GetHelpButton,\n} from '@/components/shared';\nimport { TargetCard } from '@/components/targets';\nimport type { TargetCardTarget } from '@/components/targets';\nimport { MotionPage, MotionList, MotionItem } from '@burdenoff/fe-libs/shared/motion';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { AnimatePresence } from 'framer-motion';\nimport { useVibeControls, useVibeNavigate } from '@/providers/VibeControlsProvider';\nimport { useCachedInitialData } from '@/hooks/useCachedInitialData';\nimport { useSearchParams } from 'react-router-dom';\nimport {\n useListTargetsQuery,\n useCreateTargetMutation,\n useUpdateTargetMutation,\n useTestTargetMutation,\n useStartTerminalMutation,\n useDeleteTargetMutation,\n useInstallAgentOnTargetMutation,\n useUninstallAgentFromTargetMutation,\n useGetInstallAgentJobStatusLazyQuery,\n} from '@/generated/wspace-operations';\nimport { getQuotaDialogContent, isQuotaExhaustedError } from '@/utils/quotaUtils';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype TargetStatus = 'connected' | 'disconnected' | 'unknown';\n\ntype TargetKind = 'DIRECT' | 'SSH';\n\ninterface SshTarget {\n id: string;\n type: TargetKind;\n name: string;\n label: string | null;\n host: string | null;\n port: number | null;\n username: string | null;\n status: TargetStatus;\n connectionId: string | null;\n tags: string[];\n metadata: Record<string, unknown> | null;\n createdAt: string;\n agents: Array<{ id: string; name: string; version: string; isActive: boolean }>;\n}\n\ninterface AgentOption {\n id: string;\n name: string;\n isActive: boolean;\n tunnelUrl: string | null;\n agentApiKey: string | null;\n}\n\ninterface InstallJob {\n id: string;\n status: 'pending' | 'running' | 'completed' | 'failed';\n steps: Array<{ name: string; status: string; message?: string }>;\n currentStep: number;\n result?: { agentUrl?: string; backendAgentId?: string };\n error?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction mapStatus(s: string): TargetStatus {\n if (s === 'connected') return 'connected';\n if (s === 'disconnected') return 'disconnected';\n return 'unknown';\n}\n\nconst stepLabels: Record<string, string> = {\n connect: 'Connecting to server',\n detect_os: 'Detecting OS',\n install_bun: 'Installing Bun runtime',\n install_agent: 'Installing VibeControls Agent',\n configure: 'Configuring agent',\n start: 'Starting agent',\n verify: 'Verifying health',\n retrieve: 'Retrieving agent details',\n register: 'Registering with backend',\n};\n\ntype ViewMode = 'grid' | 'list';\n\nconst statusConfig: Record<TargetStatus, { label: string }> = {\n connected: { label: 'Connected' },\n disconnected: { label: 'Disconnected' },\n unknown: { label: 'Unknown' },\n};\n\nconst typeBadgeClass: Record<TargetKind, string> = {\n DIRECT: 'bg-action-primary-bg/10 text-action-primary-bg',\n SSH: 'bg-status-success-bg-subtle text-status-success-text',\n};\n\nconst targetStatusBadgeClass: Record<TargetStatus, string> = {\n connected: 'bg-status-success-bg-subtle text-status-success-text',\n disconnected: 'bg-status-error-bg-subtle text-status-error-text',\n unknown: 'bg-bg-sunken text-text-secondary',\n};\n\nfunction isAgentInstalled(target: SshTarget): boolean {\n return target.agents.length > 0;\n}\n\n// ---------------------------------------------------------------------------\n// Targets Page\n// ---------------------------------------------------------------------------\n\nexport function TargetsPage() {\n const { t } = useI18n();\n const { workspaceId } = useVibeControls();\n const navigate = useVibeNavigate();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const [searchParams] = useSearchParams();\n const selectedTargetId = searchParams.get('selectedTargetId');\n\n // UI state\n const [searchQuery, setSearchQuery] = useState('');\n const [agentFilter, setAgentFilter] = useState<string | null>(null);\n const [typeFilter, setTypeFilter] = useState('all');\n const [statusFilter, setStatusFilter] = useState('all');\n const [viewMode, setViewMode] = useState<ViewMode>('grid');\n const [showAddForm, setShowAddForm] = useState(false);\n const [deleteTargetId, setDeleteTargetId] = useState<string | null>(null);\n const [bulkDeleteOpen, setBulkDeleteOpen] = useState(false);\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n const [testResult, setTestResult] = useState<{\n id: string;\n success: boolean;\n message: string;\n } | null>(null);\n const [showQuotaExhausted, setShowQuotaExhausted] = useState(false);\n\n const tr = useCallback(\n (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n },\n [t]\n );\n\n // Install progress state\n const [installJobTarget, setInstallJobTarget] = useState<SshTarget | null>(null);\n const [installJob, setInstallJob] = useState<InstallJob | null>(null);\n const [installJobId, setInstallJobId] = useState<string | null>(null);\n\n // Edit target modal state\n const [editTarget, setEditTarget] = useState<SshTarget | null>(null);\n const [editLoading, setEditLoading] = useState(false);\n const [editError, setEditError] = useState<string | null>(null);\n const [editName, setEditName] = useState('');\n const [editLabel, setEditLabel] = useState('');\n const [editHost, setEditHost] = useState('');\n const [editPort, setEditPort] = useState(22);\n const [editUsername, setEditUsername] = useState('');\n const [editAuthMethod, setEditAuthMethod] = useState<'password' | 'key'>('key');\n const [editPassword, setEditPassword] = useState('');\n const [editKeyPath, setEditKeyPath] = useState('');\n const [editTags, setEditTags] = useState('');\n\n // Form state\n const [formType, setFormType] = useState<'DIRECT' | 'SSH'>('DIRECT');\n const [formName, setFormName] = useState('');\n const [formDescription, setFormDescription] = useState('');\n const [formAgent, setFormAgent] = useState('');\n const [formHost, setFormHost] = useState('');\n const [formPort, setFormPort] = useState(22);\n const [formUsername, setFormUsername] = useState('');\n const [formAuthMethod, setFormAuthMethod] = useState<'password' | 'key'>('key');\n const [formPassword, setFormPassword] = useState('');\n const [formKeyPath, setFormKeyPath] = useState('');\n const [formLabel, setFormLabel] = useState('');\n const [formTags, setFormTags] = useState('');\n\n // Queries - use cache-and-network for silent background refresh\n const {\n data: targetsData,\n loading,\n refetch: refetchTargets,\n } = useListTargetsQuery({\n variables: { workspaceId: workspaceId || '', limit: 50, offset: 0 },\n skip: !workspaceId,\n fetchPolicy: 'cache-first',\n });\n\n // Use cached initial data for related entities already prefetched on initial load.\n const { agents: cachedAgents, refetch: refetchInitialData } = useCachedInitialData();\n\n // Mutations\n const [createTarget] = useCreateTargetMutation({\n refetchQueries: ['VibeControlsInitialData', 'ListTargets'],\n awaitRefetchQueries: true,\n });\n const [updateTarget] = useUpdateTargetMutation();\n const [testTarget] = useTestTargetMutation();\n const [startTerminal] = useStartTerminalMutation();\n const [deleteTarget] = useDeleteTargetMutation();\n const [installAgentOnTarget] = useInstallAgentOnTargetMutation();\n const [uninstallAgent] = useUninstallAgentFromTargetMutation();\n const [fetchInstallJobStatus] = useGetInstallAgentJobStatusLazyQuery({\n fetchPolicy: 'network-only',\n });\n\n // Derived data\n const targets: SshTarget[] = useMemo(() => {\n const raw = targetsData?.targets?.items ?? [];\n return raw.map((t: (typeof raw)[number]) => ({\n id: t.id,\n type: (t.type || 'DIRECT') as TargetKind,\n name: t.name,\n label: t.label || null,\n host: t.host || null,\n port: t.port || null,\n username: t.username || null,\n status: mapStatus(t.status),\n connectionId: t.connectionId || null,\n tags: t.tags,\n metadata: (t.metadata as Record<string, unknown> | null) ?? null,\n createdAt: t.createdAt,\n agents: (t.agents || []).map((a: (typeof t.agents)[number]) => ({\n id: a.id,\n name: a.name,\n version: a.version,\n isActive: a.isActive,\n })),\n }));\n }, [targetsData]);\n\n const agents: AgentOption[] = useMemo(() => {\n return cachedAgents.map((a) => ({\n id: a.id,\n name: a.name,\n isActive: a.isActive,\n tunnelUrl: a.tunnelUrl ?? null,\n agentApiKey: null,\n }));\n }, [cachedAgents]);\n\n const filtered = useMemo(() => {\n let items = targets;\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n items = items.filter(\n (t: SshTarget) =>\n t.name.toLowerCase().includes(q) ||\n t.host?.toLowerCase().includes(q) ||\n t.label?.toLowerCase().includes(q)\n );\n }\n if (agentFilter) {\n items = items.filter((t: SshTarget) => t.agents.some((a) => a.id === agentFilter));\n }\n if (typeFilter !== 'all') {\n items = items.filter((t: SshTarget) => t.type === typeFilter);\n }\n if (statusFilter !== 'all') {\n items = items.filter((t: SshTarget) => t.status === statusFilter);\n }\n return items;\n }, [targets, searchQuery, agentFilter, typeFilter, statusFilter]);\n\n useEffect(() => {\n if (!selectedTargetId) return;\n\n const target = filtered.find((item) => item.id === selectedTargetId);\n if (!target) return;\n\n const timeout = window.setTimeout(() => {\n document\n .getElementById(`target-row-${selectedTargetId}`)\n ?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }, 150);\n\n return () => window.clearTimeout(timeout);\n }, [filtered, selectedTargetId]);\n\n const connectedCount = targets.filter((t: SshTarget) => t.status === 'connected').length;\n const allFilteredSelected =\n filtered.length > 0 && filtered.every((t: SshTarget) => selectedIds.has(t.id));\n const hasSelection = selectedIds.size > 0;\n\n // Install job polling\n useEffect(() => {\n if (!installJobId || !installJobTarget) return;\n\n let cancelled = false;\n\n const pollJob = () => {\n void fetchInstallJobStatus({\n variables: { targetId: installJobTarget.id, jobId: installJobId },\n })\n .then((result) => {\n if (cancelled) return;\n const data = result.data?.installAgentJobStatus;\n if (!data) return;\n if (!data.steps) data.steps = [];\n setInstallJob({\n id: data.jobId,\n status: data.status,\n currentStep: data.currentStep ?? 0,\n steps: data.steps ?? [],\n result: data.result ?? undefined,\n error: data.error ?? undefined,\n });\n if (data.status === 'completed' || data.status === 'failed') {\n if (data.status === 'completed') {\n void refetchTargets();\n }\n }\n })\n .catch(() => {\n // Polling error — will retry on next interval\n });\n };\n\n pollJob();\n const interval = setInterval(pollJob, 2000);\n\n return () => {\n cancelled = true;\n clearInterval(interval);\n };\n }, [installJobId, installJobTarget, fetchInstallJobStatus, refetchTargets]);\n\n // Handlers\n const handleCreate = useCallback(async () => {\n if (!formName || !workspaceId) return;\n if (formType !== 'DIRECT' && (!formAgent || !formHost || !formUsername)) return;\n try {\n await createTarget({\n variables: {\n workspaceId,\n input: {\n type: formType as string,\n name: formName,\n sourceAgentId: formType !== 'DIRECT' ? formAgent : undefined,\n host: formType !== 'DIRECT' ? formHost : undefined,\n port: formType !== 'DIRECT' ? formPort : undefined,\n username: formType !== 'DIRECT' ? formUsername : undefined,\n password:\n formType === 'SSH' && formAuthMethod === 'password' ? formPassword : undefined,\n privateKeyPath:\n formType === 'SSH' && formAuthMethod === 'key' ? formKeyPath : undefined,\n label: formLabel || undefined,\n tags: formTags ? formTags.split(',').map((t: string) => t.trim()) : undefined,\n metadata: formDescription ? { description: formDescription } : undefined,\n },\n },\n });\n setShowAddForm(false);\n setFormName('');\n setFormHost('');\n setFormUsername('');\n setFormPassword('');\n setFormKeyPath('');\n setFormLabel('');\n setFormTags('');\n void refetchTargets();\n // Refresh shared initial-data cache so AgentsPage (and other pages\n // reading targets via useCachedInitialData) see the new row without\n // a full page reload.\n refetchInitialData();\n } catch (err) {\n if (isQuotaExhaustedError(err)) {\n setShowAddForm(false);\n setShowQuotaExhausted(true);\n return;\n }\n\n throw err;\n }\n }, [\n formName,\n formAgent,\n formHost,\n formPort,\n formUsername,\n formAuthMethod,\n formPassword,\n formKeyPath,\n formLabel,\n formTags,\n formDescription,\n formType,\n workspaceId,\n createTarget,\n refetchTargets,\n ]);\n\n const handleTest = useCallback(\n async (id: string) => {\n const result = await testTarget({ variables: { id } });\n const data = result.data?.testTarget;\n if (data) {\n setTestResult({ id, success: data.success, message: data.message || '' });\n setTimeout(() => setTestResult(null), 5000);\n void refetchTargets();\n }\n },\n [testTarget, refetchTargets]\n );\n\n const handleStartTerminal = useCallback(\n async (id: string) => {\n try {\n const result = await startTerminal({ variables: { targetId: id } });\n if (result.error && isQuotaExhaustedError(result.error)) {\n setShowQuotaExhausted(true);\n return;\n }\n\n const data = result.data?.startTerminal;\n if (data?.sessionId) {\n navigate(`/sessions/${data.sessionId}`);\n }\n } catch (err) {\n if (isQuotaExhaustedError(err)) {\n setShowQuotaExhausted(true);\n return;\n }\n\n throw err;\n }\n },\n [startTerminal, navigate]\n );\n\n const handleDeleteSingle = useCallback(async () => {\n if (!deleteTargetId) return;\n try {\n await deleteTarget({ variables: { id: deleteTargetId } });\n if (isNative()) void nativeNotify('success');\n } catch (err) {\n if (isNative()) void nativeNotify('error');\n throw err;\n }\n setDeleteTargetId(null);\n setSelectedIds((prev) => {\n const next = new Set(prev);\n next.delete(deleteTargetId);\n return next;\n });\n void refetchTargets();\n }, [deleteTargetId, deleteTarget, refetchTargets]);\n\n const handleBulkDelete = useCallback(async () => {\n const ids = Array.from(selectedIds);\n await Promise.all(ids.map((id: string) => deleteTarget({ variables: { id } })));\n setSelectedIds(new Set());\n setBulkDeleteOpen(false);\n void refetchTargets();\n }, [selectedIds, deleteTarget, refetchTargets]);\n\n const handleInstallAgent = useCallback(\n async (target: SshTarget) => {\n setInstallJobTarget(target);\n setInstallJob(null);\n setInstallJobId(null);\n\n const sourceAgent = agents.find((a: AgentOption) => a.isActive);\n if (!sourceAgent) return;\n\n const result = await installAgentOnTarget({\n variables: { targetId: target.id, sourceAgentId: sourceAgent.id },\n });\n const data = result.data?.installAgentOnTarget;\n if (data?.jobId) {\n setInstallJobId(data.jobId);\n }\n },\n [installAgentOnTarget, agents]\n );\n\n const handleUninstallAgent = useCallback(\n async (target: SshTarget) => {\n await uninstallAgent({ variables: { targetId: target.id } });\n void refetchTargets();\n },\n [uninstallAgent, refetchTargets]\n );\n\n const handleOpenEdit = useCallback((target: SshTarget) => {\n setEditTarget(target);\n setEditName(target.name);\n setEditLabel(target.label ?? '');\n setEditHost(target.host ?? '');\n setEditPort(target.port ?? 22);\n setEditUsername(target.username ?? '');\n setEditAuthMethod('key');\n setEditPassword('');\n setEditKeyPath('');\n setEditTags(target.tags.join(', '));\n setEditError(null);\n }, []);\n\n const handleSaveEdit = useCallback(async () => {\n if (!editTarget) return;\n if (!editName.trim()) {\n setEditError('Name is required');\n return;\n }\n setEditLoading(true);\n setEditError(null);\n try {\n await updateTarget({\n variables: {\n id: editTarget.id,\n input: {\n name: editName.trim(),\n label: editLabel.trim() || null,\n host: editHost.trim() || undefined,\n port: editPort || undefined,\n username: editUsername.trim() || undefined,\n password:\n editTarget.type === 'SSH' && editAuthMethod === 'password' && editPassword\n ? editPassword\n : undefined,\n privateKeyPath:\n editTarget.type === 'SSH' && editAuthMethod === 'key' && editKeyPath\n ? editKeyPath\n : undefined,\n tags: editTags\n ? editTags\n .split(',')\n .map((t: string) => t.trim())\n .filter(Boolean)\n : [],\n },\n },\n });\n setEditTarget(null);\n void refetchTargets();\n } catch (err) {\n setEditError(err instanceof Error ? err.message : 'Failed to update target');\n } finally {\n setEditLoading(false);\n }\n }, [\n editTarget,\n editName,\n editLabel,\n editHost,\n editPort,\n editUsername,\n editAuthMethod,\n editPassword,\n editKeyPath,\n editTags,\n updateTarget,\n refetchTargets,\n ]);\n\n const closeInstallDialog = useCallback(() => {\n setInstallJobTarget(null);\n setInstallJob(null);\n setInstallJobId(null);\n }, []);\n\n const toggleSelectAll = useCallback(() => {\n if (allFilteredSelected) {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n filtered.forEach((t: SshTarget) => next.delete(t.id));\n return next;\n });\n } else {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n filtered.forEach((t: SshTarget) => next.add(t.id));\n return next;\n });\n }\n }, [allFilteredSelected, filtered]);\n\n const toggleSelect = useCallback((id: string) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n // Stats\n const stats = {\n total: targets.length,\n connected: connectedCount,\n };\n\n const localizedTypeOptions = useMemo(\n () => [\n { value: 'all', label: tr('targets.filterTypeAll', 'All Types') },\n { value: 'DIRECT', label: tr('targets.typeDirect', 'Direct') },\n { value: 'SSH', label: 'SSH' },\n ],\n [tr]\n );\n\n const localizedStatusOptions = useMemo(\n () => [\n { value: 'all', label: tr('targets.filterStatusAll', 'All Statuses') },\n { value: 'connected', label: tr('targets.connected', 'Connected') },\n { value: 'disconnected', label: tr('targets.disconnected', 'Disconnected') },\n { value: 'unknown', label: tr('targets.unknown', 'Unknown') },\n ],\n [tr]\n );\n\n const isFiltered = searchQuery || agentFilter || typeFilter !== 'all' || statusFilter !== 'all';\n\n if (permissionsLoading)\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <p className=\"text-text-secondary\">Loading permissions...</p>\n </div>\n );\n if (!hasPermission(VIBE_PERMISSIONS.TARGET_LIST))\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-center space-y-2\">\n <h2 className=\"text-lg font-semibold text-foreground\">Access Denied</h2>\n <p className=\"text-sm text-text-secondary\">\n You don't have permission to access this page.\n </p>\n </div>\n </div>\n );\n\n // Loading state (only show on first load, not on background refetch)\n if (loading && targets.length === 0) {\n return (\n <MotionPage className=\"space-y-6 p-4 sm:p-6 bg-bg-surface min-h-screen\">\n <PageHeader\n title={tr('nav.targets', 'Targets')}\n description={tr(\n 'targets.description',\n 'Manage your servers, workstations, and environments.'\n )}\n />\n <LoadingState message={tr('targets.loading', 'Loading targets...')} />\n </MotionPage>\n );\n }\n\n return (\n <MotionPage className=\"space-y-6 p-4 sm:p-6 bg-bg-surface min-h-screen\">\n {/* Test result toast */}\n {testResult && (\n <div\n className={`fixed top-4 right-4 z-[10000] rounded-md px-4 py-3 shadow-lg text-sm ${\n testResult.success\n ? 'bg-status-success-bg text-status-success-text'\n : 'bg-status-error-bg text-status-error-text'\n }`}\n >\n {testResult.success\n ? tr('targets.connectionSuccessful', 'Connection successful')\n : tr('targets.connectionFailed', 'Connection failed')}\n : {testResult.message}\n </div>\n )}\n\n <PageHeader\n title={tr('nav.targets', 'Targets')}\n description={`${stats.connected} of ${stats.total} targets online`}\n actions={\n <div className=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2\">\n <button\n onClick={() => void refetchTargets()}\n disabled={loading}\n className=\"flex items-center justify-center gap-2 px-3 py-2 text-text-secondary hover:bg-bg-sunken rounded-md transition-colors disabled:opacity-50\"\n title={tr('targets.refreshTitle', 'Refresh targets')}\n >\n <RefreshCw className={`w-4 h-4 ${loading ? 'animate-spin' : ''}`} />\n </button>\n <button\n onClick={() => setShowAddForm(true)}\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('targets.addTarget', 'Add Target')}\n </button>\n </div>\n }\n />\n\n {/* Agent setup banner */}\n {agents.length === 0 && !loading && (\n <AgentSetupBanner variant=\"full\" dismissKey=\"vibecontrols-targets-setup-banner\" />\n )}\n\n {/* Filters Bar */}\n <div className=\"space-y-3\">\n {/* Row 1: Search + View Toggle */}\n <div className=\"flex items-center gap-2\">\n <SearchInput\n value={searchQuery}\n onChange={setSearchQuery}\n placeholder={tr('targets.searchPlaceholder', 'Search targets...')}\n className=\"flex-1 sm:w-64 sm:flex-none\"\n />\n {/* View Toggle */}\n <div className=\"flex items-center gap-1 bg-bg-sunken rounded-md p-1 flex-shrink-0\">\n <button\n onClick={() => setViewMode('grid')}\n className={`p-1.5 sm:p-2 rounded ${viewMode === 'grid' ? 'bg-bg-surface shadow-sm' : 'hover:bg-bg-surface/50'}`}\n title={tr('targets.gridViewTitle', 'Grid view')}\n >\n <Grid className=\"w-4 h-4 text-text-secondary\" />\n </button>\n <button\n onClick={() => setViewMode('list')}\n className={`p-1.5 sm:p-2 rounded ${viewMode === 'list' ? 'bg-bg-surface shadow-sm' : 'hover:bg-bg-surface/50'}`}\n title={tr('targets.listViewTitle', 'List view')}\n >\n <List className=\"w-4 h-4 text-text-secondary\" />\n </button>\n </div>\n </div>\n\n {/* Row 2: Filters */}\n <div className=\"flex items-center gap-2 sm:gap-3 flex-wrap\">\n <FilterDropdown\n label={tr('sessions.filterType', 'Type')}\n value={typeFilter}\n options={localizedTypeOptions}\n onChange={setTypeFilter}\n />\n <FilterDropdown\n label={tr('sessions.filterStatus', 'Status')}\n value={statusFilter}\n options={localizedStatusOptions}\n onChange={setStatusFilter}\n />\n <SearchableSelect\n value={agentFilter ?? ''}\n onChange={(v: string) => setAgentFilter(v || null)}\n options={agents.map((a: AgentOption) => ({ value: a.id, label: a.name }))}\n placeholder={tr('targets.allAgents', 'All agents')}\n className=\"w-full sm:min-w-[180px] sm:w-auto\"\n dropdownAlign=\"left\"\n clearable\n />\n </div>\n </div>\n\n {/* Select All & Bulk Actions */}\n {filtered.length > 0 && (\n <div className=\"flex items-center gap-2 flex-wrap\">\n <div className=\"ml-auto flex items-center gap-2\">\n <button\n onClick={toggleSelectAll}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary transition-colors\"\n >\n <CheckSquare className=\"w-3.5 h-3.5\" />\n {allFilteredSelected\n ? tr('targets.deselectAll', 'Deselect All')\n : tr('targets.selectAll', 'Select All')}\n </button>\n </div>\n </div>\n )}\n\n {/* Bulk Action Bar */}\n {hasSelection && (\n <div className=\"flex flex-col sm:flex-row items-start sm:items-center gap-3 px-4 py-2 bg-action-primary-bg/10 border border-action-primary-bg/20 rounded-lg\">\n <span className=\"text-sm font-medium text-text-primary\">\n {selectedIds.size} {tr('nav.targets', 'target')}\n {selectedIds.size !== 1 ? 's' : ''} {tr('sessions.selected', 'selected')}\n </span>\n <div className=\"flex items-center gap-1.5 sm:ml-auto\">\n <button\n onClick={() => setBulkDeleteOpen(true)}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-status-error-text bg-status-error-bg border border-status-error-text/20 rounded-md hover:bg-status-error-bg/80 transition-colors\"\n >\n <Trash2 className=\"w-3 h-3\" /> {tr('common.delete', 'Delete')}\n </button>\n <button\n onClick={() => setSelectedIds(new Set())}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary transition-colors\"\n >\n <XSquare className=\"w-3 h-3\" /> {tr('sessions.deselect', 'Deselect')}\n </button>\n </div>\n </div>\n )}\n\n {/* Results Count */}\n {isFiltered ? (\n <p className=\"text-sm text-text-secondary\">\n {tr('targets.showingResults', 'Showing {{filtered}} of {{total}} targets')\n .replace('{{filtered}}', String(filtered.length))\n .replace('{{total}}', String(targets.length))}\n {loading && (\n <span className=\"ml-2 text-text-muted\">\n ({tr('sessions.refreshing', 'refreshing...')})\n </span>\n )}\n </p>\n ) : null}\n\n {/* Targets Display */}\n {filtered.length > 0 ? (\n <AnimatePresence mode=\"wait\">\n {viewMode === 'grid' ? (\n <MotionList\n key=\"grid-view\"\n stagger={0.04}\n className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\"\n >\n {filtered.map((target: SshTarget) => (\n <MotionItem key={target.id}>\n <TargetCard\n target={target as TargetCardTarget}\n onTest={(id) => void handleTest(id)}\n onTerminal={(id) => void handleStartTerminal(id)}\n onOpenDetail={(id) => navigate(`/targets/${id}`)}\n onEdit={(t) => handleOpenEdit(t as SshTarget)}\n onInstallAgent={(t) => void handleInstallAgent(t as SshTarget)}\n onUninstallAgent={(t) => void handleUninstallAgent(t as SshTarget)}\n onDelete={(id) => setDeleteTargetId(id)}\n selected={selectedIds.has(target.id)}\n onToggleSelect={() => toggleSelect(target.id)}\n highlighted={selectedTargetId === target.id}\n />\n </MotionItem>\n ))}\n </MotionList>\n ) : (\n <MotionList key=\"list-view\" stagger={0.04} className=\"space-y-2\">\n {filtered.map((target: SshTarget) => {\n const installed = isAgentInstalled(target);\n const isSelectedTarget = selectedTargetId === target.id;\n return (\n <MotionItem key={target.id} variant=\"fadeRight\">\n <div\n id={`target-row-${target.id}`}\n className={`p-4 rounded-lg border transition-colors ${\n isSelectedTarget\n ? 'border-action-primary-bg bg-action-primary-bg/5 shadow-sm'\n : 'border-border-default hover:bg-bg-sunken/30'\n }`}\n >\n {/* Row 1: Info */}\n <div className=\"flex items-start gap-3\">\n <input\n type=\"checkbox\"\n checked={selectedIds.has(target.id)}\n onChange={() => toggleSelect(target.id)}\n className=\"rounded border-border-default mt-1\"\n />\n <div className=\"flex min-w-0 flex-1 flex-wrap items-start gap-2\">\n <span\n className={`inline-flex items-center px-2 py-0.5 text-xs font-semibold rounded ${typeBadgeClass[target.type]}`}\n >\n {target.type}\n </span>\n <span\n className={`inline-flex items-center px-2 py-0.5 text-xs font-semibold rounded ${targetStatusBadgeClass[target.status]}`}\n >\n {tr(\n `targets.status.${target.status}`,\n statusConfig[target.status].label\n )}\n </span>\n <div className=\"min-w-0 basis-full\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-medium\">{target.name}</span>\n {target.label && (\n <span className=\"text-text-secondary text-sm\">{target.label}</span>\n )}\n {installed && (\n <span className=\"inline-flex items-center gap-1 rounded-full border border-status-success-border px-2 py-0.5 text-xs bg-status-success-bg-subtle text-status-success-text\">\n <CheckCircle size={10} />\n {tr('targets.agentInstalled', 'Agent Installed')}\n </span>\n )}\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-2 text-sm text-text-secondary sm:gap-3\">\n {target.host && (\n <code className=\"text-xs\">\n {target.username ? `${target.username}@` : ''}\n {target.host}\n {target.port ? `:${target.port}` : ''}\n </code>\n )}\n {target.agents.length > 0 && (\n <span className=\"text-text-tertiary\">\n {tr('targets.via', 'via')} {target.agents[0].name}\n </span>\n )}\n </div>\n {target.tags.length > 0 && (\n <div className=\"mt-1.5 flex flex-wrap gap-1\">\n {target.tags.map((tag: string) => (\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 </div>\n </div>\n </div>\n {/* Row 2: Actions */}\n <div className=\"mt-3 flex flex-wrap items-center gap-2 pl-0 sm:pl-7\">\n <button\n onClick={() => void handleTest(target.id)}\n title={tr('targets.testConnectivity', 'Test connectivity')}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-md border border-border-default bg-bg-surface hover:bg-bg-sunken transition-colors\"\n >\n {tr('targets.test', 'Test')}\n </button>\n <button\n onClick={() => void handleStartTerminal(target.id)}\n title={tr('targets.openTerminal', 'Open terminal')}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-md border border-border-default bg-bg-surface hover:bg-bg-sunken transition-colors\"\n >\n {tr('targets.terminal', 'Terminal')}\n </button>\n <button\n onClick={() => handleOpenEdit(target)}\n title=\"Edit target configuration\"\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-md border border-border-default bg-bg-surface hover:bg-bg-sunken transition-colors\"\n >\n <Pencil size={14} />\n Edit\n </button>\n {target.type !== 'DIRECT' && !installed && (\n <button\n onClick={() => void handleInstallAgent(target)}\n title={tr('targets.installAgent', 'Install agent')}\n className=\"flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg-hover transition-colors\"\n >\n {tr('targets.installAgent', 'Install Agent')}\n </button>\n )}\n {target.type !== 'DIRECT' && installed && (\n <button\n onClick={() => void handleUninstallAgent(target)}\n title={tr('targets.uninstallAgent', 'Uninstall agent')}\n className=\"flex items-center gap-1.5 rounded-md border border-status-error-text/20 px-3 py-1.5 text-xs font-medium text-status-error-text hover:bg-status-error-bg/80 transition-colors\"\n >\n {tr('targets.uninstall', 'Uninstall')}\n </button>\n )}\n <div className=\"hidden flex-1 sm:block\" />\n <button\n onClick={() => setDeleteTargetId(target.id)}\n title={tr('targets.deleteTarget', 'Delete target')}\n className=\"flex items-center gap-1.5 rounded-md border border-status-error-border px-3 py-1.5 text-xs font-medium text-status-error-text hover:bg-status-error-bg/80 transition-colors\"\n >\n <X size={14} />\n {tr('common.delete', 'Delete')}\n </button>\n </div>\n </div>\n </MotionItem>\n );\n })}\n </MotionList>\n )}\n </AnimatePresence>\n ) : (\n <EmptyState\n icon={<Server className=\"w-8 h-8 text-text-secondary\" />}\n title={\n isFiltered\n ? tr('targets.emptyNoTargetsFound', 'No targets found')\n : tr('targets.emptyNoTargetsConfigured', 'No targets configured')\n }\n description={\n isFiltered\n ? tr('targets.emptyAdjustSearch', 'Try adjusting your search or filters')\n : tr(\n 'targets.emptyDescription',\n 'Add a target to start managing servers, workstations, and environments.'\n )\n }\n action={\n !isFiltered ? (\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setShowAddForm(true)}\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('targets.addTarget', 'Add Target')}\n </button>\n <GetHelpButton prompt=\"What is a Target in VibeControls and how do I create one?\" />\n </div>\n ) : undefined\n }\n />\n )}\n\n {/* Active sessions live on the dedicated /vibecontrols/sessions page —\n intentionally not surfaced here so the Targets tab stays focused on\n target lifecycle (add/edit/delete + drill into a target's agents). */}\n\n {/* Add Target modal */}\n {showAddForm && (\n <div className=\"fixed inset-0 z-50 flex items-start justify-center pt-16 overflow-y-auto\">\n <div\n className=\"fixed inset-0 bg-bg-overlay backdrop-blur-sm\"\n onClick={() => setShowAddForm(false)}\n />\n <div\n className=\"relative bg-bg-elevated rounded-xl shadow-2xl border border-border-default max-w-lg w-full mx-4 p-6 space-y-4 mb-8\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <h2 className=\"text-lg font-semibold\">{tr('targets.addTarget', 'Add Target')}</h2>\n <button\n onClick={() => setShowAddForm(false)}\n className=\"p-1 rounded-lg hover:bg-bg-sunken transition-colors\"\n >\n <X size={18} />\n </button>\n </div>\n\n <div className=\"space-y-4\">\n {/* Target Type */}\n <div>\n <label className=\"text-sm font-medium block mb-1.5\">\n {tr('targets.targetType', 'Target Type')}\n </label>\n <div className=\"grid grid-cols-2 gap-2\">\n {(['DIRECT', 'SSH'] as const).map((t) => (\n <button\n key={t}\n onClick={() => setFormType(t)}\n className={`px-3 py-2 text-sm font-medium rounded-lg border transition-colors ${\n formType === t\n ? 'border-action-primary-bg bg-action-primary-bg/10 text-action-primary-bg'\n : 'border-border-default hover:bg-bg-sunken text-text-secondary'\n }`}\n >\n {t}\n </button>\n ))}\n </div>\n <p className=\"text-xs text-text-tertiary mt-1\">\n {formType === 'DIRECT'\n ? tr(\n 'targets.targetTypeDirectHint',\n 'A local machine where you will install the agent manually.'\n )\n : tr('targets.targetTypeSshHint', 'A remote server accessible via SSH.')}\n </p>\n </div>\n\n {/* Name */}\n <div>\n <label className=\"text-sm font-medium\">{tr('webhooks.name', 'Name')}</label>\n <input\n value={formName}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setFormName(e.target.value)}\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder={\n formType === 'DIRECT'\n ? tr('targets.namePlaceholderDirect', 'My Laptop')\n : tr('targets.namePlaceholderServer', 'Production Server')\n }\n />\n </div>\n\n {/* Description (all types) */}\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.descriptionOptional', 'Description (optional)')}\n </label>\n <input\n value={formDescription}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setFormDescription(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder={tr(\n 'targets.descriptionPlaceholder',\n 'Brief description of this target'\n )}\n />\n </div>\n\n {/* Connection fields — only for SSH */}\n {formType !== 'DIRECT' && (\n <>\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.sourceAgent', 'Source Agent')}\n </label>\n <select\n value={formAgent}\n onChange={(e: React.ChangeEvent<HTMLSelectElement>) =>\n setFormAgent(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n >\n <option value=\"\">\n {tr('targets.selectAgentConnectFrom', 'Select an agent to connect from')}\n </option>\n {agents.map((a: AgentOption) => (\n <option key={a.id} value={a.id}>\n {a.name}\n </option>\n ))}\n </select>\n <p className=\"text-xs text-text-tertiary mt-0.5\">\n {tr('targets.agentConnectionHintPrefix', 'The agent that will establish the')}{' '}\n {formType}{' '}\n {tr('targets.agentConnectionHintSuffix', 'connection to this target.')}\n </p>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3\">\n <div>\n <label className=\"text-sm font-medium\">{tr('targets.host', 'Host')}</label>\n <input\n value={formHost}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setFormHost(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder={tr('targets.hostPlaceholder', '192.168.1.100')}\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">{tr('tunnels.port', 'Port')}</label>\n <input\n type=\"number\"\n value={formPort}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setFormPort(Number(e.target.value))\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n />\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.username', 'Username')}\n </label>\n <input\n value={formUsername}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setFormUsername(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder={tr('targets.usernamePlaceholder', 'root')}\n />\n </div>\n {formType === 'SSH' && (\n <>\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.authentication', 'Authentication')}\n </label>\n <div className=\"flex gap-4 mt-1\">\n <label className=\"flex items-center gap-2 cursor-pointer text-sm\">\n <input\n type=\"radio\"\n checked={formAuthMethod === 'password'}\n onChange={() => setFormAuthMethod('password')}\n />\n {tr('targets.password', 'Password')}\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer text-sm\">\n <input\n type=\"radio\"\n checked={formAuthMethod === 'key'}\n onChange={() => setFormAuthMethod('key')}\n />\n {tr('targets.privateKey', 'Private Key')}\n </label>\n </div>\n </div>\n {formAuthMethod === 'password' ? (\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.password', 'Password')}\n </label>\n <input\n type=\"password\"\n value={formPassword}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setFormPassword(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n />\n </div>\n ) : (\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.privateKeyPath', 'Private Key Path')}\n </label>\n <input\n value={formKeyPath}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setFormKeyPath(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder={tr('targets.privateKeyPathPlaceholder', '~/.ssh/id_rsa')}\n />\n </div>\n )}\n </>\n )}\n </>\n )}\n\n {/* Label + Tags (all types) */}\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.labelOptional', 'Label (optional)')}\n </label>\n <input\n value={formLabel}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setFormLabel(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder={tr('targets.labelPlaceholder', 'web-server-01')}\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">\n {tr('targets.tagsCommaSeparated', 'Tags (comma-separated)')}\n </label>\n <input\n value={formTags}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setFormTags(e.target.value)}\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder={tr('targets.tagsPlaceholder', 'production, web')}\n />\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 pt-2 border-t border-border-default\">\n <button\n onClick={() => setShowAddForm(false)}\n className=\"px-4 py-2 text-sm rounded-md border border-border-default hover:bg-bg-sunken transition-colors\"\n >\n {tr('common.cancel', 'Cancel')}\n </button>\n <button\n onClick={() => void handleCreate()}\n className=\"px-4 py-2 text-sm rounded-md bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg-hover transition-colors\"\n >\n {tr('targets.addTarget', 'Add Target')}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Edit Target modal */}\n {editTarget && (\n <div className=\"fixed inset-0 z-50 flex items-start justify-center pt-16 overflow-y-auto\">\n <div\n className=\"fixed inset-0 bg-bg-overlay backdrop-blur-sm\"\n onClick={() => !editLoading && setEditTarget(null)}\n />\n <div\n className=\"relative bg-bg-elevated rounded-xl shadow-2xl border border-border-default max-w-lg w-full mx-4 p-6 space-y-4 mb-8\"\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div>\n <h2 className=\"text-lg font-semibold\">Edit Target</h2>\n <p className=\"text-sm text-text-secondary mt-0.5\">{editTarget.name}</p>\n </div>\n <button\n onClick={() => setEditTarget(null)}\n disabled={editLoading}\n className=\"p-1 rounded-lg hover:bg-bg-sunken transition-colors disabled:opacity-50\"\n >\n <X size={18} />\n </button>\n </div>\n\n {editError && (\n <div className=\"rounded-lg border border-status-error-border bg-status-error-bg-subtle p-3 text-sm text-status-error-text\">\n {editError}\n </div>\n )}\n\n <div className=\"space-y-4\">\n {/* Name */}\n <div>\n <label className=\"text-sm font-medium\">Name</label>\n <input\n value={editName}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setEditName(e.target.value)}\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder=\"Production Server\"\n />\n </div>\n\n {/* Label */}\n <div>\n <label className=\"text-sm font-medium\">Label (optional)</label>\n <input\n value={editLabel}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditLabel(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder=\"web-server-01\"\n />\n </div>\n\n {/* Connection fields — only for non-DIRECT targets */}\n {editTarget.type !== 'DIRECT' && (\n <>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"text-sm font-medium\">Host</label>\n <input\n value={editHost}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditHost(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder=\"192.168.1.100\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Port</label>\n <input\n type=\"number\"\n value={editPort}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditPort(Number(e.target.value))\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n />\n </div>\n </div>\n\n <div>\n <label className=\"text-sm font-medium\">Username</label>\n <input\n value={editUsername}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditUsername(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder=\"root\"\n />\n </div>\n\n {editTarget.type === 'SSH' && (\n <>\n <div>\n <label className=\"text-sm font-medium\">Update credentials (optional)</label>\n <div className=\"flex gap-4 mt-1\">\n <label className=\"flex items-center gap-2 cursor-pointer text-sm\">\n <input\n type=\"radio\"\n checked={editAuthMethod === 'password'}\n onChange={() => setEditAuthMethod('password')}\n />\n Password\n </label>\n <label className=\"flex items-center gap-2 cursor-pointer text-sm\">\n <input\n type=\"radio\"\n checked={editAuthMethod === 'key'}\n onChange={() => setEditAuthMethod('key')}\n />\n Private Key\n </label>\n </div>\n <p className=\"text-xs text-text-tertiary mt-0.5\">\n Leave blank to keep existing credentials.\n </p>\n </div>\n {editAuthMethod === 'password' ? (\n <div>\n <label className=\"text-sm font-medium\">New Password</label>\n <input\n type=\"password\"\n value={editPassword}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditPassword(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder=\"Leave blank to keep current\"\n />\n </div>\n ) : (\n <div>\n <label className=\"text-sm font-medium\">New Private Key Path</label>\n <input\n value={editKeyPath}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n setEditKeyPath(e.target.value)\n }\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder=\"Leave blank to keep current (~/.ssh/id_rsa)\"\n />\n </div>\n )}\n </>\n )}\n </>\n )}\n\n {/* Tags */}\n <div>\n <label className=\"text-sm font-medium\">Tags (comma-separated)</label>\n <input\n value={editTags}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setEditTags(e.target.value)}\n className=\"w-full mt-1 px-3 py-2 rounded-lg border border-border-default bg-bg-elevated text-sm\"\n placeholder=\"production, web\"\n />\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2 pt-2 border-t border-border-default\">\n <button\n onClick={() => setEditTarget(null)}\n disabled={editLoading}\n className=\"px-4 py-2 text-sm rounded-lg border border-border-default hover:bg-bg-sunken transition-colors disabled:opacity-50\"\n >\n Cancel\n </button>\n <button\n onClick={() => void handleSaveEdit()}\n disabled={editLoading}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm text-action-primary-text transition-colors hover:bg-action-primary-bg-hover disabled:opacity-50\"\n >\n {editLoading ? 'Saving...' : 'Save Changes'}\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Single delete confirmation */}\n <ConfirmDialog\n isOpen={!!deleteTargetId}\n onClose={() => setDeleteTargetId(null)}\n onConfirm={() => void handleDeleteSingle()}\n title={tr('targets.deleteTarget', 'Delete Target')}\n message={tr(\n 'targets.deleteTargetMessage',\n 'This will remove the target and its connection from the agent. Active terminals will be disconnected.'\n )}\n confirmLabel={tr('common.delete', 'Delete')}\n variant=\"danger\"\n />\n\n {/* Bulk delete confirmation */}\n <ConfirmDialog\n isOpen={bulkDeleteOpen}\n onClose={() => setBulkDeleteOpen(false)}\n onConfirm={() => void handleBulkDelete()}\n title={tr('targets.deleteSelectedTargets', 'Delete Selected Targets')}\n message={`${tr('targets.confirmDeleteSelectedPrefix', 'Are you sure you want to delete')} ${selectedIds.size} ${tr('nav.targets', 'target')}${selectedIds.size === 1 ? '' : 's'}? ${tr('targets.confirmDeleteSelectedSuffix', 'This action cannot be undone.')}`}\n confirmLabel={tr('targets.deleteAll', 'Delete All')}\n variant=\"danger\"\n />\n\n {/* Install progress dialog */}\n {installJobTarget && (\n <div className=\"fixed inset-0 bg-bg-overlay flex items-center justify-center z-50\">\n <div className=\"bg-bg-elevated rounded-xl shadow-xl max-w-md w-full mx-4 p-6\">\n <div className=\"flex items-start justify-between gap-3\">\n <h2 className=\"text-lg font-semibold break-words\">\n {tr('targets.installingAgentOn', 'Installing Agent on')} {installJobTarget.name}\n </h2>\n {installJob?.status !== 'running' && (\n <button onClick={closeInstallDialog} className=\"p-1 rounded hover:bg-bg-sunken\">\n <X size={16} />\n </button>\n )}\n </div>\n\n <div className=\"space-y-2 mt-4\">\n {installJob && installJob.steps ? (\n installJob.steps.map((step: InstallJob['steps'][number], idx: number) => (\n <div key={idx} className=\"flex items-center gap-3\">\n {step.status === 'running' && (\n <Loader2 className=\"animate-spin text-action-primary-bg\" size={16} />\n )}\n {step.status === 'completed' && (\n <CheckCircle className=\"text-status-success-text\" size={16} />\n )}\n {step.status === 'failed' && (\n <XCircle className=\"text-status-error-text\" size={16} />\n )}\n {step.status === 'skipped' && (\n <Check className=\"text-text-tertiary\" size={16} />\n )}\n {step.status === 'pending' && (\n <div className=\"w-4 h-4 rounded-full border-2 border-border-default\" />\n )}\n <div>\n <div className=\"text-sm font-medium\">\n {tr(`targets.installStep.${step.name}`, stepLabels[step.name] ?? step.name)}\n </div>\n {step.message && (\n <div className=\"text-xs text-text-tertiary\">{step.message}</div>\n )}\n </div>\n </div>\n ))\n ) : (\n <div className=\"flex items-center gap-3\">\n <Loader2 className=\"animate-spin text-action-primary-bg\" size={16} />\n <span className=\"text-sm\">\n {tr('targets.startingInstallJob', 'Starting install job...')}\n </span>\n </div>\n )}\n </div>\n\n {installJob?.status === 'completed' && (\n <div className=\"mt-4 rounded-lg border border-status-success-border bg-status-success-bg-subtle p-3 text-sm text-status-success-text\">\n {tr('targets.agentInstalledSuccess', 'Agent installed successfully!')}\n </div>\n )}\n {installJob?.status === 'failed' && (\n <div className=\"mt-4 rounded-lg border border-status-error-border bg-status-error-bg-subtle p-3 text-sm text-status-error-text\">\n {installJob.error ?? tr('targets.installationFailed', 'Installation failed.')}\n </div>\n )}\n\n <button\n onClick={closeInstallDialog}\n disabled={installJob?.status === 'running'}\n className=\"mt-4 w-full px-4 py-2 rounded-md border border-border-default hover:bg-bg-sunken transition-colors disabled:opacity-50 disabled:cursor-not-allowed text-sm font-medium\"\n >\n {!installJob || installJob.status === 'running'\n ? tr('targets.installing', 'Installing...')\n : tr('common.close', 'Close')}\n </button>\n </div>\n </div>\n )}\n\n <ConfirmDialog\n isOpen={showQuotaExhausted}\n onClose={() => setShowQuotaExhausted(false)}\n onConfirm={() => {\n setShowQuotaExhausted(false);\n navigate('/billing');\n }}\n title={getQuotaDialogContent('environment').title}\n message={getQuotaDialogContent('environment').message}\n confirmLabel=\"View Billing\"\n cancelLabel=\"Dismiss\"\n variant=\"warning\"\n />\n </MotionPage>\n );\n}\n"],"mappings":"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"}
|