The Rust backend emits {downloaded, total, phase, message} but the
Svelte component was reading event.payload.progress which doesn't
exist, resulting in NaN. Now calculates percentage from downloaded/total.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>