memento-mcp-server 1.8.0 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/environment.d.ts.map +1 -1
- package/dist/config/environment.js +2 -1
- package/dist/config/environment.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +5 -2
- package/dist/config/index.js.map +1 -1
- package/dist/database/init.d.ts.map +1 -1
- package/dist/database/init.js +159 -7
- package/dist/database/init.js.map +1 -1
- package/dist/database/migration/backup-manager.d.ts +55 -0
- package/dist/database/migration/backup-manager.d.ts.map +1 -0
- package/dist/database/migration/backup-manager.js +181 -0
- package/dist/database/migration/backup-manager.js.map +1 -0
- package/dist/database/migration/dependency-validator.d.ts +62 -0
- package/dist/database/migration/dependency-validator.d.ts.map +1 -0
- package/dist/database/migration/dependency-validator.js +260 -0
- package/dist/database/migration/dependency-validator.js.map +1 -0
- package/dist/database/migration/migration-detector.d.ts +67 -0
- package/dist/database/migration/migration-detector.d.ts.map +1 -0
- package/dist/database/migration/migration-detector.js +129 -0
- package/dist/database/migration/migration-detector.js.map +1 -0
- package/dist/database/migration/migration-logger.d.ts +82 -0
- package/dist/database/migration/migration-logger.d.ts.map +1 -0
- package/dist/database/migration/migration-logger.js +168 -0
- package/dist/database/migration/migration-logger.js.map +1 -0
- package/dist/database/migration/migration-runner.d.ts +45 -0
- package/dist/database/migration/migration-runner.d.ts.map +1 -0
- package/dist/database/migration/migration-runner.js +194 -0
- package/dist/database/migration/migration-runner.js.map +1 -0
- package/dist/database/migration/migrations/002-mirix-schema-expansion.d.ts +55 -0
- package/dist/database/migration/migrations/002-mirix-schema-expansion.d.ts.map +1 -0
- package/dist/database/migration/migrations/002-mirix-schema-expansion.js +154 -0
- package/dist/database/migration/migrations/002-mirix-schema-expansion.js.map +1 -0
- package/dist/database/migration/schema-version-manager.d.ts +43 -0
- package/dist/database/migration/schema-version-manager.d.ts.map +1 -0
- package/dist/database/migration/schema-version-manager.js +146 -0
- package/dist/database/migration/schema-version-manager.js.map +1 -0
- package/dist/database/migration/types.d.ts +127 -0
- package/dist/database/migration/types.d.ts.map +1 -0
- package/dist/database/migration/types.js +5 -0
- package/dist/database/migration/types.js.map +1 -0
- package/dist/database/schema.sql +69 -1
- package/dist/npm-client/memento-client.d.ts.map +1 -1
- package/dist/npm-client/memento-client.js +39 -8
- package/dist/npm-client/memento-client.js.map +1 -1
- package/dist/npm-client/types.d.ts +16 -2
- package/dist/npm-client/types.d.ts.map +1 -1
- package/dist/npm-client/types.js.map +1 -1
- package/dist/npm-client/utils.d.ts.map +1 -1
- package/dist/npm-client/utils.js +44 -5
- package/dist/npm-client/utils.js.map +1 -1
- package/dist/repositories/core-memory-repository.d.ts +81 -0
- package/dist/repositories/core-memory-repository.d.ts.map +1 -0
- package/dist/repositories/core-memory-repository.js +263 -0
- package/dist/repositories/core-memory-repository.js.map +1 -0
- package/dist/repositories/knowledge-vault-repository.d.ts +102 -0
- package/dist/repositories/knowledge-vault-repository.d.ts.map +1 -0
- package/dist/repositories/knowledge-vault-repository.js +395 -0
- package/dist/repositories/knowledge-vault-repository.js.map +1 -0
- package/dist/services/core-memory-cache-service.d.ts +80 -0
- package/dist/services/core-memory-cache-service.d.ts.map +1 -0
- package/dist/services/core-memory-cache-service.js +122 -0
- package/dist/services/core-memory-cache-service.js.map +1 -0
- package/dist/services/core-memory-service.d.ts +117 -0
- package/dist/services/core-memory-service.d.ts.map +1 -0
- package/dist/services/core-memory-service.js +247 -0
- package/dist/services/core-memory-service.js.map +1 -0
- package/dist/services/knowledge-vault-service.d.ts +114 -0
- package/dist/services/knowledge-vault-service.d.ts.map +1 -0
- package/dist/services/knowledge-vault-service.js +233 -0
- package/dist/services/knowledge-vault-service.js.map +1 -0
- package/dist/tools/memory-injection-prompt.d.ts.map +1 -1
- package/dist/tools/memory-injection-prompt.js +28 -4
- package/dist/tools/memory-injection-prompt.js.map +1 -1
- package/dist/tools/recall-tool.d.ts.map +1 -1
- package/dist/tools/recall-tool.js +292 -82
- package/dist/tools/recall-tool.js.map +1 -1
- package/dist/tools/remember-tool.d.ts.map +1 -1
- package/dist/tools/remember-tool.js +282 -106
- package/dist/tools/remember-tool.js.map +1 -1
- package/dist/tools/types.d.ts +9 -2
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/types.js +11 -2
- package/dist/tools/types.js.map +1 -1
- package/dist/types/index.d.ts +20 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +7 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/type-param-validator.d.ts +31 -0
- package/dist/utils/type-param-validator.d.ts.map +1 -0
- package/dist/utils/type-param-validator.js +76 -0
- package/dist/utils/type-param-validator.js.map +1 -0
- package/package.json +1 -1
- package/src/database/schema.sql +69 -1
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge Vault Repository
|
|
3
|
+
* Knowledge Vault 테이블에 대한 데이터베이스 접근 로직
|
|
4
|
+
*/
|
|
5
|
+
import Database from 'better-sqlite3';
|
|
6
|
+
export class KnowledgeVaultRepository {
|
|
7
|
+
db;
|
|
8
|
+
constructor(db) {
|
|
9
|
+
this.db = db;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Knowledge Vault 생성
|
|
13
|
+
*/
|
|
14
|
+
async create(input) {
|
|
15
|
+
const { vault_id, agent_id = 'default', key, value, immutable = true, version = 1, previous_version_id = null, admin_override = false, deleted_at = null, origin_source = null } = input;
|
|
16
|
+
this.db.prepare(`
|
|
17
|
+
INSERT INTO knowledge_vault (
|
|
18
|
+
vault_id, agent_id, key, value, immutable, version,
|
|
19
|
+
previous_version_id, admin_override, deleted_at, origin_source
|
|
20
|
+
)
|
|
21
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
22
|
+
`).run(vault_id, agent_id, key, value, immutable ? 1 : 0, version, previous_version_id, admin_override ? 1 : 0, deleted_at, origin_source);
|
|
23
|
+
const result = await this.findById(vault_id);
|
|
24
|
+
if (!result) {
|
|
25
|
+
throw new Error(`Failed to create knowledge vault with id: ${vault_id}`);
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* ID로 Knowledge Vault 조회
|
|
31
|
+
*/
|
|
32
|
+
async findById(vault_id) {
|
|
33
|
+
const result = this.db.prepare(`
|
|
34
|
+
SELECT
|
|
35
|
+
vault_id,
|
|
36
|
+
agent_id,
|
|
37
|
+
key,
|
|
38
|
+
value,
|
|
39
|
+
immutable,
|
|
40
|
+
version,
|
|
41
|
+
previous_version_id,
|
|
42
|
+
admin_override,
|
|
43
|
+
deleted_at,
|
|
44
|
+
origin_source,
|
|
45
|
+
created_at,
|
|
46
|
+
updated_at
|
|
47
|
+
FROM knowledge_vault
|
|
48
|
+
WHERE vault_id = ?
|
|
49
|
+
`).get(vault_id);
|
|
50
|
+
if (!result) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
...result,
|
|
55
|
+
immutable: Boolean(result.immutable),
|
|
56
|
+
admin_override: Boolean(result.admin_override)
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* agent_id와 key로 활성 버전 조회 (deleted_at IS NULL인 최신 버전)
|
|
61
|
+
*/
|
|
62
|
+
async findActiveByKey(agent_id, key) {
|
|
63
|
+
const result = this.db.prepare(`
|
|
64
|
+
SELECT
|
|
65
|
+
vault_id,
|
|
66
|
+
agent_id,
|
|
67
|
+
key,
|
|
68
|
+
value,
|
|
69
|
+
immutable,
|
|
70
|
+
version,
|
|
71
|
+
previous_version_id,
|
|
72
|
+
admin_override,
|
|
73
|
+
deleted_at,
|
|
74
|
+
origin_source,
|
|
75
|
+
created_at,
|
|
76
|
+
updated_at
|
|
77
|
+
FROM knowledge_vault
|
|
78
|
+
WHERE agent_id = ? AND key = ? AND deleted_at IS NULL
|
|
79
|
+
ORDER BY version DESC
|
|
80
|
+
LIMIT 1
|
|
81
|
+
`).get(agent_id, key);
|
|
82
|
+
if (!result) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
...result,
|
|
87
|
+
immutable: Boolean(result.immutable),
|
|
88
|
+
admin_override: Boolean(result.admin_override)
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* agent_id와 key로 특정 버전 조회
|
|
93
|
+
*/
|
|
94
|
+
async findByKeyAndVersion(agent_id, key, version) {
|
|
95
|
+
const result = this.db.prepare(`
|
|
96
|
+
SELECT
|
|
97
|
+
vault_id,
|
|
98
|
+
agent_id,
|
|
99
|
+
key,
|
|
100
|
+
value,
|
|
101
|
+
immutable,
|
|
102
|
+
version,
|
|
103
|
+
previous_version_id,
|
|
104
|
+
admin_override,
|
|
105
|
+
deleted_at,
|
|
106
|
+
origin_source,
|
|
107
|
+
created_at,
|
|
108
|
+
updated_at
|
|
109
|
+
FROM knowledge_vault
|
|
110
|
+
WHERE agent_id = ? AND key = ? AND version = ?
|
|
111
|
+
`).get(agent_id, key, version);
|
|
112
|
+
if (!result) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
...result,
|
|
117
|
+
immutable: Boolean(result.immutable),
|
|
118
|
+
admin_override: Boolean(result.admin_override)
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* agent_id와 key로 모든 버전 조회 (삭제된 것 포함)
|
|
123
|
+
*/
|
|
124
|
+
async findAllVersionsByKey(agent_id, key) {
|
|
125
|
+
const results = this.db.prepare(`
|
|
126
|
+
SELECT
|
|
127
|
+
vault_id,
|
|
128
|
+
agent_id,
|
|
129
|
+
key,
|
|
130
|
+
value,
|
|
131
|
+
immutable,
|
|
132
|
+
version,
|
|
133
|
+
previous_version_id,
|
|
134
|
+
admin_override,
|
|
135
|
+
deleted_at,
|
|
136
|
+
origin_source,
|
|
137
|
+
created_at,
|
|
138
|
+
updated_at
|
|
139
|
+
FROM knowledge_vault
|
|
140
|
+
WHERE agent_id = ? AND key = ?
|
|
141
|
+
ORDER BY version ASC
|
|
142
|
+
`).all(agent_id, key);
|
|
143
|
+
return results.map(result => ({
|
|
144
|
+
...result,
|
|
145
|
+
immutable: Boolean(result.immutable),
|
|
146
|
+
admin_override: Boolean(result.admin_override)
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* agent_id로 모든 활성 Knowledge Vault 조회 (deleted_at IS NULL)
|
|
151
|
+
*/
|
|
152
|
+
async findActiveByAgentId(agent_id) {
|
|
153
|
+
const results = this.db.prepare(`
|
|
154
|
+
SELECT
|
|
155
|
+
vault_id,
|
|
156
|
+
agent_id,
|
|
157
|
+
key,
|
|
158
|
+
value,
|
|
159
|
+
immutable,
|
|
160
|
+
version,
|
|
161
|
+
previous_version_id,
|
|
162
|
+
admin_override,
|
|
163
|
+
deleted_at,
|
|
164
|
+
origin_source,
|
|
165
|
+
created_at,
|
|
166
|
+
updated_at
|
|
167
|
+
FROM knowledge_vault
|
|
168
|
+
WHERE agent_id = ? AND deleted_at IS NULL
|
|
169
|
+
ORDER BY key, version DESC
|
|
170
|
+
`).all(agent_id);
|
|
171
|
+
// 각 key별 최신 버전만 반환
|
|
172
|
+
const latestByKey = new Map();
|
|
173
|
+
for (const result of results) {
|
|
174
|
+
const existing = latestByKey.get(result.key);
|
|
175
|
+
if (!existing || result.version > existing.version) {
|
|
176
|
+
latestByKey.set(result.key, result);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return Array.from(latestByKey.values()).map(result => ({
|
|
180
|
+
...result,
|
|
181
|
+
immutable: Boolean(result.immutable),
|
|
182
|
+
admin_override: Boolean(result.admin_override)
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* agent_id로 모든 Knowledge Vault 조회 (삭제된 것 포함)
|
|
187
|
+
*/
|
|
188
|
+
async findByAgentId(agent_id) {
|
|
189
|
+
const results = this.db.prepare(`
|
|
190
|
+
SELECT
|
|
191
|
+
vault_id,
|
|
192
|
+
agent_id,
|
|
193
|
+
key,
|
|
194
|
+
value,
|
|
195
|
+
immutable,
|
|
196
|
+
version,
|
|
197
|
+
previous_version_id,
|
|
198
|
+
admin_override,
|
|
199
|
+
deleted_at,
|
|
200
|
+
origin_source,
|
|
201
|
+
created_at,
|
|
202
|
+
updated_at
|
|
203
|
+
FROM knowledge_vault
|
|
204
|
+
WHERE agent_id = ?
|
|
205
|
+
ORDER BY key, version ASC
|
|
206
|
+
`).all(agent_id);
|
|
207
|
+
return results.map(result => ({
|
|
208
|
+
...result,
|
|
209
|
+
immutable: Boolean(result.immutable),
|
|
210
|
+
admin_override: Boolean(result.admin_override)
|
|
211
|
+
}));
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Knowledge Vault 업데이트 (immutable=true인 경우 제한)
|
|
215
|
+
*/
|
|
216
|
+
async update(vault_id, input) {
|
|
217
|
+
const existing = await this.findById(vault_id);
|
|
218
|
+
if (!existing) {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
// immutable=true이고 admin_override=false인 경우 업데이트 불가
|
|
222
|
+
if (existing.immutable && !existing.admin_override && !input.admin_override) {
|
|
223
|
+
throw new Error(`Cannot update immutable knowledge vault: ${vault_id}`);
|
|
224
|
+
}
|
|
225
|
+
const updates = [];
|
|
226
|
+
const values = [];
|
|
227
|
+
if (input.value !== undefined) {
|
|
228
|
+
updates.push('value = ?');
|
|
229
|
+
values.push(input.value);
|
|
230
|
+
}
|
|
231
|
+
if (input.immutable !== undefined) {
|
|
232
|
+
updates.push('immutable = ?');
|
|
233
|
+
values.push(input.immutable ? 1 : 0);
|
|
234
|
+
}
|
|
235
|
+
if (input.admin_override !== undefined) {
|
|
236
|
+
updates.push('admin_override = ?');
|
|
237
|
+
values.push(input.admin_override ? 1 : 0);
|
|
238
|
+
}
|
|
239
|
+
if (input.origin_source !== undefined) {
|
|
240
|
+
updates.push('origin_source = ?');
|
|
241
|
+
values.push(input.origin_source);
|
|
242
|
+
}
|
|
243
|
+
if (updates.length === 0) {
|
|
244
|
+
return existing;
|
|
245
|
+
}
|
|
246
|
+
values.push(vault_id);
|
|
247
|
+
this.db.prepare(`
|
|
248
|
+
UPDATE knowledge_vault
|
|
249
|
+
SET ${updates.join(', ')}
|
|
250
|
+
WHERE vault_id = ?
|
|
251
|
+
`).run(...values);
|
|
252
|
+
return this.findById(vault_id);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Knowledge Vault 삭제 (soft delete: deleted_at 설정)
|
|
256
|
+
*/
|
|
257
|
+
async delete(vault_id) {
|
|
258
|
+
const existing = await this.findById(vault_id);
|
|
259
|
+
if (!existing) {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
// immutable=true이고 admin_override=false인 경우 삭제 불가
|
|
263
|
+
if (existing.immutable && !existing.admin_override) {
|
|
264
|
+
throw new Error(`Cannot delete immutable knowledge vault: ${vault_id}`);
|
|
265
|
+
}
|
|
266
|
+
const result = this.db.prepare(`
|
|
267
|
+
UPDATE knowledge_vault
|
|
268
|
+
SET deleted_at = CURRENT_TIMESTAMP
|
|
269
|
+
WHERE vault_id = ?
|
|
270
|
+
`).run(vault_id);
|
|
271
|
+
return result.changes > 0;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* agent_id와 key로 활성 버전 삭제 (soft delete)
|
|
275
|
+
*/
|
|
276
|
+
async deleteActiveByKey(agent_id, key) {
|
|
277
|
+
const active = await this.findActiveByKey(agent_id, key);
|
|
278
|
+
if (!active) {
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
// immutable=true이고 admin_override=false인 경우 삭제 불가
|
|
282
|
+
if (active.immutable && !active.admin_override) {
|
|
283
|
+
throw new Error(`Cannot delete immutable knowledge vault: agent_id=${agent_id}, key=${key}`);
|
|
284
|
+
}
|
|
285
|
+
const result = this.db.prepare(`
|
|
286
|
+
UPDATE knowledge_vault
|
|
287
|
+
SET deleted_at = CURRENT_TIMESTAMP
|
|
288
|
+
WHERE agent_id = ? AND key = ? AND deleted_at IS NULL
|
|
289
|
+
`).run(agent_id, key);
|
|
290
|
+
return result.changes > 0;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* 하드 삭제 (물리적 삭제, 주의 필요)
|
|
294
|
+
*/
|
|
295
|
+
async hardDelete(vault_id) {
|
|
296
|
+
const result = this.db.prepare(`
|
|
297
|
+
DELETE FROM knowledge_vault
|
|
298
|
+
WHERE vault_id = ?
|
|
299
|
+
`).run(vault_id);
|
|
300
|
+
return result.changes > 0;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* 모든 Knowledge Vault 조회 (관리용, 삭제된 것 포함)
|
|
304
|
+
*/
|
|
305
|
+
async findAll() {
|
|
306
|
+
const results = this.db.prepare(`
|
|
307
|
+
SELECT
|
|
308
|
+
vault_id,
|
|
309
|
+
agent_id,
|
|
310
|
+
key,
|
|
311
|
+
value,
|
|
312
|
+
immutable,
|
|
313
|
+
version,
|
|
314
|
+
previous_version_id,
|
|
315
|
+
admin_override,
|
|
316
|
+
deleted_at,
|
|
317
|
+
origin_source,
|
|
318
|
+
created_at,
|
|
319
|
+
updated_at
|
|
320
|
+
FROM knowledge_vault
|
|
321
|
+
ORDER BY agent_id, key, version ASC
|
|
322
|
+
`).all();
|
|
323
|
+
return results.map(result => ({
|
|
324
|
+
...result,
|
|
325
|
+
immutable: Boolean(result.immutable),
|
|
326
|
+
admin_override: Boolean(result.admin_override)
|
|
327
|
+
}));
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* 활성 Knowledge Vault만 조회 (deleted_at IS NULL)
|
|
331
|
+
*/
|
|
332
|
+
async findAllActive() {
|
|
333
|
+
const results = this.db.prepare(`
|
|
334
|
+
SELECT
|
|
335
|
+
vault_id,
|
|
336
|
+
agent_id,
|
|
337
|
+
key,
|
|
338
|
+
value,
|
|
339
|
+
immutable,
|
|
340
|
+
version,
|
|
341
|
+
previous_version_id,
|
|
342
|
+
admin_override,
|
|
343
|
+
deleted_at,
|
|
344
|
+
origin_source,
|
|
345
|
+
created_at,
|
|
346
|
+
updated_at
|
|
347
|
+
FROM knowledge_vault
|
|
348
|
+
WHERE deleted_at IS NULL
|
|
349
|
+
ORDER BY agent_id, key, version DESC
|
|
350
|
+
`).all();
|
|
351
|
+
// 각 (agent_id, key) 조합별 최신 버전만 반환
|
|
352
|
+
const latestByKey = new Map();
|
|
353
|
+
for (const result of results) {
|
|
354
|
+
const mapKey = `${result.agent_id}:${result.key}`;
|
|
355
|
+
const existing = latestByKey.get(mapKey);
|
|
356
|
+
if (!existing || result.version > existing.version) {
|
|
357
|
+
latestByKey.set(mapKey, result);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return Array.from(latestByKey.values()).map(result => ({
|
|
361
|
+
...result,
|
|
362
|
+
immutable: Boolean(result.immutable),
|
|
363
|
+
admin_override: Boolean(result.admin_override)
|
|
364
|
+
}));
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Knowledge Vault 개수 조회
|
|
368
|
+
*/
|
|
369
|
+
async count(agent_id, activeOnly = true) {
|
|
370
|
+
const whereClause = agent_id
|
|
371
|
+
? activeOnly
|
|
372
|
+
? 'WHERE agent_id = ? AND deleted_at IS NULL'
|
|
373
|
+
: 'WHERE agent_id = ?'
|
|
374
|
+
: activeOnly
|
|
375
|
+
? 'WHERE deleted_at IS NULL'
|
|
376
|
+
: '';
|
|
377
|
+
const query = `SELECT COUNT(*) as count FROM knowledge_vault ${whereClause}`;
|
|
378
|
+
const result = agent_id
|
|
379
|
+
? this.db.prepare(query).get(agent_id)
|
|
380
|
+
: this.db.prepare(query).get();
|
|
381
|
+
return result.count;
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* 다음 버전 번호 조회 (agent_id, key 기준)
|
|
385
|
+
*/
|
|
386
|
+
async getNextVersion(agent_id, key) {
|
|
387
|
+
const result = this.db.prepare(`
|
|
388
|
+
SELECT MAX(version) as max_version
|
|
389
|
+
FROM knowledge_vault
|
|
390
|
+
WHERE agent_id = ? AND key = ?
|
|
391
|
+
`).get(agent_id, key);
|
|
392
|
+
return (result?.max_version ?? 0) + 1;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
//# sourceMappingURL=knowledge-vault-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-vault-repository.js","sourceRoot":"","sources":["../../src/repositories/knowledge-vault-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Memory Cache Service
|
|
3
|
+
* always_load=true인 Core Memory 항목들을 메모리에 캐싱
|
|
4
|
+
*
|
|
5
|
+
* 클린코드 원칙:
|
|
6
|
+
* - 단일 책임 원칙: Core Memory 캐싱만 담당
|
|
7
|
+
* - TTL 없음: always_load=true인 항목은 영구적으로 메모리에 유지
|
|
8
|
+
* - 빠른 조회: Map 기반 O(1) 조회 성능
|
|
9
|
+
*/
|
|
10
|
+
import type { CoreMemoryRecord } from '../repositories/core-memory-repository.js';
|
|
11
|
+
import type { CoreMemoryCache } from './core-memory-service.js';
|
|
12
|
+
/**
|
|
13
|
+
* Core Memory Cache Service Implementation
|
|
14
|
+
* always_load=true인 Core Memory 항목들을 메모리에 캐싱
|
|
15
|
+
*/
|
|
16
|
+
export declare class CoreMemoryCacheService implements CoreMemoryCache {
|
|
17
|
+
private cache;
|
|
18
|
+
/**
|
|
19
|
+
* 항목을 캐시에 저장
|
|
20
|
+
*/
|
|
21
|
+
set(key: string, value: CoreMemoryRecord): void;
|
|
22
|
+
/**
|
|
23
|
+
* 캐시에서 항목 조회
|
|
24
|
+
*/
|
|
25
|
+
get(key: string): CoreMemoryRecord | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* 캐시에서 항목 삭제
|
|
28
|
+
*/
|
|
29
|
+
delete(key: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* 캐시 전체 조회 (always_load=true인 항목들)
|
|
32
|
+
*/
|
|
33
|
+
getAll(): CoreMemoryRecord[];
|
|
34
|
+
/**
|
|
35
|
+
* 캐시 무효화
|
|
36
|
+
*/
|
|
37
|
+
clear(): void;
|
|
38
|
+
/**
|
|
39
|
+
* 캐시에 항목이 있는지 확인
|
|
40
|
+
*/
|
|
41
|
+
has(key: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* 캐시 크기 반환
|
|
44
|
+
*/
|
|
45
|
+
size(): number;
|
|
46
|
+
/**
|
|
47
|
+
* 캐시 키 목록 반환
|
|
48
|
+
*/
|
|
49
|
+
keys(): string[];
|
|
50
|
+
/**
|
|
51
|
+
* agent_id로 필터링된 항목 조회
|
|
52
|
+
*/
|
|
53
|
+
getByAgentId(agent_id: string): CoreMemoryRecord[];
|
|
54
|
+
/**
|
|
55
|
+
* agent_id로 필터링된 항목 삭제
|
|
56
|
+
*/
|
|
57
|
+
deleteByAgentId(agent_id: string): number;
|
|
58
|
+
/**
|
|
59
|
+
* 캐시 통계 반환
|
|
60
|
+
*/
|
|
61
|
+
getStats(): {
|
|
62
|
+
size: number;
|
|
63
|
+
agentIds: string[];
|
|
64
|
+
keys: string[];
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 전역 Core Memory Cache 인스턴스 가져오기
|
|
69
|
+
* 서버 초기화 시 생성된 캐시를 공유합니다.
|
|
70
|
+
*/
|
|
71
|
+
export declare function getCoreMemoryCache(): CoreMemoryCacheService;
|
|
72
|
+
/**
|
|
73
|
+
* Core Memory Cache 인스턴스 설정 (초기화 시 사용)
|
|
74
|
+
*/
|
|
75
|
+
export declare function setCoreMemoryCache(cache: CoreMemoryCacheService): void;
|
|
76
|
+
/**
|
|
77
|
+
* Core Memory Cache 인스턴스 초기화 (테스트용)
|
|
78
|
+
*/
|
|
79
|
+
export declare function resetCoreMemoryCache(): void;
|
|
80
|
+
//# sourceMappingURL=core-memory-cache-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-memory-cache-service.d.ts","sourceRoot":"","sources":["../../src/services/core-memory-cache-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,eAAe;IAC5D,OAAO,CAAC,KAAK,CAA4C;IAEzD;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI;IAI/C;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAI9C;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B;;OAEG;IACH,MAAM,IAAI,gBAAgB,EAAE;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAIhB;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAMlD;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAWzC;;OAEG;IACH,QAAQ,IAAI;QACV,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB;CAYF;AAKD;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,sBAAsB,CAK3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAEtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Memory Cache Service
|
|
3
|
+
* always_load=true인 Core Memory 항목들을 메모리에 캐싱
|
|
4
|
+
*
|
|
5
|
+
* 클린코드 원칙:
|
|
6
|
+
* - 단일 책임 원칙: Core Memory 캐싱만 담당
|
|
7
|
+
* - TTL 없음: always_load=true인 항목은 영구적으로 메모리에 유지
|
|
8
|
+
* - 빠른 조회: Map 기반 O(1) 조회 성능
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Core Memory Cache Service Implementation
|
|
12
|
+
* always_load=true인 Core Memory 항목들을 메모리에 캐싱
|
|
13
|
+
*/
|
|
14
|
+
export class CoreMemoryCacheService {
|
|
15
|
+
cache = new Map();
|
|
16
|
+
/**
|
|
17
|
+
* 항목을 캐시에 저장
|
|
18
|
+
*/
|
|
19
|
+
set(key, value) {
|
|
20
|
+
this.cache.set(key, value);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 캐시에서 항목 조회
|
|
24
|
+
*/
|
|
25
|
+
get(key) {
|
|
26
|
+
return this.cache.get(key);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 캐시에서 항목 삭제
|
|
30
|
+
*/
|
|
31
|
+
delete(key) {
|
|
32
|
+
return this.cache.delete(key);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 캐시 전체 조회 (always_load=true인 항목들)
|
|
36
|
+
*/
|
|
37
|
+
getAll() {
|
|
38
|
+
return Array.from(this.cache.values());
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 캐시 무효화
|
|
42
|
+
*/
|
|
43
|
+
clear() {
|
|
44
|
+
this.cache.clear();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 캐시에 항목이 있는지 확인
|
|
48
|
+
*/
|
|
49
|
+
has(key) {
|
|
50
|
+
return this.cache.has(key);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 캐시 크기 반환
|
|
54
|
+
*/
|
|
55
|
+
size() {
|
|
56
|
+
return this.cache.size;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 캐시 키 목록 반환
|
|
60
|
+
*/
|
|
61
|
+
keys() {
|
|
62
|
+
return Array.from(this.cache.keys());
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* agent_id로 필터링된 항목 조회
|
|
66
|
+
*/
|
|
67
|
+
getByAgentId(agent_id) {
|
|
68
|
+
return Array.from(this.cache.values()).filter(record => record.agent_id === agent_id);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* agent_id로 필터링된 항목 삭제
|
|
72
|
+
*/
|
|
73
|
+
deleteByAgentId(agent_id) {
|
|
74
|
+
let deletedCount = 0;
|
|
75
|
+
for (const [key, record] of this.cache.entries()) {
|
|
76
|
+
if (record.agent_id === agent_id) {
|
|
77
|
+
this.cache.delete(key);
|
|
78
|
+
deletedCount++;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return deletedCount;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 캐시 통계 반환
|
|
85
|
+
*/
|
|
86
|
+
getStats() {
|
|
87
|
+
const agentIds = new Set();
|
|
88
|
+
for (const record of this.cache.values()) {
|
|
89
|
+
agentIds.add(record.agent_id);
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
size: this.cache.size,
|
|
93
|
+
agentIds: Array.from(agentIds),
|
|
94
|
+
keys: Array.from(this.cache.keys())
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// 싱글톤 인스턴스
|
|
99
|
+
let cacheInstance = null;
|
|
100
|
+
/**
|
|
101
|
+
* 전역 Core Memory Cache 인스턴스 가져오기
|
|
102
|
+
* 서버 초기화 시 생성된 캐시를 공유합니다.
|
|
103
|
+
*/
|
|
104
|
+
export function getCoreMemoryCache() {
|
|
105
|
+
if (!cacheInstance) {
|
|
106
|
+
cacheInstance = new CoreMemoryCacheService();
|
|
107
|
+
}
|
|
108
|
+
return cacheInstance;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Core Memory Cache 인스턴스 설정 (초기화 시 사용)
|
|
112
|
+
*/
|
|
113
|
+
export function setCoreMemoryCache(cache) {
|
|
114
|
+
cacheInstance = cache;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Core Memory Cache 인스턴스 초기화 (테스트용)
|
|
118
|
+
*/
|
|
119
|
+
export function resetCoreMemoryCache() {
|
|
120
|
+
cacheInstance = null;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=core-memory-cache-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-memory-cache-service.js","sourceRoot":"","sources":["../../src/services/core-memory-cache-service.ts"],"names":[],"mappings":"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"}
|