From 7515695a1996e9b406a3cf1eef43208c6c248929 Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Thu, 21 May 2026 01:55:59 +0300 Subject: fix: keep cjk ime agent allow-list safe refs #149 --- src/server/headless.rs | 29 +++++++++++++++++++++++++++++ src/server/render_stream.rs | 4 ++-- 2 files changed, 31 insertions(+), 2 deletions(-) (limited to 'src/server') diff --git a/src/server/headless.rs b/src/server/headless.rs index f56dbdeb..539892e0 100644 --- a/src/server/headless.rs +++ b/src/server/headless.rs @@ -2804,6 +2804,7 @@ mod tests { state.reveal_hidden_cursor_for_cjk_ime = true; // Filter only Claude, but the test pane has no detected agent, so the // reveal must not apply. + state.cjk_ime_agent_filter_configured = true; state.cjk_ime_agents = vec![crate::detect::Agent::Claude]; let mut ws = crate::workspace::Workspace::test_new("test"); let pane_id = ws.tabs[0].root_pane; @@ -2827,6 +2828,34 @@ mod tests { ); } + #[tokio::test] + async fn virtual_render_skips_reveal_when_agent_filter_has_no_valid_entries() { + let mut state = AppState::test_new(); + state.reveal_hidden_cursor_for_cjk_ime = true; + state.cjk_ime_agent_filter_configured = true; + state.cjk_ime_agents = Vec::new(); + let mut ws = crate::workspace::Workspace::test_new("test"); + let pane_id = ws.tabs[0].root_pane; + ws.insert_test_runtime( + pane_id, + crate::terminal::TerminalRuntime::test_with_screen_bytes(20, 5, b"left\x1b[?25l"), + ); + + state.workspaces = vec![ws]; + state.active = Some(0); + state.selected = 0; + state.mode = crate::app::Mode::Terminal; + + let area = Rect::new(0, 0, 80, 24); + let (_buffer, cursor) = + crate::server::render_stream::render_virtual(&mut state, area, true); + + assert!( + cursor.as_ref().is_none_or(|cursor| !cursor.visible), + "agent filter with no valid entries should suppress reveal; got {cursor:?}", + ); + } + #[tokio::test] async fn virtual_render_omits_focused_pane_cursor_while_mobile_switcher_open() { let mut state = AppState::test_new(); diff --git a/src/server/render_stream.rs b/src/server/render_stream.rs index 6dd4ad48..b6e50444 100644 --- a/src/server/render_stream.rs +++ b/src/server/render_stream.rs @@ -327,9 +327,9 @@ fn focused_terminal_cursor(app_state: &AppState) -> Option { // Determine whether the IME-anchor reveal applies to this focused pane. // The master switch must be on, and either no agent filter is configured // (apply to any pane) or the focused pane's detected agent matches the - // allow-list. + // allow-list. A configured list with no valid entries reveals nothing. let reveal = app_state.reveal_hidden_cursor_for_cjk_ime - && (app_state.cjk_ime_agents.is_empty() || { + && (!app_state.cjk_ime_agent_filter_configured || { let detected = app_state .workspaces .get(ws_idx) -- cgit v1.2.3