page-action-cache 1.0.4 → 2.0.1
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/README.md +399 -0
- package/dist/browser-action-executor.d.ts +87 -0
- package/dist/browser-action-executor.d.ts.map +1 -0
- package/dist/browser-action-executor.js +283 -0
- package/dist/browser-action-executor.js.map +1 -0
- package/dist/cache-invalidation.d.ts +128 -0
- package/dist/cache-invalidation.d.ts.map +1 -0
- package/dist/cache-invalidation.js +262 -0
- package/dist/cache-invalidation.js.map +1 -0
- package/dist/cache-manager.d.ts +83 -0
- package/dist/cache-manager.d.ts.map +1 -0
- package/dist/cache-manager.js +184 -0
- package/dist/cache-manager.js.map +1 -0
- package/dist/index.d.ts +7 -21
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +249 -31
- package/dist/index.js.map +1 -1
- package/dist/multi-level-cache.d.ts +127 -0
- package/dist/multi-level-cache.d.ts.map +1 -0
- package/dist/multi-level-cache.js +362 -0
- package/dist/multi-level-cache.js.map +1 -0
- package/dist/scenario-recognizer.d.ts +17 -27
- package/dist/scenario-recognizer.d.ts.map +1 -1
- package/dist/scenario-recognizer.js +63 -183
- package/dist/scenario-recognizer.js.map +1 -1
- package/dist/types.d.ts +38 -312
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -4
- package/dist/types.js.map +1 -1
- package/dist/variable-extractor.d.ts +56 -0
- package/dist/variable-extractor.d.ts.map +1 -0
- package/dist/variable-extractor.js +159 -0
- package/dist/variable-extractor.js.map +1 -0
- package/openclaw.plugin.json +12 -190
- package/package.json +29 -45
- package/src/browser-action-executor.ts +337 -0
- package/src/cache-invalidation.ts +338 -0
- package/src/cache-manager.ts +211 -0
- package/src/index.ts +306 -0
- package/src/multi-level-cache.ts +478 -0
- package/src/scenario-recognizer.ts +121 -0
- package/src/types-mock.d.ts +18 -0
- package/src/types.ts +66 -0
- package/src/variable-extractor.ts +204 -0
- package/dist/actions-executor.d.ts +0 -62
- package/dist/actions-executor.d.ts.map +0 -1
- package/dist/actions-executor.js +0 -339
- package/dist/actions-executor.js.map +0 -1
- package/dist/cache-invalidator.d.ts +0 -70
- package/dist/cache-invalidator.d.ts.map +0 -1
- package/dist/cache-invalidator.js +0 -212
- package/dist/cache-invalidator.js.map +0 -1
- package/dist/cache-store.d.ts +0 -80
- package/dist/cache-store.d.ts.map +0 -1
- package/dist/cache-store.js +0 -361
- package/dist/cache-store.js.map +0 -1
- package/dist/cache-strategy.d.ts +0 -65
- package/dist/cache-strategy.d.ts.map +0 -1
- package/dist/cache-strategy.js +0 -237
- package/dist/cache-strategy.js.map +0 -1
- package/dist/hooks-entry.d.ts +0 -29
- package/dist/hooks-entry.d.ts.map +0 -1
- package/dist/hooks-entry.js +0 -83
- package/dist/hooks-entry.js.map +0 -1
- package/dist/hooks.d.ts +0 -10
- package/dist/hooks.d.ts.map +0 -1
- package/dist/hooks.js +0 -277
- package/dist/hooks.js.map +0 -1
- package/dist/security-policy.d.ts +0 -62
- package/dist/security-policy.d.ts.map +0 -1
- package/dist/security-policy.js +0 -219
- package/dist/security-policy.js.map +0 -1
- package/dist/tools.d.ts +0 -209
- package/dist/tools.d.ts.map +0 -1
- package/dist/tools.js +0 -383
- package/dist/tools.js.map +0 -1
- package/dist/ux-enhancer.d.ts +0 -60
- package/dist/ux-enhancer.d.ts.map +0 -1
- package/dist/ux-enhancer.js +0 -218
- package/dist/ux-enhancer.js.map +0 -1
- package/dist/variable-resolver.d.ts +0 -28
- package/dist/variable-resolver.d.ts.map +0 -1
- package/dist/variable-resolver.js +0 -201
- package/dist/variable-resolver.js.map +0 -1
- package/docs/API.md +0 -555
- package/docs/IMPLEMENTATION.md +0 -1792
- package/docs/INTEGRATION.md +0 -387
- package/docs/README.md +0 -183
- package/skills/page-action-cache/SKILL.md +0 -216
|
@@ -1,213 +1,93 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Scenario Recognizer
|
|
3
|
-
* 场景识别器 -
|
|
2
|
+
* Scenario Recognizer - Page Action Cache
|
|
3
|
+
* 场景识别器 - 识别用户操作场景
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
{
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
{
|
|
19
|
-
scenario: "logout",
|
|
20
|
-
keywords: ["退出", "登出", "注销", "sign out", "logout"],
|
|
21
|
-
urlPatterns: ["/logout", "/signout", "/signout"],
|
|
22
|
-
priority: 100,
|
|
23
|
-
cacheLevel: "L3",
|
|
24
|
-
confidence: 90,
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
scenario: "search",
|
|
28
|
-
keywords: ["搜索", "查找", "找", "search for", "查询"],
|
|
29
|
-
urlPatterns: ["/search", "/query", "/list"],
|
|
30
|
-
priority: 80,
|
|
31
|
-
cacheLevel: "L3",
|
|
32
|
-
confidence: 80,
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
scenario: "checkout",
|
|
36
|
-
keywords: ["结账", "结算", "支付", "收银", "买单", "checkout"],
|
|
37
|
-
urlPatterns: ["/checkout", "/cart", "/payment"],
|
|
38
|
-
priority: 90,
|
|
39
|
-
cacheLevel: "L3",
|
|
40
|
-
confidence: 85,
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
scenario: "settings",
|
|
44
|
-
keywords: ["设置", "配置", "修改", "编辑", "个人中心"],
|
|
45
|
-
urlPatterns: ["/settings", "/config", "/profile"],
|
|
46
|
-
priority: 75,
|
|
47
|
-
cacheLevel: "L3",
|
|
48
|
-
confidence: 75,
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
scenario: "form_fill",
|
|
52
|
-
keywords: ["填写", "填表单", "提交", "submit form"],
|
|
53
|
-
urlPatterns: [], // 不依赖 URL
|
|
54
|
-
priority: 70,
|
|
55
|
-
cacheLevel: "L2",
|
|
56
|
-
confidence: 70,
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
scenario: "navigate",
|
|
60
|
-
keywords: ["打开", "进入", "跳转", "go to", "open", "navigate"],
|
|
61
|
-
urlPatterns: [],
|
|
62
|
-
priority: 60,
|
|
63
|
-
cacheLevel: "L2",
|
|
64
|
-
confidence: 60,
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
scenario: "screenshot",
|
|
68
|
-
keywords: ["截图", "截图", "snapshot", "screenshot"],
|
|
69
|
-
urlPatterns: [],
|
|
70
|
-
priority: 50,
|
|
71
|
-
cacheLevel: "L1",
|
|
72
|
-
confidence: 50,
|
|
73
|
-
},
|
|
5
|
+
/**
|
|
6
|
+
* 场景识别规则
|
|
7
|
+
*/
|
|
8
|
+
const SCENARIO_PATTERNS = [
|
|
9
|
+
// 登录场景
|
|
10
|
+
{ pattern: /(login|signin|auth|oauth|sso|account|register|signup)/i, scenario: 'login' },
|
|
11
|
+
// 搜索场景
|
|
12
|
+
{ pattern: /(search|query|find|explore|discover)/i, scenario: 'search' },
|
|
13
|
+
// 支付场景
|
|
14
|
+
{ pattern: /(payment|pay|checkout|billing|invoice|transaction)/i, scenario: 'payment' },
|
|
15
|
+
// 结账场景
|
|
16
|
+
{ pattern: /(cart|basket|order|purchase|buy)/i, scenario: 'checkout' },
|
|
17
|
+
// 电商场景
|
|
18
|
+
{ pattern: /(shop|store|product|item|goods|marketplace)/i, scenario: 'checkout' }
|
|
74
19
|
];
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
20
|
+
/**
|
|
21
|
+
* 页面内容关键词
|
|
22
|
+
*/
|
|
23
|
+
const CONTENT_KEYWORDS = {
|
|
24
|
+
login: ['username', 'password', 'email', 'phone', '登录', '密码', '用户名', '邮箱', '手机号', 'sign in', 'log in'],
|
|
25
|
+
search: ['search', 'query', '查找', '搜索', '输入', 'input'],
|
|
26
|
+
payment: ['credit card', 'debit card', 'payment method', '银行卡', '信用卡', '支付方式', 'cvv', 'expiry'],
|
|
27
|
+
checkout: ['cart', 'total', 'subtotal', 'shipping', '购物车', '总计', '运费', '收货地址'],
|
|
28
|
+
general: [],
|
|
29
|
+
unknown: []
|
|
30
|
+
};
|
|
78
31
|
/**
|
|
79
32
|
* 场景识别器
|
|
80
33
|
*/
|
|
81
34
|
export class ScenarioRecognizer {
|
|
82
|
-
cacheStore = getCacheStore();
|
|
83
35
|
/**
|
|
84
|
-
*
|
|
36
|
+
* 通过 URL 识别场景
|
|
85
37
|
*/
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
// 2. 语义理解(使用 LLM)
|
|
93
|
-
const llmMatch = await this.matchWithLLM(userInput, currentUrl);
|
|
94
|
-
if (llmMatch && llmMatch.confidence >= 70) {
|
|
95
|
-
return llmMatch;
|
|
96
|
-
}
|
|
97
|
-
// 3. 历史学习(相似输入匹配)
|
|
98
|
-
const historyMatch = this.matchHistory(userInput);
|
|
99
|
-
if (historyMatch && historyMatch.confidence >= 60) {
|
|
100
|
-
return historyMatch;
|
|
38
|
+
recognizeByUrl(url) {
|
|
39
|
+
for (const { pattern, scenario } of SCENARIO_PATTERNS) {
|
|
40
|
+
if (pattern.test(url)) {
|
|
41
|
+
return scenario;
|
|
42
|
+
}
|
|
101
43
|
}
|
|
102
|
-
return
|
|
44
|
+
return 'general';
|
|
103
45
|
}
|
|
104
46
|
/**
|
|
105
|
-
*
|
|
47
|
+
* 通过页面内容识别场景
|
|
106
48
|
*/
|
|
107
|
-
|
|
108
|
-
const
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
return {
|
|
115
|
-
scenario: rule.scenario,
|
|
116
|
-
confidence: rule.priority,
|
|
117
|
-
method: "keyword",
|
|
118
|
-
matchedPattern: keyword,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
// URL 模式匹配
|
|
123
|
-
for (const pattern of rule.urlPatterns) {
|
|
124
|
-
if (normalizedUrl.includes(pattern.toLowerCase())) {
|
|
125
|
-
return {
|
|
126
|
-
scenario: rule.scenario,
|
|
127
|
-
confidence: rule.priority - 10, // 略低于纯关键词
|
|
128
|
-
method: "url",
|
|
129
|
-
matchedPattern: pattern,
|
|
130
|
-
};
|
|
49
|
+
recognizeByContent(content) {
|
|
50
|
+
const lowerContent = content.toLowerCase();
|
|
51
|
+
for (const [scenario, keywords] of Object.entries(CONTENT_KEYWORDS)) {
|
|
52
|
+
if (keywords.length > 0) {
|
|
53
|
+
const matchedKeywords = keywords.filter(keyword => lowerContent.includes(keyword.toLowerCase()));
|
|
54
|
+
if (matchedKeywords.length >= 2) {
|
|
55
|
+
return scenario;
|
|
131
56
|
}
|
|
132
57
|
}
|
|
133
58
|
}
|
|
134
|
-
return
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* LLM 分类
|
|
138
|
-
*/
|
|
139
|
-
async matchWithLLM(_userInput, _url) {
|
|
140
|
-
// TODO: 实现 LLM 分类
|
|
141
|
-
// 使用 OpenClaw 的 LLM 进行意图分类
|
|
142
|
-
// 返回场景类型和置信度
|
|
143
|
-
// 暂时返回 null,等待 LLM 集成
|
|
144
|
-
return null;
|
|
59
|
+
return 'general';
|
|
145
60
|
}
|
|
146
61
|
/**
|
|
147
|
-
*
|
|
62
|
+
* 综合识别(URL + 内容)
|
|
148
63
|
*/
|
|
149
|
-
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
return null;
|
|
64
|
+
recognize(url, content) {
|
|
65
|
+
const urlScenario = this.recognizeByUrl(url);
|
|
66
|
+
if (urlScenario !== 'general' && urlScenario !== 'unknown') {
|
|
67
|
+
return urlScenario;
|
|
154
68
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const scenarioMatch = this.cacheStore.getScenarioMatch("search"); // 示例
|
|
158
|
-
if (scenarioMatch) {
|
|
159
|
-
const similarity = this.calculateJaccardSimilarity(userInput, scenarioMatch.scenario);
|
|
160
|
-
if (similarity >= 0.6) {
|
|
161
|
-
return {
|
|
162
|
-
scenario: scenarioMatch.scenario,
|
|
163
|
-
confidence: Math.round(similarity * 100),
|
|
164
|
-
method: "history",
|
|
165
|
-
};
|
|
166
|
-
}
|
|
69
|
+
if (content) {
|
|
70
|
+
return this.recognizeByContent(content);
|
|
167
71
|
}
|
|
168
|
-
return
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* 计算 Jaccard 相似度
|
|
172
|
-
*/
|
|
173
|
-
calculateJaccardSimilarity(str1, str2) {
|
|
174
|
-
const set1 = new Set(str1.toLowerCase().split(/\s+/));
|
|
175
|
-
const set2 = new Set(str2.toLowerCase().split(/\s+/));
|
|
176
|
-
const intersection = new Set([...set1].filter((x) => set2.has(x)));
|
|
177
|
-
const union = new Set([...set1, ...set2]);
|
|
178
|
-
return intersection.size / union.size;
|
|
179
|
-
}
|
|
180
|
-
// -------------------------------------------------------------------------
|
|
181
|
-
// 辅助方法
|
|
182
|
-
// -------------------------------------------------------------------------
|
|
183
|
-
/**
|
|
184
|
-
* 获取所有规则
|
|
185
|
-
*/
|
|
186
|
-
getRules() {
|
|
187
|
-
return [...EXACT_SCENARIO_RULES];
|
|
72
|
+
return urlScenario;
|
|
188
73
|
}
|
|
189
74
|
/**
|
|
190
|
-
*
|
|
75
|
+
* 添加自定义场景规则
|
|
191
76
|
*/
|
|
192
|
-
|
|
193
|
-
|
|
77
|
+
addCustomRule(pattern, scenario) {
|
|
78
|
+
SCENARIO_PATTERNS.unshift({ pattern, scenario });
|
|
194
79
|
}
|
|
195
80
|
/**
|
|
196
|
-
*
|
|
81
|
+
* 添加内容关键词
|
|
197
82
|
*/
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
// ============================================================================
|
|
204
|
-
// 单例
|
|
205
|
-
// ============================================================================
|
|
206
|
-
let scenarioRecognizerInstance = null;
|
|
207
|
-
export function getScenarioRecognizer() {
|
|
208
|
-
if (!scenarioRecognizerInstance) {
|
|
209
|
-
scenarioRecognizerInstance = new ScenarioRecognizer();
|
|
83
|
+
addContentKeyword(scenario, keywords) {
|
|
84
|
+
if (CONTENT_KEYWORDS[scenario]) {
|
|
85
|
+
CONTENT_KEYWORDS[scenario].push(...keywords);
|
|
86
|
+
}
|
|
210
87
|
}
|
|
211
|
-
return scenarioRecognizerInstance;
|
|
212
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* 单例导出
|
|
91
|
+
*/
|
|
92
|
+
export const scenarioRecognizer = new ScenarioRecognizer();
|
|
213
93
|
//# sourceMappingURL=scenario-recognizer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenario-recognizer.js","sourceRoot":"","sources":["../src/scenario-recognizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"scenario-recognizer.js","sourceRoot":"","sources":["../src/scenario-recognizer.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,336 +1,62 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Page Action Cache
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* 完全对齐 Playwright API 的类型定义
|
|
2
|
+
* Page Action Cache Types
|
|
3
|
+
* 页面操作缓存类型定义
|
|
6
4
|
*/
|
|
7
5
|
/**
|
|
8
|
-
*
|
|
6
|
+
* 缓存操作类型
|
|
9
7
|
*/
|
|
10
|
-
export
|
|
11
|
-
width: number;
|
|
12
|
-
height: number;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* 变量映射
|
|
16
|
-
*/
|
|
17
|
-
export type VariableMap = Record<string, string>;
|
|
18
|
-
/**
|
|
19
|
-
* 原子化操作类型
|
|
20
|
-
*/
|
|
21
|
-
export type AtomicActionType = "navigate" | "screenshot" | "click" | "type" | "press" | "hover" | "scroll" | "wait" | "select" | "focus" | "drag" | "upload" | "composite";
|
|
22
|
-
/**
|
|
23
|
-
* Playwright 支持的按钮类型
|
|
24
|
-
*/
|
|
25
|
-
export type PlaywrightButton = "left" | "right" | "middle";
|
|
26
|
-
/**
|
|
27
|
-
* Playwright 支持的修饰符
|
|
28
|
-
*/
|
|
29
|
-
export type PlaywrightModifier = "Alt" | "Control" | "ControlOrMeta" | "Meta" | "Shift";
|
|
30
|
-
/**
|
|
31
|
-
* Playwright 导航策略
|
|
32
|
-
*/
|
|
33
|
-
export interface NavigationPolicy {
|
|
34
|
-
waitUntil?: "load" | "domcontentloaded" | "networkidle";
|
|
35
|
-
timeout?: number;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Evaluate 操作参数
|
|
39
|
-
*/
|
|
40
|
-
export interface EvaluateParams {
|
|
41
|
-
code: string;
|
|
42
|
-
args?: any[];
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* 原子化操作基类
|
|
46
|
-
*/
|
|
47
|
-
export interface BaseAtomicAction {
|
|
48
|
-
type: AtomicActionType;
|
|
49
|
-
cdpUrl?: string;
|
|
50
|
-
targetId?: string;
|
|
51
|
-
ref?: string;
|
|
52
|
-
variable?: string;
|
|
53
|
-
order: number;
|
|
54
|
-
description?: string;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* 导航操作
|
|
58
|
-
*/
|
|
59
|
-
export interface NavigateAction extends BaseAtomicAction {
|
|
60
|
-
type: "navigate";
|
|
61
|
-
url: string;
|
|
62
|
-
navigationPolicy?: NavigationPolicy;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* 点击操作
|
|
66
|
-
*/
|
|
67
|
-
export interface ClickAction extends BaseAtomicAction {
|
|
68
|
-
type: "click";
|
|
69
|
-
ref: string;
|
|
70
|
-
button?: PlaywrightButton;
|
|
71
|
-
doubleClick?: boolean;
|
|
72
|
-
modifiers?: PlaywrightModifier[];
|
|
73
|
-
timeoutMs?: number;
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* 输入操作
|
|
77
|
-
*/
|
|
78
|
-
export interface TypeAction extends BaseAtomicAction {
|
|
79
|
-
type: "type";
|
|
80
|
-
ref: string;
|
|
81
|
-
text: string;
|
|
82
|
-
submit?: boolean;
|
|
83
|
-
slowly?: boolean;
|
|
84
|
-
timeoutMs?: number;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* 按键操作
|
|
88
|
-
*/
|
|
89
|
-
export interface PressAction extends BaseAtomicAction {
|
|
90
|
-
type: "press";
|
|
91
|
-
key: string;
|
|
92
|
-
delayMs?: number;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* 悬停操作
|
|
96
|
-
*/
|
|
97
|
-
export interface HoverAction extends BaseAtomicAction {
|
|
98
|
-
type: "hover";
|
|
99
|
-
ref: string;
|
|
100
|
-
timeoutMs?: number;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* 截图操作
|
|
104
|
-
*/
|
|
105
|
-
export interface ScreenshotAction extends BaseAtomicAction {
|
|
106
|
-
type: "screenshot";
|
|
107
|
-
screenshotPath?: string;
|
|
108
|
-
}
|
|
8
|
+
export type CacheActionType = 'navigate' | 'click' | 'screenshot' | 'type' | 'script';
|
|
109
9
|
/**
|
|
110
|
-
*
|
|
10
|
+
* 场景类型
|
|
111
11
|
*/
|
|
112
|
-
export type
|
|
113
|
-
export interface EvaluateAction extends BaseAtomicAction {
|
|
114
|
-
type: EvaluateActionType;
|
|
115
|
-
evaluate: EvaluateParams;
|
|
116
|
-
delay?: number;
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* 复合操作
|
|
120
|
-
*/
|
|
121
|
-
export interface CompositeAction extends BaseAtomicAction {
|
|
122
|
-
type: "composite";
|
|
123
|
-
actions: AtomicAction[];
|
|
124
|
-
atomic?: boolean;
|
|
125
|
-
rollback?: AtomicAction[];
|
|
126
|
-
label?: string;
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* 原子化操作联合类型
|
|
130
|
-
*/
|
|
131
|
-
export type AtomicAction = NavigateAction | ClickAction | TypeAction | PressAction | HoverAction | ScreenshotAction | EvaluateAction | CompositeAction;
|
|
132
|
-
/**
|
|
133
|
-
* 操作类型(包含复合操作)
|
|
134
|
-
*/
|
|
135
|
-
export type Action = AtomicAction;
|
|
136
|
-
/**
|
|
137
|
-
* 缓存层级
|
|
138
|
-
*/
|
|
139
|
-
export type CacheLevel = "L3" | "L2" | "L1";
|
|
12
|
+
export type ScenarioType = 'login' | 'search' | 'payment' | 'checkout' | 'general' | 'unknown';
|
|
140
13
|
/**
|
|
141
|
-
*
|
|
14
|
+
* 缓存条目
|
|
142
15
|
*/
|
|
143
|
-
export
|
|
144
|
-
|
|
145
|
-
* 缓存来源
|
|
146
|
-
*/
|
|
147
|
-
export type CacheSource = "llm" | "manual" | "learned";
|
|
148
|
-
/**
|
|
149
|
-
* DOM hash 特征
|
|
150
|
-
*/
|
|
151
|
-
export interface DOMHashFeatures {
|
|
152
|
-
formCount: number;
|
|
153
|
-
buttonCount: number;
|
|
154
|
-
linkCount: number;
|
|
155
|
-
scriptCount: number;
|
|
156
|
-
headingCount: number;
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* 页面变化检测结果
|
|
160
|
-
*/
|
|
161
|
-
export interface PageChangeDetection {
|
|
162
|
-
hasChanged: boolean;
|
|
163
|
-
changeType: "structure" | "content" | "none";
|
|
164
|
-
confidence: number;
|
|
165
|
-
domHash: string;
|
|
166
|
-
structureHash?: string;
|
|
167
|
-
lastCheckedAt: number;
|
|
168
|
-
details?: string;
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* 页面操作缓存条目
|
|
172
|
-
*/
|
|
173
|
-
export interface PageActionCacheEntry {
|
|
174
|
-
key: string;
|
|
16
|
+
export interface CacheEntry {
|
|
17
|
+
id: string;
|
|
175
18
|
url: string;
|
|
176
|
-
viewport
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
pageChangeDetection: PageChangeDetection;
|
|
189
|
-
source: CacheSource;
|
|
190
|
-
version?: number;
|
|
191
|
-
tags?: string[];
|
|
192
|
-
variant?: string;
|
|
193
|
-
successCount: number;
|
|
194
|
-
failCount: number;
|
|
195
|
-
avgExecutionTime: number;
|
|
196
|
-
pageType?: PageType;
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* 场景识别规则
|
|
200
|
-
*/
|
|
201
|
-
export interface ScenarioRule {
|
|
202
|
-
scenario: string;
|
|
203
|
-
keywords: string[];
|
|
204
|
-
urlPatterns: string[];
|
|
205
|
-
priority: number;
|
|
206
|
-
cacheLevel: CacheLevel;
|
|
207
|
-
confidence: number;
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* 场景匹配结果
|
|
211
|
-
*/
|
|
212
|
-
export interface ScenarioMatch {
|
|
213
|
-
scenario: string;
|
|
214
|
-
confidence: number;
|
|
215
|
-
method: "keyword" | "url" | "llm" | "history" | "learned";
|
|
216
|
-
matchedPattern?: string;
|
|
19
|
+
viewport?: string;
|
|
20
|
+
actions: Array<{
|
|
21
|
+
type: CacheActionType;
|
|
22
|
+
params?: any;
|
|
23
|
+
successCount: number;
|
|
24
|
+
failCount: number;
|
|
25
|
+
}>;
|
|
26
|
+
scenario?: ScenarioType;
|
|
27
|
+
timestamp: number;
|
|
28
|
+
hitRate: number;
|
|
29
|
+
savedActions: number;
|
|
30
|
+
savedTime: number;
|
|
217
31
|
}
|
|
218
32
|
/**
|
|
219
33
|
* 缓存统计
|
|
220
34
|
*/
|
|
221
35
|
export interface CacheStats {
|
|
222
36
|
totalEntries: number;
|
|
223
|
-
|
|
224
|
-
totalMisses: number;
|
|
37
|
+
totalActions: number;
|
|
225
38
|
hitRate: number;
|
|
226
|
-
|
|
227
|
-
l2Hits: number;
|
|
228
|
-
l1Hits: number;
|
|
229
|
-
scenarioMatches: number;
|
|
230
|
-
llmClassifications: number;
|
|
231
|
-
learnedAssociations: number;
|
|
232
|
-
savedTokens: number;
|
|
39
|
+
savedActions: number;
|
|
233
40
|
savedTime: number;
|
|
234
|
-
avgExecutionTime: number;
|
|
235
|
-
userConfirmations: number;
|
|
236
|
-
userForcedRefreshes: number;
|
|
237
|
-
cacheErrors: number;
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* 页面操作缓存存储
|
|
241
|
-
*/
|
|
242
|
-
export interface PageActionCacheStore {
|
|
243
|
-
version: number;
|
|
244
|
-
entries: Record<string, PageActionCacheEntry>;
|
|
245
|
-
scenarios: Map<string, ScenarioMatch>;
|
|
246
|
-
stats: CacheStats;
|
|
247
41
|
}
|
|
248
42
|
/**
|
|
249
43
|
* 缓存配置
|
|
250
44
|
*/
|
|
251
|
-
export interface
|
|
45
|
+
export interface PageActionCacheConfig {
|
|
252
46
|
enabled: boolean;
|
|
253
|
-
autoUseCache
|
|
254
|
-
scenarioRecognitionEnabled
|
|
255
|
-
llmClassificationThreshold
|
|
256
|
-
cacheLevelStrategy
|
|
257
|
-
defaultCacheLevel
|
|
258
|
-
pageChangeDetectionEnabled
|
|
259
|
-
changeInvalidationThreshold
|
|
260
|
-
invalidationStrategy
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
logSanitizationEnabled: boolean;
|
|
268
|
-
showCacheStatusToUser: boolean;
|
|
269
|
-
enableUserCacheConfirmation: boolean;
|
|
270
|
-
enableUserForcedRefresh: boolean;
|
|
271
|
-
enableUserCacheErrorReport: boolean;
|
|
272
|
-
trackExecutionStats: boolean;
|
|
273
|
-
statsUpdateInterval: number;
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* 操作执行结果
|
|
277
|
-
*/
|
|
278
|
-
export interface ExecutionResult {
|
|
279
|
-
action: string;
|
|
280
|
-
success: boolean;
|
|
281
|
-
error?: string;
|
|
282
|
-
duration: number;
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Playwright 客户端接口
|
|
286
|
-
*/
|
|
287
|
-
export interface PwAi {
|
|
288
|
-
navigateViaPlaywright(opts: {
|
|
289
|
-
cdpUrl: string;
|
|
290
|
-
targetId?: string;
|
|
291
|
-
url: string;
|
|
292
|
-
waitUntil?: "load" | "domcontentloaded" | "networkidle";
|
|
293
|
-
timeout?: number;
|
|
294
|
-
}): Promise<void>;
|
|
295
|
-
clickViaPlaywright(opts: {
|
|
296
|
-
cdpUrl: string;
|
|
297
|
-
targetId?: string;
|
|
298
|
-
ref: string;
|
|
299
|
-
doubleClick?: boolean;
|
|
300
|
-
button?: "left" | "right" | "middle";
|
|
301
|
-
modifiers?: Array<"Alt" | "Control" | "ControlOrMeta" | "Meta" | "Shift">;
|
|
302
|
-
timeoutMs?: number;
|
|
303
|
-
}): Promise<void>;
|
|
304
|
-
typeViaPlaywright(opts: {
|
|
305
|
-
cdpUrl: string;
|
|
306
|
-
targetId?: string;
|
|
307
|
-
ref: string;
|
|
308
|
-
text: string;
|
|
309
|
-
submit?: boolean;
|
|
310
|
-
slowly?: boolean;
|
|
311
|
-
timeoutMs?: number;
|
|
312
|
-
}): Promise<void>;
|
|
313
|
-
pressKeyViaPlaywright(opts: {
|
|
314
|
-
cdpUrl: string;
|
|
315
|
-
targetId?: string;
|
|
316
|
-
key: string;
|
|
317
|
-
delayMs?: number;
|
|
318
|
-
}): Promise<void>;
|
|
319
|
-
hoverViaPlaywright(opts: {
|
|
320
|
-
cdpUrl: string;
|
|
321
|
-
targetId?: string;
|
|
322
|
-
ref: string;
|
|
323
|
-
timeoutMs?: number;
|
|
324
|
-
}): Promise<void>;
|
|
325
|
-
screenshotViaPlaywright(opts: {
|
|
326
|
-
cdpUrl: string;
|
|
327
|
-
targetId?: string;
|
|
328
|
-
}): Promise<string>;
|
|
329
|
-
evaluateViaPlaywright(opts: {
|
|
330
|
-
cdpUrl: string;
|
|
331
|
-
targetId?: string;
|
|
332
|
-
code: string;
|
|
333
|
-
args?: any[];
|
|
334
|
-
}): Promise<any>;
|
|
47
|
+
autoUseCache?: boolean;
|
|
48
|
+
scenarioRecognitionEnabled?: boolean;
|
|
49
|
+
llmClassificationThreshold?: number;
|
|
50
|
+
cacheLevelStrategy?: 'auto' | 'l3-only' | 'l2-only' | 'l1-only';
|
|
51
|
+
defaultCacheLevel?: 'L3' | 'L2' | 'L1';
|
|
52
|
+
pageChangeDetectionEnabled?: boolean;
|
|
53
|
+
changeInvalidationThreshold?: number;
|
|
54
|
+
invalidationStrategy?: 'soft' | 'hard';
|
|
55
|
+
variableExtractionEnabled?: boolean;
|
|
56
|
+
allowUserConfirmVariables?: boolean;
|
|
57
|
+
allowUserForcedRefresh?: boolean;
|
|
58
|
+
enableUserCacheErrorReport?: boolean;
|
|
59
|
+
trackExecutionStats?: boolean;
|
|
60
|
+
statsUpdateInterval?: number;
|
|
335
61
|
}
|
|
336
62
|
//# sourceMappingURL=types.d.ts.map
|