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
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Cache Strategy
3
+ * 缓存策略 - 缓存层级策略和匹配策略
4
+ */
5
+ import type { CacheLevel, ScenarioMatch, PageActionCacheEntry } from "./types.js";
6
+ /**
7
+ * 缓存策略接口
8
+ */
9
+ export interface CacheStrategy {
10
+ /**
11
+ * 决定缓存层级
12
+ */
13
+ decideCacheLevel(match: ScenarioMatch | null): CacheLevel;
14
+ /**
15
+ * 判断是否应该使用缓存
16
+ */
17
+ shouldUseCache(entry: PageActionCacheEntry, match: ScenarioMatch | null): boolean;
18
+ /**
19
+ * 计算缓存得分
20
+ */
21
+ calculateScore(entry: PageActionCacheEntry): number;
22
+ }
23
+ /**
24
+ * 自动缓存策略
25
+ */
26
+ export declare class AutoCacheStrategy implements CacheStrategy {
27
+ decideCacheLevel(match: ScenarioMatch | null): CacheLevel;
28
+ shouldUseCache(entry: PageActionCacheEntry, match: ScenarioMatch | null): boolean;
29
+ calculateScore(entry: PageActionCacheEntry): number;
30
+ }
31
+ /**
32
+ * L3 优先策略
33
+ */
34
+ export declare class L3OnlyCacheStrategy implements CacheStrategy {
35
+ decideCacheLevel(_match: ScenarioMatch | null): CacheLevel;
36
+ shouldUseCache(entry: PageActionCacheEntry, match: ScenarioMatch | null): boolean;
37
+ calculateScore(entry: PageActionCacheEntry): number;
38
+ }
39
+ /**
40
+ * L2 优先策略
41
+ */
42
+ export declare class L2OnlyCacheStrategy implements CacheStrategy {
43
+ decideCacheLevel(match: ScenarioMatch | null): CacheLevel;
44
+ shouldUseCache(entry: PageActionCacheEntry, _match: ScenarioMatch | null): boolean;
45
+ calculateScore(entry: PageActionCacheEntry): number;
46
+ }
47
+ /**
48
+ * L1 优先策略
49
+ */
50
+ export declare class L1OnlyCacheStrategy implements CacheStrategy {
51
+ decideCacheLevel(_match: ScenarioMatch | null): CacheLevel;
52
+ shouldUseCache(entry: PageActionCacheEntry, _match: ScenarioMatch | null): boolean;
53
+ calculateScore(entry: PageActionCacheEntry): number;
54
+ }
55
+ /**
56
+ * 缓存策略工厂
57
+ */
58
+ export declare class CacheStrategyFactory {
59
+ /**
60
+ * 创建缓存策略
61
+ */
62
+ createStrategy(strategy: "auto" | "l3-only" | "l2-only" | "l1-only"): CacheStrategy;
63
+ }
64
+ export declare function getCacheStrategyFactory(): CacheStrategyFactory;
65
+ //# sourceMappingURL=cache-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-strategy.d.ts","sourceRoot":"","sources":["../src/cache-strategy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAMlF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,UAAU,CAAC;IAE1D;;OAEG;IACH,cAAc,CACZ,KAAK,EAAE,oBAAoB,EAC3B,KAAK,EAAE,aAAa,GAAG,IAAI,GAC1B,OAAO,CAAC;IAEX;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAAC;CACrD;AAMD;;GAEG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACrD,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,UAAU;IAezD,cAAc,CACZ,KAAK,EAAE,oBAAoB,EAC3B,KAAK,EAAE,aAAa,GAAG,IAAI,GAC1B,OAAO;IAmCV,cAAc,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM;CAiCpD;AAMD;;GAEG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,UAAU;IAI1D,cAAc,CACZ,KAAK,EAAE,oBAAoB,EAC3B,KAAK,EAAE,aAAa,GAAG,IAAI,GAC1B,OAAO;IAmBV,cAAc,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM;CAmBpD;AAMD;;GAEG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,UAAU;IAOzD,cAAc,CACZ,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,aAAa,GAAG,IAAI,GAC3B,OAAO;IAcV,cAAc,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM;CAmBpD;AAMD;;GAEG;AACH,qBAAa,mBAAoB,YAAW,aAAa;IACvD,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,UAAU;IAI1D,cAAc,CACZ,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,aAAa,GAAG,IAAI,GAC3B,OAAO;IAcV,cAAc,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM;CAmBpD;AAMD;;GAEG;AACH,qBAAa,oBAAoB;IAC/B;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa;CAcpF;AAQD,wBAAgB,uBAAuB,IAAI,oBAAoB,CAK9D"}
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Cache Strategy
3
+ * 缓存策略 - 缓存层级策略和匹配策略
4
+ */
5
+ // ============================================================================
6
+ // 自动策略
7
+ // ============================================================================
8
+ /**
9
+ * 自动缓存策略
10
+ */
11
+ export class AutoCacheStrategy {
12
+ decideCacheLevel(match) {
13
+ if (!match) {
14
+ return "L1"; // 无匹配,使用 L1
15
+ }
16
+ // 根据置信度决定层级
17
+ if (match.confidence >= 85) {
18
+ return "L3"; // 高置信度,场景级
19
+ }
20
+ else if (match.confidence >= 70) {
21
+ return "L2"; // 中等置信度,流程级
22
+ }
23
+ else {
24
+ return "L1"; // 低置信度,原子级
25
+ }
26
+ }
27
+ shouldUseCache(entry, match) {
28
+ // 检查过期
29
+ if (Date.now() > entry.expiresAt) {
30
+ return false;
31
+ }
32
+ // 检查成功率
33
+ const total = entry.successCount + entry.failCount;
34
+ if (total > 5 && entry.successCount / total < 0.6) {
35
+ return false; // 成功率太低
36
+ }
37
+ // 检查访问次数
38
+ if (entry.accessCount === 0) {
39
+ return true; // 新缓存,可以使用
40
+ }
41
+ // L3 缓存直接使用
42
+ if (entry.cacheLevel === "L3") {
43
+ return true;
44
+ }
45
+ // L2 缓存需要匹配
46
+ if (entry.cacheLevel === "L2" && match && match.confidence >= 70) {
47
+ return true;
48
+ }
49
+ // L1 缓存谨慎使用
50
+ if (entry.cacheLevel === "L1" && match && match.confidence >= 50) {
51
+ return true;
52
+ }
53
+ return false;
54
+ }
55
+ calculateScore(entry) {
56
+ // 计算缓存得分(0-100)
57
+ let score = 0;
58
+ // 层级权重
59
+ switch (entry.cacheLevel) {
60
+ case "L3":
61
+ score += 40;
62
+ break;
63
+ case "L2":
64
+ score += 25;
65
+ break;
66
+ case "L1":
67
+ score += 10;
68
+ break;
69
+ }
70
+ // 访问次数权重
71
+ score += Math.min(entry.accessCount * 2, 20);
72
+ // 成功率权重
73
+ const total = entry.successCount + entry.failCount;
74
+ if (total > 0) {
75
+ score += (entry.successCount / total) * 30;
76
+ }
77
+ // 平均执行时间权重(越快越好)
78
+ if (entry.avgExecutionTime > 0) {
79
+ score += Math.max(0, 10 - entry.avgExecutionTime / 100);
80
+ }
81
+ return Math.min(score, 100);
82
+ }
83
+ }
84
+ // ============================================================================
85
+ // L3 优先策略
86
+ // ============================================================================
87
+ /**
88
+ * L3 优先策略
89
+ */
90
+ export class L3OnlyCacheStrategy {
91
+ decideCacheLevel(_match) {
92
+ return "L3";
93
+ }
94
+ shouldUseCache(entry, match) {
95
+ // 只使用 L3 缓存
96
+ if (entry.cacheLevel !== "L3") {
97
+ return false;
98
+ }
99
+ // 检查过期
100
+ if (Date.now() > entry.expiresAt) {
101
+ return false;
102
+ }
103
+ // 检查匹配
104
+ if (!match || match.confidence < 85) {
105
+ return false;
106
+ }
107
+ return true;
108
+ }
109
+ calculateScore(entry) {
110
+ // L3 缓存才有得分
111
+ if (entry.cacheLevel !== "L3") {
112
+ return 0;
113
+ }
114
+ let score = 50; // 基础分
115
+ // 访问次数
116
+ score += Math.min(entry.accessCount * 3, 30);
117
+ // 成功率
118
+ const total = entry.successCount + entry.failCount;
119
+ if (total > 0) {
120
+ score += (entry.successCount / total) * 20;
121
+ }
122
+ return Math.min(score, 100);
123
+ }
124
+ }
125
+ // ============================================================================
126
+ // L2 优先策略
127
+ // ============================================================================
128
+ /**
129
+ * L2 优先策略
130
+ */
131
+ export class L2OnlyCacheStrategy {
132
+ decideCacheLevel(match) {
133
+ if (match && match.confidence >= 70) {
134
+ return "L2";
135
+ }
136
+ return "L1";
137
+ }
138
+ shouldUseCache(entry, _match) {
139
+ // 使用 L2 或 L1 缓存
140
+ if (entry.cacheLevel === "L3") {
141
+ return false;
142
+ }
143
+ // 检查过期
144
+ if (Date.now() > entry.expiresAt) {
145
+ return false;
146
+ }
147
+ return true;
148
+ }
149
+ calculateScore(entry) {
150
+ // L2 和 L1 缓存才有得分
151
+ if (entry.cacheLevel === "L3") {
152
+ return 0;
153
+ }
154
+ let score = entry.cacheLevel === "L2" ? 40 : 20;
155
+ // 访问次数
156
+ score += Math.min(entry.accessCount * 2, 25);
157
+ // 成功率
158
+ const total = entry.successCount + entry.failCount;
159
+ if (total > 0) {
160
+ score += (entry.successCount / total) * 35;
161
+ }
162
+ return Math.min(score, 100);
163
+ }
164
+ }
165
+ // ============================================================================
166
+ // L1 优先策略
167
+ // ============================================================================
168
+ /**
169
+ * L1 优先策略
170
+ */
171
+ export class L1OnlyCacheStrategy {
172
+ decideCacheLevel(_match) {
173
+ return "L1";
174
+ }
175
+ shouldUseCache(entry, _match) {
176
+ // 只使用 L1 缓存
177
+ if (entry.cacheLevel !== "L1") {
178
+ return false;
179
+ }
180
+ // 检查过期
181
+ if (Date.now() > entry.expiresAt) {
182
+ return false;
183
+ }
184
+ return true;
185
+ }
186
+ calculateScore(entry) {
187
+ // L1 缓存才有得分
188
+ if (entry.cacheLevel !== "L1") {
189
+ return 0;
190
+ }
191
+ let score = 20; // 基础分
192
+ // 访问次数
193
+ score += Math.min(entry.accessCount * 2, 40);
194
+ // 成功率
195
+ const total = entry.successCount + entry.failCount;
196
+ if (total > 0) {
197
+ score += (entry.successCount / total) * 40;
198
+ }
199
+ return Math.min(score, 100);
200
+ }
201
+ }
202
+ // ============================================================================
203
+ // 策略工厂
204
+ // ============================================================================
205
+ /**
206
+ * 缓存策略工厂
207
+ */
208
+ export class CacheStrategyFactory {
209
+ /**
210
+ * 创建缓存策略
211
+ */
212
+ createStrategy(strategy) {
213
+ switch (strategy) {
214
+ case "auto":
215
+ return new AutoCacheStrategy();
216
+ case "l3-only":
217
+ return new L3OnlyCacheStrategy();
218
+ case "l2-only":
219
+ return new L2OnlyCacheStrategy();
220
+ case "l1-only":
221
+ return new L1OnlyCacheStrategy();
222
+ default:
223
+ return new AutoCacheStrategy();
224
+ }
225
+ }
226
+ }
227
+ // ============================================================================
228
+ // 单例
229
+ // ============================================================================
230
+ let strategyFactoryInstance = null;
231
+ export function getCacheStrategyFactory() {
232
+ if (!strategyFactoryInstance) {
233
+ strategyFactoryInstance = new CacheStrategyFactory();
234
+ }
235
+ return strategyFactoryInstance;
236
+ }
237
+ //# sourceMappingURL=cache-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-strategy.js","sourceRoot":"","sources":["../src/cache-strategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Page Action Cache Extension - Entry Point
3
+ * 页面操作缓存扩展 - 入口点
4
+ */
5
+ /**
6
+ * 扩展入口点 - 在 OpenClaw 启动时调用
7
+ */
8
+ export declare function initializePageActionCache(api: any, config?: any): void;
9
+ /**
10
+ * 扩展元数据
11
+ */
12
+ export declare const pageActionCacheMeta: {
13
+ id: string;
14
+ name: string;
15
+ version: string;
16
+ description: string;
17
+ };
18
+ //# sourceMappingURL=hooks-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-entry.d.ts","sourceRoot":"","sources":["../src/hooks-entry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,IAAI,CAOtE;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;CAK/B,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Page Action Cache Extension - Entry Point
3
+ * 页面操作缓存扩展 - 入口点
4
+ */
5
+ import { registerPageActionCacheHooks } from "./hooks.js";
6
+ /**
7
+ * 扩展入口点 - 在 OpenClaw 启动时调用
8
+ */
9
+ export function initializePageActionCache(api, config) {
10
+ try {
11
+ registerPageActionCacheHooks(api, config);
12
+ console.log("[PageActionCache] Extension initialized successfully");
13
+ }
14
+ catch (error) {
15
+ console.error("[PageActionCache] Failed to initialize extension:", error);
16
+ }
17
+ }
18
+ /**
19
+ * 扩展元数据
20
+ */
21
+ export const pageActionCacheMeta = {
22
+ id: "page-action-cache",
23
+ name: "Page Action Cache",
24
+ version: "1.0.0",
25
+ description: "浏览器操作缓存扩展 - 缓存常用页面操作序列以降低 token 消耗和操作延迟",
26
+ };
27
+ //# sourceMappingURL=hooks-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-entry.js","sourceRoot":"","sources":["../src/hooks-entry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAE1D;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAQ,EAAE,MAAY;IAC9D,IAAI,CAAC;QACH,4BAA4B,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mDAAmD,EAAE,KAAK,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,EAAE,EAAE,mBAAmB;IACvB,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,yCAAyC;CACvD,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Hooks Integration
3
+ * Hooks 集成 - 注册 OpenClaw Hooks 来拦截和增强浏览器操作
4
+ */
5
+ import type { CacheConfig } from "./types.js";
6
+ /**
7
+ * 注册页面操作缓存扩展的 Hooks
8
+ */
9
+ export declare function registerPageActionCacheHooks(api: any, config?: Partial<CacheConfig>): void;
10
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAC;AAqD5D;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAuO1F"}
package/dist/hooks.js ADDED
@@ -0,0 +1,277 @@
1
+ /**
2
+ * Hooks Integration
3
+ * Hooks 集成 - 注册 OpenClaw Hooks 来拦截和增强浏览器操作
4
+ */
5
+ import { getCacheStore } from "./cache-store.js";
6
+ import { getScenarioRecognizer } from "./scenario-recognizer.js";
7
+ import { getVariableResolver } from "./variable-resolver.js";
8
+ // ============================================================================
9
+ // 默认配置
10
+ // ============================================================================
11
+ const DEFAULT_CONFIG = {
12
+ // === 全局开关 ===
13
+ enabled: true,
14
+ autoUseCache: true,
15
+ // === 场景识别 ===
16
+ scenarioRecognitionEnabled: true,
17
+ llmClassificationThreshold: 70,
18
+ // === 缓存策略 ===
19
+ cacheLevelStrategy: "auto",
20
+ defaultCacheLevel: "L3",
21
+ // === 缓存失效 ===
22
+ pageChangeDetectionEnabled: true,
23
+ changeInvalidationThreshold: 80,
24
+ invalidationStrategy: "soft",
25
+ maxVersionsPerEntry: 3,
26
+ // === 变量系统 ===
27
+ variableExtractionEnabled: true,
28
+ allowUserConfirmVariables: false,
29
+ // === 安全 ===
30
+ encryptSensitiveCache: false,
31
+ accessControlEnabled: false,
32
+ allowedUserIds: [],
33
+ logSanitizationEnabled: true,
34
+ // === 用户体验 ===
35
+ showCacheStatusToUser: true,
36
+ enableUserCacheConfirmation: false,
37
+ enableUserForcedRefresh: true,
38
+ enableUserCacheErrorReport: true,
39
+ // === 统计 ===
40
+ trackExecutionStats: true,
41
+ statsUpdateInterval: 60,
42
+ };
43
+ // ============================================================================
44
+ // Hooks 注册
45
+ // ============================================================================
46
+ /**
47
+ * 注册页面操作缓存扩展的 Hooks
48
+ */
49
+ export function registerPageActionCacheHooks(api, config) {
50
+ const finalConfig = { ...DEFAULT_CONFIG, ...config };
51
+ if (!finalConfig.enabled) {
52
+ console.log("[PageActionCache] Extension disabled");
53
+ return;
54
+ }
55
+ const cacheStore = getCacheStore();
56
+ const scenarioRecognizer = getScenarioRecognizer();
57
+ const variableResolver = getVariableResolver();
58
+ // UX enhancer for future use
59
+ // const uxEnhancer = getUXEnhancer();
60
+ // -------------------------------------------------------------------------
61
+ // before_tool_call hook - 场景识别和缓存拦截
62
+ // -------------------------------------------------------------------------
63
+ api.registerHook({
64
+ name: "before_tool_call",
65
+ priority: 100,
66
+ description: "页面操作缓存 - 场景识别和缓存拦截",
67
+ async handler(event, ctx) {
68
+ if (event.tool.name !== "browser") {
69
+ return { block: false };
70
+ }
71
+ const params = event.params;
72
+ const url = params.url;
73
+ const action = params.action;
74
+ // 只缓存特定操作
75
+ const cacheActions = ["navigate", "click", "type", "press", "hover"];
76
+ if (!cacheActions.includes(action)) {
77
+ return { block: false };
78
+ }
79
+ // 提取用户输入
80
+ const userInput = extractUserInput(ctx);
81
+ const currentUrl = url || ctx.currentUrl || "";
82
+ // 场景识别
83
+ if (finalConfig.scenarioRecognitionEnabled) {
84
+ const match = await scenarioRecognizer.recognize(userInput, currentUrl);
85
+ if (match && match.confidence >= 80) {
86
+ // 高置信度匹配,返回 cacheInfo
87
+ return {
88
+ block: false,
89
+ result: {
90
+ cacheInfo: {
91
+ exists: true,
92
+ scenario: match.scenario,
93
+ confidence: match.confidence,
94
+ method: match.method,
95
+ matchedPattern: match.matchedPattern,
96
+ },
97
+ },
98
+ };
99
+ }
100
+ }
101
+ // 检查缓存
102
+ const viewport = extractViewport(ctx, params);
103
+ const entry = cacheStore.get(url, viewport);
104
+ if (entry) {
105
+ const stats = cacheStore.getStats();
106
+ // L3 缓存命中,返回 cacheInfo
107
+ return {
108
+ block: false,
109
+ result: {
110
+ cacheInfo: {
111
+ exists: true,
112
+ cacheLevel: entry.cacheLevel,
113
+ scenario: entry.scenario,
114
+ actions: entry.actions,
115
+ variables: entry.variables,
116
+ cacheKey: entry.key,
117
+ },
118
+ stats: {
119
+ hitRate: stats.hitRate,
120
+ savedTokens: stats.savedTokens,
121
+ },
122
+ },
123
+ };
124
+ }
125
+ return { block: false };
126
+ },
127
+ });
128
+ // -------------------------------------------------------------------------
129
+ // after_tool_call hook - 保存 LLM 分析结果到缓存
130
+ // -------------------------------------------------------------------------
131
+ api.registerHook({
132
+ name: "after_tool_call",
133
+ priority: 100,
134
+ description: "页面操作缓存 - 保存 LLM 分析结果",
135
+ async handler(event, ctx) {
136
+ if (event.tool.name !== "browser") {
137
+ return;
138
+ }
139
+ const params = event.params;
140
+ const url = params.url;
141
+ const action = params.action;
142
+ // 只缓存特定操作
143
+ const cacheActions = ["navigate", "click", "type", "press", "hover"];
144
+ if (!cacheActions.includes(action)) {
145
+ return;
146
+ }
147
+ // 检查 LLM 是否返回了场景类型
148
+ const result = event.result;
149
+ const llmScenario = result.scenario;
150
+ if (!llmScenario) {
151
+ // 没有 LLM 标记的场景,不保存
152
+ return;
153
+ }
154
+ // 识别场景并获取变量
155
+ const userInput = extractUserInput(ctx);
156
+ const scenarioMatch = await scenarioRecognizer.recognize(userInput, url);
157
+ // 决定缓存层级
158
+ let cacheLevel = "L3";
159
+ if (finalConfig.cacheLevelStrategy === "auto" && scenarioMatch) {
160
+ cacheLevel =
161
+ scenarioMatch.confidence >= 85
162
+ ? "L3"
163
+ : scenarioMatch.confidence >= 70
164
+ ? "L2"
165
+ : "L1";
166
+ }
167
+ else {
168
+ cacheLevel = finalConfig.defaultCacheLevel;
169
+ }
170
+ // 解析变量
171
+ let variables;
172
+ if (finalConfig.variableExtractionEnabled && scenarioMatch) {
173
+ variables = variableResolver.resolveVariables(userInput, scenarioMatch.scenario);
174
+ }
175
+ // 保存到缓存
176
+ const viewport = extractViewport(ctx, params);
177
+ const actions = result.actions || [];
178
+ if (actions.length > 0) {
179
+ cacheStore.set(url, viewport, actions, {
180
+ scenario: scenarioMatch?.scenario || llmScenario,
181
+ cacheLevel,
182
+ variables,
183
+ description: result.description || `Cached ${llmScenario} actions`,
184
+ pageType: result.pageType || "mixed",
185
+ });
186
+ console.log(`[PageActionCache] Saved cache entry: ${scenarioMatch?.scenario || llmScenario} (${cacheLevel})`);
187
+ }
188
+ },
189
+ });
190
+ // -------------------------------------------------------------------------
191
+ // before_prompt_build hook - 注入缓存使用指南
192
+ // -------------------------------------------------------------------------
193
+ api.registerHook({
194
+ name: "before_prompt_build",
195
+ priority: 50,
196
+ description: "页面操作缓存 - 注入缓存使用指南",
197
+ async handler(_event, _ctx) {
198
+ if (!finalConfig.autoUseCache) {
199
+ return;
200
+ }
201
+ const stats = cacheStore.getStats();
202
+ // 只在命中率较高时注入
203
+ if (stats.hitRate < 30) {
204
+ return;
205
+ }
206
+ // 构建缓存使用指南
207
+ const guide = `
208
+ 【页面操作缓存系统】
209
+
210
+ 当前缓存统计:
211
+ - 总条目数:${stats.totalEntries}
212
+ - 总命中:${stats.totalHits}
213
+ - 命中率:${stats.hitRate.toFixed(1)}%
214
+
215
+ 已缓存的场景:
216
+ ${cacheStore.getTopScenarios(5)}
217
+
218
+ 使用方式:
219
+ 1. 如果工具返回 cacheInfo 信息,优先使用 execute_cached 工具
220
+ 2. 执行缓存操作可以大幅降低 token 消耗和操作延迟
221
+ 3. 如果页面结构变化,缓存会自动失效
222
+
223
+ 支持的场景:login, logout, search, checkout, settings, form_fill, navigate, screenshot
224
+
225
+ 缓存层级:
226
+ - L3: 场景级缓存(包含变量模板)- 高置信度时直接使用
227
+ - L2: 流程级缓存 - 中置信度时使用
228
+ - L1: 原子级缓存 - 低置信度或无场景时使用
229
+
230
+ 可用的缓存工具:
231
+ - execute_cached: 执行缓存的操作序列
232
+ - cache_stats: 查看缓存统计
233
+ - cache_list: 列出所有缓存
234
+ - cache_clear: 清空缓存
235
+ - scenario_list: 列出所有场景
236
+ - force_refresh: 强制刷新指定缓存
237
+ `;
238
+ return { prependContext: guide };
239
+ },
240
+ });
241
+ console.log("[PageActionCache] Hooks registered successfully");
242
+ }
243
+ // ============================================================================
244
+ // 辅助函数
245
+ // ============================================================================
246
+ /**
247
+ * 从上下文提取用户输入
248
+ */
249
+ function extractUserInput(ctx) {
250
+ // 尝试从上下文中提取用户输入
251
+ if (ctx.message?.content) {
252
+ return ctx.message.content;
253
+ }
254
+ if (ctx.userInput) {
255
+ return ctx.userInput;
256
+ }
257
+ if (ctx.prompt) {
258
+ return ctx.prompt;
259
+ }
260
+ return "";
261
+ }
262
+ /**
263
+ * 从上下文和参数提取视口尺寸
264
+ */
265
+ function extractViewport(ctx, params) {
266
+ // 优先从参数获取
267
+ if (params.viewport) {
268
+ return params.viewport;
269
+ }
270
+ // 其次从上下文获取
271
+ if (ctx.viewport) {
272
+ return ctx.viewport;
273
+ }
274
+ // 默认值
275
+ return { width: 1920, height: 1080 };
276
+ }
277
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}