aboutsummaryrefslogtreecommitdiff
path: root/src/cli.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-17 01:41:16 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-17 01:41:16 +0300
commite4de58b37f58d59d146158239ed218a8accd5c3c (patch)
tree6bb35b8c9aaec969110ff51a58814dd8099617c0 /src/cli.rs
parent86adf88351e17c6a11cac253714b169eac0db233 (diff)
feat: add agent start for server-owned terminals
Diffstat (limited to 'src/cli.rs')
-rw-r--r--src/cli.rs100
1 files changed, 94 insertions, 6 deletions
diff --git a/src/cli.rs b/src/cli.rs
index 205ea660..5d9dbb04 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -6,12 +6,13 @@ use serde::Serialize;
use crate::api;
use crate::api::schema::{
- AgentReadParams, AgentRenameParams, AgentSendParams, AgentStatus, AgentTarget, EmptyParams,
- IntegrationTarget, Method, OutputMatch, PaneAgentState, PaneListParams, PaneReadParams,
- PaneRenameParams, PaneReportAgentParams, PaneSendInputParams, PaneSendKeysParams,
- PaneSendTextParams, PaneSplitParams, PaneTarget, PaneWaitForOutputParams, PingParams,
- ReadFormat, ReadSource, Request, SplitDirection, Subscription, TabCreateParams, TabListParams,
- TabRenameParams, TabTarget, WorkspaceCreateParams, WorkspaceRenameParams, WorkspaceTarget,
+ AgentReadParams, AgentRenameParams, AgentSendParams, AgentStartParams, AgentStatus,
+ AgentTarget, EmptyParams, IntegrationTarget, Method, OutputMatch, PaneAgentState,
+ PaneListParams, PaneReadParams, PaneRenameParams, PaneReportAgentParams, PaneSendInputParams,
+ PaneSendKeysParams, PaneSendTextParams, PaneSplitParams, PaneTarget, PaneWaitForOutputParams,
+ PingParams, ReadFormat, ReadSource, Request, SplitDirection, Subscription, TabCreateParams,
+ TabListParams, TabRenameParams, TabTarget, WorkspaceCreateParams, WorkspaceRenameParams,
+ WorkspaceTarget,
};
pub enum CommandOutcome {
@@ -279,6 +280,7 @@ fn run_agent_command(args: &[String]) -> std::io::Result<i32> {
"send" => agent_send(&args[1..]),
"rename" => agent_rename(&args[1..]),
"focus" => agent_focus(&args[1..]),
+ "start" => agent_start(&args[1..]),
"help" | "--help" | "-h" => {
print_agent_help();
Ok(0)
@@ -771,6 +773,91 @@ fn tab_close(args: &[String]) -> std::io::Result<i32> {
})?)
}
+fn agent_start(args: &[String]) -> std::io::Result<i32> {
+ let Some(name) = args.first() else {
+ eprintln!("usage: herdr agent start <name> [--cwd PATH] [--workspace ID] [--tab ID] [--split right|down] [--focus|--no-focus] -- <argv...>");
+ return Ok(2);
+ };
+
+ let Some(separator) = args.iter().position(|arg| arg == "--") else {
+ eprintln!("usage: herdr agent start <name> [--cwd PATH] [--workspace ID] [--tab ID] [--split right|down] [--focus|--no-focus] -- <argv...>");
+ return Ok(2);
+ };
+ if separator == args.len() - 1 {
+ eprintln!("agent start requires argv after --");
+ return Ok(2);
+ }
+
+ let mut cwd = None;
+ let mut workspace_id = None;
+ let mut tab_id = None;
+ let mut split = None;
+ let mut focus = false;
+
+ let mut index = 1;
+ while index < separator {
+ match args[index].as_str() {
+ "--cwd" => {
+ let Some(value) = args.get(index + 1).filter(|_| index + 1 < separator) else {
+ eprintln!("missing value for --cwd");
+ return Ok(2);
+ };
+ cwd = Some(value.clone());
+ index += 2;
+ }
+ "--workspace" => {
+ let Some(value) = args.get(index + 1).filter(|_| index + 1 < separator) else {
+ eprintln!("missing value for --workspace");
+ return Ok(2);
+ };
+ workspace_id = Some(normalize_workspace_id(value));
+ index += 2;
+ }
+ "--tab" => {
+ let Some(value) = args.get(index + 1).filter(|_| index + 1 < separator) else {
+ eprintln!("missing value for --tab");
+ return Ok(2);
+ };
+ tab_id = Some(normalize_tab_id(value));
+ index += 2;
+ }
+ "--split" => {
+ let Some(value) = args.get(index + 1).filter(|_| index + 1 < separator) else {
+ eprintln!("missing value for --split");
+ return Ok(2);
+ };
+ split = Some(parse_split_direction(value)?);
+ index += 2;
+ }
+ "--focus" => {
+ focus = true;
+ index += 1;
+ }
+ "--no-focus" => {
+ focus = false;
+ index += 1;
+ }
+ other => {
+ eprintln!("unknown option: {other}");
+ return Ok(2);
+ }
+ }
+ }
+
+ print_response(&send_request(&Request {
+ id: "cli:agent:start".into(),
+ method: Method::AgentStart(AgentStartParams {
+ name: name.clone(),
+ cwd,
+ workspace_id,
+ tab_id,
+ split,
+ focus,
+ argv: args[separator + 1..].to_vec(),
+ }),
+ })?)
+}
+
fn agent_list(args: &[String]) -> std::io::Result<i32> {
if !args.is_empty() {
eprintln!("usage: herdr agent list");
@@ -1811,6 +1898,7 @@ fn print_agent_help() {
eprintln!(" herdr agent send <target> <text>");
eprintln!(" herdr agent rename <target> <name>|--clear");
eprintln!(" herdr agent focus <target>");
+ eprintln!(" herdr agent start <name> [--cwd PATH] [--workspace ID] [--tab ID] [--split right|down] [--focus|--no-focus] -- <argv...>");
eprintln!(" targets accept terminal ids, unique agent names, and legacy pane ids");
}