opcode-pg-memory 2.2.7 → 2.3.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.
Files changed (76) hide show
  1. package/dist/cli.js +21 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +30 -20981
  5. package/dist/index.js.map +1 -0
  6. package/dist/mcp-server.js +26 -6
  7. package/dist/mcp-server.js.map +1 -0
  8. package/dist/src/cache/semantic-cache.js +399 -0
  9. package/dist/src/cache/semantic-cache.js.map +1 -0
  10. package/dist/src/cli.js +404 -0
  11. package/dist/src/cli.js.map +1 -0
  12. package/dist/src/config.d.ts +5 -0
  13. package/dist/src/config.d.ts.map +1 -1
  14. package/dist/src/config.js +89 -0
  15. package/dist/src/config.js.map +1 -0
  16. package/dist/src/db/init-db.js +545 -0
  17. package/dist/src/db/init-db.js.map +1 -0
  18. package/dist/src/hooks/message-part-updated.js +203 -0
  19. package/dist/src/hooks/message-part-updated.js.map +1 -0
  20. package/dist/src/hooks/message-updated.js +347 -0
  21. package/dist/src/hooks/message-updated.js.map +1 -0
  22. package/dist/src/hooks/session-compacting.js +179 -0
  23. package/dist/src/hooks/session-compacting.js.map +1 -0
  24. package/dist/src/hooks/session-completed.js +337 -0
  25. package/dist/src/hooks/session-completed.js.map +1 -0
  26. package/dist/src/hooks/session-created.js +206 -0
  27. package/dist/src/hooks/session-created.js.map +1 -0
  28. package/dist/src/hooks/tool-execute.js +267 -0
  29. package/dist/src/hooks/tool-execute.js.map +1 -0
  30. package/dist/src/index.d.ts +1 -0
  31. package/dist/src/index.d.ts.map +1 -1
  32. package/dist/src/index.js +643 -0
  33. package/dist/src/index.js.map +1 -0
  34. package/dist/src/mcp/hindsight-reflect-omo.js +318 -0
  35. package/dist/src/mcp/hindsight-reflect-omo.js.map +1 -0
  36. package/dist/src/mcp/hindsight-reflect.js +838 -0
  37. package/dist/src/mcp/hindsight-reflect.js.map +1 -0
  38. package/dist/src/mcp/recall-memory-omo.js +263 -0
  39. package/dist/src/mcp/recall-memory-omo.js.map +1 -0
  40. package/dist/src/mcp/recall-memory.d.ts +6 -0
  41. package/dist/src/mcp/recall-memory.d.ts.map +1 -1
  42. package/dist/src/mcp/recall-memory.js +900 -0
  43. package/dist/src/mcp/recall-memory.js.map +1 -0
  44. package/dist/src/omo/adapter.js +583 -0
  45. package/dist/src/omo/adapter.js.map +1 -0
  46. package/dist/src/omo/types.js +44 -0
  47. package/dist/src/omo/types.js.map +1 -0
  48. package/dist/src/services/db-polling.d.ts +30 -0
  49. package/dist/src/services/db-polling.d.ts.map +1 -0
  50. package/dist/src/services/db-polling.js +97 -0
  51. package/dist/src/services/db-polling.js.map +1 -0
  52. package/dist/src/services/event-synchronizer.d.ts +15 -0
  53. package/dist/src/services/event-synchronizer.d.ts.map +1 -0
  54. package/dist/src/services/event-synchronizer.js +119 -0
  55. package/dist/src/services/event-synchronizer.js.map +1 -0
  56. package/dist/src/services/keyword.js +29 -0
  57. package/dist/src/services/keyword.js.map +1 -0
  58. package/dist/src/services/logger.js +42 -0
  59. package/dist/src/services/logger.js.map +1 -0
  60. package/dist/src/services/opencode-schema-adapter.d.ts +34 -0
  61. package/dist/src/services/opencode-schema-adapter.d.ts.map +1 -0
  62. package/dist/src/services/opencode-schema-adapter.js +96 -0
  63. package/dist/src/services/opencode-schema-adapter.js.map +1 -0
  64. package/dist/src/services/privacy.js +23 -0
  65. package/dist/src/services/privacy.js.map +1 -0
  66. package/dist/src/topic/segment-manager.js +447 -0
  67. package/dist/src/topic/segment-manager.js.map +1 -0
  68. package/dist/src/types.d.ts +20 -2
  69. package/dist/src/types.d.ts.map +1 -1
  70. package/dist/src/types.js +8 -0
  71. package/dist/src/types.js.map +1 -0
  72. package/dist/src/utils/embedding.js +180 -0
  73. package/dist/src/utils/embedding.js.map +1 -0
  74. package/dist/src/utils/token-budget.js +152 -0
  75. package/dist/src/utils/token-budget.js.map +1 -0
  76. package/package.json +6 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;;;;;GAKG;AACH,8CAA4B;AAC5B,qCAAsC;AAA7B,iHAAA,OAAO,OAAA"}
@@ -22497,6 +22497,11 @@ function getEmbeddingService() {
22497
22497
 
22498
22498
  // src/mcp/recall-memory.ts
22499
22499
  var logger = createLogger("recall-memory");
22500
+ var DEFAULT_DECAY_CONFIG = {
22501
+ enabled: true,
22502
+ factor: 0.99,
22503
+ maxAgeDays: 365
22504
+ };
22500
22505
  var DEFAULT_CONFIG = {
22501
22506
  weights: {
22502
22507
  semantic: 0.5,
@@ -22504,7 +22509,8 @@ var DEFAULT_CONFIG = {
22504
22509
  importance: 0.2
22505
22510
  },
22506
22511
  maxResults: 10,
22507
- rerankEnabled: true
22512
+ rerankEnabled: true,
22513
+ decay: { ...DEFAULT_DECAY_CONFIG }
22508
22514
  };
22509
22515
  var TOPIC_FUSION_RATIO = 0.3;
22510
22516
  var PER_STRATEGY_LIMIT = 20;
@@ -22533,7 +22539,7 @@ async function recallMemory(input, pool, config = {}) {
22533
22539
  const strategies = input.retrieval_strategies || ["semantic", "bm25", "graph"];
22534
22540
  const retrievalResults = await parallelRetrieve(input.query, fusedEmbedding, sessionId, strategies, pool, input.filters);
22535
22541
  const mergedResults = mergeAndDeduplicate(retrievalResults);
22536
- const scoredResults = calculateMultiDimensionalScores(mergedResults, fusedEmbedding, mergedConfig.weights);
22542
+ const scoredResults = calculateMultiDimensionalScores(mergedResults, fusedEmbedding, mergedConfig.weights, { ...DEFAULT_DECAY_CONFIG, ...mergedConfig.decay });
22537
22543
  let filteredResults = applyFilters(scoredResults, input.filters);
22538
22544
  if (input.rerank !== false && mergedConfig.rerankEnabled) {
22539
22545
  filteredResults = await crossEncoderRerank(filteredResults, input.query);
@@ -23038,9 +23044,9 @@ function mergeAndDeduplicate(strategyResults) {
23038
23044
  }
23039
23045
  return merged;
23040
23046
  }
23041
- function calculateMultiDimensionalScores(facts, _queryEmbedding, weights) {
23047
+ function calculateMultiDimensionalScores(facts, _queryEmbedding, weights, decayConfig = DEFAULT_DECAY_CONFIG) {
23042
23048
  const now = new Date;
23043
- return facts.map((fact) => {
23049
+ let results = facts.map((fact) => {
23044
23050
  const semanticScore = fact.relevanceScore;
23045
23051
  const createdAt = new Date(fact.metadata.createdAt || fact._timestamp || Date.now());
23046
23052
  const daysAgo = (now.getTime() - createdAt.getTime()) / (1000 * 60 * 60 * 24);
@@ -23048,11 +23054,25 @@ function calculateMultiDimensionalScores(facts, _queryEmbedding, weights) {
23048
23054
  const importance = fact.metadata.importance || fact.metadata.weight || 3;
23049
23055
  const importanceScore = Math.min(1, importance / 5);
23050
23056
  const finalScore = weights.semantic * semanticScore + weights.recency * recencyScore + weights.importance * importanceScore;
23057
+ let relevanceScore = Math.round(finalScore * 1000) / 1000;
23058
+ if (decayConfig.enabled) {
23059
+ const metadata = fact.metadata || {};
23060
+ const lastSeen = metadata.createdAt || fact._timestamp || Date.now();
23061
+ const daysSinceLastSeen = (Date.now() - new Date(lastSeen).getTime()) / 86400000;
23062
+ if (metadata.tier !== "permanent") {
23063
+ const decayedWeight = relevanceScore * Math.pow(decayConfig.factor, daysSinceLastSeen);
23064
+ relevanceScore = Math.max(0.01, decayedWeight);
23065
+ if (daysSinceLastSeen > decayConfig.maxAgeDays && relevanceScore < 0.1) {
23066
+ relevanceScore = 0;
23067
+ }
23068
+ }
23069
+ }
23051
23070
  return {
23052
23071
  ...fact,
23053
- relevanceScore: Math.round(finalScore * 1000) / 1000
23072
+ relevanceScore
23054
23073
  };
23055
- }).sort((a2, b2) => b2.relevanceScore - a2.relevanceScore);
23074
+ }).filter((r2) => r2.relevanceScore > 0).sort((a2, b2) => b2.relevanceScore - a2.relevanceScore);
23075
+ return results;
23056
23076
  }
23057
23077
  function applyFilters(facts, filters) {
23058
23078
  if (!filters)
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,399 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SemanticCacheManager = void 0;
37
+ exports.queryWithCachePriority = queryWithCachePriority;
38
+ exports.createCacheManager = createCacheManager;
39
+ const crypto = __importStar(require("crypto"));
40
+ const DEFAULT_CONFIG = {
41
+ initialThreshold: 0.92,
42
+ adjustmentStep: 0.02,
43
+ minThreshold: 0.85,
44
+ maxThreshold: 0.97,
45
+ queryWindowSize: 100,
46
+ enabled: true
47
+ };
48
+ /**
49
+ * 语义缓存管理器
50
+ *
51
+ * 功能:
52
+ * 1. 使用 HNSW 索引实现亚 10ms 级检索
53
+ * 2. 动态阈值调整(初始 0.92,每 100 次查询根据命中率 ±0.02)
54
+ * 3. 与 DCP 协同,设置最高检索优先级
55
+ * 4. 缓存命中后直接返回,零 token 消耗
56
+ */
57
+ class SemanticCacheManager {
58
+ pool;
59
+ config;
60
+ currentThreshold;
61
+ queryCount;
62
+ hitCount;
63
+ constructor(pool, config = {}) {
64
+ this.pool = pool;
65
+ this.config = { ...DEFAULT_CONFIG, ...config };
66
+ this.currentThreshold = this.config.initialThreshold;
67
+ this.queryCount = 0;
68
+ this.hitCount = 0;
69
+ }
70
+ /**
71
+ * 检查缓存
72
+ *
73
+ * 流程:
74
+ * 1. 生成查询哈希
75
+ * 2. 使用 HNSW 索引快速检索候选
76
+ * 3. 检查相似度是否达到阈值
77
+ * 4. 更新命中统计
78
+ */
79
+ async checkCache(queryText) {
80
+ if (!this.config.enabled) {
81
+ return { hit: false };
82
+ }
83
+ const startTime = Date.now();
84
+ try {
85
+ // 1. 生成查询哈希
86
+ const queryHash = this.generateQueryHash(queryText);
87
+ // 2. 首先尝试精确匹配(哈希匹配)
88
+ const exactMatch = await this.pool.query(`
89
+ SELECT id, response_text, hit_count, similarity_threshold
90
+ FROM semantic_cache
91
+ WHERE query_hash = $1 AND is_pruned = FALSE
92
+ `, [queryHash]);
93
+ if (exactMatch.rows.length > 0) {
94
+ const cached = exactMatch.rows[0];
95
+ // 更新命中统计
96
+ await this.recordHit(cached.id);
97
+ console.log(`[PG Memory] Cache HIT (exact): ${queryText.substring(0, 50)}...`);
98
+ return {
99
+ hit: true,
100
+ response: cached.response_text,
101
+ similarity: 1.0,
102
+ cached: true,
103
+ cacheId: cached.id
104
+ };
105
+ }
106
+ // 3. 语义相似度匹配
107
+ // 注意:实际应生成 embedding,这里简化处理
108
+ const queryEmbedding = await this.generateQueryEmbedding(queryText);
109
+ // 使用 HNSW 索引快速检索候选
110
+ const candidates = await this.pool.query(`
111
+ SELECT id, query_text, response_text, query_embedding <=> $1 as distance,
112
+ similarity_threshold
113
+ FROM semantic_cache
114
+ WHERE is_pruned = FALSE
115
+ ORDER BY query_embedding <=> $1
116
+ LIMIT 5
117
+ `, [queryEmbedding]);
118
+ // 4. 检查是否命中
119
+ for (const candidate of candidates.rows) {
120
+ const similarity = 1 - candidate.distance; // 距离转相似度
121
+ if (similarity >= this.currentThreshold) {
122
+ // 命中:更新统计
123
+ await this.recordHit(candidate.id);
124
+ const retrievalTime = Date.now() - startTime;
125
+ console.log(`[PG Memory] Cache HIT (semantic): similarity=${similarity.toFixed(3)}, time=${retrievalTime}ms`);
126
+ return {
127
+ hit: true,
128
+ response: candidate.response_text,
129
+ similarity,
130
+ cached: true,
131
+ cacheId: candidate.id
132
+ };
133
+ }
134
+ }
135
+ // 未命中
136
+ await this.recordMiss();
137
+ console.log(`[PG Memory] Cache MISS: ${queryText.substring(0, 50)}...`);
138
+ return {
139
+ hit: false,
140
+ cached: false
141
+ };
142
+ }
143
+ catch (error) {
144
+ console.error('[PG Memory] Cache check error:', error);
145
+ return { hit: false };
146
+ }
147
+ }
148
+ /**
149
+ * 存储缓存
150
+ */
151
+ async storeCache(queryText, responseText, sessionId) {
152
+ if (!this.config.enabled) {
153
+ return null;
154
+ }
155
+ try {
156
+ const queryHash = this.generateQueryHash(queryText);
157
+ const queryEmbedding = await this.generateQueryEmbedding(queryText);
158
+ // 检查是否已存在
159
+ const existing = await this.pool.query('SELECT id FROM semantic_cache WHERE query_hash = $1', [queryHash]);
160
+ if (existing.rows.length > 0) {
161
+ // 更新现有记录
162
+ await this.pool.query(`
163
+ UPDATE semantic_cache
164
+ SET response_text = $1,
165
+ hit_count = hit_count + 1,
166
+ last_hit_at = NOW(),
167
+ is_pruned = FALSE
168
+ WHERE id = $2
169
+ `, [responseText, existing.rows[0].id]);
170
+ return existing.rows[0].id;
171
+ }
172
+ // 创建新记录
173
+ const result = await this.pool.query(`
174
+ INSERT INTO semantic_cache (
175
+ query_hash, query_text, query_embedding, response_text,
176
+ similarity_threshold, session_id
177
+ ) VALUES ($1, $2, $3, $4, $5, $6)
178
+ RETURNING id
179
+ `, [
180
+ queryHash,
181
+ queryText,
182
+ queryEmbedding,
183
+ responseText,
184
+ this.currentThreshold,
185
+ sessionId || null
186
+ ]);
187
+ console.log(`[PG Memory] Cache stored: ${queryText.substring(0, 50)}...`);
188
+ return result.rows[0].id;
189
+ }
190
+ catch (error) {
191
+ console.error('[PG Memory] Cache store error:', error);
192
+ return null;
193
+ }
194
+ }
195
+ /**
196
+ * 记录缓存命中
197
+ */
198
+ async recordHit(cacheId) {
199
+ this.hitCount++;
200
+ this.queryCount++;
201
+ await this.pool.query(`
202
+ UPDATE semantic_cache
203
+ SET hit_count = hit_count + 1,
204
+ last_hit_at = NOW()
205
+ WHERE id = $1
206
+ `, [cacheId]);
207
+ await this.maybeAdjustThreshold();
208
+ }
209
+ /**
210
+ * 记录缓存未命中
211
+ */
212
+ async recordMiss() {
213
+ this.queryCount++;
214
+ await this.maybeAdjustThreshold();
215
+ }
216
+ /**
217
+ * 动态调整阈值
218
+ *
219
+ * 策略:
220
+ * - 每 100 次查询检查一次
221
+ * - 命中率 < 30%:降低阈值(提高命中率)
222
+ * - 命中率 > 80%:提高阈值(提高精确度)
223
+ */
224
+ async maybeAdjustThreshold() {
225
+ if (this.queryCount % this.config.queryWindowSize !== 0) {
226
+ return;
227
+ }
228
+ const hitRate = this.hitCount / this.queryCount;
229
+ let adjustment = 'none';
230
+ let newThreshold = this.currentThreshold;
231
+ if (hitRate < 0.3 && this.currentThreshold > this.config.minThreshold) {
232
+ // 命中率过低,降低阈值
233
+ newThreshold = Math.max(this.config.minThreshold, this.currentThreshold - this.config.adjustmentStep);
234
+ adjustment = 'decrease';
235
+ }
236
+ else if (hitRate > 0.8 && this.currentThreshold < this.config.maxThreshold) {
237
+ // 命中率过高,提高阈值(避免过度匹配)
238
+ newThreshold = Math.min(this.config.maxThreshold, this.currentThreshold + this.config.adjustmentStep);
239
+ adjustment = 'increase';
240
+ }
241
+ if (adjustment !== 'none' && newThreshold !== this.currentThreshold) {
242
+ this.currentThreshold = newThreshold;
243
+ // 记录调整日志
244
+ await this.pool.query(`
245
+ INSERT INTO cache_threshold_log (threshold_value, hit_rate, query_count, adjustment_reason)
246
+ VALUES ($1, $2, $3, $4)
247
+ `, [
248
+ this.currentThreshold,
249
+ hitRate,
250
+ this.queryCount,
251
+ `auto_${adjustment}`
252
+ ]);
253
+ console.log(`[PG Memory] Cache threshold adjusted: ${adjustment} to ${this.currentThreshold.toFixed(2)} (hit rate: ${(hitRate * 100).toFixed(1)}%)`);
254
+ }
255
+ // 重置计数器
256
+ this.hitCount = 0;
257
+ this.queryCount = 0;
258
+ }
259
+ /**
260
+ * 生成查询哈希
261
+ */
262
+ generateQueryHash(queryText) {
263
+ // 规范化查询文本
264
+ const normalized = queryText
265
+ .toLowerCase()
266
+ .replace(/\s+/g, ' ')
267
+ .trim();
268
+ return crypto
269
+ .createHash('sha256')
270
+ .update(normalized)
271
+ .digest('hex');
272
+ }
273
+ /**
274
+ * 生成查询向量
275
+ *
276
+ * 注意:实际应调用 embedding API
277
+ */
278
+ async generateQueryEmbedding(queryText) {
279
+ // 实际应调用 embedding API
280
+ // 例如:return await openai.embeddings.create({ input: queryText, model: 'text-embedding-3-small' });
281
+ // 简化版:返回随机向量(仅用于演示)
282
+ return new Array(1536).fill(0).map(() => (Math.random() - 0.5) * 0.1);
283
+ }
284
+ /**
285
+ * 标记缓存为已压缩(DCP 协同)
286
+ */
287
+ async markAsPruned(cacheId) {
288
+ await this.pool.query(`
289
+ UPDATE semantic_cache
290
+ SET is_pruned = TRUE
291
+ WHERE id = $1
292
+ `, [cacheId]);
293
+ }
294
+ /**
295
+ * 批量标记缓存为已压缩
296
+ */
297
+ async markMultipleAsPruned(cacheIds) {
298
+ if (cacheIds.length === 0)
299
+ return;
300
+ await this.pool.query(`
301
+ UPDATE semantic_cache
302
+ SET is_pruned = TRUE
303
+ WHERE id = ANY($1)
304
+ `, [cacheIds]);
305
+ }
306
+ /**
307
+ * 获取缓存统计
308
+ */
309
+ async getStats() {
310
+ const result = await this.pool.query(`
311
+ SELECT
312
+ COUNT(*) as total,
313
+ COUNT(*) FILTER (WHERE is_pruned = TRUE) as pruned,
314
+ COALESCE(SUM(hit_count), 0) as total_hits,
315
+ AVG(hit_count) as avg_hits
316
+ FROM semantic_cache
317
+ `);
318
+ return {
319
+ totalEntries: parseInt(result.rows[0].total, 10),
320
+ prunedEntries: parseInt(result.rows[0].pruned, 10),
321
+ totalHits: parseInt(result.rows[0].total_hits, 10),
322
+ currentThreshold: this.currentThreshold,
323
+ averageHitCount: parseFloat(result.rows[0].avg_hits || 0)
324
+ };
325
+ }
326
+ /**
327
+ * 清理过期缓存
328
+ */
329
+ async cleanupExpiredCache(maxAgeDays = 30) {
330
+ const result = await this.pool.query(`
331
+ DELETE FROM semantic_cache
332
+ WHERE last_hit_at < NOW() - INTERVAL '${maxAgeDays} days'
333
+ AND hit_count < 5
334
+ RETURNING id
335
+ `);
336
+ console.log(`[PG Memory] Cleaned up ${result.rowCount} expired cache entries`);
337
+ return result.rowCount;
338
+ }
339
+ /**
340
+ * 获取当前阈值
341
+ */
342
+ getCurrentThreshold() {
343
+ return this.currentThreshold;
344
+ }
345
+ /**
346
+ * 手动设置阈值
347
+ */
348
+ async setThreshold(threshold) {
349
+ if (threshold < this.config.minThreshold || threshold > this.config.maxThreshold) {
350
+ throw new Error(`Threshold must be between ${this.config.minThreshold} and ${this.config.maxThreshold}`);
351
+ }
352
+ this.currentThreshold = threshold;
353
+ // 记录手动调整
354
+ await this.pool.query(`
355
+ INSERT INTO cache_threshold_log (threshold_value, adjustment_reason)
356
+ VALUES ($1, $2)
357
+ `, [threshold, 'manual']);
358
+ console.log(`[PG Memory] Cache threshold manually set to: ${threshold}`);
359
+ }
360
+ }
361
+ exports.SemanticCacheManager = SemanticCacheManager;
362
+ /**
363
+ * 带缓存优先级的查询包装器
364
+ *
365
+ * 使用方式:
366
+ * 1. 首先检查语义缓存
367
+ * 2. 缓存命中:直接返回,零 token 消耗
368
+ * 3. 缓存未命中:执行实际查询,并存入缓存
369
+ */
370
+ async function queryWithCachePriority(queryText, actualQuery, cacheManager, shouldCache) {
371
+ // 1. 首先检查语义缓存
372
+ const cacheResult = await cacheManager.checkCache(queryText);
373
+ if (cacheResult.hit && cacheResult.response) {
374
+ // 缓存命中:直接返回
375
+ return {
376
+ result: JSON.parse(cacheResult.response),
377
+ fromCache: true,
378
+ similarity: cacheResult.similarity
379
+ };
380
+ }
381
+ // 2. 缓存未命中:执行实际查询
382
+ const result = await actualQuery();
383
+ // 3. 存入缓存(如果符合条件)
384
+ const shouldStore = shouldCache ? shouldCache(result) : true;
385
+ if (shouldStore) {
386
+ await cacheManager.storeCache(queryText, JSON.stringify(result));
387
+ }
388
+ return {
389
+ result,
390
+ fromCache: false
391
+ };
392
+ }
393
+ /**
394
+ * 创建缓存管理器实例
395
+ */
396
+ function createCacheManager(pool, config) {
397
+ return new SemanticCacheManager(pool, config);
398
+ }
399
+ //# sourceMappingURL=semantic-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-cache.js","sourceRoot":"","sources":["../../../src/cache/semantic-cache.ts"],"names":[],"mappings":"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"}