aboutsummaryrefslogtreecommitdiff
path: root/src/app
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-16 02:26:14 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-16 02:26:14 +0300
commit72770305d388fd5ec247493e05a89b686c6d0026 (patch)
tree44d95c9c69042ab07e27ace37853e190b6f00ba0 /src/app
parent58c379f1f07adb4113e5f9ee673768b2e4b5be07 (diff)
feat: add hook-owned custom agent status labels
Diffstat (limited to 'src/app')
-rw-r--r--src/app/actions.rs11
-rw-r--r--src/app/api.rs12
-rw-r--r--src/app/api_helpers.rs9
-rw-r--r--src/app/creation.rs1
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,
})
}