memento-mcp-server 1.8.0 → 1.9.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/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/server/http-server.d.ts.map +1 -1
- package/dist/server/http-server.js +2 -0
- package/dist/server/http-server.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- 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,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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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Memory Service
|
|
3
|
+
* Core Memory에 대한 비즈니스 로직 처리
|
|
4
|
+
*
|
|
5
|
+
* 클린코드 원칙:
|
|
6
|
+
* - 단일 책임 원칙: Core Memory 비즈니스 로직만 담당
|
|
7
|
+
* - 의존성 역전: Repository에 의존
|
|
8
|
+
* - 캐시 연동: always_load=true인 항목은 캐시에 유지
|
|
9
|
+
*/
|
|
10
|
+
import { CoreMemoryRepository, type CoreMemoryRecord } from '../repositories/core-memory-repository.js';
|
|
11
|
+
export interface CoreMemoryCache {
|
|
12
|
+
/**
|
|
13
|
+
* 항목을 캐시에 저장
|
|
14
|
+
*/
|
|
15
|
+
set(key: string, value: CoreMemoryRecord): void;
|
|
16
|
+
/**
|
|
17
|
+
* 캐시에서 항목 조회
|
|
18
|
+
*/
|
|
19
|
+
get(key: string): CoreMemoryRecord | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* 캐시에서 항목 삭제
|
|
22
|
+
*/
|
|
23
|
+
delete(key: string): void;
|
|
24
|
+
/**
|
|
25
|
+
* 캐시 전체 조회 (always_load=true인 항목들)
|
|
26
|
+
*/
|
|
27
|
+
getAll(): CoreMemoryRecord[];
|
|
28
|
+
/**
|
|
29
|
+
* 캐시 무효화
|
|
30
|
+
*/
|
|
31
|
+
clear(): void;
|
|
32
|
+
/**
|
|
33
|
+
* 캐시 크기 반환
|
|
34
|
+
*/
|
|
35
|
+
size(): number;
|
|
36
|
+
}
|
|
37
|
+
export interface CreateCoreMemoryServiceInput {
|
|
38
|
+
agent_id?: string;
|
|
39
|
+
key: string;
|
|
40
|
+
value: string;
|
|
41
|
+
always_load?: boolean;
|
|
42
|
+
origin_source?: string | null;
|
|
43
|
+
}
|
|
44
|
+
export interface UpdateCoreMemoryServiceInput {
|
|
45
|
+
value?: string;
|
|
46
|
+
always_load?: boolean;
|
|
47
|
+
origin_source?: string | null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Core Memory Service
|
|
51
|
+
*/
|
|
52
|
+
export declare class CoreMemoryService {
|
|
53
|
+
private repository;
|
|
54
|
+
private cache;
|
|
55
|
+
constructor(repository: CoreMemoryRepository, cache?: CoreMemoryCache);
|
|
56
|
+
/**
|
|
57
|
+
* 캐시 서비스 설정
|
|
58
|
+
*/
|
|
59
|
+
setCache(cache: CoreMemoryCache): void;
|
|
60
|
+
/**
|
|
61
|
+
* Core Memory 생성
|
|
62
|
+
*/
|
|
63
|
+
create(input: CreateCoreMemoryServiceInput): Promise<CoreMemoryRecord>;
|
|
64
|
+
/**
|
|
65
|
+
* ID로 Core Memory 조회
|
|
66
|
+
*/
|
|
67
|
+
findById(core_id: string): Promise<CoreMemoryRecord | null>;
|
|
68
|
+
/**
|
|
69
|
+
* agent_id와 key로 Core Memory 조회 (캐시 우선)
|
|
70
|
+
*/
|
|
71
|
+
findByKey(agent_id: string, key: string): Promise<CoreMemoryRecord | null>;
|
|
72
|
+
/**
|
|
73
|
+
* agent_id로 모든 Core Memory 조회
|
|
74
|
+
*/
|
|
75
|
+
findByAgentId(agent_id: string): Promise<CoreMemoryRecord[]>;
|
|
76
|
+
/**
|
|
77
|
+
* always_load=true인 Core Memory 조회 (캐시 우선)
|
|
78
|
+
*/
|
|
79
|
+
findAlwaysLoad(agent_id?: string): Promise<CoreMemoryRecord[]>;
|
|
80
|
+
/**
|
|
81
|
+
* Core Memory 업데이트
|
|
82
|
+
*/
|
|
83
|
+
update(core_id: string, input: UpdateCoreMemoryServiceInput): Promise<CoreMemoryRecord | null>;
|
|
84
|
+
/**
|
|
85
|
+
* agent_id와 key로 Core Memory 업데이트
|
|
86
|
+
*/
|
|
87
|
+
updateByKey(agent_id: string, key: string, input: UpdateCoreMemoryServiceInput): Promise<CoreMemoryRecord | null>;
|
|
88
|
+
/**
|
|
89
|
+
* Core Memory 삭제
|
|
90
|
+
*/
|
|
91
|
+
delete(core_id: string): Promise<boolean>;
|
|
92
|
+
/**
|
|
93
|
+
* agent_id와 key로 Core Memory 삭제
|
|
94
|
+
*/
|
|
95
|
+
deleteByKey(agent_id: string, key: string): Promise<boolean>;
|
|
96
|
+
/**
|
|
97
|
+
* agent_id로 모든 Core Memory 삭제
|
|
98
|
+
*/
|
|
99
|
+
deleteByAgentId(agent_id: string): Promise<number>;
|
|
100
|
+
/**
|
|
101
|
+
* 모든 Core Memory 조회 (관리용)
|
|
102
|
+
*/
|
|
103
|
+
findAll(): Promise<CoreMemoryRecord[]>;
|
|
104
|
+
/**
|
|
105
|
+
* Core Memory 개수 조회
|
|
106
|
+
*/
|
|
107
|
+
count(agent_id?: string): Promise<number>;
|
|
108
|
+
/**
|
|
109
|
+
* 캐시 키 생성
|
|
110
|
+
*/
|
|
111
|
+
private getCacheKey;
|
|
112
|
+
/**
|
|
113
|
+
* 캐시 무효화 및 재로드 (always_load=true인 항목들)
|
|
114
|
+
*/
|
|
115
|
+
reloadCache(agent_id?: string): Promise<void>;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=core-memory-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-memory-service.d.ts","sourceRoot":"","sources":["../../src/services/core-memory-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Memory Service
|
|
3
|
+
* Core Memory에 대한 비즈니스 로직 처리
|
|
4
|
+
*
|
|
5
|
+
* 클린코드 원칙:
|
|
6
|
+
* - 단일 책임 원칙: Core Memory 비즈니스 로직만 담당
|
|
7
|
+
* - 의존성 역전: Repository에 의존
|
|
8
|
+
* - 캐시 연동: always_load=true인 항목은 캐시에 유지
|
|
9
|
+
*/
|
|
10
|
+
import { CoreMemoryRepository } from '../repositories/core-memory-repository.js';
|
|
11
|
+
/**
|
|
12
|
+
* Core Memory ID 생성 유틸리티
|
|
13
|
+
*/
|
|
14
|
+
function generateCoreId() {
|
|
15
|
+
const timestamp = Date.now();
|
|
16
|
+
const random = Math.random().toString(36).substring(2, 11);
|
|
17
|
+
return `core_${timestamp}_${random}`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Core Memory Service
|
|
21
|
+
*/
|
|
22
|
+
export class CoreMemoryService {
|
|
23
|
+
repository;
|
|
24
|
+
cache = null;
|
|
25
|
+
constructor(repository, cache) {
|
|
26
|
+
this.repository = repository;
|
|
27
|
+
this.cache = cache || null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 캐시 서비스 설정
|
|
31
|
+
*/
|
|
32
|
+
setCache(cache) {
|
|
33
|
+
this.cache = cache;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Core Memory 생성
|
|
37
|
+
*/
|
|
38
|
+
async create(input) {
|
|
39
|
+
const { agent_id = 'default', key, value, always_load = false, origin_source = null } = input;
|
|
40
|
+
// 기존 key가 있는지 확인 (UNIQUE 제약)
|
|
41
|
+
const existing = await this.repository.findByKey(agent_id, key);
|
|
42
|
+
if (existing) {
|
|
43
|
+
throw new Error(`Core memory with key '${key}' already exists for agent '${agent_id}'`);
|
|
44
|
+
}
|
|
45
|
+
const core_id = generateCoreId();
|
|
46
|
+
const record = await this.repository.create({
|
|
47
|
+
core_id,
|
|
48
|
+
agent_id,
|
|
49
|
+
key,
|
|
50
|
+
value,
|
|
51
|
+
always_load,
|
|
52
|
+
origin_source
|
|
53
|
+
});
|
|
54
|
+
// always_load=true인 경우 캐시에 추가
|
|
55
|
+
if (always_load && this.cache) {
|
|
56
|
+
this.cache.set(this.getCacheKey(agent_id, key), record);
|
|
57
|
+
}
|
|
58
|
+
return record;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* ID로 Core Memory 조회
|
|
62
|
+
*/
|
|
63
|
+
async findById(core_id) {
|
|
64
|
+
return this.repository.findById(core_id);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* agent_id와 key로 Core Memory 조회 (캐시 우선)
|
|
68
|
+
*/
|
|
69
|
+
async findByKey(agent_id, key) {
|
|
70
|
+
// 캐시에서 먼저 조회
|
|
71
|
+
if (this.cache) {
|
|
72
|
+
const cached = this.cache.get(this.getCacheKey(agent_id, key));
|
|
73
|
+
if (cached) {
|
|
74
|
+
return cached;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// 캐시에 없으면 DB에서 조회
|
|
78
|
+
const record = await this.repository.findByKey(agent_id, key);
|
|
79
|
+
// always_load=true이고 캐시에 없으면 캐시에 추가
|
|
80
|
+
if (record && record.always_load && this.cache) {
|
|
81
|
+
this.cache.set(this.getCacheKey(agent_id, key), record);
|
|
82
|
+
}
|
|
83
|
+
return record;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* agent_id로 모든 Core Memory 조회
|
|
87
|
+
*/
|
|
88
|
+
async findByAgentId(agent_id) {
|
|
89
|
+
return this.repository.findByAgentId(agent_id);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* always_load=true인 Core Memory 조회 (캐시 우선)
|
|
93
|
+
*/
|
|
94
|
+
async findAlwaysLoad(agent_id) {
|
|
95
|
+
// 캐시가 있고 캐시에 데이터가 있으면 캐시에서 조회
|
|
96
|
+
if (this.cache && this.cache.size() > 0) {
|
|
97
|
+
const cached = this.cache.getAll();
|
|
98
|
+
if (agent_id) {
|
|
99
|
+
return cached.filter(record => record.agent_id === agent_id);
|
|
100
|
+
}
|
|
101
|
+
return cached;
|
|
102
|
+
}
|
|
103
|
+
// 캐시가 없거나 비어있으면 DB에서 조회
|
|
104
|
+
const dbItems = await this.repository.findAlwaysLoad(agent_id);
|
|
105
|
+
// 캐시가 있으면 DB에서 조회한 항목들을 캐시에 로드
|
|
106
|
+
if (this.cache) {
|
|
107
|
+
for (const item of dbItems) {
|
|
108
|
+
const cacheKey = this.getCacheKey(item.agent_id, item.key);
|
|
109
|
+
this.cache.set(cacheKey, item);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return dbItems;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Core Memory 업데이트
|
|
116
|
+
*/
|
|
117
|
+
async update(core_id, input) {
|
|
118
|
+
const existing = await this.repository.findById(core_id);
|
|
119
|
+
if (!existing) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
const updated = await this.repository.update(core_id, input);
|
|
123
|
+
if (!updated) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
// 캐시 업데이트
|
|
127
|
+
if (this.cache) {
|
|
128
|
+
const cacheKey = this.getCacheKey(updated.agent_id, updated.key);
|
|
129
|
+
if (updated.always_load) {
|
|
130
|
+
// always_load=true인 경우 캐시에 추가/업데이트
|
|
131
|
+
this.cache.set(cacheKey, updated);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// always_load=false로 변경된 경우 캐시에서 제거
|
|
135
|
+
this.cache.delete(cacheKey);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return updated;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* agent_id와 key로 Core Memory 업데이트
|
|
142
|
+
*/
|
|
143
|
+
async updateByKey(agent_id, key, input) {
|
|
144
|
+
const existing = await this.repository.findByKey(agent_id, key);
|
|
145
|
+
if (!existing) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
const updated = await this.repository.updateByKey(agent_id, key, input);
|
|
149
|
+
if (!updated) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
// 캐시 업데이트
|
|
153
|
+
if (this.cache) {
|
|
154
|
+
const cacheKey = this.getCacheKey(agent_id, key);
|
|
155
|
+
if (updated.always_load) {
|
|
156
|
+
// always_load=true인 경우 캐시에 추가/업데이트
|
|
157
|
+
this.cache.set(cacheKey, updated);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
// always_load=false로 변경된 경우 캐시에서 제거
|
|
161
|
+
this.cache.delete(cacheKey);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return updated;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Core Memory 삭제
|
|
168
|
+
*/
|
|
169
|
+
async delete(core_id) {
|
|
170
|
+
const existing = await this.repository.findById(core_id);
|
|
171
|
+
if (!existing) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
const deleted = await this.repository.delete(core_id);
|
|
175
|
+
// 캐시에서도 제거
|
|
176
|
+
if (deleted && this.cache) {
|
|
177
|
+
this.cache.delete(this.getCacheKey(existing.agent_id, existing.key));
|
|
178
|
+
}
|
|
179
|
+
return deleted;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* agent_id와 key로 Core Memory 삭제
|
|
183
|
+
*/
|
|
184
|
+
async deleteByKey(agent_id, key) {
|
|
185
|
+
const existing = await this.repository.findByKey(agent_id, key);
|
|
186
|
+
if (!existing) {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
const deleted = await this.repository.deleteByKey(agent_id, key);
|
|
190
|
+
// 캐시에서도 제거
|
|
191
|
+
if (deleted && this.cache) {
|
|
192
|
+
this.cache.delete(this.getCacheKey(agent_id, key));
|
|
193
|
+
}
|
|
194
|
+
return deleted;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* agent_id로 모든 Core Memory 삭제
|
|
198
|
+
*/
|
|
199
|
+
async deleteByAgentId(agent_id) {
|
|
200
|
+
const deleted = await this.repository.deleteByAgentId(agent_id);
|
|
201
|
+
// 캐시에서도 제거
|
|
202
|
+
if (deleted > 0 && this.cache) {
|
|
203
|
+
// 캐시에서 해당 agent_id의 항목들 제거
|
|
204
|
+
const cached = this.cache.getAll();
|
|
205
|
+
for (const record of cached) {
|
|
206
|
+
if (record.agent_id === agent_id) {
|
|
207
|
+
this.cache.delete(this.getCacheKey(agent_id, record.key));
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return deleted;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* 모든 Core Memory 조회 (관리용)
|
|
215
|
+
*/
|
|
216
|
+
async findAll() {
|
|
217
|
+
return this.repository.findAll();
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Core Memory 개수 조회
|
|
221
|
+
*/
|
|
222
|
+
async count(agent_id) {
|
|
223
|
+
return this.repository.count(agent_id);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* 캐시 키 생성
|
|
227
|
+
*/
|
|
228
|
+
getCacheKey(agent_id, key) {
|
|
229
|
+
return `${agent_id}:${key}`;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* 캐시 무효화 및 재로드 (always_load=true인 항목들)
|
|
233
|
+
*/
|
|
234
|
+
async reloadCache(agent_id) {
|
|
235
|
+
if (!this.cache) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
// 캐시 클리어
|
|
239
|
+
this.cache.clear();
|
|
240
|
+
// always_load=true인 항목들을 DB에서 조회하여 캐시에 로드
|
|
241
|
+
const alwaysLoadItems = await this.repository.findAlwaysLoad(agent_id);
|
|
242
|
+
for (const item of alwaysLoadItems) {
|
|
243
|
+
this.cache.set(this.getCacheKey(item.agent_id, item.key), item);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=core-memory-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-memory-service.js","sourceRoot":"","sources":["../../src/services/core-memory-service.ts"],"names":[],"mappings":"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"}
|