From 2552d101afe46b8622a7695f38f6cd1766dd1afc Mon Sep 17 00:00:00 2001 From: Can Celik Date: Sun, 27 Sep 2026 20:57:00 +0300 Subject: feat: let agents report their own resume command (#4687) * feat: let agents report their own resume command * fix: keep reported resume commands tied to accepted sessions and current owners --- src/cli/pane.rs | 15 +++++++++++++-- src/cli/spec.rs | 10 ++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) (limited to 'src/cli') diff --git a/src/cli/pane.rs b/src/cli/pane.rs index 3b900e17..33583ee4 100644 --- a/src/cli/pane.rs +++ b/src/cli/pane.rs @@ -1156,8 +1156,9 @@ fn parse_pane_wait_output_args(args: &[String]) -> Result std::io::Result { - const USAGE: &str = "usage: herdr pane report-agent --source ID --agent LABEL --state idle|working|blocked|unknown [--message TEXT] [--seq N] [--agent-session-id ID] [--agent-session-path PATH]"; + const USAGE: &str = "usage: herdr pane report-agent --source ID --agent LABEL --state idle|working|blocked|unknown [--message TEXT] [--seq N] [--agent-session-id ID] [--agent-session-path PATH] [-- ]"; + let (args, resume_argv) = split_resume_argv(args); let args = super::expand_equals_args( args, &[ @@ -1282,12 +1283,21 @@ fn pane_report_agent(args: &[String]) -> std::io::Result { seq, agent_session_id, agent_session_path, + resume_argv, })) } +fn split_resume_argv(args: &[String]) -> (&[String], Option>) { + match args.iter().position(|arg| arg == "--") { + Some(separator) => (&args[..separator], Some(args[separator + 1..].to_vec())), + None => (args, None), + } +} + fn pane_report_agent_session(args: &[String]) -> std::io::Result { - const USAGE: &str = "usage: herdr pane report-agent-session --source ID --agent LABEL [--seq N] [--agent-session-id ID] [--agent-session-path PATH] [--session-start-source SOURCE]"; + const USAGE: &str = "usage: herdr pane report-agent-session --source ID --agent LABEL [--seq N] [--agent-session-id ID] [--agent-session-path PATH] [--session-start-source SOURCE] [-- ]"; + let (args, resume_argv) = split_resume_argv(args); let args = super::expand_equals_args( args, &[ @@ -1398,6 +1408,7 @@ fn pane_report_agent_session(args: &[String]) -> std::io::Result { agent_session_id, agent_session_path, session_start_source, + resume_argv, }, )) } diff --git a/src/cli/spec.rs b/src/cli/spec.rs index 9465dcc3..1cfc2e7f 100644 --- a/src/cli/spec.rs +++ b/src/cli/spec.rs @@ -646,6 +646,7 @@ fn report_agent_command() -> Command { .arg(option("seq", "N")) .arg(option("agent-session-id", "ID")) .arg(path_option("agent-session-path", "PATH")) + .arg(resume_argv_arg()) } fn report_agent_session_command() -> Command { @@ -658,6 +659,15 @@ fn report_agent_session_command() -> Command { .arg(option("agent-session-id", "ID")) .arg(path_option("agent-session-path", "PATH")) .arg(option("session-start-source", "SOURCE")) + .arg(resume_argv_arg()) +} + +fn resume_argv_arg() -> Arg { + Arg::new("resume_argv") + .value_name("RESUME_ARG") + .num_args(0..) + .last(true) + .help("Command that resumes this session after a Herdr restart; starts with a plain command name") } fn release_agent_command() -> Command { -- cgit v1.2.3