1107b723b1
Cleanup pass after the issue fixes (#64, #71, #80, #63): Simplifications: - sidebar.rs: extract `push_agent_row` closure to remove the duplicated two-line agent rendering (cached + progress-only paths used the same shape with different summary text). - engine.rs: replace `error_categories.iter().any(|c| c == X)` with `.contains(&X)` (clippy::manual_contains). - widgets/mod.rs: replace `for idx in menu_top..menu_bottom` index loop with `.iter().enumerate().take(menu_bottom).skip(menu_top)` (clippy::needless_range_loop). Build hygiene (CI runs `cargo clippy ... -- -D warnings`): - error_taxonomy.rs: per-item `#[allow(dead_code)]` on `ErrorSeverity`, `ErrorEnvelope`, and `ErrorEnvelope::new` with TODO notes referencing #66. Keeps deepseek's removal of the file-wide allow but stops the scaffold from breaking the build until #66 follows up. - app.rs: per-field `#[allow(dead_code)]` on `fancy_animations` (pending #61 footer animation consumer). - config/lib.rs: complete the OpenRouter/Novita variant scaffolding so `match ProviderKind { ... }` is exhaustive — add api_key/base_url env loading (`OPENROUTER_API_KEY`, `NOVITA_API_KEY`, optional `*_BASE_URL` overrides), wire `api_key_for` / `base_url_for` arms with the documented defaults, and extend `normalize_model_for_provider` so generic V4 model names map to each provider's catalog ID. Full /provider picker UI still pending #52. Verified: cargo fmt clean, cargo clippy --workspace --all-targets --all-features --locked -- -D warnings clean, full test suite passes (979 + adjacent crate tests).