a2a-memory 0.11.4 → 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.
Files changed (262) 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.js +1 -294
  10. package/dist/cli/commands/add.js +1 -80
  11. package/dist/cli/commands/claude-sync.js +1 -70
  12. package/dist/cli/commands/cleanup.js +1 -83
  13. package/dist/cli/commands/config.js +1 -73
  14. package/dist/cli/commands/edit.js +1 -69
  15. package/dist/cli/commands/embed.js +1 -92
  16. package/dist/cli/commands/extract.js +1 -103
  17. package/dist/cli/commands/health.js +1 -105
  18. package/dist/cli/commands/list.js +1 -49
  19. package/dist/cli/commands/migrate-chunks.js +1 -205
  20. package/dist/cli/commands/migrate-file-refs.js +1 -183
  21. package/dist/cli/commands/proficiency.js +1 -146
  22. package/dist/cli/commands/rm.js +1 -64
  23. package/dist/cli/commands/search.js +1 -89
  24. package/dist/cli/commands/setup-wizard.js +1 -387
  25. package/dist/cli/commands/setup.js +1 -170
  26. package/dist/cli/commands/skill.js +1 -151
  27. package/dist/cli/commands/status.js +1 -70
  28. package/dist/cli/commands/sync.js +1 -202
  29. package/dist/cli/commands/team.js +1 -142
  30. package/dist/cli/index.js +1 -87
  31. package/dist/config/manager.js +1 -372
  32. package/dist/db/database.d.ts +10 -1
  33. package/dist/db/database.js +1 -1367
  34. package/dist/embedding/e5-provider.js +1 -147
  35. package/dist/embedding/index.js +1 -34
  36. package/dist/embedding/local-provider.js +1 -157
  37. package/dist/embedding/openai-provider.js +1 -92
  38. package/dist/embedding/quantization.js +1 -89
  39. package/dist/extraction/dedup-manager.js +1 -161
  40. package/dist/extraction/emotion-filter.js +1 -33
  41. package/dist/extraction/extractor.js +1 -642
  42. package/dist/extraction/file-reference.js +1 -77
  43. package/dist/extraction/filter.js +1 -85
  44. package/dist/extraction/scorer.js +1 -142
  45. package/dist/extraction/similarity.js +1 -85
  46. package/dist/hooks/client-factory.js +1 -44
  47. package/dist/hooks/post-tool-use.js +1 -470
  48. package/dist/hooks/pre-compact.js +1 -209
  49. package/dist/hooks/session-end.d.ts +1 -0
  50. package/dist/hooks/session-end.js +1 -623
  51. package/dist/hooks/session-start.js +1 -549
  52. package/dist/hooks/shared.js +1 -110
  53. package/dist/hooks/user-prompt-submit.js +1 -316
  54. package/dist/i18n/index.js +1 -2
  55. package/dist/i18n/messages.js +1 -150
  56. package/dist/index.js +1 -43
  57. package/dist/lifecycle/cleanup-scheduler.js +1 -137
  58. package/dist/lifecycle/cleanup.js +1 -116
  59. package/dist/lifecycle/index.js +1 -13
  60. package/dist/lifecycle/quality-scorer.js +1 -46
  61. package/dist/lifecycle/tiering.js +1 -246
  62. package/dist/llm/client.js +1 -226
  63. package/dist/llm/index.js +1 -5
  64. package/dist/proficiency/actr-engine.js +1 -106
  65. package/dist/proficiency/detection.js +1 -77
  66. package/dist/proficiency/index.js +1 -9
  67. package/dist/proficiency/tracker.js +1 -173
  68. package/dist/proficiency/types.js +1 -8
  69. package/dist/providers/adapters.js +1 -140
  70. package/dist/providers/detector.js +1 -57
  71. package/dist/search/adaptive-router.js +1 -93
  72. package/dist/search/index.js +1 -9
  73. package/dist/search/ranker.js +1 -171
  74. package/dist/search/reranker.js +1 -155
  75. package/dist/session/parser.js +1 -130
  76. package/dist/skill/evaluator.js +1 -509
  77. package/dist/skill/index.js +1 -7
  78. package/dist/skill/types.js +1 -7
  79. package/dist/sync/client.d.ts +1 -0
  80. package/dist/sync/client.js +1 -597
  81. package/dist/sync/encryption.js +1 -203
  82. package/dist/sync/index.js +1 -12
  83. package/dist/sync/queue.js +1 -199
  84. package/dist/sync/scheduler.js +1 -140
  85. package/dist/sync/synchronizer.js +1 -241
  86. package/dist/sync/team-synchronizer.js +1 -204
  87. package/dist/sync/vector-clock.js +1 -70
  88. package/dist/types/index.d.ts +2 -1
  89. package/dist/types/index.js +1 -131
  90. package/dist/utils/keychain.js +1 -170
  91. package/dist/utils/logger.js +1 -128
  92. package/package.json +14 -10
  93. package/dist/a2a/client.d.ts.map +0 -1
  94. package/dist/a2a/client.js.map +0 -1
  95. package/dist/a2a/discovery.d.ts.map +0 -1
  96. package/dist/a2a/discovery.js.map +0 -1
  97. package/dist/a2a/index.d.ts.map +0 -1
  98. package/dist/a2a/index.js.map +0 -1
  99. package/dist/a2a/types.d.ts.map +0 -1
  100. package/dist/a2a/types.js.map +0 -1
  101. package/dist/adapters/anthropic.d.ts.map +0 -1
  102. package/dist/adapters/anthropic.js.map +0 -1
  103. package/dist/chunking/chunker.d.ts.map +0 -1
  104. package/dist/chunking/chunker.js.map +0 -1
  105. package/dist/claude/sync.d.ts.map +0 -1
  106. package/dist/claude/sync.js.map +0 -1
  107. package/dist/cli/commands/add.d.ts.map +0 -1
  108. package/dist/cli/commands/add.js.map +0 -1
  109. package/dist/cli/commands/claude-sync.d.ts.map +0 -1
  110. package/dist/cli/commands/claude-sync.js.map +0 -1
  111. package/dist/cli/commands/cleanup.d.ts.map +0 -1
  112. package/dist/cli/commands/cleanup.js.map +0 -1
  113. package/dist/cli/commands/config.d.ts.map +0 -1
  114. package/dist/cli/commands/config.js.map +0 -1
  115. package/dist/cli/commands/edit.d.ts.map +0 -1
  116. package/dist/cli/commands/edit.js.map +0 -1
  117. package/dist/cli/commands/embed.d.ts.map +0 -1
  118. package/dist/cli/commands/embed.js.map +0 -1
  119. package/dist/cli/commands/extract.d.ts.map +0 -1
  120. package/dist/cli/commands/extract.js.map +0 -1
  121. package/dist/cli/commands/health.d.ts.map +0 -1
  122. package/dist/cli/commands/health.js.map +0 -1
  123. package/dist/cli/commands/list.d.ts.map +0 -1
  124. package/dist/cli/commands/list.js.map +0 -1
  125. package/dist/cli/commands/migrate-chunks.d.ts.map +0 -1
  126. package/dist/cli/commands/migrate-chunks.js.map +0 -1
  127. package/dist/cli/commands/migrate-file-refs.d.ts.map +0 -1
  128. package/dist/cli/commands/migrate-file-refs.js.map +0 -1
  129. package/dist/cli/commands/proficiency.d.ts.map +0 -1
  130. package/dist/cli/commands/proficiency.js.map +0 -1
  131. package/dist/cli/commands/rm.d.ts.map +0 -1
  132. package/dist/cli/commands/rm.js.map +0 -1
  133. package/dist/cli/commands/search.d.ts.map +0 -1
  134. package/dist/cli/commands/search.js.map +0 -1
  135. package/dist/cli/commands/setup-wizard.d.ts.map +0 -1
  136. package/dist/cli/commands/setup-wizard.js.map +0 -1
  137. package/dist/cli/commands/setup.d.ts.map +0 -1
  138. package/dist/cli/commands/setup.js.map +0 -1
  139. package/dist/cli/commands/skill.d.ts.map +0 -1
  140. package/dist/cli/commands/skill.js.map +0 -1
  141. package/dist/cli/commands/status.d.ts.map +0 -1
  142. package/dist/cli/commands/status.js.map +0 -1
  143. package/dist/cli/commands/sync.d.ts.map +0 -1
  144. package/dist/cli/commands/sync.js.map +0 -1
  145. package/dist/cli/commands/team.d.ts.map +0 -1
  146. package/dist/cli/commands/team.js.map +0 -1
  147. package/dist/cli/index.d.ts.map +0 -1
  148. package/dist/cli/index.js.map +0 -1
  149. package/dist/config/manager.d.ts.map +0 -1
  150. package/dist/config/manager.js.map +0 -1
  151. package/dist/db/database.d.ts.map +0 -1
  152. package/dist/db/database.js.map +0 -1
  153. package/dist/embedding/e5-provider.d.ts.map +0 -1
  154. package/dist/embedding/e5-provider.js.map +0 -1
  155. package/dist/embedding/index.d.ts.map +0 -1
  156. package/dist/embedding/index.js.map +0 -1
  157. package/dist/embedding/local-provider.d.ts.map +0 -1
  158. package/dist/embedding/local-provider.js.map +0 -1
  159. package/dist/embedding/openai-provider.d.ts.map +0 -1
  160. package/dist/embedding/openai-provider.js.map +0 -1
  161. package/dist/embedding/quantization.d.ts.map +0 -1
  162. package/dist/embedding/quantization.js.map +0 -1
  163. package/dist/extraction/dedup-manager.d.ts.map +0 -1
  164. package/dist/extraction/dedup-manager.js.map +0 -1
  165. package/dist/extraction/emotion-filter.d.ts.map +0 -1
  166. package/dist/extraction/emotion-filter.js.map +0 -1
  167. package/dist/extraction/extractor.d.ts.map +0 -1
  168. package/dist/extraction/extractor.js.map +0 -1
  169. package/dist/extraction/file-reference.d.ts.map +0 -1
  170. package/dist/extraction/file-reference.js.map +0 -1
  171. package/dist/extraction/filter.d.ts.map +0 -1
  172. package/dist/extraction/filter.js.map +0 -1
  173. package/dist/extraction/scorer.d.ts.map +0 -1
  174. package/dist/extraction/scorer.js.map +0 -1
  175. package/dist/extraction/similarity.d.ts.map +0 -1
  176. package/dist/extraction/similarity.js.map +0 -1
  177. package/dist/hooks/client-factory.d.ts.map +0 -1
  178. package/dist/hooks/client-factory.js.map +0 -1
  179. package/dist/hooks/post-tool-use.d.ts.map +0 -1
  180. package/dist/hooks/post-tool-use.js.map +0 -1
  181. package/dist/hooks/pre-compact.d.ts.map +0 -1
  182. package/dist/hooks/pre-compact.js.map +0 -1
  183. package/dist/hooks/session-end.d.ts.map +0 -1
  184. package/dist/hooks/session-end.js.map +0 -1
  185. package/dist/hooks/session-start.d.ts.map +0 -1
  186. package/dist/hooks/session-start.js.map +0 -1
  187. package/dist/hooks/shared.d.ts.map +0 -1
  188. package/dist/hooks/shared.js.map +0 -1
  189. package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
  190. package/dist/hooks/user-prompt-submit.js.map +0 -1
  191. package/dist/i18n/index.d.ts.map +0 -1
  192. package/dist/i18n/index.js.map +0 -1
  193. package/dist/i18n/messages.d.ts.map +0 -1
  194. package/dist/i18n/messages.js.map +0 -1
  195. package/dist/index.d.ts.map +0 -1
  196. package/dist/index.js.map +0 -1
  197. package/dist/lifecycle/cleanup-scheduler.d.ts.map +0 -1
  198. package/dist/lifecycle/cleanup-scheduler.js.map +0 -1
  199. package/dist/lifecycle/cleanup.d.ts.map +0 -1
  200. package/dist/lifecycle/cleanup.js.map +0 -1
  201. package/dist/lifecycle/index.d.ts.map +0 -1
  202. package/dist/lifecycle/index.js.map +0 -1
  203. package/dist/lifecycle/quality-scorer.d.ts.map +0 -1
  204. package/dist/lifecycle/quality-scorer.js.map +0 -1
  205. package/dist/lifecycle/tiering.d.ts.map +0 -1
  206. package/dist/lifecycle/tiering.js.map +0 -1
  207. package/dist/llm/client.d.ts.map +0 -1
  208. package/dist/llm/client.js.map +0 -1
  209. package/dist/llm/index.d.ts.map +0 -1
  210. package/dist/llm/index.js.map +0 -1
  211. package/dist/proficiency/actr-engine.d.ts.map +0 -1
  212. package/dist/proficiency/actr-engine.js.map +0 -1
  213. package/dist/proficiency/detection.d.ts.map +0 -1
  214. package/dist/proficiency/detection.js.map +0 -1
  215. package/dist/proficiency/index.d.ts.map +0 -1
  216. package/dist/proficiency/index.js.map +0 -1
  217. package/dist/proficiency/tracker.d.ts.map +0 -1
  218. package/dist/proficiency/tracker.js.map +0 -1
  219. package/dist/proficiency/types.d.ts.map +0 -1
  220. package/dist/proficiency/types.js.map +0 -1
  221. package/dist/providers/adapters.d.ts.map +0 -1
  222. package/dist/providers/adapters.js.map +0 -1
  223. package/dist/providers/detector.d.ts.map +0 -1
  224. package/dist/providers/detector.js.map +0 -1
  225. package/dist/search/adaptive-router.d.ts.map +0 -1
  226. package/dist/search/adaptive-router.js.map +0 -1
  227. package/dist/search/index.d.ts.map +0 -1
  228. package/dist/search/index.js.map +0 -1
  229. package/dist/search/ranker.d.ts.map +0 -1
  230. package/dist/search/ranker.js.map +0 -1
  231. package/dist/search/reranker.d.ts.map +0 -1
  232. package/dist/search/reranker.js.map +0 -1
  233. package/dist/session/parser.d.ts.map +0 -1
  234. package/dist/session/parser.js.map +0 -1
  235. package/dist/skill/evaluator.d.ts.map +0 -1
  236. package/dist/skill/evaluator.js.map +0 -1
  237. package/dist/skill/index.d.ts.map +0 -1
  238. package/dist/skill/index.js.map +0 -1
  239. package/dist/skill/types.d.ts.map +0 -1
  240. package/dist/skill/types.js.map +0 -1
  241. package/dist/sync/client.d.ts.map +0 -1
  242. package/dist/sync/client.js.map +0 -1
  243. package/dist/sync/encryption.d.ts.map +0 -1
  244. package/dist/sync/encryption.js.map +0 -1
  245. package/dist/sync/index.d.ts.map +0 -1
  246. package/dist/sync/index.js.map +0 -1
  247. package/dist/sync/queue.d.ts.map +0 -1
  248. package/dist/sync/queue.js.map +0 -1
  249. package/dist/sync/scheduler.d.ts.map +0 -1
  250. package/dist/sync/scheduler.js.map +0 -1
  251. package/dist/sync/synchronizer.d.ts.map +0 -1
  252. package/dist/sync/synchronizer.js.map +0 -1
  253. package/dist/sync/team-synchronizer.d.ts.map +0 -1
  254. package/dist/sync/team-synchronizer.js.map +0 -1
  255. package/dist/sync/vector-clock.d.ts.map +0 -1
  256. package/dist/sync/vector-clock.js.map +0 -1
  257. package/dist/types/index.d.ts.map +0 -1
  258. package/dist/types/index.js.map +0 -1
  259. package/dist/utils/keychain.d.ts.map +0 -1
  260. package/dist/utils/keychain.js.map +0 -1
  261. package/dist/utils/logger.d.ts.map +0 -1
  262. package/dist/utils/logger.js.map +0 -1
@@ -1,246 +1 @@
1
- /**
2
- * Memory Tiering Engine
3
- *
4
- * 메모리 접근 패턴 기반 티어링 시스템:
5
- * - hot: 최근 hotThresholdDays 이내 접근 OR tier='core'
6
- * - warm: 최근 warmThresholdDays 이내 접근 OR tier='active'
7
- * - cold: 나머지 (오래된 메모리)
8
- *
9
- * Cold 메모리는 zlib 압축으로 저장 공간 절약.
10
- */
11
- import { gzipSync, gunzipSync } from 'node:zlib';
12
- const COMPRESSED_PREFIX = 'COMPRESSED:';
13
- /**
14
- * 메모리 접근 패턴 기반 티어 결정
15
- *
16
- * 규칙:
17
- * - tier='working' (core) → 항상 hot (강등 불가)
18
- * - tier='episodic' (active) → 접근 시간과 관계없이 warm 이상
19
- * - 나머지: lastAccessedAt 기준 hot/warm/cold 분류
20
- *
21
- * @param memory - 메모리 객체
22
- * @param config - 티어링 설정
23
- * @returns 결정된 storage tier
24
- */
25
- export function determineTier(memory, config) {
26
- // core 티어는 항상 hot
27
- if (memory.tier === 'working') {
28
- return 'hot';
29
- }
30
- // episodic 티어는 최소 warm 보장 (접근 시간 무관)
31
- if (memory.tier === 'episodic') {
32
- // 단, 접근 기록이 있으면 hot 승격 가능
33
- if (memory.lastAccessedAt) {
34
- const daysSinceAccess = getDaysSince(memory.lastAccessedAt);
35
- if (daysSinceAccess <= config.hotThresholdDays) {
36
- return 'hot';
37
- }
38
- }
39
- return 'warm';
40
- }
41
- // semantic 티어: 접근 패턴 기반
42
- if (!memory.lastAccessedAt) {
43
- // 접근 기록 없음 → createdAt 기준
44
- const daysSinceCreation = getDaysSince(memory.createdAt);
45
- if (daysSinceCreation <= config.hotThresholdDays) {
46
- return 'hot';
47
- }
48
- if (daysSinceCreation <= config.warmThresholdDays) {
49
- return 'warm';
50
- }
51
- return 'cold';
52
- }
53
- const daysSinceAccess = getDaysSince(memory.lastAccessedAt);
54
- if (daysSinceAccess <= config.hotThresholdDays) {
55
- return 'hot';
56
- }
57
- if (daysSinceAccess <= config.warmThresholdDays) {
58
- return 'warm';
59
- }
60
- return 'cold';
61
- }
62
- /**
63
- * 전체 메모리 티어 재계산 및 재배치
64
- *
65
- * 1. 모든 메모리의 적절한 티어 결정
66
- * 2. 현재 티어와 비교하여 승격/강등 카운트
67
- * 3. cold 티어 메모리 압축 (설정 활성화 시)
68
- * 4. DB 업데이트
69
- *
70
- * @param db - 메모리 데이터베이스
71
- * @param config - 티어링 설정
72
- * @returns 티어링 결과 (승격/강등/압축 수)
73
- */
74
- export function rebalanceTiers(db, config) {
75
- if (!config.enabled) {
76
- return { promoted: 0, demoted: 0, compressed: 0, totalProcessed: 0 };
77
- }
78
- // 배치 처리: 1000개씩 분할 조회 (offset 지원)
79
- const BATCH_SIZE = 1000;
80
- const allMemories = [];
81
- let offset = 0;
82
- while (true) {
83
- const batch = db.listMemories({ limit: BATCH_SIZE, offset });
84
- allMemories.push(...batch);
85
- if (batch.length < BATCH_SIZE)
86
- break;
87
- offset += BATCH_SIZE;
88
- }
89
- let promoted = 0;
90
- let demoted = 0;
91
- let compressed = 0;
92
- for (const memory of allMemories) {
93
- const currentTier = getStorageTier(memory);
94
- const targetTier = determineTier(memory, config);
95
- // 티어 변경 필요 여부 확인
96
- if (currentTier === targetTier) {
97
- // 티어 변경 없음, 압축 상태만 확인
98
- if (targetTier === 'cold' && config.coldCompressionEnabled) {
99
- if (!isCompressed(memory.content)) {
100
- const compressedContent = compressContent(memory.content);
101
- db.updateMemory(memory.id, { content: compressedContent });
102
- compressed++;
103
- }
104
- }
105
- continue;
106
- }
107
- // 티어 변경 필요
108
- const tierRank = { hot: 2, warm: 1, cold: 0 };
109
- if (tierRank[targetTier] > tierRank[currentTier]) {
110
- promoted++;
111
- }
112
- else {
113
- demoted++;
114
- }
115
- // content 압축/해제 처리
116
- let newContent = memory.content;
117
- if (targetTier === 'cold' && config.coldCompressionEnabled) {
118
- // cold로 강등 → 압축
119
- if (!isCompressed(memory.content)) {
120
- newContent = compressContent(memory.content);
121
- compressed++;
122
- }
123
- }
124
- else if (currentTier === 'cold' && isCompressed(memory.content)) {
125
- // cold에서 승격 → 압축 해제
126
- newContent = decompressContent(memory.content);
127
- }
128
- // 메타데이터 업데이트 (storage tier는 메타데이터로 추적)
129
- // Memory.tier는 semantic tier이므로 변경하지 않음
130
- // storage tier는 별도 필드나 tags로 관리 필요
131
- // 현재 구현에서는 content만 압축/해제 처리
132
- if (newContent !== memory.content) {
133
- db.updateMemory(memory.id, { content: newContent });
134
- }
135
- }
136
- return {
137
- promoted,
138
- demoted,
139
- compressed,
140
- totalProcessed: allMemories.length,
141
- };
142
- }
143
- /**
144
- * 메모리 접근 시 자동 승격
145
- *
146
- * autoPromote 설정이 활성화되어 있고,
147
- * 현재 cold/warm 티어인 메모리를 hot으로 승격합니다.
148
- *
149
- * @param db - 메모리 데이터베이스
150
- * @param memoryId - 메모리 ID
151
- * @param config - 티어링 설정
152
- */
153
- export function promoteOnAccess(db, memoryId, config) {
154
- if (!config.enabled || !config.autoPromote) {
155
- return;
156
- }
157
- // DB에서 조회하지 않고, 이미 조회된 메모리를 받아 처리하는 것이 효율적이지만
158
- // 현재 API 구조상 id만 받으므로 재조회 필요
159
- const memory = db.getMemory(memoryId);
160
- if (!memory) {
161
- return;
162
- }
163
- const currentTier = getStorageTier(memory);
164
- const targetTier = determineTier(memory, config);
165
- // hot으로 승격 필요한 경우
166
- if (targetTier === 'hot' && currentTier !== 'hot') {
167
- // 압축 해제
168
- if (isCompressed(memory.content)) {
169
- const decompressedContent = decompressContent(memory.content);
170
- db.updateMemory(memoryId, { content: decompressedContent });
171
- }
172
- }
173
- // TODO: Parent-Child 동시 tier 승격 미구현 — Parent와 Children이 다른 tier를 가질 수 있음 (P2-M5)
174
- }
175
- // ============================
176
- // Helper Functions
177
- // ============================
178
- /**
179
- * 메모리의 현재 storage tier 추정
180
- * (실제로는 별도 필드가 필요하지만, 현재는 압축 여부로 판단)
181
- */
182
- function getStorageTier(memory) {
183
- // core는 항상 hot
184
- if (memory.tier === 'working') {
185
- return 'hot';
186
- }
187
- // 압축되어 있으면 cold
188
- if (isCompressed(memory.content)) {
189
- return 'cold';
190
- }
191
- // episodic은 기본 warm
192
- if (memory.tier === 'episodic') {
193
- return 'warm';
194
- }
195
- // semantic은 접근 패턴 기반 추정
196
- if (!memory.lastAccessedAt) {
197
- const daysSinceCreation = getDaysSince(memory.createdAt);
198
- if (daysSinceCreation <= 7)
199
- return 'hot';
200
- if (daysSinceCreation <= 30)
201
- return 'warm';
202
- return 'cold';
203
- }
204
- const daysSinceAccess = getDaysSince(memory.lastAccessedAt);
205
- if (daysSinceAccess <= 7)
206
- return 'hot';
207
- if (daysSinceAccess <= 30)
208
- return 'warm';
209
- return 'cold';
210
- }
211
- /**
212
- * ISO 8601 문자열에서 현재까지의 일수 계산
213
- */
214
- function getDaysSince(isoDate) {
215
- const date = new Date(isoDate);
216
- const now = new Date();
217
- const diffMs = now.getTime() - date.getTime();
218
- return Math.floor(diffMs / (1000 * 60 * 60 * 24));
219
- }
220
- /**
221
- * content가 압축되어 있는지 확인
222
- */
223
- function isCompressed(content) {
224
- return content.startsWith(COMPRESSED_PREFIX);
225
- }
226
- /**
227
- * content 압축 (zlib gzip)
228
- */
229
- function compressContent(content) {
230
- const buffer = Buffer.from(content, 'utf-8');
231
- const compressed = gzipSync(buffer);
232
- return COMPRESSED_PREFIX + compressed.toString('base64');
233
- }
234
- /**
235
- * content 압축 해제
236
- */
237
- function decompressContent(content) {
238
- if (!isCompressed(content)) {
239
- return content;
240
- }
241
- const base64Data = content.slice(COMPRESSED_PREFIX.length);
242
- const compressed = Buffer.from(base64Data, 'base64');
243
- const decompressed = gunzipSync(compressed);
244
- return decompressed.toString('utf-8');
245
- }
246
- //# sourceMappingURL=tiering.js.map
1
+ (function(_0x586398,_0x288d9b){function _0x56917c(_0x25931,_0x1cd164){return _0x457a(_0x25931-0x3e7,_0x1cd164);}function _0xcf78cd(_0x1fe2ab,_0x269113){return _0x457a(_0x269113- -0x312,_0x1fe2ab);}const _0x617647=_0x586398();while(!![]){try{const _0x20bf82=-parseInt(_0xcf78cd(-0x152,-0x162))/0x1*(-parseInt(_0xcf78cd(-0x16c,-0x18b))/0x2)+-parseInt(_0x56917c(0x585,0x58a))/0x3*(-parseInt(_0xcf78cd(-0x165,-0x159))/0x4)+parseInt(_0xcf78cd(-0x152,-0x16d))/0x5+parseInt(_0xcf78cd(-0x158,-0x152))/0x6+parseInt(_0x56917c(0x596,0x583))/0x7+parseInt(_0x56917c(0x560,0x567))/0x8+-parseInt(_0x56917c(0x55e,0x538))/0x9;if(_0x20bf82===_0x288d9b)break;else _0x617647['push'](_0x617647['shift']());}catch(_0x179b39){_0x617647['push'](_0x617647['shift']());}}}(_0x3f47,0x6b9bf));import{gzipSync,gunzipSync}from'node:zlib';function _0x225b02(_0x1422a9,_0x12bfde){return _0x457a(_0x1422a9- -0xe3,_0x12bfde);}const COMPRESSED_PREFIX=_0x225b02(0xb5,0xac)+':';export function determineTier(_0xe2572a,_0x474004){function _0xa37f4c(_0x248884,_0x3566a9){return _0x225b02(_0x248884-0x177,_0x3566a9);}const _0xd8eb10={'xCoEJ':function(_0x20d2d9,_0x240d03){return _0x20d2d9===_0x240d03;},'oaKqH':_0xa37f4c(0x222,0x22f),'lrnbQ':function(_0x10a79a,_0x2508aa){return _0x10a79a===_0x2508aa;},'Grxsh':'episodic','YdCfg':function(_0x3ba709,_0x39a361){return _0x3ba709!==_0x39a361;},'qSaUL':_0xa37f4c(0x22b,0x248),'rKhDu':'hot','nyznd':_0xa37f4c(0x21f,0x22f),'JyHCj':_0x516de0(-0x168,-0x155),'SMuAy':function(_0x399987,_0x4bdd98){return _0x399987<=_0x4bdd98;}};if(_0xd8eb10['xCoEJ'](_0xe2572a[_0xa37f4c(0x223,0x21f)],_0xd8eb10['oaKqH']))return _0xa37f4c(0x20a,0x219);if(_0xd8eb10[_0x516de0(-0x133,-0x15a)](_0xe2572a[_0x516de0(-0x15b,-0x165)],_0xd8eb10[_0x516de0(-0x165,-0x146)])){if(_0xd8eb10[_0x516de0(-0x167,-0x165)](_0xa37f4c(0x22b,0x22c),_0xd8eb10[_0xa37f4c(0x21a,0x206)])){if(_0x1c30d2(_0x47ae97[_0x516de0(-0x138,-0x137)])){const _0x2029fb=_0x27ff7f(_0x408b13[_0xa37f4c(0x246,0x234)]);_0x25886f['updateMemo'+'ry'](_0x433bc4,{'content':_0x2029fb});}}else{if(_0xe2572a[_0x516de0(-0x148,-0x14b)+_0xa37f4c(0x20e,0x212)]){const _0x56f4ac=getDaysSince(_0xe2572a[_0x516de0(-0x148,-0x13c)+'edAt']);if(_0x56f4ac<=_0x474004[_0x516de0(-0x137,-0x11d)+_0xa37f4c(0x20c,0x222)])return _0xa37f4c(0x20a,0x1f4);}return _0x516de0(-0x15f,-0x165);}}if(!_0xe2572a[_0x516de0(-0x148,-0x13e)+_0xa37f4c(0x20e,0x1fb)]){const _0x52e842=getDaysSince(_0xe2572a['createdAt']);if(_0x52e842<=_0x474004[_0x516de0(-0x137,-0x12b)+'ldDays'])return _0xd8eb10[_0xa37f4c(0x251,0x230)];if(_0x52e842<=_0x474004['warmThresh'+_0xa37f4c(0x23b,0x21a)])return _0xd8eb10[_0x516de0(-0x12e,-0x123)];return _0xd8eb10[_0x516de0(-0x140,-0x13e)];}const _0x10fb82=getDaysSince(_0xe2572a[_0x516de0(-0x148,-0x167)+_0xa37f4c(0x20e,0x1f8)]);if(_0xd8eb10['SMuAy'](_0x10fb82,_0x474004[_0xa37f4c(0x247,0x25a)+_0xa37f4c(0x20c,0x210)]))return _0xd8eb10[_0xa37f4c(0x251,0x255)];function _0x516de0(_0x2914d6,_0x54ba81){return _0x225b02(_0x2914d6- -0x207,_0x54ba81);}if(_0x10fb82<=_0x474004[_0xa37f4c(0x233,0x24a)+_0x516de0(-0x143,-0x16a)])return _0xd8eb10[_0x516de0(-0x12e,-0x108)];return _0xd8eb10[_0xa37f4c(0x23e,0x226)];}function _0x457a(_0x4e489d,_0x587ec7){_0x4e489d=_0x4e489d-0x176;const _0x3f4741=_0x3f47();let _0x457a20=_0x3f4741[_0x4e489d];if(_0x457a['FawWFR']===undefined){var _0x1936c7=function(_0x1b186c){const _0x2ae31f='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1926aa='',_0x1f2f9e='';for(let _0x3ba645=0x0,_0x52f3cf,_0x21506c,_0x3a2924=0x0;_0x21506c=_0x1b186c['charAt'](_0x3a2924++);~_0x21506c&&(_0x52f3cf=_0x3ba645%0x4?_0x52f3cf*0x40+_0x21506c:_0x21506c,_0x3ba645++%0x4)?_0x1926aa+=String['fromCharCode'](0xff&_0x52f3cf>>(-0x2*_0x3ba645&0x6)):0x0){_0x21506c=_0x2ae31f['indexOf'](_0x21506c);}for(let _0x3fafac=0x0,_0xf39033=_0x1926aa['length'];_0x3fafac<_0xf39033;_0x3fafac++){_0x1f2f9e+='%'+('00'+_0x1926aa['charCodeAt'](_0x3fafac)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x1f2f9e);};_0x457a['kAfNFk']=_0x1936c7,_0x457a['gkSHig']={},_0x457a['FawWFR']=!![];}const _0x27e8cb=_0x3f4741[0x0],_0x254bd2=_0x4e489d+_0x27e8cb,_0x4b0600=_0x457a['gkSHig'][_0x254bd2];return!_0x4b0600?(_0x457a20=_0x457a['kAfNFk'](_0x457a20),_0x457a['gkSHig'][_0x254bd2]=_0x457a20):_0x457a20=_0x4b0600,_0x457a20;}export function rebalanceTiers(_0x486988,_0x5ee65d){function _0x371043(_0x1dac6d,_0x4eab1c){return _0x225b02(_0x4eab1c-0x119,_0x1dac6d);}const _0x2705da={'bVWaa':_0x4f1091(0xfc,0x11f),'xuOqm':function(_0x872071,_0x32e125){return _0x872071<_0x32e125;},'HbXri':function(_0x550875,_0x5d9242){return _0x550875!==_0x5d9242;},'EAZnF':_0x4f1091(0xf7,0x11d),'StqSt':function(_0x2dcaec,_0x1d233b,_0x59cebd){return _0x2dcaec(_0x1d233b,_0x59cebd);},'aeGmW':function(_0x279032,_0x1df38f){return _0x279032===_0x1df38f;},'jQCRF':function(_0x6216a2,_0x156581){return _0x6216a2(_0x156581);},'nMPfY':function(_0x1469f0,_0x46cfe7){return _0x1469f0===_0x46cfe7;},'rhAwc':_0x371043(0x1d3,0x1d1),'PdGNM':function(_0x219706,_0x5110f1){return _0x219706>_0x5110f1;},'Ntafw':_0x4f1091(0x153,0x157),'Opehn':_0x4f1091(0x12e,0x116),'XXoBQ':function(_0x5755ff,_0x2afdcf){return _0x5755ff(_0x2afdcf);},'AIjCP':function(_0x31330b,_0x5d3e87){return _0x31330b===_0x5d3e87;},'BBGpa':_0x371043(0x1b5,0x1c2)};if(!_0x5ee65d['enabled'])return{'promoted':0x0,'demoted':0x0,'compressed':0x0,'totalProcessed':0x0};function _0x4f1091(_0x1fc8da,_0x3015af){return _0x225b02(_0x3015af-0x77,_0x1fc8da);}const _0x1b69da=0x3e8,_0xf58a18=[];let _0x53b0b0=0x0;while(!![]){const _0x240b7d=_0x486988[_0x371043(0x1bb,0x1d0)+'es']({'limit':_0x1b69da,'offset':_0x53b0b0});_0xf58a18['push'](..._0x240b7d);if(_0x2705da['xuOqm'](_0x240b7d[_0x371043(0x1c5,0x1ec)],_0x1b69da))break;_0x53b0b0+=_0x1b69da;}let _0x5ea607=0x0,_0x1012ff=0x0,_0x3ce969=0x0;for(const _0x272fb6 of _0xf58a18){if(_0x2705da[_0x371043(0x1f9,0x1e1)](_0x371043(0x1e0,0x1bf),_0x2705da[_0x4f1091(0x154,0x149)]))!_0x1e9d31(_0x4f5659[_0x371043(0x1da,0x1e8)])&&(_0x3237ce=_0xa971e7(_0x1cb184[_0x4f1091(0x166,0x146)]),_0x3557a0++);else{const _0x1044cf=getStorageTier(_0x272fb6),_0x5988cd=_0x2705da[_0x4f1091(0x14c,0x126)](determineTier,_0x272fb6,_0x5ee65d);if(_0x1044cf===_0x5988cd){if(_0x2705da[_0x371043(0x1bf,0x1ca)](_0x5988cd,_0x4f1091(0x12c,0x116))&&_0x5ee65d[_0x4f1091(0x141,0x155)+'ssionEnabl'+'ed']){if(!_0x2705da[_0x371043(0x1ce,0x1be)](isCompressed,_0x272fb6[_0x371043(0x1d0,0x1e8)])){if(_0x2705da['nMPfY'](_0x4f1091(0x14c,0x12f),_0x2705da[_0x371043(0x1f4,0x1da)])){const _0x3493c3=compressContent(_0x272fb6['content']);_0x486988['updateMemo'+'ry'](_0x272fb6['id'],{'content':_0x3493c3}),_0x3ce969++;}else return _0x2705da['bVWaa'];}}continue;}const _0x904529={'hot':0x2,'warm':0x1,'cold':0x0};_0x2705da[_0x371043(0x1d8,0x1f4)](_0x904529[_0x5988cd],_0x904529[_0x1044cf])?_0x5ea607++:_0x2705da[_0x4f1091(0x15d,0x13f)](_0x2705da[_0x371043(0x1f7,0x1f0)],_0x2705da[_0x4f1091(0x13f,0x14e)])?_0x5465bc++:_0x1012ff++;let _0x5908e5=_0x272fb6['content'];if(_0x5988cd===_0x2705da[_0x371043(0x1e0,0x1ba)]&&_0x5ee65d[_0x371043(0x1d3,0x1f7)+_0x371043(0x1f4,0x1f8)+'ed'])!_0x2705da[_0x4f1091(0x117,0x11c)](isCompressed,_0x272fb6[_0x4f1091(0x12e,0x146)])&&(_0x5908e5=_0x2705da[_0x371043(0x1d3,0x1ee)](compressContent,_0x272fb6['content']),_0x3ce969++);else{if(_0x2705da[_0x4f1091(0x11d,0x110)](_0x1044cf,_0x2705da['Opehn'])&&isCompressed(_0x272fb6[_0x371043(0x1e5,0x1e8)])){if(_0x371043(0x1a8,0x1c2)===_0x2705da[_0x4f1091(0x142,0x140)])_0x5908e5=decompressContent(_0x272fb6['content']);else return _0x371043(0x1c6,0x1ac);}}_0x2705da[_0x371043(0x1d4,0x1e1)](_0x5908e5,_0x272fb6[_0x4f1091(0x13e,0x146)])&&_0x486988['updateMemo'+'ry'](_0x272fb6['id'],{'content':_0x5908e5});}}return{'promoted':_0x5ea607,'demoted':_0x1012ff,'compressed':_0x3ce969,'totalProcessed':_0xf58a18[_0x4f1091(0x14e,0x14a)]};}export function promoteOnAccess(_0xfb48e5,_0x1c0718,_0x39eec6){function _0xf53e6a(_0xa52014,_0x3119fa){return _0x225b02(_0xa52014- -0x207,_0x3119fa);}const _0x42a6e8={'QXMgx':function(_0x6c3d06,_0x4eb733){return _0x6c3d06<=_0x4eb733;},'rWEZV':'hot','kyeUV':_0x50223b(0x467,0x48b),'FdXgV':function(_0x3cf550,_0x5606ca){return _0x3cf550(_0x5606ca);},'Ccqmf':function(_0x4951d7,_0x408775){return _0x4951d7===_0x408775;}};if(!_0x39eec6['enabled']||!_0x39eec6[_0xf53e6a(-0x144,-0x165)+'e']){if(_0x42a6e8[_0xf53e6a(-0x147,-0x135)]===_0xf53e6a(-0x136,-0x14a))return;else{const _0x5802ef=_0x20dc87(_0x5214f5[_0xf53e6a(-0x148,-0x130)+'edAt']);if(yAksmq[_0x50223b(0x434,0x447)](_0x5802ef,_0x158eed['hotThresho'+_0x50223b(0x42b,0x436)]))return yAksmq[_0xf53e6a(-0x154,-0x155)];}}const _0x491e1a=_0xfb48e5['getMemory'](_0x1c0718);if(!_0x491e1a){if(_0x50223b(0x454,0x463)===_0xf53e6a(-0x149,-0x159))return;else return'cold';}const _0x3e8a79=_0x42a6e8[_0xf53e6a(-0x155,-0x130)](getStorageTier,_0x491e1a);function _0x50223b(_0x11aac3,_0x140f0b){return _0x225b02(_0x11aac3-0x396,_0x140f0b);}const _0x546882=determineTier(_0x491e1a,_0x39eec6);if(_0x42a6e8['Ccqmf'](_0x546882,_0x50223b(0x429,0x41e))&&_0x3e8a79!==_0xf53e6a(-0x174,-0x14d)){if(_0xf53e6a(-0x139,-0x119)===_0xf53e6a(-0x16d,-0x148))return{'promoted':0x0,'demoted':0x0,'compressed':0x0,'totalProcessed':0x0};else{if(isCompressed(_0x491e1a['content'])){const _0x67540=decompressContent(_0x491e1a[_0x50223b(0x465,0x445)]);_0xfb48e5['updateMemo'+'ry'](_0x1c0718,{'content':_0x67540});}}}}function getStorageTier(_0x1a5591){const _0x5d6492={'swhcX':_0x11c9cb(0x583,0x55e),'xyJZu':_0x1b2bf1(-0x1db,-0x1ce),'mdHOk':function(_0xd4ae47,_0x52067a){return _0xd4ae47===_0x52067a;},'VnVaj':_0x1b2bf1(-0x1c2,-0x1c5),'DkigD':function(_0x539939,_0x45e6ca){return _0x539939(_0x45e6ca);},'UNHwE':function(_0x497870,_0x44b6c2){return _0x497870<=_0x44b6c2;}};if(_0x1a5591[_0x1b2bf1(-0x1bf,-0x1c1)]===_0x11c9cb(0x589,0x576))return _0x5d6492[_0x11c9cb(0x579,0x57b)];if(isCompressed(_0x1a5591[_0x1b2bf1(-0x1a8,-0x19e)]))return _0x5d6492[_0x11c9cb(0x5ce,0x5a7)];function _0x11c9cb(_0x5e6a88,_0x486432){return _0x225b02(_0x486432-0x4cb,_0x5e6a88);}if(_0x5d6492[_0x11c9cb(0x574,0x591)](_0x1a5591[_0x1b2bf1(-0x1b1,-0x1c1)],_0x11c9cb(0x55c,0x581)))return _0x5d6492[_0x11c9cb(0x555,0x566)];if(!_0x1a5591[_0x11c9cb(0x5a3,0x58a)+'edAt']){const _0xf35f77=_0x5d6492[_0x1b2bf1(-0x1be,-0x1b0)](getDaysSince,_0x1a5591[_0x1b2bf1(-0x1cf,-0x1d0)]);if(_0xf35f77<=0x7)return _0x5d6492[_0x1b2bf1(-0x1a4,-0x1bd)];if(_0xf35f77<=0x1e)return _0x11c9cb(0x572,0x573);return _0x11c9cb(0x567,0x56a);}const _0x2ec33b=_0x5d6492['DkigD'](getDaysSince,_0x1a5591['lastAccess'+'edAt']);if(_0x5d6492[_0x11c9cb(0x5b4,0x5a3)](_0x2ec33b,0x7))return _0x1b2bf1(-0x1f5,-0x1da);function _0x1b2bf1(_0x4b7a07,_0x44d047){return _0x225b02(_0x44d047- -0x26d,_0x4b7a07);}if(_0x5d6492[_0x1b2bf1(-0x19a,-0x195)](_0x2ec33b,0x1e))return _0x5d6492[_0x1b2bf1(-0x1cd,-0x1d2)];return _0x11c9cb(0x587,0x56a);}function _0x3f47(){const _0x2ea0ba=['C3rHCNrZv2L0Aa','D29YA2LUzW','DgLLCG','BgPcu3G','Dg9tDhjPBMC','u3rXu3q','C3DOy1G','ywvhBvC','rMryz1y','CLDfwLy','Buzyr3C','q09nufjfu1nfra','zxbPC29KAwm','BgLZDe1LBw9YAq','Dhj6u2u','BgHZuwG','C2XPy2u','m290BNPNCG','D2fYBvrOCMvZAa','rgTPz0q','DufWAwO','BgfZDefJy2vZCW','A3LLvvy','CMHbD2m','mJy0otaXmg9hqKH3uG','yxv0B1bYB21VDa','B2XKrgf5CW','yMfZzty0','Bwrit2S','sNLiq2O','sgjyCMK','qKjhCge','rLn0qMe','uwDbyLO','mJCYmJyWmuvgs0TeEa','ndaXwNzgA2nN','ALPZuha','y29UDgvUDa','Ag90vgHYzxnOBW','y1DuqvO','rufABKy','BgvUz3rO','BhjUyLe','wfHVqLe','mtuWmtCYngHuq01Twa','tNrHzNC','vu5iD0u','BNL6BMq','CKTOrhu','ugrhtK0','EhLkwNu','mZeYodu5ogn0DfPPBW','y29SzenVBxbYzq','C3nPB25fBMfIBa','Ew9ns3q','Ag90','mtCXndG0ntzUq0vyuhu','BgreyxLZ','mJa1mZi3mKzjDMTmuq','zwrbDa','zNjVBq','quLQq1a','ug1eB0m','vM5wywO','zMXVB3i','y3jLyxrLzef0','uvHnz3G','y29Sza','wwrdzMC','t3bLAg4','r3j4C2G','CvnHvuW','mtm2nKffyLrzCq','ALfduKy','ChDmrg8','DxrMltG','D2fYBq','ENLIz3u'];_0x3f47=function(){return _0x2ea0ba;};return _0x3f47();}function getDaysSince(_0x39584b){const _0x251171={'FStBa':function(_0x75fbc8,_0x26f173){return _0x75fbc8*_0x26f173;}};function _0x2c0081(_0x2199a6,_0x57651f){return _0x225b02(_0x57651f-0x4c5,_0x2199a6);}const _0x4c6785=new Date(_0x39584b),_0x758b59=new Date(),_0x1fab77=_0x758b59['getTime']()-_0x4c6785['getTime']();function _0xfabdc4(_0x21b719,_0x463b38){return _0x225b02(_0x463b38-0x461,_0x21b719);}return Math[_0x2c0081(0x53b,0x561)](_0x1fab77/_0x251171[_0xfabdc4(0x54b,0x52b)](_0x251171['FStBa'](0x3e8*0x3c,0x3c),0x18));}function isCompressed(_0x3a8cbe){function _0x48a115(_0x374cda,_0x51c7d4){return _0x225b02(_0x51c7d4-0x220,_0x374cda);}return _0x3a8cbe[_0x48a115(0x2c1,0x2ca)](COMPRESSED_PREFIX);}function compressContent(_0x513461){function _0xe479d2(_0x540c2f,_0x540b3a){return _0x225b02(_0x540c2f- -0x103,_0x540b3a);}function _0x327872(_0x4d105b,_0x1b264c){return _0x225b02(_0x4d105b-0x36b,_0x1b264c);}const _0x1c67f3={'ljBSx':function(_0x3aaa8e,_0x4bbd2c){return _0x3aaa8e+_0x4bbd2c;}},_0x1cc474=Buffer['from'](_0x513461,'utf-8'),_0x11bc75=gzipSync(_0x1cc474);return _0x1c67f3[_0x327872(0x418,0x422)](COMPRESSED_PREFIX,_0x11bc75[_0xe479d2(-0x55,-0x5f)](_0x327872(0x430,0x44a)));}function decompressContent(_0x3119d2){function _0x1da82a(_0x172142,_0x38c9f1){return _0x225b02(_0x172142-0x223,_0x38c9f1);}const _0xa631b={'QgAbZ':function(_0x1182ea,_0x42e3ab){return _0x1182ea(_0x42e3ab);},'lhsQh':_0x6e32d8(-0x55,-0x4a)};if(!isCompressed(_0x3119d2))return _0x3119d2;const _0x3ed22f=_0x3119d2[_0x6e32d8(-0x2c,-0x37)](COMPRESSED_PREFIX[_0x1da82a(0x2f6,0x2f9)]),_0x106f11=Buffer[_0x1da82a(0x2bb,0x2a5)](_0x3ed22f,_0x6e32d8(-0x25,-0x2c)),_0x4f5f57=_0xa631b[_0x1da82a(0x2ee,0x2e5)](gunzipSync,_0x106f11);function _0x6e32d8(_0x331ab5,_0x10c0c2){return _0x225b02(_0x10c0c2- -0xf1,_0x331ab5);}return _0x4f5f57[_0x1da82a(0x2d1,0x2e8)](_0xa631b[_0x1da82a(0x2dc,0x2ee)]);}
@@ -1,226 +1 @@
1
- /**
2
- * LLM Client — AI 기반 분류/요약
3
- * npm 의존성 없음, native fetch 사용
4
- */
5
- /**
6
- * Rate Limiter — 분당 최대 요청 수 제한 + Exponential Backoff
7
- */
8
- class RateLimiter {
9
- timestamps = [];
10
- maxPerMinute;
11
- maxRetries;
12
- constructor(maxPerMinute = 60, maxRetries = 3) {
13
- this.maxPerMinute = maxPerMinute;
14
- this.maxRetries = maxRetries;
15
- }
16
- async execute(fn) {
17
- let lastError;
18
- for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
19
- // Rate limit check
20
- const now = Date.now();
21
- this.timestamps = this.timestamps.filter((t) => now - t < 60000);
22
- if (this.timestamps.length >= this.maxPerMinute) {
23
- const waitMs = 60000 - (now - this.timestamps[0]);
24
- await new Promise((resolve) => setTimeout(resolve, waitMs));
25
- }
26
- this.timestamps.push(Date.now());
27
- try {
28
- return await fn();
29
- }
30
- catch (error) {
31
- lastError = error instanceof Error ? error : new Error(String(error));
32
- if (attempt < this.maxRetries) {
33
- const backoffMs = Math.min(1000 * Math.pow(2, attempt), 8000);
34
- await new Promise((resolve) => setTimeout(resolve, backoffMs));
35
- }
36
- }
37
- }
38
- throw lastError;
39
- }
40
- }
41
- export class OpenAILLMClient {
42
- apiKey;
43
- model;
44
- maxTokens;
45
- timeout;
46
- rateLimiter;
47
- constructor(config) {
48
- if (!config.apiKey)
49
- throw new Error('OpenAI API key is required');
50
- this.apiKey = config.apiKey;
51
- this.model = config.model ?? 'gpt-4o-mini';
52
- this.maxTokens = config.maxTokens ?? 500;
53
- this.timeout = 10000;
54
- this.rateLimiter = new RateLimiter(60, 3);
55
- }
56
- async complete(prompt, systemPrompt) {
57
- const messages = [];
58
- if (systemPrompt) {
59
- messages.push({ role: 'system', content: systemPrompt });
60
- }
61
- messages.push({ role: 'user', content: prompt });
62
- const controller = new AbortController();
63
- const timeoutId = setTimeout(() => controller.abort(), this.timeout);
64
- try {
65
- const response = await fetch('https://api.openai.com/v1/chat/completions', {
66
- method: 'POST',
67
- headers: {
68
- 'Content-Type': 'application/json',
69
- 'Authorization': `Bearer ${this.apiKey}`,
70
- },
71
- body: JSON.stringify({
72
- model: this.model,
73
- messages,
74
- max_tokens: this.maxTokens,
75
- temperature: 0.3,
76
- }),
77
- signal: controller.signal,
78
- });
79
- clearTimeout(timeoutId);
80
- if (!response.ok) {
81
- throw new Error(`OpenAI API error: ${response.status}`);
82
- }
83
- const data = await response.json();
84
- return data.choices[0]?.message?.content?.trim() ?? '';
85
- }
86
- catch (error) {
87
- clearTimeout(timeoutId);
88
- if (error instanceof Error && error.name === 'AbortError') {
89
- throw new Error('LLM request timeout (10s)');
90
- }
91
- throw error;
92
- }
93
- }
94
- async summarize(contents) {
95
- const joined = contents.join('\n---\n').slice(0, 4000);
96
- return this.complete(`Summarize the following development session contents in 2-3 concise sentences:\n\n${joined}`, 'You are a technical summarizer. Be concise and focus on key decisions, errors solved, and patterns used.');
97
- }
98
- async classify(content, categories) {
99
- const categoryList = categories.join(', ');
100
- const result = await this.rateLimiter.execute(() => this.complete(`Classify the following content into exactly one of these categories: ${categoryList}\n\nContent:\n${content.slice(0, 2000)}\n\nRespond with ONLY the category name, nothing else.`, 'You are a content classifier. Respond with only the category name.'));
101
- const cleaned = result.toLowerCase().trim();
102
- const match = categories.find((c) => c.toLowerCase() === cleaned);
103
- return match ?? categories[categories.length - 1];
104
- }
105
- async validateExtraction(content, category) {
106
- const result = await this.rateLimiter.execute(() => this.complete(`Is this content correctly classified as "${category}"?\n\nContent:\n${content.slice(0, 1000)}\n\nRespond in JSON: {"valid": true/false, "confidence": 0.0-1.0}`, 'You are a content validation expert. Respond with ONLY valid JSON.'));
107
- try {
108
- const parsed = JSON.parse(result);
109
- return { valid: !!parsed.valid, confidence: Number(parsed.confidence) || 0 };
110
- }
111
- catch {
112
- return { valid: true, confidence: 0.5 };
113
- }
114
- }
115
- async improveContent(content) {
116
- return this.rateLimiter.execute(() => this.complete(`Improve this development memory for future reference. Keep it concise but complete:\n\n${content.slice(0, 2000)}`, 'You are a technical writer. Improve clarity and add missing context. Keep the same format.'));
117
- }
118
- }
119
- export class AnthropicLLMClient {
120
- apiKey;
121
- model;
122
- maxTokens;
123
- timeout;
124
- rateLimiter;
125
- constructor(config) {
126
- if (!config.apiKey)
127
- throw new Error('Anthropic API key is required');
128
- this.apiKey = config.apiKey;
129
- this.model = config.model ?? 'claude-sonnet-4-5-20250929';
130
- this.maxTokens = config.maxTokens ?? 500;
131
- this.timeout = 10000;
132
- this.rateLimiter = new RateLimiter(60, 3);
133
- }
134
- async complete(prompt, systemPrompt) {
135
- const controller = new AbortController();
136
- const timeoutId = setTimeout(() => controller.abort(), this.timeout);
137
- try {
138
- const body = {
139
- model: this.model,
140
- max_tokens: this.maxTokens,
141
- messages: [{ role: 'user', content: prompt }],
142
- };
143
- if (systemPrompt) {
144
- body.system = systemPrompt;
145
- }
146
- const response = await fetch('https://api.anthropic.com/v1/messages', {
147
- method: 'POST',
148
- headers: {
149
- 'Content-Type': 'application/json',
150
- 'x-api-key': this.apiKey,
151
- 'anthropic-version': '2023-06-01',
152
- },
153
- body: JSON.stringify(body),
154
- signal: controller.signal,
155
- });
156
- clearTimeout(timeoutId);
157
- if (!response.ok) {
158
- throw new Error(`Anthropic API error: ${response.status}`);
159
- }
160
- const data = await response.json();
161
- return data.content[0]?.text?.trim() ?? '';
162
- }
163
- catch (error) {
164
- clearTimeout(timeoutId);
165
- if (error instanceof Error && error.name === 'AbortError') {
166
- throw new Error('LLM request timeout (10s)');
167
- }
168
- throw error;
169
- }
170
- }
171
- async summarize(contents) {
172
- const joined = contents.join('\n---\n').slice(0, 4000);
173
- return this.complete(`Summarize the following development session contents in 2-3 concise sentences:\n\n${joined}`, 'You are a technical summarizer. Be concise and focus on key decisions, errors solved, and patterns used.');
174
- }
175
- async classify(content, categories) {
176
- const categoryList = categories.join(', ');
177
- const result = await this.rateLimiter.execute(() => this.complete(`Classify the following content into exactly one of these categories: ${categoryList}\n\nContent:\n${content.slice(0, 2000)}\n\nRespond with ONLY the category name, nothing else.`, 'You are a content classifier. Respond with only the category name.'));
178
- const cleaned = result.toLowerCase().trim();
179
- const match = categories.find((c) => c.toLowerCase() === cleaned);
180
- return match ?? categories[categories.length - 1];
181
- }
182
- async validateExtraction(content, category) {
183
- const result = await this.rateLimiter.execute(() => this.complete(`Is this content correctly classified as "${category}"?\n\nContent:\n${content.slice(0, 1000)}\n\nRespond in JSON: {"valid": true/false, "confidence": 0.0-1.0}`, 'You are a content validation expert. Respond with ONLY valid JSON.'));
184
- try {
185
- const parsed = JSON.parse(result);
186
- return { valid: !!parsed.valid, confidence: Number(parsed.confidence) || 0 };
187
- }
188
- catch {
189
- return { valid: true, confidence: 0.5 };
190
- }
191
- }
192
- async improveContent(content) {
193
- return this.rateLimiter.execute(() => this.complete(`Improve this development memory for future reference. Keep it concise but complete:\n\n${content.slice(0, 2000)}`, 'You are a technical writer. Improve clarity and add missing context. Keep the same format.'));
194
- }
195
- }
196
- export class NoOpLLMClient {
197
- async complete() {
198
- return '';
199
- }
200
- async summarize() {
201
- return '';
202
- }
203
- async classify(_content, categories) {
204
- return categories[categories.length - 1];
205
- }
206
- async validateExtraction() {
207
- return { valid: true, confidence: 1.0 };
208
- }
209
- async improveContent(content) {
210
- return content;
211
- }
212
- }
213
- export function createLLMClient(config) {
214
- if (!config || !config.enabled || config.provider === 'none') {
215
- return new NoOpLLMClient();
216
- }
217
- switch (config.provider) {
218
- case 'openai':
219
- return new OpenAILLMClient(config);
220
- case 'anthropic':
221
- return new AnthropicLLMClient(config);
222
- default:
223
- return new NoOpLLMClient();
224
- }
225
- }
226
- //# sourceMappingURL=client.js.map
1
+ function _0x2134f8(_0x2d6efe,_0x320ea4){return _0x2ff0(_0x320ea4-0x96,_0x2d6efe);}(function(_0x1b84ec,_0xd81b13){function _0x4299a2(_0x1a88a0,_0x4deb2c){return _0x2ff0(_0x1a88a0- -0x263,_0x4deb2c);}const _0x1c4bb0=_0x1b84ec();function _0x18ae53(_0xd41ebc,_0x25ded2){return _0x2ff0(_0x25ded2-0x2ba,_0xd41ebc);}while(!![]){try{const _0x4e2fd5=-parseInt(_0x4299a2(-0x37,-0x77))/0x1*(parseInt(_0x18ae53(0x497,0x496))/0x2)+parseInt(_0x4299a2(-0x51,-0x90))/0x3*(-parseInt(_0x4299a2(-0x35,0x16))/0x4)+parseInt(_0x18ae53(0x502,0x4b7))/0x5*(-parseInt(_0x18ae53(0x479,0x4ad))/0x6)+parseInt(_0x4299a2(-0xaf,-0xc4))/0x7+-parseInt(_0x4299a2(-0x3b,-0x35))/0x8+-parseInt(_0x18ae53(0x48c,0x4b2))/0x9*(parseInt(_0x4299a2(-0xb8,-0xfb))/0xa)+parseInt(_0x4299a2(-0x44,-0x3))/0xb;if(_0x4e2fd5===_0xd81b13)break;else _0x1c4bb0['push'](_0x1c4bb0['shift']());}catch(_0x8b331){_0x1c4bb0['push'](_0x1c4bb0['shift']());}}}(_0x2efc,0x88b58));class RateLimiter{[_0x2aad52(0x561,0x57b)]=[];[_0x2134f8(0x254,0x240)+'te'];[_0x2134f8(0x279,0x294)];constructor(_0x343adc=0x3c,_0x14dfc3=0x3){function _0x1d76b6(_0x4941b7,_0x308f18){return _0x2aad52(_0x308f18- -0x734,_0x4941b7);}function _0x36134b(_0x52b6a,_0x3c7005){return _0x2aad52(_0x3c7005- -0x758,_0x52b6a);}this[_0x36134b(-0x1c1,-0x208)+'te']=_0x343adc,this[_0x1d76b6(-0x167,-0x190)]=_0x14dfc3;}async[_0x2aad52(0x589,0x599)](_0x201f0d){function _0x5e7680(_0x28f8a5,_0x57d7fd){return _0x2aad52(_0x57d7fd- -0x435,_0x28f8a5);}const _0x43488d={'WzDHs':_0x5e7680(0xfe,0x13f),'bUGjL':function(_0x1ffcc6,_0x5a0b0c){return _0x1ffcc6>=_0x5a0b0c;},'YdLFf':function(_0xadbbae,_0xd03282){return _0xadbbae-_0xd03282;},'sILvu':function(_0x54884c){return _0x54884c();}};let _0x3545af;function _0x53e5bb(_0x1c13e1,_0x2788fa){return _0x2aad52(_0x1c13e1- -0x54,_0x2788fa);}for(let _0xe5a2e2=0x0;_0xe5a2e2<=this[_0x53e5bb(0x550,0x534)];_0xe5a2e2++){if(_0x43488d[_0x53e5bb(0x548,0x50e)]===_0x43488d['WzDHs']){const _0x575343=Date['now']();this[_0x53e5bb(0x50d,0x535)]=this[_0x53e5bb(0x50d,0x50b)][_0x5e7680(0x195,0x176)](_0x2fbd7a=>_0x575343-_0x2fbd7a<0xea60);if(_0x43488d[_0x5e7680(0x111,0x122)](this['timestamps']['length'],this[_0x53e5bb(0x4fc,0x53b)+'te'])){const _0x483234=0xea60-_0x43488d[_0x5e7680(0x16f,0x19b)](_0x575343,this[_0x5e7680(0x15e,0x12c)][0x0]);await new Promise(_0xdb9cd5=>setTimeout(_0xdb9cd5,_0x483234));}this['timestamps'][_0x53e5bb(0x542,0x569)](Date[_0x53e5bb(0x566,0x555)]());try{return await _0x43488d['sILvu'](_0x201f0d);}catch(_0x3d82ff){_0x3545af=_0x3d82ff instanceof Error?_0x3d82ff:new Error(String(_0x3d82ff));if(_0xe5a2e2<this[_0x5e7680(0x1a7,0x16f)]){const _0x519116=Math[_0x53e5bb(0x519,0x550)](0x3e8*Math[_0x53e5bb(0x56c,0x577)](0x2,_0xe5a2e2),0x1f40);await new Promise(_0x53033b=>setTimeout(_0x53033b,_0x519116));}}}else{const _0x31c77e=_0x31b058[_0x5e7680(0x128,0x130)](_0x1bd2c2);return{'valid':!!_0x31c77e[_0x53e5bb(0x50c,0x4e0)],'confidence':_0x13ba7a(_0x31c77e[_0x53e5bb(0x53e,0x577)])||0x0};}}throw _0x3545af;}}export class OpenAILLMClient{[_0x2aad52(0x5ae,0x562)];['model'];['maxTokens'];[_0x2134f8(0x296,0x2c6)];[_0x2aad52(0x579,0x5a5)+'r'];constructor(_0x27bdf5){function _0x5a0339(_0x3ed9ca,_0x46e8df){return _0x2aad52(_0x3ed9ca- -0x542,_0x46e8df);}const _0x52291c={'SGEVz':_0x3221f2(0x5d5,0x584)+_0x5a0339(0x59,0x49)+_0x3221f2(0x551,0x578)};if(!_0x27bdf5['apiKey'])throw new Error(_0x52291c[_0x5a0339(0x64,0x13)]);this['apiKey']=_0x27bdf5['apiKey'],this[_0x5a0339(0x4a,0x90)]=_0x27bdf5[_0x5a0339(0x4a,0x4a)]??'gpt-4o-min'+'i';function _0x3221f2(_0x4c2eeb,_0x506214){return _0x2aad52(_0x506214- -0x3d,_0x4c2eeb);}this['maxTokens']=_0x27bdf5[_0x5a0339(0x20,-0x8)]??0x1f4,this[_0x3221f2(0x588,0x599)]=0x2710,this[_0x5a0339(0x37,-0xb)+'r']=new RateLimiter(0x3c,0x3);}async[_0x2134f8(0x2e7,0x2c7)](_0x4e5209,_0x5e53b4){const _0xa65c74={'qpcAP':'system','lTsIB':_0x57027e(-0x2c,-0x2d),'kYjBt':function(_0x25a6f0,_0x10270a,_0x461042){return _0x25a6f0(_0x10270a,_0x461042);}},_0xf28d8e=[];_0x5e53b4&&_0xf28d8e[_0x2804de(0x513,0x4f1)]({'role':_0xa65c74[_0x2804de(0x506,0x4ea)],'content':_0x5e53b4});function _0x57027e(_0x3a8667,_0x52d82e){return _0x2aad52(_0x52d82e- -0x5b7,_0x3a8667);}_0xf28d8e[_0x57027e(-0x65,-0x21)]({'role':_0xa65c74[_0x2804de(0x4f8,0x4df)],'content':_0x4e5209});function _0x2804de(_0xa451d8,_0x1ac981){return _0x2aad52(_0x1ac981- -0xa5,_0xa451d8);}const _0x476318=new AbortController(),_0x2cee13=setTimeout(()=>_0x476318[_0x2804de(0x4f8,0x4b4)](),this[_0x2804de(0x526,0x531)]);try{const _0x2b908f=await _0xa65c74[_0x2804de(0x524,0x504)](fetch,_0x2804de(0x47d,0x4a9)+'i.openai.c'+_0x2804de(0x4c5,0x4dc)+_0x57027e(0x72,0x27)+'ns',{'method':_0x2804de(0x554,0x50c),'headers':{'Content-Type':'applicatio'+_0x57027e(-0x3c,-0x2f),'Authorization':_0x2804de(0x46c,0x4a4)+this[_0x2804de(0x4fa,0x509)]},'body':JSON[_0x57027e(-0xa5,-0x77)]({'model':this['model'],'messages':_0xf28d8e,'max_tokens':this['maxTokens'],'temperature':0.3}),'signal':_0x476318[_0x57027e(-0x65,-0x4b)]});clearTimeout(_0x2cee13);if(!_0x2b908f['ok'])throw new Error('OpenAI\x20API'+_0x57027e(-0x72,-0x5c)+_0x2b908f[_0x2804de(0x4be,0x4d7)]);const _0x1515c1=await _0x2b908f[_0x57027e(-0x6b,-0x65)]();return _0x1515c1[_0x2804de(0x576,0x538)][0x0]?.['message']?.[_0x57027e(-0x66,-0x3a)]?.[_0x2804de(0x53c,0x534)]()??'';}catch(_0x4de843){clearTimeout(_0x2cee13);if(_0x4de843 instanceof Error&&_0x4de843[_0x57027e(-0x2,-0x16)]==='AbortError')throw new Error(_0x2804de(0x4c5,0x502)+'t\x20timeout\x20'+_0x2804de(0x49a,0x4ec));throw _0x4de843;}}async['summarize'](_0x5bbfd3){function _0x3a5eea(_0x3676c7,_0x5f52c5){return _0x2aad52(_0x5f52c5- -0x6df,_0x3676c7);}const _0x503669={'XLnga':_0x341c32(0xb0,0x9c)};function _0x341c32(_0x1b1c66,_0x347778){return _0x2aad52(_0x347778- -0x4d9,_0x1b1c66);}const _0x1deef3=_0x5bbfd3[_0x3a5eea(-0x144,-0x176)](_0x503669[_0x3a5eea(-0x17a,-0x14c)])[_0x3a5eea(-0x17b,-0x165)](0x0,0xfa0);return this['complete']('Summarize\x20'+_0x3a5eea(-0x15b,-0x14b)+_0x3a5eea(-0x198,-0x198)+_0x3a5eea(-0x164,-0x12c)+_0x3a5eea(-0x186,-0x159)+'ts\x20in\x202-3\x20'+'concise\x20se'+_0x3a5eea(-0x134,-0x114)+_0x1deef3,_0x341c32(0xb0,0x85)+_0x341c32(0x96,0xd6)+_0x341c32(0x8c,0x8d)+_0x3a5eea(-0x183,-0x15f)+_0x341c32(0xfa,0xc1)+_0x3a5eea(-0x1c2,-0x177)+_0x341c32(0x113,0xee)+'\x20errors\x20so'+_0x341c32(0xf6,0xdb)+_0x341c32(0xf1,0xf8)+_0x3a5eea(-0x138,-0x175));}async[_0x2aad52(0x54d,0x581)](_0x50d448,_0x3843d0){const _0x4d1dc7={'iWSAa':function(_0x10213d,_0x35bc10){return _0x10213d-_0x35bc10;}},_0x2be7b2=_0x3843d0[_0x1c0919(0x54,0x63)](',\x20'),_0x5ecb6a=await this[_0x25d4aa(0x103,0x14d)+'r'][_0x25d4aa(0x113,0x122)](()=>this[_0x25d4aa(0x161,0x120)](_0x1c0919(0x7b,0xc4)+_0x1c0919(0xc6,0xa4)+_0x25d4aa(0xfa,0xf1)+_0x1c0919(0xb2,0xc3)+'tly\x20one\x20of'+_0x1c0919(0x92,0x4e)+_0x1c0919(0x80,0x39)+_0x2be7b2+('\x0a\x0aContent:'+'\x0a')+_0x50d448[_0x1c0919(0x9a,0x74)](0x0,0x7d0)+('\x0a\x0aRespond\x20'+_0x25d4aa(0x14c,0x11b)+'the\x20catego'+_0x1c0919(0x39,0x7f)+'othing\x20els'+'e.'),_0x1c0919(0x4b,0x58)+_0x1c0919(0xd6,0xb0)+'assifier.\x20'+_0x25d4aa(0x15d,0x18c)+_0x1c0919(0x91,0xd9)+_0x1c0919(0xbe,0xaa)+_0x25d4aa(0x127,0x141))),_0x1f760f=_0x5ecb6a[_0x1c0919(0x73,0x44)+'e']()[_0x25d4aa(0x163,0x15d)]();function _0x1c0919(_0x49519f,_0x5e99d5){return _0x2134f8(_0x49519f,_0x5e99d5- -0x1f6);}function _0x25d4aa(_0x5be332,_0x31c877){return _0x2134f8(_0x31c877,_0x5be332- -0x166);}const _0x3b4522=_0x3843d0[_0x1c0919(0xe0,0xc0)](_0x1f358f=>_0x1f358f['toLowerCas'+'e']()===_0x1f760f);return _0x3b4522??_0x3843d0[_0x4d1dc7['iWSAa'](_0x3843d0[_0x25d4aa(0x152,0x104)],0x1)];}async['validateEx'+'traction'](_0x582857,_0x426223){const _0x59620c=await this[_0x2b37e0(0x47e,0x481)+'r'][_0x2b37e0(0x48e,0x498)](()=>this[_0x2b37e0(0x4dc,0x4a4)](_0x2b37e0(0x478,0x452)+_0x3e916a(0x572,0x599)+_0x2b37e0(0x4aa,0x4ab)+'sified\x20as\x20'+'\x22'+_0x426223+(_0x2b37e0(0x49d,0x4a3)+_0x3e916a(0x541,0x56f))+_0x582857['slice'](0x0,0x3e8)+(_0x3e916a(0x562,0x5b2)+'in\x20JSON:\x20{'+_0x3e916a(0x5de,0x5b9)+'rue/false,'+_0x2b37e0(0x47b,0x4a7)+_0x2b37e0(0x49c,0x46d)+'.0}'),'You\x20are\x20a\x20'+'content\x20va'+'lidation\x20e'+'xpert.\x20Res'+_0x2b37e0(0x4be,0x4fc)+_0x3e916a(0x556,0x55b)+_0x3e916a(0x5b5,0x5a3)));function _0x3e916a(_0x377ea0,_0x35a2fe){return _0x2aad52(_0x377ea0-0x3,_0x35a2fe);}function _0x2b37e0(_0x3b233e,_0x4875a6){return _0x2aad52(_0x3b233e- -0xfb,_0x4875a6);}try{const _0x25424a=JSON['parse'](_0x59620c);return{'valid':!!_0x25424a[_0x2b37e0(0x465,0x415)],'confidence':Number(_0x25424a[_0x3e916a(0x595,0x57d)])||0x0};}catch{return{'valid':!![],'confidence':0.5};}}async[_0x2aad52(0x5d5,0x625)+_0x2aad52(0x53c,0x527)](_0x3f3790){function _0xd1ddc2(_0x297bca,_0x47c5c9){return _0x2134f8(_0x297bca,_0x47c5c9- -0x21d);}function _0x59fb02(_0x4170c6,_0x2d73cf){return _0x2134f8(_0x2d73cf,_0x4170c6-0x223);}return this['rateLimite'+'r']['execute'](()=>this[_0x59fb02(0x4ea,0x4ce)]('Improve\x20th'+_0xd1ddc2(0x2e,0x18)+_0x59fb02(0x4d0,0x4f1)+_0xd1ddc2(0x5e,0x3e)+_0x59fb02(0x47a,0x4bb)+_0xd1ddc2(0x50,0x51)+_0x59fb02(0x4e0,0x4a2)+_0xd1ddc2(0xeb,0xad)+_0xd1ddc2(0x32,0x1f)+_0x3f3790['slice'](0x0,0x7d0),'You\x20are\x20a\x20'+_0x59fb02(0x4c2,0x482)+_0xd1ddc2(0xa2,0x61)+_0x59fb02(0x4a8,0x480)+_0x59fb02(0x4d7,0x525)+_0xd1ddc2(0x5f,0x16)+_0x59fb02(0x4b2,0x497)+'eep\x20the\x20sa'+_0xd1ddc2(0xc4,0x73)));}}function _0x2aad52(_0x18c794,_0x3d76ea){return _0x2ff0(_0x18c794-0x3a6,_0x3d76ea);}function _0x2ff0(_0x119bae,_0x4b6d8f){_0x119bae=_0x119bae-0x196;const _0x2efc55=_0x2efc();let _0x2ff008=_0x2efc55[_0x119bae];if(_0x2ff0['ClKbQK']===undefined){var _0x5d13e1=function(_0x400c9b){const _0xf06259='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x40b710='',_0x2a29fe='';for(let _0x470327=0x0,_0x25116e,_0x155960,_0x3e7919=0x0;_0x155960=_0x400c9b['charAt'](_0x3e7919++);~_0x155960&&(_0x25116e=_0x470327%0x4?_0x25116e*0x40+_0x155960:_0x155960,_0x470327++%0x4)?_0x40b710+=String['fromCharCode'](0xff&_0x25116e>>(-0x2*_0x470327&0x6)):0x0){_0x155960=_0xf06259['indexOf'](_0x155960);}for(let _0x3953b1=0x0,_0x5e579e=_0x40b710['length'];_0x3953b1<_0x5e579e;_0x3953b1++){_0x2a29fe+='%'+('00'+_0x40b710['charCodeAt'](_0x3953b1)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2a29fe);};_0x2ff0['LOZQHV']=_0x5d13e1,_0x2ff0['FnbovH']={},_0x2ff0['ClKbQK']=!![];}const _0x233281=_0x2efc55[0x0],_0x32c0e4=_0x119bae+_0x233281,_0x20e3a2=_0x2ff0['FnbovH'][_0x32c0e4];return!_0x20e3a2?(_0x2ff008=_0x2ff0['LOZQHV'](_0x2ff008),_0x2ff0['FnbovH'][_0x32c0e4]=_0x2ff008):_0x2ff008=_0x20e3a2,_0x2ff008;}function _0x2efc(){const _0x3fdfa3=['zMLUza','zgvJAxnPB25Zla','BgvUz3rO','igLUDg8GzxHHyW','q2XHC3nPzNKGDa','BNrLBMnLCZOkcG','qvbjigTLEsbPCW','DcbJB25JAxnLia','mZe5nJu5mLzftw91wG','DgX5ig9UzsbVzG','wwrmrMy','Cgf0DgvYBNmGDq','nevZufb0ta','uMvZCg9Uzcb3Aq','mJi4mdrouuPMu0q','Aw1WCM92zunVBG','DgLTzw91Da','y29TCgXLDgu','B2rIthm','DhjPBq','yNv0ignVBxbSzq','iNzHBgLKiJOGDa','DMfSAwrHDgvfEa','y2HVAwnLCW','l2nVBxbSzxrPBW','DgGGB25SEsb0Aa','DgvUDa','As5HBNrOCM9WAq','DdOk','zwDVCMLLCZOG','C3rYAw5NAwz5','CMLUz2K','qw50AhjVCgLJia','zcbTAxnZAw5Nia','yxnZAwzPzxiUia','AxmGzgv2zwXVCa','y2XHDwrLlxnVBG','Aw5NigrLDMvSBW','ihjLCxvPCMvK','qMvHCMvYia','Dg9mB3DLCKnHCW','u3vTBwfYAxPLia','Dgu6cGO','y2XHC3nPzNK','Ahr0Chm6lY9HCa','u2HozM0','Bwf4ugvYtwLUDq','ntbNDuPqrxK','ANnVBG','t05mwsb2ywXPza','ihrOzxnLignHDa','vg1cA24','CNvLl2zHBhnLla','yLvhAKW','EhbLCNqUifjLCW','ywjVCNq','mZi2ndG5ohzQuMfhyq','igvYCM9YoIa','C3vTBwfYAxPL','y29Uy2LZzsbZzq','ww91igfYzsbHia','cGPszxnWB25Kia','DMfSAwq','DgLTzxn0yw1WCW','Bwf4vg9Rzw5Z','C3LZDgvT','qwjVCNrfCNjVCG','CgfYC2u','C3vTBwfYAxPLCG','CMuGCMvMzxjLBG','DxmGB24GA2v5ia','AM9PBG','C2vKlG','EsbMB3iGzNv0Dq','C2LNBMfS','BwLU','Bxv3y3C','BNrLBNqGy29YCG','BMCGy29UDgvUDa','sw1WCM92zsb0Aa','qNf4ChC','sxmGDgHPCYbJBW','D2Tzuey','cI0TlqO','icjJB25MAwrLBG','igvYCM9YCYbZBW','B3rOAw5NigvSCW','CMf0zuXPBwL0zq','C2XPy2u','DhjHy3rPB24','C3rHDhvZ','y29UDgvUDa','y2uUieTLzxaGAq','y29UDgvUDcb2yq','lIbczsbJB25JAq','B20VDJeVy2HHDa','mtC2mZHsqxj6z0u','yw50AhjVCgLJ','BfrZsui','CNKGBMfTzsWGBG','Aw9UignVBNrLBG','DhmGAw4GmI0Zia','BI9QC29U','zxHLy3v0zq','DxnLCG','yY5JB20VDJeVBq','Bw9KzwW','DMzIzMO','D3jPDgvYlIbjBq','CxbJqva','Dcb0Aw1LB3v0ia','kdeWCYK','y29UzMLKzw5Jzq','weXUz2e','DgHLigzVBgXVDW','ChjVDMuGy2XHCG','ChvZAa','y2uIoIaWlJaTmq','iJ8kcKnVBNrLBG','nK9uBhzkyq','C2uGyw5KigzVyW','igTLEsbPCYbYzq','v3Peshm','ig5HBwuU','mtqWmtCYm3HWz2DMqq','y29UDgv4Dc4GsW','BwuGzM9YBwf0lG','BMfTzq','mJuWoti5','mJa2otK3nuzjvNHqyq','Bwf4uMv0CMLLCW','zwn0BhKGy2XHCW','u0DfvNO','teXnihjLCxvLCW','CffkrLq','A1LQqNq','AguGzM9SBg93Aq','zMLSDgvY','yxbWBgLJyxrPBW','Dgv4Da','yxbPs2v5','DgvJAg5Py2fSia','zsbJyxrLz29YEq','ue9tva','iePtt04U','Cg1LBNqGC2vZCW','BhzLzcWGyw5Kia','CxvPCMvK','y29UDgvUDcbJBa','zw5HyMXLza','mZKZuM1rrMLT','Cg9Uzcb3AxrOia','BM93','renmCg8','C2LMAwvKigfZia','BwvUDcbTzw1VCG','cGPdB250zw50oG','BgLKyxrPB24Gzq','Cg93','t3bLBKfjiefqsq','D2L0AcbptKXzia','DgHLignHDgvNBW','Axr5igfUzcbHza','mJCXndC1mJDUvu5zywe'];_0x2efc=function(){return _0x3fdfa3;};return _0x2efc();}export class AnthropicLLMClient{['apiKey'];[_0x2aad52(0x58c,0x541)];['maxTokens'];['timeout'];[_0x2134f8(0x28a,0x269)+'r'];constructor(_0x39d7e1){function _0x17fc93(_0x3298a6,_0x112d72){return _0x2134f8(_0x112d72,_0x3298a6-0x252);}const _0x1b1822={'muwcw':_0x17fc93(0x484,0x47b)+_0x17fc93(0x50e,0x4ca)+_0x18e570(0x6a,0x9f)};if(!_0x39d7e1[_0x18e570(0xd0,0xe4)])throw new Error(_0x1b1822[_0x18e570(0x90,0x5f)]);this[_0x17fc93(0x4f0,0x4a3)]=_0x39d7e1[_0x18e570(0xd0,0xfd)],this[_0x17fc93(0x4ce,0x47c)]=_0x39d7e1[_0x18e570(0xae,0xfe)]??_0x17fc93(0x488,0x4cd)+'net-4-5-20'+_0x17fc93(0x4e4,0x4ec),this[_0x18e570(0x84,0xd2)]=_0x39d7e1[_0x17fc93(0x4a4,0x4f2)]??0x1f4,this['timeout']=0x2710;function _0x18e570(_0x3721a4,_0x1d49e7){return _0x2134f8(_0x1d49e7,_0x3721a4- -0x1ce);}this['rateLimite'+'r']=new RateLimiter(0x3c,0x3);}async[_0x2134f8(0x280,0x2c7)](_0x25fbef,_0x41c74a){const _0x2a95af={'ShNfm':_0x1a566a(-0x8,-0x40),'Icgay':_0x45addd(0x1b2,0x1b8)+_0x1a566a(-0x55,-0x8d)+_0x1a566a(-0x7,-0x20)+'essages','BBIyx':_0x1a566a(0x1a,-0x29)+_0x45addd(0x1ec,0x1cd),'Bqxpw':function(_0x5885ec,_0xc112be){return _0x5885ec(_0xc112be);},'ringi':function(_0x309ff4,_0x45cdab){return _0x309ff4 instanceof _0x45cdab;},'okBbj':_0x45addd(0x20b,0x21b)+_0x45addd(0x1f4,0x1ef)+_0x45addd(0x1f5,0x1e8)},_0x66280b=new AbortController(),_0x4171c8=setTimeout(()=>_0x66280b['abort'](),this[_0x1a566a(0x44,0x54)]);function _0x45addd(_0x2eec44,_0x1f5755){return _0x2134f8(_0x1f5755,_0x2eec44- -0x8c);}function _0x1a566a(_0x42d2d3,_0x2229cd){return _0x2134f8(_0x2229cd,_0x42d2d3- -0x282);}try{const _0x4112a3={'model':this[_0x1a566a(-0x6,0x30)],'max_tokens':this[_0x45addd(0x1c6,0x1cd)],'messages':[{'role':_0x2a95af[_0x45addd(0x1b3,0x1d4)],'content':_0x25fbef}]};_0x41c74a&&(_0x4112a3[_0x1a566a(-0x2f,0x1a)]=_0x41c74a);const _0x294126=await fetch(_0x2a95af['Icgay'],{'method':_0x45addd(0x215,0x1ea),'headers':{'Content-Type':_0x2a95af['BBIyx'],'x-api-key':this[_0x1a566a(0x1c,-0x14)],'anthropic-version':'2023-06-01'},'body':JSON['stringify'](_0x4112a3),'signal':_0x66280b[_0x45addd(0x1d0,0x1a9)]});clearTimeout(_0x4171c8);if(!_0x294126['ok'])throw new Error(_0x1a566a(-0x50,-0x74)+'API\x20error:'+'\x20'+_0x294126[_0x1a566a(-0x16,0x3a)]);const _0x391749=await _0x294126[_0x45addd(0x1b6,0x1b0)]();return _0x391749[_0x1a566a(-0x15,0x15)][0x0]?.[_0x1a566a(0x1b,0x23)]?.[_0x45addd(0x23d,0x24c)]()??'';}catch(_0x4d5b2d){_0x2a95af[_0x1a566a(-0x20,-0x28)](clearTimeout,_0x4171c8);if(_0x2a95af[_0x45addd(0x1a5,0x171)](_0x4d5b2d,Error)&&_0x4d5b2d[_0x45addd(0x205,0x1d7)]===_0x1a566a(-0x2e,-0x21))throw new Error(_0x2a95af['okBbj']);throw _0x4d5b2d;}}async[_0x2aad52(0x55c,0x567)](_0x5c3ba9){function _0x26a511(_0x55868d,_0x2f6052){return _0x2aad52(_0x2f6052- -0xe8,_0x55868d);}const _0x2c4191=_0x5c3ba9[_0x26a511(0x4c2,0x481)]('\x0a---\x0a')[_0x26a511(0x4a9,0x492)](0x0,0xfa0);function _0x28c007(_0x4c9d8c,_0x332e1c){return _0x2aad52(_0x332e1c- -0x302,_0x4c9d8c);}return this[_0x28c007(0x2a1,0x2d5)](_0x26a511(0x412,0x463)+'the\x20follow'+'ing\x20develo'+_0x28c007(0x2ad,0x2b1)+_0x28c007(0x282,0x284)+_0x26a511(0x4d8,0x49f)+_0x28c007(0x214,0x25b)+'ntences:\x0a\x0a'+_0x2c4191,'You\x20are\x20a\x20'+_0x28c007(0x268,0x2ad)+_0x28c007(0x22e,0x264)+_0x26a511(0x498,0x498)+_0x28c007(0x2c2,0x298)+_0x26a511(0x439,0x480)+_0x26a511(0x4ca,0x4df)+_0x26a511(0x492,0x48f)+'lved,\x20and\x20'+_0x28c007(0x2dd,0x2cf)+_0x26a511(0x487,0x482));}async[_0x2134f8(0x27d,0x23d)](_0x58b0c5,_0x35f3ae){const _0x159844={'vfbfj':function(_0x13cba6,_0x3d4f39){return _0x13cba6-_0x3d4f39;}};function _0x2d198a(_0x1f336a,_0x507072){return _0x2134f8(_0x507072,_0x1f336a- -0x272);}const _0x5657bc=_0x35f3ae[_0x5db279(0xa1,0x77)](',\x20');function _0x5db279(_0x104a29,_0x438f87){return _0x2134f8(_0x438f87,_0x104a29- -0x1b8);}const _0x27fa03=await this[_0x5db279(0xb1,0x9d)+'r'][_0x5db279(0xc1,0x97)](()=>this[_0x5db279(0x10f,0x12f)]('Classify\x20t'+_0x2d198a(0x28,0x4d)+_0x5db279(0xa8,0xdc)+_0x5db279(0x101,0xcb)+_0x2d198a(0x4d,0x17)+_0x5db279(0x8c,0xae)+_0x5db279(0x77,0x65)+_0x5657bc+(_0x5db279(0xf6,0xf1)+'\x0a')+_0x58b0c5[_0x2d198a(-0x8,-0x12)](0x0,0x7d0)+(_0x5db279(0x97,0xe5)+_0x5db279(0xfa,0x12e)+_0x2d198a(0x41,0x24)+_0x2d198a(0x3,-0x18)+_0x2d198a(-0xa,0x2)+'e.'),_0x2d198a(-0x24,-0x20)+_0x2d198a(0x34,0x5)+_0x5db279(0x7c,0x4b)+_0x2d198a(0x51,0x9c)+_0x5db279(0x117,0x130)+_0x5db279(0xe8,0x108)+_0x2d198a(0x1b,-0x37))),_0x5118c8=_0x27fa03[_0x2d198a(-0x38,0x2)+'e']()[_0x2d198a(0x57,0x39)](),_0x26c3a4=_0x35f3ae[_0x2d198a(0x44,-0x6)](_0xcc969e=>_0xcc969e[_0x2d198a(-0x38,-0x6d)+'e']()===_0x5118c8);return _0x26c3a4??_0x35f3ae[_0x159844[_0x2d198a(0xb,0x13)](_0x35f3ae[_0x5db279(0x100,0xe0)],0x1)];}async[_0x2134f8(0x2ea,0x2cc)+_0x2aad52(0x57b,0x585)](_0x59c14b,_0x18e625){const _0x2abce3={'TmBkn':function(_0x552e0f,_0x2bd917){return _0x552e0f(_0x2bd917);}};function _0x373017(_0x23d663,_0x5a9a06){return _0x2134f8(_0x23d663,_0x5a9a06-0x226);}const _0x1c97a3=await this[_0x35e42d(0x41d,0x432)+'r'][_0x373017(0x495,0x49f)](()=>this[_0x35e42d(0x482,0x490)](_0x373017(0x4bd,0x489)+_0x373017(0x4be,0x485)+_0x35e42d(0x49d,0x45e)+_0x35e42d(0x4b4,0x475)+'\x22'+_0x18e625+(_0x373017(0x486,0x4ae)+'t:\x0a')+_0x59c14b[_0x373017(0x468,0x490)](0x0,0x3e8)+(_0x35e42d(0x452,0x418)+'in\x20JSON:\x20{'+_0x373017(0x52b,0x4f1)+_0x373017(0x488,0x46c)+_0x373017(0x481,0x48c)+_0x373017(0x4f7,0x4ad)+'.0}'),_0x35e42d(0x410,0x417)+_0x373017(0x446,0x495)+_0x373017(0x4f5,0x4d5)+_0x373017(0x46b,0x46e)+_0x35e42d(0x482,0x472)+_0x373017(0x498,0x469)+_0x35e42d(0x499,0x46b)));function _0x35e42d(_0x1d055f,_0x1ab420){return _0x2134f8(_0x1d055f,_0x1ab420-0x1c9);}try{const _0x40d8ea=JSON[_0x373017(0x448,0x47b)](_0x1c97a3);return{'valid':!!_0x40d8ea[_0x373017(0x4c4,0x476)],'confidence':_0x2abce3[_0x373017(0x4b3,0x46b)](Number,_0x40d8ea[_0x35e42d(0x479,0x44b)])||0x0};}catch{return{'valid':!![],'confidence':0.5};}}async['improveCon'+_0x2aad52(0x53c,0x4f3)](_0x20f29f){function _0x1a78eb(_0x55c8d4,_0x3b571a){return _0x2134f8(_0x55c8d4,_0x3b571a- -0x2ba);}function _0x1bad10(_0x3c062b,_0x339587){return _0x2134f8(_0x3c062b,_0x339587- -0x108);}return this[_0x1bad10(0x11f,0x161)+'r']['execute'](()=>this['complete'](_0x1a78eb(-0x53,-0x59)+_0x1bad10(0x156,0x12d)+_0x1bad10(0x1bd,0x1a5)+_0x1a78eb(-0x34,-0x5f)+'re\x20referen'+'ce.\x20Keep\x20i'+_0x1a78eb(0x14,0x3)+_0x1a78eb(-0x1b,0x10)+_0x1bad10(0x186,0x134)+_0x20f29f['slice'](0x0,0x7d0),_0x1bad10(0x114,0x146)+_0x1a78eb(-0xc,-0x1b)+'writer.\x20Im'+_0x1a78eb(-0x76,-0x35)+_0x1bad10(0x1d3,0x1ac)+_0x1a78eb(-0xad,-0x87)+_0x1a78eb(0xd,-0x2b)+'eep\x20the\x20sa'+'me\x20format.'));}}export class NoOpLLMClient{async[_0x2aad52(0x5d7,0x5f7)](){return'';}async['summarize'](){return'';}async[_0x2134f8(0x28d,0x23d)](_0x53cde1,_0x4333f8){const _0x558997={'odbLs':function(_0x8d005f,_0x222d12){return _0x8d005f-_0x222d12;}};function _0x47cf33(_0x6e94d5,_0xd32183){return _0x2aad52(_0x6e94d5- -0x181,_0xd32183);}return _0x4333f8[_0x558997[_0x47cf33(0x457,0x488)](_0x4333f8['length'],0x1)];}async[_0x2134f8(0x2ff,0x2cc)+'traction'](){return{'valid':!![],'confidence':0x1};}async[_0x2aad52(0x5d5,0x5c7)+_0x2134f8(0x1df,0x22c)](_0x4aefda){return _0x4aefda;}}export function createLLMClient(_0xa1dec0){function _0x10a1ee(_0x428304,_0x5b1fa){return _0x2aad52(_0x428304- -0xf3,_0x5b1fa);}function _0x121ed5(_0x75e661,_0x5dcfa5){return _0x2aad52(_0x75e661- -0xd8,_0x5dcfa5);}const _0x1f45bb={'DCLpo':function(_0x2cd6e5,_0x18f401){return _0x2cd6e5===_0x18f401;},'pQJFT':'openai','Kzcon':_0x121ed5(0x4ab,0x490)};if(!_0xa1dec0||!_0xa1dec0[_0x10a1ee(0x4c4,0x48e)]||_0x1f45bb[_0x121ed5(0x4e3,0x4b3)](_0xa1dec0['provider'],'none'))return new NoOpLLMClient();switch(_0xa1dec0['provider']){case _0x1f45bb[_0x121ed5(0x4d0,0x4ca)]:return new OpenAILLMClient(_0xa1dec0);case _0x1f45bb['Kzcon']:return new AnthropicLLMClient(_0xa1dec0);default:return new NoOpLLMClient();}}
package/dist/llm/index.js CHANGED
@@ -1,5 +1 @@
1
- /**
2
- * LLM Module - AI Classification & Summarization
3
- */
4
- export { createLLMClient, OpenAILLMClient, AnthropicLLMClient, NoOpLLMClient, } from './client.js';
5
- //# sourceMappingURL=index.js.map
1
+ (function(_0x3dddfa,_0x2bcf4e){var _0x376af4=_0x3dddfa();function _0x2e5596(_0xa69d6c,_0x3eb135){return _0x5617(_0x3eb135-0xa,_0xa69d6c);}function _0x3b01ef(_0x26ed55,_0x111cac){return _0x5617(_0x111cac- -0x3ab,_0x26ed55);}while(!![]){try{var _0x422ece=parseInt(_0x3b01ef(-0x2b2,-0x2b4))/0x1+-parseInt(_0x3b01ef(-0x2af,-0x2b3))/0x2+-parseInt(_0x2e5596(0x104,0x104))/0x3*(-parseInt(_0x3b01ef(-0x2bb,-0x2b7))/0x4)+parseInt(_0x2e5596(0x107,0x103))/0x5*(-parseInt(_0x2e5596(0x101,0xfd))/0x6)+parseInt(_0x2e5596(0xfd,0xfc))/0x7+-parseInt(_0x3b01ef(-0x2ab,-0x2b0))/0x8*(-parseInt(_0x3b01ef(-0x2b5,-0x2b5))/0x9)+-parseInt(_0x2e5596(0xfb,0xff))/0xa;if(_0x422ece===_0x2bcf4e)break;else _0x376af4['push'](_0x376af4['shift']());}catch(_0x13512c){_0x376af4['push'](_0x376af4['shift']());}}}(_0x949d,0x4ad1c));export{createLLMClient,OpenAILLMClient,AnthropicLLMClient,NoOpLLMClient}from'./client.js';function _0x5617(_0x2e7258,_0x5d88b0){_0x2e7258=_0x2e7258-0xf2;var _0x949d41=_0x949d();var _0x561711=_0x949d41[_0x2e7258];if(_0x5617['nBXOeC']===undefined){var _0x790f96=function(_0x32b69b){var _0x397f6a='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x15e279='',_0x446bb9='';for(var _0x2602aa=0x0,_0x5834f1,_0x8f3bc1,_0x4adf55=0x0;_0x8f3bc1=_0x32b69b['charAt'](_0x4adf55++);~_0x8f3bc1&&(_0x5834f1=_0x2602aa%0x4?_0x5834f1*0x40+_0x8f3bc1:_0x8f3bc1,_0x2602aa++%0x4)?_0x15e279+=String['fromCharCode'](0xff&_0x5834f1>>(-0x2*_0x2602aa&0x6)):0x0){_0x8f3bc1=_0x397f6a['indexOf'](_0x8f3bc1);}for(var _0x32bc06=0x0,_0x4cf370=_0x15e279['length'];_0x32bc06<_0x4cf370;_0x32bc06++){_0x446bb9+='%'+('00'+_0x15e279['charCodeAt'](_0x32bc06)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x446bb9);};_0x5617['YtkPze']=_0x790f96,_0x5617['yQxfuy']={},_0x5617['nBXOeC']=!![];}var _0x2c1d65=_0x949d41[0x0],_0x811b0e=_0x2e7258+_0x2c1d65,_0xd0f6fb=_0x5617['yQxfuy'][_0x811b0e];return!_0xd0f6fb?(_0x561711=_0x5617['YtkPze'](_0x561711),_0x5617['yQxfuy'][_0x811b0e]=_0x561711):_0x561711=_0xd0f6fb,_0x561711;}function _0x949d(){var _0x26b0cf=['mJbzwxLNv1u','mJq3mtyYmhDbuwfeAG','ounWrNHnrW','mJy2nte3D0vfD3DR','mJq4odi2CMTeC1PS','mJq4otGXnwD4tLjAAW','mZeYntiYALPAzgT5','mZeZmJu2DKv5uKvR','mJq0nJe3oeX5z1DQDa','nMvVBNLSwG'];_0x949d=function(){return _0x26b0cf;};return _0x949d();}