diff --git a/__LOCAL_LLMs/docs/DASHBOARD_REVIEW.md b/__LOCAL_LLMs/docs/DASHBOARD_REVIEW.md index ec631430..875e6602 100644 --- a/__LOCAL_LLMs/docs/DASHBOARD_REVIEW.md +++ b/__LOCAL_LLMs/docs/DASHBOARD_REVIEW.md @@ -23,22 +23,22 @@ ## 1. Bugs -- [ ] **B1. Hardcoded machine specs in header** — `page.tsx:317` +- [x] **B1. Hardcoded machine specs in header** — `page.tsx:317` Subtitle reads `Apple M4 Pro · 48 GB · {system?.platform}` — should use `system?.chip` and `formatBytes(system?.memory.total)` dynamically so it works on any machine. - [ ] **B2. Pull model blocks UI — no progress feedback** — `api/ollama/route.ts:84-92` `handlePull` calls Ollama with `stream: false`. Large models (20+ GB) block for 30+ minutes. The Next.js API route will likely timeout. Must use `stream: true` and pipe progress events to the client. _(Combined with F1.)_ -- [ ] **B3. Dead code: non-streaming `generate` action** — `api/ollama/route.ts:69-82` +- [x] **B3. Dead code: non-streaming `generate` action** — `api/ollama/route.ts:69-82` The `action === 'generate'` handler is unused — UI only uses `/api/ollama/stream`. Remove or keep as fallback with a comment. -- [ ] **B4. Escape key closes modal during active streaming** — `page.tsx:188-197` +- [x] **B4. Escape key closes modal during active streaming** — `page.tsx:188-197` Global `keydown` handler calls `setPromptModel(null)` unconditionally. Backdrop click correctly checks `!promptLoading`. Escape should also respect `promptLoading` to prevent discarding an in-flight response. -- [ ] **B5. Auto-refresh (15s) fires during streaming/pull** — `page.tsx:182-185` +- [x] **B5. Auto-refresh (15s) fires during streaming/pull** — `page.tsx:182-185` `setInterval(fetchAll, 15000)` runs unconditionally. During streaming this causes background churn and potential UI flicker. Should pause while `promptLoading` or `pullLoading` is true. -- [ ] **B6. Toast ID collision on HMR remount** — `page.tsx:156-159` +- [x] **B6. Toast ID collision on HMR remount** — `page.tsx:156-159` `toastId.current` resets to 0 on component remount during dev. Use `Date.now()` or `crypto.randomUUID()` for robust uniqueness. - [ ] **B7. vm_stat page size hardcoded** — `api/system/route.ts:103` @@ -47,13 +47,13 @@ - [ ] **B8. Whisper models dir not configurable** — `api/whisper/route.ts:24` Hardcoded to `~/whisper-models`. Should scan multiple known paths (`/opt/homebrew/share/whisper-cpp/models/`, `~/whisper-models`, `~/.cache/whisper/`) or accept `WHISPER_MODELS_DIR` env var. -- [ ] **B9. No AbortController for streaming fetch** — `page.tsx:250-289` +- [x] **B9. No AbortController for streaming fetch** — `page.tsx:250-289` Closing the prompt modal doesn't cancel the underlying fetch. The `reader.read()` loop continues in the background wasting CPU/bandwidth until the model finishes generating. -- [ ] **B10. Brew shows "Loading..." when array is empty** — `page.tsx:936-940` +- [x] **B10. Brew shows "Loading..." when array is empty** — `page.tsx:936-940` When `system.brewPackages` is `[]` (all uninstalled), displays "Loading..." instead of "No packages found". Needs to distinguish "still fetching" vs "fetched but empty". -- [ ] **B11. Prompt text not cleared on close without send** — `page.tsx:951-957` +- [x] **B11. Prompt text not cleared on close without send** — `page.tsx:951-957` Backdrop click clears `promptText`, but Escape handler (B4 fix) should also clear it. Otherwise stale text persists when re-opening. --- @@ -147,7 +147,7 @@ - [ ] **P3. `du -sk ~/.ollama/models` on every refresh** — `api/system/route.ts:41` Traverses entire models directory every 15 seconds. Cache with 60-second TTL. -- [ ] **P4. No fetch timeout on Ollama calls** — `api/ollama/route.ts:5-12` +- [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` @@ -172,17 +172,17 @@ ### Sprint 1 — Critical Bug Fixes _(est. 1–2 hrs)_ -| # | ID | Task | Effort | Commit | -| --- | --------- | ----------------------------------------- | ------ | ------ | -| 1 | - [ ] B4 | Guard Escape key during streaming | 5 min | | -| 2 | - [ ] B5 | Pause auto-refresh during prompt/pull | 10 min | | -| 3 | - [ ] B9 | Add AbortController to streaming fetch | 15 min | | -| 4 | - [ ] B1 | Dynamic chip/RAM in header | 5 min | | -| 5 | - [ ] B11 | Clear prompt text on Escape close | 5 min | | -| 6 | - [ ] P4 | Add timeout to Ollama fetch calls | 10 min | | -| 7 | - [ ] B3 | Remove dead generate action (or document) | 5 min | | -| 8 | - [ ] B6 | Use Date.now() for toast IDs | 2 min | | -| 9 | - [ ] B10 | Fix brew "Loading..." vs "empty" state | 5 min | | +| # | ID | Task | Effort | Commit | +| --- | --------- | ----------------------------------------- | ------ | --------- | +| 1 | - [x] B4 | Guard Escape key during streaming | 5 min | `2da67c2` | +| 2 | - [x] B5 | Pause auto-refresh during prompt/pull | 10 min | `2da67c2` | +| 3 | - [x] B9 | Add AbortController to streaming fetch | 15 min | `2da67c2` | +| 4 | - [x] B1 | Dynamic chip/RAM in header | 5 min | `2da67c2` | +| 5 | - [x] B11 | Clear prompt text on Escape close | 5 min | `2da67c2` | +| 6 | - [x] P4 | Add timeout to Ollama fetch calls | 10 min | `2da67c2` | +| 7 | - [x] B3 | Remove dead generate action (or document) | 5 min | `2da67c2` | +| 8 | - [x] B6 | Use Date.now() for toast IDs | 2 min | `2da67c2` | +| 9 | - [x] B10 | Fix brew "Loading..." vs "empty" state | 5 min | `2da67c2` | ### Sprint 2 — Pull Progress + Metrics _(est. 2–3 hrs)_ @@ -243,9 +243,9 @@ _Commits will be added here as work progresses._ -| # | Date | Commit | Sprint | Items Completed | -| --- | ---- | ------ | ------ | --------------- | -| 1 | | | | | +| # | Date | Commit | Sprint | Items Completed | +| --- | ------ | --------- | -------- | ------------------------------------ | +| 1 | Feb 19 | `2da67c2` | Sprint 1 | B1, B3, B4, B5, B6, B9, B10, B11, P4 | ---