aboutsummaryrefslogtreecommitdiff
path: root/src/server/headless/client_views.rs
diff options
context:
space:
mode:
authorakbash <akbash@herdr.dev>2026-09-09 22:40:57 +0300
committerGitHub <noreply@github.com>2026-09-09 22:40:57 +0300
commit985d3442b4b8a6f2e25a62821aab58d63d8ce2cf (patch)
treef744eade5e90f7ae22b7843dc51465eb99fae533 /src/server/headless/client_views.rs
parent1f1b20cb5d2a62437e1b21e237164478f9582f52 (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.rs34
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();
}