release: v0.7.6

- 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
This commit is contained in:
Hunter Bown
2026-04-29 17:00:36 -05:00
parent 0568203ec2
commit 8ba8600155
17 changed files with 196 additions and 132 deletions
+38 -1
View File
@@ -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 `<media-file>` 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
Generated
+14 -14
View File
@@ -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"
+1 -1
View File
@@ -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"
+47 -23
View File
@@ -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 <path>` | 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
+1 -1
View File
@@ -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
+9 -9
View File
@@ -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
+7 -7
View File
@@ -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
+1 -1
View File
@@ -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
+8 -8
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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"
+1 -59
View File
@@ -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_<server>_<tool>`.
## 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).
@@ -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_<server>_<tool>`.
## 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.
+2 -2
View File
@@ -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",