page-action-cache 2.0.5 → 2.0.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAMzD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAiPrD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAMzD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CA2CC"}
package/dist/index.js CHANGED
@@ -2,10 +2,6 @@
2
2
  * Page Action Cache - OpenClaw Extension
3
3
  * 页面操作缓存扩展 - OpenClaw 扩展
4
4
  */
5
- import { scenarioRecognizer } from './scenario-recognizer.js';
6
- import { multiLevelCache } from './multi-level-cache.js';
7
- import { cacheInvalidation } from './cache-invalidation.js';
8
- import { browserActionExecutor } from './browser-action-executor.js';
9
5
  /**
10
6
  * 主扩展入口
11
7
  */
@@ -14,6 +10,12 @@ export function register(api) {
14
10
  // 获取插件配置 - 详细日志
15
11
  const rawConfig = api.getConfig?.();
16
12
  console.log('[PageActionCache] Raw config object:', JSON.stringify(rawConfig, null, 2));
13
+ // 检查配置对象是否有效
14
+ if (!rawConfig || typeof rawConfig !== 'object') {
15
+ console.log('[PageActionCache] Invalid config object type:', typeof rawConfig);
16
+ // 配置无效,使用空对象继续
17
+ rawConfig = {};
18
+ }
17
19
  const pluginConfig = rawConfig?.plugins?.entries?.['page-action-cache'] ?? {};
18
20
  console.log('[PageActionCache] Plugin config for page-action-cache:', JSON.stringify(pluginConfig, null, 2));
19
21
  const pageActionCacheConfig = pluginConfig ?? {};
@@ -38,211 +40,9 @@ export function register(api) {
38
40
  // 从插件配置中读取 enabled 状态
39
41
  const pluginConfig = ctx.config?.plugins?.entries?.['page-action-cache'] ?? {};
40
42
  const enabled = pluginConfig.enabled !== false;
41
- if (!enabled) {
42
- return {
43
- type: 'text',
44
- content: 'Page Action Cache 功能已禁用'
45
- };
46
- }
47
- const request = ctx.params;
48
- const url = request?.url;
49
- if (!url) {
50
- return {
51
- type: 'text',
52
- content: 'Missing required parameter: url'
53
- };
54
- }
55
- // 尝试从缓存中查找
56
- const cachedEntry = multiLevelCache.queryCache(url, request.viewport || '1920x1080');
57
- if (cachedEntry && !request.forceRefresh) {
58
- console.log('[PageActionCache] Cache hit found');
59
- return await executeFromCache(cachedEntry);
60
- }
61
- // 缓存未命中或强制刷新,创建新缓存并执行
62
- console.log('[PageActionCache] Cache miss or forced refresh, creating new entry');
63
- // 识别场景
64
- let scenario = request.scenario;
65
- if (!scenario) {
66
- scenario = scenarioRecognizer.recognizeByUrl(url);
67
- }
68
- // 创建缓存条目
69
- const actions = request.actions || [];
70
- const cacheActions = actions.map((action) => ({
71
- type: action.type,
72
- params: action.params,
73
- successCount: 0,
74
- failCount: 0
75
- }));
76
- const cacheId = multiLevelCache.addCache(url, request.viewport || '1920x1080', cacheActions, scenario, request.llmClassificationScore);
77
- // 执行操作
78
- const entry = {
79
- id: cacheId,
80
- url,
81
- viewport: request.viewport || '1920x1080',
82
- actions: cacheActions,
83
- scenario,
84
- timestamp: Date.now(),
85
- hitRate: 0,
86
- savedActions: 0,
87
- savedTime: 0,
88
- level: 'L1',
89
- createdAt: Date.now(),
90
- lastAccessed: Date.now(),
91
- accessCount: 0,
92
- expiresAt: Date.now() + 86400000 // 24小时
93
- };
94
- const result = await browserActionExecutor.executeCacheEntry(entry);
95
- return {
96
- type: 'text',
97
- content: `## Cache Execution Result
98
-
99
- ${result.message}
100
-
101
- - Executed Actions: ${result.executedActions}
102
- - Skipped Actions: ${result.skippedActions}
103
- - Failed Actions: ${result.failedActions}
104
- - Saved Time: ${result.savedTime}ms
105
-
106
- Cache ID: ${cacheId}
107
- URL: ${url}
108
- Scenario: ${scenario}
109
- LLM Classification Score: ${request.llmClassificationScore || 'N/A'}`
110
- };
111
- }
112
- catch (error) {
113
- console.error('[PageActionCache] Error:', error);
114
- return {
115
- type: 'text',
116
- content: `执行失败: ${error.message}`
117
- };
118
- }
119
- }
120
- });
121
- // 注册缓存统计工具
122
- api.registerTool({
123
- name: 'browser_cache_stats',
124
- description: '查看页面操作缓存的统计信息',
125
- async execute(_ctx) {
126
- try {
127
- const stats = multiLevelCache.getStats();
128
- const invalidationStats = cacheInvalidation.getInvalidationStats();
129
- return {
130
- type: 'text',
131
- content: `## Page Action Cache Statistics
132
-
133
- ### Overall Performance
134
- - Total Cache Entries: ${stats.totalEntries}
135
- - Total Cache Hits: ${stats.totalHits}
136
- - Cache Hit Rate: ${stats.hitRate.toFixed(2)}%
137
-
138
- ### Multi-Level Cache Distribution
139
- ${Object.entries(stats.levelStats).map(([level, data]) => `
140
- #### ${level} Cache
141
- - Size: ${data.size}/${data.maxCapacity} (${(data.usageRate * 100).toFixed(1)}% full)
142
- - Average Access Count: ${data.avgAccessCount.toFixed(1)}
143
- `).join('')}
144
-
145
- ### Cache Invalidation
146
- - Total Snapshots: ${invalidationStats.totalSnapshots}
147
- - Active Snapshots: ${invalidationStats.activeSnapshots}
148
- - Invalidation Rate: ${(invalidationStats.invalidationRate * 100).toFixed(2)}%`
149
- };
150
- }
151
- catch (error) {
152
- return {
153
- type: 'text',
154
- content: `统计功能错误: ${error.message}`
155
- };
156
- }
157
- }
158
- });
159
- // 注册缓存清除工具
160
- api.registerTool({
161
- name: 'browser_cache_clear',
162
- description: '清空页面操作缓存',
163
- async execute(ctx) {
164
- try {
165
- const request = ctx.params;
166
- if (request.url && request.viewport) {
167
- // 删除特定缓存条目
168
- const deleted = multiLevelCache.deleteCache(request.url, request.viewport || '1920x1080');
169
- cacheInvalidation.invalidate(request.url, request.viewport || '1920x1080');
170
- return {
171
- type: 'text',
172
- content: deleted
173
- ? `Cache entry deleted for ${request.url}:${request.viewport || '1920x1080'}`
174
- : `No cache entry found for ${request.url}:${request.viewport || '1920x1080'}`
175
- };
176
- }
177
- else if (request.url) {
178
- // 删除 URL 相关的所有缓存
179
- multiLevelCache.deleteCacheByUrl(request.url);
180
- cacheInvalidation.invalidateByUrl(request.url);
181
- return {
182
- type: 'text',
183
- content: `All cache entries for ${request.url} have been deleted`
184
- };
185
- }
186
- else if (request.level) {
187
- // 按级别删除
188
- if (request.level === 'all') {
189
- multiLevelCache.clearAll();
190
- cacheInvalidation.reset();
191
- }
192
- else {
193
- multiLevelCache.clearLevel(request.level);
194
- }
195
- return {
196
- type: 'text',
197
- content: `Cache cleared for level: ${request.level}`
198
- };
199
- }
200
- else {
201
- // 默认清空所有缓存
202
- multiLevelCache.clearAll();
203
- cacheInvalidation.reset();
204
- return {
205
- type: 'text',
206
- content: 'All page action cache has been cleared'
207
- };
208
- }
209
- }
210
- catch (error) {
211
- return {
212
- type: 'text',
213
- content: `清除功能错误: ${error.message}`
214
- };
215
43
  }
44
+ finally { }
216
45
  }
217
46
  });
218
- console.log('[PageActionCache] Tools registered successfully');
219
- // 定期清理过期缓存
220
- setInterval(() => {
221
- multiLevelCache.cleanupExpired();
222
- cacheInvalidation.cleanup();
223
- }, 60 * 60 * 1000); // 每小时清理一次
224
- }
225
- /**
226
- * 从缓存执行
227
- */
228
- async function executeFromCache(cachedEntry) {
229
- const result = await browserActionExecutor.executeCacheEntry(cachedEntry);
230
- return {
231
- type: 'text',
232
- content: `## Cached Execution
233
-
234
- ${result.message}
235
-
236
- - Executed Actions: ${result.executedActions}
237
- - Skipped Actions: ${result.skippedActions}
238
- - Failed Actions: ${result.failedActions}
239
- - Saved Time: ${result.savedTime}ms
240
-
241
- Cache ID: ${cachedEntry.id}
242
- URL: ${cachedEntry.url}
243
- Scenario: ${cachedEntry.scenario}
244
- Cache Level: ${cachedEntry.level}
245
- Access Count: ${cachedEntry.accessCount || 0}`
246
- };
247
47
  }
248
48
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAsB;IAC7C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAE3D,gBAAgB;IAChB,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAExF,aAAa;IACb,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,+CAA+C,EAAE,OAAO,SAAS,CAAC,CAAC;QAC/E,eAAe;QACf,SAAS,GAAG,EAAE,CAAC;IACjB,CAAC;IAED,MAAM,YAAY,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,wDAAwD,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE7G,MAAM,qBAAqB,GAAG,YAAY,IAAI,EAAE,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,iDAAiD,EAAE,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/G,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,KAAK,KAAK,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,OAAO,CAAC,CAAC;IAE1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;IAEzF,WAAW;IACX,GAAG,CAAC,YAAY,CAAC;QACf,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,gCAAgC;QAC7C,KAAK,CAAC,OAAO,CAAC,GAAQ;YACpB,IAAI,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;gBAC9D,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,OAAO,GAAG,CAAC,CAAC;gBAC3D,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC5G,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAE5G,sBAAsB;gBACtB,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;gBAC/E,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,KAAK,KAAK,CAAC;YAAA,CAAC,AAAD;oBAAA,CAAC,CAAD,CAAC,AAAD;QAAA,CAAC,AAAD;KAAA,CAAA,CAAA;AAAA,CAAC,AAAD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "page-action-cache",
3
- "version": "2.0.5",
3
+ "version": "2.0.8",
4
4
  "description": "Page Action Cache - OpenClaw extension using Browser Client API",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/index.ts CHANGED
@@ -19,6 +19,13 @@ export function register(api: OpenClawPluginApi): void {
19
19
  const rawConfig = api.getConfig?.();
20
20
  console.log('[PageActionCache] Raw config object:', JSON.stringify(rawConfig, null, 2));
21
21
 
22
+ // 检查配置对象是否有效
23
+ if (!rawConfig || typeof rawConfig !== 'object') {
24
+ console.log('[PageActionCache] Invalid config object type:', typeof rawConfig);
25
+ // 配置无效,使用空对象继续
26
+ rawConfig = {};
27
+ }
28
+
22
29
  const pluginConfig = rawConfig?.plugins?.entries?.['page-action-cache'] ?? {};
23
30
  console.log('[PageActionCache] Plugin config for page-action-cache:', JSON.stringify(pluginConfig, null, 2));
24
31
 
@@ -48,234 +55,4 @@ export function register(api: OpenClawPluginApi): void {
48
55
 
49
56
  // 从插件配置中读取 enabled 状态
50
57
  const pluginConfig = ctx.config?.plugins?.entries?.['page-action-cache'] ?? {};
51
- const enabled = pluginConfig.enabled !== false;
52
-
53
- if (!enabled) {
54
- return {
55
- type: 'text',
56
- content: 'Page Action Cache 功能已禁用'
57
- };
58
- }
59
-
60
- const request = ctx.params as any;
61
- const url = request?.url;
62
-
63
- if (!url) {
64
- return {
65
- type: 'text',
66
- content: 'Missing required parameter: url'
67
- };
68
- }
69
-
70
- // 尝试从缓存中查找
71
- const cachedEntry = multiLevelCache.queryCache(url, request.viewport || '1920x1080');
72
-
73
- if (cachedEntry && !request.forceRefresh) {
74
- console.log('[PageActionCache] Cache hit found');
75
- return await executeFromCache(cachedEntry);
76
- }
77
-
78
- // 缓存未命中或强制刷新,创建新缓存并执行
79
- console.log('[PageActionCache] Cache miss or forced refresh, creating new entry');
80
-
81
- // 识别场景
82
- let scenario = request.scenario;
83
- if (!scenario) {
84
- scenario = scenarioRecognizer.recognizeByUrl(url);
85
- }
86
-
87
- // 创建缓存条目
88
- const actions = request.actions || [];
89
- const cacheActions = actions.map((action: any) => ({
90
- type: action.type,
91
- params: action.params,
92
- successCount: 0,
93
- failCount: 0
94
- }));
95
-
96
- const cacheId = multiLevelCache.addCache(
97
- url,
98
- request.viewport || '1920x1080',
99
- cacheActions,
100
- scenario,
101
- request.llmClassificationScore
102
- );
103
-
104
- // 执行操作
105
- const entry = {
106
- id: cacheId,
107
- url,
108
- viewport: request.viewport || '1920x1080',
109
- actions: cacheActions,
110
- scenario,
111
- timestamp: Date.now(),
112
- hitRate: 0,
113
- savedActions: 0,
114
- savedTime: 0,
115
- level: 'L1' as const,
116
- createdAt: Date.now(),
117
- lastAccessed: Date.now(),
118
- accessCount: 0,
119
- expiresAt: Date.now() + 86400000 // 24小时
120
- };
121
-
122
- const result = await browserActionExecutor.executeCacheEntry(entry);
123
-
124
- return {
125
- type: 'text',
126
- content: `## Cache Execution Result
127
-
128
- ${result.message}
129
-
130
- - Executed Actions: ${result.executedActions}
131
- - Skipped Actions: ${result.skippedActions}
132
- - Failed Actions: ${result.failedActions}
133
- - Saved Time: ${result.savedTime}ms
134
-
135
- Cache ID: ${cacheId}
136
- URL: ${url}
137
- Scenario: ${scenario}
138
- LLM Classification Score: ${request.llmClassificationScore || 'N/A'}`
139
- };
140
- } catch (error: any) {
141
- console.error('[PageActionCache] Error:', error);
142
- return {
143
- type: 'text',
144
- content: `执行失败: ${error.message}`
145
- };
146
- }
147
- }
148
- });
149
-
150
- // 注册缓存统计工具
151
- api.registerTool({
152
- name: 'browser_cache_stats',
153
- description: '查看页面操作缓存的统计信息',
154
- async execute(_ctx: any) {
155
- try {
156
- const stats = multiLevelCache.getStats();
157
- const invalidationStats = cacheInvalidation.getInvalidationStats();
158
-
159
- return {
160
- type: 'text',
161
- content: `## Page Action Cache Statistics
162
-
163
- ### Overall Performance
164
- - Total Cache Entries: ${stats.totalEntries}
165
- - Total Cache Hits: ${stats.totalHits}
166
- - Cache Hit Rate: ${stats.hitRate.toFixed(2)}%
167
-
168
- ### Multi-Level Cache Distribution
169
- ${Object.entries(stats.levelStats).map(([level, data]) => `
170
- #### ${level} Cache
171
- - Size: ${data.size}/${data.maxCapacity} (${(data.usageRate * 100).toFixed(1)}% full)
172
- - Average Access Count: ${data.avgAccessCount.toFixed(1)}
173
- `).join('')}
174
-
175
- ### Cache Invalidation
176
- - Total Snapshots: ${invalidationStats.totalSnapshots}
177
- - Active Snapshots: ${invalidationStats.activeSnapshots}
178
- - Invalidation Rate: ${(invalidationStats.invalidationRate * 100).toFixed(2)}%`
179
- };
180
- } catch (error: any) {
181
- return {
182
- type: 'text',
183
- content: `统计功能错误: ${error.message}`
184
- };
185
- }
186
- }
187
- });
188
-
189
- // 注册缓存清除工具
190
- api.registerTool({
191
- name: 'browser_cache_clear',
192
- description: '清空页面操作缓存',
193
- async execute(ctx: any) {
194
- try {
195
- const request = ctx.params as any;
196
-
197
- if (request.url && request.viewport) {
198
- // 删除特定缓存条目
199
- const deleted = multiLevelCache.deleteCache(request.url, request.viewport || '1920x1080');
200
- cacheInvalidation.invalidate(request.url, request.viewport || '1920x1080');
201
-
202
- return {
203
- type: 'text',
204
- content: deleted
205
- ? `Cache entry deleted for ${request.url}:${request.viewport || '1920x1080'}`
206
- : `No cache entry found for ${request.url}:${request.viewport || '1920x1080'}`
207
- };
208
- } else if (request.url) {
209
- // 删除 URL 相关的所有缓存
210
- multiLevelCache.deleteCacheByUrl(request.url);
211
- cacheInvalidation.invalidateByUrl(request.url);
212
-
213
- return {
214
- type: 'text',
215
- content: `All cache entries for ${request.url} have been deleted`
216
- };
217
- } else if (request.level) {
218
- // 按级别删除
219
- if (request.level === 'all') {
220
- multiLevelCache.clearAll();
221
- cacheInvalidation.reset();
222
- } else {
223
- multiLevelCache.clearLevel(request.level);
224
- }
225
-
226
- return {
227
- type: 'text',
228
- content: `Cache cleared for level: ${request.level}`
229
- };
230
- } else {
231
- // 默认清空所有缓存
232
- multiLevelCache.clearAll();
233
- cacheInvalidation.reset();
234
-
235
- return {
236
- type: 'text',
237
- content: 'All page action cache has been cleared'
238
- };
239
- }
240
- } catch (error: any) {
241
- return {
242
- type: 'text',
243
- content: `清除功能错误: ${error.message}`
244
- };
245
- }
246
- }
247
- });
248
-
249
- console.log('[PageActionCache] Tools registered successfully');
250
-
251
- // 定期清理过期缓存
252
- setInterval(() => {
253
- multiLevelCache.cleanupExpired();
254
- cacheInvalidation.cleanup();
255
- }, 60 * 60 * 1000); // 每小时清理一次
256
- }
257
-
258
- /**
259
- * 从缓存执行
260
- */
261
- async function executeFromCache(cachedEntry: any) {
262
- const result = await browserActionExecutor.executeCacheEntry(cachedEntry);
263
-
264
- return {
265
- type: 'text',
266
- content: `## Cached Execution
267
-
268
- ${result.message}
269
-
270
- - Executed Actions: ${result.executedActions}
271
- - Skipped Actions: ${result.skippedActions}
272
- - Failed Actions: ${result.failedActions}
273
- - Saved Time: ${result.savedTime}ms
274
-
275
- Cache ID: ${cachedEntry.id}
276
- URL: ${cachedEntry.url}
277
- Scenario: ${cachedEntry.scenario}
278
- Cache Level: ${cachedEntry.level}
279
- Access Count: ${cachedEntry.accessCount || 0}`
280
- };
281
- }
58
+ const enabled = pluginConfig.enabled !== false;