Skip to content

Commit dd57547

Browse files
oz-agentvikvang
andcommitted
fix: prevent codex status from toggling rich input
Co-Authored-By: Sathvik Vangavolu <113149539+vikvang@users.noreply.github.com>
1 parent 2cda67b commit dd57547

2 files changed

Lines changed: 72 additions & 2 deletions

File tree

app/src/terminal/view.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,9 @@ use crate::terminal::cli_agent_sessions::event::{
141141
parse_event, CLIAgentEvent, CLIAgentEventPayload, CLIAgentEventType,
142142
CLI_AGENT_NOTIFICATION_SENTINEL,
143143
};
144-
use crate::terminal::cli_agent_sessions::listener::{is_agent_supported, CLIAgentSessionListener};
144+
use crate::terminal::cli_agent_sessions::listener::{
145+
agent_supports_rich_status, is_agent_supported, CLIAgentSessionListener,
146+
};
145147
#[cfg(not(target_family = "wasm"))]
146148
use crate::terminal::cli_agent_sessions::plugin_manager::{plugin_manager_for, PluginModalKind};
147149
use crate::terminal::cli_agent_sessions::{
@@ -12104,7 +12106,11 @@ impl TerminalView {
1210412106
{
1210512107
let should_auto_toggle_input = CLIAgentSessionsModel::as_ref(ctx)
1210612108
.session(self.view_id)
12107-
.is_some_and(|s| s.listener.is_some() && s.should_auto_toggle_input);
12109+
.is_some_and(|s| {
12110+
s.listener.is_some()
12111+
&& s.should_auto_toggle_input
12112+
&& agent_supports_rich_status(&s.agent)
12113+
});
1210812114
if should_auto_toggle_input {
1210912115
match status {
1211012116
CLIAgentSessionStatus::Blocked { .. } => {

app/src/terminal/view_test.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4382,6 +4382,70 @@ fn submit_with_plugin_and_auto_toggle_keeps_rich_input_open() {
43824382
})
43834383
}
43844384

4385+
#[test]
4386+
fn codex_status_update_does_not_auto_open_rich_input() {
4387+
App::test((), |mut app| async move {
4388+
initialize_app_for_terminal_view(&mut app);
4389+
let _agent_view = FeatureFlag::AgentView.override_enabled(true);
4390+
let _cli_rich = FeatureFlag::CLIAgentRichInput.override_enabled(true);
4391+
4392+
let terminal = add_window_with_terminal(&mut app, None);
4393+
4394+
terminal.update(&mut app, |view, ctx| {
4395+
let listener = ctx.add_model(|ctx| {
4396+
CLIAgentSessionListener::new(
4397+
view.view_id,
4398+
CLIAgent::Codex,
4399+
&view.model_events_handle,
4400+
ctx,
4401+
)
4402+
});
4403+
CLIAgentSessionsModel::handle(ctx).update(ctx, |sessions, ctx| {
4404+
sessions.set_session(
4405+
view.view_id,
4406+
CLIAgentSession {
4407+
agent: CLIAgent::Codex,
4408+
status: CLIAgentSessionStatus::InProgress,
4409+
session_context: CLIAgentSessionContext::default(),
4410+
input_state: CLIAgentInputState::Closed,
4411+
should_auto_toggle_input: true,
4412+
listener: Some(listener),
4413+
remote_host: None,
4414+
plugin_version: None,
4415+
draft_text: None,
4416+
custom_command_prefix: None,
4417+
},
4418+
ctx,
4419+
);
4420+
});
4421+
4422+
CLIAgentSessionsModel::handle(ctx).update(ctx, |sessions, ctx| {
4423+
sessions.update_from_event(
4424+
view.view_id,
4425+
&CLIAgentEvent {
4426+
v: 1,
4427+
agent: CLIAgent::Codex,
4428+
event: CLIAgentEventType::Stop,
4429+
session_id: None,
4430+
cwd: None,
4431+
project: None,
4432+
payload: CLIAgentEventPayload {
4433+
query: Some("Agent turn complete".to_owned()),
4434+
..Default::default()
4435+
},
4436+
},
4437+
ctx,
4438+
);
4439+
});
4440+
4441+
assert!(
4442+
!view.has_active_cli_agent_input_session(ctx),
4443+
"Codex OSC 9 notifications are opaque and should not auto-open rich input",
4444+
);
4445+
});
4446+
})
4447+
}
4448+
43854449
#[test]
43864450
fn submit_with_plugin_but_auto_toggle_off_respects_auto_dismiss() {
43874451
App::test((), |mut app| async move {

0 commit comments

Comments
 (0)