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.
Files changed (89) hide show
  1. package/README.md +399 -0
  2. package/dist/browser-action-executor.d.ts +87 -0
  3. package/dist/browser-action-executor.d.ts.map +1 -0
  4. package/dist/browser-action-executor.js +283 -0
  5. package/dist/browser-action-executor.js.map +1 -0
  6. package/dist/cache-invalidation.d.ts +128 -0
  7. package/dist/cache-invalidation.d.ts.map +1 -0
  8. package/dist/cache-invalidation.js +262 -0
  9. package/dist/cache-invalidation.js.map +1 -0
  10. package/dist/cache-manager.d.ts +83 -0
  11. package/dist/cache-manager.d.ts.map +1 -0
  12. package/dist/cache-manager.js +184 -0
  13. package/dist/cache-manager.js.map +1 -0
  14. package/dist/index.d.ts +7 -21
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +249 -31
  17. package/dist/index.js.map +1 -1
  18. package/dist/multi-level-cache.d.ts +127 -0
  19. package/dist/multi-level-cache.d.ts.map +1 -0
  20. package/dist/multi-level-cache.js +362 -0
  21. package/dist/multi-level-cache.js.map +1 -0
  22. package/dist/scenario-recognizer.d.ts +17 -27
  23. package/dist/scenario-recognizer.d.ts.map +1 -1
  24. package/dist/scenario-recognizer.js +63 -183
  25. package/dist/scenario-recognizer.js.map +1 -1
  26. package/dist/types.d.ts +38 -312
  27. package/dist/types.d.ts.map +1 -1
  28. package/dist/types.js +2 -4
  29. package/dist/types.js.map +1 -1
  30. package/dist/variable-extractor.d.ts +56 -0
  31. package/dist/variable-extractor.d.ts.map +1 -0
  32. package/dist/variable-extractor.js +159 -0
  33. package/dist/variable-extractor.js.map +1 -0
  34. package/openclaw.plugin.json +12 -190
  35. package/package.json +29 -45
  36. package/src/browser-action-executor.ts +337 -0
  37. package/src/cache-invalidation.ts +338 -0
  38. package/src/cache-manager.ts +211 -0
  39. package/src/index.ts +306 -0
  40. package/src/multi-level-cache.ts +478 -0
  41. package/src/scenario-recognizer.ts +121 -0
  42. package/src/types-mock.d.ts +18 -0
  43. package/src/types.ts +66 -0
  44. package/src/variable-extractor.ts +204 -0
  45. package/dist/actions-executor.d.ts +0 -62
  46. package/dist/actions-executor.d.ts.map +0 -1
  47. package/dist/actions-executor.js +0 -339
  48. package/dist/actions-executor.js.map +0 -1
  49. package/dist/cache-invalidator.d.ts +0 -70
  50. package/dist/cache-invalidator.d.ts.map +0 -1
  51. package/dist/cache-invalidator.js +0 -212
  52. package/dist/cache-invalidator.js.map +0 -1
  53. package/dist/cache-store.d.ts +0 -80
  54. package/dist/cache-store.d.ts.map +0 -1
  55. package/dist/cache-store.js +0 -361
  56. package/dist/cache-store.js.map +0 -1
  57. package/dist/cache-strategy.d.ts +0 -65
  58. package/dist/cache-strategy.d.ts.map +0 -1
  59. package/dist/cache-strategy.js +0 -237
  60. package/dist/cache-strategy.js.map +0 -1
  61. package/dist/hooks-entry.d.ts +0 -29
  62. package/dist/hooks-entry.d.ts.map +0 -1
  63. package/dist/hooks-entry.js +0 -83
  64. package/dist/hooks-entry.js.map +0 -1
  65. package/dist/hooks.d.ts +0 -10
  66. package/dist/hooks.d.ts.map +0 -1
  67. package/dist/hooks.js +0 -277
  68. package/dist/hooks.js.map +0 -1
  69. package/dist/security-policy.d.ts +0 -62
  70. package/dist/security-policy.d.ts.map +0 -1
  71. package/dist/security-policy.js +0 -219
  72. package/dist/security-policy.js.map +0 -1
  73. package/dist/tools.d.ts +0 -209
  74. package/dist/tools.d.ts.map +0 -1
  75. package/dist/tools.js +0 -383
  76. package/dist/tools.js.map +0 -1
  77. package/dist/ux-enhancer.d.ts +0 -60
  78. package/dist/ux-enhancer.d.ts.map +0 -1
  79. package/dist/ux-enhancer.js +0 -218
  80. package/dist/ux-enhancer.js.map +0 -1
  81. package/dist/variable-resolver.d.ts +0 -28
  82. package/dist/variable-resolver.d.ts.map +0 -1
  83. package/dist/variable-resolver.js +0 -201
  84. package/dist/variable-resolver.js.map +0 -1
  85. package/docs/API.md +0 -555
  86. package/docs/IMPLEMENTATION.md +0 -1792
  87. package/docs/INTEGRATION.md +0 -387
  88. package/docs/README.md +0 -183
  89. 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
- import { getCacheStore } from "./cache-store.js";
6
- // ============================================================================
7
- // 精确场景规则
8
- // ============================================================================
9
- const EXACT_SCENARIO_RULES = [
10
- {
11
- scenario: "login",
12
- keywords: ["登录", "登陆", "注册", "进入", "login to", "sign in", "账号"],
13
- urlPatterns: ["/login", "/signin", "/auth", "/account"],
14
- priority: 100,
15
- cacheLevel: "L3",
16
- confidence: 90,
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
- // Scenario Recognizer 类
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
- async recognize(userInput, currentUrl) {
87
- // 1. 精确规则匹配(高优先级,低误判)
88
- const exactMatch = this.matchExactRules(userInput, currentUrl);
89
- if (exactMatch && exactMatch.confidence >= 90) {
90
- return exactMatch;
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 null; // 都不匹配,交给 LLM 分析
44
+ return 'general';
103
45
  }
104
46
  /**
105
- * 精确规则匹配
47
+ * 通过页面内容识别场景
106
48
  */
107
- matchExactRules(userInput, url) {
108
- const normalizedInput = userInput.toLowerCase();
109
- const normalizedUrl = url.toLowerCase();
110
- for (const rule of EXACT_SCENARIO_RULES) {
111
- // 关键词匹配
112
- for (const keyword of rule.keywords) {
113
- if (normalizedInput.includes(keyword.toLowerCase())) {
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 null;
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
- matchHistory(userInput) {
150
- const stats = this.cacheStore.getStats();
151
- // 如果命中率太低,不做历史匹配
152
- if (stats.hitRate < 30) {
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
- // 计算 Jaccard 相似度
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 null;
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
- addRule(rule) {
193
- EXACT_SCENARIO_RULES.push(rule);
77
+ addCustomRule(pattern, scenario) {
78
+ SCENARIO_PATTERNS.unshift({ pattern, scenario });
194
79
  }
195
80
  /**
196
- * 获取建议的缓存层级
81
+ * 添加内容关键词
197
82
  */
198
- getRecommendedCacheLevel(scenario) {
199
- const rule = EXACT_SCENARIO_RULES.find((r) => r.scenario === scenario);
200
- return rule?.cacheLevel || "L1";
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":"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"}
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 Extension - Type Definitions
3
- * Version: 1.0.0
4
- *
5
- * 完全对齐 Playwright API 的类型定义
2
+ * Page Action Cache Types
3
+ * 页面操作缓存类型定义
6
4
  */
7
5
  /**
8
- * 页面视口尺寸
6
+ * 缓存操作类型
9
7
  */
10
- export interface PageViewport {
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
- * Evaluate 操作(scroll, wait, select, focus, drag, upload)
10
+ * 场景类型
111
11
  */
112
- export type EvaluateActionType = "scroll" | "wait" | "select" | "focus" | "drag" | "upload";
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 type PageType = "static" | "dynamic" | "mixed";
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: PageViewport;
177
- cacheLevel: CacheLevel;
178
- scenario: string;
179
- description: string;
180
- variables?: VariableMap;
181
- urlPattern?: string;
182
- actions: AtomicAction[];
183
- screenshotPath?: string;
184
- createdAt: number;
185
- lastAccessTime: number;
186
- accessCount: number;
187
- expiresAt: number;
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
- totalHits: number;
224
- totalMisses: number;
37
+ totalActions: number;
225
38
  hitRate: number;
226
- l3Hits: number;
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 CacheConfig {
45
+ export interface PageActionCacheConfig {
252
46
  enabled: boolean;
253
- autoUseCache: boolean;
254
- scenarioRecognitionEnabled: boolean;
255
- llmClassificationThreshold: number;
256
- cacheLevelStrategy: "auto" | "l3-only" | "l2-only" | "l1-only";
257
- defaultCacheLevel: string;
258
- pageChangeDetectionEnabled: boolean;
259
- changeInvalidationThreshold: number;
260
- invalidationStrategy: "soft" | "hard";
261
- maxVersionsPerEntry: number;
262
- variableExtractionEnabled: boolean;
263
- allowUserConfirmVariables: boolean;
264
- encryptSensitiveCache: boolean;
265
- accessControlEnabled: boolean;
266
- allowedUserIds: string[];
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