diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-10 15:24:24 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-10 15:33:45 +0300 |
| commit | 36a1b7f86444871f0c38ff36510a6e3c2eec48c6 (patch) | |
| tree | 4a2d100eef7f26af7feaa93ce661423c3994c54e /src/app/actions.rs | |
| parent | 8d13492926829c5cf0ea42c8613344cd65ff59fa (diff) | |
feat: distribute agent detection manifests
Diffstat (limited to 'src/app/actions.rs')
| -rw-r--r-- | src/app/actions.rs | 70 |
1 files changed, 65 insertions, 5 deletions
diff --git a/src/app/actions.rs b/src/app/actions.rs index 249d0e64..b218e53c 100644 --- a/src/app/actions.rs +++ b/src/app/actions.rs @@ -2312,6 +2312,36 @@ impl AppState { } Vec::new() } + AppEvent::AgentDetectionManifestsUpdated { updated, status } => { + self.agent_manifest_update_status = status; + self.refresh_agent_manifest_summaries(); + if !updated.is_empty() + && matches!( + self.toast_config.delivery, + crate::config::ToastDelivery::Herdr + ) + { + let agent_list = updated + .iter() + .map(|item| { + format!( + "{} {}", + crate::detect::agent_label(item.agent), + item.version + ) + }) + .collect::<Vec<_>>() + .join(", "); + self.toast = Some(ToastNotification { + kind: ToastKind::UpdateInstalled, + title: "Agent detection rules updated".to_string(), + context: agent_list, + position: None, + target: None, + }); + } + Vec::new() + } AppEvent::StateChanged { pane_id, agent, @@ -2520,14 +2550,15 @@ impl AppState { ) -> Option<PaneStateUpdate> { let observed_at = std::time::Instant::now(); self.update_terminal_state(pane_id, |terminal| { - let agent = terminal - .effective_known_agent() - .or(terminal.detected_agent)?; + let agent = terminal.effective_known_agent().or(terminal.detected_agent); + if agent.is_none() && !terminal.full_lifecycle_hook_authority_active() { + return None; + } Some(terminal.set_detected_state_with_screen_signals_at( - Some(agent), + agent, AgentState::Idle, false, - false, + true, false, true, observed_at, @@ -4684,6 +4715,35 @@ mod tests { } #[test] + fn agent_detection_manifest_update_event_updates_status_and_toast() { + let mut state = AppState::test_new(); + state.toast_config.delivery = crate::config::ToastDelivery::Herdr; + let status = crate::detect::manifest_update::ManifestUpdateStatus { + last_result: Some("checked".to_string()), + ..Default::default() + }; + + let updates = state.handle_app_event(AppEvent::AgentDetectionManifestsUpdated { + updated: vec![crate::detect::manifest_update::ManifestUpdateCommit { + agent: Agent::Codex, + version: crate::detect::manifest_update::ManifestVersion::parse("2026.06.10.1") + .unwrap(), + }], + status, + }); + + assert!(updates.is_empty()); + assert_eq!( + state.agent_manifest_update_status.last_result.as_deref(), + Some("checked") + ); + let toast = state.toast.as_ref().expect("manifest update toast"); + assert_eq!(toast.kind, ToastKind::UpdateInstalled); + assert_eq!(toast.title, "Agent detection rules updated"); + assert_eq!(toast.context, "codex 2026.06.10.1"); + } + + #[test] fn toggle_zoom_works() { let mut state = app_with_workspaces(&["test"]); state.workspaces[0].test_split(Direction::Horizontal); |
