From 8ba860015577b59ab5471da680fa12a35e5ba8d7 Mon Sep 17 00:00:00 2001 From: Hunter Bown Date: Wed, 29 Apr 2026 17:00:36 -0500 Subject: [PATCH] release: v0.7.6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Bump workspace version to 0.7.6 (Cargo.toml + all crate internal dep pins) - Bump npm wrapper version and deepseekBinaryVersion to 0.7.6 - Add v0.7.6 changelog entry: localization, paste burst, history search, pending input preview, grouped /config editor, searchable help overlay, Alt+↑ edit-last-queued, composer attachment management - Update README with v0.7.6 features (localization, paste, history search) - Archive v0.7.5 implementation plan to docs/archive/ - Update Cargo.lock --- CHANGELOG.md | 39 +++++++++++- Cargo.lock | 28 ++++----- Cargo.toml | 2 +- README.md | 70 +++++++++++++++------- crates/agent/Cargo.toml | 2 +- crates/app-server/Cargo.toml | 18 +++--- crates/cli/Cargo.toml | 14 ++--- crates/config/Cargo.toml | 2 +- crates/core/Cargo.toml | 16 ++--- crates/execpolicy/Cargo.toml | 2 +- crates/hooks/Cargo.toml | 2 +- crates/mcp/Cargo.toml | 2 +- crates/tools/Cargo.toml | 2 +- crates/tui/Cargo.toml | 4 +- docs/V0_7_5_IMPLEMENTATION_PLAN.md | 60 +------------------ docs/archive/V0_7_5_IMPLEMENTATION_PLAN.md | 61 +++++++++++++++++++ npm/deepseek-tui/package.json | 4 +- 17 files changed, 196 insertions(+), 132 deletions(-) create mode 100644 docs/archive/V0_7_5_IMPLEMENTATION_PLAN.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 55bee042..c92c82a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,42 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.7.6] - 2026-04-29 + +### Added +- **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`) +- **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`) +- **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`) +- **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`) +- **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`) +- **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`) +- **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`) +- **Searchable help overlay** — live substring filter across slash commands and keybindings, multi-term AND matching, localized chrome. (`crates/tui/src/tui/views/help.rs`) +- **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`) +- **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`) + +### Changed +- **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`) +- **Reasoning-effort `Off` now sends `"off"`** to the API (was `None`). Allows explicit thinking disable. (`crates/tui/src/tui/app.rs`) +- **Media `@`-mentions now emit `` hints** directing users to `/attach` instead of inlining binary bytes. Tests lock in the contract. (`crates/tui/src/tui/file_mention.rs`) +- **`/attach` rejects non-media files** with a descriptive error pointing to `@path` for text. (`crates/tui/src/commands/attachment.rs`) +- **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`) + +### Fixed +- **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`) +- **CJK/emoji display-width handling** in locale tests and config view rendering. (`crates/tui/src/localization.rs`) +- **Context preview distinguishes `@media`, `/attach`, missing, and included files** with separate kind labels and inclusion status. (`crates/tui/src/tui/file_mention.rs`) +- **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`) + +### Tests +- 7 localization tests (tag normalization, env resolution, shipped pack completeness, missing-key fallback, Unicode width truncation) +- 11 pending-input preview tests (context buckets, truncation, URL overflow, narrow-width) +- 13 paste tests (burst detection, CRLF normalization, clipboard images, Unicode) +- 9 draft/history search tests (match filter, unicode, accept/cancel, recovery) +- 93 config tests (grouping, filter, edit, j/k, localization, escape/cancel) +- 24 workspace tests (context refresh, scroll, mention completion) +- 7 file-mention tests (context references, media/attach distinction, removability) + ## [0.7.1] - 2026-04-28 ### Added @@ -627,7 +663,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Hooks system and config profiles - Example skills and launch assets -[Unreleased]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.6.1...HEAD +[Unreleased]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.7.5...HEAD +[0.7.6]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.7.5...v0.7.6 [0.6.1]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.6.0...v0.6.1 [0.6.0]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.4.9...v0.6.0 [0.4.9]: https://github.com/Hmbown/DeepSeek-TUI/compare/v0.4.8...v0.4.9 diff --git a/Cargo.lock b/Cargo.lock index fd631b83..32e1440f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1011,7 +1011,7 @@ dependencies = [ [[package]] name = "deepseek-agent" -version = "0.7.5" +version = "0.7.6" dependencies = [ "deepseek-config", "serde", @@ -1019,7 +1019,7 @@ dependencies = [ [[package]] name = "deepseek-app-server" -version = "0.7.5" +version = "0.7.6" dependencies = [ "anyhow", "axum", @@ -1042,7 +1042,7 @@ dependencies = [ [[package]] name = "deepseek-config" -version = "0.7.5" +version = "0.7.6" dependencies = [ "anyhow", "deepseek-secrets", @@ -1055,7 +1055,7 @@ dependencies = [ [[package]] name = "deepseek-core" -version = "0.7.5" +version = "0.7.6" dependencies = [ "anyhow", "chrono", @@ -1074,7 +1074,7 @@ dependencies = [ [[package]] name = "deepseek-execpolicy" -version = "0.7.5" +version = "0.7.6" dependencies = [ "anyhow", "deepseek-protocol", @@ -1083,7 +1083,7 @@ dependencies = [ [[package]] name = "deepseek-hooks" -version = "0.7.5" +version = "0.7.6" dependencies = [ "anyhow", "async-trait", @@ -1097,7 +1097,7 @@ dependencies = [ [[package]] name = "deepseek-mcp" -version = "0.7.5" +version = "0.7.6" dependencies = [ "anyhow", "deepseek-protocol", @@ -1107,7 +1107,7 @@ dependencies = [ [[package]] name = "deepseek-protocol" -version = "0.7.5" +version = "0.7.6" dependencies = [ "serde", "serde_json", @@ -1115,7 +1115,7 @@ dependencies = [ [[package]] name = "deepseek-secrets" -version = "0.7.5" +version = "0.7.6" dependencies = [ "dirs", "keyring", @@ -1128,7 +1128,7 @@ dependencies = [ [[package]] name = "deepseek-state" -version = "0.7.5" +version = "0.7.6" dependencies = [ "anyhow", "chrono", @@ -1140,7 +1140,7 @@ dependencies = [ [[package]] name = "deepseek-tools" -version = "0.7.5" +version = "0.7.6" dependencies = [ "anyhow", "async-trait", @@ -1153,7 +1153,7 @@ dependencies = [ [[package]] name = "deepseek-tui" -version = "0.7.5" +version = "0.7.6" dependencies = [ "anyhow", "arboard", @@ -1213,7 +1213,7 @@ dependencies = [ [[package]] name = "deepseek-tui-cli" -version = "0.7.5" +version = "0.7.6" dependencies = [ "anyhow", "chrono", @@ -1236,7 +1236,7 @@ dependencies = [ [[package]] name = "deepseek-tui-core" -version = "0.7.5" +version = "0.7.6" [[package]] name = "deranged" diff --git a/Cargo.toml b/Cargo.toml index e8034176..16981c16 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ default-members = ["crates/cli", "crates/app-server", "crates/tui"] resolver = "2" [workspace.package] -version = "0.7.5" +version = "0.7.6" edition = "2024" license = "MIT" repository = "https://github.com/Hmbown/DeepSeek-TUI" diff --git a/README.md b/README.md index ceec4314..9392db49 100644 --- a/README.md +++ b/README.md @@ -88,37 +88,56 @@ cargo install --path crates/cli --bin deepseek --locked --- -## What's new in v0.6.0 +## What's new in v0.7.6 -### 🌊 `rlm_query` — recursive language models as a first-class tool +### 🌐 UI Localization -The model now has direct access to a native recursive-LLM primitive. Inspired by [Alex Zhang's RLM work](https://github.com/alexzhang13/rlm) and Sakana AI's published research on novelty search, but trimmed to what an agent loop actually needs: one tool, structured args, no DSL. +DeepSeek TUI now speaks your language. The new `locale` setting +in `settings.toml` controls UI chrome — composer, history search, +`/config`, help overlay, and status hints — without changing model +output language. -```jsonc -// Single child: -rlm_query({ "prompt": "Summarise this 4k-line log: ..." }) +| Setting | Display | +|---|---| +| `locale = \"auto\"` | Checks `LC_ALL` → `LC_MESSAGES` → `LANG` (default) | +| `locale = \"ja\"` | Japanese | +| `locale = \"zh-Hans\"` | Chinese Simplified | +| `locale = \"pt-BR\"` | Portuguese (Brazil) | +| `locale = \"en\"` | English fallback | -// 8 parallel children, indexed result: -rlm_query({ - "prompts": [ - "Review src/foo.rs for race conditions: ...", - "Review src/foo.rs for input validation: ...", - "Review src/foo.rs for error-handling gaps: ...", - "..." - ] -}) +Unsure what to pick? Run `locale` in your terminal; the first matching +tag is used automatically. -// Promote one call to Pro: -rlm_query({ "prompt": "Hard reasoning here", "model": "deepseek-v4-pro" }) -``` +### 📋 Smarter paste handling -Children run concurrently against the existing DeepSeek client via `tokio` — no external binary, no Python sandbox, no fenced-block DSL. Returns a single string for one prompt or `[i] ...` indexed blocks for many. Available in Plan / Agent / YOLO. The cost is folded into the session's running total automatically. +Paste-burst detection catches rapid-key pastes in terminals that don't +send bracketed-paste events — CRLF is normalized, and multiline pastes +stay buffered until you stop typing. Configurable via `paste_burst_detection`. -### Other changes +### 🔍 Composer history search -- **Scroll position survives content rewrites** — anchor fallback now clamps to the nearest surviving cell instead of teleporting to the bottom (#56) -- **Looser command-safety chains** — `cargo build && cargo test` is no longer blocked outright; chains of known-safe commands escalate to RequiresApproval instead of Dangerous (#57) -- **Multi-turn tool calls no longer 400 on thinking-mode models** — `reasoning_content` is replayed across user-message boundaries with a safe placeholder when the round produced none +Forgot that prompt you wrote an hour ago? `Alt+R` opens a live search +across input history and recovered drafts. Type to filter, `Enter` to +accept, `Esc` to restore what you were typing. + +### 👁️ Pending input preview + +During a running turn, queued messages, pending steers, and context chips +appear above the composer so you can see what will be sent next. +`Alt+↑` pops the last queued message back for editing. + +### ⚙️ Grouped `/config` editor + +`/config` now groups settings by section (Model, Permissions, Display, +...) with a live filter. `↑/↓` (or `j`/`k` when the filter is empty) +navigate; `Enter`/`e` edit the selected row; `Esc` clears the filter +or closes. + +### ⌨️ Searchable help overlay + +`?` (with empty input), `F1`, or `Ctrl+/` opens a searchable help +overlay. Type to filter commands and keybindings; multi-term searches +act as AND. Full history: [CHANGELOG.md](CHANGELOG.md). @@ -174,6 +193,8 @@ deepseek mcp-server # run dispatcher MCP stdio server | `Ctrl+R` | Resume an earlier session | | `Alt+R` | Search prompt history and recover cleared drafts | | `@path` | Attach file/directory context in composer | +| `↑` (at composer start) | Select attachment row for removal | +| `Alt+↑` | Edit last queued message | | `/attach ` | Attach image/video media references; select the row with `↑` at composer start and remove with `Backspace`/`Delete` | --- @@ -214,6 +235,9 @@ DeepSeek context caching is automatic — when the API returns cache hit/miss to Full reference: [docs/CONFIGURATION.md](docs/CONFIGURATION.md) and [docs/MCP.md](docs/MCP.md). +UI locale is separate from model language — set `locale` in `settings.toml` +or via the `LC_ALL`/`LANG` environment variables. See [docs/CONFIGURATION.md](docs/CONFIGURATION.md). + --- ## Publishing your own skill diff --git a/crates/agent/Cargo.toml b/crates/agent/Cargo.toml index 69a5dc23..b6b4eab6 100644 --- a/crates/agent/Cargo.toml +++ b/crates/agent/Cargo.toml @@ -7,5 +7,5 @@ repository.workspace = true description = "Model/provider registry and fallback strategy for DeepSeek workspace architecture" [dependencies] -deepseek-config = { path = "../config", version = "0.7.5" } +deepseek-config = { path = "../config", version = "0.7.6" } serde.workspace = true diff --git a/crates/app-server/Cargo.toml b/crates/app-server/Cargo.toml index 08249844..59eed0bb 100644 --- a/crates/app-server/Cargo.toml +++ b/crates/app-server/Cargo.toml @@ -10,15 +10,15 @@ description = "Codex-style app-server transport for DeepSeek workspace architect anyhow.workspace = true axum.workspace = true clap.workspace = true -deepseek-agent = { path = "../agent", version = "0.7.5" } -deepseek-config = { path = "../config", version = "0.7.5" } -deepseek-core = { path = "../core", version = "0.7.5" } -deepseek-execpolicy = { path = "../execpolicy", version = "0.7.5" } -deepseek-hooks = { path = "../hooks", version = "0.7.5" } -deepseek-mcp = { path = "../mcp", version = "0.7.5" } -deepseek-protocol = { path = "../protocol", version = "0.7.5" } -deepseek-state = { path = "../state", version = "0.7.5" } -deepseek-tools = { path = "../tools", version = "0.7.5" } +deepseek-agent = { path = "../agent", version = "0.7.6" } +deepseek-config = { path = "../config", version = "0.7.6" } +deepseek-core = { path = "../core", version = "0.7.6" } +deepseek-execpolicy = { path = "../execpolicy", version = "0.7.6" } +deepseek-hooks = { path = "../hooks", version = "0.7.6" } +deepseek-mcp = { path = "../mcp", version = "0.7.6" } +deepseek-protocol = { path = "../protocol", version = "0.7.6" } +deepseek-state = { path = "../state", version = "0.7.6" } +deepseek-tools = { path = "../tools", version = "0.7.6" } serde.workspace = true serde_json.workspace = true tokio.workspace = true diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 8fa84e03..965027ee 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -14,13 +14,13 @@ path = "src/main.rs" anyhow.workspace = true clap.workspace = true clap_complete.workspace = true -deepseek-agent = { path = "../agent", version = "0.7.5" } -deepseek-app-server = { path = "../app-server", version = "0.7.5" } -deepseek-config = { path = "../config", version = "0.7.5" } -deepseek-execpolicy = { path = "../execpolicy", version = "0.7.5" } -deepseek-mcp = { path = "../mcp", version = "0.7.5" } -deepseek-secrets = { path = "../secrets", version = "0.7.5" } -deepseek-state = { path = "../state", version = "0.7.5" } +deepseek-agent = { path = "../agent", version = "0.7.6" } +deepseek-app-server = { path = "../app-server", version = "0.7.6" } +deepseek-config = { path = "../config", version = "0.7.6" } +deepseek-execpolicy = { path = "../execpolicy", version = "0.7.6" } +deepseek-mcp = { path = "../mcp", version = "0.7.6" } +deepseek-secrets = { path = "../secrets", version = "0.7.6" } +deepseek-state = { path = "../state", version = "0.7.6" } chrono.workspace = true dirs.workspace = true serde.workspace = true diff --git a/crates/config/Cargo.toml b/crates/config/Cargo.toml index 0f7890cf..a8fe9d49 100644 --- a/crates/config/Cargo.toml +++ b/crates/config/Cargo.toml @@ -8,7 +8,7 @@ description = "Config schema and precedence model for DeepSeek workspace archite [dependencies] anyhow.workspace = true -deepseek-secrets = { path = "../secrets", version = "0.7.5" } +deepseek-secrets = { path = "../secrets", version = "0.7.6" } dirs.workspace = true serde.workspace = true serde_json.workspace = true diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index d02b5ff1..dcb6c4c3 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -9,14 +9,14 @@ description = "Core runtime boundaries for DeepSeek workspace architecture" [dependencies] anyhow.workspace = true chrono.workspace = true -deepseek-agent = { path = "../agent", version = "0.7.5" } -deepseek-config = { path = "../config", version = "0.7.5" } -deepseek-execpolicy = { path = "../execpolicy", version = "0.7.5" } -deepseek-hooks = { path = "../hooks", version = "0.7.5" } -deepseek-mcp = { path = "../mcp", version = "0.7.5" } -deepseek-protocol = { path = "../protocol", version = "0.7.5" } -deepseek-state = { path = "../state", version = "0.7.5" } -deepseek-tools = { path = "../tools", version = "0.7.5" } +deepseek-agent = { path = "../agent", version = "0.7.6" } +deepseek-config = { path = "../config", version = "0.7.6" } +deepseek-execpolicy = { path = "../execpolicy", version = "0.7.6" } +deepseek-hooks = { path = "../hooks", version = "0.7.6" } +deepseek-mcp = { path = "../mcp", version = "0.7.6" } +deepseek-protocol = { path = "../protocol", version = "0.7.6" } +deepseek-state = { path = "../state", version = "0.7.6" } +deepseek-tools = { path = "../tools", version = "0.7.6" } serde_json.workspace = true tokio.workspace = true uuid.workspace = true diff --git a/crates/execpolicy/Cargo.toml b/crates/execpolicy/Cargo.toml index 2dd80569..1b829071 100644 --- a/crates/execpolicy/Cargo.toml +++ b/crates/execpolicy/Cargo.toml @@ -8,5 +8,5 @@ description = "Execution policy and approval model parity for DeepSeek workspace [dependencies] anyhow.workspace = true -deepseek-protocol = { path = "../protocol", version = "0.7.5" } +deepseek-protocol = { path = "../protocol", version = "0.7.6" } serde.workspace = true diff --git a/crates/hooks/Cargo.toml b/crates/hooks/Cargo.toml index 16aa8219..6b16d7ee 100644 --- a/crates/hooks/Cargo.toml +++ b/crates/hooks/Cargo.toml @@ -10,7 +10,7 @@ description = "Hook dispatch and notifications parity for DeepSeek workspace arc anyhow.workspace = true async-trait.workspace = true chrono.workspace = true -deepseek-protocol = { path = "../protocol", version = "0.7.5" } +deepseek-protocol = { path = "../protocol", version = "0.7.6" } reqwest.workspace = true serde.workspace = true serde_json.workspace = true diff --git a/crates/mcp/Cargo.toml b/crates/mcp/Cargo.toml index d6dac672..2f2857e9 100644 --- a/crates/mcp/Cargo.toml +++ b/crates/mcp/Cargo.toml @@ -8,6 +8,6 @@ description = "MCP server lifecycle and tool proxy compatibility for DeepSeek wo [dependencies] anyhow.workspace = true -deepseek-protocol = { path = "../protocol", version = "0.7.5" } +deepseek-protocol = { path = "../protocol", version = "0.7.6" } serde.workspace = true serde_json.workspace = true diff --git a/crates/tools/Cargo.toml b/crates/tools/Cargo.toml index 28afd3a2..915c0071 100644 --- a/crates/tools/Cargo.toml +++ b/crates/tools/Cargo.toml @@ -9,7 +9,7 @@ description = "Tool invocation lifecycle, schema validation, and scheduler paral [dependencies] anyhow.workspace = true async-trait.workspace = true -deepseek-protocol = { path = "../protocol", version = "0.7.5" } +deepseek-protocol = { path = "../protocol", version = "0.7.6" } serde.workspace = true serde_json.workspace = true tokio.workspace = true diff --git a/crates/tui/Cargo.toml b/crates/tui/Cargo.toml index 3d5f9bcf..dae4b058 100644 --- a/crates/tui/Cargo.toml +++ b/crates/tui/Cargo.toml @@ -13,8 +13,8 @@ path = "src/main.rs" [dependencies] anyhow = "1.0.100" arboard = "3.4" -deepseek-secrets = { path = "../secrets", version = "0.7.5" } -deepseek-tools = { path = "../tools", version = "0.7.5" } +deepseek-secrets = { path = "../secrets", version = "0.7.6" } +deepseek-tools = { path = "../tools", version = "0.7.6" } async-stream = "0.3.6" async-trait = "0.1" bytes = "1.11.0" diff --git a/docs/V0_7_5_IMPLEMENTATION_PLAN.md b/docs/V0_7_5_IMPLEMENTATION_PLAN.md index 775a9436..eb0eebf0 100644 --- a/docs/V0_7_5_IMPLEMENTATION_PLAN.md +++ b/docs/V0_7_5_IMPLEMENTATION_PLAN.md @@ -1,61 +1,3 @@ # v0.7.5 Implementation Plan -Scope: background shell job UX, in-TUI MCP management/discovery, and V4 -context/cache policy. Do not include provider expansion or Whalescale -rename/migration work in this release lane. - -## Context/cache decision - -Default path: - -- Keep the transcript append-only and preserve the stable prefix for DeepSeek V4 cache reuse. -- Disable replacement-style `auto_compact` by default. -- Keep replacement compaction manual or late: if a user enables `auto_compact`, V4 compacts only near the 80% model-window guard (`800000` tokens for 1M-context models), not at reasoning-effort soft caps. -- Keep the Flash seam manager (`[context].enabled`) opt-in until issue #200 has repeatable cache-hit/miss evidence. -- Keep the capacity controller disabled by default. Treat it as telemetry or an experimental guardrail unless `capacity.enabled = true` is set. -- Use emergency overflow recovery only when the request would otherwise exceed the model input budget. - -Rationale: V4's 1M-token window and prefix-cache economics make early -replacement compaction suspect. The first shippable slice should prevent old -128K-era heuristics from rewriting context before there is evidence that the -rewrite is cheaper and more reliable than preserving a hot prefix. - -## Shippable slices - -### Slice 1: Context policy and docs - -- Change default `auto_compact` to off. -- Keep V4 replacement-compaction thresholds late and independent of reasoning effort. -- Make `[context].enabled` default to false. -- Make `docs/CONFIGURATION.md`, `docs/capacity_controller.md`, and `config.example.toml` match code defaults. -- Add focused tests for defaults and V4 threshold behavior. - -### Slice 2: Background shell job center (#195) - -- Add a job-center view fed by `ShellManager::list()`. -- Show command, cwd, linked task id when available, status, elapsed time, exit code, and latest output. -- Add controls to inspect full output, poll latest output, send stdin for PTY/stdin-capable jobs, kill a background job, and attach completed output as task evidence. -- Mark restart-stale jobs explicitly rather than presenting them as live. -- Add lifecycle tests for start, poll, cancel, complete, stale/restart, plus TUI snapshots for running and completed job details. - -### Slice 3: MCP manager (#196) - -- Add `/mcp` or a command-palette action that opens an MCP manager view. -- Show resolved config path, server enabled/disabled state, transport, command/url, timeout settings, startup errors, and discovered tool/resource/prompt counts. -- Wire `mcp_config_path` into the interactive config surface. -- Support init, add stdio server, add HTTP/SSE server, enable, disable, remove, validate, reconnect, and inspect tools/resources/prompts. -- Preserve both `servers` and `mcpServers` config shapes. - -### Slice 4: MCP discoverability (#197) - -- Add an MCP command-palette section backed by the same discovery state as the manager. -- Group tools/resources/prompts by server. -- Show disabled/failed servers without blocking palette rendering. -- Keep model-visible names consistent with `mcp__`. - -## Stop rules - -- Do not close #159 or #162 unless a verified PR actually resolves them. -- Do not add provider expansion. -- Do not rename or migrate anything to Whalescale. -- Do not broaden the TUI into a large redesign; each slice should remain independently testable and shippable. +This document has been archived. See [docs/archive/V0_7_5_IMPLEMENTATION_PLAN.md](archive/V0_7_5_IMPLEMENTATION_PLAN.md). diff --git a/docs/archive/V0_7_5_IMPLEMENTATION_PLAN.md b/docs/archive/V0_7_5_IMPLEMENTATION_PLAN.md new file mode 100644 index 00000000..775a9436 --- /dev/null +++ b/docs/archive/V0_7_5_IMPLEMENTATION_PLAN.md @@ -0,0 +1,61 @@ +# v0.7.5 Implementation Plan + +Scope: background shell job UX, in-TUI MCP management/discovery, and V4 +context/cache policy. Do not include provider expansion or Whalescale +rename/migration work in this release lane. + +## Context/cache decision + +Default path: + +- Keep the transcript append-only and preserve the stable prefix for DeepSeek V4 cache reuse. +- Disable replacement-style `auto_compact` by default. +- Keep replacement compaction manual or late: if a user enables `auto_compact`, V4 compacts only near the 80% model-window guard (`800000` tokens for 1M-context models), not at reasoning-effort soft caps. +- Keep the Flash seam manager (`[context].enabled`) opt-in until issue #200 has repeatable cache-hit/miss evidence. +- Keep the capacity controller disabled by default. Treat it as telemetry or an experimental guardrail unless `capacity.enabled = true` is set. +- Use emergency overflow recovery only when the request would otherwise exceed the model input budget. + +Rationale: V4's 1M-token window and prefix-cache economics make early +replacement compaction suspect. The first shippable slice should prevent old +128K-era heuristics from rewriting context before there is evidence that the +rewrite is cheaper and more reliable than preserving a hot prefix. + +## Shippable slices + +### Slice 1: Context policy and docs + +- Change default `auto_compact` to off. +- Keep V4 replacement-compaction thresholds late and independent of reasoning effort. +- Make `[context].enabled` default to false. +- Make `docs/CONFIGURATION.md`, `docs/capacity_controller.md`, and `config.example.toml` match code defaults. +- Add focused tests for defaults and V4 threshold behavior. + +### Slice 2: Background shell job center (#195) + +- Add a job-center view fed by `ShellManager::list()`. +- Show command, cwd, linked task id when available, status, elapsed time, exit code, and latest output. +- Add controls to inspect full output, poll latest output, send stdin for PTY/stdin-capable jobs, kill a background job, and attach completed output as task evidence. +- Mark restart-stale jobs explicitly rather than presenting them as live. +- Add lifecycle tests for start, poll, cancel, complete, stale/restart, plus TUI snapshots for running and completed job details. + +### Slice 3: MCP manager (#196) + +- Add `/mcp` or a command-palette action that opens an MCP manager view. +- Show resolved config path, server enabled/disabled state, transport, command/url, timeout settings, startup errors, and discovered tool/resource/prompt counts. +- Wire `mcp_config_path` into the interactive config surface. +- Support init, add stdio server, add HTTP/SSE server, enable, disable, remove, validate, reconnect, and inspect tools/resources/prompts. +- Preserve both `servers` and `mcpServers` config shapes. + +### Slice 4: MCP discoverability (#197) + +- Add an MCP command-palette section backed by the same discovery state as the manager. +- Group tools/resources/prompts by server. +- Show disabled/failed servers without blocking palette rendering. +- Keep model-visible names consistent with `mcp__`. + +## Stop rules + +- Do not close #159 or #162 unless a verified PR actually resolves them. +- Do not add provider expansion. +- Do not rename or migrate anything to Whalescale. +- Do not broaden the TUI into a large redesign; each slice should remain independently testable and shippable. diff --git a/npm/deepseek-tui/package.json b/npm/deepseek-tui/package.json index f2750dc0..d520925a 100644 --- a/npm/deepseek-tui/package.json +++ b/npm/deepseek-tui/package.json @@ -1,7 +1,7 @@ { "name": "deepseek-tui", - "version": "0.7.5", - "deepseekBinaryVersion": "0.7.5", + "version": "0.7.6", + "deepseekBinaryVersion": "0.7.6", "description": "Install and run deepseek and deepseek-tui binaries from GitHub release artifacts.", "author": "Hmbown", "license": "MIT",