Commit Graph

808 Commits

Author SHA1 Message Date
axobase001 b476703a8d fix(npm): guard unsupported node during install (#1032) 2026-05-07 06:27:38 -05:00
axobase001 2644be9b52 fix(clear): reset session telemetry (#1047) 2026-05-07 06:26:43 -05:00
Hunter Bown 628fb3c4a8 feat(tui): support custom background color (#1034) 2026-05-07 06:15:58 -05:00
axobase001 dc3fef1346 fix(skills): follow symlinked skill directories (#1019) 2026-05-07 05:52:10 -05:00
axobase001 9327167e1d fix(engine): align stream idle timeout guard (#1012) 2026-05-07 05:42:24 -05:00
Hunter Bown f97604c3f0 fix(provider): enable OpenAI-compatible TUI runtime (#1017) 2026-05-07 05:32:15 -05:00
Hunter Bown f8d5fd84d7 ci: add nightly build artifacts (#1013) 2026-05-07 05:01:06 -05:00
Hunter Bown 3e2c832933 fix(api): narrow reasoning replay policy (#1009) 2026-05-07 04:45:55 -05:00
Hunter Bown 17a010aecc fix(doctor): explain strict tool mode endpoints (#1008) 2026-05-07 04:26:38 -05:00
Hunter Bown 323598e764 fix(api): harden strict tool schemas (#1005) 2026-05-07 04:12:22 -05:00
Hunter Bown c270ef81ef fix(tui): harden terminal resume and runtime context
Summary:
- Keep default auto alternate-screen mode inside the TUI so transcript scrolling stays app-owned unless users explicitly opt out.
- Queue terminal resume events when the engine channel is full, avoiding stranded paused terminal state after interactive tool cancellation or bursts.
- Scope crash-checkpoint recovery to the resolved launch workspace instead of the shell cwd.
- Add runtime deepseek_version to the prompt environment block so agents can distinguish installed runtime identity from a stale checkout.

Test plan:
- cargo test -p deepseek-tui --locked on a simulated merge with current main
- cargo fmt --all -- --check
- git diff --check
- Existing PR CI was green for lint, version drift, Linux/macOS/Windows tests, npm wrapper smoke, and GitGuardian.
2026-05-07 03:48:09 -05:00
Hunter Bown d2e9f58756 fix(config): persist cost currency from /config
Summary:
- Let /config cost_currency cny --save persist the setting.
- Show the live cost currency via /config cost_currency.
- Add cost currency to the interactive config document and apply path.
- Add regression tests for command persistence and config UI currency round-tripping.

Test plan:
- cargo test -p deepseek-tui config_command_cost_currency_save_persists_value --locked
- cargo test -p deepseek-tui build_document_reflects_cost_currency_from_settings --locked
- cargo test -p deepseek-tui session_only_apply_keeps_runtime_overrides_and_skips_reload --locked
- cargo fmt --all -- --check
- git diff --check

Supersedes #956. Fixes #932.
2026-05-07 03:46:02 -05:00
Hunter Bown 063d5d7d99 fix: prevent panic-prone edge cases
Summary:
- Use Reverse for job timestamp sorting to avoid negation overflow edge cases.
- Make secret redaction UTF-8 safe while preserving the previous short-secret threshold.
- Update remaining setup and doctor guidance to use the supported deepseek dispatcher name.

Test plan:
- cargo test -p deepseek-config list_values_redacts --locked
- cargo test -p deepseek-core --locked
- cargo test -p deepseek-tui doctor_endpoint_tests --locked
- cargo fmt --all -- --check
- git diff --check

Supersedes #957.
2026-05-07 03:37:50 -05:00
Hunter Bown 593ed2f900 fix(npm): preserve -v passthrough
Summary:
- Stop treating -v as an npm wrapper version fallback.
- Keep wrapper fallback for --version and -V.
- Add a Node regression test for wrapper version flag detection.

Test plan:
- npm test from npm/deepseek-tui
- git diff --check origin/main...HEAD

Supersedes #959.
2026-05-07 03:37:22 -05:00
Turisla dd822edcfc feat(tui): add jump-to-latest transcript button
Summary:
- Add a mouse-only jump-to-latest affordance when the transcript is scrolled away from the live tail.
- Hide the control at the tail or when mouse capture is disabled.
- Add tests for visibility and click behavior.

Maintainer verification on current origin/main:
- cargo test -p deepseek-tui jump_to_latest --locked
- cargo fmt --all -- --check
- git diff --check origin/main...HEAD

Closes #971
2026-05-07 03:23:53 -05:00
Friende 5e647e9946 fix(memory): truncate at UTF-8 char boundary
Summary:
- Truncate oversized memory prompt content at the previous valid UTF-8 character boundary.
- Preserve the existing memory cap and truncation marker behavior.
- Add regression coverage for accented and emoji content crossing the byte cutoff.

Maintainer verification on current origin/main:
- cargo test -p deepseek-tui memory --locked
- cargo fmt --all -- --check
- git diff --check origin/main...HEAD
2026-05-07 03:21:11 -05:00
jiaren wang 82b9e46254 fix(help): handle Ctrl+H as delete on some systems
Summary:
- Treat Ctrl+H as Backspace in the help overlay filter.
- Document the terminal erase behavior inline.
- Add regression coverage for the help filter widening after Ctrl+H.

Maintainer verification on current origin/main:
- cargo test -p deepseek-tui ctrl_h_widens_match_set --locked
- cargo fmt --all -- --check
- git diff --check origin/main...HEAD

Fixes #958
2026-05-07 03:18:22 -05:00
jiaren wang 630398288a fix(tui): clamp approval takeover on short terminals
Summary:
- Clamp approval takeover dimensions to the actual terminal area.
- Avoid zero-area approval rendering.
- Add regression coverage for the 162x17 crash size from #962.

Maintainer verification on current origin/main:
- cargo test -p deepseek-tui approval_takeover_clamps_to_short_terminal_height --locked
- cargo fmt --all -- --check
- git diff --check origin/main...HEAD

Fixes #962
2026-05-07 03:17:21 -05:00
Hunter Bown f685e5358e feat(models): surface DeepSeek alias retirement metadata
Summary:
- Add structured retirement metadata for deepseek-chat and deepseek-reasoner aliases.
- Keep aliases valid while reporting V4 Flash capability metadata and replacement guidance.
- Surface the warning in doctor human output and doctor JSON.

Test plan:
- cargo test -p deepseek-tui provider_capability_deepseek_chat_alias_has_v4_flash_caps_and_metadata --locked
- cargo test -p deepseek-tui provider_capability_deepseek_reasoner_alias_has_v4_flash_caps_and_metadata --locked
- cargo test -p deepseek-tui provider_capability_report_exposes_alias_deprecation_for_deepseek_chat --locked
- cargo test -p deepseek-tui provider_capability_report_leaves_canonical_flash_alias_metadata_null --locked
- cargo test -p deepseek-tui provider_capability_ --locked
- cargo test -p deepseek-tui doctor_endpoint_tests --locked
- cargo test -p deepseek-tui --locked
- cargo clippy -p deepseek-tui --all-targets --all-features --locked -- -D warnings
- cargo fmt --all -- --check
- git diff --check origin/main...HEAD

Closes #940
2026-05-07 03:15:50 -05:00
Hunter Bown 7f4a8f7b8d fix(session): recover interrupted user turns
Summary:
- Skip empty auto-created sessions when continuing a workspace.
- Recover a saved session ending in an unanswered user prompt as an editable draft instead of auto-resubmitting it.
- Preserved and repaired the local Qthresh poisoned session records by moving them to ~/.deepseek/sessions/recovery-backups/qthresh-2026-05-07-auto-poison.

Test plan:
- cargo test -p deepseek-tui latest_session_for_workspace_skips_empty_auto_created_session --locked
- cargo test -p deepseek-tui apply_loaded_session_restores_dangling_user_tail_as_retry_draft --locked
- cargo test -p deepseek-tui --locked
- cargo fmt --all -- --check
- git diff --check
- git diff --check origin/main...HEAD
- cargo clippy -p deepseek-tui --all-targets --all-features --locked -- -D warnings

Closes #988
2026-05-07 03:07:30 -05:00
Hunter Bown 4369410df7 fix(auth): show credential source table
## Summary
- show config, keyring, and env credential sources in deepseek auth status
- point env-only auth failures at auth status and auth set recovery commands
- document auth status and provider key precedence

## Test plan
- cargo test -p deepseek-tui-cli auth_ --locked
- cargo test -p deepseek-tui-cli --locked
- cargo test -p deepseek-tui env_only_auth_error_gets_recovery_hint --locked
- cargo test -p deepseek-config api_key --locked
- cargo test -p deepseek-config config_file_resolves_above_env_and_keyring --locked
- cargo test -p deepseek-config keyring_resolves_when_config_file_empty_even_if_env_is_set --locked
- cargo test -p deepseek-secrets --locked
- cargo fmt --all -- --check
- git diff --check
- cargo clippy -p deepseek-tui-cli -p deepseek-tui -p deepseek-secrets --all-targets --all-features --locked -- -D warnings

Closes #907
2026-05-07 02:55:55 -05:00
Hunter Bown cd75ef886a fix(release): make package-channel docs truthful
Closes #944\n\n## Summary\n- mark Docker/GHCR publishing as experimental while the package is not publicly readable\n- align installer and release docs with the live npm/Scoop state\n- keep package-channel verification explicit for release triage\n\n## Test plan\n- ruby -e 'require "yaml"; YAML.load_file(".github/workflows/release.yml"); puts "release.yml ok"'\n- cargo test -p deepseek-tui-cli update::tests::test_asset_matching_accepts_binary_assets_and_rejects_checksums --locked\n- cargo fmt --all -- --check\n- git diff --check origin/main...HEAD\n- CI: Version drift, Lint, Test (ubuntu-latest), Test (macos-latest), Test (windows-latest), npm wrapper smoke
2026-05-07 02:43:40 -05:00
Hunter Bown 018e47daa6 fix(cache): store turn metadata on user messages
Closes #934

Squashed from #951 after rebase onto current main, local verification, and green CI.
2026-05-07 02:30:05 -05:00
Hunter Bown 7396532e47 fix(tui): keep fixed-model auto thinking local
Closes #973

Squashed from #976 after local verification and green CI.
2026-05-07 01:52:08 -05:00
Hunter Bown b6509b10de fix(shell): explain Plan mode network sandbox failures
Closes #929

Squashed from #974 after local verification and green CI.
2026-05-07 01:51:59 -05:00
Hunter Bown 4f77c625fd fix(tui): forward-port v0.8.16 hotfix to main
Forward-port the v0.8.16 RLM/sub-agent hotfix onto main after tagging the release branch.
2026-05-07 00:04:31 -05:00
Hunter Bown c7ed05a07c feat(api): default DeepSeek to beta endpoint
Closes #941.\n\nRefs #938, #939, #940.
2026-05-06 21:24:59 -05:00
Hunter Bown 0ee298bd77 docs: update thanks and package-manager notes (#943) 2026-05-06 21:23:48 -05:00
Hunter Bown 0ee4c81ac0 fix(theme): auto-adapt palette for light terminals (#931)
Closes #899.

Detects light terminal profiles from COLORFGBG, keeps the existing dark theme as the fallback, and maps DeepSeek dark-palette cells to readable light surfaces in the existing ColorCompatBackend.

Local verification:
- cargo fmt --all -- --check
- cargo test -p deepseek-tui palette --all-features
- cargo test -p deepseek-tui color_compat --all-features
- cargo build

CI: all required checks passed on #931.
2026-05-06 20:55:30 -05:00
Hunter Bown ebcffaadf9 feat(compaction): add /anchor compaction facts (#930)
Integrates source PR #525 by @shentoumengxin.

Adds `/anchor` for critical user facts that should survive compaction via `.deepseek/anchors.md`. Keeps `/pin` unregistered so the resident-context `/pin` lane remains available, and renders anchors as structured bullets in compaction summaries instead of raw separator text.

Local verification:
- cargo fmt --all -- --check
- cargo test -p deepseek-tui anchor --all-features
- cargo build

CI: all required checks passed on #930.

Co-authored-by: ZZHAsus <3075047037@qq.com>
2026-05-06 20:45:22 -05:00
Hunter Bown 29d57c7518 ci(release): build linux artifacts natively (#928) 2026-05-06 20:34:05 -05:00
Hunter Bown ed5eb4f7c4 ci(release): bound zig download retries (#926) 2026-05-06 20:26:21 -05:00
Reid 78c415f40c feat(provider): add Ollama provider support (#921)
Source PR: #921 by @reidliu41.
Closes #908.

Local verification:
- cargo test --workspace --all-features ollama
- cargo fmt --all -- --check
- cargo build

Co-authored-by: reidliu41 <reid201711@gmail.com>
2026-05-06 20:16:46 -05:00
Hunter Bown 8a0a166b9c ci(release): retry zig install from fixed tarball (#925) 2026-05-06 20:10:32 -05:00
Hunter Bown da047c44ff feat(tui): notification_condition override + assistant text in OSC 9 body (#920)
* feat(tui): add `notification_condition` override + assistant text in body (#820)

`[notifications]` already controls method (auto/osc9/bel/off), the
`threshold_secs` gate, and the `include_summary` body. Some users
want a simpler high-level switch — "always notify on every turn" or
"never notify" — without having to know the lower-level fields.

This adds a single optional `[tui].notification_condition` field:

  - `"always"` — notify on every successful turn (no duration
    threshold). The configured `[notifications].method` and
    `include_summary` flag are still respected.
  - `"never"`  — suppress all turn-completion notifications.
  - omitted    — fall back to the existing `[notifications]` defaults
    (the v0.8.15 behavior is unchanged).

The OSC 9 / BEL body now also carries the assistant's reply text,
sanitized and truncated to 360 characters, with a fallback to the
latest assistant message in `api_messages` when the streaming buffer
was empty (e.g. a tool-only turn). When `include_summary = true`,
the elapsed/cost line is appended on a new line.

Drive-by: drop the unused `Method::from_str` helper (the new code
match-arms over the typed `NotificationMethod` enum, so the parser
helper had no remaining callers).

Differences from upstream #820:
- Keeps the `[notifications]` section in `config.example.toml`
  (with `notification_condition` documented as an opt-in override)
  rather than deleting the existing block. This avoids breaking
  configs that already set `[notifications].method` etc.
- Drops the unrelated `#[allow(dead_code)]` on
  `schema_migration::registry`.
- Threads `Option<CostEstimate>` through the helper (the cost
  surface changed from `Option<f64>` since #820 was authored).

Tests:
- `notification_settings_*` (3) — `always` keeps the configured
  method, `never` returns `None`, missing override falls back.
- `completed_turn_notification_*` (4) — streaming text wins, falls
  back to latest assistant message, default placeholder, and 360-char
  truncation with `...`.

Integrates #820.

Co-authored-by: zero <1603852@qq.com>
Co-authored-by: zerx-lab <161401688+zerx-lab@users.noreply.github.com>

* style: fmt — collapse short test message helper calls

---------

Co-authored-by: zero <1603852@qq.com>
Co-authored-by: zerx-lab <161401688+zerx-lab@users.noreply.github.com>
2026-05-06 19:29:02 -05:00
Hunter Bown 1dcb90760e feat(prompts): inject deterministic Environment block (#813) (#922)
Replace the model's first-message language detection with a
deterministic `## Environment` block at the top of the workspace-
static portion of the system prompt. The block lists:

  - lang: resolved BCP-47 tag (`en`, `zh-Hans`, `ja`, `pt-BR`)
  - platform: `std::env::consts::OS`
  - shell: `$SHELL` (or `unknown`)
  - pwd: workspace path

`base.md`'s `## Language` directive now points the model at the
`lang` field instead of asking it to guess from the user's first
turn. When `lang` is missing or ambiguous the existing detect-from-
writing fallback still applies.

The block is injected at "step 2.25" in the prompt builder — after
mode prompt + project context, before the configured `instructions`
files and the skills section — so it lives in the same workspace-
static cache layer as the surrounding blocks. All four inputs
(locale tag, platform, shell, pwd) are resolved once per session
and stay byte-stable across turns, preserving prefix-cache hits.

`render_environment_block` is intentionally I/O-free: callers pass
the resolved locale tag in `PromptSessionContext.locale_tag` /
`EngineConfig.locale_tag`. `resolve_locale(...)` is invoked once
when constructing the engine config in `tui::ui`, `runtime_threads`,
and `run_exec_agent`.

Tests:
- `render_environment_block_lists_supplied_locale_and_workspace`
- `environment_block_is_inserted_into_system_prompt`

Verified:
- `cargo test -p deepseek-tui --bin deepseek-tui` (2224 passed)
- `cargo test -p deepseek-tui-core --test snapshot --locked`
- `cargo clippy -p deepseek-tui --all-targets -- -D warnings`
- `cargo fmt --all -- --check`

Integrates #813.

Co-authored-by: lloydzhou <lloydzhou@qq.com>
2026-05-06 19:28:17 -05:00
Hunter Bown 4eaeae91b5 feat(fork): print confirmation with new session id (#600) (#919)
After `deepseek fork` saves the forked session, surface the source
session title and the truncated source/new session ids so the user
sees what was created before the TUI takes over the screen.

Implementation differs slightly from the original PR:
- Reuse the existing `session_manager::truncate_id` helper instead of
  defining a second copy in `main.rs`.
- Guard against an empty saved-title string so the line stays
  readable for unnamed sessions.

This is a UX-only addition that does not address the broader
`/fork` request from #576; that one is asking for an in-TUI fork
picker, which is out of scope for v0.8.15.

Integrates #600.

Co-authored-by: macworkers <Mann_Juarezxgs@cash4u.com>
2026-05-06 19:22:36 -05:00
Hunter Bown 1122bb0333 fix(command-safety): reject null bytes in shell commands (#706) (#918)
Null bytes embedded in command strings can be used to slip past
parsers that treat them as terminators while shells still see the
trailing payload. The existing analyzer already blocks `\n` / `\r`
multi-line input but lets `\0` through; add a matching dangerous
classification beside it.

This PR intentionally takes only the null-byte slice from #706. The
broader `command.contains("eval")` / `command.contains("exec ")`
guard from the same PR is *not* applied because it false-positives on
routine commands such as `cargo run -- eval` (the offline eval
harness) or any binary whose name contains `eval` (`evaluator.py`,
`primeval`). A regression test pins that behavior.

Tests:
- `test_null_byte_is_blocked` — `ls\0 -la` and `echo hello\0world`
  classified as Dangerous.
- `test_eval_substring_is_not_misclassified` — `cargo run --bin
  deepseek -- eval` and `python evaluator.py` are *not* Dangerous.

Integrates #706.

Co-authored-by: 浩淼的mac <haomiaodemac@haomiaodemacdeMacBook-Air.local>
2026-05-06 19:22:33 -05:00
Hunter Bown 785f5c625f docs: list deepseek update in README command tables (#838) (#917)
Surface the existing `deepseek update` self-update command in the
English and Chinese README command listings so users can discover it
without reading source. The `deepseek update` subcommand has shipped
since the dispatcher gained `crates/cli/src/update.rs`.

This integration takes only the README slice from #838. The startup
GitHub-Releases polling check from the same PR is intentionally
deferred until it can be made opt-in / config-backed without adding
unconditional network calls or perceptible startup latency.

Integrates #838.

Co-authored-by: leo119 <leo.hou0924@gmail.com>
2026-05-06 19:22:29 -05:00
Hunter Bown afe99f2b64 feat(runtime): add optional API token guard (#916)
Integrates #856 as a focused runtime API security slice.

Default local behavior remains unchanged. `/v1/*` routes require a token only when `--auth-token` or `DEEPSEEK_RUNTIME_TOKEN` is set, and `/health` remains public for readiness checks.

Co-authored-by: Zhuoran Deng <dengzhuoran9@gmail.com>
2026-05-06 18:37:36 -05:00
Hunter Bown 8ad007903b chore: update locked security dependencies (#915)
Integrates #879 safe lockfile dependency updates.

Regenerated the dependency bumps on current main so workspace crates stay on v0.8.15. The Dockerfile edits from #879 were intentionally left out because they pin stale Debian package versions and add an invalid trailing `MD []` instruction.

Co-authored-by: RinZ27 <222222878+RinZ27@users.noreply.github.com>
2026-05-06 18:27:50 -05:00
Hunter Bown 633092167c feat(config): support custom HTTP headers (#914)
Integrates the useful custom HTTP header support from #881 onto current main.

- support root, provider-specific, and DEEPSEEK_HTTP_HEADERS overrides
- apply validated extra headers to model API requests while preserving protected Authorization and Content-Type defaults
- document the config shape in README, config.example.toml, and docs/CONFIGURATION.md

Co-authored-by: Desheng <8596814+dst1213@users.noreply.github.com>
2026-05-06 18:13:18 -05:00
Hunter Bown 8b9590b82b feat(tui): polish transcript rendering (#912)
* feat(tui): polish transcript rendering

* fix(tui): satisfy transcript clippy lint
2026-05-06 18:09:42 -05:00
Hunter Bown 40ea89f6ce fix(tui): show tiny footer costs (#913) 2026-05-06 18:08:13 -05:00
Hunter Bown bea917a034 fix(tui): smooth footer wave animation
## Summary
- replace the footer spacer crest hops with a full-width phase-shifted wave
- update footer animation tests to assert repaint-cadence movement and multiple wave heights

## Test plan
- cargo fmt --all -- --check
- git diff --check
- cargo test -p deepseek-tui working_strip --all-features
- cargo test -p deepseek-tui footer --all-features
- PR CI: lint, Ubuntu/macOS/Windows tests, npm wrapper smoke, version drift, GitGuardian
2026-05-06 17:47:06 -05:00
YuanSheng Wang 8cf3745cd6 feat(tui): render markdown tables with borders
## Summary
- render markdown table groups with top, middle, and bottom box-drawing borders
- preserve separator rows as table structure instead of dropping them
- update markdown rendering tests for bordered tables

## Test plan
- cargo fmt --all -- --check
- git diff --check
- cargo test -p deepseek-tui table --all-features
2026-05-06 17:39:35 -05:00
Hunter Bown b59012e765 fix(tui): forward resize dimensions to ratatui viewport
@imakid reported on Windows PowerShell that clicking the OS restore
button (maximize → windowed) during a long task turns the entire
terminal black, unrecoverable until Ctrl+C. The "refreshing context"
chip in the footer indicates the freeze coincides with a compaction
summary call (engine state `CoherenceState::RefreshingContext`).

Hypothesis (no Windows dev box, awaiting @imakid confirmation):

* Symptom 1 — "transcript stops refreshing" — is the expected
  no-stream window during the side-channel compaction summary call.
  Tokens don't stream until the summary returns and the next assistant
  turn resumes. That's not a bug, but the UI doesn't currently surface
  the distinction well.

* Symptom 2 — "black screen on restore-from-maximized" — most likely
  comes from a Windows ConHost transient: `crossterm::terminal::size()`
  briefly returns stale (maximized) dimensions during the
  maximize→windowed transition, while the `Event::Resize(w, h)`
  payload itself already carries the correct post-restore size. The
  current handler does `terminal.clear() + terminal.draw()` and
  relies on ratatui's internal autoresize, which calls
  `crossterm::terminal::size()` — meaning we paint a frame sized to
  the stale dimensions into the post-restore viewport, leaving most
  of the visible area unpainted (the user-reported black screen).

The change forwards the event-reported `(w, h)` to ratatui via
`Terminal::resize(Rect)` before the clear+draw, so the viewport
commit always uses the OS-truthful new size regardless of whether
`crossterm::terminal::size()` has caught up. This is a defensive
change everywhere — the event payload is authoritative on every
platform — and it specifically addresses the Windows ConHost stale-
size race.

Also widens the resize tracing event to include `coherence_state`
and `use_alt_screen` so the next user bug report includes the
context we'd ask for in triage.

Tests
=====

`chat_widget_renders_cleanly_after_resize_during_refreshing_context`
pins the renderer-side invariant: a resize cycle that arrives while
`coherence_state == RefreshingContext` must produce non-empty frames
at every cycled width, and must not mutate the engine's
coherence_state. The actual fix lives in the event-handler size
forwarding; the test guards the renderer's no-empty-buffer contract
so a future regression that gates layout on coherence state would be
caught immediately.

What this PR does NOT change
============================

* No platform-specific code path. The fix is universal — passing the
  event-reported size to ratatui is correct everywhere; Windows just
  happens to be where the bug manifests today.
* No change to the freeze symptom directly. If symptom 1 is the
  expected compaction-summary no-stream window, the right
  follow-up is a UX cue ("compacting context, please hold") rather
  than a bugfix.

@imakid — please test by installing this branch:

    cargo install --git https://github.com/Hmbown/DeepSeek-TUI.git \\
        --branch fix/582-powershell-resize

Then run a long task, click the OS restore button mid-task, and
confirm whether the black-screen symptom is gone. If it still
reproduces, please run with `RUST_LOG=deepseek_tui=debug` and post
the resize lines from the log so we can see the dimensions
crossterm/ratatui actually saw.

Verification
============

* `cargo fmt --all -- --check` clean.
* `cargo clippy -p deepseek-tui --bin deepseek-tui --all-features
  --locked -- -D warnings` clean.
* `cargo test -p deepseek-tui --bin deepseek-tui --locked` →
  2029 passed, 2 ignored.

Refs #582.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 17:29:00 -05:00
Hunter Bown b4867b835d fix: smooth streaming and release UX slices
* fix(streaming): drip text grapheme by grapheme

* fix(snapshot): exclude generated artifacts by default

* fix(tui): fill panel and footer backgrounds
2026-05-06 17:23:02 -05:00
Hunter Bown ccb4662c2a fix(auth): recover keyring credentials into config (#909) 2026-05-06 16:59:35 -05:00
Hunter Bown 206e74fe13 Merge pull request #906 from Hmbown/fix/cli-print-error-chain
fix(cli): print full anyhow chain on error exit (#767)
2026-05-06 15:17:46 -05:00