memento-mcp-server 1.7.5 → 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.
Files changed (116) hide show
  1. package/README.md +1 -0
  2. package/dist/config/environment.d.ts.map +1 -1
  3. package/dist/config/environment.js +2 -1
  4. package/dist/config/environment.js.map +1 -1
  5. package/dist/config/index.d.ts.map +1 -1
  6. package/dist/config/index.js +5 -2
  7. package/dist/config/index.js.map +1 -1
  8. package/dist/database/init.d.ts.map +1 -1
  9. package/dist/database/init.js +159 -7
  10. package/dist/database/init.js.map +1 -1
  11. package/dist/database/migration/backup-manager.d.ts +55 -0
  12. package/dist/database/migration/backup-manager.d.ts.map +1 -0
  13. package/dist/database/migration/backup-manager.js +181 -0
  14. package/dist/database/migration/backup-manager.js.map +1 -0
  15. package/dist/database/migration/dependency-validator.d.ts +62 -0
  16. package/dist/database/migration/dependency-validator.d.ts.map +1 -0
  17. package/dist/database/migration/dependency-validator.js +260 -0
  18. package/dist/database/migration/dependency-validator.js.map +1 -0
  19. package/dist/database/migration/migration-detector.d.ts +67 -0
  20. package/dist/database/migration/migration-detector.d.ts.map +1 -0
  21. package/dist/database/migration/migration-detector.js +129 -0
  22. package/dist/database/migration/migration-detector.js.map +1 -0
  23. package/dist/database/migration/migration-logger.d.ts +82 -0
  24. package/dist/database/migration/migration-logger.d.ts.map +1 -0
  25. package/dist/database/migration/migration-logger.js +168 -0
  26. package/dist/database/migration/migration-logger.js.map +1 -0
  27. package/dist/database/migration/migration-runner.d.ts +45 -0
  28. package/dist/database/migration/migration-runner.d.ts.map +1 -0
  29. package/dist/database/migration/migration-runner.js +194 -0
  30. package/dist/database/migration/migration-runner.js.map +1 -0
  31. package/dist/database/migration/migrations/002-mirix-schema-expansion.d.ts +55 -0
  32. package/dist/database/migration/migrations/002-mirix-schema-expansion.d.ts.map +1 -0
  33. package/dist/database/migration/migrations/002-mirix-schema-expansion.js +154 -0
  34. package/dist/database/migration/migrations/002-mirix-schema-expansion.js.map +1 -0
  35. package/dist/database/migration/schema-version-manager.d.ts +43 -0
  36. package/dist/database/migration/schema-version-manager.d.ts.map +1 -0
  37. package/dist/database/migration/schema-version-manager.js +146 -0
  38. package/dist/database/migration/schema-version-manager.js.map +1 -0
  39. package/dist/database/migration/types.d.ts +127 -0
  40. package/dist/database/migration/types.d.ts.map +1 -0
  41. package/dist/database/migration/types.js +5 -0
  42. package/dist/database/migration/types.js.map +1 -0
  43. package/dist/database/schema.sql +69 -1
  44. package/dist/npm-client/memento-client.d.ts.map +1 -1
  45. package/dist/npm-client/memento-client.js +39 -8
  46. package/dist/npm-client/memento-client.js.map +1 -1
  47. package/dist/npm-client/types.d.ts +16 -2
  48. package/dist/npm-client/types.d.ts.map +1 -1
  49. package/dist/npm-client/types.js.map +1 -1
  50. package/dist/npm-client/utils.d.ts.map +1 -1
  51. package/dist/npm-client/utils.js +44 -5
  52. package/dist/npm-client/utils.js.map +1 -1
  53. package/dist/repositories/core-memory-repository.d.ts +81 -0
  54. package/dist/repositories/core-memory-repository.d.ts.map +1 -0
  55. package/dist/repositories/core-memory-repository.js +263 -0
  56. package/dist/repositories/core-memory-repository.js.map +1 -0
  57. package/dist/repositories/knowledge-vault-repository.d.ts +102 -0
  58. package/dist/repositories/knowledge-vault-repository.d.ts.map +1 -0
  59. package/dist/repositories/knowledge-vault-repository.js +395 -0
  60. package/dist/repositories/knowledge-vault-repository.js.map +1 -0
  61. package/dist/server/http-server.d.ts.map +1 -1
  62. package/dist/server/http-server.js +66 -1
  63. package/dist/server/http-server.js.map +1 -1
  64. package/dist/server/index.d.ts.map +1 -1
  65. package/dist/server/index.js +86 -1
  66. package/dist/server/index.js.map +1 -1
  67. package/dist/services/cache-service.d.ts.map +1 -1
  68. package/dist/services/cache-service.js +5 -2
  69. package/dist/services/cache-service.js.map +1 -1
  70. package/dist/services/core-memory-cache-service.d.ts +80 -0
  71. package/dist/services/core-memory-cache-service.d.ts.map +1 -0
  72. package/dist/services/core-memory-cache-service.js +122 -0
  73. package/dist/services/core-memory-cache-service.js.map +1 -0
  74. package/dist/services/core-memory-service.d.ts +117 -0
  75. package/dist/services/core-memory-service.d.ts.map +1 -0
  76. package/dist/services/core-memory-service.js +247 -0
  77. package/dist/services/core-memory-service.js.map +1 -0
  78. package/dist/services/knowledge-vault-service.d.ts +114 -0
  79. package/dist/services/knowledge-vault-service.d.ts.map +1 -0
  80. package/dist/services/knowledge-vault-service.js +233 -0
  81. package/dist/services/knowledge-vault-service.js.map +1 -0
  82. package/dist/services/memory-neighbor-service.d.ts +81 -0
  83. package/dist/services/memory-neighbor-service.d.ts.map +1 -0
  84. package/dist/services/memory-neighbor-service.js +295 -0
  85. package/dist/services/memory-neighbor-service.js.map +1 -0
  86. package/dist/tools/get-memory-neighbors-tool.d.ts +26 -0
  87. package/dist/tools/get-memory-neighbors-tool.d.ts.map +1 -0
  88. package/dist/tools/get-memory-neighbors-tool.js +125 -0
  89. package/dist/tools/get-memory-neighbors-tool.js.map +1 -0
  90. package/dist/tools/index.d.ts +2 -1
  91. package/dist/tools/index.d.ts.map +1 -1
  92. package/dist/tools/index.js +4 -2
  93. package/dist/tools/index.js.map +1 -1
  94. package/dist/tools/memory-injection-prompt.d.ts.map +1 -1
  95. package/dist/tools/memory-injection-prompt.js +28 -4
  96. package/dist/tools/memory-injection-prompt.js.map +1 -1
  97. package/dist/tools/recall-tool.d.ts.map +1 -1
  98. package/dist/tools/recall-tool.js +292 -82
  99. package/dist/tools/recall-tool.js.map +1 -1
  100. package/dist/tools/remember-tool.d.ts.map +1 -1
  101. package/dist/tools/remember-tool.js +293 -40
  102. package/dist/tools/remember-tool.js.map +1 -1
  103. package/dist/tools/types.d.ts +9 -2
  104. package/dist/tools/types.d.ts.map +1 -1
  105. package/dist/tools/types.js +11 -2
  106. package/dist/tools/types.js.map +1 -1
  107. package/dist/types/index.d.ts +20 -3
  108. package/dist/types/index.d.ts.map +1 -1
  109. package/dist/types/index.js +7 -1
  110. package/dist/types/index.js.map +1 -1
  111. package/dist/utils/type-param-validator.d.ts +31 -0
  112. package/dist/utils/type-param-validator.d.ts.map +1 -0
  113. package/dist/utils/type-param-validator.js +76 -0
  114. package/dist/utils/type-param-validator.js.map +1 -0
  115. package/package.json +1 -1
  116. package/src/database/schema.sql +69 -1
@@ -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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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Knowledge Vault Service
3
+ * Knowledge Vault에 대한 비즈니스 로직 처리
4
+ *
5
+ * 클린코드 원칙:
6
+ * - 단일 책임 원칙: Knowledge Vault 비즈니스 로직만 담당
7
+ * - 의존성 역전: Repository에 의존
8
+ * - Immutable 검증: immutable=true인 경우 업데이트/삭제 제한
9
+ * - 버전 관리: 기존 버전을 삭제하지 않고 새 버전 생성
10
+ */
11
+ import { KnowledgeVaultRepository, type KnowledgeVaultRecord } from '../repositories/knowledge-vault-repository.js';
12
+ export interface CreateKnowledgeVaultServiceInput {
13
+ agent_id?: string;
14
+ key: string;
15
+ value: string;
16
+ immutable?: boolean;
17
+ admin_override?: boolean;
18
+ origin_source?: string | null;
19
+ }
20
+ export interface UpdateKnowledgeVaultServiceInput {
21
+ value?: string;
22
+ immutable?: boolean;
23
+ admin_override?: boolean;
24
+ origin_source?: string | null;
25
+ }
26
+ /**
27
+ * Immutable 데이터 수정 시도 에러
28
+ */
29
+ export declare class ImmutableDataError extends Error {
30
+ constructor(message: string);
31
+ }
32
+ /**
33
+ * Knowledge Vault Service
34
+ */
35
+ export declare class KnowledgeVaultService {
36
+ private repository;
37
+ constructor(repository: KnowledgeVaultRepository);
38
+ /**
39
+ * Knowledge Vault 생성
40
+ * 기존 활성 버전이 있으면 새 버전으로 생성 (기존 버전은 유지)
41
+ */
42
+ create(input: CreateKnowledgeVaultServiceInput): Promise<KnowledgeVaultRecord>;
43
+ /**
44
+ * ID로 Knowledge Vault 조회
45
+ */
46
+ findById(vault_id: string): Promise<KnowledgeVaultRecord | null>;
47
+ /**
48
+ * agent_id와 key로 활성 버전 조회
49
+ */
50
+ findActiveByKey(agent_id: string, key: string): Promise<KnowledgeVaultRecord | null>;
51
+ /**
52
+ * agent_id와 key로 특정 버전 조회
53
+ */
54
+ findByKeyAndVersion(agent_id: string, key: string, version: number): Promise<KnowledgeVaultRecord | null>;
55
+ /**
56
+ * agent_id와 key로 모든 버전 조회
57
+ */
58
+ findAllVersionsByKey(agent_id: string, key: string): Promise<KnowledgeVaultRecord[]>;
59
+ /**
60
+ * agent_id로 모든 활성 Knowledge Vault 조회
61
+ */
62
+ findActiveByAgentId(agent_id: string): Promise<KnowledgeVaultRecord[]>;
63
+ /**
64
+ * agent_id로 모든 Knowledge Vault 조회 (삭제된 것 포함)
65
+ */
66
+ findByAgentId(agent_id: string): Promise<KnowledgeVaultRecord[]>;
67
+ /**
68
+ * Knowledge Vault 업데이트
69
+ * immutable=true인 경우 새 버전으로 생성 (기존 버전은 유지)
70
+ */
71
+ update(vault_id: string, input: UpdateKnowledgeVaultServiceInput): Promise<KnowledgeVaultRecord>;
72
+ /**
73
+ * agent_id와 key로 활성 버전 업데이트
74
+ * immutable=true인 경우 새 버전으로 생성
75
+ */
76
+ updateActiveByKey(agent_id: string, key: string, input: UpdateKnowledgeVaultServiceInput): Promise<KnowledgeVaultRecord>;
77
+ /**
78
+ * Knowledge Vault 삭제 (soft delete)
79
+ * immutable=true인 경우 삭제 불가
80
+ */
81
+ delete(vault_id: string): Promise<boolean>;
82
+ /**
83
+ * agent_id와 key로 활성 버전 삭제 (soft delete)
84
+ */
85
+ deleteActiveByKey(agent_id: string, key: string): Promise<boolean>;
86
+ /**
87
+ * 하드 삭제 (물리적 삭제, 주의 필요)
88
+ * immutable=true인 경우에도 강제 삭제 가능 (admin 권한 필요)
89
+ */
90
+ hardDelete(vault_id: string, force?: boolean): Promise<boolean>;
91
+ /**
92
+ * 모든 활성 Knowledge Vault 조회
93
+ */
94
+ findAllActive(): Promise<KnowledgeVaultRecord[]>;
95
+ /**
96
+ * 모든 Knowledge Vault 조회 (삭제된 것 포함)
97
+ */
98
+ findAll(): Promise<KnowledgeVaultRecord[]>;
99
+ /**
100
+ * Knowledge Vault 개수 조회
101
+ */
102
+ count(agent_id?: string, activeOnly?: boolean): Promise<number>;
103
+ /**
104
+ * Immutable 검증
105
+ * immutable=true인 경우 업데이트/삭제 가능 여부 확인
106
+ */
107
+ canUpdate(record: KnowledgeVaultRecord, admin_override?: boolean): boolean;
108
+ /**
109
+ * Immutable 검증
110
+ * immutable=true인 경우 삭제 가능 여부 확인
111
+ */
112
+ canDelete(record: KnowledgeVaultRecord, admin_override?: boolean): boolean;
113
+ }
114
+ //# sourceMappingURL=knowledge-vault-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-vault-service.d.ts","sourceRoot":"","sources":["../../src/services/knowledge-vault-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Knowledge Vault Service
3
+ * Knowledge Vault에 대한 비즈니스 로직 처리
4
+ *
5
+ * 클린코드 원칙:
6
+ * - 단일 책임 원칙: Knowledge Vault 비즈니스 로직만 담당
7
+ * - 의존성 역전: Repository에 의존
8
+ * - Immutable 검증: immutable=true인 경우 업데이트/삭제 제한
9
+ * - 버전 관리: 기존 버전을 삭제하지 않고 새 버전 생성
10
+ */
11
+ import { KnowledgeVaultRepository } from '../repositories/knowledge-vault-repository.js';
12
+ /**
13
+ * Knowledge Vault ID 생성 유틸리티
14
+ */
15
+ function generateVaultId() {
16
+ const timestamp = Date.now();
17
+ const random = Math.random().toString(36).substring(2, 11);
18
+ return `vault_${timestamp}_${random}`;
19
+ }
20
+ /**
21
+ * Immutable 데이터 수정 시도 에러
22
+ */
23
+ export class ImmutableDataError extends Error {
24
+ constructor(message) {
25
+ super(message);
26
+ this.name = 'ImmutableDataError';
27
+ }
28
+ }
29
+ /**
30
+ * Knowledge Vault Service
31
+ */
32
+ export class KnowledgeVaultService {
33
+ repository;
34
+ constructor(repository) {
35
+ this.repository = repository;
36
+ }
37
+ /**
38
+ * Knowledge Vault 생성
39
+ * 기존 활성 버전이 있으면 새 버전으로 생성 (기존 버전은 유지)
40
+ */
41
+ async create(input) {
42
+ const { agent_id = 'default', key, value, immutable = true, admin_override = false, origin_source = null } = input;
43
+ // 기존 활성 버전 확인
44
+ const existing = await this.repository.findActiveByKey(agent_id, key);
45
+ let version = 1;
46
+ let previous_version_id = null;
47
+ if (existing) {
48
+ // 기존 버전이 있으면 다음 버전으로 생성
49
+ version = await this.repository.getNextVersion(agent_id, key);
50
+ previous_version_id = existing.vault_id;
51
+ }
52
+ const vault_id = generateVaultId();
53
+ const record = await this.repository.create({
54
+ vault_id,
55
+ agent_id,
56
+ key,
57
+ value,
58
+ immutable,
59
+ version,
60
+ previous_version_id,
61
+ admin_override,
62
+ deleted_at: null,
63
+ origin_source
64
+ });
65
+ return record;
66
+ }
67
+ /**
68
+ * ID로 Knowledge Vault 조회
69
+ */
70
+ async findById(vault_id) {
71
+ return this.repository.findById(vault_id);
72
+ }
73
+ /**
74
+ * agent_id와 key로 활성 버전 조회
75
+ */
76
+ async findActiveByKey(agent_id, key) {
77
+ return this.repository.findActiveByKey(agent_id, key);
78
+ }
79
+ /**
80
+ * agent_id와 key로 특정 버전 조회
81
+ */
82
+ async findByKeyAndVersion(agent_id, key, version) {
83
+ return this.repository.findByKeyAndVersion(agent_id, key, version);
84
+ }
85
+ /**
86
+ * agent_id와 key로 모든 버전 조회
87
+ */
88
+ async findAllVersionsByKey(agent_id, key) {
89
+ return this.repository.findAllVersionsByKey(agent_id, key);
90
+ }
91
+ /**
92
+ * agent_id로 모든 활성 Knowledge Vault 조회
93
+ */
94
+ async findActiveByAgentId(agent_id) {
95
+ return this.repository.findActiveByAgentId(agent_id);
96
+ }
97
+ /**
98
+ * agent_id로 모든 Knowledge Vault 조회 (삭제된 것 포함)
99
+ */
100
+ async findByAgentId(agent_id) {
101
+ return this.repository.findByAgentId(agent_id);
102
+ }
103
+ /**
104
+ * Knowledge Vault 업데이트
105
+ * immutable=true인 경우 새 버전으로 생성 (기존 버전은 유지)
106
+ */
107
+ async update(vault_id, input) {
108
+ const existing = await this.repository.findById(vault_id);
109
+ if (!existing) {
110
+ throw new Error(`Knowledge vault with id '${vault_id}' not found`);
111
+ }
112
+ // immutable=true이고 admin_override=false인 경우 새 버전으로 생성
113
+ if (existing.immutable && !existing.admin_override && !input.admin_override) {
114
+ // 새 버전 생성
115
+ const nextVersion = await this.repository.getNextVersion(existing.agent_id, existing.key);
116
+ const newVaultId = generateVaultId();
117
+ // 새 버전 생성 (기존 value를 input.value로 업데이트)
118
+ const newRecord = await this.repository.create({
119
+ vault_id: newVaultId,
120
+ agent_id: existing.agent_id,
121
+ key: existing.key,
122
+ value: input.value ?? existing.value,
123
+ immutable: input.immutable ?? existing.immutable,
124
+ version: nextVersion,
125
+ previous_version_id: existing.vault_id,
126
+ admin_override: input.admin_override ?? existing.admin_override,
127
+ deleted_at: null,
128
+ origin_source: input.origin_source ?? existing.origin_source
129
+ });
130
+ return newRecord;
131
+ }
132
+ // 일반 업데이트 (immutable=false이거나 admin_override=true인 경우)
133
+ const updated = await this.repository.update(vault_id, input);
134
+ if (!updated) {
135
+ throw new Error(`Failed to update knowledge vault with id: ${vault_id}`);
136
+ }
137
+ return updated;
138
+ }
139
+ /**
140
+ * agent_id와 key로 활성 버전 업데이트
141
+ * immutable=true인 경우 새 버전으로 생성
142
+ */
143
+ async updateActiveByKey(agent_id, key, input) {
144
+ const existing = await this.repository.findActiveByKey(agent_id, key);
145
+ if (!existing) {
146
+ throw new Error(`Active knowledge vault with key '${key}' not found for agent '${agent_id}'`);
147
+ }
148
+ return this.update(existing.vault_id, input);
149
+ }
150
+ /**
151
+ * Knowledge Vault 삭제 (soft delete)
152
+ * immutable=true인 경우 삭제 불가
153
+ */
154
+ async delete(vault_id) {
155
+ const existing = await this.repository.findById(vault_id);
156
+ if (!existing) {
157
+ return false;
158
+ }
159
+ // immutable=true이고 admin_override=false인 경우 삭제 불가
160
+ if (existing.immutable && !existing.admin_override) {
161
+ throw new ImmutableDataError(`Cannot delete immutable knowledge vault: ${vault_id}. Use admin_override=true to delete.`);
162
+ }
163
+ return this.repository.delete(vault_id);
164
+ }
165
+ /**
166
+ * agent_id와 key로 활성 버전 삭제 (soft delete)
167
+ */
168
+ async deleteActiveByKey(agent_id, key) {
169
+ const existing = await this.repository.findActiveByKey(agent_id, key);
170
+ if (!existing) {
171
+ return false;
172
+ }
173
+ // immutable=true이고 admin_override=false인 경우 삭제 불가
174
+ if (existing.immutable && !existing.admin_override) {
175
+ throw new ImmutableDataError(`Cannot delete immutable knowledge vault: agent_id=${agent_id}, key=${key}. Use admin_override=true to delete.`);
176
+ }
177
+ return this.repository.deleteActiveByKey(agent_id, key);
178
+ }
179
+ /**
180
+ * 하드 삭제 (물리적 삭제, 주의 필요)
181
+ * immutable=true인 경우에도 강제 삭제 가능 (admin 권한 필요)
182
+ */
183
+ async hardDelete(vault_id, force = false) {
184
+ const existing = await this.repository.findById(vault_id);
185
+ if (!existing) {
186
+ return false;
187
+ }
188
+ // immutable=true이고 force=false인 경우 삭제 불가
189
+ if (existing.immutable && !force) {
190
+ throw new ImmutableDataError(`Cannot hard delete immutable knowledge vault: ${vault_id}. Use force=true to delete.`);
191
+ }
192
+ return this.repository.hardDelete(vault_id);
193
+ }
194
+ /**
195
+ * 모든 활성 Knowledge Vault 조회
196
+ */
197
+ async findAllActive() {
198
+ return this.repository.findAllActive();
199
+ }
200
+ /**
201
+ * 모든 Knowledge Vault 조회 (삭제된 것 포함)
202
+ */
203
+ async findAll() {
204
+ return this.repository.findAll();
205
+ }
206
+ /**
207
+ * Knowledge Vault 개수 조회
208
+ */
209
+ async count(agent_id, activeOnly = true) {
210
+ return this.repository.count(agent_id, activeOnly);
211
+ }
212
+ /**
213
+ * Immutable 검증
214
+ * immutable=true인 경우 업데이트/삭제 가능 여부 확인
215
+ */
216
+ canUpdate(record, admin_override = false) {
217
+ if (!record.immutable) {
218
+ return true;
219
+ }
220
+ return record.admin_override || admin_override;
221
+ }
222
+ /**
223
+ * Immutable 검증
224
+ * immutable=true인 경우 삭제 가능 여부 확인
225
+ */
226
+ canDelete(record, admin_override = false) {
227
+ if (!record.immutable) {
228
+ return true;
229
+ }
230
+ return record.admin_override || admin_override;
231
+ }
232
+ }
233
+ //# sourceMappingURL=knowledge-vault-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-vault-service.js","sourceRoot":"","sources":["../../src/services/knowledge-vault-service.ts"],"names":[],"mappings":"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"}