page-action-cache 1.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 (73) hide show
  1. package/dist/actions-executor.d.ts +62 -0
  2. package/dist/actions-executor.d.ts.map +1 -0
  3. package/dist/actions-executor.js +339 -0
  4. package/dist/actions-executor.js.map +1 -0
  5. package/dist/cache-invalidator.d.ts +70 -0
  6. package/dist/cache-invalidator.d.ts.map +1 -0
  7. package/dist/cache-invalidator.js +212 -0
  8. package/dist/cache-invalidator.js.map +1 -0
  9. package/dist/cache-store.d.ts +80 -0
  10. package/dist/cache-store.d.ts.map +1 -0
  11. package/dist/cache-store.js +361 -0
  12. package/dist/cache-store.js.map +1 -0
  13. package/dist/cache-strategy.d.ts +65 -0
  14. package/dist/cache-strategy.d.ts.map +1 -0
  15. package/dist/cache-strategy.js +237 -0
  16. package/dist/cache-strategy.js.map +1 -0
  17. package/dist/hooks-entry.d.ts +18 -0
  18. package/dist/hooks-entry.d.ts.map +1 -0
  19. package/dist/hooks-entry.js +27 -0
  20. package/dist/hooks-entry.js.map +1 -0
  21. package/dist/hooks.d.ts +10 -0
  22. package/dist/hooks.d.ts.map +1 -0
  23. package/dist/hooks.js +277 -0
  24. package/dist/hooks.js.map +1 -0
  25. package/dist/index.d.ts +24 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +34 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/scenario-recognizer.d.ts +45 -0
  30. package/dist/scenario-recognizer.d.ts.map +1 -0
  31. package/dist/scenario-recognizer.js +213 -0
  32. package/dist/scenario-recognizer.js.map +1 -0
  33. package/dist/security-policy.d.ts +62 -0
  34. package/dist/security-policy.d.ts.map +1 -0
  35. package/dist/security-policy.js +219 -0
  36. package/dist/security-policy.js.map +1 -0
  37. package/dist/tools.d.ts +209 -0
  38. package/dist/tools.d.ts.map +1 -0
  39. package/dist/tools.js +383 -0
  40. package/dist/tools.js.map +1 -0
  41. package/dist/types.d.ts +336 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +8 -0
  44. package/dist/types.js.map +1 -0
  45. package/dist/ux-enhancer.d.ts +60 -0
  46. package/dist/ux-enhancer.d.ts.map +1 -0
  47. package/dist/ux-enhancer.js +218 -0
  48. package/dist/ux-enhancer.js.map +1 -0
  49. package/dist/variable-resolver.d.ts +28 -0
  50. package/dist/variable-resolver.d.ts.map +1 -0
  51. package/dist/variable-resolver.js +201 -0
  52. package/dist/variable-resolver.js.map +1 -0
  53. package/docs/API.md +555 -0
  54. package/docs/IMPLEMENTATION.md +1792 -0
  55. package/docs/INTEGRATION.md +387 -0
  56. package/docs/README.md +183 -0
  57. package/index.ts +118 -0
  58. package/openclaw.plugin.json +208 -0
  59. package/package.json +76 -0
  60. package/skills/page-action-cache/SKILL.md +216 -0
  61. package/src/actions-executor.ts +441 -0
  62. package/src/cache-invalidator.ts +271 -0
  63. package/src/cache-store.ts +457 -0
  64. package/src/cache-strategy.ts +327 -0
  65. package/src/hooks-entry.ts +114 -0
  66. package/src/hooks.ts +332 -0
  67. package/src/index.ts +104 -0
  68. package/src/scenario-recognizer.ts +259 -0
  69. package/src/security-policy.ts +268 -0
  70. package/src/tools.ts +437 -0
  71. package/src/types.ts +482 -0
  72. package/src/ux-enhancer.ts +266 -0
  73. package/src/variable-resolver.ts +258 -0
package/docs/API.md ADDED
@@ -0,0 +1,555 @@
1
+ # Page Action Cache API Reference
2
+
3
+ 完整的 API 参考文档。
4
+
5
+ ## 目录
6
+
7
+ - [缓存存储 API](#缓存存储-api-cachestore)
8
+ - [场景识别 API](#场景识别-api-scenariorecognizer)
9
+ - [变量解析 API](#变量解析-api-variableresolver)
10
+ - [操作执行 API](#操作执行-api-actionsexecutor)
11
+ - [安全策略 API](#安全策略-api-securitypolicy)
12
+ - [缓存失效 API](#缓存失效-api-cacheinvalidator)
13
+ - [用户体验 API](#用户体验-api-uxenhancer)
14
+ - [Hooks API](#hooks-api-hooks)
15
+ - [缓存策略 API](#缓存策略-api-cachestrategy)
16
+
17
+ ---
18
+
19
+ ## 缓存存储 API (CacheStore)
20
+
21
+ ### 初始化
22
+
23
+ ```typescript
24
+ import { getCacheStore } from "@openclaw/page-action-cache";
25
+
26
+ const cacheStore = getCacheStore();
27
+ ```
28
+
29
+ ### 主要方法
30
+
31
+ #### `set(url, viewport, actions, metadata): string`
32
+
33
+ 保存缓存条目。
34
+
35
+ ```typescript
36
+ const key = cacheStore.set(
37
+ "https://example.com/login",
38
+ { width: 1920, height: 1080 },
39
+ [
40
+ { type: "click", ref: "#username", order: 1 },
41
+ { type: "type", ref: "#password", text: "...", order: 2 },
42
+ { type: "click", ref: "#submit", order: 3 }
43
+ ],
44
+ {
45
+ scenario: "login",
46
+ cacheLevel: "L3",
47
+ description: "登录操作",
48
+ variables: { username: "user" }
49
+ }
50
+ );
51
+ ```
52
+
53
+ **参数:**
54
+ - `url: string` - 页面 URL
55
+ - `viewport: PageViewport` - 视口尺寸
56
+ - `actions: AtomicAction[]` - 操作序列
57
+ - `metadata: CacheEntryMetadata` - 元数据
58
+
59
+ **返回值:** 缓存键 (MD5 hash)
60
+
61
+ ---
62
+
63
+ #### `get(url, viewport): PageActionCacheEntry | null`
64
+
65
+ 获取缓存条目。
66
+
67
+ ```typescript
68
+ const entry = cacheStore.get(
69
+ "https://example.com/login",
70
+ { width: 1920, height: 1080 }
71
+ );
72
+ ```
73
+
74
+ **返回值:** 缓存条目,如果不存在则返回 `null`
75
+
76
+ ---
77
+
78
+ #### `listEntries(): PageActionCacheEntry[]`
79
+
80
+ 列出所有缓存条目。
81
+
82
+ ```typescript
83
+ const entries = cacheStore.listEntries();
84
+ ```
85
+
86
+ ---
87
+
88
+ #### `delete(url, viewport): boolean`
89
+
90
+ 删除缓存条目。
91
+
92
+ ```typescript
93
+ const deleted = cacheStore.delete(
94
+ "https://example.com/login",
95
+ { width: 1920, height: 1080 }
96
+ );
97
+ console.log(`删除: ${deleted}`);
98
+ ```
99
+
100
+ ---
101
+
102
+ #### `clear(): void`
103
+
104
+ 清空所有缓存。
105
+
106
+ ```typescript
107
+ cacheStore.clear();
108
+ ```
109
+
110
+ ---
111
+
112
+ #### `getStats(): CacheStats`
113
+
114
+ 获取缓存统计信息。
115
+
116
+ ```typescript
117
+ const stats = cacheStore.getStats();
118
+ console.log(`命中率: ${stats.hitRate}%`);
119
+ console.log(`节省 tokens: ${stats.savedTokens}`);
120
+ console.log(`节省时间: ${stats.savedTime}ms`);
121
+ ```
122
+
123
+ **统计字段:**
124
+ - `totalEntries` - 总条目数
125
+ - `totalHits` - 总命中数
126
+ - `totalMisses` - 总未命中数
127
+ - `hitRate` - 命中率 (0-100)
128
+ - `l3Hits` - L3 缓存命中数
129
+ - `l2Hits` - L2 缓存命中数
130
+ - `l1Hits` - L1 缓存命中数
131
+ - `scenarioMatches` - 场景识别匹配数
132
+ - `savedTokens` - 节省的 tokens 数量
133
+ - `savedTime` - 节省的时间(毫秒)
134
+
135
+ ---
136
+
137
+ ## 场景识别 API (ScenarioRecognizer)
138
+
139
+ ### 初始化
140
+
141
+ ```typescript
142
+ import { getScenarioRecognizer } from "@openclaw/page-action-cache";
143
+
144
+ const recognizer = getScenarioRecognizer();
145
+ ```
146
+
147
+ ### 主要方法
148
+
149
+ #### `recognize(userInput, currentUrl): Promise<ScenarioMatch | null>`
150
+
151
+ 识别用户场景。
152
+
153
+ ```typescript
154
+ const match = await recognizer.recognize(
155
+ "请帮我登录",
156
+ "https://example.com/page"
157
+ );
158
+
159
+ if (match) {
160
+ console.log(`场景: ${match.scenario}`);
161
+ console.log(`置信度: ${match.confidence}`);
162
+ console.log(`方法: ${match.method}`);
163
+ }
164
+ ```
165
+
166
+ **返回值:** 场景匹配结果,包含:
167
+ - `scenario` - 场景名称
168
+ - `confidence` - 置信度 (0-100)
169
+ - `method` - 匹配方法
170
+ - `matchedPattern` - 匹配的模式
171
+
172
+ ---
173
+
174
+ ## 变量解析 API (VariableResolver)
175
+
176
+ ### 初始化
177
+
178
+ ```typescript
179
+ import { getVariableResolver } from "@openclaw/page-action-cache";
180
+
181
+ const resolver = getVariableResolver();
182
+ ```
183
+
184
+ ### 主要方法
185
+
186
+ #### `resolveVariables(userInput, scenario): VariableMap`
187
+
188
+ 从用户输入解析变量。
189
+
190
+ ```typescript
191
+ const variables = resolver.resolveVariables(
192
+ "用户名是 admin,密码是 secret123",
193
+ "login"
194
+ );
195
+
196
+ console.log(variables);
197
+ // { username: "admin", password: "secret123" }
198
+ ```
199
+
200
+ ---
201
+
202
+ #### `validateVariables(variables, scenario): boolean`
203
+
204
+ 验证变量是否有效。
205
+
206
+ ```typescript
207
+ const isValid = resolver.validateVariables(variables, "login");
208
+ ```
209
+
210
+ ---
211
+
212
+ #### `mergeVariables(base, override): VariableMap`
213
+
214
+ 合并变量映射。
215
+
216
+ ```typescript
217
+ const merged = resolver.mergeVariables(baseVariables, overrideVariables);
218
+ ```
219
+
220
+ ---
221
+
222
+ ## 操作执行 API (ActionsExecutor)
223
+
224
+ ### 初始化
225
+
226
+ ```typescript
227
+ import { getActionsExecutor } from "@openclaw/page-action-cache";
228
+
229
+ const executor = getActionsExecutor(cdpUrl);
230
+ executor.setPlaywrightClient(pwClient);
231
+ ```
232
+
233
+ ### 主要方法
234
+
235
+ #### `execute(action, variables?): Promise<ExecutionResult>`
236
+
237
+ 执行单个操作。
238
+
239
+ ```typescript
240
+ const result = await executor.execute(action, {
241
+ username: "...",
242
+ password: "..."
243
+ });
244
+ ```
245
+
246
+ ---
247
+
248
+ #### `executeBatch(actions, variables?, options?): Promise<ExecutionResult[]>`
249
+
250
+ 批量执行操作。
251
+
252
+ ```typescript
253
+ const results = await executor.executeBatch(actions, variables, {
254
+ fromIndex: 0,
255
+ toIndex: 2,
256
+ atomic: true // 全部成功或全部失败
257
+ });
258
+ ```
259
+
260
+ ---
261
+
262
+ #### `formatActions(actions): string`
263
+
264
+ 格式化操作列表为可读字符串。
265
+
266
+ ```typescript
267
+ const text = executor.formatActions(actions);
268
+ console.log(text);
269
+ ```
270
+
271
+ ---
272
+
273
+ #### `formatExecutionResults(results): string`
274
+
275
+ 格式化执行结果。
276
+
277
+ ```typescript
278
+ const text = executor.formatExecutionResults(results);
279
+ console.log(text);
280
+ ```
281
+
282
+ ---
283
+
284
+ ## 安全策略 API (SecurityPolicy)
285
+
286
+ ### 初始化
287
+
288
+ ```typescript
289
+ import { getSecurityPolicy } from "@openclaw/page-action-cache";
290
+
291
+ const policy = getSecurityPolicy();
292
+ ```
293
+
294
+ ### 主要方法
295
+
296
+ #### `isSensitiveAction(action): boolean`
297
+
298
+ 检查操作是否包含敏感变量。
299
+
300
+ ```typescript
301
+ const isSensitive = policy.isSensitiveAction({
302
+ type: "type",
303
+ ref: "#password",
304
+ variable: "password",
305
+ text: "..."
306
+ });
307
+ // true - 密码字段,应该加密
308
+ ```
309
+
310
+ ---
311
+
312
+ #### `encrypt(data): string`
313
+
314
+ 加密数据。
315
+
316
+ ```typescript
317
+ const encrypted = policy.encrypt("sensitive-data");
318
+ ```
319
+
320
+ ---
321
+
322
+ #### `decrypt(encrypted): string`
323
+
324
+ 解密数据。
325
+
326
+ ```typescript
327
+ const decrypted = policy.decrypt(encrypted);
328
+ ```
329
+
330
+ ---
331
+
332
+ #### `sanitizeForLogging(data): any`
333
+
334
+ 脱敏数据用于日志输出。
335
+
336
+ ```typescript
337
+ const sanitized = policy.sanitizeForLogging({
338
+ username: "...",
339
+ password: "..."
340
+ });
341
+ // { username: "...", password: "***REDACTED***" }
342
+ ```
343
+
344
+ ---
345
+
346
+ ## 缓存失效 API (CacheInvalidator)
347
+
348
+ ### 初始化
349
+
350
+ ```typescript
351
+ import { getCacheInvalidator } from "@openclaw/page-action-cache";
352
+
353
+ const invalidator = getCacheInvalidator();
354
+ ```
355
+
356
+ ### 主要方法
357
+
358
+ #### `detectPageChange(html, url, viewport, cachedEntry?): Promise<PageChangeDetection>`
359
+
360
+ 检测页面是否发生变化。
361
+
362
+ ```typescript
363
+ const detection = await invalidator.detectPageChange(
364
+ html,
365
+ url,
366
+ viewport,
367
+ cachedEntry
368
+ );
369
+
370
+ if (detection.hasChanged) {
371
+ console.log(`页面已变化: ${detection.changeType}`);
372
+ console.log(`置信度: ${detection.confidence}`);
373
+ }
374
+ ```
375
+
376
+ ---
377
+
378
+ ## 用户体验 API (UXEnhancer)
379
+
380
+ ### 初始化
381
+
382
+ ```typescript
383
+ import { getUXEnhancer } from "@openclaw/page-action-cache";
384
+
385
+ const enhancer = getUXEnhancer();
386
+ ```
387
+
388
+ ### 主要方法
389
+
390
+ #### `generateStatsReport(): string`
391
+
392
+ 生成统计报告。
393
+
394
+ ```typescript
395
+ const report = enhancer.generateStatsReport();
396
+ console.log(report);
397
+ ```
398
+
399
+ ---
400
+
401
+ #### `formatCacheEntry(entry): string`
402
+
403
+ 格式化缓存条目。
404
+
405
+ ```typescript
406
+ const text = enhancer.formatCacheEntry(entry);
407
+ ```
408
+
409
+ ---
410
+
411
+ ## Hooks API (Hooks)
412
+
413
+ ### 初始化
414
+
415
+ ```typescript
416
+ import { registerPageActionCacheHooks } from "@openclaw/page-action-cache";
417
+
418
+ // 注册 hooks
419
+ registerPageActionCacheHooks(api, config);
420
+ ```
421
+
422
+ ### 注册的 Hooks
423
+
424
+ #### `before_tool_call`
425
+
426
+ - **触发时机:** 在任何工具调用之前
427
+ - **用途:** 场景识别和缓存拦截
428
+ - **返回值:** `{ block: false, result?: { cacheInfo, stats } }`
429
+
430
+ **示例响应:**
431
+
432
+ ```typescript
433
+ {
434
+ block: false,
435
+ result: {
436
+ cacheInfo: {
437
+ exists: true,
438
+ scenario: "login",
439
+ confidence: 90,
440
+ method: "keyword",
441
+ cacheLevel: "L3",
442
+ actions: [...],
443
+ cacheKey: "abc123..."
444
+ },
445
+ stats: {
446
+ hitRate: 75.5,
447
+ savedTokens: 15000
448
+ }
449
+ }
450
+ }
451
+ ```
452
+
453
+ ---
454
+
455
+ #### `after_tool_call`
456
+
457
+ - **触发时机:** 在工具调用完成之后
458
+ - **用途:** 保存 LLM 分析结果到缓存
459
+ - **返回值:** 无返回值
460
+
461
+ **功能:**
462
+ - 提取 LLM 返回的场景类型
463
+ - 解析用户输入中的变量
464
+ - 根据场景匹配决定缓存层级
465
+ - 保存到缓存存储
466
+
467
+ ---
468
+
469
+ #### `before_prompt_build`
470
+
471
+ - **触发时机:** 在构建提示之前
472
+ - **用途:** 注入缓存使用指南
473
+ - **返回值:** `{ prependContext?: string }`
474
+
475
+ **示例响应:**
476
+
477
+ ```typescript
478
+ {
479
+ prependContext: `
480
+ 【页面操作缓存系统】
481
+
482
+ 当前缓存统计:
483
+ - 总条目数:42
484
+ - 总命中:28
485
+ - 命中率:66.7%
486
+
487
+ 已缓存的场景:
488
+ 1. login (命中率: 85%)
489
+ 2. search (命中率: 72%)
490
+ 3. checkout (命中率: 68%)
491
+
492
+ 使用方式:
493
+ 1. 如果工具返回 cacheInfo 信息,优先使用缓存的操作
494
+ 2. 执行缓存操作可以大幅降低 token 消耗和操作延迟
495
+ `
496
+ }
497
+ ```
498
+
499
+ ---
500
+
501
+ ## 缓存策略 API (CacheStrategy)
502
+
503
+ ### 策略类型
504
+
505
+ #### `AutoCacheStrategy`
506
+
507
+ 自动选择缓存层级。
508
+
509
+ ```typescript
510
+ import { AutoCacheStrategy } from "@openclaw/page-action-cache";
511
+
512
+ const strategy = new AutoCacheStrategy();
513
+ ```
514
+
515
+ ---
516
+
517
+ #### `L3OnlyCacheStrategy`
518
+
519
+ 仅使用 L3 缓存。
520
+
521
+ ```typescript
522
+ import { L3OnlyCacheStrategy } from "@openclaw/page-action-cache";
523
+
524
+ const strategy = new L3OnlyCacheStrategy();
525
+ ```
526
+
527
+ ---
528
+
529
+ #### `L2OnlyCacheStrategy`
530
+
531
+ 仅使用 L2 和 L3 缓存。
532
+
533
+ ```typescript
534
+ import { L2OnlyCacheStrategy } from "@openclaw/page-action-cache";
535
+
536
+ const strategy = new L2OnlyCacheStrategy();
537
+ ```
538
+
539
+ ---
540
+
541
+ #### `L1OnlyCacheStrategy`
542
+
543
+ 仅使用 L1、L2 和 L3 缓存。
544
+
545
+ ```typescript
546
+ import { L1OnlyCacheStrategy } from "@openclaw/page-action-cache";
547
+
548
+ const strategy = new L1OnlyCacheStrategy();
549
+ ```
550
+
551
+ ---
552
+
553
+ ## 类型定义
554
+
555
+ 所有 API 都使用统一的类型定义。详见 [类型定义](../src/types.ts)。