diff options
| author | JJ Liebig <jonathan.liebig@gmail.com> | 2026-09-22 15:23:31 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-22 15:23:31 +0200 |
| commit | 46a5091838de66c1be193990afc3ad9145e6b4f5 (patch) | |
| tree | ac220ae9d28e381cd1d1694c6448f051edcdda03 /src/app/mod.rs | |
| parent | 8ac9542757292f7a8d42a2d532bc6a8a33c7ffce (diff) | |
fix: stagger restored agent startups (#4487)
* fix: stagger restored agent startups
refs #4102
* fix: report startup delay changes requiring restart
refs #4102
Diffstat (limited to 'src/app/mod.rs')
| -rw-r--r-- | src/app/mod.rs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/app/mod.rs b/src/app/mod.rs index 757a7f66..7ff3040b 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -136,6 +136,8 @@ pub struct App { pub(crate) loaded_host_cursor: crate::config::HostCursorModeConfig, pub(crate) agent_metadata_deadline: Option<Instant>, pub(crate) pending_agent_resume_deadline: Option<Instant>, + startup_per_agent_delay: Duration, + next_agent_resume_at: Option<Instant>, pub(crate) session_save_deadline: Option<Instant>, pub(crate) session_save_thread: Option<std::thread::JoinHandle<()>>, session_writer: Arc<std::sync::Mutex<crate::persist::SessionWriter>>, @@ -600,6 +602,10 @@ impl App { loaded_host_cursor: config.ui.host_cursor, agent_metadata_deadline: None, pending_agent_resume_deadline: None, + startup_per_agent_delay: Duration::from_millis( + config.session.startup_per_agent_delay_ms.into(), + ), + next_agent_resume_at: None, session_save_deadline: None, session_save_thread: None, session_writer, @@ -857,6 +863,16 @@ impl App { } } + if !invalid_section("session") + && Duration::from_millis(config.session.startup_per_agent_delay_ms.into()) + != self.startup_per_agent_delay + { + diagnostics.push( + "session.startup_per_agent_delay_ms changes require restarting Herdr; kept current setting" + .into(), + ); + } + let graphics_config_valid = !invalid_section("terminal") && (config.terminal.kitty_graphics.is_some() || !invalid_section("experimental")); if graphics_config_valid @@ -1761,6 +1777,26 @@ mod tests { } #[test] + fn reload_config_reports_startup_delay_requires_restart() { + let mut app = test_app(); + let mut config = Config::default(); + let report = app.apply_live_config(&config, &[], &[], false); + assert_eq!(report.status, crate::config::ConfigReloadStatus::Applied); + + config.session.startup_per_agent_delay_ms = 250; + let report = app.apply_live_config(&config, &[], &[], false); + assert_eq!(report.status, crate::config::ConfigReloadStatus::Partial); + assert_eq!(app.startup_per_agent_delay, Duration::from_millis(100)); + assert_eq!(report.diagnostics, vec![ + "session.startup_per_agent_delay_ms changes require restarting Herdr; kept current setting" + ]); + + let report = app.apply_live_config(&config, &[], &["session".into()], false); + assert!(report.diagnostics.is_empty()); + assert_eq!(app.startup_per_agent_delay, Duration::from_millis(100)); + } + + #[test] fn reload_config_requests_client_reload_for_key_only_change() { let _guard = config_env_lock().lock().unwrap(); let path = temp_config_path("reload-config-key-only"); |
