a2a-memory 0.11.5 → 0.11.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) 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 -298
  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 -79
  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 -46
  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 -90
  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.js +1 -1400
  33. package/dist/embedding/e5-provider.js +1 -147
  34. package/dist/embedding/index.js +1 -34
  35. package/dist/embedding/local-provider.js +1 -157
  36. package/dist/embedding/openai-provider.js +1 -92
  37. package/dist/embedding/quantization.js +1 -89
  38. package/dist/extraction/dedup-manager.js +1 -161
  39. package/dist/extraction/emotion-filter.js +1 -33
  40. package/dist/extraction/extractor.js +1 -648
  41. package/dist/extraction/file-reference.js +1 -77
  42. package/dist/extraction/filter.js +1 -86
  43. package/dist/extraction/scorer.js +1 -142
  44. package/dist/extraction/similarity.js +1 -85
  45. package/dist/hooks/client-factory.js +1 -44
  46. package/dist/hooks/post-tool-use.js +1 -518
  47. package/dist/hooks/pre-compact.js +1 -209
  48. package/dist/hooks/session-end.js +1 -633
  49. package/dist/hooks/session-start.js +1 -549
  50. package/dist/hooks/shared.js +1 -110
  51. package/dist/hooks/user-prompt-submit.js +1 -316
  52. package/dist/i18n/index.js +1 -2
  53. package/dist/i18n/messages.js +1 -150
  54. package/dist/index.js +1 -43
  55. package/dist/lifecycle/cleanup-scheduler.js +1 -137
  56. package/dist/lifecycle/cleanup.js +1 -116
  57. package/dist/lifecycle/index.js +1 -13
  58. package/dist/lifecycle/quality-scorer.js +1 -46
  59. package/dist/lifecycle/tiering.js +1 -246
  60. package/dist/llm/client.js +1 -226
  61. package/dist/llm/index.js +1 -5
  62. package/dist/proficiency/actr-engine.js +1 -106
  63. package/dist/proficiency/detection.js +1 -77
  64. package/dist/proficiency/index.js +1 -9
  65. package/dist/proficiency/tracker.js +1 -173
  66. package/dist/proficiency/types.js +1 -8
  67. package/dist/providers/adapters.js +1 -140
  68. package/dist/providers/detector.js +1 -57
  69. package/dist/search/adaptive-router.js +1 -93
  70. package/dist/search/index.js +1 -9
  71. package/dist/search/ranker.js +1 -171
  72. package/dist/search/reranker.js +1 -155
  73. package/dist/session/parser.js +1 -130
  74. package/dist/skill/evaluator.js +1 -509
  75. package/dist/skill/index.js +1 -7
  76. package/dist/skill/types.js +1 -7
  77. package/dist/sync/client.js +1 -597
  78. package/dist/sync/encryption.js +1 -203
  79. package/dist/sync/index.js +1 -12
  80. package/dist/sync/queue.js +1 -214
  81. package/dist/sync/scheduler.js +1 -140
  82. package/dist/sync/synchronizer.js +1 -241
  83. package/dist/sync/team-synchronizer.js +1 -204
  84. package/dist/sync/vector-clock.js +1 -70
  85. package/dist/types/index.d.ts +1 -1
  86. package/dist/types/index.js +1 -132
  87. package/dist/utils/keychain.js +1 -170
  88. package/dist/utils/logger.js +1 -128
  89. package/package.json +14 -10
  90. package/dist/a2a/client.d.ts.map +0 -1
  91. package/dist/a2a/client.js.map +0 -1
  92. package/dist/a2a/discovery.d.ts.map +0 -1
  93. package/dist/a2a/discovery.js.map +0 -1
  94. package/dist/a2a/index.d.ts.map +0 -1
  95. package/dist/a2a/index.js.map +0 -1
  96. package/dist/a2a/types.d.ts.map +0 -1
  97. package/dist/a2a/types.js.map +0 -1
  98. package/dist/adapters/anthropic.d.ts.map +0 -1
  99. package/dist/adapters/anthropic.js.map +0 -1
  100. package/dist/chunking/chunker.d.ts.map +0 -1
  101. package/dist/chunking/chunker.js.map +0 -1
  102. package/dist/claude/sync.d.ts.map +0 -1
  103. package/dist/claude/sync.js.map +0 -1
  104. package/dist/cli/commands/add.d.ts.map +0 -1
  105. package/dist/cli/commands/add.js.map +0 -1
  106. package/dist/cli/commands/claude-sync.d.ts.map +0 -1
  107. package/dist/cli/commands/claude-sync.js.map +0 -1
  108. package/dist/cli/commands/cleanup.d.ts.map +0 -1
  109. package/dist/cli/commands/cleanup.js.map +0 -1
  110. package/dist/cli/commands/config.d.ts.map +0 -1
  111. package/dist/cli/commands/config.js.map +0 -1
  112. package/dist/cli/commands/edit.d.ts.map +0 -1
  113. package/dist/cli/commands/edit.js.map +0 -1
  114. package/dist/cli/commands/embed.d.ts.map +0 -1
  115. package/dist/cli/commands/embed.js.map +0 -1
  116. package/dist/cli/commands/extract.d.ts.map +0 -1
  117. package/dist/cli/commands/extract.js.map +0 -1
  118. package/dist/cli/commands/health.d.ts.map +0 -1
  119. package/dist/cli/commands/health.js.map +0 -1
  120. package/dist/cli/commands/list.d.ts.map +0 -1
  121. package/dist/cli/commands/list.js.map +0 -1
  122. package/dist/cli/commands/migrate-chunks.d.ts.map +0 -1
  123. package/dist/cli/commands/migrate-chunks.js.map +0 -1
  124. package/dist/cli/commands/migrate-file-refs.d.ts.map +0 -1
  125. package/dist/cli/commands/migrate-file-refs.js.map +0 -1
  126. package/dist/cli/commands/proficiency.d.ts.map +0 -1
  127. package/dist/cli/commands/proficiency.js.map +0 -1
  128. package/dist/cli/commands/rm.d.ts.map +0 -1
  129. package/dist/cli/commands/rm.js.map +0 -1
  130. package/dist/cli/commands/search.d.ts.map +0 -1
  131. package/dist/cli/commands/search.js.map +0 -1
  132. package/dist/cli/commands/setup-wizard.d.ts.map +0 -1
  133. package/dist/cli/commands/setup-wizard.js.map +0 -1
  134. package/dist/cli/commands/setup.d.ts.map +0 -1
  135. package/dist/cli/commands/setup.js.map +0 -1
  136. package/dist/cli/commands/skill.d.ts.map +0 -1
  137. package/dist/cli/commands/skill.js.map +0 -1
  138. package/dist/cli/commands/status.d.ts.map +0 -1
  139. package/dist/cli/commands/status.js.map +0 -1
  140. package/dist/cli/commands/sync.d.ts.map +0 -1
  141. package/dist/cli/commands/sync.js.map +0 -1
  142. package/dist/cli/commands/team.d.ts.map +0 -1
  143. package/dist/cli/commands/team.js.map +0 -1
  144. package/dist/cli/index.d.ts.map +0 -1
  145. package/dist/cli/index.js.map +0 -1
  146. package/dist/config/manager.d.ts.map +0 -1
  147. package/dist/config/manager.js.map +0 -1
  148. package/dist/db/database.d.ts.map +0 -1
  149. package/dist/db/database.js.map +0 -1
  150. package/dist/embedding/e5-provider.d.ts.map +0 -1
  151. package/dist/embedding/e5-provider.js.map +0 -1
  152. package/dist/embedding/index.d.ts.map +0 -1
  153. package/dist/embedding/index.js.map +0 -1
  154. package/dist/embedding/local-provider.d.ts.map +0 -1
  155. package/dist/embedding/local-provider.js.map +0 -1
  156. package/dist/embedding/openai-provider.d.ts.map +0 -1
  157. package/dist/embedding/openai-provider.js.map +0 -1
  158. package/dist/embedding/quantization.d.ts.map +0 -1
  159. package/dist/embedding/quantization.js.map +0 -1
  160. package/dist/extraction/dedup-manager.d.ts.map +0 -1
  161. package/dist/extraction/dedup-manager.js.map +0 -1
  162. package/dist/extraction/emotion-filter.d.ts.map +0 -1
  163. package/dist/extraction/emotion-filter.js.map +0 -1
  164. package/dist/extraction/extractor.d.ts.map +0 -1
  165. package/dist/extraction/extractor.js.map +0 -1
  166. package/dist/extraction/file-reference.d.ts.map +0 -1
  167. package/dist/extraction/file-reference.js.map +0 -1
  168. package/dist/extraction/filter.d.ts.map +0 -1
  169. package/dist/extraction/filter.js.map +0 -1
  170. package/dist/extraction/scorer.d.ts.map +0 -1
  171. package/dist/extraction/scorer.js.map +0 -1
  172. package/dist/extraction/similarity.d.ts.map +0 -1
  173. package/dist/extraction/similarity.js.map +0 -1
  174. package/dist/hooks/client-factory.d.ts.map +0 -1
  175. package/dist/hooks/client-factory.js.map +0 -1
  176. package/dist/hooks/post-tool-use.d.ts.map +0 -1
  177. package/dist/hooks/post-tool-use.js.map +0 -1
  178. package/dist/hooks/pre-compact.d.ts.map +0 -1
  179. package/dist/hooks/pre-compact.js.map +0 -1
  180. package/dist/hooks/session-end.d.ts.map +0 -1
  181. package/dist/hooks/session-end.js.map +0 -1
  182. package/dist/hooks/session-start.d.ts.map +0 -1
  183. package/dist/hooks/session-start.js.map +0 -1
  184. package/dist/hooks/shared.d.ts.map +0 -1
  185. package/dist/hooks/shared.js.map +0 -1
  186. package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
  187. package/dist/hooks/user-prompt-submit.js.map +0 -1
  188. package/dist/i18n/index.d.ts.map +0 -1
  189. package/dist/i18n/index.js.map +0 -1
  190. package/dist/i18n/messages.d.ts.map +0 -1
  191. package/dist/i18n/messages.js.map +0 -1
  192. package/dist/index.d.ts.map +0 -1
  193. package/dist/index.js.map +0 -1
  194. package/dist/lifecycle/cleanup-scheduler.d.ts.map +0 -1
  195. package/dist/lifecycle/cleanup-scheduler.js.map +0 -1
  196. package/dist/lifecycle/cleanup.d.ts.map +0 -1
  197. package/dist/lifecycle/cleanup.js.map +0 -1
  198. package/dist/lifecycle/index.d.ts.map +0 -1
  199. package/dist/lifecycle/index.js.map +0 -1
  200. package/dist/lifecycle/quality-scorer.d.ts.map +0 -1
  201. package/dist/lifecycle/quality-scorer.js.map +0 -1
  202. package/dist/lifecycle/tiering.d.ts.map +0 -1
  203. package/dist/lifecycle/tiering.js.map +0 -1
  204. package/dist/llm/client.d.ts.map +0 -1
  205. package/dist/llm/client.js.map +0 -1
  206. package/dist/llm/index.d.ts.map +0 -1
  207. package/dist/llm/index.js.map +0 -1
  208. package/dist/proficiency/actr-engine.d.ts.map +0 -1
  209. package/dist/proficiency/actr-engine.js.map +0 -1
  210. package/dist/proficiency/detection.d.ts.map +0 -1
  211. package/dist/proficiency/detection.js.map +0 -1
  212. package/dist/proficiency/index.d.ts.map +0 -1
  213. package/dist/proficiency/index.js.map +0 -1
  214. package/dist/proficiency/tracker.d.ts.map +0 -1
  215. package/dist/proficiency/tracker.js.map +0 -1
  216. package/dist/proficiency/types.d.ts.map +0 -1
  217. package/dist/proficiency/types.js.map +0 -1
  218. package/dist/providers/adapters.d.ts.map +0 -1
  219. package/dist/providers/adapters.js.map +0 -1
  220. package/dist/providers/detector.d.ts.map +0 -1
  221. package/dist/providers/detector.js.map +0 -1
  222. package/dist/search/adaptive-router.d.ts.map +0 -1
  223. package/dist/search/adaptive-router.js.map +0 -1
  224. package/dist/search/index.d.ts.map +0 -1
  225. package/dist/search/index.js.map +0 -1
  226. package/dist/search/ranker.d.ts.map +0 -1
  227. package/dist/search/ranker.js.map +0 -1
  228. package/dist/search/reranker.d.ts.map +0 -1
  229. package/dist/search/reranker.js.map +0 -1
  230. package/dist/session/parser.d.ts.map +0 -1
  231. package/dist/session/parser.js.map +0 -1
  232. package/dist/skill/evaluator.d.ts.map +0 -1
  233. package/dist/skill/evaluator.js.map +0 -1
  234. package/dist/skill/index.d.ts.map +0 -1
  235. package/dist/skill/index.js.map +0 -1
  236. package/dist/skill/types.d.ts.map +0 -1
  237. package/dist/skill/types.js.map +0 -1
  238. package/dist/sync/client.d.ts.map +0 -1
  239. package/dist/sync/client.js.map +0 -1
  240. package/dist/sync/encryption.d.ts.map +0 -1
  241. package/dist/sync/encryption.js.map +0 -1
  242. package/dist/sync/index.d.ts.map +0 -1
  243. package/dist/sync/index.js.map +0 -1
  244. package/dist/sync/queue.d.ts.map +0 -1
  245. package/dist/sync/queue.js.map +0 -1
  246. package/dist/sync/scheduler.d.ts.map +0 -1
  247. package/dist/sync/scheduler.js.map +0 -1
  248. package/dist/sync/synchronizer.d.ts.map +0 -1
  249. package/dist/sync/synchronizer.js.map +0 -1
  250. package/dist/sync/team-synchronizer.d.ts.map +0 -1
  251. package/dist/sync/team-synchronizer.js.map +0 -1
  252. package/dist/sync/vector-clock.d.ts.map +0 -1
  253. package/dist/sync/vector-clock.js.map +0 -1
  254. package/dist/types/index.d.ts.map +0 -1
  255. package/dist/types/index.js.map +0 -1
  256. package/dist/utils/keychain.d.ts.map +0 -1
  257. package/dist/utils/keychain.js.map +0 -1
  258. package/dist/utils/logger.d.ts.map +0 -1
  259. package/dist/utils/logger.js.map +0 -1
@@ -1,161 +1 @@
1
- /**
2
- * Mem0-style 4-Way Memory Deduplication Manager
3
- *
4
- * 새 메모리 생성 전 기존 메모리와 비교하여 최적의 동작 결정:
5
- * - ADD: 유사 메모리 없음 → 새로 생성
6
- * - UPDATE: 유사도 > 0.8 → 기존 메모리 내용 병합/갱신
7
- * - DELETE: 새 정보가 기존을 무효화 → 기존 삭제 후 새로 생성
8
- * - NOOP: 유사도 > 0.95 → 완전 중복, 무시
9
- */
10
- import { cosineSimilarity } from './similarity.js';
11
- /** 유사도 임계값 */
12
- const NOOP_THRESHOLD = 0.95; // 거의 동일
13
- const UPDATE_THRESHOLD = 0.8; // 유사하지만 보충 가능
14
- const DELETE_THRESHOLD = 0.92; // 무효화 패턴 감지 시 (오탐 방지를 위해 상향)
15
- /** 단독으로는 무효화 신호가 아닌 키워드 (2개 이상 동시에 있어야 무효화 판정) */
16
- const WEAK_INVALIDATION_KEYWORDS = [
17
- 'fixed', 'resolved',
18
- '수정됨', '해결됨',
19
- ];
20
- /** 단독으로도 무효화 신호인 강한 키워드 */
21
- const STRONG_INVALIDATION_KEYWORDS = [
22
- 'deprecated', 'obsolete', 'no longer', 'replaced by', 'migrated to',
23
- 'removed', 'deleted', 'workaround no longer needed',
24
- '더 이상', '대체됨', '삭제됨', '폐기',
25
- ];
26
- /**
27
- * 새 콘텐츠가 기존 콘텐츠를 무효화하는지 판단
28
- * - 강한 키워드: 1개라도 있으면 무효화
29
- * - 약한 키워드(fixed/resolved 등): 2개 이상 동시 존재해야 무효화
30
- */
31
- function detectInvalidation(newContent, _existingContent) {
32
- const lowerNew = newContent.toLowerCase();
33
- // 강한 키워드: 1개만 있어도 무효화
34
- if (STRONG_INVALIDATION_KEYWORDS.some(kw => lowerNew.includes(kw))) {
35
- return true;
36
- }
37
- // 약한 키워드: 2개 이상 동시에 있어야 무효화
38
- const weakMatches = WEAK_INVALIDATION_KEYWORDS.filter(kw => lowerNew.includes(kw));
39
- return weakMatches.length >= 2;
40
- }
41
- /**
42
- * 두 텍스트의 유사도를 계산 (임베딩 없이 텍스트 기반)
43
- * Jaccard 유사도 + 문자열 포함 관계
44
- */
45
- function textSimilarity(a, b) {
46
- const wordsA = new Set(a.toLowerCase().split(/\s+/).filter(w => w.length > 2));
47
- const wordsB = new Set(b.toLowerCase().split(/\s+/).filter(w => w.length > 2));
48
- if (wordsA.size === 0 || wordsB.size === 0)
49
- return 0;
50
- let intersection = 0;
51
- for (const w of wordsA) {
52
- if (wordsB.has(w))
53
- intersection++;
54
- }
55
- const union = new Set([...wordsA, ...wordsB]).size;
56
- return union > 0 ? intersection / union : 0;
57
- }
58
- export class DedupManager {
59
- /**
60
- * 4-Way 판단: 새 콘텐츠를 기존 메모리와 비교
61
- *
62
- * @param newContent 새로 저장할 콘텐츠
63
- * @param existingMemories 비교 대상 기존 메모리 (동일 프로젝트+카테고리)
64
- * @param newEmbedding 새 콘텐츠의 임베딩 (있으면 코사인 유사도 사용)
65
- */
66
- decide(newContent, existingMemories, newEmbedding) {
67
- if (existingMemories.length === 0) {
68
- return { action: 'ADD', similarity: 0, reason: 'No existing memories to compare' };
69
- }
70
- let bestSimilarity = 0;
71
- let bestMatch;
72
- for (const mem of existingMemories) {
73
- let sim;
74
- // 임베딩이 둘 다 있으면 코사인 유사도, 아니면 텍스트 유사도
75
- if (newEmbedding && mem.embedding && mem.embedding.length > 0 &&
76
- newEmbedding.length === mem.embedding.length) {
77
- sim = cosineSimilarity(newEmbedding, mem.embedding);
78
- }
79
- else {
80
- sim = textSimilarity(newContent, mem.content);
81
- }
82
- if (sim > bestSimilarity) {
83
- bestSimilarity = sim;
84
- bestMatch = mem;
85
- }
86
- }
87
- // NOOP: 완전 중복
88
- if (bestSimilarity >= NOOP_THRESHOLD && bestMatch) {
89
- return {
90
- action: 'NOOP',
91
- targetMemory: bestMatch,
92
- similarity: bestSimilarity,
93
- reason: `Near-duplicate (similarity: ${bestSimilarity.toFixed(3)})`,
94
- };
95
- }
96
- // DELETE + ADD: 무효화 패턴 감지
97
- if (bestSimilarity >= DELETE_THRESHOLD && bestMatch &&
98
- detectInvalidation(newContent, bestMatch.content)) {
99
- return {
100
- action: 'DELETE',
101
- targetMemory: bestMatch,
102
- similarity: bestSimilarity,
103
- reason: `Invalidation detected (similarity: ${bestSimilarity.toFixed(3)})`,
104
- };
105
- }
106
- // UPDATE: 유사하지만 보충 가능
107
- if (bestSimilarity >= UPDATE_THRESHOLD && bestMatch) {
108
- return {
109
- action: 'UPDATE',
110
- targetMemory: bestMatch,
111
- similarity: bestSimilarity,
112
- reason: `Similar content found, merging (similarity: ${bestSimilarity.toFixed(3)})`,
113
- };
114
- }
115
- // ADD: 유사한 메모리 없음
116
- return {
117
- action: 'ADD',
118
- similarity: bestSimilarity,
119
- reason: bestSimilarity > 0
120
- ? `Best match similarity (${bestSimilarity.toFixed(3)}) below threshold`
121
- : 'No similar memories found',
122
- };
123
- }
124
- /**
125
- * 두 메모리 콘텐츠를 병합 (UPDATE용)
126
- * 기존 콘텐츠 + 새 정보 추가
127
- */
128
- mergeContent(existingContent, newContent) {
129
- // 기존 콘텐츠에 새 내용이 이미 포함되어 있으면 그대로 반환
130
- if (existingContent.includes(newContent.trim())) {
131
- return existingContent;
132
- }
133
- // 새 내용에서 기존과 중복되지 않는 부분만 추출
134
- const existingLines = new Set(existingContent.split('\n').map(l => l.trim()).filter(l => l.length > 0));
135
- const newLines = newContent.split('\n')
136
- .map(l => l.trim())
137
- .filter(l => l.length > 0 && !existingLines.has(l));
138
- if (newLines.length === 0) {
139
- return existingContent;
140
- }
141
- // 기존 + 새 줄 결합 (최대 2000자)
142
- const merged = existingContent + '\n[Updated] ' + newLines.join('\n');
143
- return merged.slice(0, 2000);
144
- }
145
- /**
146
- * 기존 메모리에서 유사한 것들을 찾아 비교 대상 목록 구성
147
- */
148
- findCandidates(memories, category, projectPath, limit = 50) {
149
- return memories
150
- .filter(m => {
151
- if (m.category !== category)
152
- return false;
153
- if (projectPath && m.projectPath !== projectPath)
154
- return false;
155
- return true;
156
- })
157
- .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime())
158
- .slice(0, limit);
159
- }
160
- }
161
- //# sourceMappingURL=dedup-manager.js.map
1
+ (function(_0x384212,_0x2b45ca){function _0x5c88cd(_0x42b577,_0x4d269c){return _0x14dc(_0x4d269c-0x258,_0x42b577);}const _0x385590=_0x384212();function _0x4ed2e3(_0x1bce2d,_0x19fd0d){return _0x14dc(_0x19fd0d- -0x16d,_0x1bce2d);}while(!![]){try{const _0x42bf9f=-parseInt(_0x4ed2e3(0x48,0x51))/0x1+parseInt(_0x5c88cd(0x3f8,0x3e7))/0x2*(-parseInt(_0x5c88cd(0x3ed,0x405))/0x3)+parseInt(_0x4ed2e3(0x53,0x2e))/0x4+parseInt(_0x5c88cd(0x3d5,0x3dc))/0x5*(-parseInt(_0x5c88cd(0x40a,0x3de))/0x6)+parseInt(_0x4ed2e3(0x58,0x34))/0x7*(parseInt(_0x5c88cd(0x401,0x3e9))/0x8)+parseInt(_0x5c88cd(0x428,0x40d))/0x9+parseInt(_0x4ed2e3(-0xc,0x1e))/0xa;if(_0x42bf9f===_0x2b45ca)break;else _0x385590['push'](_0x385590['shift']());}catch(_0x2322c3){_0x385590['push'](_0x385590['shift']());}}}(_0x33ab,0x4d929));import{cosineSimilarity}from'./similarity.js';const NOOP_THRESHOLD=0.95,UPDATE_THRESHOLD=0.8,DELETE_THRESHOLD=0.92;function _0x43d4a9(_0x2e8ef4,_0x4a191a){return _0x14dc(_0x2e8ef4- -0x2fa,_0x4a191a);}const WEAK_INVALIDATION_KEYWORDS=[_0xecfa82(0x57a,0x55c),_0x43d4a9(-0x13e,-0x127),_0x43d4a9(-0x151,-0x12e),_0xecfa82(0x58d,0x576)];function _0xecfa82(_0x4df057,_0x34a17f){return _0x14dc(_0x4df057-0x3e3,_0x34a17f);}const STRONG_INVALIDATION_KEYWORDS=[_0x43d4a9(-0x17b,-0x162),_0xecfa82(0x593,0x56a),'no\x20longer',_0x43d4a9(-0x181,-0x1a1)+'y',_0x43d4a9(-0x178,-0x169)+'o',_0xecfa82(0x55b,0x53a),_0x43d4a9(-0x137,-0x134),'workaround'+_0x43d4a9(-0x155,-0x130)+_0xecfa82(0x5a9,0x5b0),_0xecfa82(0x55a,0x54b),_0xecfa82(0x59b,0x593),'삭제됨','폐기'];function detectInvalidation(_0x5d6e0c,_0x33fc8b){function _0x1644b4(_0x3d11fe,_0x28ec2d){return _0x43d4a9(_0x3d11fe-0x1b,_0x28ec2d);}function _0x26f2d2(_0x29c502,_0x1a25d1){return _0x43d4a9(_0x29c502-0x5eb,_0x1a25d1);}const _0x3c34c8=_0x5d6e0c[_0x1644b4(-0x116,-0x132)+'e']();if(STRONG_INVALIDATION_KEYWORDS['some'](_0x12bc49=>_0x3c34c8[_0x1644b4(-0x164,-0x15c)](_0x12bc49)))return!![];const _0x251915=WEAK_INVALIDATION_KEYWORDS[_0x26f2d2(0x4b3,0x4be)](_0x4cd54e=>_0x3c34c8[_0x26f2d2(0x46c,0x497)](_0x4cd54e));return _0x251915['length']>=0x2;}function textSimilarity(_0x9d9d92,_0x524eaf){const _0x405929={'OEGoL':function(_0x277f08,_0x4b4106){return _0x277f08!==_0x4b4106;},'AUjmB':_0x3c9b25(0x220,0x230),'DJCDB':function(_0x7e39b2,_0x1d5bb3){return _0x7e39b2>_0x1d5bb3;}},_0x427576=new Set(_0x9d9d92[_0x4953ce(-0x1e9,-0x1d0)+'e']()[_0x4953ce(-0x20e,-0x1e6)](/\s+/)['filter'](_0x288030=>_0x288030['length']>0x2));function _0x4953ce(_0x33ee94,_0x47791f){return _0x43d4a9(_0x33ee94- -0xb8,_0x47791f);}const _0x223e5f=new Set(_0x524eaf[_0x4953ce(-0x1e9,-0x1c1)+'e']()['split'](/\s+/)[_0x3c9b25(0x256,0x281)](_0x267736=>_0x267736[_0x4953ce(-0x236,-0x241)]>0x2));function _0x3c9b25(_0x4c9624,_0x131c05){return _0x43d4a9(_0x4c9624-0x38e,_0x131c05);}if(_0x427576[_0x3c9b25(0x258,0x272)]===0x0||_0x223e5f['size']===0x0)return 0x0;let _0x2c76a8=0x0;for(const _0x3a3f59 of _0x427576){if(_0x405929[_0x3c9b25(0x212,0x1ff)](_0x4953ce(-0x21d,-0x233),_0x405929[_0x3c9b25(0x228,0x23a)])){if(_0x223e5f[_0x3c9b25(0x233,0x227)](_0x3a3f59))_0x2c76a8++;}else return!![];}const _0x51892f=new Set([..._0x427576,..._0x223e5f])[_0x3c9b25(0x258,0x25d)];return _0x405929[_0x4953ce(-0x206,-0x217)](_0x51892f,0x0)?_0x2c76a8/_0x51892f:0x0;}function _0x14dc(_0x5e83a1,_0x5d8007){_0x5e83a1=_0x5e83a1-0x176;const _0x33ab98=_0x33ab();let _0x14dc27=_0x33ab98[_0x5e83a1];if(_0x14dc['Otyscm']===undefined){var _0x4d433b=function(_0x411b89){const _0x689e3b='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x1b3bc4='',_0x1fa473='';for(let _0x3937b9=0x0,_0x519c6f,_0x1209df,_0xeb0e0b=0x0;_0x1209df=_0x411b89['charAt'](_0xeb0e0b++);~_0x1209df&&(_0x519c6f=_0x3937b9%0x4?_0x519c6f*0x40+_0x1209df:_0x1209df,_0x3937b9++%0x4)?_0x1b3bc4+=String['fromCharCode'](0xff&_0x519c6f>>(-0x2*_0x3937b9&0x6)):0x0){_0x1209df=_0x689e3b['indexOf'](_0x1209df);}for(let _0x1aac73=0x0,_0x3530c7=_0x1b3bc4['length'];_0x1aac73<_0x3530c7;_0x1aac73++){_0x1fa473+='%'+('00'+_0x1b3bc4['charCodeAt'](_0x1aac73)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x1fa473);};_0x14dc['wjYPdh']=_0x4d433b,_0x14dc['RPhgtr']={},_0x14dc['Otyscm']=!![];}const _0x418fac=_0x33ab98[0x0],_0xd75529=_0x5e83a1+_0x418fac,_0x2f8b46=_0x14dc['RPhgtr'][_0xd75529];return!_0x2f8b46?(_0x14dc27=_0x14dc['wjYPdh'](_0x14dc27),_0x14dc['RPhgtr'][_0xd75529]=_0x14dc27):_0x14dc27=_0x2f8b46,_0x14dc27;}export class DedupManager{['decide'](_0x5c2756,_0xd35c9d,_0x5777ae){const _0x41dab6={'RgKcR':_0xe0f71d(0x30b,0x314)+_0xe0f71d(0x30e,0x332)+_0xe0f71d(0x309,0x306)+'e','nBiHL':function(_0x420ba8,_0x3ace9f,_0x5004db){return _0x420ba8(_0x3ace9f,_0x5004db);},'wwtCL':function(_0x237572,_0x55f629,_0x4172d9){return _0x237572(_0x55f629,_0x4172d9);},'brfMA':function(_0x506c13,_0x33a47d){return _0x506c13>_0x33a47d;},'VxTGG':function(_0x3540a4,_0x5478ed){return _0x3540a4>=_0x5478ed;},'psBXl':'NOOP','xGFyc':_0x49f9d6(0x236,0x210),'gBrTJ':_0xe0f71d(0x30d,0x2f5)};if(_0xd35c9d[_0x49f9d6(0x207,0x1e2)]===0x0)return{'action':_0xe0f71d(0x327,0x340),'similarity':0x0,'reason':_0x41dab6[_0xe0f71d(0x2c9,0x2ee)]};function _0x49f9d6(_0x40293f,_0x321cf0){return _0xecfa82(_0x40293f- -0x358,_0x321cf0);}let _0x3e8a59=0x0,_0x5c8091;function _0xe0f71d(_0xa4461f,_0x3d1af3){return _0xecfa82(_0x3d1af3- -0x26b,_0xa4461f);}for(const _0x44125b of _0xd35c9d){let _0x4b6be8;_0x5777ae&&_0x44125b['embedding']&&_0x44125b[_0x49f9d6(0x21e,0x230)]['length']>0x0&&_0x5777ae[_0x49f9d6(0x207,0x22a)]===_0x44125b[_0xe0f71d(0x2e4,0x30b)][_0x49f9d6(0x207,0x1e3)]?_0x4b6be8=_0x41dab6['nBiHL'](cosineSimilarity,_0x5777ae,_0x44125b[_0xe0f71d(0x314,0x30b)]):_0x4b6be8=_0x41dab6['wwtCL'](textSimilarity,_0x5c2756,_0x44125b[_0x49f9d6(0x223,0x20a)]),_0x41dab6['brfMA'](_0x4b6be8,_0x3e8a59)&&(_0x3e8a59=_0x4b6be8,_0x5c8091=_0x44125b);}if(_0x41dab6[_0x49f9d6(0x232,0x21f)](_0x3e8a59,NOOP_THRESHOLD)&&_0x5c8091)return{'action':_0x41dab6[_0x49f9d6(0x221,0x205)],'targetMemory':_0x5c8091,'similarity':_0x3e8a59,'reason':'Near-dupli'+_0x49f9d6(0x22d,0x210)+_0xe0f71d(0x309,0x312)+_0x3e8a59['toFixed'](0x3)+')'};if(_0x3e8a59>=DELETE_THRESHOLD&&_0x5c8091&&detectInvalidation(_0x5c2756,_0x5c8091[_0xe0f71d(0x303,0x310)]))return{'action':_0x41dab6[_0x49f9d6(0x255,0x24a)],'targetMemory':_0x5c8091,'similarity':_0x3e8a59,'reason':'Invalidati'+_0x49f9d6(0x214,0x1f6)+_0x49f9d6(0x20c,0x224)+_0xe0f71d(0x33e,0x344)+_0x3e8a59[_0x49f9d6(0x23e,0x222)](0x3)+')'};if(_0x41dab6[_0x49f9d6(0x232,0x221)](_0x3e8a59,UPDATE_THRESHOLD)&&_0x5c8091)return _0x49f9d6(0x22b,0x255)===_0x41dab6[_0xe0f71d(0x2e6,0x30a)]?_0x47ff8e:{'action':_0x49f9d6(0x248,0x261),'targetMemory':_0x5c8091,'similarity':_0x3e8a59,'reason':_0xe0f71d(0x326,0x2fb)+'ntent\x20foun'+_0xe0f71d(0x31d,0x33d)+_0x49f9d6(0x218,0x20b)+_0xe0f71d(0x2fd,0x311)+_0x3e8a59[_0xe0f71d(0x311,0x32b)](0x3)+')'};return{'action':_0x49f9d6(0x253,0x257),'similarity':_0x3e8a59,'reason':_0x3e8a59>0x0?_0x49f9d6(0x241,0x250)+_0xe0f71d(0x326,0x316)+_0x49f9d6(0x246,0x248)+_0x3e8a59[_0x49f9d6(0x23e,0x239)](0x3)+(_0xe0f71d(0x320,0x308)+_0x49f9d6(0x252,0x272)):_0xe0f71d(0x30d,0x315)+_0x49f9d6(0x239,0x244)+_0xe0f71d(0x33d,0x331)};}[_0x43d4a9(-0x13b,-0x14d)+'nt'](_0x389c88,_0x2eb3be){const _0x1c84ea={'vYKlw':function(_0x4ab223,_0x432416){return _0x4ab223!==_0x432416;},'Adtbr':'OuHbT','aRylG':_0x1d4062(-0x152,-0x132)};function _0x1d4062(_0x312829,_0x1d2f4f){return _0xecfa82(_0x1d2f4f- -0x695,_0x312829);}if(_0x389c88['includes'](_0x2eb3be[_0x1d4062(-0xe3,-0x101)]()))return _0x389c88;function _0x3d5f50(_0x5f56d3,_0x163ce6){return _0xecfa82(_0x163ce6- -0x55a,_0x5f56d3);}const _0x1c284f=new Set(_0x389c88[_0x3d5f50(0x3e,0x2d)]('\x0a')['map'](_0x4a095d=>_0x4a095d[_0x3d5f50(0x5a,0x3a)]())[_0x3d5f50(0x48,0x4b)](_0x8b0424=>_0x8b0424[_0x3d5f50(0x23,0x5)]>0x0)),_0x1b8692=_0x2eb3be[_0x3d5f50(0x33,0x2d)]('\x0a')['map'](_0x5975a3=>_0x5975a3['trim']())[_0x1d4062(-0x111,-0xf0)](_0x59bf33=>_0x59bf33['length']>0x0&&!_0x1c284f[_0x3d5f50(0x21,0x28)](_0x59bf33));if(_0x1b8692['length']===0x0){if(_0x1c84ea[_0x1d4062(-0x136,-0x10f)](_0x1c84ea[_0x1d4062(-0x125,-0x12b)],_0x1c84ea[_0x1d4062(-0xff,-0xf2)]))return _0x389c88;else{if(_0x302631['category']!==_0x44d8cc)return![];if(_0x28f980&&_0x1c84ea[_0x1d4062(-0x108,-0x10f)](_0x1d7f85['projectPat'+'h'],_0x4e89e7))return![];return!![];}}const _0x54626a=_0x389c88+('\x0a[Updated]'+'\x20')+_0x1b8692['join']('\x0a');return _0x54626a[_0x3d5f50(0x37,0x38)](0x0,0x7d0);}[_0xecfa82(0x5ae,0x5b5)+_0xecfa82(0x568,0x55e)](_0xd34768,_0x32add0,_0x314ee6,_0x354db0=0x32){function _0x54d99b(_0x133f31,_0x58c63f){return _0x43d4a9(_0x58c63f-0x573,_0x133f31);}const _0x2fb3f5={'ewkNY':function(_0x4b9329,_0x2ec815){return _0x4b9329+_0x2ec815;},'bcPIg':function(_0xb65d52,_0x558278){return _0xb65d52+_0x558278;},'GxTSi':_0x54d99b(0x408,0x403),'GhbPw':function(_0x490578,_0xaa3025){return _0x490578!==_0xaa3025;}};function _0x45d071(_0x56af47,_0x4eb5e8){return _0x43d4a9(_0x56af47-0x3f6,_0x4eb5e8);}return _0xd34768[_0x45d071(0x2be,0x2d8)](_0x531eda=>{function _0x2ab92c(_0x3801b7,_0x3a9713){return _0x45d071(_0x3a9713- -0x320,_0x3801b7);}function _0x2bec04(_0x3518dd,_0x3f4ebd){return _0x45d071(_0x3f4ebd-0x247,_0x3518dd);}if(_0x2fb3f5['GxTSi']!==_0x2ab92c(-0xab,-0x9a)){if(_0x3958a1[_0x2ab92c(-0xce,-0xa9)](_0x26f7b3[_0x2bec04(0x4db,0x4f4)]()))return _0x3b27bf;const _0x374c48=new _0x167021(_0xfe70c7[_0x2ab92c(-0x73,-0x80)]('\x0a')[_0x2bec04(0x4c6,0x4eb)](_0x1ecb8d=>_0x1ecb8d['trim']())[_0x2ab92c(-0x83,-0x62)](_0x2c3588=>_0x2c3588[_0x2ab92c(-0x8a,-0xa8)]>0x0)),_0x10ba90=_0x2d5807['split']('\x0a')['map'](_0x3931e7=>_0x3931e7[_0x2bec04(0x4eb,0x4f4)]())[_0x2ab92c(-0x3b,-0x62)](_0x25e3d6=>_0x25e3d6[_0x2ab92c(-0xbf,-0xa8)]>0x0&&!_0x374c48[_0x2ab92c(-0x8d,-0x85)](_0x25e3d6));if(_0x10ba90['length']===0x0)return _0x1f9e22;const _0xfb5558=WZLTyf[_0x2bec04(0x4f8,0x4f5)](WZLTyf[_0x2bec04(0x4a0,0x4cb)](_0xb995d5,'\x0a[Updated]'+'\x20'),_0x10ba90['join']('\x0a'));return _0xfb5558[_0x2bec04(0x4dc,0x4f2)](0x0,0x7d0);}else{if(_0x531eda[_0x2ab92c(-0x65,-0x63)]!==_0x32add0)return![];if(_0x314ee6&&_0x2fb3f5[_0x2bec04(0x4ed,0x4fa)](_0x531eda['projectPat'+'h'],_0x314ee6))return![];return!![];}})[_0x45d071(0x276,0x26d)]((_0xb7013b,_0x4e28dc)=>new Date(_0x4e28dc[_0x54d99b(0x41a,0x42d)])[_0x54d99b(0x404,0x41f)]()-new Date(_0xb7013b[_0x54d99b(0x411,0x42d)])[_0x54d99b(0x41a,0x41f)]())['slice'](0x0,_0x354db0);}}function _0x33ab(){const _0x10b414=['ig5VigXVBMDLCG','z2v0vgLTzq','vNHur0C','BwfW','7iIy7kcv65cO','7zw06RkW65cO','revmrvrf','rePdrei','m2fIswLItW','ig1LBw9YAwvZia','C2XPy2u','B2jZB2XLDgu','DhjPBq','zxDRtLK','Dg9gAxHLza','DxbKyxrLzef0','otm1nZy2Dw5nqwHc','qMvZDcbTyxrJAa','r2HIuhC','64Ya7lk065cO','zM91BMq','zYbTzw1VCMLLCW','EsaO','CMvZB2X2zwq','vvbeqvrf','mtC1nZu3EujuAvvg','BwvYz2vdB250zq','yvj5BeC','y2f0zwDVCNK','zMLSDgvY','zgvSzxrLza','C2L6zq','zcWGBwvYz2LUzW','ig5LzwrLza','CMvZAg9Sza','qure','Dg9mB3DLCKnHCW','EeDgEwm','zMLUzenHBMrPza','Axr5oIa','uMDly1i','642uioYDToYdGq','CMvTB3zLza','CMvWBgfJzwqGyG','C29YDa','Aw5JBhvKzxm','BgvUz3rO','z1fcuey','t0vhB0W','zgvWCMvJyxrLza','wxzLEwS','zcaOC2LTAwXHCG','BwLNCMf0zwqGDa','u2LTAwXHCIbJBW','mtvXCwf3tgq','yxrLCW','mte5nde2mMjfrfzSDW','qwr0yNi','yMnqswC','B24Gzgv0zwn0zq','uxnmr2m','mtyWmti3mfL1zuH1Ca','ueXqrhi','icHZAw1PBgfYAq','ihrVignVBxbHCG','ndK3ndy4B09Lyuf6','ksbIzwXVDYb0Aa','mZuZmduZnK5eCKPwBq','z0jYveO','zw1IzwrKAw5N','qvvQBui','B1zoqLC','ChncwgW','zML4zwq','y29UDgvUDa','DhK6ia','BgfYAxr5oIa','mJuZntu2nhjyELPsua','tM8GzxHPC3rPBG','tM8GC2LTAwXHCG','ihnPBwLSyxjPDa','AgfZ','rK9syLG','n2rlBKjHBa','y2f0zsaOC2LTAq','DLLlBhC','C3bSAxq'];_0x33ab=function(){return _0x10b414;};return _0x33ab();}
@@ -1,33 +1 @@
1
- /**
2
- * Emotion Filter
3
- *
4
- * 사용자 프롬프트에서 감정적 신호를 감지하는 경량 프리필터.
5
- * Backend emotion.py의 _detect_mood_rules 키워드와 동기화.
6
- */
7
- const EMOTION_KEYWORDS = [
8
- // 한국어 긍정
9
- '기뻐', '행복', '좋아', '최고', '신나', '감사', '고마워', '대박', '완벽', '잘됐',
10
- // 한국어 부정
11
- '슬퍼', '우울', '힘들어', '불안', '걱정', '짜증', '답답', '화나', '스트레스', '피곤',
12
- '지쳐', '힘들', '귀찮', '열받', '짜증나', '실망', '후회', '아쉬', '속상',
13
- // 한국어 중립/상태
14
- '집중', '몰입', '바쁘', '여유',
15
- // 영어
16
- 'happy', 'sad', 'frustrated', 'stressed', 'tired', 'anxious', 'excited',
17
- 'angry', 'overwhelmed', 'confused', 'grateful', 'proud', 'disappointed',
18
- 'worried', 'exhausted', 'motivated', 'bored',
19
- // 이모티콘/이모지
20
- 'ㅠㅠ', 'ㅜㅜ', 'ㅎㅎ', 'ㅋㅋ',
21
- ];
22
- /** 최소 프롬프트 길이 (짧은 명령어 필터링) */
23
- const MIN_PROMPT_LENGTH = 10;
24
- /**
25
- * 프롬프트에 감정적 신호가 있는지 검사
26
- */
27
- export function hasEmotionalContent(text) {
28
- if (text.length < MIN_PROMPT_LENGTH)
29
- return false;
30
- const lower = text.toLowerCase();
31
- return EMOTION_KEYWORDS.some(kw => lower.includes(kw));
32
- }
33
- //# sourceMappingURL=emotion-filter.js.map
1
+ function _0x32598e(_0x2380c9,_0x43d36a){return _0xf201(_0x43d36a- -0x6d,_0x2380c9);}(function(_0x2b715d,_0xcfbc64){const _0x3524ec=_0x2b715d();function _0x19481d(_0x2b98cb,_0xc0f7f1){return _0xf201(_0xc0f7f1-0x2ec,_0x2b98cb);}function _0x3dae94(_0x341245,_0x28ba5b){return _0xf201(_0x28ba5b-0x2f9,_0x341245);}while(!![]){try{const _0x3935fd=-parseInt(_0x3dae94(0x3d1,0x3d5))/0x1+-parseInt(_0x19481d(0x3d3,0x3d4))/0x2+parseInt(_0x19481d(0x3c9,0x3bc))/0x3*(-parseInt(_0x19481d(0x3b3,0x3c1))/0x4)+parseInt(_0x19481d(0x3c5,0x3c6))/0x5*(-parseInt(_0x3dae94(0x3d9,0x3d9))/0x6)+-parseInt(_0x3dae94(0x3bd,0x3cb))/0x7*(-parseInt(_0x19481d(0x3af,0x3b9))/0x8)+-parseInt(_0x19481d(0x3c7,0x3ba))/0x9+parseInt(_0x3dae94(0x3dc,0x3e0))/0xa;if(_0x3935fd===_0xcfbc64)break;else _0x3524ec['push'](_0x3524ec['shift']());}catch(_0x154aa9){_0x3524ec['push'](_0x3524ec['shift']());}}}(_0x5444,0xefafc));function _0x5444(){const _0x429813=['D29YCMLLza','ndeWmZC5mK9bEePyqq','mti0nteXntH2r1HHsvq','7z6y65oK7jA0','nNPjCNrvEq','Dg9mB3DLCKnHCW','mtrqCKDntKS','ChjVDwq','zgLZyxbWB2LUDa','mZeZnduZnNnpD2PSqW','AgfWChK','BgvUz3rO','zxHOyxvZDgvK','Aw5JBhvKzxm','mtGXmJu1rMfHrwHf','C3rYzxnZzwq','mta2ndq1mev0qwrtsG','zxHJAxrLza','wLnhzLi','y29UzNvZzwq','mJrhAKjqz2O','C29Tzq','C2fK','z3jHDgvMDwW','7iQK7yQ466ci7iQK','yw5NCNK','yw54Aw91CW','ndi2mJKWmtbYse5hsuK','mJKZode4rhPsEvf2','6RoG66Ei7jUm','yM9Yzwq'];_0x5444=function(){return _0x429813;};return _0x5444();}function _0xf201(_0x4b9c77,_0x3e16ed){_0x4b9c77=_0x4b9c77-0xcc;const _0x544487=_0x5444();let _0xf201dd=_0x544487[_0x4b9c77];if(_0xf201['RAXRyN']===undefined){var _0x142e3b=function(_0x26dfca){const _0x2f92b5='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x4d7b11='',_0x55d939='';for(let _0x3428ce=0x0,_0x15af8c,_0x161284,_0x4bea70=0x0;_0x161284=_0x26dfca['charAt'](_0x4bea70++);~_0x161284&&(_0x15af8c=_0x3428ce%0x4?_0x15af8c*0x40+_0x161284:_0x161284,_0x3428ce++%0x4)?_0x4d7b11+=String['fromCharCode'](0xff&_0x15af8c>>(-0x2*_0x3428ce&0x6)):0x0){_0x161284=_0x2f92b5['indexOf'](_0x161284);}for(let _0x5cc9a9=0x0,_0xe2ff89=_0x4d7b11['length'];_0x5cc9a9<_0xe2ff89;_0x5cc9a9++){_0x55d939+='%'+('00'+_0x4d7b11['charCodeAt'](_0x5cc9a9)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x55d939);};_0xf201['xVChYY']=_0x142e3b,_0xf201['tXooOB']={},_0xf201['RAXRyN']=!![];}const _0x5d2699=_0x544487[0x0],_0x4b8fb0=_0x4b9c77+_0x5d2699,_0xa1591d=_0xf201['tXooOB'][_0x4b8fb0];return!_0xa1591d?(_0xf201dd=_0xf201['xVChYY'](_0xf201dd),_0xf201['tXooOB'][_0x4b8fb0]=_0xf201dd):_0xf201dd=_0xa1591d,_0xf201dd;}function _0x43e7d6(_0x2fe499,_0x83716d){return _0xf201(_0x83716d- -0x396,_0x2fe499);}const EMOTION_KEYWORDS=['기뻐','행복','좋아','최고','신나','감사',_0x43e7d6(-0x2a5,-0x2ad),'대박','완벽','잘됐','슬퍼','우울',_0x32598e(0x5b,0x62),'불안','걱정','짜증','답답','화나',_0x32598e(0x73,0x77),'피곤','지쳐','힘들','귀찮','열받','짜증나','실망','후회','아쉬','속상','집중','몰입','바쁘','여유',_0x32598e(0x6c,0x69),_0x32598e(0x6a,0x75),'frustrated',_0x43e7d6(-0x2c7,-0x2bb),'tired',_0x43e7d6(-0x2b4,-0x2b0),_0x43e7d6(-0x2ba,-0x2b9),_0x32598e(0x87,0x78),'overwhelme'+'d',_0x32598e(0x80,0x72),_0x43e7d6(-0x2c0,-0x2b3),_0x43e7d6(-0x2b4,-0x2c3),_0x32598e(0x58,0x67)+'ed',_0x32598e(0x56,0x5f),_0x32598e(0x78,0x6b),'motivated',_0x32598e(0x73,0x7d),'ㅠㅠ','ㅜㅜ','ㅎㅎ','ㅋㅋ'],MIN_PROMPT_LENGTH=0xa;export function hasEmotionalContent(_0x4f09b9){const _0x59f74b={'ZSGfR':function(_0x27db16,_0x5ccf7d){return _0x27db16<_0x5ccf7d;}};if(_0x59f74b[_0x13c248(0x2dc,0x2d8)](_0x4f09b9[_0x5b793e(-0x2b5,-0x2ad)],MIN_PROMPT_LENGTH))return![];const _0x4831a7=_0x4f09b9[_0x13c248(0x2cf,0x2c8)+'e']();function _0x5b793e(_0x4637b3,_0x3e2072){return _0x32598e(_0x4637b3,_0x3e2072- -0x317);}function _0x13c248(_0x100b06,_0x22bf03){return _0x32598e(_0x22bf03,_0x100b06-0x26b);}return EMOTION_KEYWORDS[_0x13c248(0x2df,0x2ea)](_0x10e7f8=>_0x4831a7[_0x5b793e(-0x2ba,-0x2ab)](_0x10e7f8));}