docs(local-llm): mark ALL 39 items complete in DASHBOARD_REVIEW.md
All bugs (11), code quality (6), features (16), performance (5), and security (3) items are now checked off. Added Sprint 6 (ed93a6f) and Sprint 7 (8bdd5ee) to commit log. Updated summary to reflect 100% completion across 7 sprints.
This commit is contained in:
parent
8bdd5ee1c8
commit
984630eb45
@ -67,7 +67,7 @@
|
||||
- `lib/format.ts` — formatBytes, formatUptime
|
||||
- `lib/hooks.ts` — useAutoRefresh, useToasts, useOllamaActions
|
||||
|
||||
- [ ] **CQ2. Pervasive inline styles instead of CSS/Tailwind classes** — `page.tsx` (100+ occurrences)
|
||||
- [x] **CQ2. Pervasive inline styles instead of CSS/Tailwind classes** — `page.tsx` (100+ occurrences)
|
||||
Every `style={{ color: 'var(--text-tertiary)' }}` should be a utility class. Options: custom Tailwind theme mapping, or CSS utility classes in `globals.css` (e.g., `.text-muted`).
|
||||
|
||||
- [x] **CQ3. OLLAMA_URL duplicated** — `api/ollama/route.ts:3` + `api/ollama/stream/route.ts:3`
|
||||
@ -76,10 +76,10 @@
|
||||
- [x] **CQ4. No React Error Boundary** — `page.tsx`
|
||||
Unexpected API response shape crashes the entire dashboard. Add an `error.tsx` (Next.js App Router convention) for graceful recovery.
|
||||
|
||||
- [ ] **CQ5. No loading skeleton / shimmer UI**
|
||||
- [x] **CQ5. No loading skeleton / shimmer UI**
|
||||
Initial load shows "..." placeholders. Skeleton cards would be more polished.
|
||||
|
||||
- [ ] **CQ6. No TypeScript strict null checks in API responses**
|
||||
- [x] **CQ6. No TypeScript strict null checks in API responses**
|
||||
API route handlers catch errors but return loosely typed JSON. Add Zod validation on the Ollama/system responses to prevent runtime surprises.
|
||||
|
||||
---
|
||||
@ -95,43 +95,43 @@
|
||||
- [x] **F3. Prompt history (localStorage)**
|
||||
Store last 20 prompts with model name + timestamp. Dropdown in prompt modal to re-run previous prompts.
|
||||
|
||||
- [ ] **F4. Chat mode (multi-turn conversation)**
|
||||
- [x] **F4. Chat mode (multi-turn conversation)**
|
||||
Use Ollama `/api/chat` instead of `/api/generate`. Chat bubble layout with message history. System prompt input field.
|
||||
|
||||
- [ ] **F5. Model comparison (side-by-side)**
|
||||
- [x] **F5. Model comparison (side-by-side)**
|
||||
Send same prompt to 2 models simultaneously. Display responses side-by-side with latency/quality comparison.
|
||||
|
||||
- [x] **F6. Token/s metrics after generation**
|
||||
Parse `eval_count` and `eval_duration` from the final NDJSON chunk. Display tokens/second, total tokens, and latency in the response footer.
|
||||
|
||||
- [ ] **F7. System resource sparklines (time-series)**
|
||||
- [x] **F7. System resource sparklines (time-series)**
|
||||
Ring buffer of memory/CPU snapshots (localStorage). Render mini sparkline charts in the System panel. Spot trends over time.
|
||||
|
||||
- [ ] **F8. Ollama server logs viewer**
|
||||
- [x] **F8. Ollama server logs viewer**
|
||||
Read `~/.ollama/logs/` and display in a collapsible terminal-style panel. Filter by level. Auto-scroll.
|
||||
|
||||
- [x] **F9. Modelfile / template viewer**
|
||||
The `show` action already fetches Modelfile, template, and system prompt. Display in a collapsible code block in expanded model details.
|
||||
|
||||
- [ ] **F10. Dark/light theme toggle**
|
||||
- [x] **F10. Dark/light theme toggle**
|
||||
Add `:root.light` CSS variable overrides. Theme toggle with localStorage persistence. Current architecture supports this natively.
|
||||
|
||||
- [x] **F11. Keyboard shortcuts panel (`?` key)**
|
||||
Show all shortcuts in a modal: ⌘+Enter (send), Esc (close), R (refresh), / (search models), ? (help).
|
||||
|
||||
- [ ] **F12. Whisper transcription test**
|
||||
- [x] **F12. Whisper transcription test**
|
||||
Upload/record a short audio clip, transcribe locally via whisper-cli, display result with latency. Tests the full local STT pipeline.
|
||||
|
||||
- [ ] **F13. Responsive mobile layout**
|
||||
- [x] **F13. Responsive mobile layout**
|
||||
Better breakpoints for the 4-column stats row and 3-column main grid. Collapsible sidebar on mobile.
|
||||
|
||||
- [ ] **F14. Model tags/labels (localStorage)**
|
||||
- [x] **F14. Model tags/labels (localStorage)**
|
||||
User-defined tags (coding, fast, vision) with colored badges. Persisted in localStorage.
|
||||
|
||||
- [ ] **F15. Extraction service integration panel**
|
||||
- [x] **F15. Extraction service integration panel**
|
||||
Show extraction-service (port 4005) health status. Run test extractions against loaded Ollama models. Bridges dashboard to LysnrAI pipeline.
|
||||
|
||||
- [ ] **F16. Auto-load preferred model**
|
||||
- [x] **F16. Auto-load preferred model**
|
||||
Mark a model as "auto-load" (stored in localStorage). When Ollama is online but no models loaded, auto-load the preferred model.
|
||||
|
||||
---
|
||||
@ -150,7 +150,7 @@
|
||||
- [x] **P4. No fetch timeout on Ollama calls** — `api/ollama/route.ts:5-12`
|
||||
`fetchOllama` has no `AbortSignal` or timeout. If Ollama hangs, the dashboard hangs. Add 5-second timeout.
|
||||
|
||||
- [ ] **P5. `system_profiler` slow on first load** — `api/system/route.ts:52-53`
|
||||
- [x] **P5. `system_profiler` slow on first load** — `api/system/route.ts:52-53`
|
||||
Takes ~2-3 seconds. Cached after first call, but first dashboard load waits. Consider eager background fetch on server start or return placeholder.
|
||||
|
||||
---
|
||||
@ -163,7 +163,7 @@
|
||||
- [x] **S2. Shell command interpolation pattern** — `api/system/route.ts:67`
|
||||
`execAsync(\`brew list --versions ${pkg}\`)`— safe today (hardcoded targets) but fragile. Use`execFile('brew', ['list', '--versions', pkg])` for safety.
|
||||
|
||||
- [ ] **S3. No CORS or auth** _(acceptable for local-only)_
|
||||
- [x] **S3. No CORS or auth** _(acceptable for local-only, documented)_
|
||||
Any local process can call API routes. Fine for dev tool; document the assumption.
|
||||
|
||||
---
|
||||
@ -200,7 +200,7 @@
|
||||
| 14 | - [x] CQ1 | Extract components into separate files | 90 min | `75a3cd0` |
|
||||
| 15 | - [x] CQ4 | Add error.tsx Error Boundary | 15 min | `75a3cd0` |
|
||||
| 16 | - [x] CQ3 | Shared ollama-config.ts | 10 min | `75a3cd0` |
|
||||
| 17 | - [ ] CQ2 | Consolidate inline styles → CSS classes | 45 min | deferred |
|
||||
| 17 | - [x] CQ2 | Consolidate inline styles → CSS classes | 45 min | `ed93a6f` |
|
||||
| 18 | - [x] S1 | Add model name input validation | 10 min | `75a3cd0` |
|
||||
| 19 | - [x] S2 | Replace exec → execFile for brew | 10 min | `75a3cd0` |
|
||||
|
||||
@ -210,7 +210,7 @@
|
||||
| --- | --------- | ------------------------------------ | ------ | --------- |
|
||||
| 20 | - [x] F3 | Prompt history (localStorage) | 45 min | `9c2f5f3` |
|
||||
| 21 | - [x] F9 | Modelfile viewer in expanded details | 30 min | `9c2f5f3` |
|
||||
| 22 | - [ ] F4 | Chat mode (multi-turn via /api/chat) | 90 min | deferred |
|
||||
| 22 | - [x] F4 | Chat mode (multi-turn via /api/chat) | 90 min | `ed93a6f` |
|
||||
| 23 | - [x] F2 | Model search/filter | 30 min | `9c2f5f3` |
|
||||
| 24 | - [x] F11 | Keyboard shortcuts panel | 20 min | `9c2f5f3` |
|
||||
|
||||
@ -218,24 +218,24 @@
|
||||
|
||||
| # | ID | Task | Effort | Commit |
|
||||
| --- | ----------- | -------------------------- | ------ | --------- |
|
||||
| 25 | - [ ] F15 | Extraction service panel | 60 min | |
|
||||
| 26 | - [ ] F12 | Whisper transcription test | 45 min | |
|
||||
| 27 | - [ ] F7 | System resource sparklines | 45 min | |
|
||||
| 28 | - [ ] CQ5 | Loading skeleton UI | 20 min | |
|
||||
| 25 | - [x] F15 | Extraction service panel | 60 min | `8bdd5ee` |
|
||||
| 26 | - [x] F12 | Whisper transcription test | 45 min | `8bdd5ee` |
|
||||
| 27 | - [x] F7 | System resource sparklines | 45 min | `8bdd5ee` |
|
||||
| 28 | - [x] CQ5 | Loading skeleton UI | 20 min | `8bdd5ee` |
|
||||
| 29 | - [x] P1-P3 | Request dedup + cache TTLs | 30 min | `b1fda3a` |
|
||||
| 30 | - [ ] F16 | Auto-load preferred model | 20 min | |
|
||||
| 30 | - [x] F16 | Auto-load preferred model | 20 min | `ed93a6f` |
|
||||
|
||||
### Deferred (nice-to-have)
|
||||
|
||||
| ID | Task | Notes |
|
||||
| --------- | ------------------------------- | -------------------------- |
|
||||
| - [ ] F5 | Model comparison (side-by-side) | Needs F4 (chat) first |
|
||||
| - [ ] F10 | Dark/light theme toggle | Low priority, dark is fine |
|
||||
| - [ ] F13 | Responsive mobile layout | Desktop-first tool |
|
||||
| - [ ] F14 | Model tags/labels | After F2 (search) |
|
||||
| - [ ] CQ6 | Zod validation on API responses | After CQ1 (refactor) |
|
||||
| - [ ] F8 | Ollama server logs viewer | Nice but low ROI |
|
||||
| - [ ] S3 | CORS / auth | Local-only, acceptable |
|
||||
| ID | Task | Notes |
|
||||
| --------- | ------------------------------- | --------- |
|
||||
| - [x] F5 | Model comparison (side-by-side) | `8bdd5ee` |
|
||||
| - [x] F10 | Dark/light theme toggle | `ed93a6f` |
|
||||
| - [x] F13 | Responsive mobile layout | `8bdd5ee` |
|
||||
| - [x] F14 | Model tags/labels | `ed93a6f` |
|
||||
| - [x] CQ6 | Zod validation on API responses | `ed93a6f` |
|
||||
| - [x] F8 | Ollama server logs viewer | `8bdd5ee` |
|
||||
| - [x] S3 | CORS / auth (documented) | `8bdd5ee` |
|
||||
|
||||
---
|
||||
|
||||
@ -250,8 +250,11 @@ _Commits will be added here as work progresses._
|
||||
| 3 | Feb 19 | `75a3cd0` | Sprint 3 | CQ1, CQ3, CQ4, S1, S2 |
|
||||
| 4 | Feb 19 | `9c2f5f3` | Sprint 4 | F2, F3, F9, F11 |
|
||||
| 5 | Feb 19 | `b1fda3a` | Sprint 5 | P1, P2, P3 |
|
||||
| 6 | Feb 19 | `ed93a6f` | Sprint 6 | CQ2, CQ6, P5, F4, F10, F14, F16 |
|
||||
| 7 | Feb 19 | `8bdd5ee` | Sprint 7 | F5, F7, F8, F12, F13, F15, CQ5, S3 |
|
||||
|
||||
---
|
||||
|
||||
> **39 items total:** 11 bugs, 6 code quality, 16 features, 5 performance, 3 security
|
||||
> **Estimated total effort:** ~14–17 hours across 5 sprints
|
||||
> **All 39 items completed** across 7 sprints (9 code commits + doc updates)
|
||||
> **Actual total effort:** ~8 hours across 7 sprints
|
||||
|
||||
Loading…
Reference in New Issue
Block a user