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).
Adds first-class DeepSeek V4 Pro and Flash support, updates the default model to deepseek-v4-pro, aligns legacy aliases with the current V4 1M context behavior, and fixes thinking-mode request handling.
Key fixes:
- Send DeepSeek's raw Chat Completions `thinking` parameter at the top level instead of SDK-only `extra_body`.
- Preserve assistant `reasoning_content` for all prior thinking-mode tool-call turns so subsequent requests satisfy DeepSeek V4's replay requirement.
- Fix npm wrapper concurrent first-run downloads by using per-process temporary download paths.
- Add `.mailmap` so historical bot-attributed commits aggregate under Hunter Bown where mailmap is honored.
Verified with the full local Rust gate, live DeepSeek V4 smoke, npm wrapper temp-install smoke, and green PR CI across Linux, macOS, and Windows.
- Convert root to Cargo workspace with crates/ layout
- Add deepseek-* crates mirroring Codex architecture
- Add parity CI workflow with snapshot/protocol/state tests
- Update release workflow to build both deepseek and deepseek-tui binaries
- Bump version to 0.3.28