daemon: add test-send subcommand, flatten newlines in send_prompt

test-send calls send_prompt() directly for debugging tmux delivery.
Flatten newlines to spaces in literal mode to prevent premature
input submission.

Co-Authored-By: ProofOfConcept <poc@bcachefs.org>
This commit is contained in:
Kent Overstreet 2026-03-08 19:41:32 -04:00
parent 46f8fe662e
commit e2f3a5a364
2 changed files with 19 additions and 2 deletions

View file

@ -116,6 +116,11 @@ enum Command {
/// Value to set (omit to query) /// Value to set (omit to query)
value: Option<f64>, value: Option<f64>,
}, },
/// Send a test message to the Claude pane
TestSend {
/// Message to send
message: Vec<String>,
},
/// Dump full internal state as JSON /// Dump full internal state as JSON
Debug, Debug,
/// Shut down daemon /// Shut down daemon
@ -256,6 +261,17 @@ async fn client_main(cmd: Command) -> Result<(), Box<dyn std::error::Error>> {
req.get().set_seconds(seconds.unwrap_or(300)); req.get().set_seconds(seconds.unwrap_or(300));
req.send().promise.await?; req.send().promise.await?;
} }
Command::TestSend { message } => {
let msg = message.join(" ");
let pane = {
let reply = daemon.status_request().send().promise.await?;
let s = reply.get()?.get_status()?;
s.get_claude_pane()?.to_str()?.to_string()
};
let ok = crate::tmux::send_prompt(&pane, &msg);
println!("send_prompt(pane={}, ok={}): {}", pane, ok, msg);
return Ok(());
}
Command::Afk => { Command::Afk => {
daemon.afk_request().send().promise.await?; daemon.afk_request().send().promise.await?;
println!("marked AFK"); println!("marked AFK");

View file

@ -35,9 +35,10 @@ pub fn send_prompt(pane: &str, msg: &str) -> bool {
let preview: String = msg.chars().take(100).collect(); let preview: String = msg.chars().take(100).collect();
info!("SEND [{pane}]: {preview}..."); info!("SEND [{pane}]: {preview}...");
// Type the message literally // Type the message literally (flatten newlines — they'd submit the input early)
let flat: String = msg.chars().map(|c| if c == '\n' { ' ' } else { c }).collect();
let ok = Command::new("tmux") let ok = Command::new("tmux")
.args(["send-keys", "-t", pane, "-l", msg]) .args(["send-keys", "-t", pane, "-l", &flat])
.output() .output()
.is_ok(); .is_ok();
if !ok { if !ok {