aboutsummaryrefslogtreecommitdiff
path: root/src/app/agents.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-17 01:41:16 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-17 01:41:16 +0300
commita36da363f14639085bec91d7a378d6c2eeaa6c58 (patch)
tree2c86155b115f8c79db2b8826fd8b2199d153f7bf /src/app/agents.rs
parente4de58b37f58d59d146158239ed218a8accd5c3c (diff)
refactor: extract terminal state and runtime from panes
Diffstat (limited to 'src/app/agents.rs')
-rw-r--r--src/app/agents.rs66
1 files changed, 34 insertions, 32 deletions
diff --git a/src/app/agents.rs b/src/app/agents.rs
index 35e26c42..f9e410f5 100644
--- a/src/app/agents.rs
+++ b/src/app/agents.rs
@@ -77,19 +77,19 @@ impl App {
}
}
- let Some(ws) = self.state.workspaces.get_mut(resolved.ws_idx) else {
- return Err(AgentRenameError::Target(TerminalTargetError::NotFound {
- target: target.to_string(),
- }));
- };
- let Some(pane_state) = ws.pane_state_mut(resolved.pane_id) else {
+ let Some(terminal) = self
+ .state
+ .terminals
+ .values_mut()
+ .find(|terminal| terminal.id.to_string() == resolved.terminal_id)
+ else {
return Err(AgentRenameError::Target(TerminalTargetError::NotFound {
target: target.to_string(),
}));
};
match normalized_name {
- Some(name) => pane_state.set_manual_label(name),
- None => pane_state.clear_manual_label(),
+ Some(name) => terminal.set_manual_label(name),
+ None => terminal.clear_manual_label(),
}
self.state.mark_session_dirty();
self.agent_info(resolved.ws_idx, resolved.pane_id)
@@ -185,13 +185,17 @@ impl App {
)?
};
- let Some(ws) = self.state.workspaces.get_mut(ws_idx) else {
- return Err(AgentStartError::SpawnFailed("workspace disappeared".into()));
- };
- let Some(pane_state) = ws.pane_state_mut(pane_id) else {
- return Err(AgentStartError::SpawnFailed("pane disappeared".into()));
+ let terminal_id = self
+ .state
+ .workspaces
+ .get(ws_idx)
+ .and_then(|ws| ws.terminal_id(pane_id))
+ .cloned()
+ .ok_or_else(|| AgentStartError::SpawnFailed("terminal disappeared".into()))?;
+ let Some(terminal) = self.state.terminals.get_mut(&terminal_id) else {
+ return Err(AgentStartError::SpawnFailed("terminal disappeared".into()));
};
- pane_state.set_manual_label(name);
+ terminal.set_manual_label(name);
self.state.mark_session_dirty();
let agent = self
@@ -317,7 +321,7 @@ impl App {
argv: &[String],
focus: bool,
) -> Result<(usize, usize, crate::layout::PaneId), AgentStartError> {
- let ws = crate::workspace::Workspace::new_argv_command(
+ let (ws, terminal, runtime) = crate::workspace::Workspace::new_argv_command(
cwd,
rows,
cols,
@@ -329,6 +333,10 @@ impl App {
self.render_dirty.clone(),
)
.map_err(|err| AgentStartError::SpawnFailed(err.to_string()))?;
+ self.state
+ .terminal_runtimes
+ .insert(terminal.id.clone(), runtime);
+ self.state.terminals.insert(terminal.id.clone(), terminal);
self.state.workspaces.push(ws);
let ws_idx = self.state.workspaces.len() - 1;
if focus || self.state.active.is_none() {
@@ -375,13 +383,19 @@ impl App {
target: target_pane.raw().to_string(),
})?
.map_err(|err| AgentStartError::SpawnFailed(err.to_string()))?;
+ self.state
+ .terminal_runtimes
+ .insert(result.1.terminal.id.clone(), result.1.runtime);
+ self.state
+ .terminals
+ .insert(result.1.terminal.id.clone(), result.1.terminal);
if focus {
self.state.switch_workspace(ws_idx);
self.state.switch_tab(result.0);
self.state.mode = Mode::Terminal;
}
self.schedule_session_save();
- Ok((ws_idx, result.0, result.1))
+ Ok((ws_idx, result.0, result.1.pane_id))
}
fn agent_info(
@@ -409,23 +423,11 @@ impl App {
name: &str,
except_terminal_id: &str,
) -> Vec<crate::api::schema::AgentInfo> {
- self.state
- .workspaces
- .iter()
- .enumerate()
- .flat_map(|(ws_idx, ws)| {
- ws.tabs.iter().flat_map(move |tab| {
- tab.layout
- .pane_ids()
- .into_iter()
- .filter_map(move |pane_id| {
- let pane_state = ws.pane_state(pane_id)?;
- (pane_state.manual_label.as_deref() == Some(name))
- .then(|| self.agent_info(ws_idx, pane_id))?
- })
- })
+ self.collect_agent_infos()
+ .into_iter()
+ .filter(|agent| {
+ agent.name.as_deref() == Some(name) && agent.terminal_id != except_terminal_id
})
- .filter(|agent| agent.terminal_id != except_terminal_id)
.collect()
}
}