Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
df63a18
fix(tui): show effective cost currency in config view
LING71671 May 21, 2026
ab192fe
fix(config): normalize cost currency display comparison
LING71671 May 27, 2026
1379d35
fix(provider): name DeepSeek in provider help text
reidliu41 May 29, 2026
b669ee7
fix: update terminal tab title from 'DeepSeek TUI' to 'CodeWhale'
zlh124 May 28, 2026
5de174a
chore(deps): bump tar in the cargo group across 1 directory
dependabot[bot] May 29, 2026
0a97f18
test(tui): make composer history flush deterministic
cyq1017 May 30, 2026
76089db
fix(mcp): avoid nested runtime panic on stdio shutdown
reidliu41 May 29, 2026
4bacda6
fix(tools): raise tool search default results
nightt5879 May 29, 2026
d58f101
fix(composer): allow slash-space messages
reidliu41 May 28, 2026
e2d6d22
fix(i18n): localize right-click context menu labels and descriptions
zlh124 May 28, 2026
c72dc28
fix(statusline): keep picker selection visible
reidliu41 May 28, 2026
30d8d08
feat(subagent): add stop-on-failure and bounded-effort guidance to ge…
May 29, 2026
9edd200
docs: add provider registry drift check
nightt5879 May 27, 2026
b0e7b67
style: satisfy current clippy lints
nightt5879 May 27, 2026
e2099dd
fix: harden provider registry drift check
Hmbown May 27, 2026
402b186
test: check tui provider enum drift
nightt5879 May 29, 2026
02d1145
docs: clarify custom provider configuration
LING71671 May 27, 2026
dc6dcdf
docs: add first-run user guide
AresNing May 27, 2026
bb4e876
perf(prompts): move environment block below volatile boundary for per…
May 28, 2026
0b7660d
docs(constitution): Tier 5 Local Law covers EngineConfig.instructions…
May 28, 2026
06aa24a
feat: show git branch in default footer
nightt5879 May 29, 2026
9d3d453
fix: use cached branch in footer
nightt5879 May 29, 2026
5d0a1c8
fix(tools): eagerly load all exec_shell companion tools
donglovejava May 28, 2026
09b4f78
fix(tui): route IME-committed Chinese characters directly to composer…
donglovejava May 28, 2026
1ff5db1
fix: cargo fmt and suppress dead_code warnings for unused paste-burst…
donglovejava May 28, 2026
09d3131
fix(windows): restore ENABLE_WINDOW_INPUT console flag after enable_r…
donglovejava May 29, 2026
da590e5
fix: remove spurious #[cfg(target_os = windows)] blocking ratatui imp…
donglovejava May 29, 2026
cb7614a
fix(tui): skip hidden worktrees in discovery walks
Hmbown May 27, 2026
32f424d
fix(tui): skip hidden worktrees in workspace discovery to prevent TUI…
donglovejava May 28, 2026
03c4b6b
fix: trailing newline in project_context.rs (cargo fmt)
donglovejava May 28, 2026
8f93713
feat(tui): add render diff debug log
cyq1017 May 29, 2026
63be80d
fix(tui): keep render debug logs in codewhale dir
cyq1017 May 29, 2026
bcdaf81
feat: add /cache stats — prefix hash/drift exposure and cache-hit sum…
encyc May 29, 2026
dd69f66
chore: cargo fmt fixes for /cache stats PR
encyc May 29, 2026
a053d1e
fix: address code review — stale hash, cache aggregation, hash clearing
encyc May 29, 2026
43f0989
fix: clear last_pinned_prefix_hash on model/provider switch
encyc May 29, 2026
fde5959
feat: keep startup prompts interactive
nightt5879 May 30, 2026
5c7209a
fix: harden startup prompt dispatch
nightt5879 May 30, 2026
9ef5a6d
fix(tui): replace standalone compacting label with animated working l…
donglovejava May 28, 2026
98cc2a6
fix: trailing newline in footer_ui.rs (cargo fmt)
donglovejava May 29, 2026
b907ea1
Fix legacy MCP SSE connections
zhuangbiaowei May 28, 2026
37f936e
Address MCP SSE review comments
zhuangbiaowei May 28, 2026
29417b3
Require explicit MCP SSE transport
zhuangbiaowei May 28, 2026
58c57cb
Improve MCP SSE error diagnostics
zhuangbiaowei May 28, 2026
d26c212
Retry MCP calls after stale SSE connections
zhuangbiaowei May 28, 2026
c2b572d
feat(tui): enrich activity detail context
axobase001 May 28, 2026
5e6b68b
fix(tui): refine activity detail review feedback
axobase001 May 28, 2026
17698b1
fix(tui): receipt live large tool outputs
axobase001 May 27, 2026
2533c5a
fix(tui): avoid live receipt history clones
axobase001 May 28, 2026
127f056
docs(docker): add toolbox compose template
axobase001 May 27, 2026
57625af
docs(docker): tighten toolbox compose defaults
axobase001 May 28, 2026
007140e
fix: suppress verbose CLI logging on Windows alt-screen to prevent TU…
aboimpinto May 21, 2026
2077644
fix(tui): gate verbose suppression behind alt-screen
aboimpinto May 27, 2026
e70f456
fix(tui): preserve verbose state across windows alt-screen
aboimpinto May 27, 2026
79cb61c
fix(tui): gate verbose snapshot helper on windows
aboimpinto May 27, 2026
bed328b
test(tui): cover windows verbose state restore
aboimpinto May 27, 2026
a8c2728
feat(prompt): add core tool taxonomy block
LING71671 May 27, 2026
56d62ed
fix(prompt): make tool taxonomy mode-aware
LING71671 May 27, 2026
e32bd1a
feat(update): add check-only release diagnostics
reidliu41 May 27, 2026
2962594
feat: add ShellDispatcher for shell-agnostic command execution
aboimpinto May 18, 2026
6e5d8dd
feat(shell_dispatcher): harden PowerShell detection and add execution…
aboimpinto May 19, 2026
45e7b12
style(tui): format shell dispatcher stack
aboimpinto May 27, 2026
ab95512
fix(tui): gate Windows shell detection
aboimpinto May 27, 2026
f1afcf3
fix(tui): restore raw mode conditionally
aboimpinto May 27, 2026
ec643c5
fix(tui): align shell tests with detected shell
aboimpinto May 27, 2026
0ca7d3c
test(tui): make shell helpers match detected shell
aboimpinto May 27, 2026
4fb6a22
fix(tui): tighten shell review followups
aboimpinto May 27, 2026
8104c47
fix(tui): handle bash on windows separately
aboimpinto May 27, 2026
e389909
fix(tui): use raw args for cmd payloads
aboimpinto May 27, 2026
95e1315
fix(tui): retry composer history atomic writes
Hmbown May 27, 2026
0ea84dc
feat(tui): add "Terminal" theme that fully inherits the host terminal…
May 20, 2026
b370d6f
refactor(tui): use Magenta + DarkGray for Terminal theme accents
May 20, 2026
78f8e11
test(tui): cover terminal theme palette remap
Hmbown May 27, 2026
b6edd87
fix(tui): make update hint transient
Hmbown May 27, 2026
f077d87
fix(tui): require uploaded release assets
Hmbown May 27, 2026
59e3173
fix: clean PDF-extracted text to reduce TUI clutter — collapse blank …
idling11 May 27, 2026
1f569d5
fix: address code review — preserve indentation, remove per-line allo…
idling11 May 28, 2026
53fb8b3
fix(session): serialize tool_use/tool_result blocks in session detail…
gaord May 27, 2026
c206c30
fix(runtime): preserve session tool detail fields
Hmbown May 27, 2026
23eac33
feat: macos display notification
May 23, 2026
0597e5f
fix: review
May 27, 2026
5b0bc68
fix: format
May 27, 2026
f889948
fix: format
May 27, 2026
88d8ba8
fix: test
May 27, 2026
da3a0ef
fix(tui): clear stale tool failures from sidebar (#1884)
Hmbown May 27, 2026
2e73634
fix(tui): make sidebar failure clearing order-aware
Hmbown May 27, 2026
568fbe2
feat: enforce allowed tools for custom commands
aboimpinto May 27, 2026
3aea6d2
feat(prompts): support inline string sources in EngineConfig.instruct…
May 28, 2026
7993f97
feat(state): add parent_entry_id on the message table for fork support
May 28, 2026
042b4b2
fix: fix sort of list_messages to ASC, use id to sort and use transa…
May 28, 2026
72798e5
fix: upsert_thread will not set current_leaf_id now, clear_messages w…
May 28, 2026
0c446bf
fix(tui): pin header to absolute top row with defensive two-pass layout
Hmbown May 27, 2026
95a737b
fix(tui): clear footer row before rendering statusline
May 27, 2026
a800f74
fix(tui): clear footer cells before rendering spans
May 27, 2026
d31caf4
fix(web_search): decode HTML entities in Bing result URLs
May 27, 2026
d7b6c80
fix(fetch_url): optionally trust fake-ip placeholder ranges to avoid …
May 29, 2026
af36756
feat(runtime): bridge user-input events and API to external GUI clients
gaord May 25, 2026
5994a40
fix(runtime): remove redundant turn finalization from interrupt_turn
gaord May 25, 2026
549ab8a
fix(runtime): use consistent error handling for user input API
gaord May 25, 2026
b8439c1
fix(runtime): don't clear active_turn in interrupt_turn
gaord May 25, 2026
e2b58e6
style: fix rustfmt formatting for user-input route
gaord May 25, 2026
f3def32
feat: read global AGENTS.md from ~/.agents/ as vendor-neutral fallback
mvanhorn May 27, 2026
efb63df
feat(lsp): add Java and Vue language server defaults
hufanexplore May 30, 2026
a83fa59
fix(tui): keep task shell tools eagerly loaded
Hmbown May 27, 2026
de3a1f7
feat(tui): FauxStep::Factory for live request-shape assertions
mvanhorn May 25, 2026
88000c0
feat: add Vietnamese (vi) localization support
hoclaptrinh33 May 29, 2026
313d456
Update crates/tui/src/localization.rs
hoclaptrinh33 May 29, 2026
56f158b
Update crates/tui/src/localization.rs
hoclaptrinh33 May 29, 2026
2938334
Update crates/tui/src/localization.rs
hoclaptrinh33 May 29, 2026
fc9a32b
fix(localization): finish Vietnamese locale after main merge
Hmbown May 31, 2026
07fd9d0
Merge commit 'refs/tmp/pr1902' into HEAD
Hmbown May 31, 2026
cd56421
fix(ci): ignore fenced blocks in provider docs span check
Hmbown May 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 90 additions & 2 deletions crates/tui/src/tui/views/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,7 @@ pub struct ConfigView {
filter: String,
status: Option<String>,
locale: Locale,
effective_cost_currency: String,
last_visible_rows: Cell<usize>,
last_row_hitboxes: RefCell<Vec<(u16, usize)>>,
}
Expand Down Expand Up @@ -819,6 +820,7 @@ impl ConfigView {
filter: String::new(),
status: None,
locale: app.ui_locale,
effective_cost_currency: cost_currency_config_value(app),
last_visible_rows: Cell::new(0),
last_row_hitboxes: RefCell::new(Vec::new()),
}
Expand All @@ -841,7 +843,7 @@ impl ConfigView {

let section = row.section.label().to_lowercase();
let key = row.key.to_lowercase();
let value = row.value.to_lowercase();
let value = self.row_display_value(row).to_lowercase();
let scope = row.scope.label().to_lowercase();

filter.split_whitespace().all(|term| {
Expand Down Expand Up @@ -1120,6 +1122,25 @@ impl ConfigView {

self.update_filter(|filter| filter.clear());
}

fn row_display_value(&self, row: &ConfigRow) -> String {
if row.key == "cost_currency"
&& row.scope == ConfigScope::Saved
&& row.value != self.effective_cost_currency
{
format!("{} (effective {})", row.value, self.effective_cost_currency)
} else {
row.value.clone()
}
}
Comment thread
greptile-apps[bot] marked this conversation as resolved.
}

fn cost_currency_config_value(app: &App) -> String {
match app.cost_currency {
crate::pricing::CostCurrency::Usd => "usd",
crate::pricing::CostCurrency::Cny => "cny",
}
.to_string()
}

fn config_hint_for_key(key: &str) -> &'static str {
Expand All @@ -1137,6 +1158,7 @@ fn config_hint_for_key(key: &str) -> &'static str {
"theme" => "system | dark | light | grayscale",
"locale" => "auto | en | ja | zh-Hans | pt-BR",
"background_color" => "#RRGGBB | default",
"cost_currency" => "usd | cny",
"default_mode" => "agent | plan | yolo",
"sidebar_width" => "10..=50",
"sidebar_focus" => "auto | work | tasks | agents | context | hidden",
Expand Down Expand Up @@ -1444,7 +1466,10 @@ impl ModalView for ConfigView {
} else {
Style::default().fg(palette::TEXT_PRIMARY)
};
let value = truncate_view_text(&row.value, CONFIG_VALUE_COLUMN_WIDTH);
let value = truncate_view_text(
&self.row_display_value(row),
CONFIG_VALUE_COLUMN_WIDTH,
);
let mut line = Line::from(format!(
" {:<key_width$} {:<value_width$} {}",
row.key,
Expand Down Expand Up @@ -2023,8 +2048,52 @@ mod tests {
KeyCode, KeyEvent, KeyModifiers, MouseButton, MouseEvent, MouseEventKind,
};
use ratatui::{buffer::Buffer, layout::Rect};
use std::ffi::OsString;
use std::fs;
use std::path::PathBuf;
use std::sync::MutexGuard;
use tempfile::TempDir;

struct ConfigSettingsEnvGuard {
_tmp: TempDir,
previous_config_path: Option<OsString>,
_lock: MutexGuard<'static, ()>,
}

impl ConfigSettingsEnvGuard {
fn new(settings_toml: &str) -> Self {
let lock = crate::test_support::lock_test_env();
let tmp = TempDir::new().expect("settings tempdir");
let config_path = tmp.path().join(".deepseek").join("config.toml");
let settings_path = config_path
.parent()
.expect("settings parent")
.join("settings.toml");
std::fs::create_dir_all(config_path.parent().expect("config parent"))
.expect("config dir");
std::fs::write(&settings_path, settings_toml).expect("settings file");
let previous_config_path = std::env::var_os("DEEPSEEK_CONFIG_PATH");
unsafe {
std::env::set_var("DEEPSEEK_CONFIG_PATH", &config_path);
}
Self {
_tmp: tmp,
previous_config_path,
_lock: lock,
}
}
}

impl Drop for ConfigSettingsEnvGuard {
fn drop(&mut self) {
unsafe {
match self.previous_config_path.take() {
Some(previous) => std::env::set_var("DEEPSEEK_CONFIG_PATH", previous),
None => std::env::remove_var("DEEPSEEK_CONFIG_PATH"),
}
}
}
}

fn create_test_app() -> App {
let options = TuiOptions {
Expand Down Expand Up @@ -2231,6 +2300,25 @@ mod tests {
assert_eq!(row.value, "https://ui-config-view.local/v1");
}

#[test]
fn config_view_cost_currency_shows_saved_and_effective_runtime_currency() {
let _guard = ConfigSettingsEnvGuard::new("locale = \"zh-Hans\"\ncost_currency = \"usd\"\n");
let app = create_test_app();
assert_eq!(app.ui_locale, Locale::ZhHans);
assert_eq!(app.cost_currency, crate::pricing::CostCurrency::Cny);

let view = ConfigView::new_for_app(&app);
let row = view
.rows
.iter()
.find(|row| row.key == "cost_currency")
.expect("cost_currency row");

assert_eq!(row.value, "usd");
assert_eq!(view.row_display_value(row), "usd (effective cny)");
assert_eq!(Settings::load().expect("settings").cost_currency, "usd");
}

#[test]
fn config_view_exposes_all_available_saved_settings() {
let app = create_test_app();
Expand Down
Loading