aboutsummaryrefslogtreecommitdiff
path: root/src/app/mod.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-07-19 23:52:20 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-07-19 23:56:07 +0300
commit3f80947678a9723434aa7fddfe23750b5393e24c (patch)
tree6f463797132acfc51dfb6e135820a052954b4f13 /src/app/mod.rs
parentf76f895efe5b9f19aa9db909354c6c0f2195630b (diff)
feat: make agent automation a first-class cli primitive
Diffstat (limited to 'src/app/mod.rs')
-rw-r--r--src/app/mod.rs64
1 files changed, 60 insertions, 4 deletions
diff --git a/src/app/mod.rs b/src/app/mod.rs
index d556b960..bff7c865 100644
--- a/src/app/mod.rs
+++ b/src/app/mod.rs
@@ -3847,7 +3847,7 @@ mod tests {
}
#[test]
- fn terminal_target_resolves_terminal_id() {
+ fn terminal_and_agent_targets_treat_terminal_ids_differently() {
let mut app = test_app();
let workspace = Workspace::test_new("terminal-target-id");
let pane = workspace.tabs[0].root_pane;
@@ -3857,19 +3857,54 @@ mod tests {
app.state.selected = 0;
let resolved = app.resolve_terminal_target(&terminal_id).unwrap();
-
- assert_eq!(resolved.ws_idx, 0);
assert_eq!(resolved.pane_id, pane);
assert_eq!(resolved.terminal_id, terminal_id);
+
+ assert!(matches!(
+ app.resolve_agent_target(&resolved.terminal_id),
+ Err(crate::app::terminal_targets::TerminalTargetError::NotFound { .. })
+ ));
+ }
+
+ #[test]
+ fn agent_target_rejects_a_pane_that_only_has_a_launch_command() {
+ let mut app = test_app();
+ let workspace = Workspace::test_new("terminal-target-command");
+ let pane = workspace.tabs[0].root_pane;
+ let terminal_id = workspace.terminal_id(pane).unwrap().clone();
+ app.state.workspaces = vec![workspace];
+ app.state.ensure_test_terminals();
+ app.state
+ .terminals
+ .get_mut(&terminal_id)
+ .unwrap()
+ .launch_argv = Some(vec!["just".into(), "dev".into()]);
+ let pane_id = app.public_pane_id(0, pane).unwrap();
+
+ assert!(app.resolve_terminal_target(&pane_id).is_ok());
+ assert!(matches!(
+ app.resolve_agent_target(&pane_id),
+ Err(crate::app::terminal_targets::TerminalTargetError::NotFound { .. })
+ ));
}
#[test]
- fn terminal_target_resolves_legacy_pane_id() {
+ fn terminal_target_resolves_pane_id_for_an_agent() {
let mut app = test_app();
let workspace = Workspace::test_new("terminal-target-pane");
let pane = workspace.tabs[0].root_pane;
let terminal_id = workspace.terminal_id(pane).unwrap().to_string();
app.state.workspaces = vec![workspace];
+ app.state.ensure_test_terminals();
+ let attached_terminal_id = app.state.workspaces[0].terminal_id(pane).cloned().unwrap();
+ app.state
+ .terminals
+ .get_mut(&attached_terminal_id)
+ .unwrap()
+ .set_detected_state(
+ Some(crate::detect::Agent::Pi),
+ crate::detect::AgentState::Idle,
+ );
app.state.active = Some(0);
app.state.selected = 0;
let pane_id = app.public_pane_id(0, pane).unwrap();
@@ -3908,6 +3943,27 @@ mod tests {
}
#[test]
+ fn agent_target_treats_legacy_pane_syntax_as_a_name() {
+ let mut app = test_app();
+ let workspace = Workspace::test_new("agent-target-name");
+ let pane = workspace.tabs[0].root_pane;
+ let terminal_id = workspace.terminal_id(pane).unwrap().clone();
+ app.state.workspaces = vec![workspace];
+ app.state.ensure_test_terminals();
+ let terminal = app.state.terminals.get_mut(&terminal_id).unwrap();
+ terminal.set_detected_state(
+ Some(crate::detect::Agent::Pi),
+ crate::detect::AgentState::Idle,
+ );
+ terminal.set_agent_name("p_1".into());
+
+ let resolved = app.resolve_agent_target("p_1").unwrap();
+
+ assert_eq!(resolved.pane_id, pane);
+ assert_eq!(resolved.terminal_id, terminal_id.to_string());
+ }
+
+ #[test]
fn terminal_target_reports_missing_target() {
let mut app = test_app();
app.state.workspaces = vec![Workspace::test_new("terminal-target-missing")];