aboutsummaryrefslogtreecommitdiff
path: root/website
diff options
context:
space:
mode:
Diffstat (limited to 'website')
-rw-r--r--website/agent-detection/index.toml4
-rw-r--r--website/agent-detection/qwen.toml89
2 files changed, 93 insertions, 0 deletions
diff --git a/website/agent-detection/index.toml b/website/agent-detection/index.toml
index fba996ea..f44a8306 100644
--- a/website/agent-detection/index.toml
+++ b/website/agent-detection/index.toml
@@ -73,5 +73,9 @@ id = "qodercli"
path = "qodercli.toml"
[[agents]]
+id = "qwen"
+path = "qwen.toml"
+
+[[agents]]
id = "copilot"
path = "github-copilot.toml"
diff --git a/website/agent-detection/qwen.toml b/website/agent-detection/qwen.toml
new file mode 100644
index 00000000..52ab242a
--- /dev/null
+++ b/website/agent-detection/qwen.toml
@@ -0,0 +1,89 @@
+id = "qwen"
+version = "2026.08.12.1"
+min_engine_version = 2
+updated_at = "2026-08-12T00:00:00Z"
+aliases = ["qwen-code", "qwen code"]
+
+# Qwen Code keeps its composer visible while responding, so the prompt box is
+# not idle evidence by itself. Active turns show an "esc to cancel" status
+# line; confirmation flows replace that line with a stable waiting phrase.
+# OSC 9;4 is supplemental because Qwen emits it only while a tool is executing
+# and only in terminals that advertise progress support.
+
+[[rules]]
+id = "waiting_for_confirmation"
+state = "blocked"
+priority = 1000
+region = "bottom_non_empty_lines(20)"
+visible_blocker = true
+contains = ["waiting for user confirmation"]
+
+[[rules]]
+id = "tool_confirmation"
+state = "blocked"
+priority = 990
+region = "bottom_non_empty_lines(20)"
+visible_blocker = true
+contains = ["yes, allow once"]
+any = [
+ { contains = ["apply this change?"] },
+ { contains = ["allow execution of:"] },
+ { contains = ["allow execution of mcp tool"] },
+ { contains = ["do you want to proceed?"] },
+ { contains = ["shell command execution"] },
+]
+
+[[rules]]
+id = "question_dialog"
+state = "blocked"
+priority = 980
+region = "bottom_non_empty_lines(20)"
+visible_blocker = true
+contains = ["enter: select", "esc: cancel"]
+line_regex = ['^\s*[❯›]\s*1\.\s+']
+
+[[rules]]
+id = "folder_trust_dialog"
+state = "blocked"
+priority = 970
+region = "bottom_non_empty_lines(20)"
+visible_blocker = true
+contains = ["do you trust this folder?", "trust folder (", "don't trust (esc)"]
+
+[[rules]]
+id = "cancel_hint_working"
+state = "working"
+priority = 900
+region = "bottom_non_empty_lines(8)"
+visible_working = true
+line_regex = ['^\s*(?:[⠁-⣿]|\.{1,2})\s+.*\(\d+(?:m(?:\s+\d+s)?|s).*\s·\sesc to cancel\)\s*$']
+
+[[rules]]
+id = "narrow_cancel_hint_working"
+state = "working"
+priority = 890
+region = "bottom_non_empty_lines(8)"
+visible_working = true
+line_regex = ['(?i)^\s*\(esc to cancel\)\s*$']
+
+[[rules]]
+id = "osc_tool_progress_working"
+state = "working"
+priority = 850
+region = "osc_progress"
+visible_working = true
+regex = ['^4;3(?:;|$)']
+
+[[rules]]
+id = "composer_idle"
+state = "idle"
+priority = 100
+region = "bottom_non_empty_lines(30)"
+visible_idle = true
+line_regex = ['^\s*>\s*(?:type\s*)?.*$']
+any = [
+ { contains = ["type your message"] },
+ { contains = ["your message or @path/to/file"] },
+ { contains = ["@path/to/file"] },
+ { contains = ["type", "mes", "sage", "@pat", "h/to", "/fil"] },
+]