Commit Graph

5497 Commits

Author SHA1 Message Date
rcourtman 931179cb29 Fail closed hosted refresh for inactive tenants 2026-05-01 14:42:50 +01:00
rcourtman 449c02cf29 Lock in that saved views capture the page search query
Every page URL-syncs its search through `?q=...` (Infrastructure,
Workloads, Recovery, Storage all use the same convention via
`routeStateNavigation`), and `useSavedViews.saveCurrent` snapshots the
full URL search string. So saved views already capture both the active
filter chips and the search term, and applying a view later restores
both.

Adds a SharedPrimitives guardrail assertion that pins the
`window.location.search` snapshot in saveCurrent. A future refactor
that narrowed the snapshot to a curated subset of URL params would
silently strip search from saved views; this assertion catches that.
2026-05-01 14:41:28 +01:00
rcourtman 2d4da7e08e Hide deleted workspaces from portal APIs 2026-05-01 14:38:45 +01:00
rcourtman 1267a817c7 Gate cloud provisioning to hosted checkouts 2026-05-01 14:13:08 +01:00
rcourtman 57acaba142 Add saved views to FilterBar so power users can recall named filter combos
Operators that look at the same filtered slice repeatedly (stopped
containers on a specific cluster, stale backups in last 30 days,
TrueNAS pools needing attention) now save the current filter state as
a named view and recall it with one click.

The view is the page's URL query string at save time, so saved views
double as shareable URLs: copying the bar URL after applying a view
gives someone else the exact filtered state. Storage is per-browser
localStorage under `pulse:filterbar:saved-views:<key>`. Each catalog
opts in by passing `savedViewsKey` to FilterBar:

  Infrastructure: 'infrastructure'
  Workloads: 'workloads'
  Storage: 'storage'
  Recovery Protected items: 'recovery-protected'
  Recovery events: 'recovery-events'

The menu lives next to "+ Filter" on the search row. Empty state
prompts the user to save the active filters; populated state lists
saved views with hover-to-reveal X buttons for delete. The save flow
is a small inline dialog (name input + Save / Cancel) so users never
leave the menu.

The hook (useSavedViews) owns localStorage IO, JSON parse hardening,
and URL navigation through @solidjs/router. The menu (SavedViewsMenu)
owns dropdown chrome and click-outside / Escape lifecycle. WorkloadsFilter
unit tests mock @solidjs/router so the menu can render outside a Router
context in test setup.

Implicit "remember last filters" is intentionally not added: defaulting
to yesterday's `Status: Failed` would hide real problems on a monitoring
page. Recently-used auto-tracking and pinned quick-buttons remain
deferred until we see whether named views is enough.

Subsystem contracts updated to reflect the new primitive and the
per-page opt-ins:
- frontend-primitives.md: adds SavedViewsMenu + useSavedViews to
  Canonical Files; describes the shared saved-views primitive in
  Extension Points.
- performance-and-scalability.md, storage-recovery.md,
  unified-resources.md: note that Workloads / Storage / Recovery /
  Infrastructure each opt into shared saved views by passing
  savedViewsKey.
- Recovery.test.tsx: regression assertion that the events controls
  group renders the Saved views menu trigger (verification artifact
  for the storage-recovery contract change).
2026-05-01 11:13:43 +01:00
rcourtman 4e2b62e89b Retire legacy Storage and Workloads filter helpers after FilterBar migration
Deletes files that no runtime path imports after the migration to
chip-based FilterBar:

  Storage's three-layer filter indirection:
  - StorageFilter.tsx (legacy filter shell)
  - StorageControls.tsx (subtab + filter pass-through wrapper)
  - useStorageFilterToolbarModel.ts (legacy active-filter / reset hook)
  - useStoragePageControlsModel.ts (sortDisabled + groupBy gating)
  - useStorageControlsModel.ts (subtab + node-filter wiring)
  - their tests

  Workloads filter state hook:
  - useWorkloadsFilterState.ts (replaced by inline FilterBar wiring;
    countActiveWorkloadsFilters / hasActiveWorkloadsFilters stay in
    workloadsFilterModel.ts)
  - its test

The StorageStatusFilter and StorageGroupByFilter type aliases that
StorageFilter.tsx exported fold into the existing canonical types in
storagePageState.ts (StorageStatusFilterValue) and storageModelCore.ts
(StorageGroupKey), keeping useStorageFilterState.ts alive without the
deleted shell.

PageControls.tsx and its companion FilterToolbar primitives stay in
the tree because the alert-history filter card and the Kubernetes
deployments drawer still consume them. The canonical claim shifts:
FilterBar is the chip-based shell for catalog-driven page filters
(Infrastructure, Workloads, Storage, Recovery Protected items, Recovery
events). PageControls remains for non-migrated surfaces.

Subsystem contracts and registry updated:
- frontend-primitives.md: adds FilterBar files to Canonical Files;
  describes FilterBar as the canonical page-level filter shell for
  catalog-driven resource lists; PageControls described as the legacy
  fallback for non-migrated surfaces.
- performance-and-scalability.md: drops useWorkloadsFilterState
  references; describes Workloads' FilterBar / viewOptionsTrailing
  composition.
- storage-recovery.md: replaces "PageControls toolbar rail" prose with
  FilterBar / viewOptionsTrailing for both Storage and Recovery events;
  notes the legacy three-layer indirection retired.
- registry.json: drops deleted file paths from owned_files,
  verification.exact_files, and verification.path_policies entries.
- canonical_completion_guard_test.py + subsystem_lookup_test.py: drop
  deleted file paths from hard-coded fixtures so the governance helper
  tests track the registry.
- SharedPrimitives.guardrails.test.ts: adds regression assertions that
  StoragePageControls no longer imports the deleted shells.
2026-05-01 10:51:22 +01:00
rcourtman 2a9234f2b0 Migrate filter sections to chip-based FilterBar
All four pages (Infrastructure, Workloads, Storage, Recovery) shared
PageControls as a layout container but each declared its own filter
row. The xl breakpoint silently swapped segmented buttons for selects,
Storage injected a bare unlabelled <select> for Node, and Recovery's
events sub-tab kept six advanced filters behind a separate popover.

This adds FilterBar as a shared primitive that takes a filter catalog
descriptor (label, options, value, defaultValue, group). Each page
declares its filters; the bar renders chips for active values and
reaches everything else through a "+ Filter" menu. Type-ahead in both
the menu and the chip popovers keeps power-user speed: one click plus
a few keystrokes replaces three clicks.

Infrastructure, Recovery (Protected items + Recovery events),
Workloads, and Storage migrate. Storage's three-layer
StoragePageControls -> StorageControls -> StorageFilter indirection
collapses into a single component; the bare unlabelled Node select
becomes a regular catalog chip; the xl segmented->select swap retires.

PageControls and its companion primitives (LabeledFilterSelect,
LabeledFilterToggleGroup, FilterSegmentedControl, FilterToolbarPanel,
filterControlsVariant, the Storage indirection) remain in the tree
but are no longer in any runtime path. The immediate follow-up commit
retires them and updates the frontend-primitives and unified-resources
subsystem contracts to name FilterBar as canonical.
2026-05-01 10:26:12 +01:00
rcourtman cf7381e818 Make Go lint pre-commit conditional 2026-05-01 10:14:32 +01:00
rcourtman 828e885d8e Canonicalize shared filter control deck 2026-04-30 15:03:32 +01:00
rcourtman 431d2be392 Keep update progress modal closable 2026-04-30 14:52:21 +01:00
rcourtman a8428da1ea Add agent ID file persistence
Refs #1447
2026-04-30 14:41:57 +01:00
rcourtman 7a1352f122 Preserve snapshots for guests missed by poll
Fixes #1437
2026-04-30 14:38:40 +01:00
rcourtman 82ba940524 Merge linked host disks into guest overviews
Fixes #1438
2026-04-30 14:37:43 +01:00
rcourtman 509852b28d Clarify workloads filter sections 2026-04-30 14:35:15 +01:00
rcourtman af7d727d45 Gate RAID rebuild alerts on mdstat operation
Parse the /proc/mdstat operation keyword for mdadm arrays and propagate it through host reports, models, unified resources, monitoring views, alert metadata, and AI storage summaries.

Treat recovery and reshape as rebuild signals while silencing routine check and resync maintenance, with fallback rebuild detection only when no mdstat operation is available.

Tests cover mdstat operation parsing plus recovery, check, and resync alert behavior.

Fixes #1446
2026-04-30 14:31:14 +01:00
rcourtman 1b04eb3d92 Fill workloads filter control row 2026-04-30 14:21:18 +01:00
rcourtman 01ea5ebb6e Pass keep_alive=30s to Ollama requests
Pass keep_alive=30s on both Chat and ChatStream requests so Ollama unloads the model shortly after Patrol or one-shot analysis bursts instead of refreshing the default 5-minute residency window on every request.

Tests assert both streaming and non-streaming Ollama request bodies include the keep_alive field.

Fixes #1425
2026-04-30 14:20:12 +01:00
rcourtman fc0bcd3204 Use full-width workloads filter deck 2026-04-30 14:19:59 +01:00
rcourtman c7164c2906 Clarify Relay mobile handoff paid copy 2026-04-30 13:18:04 +01:00
rcourtman 85e0de271b Gate relay mobile tokens behind Relay license 2026-04-30 12:53:29 +01:00
rcourtman f67f877f95 Clamp AI control settings to entitlements 2026-04-30 12:38:17 +01:00
rcourtman 99129d0c09 Retire product upgrade metrics runtime
Remove local upgrade-metrics API registration, settings payload wiring, startup store migration, and backend conversion recorder hooks from the normal product runtime.

Delete the retired conversion/funnel and metering packages from compiled licensing code, and extend diagnostics boundary audits and governance contracts so maintainer commercial analytics cannot return through Settings or diagnostics.
2026-04-30 12:24:22 +01:00
rcourtman e1a516757a Clamp storage history selectors to entitlements 2026-04-30 12:04:39 +01:00
rcourtman d78dd96789 Add responsive filter control groups 2026-04-30 12:02:22 +01:00
rcourtman daf825dee6 Remove customer commercial analytics wrappers 2026-04-30 11:46:16 +01:00
rcourtman 7a48cd4afd Align Relay copy with standalone tier 2026-04-30 11:01:22 +01:00
rcourtman 274bb4c60f Retire customer-side commercial analytics emission 2026-04-30 10:45:16 +01:00
rcourtman 977764bc09 Stabilize page control filter wrapping 2026-04-30 10:42:18 +01:00
rcourtman 1b3e66f1d6 Hide internal commercial settings from public docs 2026-04-30 10:38:28 +01:00
rcourtman 194f76708b Align page control action rail 2026-04-30 10:27:32 +01:00
rcourtman 37b1385d94 Remove commercial event controls from settings 2026-04-30 10:15:23 +01:00
rcourtman f5d90f0fe5 Clarify charts toggle affordance 2026-04-30 10:03:15 +01:00
rcourtman 0bbba3b818 Restrict commercial metrics reporting access 2026-04-30 10:00:35 +01:00
rcourtman 0714fec8af Guard diagnostics against internal analytics 2026-04-30 09:41:16 +01:00
rcourtman ec0cd1ac19 Fix storage and recovery filter controls 2026-04-30 09:35:52 +01:00
rcourtman c6bcad255a Remove internal analytics from diagnostics 2026-04-30 09:23:40 +01:00
rcourtman d4896c8a9f Fix workloads filter action wrapping 2026-04-30 09:17:26 +01:00
rcourtman 5e8619eb58 Canonicalize Docker Podman management API copy 2026-04-30 09:13:04 +01:00
rcourtman 5091affb1b Canonicalize Docker Podman agent CLI copy 2026-04-30 09:04:25 +01:00
rcourtman e49745fa61 Canonicalize Docker Podman public docs 2026-04-30 00:29:20 +01:00
rcourtman e79764a0fd Canonicalize Docker Podman diagnostics copy 2026-04-30 00:27:10 +01:00
rcourtman b413a56d85 Canonicalize Docker Podman infrastructure copy 2026-04-30 00:20:59 +01:00
rcourtman c0558e8d5d Canonicalize Docker update settings copy 2026-04-30 00:08:15 +01:00
rcourtman cbc34e7302 Canonicalize Docker and Podman token copy 2026-04-30 00:04:35 +01:00
rcourtman 7b9389603a Align release docs with infrastructure landing 2026-04-29 23:49:17 +01:00
rcourtman 72fe17a5d9 Extend paid claim proof boundary 2026-04-29 23:40:32 +01:00
rcourtman d77e959fb9 Canonicalize settings data grid frames 2026-04-29 23:35:40 +01:00
rcourtman 65fe50ad5b Canonicalize remaining table shells 2026-04-29 23:15:12 +01:00
rcourtman 6138d1383a Align migration proof with retired trials 2026-04-29 22:50:11 +01:00
rcourtman ddc70d2c95 Canonicalize PMG drawer table shell 2026-04-29 20:52:14 +01:00