Files
Anand d63c284fbf Fix build errors and a batch of UI/data bugs found in review
Frontend build:
- combobox.tsx: DropdownMenuContent doesn't expose onOpenAutoFocus (Radix
  Popper primitive, unlike Dialog/Popover) — tsc failed. Focus the search
  input from an effect on `open` instead.

Backend data bugs (JSON parsing / validation):
- pve.JournalEntry: "n" is sometimes sent quoted by PVE ("n":"1"), which
  failed the whole unmarshal and blanked the node Journal tab. Decoded
  loosely, same as the existing cpuinfo.mhz string/number quirk.
- pve.ClusterConfigNode: pve_addr was typed int but PVE always sends a
  string (an IP) — populated it 502'd Cluster & SDN > Members. Fixed to
  string.
- ClusterPage: PVE also errors /cluster/config/nodes outright on a
  standalone (non-clustered) node — that hit the same 502 error card
  instead of the existing "not part of a cluster" message.
- ai_providers.go: updateAIProvider rejected the built-in Needle 2
  provider's "needle://local" baseUrl on every save (missing the
  needle.IsBuiltin bypass createAIProvider already had), so it could only
  ever be disabled, never edited. Deleting it only lasted until the next
  restart (the seeder always re-created it) — now tracked via a
  "dismissed" flag in the settings table so a delete sticks.

UI polish:
- Added amber/rose/teal accent color presets (theme.tsx, AppearanceCard,
  index.css, backend whitelist).
- StatusDot's glow was clipped on one side wherever it sat inside a
  `truncate` (overflow-hidden) flex row — moved truncation to just the
  text sibling (ConnectionsPage, AlertActivityWidget).
- ResourceAreaChart: a wide Y-axis tick ("47.68 MB/s") wraps onto two
  lines in recharts, and the chart only had 8px of top margin — the first
  line rendered off the top edge. Widened the axis gutter and margin.
- AlertActivityWidget required *both* of two independent queries to fail
  before showing an error, so one broken endpoint alone rendered stale
  counts instead of the error state.
- DonutChart: the hover tooltip followed the cursor by default, which on
  a compact ring collided with the centered value/label text. Pinned it
  below the ring instead.
- NodeDetailPage storage rows: a variable number of badges before the
  usage bar made every row's bar start at a different x. Switched to a
  fixed-width grid, same pattern already used for two other bar lists.
- RunningTasksWidget: a failed task's PVE status is a full sentence, not
  a short word — stuffing it into a badge blew the row's layout up.
  Collapsed to "Failed" with the full text as a hover title.
- Alert value/threshold formatting assumed every metric is a 0-100
  percent; three built-in alerts (cert_expiry/connection_stale in days,
  storage_orphan_disk in bytes) printed nonsense like "67108864.0%".
  Added a shared formatAlertValue() and used it everywhere alert
  instances are rendered (AlertsPage, OverviewPage, NotificationBell).

README: added a Features section summarizing the fleet management,
automation, integration, and access-control capabilities.
2026-09-10 19:40:00 +05:30
..
2026-09-03 08:36:04 +05:30