feat(maestro): add maestro send for typing into a session
Adds POST /api/sessions/:id/input and a CLI command on top of it, so a script (or another agent) can hand an instruction to a running session without attaching to it. The text goes in as one write and the Enter follows 150ms later: agents that run a full-screen prompt coalesce a burst of input into a paste, and a newline inside that burst becomes a line break instead of sending the message. `--no-enter` skips the Enter and leaves the text in the prompt. The session argument takes an ID, a unique ID prefix, or a session name; names win over prefixes. A session whose pane has exited is refused (409) rather than silently accepted — unlike a stray keystroke on an attach socket, a send that goes nowhere is worth hearing about. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
766eabbcb6
commit
28778b2224
@@ -10,7 +10,7 @@ use maestro_protocol::DaemonClient;
|
||||
|
||||
use crate::attach::{parse_detach_key, run_attach_url};
|
||||
use crate::cli::Command;
|
||||
use crate::sessions::{run_kill, run_list, run_spawn};
|
||||
use crate::sessions::{run_kill, run_list, run_send, run_spawn};
|
||||
use maestro_config::{default_config_path, MaestroConfigFile};
|
||||
|
||||
#[derive(Debug, thiserror::Error)]
|
||||
@@ -24,6 +24,10 @@ pub enum CliError {
|
||||
Attach(#[from] crate::attach::AttachError),
|
||||
#[error("{0}")]
|
||||
Hooks(#[from] maestro_hooks::HooksError),
|
||||
#[error("{0}")]
|
||||
Resolve(#[from] crate::sessions::ResolveError),
|
||||
#[error("nothing to send: pass the text as arguments or pipe it on stdin")]
|
||||
NothingToSend,
|
||||
#[error("could not determine the home directory ($HOME unset?)")]
|
||||
NoHome,
|
||||
#[error("{0}")]
|
||||
@@ -82,6 +86,10 @@ pub async fn dispatch(
|
||||
run_kill(&daemon, &args).await?;
|
||||
println!("killed {}", args.session_id);
|
||||
}
|
||||
Command::Send(args) => {
|
||||
let id = run_send(&daemon, &args, &mut std::io::stdin()).await?;
|
||||
println!("sent to {id}");
|
||||
}
|
||||
Command::Hooks(_) => unreachable!("hooks handled before the daemon client exists"),
|
||||
}
|
||||
Ok(())
|
||||
|
||||
Reference in New Issue
Block a user