@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.
- package/dist/components/agent-manager/AgentManagerChatPane.js.map +1 -1
- package/dist/components/analytics/index.js +2 -2
- package/dist/components/gitops/CIDurationChart.js +11 -11
- package/dist/components/shared/PageSkeleton.js +1 -1
- package/dist/pages/AgentsPage.js +78 -80
- package/dist/pages/AgentsPage.js.map +1 -1
- package/dist/pages/AnalyticsPage.js +425 -420
- package/dist/pages/AnalyticsPage.js.map +1 -1
- package/dist/pages/SessionsPage.js +91 -86
- package/dist/pages/SessionsPage.js.map +1 -1
- package/dist/pages/TargetDetailsPage.js.map +1 -1
- package/dist/pages/TemplateDetailPage.js.map +1 -1
- package/dist/pages/VibesPage.js +333 -320
- package/dist/pages/VibesPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;AAsBA,IAAM,IAAuC;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,EAEK,IAA0B;CAC9B,SAAS;CACT,SAAS;CACT,QAAQ;CACR,SAAS;CACV;AAED,SAAgB,IAAgB;CAC9B,IAAM,EAAE,mBAAgB,GAAiB,EACnC,EAAE,SAAM,GAAS,EACjB,IAAW,GAAiB,EAC5B,EAAE,kBAAe,WAAW,MAAuB,GAAgB,EACnE,CAAC,GAAW,KAAgB,EAAoB,UAAU,EAC1D,CAAC,GAAa,KAAkB,EAAsB,MAAM,EAC5D,CAAC,GAAW,KAAgB,EAA6B,GAAgB,WAAW,EAEpF,IAAK,GACR,GAAa,MAA6B;EACzC,IAAM,IAAQ,EAAE,EAAI;AACpB,SAAO,MAAU,IAAM,IAAW;IAEpC,CAAC,EAAE,CACJ,EAEK,EAAE,cAAW,eAAY,QAAc,EAAa,EAAU,EAAE,CAAC,EAAU,CAAC,EAC5E,IAAkB,QAAc,EAAsB,EAAU,EAAE,CAAC,EAAU,CAAC,EAE9E,EAAE,SAAM,YAAS,UAAO,eAAY,EAA8B;EACtE,WAAW,EACT,OAAO;GACL,WAAW,EAAU,aAAa;GAClC,SAAS,EAAQ,aAAa;GAC9B;GACA,aAAa,EAAgB;GAC9B,EACF;EACD,aAAa;EACb,iBAAiB;EACjB,6BAA6B;EAC7B,MAAM,CAAC;EACR,CAAC,EAEI,IAAY,GAAM,uBAElB,IAAgB,QAAkB;AACjC,KAAS;IACb,CAAC,EAAQ,CAAC,EAEP,IAAkB,GACrB,MAAiB;AAChB,IAAS,EAAK;IAEhB,CAAC,EAAS,CACX;AA+CD,QA7CI,IAEA,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,KAAD;GAAG,WAAU;aAAsB;GAA0B,CAAA;EACzD,CAAA,GAEL,EAAc,EAAiB,eAAe,GAY9C,IASD,KAAS,CAAC,IAEV,kBAAC,GAAD;EAAY,WAAU;YAAtB,CACE,kBAAC,GAAD,EAAY,OAAO,EAAG,iBAAiB,YAAY,EAAI,CAAA,EACvD,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,KAAD,EAAA,UAAA,CAAG,8BAA2B,EAAM,QAAY,EAAA,CAAA,EAChD,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,WAAU;cACX;IAEQ,CAAA,CACL;KACK;MAKf,kBAAC,GAAD;EAAY,WAAU;YAAtB;GACE,kBAAC,GAAD,EAAY,OAAO,EAAG,iBAAiB,YAAY,EAAI,CAAA;GAEvD,kBAAC,GAAD;IACa;IACE;IACb,mBAAmB;IACnB,qBAAqB;IACrB,WAAW;IACF;IACT,iBAAiB,GAAW;IAC5B,QAAQ,GAAW;IACnB,CAAA;GAEF,kBAAC,GAAD;IAAgC;IAAW,aAAa;IAAgB,CAAA;GAExE,kBAAC,WAAD;IACE,IAAI,mBAAmB;IACvB,MAAK;IACL,mBAAiB,iBAAiB;IAClC,WAAU;cAJZ;KAMG,MAAc,aACb,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD;QAAkB,MAAM;QAAoB;QAAS,aAAa;QAAmB,CAAA;OAErF,kBAAC,GAAD;QACE,OAAM;QACN,UAAU;SACR;UACE,OAAO;UACP,MAAM,GAAW,UAAU;UAC3B,OAAO,EAAwB;UAChC;SACD;UACE,OAAO;UACP,MAAM,GAAW,SAAS;UAC1B,OAAO,EAAwB;UAChC;SACD;UACE,OAAO;UACP,MAAM,GAAW,UAAU;UAC3B,OAAO,EAAwB;UAChC;SACD;UACE,OAAO;UACP,MAAM,GAAW,OAAO;UACxB,OAAO,EAAwB;UAChC;SACF;QACD,CAAA;OAEF,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SACE,OAAM;SACN,MAAM,GAAW,UAAU;SAC3B,CAAA,EACF,kBAAC,GAAD;SAAyB,OAAM;SAAkB,MAAM,GAAW,OAAO;SAAY,CAAA,CACjF;;OACF;UACJ;KAEH,MAAc,YAAY,GAAW,SACpC,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,GAAD;UAAS,OAAM;UAAQ,OAAO,EAAU,OAAO;UAAS,CAAA;SACxD,kBAAC,GAAD;UAAS,OAAM;UAAS,OAAO,EAAU,OAAO;UAAQ,SAAQ;UAAY,CAAA;SAC5E,kBAAC,GAAD;UAAS,OAAM;UAAW,OAAO,EAAU,OAAO;UAAU,SAAQ;UAAY,CAAA;SAChF,kBAAC,GAAD;UACE,OAAM;UACN,OAAO,EAAU,OAAO;UACxB,SAAQ;UACR,CAAA;SACE;;OAEN,kBAAC,GAAD;QACE,OAAM;QACN,UAAU,CACR;SACE,OAAO;SACP,MAAM,EAAU,OAAO;SACvB,OAAO,EAAwB;SAChC,CACF;QACD,QAAQ;QACR,CAAA;OAEF,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SACE,OAAM;SACN,MAAM,EAAU,OAAO;SACvB,UAAS;SACT,CAAA,EACF,kBAAC,GAAD;SACE,OAAM;SACN,MAAM,EAAU,OAAO;SACvB,UAAS;SACT,CAAA,CACE;;OACF;UACJ;KAEH,MAAc,cAAc,GAAW,WACtC,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,GAAD;UAAS,OAAM;UAAQ,OAAO,EAAU,SAAS;UAAS,CAAA;SAC1D,kBAAC,GAAD;UAAS,OAAM;UAAU,OAAO,EAAU,SAAS;UAAQ,SAAQ;UAAY,CAAA;SAC/E,kBAAC,GAAD;UAAS,OAAM;UAAgB,OAAO,EAAU,SAAS;UAAsB,CAAA;SAC/E,kBAAC,GAAD;UACE,OAAM;UACN,OAAO,EAAU,SAAS,cAAc,EAAU,SAAS;UAC3D,CAAA;SACE;;OAEL,EAAU,SAAS,iBAAiB,OAOjC,OANF,kBAAC,OAAD;QAAK,WAAU;kBAAf;SAA6C;SACzB;SAClB,kBAAC,QAAD;UAAM,WAAU;oBACb,EAAe,EAAU,SAAS,cAAc;UAC5C,CAAA;SACH;;OAGR,kBAAC,GAAD;QACE,OAAM;QACN,UAAU,CACR;SACE,OAAO;SACP,MAAM,EAAU,SAAS;SACzB,OAAO,EAAwB;SAChC,CACF;QACD,QAAQ;QACR,CAAA;OAEF,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SAAyB,OAAM;SAAmB,MAAM,EAAU,SAAS;SAAU,CAAA,EACrF,kBAAC,GAAD;SACE,OAAM;SACN,MAAM,EAAU,SAAS;SACzB,UAAS;SACT,CAAA,CACE;;OACF;UACJ;KAEH,MAAc,YAAY,kBAAC,GAAD,EAA2B,CAAA,GAAG;KAExD,MAAc,WAAW,GAAW,QACnC,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,GAAD;UAAS,OAAM;UAAQ,OAAO,EAAU,MAAM;UAAS,CAAA;SACvD,kBAAC,GAAD;UAAS,OAAM;UAAa,OAAO,EAAU,MAAM;UAAW,SAAQ;UAAY,CAAA;SAClF,kBAAC,GAAD;UAAS,OAAM;UAAgB,OAAO,EAAU,MAAM;UAAgB,CAAA;SAClE;;OAEN,kBAAC,GAAD;QACE,OAAM;QACN,UAAU,CACR;SACE,OAAO;SACP,MAAM,EAAU,MAAM;SACtB,OAAO,EAAwB;SAChC,CACF;QACD,QAAQ;QACR,CAAA;OAEF,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SAAyB,OAAM;SAAgB,MAAM,EAAU,MAAM;SAAU,CAAA,EAC/E,kBAAC,GAAD;SAAyB,OAAM;SAAkB,MAAM,EAAU,MAAM;SAAY,CAAA,CAC/E;;OACF;UACJ;KAEH,MAAc,aAAa,GAAW,UACrC,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,GAAD;UAAS,OAAM;UAAgB,OAAO,EAAU,QAAQ;UAAS,CAAA;SACjE,kBAAC,GAAD;UAAS,OAAM;UAAa,OAAO,EAAU,QAAQ;UAAmB,CAAA;SACxE,kBAAC,GAAD;UACE,OAAM;UACN,OACE,EAAU,QAAQ,eAAe,OAE7B,QADA,GAAG,EAAU,QAAQ,YAAY,QAAQ,EAAE,CAAC;UAGlD,SACE,EAAU,QAAQ,eAAe,QAAQ,EAAU,QAAQ,eAAe,KACtE,YACA;UAEN,CAAA;SACF,kBAAC,GAAD;UACE,OAAM;UACN,OACE,EAAU,QAAQ,iBAAiB,OAE/B,QADA,EAAe,EAAU,QAAQ,cAAc;UAGrD,CAAA;SACE;;OAEN,kBAAC,GAAD;QACE,OAAM;QACN,UAAU,CACR;SACE,OAAO;SACP,MAAM,EAAU,QAAQ;SACxB,OAAO,EAAwB;SAChC,CACF;QACD,QAAQ;QACR,CAAA;OAEF,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SACE,OAAM;SACN,MAAM,EAAU,QAAQ;SACxB,CAAA,EACF,kBAAC,GAAD;SACE,OAAM;SACN,MAAM,EAAU,QAAQ;SACxB,CAAA,CACE;;OAEN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SACE,OAAM;SACN,MAAM,EAAU,QAAQ;SACxB,UAAS;SACT,CAAA,EACF,kBAAC,GAAD;SACE,OAAM;SACN,MAAM,EAAU,QAAQ;SACxB,UAAS;SACT,CAAA,CACE;;OACF;UACJ;KAEH,MAAc,eAAe,GAAW,YACvC,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QAAS,OAAM;QAAQ,OAAO,EAAU,UAAU;QAAc,CAAA,EAChE,kBAAC,GAAD;QAAS,OAAM;QAAU,OAAO,EAAU,UAAU;QAAgB,CAAA,CAChE;UAEN,kBAAC,GAAD;OACE,OAAM;OACN,MAAM,EAAU,UAAU;OAC1B,CAAA,CACE;UACJ;KAEH,MAAc,cAAc,GAAW,WACtC,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD;QAAS,OAAM;QAAkB,OAAO,EAAU,SAAS;QAAS,CAAA;OAEpE,kBAAC,GAAD;QACE,OAAM;QACN,UAAU,CACR;SACE,OAAO;SACP,MAAM,EAAU,SAAS;SACzB,OAAO,EAAwB;SAChC,CACF;QACD,QAAQ;QACR,CAAA;OAEF,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SAAyB,OAAM;SAAY,MAAM,EAAU,SAAS;SAAY,CAAA,EAChF,kBAAC,GAAD;SACE,OAAM;SACN,MAAM,EAAU,SAAS;SACzB,UAAS;SACT,CAAA,CACE;;OACF;UACJ;KAEH,MAAc,WAAW,GAAW,QACnC,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD;QAAS,OAAM;QAAmB,OAAO,EAAU,MAAM;QAAS,CAAA;OAElE,kBAAC,GAAD;QACE,OAAM;QACN,UAAU,CACR;SACE,OAAO;SACP,MAAM,EAAU,MAAM;SACtB,OAAO,EAAwB;SAChC,CACF;QACD,QAAQ;QACR,CAAA;OAEF,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SAAyB,OAAM;SAAY,MAAM,EAAU,MAAM;SAAY,CAAA,EAC7E,kBAAC,GAAD;SAAyB,OAAM;SAAY,MAAM,EAAU,MAAM;SAAY,CAAA,CACzE;;OAEN,kBAAC,GAAD;QACE,OAAM;QACN,MAAM,EAAU,MAAM;QACtB,UAAS;QACT,CAAA;OACE;UACJ;KAEH,MAAc,UAAU,GAAW,OAClC,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,GAAD;SAAS,OAAM;SAAQ,OAAO,EAAU,KAAK;SAAc,CAAA;QAC3D,kBAAC,GAAD;SAAS,OAAM;SAAQ,OAAO,EAAU,KAAK;SAAc,CAAA;QAC3D,kBAAC,GAAD;SAAS,OAAM;SAAY,OAAO,EAAU,KAAK;SAAkB,CAAA;QACnE,kBAAC,GAAD;SACE,OAAM;SACN,OACE,EAAU,KAAK,oBAAoB,OAE/B,QADA,GAAG,EAAU,KAAK,iBAAiB,QAAQ,EAAE,CAAC;SAGpD,SACE,EAAU,KAAK,oBAAoB,QAAQ,EAAU,KAAK,oBAAoB,KAC1E,YACA;SAEN,CAAA;QACE;UAEN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QACE,OAAM;QACN,MAAM,EAAU,KAAK;QACrB,CAAA,EACF,kBAAC,GAAD;QACE,OAAM;QACN,MAAM,EAAU,KAAK;QACrB,CAAA,CACE;SACF;UACJ;KACI;;GACC;MAnXX,kBAAC,GAAD;EAAY,WAAU;YAAtB,CACE,kBAAC,GAAD,EAAY,OAAO,EAAG,iBAAiB,YAAY,EAAI,CAAA,EACvD,kBAAC,OAAD;GAAK,WAAU;aAA8B;GAAoC,CAAA,CACtE;MAfb,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cAAwC;IAAkB,CAAA,EACxE,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAEvC,CAAA,CACA;;EACF,CAAA;;AA4XZ,SAAS,EAAQ,EACf,UACA,UACA,cAKC;AAUD,QACE,kBAAC,OAAD;EAAK,WAAW,GAThB,MAAY,YACR,4BACA,MAAY,YACV,4BACA,MAAY,UACV,0BACA,gBAGwB;YAAhC,CACE,kBAAC,KAAD;GAAG,WAAU;aAA+B;GAAU,CAAA,EACtD,kBAAC,KAAD;GAAG,WAAU;aACV,OAAO,KAAU,WAAW,EAAM,gBAAgB,GAAG;GACpD,CAAA,CACA;;;AAIV,SAAS,EAAe,GAA8B;AAWpD,QAVI,IAAe,MACV,GAAG,KAAK,MAAM,EAAa,CAAC,MAGjC,IAAe,MACV,IAAI,IAAe,KAAM,QAAQ,EAAE,CAAC,KAKtC,GAFS,KAAK,MAAM,IAAe,IAAM,CAE9B,IADF,KAAK,MAAO,IAAe,MAAS,IAAK,CAC3B"}
|
|
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,
|
|
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
|
|
214
|
-
|
|
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
|
-
}, [
|
|
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]),
|
|
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]),
|
|
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]),
|
|
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]),
|
|
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
|
-
]),
|
|
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
|
-
}, []),
|
|
401
|
+
}, []), Un = d(() => {
|
|
399
402
|
P(new Set(Z.map((e) => e.id)));
|
|
400
|
-
}, [Z]),
|
|
403
|
+
}, [Z]), Wn = d(() => {
|
|
401
404
|
P(/* @__PURE__ */ new Set());
|
|
402
|
-
}, []),
|
|
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
|
-
]),
|
|
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
|
-
]),
|
|
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
|
-
]),
|
|
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
|
-
]),
|
|
483
|
+
]), Zn = (e) => {
|
|
481
484
|
st(`/sessions/${e.id}`);
|
|
482
|
-
},
|
|
485
|
+
}, Qn = () => {
|
|
483
486
|
A(null), O(!0);
|
|
484
|
-
},
|
|
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 =
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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]),
|
|
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]),
|
|
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]),
|
|
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]),
|
|
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]),
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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: () =>
|
|
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:
|
|
871
|
-
onOpenExternal:
|
|
875
|
+
onTabClose: or,
|
|
876
|
+
onOpenExternal: sr,
|
|
872
877
|
collapsed: !1,
|
|
873
878
|
sessions: Z,
|
|
874
879
|
onOpenTerminal: Q,
|
|
875
880
|
onRetryTerminal: Q,
|
|
876
|
-
onRenameSession:
|
|
877
|
-
onStopTerminal:
|
|
878
|
-
onRestartTerminal:
|
|
879
|
-
onCreateSession:
|
|
881
|
+
onRenameSession: cr,
|
|
882
|
+
onStopTerminal: lr,
|
|
883
|
+
onRestartTerminal: ur,
|
|
884
|
+
onCreateSession: Qn,
|
|
880
885
|
fullScreen: !0,
|
|
881
886
|
isImmersiveFullscreen: Yt,
|
|
882
|
-
onToggleImmersiveFullscreen:
|
|
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 &&
|
|
890
|
-
|
|
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: () =>
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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" }),
|
|
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
|
-
|
|
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:
|
|
1101
|
-
onStart:
|
|
1102
|
-
onStop:
|
|
1103
|
-
onRestart:
|
|
1105
|
+
onOpen: Zn,
|
|
1106
|
+
onStart: er,
|
|
1107
|
+
onStop: tr,
|
|
1108
|
+
onRestart: nr,
|
|
1104
1109
|
onOpenTerminal: Q,
|
|
1105
|
-
onShare:
|
|
1110
|
+
onShare: ar,
|
|
1106
1111
|
selected: N.has(e.id),
|
|
1107
|
-
onToggleSelect: () =>
|
|
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:
|
|
1112
|
-
onStart:
|
|
1113
|
-
onStop:
|
|
1114
|
-
onRestart:
|
|
1115
|
-
onTerminate:
|
|
1116
|
+
onOpen: Zn,
|
|
1117
|
+
onStart: er,
|
|
1118
|
+
onStop: tr,
|
|
1119
|
+
onRestart: nr,
|
|
1120
|
+
onTerminate: rr,
|
|
1116
1121
|
onOpenTerminal: Q,
|
|
1117
|
-
onShare:
|
|
1122
|
+
onShare: ar,
|
|
1118
1123
|
selectedIds: N,
|
|
1119
|
-
onToggleSelect:
|
|
1120
|
-
onSelectAll:
|
|
1121
|
-
onDeselectAll:
|
|
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:
|
|
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:
|
|
1157
|
-
onOpenExternal:
|
|
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:
|
|
1164
|
-
onStopTerminal:
|
|
1165
|
-
onRestartTerminal:
|
|
1168
|
+
onRenameSession: cr,
|
|
1169
|
+
onStopTerminal: lr,
|
|
1170
|
+
onRestartTerminal: ur,
|
|
1166
1171
|
heightClass: "h-[280px] sm:h-[380px]",
|
|
1167
1172
|
isImmersiveFullscreen: Yt,
|
|
1168
|
-
onToggleImmersiveFullscreen:
|
|
1173
|
+
onToggleImmersiveFullscreen: dr,
|
|
1169
1174
|
contextSwitcher: void 0
|
|
1170
1175
|
}),
|
|
1171
|
-
xt &&
|
|
1172
|
-
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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")
|