diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-16 22:12:44 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-16 22:17:09 +0300 |
| commit | 0b831c86274486af9f9f7052c2534374b498bb3a (patch) | |
| tree | 3e8130be85cb387c8c3e57591617c4c7be0a26ec /src/app/api.rs | |
| parent | 318e6a3033b61082d9c330c79ef584cf37e6c6d0 (diff) | |
feat: allow hook-reported custom agent labels
Diffstat (limited to 'src/app/api.rs')
| -rw-r--r-- | src/app/api.rs | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/src/app/api.rs b/src/app/api.rs index 1e969b64..2ed224c7 100644 --- a/src/app/api.rs +++ b/src/app/api.rs @@ -1,10 +1,21 @@ //! API request handling and response building for [`App`]. use super::{ - agent_name, detect_state_from_api, encode_api_keys, encode_api_text, pane_agent_status, - parse_agent_name, tab_attention_priority, App, Mode, + detect_state_from_api, encode_api_keys, encode_api_text, pane_agent_status, + tab_attention_priority, App, Mode, }; +fn normalize_reported_agent_label(agent: &str) -> Option<String> { + let trimmed = agent.trim(); + if trimmed.is_empty() { + return None; + } + if let Some(agent) = crate::detect::parse_agent_label(trimmed) { + return Some(crate::detect::agent_label(agent).to_string()); + } + Some(trimmed.to_string()) +} + pub(super) fn api_request_changes_ui(request: &crate::api::schema::Request) -> bool { use crate::api::schema::Method; @@ -775,12 +786,12 @@ impl App { }) .unwrap(); }; - let Some(agent) = parse_agent_name(¶ms.agent) else { + let Some(agent_label) = normalize_reported_agent_label(¶ms.agent) else { return serde_json::to_string(&ErrorResponse { id: request.id, error: ErrorBody { code: "invalid_agent".into(), - message: format!("unsupported agent {}", params.agent), + message: "agent label must not be empty".into(), }, }) .unwrap(); @@ -788,7 +799,7 @@ impl App { self.handle_internal_event(crate::events::AppEvent::HookStateReported { pane_id, source: params.source, - agent, + agent_label, state: detect_state_from_api(params.state), message: params.message, }); @@ -828,12 +839,12 @@ impl App { }) .unwrap(); }; - let Some(agent) = parse_agent_name(¶ms.agent) else { + let Some(agent_label) = normalize_reported_agent_label(¶ms.agent) else { return serde_json::to_string(&ErrorResponse { id: request.id, error: ErrorBody { code: "invalid_agent".into(), - message: format!("unsupported agent {}", params.agent), + message: "agent label must not be empty".into(), }, }) .unwrap(); @@ -841,7 +852,8 @@ impl App { self.handle_internal_event(crate::events::AppEvent::HookAgentReleased { pane_id, source: params.source, - agent, + known_agent: crate::detect::parse_agent_label(&agent_label), + agent_label, }); SuccessResponse { id: request.id, @@ -1185,7 +1197,7 @@ impl App { cwd: runtime .and_then(|rt| rt.cwd()) .map(|cwd| cwd.display().to_string()), - agent: pane.detected_agent.map(agent_name), + agent: pane.effective_agent_label().map(str::to_string), agent_status: pane_agent_status(pane.state, pane.seen), revision: 0, }) |
