aboutsummaryrefslogtreecommitdiff
path: root/src/app/mod.rs
diff options
context:
space:
mode:
authorJJ Liebig <jonathan.liebig@gmail.com>2026-09-22 15:23:31 +0200
committerGitHub <noreply@github.com>2026-09-22 15:23:31 +0200
commit46a5091838de66c1be193990afc3ad9145e6b4f5 (patch)
treeac220ae9d28e381cd1d1694c6448f051edcdda03 /src/app/mod.rs
parent8ac9542757292f7a8d42a2d532bc6a8a33c7ffce (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.rs36
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");