page-action-cache 2026.3.2 → 2026.3.3
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/dist/index.d.ts.map +1 -1
- package/dist/index.js +151 -128
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,UAAU,iBAAiB;IACzB,YAAY,CAAC,IAAI,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;QACrB,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAChD,GAAG,IAAI,CAAC;CACV;AAGD,UAAU,oBAAoB;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,UAAU,iBAAiB;IACzB,YAAY,CAAC,IAAI,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;QACrB,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAChD,GAAG,IAAI,CAAC;CACV;AAGD,UAAU,oBAAoB;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA2DD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG;IACxD,KAAK,CAAC,EAAE;QACN,QAAQ,EAAE,CACR,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,oBAAoB,GAAG,IAAI,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,KAC1G,IAAI,CAAC;KACX,CAAC;CACH,GAAG,IAAI,CAkOP"}
|
package/dist/index.js
CHANGED
|
@@ -7,18 +7,17 @@ const memoryCache = new Map();
|
|
|
7
7
|
const MAX_CACHE_SIZE = 50;
|
|
8
8
|
const CACHE_TTL_MS = 5 * 60 * 1000; // 5 分钟
|
|
9
9
|
/**
|
|
10
|
-
* 生成缓存键
|
|
10
|
+
* 生成缓存键 (暂时禁用)
|
|
11
11
|
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
parts.push(url);
|
|
20
|
-
return parts.join(':');
|
|
12
|
+
/*
|
|
13
|
+
function getCacheKey(profile: string | undefined, targetId: string | undefined, url: string | undefined): string {
|
|
14
|
+
const parts = [];
|
|
15
|
+
if (profile) parts.push(profile);
|
|
16
|
+
if (targetId) parts.push(targetId);
|
|
17
|
+
if (url) parts.push(url);
|
|
18
|
+
return parts.join(':');
|
|
21
19
|
}
|
|
20
|
+
*/
|
|
22
21
|
/**
|
|
23
22
|
* 清理过期缓存
|
|
24
23
|
*/
|
|
@@ -46,128 +45,152 @@ function cleanupExpiredCache() {
|
|
|
46
45
|
*/
|
|
47
46
|
export default function register(api) {
|
|
48
47
|
console.log('[PageActionCache] Starting...');
|
|
49
|
-
// 注册 hooks
|
|
48
|
+
// 注册 hooks (暂时禁用以诊断问题)
|
|
49
|
+
/*
|
|
50
50
|
if (api.hooks) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
const hookEvent = event;
|
|
114
|
-
// Only process browser actions
|
|
115
|
-
if (hookEvent.toolName !== 'browser') {
|
|
116
|
-
return undefined;
|
|
117
|
-
}
|
|
118
|
-
const params = hookEvent.params;
|
|
119
|
-
if (!params.action) {
|
|
120
|
-
return undefined;
|
|
121
|
-
}
|
|
122
|
-
// Generate cache key
|
|
123
|
-
const cacheKey = getCacheKey(params.profile, params.targetId, params.url);
|
|
124
|
-
if (!cacheKey) {
|
|
125
|
-
return undefined;
|
|
126
|
-
}
|
|
127
|
-
// Check cache
|
|
128
|
-
const entry = memoryCache.get(cacheKey);
|
|
129
|
-
if (!entry) {
|
|
130
|
-
return undefined;
|
|
131
|
-
}
|
|
132
|
-
// Check if expired
|
|
133
|
-
if (Date.now() - entry.timestamp > CACHE_TTL_MS) {
|
|
134
|
-
memoryCache.delete(cacheKey);
|
|
135
|
-
return undefined;
|
|
136
|
-
}
|
|
137
|
-
// Increment hit count and refresh LRU
|
|
138
|
-
entry.hitCount++;
|
|
139
|
-
memoryCache.delete(cacheKey);
|
|
140
|
-
memoryCache.set(cacheKey, entry);
|
|
141
|
-
// Build modified params
|
|
142
|
-
const modifiedParams = {};
|
|
143
|
-
// Add profile if cached and not in params
|
|
144
|
-
if (entry.profile && !params.profile) {
|
|
145
|
-
modifiedParams.profile = entry.profile;
|
|
146
|
-
}
|
|
147
|
-
// Add targetId if cached and not in params
|
|
148
|
-
if (entry.targetId && !params.targetId) {
|
|
149
|
-
modifiedParams.targetId = entry.targetId;
|
|
150
|
-
}
|
|
151
|
-
// Add refs if this is a snapshot action and we have cached refs
|
|
152
|
-
if (params.action === 'snapshot' && entry.refs && !params.refs) {
|
|
153
|
-
modifiedParams.refs = entry.refs;
|
|
154
|
-
}
|
|
155
|
-
// Only return if we have something to add
|
|
156
|
-
if (Object.keys(modifiedParams).length > 0) {
|
|
157
|
-
console.log('[PageActionCache] Cache hit:', cacheKey, 'modified params:', Object.keys(modifiedParams));
|
|
158
|
-
return { params: modifiedParams };
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
catch (err) {
|
|
162
|
-
console.error('[PageActionCache] Error in before_tool_call:', err);
|
|
51
|
+
// after_tool_call hook - cache snapshot metadata
|
|
52
|
+
api.hooks.register('after_tool_call', async (event: unknown, _ctx: unknown) => {
|
|
53
|
+
try {
|
|
54
|
+
const hookEvent = event as { toolName: string; params: Record<string, unknown>; result?: unknown; error?: string };
|
|
55
|
+
|
|
56
|
+
// Only process browser snapshot actions
|
|
57
|
+
if (hookEvent.toolName !== 'browser') {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const params = hookEvent.params as { action?: string; profile?: string; targetId?: string; url?: string; refs?: "role" | "aria" };
|
|
62
|
+
if (params.action !== 'snapshot') {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Skip if there was an error
|
|
67
|
+
if (hookEvent.error) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Extract metadata from result
|
|
72
|
+
const result = hookEvent.result as { details?: { targetId?: string; url?: string; refs?: number } };
|
|
73
|
+
if (!result?.details) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const targetId = result.details.targetId || params.targetId;
|
|
78
|
+
const url = result.details.url || params.url;
|
|
79
|
+
const refsCount = result.details.refs;
|
|
80
|
+
|
|
81
|
+
if (!targetId || !url) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Check if refs were collected
|
|
86
|
+
const refs: "role" | "aria" | undefined = (params.refs === "role" || params.refs === "aria") ? params.refs : undefined;
|
|
87
|
+
|
|
88
|
+
// Store in cache
|
|
89
|
+
const cacheKey = getCacheKey(params.profile, targetId, url);
|
|
90
|
+
const existingEntry = memoryCache.get(cacheKey);
|
|
91
|
+
|
|
92
|
+
const entry: CacheEntry = {
|
|
93
|
+
url,
|
|
94
|
+
targetId,
|
|
95
|
+
profile: params.profile,
|
|
96
|
+
refs,
|
|
97
|
+
refsData: refsCount && refsCount > 0 ? {} : undefined, // Would store actual refs if accessible
|
|
98
|
+
timestamp: Date.now(),
|
|
99
|
+
hitCount: existingEntry?.hitCount || 0
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// Refresh insertion order for LRU
|
|
103
|
+
if (existingEntry) {
|
|
104
|
+
memoryCache.delete(cacheKey);
|
|
105
|
+
}
|
|
106
|
+
memoryCache.set(cacheKey, entry);
|
|
107
|
+
|
|
108
|
+
// Cleanup if over limit
|
|
109
|
+
if (memoryCache.size > MAX_CACHE_SIZE) {
|
|
110
|
+
const oldestKey = memoryCache.keys().next().value;
|
|
111
|
+
if (oldestKey) {
|
|
112
|
+
memoryCache.delete(oldestKey);
|
|
163
113
|
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
console.log('[PageActionCache] Cached snapshot:', cacheKey, 'refs:', refs, 'count:', refsCount);
|
|
117
|
+
} catch (err) {
|
|
118
|
+
console.error('[PageActionCache] Error in after_tool_call:', err);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// before_tool_call hook - restore cached params
|
|
123
|
+
api.hooks.register('before_tool_call', async (event: unknown, _ctx: unknown) => {
|
|
124
|
+
try {
|
|
125
|
+
const hookEvent = event as { toolName: string; params: Record<string, unknown> };
|
|
126
|
+
|
|
127
|
+
// Only process browser actions
|
|
128
|
+
if (hookEvent.toolName !== 'browser') {
|
|
164
129
|
return undefined;
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const params = hookEvent.params as { action?: string; profile?: string; targetId?: string; url?: string; refs?: "role" | "aria" };
|
|
133
|
+
if (!params.action) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Generate cache key
|
|
138
|
+
const cacheKey = getCacheKey(params.profile, params.targetId, params.url);
|
|
139
|
+
if (!cacheKey) {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Check cache
|
|
144
|
+
const entry = memoryCache.get(cacheKey);
|
|
145
|
+
if (!entry) {
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Check if expired
|
|
150
|
+
if (Date.now() - entry.timestamp > CACHE_TTL_MS) {
|
|
151
|
+
memoryCache.delete(cacheKey);
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Increment hit count and refresh LRU
|
|
156
|
+
entry.hitCount++;
|
|
157
|
+
memoryCache.delete(cacheKey);
|
|
158
|
+
memoryCache.set(cacheKey, entry);
|
|
159
|
+
|
|
160
|
+
// Build modified params
|
|
161
|
+
const modifiedParams: Record<string, unknown> = {};
|
|
162
|
+
|
|
163
|
+
// Add profile if cached and not in params
|
|
164
|
+
if (entry.profile && !params.profile) {
|
|
165
|
+
modifiedParams.profile = entry.profile;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Add targetId if cached and not in params
|
|
169
|
+
if (entry.targetId && !params.targetId) {
|
|
170
|
+
modifiedParams.targetId = entry.targetId;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Add refs if this is a snapshot action and we have cached refs
|
|
174
|
+
if (params.action === 'snapshot' && entry.refs && !params.refs) {
|
|
175
|
+
modifiedParams.refs = entry.refs;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Only return if we have something to add
|
|
179
|
+
if (Object.keys(modifiedParams).length > 0) {
|
|
180
|
+
console.log('[PageActionCache] Cache hit:', cacheKey, 'modified params:', Object.keys(modifiedParams));
|
|
181
|
+
return { params: modifiedParams };
|
|
182
|
+
}
|
|
183
|
+
} catch (err) {
|
|
184
|
+
console.error('[PageActionCache] Error in before_tool_call:', err);
|
|
185
|
+
}
|
|
186
|
+
return undefined;
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
console.log('[PageActionCache] Hooks registered');
|
|
190
|
+
} else {
|
|
191
|
+
console.log('[PageActionCache] No hooks API available');
|
|
170
192
|
}
|
|
193
|
+
*/
|
|
171
194
|
// 注册缓存统计工具
|
|
172
195
|
api.registerTool({
|
|
173
196
|
name: 'page_cache_stats',
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgCH,eAAe;AACf,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;AAClD,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO;AAE3C;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|