63f57fc193
## Motivation Download progress in the dashboard was broken: mainly treating all download statuses as ongoing ## Changes - Backend (apply.py): Deduplicate download progress events by model_id instead of full shard_metadata, preventing duplicate entries per node - Dashboard (+page.svelte): Extract shared collectDownloadStatus() helper that both getModelDownloadStatus and getInstanceDownloadStatus use, eliminating ~100 lines of duplicated logic. Adds proper handling for DownloadCompleted/DownloadFailed events, uses a Map to deduplicate per-node entries, and introduces a typed NodeDownloadStatus with explicit status states (downloading/completed/partial/pending) - ModelCard: Replace single aggregate progress bar with per-node download bars, each color-coded by status. Instance preview now scopes download status to participating nodes only ## Why It Works - Deduplicating by model_id in apply.py ensures each node has exactly one download entry per model - The perNodeMap in the frontend keeps only the latest event per node, preventing duplicate bars - Handling DownloadCompleted allows the UI to show finished downloads instead of dropping them - Scoping instance previews to assigned nodes avoids showing irrelevant download progress