From 68ede71fd856e1e23bf5e02bb829a0c09782d189 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Wed, 24 Jun 2026 21:26:37 +0100 Subject: [PATCH] patrol settings: describe Watch only for plan-locked installs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Settings > Patrol "Patrol mode" section told every install to choose a mode on the Patrol page, but plan-locked (free) installs have no mode choice there — Watch only is their only mode and the paid modes stay off the free surface. The copy was tier-blind and sent free users on a fool's errand. Make the section tier-aware via the canonical patrol autonomy availability resolver: plan-locked installs now read "This install runs Watch only. Patrol monitors your infrastructure and reports issues here." while Pro/runtime installs keep the choose-on-the-Patrol-page redirect. The Open Patrol button stays. --- .../src/components/Settings/AISettings.tsx | 29 +++++++++++++++++-- .../Settings/__tests__/AISettings.test.tsx | 22 ++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/frontend-modern/src/components/Settings/AISettings.tsx b/frontend-modern/src/components/Settings/AISettings.tsx index af31ee292..169f1ca41 100644 --- a/frontend-modern/src/components/Settings/AISettings.tsx +++ b/frontend-modern/src/components/Settings/AISettings.tsx @@ -1,4 +1,4 @@ -import { Component, Show } from 'solid-js'; +import { Component, createMemo, Show } from 'solid-js'; import { useNavigate } from '@solidjs/router'; import { AIChatMaintenanceSection } from '@/components/Settings/AIChatMaintenanceSection'; import { AISettingsDialogs } from '@/components/Settings/AISettingsDialogs'; @@ -19,6 +19,13 @@ import { LoadingSpinner } from '@/components/shared/LoadingSpinner'; import SettingsPanel from '@/components/shared/SettingsPanel'; import { Toggle } from '@/components/shared/Toggle'; import { PATROL_PATH } from '@/routing/resourceLinks'; +import { getPatrolAutonomyAvailabilityPresentation } from '@/features/patrol/patrolAutonomyAvailability'; +import { getRuntimeCapabilityBlock, hasFeature, runtimeCapabilities } from '@/stores/license'; +import { getUpgradeActionDestination } from '@/stores/licenseCommercial'; +import { + presentationPolicyHidesCommercialSurfaces, + presentationPolicyHidesUpgradePrompts, +} from '@/stores/sessionPresentationPolicy'; import { AI_SETTINGS_PANEL_TITLE, getAISettingsLoadingState, @@ -93,6 +100,17 @@ const PatrolSettingsContent: Component<{ state: ReturnType { const navigate = useNavigate(); + const patrolModeAvailability = createMemo(() => + getPatrolAutonomyAvailabilityPresentation({ + autoFixLocked: !hasFeature('ai_autofix'), + commercialSurfacesHidden: presentationPolicyHidesCommercialSurfaces(), + upgradePromptsHidden: presentationPolicyHidesUpgradePrompts(), + runtimeCapabilityBlock: getRuntimeCapabilityBlock('ai_autofix'), + runtime: runtimeCapabilities()?.runtime, + planUpgradeDestination: getUpgradeActionDestination('ai_autofix'), + }), + ); + const isPlanLockedPatrol = createMemo(() => patrolModeAvailability().kind === 'plan_locked'); const intervalOptions = [ { value: 0, label: 'Manual only' }, { value: 60, label: 'Every hour' }, @@ -109,8 +127,13 @@ const PatrolSettingsContent: Component<{ state: ReturnType

Patrol mode

- Choose a Patrol mode on the Patrol page. Keep schedule, triggers, and model readiness - here. + + This install runs Watch only. Patrol monitors your infrastructure and reports issues + here. +