fix: restore default tui mouse scrolling

This commit is contained in:
Hunter Bown
2026-04-24 11:41:31 -05:00
parent 6c14e2e1f4
commit 8323bedfb7
16 changed files with 102 additions and 49 deletions
+5
View File
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [0.4.5] - 2026-04-24
### Fixed
- 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.
## [0.4.2] - 2026-04-24
### Fixed
Generated
+13 -13
View File
@@ -806,7 +806,7 @@ dependencies = [
[[package]]
name = "deepseek-agent"
version = "0.4.4"
version = "0.4.5"
dependencies = [
"deepseek-config",
"serde",
@@ -814,7 +814,7 @@ dependencies = [
[[package]]
name = "deepseek-app-server"
version = "0.4.4"
version = "0.4.5"
dependencies = [
"anyhow",
"axum",
@@ -837,7 +837,7 @@ dependencies = [
[[package]]
name = "deepseek-config"
version = "0.4.4"
version = "0.4.5"
dependencies = [
"anyhow",
"dirs",
@@ -848,7 +848,7 @@ dependencies = [
[[package]]
name = "deepseek-core"
version = "0.4.4"
version = "0.4.5"
dependencies = [
"anyhow",
"chrono",
@@ -867,7 +867,7 @@ dependencies = [
[[package]]
name = "deepseek-execpolicy"
version = "0.4.4"
version = "0.4.5"
dependencies = [
"anyhow",
"deepseek-protocol",
@@ -876,7 +876,7 @@ dependencies = [
[[package]]
name = "deepseek-hooks"
version = "0.4.4"
version = "0.4.5"
dependencies = [
"anyhow",
"async-trait",
@@ -890,7 +890,7 @@ dependencies = [
[[package]]
name = "deepseek-mcp"
version = "0.4.4"
version = "0.4.5"
dependencies = [
"anyhow",
"deepseek-protocol",
@@ -900,7 +900,7 @@ dependencies = [
[[package]]
name = "deepseek-protocol"
version = "0.4.4"
version = "0.4.5"
dependencies = [
"serde",
"serde_json",
@@ -908,7 +908,7 @@ dependencies = [
[[package]]
name = "deepseek-state"
version = "0.4.4"
version = "0.4.5"
dependencies = [
"anyhow",
"chrono",
@@ -920,7 +920,7 @@ dependencies = [
[[package]]
name = "deepseek-tools"
version = "0.4.4"
version = "0.4.5"
dependencies = [
"anyhow",
"async-trait",
@@ -933,7 +933,7 @@ dependencies = [
[[package]]
name = "deepseek-tui"
version = "0.4.4"
version = "0.4.5"
dependencies = [
"anyhow",
"arboard",
@@ -987,7 +987,7 @@ dependencies = [
[[package]]
name = "deepseek-tui-cli"
version = "0.4.4"
version = "0.4.5"
dependencies = [
"anyhow",
"chrono",
@@ -1005,7 +1005,7 @@ dependencies = [
[[package]]
name = "deepseek-tui-core"
version = "0.4.4"
version = "0.4.5"
[[package]]
name = "deranged"
+1 -1
View File
@@ -18,7 +18,7 @@ default-members = ["crates/cli", "crates/app-server", "crates/tui"]
resolver = "2"
[workspace.package]
version = "0.4.4"
version = "0.4.5"
edition = "2024"
license = "MIT"
repository = "https://github.com/Hmbown/DeepSeek-TUI"
+1 -1
View File
@@ -68,7 +68,7 @@ max_subagents = 5 # optional (1-20)
# ─────────────────────────────────────────────────────────────────────────────────
[tui]
alternate_screen = "auto" # auto | always | never
mouse_capture = false # false keeps terminal-native drag selection/copy; true enables internal mouse scrolling/selection
mouse_capture = true # true keeps wheel scrolling inside the TUI; false allows terminal-native drag selection/copy
# ─────────────────────────────────────────────────────────────────────────────────
# Feature Flags
+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.4.4" }
deepseek-config = { path = "../config", version = "0.4.5" }
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.4.4" }
deepseek-config = { path = "../config", version = "0.4.4" }
deepseek-core = { path = "../core", version = "0.4.4" }
deepseek-execpolicy = { path = "../execpolicy", version = "0.4.4" }
deepseek-hooks = { path = "../hooks", version = "0.4.4" }
deepseek-mcp = { path = "../mcp", version = "0.4.4" }
deepseek-protocol = { path = "../protocol", version = "0.4.4" }
deepseek-state = { path = "../state", version = "0.4.4" }
deepseek-tools = { path = "../tools", version = "0.4.4" }
deepseek-agent = { path = "../agent", version = "0.4.5" }
deepseek-config = { path = "../config", version = "0.4.5" }
deepseek-core = { path = "../core", version = "0.4.5" }
deepseek-execpolicy = { path = "../execpolicy", version = "0.4.5" }
deepseek-hooks = { path = "../hooks", version = "0.4.5" }
deepseek-mcp = { path = "../mcp", version = "0.4.5" }
deepseek-protocol = { path = "../protocol", version = "0.4.5" }
deepseek-state = { path = "../state", version = "0.4.5" }
deepseek-tools = { path = "../tools", version = "0.4.5" }
serde.workspace = true
serde_json.workspace = true
tokio.workspace = true
+6 -6
View File
@@ -14,12 +14,12 @@ path = "src/main.rs"
anyhow.workspace = true
clap.workspace = true
clap_complete.workspace = true
deepseek-agent = { path = "../agent", version = "0.4.4" }
deepseek-app-server = { path = "../app-server", version = "0.4.4" }
deepseek-config = { path = "../config", version = "0.4.4" }
deepseek-execpolicy = { path = "../execpolicy", version = "0.4.4" }
deepseek-mcp = { path = "../mcp", version = "0.4.4" }
deepseek-state = { path = "../state", version = "0.4.4" }
deepseek-agent = { path = "../agent", version = "0.4.5" }
deepseek-app-server = { path = "../app-server", version = "0.4.5" }
deepseek-config = { path = "../config", version = "0.4.5" }
deepseek-execpolicy = { path = "../execpolicy", version = "0.4.5" }
deepseek-mcp = { path = "../mcp", version = "0.4.5" }
deepseek-state = { path = "../state", version = "0.4.5" }
chrono.workspace = true
serde_json.workspace = true
tokio.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.4.4" }
deepseek-config = { path = "../config", version = "0.4.4" }
deepseek-execpolicy = { path = "../execpolicy", version = "0.4.4" }
deepseek-hooks = { path = "../hooks", version = "0.4.4" }
deepseek-mcp = { path = "../mcp", version = "0.4.4" }
deepseek-protocol = { path = "../protocol", version = "0.4.4" }
deepseek-state = { path = "../state", version = "0.4.4" }
deepseek-tools = { path = "../tools", version = "0.4.4" }
deepseek-agent = { path = "../agent", version = "0.4.5" }
deepseek-config = { path = "../config", version = "0.4.5" }
deepseek-execpolicy = { path = "../execpolicy", version = "0.4.5" }
deepseek-hooks = { path = "../hooks", version = "0.4.5" }
deepseek-mcp = { path = "../mcp", version = "0.4.5" }
deepseek-protocol = { path = "../protocol", version = "0.4.5" }
deepseek-state = { path = "../state", version = "0.4.5" }
deepseek-tools = { path = "../tools", version = "0.4.5" }
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.4.4" }
deepseek-protocol = { path = "../protocol", version = "0.4.5" }
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.4.4" }
deepseek-protocol = { path = "../protocol", version = "0.4.5" }
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.4.4" }
deepseek-protocol = { path = "../protocol", version = "0.4.5" }
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.4.4" }
deepseek-protocol = { path = "../protocol", version = "0.4.5" }
serde.workspace = true
serde_json.workspace = true
tokio.workspace = true
+49 -1
View File
@@ -2130,7 +2130,7 @@ fn should_use_mouse_capture(cli: &Cli, config: &Config, use_alt_screen: bool) ->
.tui
.as_ref()
.and_then(|tui| tui.mouse_capture)
.unwrap_or(false)
.unwrap_or(true)
}
fn is_zellij() -> bool {
@@ -2479,6 +2479,54 @@ async fn run_exec_agent(
Ok(())
}
#[cfg(test)]
mod terminal_mode_tests {
use super::*;
use clap::Parser;
fn parse_cli(args: &[&str]) -> Cli {
Cli::try_parse_from(args).expect("CLI args should parse")
}
#[test]
fn mouse_capture_defaults_on_when_alternate_screen_is_active() {
let cli = parse_cli(&["deepseek"]);
let config = Config::default();
assert!(should_use_mouse_capture(&cli, &config, true));
}
#[test]
fn no_mouse_capture_flag_disables_mouse_capture() {
let cli = parse_cli(&["deepseek", "--no-mouse-capture"]);
let config = Config::default();
assert!(!should_use_mouse_capture(&cli, &config, true));
}
#[test]
fn config_can_disable_default_mouse_capture() {
let cli = parse_cli(&["deepseek"]);
let config = Config {
tui: Some(crate::config::TuiConfig {
alternate_screen: None,
mouse_capture: Some(false),
}),
..Config::default()
};
assert!(!should_use_mouse_capture(&cli, &config, true));
}
#[test]
fn mouse_capture_is_off_without_alternate_screen() {
let cli = parse_cli(&["deepseek", "--mouse-capture"]);
let config = Config::default();
assert!(!should_use_mouse_capture(&cli, &config, false));
}
}
#[cfg(test)]
mod doctor_mcp_tests {
use super::*;
+1 -1
View File
@@ -163,7 +163,7 @@ If you are upgrading from older releases:
- `[capacity].deepseek_v3_2_reasoner_prior` (float, default `4.1`)
- `[capacity].fallback_default_prior` (float, default `3.8`)
- `tui.alternate_screen` (string, optional): `auto`, `always`, or `never`. `auto` disables the alternate screen in Zellij; `--no-alt-screen` forces inline mode. Set `never` or run with `--no-alt-screen` when you want real terminal scrollback.
- `tui.mouse_capture` (bool, optional, default `false`): enable internal mouse scrolling/transcript selection. Leave this off for terminal-native drag selection and highlight-to-copy; `--mouse-capture` enables it for one run, and `--no-mouse-capture` forces it off.
- `tui.mouse_capture` (bool, optional, default `true` when the alternate screen is active): enable internal mouse scrolling/transcript selection. Set this to `false` or run with `--no-mouse-capture` for terminal-native drag selection and highlight-to-copy.
- `hooks` (optional): lifecycle hooks configuration (see `config.example.toml`).
- `features.*` (optional): feature flag overrides (see below).
+2 -2
View File
@@ -79,8 +79,8 @@ Run `deepseek --help` for the canonical list. Common flags:
- `-r, --resume <ID|PREFIX|latest>`: resume a saved session
- `-c, --continue`: resume the most recent session
- `--max-subagents <N>`: clamp to `1..=20`
- `--no-alt-screen`: run inline so native terminal scrollback works
- `--mouse-capture` / `--no-mouse-capture`: opt in or out of internal mouse scrolling/selection
- `--no-alt-screen`: run inline without the alternate screen buffer
- `--mouse-capture` / `--no-mouse-capture`: opt in or out of internal mouse scrolling/selection. Mouse capture is enabled by default when the alternate screen is active; use `--no-mouse-capture` when you need terminal-native drag selection.
- `--profile <NAME>`: select config profile
- `--config <PATH>`: config file path
- `-v, --verbose`: verbose logging
+2 -2
View File
@@ -1,7 +1,7 @@
{
"name": "deepseek-tui",
"version": "0.4.4",
"deepseekBinaryVersion": "0.4.4",
"version": "0.4.5",
"deepseekBinaryVersion": "0.4.5",
"description": "Install and run deepseek and deepseek-tui binaries from GitHub release artifacts.",
"author": "Hmbown",
"license": "MIT",