From ddf9f58368d2233f26afd7c93e0ee0d6376fe093 Mon Sep 17 00:00:00 2001 From: hqt <188678175+hongqitai@users.noreply.github.com> Date: Sat, 20 Jun 2026 11:51:12 +0800 Subject: [PATCH 1/2] style(clippy): fix clippy warnings --- crates/cli/src/update.rs | 3 +-- .../tui/src/commands/groups/config/config.rs | 5 ++-- crates/tui/src/config.rs | 2 +- crates/tui/src/fleet/ledger.rs | 4 +-- crates/tui/src/oauth.rs | 6 ++--- crates/tui/src/prompts.rs | 2 +- crates/tui/src/retry_status.rs | 2 +- crates/tui/src/tools/git.rs | 4 +-- crates/tui/src/tools/git_history.rs | 2 +- crates/tui/src/tools/subagent/mod.rs | 4 +-- crates/tui/src/tui/tab/benches.rs | 25 ++++++++----------- crates/tui/src/tui/tab/delegator.rs | 10 ++++---- crates/tui/src/tui/tab/group.rs | 2 +- crates/tui/src/tui/tab/key_e2e.rs | 8 +++--- crates/tui/src/tui/tab/manager.rs | 4 +-- crates/tui/src/tui/tab/meeting.rs | 2 +- crates/tui/src/tui/ui.rs | 5 ++-- crates/tui/src/tui/ui/tests.rs | 5 ---- crates/tui/src/tui/views/mod.rs | 8 +----- 19 files changed, 43 insertions(+), 60 deletions(-) diff --git a/crates/cli/src/update.rs b/crates/cli/src/update.rs index ed1edcbc7..a03276df3 100644 --- a/crates/cli/src/update.rs +++ b/crates/cli/src/update.rs @@ -82,8 +82,7 @@ pub fn run_update(beta: bool, check_only: bool, proxy_arg: Option) -> Re if let UpdateReleaseSource::Mirror { base_url } = &fetched.source { if channel == ReleaseChannel::Beta { println!( - "Using release mirror {}; --beta does not select GitHub beta releases in mirror mode.", - base_url + "Using release mirror {base_url}; --beta does not select GitHub beta releases in mirror mode." ); } } else if !update_is_needed(channel, current_version, latest_tag)? { diff --git a/crates/tui/src/commands/groups/config/config.rs b/crates/tui/src/commands/groups/config/config.rs index 2aee8b1d5..8dc191a22 100644 --- a/crates/tui/src/commands/groups/config/config.rs +++ b/crates/tui/src/commands/groups/config/config.rs @@ -613,8 +613,7 @@ pub fn set_config_value(app: &mut App, key: &str, value: &str, persist: bool) -> && !(MIN_STREAM_CHUNK_TIMEOUT_SECS..=MAX_STREAM_CHUNK_TIMEOUT_SECS).contains(&raw) { return CommandResult::error(format!( - "stream_chunk_timeout_secs must be 0 or {}..={}", - MIN_STREAM_CHUNK_TIMEOUT_SECS, MAX_STREAM_CHUNK_TIMEOUT_SECS + "stream_chunk_timeout_secs must be 0 or {MIN_STREAM_CHUNK_TIMEOUT_SECS}..={MAX_STREAM_CHUNK_TIMEOUT_SECS}" )); } let resolved = if raw == 0 { @@ -1878,7 +1877,7 @@ mod tests { ) ); assert!(saved.contains("[providers.xiaomi_mimo]")); - assert!(saved.contains(&format!("base_url = \"{}\"", DEFAULT_XIAOMI_MIMO_BASE_URL))); + assert!(saved.contains(&format!("base_url = \"{DEFAULT_XIAOMI_MIMO_BASE_URL}\""))); } #[test] diff --git a/crates/tui/src/config.rs b/crates/tui/src/config.rs index 179f8a8e1..596fe2943 100644 --- a/crates/tui/src/config.rs +++ b/crates/tui/src/config.rs @@ -5991,7 +5991,7 @@ pub fn clear_active_provider_api_key(provider: &str) -> Result<()> { let existing = fs::read_to_string(&config_path)?; let mut result = String::new(); - let target_section = format!("[providers.{}]", provider); + let target_section = format!("[providers.{provider}]"); let mut in_target_section = false; for line in existing.lines() { diff --git a/crates/tui/src/fleet/ledger.rs b/crates/tui/src/fleet/ledger.rs index 7b863bf95..0dc530cbe 100644 --- a/crates/tui/src/fleet/ledger.rs +++ b/crates/tui/src/fleet/ledger.rs @@ -439,11 +439,11 @@ impl FleetLedger { } fn task_key(run_id: &str, task_id: &str) -> String { - format!("{}:{}", run_id, task_id) + format!("{run_id}:{task_id}") } fn event_key(worker_id: &str, run_id: &str, task_id: &str) -> String { - format!("{}:{}:{}", worker_id, run_id, task_id) + format!("{worker_id}:{run_id}:{task_id}") } fn compact_event_key(event: &FleetWorkerEvent) -> String { diff --git a/crates/tui/src/oauth.rs b/crates/tui/src/oauth.rs index 68e3d8680..4a22301aa 100644 --- a/crates/tui/src/oauth.rs +++ b/crates/tui/src/oauth.rs @@ -330,7 +330,7 @@ mod tests { fn jwt_expiry_parses_valid_token() { // A minimal JWT with {"exp": 9999999999} as payload. let payload = URL_SAFE_NO_PAD.encode(b"{\"exp\":9999999999}"); - let token = format!("header.{}.signature", payload); + let token = format!("header.{payload}.signature"); assert_eq!(jwt_expiry_seconds(&token), Some(9999999999)); } @@ -345,7 +345,7 @@ mod tests { fn token_is_expired_detects_future() { // Far future — should not be expired. let payload = URL_SAFE_NO_PAD.encode(b"{\"exp\":9999999999}"); - let token = format!("header.{}.sig", payload); + let token = format!("header.{payload}.sig"); assert!(!token_is_expired(&token)); } @@ -353,7 +353,7 @@ mod tests { fn token_is_expired_detects_past() { // Way in the past. let payload = URL_SAFE_NO_PAD.encode(b"{\"exp\":1000000000}"); - let token = format!("header.{}.sig", payload); + let token = format!("header.{payload}.sig"); assert!(token_is_expired(&token)); } diff --git a/crates/tui/src/prompts.rs b/crates/tui/src/prompts.rs index 16b11ba55..16504be53 100644 --- a/crates/tui/src/prompts.rs +++ b/crates/tui/src/prompts.rs @@ -791,7 +791,7 @@ fn apply_model_template( if window == 1_000_000 { "one-million".to_string() } else { - format!("{}", window) + format!("{window}") } ) } else { diff --git a/crates/tui/src/retry_status.rs b/crates/tui/src/retry_status.rs index f4d3d869f..e46d8e1e6 100644 --- a/crates/tui/src/retry_status.rs +++ b/crates/tui/src/retry_status.rs @@ -99,7 +99,7 @@ pub fn snapshot() -> RetryState { pub fn note_rate_limit(delay: Duration) { let deadline = Instant::now() + delay; if let Ok(mut current) = rate_limit_cell().lock() - && current.map_or(true, |existing| existing < deadline) + && current.is_none_or(|existing| existing < deadline) { *current = Some(deadline); } diff --git a/crates/tui/src/tools/git.rs b/crates/tui/src/tools/git.rs index ae7e7f934..1f696652c 100644 --- a/crates/tui/src/tools/git.rs +++ b/crates/tui/src/tools/git.rs @@ -329,7 +329,7 @@ mod tests { fn init_git_repo(root: &Path) { let run = |args: &[&str]| { let status = crate::dependencies::Git::status(args, root).expect("git should spawn"); - assert!(status.success(), "git {:?} failed", args); + assert!(status.success(), "git {args:?} failed"); }; run(&["init", "-q"]); @@ -341,7 +341,7 @@ mod tests { fn commit_all(root: &Path, message: &str) { let run = |args: &[&str]| { let status = crate::dependencies::Git::status(args, root).expect("git should spawn"); - assert!(status.success(), "git {:?} failed", args); + assert!(status.success(), "git {args:?} failed"); }; run(&["add", "."]); run(&["commit", "-q", "-m", message]); diff --git a/crates/tui/src/tools/git_history.rs b/crates/tui/src/tools/git_history.rs index d3dd99eaa..e73ec0c6a 100644 --- a/crates/tui/src/tools/git_history.rs +++ b/crates/tui/src/tools/git_history.rs @@ -513,7 +513,7 @@ mod tests { fn run_git(root: &Path, args: &[&str]) { let status = crate::dependencies::Git::status(args, root).expect("git should spawn"); - assert!(status.success(), "git {:?} failed", args); + assert!(status.success(), "git {args:?} failed"); } fn init_git_repo(root: &Path) { diff --git a/crates/tui/src/tools/subagent/mod.rs b/crates/tui/src/tools/subagent/mod.rs index 4f7165018..4d3167f4e 100644 --- a/crates/tui/src/tools/subagent/mod.rs +++ b/crates/tui/src/tools/subagent/mod.rs @@ -5426,12 +5426,10 @@ fn stamp_subagent_summary(raw: &str) -> (String, bool) { .saturating_sub(SUBAGENT_SUMMARY_HEAD_CHARS) .saturating_sub(SUBAGENT_SUMMARY_TAIL_CHARS); let stamped = format!( - "{head}\n\n[Sub-agent summary truncated: {head_chars} + {tail_chars} of {total} \ + "{head}\n\n[Sub-agent summary truncated: {SUBAGENT_SUMMARY_HEAD_CHARS} + {SUBAGENT_SUMMARY_TAIL_CHARS} of {total} \ chars shown. This is the child's self-report; the elided middle ({omitted} chars) is not in \ the spillover store and cannot be retrieved via retrieve_tool_result. Re-open the child or \ read changed files directly to verify material claims.]\n\n{tail}", - head_chars = SUBAGENT_SUMMARY_HEAD_CHARS, - tail_chars = SUBAGENT_SUMMARY_TAIL_CHARS, ); (stamped, true) } diff --git a/crates/tui/src/tui/tab/benches.rs b/crates/tui/src/tui/tab/benches.rs index 103ef60ae..73c1b8085 100644 --- a/crates/tui/src/tui/tab/benches.rs +++ b/crates/tui/src/tui/tab/benches.rs @@ -32,10 +32,7 @@ mod benches { } else { 0 }; - eprintln!( - "[bench] {:50} total={:>8.2?} ops={:>6} per_op={:>7} ns", - label, dur, ops, per_op_ns - ); + eprintln!("[bench] {label:50} total={dur:>8.2?} ops={ops:>6} per_op={per_op_ns:>7} ns"); } #[test] @@ -44,7 +41,7 @@ mod benches { let mut manager = TabManager::new(); for i in 0..9 { manager - .create_tab(format!("Bench Tab {}", i), TabType::Chat) + .create_tab(format!("Bench Tab {i}"), TabType::Chat) .expect("create_tab should succeed"); } report("create 9 tabs", start.elapsed(), 9); @@ -55,7 +52,7 @@ mod benches { let mut manager = TabManager::new(); for i in 0..9 { manager - .create_tab(format!("Tab {}", i), TabType::Chat) + .create_tab(format!("Tab {i}"), TabType::Chat) .expect("create_tab"); } let start = Instant::now(); @@ -77,7 +74,7 @@ mod benches { let start = Instant::now(); for i in 0..1000 { - manager.delegate_task(from, to, format!("Task {}", i), Priority::Normal); + manager.delegate_task(from, to, format!("Task {i}"), Priority::Normal); } report("1000 delegations", start.elapsed(), 1000); } @@ -96,7 +93,7 @@ mod benches { Priority::Urgent, ]; for i in 0..100 { - manager.delegate_task(from, to, format!("Task {}", i), priorities[i % 4]); + manager.delegate_task(from, to, format!("Task {i}"), priorities[i % 4]); } let start = Instant::now(); @@ -105,7 +102,7 @@ mod benches { count += 1; } report( - &format!("drain {} priority-sorted tasks", count), + &format!("drain {count} priority-sorted tasks"), start.elapsed(), count, ); @@ -116,7 +113,7 @@ mod benches { let mut manager = TabManager::new(); for i in 0..9 { manager - .create_tab(format!("Tab {}", i), TabType::Chat) + .create_tab(format!("Tab {i}"), TabType::Chat) .expect("create"); } @@ -124,7 +121,7 @@ mod benches { let from = manager.active_id().unwrap(); let to = manager.all_tabs()[1].id; for i in 0..20 { - manager.delegate_task(from, to, format!("Task {}", i), Priority::Normal); + manager.delegate_task(from, to, format!("Task {i}"), Priority::Normal); } let start = Instant::now(); @@ -153,7 +150,7 @@ mod benches { let mut manager = TabManager::new(); for i in 0..9 { manager - .create_tab(format!("Tab {}", i), TabType::Chat) + .create_tab(format!("Tab {i}"), TabType::Chat) .expect("create"); } let tabs: Vec = manager.all_tabs().iter().map(|t| t.id).collect(); @@ -194,7 +191,7 @@ mod benches { let mut manager = TabManager::new(); for i in 0..9 { manager - .create_tab(format!("Tab {}", i), TabType::Chat) + .create_tab(format!("Tab {i}"), TabType::Chat) .expect("create"); } @@ -209,7 +206,7 @@ mod benches { count += 1; } report( - &format!("iterate {} tabs at width {}", count, width), + &format!("iterate {count} tabs at width {width}"), start.elapsed(), count, ); diff --git a/crates/tui/src/tui/tab/delegator.rs b/crates/tui/src/tui/tab/delegator.rs index 10df3b9d7..cd1972699 100644 --- a/crates/tui/src/tui/tab/delegator.rs +++ b/crates/tui/src/tui/tab/delegator.rs @@ -362,7 +362,7 @@ impl TaskDelegator { fn generate_task_id(&mut self) -> String { let id = self.next_id; self.next_id += 1; - format!("delegation_{}", id) + format!("delegation_{id}") } pub(crate) fn advance_next_id_past_existing_tasks(&mut self) { @@ -508,9 +508,9 @@ mod tests { // Create and complete 1000 tasks (more than MAX_COMPLETED_RESULTS=256) for i in 0..1000 { let task_id = delegator - .create_delegation(from, to, format!("Task {}", i), Priority::Normal) + .create_delegation(from, to, format!("Task {i}"), Priority::Normal) .unwrap(); - delegator.complete(&task_id, format!("Result {}", i)); + delegator.complete(&task_id, format!("Result {i}")); } // Should be bounded at MAX_COMPLETED_RESULTS @@ -531,9 +531,9 @@ mod tests { // Complete many tasks for i in 0..100 { let task_id = delegator - .create_delegation(from, to, format!("Task {}", i), Priority::Normal) + .create_delegation(from, to, format!("Task {i}"), Priority::Normal) .unwrap(); - delegator.complete(&task_id, format!("Result {}", i)); + delegator.complete(&task_id, format!("Result {i}")); } assert_eq!(delegator.results_for_tab(to).len(), 100); diff --git a/crates/tui/src/tui/tab/group.rs b/crates/tui/src/tui/tab/group.rs index e61fb1d03..615abfe72 100644 --- a/crates/tui/src/tui/tab/group.rs +++ b/crates/tui/src/tui/tab/group.rs @@ -237,7 +237,7 @@ impl TabGroupManager { fn generate_group_id(&mut self) -> String { let id = self.next_id; self.next_id += 1; - format!("group_{}", id) + format!("group_{id}") } pub(crate) fn advance_next_id_past_existing_groups(&mut self) { diff --git a/crates/tui/src/tui/tab/key_e2e.rs b/crates/tui/src/tui/tab/key_e2e.rs index d80d4f9c2..a64d9e298 100644 --- a/crates/tui/src/tui/tab/key_e2e.rs +++ b/crates/tui/src/tui/tab/key_e2e.rs @@ -93,7 +93,7 @@ mod tests { let mut manager = TabManager::new(); for i in 1..=5 { manager - .create_tab(format!("Tab {}", i), TabType::Chat) + .create_tab(format!("Tab {i}"), TabType::Chat) .expect("create"); } @@ -112,7 +112,7 @@ mod tests { let mut manager = TabManager::new(); for i in 1..=3 { manager - .create_tab(format!("Tab {}", i), TabType::Chat) + .create_tab(format!("Tab {i}"), TabType::Chat) .unwrap(); } @@ -126,7 +126,7 @@ mod tests { let mut manager = TabManager::new(); for i in 1..=3 { manager - .create_tab(format!("Tab {}", i), TabType::Chat) + .create_tab(format!("Tab {i}"), TabType::Chat) .unwrap(); } // Initially at last (2) @@ -326,7 +326,7 @@ mod tests { let mut manager = TabManager::new(); for i in 0..9 { manager - .create_tab(format!("T{}", i), TabType::Chat) + .create_tab(format!("T{i}"), TabType::Chat) .expect("create"); } // Close all diff --git a/crates/tui/src/tui/tab/manager.rs b/crates/tui/src/tui/tab/manager.rs index 7bf7fb2f7..fa6c4a1a1 100644 --- a/crates/tui/src/tui/tab/manager.rs +++ b/crates/tui/src/tui/tab/manager.rs @@ -625,8 +625,8 @@ mod tests { // Create max tabs for i in 0..MAX_TABS { - let result = manager.create_tab(format!("Tab {}", i), TabType::Chat); - assert!(result.is_some(), "Tab {} should be created", i); + let result = manager.create_tab(format!("Tab {i}"), TabType::Chat); + assert!(result.is_some(), "Tab {i} should be created"); } // Try to create one more diff --git a/crates/tui/src/tui/tab/meeting.rs b/crates/tui/src/tui/tab/meeting.rs index d969c6bd2..89f75e6ea 100644 --- a/crates/tui/src/tui/tab/meeting.rs +++ b/crates/tui/src/tui/tab/meeting.rs @@ -332,7 +332,7 @@ impl MeetingManager { fn generate_meeting_id(&mut self) -> String { let id = self.next_meeting_id; self.next_meeting_id += 1; - format!("meeting_{}", id) + format!("meeting_{id}") } } diff --git a/crates/tui/src/tui/ui.rs b/crates/tui/src/tui/ui.rs index 51a2e8738..3ba95ef53 100644 --- a/crates/tui/src/tui/ui.rs +++ b/crates/tui/src/tui/ui.rs @@ -279,6 +279,7 @@ const TERMINAL_INPUT_POLL_INTERVAL: Duration = Duration::from_millis(50); const TERMINAL_INPUT_HEARTBEAT_INTERVAL: Duration = Duration::from_millis(500); const TERMINAL_INPUT_STALL_TIMEOUT: Duration = Duration::from_secs(5); const TERMINAL_INPUT_RECOVERY_COOLDOWN: Duration = Duration::from_secs(10); +// must less than or equal 128 because engine event drains must stay bounded so high sub-agent fanout cannot monopolize the UI tick const MAX_ENGINE_EVENTS_PER_DRAIN: usize = 128; enum TerminalInputMessage { @@ -6740,9 +6741,9 @@ async fn switch_provider( target.as_str(), ); switch_summary.push(char::from(10)); - switch_summary.push_str(&format!("Model: {} → {}", previous_model, new_model)); + switch_summary.push_str(&format!("Model: {previous_model} → {new_model}")); switch_summary.push(char::from(10)); - switch_summary.push_str(&format!("Endpoint: {}", new_endpoint)); + switch_summary.push_str(&format!("Endpoint: {new_endpoint}")); if let Some(ref warning) = persist_warning { switch_summary.push(char::from(10)); switch_summary.push_str(warning); diff --git a/crates/tui/src/tui/ui/tests.rs b/crates/tui/src/tui/ui/tests.rs index e6e90a587..e831ee5e5 100644 --- a/crates/tui/src/tui/ui/tests.rs +++ b/crates/tui/src/tui/ui/tests.rs @@ -10609,11 +10609,6 @@ fn agent_progress_redraw_coalesces_once_per_agent_per_drain() { #[test] fn six_worker_progress_storm_keeps_input_render_and_cancel_live() { - assert!( - MAX_ENGINE_EVENTS_PER_DRAIN <= 128, - "engine event drains must stay bounded so high sub-agent fanout cannot monopolize the UI tick" - ); - let t0 = Instant::now(); let mut last_redraw = None; let mut seen_agents = HashSet::new(); diff --git a/crates/tui/src/tui/views/mod.rs b/crates/tui/src/tui/views/mod.rs index 35c293a2f..f41eede87 100644 --- a/crates/tui/src/tui/views/mod.rs +++ b/crates/tui/src/tui/views/mod.rs @@ -1589,13 +1589,7 @@ impl ModalView for ConfigView { let scope = truncate_view_text(row.scope.label(self.locale), scope_column_width); let mut line = Line::from(format!( - " {: Date: Sat, 20 Jun 2026 12:08:21 +0800 Subject: [PATCH 2/2] style: use `const _: () = assert!` to check value --- crates/tui/src/tui/ui.rs | 1 - crates/tui/src/tui/ui/tests.rs | 5 +++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/tui/src/tui/ui.rs b/crates/tui/src/tui/ui.rs index 3ba95ef53..7097b051c 100644 --- a/crates/tui/src/tui/ui.rs +++ b/crates/tui/src/tui/ui.rs @@ -279,7 +279,6 @@ const TERMINAL_INPUT_POLL_INTERVAL: Duration = Duration::from_millis(50); const TERMINAL_INPUT_HEARTBEAT_INTERVAL: Duration = Duration::from_millis(500); const TERMINAL_INPUT_STALL_TIMEOUT: Duration = Duration::from_secs(5); const TERMINAL_INPUT_RECOVERY_COOLDOWN: Duration = Duration::from_secs(10); -// must less than or equal 128 because engine event drains must stay bounded so high sub-agent fanout cannot monopolize the UI tick const MAX_ENGINE_EVENTS_PER_DRAIN: usize = 128; enum TerminalInputMessage { diff --git a/crates/tui/src/tui/ui/tests.rs b/crates/tui/src/tui/ui/tests.rs index e831ee5e5..99e4f174c 100644 --- a/crates/tui/src/tui/ui/tests.rs +++ b/crates/tui/src/tui/ui/tests.rs @@ -10609,6 +10609,11 @@ fn agent_progress_redraw_coalesces_once_per_agent_per_drain() { #[test] fn six_worker_progress_storm_keeps_input_render_and_cancel_live() { + const _: () = assert!( + MAX_ENGINE_EVENTS_PER_DRAIN <= 128, + "engine event drains must stay bounded so high sub-agent fanout cannot monopolize the UI tick" + ); + let t0 = Instant::now(); let mut last_redraw = None; let mut seen_agents = HashSet::new();