page-action-cache 1.0.4 → 2.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.
- package/README.md +399 -0
- package/dist/browser-action-executor.d.ts +87 -0
- package/dist/browser-action-executor.d.ts.map +1 -0
- package/dist/browser-action-executor.js +283 -0
- package/dist/browser-action-executor.js.map +1 -0
- package/dist/cache-invalidation.d.ts +128 -0
- package/dist/cache-invalidation.d.ts.map +1 -0
- package/dist/cache-invalidation.js +262 -0
- package/dist/cache-invalidation.js.map +1 -0
- package/dist/cache-manager.d.ts +83 -0
- package/dist/cache-manager.d.ts.map +1 -0
- package/dist/cache-manager.js +184 -0
- package/dist/cache-manager.js.map +1 -0
- package/dist/index.d.ts +7 -21
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +249 -31
- package/dist/index.js.map +1 -1
- package/dist/multi-level-cache.d.ts +127 -0
- package/dist/multi-level-cache.d.ts.map +1 -0
- package/dist/multi-level-cache.js +362 -0
- package/dist/multi-level-cache.js.map +1 -0
- package/dist/scenario-recognizer.d.ts +17 -27
- package/dist/scenario-recognizer.d.ts.map +1 -1
- package/dist/scenario-recognizer.js +63 -183
- package/dist/scenario-recognizer.js.map +1 -1
- package/dist/types.d.ts +38 -312
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -4
- package/dist/types.js.map +1 -1
- package/dist/variable-extractor.d.ts +56 -0
- package/dist/variable-extractor.d.ts.map +1 -0
- package/dist/variable-extractor.js +159 -0
- package/dist/variable-extractor.js.map +1 -0
- package/openclaw.plugin.json +12 -190
- package/package.json +29 -45
- package/src/browser-action-executor.ts +337 -0
- package/src/cache-invalidation.ts +338 -0
- package/src/cache-manager.ts +211 -0
- package/src/index.ts +306 -0
- package/src/multi-level-cache.ts +478 -0
- package/src/scenario-recognizer.ts +121 -0
- package/src/types-mock.d.ts +18 -0
- package/src/types.ts +66 -0
- package/src/variable-extractor.ts +204 -0
- package/dist/actions-executor.d.ts +0 -62
- package/dist/actions-executor.d.ts.map +0 -1
- package/dist/actions-executor.js +0 -339
- package/dist/actions-executor.js.map +0 -1
- package/dist/cache-invalidator.d.ts +0 -70
- package/dist/cache-invalidator.d.ts.map +0 -1
- package/dist/cache-invalidator.js +0 -212
- package/dist/cache-invalidator.js.map +0 -1
- package/dist/cache-store.d.ts +0 -80
- package/dist/cache-store.d.ts.map +0 -1
- package/dist/cache-store.js +0 -361
- package/dist/cache-store.js.map +0 -1
- package/dist/cache-strategy.d.ts +0 -65
- package/dist/cache-strategy.d.ts.map +0 -1
- package/dist/cache-strategy.js +0 -237
- package/dist/cache-strategy.js.map +0 -1
- package/dist/hooks-entry.d.ts +0 -29
- package/dist/hooks-entry.d.ts.map +0 -1
- package/dist/hooks-entry.js +0 -83
- package/dist/hooks-entry.js.map +0 -1
- package/dist/hooks.d.ts +0 -10
- package/dist/hooks.d.ts.map +0 -1
- package/dist/hooks.js +0 -277
- package/dist/hooks.js.map +0 -1
- package/dist/security-policy.d.ts +0 -62
- package/dist/security-policy.d.ts.map +0 -1
- package/dist/security-policy.js +0 -219
- package/dist/security-policy.js.map +0 -1
- package/dist/tools.d.ts +0 -209
- package/dist/tools.d.ts.map +0 -1
- package/dist/tools.js +0 -383
- package/dist/tools.js.map +0 -1
- package/dist/ux-enhancer.d.ts +0 -60
- package/dist/ux-enhancer.d.ts.map +0 -1
- package/dist/ux-enhancer.js +0 -218
- package/dist/ux-enhancer.js.map +0 -1
- package/dist/variable-resolver.d.ts +0 -28
- package/dist/variable-resolver.d.ts.map +0 -1
- package/dist/variable-resolver.js +0 -201
- package/dist/variable-resolver.js.map +0 -1
- package/docs/API.md +0 -555
- package/docs/IMPLEMENTATION.md +0 -1792
- package/docs/INTEGRATION.md +0 -387
- package/docs/README.md +0 -183
- package/skills/page-action-cache/SKILL.md +0 -216
|
@@ -0,0 +1,127 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,362 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-level-cache.js","sourceRoot":"","sources":["../src/multi-level-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,45 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Scenario Recognizer
|
|
3
|
-
* 场景识别器 -
|
|
2
|
+
* Scenario Recognizer - Page Action Cache
|
|
3
|
+
* 场景识别器 - 识别用户操作场景
|
|
4
4
|
*/
|
|
5
|
-
import type {
|
|
5
|
+
import type { ScenarioType } from './types.js';
|
|
6
6
|
/**
|
|
7
7
|
* 场景识别器
|
|
8
8
|
*/
|
|
9
9
|
export declare class ScenarioRecognizer {
|
|
10
|
-
private cacheStore;
|
|
11
10
|
/**
|
|
12
|
-
*
|
|
11
|
+
* 通过 URL 识别场景
|
|
13
12
|
*/
|
|
14
|
-
|
|
13
|
+
recognizeByUrl(url: string): ScenarioType;
|
|
15
14
|
/**
|
|
16
|
-
*
|
|
15
|
+
* 通过页面内容识别场景
|
|
17
16
|
*/
|
|
18
|
-
|
|
17
|
+
recognizeByContent(content: string): ScenarioType;
|
|
19
18
|
/**
|
|
20
|
-
*
|
|
19
|
+
* 综合识别(URL + 内容)
|
|
21
20
|
*/
|
|
22
|
-
|
|
21
|
+
recognize(url: string, content?: string): ScenarioType;
|
|
23
22
|
/**
|
|
24
|
-
*
|
|
23
|
+
* 添加自定义场景规则
|
|
25
24
|
*/
|
|
26
|
-
|
|
25
|
+
addCustomRule(pattern: RegExp, scenario: ScenarioType): void;
|
|
27
26
|
/**
|
|
28
|
-
*
|
|
27
|
+
* 添加内容关键词
|
|
29
28
|
*/
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* 获取所有规则
|
|
33
|
-
*/
|
|
34
|
-
getRules(): ScenarioRule[];
|
|
35
|
-
/**
|
|
36
|
-
* 添加自定义规则
|
|
37
|
-
*/
|
|
38
|
-
addRule(rule: ScenarioRule): void;
|
|
39
|
-
/**
|
|
40
|
-
* 获取建议的缓存层级
|
|
41
|
-
*/
|
|
42
|
-
getRecommendedCacheLevel(scenario: string): "L3" | "L2" | "L1";
|
|
29
|
+
addContentKeyword(scenario: ScenarioType, keywords: string[]): void;
|
|
43
30
|
}
|
|
44
|
-
|
|
31
|
+
/**
|
|
32
|
+
* 单例导出
|
|
33
|
+
*/
|
|
34
|
+
export declare const scenarioRecognizer: ScenarioRecognizer;
|
|
45
35
|
//# sourceMappingURL=scenario-recognizer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenario-recognizer.d.ts","sourceRoot":"","sources":["../src/scenario-recognizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,
|
|
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"}
|