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
{{ message }}
Repository navigation
Commit a024fea
Browse filesBrowse the repository at this point in the historyBrowse files
ADFA-4894 feat(dashboard): download control surface — paused phase + pause/resume/retry
The engine half of the download-control contract (ADFA-4893), on top of the resilient runners
already shipped in 1.2.3. The app-facing buttons land separately under ADFA-4896.
- jobs.ts: a 'paused' job phase + pause(id) / resume(id) / retry(id) on the durable engine, and a
shared classifyStop(ctx) so every runner treats pause vs cancel the same way. Pause stops the
runner but KEEPS the partial (the PAUSED-vs-CANCELLED distinction from the APK ADFA-5119); resume
re-launches (kiwix continues via --continue, books per item); retry re-runs an errored job.
resume/retry move the row to an ACTIVE phase before relaunch so completion/UI stay consistent.
- kiwix.exec / books.exec: on stop, keep the partial on pause and clean only on cancel.
- routes.ts: POST /:type/jobs/:id/{pause,resume,retry}, returning 409 when the verb doesn't apply.
- jobs.test.ts (npm run test:db — needs the native better-sqlite3 build): pause->paused,
resume->done, retry-from-error, and the out-of-phase no-ops.
Version 1.2.4. tsc --noEmit clean; default suite 79/79. Device-verified: pause keeps the partial
and resume continues via --continue from a non-zero %, the verbs return 409 out of phase, a paused
job survives a dash-node restart, and test:db passes 3/3 in the box.
Copy file name to clipboardExpand all lines: static/dashboard/CHANGELOG.md
+1Lines changed: 1 addition & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,6 +4,7 @@ One line per version, newest first. Every REST-facing change bumps the version i
4
4
(the app surfaces it via `/system/dashboard/update-check` and the "Update available" pill), so this
5
5
file is the human record of what each bump enables. Keep entries short: `version - change (TICKET)`.
6
6
7
+
-**1.2.4** - Download control surface (ADFA-4894, the engine half; app buttons land under ADFA-4896). Adds a **`paused`** job phase and `pause(id)` / `resume(id)` / `retry(id)` to the durable engine, exposed as `POST /:type/jobs/:id/{pause,resume,retry}`. Pause stops the runner but KEEPS the partial (resume continues via aria2 `--continue` for kiwix / per-item for books — the PAUSED-vs-CANCELLED distinction mirrors the APK ADFA-5119); retry re-runs an errored job. maps resume still restarts layers (no per-layer checkpoint yet → ADFA-4898). (ADFA-4894)
7
8
- **1.2.3-dev** - Resilient content downloads (ADFA-4894, Area 1 of the ADFA-4893 contract). A network drop mid-job recovers or fails cleanly instead of failing the whole batch at the first blip: a shared `withRetry` backoff helper; job cancel now aborts an in-flight `fetch` (new `AbortSignal` on the runner), not just child processes; **books** get a per-attempt timeout + per-item retry/backoff and no longer fail a batch on one dropped EPUB; **kiwix** prunes the partial `.zim` + `.aria2` on cancel (clean-on-cancel) and gains aria2 reconnect flags (`--max-tries`/`--retry-wait`/`--timeout`, documented divergence from the app's `--max-tries=1` outer-loop model). kiwix also gets an **outer** reconnect loop (`withRetry` around aria2) so a full Wi-Fi drop — where aria2 exits on DNS (code 19) and can't retry itself — recovers across the handoff, resuming via `--continue`; books' retry budget widened to ~30s to outlast a real reassociation. Maps per-layer checkpoint is pending the on-box `tile-extract.py`. Version stays `1.2.3-dev.N` through the PR (device-verified on -dev.1); final bump to `1.2.3` at merge. (ADFA-4894)
8
9
-**1.2.2** - New `GET /kolibri/subtree/:nodeId`: serves a channel's topic tree in Studio's `contentnode_tree` shape, with per-node byte sizes summed from the local content DB over each node's MPTT range, so the app browses an imported channel's whole tree offline (parsed by the same mapper it uses for Studio). Read-only; **404** when the channel's metadata is not imported, which the app reads as "fall back to Studio". Ships the endpoint PR added without a version bump. (ADFA-5094)
9
10
-**1.2.1** - Four Kolibri defects found by testing against a real device. `/kolibri/estimate` now reports free space (the call was missing the mandatory `?path=Content` and had been failing silently since it was written) and answers **409** with a readable message for a channel that is not installed, instead of letting Kolibri return a bare 500; `/kolibri/catalog` reports real sizes and resource counts (it was reading Studio's field names on an endpoint that uses Kolibri's); a failed import now carries the cause instead of just the exception class name. Also finishes the English pass: `routes.ts` was the last file the 1.1.6 sweep missed — REST-facing too, since one response string changes (`POST /credentials/kolibri` on 401). (ADFA-4954)
0 commit comments