a2a-memory 0.5.0 → 0.6.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 +262 -45
- package/dist/adapters/anthropic.d.ts +69 -0
- package/dist/adapters/anthropic.d.ts.map +1 -0
- package/dist/adapters/anthropic.js +116 -0
- package/dist/adapters/anthropic.js.map +1 -0
- package/dist/claude/sync.d.ts +57 -0
- package/dist/claude/sync.d.ts.map +1 -0
- package/dist/claude/sync.js +201 -0
- package/dist/claude/sync.js.map +1 -0
- package/dist/cli/commands/claude-sync.d.ts +11 -0
- package/dist/cli/commands/claude-sync.d.ts.map +1 -0
- package/dist/cli/commands/claude-sync.js +69 -0
- package/dist/cli/commands/claude-sync.js.map +1 -0
- package/dist/cli/commands/health.d.ts +8 -0
- package/dist/cli/commands/health.d.ts.map +1 -0
- package/dist/cli/commands/health.js +108 -0
- package/dist/cli/commands/health.js.map +1 -0
- package/dist/cli/commands/sync.d.ts.map +1 -1
- package/dist/cli/commands/sync.js +52 -0
- package/dist/cli/commands/sync.js.map +1 -1
- package/dist/cli/index.js +27 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/config/manager.d.ts +9 -0
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +74 -0
- package/dist/config/manager.js.map +1 -1
- package/dist/db/database.d.ts +4 -2
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/database.js +116 -17
- package/dist/db/database.js.map +1 -1
- package/dist/embedding/index.d.ts +1 -0
- package/dist/embedding/index.d.ts.map +1 -1
- package/dist/embedding/index.js +1 -0
- package/dist/embedding/index.js.map +1 -1
- package/dist/embedding/quantization.d.ts +34 -0
- package/dist/embedding/quantization.d.ts.map +1 -0
- package/dist/embedding/quantization.js +89 -0
- package/dist/embedding/quantization.js.map +1 -0
- package/dist/extraction/filter.d.ts.map +1 -1
- package/dist/extraction/filter.js +25 -3
- package/dist/extraction/filter.js.map +1 -1
- package/dist/hooks/post-tool-use.d.ts.map +1 -1
- package/dist/hooks/post-tool-use.js +64 -49
- package/dist/hooks/post-tool-use.js.map +1 -1
- package/dist/hooks/session-end.d.ts.map +1 -1
- package/dist/hooks/session-end.js +45 -28
- package/dist/hooks/session-end.js.map +1 -1
- package/dist/hooks/session-start.d.ts.map +1 -1
- package/dist/hooks/session-start.js +21 -3
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/i18n/index.d.ts +3 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +2 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/messages.d.ts +82 -0
- package/dist/i18n/messages.d.ts.map +1 -0
- package/dist/i18n/messages.js +150 -0
- package/dist/i18n/messages.js.map +1 -0
- package/dist/index.d.ts +18 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -3
- package/dist/index.js.map +1 -1
- package/dist/lifecycle/index.d.ts +3 -0
- package/dist/lifecycle/index.d.ts.map +1 -1
- package/dist/lifecycle/index.js +2 -0
- package/dist/lifecycle/index.js.map +1 -1
- package/dist/lifecycle/tiering.d.ts +50 -0
- package/dist/lifecycle/tiering.d.ts.map +1 -0
- package/dist/lifecycle/tiering.js +235 -0
- package/dist/lifecycle/tiering.js.map +1 -0
- package/dist/sync/client.d.ts +20 -2
- package/dist/sync/client.d.ts.map +1 -1
- package/dist/sync/client.js +82 -10
- package/dist/sync/client.js.map +1 -1
- package/dist/sync/encryption.d.ts +72 -0
- package/dist/sync/encryption.d.ts.map +1 -0
- package/dist/sync/encryption.js +203 -0
- package/dist/sync/encryption.js.map +1 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +3 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/scheduler.d.ts +69 -0
- package/dist/sync/scheduler.d.ts.map +1 -0
- package/dist/sync/scheduler.js +140 -0
- package/dist/sync/scheduler.js.map +1 -0
- package/dist/types/index.d.ts +32 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +34 -4
- package/dist/types/index.js.map +1 -1
- package/dist/utils/keychain.d.ts +50 -0
- package/dist/utils/keychain.d.ts.map +1 -0
- package/dist/utils/keychain.js +166 -0
- package/dist/utils/keychain.js.map +1 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +118 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/sync/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/sync/client.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/client.js
CHANGED
|
@@ -2,24 +2,61 @@
|
|
|
2
2
|
* A2A API Client
|
|
3
3
|
* Node.js 내장 fetch 사용 (외부 의존성 없음)
|
|
4
4
|
*/
|
|
5
|
+
import { encryptContent, decryptContent, wrapEncryptedContent, unwrapEncryptedContent, } from './encryption.js';
|
|
5
6
|
export class A2AClient {
|
|
6
7
|
config;
|
|
7
8
|
timeout;
|
|
9
|
+
encryptionKey = null;
|
|
8
10
|
constructor(config) {
|
|
9
11
|
this.config = config;
|
|
10
12
|
this.timeout = config.timeout ?? 10000;
|
|
11
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* 암호화 키 설정
|
|
16
|
+
*/
|
|
17
|
+
setEncryptionKey(key) {
|
|
18
|
+
if (key.length !== 32) {
|
|
19
|
+
throw new Error('암호화 키는 32 bytes여야 합니다');
|
|
20
|
+
}
|
|
21
|
+
this.encryptionKey = key;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 암호화 키 해제
|
|
25
|
+
*/
|
|
26
|
+
clearEncryptionKey() {
|
|
27
|
+
this.encryptionKey = null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 암호화 활성화 여부
|
|
31
|
+
*/
|
|
32
|
+
isEncryptionEnabled() {
|
|
33
|
+
return this.encryptionKey !== null;
|
|
34
|
+
}
|
|
12
35
|
/**
|
|
13
36
|
* 메모리 생성
|
|
14
37
|
*/
|
|
15
38
|
async createMemory(input) {
|
|
39
|
+
let contentToSend = input.content;
|
|
40
|
+
// 암호화가 활성화된 경우
|
|
41
|
+
if (this.encryptionKey) {
|
|
42
|
+
const encrypted = encryptContent(input.content, this.encryptionKey);
|
|
43
|
+
contentToSend = wrapEncryptedContent(encrypted);
|
|
44
|
+
}
|
|
16
45
|
const response = await this.request('POST', '/api/v1/memories', {
|
|
17
|
-
content:
|
|
46
|
+
content: contentToSend,
|
|
18
47
|
category: input.category,
|
|
19
48
|
tier: input.tier,
|
|
20
49
|
tags: input.tags ?? [],
|
|
21
50
|
});
|
|
22
|
-
|
|
51
|
+
const memory = response;
|
|
52
|
+
// 응답 복호화
|
|
53
|
+
if (this.encryptionKey && memory.content) {
|
|
54
|
+
const unwrapped = unwrapEncryptedContent(memory.content);
|
|
55
|
+
if (unwrapped) {
|
|
56
|
+
memory.content = decryptContent(unwrapped, this.encryptionKey);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return memory;
|
|
23
60
|
}
|
|
24
61
|
/**
|
|
25
62
|
* 메모리 검색
|
|
@@ -45,7 +82,33 @@ export class A2AClient {
|
|
|
45
82
|
params.set('include_embedding', 'true');
|
|
46
83
|
const path = `/api/v1/memories${params.toString() ? `?${params.toString()}` : ''}`;
|
|
47
84
|
const response = await this.request('GET', path);
|
|
48
|
-
|
|
85
|
+
const memories = response.items ?? [];
|
|
86
|
+
// 복호화
|
|
87
|
+
if (this.encryptionKey) {
|
|
88
|
+
return memories.map(memory => this.decryptMemory(memory));
|
|
89
|
+
}
|
|
90
|
+
return memories;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 메모리 복호화 헬퍼
|
|
94
|
+
*/
|
|
95
|
+
decryptMemory(memory) {
|
|
96
|
+
if (!this.encryptionKey)
|
|
97
|
+
return memory;
|
|
98
|
+
const decrypted = { ...memory };
|
|
99
|
+
// content 복호화
|
|
100
|
+
if (decrypted.content) {
|
|
101
|
+
const unwrapped = unwrapEncryptedContent(decrypted.content);
|
|
102
|
+
if (unwrapped) {
|
|
103
|
+
try {
|
|
104
|
+
decrypted.content = decryptContent(unwrapped, this.encryptionKey);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// 복호화 실패 시 원본 유지 (암호화되지 않은 데이터일 수 있음)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return decrypted;
|
|
49
112
|
}
|
|
50
113
|
/**
|
|
51
114
|
* 메모리 업데이트
|
|
@@ -68,6 +131,9 @@ export class A2AClient {
|
|
|
68
131
|
*/
|
|
69
132
|
async listTeams() {
|
|
70
133
|
const response = await this.request('GET', '/api/v1/teams');
|
|
134
|
+
// 서버는 직접 배열 반환 (items 래퍼 없음)
|
|
135
|
+
if (Array.isArray(response))
|
|
136
|
+
return response;
|
|
71
137
|
return response.items ?? [];
|
|
72
138
|
}
|
|
73
139
|
/**
|
|
@@ -146,12 +212,11 @@ export class A2AClient {
|
|
|
146
212
|
return response;
|
|
147
213
|
}
|
|
148
214
|
/**
|
|
149
|
-
* 메모리 승격 (
|
|
215
|
+
* 메모리 승격 (semantic tier로 고정)
|
|
216
|
+
* NOTE: 서버는 target_tier 파라미터를 무시하고 항상 semantic으로 승격합니다.
|
|
150
217
|
*/
|
|
151
|
-
async promoteMemory(id,
|
|
152
|
-
const response = await this.request('POST', `/api/v1/memories/${id}/promote
|
|
153
|
-
target_tier: targetTier,
|
|
154
|
-
});
|
|
218
|
+
async promoteMemory(id, _targetTier) {
|
|
219
|
+
const response = await this.request('POST', `/api/v1/memories/${id}/promote`);
|
|
155
220
|
return response;
|
|
156
221
|
}
|
|
157
222
|
/**
|
|
@@ -175,8 +240,15 @@ export class A2AClient {
|
|
|
175
240
|
* 팀 통계 조회
|
|
176
241
|
*/
|
|
177
242
|
async getTeamStats(teamPath) {
|
|
178
|
-
|
|
179
|
-
|
|
243
|
+
// team.py: GET /teams/{team_path}/memories/stats
|
|
244
|
+
const response = await this.request('GET', `/teams/${encodeURIComponent(teamPath)}/memories/stats`);
|
|
245
|
+
const data = response;
|
|
246
|
+
const stats = data.stats ?? data;
|
|
247
|
+
return {
|
|
248
|
+
totalMemories: stats.total_memories ?? 0,
|
|
249
|
+
totalNodes: stats.total_nodes ?? 0,
|
|
250
|
+
lastSyncedAt: stats.last_synced_at ?? null,
|
|
251
|
+
};
|
|
180
252
|
}
|
|
181
253
|
/**
|
|
182
254
|
* HTTP 요청 실행
|
package/dist/sync/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/sync/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/sync/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E Encryption Module
|
|
3
|
+
*
|
|
4
|
+
* AES-256-GCM 대칭 암호화를 사용하여 메모리 content/embedding 보호
|
|
5
|
+
* Node.js 내장 crypto 모듈만 사용 (외부 의존성 없음)
|
|
6
|
+
*/
|
|
7
|
+
export interface EncryptedPayload {
|
|
8
|
+
ciphertext: string;
|
|
9
|
+
iv: string;
|
|
10
|
+
tag: string;
|
|
11
|
+
}
|
|
12
|
+
export interface EncryptionConfig {
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
algorithm: 'aes-256-gcm';
|
|
15
|
+
}
|
|
16
|
+
export interface KeyDerivationResult {
|
|
17
|
+
key: Buffer;
|
|
18
|
+
salt: Buffer;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 랜덤 암호화 키 생성 (32 bytes)
|
|
22
|
+
*/
|
|
23
|
+
export declare function generateEncryptionKey(): Buffer;
|
|
24
|
+
/**
|
|
25
|
+
* PBKDF2로 사용자 비밀번호에서 키 유도
|
|
26
|
+
* @param password - 사용자 입력 비밀번호
|
|
27
|
+
* @param salt - 선택적 salt (재현성 필요 시 제공)
|
|
28
|
+
* @returns 키와 salt
|
|
29
|
+
*/
|
|
30
|
+
export declare function deriveKey(password: string, salt?: Buffer): KeyDerivationResult;
|
|
31
|
+
/**
|
|
32
|
+
* 텍스트 암호화 (AES-256-GCM)
|
|
33
|
+
* @param plaintext - 원본 텍스트
|
|
34
|
+
* @param key - 32 bytes 암호화 키
|
|
35
|
+
* @returns 암호화된 페이로드
|
|
36
|
+
*/
|
|
37
|
+
export declare function encryptContent(plaintext: string, key: Buffer): EncryptedPayload;
|
|
38
|
+
/**
|
|
39
|
+
* 텍스트 복호화 (AES-256-GCM)
|
|
40
|
+
* @param encrypted - 암호화된 페이로드
|
|
41
|
+
* @param key - 32 bytes 암호화 키
|
|
42
|
+
* @returns 원본 텍스트
|
|
43
|
+
* @throws 키가 잘못되었거나 데이터가 변조된 경우
|
|
44
|
+
*/
|
|
45
|
+
export declare function decryptContent(encrypted: EncryptedPayload, key: Buffer): string;
|
|
46
|
+
/**
|
|
47
|
+
* 임베딩 벡터 암호화
|
|
48
|
+
* @param embedding - number[] 벡터
|
|
49
|
+
* @param key - 32 bytes 암호화 키
|
|
50
|
+
* @returns base64 암호화된 문자열
|
|
51
|
+
*/
|
|
52
|
+
export declare function encryptEmbedding(embedding: number[], key: Buffer): string;
|
|
53
|
+
/**
|
|
54
|
+
* 임베딩 벡터 복호화
|
|
55
|
+
* @param encrypted - base64 암호화된 문자열
|
|
56
|
+
* @param key - 32 bytes 암호화 키
|
|
57
|
+
* @returns number[] 벡터
|
|
58
|
+
*/
|
|
59
|
+
export declare function decryptEmbedding(encrypted: string, key: Buffer): number[];
|
|
60
|
+
/**
|
|
61
|
+
* EncryptedPayload 검증
|
|
62
|
+
*/
|
|
63
|
+
export declare function isValidEncryptedPayload(obj: unknown): obj is EncryptedPayload;
|
|
64
|
+
/**
|
|
65
|
+
* 암호화된 컨텐츠를 JSON으로 래핑
|
|
66
|
+
*/
|
|
67
|
+
export declare function wrapEncryptedContent(encrypted: EncryptedPayload): string;
|
|
68
|
+
/**
|
|
69
|
+
* JSON에서 암호화된 컨텐츠 추출
|
|
70
|
+
*/
|
|
71
|
+
export declare function unwrapEncryptedContent(wrapped: string): EncryptedPayload | null;
|
|
72
|
+
//# sourceMappingURL=encryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../src/sync/encryption.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAkBD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAe9E;AAMD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAqB/E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAyB/E;AAMD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAkBzE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAmCzE;AAMD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,gBAAgB,CAS7E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAOxE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAqB/E"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2E Encryption Module
|
|
3
|
+
*
|
|
4
|
+
* AES-256-GCM 대칭 암호화를 사용하여 메모리 content/embedding 보호
|
|
5
|
+
* Node.js 내장 crypto 모듈만 사용 (외부 의존성 없음)
|
|
6
|
+
*/
|
|
7
|
+
import { randomBytes, createCipheriv, createDecipheriv, pbkdf2Sync } from 'node:crypto';
|
|
8
|
+
// ============================================================
|
|
9
|
+
// Constants
|
|
10
|
+
// ============================================================
|
|
11
|
+
const ALGORITHM = 'aes-256-gcm';
|
|
12
|
+
const KEY_LENGTH = 32; // 256 bits
|
|
13
|
+
const IV_LENGTH = 12; // GCM recommended IV length
|
|
14
|
+
const TAG_LENGTH = 16; // GCM auth tag length
|
|
15
|
+
const SALT_LENGTH = 16;
|
|
16
|
+
const PBKDF2_ITERATIONS = 100000;
|
|
17
|
+
const PBKDF2_DIGEST = 'sha512';
|
|
18
|
+
// ============================================================
|
|
19
|
+
// Key Management
|
|
20
|
+
// ============================================================
|
|
21
|
+
/**
|
|
22
|
+
* 랜덤 암호화 키 생성 (32 bytes)
|
|
23
|
+
*/
|
|
24
|
+
export function generateEncryptionKey() {
|
|
25
|
+
return randomBytes(KEY_LENGTH);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* PBKDF2로 사용자 비밀번호에서 키 유도
|
|
29
|
+
* @param password - 사용자 입력 비밀번호
|
|
30
|
+
* @param salt - 선택적 salt (재현성 필요 시 제공)
|
|
31
|
+
* @returns 키와 salt
|
|
32
|
+
*/
|
|
33
|
+
export function deriveKey(password, salt) {
|
|
34
|
+
const actualSalt = salt ?? randomBytes(SALT_LENGTH);
|
|
35
|
+
const key = pbkdf2Sync(password, actualSalt, PBKDF2_ITERATIONS, KEY_LENGTH, PBKDF2_DIGEST);
|
|
36
|
+
return {
|
|
37
|
+
key,
|
|
38
|
+
salt: actualSalt,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// ============================================================
|
|
42
|
+
// Content Encryption
|
|
43
|
+
// ============================================================
|
|
44
|
+
/**
|
|
45
|
+
* 텍스트 암호화 (AES-256-GCM)
|
|
46
|
+
* @param plaintext - 원본 텍스트
|
|
47
|
+
* @param key - 32 bytes 암호화 키
|
|
48
|
+
* @returns 암호화된 페이로드
|
|
49
|
+
*/
|
|
50
|
+
export function encryptContent(plaintext, key) {
|
|
51
|
+
if (key.length !== KEY_LENGTH) {
|
|
52
|
+
throw new Error(`암호화 키는 ${KEY_LENGTH} bytes여야 합니다 (현재: ${key.length})`);
|
|
53
|
+
}
|
|
54
|
+
const iv = randomBytes(IV_LENGTH);
|
|
55
|
+
const cipher = createCipheriv(ALGORITHM, key, iv);
|
|
56
|
+
const plaintextBuffer = Buffer.from(plaintext, 'utf-8');
|
|
57
|
+
const encrypted = Buffer.concat([
|
|
58
|
+
cipher.update(plaintextBuffer),
|
|
59
|
+
cipher.final(),
|
|
60
|
+
]);
|
|
61
|
+
const tag = cipher.getAuthTag();
|
|
62
|
+
return {
|
|
63
|
+
ciphertext: encrypted.toString('base64'),
|
|
64
|
+
iv: iv.toString('base64'),
|
|
65
|
+
tag: tag.toString('base64'),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 텍스트 복호화 (AES-256-GCM)
|
|
70
|
+
* @param encrypted - 암호화된 페이로드
|
|
71
|
+
* @param key - 32 bytes 암호화 키
|
|
72
|
+
* @returns 원본 텍스트
|
|
73
|
+
* @throws 키가 잘못되었거나 데이터가 변조된 경우
|
|
74
|
+
*/
|
|
75
|
+
export function decryptContent(encrypted, key) {
|
|
76
|
+
if (key.length !== KEY_LENGTH) {
|
|
77
|
+
throw new Error(`암호화 키는 ${KEY_LENGTH} bytes여야 합니다 (현재: ${key.length})`);
|
|
78
|
+
}
|
|
79
|
+
const iv = Buffer.from(encrypted.iv, 'base64');
|
|
80
|
+
const ciphertext = Buffer.from(encrypted.ciphertext, 'base64');
|
|
81
|
+
const tag = Buffer.from(encrypted.tag, 'base64');
|
|
82
|
+
const decipher = createDecipheriv(ALGORITHM, key, iv);
|
|
83
|
+
decipher.setAuthTag(tag);
|
|
84
|
+
try {
|
|
85
|
+
const decrypted = Buffer.concat([
|
|
86
|
+
decipher.update(ciphertext),
|
|
87
|
+
decipher.final(),
|
|
88
|
+
]);
|
|
89
|
+
return decrypted.toString('utf-8');
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (error instanceof Error) {
|
|
93
|
+
throw new Error(`복호화 실패: ${error.message} (잘못된 키 또는 데이터 변조)`);
|
|
94
|
+
}
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// ============================================================
|
|
99
|
+
// Embedding Encryption
|
|
100
|
+
// ============================================================
|
|
101
|
+
/**
|
|
102
|
+
* 임베딩 벡터 암호화
|
|
103
|
+
* @param embedding - number[] 벡터
|
|
104
|
+
* @param key - 32 bytes 암호화 키
|
|
105
|
+
* @returns base64 암호화된 문자열
|
|
106
|
+
*/
|
|
107
|
+
export function encryptEmbedding(embedding, key) {
|
|
108
|
+
// Float64Array로 변환하여 바이너리 직렬화
|
|
109
|
+
const float64Array = new Float64Array(embedding);
|
|
110
|
+
const buffer = Buffer.from(float64Array.buffer);
|
|
111
|
+
const iv = randomBytes(IV_LENGTH);
|
|
112
|
+
const cipher = createCipheriv(ALGORITHM, key, iv);
|
|
113
|
+
const encrypted = Buffer.concat([
|
|
114
|
+
cipher.update(buffer),
|
|
115
|
+
cipher.final(),
|
|
116
|
+
]);
|
|
117
|
+
const tag = cipher.getAuthTag();
|
|
118
|
+
// iv + tag + ciphertext를 하나의 버퍼로 결합
|
|
119
|
+
const combined = Buffer.concat([iv, tag, encrypted]);
|
|
120
|
+
return combined.toString('base64');
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 임베딩 벡터 복호화
|
|
124
|
+
* @param encrypted - base64 암호화된 문자열
|
|
125
|
+
* @param key - 32 bytes 암호화 키
|
|
126
|
+
* @returns number[] 벡터
|
|
127
|
+
*/
|
|
128
|
+
export function decryptEmbedding(encrypted, key) {
|
|
129
|
+
const combined = Buffer.from(encrypted, 'base64');
|
|
130
|
+
// iv (12) + tag (16) + ciphertext
|
|
131
|
+
if (combined.length < IV_LENGTH + TAG_LENGTH) {
|
|
132
|
+
throw new Error('암호화된 임베딩 데이터가 너무 짧습니다');
|
|
133
|
+
}
|
|
134
|
+
const iv = combined.subarray(0, IV_LENGTH);
|
|
135
|
+
const tag = combined.subarray(IV_LENGTH, IV_LENGTH + TAG_LENGTH);
|
|
136
|
+
const ciphertext = combined.subarray(IV_LENGTH + TAG_LENGTH);
|
|
137
|
+
const decipher = createDecipheriv(ALGORITHM, key, iv);
|
|
138
|
+
decipher.setAuthTag(tag);
|
|
139
|
+
try {
|
|
140
|
+
const decrypted = Buffer.concat([
|
|
141
|
+
decipher.update(ciphertext),
|
|
142
|
+
decipher.final(),
|
|
143
|
+
]);
|
|
144
|
+
// Buffer를 Float64Array로 변환
|
|
145
|
+
const float64Array = new Float64Array(decrypted.buffer, decrypted.byteOffset, decrypted.byteLength / Float64Array.BYTES_PER_ELEMENT);
|
|
146
|
+
return Array.from(float64Array);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
if (error instanceof Error) {
|
|
150
|
+
throw new Error(`임베딩 복호화 실패: ${error.message}`);
|
|
151
|
+
}
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// ============================================================
|
|
156
|
+
// Utilities
|
|
157
|
+
// ============================================================
|
|
158
|
+
/**
|
|
159
|
+
* EncryptedPayload 검증
|
|
160
|
+
*/
|
|
161
|
+
export function isValidEncryptedPayload(obj) {
|
|
162
|
+
if (typeof obj !== 'object' || obj === null)
|
|
163
|
+
return false;
|
|
164
|
+
const payload = obj;
|
|
165
|
+
return (typeof payload.ciphertext === 'string' &&
|
|
166
|
+
typeof payload.iv === 'string' &&
|
|
167
|
+
typeof payload.tag === 'string');
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* 암호화된 컨텐츠를 JSON으로 래핑
|
|
171
|
+
*/
|
|
172
|
+
export function wrapEncryptedContent(encrypted) {
|
|
173
|
+
return JSON.stringify({
|
|
174
|
+
encrypted: true,
|
|
175
|
+
data: encrypted.ciphertext,
|
|
176
|
+
iv: encrypted.iv,
|
|
177
|
+
tag: encrypted.tag,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* JSON에서 암호화된 컨텐츠 추출
|
|
182
|
+
*/
|
|
183
|
+
export function unwrapEncryptedContent(wrapped) {
|
|
184
|
+
try {
|
|
185
|
+
const parsed = JSON.parse(wrapped);
|
|
186
|
+
if (parsed.encrypted !== true)
|
|
187
|
+
return null;
|
|
188
|
+
if (typeof parsed.data !== 'string' ||
|
|
189
|
+
typeof parsed.iv !== 'string' ||
|
|
190
|
+
typeof parsed.tag !== 'string') {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
ciphertext: parsed.data,
|
|
195
|
+
iv: parsed.iv,
|
|
196
|
+
tag: parsed.tag,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=encryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../src/sync/encryption.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/index.d.ts
CHANGED
|
@@ -10,4 +10,8 @@ export type { QueueFlushResult, FlushOptions } from './queue.js';
|
|
|
10
10
|
export { LocalVectorClock } from './vector-clock.js';
|
|
11
11
|
export { TeamSynchronizer } from './team-synchronizer.js';
|
|
12
12
|
export type { TeamSyncResult, TeamSyncStatus } from './team-synchronizer.js';
|
|
13
|
+
export { SyncScheduler } from './scheduler.js';
|
|
14
|
+
export type { SyncSchedulerOptions, SyncSchedulerStatus } from './scheduler.js';
|
|
15
|
+
export { encryptContent, decryptContent, encryptEmbedding, decryptEmbedding, deriveKey, generateEncryptionKey, wrapEncryptedContent, unwrapEncryptedContent, isValidEncryptedPayload, } from './encryption.js';
|
|
16
|
+
export type { EncryptedPayload, EncryptionConfig, KeyDerivationResult, } from './encryption.js';
|
|
13
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/sync/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC7D,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC7D,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGhF,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC"}
|
package/dist/sync/index.js
CHANGED
|
@@ -6,4 +6,7 @@ export { MemorySynchronizer } from './synchronizer.js';
|
|
|
6
6
|
export { SyncQueue, mapCategory, mapTier } from './queue.js';
|
|
7
7
|
export { LocalVectorClock } from './vector-clock.js';
|
|
8
8
|
export { TeamSynchronizer } from './team-synchronizer.js';
|
|
9
|
+
export { SyncScheduler } from './scheduler.js';
|
|
10
|
+
// Encryption
|
|
11
|
+
export { encryptContent, decryptContent, encryptEmbedding, decryptEmbedding, deriveKey, generateEncryptionKey, wrapEncryptedContent, unwrapEncryptedContent, isValidEncryptedPayload, } from './encryption.js';
|
|
9
12
|
//# sourceMappingURL=index.js.map
|
package/dist/sync/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,aAAa;AACb,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync Scheduler
|
|
3
|
+
*
|
|
4
|
+
* 주기적으로 MemorySynchronizer.sync()를 실행하는 스케줄러.
|
|
5
|
+
* CLI `sync --watch` 또는 라이브러리로 사용 가능.
|
|
6
|
+
*/
|
|
7
|
+
import type { MemorySynchronizer, SyncResult } from './synchronizer.js';
|
|
8
|
+
import type { HookLogger } from '../utils/logger.js';
|
|
9
|
+
export interface SyncSchedulerOptions {
|
|
10
|
+
/** 동기화 주기 (ms). 기본: 1800000 (30분). 0이면 비활성 */
|
|
11
|
+
intervalMs: number;
|
|
12
|
+
/** 시작 시 즉시 sync 실행 여부. 기본: true */
|
|
13
|
+
syncOnStart?: boolean;
|
|
14
|
+
/** sync 완료 콜백 */
|
|
15
|
+
onSync?: (result: SyncResult) => void;
|
|
16
|
+
/** 에러 콜백 */
|
|
17
|
+
onError?: (error: Error) => void;
|
|
18
|
+
}
|
|
19
|
+
export interface SyncSchedulerStatus {
|
|
20
|
+
running: boolean;
|
|
21
|
+
syncing: boolean;
|
|
22
|
+
syncCount: number;
|
|
23
|
+
lastSyncAt: string | null;
|
|
24
|
+
lastResult: SyncResult | null;
|
|
25
|
+
intervalMs: number;
|
|
26
|
+
nextSyncAt: string | null;
|
|
27
|
+
}
|
|
28
|
+
export declare class SyncScheduler {
|
|
29
|
+
private synchronizer;
|
|
30
|
+
private options;
|
|
31
|
+
private logger?;
|
|
32
|
+
private timer;
|
|
33
|
+
private running;
|
|
34
|
+
private syncing;
|
|
35
|
+
private syncCount;
|
|
36
|
+
private lastSyncAt;
|
|
37
|
+
private lastResult;
|
|
38
|
+
private startedAt;
|
|
39
|
+
constructor(synchronizer: MemorySynchronizer, options: SyncSchedulerOptions, logger?: HookLogger | undefined);
|
|
40
|
+
/**
|
|
41
|
+
* 스케줄러 시작
|
|
42
|
+
*/
|
|
43
|
+
start(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* 스케줄러 중지
|
|
46
|
+
*/
|
|
47
|
+
stop(): void;
|
|
48
|
+
/**
|
|
49
|
+
* 실행 중 여부
|
|
50
|
+
*/
|
|
51
|
+
isRunning(): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* 현재 sync 중 여부
|
|
54
|
+
*/
|
|
55
|
+
isSyncing(): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* 스케줄러 상태
|
|
58
|
+
*/
|
|
59
|
+
getStatus(): SyncSchedulerStatus;
|
|
60
|
+
/**
|
|
61
|
+
* 수동으로 즉시 sync 실행 (스케줄러 타이머와 무관)
|
|
62
|
+
*/
|
|
63
|
+
syncNow(): Promise<SyncResult | null>;
|
|
64
|
+
/**
|
|
65
|
+
* 한 번의 sync 사이클
|
|
66
|
+
*/
|
|
67
|
+
private tick;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/sync/scheduler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB;IACjB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,YAAY;IACZ,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,qBAAa,aAAa;IAUtB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM,CAAC;IAXjB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,SAAS,CAAqB;gBAG5B,YAAY,EAAE,kBAAkB,EAChC,OAAO,EAAE,oBAAoB,EAC7B,MAAM,CAAC,EAAE,UAAU,YAAA;IAG7B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC5B;;OAEG;IACH,IAAI,IAAI,IAAI;IAYZ;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,SAAS,IAAI,mBAAmB;IAqBhC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAI3C;;OAEG;YACW,IAAI;CAgCnB"}
|