Commit Graph

7386 Commits

Author SHA1 Message Date
rcourtman 4d5ee10ef7 Canonicalize command copy buttons 2026-06-12 18:02:23 +01:00
rcourtman c57993adb9 Canonicalize settings dialog close buttons 2026-06-12 17:48:28 +01:00
rcourtman ce2cc8948b Canonicalize compact settings row actions 2026-06-12 17:40:28 +01:00
rcourtman 60f153611b Broaden shared Button settings governance 2026-06-12 17:31:46 +01:00
rcourtman bbdd590a82 Register shared Button primitive governance 2026-06-12 17:13:29 +01:00
rcourtman 6d27522ce4 Broaden shared form select governance 2026-06-12 16:50:40 +01:00
rcourtman 6e81424a59 Register shared status indicator badge governance 2026-06-12 16:35:40 +01:00
rcourtman 9346d72516 Add subtle nested runtime cue 2026-06-12 16:25:08 +01:00
rcourtman 7b251f5651 Register shared toggle governance 2026-06-12 16:15:09 +01:00
rcourtman 4ccadb0b38 Register shared form textarea governance 2026-06-12 16:03:34 +01:00
rcourtman 21c79c898c Scope Docker drawer handoff by host 2026-06-12 15:54:29 +01:00
rcourtman 6ca91d47e6 Register shared form select governance 2026-06-12 15:46:56 +01:00
rcourtman 23e100e4c0 Show nested Docker context in LXC drawers 2026-06-12 15:36:42 +01:00
rcourtman 87e19f5101 Register shared status dot governance 2026-06-12 15:25:25 +01:00
rcourtman b4a3fb868d Register shared search control governance 2026-06-12 15:07:50 +01:00
rcourtman 527514fd85 Register table card shell governance 2026-06-12 14:51:14 +01:00
rcourtman 23e65040cc Register filter button group governance 2026-06-12 14:38:43 +01:00
rcourtman 36af6620d3 Register selection card group governance 2026-06-12 14:24:56 +01:00
rcourtman 52928706d9 Register column picker template governance 2026-06-12 14:17:33 +01:00
rcourtman 40af69bdb8 Register chart visibility toggle governance 2026-06-12 14:11:59 +01:00
rcourtman c5afa2e52f Register grouped table mode control governance 2026-06-12 14:06:19 +01:00
rcourtman 77134632e2 Register platform section tabs governance 2026-06-12 14:01:39 +01:00
rcourtman 51ac42870c Canonicalize platform error states 2026-06-12 13:52:53 +01:00
rcourtman 0109361296 Register platform loading template governance 2026-06-12 13:38:05 +01:00
rcourtman f90ae48814 Register FilterBar template governance 2026-06-12 13:29:25 +01:00
rcourtman 1e634709a2 Canonicalize platform table empty states 2026-06-12 13:08:40 +01:00
rcourtman 97bb7035d9 Canonicalize inline detail table rows 2026-06-12 12:55:56 +01:00
rcourtman 43bb0184ba Canonicalize node header web interface links 2026-06-12 12:31:31 +01:00
rcourtman ddb5bd5e1a Canonicalize Proxmox web interface links 2026-06-12 12:22:20 +01:00
rcourtman 2169d94b41 Canonicalize platform row detail toggles 2026-06-12 12:11:50 +01:00
rcourtman b179b1782c Stabilize Proxmox guest Docker inventory 2026-06-12 12:10:54 +01:00
rcourtman d221640086 Retire platform table frame allowlist 2026-06-12 11:36:18 +01:00
rcourtman 6dc931aac6 Migrate host tables onto PlatformTableShell 2026-06-12 11:07:14 +01:00
rcourtman eab067171c Clarify Proxmox Docker LXC host setup 2026-06-12 10:46:38 +01:00
rcourtman 048db1c91c Enforce shared template registry for platform tables 2026-06-12 10:44:11 +01:00
rcourtman 93420753aa Enforce shared templates for web interface links
Refs #1276
2026-06-12 10:06:01 +01:00
rcourtman 841100caa7 Clarify Proxmox LXC Docker install path 2026-06-12 09:57:58 +01:00
rcourtman fa62d7f986 Make Docker state column conditional 2026-06-12 09:31:31 +01:00
rcourtman 25a3755bfc Refine Docker container table signals 2026-06-12 09:27:36 +01:00
rcourtman f6a13341a0 Fix Docker container table overflow 2026-06-12 09:22:21 +01:00
rcourtman 9068f3bc6c history(drawer): restore sub-day ranges to the metrics history select
v5 drawers offered 1h/6h/12h history zoom; the v6 shared range list
started at 24 hours, so an operator investigating a spike from the last
hour got a day-wide chart. The backend chart range parser and the
HistoryTimeRange type already support the shorter windows; only the
shared HISTORY_CHART_RANGES list and the drawer labels were missing
them. StoragePoolDetail keeps its own narrower range list and is
unaffected. Flagged by the Machines page v5 parity audit; applies to
every drawer History tab.
2026-06-11 21:50:20 +01:00
rcourtman db842cb6b5 machines(table): restore v5 at-a-glance signals lost in the rebuild
The Machines page v5 parity audit (same lens as #1471 on the disks
table) found the rebuilt table dropped every threshold-aware signal v5
Hosts had, and the rebuild mislabeled one datum outright.

- Temperature cells render through the canonical TemperatureGauge
  (muted / amber >=70 / red >=80) like the Proxmox nodes table; v6 had
  been rendering plain neutral text, so a hot machine never stood out.
- CPU, memory, and disk bars receive per-resource alert thresholds via
  hostOverrideIdCandidates + alertsActivation, mirroring the
  Infrastructure host table; custom thresholds were ignored here.
- Network interface tooltips show cumulative RX/TX counters as bytes;
  they were formatted as rates (a 16-day total read as 1.46 GB/s).
- Temperature tooltip sections cap at six rows with a visible +N more
  marker instead of silently dropping readings (worst-first sort keeps
  the alarming ones); the section title flattening skips empty values.
- The memory bar passes the agent-reported reclaimable cache through,
  completing the used | cache | free split for machines.
2026-06-11 21:50:01 +01:00
rcourtman ff5a0b4957 memory(cache): extend the reclaimable split to standalone host agents
f62f35e24 restored the v5 used | cache | free memory split for Proxmox
nodes and guests, but standalone host agents still reported a flat
used/free pair, so the Machines page memory bar could not show the
reclaimable segment. Flagged by the Machines page v5 parity audit.

- Host agent reports cacheBytes (gopsutil Available minus Free); the
  ZFS ARC adjustment recomputes free so used + cache + free still
  covers the total.
- ApplyHostReport maps the field into models.Memory.Cache and clamps
  inconsistent or older-agent reports so used + cache never exceeds
  total.
- AgentMemoryMeta carries cache onto unified resources so the frontend
  agent payload exposes it.
- Mock generic hosts split a third of non-used pages as cache, and the
  node-linked host conversion now holds the invariant instead of
  stacking the node's cache on top of a recomputed free.
- Contracts: monitoring, unified-resources, and storage-recovery now
  document the split (also covering the f62f35e24 node/guest surface,
  which landed without contract deltas).
2026-06-11 21:47:30 +01:00
rcourtman d38b8a6d00 Preserve Docker container metadata in unified resources 2026-06-11 21:03:14 +01:00
rcourtman cc684ab689 Highlight Assistant code blocks once the turn settles (OpenCode parity)
OpenCode syntax-highlights code in the transcript; Pulse rendered
fenced blocks as flat text. Assistant answers are full of shell
commands, configs, and query output, so add highlight.js with an
infra grammar set (bash, json, yaml, ini, sql, dockerfile, nginx):

- Lazy-loaded into its own vendor-highlight chunk; the entry chunk
  stays clean and the chunk only downloads with the rest of the
  preloaded app shell.
- Highlighting runs over the sanitized DOM after the turn settles, so
  generated spans never pass through DOMPurify, streaming morphs are
  never fought, and the class allowlist stays closed to the model. The
  single carve-out is marked's fence-language hint, pattern-pinned to
  language-x on <code> only.
- Token palette maps hljs classes to theme colors readable on the
  dark prose-pre background both app themes share.

Per-block copy is intentionally not added: OpenCode has none, and the
answer-level copy already exists.
2026-06-11 20:58:17 +01:00
rcourtman db7679a984 Notify when the Assistant finishes or needs you while the tab is in the background
Assistant turns on slow routes run one to two-and-a-half minutes, and
operators tab away; OpenCode raises a desktop notification when a turn
completes, errors, asks a question, or waits on permission while the
terminal is blurred. Pulse now does the equivalent through the browser
Notification API behind an opt-in bell toggle in the drawer header:
enabling requests permission, a denial keeps the toggle off with
guidance, and the preference persists per browser.

Notifications fire only when the tab is hidden or unfocused, carry
fixed generic copy (OS notification centers persist text, so answers,
commands, and resource names never travel through them), coalesce per
kind, and click-to-focus. Dispatched once per stream event at the top
of processEvent, never inside store updaters.
2026-06-11 20:44:28 +01:00
rcourtman 34363bc181 docker(host-drawer): surface check-updates and update-all actions
v5 had 'Update All (N)' and per-host 'Check updates' one click away in
the Docker filter bar. The v6 rebuild moved those actions into the
generic resource drawer's docker-host section, but no surface in the
current IA mounts that drawer for a docker-host: the Docker page hosts
table uses DockerHostDrawer (counts only) and the Machines page does
not list container hosts. The actions were orphaned; the only way to
update containers was one row at a time.

Wire the existing useResourceDetailDrawerDockerActionsState hook into
the host drawer's Containers card: Check updates, Update all (N) with
confirm-click, queued-command status, and an updates-last-checked row.
Update all hides when the server disables Docker update actions and
disables while a host command is in flight or no updates are known.
2026-06-11 20:39:45 +01:00
rcourtman e12b7507e2 docker(drawer): unlock metrics history and container facts for app-containers
The resource drawer gated its History tab on type === 'agent', hiding
per-container CPU/memory/disk/IO charts even though the metrics store
records them and the charts API maps app-container to the
dockerContainer/docker store keys end-to-end (metrics_targets.go hands
out the raw container ID precisely so those records resolve). v5
charted every container; v6 charted none.

- Gate the History tab on a resolvable metrics target instead of the
  agent type. Resources without a target (images, volumes, networks)
  keep no tab.
- Return current-value fallback metrics for any resource, not just
  agents, so charts have a hint while the store fills.
- Add a Container section to the table-row summary: image, restart
  count (red above the v5 crash-loop threshold), created-at, compose
  project/service, and the full label set. All of it ships in the
  payload; none of it rendered anywhere after the v5 drawer was
  retired.
2026-06-11 20:39:28 +01:00
rcourtman 3c49dd2ee9 docker(tables): restore v5 information to the Docker page tables
The v6 Docker page regressed against its v5 ancestor (same disease as
the physical disks table, #1471): container CPU/memory flowed all the
way into the unified payload but no column rendered them, so a container
pegged at 75% CPU looked identical to an idle one. Labels (compose
project/service, traefik rules) and the Swarm stack name shipped in the
payload but were unrendered and unsearchable.

- Add always-visible CPU and Memory metric-bar columns to the containers
  table (ResponsiveMetricCell / StackedMemoryBar, same primitives as the
  hosts table above it).
- Flag crash-loopers: restart counts above 5 render red, matching the
  v5 threshold.
- Demote the Runtime column to mixed-runtime fleets only; it repeated
  host-level data on every container row (the #1471 Source-badge
  pattern) and the Host column sits right next to it.
- Add a Stack column to the Swarm services table, derived from the
  serialized stack field's canonical com.docker.stack.namespace label.
- Make container/service labels and stack names searchable via the
  Docker search haystack (v5 searched labels).
- Render volume Created as relative time with the absolute timestamp in
  the tooltip instead of a raw ISO 8601 string.
2026-06-11 20:39:05 +01:00
rcourtman 2fcf79f32a Stabilize mock broadcast freshness test
Refs Build and Test failures on pulse/v6-release.
2026-06-11 20:29:13 +01:00