diff --git a/CHANGELOG.md b/CHANGELOG.md index 18a23006..6bf39934 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,113 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.8.29] - 2026-05-11 + +A maintenance release anchored by a regression fix for the +"scroll demon" (#1085 class, re-introduced by v0.8.27's flicker +patch) and a wrong-project session-restore bug (#1395). Plus 12 +community PRs covering MCP transport, prompt steering, auto-routing +language coverage, web-search SERP filtering, and broad test +coverage additions. + +### Fixed + +- **Scroll demon — alt-screen no longer drifts under parallel + sub-agent load** (#1085 regression). The v0.8.27 flicker fix + dropped the `\x1b[2J\x1b[3J` deep-clear from the viewport-reset + path, which had been silently masking three `eprintln!` sites + inside the sub-agent and network-policy modules. Each leak + scrolled the alt-screen up by one row while ratatui's diff + renderer remained convinced its model matched reality. Three + layers of defence now ship together: a `tracing-subscriber` + writing to `~/.deepseek/logs/tui-YYYY-MM-DD.log`, an fd-level + `dup2` stderr redirect for the alt-screen lifetime (Unix only; + Windows follow-up tracked), and module-level + `#![deny(clippy::print_stdout, clippy::print_stderr)]` on + `tools/`, `core/`, `tui/`, `runtime_threads.rs`, and + `network_policy.rs`. The three known leak sites + (`subagent::persist_state_best_effort`, + `subagent::new_shared_subagent_manager`, `network_policy::record`) + now route through `tracing::warn!` with structured fields. +- **`Ctrl+R` session-restore picker is workspace-scoped** (#1395, + PR #1397 from **@linzhiqin2003**). `SessionPickerView::new` + previously listed every saved session on disk sorted globally — + so opening DeepSeek-TUI in Project B and pressing `Ctrl+R` could + hand back Project A's last conversation. The picker now filters + by current workspace, with a fallback hint when no in-workspace + sessions exist. +- **MCP discovery survives malformed items** (PR #1410 from + **@Liu-Vince**). The `tools/list`, `resources/list`, + `resources/templates/list`, and `prompts/list` walks previously + did `serde_json::from_value::>(…).unwrap_or_default()`, + which silently discarded the entire page when any single entry + was misshapen. Each list now iterates per-item, skipping + malformed entries with a `tracing::debug!` instead of dropping + the rest of the catalogue. Composes with the v0.8.x pagination + loop landed for #1256. +- **Web search drops spam-stuffed SERPs** (#964, PR #1396 from + **@linzhiqin2003**). The Bing / DDG fallback paths now filter + the SEO-farm domains that were poisoning quick lookups. +- **Language directive: `reasoning_content` follows the user's + message language** (#1118, PR #1398 from **@linzhiqin2003**) — + previously the project context's inferred `lang` could override + the latest user message, leading to English thinking for a + Chinese turn. + +### Added + +- **MCP HTTP transport honors `HTTP(S)_PROXY` / `NO_PROXY`** (#1408 + from **@hlx98007**). Reqwest 0.13 does not auto-detect proxy env + vars by default, so MCP HTTP connections were bypassing the + proxy that every other tool on the box (curl, npm, git, …) was + using. Connections behind corporate egress proxies and + China-mainland Clash / Shadowsocks tunnels now work transparently. + Malformed `HTTPS_PROXY` values log a `tracing::warn!` and the + connection proceeds without a proxy rather than failing the MCP + attach. +- **Note management slash commands** (PR #1407 from + **@reidliu41**). `/note add`, `/note list`, and friends for + persistent maintainer-style notes inside the TUI, backed by + `~/.deepseek/notes/`. +- **Header surfaces the runtime version chip.** A `v0.8.29` tag + sits in the header's right cluster after the provider / effort / + Live / context chips. Styled with `palette::TEXT_HINT` so it + reads behind the streaming indicators. Drops first under tight + terminal width. +- **Global `~/.deepseek/AGENTS.md` now merges with project + AGENTS.md** (#1157, PR #1399 from **@linzhiqin2003**) instead of + being shadowed when a workspace ships its own. +- **Auto-routing recognises CJK debug / search keywords** (PRs + #1401 and #1402 from **@linzhiqin2003**) — `--model auto` and + the reasoning-effort picker correctly route Chinese / Japanese + technical queries that previously fell through to the generic + baseline. + +### Security + +- **`sync-cnb.yml` workflow hardened** (CodeQL finding from + v0.8.28). Adds explicit `permissions: contents: read` + (least-privilege), bumps `actions/checkout` v3 → v4, and + narrows the trigger from `on: [push]` to `on: push.branches: + [main]` + `tags: ['v*']`. Feature branches no longer mirror to + CNB; only `main` and tagged releases do. + +### Internal + +- **+438 LOC of new test coverage** across four PRs from + **@linzhiqin2003**: `error_taxonomy::classify_error_message` + and Display impls (#1403), `parse_pages_arg` edge cases (#1404), + `optional_search_max_results` precedence (#1405), and + `sanitize_stream_chunk` control-byte filtering (#1406). +- **`runtime_log` module** ships with a regression test pinning + the `HOME` / `USERPROFILE` / `dirs::home_dir()` resolution + order, holding the process-wide `test_support::lock_test_env()` + lock for env-mutation safety. +- **Header rendering** gains two regression tests + (`header_renders_version_chip_when_width_allows` and + `narrow_header_drops_version_chip_before_dropping_mode`) + pinning the version chip's cascade priority. + ## [0.8.28] - 2026-05-10 A maintenance release bundling four streaming / approvals / cache diff --git a/README.md b/README.md index ba40ac33..4e3f6062 100644 --- a/README.md +++ b/README.md @@ -225,61 +225,67 @@ deepseek --provider ollama --model deepseek-coder:1.3b --- -## What's New In v0.8.27 +## What's New In v0.8.29 -A polish release: 17 community PRs plus a focused user-issue sweep -over the 24–48 hours after v0.8.26 shipped. [Full changelog](CHANGELOG.md). +A maintenance release anchored by a v0.8.27 / v0.8.28 regression fix +plus 12 community PRs. [Full changelog](CHANGELOG.md). -- **Cross-terminal flicker fixed** on Ghostty / VSCode terminal / - Win10 conhost (the most-reported v0.8.26 regression — #1119, #1260, - #1295, #1352, #1356, #1363, #1366). Dropped destructive `2J/3J` - from the viewport-reset sequence; alt-screen + diff rendering - handle repaints without flicker. -- **Long output text no longer overflows the right edge** (#1344, - #1351). Paragraphs and code blocks hard-break overlong words at - character boundaries — matches the v0.8.25 table-cell fix. -- **Pager copy-out** via `c` or `y` (#1354) — every full-screen pager - (`Alt+V` tool details, `Ctrl+O` thinking, shell-job / task / MCP - managers) accepts an in-app copy keybinding. -- **Context-sensitive Ctrl+C** (#1337, #1367) — selection→copy on - Windows (matches OS convention), turn-active→cancel, idle→arm-exit - with a 2s confirmation window. `Cmd+C` / `Ctrl+Shift+C` continue - to copy unchanged. -- **MCP pool auto-reloads on `mcp.json` change** (#1267 part 2) — - no more manual `/mcp reload` after editing config. Cheap mtime + - content-hash check on each tool invocation; networked filesystems - with coarse mtime granularity don't churn. -- **Model-callable `notify` tool** (#1322) — desktop notification - for "long task done" pings. Honors your existing - `[notifications].method` config; silent no-op when off. -- **Onboarding screens render in the selected language** — pick - 简体中文 / 日本語 / Português (Brasil) at step 2 and the rest of - the flow follows. Particularly nice for CJK-IME users avoiding - English typing during setup. -- **Paste UX rebuilt** — large pastes get the `@paste-…md` - treatment immediately (visible before submit, no "auto-sent an - @mention I didn't authorize" surprise); paste-burst auto-disables - on terminals where bracketed paste works; short CJK pastes no - longer auto-submit on the trailing newline (#1302, thanks - **@reidliu41** PR #1342). -- **`/skills `** filters the local skills list (#1318) — on - top of v0.8.26's inter-row spacing (#1328 from **@reidliu41**). -- **`/skills --remote` diagnostic hints** (#1329) — when fetching - the registry fails, the error chain now ends with a one-line - hint pointing at the most likely cause (DNS / TLS / refused / - 4xx / 429 / timeout). -- **17 community PRs landed** — `/mode` unification, `/status` - diagnostics, `/feedback`, session artifact metadata, subagent - self-report compaction, global AGENTS.md fallback, `--yolo` - CLI→TUI propagation, `composer_arrows_scroll`, session cost - persistence, provider-aware model picker + persistence, HTTP - User-Agent header, HTTP-400 quota retry, explicit hidden file - completions, Windows mouse-capture docs, README zh-CN sync, - tool-output render perf + card-rail, expanded test coverage. - Thanks to **@reidliu41**, **@THINKER-ONLY**, **@manaskarra**, - **@fuleinist**, **@lbcheng888**, **@imkingjh999**, **@dst1213**, - **@SamhandsomeLee**, **@Oliver-ZPLiu**, **@whtis**, - **@tuohai666**. +- **Scroll demon, gone for good** (#1085 regression). Parallel sub- + agents running `exec_shell` would scroll the alt-screen out from + under ratatui's diff renderer, leaving a blank band growing above + the header. Three layers of defence now: a `tracing-subscriber` + writing to `~/.deepseek/logs/tui-YYYY-MM-DD.log`, an fd-level + `dup2` stderr redirect for the alt-screen lifetime (Unix), and + module-level `#![deny(clippy::print_stdout, clippy::print_stderr)]` + on the TUI runtime modules. New `eprintln!`s inside `tools/`, + `core/`, `tui/`, `network_policy.rs`, or `runtime_threads.rs` now + fail CI. +- **Ctrl+R session restore is workspace-scoped** (#1395, PR #1397 from + **@linzhiqin2003**) — previously listed every saved session on disk, + which meant Project A's history could leak into Project B. +- **Runtime version visible in the header.** A discreet `v0.8.29` + chip sits in the header's right cluster alongside the provider / + effort / Live / context chips. Drops first under tight terminal + width. +- **MCP HTTP transport honors HTTP(S)_PROXY** (#1408 from + **@hlx98007**) — corporate / Clash / Shadowsocks proxies now apply + to MCP HTTP connections, matching every other tool on the box. + `NO_PROXY` honored. +- **MCP discovery survives malformed items** (#1410 from + **@Liu-Vince**) — one bad tool / resource / prompt entry no + longer drops the whole page; the malformed entry is skipped and + the rest of the catalogue surfaces normally. +- **Note management commands** (PR #1407 from **@reidliu41**) — + `/note add`, `/note list`, and friends for persistent maintainer + notes inside the TUI. +- **`/init`-style global AGENTS.md merges with project AGENTS.md** + (#1157, PR #1399 from **@linzhiqin2003**) — your `~/.deepseek/ + AGENTS.md` baseline now layers under the workspace's own + AGENTS.md instead of being shadowed. +- **Language directive: thinking matches the user's message language** + (#1118, PR #1398 from **@linzhiqin2003**) — `reasoning_content` + follows the latest user message language, not the project context's + inferred `lang`. +- **Web search filters spam-stuffed SERPs** (#964, PR #1396 from + **@linzhiqin2003**) — Bing / DDG fallback paths drop the + generated-content / SEO-farm domains that were poisoning quick + lookups. +- **Auto routing recognises CJK debug / search keywords** (PRs #1401 + and #1402 from **@linzhiqin2003**) — `--model auto` and the + reasoning-effort picker correctly route Chinese / Japanese + technical queries instead of falling through to the generic + baseline. +- **Sync-to-CNB workflow hardened** — explicit `permissions: + contents: read`, narrowed trigger to `main` + `v*` tags (no longer + mirrors feature branches), `actions/checkout` bumped v3 → v4. +- **+438 LOC of new test coverage** for `error_taxonomy`, + `parse_pages_arg`, web-search precedence, and + `sanitize_stream_chunk` control-byte filtering (PRs #1403-#1406 + from **@linzhiqin2003**). + +Thanks to **@linzhiqin2003** (10 landings this cycle), +**@reidliu41**, **@hlx98007**, **@Liu-Vince**, and +**@shenxiaodaosanhua** for the bug report. --- diff --git a/README.zh-CN.md b/README.zh-CN.md index 04de1d36..35e26617 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -192,51 +192,59 @@ deepseek --provider ollama --model deepseek-coder:1.3b --- -## v0.8.27 新功能 +## v0.8.29 新功能 -优化版本:17 个社区 PR + 一轮针对 v0.8.26 发布后 24-48 小时内用户报告 -问题的集中修复。[完整更新日志](CHANGELOG.md)。 +维护版本,核心是修复 v0.8.27 / v0.8.28 引入的"滚动幽灵"回归 +(#1085 类问题)和 Ctrl+R 会话恢复跨项目泄漏的问题(#1395), +外加 12 个社区 PR。[完整更新日志](CHANGELOG.md)。 -- **跨终端闪烁修复**(Ghostty / VSCode 终端 / Win10 conhost;v0.8.26 - 发布后报告最多的回归问题 — #1119、#1260、#1295、#1352、#1356、 - #1363、#1366)。视口重置序列移除了破坏性的 `2J/3J`,由 alt-screen - 和差分渲染处理重绘,不再闪烁。 -- **长输出文字不再溢出右边缘** (#1344、#1351)。段落和代码块在字符 - 边界对超长词进行硬断行 — 与 v0.8.25 表格单元格修复保持一致。 -- **Pager 复制功能** 通过 `c` 或 `y` 键 (#1354) — 所有全屏 pager - (`Alt+V` 工具详情、`Ctrl+O` 思考内容、shell-job / task / MCP - 管理器) 都支持应用内复制键。 -- **上下文感知的 Ctrl+C** (#1337、#1367) — 选中文本→复制(匹配 - Windows 系统约定)、正在生成→中断、空闲→两次按键确认退出。 - `Cmd+C` / `Ctrl+Shift+C` 行为不变。 -- **MCP pool 在 `mcp.json` 变化时自动重载** (#1267 part 2) — 编辑 - 配置后不再需要手动 `/mcp reload`。每次工具调用前做轻量级 - mtime + 内容哈希检查;网络文件系统粗粒度 mtime 不会造成抖动。 -- **模型可调用的 `notify` 工具** (#1322) — 用于"长任务完成"提醒的 - 桌面通知。沿用现有 `[notifications].method` 配置;设为 off - 时静默无操作。 -- **新手引导界面在所选语言中渲染** — 第二步选择简体中文 / 日本語 / - Português (Brasil) 后,后续步骤全部使用该语言。对避免 IME 频繁 - 切换的 CJK 用户特别有用。 -- **粘贴体验重构** — 大粘贴在粘贴时立即转换为 `@paste-…md` - (在发送前可见,避免"自动发送了一个我没授权的 @mention"的意外); - 粘贴突发检测在终端支持 bracketed paste 后自动停用;短 CJK 内容 - 粘贴的尾部换行不再触发自动发送 (#1302,感谢 **@reidliu41** - PR #1342)。 -- **`/skills `** 按名称前缀过滤本地技能列表 (#1318) — 在 - v0.8.26 的行间距改进 (#1328 来自 **@reidliu41**) 基础上。 -- **`/skills --remote` 错误诊断提示** (#1329) — 拉取注册表失败时, - 错误链末尾会附加一行提示,指出最可能的原因(DNS / TLS / 拒绝 / - 4xx / 429 / 超时)。 -- **17 个社区 PR 落地** — `/mode` 统一命令、`/status` 诊断、 - `/feedback`、会话产物元数据、子代理结果自报告、全局 AGENTS.md - 回退、`--yolo` CLI→TUI 传递、`composer_arrows_scroll`、会话成本 - 持久化、provider 感知模型选择器 + 持久化、HTTP User-Agent、 - HTTP-400 配额重试、显式隐藏文件补全、Windows 鼠标捕获文档、 - README zh-CN 同步、工具输出渲染性能 + 卡片栏、测试覆盖扩展。 - 感谢 **@reidliu41**、**@THINKER-ONLY**、**@manaskarra**、 - **@fuleinist**、**@lbcheng888**、**@imkingjh999**、**@dst1213**、 - **@SamhandsomeLee**、**@Oliver-ZPLiu**、**@whtis**、**@tuohai666**。 +- **"滚动幽灵"彻底修复**(#1085 回归)。并行子代理运行 + `exec_shell` 时,alt-screen 会被滚动出 ratatui 差分渲染器的 + 视野,header 上方出现越来越大的空白带。三层防护一并上线: + 写入 `~/.deepseek/logs/tui-YYYY-MM-DD.log` 的 `tracing-subscriber`、 + alt-screen 生命周期内的 fd 级 stderr 重定向(Unix `dup2`)、 + 以及 `tools/`、`core/`、`tui/`、`network_policy.rs`、 + `runtime_threads.rs` 模块的 + `#![deny(clippy::print_stdout, clippy::print_stderr)]`。今后在 + 这些模块新增 `eprintln!` 会被 CI 拒绝。 +- **Ctrl+R 会话恢复改为按当前工作区过滤**(#1395,PR #1397, + 来自 **@linzhiqin2003**)— 此前列出磁盘上所有会话,导致 + 在项目 B 打开 DeepSeek-TUI 时按下 Ctrl+R 可能恢复项目 A 的 + 历史记录。 +- **运行时版本号直接显示在 header 中。** Header 右侧集群在 + provider / effort / Live / context 之后增加一个 `v0.8.29` + 小标签,在终端宽度紧张时最先收起。 +- **MCP HTTP 传输现在尊重 HTTP(S)_PROXY**(#1408,来自 + **@hlx98007**)— 公司出口代理、国内 Clash / Shadowsocks 代理 + 现在能正确应用于 MCP HTTP 连接,跟 box 上的其他工具 + (curl、npm、git 等)保持一致。同时支持 `NO_PROXY`。 +- **MCP 发现接受不规范条目**(PR #1410,来自 **@Liu-Vince**)— + 一个错误的 tool / resource / prompt 条目不再让整页丢失; + 错误条目被跳过,目录的其余部分正常返回。 +- **笔记管理斜杠命令**(PR #1407,来自 **@reidliu41**)— + `/note add`、`/note list` 等命令在 TUI 内提供持久笔记功能。 +- **全局 `~/.deepseek/AGENTS.md` 与项目 AGENTS.md 合并** + (#1157,PR #1399,来自 **@linzhiqin2003**)— 此前工作区 + 自带 AGENTS.md 会完全遮蔽全局基准,现在分层叠加。 +- **语言指令:thinking 跟随用户消息语言**(#1118,PR #1398, + 来自 **@linzhiqin2003**)— 此前项目上下文推断的 `lang` + 字段可能压制最新用户消息的语言,导致中文对话出现英文 thinking。 +- **网络搜索过滤垃圾 SERP**(#964,PR #1396,来自 + **@linzhiqin2003**)— Bing / DDG 回退路径丢弃污染快速查找 + 结果的 SEO 农场域名。 +- **Auto 路由识别 CJK 调试 / 搜索关键词**(PR #1401、#1402, + 来自 **@linzhiqin2003**)— `--model auto` 和推理强度选择器 + 现在能正确路由中文 / 日文技术查询,此前会回退到通用基准。 +- **`sync-cnb.yml` 工作流加固** — 显式 `permissions: contents: + read`、`actions/checkout` v3 → v4、触发器收紧到 `main` + + `v*` 标签(不再镜像 feature 分支)。 +- **新增 +438 LOC 测试覆盖** — `error_taxonomy`、 + `parse_pages_arg`、Web 搜索优先级、`sanitize_stream_chunk` + 控制字节过滤(PR #1403–#1406,来自 **@linzhiqin2003**)。 + +感谢本周期落地 10 个 PR 的 **@linzhiqin2003**,以及 +**@reidliu41**、**@hlx98007**、**@Liu-Vince**,和报告 #1395 +的 **@shenxiaodaosanhua**。 ---