feat: Simple Dashboard - #205
Conversation
…ct gaps, mechanical scope gate
TestWireShape_EndpointsStatusResponse and TestWireShape_ModelsStatusResponse only pinned a subset of their structs' pre-existing fields, so a rename of last_model_sync, health_check, response_time, issues, type, family, size, params, quant or capabilities would pass silently. Seeded the fixture so the omitempty fields actually appear (non-zero ConsecutiveFailures, model Size, ModelDetails.Type) and pinned them. Also added the missing "url" pin to TestWireShape_StatusResponse, which had the same gap.
kind="breaker" and its CB status map were leftovers from the abandoned branch's circuit-breaker column, which never shipped in this branch. No caller passes kind, so the whole prop and its map were dead weight.
FR-4's per-endpoint model list, the per_endpoint tooltip data, and the breaker-not-wired-to-proxy-failures gap were all flagged in the spec as things to record here, but none had made it into the findings file.
README.md and verification.md still pointed at docs/spec/admin-dashboard.md, which doesn't exist in this repo, and cited WP numbers from the old spec that don't line up with this one. Pointed both at simple-dashboard.md and its actual section/work-package numbering, and corrected the If-None-Match note to describe the dormant conditional-GET machinery accurately instead of implying WP-2 wires it up.
build-web previously ran vite build then rm/cp/touch to move the output into internal/app/handlers/dashboard/dist, which only works with GNU coreutils. Vite now writes straight into that directory (emptyOutDir), and a writeBundle plugin restores the .gitkeep sentinel the empty wipes. Confirmed empirically that no .vite cache directory ever appeared in outDir, so the old rm -rf .../.vite line was vestigial and is dropped rather than ported.
Vite writes straight into the embed source now, so WEB_DIR/dist is never created and cleaning it was a no-op. Git Bash coreutils stay as they were - the maintainer runs make under Git Bash on Windows, so rm/touch here are a supported prerequisite, not a defect.
Endpoint names differing only in punctuation (node.a / node-a) both slugged to the same CSS-safe id, so the keyed each used a lossy, non-unique value as the row identity. Svelte throws each_key_duplicate in that case, and with no error boundary in the app the whole table body rendered zero rows instead of just the colliding ones. Key on the endpoint's exact name now; the slug is kept only for generating DOM ids. Decoupled the same way in ModelsPanel for consistency, since its flat fallback table has the identical shape.
OverviewPanel looked up the row by DOM id, but the generic row path in SortableTable never set an id on its <tr>, so the lookup always missed. The panel swap also unmounts OverviewPanel entirely, so the clicked button was gone by the time (or even if) the lookup had worked, leaving keyboard focus stranded on <body>. SortableTable now accepts an optional rowDomId to set the id (and a tabindex so it can receive focus) on jump-target rows. OverviewPanel awaits a tick for the panel swap to land before scrolling to the row and focusing it.
.goreleaser.yml's before.hooks run make build-web, which needs Node, but release.yml never installed it - ci.yml gained setup-node steps for the same reason and this workflow was simply missed. Today a tag release only works because ubuntu-latest happens to ship Node.
Records two things discovered while fixing the build-pipeline defects, neither introduced by this branch: main's pre-existing parse-time awk/sed/date calls in the makefile (acknowledged, not planned - Git Bash is a supported prerequisite), and the documented goreleaser Docker verification command lacking Node, Go and make alike. Also adds .github/workflows/release.yml to the mechanical scope gate's allowlist - it was an oversight that ci.yml was allowlisted but its release-pipeline equivalent wasn't, and this fix legitimately touches it for the same reason ci.yml needed setup-node.
groups and flatRecent both derive to empty arrays on a first-load failure (data stays null), so the panel fell through to "No models discovered yet" right alongside the error banner - reading as "the backends have no models" rather than "the request failed". Gate the empty-state copy on the store's hasData getter instead.
…rkaround Git Bash coreutils are a supported prerequisite per the maintainer, so the earlier wording overstated why the copy step went away. It's gone because writing straight into the embed source is fewer moving parts, same reasoning already applied to install-web/test-web/lint-web.
The ETag hash was widened to FNV-64 a few commits back but the docs still said 32-bit, and nobody had written down the new Cache-Control: private, no-cache header the status routes send on both 200 and 304.
… buildEndpointIDs
… unreleased section
…rding in the docs
…count outages in the accessible name
|
Important Review skippedToo many files! This PR contains 126 files, which is 26 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry. ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (10)
📒 Files selected for processing (126)
You can disable this status message by setting the Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
What started out as a 'simple front-end' for Olla has become a good exercise in making the backend more robust and APIs a bit more well rounded.
The UI is accesible at
/internal/uiand is written in Svelte 5 + TailwindCSS built embedded into the binary. This does mean thatgo installbreaks (and the UI shows an error status).This is still experimental and would need a few iterations to make it work well across the board.
Config
New configuration to enable it (by default it is):
UI
Gives you an overview of:
Changes
implements a lightweight, read-only dashboard for monitoring Olla at
/internal/ui/.