diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-19 23:52:20 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-07-19 23:56:07 +0300 |
| commit | 3f80947678a9723434aa7fddfe23750b5393e24c (patch) | |
| tree | 6f463797132acfc51dfb6e135820a052954b4f13 /src/app/mod.rs | |
| parent | f76f895efe5b9f19aa9db909354c6c0f2195630b (diff) | |
feat: make agent automation a first-class cli primitive
Diffstat (limited to 'src/app/mod.rs')
| -rw-r--r-- | src/app/mod.rs | 64 |
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")]; |
