a2a-memory 0.11.5 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/LICENSE +7 -19
  2. package/README.md +1 -1
  3. package/dist/a2a/client.js +1 -252
  4. package/dist/a2a/discovery.js +1 -115
  5. package/dist/a2a/index.js +1 -8
  6. package/dist/a2a/types.js +1 -42
  7. package/dist/adapters/anthropic.js +1 -117
  8. package/dist/chunking/chunker.js +1 -163
  9. package/dist/claude/sync.d.ts +8 -2
  10. package/dist/claude/sync.js +1 -298
  11. package/dist/cli/commands/add.js +1 -80
  12. package/dist/cli/commands/claude-sync.d.ts +3 -3
  13. package/dist/cli/commands/claude-sync.js +1 -70
  14. package/dist/cli/commands/cleanup.js +1 -83
  15. package/dist/cli/commands/config.js +1 -79
  16. package/dist/cli/commands/edit.js +1 -69
  17. package/dist/cli/commands/embed.js +1 -92
  18. package/dist/cli/commands/extract.js +1 -103
  19. package/dist/cli/commands/health.js +1 -105
  20. package/dist/cli/commands/list.js +1 -46
  21. package/dist/cli/commands/migrate-chunks.js +1 -205
  22. package/dist/cli/commands/migrate-file-refs.js +1 -183
  23. package/dist/cli/commands/proficiency.js +1 -146
  24. package/dist/cli/commands/rm.js +1 -64
  25. package/dist/cli/commands/search.js +1 -90
  26. package/dist/cli/commands/setup-wizard.js +1 -387
  27. package/dist/cli/commands/setup.js +1 -170
  28. package/dist/cli/commands/skill.js +1 -151
  29. package/dist/cli/commands/status.js +1 -70
  30. package/dist/cli/commands/sync.js +1 -202
  31. package/dist/cli/commands/team.js +1 -142
  32. package/dist/cli/index.js +1 -87
  33. package/dist/config/manager.js +1 -372
  34. package/dist/db/database.d.ts +36 -0
  35. package/dist/db/database.js +1 -1400
  36. package/dist/embedding/e5-provider.js +1 -147
  37. package/dist/embedding/index.js +1 -34
  38. package/dist/embedding/local-provider.js +1 -157
  39. package/dist/embedding/openai-provider.js +1 -92
  40. package/dist/embedding/quantization.js +1 -89
  41. package/dist/extraction/dedup-manager.js +1 -161
  42. package/dist/extraction/emotion-filter.js +1 -33
  43. package/dist/extraction/extractor.d.ts +0 -3
  44. package/dist/extraction/extractor.js +1 -648
  45. package/dist/extraction/file-reference.js +1 -77
  46. package/dist/extraction/filter.js +1 -86
  47. package/dist/extraction/scorer.js +1 -142
  48. package/dist/extraction/similarity.js +1 -85
  49. package/dist/hooks/client-factory.js +1 -44
  50. package/dist/hooks/post-tool-use.js +1 -518
  51. package/dist/hooks/pre-compact.js +1 -209
  52. package/dist/hooks/session-end.js +1 -633
  53. package/dist/hooks/session-start.js +1 -549
  54. package/dist/hooks/shared.js +1 -110
  55. package/dist/hooks/stop.d.ts +21 -0
  56. package/dist/hooks/stop.js +1 -0
  57. package/dist/hooks/user-prompt-submit.js +1 -316
  58. package/dist/i18n/index.js +1 -2
  59. package/dist/i18n/messages.js +1 -150
  60. package/dist/index.d.ts +1 -1
  61. package/dist/index.js +1 -43
  62. package/dist/lifecycle/cleanup-scheduler.js +1 -137
  63. package/dist/lifecycle/cleanup.d.ts +1 -0
  64. package/dist/lifecycle/cleanup.js +1 -116
  65. package/dist/lifecycle/consolidation.d.ts +22 -0
  66. package/dist/lifecycle/consolidation.js +1 -0
  67. package/dist/lifecycle/index.d.ts +2 -0
  68. package/dist/lifecycle/index.js +1 -13
  69. package/dist/lifecycle/injection-flush.d.ts +24 -0
  70. package/dist/lifecycle/injection-flush.js +1 -0
  71. package/dist/lifecycle/quality-scorer.d.ts +5 -6
  72. package/dist/lifecycle/quality-scorer.js +1 -46
  73. package/dist/lifecycle/tiering.js +1 -246
  74. package/dist/llm/client.js +1 -226
  75. package/dist/llm/index.js +1 -5
  76. package/dist/proficiency/actr-engine.js +1 -106
  77. package/dist/proficiency/detection.js +1 -77
  78. package/dist/proficiency/index.js +1 -9
  79. package/dist/proficiency/tracker.js +1 -173
  80. package/dist/proficiency/types.js +1 -8
  81. package/dist/providers/adapters.js +1 -140
  82. package/dist/providers/detector.js +1 -57
  83. package/dist/search/adaptive-router.js +1 -93
  84. package/dist/search/index.js +1 -9
  85. package/dist/search/ranker.js +1 -171
  86. package/dist/search/reranker.js +1 -155
  87. package/dist/session/parser.js +1 -130
  88. package/dist/skill/evaluator.js +1 -509
  89. package/dist/skill/index.js +1 -7
  90. package/dist/skill/types.js +1 -7
  91. package/dist/sync/client.d.ts +7 -0
  92. package/dist/sync/client.js +1 -597
  93. package/dist/sync/encryption.js +1 -203
  94. package/dist/sync/index.js +1 -12
  95. package/dist/sync/queue.js +1 -214
  96. package/dist/sync/scheduler.js +1 -140
  97. package/dist/sync/synchronizer.js +1 -241
  98. package/dist/sync/team-synchronizer.js +1 -204
  99. package/dist/sync/vector-clock.js +1 -70
  100. package/dist/types/index.d.ts +13 -1
  101. package/dist/types/index.js +1 -132
  102. package/dist/utils/keychain.js +1 -170
  103. package/dist/utils/logger.js +1 -128
  104. package/package.json +15 -10
  105. package/dist/a2a/client.d.ts.map +0 -1
  106. package/dist/a2a/client.js.map +0 -1
  107. package/dist/a2a/discovery.d.ts.map +0 -1
  108. package/dist/a2a/discovery.js.map +0 -1
  109. package/dist/a2a/index.d.ts.map +0 -1
  110. package/dist/a2a/index.js.map +0 -1
  111. package/dist/a2a/types.d.ts.map +0 -1
  112. package/dist/a2a/types.js.map +0 -1
  113. package/dist/adapters/anthropic.d.ts.map +0 -1
  114. package/dist/adapters/anthropic.js.map +0 -1
  115. package/dist/chunking/chunker.d.ts.map +0 -1
  116. package/dist/chunking/chunker.js.map +0 -1
  117. package/dist/claude/sync.d.ts.map +0 -1
  118. package/dist/claude/sync.js.map +0 -1
  119. package/dist/cli/commands/add.d.ts.map +0 -1
  120. package/dist/cli/commands/add.js.map +0 -1
  121. package/dist/cli/commands/claude-sync.d.ts.map +0 -1
  122. package/dist/cli/commands/claude-sync.js.map +0 -1
  123. package/dist/cli/commands/cleanup.d.ts.map +0 -1
  124. package/dist/cli/commands/cleanup.js.map +0 -1
  125. package/dist/cli/commands/config.d.ts.map +0 -1
  126. package/dist/cli/commands/config.js.map +0 -1
  127. package/dist/cli/commands/edit.d.ts.map +0 -1
  128. package/dist/cli/commands/edit.js.map +0 -1
  129. package/dist/cli/commands/embed.d.ts.map +0 -1
  130. package/dist/cli/commands/embed.js.map +0 -1
  131. package/dist/cli/commands/extract.d.ts.map +0 -1
  132. package/dist/cli/commands/extract.js.map +0 -1
  133. package/dist/cli/commands/health.d.ts.map +0 -1
  134. package/dist/cli/commands/health.js.map +0 -1
  135. package/dist/cli/commands/list.d.ts.map +0 -1
  136. package/dist/cli/commands/list.js.map +0 -1
  137. package/dist/cli/commands/migrate-chunks.d.ts.map +0 -1
  138. package/dist/cli/commands/migrate-chunks.js.map +0 -1
  139. package/dist/cli/commands/migrate-file-refs.d.ts.map +0 -1
  140. package/dist/cli/commands/migrate-file-refs.js.map +0 -1
  141. package/dist/cli/commands/proficiency.d.ts.map +0 -1
  142. package/dist/cli/commands/proficiency.js.map +0 -1
  143. package/dist/cli/commands/rm.d.ts.map +0 -1
  144. package/dist/cli/commands/rm.js.map +0 -1
  145. package/dist/cli/commands/search.d.ts.map +0 -1
  146. package/dist/cli/commands/search.js.map +0 -1
  147. package/dist/cli/commands/setup-wizard.d.ts.map +0 -1
  148. package/dist/cli/commands/setup-wizard.js.map +0 -1
  149. package/dist/cli/commands/setup.d.ts.map +0 -1
  150. package/dist/cli/commands/setup.js.map +0 -1
  151. package/dist/cli/commands/skill.d.ts.map +0 -1
  152. package/dist/cli/commands/skill.js.map +0 -1
  153. package/dist/cli/commands/status.d.ts.map +0 -1
  154. package/dist/cli/commands/status.js.map +0 -1
  155. package/dist/cli/commands/sync.d.ts.map +0 -1
  156. package/dist/cli/commands/sync.js.map +0 -1
  157. package/dist/cli/commands/team.d.ts.map +0 -1
  158. package/dist/cli/commands/team.js.map +0 -1
  159. package/dist/cli/index.d.ts.map +0 -1
  160. package/dist/cli/index.js.map +0 -1
  161. package/dist/config/manager.d.ts.map +0 -1
  162. package/dist/config/manager.js.map +0 -1
  163. package/dist/db/database.d.ts.map +0 -1
  164. package/dist/db/database.js.map +0 -1
  165. package/dist/embedding/e5-provider.d.ts.map +0 -1
  166. package/dist/embedding/e5-provider.js.map +0 -1
  167. package/dist/embedding/index.d.ts.map +0 -1
  168. package/dist/embedding/index.js.map +0 -1
  169. package/dist/embedding/local-provider.d.ts.map +0 -1
  170. package/dist/embedding/local-provider.js.map +0 -1
  171. package/dist/embedding/openai-provider.d.ts.map +0 -1
  172. package/dist/embedding/openai-provider.js.map +0 -1
  173. package/dist/embedding/quantization.d.ts.map +0 -1
  174. package/dist/embedding/quantization.js.map +0 -1
  175. package/dist/extraction/dedup-manager.d.ts.map +0 -1
  176. package/dist/extraction/dedup-manager.js.map +0 -1
  177. package/dist/extraction/emotion-filter.d.ts.map +0 -1
  178. package/dist/extraction/emotion-filter.js.map +0 -1
  179. package/dist/extraction/extractor.d.ts.map +0 -1
  180. package/dist/extraction/extractor.js.map +0 -1
  181. package/dist/extraction/file-reference.d.ts.map +0 -1
  182. package/dist/extraction/file-reference.js.map +0 -1
  183. package/dist/extraction/filter.d.ts.map +0 -1
  184. package/dist/extraction/filter.js.map +0 -1
  185. package/dist/extraction/scorer.d.ts.map +0 -1
  186. package/dist/extraction/scorer.js.map +0 -1
  187. package/dist/extraction/similarity.d.ts.map +0 -1
  188. package/dist/extraction/similarity.js.map +0 -1
  189. package/dist/hooks/client-factory.d.ts.map +0 -1
  190. package/dist/hooks/client-factory.js.map +0 -1
  191. package/dist/hooks/post-tool-use.d.ts.map +0 -1
  192. package/dist/hooks/post-tool-use.js.map +0 -1
  193. package/dist/hooks/pre-compact.d.ts.map +0 -1
  194. package/dist/hooks/pre-compact.js.map +0 -1
  195. package/dist/hooks/session-end.d.ts.map +0 -1
  196. package/dist/hooks/session-end.js.map +0 -1
  197. package/dist/hooks/session-start.d.ts.map +0 -1
  198. package/dist/hooks/session-start.js.map +0 -1
  199. package/dist/hooks/shared.d.ts.map +0 -1
  200. package/dist/hooks/shared.js.map +0 -1
  201. package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
  202. package/dist/hooks/user-prompt-submit.js.map +0 -1
  203. package/dist/i18n/index.d.ts.map +0 -1
  204. package/dist/i18n/index.js.map +0 -1
  205. package/dist/i18n/messages.d.ts.map +0 -1
  206. package/dist/i18n/messages.js.map +0 -1
  207. package/dist/index.d.ts.map +0 -1
  208. package/dist/index.js.map +0 -1
  209. package/dist/lifecycle/cleanup-scheduler.d.ts.map +0 -1
  210. package/dist/lifecycle/cleanup-scheduler.js.map +0 -1
  211. package/dist/lifecycle/cleanup.d.ts.map +0 -1
  212. package/dist/lifecycle/cleanup.js.map +0 -1
  213. package/dist/lifecycle/index.d.ts.map +0 -1
  214. package/dist/lifecycle/index.js.map +0 -1
  215. package/dist/lifecycle/quality-scorer.d.ts.map +0 -1
  216. package/dist/lifecycle/quality-scorer.js.map +0 -1
  217. package/dist/lifecycle/tiering.d.ts.map +0 -1
  218. package/dist/lifecycle/tiering.js.map +0 -1
  219. package/dist/llm/client.d.ts.map +0 -1
  220. package/dist/llm/client.js.map +0 -1
  221. package/dist/llm/index.d.ts.map +0 -1
  222. package/dist/llm/index.js.map +0 -1
  223. package/dist/proficiency/actr-engine.d.ts.map +0 -1
  224. package/dist/proficiency/actr-engine.js.map +0 -1
  225. package/dist/proficiency/detection.d.ts.map +0 -1
  226. package/dist/proficiency/detection.js.map +0 -1
  227. package/dist/proficiency/index.d.ts.map +0 -1
  228. package/dist/proficiency/index.js.map +0 -1
  229. package/dist/proficiency/tracker.d.ts.map +0 -1
  230. package/dist/proficiency/tracker.js.map +0 -1
  231. package/dist/proficiency/types.d.ts.map +0 -1
  232. package/dist/proficiency/types.js.map +0 -1
  233. package/dist/providers/adapters.d.ts.map +0 -1
  234. package/dist/providers/adapters.js.map +0 -1
  235. package/dist/providers/detector.d.ts.map +0 -1
  236. package/dist/providers/detector.js.map +0 -1
  237. package/dist/search/adaptive-router.d.ts.map +0 -1
  238. package/dist/search/adaptive-router.js.map +0 -1
  239. package/dist/search/index.d.ts.map +0 -1
  240. package/dist/search/index.js.map +0 -1
  241. package/dist/search/ranker.d.ts.map +0 -1
  242. package/dist/search/ranker.js.map +0 -1
  243. package/dist/search/reranker.d.ts.map +0 -1
  244. package/dist/search/reranker.js.map +0 -1
  245. package/dist/session/parser.d.ts.map +0 -1
  246. package/dist/session/parser.js.map +0 -1
  247. package/dist/skill/evaluator.d.ts.map +0 -1
  248. package/dist/skill/evaluator.js.map +0 -1
  249. package/dist/skill/index.d.ts.map +0 -1
  250. package/dist/skill/index.js.map +0 -1
  251. package/dist/skill/types.d.ts.map +0 -1
  252. package/dist/skill/types.js.map +0 -1
  253. package/dist/sync/client.d.ts.map +0 -1
  254. package/dist/sync/client.js.map +0 -1
  255. package/dist/sync/encryption.d.ts.map +0 -1
  256. package/dist/sync/encryption.js.map +0 -1
  257. package/dist/sync/index.d.ts.map +0 -1
  258. package/dist/sync/index.js.map +0 -1
  259. package/dist/sync/queue.d.ts.map +0 -1
  260. package/dist/sync/queue.js.map +0 -1
  261. package/dist/sync/scheduler.d.ts.map +0 -1
  262. package/dist/sync/scheduler.js.map +0 -1
  263. package/dist/sync/synchronizer.d.ts.map +0 -1
  264. package/dist/sync/synchronizer.js.map +0 -1
  265. package/dist/sync/team-synchronizer.d.ts.map +0 -1
  266. package/dist/sync/team-synchronizer.js.map +0 -1
  267. package/dist/sync/vector-clock.d.ts.map +0 -1
  268. package/dist/sync/vector-clock.js.map +0 -1
  269. package/dist/types/index.d.ts.map +0 -1
  270. package/dist/types/index.js.map +0 -1
  271. package/dist/utils/keychain.d.ts.map +0 -1
  272. package/dist/utils/keychain.js.map +0 -1
  273. package/dist/utils/logger.d.ts.map +0 -1
  274. package/dist/utils/logger.js.map +0 -1
@@ -1,203 +1 @@
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
1
+ function _0x5afe(_0x3ff8d6,_0x27ee9c){_0x3ff8d6=_0x3ff8d6-0x1ce;const _0x23c9ad=_0x23c9();let _0x5afe58=_0x23c9ad[_0x3ff8d6];if(_0x5afe['guwJVy']===undefined){var _0x257abc=function(_0x63e7f8){const _0x3e7073='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3f734e='',_0x21ea66='';for(let _0x304676=0x0,_0x50caf4,_0x496ad8,_0x239b6d=0x0;_0x496ad8=_0x63e7f8['charAt'](_0x239b6d++);~_0x496ad8&&(_0x50caf4=_0x304676%0x4?_0x50caf4*0x40+_0x496ad8:_0x496ad8,_0x304676++%0x4)?_0x3f734e+=String['fromCharCode'](0xff&_0x50caf4>>(-0x2*_0x304676&0x6)):0x0){_0x496ad8=_0x3e7073['indexOf'](_0x496ad8);}for(let _0x100cd7=0x0,_0x36b909=_0x3f734e['length'];_0x100cd7<_0x36b909;_0x100cd7++){_0x21ea66+='%'+('00'+_0x3f734e['charCodeAt'](_0x100cd7)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x21ea66);};_0x5afe['CdxdOV']=_0x257abc,_0x5afe['cEOupa']={},_0x5afe['guwJVy']=!![];}const _0x587741=_0x23c9ad[0x0],_0x1d2bb4=_0x3ff8d6+_0x587741,_0x1c367e=_0x5afe['cEOupa'][_0x1d2bb4];return!_0x1c367e?(_0x5afe58=_0x5afe['CdxdOV'](_0x5afe58),_0x5afe['cEOupa'][_0x1d2bb4]=_0x5afe58):_0x5afe58=_0x1c367e,_0x5afe58;}(function(_0x500570,_0x49c572){function _0x323f3d(_0x4d6e49,_0x4ca735){return _0x5afe(_0x4ca735-0x4a,_0x4d6e49);}function _0x297903(_0x4d16c2,_0x3cd056){return _0x5afe(_0x3cd056-0x19f,_0x4d16c2);}const _0x20f928=_0x500570();while(!![]){try{const _0x407f15=-parseInt(_0x297903(0x38b,0x374))/0x1*(parseInt(_0x323f3d(0x20f,0x229))/0x2)+parseInt(_0x297903(0x3b4,0x398))/0x3+parseInt(_0x323f3d(0x24c,0x241))/0x4*(parseInt(_0x323f3d(0x22a,0x244))/0x5)+-parseInt(_0x323f3d(0x23a,0x24d))/0x6+-parseInt(_0x297903(0x3a4,0x390))/0x7+parseInt(_0x323f3d(0x232,0x23f))/0x8+parseInt(_0x323f3d(0x21a,0x22c))/0x9*(parseInt(_0x297903(0x375,0x36e))/0xa);if(_0x407f15===_0x49c572)break;else _0x20f928['push'](_0x20f928['shift']());}catch(_0x3d6b03){_0x20f928['push'](_0x20f928['shift']());}}}(_0x23c9,0x36742));import{randomBytes,createCipheriv,createDecipheriv,pbkdf2Sync}from'node:crypto';const ALGORITHM=_0x154548(0x5c3,0x5cc)+'m',KEY_LENGTH=0x20,IV_LENGTH=0xc,TAG_LENGTH=0x10,SALT_LENGTH=0x10,PBKDF2_ITERATIONS=0x186a0,PBKDF2_DIGEST='sha512';export function generateEncryptionKey(){function _0x1b7911(_0x5191bb,_0x20d540){return _0x154548(_0x20d540,_0x5191bb- -0x438);}const _0x12a6b9={'BtDJA':function(_0x1031cf,_0x3342c6){return _0x1031cf(_0x3342c6);}};return _0x12a6b9[_0x1b7911(0x18a,0x1a0)](randomBytes,KEY_LENGTH);}export function deriveKey(_0x22f461,_0x4dc5b7){const _0x4d9d0c={'iVZNx':function(_0x286e2d,_0x1c1e48,_0x32c390,_0x264a93,_0x58b3d2,_0x529844){return _0x286e2d(_0x1c1e48,_0x32c390,_0x264a93,_0x58b3d2,_0x529844);}};function _0x1520d9(_0x671692,_0x39a725){return _0x154548(_0x671692,_0x39a725- -0x61);}const _0x2b1279=_0x4dc5b7??randomBytes(SALT_LENGTH),_0x5e8fbd=_0x4d9d0c[_0x1520d9(0x56d,0x57c)](pbkdf2Sync,_0x22f461,_0x2b1279,PBKDF2_ITERATIONS,KEY_LENGTH,PBKDF2_DIGEST);return{'key':_0x5e8fbd,'salt':_0x2b1279};}export function encryptContent(_0x2a96d6,_0x4cf602){const _0x23a944={'ofIyq':function(_0xc1e2bb,_0x1307db){return _0xc1e2bb(_0x1307db);}};if(_0x4cf602[_0x1298f2(0x2ea,0x2d6)]!==KEY_LENGTH)throw new Error(_0x1298f2(0x2c5,0x2b1)+KEY_LENGTH+(_0x1832b3(-0x50,-0x5e)+_0x1832b3(-0x82,-0x8c))+_0x4cf602[_0x1298f2(0x2ea,0x2e1)]+')');function _0x1832b3(_0x4cc624,_0x2e6a0e){return _0x154548(_0x2e6a0e,_0x4cc624- -0x636);}const _0x2f081d=_0x23a944[_0x1298f2(0x2d7,0x2e3)](randomBytes,IV_LENGTH);function _0x1298f2(_0x3c47de,_0x5995f3){return _0x154548(_0x5995f3,_0x3c47de- -0x2f7);}const _0x27073d=createCipheriv(ALGORITHM,_0x4cf602,_0x2f081d),_0x8d3101=Buffer[_0x1298f2(0x2c1,0x2ca)](_0x2a96d6,_0x1832b3(-0x6c,-0x5a)),_0x2f94bd=Buffer[_0x1832b3(-0x71,-0x67)]([_0x27073d[_0x1298f2(0x2e8,0x2d9)](_0x8d3101),_0x27073d[_0x1298f2(0x2c3,0x2af)]()]),_0x56e630=_0x27073d[_0x1298f2(0x2d4,0x2e3)]();return{'ciphertext':_0x2f94bd['toString']('base64'),'iv':_0x2f081d[_0x1298f2(0x2ee,0x2e9)](_0x1832b3(-0x72,-0x5a)),'tag':_0x56e630['toString']('base64')};}function _0x154548(_0x1b6a76,_0x5976aa){return _0x5afe(_0x5976aa-0x3e1,_0x1b6a76);}export function decryptContent(_0x103bcf,_0x548282){const _0x30bdf5={'hbahZ':'base64','NcSUI':function(_0x55422e,_0x4583a2){return _0x55422e instanceof _0x4583a2;}};function _0xea2b1f(_0x5d4df2,_0x2e4ec7){return _0x154548(_0x2e4ec7,_0x5d4df2- -0x189);}if(_0x548282[_0xea2b1f(0x458,0x43f)]!==KEY_LENGTH)throw new Error(_0x4c8323(0x153,0x138)+KEY_LENGTH+('\x20bytes여야\x20합'+_0x4c8323(0x14b,0x136))+_0x548282[_0x4c8323(0x178,0x170)]+')');const _0x23e003=Buffer[_0x4c8323(0x14f,0x15e)](_0x103bcf['iv'],_0x4c8323(0x15b,0x160));function _0x4c8323(_0x1d0e28,_0x3efeab){return _0x154548(_0x3efeab,_0x1d0e28- -0x469);}const _0x52d320=Buffer[_0x4c8323(0x14f,0x149)](_0x103bcf['ciphertext'],_0x30bdf5[_0x4c8323(0x173,0x173)]),_0x3f90c0=Buffer['from'](_0x103bcf[_0xea2b1f(0x428,0x43e)],'base64'),_0x135404=createDecipheriv(ALGORITHM,_0x548282,_0x23e003);_0x135404['setAuthTag'](_0x3f90c0);try{const _0x859e65=Buffer[_0xea2b1f(0x43c,0x428)]([_0x135404['update'](_0x52d320),_0x135404[_0x4c8323(0x151,0x14f)]()]);return _0x859e65[_0xea2b1f(0x45c,0x460)]('utf-8');}catch(_0x17455a){if(_0x30bdf5[_0xea2b1f(0x444,0x439)](_0x17455a,Error))throw new Error(_0x4c8323(0x168,0x17a)+_0x17455a['message']+('\x20(잘못된\x20키\x20또는'+_0xea2b1f(0x43d,0x437)));throw _0x17455a;}}export function encryptEmbedding(_0x1018db,_0x207746){const _0x259d50={'IFNpu':function(_0x45cd7a,_0x243e47){return _0x45cd7a(_0x243e47);},'fcWLv':function(_0xd76384,_0x11e108,_0x247621,_0x780daf){return _0xd76384(_0x11e108,_0x247621,_0x780daf);},'WVgeq':_0x4f6a4a(0x2,-0x11)},_0xfcb72d=new Float64Array(_0x1018db),_0x315b7e=Buffer['from'](_0xfcb72d[_0x111613(0x4e6,0x4fe)]),_0x5c41b7=_0x259d50[_0x111613(0x514,0x523)](randomBytes,IV_LENGTH),_0x24fc26=_0x259d50['fcWLv'](createCipheriv,ALGORITHM,_0x207746,_0x5c41b7);function _0x111613(_0x5e775d,_0x48abe6){return _0x154548(_0x5e775d,_0x48abe6- -0xc0);}const _0xd8cf3c=Buffer['concat']([_0x24fc26['update'](_0x315b7e),_0x24fc26[_0x4f6a4a(-0x8,0x13)]()]),_0x48ca0f=_0x24fc26[_0x4f6a4a(0x9,0x23)](),_0x3626ef=Buffer['concat']([_0x5c41b7,_0x48ca0f,_0xd8cf3c]);function _0x4f6a4a(_0x5b9198,_0x2f7ecb){return _0x154548(_0x2f7ecb,_0x5b9198- -0x5c2);}return _0x3626ef[_0x4f6a4a(0x23,0x29)](_0x259d50['WVgeq']);}export function decryptEmbedding(_0x13ba96,_0x37eb45){const _0x1ce47b={'OYwVU':function(_0x47577d,_0x39e669){return _0x47577d+_0x39e669;},'LjMMO':_0x140b5c(0x1aa,0x1a1)+_0x140b5c(0x1a7,0x199)+'다','BFCOo':function(_0x44377e,_0x554030){return _0x44377e/_0x554030;},'xDLBY':function(_0x57565a,_0xb28c69){return _0x57565a instanceof _0xb28c69;}};function _0x140b5c(_0x2ac78f,_0x358e51){return _0x154548(_0x358e51,_0x2ac78f- -0x40b);}const _0xa3f1cb=Buffer[_0x27dbf5(0x256,0x25f)](_0x13ba96,'base64');if(_0xa3f1cb[_0x27dbf5(0x27f,0x272)]<_0x1ce47b['OYwVU'](IV_LENGTH,TAG_LENGTH))throw new Error(_0x1ce47b[_0x140b5c(0x1d5,0x1c8)]);const _0x5cef49=_0xa3f1cb[_0x27dbf5(0x273,0x28f)](0x0,IV_LENGTH),_0x1659d5=_0xa3f1cb[_0x27dbf5(0x273,0x263)](IV_LENGTH,IV_LENGTH+TAG_LENGTH),_0x502514=_0xa3f1cb[_0x140b5c(0x1ca,0x1ba)](IV_LENGTH+TAG_LENGTH),_0x206e4b=createDecipheriv(ALGORITHM,_0x37eb45,_0x5cef49);_0x206e4b[_0x27dbf5(0x26e,0x258)](_0x1659d5);function _0x27dbf5(_0x296f28,_0xf493a3){return _0x154548(_0xf493a3,_0x296f28- -0x362);}try{const _0x5bf497=Buffer['concat']([_0x206e4b[_0x27dbf5(0x27d,0x270)](_0x502514),_0x206e4b[_0x27dbf5(0x258,0x24a)]()]),_0x4a33f3=new Float64Array(_0x5bf497[_0x140b5c(0x1b3,0x1ab)],_0x5bf497[_0x27dbf5(0x257,0x26f)],_0x1ce47b[_0x140b5c(0x1c4,0x1cd)](_0x5bf497[_0x27dbf5(0x25f,0x261)],Float64Array['BYTES_PER_'+_0x140b5c(0x1bd,0x1be)]));return Array[_0x140b5c(0x1ad,0x19d)](_0x4a33f3);}catch(_0x58475c){if(_0x1ce47b['xDLBY'](_0x58475c,Error))throw new Error('임베딩\x20복호화\x20실패'+':\x20'+_0x58475c[_0x140b5c(0x1b0,0x197)]);throw _0x58475c;}}export function isValidEncryptedPayload(_0x3b1654){const _0x3ff7d6={'kcAzi':function(_0x1288c8,_0x27a789){return _0x1288c8!==_0x27a789;},'BtCeK':function(_0x3e495a,_0x5f1126){return _0x3e495a===_0x5f1126;}};function _0x3c1d35(_0x37ed1d,_0x45021c){return _0x154548(_0x45021c,_0x37ed1d- -0x400);}if(_0x3ff7d6[_0x3c1d35(0x1d9,0x1d1)](typeof _0x3b1654,_0x3c1d35(0x1e2,0x1dc))||_0x3b1654===null)return![];const _0xae06f0=_0x3b1654;function _0x11aab8(_0x114e9a,_0x57313e){return _0x154548(_0x57313e,_0x114e9a- -0x729);}return _0x3ff7d6[_0x3c1d35(0x1d3,0x1bc)](typeof _0xae06f0[_0x11aab8(-0x16c,-0x16c)],_0x11aab8(-0x162,-0x14d))&&_0x3ff7d6[_0x3c1d35(0x1d3,0x1c8)](typeof _0xae06f0['iv'],_0x11aab8(-0x162,-0x166))&&typeof _0xae06f0[_0x3c1d35(0x1b1,0x1cb)]===_0x3c1d35(0x1c7,0x1c5);}export function wrapEncryptedContent(_0x5d15e0){function _0x436670(_0x1bdd59,_0x11d41f){return _0x154548(_0x1bdd59,_0x11d41f- -0x1dd);}function _0x4f696c(_0x5e5142,_0x33e89a){return _0x154548(_0x33e89a,_0x5e5142- -0x608);}return JSON[_0x436670(0x418,0x401)]({'encrypted':!![],'data':_0x5d15e0['ciphertext'],'iv':_0x5d15e0['iv'],'tag':_0x5d15e0[_0x4f696c(-0x57,-0x42)]});}function _0x23c9(){const _0x200176=['C3rYAw5N','ruXftuvova','y3LkCfG','DxrMltG','z2v0qxv0AfrHzW','ywvZlti1nI1NyW','tMntvuK','B2zjExe','qKzdt28','C2v0qxv0AfrHzW','67o17zI47zMuioYlPo2mQdOG','mJqXnty4nNvKrLHPtW','qNrdzuS','v2PuBw0','C3vIyxjYyxK','mJa4mtiWsgvbrvru','zgf0yq','mtCYnJy3mM9nyLzlDa','A2nbEMK','odeXodq4zwXHC210','nwPdvMP6AG','AgjHAfO','AvzAtNG','C3rYAw5NAwz5','DxbKyxrL','tgPntu8','BgvUz3rO','B2jQzwn0','suzoChu','mJe0mZC3nMrvqK5Ira','Dg9tDhjPBMC','igj5DgvZ7jES7jw8io2vQq','CgfYC2u','mJiWnZbOy1Dmrwm','DgfN','7j207ysW6RcaioUeIoUSTcdSP6FSIRxRI4G','t3HTufO','64Ui64UKicJTMitSNQW6ia','7jwu7zI47zMu65cCioYEHoUYOoUuQsdRJBa','mZe0odG3B1rcAhfh','uxr5uxC','zNjVBq','yNL0zu9MzNnLDa','zMLUywW','BwvZC2fNzq','7jwu7zI47zMuio2cPoUkLca','y2LWAgvYDgv4Da','yNvMzMvY','zw5JCNLWDgvK','mLDrsNPqtq','yNL0zuXLBMD0Aa','qNresKe','mJa4og90A1POAW','yMfZzty0','y29Uy2f0','ioUnSoYDTo2eScdRS4dSOBaP'];_0x23c9=function(){return _0x200176;};return _0x23c9();}export function unwrapEncryptedContent(_0x884303){function _0x3b25c5(_0x3f2185,_0x5516bb){return _0x154548(_0x5516bb,_0x3f2185- -0xbd);}function _0x346d3e(_0x5328a3,_0x1cd198){return _0x154548(_0x5328a3,_0x1cd198- -0x5d8);}const _0x45a19b={'cyJpX':_0x346d3e(-0x29,-0xe),'kVQBR':_0x346d3e(0x5,-0x14),'WjTmm':function(_0x37f75a,_0x516cc0){return _0x37f75a!==_0x516cc0;},'QtyQw':_0x346d3e(-0xb,-0x11),'eTnIq':function(_0x4b315b,_0x4aed54){return _0x4b315b!==_0x4aed54;},'ywUkD':function(_0x8aa130,_0x312a41){return _0x8aa130!==_0x312a41;}};try{const _0x5bb04b=JSON[_0x346d3e(-0x32,-0x29)](_0x884303);if(_0x45a19b[_0x3b25c5(0x517,0x530)](_0x5bb04b[_0x346d3e(-0x27,-0x19)],!![]))return null;if(typeof _0x5bb04b[_0x3b25c5(0x51a,0x52b)]!==_0x3b25c5(0x50a,0x518)||typeof _0x5bb04b['iv']!==_0x45a19b[_0x3b25c5(0x4fa,0x4fa)]||_0x45a19b['eTnIq'](typeof _0x5bb04b['tag'],_0x346d3e(0x8,-0x11))){if(_0x45a19b['ywUkD'](_0x346d3e(-0x13,-0x25),'JyKAz'))return null;else{if(_0x1bd6fc[_0x346d3e(-0x9,0x9)]!==_0x41b582)throw new _0x41b943('암호화\x20키는\x20'+_0x1257a2+(_0x346d3e(0x1a,0xe)+_0x346d3e(-0xf,-0x24))+_0x2a01cd[_0x346d3e(0xe,0x9)]+')');const _0x1c7e3f=_0x117e0e(_0x42f39a),_0x350ca4=_0x1121b4(_0x2ce0d4,_0x5bbcc9,_0x1c7e3f),_0x271066=_0x15f5e9[_0x3b25c5(0x4fb,0x4e3)](_0x56c170,QkfYon[_0x3b25c5(0x50c,0x505)]),_0x5e099c=_0x6fb246['concat']([_0x350ca4['update'](_0x271066),_0x350ca4[_0x3b25c5(0x4fd,0x4f9)]()]),_0x3bdbc0=_0x350ca4[_0x3b25c5(0x50e,0x518)]();return{'ciphertext':_0x5e099c['toString']('base64'),'iv':_0x1c7e3f['toString'](QkfYon['kVQBR']),'tag':_0x3bdbc0['toString']('base64')};}}return{'ciphertext':_0x5bb04b[_0x346d3e(0x10,-0x1)],'iv':_0x5bb04b['iv'],'tag':_0x5bb04b[_0x346d3e(-0x2e,-0x27)]};}catch{return null;}}
@@ -1,12 +1 @@
1
- /**
2
- * Sync Module - A2A Server Synchronization
3
- */
4
- export { A2AClient } from './client.js';
5
- export { MemorySynchronizer } from './synchronizer.js';
6
- export { SyncQueue, mapCategory, mapTier } from './queue.js';
7
- export { LocalVectorClock } from './vector-clock.js';
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';
12
- //# sourceMappingURL=index.js.map
1
+ (function(_0xf11ed9,_0xef0936){var _0x230ea2=_0xf11ed9();function _0x5b9a0a(_0x358482,_0x42f57a){return _0x4852(_0x358482-0x191,_0x42f57a);}function _0x146142(_0xee7e05,_0x5555ed){return _0x4852(_0x5555ed-0x237,_0xee7e05);}while(!![]){try{var _0x233ecb=parseInt(_0x146142(0x35b,0x361))/0x1+parseInt(_0x146142(0x361,0x35e))/0x2*(-parseInt(_0x146142(0x35f,0x35f))/0x3)+parseInt(_0x5b9a0a(0x2b6,0x2ba))/0x4*(-parseInt(_0x5b9a0a(0x2b7,0x2b2))/0x5)+parseInt(_0x146142(0x364,0x362))/0x6+parseInt(_0x5b9a0a(0x2b2,0x2b7))/0x7*(-parseInt(_0x5b9a0a(0x2b5,0x2b1))/0x8)+-parseInt(_0x146142(0x35f,0x35a))/0x9*(parseInt(_0x5b9a0a(0x2ba,0x2bc))/0xa)+parseInt(_0x5b9a0a(0x2b3,0x2b0))/0xb;if(_0x233ecb===_0xef0936)break;else _0x230ea2['push'](_0x230ea2['shift']());}catch(_0x32175f){_0x230ea2['push'](_0x230ea2['shift']());}}}(_0x5bd4,0xcf7a9));export{A2AClient}from'./client.js';export{MemorySynchronizer}from'./synchronizer.js';export{SyncQueue,mapCategory,mapTier}from'./queue.js';function _0x4852(_0x3cef08,_0x1e9312){_0x3cef08=_0x3cef08-0x121;var _0x5bd42e=_0x5bd4();var _0x48529a=_0x5bd42e[_0x3cef08];if(_0x4852['ZWaFEW']===undefined){var _0x51e2bb=function(_0x3077b2){var _0x1a38e8='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x4f74ea='',_0x561fe8='';for(var _0x3d9647=0x0,_0x2cad24,_0x529c3f,_0x28d306=0x0;_0x529c3f=_0x3077b2['charAt'](_0x28d306++);~_0x529c3f&&(_0x2cad24=_0x3d9647%0x4?_0x2cad24*0x40+_0x529c3f:_0x529c3f,_0x3d9647++%0x4)?_0x4f74ea+=String['fromCharCode'](0xff&_0x2cad24>>(-0x2*_0x3d9647&0x6)):0x0){_0x529c3f=_0x1a38e8['indexOf'](_0x529c3f);}for(var _0x119840=0x0,_0x2cd6ff=_0x4f74ea['length'];_0x119840<_0x2cd6ff;_0x119840++){_0x561fe8+='%'+('00'+_0x4f74ea['charCodeAt'](_0x119840)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x561fe8);};_0x4852['vUGigk']=_0x51e2bb,_0x4852['HKPvRK']={},_0x4852['ZWaFEW']=!![];}var _0x1b988d=_0x5bd42e[0x0],_0x5eeda2=_0x3cef08+_0x1b988d,_0x29ece1=_0x4852['HKPvRK'][_0x5eeda2];return!_0x29ece1?(_0x48529a=_0x4852['vUGigk'](_0x48529a),_0x4852['HKPvRK'][_0x5eeda2]=_0x48529a):_0x48529a=_0x29ece1,_0x48529a;}export{LocalVectorClock}from'./vector-clock.js';function _0x5bd4(){var _0x1e4eee=['mtm0ndy0ntvVqM1rDvy','oty1nta4m0Lir2XuDG','ntKZmJbKrMvmsLC','ndi0Ag9XCu9Z','nta2nurJyMXjvq','mJi2z3rmtMv4','nde0otb4yNfrz0K','mtbxu25XAhO','mtm3mde3ohD4BgvIEG','nZq2otqWmgz0yxDVwa','mJmXz21urwLc'];_0x5bd4=function(){return _0x1e4eee;};return _0x5bd4();}export{TeamSynchronizer}from'./team-synchronizer.js';export{SyncScheduler}from'./scheduler.js';export{encryptContent,decryptContent,encryptEmbedding,decryptEmbedding,deriveKey,generateEncryptionKey,wrapEncryptedContent,unwrapEncryptedContent,isValidEncryptedPayload}from'./encryption.js';
@@ -1,214 +1 @@
1
- /**
2
- * Write-Behind Sync Queue
3
- *
4
- * 로컬 DB에 저장된 메모리를 원격 서버로 일괄 push합니다.
5
- * 로컬 DB = 캐시, 원격 서버 = Single Source of Truth.
6
- */
7
- import { createHash } from 'node:crypto';
8
- import { scoreQuality } from '../lifecycle/quality-scorer.js';
9
- // ============================================================
10
- // Category/Tier 매핑 (로컬 레거시 → 서버 호환)
11
- // ============================================================
12
- // Minimal LifecycleConfig required by scoreQuality (only ttlDays is used for freshness calc)
13
- const QUALITY_LIFECYCLE_CONFIG = {
14
- ttlDays: 90,
15
- maxMemories: 20000,
16
- cleanupOnSessionEnd: false,
17
- qualityThreshold: 0.3,
18
- };
19
- const CATEGORY_MAP = {
20
- preference: 'convention',
21
- };
22
- const TIER_MAP = {
23
- procedural: 'semantic',
24
- };
25
- /**
26
- * 로컬 category를 서버 호환 category로 변환
27
- */
28
- export function mapCategory(category) {
29
- return (CATEGORY_MAP[category] ?? category);
30
- }
31
- /**
32
- * 로컬 tier를 서버 호환 tier로 변환
33
- */
34
- export function mapTier(tier) {
35
- return (TIER_MAP[tier] ?? tier);
36
- }
37
- /**
38
- * 컨텐츠 해시 생성 (중복 제거용)
39
- */
40
- function computeContentHash(content) {
41
- return createHash('sha256').update(content.trim().toLowerCase()).digest('hex').substring(0, 16);
42
- }
43
- export class SyncQueue {
44
- db;
45
- client;
46
- constructor(db, client) {
47
- this.db = db;
48
- this.client = client;
49
- }
50
- /**
51
- * 메모리를 sync 대기 상태로 설정 (~1ms)
52
- */
53
- enqueue(memoryId) {
54
- this.db.setSyncStatus(memoryId, null, 'pending');
55
- }
56
- /**
57
- * pending 메모리를 배치로 일괄 push (100개씩)
58
- * 중복 제거: pending 내부 중복만 제거 (서버 측에서 synced 대비 중복은 처리)
59
- *
60
- * Parent-Child FK 안전:
61
- * 1단계 — Parent (parentId 없는 항목) push → remote_id 획득
62
- * 2단계 — Children의 parentId를 remote parent_id로 변환 후 push
63
- */
64
- async flush(options) {
65
- const startTime = Date.now();
66
- const timeoutMs = options?.timeoutMs ?? 300000; // 기본 5분
67
- const result = {
68
- pushed: 0,
69
- failed: 0,
70
- errors: [],
71
- duration: 0,
72
- syncedItems: [],
73
- };
74
- const BATCH_SIZE = 100;
75
- const pending = this.db.getPendingSyncMemories();
76
- if (pending.length === 0) {
77
- result.duration = Date.now() - startTime;
78
- return result;
79
- }
80
- // 중복 제거: pending 내부 중복만 제거 (서버 측에서 synced 대비 중복은 처리)
81
- const pendingHashes = new Map(); // hash → first memoryId
82
- const dedupedPending = pending.filter(m => {
83
- const hash = computeContentHash(m.content);
84
- if (pendingHashes.has(hash)) {
85
- // 중복이므로 synced로 마킹하고 건너뛰기
86
- this.db.setSyncStatus(m.id, null, 'synced');
87
- return false;
88
- }
89
- pendingHashes.set(hash, m.id);
90
- return true;
91
- });
92
- // Parent/독립 메모리와 Children 분리
93
- const parents = dedupedPending.filter(m => !m.parentId);
94
- const children = dedupedPending.filter(m => !!m.parentId);
95
- // local parent_id → remote parent_id 매핑
96
- // 이미 synced된 parent의 remote_id를 미리 조회
97
- const parentRemoteMap = new Map();
98
- for (const child of children) {
99
- if (child.parentId && !parentRemoteMap.has(child.parentId)) {
100
- const parentSync = this.db.getSyncStatus(child.parentId);
101
- if (parentSync?.remoteId) {
102
- parentRemoteMap.set(child.parentId, parentSync.remoteId);
103
- }
104
- }
105
- }
106
- // ── Phase 1: Parents + 독립 메모리 push ──
107
- await this.pushBatches(parents, BATCH_SIZE, startTime, timeoutMs, result, parentRemoteMap);
108
- // ── Phase 2: Children push (parent_id → remote_id 변환) ──
109
- if (children.length > 0 && (timeoutMs === 0 || Date.now() - startTime < timeoutMs)) {
110
- // 매핑 불가능한 children은 pending 유지
111
- const mappable = children.filter(m => parentRemoteMap.has(m.parentId));
112
- const unmappable = children.filter(m => !parentRemoteMap.has(m.parentId));
113
- if (unmappable.length > 0) {
114
- result.errors.push(`${unmappable.length}개 child — parent remote_id 미확인 (다음 flush에서 재시도)`);
115
- }
116
- await this.pushBatches(mappable, BATCH_SIZE, startTime, timeoutMs, result, parentRemoteMap);
117
- }
118
- result.duration = Date.now() - startTime;
119
- return result;
120
- }
121
- /**
122
- * 배치 단위 push 공통 로직
123
- * parentRemoteMap: push 성공 시 local_id→remote_id 매핑 업데이트 (Phase 1→Phase 2 전달용)
124
- */
125
- async pushBatches(items, batchSize, startTime, timeoutMs, result, parentRemoteMap) {
126
- for (let i = 0; i < items.length; i += batchSize) {
127
- if (timeoutMs > 0 && Date.now() - startTime > timeoutMs) {
128
- const remaining = items.length - i;
129
- result.errors.push(`타임아웃: ${remaining}개 미처리`);
130
- result.failed += remaining;
131
- break;
132
- }
133
- const batch = items.slice(i, i + batchSize);
134
- try {
135
- const batchResult = await this.client.createMemoriesBatch(batch.map((m) => {
136
- // quality_score: 이미 계산된 값이 있으면 사용, 없으면 실시간 계산
137
- const quality = m.qualityScore !== undefined
138
- ? m.qualityScore
139
- : scoreQuality(m, QUALITY_LIFECYCLE_CONFIG).overall;
140
- return {
141
- content: m.content,
142
- category: mapCategory(m.category),
143
- tier: mapTier(m.tier),
144
- tags: m.tags,
145
- created_at: m.createdAt,
146
- // Children: local parent_id → remote parent_id 변환
147
- parent_id: m.parentId ? parentRemoteMap.get(m.parentId) : undefined,
148
- chunk_index: m.chunkIndex ?? undefined,
149
- chunk_total: m.chunkTotal ?? undefined,
150
- quality_score: quality,
151
- };
152
- }));
153
- // 성공한 항목들 synced로 업데이트 + parentRemoteMap 갱신
154
- for (let j = 0; j < batchResult.ids.length; j++) {
155
- if (j < batch.length && batchResult.ids[j]) {
156
- this.db.setSyncStatus(batch[j].id, batchResult.ids[j], 'synced');
157
- // 이 항목이 다른 child의 parent일 수 있으므로 매핑 등록
158
- parentRemoteMap.set(batch[j].id, batchResult.ids[j]);
159
- result.syncedItems.push({ localId: batch[j].id, remoteId: batchResult.ids[j] });
160
- }
161
- }
162
- result.pushed += batchResult.created;
163
- result.failed += batchResult.failed;
164
- if (batchResult.errors.length > 0) {
165
- result.errors.push(...batchResult.errors);
166
- }
167
- }
168
- catch (error) {
169
- result.errors.push(`배치 실패: ${error instanceof Error ? error.message : String(error)}`);
170
- result.failed += batch.length;
171
- }
172
- }
173
- }
174
- /**
175
- * 미동기화 tombstone을 원격 서버에서 삭제
176
- */
177
- async flushTombstones() {
178
- const tombstones = this.db.getUnsyncedTombstones();
179
- let deleted = 0;
180
- const errors = [];
181
- for (const tombstone of tombstones) {
182
- const syncStatus = this.db.getSyncStatus(tombstone.memoryId);
183
- if (!syncStatus?.remoteId) {
184
- // 원격에 push된 적 없는 메모리 — tombstone만 synced 처리
185
- this.db.markTombstoneSynced(tombstone.memoryId);
186
- continue;
187
- }
188
- try {
189
- await this.client.deleteMemory(syncStatus.remoteId);
190
- this.db.markTombstoneSynced(tombstone.memoryId);
191
- deleted++;
192
- }
193
- catch (error) {
194
- const msg = error instanceof Error ? error.message : String(error);
195
- // 404는 이미 삭제된 것 — synced 처리
196
- if (msg.includes('404') || msg.includes('not found') || msg.includes('Not Found')) {
197
- this.db.markTombstoneSynced(tombstone.memoryId);
198
- deleted++;
199
- }
200
- else {
201
- errors.push(`삭제 실패 (${tombstone.memoryId}): ${msg}`);
202
- }
203
- }
204
- }
205
- return { deleted, errors };
206
- }
207
- /**
208
- * 대기 중인 메모리 수
209
- */
210
- getPendingCount() {
211
- return this.db.getPendingSyncMemories().length;
212
- }
213
- }
214
- //# sourceMappingURL=queue.js.map
1
+ (function(_0x1f772e,_0x28204c){function _0x44ddae(_0x5143bd,_0x53b0a8){return _0x27c6(_0x53b0a8-0x277,_0x5143bd);}function _0x28b93a(_0x5576c7,_0x2c69b9){return _0x27c6(_0x5576c7-0x1e3,_0x2c69b9);}const _0x5c70e4=_0x1f772e();while(!![]){try{const _0x325d3f=parseInt(_0x28b93a(0x3c7,0x3d6))/0x1*(parseInt(_0x44ddae(0x3e6,0x41d))/0x2)+parseInt(_0x44ddae(0x3f4,0x402))/0x3*(parseInt(_0x28b93a(0x3c4,0x3c4))/0x4)+-parseInt(_0x28b93a(0x394,0x3a6))/0x5*(parseInt(_0x44ddae(0x462,0x439))/0x6)+parseInt(_0x28b93a(0x3a1,0x3a3))/0x7+-parseInt(_0x28b93a(0x3b7,0x39b))/0x8*(parseInt(_0x28b93a(0x3c2,0x3cc))/0x9)+-parseInt(_0x44ddae(0x415,0x448))/0xa*(-parseInt(_0x44ddae(0x454,0x41f))/0xb)+-parseInt(_0x28b93a(0x37d,0x36b))/0xc*(-parseInt(_0x28b93a(0x3b6,0x3c4))/0xd);if(_0x325d3f===_0x28204c)break;else _0x5c70e4['push'](_0x5c70e4['shift']());}catch(_0x330301){_0x5c70e4['push'](_0x5c70e4['shift']());}}}(_0x488a,0x3e79f));import{createHash}from'node:crypto';import{scoreQuality}from'../lifecycle/quality-scorer.js';function _0x27c6(_0x3ff460,_0x4953dd){_0x3ff460=_0x3ff460-0x18b;const _0x488abf=_0x488a();let _0x27c661=_0x488abf[_0x3ff460];if(_0x27c6['wuVlDU']===undefined){var _0x4f521a=function(_0x5cf861){const _0x2baa55='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xbe4d17='',_0x4fa07d='';for(let _0x442829=0x0,_0x4b660a,_0x5cf52e,_0x2cad65=0x0;_0x5cf52e=_0x5cf861['charAt'](_0x2cad65++);~_0x5cf52e&&(_0x4b660a=_0x442829%0x4?_0x4b660a*0x40+_0x5cf52e:_0x5cf52e,_0x442829++%0x4)?_0xbe4d17+=String['fromCharCode'](0xff&_0x4b660a>>(-0x2*_0x442829&0x6)):0x0){_0x5cf52e=_0x2baa55['indexOf'](_0x5cf52e);}for(let _0x341e64=0x0,_0x4b6ac6=_0xbe4d17['length'];_0x341e64<_0x4b6ac6;_0x341e64++){_0x4fa07d+='%'+('00'+_0xbe4d17['charCodeAt'](_0x341e64)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4fa07d);};_0x27c6['JdBzjv']=_0x4f521a,_0x27c6['SfQFOD']={},_0x27c6['wuVlDU']=!![];}const _0x560851=_0x488abf[0x0],_0x436001=_0x3ff460+_0x560851,_0xe64ee6=_0x27c6['SfQFOD'][_0x436001];return!_0xe64ee6?(_0x27c661=_0x27c6['JdBzjv'](_0x27c661),_0x27c6['SfQFOD'][_0x436001]=_0x27c661):_0x27c661=_0xe64ee6,_0x27c661;}const QUALITY_LIFECYCLE_CONFIG={'ttlDays':0x5a,'maxMemories':0x4e20,'cleanupOnSessionEnd':![],'qualityThreshold':0.3};function _0x1320f9(_0x4a9852,_0x5ab68e){return _0x27c6(_0x5ab68e-0x7c,_0x4a9852);}function _0x1f64bc(_0x256945,_0x28dec2){return _0x27c6(_0x28dec2- -0x1b9,_0x256945);}const CATEGORY_MAP={'preference':_0x1320f9(0x1ea,0x21d)},TIER_MAP={'procedural':_0x1f64bc(-0x7,-0x2a)};export function mapCategory(_0x3278de){return CATEGORY_MAP[_0x3278de]??_0x3278de;}function _0x488a(){const _0xa1d6d=['icJRI6tSNyWGzMX1C2G','uhbwyuW','CvjYzNe','zhvYyxrPB24','C2v0u3LUy1n0yq','y29UDMvUDgLVBG','CMvTB3rLswq','A2vkqKi','6RcCioUVUoYYMoUMRa','EeroA1q','odzfCuHvyuy','y2XPzw50','mteWotL3t2jXqxK','y2f0zwDVCNK','Dg9mB3DLCKnHCW','seXxDxG','uKPqALi','B3zLCMfSBa','zMfPBgvK','z2v0vw5ZEw5Jzq','y3jLyxrLzef0','mJeYmtiZnvv2ExvRra','Egjgu0C','CgfYzw50swq','zMX1C2G','DxbKyxrL','C3vIC3rYAw5N','z2v0','Aw5JBhvKzxm','7ikT7kcCioYlPo2mQcaO','y29UDgvUDa','AgfZ','tM90iezVDw5K','DMrKEe8','mJGXmdG4nxvTvKLHsa','zMLSDgvY','y0vIAgS','BM90igzVDw5K','nMHerND3Bq','zfrVBwjZDg9Uzq','DgfNCW','wgTiCeq','DgLTzw91De1Z','q2XOEKe','y2H1BMTjBMrLEa','BwvTB3j5swq','t2D0uwK','u1HQzvq','CgfYzw50ihjLBq','nda0','Eu15Au0','ChvZAejHDgnOzq','zMX1C2HuB21ICW','ndeZmhLhvuHVrG','DxbKyxrLtwvTBW','mZG4n0TStezXzG','mtC1mZC0ngXPufDfDa','AfL5CvO','z2v0u3LUy1n0yq','sK1drLK','tKrIt2i','C2XPy2u','BwfYA1rVBwjZDa','rgzergK','ktOG','s0jzyvK','AKv6txq','mtHuvgzAv28','y3jLyxrLtwvTBW','mJq3mMvzzefrBa','DgLLCG','CxvHBgL0EvnJBW','mtq4n1rysfjzAG','C3LUy2vK','BgvUz3rO','q291BNq','DhjPBq','vfDMzhG','Agv4','u3LUy01LBw9YAq','BM93','C2v0','C0ncALy','B25Lu3LUy2vK','CMLLC0jHDgnO','q3npuvC','7yoa7j6e7jwe7jUdoIa','r0vWs0i','Bw9zuu4','uensufu','C2HHmJu2','Dg9Uzxm','ChvZAa','mtu5AMLmzezM','zgLNzxn0','AwrZ','ven3wKu','C2vTyw50Awm','z2v0ugvUzgLUzW','y3jLyxrLza','zw5XDwv1zq','6RcCignOAwXKiokaLca','C3LUy2vKsxrLBq','B3rLx2LKioUVUo2zLEYDUa','v1jvAhO','sMnfBxK','DhvZ','zxjYB3jZ','ode3mMzkzgHevW','y2H1BMTuB3rHBa'];_0x488a=function(){return _0xa1d6d;};return _0x488a();}export function mapTier(_0x3c0d65){return TIER_MAP[_0x3c0d65]??_0x3c0d65;}function computeContentHash(_0x5f21e9){function _0x322d5a(_0x231939,_0x80e5c8){return _0x1f64bc(_0x80e5c8,_0x231939-0x392);}const _0x4ff00c={'ClhzA':_0x84d117(-0xdc,-0xbd)};function _0x84d117(_0xc697d2,_0x125d7a){return _0x1f64bc(_0xc697d2,_0x125d7a- -0xfa);}return createHash(_0x4ff00c[_0x84d117(-0xf7,-0xec)])[_0x322d5a(0x38e,0x395)](_0x5f21e9[_0x84d117(-0xe7,-0xcb)]()[_0x322d5a(0x383,0x3ad)+'e']())[_0x322d5a(0x365,0x370)](_0x322d5a(0x3c3,0x3e1))[_0x322d5a(0x38f,0x363)](0x0,0x10);}export class SyncQueue{['db'];[_0x1f64bc(-0x42,-0x12)];constructor(_0x46f00b,_0x3573f0){function _0xc51f02(_0x8c3c4d,_0x1001bf){return _0x1f64bc(_0x1001bf,_0x8c3c4d-0xba);}this['db']=_0x46f00b,this[_0xc51f02(0xa8,0xa6)]=_0x3573f0;}[_0x1f64bc(-0x26,-0x27)](_0x5ddc3c){function _0x37552f(_0x46fcb1,_0x17cb8b){return _0x1320f9(_0x46fcb1,_0x17cb8b-0x24f);}function _0x16ea3a(_0x591432,_0x4cf66d){return _0x1320f9(_0x591432,_0x4cf66d-0xbb);}const _0x2cc296={'IJCTc':'pending'};this['db'][_0x37552f(0x495,0x46b)+_0x16ea3a(0x2a1,0x2cf)](_0x5ddc3c,null,_0x2cc296['IJCTc']);}async[_0x1320f9(0x265,0x230)](_0x42d5f1){const _0x2fc4c3={'xJhbA':_0x1b2413(-0x16b,-0x1a1),'SXjeT':function(_0x419586,_0x255730){return _0x419586===_0x255730;},'hYyqZ':function(_0x258d4d,_0x5ac326){return _0x258d4d-_0x5ac326;},'NDbOb':function(_0x578b7d,_0x16021a){return _0x578b7d>_0x16021a;},'CsOQW':function(_0x2702ad,_0x4ffde2){return _0x2702ad===_0x4ffde2;},'WRUhz':function(_0x18a7da,_0x53883b){return _0x18a7da<_0x53883b;},'KBYaY':_0x4caa74(0x5d4,0x5ea)},_0x238195=Date[_0x1b2413(-0x170,-0x19a)](),_0x2c5b6e=_0x42d5f1?.[_0x1b2413(-0x1d9,-0x1c0)]??0x493e0;function _0x4caa74(_0x2671b6,_0x3afe89){return _0x1f64bc(_0x3afe89,_0x2671b6-0x59f);}const _0x8e78ec={'pushed':0x0,'failed':0x0,'errors':[],'duration':0x0,'syncedItems':[]};function _0x1b2413(_0x5a9a69,_0x14d4cb){return _0x1f64bc(_0x5a9a69,_0x14d4cb- -0x1cd);}const _0x362e9b=0x64,_0x6c868a=this['db'][_0x1b2413(-0x209,-0x1f6)+'SyncMemori'+'es']();if(_0x2fc4c3[_0x4caa74(0x5b1,0x5bb)](_0x6c868a[_0x1b2413(-0x1b7,-0x1a0)],0x0))return _0x8e78ec[_0x4caa74(0x585,0x565)]=_0x2fc4c3[_0x1b2413(-0x1a1,-0x1b1)](Date[_0x4caa74(0x5d2,0x5ba)](),_0x238195),_0x8e78ec;const _0x33d200=new Map(),_0x378c1f=_0x6c868a[_0x4caa74(0x5a5,0x59c)](_0x5623c6=>{function _0x4ca03c(_0xfa22a6,_0x252e79){return _0x1b2413(_0xfa22a6,_0x252e79-0xec);}const _0x5b095e=computeContentHash(_0x5623c6[_0x3b93db(0x43b,0x41b)]);if(_0x33d200[_0x4ca03c(-0xca,-0xdf)](_0x5b095e))return this['db'][_0x4ca03c(-0x12e,-0xfa)+_0x3b93db(0x3cc,0x3f9)](_0x5623c6['id'],null,_0x2fc4c3['xJhbA']),![];_0x33d200[_0x3b93db(0x484,0x44e)](_0x5b095e,_0x5623c6['id']);function _0x3b93db(_0x367db1,_0x2e70f7){return _0x1b2413(_0x367db1,_0x2e70f7-0x5e7);}return!![];}),_0xa37457=_0x378c1f[_0x1b2413(-0x1a9,-0x1c7)](_0x195181=>!_0x195181[_0x4caa74(0x599,0x599)]),_0x454ee6=_0x378c1f[_0x4caa74(0x5a5,0x5d4)](_0x171efd=>!!_0x171efd['parentId']),_0x236f30=new Map();for(const _0x4952d2 of _0x454ee6){if(_0x4952d2['parentId']&&!_0x236f30[_0x1b2413(-0x1ba,-0x1cb)](_0x4952d2[_0x1b2413(-0x1e1,-0x1d3)])){const _0x13e644=this['db'][_0x4caa74(0x5bc,0x58c)+_0x1b2413(-0x1ce,-0x1ee)](_0x4952d2[_0x4caa74(0x599,0x574)]);_0x13e644?.[_0x4caa74(0x588,0x592)]&&_0x236f30[_0x1b2413(-0x19e,-0x199)](_0x4952d2['parentId'],_0x13e644['remoteId']);}}await this['pushBatche'+'s'](_0xa37457,_0x362e9b,_0x238195,_0x2c5b6e,_0x8e78ec,_0x236f30);if(_0x2fc4c3[_0x1b2413(-0x1b0,-0x1ae)](_0x454ee6[_0x4caa74(0x5cc,0x5db)],0x0)&&(_0x2fc4c3[_0x4caa74(0x5d7,0x5c6)](_0x2c5b6e,0x0)||_0x2fc4c3[_0x4caa74(0x57c,0x545)](Date[_0x4caa74(0x5d2,0x5f6)]()-_0x238195,_0x2c5b6e))){if(_0x2fc4c3[_0x4caa74(0x5c3,0x59b)]!==_0x1b2413(-0x178,-0x198))return _0x127efe[_0x1ba93b]??_0x4ff57b;else{const _0x3a92e5=_0x454ee6[_0x4caa74(0x5a5,0x5ab)](_0x8d7164=>_0x236f30[_0x1b2413(-0x1fb,-0x1cb)](_0x8d7164[_0x1b2413(-0x201,-0x1d3)])),_0x49457c=_0x454ee6[_0x1b2413(-0x1b7,-0x1c7)](_0x3871e2=>!_0x236f30[_0x4caa74(0x5a1,0x5d6)](_0x3871e2[_0x1b2413(-0x1e8,-0x1d3)]));_0x2fc4c3[_0x4caa74(0x5be,0x5ec)](_0x49457c[_0x1b2413(-0x16c,-0x1a0)],0x0)&&_0x8e78ec['errors']['push'](_0x49457c[_0x4caa74(0x5cc,0x5dc)]+('개\x20child\x20—\x20'+_0x4caa74(0x5b2,0x5db)+_0x1b2413(-0x1ee,-0x1f1)+_0x1b2413(-0x20a,-0x1ea)+'에서\x20재시도)')),await this[_0x1b2413(-0x18d,-0x1b7)+'s'](_0x3a92e5,_0x362e9b,_0x238195,_0x2c5b6e,_0x8e78ec,_0x236f30);}}return _0x8e78ec[_0x4caa74(0x585,0x567)]=_0x2fc4c3[_0x4caa74(0x5bb,0x59a)](Date[_0x4caa74(0x5d2,0x5b5)](),_0x238195),_0x8e78ec;}async['pushBatche'+'s'](_0x49cef6,_0x11adfb,_0x274952,_0x4efe79,_0x349bd6,_0x563c09){function _0x846c4(_0x5b0edb,_0xd91fce){return _0x1f64bc(_0x5b0edb,_0xd91fce-0x30a);}function _0x2370a4(_0x93751a,_0xa1c2b7){return _0x1f64bc(_0xa1c2b7,_0x93751a-0x5c);}const _0x130ff9={'OgtQi':_0x846c4(0x342,0x328),'DfDDi':function(_0x139906,_0x1672f2){return _0x139906!==_0x1672f2;},'TCwZE':function(_0x46ffe8,_0x4480c1,_0x487d53){return _0x46ffe8(_0x4480c1,_0x487d53);},'MwVYK':function(_0x90c522,_0x4288c0){return _0x90c522(_0x4288c0);},'JcEmy':function(_0x368dde,_0x51a59f){return _0x368dde>_0x51a59f;},'keJBB':function(_0x3f8fe7,_0x1bd282){return _0x3f8fe7-_0x1bd282;},'vddxO':'EcLdI','TWfdx':function(_0x39c176,_0xb69355){return _0x39c176===_0xb69355;},'GEpKB':function(_0x2cbddd,_0x124834){return _0x2cbddd===_0x124834;},'yMyiM':_0x2370a4(0x81,0x9a),'cEbhk':_0x846c4(0x304,0x336),'GNwLB':function(_0x2d83ba,_0x2a6254){return _0x2d83ba>_0x2a6254;},'RJPjR':function(_0x3a3111,_0xecd0f7){return _0x3a3111!==_0xecd0f7;}};for(let _0x5b84ef=0x0;_0x5b84ef<_0x49cef6[_0x2370a4(0x89,0x5e)];_0x5b84ef+=_0x11adfb){if(_0x130ff9[_0x846c4(0x33e,0x32c)](_0x2370a4(0x48,0x38),_0x2370a4(0x55,0x6e))){if(_0x4efe79>0x0&&_0x130ff9[_0x2370a4(0x3a,0x4b)](Date[_0x2370a4(0x8f,0x66)]()-_0x274952,_0x4efe79)){const _0x3c2378=_0x130ff9[_0x2370a4(0x46,0x36)](_0x49cef6['length'],_0x5b84ef);_0x349bd6['errors']['push'](_0x846c4(0x340,0x343)+_0x3c2378+_0x2370a4(0x47,0x23)),_0x349bd6[_0x2370a4(0x51,0x52)]+=_0x3c2378;break;}const _0x53b436=_0x49cef6[_0x2370a4(0x7c,0x84)](_0x5b84ef,_0x5b84ef+_0x11adfb);try{const _0x5c55fb=new Map(),_0x19cab5=await this['client'][_0x2370a4(0x83,0xa5)+_0x846c4(0x34b,0x341)](_0x53b436['map'](_0x10ef7d=>{function _0x398425(_0x5347fd,_0x47f61a){return _0x2370a4(_0x47f61a- -0x217,_0x5347fd);}function _0x4fcaa1(_0x18ae4b,_0x1f9685){return _0x2370a4(_0x1f9685- -0x218,_0x18ae4b);}if(_0x130ff9['OgtQi']!==_0x130ff9[_0x4fcaa1(-0x1b0,-0x1ab)])_0x13c8c2[_0x4fcaa1(-0x1ac,-0x188)](_0x3dc83a[_0x398425(-0x1e2,-0x1c1)],_0x500726['remoteId']);else{const _0x59351b=_0x130ff9[_0x4fcaa1(-0x187,-0x19a)](_0x10ef7d[_0x398425(-0x18f,-0x191)+'re'],undefined)?_0x10ef7d[_0x4fcaa1(-0x17a,-0x192)+'re']:_0x130ff9[_0x398425(-0x1ee,-0x1e6)](scoreQuality,_0x10ef7d,QUALITY_LIFECYCLE_CONFIG)[_0x4fcaa1(-0x1ce,-0x1c8)];return _0x5c55fb[_0x398425(-0x197,-0x187)](_0x10ef7d['id'],_0x59351b),{'content':_0x10ef7d[_0x4fcaa1(-0x1b9,-0x1bb)],'category':mapCategory(_0x10ef7d[_0x4fcaa1(-0x1f8,-0x1cc)]),'tier':_0x130ff9['MwVYK'](mapTier,_0x10ef7d[_0x398425(-0x198,-0x192)]),'tags':_0x10ef7d[_0x398425(-0x1b7,-0x1b0)],'created_at':_0x10ef7d[_0x398425(-0x1e9,-0x1c4)],'parent_id':_0x10ef7d[_0x4fcaa1(-0x1ea,-0x1c2)]?_0x563c09[_0x4fcaa1(-0x1a3,-0x1be)](_0x10ef7d[_0x398425(-0x1a1,-0x1c1)]):undefined,'chunk_index':_0x10ef7d[_0x4fcaa1(-0x186,-0x1ad)]??undefined,'chunk_total':_0x10ef7d[_0x398425(-0x210,-0x1d9)]??undefined,'quality_score':_0x59351b};}}));for(let _0x5dc25e=0x0;_0x5dc25e<_0x19cab5['ids'][_0x2370a4(0x89,0xbe)];_0x5dc25e++){if(_0x846c4(0x2ee,0x316)!==_0x130ff9[_0x2370a4(0x60,0x6a)]){if(_0x5dc25e<_0x53b436['length']&&_0x19cab5[_0x2370a4(0x30,0x67)][_0x5dc25e]){const _0x30cc8b=_0x53b436[_0x5dc25e]['id'],_0x559b71=_0x5c55fb[_0x2370a4(0x5a,0x28)](_0x30cc8b);if(_0x559b71!==undefined&&_0x130ff9[_0x2370a4(0x8c,0x97)](_0x53b436[_0x5dc25e][_0x2370a4(0x86,0xab)+'re'],undefined)){if(_0x130ff9[_0x846c4(0x356,0x344)](_0x130ff9[_0x2370a4(0x71,0x4a)],_0x846c4(0x35d,0x345)))_0x1c0cd3[_0x2370a4(0x9b,0x99)]('삭제\x20실패\x20('+_0x5db84e[_0x846c4(0x33e,0x31a)]+_0x846c4(0x322,0x32d)+_0x54de32);else try{this['db'][_0x2370a4(0x75,0x89)+'ry'](_0x30cc8b,{'qualityScore':_0x559b71});}catch{}}this['db'][_0x2370a4(0x43,0x17)+_0x2370a4(0x3b,0x36)](_0x30cc8b,_0x19cab5[_0x2370a4(0x30,0x45)][_0x5dc25e],_0x130ff9[_0x846c4(0x321,0x311)]),_0x563c09[_0x846c4(0x33c,0x33e)](_0x30cc8b,_0x19cab5[_0x2370a4(0x30,0x65)][_0x5dc25e]),_0x349bd6[_0x846c4(0x305,0x2e5)+'s'][_0x2370a4(0x9b,0xa7)]({'localId':_0x30cc8b,'remoteId':_0x19cab5[_0x2370a4(0x30,0x5f)][_0x5dc25e]});}}else this['db'][_0x846c4(0x315,0x323)+'ry'](_0x302feb,{'qualityScore':_0x5d2fdd});}_0x349bd6['pushed']+=_0x19cab5[_0x2370a4(0x34,0x5c)],_0x349bd6[_0x2370a4(0x51,0x3f)]+=_0x19cab5[_0x2370a4(0x51,0x65)],_0x130ff9['GNwLB'](_0x19cab5[_0x2370a4(0x3c,0x65)][_0x2370a4(0x89,0xb7)],0x0)&&(_0x130ff9[_0x846c4(0x2d6,0x2fd)]('qRrfq',_0x846c4(0x2c8,0x2ef))?_0xba888[_0x2370a4(0x3c,0x69)]['push'](_0x141c77[_0x846c4(0x31c,0x337)]+(_0x2370a4(0x36,0x5)+'parent\x20rem'+_0x2370a4(0x38,0x40)+_0x846c4(0x305,0x2ed)+'에서\x20재시도)')):_0x349bd6[_0x2370a4(0x3c,0xc)][_0x846c4(0x36d,0x349)](..._0x19cab5['errors']));}catch(_0x3ad0dc){_0x349bd6[_0x846c4(0x317,0x2ea)][_0x846c4(0x375,0x349)]('배치\x20실패:\x20'+(_0x3ad0dc instanceof Error?_0x3ad0dc['message']:String(_0x3ad0dc))),_0x349bd6[_0x2370a4(0x51,0x1b)]+=_0x53b436[_0x846c4(0x324,0x337)];}}else this['db'][_0x846c4(0x309,0x32b)+_0x846c4(0x327,0x340)](_0x10b8aa[_0x2370a4(0x6c,0x90)]),_0x2e5f05++;}}async[_0x1f64bc(0x3d,0x17)+_0x1f64bc(0x4d,0x3e)](){function _0x3588d9(_0x6aa981,_0x58b965){return _0x1320f9(_0x6aa981,_0x58b965- -0x35a);}const _0x18cff2={'HLWux':function(_0x2a38c4,_0x4d1040){return _0x2a38c4 instanceof _0x4d1040;},'LeXsX':function(_0x44856e,_0x237119){return _0x44856e(_0x237119);},'PpVaL':_0x3d04b0(0x451,0x455),'PCRPU':_0x3d04b0(0x478,0x444)},_0x32e40a=this['db'][_0x3588d9(-0xfa,-0x12f)+_0x3d04b0(0x46d,0x44b)+'s']();let _0x1b22d6=0x0;function _0x3d04b0(_0x4fc72a,_0x266e79){return _0x1320f9(_0x4fc72a,_0x266e79-0x20c);}const _0x330123=[];for(const _0x1148ae of _0x32e40a){const _0x2e630f=this['db'][_0x3d04b0(0x439,0x45e)+'tus'](_0x1148ae[_0x3588d9(-0x130,-0x115)]);if(!_0x2e630f?.[_0x3d04b0(0x419,0x42a)]){this['db'][_0x3d04b0(0x478,0x462)+'oneSynced'](_0x1148ae[_0x3d04b0(0x476,0x451)]);continue;}try{await this[_0x3588d9(-0x155,-0x137)]['deleteMemo'+'ry'](_0x2e630f[_0x3d04b0(0x406,0x42a)]),this['db'][_0x3d04b0(0x488,0x462)+_0x3d04b0(0x458,0x477)](_0x1148ae[_0x3588d9(-0x148,-0x115)]),_0x1b22d6++;}catch(_0x5770f4){const _0x3842e5=_0x18cff2[_0x3d04b0(0x40c,0x433)](_0x5770f4,Error)?_0x5770f4['message']:_0x18cff2['LeXsX'](String,_0x5770f4);_0x3842e5['includes'](_0x18cff2[_0x3588d9(-0x157,-0x141)])||_0x3842e5[_0x3d04b0(0x463,0x440)](_0x3d04b0(0x439,0x449))||_0x3842e5[_0x3588d9(-0xfe,-0x126)](_0x18cff2[_0x3d04b0(0x46f,0x47d)])?(this['db'][_0x3d04b0(0x445,0x462)+_0x3588d9(-0xfc,-0xef)](_0x1148ae['memoryId']),_0x1b22d6++):_0x330123[_0x3588d9(-0x100,-0xe6)](_0x3d04b0(0x43a,0x441)+_0x1148ae[_0x3588d9(-0x106,-0x115)]+'):\x20'+_0x3842e5);}}return{'deleted':_0x1b22d6,'errors':_0x330123};}[_0x1320f9(0x22f,0x20c)+_0x1320f9(0x289,0x263)](){function _0x185e14(_0x12b000,_0x3de859){return _0x1f64bc(_0x3de859,_0x12b000-0x1a2);}function _0x8ce969(_0x5cc89a,_0x473109){return _0x1f64bc(_0x5cc89a,_0x473109-0x4ef);}return this['db'][_0x185e14(0x179,0x162)+_0x185e14(0x1d4,0x1d3)+'es']()[_0x8ce969(0x547,0x51c)];}}
@@ -1,140 +1 @@
1
- /**
2
- * Sync Scheduler
3
- *
4
- * 주기적으로 MemorySynchronizer.sync()를 실행하는 스케줄러.
5
- * CLI `sync --watch` 또는 라이브러리로 사용 가능.
6
- */
7
- export class SyncScheduler {
8
- synchronizer;
9
- options;
10
- logger;
11
- timer = null;
12
- running = false;
13
- syncing = false;
14
- syncCount = 0;
15
- lastSyncAt = null;
16
- lastResult = null;
17
- startedAt = null;
18
- constructor(synchronizer, options, logger) {
19
- this.synchronizer = synchronizer;
20
- this.options = options;
21
- this.logger = logger;
22
- }
23
- /**
24
- * 스케줄러 시작
25
- */
26
- async start() {
27
- if (this.running) {
28
- this.logger?.warn('Scheduler already running');
29
- return;
30
- }
31
- if (this.options.intervalMs <= 0) {
32
- this.logger?.warn('Scheduler disabled (intervalMs <= 0)');
33
- return;
34
- }
35
- this.running = true;
36
- this.startedAt = new Date();
37
- this.logger?.info('Scheduler started', { intervalMs: this.options.intervalMs });
38
- // 시작 시 즉시 sync (기본 동작)
39
- if (this.options.syncOnStart !== false) {
40
- await this.tick();
41
- }
42
- this.timer = setInterval(() => {
43
- this.tick().catch((err) => {
44
- this.logger?.error('Scheduler tick error', err instanceof Error ? err : new Error(String(err)));
45
- });
46
- }, this.options.intervalMs);
47
- // unref: Node.js 프로세스가 타이머 때문에 종료되지 않는 것을 방지
48
- if (this.timer && typeof this.timer === 'object' && 'unref' in this.timer) {
49
- this.timer.unref();
50
- }
51
- }
52
- /**
53
- * 스케줄러 중지
54
- */
55
- stop() {
56
- if (!this.running)
57
- return;
58
- if (this.timer) {
59
- clearInterval(this.timer);
60
- this.timer = null;
61
- }
62
- this.running = false;
63
- this.logger?.info('Scheduler stopped', { syncCount: this.syncCount });
64
- }
65
- /**
66
- * 실행 중 여부
67
- */
68
- isRunning() {
69
- return this.running;
70
- }
71
- /**
72
- * 현재 sync 중 여부
73
- */
74
- isSyncing() {
75
- return this.syncing;
76
- }
77
- /**
78
- * 스케줄러 상태
79
- */
80
- getStatus() {
81
- let nextSyncAt = null;
82
- if (this.running && this.lastSyncAt) {
83
- const next = new Date(this.lastSyncAt.getTime() + this.options.intervalMs);
84
- nextSyncAt = next.toISOString();
85
- }
86
- else if (this.running && this.startedAt) {
87
- const next = new Date(this.startedAt.getTime() + this.options.intervalMs);
88
- nextSyncAt = next.toISOString();
89
- }
90
- return {
91
- running: this.running,
92
- syncing: this.syncing,
93
- syncCount: this.syncCount,
94
- lastSyncAt: this.lastSyncAt?.toISOString() ?? null,
95
- lastResult: this.lastResult,
96
- intervalMs: this.options.intervalMs,
97
- nextSyncAt,
98
- };
99
- }
100
- /**
101
- * 수동으로 즉시 sync 실행 (스케줄러 타이머와 무관)
102
- */
103
- async syncNow() {
104
- return this.tick();
105
- }
106
- /**
107
- * 한 번의 sync 사이클
108
- */
109
- async tick() {
110
- if (this.syncing) {
111
- this.logger?.debug('Sync already in progress, skipping');
112
- return null;
113
- }
114
- this.syncing = true;
115
- try {
116
- const result = await this.synchronizer.sync();
117
- this.syncCount++;
118
- this.lastSyncAt = new Date();
119
- this.lastResult = result;
120
- this.logger?.info('Sync completed', {
121
- pushed: result.pushed,
122
- pulled: result.pulled,
123
- errors: result.errors.length,
124
- duration: result.duration,
125
- });
126
- this.options.onSync?.(result);
127
- return result;
128
- }
129
- catch (error) {
130
- const err = error instanceof Error ? error : new Error(String(error));
131
- this.logger?.error('Sync failed', err);
132
- this.options.onError?.(err);
133
- return null;
134
- }
135
- finally {
136
- this.syncing = false;
137
- }
138
- }
139
- }
140
- //# sourceMappingURL=scheduler.js.map
1
+ (function(_0x4badd5,_0x1acb37){const _0x2e5995=_0x4badd5();function _0x3e558f(_0x406245,_0x27fd02){return _0xae96(_0x406245- -0x286,_0x27fd02);}function _0x10ee87(_0x4d7d59,_0x313ce7){return _0xae96(_0x313ce7- -0x99,_0x4d7d59);}while(!![]){try{const _0x569332=-parseInt(_0x10ee87(0x15f,0x15a))/0x1*(-parseInt(_0x10ee87(0x15f,0x14e))/0x2)+parseInt(_0x3e558f(-0x9c,-0x7a))/0x3+parseInt(_0x3e558f(-0x5d,-0x80))/0x4+parseInt(_0x3e558f(-0x68,-0x81))/0x5*(parseInt(_0x10ee87(0x14d,0x160))/0x6)+parseInt(_0x10ee87(0x150,0x16c))/0x7+parseInt(_0x10ee87(0x164,0x165))/0x8*(-parseInt(_0x3e558f(-0x7f,-0x83))/0x9)+-parseInt(_0x3e558f(-0xa0,-0xaa))/0xa*(parseInt(_0x10ee87(0x192,0x186))/0xb);if(_0x569332===_0x1acb37)break;else _0x2e5995['push'](_0x2e5995['shift']());}catch(_0x6aaf81){_0x2e5995['push'](_0x2e5995['shift']());}}}(_0x1939,0xcc865));function _0x3dbcc2(_0x27d397,_0x4028da){return _0xae96(_0x4028da- -0x224,_0x27d397);}function _0xd2ce9c(_0x5ecd61,_0x55b245){return _0xae96(_0x55b245- -0xfe,_0x5ecd61);}function _0x1939(){const _0x157b87=['Aw50zxj2ywXnCW','sLbyqwS','zgLZywjSzwqGka','C3rHCNq','uw1Vy3C','B2jQzwn0','mJKWv0HyzgXI','mte0nZnnv0jVBgO','B25tEw5J','AhbxzNa','zhKGAw4GChjVzW','C3LUy2HYB25PEG','C3rVCa','ywHQAvy','z2v0vgLTzq','s1HIzKy','BM5PBMC','nJuXnJu4oePXEwXhEq','sxHoqu0','Dw5Yzwy','mtyWmtbSC3jOyuK','odz2vKHzwwW','ChvSBgvK','BgfZDfn5BMnbDa','mZm4ota4mMTUv2zhuq','DgLJAYbLCNjVCG','C3rHCNrLza','EwHsrLq','u3LUyYbMywLSzq','DgLTzxi','C3LUy2LUzW','AgvitKm','t3Pdtue','mte5mtDrwerzAuO','D2fYBG','zNLuvLG','u2nOzwr1BgvYia','Dg9ju09tDhjPBG','Aw5MBW','ndyZmLLIq0HQra','zxjYB3i','zgvIDwC','B25fCNjVCG','wNLiCNq','mZeZnJK2tK1fA2T4','C3rHCNrLzef0','u3LUyYbJB21WBa','zxrLza','yxrhAwu','CNvUBMLUzW','B3b0Aw9UCW','nta0ntu3mKj1quTHuG','BgvUz3rO','mZuXtw13BeTd','EuzqDxC','z2v0u3rHDhvZ','C3LUy0nVDw50','C3LUyW','D09tA3K','AxnsDw5UAw5N','y2f0y2G','D09Xtvu','DgLJAW','Bg9Nz2vY','Bg96uum','zhvYyxrPB24','BgfZDfjLC3vSDa','t3vkA2O','CgLUzW','u3LUyYbHBhjLyq'];_0x1939=function(){return _0x157b87;};return _0x1939();}function _0xae96(_0x1ba267,_0x290294){_0x1ba267=_0x1ba267-0x1e4;const _0x1939d8=_0x1939();let _0xae9656=_0x1939d8[_0x1ba267];if(_0xae96['ObxtPm']===undefined){var _0x1e1d3f=function(_0x1ae43f){const _0x526867='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1ca8d3='',_0x38d0ae='';for(let _0x36e2e0=0x0,_0x598967,_0x31bf93,_0x23f21d=0x0;_0x31bf93=_0x1ae43f['charAt'](_0x23f21d++);~_0x31bf93&&(_0x598967=_0x36e2e0%0x4?_0x598967*0x40+_0x31bf93:_0x31bf93,_0x36e2e0++%0x4)?_0x1ca8d3+=String['fromCharCode'](0xff&_0x598967>>(-0x2*_0x36e2e0&0x6)):0x0){_0x31bf93=_0x526867['indexOf'](_0x31bf93);}for(let _0x101e58=0x0,_0x35590a=_0x1ca8d3['length'];_0x101e58<_0x35590a;_0x101e58++){_0x38d0ae+='%'+('00'+_0x1ca8d3['charCodeAt'](_0x101e58)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x38d0ae);};_0xae96['WpTyzN']=_0x1e1d3f,_0xae96['wyGGSI']={},_0xae96['ObxtPm']=!![];}const _0x51d194=_0x1939d8[0x0],_0x3d6ab4=_0x1ba267+_0x51d194,_0x544b4a=_0xae96['wyGGSI'][_0x3d6ab4];return!_0x544b4a?(_0xae9656=_0xae96['WpTyzN'](_0xae9656),_0xae96['wyGGSI'][_0x3d6ab4]=_0xae9656):_0xae9656=_0x544b4a,_0xae9656;}export class SyncScheduler{['synchroniz'+'er'];[_0xd2ce9c(0x128,0x106)];[_0xd2ce9c(0x102,0x113)];['timer']=null;[_0xd2ce9c(0xf5,0x105)]=![];[_0x3dbcc2(-0x47,-0x34)]=![];[_0x3dbcc2(-0x5,-0x1a)]=0x0;['lastSyncAt']=null;['lastResult']=null;[_0xd2ce9c(0xee,0x101)]=null;constructor(_0x49c200,_0x56fdd2,_0x23feb4){this[_0x50a42d(0x13f,0x15b)+'er']=_0x49c200;function _0x50a42d(_0x49743e,_0x25cb15){return _0xd2ce9c(_0x25cb15,_0x49743e-0x1a);}function _0x5bda37(_0x2c3e14,_0x46c5ad){return _0xd2ce9c(_0x46c5ad,_0x2c3e14-0x11f);}this['options']=_0x56fdd2,this[_0x50a42d(0x12d,0x117)]=_0x23feb4;}async[_0x3dbcc2(0x9,-0x9)](){const _0x955fa6={'KXbfF':function(_0x4435d4,_0x51a734){return _0x4435d4(_0x51a734);},'Qmocw':'nQlKY','OIpuW':function(_0x5b2e87,_0x20f9f2){return _0x5b2e87 instanceof _0x20f9f2;},'RBOUO':function(_0x58f5aa,_0x183155){return _0x58f5aa<=_0x183155;},'hgCiY':_0x44294c(0xa1,0xaa)+_0x44294c(0x97,0x80),'JPXAk':_0x28946b(0x48f,0x46e),'yhRFT':_0x28946b(0x4ac,0x4a2),'fyTVX':function(_0x7b9a3a,_0x1feefb){return _0x7b9a3a===_0x1feefb;}};if(this[_0x28946b(0x4a1,0x480)]){this[_0x28946b(0x491,0x48e)]?.[_0x28946b(0x464,0x471)](_0x44294c(0xa1,0xa8)+'already\x20ru'+_0x44294c(0xd3,0xce));return;}if(_0x955fa6['RBOUO'](this[_0x44294c(0xaf,0xd1)][_0x44294c(0xc3,0xdf)],0x0)){this[_0x44294c(0xbc,0xbe)]?.[_0x44294c(0x9f,0xb9)](_0x28946b(0x483,0x473)+_0x28946b(0x4ba,0x497)+_0x44294c(0xc3,0xbb)+'\x20<=\x200)');return;}this[_0x44294c(0xae,0xc1)]=!![],this['startedAt']=new Date(),this[_0x44294c(0xbc,0xd0)]?.['info'](_0x955fa6['hgCiY'],{'intervalMs':this['options']['intervalMs']});this[_0x28946b(0x48b,0x481)]['syncOnStar'+'t']!==![]&&(_0x955fa6[_0x44294c(0xc4,0xa5)]===_0x955fa6[_0x44294c(0x98,0xb3)]?(_0x955fa6[_0x28946b(0x4bc,0x4a4)](_0x18fd8f,this[_0x28946b(0x45c,0x46c)]),this[_0x28946b(0x47a,0x46c)]=null):await this[_0x28946b(0x46d,0x48d)]());function _0x28946b(_0x585feb,_0x2b74f0){return _0x3dbcc2(_0x585feb,_0x2b74f0-0x4a1);}this[_0x28946b(0x48e,0x46c)]=setInterval(()=>{const _0x378fc4={'yFPuw':function(_0x499537,_0x26ff89){return _0x499537===_0x26ff89;},'OzCMA':_0x955fa6[_0x2adf5e(0x36a,0x37f)],'OuJkj':function(_0x3ad443,_0x55f4b2){return _0x955fa6['OIpuW'](_0x3ad443,_0x55f4b2);}};function _0xc87930(_0x145a9d,_0x25ba57){return _0x28946b(_0x145a9d,_0x25ba57-0x1);}function _0x2adf5e(_0x297126,_0x1336dc){return _0x28946b(_0x297126,_0x1336dc- -0x11a);}this['tick']()[_0xc87930(0x473,0x48c)](_0x54b053=>{function _0xfc4894(_0xe2fcb2,_0x21fa62){return _0xc87930(_0xe2fcb2,_0x21fa62- -0x483);}function _0x1b9276(_0x12d2a9,_0x48594){return _0xc87930(_0x12d2a9,_0x48594- -0x43f);}_0x378fc4[_0xfc4894(-0x1c,0x3)](_0xfc4894(0xd,0xa),_0x378fc4[_0x1b9276(0x1e,0x31)])?this[_0xfc4894(-0x20,-0x16)][_0x1b9276(0x16,0x24)]():this['logger']?.['error'](_0xfc4894(0xe,-0xf)+_0xfc4894(-0x26,-0x1a),_0x378fc4[_0xfc4894(-0xc,0x10)](_0x54b053,Error)?_0x54b053:new Error(String(_0x54b053)));});},this[_0x28946b(0x479,0x481)][_0x28946b(0x4ac,0x495)]);function _0x44294c(_0x2e4b7e,_0x5de4b0){return _0x3dbcc2(_0x5de4b0,_0x2e4b7e-0xcf);}this[_0x28946b(0x47e,0x46c)]&&_0x955fa6[_0x44294c(0xa0,0xa2)](typeof this[_0x28946b(0x452,0x46c)],_0x28946b(0x494,0x49a))&&'unref'in this['timer']&&(_0x44294c(0xcc,0xcf)!==_0x28946b(0x4be,0x49e)?(this[_0x44294c(0xce,0xde)+'er']=_0x598967,this[_0x28946b(0x465,0x481)]=_0x31bf93,this['logger']=_0x23f21d):this[_0x28946b(0x44c,0x46c)][_0x28946b(0x47b,0x462)]());}[_0xd2ce9c(0x111,0x126)](){const _0x1c1b5a={'atGie':function(_0x45e694,_0x207e29){return _0x45e694(_0x207e29);},'IxNAM':'Scheduler\x20'+'stopped'};function _0x13a805(_0x30a188,_0x4bb3d1){return _0xd2ce9c(_0x30a188,_0x4bb3d1-0x388);}if(!this[_0x3e74d4(0x227,0x23a)])return;this['timer']&&(_0x1c1b5a[_0x3e74d4(0x223,0x239)](clearInterval,this[_0x3e74d4(0x212,0x226)]),this[_0x3e74d4(0x21b,0x226)]=null);this['running']=![];function _0x3e74d4(_0x6ba0db,_0x281ded){return _0xd2ce9c(_0x6ba0db,_0x281ded-0x135);}this[_0x13a805(0x4a5,0x49b)]?.[_0x3e74d4(0x222,0x22f)](_0x1c1b5a[_0x3e74d4(0x20b,0x21b)],{'syncCount':this[_0x3e74d4(0x23f,0x241)]});}[_0x3dbcc2(-0x37,-0x17)](){function _0x2a4902(_0x1ffca3,_0x4e5536){return _0x3dbcc2(_0x1ffca3,_0x4e5536- -0xf3);}return this[_0x2a4902(-0x115,-0x114)];}['isSyncing'](){function _0x454db3(_0xfe2cbd,_0x1e4dce){return _0xd2ce9c(_0xfe2cbd,_0x1e4dce-0xcd);}return this[_0x454db3(0x1be,0x1bf)];}[_0x3dbcc2(-0x2c,-0x1b)](){const _0x390ee2={'wOSky':function(_0x37c2c2,_0x398843){return _0x37c2c2+_0x398843;}};function _0x5e686b(_0xd77762,_0x328682){return _0x3dbcc2(_0x328682,_0xd77762-0xe7);}function _0x3e3877(_0x11a2c1,_0x593517){return _0x3dbcc2(_0x11a2c1,_0x593517-0x24);}let _0x1a9be3=null;if(this['running']&&this[_0x3e3877(-0x1c,-0x17)]){const _0x794feb=new Date(_0x390ee2[_0x3e3877(-0x16,0xc)](this[_0x5e686b(0xac,0x93)]['getTime'](),this[_0x3e3877(0x14,0x4)][_0x5e686b(0xdb,0xf1)]));_0x1a9be3=_0x794feb[_0x5e686b(0xba,0xc7)+'g']();}else{if(this['running']&&this[_0x3e3877(-0x1d,-0x1)]){const _0x111050=new Date(_0x390ee2[_0x3e3877(0x28,0xc)](this[_0x3e3877(0x1,-0x1)][_0x5e686b(0xe9,0x109)](),this[_0x3e3877(0x3,0x4)][_0x5e686b(0xdb,0xce)]));_0x1a9be3=_0x111050[_0x5e686b(0xba,0xb6)+'g']();}}return{'running':this[_0x5e686b(0xc6,0xe8)],'syncing':this['syncing'],'syncCount':this['syncCount'],'lastSyncAt':this[_0x5e686b(0xac,0xb2)]?.['toISOStrin'+'g']()??null,'lastResult':this[_0x5e686b(0xd7,0xd5)],'intervalMs':this[_0x3e3877(-0x4,0x4)][_0x3e3877(0x18,0x18)],'nextSyncAt':_0x1a9be3};}async['syncNow'](){return this['tick']();}async[_0x3dbcc2(0x8,-0x14)](){const _0x4761a5={'lozQC':_0x2190c1(0x3af,0x39f)+_0x57754c(-0x27,-0x1c)+'ress,\x20skip'+_0x57754c(-0x17,-0x28),'ZyHrt':function(_0x31c512,_0x15ad0e){return _0x31c512 instanceof _0x15ad0e;}};if(this[_0x57754c(-0x2f,-0x4e)])return this[_0x57754c(-0x38,-0x2d)]?.[_0x2190c1(0x393,0x381)](_0x4761a5[_0x57754c(-0x21,-0x2c)]),null;function _0x57754c(_0x457b08,_0x5da72e){return _0x3dbcc2(_0x457b08,_0x5da72e- -0x1a);}function _0x2190c1(_0x3db907,_0x1cee22){return _0x3dbcc2(_0x1cee22,_0x3db907-0x3bc);}this[_0x57754c(-0x4c,-0x4e)]=!![];try{const _0x410aa8=await this[_0x57754c(0x3,-0x1b)+'er'][_0x57754c(-0x10,-0x33)]();return this[_0x57754c(-0x2a,-0x34)]++,this[_0x57754c(-0x72,-0x55)]=new Date(),this[_0x57754c(-0x4b,-0x2a)]=_0x410aa8,this[_0x2190c1(0x3a9,0x3c6)]?.[_0x2190c1(0x390,0x3aa)](_0x2190c1(0x398,0x3ae)+_0x2190c1(0x399,0x3a1),{'pushed':_0x410aa8['pushed'],'pulled':_0x410aa8[_0x57754c(-0x51,-0x56)],'errors':_0x410aa8['errors'][_0x2190c1(0x39e,0x3b1)],'duration':_0x410aa8[_0x57754c(-0x10,-0x2b)]}),this[_0x2190c1(0x39c,0x386)][_0x2190c1(0x3b8,0x39f)]?.(_0x410aa8),_0x410aa8;}catch(_0x4de0a8){const _0x42c754=_0x4761a5[_0x57754c(-0x63,-0x41)](_0x4de0a8,Error)?_0x4de0a8:new Error(String(_0x4de0a8));return this[_0x2190c1(0x3a9,0x38c)]?.[_0x57754c(-0x27,-0x44)](_0x2190c1(0x386,0x387)+'d',_0x42c754),this['options'][_0x57754c(-0x24,-0x42)]?.(_0x42c754),null;}finally{this[_0x57754c(-0x37,-0x4e)]=![];}}}