diff --git a/README.md b/README.md index 2a24aa5b..2af1ae1e 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,72 @@ cargo install --path crates/tui --locked # requires Rust 1.85+ --- +## What's new in v0.8.8 + +A stabilization-focused release: a thick band of UX polish on top of the v0.8.6 / v0.8.7 base, plus runtime fixes for the rough edges that surfaced in production sessions. No model or API changes; every existing config and session keeps working. + +### 🪟 TUI polish + +- **Visual retry / backoff banner** when the upstream rate-limits or 5xxs, with a per-second countdown so a stalled session is obviously stalled instead of silently frozen ([#499](https://github.com/Hmbown/DeepSeek-TUI/issues/499)). +- **MCP health chip** in the footer — a coloured `MCP n/n` glyph reflects how many configured servers are actually reachable, hidden when no servers are configured ([#502](https://github.com/Hmbown/DeepSeek-TUI/issues/502)). +- **Tool-output spillover** routes full bodies to `~/.deepseek/tool_outputs/.txt` with a 32 KiB head visible in the cell; the existing details pager appends the full output so nothing is hidden, just paged ([#500](https://github.com/Hmbown/DeepSeek-TUI/issues/500)). +- **Multi-day duration formatting** — `humanize_duration` walks `s → m → h → d → w` and caps at two units, so a long-running session reads `2d 3h` instead of `188415s` ([#447](https://github.com/Hmbown/DeepSeek-TUI/issues/447)). +- **Cumulative `worked Nh Mm` footer chip** appears once a session crosses 60s, dropping first under narrow widths so it never shoves more important chips off-screen ([#448](https://github.com/Hmbown/DeepSeek-TUI/issues/448)). +- **OSC 8 hyperlinks** — URLs in the transcript are Cmd+click-openable on iTerm2, Terminal.app, Ghostty, Kitty, WezTerm, Alacritty, and modern gnome-terminal/konsole; legacy terminals just show the visible text ([#498](https://github.com/Hmbown/DeepSeek-TUI/issues/498)). +- **Inline diff rendering** for `edit_file` and `write_file` — tool results emit a unified diff at the head of the body, picked up by the diff-aware renderer with line numbers and coloured `+`/`-` gutters ([#505](https://github.com/Hmbown/DeepSeek-TUI/issues/505)). +- **Composer prompt stash** — Ctrl+S parks the current draft to `~/.deepseek/composer_stash.jsonl`, `/stash list` shows parked drafts, `/stash pop` restores LIFO, `/stash clear` wipes the file. Self-healing JSONL parser, 200-entry cap, multi-line drafts preserved ([#440](https://github.com/Hmbown/DeepSeek-TUI/issues/440)). +- **Slash-menu layout no longer jitters** the chat area as the matched-entry count changes mid-typing — reported on Windows 10 PowerShell + WSL where the per-cell write cost made the redraw visibly laggy. The composer now reserves its panel-max envelope for the whole slash/mention session. + +### ♿ Accessibility + +- **`NO_ANIMATIONS=1`** env var (also `1` / `true` / `yes` / `on`) forces `low_motion = true` and `fancy_animations = false` at startup regardless of saved settings; new `docs/ACCESSIBILITY.md` documents every motion / output knob ([#450](https://github.com/Hmbown/DeepSeek-TUI/issues/450)). +- **Keyboard-enhancement flags** pop on every shutdown path including panic, Ctrl+Z suspend, and external-editor invocation, so a crashed TUI never leaves your terminal in raw mode ([#443](https://github.com/Hmbown/DeepSeek-TUI/issues/443)/[#444](https://github.com/Hmbown/DeepSeek-TUI/issues/444)). +- **Kitty keyboard protocol** (`DISAMBIGUATE_ESCAPE_CODES`) pushed at startup so kitty-protocol terminals report unambiguous events for Option/Alt-modified keys; legacy terminals are unaffected ([#442](https://github.com/Hmbown/DeepSeek-TUI/issues/442)). + +### 🤖 Agents / sub-agents + +- **Sub-agent cap raised 5 → 10** (configurable via `[subagents].max_concurrent`, hard ceiling 20). Completed agents no longer count against the running cap ([#509](https://github.com/Hmbown/DeepSeek-TUI/issues/509)). +- **Multi-agent fan-out UI freeze fixed** — `SharedSubAgentManager` is now `Arc>`; read paths take read locks instead of contending on a `Mutex` ([#510](https://github.com/Hmbown/DeepSeek-TUI/issues/510)). +- **Sub-agent output summarized** before being folded into the parent's context, so a child returning 100KB of evidence doesn't wreck the parent's window ([#511](https://github.com/Hmbown/DeepSeek-TUI/issues/511)). +- **`Implementer` + `Verifier` sub-agent roles** wired into `agent_spawn` / `agent_assign` schemas so the model surfaces them by name ([#404](https://github.com/Hmbown/DeepSeek-TUI/issues/404)). +- **`agent_list` defaults to current-session view** — prior sessions filtered out unless `include_archived=true` ([#405](https://github.com/Hmbown/DeepSeek-TUI/issues/405)). +- **Compact `agent_spawn` rendering** in live mode collapses to a single header line; transcript replay keeps the full block ([#409](https://github.com/Hmbown/DeepSeek-TUI/issues/409)). +- **`agent_swarm` / `spawn_agents_on_csv` / `/swarm`** removed in v0.8.5 — confirmed gone in this release; multi-child fanout is no longer a model-callable tool. + +### 🛠️ Workflows / extensibility + +- **`load_skill` model-callable tool** — takes a skill id, returns the SKILL.md body plus sibling companion-file list in one call. Available in Plan and Agent / Yolo modes ([#434](https://github.com/Hmbown/DeepSeek-TUI/issues/434)). +- **Cross-tool skill discovery** — skills catalogue and `load_skill` walk `.agents/skills`, `skills`, `.opencode/skills`, `.claude/skills`, and `~/.deepseek/skills` with first-wins precedence ([#432](https://github.com/Hmbown/DeepSeek-TUI/issues/432)). +- **`/hooks` read-only lifecycle hook listing** groups configured hooks by event with name / command preview / timeout / condition. Notes the global `[hooks].enabled` state. `/hooks events` lists every supported `HookEvent` value ([#460](https://github.com/Hmbown/DeepSeek-TUI/issues/460)). +- **Every `HookEvent` now has a live producer** — `tool_call_before` / `tool_call_after` / `message_submit` / `on_error` fire from the runtime in addition to the existing session-lifecycle and mode-change events. Hooks remain read-only observers in v0.8.8 ([#455](https://github.com/Hmbown/DeepSeek-TUI/issues/455)). +- **`instructions = [...]` config array** lets you stack additional system-prompt files; paths capped at 100 KiB each, project array replaces user array wholesale ([#454](https://github.com/Hmbown/DeepSeek-TUI/issues/454)). +- **`deepseek pr ` subcommand** fetches a PR's title / body / diff via `gh` and launches the TUI with a review prompt already in the composer. Codepoint-safe diff cap at 200 KiB; optional `--repo` / `--checkout` ([#451](https://github.com/Hmbown/DeepSeek-TUI/issues/451)). +- **User-memory MVP** (opt-in) — `~/.deepseek/memory.md` injected into the system prompt as a `` block; `# foo` typed in the composer appends a timestamped bullet without firing a turn; `/memory [show|path|clear|edit]` for inspection. Default off; enable with `[memory] enabled = true` or `DEEPSEEK_MEMORY=on` ([#489](https://github.com/Hmbown/DeepSeek-TUI/issues/489)–[#493](https://github.com/Hmbown/DeepSeek-TUI/issues/493)). + +### 🔒 Security + +- **Project-config keys denied at workspace scope** — a malicious `./.deepseek/config.toml` can no longer override `api_key`, `base_url`, `provider`, or `mcp_config_path`. The loosest values (`approval_policy = "auto"`, `sandbox_mode = "danger-full-access"`) are also denied at project scope ([#417](https://github.com/Hmbown/DeepSeek-TUI/issues/417)). +- **`SSL_CERT_FILE` honoured** in the HTTPS client so corporate-CA / MITM-proxy users can connect — PEM bundle and DER fallback; failures log a warning and continue ([#418](https://github.com/Hmbown/DeepSeek-TUI/issues/418)). +- **Execpolicy heredoc parsing** — `normalize_command` strips heredoc bodies before shlex tokenization so `auto_allow = ["cat > file.txt"]` matches the heredoc form `cat < file.txt\nbody\nEOF`. Recognises `<.txt`,详情面板里完整查看)、多日时长显示(`2d 3h` 而不是 `188415s`)、`worked Nh Mm` 累计计时器、终端可点击 OSC 8 超链接、`edit_file` / `write_file` 输出渲染为带行号 `+`/`-` 槽位的内联 unified diff。 +- **斜杠菜单不再抖动聊天区**(Windows 10 PowerShell + WSL 用户反馈):在斜杠 / 提及菜单打开时锁定 composer 高度,不再因为匹配项数量变化重绘上方区域。 +- **撰写区暂存** — Ctrl+S 把当前草稿停到 `~/.deepseek/composer_stash.jsonl`;`/stash list` / `pop` / `clear` 全程 LIFO,最多保留 200 条。 +- **可访问性**:`NO_ANIMATIONS=1`(或 `1` / `true` / `yes` / `on`)启动时强制 `low_motion = true` 与 `fancy_animations = false`,无视已保存设置;新增 `docs/ACCESSIBILITY.md`。键盘增强标志在崩溃 / Ctrl+Z 挂起 / 外部编辑器路径上都会回弹,崩溃后终端不会卡在 raw 模式。 +- **子智能体**:默认并发上限 `5 → 10`(可通过 `[subagents].max_concurrent` 配置,硬上限 20);已完成的子智能体不再占用并发名额。多智能体 fan-out 时 UI 卡死的问题已修复(`SharedSubAgentManager` 改为 `Arc>`)。子智能体输出会先做摘要再注入父上下文。新增 `Implementer` / `Verifier` 角色。`agent_swarm` / `/swarm` 老接口在 v0.8.5 已删除。 +- **工作流 / 扩展**:`load_skill` 模型可调用工具;技能发现器跨工具走 `.agents/skills` / `skills` / `.opencode/skills` / `.claude/skills` / `~/.deepseek/skills`。`/hooks` 列出生命周期钩子配置;所有 `HookEvent` 现在都有运行时生产者。`instructions = [...]` 配置数组允许把多个项目级文件叠加进系统提示。`deepseek pr ` 子命令直接抓取 PR 元数据并在撰写区里预填评审 prompt。 +- **用户记忆 MVP(默认关闭)**:开启后 `~/.deepseek/memory.md` 注入到系统提示的 `` 块;撰写区输入 `# foo` 直接追加一条带时间戳的记忆,不触发回合;`/memory show|path|clear|edit` 用于查看与编辑。`[memory] enabled = true` 或 `DEEPSEEK_MEMORY=on` 启用。 +- **安全**:项目级配置不能再通过覆盖 `api_key` / `base_url` / `provider` / `mcp_config_path` 做权限提升,也不能把 `approval_policy` 设为 `auto` 或 `sandbox_mode` 设为 `danger-full-access`。`SSL_CERT_FILE` 环境变量在 HTTPS 客户端被识别(PEM bundle + DER 兜底),方便企业 CA / MITM 代理用户。execpolicy 在 shlex 之前剥离 heredoc 主体,所以 `auto_allow = ["cat > file.txt"]` 也能匹配 heredoc 形式 `cat < file.txt\nbody\nEOF`。 +- **打包**:新增 **Linux ARM64** 预编译包(鲲鹏、HarmonyOS PC、Kylin、openEuler、树莓派、Graviton 等),`npm i -g deepseek-tui` 直接可用;新增 `docs/INSTALL.md` 覆盖所有安装方式。`deepseek update` 修复了 v0.8.7 在所有平台都失败的架构名映射 bug。CI 删了三个重复 / 失效的 workflow。 +- **Bug 修复**:composer 的 `Option+Backspace` 现在按词删除;离线撰写队列绑定到当前会话 ID,老的无作用域队列会被关闭式回退;`display_path` 测试不再竞争 `$HOME`,并在 Windows 用 `\` 拼接。 + +完整列表见 [CHANGELOG.md](CHANGELOG.md)。 + +--- + ## 创建和安装技能 DeepSeek-TUI 会从当前技能目录发现技能。优先级是:工作区