1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
use bytes::Bytes;
use crate::api::schema::{
AgentRenameParams, AgentSendParams, AgentStartParams, AgentTarget, PaneReadResult, ReadFormat,
ReadSource, ResponseResult,
};
use crate::app::App;
use super::responses::{encode_error, encode_error_body, encode_success};
impl App {
pub(super) fn handle_agent_list(&mut self, id: String) -> String {
encode_success(
id,
ResponseResult::AgentList {
agents: self.collect_agent_infos(),
},
)
}
pub(super) fn handle_agent_get(&mut self, id: String, target: AgentTarget) -> String {
let agent = match self.agent_info_for_target(&target.target) {
Ok(agent) => agent,
Err(err) => return encode_error_body(id, self.agent_target_error_body(err)),
};
encode_success(id, ResponseResult::AgentInfo { agent })
}
pub(super) fn handle_agent_focus(&mut self, id: String, target: AgentTarget) -> String {
let agent = match self.focus_agent_target(&target.target) {
Ok(agent) => agent,
Err(err) => return encode_error_body(id, self.agent_target_error_body(err)),
};
encode_success(id, ResponseResult::AgentInfo { agent })
}
pub(super) fn handle_agent_rename(&mut self, id: String, params: AgentRenameParams) -> String {
let agent = match self.rename_agent_target(¶ms.target, params.name) {
Ok(agent) => agent,
Err(err) => return encode_error_body(id, self.agent_rename_error_body(err)),
};
encode_success(id, ResponseResult::AgentInfo { agent })
}
pub(super) fn handle_agent_start(&mut self, id: String, params: AgentStartParams) -> String {
let (agent, argv) = match self.start_agent(params) {
Ok(started) => started,
Err(err) => return encode_error_body(id, self.agent_start_error_body(err)),
};
encode_success(id, ResponseResult::AgentStarted { agent, argv })
}
pub(super) fn handle_agent_read(
&mut self,
id: String,
params: crate::api::schema::AgentReadParams,
) -> String {
let resolved = match self.resolve_terminal_target(¶ms.target) {
Ok(resolved) => resolved,
Err(err) => return encode_error_body(id, self.agent_target_error_body(err)),
};
let Some((pane, workspace_id)) = self.lookup_runtime(resolved.ws_idx, resolved.pane_id)
else {
return agent_not_found(id, ¶ms.target);
};
let requested_lines = params.lines.unwrap_or(80).min(1000) as usize;
let text = match params.format {
ReadFormat::Text => match params.source {
ReadSource::Visible => pane.visible_text(),
ReadSource::Recent => pane.recent_text(requested_lines),
ReadSource::RecentUnwrapped => pane.recent_unwrapped_text(requested_lines),
},
ReadFormat::Ansi => match params.source {
ReadSource::Visible => pane.visible_ansi(),
ReadSource::Recent => pane.recent_ansi(requested_lines),
ReadSource::RecentUnwrapped => pane.recent_unwrapped_ansi(requested_lines),
},
};
encode_success(
id,
ResponseResult::PaneRead {
read: PaneReadResult {
pane_id: self
.public_pane_id(resolved.ws_idx, resolved.pane_id)
.unwrap_or_else(|| params.target.clone()),
workspace_id,
tab_id: self
.public_tab_id(resolved.ws_idx, resolved.tab_idx)
.unwrap(),
source: params.source,
format: params.format,
text,
revision: 0,
truncated: false,
},
},
)
}
pub(super) fn handle_agent_send(&mut self, id: String, params: AgentSendParams) -> String {
let resolved = match self.resolve_terminal_target(¶ms.target) {
Ok(resolved) => resolved,
Err(err) => return encode_error_body(id, self.agent_target_error_body(err)),
};
let Some(runtime) = self.lookup_runtime_sender(resolved.ws_idx, resolved.pane_id) else {
return agent_not_found(id, ¶ms.target);
};
if let Err(err) = runtime.try_send_bytes(Bytes::from(params.text)) {
return encode_error(id, "agent_send_failed", err.to_string());
}
encode_success(id, ResponseResult::Ok {})
}
}
fn agent_not_found(id: String, target: &str) -> String {
encode_error(
id,
"agent_not_found",
format!("agent target {target} not found"),
)
}
|