From 4c422aa2a2e0c57828d4e5bebba2d5ce1408866c Mon Sep 17 00:00:00 2001 From: rcourtman Date: Sat, 23 May 2026 20:45:40 +0100 Subject: [PATCH] Keep Agents secondary in platform navigation Prefer provider and runtime platform pages ahead of Agents for landing, primary navigation, mobile ordering, preloading, and command palette ordering. --- .../v6/internal/PLATFORM_SUPPORT_MODEL.md | 7 +++- .../v6/internal/SOURCE_OF_TRUTH.md | 5 +++ .../v6/internal/subsystems/ai-runtime.md | 6 ++- .../v6/internal/subsystems/cloud-paid.md | 5 +++ .../subsystems/frontend-primitives.md | 9 ++++- .../subsystems/performance-and-scalability.md | 5 ++- frontend-modern/src/AppLayout.tsx | 22 +++++------ .../src/__tests__/App.architecture.test.ts | 2 +- .../__tests__/CommandPaletteModal.test.tsx | 5 +++ .../shared/__tests__/MobileNavBar.test.tsx | 21 +++++++++-- .../components/shared/commandPaletteModel.ts | 22 +++++------ .../components/shared/mobileNavBarModel.ts | 2 +- .../features/agents/AgentsMachinesTable.tsx | 6 +-- .../src/features/agents/AgentsPageSurface.tsx | 8 ++-- .../agents/__tests__/agentsPageModel.test.ts | 28 +------------- .../src/features/agents/agentsPageModel.ts | 37 ------------------- .../infrastructureNavigationModel.test.ts | 15 +++++++- .../infrastructureNavigationModel.ts | 2 +- .../platformOverviewLayout.guardrails.test.ts | 3 ++ .../routing/__tests__/routePreload.test.ts | 2 +- frontend-modern/src/routing/routePreload.ts | 2 +- 21 files changed, 107 insertions(+), 107 deletions(-) diff --git a/docs/release-control/v6/internal/PLATFORM_SUPPORT_MODEL.md b/docs/release-control/v6/internal/PLATFORM_SUPPORT_MODEL.md index e164e6472..61f649ef9 100644 --- a/docs/release-control/v6/internal/PLATFORM_SUPPORT_MODEL.md +++ b/docs/release-control/v6/internal/PLATFORM_SUPPORT_MODEL.md @@ -168,7 +168,12 @@ Kubernetes host that also has the Pulse agent installed remains owned by that platform page; the agent contributes health, temperature, SMART, command, and check-in facets there instead of creating a second operational row in Agents. Standalone Mac, Windows, Linux, Unraid, and other bare-agent machines remain -Agents-page members. +Agents-page members. Agents is a conditional primary destination, but it is +not the provider-estate landing default: authenticated landing, desktop tab +ordering, mobile tab ordering, preload priority, and command-palette ordering +must prefer concrete provider/runtime pages first when those pages have current +resource evidence. Agents may be the first/default destination only in an +agent-only estate. Current agent-backed runtime lenses: diff --git a/docs/release-control/v6/internal/SOURCE_OF_TRUTH.md b/docs/release-control/v6/internal/SOURCE_OF_TRUTH.md index aab6a6916..dc62f2f6e 100644 --- a/docs/release-control/v6/internal/SOURCE_OF_TRUTH.md +++ b/docs/release-control/v6/internal/SOURCE_OF_TRUTH.md @@ -148,6 +148,11 @@ platform owner. Source-less legacy state may fall back to `platformType="agent"`, but Proxmox, vSphere, TrueNAS, Kubernetes, and other provider-owned host rows remain on their owning platform pages even when a Pulse agent reports supplemental telemetry such as temperature or SMART data. +Agents must not become the authenticated landing page or first primary +navigation destination when provider-platform evidence such as Proxmox, +Docker / Podman, Kubernetes, TrueNAS, or vSphere is present; it is the +standalone Pulse Agent machine surface and may be the fallback only for +agent-only estates. The same model also sets the current posture for platform breadth: `truenas` is at the declared support floor summarized below, and `vmware-vsphere` is the current admitted strategic next-platform direction while its support claim diff --git a/docs/release-control/v6/internal/subsystems/ai-runtime.md b/docs/release-control/v6/internal/subsystems/ai-runtime.md index 498d8ffa9..ed31e3eda 100644 --- a/docs/release-control/v6/internal/subsystems/ai-runtime.md +++ b/docs/release-control/v6/internal/subsystems/ai-runtime.md @@ -150,7 +150,11 @@ runtime cost control, and shared AI transport surfaces. `agent` platform, but the page must not add an agent-specific Assistant prompt surface, AI launcher, model picker, or browser-owned model context. Agent rows may seed Assistant or Patrol only through the shared unified - resource handoff contracts. + resource handoff contracts. Agents also stays behind provider/runtime + platform pages in the primary shell order; moving Agents after Proxmox, + Containers, Kubernetes, TrueNAS, and vSphere must not change Patrol or + Assistant utility-tab ordering, launcher visibility, or shared keyboard + handling in `frontend-modern/src/AppLayout.tsx`. ## Forbidden Paths diff --git a/docs/release-control/v6/internal/subsystems/cloud-paid.md b/docs/release-control/v6/internal/subsystems/cloud-paid.md index 8895b82b3..8bc841625 100644 --- a/docs/release-control/v6/internal/subsystems/cloud-paid.md +++ b/docs/release-control/v6/internal/subsystems/cloud-paid.md @@ -525,6 +525,11 @@ or other self-hosted uncapped continuity plans. The presence of an `Agents` tab is not a new commercial usage unit: hosted and paid surfaces continue to meter the governed monitored-system grouping result rather than counting primary navigation destinations. + Agents is also not the paid or hosted estate landing default when concrete + provider/runtime platform evidence exists; the authenticated shell order + and post-auth landing fallback must prefer Proxmox, Containers, + Kubernetes, TrueNAS, and vSphere ahead of Agents, with Agents first only in + an agent-only estate. ## Forbidden Paths diff --git a/docs/release-control/v6/internal/subsystems/frontend-primitives.md b/docs/release-control/v6/internal/subsystems/frontend-primitives.md index 5e5a03595..849d9ff75 100644 --- a/docs/release-control/v6/internal/subsystems/frontend-primitives.md +++ b/docs/release-control/v6/internal/subsystems/frontend-primitives.md @@ -1027,7 +1027,14 @@ not a replacement status card, CTA band, or page-local nested card. Agents page is a platform page, not a legacy Infrastructure page: it must use the shared platform tab, toolbar, table-card, and kind-aligned column primitives, and it must not reintroduce the old top-of-page - InfrastructureSummary chart strip. + InfrastructureSummary chart strip. Agents must also remain secondary in + the shell hierarchy when provider/runtime platform evidence exists: + `PRIMARY_INFRASTRUCTURE_NAV_IDS`, desktop primary tabs, mobile primary + priority, app-shell preload order, authenticated landing fallback, and + command-palette ordering must prefer Proxmox, Containers, Kubernetes, + TrueNAS, and vSphere ahead of Agents. Agents may win those first/default + positions only when the current estate has standalone Pulse Agent machines + and no provider/runtime platform evidence. ## Forbidden Paths diff --git a/docs/release-control/v6/internal/subsystems/performance-and-scalability.md b/docs/release-control/v6/internal/subsystems/performance-and-scalability.md index d71bfd48f..0da9b90e8 100644 --- a/docs/release-control/v6/internal/subsystems/performance-and-scalability.md +++ b/docs/release-control/v6/internal/subsystems/performance-and-scalability.md @@ -622,7 +622,10 @@ shell clickable behind another overlay. hot path; presentation-only platforms must not be registered. Preload entries may warm route modules, but they must not trigger additional unfiltered resource fetches, metrics-history fan-out, or provider scans - before the destination page owns its normal data query. + before the destination page owns its normal data query. The preload order + follows the provider-first shell order as a hot-path hint: Proxmox remains + ahead of Agents when both surfaces are available, while Agents stays in + the preload set so agent-only estates still get a warm first destination. Platform pages that embed `WorkloadsSurface` reuse the canonical workloads filter toolbar through the `showFilterToolbar` + `suppressPlatformFilter` props in `WorkloadsSurfaceProps`. The page diff --git a/frontend-modern/src/AppLayout.tsx b/frontend-modern/src/AppLayout.tsx index e2fbb1d90..6b04e1bc2 100644 --- a/frontend-modern/src/AppLayout.tsx +++ b/frontend-modern/src/AppLayout.tsx @@ -332,17 +332,6 @@ export function AppLayout(props: AppLayoutProps) { const isVisible = (id: PrimaryTab['id']) => primaryInfrastructureNavigationIsVisible(visible, id as PrimaryInfrastructureNavId); const allPrimaryTabs: PrimaryTab[] = [ - { - id: 'agents', - label: 'Agents', - route: ROOT_AGENTS_PATH, - settingsRoute: '/settings/infrastructure', - tooltip: 'Pulse Agent managed machines, OS telemetry, storage, and command eligibility', - enabled: isVisible('agents'), - live: isVisible('agents'), - icon: ServerIcon, - alwaysShow: false, - }, { id: 'proxmox', label: 'Proxmox', @@ -398,6 +387,17 @@ export function AppLayout(props: AppLayoutProps) { icon: CpuIcon, alwaysShow: false, }, + { + id: 'agents', + label: 'Agents', + route: ROOT_AGENTS_PATH, + settingsRoute: '/settings/infrastructure', + tooltip: 'Standalone Pulse Agent machines, OS telemetry, storage, and command eligibility', + enabled: isVisible('agents'), + live: isVisible('agents'), + icon: ServerIcon, + alwaysShow: false, + }, ]; return allPrimaryTabs.filter((tab) => tab.alwaysShow || tab.enabled); diff --git a/frontend-modern/src/__tests__/App.architecture.test.ts b/frontend-modern/src/__tests__/App.architecture.test.ts index 03cca87e7..9d6af06d2 100644 --- a/frontend-modern/src/__tests__/App.architecture.test.ts +++ b/frontend-modern/src/__tests__/App.architecture.test.ts @@ -92,7 +92,7 @@ describe('App architecture', () => { "tooltip: 'VMware vSphere hosts, virtual machines, datastores, and networks'", ); expect(appLayoutSource).toContain( - "tooltip: 'Pulse Agent managed machines, OS telemetry, storage, and command eligibility'", + "tooltip: 'Standalone Pulse Agent machines, OS telemetry, storage, and command eligibility'", ); // Governed platform/runtime primary nav: Infrastructure / Workloads / // Storage / Recovery are not duplicated as equal primary tab diff --git a/frontend-modern/src/components/shared/__tests__/CommandPaletteModal.test.tsx b/frontend-modern/src/components/shared/__tests__/CommandPaletteModal.test.tsx index 900f8f608..0ab1c154c 100644 --- a/frontend-modern/src/components/shared/__tests__/CommandPaletteModal.test.tsx +++ b/frontend-modern/src/components/shared/__tests__/CommandPaletteModal.test.tsx @@ -102,6 +102,11 @@ describe('CommandPaletteModal', () => { expect(screen.getByText('Go to vSphere')).toBeInTheDocument(); expect(screen.getByText('Go to vSphere Networks')).toBeInTheDocument(); expect(screen.getByText('/vmware/networks')).toBeInTheDocument(); + + const commandLabels = screen.getAllByRole('button').map((button) => button.textContent ?? ''); + expect(commandLabels.findIndex((label) => label.includes('Go to Proxmox'))).toBeLessThan( + commandLabels.findIndex((label) => label.includes('Go to Agents')), + ); }); it('navigates to the Kubernetes pods sub-tab', async () => { diff --git a/frontend-modern/src/components/shared/__tests__/MobileNavBar.test.tsx b/frontend-modern/src/components/shared/__tests__/MobileNavBar.test.tsx index c2f0eaf15..87884b6d8 100644 --- a/frontend-modern/src/components/shared/__tests__/MobileNavBar.test.tsx +++ b/frontend-modern/src/components/shared/__tests__/MobileNavBar.test.tsx @@ -15,6 +15,7 @@ window.requestAnimationFrame = ((callback: FrameRequestCallback) => { const InfrastructureIcon: Component<{ class?: string }> = (props) => ( IN ); +const AgentsIcon: Component<{ class?: string }> = (props) => AG; const ProxmoxIcon: Component<{ class?: string }> = (props) => PX; const StorageIcon: Component<{ class?: string }> = (props) => ST; const AlertsIcon: Component<{ class?: string }> = (props) => AL; @@ -134,6 +135,17 @@ describe('MobileNavBar', () => { 'infrastructure'} primaryTabs={() => [ + { + id: 'agents', + label: 'Agents', + route: '/agents/overview', + settingsRoute: '/settings/infrastructure', + tooltip: 'Agents', + enabled: true, + live: true, + icon: AgentsIcon, + alwaysShow: true, + }, { id: 'proxmox', label: 'Proxmox', @@ -204,10 +216,11 @@ describe('MobileNavBar', () => { const buttons = container.querySelectorAll('button[data-tab-id]'); expect(buttons[0]).toHaveAttribute('data-tab-id', 'proxmox'); - expect(buttons[1]).toHaveAttribute('data-tab-id', 'infrastructure'); - expect(buttons[2]).toHaveAttribute('data-tab-id', 'storage'); - expect(buttons[3]).toHaveAttribute('data-tab-id', 'alerts'); - expect(buttons[4]).toHaveAttribute('data-tab-id', 'settings'); + expect(buttons[1]).toHaveAttribute('data-tab-id', 'agents'); + expect(buttons[2]).toHaveAttribute('data-tab-id', 'infrastructure'); + expect(buttons[3]).toHaveAttribute('data-tab-id', 'storage'); + expect(buttons[4]).toHaveAttribute('data-tab-id', 'alerts'); + expect(buttons[5]).toHaveAttribute('data-tab-id', 'settings'); expect(screen.getByText('2')).toBeInTheDocument(); expect(screen.getByText('3')).toBeInTheDocument(); diff --git a/frontend-modern/src/components/shared/commandPaletteModel.ts b/frontend-modern/src/components/shared/commandPaletteModel.ts index 785e4c215..1d3786033 100644 --- a/frontend-modern/src/components/shared/commandPaletteModel.ts +++ b/frontend-modern/src/components/shared/commandPaletteModel.ts @@ -36,17 +36,6 @@ export function buildCommandPaletteCommands(options: { }): CommandPaletteModalCommand[] { const commands: CommandPaletteModalCommand[] = []; - if (primaryInfrastructureNavigationIsVisible(options.infrastructureVisibility, 'agents')) { - commands.push({ - id: 'nav-agents', - label: 'Go to Agents', - description: options.paths.agentsPath, - shortcut: 'g e', - keywords: ['agents', 'hosts', 'machines', 'linux', 'macos', 'windows', 'unraid'], - action: () => options.navigate(options.paths.agentsPath), - }); - } - if (primaryInfrastructureNavigationIsVisible(options.infrastructureVisibility, 'proxmox')) { commands.push({ id: 'nav-proxmox', @@ -120,6 +109,17 @@ export function buildCommandPaletteCommands(options: { ); } + if (primaryInfrastructureNavigationIsVisible(options.infrastructureVisibility, 'agents')) { + commands.push({ + id: 'nav-agents', + label: 'Go to Agents', + description: options.paths.agentsPath, + shortcut: 'g e', + keywords: ['agents', 'hosts', 'machines', 'linux', 'macos', 'windows', 'unraid'], + action: () => options.navigate(options.paths.agentsPath), + }); + } + commands.push( { id: 'nav-alerts', diff --git a/frontend-modern/src/components/shared/mobileNavBarModel.ts b/frontend-modern/src/components/shared/mobileNavBarModel.ts index 2590af4de..3c3ce167e 100644 --- a/frontend-modern/src/components/shared/mobileNavBarModel.ts +++ b/frontend-modern/src/components/shared/mobileNavBarModel.ts @@ -35,12 +35,12 @@ export type MobileNavBarProps = { }; const MOBILE_NAV_PRIMARY_PRIORITY = [ - 'agents', 'proxmox', 'docker', 'kubernetes', 'truenas', 'vmware', + 'agents', ] as const; const MOBILE_NAV_UTILITY_PRIORITY = ['alerts', 'ai', 'settings'] as const; diff --git a/frontend-modern/src/features/agents/AgentsMachinesTable.tsx b/frontend-modern/src/features/agents/AgentsMachinesTable.tsx index 1a377825a..fb70291e5 100644 --- a/frontend-modern/src/features/agents/AgentsMachinesTable.tsx +++ b/frontend-modern/src/features/agents/AgentsMachinesTable.tsx @@ -146,13 +146,13 @@ export const AgentsMachinesTable: Component<{ } > diff --git a/frontend-modern/src/features/agents/AgentsPageSurface.tsx b/frontend-modern/src/features/agents/AgentsPageSurface.tsx index 72dcb4259..f5ad102e6 100644 --- a/frontend-modern/src/features/agents/AgentsPageSurface.tsx +++ b/frontend-modern/src/features/agents/AgentsPageSurface.tsx @@ -70,8 +70,8 @@ export function AgentsPageSurface() { fallback={ diff --git a/frontend-modern/src/features/agents/__tests__/agentsPageModel.test.ts b/frontend-modern/src/features/agents/__tests__/agentsPageModel.test.ts index 17287f9e2..d402fdf84 100644 --- a/frontend-modern/src/features/agents/__tests__/agentsPageModel.test.ts +++ b/frontend-modern/src/features/agents/__tests__/agentsPageModel.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import type { Resource } from '@/types/resource'; -import { buildAgentsPageFilterModel, buildAgentsPageModel } from '../agentsPageModel'; +import { buildAgentsPageModel } from '../agentsPageModel'; const resource = (overrides: Partial): Resource => ({ @@ -17,7 +17,7 @@ const resource = (overrides: Partial): Resource => }) as Resource; describe('agentsPageModel', () => { - it('projects agent-primary machine resources without admitting provider-owned host rows', () => { + it('projects standalone agent machine resources without admitting provider-owned host rows', () => { const model = buildAgentsPageModel([ resource({ id: 'mac-mini', platformType: 'agent', type: 'agent', sources: ['agent'] }), resource({ @@ -63,28 +63,4 @@ describe('agentsPageModel', () => { expect(model.resources.map((item) => item.id)).toEqual(['legacy-agent']); }); - - it('filters agent resources by status and local identity search', () => { - const resources = [ - resource({ - id: 'agent-mac', - displayName: 'Studio Mac', - status: 'online', - identity: { hostname: 'studio-mac.local', ips: ['10.0.0.12'] }, - }), - resource({ - id: 'agent-win', - displayName: 'Windows Bench', - status: 'offline', - identity: { hostname: 'bench.local', ips: ['10.0.0.20'] }, - }), - ]; - - expect(buildAgentsPageFilterModel(resources, 'offline', '').filteredResources).toEqual([ - resources[1], - ]); - expect(buildAgentsPageFilterModel(resources, '', 'studio 10.0.0.12').filteredResources).toEqual( - [resources[0]], - ); - }); }); diff --git a/frontend-modern/src/features/agents/agentsPageModel.ts b/frontend-modern/src/features/agents/agentsPageModel.ts index 08d526a62..068bbfffb 100644 --- a/frontend-modern/src/features/agents/agentsPageModel.ts +++ b/frontend-modern/src/features/agents/agentsPageModel.ts @@ -1,24 +1,10 @@ import type { Resource } from '@/types/resource'; -import { - buildStatusOptions, - collectAvailableStatuses, - filterResources, - tokenizeSearch, -} from '@/components/Infrastructure/infrastructureSelectors'; import { isPulseAgentPlatformResource } from '@/utils/agentResources'; export interface AgentsPageModel { resources: Resource[]; } -export interface AgentsPageFilterModel { - activeFilterCount: number; - statusOptions: Array<{ key: string; label: string }>; - hasActiveFilters: boolean; - filteredResources: Resource[]; - hasFilteredResources: boolean; -} - export const isAgentsPageResource = (resource: Resource): boolean => isPulseAgentPlatformResource(resource); @@ -27,26 +13,3 @@ export function buildAgentsPageModel(resources: readonly Resource[]): AgentsPage resources: resources.filter(isAgentsPageResource), }; } - -export function buildAgentsPageFilterModel( - resources: Resource[], - selectedStatus: string, - searchQuery: string, -): AgentsPageFilterModel { - const normalizedStatus = selectedStatus.trim().toLowerCase(); - const searchTerms = tokenizeSearch(searchQuery); - const filteredResources = filterResources( - resources, - new Set(), - normalizedStatus ? new Set([normalizedStatus]) : new Set(), - searchTerms, - ); - - return { - activeFilterCount: (normalizedStatus ? 1 : 0) + (searchTerms.length > 0 ? 1 : 0), - statusOptions: buildStatusOptions(collectAvailableStatuses(resources)), - hasActiveFilters: Boolean(normalizedStatus) || searchTerms.length > 0, - filteredResources, - hasFilteredResources: filteredResources.length > 0, - }; -} diff --git a/frontend-modern/src/features/infrastructureNavigation/__tests__/infrastructureNavigationModel.test.ts b/frontend-modern/src/features/infrastructureNavigation/__tests__/infrastructureNavigationModel.test.ts index afc77cdce..84ddc293d 100644 --- a/frontend-modern/src/features/infrastructureNavigation/__tests__/infrastructureNavigationModel.test.ts +++ b/frontend-modern/src/features/infrastructureNavigation/__tests__/infrastructureNavigationModel.test.ts @@ -170,7 +170,7 @@ describe('infrastructureNavigationModel', () => { ).toBe(false); }); - it('selects the first visible platform using the canonical primary navigation order', () => { + it('selects provider platforms before Agents using the canonical primary navigation order', () => { expect( selectFirstVisiblePrimaryInfrastructureNavigationId({ agents: true, @@ -180,7 +180,7 @@ describe('infrastructureNavigationModel', () => { truenas: false, vmware: false, }), - ).toBe('agents'); + ).toBe('proxmox'); expect( selectFirstVisiblePrimaryInfrastructureNavigationId({ @@ -193,6 +193,17 @@ describe('infrastructureNavigationModel', () => { }), ).toBe('kubernetes'); + expect( + selectFirstVisiblePrimaryInfrastructureNavigationId({ + agents: true, + proxmox: false, + docker: false, + kubernetes: false, + truenas: false, + vmware: false, + }), + ).toBe('agents'); + expect( selectFirstVisiblePrimaryInfrastructureNavigationId({ agents: false, diff --git a/frontend-modern/src/features/infrastructureNavigation/infrastructureNavigationModel.ts b/frontend-modern/src/features/infrastructureNavigation/infrastructureNavigationModel.ts index 3f2a02166..6baaf3633 100644 --- a/frontend-modern/src/features/infrastructureNavigation/infrastructureNavigationModel.ts +++ b/frontend-modern/src/features/infrastructureNavigation/infrastructureNavigationModel.ts @@ -25,12 +25,12 @@ export type InfrastructureNavigationShortcut = { }; export const PRIMARY_INFRASTRUCTURE_NAV_IDS: readonly PrimaryInfrastructureNavId[] = [ - 'agents', 'proxmox', 'docker', 'kubernetes', 'truenas', 'vmware', + 'agents', ] as const; export const PRIMARY_INFRASTRUCTURE_NAV_SCOPE_IDS: Record< diff --git a/frontend-modern/src/features/platformPage/__tests__/platformOverviewLayout.guardrails.test.ts b/frontend-modern/src/features/platformPage/__tests__/platformOverviewLayout.guardrails.test.ts index 8e5e99fd5..bbdfa3b4a 100644 --- a/frontend-modern/src/features/platformPage/__tests__/platformOverviewLayout.guardrails.test.ts +++ b/frontend-modern/src/features/platformPage/__tests__/platformOverviewLayout.guardrails.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from 'vitest'; import agentsMachinesTableSource from '@/features/agents/AgentsMachinesTable.tsx?raw'; +import agentsPageModelSource from '@/features/agents/agentsPageModel.ts?raw'; import agentsPageSurfaceSource from '@/features/agents/AgentsPageSurface.tsx?raw'; import dockerHostsTableSource from '@/features/docker/DockerHostsTable.tsx?raw'; import dockerPageSurfaceSource from '@/features/docker/DockerPageSurface.tsx?raw'; @@ -221,6 +222,8 @@ describe('platform overview layout guardrails', () => { expect(agentsPageSurfaceSource).not.toContain('UnifiedResourceTable'); expect(agentsMachinesTableSource).toContain('PlatformResourceDetailTableRow'); expect(agentsMachinesTableSource).not.toContain('ResourceDetailDrawer'); + expect(agentsPageModelSource).not.toContain('infrastructureSelectors'); + expect(agentsPageModelSource).not.toContain('buildAgentsPageFilterModel'); }); it('keeps TrueNAS overview inventory in tables instead of summary cards', () => { diff --git a/frontend-modern/src/routing/__tests__/routePreload.test.ts b/frontend-modern/src/routing/__tests__/routePreload.test.ts index 04516f175..b69144ccb 100644 --- a/frontend-modern/src/routing/__tests__/routePreload.test.ts +++ b/frontend-modern/src/routing/__tests__/routePreload.test.ts @@ -10,8 +10,8 @@ describe('route preloading', () => { it('keeps all cold top-level app shell targets in the shared preload set', () => { expect([...APP_SHELL_ROUTE_PRELOAD_PATHS]).toEqual([ - buildAgentsPath(), buildProxmoxPath(), + buildAgentsPath(), PATROL_PATH, '/alerts', '/settings', diff --git a/frontend-modern/src/routing/routePreload.ts b/frontend-modern/src/routing/routePreload.ts index b073b1f62..bcdcf88af 100644 --- a/frontend-modern/src/routing/routePreload.ts +++ b/frontend-modern/src/routing/routePreload.ts @@ -23,8 +23,8 @@ const SETTINGS_PATH = '/settings'; const routePreloadCache = new Map>(); export const APP_SHELL_ROUTE_PRELOAD_PATHS = [ - ROOT_AGENTS_PATH, ROOT_PROXMOX_PATH, + ROOT_AGENTS_PATH, PATROL_PATH, ALERTS_PATH, SETTINGS_PATH,