You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: turn the frontend into a dashboard + add status/history/root API endpoints
The frontend was a single-review page and the backend's base URL 404'd, which
reads as "nothing is deployed" even on a healthy service. Both fixed.
Backend:
- GET / now returns a friendly service description (what it is, the endpoints,
the source) instead of 404 -- the base URL is what people paste first.
- GET /api/status: provider, model, config hash, and daily token budget, for
the dashboard's status bar. Degrades to nulls rather than 500 if the budget
store blips -- a status panel that can't render is worse than one showing
"unknown".
- GET /api/reviews: recent reviews, newest first, bounded 1..100 -- the history
view, a read over the same cache table reviews already land in. Added
ReviewCachePort.list_recent with SQLite + Postgres implementations.
- ReviewService gained display-only provider/model_label fields (never touch
review logic; the composition root fills them from Settings).
Frontend, now a dashboard:
- StatusBar: live backend-online / model / budget pills, polled every 15s.
- Process-log console: each SSE event rendered as a timestamped line ("what is
the agent doing right now"), autoscrolling -- the useReview hook now also
accumulates this human-readable log alongside the structured state.
- History panel: recent reviews from the API, each expandable to its findings,
refreshed automatically when a review completes.
- Two-column layout: run-a-review + live activity on the left, history on the
right.
Verified live in a real browser against the local backend: status bar showed
ollama / llama3.1:8b / 0-100k budget, ran python/mypy#21647 (cache hit), watched
the process log and 5 findings render with citations, confirmed history was
populated from the real Postgres cache. Four new API tests (root, status, empty-
then-populated history, limit cap); full suite green (the import-linter
subprocess test is blocked by a local Windows AppControl policy but passes in CI
and its contracts verify clean via the Python API).
0 commit comments