diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-01 23:47:40 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-01 23:47:40 +0300 |
| commit | 9709ba6938bd720fea6d8dd15346adf9db2b7f4b (patch) | |
| tree | 4da522fa3a5e43ef25bef2a12b12734caa839688 /src/detect/agents | |
| parent | 36a4608603a82dbf32ec8a013dd47047cf02c6a3 (diff) | |
fix: detect kiro subagent approvals
refs #388
Diffstat (limited to 'src/detect/agents')
| -rw-r--r-- | src/detect/agents/kiro.rs | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/src/detect/agents/kiro.rs b/src/detect/agents/kiro.rs index 5ef1fbca..f40b9bcb 100644 --- a/src/detect/agents/kiro.rs +++ b/src/detect/agents/kiro.rs @@ -3,16 +3,11 @@ use super::super::AgentState; /// Kiro CLI detection. /// /// Kiro exposes reliable working and idle terminal markers. Tool approval -/// prompts render with a stable "requires approval" line and an action menu. +/// prompts render with stable approval wording and an action menu. pub(super) fn detect(content: &str) -> AgentState { let lower = content.to_lowercase(); - let has_approval_request = lower.contains("requires approval"); - let has_approval_actions = lower.contains("yes, single permission") - || lower.contains("trust, always allow") - || lower.contains("no (tab to edit)") - || lower.contains("esc to close"); - if has_approval_request && has_approval_actions { + if has_kiro_blocked_prompt(&lower) { return AgentState::Blocked; } @@ -25,6 +20,29 @@ pub(super) fn detect(content: &str) -> AgentState { AgentState::Idle } +fn has_kiro_blocked_prompt(lower_content: &str) -> bool { + has_tool_approval_prompt(lower_content) || has_subagent_approval_prompt(lower_content) +} + +fn has_tool_approval_prompt(lower_content: &str) -> bool { + let has_approval_request = lower_content.contains("requires approval"); + let has_approval_actions = lower_content.contains("yes, single permission") + || lower_content.contains("trust, always allow") + || lower_content.contains("no (tab to edit)") + || lower_content.contains("esc to close"); + has_approval_request && has_approval_actions +} + +fn has_subagent_approval_prompt(lower_content: &str) -> bool { + let has_approval_request = (lower_content.contains("tool approval") + || lower_content.contains("tool approvals")) + && lower_content.contains("pending from subagents"); + let has_approval_actions = lower_content.contains("approve all pending") + || lower_content.contains("configure individually") + || lower_content.contains("exit (cancel subagents)"); + has_approval_request && has_approval_actions +} + fn has_kiro_tool_spinner(content: &str) -> bool { content.lines().any(|line| { let trimmed = line.trim_start(); |
