Commit Graph

2202 Commits

Author SHA1 Message Date
rcourtman 73b4cf25c3 Add Patrol assessment Assistant handoff 2026-05-07 08:52:38 +01:00
rcourtman 812c86692d Route Assistant handoffs through model context 2026-05-07 03:00:58 +01:00
rcourtman adedc2ff09 Attach incident timeline briefings to Assistant 2026-05-07 02:24:05 +01:00
rcourtman af067372b6 Attach alert briefings to Assistant handoffs 2026-05-07 02:03:01 +01:00
rcourtman 3e2380d5b6 Show Patrol approval handoff briefings in Assistant 2026-05-07 01:53:40 +01:00
rcourtman f177d16545 Require approval mode for alert Assistant investigations 2026-05-07 01:15:06 +01:00
rcourtman b7df44e6ce Require approval mode for governed Patrol finding handoffs 2026-05-07 01:04:25 +01:00
rcourtman bebe9ca85b Keep Patrol plan handoffs command-free 2026-05-07 00:58:25 +01:00
rcourtman ba46a5c6e1 Keep Patrol approval handoffs command-free 2026-05-07 00:51:07 +01:00
rcourtman 990f9fbc21 Show live approval state in Assistant handoff 2026-05-07 00:23:27 +01:00
rcourtman cfa7483f09 Frame Patrol Assistant handoff for operators 2026-05-07 00:05:59 +01:00
rcourtman fc4928e1f2 Clarify paid Pulse Pro runtime install path 2026-05-06 21:52:50 +01:00
rcourtman e992eb43c1 Show Patrol record briefings in Assistant handoff 2026-05-06 17:20:59 +01:00
rcourtman b84fc2301a Surface paid runtime mismatch in licensing 2026-05-06 17:18:35 +01:00
rcourtman 87ba22b0fc Surface Patrol investigation records in Assistant context 2026-05-06 17:00:05 +01:00
rcourtman 75e3cb76fd Add structured Patrol investigation records 2026-05-06 16:31:51 +01:00
rcourtman 9569cfc785 Downplay infrastructure policy chips 2026-05-06 15:41:30 +01:00
rcourtman 1531f8cef4 Fix infrastructure resource badge stacking 2026-05-06 15:14:52 +01:00
rcourtman 4a981fe85d Refine availability probe row presentation
Refs #1460
2026-05-06 14:35:02 +01:00
rcourtman 66668a7f05 Keep availability target actions visible
Refs #1460
2026-05-06 14:33:31 +01:00
rcourtman 90fbafbc21 Surface availability probe evidence in infrastructure rows
Refs #1460
2026-05-06 14:22:35 +01:00
rcourtman 2f5aa20122 Add mock availability endpoint fixtures
Refs #1460
2026-05-06 14:08:03 +01:00
rcourtman d6ca8b12e6 Add agentless availability targets
Refs #1460
2026-05-06 10:35:34 +01:00
rcourtman 2f8e5184bd Remove navigation guide modal and reopen control
The four-step coachmark over the top tabs was a tour pretending to be
guidance: each step duplicated the tab title in one sentence, and the
Reopen control on /settings/system-general spawned a centered panel with
no spotlight target because the tabs only exist on dashboard routes.

Delete the modal, the localStorage dismissal key, the reopen event, the
Reopen row in General settings, and the matching guardrails so the
shared-primitives tests stop pinning the deleted owner split. Drop the
WhatsNew dismissal helpers and addInitScript bypasses from the
integration suite, and the dedicated tour test in
19-telemetry-disclosure.
2026-05-06 09:49:15 +01:00
rcourtman 3f16d7845a Improve Patrol header mobile controls 2026-05-05 15:14:43 +01:00
rcourtman 0c21f82f34 Clarify Agent Security docs entry 2026-05-05 15:13:27 +01:00
rcourtman d7225a45a0 Fix Proxmox guest memory fallbacks
Also fixes Ceph pool threshold resource identity.

Refs #1341
2026-05-05 14:59:29 +01:00
rcourtman c61ea4947a Make Proxmox onboarding API-first 2026-05-05 13:25:17 +01:00
rcourtman 81b31e4d3b Remove monitored-system volume caps
Retire runtime/API/UI monitored-system volume enforcement now that infrastructure monitoring is no longer capped.

Keep only legacy metadata scrubbing and purchase-start compatibility for old max_monitored_systems references.

Rename the remaining preview surface to monitored-system impact and make previews explanatory rather than save-blocking.

Update subsystem contracts and RA7 evidence for the caps-retired invariant.
2026-05-05 12:59:59 +01:00
rcourtman aa5472553f Fix Workloads empty state source detection
Refs #1456
2026-05-05 09:42:31 +01:00
rcourtman 2fa271bbe9 Fix storage primary issue impact handling
Refs #423
2026-05-04 18:42:09 +01:00
rcourtman 7956f8a968 Update mobile relay docs label 2026-05-04 08:30:02 +01:00
rcourtman db97478566 Reduce metrics rollup write amplification
Refs #1124
2026-05-03 21:43:20 +01:00
rcourtman 83f6296c94 Audit SSO entitlement and provider settings
Align internal license bridge tests with Community-tier SSO, harden SAML login method handling, and expose OIDC groups-claim configuration for provider restrictions and role mapping.

Refs #1449
2026-05-03 13:19:51 +01:00
rcourtman 82c54cc39b Make self-hosted SSO Community-tier
Treat OIDC, SAML, and multi-provider SSO as included Community capabilities while retaining advanced_sso as a compatibility key. Remove SAML-specific paywalls and paid-upgrade copy from runtime, settings UI, entitlement snapshots, docs, journey proof, and subsystem contracts.

Refs #1449
2026-05-03 12:48:01 +01:00
rcourtman 0e1cfd4574 Fix skip-auth login 401 handling 2026-05-03 09:17:26 +01:00
rcourtman 694e746a3b Fix storage summary responsiveness 2026-05-02 07:49:32 +01:00
rcourtman 7d7b83bf45 Fix header audit after Dashboard retirement 2026-05-01 20:40:36 +01:00
rcourtman df1a983540 Offset summary chart hover tooltips
Refs #1452
2026-05-01 20:28:12 +01:00
rcourtman 361f289485 Fix alert threshold metric coloring
Refs #1358
2026-05-01 20:28:12 +01:00
rcourtman 0273ab8456 Resolve RC3 issue follow-up candidates
Preserve the most severe Proxmox connection member state so offline members roll up correctly.

Move history-chart tooltips beside the hovered point when space allows and resolve PBS metric alerts against PBS thresholds during config reevaluation.

Refs #1441

Refs #1452

Refs https://github.com/rcourtman/Pulse/discussions/1448
2026-05-01 20:28:11 +01:00
rcourtman ef59055264 Raise frontend security dependency floors on v6
Bumps frontend-modern DOMPurify from ^3.4.0 / 3.4.0 to ^3.4.1 / 3.4.1 and PostCSS from ^8.4.0 / 8.5.6 to ^8.5.13 / 8.5.13.

Keeps pulse/v6-release aligned with the default-branch Dependabot fixes for GHSA-39q2-94rc-95cp and GHSA-qx2v-qp2m-jg93.

Verification: npm ci, npm audit --audit-level=moderate, npm run type-check, npm run build, npm run lint, status_audit.py --check, registry_audit.py --check from the canonical workspace. Full npm test remains red on origin/pulse/v6-release with the same targeted baseline failures unrelated to these dependency changes.
2026-05-01 20:23:03 +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 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 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 509852b28d Clarify workloads filter sections 2026-04-30 14:35:15 +01:00
rcourtman 1b04eb3d92 Fill workloads filter control row 2026-04-30 14:21:18 +01:00