@burdenoff/microfe-vibecontrols 2026.528.6 → 2026.528.8

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.
Files changed (42) hide show
  1. package/dist/VibeControlsRoot.js +90 -81
  2. package/dist/VibeControlsRoot.js.map +1 -1
  3. package/dist/VibeControlsRoutes.js +144 -140
  4. package/dist/VibeControlsRoutes.js.map +1 -1
  5. package/dist/components/audit/AuditLogFilters.js +71 -47
  6. package/dist/components/audit/AuditLogFilters.js.map +1 -1
  7. package/dist/components/shared/AgentSetupBanner.js +50 -45
  8. package/dist/components/shared/AgentSetupBanner.js.map +1 -1
  9. package/dist/components/shared/LinkToVibePanel.js +97 -0
  10. package/dist/components/shared/LinkToVibePanel.js.map +1 -0
  11. package/dist/components/shared/index.js +1 -0
  12. package/dist/components/templates/TemplateWizard.js +2 -2
  13. package/dist/components/templates/TemplateWizard.js.map +1 -1
  14. package/dist/components/vibe/VibeLinkedEntitiesPanel.js +60 -0
  15. package/dist/components/vibe/VibeLinkedEntitiesPanel.js.map +1 -0
  16. package/dist/components/vibedeck/VibeDeckButtonTile.js +25 -23
  17. package/dist/components/vibedeck/VibeDeckButtonTile.js.map +1 -1
  18. package/dist/components/vibedeck/VibeDeckGrid.js +2 -2
  19. package/dist/components/vibedeck/VibeDeckGrid.js.map +1 -1
  20. package/dist/constants/pluginCatalog.js +1 -1
  21. package/dist/microfe-vibecontrols.css +1 -1
  22. package/dist/pages/AgentDetailsPage.js +2 -2
  23. package/dist/pages/AgentDetailsPage.js.map +1 -1
  24. package/dist/pages/AnalyticsPage.js +255 -204
  25. package/dist/pages/AnalyticsPage.js.map +1 -1
  26. package/dist/pages/OverviewPage.js +1 -11
  27. package/dist/pages/OverviewPage.js.map +1 -1
  28. package/dist/pages/PluginsCatalogPage.js +287 -0
  29. package/dist/pages/PluginsCatalogPage.js.map +1 -0
  30. package/dist/pages/SessionsPage.js +825 -629
  31. package/dist/pages/SessionsPage.js.map +1 -1
  32. package/dist/pages/VibeAuditPage.js +184 -153
  33. package/dist/pages/VibeAuditPage.js.map +1 -1
  34. package/dist/pages/VibeCalendarPage.js +132 -107
  35. package/dist/pages/VibeCalendarPage.js.map +1 -1
  36. package/dist/pages/VibeDeckPage.js +416 -379
  37. package/dist/pages/VibeDeckPage.js.map +1 -1
  38. package/dist/pages/VibeDetailsPage.js +621 -557
  39. package/dist/pages/VibeDetailsPage.js.map +1 -1
  40. package/dist/pages/tunnels/TunnelsTab.js +115 -90
  41. package/dist/pages/tunnels/TunnelsTab.js.map +1 -1
  42. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"VibeControlsRoutes.js","names":[],"sources":["../src/VibeControlsRoutes.tsx"],"sourcesContent":["import React, { Suspense, useEffect } from 'react';\nimport { Navigate, Route, Routes, useLocation, useParams } from 'react-router-dom';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useTr } from './shared/hooks/useTr';\n\n// Lazy load - All pages (required for @/ alias resolution when consumed by host app)\nconst OverviewPage = React.lazy(() =>\n import('./pages/OverviewPage').then((m) => ({ default: m.OverviewPage }))\n);\n\n// Other pages\nconst AgentsLandingPage = React.lazy(() =>\n import('./pages/AgentsLandingPage').then((m) => ({ default: m.AgentsLandingPage }))\n);\nconst AgentDetailsPage = React.lazy(() =>\n import('./pages/AgentDetailsPage').then((m) => ({ default: m.AgentDetailsPage }))\n);\nconst TargetDetailsPage = React.lazy(() =>\n import('./pages/TargetDetailsPage').then((m) => ({ default: m.TargetDetailsPage }))\n);\nconst SessionsPage = React.lazy(() =>\n import('./pages/SessionsPage').then((m) => ({ default: m.SessionsPage }))\n);\nconst SessionDetailsPage = React.lazy(() =>\n import('./pages/SessionDetailsPage').then((m) => ({ default: m.SessionDetailsPage }))\n);\nconst VibesPage = React.lazy(() =>\n import('./pages/VibesPage').then((m) => ({ default: m.VibesPage }))\n);\nconst VibeDetailsPage = React.lazy(() =>\n import('./pages/VibeDetailsPage').then((m) => ({ default: m.VibeDetailsPage }))\n);\nconst NoteDetailsPage = React.lazy(() =>\n import('./pages/NoteDetailsPage').then((m) => ({ default: m.NoteDetailsPage }))\n);\nconst TunnelsLandingPage = React.lazy(() =>\n import('./pages/TunnelsLandingPage').then((m) => ({ default: m.TunnelsLandingPage }))\n);\nconst TunnelDetailsPage = React.lazy(() =>\n import('./pages/tunnels/TunnelDetailsPage').then((m) => ({ default: m.TunnelDetailsPage }))\n);\nconst TunnelCreateWizard = React.lazy(() =>\n import('./components/tunnels/TunnelCreateWizard').then((m) => ({ default: m.TunnelCreateWizard }))\n);\nconst SettingsPage = React.lazy(() =>\n import('./pages/SettingsPage').then((m) => ({ default: m.SettingsPage }))\n);\nconst HealthPage = React.lazy(() =>\n import('./pages/HealthPage').then((m) => ({ default: m.HealthPage }))\n);\nconst GettingStartedPage = React.lazy(() =>\n import('./pages/GettingStartedPage').then((m) => ({ default: m.GettingStartedPage }))\n);\nconst SharedSessionPage = React.lazy(() =>\n import('./pages/SharedSessionPage').then((m) => ({ default: m.SharedSessionPage }))\n);\nconst VibeDeckPage = React.lazy(() =>\n import('./pages/VibeDeckPage').then((m) => ({ default: m.VibeDeckPage }))\n);\nconst SharedVibeDeckPage = React.lazy(() =>\n import('./pages/SharedVibeDeckPage').then((m) => ({ default: m.SharedVibeDeckPage }))\n);\nconst VibeCalendarPage = React.lazy(() =>\n import('./pages/VibeCalendarPage').then((m) => ({ default: m.VibeCalendarPage }))\n);\nconst VibeTaskDetailPage = React.lazy(() =>\n import('./pages/VibeTaskDetailPage').then((m) => ({ default: m.VibeTaskDetailPage }))\n);\nconst ActionsPage = React.lazy(() =>\n import('./pages/ActionsPage').then((m) => ({ default: m.ActionsPage }))\n);\nconst VibeAuditPage = React.lazy(() =>\n import('./pages/VibeAuditPage').then((m) => ({ default: m.VibeAuditPage }))\n);\nconst AnalyticsPage = React.lazy(() =>\n import('./pages/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage }))\n);\nconst VibeDocsPage = React.lazy(() =>\n import('./pages/VibeDocsPage').then((m) => ({ default: m.VibeDocsPage }))\n);\nconst LogsPage = React.lazy(() =>\n import('./pages/LogsPage').then((m) => ({ default: m.LogsPage }))\n);\n\n// Catalog, Components, Templates pages\nconst CatalogPage = React.lazy(() =>\n import('./pages/CatalogPage').then((m) => ({ default: m.CatalogPage }))\n);\nconst CatalogDetailPage = React.lazy(() =>\n import('./pages/CatalogDetailPage').then((m) => ({ default: m.CatalogDetailPage }))\n);\nconst CatalogDocsPage = React.lazy(() =>\n import('./pages/CatalogDocsPage').then((m) => ({ default: m.CatalogDocsPage }))\n);\nconst ComponentsPage = React.lazy(() =>\n import('./pages/ComponentsPage').then((m) => ({ default: m.ComponentsPage }))\n);\nconst ComponentDetailPage = React.lazy(() =>\n import('./pages/ComponentDetailPage').then((m) => ({ default: m.ComponentDetailPage }))\n);\nconst ComponentDocsPage = React.lazy(() =>\n import('./pages/ComponentDocsPage').then((m) => ({ default: m.ComponentDocsPage }))\n);\nconst TemplatesPage = React.lazy(() =>\n import('./pages/TemplatesPage').then((m) => ({ default: m.TemplatesPage }))\n);\nconst TemplateDetailPage = React.lazy(() =>\n import('./pages/TemplateDetailPage').then((m) => ({ default: m.TemplateDetailPage }))\n);\nconst PluginStandalonePage = React.lazy(() =>\n import('./pages/PluginStandalonePage').then((m) => ({ default: m.PluginStandalonePage }))\n);\n\n// AI pages\nconst AIPage = React.lazy(() => import('./pages/ai/AIPage').then((m) => ({ default: m.AIPage })));\nconst AISessionDetailPage = React.lazy(() =>\n import('./pages/ai/AISessionDetailPage').then((m) => ({ default: m.AISessionDetailPage }))\n);\nconst AgentManagerPage = React.lazy(() =>\n import('./pages/ai/AgentManagerPage').then((m) => ({ default: m.AgentManagerPage }))\n);\nconst AIBookmarksPage = React.lazy(() =>\n import('./pages/ai/AIBookmarksPage').then((m) => ({ default: m.AIBookmarksPage }))\n);\n\n// Loading fallback component\nfunction PageLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center h-full min-h-[200px]\">\n <div className=\"animate-pulse bg-muted rounded w-full h-full\" />\n </div>\n );\n}\n\n/**\n * Internal router for the VibeControls microfrontend.\n * This component handles routing within the microfrontend using React Router v7.\n *\n * Routes:\n * - / → Overview page (dashboard)\n * - /agents → Agents management page\n * - /agents/:id → Agent details page\n * - /sessions → Sessions management page\n * - /sessions/:id → Session details page\n * - /vibes → Vibes (projects) management page\n * - /vibes/:id → Vibe details page (includes Notes tab)\n * - /settings → Settings page\n * - /webhooks → Legacy redirect to Developer Portal webhooks\n * - /health → Health monitoring page\n * - /* → Catch-all redirects to overview\n */\nfunction ScrollToTop() {\n const { pathname } = useLocation();\n useEffect(() => {\n // The scrollable container is the <main> element with overflow-auto\n // inside AppShellLayout, not the window itself.\n const main = document.querySelector('main');\n if (main) main.scrollTop = 0;\n }, [pathname]);\n return null;\n}\n\n/**\n * Legacy redirect: /ai-tools/<tab> → /ai-tools/ai/<tab>.\n *\n * Before the Plan / AI mode toggle the page was reachable directly at\n * /ai-tools/<tab>. New shape is /ai-tools/<mode>/<tab>. We keep the\n * legacy links working by mapping the captured `:tab` param: if it\n * resolves to a known AI sub-tab, redirect there; if it's literally\n * \"plan\", route to the Plan page; otherwise fall back to AI overview.\n */\nconst VALID_AI_TABS = new Set<string>([\n 'overview',\n 'templates',\n 'contexts',\n 'prompts',\n 'sessions',\n 'tasks',\n 'stats',\n 'playground',\n 'config',\n]);\n\nfunction LegacyAIToolsRedirect() {\n const { tab } = useParams<{ tab?: string }>();\n if (tab === 'plan') {\n return <Navigate to=\"/vibecontrols/ai-tools/plan\" replace />;\n }\n if (tab && VALID_AI_TABS.has(tab)) {\n return <Navigate to={`/vibecontrols/ai-tools/ai/${tab}`} replace />;\n }\n return <Navigate to=\"/vibecontrols/ai-tools/ai/overview\" replace />;\n}\n\n/**\n * Fallback shown when a feature flag is OFF.\n */\nfunction FeatureDisabledFallback() {\n const tr = useTr();\n return (\n <div className=\"flex items-center justify-center h-full min-h-[200px] text-text-secondary text-sm\">\n {tr(\n 'vibecontrols.pages.featureDisabled',\n 'This feature is currently disabled. You can enable it from Feature Previews.'\n )}\n </div>\n );\n}\n\n/**\n * Helper: wraps a page element in a FeatureGate.\n * defaultValue={true} means the feature shows by default (before flags are seeded).\n * Only hides when a flag is explicitly set to false.\n */\nfunction gated(flag: string, element: React.ReactNode, defaultValue = true): React.ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={defaultValue} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nexport function VibeControlsRoutes() {\n return (\n <Suspense fallback={<PageLoadingFallback />}>\n <ScrollToTop />\n <Routes>\n {/* Default route - overview page */}\n <Route index element={gated('vibecontrols.overview', <OverviewPage />)} />\n\n {/* Core pages */}\n {/* PR-9 standalone plugin route — deep-link any contribution\n from any mount point as a full-page view. Wrapped in the\n same `gated()` envelope as every other authenticated route\n for consistent authz; the page-level\n `vibes.tabs.iframe-host` feature flag still gates rendering\n once the user is past the entitlement check. */}\n <Route\n path=\"plugin/:pluginKey\"\n element={gated('vibecontrols.vibes', <PluginStandalonePage />)}\n />\n\n <Route path=\"agents\" element={gated('vibecontrols.agents', <AgentsLandingPage />)} />\n <Route path=\"agents/new\" element={<Navigate to=\"../agents?create=true\" replace />} />\n <Route path=\"agents/:id\" element={gated('vibecontrols.agents', <AgentDetailsPage />)} />\n <Route path=\"sessions\" element={gated('vibecontrols.sessions', <SessionsPage />)} />\n <Route path=\"vibes\" element={gated('vibecontrols.vibes', <VibesPage />)} />\n <Route path=\"vibes/new\" element={<Navigate to=\"../vibes?create=true\" replace />} />\n <Route path=\"vibes/:id\" element={gated('vibecontrols.vibes', <VibeDetailsPage />)} />\n <Route path=\"vibes/:id/docs/*\" element={gated('vibecontrols.vibes', <VibeDocsPage />)} />\n <Route path=\"notes/:id\" element={gated('vibecontrols.vibes', <NoteDetailsPage />)} />\n <Route\n path=\"sessions/:id\"\n element={gated('vibecontrols.sessions', <SessionDetailsPage />)}\n />\n {/* Agent Manager — multi-session tabbed UI (replaces old AI page) */}\n <Route path=\"ai\" element={gated('vibecontrols.ai', <AgentManagerPage />)} />\n {/* Saved messages — listed BEFORE ai/:tab so \"bookmarks\" is not consumed as a tab. */}\n <Route path=\"ai/bookmarks\" element={gated('vibecontrols.ai', <AIBookmarksPage />)} />\n <Route path=\"ai/:tab\" element={gated('vibecontrols.ai', <AgentManagerPage />)} />\n <Route\n path=\"ai/sessions/:sessionId\"\n element={gated('vibecontrols.ai', <AgentManagerPage />)}\n />\n {/* AI Tools — Plan / AI modes:\n /ai-tools → /ai-tools/ai/overview (redirect)\n /ai-tools/plan → Plan mode (plannotator iframe)\n /ai-tools/ai → /ai-tools/ai/overview (redirect)\n /ai-tools/ai/:tab → AI mode with active sub-tab\n Legacy /ai-tools/<tab> URLs from before the Plan mode rollout\n redirect into the new shape via LegacyAIToolsRedirect. */}\n <Route path=\"ai-tools\" element={<Navigate to=\"ai/overview\" replace />} />\n <Route path=\"ai-tools/plan\" element={gated('vibecontrols.ai', <AIPage />)} />\n <Route path=\"ai-tools/ai\" element={<Navigate to=\"overview\" replace />} />\n <Route path=\"ai-tools/ai/:tab\" element={gated('vibecontrols.ai', <AIPage />)} />\n <Route path=\"ai-tools/:tab\" element={<LegacyAIToolsRedirect />} />\n <Route\n path=\"ai-tools/sessions/:sessionId\"\n element={gated('vibecontrols.ai', <AISessionDetailPage />)}\n />\n\n {/* Targets list lives in the Targets & Agents landing; per-target\n detail is its own page (mirrors agents/:id). */}\n <Route path=\"targets\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n <Route path=\"targets/:id\" element={gated('vibecontrols.agents', <TargetDetailsPage />)} />\n {/* Agent Graph is also a tab inside the Targets & Agents landing. */}\n <Route path=\"agent-graph\" element={<Navigate to=\"../agents?tab=graph\" replace />} />\n\n {/* Catalog */}\n <Route path=\"catalogs\" element={gated('vibecontrols.catalogs', <CatalogPage />)} />\n <Route\n path=\"catalogs/:id\"\n element={gated('vibecontrols.catalogs', <CatalogDetailPage />)}\n />\n <Route\n path=\"catalogs/:id/docs/*\"\n element={gated('vibecontrols.catalogs', <CatalogDocsPage />)}\n />\n <Route path=\"components\" element={gated('vibecontrols.components', <ComponentsPage />)} />\n <Route\n path=\"components/:id\"\n element={gated('vibecontrols.components', <ComponentDetailPage />)}\n />\n <Route\n path=\"components/:id/docs/*\"\n element={gated('vibecontrols.components', <ComponentDocsPage />)}\n />\n <Route path=\"templates\" element={gated('vibecontrols.templates', <TemplatesPage />)} />\n <Route\n path=\"templates/:id\"\n element={gated('vibecontrols.templates', <TemplateDetailPage />)}\n />\n\n {/* Automation */}\n <Route path=\"actions\" element={gated('vibecontrols.actions', <ActionsPage />)} />\n <Route path=\"vibedeck\" element={gated('vibecontrols.vibedeck', <VibeDeckPage />)} />\n <Route path=\"calendar\" element={gated('vibecontrols.calendar', <VibeCalendarPage />)} />\n <Route\n path=\"calendar/:viewType\"\n element={gated('vibecontrols.calendar', <VibeCalendarPage />)}\n />\n <Route\n path=\"calendar/task/:taskId\"\n element={gated('vibecontrols.calendar', <VibeTaskDetailPage />)}\n />\n <Route path=\"webhooks\" element={<Navigate to=\"/devportal/webhooks\" replace />} />\n <Route path=\"webhooks/new\" element={<Navigate to=\"/devportal/webhooks/new\" replace />} />\n <Route path=\"webhooks/:id\" element={<Navigate to=\"/devportal/webhooks\" replace />} />\n {/* GitOps consolidated into Vibe detail tab — old /gitops routes redirect to vibes list. */}\n <Route path=\"gitops\" element={<Navigate to=\"../vibes\" replace />} />\n <Route path=\"gitops/:tab\" element={<Navigate to=\"../vibes\" replace />} />\n\n {/* Infrastructure */}\n <Route path=\"tunnels\" element={gated('vibecontrols.tunnels', <TunnelsLandingPage />)} />\n <Route path=\"tunnels/new\" element={gated('vibecontrols.tunnels', <TunnelCreateWizard />)} />\n <Route\n path=\"tunnels/:tunnelId\"\n element={gated('vibecontrols.tunnels', <TunnelDetailsPage />)}\n />\n\n {/* Insights */}\n <Route path=\"health\" element={gated('vibecontrols.health', <HealthPage />)} />\n <Route path=\"analytics\" element={gated('vibecontrols.analytics', <AnalyticsPage />)} />\n <Route path=\"audit\" element={gated('vibecontrols.audit-log', <VibeAuditPage />, false)} />\n <Route path=\"logs\" element={gated('vibecontrols.agents', <LogsPage />)} />\n\n {/* Settings */}\n <Route path=\"settings\" element={gated('vibecontrols.settings', <SettingsPage />)} />\n\n {/* Setup */}\n {/* Not gated — onboarding flow must always be reachable */}\n <Route path=\"getting-started\" element={<GettingStartedPage />} />\n\n {/* Shared public routes (no gating — accessible via public links) */}\n <Route path=\"share/:token\" element={<SharedSessionPage />} />\n <Route path=\"deck/:token\" element={<SharedVibeDeckPage />} />\n\n {/* Legacy redirects */}\n <Route path=\"access\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n <Route path=\"ssh-targets\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n <Route path=\"ssh-terminals\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n\n {/* Catch-all route - redirect to overview */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"VibeControlsRoutes.js","names":[],"sources":["../src/VibeControlsRoutes.tsx"],"sourcesContent":["import React, { Suspense, useEffect } from 'react';\nimport { Navigate, Route, Routes, useLocation, useParams } from 'react-router-dom';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useTr } from './shared/hooks/useTr';\n\n// Lazy load - All pages (required for @/ alias resolution when consumed by host app)\nconst OverviewPage = React.lazy(() =>\n import('./pages/OverviewPage').then((m) => ({ default: m.OverviewPage }))\n);\n\n// Other pages\nconst AgentsLandingPage = React.lazy(() =>\n import('./pages/AgentsLandingPage').then((m) => ({ default: m.AgentsLandingPage }))\n);\nconst AgentDetailsPage = React.lazy(() =>\n import('./pages/AgentDetailsPage').then((m) => ({ default: m.AgentDetailsPage }))\n);\nconst TargetDetailsPage = React.lazy(() =>\n import('./pages/TargetDetailsPage').then((m) => ({ default: m.TargetDetailsPage }))\n);\nconst SessionsPage = React.lazy(() =>\n import('./pages/SessionsPage').then((m) => ({ default: m.SessionsPage }))\n);\nconst SessionDetailsPage = React.lazy(() =>\n import('./pages/SessionDetailsPage').then((m) => ({ default: m.SessionDetailsPage }))\n);\nconst VibesPage = React.lazy(() =>\n import('./pages/VibesPage').then((m) => ({ default: m.VibesPage }))\n);\nconst VibeDetailsPage = React.lazy(() =>\n import('./pages/VibeDetailsPage').then((m) => ({ default: m.VibeDetailsPage }))\n);\nconst NoteDetailsPage = React.lazy(() =>\n import('./pages/NoteDetailsPage').then((m) => ({ default: m.NoteDetailsPage }))\n);\nconst TunnelsLandingPage = React.lazy(() =>\n import('./pages/TunnelsLandingPage').then((m) => ({ default: m.TunnelsLandingPage }))\n);\nconst TunnelDetailsPage = React.lazy(() =>\n import('./pages/tunnels/TunnelDetailsPage').then((m) => ({ default: m.TunnelDetailsPage }))\n);\nconst TunnelCreateWizard = React.lazy(() =>\n import('./components/tunnels/TunnelCreateWizard').then((m) => ({ default: m.TunnelCreateWizard }))\n);\nconst SettingsPage = React.lazy(() =>\n import('./pages/SettingsPage').then((m) => ({ default: m.SettingsPage }))\n);\nconst HealthPage = React.lazy(() =>\n import('./pages/HealthPage').then((m) => ({ default: m.HealthPage }))\n);\nconst GettingStartedPage = React.lazy(() =>\n import('./pages/GettingStartedPage').then((m) => ({ default: m.GettingStartedPage }))\n);\nconst SharedSessionPage = React.lazy(() =>\n import('./pages/SharedSessionPage').then((m) => ({ default: m.SharedSessionPage }))\n);\nconst VibeDeckPage = React.lazy(() =>\n import('./pages/VibeDeckPage').then((m) => ({ default: m.VibeDeckPage }))\n);\nconst SharedVibeDeckPage = React.lazy(() =>\n import('./pages/SharedVibeDeckPage').then((m) => ({ default: m.SharedVibeDeckPage }))\n);\nconst VibeCalendarPage = React.lazy(() =>\n import('./pages/VibeCalendarPage').then((m) => ({ default: m.VibeCalendarPage }))\n);\nconst VibeTaskDetailPage = React.lazy(() =>\n import('./pages/VibeTaskDetailPage').then((m) => ({ default: m.VibeTaskDetailPage }))\n);\nconst ActionsPage = React.lazy(() =>\n import('./pages/ActionsPage').then((m) => ({ default: m.ActionsPage }))\n);\nconst VibeAuditPage = React.lazy(() =>\n import('./pages/VibeAuditPage').then((m) => ({ default: m.VibeAuditPage }))\n);\nconst AnalyticsPage = React.lazy(() =>\n import('./pages/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage }))\n);\nconst VibeDocsPage = React.lazy(() =>\n import('./pages/VibeDocsPage').then((m) => ({ default: m.VibeDocsPage }))\n);\nconst LogsPage = React.lazy(() =>\n import('./pages/LogsPage').then((m) => ({ default: m.LogsPage }))\n);\n\n// Catalog, Components, Templates pages\nconst CatalogPage = React.lazy(() =>\n import('./pages/CatalogPage').then((m) => ({ default: m.CatalogPage }))\n);\nconst CatalogDetailPage = React.lazy(() =>\n import('./pages/CatalogDetailPage').then((m) => ({ default: m.CatalogDetailPage }))\n);\nconst CatalogDocsPage = React.lazy(() =>\n import('./pages/CatalogDocsPage').then((m) => ({ default: m.CatalogDocsPage }))\n);\nconst ComponentsPage = React.lazy(() =>\n import('./pages/ComponentsPage').then((m) => ({ default: m.ComponentsPage }))\n);\nconst ComponentDetailPage = React.lazy(() =>\n import('./pages/ComponentDetailPage').then((m) => ({ default: m.ComponentDetailPage }))\n);\nconst ComponentDocsPage = React.lazy(() =>\n import('./pages/ComponentDocsPage').then((m) => ({ default: m.ComponentDocsPage }))\n);\nconst TemplatesPage = React.lazy(() =>\n import('./pages/TemplatesPage').then((m) => ({ default: m.TemplatesPage }))\n);\nconst TemplateDetailPage = React.lazy(() =>\n import('./pages/TemplateDetailPage').then((m) => ({ default: m.TemplateDetailPage }))\n);\nconst PluginStandalonePage = React.lazy(() =>\n import('./pages/PluginStandalonePage').then((m) => ({ default: m.PluginStandalonePage }))\n);\nconst PluginsCatalogPage = React.lazy(() =>\n import('./pages/PluginsCatalogPage').then((m) => ({ default: m.PluginsCatalogPage }))\n);\n\n// AI pages\nconst AIPage = React.lazy(() => import('./pages/ai/AIPage').then((m) => ({ default: m.AIPage })));\nconst AISessionDetailPage = React.lazy(() =>\n import('./pages/ai/AISessionDetailPage').then((m) => ({ default: m.AISessionDetailPage }))\n);\nconst AgentManagerPage = React.lazy(() =>\n import('./pages/ai/AgentManagerPage').then((m) => ({ default: m.AgentManagerPage }))\n);\nconst AIBookmarksPage = React.lazy(() =>\n import('./pages/ai/AIBookmarksPage').then((m) => ({ default: m.AIBookmarksPage }))\n);\n\n// Loading fallback component\nfunction PageLoadingFallback() {\n return (\n <div className=\"flex items-center justify-center h-full min-h-[200px]\">\n <div className=\"animate-pulse bg-muted rounded w-full h-full\" />\n </div>\n );\n}\n\n/**\n * Internal router for the VibeControls microfrontend.\n * This component handles routing within the microfrontend using React Router v7.\n *\n * Routes:\n * - / → Overview page (dashboard)\n * - /agents → Agents management page\n * - /agents/:id → Agent details page\n * - /sessions → Sessions management page\n * - /sessions/:id → Session details page\n * - /vibes → Vibes (projects) management page\n * - /vibes/:id → Vibe details page (includes Notes tab)\n * - /settings → Settings page\n * - /webhooks → Legacy redirect to Developer Portal webhooks\n * - /health → Health monitoring page\n * - /* → Catch-all redirects to overview\n */\nfunction ScrollToTop() {\n const { pathname } = useLocation();\n useEffect(() => {\n // The scrollable container is the <main> element with overflow-auto\n // inside AppShellLayout, not the window itself.\n const main = document.querySelector('main');\n if (main) main.scrollTop = 0;\n }, [pathname]);\n return null;\n}\n\n/**\n * Legacy redirect: /ai-tools/<tab> → /ai-tools/ai/<tab>.\n *\n * Before the Plan / AI mode toggle the page was reachable directly at\n * /ai-tools/<tab>. New shape is /ai-tools/<mode>/<tab>. We keep the\n * legacy links working by mapping the captured `:tab` param: if it\n * resolves to a known AI sub-tab, redirect there; if it's literally\n * \"plan\", route to the Plan page; otherwise fall back to AI overview.\n */\nconst VALID_AI_TABS = new Set<string>([\n 'overview',\n 'templates',\n 'contexts',\n 'prompts',\n 'sessions',\n 'tasks',\n 'stats',\n 'playground',\n 'config',\n]);\n\nfunction LegacyAIToolsRedirect() {\n const { tab } = useParams<{ tab?: string }>();\n if (tab === 'plan') {\n return <Navigate to=\"/vibecontrols/ai-tools/plan\" replace />;\n }\n if (tab && VALID_AI_TABS.has(tab)) {\n return <Navigate to={`/vibecontrols/ai-tools/ai/${tab}`} replace />;\n }\n return <Navigate to=\"/vibecontrols/ai-tools/ai/overview\" replace />;\n}\n\n/**\n * Fallback shown when a feature flag is OFF.\n */\nfunction FeatureDisabledFallback() {\n const tr = useTr();\n return (\n <div className=\"flex items-center justify-center h-full min-h-[200px] text-text-secondary text-sm\">\n {tr(\n 'vibecontrols.pages.featureDisabled',\n 'This feature is currently disabled. You can enable it from Feature Previews.'\n )}\n </div>\n );\n}\n\n/**\n * Helper: wraps a page element in a FeatureGate.\n * defaultValue={true} means the feature shows by default (before flags are seeded).\n * Only hides when a flag is explicitly set to false.\n */\nfunction gated(flag: string, element: React.ReactNode, defaultValue = true): React.ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={defaultValue} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nexport function VibeControlsRoutes() {\n return (\n <Suspense fallback={<PageLoadingFallback />}>\n <ScrollToTop />\n <Routes>\n {/* Default route - overview page */}\n <Route index element={gated('vibecontrols.overview', <OverviewPage />)} />\n\n {/* Core pages */}\n {/* PR-9 standalone plugin route — deep-link any contribution\n from any mount point as a full-page view. Wrapped in the\n same `gated()` envelope as every other authenticated route\n for consistent authz; the page-level\n `vibes.tabs.iframe-host` feature flag still gates rendering\n once the user is past the entitlement check. */}\n <Route\n path=\"plugin/:pluginKey\"\n element={gated('vibecontrols.vibes', <PluginStandalonePage />)}\n />\n {/* Plugins catalog — searchable grid of every published plugin. */}\n <Route path=\"plugins\" element={gated('vibecontrols.vibes', <PluginsCatalogPage />)} />\n\n <Route path=\"agents\" element={gated('vibecontrols.agents', <AgentsLandingPage />)} />\n <Route path=\"agents/new\" element={<Navigate to=\"../agents?create=true\" replace />} />\n <Route path=\"agents/:id\" element={gated('vibecontrols.agents', <AgentDetailsPage />)} />\n <Route path=\"sessions\" element={gated('vibecontrols.sessions', <SessionsPage />)} />\n <Route path=\"vibes\" element={gated('vibecontrols.vibes', <VibesPage />)} />\n <Route path=\"vibes/new\" element={<Navigate to=\"../vibes?create=true\" replace />} />\n <Route path=\"vibes/:id\" element={gated('vibecontrols.vibes', <VibeDetailsPage />)} />\n <Route path=\"vibes/:id/docs/*\" element={gated('vibecontrols.vibes', <VibeDocsPage />)} />\n <Route path=\"notes/:id\" element={gated('vibecontrols.vibes', <NoteDetailsPage />)} />\n <Route\n path=\"sessions/:id\"\n element={gated('vibecontrols.sessions', <SessionDetailsPage />)}\n />\n {/* Agent Manager — multi-session tabbed UI (replaces old AI page) */}\n <Route path=\"ai\" element={gated('vibecontrols.ai', <AgentManagerPage />)} />\n {/* Saved messages — listed BEFORE ai/:tab so \"bookmarks\" is not consumed as a tab. */}\n <Route path=\"ai/bookmarks\" element={gated('vibecontrols.ai', <AIBookmarksPage />)} />\n <Route path=\"ai/:tab\" element={gated('vibecontrols.ai', <AgentManagerPage />)} />\n <Route\n path=\"ai/sessions/:sessionId\"\n element={gated('vibecontrols.ai', <AgentManagerPage />)}\n />\n {/* AI Tools — Plan / AI modes:\n /ai-tools → /ai-tools/ai/overview (redirect)\n /ai-tools/plan → Plan mode (plannotator iframe)\n /ai-tools/ai → /ai-tools/ai/overview (redirect)\n /ai-tools/ai/:tab → AI mode with active sub-tab\n Legacy /ai-tools/<tab> URLs from before the Plan mode rollout\n redirect into the new shape via LegacyAIToolsRedirect. */}\n <Route path=\"ai-tools\" element={<Navigate to=\"ai/overview\" replace />} />\n <Route path=\"ai-tools/plan\" element={gated('vibecontrols.ai', <AIPage />)} />\n <Route path=\"ai-tools/ai\" element={<Navigate to=\"overview\" replace />} />\n <Route path=\"ai-tools/ai/:tab\" element={gated('vibecontrols.ai', <AIPage />)} />\n <Route path=\"ai-tools/:tab\" element={<LegacyAIToolsRedirect />} />\n <Route\n path=\"ai-tools/sessions/:sessionId\"\n element={gated('vibecontrols.ai', <AISessionDetailPage />)}\n />\n\n {/* Targets list lives in the Targets & Agents landing; per-target\n detail is its own page (mirrors agents/:id). */}\n <Route path=\"targets\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n <Route path=\"targets/:id\" element={gated('vibecontrols.agents', <TargetDetailsPage />)} />\n {/* Agent Graph is also a tab inside the Targets & Agents landing. */}\n <Route path=\"agent-graph\" element={<Navigate to=\"../agents?tab=graph\" replace />} />\n\n {/* Catalog */}\n <Route path=\"catalogs\" element={gated('vibecontrols.catalogs', <CatalogPage />)} />\n <Route\n path=\"catalogs/:id\"\n element={gated('vibecontrols.catalogs', <CatalogDetailPage />)}\n />\n <Route\n path=\"catalogs/:id/docs/*\"\n element={gated('vibecontrols.catalogs', <CatalogDocsPage />)}\n />\n <Route path=\"components\" element={gated('vibecontrols.components', <ComponentsPage />)} />\n <Route\n path=\"components/:id\"\n element={gated('vibecontrols.components', <ComponentDetailPage />)}\n />\n <Route\n path=\"components/:id/docs/*\"\n element={gated('vibecontrols.components', <ComponentDocsPage />)}\n />\n <Route path=\"templates\" element={gated('vibecontrols.templates', <TemplatesPage />)} />\n <Route\n path=\"templates/:id\"\n element={gated('vibecontrols.templates', <TemplateDetailPage />)}\n />\n\n {/* Automation */}\n <Route path=\"actions\" element={gated('vibecontrols.actions', <ActionsPage />)} />\n <Route path=\"vibedeck\" element={gated('vibecontrols.vibedeck', <VibeDeckPage />)} />\n <Route path=\"calendar\" element={gated('vibecontrols.calendar', <VibeCalendarPage />)} />\n <Route\n path=\"calendar/:viewType\"\n element={gated('vibecontrols.calendar', <VibeCalendarPage />)}\n />\n <Route\n path=\"calendar/task/:taskId\"\n element={gated('vibecontrols.calendar', <VibeTaskDetailPage />)}\n />\n <Route path=\"webhooks\" element={<Navigate to=\"/devportal/webhooks\" replace />} />\n <Route path=\"webhooks/new\" element={<Navigate to=\"/devportal/webhooks/new\" replace />} />\n <Route path=\"webhooks/:id\" element={<Navigate to=\"/devportal/webhooks\" replace />} />\n {/* GitOps consolidated into Vibe detail tab — old /gitops routes redirect to vibes list. */}\n <Route path=\"gitops\" element={<Navigate to=\"../vibes\" replace />} />\n <Route path=\"gitops/:tab\" element={<Navigate to=\"../vibes\" replace />} />\n\n {/* Infrastructure */}\n <Route path=\"tunnels\" element={gated('vibecontrols.tunnels', <TunnelsLandingPage />)} />\n <Route path=\"tunnels/new\" element={gated('vibecontrols.tunnels', <TunnelCreateWizard />)} />\n <Route\n path=\"tunnels/:tunnelId\"\n element={gated('vibecontrols.tunnels', <TunnelDetailsPage />)}\n />\n\n {/* Insights */}\n <Route path=\"health\" element={gated('vibecontrols.health', <HealthPage />)} />\n <Route path=\"analytics\" element={gated('vibecontrols.analytics', <AnalyticsPage />)} />\n <Route path=\"audit\" element={gated('vibecontrols.audit-log', <VibeAuditPage />, false)} />\n <Route path=\"logs\" element={gated('vibecontrols.agents', <LogsPage />)} />\n\n {/* Settings */}\n <Route path=\"settings\" element={gated('vibecontrols.settings', <SettingsPage />)} />\n\n {/* Setup */}\n {/* Not gated — onboarding flow must always be reachable */}\n <Route path=\"getting-started\" element={<GettingStartedPage />} />\n\n {/* Shared public routes (no gating — accessible via public links) */}\n <Route path=\"share/:token\" element={<SharedSessionPage />} />\n <Route path=\"deck/:token\" element={<SharedVibeDeckPage />} />\n\n {/* Legacy redirects */}\n <Route path=\"access\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n <Route path=\"ssh-targets\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n <Route path=\"ssh-terminals\" element={<Navigate to=\"../agents?tab=targets\" replace />} />\n\n {/* Catch-all route - redirect to overview */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
@@ -4,169 +4,193 @@ import "../shared/index.js";
4
4
  import { useI18n as n } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
5
5
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
6
6
  //#region src/components/audit/AuditLogFilters.tsx
7
- function a({ searchQuery: a, onSearchChange: o, actionFilter: s, onActionChange: c, resourceTypeFilter: l, onResourceTypeChange: u, statusFilter: d, onStatusChange: f, hasCommandFilter: p, onHasCommandChange: m }) {
8
- let { t: h } = n(), g = (e, t) => {
9
- let n = h(e);
7
+ function a({ searchQuery: a, onSearchChange: o, actionFilter: s, onActionChange: c, resourceTypeFilter: l, onResourceTypeChange: u, statusFilter: d, onStatusChange: f, hasCommandFilter: p, onHasCommandChange: m, agentFilter: h, onAgentChange: g, agents: _, vibeFilter: v, onVibeChange: y, vibes: b }) {
8
+ let { t: x } = n(), S = (e, t) => {
9
+ let n = x(e);
10
10
  return n === e ? t : n;
11
- }, _ = [
11
+ }, C = [
12
12
  {
13
13
  value: "all",
14
- label: g("audit.allActions", "All Actions")
14
+ label: S("audit.allActions", "All Actions")
15
15
  },
16
16
  {
17
17
  value: "CREATE",
18
- label: g("audit.actionCreate", "Create")
18
+ label: S("audit.actionCreate", "Create")
19
19
  },
20
20
  {
21
21
  value: "UPDATE",
22
- label: g("audit.actionUpdate", "Update")
22
+ label: S("audit.actionUpdate", "Update")
23
23
  },
24
24
  {
25
25
  value: "DELETE",
26
- label: g("audit.actionDelete", "Delete")
26
+ label: S("audit.actionDelete", "Delete")
27
27
  },
28
28
  {
29
29
  value: "EXECUTE",
30
- label: g("audit.actionExecute", "Execute")
30
+ label: S("audit.actionExecute", "Execute")
31
31
  },
32
32
  {
33
33
  value: "EXPORT",
34
- label: g("audit.actionExport", "Export")
34
+ label: S("audit.actionExport", "Export")
35
35
  },
36
36
  {
37
37
  value: "SHARE",
38
- label: g("audit.actionShare", "Share")
38
+ label: S("audit.actionShare", "Share")
39
39
  },
40
40
  {
41
41
  value: "REVOKE",
42
- label: g("audit.actionRevoke", "Revoke")
42
+ label: S("audit.actionRevoke", "Revoke")
43
43
  },
44
44
  {
45
45
  value: "ARCHIVE",
46
- label: g("audit.actionArchive", "Archive")
46
+ label: S("audit.actionArchive", "Archive")
47
47
  },
48
48
  {
49
49
  value: "RESTORE",
50
- label: g("audit.actionRestore", "Restore")
50
+ label: S("audit.actionRestore", "Restore")
51
51
  }
52
- ], v = [
52
+ ], w = [
53
53
  {
54
54
  value: "all",
55
- label: g("audit.allResources", "All Resources")
55
+ label: S("audit.allResources", "All Resources")
56
56
  },
57
57
  {
58
58
  value: "AGENT",
59
- label: g("audit.resourceAgent", "Agent")
59
+ label: S("audit.resourceAgent", "Agent")
60
60
  },
61
61
  {
62
62
  value: "VIBE",
63
- label: g("audit.resourceVibe", "Vibe")
63
+ label: S("audit.resourceVibe", "Vibe")
64
64
  },
65
65
  {
66
66
  value: "SESSION",
67
- label: g("audit.resourceSession", "Session")
67
+ label: S("audit.resourceSession", "Session")
68
68
  },
69
69
  {
70
70
  value: "VIBE_DECK",
71
- label: g("audit.resourceVibeDeck", "Vibe Deck")
71
+ label: S("audit.resourceVibeDeck", "Vibe Deck")
72
72
  },
73
73
  {
74
74
  value: "VIBE_DECK_BUTTON",
75
- label: g("audit.resourceDeckButton", "Deck Button")
75
+ label: S("audit.resourceDeckButton", "Deck Button")
76
76
  },
77
77
  {
78
78
  value: "NOTE",
79
- label: g("audit.resourceNote", "Note")
79
+ label: S("audit.resourceNote", "Note")
80
80
  },
81
81
  {
82
82
  value: "CONFIGURATION",
83
- label: g("audit.resourceConfiguration", "Configuration")
83
+ label: S("audit.resourceConfiguration", "Configuration")
84
84
  },
85
85
  {
86
86
  value: "WEBHOOK",
87
- label: g("audit.resourceWebhook", "Webhook")
87
+ label: S("audit.resourceWebhook", "Webhook")
88
88
  },
89
89
  {
90
90
  value: "SESSION_SHARE",
91
- label: g("audit.resourceSessionShare", "Session Share")
91
+ label: S("audit.resourceSessionShare", "Session Share")
92
92
  },
93
93
  {
94
94
  value: "AI_TOOL_EVENT",
95
- label: g("audit.resourceAiToolEvent", "AI Tool Event")
95
+ label: S("audit.resourceAiToolEvent", "AI Tool Event")
96
96
  },
97
97
  {
98
98
  value: "AUDIT_LOG",
99
- label: g("audit.resourceAuditLog", "Audit Log")
99
+ label: S("audit.resourceAuditLog", "Audit Log")
100
100
  },
101
101
  {
102
102
  value: "CALENDAR_TASK",
103
- label: g("audit.resourceCalendarTask", "Calendar Task")
103
+ label: S("audit.resourceCalendarTask", "Calendar Task")
104
104
  },
105
105
  {
106
106
  value: "TARGET",
107
- label: g("audit.resourceTarget", "Target")
107
+ label: S("audit.resourceTarget", "Target")
108
108
  },
109
109
  {
110
110
  value: "AGENT_CONNECTION",
111
- label: g("audit.resourceAgentConnection", "Agent Connection")
111
+ label: S("audit.resourceAgentConnection", "Agent Connection")
112
112
  },
113
113
  {
114
114
  value: "UI_SESSION",
115
- label: g("audit.resourceUiSession", "UI Session")
115
+ label: S("audit.resourceUiSession", "UI Session")
116
116
  },
117
117
  {
118
118
  value: "SESSION_SHARE_LINK",
119
- label: g("audit.resourceShareLink", "Share Link")
119
+ label: S("audit.resourceShareLink", "Share Link")
120
120
  }
121
- ], y = [
121
+ ], T = [
122
122
  {
123
123
  value: "all",
124
- label: g("audit.allStatuses", "All Statuses")
124
+ label: S("audit.allStatuses", "All Statuses")
125
125
  },
126
126
  {
127
127
  value: "SUCCESS",
128
- label: g("audit.statusSuccess", "Success")
128
+ label: S("audit.statusSuccess", "Success")
129
129
  },
130
130
  {
131
131
  value: "FAILURE",
132
- label: g("audit.statusFailure", "Failure")
132
+ label: S("audit.statusFailure", "Failure")
133
133
  },
134
134
  {
135
135
  value: "DENIED",
136
- label: g("audit.statusDenied", "Denied")
136
+ label: S("audit.statusDenied", "Denied")
137
137
  },
138
138
  {
139
139
  value: "ERROR",
140
- label: g("audit.statusError", "Error")
140
+ label: S("audit.statusError", "Error")
141
141
  }
142
- ];
142
+ ], E = [{
143
+ value: "all",
144
+ label: S("audit.allAgents", "All Agents")
145
+ }, ...(_ ?? []).map((e) => ({
146
+ value: e.id,
147
+ label: e.name
148
+ }))], D = [{
149
+ value: "all",
150
+ label: S("audit.allVibes", "All Vibes")
151
+ }, ...(b ?? []).map((e) => ({
152
+ value: e.id,
153
+ label: e.name
154
+ }))];
143
155
  return /* @__PURE__ */ i("div", {
144
156
  className: "mb-4 flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center",
145
157
  children: [
146
158
  /* @__PURE__ */ r(e, {
147
159
  value: a,
148
160
  onChange: o,
149
- placeholder: g("audit.searchPlaceholder", "Search audit logs..."),
161
+ placeholder: S("audit.searchPlaceholder", "Search audit logs..."),
150
162
  className: "w-full sm:w-64"
151
163
  }),
152
164
  /* @__PURE__ */ r(t, {
153
- label: g("audit.action", "Action"),
154
- options: _,
165
+ label: S("audit.action", "Action"),
166
+ options: C,
155
167
  value: s,
156
168
  onChange: c
157
169
  }),
158
170
  /* @__PURE__ */ r(t, {
159
- label: g("audit.resource", "Resource"),
160
- options: v,
171
+ label: S("audit.resource", "Resource"),
172
+ options: w,
161
173
  value: l,
162
174
  onChange: u
163
175
  }),
164
176
  /* @__PURE__ */ r(t, {
165
- label: g("audit.status", "Status"),
166
- options: y,
177
+ label: S("audit.status", "Status"),
178
+ options: T,
167
179
  value: d,
168
180
  onChange: f
169
181
  }),
182
+ g && /* @__PURE__ */ r(t, {
183
+ label: S("audit.agent", "Agent"),
184
+ options: E,
185
+ value: h ?? "all",
186
+ onChange: g
187
+ }),
188
+ y && /* @__PURE__ */ r(t, {
189
+ label: S("audit.vibe", "Vibe"),
190
+ options: D,
191
+ value: v ?? "all",
192
+ onChange: y
193
+ }),
170
194
  /* @__PURE__ */ i("label", {
171
195
  className: "flex items-center gap-2 text-sm text-text-secondary cursor-pointer",
172
196
  children: [/* @__PURE__ */ r("input", {
@@ -175,7 +199,7 @@ function a({ searchQuery: a, onSearchChange: o, actionFilter: s, onActionChange:
175
199
  checked: p,
176
200
  onChange: (e) => m(e.target.checked),
177
201
  className: "rounded border-border-primary"
178
- }), g("audit.commandsOnly", "Commands only")]
202
+ }), S("audit.commandsOnly", "Commands only")]
179
203
  })
180
204
  ]
181
205
  });
@@ -1 +1 @@
1
- {"version":3,"file":"AuditLogFilters.js","names":[],"sources":["../../../src/components/audit/AuditLogFilters.tsx"],"sourcesContent":["import { SearchInput, FilterDropdown } from '@/components/shared';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\ninterface AuditLogFiltersProps {\n searchQuery: string;\n onSearchChange: (query: string) => void;\n actionFilter: string | null;\n onActionChange: (value: string) => void;\n resourceTypeFilter: string | null;\n onResourceTypeChange: (value: string) => void;\n statusFilter: string | null;\n onStatusChange: (value: string) => void;\n hasCommandFilter: boolean;\n onHasCommandChange: (value: boolean) => void;\n}\n\nexport function AuditLogFilters({\n searchQuery,\n onSearchChange,\n actionFilter,\n onActionChange,\n resourceTypeFilter,\n onResourceTypeChange,\n statusFilter,\n onStatusChange,\n hasCommandFilter,\n onHasCommandChange,\n}: AuditLogFiltersProps) {\n const { t } = useI18n();\n const tr = (key: string, fallback: string) => {\n const v = t(key);\n return v === key ? fallback : v;\n };\n\n const actionOptions = [\n { value: 'all', label: tr('audit.allActions', 'All Actions') },\n { value: 'CREATE', label: tr('audit.actionCreate', 'Create') },\n { value: 'UPDATE', label: tr('audit.actionUpdate', 'Update') },\n { value: 'DELETE', label: tr('audit.actionDelete', 'Delete') },\n { value: 'EXECUTE', label: tr('audit.actionExecute', 'Execute') },\n { value: 'EXPORT', label: tr('audit.actionExport', 'Export') },\n { value: 'SHARE', label: tr('audit.actionShare', 'Share') },\n { value: 'REVOKE', label: tr('audit.actionRevoke', 'Revoke') },\n { value: 'ARCHIVE', label: tr('audit.actionArchive', 'Archive') },\n { value: 'RESTORE', label: tr('audit.actionRestore', 'Restore') },\n ];\n\n const resourceTypeOptions = [\n { value: 'all', label: tr('audit.allResources', 'All Resources') },\n { value: 'AGENT', label: tr('audit.resourceAgent', 'Agent') },\n { value: 'VIBE', label: tr('audit.resourceVibe', 'Vibe') },\n { value: 'SESSION', label: tr('audit.resourceSession', 'Session') },\n { value: 'VIBE_DECK', label: tr('audit.resourceVibeDeck', 'Vibe Deck') },\n { value: 'VIBE_DECK_BUTTON', label: tr('audit.resourceDeckButton', 'Deck Button') },\n { value: 'NOTE', label: tr('audit.resourceNote', 'Note') },\n { value: 'CONFIGURATION', label: tr('audit.resourceConfiguration', 'Configuration') },\n { value: 'WEBHOOK', label: tr('audit.resourceWebhook', 'Webhook') },\n { value: 'SESSION_SHARE', label: tr('audit.resourceSessionShare', 'Session Share') },\n { value: 'AI_TOOL_EVENT', label: tr('audit.resourceAiToolEvent', 'AI Tool Event') },\n { value: 'AUDIT_LOG', label: tr('audit.resourceAuditLog', 'Audit Log') },\n { value: 'CALENDAR_TASK', label: tr('audit.resourceCalendarTask', 'Calendar Task') },\n { value: 'TARGET', label: tr('audit.resourceTarget', 'Target') },\n { value: 'AGENT_CONNECTION', label: tr('audit.resourceAgentConnection', 'Agent Connection') },\n { value: 'UI_SESSION', label: tr('audit.resourceUiSession', 'UI Session') },\n { value: 'SESSION_SHARE_LINK', label: tr('audit.resourceShareLink', 'Share Link') },\n ];\n\n const statusOptions = [\n { value: 'all', label: tr('audit.allStatuses', 'All Statuses') },\n { value: 'SUCCESS', label: tr('audit.statusSuccess', 'Success') },\n { value: 'FAILURE', label: tr('audit.statusFailure', 'Failure') },\n { value: 'DENIED', label: tr('audit.statusDenied', 'Denied') },\n { value: 'ERROR', label: tr('audit.statusError', 'Error') },\n ];\n\n return (\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center\">\n <SearchInput\n value={searchQuery}\n onChange={onSearchChange}\n placeholder={tr('audit.searchPlaceholder', 'Search audit logs...')}\n className=\"w-full sm:w-64\"\n />\n <FilterDropdown\n label={tr('audit.action', 'Action')}\n options={actionOptions}\n value={actionFilter}\n onChange={onActionChange}\n />\n <FilterDropdown\n label={tr('audit.resource', 'Resource')}\n options={resourceTypeOptions}\n value={resourceTypeFilter}\n onChange={onResourceTypeChange}\n />\n <FilterDropdown\n label={tr('audit.status', 'Status')}\n options={statusOptions}\n value={statusFilter}\n onChange={onStatusChange}\n />\n <label className=\"flex items-center gap-2 text-sm text-text-secondary cursor-pointer\">\n <input\n aria-label=\"control\"\n type=\"checkbox\"\n checked={hasCommandFilter}\n onChange={(e) => onHasCommandChange(e.target.checked)}\n className=\"rounded border-border-primary\"\n />\n {tr('audit.commandsOnly', 'Commands only')}\n </label>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AuditLogFilters.js","names":[],"sources":["../../../src/components/audit/AuditLogFilters.tsx"],"sourcesContent":["import { SearchInput, FilterDropdown } from '@/components/shared';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\n\ninterface AgentOption {\n id: string;\n name: string;\n}\n\ninterface VibeOption {\n id: string;\n name: string;\n}\n\ninterface AuditLogFiltersProps {\n searchQuery: string;\n onSearchChange: (query: string) => void;\n actionFilter: string | null;\n onActionChange: (value: string) => void;\n resourceTypeFilter: string | null;\n onResourceTypeChange: (value: string) => void;\n statusFilter: string | null;\n onStatusChange: (value: string) => void;\n hasCommandFilter: boolean;\n onHasCommandChange: (value: boolean) => void;\n agentFilter?: string | null;\n onAgentChange?: (value: string) => void;\n agents?: AgentOption[];\n vibeFilter?: string | null;\n onVibeChange?: (value: string) => void;\n vibes?: VibeOption[];\n}\n\nexport function AuditLogFilters({\n searchQuery,\n onSearchChange,\n actionFilter,\n onActionChange,\n resourceTypeFilter,\n onResourceTypeChange,\n statusFilter,\n onStatusChange,\n hasCommandFilter,\n onHasCommandChange,\n agentFilter,\n onAgentChange,\n agents,\n vibeFilter,\n onVibeChange,\n vibes,\n}: AuditLogFiltersProps) {\n const { t } = useI18n();\n const tr = (key: string, fallback: string) => {\n const v = t(key);\n return v === key ? fallback : v;\n };\n\n const actionOptions = [\n { value: 'all', label: tr('audit.allActions', 'All Actions') },\n { value: 'CREATE', label: tr('audit.actionCreate', 'Create') },\n { value: 'UPDATE', label: tr('audit.actionUpdate', 'Update') },\n { value: 'DELETE', label: tr('audit.actionDelete', 'Delete') },\n { value: 'EXECUTE', label: tr('audit.actionExecute', 'Execute') },\n { value: 'EXPORT', label: tr('audit.actionExport', 'Export') },\n { value: 'SHARE', label: tr('audit.actionShare', 'Share') },\n { value: 'REVOKE', label: tr('audit.actionRevoke', 'Revoke') },\n { value: 'ARCHIVE', label: tr('audit.actionArchive', 'Archive') },\n { value: 'RESTORE', label: tr('audit.actionRestore', 'Restore') },\n ];\n\n const resourceTypeOptions = [\n { value: 'all', label: tr('audit.allResources', 'All Resources') },\n { value: 'AGENT', label: tr('audit.resourceAgent', 'Agent') },\n { value: 'VIBE', label: tr('audit.resourceVibe', 'Vibe') },\n { value: 'SESSION', label: tr('audit.resourceSession', 'Session') },\n { value: 'VIBE_DECK', label: tr('audit.resourceVibeDeck', 'Vibe Deck') },\n { value: 'VIBE_DECK_BUTTON', label: tr('audit.resourceDeckButton', 'Deck Button') },\n { value: 'NOTE', label: tr('audit.resourceNote', 'Note') },\n { value: 'CONFIGURATION', label: tr('audit.resourceConfiguration', 'Configuration') },\n { value: 'WEBHOOK', label: tr('audit.resourceWebhook', 'Webhook') },\n { value: 'SESSION_SHARE', label: tr('audit.resourceSessionShare', 'Session Share') },\n { value: 'AI_TOOL_EVENT', label: tr('audit.resourceAiToolEvent', 'AI Tool Event') },\n { value: 'AUDIT_LOG', label: tr('audit.resourceAuditLog', 'Audit Log') },\n { value: 'CALENDAR_TASK', label: tr('audit.resourceCalendarTask', 'Calendar Task') },\n { value: 'TARGET', label: tr('audit.resourceTarget', 'Target') },\n { value: 'AGENT_CONNECTION', label: tr('audit.resourceAgentConnection', 'Agent Connection') },\n { value: 'UI_SESSION', label: tr('audit.resourceUiSession', 'UI Session') },\n { value: 'SESSION_SHARE_LINK', label: tr('audit.resourceShareLink', 'Share Link') },\n ];\n\n const statusOptions = [\n { value: 'all', label: tr('audit.allStatuses', 'All Statuses') },\n { value: 'SUCCESS', label: tr('audit.statusSuccess', 'Success') },\n { value: 'FAILURE', label: tr('audit.statusFailure', 'Failure') },\n { value: 'DENIED', label: tr('audit.statusDenied', 'Denied') },\n { value: 'ERROR', label: tr('audit.statusError', 'Error') },\n ];\n\n const agentOptions = [\n { value: 'all', label: tr('audit.allAgents', 'All Agents') },\n ...(agents ?? []).map((a) => ({ value: a.id, label: a.name })),\n ];\n\n const vibeOptions = [\n { value: 'all', label: tr('audit.allVibes', 'All Vibes') },\n ...(vibes ?? []).map((v) => ({ value: v.id, label: v.name })),\n ];\n\n return (\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:flex-wrap sm:items-center\">\n <SearchInput\n value={searchQuery}\n onChange={onSearchChange}\n placeholder={tr('audit.searchPlaceholder', 'Search audit logs...')}\n className=\"w-full sm:w-64\"\n />\n <FilterDropdown\n label={tr('audit.action', 'Action')}\n options={actionOptions}\n value={actionFilter}\n onChange={onActionChange}\n />\n <FilterDropdown\n label={tr('audit.resource', 'Resource')}\n options={resourceTypeOptions}\n value={resourceTypeFilter}\n onChange={onResourceTypeChange}\n />\n <FilterDropdown\n label={tr('audit.status', 'Status')}\n options={statusOptions}\n value={statusFilter}\n onChange={onStatusChange}\n />\n {onAgentChange && (\n <FilterDropdown\n label={tr('audit.agent', 'Agent')}\n options={agentOptions}\n value={agentFilter ?? 'all'}\n onChange={onAgentChange}\n />\n )}\n {onVibeChange && (\n <FilterDropdown\n label={tr('audit.vibe', 'Vibe')}\n options={vibeOptions}\n value={vibeFilter ?? 'all'}\n onChange={onVibeChange}\n />\n )}\n <label className=\"flex items-center gap-2 text-sm text-text-secondary cursor-pointer\">\n <input\n aria-label=\"control\"\n type=\"checkbox\"\n checked={hasCommandFilter}\n onChange={(e) => onHasCommandChange(e.target.checked)}\n className=\"rounded border-border-primary\"\n />\n {tr('audit.commandsOnly', 'Commands only')}\n </label>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -6,31 +6,32 @@ import { Check as o, Copy as s, Download as c, ExternalLink as l, Terminal as u,
6
6
  import { getProfileScopedKey as f } from "@burdenoff/fe-libs/shared/utils";
7
7
  import { AnimatePresence as p, motion as m } from "framer-motion";
8
8
  import { jsx as h, jsxs as g } from "react/jsx-runtime";
9
+ import { Button as _ } from "@burdenoff/fe-libs/ui";
9
10
  //#region src/components/shared/AgentSetupBanner.tsx
10
- var _ = "https://www.npmjs.com/package/@vibecontrols/agent";
11
- function v() {
11
+ var v = "https://www.npmjs.com/package/@vibecontrols/agent";
12
+ function y() {
12
13
  return typeof window > "u" ? "curl -fsSL https://app.vibecontrols.com/install | bash" : `curl -fsSL https://${window.__VIBECONTROLS_HOST__ ?? window.location.host}/install | bash`;
13
14
  }
14
- function y({ variant: y = "compact", dismissible: b = !0, dismissKey: x = "vibecontrols-setup-banner-dismissed", className: S = "" }) {
15
- let C = e(), w = t(), T = i(() => v(), []), [E, D] = a(!1), [O, k] = a(() => {
15
+ function b({ variant: b = "compact", dismissible: x = !0, dismissKey: S = "vibecontrols-setup-banner-dismissed", className: C = "" }) {
16
+ let w = e(), T = t(), E = i(() => y(), []), [D, O] = a(!1), [k, A] = a(() => {
16
17
  try {
17
- return localStorage.getItem(f(x)) === "true";
18
+ return localStorage.getItem(f(S)) === "true";
18
19
  } catch {
19
20
  return !1;
20
21
  }
21
- }), A = r(async (e) => {
22
+ }), j = r(async (e) => {
22
23
  try {
23
- await navigator.clipboard.writeText(e), D(!0), setTimeout(() => D(!1), 2e3);
24
+ await navigator.clipboard.writeText(e), O(!0), setTimeout(() => O(!1), 2e3);
24
25
  } catch {
25
26
  let t = document.createElement("textarea");
26
- t.value = e, document.body.appendChild(t), t.select(), document.execCommand("copy"), document.body.removeChild(t), D(!0), setTimeout(() => D(!1), 2e3);
27
+ t.value = e, document.body.appendChild(t), t.select(), document.execCommand("copy"), document.body.removeChild(t), O(!0), setTimeout(() => O(!1), 2e3);
27
28
  }
28
- }, []), j = r(() => {
29
- k(!0);
29
+ }, []), M = r(() => {
30
+ A(!0);
30
31
  try {
31
- localStorage.setItem(f(x), "true");
32
+ localStorage.setItem(f(S), "true");
32
33
  } catch {}
33
- }, [x]), M = {
34
+ }, [S]), N = {
34
35
  duration: .3,
35
36
  ease: [
36
37
  .4,
@@ -39,7 +40,7 @@ function y({ variant: y = "compact", dismissible: b = !0, dismissKey: x = "vibec
39
40
  1
40
41
  ]
41
42
  };
42
- return y === "compact" ? /* @__PURE__ */ h(p, { children: !O && /* @__PURE__ */ g(m.div, {
43
+ return b === "compact" ? /* @__PURE__ */ h(p, { children: !k && /* @__PURE__ */ g(m.div, {
43
44
  initial: {
44
45
  opacity: 0,
45
46
  y: -8,
@@ -55,8 +56,8 @@ function y({ variant: y = "compact", dismissible: b = !0, dismissKey: x = "vibec
55
56
  y: -8,
56
57
  height: 0
57
58
  },
58
- transition: M,
59
- className: `relative flex flex-col items-start gap-3 px-4 py-3 bg-accent-purple-subtle border border-accent-purple/20 rounded-lg sm:flex-row sm:items-center ${S}`,
59
+ transition: N,
60
+ className: `relative flex flex-col items-start gap-3 px-4 py-3 bg-accent-purple-subtle border border-accent-purple/20 rounded-lg sm:flex-row sm:items-center ${C}`,
60
61
  children: [
61
62
  /* @__PURE__ */ h(c, { className: "size-5 text-accent-purple flex-shrink-0" }),
62
63
  /* @__PURE__ */ g("div", {
@@ -64,42 +65,42 @@ function y({ variant: y = "compact", dismissible: b = !0, dismissKey: x = "vibec
64
65
  children: [
65
66
  /* @__PURE__ */ h("span", {
66
67
  className: "text-sm font-medium text-text-primary",
67
- children: C("vibecontrols.shared.agentSetupBanner.installPrompt", "Install the VibeControls Agent CLI to get started")
68
+ children: w("vibecontrols.shared.agentSetupBanner.installPrompt", "Install the VibeControls Agent CLI to get started")
68
69
  }),
69
70
  /* @__PURE__ */ g("code", {
70
71
  className: "inline-flex min-w-0 max-w-full items-center gap-1.5 rounded border border-border-default bg-bg-sunken px-2.5 py-1 font-mono text-xs text-text-primary transition-colors hover:bg-bg-elevated",
71
- onClick: () => A(T),
72
- title: C("vibecontrols.shared.agentSetupBanner.clickToCopy", "Click to copy"),
72
+ onClick: () => j(E),
73
+ title: w("vibecontrols.shared.agentSetupBanner.clickToCopy", "Click to copy"),
73
74
  children: [
74
75
  /* @__PURE__ */ h(u, { className: "size-3" }),
75
76
  /* @__PURE__ */ h("span", {
76
77
  className: "min-w-0 break-all",
77
- children: T
78
+ children: E
78
79
  }),
79
- E ? /* @__PURE__ */ h(o, { className: "size-3 text-status-success-text" }) : /* @__PURE__ */ h(s, { className: "size-3 text-text-muted" })
80
+ D ? /* @__PURE__ */ h(o, { className: "size-3 text-status-success-text" }) : /* @__PURE__ */ h(s, { className: "size-3 text-text-muted" })
80
81
  ]
81
82
  }),
82
83
  /* @__PURE__ */ g("button", {
83
84
  type: "button",
84
- onClick: () => w("/getting-started"),
85
+ onClick: () => T("/getting-started"),
85
86
  className: "text-sm text-accent-purple hover:underline flex items-center gap-1",
86
87
  children: [
87
- C("vibecontrols.shared.agentSetupBanner.setupGuide", "Setup guide"),
88
+ w("vibecontrols.shared.agentSetupBanner.setupGuide", "Setup guide"),
88
89
  " ",
89
90
  /* @__PURE__ */ h(l, { className: "size-3" })
90
91
  ]
91
92
  })
92
93
  ]
93
94
  }),
94
- b && /* @__PURE__ */ h("button", {
95
+ x && /* @__PURE__ */ h("button", {
95
96
  type: "button",
96
- onClick: j,
97
+ onClick: M,
97
98
  className: "flex-shrink-0 p-1 text-text-muted hover:text-text-secondary rounded transition-colors",
98
- title: C("vibecontrols.shared.agentSetupBanner.dismiss", "Dismiss"),
99
+ title: w("vibecontrols.shared.agentSetupBanner.dismiss", "Dismiss"),
99
100
  children: /* @__PURE__ */ h(d, { className: "size-4" })
100
101
  })
101
102
  ]
102
- }) }) : /* @__PURE__ */ h(p, { children: !O && /* @__PURE__ */ g(m.div, {
103
+ }) }) : /* @__PURE__ */ h(p, { children: !k && /* @__PURE__ */ g(m.div, {
103
104
  initial: {
104
105
  opacity: 0,
105
106
  y: -8,
@@ -115,13 +116,13 @@ function y({ variant: y = "compact", dismissible: b = !0, dismissKey: x = "vibec
115
116
  y: -8,
116
117
  height: 0
117
118
  },
118
- transition: M,
119
- className: `relative border border-accent-purple/20 bg-accent-purple-subtle rounded-lg overflow-hidden ${S}`,
120
- children: [b && /* @__PURE__ */ h("button", {
119
+ transition: N,
120
+ className: `relative border border-accent-purple/20 bg-accent-purple-subtle rounded-lg overflow-hidden ${C}`,
121
+ children: [x && /* @__PURE__ */ h("button", {
121
122
  type: "button",
122
- onClick: j,
123
+ onClick: M,
123
124
  className: "absolute top-3 right-3 p-1 text-text-muted hover:text-text-secondary rounded transition-colors z-10",
124
- title: C("vibecontrols.shared.agentSetupBanner.dismiss", "Dismiss"),
125
+ title: w("vibecontrols.shared.agentSetupBanner.dismiss", "Dismiss"),
125
126
  children: /* @__PURE__ */ h(d, { className: "size-4" })
126
127
  }), /* @__PURE__ */ g("div", {
127
128
  className: "p-5 sm:p-6",
@@ -133,10 +134,10 @@ function y({ variant: y = "compact", dismissible: b = !0, dismissKey: x = "vibec
133
134
  children: /* @__PURE__ */ h(c, { className: "size-5 text-accent-purple" })
134
135
  }), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("h3", {
135
136
  className: "text-base font-semibold text-text-primary",
136
- children: C("vibecontrols.shared.agentSetupBanner.title", "Get Started with VibeControls Agent")
137
+ children: w("vibecontrols.shared.agentSetupBanner.title", "Get Started with VibeControls Agent")
137
138
  }), /* @__PURE__ */ h("p", {
138
139
  className: "text-sm text-text-secondary mt-0.5",
139
- children: C("vibecontrols.shared.agentSetupBanner.description", "Install the CLI on any machine you want to manage. The only prerequisite is bun — the curl script installs it for you.")
140
+ children: w("vibecontrols.shared.agentSetupBanner.description", "Install the CLI on any machine you want to manage. The only prerequisite is bun — the curl script installs it for you.")
140
141
  })] })]
141
142
  }),
142
143
  /* @__PURE__ */ h("div", {
@@ -145,17 +146,21 @@ function y({ variant: y = "compact", dismissible: b = !0, dismissKey: x = "vibec
145
146
  }),
146
147
  /* @__PURE__ */ g("div", {
147
148
  className: "flex flex-wrap items-center gap-3 mt-5 ml-0 sm:ml-13",
148
- children: [/* @__PURE__ */ g("button", {
149
- type: "button",
150
- onClick: () => w("/getting-started"),
151
- className: "inline-flex items-center gap-2 px-4 py-2 text-sm bg-accent-purple text-text-inverse rounded-md hover:bg-accent-purple/90 transition-colors",
152
- children: [C("vibecontrols.shared.agentSetupBanner.viewFullSetupGuide", "View full setup guide"), /* @__PURE__ */ h(l, { className: "size-3.5" })]
153
- }), /* @__PURE__ */ g("a", {
154
- href: _,
155
- target: "_blank",
156
- rel: "noopener noreferrer",
157
- className: "inline-flex items-center gap-2 px-4 py-2 text-sm border border-border-default text-text-primary rounded-md hover:bg-bg-sunken transition-colors",
158
- children: [C("vibecontrols.shared.agentSetupBanner.npmPackage", "npm package"), /* @__PURE__ */ h(l, { className: "size-3.5" })]
149
+ children: [/* @__PURE__ */ g(_, {
150
+ variant: "default",
151
+ onClick: () => T("/getting-started"),
152
+ className: "gap-2",
153
+ children: [w("vibecontrols.shared.agentSetupBanner.viewFullSetupGuide", "View full setup guide"), /* @__PURE__ */ h(l, { className: "size-3.5" })]
154
+ }), /* @__PURE__ */ h(_, {
155
+ variant: "outline",
156
+ asChild: !0,
157
+ className: "gap-2",
158
+ children: /* @__PURE__ */ g("a", {
159
+ href: v,
160
+ target: "_blank",
161
+ rel: "noopener noreferrer",
162
+ children: [w("vibecontrols.shared.agentSetupBanner.npmPackage", "npm package"), /* @__PURE__ */ h(l, { className: "size-3.5" })]
163
+ })
159
164
  })]
160
165
  })
161
166
  ]
@@ -163,6 +168,6 @@ function y({ variant: y = "compact", dismissible: b = !0, dismissKey: x = "vibec
163
168
  }) });
164
169
  }
165
170
  //#endregion
166
- export { y as AgentSetupBanner };
171
+ export { b as AgentSetupBanner };
167
172
 
168
173
  //# sourceMappingURL=AgentSetupBanner.js.map