a2a-memory 0.11.5 → 0.11.6
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/LICENSE +7 -19
- package/README.md +1 -1
- package/dist/a2a/client.js +1 -252
- package/dist/a2a/discovery.js +1 -115
- package/dist/a2a/index.js +1 -8
- package/dist/a2a/types.js +1 -42
- package/dist/adapters/anthropic.js +1 -117
- package/dist/chunking/chunker.js +1 -163
- package/dist/claude/sync.js +1 -298
- package/dist/cli/commands/add.js +1 -80
- package/dist/cli/commands/claude-sync.js +1 -70
- package/dist/cli/commands/cleanup.js +1 -83
- package/dist/cli/commands/config.js +1 -79
- package/dist/cli/commands/edit.js +1 -69
- package/dist/cli/commands/embed.js +1 -92
- package/dist/cli/commands/extract.js +1 -103
- package/dist/cli/commands/health.js +1 -105
- package/dist/cli/commands/list.js +1 -46
- package/dist/cli/commands/migrate-chunks.js +1 -205
- package/dist/cli/commands/migrate-file-refs.js +1 -183
- package/dist/cli/commands/proficiency.js +1 -146
- package/dist/cli/commands/rm.js +1 -64
- package/dist/cli/commands/search.js +1 -90
- package/dist/cli/commands/setup-wizard.js +1 -387
- package/dist/cli/commands/setup.js +1 -170
- package/dist/cli/commands/skill.js +1 -151
- package/dist/cli/commands/status.js +1 -70
- package/dist/cli/commands/sync.js +1 -202
- package/dist/cli/commands/team.js +1 -142
- package/dist/cli/index.js +1 -87
- package/dist/config/manager.js +1 -372
- package/dist/db/database.js +1 -1400
- package/dist/embedding/e5-provider.js +1 -147
- package/dist/embedding/index.js +1 -34
- package/dist/embedding/local-provider.js +1 -157
- package/dist/embedding/openai-provider.js +1 -92
- package/dist/embedding/quantization.js +1 -89
- package/dist/extraction/dedup-manager.js +1 -161
- package/dist/extraction/emotion-filter.js +1 -33
- package/dist/extraction/extractor.js +1 -648
- package/dist/extraction/file-reference.js +1 -77
- package/dist/extraction/filter.js +1 -86
- package/dist/extraction/scorer.js +1 -142
- package/dist/extraction/similarity.js +1 -85
- package/dist/hooks/client-factory.js +1 -44
- package/dist/hooks/post-tool-use.js +1 -518
- package/dist/hooks/pre-compact.js +1 -209
- package/dist/hooks/session-end.js +1 -633
- package/dist/hooks/session-start.js +1 -549
- package/dist/hooks/shared.js +1 -110
- package/dist/hooks/user-prompt-submit.js +1 -316
- package/dist/i18n/index.js +1 -2
- package/dist/i18n/messages.js +1 -150
- package/dist/index.js +1 -43
- package/dist/lifecycle/cleanup-scheduler.js +1 -137
- package/dist/lifecycle/cleanup.js +1 -116
- package/dist/lifecycle/index.js +1 -13
- package/dist/lifecycle/quality-scorer.js +1 -46
- package/dist/lifecycle/tiering.js +1 -246
- package/dist/llm/client.js +1 -226
- package/dist/llm/index.js +1 -5
- package/dist/proficiency/actr-engine.js +1 -106
- package/dist/proficiency/detection.js +1 -77
- package/dist/proficiency/index.js +1 -9
- package/dist/proficiency/tracker.js +1 -173
- package/dist/proficiency/types.js +1 -8
- package/dist/providers/adapters.js +1 -140
- package/dist/providers/detector.js +1 -57
- package/dist/search/adaptive-router.js +1 -93
- package/dist/search/index.js +1 -9
- package/dist/search/ranker.js +1 -171
- package/dist/search/reranker.js +1 -155
- package/dist/session/parser.js +1 -130
- package/dist/skill/evaluator.js +1 -509
- package/dist/skill/index.js +1 -7
- package/dist/skill/types.js +1 -7
- package/dist/sync/client.js +1 -597
- package/dist/sync/encryption.js +1 -203
- package/dist/sync/index.js +1 -12
- package/dist/sync/queue.js +1 -214
- package/dist/sync/scheduler.js +1 -140
- package/dist/sync/synchronizer.js +1 -241
- package/dist/sync/team-synchronizer.js +1 -204
- package/dist/sync/vector-clock.js +1 -70
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js +1 -132
- package/dist/utils/keychain.js +1 -170
- package/dist/utils/logger.js +1 -128
- package/package.json +14 -10
- package/dist/a2a/client.d.ts.map +0 -1
- package/dist/a2a/client.js.map +0 -1
- package/dist/a2a/discovery.d.ts.map +0 -1
- package/dist/a2a/discovery.js.map +0 -1
- package/dist/a2a/index.d.ts.map +0 -1
- package/dist/a2a/index.js.map +0 -1
- package/dist/a2a/types.d.ts.map +0 -1
- package/dist/a2a/types.js.map +0 -1
- package/dist/adapters/anthropic.d.ts.map +0 -1
- package/dist/adapters/anthropic.js.map +0 -1
- package/dist/chunking/chunker.d.ts.map +0 -1
- package/dist/chunking/chunker.js.map +0 -1
- package/dist/claude/sync.d.ts.map +0 -1
- package/dist/claude/sync.js.map +0 -1
- package/dist/cli/commands/add.d.ts.map +0 -1
- package/dist/cli/commands/add.js.map +0 -1
- package/dist/cli/commands/claude-sync.d.ts.map +0 -1
- package/dist/cli/commands/claude-sync.js.map +0 -1
- package/dist/cli/commands/cleanup.d.ts.map +0 -1
- package/dist/cli/commands/cleanup.js.map +0 -1
- package/dist/cli/commands/config.d.ts.map +0 -1
- package/dist/cli/commands/config.js.map +0 -1
- package/dist/cli/commands/edit.d.ts.map +0 -1
- package/dist/cli/commands/edit.js.map +0 -1
- package/dist/cli/commands/embed.d.ts.map +0 -1
- package/dist/cli/commands/embed.js.map +0 -1
- package/dist/cli/commands/extract.d.ts.map +0 -1
- package/dist/cli/commands/extract.js.map +0 -1
- package/dist/cli/commands/health.d.ts.map +0 -1
- package/dist/cli/commands/health.js.map +0 -1
- package/dist/cli/commands/list.d.ts.map +0 -1
- package/dist/cli/commands/list.js.map +0 -1
- package/dist/cli/commands/migrate-chunks.d.ts.map +0 -1
- package/dist/cli/commands/migrate-chunks.js.map +0 -1
- package/dist/cli/commands/migrate-file-refs.d.ts.map +0 -1
- package/dist/cli/commands/migrate-file-refs.js.map +0 -1
- package/dist/cli/commands/proficiency.d.ts.map +0 -1
- package/dist/cli/commands/proficiency.js.map +0 -1
- package/dist/cli/commands/rm.d.ts.map +0 -1
- package/dist/cli/commands/rm.js.map +0 -1
- package/dist/cli/commands/search.d.ts.map +0 -1
- package/dist/cli/commands/search.js.map +0 -1
- package/dist/cli/commands/setup-wizard.d.ts.map +0 -1
- package/dist/cli/commands/setup-wizard.js.map +0 -1
- package/dist/cli/commands/setup.d.ts.map +0 -1
- package/dist/cli/commands/setup.js.map +0 -1
- package/dist/cli/commands/skill.d.ts.map +0 -1
- package/dist/cli/commands/skill.js.map +0 -1
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/status.js.map +0 -1
- package/dist/cli/commands/sync.d.ts.map +0 -1
- package/dist/cli/commands/sync.js.map +0 -1
- package/dist/cli/commands/team.d.ts.map +0 -1
- package/dist/cli/commands/team.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/config/manager.d.ts.map +0 -1
- package/dist/config/manager.js.map +0 -1
- package/dist/db/database.d.ts.map +0 -1
- package/dist/db/database.js.map +0 -1
- package/dist/embedding/e5-provider.d.ts.map +0 -1
- package/dist/embedding/e5-provider.js.map +0 -1
- package/dist/embedding/index.d.ts.map +0 -1
- package/dist/embedding/index.js.map +0 -1
- package/dist/embedding/local-provider.d.ts.map +0 -1
- package/dist/embedding/local-provider.js.map +0 -1
- package/dist/embedding/openai-provider.d.ts.map +0 -1
- package/dist/embedding/openai-provider.js.map +0 -1
- package/dist/embedding/quantization.d.ts.map +0 -1
- package/dist/embedding/quantization.js.map +0 -1
- package/dist/extraction/dedup-manager.d.ts.map +0 -1
- package/dist/extraction/dedup-manager.js.map +0 -1
- package/dist/extraction/emotion-filter.d.ts.map +0 -1
- package/dist/extraction/emotion-filter.js.map +0 -1
- package/dist/extraction/extractor.d.ts.map +0 -1
- package/dist/extraction/extractor.js.map +0 -1
- package/dist/extraction/file-reference.d.ts.map +0 -1
- package/dist/extraction/file-reference.js.map +0 -1
- package/dist/extraction/filter.d.ts.map +0 -1
- package/dist/extraction/filter.js.map +0 -1
- package/dist/extraction/scorer.d.ts.map +0 -1
- package/dist/extraction/scorer.js.map +0 -1
- package/dist/extraction/similarity.d.ts.map +0 -1
- package/dist/extraction/similarity.js.map +0 -1
- package/dist/hooks/client-factory.d.ts.map +0 -1
- package/dist/hooks/client-factory.js.map +0 -1
- package/dist/hooks/post-tool-use.d.ts.map +0 -1
- package/dist/hooks/post-tool-use.js.map +0 -1
- package/dist/hooks/pre-compact.d.ts.map +0 -1
- package/dist/hooks/pre-compact.js.map +0 -1
- package/dist/hooks/session-end.d.ts.map +0 -1
- package/dist/hooks/session-end.js.map +0 -1
- package/dist/hooks/session-start.d.ts.map +0 -1
- package/dist/hooks/session-start.js.map +0 -1
- package/dist/hooks/shared.d.ts.map +0 -1
- package/dist/hooks/shared.js.map +0 -1
- package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
- package/dist/hooks/user-prompt-submit.js.map +0 -1
- package/dist/i18n/index.d.ts.map +0 -1
- package/dist/i18n/index.js.map +0 -1
- package/dist/i18n/messages.d.ts.map +0 -1
- package/dist/i18n/messages.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lifecycle/cleanup-scheduler.d.ts.map +0 -1
- package/dist/lifecycle/cleanup-scheduler.js.map +0 -1
- package/dist/lifecycle/cleanup.d.ts.map +0 -1
- package/dist/lifecycle/cleanup.js.map +0 -1
- package/dist/lifecycle/index.d.ts.map +0 -1
- package/dist/lifecycle/index.js.map +0 -1
- package/dist/lifecycle/quality-scorer.d.ts.map +0 -1
- package/dist/lifecycle/quality-scorer.js.map +0 -1
- package/dist/lifecycle/tiering.d.ts.map +0 -1
- package/dist/lifecycle/tiering.js.map +0 -1
- package/dist/llm/client.d.ts.map +0 -1
- package/dist/llm/client.js.map +0 -1
- package/dist/llm/index.d.ts.map +0 -1
- package/dist/llm/index.js.map +0 -1
- package/dist/proficiency/actr-engine.d.ts.map +0 -1
- package/dist/proficiency/actr-engine.js.map +0 -1
- package/dist/proficiency/detection.d.ts.map +0 -1
- package/dist/proficiency/detection.js.map +0 -1
- package/dist/proficiency/index.d.ts.map +0 -1
- package/dist/proficiency/index.js.map +0 -1
- package/dist/proficiency/tracker.d.ts.map +0 -1
- package/dist/proficiency/tracker.js.map +0 -1
- package/dist/proficiency/types.d.ts.map +0 -1
- package/dist/proficiency/types.js.map +0 -1
- package/dist/providers/adapters.d.ts.map +0 -1
- package/dist/providers/adapters.js.map +0 -1
- package/dist/providers/detector.d.ts.map +0 -1
- package/dist/providers/detector.js.map +0 -1
- package/dist/search/adaptive-router.d.ts.map +0 -1
- package/dist/search/adaptive-router.js.map +0 -1
- package/dist/search/index.d.ts.map +0 -1
- package/dist/search/index.js.map +0 -1
- package/dist/search/ranker.d.ts.map +0 -1
- package/dist/search/ranker.js.map +0 -1
- package/dist/search/reranker.d.ts.map +0 -1
- package/dist/search/reranker.js.map +0 -1
- package/dist/session/parser.d.ts.map +0 -1
- package/dist/session/parser.js.map +0 -1
- package/dist/skill/evaluator.d.ts.map +0 -1
- package/dist/skill/evaluator.js.map +0 -1
- package/dist/skill/index.d.ts.map +0 -1
- package/dist/skill/index.js.map +0 -1
- package/dist/skill/types.d.ts.map +0 -1
- package/dist/skill/types.js.map +0 -1
- package/dist/sync/client.d.ts.map +0 -1
- package/dist/sync/client.js.map +0 -1
- package/dist/sync/encryption.d.ts.map +0 -1
- package/dist/sync/encryption.js.map +0 -1
- package/dist/sync/index.d.ts.map +0 -1
- package/dist/sync/index.js.map +0 -1
- package/dist/sync/queue.d.ts.map +0 -1
- package/dist/sync/queue.js.map +0 -1
- package/dist/sync/scheduler.d.ts.map +0 -1
- package/dist/sync/scheduler.js.map +0 -1
- package/dist/sync/synchronizer.d.ts.map +0 -1
- package/dist/sync/synchronizer.js.map +0 -1
- package/dist/sync/team-synchronizer.d.ts.map +0 -1
- package/dist/sync/team-synchronizer.js.map +0 -1
- package/dist/sync/vector-clock.d.ts.map +0 -1
- package/dist/sync/vector-clock.js.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js.map +0 -1
- package/dist/utils/keychain.d.ts.map +0 -1
- package/dist/utils/keychain.js.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js.map +0 -1
|
@@ -1,241 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Memory Synchronizer
|
|
3
|
-
* 로컬 메모리(캐시)와 원격 A2A 서버(Single Source of Truth) 간 동기화
|
|
4
|
-
*/
|
|
5
|
-
import { SyncQueue, mapCategory, mapTier } from './queue.js';
|
|
6
|
-
import { TeamSynchronizer } from './team-synchronizer.js';
|
|
7
|
-
const DEFAULT_PAGE_SIZE = 100;
|
|
8
|
-
export class MemorySynchronizer {
|
|
9
|
-
db;
|
|
10
|
-
client;
|
|
11
|
-
teamPath;
|
|
12
|
-
nodeId;
|
|
13
|
-
queue;
|
|
14
|
-
failures = 0;
|
|
15
|
-
lastFailureAt = 0;
|
|
16
|
-
maxFailures = 3;
|
|
17
|
-
cooldownMs = 30000;
|
|
18
|
-
constructor(db, client, teamPath, nodeId) {
|
|
19
|
-
this.db = db;
|
|
20
|
-
this.client = client;
|
|
21
|
-
this.teamPath = teamPath;
|
|
22
|
-
this.nodeId = nodeId;
|
|
23
|
-
this.queue = new SyncQueue(db, client);
|
|
24
|
-
}
|
|
25
|
-
isCircuitOpen() {
|
|
26
|
-
if (this.failures < this.maxFailures)
|
|
27
|
-
return false;
|
|
28
|
-
return (Date.now() - this.lastFailureAt) < this.cooldownMs;
|
|
29
|
-
}
|
|
30
|
-
recordSuccess() {
|
|
31
|
-
this.failures = 0;
|
|
32
|
-
}
|
|
33
|
-
recordFailure() {
|
|
34
|
-
this.failures++;
|
|
35
|
-
this.lastFailureAt = Date.now();
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* 양방향 동기화 (team 모드 시 TeamSynchronizer에 위임)
|
|
39
|
-
*/
|
|
40
|
-
async sync() {
|
|
41
|
-
if (this.teamPath && this.nodeId) {
|
|
42
|
-
const teamSync = new TeamSynchronizer(this.db, this.client, this.teamPath, this.nodeId);
|
|
43
|
-
const teamResult = await teamSync.syncDelta();
|
|
44
|
-
return {
|
|
45
|
-
pushed: teamResult.pushed,
|
|
46
|
-
pulled: teamResult.pulled,
|
|
47
|
-
conflicts: teamResult.conflicts,
|
|
48
|
-
errors: teamResult.errors,
|
|
49
|
-
duration: teamResult.duration,
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
return this.syncLocal();
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* 로컬 양방향 동기화 (기존 로직)
|
|
56
|
-
*/
|
|
57
|
-
async syncLocal() {
|
|
58
|
-
const startTime = Date.now();
|
|
59
|
-
const result = {
|
|
60
|
-
pushed: 0,
|
|
61
|
-
pulled: 0,
|
|
62
|
-
conflicts: 0,
|
|
63
|
-
errors: [],
|
|
64
|
-
duration: 0,
|
|
65
|
-
};
|
|
66
|
-
try {
|
|
67
|
-
// 1. Push (로컬→원격)
|
|
68
|
-
const pushResult = await this.push();
|
|
69
|
-
result.pushed = pushResult.pushed;
|
|
70
|
-
result.errors.push(...pushResult.errors);
|
|
71
|
-
// 2. Pull (원격→로컬)
|
|
72
|
-
const pullResult = await this.pull();
|
|
73
|
-
result.pulled = pullResult.pulled;
|
|
74
|
-
result.conflicts = pullResult.conflicts;
|
|
75
|
-
result.errors.push(...pullResult.errors);
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
if (error instanceof Error) {
|
|
79
|
-
result.errors.push(error.message);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
result.duration = Date.now() - startTime;
|
|
83
|
-
return result;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* 로컬→원격 (SyncQueue에 위임)
|
|
87
|
-
*/
|
|
88
|
-
async push(options) {
|
|
89
|
-
if (this.isCircuitOpen()) {
|
|
90
|
-
return { pushed: 0, pulled: 0, conflicts: 0, errors: ['Circuit breaker open: too many consecutive failures'], duration: 0 };
|
|
91
|
-
}
|
|
92
|
-
const startTime = Date.now();
|
|
93
|
-
try {
|
|
94
|
-
const flushResult = await this.queue.flush({
|
|
95
|
-
timeoutMs: options?.timeoutMs,
|
|
96
|
-
});
|
|
97
|
-
// tombstone 동기화 (삭제된 메모리 원격 삭제)
|
|
98
|
-
const tombstoneResult = await this.queue.flushTombstones();
|
|
99
|
-
const allErrors = [...flushResult.errors, ...tombstoneResult.errors];
|
|
100
|
-
if (allErrors.length > 0) {
|
|
101
|
-
this.recordFailure();
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
this.recordSuccess();
|
|
105
|
-
}
|
|
106
|
-
return {
|
|
107
|
-
pushed: flushResult.pushed,
|
|
108
|
-
pulled: tombstoneResult.deleted,
|
|
109
|
-
conflicts: 0,
|
|
110
|
-
errors: allErrors,
|
|
111
|
-
duration: Date.now() - startTime,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
catch (error) {
|
|
115
|
-
this.recordFailure();
|
|
116
|
-
throw error;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* 원격→로컬 (페이지네이션 적용)
|
|
121
|
-
*/
|
|
122
|
-
async pull() {
|
|
123
|
-
if (this.isCircuitOpen()) {
|
|
124
|
-
return { pushed: 0, pulled: 0, conflicts: 0, errors: ['Circuit breaker open: too many consecutive failures'], duration: 0 };
|
|
125
|
-
}
|
|
126
|
-
const startTime = Date.now();
|
|
127
|
-
const result = {
|
|
128
|
-
pushed: 0,
|
|
129
|
-
pulled: 0,
|
|
130
|
-
conflicts: 0,
|
|
131
|
-
errors: [],
|
|
132
|
-
duration: 0,
|
|
133
|
-
};
|
|
134
|
-
try {
|
|
135
|
-
let offset = 0;
|
|
136
|
-
let hasMore = true;
|
|
137
|
-
while (hasMore) {
|
|
138
|
-
const remoteMemories = await this.client.listMemories({
|
|
139
|
-
limit: DEFAULT_PAGE_SIZE,
|
|
140
|
-
offset,
|
|
141
|
-
includeEmbedding: true,
|
|
142
|
-
});
|
|
143
|
-
if (remoteMemories.length === 0) {
|
|
144
|
-
hasMore = false;
|
|
145
|
-
break;
|
|
146
|
-
}
|
|
147
|
-
// Parent-first: parent_id가 없는 것(Parent/독립) 먼저 처리하여 FK 참조 무결성 보장
|
|
148
|
-
remoteMemories.sort((a, b) => {
|
|
149
|
-
const aIsChild = a.parent_id ? 1 : 0;
|
|
150
|
-
const bIsChild = b.parent_id ? 1 : 0;
|
|
151
|
-
return aIsChild - bIsChild;
|
|
152
|
-
});
|
|
153
|
-
for (const remote of remoteMemories) {
|
|
154
|
-
try {
|
|
155
|
-
const existing = this.db.findMemoryByRemoteId(remote.id);
|
|
156
|
-
if (!existing) {
|
|
157
|
-
// 새로운 메모리 — category/tier 매핑 적용
|
|
158
|
-
const created = this.db.createMemory({
|
|
159
|
-
content: remote.content,
|
|
160
|
-
category: mapCategory(remote.category),
|
|
161
|
-
tier: mapTier(remote.tier ?? 'episodic'),
|
|
162
|
-
tags: remote.tags ?? [],
|
|
163
|
-
parentId: remote.parent_id ?? undefined,
|
|
164
|
-
chunkIndex: remote.chunk_index ?? undefined,
|
|
165
|
-
chunkTotal: remote.chunk_total ?? undefined,
|
|
166
|
-
});
|
|
167
|
-
// 임베딩 저장
|
|
168
|
-
if (remote.embedding && remote.embedding.length > 0) {
|
|
169
|
-
this.db.saveEmbedding(created.id, remote.embedding);
|
|
170
|
-
}
|
|
171
|
-
this.db.setSyncStatus(created.id, remote.id, 'synced');
|
|
172
|
-
result.pulled++;
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
// 충돌 검사 (updated_at 비교)
|
|
176
|
-
const remoteUpdated = new Date(remote.updated_at);
|
|
177
|
-
const localUpdated = new Date(existing.updatedAt);
|
|
178
|
-
if (remoteUpdated > localUpdated) {
|
|
179
|
-
this.db.updateMemory(existing.id, {
|
|
180
|
-
content: remote.content,
|
|
181
|
-
category: mapCategory(remote.category),
|
|
182
|
-
tier: mapTier(remote.tier ?? existing.tier),
|
|
183
|
-
tags: remote.tags ?? existing.tags,
|
|
184
|
-
});
|
|
185
|
-
// 임베딩 업데이트
|
|
186
|
-
if (remote.embedding && remote.embedding.length > 0) {
|
|
187
|
-
this.db.saveEmbedding(existing.id, remote.embedding);
|
|
188
|
-
}
|
|
189
|
-
this.db.setSyncStatus(existing.id, remote.id, 'synced');
|
|
190
|
-
result.conflicts++;
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
catch (error) {
|
|
195
|
-
if (error instanceof Error) {
|
|
196
|
-
result.errors.push(`메모리 ${remote.id} 풀 실패: ${error.message}`);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
// 다음 페이지
|
|
201
|
-
if (remoteMemories.length < DEFAULT_PAGE_SIZE) {
|
|
202
|
-
hasMore = false;
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
offset += DEFAULT_PAGE_SIZE;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
this.recordSuccess();
|
|
209
|
-
}
|
|
210
|
-
catch (error) {
|
|
211
|
-
this.recordFailure();
|
|
212
|
-
if (error instanceof Error) {
|
|
213
|
-
result.errors.push(error.message);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
result.duration = Date.now() - startTime;
|
|
217
|
-
return result;
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* 동기화 상태 확인
|
|
221
|
-
*/
|
|
222
|
-
async getStatus() {
|
|
223
|
-
const pendingPush = this.queue.getPendingCount();
|
|
224
|
-
let pendingPull = 0;
|
|
225
|
-
try {
|
|
226
|
-
const remote = await this.client.listMemories({ limit: 10000 });
|
|
227
|
-
const localSynced = this.db.getSyncedMemoryCount();
|
|
228
|
-
pendingPull = Math.max(0, remote.length - localSynced);
|
|
229
|
-
}
|
|
230
|
-
catch {
|
|
231
|
-
// 원격 접속 실패 시 0
|
|
232
|
-
}
|
|
233
|
-
const lastSyncedAt = this.db.getLastSyncedAt();
|
|
234
|
-
return {
|
|
235
|
-
pendingPush,
|
|
236
|
-
pendingPull,
|
|
237
|
-
lastSyncedAt: lastSyncedAt ?? undefined,
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
//# sourceMappingURL=synchronizer.js.map
|
|
1
|
+
function _0x20d00e(_0x2e77c6,_0x32c2b2){return _0x44a6(_0x32c2b2-0x63,_0x2e77c6);}function _0x10ea(){const _0x220763=['y2f0zwDVCNK','y29UzMXPy3rZ','C3LUy0XVy2fS','BgvUz3rO','DgLTzw91De1Z','C3LUyW','zMX1C2HuB21ICW','BgLZDe1LBw9YAq','ChvSBa','z2v0tgfZDfn5BG','AvzOAg8','rwrTufO','y29VBgrVD25nCW','twHgAwy','DMuGzMfPBhvYzq','ntzvsujcuwi','q09NwhO','Dg9Uzxm','r3PPtfO','zw1IzwrKAw5N','zwfRzxiGB3bLBG','y2XPzw50','C3LUy2vK','v2f0sgq','C1zbug8','ignVBNnLy3v0Aq','CgfYzw50x2LK','BM9KzuLK','y2H1BMTFAw5Kzq','AxndAxjJDwL0tW','zgvSzxrLza','sMT0svq','Aw5N','mJa5oda3mujky1fzEq','zuf0','zhvYyxrPB24','C2v0u3LUy1n0yq','ChvZAa','rNjgCvm','ChvSBgvK','z2v0u3LUy2vKtq','oIb0B28GBwfUEq','DhvZ','DxbKyxrLzef0','z2v0u3rHDhvZ','zMX1C2G','uKzcwNa','BwvZC2fNzq','y2H1BMTFDg90yq','zND6tM8','C2f2zuvTyMvKza','ChvZAgvK','q2LYy3vPDcbICG','CxvLDwu','CgvU','DxjL','sgH4C08','CMvJB3jKu3vJyW','zMfPBhvYzxm','nZuXmZG2sKDLvvLS','mtGZwuzPyM9A','Efnhu3m','BgfZDezHAwX1CG','mta1oda3nwLPwfzSzq','io2sGcdSI6tTJkG6ia','mtG0ndCZnMzYs3rfBG','qNLszw1VDgvjza','mZy2mJi2zhP3s2HS','weTOsxy','z2v0ugvUzgLUzW','zxnZ','C3r3qvK','mJG0nZHHzMjIA2e','zxbPC29KAwm','DgLLCG','66Mu66QO66ASia','mZKWnZmWogfOuLfwwG','C3LUy0rLBhrH','z29dEvm','zxjYB3jZ','BM93','CMvJB3jKrMfPBa','DgvHBvbHDgG','zMLUze1LBw9YEq','swDtu0m','Bu5IzuO','DgfNCW','BNrYALu','rgHIEKq','mtb0u0fdDwS','Bwf4rMfPBhvYzq'];_0x10ea=function(){return _0x220763;};return _0x10ea();}(function(_0x3e690c,_0x146bca){function _0x15355a(_0x12496d,_0x51c787){return _0x44a6(_0x51c787- -0x15e,_0x12496d);}function _0x1f16eb(_0x261c28,_0x27ee29){return _0x44a6(_0x261c28- -0x3d9,_0x27ee29);}const _0x50852e=_0x3e690c();while(!![]){try{const _0x32941c=-parseInt(_0x1f16eb(-0x228,-0x212))/0x1+-parseInt(_0x1f16eb(-0x223,-0x24b))/0x2*(parseInt(_0x15355a(0x45,0x4c))/0x3)+parseInt(_0x1f16eb(-0x21f,-0x217))/0x4+-parseInt(_0x15355a(0x3f,0x4f))/0x5+-parseInt(_0x1f16eb(-0x230,-0x230))/0x6*(-parseInt(_0x15355a(0xf,0x1f))/0x7)+parseInt(_0x15355a(0x40,0x51))/0x8+-parseInt(_0x1f16eb(-0x24a,-0x254))/0x9*(parseInt(_0x15355a(0x13,0xe))/0xa);if(_0x32941c===_0x146bca)break;else _0x50852e['push'](_0x50852e['shift']());}catch(_0x3383e6){_0x50852e['push'](_0x50852e['shift']());}}}(_0x10ea,0x81540));import{SyncQueue,mapCategory,mapTier}from'./queue.js';import{TeamSynchronizer}from'./team-synchronizer.js';function _0x44a6(_0x566fe8,_0xa4312c){_0x566fe8=_0x566fe8-0x160;const _0x10ea52=_0x10ea();let _0x44a6c3=_0x10ea52[_0x566fe8];if(_0x44a6['LoUuSb']===undefined){var _0x5e128d=function(_0x489cd0){const _0x249ab9='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x111e2c='',_0x24bb9c='';for(let _0x2711a8=0x0,_0x22ff16,_0x350e8b,_0x519c7f=0x0;_0x350e8b=_0x489cd0['charAt'](_0x519c7f++);~_0x350e8b&&(_0x22ff16=_0x2711a8%0x4?_0x22ff16*0x40+_0x350e8b:_0x350e8b,_0x2711a8++%0x4)?_0x111e2c+=String['fromCharCode'](0xff&_0x22ff16>>(-0x2*_0x2711a8&0x6)):0x0){_0x350e8b=_0x249ab9['indexOf'](_0x350e8b);}for(let _0x3cba2c=0x0,_0x41bce7=_0x111e2c['length'];_0x3cba2c<_0x41bce7;_0x3cba2c++){_0x24bb9c+='%'+('00'+_0x111e2c['charCodeAt'](_0x3cba2c)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x24bb9c);};_0x44a6['HphDix']=_0x5e128d,_0x44a6['eedDhC']={},_0x44a6['LoUuSb']=!![];}const _0x473f6a=_0x10ea52[0x0],_0x459421=_0x566fe8+_0x473f6a,_0x1a2eb4=_0x44a6['eedDhC'][_0x459421];return!_0x1a2eb4?(_0x44a6c3=_0x44a6['HphDix'](_0x44a6c3),_0x44a6['eedDhC'][_0x459421]=_0x44a6c3):_0x44a6c3=_0x1a2eb4,_0x44a6c3;}function _0x2ab155(_0x218ad6,_0x270a99){return _0x44a6(_0x218ad6-0x367,_0x270a99);}const DEFAULT_PAGE_SIZE=0x64;export class MemorySynchronizer{['db'];[_0x2ab155(0x4ea,0x4c9)];[_0x20d00e(0x1c8,0x1c8)];['nodeId'];[_0x20d00e(0x21b,0x206)];[_0x2ab155(0x50f,0x53a)]=0x0;[_0x20d00e(0x20f,0x20f)+'eAt']=0x0;['maxFailure'+'s']=0x3;[_0x20d00e(0x1e2,0x1dd)]=0x7530;constructor(_0x384cd2,_0x11b02b,_0xe70bd0,_0x485048){function _0x3126c4(_0x382278,_0x38631f){return _0x20d00e(_0x382278,_0x38631f- -0x322);}this['db']=_0x384cd2,this[_0x3126c4(-0x14c,-0x13c)]=_0x11b02b,this['teamPath']=_0xe70bd0;function _0x33f473(_0x1b214c,_0x189dc2){return _0x20d00e(_0x189dc2,_0x1b214c-0x5d);}this[_0x33f473(0x249,0x23c)]=_0x485048,this[_0x3126c4(-0x12e,-0x11c)]=new SyncQueue(_0x384cd2,_0x11b02b);}['isCircuitO'+_0x20d00e(0x20d,0x207)](){const _0x115165={'pDKQz':function(_0x5483cd,_0x2c3abc){return _0x5483cd-_0x2c3abc;}};function _0x2b6cfb(_0x2a76b1,_0x2f08bf){return _0x2ab155(_0x2f08bf- -0x485,_0x2a76b1);}if(this[_0x3ec984(0xcb,0xf5)]<this[_0x2b6cfb(0x4e,0x4f)+'s'])return![];function _0x3ec984(_0x994d56,_0x399fe2){return _0x2ab155(_0x994d56- -0x444,_0x399fe2);}return _0x115165['pDKQz'](Date[_0x3ec984(0x86,0x7e)](),this[_0x3ec984(0xcf,0xc7)+'eAt'])<this['cooldownMs'];}[_0x2ab155(0x50e,0x4e4)+_0x2ab155(0x51b,0x517)](){this['failures']=0x0;}[_0x20d00e(0x1c6,0x1c7)+_0x20d00e(0x209,0x208)](){this[_0x340e59(0x535,0x562)]++;function _0x37f148(_0x4715ae,_0x222fd0){return _0x20d00e(_0x4715ae,_0x222fd0-0x2b1);}function _0x340e59(_0x3f46fa,_0x413083){return _0x20d00e(_0x3f46fa,_0x413083-0x357);}this['lastFailur'+_0x37f148(0x47f,0x4a4)]=Date['now']();}async[_0x2ab155(0x4da,0x4fc)](){if(this[_0xf12d39(-0xa1,-0xa8)]&&this[_0xfa411f(0x33d,0x315)]){const _0x33d316=new TeamSynchronizer(this['db'],this[_0xfa411f(0x303,0x30f)],this[_0xf12d39(-0x8e,-0xa8)],this[_0xf12d39(-0x84,-0x84)]),_0x1eb498=await _0x33d316[_0xfa411f(0x310,0x2ec)]();return{'pushed':_0x1eb498[_0xf12d39(-0x6a,-0x6c)],'pulled':_0x1eb498['pulled'],'conflicts':_0x1eb498['conflicts'],'errors':_0x1eb498['errors'],'duration':_0x1eb498[_0xf12d39(-0x51,-0x7c)]};}function _0xf12d39(_0x175507,_0x19cec7){return _0x2ab155(_0x19cec7- -0x574,_0x175507);}function _0xfa411f(_0x5f2edb,_0x4b1b11){return _0x2ab155(_0x4b1b11- -0x1db,_0x5f2edb);}return this[_0xf12d39(-0x81,-0x9d)]();}async['syncLocal'](){const _0x580d22={'goCyS':function(_0x218118,_0x261435){return _0x218118===_0x261435;},'ntrjU':_0x50d0bb(0x252,0x232),'GziLZ':_0x50d0bb(0x201,0x20b)};function _0x3af1e2(_0x3d1c4e,_0x24366a){return _0x2ab155(_0x3d1c4e- -0x368,_0x24366a);}function _0x50d0bb(_0x5906d3,_0x9d65f1){return _0x2ab155(_0x9d65f1- -0x2d4,_0x5906d3);}const _0x3ef265=Date[_0x3af1e2(0x162,0x150)](),_0x49c765={'pushed':0x0,'pulled':0x0,'conflicts':0x0,'errors':[],'duration':0x0};try{if(_0x580d22[_0x50d0bb(0x1ef,0x1f4)]('fwzNo',_0x580d22[_0x50d0bb(0x212,0x1fd)])){const _0x1cc922=await this['push']();_0x49c765[_0x50d0bb(0x208,0x234)]=_0x1cc922[_0x3af1e2(0x1a0,0x185)],_0x49c765[_0x3af1e2(0x161,0x174)][_0x50d0bb(0x24a,0x226)](..._0x1cc922[_0x50d0bb(0x1d5,0x1f5)]);const _0x280de2=await this[_0x50d0bb(0x1f5,0x209)]();_0x49c765[_0x3af1e2(0x194,0x190)]=_0x280de2[_0x3af1e2(0x194,0x1a0)],_0x49c765[_0x3af1e2(0x16e,0x145)]=_0x280de2[_0x50d0bb(0x209,0x202)],_0x49c765['errors'][_0x50d0bb(0x1fd,0x226)](..._0x280de2[_0x3af1e2(0x161,0x183)]);}else{const _0x25d61c=_0x158b5a['parent_id']?0x1:0x0,_0x347c49=_0x164748[_0x50d0bb(0x212,0x21b)]?0x1:0x0;return _0x25d61c-_0x347c49;}}catch(_0x415a74){_0x415a74 instanceof Error&&(_0x580d22[_0x50d0bb(0x21a,0x213)]!==_0x580d22[_0x50d0bb(0x217,0x213)]?_0x2f2f4b[_0x50d0bb(0x200,0x1f5)]['push'](_0x2e2f43[_0x3af1e2(0x19c,0x1c3)]):_0x49c765[_0x3af1e2(0x161,0x168)]['push'](_0x415a74[_0x50d0bb(0x223,0x230)]));}return _0x49c765[_0x3af1e2(0x190,0x170)]=Date[_0x3af1e2(0x162,0x181)]()-_0x3ef265,_0x49c765;}async[_0x20d00e(0x1d9,0x1f6)](_0x3dd7a0){const _0x596871={'DhbzD':_0x591c8d(0x181,0x16c)+_0x591c8d(0x161,0x159)+_0xe7d91a(-0xf7,-0xfa)+'\x20consecuti'+_0xe7d91a(-0x112,-0x10d)+'s','GsYFi':function(_0x1b578b,_0x109c23){return _0x1b578b>_0x109c23;},'EdmPZ':function(_0x219c42,_0x5112f4){return _0x219c42-_0x5112f4;}};if(this[_0x591c8d(0x16a,0x163)+_0x591c8d(0x183,0x182)]())return{'pushed':0x0,'pulled':0x0,'conflicts':0x0,'errors':[_0x596871[_0x591c8d(0x14a,0x123)]],'duration':0x0};const _0x5f832d=Date[_0x591c8d(0x142,0x13f)]();function _0xe7d91a(_0x3bd20a,_0x305dde){return _0x20d00e(_0x305dde,_0x3bd20a- -0x2f1);}function _0x591c8d(_0x558eab,_0x2699ac){return _0x20d00e(_0x2699ac,_0x558eab- -0x84);}try{const _0x16bb6e=await this[_0x591c8d(0x182,0x16b)][_0xe7d91a(-0xf3,-0x103)]({'timeoutMs':_0x3dd7a0?.[_0x591c8d(0x151,0x175)]}),_0x84c109=await this[_0x591c8d(0x182,0x1a0)][_0xe7d91a(-0x11a,-0x12d)+_0xe7d91a(-0x10f,-0xf1)](),_0x5d7293=[..._0x16bb6e[_0xe7d91a(-0x12c,-0x12f)],..._0x84c109[_0x591c8d(0x141,0x15b)]];return _0x596871['GsYFi'](_0x5d7293[_0x591c8d(0x150,0x17d)],0x0)?this['recordFail'+_0xe7d91a(-0xe9,-0x10f)]():this[_0x591c8d(0x186,0x15b)+_0x591c8d(0x193,0x1ac)](),{'pushed':_0x16bb6e[_0x591c8d(0x180,0x167)],'pulled':_0x84c109[_0x591c8d(0x16b,0x16d)],'conflicts':0x0,'errors':_0x5d7293,'duration':_0x596871[_0xe7d91a(-0x115,-0x141)](Date[_0x591c8d(0x142,0x15a)](),_0x5f832d)};}catch(_0x1a9841){this[_0x591c8d(0x143,0x145)+_0xe7d91a(-0xe9,-0x100)]();throw _0x1a9841;}}async[_0x20d00e(0x1e4,0x1d9)](){const _0x2d2257={'HhxsO':function(_0x4ae5a2,_0x2b14f6){return _0x4ae5a2===_0x2b14f6;},'IgSSC':_0x4190d5(0x3b4,0x3d8),'rvTKz':function(_0x40451f,_0x518f1b){return _0x40451f(_0x518f1b);},'RFBZp':_0x4190d5(0x3de,0x400),'XKhIv':'synced','sVAPo':function(_0x2ffc31,_0xfb5a64){return _0x2ffc31>_0xfb5a64;},'stwAY':'QWBEe','OOvLp':function(_0xc6ddc9,_0x1250a6){return _0xc6ddc9<_0x1250a6;},'FrFqS':function(_0x28bd3e,_0x43a794){return _0x28bd3e instanceof _0x43a794;}};if(this[_0x4190d5(0x3b2,0x3bc)+'pen']()){if(_0x58b543(-0x10b,-0xe0)===_0x58b543(-0x10b,-0x123))return{'pushed':0x0,'pulled':0x0,'conflicts':0x0,'errors':[_0x4190d5(0x3c9,0x3be)+_0x4190d5(0x3a9,0x3ca)+_0x4190d5(0x3be,0x3a3)+_0x4190d5(0x3ae,0x382)+_0x4190d5(0x3a3,0x3c8)+'s'],'duration':0x0};else _0x1e2cfd[_0x4190d5(0x389,0x368)][_0x58b543(-0xf3,-0x105)]('메모리\x20'+_0x3195bf['id']+_0x4190d5(0x3d5,0x3af)+_0x23cdd9['message']);}const _0x195924=Date[_0x58b543(-0x123,-0x12f)]();function _0x4190d5(_0x14390c,_0x544f9a){return _0x20d00e(_0x544f9a,_0x14390c-0x1c4);}const _0x4bf93a={'pushed':0x0,'pulled':0x0,'conflicts':0x0,'errors':[],'duration':0x0};try{let _0x44beb5=0x0,_0x3c9b98=!![];while(_0x3c9b98){const _0x327523=await this[_0x58b543(-0x103,-0x11c)][_0x58b543(-0x111,-0x11c)+'es']({'limit':DEFAULT_PAGE_SIZE,'offset':_0x44beb5,'includeEmbedding':!![]});if(_0x2d2257['HhxsO'](_0x327523[_0x58b543(-0x115,-0x10b)],0x0)){_0x3c9b98=![];break;}_0x327523['sort']((_0x14a180,_0x456fe9)=>{function _0x5c2edd(_0x3c3db2,_0x34c5dd){return _0x58b543(_0x34c5dd-0x188,_0x3c3db2);}const _0x32d060=_0x14a180[_0x5c2edd(0x96,0x8a)]?0x1:0x0;function _0x29a1b3(_0x501572,_0x55dd5f){return _0x58b543(_0x501572-0x47d,_0x55dd5f);}const _0x2f946e=_0x456fe9[_0x5c2edd(0x87,0x8a)]?0x1:0x0;return _0x32d060-_0x2f946e;});for(const _0x58c359 of _0x327523){try{const _0x526751=this['db'][_0x58b543(-0x120,-0xff)+_0x4190d5(0x3d7,0x3ab)](_0x58c359['id']);if(!_0x526751){if(_0x2d2257[_0x4190d5(0x38e,0x3a4)]!==_0x58b543(-0x11e,-0x13a)){const _0xc6b963=this['db']['createMemo'+'ry']({'content':_0x58c359['content'],'category':mapCategory(_0x58c359[_0x58b543(-0x118,-0x11c)]),'tier':_0x2d2257['rvTKz'](mapTier,_0x58c359['tier']??_0x2d2257[_0x58b543(-0xea,-0xe5)]),'tags':_0x58c359[_0x4190d5(0x390,0x3bd)]??[],'parentId':_0x58c359[_0x4190d5(0x3af,0x3b6)]??undefined,'chunkIndex':_0x58c359[_0x58b543(-0xfc,-0xf2)+'x']??undefined,'chunkTotal':_0x58c359[_0x58b543(-0xe8,-0x107)+'l']??undefined});_0x58c359['embedding']&&_0x58c359[_0x58b543(-0x105,-0xdf)][_0x4190d5(0x398,0x3a0)]>0x0&&this['db'][_0x58b543(-0xe6,-0xe8)+'ing'](_0xc6b963['id'],_0x58c359['embedding']),this['db'][_0x4190d5(0x3b9,0x3ad)+_0x4190d5(0x3bf,0x3bf)](_0xc6b963['id'],_0x58c359['id'],_0x2d2257[_0x58b543(-0xd4,-0xc2)]),_0x4bf93a[_0x4190d5(0x3bc,0x3ac)]++;}else _0x35e9a5 instanceof _0x239d76&&_0x30a8ef[_0x4190d5(0x389,0x3b2)]['push'](_0x38f433[_0x4190d5(0x3c4,0x3be)]);}else{const _0x3c017c=new Date(_0x58c359['updated_at']),_0xe9dfac=new Date(_0x526751[_0x4190d5(0x3c0,0x3a7)]);_0x2d2257[_0x58b543(-0x100,-0xf7)](_0x3c017c,_0xe9dfac)&&(_0x2d2257[_0x4190d5(0x3cd,0x3b4)](_0x2d2257[_0x58b543(-0xd1,-0xcf)],'QWBEe')?(this['db']['updateMemo'+'ry'](_0x526751['id'],{'content':_0x58c359['content'],'category':mapCategory(_0x58c359[_0x58b543(-0x118,-0x131)]),'tier':mapTier(_0x58c359[_0x4190d5(0x3df,0x3dc)]??_0x526751[_0x58b543(-0xce,-0xb0)]),'tags':_0x58c359[_0x58b543(-0x11d,-0x147)]??_0x526751[_0x4190d5(0x390,0x37f)]}),_0x58c359[_0x58b543(-0x105,-0xee)]&&_0x58c359[_0x4190d5(0x3a8,0x39b)][_0x58b543(-0x115,-0xed)]>0x0&&(_0x4190d5(0x3ac,0x3b2)!=='WatHd'?_0x2084e9['errors'][_0x4190d5(0x3ba,0x3a5)](_0x5831a0[_0x4190d5(0x3c4,0x3af)]):this['db']['saveEmbedd'+_0x4190d5(0x3b5,0x38d)](_0x526751['id'],_0x58c359[_0x58b543(-0x105,-0x109)])),this['db']['setSyncSta'+_0x58b543(-0xee,-0xe0)](_0x526751['id'],_0x58c359['id'],_0x58b543(-0x102,-0xeb)),_0x4bf93a['conflicts']++):(this['db']=_0x41bce7,this[_0x58b543(-0x103,-0x12b)]=_0x1d7d1d,this['teamPath']=_0x261b9c,this['nodeId']=_0x4ae5b8,this['queue']=new _0x55eea1(_0xdaf8bb,_0x2a1ba1)));}}catch(_0x1b64c6){_0x1b64c6 instanceof Error&&_0x4bf93a[_0x58b543(-0x124,-0x120)][_0x58b543(-0xf3,-0x10b)](_0x58b543(-0xcd,-0xac)+_0x58c359['id']+_0x4190d5(0x3d5,0x3d7)+_0x1b64c6[_0x4190d5(0x3c4,0x3bd)]);}}_0x2d2257['OOvLp'](_0x327523[_0x4190d5(0x398,0x36d)],DEFAULT_PAGE_SIZE)?_0x3c9b98=![]:_0x44beb5+=DEFAULT_PAGE_SIZE;}this['recordSucc'+_0x4190d5(0x3db,0x406)]();}catch(_0x2a3422){this[_0x4190d5(0x38b,0x388)+_0x58b543(-0xe1,-0xc7)](),_0x2d2257[_0x4190d5(0x3bb,0x391)](_0x2a3422,Error)&&_0x4bf93a[_0x4190d5(0x389,0x383)][_0x58b543(-0xf3,-0x103)](_0x2a3422[_0x4190d5(0x3c4,0x3b7)]);}function _0x58b543(_0x5d2c25,_0x4f64eb){return _0x20d00e(_0x4f64eb,_0x5d2c25- -0x2e9);}return _0x4bf93a[_0x58b543(-0xf5,-0x11e)]=Date['now']()-_0x195924,_0x4bf93a;}async[_0x20d00e(0x21b,0x1fd)](){const _0x18fa7f={'xSGSs':function(_0x17c473,_0x8d8a59){return _0x17c473-_0x8d8a59;},'COgXz':function(_0x2fd0bd,_0xc1f763){return _0x2fd0bd??_0xc1f763;}},_0x5d244a=this[_0x209550(0x2c9,0x2ea)][_0x209550(0x320,0x2fa)+'Count']();let _0x146171=0x0;try{const _0xbea33e=await this['client']['listMemori'+'es']({'limit':0x2710}),_0x3babd1=this['db'][_0x359770(0x10a,0x10c)+'emoryCount']();_0x146171=Math['max'](0x0,_0x18fa7f[_0x359770(0xff,0x121)](_0xbea33e[_0x209550(0x2bc,0x2b8)],_0x3babd1));}catch{}function _0x359770(_0x38d348,_0x1582ee){return _0x2ab155(_0x1582ee- -0x3f1,_0x38d348);}const _0x20a071=this['db'][_0x359770(0x103,0xed)+'cedAt']();function _0x209550(_0x3d8b95,_0x2c8e37){return _0x2ab155(_0x2c8e37- -0x220,_0x3d8b95);}return{'pendingPush':_0x5d244a,'pendingPull':_0x146171,'lastSyncedAt':_0x18fa7f[_0x209550(0x2de,0x2c5)](_0x20a071,undefined)};}}
|
|
@@ -1,204 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Team Synchronizer
|
|
3
|
-
* 팀 메모리 풀과의 delta 동기화
|
|
4
|
-
*/
|
|
5
|
-
import { LocalVectorClock } from './vector-clock.js';
|
|
6
|
-
import { mapCategory, mapTier } from './queue.js';
|
|
7
|
-
const PAGE_SIZE = 100;
|
|
8
|
-
export class TeamSynchronizer {
|
|
9
|
-
db;
|
|
10
|
-
client;
|
|
11
|
-
teamPath;
|
|
12
|
-
nodeId;
|
|
13
|
-
constructor(db, client, teamPath, nodeId) {
|
|
14
|
-
this.db = db;
|
|
15
|
-
this.client = client;
|
|
16
|
-
this.teamPath = teamPath;
|
|
17
|
-
this.nodeId = nodeId;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* 전체 delta sync 사이클 (push + pull)
|
|
21
|
-
*/
|
|
22
|
-
async syncDelta() {
|
|
23
|
-
const startTime = Date.now();
|
|
24
|
-
const result = { pushed: 0, pulled: 0, conflicts: 0, errors: [], duration: 0 };
|
|
25
|
-
try {
|
|
26
|
-
// E-3: Capability 검증 — 서버 연결 확인 후 push
|
|
27
|
-
const connected = await this.client.testConnection();
|
|
28
|
-
if (!connected) {
|
|
29
|
-
result.errors.push('서버 연결 실패: push 건너뜀');
|
|
30
|
-
result.duration = Date.now() - startTime;
|
|
31
|
-
return result;
|
|
32
|
-
}
|
|
33
|
-
// E-3: tombstoned 메모리 ID 수집 (push 건너뛸 대상)
|
|
34
|
-
const tombstoneIds = new Set(this.db.getUnsyncedTombstones().map((t) => t.memoryId));
|
|
35
|
-
// Push: 로컬 pending → 팀
|
|
36
|
-
const pending = this.db.getPendingSyncMemories();
|
|
37
|
-
for (const memory of pending) {
|
|
38
|
-
// E-3: tombstone된 메모리 skip
|
|
39
|
-
if (tombstoneIds.has(memory.id))
|
|
40
|
-
continue;
|
|
41
|
-
try {
|
|
42
|
-
const clock = new LocalVectorClock(this.nodeId, this.db.getVectorClock(memory.id) ?? undefined);
|
|
43
|
-
clock.increment();
|
|
44
|
-
await this.client.addTeamMemory(this.teamPath, {
|
|
45
|
-
content: memory.content,
|
|
46
|
-
category: memory.category,
|
|
47
|
-
tier: memory.tier,
|
|
48
|
-
tags: memory.tags,
|
|
49
|
-
});
|
|
50
|
-
this.db.saveVectorClock(memory.id, clock.toJSON());
|
|
51
|
-
this.db.setSyncStatus(memory.id, null, 'synced');
|
|
52
|
-
this.db.addSyncHistory('push', memory.id, 'success');
|
|
53
|
-
result.pushed++;
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
57
|
-
this.db.addSyncHistory('push', memory.id, 'failed', msg);
|
|
58
|
-
result.errors.push(`Push failed for ${memory.id}: ${msg}`);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
// Pull: 팀 → 로컬
|
|
62
|
-
const pullResult = await this.pullFromTeam();
|
|
63
|
-
result.pulled = pullResult.pulled;
|
|
64
|
-
result.conflicts = pullResult.conflicts;
|
|
65
|
-
}
|
|
66
|
-
catch (error) {
|
|
67
|
-
result.errors.push(error instanceof Error ? error.message : String(error));
|
|
68
|
-
}
|
|
69
|
-
result.duration = Date.now() - startTime;
|
|
70
|
-
return result;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* 지정 메모리를 팀에 push
|
|
74
|
-
*/
|
|
75
|
-
async pushToTeam(memoryIds) {
|
|
76
|
-
// E-3: Capability 검증
|
|
77
|
-
const connected = await this.client.testConnection();
|
|
78
|
-
if (!connected) {
|
|
79
|
-
throw new Error('서버 연결 실패: push 불가');
|
|
80
|
-
}
|
|
81
|
-
for (const id of memoryIds) {
|
|
82
|
-
const memory = this.db.getMemory(id);
|
|
83
|
-
if (!memory)
|
|
84
|
-
continue;
|
|
85
|
-
const clock = new LocalVectorClock(this.nodeId, this.db.getVectorClock(id) ?? undefined);
|
|
86
|
-
clock.increment();
|
|
87
|
-
await this.client.addTeamMemory(this.teamPath, {
|
|
88
|
-
content: memory.content,
|
|
89
|
-
category: memory.category,
|
|
90
|
-
tier: memory.tier,
|
|
91
|
-
tags: memory.tags,
|
|
92
|
-
});
|
|
93
|
-
this.db.saveVectorClock(id, clock.toJSON());
|
|
94
|
-
this.db.setSyncStatus(id, null, 'synced');
|
|
95
|
-
this.db.addSyncHistory('push', id, 'success');
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* 팀 → 로컬 pull (VectorClock 기반 충돌 감지)
|
|
100
|
-
*/
|
|
101
|
-
async pullFromTeam() {
|
|
102
|
-
let pulled = 0;
|
|
103
|
-
let conflicts = 0;
|
|
104
|
-
let offset = 0;
|
|
105
|
-
// 무한 루프 방어: 최대 1000 페이지 (100k 메모리)
|
|
106
|
-
const MAX_PAGES = 1000;
|
|
107
|
-
let pageCount = 0;
|
|
108
|
-
while (pageCount < MAX_PAGES) {
|
|
109
|
-
pageCount++;
|
|
110
|
-
const remoteMemories = await this.client.listTeamMemories(this.teamPath, {
|
|
111
|
-
limit: PAGE_SIZE,
|
|
112
|
-
offset,
|
|
113
|
-
});
|
|
114
|
-
if (remoteMemories.length === 0)
|
|
115
|
-
break;
|
|
116
|
-
for (const remote of remoteMemories) {
|
|
117
|
-
const existing = this.db.findMemoryByRemoteId(remote.id);
|
|
118
|
-
if (!existing) {
|
|
119
|
-
// 새 메모리 생성
|
|
120
|
-
const created = this.db.createMemory({
|
|
121
|
-
content: remote.content,
|
|
122
|
-
category: mapCategory(remote.category),
|
|
123
|
-
tier: mapTier(remote.tier ?? 'episodic'),
|
|
124
|
-
tags: remote.tags ?? [],
|
|
125
|
-
});
|
|
126
|
-
if (remote.embedding && remote.embedding.length > 0) {
|
|
127
|
-
this.db.saveEmbedding(created.id, remote.embedding);
|
|
128
|
-
}
|
|
129
|
-
this.db.setSyncStatus(created.id, remote.id, 'synced');
|
|
130
|
-
this.db.addSyncHistory('pull', created.id, 'success');
|
|
131
|
-
pulled++;
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
// 기존 메모리 발견 → VectorClock 비교
|
|
135
|
-
const localClockState = this.db.getVectorClock(existing.id) ?? {};
|
|
136
|
-
const localClock = new LocalVectorClock(this.nodeId, localClockState);
|
|
137
|
-
const remoteClockState = remote.vector_clock ?? {};
|
|
138
|
-
const comparison = localClock.compare(remoteClockState);
|
|
139
|
-
if (comparison === 'before') {
|
|
140
|
-
// remote가 newer → 업데이트
|
|
141
|
-
this.db.updateMemory(existing.id, {
|
|
142
|
-
content: remote.content,
|
|
143
|
-
category: mapCategory(remote.category),
|
|
144
|
-
tier: mapTier(remote.tier ?? existing.tier),
|
|
145
|
-
tags: remote.tags ?? existing.tags,
|
|
146
|
-
});
|
|
147
|
-
if (remote.embedding && remote.embedding.length > 0) {
|
|
148
|
-
this.db.saveEmbedding(existing.id, remote.embedding);
|
|
149
|
-
}
|
|
150
|
-
// clock merge
|
|
151
|
-
localClock.merge(remoteClockState);
|
|
152
|
-
this.db.saveVectorClock(existing.id, localClock.toJSON());
|
|
153
|
-
this.db.setSyncStatus(existing.id, remote.id, 'synced');
|
|
154
|
-
this.db.addSyncHistory('pull', existing.id, 'success');
|
|
155
|
-
pulled++;
|
|
156
|
-
}
|
|
157
|
-
else if (comparison === 'concurrent') {
|
|
158
|
-
// 동시 수정 → LWW (updated_at 기준)
|
|
159
|
-
const remoteUpdated = new Date(remote.updated_at);
|
|
160
|
-
const localUpdated = new Date(existing.updatedAt);
|
|
161
|
-
if (remoteUpdated > localUpdated) {
|
|
162
|
-
this.db.updateMemory(existing.id, {
|
|
163
|
-
content: remote.content,
|
|
164
|
-
category: mapCategory(remote.category),
|
|
165
|
-
tier: mapTier(remote.tier ?? existing.tier),
|
|
166
|
-
tags: remote.tags ?? existing.tags,
|
|
167
|
-
});
|
|
168
|
-
if (remote.embedding && remote.embedding.length > 0) {
|
|
169
|
-
this.db.saveEmbedding(existing.id, remote.embedding);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
// 항상 clock merge (양쪽 변경 반영)
|
|
173
|
-
localClock.merge(remoteClockState);
|
|
174
|
-
this.db.saveVectorClock(existing.id, localClock.toJSON());
|
|
175
|
-
this.db.setSyncStatus(existing.id, remote.id, 'synced');
|
|
176
|
-
this.db.addSyncHistory('conflict', existing.id, 'success', 'LWW resolution');
|
|
177
|
-
conflicts++;
|
|
178
|
-
}
|
|
179
|
-
// 'after' | 'equal' → 로컬이 최신이거나 같음, skip
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
if (remoteMemories.length < PAGE_SIZE)
|
|
183
|
-
break;
|
|
184
|
-
offset += PAGE_SIZE;
|
|
185
|
-
}
|
|
186
|
-
return { pulled, conflicts };
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* 팀 동기화 상태
|
|
190
|
-
*/
|
|
191
|
-
async getTeamStatus() {
|
|
192
|
-
const stats = this.db.getStats();
|
|
193
|
-
const pendingSync = this.db.getPendingSyncMemories().length;
|
|
194
|
-
const lastSyncedAt = this.db.getLastSyncedAt();
|
|
195
|
-
return {
|
|
196
|
-
teamPath: this.teamPath,
|
|
197
|
-
nodeId: this.nodeId,
|
|
198
|
-
localMemoryCount: stats.totalMemories,
|
|
199
|
-
pendingSync,
|
|
200
|
-
lastSyncedAt: lastSyncedAt ?? undefined,
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
//# sourceMappingURL=team-synchronizer.js.map
|
|
1
|
+
(function(_0x374eeb,_0x4ccdff){function _0x45e782(_0x12da12,_0x43782a){return _0x292c(_0x43782a- -0x12c,_0x12da12);}function _0xb21998(_0x55e814,_0x2b9e1e){return _0x292c(_0x55e814- -0x10e,_0x2b9e1e);}const _0x791e46=_0x374eeb();while(!![]){try{const _0x5b0f2f=-parseInt(_0xb21998(-0x7b,-0xa9))/0x1*(parseInt(_0x45e782(-0xb7,-0xad))/0x2)+-parseInt(_0xb21998(-0x32,-0xe))/0x3*(parseInt(_0xb21998(-0x5c,-0x55))/0x4)+parseInt(_0xb21998(-0x31,-0x5))/0x5+-parseInt(_0xb21998(-0x49,-0x16))/0x6*(-parseInt(_0xb21998(-0x35,-0x62))/0x7)+parseInt(_0x45e782(-0x75,-0xaa))/0x8*(-parseInt(_0x45e782(-0x8c,-0x75))/0x9)+parseInt(_0x45e782(-0x9d,-0x73))/0xa*(parseInt(_0xb21998(-0x5d,-0x47))/0xb)+parseInt(_0x45e782(-0x6a,-0x6a))/0xc*(parseInt(_0xb21998(-0x92,-0x60))/0xd);if(_0x5b0f2f===_0x4ccdff)break;else _0x791e46['push'](_0x791e46['shift']());}catch(_0x3bc521){_0x791e46['push'](_0x791e46['shift']());}}}(_0x5702,0x20dc3));import{LocalVectorClock}from'./vector-clock.js';function _0x155478(_0x182bd8,_0x33cd56){return _0x292c(_0x182bd8- -0x1c2,_0x33cd56);}function _0x3c8e84(_0x96be52,_0x3f5c18){return _0x292c(_0x96be52- -0x25c,_0x3f5c18);}function _0x292c(_0x37c2ed,_0x3e765d){_0x37c2ed=_0x37c2ed-0x75;const _0x570210=_0x5702();let _0x292cbe=_0x570210[_0x37c2ed];if(_0x292c['NEPGVI']===undefined){var _0x57216d=function(_0x1a359b){const _0x318764='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x2d4ef2='',_0x57b0ff='';for(let _0x11681b=0x0,_0x419990,_0x166be6,_0x2656fa=0x0;_0x166be6=_0x1a359b['charAt'](_0x2656fa++);~_0x166be6&&(_0x419990=_0x11681b%0x4?_0x419990*0x40+_0x166be6:_0x166be6,_0x11681b++%0x4)?_0x2d4ef2+=String['fromCharCode'](0xff&_0x419990>>(-0x2*_0x11681b&0x6)):0x0){_0x166be6=_0x318764['indexOf'](_0x166be6);}for(let _0x34ffc8=0x0,_0x330f98=_0x2d4ef2['length'];_0x34ffc8<_0x330f98;_0x34ffc8++){_0x57b0ff+='%'+('00'+_0x2d4ef2['charCodeAt'](_0x34ffc8)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x57b0ff);};_0x292c['pFqcfr']=_0x57216d,_0x292c['csXabh']={},_0x292c['NEPGVI']=!![];}const _0x33969e=_0x570210[0x0],_0x234963=_0x37c2ed+_0x33969e,_0x4229b7=_0x292c['csXabh'][_0x234963];return!_0x4229b7?(_0x292cbe=_0x292c['pFqcfr'](_0x292cbe),_0x292c['csXabh'][_0x234963]=_0x292cbe):_0x292cbe=_0x4229b7,_0x292cbe;}import{mapCategory,mapTier}from'./queue.js';function _0x5702(){const _0x454ac1=['Dwz1t3e','zMfPBgvK','C2f2zvzLy3rVCG','DgvHBvbHDgG','C2v0u3LUy1n0yq','y29UDgvUDa','wKzKqvm','vMvyru8','EwrYs2i','qNLszw1VDgvjza','7isC67keioYxSoQYScdSI6tTJkG6ia','C3LUy2vK','q2XVy2S','z2v0ugvUzgLUzW','Dg9ku09o','C3bSAxq','ChvZAgvK','wKz5BNa','z3rXrMi','BwfW','ywrKvgvHBu1LBq','ChvZAcdRTOJQSia','z2v0vMvJDg9YqW','ChvSBgvK','ChvSBezYB21uzq','C0z5Axq','zw1IzwrKAw5N','DxbKyxrLtwvTBW','ota4nZfXue1cz24','nePeA0DLvq','tfDxihjLC29SDq','zhvYyxrPB24','B3j5','ChvZAa','mtm1mJDwAuPrugO','zxbPC29KAwm','mJKWvvr4zMDY','u2DjqKq','CLvjr0i','BM93','z2v0vgvHBvn0yq','zfrVBwjZDg9Uzq','Dg9YEq','y29TCgfYzq','C3vJy2vZCW','mZzWBLL1yvu','zxjYB3jZ','sg10z0W','nML1CKvjBa','qMntqum','DxbKyxrLzef0','yLjAtM4','z2v0vw5ZEw5Jzq','Awv1ANG','BuDXvLu','yNn5yxm','zMLUze1LBw9YEq','zcbMB3iG','Dg90ywXnzw1VCG','ANbAuNC','ywrKu3LUy0HPCW','DgfNCW','DNfcq0K','Bw9YAwvZ','Aw5N','u3LUy01LBw9YAq','qKXUr3a','C3LUy0rLBhrH','mtu5nJK4tLvkAg10','v1PPBxK','AgfZ','mte4otGZAKrqEeTd','ndmYmZmWrxD0z09c','AwvZ','sLzmA0u','s1LMDe8','z2v0twvTB3j5','BNfXDfe','ChvZAcdQSBtRHiJRNia','BM9KzuLK','DhvZ','zeXMwei','BwvZC2fNzq','y2f0zwDVCNK','mteXndK5n3H0AhjvvG','CxDNru0','DwThr28','mKz4zeziDa','vxvywxe','DgvZDenVBM5LyW','mte0nhLTEKnzvW','A3n4tgK','uK9RAu4','uhvZAcbMywLSzq','txD1uKq','y3jLyxrLtwvTBW','y2XPzw50','DgLVBG','DgLLCG','wK5pBve','Aw5JCMvTzw50','BgvUz3rO','qw5ts00','z2v0tgfZDfn5BG','C2f2zuvTyMvKza','Bg9JAW','ChvSBa','mJe2otCXC0PqsgrJ','BwvYz2u'];_0x5702=function(){return _0x454ac1;};return _0x5702();}const PAGE_SIZE=0x64;export class TeamSynchronizer{['db'];['client'];[_0x3c8e84(-0x1c4,-0x1eb)];['nodeId'];constructor(_0x40482e,_0x1b8952,_0x3bdd1a,_0x1cff0f){function _0x31b950(_0x7a9bd9,_0x48e07f){return _0x3c8e84(_0x48e07f-0x2ad,_0x7a9bd9);}this['db']=_0x40482e,this['client']=_0x1b8952;function _0x2fd1ad(_0xdc6b38,_0x5a422a){return _0x3c8e84(_0x5a422a-0x430,_0xdc6b38);}this[_0x2fd1ad(0x245,0x26c)]=_0x3bdd1a,this[_0x2fd1ad(0x214,0x24b)]=_0x1cff0f;}async[_0x3c8e84(-0x184,-0x17e)](){const _0x5a2db6={'jZuyO':function(_0x4420e7,_0x177844){return _0x4420e7(_0x177844);},'BLnGp':function(_0x5ec137,_0x51f657){return _0x5ec137(_0x51f657);},'gtqFb':function(_0x1cb5b7,_0x2a8316){return _0x1cb5b7>_0x2a8316;},'FYsGK':_0x1e6732(-0x327,-0x31c)+_0x1e6732(-0x350,-0x34a),'VeXEO':function(_0x21f641,_0x516429){return _0x21f641-_0x516429;},'txZJQ':'synced','qwgEM':function(_0x86f9fa,_0x258885){return _0x86f9fa instanceof _0x258885;},'ksxLi':_0x1e6732(-0x310,-0x331),'jpZRw':_0x1e6732(-0x2fe,-0x331)},_0xf901c9=Date[_0x1e6732(-0x30a,-0x2da)](),_0x161d90={'pushed':0x0,'pulled':0x0,'conflicts':0x0,'errors':[],'duration':0x0};function _0x404a74(_0x1c5dba,_0x54b106){return _0x155478(_0x54b106- -0x1d0,_0x1c5dba);}try{if('sFyit'!==_0x1e6732(-0x318,-0x312))this['db'][_0x1e6732(-0x336,-0x341)+_0x1e6732(-0x2f1,-0x2f9)](_0x542814['id'],_0x539005['embedding']);else{const _0x176059=await this[_0x404a74(-0x2e2,-0x30a)][_0x404a74(-0x2dc,-0x311)+_0x404a74(-0x2da,-0x309)]();if(!_0x176059){if(_0x404a74(-0x342,-0x314)!==_0x1e6732(-0x348,-0x32e))this['db']['saveEmbedd'+'ing'](_0x5b9b86['id'],_0x248548[_0x1e6732(-0x317,-0x334)]);else return _0x161d90[_0x1e6732(-0x303,-0x31b)][_0x404a74(-0x2b2,-0x2dc)](_0x5a2db6['FYsGK']),_0x161d90[_0x404a74(-0x2c5,-0x2de)]=_0x5a2db6[_0x404a74(-0x2f2,-0x2f6)](Date[_0x1e6732(-0x30a,-0x2fa)](),_0xf901c9),_0x161d90;}const _0x3a19c5=new Set(this['db'][_0x1e6732(-0x2fd,-0x2cd)+_0x404a74(-0x2f7,-0x2d4)+'s']()[_0x404a74(-0x2bc,-0x2ea)](_0x5b6c87=>_0x5b6c87['memoryId'])),_0x47056d=this['db'][_0x404a74(-0x2f0,-0x2f0)+_0x404a74(-0x29f,-0x2bc)+'es']();for(const _0x5e648d of _0x47056d){if(_0x3a19c5[_0x1e6732(-0x2eb,-0x30b)](_0x5e648d['id']))continue;try{const _0x38ff53=new LocalVectorClock(this['nodeId'],this['db']['getVectorC'+_0x1e6732(-0x335,-0x348)](_0x5e648d['id'])??undefined);_0x38ff53[_0x1e6732(-0x33a,-0x318)](),await this[_0x404a74(-0x32a,-0x30a)][_0x1e6732(-0x31d,-0x30f)+'ory'](this[_0x404a74(-0x2e2,-0x2fa)],{'content':_0x5e648d[_0x1e6732(-0x32c,-0x318)],'category':_0x5e648d[_0x404a74(-0x2f5,-0x317)],'tier':_0x5e648d[_0x1e6732(-0x33c,-0x353)],'tags':_0x5e648d['tags']}),this['db']['saveVector'+_0x404a74(-0x2f8,-0x2f1)](_0x5e648d['id'],_0x38ff53[_0x404a74(-0x2c2,-0x2ef)]()),this['db'][_0x404a74(-0x30e,-0x2f9)+_0x404a74(-0x326,-0x31a)](_0x5e648d['id'],null,_0x5a2db6['txZJQ']),this['db'][_0x404a74(-0x2f2,-0x2c1)+'tory'](_0x404a74(-0x2c4,-0x2dc),_0x5e648d['id'],'success'),_0x161d90[_0x404a74(-0x2ee,-0x2ed)]++;}catch(_0x2ccce2){const _0x58db97=_0x5a2db6[_0x1e6732(-0x349,-0x31f)](_0x2ccce2,Error)?_0x2ccce2[_0x1e6732(-0x34c,-0x316)]:String(_0x2ccce2);this['db'][_0x404a74(-0x2b7,-0x2c1)+_0x404a74(-0x2a9,-0x2d3)](_0x5a2db6[_0x1e6732(-0x343,-0x337)],_0x5e648d['id'],_0x404a74(-0x2e1,-0x2fc),_0x58db97),_0x161d90[_0x1e6732(-0x303,-0x322)][_0x1e6732(-0x310,-0x2ef)](_0x404a74(-0x336,-0x30d)+_0x404a74(-0x2cc,-0x2c4)+_0x5e648d['id']+':\x20'+_0x58db97);}}const _0x1db452=await this[_0x1e6732(-0x319,-0x2ee)+'am']();_0x161d90[_0x1e6732(-0x31a,-0x2ee)]=_0x1db452[_0x1e6732(-0x31a,-0x32f)],_0x161d90['conflicts']=_0x1db452['conflicts'];}}catch(_0x5ed151){_0x5a2db6[_0x1e6732(-0x2f6,-0x2d5)]!=='bRZNn'?(this['db'][_0x404a74(-0x30e,-0x2e2)+'ry'](_0x77372e['id'],{'content':_0x4ad31c[_0x404a74(-0x30f,-0x2f8)],'category':_0x5a2db6['jZuyO'](_0x369d77,_0x2125fd[_0x1e6732(-0x34b,-0x327)]),'tier':_0x5a2db6[_0x1e6732(-0x2ef,-0x2d8)](_0x16fbe7,_0x2207d3[_0x1e6732(-0x33c,-0x33c)]??_0x25aebc[_0x404a74(-0x2f7,-0x308)]),'tags':_0x211d09[_0x404a74(-0x2a0,-0x2c0)]??_0x4a10cd[_0x1e6732(-0x2f4,-0x2d0)]}),_0x4cc08d[_0x404a74(-0x319,-0x2e3)]&&_0x5a2db6[_0x404a74(-0x2bd,-0x2eb)](_0x5eb2bf[_0x404a74(-0x2e8,-0x2e3)][_0x404a74(-0x2ff,-0x305)],0x0)&&this['db'][_0x404a74(-0x2db,-0x302)+_0x404a74(-0x2d3,-0x2bd)](_0x3132cb['id'],_0xc943d1[_0x1e6732(-0x317,-0x2e1)])):_0x161d90[_0x1e6732(-0x303,-0x2d0)][_0x404a74(-0x2de,-0x2dc)](_0x5a2db6[_0x404a74(-0x314,-0x315)](_0x5ed151,Error)?_0x5ed151[_0x404a74(-0x300,-0x318)]:String(_0x5ed151));}function _0x1e6732(_0x400702,_0x490824){return _0x155478(_0x400702- -0x204,_0x490824);}return _0x161d90[_0x404a74(-0x2ad,-0x2de)]=Date[_0x404a74(-0x2b4,-0x2d6)]()-_0xf901c9,_0x161d90;}async['pushToTeam'](_0x482c93){function _0x5aee0a(_0x1c7d23,_0x4afd77){return _0x155478(_0x1c7d23-0x3fb,_0x4afd77);}const _0x23c321={'UuXYq':_0x1b9d1e(-0x1c3,-0x1e6)+_0x5aee0a(0x2e3,0x300),'DymLC':_0x1b9d1e(-0x1c9,-0x1c4)};function _0x1b9d1e(_0x40e3d4,_0x236cd2){return _0x155478(_0x236cd2- -0xc3,_0x40e3d4);}const _0x3f5e5b=await this[_0x1b9d1e(-0x220,-0x1fd)][_0x1b9d1e(-0x233,-0x204)+_0x5aee0a(0x2c2,0x2ef)]();if(!_0x3f5e5b)throw new Error(_0x23c321[_0x1b9d1e(-0x1eb,-0x205)]);for(const _0x2a68b7 of _0x482c93){const _0x124b0f=this['db'][_0x1b9d1e(-0x1c0,-0x1a4)](_0x2a68b7);if(!_0x124b0f)continue;const _0x5c39ea=new LocalVectorClock(this[_0x1b9d1e(-0x219,-0x20e)],this['db']['getVectorC'+_0x1b9d1e(-0x1fe,-0x1f4)](_0x2a68b7)??undefined);_0x5c39ea[_0x1b9d1e(-0x201,-0x1f9)](),await this['client']['addTeamMem'+_0x1b9d1e(-0x203,-0x1d0)](this[_0x5aee0a(0x2d1,0x2f5)],{'content':_0x124b0f[_0x5aee0a(0x2d3,0x2fb)],'category':_0x124b0f['category'],'tier':_0x124b0f[_0x1b9d1e(-0x1c8,-0x1fb)],'tags':_0x124b0f['tags']}),this['db'][_0x5aee0a(0x2d0,0x2ce)+_0x5aee0a(0x2da,0x2c2)](_0x2a68b7,_0x5c39ea[_0x1b9d1e(-0x1b3,-0x1e2)]()),this['db'][_0x5aee0a(0x2d2,0x2b4)+_0x1b9d1e(-0x1f4,-0x20d)](_0x2a68b7,null,_0x1b9d1e(-0x20e,-0x1e5)),this['db']['addSyncHis'+_0x5aee0a(0x2f8,0x2fd)](_0x1b9d1e(-0x1f8,-0x1cf),_0x2a68b7,_0x23c321['DymLC']);}}async[_0x3c8e84(-0x1af,-0x1d2)+'am'](){const _0x19dddd={'rUIGB':function(_0x1b5953,_0x45a09f){return _0x1b5953(_0x45a09f);},'dLfXB':_0x241dcf(0x320,0x30b),'bsyas':function(_0xada165,_0x4eed02){return _0xada165(_0x4eed02);},'ZFdAS':_0x49bef3(0x28c,0x2a4),'WZimy':function(_0x573662,_0x1329a7){return _0x573662>_0x1329a7;},'KYftO':function(_0x4e467b,_0x54921f){return _0x4e467b!==_0x54921f;},'ZFynp':'arEkI','HmtgL':function(_0x11e4ef,_0x3e2a03){return _0x11e4ef===_0x3e2a03;},'ZNOmQ':'tNtLk','AnSKM':function(_0x57e5a1,_0x844e32){return _0x57e5a1(_0x844e32);},'ieujx':'success','vqBCI':function(_0x201d37,_0x233dd8){return _0x201d37===_0x233dd8;},'mGqVU':function(_0x40ad98,_0x16fa3b){return _0x40ad98>_0x16fa3b;},'JVLkE':'concurrent','ROkiN':_0x241dcf(0x32b,0x313),'BcSAC':_0x49bef3(0x260,0x28a),'ufuOq':'conflict','nqqtQ':_0x49bef3(0x289,0x2b7)+'tion'};function _0x49bef3(_0x247650,_0x444e76){return _0x3c8e84(_0x444e76-0x460,_0x247650);}let _0x2ecbba=0x0,_0x867c78=0x0,_0x2ef9a1=0x0;const _0x355236=0x3e8;function _0x241dcf(_0x1cf80,_0x1657ba){return _0x3c8e84(_0x1cf80-0x4ea,_0x1657ba);}let _0x3c87a0=0x0;while(_0x3c87a0<_0x355236){_0x3c87a0++;const _0x8c02d8=await this[_0x241dcf(0x316,0x322)]['listTeamMe'+_0x49bef3(0x30c,0x2d8)](this[_0x241dcf(0x326,0x32f)],{'limit':PAGE_SIZE,'offset':_0x2ef9a1});if(_0x8c02d8[_0x241dcf(0x31b,0x2f2)]===0x0)break;for(const _0x46649a of _0x8c02d8){if(_0x19dddd[_0x49bef3(0x2ca,0x2e4)](_0x19dddd[_0x241dcf(0x334,0x321)],_0x19dddd[_0x241dcf(0x334,0x31a)])){const _0x1d38a2=this['db'][_0x49bef3(0x255,0x28b)+'ry']({'content':_0xf3aa64['content'],'category':_0x1e74d9(_0x5130b3[_0x241dcf(0x309,0x304)]),'tier':_0x19dddd['rUIGB'](_0x4bd95e,_0x5d3ea9[_0x49bef3(0x2af,0x28e)]??_0x49bef3(0x2cf,0x2bc)),'tags':_0x2e254b[_0x241dcf(0x360,0x391)]??[]});_0x4abaaf[_0x241dcf(0x33d,0x363)]&&_0x3606a0[_0x241dcf(0x33d,0x35a)]['length']>0x0&&this['db']['saveEmbedd'+_0x49bef3(0x2ac,0x2d9)](_0x1d38a2['id'],_0xdfcfaa[_0x49bef3(0x2c0,0x2b3)]),this['db'][_0x241dcf(0x327,0x32c)+_0x241dcf(0x306,0x30e)](_0x1d38a2['id'],_0x14341f['id'],_0x49bef3(0x2b7,0x2a4)),this['db'][_0x241dcf(0x35f,0x330)+_0x241dcf(0x34d,0x322)](_0x19dddd[_0x49bef3(0x26b,0x27d)],_0x1d38a2['id'],_0x241dcf(0x34f,0x34b)),_0x50dc56++;}else{const _0x3ddca4=this['db'][_0x49bef3(0x2bd,0x2d1)+_0x241dcf(0x32c,0x2fb)](_0x46649a['id']);if(!_0x3ddca4){if(_0x19dddd[_0x241dcf(0x352,0x344)]('tzQhS',_0x19dddd[_0x241dcf(0x319,0x33a)]))this['db'][_0x241dcf(0x31e,0x334)+'ing'](_0x2f0a89['id'],_0x27e117['embedding']);else{const _0x28881a=this['db'][_0x241dcf(0x315,0x300)+'ry']({'content':_0x46649a[_0x241dcf(0x328,0x353)],'category':mapCategory(_0x46649a['category']),'tier':_0x19dddd[_0x241dcf(0x31c,0x320)](mapTier,_0x46649a[_0x241dcf(0x318,0x2fc)]??_0x241dcf(0x346,0x36f)),'tags':_0x46649a[_0x49bef3(0x2b7,0x2d6)]??[]});_0x46649a[_0x49bef3(0x2a9,0x2b3)]&&_0x19dddd[_0x49bef3(0x300,0x2de)](_0x46649a['embedding']['length'],0x0)&&this['db'][_0x241dcf(0x31e,0x309)+'ing'](_0x28881a['id'],_0x46649a[_0x241dcf(0x33d,0x31b)]),this['db']['setSyncSta'+_0x241dcf(0x306,0x2ee)](_0x28881a['id'],_0x46649a['id'],_0x19dddd[_0x241dcf(0x329,0x351)]),this['db'][_0x241dcf(0x35f,0x337)+'tory'](_0x19dddd[_0x49bef3(0x286,0x27d)],_0x28881a['id'],_0x19dddd[_0x241dcf(0x358,0x348)]),_0x2ecbba++;}}else{const _0x131ba2=this['db'][_0x49bef3(0x2e5,0x2af)+_0x49bef3(0x2b1,0x295)](_0x3ddca4['id'])??{},_0x3d2110=new LocalVectorClock(this[_0x49bef3(0x284,0x27b)],_0x131ba2),_0x24a233=_0x46649a['vector_clo'+'ck']??{},_0x649a77=_0x3d2110[_0x241dcf(0x34e,0x34f)](_0x24a233);if(_0x19dddd[_0x241dcf(0x361,0x32b)](_0x649a77,'before'))this['db']['updateMemo'+'ry'](_0x3ddca4['id'],{'content':_0x46649a['content'],'category':mapCategory(_0x46649a['category']),'tier':mapTier(_0x46649a[_0x49bef3(0x29b,0x28e)]??_0x3ddca4['tier']),'tags':_0x46649a[_0x241dcf(0x360,0x384)]??_0x3ddca4[_0x241dcf(0x360,0x36a)]}),_0x46649a[_0x241dcf(0x33d,0x32e)]&&_0x19dddd['mGqVU'](_0x46649a[_0x241dcf(0x33d,0x33e)][_0x241dcf(0x31b,0x2f8)],0x0)&&this['db'][_0x241dcf(0x31e,0x30d)+_0x241dcf(0x363,0x361)](_0x3ddca4['id'],_0x46649a[_0x49bef3(0x2cf,0x2b3)]),_0x3d2110[_0x49bef3(0x2a2,0x298)](_0x24a233),this['db'][_0x241dcf(0x325,0x34d)+_0x241dcf(0x32f,0x304)](_0x3ddca4['id'],_0x3d2110[_0x241dcf(0x331,0x351)]()),this['db'][_0x241dcf(0x327,0x33c)+'tus'](_0x3ddca4['id'],_0x46649a['id'],_0x19dddd[_0x49bef3(0x28b,0x29f)]),this['db'][_0x241dcf(0x35f,0x337)+_0x49bef3(0x2e9,0x2c3)](_0x49bef3(0x2a3,0x296),_0x3ddca4['id'],_0x241dcf(0x34f,0x382)),_0x2ecbba++;else{if(_0x649a77===_0x19dddd[_0x49bef3(0x309,0x2e3)]){const _0x6cec70=new Date(_0x46649a['updated_at']),_0x56bcab=new Date(_0x3ddca4[_0x241dcf(0x355,0x34c)]);if(_0x19dddd[_0x241dcf(0x359,0x326)](_0x6cec70,_0x56bcab)){this['db'][_0x241dcf(0x33e,0x31f)+'ry'](_0x3ddca4['id'],{'content':_0x46649a['content'],'category':_0x19dddd[_0x241dcf(0x349,0x315)](mapCategory,_0x46649a[_0x241dcf(0x309,0x312)]),'tier':mapTier(_0x46649a['tier']??_0x3ddca4[_0x49bef3(0x2a0,0x28e)]),'tags':_0x46649a[_0x49bef3(0x2c6,0x2d6)]??_0x3ddca4['tags']});if(_0x46649a['embedding']&&_0x46649a[_0x241dcf(0x33d,0x329)][_0x241dcf(0x31b,0x32f)]>0x0){if(_0x19dddd[_0x241dcf(0x312,0x335)]!==_0x19dddd[_0x241dcf(0x354,0x34f)])this['db']['saveEmbedd'+_0x49bef3(0x2b5,0x2d9)](_0x3ddca4['id'],_0x46649a[_0x49bef3(0x2ae,0x2b3)]);else{const _0x294400=('2|5|1|0|4|'+'3|6')[_0x49bef3(0x2d1,0x2a8)]('|');let _0x576a5e=0x0;while(!![]){switch(_0x294400[_0x576a5e++]){case'0':this['db'][_0x241dcf(0x325,0x330)+_0x241dcf(0x32f,0x324)](_0x3746e3['id'],_0x3fd33f['toJSON']());continue;case'1':_0x35721e['merge'](_0x34b9a5);continue;case'2':this['db']['updateMemo'+'ry'](_0x11a8d3['id'],{'content':_0x4bd451[_0x241dcf(0x328,0x354)],'category':_0x2bb403(_0x4a8a52[_0x49bef3(0x278,0x27f)]),'tier':_0x19dddd[_0x49bef3(0x2a3,0x2d0)](_0x360922,_0x5253cf[_0x49bef3(0x283,0x28e)]??_0x3c5f0f[_0x241dcf(0x318,0x330)]),'tags':_0x34c11d[_0x241dcf(0x360,0x363)]??_0xadd18[_0x241dcf(0x360,0x333)]});continue;case'3':this['db'][_0x241dcf(0x35f,0x32f)+'tory'](_0x49bef3(0x26d,0x296),_0x5da6ee['id'],_0x49bef3(0x2e7,0x2c5));continue;case'4':this['db'][_0x49bef3(0x2c6,0x29d)+_0x241dcf(0x306,0x30c)](_0x2656f9['id'],_0x218099['id'],_0x19dddd[_0x241dcf(0x329,0x359)]);continue;case'5':_0x1e2c0a[_0x49bef3(0x2d4,0x2b3)]&&_0x19dddd[_0x241dcf(0x368,0x35e)](_0x3b3903[_0x241dcf(0x33d,0x342)][_0x241dcf(0x31b,0x2e8)],0x0)&&this['db'][_0x241dcf(0x31e,0x351)+_0x49bef3(0x2b0,0x2d9)](_0x20714b['id'],_0x21cddf[_0x49bef3(0x28f,0x2b3)]);continue;case'6':_0x2d7239++;continue;}break;}}}}_0x3d2110[_0x49bef3(0x2a0,0x298)](_0x24a233),this['db'][_0x241dcf(0x325,0x300)+_0x241dcf(0x32f,0x321)](_0x3ddca4['id'],_0x3d2110[_0x241dcf(0x331,0x327)]()),this['db'][_0x49bef3(0x268,0x29d)+'tus'](_0x3ddca4['id'],_0x46649a['id'],_0x49bef3(0x289,0x2a4)),this['db'][_0x49bef3(0x2e0,0x2d5)+_0x49bef3(0x293,0x2c3)](_0x19dddd[_0x241dcf(0x323,0x2fe)],_0x3ddca4['id'],_0x49bef3(0x2bb,0x2c5),_0x19dddd[_0x49bef3(0x286,0x279)]),_0x867c78++;}}}}}if(_0x8c02d8[_0x49bef3(0x289,0x291)]<PAGE_SIZE)break;_0x2ef9a1+=PAGE_SIZE;}return{'pulled':_0x2ecbba,'conflicts':_0x867c78};}async[_0x3c8e84(-0x19f,-0x177)+'tus'](){const _0x297035={'SgIBD':function(_0x52034c,_0x5b9953){return _0x52034c??_0x5b9953;}};function _0xd38675(_0x57e4d7,_0x298c62){return _0x155478(_0x298c62-0x90,_0x57e4d7);}const _0x547b94=this['db']['getStats'](),_0x4049c3=this['db'][_0x2894af(0x1d3,0x1b4)+_0x2894af(0x207,0x221)+'es']()['length'],_0x518235=this['db'][_0x2894af(0x1c0,0x1c3)+'cedAt']();function _0x2894af(_0x3c629e,_0x2b81f1){return _0x155478(_0x3c629e-0x2f3,_0x2b81f1);}return{'teamPath':this[_0xd38675(-0xc2,-0x9a)],'nodeId':this[_0x2894af(0x1a8,0x1b0)],'localMemoryCount':_0x547b94[_0x2894af(0x200,0x1f6)+_0xd38675(-0x56,-0x54)],'pendingSync':_0x4049c3,'lastSyncedAt':_0x297035[_0xd38675(-0x68,-0x78)](_0x518235,undefined)};}}
|
|
@@ -1,70 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Local Vector Clock
|
|
3
|
-
* CRDT 기반 동기화를 위한 로컬 벡터 클럭 관리
|
|
4
|
-
*/
|
|
5
|
-
export class LocalVectorClock {
|
|
6
|
-
nodeId;
|
|
7
|
-
state;
|
|
8
|
-
constructor(nodeId, state) {
|
|
9
|
-
this.nodeId = nodeId;
|
|
10
|
-
this.state = state ? { ...state } : {};
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* 현재 노드의 카운터를 1 증가
|
|
14
|
-
*/
|
|
15
|
-
increment() {
|
|
16
|
-
this.state[this.nodeId] = (this.state[this.nodeId] ?? 0) + 1;
|
|
17
|
-
return this.toJSON();
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* 원격 벡터 클럭과 병합 (element-wise max)
|
|
21
|
-
*/
|
|
22
|
-
merge(remote) {
|
|
23
|
-
for (const [node, count] of Object.entries(remote)) {
|
|
24
|
-
this.state[node] = Math.max(this.state[node] ?? 0, count);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
getNodeId() {
|
|
28
|
-
return this.nodeId;
|
|
29
|
-
}
|
|
30
|
-
get(nodeId) {
|
|
31
|
-
return this.state[nodeId] ?? 0;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* 두 벡터 클럭 비교
|
|
35
|
-
* @returns 'before' | 'after' | 'concurrent' | 'equal'
|
|
36
|
-
*/
|
|
37
|
-
compare(other) {
|
|
38
|
-
let localBefore = false;
|
|
39
|
-
let remoteBefore = false;
|
|
40
|
-
const allNodes = new Set([...Object.keys(this.state), ...Object.keys(other)]);
|
|
41
|
-
for (const node of allNodes) {
|
|
42
|
-
const localVal = this.state[node] ?? 0;
|
|
43
|
-
const remoteVal = other[node] ?? 0;
|
|
44
|
-
if (localVal < remoteVal)
|
|
45
|
-
localBefore = true;
|
|
46
|
-
if (localVal > remoteVal)
|
|
47
|
-
remoteBefore = true;
|
|
48
|
-
}
|
|
49
|
-
if (!localBefore && !remoteBefore)
|
|
50
|
-
return 'equal';
|
|
51
|
-
if (localBefore && !remoteBefore)
|
|
52
|
-
return 'before';
|
|
53
|
-
if (!localBefore && remoteBefore)
|
|
54
|
-
return 'after';
|
|
55
|
-
return 'concurrent';
|
|
56
|
-
}
|
|
57
|
-
happensBefore(other) {
|
|
58
|
-
return this.compare(other) === 'before';
|
|
59
|
-
}
|
|
60
|
-
isConcurrent(other) {
|
|
61
|
-
return this.compare(other) === 'concurrent';
|
|
62
|
-
}
|
|
63
|
-
toJSON() {
|
|
64
|
-
return { ...this.state };
|
|
65
|
-
}
|
|
66
|
-
static fromJSON(nodeId, data) {
|
|
67
|
-
return new LocalVectorClock(nodeId, data);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=vector-clock.js.map
|
|
1
|
+
(function(_0x4c5709,_0x5ce568){function _0x1fc753(_0x3b34b6,_0x537e3e){return _0x155c(_0x537e3e-0x296,_0x3b34b6);}const _0x540b5c=_0x4c5709();function _0x4bc116(_0x1f7ae7,_0x44a035){return _0x155c(_0x1f7ae7- -0x1f8,_0x44a035);}while(!![]){try{const _0x3fae09=parseInt(_0x1fc753(0x450,0x458))/0x1+-parseInt(_0x1fc753(0x443,0x44d))/0x2*(parseInt(_0x4bc116(-0x3f,-0x3a))/0x3)+-parseInt(_0x4bc116(-0x45,-0x36))/0x4*(parseInt(_0x4bc116(-0x3a,-0x33))/0x5)+-parseInt(_0x4bc116(-0x2b,-0x2a))/0x6*(parseInt(_0x1fc753(0x44d,0x446))/0x7)+-parseInt(_0x1fc753(0x44b,0x44c))/0x8+parseInt(_0x4bc116(-0x43,-0x3a))/0x9+parseInt(_0x4bc116(-0x2a,-0x2d))/0xa;if(_0x3fae09===_0x5ce568)break;else _0x540b5c['push'](_0x540b5c['shift']());}catch(_0x7046fd){_0x540b5c['push'](_0x540b5c['shift']());}}}(_0x33b0,0xe085d));function _0x33b0(){const _0x1c90ef=['nZqZmZC2yuv3AfPJ','ywz0zxi','Dg9ku09o','C3rHDgu','yMvMB3jL','zw50CMLLCW','AgfWCgvUC0jLzG','tMDir1G','B3jL','y29Uy3vYCMvUDa','y29TCgfYzq','ody3ndaYEgDArwj6','mZm5odGZmJbvrevzEwi','B1v0uue','uvviuNi','Aw5JCMvTzw50','ndjHEfP3Cuu','BM9KzuLK','sK5Ovuu','mtm4nZm1nNb6AwHXuW','A2v5CW','otG1nJKZnuTzANPcqW','mtm0nJqYotzkrM1Qs2O','mteZnJrSz2fpEgG','uwLgyvy','nZuWsfvLCKfj','ALj0sgW','zNjVBuPtt04','sMrLrfe','DeHWBhO','nvDnCw1fyq','z2v0tM9KzuLK','zxf1ywW','z2v0'];_0x33b0=function(){return _0x1c90ef;};return _0x33b0();}function _0x120e48(_0x303d56,_0x5607b1){return _0x155c(_0x5607b1-0x5,_0x303d56);}function _0x1f072d(_0x66d7fe,_0x467fdd){return _0x155c(_0x467fdd-0x290,_0x66d7fe);}function _0x155c(_0x1f627f,_0x1a064a){_0x1f627f=_0x1f627f-0x1ad;const _0x33b002=_0x33b0();let _0x155c8c=_0x33b002[_0x1f627f];if(_0x155c['imYSoh']===undefined){var _0x470da2=function(_0x436a0a){const _0x816c66='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xbdd340='',_0x2e2868='';for(let _0x152dcc=0x0,_0x45a3b5,_0x5445dc,_0x309f3b=0x0;_0x5445dc=_0x436a0a['charAt'](_0x309f3b++);~_0x5445dc&&(_0x45a3b5=_0x152dcc%0x4?_0x45a3b5*0x40+_0x5445dc:_0x5445dc,_0x152dcc++%0x4)?_0xbdd340+=String['fromCharCode'](0xff&_0x45a3b5>>(-0x2*_0x152dcc&0x6)):0x0){_0x5445dc=_0x816c66['indexOf'](_0x5445dc);}for(let _0x3d9742=0x0,_0x287380=_0xbdd340['length'];_0x3d9742<_0x287380;_0x3d9742++){_0x2e2868+='%'+('00'+_0xbdd340['charCodeAt'](_0x3d9742)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2e2868);};_0x155c['xxqoCp']=_0x470da2,_0x155c['wxeZDQ']={},_0x155c['imYSoh']=!![];}const _0x2a8d73=_0x33b002[0x0],_0x823e80=_0x1f627f+_0x2a8d73,_0xbbcdeb=_0x155c['wxeZDQ'][_0x823e80];return!_0xbbcdeb?(_0x155c8c=_0x155c['xxqoCp'](_0x155c8c),_0x155c['wxeZDQ'][_0x823e80]=_0x155c8c):_0x155c8c=_0xbbcdeb,_0x155c8c;}export class LocalVectorClock{['nodeId'];[_0x120e48(0x1c1,0x1ca)];constructor(_0x368ea1,_0x49e75b){function _0x1f54a9(_0x4e6fd6,_0x509e82){return _0x120e48(_0x509e82,_0x4e6fd6- -0xb5);}this[_0x1f54a9(0x101,0xfa)]=_0x368ea1,this['state']=_0x49e75b?{..._0x49e75b}:{};}[_0x1f072d(0x44d,0x43f)](){function _0x33d71e(_0x20711f,_0x10b581){return _0x120e48(_0x10b581,_0x20711f-0x14c);}const _0x1b6671={'JdeDQ':function(_0x2e2f65,_0x331760){return _0x2e2f65+_0x331760;}};this[_0x18da2(0x53e,0x530)][this[_0x33d71e(0x302,0x2fc)]]=_0x1b6671[_0x18da2(0x516,0x527)](this['state'][this[_0x18da2(0x51d,0x51c)]]??0x0,0x1);function _0x18da2(_0x1fb84f,_0x2a5852){return _0x120e48(_0x1fb84f,_0x2a5852-0x366);}return this[_0x33d71e(0x315,0x305)]();}['merge'](_0x27dca5){function _0x3a516d(_0x43abde,_0x2377be){return _0x120e48(_0x43abde,_0x2377be-0x46);}const _0x1f972f={'NgHGX':function(_0x440393,_0x38e914){return _0x440393===_0x38e914;}};function _0x522f17(_0x3d6e43,_0x15b507){return _0x120e48(_0x3d6e43,_0x15b507-0x86);}for(const [_0x2cf27f,_0x94d3ca]of Object[_0x522f17(0x257,0x252)](_0x27dca5)){if(_0x522f17(0x247,0x248)===_0x522f17(0x244,0x248))this['state'][_0x2cf27f]=Math['max'](this['state'][_0x2cf27f]??0x0,_0x94d3ca);else return _0x1f972f[_0x522f17(0x254,0x254)](this[_0x3a516d(0x21c,0x217)](_0x24cc0a),_0x522f17(0x25d,0x256));}}[_0x1f072d(0x45b,0x44f)](){function _0x5d4959(_0x29713b,_0x2bf099){return _0x120e48(_0x2bf099,_0x29713b- -0x292);}return this[_0x5d4959(-0xdc,-0xe8)];}[_0x1f072d(0x452,0x451)](_0x1d8da5){function _0x19efd9(_0x566617,_0x32ecff){return _0x1f072d(_0x32ecff,_0x566617- -0x4d0);}return this[_0x19efd9(-0x7b,-0x84)][_0x1d8da5]??0x0;}['compare'](_0x2a83f3){const _0x3474b7={'oUtQA':function(_0x465325,_0xc57981){return _0x465325<_0xc57981;},'QiFaV':function(_0x377cee,_0x18cf74){return _0x377cee&&_0x18cf74;},'lYuRA':function(_0x3dd592,_0x2d4864){return _0x3dd592&&_0x2d4864;},'cRxeo':_0x21b9e5(0x388,0x378)};function _0x3117c3(_0x51ea0b,_0x7e94d4){return _0x1f072d(_0x7e94d4,_0x51ea0b- -0x5b0);}let _0x2a0608=![];function _0x21b9e5(_0x2a01fb,_0x235b07){return _0x1f072d(_0x235b07,_0x2a01fb- -0xcb);}let _0x5d8415=![];const _0x7f692f=new Set([...Object[_0x3117c3(-0x16c,-0x16c)](this['state']),...Object[_0x3117c3(-0x16c,-0x164)](_0x2a83f3)]);for(const _0x364b41 of _0x7f692f){const _0x15c123=this[_0x3117c3(-0x15b,-0x164)][_0x364b41]??0x0,_0xe32763=_0x2a83f3[_0x364b41]??0x0;if(_0x3474b7[_0x3117c3(-0x173,-0x165)](_0x15c123,_0xe32763))_0x2a0608=!![];if(_0x15c123>_0xe32763)_0x5d8415=!![];}if(_0x3474b7[_0x3117c3(-0x168,-0x158)](!_0x2a0608,!_0x5d8415))return _0x3117c3(-0x160,-0x15c);if(_0x3474b7[_0x21b9e5(0x37d,0x370)](_0x2a0608,!_0x5d8415))return'before';if(_0x3474b7['lYuRA'](!_0x2a0608,_0x5d8415))return _0x3474b7['cRxeo'];return _0x3117c3(-0x155,-0x14a);}[_0x120e48(0x1dc,0x1cd)+_0x1f072d(0x45e,0x45a)](_0x346b77){function _0x2396df(_0x9cfb08,_0x306056){return _0x120e48(_0x306056,_0x9cfb08- -0x150);}const _0x4f2531={'QUHRr':function(_0x5c1ef8,_0x413238){return _0x5c1ef8===_0x413238;}};function _0x3c1a3f(_0x42b374,_0xf732a0){return _0x120e48(_0xf732a0,_0x42b374-0x15c);}return _0x4f2531[_0x2396df(0x63,0x58)](this['compare'](_0x346b77),_0x3c1a3f(0x327,0x332));}['isConcurre'+'nt'](_0x46019b){const _0x7259e5={'jRtHl':function(_0x51a8b0,_0x5e8075){return _0x51a8b0===_0x5e8075;},'JNhUE':'concurrent'};function _0x5c7ad4(_0x251ff5,_0x2b2ff2){return _0x1f072d(_0x251ff5,_0x2b2ff2-0x55);}function _0x2dd592(_0x3215e5,_0x108378){return _0x1f072d(_0x108378,_0x3215e5- -0x298);}return _0x7259e5[_0x2dd592(0x1b2,0x1a7)](this[_0x2dd592(0x1c4,0x1c7)](_0x46019b),_0x7259e5[_0x5c7ad4(0x49f,0x497)]);}[_0x1f072d(0x451,0x454)](){function _0xf3a4b1(_0x2e5cc3,_0x418e76){return _0x1f072d(_0x418e76,_0x2e5cc3-0x130);}return{...this[_0xf3a4b1(0x585,0x583)]};}static[_0x1f072d(0x451,0x44b)](_0x3f6354,_0xa384fb){return new LocalVectorClock(_0x3f6354,_0xa384fb);}}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* 이 파일은 모든 모듈이 공유하는 타입 정의입니다.
|
|
5
5
|
* 변경 시 모든 의존 모듈에 영향을 미치므로 신중하게 수정하세요.
|
|
6
6
|
*/
|
|
7
|
-
export type MemoryCategory = 'error_solution' | 'code_pattern' | 'decision' | 'context' | 'project_knowledge' | 'convention' | 'learning' | 'skill';
|
|
7
|
+
export type MemoryCategory = 'error_solution' | 'code_pattern' | 'decision' | 'context' | 'project_knowledge' | 'convention' | 'learning' | 'skill' | 'rule';
|
|
8
8
|
export type MemoryTier = 'working' | 'episodic' | 'semantic';
|
|
9
9
|
export interface Memory {
|
|
10
10
|
id: string;
|