diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-16 02:26:14 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-16 02:26:14 +0300 |
| commit | 72770305d388fd5ec247493e05a89b686c6d0026 (patch) | |
| tree | 44d95c9c69042ab07e27ace37853e190b6f00ba0 /src/app | |
| parent | 58c379f1f07adb4113e5f9ee673768b2e4b5be07 (diff) | |
feat: add hook-owned custom agent status labels
Diffstat (limited to 'src/app')
| -rw-r--r-- | src/app/actions.rs | 11 | ||||
| -rw-r--r-- | src/app/api.rs | 12 | ||||
| -rw-r--r-- | src/app/api_helpers.rs | 9 | ||||
| -rw-r--r-- | src/app/creation.rs | 1 |
4 files changed, 30 insertions, 3 deletions
diff --git a/src/app/actions.rs b/src/app/actions.rs index 21e17bf0..870044a8 100644 --- a/src/app/actions.rs +++ b/src/app/actions.rs @@ -683,10 +683,18 @@ impl AppState { agent_label, state, message, + custom_status, seq, } => self .update_pane_state(pane_id, |pane| { - pane.set_hook_authority(source, agent_label, state, message, seq) + pane.set_hook_authority_with_custom_status( + source, + agent_label, + state, + message, + custom_status, + seq, + ) }) .into_iter() .collect(), @@ -1365,6 +1373,7 @@ mod tests { agent_label: "hermes".into(), state: AgentState::Blocked, message: None, + custom_status: None, seq: None, }); diff --git a/src/app/api.rs b/src/app/api.rs index 1fb11118..8c929e9a 100644 --- a/src/app/api.rs +++ b/src/app/api.rs @@ -3,8 +3,8 @@ use std::time::{Duration, Instant}; use super::{ api_helpers::{ - detect_state_from_api, encode_api_keys, encode_api_text, normalize_reported_agent_label, - pane_agent_status, + detect_state_from_api, encode_api_keys, encode_api_text, normalize_custom_status, + normalize_reported_agent_label, pane_agent_status, }, App, Mode, OverlayPaneState, ToastKind, }; @@ -193,12 +193,19 @@ impl App { .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)); + let custom_status = self + .state + .workspaces + .get(update.ws_idx) + .and_then(|ws| ws.pane_state(update.pane_id)) + .and_then(|pane| pane.effective_custom_status().map(str::to_string)); self.emit_event(crate::api::schema::EventEnvelope { event: crate::api::schema::EventKind::PaneAgentStatusChanged, data: crate::api::schema::EventData::PaneAgentStatusChanged { pane_id, workspace_id, agent_status, + custom_status, }, }); } @@ -1067,6 +1074,7 @@ impl App { agent_label, state: detect_state_from_api(params.state), message: params.message, + custom_status: normalize_custom_status(params.custom_status), seq: params.seq, }); SuccessResponse { diff --git a/src/app/api_helpers.rs b/src/app/api_helpers.rs index 011e5ccb..56907ece 100644 --- a/src/app/api_helpers.rs +++ b/src/app/api_helpers.rs @@ -90,3 +90,12 @@ pub(super) fn normalize_reported_agent_label(agent: &str) -> Option<String> { } Some(trimmed.to_string()) } + +pub(super) fn normalize_custom_status(status: Option<String>) -> Option<String> { + let trimmed = status?.trim().to_string(); + let mut normalized = String::new(); + for ch in trimmed.chars().filter(|ch| !ch.is_control()).take(32) { + normalized.push(ch); + } + (!normalized.trim().is_empty()).then(|| normalized.trim().to_string()) +} diff --git a/src/app/creation.rs b/src/app/creation.rs index 51dac1e8..a2758d7a 100644 --- a/src/app/creation.rs +++ b/src/app/creation.rs @@ -248,6 +248,7 @@ impl App { label: pane.manual_label.clone(), agent: pane.effective_agent_label().map(str::to_string), agent_status: pane_agent_status(pane.state, pane.seen), + custom_status: pane.effective_custom_status().map(str::to_string), revision: 0, }) } |
