diff options
| author | akbash <akbash@herdr.dev> | 2026-09-09 22:40:57 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-09 22:40:57 +0300 |
| commit | 985d3442b4b8a6f2e25a62821aab58d63d8ce2cf (patch) | |
| tree | f744eade5e90f7ae22b7843dc51465eb99fae533 /src/server/headless/client_views.rs | |
| parent | 1f1b20cb5d2a62437e1b21e237164478f9582f52 (diff) | |
fix: project public agent focus to attached clients (#3764)
refs #3760
Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
Diffstat (limited to 'src/server/headless/client_views.rs')
| -rw-r--r-- | src/server/headless/client_views.rs | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/src/server/headless/client_views.rs b/src/server/headless/client_views.rs index 333c94b4..f0b0158d 100644 --- a/src/server/headless/client_views.rs +++ b/src/server/headless/client_views.rs @@ -248,7 +248,8 @@ impl HeadlessServer { matches!( method, - Method::CommandInvoke(_) + Method::AgentFocus(_) + | Method::CommandInvoke(_) | Method::LayoutSetSplitRatio(_) | Method::PaneClose(_) | Method::PaneCopyMotion(_) @@ -286,7 +287,8 @@ impl HeadlessServer { matches!( method, - Method::CommandInvoke(_) + Method::AgentFocus(_) + | Method::CommandInvoke(_) | Method::LayoutSetSplitRatio(_) | Method::PaneClose(_) | Method::PaneEditScrollback(_) @@ -839,6 +841,10 @@ impl HeadlessServer { }), _ => None, }; + let agent_focus_target = match &msg.request.method { + api::schema::Method::AgentFocus(params) => Some(params.target.clone()), + _ => None, + }; let create_focus_requested = match &msg.request.method { api::schema::Method::WorkspaceCreate(params) => params.focus, api::schema::Method::TabCreate(params) => params.focus, @@ -848,19 +854,33 @@ impl HeadlessServer { &msg.request.method, api::schema::Method::WorktreeOpen(params) if params.focus ); - let response_proxy = inspect_worktree_open.then(|| { + let response_proxy = (agent_focus_target.is_some() || inspect_worktree_open).then(|| { let (proxy_tx, proxy_rx) = std::sync::mpsc::channel(); let original = std::mem::replace(&mut msg.respond_to, proxy_tx); (original, proxy_rx) }); let reconcile = Self::shell_locations_may_need_reconcile(&msg.request.method); let changed = self.handle_api_request_with_shutdown_check_inner(msg, false); - let worktree_open_succeeded = forward_proxied_api_response(response_proxy); + let proxied_request_succeeded = forward_proxied_api_response(response_proxy); + let successful_agent_focus_target = proxied_request_succeeded + .then(|| { + agent_focus_target.as_deref().and_then(|target| { + self.app.resolve_agent_target(target).ok().map(|resolved| { + crate::ui::TabSurfaceTarget { + workspace_index: resolved.ws_idx, + tab_index: resolved.tab_idx, + } + }) + }) + }) + .flatten(); let target_changed = self.default_shell_target() != target_before; - let public_focus_succeeded = explicit_public_focus_target - .is_some_and(|target| self.default_shell_target() == Some(target)) + let explicit_focus_succeeded = successful_agent_focus_target + .or(explicit_public_focus_target) + .is_some_and(|target| self.default_shell_target() == Some(target)); + let public_focus_succeeded = explicit_focus_succeeded || (create_focus_requested && target_changed) - || worktree_open_succeeded; + || (inspect_worktree_open && proxied_request_succeeded); if public_focus_succeeded { self.focus_all_shell_clients_on_default_target(); } |
