aboutsummaryrefslogtreecommitdiff
path: root/src/app
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-04-09 03:31:37 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-04-09 03:31:37 +0300
commita3ecb4e3b4151e840ad237e073d8282e1181c34a (patch)
tree12c6924cc65c2b9c5da45df2e3a2fde188f07681 /src/app
parent05a6d89e33e722376688c679ab0d7322014814a1 (diff)
feat(api): expose done as agent status
Diffstat (limited to 'src/app')
-rw-r--r--src/app/mod.rs39
1 files changed, 25 insertions, 14 deletions
diff --git a/src/app/mod.rs b/src/app/mod.rs
index 22e4eef6..87af63e5 100644
--- a/src/app/mod.rs
+++ b/src/app/mod.rs
@@ -827,12 +827,19 @@ impl App {
}
if update.previous_state != update.state {
+ let agent_status = self
+ .state
+ .workspaces
+ .get(update.ws_idx)
+ .and_then(|ws| ws.pane_state(update.pane_id))
+ .map(|pane| pane_agent_status(pane.state, pane.seen))
+ .unwrap_or_else(|| pane_agent_status(update.state, true));
self.emit_event(crate::api::schema::EventEnvelope {
- event: crate::api::schema::EventKind::PaneAgentStateChanged,
- data: crate::api::schema::EventData::PaneAgentStateChanged {
+ event: crate::api::schema::EventKind::PaneAgentStatusChanged,
+ data: crate::api::schema::EventData::PaneAgentStatusChanged {
pane_id,
workspace_id,
- state: pane_agent_state(update.state),
+ agent_status,
},
});
}
@@ -2200,7 +2207,7 @@ impl App {
fn tab_info(&self, ws_idx: usize, tab_idx: usize) -> Option<crate::api::schema::TabInfo> {
let ws = self.state.workspaces.get(ws_idx)?;
let tab = ws.tabs.get(tab_idx)?;
- let (agg_state, _) = tab
+ let (agg_state, seen) = tab
.panes
.values()
.map(|pane| (pane.state, pane.seen))
@@ -2213,7 +2220,7 @@ impl App {
label: tab.display_name(),
focused: self.state.active == Some(ws_idx) && ws.active_tab == tab_idx,
pane_count: tab.panes.len(),
- agent_state: pane_agent_state(agg_state),
+ agent_status: pane_agent_status(agg_state, seen),
})
}
@@ -2240,7 +2247,7 @@ impl App {
.and_then(|rt| rt.cwd())
.map(|cwd| cwd.display().to_string()),
agent: pane.detected_agent.map(agent_name),
- agent_state: pane_agent_state(pane.state),
+ agent_status: pane_agent_status(pane.state, pane.seen),
revision: 0,
})
}
@@ -2266,7 +2273,7 @@ impl App {
fn workspace_info(&self, index: usize) -> crate::api::schema::WorkspaceInfo {
let ws = &self.state.workspaces[index];
- let (agg_state, _) = ws.aggregate_state();
+ let (agg_state, seen) = ws.aggregate_state();
crate::api::schema::WorkspaceInfo {
workspace_id: self.public_workspace_id(index),
number: index + 1,
@@ -2277,7 +2284,7 @@ impl App {
active_tab_id: self
.public_tab_id(index, ws.active_tab)
.unwrap_or_else(|| format!("{}:{}", ws.id, ws.active_tab + 1)),
- agent_state: pane_agent_state(agg_state),
+ agent_status: pane_agent_status(agg_state, seen),
}
}
}
@@ -2349,12 +2356,16 @@ fn detect_state_from_api(state: crate::api::schema::PaneAgentState) -> crate::de
}
}
-fn pane_agent_state(state: crate::detect::AgentState) -> crate::api::schema::PaneAgentState {
- match state {
- crate::detect::AgentState::Idle => crate::api::schema::PaneAgentState::Idle,
- crate::detect::AgentState::Working => crate::api::schema::PaneAgentState::Working,
- crate::detect::AgentState::Blocked => crate::api::schema::PaneAgentState::Blocked,
- crate::detect::AgentState::Unknown => crate::api::schema::PaneAgentState::Unknown,
+fn pane_agent_status(
+ state: crate::detect::AgentState,
+ seen: bool,
+) -> crate::api::schema::AgentStatus {
+ match (state, seen) {
+ (crate::detect::AgentState::Idle, false) => crate::api::schema::AgentStatus::Done,
+ (crate::detect::AgentState::Idle, true) => crate::api::schema::AgentStatus::Idle,
+ (crate::detect::AgentState::Working, _) => crate::api::schema::AgentStatus::Working,
+ (crate::detect::AgentState::Blocked, _) => crate::api::schema::AgentStatus::Blocked,
+ (crate::detect::AgentState::Unknown, _) => crate::api::schema::AgentStatus::Unknown,
}
}