@lov3kaizen/agentsea-cache 0.5.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/LICENSE +21 -0
- package/README.md +323 -0
- package/dist/BaseMatchStrategy-1E1SHaUt.d.ts +60 -0
- package/dist/SemanticCache-vysguwUQ.d.ts +65 -0
- package/dist/SimilarityEngine-Cwv_mF9a.d.ts +41 -0
- package/dist/analytics/index.d.ts +123 -0
- package/dist/analytics/index.js +275 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/cache.types-DMuyQseO.d.ts +99 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.js +3301 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/agentsea/index.d.ts +103 -0
- package/dist/integrations/agentsea/index.js +201 -0
- package/dist/integrations/agentsea/index.js.map +1 -0
- package/dist/integrations/gateway/index.d.ts +98 -0
- package/dist/integrations/gateway/index.js +205 -0
- package/dist/integrations/gateway/index.js.map +1 -0
- package/dist/invalidation/index.d.ts +113 -0
- package/dist/invalidation/index.js +360 -0
- package/dist/invalidation/index.js.map +1 -0
- package/dist/store.types-BQy5Yyz9.d.ts +111 -0
- package/dist/stores/index.d.ts +138 -0
- package/dist/stores/index.js +1147 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/strategies/index.d.ts +36 -0
- package/dist/strategies/index.js +280 -0
- package/dist/strategies/index.js.map +1 -0
- package/dist/streaming/index.d.ts +206 -0
- package/dist/streaming/index.js +794 -0
- package/dist/streaming/index.js.map +1 -0
- package/package.json +108 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import EventEmitter from 'eventemitter3';
|
|
2
|
+
import { B as BaseCacheStore } from '../store.types-BQy5Yyz9.js';
|
|
3
|
+
import '../cache.types-DMuyQseO.js';
|
|
4
|
+
|
|
5
|
+
type InvalidationStrategyType = 'ttl' | 'lru' | 'event' | 'smart' | 'manual';
|
|
6
|
+
interface BaseInvalidationConfig {
|
|
7
|
+
type: InvalidationStrategyType;
|
|
8
|
+
autoRun?: boolean;
|
|
9
|
+
checkIntervalMs?: number;
|
|
10
|
+
}
|
|
11
|
+
interface TTLInvalidationConfig extends BaseInvalidationConfig {
|
|
12
|
+
type: 'ttl';
|
|
13
|
+
defaultTtl: number;
|
|
14
|
+
modelTtls?: Record<string, number>;
|
|
15
|
+
namespaceTtls?: Record<string, number>;
|
|
16
|
+
softTtl?: boolean;
|
|
17
|
+
gracePeriod?: number;
|
|
18
|
+
}
|
|
19
|
+
interface LRUInvalidationConfig extends BaseInvalidationConfig {
|
|
20
|
+
type: 'lru';
|
|
21
|
+
maxEntries: number;
|
|
22
|
+
maxSizeBytes?: number;
|
|
23
|
+
evictionBatchSize?: number;
|
|
24
|
+
minAge?: number;
|
|
25
|
+
}
|
|
26
|
+
interface EventInvalidationConfig extends BaseInvalidationConfig {
|
|
27
|
+
type: 'event';
|
|
28
|
+
events: string[];
|
|
29
|
+
patterns?: InvalidationPattern[];
|
|
30
|
+
propagate?: boolean;
|
|
31
|
+
}
|
|
32
|
+
interface InvalidationPattern {
|
|
33
|
+
event: string | RegExp;
|
|
34
|
+
keyPattern: string | RegExp;
|
|
35
|
+
namespace?: string;
|
|
36
|
+
model?: string;
|
|
37
|
+
}
|
|
38
|
+
interface SmartInvalidationConfig extends BaseInvalidationConfig {
|
|
39
|
+
type: 'smart';
|
|
40
|
+
detectStaleness?: boolean;
|
|
41
|
+
analyzeHitRate?: boolean;
|
|
42
|
+
minHitRate?: number;
|
|
43
|
+
learnAccessPatterns?: boolean;
|
|
44
|
+
historicalWindowHours?: number;
|
|
45
|
+
}
|
|
46
|
+
interface InvalidationEvent {
|
|
47
|
+
timestamp: number;
|
|
48
|
+
keys: string[];
|
|
49
|
+
reason: 'ttl' | 'lru' | 'event' | 'smart' | 'manual';
|
|
50
|
+
entriesRemoved: number;
|
|
51
|
+
bytesFreed: number;
|
|
52
|
+
metadata?: Record<string, unknown>;
|
|
53
|
+
}
|
|
54
|
+
interface InvalidationResult {
|
|
55
|
+
invalidatedKeys: string[];
|
|
56
|
+
entriesRemoved: number;
|
|
57
|
+
bytesFreed: number;
|
|
58
|
+
durationMs: number;
|
|
59
|
+
errors?: string[];
|
|
60
|
+
}
|
|
61
|
+
interface InvalidationManagerConfig {
|
|
62
|
+
strategy: InvalidationStrategyType;
|
|
63
|
+
ttl?: Omit<TTLInvalidationConfig, 'type'>;
|
|
64
|
+
lru?: Omit<LRUInvalidationConfig, 'type'>;
|
|
65
|
+
event?: Omit<EventInvalidationConfig, 'type'>;
|
|
66
|
+
smart?: Omit<SmartInvalidationConfig, 'type'>;
|
|
67
|
+
emitEvents?: boolean;
|
|
68
|
+
onInvalidate?: (event: InvalidationEvent) => void;
|
|
69
|
+
}
|
|
70
|
+
interface InvalidationStats {
|
|
71
|
+
totalInvalidations: number;
|
|
72
|
+
ttlRemovals: number;
|
|
73
|
+
lruRemovals: number;
|
|
74
|
+
eventRemovals: number;
|
|
75
|
+
smartRemovals: number;
|
|
76
|
+
manualRemovals: number;
|
|
77
|
+
totalBytesFreed: number;
|
|
78
|
+
lastInvalidationAt?: number;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
interface InvalidationManagerEvents {
|
|
82
|
+
invalidate: (event: InvalidationEvent) => void;
|
|
83
|
+
error: (error: Error) => void;
|
|
84
|
+
}
|
|
85
|
+
declare class InvalidationManager extends EventEmitter<InvalidationManagerEvents> {
|
|
86
|
+
private store;
|
|
87
|
+
private config;
|
|
88
|
+
private autoInterval;
|
|
89
|
+
private stats;
|
|
90
|
+
private accessTimes;
|
|
91
|
+
constructor(store: BaseCacheStore, config?: InvalidationManagerConfig);
|
|
92
|
+
run(): Promise<InvalidationResult>;
|
|
93
|
+
runTTLInvalidation(): Promise<InvalidationResult>;
|
|
94
|
+
runLRUInvalidation(): Promise<InvalidationResult>;
|
|
95
|
+
runSmartInvalidation(): Promise<InvalidationResult>;
|
|
96
|
+
invalidateKeys(keys: string[]): Promise<InvalidationResult>;
|
|
97
|
+
invalidateByPattern(options: {
|
|
98
|
+
namespace?: string;
|
|
99
|
+
model?: string;
|
|
100
|
+
olderThan?: number;
|
|
101
|
+
}): Promise<InvalidationResult>;
|
|
102
|
+
startAuto(intervalMs?: number): void;
|
|
103
|
+
stopAuto(): void;
|
|
104
|
+
getStats(): InvalidationStats;
|
|
105
|
+
resetStats(): void;
|
|
106
|
+
destroy(): void;
|
|
107
|
+
private getTTL;
|
|
108
|
+
private estimateEntrySize;
|
|
109
|
+
private emitEvent;
|
|
110
|
+
}
|
|
111
|
+
declare function createInvalidationManager(store: BaseCacheStore, config?: InvalidationManagerConfig): InvalidationManager;
|
|
112
|
+
|
|
113
|
+
export { type BaseInvalidationConfig, type EventInvalidationConfig, type InvalidationEvent, InvalidationManager, type InvalidationManagerConfig, type InvalidationManagerEvents, type InvalidationPattern, type InvalidationResult, type InvalidationStats, type InvalidationStrategyType, type LRUInvalidationConfig, type SmartInvalidationConfig, type TTLInvalidationConfig, createInvalidationManager };
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import EventEmitter from 'eventemitter3';
|
|
2
|
+
import 'nanoid';
|
|
3
|
+
|
|
4
|
+
// src/invalidation/InvalidationManager.ts
|
|
5
|
+
function now() {
|
|
6
|
+
return Date.now();
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// src/invalidation/InvalidationManager.ts
|
|
10
|
+
var DEFAULT_CONFIG = {
|
|
11
|
+
strategy: "ttl",
|
|
12
|
+
ttl: {
|
|
13
|
+
defaultTtl: 3600,
|
|
14
|
+
softTtl: false
|
|
15
|
+
},
|
|
16
|
+
emitEvents: true
|
|
17
|
+
};
|
|
18
|
+
var InvalidationManager = class extends EventEmitter {
|
|
19
|
+
store;
|
|
20
|
+
config;
|
|
21
|
+
autoInterval = null;
|
|
22
|
+
stats = {
|
|
23
|
+
totalInvalidations: 0,
|
|
24
|
+
ttlRemovals: 0,
|
|
25
|
+
lruRemovals: 0,
|
|
26
|
+
eventRemovals: 0,
|
|
27
|
+
smartRemovals: 0,
|
|
28
|
+
manualRemovals: 0,
|
|
29
|
+
totalBytesFreed: 0
|
|
30
|
+
};
|
|
31
|
+
accessTimes = /* @__PURE__ */ new Map();
|
|
32
|
+
constructor(store, config) {
|
|
33
|
+
super();
|
|
34
|
+
this.store = store;
|
|
35
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Run invalidation based on configured strategy
|
|
39
|
+
*/
|
|
40
|
+
async run() {
|
|
41
|
+
switch (this.config.strategy) {
|
|
42
|
+
case "ttl":
|
|
43
|
+
return this.runTTLInvalidation();
|
|
44
|
+
case "lru":
|
|
45
|
+
return this.runLRUInvalidation();
|
|
46
|
+
case "smart":
|
|
47
|
+
return this.runSmartInvalidation();
|
|
48
|
+
default:
|
|
49
|
+
return this.runTTLInvalidation();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Run TTL-based invalidation
|
|
54
|
+
*/
|
|
55
|
+
async runTTLInvalidation() {
|
|
56
|
+
const startTime = performance.now();
|
|
57
|
+
const invalidatedKeys = [];
|
|
58
|
+
let bytesFreed = 0;
|
|
59
|
+
const currentTime = now();
|
|
60
|
+
const keys = await this.store.keys();
|
|
61
|
+
for (const key of keys) {
|
|
62
|
+
const entry = await this.store.get(key);
|
|
63
|
+
if (!entry) continue;
|
|
64
|
+
const ttl = entry.metadata.ttl ?? this.getTTL(entry.request.model, entry.metadata.namespace);
|
|
65
|
+
const age = (currentTime - entry.metadata.createdAt) / 1e3;
|
|
66
|
+
if (age >= ttl) {
|
|
67
|
+
if (this.config.ttl?.softTtl && this.config.ttl?.gracePeriod) {
|
|
68
|
+
if (age < ttl + this.config.ttl.gracePeriod) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const deleted = await this.store.delete(key);
|
|
73
|
+
if (deleted) {
|
|
74
|
+
invalidatedKeys.push(key);
|
|
75
|
+
bytesFreed += this.estimateEntrySize(entry);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
this.stats.totalInvalidations++;
|
|
80
|
+
this.stats.ttlRemovals += invalidatedKeys.length;
|
|
81
|
+
this.stats.totalBytesFreed += bytesFreed;
|
|
82
|
+
this.stats.lastInvalidationAt = now();
|
|
83
|
+
const result = {
|
|
84
|
+
invalidatedKeys,
|
|
85
|
+
entriesRemoved: invalidatedKeys.length,
|
|
86
|
+
bytesFreed,
|
|
87
|
+
durationMs: performance.now() - startTime
|
|
88
|
+
};
|
|
89
|
+
this.emitEvent("ttl", invalidatedKeys, bytesFreed);
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Run LRU-based invalidation
|
|
94
|
+
*/
|
|
95
|
+
async runLRUInvalidation() {
|
|
96
|
+
const startTime = performance.now();
|
|
97
|
+
const invalidatedKeys = [];
|
|
98
|
+
let bytesFreed = 0;
|
|
99
|
+
const maxEntries = this.config.lru?.maxEntries ?? 1e3;
|
|
100
|
+
this.config.lru?.maxSizeBytes ?? Infinity;
|
|
101
|
+
const batchSize = this.config.lru?.evictionBatchSize ?? 10;
|
|
102
|
+
const minAge = this.config.lru?.minAge ?? 0;
|
|
103
|
+
const currentSize = await this.store.size();
|
|
104
|
+
if (currentSize <= maxEntries) {
|
|
105
|
+
return {
|
|
106
|
+
invalidatedKeys: [],
|
|
107
|
+
entriesRemoved: 0,
|
|
108
|
+
bytesFreed: 0,
|
|
109
|
+
durationMs: performance.now() - startTime
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const keys = await this.store.keys();
|
|
113
|
+
const entriesWithAccess = [];
|
|
114
|
+
for (const key of keys) {
|
|
115
|
+
const entry = await this.store.get(key);
|
|
116
|
+
if (entry) {
|
|
117
|
+
entriesWithAccess.push({
|
|
118
|
+
key,
|
|
119
|
+
accessedAt: entry.metadata.accessedAt,
|
|
120
|
+
size: this.estimateEntrySize(entry)
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
entriesWithAccess.sort((a, b) => a.accessedAt - b.accessedAt);
|
|
125
|
+
const toRemove = Math.min(currentSize - maxEntries, batchSize);
|
|
126
|
+
const currentTime = now();
|
|
127
|
+
for (let i = 0; i < toRemove && i < entriesWithAccess.length; i++) {
|
|
128
|
+
const { key, accessedAt, size } = entriesWithAccess[i];
|
|
129
|
+
const age = (currentTime - accessedAt) / 1e3;
|
|
130
|
+
if (age < minAge) continue;
|
|
131
|
+
const deleted = await this.store.delete(key);
|
|
132
|
+
if (deleted) {
|
|
133
|
+
invalidatedKeys.push(key);
|
|
134
|
+
bytesFreed += size;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
this.stats.totalInvalidations++;
|
|
138
|
+
this.stats.lruRemovals += invalidatedKeys.length;
|
|
139
|
+
this.stats.totalBytesFreed += bytesFreed;
|
|
140
|
+
this.stats.lastInvalidationAt = now();
|
|
141
|
+
const result = {
|
|
142
|
+
invalidatedKeys,
|
|
143
|
+
entriesRemoved: invalidatedKeys.length,
|
|
144
|
+
bytesFreed,
|
|
145
|
+
durationMs: performance.now() - startTime
|
|
146
|
+
};
|
|
147
|
+
this.emitEvent("lru", invalidatedKeys, bytesFreed);
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Run smart invalidation (combines TTL + LRU + hit rate analysis)
|
|
152
|
+
*/
|
|
153
|
+
async runSmartInvalidation() {
|
|
154
|
+
const startTime = performance.now();
|
|
155
|
+
const invalidatedKeys = [];
|
|
156
|
+
let bytesFreed = 0;
|
|
157
|
+
const minHitRate = this.config.smart?.minHitRate ?? 0.1;
|
|
158
|
+
const currentTime = now();
|
|
159
|
+
const keys = await this.store.keys();
|
|
160
|
+
for (const key of keys) {
|
|
161
|
+
const entry = await this.store.get(key);
|
|
162
|
+
if (!entry) continue;
|
|
163
|
+
let shouldInvalidate = false;
|
|
164
|
+
const ttl = entry.metadata.ttl ?? this.getTTL(entry.request.model, entry.metadata.namespace);
|
|
165
|
+
const age = (currentTime - entry.metadata.createdAt) / 1e3;
|
|
166
|
+
if (age >= ttl) {
|
|
167
|
+
shouldInvalidate = true;
|
|
168
|
+
}
|
|
169
|
+
if (this.config.smart?.analyzeHitRate && entry.metadata.accessCount > 0) {
|
|
170
|
+
const accessRate = entry.metadata.accessCount / Math.max(age / 3600, 1);
|
|
171
|
+
if (accessRate < minHitRate) {
|
|
172
|
+
shouldInvalidate = true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (shouldInvalidate) {
|
|
176
|
+
const deleted = await this.store.delete(key);
|
|
177
|
+
if (deleted) {
|
|
178
|
+
invalidatedKeys.push(key);
|
|
179
|
+
bytesFreed += this.estimateEntrySize(entry);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
this.stats.totalInvalidations++;
|
|
184
|
+
this.stats.smartRemovals += invalidatedKeys.length;
|
|
185
|
+
this.stats.totalBytesFreed += bytesFreed;
|
|
186
|
+
this.stats.lastInvalidationAt = now();
|
|
187
|
+
const result = {
|
|
188
|
+
invalidatedKeys,
|
|
189
|
+
entriesRemoved: invalidatedKeys.length,
|
|
190
|
+
bytesFreed,
|
|
191
|
+
durationMs: performance.now() - startTime
|
|
192
|
+
};
|
|
193
|
+
this.emitEvent("smart", invalidatedKeys, bytesFreed);
|
|
194
|
+
return result;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Manually invalidate specific keys
|
|
198
|
+
*/
|
|
199
|
+
async invalidateKeys(keys) {
|
|
200
|
+
const startTime = performance.now();
|
|
201
|
+
const invalidatedKeys = [];
|
|
202
|
+
let bytesFreed = 0;
|
|
203
|
+
for (const key of keys) {
|
|
204
|
+
const entry = await this.store.get(key);
|
|
205
|
+
if (entry) {
|
|
206
|
+
const size = this.estimateEntrySize(entry);
|
|
207
|
+
const deleted = await this.store.delete(key);
|
|
208
|
+
if (deleted) {
|
|
209
|
+
invalidatedKeys.push(key);
|
|
210
|
+
bytesFreed += size;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
this.stats.totalInvalidations++;
|
|
215
|
+
this.stats.manualRemovals += invalidatedKeys.length;
|
|
216
|
+
this.stats.totalBytesFreed += bytesFreed;
|
|
217
|
+
this.stats.lastInvalidationAt = now();
|
|
218
|
+
const result = {
|
|
219
|
+
invalidatedKeys,
|
|
220
|
+
entriesRemoved: invalidatedKeys.length,
|
|
221
|
+
bytesFreed,
|
|
222
|
+
durationMs: performance.now() - startTime
|
|
223
|
+
};
|
|
224
|
+
this.emitEvent("manual", invalidatedKeys, bytesFreed);
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Invalidate by pattern (e.g., namespace or model)
|
|
229
|
+
*/
|
|
230
|
+
async invalidateByPattern(options) {
|
|
231
|
+
const startTime = performance.now();
|
|
232
|
+
const invalidatedKeys = [];
|
|
233
|
+
let bytesFreed = 0;
|
|
234
|
+
const currentTime = now();
|
|
235
|
+
const keys = await this.store.keys();
|
|
236
|
+
for (const key of keys) {
|
|
237
|
+
const entry = await this.store.get(key);
|
|
238
|
+
if (!entry) continue;
|
|
239
|
+
let matches = true;
|
|
240
|
+
if (options.namespace && entry.metadata.namespace !== options.namespace) {
|
|
241
|
+
matches = false;
|
|
242
|
+
}
|
|
243
|
+
if (options.model && entry.request.model !== options.model) {
|
|
244
|
+
matches = false;
|
|
245
|
+
}
|
|
246
|
+
if (options.olderThan) {
|
|
247
|
+
const age = (currentTime - entry.metadata.createdAt) / 1e3;
|
|
248
|
+
if (age < options.olderThan) {
|
|
249
|
+
matches = false;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
if (matches) {
|
|
253
|
+
const size = this.estimateEntrySize(entry);
|
|
254
|
+
const deleted = await this.store.delete(key);
|
|
255
|
+
if (deleted) {
|
|
256
|
+
invalidatedKeys.push(key);
|
|
257
|
+
bytesFreed += size;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
this.stats.totalInvalidations++;
|
|
262
|
+
this.stats.manualRemovals += invalidatedKeys.length;
|
|
263
|
+
this.stats.totalBytesFreed += bytesFreed;
|
|
264
|
+
this.stats.lastInvalidationAt = now();
|
|
265
|
+
const result = {
|
|
266
|
+
invalidatedKeys,
|
|
267
|
+
entriesRemoved: invalidatedKeys.length,
|
|
268
|
+
bytesFreed,
|
|
269
|
+
durationMs: performance.now() - startTime
|
|
270
|
+
};
|
|
271
|
+
this.emitEvent("manual", invalidatedKeys, bytesFreed);
|
|
272
|
+
return result;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Start automatic invalidation
|
|
276
|
+
*/
|
|
277
|
+
startAuto(intervalMs = 6e4) {
|
|
278
|
+
if (this.autoInterval) {
|
|
279
|
+
this.stopAuto();
|
|
280
|
+
}
|
|
281
|
+
this.autoInterval = setInterval(() => {
|
|
282
|
+
void (async () => {
|
|
283
|
+
try {
|
|
284
|
+
await this.run();
|
|
285
|
+
} catch (error) {
|
|
286
|
+
this.emit("error", error);
|
|
287
|
+
}
|
|
288
|
+
})();
|
|
289
|
+
}, intervalMs);
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Stop automatic invalidation
|
|
293
|
+
*/
|
|
294
|
+
stopAuto() {
|
|
295
|
+
if (this.autoInterval) {
|
|
296
|
+
clearInterval(this.autoInterval);
|
|
297
|
+
this.autoInterval = null;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Get invalidation statistics
|
|
302
|
+
*/
|
|
303
|
+
getStats() {
|
|
304
|
+
return { ...this.stats };
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Reset statistics
|
|
308
|
+
*/
|
|
309
|
+
resetStats() {
|
|
310
|
+
this.stats = {
|
|
311
|
+
totalInvalidations: 0,
|
|
312
|
+
ttlRemovals: 0,
|
|
313
|
+
lruRemovals: 0,
|
|
314
|
+
eventRemovals: 0,
|
|
315
|
+
smartRemovals: 0,
|
|
316
|
+
manualRemovals: 0,
|
|
317
|
+
totalBytesFreed: 0
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Destroy the manager
|
|
322
|
+
*/
|
|
323
|
+
destroy() {
|
|
324
|
+
this.stopAuto();
|
|
325
|
+
this.removeAllListeners();
|
|
326
|
+
this.accessTimes.clear();
|
|
327
|
+
}
|
|
328
|
+
getTTL(model, namespace) {
|
|
329
|
+
if (this.config.ttl?.modelTtls?.[model]) {
|
|
330
|
+
return this.config.ttl.modelTtls[model];
|
|
331
|
+
}
|
|
332
|
+
if (namespace && this.config.ttl?.namespaceTtls?.[namespace]) {
|
|
333
|
+
return this.config.ttl.namespaceTtls[namespace];
|
|
334
|
+
}
|
|
335
|
+
return this.config.ttl?.defaultTtl ?? 3600;
|
|
336
|
+
}
|
|
337
|
+
estimateEntrySize(entry) {
|
|
338
|
+
return entry.response.content.length * 2 + 200;
|
|
339
|
+
}
|
|
340
|
+
emitEvent(reason, keys, bytesFreed) {
|
|
341
|
+
if (this.config.emitEvents && keys.length > 0) {
|
|
342
|
+
const event = {
|
|
343
|
+
timestamp: now(),
|
|
344
|
+
keys,
|
|
345
|
+
reason,
|
|
346
|
+
entriesRemoved: keys.length,
|
|
347
|
+
bytesFreed
|
|
348
|
+
};
|
|
349
|
+
this.emit("invalidate", event);
|
|
350
|
+
this.config.onInvalidate?.(event);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
function createInvalidationManager(store, config) {
|
|
355
|
+
return new InvalidationManager(store, config);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
export { InvalidationManager, createInvalidationManager };
|
|
359
|
+
//# sourceMappingURL=index.js.map
|
|
360
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/utils.ts","../../src/invalidation/InvalidationManager.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Core Utilities\n *\n * Helper functions for the semantic cache.\n */\n\nimport { nanoid } from 'nanoid';\n\n/**\n * Generate a unique ID with optional prefix\n */\nexport function generateId(prefix?: string): string {\n const id = nanoid(16);\n return prefix ? `${prefix}_${id}` : id;\n}\n\n/**\n * Get current timestamp in milliseconds\n */\nexport function now(): number {\n return Date.now();\n}\n\n/**\n * Check if an entry has expired based on TTL\n */\nexport function isExpired(createdAt: number, ttlSeconds: number): boolean {\n if (ttlSeconds <= 0) return false;\n return now() > createdAt + ttlSeconds * 1000;\n}\n\n/**\n * Estimate the size of an object in bytes\n */\nexport function estimateSize(obj: unknown): number {\n const str = JSON.stringify(obj);\n // Rough estimate: 2 bytes per character for UTF-16\n return str.length * 2;\n}\n\n/**\n * Estimate size of a cache entry\n */\nexport function estimateEntrySize(entry: {\n embedding?: number[];\n request: { messages: Array<{ content: string }> };\n response: { content: string };\n}): number {\n // Vector: 4 bytes per float32\n const vectorSize = (entry.embedding?.length ?? 0) * 4;\n\n // Content: roughly 2 bytes per character\n const messageSize = entry.request.messages.reduce(\n (acc, m) => acc + (m.content?.length ?? 0) * 2,\n 0,\n );\n const responseSize = (entry.response.content?.length ?? 0) * 2;\n\n // Metadata overhead\n const overheadSize = 500;\n\n return vectorSize + messageSize + responseSize + overheadSize;\n}\n\n/**\n * Sleep for a specified duration\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n backoffMultiplier?: number;\n } = {},\n): Promise<T> {\n const {\n maxAttempts = 3,\n initialDelayMs = 100,\n maxDelayMs = 5000,\n backoffMultiplier = 2,\n } = options;\n\n let lastError: Error | undefined;\n let delay = initialDelayMs;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < maxAttempts) {\n await sleep(delay);\n delay = Math.min(delay * backoffMultiplier, maxDelayMs);\n }\n }\n }\n\n throw lastError;\n}\n\n/**\n * Chunk an array into smaller arrays\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Calculate percentile from an array of numbers\n */\nexport function percentile(values: number[], p: number): number {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const index = Math.ceil((p / 100) * sorted.length) - 1;\n return sorted[Math.max(0, index)];\n}\n\n/**\n * Calculate mean of an array of numbers\n */\nexport function mean(values: number[]): number {\n if (values.length === 0) return 0;\n return values.reduce((a, b) => a + b, 0) / values.length;\n}\n","/**\n * InvalidationManager\n *\n * Manages cache invalidation strategies.\n */\n\nimport EventEmitter from 'eventemitter3';\nimport type {\n InvalidationManagerConfig,\n InvalidationEvent,\n InvalidationResult,\n InvalidationStats,\n} from '../types/index.js';\nimport type { BaseCacheStore } from '../stores/BaseCacheStore.js';\nimport { now } from '../core/utils.js';\n\n/**\n * InvalidationManager events\n */\nexport interface InvalidationManagerEvents {\n invalidate: (event: InvalidationEvent) => void;\n error: (error: Error) => void;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: InvalidationManagerConfig = {\n strategy: 'ttl',\n ttl: {\n defaultTtl: 3600,\n softTtl: false,\n },\n emitEvents: true,\n};\n\n/**\n * InvalidationManager\n *\n * Manages cache invalidation across different strategies.\n *\n * @example\n * ```typescript\n * const invalidation = new InvalidationManager(store, {\n * strategy: 'ttl',\n * ttl: { defaultTtl: 3600 }\n * });\n *\n * // Run invalidation\n * const result = await invalidation.run();\n *\n * // Or start automatic invalidation\n * invalidation.startAuto(60000); // Run every minute\n * ```\n */\nexport class InvalidationManager extends EventEmitter<InvalidationManagerEvents> {\n private store: BaseCacheStore;\n private config: InvalidationManagerConfig;\n private autoInterval: ReturnType<typeof setInterval> | null = null;\n private stats: InvalidationStats = {\n totalInvalidations: 0,\n ttlRemovals: 0,\n lruRemovals: 0,\n eventRemovals: 0,\n smartRemovals: 0,\n manualRemovals: 0,\n totalBytesFreed: 0,\n };\n private accessTimes: Map<string, number> = new Map();\n\n constructor(store: BaseCacheStore, config?: InvalidationManagerConfig) {\n super();\n this.store = store;\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Run invalidation based on configured strategy\n */\n async run(): Promise<InvalidationResult> {\n switch (this.config.strategy) {\n case 'ttl':\n return this.runTTLInvalidation();\n case 'lru':\n return this.runLRUInvalidation();\n case 'smart':\n return this.runSmartInvalidation();\n default:\n return this.runTTLInvalidation();\n }\n }\n\n /**\n * Run TTL-based invalidation\n */\n async runTTLInvalidation(): Promise<InvalidationResult> {\n const startTime = performance.now();\n const invalidatedKeys: string[] = [];\n let bytesFreed = 0;\n const currentTime = now();\n\n const keys = await this.store.keys();\n\n for (const key of keys) {\n const entry = await this.store.get(key);\n if (!entry) continue;\n\n // Use entry's TTL if set, otherwise fall back to config-based TTL\n const ttl =\n entry.metadata.ttl ??\n this.getTTL(entry.request.model, entry.metadata.namespace);\n const age = (currentTime - entry.metadata.createdAt) / 1000; // Convert to seconds\n\n if (age >= ttl) {\n // Check soft TTL grace period\n if (this.config.ttl?.softTtl && this.config.ttl?.gracePeriod) {\n if (age < ttl + this.config.ttl.gracePeriod) {\n // In grace period, skip\n continue;\n }\n }\n\n const deleted = await this.store.delete(key);\n if (deleted) {\n invalidatedKeys.push(key);\n bytesFreed += this.estimateEntrySize(entry);\n }\n }\n }\n\n this.stats.totalInvalidations++;\n this.stats.ttlRemovals += invalidatedKeys.length;\n this.stats.totalBytesFreed += bytesFreed;\n this.stats.lastInvalidationAt = now();\n\n const result: InvalidationResult = {\n invalidatedKeys,\n entriesRemoved: invalidatedKeys.length,\n bytesFreed,\n durationMs: performance.now() - startTime,\n };\n\n this.emitEvent('ttl', invalidatedKeys, bytesFreed);\n return result;\n }\n\n /**\n * Run LRU-based invalidation\n */\n async runLRUInvalidation(): Promise<InvalidationResult> {\n const startTime = performance.now();\n const invalidatedKeys: string[] = [];\n let bytesFreed = 0;\n\n const maxEntries = this.config.lru?.maxEntries ?? 1000;\n const _maxSizeBytes = this.config.lru?.maxSizeBytes ?? Infinity;\n const batchSize = this.config.lru?.evictionBatchSize ?? 10;\n const minAge = this.config.lru?.minAge ?? 0;\n\n const currentSize = await this.store.size();\n if (currentSize <= maxEntries) {\n return {\n invalidatedKeys: [],\n entriesRemoved: 0,\n bytesFreed: 0,\n durationMs: performance.now() - startTime,\n };\n }\n\n // Get all entries and sort by last access time\n const keys = await this.store.keys();\n const entriesWithAccess: Array<{\n key: string;\n accessedAt: number;\n size: number;\n }> = [];\n\n for (const key of keys) {\n const entry = await this.store.get(key);\n if (entry) {\n entriesWithAccess.push({\n key,\n accessedAt: entry.metadata.accessedAt,\n size: this.estimateEntrySize(entry),\n });\n }\n }\n\n // Sort by least recently accessed\n entriesWithAccess.sort((a, b) => a.accessedAt - b.accessedAt);\n\n // Remove until under limit\n const toRemove = Math.min(currentSize - maxEntries, batchSize);\n const currentTime = now();\n\n for (let i = 0; i < toRemove && i < entriesWithAccess.length; i++) {\n const { key, accessedAt, size } = entriesWithAccess[i];\n\n // Check minimum age\n const age = (currentTime - accessedAt) / 1000;\n if (age < minAge) continue;\n\n const deleted = await this.store.delete(key);\n if (deleted) {\n invalidatedKeys.push(key);\n bytesFreed += size;\n }\n }\n\n this.stats.totalInvalidations++;\n this.stats.lruRemovals += invalidatedKeys.length;\n this.stats.totalBytesFreed += bytesFreed;\n this.stats.lastInvalidationAt = now();\n\n const result: InvalidationResult = {\n invalidatedKeys,\n entriesRemoved: invalidatedKeys.length,\n bytesFreed,\n durationMs: performance.now() - startTime,\n };\n\n this.emitEvent('lru', invalidatedKeys, bytesFreed);\n return result;\n }\n\n /**\n * Run smart invalidation (combines TTL + LRU + hit rate analysis)\n */\n async runSmartInvalidation(): Promise<InvalidationResult> {\n const startTime = performance.now();\n const invalidatedKeys: string[] = [];\n let bytesFreed = 0;\n\n const minHitRate = this.config.smart?.minHitRate ?? 0.1;\n const currentTime = now();\n\n const keys = await this.store.keys();\n\n for (const key of keys) {\n const entry = await this.store.get(key);\n if (!entry) continue;\n\n let shouldInvalidate = false;\n\n // Check TTL\n // Use entry's TTL if set, otherwise fall back to config-based TTL\n const ttl =\n entry.metadata.ttl ??\n this.getTTL(entry.request.model, entry.metadata.namespace);\n const age = (currentTime - entry.metadata.createdAt) / 1000;\n if (age >= ttl) {\n shouldInvalidate = true;\n }\n\n // Check hit rate\n if (this.config.smart?.analyzeHitRate && entry.metadata.accessCount > 0) {\n const accessRate = entry.metadata.accessCount / Math.max(age / 3600, 1); // Per hour\n if (accessRate < minHitRate) {\n shouldInvalidate = true;\n }\n }\n\n if (shouldInvalidate) {\n const deleted = await this.store.delete(key);\n if (deleted) {\n invalidatedKeys.push(key);\n bytesFreed += this.estimateEntrySize(entry);\n }\n }\n }\n\n this.stats.totalInvalidations++;\n this.stats.smartRemovals += invalidatedKeys.length;\n this.stats.totalBytesFreed += bytesFreed;\n this.stats.lastInvalidationAt = now();\n\n const result: InvalidationResult = {\n invalidatedKeys,\n entriesRemoved: invalidatedKeys.length,\n bytesFreed,\n durationMs: performance.now() - startTime,\n };\n\n this.emitEvent('smart', invalidatedKeys, bytesFreed);\n return result;\n }\n\n /**\n * Manually invalidate specific keys\n */\n async invalidateKeys(keys: string[]): Promise<InvalidationResult> {\n const startTime = performance.now();\n const invalidatedKeys: string[] = [];\n let bytesFreed = 0;\n\n for (const key of keys) {\n const entry = await this.store.get(key);\n if (entry) {\n const size = this.estimateEntrySize(entry);\n const deleted = await this.store.delete(key);\n if (deleted) {\n invalidatedKeys.push(key);\n bytesFreed += size;\n }\n }\n }\n\n this.stats.totalInvalidations++;\n this.stats.manualRemovals += invalidatedKeys.length;\n this.stats.totalBytesFreed += bytesFreed;\n this.stats.lastInvalidationAt = now();\n\n const result: InvalidationResult = {\n invalidatedKeys,\n entriesRemoved: invalidatedKeys.length,\n bytesFreed,\n durationMs: performance.now() - startTime,\n };\n\n this.emitEvent('manual', invalidatedKeys, bytesFreed);\n return result;\n }\n\n /**\n * Invalidate by pattern (e.g., namespace or model)\n */\n async invalidateByPattern(options: {\n namespace?: string;\n model?: string;\n olderThan?: number;\n }): Promise<InvalidationResult> {\n const startTime = performance.now();\n const invalidatedKeys: string[] = [];\n let bytesFreed = 0;\n const currentTime = now();\n\n const keys = await this.store.keys();\n\n for (const key of keys) {\n const entry = await this.store.get(key);\n if (!entry) continue;\n\n let matches = true;\n\n if (options.namespace && entry.metadata.namespace !== options.namespace) {\n matches = false;\n }\n\n if (options.model && entry.request.model !== options.model) {\n matches = false;\n }\n\n if (options.olderThan) {\n const age = (currentTime - entry.metadata.createdAt) / 1000;\n if (age < options.olderThan) {\n matches = false;\n }\n }\n\n if (matches) {\n const size = this.estimateEntrySize(entry);\n const deleted = await this.store.delete(key);\n if (deleted) {\n invalidatedKeys.push(key);\n bytesFreed += size;\n }\n }\n }\n\n this.stats.totalInvalidations++;\n this.stats.manualRemovals += invalidatedKeys.length;\n this.stats.totalBytesFreed += bytesFreed;\n this.stats.lastInvalidationAt = now();\n\n const result: InvalidationResult = {\n invalidatedKeys,\n entriesRemoved: invalidatedKeys.length,\n bytesFreed,\n durationMs: performance.now() - startTime,\n };\n\n this.emitEvent('manual', invalidatedKeys, bytesFreed);\n return result;\n }\n\n /**\n * Start automatic invalidation\n */\n startAuto(intervalMs = 60000): void {\n if (this.autoInterval) {\n this.stopAuto();\n }\n\n this.autoInterval = setInterval(() => {\n void (async () => {\n try {\n await this.run();\n } catch (error) {\n this.emit('error', error as Error);\n }\n })();\n }, intervalMs);\n }\n\n /**\n * Stop automatic invalidation\n */\n stopAuto(): void {\n if (this.autoInterval) {\n clearInterval(this.autoInterval);\n this.autoInterval = null;\n }\n }\n\n /**\n * Get invalidation statistics\n */\n getStats(): InvalidationStats {\n return { ...this.stats };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalInvalidations: 0,\n ttlRemovals: 0,\n lruRemovals: 0,\n eventRemovals: 0,\n smartRemovals: 0,\n manualRemovals: 0,\n totalBytesFreed: 0,\n };\n }\n\n /**\n * Destroy the manager\n */\n destroy(): void {\n this.stopAuto();\n this.removeAllListeners();\n this.accessTimes.clear();\n }\n\n private getTTL(model: string, namespace?: string): number {\n // Check model-specific TTL\n if (this.config.ttl?.modelTtls?.[model]) {\n return this.config.ttl.modelTtls[model];\n }\n\n // Check namespace-specific TTL\n if (namespace && this.config.ttl?.namespaceTtls?.[namespace]) {\n return this.config.ttl.namespaceTtls[namespace];\n }\n\n // Return default TTL\n return this.config.ttl?.defaultTtl ?? 3600;\n }\n\n private estimateEntrySize(entry: { response: { content: string } }): number {\n return entry.response.content.length * 2 + 200; // Rough estimate\n }\n\n private emitEvent(\n reason: 'ttl' | 'lru' | 'event' | 'smart' | 'manual',\n keys: string[],\n bytesFreed: number,\n ): void {\n if (this.config.emitEvents && keys.length > 0) {\n const event: InvalidationEvent = {\n timestamp: now(),\n keys,\n reason,\n entriesRemoved: keys.length,\n bytesFreed,\n };\n this.emit('invalidate', event);\n this.config.onInvalidate?.(event);\n }\n }\n}\n\n/**\n * Create an InvalidationManager instance\n */\nexport function createInvalidationManager(\n store: BaseCacheStore,\n config?: InvalidationManagerConfig,\n): InvalidationManager {\n return new InvalidationManager(store, config);\n}\n"]}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { d as CacheBackendType, b as CacheEntry } from './cache.types-DMuyQseO.js';
|
|
2
|
+
|
|
3
|
+
declare abstract class BaseCacheStore {
|
|
4
|
+
abstract readonly storeType: CacheBackendType;
|
|
5
|
+
protected config: StoreConfig;
|
|
6
|
+
protected metrics: StoreMetrics;
|
|
7
|
+
constructor(config: StoreConfig);
|
|
8
|
+
abstract get(key: string): Promise<CacheEntry | undefined>;
|
|
9
|
+
abstract set(key: string, entry: CacheEntry): Promise<UpsertResult>;
|
|
10
|
+
abstract has(key: string): Promise<boolean>;
|
|
11
|
+
abstract delete(key: string): Promise<boolean>;
|
|
12
|
+
abstract clear(): Promise<void>;
|
|
13
|
+
abstract size(): Promise<number>;
|
|
14
|
+
abstract keys(): Promise<string[]>;
|
|
15
|
+
abstract query(vector: number[], options?: StoreQueryOptions): Promise<StoreQueryResult>;
|
|
16
|
+
abstract checkHealth(): Promise<StoreHealth>;
|
|
17
|
+
abstract close(): Promise<void>;
|
|
18
|
+
get namespace(): string;
|
|
19
|
+
getMetrics(): StoreMetrics;
|
|
20
|
+
resetMetrics(): void;
|
|
21
|
+
protected incrementMetric(metric: keyof StoreMetrics, amount?: number): void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface StoreConfig {
|
|
25
|
+
type: CacheBackendType;
|
|
26
|
+
namespace?: string;
|
|
27
|
+
}
|
|
28
|
+
interface MemoryStoreConfig extends StoreConfig {
|
|
29
|
+
type: 'memory';
|
|
30
|
+
maxEntries?: number;
|
|
31
|
+
maxSizeBytes?: number;
|
|
32
|
+
evictionPolicy?: 'lru' | 'lfu' | 'fifo';
|
|
33
|
+
}
|
|
34
|
+
interface RedisStoreConfig extends StoreConfig {
|
|
35
|
+
type: 'redis';
|
|
36
|
+
url?: string;
|
|
37
|
+
host?: string;
|
|
38
|
+
port?: number;
|
|
39
|
+
password?: string;
|
|
40
|
+
db?: number;
|
|
41
|
+
keyPrefix?: string;
|
|
42
|
+
connectTimeout?: number;
|
|
43
|
+
tls?: boolean;
|
|
44
|
+
}
|
|
45
|
+
interface SQLiteStoreConfig extends StoreConfig {
|
|
46
|
+
type: 'sqlite';
|
|
47
|
+
dbPath?: string;
|
|
48
|
+
inMemory?: boolean;
|
|
49
|
+
enableVector?: boolean;
|
|
50
|
+
}
|
|
51
|
+
interface PineconeStoreConfig extends StoreConfig {
|
|
52
|
+
type: 'pinecone';
|
|
53
|
+
apiKey: string;
|
|
54
|
+
index: string;
|
|
55
|
+
namespace?: string;
|
|
56
|
+
host?: string;
|
|
57
|
+
}
|
|
58
|
+
interface TieredStoreConfig extends StoreConfig {
|
|
59
|
+
type: 'tiered';
|
|
60
|
+
tiers: TierConfig[];
|
|
61
|
+
writeThrough?: boolean;
|
|
62
|
+
promoteOnHit?: boolean;
|
|
63
|
+
promotionThreshold?: number;
|
|
64
|
+
}
|
|
65
|
+
interface TierConfig {
|
|
66
|
+
name: string;
|
|
67
|
+
type?: CacheBackendType;
|
|
68
|
+
config?: StoreConfig;
|
|
69
|
+
priority: number;
|
|
70
|
+
ttl?: number;
|
|
71
|
+
maxSize?: number;
|
|
72
|
+
promotionThreshold?: number;
|
|
73
|
+
demotionTarget?: number;
|
|
74
|
+
store?: BaseCacheStore;
|
|
75
|
+
}
|
|
76
|
+
interface StoreHealth {
|
|
77
|
+
healthy: boolean;
|
|
78
|
+
latencyMs: number;
|
|
79
|
+
lastCheck: number;
|
|
80
|
+
error?: string;
|
|
81
|
+
}
|
|
82
|
+
interface UpsertResult {
|
|
83
|
+
success: boolean;
|
|
84
|
+
id: string;
|
|
85
|
+
durationMs: number;
|
|
86
|
+
}
|
|
87
|
+
interface StoreQueryOptions {
|
|
88
|
+
topK?: number;
|
|
89
|
+
minSimilarity?: number;
|
|
90
|
+
namespace?: string;
|
|
91
|
+
filter?: Record<string, unknown>;
|
|
92
|
+
includeMetadata?: boolean;
|
|
93
|
+
includeEmbedding?: boolean;
|
|
94
|
+
}
|
|
95
|
+
interface StoreQueryResult {
|
|
96
|
+
entries: Array<CacheEntry & {
|
|
97
|
+
score: number;
|
|
98
|
+
}>;
|
|
99
|
+
durationMs: number;
|
|
100
|
+
}
|
|
101
|
+
interface StoreMetrics {
|
|
102
|
+
gets: number;
|
|
103
|
+
sets: number;
|
|
104
|
+
deletes: number;
|
|
105
|
+
hits: number;
|
|
106
|
+
misses: number;
|
|
107
|
+
avgGetLatencyMs?: number;
|
|
108
|
+
avgSetLatencyMs?: number;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export { BaseCacheStore as B, type MemoryStoreConfig as M, type PineconeStoreConfig as P, type RedisStoreConfig as R, type StoreHealth as S, type TieredStoreConfig as T, type UpsertResult as U, type StoreConfig as a, type SQLiteStoreConfig as b, type TierConfig as c, type StoreQueryOptions as d, type StoreQueryResult as e, type StoreMetrics as f };
|