Full audit of every route and response shape in server.c against
docs/API.md, cross-checked with the original flatz implementation
(downloaded and diffed format string by format string). The code is
byte-compatible with the original; the docs were not:
- get_task_progress: lengths/counters/percent are unquoted JSON
numbers (0x1A2B3C00, 120, 100), not strings
- is_exists: 'size' is an unquoted hex number
- error_code in failure bodies is an unquoted hex number
- document the 'GET /' alias of /api/v2/system
- clarify the is_exists / progress notes accordingly
No code changes — the implementation already matches the original
wire format exactly.
The v2 job-op endpoints were documented (README, docs/API.md) as POST
but route() only dispatched them under GET/HEAD, so POST fell through
to 404. Clients had to work around it by falling back to GET.
- dispatch POST /api/v2/jobs/<id>/<op> to handle_v2_job_op()
- keep GET on the same paths routed (backward compatibility with
clients written against <= 0.0.2) and document that in API.md
No handler changes: pause/resume/stop semantics are unchanged.
* feat(icon): add pkg icon loader with vendored stb_image
* feat(installer,taskman): track app version, content type and piece count
* feat(ui): pkg icons, version and expandable details on transfer cards
* feat(api,docs): expose pkg metadata in v2 jobs