@burdenoff/microfe-vibecontrols 2026.511.1 → 2026.512.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +2 -5
- package/dist/components/agent-manager/AgentManagerAdminBar.js +69 -61
- package/dist/components/agent-manager/AgentManagerAdminBar.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerCenter.js +56 -50
- package/dist/components/agent-manager/AgentManagerCenter.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerChatPane.js +87 -74
- package/dist/components/agent-manager/AgentManagerChatPane.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerDetailPanel.js +5 -5
- package/dist/components/agent-manager/AgentManagerDetailPanel.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerInputArea.js +159 -157
- package/dist/components/agent-manager/AgentManagerInputArea.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerMessageItem.js +32 -28
- package/dist/components/agent-manager/AgentManagerMessageItem.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerSessionItem.js +24 -24
- package/dist/components/agent-manager/AgentManagerSessionItem.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerSessionList.js +32 -24
- package/dist/components/agent-manager/AgentManagerSessionList.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerSidebar.js +3 -3
- package/dist/components/agent-manager/AgentManagerSidebar.js.map +1 -1
- package/dist/components/agent-manager/AgentManagerTabBar.js +2 -2
- package/dist/components/agent-manager/AgentManagerTabBar.js.map +1 -1
- package/dist/components/agent-manager/BridleConfigPanel.js +1 -1
- package/dist/components/agent-manager/BridleConfigPanel.js.map +1 -1
- package/dist/components/agent-manager/ProfilesPanel.js +260 -0
- package/dist/components/agent-manager/ProfilesPanel.js.map +1 -0
- package/dist/components/agent-manager/controls/ModelSelector.js +75 -58
- package/dist/components/agent-manager/controls/ModelSelector.js.map +1 -1
- package/dist/components/agent-manager/controls/SdkSelector.js +85 -61
- package/dist/components/agent-manager/controls/SdkSelector.js.map +1 -1
- package/dist/components/agent-manager/detail/SessionConfigPanel.js +2 -2
- package/dist/components/agent-manager/detail/SessionConfigPanel.js.map +1 -1
- package/dist/components/agent-manager/detail/SessionLogsPanel.js +1 -1
- package/dist/components/agent-manager/detail/SessionLogsPanel.js.map +1 -1
- package/dist/components/agent-manager/detail/SessionStatsPanel.js +1 -1
- package/dist/components/agent-manager/detail/SessionStatsPanel.js.map +1 -1
- package/dist/components/agent-manager/detail/SessionToolsPanel.js +1 -1
- package/dist/components/agent-manager/detail/SessionToolsPanel.js.map +1 -1
- package/dist/components/agent-manager/dialogs/ExportSessionDialog.js +1 -1
- package/dist/components/agent-manager/dialogs/ExportSessionDialog.js.map +1 -1
- package/dist/components/agent-manager/dialogs/NewSessionDialog.js +129 -108
- package/dist/components/agent-manager/dialogs/NewSessionDialog.js.map +1 -1
- package/dist/components/agent-manager/dialogs/SessionSearchDialog.js +1 -1
- package/dist/components/agent-manager/dialogs/SessionSearchDialog.js.map +1 -1
- package/dist/components/agent-manager/index.js +16 -0
- package/dist/components/agent-manager/modelDefaults.js +10 -0
- package/dist/components/agent-manager/modelDefaults.js.map +1 -0
- package/dist/components/agents/AgentCard.js +33 -30
- package/dist/components/agents/AgentCard.js.map +1 -1
- package/dist/components/agents/AgentForm.js +277 -239
- package/dist/components/agents/AgentForm.js.map +1 -1
- package/dist/components/agents/AgentStatusBadge.js +19 -8
- package/dist/components/agents/AgentStatusBadge.js.map +1 -1
- package/dist/components/agents/OpenInBrowserEditorButton.js +67 -65
- package/dist/components/agents/OpenInBrowserEditorButton.js.map +1 -1
- package/dist/components/agents/backup/AgentBackupTab.js +186 -185
- package/dist/components/agents/backup/AgentBackupTab.js.map +1 -1
- package/dist/components/ai/AIContextsTab.js +1 -1
- package/dist/components/ai/AIContextsTab.js.map +1 -1
- package/dist/components/ai/AIOverviewTab.js +2 -2
- package/dist/components/ai/AIOverviewTab.js.map +1 -1
- package/dist/components/ai/AIPlaygroundTab.js +97 -97
- package/dist/components/ai/AIPlaygroundTab.js.map +1 -1
- package/dist/components/ai/AIPromptsTab.js +4 -4
- package/dist/components/ai/AIPromptsTab.js.map +1 -1
- package/dist/components/ai/AIProviderCredentialsCard.js +234 -0
- package/dist/components/ai/AIProviderCredentialsCard.js.map +1 -0
- package/dist/components/ai/AISessionsTab.js +17 -1
- package/dist/components/ai/AISessionsTab.js.map +1 -1
- package/dist/components/ai/AIStatsTab.js +1 -1
- package/dist/components/ai/AIStatsTab.js.map +1 -1
- package/dist/components/ai/ClaudeCredentialsCard.js +1 -1
- package/dist/components/ai/ClaudeCredentialsCard.js.map +1 -1
- package/dist/components/ai/PluginHarnessPicker.js +84 -53
- package/dist/components/ai/PluginHarnessPicker.js.map +1 -1
- package/dist/components/aliases/AliasManager.js +386 -0
- package/dist/components/aliases/AliasManager.js.map +1 -0
- package/dist/components/aliases/aliasReservedNames.js +32 -0
- package/dist/components/aliases/aliasReservedNames.js.map +1 -0
- package/dist/components/gitops/CIDurationChart.js +11 -11
- package/dist/components/gitops/VibeGitOpsTab.js +128 -100
- package/dist/components/gitops/VibeGitOpsTab.js.map +1 -1
- package/dist/components/graph/AgentGraphView.js +61 -62
- package/dist/components/graph/AgentGraphView.js.map +1 -1
- package/dist/components/graph/AgentNode.js +17 -18
- package/dist/components/graph/AgentNode.js.map +1 -1
- package/dist/components/graph/TargetNode.js +31 -32
- package/dist/components/graph/TargetNode.js.map +1 -1
- package/dist/components/logs/LogViewer.js +121 -119
- package/dist/components/logs/LogViewer.js.map +1 -1
- package/dist/components/sessions/TerminalPanel.js +449 -458
- package/dist/components/sessions/TerminalPanel.js.map +1 -1
- package/dist/components/shared/AgentSelector.js +87 -67
- package/dist/components/shared/AgentSelector.js.map +1 -1
- package/dist/components/shared/AgentSetupBanner.js +64 -61
- package/dist/components/shared/AgentSetupBanner.js.map +1 -1
- package/dist/components/vibecalendar/expandOccurrences.js.map +1 -1
- package/dist/constants/pluginCatalog.js +29 -1
- package/dist/constants/pluginCatalog.js.map +1 -1
- package/dist/generated/wspace-operations.js +126 -103
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.js.map +1 -1
- package/dist/hooks/useActiveAgentProfile.js +51 -0
- package/dist/hooks/useActiveAgentProfile.js.map +1 -0
- package/dist/hooks/useAgentEvents.js +1 -0
- package/dist/hooks/useAgentEvents.js.map +1 -1
- package/dist/hooks/useAgentManagerStreaming.js +1 -1
- package/dist/hooks/useAgentManagerStreaming.js.map +1 -1
- package/dist/hooks/useCachedInitialData.js +4 -2
- package/dist/hooks/useCachedInitialData.js.map +1 -1
- package/dist/hooks/usePluginAvailability.js +93 -61
- package/dist/hooks/usePluginAvailability.js.map +1 -1
- package/dist/index.js +10 -10
- package/dist/microfe-vibecontrols.css +1 -1
- package/dist/node_modules/d3-scale/src/continuous.js +20 -20
- package/dist/node_modules/d3-scale/src/diverging.js +30 -30
- package/dist/node_modules/d3-scale/src/sequential.js +25 -25
- package/dist/pages/AgentDetailsPage.js +801 -736
- package/dist/pages/AgentDetailsPage.js.map +1 -1
- package/dist/pages/AgentsLandingPage.js +4 -4
- package/dist/pages/AgentsLandingPage.js.map +1 -1
- package/dist/pages/AgentsPage.js +351 -295
- package/dist/pages/AgentsPage.js.map +1 -1
- package/dist/pages/SessionsPage.js +618 -615
- package/dist/pages/SessionsPage.js.map +1 -1
- package/dist/pages/TargetsPage.js +5 -2
- package/dist/pages/TargetsPage.js.map +1 -1
- package/dist/pages/VibeDetailsPage.js +582 -555
- package/dist/pages/VibeDetailsPage.js.map +1 -1
- package/dist/pages/ai/AIPage.js +107 -103
- package/dist/pages/ai/AIPage.js.map +1 -1
- package/dist/pages/ai/AISessionDetailPage.js +167 -163
- package/dist/pages/ai/AISessionDetailPage.js.map +1 -1
- package/dist/pages/ai/AgentManagerPage.js +94 -90
- package/dist/pages/ai/AgentManagerPage.js.map +1 -1
- package/dist/pages/tunnels/TunnelDetailsPage.js.map +1 -1
- package/dist/services/aiApi.js +119 -112
- package/dist/services/aiApi.js.map +1 -1
- package/dist/services/iframeToken.js +29 -0
- package/dist/services/iframeToken.js.map +1 -0
- package/dist/services/schedulerApi.js +14 -13
- package/dist/services/schedulerApi.js.map +1 -1
- package/dist/store/agentManagerStore.js +61 -14
- package/dist/store/agentManagerStore.js.map +1 -1
- package/dist/store/vibeControlsStore.js +21 -1
- package/dist/store/vibeControlsStore.js.map +1 -1
- package/dist/translations/en.js.map +1 -1
- package/dist/utils/agentApiPath.js +9 -0
- package/dist/utils/agentApiPath.js.map +1 -0
- package/package.json +3 -3
- package/dist/VibeControlsRoot.d.ts +0 -36
- package/dist/VibeControlsRoot.d.ts.map +0 -1
- package/dist/VibeControlsRoutes.d.ts +0 -2
- package/dist/VibeControlsRoutes.d.ts.map +0 -1
- package/dist/components/actions/ActionCard.d.ts +0 -32
- package/dist/components/actions/ActionCard.d.ts.map +0 -1
- package/dist/components/actions/ActionForm.d.ts +0 -39
- package/dist/components/actions/ActionForm.d.ts.map +0 -1
- package/dist/components/actions/ActionTypeBadge.d.ts +0 -9
- package/dist/components/actions/ActionTypeBadge.d.ts.map +0 -1
- package/dist/components/actions/ExecutionHistory.d.ts +0 -23
- package/dist/components/actions/ExecutionHistory.d.ts.map +0 -1
- package/dist/components/actions/index.d.ts +0 -6
- package/dist/components/actions/index.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerAdminBar.d.ts +0 -13
- package/dist/components/agent-manager/AgentManagerAdminBar.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerBulkActions.d.ts +0 -13
- package/dist/components/agent-manager/AgentManagerBulkActions.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerCenter.d.ts +0 -8
- package/dist/components/agent-manager/AgentManagerCenter.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerChatPane.d.ts +0 -9
- package/dist/components/agent-manager/AgentManagerChatPane.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerDetailPanel.d.ts +0 -13
- package/dist/components/agent-manager/AgentManagerDetailPanel.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerInputArea.d.ts +0 -14
- package/dist/components/agent-manager/AgentManagerInputArea.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerLayout.d.ts +0 -10
- package/dist/components/agent-manager/AgentManagerLayout.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerMessageItem.d.ts +0 -10
- package/dist/components/agent-manager/AgentManagerMessageItem.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerMessageList.d.ts +0 -12
- package/dist/components/agent-manager/AgentManagerMessageList.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerSessionItem.d.ts +0 -12
- package/dist/components/agent-manager/AgentManagerSessionItem.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerSessionList.d.ts +0 -16
- package/dist/components/agent-manager/AgentManagerSessionList.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerSidebar.d.ts +0 -14
- package/dist/components/agent-manager/AgentManagerSidebar.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerStreamingIndicator.d.ts +0 -8
- package/dist/components/agent-manager/AgentManagerStreamingIndicator.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerTab.d.ts +0 -15
- package/dist/components/agent-manager/AgentManagerTab.d.ts.map +0 -1
- package/dist/components/agent-manager/AgentManagerTabBar.d.ts +0 -10
- package/dist/components/agent-manager/AgentManagerTabBar.d.ts.map +0 -1
- package/dist/components/agent-manager/BridleConfigPanel.d.ts +0 -13
- package/dist/components/agent-manager/BridleConfigPanel.d.ts.map +0 -1
- package/dist/components/agent-manager/PluginInstallModal.d.ts +0 -9
- package/dist/components/agent-manager/PluginInstallModal.d.ts.map +0 -1
- package/dist/components/agent-manager/controls/ContextLevelToggle.d.ts +0 -23
- package/dist/components/agent-manager/controls/ContextLevelToggle.d.ts.map +0 -1
- package/dist/components/agent-manager/controls/FileAttachButton.d.ts +0 -13
- package/dist/components/agent-manager/controls/FileAttachButton.d.ts.map +0 -1
- package/dist/components/agent-manager/controls/McpServerSelector.d.ts +0 -10
- package/dist/components/agent-manager/controls/McpServerSelector.d.ts.map +0 -1
- package/dist/components/agent-manager/controls/ModelSelector.d.ts +0 -10
- package/dist/components/agent-manager/controls/ModelSelector.d.ts.map +0 -1
- package/dist/components/agent-manager/controls/SdkSelector.d.ts +0 -13
- package/dist/components/agent-manager/controls/SdkSelector.d.ts.map +0 -1
- package/dist/components/agent-manager/controls/VoiceToggle.d.ts +0 -13
- package/dist/components/agent-manager/controls/VoiceToggle.d.ts.map +0 -1
- package/dist/components/agent-manager/detail/SessionConfigPanel.d.ts +0 -14
- package/dist/components/agent-manager/detail/SessionConfigPanel.d.ts.map +0 -1
- package/dist/components/agent-manager/detail/SessionLogsPanel.d.ts +0 -13
- package/dist/components/agent-manager/detail/SessionLogsPanel.d.ts.map +0 -1
- package/dist/components/agent-manager/detail/SessionStatsPanel.d.ts +0 -12
- package/dist/components/agent-manager/detail/SessionStatsPanel.d.ts.map +0 -1
- package/dist/components/agent-manager/detail/SessionToolsPanel.d.ts +0 -12
- package/dist/components/agent-manager/detail/SessionToolsPanel.d.ts.map +0 -1
- package/dist/components/agent-manager/dialogs/ExportSessionDialog.d.ts +0 -15
- package/dist/components/agent-manager/dialogs/ExportSessionDialog.d.ts.map +0 -1
- package/dist/components/agent-manager/dialogs/NewSessionDialog.d.ts +0 -14
- package/dist/components/agent-manager/dialogs/NewSessionDialog.d.ts.map +0 -1
- package/dist/components/agent-manager/dialogs/RenameSessionDialog.d.ts +0 -15
- package/dist/components/agent-manager/dialogs/RenameSessionDialog.d.ts.map +0 -1
- package/dist/components/agent-manager/dialogs/SessionSearchDialog.d.ts +0 -15
- package/dist/components/agent-manager/dialogs/SessionSearchDialog.d.ts.map +0 -1
- package/dist/components/agent-manager/index.d.ts +0 -16
- package/dist/components/agent-manager/index.d.ts.map +0 -1
- package/dist/components/agents/AgentCard.d.ts +0 -30
- package/dist/components/agents/AgentCard.d.ts.map +0 -1
- package/dist/components/agents/AgentForm.d.ts +0 -29
- package/dist/components/agents/AgentForm.d.ts.map +0 -1
- package/dist/components/agents/AgentList.d.ts +0 -19
- package/dist/components/agents/AgentList.d.ts.map +0 -1
- package/dist/components/agents/AgentStatusBadge.d.ts +0 -12
- package/dist/components/agents/AgentStatusBadge.d.ts.map +0 -1
- package/dist/components/agents/OpenInBrowserEditorButton.d.ts +0 -16
- package/dist/components/agents/OpenInBrowserEditorButton.d.ts.map +0 -1
- package/dist/components/agents/PluginUIPanel.d.ts +0 -38
- package/dist/components/agents/PluginUIPanel.d.ts.map +0 -1
- package/dist/components/agents/backup/AgentBackupTab.d.ts +0 -11
- package/dist/components/agents/backup/AgentBackupTab.d.ts.map +0 -1
- package/dist/components/agents/index.d.ts +0 -8
- package/dist/components/agents/index.d.ts.map +0 -1
- package/dist/components/agents/types.d.ts +0 -72
- package/dist/components/agents/types.d.ts.map +0 -1
- package/dist/components/ai/AIAssistantPanel.d.ts +0 -8
- package/dist/components/ai/AIAssistantPanel.d.ts.map +0 -1
- package/dist/components/ai/AIContextsTab.d.ts +0 -6
- package/dist/components/ai/AIContextsTab.d.ts.map +0 -1
- package/dist/components/ai/AIOverviewTab.d.ts +0 -7
- package/dist/components/ai/AIOverviewTab.d.ts.map +0 -1
- package/dist/components/ai/AIPlaygroundTab.d.ts +0 -6
- package/dist/components/ai/AIPlaygroundTab.d.ts.map +0 -1
- package/dist/components/ai/AIPromptsTab.d.ts +0 -6
- package/dist/components/ai/AIPromptsTab.d.ts.map +0 -1
- package/dist/components/ai/AISessionsTab.d.ts +0 -7
- package/dist/components/ai/AISessionsTab.d.ts.map +0 -1
- package/dist/components/ai/AIStatsTab.d.ts +0 -6
- package/dist/components/ai/AIStatsTab.d.ts.map +0 -1
- package/dist/components/ai/AITasksTab.d.ts +0 -5
- package/dist/components/ai/AITasksTab.d.ts.map +0 -1
- package/dist/components/ai/AITemplatesTab.d.ts +0 -6
- package/dist/components/ai/AITemplatesTab.d.ts.map +0 -1
- package/dist/components/ai/ClaudeCredentialsCard.d.ts +0 -6
- package/dist/components/ai/ClaudeCredentialsCard.d.ts.map +0 -1
- package/dist/components/ai/PluginHarnessPicker.d.ts +0 -31
- package/dist/components/ai/PluginHarnessPicker.d.ts.map +0 -1
- package/dist/components/analytics/AnalyticsBreakdownChart.d.ts +0 -12
- package/dist/components/analytics/AnalyticsBreakdownChart.d.ts.map +0 -1
- package/dist/components/analytics/AnalyticsBreakdownTable.d.ts +0 -13
- package/dist/components/analytics/AnalyticsBreakdownTable.d.ts.map +0 -1
- package/dist/components/analytics/AnalyticsEntityTabs.d.ts +0 -9
- package/dist/components/analytics/AnalyticsEntityTabs.d.ts.map +0 -1
- package/dist/components/analytics/AnalyticsFilterBar.d.ts +0 -15
- package/dist/components/analytics/AnalyticsFilterBar.d.ts.map +0 -1
- package/dist/components/analytics/AnalyticsKpiGrid.d.ts +0 -10
- package/dist/components/analytics/AnalyticsKpiGrid.d.ts.map +0 -1
- package/dist/components/analytics/AnalyticsTimeSeriesChart.d.ts +0 -16
- package/dist/components/analytics/AnalyticsTimeSeriesChart.d.ts.map +0 -1
- package/dist/components/analytics/SandboxAnalyticsSection.d.ts +0 -9
- package/dist/components/analytics/SandboxAnalyticsSection.d.ts.map +0 -1
- package/dist/components/analytics/index.d.ts +0 -9
- package/dist/components/analytics/index.d.ts.map +0 -1
- package/dist/components/analytics/types.d.ts +0 -28
- package/dist/components/analytics/types.d.ts.map +0 -1
- package/dist/components/assistant/AIAssistantPanel.d.ts +0 -5
- package/dist/components/assistant/AIAssistantPanel.d.ts.map +0 -1
- package/dist/components/assistant/AssistantChatArea.d.ts +0 -4
- package/dist/components/assistant/AssistantChatArea.d.ts.map +0 -1
- package/dist/components/assistant/AssistantChatInput.d.ts +0 -10
- package/dist/components/assistant/AssistantChatInput.d.ts.map +0 -1
- package/dist/components/assistant/AssistantConversationList.d.ts +0 -4
- package/dist/components/assistant/AssistantConversationList.d.ts.map +0 -1
- package/dist/components/assistant/AssistantExportMenu.d.ts +0 -4
- package/dist/components/assistant/AssistantExportMenu.d.ts.map +0 -1
- package/dist/components/assistant/AssistantMarkdownRenderer.d.ts +0 -8
- package/dist/components/assistant/AssistantMarkdownRenderer.d.ts.map +0 -1
- package/dist/components/assistant/AssistantMessageItem.d.ts +0 -10
- package/dist/components/assistant/AssistantMessageItem.d.ts.map +0 -1
- package/dist/components/assistant/AssistantMessageList.d.ts +0 -10
- package/dist/components/assistant/AssistantMessageList.d.ts.map +0 -1
- package/dist/components/assistant/AssistantModeSelector.d.ts +0 -10
- package/dist/components/assistant/AssistantModeSelector.d.ts.map +0 -1
- package/dist/components/assistant/AssistantWelcome.d.ts +0 -10
- package/dist/components/assistant/AssistantWelcome.d.ts.map +0 -1
- package/dist/components/assistant/index.d.ts +0 -11
- package/dist/components/assistant/index.d.ts.map +0 -1
- package/dist/components/audit/AuditDeleteDialog.d.ts +0 -12
- package/dist/components/audit/AuditDeleteDialog.d.ts.map +0 -1
- package/dist/components/audit/AuditExportButton.d.ts +0 -8
- package/dist/components/audit/AuditExportButton.d.ts.map +0 -1
- package/dist/components/audit/AuditLogDetail.d.ts +0 -9
- package/dist/components/audit/AuditLogDetail.d.ts.map +0 -1
- package/dist/components/audit/AuditLogFilters.d.ts +0 -15
- package/dist/components/audit/AuditLogFilters.d.ts.map +0 -1
- package/dist/components/audit/AuditLogStats.d.ts +0 -9
- package/dist/components/audit/AuditLogStats.d.ts.map +0 -1
- package/dist/components/audit/AuditLogTable.d.ts +0 -21
- package/dist/components/audit/AuditLogTable.d.ts.map +0 -1
- package/dist/components/audit/index.d.ts +0 -7
- package/dist/components/audit/index.d.ts.map +0 -1
- package/dist/components/catalog/CatalogCard.d.ts +0 -22
- package/dist/components/catalog/CatalogCard.d.ts.map +0 -1
- package/dist/components/catalog/CatalogForm.d.ts +0 -18
- package/dist/components/catalog/CatalogForm.d.ts.map +0 -1
- package/dist/components/catalog/index.d.ts +0 -5
- package/dist/components/catalog/index.d.ts.map +0 -1
- package/dist/components/docs/DocsCompileStatus.d.ts +0 -9
- package/dist/components/docs/DocsCompileStatus.d.ts.map +0 -1
- package/dist/components/docs/DocsEditPanel.d.ts +0 -26
- package/dist/components/docs/DocsEditPanel.d.ts.map +0 -1
- package/dist/components/docs/DocsEmptyState.d.ts +0 -7
- package/dist/components/docs/DocsEmptyState.d.ts.map +0 -1
- package/dist/components/docs/DocsPageEditor.d.ts +0 -13
- package/dist/components/docs/DocsPageEditor.d.ts.map +0 -1
- package/dist/components/docs/DocsPageTree.d.ts +0 -12
- package/dist/components/docs/DocsPageTree.d.ts.map +0 -1
- package/dist/components/docs/DocsPreviewPanel.d.ts +0 -17
- package/dist/components/docs/DocsPreviewPanel.d.ts.map +0 -1
- package/dist/components/docs/DocsSettingsPanel.d.ts +0 -15
- package/dist/components/docs/DocsSettingsPanel.d.ts.map +0 -1
- package/dist/components/docs/DocsTabPanel.d.ts +0 -8
- package/dist/components/docs/DocsTabPanel.d.ts.map +0 -1
- package/dist/components/docs/index.d.ts +0 -10
- package/dist/components/docs/index.d.ts.map +0 -1
- package/dist/components/docs/previewHtml.d.ts +0 -2
- package/dist/components/docs/previewHtml.d.ts.map +0 -1
- package/dist/components/docs/types.d.ts +0 -59
- package/dist/components/docs/types.d.ts.map +0 -1
- package/dist/components/gitops/CIDurationChart.d.ts +0 -12
- package/dist/components/gitops/CIDurationChart.d.ts.map +0 -1
- package/dist/components/gitops/CIFailedRuns.d.ts +0 -13
- package/dist/components/gitops/CIFailedRuns.d.ts.map +0 -1
- package/dist/components/gitops/CIPipelineRunsTable.d.ts +0 -13
- package/dist/components/gitops/CIPipelineRunsTable.d.ts.map +0 -1
- package/dist/components/gitops/CISuccessRateChart.d.ts +0 -13
- package/dist/components/gitops/CISuccessRateChart.d.ts.map +0 -1
- package/dist/components/gitops/CITab.d.ts +0 -15
- package/dist/components/gitops/CITab.d.ts.map +0 -1
- package/dist/components/gitops/CIWorkflowList.d.ts +0 -13
- package/dist/components/gitops/CIWorkflowList.d.ts.map +0 -1
- package/dist/components/gitops/GitOpsProviderCard.d.ts +0 -14
- package/dist/components/gitops/GitOpsProviderCard.d.ts.map +0 -1
- package/dist/components/gitops/GitOpsSetup.d.ts +0 -16
- package/dist/components/gitops/GitOpsSetup.d.ts.map +0 -1
- package/dist/components/gitops/GitOpsSkeleton.d.ts +0 -12
- package/dist/components/gitops/GitOpsSkeleton.d.ts.map +0 -1
- package/dist/components/gitops/GitOpsStatusBadge.d.ts +0 -14
- package/dist/components/gitops/GitOpsStatusBadge.d.ts.map +0 -1
- package/dist/components/gitops/ProviderIcon.d.ts +0 -14
- package/dist/components/gitops/ProviderIcon.d.ts.map +0 -1
- package/dist/components/gitops/RepoActivityCard.d.ts +0 -12
- package/dist/components/gitops/RepoActivityCard.d.ts.map +0 -1
- package/dist/components/gitops/RepoIssuesCard.d.ts +0 -12
- package/dist/components/gitops/RepoIssuesCard.d.ts.map +0 -1
- package/dist/components/gitops/RepoLanguagesCard.d.ts +0 -13
- package/dist/components/gitops/RepoLanguagesCard.d.ts.map +0 -1
- package/dist/components/gitops/RepoOverviewCard.d.ts +0 -13
- package/dist/components/gitops/RepoOverviewCard.d.ts.map +0 -1
- package/dist/components/gitops/RepoPullRequestsCard.d.ts +0 -12
- package/dist/components/gitops/RepoPullRequestsCard.d.ts.map +0 -1
- package/dist/components/gitops/RepoSecurityCard.d.ts +0 -12
- package/dist/components/gitops/RepoSecurityCard.d.ts.map +0 -1
- package/dist/components/gitops/RepoStatsTab.d.ts +0 -15
- package/dist/components/gitops/RepoStatsTab.d.ts.map +0 -1
- package/dist/components/gitops/VibeGitOpsTab.d.ts +0 -12
- package/dist/components/gitops/VibeGitOpsTab.d.ts.map +0 -1
- package/dist/components/gitops/index.d.ts +0 -21
- package/dist/components/gitops/index.d.ts.map +0 -1
- package/dist/components/gitops/types.d.ts +0 -90
- package/dist/components/gitops/types.d.ts.map +0 -1
- package/dist/components/graph/AgentGraphView.d.ts +0 -44
- package/dist/components/graph/AgentGraphView.d.ts.map +0 -1
- package/dist/components/graph/AgentNode.d.ts +0 -6
- package/dist/components/graph/AgentNode.d.ts.map +0 -1
- package/dist/components/graph/ConnectionPermissionsDialog.d.ts +0 -26
- package/dist/components/graph/ConnectionPermissionsDialog.d.ts.map +0 -1
- package/dist/components/graph/TargetNode.d.ts +0 -6
- package/dist/components/graph/TargetNode.d.ts.map +0 -1
- package/dist/components/health/AgentHealthCard.d.ts +0 -9
- package/dist/components/health/AgentHealthCard.d.ts.map +0 -1
- package/dist/components/health/HealthDashboard.d.ts +0 -10
- package/dist/components/health/HealthDashboard.d.ts.map +0 -1
- package/dist/components/health/SystemStatus.d.ts +0 -11
- package/dist/components/health/SystemStatus.d.ts.map +0 -1
- package/dist/components/health/index.d.ts +0 -5
- package/dist/components/health/index.d.ts.map +0 -1
- package/dist/components/health/types.d.ts +0 -50
- package/dist/components/health/types.d.ts.map +0 -1
- package/dist/components/idp-components/ComponentCard.d.ts +0 -24
- package/dist/components/idp-components/ComponentCard.d.ts.map +0 -1
- package/dist/components/idp-components/ComponentForm.d.ts +0 -22
- package/dist/components/idp-components/ComponentForm.d.ts.map +0 -1
- package/dist/components/idp-components/index.d.ts +0 -5
- package/dist/components/idp-components/index.d.ts.map +0 -1
- package/dist/components/logs/LogViewer.d.ts +0 -13
- package/dist/components/logs/LogViewer.d.ts.map +0 -1
- package/dist/components/notes/NoteCard.d.ts +0 -13
- package/dist/components/notes/NoteCard.d.ts.map +0 -1
- package/dist/components/notes/NoteEditor.d.ts +0 -31
- package/dist/components/notes/NoteEditor.d.ts.map +0 -1
- package/dist/components/notes/NoteList.d.ts +0 -15
- package/dist/components/notes/NoteList.d.ts.map +0 -1
- package/dist/components/notes/NotesTabPanel.d.ts +0 -18
- package/dist/components/notes/NotesTabPanel.d.ts.map +0 -1
- package/dist/components/notes/index.d.ts +0 -7
- package/dist/components/notes/index.d.ts.map +0 -1
- package/dist/components/notes/types.d.ts +0 -58
- package/dist/components/notes/types.d.ts.map +0 -1
- package/dist/components/scorecard/ScorecardPanel.d.ts +0 -9
- package/dist/components/scorecard/ScorecardPanel.d.ts.map +0 -1
- package/dist/components/scorecard/index.d.ts +0 -3
- package/dist/components/scorecard/index.d.ts.map +0 -1
- package/dist/components/sessions/CollaboratorsList.d.ts +0 -18
- package/dist/components/sessions/CollaboratorsList.d.ts.map +0 -1
- package/dist/components/sessions/ControlStatusBar.d.ts +0 -31
- package/dist/components/sessions/ControlStatusBar.d.ts.map +0 -1
- package/dist/components/sessions/SessionCard.d.ts +0 -24
- package/dist/components/sessions/SessionCard.d.ts.map +0 -1
- package/dist/components/sessions/SessionForm.d.ts +0 -20
- package/dist/components/sessions/SessionForm.d.ts.map +0 -1
- package/dist/components/sessions/SessionList.d.ts +0 -25
- package/dist/components/sessions/SessionList.d.ts.map +0 -1
- package/dist/components/sessions/SessionShareDialog.d.ts +0 -15
- package/dist/components/sessions/SessionShareDialog.d.ts.map +0 -1
- package/dist/components/sessions/SessionStatusBadge.d.ts +0 -9
- package/dist/components/sessions/SessionStatusBadge.d.ts.map +0 -1
- package/dist/components/sessions/SharedTerminalPanel.d.ts +0 -72
- package/dist/components/sessions/SharedTerminalPanel.d.ts.map +0 -1
- package/dist/components/sessions/TerminalPanel.d.ts +0 -69
- package/dist/components/sessions/TerminalPanel.d.ts.map +0 -1
- package/dist/components/sessions/index.d.ts +0 -11
- package/dist/components/sessions/index.d.ts.map +0 -1
- package/dist/components/sessions/types.d.ts +0 -67
- package/dist/components/sessions/types.d.ts.map +0 -1
- package/dist/components/settings/AdvancedSection.d.ts +0 -22
- package/dist/components/settings/AdvancedSection.d.ts.map +0 -1
- package/dist/components/settings/ConfigEditor.d.ts +0 -14
- package/dist/components/settings/ConfigEditor.d.ts.map +0 -1
- package/dist/components/settings/ConfigSection.d.ts +0 -12
- package/dist/components/settings/ConfigSection.d.ts.map +0 -1
- package/dist/components/settings/NotificationsSection.d.ts +0 -14
- package/dist/components/settings/NotificationsSection.d.ts.map +0 -1
- package/dist/components/settings/PreferencesSection.d.ts +0 -14
- package/dist/components/settings/PreferencesSection.d.ts.map +0 -1
- package/dist/components/settings/ProfileSection.d.ts +0 -14
- package/dist/components/settings/ProfileSection.d.ts.map +0 -1
- package/dist/components/settings/SecuritySection.d.ts +0 -11
- package/dist/components/settings/SecuritySection.d.ts.map +0 -1
- package/dist/components/settings/SettingsForm.d.ts +0 -58
- package/dist/components/settings/SettingsForm.d.ts.map +0 -1
- package/dist/components/settings/WorkspaceDefaultsSection.d.ts +0 -27
- package/dist/components/settings/WorkspaceDefaultsSection.d.ts.map +0 -1
- package/dist/components/settings/index.d.ts +0 -4
- package/dist/components/settings/index.d.ts.map +0 -1
- package/dist/components/settings/types.d.ts +0 -55
- package/dist/components/settings/types.d.ts.map +0 -1
- package/dist/components/shared/AgentEventsConnector.d.ts +0 -6
- package/dist/components/shared/AgentEventsConnector.d.ts.map +0 -1
- package/dist/components/shared/AgentSelector.d.ts +0 -25
- package/dist/components/shared/AgentSelector.d.ts.map +0 -1
- package/dist/components/shared/AgentSetupBanner.d.ts +0 -21
- package/dist/components/shared/AgentSetupBanner.d.ts.map +0 -1
- package/dist/components/shared/Card.d.ts +0 -29
- package/dist/components/shared/Card.d.ts.map +0 -1
- package/dist/components/shared/ConfirmDialog.d.ts +0 -14
- package/dist/components/shared/ConfirmDialog.d.ts.map +0 -1
- package/dist/components/shared/EmptyState.d.ts +0 -11
- package/dist/components/shared/EmptyState.d.ts.map +0 -1
- package/dist/components/shared/EntityTagPicker.d.ts +0 -8
- package/dist/components/shared/EntityTagPicker.d.ts.map +0 -1
- package/dist/components/shared/ErrorState.d.ts +0 -11
- package/dist/components/shared/ErrorState.d.ts.map +0 -1
- package/dist/components/shared/FilterDropdown.d.ts +0 -20
- package/dist/components/shared/FilterDropdown.d.ts.map +0 -1
- package/dist/components/shared/GetHelpButton.d.ts +0 -27
- package/dist/components/shared/GetHelpButton.d.ts.map +0 -1
- package/dist/components/shared/InstallTabs.d.ts +0 -18
- package/dist/components/shared/InstallTabs.d.ts.map +0 -1
- package/dist/components/shared/LoadingState.d.ts +0 -7
- package/dist/components/shared/LoadingState.d.ts.map +0 -1
- package/dist/components/shared/NotificationToast.d.ts +0 -40
- package/dist/components/shared/NotificationToast.d.ts.map +0 -1
- package/dist/components/shared/PageHeader.d.ts +0 -14
- package/dist/components/shared/PageHeader.d.ts.map +0 -1
- package/dist/components/shared/PluginGate.d.ts +0 -35
- package/dist/components/shared/PluginGate.d.ts.map +0 -1
- package/dist/components/shared/QuotaExhaustedDialog.d.ts +0 -12
- package/dist/components/shared/QuotaExhaustedDialog.d.ts.map +0 -1
- package/dist/components/shared/RequireAgentReachable.d.ts +0 -14
- package/dist/components/shared/RequireAgentReachable.d.ts.map +0 -1
- package/dist/components/shared/SearchInput.d.ts +0 -9
- package/dist/components/shared/SearchInput.d.ts.map +0 -1
- package/dist/components/shared/SearchableSelect.d.ts +0 -48
- package/dist/components/shared/SearchableSelect.d.ts.map +0 -1
- package/dist/components/shared/SelectionCheckbox.d.ts +0 -11
- package/dist/components/shared/SelectionCheckbox.d.ts.map +0 -1
- package/dist/components/shared/SessionNotificationBanner.d.ts +0 -47
- package/dist/components/shared/SessionNotificationBanner.d.ts.map +0 -1
- package/dist/components/shared/StatCard.d.ts +0 -17
- package/dist/components/shared/StatCard.d.ts.map +0 -1
- package/dist/components/shared/StatusBadge.d.ts +0 -11
- package/dist/components/shared/StatusBadge.d.ts.map +0 -1
- package/dist/components/shared/TagFilter.d.ts +0 -11
- package/dist/components/shared/TagFilter.d.ts.map +0 -1
- package/dist/components/shared/index.d.ts +0 -32
- package/dist/components/shared/index.d.ts.map +0 -1
- package/dist/components/targets/TargetCard.d.ts +0 -45
- package/dist/components/targets/TargetCard.d.ts.map +0 -1
- package/dist/components/targets/index.d.ts +0 -3
- package/dist/components/targets/index.d.ts.map +0 -1
- package/dist/components/templates/TemplateCard.d.ts +0 -19
- package/dist/components/templates/TemplateCard.d.ts.map +0 -1
- package/dist/components/templates/index.d.ts +0 -3
- package/dist/components/templates/index.d.ts.map +0 -1
- package/dist/components/tunnels/DomainVerificationBadge.d.ts +0 -6
- package/dist/components/tunnels/DomainVerificationBadge.d.ts.map +0 -1
- package/dist/components/tunnels/ProviderBadge.d.ts +0 -6
- package/dist/components/tunnels/ProviderBadge.d.ts.map +0 -1
- package/dist/components/tunnels/TunnelCard.d.ts +0 -13
- package/dist/components/tunnels/TunnelCard.d.ts.map +0 -1
- package/dist/components/tunnels/TunnelCreateWizard.d.ts +0 -2
- package/dist/components/tunnels/TunnelCreateWizard.d.ts.map +0 -1
- package/dist/components/tunnels/TunnelStatusBadge.d.ts +0 -6
- package/dist/components/tunnels/TunnelStatusBadge.d.ts.map +0 -1
- package/dist/components/vibe/VibeAgentEmptyState.d.ts +0 -8
- package/dist/components/vibe/VibeAgentEmptyState.d.ts.map +0 -1
- package/dist/components/vibecalendar/LogsDrawer.d.ts +0 -12
- package/dist/components/vibecalendar/LogsDrawer.d.ts.map +0 -1
- package/dist/components/vibecalendar/ScheduleTaskModal.d.ts +0 -33
- package/dist/components/vibecalendar/ScheduleTaskModal.d.ts.map +0 -1
- package/dist/components/vibecalendar/VibeCalAgendaView.d.ts +0 -11
- package/dist/components/vibecalendar/VibeCalAgendaView.d.ts.map +0 -1
- package/dist/components/vibecalendar/VibeCalDayView.d.ts +0 -12
- package/dist/components/vibecalendar/VibeCalDayView.d.ts.map +0 -1
- package/dist/components/vibecalendar/VibeCalMonthView.d.ts +0 -12
- package/dist/components/vibecalendar/VibeCalMonthView.d.ts.map +0 -1
- package/dist/components/vibecalendar/VibeCalWeekView.d.ts +0 -12
- package/dist/components/vibecalendar/VibeCalWeekView.d.ts.map +0 -1
- package/dist/components/vibecalendar/VibeCalendarHeader.d.ts +0 -12
- package/dist/components/vibecalendar/VibeCalendarHeader.d.ts.map +0 -1
- package/dist/components/vibecalendar/VibeTaskBlock.d.ts +0 -12
- package/dist/components/vibecalendar/VibeTaskBlock.d.ts.map +0 -1
- package/dist/components/vibecalendar/expandOccurrences.d.ts +0 -37
- package/dist/components/vibecalendar/expandOccurrences.d.ts.map +0 -1
- package/dist/components/vibecalendar/index.d.ts +0 -11
- package/dist/components/vibecalendar/index.d.ts.map +0 -1
- package/dist/components/vibecalendar/types.d.ts +0 -53
- package/dist/components/vibecalendar/types.d.ts.map +0 -1
- package/dist/components/vibedeck/VibeDeckButtonForm.d.ts +0 -54
- package/dist/components/vibedeck/VibeDeckButtonForm.d.ts.map +0 -1
- package/dist/components/vibedeck/VibeDeckButtonTile.d.ts +0 -48
- package/dist/components/vibedeck/VibeDeckButtonTile.d.ts.map +0 -1
- package/dist/components/vibedeck/VibeDeckExecutionLog.d.ts +0 -25
- package/dist/components/vibedeck/VibeDeckExecutionLog.d.ts.map +0 -1
- package/dist/components/vibedeck/VibeDeckForm.d.ts +0 -21
- package/dist/components/vibedeck/VibeDeckForm.d.ts.map +0 -1
- package/dist/components/vibedeck/VibeDeckGrid.d.ts +0 -51
- package/dist/components/vibedeck/VibeDeckGrid.d.ts.map +0 -1
- package/dist/components/vibedeck/VibeDeckShareDialog.d.ts +0 -10
- package/dist/components/vibedeck/VibeDeckShareDialog.d.ts.map +0 -1
- package/dist/components/vibedeck/VibeDeckSwitcher.d.ts +0 -28
- package/dist/components/vibedeck/VibeDeckSwitcher.d.ts.map +0 -1
- package/dist/components/vibedeck/index.d.ts +0 -9
- package/dist/components/vibedeck/index.d.ts.map +0 -1
- package/dist/components/vibes/VibeCard.d.ts +0 -19
- package/dist/components/vibes/VibeCard.d.ts.map +0 -1
- package/dist/components/vibes/VibeForm.d.ts +0 -15
- package/dist/components/vibes/VibeForm.d.ts.map +0 -1
- package/dist/components/vibes/VibeList.d.ts +0 -20
- package/dist/components/vibes/VibeList.d.ts.map +0 -1
- package/dist/components/vibes/icons.d.ts +0 -6
- package/dist/components/vibes/icons.d.ts.map +0 -1
- package/dist/components/vibes/index.d.ts +0 -5
- package/dist/components/vibes/index.d.ts.map +0 -1
- package/dist/components/vibes/types.d.ts +0 -71
- package/dist/components/vibes/types.d.ts.map +0 -1
- package/dist/components/webhooks/WebhookCard.d.ts +0 -12
- package/dist/components/webhooks/WebhookCard.d.ts.map +0 -1
- package/dist/components/webhooks/WebhookForm.d.ts +0 -11
- package/dist/components/webhooks/WebhookForm.d.ts.map +0 -1
- package/dist/components/webhooks/WebhookList.d.ts +0 -14
- package/dist/components/webhooks/WebhookList.d.ts.map +0 -1
- package/dist/components/webhooks/index.d.ts +0 -5
- package/dist/components/webhooks/index.d.ts.map +0 -1
- package/dist/components/webhooks/types.d.ts +0 -58
- package/dist/components/webhooks/types.d.ts.map +0 -1
- package/dist/config/assistantUsecases.d.ts +0 -18
- package/dist/config/assistantUsecases.d.ts.map +0 -1
- package/dist/config/index.d.ts +0 -24
- package/dist/config/index.d.ts.map +0 -1
- package/dist/constants/permissions.d.ts +0 -112
- package/dist/constants/permissions.d.ts.map +0 -1
- package/dist/constants/pluginCatalog.d.ts +0 -36
- package/dist/constants/pluginCatalog.d.ts.map +0 -1
- package/dist/dev/main.d.ts +0 -2
- package/dist/dev/main.d.ts.map +0 -1
- package/dist/generated/global-operations.d.ts +0 -2
- package/dist/generated/global-operations.d.ts.map +0 -1
- package/dist/generated/global-types.d.ts +0 -21253
- package/dist/generated/global-types.d.ts.map +0 -1
- package/dist/generated/wspace-operations.d.ts +0 -15218
- package/dist/generated/wspace-operations.d.ts.map +0 -1
- package/dist/generated/wspace-types.d.ts +0 -55252
- package/dist/generated/wspace-types.d.ts.map +0 -1
- package/dist/hooks/index.d.ts +0 -7
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/useAgentConnectivity.d.ts +0 -47
- package/dist/hooks/useAgentConnectivity.d.ts.map +0 -1
- package/dist/hooks/useAgentEvents.d.ts +0 -36
- package/dist/hooks/useAgentEvents.d.ts.map +0 -1
- package/dist/hooks/useAgentManagerKeyboard.d.ts +0 -17
- package/dist/hooks/useAgentManagerKeyboard.d.ts.map +0 -1
- package/dist/hooks/useAgentManagerStreaming.d.ts +0 -19
- package/dist/hooks/useAgentManagerStreaming.d.ts.map +0 -1
- package/dist/hooks/useAssistantHeartbeat.d.ts +0 -4
- package/dist/hooks/useAssistantHeartbeat.d.ts.map +0 -1
- package/dist/hooks/useAssistantKeyboardShortcuts.d.ts +0 -18
- package/dist/hooks/useAssistantKeyboardShortcuts.d.ts.map +0 -1
- package/dist/hooks/useCachedInitialData.d.ts +0 -120
- package/dist/hooks/useCachedInitialData.d.ts.map +0 -1
- package/dist/hooks/useEntityTags.d.ts +0 -24
- package/dist/hooks/useEntityTags.d.ts.map +0 -1
- package/dist/hooks/useFileUpload.d.ts +0 -15
- package/dist/hooks/useFileUpload.d.ts.map +0 -1
- package/dist/hooks/useInitialDataLoader.d.ts +0 -48
- package/dist/hooks/useInitialDataLoader.d.ts.map +0 -1
- package/dist/hooks/useMcpServers.d.ts +0 -14
- package/dist/hooks/useMcpServers.d.ts.map +0 -1
- package/dist/hooks/useOpenAssistantHelp.d.ts +0 -2
- package/dist/hooks/useOpenAssistantHelp.d.ts.map +0 -1
- package/dist/hooks/usePluginAvailability.d.ts +0 -35
- package/dist/hooks/usePluginAvailability.d.ts.map +0 -1
- package/dist/hooks/useQueryBackedTab.d.ts +0 -2
- package/dist/hooks/useQueryBackedTab.d.ts.map +0 -1
- package/dist/hooks/useSessionSearch.d.ts +0 -24
- package/dist/hooks/useSessionSearch.d.ts.map +0 -1
- package/dist/hooks/useVoiceMode.d.ts +0 -17
- package/dist/hooks/useVoiceMode.d.ts.map +0 -1
- package/dist/index.d.ts +0 -17
- package/dist/index.d.ts.map +0 -1
- package/dist/lib/vibeFeatures.d.ts +0 -29
- package/dist/lib/vibeFeatures.d.ts.map +0 -1
- package/dist/node_modules/@xyflow/react/dist/esm/index.js +0 -3281
- package/dist/node_modules/@xyflow/react/dist/esm/index.js.map +0 -1
- package/dist/node_modules/@xyflow/system/dist/esm/index.js +0 -1845
- package/dist/node_modules/@xyflow/system/dist/esm/index.js.map +0 -1
- package/dist/node_modules/classcat/index.js +0 -12
- package/dist/node_modules/classcat/index.js.map +0 -1
- package/dist/node_modules/d3-dispatch/src/dispatch.js +0 -67
- package/dist/node_modules/d3-dispatch/src/dispatch.js.map +0 -1
- package/dist/node_modules/d3-drag/src/constant.js +0 -6
- package/dist/node_modules/d3-drag/src/constant.js.map +0 -1
- package/dist/node_modules/d3-drag/src/drag.js +0 -116
- package/dist/node_modules/d3-drag/src/drag.js.map +0 -1
- package/dist/node_modules/d3-drag/src/event.js +0 -64
- package/dist/node_modules/d3-drag/src/event.js.map +0 -1
- package/dist/node_modules/d3-drag/src/nodrag.js +0 -17
- package/dist/node_modules/d3-drag/src/nodrag.js.map +0 -1
- package/dist/node_modules/d3-drag/src/noevent.js +0 -15
- package/dist/node_modules/d3-drag/src/noevent.js.map +0 -1
- package/dist/node_modules/d3-ease/src/cubic.js +0 -8
- package/dist/node_modules/d3-ease/src/cubic.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/transform/decompose.js +0 -24
- package/dist/node_modules/d3-interpolate/src/transform/decompose.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/transform/index.js +0 -56
- package/dist/node_modules/d3-interpolate/src/transform/index.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/transform/parse.js +0 -14
- package/dist/node_modules/d3-interpolate/src/transform/parse.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/zoom.js +0 -43
- package/dist/node_modules/d3-interpolate/src/zoom.js.map +0 -1
- package/dist/node_modules/d3-selection/src/array.js +0 -8
- package/dist/node_modules/d3-selection/src/array.js.map +0 -1
- package/dist/node_modules/d3-selection/src/constant.js +0 -10
- package/dist/node_modules/d3-selection/src/constant.js.map +0 -1
- package/dist/node_modules/d3-selection/src/creator.js +0 -22
- package/dist/node_modules/d3-selection/src/creator.js.map +0 -1
- package/dist/node_modules/d3-selection/src/matcher.js +0 -15
- package/dist/node_modules/d3-selection/src/matcher.js.map +0 -1
- package/dist/node_modules/d3-selection/src/namespace.js +0 -13
- package/dist/node_modules/d3-selection/src/namespace.js.map +0 -1
- package/dist/node_modules/d3-selection/src/namespaces.js +0 -12
- package/dist/node_modules/d3-selection/src/namespaces.js.map +0 -1
- package/dist/node_modules/d3-selection/src/pointer.js +0 -20
- package/dist/node_modules/d3-selection/src/pointer.js.map +0 -1
- package/dist/node_modules/d3-selection/src/select.js +0 -9
- package/dist/node_modules/d3-selection/src/select.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/append.js +0 -12
- package/dist/node_modules/d3-selection/src/selection/append.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/attr.js +0 -46
- package/dist/node_modules/d3-selection/src/selection/attr.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/call.js +0 -9
- package/dist/node_modules/d3-selection/src/selection/call.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/classed.js +0 -55
- package/dist/node_modules/d3-selection/src/selection/classed.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/clone.js +0 -16
- package/dist/node_modules/d3-selection/src/selection/clone.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/data.js +0 -38
- package/dist/node_modules/d3-selection/src/selection/data.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/datum.js +0 -8
- package/dist/node_modules/d3-selection/src/selection/datum.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/dispatch.js +0 -23
- package/dist/node_modules/d3-selection/src/selection/dispatch.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/each.js +0 -9
- package/dist/node_modules/d3-selection/src/selection/each.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/empty.js +0 -8
- package/dist/node_modules/d3-selection/src/selection/empty.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/enter.js +0 -28
- package/dist/node_modules/d3-selection/src/selection/enter.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/exit.js +0 -10
- package/dist/node_modules/d3-selection/src/selection/exit.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/filter.js +0 -12
- package/dist/node_modules/d3-selection/src/selection/filter.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/html.js +0 -21
- package/dist/node_modules/d3-selection/src/selection/html.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/index.js +0 -87
- package/dist/node_modules/d3-selection/src/selection/index.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/insert.js +0 -16
- package/dist/node_modules/d3-selection/src/selection/insert.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/iterator.js +0 -8
- package/dist/node_modules/d3-selection/src/selection/iterator.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/join.js +0 -9
- package/dist/node_modules/d3-selection/src/selection/join.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/lower.js +0 -11
- package/dist/node_modules/d3-selection/src/selection/lower.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/merge.js +0 -11
- package/dist/node_modules/d3-selection/src/selection/merge.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/node.js +0 -12
- package/dist/node_modules/d3-selection/src/selection/node.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/nodes.js +0 -8
- package/dist/node_modules/d3-selection/src/selection/nodes.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/on.js +0 -58
- package/dist/node_modules/d3-selection/src/selection/on.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/order.js +0 -9
- package/dist/node_modules/d3-selection/src/selection/order.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/property.js +0 -24
- package/dist/node_modules/d3-selection/src/selection/property.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/raise.js +0 -11
- package/dist/node_modules/d3-selection/src/selection/raise.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/remove.js +0 -12
- package/dist/node_modules/d3-selection/src/selection/remove.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/select.js +0 -12
- package/dist/node_modules/d3-selection/src/selection/select.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/selectAll.js +0 -18
- package/dist/node_modules/d3-selection/src/selection/selectAll.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/selectChild.js +0 -18
- package/dist/node_modules/d3-selection/src/selection/selectChild.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/selectChildren.js +0 -18
- package/dist/node_modules/d3-selection/src/selection/selectChildren.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/size.js +0 -10
- package/dist/node_modules/d3-selection/src/selection/size.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/sort.js +0 -20
- package/dist/node_modules/d3-selection/src/selection/sort.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/sparse.js +0 -8
- package/dist/node_modules/d3-selection/src/selection/sparse.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/style.js +0 -28
- package/dist/node_modules/d3-selection/src/selection/style.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selection/text.js +0 -21
- package/dist/node_modules/d3-selection/src/selection/text.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selector.js +0 -11
- package/dist/node_modules/d3-selection/src/selector.js.map +0 -1
- package/dist/node_modules/d3-selection/src/selectorAll.js +0 -13
- package/dist/node_modules/d3-selection/src/selectorAll.js.map +0 -1
- package/dist/node_modules/d3-selection/src/sourceEvent.js +0 -10
- package/dist/node_modules/d3-selection/src/sourceEvent.js.map +0 -1
- package/dist/node_modules/d3-selection/src/window.js +0 -8
- package/dist/node_modules/d3-selection/src/window.js.map +0 -1
- package/dist/node_modules/d3-timer/src/timeout.js +0 -12
- package/dist/node_modules/d3-timer/src/timeout.js.map +0 -1
- package/dist/node_modules/d3-timer/src/timer.js +0 -55
- package/dist/node_modules/d3-timer/src/timer.js.map +0 -1
- package/dist/node_modules/d3-transition/src/index.js +0 -3
- package/dist/node_modules/d3-transition/src/interrupt.js +0 -18
- package/dist/node_modules/d3-transition/src/interrupt.js.map +0 -1
- package/dist/node_modules/d3-transition/src/selection/index.js +0 -7
- package/dist/node_modules/d3-transition/src/selection/index.js.map +0 -1
- package/dist/node_modules/d3-transition/src/selection/interrupt.js +0 -11
- package/dist/node_modules/d3-transition/src/selection/interrupt.js.map +0 -1
- package/dist/node_modules/d3-transition/src/selection/transition.js +0 -25
- package/dist/node_modules/d3-transition/src/selection/transition.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/attr.js +0 -51
- package/dist/node_modules/d3-transition/src/transition/attr.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/attrTween.js +0 -40
- package/dist/node_modules/d3-transition/src/transition/attrTween.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/delay.js +0 -20
- package/dist/node_modules/d3-transition/src/transition/delay.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/duration.js +0 -20
- package/dist/node_modules/d3-transition/src/transition/duration.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/ease.js +0 -16
- package/dist/node_modules/d3-transition/src/transition/ease.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/easeVarying.js +0 -17
- package/dist/node_modules/d3-transition/src/transition/easeVarying.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/end.js +0 -18
- package/dist/node_modules/d3-transition/src/transition/end.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/filter.js +0 -12
- package/dist/node_modules/d3-transition/src/transition/filter.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/index.js +0 -69
- package/dist/node_modules/d3-transition/src/transition/index.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/interpolate.js +0 -13
- package/dist/node_modules/d3-transition/src/transition/interpolate.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/merge.js +0 -12
- package/dist/node_modules/d3-transition/src/transition/merge.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/on.js +0 -23
- package/dist/node_modules/d3-transition/src/transition/on.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/remove.js +0 -15
- package/dist/node_modules/d3-transition/src/transition/remove.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/schedule.js +0 -71
- package/dist/node_modules/d3-transition/src/transition/schedule.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/select.js +0 -14
- package/dist/node_modules/d3-transition/src/transition/select.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/selectAll.js +0 -17
- package/dist/node_modules/d3-transition/src/transition/selectAll.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/selection.js +0 -10
- package/dist/node_modules/d3-transition/src/transition/selection.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/style.js +0 -47
- package/dist/node_modules/d3-transition/src/transition/style.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/styleTween.js +0 -25
- package/dist/node_modules/d3-transition/src/transition/styleTween.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/text.js +0 -19
- package/dist/node_modules/d3-transition/src/transition/text.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/textTween.js +0 -25
- package/dist/node_modules/d3-transition/src/transition/textTween.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/transition.js +0 -19
- package/dist/node_modules/d3-transition/src/transition/transition.js.map +0 -1
- package/dist/node_modules/d3-transition/src/transition/tween.js +0 -56
- package/dist/node_modules/d3-transition/src/transition/tween.js.map +0 -1
- package/dist/node_modules/d3-zoom/src/constant.js +0 -6
- package/dist/node_modules/d3-zoom/src/constant.js.map +0 -1
- package/dist/node_modules/d3-zoom/src/event.js +0 -30
- package/dist/node_modules/d3-zoom/src/event.js.map +0 -1
- package/dist/node_modules/d3-zoom/src/index.js +0 -2
- package/dist/node_modules/d3-zoom/src/noevent.js +0 -11
- package/dist/node_modules/d3-zoom/src/noevent.js.map +0 -1
- package/dist/node_modules/d3-zoom/src/transform.js +0 -50
- package/dist/node_modules/d3-zoom/src/transform.js.map +0 -1
- package/dist/node_modules/d3-zoom/src/zoom.js +0 -219
- package/dist/node_modules/d3-zoom/src/zoom.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js +0 -56
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.development.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js +0 -54
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js +0 -54
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.development.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js +0 -46
- package/dist/node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/shim/index.js +0 -12
- package/dist/node_modules/use-sync-external-store/shim/index.js.map +0 -1
- package/dist/node_modules/use-sync-external-store/shim/with-selector.js +0 -12
- package/dist/node_modules/use-sync-external-store/shim/with-selector.js.map +0 -1
- package/dist/node_modules/zustand/esm/traditional.js +0 -17
- package/dist/node_modules/zustand/esm/traditional.js.map +0 -1
- package/dist/node_modules/zustand/esm/vanilla/shallow.js +0 -21
- package/dist/node_modules/zustand/esm/vanilla/shallow.js.map +0 -1
- package/dist/node_modules/zustand/esm/vanilla.js +0 -20
- package/dist/node_modules/zustand/esm/vanilla.js.map +0 -1
- package/dist/pages/ActionsPage.d.ts +0 -2
- package/dist/pages/ActionsPage.d.ts.map +0 -1
- package/dist/pages/AgentDetailsPage.d.ts +0 -5
- package/dist/pages/AgentDetailsPage.d.ts.map +0 -1
- package/dist/pages/AgentGraphPage.d.ts +0 -9
- package/dist/pages/AgentGraphPage.d.ts.map +0 -1
- package/dist/pages/AgentsLandingPage.d.ts +0 -12
- package/dist/pages/AgentsLandingPage.d.ts.map +0 -1
- package/dist/pages/AgentsPage.d.ts +0 -5
- package/dist/pages/AgentsPage.d.ts.map +0 -1
- package/dist/pages/AnalyticsPage.d.ts +0 -2
- package/dist/pages/AnalyticsPage.d.ts.map +0 -1
- package/dist/pages/CatalogDetailPage.d.ts +0 -2
- package/dist/pages/CatalogDetailPage.d.ts.map +0 -1
- package/dist/pages/CatalogDocsPage.d.ts +0 -2
- package/dist/pages/CatalogDocsPage.d.ts.map +0 -1
- package/dist/pages/CatalogPage.d.ts +0 -2
- package/dist/pages/CatalogPage.d.ts.map +0 -1
- package/dist/pages/ComponentDetailPage.d.ts +0 -2
- package/dist/pages/ComponentDetailPage.d.ts.map +0 -1
- package/dist/pages/ComponentDocsPage.d.ts +0 -2
- package/dist/pages/ComponentDocsPage.d.ts.map +0 -1
- package/dist/pages/ComponentsPage.d.ts +0 -2
- package/dist/pages/ComponentsPage.d.ts.map +0 -1
- package/dist/pages/GettingStartedPage.d.ts +0 -16
- package/dist/pages/GettingStartedPage.d.ts.map +0 -1
- package/dist/pages/HealthPage.d.ts +0 -2
- package/dist/pages/HealthPage.d.ts.map +0 -1
- package/dist/pages/LogsPage.d.ts +0 -2
- package/dist/pages/LogsPage.d.ts.map +0 -1
- package/dist/pages/NoteDetailsPage.d.ts +0 -2
- package/dist/pages/NoteDetailsPage.d.ts.map +0 -1
- package/dist/pages/OverviewPage.d.ts +0 -9
- package/dist/pages/OverviewPage.d.ts.map +0 -1
- package/dist/pages/SessionDetailsPage.d.ts +0 -6
- package/dist/pages/SessionDetailsPage.d.ts.map +0 -1
- package/dist/pages/SessionsPage.d.ts +0 -6
- package/dist/pages/SessionsPage.d.ts.map +0 -1
- package/dist/pages/SettingsPage.d.ts +0 -2
- package/dist/pages/SettingsPage.d.ts.map +0 -1
- package/dist/pages/SharedSessionPage.d.ts +0 -13
- package/dist/pages/SharedSessionPage.d.ts.map +0 -1
- package/dist/pages/SharedVibeDeckPage.d.ts +0 -8
- package/dist/pages/SharedVibeDeckPage.d.ts.map +0 -1
- package/dist/pages/TargetDetailsPage.d.ts +0 -13
- package/dist/pages/TargetDetailsPage.d.ts.map +0 -1
- package/dist/pages/TargetsPage.d.ts +0 -8
- package/dist/pages/TargetsPage.d.ts.map +0 -1
- package/dist/pages/TemplateDetailPage.d.ts +0 -2
- package/dist/pages/TemplateDetailPage.d.ts.map +0 -1
- package/dist/pages/TemplatesPage.d.ts +0 -2
- package/dist/pages/TemplatesPage.d.ts.map +0 -1
- package/dist/pages/TunnelsLandingPage.d.ts +0 -8
- package/dist/pages/TunnelsLandingPage.d.ts.map +0 -1
- package/dist/pages/VibeAuditPage.d.ts +0 -2
- package/dist/pages/VibeAuditPage.d.ts.map +0 -1
- package/dist/pages/VibeCalendarPage.d.ts +0 -9
- package/dist/pages/VibeCalendarPage.d.ts.map +0 -1
- package/dist/pages/VibeDeckPage.d.ts +0 -2
- package/dist/pages/VibeDeckPage.d.ts.map +0 -1
- package/dist/pages/VibeDetailsPage.d.ts +0 -5
- package/dist/pages/VibeDetailsPage.d.ts.map +0 -1
- package/dist/pages/VibeDocsPage.d.ts +0 -2
- package/dist/pages/VibeDocsPage.d.ts.map +0 -1
- package/dist/pages/VibeTaskDetailPage.d.ts +0 -9
- package/dist/pages/VibeTaskDetailPage.d.ts.map +0 -1
- package/dist/pages/VibesPage.d.ts +0 -5
- package/dist/pages/VibesPage.d.ts.map +0 -1
- package/dist/pages/WebhooksPage.d.ts +0 -5
- package/dist/pages/WebhooksPage.d.ts.map +0 -1
- package/dist/pages/ai/AIPage.d.ts +0 -6
- package/dist/pages/ai/AIPage.d.ts.map +0 -1
- package/dist/pages/ai/AISessionDetailPage.d.ts +0 -5
- package/dist/pages/ai/AISessionDetailPage.d.ts.map +0 -1
- package/dist/pages/ai/AgentManagerPage.d.ts +0 -9
- package/dist/pages/ai/AgentManagerPage.d.ts.map +0 -1
- package/dist/pages/index.d.ts +0 -17
- package/dist/pages/index.d.ts.map +0 -1
- package/dist/pages/tunnels/AuditTab.d.ts +0 -8
- package/dist/pages/tunnels/AuditTab.d.ts.map +0 -1
- package/dist/pages/tunnels/DomainsTab.d.ts +0 -2
- package/dist/pages/tunnels/DomainsTab.d.ts.map +0 -1
- package/dist/pages/tunnels/ProvidersTab.d.ts +0 -2
- package/dist/pages/tunnels/ProvidersTab.d.ts.map +0 -1
- package/dist/pages/tunnels/SessionsTab.d.ts +0 -8
- package/dist/pages/tunnels/SessionsTab.d.ts.map +0 -1
- package/dist/pages/tunnels/TunnelDetailsPage.d.ts +0 -2
- package/dist/pages/tunnels/TunnelDetailsPage.d.ts.map +0 -1
- package/dist/pages/tunnels/TunnelsTab.d.ts +0 -2
- package/dist/pages/tunnels/TunnelsTab.d.ts.map +0 -1
- package/dist/pages/tunnels/UsageTab.d.ts +0 -8
- package/dist/pages/tunnels/UsageTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelAuditTab.d.ts +0 -4
- package/dist/pages/tunnels/tabs/TunnelAuditTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelCliTab.d.ts +0 -8
- package/dist/pages/tunnels/tabs/TunnelCliTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelDomainsTab.d.ts +0 -8
- package/dist/pages/tunnels/tabs/TunnelDomainsTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelEndpointsTab.d.ts +0 -8
- package/dist/pages/tunnels/tabs/TunnelEndpointsTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelOverviewTab.d.ts +0 -8
- package/dist/pages/tunnels/tabs/TunnelOverviewTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelSessionsTab.d.ts +0 -4
- package/dist/pages/tunnels/tabs/TunnelSessionsTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelSettingsTab.d.ts +0 -9
- package/dist/pages/tunnels/tabs/TunnelSettingsTab.d.ts.map +0 -1
- package/dist/pages/tunnels/tabs/TunnelUsageTab.d.ts +0 -4
- package/dist/pages/tunnels/tabs/TunnelUsageTab.d.ts.map +0 -1
- package/dist/plugin.d.ts +0 -4
- package/dist/plugin.d.ts.map +0 -1
- package/dist/providers/AgentEventsProvider.d.ts +0 -79
- package/dist/providers/AgentEventsProvider.d.ts.map +0 -1
- package/dist/providers/VibeControlsProvider.d.ts +0 -29
- package/dist/providers/VibeControlsProvider.d.ts.map +0 -1
- package/dist/services/aiApi.d.ts +0 -310
- package/dist/services/aiApi.d.ts.map +0 -1
- package/dist/services/assistantApi.d.ts +0 -71
- package/dist/services/assistantApi.d.ts.map +0 -1
- package/dist/services/assistantExportService.d.ts +0 -9
- package/dist/services/assistantExportService.d.ts.map +0 -1
- package/dist/services/schedulerApi.d.ts +0 -18
- package/dist/services/schedulerApi.d.ts.map +0 -1
- package/dist/shared/hooks/useTr.d.ts +0 -17
- package/dist/shared/hooks/useTr.d.ts.map +0 -1
- package/dist/store/agentManagerStore.d.ts +0 -65
- package/dist/store/agentManagerStore.d.ts.map +0 -1
- package/dist/store/assistantStore.d.ts +0 -56
- package/dist/store/assistantStore.d.ts.map +0 -1
- package/dist/store/vibeControlsStore.d.ts +0 -68
- package/dist/store/vibeControlsStore.d.ts.map +0 -1
- package/dist/translations/en.d.ts +0 -2174
- package/dist/translations/en.d.ts.map +0 -1
- package/dist/types/agentManager.d.ts +0 -72
- package/dist/types/agentManager.d.ts.map +0 -1
- package/dist/types/assistant.d.ts +0 -58
- package/dist/types/assistant.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -134
- package/dist/types/index.d.ts.map +0 -1
- package/dist/utils/agentStatus.d.ts +0 -42
- package/dist/utils/agentStatus.d.ts.map +0 -1
- package/dist/utils/aiSessionNotFound.d.ts +0 -2
- package/dist/utils/aiSessionNotFound.d.ts.map +0 -1
- package/dist/utils/nativeBridge.d.ts +0 -3
- package/dist/utils/nativeBridge.d.ts.map +0 -1
- package/dist/utils/pageContext.d.ts +0 -23
- package/dist/utils/pageContext.d.ts.map +0 -1
- package/dist/utils/quotaUtils.d.ts +0 -8
- package/dist/utils/quotaUtils.d.ts.map +0 -1
- package/dist/utils/relativeTime.d.ts +0 -3
- package/dist/utils/relativeTime.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aiApi.js","names":[],"sources":["../../src/services/aiApi.ts"],"sourcesContent":["/**\n * AI API service layer\n *\n * Wraps workspace-owned AI prompt APIs and vibecontrols-agent AI REST API\n * endpoints exposed through wspace-vibecontrols-svc.\n *\n * Backend route prefix: /api/ai (mounted by vibe-plugin-ai v4.0.0)\n */\n\nimport { getStoredAuthToken, getStoredWorkspaceToken } from '@burdenoff/fe-libs/shared/graphql';\nimport type {\n AgentManagerMessage,\n FileAttachment,\n McpServer,\n ProviderMode,\n} from '@/types/agentManager';\n\n// ── Helpers ───────────────────────────────────────────────────────────\n\nfunction getWorkspaceId(): string {\n if (typeof window === 'undefined') return '';\n return new URLSearchParams(window.location.search).get('workspace') || '';\n}\n\nfunction getGatewayEndpoint(): string {\n if (typeof window === 'undefined') return '/workspaces/graphql';\n return '/workspaces/graphql';\n}\n\n/**\n * Sanitize error messages — strip HTML, Cloudflare error pages, and long technical details.\n * Returns a clean, user-friendly error string.\n */\nfunction sanitizeError(raw: string): string {\n // Detect Cloudflare tunnel errors (HTML error pages)\n if (raw.includes('Cloudflare Tunnel error') || raw.includes('cloudflare.com/5xx')) {\n return 'Agent tunnel is unreachable. The Cloudflare tunnel may have disconnected. Check if the agent is running and the tunnel is active.';\n }\n // Detect HTML responses\n if (raw.includes('<!DOCTYPE') || raw.includes('<html')) {\n return 'Unexpected HTML response. The agent may be unreachable or the tunnel may have changed.';\n }\n // Detect common network errors\n if (raw.includes('ECONNREFUSED') || raw.includes('ETIMEDOUT') || raw.includes('fetch failed')) {\n return 'Cannot connect to the agent. Check if it is running and accessible.';\n }\n if (\n raw.includes('Could not resolve authentication method') ||\n raw.includes('ANTHROPIC_API_KEY') ||\n raw.includes('ANTHROPIC_AUTH_TOKEN')\n ) {\n return 'Claude SDK auth is not configured on the agent. Open the AI Config tab and save either ANTHROPIC_API_KEY or ANTHROPIC_AUTH_TOKEN.';\n }\n // Detect proxy errors\n if (raw.includes('NOT_FOUND') || raw.includes('502') || raw.includes('503')) {\n return 'Agent service unavailable. The agent may be restarting or the service endpoint was not found.';\n }\n // Truncate very long errors\n if (raw.length > 200) {\n return raw.slice(0, 200) + '...';\n }\n return raw;\n}\n\nasync function gatewayFetch<T = unknown>(\n query: string,\n variables: Record<string, unknown>\n): Promise<T> {\n const res = await fetch(getGatewayEndpoint(), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(getStoredAuthToken() ? { Authorization: `Bearer ${getStoredAuthToken()}` } : {}),\n ...(getStoredWorkspaceToken()\n ? { 'X-Workspace-Authorization': `Bearer ${getStoredWorkspaceToken()}` }\n : {}),\n ...(getWorkspaceId() ? { 'x-workspace-id': getWorkspaceId() } : {}),\n },\n body: JSON.stringify({ query, variables }),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(sanitizeError(`Gateway error ${res.status}: ${text || res.statusText}`));\n }\n\n const json = (await res.json()) as { data?: T; errors?: Array<{ message?: string }> };\n if (json.errors?.length) {\n const msg = json.errors[0]?.message || 'GraphQL request failed';\n throw new Error(sanitizeError(msg));\n }\n if (!json.data) throw new Error('GraphQL request returned no data');\n return json.data;\n}\n\nexport async function agentAiGet<T = unknown>(\n agentId: string,\n path: string,\n query?: Record<string, unknown>\n): Promise<T> {\n const data = await gatewayFetch<{\n agentAiGet: {\n ok: boolean;\n status: number;\n data: T;\n text?: string | null;\n error?: string | null;\n };\n }>(\n `query AgentAiGet($agentId: ID!, $path: String!, $query: JSON) {\n agentAiGet(agentId: $agentId, path: $path, query: $query) {\n ok\n status\n data\n text\n error\n }\n }`,\n { agentId, path, query: query ?? null }\n );\n\n if (!data.agentAiGet.ok) {\n throw new Error(\n sanitizeError(data.agentAiGet.error || `Agent API error ${data.agentAiGet.status}`)\n );\n }\n return data.agentAiGet.data;\n}\n\nasync function agentAiMutate<T = unknown>(\n agentId: string,\n path: string,\n method: string,\n body?: unknown\n): Promise<T> {\n const data = await gatewayFetch<{\n agentAiMutate: {\n ok: boolean;\n status: number;\n data: T;\n text?: string | null;\n error?: string | null;\n };\n }>(\n `mutation AgentAiMutate($agentId: ID!, $path: String!, $method: String!, $body: JSON) {\n agentAiMutate(agentId: $agentId, path: $path, method: $method, body: $body) {\n ok\n status\n data\n text\n error\n }\n }`,\n { agentId, path, method, body: body ?? null }\n );\n\n if (!data.agentAiMutate.ok) {\n throw new Error(\n sanitizeError(data.agentAiMutate.error || `Agent API error ${data.agentAiMutate.status}`)\n );\n }\n return data.agentAiMutate.data;\n}\n\nexport async function getAgentConfigValue(agentId: string, key: string): Promise<string | null> {\n try {\n const data = await agentAiGet<{ key?: string; value?: string }>(\n agentId,\n `/api/config/${encodeURIComponent(key)}`\n );\n return typeof data.value === 'string' ? data.value : null;\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.toLowerCase().includes('configuration key not found')\n ) {\n return null;\n }\n throw error;\n }\n}\n\nexport async function setAgentConfigValue(\n agentId: string,\n key: string,\n value: string\n): Promise<void> {\n await agentAiMutate(agentId, `/api/config/${encodeURIComponent(key)}`, 'PUT', { value });\n}\n\nexport async function deleteAgentConfigValue(agentId: string, key: string): Promise<void> {\n await agentAiMutate(agentId, `/api/config/${encodeURIComponent(key)}`, 'DELETE');\n}\n\nfunction qs(params?: Record<string, unknown>): string {\n if (!params) return '';\n const entries = Object.entries(params).filter(\n ([, v]) => v !== undefined && v !== null && v !== ''\n );\n if (entries.length === 0) return '';\n const search = new URLSearchParams();\n for (const [k, v] of entries) search.set(k, String(v));\n return `?${search.toString()}`;\n}\n\n// ── Types ─────────────────────────────────────────────────────────────\n\nexport interface AITemplate {\n id: string;\n name: string;\n content: string;\n description?: string | null;\n category?: string | null;\n variables: Record<string, unknown>;\n tags: string[];\n isShared?: boolean;\n usageCount?: number;\n metadata?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface AIContext {\n id: string;\n name: string;\n type: string;\n content: string;\n tags: string[];\n metadata?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface AISession {\n id: string;\n name: string;\n agentType: string;\n providerPlugin?: string;\n status: 'active' | 'idle' | 'processing' | 'error' | 'terminated';\n stats?: Record<string, unknown>;\n config?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n terminatedAt?: string | null;\n}\n\nexport interface AISessionLog {\n id: string;\n sessionId: string;\n type: 'input' | 'output' | 'thinking' | 'event' | 'error' | 'metadata';\n content: string;\n message: string;\n tokenCount?: number;\n model?: string;\n durationMs?: number;\n agentMetadata?: Record<string, unknown>;\n timestamp: string;\n createdAt: string;\n}\n\nexport interface AISessionStats {\n session: { id: string; name: string; agentType: string; status: string; createdAt: string };\n stats: {\n totalLogs: number;\n totalInputTokens: number;\n totalOutputTokens: number;\n totalDurationMs: number;\n logsByType: Record<string, number>;\n };\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n promptCount: number;\n averageLatency?: number;\n}\n\nexport interface AIDispatch {\n id: string;\n templateId?: string | null;\n content: string;\n prompt: string;\n resolvedVariables?: Record<string, unknown>;\n contextIds?: string[];\n sessionId?: string | null;\n status: string;\n result?: Record<string, unknown> | null;\n scheduledAt?: string | null;\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface AIQueueItem {\n id: string;\n dispatchedPromptId: string;\n sessionId: string;\n priority: number;\n status: 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled';\n attempts: number;\n maxAttempts: number;\n lastError?: string | null;\n createdAt?: string;\n}\n\nexport interface AIStatsOverview {\n totalSessions: number;\n activeSessions: number;\n totalInputTokens: number;\n totalOutputTokens: number;\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n totalRequests: number;\n sessionsByAgentType: Record<string, number>;\n queuedPrompts: number;\n}\n\nexport interface AIUsageStats {\n usage: Record<\n string,\n { inputTokens: number; outputTokens: number; requestCount: number; sessionCount: number }\n >;\n byProvider: Array<{\n provider: string;\n tokens: number;\n sessions: number;\n cost?: number;\n inputTokens: number;\n outputTokens: number;\n requestCount: number;\n }>;\n byStatus: Array<{ status: string; count: number }>;\n}\n\nexport interface AIProvider {\n pluginName: string;\n name?: string;\n displayName?: string;\n isDefault: boolean;\n currentMode?: ProviderMode;\n defaultMode?: ProviderMode;\n supportedModes?: ProviderMode[];\n unsupportedModes?: ProviderMode[];\n modes?: Record<ProviderMode, boolean>;\n prereqApiPrefix?: string;\n}\n\nexport interface AIApiParameter {\n name: string;\n type: string;\n required: boolean;\n description: string;\n}\n\nexport interface AIApiEndpoint {\n id: string;\n method: string;\n path: string;\n description: string;\n parameters?: AIApiParameter[];\n body?: AIApiParameter[];\n}\n\nexport interface AITool {\n name: string;\n displayName: string;\n description: string;\n installed: boolean;\n version?: string;\n configFiles?: string[];\n foundConfigs?: string[];\n installCommand?: string;\n}\n\n// ── Paginated response wrapper ───────────────────────────────────────\n\nexport interface PaginatedResponse<T> {\n items: T[];\n total: number;\n hasMore: boolean;\n}\n\ninterface RawAITemplate extends Omit<AITemplate, 'variables' | 'tags' | 'prompt'> {\n variables?: Record<string, unknown> | string[] | null;\n tags?: string[] | null;\n}\n\ninterface RawAISessionLog extends Omit<AISessionLog, 'message' | 'timestamp'> {\n message?: string;\n timestamp?: string;\n}\n\ninterface RawAISessionStats {\n session?: AISessionStats['session'];\n stats?: Partial<AISessionStats['stats']>;\n totalTokens?: number;\n inputTokens?: number;\n outputTokens?: number;\n promptCount?: number;\n averageLatency?: number;\n}\n\ninterface RawAIDispatch extends Omit<AIDispatch, 'prompt'> {\n prompt?: string;\n}\n\ninterface RawAIStatsOverview {\n totalSessions?: number;\n activeSessions?: number;\n totalInputTokens?: number;\n totalOutputTokens?: number;\n totalTokens?: number;\n inputTokens?: number;\n outputTokens?: number;\n totalRequests?: number;\n sessionsByAgentType?: Record<string, number>;\n queuedPrompts?: number;\n}\n\ninterface RawAIUsageStats {\n usage?: AIUsageStats['usage'];\n byProvider?: AIUsageStats['byProvider'];\n byStatus?: AIUsageStats['byStatus'];\n}\n\ninterface RawAIApiEndpoint {\n method: string;\n path: string;\n description: string;\n parameters?: Record<string, { type: string; required: boolean; description: string }>;\n body?: Record<string, { type: string; required: boolean; description: string }>;\n}\n\nfunction normalizeTemplate(template: RawAITemplate): AITemplate {\n const variables = Array.isArray(template.variables)\n ? Object.fromEntries(template.variables.map((name) => [String(name), '']))\n : (template.variables ?? {});\n\n return {\n ...template,\n description: template.description ?? null,\n variables,\n tags: template.tags ?? [],\n };\n}\n\nfunction normalizeSessionLog(log: RawAISessionLog): AISessionLog {\n return {\n ...log,\n message: log.message ?? log.content,\n timestamp: log.timestamp ?? log.createdAt,\n };\n}\n\nfunction normalizeSessionStats(stats: RawAISessionStats): AISessionStats {\n const statBlock = stats.stats ?? {};\n const inputTokens = stats.inputTokens ?? statBlock.totalInputTokens ?? 0;\n const outputTokens = stats.outputTokens ?? statBlock.totalOutputTokens ?? 0;\n const promptCount = stats.promptCount ?? statBlock.totalLogs ?? 0;\n const totalDurationMs = statBlock.totalDurationMs ?? 0;\n\n return {\n session: stats.session ?? {\n id: '',\n name: '',\n agentType: '',\n status: '',\n createdAt: '',\n },\n stats: {\n totalLogs: statBlock.totalLogs ?? 0,\n totalInputTokens: statBlock.totalInputTokens ?? inputTokens,\n totalOutputTokens: statBlock.totalOutputTokens ?? outputTokens,\n totalDurationMs,\n logsByType: statBlock.logsByType ?? {},\n },\n totalTokens: stats.totalTokens ?? inputTokens + outputTokens,\n inputTokens,\n outputTokens,\n promptCount,\n averageLatency:\n stats.averageLatency ?? (promptCount > 0 ? totalDurationMs / promptCount : undefined),\n };\n}\n\nfunction normalizeDispatch(dispatch: RawAIDispatch): AIDispatch {\n return {\n ...dispatch,\n prompt: dispatch.prompt ?? dispatch.content,\n };\n}\n\nfunction normalizeStatsOverview(stats: RawAIStatsOverview): AIStatsOverview {\n const inputTokens = stats.inputTokens ?? stats.totalInputTokens ?? 0;\n const outputTokens = stats.outputTokens ?? stats.totalOutputTokens ?? 0;\n\n return {\n totalSessions: stats.totalSessions ?? 0,\n activeSessions: stats.activeSessions ?? 0,\n totalInputTokens: stats.totalInputTokens ?? inputTokens,\n totalOutputTokens: stats.totalOutputTokens ?? outputTokens,\n totalTokens: stats.totalTokens ?? inputTokens + outputTokens,\n inputTokens,\n outputTokens,\n totalRequests: stats.totalRequests ?? 0,\n sessionsByAgentType: stats.sessionsByAgentType ?? {},\n queuedPrompts: stats.queuedPrompts ?? 0,\n };\n}\n\nfunction normalizeUsageStats(usageStats: RawAIUsageStats): AIUsageStats {\n const usage = usageStats.usage ?? {};\n const byProvider =\n usageStats.byProvider ??\n Object.entries(usage).map(([provider, stats]) => ({\n provider,\n tokens: stats.inputTokens + stats.outputTokens,\n sessions: stats.sessionCount,\n inputTokens: stats.inputTokens,\n outputTokens: stats.outputTokens,\n requestCount: stats.requestCount,\n }));\n\n return {\n usage,\n byProvider,\n byStatus: usageStats.byStatus ?? [],\n };\n}\n\nfunction normalizeApiEndpoint(endpoint: RawAIApiEndpoint): AIApiEndpoint {\n const normalizeFields = (\n fields?: Record<string, { type: string; required: boolean; description: string }>\n ): AIApiParameter[] =>\n Object.entries(fields ?? {}).map(([name, config]) => ({\n name,\n type: config.type,\n required: config.required,\n description: config.description,\n }));\n\n return {\n id: `${endpoint.method.toUpperCase()} ${endpoint.path}`,\n method: endpoint.method,\n path: endpoint.path,\n description: endpoint.description,\n parameters: normalizeFields(endpoint.parameters),\n body: normalizeFields(endpoint.body),\n };\n}\n\n// ── Tools ─────────────────────────────────────────────────────────────\n\nexport async function fetchTools(agentId: string): Promise<AITool[]> {\n const data = await agentAiGet<{ tools: AITool[] }>(agentId, '/api/ai/tools');\n return data.tools;\n}\n\n// ── Templates (workspace-owned AI prompts) ───────────────────────────\n\nconst AI_PROMPT_FIELDS = `\n id\n name\n description\n content\n category\n variables\n isShared\n usageCount\n tags\n metadata\n createdAt\n updatedAt\n`;\n\nconst LIST_AI_PROMPTS_QUERY = `query ListAIPrompts($filter: AIPromptFilterInput, $pagination: PaginationInput) {\n aiPrompts(filter: $filter, pagination: $pagination) {\n items {\n ${AI_PROMPT_FIELDS}\n }\n total\n hasMore\n }\n}`;\n\nconst CREATE_AI_PROMPT_MUTATION = `mutation CreateAIPrompt($input: CreateAIPromptInput!) {\n createAIPrompt(input: $input) {\n ${AI_PROMPT_FIELDS}\n }\n}`;\n\nconst UPDATE_AI_PROMPT_MUTATION = `mutation UpdateAIPrompt($id: ID!, $input: UpdateAIPromptInput!) {\n updateAIPrompt(id: $id, input: $input) {\n ${AI_PROMPT_FIELDS}\n }\n}`;\n\nconst DELETE_AI_PROMPT_MUTATION = `mutation DeleteAIPrompt($id: ID!) {\n deleteAIPrompt(id: $id)\n}`;\n\nconst RENDER_AI_PROMPT_MUTATION = `mutation RenderAIPrompt($id: ID!, $variables: JSON) {\n renderAIPrompt(id: $id, variables: $variables) {\n promptId\n rendered\n }\n}`;\n\nconst RECORD_AI_PROMPT_USAGE_MUTATION = `mutation RecordAIPromptUsage($id: ID!) {\n recordAIPromptUsage(id: $id) {\n ${AI_PROMPT_FIELDS}\n }\n}`;\n\ntype AITemplateInput = {\n name: string;\n content: string;\n description?: string | null;\n category?: string | null;\n status?: string | null;\n variables?: Record<string, unknown> | string[] | null;\n tags?: string[];\n isShared?: boolean;\n metadata?: Record<string, unknown>;\n};\n\ntype AITemplateUpdateInput = Partial<AITemplateInput>;\n\nfunction enumInput(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim().toUpperCase() : undefined;\n}\n\nfunction numberInput(value: unknown, fallback: number): number {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return fallback;\n}\n\nfunction buildAIPromptListVariables(params?: Record<string, unknown>): {\n filter: Record<string, unknown> | null;\n pagination: { limit: number; offset: number };\n} {\n const filter: Record<string, unknown> = {};\n const search = typeof params?.search === 'string' ? params.search.trim() : '';\n if (search) filter.search = search;\n\n const category = enumInput(params?.category);\n if (category) filter.category = category;\n\n const status = enumInput(params?.status);\n if (status) filter.status = status;\n\n if (typeof params?.isShared === 'boolean') filter.isShared = params.isShared;\n if (Array.isArray(params?.tags)) filter.tags = params.tags.map(String).filter(Boolean);\n if (typeof params?.createdBy === 'string' && params.createdBy.trim()) {\n filter.createdBy = params.createdBy.trim();\n }\n\n return {\n filter: Object.keys(filter).length > 0 ? filter : null,\n pagination: {\n limit: Math.min(Math.max(numberInput(params?.limit, 50), 1), 500),\n offset: Math.max(numberInput(params?.offset, 0), 0),\n },\n };\n}\n\nfunction toAIPromptInput(input: AITemplateInput | AITemplateUpdateInput): Record<string, unknown> {\n const promptInput: Record<string, unknown> = {};\n\n if (input.name !== undefined) promptInput.name = input.name;\n if (input.content !== undefined) promptInput.content = input.content;\n if (input.description !== undefined) promptInput.description = input.description;\n if (input.variables !== undefined) promptInput.variables = input.variables;\n if (input.tags !== undefined) promptInput.tags = input.tags;\n if (input.isShared !== undefined) promptInput.isShared = input.isShared;\n if (input.metadata !== undefined) promptInput.metadata = input.metadata;\n\n const category = enumInput(input.category);\n if (category) promptInput.category = category;\n\n const status = enumInput(input.status);\n if (status) promptInput.status = status;\n\n return promptInput;\n}\n\nexport async function fetchTemplates(\n _agentId: string,\n params?: Record<string, unknown>\n): Promise<AITemplate[]> {\n const data = await gatewayFetch<{ aiPrompts: PaginatedResponse<RawAITemplate> }>(\n LIST_AI_PROMPTS_QUERY,\n buildAIPromptListVariables(params)\n );\n return data.aiPrompts.items.map(normalizeTemplate);\n}\n\nexport async function createTemplate(\n _agentId: string,\n input: AITemplateInput\n): Promise<AITemplate> {\n const data = await gatewayFetch<{ createAIPrompt: RawAITemplate }>(CREATE_AI_PROMPT_MUTATION, {\n input: toAIPromptInput(input),\n });\n return normalizeTemplate(data.createAIPrompt);\n}\n\nexport async function recordTemplateUsage(_agentId: string, id: string): Promise<AITemplate> {\n const data = await gatewayFetch<{ recordAIPromptUsage: RawAITemplate }>(\n RECORD_AI_PROMPT_USAGE_MUTATION,\n { id }\n );\n return normalizeTemplate(data.recordAIPromptUsage);\n}\n\nexport async function updateTemplate(\n _agentId: string,\n id: string,\n input: AITemplateUpdateInput\n): Promise<AITemplate> {\n const data = await gatewayFetch<{ updateAIPrompt: RawAITemplate }>(UPDATE_AI_PROMPT_MUTATION, {\n id,\n input: toAIPromptInput(input),\n });\n return normalizeTemplate(data.updateAIPrompt);\n}\n\nexport async function deleteTemplate(_agentId: string, id: string): Promise<void> {\n await gatewayFetch<{ deleteAIPrompt: boolean }>(DELETE_AI_PROMPT_MUTATION, { id });\n}\n\nexport async function renderTemplate(\n _agentId: string,\n id: string,\n variables: Record<string, unknown>\n): Promise<{ rendered: string }> {\n const data = await gatewayFetch<{ renderAIPrompt: { promptId: string; rendered: string } }>(\n RENDER_AI_PROMPT_MUTATION,\n { id, variables }\n );\n return { rendered: data.renderAIPrompt.rendered };\n}\n\n// ── Contexts (backend route: /api/ai/contexts) ──────────────────────\n\nexport async function fetchContexts(\n agentId: string,\n params?: Record<string, unknown>\n): Promise<AIContext[]> {\n const data = await agentAiGet<PaginatedResponse<AIContext>>(agentId, '/api/ai/contexts', params);\n return data.items;\n}\n\nexport async function createContext(\n agentId: string,\n input: {\n name: string;\n type: string;\n content: string;\n tags?: string[];\n metadata?: Record<string, unknown>;\n }\n): Promise<AIContext> {\n return agentAiMutate<AIContext>(agentId, '/api/ai/contexts', 'POST', input);\n}\n\nexport async function updateContext(\n agentId: string,\n id: string,\n input: Partial<{\n name: string;\n type: string;\n content: string;\n tags: string[];\n metadata: Record<string, unknown>;\n }>\n): Promise<AIContext> {\n return agentAiMutate<AIContext>(agentId, `/api/ai/contexts/${id}`, 'PUT', input);\n}\n\nexport async function deleteContext(agentId: string, id: string): Promise<void> {\n await agentAiMutate(agentId, `/api/ai/contexts/${id}`, 'DELETE');\n}\n\n// ── Sessions (backend route: /api/ai/sessions) ──────────────────────\n\nexport async function fetchSessions(\n agentId: string,\n params?: Record<string, unknown>\n): Promise<AISession[]> {\n const data = await agentAiGet<PaginatedResponse<AISession>>(agentId, '/api/ai/sessions', params);\n return data.items;\n}\n\nexport async function fetchSessionsPaginated(\n agentId: string,\n params?: { limit?: number; offset?: number; search?: string; agentType?: string; status?: string }\n): Promise<PaginatedResponse<AISession>> {\n return agentAiGet<PaginatedResponse<AISession>>(\n agentId,\n '/api/ai/sessions',\n params as Record<string, unknown>\n );\n}\n\nexport async function createSession(\n agentId: string,\n input: { name: string; agentType: string; config?: Record<string, unknown> }\n): Promise<AISession> {\n return agentAiMutate<AISession>(agentId, '/api/ai/sessions', 'POST', input);\n}\n\nexport async function sendPromptToSession(\n agentId: string,\n sessionId: string,\n prompt: string,\n contexts?: string[],\n options?: {\n agentType?: string;\n model?: string;\n mode?: string;\n conversationHistory?: Array<{ role: string; content: string }>;\n }\n): Promise<{\n response: string;\n tokens?: { input: number; output: number };\n [key: string]: unknown;\n}> {\n const data = await agentAiMutate<Record<string, unknown>>(\n agentId,\n `/api/ai/sessions/${sessionId}/send`,\n 'POST',\n {\n prompt,\n contexts,\n ...(options?.agentType ? { agentType: options.agentType } : {}),\n ...(options?.model ? { model: options.model } : {}),\n ...(options?.mode ? { mode: options.mode } : {}),\n ...(options?.conversationHistory?.length\n ? { conversationHistory: options.conversationHistory }\n : {}),\n }\n );\n const rawTokens = data.tokens as Record<string, unknown> | undefined;\n\n return {\n ...data,\n response: String(data.response ?? data.content ?? data.message ?? ''),\n tokens:\n rawTokens && (typeof rawTokens.input === 'number' || typeof rawTokens.output === 'number')\n ? {\n input: Number(rawTokens.input ?? 0),\n output: Number(rawTokens.output ?? 0),\n }\n : undefined,\n };\n}\n\nexport async function fetchSessionLogs(\n agentId: string,\n sessionId: string,\n params?: Record<string, unknown>\n): Promise<AISessionLog[]> {\n const data = await agentAiGet<PaginatedResponse<RawAISessionLog>>(\n agentId,\n `/api/ai/sessions/${sessionId}/logs`,\n params\n );\n return data.items.map(normalizeSessionLog);\n}\n\nexport async function fetchSessionStats(\n agentId: string,\n sessionId: string\n): Promise<AISessionStats> {\n return normalizeSessionStats(\n await agentAiGet<RawAISessionStats>(agentId, `/api/ai/sessions/${sessionId}/stats`)\n );\n}\n\nexport async function updateSessionConfig(\n agentId: string,\n sessionId: string,\n config: Record<string, unknown>\n): Promise<AISession> {\n return agentAiMutate<AISession>(agentId, `/api/ai/sessions/${sessionId}/config`, 'PUT', config);\n}\n\nexport async function terminateSession(agentId: string, sessionId: string): Promise<void> {\n await agentAiMutate(agentId, `/api/ai/sessions/${sessionId}`, 'DELETE');\n}\n\n// ── Prompt Composition & Dispatch (backend route: /api/ai/dispatch) ──\n\nexport async function composePrompt(\n agentId: string,\n input: {\n templateId?: string;\n variables?: Record<string, unknown>;\n content?: string;\n contextIds?: string[];\n sessionId?: string;\n }\n): Promise<{ dispatch: AIDispatch; preview: string }> {\n return agentAiMutate<{ dispatch: AIDispatch; preview: string }>(\n agentId,\n '/api/ai/dispatch/compose',\n 'POST',\n input\n );\n}\n\nexport async function sendDispatch(\n agentId: string,\n input: {\n dispatchId?: string;\n prompt?: string;\n content?: string;\n sessionId?: string;\n contextIds?: string[];\n scheduledAt?: string;\n }\n): Promise<{ status: string; dispatchId: string; sessionId: string }> {\n return agentAiMutate<{ status: string; dispatchId: string; sessionId: string }>(\n agentId,\n '/api/ai/dispatch/send',\n 'POST',\n {\n ...input,\n content: input.content ?? input.prompt,\n }\n );\n}\n\nexport async function fetchDispatchHistory(\n agentId: string,\n params?: Record<string, unknown>\n): Promise<AIDispatch[]> {\n const data = await agentAiGet<PaginatedResponse<RawAIDispatch>>(\n agentId,\n '/api/ai/dispatch/history',\n params\n );\n return data.items.map(normalizeDispatch);\n}\n\n// ── Queue (backend route: /api/ai/queue) ─────────────────────────────\n\nexport async function fetchQueueItems(\n agentId: string,\n params?: Record<string, unknown>\n): Promise<AIQueueItem[]> {\n const data = await agentAiGet<PaginatedResponse<AIQueueItem>>(agentId, '/api/ai/queue', params);\n return data.items;\n}\n\nexport async function enqueueItem(\n agentId: string,\n input: {\n dispatchedPromptId: string;\n sessionId: string;\n priority?: number;\n scheduledAt?: string;\n maxAttempts?: number;\n }\n): Promise<AIQueueItem> {\n return agentAiMutate<AIQueueItem>(agentId, '/api/ai/queue/enqueue', 'POST', input);\n}\n\nexport async function cancelQueueItem(agentId: string, id: string): Promise<void> {\n await agentAiMutate(agentId, `/api/ai/queue/${id}/cancel`, 'POST');\n}\n\n// ── Stats (backend route: /api/ai/stats) ─────────────────────────────\n\nexport async function fetchStatsOverview(agentId: string): Promise<AIStatsOverview> {\n return normalizeStatsOverview(\n await agentAiGet<RawAIStatsOverview>(agentId, '/api/ai/stats/overview')\n );\n}\n\nexport async function fetchUsageStats(agentId: string): Promise<AIUsageStats> {\n return normalizeUsageStats(await agentAiGet<RawAIUsageStats>(agentId, '/api/ai/stats/usage'));\n}\n\n// ── Providers (backend route: /api/ai/sessions/providers) ────────────\n\nexport async function fetchProviders(agentId: string): Promise<AIProvider[]> {\n const data = await agentAiGet<{ providers: AIProvider[] }>(agentId, '/api/ai/sessions/providers');\n return data.providers;\n}\n\n// ── API Descriptor (backend route: /api/ai/descriptor) ───────────────\n\nexport async function fetchApiDescriptor(agentId: string): Promise<AIApiEndpoint[]> {\n const data = await agentAiGet<{ name: string; version: string; endpoints: RawAIApiEndpoint[] }>(\n agentId,\n '/api/ai/descriptor'\n );\n return data.endpoints.map(normalizeApiEndpoint);\n}\n\n// ── Agent Manager extensions ────────────────────────────────────────\n\nexport interface AIModelInfo {\n id: string;\n name: string;\n provider: string;\n contextWindow?: number;\n maxOutputTokens?: number;\n}\n\nexport interface SearchResult {\n sessionId: string;\n sessionName: string;\n messageId?: string;\n content: string;\n timestamp: string;\n score?: number;\n}\n\nexport async function renameSession(\n agentId: string,\n sessionId: string,\n name: string\n): Promise<AISession> {\n return agentAiMutate<AISession>(agentId, `/api/ai/sessions/${sessionId}`, 'PATCH', { name });\n}\n\nexport async function bulkDeleteSessions(agentId: string, ids: string[]): Promise<void> {\n await agentAiMutate(agentId, '/api/ai/sessions/bulk-delete', 'POST', { ids });\n}\n\nexport async function fetchSessionMessages(\n agentId: string,\n sessionId: string\n): Promise<AgentManagerMessage[]> {\n const data = await agentAiGet<{ messages: AgentManagerMessage[] }>(\n agentId,\n `/api/ai/sessions/${sessionId}/messages`\n );\n return data.messages;\n}\n\nexport async function searchSessions(\n agentId: string,\n query: string,\n params?: Record<string, unknown>\n): Promise<SearchResult[]> {\n const data = await agentAiGet<{ results: SearchResult[] }>(agentId, '/api/ai/sessions/search', {\n query,\n ...params,\n });\n return data.results;\n}\n\nexport async function fetchMcpServers(agentId: string): Promise<McpServer[]> {\n const data = await agentAiGet<{ servers: McpServer[] }>(agentId, '/api/ai/mcp/servers');\n return data.servers;\n}\n\nexport async function switchSessionModel(\n agentId: string,\n sessionId: string,\n model: string\n): Promise<void> {\n await agentAiMutate(agentId, `/api/ai/sessions/${sessionId}/model`, 'PUT', { model });\n}\n\nexport async function switchSessionSdk(\n agentId: string,\n sessionId: string,\n sdk: string\n): Promise<void> {\n await agentAiMutate(agentId, `/api/ai/sessions/${sessionId}/sdk`, 'PUT', { sdk });\n}\n\nexport async function switchSessionMode(\n agentId: string,\n sessionId: string,\n mode: string\n): Promise<void> {\n await agentAiMutate(agentId, `/api/ai/sessions/${sessionId}/mode`, 'PUT', { mode });\n}\n\nexport async function cancelSessionRequest(agentId: string, sessionId: string): Promise<void> {\n await agentAiMutate(agentId, `/api/ai/sessions/${sessionId}/cancel`, 'POST');\n}\n\nexport async function fetchModels(agentId: string, provider?: string): Promise<AIModelInfo[]> {\n const data = await agentAiGet<{ models: AIModelInfo[] }>(\n agentId,\n '/api/ai/models',\n provider ? { provider } : undefined\n );\n return data.models;\n}\n\nexport async function exportSession(\n agentId: string,\n sessionId: string,\n format: 'json' | 'markdown'\n): Promise<Blob> {\n const data = await agentAiGet<Record<string, unknown>>(\n agentId,\n `/api/ai/sessions/${sessionId}/export`,\n { format }\n );\n const content = format === 'json' ? JSON.stringify(data, null, 2) : String(data.content ?? '');\n const mimeType = format === 'json' ? 'application/json' : 'text/markdown';\n return new Blob([content], { type: mimeType });\n}\n\nexport async function uploadSessionFile(\n agentId: string,\n sessionId: string,\n file: File\n): Promise<FileAttachment> {\n const arrayBuffer = await file.arrayBuffer();\n const base64 = btoa(\n new Uint8Array(arrayBuffer).reduce((acc, byte) => acc + String.fromCharCode(byte), '')\n );\n return agentAiMutate<FileAttachment>(agentId, `/api/ai/sessions/${sessionId}/files`, 'POST', {\n name: file.name,\n mimeType: file.type,\n size: file.size,\n content: base64,\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"aiApi.js","names":[],"sources":["../../src/services/aiApi.ts"],"sourcesContent":["/**\n * AI API service layer\n *\n * Wraps workspace-owned AI prompt APIs and vibecontrols-agent AI REST API\n * endpoints exposed through wspace-vibecontrols-svc.\n *\n * Backend route prefix: /api/ai (mounted by vibe-plugin-ai v4.0.0)\n */\n\nimport {\n getStoredAuthToken,\n getStoredWorkspaceId,\n getStoredWorkspaceToken,\n} from '@burdenoff/fe-libs/shared/graphql';\nimport type {\n AgentManagerMessage,\n FileAttachment,\n McpServer,\n ProviderMode,\n} from '@/types/agentManager';\n\n// ── Helpers ───────────────────────────────────────────────────────────\n\n// Reads from ActiveContextStorage (URL → storage fallback chain). Previously\n// parsed only `?workspace=` from window.location.search, which is empty when\n// the user navigates between MFE routes that don't carry the param. Result:\n// gateway received no `x-workspace-id`, backend `agentAiGet` resolver threw\n// `WorkspaceRequiredError` and the chat pane surfaced \"Unexpected error\".\nfunction getWorkspaceId(): string {\n return getStoredWorkspaceId() ?? '';\n}\n\nfunction getGatewayEndpoint(): string {\n if (typeof window === 'undefined') return '/workspaces/graphql';\n return '/workspaces/graphql';\n}\n\n/**\n * Sanitize error messages — strip HTML, Cloudflare error pages, and long technical details.\n * Returns a clean, user-friendly error string.\n */\nfunction sanitizeError(raw: string): string {\n // Detect Cloudflare tunnel errors (HTML error pages)\n if (raw.includes('Cloudflare Tunnel error') || raw.includes('cloudflare.com/5xx')) {\n return 'Agent tunnel is unreachable. The Cloudflare tunnel may have disconnected. Check if the agent is running and the tunnel is active.';\n }\n // Detect HTML responses\n if (raw.includes('<!DOCTYPE') || raw.includes('<html')) {\n return 'Unexpected HTML response. The agent may be unreachable or the tunnel may have changed.';\n }\n // Detect common network errors\n if (raw.includes('ECONNREFUSED') || raw.includes('ETIMEDOUT') || raw.includes('fetch failed')) {\n return 'Cannot connect to the agent. Check if it is running and accessible.';\n }\n if (\n raw.includes('Could not resolve authentication method') ||\n raw.includes('ANTHROPIC_API_KEY') ||\n raw.includes('ANTHROPIC_AUTH_TOKEN')\n ) {\n return 'Claude SDK auth is not configured on the agent. Open the AI Config tab and save either ANTHROPIC_API_KEY or ANTHROPIC_AUTH_TOKEN.';\n }\n // Detect proxy errors\n if (raw.includes('NOT_FOUND') || raw.includes('502') || raw.includes('503')) {\n return 'Agent service unavailable. The agent may be restarting or the service endpoint was not found.';\n }\n // Truncate very long errors\n if (raw.length > 200) {\n return raw.slice(0, 200) + '...';\n }\n return raw;\n}\n\n/**\n * Identifier for an agent + its profile name. Every aiApi function takes\n * one of these so the canonical path `/api/profiles/<profile>/<rest>` can\n * be constructed at every callsite. Callers should pass\n * `{ id: agent.id, profile: agent.metadata?.profile ?? 'default' }`.\n */\nexport interface AgentRef {\n id: string;\n profile: string;\n}\n\n/**\n * Build the canonical agent-API path for a given profile + path segment.\n * The svc-side proxy validates that paths are exactly of the form\n * `/api/profiles/<name>/<rest>` (or one of the bare carve-outs), so every\n * callsite builds the path explicitly via this helper instead of the\n * proxy doing any rewriting.\n *\n * Example: `agentApiPath('default', '/ai/sessions')` →\n * `/api/profiles/default/ai/sessions`.\n */\nexport function agentApiPath(profile: string, segment: string): string {\n const seg = segment.startsWith('/') ? segment : `/${segment}`;\n return `/api/profiles/${encodeURIComponent(profile)}${seg}`;\n}\n\nasync function gatewayFetch<T = unknown>(\n query: string,\n variables: Record<string, unknown>\n): Promise<T> {\n const res = await fetch(getGatewayEndpoint(), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(getStoredAuthToken() ? { Authorization: `Bearer ${getStoredAuthToken()}` } : {}),\n ...(getStoredWorkspaceToken()\n ? { 'X-Workspace-Authorization': `Bearer ${getStoredWorkspaceToken()}` }\n : {}),\n ...(getWorkspaceId() ? { 'x-workspace-id': getWorkspaceId() } : {}),\n },\n body: JSON.stringify({ query, variables }),\n });\n\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(sanitizeError(`Gateway error ${res.status}: ${text || res.statusText}`));\n }\n\n const json = (await res.json()) as { data?: T; errors?: Array<{ message?: string }> };\n if (json.errors?.length) {\n const msg = json.errors[0]?.message || 'GraphQL request failed';\n throw new Error(sanitizeError(msg));\n }\n if (!json.data) throw new Error('GraphQL request returned no data');\n return json.data;\n}\n\nexport async function agentAiGet<T = unknown>(\n agentId: string,\n path: string,\n query?: Record<string, unknown>\n): Promise<T> {\n const data = await gatewayFetch<{\n agentAiGet: {\n ok: boolean;\n status: number;\n data: T;\n text?: string | null;\n error?: string | null;\n };\n }>(\n `query AgentAiGet($agentId: ID!, $path: String!, $query: JSON) {\n agentAiGet(agentId: $agentId, path: $path, query: $query) {\n ok\n status\n data\n text\n error\n }\n }`,\n { agentId, path, query: query ?? null }\n );\n\n if (!data.agentAiGet.ok) {\n throw new Error(\n sanitizeError(data.agentAiGet.error || `Agent API error ${data.agentAiGet.status}`)\n );\n }\n return data.agentAiGet.data;\n}\n\nexport async function agentAiMutate<T = unknown>(\n agentId: string,\n path: string,\n method: string,\n body?: unknown\n): Promise<T> {\n const data = await gatewayFetch<{\n agentAiMutate: {\n ok: boolean;\n status: number;\n data: T;\n text?: string | null;\n error?: string | null;\n };\n }>(\n `mutation AgentAiMutate($agentId: ID!, $path: String!, $method: String!, $body: JSON) {\n agentAiMutate(agentId: $agentId, path: $path, method: $method, body: $body) {\n ok\n status\n data\n text\n error\n }\n }`,\n { agentId, path, method, body: body ?? null }\n );\n\n if (!data.agentAiMutate.ok) {\n throw new Error(\n sanitizeError(data.agentAiMutate.error || `Agent API error ${data.agentAiMutate.status}`)\n );\n }\n return data.agentAiMutate.data;\n}\n\nexport async function getAgentConfigValue(agent: AgentRef, key: string): Promise<string | null> {\n try {\n const data = await agentAiGet<{ key?: string; value?: string }>(\n agent.id,\n agentApiPath(agent.profile, `/config/${encodeURIComponent(key)}`)\n );\n return typeof data.value === 'string' ? data.value : null;\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.toLowerCase().includes('configuration key not found')\n ) {\n return null;\n }\n throw error;\n }\n}\n\nexport async function setAgentConfigValue(\n agent: AgentRef,\n key: string,\n value: string\n): Promise<void> {\n await agentAiMutate(\n agent.id,\n agentApiPath(agent.profile, `/config/${encodeURIComponent(key)}`),\n 'PUT',\n { value }\n );\n}\n\nexport async function deleteAgentConfigValue(agent: AgentRef, key: string): Promise<void> {\n await agentAiMutate(\n agent.id,\n agentApiPath(agent.profile, `/config/${encodeURIComponent(key)}`),\n 'DELETE'\n );\n}\n\nfunction qs(params?: Record<string, unknown>): string {\n if (!params) return '';\n const entries = Object.entries(params).filter(\n ([, v]) => v !== undefined && v !== null && v !== ''\n );\n if (entries.length === 0) return '';\n const search = new URLSearchParams();\n for (const [k, v] of entries) search.set(k, String(v));\n return `?${search.toString()}`;\n}\n\n// ── Types ─────────────────────────────────────────────────────────────\n\nexport interface AITemplate {\n id: string;\n name: string;\n content: string;\n description?: string | null;\n category?: string | null;\n variables: Record<string, unknown>;\n tags: string[];\n isShared?: boolean;\n usageCount?: number;\n metadata?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface AIContext {\n id: string;\n name: string;\n type: string;\n content: string;\n tags: string[];\n metadata?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface AISession {\n id: string;\n name: string;\n agentType: string;\n providerPlugin?: string;\n status: 'active' | 'idle' | 'processing' | 'error' | 'terminated';\n stats?: Record<string, unknown>;\n config?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n terminatedAt?: string | null;\n}\n\nexport interface AISessionLog {\n id: string;\n sessionId: string;\n type: 'input' | 'output' | 'thinking' | 'event' | 'error' | 'metadata';\n content: string;\n message: string;\n tokenCount?: number;\n model?: string;\n durationMs?: number;\n agentMetadata?: Record<string, unknown>;\n timestamp: string;\n createdAt: string;\n}\n\nexport interface AISessionStats {\n session: { id: string; name: string; agentType: string; status: string; createdAt: string };\n stats: {\n totalLogs: number;\n totalInputTokens: number;\n totalOutputTokens: number;\n totalDurationMs: number;\n logsByType: Record<string, number>;\n };\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n promptCount: number;\n averageLatency?: number;\n}\n\nexport interface AIDispatch {\n id: string;\n templateId?: string | null;\n content: string;\n prompt: string;\n resolvedVariables?: Record<string, unknown>;\n contextIds?: string[];\n sessionId?: string | null;\n status: string;\n result?: Record<string, unknown> | null;\n scheduledAt?: string | null;\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface AIQueueItem {\n id: string;\n dispatchedPromptId: string;\n sessionId: string;\n priority: number;\n status: 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled';\n attempts: number;\n maxAttempts: number;\n lastError?: string | null;\n createdAt?: string;\n}\n\nexport interface AIStatsOverview {\n totalSessions: number;\n activeSessions: number;\n totalInputTokens: number;\n totalOutputTokens: number;\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n totalRequests: number;\n sessionsByAgentType: Record<string, number>;\n queuedPrompts: number;\n}\n\nexport interface AIUsageStats {\n usage: Record<\n string,\n { inputTokens: number; outputTokens: number; requestCount: number; sessionCount: number }\n >;\n byProvider: Array<{\n provider: string;\n tokens: number;\n sessions: number;\n cost?: number;\n inputTokens: number;\n outputTokens: number;\n requestCount: number;\n }>;\n byStatus: Array<{ status: string; count: number }>;\n}\n\nexport interface AIProvider {\n pluginName: string;\n name?: string;\n displayName?: string;\n isDefault: boolean;\n currentMode?: ProviderMode;\n defaultMode?: ProviderMode;\n supportedModes?: ProviderMode[];\n unsupportedModes?: ProviderMode[];\n modes?: Record<ProviderMode, boolean>;\n prereqApiPrefix?: string;\n}\n\nexport interface AIApiParameter {\n name: string;\n type: string;\n required: boolean;\n description: string;\n}\n\nexport interface AIApiEndpoint {\n id: string;\n method: string;\n path: string;\n description: string;\n parameters?: AIApiParameter[];\n body?: AIApiParameter[];\n}\n\nexport interface AITool {\n name: string;\n displayName: string;\n description: string;\n installed: boolean;\n version?: string;\n configFiles?: string[];\n foundConfigs?: string[];\n installCommand?: string;\n}\n\n// ── Paginated response wrapper ───────────────────────────────────────\n\nexport interface PaginatedResponse<T> {\n items: T[];\n total: number;\n hasMore: boolean;\n}\n\ninterface RawAITemplate extends Omit<AITemplate, 'variables' | 'tags' | 'prompt'> {\n variables?: Record<string, unknown> | string[] | null;\n tags?: string[] | null;\n}\n\ninterface RawAISessionLog extends Omit<AISessionLog, 'message' | 'timestamp'> {\n message?: string;\n timestamp?: string;\n}\n\ninterface RawAISessionStats {\n session?: AISessionStats['session'];\n stats?: Partial<AISessionStats['stats']>;\n totalTokens?: number;\n inputTokens?: number;\n outputTokens?: number;\n promptCount?: number;\n averageLatency?: number;\n}\n\ninterface RawAIDispatch extends Omit<AIDispatch, 'prompt'> {\n prompt?: string;\n}\n\ninterface RawAIStatsOverview {\n totalSessions?: number;\n activeSessions?: number;\n totalInputTokens?: number;\n totalOutputTokens?: number;\n totalTokens?: number;\n inputTokens?: number;\n outputTokens?: number;\n totalRequests?: number;\n sessionsByAgentType?: Record<string, number>;\n queuedPrompts?: number;\n}\n\ninterface RawAIUsageStats {\n usage?: AIUsageStats['usage'];\n byProvider?: AIUsageStats['byProvider'];\n byStatus?: AIUsageStats['byStatus'];\n}\n\ninterface RawAIApiEndpoint {\n method: string;\n path: string;\n description: string;\n parameters?: Record<string, { type: string; required: boolean; description: string }>;\n body?: Record<string, { type: string; required: boolean; description: string }>;\n}\n\nfunction normalizeTemplate(template: RawAITemplate): AITemplate {\n const variables = Array.isArray(template.variables)\n ? Object.fromEntries(template.variables.map((name) => [String(name), '']))\n : (template.variables ?? {});\n\n return {\n ...template,\n description: template.description ?? null,\n variables,\n tags: template.tags ?? [],\n };\n}\n\nfunction normalizeSessionLog(log: RawAISessionLog): AISessionLog {\n return {\n ...log,\n message: log.message ?? log.content,\n timestamp: log.timestamp ?? log.createdAt,\n };\n}\n\nfunction normalizeSessionStats(stats: RawAISessionStats): AISessionStats {\n const statBlock = stats.stats ?? {};\n const inputTokens = stats.inputTokens ?? statBlock.totalInputTokens ?? 0;\n const outputTokens = stats.outputTokens ?? statBlock.totalOutputTokens ?? 0;\n const promptCount = stats.promptCount ?? statBlock.totalLogs ?? 0;\n const totalDurationMs = statBlock.totalDurationMs ?? 0;\n\n return {\n session: stats.session ?? {\n id: '',\n name: '',\n agentType: '',\n status: '',\n createdAt: '',\n },\n stats: {\n totalLogs: statBlock.totalLogs ?? 0,\n totalInputTokens: statBlock.totalInputTokens ?? inputTokens,\n totalOutputTokens: statBlock.totalOutputTokens ?? outputTokens,\n totalDurationMs,\n logsByType: statBlock.logsByType ?? {},\n },\n totalTokens: stats.totalTokens ?? inputTokens + outputTokens,\n inputTokens,\n outputTokens,\n promptCount,\n averageLatency:\n stats.averageLatency ?? (promptCount > 0 ? totalDurationMs / promptCount : undefined),\n };\n}\n\nfunction normalizeDispatch(dispatch: RawAIDispatch): AIDispatch {\n return {\n ...dispatch,\n prompt: dispatch.prompt ?? dispatch.content,\n };\n}\n\nfunction normalizeStatsOverview(stats: RawAIStatsOverview): AIStatsOverview {\n const inputTokens = stats.inputTokens ?? stats.totalInputTokens ?? 0;\n const outputTokens = stats.outputTokens ?? stats.totalOutputTokens ?? 0;\n\n return {\n totalSessions: stats.totalSessions ?? 0,\n activeSessions: stats.activeSessions ?? 0,\n totalInputTokens: stats.totalInputTokens ?? inputTokens,\n totalOutputTokens: stats.totalOutputTokens ?? outputTokens,\n totalTokens: stats.totalTokens ?? inputTokens + outputTokens,\n inputTokens,\n outputTokens,\n totalRequests: stats.totalRequests ?? 0,\n sessionsByAgentType: stats.sessionsByAgentType ?? {},\n queuedPrompts: stats.queuedPrompts ?? 0,\n };\n}\n\nfunction normalizeUsageStats(usageStats: RawAIUsageStats): AIUsageStats {\n const usage = usageStats.usage ?? {};\n const byProvider =\n usageStats.byProvider ??\n Object.entries(usage).map(([provider, stats]) => ({\n provider,\n tokens: stats.inputTokens + stats.outputTokens,\n sessions: stats.sessionCount,\n inputTokens: stats.inputTokens,\n outputTokens: stats.outputTokens,\n requestCount: stats.requestCount,\n }));\n\n return {\n usage,\n byProvider,\n byStatus: usageStats.byStatus ?? [],\n };\n}\n\nfunction normalizeApiEndpoint(endpoint: RawAIApiEndpoint): AIApiEndpoint {\n const normalizeFields = (\n fields?: Record<string, { type: string; required: boolean; description: string }>\n ): AIApiParameter[] =>\n Object.entries(fields ?? {}).map(([name, config]) => ({\n name,\n type: config.type,\n required: config.required,\n description: config.description,\n }));\n\n return {\n id: `${endpoint.method.toUpperCase()} ${endpoint.path}`,\n method: endpoint.method,\n path: endpoint.path,\n description: endpoint.description,\n parameters: normalizeFields(endpoint.parameters),\n body: normalizeFields(endpoint.body),\n };\n}\n\n// ── Tools ─────────────────────────────────────────────────────────────\n\nexport async function fetchTools(agent: AgentRef): Promise<AITool[]> {\n const data = await agentAiGet<{ tools: AITool[] }>(\n agent.id,\n agentApiPath(agent.profile, '/ai/tools')\n );\n return data.tools;\n}\n\n// ── Templates (workspace-owned AI prompts) ───────────────────────────\n\nconst AI_PROMPT_FIELDS = `\n id\n name\n description\n content\n category\n variables\n isShared\n usageCount\n tags\n metadata\n createdAt\n updatedAt\n`;\n\nconst LIST_AI_PROMPTS_QUERY = `query ListAIPrompts($filter: AIPromptFilterInput, $pagination: PaginationInput) {\n aiPrompts(filter: $filter, pagination: $pagination) {\n items {\n ${AI_PROMPT_FIELDS}\n }\n total\n hasMore\n }\n}`;\n\nconst CREATE_AI_PROMPT_MUTATION = `mutation CreateAIPrompt($input: CreateAIPromptInput!) {\n createAIPrompt(input: $input) {\n ${AI_PROMPT_FIELDS}\n }\n}`;\n\nconst UPDATE_AI_PROMPT_MUTATION = `mutation UpdateAIPrompt($id: ID!, $input: UpdateAIPromptInput!) {\n updateAIPrompt(id: $id, input: $input) {\n ${AI_PROMPT_FIELDS}\n }\n}`;\n\nconst DELETE_AI_PROMPT_MUTATION = `mutation DeleteAIPrompt($id: ID!) {\n deleteAIPrompt(id: $id)\n}`;\n\nconst RENDER_AI_PROMPT_MUTATION = `mutation RenderAIPrompt($id: ID!, $variables: JSON) {\n renderAIPrompt(id: $id, variables: $variables) {\n promptId\n rendered\n }\n}`;\n\nconst RECORD_AI_PROMPT_USAGE_MUTATION = `mutation RecordAIPromptUsage($id: ID!) {\n recordAIPromptUsage(id: $id) {\n ${AI_PROMPT_FIELDS}\n }\n}`;\n\ntype AITemplateInput = {\n name: string;\n content: string;\n description?: string | null;\n category?: string | null;\n status?: string | null;\n variables?: Record<string, unknown> | string[] | null;\n tags?: string[];\n isShared?: boolean;\n metadata?: Record<string, unknown>;\n};\n\ntype AITemplateUpdateInput = Partial<AITemplateInput>;\n\nfunction enumInput(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim().toUpperCase() : undefined;\n}\n\nfunction numberInput(value: unknown, fallback: number): number {\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string' && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return fallback;\n}\n\nfunction buildAIPromptListVariables(params?: Record<string, unknown>): {\n filter: Record<string, unknown> | null;\n pagination: { limit: number; offset: number };\n} {\n const filter: Record<string, unknown> = {};\n const search = typeof params?.search === 'string' ? params.search.trim() : '';\n if (search) filter.search = search;\n\n const category = enumInput(params?.category);\n if (category) filter.category = category;\n\n const status = enumInput(params?.status);\n if (status) filter.status = status;\n\n if (typeof params?.isShared === 'boolean') filter.isShared = params.isShared;\n if (Array.isArray(params?.tags)) filter.tags = params.tags.map(String).filter(Boolean);\n if (typeof params?.createdBy === 'string' && params.createdBy.trim()) {\n filter.createdBy = params.createdBy.trim();\n }\n\n return {\n filter: Object.keys(filter).length > 0 ? filter : null,\n pagination: {\n limit: Math.min(Math.max(numberInput(params?.limit, 50), 1), 500),\n offset: Math.max(numberInput(params?.offset, 0), 0),\n },\n };\n}\n\nfunction toAIPromptInput(input: AITemplateInput | AITemplateUpdateInput): Record<string, unknown> {\n const promptInput: Record<string, unknown> = {};\n\n if (input.name !== undefined) promptInput.name = input.name;\n if (input.content !== undefined) promptInput.content = input.content;\n if (input.description !== undefined) promptInput.description = input.description;\n if (input.variables !== undefined) promptInput.variables = input.variables;\n if (input.tags !== undefined) promptInput.tags = input.tags;\n if (input.isShared !== undefined) promptInput.isShared = input.isShared;\n if (input.metadata !== undefined) promptInput.metadata = input.metadata;\n\n const category = enumInput(input.category);\n if (category) promptInput.category = category;\n\n const status = enumInput(input.status);\n if (status) promptInput.status = status;\n\n return promptInput;\n}\n\nexport async function fetchTemplates(\n _agentId: string,\n params?: Record<string, unknown>\n): Promise<AITemplate[]> {\n const data = await gatewayFetch<{ aiPrompts: PaginatedResponse<RawAITemplate> }>(\n LIST_AI_PROMPTS_QUERY,\n buildAIPromptListVariables(params)\n );\n return data.aiPrompts.items.map(normalizeTemplate);\n}\n\nexport async function createTemplate(\n _agentId: string,\n input: AITemplateInput\n): Promise<AITemplate> {\n const data = await gatewayFetch<{ createAIPrompt: RawAITemplate }>(CREATE_AI_PROMPT_MUTATION, {\n input: toAIPromptInput(input),\n });\n return normalizeTemplate(data.createAIPrompt);\n}\n\nexport async function recordTemplateUsage(_agentId: string, id: string): Promise<AITemplate> {\n const data = await gatewayFetch<{ recordAIPromptUsage: RawAITemplate }>(\n RECORD_AI_PROMPT_USAGE_MUTATION,\n { id }\n );\n return normalizeTemplate(data.recordAIPromptUsage);\n}\n\nexport async function updateTemplate(\n _agentId: string,\n id: string,\n input: AITemplateUpdateInput\n): Promise<AITemplate> {\n const data = await gatewayFetch<{ updateAIPrompt: RawAITemplate }>(UPDATE_AI_PROMPT_MUTATION, {\n id,\n input: toAIPromptInput(input),\n });\n return normalizeTemplate(data.updateAIPrompt);\n}\n\nexport async function deleteTemplate(_agentId: string, id: string): Promise<void> {\n await gatewayFetch<{ deleteAIPrompt: boolean }>(DELETE_AI_PROMPT_MUTATION, { id });\n}\n\nexport async function renderTemplate(\n _agentId: string,\n id: string,\n variables: Record<string, unknown>\n): Promise<{ rendered: string }> {\n const data = await gatewayFetch<{ renderAIPrompt: { promptId: string; rendered: string } }>(\n RENDER_AI_PROMPT_MUTATION,\n { id, variables }\n );\n return { rendered: data.renderAIPrompt.rendered };\n}\n\n// ── Contexts (backend route: /ai/contexts under canonical profile prefix) ──\n\nexport async function fetchContexts(\n agent: AgentRef,\n params?: Record<string, unknown>\n): Promise<AIContext[]> {\n const data = await agentAiGet<PaginatedResponse<AIContext>>(\n agent.id,\n agentApiPath(agent.profile, '/ai/contexts'),\n params\n );\n return data.items;\n}\n\nexport async function createContext(\n agent: AgentRef,\n input: {\n name: string;\n type: string;\n content: string;\n tags?: string[];\n metadata?: Record<string, unknown>;\n }\n): Promise<AIContext> {\n return agentAiMutate<AIContext>(\n agent.id,\n agentApiPath(agent.profile, '/ai/contexts'),\n 'POST',\n input\n );\n}\n\nexport async function updateContext(\n agent: AgentRef,\n id: string,\n input: Partial<{\n name: string;\n type: string;\n content: string;\n tags: string[];\n metadata: Record<string, unknown>;\n }>\n): Promise<AIContext> {\n return agentAiMutate<AIContext>(\n agent.id,\n agentApiPath(agent.profile, `/ai/contexts/${id}`),\n 'PUT',\n input\n );\n}\n\nexport async function deleteContext(agent: AgentRef, id: string): Promise<void> {\n await agentAiMutate(agent.id, agentApiPath(agent.profile, `/ai/contexts/${id}`), 'DELETE');\n}\n\n// ── Sessions (backend route: /ai/sessions) ──────────────────────────\n\nexport async function fetchSessions(\n agent: AgentRef,\n params?: Record<string, unknown>\n): Promise<AISession[]> {\n const data = await agentAiGet<PaginatedResponse<AISession>>(\n agent.id,\n agentApiPath(agent.profile, '/ai/sessions'),\n params\n );\n return data.items;\n}\n\nexport async function fetchSessionsPaginated(\n agent: AgentRef,\n params?: { limit?: number; offset?: number; search?: string; agentType?: string; status?: string }\n): Promise<PaginatedResponse<AISession>> {\n return agentAiGet<PaginatedResponse<AISession>>(\n agent.id,\n agentApiPath(agent.profile, '/ai/sessions'),\n params as Record<string, unknown>\n );\n}\n\nexport async function createSession(\n agent: AgentRef,\n input: { name: string; agentType: string; config?: Record<string, unknown> }\n): Promise<AISession> {\n return agentAiMutate<AISession>(\n agent.id,\n agentApiPath(agent.profile, '/ai/sessions'),\n 'POST',\n input\n );\n}\n\nexport async function sendPromptToSession(\n agent: AgentRef,\n sessionId: string,\n prompt: string,\n contexts?: string[],\n options?: {\n agentType?: string;\n model?: string;\n mode?: string;\n conversationHistory?: Array<{ role: string; content: string }>;\n }\n): Promise<{\n response: string;\n tokens?: { input: number; output: number };\n [key: string]: unknown;\n}> {\n const data = await agentAiMutate<Record<string, unknown>>(\n agent.id,\n agentApiPath(agent.profile, `/ai/sessions/${sessionId}/send`),\n 'POST',\n {\n prompt,\n contexts,\n ...(options?.agentType ? { agentType: options.agentType } : {}),\n ...(options?.model ? { model: options.model } : {}),\n ...(options?.mode ? { mode: options.mode } : {}),\n ...(options?.conversationHistory?.length\n ? { conversationHistory: options.conversationHistory }\n : {}),\n }\n );\n const rawTokens = data.tokens as Record<string, unknown> | undefined;\n\n return {\n ...data,\n response: String(data.response ?? data.content ?? data.message ?? ''),\n tokens:\n rawTokens && (typeof rawTokens.input === 'number' || typeof rawTokens.output === 'number')\n ? {\n input: Number(rawTokens.input ?? 0),\n output: Number(rawTokens.output ?? 0),\n }\n : undefined,\n };\n}\n\nexport async function fetchSessionLogs(\n agent: AgentRef,\n sessionId: string,\n params?: Record<string, unknown>\n): Promise<AISessionLog[]> {\n const data = await agentAiGet<PaginatedResponse<RawAISessionLog>>(\n agent.id,\n agentApiPath(agent.profile, `/ai/sessions/${sessionId}/logs`),\n params\n );\n return data.items.map(normalizeSessionLog);\n}\n\nexport async function fetchSessionStats(\n agent: AgentRef,\n sessionId: string\n): Promise<AISessionStats> {\n return normalizeSessionStats(\n await agentAiGet<RawAISessionStats>(\n agent.id,\n agentApiPath(agent.profile, `/ai/sessions/${sessionId}/stats`)\n )\n );\n}\n\nexport async function updateSessionConfig(\n agent: AgentRef,\n sessionId: string,\n config: Record<string, unknown>\n): Promise<AISession> {\n return agentAiMutate<AISession>(\n agent.id,\n agentApiPath(agent.profile, `/ai/sessions/${sessionId}/config`),\n 'PUT',\n config\n );\n}\n\nexport async function terminateSession(agent: AgentRef, sessionId: string): Promise<void> {\n await agentAiMutate(agent.id, agentApiPath(agent.profile, `/ai/sessions/${sessionId}`), 'DELETE');\n}\n\n// ── Prompt Composition & Dispatch (backend route: /ai/dispatch) ──\n\nexport async function composePrompt(\n agent: AgentRef,\n input: {\n templateId?: string;\n variables?: Record<string, unknown>;\n content?: string;\n contextIds?: string[];\n sessionId?: string;\n }\n): Promise<{ dispatch: AIDispatch; preview: string }> {\n return agentAiMutate<{ dispatch: AIDispatch; preview: string }>(\n agent.id,\n agentApiPath(agent.profile, '/ai/dispatch/compose'),\n 'POST',\n input\n );\n}\n\nexport async function sendDispatch(\n agent: AgentRef,\n input: {\n dispatchId?: string;\n prompt?: string;\n content?: string;\n sessionId?: string;\n contextIds?: string[];\n scheduledAt?: string;\n }\n): Promise<{ status: string; dispatchId: string; sessionId: string }> {\n return agentAiMutate<{ status: string; dispatchId: string; sessionId: string }>(\n agent.id,\n agentApiPath(agent.profile, '/ai/dispatch/send'),\n 'POST',\n {\n ...input,\n content: input.content ?? input.prompt,\n }\n );\n}\n\nexport async function fetchDispatchHistory(\n agent: AgentRef,\n params?: Record<string, unknown>\n): Promise<AIDispatch[]> {\n const data = await agentAiGet<PaginatedResponse<RawAIDispatch>>(\n agent.id,\n agentApiPath(agent.profile, '/ai/dispatch/history'),\n params\n );\n return data.items.map(normalizeDispatch);\n}\n\n// ── Queue (backend route: /ai/queue) ─────────────────────────────\n\nexport async function fetchQueueItems(\n agent: AgentRef,\n params?: Record<string, unknown>\n): Promise<AIQueueItem[]> {\n const data = await agentAiGet<PaginatedResponse<AIQueueItem>>(\n agent.id,\n agentApiPath(agent.profile, '/ai/queue'),\n params\n );\n return data.items;\n}\n\nexport async function enqueueItem(\n agent: AgentRef,\n input: {\n dispatchedPromptId: string;\n sessionId: string;\n priority?: number;\n scheduledAt?: string;\n maxAttempts?: number;\n }\n): Promise<AIQueueItem> {\n return agentAiMutate<AIQueueItem>(\n agent.id,\n agentApiPath(agent.profile, '/ai/queue/enqueue'),\n 'POST',\n input\n );\n}\n\nexport async function cancelQueueItem(agent: AgentRef, id: string): Promise<void> {\n await agentAiMutate(agent.id, agentApiPath(agent.profile, `/ai/queue/${id}/cancel`), 'POST');\n}\n\n// ── Stats (backend route: /ai/stats) ─────────────────────────────\n\nexport async function fetchStatsOverview(agent: AgentRef): Promise<AIStatsOverview> {\n return normalizeStatsOverview(\n await agentAiGet<RawAIStatsOverview>(\n agent.id,\n agentApiPath(agent.profile, '/ai/stats/overview')\n )\n );\n}\n\nexport async function fetchUsageStats(agent: AgentRef): Promise<AIUsageStats> {\n return normalizeUsageStats(\n await agentAiGet<RawAIUsageStats>(agent.id, agentApiPath(agent.profile, '/ai/stats/usage'))\n );\n}\n\n// ── Providers (backend route: /ai/sessions/providers) ────────────\n\nexport async function fetchProviders(agent: AgentRef): Promise<AIProvider[]> {\n const data = await agentAiGet<{ providers: AIProvider[] }>(\n agent.id,\n agentApiPath(agent.profile, '/ai/sessions/providers')\n );\n return data.providers;\n}\n\n// ── API Descriptor (backend route: /ai/descriptor) ───────────────\n\nexport async function fetchApiDescriptor(agent: AgentRef): Promise<AIApiEndpoint[]> {\n const data = await agentAiGet<{ name: string; version: string; endpoints: RawAIApiEndpoint[] }>(\n agent.id,\n agentApiPath(agent.profile, '/ai/descriptor')\n );\n return data.endpoints.map(normalizeApiEndpoint);\n}\n\n// ── Agent Manager extensions ────────────────────────────────────────\n\nexport interface AIModelInfo {\n id: string;\n name: string;\n provider: string;\n contextWindow?: number;\n maxOutputTokens?: number;\n}\n\nexport interface SearchResult {\n sessionId: string;\n sessionName: string;\n messageId?: string;\n content: string;\n timestamp: string;\n score?: number;\n}\n\nexport async function renameSession(\n agent: AgentRef,\n sessionId: string,\n name: string\n): Promise<AISession> {\n return agentAiMutate<AISession>(\n agent.id,\n agentApiPath(agent.profile, `/ai/sessions/${sessionId}`),\n 'PATCH',\n { name }\n );\n}\n\nexport async function bulkDeleteSessions(agent: AgentRef, ids: string[]): Promise<void> {\n await agentAiMutate(agent.id, agentApiPath(agent.profile, '/ai/sessions/bulk-delete'), 'POST', {\n ids,\n });\n}\n\nexport async function fetchSessionMessages(\n agent: AgentRef,\n sessionId: string\n): Promise<AgentManagerMessage[]> {\n const data = await agentAiGet<{ messages: AgentManagerMessage[] }>(\n agent.id,\n agentApiPath(agent.profile, `/ai/sessions/${sessionId}/messages`)\n );\n return data.messages;\n}\n\nexport async function searchSessions(\n agent: AgentRef,\n query: string,\n params?: Record<string, unknown>\n): Promise<SearchResult[]> {\n const data = await agentAiGet<{ results: SearchResult[] }>(\n agent.id,\n agentApiPath(agent.profile, '/ai/sessions/search'),\n { query, ...params }\n );\n return data.results;\n}\n\nexport async function fetchMcpServers(agent: AgentRef): Promise<McpServer[]> {\n const data = await agentAiGet<{ servers: McpServer[] }>(\n agent.id,\n agentApiPath(agent.profile, '/ai/mcp/servers')\n );\n return data.servers;\n}\n\nexport async function switchSessionModel(\n agent: AgentRef,\n sessionId: string,\n model: string\n): Promise<void> {\n await agentAiMutate(\n agent.id,\n agentApiPath(agent.profile, `/ai/sessions/${sessionId}/model`),\n 'PUT',\n { model }\n );\n}\n\nexport async function switchSessionSdk(\n agent: AgentRef,\n sessionId: string,\n sdk: string\n): Promise<void> {\n await agentAiMutate(\n agent.id,\n agentApiPath(agent.profile, `/ai/sessions/${sessionId}/sdk`),\n 'PUT',\n { sdk }\n );\n}\n\nexport async function switchSessionMode(\n agent: AgentRef,\n sessionId: string,\n mode: string\n): Promise<void> {\n await agentAiMutate(\n agent.id,\n agentApiPath(agent.profile, `/ai/sessions/${sessionId}/mode`),\n 'PUT',\n { mode }\n );\n}\n\nexport async function cancelSessionRequest(agent: AgentRef, sessionId: string): Promise<void> {\n await agentAiMutate(\n agent.id,\n agentApiPath(agent.profile, `/ai/sessions/${sessionId}/cancel`),\n 'POST'\n );\n}\n\nexport async function fetchModels(agent: AgentRef, provider?: string): Promise<AIModelInfo[]> {\n const data = await agentAiGet<{ models: AIModelInfo[] }>(\n agent.id,\n agentApiPath(\n agent.profile,\n provider ? `/ai/models/${encodeURIComponent(provider)}` : '/ai/models'\n )\n );\n return data.models;\n}\n\nexport async function exportSession(\n agent: AgentRef,\n sessionId: string,\n format: 'json' | 'markdown'\n): Promise<Blob> {\n const data = await agentAiGet<Record<string, unknown>>(\n agent.id,\n agentApiPath(agent.profile, `/ai/sessions/${sessionId}/export`),\n { format }\n );\n const content = format === 'json' ? JSON.stringify(data, null, 2) : String(data.content ?? '');\n const mimeType = format === 'json' ? 'application/json' : 'text/markdown';\n return new Blob([content], { type: mimeType });\n}\n\nexport async function uploadSessionFile(\n agent: AgentRef,\n sessionId: string,\n file: File\n): Promise<FileAttachment> {\n const arrayBuffer = await file.arrayBuffer();\n const base64 = btoa(\n new Uint8Array(arrayBuffer).reduce((acc, byte) => acc + String.fromCharCode(byte), '')\n );\n return agentAiMutate<FileAttachment>(\n agent.id,\n agentApiPath(agent.profile, `/ai/sessions/${sessionId}/files`),\n 'POST',\n {\n name: file.name,\n mimeType: file.type,\n size: file.size,\n content: base64,\n }\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { agentApiPath as e } from "../utils/agentApiPath.js";
|
|
2
|
+
import { agentAiMutate as t } from "./aiApi.js";
|
|
3
|
+
var n = 600, r = 6e4;
|
|
4
|
+
async function i(r, i, a, o = n) {
|
|
5
|
+
let s = Math.max(1, Math.min(600, Math.floor(o)));
|
|
6
|
+
return t(r, e(i, "/agent/iframe-token"), "POST", {
|
|
7
|
+
pathPrefix: a,
|
|
8
|
+
ttlSeconds: s
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
function a(e, t, a, o, s, c, l = n) {
|
|
12
|
+
let u = !1, d = null, f = Date.parse(o.expiresAt), p = Math.max(1e3, f - Date.now() - r);
|
|
13
|
+
return d = setTimeout(() => {
|
|
14
|
+
u || i(e, t, a, l).then((e) => {
|
|
15
|
+
u || s(e);
|
|
16
|
+
}).catch((e) => {
|
|
17
|
+
u || c?.(e instanceof Error ? e : Error(String(e)));
|
|
18
|
+
});
|
|
19
|
+
}, p), { cancel: () => {
|
|
20
|
+
u = !0, d !== null && (clearTimeout(d), d = null);
|
|
21
|
+
} };
|
|
22
|
+
}
|
|
23
|
+
function o(e, t) {
|
|
24
|
+
return `${e}${e.includes("?") ? "&" : "?"}vt=${encodeURIComponent(t)}`;
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { o as appendIframeTokenParam, i as mintIframeToken, a as scheduleIframeTokenRefresh };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=iframeToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iframeToken.js","names":[],"sources":["../../src/services/iframeToken.ts"],"sourcesContent":["/**\n * iframe-token service\n *\n * Mints short-lived signed tokens for iframe embeds talking to the\n * vibecontrols-agent. Replaces the previous Referer/api-key-in-URL flow\n * dropped by the agent in Phase C.\n *\n * Backend route: POST /api/agent/iframe-token\n * Request: { pathPrefix: string, ttlSeconds?: number }\n * Response: { token: string, expiresAt: string } // ISO-8601\n *\n * Hard limit: ttlSeconds <= 600 (agent enforces; we cap client-side too).\n */\n\nimport { agentAiMutate } from './aiApi';\nimport { agentApiPath } from '@/utils/agentApiPath';\n\nexport const MAX_IFRAME_TOKEN_TTL_SECONDS = 600;\nconst DEFAULT_TTL_SECONDS = 600;\nconst REFRESH_LEEWAY_MS = 60_000;\n\nexport interface IframeTokenResponse {\n token: string;\n expiresAt: string;\n}\n\nexport interface IframeTokenAutoRefreshHandle {\n /** Cancels the pending refresh timer. Idempotent. */\n cancel: () => void;\n}\n\n/**\n * Mint an iframe token for the given agent + path prefix.\n *\n * @param agentId The agent's GraphQL id.\n * @param profile Profile name on the agent that owns this iframe token (canonical URL hierarchy).\n * @param pathPrefix Iframe path prefix the token should authorize (e.g. '/ungit', '/ui/graphiql').\n * @param ttlSeconds Token lifetime; clamped to (0, 600].\n */\nexport async function mintIframeToken(\n agentId: string,\n profile: string,\n pathPrefix: string,\n ttlSeconds: number = DEFAULT_TTL_SECONDS\n): Promise<IframeTokenResponse> {\n const ttl = Math.max(1, Math.min(MAX_IFRAME_TOKEN_TTL_SECONDS, Math.floor(ttlSeconds)));\n return agentAiMutate<IframeTokenResponse>(\n agentId,\n agentApiPath(profile, '/agent/iframe-token'),\n 'POST',\n { pathPrefix, ttlSeconds: ttl }\n );\n}\n\n/**\n * Schedule an auto-refresh that re-mints the token ~60s before expiry.\n * Returns a handle whose `cancel()` clears the timer.\n *\n * Caller is responsible for re-rendering / updating iframe `src` on each\n * refresh by reacting to the `onRefresh` callback's payload.\n */\nexport function scheduleIframeTokenRefresh(\n agentId: string,\n profile: string,\n pathPrefix: string,\n current: IframeTokenResponse,\n onRefresh: (next: IframeTokenResponse) => void,\n onError?: (err: Error) => void,\n ttlSeconds: number = DEFAULT_TTL_SECONDS\n): IframeTokenAutoRefreshHandle {\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const expiresAtMs = Date.parse(current.expiresAt);\n const delay = Math.max(1_000, expiresAtMs - Date.now() - REFRESH_LEEWAY_MS);\n\n timer = setTimeout(() => {\n if (cancelled) return;\n mintIframeToken(agentId, profile, pathPrefix, ttlSeconds)\n .then((next) => {\n if (cancelled) return;\n onRefresh(next);\n })\n .catch((err: unknown) => {\n if (cancelled) return;\n onError?.(err instanceof Error ? err : new Error(String(err)));\n });\n }, delay);\n\n return {\n cancel: () => {\n cancelled = true;\n if (timer !== null) {\n clearTimeout(timer);\n timer = null;\n }\n },\n };\n}\n\n/**\n * Append the iframe token as a `vt=` query param to the given URL.\n * Preserves existing query string.\n */\nexport function appendIframeTokenParam(url: string, token: string): string {\n const sep = url.includes('?') ? '&' : '?';\n return `${url}${sep}vt=${encodeURIComponent(token)}`;\n}\n"],"mappings":";;AAkBA,IAAM,IAAsB,KACtB,IAAoB;AAoB1B,eAAsB,EACpB,GACA,GACA,GACA,IAAqB,GACS;CAC9B,IAAM,IAAM,KAAK,IAAI,GAAG,KAAK,IAAA,KAAkC,KAAK,MAAM,EAAW,CAAC,CAAC;AACvF,QAAO,EACL,GACA,EAAa,GAAS,sBAAsB,EAC5C,QACA;EAAE;EAAY,YAAY;EAAK,CAChC;;AAUH,SAAgB,EACd,GACA,GACA,GACA,GACA,GACA,GACA,IAAqB,GACS;CAC9B,IAAI,IAAY,IACZ,IAA8C,MAE5C,IAAc,KAAK,MAAM,EAAQ,UAAU,EAC3C,IAAQ,KAAK,IAAI,KAAO,IAAc,KAAK,KAAK,GAAG,EAAkB;AAe3E,QAbA,IAAQ,iBAAiB;AACnB,OACJ,EAAgB,GAAS,GAAS,GAAY,EAAW,CACtD,MAAM,MAAS;AACV,QACJ,EAAU,EAAK;IACf,CACD,OAAO,MAAiB;AACnB,QACJ,IAAU,aAAe,QAAQ,IAAU,MAAM,OAAO,EAAI,CAAC,CAAC;IAC9D;IACH,EAAM,EAEF,EACL,cAAc;AAEZ,EADA,IAAY,IACR,MAAU,SACZ,aAAa,EAAM,EACnB,IAAQ;IAGb;;AAOH,SAAgB,EAAuB,GAAa,GAAuB;AAEzE,QAAO,GAAG,IADE,EAAI,SAAS,IAAI,GAAG,MAAM,IAClB,KAAK,mBAAmB,EAAM"}
|
|
@@ -1,28 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getStoredWorkspaceId as e } from "@burdenoff/fe-libs/shared/graphql";
|
|
2
|
+
import { graphqlFetch as t } from "@burdenoff/fe-libs/shared/graphql/fetch";
|
|
2
3
|
//#region src/services/schedulerApi.ts
|
|
3
|
-
function
|
|
4
|
-
return
|
|
4
|
+
function n() {
|
|
5
|
+
return e() ?? "";
|
|
5
6
|
}
|
|
6
|
-
async function
|
|
7
|
-
|
|
8
|
-
let r = await
|
|
7
|
+
async function r(e) {
|
|
8
|
+
e.workspaceId || n();
|
|
9
|
+
let r = await t({
|
|
9
10
|
gateway: "workspace",
|
|
10
11
|
query: "mutation CreateScheduledJob($input: CreateScheduledJobInput!) {\n createScheduledJob(input: $input) { id status }\n }",
|
|
11
12
|
variables: { input: {
|
|
12
|
-
name: `AI Prompt - ${
|
|
13
|
+
name: `AI Prompt - ${e.sessionId.slice(0, 8)}`,
|
|
13
14
|
description: "Scheduled prompt for AI session",
|
|
14
15
|
scheduleType: "ONE_TIME",
|
|
15
|
-
startDate:
|
|
16
|
+
startDate: e.scheduledAt,
|
|
16
17
|
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
17
18
|
executorType: "WEBHOOK",
|
|
18
19
|
executorConfig: {
|
|
19
|
-
url: `${
|
|
20
|
+
url: `${e.agentTunnelUrl}/api/ai/sessions/${e.sessionId}/send`,
|
|
20
21
|
method: "POST",
|
|
21
22
|
headers: {
|
|
22
23
|
"Content-Type": "application/json",
|
|
23
|
-
"X-API-Key":
|
|
24
|
+
"X-API-Key": e.agentApiKey
|
|
24
25
|
},
|
|
25
|
-
body: JSON.stringify({ prompt:
|
|
26
|
+
body: JSON.stringify({ prompt: e.prompt })
|
|
26
27
|
},
|
|
27
28
|
isActive: !0
|
|
28
29
|
} }
|
|
@@ -30,10 +31,10 @@ async function n(n) {
|
|
|
30
31
|
if (r.errors?.length) throw Error(r.errors[0].message);
|
|
31
32
|
return {
|
|
32
33
|
jobId: r.data?.createScheduledJob?.id || "",
|
|
33
|
-
scheduledAt:
|
|
34
|
+
scheduledAt: e.scheduledAt
|
|
34
35
|
};
|
|
35
36
|
}
|
|
36
37
|
//#endregion
|
|
37
|
-
export {
|
|
38
|
+
export { r as schedulePrompt };
|
|
38
39
|
|
|
39
40
|
//# sourceMappingURL=schedulerApi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedulerApi.js","names":[],"sources":["../../src/services/schedulerApi.ts"],"sourcesContent":["/**\n * Scheduler API service for scheduling AI prompts.\n *\n * Creates one-time scheduled jobs via the workspace scheduler\n * that fire webhook calls to the AI session send endpoint.\n */\n\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql/fetch';\n\
|
|
1
|
+
{"version":3,"file":"schedulerApi.js","names":[],"sources":["../../src/services/schedulerApi.ts"],"sourcesContent":["/**\n * Scheduler API service for scheduling AI prompts.\n *\n * Creates one-time scheduled jobs via the workspace scheduler\n * that fire webhook calls to the AI session send endpoint.\n */\n\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql/fetch';\nimport { getStoredWorkspaceId } from '@burdenoff/fe-libs/shared/graphql';\n\n// Reads from ActiveContextStorage with URL precedence so the workspace id\n// is found even when the calling MFE route doesn't carry `?workspace=`.\nfunction getWorkspaceId(): string {\n return getStoredWorkspaceId() ?? '';\n}\n\nexport async function schedulePrompt(params: {\n sessionId: string;\n agentTunnelUrl: string;\n agentApiKey: string;\n prompt: string;\n scheduledAt: string; // ISO datetime\n workspaceId?: string;\n}): Promise<{ jobId: string; scheduledAt: string }> {\n const wsId = params.workspaceId || getWorkspaceId();\n\n const result = await graphqlFetch<{\n createScheduledJob?: { id?: string; status?: string };\n }>({\n gateway: 'workspace',\n query: `mutation CreateScheduledJob($input: CreateScheduledJobInput!) {\n createScheduledJob(input: $input) { id status }\n }`,\n variables: {\n input: {\n name: `AI Prompt - ${params.sessionId.slice(0, 8)}`,\n description: `Scheduled prompt for AI session`,\n scheduleType: 'ONE_TIME',\n startDate: params.scheduledAt,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n executorType: 'WEBHOOK',\n executorConfig: {\n url: `${params.agentTunnelUrl}/api/ai/sessions/${params.sessionId}/send`,\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'X-API-Key': params.agentApiKey },\n body: JSON.stringify({ prompt: params.prompt }),\n },\n isActive: true,\n },\n },\n });\n\n if (result.errors?.length) throw new Error(result.errors[0].message);\n const job = result.data?.createScheduledJob;\n return { jobId: job?.id || '', scheduledAt: params.scheduledAt };\n}\n"],"mappings":";;;AAYA,SAAS,IAAyB;AAChC,QAAO,GAAsB,IAAI;;AAGnC,eAAsB,EAAe,GAOe;AACrC,GAAO,eAAe,GAAgB;CAEnD,IAAM,IAAS,MAAM,EAElB;EACD,SAAS;EACT,OAAO;EAGP,WAAW,EACT,OAAO;GACL,MAAM,eAAe,EAAO,UAAU,MAAM,GAAG,EAAE;GACjD,aAAa;GACb,cAAc;GACd,WAAW,EAAO;GAClB,UAAU,KAAK,gBAAgB,CAAC,iBAAiB,CAAC;GAClD,cAAc;GACd,gBAAgB;IACd,KAAK,GAAG,EAAO,eAAe,mBAAmB,EAAO,UAAU;IAClE,QAAQ;IACR,SAAS;KAAE,gBAAgB;KAAoB,aAAa,EAAO;KAAa;IAChF,MAAM,KAAK,UAAU,EAAE,QAAQ,EAAO,QAAQ,CAAC;IAChD;GACD,UAAU;GACX,EACF;EACF,CAAC;AAEF,KAAI,EAAO,QAAQ,OAAQ,OAAU,MAAM,EAAO,OAAO,GAAG,QAAQ;AAEpE,QAAO;EAAE,OADG,EAAO,MAAM,oBACJ,MAAM;EAAI,aAAa,EAAO;EAAa"}
|
|
@@ -18,7 +18,27 @@ function r() {
|
|
|
18
18
|
vibeId: null
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
|
-
var i =
|
|
21
|
+
var i = new Set([
|
|
22
|
+
"claude",
|
|
23
|
+
"codex",
|
|
24
|
+
"opencode",
|
|
25
|
+
"gemini",
|
|
26
|
+
"openai-compat",
|
|
27
|
+
"goose",
|
|
28
|
+
"amp",
|
|
29
|
+
"copilot",
|
|
30
|
+
"crush",
|
|
31
|
+
"pi",
|
|
32
|
+
"aider",
|
|
33
|
+
"plandex"
|
|
34
|
+
]);
|
|
35
|
+
function a(e) {
|
|
36
|
+
return typeof e == "string" && i.has(e) ? e : null;
|
|
37
|
+
}
|
|
38
|
+
function o(e) {
|
|
39
|
+
return e === "sdk" || e === "cli" ? e : null;
|
|
40
|
+
}
|
|
41
|
+
var s = {
|
|
22
42
|
status: [],
|
|
23
43
|
model: [],
|
|
24
44
|
sdk: [],
|
|
@@ -27,14 +47,14 @@ var i = {
|
|
|
27
47
|
to: null
|
|
28
48
|
},
|
|
29
49
|
searchQuery: ""
|
|
30
|
-
},
|
|
50
|
+
}, c = t()(n((e, t) => ({
|
|
31
51
|
tabs: [],
|
|
32
52
|
activeTabSessionId: null,
|
|
33
53
|
tabLimit: 10,
|
|
34
54
|
sessionStates: {},
|
|
35
55
|
sidebarOpen: !0,
|
|
36
56
|
sidebarSearchQuery: "",
|
|
37
|
-
sidebarFilters: { ...
|
|
57
|
+
sidebarFilters: { ...s },
|
|
38
58
|
sidebarGroupBy: "date",
|
|
39
59
|
detailPanelOpen: !1,
|
|
40
60
|
detailPanelTab: "info",
|
|
@@ -44,7 +64,13 @@ var i = {
|
|
|
44
64
|
openSession: (n, i) => {
|
|
45
65
|
let a = t();
|
|
46
66
|
if (a.tabs.find((e) => e.sessionId === n)) {
|
|
47
|
-
e(
|
|
67
|
+
e((e) => ({
|
|
68
|
+
activeTabSessionId: n,
|
|
69
|
+
sessionStates: {
|
|
70
|
+
...e.sessionStates,
|
|
71
|
+
[n]: e.sessionStates[n] ?? r()
|
|
72
|
+
}
|
|
73
|
+
}));
|
|
48
74
|
return;
|
|
49
75
|
}
|
|
50
76
|
let o = {
|
|
@@ -82,14 +108,23 @@ var i = {
|
|
|
82
108
|
name: n
|
|
83
109
|
} : e) })),
|
|
84
110
|
reorderTabs: (t) => e({ tabs: t }),
|
|
85
|
-
setActiveTab: (t) => e(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
messages: [...e.sessionStates[t]?.messages ?? [], n]
|
|
111
|
+
setActiveTab: (t) => e((e) => ({
|
|
112
|
+
activeTabSessionId: t,
|
|
113
|
+
sessionStates: {
|
|
114
|
+
...e.sessionStates,
|
|
115
|
+
[t]: e.sessionStates[t] ?? r()
|
|
91
116
|
}
|
|
92
|
-
}
|
|
117
|
+
})),
|
|
118
|
+
addMessage: (t, n) => e((e) => {
|
|
119
|
+
let i = e.sessionStates[t] ?? r();
|
|
120
|
+
return i.messages.some((e) => e.id === n.id) ? e : { sessionStates: {
|
|
121
|
+
...e.sessionStates,
|
|
122
|
+
[t]: {
|
|
123
|
+
...i,
|
|
124
|
+
messages: [...i.messages, n]
|
|
125
|
+
}
|
|
126
|
+
} };
|
|
127
|
+
}),
|
|
93
128
|
updateMessage: (t, n, r) => e((e) => {
|
|
94
129
|
let i = e.sessionStates[t];
|
|
95
130
|
return i ? { sessionStates: {
|
|
@@ -194,6 +229,18 @@ var i = {
|
|
|
194
229
|
}
|
|
195
230
|
} } : e;
|
|
196
231
|
}),
|
|
232
|
+
hydrateSessionConfig: (t, n) => e((e) => {
|
|
233
|
+
let i = e.sessionStates[t] ?? r(), s = n.config ?? {};
|
|
234
|
+
return { sessionStates: {
|
|
235
|
+
...e.sessionStates,
|
|
236
|
+
[t]: {
|
|
237
|
+
...i,
|
|
238
|
+
sdk: a(n.agentType) ?? i.sdk,
|
|
239
|
+
mode: o(s.mode) ?? i.mode,
|
|
240
|
+
model: typeof s.model == "string" ? s.model : i.model
|
|
241
|
+
}
|
|
242
|
+
} };
|
|
243
|
+
}),
|
|
197
244
|
toggleSidebar: () => e((e) => ({ sidebarOpen: !e.sidebarOpen })),
|
|
198
245
|
setSidebarOpen: (t) => e({ sidebarOpen: t }),
|
|
199
246
|
setSidebarSearchQuery: (t) => e({ sidebarSearchQuery: t }),
|
|
@@ -201,7 +248,7 @@ var i = {
|
|
|
201
248
|
...e.sidebarFilters,
|
|
202
249
|
...t
|
|
203
250
|
} })),
|
|
204
|
-
resetSidebarFilters: () => e({ sidebarFilters: { ...
|
|
251
|
+
resetSidebarFilters: () => e({ sidebarFilters: { ...s } }),
|
|
205
252
|
setSidebarGroupBy: (t) => e({ sidebarGroupBy: t }),
|
|
206
253
|
toggleDetailPanel: () => e((e) => ({ detailPanelOpen: !e.detailPanelOpen })),
|
|
207
254
|
setDetailPanelOpen: (t) => e({ detailPanelOpen: t }),
|
|
@@ -217,7 +264,7 @@ var i = {
|
|
|
217
264
|
sessionStates: {},
|
|
218
265
|
sidebarOpen: !0,
|
|
219
266
|
sidebarSearchQuery: "",
|
|
220
|
-
sidebarFilters: { ...
|
|
267
|
+
sidebarFilters: { ...s },
|
|
221
268
|
sidebarGroupBy: "date",
|
|
222
269
|
detailPanelOpen: !1,
|
|
223
270
|
detailPanelTab: "info",
|
|
@@ -239,6 +286,6 @@ var i = {
|
|
|
239
286
|
})
|
|
240
287
|
}));
|
|
241
288
|
//#endregion
|
|
242
|
-
export {
|
|
289
|
+
export { c as useAgentManagerStore };
|
|
243
290
|
|
|
244
291
|
//# sourceMappingURL=agentManagerStore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentManagerStore.js","names":[],"sources":["../../src/store/agentManagerStore.ts"],"sourcesContent":["/**\n * Agent Manager state management.\n *\n * Zustand store with profile-scoped persistence for multi-session\n * tabbed agent management. Follows the same pattern as assistantStore.ts.\n */\n\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\nimport { createProfileScopedStorage } from '@burdenoff/fe-libs/shared/utils';\nimport type {\n AdminTab,\n AgentManagerMessage,\n AgentManagerSessionState,\n AgentManagerTab,\n AgentSdkType,\n DetailPanelTab,\n ProviderMode,\n SessionFilters,\n SidebarGroupBy,\n} from '@/types/agentManager';\n\n/** Default state for a new session */\nfunction createDefaultSessionState(): AgentManagerSessionState {\n return {\n messages: [],\n model: 'claude-sonnet-4-20250514',\n sdk: 'claude',\n mode: 'sdk',\n mcpServers: [],\n voiceEnabled: false,\n showThinking: true,\n contextHistoryLimit: 20,\n status: 'idle',\n rootPath: null,\n contextLevel: 'agent',\n vibeId: null,\n };\n}\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\ninterface AgentManagerState {\n // ── Tab management ──\n tabs: AgentManagerTab[];\n activeTabSessionId: string | null;\n tabLimit: number; // Max visible tabs before scrolling (default 10)\n\n // ── Per-session state ──\n sessionStates: Record<string, AgentManagerSessionState>;\n\n // ── Sidebar ──\n sidebarOpen: boolean;\n sidebarSearchQuery: string;\n sidebarFilters: SessionFilters;\n sidebarGroupBy: SidebarGroupBy;\n\n // ── Detail panel ──\n detailPanelOpen: boolean;\n detailPanelTab: DetailPanelTab;\n\n // ── Admin tab ──\n adminTab: AdminTab;\n\n // ── Bulk selection ──\n selectedSessionIds: string[];\n\n // ── Fullscreen ──\n isFullscreen: boolean;\n\n // ── Tab actions ──\n openSession: (sessionId: string, name?: string) => void;\n closeTab: (sessionId: string) => void;\n pinTab: (sessionId: string) => void;\n renameTab: (sessionId: string, name: string) => void;\n setTabLimit: (limit: number) => void;\n reorderTabs: (tabs: AgentManagerTab[]) => void;\n setActiveTab: (sessionId: string) => void;\n\n // ── Session state actions ──\n addMessage: (sessionId: string, message: AgentManagerMessage) => void;\n updateMessage: (sessionId: string, messageId: string, content: string) => void;\n setSessionModel: (sessionId: string, model: string) => void;\n setSessionSdk: (sessionId: string, sdk: AgentSdkType) => void;\n setSessionMode: (sessionId: string, mode: ProviderMode) => void;\n toggleVoice: (sessionId: string) => void;\n toggleThinking: (sessionId: string) => void;\n setSessionStatus: (sessionId: string, status: AgentManagerSessionState['status']) => void;\n setSessionRootPath: (sessionId: string, rootPath: string | null) => void;\n setSessionContextLevel: (\n sessionId: string,\n level: AgentManagerSessionState['contextLevel']\n ) => void;\n setSessionVibe: (sessionId: string, vibeId: string | null, rootPath: string | null) => void;\n\n // ── Sidebar actions ──\n toggleSidebar: () => void;\n setSidebarOpen: (open: boolean) => void;\n setSidebarSearchQuery: (query: string) => void;\n setSidebarFilters: (filters: Partial<SessionFilters>) => void;\n resetSidebarFilters: () => void;\n setSidebarGroupBy: (groupBy: SidebarGroupBy) => void;\n\n // ── Detail panel actions ──\n toggleDetailPanel: () => void;\n setDetailPanelOpen: (open: boolean) => void;\n setDetailPanelTab: (tab: DetailPanelTab) => void;\n\n // ── Admin tab actions ──\n setAdminTab: (tab: AdminTab) => void;\n\n // ── Bulk selection actions ──\n toggleSessionSelection: (sessionId: string) => void;\n selectAllSessions: (sessionIds: string[]) => void;\n clearSelection: () => void;\n\n // ── Fullscreen ──\n toggleFullscreen: () => void;\n\n // ── Reset ──\n resetStore: () => void;\n}\n\nconst defaultFilters: SessionFilters = {\n status: [],\n model: [],\n sdk: [],\n dateRange: { from: null, to: null },\n searchQuery: '',\n};\n\nexport const useAgentManagerStore = create<AgentManagerState>()(\n persist(\n (set, get) => ({\n tabs: [],\n activeTabSessionId: null,\n tabLimit: 10,\n sessionStates: {},\n sidebarOpen: true,\n sidebarSearchQuery: '',\n sidebarFilters: { ...defaultFilters },\n sidebarGroupBy: 'date',\n detailPanelOpen: false,\n detailPanelTab: 'info',\n adminTab: 'templates',\n selectedSessionIds: [],\n isFullscreen: false,\n\n // ── Tab actions ──\n\n openSession: (sessionId: string, name?: string) => {\n const state = get();\n const existingTab = state.tabs.find((t) => t.sessionId === sessionId);\n\n if (existingTab) {\n set({ activeTabSessionId: sessionId });\n return;\n }\n\n const newTab: AgentManagerTab = {\n sessionId,\n name: name ?? `Session ${state.tabs.length + 1}`,\n pinned: false,\n order: state.tabs.length,\n };\n\n set((prev) => ({\n tabs: [...prev.tabs, newTab],\n activeTabSessionId: sessionId,\n sessionStates: {\n ...prev.sessionStates,\n [sessionId]: prev.sessionStates[sessionId] ?? createDefaultSessionState(),\n },\n }));\n },\n\n closeTab: (sessionId: string) =>\n set((state) => {\n const filtered = state.tabs.filter((t) => t.sessionId !== sessionId);\n const nextSessionStates = { ...state.sessionStates };\n delete nextSessionStates[sessionId];\n\n let nextActive = state.activeTabSessionId;\n if (nextActive === sessionId) {\n nextActive = filtered.length > 0 ? filtered[filtered.length - 1].sessionId : null;\n }\n\n return {\n tabs: filtered,\n activeTabSessionId: nextActive,\n sessionStates: nextSessionStates,\n };\n }),\n\n pinTab: (sessionId: string) =>\n set((state) => ({\n tabs: state.tabs.map((t) =>\n t.sessionId === sessionId ? { ...t, pinned: !t.pinned } : t\n ),\n })),\n\n setTabLimit: (limit: number) => set({ tabLimit: Math.max(1, limit) }),\n\n renameTab: (sessionId: string, name: string) =>\n set((state) => ({\n tabs: state.tabs.map((t) => (t.sessionId === sessionId ? { ...t, name } : t)),\n })),\n\n reorderTabs: (tabs: AgentManagerTab[]) => set({ tabs }),\n\n setActiveTab: (sessionId: string) => set({ activeTabSessionId: sessionId }),\n\n // ── Session state actions ──\n\n addMessage: (sessionId: string, message: AgentManagerMessage) =>\n set((state) => ({\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: {\n ...(state.sessionStates[sessionId] ?? createDefaultSessionState()),\n messages: [...(state.sessionStates[sessionId]?.messages ?? []), message],\n },\n },\n })),\n\n updateMessage: (sessionId: string, messageId: string, content: string) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: {\n ...sessionState,\n messages: sessionState.messages.map((m) =>\n m.id === messageId ? { ...m, content } : m\n ),\n },\n },\n };\n }),\n\n setSessionModel: (sessionId: string, model: string) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: { ...sessionState, model },\n },\n };\n }),\n\n setSessionSdk: (sessionId: string, sdk: AgentSdkType) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: { ...sessionState, sdk },\n },\n };\n }),\n\n setSessionMode: (sessionId: string, mode: ProviderMode) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: { ...sessionState, mode },\n },\n };\n }),\n\n toggleVoice: (sessionId: string) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: {\n ...sessionState,\n voiceEnabled: !sessionState.voiceEnabled,\n },\n },\n };\n }),\n\n toggleThinking: (sessionId: string) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: {\n ...sessionState,\n showThinking: !sessionState.showThinking,\n },\n },\n };\n }),\n\n setSessionStatus: (sessionId: string, status: AgentManagerSessionState['status']) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: { ...sessionState, status },\n },\n };\n }),\n\n setSessionRootPath: (sessionId: string, rootPath: string | null) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: { ...sessionState, rootPath },\n },\n };\n }),\n\n setSessionContextLevel: (\n sessionId: string,\n level: AgentManagerSessionState['contextLevel']\n ) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: { ...sessionState, contextLevel: level },\n },\n };\n }),\n\n setSessionVibe: (sessionId: string, vibeId: string | null, rootPath: string | null) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: { ...sessionState, vibeId, rootPath },\n },\n };\n }),\n\n // ── Sidebar actions ──\n\n toggleSidebar: () => set((state) => ({ sidebarOpen: !state.sidebarOpen })),\n\n setSidebarOpen: (open: boolean) => set({ sidebarOpen: open }),\n\n setSidebarSearchQuery: (query: string) => set({ sidebarSearchQuery: query }),\n\n setSidebarFilters: (filters: Partial<SessionFilters>) =>\n set((state) => ({\n sidebarFilters: { ...state.sidebarFilters, ...filters },\n })),\n\n resetSidebarFilters: () => set({ sidebarFilters: { ...defaultFilters } }),\n\n setSidebarGroupBy: (groupBy: SidebarGroupBy) => set({ sidebarGroupBy: groupBy }),\n\n // ── Detail panel actions ──\n\n toggleDetailPanel: () => set((state) => ({ detailPanelOpen: !state.detailPanelOpen })),\n\n setDetailPanelOpen: (open: boolean) => set({ detailPanelOpen: open }),\n\n setDetailPanelTab: (tab: DetailPanelTab) => set({ detailPanelTab: tab }),\n\n // ── Admin tab actions ──\n\n setAdminTab: (tab: AdminTab) => set({ adminTab: tab }),\n\n // ── Bulk selection actions ──\n\n toggleSessionSelection: (sessionId: string) =>\n set((state) => {\n const isSelected = state.selectedSessionIds.includes(sessionId);\n return {\n selectedSessionIds: isSelected\n ? state.selectedSessionIds.filter((id) => id !== sessionId)\n : [...state.selectedSessionIds, sessionId],\n };\n }),\n\n selectAllSessions: (sessionIds: string[]) => set({ selectedSessionIds: sessionIds }),\n\n clearSelection: () => set({ selectedSessionIds: [] }),\n\n // ── Fullscreen ──\n\n toggleFullscreen: () => set((state) => ({ isFullscreen: !state.isFullscreen })),\n\n // ── Reset ──\n\n resetStore: () =>\n set({\n tabs: [],\n activeTabSessionId: null,\n sessionStates: {},\n sidebarOpen: true,\n sidebarSearchQuery: '',\n sidebarFilters: { ...defaultFilters },\n sidebarGroupBy: 'date',\n detailPanelOpen: false,\n detailPanelTab: 'info',\n adminTab: 'templates',\n selectedSessionIds: [],\n }),\n }),\n {\n name: 'vibecontrols-agent-manager',\n storage: createProfileScopedStorage(),\n partialize: (state) => ({\n tabs: state.tabs,\n activeTabSessionId: state.activeTabSessionId,\n sidebarOpen: state.sidebarOpen,\n sidebarGroupBy: state.sidebarGroupBy,\n detailPanelOpen: state.detailPanelOpen,\n detailPanelTab: state.detailPanelTab,\n adminTab: state.adminTab,\n isFullscreen: state.isFullscreen,\n }),\n }\n )\n);\n"],"mappings":";;;;AAuBA,SAAS,IAAsD;AAC7D,QAAO;EACL,UAAU,EAAE;EACZ,OAAO;EACP,KAAK;EACL,MAAM;EACN,YAAY,EAAE;EACd,cAAc;EACd,cAAc;EACd,qBAAqB;EACrB,QAAQ;EACR,UAAU;EACV,cAAc;EACd,QAAQ;EACT;;AAwFH,IAAM,IAAiC;CACrC,QAAQ,EAAE;CACV,OAAO,EAAE;CACT,KAAK,EAAE;CACP,WAAW;EAAE,MAAM;EAAM,IAAI;EAAM;CACnC,aAAa;CACd,EAEY,IAAuB,GAA2B,CAC7D,GACG,GAAK,OAAS;CACb,MAAM,EAAE;CACR,oBAAoB;CACpB,UAAU;CACV,eAAe,EAAE;CACjB,aAAa;CACb,oBAAoB;CACpB,gBAAgB,EAAE,GAAG,GAAgB;CACrC,gBAAgB;CAChB,iBAAiB;CACjB,gBAAgB;CAChB,UAAU;CACV,oBAAoB,EAAE;CACtB,cAAc;CAId,cAAc,GAAmB,MAAkB;EACjD,IAAM,IAAQ,GAAK;AAGnB,MAFoB,EAAM,KAAK,MAAM,MAAM,EAAE,cAAc,EAAU,EAEpD;AACf,KAAI,EAAE,oBAAoB,GAAW,CAAC;AACtC;;EAGF,IAAM,IAA0B;GAC9B;GACA,MAAM,KAAQ,WAAW,EAAM,KAAK,SAAS;GAC7C,QAAQ;GACR,OAAO,EAAM,KAAK;GACnB;AAED,KAAK,OAAU;GACb,MAAM,CAAC,GAAG,EAAK,MAAM,EAAO;GAC5B,oBAAoB;GACpB,eAAe;IACb,GAAG,EAAK;KACP,IAAY,EAAK,cAAc,MAAc,GAA2B;IAC1E;GACF,EAAE;;CAGL,WAAW,MACT,GAAK,MAAU;EACb,IAAM,IAAW,EAAM,KAAK,QAAQ,MAAM,EAAE,cAAc,EAAU,EAC9D,IAAoB,EAAE,GAAG,EAAM,eAAe;AACpD,SAAO,EAAkB;EAEzB,IAAI,IAAa,EAAM;AAKvB,SAJI,MAAe,MACjB,IAAa,EAAS,SAAS,IAAI,EAAS,EAAS,SAAS,GAAG,YAAY,OAGxE;GACL,MAAM;GACN,oBAAoB;GACpB,eAAe;GAChB;GACD;CAEJ,SAAS,MACP,GAAK,OAAW,EACd,MAAM,EAAM,KAAK,KAAK,MACpB,EAAE,cAAc,IAAY;EAAE,GAAG;EAAG,QAAQ,CAAC,EAAE;EAAQ,GAAG,EAC3D,EACF,EAAE;CAEL,cAAc,MAAkB,EAAI,EAAE,UAAU,KAAK,IAAI,GAAG,EAAM,EAAE,CAAC;CAErE,YAAY,GAAmB,MAC7B,GAAK,OAAW,EACd,MAAM,EAAM,KAAK,KAAK,MAAO,EAAE,cAAc,IAAY;EAAE,GAAG;EAAG;EAAM,GAAG,EAAG,EAC9E,EAAE;CAEL,cAAc,MAA4B,EAAI,EAAE,SAAM,CAAC;CAEvD,eAAe,MAAsB,EAAI,EAAE,oBAAoB,GAAW,CAAC;CAI3E,aAAa,GAAmB,MAC9B,GAAK,OAAW,EACd,eAAe;EACb,GAAG,EAAM;GACR,IAAY;GACX,GAAI,EAAM,cAAc,MAAc,GAA2B;GACjE,UAAU,CAAC,GAAI,EAAM,cAAc,IAAY,YAAY,EAAE,EAAG,EAAQ;GACzE;EACF,EACF,EAAE;CAEL,gBAAgB,GAAmB,GAAmB,MACpD,GAAK,MAAU;EACb,IAAM,IAAe,EAAM,cAAc;AAEzC,SADK,IACE,EACL,eAAe;GACb,GAAG,EAAM;IACR,IAAY;IACX,GAAG;IACH,UAAU,EAAa,SAAS,KAAK,MACnC,EAAE,OAAO,IAAY;KAAE,GAAG;KAAG;KAAS,GAAG,EAC1C;IACF;GACF,EACF,GAXyB;GAY1B;CAEJ,kBAAkB,GAAmB,MACnC,GAAK,MAAU;EACb,IAAM,IAAe,EAAM,cAAc;AAEzC,SADK,IACE,EACL,eAAe;GACb,GAAG,EAAM;IACR,IAAY;IAAE,GAAG;IAAc;IAAO;GACxC,EACF,GANyB;GAO1B;CAEJ,gBAAgB,GAAmB,MACjC,GAAK,MAAU;EACb,IAAM,IAAe,EAAM,cAAc;AAEzC,SADK,IACE,EACL,eAAe;GACb,GAAG,EAAM;IACR,IAAY;IAAE,GAAG;IAAc;IAAK;GACtC,EACF,GANyB;GAO1B;CAEJ,iBAAiB,GAAmB,MAClC,GAAK,MAAU;EACb,IAAM,IAAe,EAAM,cAAc;AAEzC,SADK,IACE,EACL,eAAe;GACb,GAAG,EAAM;IACR,IAAY;IAAE,GAAG;IAAc;IAAM;GACvC,EACF,GANyB;GAO1B;CAEJ,cAAc,MACZ,GAAK,MAAU;EACb,IAAM,IAAe,EAAM,cAAc;AAEzC,SADK,IACE,EACL,eAAe;GACb,GAAG,EAAM;IACR,IAAY;IACX,GAAG;IACH,cAAc,CAAC,EAAa;IAC7B;GACF,EACF,GATyB;GAU1B;CAEJ,iBAAiB,MACf,GAAK,MAAU;EACb,IAAM,IAAe,EAAM,cAAc;AAEzC,SADK,IACE,EACL,eAAe;GACb,GAAG,EAAM;IACR,IAAY;IACX,GAAG;IACH,cAAc,CAAC,EAAa;IAC7B;GACF,EACF,GATyB;GAU1B;CAEJ,mBAAmB,GAAmB,MACpC,GAAK,MAAU;EACb,IAAM,IAAe,EAAM,cAAc;AAEzC,SADK,IACE,EACL,eAAe;GACb,GAAG,EAAM;IACR,IAAY;IAAE,GAAG;IAAc;IAAQ;GACzC,EACF,GANyB;GAO1B;CAEJ,qBAAqB,GAAmB,MACtC,GAAK,MAAU;EACb,IAAM,IAAe,EAAM,cAAc;AAEzC,SADK,IACE,EACL,eAAe;GACb,GAAG,EAAM;IACR,IAAY;IAAE,GAAG;IAAc;IAAU;GAC3C,EACF,GANyB;GAO1B;CAEJ,yBACE,GACA,MAEA,GAAK,MAAU;EACb,IAAM,IAAe,EAAM,cAAc;AAEzC,SADK,IACE,EACL,eAAe;GACb,GAAG,EAAM;IACR,IAAY;IAAE,GAAG;IAAc,cAAc;IAAO;GACtD,EACF,GANyB;GAO1B;CAEJ,iBAAiB,GAAmB,GAAuB,MACzD,GAAK,MAAU;EACb,IAAM,IAAe,EAAM,cAAc;AAEzC,SADK,IACE,EACL,eAAe;GACb,GAAG,EAAM;IACR,IAAY;IAAE,GAAG;IAAc;IAAQ;IAAU;GACnD,EACF,GANyB;GAO1B;CAIJ,qBAAqB,GAAK,OAAW,EAAE,aAAa,CAAC,EAAM,aAAa,EAAE;CAE1E,iBAAiB,MAAkB,EAAI,EAAE,aAAa,GAAM,CAAC;CAE7D,wBAAwB,MAAkB,EAAI,EAAE,oBAAoB,GAAO,CAAC;CAE5E,oBAAoB,MAClB,GAAK,OAAW,EACd,gBAAgB;EAAE,GAAG,EAAM;EAAgB,GAAG;EAAS,EACxD,EAAE;CAEL,2BAA2B,EAAI,EAAE,gBAAgB,EAAE,GAAG,GAAgB,EAAE,CAAC;CAEzE,oBAAoB,MAA4B,EAAI,EAAE,gBAAgB,GAAS,CAAC;CAIhF,yBAAyB,GAAK,OAAW,EAAE,iBAAiB,CAAC,EAAM,iBAAiB,EAAE;CAEtF,qBAAqB,MAAkB,EAAI,EAAE,iBAAiB,GAAM,CAAC;CAErE,oBAAoB,MAAwB,EAAI,EAAE,gBAAgB,GAAK,CAAC;CAIxE,cAAc,MAAkB,EAAI,EAAE,UAAU,GAAK,CAAC;CAItD,yBAAyB,MACvB,GAAK,OAEI,EACL,oBAFiB,EAAM,mBAAmB,SAAS,EAAU,GAGzD,EAAM,mBAAmB,QAAQ,MAAO,MAAO,EAAU,GACzD,CAAC,GAAG,EAAM,oBAAoB,EAAU,EAC7C,EACD;CAEJ,oBAAoB,MAAyB,EAAI,EAAE,oBAAoB,GAAY,CAAC;CAEpF,sBAAsB,EAAI,EAAE,oBAAoB,EAAE,EAAE,CAAC;CAIrD,wBAAwB,GAAK,OAAW,EAAE,cAAc,CAAC,EAAM,cAAc,EAAE;CAI/E,kBACE,EAAI;EACF,MAAM,EAAE;EACR,oBAAoB;EACpB,eAAe,EAAE;EACjB,aAAa;EACb,oBAAoB;EACpB,gBAAgB,EAAE,GAAG,GAAgB;EACrC,gBAAgB;EAChB,iBAAiB;EACjB,gBAAgB;EAChB,UAAU;EACV,oBAAoB,EAAE;EACvB,CAAC;CACL,GACD;CACE,MAAM;CACN,SAAS,GAA4B;CACrC,aAAa,OAAW;EACtB,MAAM,EAAM;EACZ,oBAAoB,EAAM;EAC1B,aAAa,EAAM;EACnB,gBAAgB,EAAM;EACtB,iBAAiB,EAAM;EACvB,gBAAgB,EAAM;EACtB,UAAU,EAAM;EAChB,cAAc,EAAM;EACrB;CACF,CACF,CACF"}
|
|
1
|
+
{"version":3,"file":"agentManagerStore.js","names":[],"sources":["../../src/store/agentManagerStore.ts"],"sourcesContent":["/**\n * Agent Manager state management.\n *\n * Zustand store with profile-scoped persistence for multi-session\n * tabbed agent management. Follows the same pattern as assistantStore.ts.\n */\n\nimport { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\nimport { createProfileScopedStorage } from '@burdenoff/fe-libs/shared/utils';\nimport type {\n AdminTab,\n AgentManagerMessage,\n AgentManagerSessionState,\n AgentManagerTab,\n AgentSdkType,\n DetailPanelTab,\n ProviderMode,\n SessionFilters,\n SidebarGroupBy,\n} from '@/types/agentManager';\n\n/** Default state for a new session */\nfunction createDefaultSessionState(): AgentManagerSessionState {\n return {\n messages: [],\n model: 'claude-sonnet-4-20250514',\n sdk: 'claude',\n mode: 'sdk',\n mcpServers: [],\n voiceEnabled: false,\n showThinking: true,\n contextHistoryLimit: 20,\n status: 'idle',\n rootPath: null,\n contextLevel: 'agent',\n vibeId: null,\n };\n}\n\nconst VALID_SDKS = new Set<AgentSdkType>([\n 'claude',\n 'codex',\n 'opencode',\n 'gemini',\n 'openai-compat',\n 'goose',\n 'amp',\n 'copilot',\n 'crush',\n 'pi',\n 'aider',\n 'plandex',\n]);\n\nfunction asSdk(value: unknown): AgentSdkType | null {\n return typeof value === 'string' && VALID_SDKS.has(value as AgentSdkType)\n ? (value as AgentSdkType)\n : null;\n}\n\nfunction asMode(value: unknown): ProviderMode | null {\n return value === 'sdk' || value === 'cli' ? value : null;\n}\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\ninterface AgentManagerState {\n // ── Tab management ──\n tabs: AgentManagerTab[];\n activeTabSessionId: string | null;\n tabLimit: number; // Max visible tabs before scrolling (default 10)\n\n // ── Per-session state ──\n sessionStates: Record<string, AgentManagerSessionState>;\n\n // ── Sidebar ──\n sidebarOpen: boolean;\n sidebarSearchQuery: string;\n sidebarFilters: SessionFilters;\n sidebarGroupBy: SidebarGroupBy;\n\n // ── Detail panel ──\n detailPanelOpen: boolean;\n detailPanelTab: DetailPanelTab;\n\n // ── Admin tab ──\n adminTab: AdminTab;\n\n // ── Bulk selection ──\n selectedSessionIds: string[];\n\n // ── Fullscreen ──\n isFullscreen: boolean;\n\n // ── Tab actions ──\n openSession: (sessionId: string, name?: string) => void;\n closeTab: (sessionId: string) => void;\n pinTab: (sessionId: string) => void;\n renameTab: (sessionId: string, name: string) => void;\n setTabLimit: (limit: number) => void;\n reorderTabs: (tabs: AgentManagerTab[]) => void;\n setActiveTab: (sessionId: string) => void;\n\n // ── Session state actions ──\n addMessage: (sessionId: string, message: AgentManagerMessage) => void;\n updateMessage: (sessionId: string, messageId: string, content: string) => void;\n setSessionModel: (sessionId: string, model: string) => void;\n setSessionSdk: (sessionId: string, sdk: AgentSdkType) => void;\n setSessionMode: (sessionId: string, mode: ProviderMode) => void;\n toggleVoice: (sessionId: string) => void;\n toggleThinking: (sessionId: string) => void;\n setSessionStatus: (sessionId: string, status: AgentManagerSessionState['status']) => void;\n setSessionRootPath: (sessionId: string, rootPath: string | null) => void;\n setSessionContextLevel: (\n sessionId: string,\n level: AgentManagerSessionState['contextLevel']\n ) => void;\n setSessionVibe: (sessionId: string, vibeId: string | null, rootPath: string | null) => void;\n hydrateSessionConfig: (\n sessionId: string,\n metadata: { agentType?: string | null; config?: Record<string, unknown> | null }\n ) => void;\n\n // ── Sidebar actions ──\n toggleSidebar: () => void;\n setSidebarOpen: (open: boolean) => void;\n setSidebarSearchQuery: (query: string) => void;\n setSidebarFilters: (filters: Partial<SessionFilters>) => void;\n resetSidebarFilters: () => void;\n setSidebarGroupBy: (groupBy: SidebarGroupBy) => void;\n\n // ── Detail panel actions ──\n toggleDetailPanel: () => void;\n setDetailPanelOpen: (open: boolean) => void;\n setDetailPanelTab: (tab: DetailPanelTab) => void;\n\n // ── Admin tab actions ──\n setAdminTab: (tab: AdminTab) => void;\n\n // ── Bulk selection actions ──\n toggleSessionSelection: (sessionId: string) => void;\n selectAllSessions: (sessionIds: string[]) => void;\n clearSelection: () => void;\n\n // ── Fullscreen ──\n toggleFullscreen: () => void;\n\n // ── Reset ──\n resetStore: () => void;\n}\n\nconst defaultFilters: SessionFilters = {\n status: [],\n model: [],\n sdk: [],\n dateRange: { from: null, to: null },\n searchQuery: '',\n};\n\nexport const useAgentManagerStore = create<AgentManagerState>()(\n persist(\n (set, get) => ({\n tabs: [],\n activeTabSessionId: null,\n tabLimit: 10,\n sessionStates: {},\n sidebarOpen: true,\n sidebarSearchQuery: '',\n sidebarFilters: { ...defaultFilters },\n sidebarGroupBy: 'date',\n detailPanelOpen: false,\n detailPanelTab: 'info',\n adminTab: 'templates',\n selectedSessionIds: [],\n isFullscreen: false,\n\n // ── Tab actions ──\n\n openSession: (sessionId: string, name?: string) => {\n const state = get();\n const existingTab = state.tabs.find((t) => t.sessionId === sessionId);\n\n if (existingTab) {\n set((prev) => ({\n activeTabSessionId: sessionId,\n sessionStates: {\n ...prev.sessionStates,\n [sessionId]: prev.sessionStates[sessionId] ?? createDefaultSessionState(),\n },\n }));\n return;\n }\n\n const newTab: AgentManagerTab = {\n sessionId,\n name: name ?? `Session ${state.tabs.length + 1}`,\n pinned: false,\n order: state.tabs.length,\n };\n\n set((prev) => ({\n tabs: [...prev.tabs, newTab],\n activeTabSessionId: sessionId,\n sessionStates: {\n ...prev.sessionStates,\n [sessionId]: prev.sessionStates[sessionId] ?? createDefaultSessionState(),\n },\n }));\n },\n\n closeTab: (sessionId: string) =>\n set((state) => {\n const filtered = state.tabs.filter((t) => t.sessionId !== sessionId);\n const nextSessionStates = { ...state.sessionStates };\n delete nextSessionStates[sessionId];\n\n let nextActive = state.activeTabSessionId;\n if (nextActive === sessionId) {\n nextActive = filtered.length > 0 ? filtered[filtered.length - 1].sessionId : null;\n }\n\n return {\n tabs: filtered,\n activeTabSessionId: nextActive,\n sessionStates: nextSessionStates,\n };\n }),\n\n pinTab: (sessionId: string) =>\n set((state) => ({\n tabs: state.tabs.map((t) =>\n t.sessionId === sessionId ? { ...t, pinned: !t.pinned } : t\n ),\n })),\n\n setTabLimit: (limit: number) => set({ tabLimit: Math.max(1, limit) }),\n\n renameTab: (sessionId: string, name: string) =>\n set((state) => ({\n tabs: state.tabs.map((t) => (t.sessionId === sessionId ? { ...t, name } : t)),\n })),\n\n reorderTabs: (tabs: AgentManagerTab[]) => set({ tabs }),\n\n setActiveTab: (sessionId: string) =>\n set((state) => ({\n activeTabSessionId: sessionId,\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: state.sessionStates[sessionId] ?? createDefaultSessionState(),\n },\n })),\n\n // ── Session state actions ──\n\n addMessage: (sessionId: string, message: AgentManagerMessage) =>\n set((state) => {\n const current = state.sessionStates[sessionId] ?? createDefaultSessionState();\n if (current.messages.some((existing) => existing.id === message.id)) return state;\n\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: {\n ...current,\n messages: [...current.messages, message],\n },\n },\n };\n }),\n\n updateMessage: (sessionId: string, messageId: string, content: string) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: {\n ...sessionState,\n messages: sessionState.messages.map((m) =>\n m.id === messageId ? { ...m, content } : m\n ),\n },\n },\n };\n }),\n\n setSessionModel: (sessionId: string, model: string) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: { ...sessionState, model },\n },\n };\n }),\n\n setSessionSdk: (sessionId: string, sdk: AgentSdkType) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: { ...sessionState, sdk },\n },\n };\n }),\n\n setSessionMode: (sessionId: string, mode: ProviderMode) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: { ...sessionState, mode },\n },\n };\n }),\n\n toggleVoice: (sessionId: string) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: {\n ...sessionState,\n voiceEnabled: !sessionState.voiceEnabled,\n },\n },\n };\n }),\n\n toggleThinking: (sessionId: string) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: {\n ...sessionState,\n showThinking: !sessionState.showThinking,\n },\n },\n };\n }),\n\n setSessionStatus: (sessionId: string, status: AgentManagerSessionState['status']) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: { ...sessionState, status },\n },\n };\n }),\n\n setSessionRootPath: (sessionId: string, rootPath: string | null) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: { ...sessionState, rootPath },\n },\n };\n }),\n\n setSessionContextLevel: (\n sessionId: string,\n level: AgentManagerSessionState['contextLevel']\n ) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: { ...sessionState, contextLevel: level },\n },\n };\n }),\n\n setSessionVibe: (sessionId: string, vibeId: string | null, rootPath: string | null) =>\n set((state) => {\n const sessionState = state.sessionStates[sessionId];\n if (!sessionState) return state;\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: { ...sessionState, vibeId, rootPath },\n },\n };\n }),\n\n hydrateSessionConfig: (sessionId, metadata) =>\n set((state) => {\n const current = state.sessionStates[sessionId] ?? createDefaultSessionState();\n const config = metadata.config ?? {};\n return {\n sessionStates: {\n ...state.sessionStates,\n [sessionId]: {\n ...current,\n sdk: asSdk(metadata.agentType) ?? current.sdk,\n mode: asMode(config.mode) ?? current.mode,\n model: typeof config.model === 'string' ? config.model : current.model,\n },\n },\n };\n }),\n\n // ── Sidebar actions ──\n\n toggleSidebar: () => set((state) => ({ sidebarOpen: !state.sidebarOpen })),\n\n setSidebarOpen: (open: boolean) => set({ sidebarOpen: open }),\n\n setSidebarSearchQuery: (query: string) => set({ sidebarSearchQuery: query }),\n\n setSidebarFilters: (filters: Partial<SessionFilters>) =>\n set((state) => ({\n sidebarFilters: { ...state.sidebarFilters, ...filters },\n })),\n\n resetSidebarFilters: () => set({ sidebarFilters: { ...defaultFilters } }),\n\n setSidebarGroupBy: (groupBy: SidebarGroupBy) => set({ sidebarGroupBy: groupBy }),\n\n // ── Detail panel actions ──\n\n toggleDetailPanel: () => set((state) => ({ detailPanelOpen: !state.detailPanelOpen })),\n\n setDetailPanelOpen: (open: boolean) => set({ detailPanelOpen: open }),\n\n setDetailPanelTab: (tab: DetailPanelTab) => set({ detailPanelTab: tab }),\n\n // ── Admin tab actions ──\n\n setAdminTab: (tab: AdminTab) => set({ adminTab: tab }),\n\n // ── Bulk selection actions ──\n\n toggleSessionSelection: (sessionId: string) =>\n set((state) => {\n const isSelected = state.selectedSessionIds.includes(sessionId);\n return {\n selectedSessionIds: isSelected\n ? state.selectedSessionIds.filter((id) => id !== sessionId)\n : [...state.selectedSessionIds, sessionId],\n };\n }),\n\n selectAllSessions: (sessionIds: string[]) => set({ selectedSessionIds: sessionIds }),\n\n clearSelection: () => set({ selectedSessionIds: [] }),\n\n // ── Fullscreen ──\n\n toggleFullscreen: () => set((state) => ({ isFullscreen: !state.isFullscreen })),\n\n // ── Reset ──\n\n resetStore: () =>\n set({\n tabs: [],\n activeTabSessionId: null,\n sessionStates: {},\n sidebarOpen: true,\n sidebarSearchQuery: '',\n sidebarFilters: { ...defaultFilters },\n sidebarGroupBy: 'date',\n detailPanelOpen: false,\n detailPanelTab: 'info',\n adminTab: 'templates',\n selectedSessionIds: [],\n }),\n }),\n {\n name: 'vibecontrols-agent-manager',\n storage: createProfileScopedStorage(),\n partialize: (state) => ({\n tabs: state.tabs,\n activeTabSessionId: state.activeTabSessionId,\n sidebarOpen: state.sidebarOpen,\n sidebarGroupBy: state.sidebarGroupBy,\n detailPanelOpen: state.detailPanelOpen,\n detailPanelTab: state.detailPanelTab,\n adminTab: state.adminTab,\n isFullscreen: state.isFullscreen,\n }),\n }\n )\n);\n"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { createProfileScopedStorage as e } from "@burdenoff/fe-libs/shared/utils
|
|
|
2
2
|
import { create as t } from "zustand";
|
|
3
3
|
import { persist as n } from "zustand/middleware";
|
|
4
4
|
//#region src/store/vibeControlsStore.ts
|
|
5
|
-
var r = t()(n((e) => ({
|
|
5
|
+
var r = t()(n((e, t) => ({
|
|
6
6
|
currentView: "agents",
|
|
7
7
|
currentTab: "overview",
|
|
8
8
|
activeAgentId: null,
|
|
@@ -11,6 +11,8 @@ var r = t()(n((e) => ({
|
|
|
11
11
|
selectedAgentId: null,
|
|
12
12
|
selectedSessionId: null,
|
|
13
13
|
selectedVibeId: null,
|
|
14
|
+
activeProfilePerAgent: {},
|
|
15
|
+
connectingAgents: {},
|
|
14
16
|
sidebarOpen: !0,
|
|
15
17
|
terminalTabs: [],
|
|
16
18
|
activeTerminalTabId: null,
|
|
@@ -47,6 +49,21 @@ var r = t()(n((e) => ({
|
|
|
47
49
|
selectedVibeId: null,
|
|
48
50
|
selectedSessionId: null
|
|
49
51
|
}),
|
|
52
|
+
setActiveProfile: (t, n) => e((e) => ({ activeProfilePerAgent: {
|
|
53
|
+
...e.activeProfilePerAgent,
|
|
54
|
+
[t]: n
|
|
55
|
+
} })),
|
|
56
|
+
getActiveProfile: (e) => e ? t().activeProfilePerAgent[e] ?? "default" : "default",
|
|
57
|
+
markAgentConnecting: (t, n = 1500) => e((e) => ({ connectingAgents: {
|
|
58
|
+
...e.connectingAgents,
|
|
59
|
+
[t]: Date.now() + n
|
|
60
|
+
} })),
|
|
61
|
+
clearAgentConnecting: (t) => e((e) => {
|
|
62
|
+
if (!(t in e.connectingAgents)) return e;
|
|
63
|
+
let n = { ...e.connectingAgents };
|
|
64
|
+
return delete n[t], { connectingAgents: n };
|
|
65
|
+
}),
|
|
66
|
+
isAgentConnecting: (e) => e in t().connectingAgents,
|
|
50
67
|
setSelectedAgentId: (t) => e({
|
|
51
68
|
selectedAgentId: t,
|
|
52
69
|
activeAgentId: t
|
|
@@ -86,6 +103,8 @@ var r = t()(n((e) => ({
|
|
|
86
103
|
selectedAgentId: null,
|
|
87
104
|
selectedVibeId: null,
|
|
88
105
|
selectedSessionId: null,
|
|
106
|
+
activeProfilePerAgent: {},
|
|
107
|
+
connectingAgents: {},
|
|
89
108
|
sidebarOpen: !0,
|
|
90
109
|
terminalTabs: [],
|
|
91
110
|
activeTerminalTabId: null,
|
|
@@ -106,6 +125,7 @@ var r = t()(n((e) => ({
|
|
|
106
125
|
selectedAgentId: e.selectedAgentId,
|
|
107
126
|
selectedVibeId: e.selectedVibeId,
|
|
108
127
|
selectedSessionId: e.selectedSessionId,
|
|
128
|
+
activeProfilePerAgent: e.activeProfilePerAgent,
|
|
109
129
|
sidebarOpen: e.sidebarOpen,
|
|
110
130
|
terminalTabs: e.terminalTabs,
|
|
111
131
|
activeTerminalTabId: e.activeTerminalTabId,
|