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.
- package/README.md +1 -0
- 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 +66 -1
- package/dist/server/http-server.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +86 -1
- package/dist/server/index.js.map +1 -1
- package/dist/services/cache-service.d.ts.map +1 -1
- package/dist/services/cache-service.js +5 -2
- package/dist/services/cache-service.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/services/memory-neighbor-service.d.ts +81 -0
- package/dist/services/memory-neighbor-service.d.ts.map +1 -0
- package/dist/services/memory-neighbor-service.js +295 -0
- package/dist/services/memory-neighbor-service.js.map +1 -0
- package/dist/tools/get-memory-neighbors-tool.d.ts +26 -0
- package/dist/tools/get-memory-neighbors-tool.d.ts.map +1 -0
- package/dist/tools/get-memory-neighbors-tool.js +125 -0
- package/dist/tools/get-memory-neighbors-tool.js.map +1 -0
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -2
- package/dist/tools/index.js.map +1 -1
- 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 +293 -40
- 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,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":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,wBAAwB,EAIzB,MAAM,+CAA+C,CAAC;AAkBvD;;GAEG;AACH,SAAS,eAAe;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,OAAO,SAAS,SAAS,IAAI,MAAM,EAAE,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,qBAAqB;IACZ;IAApB,YAAoB,UAAoC;QAApC,eAAU,GAAV,UAAU,CAA0B;IAAG,CAAC;IAE5D;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,KAAuC;QAClD,MAAM,EACJ,QAAQ,GAAG,SAAS,EACpB,GAAG,EACH,KAAK,EACL,SAAS,GAAG,IAAI,EAChB,cAAc,GAAG,KAAK,EACtB,aAAa,GAAG,IAAI,EACrB,GAAG,KAAK,CAAC;QAEV,cAAc;QACd,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAEtE,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,mBAAmB,GAAkB,IAAI,CAAC;QAE9C,IAAI,QAAQ,EAAE,CAAC;YACb,wBAAwB;YACxB,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC9D,mBAAmB,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC1C,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;QAEnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAC1C,QAAQ;YACR,QAAQ;YACR,GAAG;YACH,KAAK;YACL,SAAS;YACT,OAAO;YACP,mBAAmB;YACnB,cAAc;YACd,UAAU,EAAE,IAAI;YAChB,aAAa;SACd,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,GAAW;QACjD,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CACvB,QAAgB,EAChB,GAAW,EACX,OAAe;QAEf,OAAO,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,oBAAoB,CACxB,QAAgB,EAChB,GAAW;QAEX,OAAO,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QACxC,OAAO,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CACV,QAAgB,EAChB,KAAuC;QAEvC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,aAAa,CAAC,CAAC;QACrE,CAAC;QAED,sDAAsD;QACtD,IAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;YAC5E,UAAU;YACV,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC1F,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC;YAErC,wCAAwC;YACxC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC7C,QAAQ,EAAE,UAAU;gBACpB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,GAAG,EAAE,QAAQ,CAAC,GAAG;gBACjB,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK;gBACpC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS;gBAChD,OAAO,EAAE,WAAW;gBACpB,mBAAmB,EAAE,QAAQ,CAAC,QAAQ;gBACtC,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,QAAQ,CAAC,cAAc;gBAC/D,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,QAAQ,CAAC,aAAa;aAC7D,CAAC,CAAC;YAEH,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,uDAAuD;QACvD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,6CAA6C,QAAQ,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CACrB,QAAgB,EAChB,GAAW,EACX,KAAuC;QAEvC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,0BAA0B,QAAQ,GAAG,CAAC,CAAC;QAChG,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;QAED,kDAAkD;QAClD,IAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;YACnD,MAAM,IAAI,kBAAkB,CAC1B,4CAA4C,QAAQ,sCAAsC,CAC3F,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,GAAW;QACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACtE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;QAED,kDAAkD;QAClD,IAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;YACnD,MAAM,IAAI,kBAAkB,CAC1B,qDAAqD,QAAQ,SAAS,GAAG,sCAAsC,CAChH,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,QAAiB,KAAK;QACvD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;QAED,yCAAyC;QACzC,IAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,IAAI,kBAAkB,CAC1B,iDAAiD,QAAQ,6BAA6B,CACvF,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,QAAiB,EAAE,aAAsB,IAAI;QACvD,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,MAA4B,EAAE,iBAA0B,KAAK;QACrE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAM,CAAC,cAAc,IAAI,cAAc,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,MAA4B,EAAE,iBAA0B,KAAK;QACrE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAM,CAAC,cAAc,IAAI,cAAc,CAAC;IACjD,CAAC;CACF"}
|