baxian 2.0.17 → 2.0.19
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.
- package/dist/agent/detect/classify.d.ts +7 -0
- package/dist/agent/detect/classify.d.ts.map +1 -0
- package/dist/agent/detect/classify.js +42 -0
- package/dist/agent/detect/classify.js.map +1 -0
- package/dist/agent/detect/gate.d.ts +2 -2
- package/dist/agent/detect/gate.d.ts.map +1 -1
- package/dist/agent/detect/gate.js +17 -63
- package/dist/agent/detect/gate.js.map +1 -1
- package/dist/agent/detect/manifest.d.ts +3 -2
- package/dist/agent/detect/manifest.d.ts.map +1 -1
- package/dist/agent/detect/manifest.js +36 -63
- package/dist/agent/detect/manifest.js.map +1 -1
- package/dist/agent/detect/manifests/claude-code.json +387 -153
- package/dist/agent/detect/manifests/codex.json +137 -63
- package/dist/agent/detect/manifests/opencode.json +69 -17
- package/dist/agent/detect/manifests/qodercli.json +84 -25
- package/dist/agent/detect/region.d.ts +2 -2
- package/dist/agent/detect/region.d.ts.map +1 -1
- package/dist/agent/detect/region.js +122 -101
- package/dist/agent/detect/region.js.map +1 -1
- package/dist/agent/manager.d.ts +3 -1
- package/dist/agent/manager.d.ts.map +1 -1
- package/dist/agent/manager.js +100 -91
- package/dist/agent/manager.js.map +1 -1
- package/dist/agent/prompt.d.ts +1 -0
- package/dist/agent/prompt.d.ts.map +1 -1
- package/dist/agent/prompt.js +38 -13
- package/dist/agent/prompt.js.map +1 -1
- package/dist/agent/tmux-probe-poller.d.ts +0 -1
- package/dist/agent/tmux-probe-poller.d.ts.map +1 -1
- package/dist/agent/tmux-probe-poller.js +11 -34
- package/dist/agent/tmux-probe-poller.js.map +1 -1
- package/dist/agent/tmux.d.ts +3 -14
- package/dist/agent/tmux.d.ts.map +1 -1
- package/dist/agent/tmux.js +35 -235
- package/dist/agent/tmux.js.map +1 -1
- package/dist/event/handlers.d.ts.map +1 -1
- package/dist/event/handlers.js +7 -4
- package/dist/event/handlers.js.map +1 -1
- package/dist/platform/driver-host.d.ts.map +1 -1
- package/dist/platform/driver-host.js +8 -6
- package/dist/platform/driver-host.js.map +1 -1
- package/dist/platform/feedback.d.ts +3 -7
- package/dist/platform/feedback.d.ts.map +1 -1
- package/dist/platform/feedback.js +11 -18
- package/dist/platform/feedback.js.map +1 -1
- package/dist/platform/github-driver.d.ts.map +1 -1
- package/dist/platform/github-driver.js +1 -3
- package/dist/platform/github-driver.js.map +1 -1
- package/dist/platform/markers.d.ts +1 -10
- package/dist/platform/markers.d.ts.map +1 -1
- package/dist/platform/markers.js +11 -30
- package/dist/platform/markers.js.map +1 -1
- package/dist/platform/verdict-engine.d.ts +3 -16
- package/dist/platform/verdict-engine.d.ts.map +1 -1
- package/dist/platform/verdict-engine.js +6 -18
- package/dist/platform/verdict-engine.js.map +1 -1
- package/dist/shared/types.d.ts +0 -1
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js.map +1 -1
- package/dist/state/task-store.js +1 -1
- package/dist/state/task-store.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type AgentManifest, type AgentRuntimeKind, type ManifestDetection } from './manifest.js';
|
|
2
|
+
export declare const manifests: Record<AgentRuntimeKind, AgentManifest>;
|
|
3
|
+
export declare function classifyScreen(runtime: AgentRuntimeKind, screen: string, oscTitle?: string, oscProgress?: string): ManifestDetection;
|
|
4
|
+
export declare const MENU_RULE_IDS: Record<AgentRuntimeKind, ReadonlySet<string>>;
|
|
5
|
+
export declare function isMenuRule(runtime: AgentRuntimeKind, ruleId: string | undefined): boolean;
|
|
6
|
+
export declare function isTrustedIdleRule(runtime: AgentRuntimeKind, ruleId: string | undefined): boolean;
|
|
7
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../../src/agent/detect/classify.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACvB,MAAM,eAAe,CAAC;AAgBvB,eAAO,MAAM,SAAS,yCAAkB,CAAC;AAEzC,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,EACd,QAAQ,SAAK,EACb,WAAW,SAAK,GACf,iBAAiB,CAEnB;AAGD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAKvE,CAAC;AAUF,wBAAgB,UAAU,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEzF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAGhG"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { compileManifest, evaluateManifest, } from './manifest.js';
|
|
5
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
function loadManifests() {
|
|
7
|
+
const dir = join(__dirname, 'manifests');
|
|
8
|
+
const read = (name) => compileManifest(JSON.parse(readFileSync(join(dir, `${name}.json`), 'utf-8')));
|
|
9
|
+
return {
|
|
10
|
+
'claude-code': read('claude-code'),
|
|
11
|
+
codex: read('codex'),
|
|
12
|
+
opencode: read('opencode'),
|
|
13
|
+
qodercli: read('qodercli'),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export const manifests = loadManifests();
|
|
17
|
+
export function classifyScreen(runtime, screen, oscTitle = '', oscProgress = '') {
|
|
18
|
+
return evaluateManifest(manifests[runtime], { screen, oscTitle, oscProgress });
|
|
19
|
+
}
|
|
20
|
+
// 门控策略按 manifest rule id 取信,集中放在规则本体旁边,同步性由 detect 测试守护
|
|
21
|
+
export const MENU_RULE_IDS = {
|
|
22
|
+
'claude-code': new Set(['live_blocked_form', 'dynamic_workflow_prompt', 'model_picker_menu']),
|
|
23
|
+
codex: new Set(),
|
|
24
|
+
opencode: new Set(),
|
|
25
|
+
qodercli: new Set(),
|
|
26
|
+
};
|
|
27
|
+
// 只有 claude 的 ✳ 标题是稳定 idle 契约,其余 runtime 的标题不足以判就绪
|
|
28
|
+
const TITLE_IDLE_TRUSTED = {
|
|
29
|
+
'claude-code': true,
|
|
30
|
+
codex: false,
|
|
31
|
+
opencode: false,
|
|
32
|
+
qodercli: false,
|
|
33
|
+
};
|
|
34
|
+
export function isMenuRule(runtime, ruleId) {
|
|
35
|
+
return ruleId !== undefined && MENU_RULE_IDS[runtime].has(ruleId);
|
|
36
|
+
}
|
|
37
|
+
export function isTrustedIdleRule(runtime, ruleId) {
|
|
38
|
+
if (ruleId === undefined)
|
|
39
|
+
return false;
|
|
40
|
+
return ruleId !== 'osc_title_idle' || TITLE_IDLE_TRUSTED[runtime];
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../../src/agent/detect/classify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,eAAe,EACf,gBAAgB,GAIjB,MAAM,eAAe,CAAC;AAEvB,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,SAAS,aAAa;IACpB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAiB,EAAE,CAC3C,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,EAAE,OAAO,CAAC,CAAkB,CAAC,CAAC;IACjG,OAAO;QACL,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC;QAClC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;QACpB,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;QAC1B,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;AAEzC,MAAM,UAAU,cAAc,CAC5B,OAAyB,EACzB,MAAc,EACd,QAAQ,GAAG,EAAE,EACb,WAAW,GAAG,EAAE;IAEhB,OAAO,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,MAAM,aAAa,GAAkD;IAC1E,aAAa,EAAE,IAAI,GAAG,CAAC,CAAC,mBAAmB,EAAE,yBAAyB,EAAE,mBAAmB,CAAC,CAAC;IAC7F,KAAK,EAAE,IAAI,GAAG,EAAE;IAChB,QAAQ,EAAE,IAAI,GAAG,EAAE;IACnB,QAAQ,EAAE,IAAI,GAAG,EAAE;CACpB,CAAC;AAEF,mDAAmD;AACnD,MAAM,kBAAkB,GAAsC;IAC5D,aAAa,EAAE,IAAI;IACnB,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,KAAK;IACf,QAAQ,EAAE,KAAK;CAChB,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,OAAyB,EAAE,MAA0B;IAC9E,OAAO,MAAM,KAAK,SAAS,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAyB,EAAE,MAA0B;IACrF,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACvC,OAAO,MAAM,KAAK,gBAAgB,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -5,7 +5,7 @@ export interface Gate {
|
|
|
5
5
|
all?: Gate[];
|
|
6
6
|
any?: Gate[];
|
|
7
7
|
not?: Gate[];
|
|
8
|
-
notAfter?: Gate[];
|
|
9
8
|
}
|
|
10
|
-
export declare function
|
|
9
|
+
export declare function compileGate(gate: Gate): void;
|
|
10
|
+
export declare function evaluateGate(gate: Gate, text: string, lowerText?: string): boolean;
|
|
11
11
|
//# sourceMappingURL=gate.d.ts.map
|
|
@@ -1 +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;
|
|
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;CACd;AAoBD,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAM5C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,SAAqB,GAAG,OAAO,CA+C9F"}
|
|
@@ -1,60 +1,26 @@
|
|
|
1
1
|
const regexCache = new Map();
|
|
2
|
+
const INLINE_FLAGS_RE = /^\(\?([ims]+)\)/;
|
|
2
3
|
function getCachedRegExp(pattern) {
|
|
3
4
|
let re = regexCache.get(pattern);
|
|
4
5
|
if (!re) {
|
|
5
|
-
|
|
6
|
+
// 规则用 Rust regex 方言:Unicode 默认开启,行首内联 flag 需转成 JS flags
|
|
7
|
+
const inline = INLINE_FLAGS_RE.exec(pattern);
|
|
8
|
+
const flags = inline ? inline[1] : '';
|
|
9
|
+
// Rust 走 DFA,前导 .* 不要钱;JS 回溯引擎下它让每行退化成 O(L²),而 test() 本就不锚定行首
|
|
10
|
+
const body = (inline ? pattern.slice(inline[0].length) : pattern).replace(/^\.\*(?![?*+])/, '');
|
|
11
|
+
re = new RegExp(body, `${flags}u`);
|
|
6
12
|
regexCache.set(pattern, re);
|
|
7
13
|
}
|
|
8
14
|
return re;
|
|
9
15
|
}
|
|
10
|
-
function
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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;
|
|
16
|
+
export function compileGate(gate) {
|
|
17
|
+
gate.regex?.forEach(getCachedRegExp);
|
|
18
|
+
gate.lineRegex?.forEach(getCachedRegExp);
|
|
19
|
+
gate.all?.forEach(compileGate);
|
|
20
|
+
gate.any?.forEach(compileGate);
|
|
21
|
+
gate.not?.forEach(compileGate);
|
|
56
22
|
}
|
|
57
|
-
export function evaluateGate(gate, text) {
|
|
23
|
+
export function evaluateGate(gate, text, lowerText = text.toLowerCase()) {
|
|
58
24
|
const hasMatcher = (gate.contains && gate.contains.length > 0)
|
|
59
25
|
|| (gate.regex && gate.regex.length > 0)
|
|
60
26
|
|| (gate.lineRegex && gate.lineRegex.length > 0)
|
|
@@ -64,7 +30,6 @@ export function evaluateGate(gate, text) {
|
|
|
64
30
|
if (!hasMatcher)
|
|
65
31
|
return false;
|
|
66
32
|
if (gate.contains) {
|
|
67
|
-
const lowerText = text.toLowerCase();
|
|
68
33
|
for (const needle of gate.contains) {
|
|
69
34
|
if (!lowerText.includes(needle.toLowerCase()))
|
|
70
35
|
return false;
|
|
@@ -85,31 +50,20 @@ export function evaluateGate(gate, text) {
|
|
|
85
50
|
}
|
|
86
51
|
if (gate.all) {
|
|
87
52
|
for (const nested of gate.all) {
|
|
88
|
-
if (!evaluateGate(nested, text))
|
|
53
|
+
if (!evaluateGate(nested, text, lowerText))
|
|
89
54
|
return false;
|
|
90
55
|
}
|
|
91
56
|
}
|
|
92
57
|
if (gate.any && gate.any.length > 0) {
|
|
93
|
-
if (!gate.any.some(nested => evaluateGate(nested, text)))
|
|
58
|
+
if (!gate.any.some(nested => evaluateGate(nested, text, lowerText)))
|
|
94
59
|
return false;
|
|
95
60
|
}
|
|
96
61
|
if (gate.not) {
|
|
97
62
|
for (const nested of gate.not) {
|
|
98
|
-
if (evaluateGate(nested, text))
|
|
63
|
+
if (evaluateGate(nested, text, lowerText))
|
|
99
64
|
return false;
|
|
100
65
|
}
|
|
101
66
|
}
|
|
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
67
|
return true;
|
|
114
68
|
}
|
|
115
69
|
//# sourceMappingURL=gate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../../src/agent/detect/gate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../../src/agent/detect/gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Gate } from './gate.js';
|
|
2
2
|
import { type DetectionInput } from './region.js';
|
|
3
|
+
export type AgentRuntimeKind = 'claude-code' | 'codex' | 'opencode' | 'qodercli';
|
|
3
4
|
export type DetectedState = 'idle' | 'working' | 'pending' | 'unknown';
|
|
4
|
-
interface ManifestRule extends Gate {
|
|
5
|
+
export interface ManifestRule extends Gate {
|
|
5
6
|
id: string;
|
|
6
7
|
state: DetectedState;
|
|
7
8
|
priority: number;
|
|
@@ -23,6 +24,6 @@ export interface ManifestDetection {
|
|
|
23
24
|
visibleWorking: boolean;
|
|
24
25
|
skipStateUpdate: boolean;
|
|
25
26
|
}
|
|
27
|
+
export declare function compileManifest(manifest: AgentManifest): AgentManifest;
|
|
26
28
|
export declare function evaluateManifest(manifest: AgentManifest, input: DetectionInput): ManifestDetection;
|
|
27
|
-
export {};
|
|
28
29
|
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -1 +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,
|
|
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,EAAgC,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhF,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;AAEjF,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,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,CAWtE;AAcD,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,cAAc,GACpB,iBAAiB,CAoBnB"}
|
|
@@ -1,75 +1,48 @@
|
|
|
1
|
-
import { evaluateGate } from './gate.js';
|
|
2
|
-
import { extractRegion } from './region.js';
|
|
3
|
-
export function
|
|
4
|
-
let matched;
|
|
5
|
-
let bestScreenBlocker;
|
|
6
|
-
let bestScreenEvidence;
|
|
7
|
-
let bestScreenSkip;
|
|
1
|
+
import { compileGate, evaluateGate } from './gate.js';
|
|
2
|
+
import { extractRegion, isKnownRegion } from './region.js';
|
|
3
|
+
export function compileManifest(manifest) {
|
|
8
4
|
for (const rule of manifest.rules) {
|
|
9
|
-
const
|
|
10
|
-
if (!
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
5
|
+
const where = `manifest ${manifest.id} rule ${rule.id}`;
|
|
6
|
+
if (!isKnownRegion(rule.region))
|
|
7
|
+
throw new Error(`${where} uses unknown region: ${rule.region}`);
|
|
8
|
+
try {
|
|
9
|
+
compileGate(rule);
|
|
14
10
|
}
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
throw new Error(`${where} has an uncompilable pattern: ${err instanceof Error ? err.message : String(err)}`);
|
|
33
13
|
}
|
|
34
14
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
}
|
|
15
|
+
return manifest;
|
|
16
|
+
}
|
|
17
|
+
const rulesByPriority = new WeakMap();
|
|
18
|
+
// 稳定降序 = 上游"取最高优先级、同分取先出现者",于是首个命中即最终结果
|
|
19
|
+
function orderedRules(manifest) {
|
|
20
|
+
let ordered = rulesByPriority.get(manifest);
|
|
21
|
+
if (!ordered) {
|
|
22
|
+
ordered = [...manifest.rules].sort((a, b) => b.priority - a.priority);
|
|
23
|
+
rulesByPriority.set(manifest, ordered);
|
|
56
24
|
}
|
|
57
|
-
|
|
25
|
+
return ordered;
|
|
26
|
+
}
|
|
27
|
+
export function evaluateManifest(manifest, input) {
|
|
28
|
+
for (const rule of orderedRules(manifest)) {
|
|
29
|
+
if (!evaluateGate(rule, extractRegion(input, rule.region)))
|
|
30
|
+
continue;
|
|
58
31
|
return {
|
|
59
|
-
state:
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
32
|
+
state: rule.state,
|
|
33
|
+
matchedRuleId: rule.id,
|
|
34
|
+
visibleBlocker: !!(rule.visibleBlocker && rule.state === 'pending'),
|
|
35
|
+
visibleIdle: !!(rule.visibleIdle && rule.state === 'idle'),
|
|
36
|
+
visibleWorking: !!(rule.visibleWorking && rule.state === 'working'),
|
|
37
|
+
skipStateUpdate: !!rule.skipStateUpdate,
|
|
64
38
|
};
|
|
65
39
|
}
|
|
66
40
|
return {
|
|
67
|
-
state:
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
skipStateUpdate: !!matched.skipStateUpdate,
|
|
41
|
+
state: 'idle',
|
|
42
|
+
visibleBlocker: false,
|
|
43
|
+
visibleIdle: false,
|
|
44
|
+
visibleWorking: false,
|
|
45
|
+
skipStateUpdate: false,
|
|
73
46
|
};
|
|
74
47
|
}
|
|
75
48
|
//# sourceMappingURL=manifest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/agent/detect/manifest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/agent/detect/manifest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAC;AA+BhF,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,YAAY,QAAQ,CAAC,EAAE,SAAS,IAAI,CAAC,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yBAAyB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACjG,IAAI,CAAC;YACH,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,OAAO,EAAiC,CAAC;AAErE,wCAAwC;AACxC,SAAS,YAAY,CAAC,QAAuB;IAC3C,IAAI,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QACtE,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAuB,EACvB,KAAqB;IAErB,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAAE,SAAS;QACrE,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,aAAa,EAAE,IAAI,CAAC,EAAE;YACtB,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC;YACnE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC;YAC1D,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC;YACnE,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe;SACxC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM;QACb,cAAc,EAAE,KAAK;QACrB,WAAW,EAAE,KAAK;QAClB,cAAc,EAAE,KAAK;QACrB,eAAe,EAAE,KAAK;KACvB,CAAC;AACJ,CAAC"}
|