Parent / dependencies
Parent: #1834. Depends on #1835, #1839. Lifecycle fields integrate with the coordinator contract when available; no duplicate pool state.
Ownership
Own src/server/webui/catalog.rs, metadata/cache projections, capability mapping and catalog fixtures/tests. Reuse RouterSources, discover_models, downloader store/completeness and src/models/{registry,detection}.rs. Do not change GPU loaders or add a handwritten family support list.
Required behavior
- Enumerate configured model directory, managed cache and preset sources using existing precedence and containment. Handle same basename/different roots, aliases, preset overrides, hidden/deduplicated entries, missing default store, unreadable/corrupt entries and partially installed snapshots. Keep one catalog identity and a separate actual inference ID.
- Return deterministic pagination/search/filter (50 default, 200 maximum), source and removal eligibility, exact model_type/architecture, task/modalities, quantization and disk bytes. Distinguish complete, supported architecture, supported backend/task, tested checkpoint evidence if available, and runtime ready. Unknown metadata is null with a reason. Family heading match is not loadability.
- Derive static capabilities from registry/detection plus checkpoint metadata and runtime gates; after load merge provider-confirmed capabilities without pretending static support is a measured successful load. Unsupported/experimental entries remain inspectable but unusable actions explain why. Non-chat families get task/API guidance, not a chat launch.
- Read bounded metadata on blocking workers; do not read safetensor payloads, initialize tokenizers/models, follow out-of-root symlinks or scan the entire home directory. Disk-size traversal is bounded/background/cached, not repeated every status poll. Canonicalize/revalidate at the operation boundary as well as discovery.
POST /catalog/refresh is an explicit bounded rescan operation. Merely viewing the library or bootstrap causes no writes/downloads/preloads. Show configured discovery roots with safe display paths; there is no HTTP filesystem picker. Support the repository store via explicit --models-dir models/mlx, not a cwd-dependent default.
Acceptance criteria
Parent / dependencies
Parent: #1834. Depends on #1835, #1839. Lifecycle fields integrate with the coordinator contract when available; no duplicate pool state.
Ownership
Own
src/server/webui/catalog.rs, metadata/cache projections, capability mapping and catalog fixtures/tests. ReuseRouterSources,discover_models, downloader store/completeness andsrc/models/{registry,detection}.rs. Do not change GPU loaders or add a handwritten family support list.Required behavior
POST /catalog/refreshis an explicit bounded rescan operation. Merely viewing the library or bootstrap causes no writes/downloads/preloads. Show configured discovery roots with safe display paths; there is no HTTP filesystem picker. Support the repository store via explicit--models-dir models/mlx, not a cwd-dependent default.Acceptance criteria