返回 DeepSeek-TUI-2026
CHANGELOG.md
根目录 / CHANGELOG.md
1 # Changelog
2
3 All notable changes to this project will be documented in this file.
4
5 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
8 ## [0.8.15] - 2026-05-06
9
10 An auth, Windows, editor-integration, and setup stabilization release. This
11 release keeps the existing DeepSeek V4 architecture intact while landing small
12 community fixes that make first-run setup, terminal behavior, skills, cost
13 display, and recovery paths easier to trust.
14
15 ### Added
16 - **ACP stdio adapter for Zed/custom agents** (#782) — `deepseek serve --acp`
17 starts a local Agent Client Protocol server over stdio. The first slice
18 supports new sessions and prompt responses through the user's existing
19 DeepSeek config/API key; tool-backed editing and checkpoint replay remain
20 outside the ACP surface for now.
21 - **Yuan/CNY cost display** (#806) — `cost_currency = "cny"` (also accepts
22 `yuan` / `rmb`) switches footer, context panel, `/cost`, `/tokens`, and
23 long-turn notification summaries from USD to CNY.
24 - **Slash autocomplete for skills** (#808) — installed skills are visible in
25 the slash-command autocomplete menu.
26 - **`/rename` session titles** (#836) — sessions can be renamed without
27 editing save files manually.
28
29 ### Changed
30 - **Current local date in turn metadata** (#893, closes #865) — real user turns
31 now include the current local date in `<turn_meta>`, without changing the
32 stable system prompt/cache prefix.
33 - **Doctor endpoint diagnostics** (#823) — `deepseek doctor` shows the resolved
34 provider/API endpoint to make proxy, China endpoint, and inherited-env
35 debugging more concrete.
36 - **More conservative request sizing** (#826) — API requests cap `max_tokens`
37 against the active model/context budget before dispatch.
38 - **Safer config and secret file writes** (#833, #837) — generated config files
39 use restrictive permissions and improved secret redaction.
40
41 ### Fixed
42 - **Env-only API key failure recovery** (#892) — runtime auth failures now say
43 when the rejected key came from inherited `DEEPSEEK_API_KEY` and no saved
44 config key is present, matching the clearer `deepseek doctor` guidance.
45 - **Windows Unicode output** (#887, closes #872) — TUI startup now best-effort
46 switches the Windows console input/output codepages to UTF-8, improving
47 Chinese and other non-ASCII rendering.
48 - **Windows resume picker** (#886, closes #866) — the dispatcher keeps the
49 resume picker path on Windows instead of bypassing it.
50 - **Windows clipboard fallback** (#850) — copy operations have a fallback path
51 when the primary clipboard backend is unavailable.
52 - **Workspace trust persistence** (#870) — approval/trust choices persist in
53 global config instead of surprising users on the next launch.
54 - **Ctrl+E composer behavior** (#883, closes #876) — plain Ctrl+E moves to the
55 end of the composer again; file-tree toggling moved to the shifted shortcut.
56 - **Plain Markdown skills** (#869) — `SKILL.md` files without frontmatter now
57 fall back to the first `# Heading` instead of being ignored.
58 - **Workspace-scoped latest resume** (#830, closes #779) — `resume --last`,
59 `--continue`, and fork/resume helpers choose the latest session for the
60 current workspace/repo rather than the newest saved session globally.
61 - **Npm wrapper version fallback** (#885) — `deepseek --version` / `-v` can
62 report the package version when the native binary has not been downloaded
63 yet.
64 - **TUI exit resume hint** (#863, closes #682) — exiting the TUI now points
65 users toward the relevant resume command.
66 - **Startup and terminal reliability** — includes bounded stream-open waits
67 (#847), cursor-lag reduction for `@` mentions (#849), OSC52 clipboard fallback
68 for SSH (#845), legacy Ctrl+V paste recognition (#786), Windows mouse capture
69 defaulting off (#785), and UTF-8-preserving ANSI stripping (#784).
70 - **Install and policy reliability** — avoids unstable Rust file-locking APIs
71 (#821), enforces network policy in `web_run` (#800), fixes repeated setup
72 language prompts after API-key setup (#844), and explains dispatcher TUI spawn
73 failures (#853).
74 - **Workspace safety** — refuses dangerous snapshots for `$HOME` or unsafe
75 workspaces (#798, #804), fixes path-escape false positives for double-dots in
76 names (#824), scopes snapshot built-in excludes (#854), and replaces provider
77 `unreachable!()` paths with proper errors (#835).
78 - **Skills discovery** — recursively reads the skills directory (#811), ignores
79 symlinks outside the selected install root (#814), discovers global Agents
80 skills (#848), and includes `.cursor/skills` (#817).
81 - **Provider/model compatibility** — restores auto model routing (#772),
82 completes vLLM provider integration (#737), accepts provider-prefixed DeepSeek
83 model IDs (#794), preserves requested model ID casing (#733), and pins RLM
84 child calls to Flash (#832).
85
86 ### Thanks
87 - Thanks to [@reidliu41](https://github.com/reidliu41) for the resume hint and
88 workspace trust fixes (#863, #870).
89 - Thanks to [@Oliver-ZPLiu](https://github.com/Oliver-ZPLiu) for the Windows
90 clipboard fallback (#850).
91 - Thanks to [@xieshutao](https://github.com/xieshutao) for the plain Markdown
92 skill fallback (#869).
93 - Thanks to [@GK012](https://github.com/GK012) for the npm wrapper version
94 fallback (#885).
95 - Thanks to everyone filing Windows, Chinese-language setup, auth, and
96 first-run reports. Those concrete reproductions shaped the release.
97
98 ## [0.8.13] - 2026-05-05
99
100 A stabilization release for DeepSeek V4 runtime and TUI reliability. The
101 v0.8.13 milestone was narrowed to direct runtime/TUI fixes; prompt hygiene,
102 trajectory logging, Anthropic-wire support, and larger UI cleanup were moved
103 out of this release.
104
105 ### Added
106 - **No-LLM tool-result prune before compaction** (#710) — old verbose tool
107 results are mechanically summarized before the paid summary pass. Duplicate
108 reads keep the freshest full body and replace older copies with one-line
109 summaries; if that gets the session back under the compaction threshold, the
110 LLM summary call is skipped entirely.
111 - **Repeated-tool anti-loop guard** (#714) — the engine now tracks
112 `(tool_name, args)` pairs per user turn. On the third identical call it
113 inserts a synthetic corrective tool result instead of running the same tool
114 again unchanged; per-tool failures warn at three and halt at eight.
115 - **V4 cache-hit telemetry fallback** (#721) — usage parsing now recognizes
116 `usage.prompt_tokens_details.cached_tokens`, so the existing footer cache-hit
117 chip works with DeepSeek V4's automatic prefix-cache telemetry as well as the
118 older explicit hit/miss fields.
119
120 ### Fixed
121 - **Invalid tool-call JSON repair** (#712) — malformed streamed tool arguments
122 now pass through a deterministic repair ladder before dispatch.
123 - **Hallucinated tool-name recovery** (#713) — common non-canonical tool names
124 are resolved through the registry before the engine reports a missing tool.
125 - **Tool-schema sanitation** (#715) — schemas are normalized before API
126 emission so provider-strict JSON Schema handling does not reject valid tools.
127 - **Case-sensitive model IDs** (#717, #729) — valid configured model IDs keep
128 caller-provided case while compact DeepSeek aliases still canonicalize.
129 - **Stale `working...` state after failed dispatch** (#738) — if the UI fails
130 to send a message to the engine before a turn starts, the composer loading
131 state is cleared instead of trapping later input in pending state.
132 - **Prompt-free doctor key checks** — `deepseek doctor` no longer reads the OS
133 keyring, avoiding macOS Keychain prompts during diagnostics.
134 - **macOS Terminal color compatibility** — `xterm-256color` sessions now
135 receive 256-color palette indexes instead of truecolor SGR, preventing
136 Apple Terminal from misrendering whale blues as green/cyan blocks.
137 - **Chat client repair after Responses cleanup** — restored the chat client
138 body and regression coverage after removing the dead experimental Responses
139 fallback path.
140 - **Up/Down arrow transcript scroll when composer is empty** — bare Up/Down
141 arrows now scroll the transcript when the composer input is empty (or
142 whitespace-only); with text present they still navigate composer history.
143 Previously the gate was hardcoded to false, leaving users in virtual
144 terminals (Ghostty, Codex, Kitty-protocol) unable to scroll without
145 modifier shortcuts.
146
147 ## [0.8.11] - 2026-05-04
148
149 ### Changed
150 - **Cache-maxing prompt path for DeepSeek V4** — the engine now skips
151 system-prompt reassignment when the assembled stable prompt is unchanged,
152 keeps the volatile repo working-set summary out of the system prompt, and
153 injects it as per-turn metadata on the latest user message instead.
154 - **Tool catalog cache anchor** — the model-visible tool array now marks
155 the final native tool with `cache_control: ephemeral` so DeepSeek can
156 anchor the stable tool prefix explicitly.
157 - **V4-scale automatic compaction defaults** — automatic compaction keeps a
158 500K-token hard floor and the fallback compaction threshold now reflects
159 the V4-scale late-trigger policy instead of the old 50K-era default.
160 - **Token-only compaction trigger** — the message-count compaction trigger
161 was a 128K-era heuristic that fired on long sessions of small messages
162 — exactly the case where rewriting V4's prefix cache is most wasteful.
163 Removed `CompactionConfig::message_threshold` and the message-count
164 branch in `should_compact`; token budget is now the sole automatic
165 trigger (gated by the 500K floor). Manual `/compact` is unchanged.
166
167 ### Fixed
168 - **Legacy 128K context naming** — the 128K fallback is now named and
169 documented as legacy DeepSeek-only behavior, reducing ambiguity with the
170 1M-token DeepSeek V4 defaults.
171 - **`npm install` resilience for slow / firewalled networks** — the
172 postinstall binary fetch from GitHub Releases now retries on transient
173 errors (5 attempts, 1-16 s exponential backoff with jitter), enforces a
174 per-attempt timeout (default 5 min, configurable via
175 `DEEPSEEK_TUI_DOWNLOAD_TIMEOUT_MS`) plus a 30 s stall detector, honors
176 `HTTPS_PROXY` / `HTTP_PROXY` / `NO_PROXY` env vars (pure-Node CONNECT
177 tunneling, no new dependencies), and prints a download-progress line
178 to stderr so users know it isn't hung. Suppressible with
179 `DEEPSEEK_TUI_QUIET_INSTALL=1`. Reported by a community user from China
180 whose install through a CN npm mirror took 18 minutes — the bottleneck
181 was the GitHub fetch, which CN npm mirrors do not proxy.
182 - **YOLO sandbox dropped to DangerFullAccess** — YOLO mode was still
183 routing shell commands through the WorkspaceWrite sandbox, which
184 intercepted legitimate outside-workspace writes (package installs,
185 sub-agent workspaces, `~/.cache`, brew, `npm install -g`, pipx) and
186 forced approval round-trips — contradicting the "no guardrails"
187 contract. YOLO already auto-approves all tools and enables trust mode;
188 the sandbox was the last residual restriction. Now uses
189 DangerFullAccess (no sandbox), consistent with the full YOLO posture.
190 - **Scroll position lock preserved across render resolve** — user
191 scroll-up during live streaming was being yanked back to the live tail
192 on the next chunk. The `user_scrolled_during_stream` lock was cleared
193 prematurely when content briefly fit in one screen, or when the
194 transcript shrank between renders (e.g. sub-agent card collapsed).
195 Fixed by snapshotting the prior tail state before `resolve_top` and
196 only clearing the lock when the user was deliberately at the bottom.
197 - **Capacity controller disabled by default** — the capacity controller
198 was silently clearing the transcript (`messages.clear()`) based on
199 slack-based `p_fail` calculations, independent of token utilization or
200 the `auto_compact` setting. This contradicted the v0.8.11 default of
201 `auto_compact = false` — the user opted into trusting the model with
202 the full 1M-token V4 window, and the controller was auto-managing the
203 prefix on their behalf. The controller now defaults to `enabled = false`;
204 power users can opt in via `capacity.enabled = true`.
205
206 ### Docs
207 - **README clarity pass** (#685) — title-cased section headings, an explicit
208 Node + npm prerequisites block before the `npm install -g` snippet, a
209 China-friendly `--registry=https://registry.npmmirror.com` install
210 variant, a DeepWiki badge for AI-assisted repo browsing, and a 🐳 mark
211 on the title. *Thanks to [@Agent-Skill-007](https://github.com/Agent-Skill-007)
212 for this PR.*
213
214 ## [0.8.12] - 2026-05-05
215
216 A feature release built on the v0.8.11 cache-maxing foundation: 20 community
217 PRs merged, covering reasoning-effort automation, V4 FIM edits, bash-arity
218 execpolicy, skill-registry sync, vim composer mode, large-tool-output routing,
219 pluggable sandbox backends, layered permission rulesets, and cache-aware
220 resident sub-agents. No breaking changes.
221
222 ### Added
223 - **Reasoning-effort auto mode** (#669) — `reasoning_effort = "auto"` inspects
224 the last user message for keywords (debug/error → Max, search/lookup → Low,
225 default → High) and resolves the tier before each API request. Sub-agents
226 always get Low.
227 - **FIM edit tool for V4 /beta** (#668) — `fim_edit` tool sends
228 fill-in-the-middle requests to DeepSeek's `/beta` endpoint for surgical code
229 edits.
230 - **Bash arity dictionary** (#655) — `auto_allow = ["git status"]` now matches
231 `git status -s` but NOT `git push`. The arity dictionary knows command
232 structure for git, cargo, npm, yarn, pnpm, docker, kubectl, aws, make, and
233 others. Legacy flat prefix matching still works for unlisted commands.
234 - **Unified slash-command namespace** (#661) — user-defined commands in
235 `~/.deepseek/commands/` support `$1`, `$2`, `$ARGUMENTS` template
236 substitution. User commands override built-in commands.
237 - **Skill registry sync** (#654) — `/skills sync` fetches the community skill
238 registry and installs/updates all listed skills. Network-gated by the
239 existing `[network]` policy.
240 - **Vim modal editing in composer** (#659) — `vim.insert_mode` / `vim.normal_mode`
241 settings enable modal editing in the message composer with standard Vim
242 keybindings.
243 - **Separate tui.toml** (#657) — theme colors and keybind overrides can live in
244 `~/.deepseek/tui.toml` alongside the main `config.toml`. *Note: file format
245 is defined but not yet loaded at startup — wiring deferred to v0.8.13.*
246 - **Large-tool-output routing** (#658) — tool results exceeding a configurable
247 token threshold are routed through a workshop with truncated previews,
248 protecting the parent context window. Synthesis is currently truncation-only;
249 V4-Flash sub-agent synthesis deferred to follow-up.
250 - **Pluggable sandbox backends** (#645) — a `SandboxBackend` trait and
251 Alibaba OpenSandbox HTTP adapter let `exec_shell` route commands to a remote
252 sandbox instead of spawning locally. Config keys: `sandbox_backend`,
253 `sandbox_url`, `sandbox_api_key`.
254 - **Layered permission rulesets** (#653) — `ExecPolicyEngine` supports
255 builtin, agent, and user-priority layers for allow/deny prefix rules.
256 Deny-always-wins semantics.
257 - **Cache-aware resident sub-agents** (#660) — sub-agents spawned with
258 `resident_file` prepend the file contents to their system prefix for V4
259 prefix-cache locality. A global lease table prevents two agents from holding
260 a resident lease on the same file simultaneously. Leases are released on
261 agent completion.
262 - **Context-limit handoff** (#667) — engine-level support for replacing
263 routine compaction with a `.deepseek/handoff.md` file write when context
264 pressure triggers. *Note: config knob removed pending implementation.*
265 - **LSP auto-attach diagnostics** (#656) — edit results now include post-edit
266 diagnostics via the engine-level LSP hooks path.
267
268 ### Docs
269 - **README install section rewritten** (#672) — the previous lede claimed
270 "no Node.js or Python runtime" but the very next paragraph told readers to
271 install Node before continuing. Replaced with a three-path Install block
272 (npm / cargo / direct download) that makes the npm wrapper's role explicit:
273 it downloads the prebuilt binary, but `deepseek` itself does not depend on
274 Node at runtime. zh-CN README mirrored.
275 - **Windows Scoop install instructions** (#696) — README and zh-CN README now
276 document `scoop install deepseek-tui` for Windows users. *Thanks to
277 [@woyxiang](https://github.com/woyxiang) for this PR.*
278 - **DeepSeek Pro discount window extended** (#692) — pricing footnote updated
279 from 5 May 2026 to 31 May 2026 to match the platform-side promotion. *Thanks
280 to [@wangfeng](mailto:wangfengcsu@qq.com) for this PR.*
281 - **`deepseek resume <SESSION_ID>` surfaced in Usage** — the command exists
282 since v0.7 but was undocumented. Reported via #682.
283 - **SECURITY.md** (#648) — vulnerability reporting policy and supported
284 versions.
285 - **CODE_OF_CONDUCT.md** (#686) — Contributor Covenant v2.1. *Thanks to
286 [@zichen0116](https://github.com/zichen0116) for this PR.*
287 - **zh-Hans locale activation docs** (#652) — README.zh-CN.md and
288 config.example.toml now document `locale = "zh-Hans"`.
289
290 ### Fixed
291 - **Cross-workspace session bleed (security)** — launching `deepseek` from
292 any directory silently auto-recovered the most recent interrupted session,
293 even if that session originated in a completely different workspace. Tools
294 then operated on the prior workspace's file paths while the status bar
295 displayed the *current* workspace name — a confusing trust-boundary
296 violation that could leak `api_messages`, `working_set` entries, and any
297 secrets the prior session had accumulated into a new terminal that was
298 never meant to see them. `try_recover_checkpoint()` now compares the saved
299 session's workspace to `std::env::current_dir()` (canonicalised, with a
300 strict-equality fallback when canonicalisation fails) and only auto-recovers
301 on a match. On a mismatch the checkpoint is persisted as a regular session
302 (so the user can find it via `deepseek sessions` / `deepseek resume <id>`)
303 and cleared, and the new launch starts fresh — no data is lost. Hotfixed
304 to `main` ahead of the v0.8.12 tag.
305 - **`cargo install` on stable Rust** — the language-picker match guard at
306 `crates/tui/src/tui/ui.rs:1603` used `&& let Some(...) = ...` inside an
307 `if`-guard, which requires the nightly-only `if_let_guard` feature on Rust
308 before 1.94. Reported by an external user whose `cargo install
309 deepseek-tui` failed with E0658. Rewrote as a plain match guard with a
310 nested `if let` inside the arm body. The workspace also now declares
311 `rust-version = "1.88"` (the actual minimum for `let_chains` in
312 `if`/`while`) so users on too-old toolchains see a clear cargo error
313 instead of a confusing rustc one. AGENTS.md gains a "stable Rust only"
314 section so this doesn't regress.
315 - **Resident-file lease never released after spawn** (#660) — the lease was
316 stamped as `"pending"` at spawn time because the agent id is only assigned
317 by the manager after the spawn call returns. The release-on-terminal-state
318 path (added in the original #660 commit) matched leases by agent id, so
319 it could never find these placeholder entries. Now the placeholder is
320 replaced with the real agent id immediately after spawn so existing
321 release wiring fires. Resolves the v0.8.12 caveat documented at RC time.
322 - **Color::Reset across all UI widgets** (#651, #671) — replaced hardcoded
323 `Color::Black` and `Color::Rgb(18, 29, 39)` backgrounds with `Color::Reset`
324 so the TUI respects the terminal's actual background color on light-themed
325 and non-standard terminals.
326 - **Windows MessageBeep** (#646) — `notify_done_to` now calls `MessageBeep` on
327 Windows when BEL method is selected.
328 - **truncate_id optimization** (#649) — replaced manual string slicing with a
329 shared `truncate_id` helper across session, picker, and UI call sites.
330
331 ### Maintenance
332 - Workspace `cargo fmt` sweep across community PRs that landed unformatted.
333 - Issue-triage GitHub Actions added (#688): keyword-driven auto-labeller,
334 stale-bot for `needs-info` issues (14 d → stale → 7 d → close), and a
335 spam lockdown that auto-closes promotional issues from accounts <30 d
336 old. All pure GitHub Actions — no third-party services.
337 - Annotated `TuiPrefs` (#657) and `handoff::THRESHOLDS` (#667) with
338 `#[allow(dead_code)]` so the deferred APIs don't trip CI's `-D warnings`
339 flag while their call sites are staged for v0.8.13.
340 - Removed dead `prefer_handoff` field from `CompactionConfig` — config knob
341 existed but zero code paths consulted it (#667).
342 - Removed dead `use_terminal_colors` field from `TuiConfig` — no rendering
343 code read the value (#671).
344 - Fixed `expect()` panic risk in `OpenSandboxBackend::new()` — now returns
345 `Result` (#645).
346 - Fixed broken `section_bg` test assertion after Color::Reset migration (#651).
347 - Fixed `resolve_prefixes` docstring to accurately describe deny-always-wins
348 behavior (#653).
349 - Wired `create_backend()` into `Engine::build_tool_context` — sandbox backend
350 was defined but never activated (#645).
351 - Wired resident lease release on agent completion/cancellation/failure (#660).
352
353 ### Contributors
354
355 First-time contributor to this release: **@zichen0116** (#686). Welcome — and
356 thank you.
357
358 Bulk community contributions by [@merchloubna70-dot](https://github.com/merchloubna70-dot)
359 (#645–#681, 28 PRs spanning features, fixes, and VS Code extension scaffolding).
360 *Thank you for the remarkable volume and quality of work.*
361
362 ## [0.8.10] - 2026-05-04
363
364 A patch release: hotfixes, small UX polish, and four whalescale-unblocking
365 runtime API additions. No breaking changes.
366
367 ### Added
368 - **OPENCODE shell.env hook** (#456) — lifecycle hooks can now inject
369 shell environment into spawned commands without hard-coding env in
370 prompts or wrapper scripts.
371 - **Stacked toast overlay** (#439) — status toasts can queue and render
372 together instead of overwriting each other.
373 - **File @-mention frecency** (#441) — file mention suggestions learn
374 from recent selections via `~/.deepseek/file-frecency.jsonl`.
375 - **Durable keybinding catalog** (#559) — `docs/KEYBINDINGS.md` is now
376 the source-of-truth audit for current shortcuts and the future
377 configurable-keymap registry.
378 - **Runtime API quartet for whalescale-desktop integration** (#561, #562, #563,
379 #564, #567) — addresses whalescale#255/256/260/261:
380 - `[runtime_api] cors_origins` config / `--cors-origin URL` flag (repeatable) /
381 `DEEPSEEK_CORS_ORIGINS` env var, all stacking on top of the built-in
382 dev-origin defaults (#561 / whalescale#255).
383 - `PATCH /v1/threads/{id}` extended from `archived`-only to the full
384 editable field set: `allow_shell`, `trust_mode`, `auto_approve`, `model`,
385 `mode`, `title`, `system_prompt`. Empty string clears `title` /
386 `system_prompt`. New `title` field on `ThreadRecord` is additive — no
387 schema_version bump (#562 / whalescale#256).
388 - `archived_only=true` query param on `GET /v1/threads` and
389 `/v1/threads/summary`, backed by a new `ThreadListFilter` enum
390 (#563 / whalescale#260).
391 - `GET /v1/usage?since=&until=&group_by=<day|model|provider|thread>`
392 aggregates token totals + cost (via `pricing.rs`) across all
393 threads/turns. Empty time ranges yield empty `buckets` (never 404)
394 (#564 / whalescale#261).
395 - **Language picker in first-run onboarding** (#566) — new step between
396 Welcome and ApiKey lists every shipped locale (`auto` / `en` / `ja` /
397 `zh-Hans` / `pt-BR`) with the native name (日本語, 简体中文, …) plus an
398 English label so the target language is reachable without already
399 speaking it. Hotkeys 1-5 select; persists immediately to
400 `~/.deepseek/settings.toml`.
401 - **Windows + China install documentation** (#578) — expanded
402 `docs/INSTALL.md` with Windows source-build setup, Visual Studio Build
403 Tools / MSVC environment notes, rustup and Cargo mirror guidance, and
404 antivirus troubleshooting. *Thanks to
405 [@loongmiaow-pixel](https://github.com/loongmiaow-pixel) for this PR.*
406
407 ### Changed
408 - **Agent prompt now explicitly describes DeepSeek cache-aware behavior**
409 — long-session guidance explains why stable prompt prefixes, sub-agents,
410 RLM, and late compaction matter for V4 cache economics.
411 - **Whale sub-agent nicknames now interleave Simplified Chinese with
412 English** (`Blue` / `蓝鲸` / `Humpback` / `座头鲸` / …). Pure cosmetic;
413 doubles the labeling pool size and gives a roughly even mix on each
414 new spawn.
415 - **User memory docs + help polish** (#497, #569) — `/memory` is now
416 listed in slash-command help, supports `/memory help`, and the README
417 / configuration docs now point at the full `docs/MEMORY.md` guide and
418 document both `[memory].enabled` and `DEEPSEEK_MEMORY`. *Thanks to
419 [@20bytes](https://github.com/20bytes) for this PR.*
420
421 ### Fixed
422 - **Compaction summaries are cache-aligned for DeepSeek V4** (#575, #580)
423 — when the summarized message prefix fits the large V4 context budget,
424 the summary request now reuses the original messages and appends the
425 summary instruction as a normal user message instead of rebuilding a
426 fresh `SUMMARY_PROMPT + dropped messages` input. This lets the summary
427 call benefit from DeepSeek prefix caching. *Thanks to
428 [@lloydzhou](https://github.com/lloydzhou) and
429 [@jeoor](https://github.com/jeoor) for the cost reports and concrete
430 strategy.*
431 - **Windows Terminal API-key paste during onboarding** (#577) — the
432 setup wizard now handles Ctrl/Cmd+V before generic character input and
433 filters control/meta-modified keys out of the API-key text path.
434 *Thanks to [@toi500](https://github.com/toi500) for the report and
435 workaround details.*
436 - **Terminal startup repaint** (#581) — the TUI clears the terminal
437 immediately after initialization so normal-screen startup no longer
438 leaves stale default-background rows above the first frame. *Thanks to
439 [@xsstomy](https://github.com/xsstomy) for the screenshot.*
440 - **Markdown rendering for tables, bold/italic, and horizontal rules**
441 (#579) — transcript markdown now handles table rows, strips separator
442 rows, renders horizontal rules, applies inline bold/italic styles, and
443 avoids an infinite-loop edge case on unclosed markers. *Thanks to
444 [@WyxBUPT-22](https://github.com/WyxBUPT-22) for the PR, screenshots,
445 and tests.*
446 - **Slash-prefix Enter activation** (#573) — typing a short prefix such
447 as `/mo` and pressing Enter now activates the first slash-command
448 match. *Thanks to [@melody0709](https://github.com/melody0709) for
449 the report.*
450 - **macOS seatbelt blocked `~/.cargo/registry`** (#558) — `cargo publish`
451 / `cargo build` from inside the TUI's shell tool was getting
452 sandbox-denied. The seatbelt now allows read on `(param "CARGO_HOME")`
453 and write on the `registry/` and `git/` subpaths whenever the policy
454 isn't read-only. Honors `CARGO_HOME` env with a `$HOME/.cargo`
455 fallback.
456 - **Stdio MCP servers now receive SIGTERM on shutdown** (#420) — instead
457 of SIGKILL via `kill_on_drop`. New `async fn shutdown` on
458 `McpTransport` overrides on `StdioTransport` to send SIGTERM and wait
459 up to 2s for graceful exit before drop fires SIGKILL as the backstop.
460 Wired into the engine's `Op::Shutdown` path so graceful exit is the
461 default. A Drop fallback still SIGTERMs on abnormal exit paths.
462 - **Shell-spawned children get `PR_SET_PDEATHSIG(SIGTERM)` on Linux**
463 (#421) — the kernel sends SIGTERM the moment the parent (TUI) exits,
464 even on SIGKILL of the parent. Closes the leak window the cooperative
465 cancellation path can't cover. macOS / Windows watchdog tracked as a
466 follow-up; the existing `kill_on_drop` + process_group SIGKILL on
467 cancellation still cover normal shutdown there.
468 - **npm install on older glibc now fails fast** (#555, #560, #556, #565)
469 — the prebuilt Linux x64 / arm64 binaries are now built via
470 `cargo zigbuild` targeting `x86_64-unknown-linux-gnu.2.28` /
471 `aarch64-unknown-linux-gnu.2.28`, lowering the requirement from glibc
472 ≥ 2.39 to ≥ 2.28. The npm postinstall also runs a Linux-only glibc
473 preflight that fails fast with a clear "build from source" message
474 when the host is incompatible (or musl). *Thanks to
475 [@staryxchen](https://github.com/staryxchen) (#556) and
476 [@Vishnu1837](https://github.com/Vishnu1837) (#565) for these PRs.*
477 - **Shell tool `cwd` parameter now validated against the workspace
478 boundary** (#524) — the model could previously pass `cwd` paths
479 outside the workspace; now `exec_shell` runs `ToolContext::resolve_path`
480 on `cwd` like every other path-taking file tool, returning
481 `PathEscape` on violations. `trust_mode = true` still bypasses,
482 consistent with the file-tool pattern. *Thanks to
483 [@shentoumengxin](https://github.com/shentoumengxin) for this PR.*
484
485 ### Contributors
486
487 First-time contributors to this release: **@staryxchen** (#556),
488 **@shentoumengxin** (#524), **@Vishnu1837** (#565), **@20bytes**
489 (#569), **@loongmiaow-pixel** (#578), and **@WyxBUPT-22** (#579).
490 Welcome — and thank you.
491
492 ## [0.8.8] - 2026-05-03
493
494 ### Added
495 - **User memory MVP** (#489–#493) — opt-in persistent note file
496 injected into the system prompt as a `<user_memory>` block.
497 - `# foo` typed in the composer appends a timestamped bullet
498 without firing a turn (#492).
499 - `/memory [show|path|clear|edit]` slash command for inline
500 inspection / editing hints (#491).
501 - `remember` model-callable tool so the agent can capture
502 durable preferences itself; auto-approved because writes are
503 scoped to the user's own file (#489).
504 - Hierarchy loader pulls `~/.deepseek/memory.md` (path
505 configurable via `memory_path` / `DEEPSEEK_MEMORY_PATH`) and
506 injects above the volatile-content boundary in the prompt
507 (#490).
508 - Default off; enable with `[memory] enabled = true` or
509 `DEEPSEEK_MEMORY=on` (#493).
510 - Full feature documentation in `docs/MEMORY.md`.
511 - **Inline diff rendering for `edit_file` / `write_file`** (#505) —
512 tool results now emit a unified diff at the head of the body,
513 picked up by the existing diff-aware renderer with line numbers
514 and coloured `+`/`-` gutters. New `similar` crate dep.
515 - **OSC 8 hyperlinks** (#498) — URLs in the transcript become
516 Cmd+click-openable in supporting terminals (iTerm2, Terminal.app
517 13+, Ghostty, Kitty, WezTerm, Alacritty). Clipboard path strips
518 the escapes so yanked text stays clean. Off-switch:
519 `[tui] osc8_links = false`.
520 - **Retry/backoff visual countdown** (#499) — `⟳ retry N in Ms — reason`
521 banner ticks down during HTTP backoff. On exhaustion the row turns
522 red `× failed: <reason>` until the next turn starts.
523 - **MCP server health chip** (#502) — colour-coded `MCP M/N` in the
524 footer's right-cluster: success / warning / error / muted by
525 reachability. Hidden when zero MCP servers are configured.
526 - **Per-project config overlay** (#485) — `<workspace>/.deepseek/config.toml`
527 overlays a curated set of fields on top of the user-global config:
528 `model`, `reasoning_effort`, `approval_policy`, `sandbox_mode`,
529 `notes_path`, `max_subagents`, `allow_shell`, plus the
530 `instructions = [...]` array (#454). Pass `--no-project-config`
531 to bypass for one launch.
532 - **Project-scope deny-list for credentials/redirects** (#417) —
533 `api_key`, `base_url`, `provider`, and `mcp_config_path` are
534 refused at project scope. A malicious
535 `<workspace>/.deepseek/config.toml` would otherwise be able to
536 exfiltrate prompts to an attacker-controlled endpoint by
537 swapping the user's credentials and target host with
538 project-controlled values, or redirect the MCP loader at a
539 config that spawns arbitrary stdio servers under the user's
540 identity. The denied key emits a stderr warning so a user who
541 expected the override sees the deny instead of a silent drop.
542 - **Project-scope value-deny for the loosest postures** (#417
543 follow-up) — `approval_policy = "auto"` and
544 `sandbox_mode = "danger-full-access"` are pure escalation
545 values, denied unconditionally at project scope regardless
546 of the user's prior value. Sub-tightening comparisons
547 (e.g. user `"never"` → project `"on-request"` is allowed
548 even though it loosens) stay v0.8.9 follow-up because they
549 need a richer ordering check.
550 - **`SSL_CERT_FILE` honored in the HTTPS client** (#418) — corporate
551 proxy / TLS-inspecting MITM users can now point at their custom
552 CA bundle and have it added alongside the platform's system
553 trust store. Tries PEM-bundle parsing first (covers single-cert
554 files too), falls back to DER. Failures log a warning and
555 continue — the existing system roots still apply, so a
556 malformed env var won't bring down the launch. Documented in
557 `docs/CONFIGURATION.md`.
558 - **Execpolicy heredoc handling** (#419) — `normalize_command` now
559 strips heredoc bodies before shlex tokenization so a user's
560 `auto_allow = ["cat > file.txt"]` pattern matches the heredoc
561 form `cat <<EOF > file.txt\nbody\nEOF` cleanly. Recognises the
562 common forms (`<<DELIM`, `<<-DELIM`, `<<'DELIM'`, `<<"DELIM"`)
563 while leaving the here-string operator (`<<<`) untouched.
564 Without this fix, heredoc-form file writes would skip the
565 user's auto-approve list and route through the approval modal
566 even for explicitly-blessed commands.
567 - **Sub-agent role taxonomy expansion** (#404) — adds `Implementer`
568 ("land this change with the minimum surrounding edit") and
569 `Verifier` ("run the test suite, report pass/fail with evidence")
570 to the existing `general` / `explore` / `plan` / `review` /
571 `custom` set. Each role has a distinct system prompt posture.
572 Documented in `docs/SUBAGENTS.md`.
573 - **`docs/SUBAGENTS.md`** — full sub-agent reference: role taxonomy,
574 alias map, concurrency cap, lifecycle, session-boundary
575 classification, output contract.
576 - **`docs/MEMORY.md`** — user-facing memory feature documentation.
577 - **Competitive analysis doc** — `docs/COMPETITIVE_ANALYSIS.md`
578 catalogues capability matrix vs OpenCode and Codex CLI.
579 - **Session prune helper + `/sessions prune <days>`** (#406 phase-1) —
580 drops persisted sessions older than N days from
581 `~/.deepseek/sessions/`. Skips the checkpoint subdirectory and
582 compares against metadata `updated_at` (not fs mtime, which can
583 lie after an rsync). 10 total tests cover the helper's contract
584 and the slash-command dispatch surface. Phase 2 (boot-prune +
585 retention policy) stays v0.8.9 work.
586 - **`deepseek doctor --json`** now surfaces a `memory` block
587 (`enabled` / `path` / `file_present`) so operators can verify
588 memory configuration without booting the TUI.
589 - **Tool-output spillover** (#422 + #423 + #500) — tool outputs over
590 100 KiB now spill to `~/.deepseek/tool_outputs/<id>.txt` from the
591 engine's tool-execution path. The model receives a 32 KiB head plus
592 a footer pointing at the spillover file (`Use read_file path=…`),
593 the tool cell renders an inline `full output: <path>` annotation in
594 live mode, and a 7-day boot prune keeps the directory bounded.
595 Spillover is skipped on error results so the model still sees the
596 failure message verbatim. The existing tool-details pager surfaces
597 the truncated head so the user can verify what the model saw.
598
599 ### Changed
600 - **Sub-agent concurrency cap raised to 10 by default** (#509) —
601 was 5; configurable via `[subagents].max_concurrent` (hard
602 ceiling 20). Running-count now ignores non-running, no-handle,
603 and finished handles so completed agents stop occupying slots.
604 - **`SharedSubAgentManager` is `Arc<RwLock<...>>`** (#510) — read
605 paths take read locks, eliminating the multi-agent fan-out UI
606 freeze.
607 - **Sub-agent output summarized before parent context** (#511) —
608 `compact_tool_result_for_context` now compresses
609 `agent_result` / `agent_wait` payloads instead of dumping the
610 full snapshot back into the parent's context window.
611 - **`agent_list` defaults to current-session view** (#405) — each
612 manager mints a `session_boot_id` and stamps every spawn; agents
613 loaded from prior sessions are filtered unless
614 `include_archived=true` is passed. Each result carries a
615 `from_prior_session` flag.
616 - **Concise todo / checklist update rendering** (#403) — repeat
617 `todo_update` / `checklist_update` calls render a one-line
618 `Todo #N: <title> → STATUS` card with full list still
619 reachable via Alt+V instead of dumping the entire item array on
620 every call.
621 - **Compact `agent_spawn` rendering** (#409) — the generic tool
622 block for `agent_spawn` collapses to one header line in live
623 mode (`◐ delegate · agent-abc12 [running]`) since the
624 `DelegateCard` already owns live action progress. Transcript
625 replay keeps the full block.
626 - **Plan panel role clarified** (#408) — drops the "No active
627 plan" placeholder when the panel is otherwise empty; documents
628 the panel's narrow role (`update_plan` tool output + `/goal` +
629 cycle counter, distinct from todos).
630 - **Sub-agent description copy** — `agent_spawn` tool description
631 and `prompts/base.md` updated to reflect the new default cap of
632 10 (was stale "Max 5 in flight").
633 - **`agent_spawn` / `agent_assign` schema descriptions** (#404
634 follow-up) — type/agent_name property descriptions now list
635 `implementer` and `verifier` so the model surfaces those roles
636 without having to discover them from `docs/SUBAGENTS.md`. Adds
637 the long-form aliases (`builder` / `validator` / `tester`) on
638 `agent_assign` for parity with the alias map.
639 - **Multi-day duration formatting** (#447) — `humanize_duration`
640 now caps at two units and promotes through h/d/w boundaries.
641 Long-running sessions render as `2d 3h` instead of `188415s`,
642 and the previous "192m 30s" cycle output becomes `3h 12m`. The
643 `/goal` status line picks up the same formatter so multi-day
644 goal-elapsed times stay readable.
645 - **Accessibility flag** (#450) — `NO_ANIMATIONS=1` env var now
646 forces `low_motion = true` and `fancy_animations = false` at
647 startup, regardless of the saved `settings.toml`. Recognises
648 the standard truthy spellings (`1`, `true`, `yes`, `on`).
649 Documented end-to-end in the new `docs/ACCESSIBILITY.md`,
650 including the existing `low_motion` / `calm_mode` /
651 `show_thinking` / `show_tool_details` toggles for
652 screen-reader users.
653 - **Cumulative session-elapsed footer chip** (#448) — a
654 low-priority `worked 3h 12m` chip in the footer's right
655 cluster shows session age once it crosses 60s. Hidden during
656 the first minute of a launch so a fresh start doesn't flash a
657 ticker. Drops first under narrow widths so the existing chips
658 (coherence / agents / replay / cache / mcp) keep their slots.
659 Sampled at props-build time (matches the `retry` capture
660 pattern) so render stays pure for tests.
661 - **`instructions = [...]` config array** (#454) — declare
662 additional instruction files (`./AGENTS.md`,
663 `~/.deepseek/global.md`, …) and they're concatenated into the
664 system prompt in declared order, above the skills block. Each
665 file is capped at 100 KiB; missing files log a warning and are
666 skipped instead of failing the launch. Project config replaces
667 the user-level array wholesale (the typical "merge" pattern is
668 for users who want both — they list `~/global.md` inside the
669 project array). Documented in `config.example.toml`.
670 - **Keyboard-enhancement flags pop on suspend paths too** (#443
671 follow-up) — `pause_terminal` (Ctrl+Z / shell-suspend) and
672 `external_editor::spawn_editor_for_input` (composer `$EDITOR`
673 launch) now pop the flags before handing the terminal to the
674 child process, matching the existing shutdown and panic-hook
675 paths. Defense-in-depth: if a future code path enables the
676 flags explicitly, the suspend handlers won't leak them to a
677 Vim / less / shell child that hasn't asked for them.
678 - **`load_skill` tool** (#434) — model-callable tool that takes a
679 skill id and returns the SKILL.md body plus the sibling
680 companion-file list in one call. Faster than the existing
681 `read_file` + `list_dir` dance; surfaces the skill's
682 description as a quote block at the head so a single tool
683 result is self-contained. Resolves the skills directory with
684 the same hierarchy `App::new` uses (`.agents/skills` →
685 `skills` → `~/.deepseek/skills`). Available in Plan and
686 Agent/Yolo modes.
687 - **Kitty keyboard protocol opt-in** (#442) — pushes
688 `DISAMBIGUATE_ESCAPE_CODES` at startup so terminals that
689 support the protocol (Kitty, Ghostty, Alacritty 0.13+,
690 WezTerm, recent Konsole / xterm) report unambiguous events
691 for Option/Alt-modified keys, plain Esc, and multi-byte
692 sequences. Legacy terminals silently discard the escape and
693 see no change. Only the disambiguation tier is pushed —
694 release-event reporting was deliberately skipped because the
695 existing handlers would mis-route releases as duplicate
696 presses. The flags are popped on shutdown / panic / suspend
697 paths (#443).
698 - **Multi-directory skill discovery** (#432) — the system
699 prompt's `## Skills` listing and the `load_skill` tool now
700 walk every candidate directory in the workspace plus the
701 global default: `<workspace>/.agents/skills` →
702 `<workspace>/skills` → `<workspace>/.opencode/skills` →
703 `<workspace>/.claude/skills` → `~/.deepseek/skills`. Skills
704 installed for any AI-tool convention show up in the same
705 catalogue. Name conflicts resolve first-match-wins per the
706 precedence order so workspace-local skills shadow user/global
707 ones. New `skills_directories()` and
708 `discover_in_workspace()` helpers in
709 `crates/tui/src/skills/mod.rs`.
710 - **`tool.spillover` audit event** (#500 polish) — emit a
711 discrete audit-log entry whenever `apply_spillover` writes a
712 spillover file, so operators tailing
713 `~/.deepseek/audit.log` can correlate large-output episodes
714 with disk-usage growth in `~/.deepseek/tool_outputs/`. Fires
715 in both the sequential and parallel tool paths.
716 - **Prompt stash** (#440) — Ctrl+S in the composer parks the
717 current draft to a JSONL-backed stash at
718 `~/.deepseek/composer_stash.jsonl` (no-op on empty composer).
719 `/stash list` shows parked drafts (oldest first, with one-line
720 previews and timestamps); `/stash pop` restores the most
721 recently parked draft into the composer (LIFO). Self-healing
722 parser drops malformed lines instead of poisoning the stash.
723 Capped at 200 entries; multiline drafts round-trip intact via
724 JSON's newline escaping.
725 - **`deepseek pr <N>` subcommand** (#451) — fetches PR
726 title/body/diff via `gh` and launches the interactive TUI
727 with a review prompt pre-populated in the composer. The
728 diff is capped at 200 KiB (codepoint-safe truncation) so a
729 massive PR doesn't blow the context window before the user
730 hits Enter. Optional `--repo <owner/name>` and `--checkout`
731 flags; falls back gracefully with an actionable error
732 message if `gh` isn't on PATH. Adds a new
733 `TuiOptions::initial_input` plumb that any future caller can
734 reuse to drop the model into a session with text already
735 typed.
736 - **`/stash clear` subcommand** (#440 polish) — wipes the
737 entire stash file and reports how many parked drafts were
738 dropped. Pairs with `/stash list` and `/stash pop` so the
739 user can fully manage the stash from inside the TUI without
740 reaching for `rm`.
741 - **`/hooks` read-only listing** (#460 MVP) — slash command
742 enumerates configured lifecycle hooks grouped by event,
743 showing each hook's name, command preview, timeout, and
744 condition. Notes the global `[hooks].enabled` flag's state.
745 No more `cat ~/.deepseek/config.toml` to debug "did my hook
746 actually load". The picker / persisted enable-disable
747 surface from #460 stays as v0.8.9 follow-up. Available via
748 `/hooks` or `/hooks list`; aliased to `/hook`. Localized in
749 en/ja/zh-Hans/pt-BR.
750 - **`deepseek doctor` reports cross-tool skill dirs** (#432
751 follow-up) — both the human-readable and JSON outputs now
752 surface `.opencode/skills/` and `.claude/skills/` presence /
753 count, so operators can confirm at a glance whether any
754 cross-tool skill folder is contributing to the merged
755 catalogue. Empty dirs are omitted from the human-readable
756 output to keep the report scannable; JSON always emits all
757 five slots (`global`, `agents`, `local`, `opencode`,
758 `claude`) for stable machine consumption.
759 - **`deepseek doctor` reports storage surfaces** (#422 / #440 /
760 #500 follow-up) — new `Storage:` section surfaces the
761 tool-output spillover dir
762 (`~/.deepseek/tool_outputs/`) with file count and the
763 composer stash file
764 (`~/.deepseek/composer_stash.jsonl`) with parked-draft
765 count. Mirrored under `storage.{spillover,stash}` in the
766 JSON output so `deepseek doctor --json` keeps a stable
767 schema.
768 - **`/hooks events` subcommand** (#460 polish) — lists every
769 supported `HookEvent` value with a short blurb so users can
770 discover which events to target in `[[hooks.hooks]]` entries
771 without reading source. Ordered lifecycle → per-tool →
772 situational, stable across releases.
773 - **Structured-Markdown compaction template** (#429) —
774 `prompts/compact.md` switches from the legacy
775 Active-task/Files-touched/Key-decisions/Open-blockers
776 framing to the spec'd structure: Goal / Constraints /
777 Progress (Done / In Progress / Blocked) / Key Decisions /
778 Next step. The richer Progress sub-bullets help long
779 resumed sessions distinguish "what's verified done" from
780 "what's mid-flight" — useful when the model writes
781 `.deepseek/handoff.md` before a long break. Backwards-
782 compat: existing handoff.md files continue to render fine
783 because the loader injects them as plain markdown (the
784 template only guides what NEW handoffs look like). The
785 pinned-tool-output configurability part of #429's spec
786 stays a v0.8.9 follow-up — that requires changes to
787 `cycle_manager.rs` compaction logic itself.
788 - **`tool_call_before` / `tool_call_after` / `message_submit` /
789 `on_error` hooks all fire now** (#455 observer-only slice) —
790 these events were defined in the `HookEvent` enum but never
791 fired from production code. Wired through:
792 `tool_call_before` and `tool_call_after` fire from
793 `tool_routing.rs`; `message_submit` fires from
794 `dispatch_user_message` before engine dispatch; `on_error`
795 fires from `apply_engine_error_to_app` before the error cell
796 reaches the transcript. Hook contexts populate the relevant
797 fields (`tool_name` + `tool_args` / `tool_result`,
798 `message`, `error`). Hooks remain read-only in this slice;
799 argument / result / message mutation is a v0.8.9 follow-up
800 because it needs a synchronous-gate contract that doesn't
801 exist today. Combined with the existing `session_start` /
802 `session_end` / `mode_change` events, every variant in the
803 `HookEvent` enum now has a live producer. Each fire is
804 fast-path-gated by
805 `HookExecutor::has_hooks_for_event(event)` so per-tool
806 dispatch never pays for `HookContext` allocation when the
807 user has no hooks configured (the common case).
808 - **RLM tool family** (#512) — `rlm` tool cards map to
809 `ToolFamily::Rlm` and render `rlm`, not `swarm`. Stale "swarm"
810 wording cleaned out of docs / comments / tests.
811 - **Foreground RLM visible in Agents sidebar** (#513 — stopgap)
812 — projection now shows foreground RLM work; full async
813 lifecycle remains v0.8.9.
814
815 ### Fixed
816 - **`Don't auto-approve git -C ...`** (#416, shipped 2026-05-03) —
817 v0.8.8 release runtime fix; foundation for the rest of the
818 stabilization batch.
819 - **Self-update arch mapping** (#503) — `update.rs` uses release
820 asset naming (`arm64`/`x64`) instead of raw Rust constants
821 (`aarch64`/`x86_64`); rejects `.sha256` siblings as primary
822 binaries.
823 - **Composer Option+Backspace deletes by word** (#488) — was
824 deleting by character.
825 - **Offline composer queue is session-scoped** (#487) — legacy
826 unscoped queues fail closed instead of leaking content into
827 unrelated chats.
828 - **`display_path` test race + Windows separator** (#506) —
829 tests no longer mutate `$HOME`; `display_path_with_home` walks
830 components and joins with `MAIN_SEPARATOR_STR` so Windows shows
831 `~\projects\foo` not `~\projects/foo`.
832 - **Footer reads statusline colours from `app.ui_theme`** (#449) —
833 was using a bespoke palette.
834 - **Keyboard-enhancement flags pop on panic exit too** (#443/#444) —
835 raw-mode startup probe is now bounded by a configurable
836 timeout.
837 - **CI workflow cleanup** (#507) — pruned three duplicated/dead
838 workflows (`crates-publish.yml`, `parity.yml`, `publish-npm.yml`);
839 `release.yml` `build` job now allows `parity` to be skipped on
840 manual `workflow_dispatch`; release-runbook reconciled.
841 - **Slash-menu layout jitter on Windows** — typing through a
842 `/foo` autocomplete used to shrink the matched-entry count,
843 which shrank the composer height every keystroke, which forced
844 the chat area above to repaint. On Windows 10 PowerShell + WSL
845 the per-cell write cost made the jitter visible. Composer now
846 reserves its panel-max envelope for the whole slash/mention
847 session so the chat-area Rect stays stable; the menu still
848 renders only the entries that actually match.
849
850 - **Linux ARM64 prebuilt binaries** — the release workflow now publishes
851 `deepseek-linux-arm64` and `deepseek-tui-linux-arm64` (built natively on
852 GitHub's `ubuntu-24.04-arm` runner). The npm wrapper picks them up
853 automatically on `arm64` Linux hosts, so HarmonyOS thin-and-light,
854 openEuler/Kylin, Asahi Linux, Raspberry Pi, AWS Graviton, etc. now work
855 with a plain `npm i -g deepseek-tui`.
856 - **Interactive TUI hangs on `working.` at 100% CPU (#549)** — the event
857 loop's blocking terminal poll starved the tokio runtime, preventing the
858 engine task from dispatching the API request. Fixed by yielding to the
859 scheduler before each poll cycle and clamping the event-poll timeout to
860 a minimum of 1ms so a zero-timeout hot-loop can't monopolize the thread.
861 - **Backspace key inserts "h" instead of deleting (#550)** — terminals
862 that send `^H` (Ctrl+H) for Backspace were not recognized. Added
863 `is_ctrl_h_backspace()` guard in both the composer and API-key input
864 handlers so Ctrl+H is treated as a delete, matching the existing
865 `KeyCode::Backspace` behavior.
866
867 ### Changed
868 - **npm `postinstall` failure messages** — when no prebuilt is available for
869 the host's `os.platform() / os.arch()` combo, the wrapper now prints the
870 full `cargo install` fallback recipe and a link to
871 [`docs/INSTALL.md`](docs/INSTALL.md) instead of just the bare error.
872 - **`DEEPSEEK_TUI_OPTIONAL_INSTALL=1`** — new env knob that downgrades a
873 postinstall failure to a warning + `exit 0`, so CI matrices that include
874 unsupported platforms don't fail the whole `npm install`.
875
876 ### Docs
877 - New [`docs/INSTALL.md`](docs/INSTALL.md) — every supported platform,
878 prebuilt vs. `cargo install` vs. manual download, cross-compiling x64 → ARM64
879 Linux with `cross` or `gcc-aarch64-linux-gnu`, and a troubleshooting section
880 covering the common `Unsupported architecture`, `MISSING_COMPANION_BINARY`,
881 and self-update mismatch errors.
882 - README and `README.zh-CN.md` now have an explicit **Linux ARM64** quickstart
883 pointing ARM64 users at `cargo install deepseek-tui-cli deepseek-tui --locked`
884 for v0.8.7 and at `npm i -g deepseek-tui` for v0.8.8+.
885
886 ### Releases
887 - npm wrapper publish remains manual (npm 2FA OTP requirement).
888 - GitHub release automation depends on `RELEASE_TAG_PAT` secret —
889 without it `auto-tag.yml` creates the tag but `release.yml`
890 doesn't fire.
891
892 ## [0.8.7] - 2026-05-03
893
894 ### Fixed
895 - **Selection across transcript cell types** — the selection-tightening from
896 v0.8.6 (#383) restricted copy/select to user and assistant message bodies
897 only, so text in system notes, thinking blocks, and tool output could not be
898 copied. v0.8.7 removes the body-start gate; the rendered transcript block is
899 fully selectable again.
900
901 ## [0.8.6] - 2026-05-03
902
903 ### Added
904 - **Long-session survivability by default** (#402) — capacity control and
905 compaction defaults are enabled, transcript history is bounded, persisted
906 sessions are capped, and oversized history folds into archived context
907 placeholders instead of freezing the TUI.
908 - **v0.8.6 feature batch** (#373-#402) — adds Goal mode, cache-hit chips,
909 cycle-boundary visualization, file-tree pane, `/share`, `/model auto`,
910 user-defined slash commands, `/profile`, LSP diagnostic wiring,
911 crash-recovery, self-update, `/init`, `/diff`, patch-aware `/undo`,
912 `/edit`, inline diff highlighting, smart clipboard, native-copy escape,
913 right-click context menus, clickable file:line styling, and MCP Phase A.
914
915 ### Fixed
916 - **Lag and rendering regressions** (#399, #400) — moves git/file-tree work
917 off the UI thread where possible, bounds render history, and tightens redraw
918 behavior to avoid sidebar/chat text bleed-through.
919 - **Release-hardening follow-ups** — `/share` now writes via secure temp files,
920 self-update uses secure same-directory temps with Windows-safe replacement,
921 and docs/rustfmt release gates are clean.
922
923 ## [0.8.4] - 2026-05-02
924
925 ### Added
926 - **Localization expansion (Phase 1, #285)** — every slash command's help
927 description, the full `/tokens` / `/cost` / `/cache` debug output, the
928 footer state and chip text, and the help-overlay section headings are
929 now translated for all four shipped locales (`en`, `ja`, `zh-Hans`,
930 `pt-BR`). Set the language with `/config locale zh-Hans` (or
931 `LANG=zh_CN.UTF-8` / `LC_ALL=zh_CN.UTF-8` from the shell). Non-Latin
932 scripts render via the same `unicode_width` plumbing the existing 27
933 chrome strings already use; the `shipped_first_pack_has_no_missing_core_messages`
934 test enforces full coverage across all four locales for every new
935 `MessageId`. Tool descriptions sent to the model and the base system
936 prompt intentionally remain English (training-data alignment, prefix
937 cache stability).
938 - Phase 1a (#294): 44 new IDs covering slash commands.
939 - Phase 1b (#295): 13 new IDs covering `/tokens` / `/cost` / `/cache`
940 debug output. Templates use `{placeholder}` substitution so a
941 translator can re-order args freely.
942 - Phase 1c (#296): 11 new IDs covering footer state, sub-agent chip,
943 quit-confirmation toast, and help-overlay section labels.
944 - **Stable cache prefix** (#263) — five companion fixes to keep the
945 DeepSeek prefix cache stable across turns: drop volatile fields from
946 the working-set summary block (#280, #287), place handoff and
947 working-set after the static prompt blocks (#288 → #292), memoise the
948 tool catalog so descriptions stay byte-stable (#289), sort
949 `project_tree` and `summarize_project` output (#290), and use a unique
950 fallback id for parallel streaming tool calls so downstream tool-result
951 routing doesn't match the first call twice (#291). The combined effect
952 is a meaningful jump in cache hit rate after the third turn.
953
954 ### Fixed
955 - **Agent-mode shell exec could not reach the network** (#272) — the seatbelt
956 default policy denies all outbound network including DNS, so any
957 `exec_shell` command needing the network (`curl`, `yt-dlp`, package
958 managers, …) failed in Agent mode unless the user dropped to Yolo. The
959 engine now elevates the sandbox policy to `WorkspaceWrite { network_access:
960 true, … }` for both Agent and Yolo. Plan mode is unchanged (read-only
961 investigation never registers the shell tool). The application-level
962 `NetworkPolicy` (`crates/tui/src/network_policy.rs`) remains the only
963 outbound-traffic boundary.
964 - **`/skill install <github-repo-url>` failed with `invalid gzip header`** (#269)
965 — `https://github.com/<owner>/<repo>` parsed as a raw direct URL, so the
966 installer downloaded the HTML repo page and tried to gzip-decode HTML.
967 Bare GitHub repo URLs (with or without `.git`, with or without `www.`,
968 with or without a trailing slash) now route to the `GitHubRepo` source the
969 same as `github:<owner>/<repo>`. URLs that already point at a specific
970 archive / blob / tree path still go through `DirectUrl`.
971 - **V4 Pro discount expiry extended** (#267) — DeepSeek extended the V4 Pro 75%
972 promotional discount from 2026-05-05 15:59 UTC to 2026-05-31 15:59 UTC. Without
973 this update the TUI would have started showing 4× the actual billed cost on
974 May 6 onwards. Verified at https://api-docs.deepseek.com/quick_start/pricing.
975
976 ## [0.8.3] - 2026-05-01
977
978 ### Fixed
979 - **Skills prompt referenced fabricated paths** — `render_available_skills_context`
980 rendered each skill's file as `<skills_dir>/<frontmatter-name>/SKILL.md`,
981 which did not exist when the directory name differed from the frontmatter
982 `name` (community installs, manually-placed skills). `Skill` now carries the
983 real path captured at discovery and renders that.
984 - **Missing-companion error was hostile to direct GitHub Release downloaders**
985 (#258) — replaced "Build workspace default members to install it" wall of
986 text with a concrete three-path checklist: `npm install -g deepseek-tui`,
987 `cargo install deepseek-tui-cli deepseek-tui --locked`, or downloading both
988 `deepseek-<platform>` AND `deepseek-tui-<platform>` from the same Release
989 page. `DEEPSEEK_TUI_BIN` stays as a power-user fallback.
990
991 ### Added
992 - **Privacy: `$HOME` contracts to `~` in viewer-visible paths** — the TUI,
993 `deepseek doctor`, `deepseek setup`, and onboarding now contract the home
994 directory to `~` in every path shown on screen, so screenshots, screencasts,
995 and pasted help output do not leak the OS account name. Persisted state,
996 audit log, session checkpoints, and LLM-bound system prompts intentionally
997 keep absolute paths for full fidelity.
998 - **`crates.io` badge** alongside the CI and npm badges in both English and
999 Simplified Chinese READMEs.
1000 - **Engine decomposition** (#227) — `core/engine.rs` is split into focused
1001 submodules (`engine/{streaming,turn_loop,dispatch,tool_setup,tool_execution,tool_catalog,context,approval,capacity_flow,lsp_hooks,tests}.rs`).
1002 No behavior change; preparation for the future agent-loop work.
1003
1004 ### Tests
1005 - RLM bridge: `batch_guard` extracted and tested for the empty-batch and
1006 oversize-batch invariants; depth-guard fallback covered (partial #231).
1007 - Persistence: schema-version rejection covered for `load_session`,
1008 `load_offline_queue_state`, `runtime_threads::load_turn`,
1009 `runtime_threads::load_item` (partial #233).
1010 - Command palette: `[disabled]` server description tag (closes the
1011 remaining #197 acceptance gap).
1012 - Protocol-recovery contract tests now scan the engine submodules in
1013 addition to `engine.rs` so the decomposition refactor doesn't silently
1014 hide the fake-wrapper marker assertions.
1015
1016 ### Issue triage
1017 - 10 issues closed with verification commits cited (#247, #235, #197,
1018 #250, #234, #243, #238, #236, #239, #195).
1019
1020 ## [0.8.2] - 2026-05-01
1021
1022 ### Fixed
1023 - **Windows release build (LNK1104)** — drop the `deepseek` shim binary in
1024 `crates/tui` that 0.8.1 introduced for the bundled `cargo install`. It
1025 produced a second `target/release/deepseek.exe` that collided with the
1026 `deepseek-tui-cli` artifact during workspace builds; the second linker
1027 invocation hit `LNK1104: cannot open file deepseek.exe` on Windows. The
1028 cli crate is now the single source of `deepseek`; workspace default
1029 members still produce both binaries (one per crate).
1030 - **npm wrapper offline robustness** — `bin/deepseek(-tui).js` no longer
1031 re-fetches the GitHub-hosted SHA-256 checksum manifest on every invocation.
1032 When the binary is already installed and its `.version` marker matches the
1033 package version, the wrapper trusts the local file. The manifest is fetched
1034 lazily on actual download (first install or `DEEPSEEK_TUI_FORCE_DOWNLOAD=1`),
1035 so GitHub flakes, captive portals, corporate proxies, and offline state no
1036 longer break every command.
1037
1038 ### Added
1039 - **Model-visible skills block** — installed skills (name, description, file
1040 path) are now exposed in the agent's system prompt under a `## Skills`
1041 section, with progressive disclosure: bodies stay on disk, the model opens a
1042 specific `SKILL.md` only when it decides to use that skill. Capped at a 12k
1043 prompt budget with 512-char per-description truncation. Threaded through
1044 `EngineConfig.skills_dir` so the TUI app, exec agent, and runtime thread
1045 manager all populate it from `Config::skills_dir()`.
1046 - **Simplified Chinese README** (`README.zh-CN.md`) with cross-link from the
1047 English README.
1048
1049 ### Changed
1050 - **`cargo install` UX** — to install the canonical `deepseek` command,
1051 `cargo install deepseek-tui-cli` (the historical path). The 0.8.1
1052 one-command flow (`cargo install deepseek-tui` providing both binaries) is
1053 reverted because it broke Windows release builds; install both packages
1054 separately if you want the TUI binary too.
1055
1056 ## [0.8.1] - 2026-05-01
1057
1058 ### Fixed
1059 - **One-command Cargo install** — `cargo install deepseek-tui --locked` now
1060 provides both the canonical `deepseek` dispatcher and the `deepseek-tui`
1061 companion binary from the main `deepseek-tui` package, so dispatcher
1062 subcommands such as `deepseek doctor --json` work without installing
1063 `deepseek-tui-cli` separately.
1064
1065 ## [0.8.0] - 2026-05-01
1066
1067 ### Fixed
1068 - **Shell FD leak / post-send lag** — completed background shell jobs now release
1069 their process, stdin, stdout, and stderr handles as soon as completion is
1070 observed, while keeping the job record inspectable. This prevents long-running
1071 TUI sessions from hitting `Too many open files (os error 24)`, which could
1072 make checkpoint saves fail and cause shell spawning, message send, close, and
1073 Esc/cancel paths to lag or fail.
1074 - **Windows REPL runtime CI startup** — Windows gets a longer Python bootstrap
1075 readiness timeout for the REPL runtime tests, matching GitHub runner startup
1076 contention without weakening bootstrap failures on other platforms.
1077
1078 ### Added
1079 - **China / mirror-friendly Cargo install docs** — README now documents
1080 installing through the TUNA Cargo mirror and direct release assets for users
1081 with slow GitHub/npm access.
1082
1083 ### Tests
1084 - Added a regression test proving completed background shell jobs drop their
1085 live process handles after `exec_shell_wait`.
1086 - Re-ran the focused shell cancellation and Python REPL runtime slices.
1087
1088 ## [0.7.9] - 2026-05-02
1089
1090 ### Fixed
1091 - **Post-turn freeze** — the checkpoint-restart cycle boundary (`maybe_advance_cycle`) now runs *before* `TurnComplete` emission instead of after, so the terminal is immediately responsive when the UI receives the completion event. The status chip ("↻ context refreshing…") remains visible during the cycle wait. (#234)
1092 - **Enter during streaming no longer corrupts the turn** — a new `QueueFollowUp` submit disposition parks the draft on `queued_messages` when the model is actively streaming text. Previously, pressing Enter during streaming would forward the message as a mid-turn steer, which could interfere with the in-flight response. The message now dispatches as a normal user message after `TurnComplete`. (#234)
1093 - **Idempotent Esc during fanout** — `finalize_active_cell_as_interrupted` and `finalize_streaming_assistant_as_interrupted` are now guarded by `Option::take()`. When Esc cancels a turn and the engine later delivers `TurnComplete(Interrupted)`, the second call is a no-op — no double `[interrupted]` prefix, no corrupted cell state. Regression test locks in the contract. (#243)
1094
1095 ### Tests
1096 - 2 new tests: `submit_disposition_queue_follow_up_when_streaming` (Enter/steering fix), `turn_complete_after_esc_is_idempotent` (Esc fanout double-call hardening)
1097 - 1 expanded test: `submit_disposition_queue_when_offline_and_busy` now covers streaming state
1098
1099 ## [0.7.8] - 2026-05-01
1100
1101 ### Added
1102 - **`exec_shell_cancel` tool** — cancel a running background shell task by id, or cancel all running tasks with `all: true`. Requires approval. (#248)
1103 - **Foreground-to-background shell detach** — press `Ctrl+B` while a foreground command is running to open shell controls and either detach the command to the background (where it can be polled via `exec_shell_wait`) or cancel the current turn. (#248)
1104 - **`exec_shell_wait` turn-cancellation awareness** — canceling a turn while `exec_shell_wait` is blocking now stops the wait but leaves the background task running, with `wait_canceled: true` in metadata. (#248)
1105 - **`ShellControlView` modal** (Ctrl+B) — two-option dialog (Background / Cancel) rendered as a popup over the transcript. (#248)
1106
1107 ### Changed
1108 - **`exec_shell` foreground path** now spawns all foreground commands through the background job table, enabling the detach-to-background flow. Metadata now includes `backgrounded: true/false`. (#248)
1109 - **`exec_shell_interact`** poll loop now observes the turn cancel token so stalled interactive sessions don't block turn cancellation. (#248)
1110 - **Transcript running-tool hint** — executing shell cells now show "Ctrl+B opens shell controls" while running. (#248)
1111 - **Keybinding registry** now includes `Ctrl+B` (opens shell controls) next to `Ctrl+C` (cancel/exits). (#248)
1112 - **Deferred swarm card creation** — `agent_swarm` no longer pre-seeds an all-pending FanoutCard from `ToolCallStarted`; the card is created only when the first `SwarmProgress` event carries real worker state. Until then the sidebar uses the declared task count as a pending dispatch placeholder. (#236, #238)
1113 - **Swarm wording normalized** — fanout-family fallback labels now render as `swarm`, matching the canonical `agent_swarm` / `rlm` model and avoiding mixed `fanout` / `swarm` terminology in the transcript. (#236, #238)
1114 - **OPERATIONS_RUNBOOK** and **TOOL_SURFACE** updated with new shell control paths and `exec_shell_cancel` documentation.
1115
1116 ### Fixed
1117 - **Nonblocking swarm state drift** — the sidebar no longer falls back to `0` or a contradictory seeded placeholder before the first progress event arrives, which removes the visible `pending` vs `running/done` mismatch during early `agent_swarm` dispatch. (#236, #238)
1118 - **Unicode-safe search globbing** — search wildcard matching now iterates on UTF-8 char boundaries instead of raw byte offsets, preventing panics on filenames like `dialogue_line__冰糖.mp3`. (#249)
1119
1120 ### Tests
1121 - 7 new integration tests: foreground-to-background detach, wait-cancel-leaves-process, single-task cancel, bulk cancel (kill-all), foreground-cancel-kills, ShellControlView default/select states
1122 - Expanded swarm/sidebar regression coverage for deferred card creation and pending-count fallback before first `SwarmProgress`. (#236, #238)
1123 - Added a Unicode filename regression test for wildcard search matching. (#249)
1124
1125 ## [0.7.7] - 2026-04-30
1126
1127 ### Added
1128 - **Checklist card rendering** — `checklist_write` / `todo_*` results now render as a purpose-built card with completed/total + percent header, per-item status markers (✅ / `●` / `○`), and a collapsing affordance for long lists. Plumbed through `GenericToolCell` so no new variant threading is needed. (#241)
1129 - **Context menu for transcript operations** — right-click or `Ctrl+M` opens a context-sensitive menu with Copy, Copy All, and selection-aware actions. (`crates/tui/src/tui/context_menu.rs`)
1130 - **Windows .exe sibling lookup** — `locate_sibling_tui_binary` in the CLI dispatcher finds `deepseek-tui.exe` on Windows, honours `DEEPSEEK_TUI_BIN` override, and falls back to suffix-less lookup. Tests lock in platform-correct name resolution and env override. (#247)
1131
1132 ### Changed
1133 - **Swarm/sub-agent canonical data model** — `SwarmTaskOutcome` and `SwarmOutcome` are now the single source of truth. Every UI surface (sidebar, transcript FanoutCard, footer) reads from `swarm_jobs` rather than maintaining parallel projections. (#236, #238)
1134 - **`swarm_card_index`** binds each swarm to its own FanoutCard by `swarm_id`, so overlapping fanouts no longer have one swarm's late progress clobber another's card. (#236, #238)
1135 - **Fanout-class tools suppressed from footer** — `agent_swarm`, `spawn_agents_on_csv`, `rlm`, and `agent_spawn` no longer appear as active tools in the status strip; sidebar and FanoutCard show the actual worker counts. (#236, #238)
1136 - **Esc clears active tool entries optimistically** — the active cell is finalized immediately on cancel rather than waiting for the engine's `TurnComplete` echo. Background `block:false` swarms remain durable and tracked through `swarm_jobs`. (#243)
1137 - **Post-turn workspace snapshot detached** — the snapshot still runs on `spawn_blocking` but the engine no longer awaits its `JoinHandle`, so the UI accepts input immediately after `TurnComplete`. (#234)
1138 - **Shell output preserves Cargo/test summaries under truncation** — high-signal tail lines (`test result:`, `failures:`, `error[E…]`, `Finished`, `Compiling`, panic markers) survive truncation so the agent doesn't re-run gates. (#242)
1139 - **Monotonic spend display** — `displayed_session_cost` + `displayed_cost_high_water` ensure the visible session+sub-agent total never decreases across reconciliation events (cache discounts, provisional → final). (#244)
1140 - Clipboard module expanded with additional platform-aware copy/paste paths. (`crates/tui/src/tui/clipboard.rs`)
1141 - Context inspector enriched with additional metadata columns and session-scoped agent state. (`crates/tui/src/tui/context_inspector.rs`)
1142 - Configuration documentation updated for v0.7.7 settings. (`docs/CONFIGURATION.md`, `docs/MODES.md`)
1143
1144 ### Fixed
1145 - **Windows npm install path** — the npm-distributed `deepseek` dispatcher now locates the platform-correct `deepseek-tui` binary (`.exe` suffix on Windows), fixing runtime failures for Windows users. (#247)
1146 - **Sidebar/transcript/footer agreement** — all three surfaces now agree on agent counts and status because they share the canonical `swarm_jobs` store. (#236, #238)
1147 - **Fanout card clobbering** — overlapping swarms no longer overwrite each other's progress cards. (#238)
1148 - **Cost display regression** — negative reconciliation events (cache-hit discount applied after provisional count) no longer briefly drop the displayed cost. (#244)
1149
1150 ### Tests
1151 - 65+ new/expanded tests: checklist card rendering, swarm card index binding, fanout tool suppression, Esc cancel contract, monotonic spend under reconciliation, shell summary preservation, Windows sibling binary lookup, clipboard platform paths, context menu state transitions
1152
1153 ### Added
1154 - **UI Localization registry** — `locale` setting in `settings.toml` (`auto`, `en`, `ja`, `zh-Hans`, `pt-BR`) with `LC_ALL`/`LC_MESSAGES`/`LANG` auto-detection. Core packs shipped for English, Japanese, Chinese Simplified, and Brazilian Portuguese covering composer placeholder, history search, `/config` chrome, and help overlay. Missing/unsupported locales fall back to English. (`crates/tui/src/localization.rs`, `docs/CONFIGURATION.md`)
1155 - **Grouped, searchable `/config` editor** — settings organized by section (Model, Permissions, Display, Composer, Sidebar, History, MCP) with live substring filter. Typing `j`/`k` navigates when the filter is empty; otherwise they enter the filter. (`crates/tui/src/tui/views/mod.rs`)
1156 - **Pending input preview widget** — while a turn is running, queued messages, pending steers, rejected steers, and context chips render above the composer. Three-row-per-message truncation with ellipsis overflow. (`crates/tui/src/tui/widgets/pending_input_preview.rs`)
1157 - **Alt+↑ edit-last-queued** — pops the most recently queued message back into the composer for editing. No-op when the composer is dirty. (`crates/tui/src/tui/app.rs`)
1158 - **Composer history search and draft recovery** — `Alt+R` opens a live substring search across `input_history` and `draft_history` (max 50 entries). `Enter` accepts, `Esc` restores the pre-search draft. Unicode case-insensitive matching. (`crates/tui/src/tui/app.rs`)
1159 - **Paste-burst detection** — fallback rapid-key paste detection independent of terminal bracketed-paste mode. Configurable via `paste_burst_detection` setting (default on). CRLF normalization (`\r\n` → `\n`, `\r` → `\n`). (`crates/tui/src/tui/paste_burst.rs`)
1160 - **Composer attachment management** — `↑` at the composer start selects the attachment row; `Backspace`/`Delete` removes it without editing placeholder text. (`crates/tui/src/tui/app.rs`)
1161 - **Searchable help overlay** — live substring filter across slash commands and keybindings, multi-term AND matching, localized chrome. (`crates/tui/src/tui/views/help.rs`)
1162 - **Keyboard-binding documentation catalog** — single source of truth for help overlay rendering. Documents 38+ keyboard chords across Navigation, Editing, Submission, Modes, Sessions, Clipboard, and Help sections. (`crates/tui/src/tui/keybindings.rs`)
1163 - **Legacy Rust deprecation audit** — non-destructive compatibility audit covering legacy MCP sync API, prompt constants, `/compact`, `todo_*` aliases, sub-agent aliases, provider `api_key` compatibility, model alias canonicalization, and palette aliases. Tracked by #218–#221. (`docs/LEGACY_RUST_AUDIT_0_7_6.md`)
1164
1165 ### Changed
1166 - **Shift+Tab cycles reasoning-effort** through Off → High → Max (three behaviorally distinct tiers). Previously Tab cycled modes; Shift+Tab is now the reasoning-effort shortcut. (`crates/tui/src/tui/app.rs:1119`)
1167 - **Reasoning-effort `Off` now sends `"off"`** to the API (was `None`). Allows explicit thinking disable. (`crates/tui/src/tui/app.rs`)
1168 - **Media `@`-mentions now emit `<media-file>` hints** directing users to `/attach` instead of inlining binary bytes. Tests lock in the contract. (`crates/tui/src/tui/file_mention.rs`)
1169 - **`/attach` rejects non-media files** with a descriptive error pointing to `@path` for text. (`crates/tui/src/commands/attachment.rs`)
1170 - **Configuration reference updated** to cover all v0.7.6 settings: `locale`, `paste_burst_detection`, `reasoning_effort`, `composer_density`, `sidebar_focus`, and more. (`docs/CONFIGURATION.md`)
1171
1172 ### Fixed
1173 - **Unicode-safe truncation** in pending-input preview and view text — no more mid-character breaks on multi-byte UTF-8. (`crates/tui/src/tui/widgets/pending_input_preview.rs`, `crates/tui/src/tui/views/mod.rs`)
1174 - **CJK/emoji display-width handling** in locale tests and config view rendering. (`crates/tui/src/localization.rs`)
1175 - **Context preview distinguishes `@media`, `/attach`, missing, and included files** with separate kind labels and inclusion status. (`crates/tui/src/tui/file_mention.rs`)
1176 - **Config view filter accept `j`/`k` only when filter is empty** — typing `j` or `k` into the filter field no longer navigates away. (`crates/tui/src/tui/views/mod.rs`)
1177
1178 ### Tests
1179 - 7 localization tests (tag normalization, env resolution, shipped pack completeness, missing-key fallback, Unicode width truncation)
1180 - 11 pending-input preview tests (context buckets, truncation, URL overflow, narrow-width)
1181 - 13 paste tests (burst detection, CRLF normalization, clipboard images, Unicode)
1182 - 9 draft/history search tests (match filter, unicode, accept/cancel, recovery)
1183 - 93 config tests (grouping, filter, edit, j/k, localization, escape/cancel)
1184 - 24 workspace tests (context refresh, scroll, mention completion)
1185 - 7 file-mention tests (context references, media/attach distinction, removability)
1186
1187 ## [0.7.1] - 2026-04-28
1188
1189 ### Added
1190 - Grouped active tool-call cards with compact rails and a live working-status row while tools run. (#142, #149)
1191 - Selected-card-aware Alt+V details so the visible or selected tool card opens the matching detail payload. (#143)
1192 - Compact terminal-native session context inspector with persisted `@path` and `/attach` reference metadata for resumed transcripts. (#146, #150)
1193
1194 ### Changed
1195 - Polished tool cards, diff summaries, and pending context previews for denser terminal-native scanning. (#141, #144, #145, #148)
1196 - Ranked Ctrl+P file-picker results with working-set relevance from modified files, recent `@file` mentions, and recent tool paths while keeping fuzzy filtering in memory. (#147)
1197
1198 ## [0.7.0] - 2026-04-28
1199
1200 ### Added
1201 - OS keyring-backed auth storage with `deepseek auth` subcommands, migration from plaintext config, provider-aware key resolution, and doctor visibility. (#134)
1202 - Egress network policy with allow/deny/prompt decisions, deny-wins matching, audit logging, and enforcement hooks for network-capable tools. (#135)
1203 - LSP diagnostics auto-injection after edits so compile feedback can be reinjected into the next agent turn. (#136)
1204 - Side-git workspace snapshots, `/restore`, and `revert_turn` so agent edits can be rolled back without moving the user's repository HEAD. (#137)
1205 - Esc-Esc backtrack over prior user turns, desktop turn-complete notifications, Alt+V tool-details access, safer command-prefix auto-allow matching, bundled `skill-creator`, and `/skill install` management for community skills. (#131, #132, #133, #138, #139, #140)
1206
1207 ### Changed
1208 - Split more engine/tool primitives into focused modules and workspace crates, including shared tool result primitives and extracted turn/capacity flow. (#67, #74)
1209
1210 ### Tests
1211 - Added mock LLM and skill-install integration coverage for streaming turns, reasoning replay, tool-call loops, network policy, and skill validation. (#69, #140)
1212
1213 ## [0.6.5] - 2026-04-27
1214
1215 ### Added
1216 - **`rlm_process` tool — recursive language model as a tool call.** The previous `/rlm` slash command had a UI rendering gap (the answer never made it back to the model's view) and required the user to remember to invoke it manually. `rlm_process` exposes the full RLM loop as a structured tool the model itself can choose, the same way it reaches for `agent_spawn` or `rlm_query`. Inputs: `task` (small instruction, shown to the root LLM each iteration) plus exactly one of `file_path` (workspace-relative, preferred — keeps the long input out of the model's context entirely) or `content` (inline, capped at 200k chars). Optional `child_model` (default `deepseek-v4-flash`) and `max_depth` (default 1, paper experiments). Returns the synthesized answer with metadata (iterations, duration, tokens, termination reason). Loaded across Plan / Agent / YOLO; never deferred via ToolSearch. (`crates/tui/src/tools/rlm_process.rs`)
1217 - **Reference-aligned REPL surface.** Aligned the in-REPL Python helpers with the canonical reference RLM (alexzhang13/rlm). The sub-agent now sees `context` (the full input, not `PROMPT`), `llm_query`, `llm_query_batched`, `rlm_query` (was `sub_rlm`), `rlm_query_batched`, `SHOW_VARS()`, `FINAL(...)`, `FINAL_VAR(...)`, plus `repl_get`/`repl_set`. Same prompt patterns and decomposition strategies from the paper now apply verbatim. (`crates/tui/src/repl/runtime.rs`)
1218 - **Concurrent fanout from inside the REPL.** `llm_query_batched(prompts, model=None)` runs up to 16 child completions in parallel via a new `POST /llm_batch` sidecar endpoint — much faster than serial `[llm_query(p) for p in prompts]`. `rlm_query_batched(prompts)` does the same for recursive RLM sub-calls via `POST /rlm_batch`. (`crates/tui/src/rlm/sidecar.rs`)
1219 - **`SHOW_VARS()`** — returns `{name: type-name}` for every user variable in the REPL. Lets the model inspect what it has accumulated across rounds before deciding whether to call `FINAL_VAR(name)`.
1220 - **Auto-persistence of REPL variables across rounds.** Any top-level JSON-serializable variable the sub-agent creates in a `repl` block now persists to the next round automatically — no `repl_set` ceremony needed unless you want explicit control. Matches the in-process reference REPL semantics.
1221
1222 ### Changed
1223 - **Code fence is `repl`, not `python`.** Matches the reference RLM language identifier so the same prompts and few-shot examples work here. Backward-compat fallback to `python` / `py` retained for older model behaviors.
1224 - **`FINAL` / `FINAL_VAR` parseable from raw response text.** The reference RLM lets the model write `FINAL(value)` on its own line outside any code block to terminate the loop. Added `parse_text_final()` so that path works alongside the existing in-REPL Python sentinel mechanism. Code-fenced occurrences of `FINAL(...)` are correctly ignored to avoid false positives.
1225 - **Strict termination loop.** The sub-agent must emit a ```repl block (or text-level FINAL) to make progress. One fence-less round triggers a reminder; two consecutive trigger a `RlmTermination::DirectAnswer` exit so we don't loop forever.
1226 - **`rlm_process` separates `task` (root_prompt) from `file_path`/`content` (context).** The `task` rides along as `root_prompt` and is shown to the root LLM each iteration; the big input lives only in the REPL as `context`. Mirrors the reference's `completion(prompt, root_prompt=...)` API.
1227 - **System prompt rewritten** with the reference's strategy patterns (PREVIEW → CHUNK + map-reduce via `llm_query_batched` → RECURSIVE decomposition via `rlm_query` → programmatic computation + LLM interpretation).
1228 - The `/rlm` slash command stays for manual experimentation but is no longer the recommended path; the description in `commands/mod.rs` now points the model toward `rlm_process` for the in-agent flow.
1229
1230 ### Reference
1231 - Zhang, Kraska, Khattab. "Recursive Language Models." arXiv:2512.24601.
1232 - alexzhang13/rlm — reference implementation by the paper authors. Variable names, helper surface, and code-fence convention align with that repo so prompts and patterns transfer.
1233
1234
1235 ### Fixed
1236 - **`/rlm` actually recurses now (Algorithm 1 substrate, paper-faithful).** The v0.6.3 RLM loop had the right *shape* but its recursive substrate was non-functional: `llm_query()` was a Python stub that returned a hardcoded string, and `child_model` was bound with an underscore prefix and silently dropped. The loop ran but the sub-LLM never fired. v0.6.4 fixes this end-to-end:
1237 - **HTTP sidecar.** Each RLM turn spins up a localhost-only axum server on a kernel-assigned port for the duration of the turn. Python's `llm_query()` and `sub_rlm()` are real `urllib.request.urlopen` POSTs; Rust services them via the existing DeepSeek client and returns the completion text. No long-lived python process, no FIFOs, no two-pass replay — Python blocks on HTTP, Rust answers it. (`crates/tui/src/rlm/sidecar.rs`)
1238 - **`child_model` is plumbed through.** `Op::RlmQuery` and `AppAction::RlmQuery` carry the configured child model (default `deepseek-v4-flash`) all the way to the sidecar, where every `llm_query()` call uses it. Token usage is folded into `RlmTurnResult.usage` so cost tracking works.
1239 - **`sub_rlm()` is exposed as a paper-faithful recursive RLM call.** The Python REPL gets a real `sub_rlm(prompt)` function that runs another full Algorithm-1 turn at depth-1 inside the same process (different sidecar route, decremented recursion budget). Default `max_depth = 2` from the `/rlm` command — the model can recurse twice before the budget hits zero. The recursive opaque-future cycle (`run_rlm_turn_inner` → `start_sidecar` → `sub_rlm_handler` → `run_rlm_turn_inner`) is broken by returning a concrete `Pin<Box<dyn Future + Send>>` from `run_rlm_turn_inner`.
1240 - **Strict termination.** The loop only ends via `FINAL(value)` (or the iteration cap). The previous "no fence = direct answer, end loop" early-exit deviated from the paper and could short-circuit on iteration 1 with a chatty model that never saw `PROMPT`. The new behavior tolerates one fence-less round (with a reminder appended), then falls back to a `RlmTermination::DirectAnswer` exit. `RlmTurnResult` now carries a `termination: RlmTermination` enum (`Final | DirectAnswer | Exhausted | Error`) so callers can tell what happened.
1241 - **Richer `Metadata(state)`.** The metadata message the root LLM sees now includes paper-required *access patterns* (`repl_get`, slicing, `splitlines`, `repl_set`, `llm_query`, `sub_rlm`, `FINAL`) and a live list of variable keys currently in the REPL state file — so the model can see what it's accumulated across rounds without us shipping the values themselves.
1242 - **Unicode-safe truncation.** `truncate_text` now counts Unicode codepoints (was mixing `text.len()` bytes with `chars().take(n)`), so multi-byte previews can no longer mis-count. Per-turn temp state files are cleaned up on completion. `ROOM_TEMPERATURE` typo → `ROOT_TEMPERATURE`.
1243 - **End-to-end smoke test.** `rlm::turn::tests::sidecar_url_is_exported_to_python_env` stands up a stand-in axum server that always replies `{"text":"pong-from-sidecar"}`, runs `print(llm_query('hello'))` in the real `PythonRuntime`, and asserts the reply round-trips. This catches future regressions in the sidecar URL passthrough.
1244
1245 ### Reference
1246 - Zhang, Kraska, Khattab. "Recursive Language Models." arXiv:2512.24601 (Algorithm 1).
1247
1248
1249 ### Added
1250 - **Sub-agents surface in the footer status strip.** When N > 0 sub-agents are in flight, the footer grows a "1 agent" / "N agents" chip in DeepSeek-sky color matching the model badge. Hides entirely at zero. (`footer_agents_chip` in `widgets/footer.rs`)
1251 - **`@`-mention popup is fully wired in the composer.** Previously only the App state fields existed (`mention_menu_selected`, `mention_menu_hidden`). The popup now renders below the input mirror-style with the slash menu, with `@`-prefixed entries; Up/Down navigates, Enter / Tab apply the selection, Esc hides until the next input edit. Mention takes precedence over slash because the positional check is stricter. (`visible_mention_menu_entries` + `apply_mention_menu_selection` in `file_mention.rs`)
1252
1253 ### Fixed
1254 - **Tool-call cells no longer flash `<command>` / `<file>` placeholders.** The engine used to emit `ToolCallStarted` from `ContentBlockStart` with `input: {}` — before any `InputJsonDelta` had streamed in — which baked the placeholder into the cell at creation time. The emission is now deferred to `ContentBlockStop` and routed through `final_tool_input`, so the cell is created with the parsed args already in hand. (engine.rs `final_tool_input`; engine/tests.rs `final_tool_input_*`)
1255 - **`parse_invocation_count` flake.** Two `markdown_render` tests both read the global PARSE_INVOCATIONS atomic and raced when other tests called `parse()` in parallel. Switched the counter to `thread_local!<Cell<u64>>`, so each test thread sees only its own invocations. Tested 8 sequential full-suite runs: 8/8 green (was ~40% green).
1256
1257 ### Changed
1258 - **System prompts redesigned with decomposition-first philosophy.** All four prompt tiers (base, agent, plan, yolo) now teach the model to decompose tasks before acting — `todo_write` first for granular task tracking, `update_plan` for high-level strategy, and sub-agents for parallelizable work. Inspired by the "mismanaged geniuses hypothesis" (Zhang et al., 2026): frontier LMs are already capable enough; the bottleneck is how we scaffold their self-management. The prompts now make work visible through the sidebar (Plan / Todos / Tasks / Agents) instead of letting the model work invisibly.
1259 - **Tool labels use progressive verbs.** "Read foo.rs" → "Reading foo.rs", "List X" → "Listing X", "Search pattern" → "Searching for `pattern`", "List files" → "Listing files". Past-tense labels read wrong while a tool is still in flight; the new forms match what the user actually sees.
1260 - **Long-running tools grow an elapsed badge.** From 3 s onward the `running` status segment becomes `running (3s)`, `running (4s)`, … so the user can tell a tool isn't stuck. The status-animation tick (360 ms) drives the redraw; below 3 s the badge stays hidden so quick reads/greps don't churn. (history.rs `running_status_label_with_elapsed`)
1261 - **Spinner pulse is twice as fast** — `TOOL_STATUS_SYMBOL_MS` 1800 ms → 720 ms per glyph (full 4-glyph heartbeat in ~2.88 s instead of ~7.2 s).
1262 - **`tools/subagent.rs` is now a folder module.** Tests live in `tools/subagent/tests.rs`; runtime + manager + tool implementations stay in `tools/subagent/mod.rs`. Public API unchanged. The runtime / tool-impl split was deferred — `SubAgentTask`, `run_subagent_task`, `build_allowed_tools`, the agent prompt constants, and `normalize_role_alias` are referenced from both layers and need a small API design pass before they cleanly separate.
1263
1264 ### Test hygiene
1265 - **5 regression tests pin auto-scroll churn contract.** `mark_history_updated` does not scroll; tool-cell handlers only `mark_history_updated`; `add_message` and `flush_active_cell` gate on `user_scrolled_during_stream`; the per-stream lock clears at TurnComplete and when the user returns to the live tail. (P2.4)
1266
1267 ## [0.6.1] - 2026-04-26
1268
1269 ### Changed
1270 - **V4 cache-hit input prices cut to 1/10th per DeepSeek's pricing update.** Pro promo 0.03625→0.003625, Pro base 0.145→0.0145, Flash 0.028→0.0028 per 1M tokens. Cache-miss and output rates unchanged.
1271 - **Removed the "light" theme option.** It was never tested, looked bad, and the dark/whale palettes are the supported targets. Theme validation now accepts only `default`, `dark`, and `whale`.
1272 - **System prompts redesigned with decomposition-first philosophy.** All five prompt tiers teach the model to `todo_write` before acting, `update_plan` for strategy, and sub-agents for parallel work. Inspired by the mismanaged-geniuses hypothesis (Zhang et al., 2026).
1273
1274 ## [0.6.0] - 2026-04-25
1275
1276 ### Added
1277 - **`rlm_query` tool — recursive language models as a first-class structured tool.** Inspired by [Alex Zhang's RLM work](https://github.com/alexzhang13/rlm) and Sakana AI's published novelty-search research, but trimmed to what an agent loop actually needs. The model calls `rlm_query` with one prompt or up to 16 concurrent prompts; children run on `deepseek-v4-flash` by default and can be promoted to Pro per-call. Children dispatch concurrently via `tokio::join_all` against the existing DeepSeek client — no external runtime, no fenced-block DSL, no Python sandbox. Returns plain text for one prompt, indexed `[0] ...\n\n---\n\n[1] ...` blocks for many. Available in Plan / Agent / YOLO. Cost is folded into the session's running total automatically.
1278
1279 ### Changed
1280 - **Scroll position survives content rewrites (#56).** `TranscriptScroll::resolve_top` and `scrolled_by` no longer teleport to bottom when the anchor cell vanishes. Three-level fallback chain: same line → same cell, line 0 → nearest surviving cell at-or-before. Previously, any rewrite of the assistant message (e.g. tool-result replacement) silently dropped the user back to the live tail mid-scroll.
1281 - **Looser command-safety chains (#57).** `cargo build && cargo test`, `git fetch && git rebase`, and similar chains of known-safe commands now escalate to `RequiresApproval` instead of being hard-blocked as `Dangerous`. Chains containing unknown commands still block.
1282 - **`GettingCrowded` no longer surfaces a footer chip.** The context-percent header already covers conversation pressure; the chip now only fires for active engine interventions (`refreshing context`, `verifying`, `resetting plan`).
1283
1284 ## [0.5.2] - 2026-04-25
1285
1286 ### Added
1287 - **`/model` opens a Pro/Flash + thinking-effort picker (#39).** Typing `/model` with no argument now pops a two-pane modal: model on the left (`deepseek-v4-pro` flagship, `deepseek-v4-flash` fast/cheap, plus a "current (custom)" row when the active id isn't one of the listed defaults), and thinking effort on the right. Tab/←/→ swaps panes, ↑/↓ moves within the focused pane, Enter applies both selections, Esc cancels. The effort pane intentionally exposes only **Off / High / Max** because [DeepSeek's Thinking Mode docs](https://api-docs.deepseek.com/guides/reasoning_model) state `low`/`medium` are mapped to `high` server-side and `xhigh` is mapped to `max` — the legacy variants stay valid in `~/.deepseek/settings.toml` for back-compat, the picker just doesn't surface them. Apply path persists `default_model` and `reasoning_effort` to settings, forwards `Op::SetModel` + `Op::SetCompaction` to the running engine so the next turn picks up the change without a restart, and resets the per-turn token gauges (cache, replay) so the footer numbers reflect the new model. `/model <id>` keeps working unchanged for power users.
1288
1289 ## [0.5.1] - 2026-04-25
1290
1291 ### Added
1292 - **`fetch_url` tool** for direct HTTP GET on a known URL — complements `web_search` for cases where the link is already known. Supports `format` (`markdown` / `text` / `raw`), `max_bytes` (default 1 MB, hard cap 10 MB), `timeout_ms` (default 15 s, max 60 s), redirect following, and structured `{url, status, content_type, content, truncated}` responses. 4xx/5xx bodies are returned (with `success: false`) so the caller can read JSON error envelopes. (#33)
1293 - **PDF support in `read_file`.** PDFs are auto-detected by extension or `%PDF-` magic bytes and extracted via `pdftotext -layout` (poppler) when available. New optional `pages` arg (`"5"` or `"1-10"`) reads page slices. Without `pdftotext`, returns a structured `{type: "binary_unavailable", kind: "pdf", reason, hint}` with install commands for macOS/Debian. (#34)
1294 - **Reasoning-content replay telemetry, end-to-end (#30).** The chat-completions sanitizer now estimates replayed `reasoning_content` tokens (~4 chars/token), threads the value through the streaming `Usage` payload, stores it on the App, and renders an `rsn N.Nk` chip in the footer next to the cache hit-rate. The chip turns warning-coloured when replay tokens exceed 50% of the input budget, so users on long thinking-mode loops can see at a glance how much of their context window is going to V4's "Interleaved Thinking" replay (paper §5.1.1). Logged at `RUST_LOG=deepseek_tui=info` for tail-friendly diagnosis.
1295 - **`@file` Tab-completion (#28).** Typing `@<partial>` and pressing Tab now resolves the mention against the workspace using the existing `ignore::WalkBuilder`. A unique match is spliced into the input; multiple matches with a longer common prefix extend the partial; remaining ambiguity is surfaced via the status line. The mention-expansion path that ships file contents to the model is unchanged — this is purely a discovery aid for typing the path. Inline-contents and a fuzzy popup picker are queued for v0.5.2.
1296 - **Per-workspace external trust list (#29).** `~/.deepseek/workspace-trust.json` now records, for each workspace, the absolute paths the user has opted into reading/writing from outside that workspace. The new `/trust` slash command supports `add <path>`, `remove <path>`, `list`, `on`, `off`, and a status read with no args; the engine consults the list when constructing every `ToolContext` so changes apply on the next tool call without restart. `/diagnostics` surfaces the list. The interactive "Allow once / Always allow / Deny" approval prompt is deferred — for now grant access ahead of the turn with `/trust add <path>`.
1297
1298 ### Fixed
1299 - **TUI sidebar gutter bleed regression test (#36).** Snapshot tests now lock in that long single-line tool results — including a `todo_write` echo of a multi-kilobyte JSON payload — never write any cells outside `chat_area` at the widths reported in the bug (80, 120, 165, 200 cols). A second test verifies the scrollbar coexists with content along the right edge instead of overdrawing the penultimate column.
1300 - **Version drift caught in CI.** New `versions` job in `.github/workflows/ci.yml` runs `scripts/release/check-versions.sh` on every push/PR, verifying every per-crate `Cargo.toml` inherits the workspace version, the npm wrapper matches the workspace version, and `Cargo.lock` is in sync. The release runbook now lists `check-versions.sh` as the first preflight step. (#31)
1301 - **Per-mode soft context budget for V4 compaction trigger** (#27).
1302 - **Phantom `web.run` references stripped** from prompts and the `web_search` tool surface (#25).
1303 - **Unused import + `cargo fmt` drift** that landed with `feat(#27)` and broke Build / Test / npm wrapper smoke under `-Dwarnings`.
1304
1305 ## [0.5.0] - 2026-04-25
1306
1307 ### Fixed
1308 - Multi-turn tool calls on thinking-mode models no longer return HTTP 400. Every assistant message in the conversation now carries `reasoning_content` when thinking is enabled — not just tool-call rounds — matching DeepSeek's actual API validation, which rejects any assistant message missing the field even though the docs describe non-tool-call reasoning as "ignored".
1309 - Added a final-pass wire-payload sanitizer in the chat-completions client that forces a non-empty `reasoning_content` placeholder onto any assistant message still missing one at request time. This is the last line of defense after engine-side and build-side substitution, so sessions restored from older checkpoints, sub-agents that append messages directly, and cached prefix mismatches all produce a valid request.
1310 - On a `reasoning_content`-related 400, the client now logs the offending message indices to make future regressions diagnosable.
1311 - Stripped phantom `web.run` references from prompts and the `web_search` tool surface ([#25](https://github.com/Hmbown/DeepSeek-TUI/issues/25)).
1312
1313 ### Changed
1314 - Header/UI widget refactor in the TUI (`crates/tui/src/tui/ui.rs`, `widgets/header.rs`) — internal cleanup, no user-visible behavior change.
1315
1316 ## [0.4.9] - 2026-04-27
1317
1318 ### Fixed
1319 - DeepSeek thinking-mode tool-call rounds now always replay `reasoning_content` in all subsequent requests (including across new user turns), matching DeepSeek's documented API contract that assistant messages with tool calls must retain their reasoning content forever.
1320 - Missing `reasoning_content` on a tool-call assistant message now substitutes a safe placeholder (`"(reasoning omitted)"`) instead of dropping the tool calls and their matching tool results, preventing orphaned conversation chains and API 400 errors.
1321 - Session checkpoint now persists a Thinking-block placeholder for tool-call turns that produced no streamed reasoning text, keeping on-disk sessions structurally correct so subsequent requests avoid HTTP 400 rejections.
1322 - Token estimation for compaction now counts thinking tokens across all tool-call rounds (not just the current user turn), aligning with the updated reasoning_content replay rule.
1323
1324 ## [0.4.8] - 2026-04-25
1325
1326 ### Fixed
1327 - DeepSeek V4 Pro cost estimates now use DeepSeek's current limited-time 75% discount until 2026-05-05 15:59 UTC, then automatically fall back to the base Pro rates.
1328
1329 ## [0.4.5] - 2026-04-24
1330
1331 ### Fixed
1332 - Alternate-screen TUI sessions now capture mouse input by default so wheel scrolling moves the transcript instead of exposing terminal scrollback from before the TUI started. Use `--no-mouse-capture` or `tui.mouse_capture = false` when terminal-native drag selection is preferred.
1333
1334 ## [0.4.2] - 2026-04-24
1335
1336 ### Fixed
1337 - DeepSeek V4 thinking-mode tool turns now checkpoint the engine's authoritative API transcript, including assistant `reasoning_content` on reasoning-to-tool-call turns with no visible assistant text.
1338 - Chat Completions request building now drops stale V4 tool-call rounds that are missing required `reasoning_content`, preventing old corrupted checkpoints from triggering DeepSeek HTTP 400 replay errors.
1339 - Web search now falls back to Bing HTML results when DuckDuckGo returns a bot challenge or otherwise yields no parseable results.
1340
1341 ## [0.4.1] - 2026-04-24
1342
1343 ### Fixed
1344 - DeepSeek V4 tool-result context now preserves large file reads and command outputs instead of compacting noisy tools to a 900-character snippet after 2k characters.
1345 - Capacity guardrail refresh no longer performs destructive summary compaction unless the normal model-aware compaction thresholds are actually crossed.
1346 - V4 compaction summaries retain larger tool-result excerpts and summary input when compaction is genuinely needed.
1347 - The transcript now follows the bottom again when sending a new message, shows an in-app scrollbar when internally scrolled, and leaves mouse capture off in `--no-alt-screen` mode so terminal-native scrolling can work.
1348
1349 ## [0.4.0] - 2026-04-23
1350
1351 ### Added
1352 - **DeepSeek V4 support**: `deepseek-v4-pro` (flagship) and `deepseek-v4-flash` (fast/cheap) are now first-class model IDs with 1M context windows.
1353 - **Reasoning-effort tier**: new `reasoning_effort` config field (`off | low | medium | high | max`) mapped to DeepSeek's `reasoning_effort` + `thinking` request fields. Defaults to `max`.
1354 - **Shift+Tab cycles reasoning-effort** through the three behaviorally distinct tiers (`off → high → max`). The current tier is shown as a ⚡ chip in the header.
1355 - Per-model pricing table: `deepseek-v4-pro` priced at $0.145/$1.74/$3.48 per 1M tokens (cache-hit/miss/output); `deepseek-v4-flash` and legacy aliases at $0.028/$0.14/$0.28.
1356
1357 ### Changed
1358 - **Default model flipped to `deepseek-v4-pro`** (from `deepseek-reasoner`).
1359 - `deepseek-chat` / `deepseek-reasoner` remain as silent aliases of `deepseek-v4-flash` for API compatibility; priced identically.
1360 - **Context compaction**: 1M-context V4 models now compact at 800k input tokens or 2,000 messages, so short/tool-heavy sessions do not compact as if they were 128k-context runs.
1361 - Cycling modes is now Tab-only; Shift+Tab is repurposed for reasoning-effort (reverse-mode cycle was low-value with only three modes).
1362 - Updated help/hint strings, validator error messages, and the model picker to reference V4 IDs.
1363
1364 ### Fixed
1365 - `requires_reasoning_content` now recognizes `deepseek-v4*` so thinking streams render correctly on V4 models.
1366 - DeepSeek V4 thinking-mode tool calls now preserve prior assistant `reasoning_content` whenever a tool call is replayed, matching DeepSeek's multi-turn contract and avoiding HTTP 400 rejections on later turns.
1367 - Raw Chat Completions requests now send DeepSeek's top-level `thinking` parameter instead of the OpenAI SDK-only `extra_body` wrapper.
1368 - Config, env, and UI model selection now normalize legacy DeepSeek aliases to `deepseek-v4-flash` instead of preserving old model labels.
1369 - npm wrapper first-run downloads now use process-unique temp files so concurrent `deepseek` / `deepseek-tui` invocations do not race on `*.download` files.
1370
1371 ## [0.3.33] - 2026-04-11
1372
1373 ### Changed
1374 - Footer polish: simplified footer rendering, removed footer clock label, updated status line layout
1375 - Palette cleanup: removed `FOOTER_HINT` color constant
1376
1377 ### Removed
1378 - `FOOTER_HINT` color constant from palette (use `TEXT_MUTED` or `TEXT_HINT` instead)
1379
1380 ### Fixed
1381 - Test updates to align with simplified footer logic
1382 - Empty state placeholder text removed for cleaner UI
1383
1384 ## [0.3.32] - 2026-04-11
1385
1386 ### Added
1387 - Finance tool: Yahoo Finance v8 quote endpoint with chart fallback, supporting stocks, ETFs, indices, forex, and crypto lookups.
1388 - Header widget redesign: proportional truncation, context-usage bar with gradient fill, streaming indicator, and graceful narrow-terminal degradation.
1389 - Expanded test coverage: 680+ tests including footer state, context spans, plan prompt lifecycle, workspace context refresh, header rendering, and finance tool integration tests with wiremock.
1390 - Workspace context refresh with configurable TTL and deferred initial fetch.
1391 - Config command additions for runtime settings management.
1392
1393 ### Changed
1394 - Redesigned footer status strip with mode/model/status layout, context bar, and narrow-terminal fallback.
1395 - Plan prompt now uses numeric selection (1-4) instead of keyword input; old aliases are sent as regular messages.
1396 - Archived outdated docs (`workspace_migration_status.md` -> `docs/archive/`).
1397 - Trimmed AGENTS.md boilerplate and updated task counts.
1398 - Clarified release-surface documentation: crates.io publication may lag the workspace/npm wrapper.
1399
1400 ### Fixed
1401 - Header `metadata_spans` now uses `saturating_sub` to prevent underflow on narrow terminals.
1402 - Finance tool reuses a single HTTP client instead of rebuilding per request.
1403 - Finance tool tests no longer leak temp directories.
1404
1405 ## [0.3.31] - 2026-03-08
1406
1407 ### Added
1408 - Replaced the finance tool backend with Yahoo Finance v8 + CoinGecko fallback for reliable real-time market data (stocks, ETFs, indices, forex, crypto).
1409 - Added compaction UX: status strip shows animated COMPACTING indicator during context summarization, footer reflects compaction state, and CompactionCompleted events now include message count statistics.
1410 - Added send flash: brief tinted background highlight on the last user message after sending.
1411 - Added braille typing indicator with smooth 10-frame animation cycle.
1412
1413 ### Changed
1414 - Redesigned the footer status strip with mode/model/token/cost layout, quadrant separators, and a context-usage bar.
1415 - Added Unicode prefix indicators (▸ You, ◆ Answer, ● System) to chat history cells for visual distinction.
1416 - Improved thinking token delineation with labeled delimiters in transcript rendering.
1417 - Refactored source code into workspace crates for better modularity and dependency management.
1418
1419 ### Fixed
1420 - Fixed Plan mode ESC key dismissing the prompt without clearing `plan_prompt_pending`, which prevented the prompt from reappearing on subsequent plan completions.
1421 - Fixed clippy lint (collapsible_if) in web browsing session management.
1422
1423 ## [0.3.30] - 2026-03-06
1424
1425 ### Added
1426 - Added a release-ready local npm smoke path that builds binaries, serves release assets locally, packs the wrapper, installs the tarball, and checks both entrypoints before publish.
1427 - Added an opt-in full-matrix local release-asset fixture so `npm run release:check` can be exercised before GitHub release assets exist.
1428
1429 ### Changed
1430 - Bumped the Rust workspace crates and npm wrapper to `0.3.30`.
1431 - Pointed the npm wrapper's default `deepseekBinaryVersion` at `0.3.30` for the next coordinated Rust + npm release.
1432 - Updated the crates dry-run helper to work from a dirty workspace and to preflight dependent workspace crates without requiring unpublished versions to already exist on crates.io.
1433
1434 ## [0.3.29] - 2026-03-03
1435
1436 ### Added
1437 - Added npm publish-time release asset verification for the `deepseek-tui` package to fail fast when expected GitHub binaries are missing.
1438 - Added checksum manifests to GitHub release assets and checksum verification in the npm installer.
1439 - Added `npm pack` install-and-smoke CI coverage for the `deepseek-tui` wrapper package.
1440 - Added an end-to-end release runbook covering crates.io, GitHub Releases, and npm publication.
1441
1442 ### Changed
1443 - Updated npm package documentation for clearer install modes, environment overrides, and release integrity behavior.
1444 - Improved installer support-matrix error messaging for unsupported platform/architecture combinations.
1445 - Decoupled npm package version from default binary artifact version via `deepseekBinaryVersion`, enabling packaging-only npm releases.
1446 - Moved the `deepseek-tui` binary target inside `crates/tui` so `cargo publish --dry-run -p deepseek-tui` works from the workspace package layout.
1447 - Replaced the root-level crates publish workflow with an ordered workspace publish flow.
1448 - Reworked first-run onboarding and README copy around primary workflows instead of shortcut memorization.
1449 - Relaxed onboarding API-key format heuristics so unusual keys warn instead of blocking setup.
1450
1451 ## [0.3.28] - 2026-03-02
1452
1453 ### Added
1454 - Converted the project to a modular Cargo workspace using a `crates/` layout.
1455 - Added new crate boundaries mirroring a deepseek architecture (`agent`, `config`, `core`, `execpolicy`, `hooks`, `mcp`, `protocol`, `state`, `tools`, `tui-core`, `tui`, and `app-server`).
1456
1457 ### Changed
1458 - Added parity CI coverage with protocol/state/snapshot checks.
1459 - Updated release workflow to build both `deepseek` and `deepseek-tui` binaries.
1460
1461 ## [0.3.26] - 2026-03-02
1462
1463 ### Fixed
1464 - Resolved SSE stream corruption caused by byte/string position mismatch in streaming parse flow.
1465 - Hardened base URL validation to reject non-HTTP/HTTPS schemes.
1466 - Prevented multi-byte UTF-8 truncation panics in common-prefix and runtime thread summary paths.
1467 - Corrected context usage alert thresholds by separating warning and critical trigger levels.
1468
1469 ### Changed
1470 - Removed non-code utility tools from the runtime tool registry (`calculator`, `weather`, `sports`, `finance`, `time`) and related wiring.
1471 - Consolidated duplicate URL encoding helpers by delegating to shared `crate::utils::url_encode`.
1472 - Replaced broad crate-level lint suppressions with targeted `#[allow(...)]` annotations where justified.
1473 - Cleaned up dead APIs, unused struct fields, unused builder helpers, and non-integrated modules.
1474 - Addressed clippy findings across the codebase (collapsible conditionals, defaults, indexing helpers, and API signature cleanup).
1475
1476 ## [0.3.24] - 2026-02-25
1477
1478 ### Fixed
1479 - Preserve reasoning-only assistant turns for DeepSeek reasoning models (`deepseek-reasoner`, R-series markers) when rebuilding chat history.
1480 - Align SSE tool streaming indices so each tool block start/delta/stop uses the same block index.
1481 - Prevent transcript auto-scroll-to-bottom when a non-empty transcript selection is active.
1482 - Allow session picker search mode to accept the current selection with a single `Enter` press.
1483 - Preserve tool output whitespace/indentation while still wrapping long unbroken tokens.
1484 - Make transcript selection copy/highlighting display-width aware (wide chars and tabs).
1485 - Gate execpolicy behavior on the `exec_policy` feature flag across CLI/tool execution paths.
1486 - Run doctor API connectivity checks using the effective loaded config/profile (instead of reloading defaults).
1487 - Parse DeepSeek model context-window suffix hints such as `-32k` and `-256k`.
1488 - Update README config docs with key environment overrides and a direct link to full configuration docs.
1489
1490 ## [0.3.23] - 2026-02-24
1491
1492 ### Changed
1493 - Updated project copy to describe the app as a terminal-native TUI/CLI for DeepSeek models (not pinned to a specific model generation).
1494
1495 ### Fixed
1496 - Model selection and config validation now accept any valid `deepseek-*` model ID (including future releases), while still normalizing common aliases like `deepseek-v3.2` and `deepseek-r1`.
1497 - Tool-call recovery now auto-loads deferred tools when the model requests them directly, instead of failing with manual `tool_search_*` instructions.
1498 - YOLO mode now preloads tools by default (including deferred MCP tools), so model tool calls can run immediately without discovery indirection.
1499 - Unknown tool-call failures now include discovery guidance and nearest tool-name suggestions instead of generic availability errors.
1500 - Slash-command errors now suggest the closest known command (for example `/modle` -> `/model`) instead of only returning a generic unknown-command message.
1501
1502 ## [0.3.22] - 2026-02-19
1503
1504 ### Added
1505 - Interactive `/config` editing modal for runtime settings updates.
1506
1507 ### Changed
1508 - Retired user-facing `/set` command path (no longer reachable/discoverable).
1509 - Replaced `/deepseek` command behavior with `/links` (aliases: `dashboard`, `api`).
1510
1511 ### Fixed
1512 - Legacy `/set` and `/deepseek` inputs now return migration guidance instead of generic unknown-command errors.
1513
1514 ## [0.3.21] - 2026-02-19
1515
1516 ### Added
1517 - Parallel tool execution in `multi_tool_use.parallel` for independent task workflows.
1518 - Session resume-thread coverage in tests.
1519
1520 ### Changed
1521 - Desktop and web parity polish across the TUI and runtime surfaces.
1522 - Onboarding and approval UX refinement from prior phase 3 iteration.
1523
1524 ### Fixed
1525 - Runtime pre-release startup issues and config-path edge cases.
1526 - Clippy lint regressions introduced by the last parity pass.
1527
1528 ### Security/Hardening
1529 - General pre-release hardening for runtime app behavior.
1530
1531 ## [0.3.17] - 2026-02-16
1532
1533 ### Fixed
1534 - Config loading now expands `~` in `DEEPSEEK_CONFIG_PATH` and `--config` paths.
1535 - When `DEEPSEEK_CONFIG_PATH` points to a missing file, config loading now falls back to `~/.deepseek/config.toml` if it exists.
1536
1537 ### Changed
1538 - Removed committed transient runtime artifacts (`session_*.json`, `.deepseek/trusted`) and added ignore rules to prevent re-commit.
1539
1540 ## [0.3.16] - 2026-02-15
1541
1542 ### Added
1543 - `deepseek models` CLI command to fetch and list models from the configured `/v1/models` endpoint (with `--json` output mode).
1544 - `/models` slash command to fetch and display live model IDs in the TUI.
1545 - Slash-command autocomplete hints in the composer plus `Tab` completion for `/` commands.
1546 - Command palette modal (`Ctrl+K`) for quick insertion of slash commands and skills.
1547 - Persistent right sidebar in wide terminals showing live plan/todo/sub-agent state.
1548 - Expandable tool payload views (`v` in transcript, `v` in approval modal) for full params/output inspection.
1549 - Runtime HTTP/SSE API (`deepseek serve --http`) with durable thread/turn/item lifecycle, interrupt/steer, and replayable event timeline.
1550 - Background task queue (`/task add|list|show|cancel` and `POST /v1/tasks`) with persistent storage, bounded worker pool, and timeline/artifact tracking.
1551
1552 ### Changed
1553 - Centralized the default text model (`DEFAULT_TEXT_MODEL`) and shared common model list to reduce drift across runtime/config paths.
1554 - `/model` now clarifies that any valid DeepSeek model ID is accepted (including future releases), while still showing common model IDs.
1555
1556 ### Fixed
1557 - Expanded reasoning-model detection for chat history reconstruction (supports R-series and reasoner-style naming without hardcoding single versions).
1558 - Aligned docs/config examples with the then-current runtime default model.
1559
1560 ## [0.3.14] - 2026-02-05
1561
1562 ### Added
1563 - `web.run` now supports `image_query` (DuckDuckGo image search)
1564 - `multi_tool_use.parallel` now supports safe MCP meta tools (`list_mcp_resources`, `mcp_read_resource`, etc.)
1565
1566 ### Fixed
1567 - Encode tool-call function names when rebuilding Chat Completions history (keeps dotted tool names API-safe)
1568
1569 ### Changed
1570 - Prompts: stronger `web.run` citation placement and quote-limit guidance
1571
1572 ## [0.3.13] - 2026-02-04
1573
1574 ### Fixed
1575 - Restore an in-app scrollbar for the transcript view
1576
1577 ## [0.3.12] - 2026-02-04
1578
1579 ### Fixed
1580 - Map dotted tool names to API-safe identifiers for DeepSeek tool calls
1581 - Encode any invalid tool names for API tool lists while preserving internal names
1582
1583 ## [0.3.11] - 2026-02-04
1584
1585 ### Fixed
1586 - Fix tool name mapping for DeepSeek API
1587
1588 ## [0.3.10] - 2026-02-04
1589
1590 ### Fixed
1591 - Always enable mouse wheel scrolling in the TUI (even without alt screen)
1592
1593 ## [0.3.9] - 2026-02-04
1594
1595 ### Removed
1596 - RLM mode, tools, and documentation pending a faithful implementation of the MIT RLM design
1597 - Duo mode tools and prompts pending a citable research spec
1598
1599 ### Fixed
1600 - Footer context usage bar remains visible while status toasts are shown
1601
1602 ### Changed
1603 - Updated prompts and docs to reflect the simplified mode/tool surface
1604
1605 ## [0.3.8] - 2026-02-03
1606
1607 ### Fixed
1608 - Resolve clippy warnings (CI `-D warnings`) in new tool implementations
1609
1610 ## [0.3.7] - 2026-02-03
1611
1612 ### Added
1613 - Tooling parity updates: `weather`, `finance`, `sports`, `time`, `calculator`, `request_user_input`, `multi_tool_use.parallel`, `web.run`
1614 - Shell streaming helpers: `exec_shell_wait` and `exec_shell_interact`
1615 - Sub-agent controls: `send_input` and `wait` (with aliases)
1616 - MCP resource helpers: `list_mcp_resources`, `list_mcp_resource_templates`, and `read_mcp_resource` alias
1617
1618 ### Changed
1619 - Skills directory selection now prefers workspace `.agents/skills`, then `./skills`, then global
1620 - Docs and prompts updated to reflect new tool surface and parity notes
1621
1622 ## [0.3.6] - 2026-02-02
1623
1624 ### Added
1625 - New welcome banner on startup showing "Welcome to DeepSeek TUI!" with directory, session ID, and model info
1626 - Visual context progress bar in footer showing usage with block characters [████░░░░░░] and percentage
1627
1628 ### Changed
1629 - Removed custom block-character scrollbar from chat area - now uses terminal's native scroll
1630 - Simplified header bar: removed context percentage indicator (moved to footer as progress bar)
1631
1632 ## [0.3.5] - 2026-01-30
1633
1634 ### Added
1635 - Intelligent context offloading: large tool results (>15k chars) are automatically moved to RLM memory to preserve the context window
1636 - Persistent history context: compacted messages are offloaded to RLM `history` variable for recall
1637 - Full MCP protocol support: SSE transport, Resources (`resources/list`, `resources/read`), and Prompts (`prompts/list`, `prompts/get`)
1638 - `mcp_read_resource` and `mcp_get_prompt` virtual tools exposed to the model
1639 - Dialectical Duo mode with specialized TUI rendering (`Player` / `Coach` history cells)
1640 - Dynamic system prompt refreshing at each turn for up-to-date RLM/Duo/working-set context
1641 - `project_map` tool for automatic codebase structure discovery
1642 - `delegate_to_agent` alias for streamlined sub-agent delegation
1643
1644 ### Changed
1645 - Default theme changed to 'Whale' with updated color palette
1646 - `with_agent_tools` now includes `project_map`, `test_runner`, and conditionally RLM tools for all agent modes
1647 - MCP `McpServerConfig.command` is now `Option<String>` to support URL-only (SSE) servers
1648
1649 ### Fixed
1650 - MCP test compilation errors for updated `McpServerConfig` struct shape
1651
1652 ## [0.3.4] - 2026-01-29
1653
1654 ### Changed
1655 - Updated Cargo.lock dependencies
1656
1657 ### Fixed
1658 - Compaction tool-call pairing: enforce bidirectional tool-call/tool-result integrity with fixpoint convergence
1659 - Safety net scanning to drop orphan tool results in the request builder
1660 - Double-dispatch race in parallel tool execution
1661
1662 ## [0.3.3] - 2026-01-28
1663
1664 ### Added
1665 - TUI polish: Kimi-style footer with mode/model/token display
1666 - Streaming thinking blocks with dedicated rendering
1667 - Loading animation improvements
1668
1669 ## [0.3.2] - 2026-01-28
1670
1671 ### Fixed
1672 - Preserve tool-call + tool-result pairing during compaction to avoid invalid tool message sequences
1673 - Drop orphan tool results in request builder as a safety net to prevent API 400s
1674
1675 ## [0.3.1] - 2026-01-27
1676
1677 ### Added
1678 - `deepseek setup` to bootstrap MCP config and skills directories
1679 - `deepseek mcp init` to generate a template `mcp.json` at the configured path
1680
1681 ### Changed
1682 - `deepseek doctor` now follows the resolved config path and config-derived MCP/skills locations
1683
1684 ### Fixed
1685 - Doctor no longer reports missing MCP/skills when paths are overridden via config or env
1686
1687 ## [0.3.0] - 2026-01-27
1688
1689 ### Added
1690 - Repo-aware working set tracking with prompt injection for active paths
1691 - Working set signals now pin relevant messages during auto-compaction
1692 - Offline eval harness (`deepseek eval`) with CI coverage in the test job
1693 - Shell tool now emits stdout/stderr summaries and truncation metadata
1694 - Dependency-aware `agent_swarm` tool for orchestrating multiple sub-agents
1695 - Expanded sub-agent tool access (apply_patch, web_search, file_search)
1696
1697 ### Changed
1698 - Auto-compaction now accounts for pinned budget and preserves working-set context
1699 - Apply patch tool validates patch shape, reports per-file summaries, and improves hunk mismatch diagnostics
1700 - Eval harness shell step now uses a Windows-safe default command
1701 - Increased `max_subagents` clamp to `1..=20`
1702
1703 ## [0.2.2] - 2026-01-22
1704
1705 ### Fixed
1706 - Session save no longer panics on serialization errors
1707 - Web search regex patterns are now cached for better performance
1708 - Improved panic messages for regex compilation failures
1709
1710 ## [0.2.1] - 2026-01-22
1711
1712 ### Fixed
1713 - Resolve clippy warnings for Rust 1.92
1714
1715 ## [0.2.0] - 2026-01-20
1716
1717 ### Changed
1718 - Removed npm package distribution; now Cargo-only
1719 - Clean up for public release
1720
1721 ### Fixed
1722 - Disabled automatic RLM mode switching; use /rlm or /aleph to enter RLM mode
1723 - Fixed cargo fmt formatting issues
1724
1725 ## [0.0.2] - 2026-01-20
1726
1727 ### Fixed
1728 - Disabled automatic RLM mode switching; use /rlm or /aleph to enter RLM mode.
1729
1730 ## [0.0.1] - 2026-01-19
1731
1732 ### Added
1733 - DeepSeek Responses API client with chat-completions fallback
1734 - CLI parity commands: login/logout, exec, review, apply, mcp, sandbox
1735 - Resume/fork session workflows with picker fallback
1736 - DeepSeek blue branding refresh + whale indicator
1737 - Responses API proxy subcommand for key-isolated forwarding
1738 - Execpolicy check tooling and feature flag CLI
1739 - Agentic exec mode (`deepseek exec --auto`) with auto-approvals
1740
1741 ### Changed
1742 - Removed multimedia tooling and aligned prompts/docs for text-only DeepSeek API
1743
1744 ## [0.1.9] - 2026-01-17
1745
1746 ### Added
1747 - API connectivity test in `deepseek doctor` command
1748 - Helpful error diagnostics for common API failures (invalid key, timeout, network issues)
1749
1750 ## [0.1.8] - 2026-01-16
1751
1752 ### Added
1753 - Renderable widget abstraction and modal view stack for TUI composition
1754 - Parallel tool execution with lock-aware scheduling
1755 - Interactive shell mode with terminal pause/resume handling
1756
1757 ### Changed
1758 - Tool approval requirements moved into tool specs
1759 - Tool results are recorded in original request order
1760
1761 ## [0.1.7] - 2026-01-15
1762
1763 ### Added
1764 - Duo mode (player-coach autocoding workflow)
1765 - Character-level transcript selection
1766
1767 ### Fixed
1768 - Approval flow tool use ID routing
1769 - Cursor position sync for transcript selection
1770
1771 ## [0.1.6] - 2026-01-14
1772
1773 ### Added
1774 - Auto-RLM for large pasted blocks with context auto-load
1775 - `chunk_auto` and `rlm_query` `auto_chunks` for quick document sweeps
1776 - RLM usage badge with budget warnings in the footer
1777
1778 ### Changed
1779 - Auto-RLM now honors explicit RLM file requests even for smaller files
1780
1781 ## [0.1.5] - 2026-01-14
1782
1783 ### Added
1784 - RLM prompt with external-context guidance and REPL tooling
1785 - RLM tools for context loading, execution, status, and sub-queries (rlm_load, rlm_exec, rlm_status, rlm_query)
1786 - RLM query usage tracking and variable buffers
1787 - Workspace-relative `@path` support for RLM loads
1788 - Auto-switch to RLM when users request large file analysis (or the largest file)
1789
1790 ### Changed
1791 - Removed Edit mode; RLM chat is default with /repl toggle
1792
1793 ## [0.1.0] - 2026-01-12
1794
1795 ### Added
1796 - Initial alpha release of DeepSeek TUI
1797 - Interactive TUI chat interface
1798 - DeepSeek API integration (OpenAI-compatible Responses API)
1799 - Tool execution (shell, file ops)
1800 - MCP (Model Context Protocol) support
1801 - Session management with history
1802 - Skills/plugin system
1803 - Cost tracking and estimation
1804 - Hooks system and config profiles
1805 - Example skills and launch assets
1806
1807 [Unreleased]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.8.0...HEAD
1808 [0.8.0]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.7.9...v0.8.0
1809 [0.7.9]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.7.8...v0.7.9
1810 [0.7.8]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.7.7...v0.7.8
1811 [0.7.7]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.7.6...v0.7.7
1812 [0.7.6]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.7.5...v0.7.6
1813 [0.6.1]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.6.0...v0.6.1
1814 [0.6.0]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.4.9...v0.6.0
1815 [0.4.9]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.4.8...v0.4.9
1816 [0.4.8]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.33...v0.4.8
1817 [0.3.33]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.32...v0.3.33
1818 [0.3.32]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.31...v0.3.32
1819 [0.3.31]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.28...v0.3.31
1820 [0.3.28]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.27...v0.3.28
1821 [0.3.23]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.22...v0.3.23
1822 [0.3.22]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.21...v0.3.22
1823 [0.3.21]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.17...v0.3.21
1824 [0.3.17]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.16...v0.3.17
1825 [0.3.16]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.14...v0.3.16
1826 [0.3.14]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.13...v0.3.14
1827 [0.3.13]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.12...v0.3.13
1828 [0.3.12]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.11...v0.3.12
1829 [0.3.11]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.10...v0.3.11
1830 [0.3.10]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.6...v0.3.10
1831 [0.3.6]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.5...v0.3.6
1832 [0.3.5]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.4...v0.3.5
1833 [0.3.4]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.3...v0.3.4
1834 [0.3.3]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.2...v0.3.3
1835 [0.3.2]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.1...v0.3.2
1836 [0.3.1]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.3.0...v0.3.1
1837 [0.3.0]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.2.2...v0.3.0
1838 [0.2.2]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.2.0...v0.2.2
1839 [0.2.0]: https://github.com/Hmbown/DeepSeek-TUI/releases/tag/v0.2.0
1840 [0.0.2]: https://github.com/Hmbown/DeepSeek-TUI/releases/tag/v0.0.2
1841 [0.0.1]: https://github.com/Hmbown/DeepSeek-TUI/releases/tag/v0.0.1
1842 [0.1.9]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.1.8...v0.1.9
1843 [0.1.8]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.1.7...v0.1.8
1844 [0.1.7]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.1.6...v0.1.7
1845 [0.1.6]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.1.5...v0.1.6
1846 [0.1.5]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.1.0...v0.1.5
1847 [0.1.0]: https://github.com/Hmbown/DeepSeek-TUI/releases/tag/v0.1.0
1848
1848 lines MARKDOWN