aboutsummaryrefslogtreecommitdiff
path: root/src/terminal
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-31 03:00:46 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-31 03:04:20 +0300
commit3acd499ffb1119e8032bbcba3f1f46d4ff5f3da9 (patch)
tree4e30e82ccbc821e8930b03addfd1542d91ee8705 /src/terminal
parent4e1fbf410b844749dcddae775806e1cce01ef442 (diff)
fix: keep codex visible approval review working
Diffstat (limited to 'src/terminal')
-rw-r--r--src/terminal/metadata.rs1
-rw-r--r--src/terminal/state.rs44
2 files changed, 45 insertions, 0 deletions
diff --git a/src/terminal/metadata.rs b/src/terminal/metadata.rs
index 5b9f0078..1dcb80c0 100644
--- a/src/terminal/metadata.rs
+++ b/src/terminal/metadata.rs
@@ -361,6 +361,7 @@ impl TerminalState {
}
if self.visible_blocker_overrides_hook()
+ || self.visible_working_overrides_hook()
|| self.visible_idle_masks_hook_custom_status(state, now)
{
return None;
diff --git a/src/terminal/state.rs b/src/terminal/state.rs
index bcf5737a..ac7c4380 100644
--- a/src/terminal/state.rs
+++ b/src/terminal/state.rs
@@ -1263,6 +1263,50 @@ mod tests {
}
#[test]
+ fn refreshed_visible_working_overrides_newer_hook_blocked() {
+ let now = Instant::now();
+ let mut terminal = test_terminal();
+ terminal.set_detected_state_with_screen_signals_at(
+ Some(Agent::Codex),
+ AgentState::Working,
+ false,
+ false,
+ true,
+ false,
+ now,
+ );
+ terminal.set_hook_authority_with_custom_status_at(
+ "herdr:codex".into(),
+ "codex".into(),
+ AgentState::Blocked,
+ None,
+ Some("permission".into()),
+ None,
+ None,
+ now + CLAUDE_WORKING_HOLD + Duration::from_millis(1),
+ );
+
+ assert_eq!(terminal.state, AgentState::Blocked);
+
+ let change = terminal.set_detected_state_with_screen_signals_at(
+ Some(Agent::Codex),
+ AgentState::Working,
+ false,
+ false,
+ true,
+ false,
+ now + CLAUDE_WORKING_HOLD + Duration::from_millis(800),
+ );
+
+ assert_eq!(terminal.state, AgentState::Working);
+ assert_eq!(terminal.effective_custom_status(), None);
+ assert_eq!(
+ change.effective_state_change.unwrap().previous_state,
+ AgentState::Blocked
+ );
+ }
+
+ #[test]
fn visible_idle_waits_before_overriding_claude_hook_blocked() {
let now = Instant::now();
let mut terminal = test_terminal();