memento-mcp-server 1.9.2-a2 → 1.9.3-a

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 (66) hide show
  1. package/README.md +40 -0
  2. package/dist/algorithms/hybrid-search-engine.d.ts +6 -0
  3. package/dist/algorithms/hybrid-search-engine.d.ts.map +1 -1
  4. package/dist/algorithms/hybrid-search-engine.js +49 -3
  5. package/dist/algorithms/hybrid-search-engine.js.map +1 -1
  6. package/dist/algorithms/search-engine.d.ts.map +1 -1
  7. package/dist/algorithms/search-engine.js +42 -17
  8. package/dist/algorithms/search-engine.js.map +1 -1
  9. package/dist/algorithms/search-ranking.d.ts +33 -0
  10. package/dist/algorithms/search-ranking.d.ts.map +1 -1
  11. package/dist/algorithms/search-ranking.js +50 -1
  12. package/dist/algorithms/search-ranking.js.map +1 -1
  13. package/dist/config/environment.d.ts +7 -0
  14. package/dist/config/environment.d.ts.map +1 -1
  15. package/dist/config/environment.js +16 -0
  16. package/dist/config/environment.js.map +1 -1
  17. package/dist/config/index.d.ts.map +1 -1
  18. package/dist/config/index.js +4 -2
  19. package/dist/config/index.js.map +1 -1
  20. package/dist/database/migration/migrations/003-consolidation-score-fields.d.ts +79 -0
  21. package/dist/database/migration/migrations/003-consolidation-score-fields.d.ts.map +1 -0
  22. package/dist/database/migration/migrations/003-consolidation-score-fields.js +264 -0
  23. package/dist/database/migration/migrations/003-consolidation-score-fields.js.map +1 -0
  24. package/dist/database/migration/migrations/003-consolidation-score-fields.sql +52 -0
  25. package/dist/scripts/check-migration-status.js +8 -1
  26. package/dist/scripts/check-migration-status.js.map +1 -1
  27. package/dist/server/index.d.ts.map +1 -1
  28. package/dist/server/index.js +72 -1
  29. package/dist/server/index.js.map +1 -1
  30. package/dist/services/batch-scheduler.d.ts +17 -0
  31. package/dist/services/batch-scheduler.d.ts.map +1 -1
  32. package/dist/services/batch-scheduler.js +144 -0
  33. package/dist/services/batch-scheduler.js.map +1 -1
  34. package/dist/services/consolidation-score-service.d.ts +80 -0
  35. package/dist/services/consolidation-score-service.d.ts.map +1 -0
  36. package/dist/services/consolidation-score-service.js +182 -0
  37. package/dist/services/consolidation-score-service.js.map +1 -0
  38. package/dist/tools/memory-injection-prompt.d.ts +12 -0
  39. package/dist/tools/memory-injection-prompt.d.ts.map +1 -1
  40. package/dist/tools/memory-injection-prompt.js +105 -0
  41. package/dist/tools/memory-injection-prompt.js.map +1 -1
  42. package/dist/tools/recall-tool.d.ts +11 -0
  43. package/dist/tools/recall-tool.d.ts.map +1 -1
  44. package/dist/tools/recall-tool.js +110 -1
  45. package/dist/tools/recall-tool.js.map +1 -1
  46. package/dist/tools/remember-tool.d.ts.map +1 -1
  47. package/dist/tools/remember-tool.js +30 -3
  48. package/dist/tools/remember-tool.js.map +1 -1
  49. package/dist/tools/types.d.ts +2 -0
  50. package/dist/tools/types.d.ts.map +1 -1
  51. package/dist/tools/types.js.map +1 -1
  52. package/dist/types/consolidation-score.types.d.ts +67 -0
  53. package/dist/types/consolidation-score.types.d.ts.map +1 -0
  54. package/dist/types/consolidation-score.types.js +5 -0
  55. package/dist/types/consolidation-score.types.js.map +1 -0
  56. package/dist/types/index.d.ts +1 -0
  57. package/dist/types/index.d.ts.map +1 -1
  58. package/dist/utils/write-coalescing.d.ts +75 -0
  59. package/dist/utils/write-coalescing.d.ts.map +1 -0
  60. package/dist/utils/write-coalescing.js +133 -0
  61. package/dist/utils/write-coalescing.js.map +1 -0
  62. package/dist/workers/consolidation-score-worker.d.ts +99 -0
  63. package/dist/workers/consolidation-score-worker.d.ts.map +1 -0
  64. package/dist/workers/consolidation-score-worker.js +406 -0
  65. package/dist/workers/consolidation-score-worker.js.map +1 -0
  66. package/package.json +2 -1
@@ -0,0 +1,406 @@
1
+ /**
2
+ * Consolidation Score Worker
3
+ * 배치 재계산 작업을 수행하는 워커 클래스
4
+ *
5
+ * - 시간당 증분 재계산: 최근 1~12시간 내 갱신된 레코드만 재계산
6
+ * - 야간 전체 스윕: 전체 레코드 재계산
7
+ * - 바닥값/상한 재적용
8
+ */
9
+ import Database from 'better-sqlite3';
10
+ import { ConsolidationScoreService } from '../services/consolidation-score-service.js';
11
+ import { DatabaseUtils } from '../utils/database.js';
12
+ /**
13
+ * Consolidation Score Worker
14
+ */
15
+ export class ConsolidationScoreWorker {
16
+ config;
17
+ consolidationScoreService;
18
+ constructor(config) {
19
+ this.config = {
20
+ batchSize: 1000,
21
+ chunkSize: 100,
22
+ delayBetweenChunks: 100,
23
+ incrementalHours: 12,
24
+ minScore: 0.0,
25
+ maxScore: 1.0,
26
+ pinnedMinScore: 0.25,
27
+ enableLogging: true,
28
+ logProgressInterval: 1000,
29
+ ...config
30
+ };
31
+ this.consolidationScoreService = new ConsolidationScoreService();
32
+ }
33
+ /**
34
+ * 시간당 증분 재계산
35
+ * 최근 N시간 내 갱신된 레코드만 재계산
36
+ *
37
+ * @param db 데이터베이스 연결
38
+ * @param hours 재계산할 시간 범위 (기본값: config.incrementalHours)
39
+ * @returns 재계산 결과
40
+ */
41
+ async runIncrementalRecalculation(db, hours) {
42
+ const startTime = new Date();
43
+ const result = {
44
+ jobType: 'incremental',
45
+ startTime,
46
+ endTime: new Date(),
47
+ duration: 0,
48
+ success: false,
49
+ processed: 0,
50
+ updated: 0,
51
+ skipped: 0,
52
+ errors: [],
53
+ warnings: []
54
+ };
55
+ const targetHours = hours ?? this.config.incrementalHours;
56
+ const cutoffTime = new Date(Date.now() - targetHours * 60 * 60 * 1000);
57
+ try {
58
+ this.log(`Starting incremental recalculation (last ${targetHours} hours)`, {
59
+ cutoffTime: cutoffTime.toISOString()
60
+ });
61
+ // 최근 갱신된 레코드 조회 (last_accessed_at 또는 created_at 기준)
62
+ const records = this.fetchRecentRecords(db, cutoffTime);
63
+ if (records.length === 0) {
64
+ this.log('No records to process for incremental recalculation');
65
+ result.success = true;
66
+ result.endTime = new Date();
67
+ result.duration = result.endTime.getTime() - result.startTime.getTime();
68
+ return result;
69
+ }
70
+ this.log(`Found ${records.length} records to process`);
71
+ // 배치 단위로 처리
72
+ const batches = this.chunkArray(records, this.config.batchSize);
73
+ let batchesProcessed = 0;
74
+ let chunksProcessed = 0;
75
+ const processingTimes = [];
76
+ for (const batch of batches) {
77
+ const batchStartTime = Date.now();
78
+ // 청크 단위로 처리
79
+ const chunks = this.chunkArray(batch, this.config.chunkSize);
80
+ for (const chunk of chunks) {
81
+ const chunkStartTime = Date.now();
82
+ const chunkResult = await this.processChunk(db, chunk);
83
+ result.processed += chunkResult.processed;
84
+ result.updated += chunkResult.updated;
85
+ result.skipped += chunkResult.skipped;
86
+ if (chunkResult.errors.length > 0) {
87
+ result.errors.push(...chunkResult.errors);
88
+ }
89
+ chunksProcessed++;
90
+ processingTimes.push(Date.now() - chunkStartTime);
91
+ // 진행 상황 로깅
92
+ if (result.processed % this.config.logProgressInterval === 0) {
93
+ this.log(`Progress: ${result.processed} processed, ${result.updated} updated, ${result.skipped} skipped`);
94
+ }
95
+ // 청크 간 지연
96
+ if (chunks.length > 1) {
97
+ await this.delay(this.config.delayBetweenChunks);
98
+ }
99
+ }
100
+ batchesProcessed++;
101
+ this.log(`Batch ${batchesProcessed}/${batches.length} completed`, {
102
+ processed: result.processed,
103
+ updated: result.updated,
104
+ skipped: result.skipped
105
+ });
106
+ }
107
+ // 결과 요약
108
+ const avgProcessingTime = processingTimes.length > 0
109
+ ? processingTimes.reduce((a, b) => a + b, 0) / processingTimes.length
110
+ : 0;
111
+ result.success = result.errors.length === 0;
112
+ result.details = {
113
+ batchesProcessed,
114
+ chunksProcessed,
115
+ avgProcessingTime,
116
+ minScore: this.config.minScore,
117
+ maxScore: this.config.maxScore
118
+ };
119
+ this.log('Incremental recalculation completed', {
120
+ processed: result.processed,
121
+ updated: result.updated,
122
+ skipped: result.skipped,
123
+ errors: result.errors.length,
124
+ duration: result.duration
125
+ });
126
+ }
127
+ catch (error) {
128
+ result.errors.push(error instanceof Error ? error.message : String(error));
129
+ this.log('Incremental recalculation failed', { error }, 'error');
130
+ }
131
+ finally {
132
+ result.endTime = new Date();
133
+ result.duration = result.endTime.getTime() - result.startTime.getTime();
134
+ }
135
+ return result;
136
+ }
137
+ /**
138
+ * 야간 전체 스윕
139
+ * 전체 레코드 재계산
140
+ *
141
+ * @param db 데이터베이스 연결
142
+ * @returns 재계산 결과
143
+ */
144
+ async runFullSweep(db) {
145
+ const startTime = new Date();
146
+ const result = {
147
+ jobType: 'full_sweep',
148
+ startTime,
149
+ endTime: new Date(),
150
+ duration: 0,
151
+ success: false,
152
+ processed: 0,
153
+ updated: 0,
154
+ skipped: 0,
155
+ errors: [],
156
+ warnings: []
157
+ };
158
+ try {
159
+ this.log('Starting full sweep recalculation');
160
+ // 전체 레코드 조회
161
+ const records = this.fetchAllRecords(db);
162
+ if (records.length === 0) {
163
+ this.log('No records to process for full sweep');
164
+ result.success = true;
165
+ result.endTime = new Date();
166
+ result.duration = result.endTime.getTime() - result.startTime.getTime();
167
+ return result;
168
+ }
169
+ this.log(`Found ${records.length} records to process`);
170
+ // 배치 단위로 처리
171
+ const batches = this.chunkArray(records, this.config.batchSize);
172
+ let batchesProcessed = 0;
173
+ let chunksProcessed = 0;
174
+ const processingTimes = [];
175
+ const scoreDistribution = { high: 0, medium: 0, low: 0 };
176
+ for (const batch of batches) {
177
+ const batchStartTime = Date.now();
178
+ // 청크 단위로 처리
179
+ const chunks = this.chunkArray(batch, this.config.chunkSize);
180
+ for (const chunk of chunks) {
181
+ const chunkStartTime = Date.now();
182
+ const chunkResult = await this.processChunk(db, chunk);
183
+ result.processed += chunkResult.processed;
184
+ result.updated += chunkResult.updated;
185
+ result.skipped += chunkResult.skipped;
186
+ // 점수 분포 집계
187
+ for (const record of chunkResult.scores) {
188
+ if (record.score >= 0.8) {
189
+ scoreDistribution.high++;
190
+ }
191
+ else if (record.score >= 0.4) {
192
+ scoreDistribution.medium++;
193
+ }
194
+ else {
195
+ scoreDistribution.low++;
196
+ }
197
+ }
198
+ if (chunkResult.errors.length > 0) {
199
+ result.errors.push(...chunkResult.errors);
200
+ }
201
+ chunksProcessed++;
202
+ processingTimes.push(Date.now() - chunkStartTime);
203
+ // 진행 상황 로깅
204
+ if (result.processed % this.config.logProgressInterval === 0) {
205
+ this.log(`Progress: ${result.processed} processed, ${result.updated} updated, ${result.skipped} skipped`);
206
+ }
207
+ // 청크 간 지연
208
+ if (chunks.length > 1) {
209
+ await this.delay(this.config.delayBetweenChunks);
210
+ }
211
+ }
212
+ batchesProcessed++;
213
+ this.log(`Batch ${batchesProcessed}/${batches.length} completed`, {
214
+ processed: result.processed,
215
+ updated: result.updated,
216
+ skipped: result.skipped
217
+ });
218
+ }
219
+ // 결과 요약
220
+ const avgProcessingTime = processingTimes.length > 0
221
+ ? processingTimes.reduce((a, b) => a + b, 0) / processingTimes.length
222
+ : 0;
223
+ result.success = result.errors.length === 0;
224
+ result.details = {
225
+ batchesProcessed,
226
+ chunksProcessed,
227
+ avgProcessingTime,
228
+ minScore: this.config.minScore,
229
+ maxScore: this.config.maxScore,
230
+ scoreDistribution
231
+ };
232
+ this.log('Full sweep recalculation completed', {
233
+ processed: result.processed,
234
+ updated: result.updated,
235
+ skipped: result.skipped,
236
+ errors: result.errors.length,
237
+ duration: result.duration,
238
+ scoreDistribution
239
+ });
240
+ }
241
+ catch (error) {
242
+ result.errors.push(error instanceof Error ? error.message : String(error));
243
+ this.log('Full sweep recalculation failed', { error }, 'error');
244
+ }
245
+ finally {
246
+ result.endTime = new Date();
247
+ result.duration = result.endTime.getTime() - result.startTime.getTime();
248
+ }
249
+ return result;
250
+ }
251
+ /**
252
+ * 최근 갱신된 레코드 조회
253
+ * last_accessed_at 또는 created_at 기준으로 최근 N시간 내 레코드 조회
254
+ */
255
+ fetchRecentRecords(db, cutoffTime) {
256
+ const cutoffISO = cutoffTime.toISOString();
257
+ const sql = `
258
+ SELECT
259
+ id,
260
+ recall_count,
261
+ last_accessed_at,
262
+ created_at,
263
+ type,
264
+ pinned,
265
+ g_value
266
+ FROM memory_item
267
+ WHERE
268
+ (last_accessed_at IS NOT NULL AND last_accessed_at >= ?)
269
+ OR (last_accessed_at IS NULL AND created_at >= ?)
270
+ ORDER BY
271
+ COALESCE(last_accessed_at, created_at) DESC
272
+ `;
273
+ return db.prepare(sql).all(cutoffISO, cutoffISO);
274
+ }
275
+ /**
276
+ * 전체 레코드 조회
277
+ */
278
+ fetchAllRecords(db) {
279
+ const sql = `
280
+ SELECT
281
+ id,
282
+ recall_count,
283
+ last_accessed_at,
284
+ created_at,
285
+ type,
286
+ pinned,
287
+ g_value
288
+ FROM memory_item
289
+ ORDER BY created_at DESC
290
+ `;
291
+ return db.prepare(sql).all();
292
+ }
293
+ /**
294
+ * 청크 단위 처리
295
+ */
296
+ async processChunk(db, chunk) {
297
+ const result = {
298
+ processed: 0,
299
+ updated: 0,
300
+ skipped: 0,
301
+ errors: [],
302
+ scores: []
303
+ };
304
+ const now = new Date();
305
+ // 트랜잭션 내에서 처리
306
+ await DatabaseUtils.runTransaction(db, async () => {
307
+ for (const record of chunk) {
308
+ try {
309
+ result.processed++;
310
+ // last_accessed_at이 없으면 created_at 사용
311
+ const lastAccessedAt = record.last_accessed_at
312
+ ? new Date(record.last_accessed_at)
313
+ : new Date(record.created_at);
314
+ const createdAt = new Date(record.created_at);
315
+ // 경과 시간 계산
316
+ const timeElapsed = this.consolidationScoreService.calculateTimeElapsed(lastAccessedAt, createdAt, now);
317
+ // g_value 재계산 (필요한 경우)
318
+ let gValue = record.g_value;
319
+ if (gValue === null || record.recall_count === 0) {
320
+ // g_value가 없거나 recall_count가 0이면 처음부터 재계산
321
+ gValue = this.consolidationScoreService.recalculateGValue(record.recall_count, timeElapsed);
322
+ }
323
+ // consolidation_score 계산
324
+ const scoreResult = this.consolidationScoreService.calculateScore({
325
+ recallCount: record.recall_count,
326
+ lastAccessedAt,
327
+ createdAt,
328
+ gValue,
329
+ type: record.type,
330
+ pinned: record.pinned === 1 || record.pinned === true
331
+ });
332
+ // 바닥값/상한 재적용
333
+ let finalScore = scoreResult.score;
334
+ // 핀 고정 메모리는 최소 바닥값 보장
335
+ if (record.pinned === 1 || record.pinned === true) {
336
+ finalScore = Math.max(finalScore, this.config.pinnedMinScore);
337
+ }
338
+ // 일반 바닥값/상한 적용
339
+ finalScore = Math.max(finalScore, this.config.minScore);
340
+ finalScore = Math.min(finalScore, this.config.maxScore);
341
+ // 점수 변경이 있는 경우에만 업데이트
342
+ const currentScore = this.getCurrentScore(db, record.id);
343
+ if (currentScore === null || Math.abs(currentScore - finalScore) > 0.001) {
344
+ // 업데이트 실행
345
+ DatabaseUtils.run(db, `UPDATE memory_item
346
+ SET consolidation_score = ?, g_value = ?
347
+ WHERE id = ?`, [finalScore, gValue, record.id]);
348
+ result.updated++;
349
+ result.scores.push({ id: record.id, score: finalScore });
350
+ }
351
+ else {
352
+ result.skipped++;
353
+ }
354
+ }
355
+ catch (error) {
356
+ result.errors.push(`Record ${record.id}: ${error instanceof Error ? error.message : String(error)}`);
357
+ }
358
+ }
359
+ });
360
+ return result;
361
+ }
362
+ /**
363
+ * 현재 consolidation_score 조회
364
+ */
365
+ getCurrentScore(db, memoryId) {
366
+ const result = db.prepare('SELECT consolidation_score FROM memory_item WHERE id = ?').get(memoryId);
367
+ return result?.consolidation_score ?? null;
368
+ }
369
+ /**
370
+ * 배열을 청크로 분할
371
+ */
372
+ chunkArray(array, size) {
373
+ const chunks = [];
374
+ for (let i = 0; i < array.length; i += size) {
375
+ chunks.push(array.slice(i, i + size));
376
+ }
377
+ return chunks;
378
+ }
379
+ /**
380
+ * 지연 함수
381
+ */
382
+ delay(ms) {
383
+ return new Promise(resolve => setTimeout(resolve, ms));
384
+ }
385
+ /**
386
+ * 로깅
387
+ */
388
+ log(message, data, level = 'info') {
389
+ if (!this.config.enableLogging)
390
+ return;
391
+ const timestamp = new Date().toISOString();
392
+ const logMessage = `[${timestamp}] [ConsolidationScoreWorker] [${level.toUpperCase()}] ${message}`;
393
+ const logData = data ? JSON.stringify(data, null, 2) : '';
394
+ switch (level) {
395
+ case 'error':
396
+ console.error(logMessage, logData);
397
+ break;
398
+ case 'warn':
399
+ console.warn(logMessage, logData);
400
+ break;
401
+ default:
402
+ console.log(logMessage, logData);
403
+ }
404
+ }
405
+ }
406
+ //# sourceMappingURL=consolidation-score-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consolidation-score-worker.js","sourceRoot":"","sources":["../../src/workers/consolidation-score-worker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memento-mcp-server",
3
- "version": "1.9.2-a2",
3
+ "version": "1.9.3-a",
4
4
  "description": "AI Agent 기억 보조 MCP 서버 - 사람의 기억 구조를 모사한 스토리지+검색+요약+망각 메커니즘",
5
5
  "main": "dist/server/index.js",
6
6
  "type": "module",
@@ -26,6 +26,7 @@
26
26
  "db:init": "tsx src/database/init.ts",
27
27
  "db:migrate": "tsx src/database/migrate.ts",
28
28
  "db:check-migration": "tsx src/scripts/check-migration-status.ts",
29
+ "db:check-migration:help": "echo 'Usage: npm run db:check-migration [database-path]'",
29
30
  "test:client": "tsx src/test/test-client.ts",
30
31
  "test:http-v2": "tsx src/test/test-http-server-v2.ts",
31
32
  "test:search": "tsx src/test/test-search.ts",