feat: downloads pane in footer with pull job tracking#1165
Merged
Conversation
…e actions
- Add downloads tab to footer pane (journal | downloads tabs)
- Auto-expand footer + switch to downloads on hal0:pull-started event
- Download rows with state indicators (running/queued/completed/failed/cancelled)
- Progress bar with speed/ETA for running downloads
- Cancel/retry/clear actions per download state
- Empty state with link to models page
- usePullsList hook: polls GET /api/models/pulls every 2s
- useClearPullJob hook: DELETE /api/models/pulls/{id}
- New endpoints: pulls, pullsDelete
- CSS: foot-tabs, foot-tab, foot-downloads, foot-dl-row, foot-dl-state, foot-dl-bar, foot-dl-empty
- Animated spinner for running state
- Backend: GET /api/models/pulls, DELETE /api/models/pulls/{id} routes
- Backend: PullJob registry model with state tracking
…_persisted_jobs(), pull-started event
- Added GET /api/models/pulls endpoint: returns all pull jobs (active in-memory +
persisted terminal from disk). Dedup: in-memory wins over disk. Entry shape
includes model_id, job_id, state, bytes_downloaded, bytes_total, speed_bps,
eta_s, hf_repo (from model registry), dest_path, error, started_at, finished_at.
- Added DELETE /api/models/pulls/{model_id} endpoint: clears terminal pull
jobs from memory + disk. Returns 409 if job is still active.
- Added list_persisted_jobs() helper to src/hal0/registry/pull.py: reads all
.json files from _pull_jobs_dir() and returns a list of dicts.
- Added usePullsList and useClearPullJob hooks in useModels.ts.
- In usePullJob, dispatch hal0:pull-started custom event when start() succeeds
(before SSE stream), so the downloads pane can react.
- Added modelPulls and modelPullDelete to the endpoints catalogue.
- All existing tests pass, frontend builds cleanly.
- PullJob interface: snake_case fields match API response (job_id, hf_repo, dest_path, bytes_downloaded, bytes_total, started_at, finished_at) - chrome.jsx: fix field references, compute pct client-side, add calculating… fallback when speed is 0, fix clear uses model_id - Backend: filter persisted jobs to terminal states only, DELETE returns 204 - Review fixes: all critical spec review issues resolved
Move the documents list out of the two-column grid so it spans the
full container width, matching the other full-width sections
(operations, danger zone). The four tool cards above it (reflect,
recall, directives, mental models) stay in a 2×2 grid with equal
heights via flex:1.
- Restructure MemToolsPanel: left column = reflect + recall,
right column = directives + mental models
- Documents rendered as a full-width sibling below the grid
- Add .mt-col > .mt-card { flex: 1 } for equal card heights
- Add margin-top spacing for the now-sibling documents card
ff27024 to
15286ec
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds a Downloads tab to the footer pane for tracking model download progress, with history of completed/failed/cancelled pulls.
Backend
GET /api/models/pulls— merged list of active (in-memory) + terminal (persisted) jobsDELETE /api/models/pulls/{model_id}— clear terminal jobs (409 if active)list_persisted_jobs()helper to read persisted JSON job snapshotshal0:pull-startedcustom event dispatched fromusePullJobfor auto-expandFrontend
usePullsListhook with 2s polling (gated on footer visibility)Design
docs/superpowers/specs/2026-07-08-downloads-pane-design.md