@burdenoff/microfe-vibecontrols 2026.522.1 → 2026.522.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"AnalyticsPage.js","names":[],"sources":["../../src/pages/AnalyticsPage.tsx"],"sourcesContent":["import { useCallback, useMemo, useState } from 'react';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { VIBE_PERMISSIONS } from '../constants/permissions';\nimport { MotionPage } from '@burdenoff/fe-libs/shared/motion';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { PageHeader } from '@/components/shared';\nimport {\n AnalyticsBreakdownChart,\n AnalyticsBreakdownTable,\n AnalyticsEntityTabs,\n AnalyticsFilterBar,\n AnalyticsKpiGrid,\n AnalyticsTimeSeriesChart,\n SandboxAnalyticsSection,\n getAnalyticsTabConfig,\n getDateRange,\n} from '@/components/analytics';\nimport type { EntityTab, Granularity, TimeRange } from '@/components/analytics';\nimport { useVibecontrolsAnalyticsQuery } from '@/generated/wspace-operations';\nimport { useVibeControls, useVibeNavigate } from '@/providers/VibeControlsProvider';\nimport { useQueryBackedTab } from '@/hooks/useQueryBackedTab';\n\nconst ANALYTICS_TABS: readonly EntityTab[] = [\n 'overview',\n 'agents',\n 'sessions',\n 'sandbox',\n 'vibes',\n 'actions',\n 'vibedecks',\n 'aievents',\n 'audit',\n 'docs',\n];\n\nconst ANALYTICS_SERIES_COLORS = {\n primary: 'var(--color-text-link)',\n success: 'var(--color-status-success-text)',\n accent: 'var(--color-accent-purple)',\n warning: 'var(--color-status-warning-text)',\n} as const;\n\nexport function AnalyticsPage() {\n const { workspaceId } = useVibeControls();\n const { t } = useI18n();\n const navigate = useVibeNavigate();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const [timeRange, setTimeRange] = useState<TimeRange>('LAST_7D');\n const [granularity, setGranularity] = useState<Granularity>('DAY');\n const [activeTab, setActiveTab] = useQueryBackedTab<EntityTab>(ANALYTICS_TABS, 'overview');\n\n const tr = useCallback(\n (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n },\n [t]\n );\n\n const { startDate, endDate } = useMemo(() => getDateRange(timeRange), [timeRange]);\n const activeTabConfig = useMemo(() => getAnalyticsTabConfig(activeTab), [activeTab]);\n\n const { data, loading, error, refetch } = useVibecontrolsAnalyticsQuery({\n variables: {\n input: {\n startDate: startDate.toISOString(),\n endDate: endDate.toISOString(),\n granularity,\n entityTypes: activeTabConfig.entityTypes,\n },\n },\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n notifyOnNetworkStatusChange: true,\n skip: !workspaceId,\n });\n\n const analytics = data?.vibecontrolsAnalytics;\n\n const handleRefresh = useCallback(() => {\n void refetch();\n }, [refetch]);\n\n const handleCardClick = useCallback(\n (href: string) => {\n navigate(href);\n },\n [navigate]\n );\n\n if (permissionsLoading)\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <p className=\"text-text-secondary\">Loading permissions...</p>\n </div>\n );\n if (!hasPermission(VIBE_PERMISSIONS.ANALYTICS_READ))\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-center space-y-2\">\n <h2 className=\"text-lg font-semibold text-foreground\">Access Denied</h2>\n <p className=\"text-sm text-text-secondary\">\n You don't have permission to access this page.\n </p>\n </div>\n </div>\n );\n\n if (!workspaceId) {\n return (\n <MotionPage className=\"min-h-screen space-y-6 bg-bg-surface p-4 sm:p-6\">\n <PageHeader title={tr('nav.analytics', 'Analytics')} />\n <div className=\"text-sm text-text-secondary\">Waiting for workspace context…</div>\n </MotionPage>\n );\n }\n\n if (error && !analytics) {\n return (\n <MotionPage className=\"min-h-screen space-y-6 bg-bg-surface p-4 sm:p-6\">\n <PageHeader title={tr('nav.analytics', 'Analytics')} />\n <div className=\"space-y-3 rounded-lg border border-status-error-border bg-status-error-bg/10 p-4 text-sm text-status-error-text\">\n <p>Failed to load analytics: {error.message}</p>\n <button\n type=\"button\"\n onClick={handleRefresh}\n className=\"rounded-md bg-status-error-bg/20 px-3 py-1.5 text-xs font-medium transition-colors hover:bg-status-error-bg/30\"\n >\n Retry\n </button>\n </div>\n </MotionPage>\n );\n }\n\n return (\n <MotionPage className=\"min-h-screen space-y-4 bg-bg-surface p-4 sm:p-6\">\n <PageHeader title={tr('nav.analytics', 'Analytics')} />\n\n <AnalyticsFilterBar\n timeRange={timeRange}\n granularity={granularity}\n onTimeRangeChange={setTimeRange}\n onGranularityChange={setGranularity}\n onRefresh={handleRefresh}\n loading={loading}\n executionTimeMs={analytics?.executionTimeMs}\n cached={analytics?.cached}\n />\n\n <AnalyticsEntityTabs activeTab={activeTab} onTabChange={setActiveTab} />\n\n <section\n id={`analytics-panel-${activeTab}`}\n role=\"tabpanel\"\n aria-labelledby={`analytics-tab-${activeTab}`}\n className=\"space-y-4\"\n >\n {activeTab === 'overview' ? (\n <div className=\"space-y-4\">\n <AnalyticsKpiGrid data={analytics} loading={loading} onCardClick={handleCardClick} />\n\n <AnalyticsTimeSeriesChart\n title=\"Activity Over Time\"\n datasets={[\n {\n label: 'Sessions',\n data: analytics?.sessions?.createdOverTime,\n color: ANALYTICS_SERIES_COLORS.primary,\n },\n {\n label: 'Executions',\n data: analytics?.actions?.executionsOverTime,\n color: ANALYTICS_SERIES_COLORS.success,\n },\n {\n label: 'AI Events',\n data: analytics?.aiEvents?.eventsOverTime,\n color: ANALYTICS_SERIES_COLORS.accent,\n },\n {\n label: 'Audit Logs',\n data: analytics?.audit?.eventsOverTime,\n color: ANALYTICS_SERIES_COLORS.warning,\n },\n ]}\n />\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownChart\n title=\"Sessions by Status\"\n data={analytics?.sessions?.byStatus}\n />\n <AnalyticsBreakdownChart title=\"Vibes by Status\" data={analytics?.vibes?.byStatus} />\n </div>\n </div>\n ) : null}\n\n {activeTab === 'agents' && analytics?.agents ? (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <KpiCard label=\"Total\" value={analytics.agents.total} />\n <KpiCard label=\"Active\" value={analytics.agents.active} variant=\"success\" />\n <KpiCard label=\"Inactive\" value={analytics.agents.inactive} variant=\"warning\" />\n <KpiCard\n label=\"Stale Heartbeat\"\n value={analytics.agents.staleHeartbeatCount}\n variant=\"error\"\n />\n </div>\n\n <AnalyticsTimeSeriesChart\n title=\"Agents Created Over Time\"\n datasets={[\n {\n label: 'Agents',\n data: analytics.agents.createdOverTime,\n color: ANALYTICS_SERIES_COLORS.primary,\n },\n ]}\n height={250}\n />\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownTable\n title=\"By Platform\"\n data={analytics.agents.byPlatform}\n keyLabel=\"Platform\"\n />\n <AnalyticsBreakdownTable\n title=\"By Architecture\"\n data={analytics.agents.byArchitecture}\n keyLabel=\"Architecture\"\n />\n </div>\n </div>\n ) : null}\n\n {activeTab === 'sessions' && analytics?.sessions ? (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <KpiCard label=\"Total\" value={analytics.sessions.total} />\n <KpiCard label=\"Running\" value={analytics.sessions.active} variant=\"success\" />\n <KpiCard label=\"Collaborators\" value={analytics.sessions.totalCollaborators} />\n <KpiCard\n label=\"Shares\"\n value={analytics.sessions.totalShares + analytics.sessions.totalShareLinks}\n />\n </div>\n\n {analytics.sessions.avgDurationMs != null ? (\n <div className=\"text-sm text-text-secondary\">\n Average duration:{' '}\n <span className=\"font-medium text-text-primary\">\n {formatDuration(analytics.sessions.avgDurationMs)}\n </span>\n </div>\n ) : null}\n\n <AnalyticsTimeSeriesChart\n title=\"Sessions Created Over Time\"\n datasets={[\n {\n label: 'Sessions',\n data: analytics.sessions.createdOverTime,\n color: ANALYTICS_SERIES_COLORS.primary,\n },\n ]}\n height={250}\n />\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownChart title=\"Sessions by Type\" data={analytics.sessions.byType} />\n <AnalyticsBreakdownTable\n title=\"Sessions by Status\"\n data={analytics.sessions.byStatus}\n keyLabel=\"Status\"\n />\n </div>\n </div>\n ) : null}\n\n {activeTab === 'sandbox' ? <SandboxAnalyticsSection /> : null}\n\n {activeTab === 'vibes' && analytics?.vibes ? (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <KpiCard label=\"Total\" value={analytics.vibes.total} />\n <KpiCard label=\"With Agent\" value={analytics.vibes.withAgent} variant=\"success\" />\n <KpiCard label=\"Without Agent\" value={analytics.vibes.withoutAgent} />\n </div>\n\n <AnalyticsTimeSeriesChart\n title=\"Vibes Created Over Time\"\n datasets={[\n {\n label: 'Vibes',\n data: analytics.vibes.createdOverTime,\n color: ANALYTICS_SERIES_COLORS.accent,\n },\n ]}\n height={250}\n />\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownChart title=\"Vibes by Type\" data={analytics.vibes.byType} />\n <AnalyticsBreakdownChart title=\"Vibes by Status\" data={analytics.vibes.byStatus} />\n </div>\n </div>\n ) : null}\n\n {activeTab === 'actions' && analytics?.actions ? (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <KpiCard label=\"Total Actions\" value={analytics.actions.total} />\n <KpiCard label=\"Executions\" value={analytics.actions.totalExecutions} />\n <KpiCard\n label=\"Success Rate\"\n value={\n analytics.actions.successRate != null\n ? `${analytics.actions.successRate.toFixed(1)}%`\n : 'N/A'\n }\n variant={\n analytics.actions.successRate != null && analytics.actions.successRate >= 90\n ? 'success'\n : 'warning'\n }\n />\n <KpiCard\n label=\"Avg Duration\"\n value={\n analytics.actions.avgDurationMs != null\n ? formatDuration(analytics.actions.avgDurationMs)\n : 'N/A'\n }\n />\n </div>\n\n <AnalyticsTimeSeriesChart\n title=\"Executions Over Time\"\n datasets={[\n {\n label: 'Executions',\n data: analytics.actions.executionsOverTime,\n color: ANALYTICS_SERIES_COLORS.success,\n },\n ]}\n height={250}\n />\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownChart\n title=\"By Action Type\"\n data={analytics.actions.byActionType}\n />\n <AnalyticsBreakdownChart\n title=\"Execution Status\"\n data={analytics.actions.executionsByStatus}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownTable\n title=\"By Trigger Type\"\n data={analytics.actions.byTriggerType}\n keyLabel=\"Trigger\"\n />\n <AnalyticsBreakdownTable\n title=\"By Source Type\"\n data={analytics.actions.bySourceType}\n keyLabel=\"Source\"\n />\n </div>\n </div>\n ) : null}\n\n {activeTab === 'vibedecks' && analytics?.vibeDecks ? (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n <KpiCard label=\"Decks\" value={analytics.vibeDecks.totalDecks} />\n <KpiCard label=\"Buttons\" value={analytics.vibeDecks.totalButtons} />\n </div>\n\n <AnalyticsBreakdownChart\n title=\"Buttons by Action Type\"\n data={analytics.vibeDecks.buttonsByActionType}\n />\n </div>\n ) : null}\n\n {activeTab === 'aievents' && analytics?.aiEvents ? (\n <div className=\"space-y-4\">\n <KpiCard label=\"Total AI Events\" value={analytics.aiEvents.total} />\n\n <AnalyticsTimeSeriesChart\n title=\"AI Events Over Time\"\n datasets={[\n {\n label: 'Events',\n data: analytics.aiEvents.eventsOverTime,\n color: ANALYTICS_SERIES_COLORS.accent,\n },\n ]}\n height={250}\n />\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownChart title=\"By Source\" data={analytics.aiEvents.bySource} />\n <AnalyticsBreakdownTable\n title=\"By Event Type\"\n data={analytics.aiEvents.byEventType}\n keyLabel=\"Event Type\"\n />\n </div>\n </div>\n ) : null}\n\n {activeTab === 'audit' && analytics?.audit ? (\n <div className=\"space-y-4\">\n <KpiCard label=\"Total Audit Logs\" value={analytics.audit.total} />\n\n <AnalyticsTimeSeriesChart\n title=\"Audit Events Over Time\"\n datasets={[\n {\n label: 'Events',\n data: analytics.audit.eventsOverTime,\n color: ANALYTICS_SERIES_COLORS.warning,\n },\n ]}\n height={250}\n />\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownChart title=\"By Action\" data={analytics.audit.byAction} />\n <AnalyticsBreakdownChart title=\"By Status\" data={analytics.audit.byStatus} />\n </div>\n\n <AnalyticsBreakdownTable\n title=\"By Resource Type\"\n data={analytics.audit.byResourceType}\n keyLabel=\"Resource\"\n />\n </div>\n ) : null}\n\n {activeTab === 'docs' && analytics?.docs ? (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <KpiCard label=\"Sites\" value={analytics.docs.totalSites} />\n <KpiCard label=\"Pages\" value={analytics.docs.totalPages} />\n <KpiCard label=\"Revisions\" value={analytics.docs.totalRevisions} />\n <KpiCard\n label=\"Build Success\"\n value={\n analytics.docs.buildSuccessRate != null\n ? `${analytics.docs.buildSuccessRate.toFixed(1)}%`\n : 'N/A'\n }\n variant={\n analytics.docs.buildSuccessRate != null && analytics.docs.buildSuccessRate >= 90\n ? 'success'\n : 'warning'\n }\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownChart\n title=\"Pages by Status\"\n data={analytics.docs.pagesByStatus}\n />\n <AnalyticsBreakdownChart\n title=\"Revisions by Status\"\n data={analytics.docs.revisionsByStatus}\n />\n </div>\n </div>\n ) : null}\n </section>\n </MotionPage>\n );\n}\n\nfunction KpiCard({\n label,\n value,\n variant,\n}: {\n label: string;\n value: number | string;\n variant?: 'success' | 'warning' | 'error';\n}) {\n const surfaceClass =\n variant === 'success'\n ? 'bg-status-success-bg/10'\n : variant === 'warning'\n ? 'bg-status-warning-bg/10'\n : variant === 'error'\n ? 'bg-status-error-bg/10'\n : 'bg-bg-surface';\n\n return (\n <div className={`${surfaceClass} rounded-lg border border-border-default p-3`}>\n <p className=\"text-xs text-text-secondary\">{label}</p>\n <p className=\"mt-1 text-xl font-bold text-text-primary\">\n {typeof value === 'number' ? value.toLocaleString() : value}\n </p>\n </div>\n );\n}\n\nfunction formatDuration(milliseconds: number): string {\n if (milliseconds < 1000) {\n return `${Math.round(milliseconds)}ms`;\n }\n\n if (milliseconds < 60000) {\n return `${(milliseconds / 1000).toFixed(1)}s`;\n }\n\n const minutes = Math.floor(milliseconds / 60000);\n const seconds = Math.round((milliseconds % 60000) / 1000);\n return `${minutes}m ${seconds}s`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AnalyticsPage.js","names":[],"sources":["../../src/pages/AnalyticsPage.tsx"],"sourcesContent":["import { lazy, Suspense, useCallback, useMemo, useState } from 'react';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { VIBE_PERMISSIONS } from '../constants/permissions';\nimport { MotionPage } from '@burdenoff/fe-libs/shared/motion';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { PageHeader } from '@/components/shared';\nimport { SkeletonLine } from '@/components/shared/PageSkeleton';\nimport {\n AnalyticsBreakdownTable,\n AnalyticsEntityTabs,\n AnalyticsFilterBar,\n AnalyticsKpiGrid,\n SandboxAnalyticsSection,\n getAnalyticsTabConfig,\n getDateRange,\n} from '@/components/analytics';\n\n// Recharts is ~150KB+ gzipped and only mounts on the Analytics page once\n// the user lands on it. Lazy-load both chart components so the recharts\n// bundle is excluded from the initial page-load chunk.\nconst AnalyticsTimeSeriesChart = lazy(() =>\n import('@/components/analytics/AnalyticsTimeSeriesChart').then((m) => ({\n default: m.AnalyticsTimeSeriesChart,\n }))\n);\nconst AnalyticsBreakdownChart = lazy(() =>\n import('@/components/analytics/AnalyticsBreakdownChart').then((m) => ({\n default: m.AnalyticsBreakdownChart,\n }))\n);\n\nconst ChartFallback = () => (\n <div className=\"bg-bg-surface border border-border-default rounded-lg p-4\">\n <SkeletonLine height=\"h-40\" />\n </div>\n);\nimport type { EntityTab, Granularity, TimeRange } from '@/components/analytics';\nimport { useVibecontrolsAnalyticsQuery } from '@/generated/wspace-operations';\nimport { useVibeControls, useVibeNavigate } from '@/providers/VibeControlsProvider';\nimport { useQueryBackedTab } from '@/hooks/useQueryBackedTab';\n\nconst ANALYTICS_TABS: readonly EntityTab[] = [\n 'overview',\n 'agents',\n 'sessions',\n 'sandbox',\n 'vibes',\n 'actions',\n 'vibedecks',\n 'aievents',\n 'audit',\n 'docs',\n];\n\nconst ANALYTICS_SERIES_COLORS = {\n primary: 'var(--color-text-link)',\n success: 'var(--color-status-success-text)',\n accent: 'var(--color-accent-purple)',\n warning: 'var(--color-status-warning-text)',\n} as const;\n\nexport function AnalyticsPage() {\n const { workspaceId } = useVibeControls();\n const { t } = useI18n();\n const navigate = useVibeNavigate();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const [timeRange, setTimeRange] = useState<TimeRange>('LAST_7D');\n const [granularity, setGranularity] = useState<Granularity>('DAY');\n const [activeTab, setActiveTab] = useQueryBackedTab<EntityTab>(ANALYTICS_TABS, 'overview');\n\n const tr = useCallback(\n (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n },\n [t]\n );\n\n const { startDate, endDate } = useMemo(() => getDateRange(timeRange), [timeRange]);\n const activeTabConfig = useMemo(() => getAnalyticsTabConfig(activeTab), [activeTab]);\n\n const { data, loading, error, refetch } = useVibecontrolsAnalyticsQuery({\n variables: {\n input: {\n startDate: startDate.toISOString(),\n endDate: endDate.toISOString(),\n granularity,\n entityTypes: activeTabConfig.entityTypes,\n },\n },\n fetchPolicy: 'cache-first',\n nextFetchPolicy: 'cache-first',\n notifyOnNetworkStatusChange: true,\n skip: !workspaceId,\n });\n\n const analytics = data?.vibecontrolsAnalytics;\n\n const handleRefresh = useCallback(() => {\n void refetch();\n }, [refetch]);\n\n const handleCardClick = useCallback(\n (href: string) => {\n navigate(href);\n },\n [navigate]\n );\n\n if (permissionsLoading)\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <p className=\"text-text-secondary\">Loading permissions...</p>\n </div>\n );\n if (!hasPermission(VIBE_PERMISSIONS.ANALYTICS_READ))\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <div className=\"text-center space-y-2\">\n <h2 className=\"text-lg font-semibold text-foreground\">Access Denied</h2>\n <p className=\"text-sm text-text-secondary\">\n You don't have permission to access this page.\n </p>\n </div>\n </div>\n );\n\n if (!workspaceId) {\n return (\n <MotionPage className=\"min-h-screen space-y-6 bg-bg-surface p-4 sm:p-6\">\n <PageHeader title={tr('nav.analytics', 'Analytics')} />\n <div className=\"text-sm text-text-secondary\">Waiting for workspace context…</div>\n </MotionPage>\n );\n }\n\n if (error && !analytics) {\n return (\n <MotionPage className=\"min-h-screen space-y-6 bg-bg-surface p-4 sm:p-6\">\n <PageHeader title={tr('nav.analytics', 'Analytics')} />\n <div className=\"space-y-3 rounded-lg border border-status-error-border bg-status-error-bg/10 p-4 text-sm text-status-error-text\">\n <p>Failed to load analytics: {error.message}</p>\n <button\n type=\"button\"\n onClick={handleRefresh}\n className=\"rounded-md bg-status-error-bg/20 px-3 py-1.5 text-xs font-medium transition-colors hover:bg-status-error-bg/30\"\n >\n Retry\n </button>\n </div>\n </MotionPage>\n );\n }\n\n return (\n <MotionPage className=\"min-h-screen space-y-4 bg-bg-surface p-4 sm:p-6\">\n <PageHeader title={tr('nav.analytics', 'Analytics')} />\n\n <AnalyticsFilterBar\n timeRange={timeRange}\n granularity={granularity}\n onTimeRangeChange={setTimeRange}\n onGranularityChange={setGranularity}\n onRefresh={handleRefresh}\n loading={loading}\n executionTimeMs={analytics?.executionTimeMs}\n cached={analytics?.cached}\n />\n\n <AnalyticsEntityTabs activeTab={activeTab} onTabChange={setActiveTab} />\n\n <Suspense fallback={<ChartFallback />}>\n <section\n id={`analytics-panel-${activeTab}`}\n role=\"tabpanel\"\n aria-labelledby={`analytics-tab-${activeTab}`}\n className=\"space-y-4\"\n >\n {activeTab === 'overview' ? (\n <div className=\"space-y-4\">\n <AnalyticsKpiGrid data={analytics} loading={loading} onCardClick={handleCardClick} />\n\n <AnalyticsTimeSeriesChart\n title=\"Activity Over Time\"\n datasets={[\n {\n label: 'Sessions',\n data: analytics?.sessions?.createdOverTime,\n color: ANALYTICS_SERIES_COLORS.primary,\n },\n {\n label: 'Executions',\n data: analytics?.actions?.executionsOverTime,\n color: ANALYTICS_SERIES_COLORS.success,\n },\n {\n label: 'AI Events',\n data: analytics?.aiEvents?.eventsOverTime,\n color: ANALYTICS_SERIES_COLORS.accent,\n },\n {\n label: 'Audit Logs',\n data: analytics?.audit?.eventsOverTime,\n color: ANALYTICS_SERIES_COLORS.warning,\n },\n ]}\n />\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownChart\n title=\"Sessions by Status\"\n data={analytics?.sessions?.byStatus}\n />\n <AnalyticsBreakdownChart\n title=\"Vibes by Status\"\n data={analytics?.vibes?.byStatus}\n />\n </div>\n </div>\n ) : null}\n\n {activeTab === 'agents' && analytics?.agents ? (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <KpiCard label=\"Total\" value={analytics.agents.total} />\n <KpiCard label=\"Active\" value={analytics.agents.active} variant=\"success\" />\n <KpiCard label=\"Inactive\" value={analytics.agents.inactive} variant=\"warning\" />\n <KpiCard\n label=\"Stale Heartbeat\"\n value={analytics.agents.staleHeartbeatCount}\n variant=\"error\"\n />\n </div>\n\n <AnalyticsTimeSeriesChart\n title=\"Agents Created Over Time\"\n datasets={[\n {\n label: 'Agents',\n data: analytics.agents.createdOverTime,\n color: ANALYTICS_SERIES_COLORS.primary,\n },\n ]}\n height={250}\n />\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownTable\n title=\"By Platform\"\n data={analytics.agents.byPlatform}\n keyLabel=\"Platform\"\n />\n <AnalyticsBreakdownTable\n title=\"By Architecture\"\n data={analytics.agents.byArchitecture}\n keyLabel=\"Architecture\"\n />\n </div>\n </div>\n ) : null}\n\n {activeTab === 'sessions' && analytics?.sessions ? (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <KpiCard label=\"Total\" value={analytics.sessions.total} />\n <KpiCard label=\"Running\" value={analytics.sessions.active} variant=\"success\" />\n <KpiCard label=\"Collaborators\" value={analytics.sessions.totalCollaborators} />\n <KpiCard\n label=\"Shares\"\n value={analytics.sessions.totalShares + analytics.sessions.totalShareLinks}\n />\n </div>\n\n {analytics.sessions.avgDurationMs != null ? (\n <div className=\"text-sm text-text-secondary\">\n Average duration:{' '}\n <span className=\"font-medium text-text-primary\">\n {formatDuration(analytics.sessions.avgDurationMs)}\n </span>\n </div>\n ) : null}\n\n <AnalyticsTimeSeriesChart\n title=\"Sessions Created Over Time\"\n datasets={[\n {\n label: 'Sessions',\n data: analytics.sessions.createdOverTime,\n color: ANALYTICS_SERIES_COLORS.primary,\n },\n ]}\n height={250}\n />\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownChart\n title=\"Sessions by Type\"\n data={analytics.sessions.byType}\n />\n <AnalyticsBreakdownTable\n title=\"Sessions by Status\"\n data={analytics.sessions.byStatus}\n keyLabel=\"Status\"\n />\n </div>\n </div>\n ) : null}\n\n {activeTab === 'sandbox' ? <SandboxAnalyticsSection /> : null}\n\n {activeTab === 'vibes' && analytics?.vibes ? (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <KpiCard label=\"Total\" value={analytics.vibes.total} />\n <KpiCard label=\"With Agent\" value={analytics.vibes.withAgent} variant=\"success\" />\n <KpiCard label=\"Without Agent\" value={analytics.vibes.withoutAgent} />\n </div>\n\n <AnalyticsTimeSeriesChart\n title=\"Vibes Created Over Time\"\n datasets={[\n {\n label: 'Vibes',\n data: analytics.vibes.createdOverTime,\n color: ANALYTICS_SERIES_COLORS.accent,\n },\n ]}\n height={250}\n />\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownChart title=\"Vibes by Type\" data={analytics.vibes.byType} />\n <AnalyticsBreakdownChart title=\"Vibes by Status\" data={analytics.vibes.byStatus} />\n </div>\n </div>\n ) : null}\n\n {activeTab === 'actions' && analytics?.actions ? (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <KpiCard label=\"Total Actions\" value={analytics.actions.total} />\n <KpiCard label=\"Executions\" value={analytics.actions.totalExecutions} />\n <KpiCard\n label=\"Success Rate\"\n value={\n analytics.actions.successRate != null\n ? `${analytics.actions.successRate.toFixed(1)}%`\n : 'N/A'\n }\n variant={\n analytics.actions.successRate != null && analytics.actions.successRate >= 90\n ? 'success'\n : 'warning'\n }\n />\n <KpiCard\n label=\"Avg Duration\"\n value={\n analytics.actions.avgDurationMs != null\n ? formatDuration(analytics.actions.avgDurationMs)\n : 'N/A'\n }\n />\n </div>\n\n <AnalyticsTimeSeriesChart\n title=\"Executions Over Time\"\n datasets={[\n {\n label: 'Executions',\n data: analytics.actions.executionsOverTime,\n color: ANALYTICS_SERIES_COLORS.success,\n },\n ]}\n height={250}\n />\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownChart\n title=\"By Action Type\"\n data={analytics.actions.byActionType}\n />\n <AnalyticsBreakdownChart\n title=\"Execution Status\"\n data={analytics.actions.executionsByStatus}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownTable\n title=\"By Trigger Type\"\n data={analytics.actions.byTriggerType}\n keyLabel=\"Trigger\"\n />\n <AnalyticsBreakdownTable\n title=\"By Source Type\"\n data={analytics.actions.bySourceType}\n keyLabel=\"Source\"\n />\n </div>\n </div>\n ) : null}\n\n {activeTab === 'vibedecks' && analytics?.vibeDecks ? (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3\">\n <KpiCard label=\"Decks\" value={analytics.vibeDecks.totalDecks} />\n <KpiCard label=\"Buttons\" value={analytics.vibeDecks.totalButtons} />\n </div>\n\n <AnalyticsBreakdownChart\n title=\"Buttons by Action Type\"\n data={analytics.vibeDecks.buttonsByActionType}\n />\n </div>\n ) : null}\n\n {activeTab === 'aievents' && analytics?.aiEvents ? (\n <div className=\"space-y-4\">\n <KpiCard label=\"Total AI Events\" value={analytics.aiEvents.total} />\n\n <AnalyticsTimeSeriesChart\n title=\"AI Events Over Time\"\n datasets={[\n {\n label: 'Events',\n data: analytics.aiEvents.eventsOverTime,\n color: ANALYTICS_SERIES_COLORS.accent,\n },\n ]}\n height={250}\n />\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownChart title=\"By Source\" data={analytics.aiEvents.bySource} />\n <AnalyticsBreakdownTable\n title=\"By Event Type\"\n data={analytics.aiEvents.byEventType}\n keyLabel=\"Event Type\"\n />\n </div>\n </div>\n ) : null}\n\n {activeTab === 'audit' && analytics?.audit ? (\n <div className=\"space-y-4\">\n <KpiCard label=\"Total Audit Logs\" value={analytics.audit.total} />\n\n <AnalyticsTimeSeriesChart\n title=\"Audit Events Over Time\"\n datasets={[\n {\n label: 'Events',\n data: analytics.audit.eventsOverTime,\n color: ANALYTICS_SERIES_COLORS.warning,\n },\n ]}\n height={250}\n />\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownChart title=\"By Action\" data={analytics.audit.byAction} />\n <AnalyticsBreakdownChart title=\"By Status\" data={analytics.audit.byStatus} />\n </div>\n\n <AnalyticsBreakdownTable\n title=\"By Resource Type\"\n data={analytics.audit.byResourceType}\n keyLabel=\"Resource\"\n />\n </div>\n ) : null}\n\n {activeTab === 'docs' && analytics?.docs ? (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <KpiCard label=\"Sites\" value={analytics.docs.totalSites} />\n <KpiCard label=\"Pages\" value={analytics.docs.totalPages} />\n <KpiCard label=\"Revisions\" value={analytics.docs.totalRevisions} />\n <KpiCard\n label=\"Build Success\"\n value={\n analytics.docs.buildSuccessRate != null\n ? `${analytics.docs.buildSuccessRate.toFixed(1)}%`\n : 'N/A'\n }\n variant={\n analytics.docs.buildSuccessRate != null && analytics.docs.buildSuccessRate >= 90\n ? 'success'\n : 'warning'\n }\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2\">\n <AnalyticsBreakdownChart\n title=\"Pages by Status\"\n data={analytics.docs.pagesByStatus}\n />\n <AnalyticsBreakdownChart\n title=\"Revisions by Status\"\n data={analytics.docs.revisionsByStatus}\n />\n </div>\n </div>\n ) : null}\n </section>\n </Suspense>\n </MotionPage>\n );\n}\n\nfunction KpiCard({\n label,\n value,\n variant,\n}: {\n label: string;\n value: number | string;\n variant?: 'success' | 'warning' | 'error';\n}) {\n const surfaceClass =\n variant === 'success'\n ? 'bg-status-success-bg/10'\n : variant === 'warning'\n ? 'bg-status-warning-bg/10'\n : variant === 'error'\n ? 'bg-status-error-bg/10'\n : 'bg-bg-surface';\n\n return (\n <div className={`${surfaceClass} rounded-lg border border-border-default p-3`}>\n <p className=\"text-xs text-text-secondary\">{label}</p>\n <p className=\"mt-1 text-xl font-bold text-text-primary\">\n {typeof value === 'number' ? value.toLocaleString() : value}\n </p>\n </div>\n );\n}\n\nfunction formatDuration(milliseconds: number): string {\n if (milliseconds < 1000) {\n return `${Math.round(milliseconds)}ms`;\n }\n\n if (milliseconds < 60000) {\n return `${(milliseconds / 1000).toFixed(1)}s`;\n }\n\n const minutes = Math.floor(milliseconds / 60000);\n const seconds = Math.round((milliseconds % 60000) / 1000);\n return `${minutes}m ${seconds}s`;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { useAdoptAgentSessionMutation as e, useAgentSessionOrphansLazyQuery as t, useBulkRestartSessionsMutation as n, useBulkStopSessionsMutation as r, useBulkTerminateSessionsMutation as i, useCheckSessionHealthMutation as a, useCreateSessionMutation as o, useExportSessionsMutation as s, useListSessionsQuery as c, useRestartSessionMutation as ee, useRestartSessionTerminalMutation as te, useSessionStatusChangedSubscription as ne, useStartSessionMutation as re, useStartSessionTerminalMutation as ie, useStopSessionMutation as ae, useStopSessionTerminalMutation as oe, useTerminateSessionMutation as se, useUpdateSessionMutation as ce, useVibecontrolsAgentHealthProbeStreamSubscription as le, useVibecontrolsAgentHealthProbesQuery as ue } from "../generated/wspace-operations.js";
1
+ import { useAdoptAgentSessionMutation as e, useAgentSessionOrphansLazyQuery as t, useBulkRestartSessionsMutation as n, useBulkStopSessionsMutation as r, useBulkTerminateSessionsMutation as i, useCheckSessionHealthMutation as a, useCreateSessionMutation as o, useExportSessionsMutation as s, useListSessionsQuery as c, useRestartSessionMutation as ee, useRestartSessionTerminalMutation as te, useSessionStatusChangedSubscription as ne, useStartSessionMutation as re, useStartSessionTerminalMutation as ie, useStopSessionMutation as ae, useStopSessionTerminalMutation as oe, useTerminateSessionMutation as se, useUpdateSessionMutation as ce, useVibecontrolsAgentHealthProbeStreamSubscription as le, useVibecontrolsAgentHealthProbesLazyQuery as ue } from "../generated/wspace-operations.js";
2
2
  import { useVibeControls as de, useVibeNavigate as fe } from "../providers/VibeControlsProvider.js";
3
3
  import { useVibeControlsStore as pe } from "../store/vibeControlsStore.js";
4
4
  import me from "../hooks/useCachedInitialData.js";
@@ -209,15 +209,18 @@ function it() {
209
209
  },
210
210
  pagination: { limit: 50 }
211
211
  },
212
- fetchPolicy: "cache-first"
213
- }), jn = On ?? kn, { agents: Mn, vibes: Y } = me(), Nn = ue({ fetchPolicy: "cache-and-network" }), { data: Pn } = le(), Fn = p(() => {
214
- let e = /* @__PURE__ */ new Map(), t = Pn?.vibecontrolsAgentHealthProbeStream ?? Nn.data?.vibecontrolsAgentHealthProbes ?? [];
212
+ fetchPolicy: S === "all" && C === "all" && w === "all" && T === "all" ? "cache-first" : "cache-and-network"
213
+ }), jn = On ?? kn, { agents: Mn, vibes: Y } = me(), [Nn, Pn] = ue({
214
+ fetchPolicy: "network-only",
215
+ notifyOnNetworkStatusChange: !0
216
+ }), { data: Fn } = le(), In = p(() => {
217
+ let e = /* @__PURE__ */ new Map(), t = Fn?.vibecontrolsAgentHealthProbeStream ?? Pn.data?.vibecontrolsAgentHealthProbes ?? [];
215
218
  for (let n of t) e.set(n.agentId, {
216
219
  healthy: n.healthy,
217
220
  error: n.errorMessage ?? null
218
221
  });
219
222
  return e;
220
- }, [Nn.data, Pn]), In = p(() => [
223
+ }, [Pn.data, Fn]), Ln = p(() => [
221
224
  {
222
225
  value: "all",
223
226
  label: b("sessions.filterVibeAll", "All Vibes")
@@ -230,25 +233,25 @@ function it() {
230
233
  value: e.id,
231
234
  label: e.name
232
235
  }))
233
- ], [Y, b]), Ln = p(() => [{
236
+ ], [Y, b]), Rn = p(() => [{
234
237
  value: "all",
235
238
  label: b("sessions.filterAgentAll", "All Agents")
236
239
  }, ...Mn.map((e) => ({
237
240
  value: e.id,
238
241
  label: `${e.name} ${e.isActive ? "" : `(${b("sessions.offline", "Offline")})`}`
239
- }))], [Mn, b]), Rn = p(() => [{
242
+ }))], [Mn, b]), zn = p(() => [{
240
243
  value: "",
241
244
  label: b("sessions.noVibe", "No vibe")
242
245
  }, ...Y.map((e) => ({
243
246
  value: e.id,
244
247
  label: e.name
245
- }))], [Y, b]), zn = p(() => [{
248
+ }))], [Y, b]), Bn = p(() => [{
246
249
  value: "",
247
250
  label: b("sessions.selectAgent", "Select an agent")
248
251
  }, ...Mn.map((e) => ({
249
252
  value: e.id,
250
253
  label: `${e.name} ${e.isActive ? `(${b("sessions.active", "Active")})` : `(${b("sessions.offline", "Offline")})`}`
251
- }))], [Mn, b]), Bn = p(() => [
254
+ }))], [Mn, b]), Vn = p(() => [
252
255
  {
253
256
  value: "TMUX",
254
257
  label: b("sessions.typeTmuxLower", "tmux")
@@ -390,16 +393,16 @@ function it() {
390
393
  X,
391
394
  x,
392
395
  w
393
- ]), Vn = d((e) => {
396
+ ]), Hn = d((e) => {
394
397
  P((t) => {
395
398
  let n = new Set(t);
396
399
  return n.has(e) ? n.delete(e) : n.add(e), n;
397
400
  });
398
- }, []), Hn = d(() => {
401
+ }, []), Un = d(() => {
399
402
  P(new Set(Z.map((e) => e.id)));
400
- }, [Z]), Un = d(() => {
403
+ }, [Z]), Wn = d(() => {
401
404
  P(/* @__PURE__ */ new Set());
402
- }, []), Wn = Z.length > 0 && N.size === Z.length, Gn = N.size > 0, Kn = d(async () => {
405
+ }, []), Gn = Z.length > 0 && N.size === Z.length, Kn = N.size > 0, qn = d(async () => {
403
406
  if (N.size !== 0) {
404
407
  F(!0);
405
408
  try {
@@ -415,7 +418,7 @@ function it() {
415
418
  N,
416
419
  Cn,
417
420
  b
418
- ]), qn = d(async () => {
421
+ ]), Jn = d(async () => {
419
422
  if (N.size !== 0) {
420
423
  F(!0);
421
424
  try {
@@ -431,7 +434,7 @@ function it() {
431
434
  N,
432
435
  wn,
433
436
  b
434
- ]), Jn = d(async () => {
437
+ ]), Yn = d(async () => {
435
438
  if (N.size !== 0 && confirm(`${b("sessions.confirmRemovePrefix", "Are you sure you want to remove")} ${N.size} ${b("nav.sessions", "session(s)")}? ${b("sessions.confirmRemoveSuffix", "This cannot be undone.")}`)) {
436
439
  F(!0);
437
440
  try {
@@ -447,7 +450,7 @@ function it() {
447
450
  N,
448
451
  Tn,
449
452
  b
450
- ]), Yn = d(async (e = "CSV") => {
453
+ ]), Xn = d(async (e = "CSV") => {
451
454
  Ot(!0);
452
455
  try {
453
456
  let t = (await En({ variables: { input: {
@@ -477,11 +480,11 @@ function it() {
477
480
  w,
478
481
  T,
479
482
  b
480
- ]), Xn = (e) => {
483
+ ]), Zn = (e) => {
481
484
  st(`/sessions/${e.id}`);
482
- }, Zn = () => {
485
+ }, Qn = () => {
483
486
  A(null), O(!0);
484
- }, Qn = async () => {
487
+ }, $n = async () => {
485
488
  let e = kt.current?.value?.trim(), t = Nt, n = Ft, r = I, i = At.current?.value?.trim(), a = jt.current?.checked ?? !1;
486
489
  if (!e) {
487
490
  A(b("sessions.nameRequired", "Name is required"));
@@ -492,7 +495,7 @@ function it() {
492
495
  A(t && o.length === 0 ? b("sessions.noAgentAttached", "This vibe has no agents attached. Attach one from the Vibe → Agents tab before creating sessions.") : t && o.length > 1 ? b("sessions.pickAgentFromVibe", "This vibe has multiple agents attached. Pick one before creating the session.") : b("sessions.agentRequired", "Please select an agent for this session."));
493
496
  return;
494
497
  }
495
- let c = Fn.get(s);
498
+ let c = In.get(s);
496
499
  if (c && !c.healthy) {
497
500
  A(b("sessions.agentNotHealthy", "The selected agent isn’t fully reachable right now. Please wait for the agent badge to turn green and retry.") + (c.error ? ` (${c.error})` : ""));
498
501
  return;
@@ -539,7 +542,7 @@ function it() {
539
542
  } finally {
540
543
  Tt(!1);
541
544
  }
542
- }, $n = async (e) => {
545
+ }, er = async (e) => {
543
546
  try {
544
547
  await hn({ variables: { id: e.id } }), at?.({
545
548
  id: e.id,
@@ -554,13 +557,13 @@ function it() {
554
557
  }
555
558
  console.error("Failed to start session:", e);
556
559
  }
557
- }, er = async (e) => {
560
+ }, tr = async (e) => {
558
561
  try {
559
562
  await gn({ variables: { id: e.id } });
560
563
  } catch (e) {
561
564
  console.error("Failed to stop session:", e);
562
565
  }
563
- }, tr = async (e) => {
566
+ }, nr = async (e) => {
564
567
  try {
565
568
  await _n({ variables: { id: e.id } });
566
569
  } catch (e) {
@@ -570,20 +573,20 @@ function it() {
570
573
  }
571
574
  console.error("Failed to restart session:", e);
572
575
  }
573
- }, nr = async (e) => {
576
+ }, rr = async (e) => {
574
577
  try {
575
578
  await xn({ variables: { id: e.id } });
576
579
  } catch (e) {
577
580
  console.error("Failed to terminate session:", e);
578
581
  }
579
- }, rr = d((e) => e.ttydUrl || null, []), ir = d((e) => {
582
+ }, ir = d((e) => e.ttydUrl || null, []), ar = d((e) => {
580
583
  Jt(e);
581
584
  }, []), Q = d(async (e) => {
582
585
  if (R.find((t) => t.sessionId === e.id)?.terminalUrl) {
583
586
  V(e.id), H(!1);
584
587
  return;
585
588
  }
586
- let t = rr(e);
589
+ let t = ir(e);
587
590
  if (t) {
588
591
  let n = {
589
592
  sessionId: e.id,
@@ -633,7 +636,7 @@ function it() {
633
636
  }, [
634
637
  B,
635
638
  R,
636
- rr,
639
+ ir,
637
640
  G
638
641
  ]);
639
642
  f(() => {
@@ -647,15 +650,15 @@ function it() {
647
650
  R,
648
651
  U
649
652
  ]);
650
- let ar = d((e) => {
653
+ let or = d((e) => {
651
654
  z((t) => t.filter((t) => t.sessionId !== e)), B === e && V(() => {
652
655
  let t = R.filter((t) => t.sessionId !== e);
653
656
  return t.length > 0 ? t[t.length - 1].sessionId : null;
654
657
  });
655
- }, [B, R]), or = d((e) => {
658
+ }, [B, R]), sr = d((e) => {
656
659
  let t = R.find((t) => t.sessionId === e);
657
660
  t?.terminalUrl && window.open(t.terminalUrl, "_blank");
658
- }, [R]), sr = d(async (e, t) => {
661
+ }, [R]), cr = d(async (e, t) => {
659
662
  try {
660
663
  await bn({ variables: {
661
664
  id: e,
@@ -667,7 +670,7 @@ function it() {
667
670
  } catch (e) {
668
671
  console.error("Failed to rename session:", e);
669
672
  }
670
- }, [bn]), cr = d(async (e) => {
673
+ }, [bn]), lr = d(async (e) => {
671
674
  try {
672
675
  await vn({ variables: { id: e } }), z((t) => t.map((t) => t.sessionId === e ? {
673
676
  ...t,
@@ -677,7 +680,7 @@ function it() {
677
680
  } catch (e) {
678
681
  console.error("Failed to stop terminal:", e);
679
682
  }
680
- }, [vn]), lr = d(async (e) => {
683
+ }, [vn]), ur = d(async (e) => {
681
684
  let t = R.find((t) => t.sessionId === e) || null;
682
685
  try {
683
686
  z((t) => t.map((t) => t.sessionId === e ? {
@@ -720,7 +723,7 @@ function it() {
720
723
  error: r
721
724
  } : t));
722
725
  }
723
- }, [yn, R]), ur = d(() => {
726
+ }, [yn, R]), dr = d(() => {
724
727
  Xt((e) => !e);
725
728
  }, []), $ = {
726
729
  total: X.length,
@@ -747,7 +750,7 @@ function it() {
747
750
  onRetry: () => J()
748
751
  })
749
752
  });
750
- let dr = () => !Gn || E === "terminal" ? null : /* @__PURE__ */ _("div", {
753
+ let fr = () => !Kn || E === "terminal" ? null : /* @__PURE__ */ _("div", {
751
754
  className: "flex flex-col sm:flex-row items-start sm:items-center gap-3 px-4 py-2 bg-action-primary-bg/10 border border-action-primary-bg/20 rounded-lg",
752
755
  children: [/* @__PURE__ */ g("span", {
753
756
  className: "text-sm font-medium text-text-primary",
@@ -756,7 +759,7 @@ function it() {
756
759
  className: "flex items-center gap-1.5 sm:ml-auto flex-wrap",
757
760
  children: [
758
761
  /* @__PURE__ */ _("button", {
759
- onClick: Kn,
762
+ onClick: qn,
760
763
  disabled: Et,
761
764
  className: "flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-text-primary bg-bg-surface border border-border-default rounded-md hover:bg-bg-sunken transition-colors disabled:opacity-50",
762
765
  children: [
@@ -766,7 +769,7 @@ function it() {
766
769
  ]
767
770
  }),
768
771
  /* @__PURE__ */ _("button", {
769
- onClick: qn,
772
+ onClick: Jn,
770
773
  disabled: Et,
771
774
  className: "flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-text-primary bg-bg-surface border border-border-default rounded-md hover:bg-bg-sunken transition-colors disabled:opacity-50",
772
775
  children: [
@@ -776,7 +779,7 @@ function it() {
776
779
  ]
777
780
  }),
778
781
  /* @__PURE__ */ _("button", {
779
- onClick: Jn,
782
+ onClick: Yn,
780
783
  disabled: Et,
781
784
  className: "flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-status-error-text bg-status-error-bg border border-status-error-text/20 rounded-md hover:bg-status-error-bg/80 transition-colors disabled:opacity-50",
782
785
  children: [
@@ -786,7 +789,7 @@ function it() {
786
789
  ]
787
790
  }),
788
791
  /* @__PURE__ */ _("button", {
789
- onClick: Un,
792
+ onClick: Wn,
790
793
  className: "flex items-center gap-1.5 px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary transition-colors",
791
794
  children: [
792
795
  /* @__PURE__ */ g(Ke, { className: "w-3 h-3" }),
@@ -824,7 +827,9 @@ function it() {
824
827
  children: /* @__PURE__ */ g(Pe, { className: "w-3.5 h-3.5" })
825
828
  }),
826
829
  /* @__PURE__ */ g("button", {
827
- onClick: () => J(),
830
+ onClick: () => {
831
+ J(), Nn();
832
+ },
828
833
  disabled: q,
829
834
  className: "p-1.5 text-text-secondary hover:bg-bg-surface rounded transition-colors disabled:opacity-50",
830
835
  title: b("common.refresh", "Refresh"),
@@ -867,27 +872,27 @@ function it() {
867
872
  tabs: R,
868
873
  activeTabId: B,
869
874
  onTabSelect: V,
870
- onTabClose: ar,
871
- onOpenExternal: or,
875
+ onTabClose: or,
876
+ onOpenExternal: sr,
872
877
  collapsed: !1,
873
878
  sessions: Z,
874
879
  onOpenTerminal: Q,
875
880
  onRetryTerminal: Q,
876
- onRenameSession: sr,
877
- onStopTerminal: cr,
878
- onRestartTerminal: lr,
879
- onCreateSession: Zn,
881
+ onRenameSession: cr,
882
+ onStopTerminal: lr,
883
+ onRestartTerminal: ur,
884
+ onCreateSession: Qn,
880
885
  fullScreen: !0,
881
886
  isImmersiveFullscreen: Yt,
882
- onToggleImmersiveFullscreen: ur,
887
+ onToggleImmersiveFullscreen: dr,
883
888
  contextSwitcher: void 0
884
889
  }),
885
890
  j && /* @__PURE__ */ g("div", {
886
891
  className: "fixed bottom-4 right-4 z-50 px-4 py-3 bg-status-success-bg text-status-success-text rounded-md shadow-lg text-sm",
887
892
  children: j
888
893
  }),
889
- xt && pr(),
890
- fr()
894
+ xt && mr(),
895
+ pr()
891
896
  ]
892
897
  });
893
898
  return /* @__PURE__ */ _(v, {
@@ -940,7 +945,7 @@ function it() {
940
945
  return e ? { blob: new Blob([e.data], { type: "text/csv" }) } : null;
941
946
  }
942
947
  },
943
- onDownload: () => Yn("CSV")
948
+ onDownload: () => Xn("CSV")
944
949
  }),
945
950
  /* @__PURE__ */ g(et, {
946
951
  permission: u.SESSION_CREATE,
@@ -955,7 +960,7 @@ function it() {
955
960
  /* @__PURE__ */ g(et, {
956
961
  permission: u.SESSION_CREATE,
957
962
  children: /* @__PURE__ */ _("button", {
958
- onClick: Zn,
963
+ onClick: Qn,
959
964
  className: "flex items-center gap-2 px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors",
960
965
  children: [/* @__PURE__ */ g(Be, { className: "w-4 h-4" }), b("sessions.newSession", "New Session")]
961
966
  })
@@ -1018,13 +1023,13 @@ function it() {
1018
1023
  /* @__PURE__ */ g(we, {
1019
1024
  label: b("sessions.filterVibe", "Vibe"),
1020
1025
  value: w,
1021
- options: In,
1026
+ options: Ln,
1022
1027
  onChange: yt
1023
1028
  }),
1024
1029
  /* @__PURE__ */ g(we, {
1025
1030
  label: b("sessions.filterAgent", "Agent"),
1026
1031
  value: T,
1027
- options: Ln,
1032
+ options: Rn,
1028
1033
  onChange: bt
1029
1034
  })
1030
1035
  ]
@@ -1060,14 +1065,14 @@ function it() {
1060
1065
  /* @__PURE__ */ g("div", {
1061
1066
  className: "sm:ml-auto flex items-center gap-2",
1062
1067
  children: Z.length > 0 && /* @__PURE__ */ _("button", {
1063
- onClick: Wn ? Un : Hn,
1068
+ onClick: Gn ? Wn : Un,
1064
1069
  className: "flex items-center gap-1.5 px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary transition-colors",
1065
- children: [/* @__PURE__ */ g(Fe, { className: "w-3.5 h-3.5" }), Wn ? b("sessions.deselectAll", "Deselect All") : b("sessions.selectAll", "Select All")]
1070
+ children: [/* @__PURE__ */ g(Fe, { className: "w-3.5 h-3.5" }), Gn ? b("sessions.deselectAll", "Deselect All") : b("sessions.selectAll", "Select All")]
1066
1071
  })
1067
1072
  })
1068
1073
  ]
1069
1074
  }),
1070
- dr(),
1075
+ fr(),
1071
1076
  x || S !== "all" || C !== "all" || w !== "all" || T !== "all" ? /* @__PURE__ */ _("p", {
1072
1077
  className: "text-sm text-text-secondary",
1073
1078
  children: [
@@ -1097,28 +1102,28 @@ function it() {
1097
1102
  className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4",
1098
1103
  children: Z.map((e) => /* @__PURE__ */ g(Ze, { children: /* @__PURE__ */ g(ke, {
1099
1104
  session: e,
1100
- onOpen: Xn,
1101
- onStart: $n,
1102
- onStop: er,
1103
- onRestart: tr,
1105
+ onOpen: Zn,
1106
+ onStart: er,
1107
+ onStop: tr,
1108
+ onRestart: nr,
1104
1109
  onOpenTerminal: Q,
1105
- onShare: ir,
1110
+ onShare: ar,
1106
1111
  selected: N.has(e.id),
1107
- onToggleSelect: () => Vn(e.id)
1112
+ onToggleSelect: () => Hn(e.id)
1108
1113
  }) }, e.id))
1109
1114
  }, "grid-view") : /* @__PURE__ */ g(Ze, { children: /* @__PURE__ */ g(Ae, {
1110
1115
  sessions: Z,
1111
- onOpen: Xn,
1112
- onStart: $n,
1113
- onStop: er,
1114
- onRestart: tr,
1115
- onTerminate: nr,
1116
+ onOpen: Zn,
1117
+ onStart: er,
1118
+ onStop: tr,
1119
+ onRestart: nr,
1120
+ onTerminate: rr,
1116
1121
  onOpenTerminal: Q,
1117
- onShare: ir,
1122
+ onShare: ar,
1118
1123
  selectedIds: N,
1119
- onToggleSelect: Vn,
1120
- onSelectAll: Hn,
1121
- onDeselectAll: Un
1124
+ onToggleSelect: Hn,
1125
+ onSelectAll: Un,
1126
+ onDeselectAll: Wn
1122
1127
  }) }, "list-view") : /* @__PURE__ */ _("div", {
1123
1128
  className: "space-y-4",
1124
1129
  children: [/* @__PURE__ */ g(Te, {
@@ -1131,7 +1136,7 @@ function it() {
1131
1136
  action: !x && S === "all" && C === "all" && w === "all" && T === "all" ? /* @__PURE__ */ _("div", {
1132
1137
  className: "flex items-center gap-2",
1133
1138
  children: [ht && /* @__PURE__ */ _("button", {
1134
- onClick: Zn,
1139
+ onClick: Qn,
1135
1140
  className: "flex items-center gap-2 px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors",
1136
1141
  children: [
1137
1142
  /* @__PURE__ */ g(Be, { className: "w-4 h-4" }),
@@ -1153,23 +1158,23 @@ function it() {
1153
1158
  tabs: R,
1154
1159
  activeTabId: B,
1155
1160
  onTabSelect: V,
1156
- onTabClose: ar,
1157
- onOpenExternal: or,
1161
+ onTabClose: or,
1162
+ onOpenExternal: sr,
1158
1163
  onToggleCollapse: () => H((e) => !e),
1159
1164
  collapsed: Kt,
1160
1165
  sessions: Z,
1161
1166
  onOpenTerminal: Q,
1162
1167
  onRetryTerminal: Q,
1163
- onRenameSession: sr,
1164
- onStopTerminal: cr,
1165
- onRestartTerminal: lr,
1168
+ onRenameSession: cr,
1169
+ onStopTerminal: lr,
1170
+ onRestartTerminal: ur,
1166
1171
  heightClass: "h-[280px] sm:h-[380px]",
1167
1172
  isImmersiveFullscreen: Yt,
1168
- onToggleImmersiveFullscreen: ur,
1173
+ onToggleImmersiveFullscreen: dr,
1169
1174
  contextSwitcher: void 0
1170
1175
  }),
1171
- xt && pr(),
1172
- fr(),
1176
+ xt && mr(),
1177
+ pr(),
1173
1178
  qt && /* @__PURE__ */ g(Me, {
1174
1179
  session: qt,
1175
1180
  isOpen: !!qt,
@@ -1189,7 +1194,7 @@ function it() {
1189
1194
  })
1190
1195
  ]
1191
1196
  });
1192
- function fr() {
1197
+ function pr() {
1193
1198
  if (!nn) return null;
1194
1199
  let e = fn?.agentSessionOrphans ?? [];
1195
1200
  return /* @__PURE__ */ g("div", {
@@ -1213,7 +1218,7 @@ function it() {
1213
1218
  className: "block text-sm font-medium text-text-primary mb-1",
1214
1219
  children: b("sessions.agent", "Agent")
1215
1220
  }), /* @__PURE__ */ g(De, {
1216
- options: zn,
1221
+ options: Bn,
1217
1222
  value: an,
1218
1223
  onChange: (e) => {
1219
1224
  on(e), cn(null), e && dn({ variables: { agentId: e } });
@@ -1295,7 +1300,7 @@ function it() {
1295
1300
  })
1296
1301
  });
1297
1302
  }
1298
- function pr() {
1303
+ function mr() {
1299
1304
  return /* @__PURE__ */ g("div", {
1300
1305
  className: "fixed inset-0 bg-bg-overlay flex items-center justify-center z-50 p-4",
1301
1306
  children: /* @__PURE__ */ _("div", {
@@ -1325,7 +1330,7 @@ function it() {
1325
1330
  className: "block text-sm font-medium text-text-primary mb-1",
1326
1331
  children: b("sessions.filterVibe", "Vibe")
1327
1332
  }), /* @__PURE__ */ g(De, {
1328
- options: Rn,
1333
+ options: zn,
1329
1334
  value: Nt,
1330
1335
  onChange: Pt,
1331
1336
  placeholder: b("sessions.noVibe", "No vibe"),
@@ -1338,7 +1343,7 @@ function it() {
1338
1343
  children: b("sessions.filterAgent", "Agent")
1339
1344
  }),
1340
1345
  /* @__PURE__ */ g(De, {
1341
- options: zn,
1346
+ options: Bn,
1342
1347
  value: Ft,
1343
1348
  onChange: It,
1344
1349
  placeholder: b("sessions.selectAgent", "Select an agent"),
@@ -1354,7 +1359,7 @@ function it() {
1354
1359
  className: "block text-sm font-medium text-text-primary mb-1",
1355
1360
  children: b("sessions.filterType", "Type")
1356
1361
  }), /* @__PURE__ */ g(De, {
1357
- options: Bn,
1362
+ options: Vn,
1358
1363
  value: I,
1359
1364
  onChange: Lt,
1360
1365
  placeholder: b("sessions.selectType", "Select type"),
@@ -1435,7 +1440,7 @@ function it() {
1435
1440
  className: "px-4 py-2 text-text-primary hover:bg-bg-sunken rounded-md transition-colors disabled:opacity-50",
1436
1441
  children: b("common.cancel", "Cancel")
1437
1442
  }), /* @__PURE__ */ g("button", {
1438
- onClick: Qn,
1443
+ onClick: $n,
1439
1444
  disabled: wt,
1440
1445
  className: "px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors disabled:opacity-50",
1441
1446
  children: wt ? b("sessions.creating", "Creating...") : b("sessions.createSession", "Create Session")