3486 Commits

Author SHA1 Message Date
rcourtman cefc032a37 Fix patch-release follow-up regressions
Refs #1510

Refs #1501

Refs #1507

Refs #1442

- persist scoped workloads status filters across platform navigation
- derive host memory pressure from available memory
- reapply system settings after every monitor reload path
- bound PBS backup snapshot polling workers during large backup scans
2026-07-04 18:37:59 +01:00
rcourtman 64d58fd161 Fix legacy agent update state recovery
Refs #1515
2026-07-04 17:22:29 +01:00
rcourtman c2729327c0 Keep Patrol calm-day queue plain
- remove the calm-day protection posture strip from Patrol Open work
- keep monitor-context Patrol posture suppressed for active or failed checks
2026-07-03 21:08:26 +01:00
rcourtman b1fdefdd50 Normalize Docker container CPU capacity
Refs #1293
2026-07-03 11:51:08 +01:00
rcourtman 28cee7c467 Prefer PVE 9 guest-agent privileges in setup
Refs #1466
2026-07-03 11:15:51 +01:00
rcourtman 477c1e3da6 Alert on expected QEMU guest agent outages
Refs #1508
2026-07-02 23:52:02 +01:00
rcourtman 97b9369333 Guard infrastructure import plan approvals
- add candidate import approval and preview gate for node onboarding
- document metrics, availability, and proxy role behavior
- lock config auth reads and preserve storage metrics fallback
2026-07-02 21:59:26 +01:00
rcourtman 6c9b4f8e8d Harden GA telemetry disclosure 2026-07-02 11:50:03 +01:00
rcourtman c63533790c Add Proxmox filter route regression coverage
Refs #1510
2026-07-01 23:20:27 +01:00
rcourtman 55d9bf8610 Fix Machines filter toolbar layout 2026-06-30 17:27:27 +01:00
rcourtman c759c9a77a Gate mobile pairing codes on relay readiness 2026-06-30 17:12:55 +01:00
rcourtman 887855e5e5 Remove Proxmox overview Patrol coverage strip 2026-06-30 17:05:06 +01:00
rcourtman 4ac224084e Guard Proxmox Patrol coverage before hydration 2026-06-30 16:56:35 +01:00
rcourtman f0c81de00e Add Patrol safe workflow row guidance 2026-06-30 16:47:55 +01:00
rcourtman 477d549efd Clarify Patrol mode boundaries 2026-06-30 16:14:55 +01:00
rcourtman 5dbf750136 Add dashboard Explore boundary guardrails 2026-06-30 15:55:22 +01:00
rcourtman 4dacd93078 Add monitor-context Patrol coverage 2026-06-30 15:40:20 +01:00
rcourtman 238c806d1f Add Patrol row issue scaffolding 2026-06-30 15:20:42 +01:00
rcourtman a8726a7bc7 Add Patrol calm-day protection posture 2026-06-30 15:06:25 +01:00
rcourtman 9ba5cf1e0f Group Patrol work signals in the workbench 2026-06-30 14:46:04 +01:00
rcourtman a05c273b6a Localize pricing handoff and restore frontend lint 2026-06-30 12:19:00 +01:00
rcourtman 229867636d Add resource priority to Patrol queue 2026-06-30 10:37:54 +01:00
rcourtman 7c75b13d2c Carry host power sensor readings 2026-06-30 10:02:49 +01:00
rcourtman d393ccf310 Add typed NVIDIA GPU stats 2026-06-30 09:43:33 +01:00
rcourtman dcf23fb2ca Test selected provider model from settings 2026-06-29 23:14:33 +01:00
rcourtman d20c556db3 Preserve platform tab route state
Remember each primary platform tab's last route so URL-backed filters survive tab switches without leaking query state across tabs.
2026-06-28 17:46:00 +01:00
rcourtman d6a21eba98 Add update funnel telemetry
Record anonymous 30-day update attempts, successes, failures, and coarse failure categories from local update history.
2026-06-28 15:19:39 +01:00
rcourtman 15856ce760 fix(frontend): hide stale agent prompts in demo mode 2026-06-28 13:30:53 +01:00
rcourtman c03c3231c1 fix(frontend): route infrastructure entry to workspace 2026-06-28 09:52:55 +01:00
rcourtman fc10de9b54 Sanitize Patrol runtime failures in history 2026-06-27 23:08:40 +01:00
rcourtman d45715d083 feat(ai): surface deterministic capacity forecasts as first-class finding signals
Capacity forecasts (days-to-full, current usage, trend) were previously
computed deterministically but only fed into LLM prompt text. They never
reached the finding as structured data, so the frontend could not render a
verified urgency signal and the model's speculation was the only thing the
operator saw.

This persists CapacityForecast on Finding (marshal-mirror pair) and stamps
it post-analysis via a service join (StampCapacityForecasts). The forecast
filter now also keeps stable-high (>=80%) pools so the deterministic "no
fill trend" reading wins over model speculation, and fixes isQuiet wrongly
treating stable (-1) trends as filling.

Frontend maps the forecast through the UnifiedFinding view model and renders
a deterministic urgency line (Filling up / Stable / days-to-full · % used)
in the expanded finding detail.

Note: forecasts only populate for resources whose usage is ingested into
metrics history (Proxmox/Ceph storage, nodes, guests). Agent-host storage
(unraid pools) is not yet ingested as a time-series and remains a follow-up
to activate the feature for those pools.

Refs lane: protection-posture-attention-queue
2026-06-27 22:03:28 +01:00
rcourtman c07fce0c33 fix: clean up copy-to-clipboard timeouts on unmount
Add timer cleanup to copy-to-clipboard handlers in TokenRevealDialog,
UpdateBanner, QuickSecuritySetup, SetupCompletionPanel, and WelcomeStep.
Rapid clicks no longer accumulate dangling setTimeout callbacks.
2026-06-27 17:25:54 +01:00
rcourtman cc1ebb569f fix(keyboard): Cmd+K command palette works from editable fields
The isEditableTarget early-return blocked Cmd+K when focus was in any
input, textarea, or select element. The command palette shortcut must
work from anywhere — it is the primary keyboard navigation path.

Move the Cmd+K check before the editable-target guard.
2026-06-27 17:20:28 +01:00
rcourtman ad645b2ef6 Fix timeout leak in copy-to-clipboard handler
Rapid clicks on the copy button accumulated setTimeout callbacks that
continued firing after component unmount. Clear the previous timer
before setting a new one, and clean up on unmount.
2026-06-27 15:22:48 +01:00
rcourtman e7de730c71 feat(alerts): per-group acknowledge button for related alert groups
Adds an 'Ack all (N)' button next to the '+N related' toggle on grouped
alerts. Acknowledges the primary and all related alerts in one action
using the existing bulkAcknowledge API endpoint, without touching
unrelated alerts.
2026-06-27 14:58:00 +01:00
rcourtman 3e477b25d9 feat(alerts): group related alerts by resource hierarchy on overview
Alerts that share a resource ancestor (e.g., ZFS pool + device within
that pool) are now grouped on the alerts overview page. The primary
alert (highest severity, most recent) is shown by default with a
'+N related' toggle that expands to reveal the related alerts.

Grouping uses resourceId nesting: alerts with 3+ path segments are
sub-components and share the group key of their parent (first 2
segments). Alerts on different subsystems remain separate.

Single-alert groups render exactly as before — no visual change when
there's nothing to group.
2026-06-27 14:51:45 +01:00
rcourtman fa5a874986 feat(alerts): clean alert messages + highlight all platform node tables
Backend:
- Map internal resource types to human-readable labels in alert messages
  ('agent-disk disk at 95.8%' -> 'Disk at 95.8%')
- Fix redundant Unraid message ('running check' -> 'check in progress')

Frontend:
- Add alert row highlighting to Docker, Kubernetes, TrueNAS, and vSphere
  host/system tables (same pattern as the Proxmox nodes table fix)
2026-06-27 14:34:33 +01:00
rcourtman 5fc30e2060 fix(alerts): surface node-level alerts on Proxmox node table
getAlertStyles now accepts an optional nodeMatch parameter. Node table
rows pass their node name so storage/topology/disk alerts (which have
a different resourceId than the node) correctly highlight the affected
node row. Previously ZFS pool errors on minipc were invisible on the
overview page.
2026-06-27 12:25:47 +01:00
rcourtman 58d0dd8c29 feat(alerts): click-through from alert card to affected resource
Alert resource names are now clickable links that navigate to the
appropriate platform overview page (Proxmox, Docker, Machines, etc.)
based on the alert's resource type. Lets users jump directly from an
alert to the affected resource for investigation.
2026-06-27 12:21:04 +01:00
rcourtman 18b3342d02 Enhance calm-day Patrol empty state with coverage context
When the latest Patrol run is available, the healthy empty state body
now includes the coverage summary (e.g. 'Checked 42 resources.') as a
prefix, giving the user immediate freshness and coverage context on a
calm day instead of just 'no action needed'. Addresses checklist L51-53.
2026-06-27 12:14:25 +01:00
rcourtman dcce40706e feat(alerts): severity-first sorting, severity badges, threshold context
- Sort active alerts by severity (critical before warning) then recency
- Add explicit Critical/Warning text badge on each alert card
- Show 'limit: 90%' annotation for threshold-based alerts
- Add critical count breakdown to stats card

Makes alerts more scannable and actionable at a glance.
2026-06-27 12:12:21 +01:00
rcourtman 6c5139c16d feat: surface AI confidence on expanded finding card
The backend UnifiedFinding model and API already return ai_confidence
as a 0-1 float for AI-enhanced findings, but the frontend
UnifiedFinding type in aiIntelligence.ts never mapped it.

Added aiConfidence to the UnifiedFinding interface, mapped it from
the API ai_confidence field in normalizeUnifiedFindingRecord, and
rendered it on the expanded finding card as a compact trust
indicator: 'Pulse confidence: High (87%)' / 'Moderate' / 'Low'.

Only shown when aiConfidence > 0 — patrol findings without AI
enhancement do not show a confidence line.

Addresses checklist L48-50: 'Recommendations expose trust
scaffolding: evidence, confidence/reason, scope or blast radius,
proposed action, approval requirement, verification result, and
attempt history.'
2026-06-27 12:01:58 +01:00
rcourtman bb7fe8e0ed feat(workloads): availability probe status card in guest drawer
Shows probe status (Up/Down), latency, method, target, last-checked
time, and error details for guests that already have an availability
probe. Sits alongside the suggestion card which only shows when no
probe exists yet.
2026-06-27 11:46:19 +01:00
rcourtman 4072297e4c fix: replace module-level BrainCircuitIcon with inline SVG
BrainCircuitIcon from lucide-solid was used as JSX inside the
module-level GUEST_COLUMNS constant. In SolidJS, component JSX
compiles to createComponent(), which was being called at module
evaluation time — outside any reactive root — triggering the
console warning: 'computations created outside a createRoot or
render will never be disposed'.

Replaced with an inline SVG matching the pattern used by all other
column icons in the same file. Removed the lucide-solid import.
2026-06-27 11:31:50 +01:00
rcourtman ca299ec729 test(workloads): update GuestRow tests for new Availability column
Update column count (21→22), column ordering assertions, and
tablet/compact visible-column expectations to include the new
'availability' column.
2026-06-27 11:27:46 +01:00
rcourtman c0411dd0aa feat(workloads): dedicated Availability column in workload table
Availability probe badges (latency, failed, timed out) previously
rendered inline in the Name column. This moves them to a dedicated
'Avail' column right after Name with center-aligned badge layout
(kind: 'badge'), giving users:

- Vertical scannability: latency values align in a clean column
  instead of floating at variable x-positions after guest names
- Conceptual separation: Name answers 'what is this?', Availability
  answers 'is this up?'

Removes AvailabilityProbeCell from both the Name column and the OS
column fallback. The column is always visible (min layout: mobile)
across all view modes (all, vm, system-container, container,
app-container).

Verified via Playwright: 'Avail' header renders after 'Name', 31 cells
populated, jellyfin shows '6ms' in its own column.
2026-06-27 11:10:33 +01:00
rcourtman 0a6460e32a Fix discovery disabled-state test expectation 2026-06-27 09:16:43 +01:00
rcourtman 5c2e465cde fix(discovery): show availability probe suggestion card for undiscovered guests
hasMeaningfulDiscoveryContext returned false for records without deep
scan data (empty service_type, no facts, no ports), which prevented the
GuestDrawerOverview from rendering the availability probe suggestion
card — even when suggested_availability_probe was populated.

Add hasSuggestedProbe to the meaningful context check so the suggestion
card renders for guests that have a backfilled probe suggestion but
haven't been deep-scanned yet.

Verified via Playwright: bazarr (no existing probe, no deep scan data)
now shows the suggestion card with HTTP :6767 at 192.168.0.78.
2026-06-27 00:08:32 +01:00
rcourtman bd0220ca58 Clear alerts activation config on org switch
The alertsActivation store (config, activation state, active alerts,
error) was not reset on org switch. Stale config from the previous
org (thresholds, activation state) persisted until the next page
navigation triggered refreshConfig.
2026-06-27 00:04:51 +01:00
rcourtman 3fa0a316e2 Immediately refresh patrol findings after org switch
The patrol polling effect did not depend on activeOrgID, so it
continued using the old interval without immediately loading new
org data. With the intelligence state now cleared on org switch,
this caused up to 30s of empty findings until the next poll cycle.
2026-06-27 00:03:48 +01:00