baxian 1.2.3 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/agent/detect/debounce.d.ts +7 -0
  2. package/dist/agent/detect/debounce.d.ts.map +1 -0
  3. package/dist/agent/detect/debounce.js +23 -0
  4. package/dist/agent/detect/debounce.js.map +1 -0
  5. package/dist/agent/detect/gate.d.ts +11 -0
  6. package/dist/agent/detect/gate.d.ts.map +1 -0
  7. package/dist/agent/detect/gate.js +115 -0
  8. package/dist/agent/detect/gate.js.map +1 -0
  9. package/dist/agent/detect/index.d.ts +5 -0
  10. package/dist/agent/detect/index.d.ts.map +1 -0
  11. package/dist/agent/detect/index.js +5 -0
  12. package/dist/agent/detect/index.js.map +1 -0
  13. package/dist/agent/detect/manifest.d.ts +27 -0
  14. package/dist/agent/detect/manifest.d.ts.map +1 -0
  15. package/dist/agent/detect/manifest.js +75 -0
  16. package/dist/agent/detect/manifest.js.map +1 -0
  17. package/dist/agent/detect/manifests/claude-code.json +233 -0
  18. package/dist/agent/detect/manifests/codex.json +115 -0
  19. package/dist/agent/detect/region.d.ts +6 -0
  20. package/dist/agent/detect/region.d.ts.map +1 -0
  21. package/dist/agent/detect/region.js +118 -0
  22. package/dist/agent/detect/region.js.map +1 -0
  23. package/dist/agent/manager.d.ts +1 -0
  24. package/dist/agent/manager.d.ts.map +1 -1
  25. package/dist/agent/manager.js +16 -13
  26. package/dist/agent/manager.js.map +1 -1
  27. package/dist/agent/review-transport.d.ts +1 -1
  28. package/dist/agent/review-transport.d.ts.map +1 -1
  29. package/dist/agent/review-transport.js +1 -4
  30. package/dist/agent/review-transport.js.map +1 -1
  31. package/dist/agent/tmux-probe-poller.d.ts +5 -0
  32. package/dist/agent/tmux-probe-poller.d.ts.map +1 -1
  33. package/dist/agent/tmux-probe-poller.js +82 -26
  34. package/dist/agent/tmux-probe-poller.js.map +1 -1
  35. package/dist/agent/tmux.d.ts +1 -1
  36. package/dist/agent/tmux.d.ts.map +1 -1
  37. package/dist/agent/tmux.js +12 -20
  38. package/dist/agent/tmux.js.map +1 -1
  39. package/dist/config/loader.d.ts +1 -1
  40. package/dist/config/loader.d.ts.map +1 -1
  41. package/dist/config/loader.js +1 -3
  42. package/dist/config/loader.js.map +1 -1
  43. package/dist/config/validator.d.ts +1 -1
  44. package/dist/config/validator.d.ts.map +1 -1
  45. package/dist/config/validator.js +1 -4
  46. package/dist/config/validator.js.map +1 -1
  47. package/dist/event/handlers.d.ts.map +1 -1
  48. package/dist/event/handlers.js +501 -557
  49. package/dist/event/handlers.js.map +1 -1
  50. package/dist/shared/types.d.ts +1 -0
  51. package/dist/shared/types.d.ts.map +1 -1
  52. package/dist/shared/types.js +3 -1
  53. package/dist/shared/types.js.map +1 -1
  54. package/package.json +1 -1
@@ -0,0 +1,7 @@
1
+ import type { DetectedState } from './manifest.js';
2
+ export declare class WorkingToIdleDebounce {
3
+ private confirmations;
4
+ apply(nextState: DetectedState, previousPublished: DetectedState, visibleIdle: boolean): DetectedState;
5
+ reset(): void;
6
+ }
7
+ //# sourceMappingURL=debounce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../../src/agent/detect/debounce.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAK;IAE1B,KAAK,CACH,SAAS,EAAE,aAAa,EACxB,iBAAiB,EAAE,aAAa,EAChC,WAAW,EAAE,OAAO,GACnB,aAAa;IAmBhB,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,23 @@
1
+ const IDLE_CONFIRMATION_THRESHOLD = 3;
2
+ export class WorkingToIdleDebounce {
3
+ confirmations = 0;
4
+ apply(nextState, previousPublished, visibleIdle) {
5
+ const isWorkingToPlainIdle = previousPublished === 'working'
6
+ && nextState === 'idle'
7
+ && !visibleIdle;
8
+ if (!isWorkingToPlainIdle) {
9
+ this.confirmations = 0;
10
+ return nextState;
11
+ }
12
+ this.confirmations++;
13
+ if (this.confirmations >= IDLE_CONFIRMATION_THRESHOLD) {
14
+ this.confirmations = 0;
15
+ return 'idle';
16
+ }
17
+ return 'working';
18
+ }
19
+ reset() {
20
+ this.confirmations = 0;
21
+ }
22
+ }
23
+ //# sourceMappingURL=debounce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debounce.js","sourceRoot":"","sources":["../../../src/agent/detect/debounce.ts"],"names":[],"mappings":"AAEA,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAEtC,MAAM,OAAO,qBAAqB;IACxB,aAAa,GAAG,CAAC,CAAC;IAE1B,KAAK,CACH,SAAwB,EACxB,iBAAgC,EAChC,WAAoB;QAEpB,MAAM,oBAAoB,GACxB,iBAAiB,KAAK,SAAS;eAC5B,SAAS,KAAK,MAAM;eACpB,CAAC,WAAW,CAAC;QAElB,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,aAAa,IAAI,2BAA2B,EAAE,CAAC;YACtD,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;YACvB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ export interface Gate {
2
+ contains?: string[];
3
+ regex?: string[];
4
+ lineRegex?: string[];
5
+ all?: Gate[];
6
+ any?: Gate[];
7
+ not?: Gate[];
8
+ notAfter?: Gate[];
9
+ }
10
+ export declare function evaluateGate(gate: Gate, text: string): boolean;
11
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../../src/agent/detect/gate.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;IACb,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;IACb,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;IACb,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;CACnB;AAmED,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CA2D9D"}
@@ -0,0 +1,115 @@
1
+ const regexCache = new Map();
2
+ function getCachedRegExp(pattern) {
3
+ let re = regexCache.get(pattern);
4
+ if (!re) {
5
+ re = new RegExp(pattern);
6
+ regexCache.set(pattern, re);
7
+ }
8
+ return re;
9
+ }
10
+ function findLastPositiveMatchLine(gate, lines) {
11
+ let last = -1;
12
+ if (gate.contains) {
13
+ for (const needle of gate.contains) {
14
+ const lower = needle.toLowerCase();
15
+ for (let i = lines.length - 1; i >= 0; i--) {
16
+ if (lines[i].toLowerCase().includes(lower)) {
17
+ last = Math.max(last, i);
18
+ break;
19
+ }
20
+ }
21
+ }
22
+ }
23
+ if (gate.lineRegex) {
24
+ for (const pattern of gate.lineRegex) {
25
+ const re = getCachedRegExp(pattern);
26
+ for (let i = lines.length - 1; i >= 0; i--) {
27
+ if (re.test(lines[i])) {
28
+ last = Math.max(last, i);
29
+ break;
30
+ }
31
+ }
32
+ }
33
+ }
34
+ if (gate.regex) {
35
+ for (const pattern of gate.regex) {
36
+ const re = getCachedRegExp(pattern);
37
+ for (let i = lines.length - 1; i >= 0; i--) {
38
+ if (re.test(lines[i])) {
39
+ last = Math.max(last, i);
40
+ break;
41
+ }
42
+ }
43
+ }
44
+ }
45
+ if (gate.any) {
46
+ for (const nested of gate.any) {
47
+ last = Math.max(last, findLastPositiveMatchLine(nested, lines));
48
+ }
49
+ }
50
+ if (gate.all) {
51
+ for (const nested of gate.all) {
52
+ last = Math.max(last, findLastPositiveMatchLine(nested, lines));
53
+ }
54
+ }
55
+ return last;
56
+ }
57
+ export function evaluateGate(gate, text) {
58
+ const hasMatcher = (gate.contains && gate.contains.length > 0)
59
+ || (gate.regex && gate.regex.length > 0)
60
+ || (gate.lineRegex && gate.lineRegex.length > 0)
61
+ || (gate.all && gate.all.length > 0)
62
+ || (gate.any && gate.any.length > 0)
63
+ || (gate.not && gate.not.length > 0);
64
+ if (!hasMatcher)
65
+ return false;
66
+ if (gate.contains) {
67
+ const lowerText = text.toLowerCase();
68
+ for (const needle of gate.contains) {
69
+ if (!lowerText.includes(needle.toLowerCase()))
70
+ return false;
71
+ }
72
+ }
73
+ if (gate.regex) {
74
+ for (const pattern of gate.regex) {
75
+ if (!getCachedRegExp(pattern).test(text))
76
+ return false;
77
+ }
78
+ }
79
+ if (gate.lineRegex) {
80
+ const lines = text.split('\n');
81
+ for (const pattern of gate.lineRegex) {
82
+ if (!lines.some(line => getCachedRegExp(pattern).test(line)))
83
+ return false;
84
+ }
85
+ }
86
+ if (gate.all) {
87
+ for (const nested of gate.all) {
88
+ if (!evaluateGate(nested, text))
89
+ return false;
90
+ }
91
+ }
92
+ if (gate.any && gate.any.length > 0) {
93
+ if (!gate.any.some(nested => evaluateGate(nested, text)))
94
+ return false;
95
+ }
96
+ if (gate.not) {
97
+ for (const nested of gate.not) {
98
+ if (evaluateGate(nested, text))
99
+ return false;
100
+ }
101
+ }
102
+ if (gate.notAfter && gate.notAfter.length > 0) {
103
+ const lines = text.split('\n');
104
+ const anchor = findLastPositiveMatchLine(gate, lines);
105
+ if (anchor >= 0 && anchor < lines.length - 1) {
106
+ const suffix = lines.slice(anchor + 1).join('\n');
107
+ for (const nested of gate.notAfter) {
108
+ if (evaluateGate(nested, suffix))
109
+ return false;
110
+ }
111
+ }
112
+ }
113
+ return true;
114
+ }
115
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../../src/agent/detect/gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { evaluateGate, type Gate } from './gate.js';
2
+ export { extractRegion, type DetectionInput } from './region.js';
3
+ export { evaluateManifest, type AgentManifest, type ManifestRule, type ManifestDetection, type DetectedState, } from './manifest.js';
4
+ export { WorkingToIdleDebounce } from './debounce.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/agent/detect/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,gBAAgB,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { evaluateGate } from './gate.js';
2
+ export { extractRegion } from './region.js';
3
+ export { evaluateManifest, } from './manifest.js';
4
+ export { WorkingToIdleDebounce } from './debounce.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/agent/detect/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAa,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAC;AACjE,OAAO,EACL,gBAAgB,GAKjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { Gate } from './gate.js';
2
+ import { type DetectionInput } from './region.js';
3
+ export type DetectedState = 'idle' | 'working' | 'pending' | 'unknown';
4
+ export interface ManifestRule extends Gate {
5
+ id: string;
6
+ state: DetectedState;
7
+ priority: number;
8
+ region: string;
9
+ visibleBlocker?: boolean;
10
+ visibleIdle?: boolean;
11
+ visibleWorking?: boolean;
12
+ skipStateUpdate?: boolean;
13
+ }
14
+ export interface AgentManifest {
15
+ id: string;
16
+ rules: ManifestRule[];
17
+ }
18
+ export interface ManifestDetection {
19
+ state: DetectedState;
20
+ matchedRuleId?: string;
21
+ visibleBlocker: boolean;
22
+ visibleIdle: boolean;
23
+ visibleWorking: boolean;
24
+ skipStateUpdate: boolean;
25
+ }
26
+ export declare function evaluateManifest(manifest: AgentManifest, input: DetectionInput): ManifestDetection;
27
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/agent/detect/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,YAAa,SAAQ,IAAI;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,cAAc,GACpB,iBAAiB,CAqEnB"}
@@ -0,0 +1,75 @@
1
+ import { evaluateGate } from './gate.js';
2
+ import { extractRegion } from './region.js';
3
+ export function evaluateManifest(manifest, input) {
4
+ let matched;
5
+ let bestScreenBlocker;
6
+ let bestScreenEvidence;
7
+ let bestScreenSkip;
8
+ for (const rule of manifest.rules) {
9
+ const regionText = extractRegion(input, rule.region);
10
+ if (!evaluateGate(rule, regionText))
11
+ continue;
12
+ if (!matched || rule.priority > matched.priority) {
13
+ matched = rule;
14
+ }
15
+ if (rule.region !== 'oscTitle') {
16
+ if (rule.skipStateUpdate) {
17
+ if (!bestScreenSkip || rule.priority > bestScreenSkip.priority) {
18
+ bestScreenSkip = rule;
19
+ }
20
+ }
21
+ else {
22
+ if (rule.visibleBlocker && rule.state === 'pending') {
23
+ if (!bestScreenBlocker || rule.priority > bestScreenBlocker.priority) {
24
+ bestScreenBlocker = rule;
25
+ }
26
+ }
27
+ if ((rule.visibleWorking && rule.state === 'working') || (rule.visibleIdle && rule.state === 'idle')) {
28
+ if (!bestScreenEvidence || rule.priority > bestScreenEvidence.priority) {
29
+ bestScreenEvidence = rule;
30
+ }
31
+ }
32
+ }
33
+ }
34
+ }
35
+ if (matched && matched.region === 'oscTitle') {
36
+ if (bestScreenBlocker && bestScreenSkip && bestScreenBlocker.priority >= bestScreenSkip.priority) {
37
+ matched = bestScreenBlocker;
38
+ }
39
+ else if (bestScreenSkip) {
40
+ matched = bestScreenSkip;
41
+ }
42
+ else if (matched.state === 'working' && bestScreenBlocker && bestScreenBlocker.priority >= 900) {
43
+ matched = bestScreenBlocker;
44
+ }
45
+ else if (matched.state === 'working' && bestScreenEvidence && bestScreenEvidence.state === 'idle') {
46
+ matched = bestScreenEvidence;
47
+ }
48
+ else if (matched.state === 'pending') {
49
+ if (bestScreenBlocker) {
50
+ matched = bestScreenBlocker;
51
+ }
52
+ else if (bestScreenEvidence) {
53
+ matched = bestScreenEvidence;
54
+ }
55
+ }
56
+ }
57
+ if (!matched) {
58
+ return {
59
+ state: 'idle',
60
+ visibleBlocker: false,
61
+ visibleIdle: false,
62
+ visibleWorking: false,
63
+ skipStateUpdate: false,
64
+ };
65
+ }
66
+ return {
67
+ state: matched.state,
68
+ matchedRuleId: matched.id,
69
+ visibleBlocker: !!(matched.visibleBlocker && matched.state === 'pending'),
70
+ visibleIdle: !!(matched.visibleIdle && matched.state === 'idle'),
71
+ visibleWorking: !!(matched.visibleWorking && matched.state === 'working'),
72
+ skipStateUpdate: !!matched.skipStateUpdate,
73
+ };
74
+ }
75
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/agent/detect/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,233 @@
1
+ {
2
+ "id": "claude-code",
3
+ "rules": [
4
+ {
5
+ "id": "osc_title_working",
6
+ "state": "working",
7
+ "priority": 1100,
8
+ "region": "oscTitle",
9
+ "visibleWorking": true,
10
+ "regex": ["^[\\u2800-\\u28FF] "]
11
+ },
12
+ {
13
+ "id": "transcript_viewer",
14
+ "state": "unknown",
15
+ "priority": 1200,
16
+ "region": "tailNonEmpty(1)",
17
+ "skipStateUpdate": true,
18
+ "any": [
19
+ { "contains": ["ctrl+o", "to toggle"] },
20
+ { "contains": ["ctrl+e", "show all"] },
21
+ { "contains": ["ctrl+e", "collapse"] },
22
+ { "contains": ["showing detailed transcript"] },
23
+ { "contains": ["↑↓ scroll"] },
24
+ { "contains": ["? for shortcuts"] }
25
+ ]
26
+ },
27
+ {
28
+ "id": "live_blocked_form",
29
+ "state": "pending",
30
+ "priority": 980,
31
+ "region": "afterLastHorizontalRule",
32
+ "visibleBlocker": true,
33
+ "contains": ["enter to select", "esc to cancel"],
34
+ "any": [
35
+ { "contains": ["tab/arrow keys to navigate"] },
36
+ { "contains": ["arrow keys to navigate"] },
37
+ { "contains": ["arrows to navigate"] },
38
+ { "contains": ["↑/↓ to navigate"] },
39
+ { "contains": ["↑↓ to navigate"] }
40
+ ],
41
+ "notAfter": [
42
+ { "lineRegex": ["^\\s*[❯>]\\s*$"] },
43
+ { "lineRegex": ["^[·✢✳✶✻✽][ \\t]+[^\\n…]{1,200}…[ \\t]*\\([ \\t]*(?:\\d+[ \\t]*m[ \\t]+)?\\d+[ \\t]*s"] },
44
+ { "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"] },
45
+ { "regex": ["(?:^|\\n)[ \\t]*⏵⏵ bypass permissions on[^\\n]*(?:\\n[ \\t]*)*$"] },
46
+ { "contains": ["select model", "enter to set as default"] }
47
+ ]
48
+ },
49
+ {
50
+ "id": "dynamic_workflow_prompt",
51
+ "state": "pending",
52
+ "priority": 980,
53
+ "region": "afterLastHorizontalRule",
54
+ "visibleBlocker": true,
55
+ "contains": ["run a dynamic workflow?", "esc to cancel"],
56
+ "notAfter": [
57
+ { "lineRegex": ["^\\s*[❯>]\\s*$"] },
58
+ { "lineRegex": ["^[·✢✳✶✻✽][ \\t]+[^\\n…]{1,200}…[ \\t]*\\([ \\t]*(?:\\d+[ \\t]*m[ \\t]+)?\\d+[ \\t]*s"] },
59
+ { "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"] },
60
+ { "regex": ["(?:^|\\n)[ \\t]*⏵⏵ bypass permissions on[^\\n]*(?:\\n[ \\t]*)*$"] },
61
+ { "contains": ["select model", "enter to set as default"] }
62
+ ]
63
+ },
64
+ {
65
+ "id": "runtime_menu",
66
+ "state": "pending",
67
+ "priority": 955,
68
+ "region": "tail(5)",
69
+ "visibleBlocker": true,
70
+ "contains": ["enter to"],
71
+ "lineRegex": ["^[ \\t]*[Ee]nter to\\b[^\\n]{0,160}\\u00b7[^\\n]{0,40}\\b[Ee]sc to\\b"],
72
+ "notAfter": [
73
+ { "lineRegex": ["^[·✢✳✶✻✽][ \\t]+[^\\n…]{1,200}…[ \\t]*\\([ \\t]*(?:\\d+[ \\t]*m[ \\t]+)?\\d+[ \\t]*s"] },
74
+ { "lineRegex": ["^\\s*[❯>]\\s*$"] },
75
+ { "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"] },
76
+ { "regex": ["(?:^|\\n)[ \\t]*⏵⏵ bypass permissions on[^\\n]*(?:\\n[ \\t]*)*$"] }
77
+ ]
78
+ },
79
+ {
80
+ "id": "live_prompt_box",
81
+ "state": "idle",
82
+ "priority": 950,
83
+ "region": "promptBoxBody",
84
+ "visibleIdle": true,
85
+ "lineRegex": ["^\\s*❯\\s*$"],
86
+ "not": [
87
+ { "contains": ["enter to select"] },
88
+ { "contains": ["esc to cancel"] },
89
+ { "contains": ["tab/arrow keys"] },
90
+ { "contains": ["arrow keys to navigate"] },
91
+ { "contains": ["↑/↓ to navigate"] }
92
+ ]
93
+ },
94
+ {
95
+ "id": "model_picker_menu",
96
+ "state": "unknown",
97
+ "priority": 985,
98
+ "region": "whole",
99
+ "skipStateUpdate": true,
100
+ "contains": ["select model", "enter to set as default"],
101
+ "notAfter": [
102
+ { "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"] },
103
+ { "lineRegex": ["^\\s*[❯>]\\s*$"] },
104
+ { "lineRegex": ["^[·✢✳✶✻✽][ \\t]+[^\\n…]{1,200}…[ \\t]*\\([ \\t]*(?:\\d+[ \\t]*m[ \\t]+)?\\d+[ \\t]*s"] },
105
+ { "contains": ["do you want to"] },
106
+ { "contains": ["would you like to"] },
107
+ { "contains": ["enter to select"] },
108
+ { "contains": ["enter to confirm"] },
109
+ { "contains": ["waiting for permission"] },
110
+ { "contains": ["tab to amend"] },
111
+ { "contains": ["ctrl+e to explain"] },
112
+ { "contains": ["review your answers"] },
113
+ { "contains": ["skip interview and plan immediately"] },
114
+ { "contains": ["run a dynamic workflow?"] },
115
+ { "lineRegex": ["^[ \\t]*⏵⏵ bypass permissions on"] }
116
+ ]
117
+ },
118
+ {
119
+ "id": "bash_permission_prompt",
120
+ "state": "pending",
121
+ "priority": 953,
122
+ "region": "afterLastHorizontalRule",
123
+ "visibleBlocker": true,
124
+ "contains": ["do you want to proceed?"],
125
+ "any": [
126
+ { "contains": ["bash command"] },
127
+ { "contains": ["bash("] },
128
+ { "contains": ["contains expansion"] },
129
+ { "contains": ["tab to amend"] },
130
+ { "contains": ["ctrl+e to explain"] }
131
+ ],
132
+ "all": [
133
+ { "any": [
134
+ { "lineRegex": ["^\\s*❯?\\s*[Yy][Ee][Ss]\\b"] },
135
+ { "lineRegex": ["^\\s*1\\.\\s*[Yy][Ee][Ss]\\b"] },
136
+ { "lineRegex": ["^\\s*2\\.\\s*[Nn][Oo]\\b"] }
137
+ ]}
138
+ ],
139
+ "notAfter": [
140
+ { "lineRegex": ["^\\s*[❯>]\\s*$"] },
141
+ { "lineRegex": ["^[·✢✳✶✻✽][ \\t]+[^\\n…]{1,200}…[ \\t]*\\([ \\t]*(?:\\d+[ \\t]*m[ \\t]+)?\\d+[ \\t]*s"] },
142
+ { "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"] },
143
+ { "regex": ["(?:^|\\n)[ \\t]*⏵⏵ bypass permissions on[^\\n]*(?:\\n[ \\t]*)*$"] }
144
+ ]
145
+ },
146
+ {
147
+ "id": "generic_permission_prompt",
148
+ "state": "pending",
149
+ "priority": 952,
150
+ "region": "afterLastHorizontalRule",
151
+ "visibleBlocker": true,
152
+ "contains": ["do you want to proceed?", "esc to cancel"],
153
+ "all": [
154
+ { "any": [
155
+ { "lineRegex": ["^\\s*❯?\\s*1\\.\\s*[Yy][Ee][Ss]\\b"] },
156
+ { "lineRegex": ["^\\s*2\\.\\s*[Yy][Ee][Ss]\\b"] },
157
+ { "lineRegex": ["^\\s*2\\.\\s*[Nn][Oo]\\b"] },
158
+ { "lineRegex": ["^\\s*3\\.\\s*[Nn][Oo]\\b"] }
159
+ ]}
160
+ ],
161
+ "notAfter": [
162
+ { "lineRegex": ["^\\s*[❯>]\\s*$"] },
163
+ { "lineRegex": ["^[·✢✳✶✻✽][ \\t]+[^\\n…]{1,200}…[ \\t]*\\([ \\t]*(?:\\d+[ \\t]*m[ \\t]+)?\\d+[ \\t]*s"] },
164
+ { "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"] },
165
+ { "regex": ["(?:^|\\n)[ \\t]*⏵⏵ bypass permissions on[^\\n]*(?:\\n[ \\t]*)*$"] }
166
+ ]
167
+ },
168
+ {
169
+ "id": "legacy_no_prompt_blocker",
170
+ "state": "pending",
171
+ "priority": 300,
172
+ "region": "afterLastHorizontalRule",
173
+ "visibleBlocker": true,
174
+ "any": [
175
+ { "contains": ["do you want to"], "any": [{ "contains": ["yes"] }, { "lineRegex": ["^\\s*❯\\s+\\S"] }] },
176
+ { "contains": ["would you like to"], "any": [{ "contains": ["yes"] }, { "lineRegex": ["^\\s*❯\\s+\\S"] }] },
177
+ { "contains": ["waiting for permission"] },
178
+ { "contains": ["do you want to allow this connection?"] },
179
+ { "contains": ["tab to amend"] },
180
+ { "contains": ["ctrl+e to explain"] },
181
+ { "contains": ["do you want to proceed?", "esc to cancel"] },
182
+ { "contains": ["review your answers"] },
183
+ { "contains": ["skip interview and plan immediately"] }
184
+ ],
185
+ "notAfter": [
186
+ { "lineRegex": ["^\\s*[❯>]\\s*$"] },
187
+ { "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"] },
188
+ { "regex": ["(?:^|\\n)[ \\t]*⏵⏵ bypass permissions on[^\\n]*(?:\\n[ \\t]*)*$"] }
189
+ ]
190
+ },
191
+ {
192
+ "id": "spinner_working",
193
+ "state": "working",
194
+ "priority": 951,
195
+ "region": "tail(10)",
196
+ "visibleWorking": true,
197
+ "lineRegex": ["^[·✢✳✶✻✽][ \\t]+[^\\n…]{1,200}…[ \\t]*\\([ \\t]*(?:\\d+[ \\t]*m[ \\t]+)?\\d+[ \\t]*s"],
198
+ "notAfter": [
199
+ { "lineRegex": ["^✻[ \\t]+Worked for"] }
200
+ ]
201
+ },
202
+ {
203
+ "id": "esc_to_interrupt_working",
204
+ "state": "working",
205
+ "priority": 240,
206
+ "region": "afterLastHorizontalRule",
207
+ "regex": ["[eE]sc to interru(?:pt|p(?:…|\\.{3})?)"],
208
+ "notAfter": [
209
+ { "lineRegex": ["^[ \\t]*[❯>][ \\t]*$"] },
210
+ { "regex": ["(?:^|\\n)[ \\t]*⏵⏵ bypass permissions on[^\\n]*(?:\\n[ \\t]*)*$"] }
211
+ ]
212
+ },
213
+ {
214
+ "id": "osc_title_idle",
215
+ "state": "idle",
216
+ "priority": 200,
217
+ "region": "oscTitle",
218
+ "visibleIdle": true,
219
+ "regex": ["^\\u2733 "]
220
+ },
221
+ {
222
+ "id": "idle_composer_prompt",
223
+ "state": "idle",
224
+ "priority": 100,
225
+ "region": "tail(6)",
226
+ "visibleIdle": true,
227
+ "any": [
228
+ { "regex": ["(?:^|\\n)[ \\t]*[❯>][ \\t]*(?:\\n[ \\t]*)*$"] },
229
+ { "regex": ["(?:^|\\n)[ \\t]*⏵⏵ bypass permissions on[^\\n]*(?:\\n[ \\t]*)*$"] }
230
+ ]
231
+ }
232
+ ]
233
+ }