page-action-cache 2.0.8 → 2026.2.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.
- package/README.md +100 -306
- package/openclaw.plugin.json +23 -14
- package/package.json +28 -21
- package/dist/browser-action-executor.d.ts +0 -87
- package/dist/browser-action-executor.d.ts.map +0 -1
- package/dist/browser-action-executor.js +0 -283
- package/dist/browser-action-executor.js.map +0 -1
- package/dist/cache-invalidation.d.ts +0 -128
- package/dist/cache-invalidation.d.ts.map +0 -1
- package/dist/cache-invalidation.js +0 -262
- package/dist/cache-invalidation.js.map +0 -1
- package/dist/cache-manager.d.ts +0 -83
- package/dist/cache-manager.d.ts.map +0 -1
- package/dist/cache-manager.js +0 -184
- package/dist/cache-manager.js.map +0 -1
- package/dist/index.d.ts +0 -10
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -48
- package/dist/index.js.map +0 -1
- package/dist/multi-level-cache.d.ts +0 -127
- package/dist/multi-level-cache.d.ts.map +0 -1
- package/dist/multi-level-cache.js +0 -362
- package/dist/multi-level-cache.js.map +0 -1
- package/dist/scenario-recognizer.d.ts +0 -35
- package/dist/scenario-recognizer.d.ts.map +0 -1
- package/dist/scenario-recognizer.js +0 -93
- package/dist/scenario-recognizer.js.map +0 -1
- package/dist/types.d.ts +0 -62
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -6
- package/dist/types.js.map +0 -1
- package/dist/variable-extractor.d.ts +0 -56
- package/dist/variable-extractor.d.ts.map +0 -1
- package/dist/variable-extractor.js +0 -159
- package/dist/variable-extractor.js.map +0 -1
- package/src/browser-action-executor.ts +0 -337
- package/src/cache-invalidation.ts +0 -338
- package/src/cache-manager.ts +0 -211
- package/src/index.ts +0 -58
- package/src/multi-level-cache.ts +0 -478
- package/src/scenario-recognizer.ts +0 -121
- package/src/types-mock.d.ts +0 -18
- package/src/types.ts +0 -66
- package/src/variable-extractor.ts +0 -204
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Multi-Level Cache - Page Action Cache
|
|
3
|
-
* 多级缓存管理器 - L3/L2/L1 缓存层次
|
|
4
|
-
*/
|
|
5
|
-
import type { CacheEntry, ScenarioType, CacheActionType } from './types.js';
|
|
6
|
-
/**
|
|
7
|
-
* 缓存级别
|
|
8
|
-
*/
|
|
9
|
-
export type CacheLevel = 'L3' | 'L2' | 'L1';
|
|
10
|
-
/**
|
|
11
|
-
* 缓存条目扩展
|
|
12
|
-
*/
|
|
13
|
-
interface ExtendedCacheEntry extends CacheEntry {
|
|
14
|
-
level: CacheLevel;
|
|
15
|
-
createdAt: number;
|
|
16
|
-
lastAccessed: number;
|
|
17
|
-
accessCount: number;
|
|
18
|
-
expiresAt: number;
|
|
19
|
-
llmClassificationScore?: number;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* 缓存策略
|
|
23
|
-
*/
|
|
24
|
-
type CacheStrategy = 'auto' | 'l3-only' | 'l2-only' | 'l1-only';
|
|
25
|
-
/**
|
|
26
|
-
* 多级缓存管理器
|
|
27
|
-
*/
|
|
28
|
-
export declare class MultiLevelCache {
|
|
29
|
-
private levels;
|
|
30
|
-
private levelConfigs;
|
|
31
|
-
private strategy;
|
|
32
|
-
private llmThreshold;
|
|
33
|
-
constructor();
|
|
34
|
-
/**
|
|
35
|
-
* 初始化缓存级别
|
|
36
|
-
*/
|
|
37
|
-
private initializeLevels;
|
|
38
|
-
/**
|
|
39
|
-
* 设置缓存策略
|
|
40
|
-
*/
|
|
41
|
-
setStrategy(strategy: CacheStrategy): void;
|
|
42
|
-
/**
|
|
43
|
-
* 设置 LLM 分类阈值
|
|
44
|
-
*/
|
|
45
|
-
setLLMThreshold(threshold: number): void;
|
|
46
|
-
/**
|
|
47
|
-
* 添加缓存条目
|
|
48
|
-
*/
|
|
49
|
-
addCache(url: string, viewport: string, actions: Array<{
|
|
50
|
-
type: CacheActionType;
|
|
51
|
-
params?: any;
|
|
52
|
-
successCount: number;
|
|
53
|
-
failCount: number;
|
|
54
|
-
}>, scenario?: ScenarioType, llmScore?: number): string;
|
|
55
|
-
/**
|
|
56
|
-
* 确定缓存级别
|
|
57
|
-
*/
|
|
58
|
-
private determineCacheLevel;
|
|
59
|
-
/**
|
|
60
|
-
* 查询缓存
|
|
61
|
-
*/
|
|
62
|
-
queryCache(url: string, viewport: string): ExtendedCacheEntry | null;
|
|
63
|
-
/**
|
|
64
|
-
* 判断是否应该提升缓存级别
|
|
65
|
-
*/
|
|
66
|
-
private shouldPromote;
|
|
67
|
-
/**
|
|
68
|
-
* 提升缓存条目到更高级别
|
|
69
|
-
*/
|
|
70
|
-
private promoteEntry;
|
|
71
|
-
/**
|
|
72
|
-
* 确保缓存容量
|
|
73
|
-
*/
|
|
74
|
-
private ensureCapacity;
|
|
75
|
-
/**
|
|
76
|
-
* 驱逐缓存条目(LRU 策略)
|
|
77
|
-
*/
|
|
78
|
-
private evictEntry;
|
|
79
|
-
/**
|
|
80
|
-
* 删除缓存条目
|
|
81
|
-
*/
|
|
82
|
-
deleteCache(url: string, viewport: string): boolean;
|
|
83
|
-
/**
|
|
84
|
-
* 删除 URL 相关的所有缓存
|
|
85
|
-
*/
|
|
86
|
-
deleteCacheByUrl(url: string): void;
|
|
87
|
-
/**
|
|
88
|
-
* 清空指定级别的缓存
|
|
89
|
-
*/
|
|
90
|
-
clearLevel(level: CacheLevel): void;
|
|
91
|
-
/**
|
|
92
|
-
* 清空所有缓存
|
|
93
|
-
*/
|
|
94
|
-
clearAll(): void;
|
|
95
|
-
/**
|
|
96
|
-
* 获取缓存统计
|
|
97
|
-
*/
|
|
98
|
-
getStats(): {
|
|
99
|
-
totalEntries: number;
|
|
100
|
-
totalHits: number;
|
|
101
|
-
hitRate: number;
|
|
102
|
-
levelStats: Record<CacheLevel, {
|
|
103
|
-
size: number;
|
|
104
|
-
maxCapacity: number;
|
|
105
|
-
usageRate: number;
|
|
106
|
-
avgAccessCount: number;
|
|
107
|
-
}>;
|
|
108
|
-
};
|
|
109
|
-
/**
|
|
110
|
-
* 获取查询计数(用于统计)
|
|
111
|
-
*/
|
|
112
|
-
private getQueryCount;
|
|
113
|
-
/**
|
|
114
|
-
* 生成缓存键
|
|
115
|
-
*/
|
|
116
|
-
private getCacheKey;
|
|
117
|
-
/**
|
|
118
|
-
* 清理过期条目
|
|
119
|
-
*/
|
|
120
|
-
cleanupExpired(): number;
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* 单例导出
|
|
124
|
-
*/
|
|
125
|
-
export declare const multiLevelCache: MultiLevelCache;
|
|
126
|
-
export {};
|
|
127
|
-
//# sourceMappingURL=multi-level-cache.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multi-level-cache.d.ts","sourceRoot":"","sources":["../src/multi-level-cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE5E;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAa5C;;GAEG;AACH,UAAU,kBAAmB,SAAQ,UAAU;IAC7C,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;GAEG;AACH,KAAK,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhE;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAA+D;IAC7E,OAAO,CAAC,YAAY,CAAgD;IACpE,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,YAAY,CAAe;;IAMnC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAI1C;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIxC;;OAEG;IACH,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,eAAe,CAAC;QACtB,MAAM,CAAC,EAAE,GAAG,CAAC;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,EACF,QAAQ,CAAC,EAAE,YAAY,EACvB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM;IAgCT;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8B3B;;OAEG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAsCpE;;OAEG;IACH,OAAO,CAAC,aAAa;IAqBrB;;OAEG;IACH,OAAO,CAAC,YAAY;IAqBpB;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,UAAU;IAoBlB;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAcnD;;OAEG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAoBnC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IASnC;;OAEG;IACH,QAAQ,IAAI,IAAI;IAQhB;;OAEG;IACH,QAAQ,IAAI;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE;YAC7B,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC;YAClB,cAAc,EAAE,MAAM,CAAC;SACxB,CAAC,CAAC;KACJ;IAsCD;;OAEG;IACH,OAAO,CAAC,aAAa;IAUrB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,cAAc,IAAI,MAAM;CAyBzB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
|
|
@@ -1,362 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Multi-Level Cache - Page Action Cache
|
|
3
|
-
* 多级缓存管理器 - L3/L2/L1 缓存层次
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* 多级缓存管理器
|
|
7
|
-
*/
|
|
8
|
-
export class MultiLevelCache {
|
|
9
|
-
levels = new Map();
|
|
10
|
-
levelConfigs = new Map();
|
|
11
|
-
strategy = 'auto';
|
|
12
|
-
llmThreshold = 0.8;
|
|
13
|
-
constructor() {
|
|
14
|
-
this.initializeLevels();
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* 初始化缓存级别
|
|
18
|
-
*/
|
|
19
|
-
initializeLevels() {
|
|
20
|
-
// L3: 持久化缓存,最大容量,最长 TTL
|
|
21
|
-
this.levelConfigs.set('L3', {
|
|
22
|
-
level: 'L3',
|
|
23
|
-
maxSize: 1000,
|
|
24
|
-
ttl: 30 * 24 * 60 * 60 * 1000, // 30 天
|
|
25
|
-
hitPriority: 1,
|
|
26
|
-
description: '持久化缓存,适合稳定的重复操作'
|
|
27
|
-
});
|
|
28
|
-
// L2: 内存缓存,中等容量,中等 TTL
|
|
29
|
-
this.levelConfigs.set('L2', {
|
|
30
|
-
level: 'L2',
|
|
31
|
-
maxSize: 200,
|
|
32
|
-
ttl: 7 * 24 * 60 * 60 * 1000, // 7 天
|
|
33
|
-
hitPriority: 2,
|
|
34
|
-
description: '内存缓存,适合频繁访问的操作'
|
|
35
|
-
});
|
|
36
|
-
// L1: 热点缓存,小容量,短 TTL
|
|
37
|
-
this.levelConfigs.set('L1', {
|
|
38
|
-
level: 'L1',
|
|
39
|
-
maxSize: 50,
|
|
40
|
-
ttl: 1 * 24 * 60 * 60 * 1000, // 1 天
|
|
41
|
-
hitPriority: 3,
|
|
42
|
-
description: '热点缓存,适合当前会话的操作'
|
|
43
|
-
});
|
|
44
|
-
// 初始化各级缓存
|
|
45
|
-
this.levels.set('L3', new Map());
|
|
46
|
-
this.levels.set('L2', new Map());
|
|
47
|
-
this.levels.set('L1', new Map());
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* 设置缓存策略
|
|
51
|
-
*/
|
|
52
|
-
setStrategy(strategy) {
|
|
53
|
-
this.strategy = strategy;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* 设置 LLM 分类阈值
|
|
57
|
-
*/
|
|
58
|
-
setLLMThreshold(threshold) {
|
|
59
|
-
this.llmThreshold = Math.max(0, Math.min(1, threshold));
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* 添加缓存条目
|
|
63
|
-
*/
|
|
64
|
-
addCache(url, viewport, actions, scenario, llmScore) {
|
|
65
|
-
const key = this.getCacheKey(url, viewport);
|
|
66
|
-
const level = this.determineCacheLevel(scenario, llmScore);
|
|
67
|
-
const entry = {
|
|
68
|
-
id: Date.now().toString(),
|
|
69
|
-
url,
|
|
70
|
-
viewport,
|
|
71
|
-
actions,
|
|
72
|
-
scenario: scenario || 'unknown',
|
|
73
|
-
timestamp: Date.now(),
|
|
74
|
-
hitRate: 0,
|
|
75
|
-
savedActions: 0,
|
|
76
|
-
savedTime: 0,
|
|
77
|
-
level,
|
|
78
|
-
createdAt: Date.now(),
|
|
79
|
-
lastAccessed: Date.now(),
|
|
80
|
-
accessCount: 0,
|
|
81
|
-
expiresAt: Date.now() + this.levelConfigs.get(level).ttl,
|
|
82
|
-
llmClassificationScore: llmScore
|
|
83
|
-
};
|
|
84
|
-
// 确保不超过容量限制
|
|
85
|
-
this.ensureCapacity(level);
|
|
86
|
-
const cache = this.levels.get(level);
|
|
87
|
-
cache.set(key, entry);
|
|
88
|
-
console.log(`[MultiLevelCache] Added entry to ${level}: ${key}`);
|
|
89
|
-
return entry.id;
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* 确定缓存级别
|
|
93
|
-
*/
|
|
94
|
-
determineCacheLevel(scenario, llmScore) {
|
|
95
|
-
// 如果指定了特定策略
|
|
96
|
-
if (this.strategy === 'l3-only')
|
|
97
|
-
return 'L3';
|
|
98
|
-
if (this.strategy === 'l2-only')
|
|
99
|
-
return 'L2';
|
|
100
|
-
if (this.strategy === 'l1-only')
|
|
101
|
-
return 'L1';
|
|
102
|
-
// 自动策略:根据场景和 LLM 分类分数确定级别
|
|
103
|
-
if (llmScore !== undefined) {
|
|
104
|
-
if (llmScore >= this.llmThreshold) {
|
|
105
|
-
return 'L3'; // 高置信度使用 L3
|
|
106
|
-
}
|
|
107
|
-
else if (llmScore >= 0.5) {
|
|
108
|
-
return 'L2'; // 中等置信度使用 L2
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
// 根据场景确定级别
|
|
112
|
-
switch (scenario) {
|
|
113
|
-
case 'login':
|
|
114
|
-
case 'payment':
|
|
115
|
-
return 'L3'; // 敏感操作使用 L3
|
|
116
|
-
case 'search':
|
|
117
|
-
case 'checkout':
|
|
118
|
-
return 'L2'; // 重要操作使用 L2
|
|
119
|
-
default:
|
|
120
|
-
return 'L1'; // 一般操作使用 L1
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* 查询缓存
|
|
125
|
-
*/
|
|
126
|
-
queryCache(url, viewport) {
|
|
127
|
-
const key = this.getCacheKey(url, viewport);
|
|
128
|
-
// 按优先级从高到低查询
|
|
129
|
-
const levelsToCheck = ['L1', 'L2', 'L3'];
|
|
130
|
-
for (const level of levelsToCheck) {
|
|
131
|
-
if (this.strategy !== 'auto' && !this.strategy.includes(level)) {
|
|
132
|
-
continue;
|
|
133
|
-
}
|
|
134
|
-
const cache = this.levels.get(level);
|
|
135
|
-
if (!cache)
|
|
136
|
-
continue;
|
|
137
|
-
const entry = cache.get(key);
|
|
138
|
-
if (entry) {
|
|
139
|
-
// 检查是否过期
|
|
140
|
-
if (Date.now() > entry.expiresAt) {
|
|
141
|
-
cache.delete(key);
|
|
142
|
-
continue;
|
|
143
|
-
}
|
|
144
|
-
// 更新访问统计
|
|
145
|
-
entry.lastAccessed = Date.now();
|
|
146
|
-
entry.accessCount++;
|
|
147
|
-
// 如果不是当前最高级别,考虑提升
|
|
148
|
-
if (this.shouldPromote(entry, level)) {
|
|
149
|
-
this.promoteEntry(entry, level);
|
|
150
|
-
}
|
|
151
|
-
return entry;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return null;
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* 判断是否应该提升缓存级别
|
|
158
|
-
*/
|
|
159
|
-
shouldPromote(entry, currentLevel) {
|
|
160
|
-
if (currentLevel === 'L3')
|
|
161
|
-
return false;
|
|
162
|
-
// 访问次数超过阈值则提升
|
|
163
|
-
const accessThreshold = currentLevel === 'L1' ? 5 : 10;
|
|
164
|
-
if (entry.accessCount >= accessThreshold) {
|
|
165
|
-
return true;
|
|
166
|
-
}
|
|
167
|
-
// 成功率高且场景重要则提升
|
|
168
|
-
const totalAttempts = entry.actions.reduce((sum, a) => sum + a.successCount + a.failCount, 0);
|
|
169
|
-
if (totalAttempts > 0) {
|
|
170
|
-
const successRate = entry.actions.reduce((sum, a) => sum + a.successCount, 0) / totalAttempts;
|
|
171
|
-
if (successRate > 0.9 && (entry.scenario === 'login' || entry.scenario === 'payment')) {
|
|
172
|
-
return true;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
return false;
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* 提升缓存条目到更高级别
|
|
179
|
-
*/
|
|
180
|
-
promoteEntry(entry, fromLevel) {
|
|
181
|
-
const targetLevel = fromLevel === 'L1' ? 'L2' : 'L3';
|
|
182
|
-
const sourceCache = this.levels.get(fromLevel);
|
|
183
|
-
const targetCache = this.levels.get(targetLevel);
|
|
184
|
-
if (!sourceCache || !targetCache) {
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
187
|
-
const key = this.getCacheKey(entry.url, entry.viewport || '');
|
|
188
|
-
sourceCache.delete(key);
|
|
189
|
-
entry.level = targetLevel;
|
|
190
|
-
entry.expiresAt = Date.now() + this.levelConfigs.get(targetLevel).ttl;
|
|
191
|
-
this.ensureCapacity(targetLevel);
|
|
192
|
-
targetCache.set(key, entry);
|
|
193
|
-
console.log(`[MultiLevelCache] Promoted entry from ${fromLevel} to ${targetLevel}: ${key}`);
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* 确保缓存容量
|
|
197
|
-
*/
|
|
198
|
-
ensureCapacity(level) {
|
|
199
|
-
const config = this.levelConfigs.get(level);
|
|
200
|
-
if (!config)
|
|
201
|
-
return;
|
|
202
|
-
const cache = this.levels.get(level);
|
|
203
|
-
if (!cache)
|
|
204
|
-
return;
|
|
205
|
-
while (cache.size >= config.maxSize) {
|
|
206
|
-
this.evictEntry(level);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* 驱逐缓存条目(LRU 策略)
|
|
211
|
-
*/
|
|
212
|
-
evictEntry(level) {
|
|
213
|
-
const cache = this.levels.get(level);
|
|
214
|
-
if (!cache || cache.size === 0)
|
|
215
|
-
return;
|
|
216
|
-
let oldestKey = null;
|
|
217
|
-
let oldestTime = Infinity;
|
|
218
|
-
for (const [key, entry] of cache.entries()) {
|
|
219
|
-
if (entry.lastAccessed < oldestTime) {
|
|
220
|
-
oldestTime = entry.lastAccessed;
|
|
221
|
-
oldestKey = key;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
if (oldestKey) {
|
|
225
|
-
cache.delete(oldestKey);
|
|
226
|
-
console.log(`[MultiLevelCache] Evicted entry from ${level}: ${oldestKey}`);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* 删除缓存条目
|
|
231
|
-
*/
|
|
232
|
-
deleteCache(url, viewport) {
|
|
233
|
-
const key = this.getCacheKey(url, viewport);
|
|
234
|
-
let deleted = false;
|
|
235
|
-
for (const [level, cache] of this.levels.entries()) {
|
|
236
|
-
if (cache.delete(key)) {
|
|
237
|
-
deleted = true;
|
|
238
|
-
console.log(`[MultiLevelCache] Deleted entry from ${level}: ${key}`);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
return deleted;
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* 删除 URL 相关的所有缓存
|
|
245
|
-
*/
|
|
246
|
-
deleteCacheByUrl(url) {
|
|
247
|
-
const urlPrefix = `${url}:`;
|
|
248
|
-
for (const [_level, cache] of this.levels.entries()) {
|
|
249
|
-
const keysToDelete = [];
|
|
250
|
-
for (const key of cache.keys()) {
|
|
251
|
-
if (key.startsWith(urlPrefix)) {
|
|
252
|
-
keysToDelete.push(key);
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
for (const key of keysToDelete) {
|
|
256
|
-
cache.delete(key);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
console.log(`[MultiLevelCache] Deleted cache entries for URL: ${url}`);
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* 清空指定级别的缓存
|
|
263
|
-
*/
|
|
264
|
-
clearLevel(level) {
|
|
265
|
-
const cache = this.levels.get(level);
|
|
266
|
-
if (cache) {
|
|
267
|
-
const count = cache.size;
|
|
268
|
-
cache.clear();
|
|
269
|
-
console.log(`[MultiLevelCache] Cleared ${count} entries from ${level}`);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* 清空所有缓存
|
|
274
|
-
*/
|
|
275
|
-
clearAll() {
|
|
276
|
-
for (const [level, cache] of this.levels.entries()) {
|
|
277
|
-
const count = cache.size;
|
|
278
|
-
cache.clear();
|
|
279
|
-
console.log(`[MultiLevelCache] Cleared ${count} entries from ${level}`);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* 获取缓存统计
|
|
284
|
-
*/
|
|
285
|
-
getStats() {
|
|
286
|
-
let totalEntries = 0;
|
|
287
|
-
let totalHits = 0;
|
|
288
|
-
const levelStats = {};
|
|
289
|
-
for (const [level, cache] of this.levels.entries()) {
|
|
290
|
-
const config = this.levelConfigs.get(level);
|
|
291
|
-
totalEntries += cache.size;
|
|
292
|
-
let levelHits = 0;
|
|
293
|
-
let totalAccess = 0;
|
|
294
|
-
for (const entry of cache.values()) {
|
|
295
|
-
totalHits += entry.accessCount;
|
|
296
|
-
levelHits += entry.accessCount;
|
|
297
|
-
totalAccess += entry.accessCount;
|
|
298
|
-
}
|
|
299
|
-
levelStats[level] = {
|
|
300
|
-
size: cache.size,
|
|
301
|
-
maxCapacity: config.maxSize,
|
|
302
|
-
usageRate: cache.size / config.maxSize,
|
|
303
|
-
avgAccessCount: cache.size > 0 ? levelHits / cache.size : 0
|
|
304
|
-
};
|
|
305
|
-
}
|
|
306
|
-
// 计算命中率
|
|
307
|
-
const totalQueries = this.getQueryCount();
|
|
308
|
-
const hitRate = totalQueries > 0 ? (totalHits / totalQueries) * 100 : 0;
|
|
309
|
-
return {
|
|
310
|
-
totalEntries,
|
|
311
|
-
totalHits,
|
|
312
|
-
hitRate: Math.round(hitRate * 100) / 100,
|
|
313
|
-
levelStats
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
/**
|
|
317
|
-
* 获取查询计数(用于统计)
|
|
318
|
-
*/
|
|
319
|
-
getQueryCount() {
|
|
320
|
-
let count = 0;
|
|
321
|
-
for (const cache of this.levels.values()) {
|
|
322
|
-
for (const entry of cache.values()) {
|
|
323
|
-
count += entry.accessCount;
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
return count || 1; // 避免除以零
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* 生成缓存键
|
|
330
|
-
*/
|
|
331
|
-
getCacheKey(url, viewport) {
|
|
332
|
-
return `${url}:${viewport}`;
|
|
333
|
-
}
|
|
334
|
-
/**
|
|
335
|
-
* 清理过期条目
|
|
336
|
-
*/
|
|
337
|
-
cleanupExpired() {
|
|
338
|
-
let cleaned = 0;
|
|
339
|
-
const now = Date.now();
|
|
340
|
-
for (const [_level, cache] of this.levels.entries()) {
|
|
341
|
-
const expiredKeys = [];
|
|
342
|
-
for (const [key, entry] of cache.entries()) {
|
|
343
|
-
if (now > entry.expiresAt) {
|
|
344
|
-
expiredKeys.push(key);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
for (const key of expiredKeys) {
|
|
348
|
-
cache.delete(key);
|
|
349
|
-
cleaned++;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
if (cleaned > 0) {
|
|
353
|
-
console.log(`[MultiLevelCache] Cleaned up ${cleaned} expired entries`);
|
|
354
|
-
}
|
|
355
|
-
return cleaned;
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* 单例导出
|
|
360
|
-
*/
|
|
361
|
-
export const multiLevelCache = new MultiLevelCache();
|
|
362
|
-
//# sourceMappingURL=multi-level-cache.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"multi-level-cache.js","sourceRoot":"","sources":["../src/multi-level-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Scenario Recognizer - Page Action Cache
|
|
3
|
-
* 场景识别器 - 识别用户操作场景
|
|
4
|
-
*/
|
|
5
|
-
import type { ScenarioType } from './types.js';
|
|
6
|
-
/**
|
|
7
|
-
* 场景识别器
|
|
8
|
-
*/
|
|
9
|
-
export declare class ScenarioRecognizer {
|
|
10
|
-
/**
|
|
11
|
-
* 通过 URL 识别场景
|
|
12
|
-
*/
|
|
13
|
-
recognizeByUrl(url: string): ScenarioType;
|
|
14
|
-
/**
|
|
15
|
-
* 通过页面内容识别场景
|
|
16
|
-
*/
|
|
17
|
-
recognizeByContent(content: string): ScenarioType;
|
|
18
|
-
/**
|
|
19
|
-
* 综合识别(URL + 内容)
|
|
20
|
-
*/
|
|
21
|
-
recognize(url: string, content?: string): ScenarioType;
|
|
22
|
-
/**
|
|
23
|
-
* 添加自定义场景规则
|
|
24
|
-
*/
|
|
25
|
-
addCustomRule(pattern: RegExp, scenario: ScenarioType): void;
|
|
26
|
-
/**
|
|
27
|
-
* 添加内容关键词
|
|
28
|
-
*/
|
|
29
|
-
addContentKeyword(scenario: ScenarioType, keywords: string[]): void;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* 单例导出
|
|
33
|
-
*/
|
|
34
|
-
export declare const scenarioRecognizer: ScenarioRecognizer;
|
|
35
|
-
//# sourceMappingURL=scenario-recognizer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scenario-recognizer.d.ts","sourceRoot":"","sources":["../src/scenario-recognizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA0C/C;;GAEG;AACH,qBAAa,kBAAkB;IAC7B;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY;IASzC;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY;IAiBjD;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,YAAY;IActD;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAI5D;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI;CAKpE;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Scenario Recognizer - Page Action Cache
|
|
3
|
-
* 场景识别器 - 识别用户操作场景
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* 场景识别规则
|
|
7
|
-
*/
|
|
8
|
-
const SCENARIO_PATTERNS = [
|
|
9
|
-
// 登录场景
|
|
10
|
-
{ pattern: /(login|signin|auth|oauth|sso|account|register|signup)/i, scenario: 'login' },
|
|
11
|
-
// 搜索场景
|
|
12
|
-
{ pattern: /(search|query|find|explore|discover)/i, scenario: 'search' },
|
|
13
|
-
// 支付场景
|
|
14
|
-
{ pattern: /(payment|pay|checkout|billing|invoice|transaction)/i, scenario: 'payment' },
|
|
15
|
-
// 结账场景
|
|
16
|
-
{ pattern: /(cart|basket|order|purchase|buy)/i, scenario: 'checkout' },
|
|
17
|
-
// 电商场景
|
|
18
|
-
{ pattern: /(shop|store|product|item|goods|marketplace)/i, scenario: 'checkout' }
|
|
19
|
-
];
|
|
20
|
-
/**
|
|
21
|
-
* 页面内容关键词
|
|
22
|
-
*/
|
|
23
|
-
const CONTENT_KEYWORDS = {
|
|
24
|
-
login: ['username', 'password', 'email', 'phone', '登录', '密码', '用户名', '邮箱', '手机号', 'sign in', 'log in'],
|
|
25
|
-
search: ['search', 'query', '查找', '搜索', '输入', 'input'],
|
|
26
|
-
payment: ['credit card', 'debit card', 'payment method', '银行卡', '信用卡', '支付方式', 'cvv', 'expiry'],
|
|
27
|
-
checkout: ['cart', 'total', 'subtotal', 'shipping', '购物车', '总计', '运费', '收货地址'],
|
|
28
|
-
general: [],
|
|
29
|
-
unknown: []
|
|
30
|
-
};
|
|
31
|
-
/**
|
|
32
|
-
* 场景识别器
|
|
33
|
-
*/
|
|
34
|
-
export class ScenarioRecognizer {
|
|
35
|
-
/**
|
|
36
|
-
* 通过 URL 识别场景
|
|
37
|
-
*/
|
|
38
|
-
recognizeByUrl(url) {
|
|
39
|
-
for (const { pattern, scenario } of SCENARIO_PATTERNS) {
|
|
40
|
-
if (pattern.test(url)) {
|
|
41
|
-
return scenario;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return 'general';
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* 通过页面内容识别场景
|
|
48
|
-
*/
|
|
49
|
-
recognizeByContent(content) {
|
|
50
|
-
const lowerContent = content.toLowerCase();
|
|
51
|
-
for (const [scenario, keywords] of Object.entries(CONTENT_KEYWORDS)) {
|
|
52
|
-
if (keywords.length > 0) {
|
|
53
|
-
const matchedKeywords = keywords.filter(keyword => lowerContent.includes(keyword.toLowerCase()));
|
|
54
|
-
if (matchedKeywords.length >= 2) {
|
|
55
|
-
return scenario;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return 'general';
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* 综合识别(URL + 内容)
|
|
63
|
-
*/
|
|
64
|
-
recognize(url, content) {
|
|
65
|
-
const urlScenario = this.recognizeByUrl(url);
|
|
66
|
-
if (urlScenario !== 'general' && urlScenario !== 'unknown') {
|
|
67
|
-
return urlScenario;
|
|
68
|
-
}
|
|
69
|
-
if (content) {
|
|
70
|
-
return this.recognizeByContent(content);
|
|
71
|
-
}
|
|
72
|
-
return urlScenario;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* 添加自定义场景规则
|
|
76
|
-
*/
|
|
77
|
-
addCustomRule(pattern, scenario) {
|
|
78
|
-
SCENARIO_PATTERNS.unshift({ pattern, scenario });
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* 添加内容关键词
|
|
82
|
-
*/
|
|
83
|
-
addContentKeyword(scenario, keywords) {
|
|
84
|
-
if (CONTENT_KEYWORDS[scenario]) {
|
|
85
|
-
CONTENT_KEYWORDS[scenario].push(...keywords);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* 单例导出
|
|
91
|
-
*/
|
|
92
|
-
export const scenarioRecognizer = new ScenarioRecognizer();
|
|
93
|
-
//# sourceMappingURL=scenario-recognizer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scenario-recognizer.js","sourceRoot":"","sources":["../src/scenario-recognizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;GAEG;AACH,MAAM,iBAAiB,GAAiB;IACtC,OAAO;IACP,EAAE,OAAO,EAAE,wDAAwD,EAAE,QAAQ,EAAE,OAAO,EAAE;IAExF,OAAO;IACP,EAAE,OAAO,EAAE,uCAAuC,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAExE,OAAO;IACP,EAAE,OAAO,EAAE,qDAAqD,EAAE,QAAQ,EAAE,SAAS,EAAE;IAEvF,OAAO;IACP,EAAE,OAAO,EAAE,mCAAmC,EAAE,QAAQ,EAAE,UAAU,EAAE;IAEtE,OAAO;IACP,EAAE,OAAO,EAAE,8CAA8C,EAAE,QAAQ,EAAE,UAAU,EAAE;CAClF,CAAC;AAEF;;GAEG;AACH,MAAM,gBAAgB,GAAmC;IACvD,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC;IACtG,MAAM,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC;IACtD,OAAO,EAAE,CAAC,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;IAC/F,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC;IAC9E,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAC7B;;OAEG;IACH,cAAc,CAAC,GAAW;QACxB,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,iBAAiB,EAAE,CAAC;YACtD,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,OAAe;QAChC,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAE3C,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACpE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAChD,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAC7C,CAAC;gBACF,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBAChC,OAAO,QAAwB,CAAC;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,GAAW,EAAE,OAAgB;QACrC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAE7C,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC3D,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,OAAe,EAAE,QAAsB;QACnD,iBAAiB,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,QAAsB,EAAE,QAAkB;QAC1D,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,EAAE,CAAC"}
|