page-action-cache 2026.15.0 → 2026.16.0

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.
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 共享缓存常量和内存缓存
3
+ */
4
+ import type { CacheEntry } from '../types/index.js';
5
+ /**
6
+ * 内存缓存
7
+ */
8
+ export declare const memoryCache: Map<string, CacheEntry>;
9
+ /**
10
+ * 最大缓存条目数
11
+ */
12
+ export declare const MAX_CACHE_SIZE = 50;
13
+ /**
14
+ * 缓存TTL(5分钟)
15
+ */
16
+ export declare const CACHE_TTL_MS: number;
17
+ /**
18
+ * 生成缓存键
19
+ */
20
+ export declare function getCacheKey(profile: string | undefined, urlHash: string): string;
21
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/cache/shared.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;GAEG;AACH,eAAO,MAAM,WAAW,yBAAgC,CAAC;AAEzD;;GAEG;AACH,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC;;GAEG;AACH,eAAO,MAAM,YAAY,QAAgB,CAAC;AAE1C;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhF"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 共享缓存常量和内存缓存
3
+ */
4
+ /**
5
+ * 内存缓存
6
+ */
7
+ export const memoryCache = new Map();
8
+ /**
9
+ * 最大缓存条目数
10
+ */
11
+ export const MAX_CACHE_SIZE = 50;
12
+ /**
13
+ * 缓存TTL(5分钟)
14
+ */
15
+ export const CACHE_TTL_MS = 5 * 60 * 1000;
16
+ /**
17
+ * 生成缓存键
18
+ */
19
+ export function getCacheKey(profile, urlHash) {
20
+ return `${profile || 'default'}:${urlHash}`;
21
+ }
22
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/cache/shared.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAC;AAEzD;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAE1C;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAA2B,EAAE,OAAe;IACtE,OAAO,GAAG,OAAO,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;AAC9C,CAAC"}
@@ -2,22 +2,19 @@
2
2
  * URL 标准化和哈希工具
3
3
  */
4
4
  /**
5
- * 标准化 URL
6
- * - 移除跟踪参数(session、token、utm_*、fbclid、gclid)
7
- * - 标准化域名(小写)
8
- * - 移除尾部斜杠
5
+ * 移除URL中的跟踪参数
9
6
  */
10
7
  export declare function normalizeUrl(url: string): string;
11
8
  /**
12
- * 对 URL 进行 MD5 哈希
9
+ * 对URL进行MD5哈希
13
10
  */
14
11
  export declare function hashUrl(url: string): string;
15
12
  /**
16
- * 从 URL 提取域名
13
+ * 从URL提取域名
17
14
  */
18
15
  export declare function extractDomain(url: string): string;
19
16
  /**
20
- * 判断是否应该缓存该 URL
17
+ * 判断URL是否应该被缓存
21
18
  */
22
19
  export declare function shouldUseCacheUrl(url: string): boolean;
23
20
  //# sourceMappingURL=url-normalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-normalizer.d.ts","sourceRoot":"","sources":["../../src/cache/url-normalizer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAqChD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG3C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAyCtD"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * URL 标准化和哈希工具
3
+ */
4
+ import { createHash } from 'crypto';
5
+ /**
6
+ * 移除URL中的跟踪参数
7
+ */
8
+ export function normalizeUrl(url) {
9
+ try {
10
+ const urlObj = new URL(url);
11
+ // 需要移除的跟踪参数
12
+ const paramsToRemove = [
13
+ 'session',
14
+ 'token',
15
+ 'csrf_token',
16
+ 'auth_token',
17
+ 'access_token',
18
+ 'utm_source',
19
+ 'utm_medium',
20
+ 'utm_campaign',
21
+ 'utm_term',
22
+ 'utm_content',
23
+ 'fbclid',
24
+ 'gclid',
25
+ '_ga',
26
+ '_gid',
27
+ ];
28
+ paramsToRemove.forEach(param => {
29
+ urlObj.searchParams.delete(param);
30
+ });
31
+ // 标准化域名(转小写)
32
+ urlObj.hostname = urlObj.hostname.toLowerCase();
33
+ // 移除尾部斜杠
34
+ const normalizedUrl = urlObj.toString().replace(/\/$/, '');
35
+ return normalizedUrl;
36
+ }
37
+ catch {
38
+ // 如果URL无效,返回原始值
39
+ return url;
40
+ }
41
+ }
42
+ /**
43
+ * 对URL进行MD5哈希
44
+ */
45
+ export function hashUrl(url) {
46
+ const normalized = normalizeUrl(url);
47
+ return createHash('md5').update(normalized).digest('hex');
48
+ }
49
+ /**
50
+ * 从URL提取域名
51
+ */
52
+ export function extractDomain(url) {
53
+ try {
54
+ const urlObj = new URL(url);
55
+ return urlObj.hostname;
56
+ }
57
+ catch {
58
+ return 'unknown';
59
+ }
60
+ }
61
+ /**
62
+ * 判断URL是否应该被缓存
63
+ */
64
+ export function shouldUseCacheUrl(url) {
65
+ const normalized = normalizeUrl(url);
66
+ // 不缓存的URL模式
67
+ const noCachePatterns = [
68
+ '/api/',
69
+ '/static/',
70
+ '/assets/',
71
+ '/logout',
72
+ '/signout',
73
+ ];
74
+ // 检查是否包含session或token
75
+ if (normalized.includes('session') || normalized.includes('token')) {
76
+ return false;
77
+ }
78
+ // 检查是否匹配不缓存模式
79
+ for (const pattern of noCachePatterns) {
80
+ if (normalized.includes(pattern)) {
81
+ return false;
82
+ }
83
+ }
84
+ // 需要缓存的URL模式
85
+ const cachePatterns = [
86
+ '/dashboard',
87
+ '/admin',
88
+ '/settings',
89
+ '/profile',
90
+ ];
91
+ // 检查是否匹配缓存模式
92
+ for (const pattern of cachePatterns) {
93
+ if (normalized.includes(pattern)) {
94
+ return true;
95
+ }
96
+ }
97
+ // 默认不缓存(保守策略)
98
+ return false;
99
+ }
100
+ //# sourceMappingURL=url-normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-normalizer.js","sourceRoot":"","sources":["../../src/cache/url-normalizer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAE5B,YAAY;QACZ,MAAM,cAAc,GAAG;YACrB,SAAS;YACT,OAAO;YACP,YAAY;YACZ,YAAY;YACZ,cAAc;YACd,YAAY;YACZ,YAAY;YACZ,cAAc;YACd,UAAU;YACV,aAAa;YACb,QAAQ;YACR,OAAO;YACP,KAAK;YACL,MAAM;SACP,CAAC;QAEF,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAC7B,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,aAAa;QACb,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAEhD,SAAS;QACT,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAE3D,OAAO,aAAa,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;QAChB,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAErC,YAAY;IACZ,MAAM,eAAe,GAAG;QACtB,OAAO;QACP,UAAU;QACV,UAAU;QACV,SAAS;QACT,UAAU;KACX,CAAC;IAEF,sBAAsB;IACtB,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,cAAc;IACd,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,aAAa;IACb,MAAM,aAAa,GAAG;QACpB,YAAY;QACZ,QAAQ;QACR,WAAW;QACX,UAAU;KACX,CAAC;IAEF,aAAa;IACb,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,cAAc;IACd,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * After Tool Call Hook 处理器
3
+ * 处理工具调用后的逻辑,主要是捕获snapshot结果并创建缓存
4
+ */
5
+ import type { AfterToolCallEvent } from '../types/index.js';
6
+ /**
7
+ * 清理过期缓存
8
+ */
9
+ export declare function cleanupExpiredCache(): number;
10
+ /**
11
+ * 获取缓存统计信息
12
+ */
13
+ export interface CacheStats {
14
+ totalEntries: number;
15
+ uniqueProfiles: number;
16
+ uniqueUrls: number;
17
+ uniqueDomains: number;
18
+ hits: number;
19
+ avgHitCount: number;
20
+ }
21
+ export declare function getCacheStats(): CacheStats;
22
+ /**
23
+ * 清空所有缓存
24
+ */
25
+ export declare function clearCache(): number;
26
+ /**
27
+ * 设置缓存条目
28
+ */
29
+ export interface SetCacheEntryResult {
30
+ cacheKey: string;
31
+ entry: import('../types/index.js').CacheEntry;
32
+ }
33
+ export declare function setCacheEntry(url: string, targetId: string, profile?: string, refs?: "role" | "aria"): SetCacheEntryResult;
34
+ /**
35
+ * 获取缓存条目
36
+ */
37
+ export interface GetCacheEntryResult {
38
+ entry: import('../types/index.js').CacheEntry | undefined;
39
+ found: boolean;
40
+ }
41
+ export declare function getCacheEntry(url?: string, targetId?: string, profile?: string): GetCacheEntryResult;
42
+ /**
43
+ * 处理 after_tool_call hook
44
+ */
45
+ export declare function handleAfterToolCall(event: AfterToolCallEvent): Promise<void>;
46
+ //# sourceMappingURL=after-tool-call.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"after-tool-call.d.ts","sourceRoot":"","sources":["../../src/hooks/after-tool-call.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAU5D;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAc5C;AAuBD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,aAAa,IAAI,UAAU,CAyB1C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAKnC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,mBAAmB,EAAE,UAAU,CAAC;CAC/C;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GACrB,mBAAmB,CA8BrB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,OAAO,mBAAmB,EAAE,UAAU,GAAG,SAAS,CAAC;IAC1D,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,aAAa,CAC3B,GAAG,CAAC,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,mBAAmB,CAuCrB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFlF"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * After Tool Call Hook 处理器
3
+ * 处理工具调用后的逻辑,主要是捕获snapshot结果并创建缓存
4
+ */
5
+ import { logInfo, logWarn, logError } from '../utils/logger.js';
6
+ import { hashUrl, extractDomain, shouldUseCacheUrl } from '../cache/url-normalizer.js';
7
+ import { memoryCache, MAX_CACHE_SIZE, CACHE_TTL_MS, getCacheKey } from '../cache/shared.js';
8
+ /**
9
+ * 清理过期缓存
10
+ */
11
+ export function cleanupExpiredCache() {
12
+ const now = Date.now();
13
+ let removedCount = 0;
14
+ for (const [key, entry] of memoryCache.entries()) {
15
+ if (entry.expiresAt < now) {
16
+ const age = Math.floor((now - entry.timestamp) / 1000);
17
+ logInfo(`Expired cache entry removed: ${entry.urlHash} (age: ${age}s)`);
18
+ memoryCache.delete(key);
19
+ removedCount++;
20
+ }
21
+ }
22
+ return removedCount;
23
+ }
24
+ /**
25
+ * LRU清理:移除最久未使用的缓存条目
26
+ */
27
+ function lruCleanup() {
28
+ if (memoryCache.size <= MAX_CACHE_SIZE) {
29
+ return;
30
+ }
31
+ // 按最后访问时间排序
32
+ const sortedEntries = Array.from(memoryCache.entries())
33
+ .sort(([, a], [, b]) => a.lastHit - b.lastHit);
34
+ // 移除最旧的条目
35
+ const toRemove = sortedEntries.slice(0, memoryCache.size - MAX_CACHE_SIZE);
36
+ for (const [key, entry] of toRemove) {
37
+ const timeSinceHit = Math.floor((Date.now() - entry.lastHit) / 1000);
38
+ logWarn(`LRU cleanup: removed ${entry.urlHash} (last hit: ${timeSinceHit}s ago)`);
39
+ memoryCache.delete(key);
40
+ }
41
+ }
42
+ export function getCacheStats() {
43
+ const entries = Array.from(memoryCache.values());
44
+ const profiles = new Set();
45
+ const urls = new Set();
46
+ const domains = new Set();
47
+ let totalHits = 0;
48
+ for (const entry of entries) {
49
+ if (entry.profile) {
50
+ profiles.add(entry.profile);
51
+ }
52
+ urls.add(entry.url);
53
+ domains.add(entry.domain);
54
+ totalHits += entry.hitCount;
55
+ }
56
+ return {
57
+ totalEntries: entries.length,
58
+ uniqueProfiles: profiles.size,
59
+ uniqueUrls: urls.size,
60
+ uniqueDomains: domains.size,
61
+ hits: totalHits,
62
+ avgHitCount: entries.length > 0 ? totalHits / entries.length : 0,
63
+ };
64
+ }
65
+ /**
66
+ * 清空所有缓存
67
+ */
68
+ export function clearCache() {
69
+ const count = memoryCache.size;
70
+ memoryCache.clear();
71
+ logInfo(`Cache cleared: ${count} entries removed`);
72
+ return count;
73
+ }
74
+ export function setCacheEntry(url, targetId, profile, refs) {
75
+ const urlHash = hashUrl(url);
76
+ const domain = extractDomain(url);
77
+ const cacheKey = getCacheKey(profile, urlHash);
78
+ const entry = {
79
+ url,
80
+ urlHash,
81
+ domain,
82
+ targetId,
83
+ profile,
84
+ refs,
85
+ refsCount: undefined,
86
+ snapshotFormat: undefined,
87
+ timestamp: Date.now(),
88
+ hitCount: 0,
89
+ lastHit: Date.now(),
90
+ expiresAt: Date.now() + CACHE_TTL_MS,
91
+ };
92
+ // 检查是否需要清理过期缓存
93
+ cleanupExpiredCache();
94
+ // 检查是否需要LRU清理
95
+ lruCleanup();
96
+ memoryCache.set(cacheKey, entry);
97
+ logInfo(`Cache entry created (cacheKey: ${cacheKey}, total entries: ${memoryCache.size})`);
98
+ return { cacheKey, entry };
99
+ }
100
+ export function getCacheEntry(url, targetId, profile) {
101
+ if (!url && !targetId) {
102
+ return { entry: undefined, found: false };
103
+ }
104
+ // 优先使用URL匹配
105
+ if (url) {
106
+ const urlHash = hashUrl(url);
107
+ const cacheKey = getCacheKey(profile, urlHash);
108
+ const entry = memoryCache.get(cacheKey);
109
+ if (entry) {
110
+ // 更新命中信息
111
+ entry.hitCount++;
112
+ entry.lastHit = Date.now();
113
+ return { entry, found: true };
114
+ }
115
+ }
116
+ // 回退到targetId匹配
117
+ if (targetId) {
118
+ for (const entry of memoryCache.values()) {
119
+ if (entry.targetId === targetId) {
120
+ // 如果指定了profile,需要匹配
121
+ if (profile && entry.profile !== profile) {
122
+ continue;
123
+ }
124
+ // 更新命中信息
125
+ entry.hitCount++;
126
+ entry.lastHit = Date.now();
127
+ return { entry, found: true };
128
+ }
129
+ }
130
+ }
131
+ return { entry: undefined, found: false };
132
+ }
133
+ /**
134
+ * 处理 after_tool_call hook
135
+ */
136
+ export async function handleAfterToolCall(event) {
137
+ try {
138
+ // 只处理 browser 工具的 snapshot 操作
139
+ if (event.toolName !== 'browser') {
140
+ return;
141
+ }
142
+ const params = event.params;
143
+ const action = params.action;
144
+ if (action !== 'snapshot') {
145
+ return;
146
+ }
147
+ // 提取结果数据
148
+ const result = event.result;
149
+ if (!result) {
150
+ logInfo('No result data available for snapshot');
151
+ return;
152
+ }
153
+ const details = result.details;
154
+ if (!details) {
155
+ logInfo('No details in snapshot result');
156
+ return;
157
+ }
158
+ const url = details.url;
159
+ const targetId = details.targetId;
160
+ const snapshotFormat = details.snapshotFormat;
161
+ const refs = details.refs;
162
+ if (!url || !targetId) {
163
+ logInfo('Missing required fields (url or targetId) in snapshot result');
164
+ return;
165
+ }
166
+ // 检查URL是否应该被缓存
167
+ if (!shouldUseCacheUrl(url)) {
168
+ logInfo(`URL not eligible for caching: ${url}`);
169
+ return;
170
+ }
171
+ // 提取refs数量
172
+ let refsCount;
173
+ if (snapshotFormat === 'ai' && typeof refs === 'object' && refs !== null) {
174
+ refsCount = Object.keys(refs).length;
175
+ }
176
+ const profile = details.profile;
177
+ const urlHash = hashUrl(url);
178
+ const domain = extractDomain(url);
179
+ const cacheKey = getCacheKey(profile, urlHash);
180
+ // 检查是否需要清理过期缓存
181
+ cleanupExpiredCache();
182
+ // 检查是否需要LRU清理
183
+ lruCleanup();
184
+ // 创建或更新缓存条目
185
+ const existingEntry = memoryCache.get(cacheKey);
186
+ const entry = {
187
+ url,
188
+ urlHash,
189
+ domain,
190
+ targetId,
191
+ profile,
192
+ refs: details.refs,
193
+ refsCount,
194
+ snapshotFormat,
195
+ timestamp: existingEntry?.timestamp || Date.now(),
196
+ hitCount: existingEntry?.hitCount || 0,
197
+ lastHit: Date.now(),
198
+ expiresAt: Date.now() + CACHE_TTL_MS,
199
+ };
200
+ memoryCache.set(cacheKey, entry);
201
+ logInfo(`Cache entry created from snapshot (urlHash: ${urlHash}, refsCount: ${refsCount}, total entries: ${memoryCache.size})`);
202
+ }
203
+ catch (error) {
204
+ logError('Error in after_tool_call handler', error);
205
+ }
206
+ }
207
+ //# sourceMappingURL=after-tool-call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"after-tool-call.js","sourceRoot":"","sources":["../../src/hooks/after-tool-call.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Before Tool Call Hook 处理器
3
+ * 处理工具调用前的逻辑,主要是查找缓存并注入参数
4
+ */
5
+ import type { BeforeToolCallEvent } from '../types/index.js';
6
+ /**
7
+ * 处理 before_tool_call hook
8
+ */
9
+ export declare function handleBeforeToolCall(event: BeforeToolCallEvent): Promise<{
10
+ params: Record<string, unknown>;
11
+ } | undefined>;
12
+ //# sourceMappingURL=before-tool-call.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"before-tool-call.d.ts","sourceRoot":"","sources":["../../src/hooks/before-tool-call.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAK7D;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,SAAS,CAAC,CA6F/H"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Before Tool Call Hook 处理器
3
+ * 处理工具调用前的逻辑,主要是查找缓存并注入参数
4
+ */
5
+ import { logInfo } from '../utils/logger.js';
6
+ import { hashUrl } from '../cache/url-normalizer.js';
7
+ import { getCacheKey, memoryCache } from '../cache/shared.js';
8
+ /**
9
+ * 处理 before_tool_call hook
10
+ */
11
+ export async function handleBeforeToolCall(event) {
12
+ try {
13
+ // 只处理 browser 工具
14
+ if (event.toolName !== 'browser') {
15
+ return undefined;
16
+ }
17
+ const params = event.params;
18
+ const action = params.action;
19
+ // Snapshot 操作:自动注入 snapshotFormat="ai"
20
+ if (action === 'snapshot') {
21
+ if (params.snapshotFormat === undefined) {
22
+ logInfo('Auto-injected snapshotFormat parameter: ai (was undefined)');
23
+ return {
24
+ params: {
25
+ ...params,
26
+ snapshotFormat: 'ai',
27
+ },
28
+ };
29
+ }
30
+ return undefined;
31
+ }
32
+ // 其他浏览器操作:尝试查找缓存
33
+ const url = params.url;
34
+ const targetId = params.targetId;
35
+ const profile = params.profile;
36
+ const target = params.target;
37
+ // 尝试查找缓存条目
38
+ let cacheEntry = undefined;
39
+ let matchType = '';
40
+ // 优先使用URL匹配
41
+ if (url && target === 'host') {
42
+ const urlHash = hashUrl(url);
43
+ const cacheKey = getCacheKey(profile, urlHash);
44
+ cacheEntry = memoryCache.get(cacheKey);
45
+ matchType = 'url-exact';
46
+ }
47
+ // 如果URL匹配失败,尝试targetId匹配
48
+ if (!cacheEntry && targetId) {
49
+ for (const entry of memoryCache.values()) {
50
+ if (entry.targetId === targetId) {
51
+ // 如果指定了profile,需要匹配
52
+ if (profile && entry.profile !== profile) {
53
+ continue;
54
+ }
55
+ cacheEntry = entry;
56
+ matchType = 'targetId-exact';
57
+ break;
58
+ }
59
+ }
60
+ }
61
+ // 如果targetId也失败,尝试查找最近更新的条目
62
+ if (!cacheEntry && target === 'host') {
63
+ let latestTimestamp = 0;
64
+ for (const entry of memoryCache.values()) {
65
+ if (entry.timestamp > latestTimestamp) {
66
+ latestTimestamp = entry.timestamp;
67
+ cacheEntry = entry;
68
+ matchType = 'host-latest';
69
+ }
70
+ }
71
+ }
72
+ if (cacheEntry) {
73
+ // 更新命中信息
74
+ cacheEntry.hitCount++;
75
+ cacheEntry.lastHit = Date.now();
76
+ // 构造返回参数
77
+ const newParams = { ...params };
78
+ // 如果缓存有profile而当前参数没有,注入profile
79
+ if (cacheEntry.profile && !profile) {
80
+ newParams.profile = cacheEntry.profile;
81
+ }
82
+ logInfo(`Cache hit found for ${action}: matchType=${matchType}, urlHash=${cacheEntry.urlHash}`);
83
+ return { params: newParams };
84
+ }
85
+ logInfo(`No cache hit for ${action}: url=${url || 'undefined'}, targetId=${targetId || 'undefined'}, profile=${profile || 'undefined'}`);
86
+ return undefined;
87
+ }
88
+ catch (error) {
89
+ logInfo(`Error in before_tool_call handler: ${error}`);
90
+ return undefined;
91
+ }
92
+ }
93
+ //# sourceMappingURL=before-tool-call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"before-tool-call.js","sourceRoot":"","sources":["../../src/hooks/before-tool-call.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,UAAU,iBAAiB;IACzB,YAAY,CAAC,IAAI,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KACpE,GAAG,IAAI,CAAC;IACT,EAAE,CAAC,CAAC,SAAS,MAAM,EACjB,QAAQ,EAAE,CAAC,EACX,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EACrE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3B,IAAI,CAAC;CACT;AAoFD;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAue7D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,UAAU,iBAAiB;IACzB,YAAY,CAAC,IAAI,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,OAAO,CAAC;QACpB,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KACpE,GAAG,IAAI,CAAC;IACT,EAAE,CAAC,CAAC,SAAS,MAAM,EACjB,QAAQ,EAAE,CAAC,EACX,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EACrE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3B,IAAI,CAAC;CACT;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,CA4O7D"}