diff options
Diffstat (limited to 'src/terminal')
| -rw-r--r-- | src/terminal/metadata.rs | 1 | ||||
| -rw-r--r-- | src/terminal/state.rs | 44 |
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(); |
