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,57 +1 @@
1
- /**
2
- * AI Provider Detector
3
- *
4
- * 환경변수/세션 형식으로 AI 프로바이더를 자동 감지합니다.
5
- * Claude, GPT, Gemini 등 다양한 AI 도구에서의 실행을 감지합니다.
6
- */
7
- /**
8
- * 환경변수와 세션 컨텍스트에서 AI 프로바이더를 감지합니다.
9
- */
10
- export function detectProvider(env) {
11
- const processEnv = env ?? process.env;
12
- const evidence = [];
13
- let provider = 'unknown';
14
- let confidence = 0;
15
- // Claude 감지
16
- if (processEnv.CLAUDE_CODE_VERSION || processEnv.ANTHROPIC_API_KEY) {
17
- provider = 'claude';
18
- confidence = 0.95;
19
- if (processEnv.CLAUDE_CODE_VERSION)
20
- evidence.push('CLAUDE_CODE_VERSION env');
21
- if (processEnv.ANTHROPIC_API_KEY)
22
- evidence.push('ANTHROPIC_API_KEY env');
23
- }
24
- // OpenAI GPT 감지
25
- if (processEnv.OPENAI_API_KEY || processEnv.GPT_MODEL) {
26
- if (confidence < 0.9) {
27
- provider = 'openai';
28
- confidence = 0.9;
29
- }
30
- if (processEnv.OPENAI_API_KEY)
31
- evidence.push('OPENAI_API_KEY env');
32
- if (processEnv.GPT_MODEL)
33
- evidence.push('GPT_MODEL env');
34
- }
35
- // Gemini 감지
36
- if (processEnv.GOOGLE_API_KEY || processEnv.GEMINI_API_KEY) {
37
- if (confidence < 0.85) {
38
- provider = 'gemini';
39
- confidence = 0.85;
40
- }
41
- if (processEnv.GOOGLE_API_KEY)
42
- evidence.push('GOOGLE_API_KEY env');
43
- if (processEnv.GEMINI_API_KEY)
44
- evidence.push('GEMINI_API_KEY env');
45
- }
46
- // A2A_PROVIDER 직접 지정 (최우선)
47
- if (processEnv.A2A_PROVIDER) {
48
- const explicit = processEnv.A2A_PROVIDER.toLowerCase();
49
- if (['claude', 'openai', 'gemini'].includes(explicit)) {
50
- provider = explicit;
51
- confidence = 1.0;
52
- evidence.push(`A2A_PROVIDER=${explicit}`);
53
- }
54
- }
55
- return { provider, confidence, evidence };
56
- }
57
- //# sourceMappingURL=detector.js.map
1
+ (function(_0x29a2d3,_0x1e61f8){const _0xdd1971=_0x29a2d3();function _0x343ad1(_0x5fd396,_0x3f00b2){return _0x4d95(_0x3f00b2- -0x3b7,_0x5fd396);}function _0x2d7fee(_0x4e7986,_0x41b280){return _0x4d95(_0x4e7986- -0xb1,_0x41b280);}while(!![]){try{const _0x1df607=-parseInt(_0x2d7fee(0x72,0x6c))/0x1+-parseInt(_0x343ad1(-0x2aa,-0x2a4))/0x2+-parseInt(_0x2d7fee(0x52,0x40))/0x3+parseInt(_0x343ad1(-0x2b1,-0x2ac))/0x4+parseInt(_0x2d7fee(0x69,0x69))/0x5*(-parseInt(_0x2d7fee(0x5c,0x5d))/0x6)+parseInt(_0x2d7fee(0x61,0x54))/0x7+parseInt(_0x343ad1(-0x2aa,-0x2ad))/0x8;if(_0x1df607===_0x1e61f8)break;else _0xdd1971['push'](_0xdd1971['shift']());}catch(_0x43d5cd){_0xdd1971['push'](_0xdd1971['shift']());}}}(_0x3ad1,0x8081e));function _0x4d95(_0x7333d1,_0x5ef9a5){_0x7333d1=_0x7333d1-0x101;const _0x3ad1bb=_0x3ad1();let _0x4d9585=_0x3ad1bb[_0x7333d1];if(_0x4d95['WCbuhq']===undefined){var _0x1b240d=function(_0xd40aa0){const _0xa69523='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3fe12a='',_0x3f0067='';for(let _0x189ded=0x0,_0x47ce29,_0x150200,_0xfccfee=0x0;_0x150200=_0xd40aa0['charAt'](_0xfccfee++);~_0x150200&&(_0x47ce29=_0x189ded%0x4?_0x47ce29*0x40+_0x150200:_0x150200,_0x189ded++%0x4)?_0x3fe12a+=String['fromCharCode'](0xff&_0x47ce29>>(-0x2*_0x189ded&0x6)):0x0){_0x150200=_0xa69523['indexOf'](_0x150200);}for(let _0x29eaf9=0x0,_0x103f84=_0x3fe12a['length'];_0x29eaf9<_0x103f84;_0x29eaf9++){_0x3f0067+='%'+('00'+_0x3fe12a['charCodeAt'](_0x29eaf9)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3f0067);};_0x4d95['iswfHY']=_0x1b240d,_0x4d95['ucdESe']={},_0x4d95['WCbuhq']=!![];}const _0x2d826e=_0x3ad1bb[0x0],_0x4d463b=_0x7333d1+_0x2d826e,_0x59733e=_0x4d95['ucdESe'][_0x4d463b];return!_0x59733e?(_0x4d9585=_0x4d95['iswfHY'](_0x4d9585),_0x4d95['ucdESe'][_0x4d463b]=_0x4d9585):_0x4d9585=_0x59733e,_0x4d9585;}function _0x3ad1(){const _0x3134ec=['qu5usfjpueLdxW','ChvZAa','qvbjx0Tfwq','s1Lsu1O','r0vnsu5jx0fqsq','BhDrBK8','mZG0mdGZnwH2A09dyG','Dw5RBM93BG','x0Tfwq','qLf3qwG','rvi9','zw52','r09pr0Xfx0fqsq','rv9wrvjtsu9o','y2XHDwrL','nZu4ndC2q1HJDenI','zxjlqLu','Aw5JBhvKzxm','nZaXnJCWCxbYtxDs','q0Xbvurfx0npra','B3bLBMfP','z2vTAw5P','ExfHtu0','t1bftKfjx0fqsq','qvbjx0TfwsbLBG','mtq2nZq5ndrUyKDUDg4','mZiYmtj1r2Lez2q','r1bux01prevm','nNf0CvzvEG','x0TfwsbLBNy','uNvlwMu','r1bux01prevmia','zuDsyum','nJm4ntu1nhbWyNP1CW','otm1ndG4sKDAtwvu'];_0x3ad1=function(){return _0x3134ec;};return _0x3ad1();}export function detectProvider(_0x165573){const _0xe9d058={'eGRaC':_0x542de1(0x2df,0x2e7)+_0x542de1(0x2d4,0x2c3)+'v','BQwAh':_0x107479(0x456,0x466),'RuKZe':_0x542de1(0x2ed,0x2f8),'erKBU':function(_0x200495,_0x137e5b){return _0x200495<_0x137e5b;},'zGGpV':_0x107479(0x44b,0x450)+_0x542de1(0x2ea,0x2f7),'KYRSZ':'openai','yqaMM':'gemini'};function _0x542de1(_0x31a9bb,_0x3765d7){return _0x4d95(_0x31a9bb-0x1cb,_0x3765d7);}const _0x482538=_0x165573??process.env,_0xa44206=[];function _0x107479(_0x4a8ae1,_0x4d30a5){return _0x4d95(_0x4a8ae1-0x33b,_0x4d30a5);}let _0x5ee4be=_0xe9d058[_0x107479(0x458,0x459)],_0x4b3afa=0x0;if(_0x482538['CLAUDE_COD'+'E_VERSION']||_0x482538[_0x542de1(0x2df,0x2f0)+'API_KEY']){_0x5ee4be=_0xe9d058[_0x107479(0x44a,0x44a)],_0x4b3afa=0.95;if(_0x482538[_0x107479(0x43f,0x441)+_0x107479(0x45c,0x467)])_0xa44206[_0x107479(0x450,0x44b)](_0x542de1(0x2cf,0x2d3)+'E_VERSION\x20'+_0x542de1(0x2ea,0x2ec));if(_0x482538[_0x107479(0x44f,0x44e)+_0x542de1(0x2e1,0x2e3)])_0xa44206[_0x107479(0x450,0x447)](_0xe9d058[_0x107479(0x44c,0x451)]);}if(_0x482538[_0x107479(0x443,0x433)+_0x542de1(0x2e7,0x2d7)]||_0x482538[_0x542de1(0x2d7,0x2d2)]){_0xe9d058[_0x107479(0x43c,0x440)](_0x4b3afa,0.9)&&(_0x5ee4be=_0x542de1(0x2d0,0x2e1),_0x4b3afa=0.9);if(_0x482538['OPENAI_API'+'_KEY'])_0xa44206[_0x542de1(0x2e0,0x2f1)](_0x542de1(0x2d3,0x2e5)+'_KEY\x20env');if(_0x482538[_0x107479(0x447,0x44b)])_0xa44206[_0x542de1(0x2e0,0x2d4)](_0xe9d058['zGGpV']);}if(_0x482538[_0x107479(0x45b,0x460)+'_KEY']||_0x482538[_0x107479(0x453,0x44c)+'_KEY']){if(_0x4b3afa<0.85){if(_0x542de1(0x2e4,0x2da)!=='lwQnO'){_0x29eaf9=_0x542de1(0x2ed,0x2ea),_0x103f84=0.95;if(_0x20ee61[_0x542de1(0x2cf,0x2ce)+'E_VERSION'])_0x5a5c86['push'](_0x107479(0x43f,0x437)+'E_VERSION\x20'+'env');if(_0x2ab045[_0x542de1(0x2df,0x2d5)+_0x107479(0x451,0x44b)])_0xf13558[_0x542de1(0x2e0,0x2df)](_0xe9d058[_0x107479(0x44c,0x457)]);}else _0x5ee4be=_0x107479(0x441,0x443),_0x4b3afa=0.85;}if(_0x482538[_0x542de1(0x2eb,0x2ef)+_0x107479(0x457,0x450)])_0xa44206[_0x542de1(0x2e0,0x2e0)]('GOOGLE_API'+'_KEY\x20env');if(_0x482538[_0x107479(0x453,0x45b)+_0x542de1(0x2e7,0x2e8)])_0xa44206[_0x107479(0x450,0x458)](_0x542de1(0x2e3,0x2e9)+_0x107479(0x449,0x439));}if(_0x482538['A2A_PROVID'+'ER']){const _0x15cac6=_0x482538['A2A_PROVID'+'ER']['toLowerCas'+'e']();[_0xe9d058[_0x107479(0x44a,0x45a)],_0xe9d058[_0x542de1(0x2e2,0x2ef)],_0xe9d058[_0x107479(0x442,0x445)]][_0x107479(0x43d,0x435)](_0x15cac6)&&(_0x5ee4be=_0x15cac6,_0x4b3afa=0x1,_0xa44206[_0x107479(0x450,0x445)]('A2A_PROVID'+_0x107479(0x459,0x461)+_0x15cac6));}return{'provider':_0x5ee4be,'confidence':_0x4b3afa,'evidence':_0xa44206};}
@@ -1,93 +1 @@
1
- /**
2
- * Adaptive RAG Router
3
- *
4
- * 쿼리 복잡도에 따라 최적의 검색 전략을 선택합니다.
5
- * LLM 불필요 — 규칙 기반 분류로 < 1ms 레이턴시.
6
- *
7
- * - simple: FTS만 (< 5ms)
8
- * - semantic: FTS + Vector (< 30ms)
9
- * - complex: FTS + Vector + Reranker (< 100ms)
10
- */
11
- /** 코드/에러 패턴 감지 */
12
- const CODE_PATTERNS = [
13
- /\b(error|exception|traceback|stack\s*trace|stderr)\b/i,
14
- /\b(import|require|from|export|module)\s+['"`]/,
15
- /\b(function|class|interface|type|const|let|var|def|async)\b/,
16
- /[{}()\[\]<>].*[{}()\[\]<>]/, // 중첩 괄호
17
- /\b\w+\.\w+\.\w+/, // 점 표기법 (a.b.c)
18
- /\b\d+\.\d+\.\d+/, // 버전 번호
19
- /(?:https?:\/\/|\/[\w/]+\.\w+)/, // URL 또는 파일 경로
20
- ];
21
- /** 질문/설명 패턴 */
22
- const SEMANTIC_PATTERNS = [
23
- /\b(how|why|what|when|where|which|explain|describe)\b/i,
24
- /(어떻게|왜|무엇|언제|어디|설명|방법)/, // 한국어는 \b 없이 (유니코드 호환)
25
- /\?$/, // 질문형
26
- /\b(similar|like|related|compare|difference|versus|vs)\b/i,
27
- /(비슷한|관련|비교|차이|대안)/, // 한국어
28
- /\b(best practice|pattern|approach|architecture|design)\b/i,
29
- /(패턴|접근법|아키텍처|설계|구조)/, // 한국어
30
- ];
31
- export class AdaptiveRouter {
32
- /**
33
- * 쿼리 복잡도 분류
34
- *
35
- * @param query 검색 쿼리
36
- * @returns 분류 결과 + 활성화할 검색 전략
37
- */
38
- classify(query) {
39
- const trimmed = query.trim();
40
- const wordCount = trimmed.split(/\s+/).length;
41
- // 1~2 단어: simple (키워드 매칭 충분)
42
- if (wordCount <= 2) {
43
- return {
44
- complexity: 'simple',
45
- useFTS: true,
46
- useVector: false,
47
- useReranker: false,
48
- reason: `Short query (${wordCount} words)`,
49
- };
50
- }
51
- // 코드 패턴/에러 메시지: complex (다중 소스 결합)
52
- const hasCodePattern = CODE_PATTERNS.some(p => p.test(trimmed));
53
- if (hasCodePattern) {
54
- return {
55
- complexity: 'complex',
56
- useFTS: true,
57
- useVector: true,
58
- useReranker: true,
59
- reason: 'Code pattern or error message detected',
60
- };
61
- }
62
- // 질문형/설명형: semantic (의미 검색 필요)
63
- const hasSemanticPattern = SEMANTIC_PATTERNS.some(p => p.test(trimmed));
64
- if (hasSemanticPattern) {
65
- return {
66
- complexity: 'semantic',
67
- useFTS: true,
68
- useVector: true,
69
- useReranker: false,
70
- reason: 'Semantic query detected',
71
- };
72
- }
73
- // 긴 쿼리 (5+ 단어): semantic
74
- if (wordCount >= 5) {
75
- return {
76
- complexity: 'semantic',
77
- useFTS: true,
78
- useVector: true,
79
- useReranker: false,
80
- reason: `Long query (${wordCount} words)`,
81
- };
82
- }
83
- // 기본: simple
84
- return {
85
- complexity: 'simple',
86
- useFTS: true,
87
- useVector: false,
88
- useReranker: false,
89
- reason: 'Default classification',
90
- };
91
- }
92
- }
93
- //# sourceMappingURL=adaptive-router.js.map
1
+ (function(_0x183593,_0x34de5c){function _0x19a9b6(_0x31e715,_0x36262b){return _0x2d07(_0x31e715-0x3be,_0x36262b);}function _0x494afd(_0x549f30,_0x46f272){return _0x2d07(_0x549f30-0x45,_0x46f272);}const _0xe5ab70=_0x183593();while(!![]){try{const _0x1164d5=-parseInt(_0x494afd(0x19e,0x1a6))/0x1+-parseInt(_0x494afd(0x1a3,0x1a8))/0x2*(parseInt(_0x494afd(0x193,0x19f))/0x3)+-parseInt(_0x19a9b6(0x50e,0x504))/0x4+-parseInt(_0x19a9b6(0x511,0x504))/0x5+-parseInt(_0x494afd(0x19f,0x196))/0x6*(parseInt(_0x19a9b6(0x50f,0x50d))/0x7)+-parseInt(_0x19a9b6(0x508,0x511))/0x8*(parseInt(_0x494afd(0x190,0x188))/0x9)+parseInt(_0x19a9b6(0x50b,0x502))/0xa;if(_0x1164d5===_0x34de5c)break;else _0xe5ab70['push'](_0xe5ab70['shift']());}catch(_0x1a23f6){_0xe5ab70['push'](_0xe5ab70['shift']());}}}(_0x358c,0x51d33));function _0x358c(){const _0x538826=['EvvIDuS','CM4GB3iGzxjYBW','mti0vMX0vKnx','C29Tzq','DhjPBq','u2vTyw50AwmGCq','y2XHC3nPzNK','yxnZAwzPy2f0Aq','C2vTyw50Awm','rfvKEgu','zgv0zwn0zwq','rgvMyxvSDcbJBa','ody0odi0zxDmwKzz','owvtwvPrBG','t1jPvxq','mtm5mZK5ntbdreLOwwi','mteXmtjJtLDJDxG','EsaO','odm2otG4v2XTz3bW','ndLlzgnevgm','CIbTzxnZywDLia','nJm1nZvlvxjMuLa','y29TCgXLEa','C2LTCgXL','q29KzsbWyxr0zq','DgvK','tg9UzYbXDwvYEq','mJKZotG1sMXlq3ft','mtC1odm2t0HPCNbw','y2PNzNq'];_0x358c=function(){return _0x538826;};return _0x358c();}const CODE_PATTERNS=[/\b(error|exception|traceback|stack\s*trace|stderr)\b/i,/\b(import|require|from|export|module)\s+['"`]/,/\b(function|class|interface|type|const|let|var|def|async)\b/,/[{}()\[\]<>].*[{}()\[\]<>]/,/\b\w+\.\w+\.\w+/,/\b\d+\.\d+\.\d+/,/(?:https?:\/\/|\/[\w/]+\.\w+)/],SEMANTIC_PATTERNS=[/\b(how|why|what|when|where|which|explain|describe)\b/i,/(어떻게|왜|무엇|언제|어디|설명|방법)/,/\?$/,/\b(similar|like|related|compare|difference|versus|vs)\b/i,/(비슷한|관련|비교|차이|대안)/,/\b(best practice|pattern|approach|architecture|design)\b/i,/(패턴|접근법|아키텍처|설계|구조)/];function _0x58bc00(_0xffe1f9,_0x501fdf){return _0x2d07(_0xffe1f9-0x2d0,_0x501fdf);}function _0x2d07(_0x1e0d83,_0x49fce3){_0x1e0d83=_0x1e0d83-0x148;const _0x358c8a=_0x358c();let _0x2d075a=_0x358c8a[_0x1e0d83];if(_0x2d07['vmpdMT']===undefined){var _0x35d4aa=function(_0xcffa8){const _0x2bc5e5='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x49096a='',_0x426ea9='';for(let _0xfe951d=0x0,_0x4fd603,_0x494f40,_0x3361c8=0x0;_0x494f40=_0xcffa8['charAt'](_0x3361c8++);~_0x494f40&&(_0x4fd603=_0xfe951d%0x4?_0x4fd603*0x40+_0x494f40:_0x494f40,_0xfe951d++%0x4)?_0x49096a+=String['fromCharCode'](0xff&_0x4fd603>>(-0x2*_0xfe951d&0x6)):0x0){_0x494f40=_0x2bc5e5['indexOf'](_0x494f40);}for(let _0xf05ac9=0x0,_0x162097=_0x49096a['length'];_0xf05ac9<_0x162097;_0xf05ac9++){_0x426ea9+='%'+('00'+_0x49096a['charCodeAt'](_0xf05ac9)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x426ea9);};_0x2d07['TaZhCR']=_0x35d4aa,_0x2d07['PCWAWY']={},_0x2d07['vmpdMT']=!![];}const _0x4dc7e2=_0x358c8a[0x0],_0x3efce2=_0x1e0d83+_0x4dc7e2,_0x2d4960=_0x2d07['PCWAWY'][_0x3efce2];return!_0x2d4960?(_0x2d075a=_0x2d07['TaZhCR'](_0x2d075a),_0x2d07['PCWAWY'][_0x3efce2]=_0x2d075a):_0x2d075a=_0x2d4960,_0x2d075a;}export class AdaptiveRouter{[_0x58bc00(0x432,0x440)](_0x10899a){const _0x181b8b={'DUdxe':function(_0x5233cd,_0x102e13){return _0x5233cd<=_0x102e13;},'ORiUt':_0x41d182(-0x132,-0x12d)+_0x41d182(-0x130,-0x126)+_0x41d182(-0x128,-0x131)+_0x41d182(-0x13e,-0x13b),'yUbuK':function(_0x24bbed,_0x1f2f9f){return _0x24bbed>=_0x1f2f9f;},'cjgft':_0x41d182(-0x117,-0x11f)};function _0x41d182(_0x481f72,_0x1a229e){return _0x58bc00(_0x1a229e- -0x553,_0x481f72);}function _0x2088d2(_0x3e414a,_0x3d21be){return _0x58bc00(_0x3e414a- -0x3b,_0x3d21be);}const _0x587007=_0x10899a[_0x41d182(-0x131,-0x123)](),_0x5cbc67=_0x587007['split'](/\s+/)['length'];if(_0x181b8b[_0x2088d2(0x3fa,0x3f1)](_0x5cbc67,0x2))return{'complexity':_0x2088d2(0x3ea,0x3e3),'useFTS':!![],'useVector':![],'useReranker':![],'reason':'Short\x20quer'+_0x2088d2(0x3e4,0x3ea)+_0x5cbc67+'\x20words)'};const _0x2919a0=CODE_PATTERNS['some'](_0x4764df=>_0x4764df['test'](_0x587007));if(_0x2919a0)return{'complexity':_0x2088d2(0x3e9,0x3db),'useFTS':!![],'useVector':!![],'useReranker':!![],'reason':_0x181b8b[_0x41d182(-0x139,-0x137)]};const _0x7e0579=SEMANTIC_PATTERNS[_0x2088d2(0x3f4,0x3ed)](_0x4b6dc4=>_0x4b6dc4['test'](_0x587007));if(_0x7e0579)return{'complexity':_0x41d182(-0x128,-0x11f),'useFTS':!![],'useVector':!![],'useReranker':![],'reason':_0x2088d2(0x3f6,0x3ee)+'uery\x20detec'+_0x2088d2(0x3ec,0x3e1)};if(_0x181b8b[_0x41d182(-0x11a,-0x127)](_0x5cbc67,0x5))return{'complexity':_0x181b8b[_0x41d182(-0x12c,-0x128)],'useFTS':!![],'useVector':!![],'useReranker':![],'reason':_0x41d182(-0x12d,-0x12b)+'\x20('+_0x5cbc67+'\x20words)'};return{'complexity':_0x2088d2(0x3ea,0x3e9),'useFTS':!![],'useVector':![],'useReranker':![],'reason':_0x2088d2(0x3de,0x3ea)+_0x2088d2(0x3f8,0x401)+'on'};}}
@@ -1,9 +1 @@
1
- /**
2
- * Search Module
3
- *
4
- * 하이브리드 검색 (FTS + Vector + Recency) 통합 모듈.
5
- */
6
- export { HybridRanker } from './ranker.js';
7
- export { AdaptiveRouter } from './adaptive-router.js';
8
- export { CrossEncoderReranker } from './reranker.js';
9
- //# sourceMappingURL=index.js.map
1
+ (function(_0xc3a7c,_0x785e62){function _0x4e2fc5(_0x2a0f99,_0x2a3fc8){return _0x5b8c(_0x2a3fc8- -0x293,_0x2a0f99);}function _0xee4a6(_0x3f89b2,_0x22e44b){return _0x5b8c(_0x3f89b2- -0x2a7,_0x22e44b);}var _0x4e3d38=_0xc3a7c();while(!![]){try{var _0x33bd0d=-parseInt(_0x4e2fc5(-0x1dd,-0x1e0))/0x1*(-parseInt(_0x4e2fc5(-0x1e9,-0x1e9))/0x2)+-parseInt(_0xee4a6(-0x1f9,-0x1fe))/0x3*(-parseInt(_0xee4a6(-0x1f5,-0x1f2))/0x4)+-parseInt(_0x4e2fc5(-0x1e4,-0x1e8))/0x5*(parseInt(_0x4e2fc5(-0x1de,-0x1dd))/0x6)+-parseInt(_0x4e2fc5(-0x1e4,-0x1df))/0x7*(-parseInt(_0x4e2fc5(-0x1de,-0x1de))/0x8)+parseInt(_0x4e2fc5(-0x1e6,-0x1e4))/0x9+-parseInt(_0xee4a6(-0x1fa,-0x1f8))/0xa*(-parseInt(_0xee4a6(-0x1fb,-0x1fb))/0xb)+parseInt(_0x4e2fc5(-0x1e9,-0x1e2))/0xc*(-parseInt(_0x4e2fc5(-0x1e0,-0x1e3))/0xd);if(_0x33bd0d===_0x785e62)break;else _0x4e3d38['push'](_0x4e3d38['shift']());}catch(_0x1f6f0f){_0x4e3d38['push'](_0x4e3d38['shift']());}}}(_0x4f5e,0x7bd35));export{HybridRanker}from'./ranker.js';function _0x4f5e(){var _0x18ae1e=['mteZntKXmdrcCujmCgi','mtjQC1n5v3O','mZf3rNjJt0u','mtuYodCZywXZt2TJ','mtq0whfsCMje','ntC0nZG4z0X0t3zo','mtuXmJjJy0TMzu8','mZbvwKjPr2S','ody5teXsz1DW','ndi3ndbYvK5lsNe','nZuZmtviEKnyCMO','odG5mZaZnwXpA3nTBG','mtnsz2XLEhe'];_0x4f5e=function(){return _0x18ae1e;};return _0x4f5e();}export{AdaptiveRouter}from'./adaptive-router.js';function _0x5b8c(_0x1ed17c,_0x4adf58){_0x1ed17c=_0x1ed17c-0xaa;var _0x4f5ef8=_0x4f5e();var _0x5b8c77=_0x4f5ef8[_0x1ed17c];if(_0x5b8c['jHVeBM']===undefined){var _0x14f128=function(_0x4c89fa){var _0x42bdce='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x2b270b='',_0x3ab4a1='';for(var _0x333a80=0x0,_0x14abf1,_0x422a5e,_0x5e220b=0x0;_0x422a5e=_0x4c89fa['charAt'](_0x5e220b++);~_0x422a5e&&(_0x14abf1=_0x333a80%0x4?_0x14abf1*0x40+_0x422a5e:_0x422a5e,_0x333a80++%0x4)?_0x2b270b+=String['fromCharCode'](0xff&_0x14abf1>>(-0x2*_0x333a80&0x6)):0x0){_0x422a5e=_0x42bdce['indexOf'](_0x422a5e);}for(var _0x3f8f13=0x0,_0x3bd106=_0x2b270b['length'];_0x3f8f13<_0x3bd106;_0x3f8f13++){_0x3ab4a1+='%'+('00'+_0x2b270b['charCodeAt'](_0x3f8f13)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3ab4a1);};_0x5b8c['IgSrjC']=_0x14f128,_0x5b8c['qCHefl']={},_0x5b8c['jHVeBM']=!![];}var _0x4955b1=_0x4f5ef8[0x0],_0x13a857=_0x1ed17c+_0x4955b1,_0x48d912=_0x5b8c['qCHefl'][_0x13a857];return!_0x48d912?(_0x5b8c77=_0x5b8c['IgSrjC'](_0x5b8c77),_0x5b8c['qCHefl'][_0x13a857]=_0x5b8c77):_0x5b8c77=_0x48d912,_0x5b8c77;}export{CrossEncoderReranker}from'./reranker.js';
@@ -1,171 +1 @@
1
- /**
2
- * Reciprocal Rank Fusion (RRF) 기반 하이브리드 검색
3
- *
4
- * FTS, Vector, Recency 결과를 통합하여 최적의 검색 결과 제공.
5
- * C-6: 카테고리/티어 부스트, ACT-R recency decay, 가중치 설정 지원.
6
- */
7
- /** Category boost multipliers */
8
- const CATEGORY_BOOST = {
9
- error_solution: 1.2,
10
- code_pattern: 1.2,
11
- decision: 1.1,
12
- convention: 1.1,
13
- skill: 1.5,
14
- context: 1.0,
15
- project_knowledge: 1.0,
16
- learning: 1.0,
17
- };
18
- /** Tier boost multipliers */
19
- const TIER_BOOST = {
20
- semantic: 1.2,
21
- episodic: 1.0,
22
- working: 0.8,
23
- };
24
- /**
25
- * RRF (Reciprocal Rank Fusion) 기반 하이브리드 랭커
26
- *
27
- * RRF 공식: score = sum(weight_i / (k + rank_i)) for each source
28
- * - k: RRF 파라미터 (기본: 60) - 낮을수록 상위 순위에 더 높은 가중치
29
- * - rank: 각 소스에서의 순위 (1부터 시작)
30
- */
31
- export class HybridRanker {
32
- k;
33
- weights;
34
- categoryBoost;
35
- tierBoost;
36
- recencyDecay;
37
- constructor(kOrOptions) {
38
- if (typeof kOrOptions === 'number') {
39
- this.k = kOrOptions;
40
- this.weights = { fts: 1.0, vector: 1.0, recency: 1.0 };
41
- this.categoryBoost = false;
42
- this.tierBoost = false;
43
- this.recencyDecay = false;
44
- }
45
- else {
46
- const opts = kOrOptions ?? {};
47
- this.k = opts.k ?? 60;
48
- this.weights = {
49
- fts: opts.weights?.fts ?? 1.0,
50
- vector: opts.weights?.vector ?? 1.0,
51
- recency: opts.weights?.recency ?? 1.0,
52
- };
53
- this.categoryBoost = opts.categoryBoost ?? false;
54
- this.tierBoost = opts.tierBoost ?? false;
55
- this.recencyDecay = opts.recencyDecay ?? false;
56
- }
57
- }
58
- /**
59
- * FTS + Vector + Recency 결과를 RRF로 통합
60
- */
61
- rank(ftsResults, vectorResults, recencyResults) {
62
- // 입력 크기 제한 (메모리 보호: 각 소스 최대 500개)
63
- const safeFts = ftsResults.slice(0, 500);
64
- const safeVector = vectorResults.slice(0, 500);
65
- const safeRecency = recencyResults?.slice(0, 500);
66
- // 각 메모리별 score 계산을 위한 맵
67
- const scoreMap = new Map();
68
- // FTS 점수 계산
69
- for (let i = 0; i < safeFts.length; i++) {
70
- const result = safeFts[i];
71
- const rank = i + 1;
72
- const score = this.weights.fts / (this.k + rank);
73
- this.addScore(scoreMap, result.memory, score, 'fts', rank);
74
- }
75
- // Vector 점수 계산
76
- for (let i = 0; i < safeVector.length; i++) {
77
- const result = safeVector[i];
78
- const rank = i + 1;
79
- const score = this.weights.vector / (this.k + rank);
80
- this.addScore(scoreMap, result.memory, score, 'vector', rank);
81
- }
82
- // Recency 점수 계산
83
- if (safeRecency && safeRecency.length > 0) {
84
- for (let i = 0; i < safeRecency.length; i++) {
85
- const memory = safeRecency[i];
86
- const rank = i + 1;
87
- let score;
88
- if (this.recencyDecay) {
89
- // ACT-R 식 recency decay: Math.pow(hoursAgo + 1, -0.5)
90
- const hoursAgo = this.getHoursAgo(memory.updatedAt);
91
- score = this.weights.recency * Math.pow(hoursAgo + 1, -0.5);
92
- }
93
- else {
94
- score = this.weights.recency / (this.k + rank);
95
- }
96
- this.addScore(scoreMap, memory, score, 'recency', rank);
97
- }
98
- }
99
- // 카테고리/티어 부스트 적용
100
- if (this.categoryBoost || this.tierBoost) {
101
- for (const entry of scoreMap.values()) {
102
- let boost = 1.0;
103
- if (this.categoryBoost) {
104
- boost *= CATEGORY_BOOST[entry.memory.category] ?? 1.0;
105
- }
106
- if (this.tierBoost) {
107
- boost *= TIER_BOOST[entry.memory.tier] ?? 1.0;
108
- }
109
- entry.totalScore *= boost;
110
- }
111
- }
112
- // 점수 내림차순 정렬
113
- const ranked = Array.from(scoreMap.values())
114
- .sort((a, b) => b.totalScore - a.totalScore)
115
- .map((item) => ({
116
- memory: item.memory,
117
- score: item.totalScore,
118
- sources: item.sources,
119
- parentId: item.memory.parentId, // Child의 Parent 참조 (context expansion용)
120
- }));
121
- return ranked;
122
- }
123
- addScore(scoreMap, memory, score, type, rank) {
124
- const existing = scoreMap.get(memory.id);
125
- if (existing) {
126
- existing.totalScore += score;
127
- existing.sources.push({ type, rank });
128
- }
129
- else {
130
- scoreMap.set(memory.id, {
131
- memory,
132
- totalScore: score,
133
- sources: [{ type, rank }],
134
- });
135
- }
136
- }
137
- getHoursAgo(isoDate) {
138
- const now = Date.now();
139
- const then = new Date(isoDate).getTime();
140
- return Math.max(0, (now - then) / (1000 * 60 * 60));
141
- }
142
- }
143
- /**
144
- * Compute LSH hash for embedding pre-filtering (C-4)
145
- * SimHash-like: pseudo-random hyperplane signs -> hex string
146
- *
147
- * WARNING: Hash collision 가능성 있음 — 동일 hash라도 실제 유사도 검증 필수.
148
- * bits=32 기준 collision 확률 ~1/2^32이나, 대규모 corpus(1M+)에서는 false-positive 발생 가능.
149
- * 따라서 이 함수는 pre-filter 목적으로만 사용하고, 최종 결과는 cosineSimilarity로 재검증.
150
- */
151
- export function computeEmbeddingHash(embedding, bits = 32) {
152
- const hashBits = [];
153
- for (let i = 0; i < bits; i++) {
154
- let sum = 0;
155
- for (let j = 0; j < embedding.length; j++) {
156
- const sign = ((i * 31 + j * 17 + 7) % 2) === 0 ? 1 : -1;
157
- sum += embedding[j] * sign;
158
- }
159
- hashBits.push(sum >= 0 ? 1 : 0);
160
- }
161
- let hex = '';
162
- for (let i = 0; i < bits; i += 4) {
163
- let nibble = 0;
164
- for (let j = 0; j < 4 && i + j < bits; j++) {
165
- nibble |= hashBits[i + j] << (3 - j);
166
- }
167
- hex += nibble.toString(16);
168
- }
169
- return hex;
170
- }
171
- //# sourceMappingURL=ranker.js.map
1
+ (function(_0x2a1bc0,_0x1cc11c){function _0x59cb1c(_0x33f471,_0x17bf20){return _0x1d5e(_0x33f471- -0x2c6,_0x17bf20);}const _0x9dd38a=_0x2a1bc0();function _0x1285e6(_0x3555bd,_0x2602b6){return _0x1d5e(_0x2602b6-0x13a,_0x3555bd);}while(!![]){try{const _0x210a04=parseInt(_0x59cb1c(-0x1b4,-0x1a5))/0x1+-parseInt(_0x59cb1c(-0x1cd,-0x1e7))/0x2+-parseInt(_0x59cb1c(-0x1c6,-0x1b8))/0x3+-parseInt(_0x59cb1c(-0x1cc,-0x1e2))/0x4*(-parseInt(_0x59cb1c(-0x1c3,-0x1d3))/0x5)+parseInt(_0x59cb1c(-0x1c2,-0x1c1))/0x6*(-parseInt(_0x1285e6(0x24a,0x22f))/0x7)+-parseInt(_0x59cb1c(-0x1a0,-0x194))/0x8*(-parseInt(_0x1285e6(0x253,0x238))/0x9)+parseInt(_0x59cb1c(-0x1ab,-0x1a8))/0xa*(parseInt(_0x59cb1c(-0x1b3,-0x1bc))/0xb);if(_0x210a04===_0x1cc11c)break;else _0x9dd38a['push'](_0x9dd38a['shift']());}catch(_0x56ac79){_0x9dd38a['push'](_0x9dd38a['shift']());}}}(_0x4fdf,0x5b1b8));function _0x30ce57(_0x8ee7ca,_0x1893e2){return _0x1d5e(_0x8ee7ca-0x90,_0x1893e2);}function _0x1d5e(_0x5cd880,_0x2a6806){_0x5cd880=_0x5cd880-0xf4;const _0x4fdf31=_0x4fdf();let _0x1d5ebb=_0x4fdf31[_0x5cd880];if(_0x1d5e['vvDEjU']===undefined){var _0x2dbaea=function(_0x432613){const _0xc0b5b0='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x10860b='',_0x58e650='';for(let _0x5bee6e=0x0,_0x49b50a,_0x1ac566,_0x28c237=0x0;_0x1ac566=_0x432613['charAt'](_0x28c237++);~_0x1ac566&&(_0x49b50a=_0x5bee6e%0x4?_0x49b50a*0x40+_0x1ac566:_0x1ac566,_0x5bee6e++%0x4)?_0x10860b+=String['fromCharCode'](0xff&_0x49b50a>>(-0x2*_0x5bee6e&0x6)):0x0){_0x1ac566=_0xc0b5b0['indexOf'](_0x1ac566);}for(let _0x137e73=0x0,_0x216472=_0x10860b['length'];_0x137e73<_0x216472;_0x137e73++){_0x58e650+='%'+('00'+_0x10860b['charCodeAt'](_0x137e73)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x58e650);};_0x1d5e['wNmJNK']=_0x2dbaea,_0x1d5e['RIYSgr']={},_0x1d5e['vvDEjU']=!![];}const _0x234d7a=_0x4fdf31[0x0],_0xe90ba1=_0x5cd880+_0x234d7a,_0x4c9dc4=_0x1d5e['RIYSgr'][_0xe90ba1];return!_0x4c9dc4?(_0x1d5ebb=_0x1d5e['wNmJNK'](_0x1d5ebb),_0x1d5e['RIYSgr'][_0xe90ba1]=_0x1d5ebb):_0x1d5ebb=_0x4c9dc4,_0x1d5ebb;}function _0x4fdf(){const _0x57638b=['DMfSDwvZ','mZGZntHyr1nyrKe','ALruAui','mtqWotu3mwnsAKDKDG','zNrZ','ChvZAa','mZvns0Tkrgm','nMffsgHrva','z2v0sg91CNnbzW','BM93','y2f0zwDVCNLcBW','DgLLCG','BgjbA1C','C291CMnLCW','uwzZALq','s3z5rNi','DxbKyxrLzef0','DgLLCKjVB3n0','CMvJzw5JEurLyW','B3n0','ywrKu2nVCMu','ndaWnZm0tuzJt05v','mtiXntu3n2Xqz0X5ra','CMfUAW','zNjVBq','rgLfAuK','whLVA0u','CLPOz0W','CgfYzw50swq','CMvJzw5JEq','nZbdqwn4se8','uefju2u','CfjIC1u','wwDhAhy','Eurprxy','D2vPz2H0CW','C2XPy2u','DMvJDg9Y','Dg9tDhjPBMC','BwvTB3j5','qM9LANC','otC2DuDut0LS','C2LwCvK','y2f0zwDVCNK','Dg90ywXty29Yzq','Cg93','C29YDa','nda0ntG1m2ffvhr5uG','BgvUz3rO','C2v0','C3bSAxq','mtmZnJu4oeXcte1mCG','mJi1nZq4AKLAyLHk','zurTu0C','z0r6s3i'];_0x4fdf=function(){return _0x57638b;};return _0x4fdf();}const CATEGORY_BOOST={'error_solution':1.2,'code_pattern':1.2,'decision':1.1,'convention':1.1,'skill':1.5,'rule':1.5,'context':0x1,'project_knowledge':0x1,'learning':0x1};function _0x56e6cb(_0xb23f27,_0x4039be){return _0x1d5e(_0x4039be- -0x2b6,_0xb23f27);}const TIER_BOOST={'semantic':1.2,'episodic':0x1,'working':0.8};export class HybridRanker{['k'];[_0x56e6cb(-0x197,-0x196)];[_0x30ce57(0x197,0x1a5)+_0x30ce57(0x1a0,0x1a7)];['tierBoost'];[_0x30ce57(0x19f,0x19c)+'ay'];constructor(_0x1f1ddc){function _0x2a90f5(_0x127b34,_0x32bade){return _0x30ce57(_0x32bade-0xab,_0x127b34);}function _0x2fe103(_0x596aba,_0x2cf2d1){return _0x30ce57(_0x2cf2d1- -0x2f,_0x596aba);}if(typeof _0x1f1ddc==='number'){const _0x21e03f='3|1|2|0|4'[_0x2a90f5(0x23e,0x233)]('|');let _0x5c8ab3=0x0;while(!![]){switch(_0x21e03f[_0x5c8ab3++]){case'0':this['tierBoost']=![];continue;case'1':this['weights']={'fts':0x1,'vector':0x1,'recency':0x1};continue;case'2':this[_0x2a90f5(0x23d,0x242)+_0x2fe103(0x181,0x171)]=![];continue;case'3':this['k']=_0x1f1ddc;continue;case'4':this[_0x2fe103(0x154,0x170)+'ay']=![];continue;}break;}}else{const _0x1d0a02=_0x1f1ddc??{};this['k']=_0x1d0a02['k']??0x3c,this['weights']={'fts':_0x1d0a02[_0x2fe103(0x19a,0x181)]?.[_0x2fe103(0x162,0x162)]??0x1,'vector':_0x1d0a02['weights']?.['vector']??0x1,'recency':_0x1d0a02[_0x2fe103(0x193,0x181)]?.[_0x2a90f5(0x24a,0x255)]??0x1},this[_0x2fe103(0x14e,0x168)+'ost']=_0x1d0a02[_0x2a90f5(0x227,0x242)+_0x2a90f5(0x245,0x24b)]??![],this[_0x2fe103(0x158,0x16f)]=_0x1d0a02['tierBoost']??![],this[_0x2a90f5(0x246,0x24a)+'ay']=_0x1d0a02[_0x2fe103(0x184,0x170)+'ay']??![];}}[_0x30ce57(0x1a4,0x1a5)](_0x225f08,_0x1a8f0a,_0x8fb5d){function _0x51b726(_0x194b52,_0x16c744){return _0x56e6cb(_0x194b52,_0x16c744-0x65a);}const _0x1c8408={'pRbsU':function(_0x18d4d8,_0x5f3d0b){return _0x18d4d8+_0x5f3d0b;},'rZhgL':function(_0x105a91,_0x56d94e){return _0x105a91/_0x56d94e;},'DiEiI':'fts','KvyFr':function(_0x36cad1,_0x32d052){return _0x36cad1>_0x32d052;},'lbAkW':function(_0x504ff2,_0x58d117){return _0x504ff2===_0x58d117;},'gDzKr':function(_0x4d8c0b,_0x456c4b){return _0x4d8c0b+_0x456c4b;},'LFGyN':'vFhWi'},_0x24ac16=_0x225f08[_0x14c0fa(-0xf8,-0xee)](0x0,0x1f4),_0x52168d=_0x1a8f0a[_0x51b726(0x4cd,0x4c5)](0x0,0x1f4),_0x43c86a=_0x8fb5d?.[_0x51b726(0x4c6,0x4c5)](0x0,0x1f4),_0x9fe58d=new Map();for(let _0x26d840=0x0;_0x26d840<_0x24ac16[_0x14c0fa(-0x114,-0x119)];_0x26d840++){const _0x4068fb=_0x24ac16[_0x26d840],_0x1352d7=_0x1c8408[_0x14c0fa(-0xec,-0xf2)](_0x26d840,0x1),_0x4d142c=_0x1c8408[_0x14c0fa(-0xfa,-0xf7)](this[_0x51b726(0x4bf,0x4c4)][_0x51b726(0x492,0x4a5)],this['k']+_0x1352d7);this['addScore'](_0x9fe58d,_0x4068fb[_0x14c0fa(-0x101,-0xeb)],_0x4d142c,_0x1c8408[_0x51b726(0x4a1,0x4ba)],_0x1352d7);}for(let _0x563cbd=0x0;_0x563cbd<_0x52168d[_0x14c0fa(-0x106,-0x119)];_0x563cbd++){const _0x92b579=_0x52168d[_0x563cbd],_0x630220=_0x563cbd+0x1,_0x3f669f=this[_0x51b726(0x4df,0x4c4)][_0x14c0fa(-0xd3,-0xed)]/(this['k']+_0x630220);this[_0x14c0fa(-0x106,-0xfe)](_0x9fe58d,_0x92b579[_0x14c0fa(-0xd7,-0xeb)],_0x3f669f,_0x51b726(0x4c3,0x4c6),_0x630220);}function _0x14c0fa(_0x53c801,_0x5ae898){return _0x56e6cb(_0x53c801,_0x5ae898-0xa7);}if(_0x43c86a&&_0x1c8408[_0x14c0fa(-0x10b,-0x103)](_0x43c86a[_0x14c0fa(-0x114,-0x119)],0x0)){if(_0x1c8408[_0x51b726(0x4c1,0x4ad)](_0x51b726(0x49a,0x4af),_0x14c0fa(-0x109,-0xf0)))_0x46e1cb[_0x51b726(0x4aa,0x49b)](_0x2d81f1['id'],{'memory':_0x2fe708,'totalScore':_0x13e552,'sources':[{'type':_0x4ee5e6,'rank':_0x13842e}]});else for(let _0x4e54b8=0x0;_0x4e54b8<_0x43c86a[_0x51b726(0x4b4,0x49a)];_0x4e54b8++){const _0x53c4f3=_0x43c86a[_0x4e54b8],_0x1a4343=_0x1c8408[_0x51b726(0x486,0x4a0)](_0x4e54b8,0x1);let _0x4f32a8;if(this[_0x51b726(0x4bf,0x4b3)+'ay']){const _0x49f970=this[_0x51b726(0x4be,0x4a9)+'o'](_0x53c4f3[_0x14c0fa(-0xe9,-0x102)]);_0x4f32a8=this[_0x14c0fa(-0xd3,-0xef)][_0x14c0fa(-0xfe,-0xf5)]*Math[_0x14c0fa(-0xfd,-0xe5)](_0x1c8408['gDzKr'](_0x49f970,0x1),-0.5);}else _0x4f32a8=this[_0x51b726(0x4d6,0x4c4)][_0x51b726(0x4a2,0x4be)]/(this['k']+_0x1a4343);this[_0x14c0fa(-0xe6,-0xfe)](_0x9fe58d,_0x53c4f3,_0x4f32a8,'recency',_0x1a4343);}}if(this[_0x51b726(0x4c1,0x4ab)+_0x51b726(0x4bf,0x4b4)]||this[_0x14c0fa(-0x10c,-0x101)])for(const _0x467171 of _0x9fe58d[_0x14c0fa(-0xfb,-0x112)]()){if('vFhWi'===_0x1c8408['LFGyN']){let _0x10f99b=0x1;this[_0x14c0fa(-0x103,-0x108)+_0x51b726(0x4a7,0x4b4)]&&(_0x10f99b*=CATEGORY_BOOST[_0x467171['memory'][_0x14c0fa(-0xea,-0xe7)]]??0x1),this['tierBoost']&&(_0x10f99b*=TIER_BOOST[_0x467171[_0x14c0fa(-0xf4,-0xeb)][_0x51b726(0x49c,0x4ac)]]??0x1),_0x467171['totalScore']*=_0x10f99b;}else{const _0xefefa0=_0x5b34e5??{};this['k']=_0xefefa0['k']??0x3c,this[_0x51b726(0x4db,0x4c4)]={'fts':_0xefefa0['weights']?.[_0x14c0fa(-0xf8,-0x10e)]??0x1,'vector':_0xefefa0[_0x14c0fa(-0x10a,-0xef)]?.['vector']??0x1,'recency':_0xefefa0[_0x51b726(0x4d8,0x4c4)]?.['recency']??0x1},this[_0x51b726(0x4b0,0x4ab)+'ost']=_0xefefa0[_0x14c0fa(-0x123,-0x108)+'ost']??![],this['tierBoost']=_0xefefa0[_0x14c0fa(-0xfa,-0x101)]??![],this[_0x14c0fa(-0xf3,-0x100)+'ay']=_0xefefa0[_0x51b726(0x4a6,0x4b3)+'ay']??![];}}const _0xf81a63=Array[_0x51b726(0x4af,0x4b9)](_0x9fe58d[_0x51b726(0x4b2,0x4a1)]())[_0x51b726(0x496,0x498)]((_0x28f58a,_0x624b86)=>_0x624b86['totalScore']-_0x28f58a['totalScore'])['map'](_0x108d10=>({'memory':_0x108d10[_0x51b726(0x4bb,0x4c8)],'score':_0x108d10[_0x51b726(0x4c9,0x4cd)],'sources':_0x108d10[_0x14c0fa(-0x115,-0x105)],'parentId':_0x108d10[_0x14c0fa(-0xf0,-0xeb)][_0x51b726(0x4a9,0x4bd)]}));return _0xf81a63;}['addScore'](_0x31c67c,_0x541229,_0x4cb12c,_0x4c7c77,_0x227f7f){function _0x139922(_0x180c50,_0x191523){return _0x56e6cb(_0x180c50,_0x191523-0x516);}const _0x56b31b=_0x31c67c['get'](_0x541229['id']);function _0x57b51d(_0xc0601b,_0x5f0345){return _0x56e6cb(_0x5f0345,_0xc0601b-0x5d);}_0x56b31b?(_0x56b31b['totalScore']+=_0x4cb12c,_0x56b31b[_0x139922(0x380,0x36a)][_0x139922(0x346,0x362)]({'type':_0x4c7c77,'rank':_0x227f7f})):_0x31c67c[_0x57b51d(-0x162,-0x17d)](_0x541229['id'],{'memory':_0x541229,'totalScore':_0x4cb12c,'sources':[{'type':_0x4c7c77,'rank':_0x227f7f}]});}[_0x30ce57(0x195,0x1a3)+'o'](_0x24027f){function _0x4f3740(_0xab9d4c,_0xacbad8){return _0x30ce57(_0xacbad8-0x34,_0xab9d4c);}const _0x226e3e={'Boejw':function(_0x99084,_0x59c916){return _0x99084-_0x59c916;}},_0xcab539=Date[_0x4f3740(0x1b0,0x1ca)](),_0x2a6899=new Date(_0x24027f)['getTime']();function _0x5746b7(_0x2c2ca5,_0x180855){return _0x30ce57(_0x2c2ca5-0x8a,_0x180855);}return Math['max'](0x0,_0x226e3e[_0x5746b7(0x23f,0x24b)](_0xcab539,_0x2a6899)/(0x3e8*0x3c*0x3c));}}export function computeEmbeddingHash(_0x301ca5,_0x53f75f=0x20){const _0x60b72a={'PAISe':function(_0x3e869c,_0xa0e388){return _0x3e869c<_0xa0e388;},'eDmSG':function(_0x2d0d51,_0x5ea325){return _0x2d0d51===_0x5ea325;},'jTTiB':function(_0x583e96,_0x315603){return _0x583e96+_0x315603;},'YgGhv':function(_0x49ed04,_0x499004){return _0x49ed04*_0x499004;},'siVqY':function(_0x385239,_0x4a44c2){return _0x385239*_0x4a44c2;},'XyokE':function(_0xaed1bf,_0x37e7da){return _0xaed1bf<_0x37e7da;}},_0x5ae235=[];function _0x52e4ef(_0x3781ef,_0x3f5c40){return _0x56e6cb(_0x3f5c40,_0x3781ef-0x559);}function _0xff016e(_0x476c3f,_0x1dd890){return _0x56e6cb(_0x1dd890,_0x476c3f-0x4b);}for(let _0x3c96e0=0x0;_0x3c96e0<_0x53f75f;_0x3c96e0++){let _0x254c55=0x0;for(let _0x4b9ea4=0x0;_0x60b72a[_0x52e4ef(0x3bf,0x3cf)](_0x4b9ea4,_0x301ca5[_0x52e4ef(0x399,0x3b2)]);_0x4b9ea4++){const _0x1b24a6=_0x60b72a[_0xff016e(-0x170,-0x167)]((_0x60b72a[_0x52e4ef(0x3a2,0x38a)](_0x60b72a[_0xff016e(-0x14d,-0x13f)](_0x3c96e0,0x1f),_0x60b72a[_0x52e4ef(0x3c1,0x3c7)](_0x4b9ea4,0x11))+0x7)%0x2,0x0)?0x1:-0x1;_0x254c55+=_0x60b72a[_0xff016e(-0x144,-0x131)](_0x301ca5[_0x4b9ea4],_0x1b24a6);}_0x5ae235[_0x52e4ef(0x3a5,0x3b5)](_0x254c55>=0x0?0x1:0x0);}let _0x320da8='';for(let _0x4cd41c=0x0;_0x60b72a[_0xff016e(-0x154,-0x157)](_0x4cd41c,_0x53f75f);_0x4cd41c+=0x4){let _0x188c66=0x0;for(let _0x10bb08=0x0;_0x10bb08<0x4&&_0x4cd41c+_0x10bb08<_0x53f75f;_0x10bb08++){_0x188c66|=_0x5ae235[_0x4cd41c+_0x10bb08]<<0x3-_0x10bb08;}_0x320da8+=_0x188c66[_0xff016e(-0x148,-0x14d)](0x10);}return _0x320da8;}
@@ -1,155 +1 @@
1
- /**
2
- * Cross-Encoder Reranker
3
- *
4
- * RRF 하이브리드 검색의 top-N 결과를 정밀 리랭킹합니다.
5
- * @huggingface/transformers 기반 ms-marco-MiniLM-L-6-v2 모델 사용.
6
- *
7
- * 성능:
8
- * - ~5ms/pair (CPU)
9
- * - top-20 → top-5: ~100ms (SessionStart)
10
- * - top-10 → top-3: ~50ms (UserPromptSubmit)
11
- *
12
- * 설치: npm install @huggingface/transformers (optional dependency)
13
- */
14
- const RERANKER_MODEL = 'cross-encoder/ms-marco-MiniLM-L-6-v2';
15
- // 싱글톤 파이프라인
16
- let _rerankerPipeline = null;
17
- let _rerankerLoading = null;
18
- /**
19
- * reranker 파이프라인 지연 로드
20
- */
21
- async function getRerankerPipeline() {
22
- if (_rerankerPipeline)
23
- return _rerankerPipeline;
24
- if (_rerankerLoading)
25
- return _rerankerLoading;
26
- _rerankerLoading = (async () => {
27
- try {
28
- const mod = await Function('return import("@huggingface/transformers")')();
29
- _rerankerPipeline = await mod.pipeline('text-classification', RERANKER_MODEL, {
30
- quantized: true,
31
- });
32
- return _rerankerPipeline;
33
- }
34
- catch (err) {
35
- _rerankerLoading = null;
36
- throw new Error(`Cross-Encoder reranker requires @huggingface/transformers. ` +
37
- `Install: npm install @huggingface/transformers\n` +
38
- `Original error: ${err instanceof Error ? err.message : String(err)}`);
39
- }
40
- })();
41
- return _rerankerLoading;
42
- }
43
- /**
44
- * 텍스트 기반 fallback reranker
45
- * @huggingface/transformers가 없을 때 사용
46
- * BM25 스타일 간단한 키워드 매칭
47
- */
48
- function fallbackScore(query, content) {
49
- const queryTokens = query.toLowerCase().split(/\s+/).filter(t => t.length > 1);
50
- const contentLower = content.toLowerCase();
51
- if (queryTokens.length === 0)
52
- return 0;
53
- let matches = 0;
54
- for (const token of queryTokens) {
55
- if (contentLower.includes(token))
56
- matches++;
57
- }
58
- return matches / queryTokens.length;
59
- }
60
- export class CrossEncoderReranker {
61
- useFallback;
62
- constructor(options) {
63
- this.useFallback = options?.useFallback ?? true;
64
- }
65
- /**
66
- * 후보 메모리를 리랭킹
67
- *
68
- * @param query 검색 쿼리
69
- * @param candidates 리랭킹 대상 메모리 목록
70
- * @param topK 반환할 상위 K개
71
- * @returns 리랭킹된 결과
72
- */
73
- async rerank(query, candidates, topK) {
74
- if (candidates.length === 0)
75
- return [];
76
- if (candidates.length <= topK)
77
- return candidates;
78
- try {
79
- const pipe = await getRerankerPipeline();
80
- // (query, candidate.content) 쌍으로 점수 계산
81
- const pairs = candidates.map(c => ({
82
- text: query,
83
- text_pair: c.memory.content.slice(0, 512), // 모델 최대 길이 제한
84
- }));
85
- const scores = await pipe(pairs);
86
- // 점수와 원본 결합
87
- const scored = candidates.map((candidate, i) => ({
88
- ...candidate,
89
- rerankScore: this.extractScore(scores[i]),
90
- }));
91
- // 리랭킹 점수로 재정렬
92
- scored.sort((a, b) => b.rerankScore - a.rerankScore);
93
- return scored.slice(0, topK).map(({ rerankScore: _rs, ...rest }) => rest);
94
- }
95
- catch {
96
- // transformers 미설치 시 fallback
97
- if (this.useFallback) {
98
- return this.fallbackRerank(query, candidates, topK);
99
- }
100
- return candidates.slice(0, topK);
101
- }
102
- }
103
- /**
104
- * 텍스트 매칭 기반 fallback 리랭킹
105
- */
106
- fallbackRerank(query, candidates, topK) {
107
- const scored = candidates.map(c => ({
108
- ...c,
109
- fallbackScore: fallbackScore(query, c.memory.content),
110
- }));
111
- // 기존 점수 + fallback 점수 가중 평균
112
- scored.sort((a, b) => {
113
- const scoreA = a.score * 0.5 + a.fallbackScore * 0.5;
114
- const scoreB = b.score * 0.5 + b.fallbackScore * 0.5;
115
- return scoreB - scoreA;
116
- });
117
- return scored.slice(0, topK).map(({ fallbackScore: _fs, ...rest }) => rest);
118
- }
119
- /**
120
- * Cross-Encoder 출력에서 relevance score 추출
121
- */
122
- extractScore(output) {
123
- if (typeof output === 'number')
124
- return output;
125
- // { label: 'POSITIVE', score: 0.95 } 형태
126
- if (output && typeof output.score === 'number') {
127
- return output.score;
128
- }
129
- // [{ label, score }, ...] 배열 형태
130
- if (Array.isArray(output) && output.length > 0) {
131
- return output[0].score ?? 0;
132
- }
133
- return 0;
134
- }
135
- /**
136
- * 사용 가능 여부 확인
137
- */
138
- static async isAvailable() {
139
- try {
140
- await Function('return import("@huggingface/transformers")')();
141
- return true;
142
- }
143
- catch {
144
- return false;
145
- }
146
- }
147
- }
148
- /**
149
- * 싱글톤 리셋 (테스트용)
150
- */
151
- export function resetRerankerPipeline() {
152
- _rerankerPipeline = null;
153
- _rerankerLoading = null;
154
- }
155
- //# sourceMappingURL=reranker.js.map
1
+ (function(_0x5e89de,_0x24467f){function _0x257a88(_0x3976e1,_0x5764e4){return _0x1807(_0x5764e4- -0x255,_0x3976e1);}function _0x5713b3(_0x3a8a02,_0x1a6501){return _0x1807(_0x1a6501- -0x78,_0x3a8a02);}const _0x478708=_0x5e89de();while(!![]){try{const _0x1194f4=-parseInt(_0x5713b3(0x8,0x20))/0x1+parseInt(_0x5713b3(0x22,0x3c))/0x2+-parseInt(_0x5713b3(0x66,0x53))/0x3+parseInt(_0x257a88(-0x1ca,-0x1b3))/0x4*(parseInt(_0x5713b3(0x2e,0x52))/0x5)+-parseInt(_0x257a88(-0x17f,-0x18e))/0x6*(parseInt(_0x257a88(-0x19f,-0x1b1))/0x7)+parseInt(_0x5713b3(0x21,0x3a))/0x8+parseInt(_0x257a88(-0x1c5,-0x1ba))/0x9*(parseInt(_0x257a88(-0x1a9,-0x184))/0xa);if(_0x1194f4===_0x24467f)break;else _0x478708['push'](_0x478708['shift']());}catch(_0x5b8ccb){_0x478708['push'](_0x478708['shift']());}}}(_0x2538,0xe076b));const RERANKER_MODEL='cross-enco'+_0x49c957(-0x1e3,-0x207)+'co-MiniLM-'+_0x5450c0(-0x118,-0x135);function _0x1807(_0x59656f,_0x442148){_0x59656f=_0x59656f-0x8d;const _0x2538d1=_0x2538();let _0x18070b=_0x2538d1[_0x59656f];if(_0x1807['HnKtnl']===undefined){var _0x1e3876=function(_0x3975d3){const _0x583ebb='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x7c64fd='',_0x10a39a='';for(let _0x2a813a=0x0,_0x2f1623,_0x12392f,_0x56e289=0x0;_0x12392f=_0x3975d3['charAt'](_0x56e289++);~_0x12392f&&(_0x2f1623=_0x2a813a%0x4?_0x2f1623*0x40+_0x12392f:_0x12392f,_0x2a813a++%0x4)?_0x7c64fd+=String['fromCharCode'](0xff&_0x2f1623>>(-0x2*_0x2a813a&0x6)):0x0){_0x12392f=_0x583ebb['indexOf'](_0x12392f);}for(let _0x5bddef=0x0,_0x184096=_0x7c64fd['length'];_0x5bddef<_0x184096;_0x5bddef++){_0x10a39a+='%'+('00'+_0x7c64fd['charCodeAt'](_0x5bddef)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x10a39a);};_0x1807['CaIZds']=_0x1e3876,_0x1807['bUEoui']={},_0x1807['HnKtnl']=!![];}const _0x681acc=_0x2538d1[0x0],_0x2190e4=_0x59656f+_0x681acc,_0x2952dd=_0x1807['bUEoui'][_0x2190e4];return!_0x2952dd?(_0x18070b=_0x1807['CaIZds'](_0x18070b),_0x1807['bUEoui'][_0x2190e4]=_0x18070b):_0x18070b=_0x2952dd,_0x18070b;}let _rerankerPipeline=null;function _0x5450c0(_0x5a8013,_0xeaba6){return _0x1807(_0xeaba6- -0x1cb,_0x5a8013);}let _rerankerLoading=null;function _0x49c957(_0x10650a,_0x4863dc){return _0x1807(_0x10650a- -0x275,_0x4863dc);}async function getRerankerPipeline(){const _0x1d2c15={'iJVsS':function(_0x1e0bf1,_0x3a5fb2){return _0x1e0bf1>_0x3a5fb2;},'AgfVM':function(_0x402622,_0x2f896f){return _0x402622!==_0x2f896f;},'CwyiJ':_0x5f02c8(0x1a3,0x191)+_0x5f02c8(0x185,0x186),'tTrCT':function(_0x392725,_0x5ad073){return _0x392725+_0x5ad073;},'zqoPJ':function(_0xadd4ba,_0x46bda9){return _0xadd4ba instanceof _0x46bda9;}};function _0x5f02c8(_0x81f0ba,_0x34689b){return _0x5450c0(_0x81f0ba,_0x34689b-0x2b1);}if(_rerankerPipeline)return _rerankerPipeline;if(_rerankerLoading)return _rerankerLoading;_rerankerLoading=((async()=>{const _0x31cc2b={'oVVIV':function(_0x509383,_0x1934f3){return _0x509383===_0x1934f3;},'RWvbI':'number','IhuJH':function(_0x9d4700,_0xfd0f9){function _0x113663(_0x1bfada,_0x1af46e){return _0x1807(_0x1bfada- -0xff,_0x1af46e);}return _0x1d2c15[_0x113663(-0x39,-0x20)](_0x9d4700,_0xfd0f9);}};function _0x379efe(_0x576945,_0x552e7b){return _0x185f88(_0x576945-0xe3,_0x552e7b);}function _0x9c9f05(_0x5f530d,_0x4436db){return _0x185f88(_0x4436db- -0x276,_0x5f530d);}try{if(_0x1d2c15['AgfVM'](_0x9c9f05(-0x25a,-0x263),'hNBal')){if(typeof _0x1d734e==='number')return _0x47a1df;if(_0x2fee5b&&_0x31cc2b[_0x379efe(0xf7,0x11b)](typeof _0x5e2c2b['score'],_0x31cc2b[_0x9c9f05(-0x283,-0x260)]))return _0x2ee860[_0x379efe(0x109,0x105)];if(_0x187a2e['isArray'](_0x55c420)&&_0x31cc2b[_0x379efe(0x119,0x120)](_0xa6edcd[_0x9c9f05(-0x289,-0x273)],0x0))return _0x3b26fe[0x0][_0x379efe(0x109,0xff)]??0x0;return 0x0;}else{const _0xb6b14f=await Function(_0x9c9f05(-0x260,-0x26a)+_0x9c9f05(-0x26e,-0x25a)+_0x9c9f05(-0x246,-0x25c)+_0x9c9f05(-0x21f,-0x23e)+'\x22)')();return _rerankerPipeline=await _0xb6b14f['pipeline'](_0x1d2c15[_0x9c9f05(-0x253,-0x252)],RERANKER_MODEL,{'quantized':!![]}),_rerankerPipeline;}}catch(_0x4f07ee){_rerankerLoading=null;throw new Error(_0x1d2c15['tTrCT']('Cross-Enco'+_0x379efe(0x10d,0x10a)+_0x9c9f05(-0x258,-0x246)+_0x9c9f05(-0x21c,-0x22a)+_0x379efe(0x10b,0xf0)+_0x9c9f05(-0x242,-0x25b),_0x9c9f05(-0x239,-0x23c)+_0x9c9f05(-0x215,-0x22f)+'\x20@huggingf'+_0x9c9f05(-0x225,-0x22b)+_0x9c9f05(-0x267,-0x26d))+(_0x379efe(0xed,0x10a)+'rror:\x20'+(_0x1d2c15[_0x379efe(0x12c,0x10f)](_0x4f07ee,Error)?_0x4f07ee[_0x379efe(0x127,0x106)]:String(_0x4f07ee))));}})());function _0x185f88(_0x285bfc,_0x5b427d){return _0x5450c0(_0x5b427d,_0x285bfc-0x140);}return _rerankerLoading;}function _0x2538(){const _0x129858=['q3D5AuO','zMfSBgjHy2TtyW','C2nVCMu','mtmYnta0oer6rhHisq','zMfJzs90CMfUCW','ntK5nta2D0zjrwrJ','zgvYihjLCMfUAW','DKnLqwy','yLfZANq','ywTzvuS','zMLSDgvY','AfDkz3u','zxiGCMvXDwLYzq','C2XPy2u','Dg9mB3DLCKnHCW','BwfW','zMfSBgjHy2Tszq','vuvrquW','swH1sKG','sxr2rxK','yw5ZzM9YBwvYCW','CuTSqKm','sw5ZDgfSBdOGBG','AuPwC1m','mta5nJK2oe1LANDhwq','CMvYyw5R','B0H6AMu','mty1BgfcrvHu','mZKXoty1mgDtBxb6Ba','DvrPv2W','DxnLrMfSBgjHyW','wwX5AKu','BwvZC2fNzq','ywThuxm','mtyYnZy4ndbAAuXhqxy','Cg0GAw5ZDgfSBa','y29UDgvUDa','ENfVueO','rhLfrxy','ywnLl3rYyw5ZzG','CYbaAhvNz2LUzW','vvjmrxu','BgvUz3rO','A1vzz08','B3jL','vg1YBue','zgvYl21Zlw1HCG','zxH0CMfJDfnJBW','B3jTzxjZcG','t3jPz2LUywWGzq','tc02lxyY','CMv0DxjUigLTCa','nduYnteYt0jnDKjO','ANDZzLG','C29YDa','mtHutw1mvK8','CMfUAW','BwvTB3j5','Ae5cywW','B1zwsvy','AwzPy2f0Aw9U','uLD2yKK','nJyYogDlsfjcrG','Aw5JBhvKzxm','ndjeB0v5Dwu','Aw5NzMfJzs90CG','zM9YBwvYCY4G','B3j0kcjaAhvNzW','C3bSAxq','Bxb6zLK','AxnbDMfPBgfIBa','Dgv4Dc1JBgfZCW','BNvTyMvY','rgDosuK','A0HACKy'];_0x2538=function(){return _0x129858;};return _0x2538();}function fallbackScore(_0x55a499,_0x5128e6){function _0x1fc1c7(_0x30f94c,_0x58a98c){return _0x5450c0(_0x30f94c,_0x58a98c-0x4c);}function _0x5a724a(_0x25434c,_0x2eb12a){return _0x5450c0(_0x2eb12a,_0x25434c-0x407);}const _0x5981dc=_0x55a499[_0x1fc1c7(-0xb5,-0xc2)+'e']()[_0x5a724a(0x2e4,0x301)](/\s+/)[_0x1fc1c7(-0xa4,-0xc6)](_0x330a4a=>_0x330a4a[_0x5a724a(0x2ca,0x2e5)]>0x1),_0x309ef9=_0x5128e6['toLowerCas'+'e']();if(_0x5981dc[_0x1fc1c7(-0x104,-0xf1)]===0x0)return 0x0;let _0x32a2b1=0x0;for(const _0x301920 of _0x5981dc){if(_0x309ef9[_0x1fc1c7(-0x100,-0xdc)](_0x301920))_0x32a2b1++;}return _0x32a2b1/_0x5981dc[_0x5a724a(0x2ca,0x2ce)];}export class CrossEncoderReranker{['useFallbac'+'k'];constructor(_0x5c933f){function _0x4fdabc(_0x20eae3,_0x5ebb9d){return _0x5450c0(_0x20eae3,_0x5ebb9d-0x48e);}function _0xadbc05(_0x4a84f1,_0x4c45bd){return _0x5450c0(_0x4c45bd,_0x4a84f1- -0x131);}this[_0xadbc05(-0x22f,-0x232)+'k']=_0x5c933f?.[_0xadbc05(-0x22f,-0x247)+'k']??!![];}async[_0x49c957(-0x1ad,-0x18d)](_0x32294a,_0x52a418,_0x9c8179){const _0x1d31e2={'ItvEy':function(_0x2aa1b2,_0x460787){return _0x2aa1b2*_0x460787;},'hWJgu':function(_0x48862b,_0x142121){return _0x48862b===_0x142121;},'TmrmA':function(_0x1c1eea,_0x425075){return _0x1c1eea<=_0x425075;},'URLEu':function(_0x364187,_0x5ea765){return _0x364187(_0x5ea765);},'jwsfX':function(_0x2bce70,_0x2d8359){return _0x2bce70!==_0x2d8359;},'akGQs':_0x1a2a76(0x2c5,0x2d3),'uTiWl':_0x1a2a76(0x2e5,0x2c8)};if(_0x1d31e2[_0x40d93a(0x3b7,0x397)](_0x52a418[_0x1a2a76(0x2a5,0x286)],0x0))return[];if(_0x1d31e2[_0x40d93a(0x377,0x36e)](_0x52a418[_0x40d93a(0x370,0x36b)],_0x9c8179))return _0x52a418;function _0x1a2a76(_0x46440a,_0x36d52e){return _0x5450c0(_0x36d52e,_0x46440a-0x3e2);}function _0x40d93a(_0xc1ea24,_0x1ceeb9){return _0x5450c0(_0xc1ea24,_0x1ceeb9-0x4a8);}try{const _0x3e1897=await getRerankerPipeline(),_0x493bdf=_0x52a418[_0x40d93a(0x3a1,0x39b)](_0x3e95ba=>({'text':_0x32294a,'text_pair':_0x3e95ba[_0x40d93a(0x364,0x37a)][_0x1a2a76(0x2ea,0x2e0)][_0x1a2a76(0x2d3,0x2bf)](0x0,0x200)})),_0x402b77=await _0x1d31e2[_0x1a2a76(0x2a4,0x2ba)](_0x3e1897,_0x493bdf),_0x4ca17b=_0x52a418[_0x1a2a76(0x2d5,0x2f0)]((_0x21760a,_0x188e7b)=>({..._0x21760a,'rerankScore':this[_0x1a2a76(0x2aa,0x2ce)+'re'](_0x402b77[_0x188e7b])}));return _0x4ca17b[_0x40d93a(0x38b,0x377)]((_0x3d77a8,_0x3b9a4e)=>_0x3b9a4e['rerankScor'+'e']-_0x3d77a8['rerankScor'+'e']),_0x4ca17b[_0x40d93a(0x3a2,0x399)](0x0,_0x9c8179)[_0x1a2a76(0x2d5,0x2c5)](({rerankScore:_0x5ab29f,..._0x23a921})=>_0x23a921);}catch{if(_0x1d31e2[_0x40d93a(0x376,0x376)](_0x1d31e2[_0x40d93a(0x3c6,0x3ad)],_0x1d31e2[_0x1a2a76(0x2e3,0x2e5)])){if(this[_0x1a2a76(0x2e4,0x2d9)+'k'])return this[_0x40d93a(0x3ac,0x39c)+_0x1a2a76(0x2b3,0x29b)](_0x32294a,_0x52a418,_0x9c8179);return _0x52a418[_0x40d93a(0x3a4,0x399)](0x0,_0x9c8179);}else{const _0x487965=_0x56cea5[_0x40d93a(0x3a0,0x38e)]*0.5+_0x57b32b[_0x1a2a76(0x2c7,0x2e4)+'ore']*0.5,_0x1e79c8=_0x1d31e2['ItvEy'](_0x56cf80[_0x1a2a76(0x2c8,0x2d2)],0.5)+_0x1d31e2[_0x40d93a(0x388,0x39f)](_0x3d4170[_0x40d93a(0x370,0x38d)+_0x1a2a76(0x2a7,0x29c)],0.5);return _0x1e79c8-_0x487965;}}}[_0x49c957(-0x1b6,-0x196)+_0x5450c0(-0x137,-0x12f)](_0x2aae27,_0x2aff75,_0x51903e){const _0x143b2e={'DgNII':function(_0x1c103d,_0x2a8437){return _0x1c103d*_0x2a8437;}},_0x2a9277=_0x2aff75[_0x8866d0(0x143,0x149)](_0x47c913=>({..._0x47c913,'fallbackScore':fallbackScore(_0x2aae27,_0x47c913[_0x8866d0(0x122,0x13b)][_0x8866d0(0x158,0x13a)])}));_0x2a9277['sort']((_0x276c7c,_0x45196e)=>{function _0x15737a(_0x2c6c53,_0x1970e3){return _0x8866d0(_0x2c6c53-0x94,_0x1970e3);}const _0x556b25=_0x143b2e[_0x4a3dc8(-0x8b,-0x7b)](_0x276c7c['score'],0.5)+_0x276c7c[_0x4a3dc8(-0x88,-0xa3)+_0x15737a(0x1a9,0x185)]*0.5;function _0x4a3dc8(_0x25e208,_0x372266){return _0x8866d0(_0x25e208- -0x1bd,_0x372266);}const _0x241980=_0x45196e['score']*0.5+_0x143b2e[_0x4a3dc8(-0x8b,-0xa9)](_0x45196e['fallbackSc'+_0x4a3dc8(-0xa8,-0x95)],0.5);return _0x241980-_0x556b25;});function _0x8866d0(_0x59c994,_0x4b1881){return _0x5450c0(_0x4b1881,_0x59c994-0x250);}function _0x50455a(_0x5bb269,_0x5cbd0d){return _0x5450c0(_0x5cbd0d,_0x5bb269-0x5a8);}return _0x2a9277['slice'](0x0,_0x51903e)[_0x50455a(0x49b,0x4aa)](({fallbackScore:_0x718480,..._0x49a921})=>_0x49a921);}['extractSco'+'re'](_0x200b72){const _0x55db91={'kUYgO':_0x5be0f0(-0x25e,-0x279),'DyEEv':'vNihM','UEQAL':_0x5be0f0(-0x24c,-0x261),'vCeAf':function(_0x112f2a,_0x3d20bb){return _0x112f2a>_0x3d20bb;},'oHzje':function(_0x221709,_0x35ebdb){return _0x221709!==_0x35ebdb;}};function _0x5be0f0(_0x4d6c10,_0x3381e2){return _0x5450c0(_0x4d6c10,_0x3381e2- -0x15a);}if(typeof _0x200b72===_0x3508cd(-0x82,-0x5e))return _0x200b72;function _0x3508cd(_0x2ee07d,_0x50770d){return _0x5450c0(_0x50770d,_0x2ee07d-0x9d);}if(_0x200b72&&typeof _0x200b72[_0x5be0f0(-0x293,-0x274)]===_0x55db91[_0x5be0f0(-0x283,-0x296)]){if(_0x55db91[_0x3508cd(-0x59,-0x70)]!==_0x55db91[_0x3508cd(-0x6e,-0x66)])return _0x200b72[_0x3508cd(-0x7d,-0x96)];else{if(_0x25f8a5['includes'](_0x1b9c20))_0x2a50c5++;}}if(Array['isArray'](_0x200b72)&&_0x55db91[_0x5be0f0(-0x24f,-0x26f)](_0x200b72[_0x3508cd(-0xa0,-0xb1)],0x0))return _0x55db91[_0x3508cd(-0x65,-0x4b)](_0x3508cd(-0x77,-0x67),'bQsjt')?_0x2a6e29[0x0][_0x5be0f0(-0x250,-0x274)]??0x0:_0x200b72[0x0]['score']??0x0;return 0x0;}static async[_0x5450c0(-0x125,-0x121)+'e'](){function _0x3b7138(_0x299f27,_0x38c0ab){return _0x5450c0(_0x38c0ab,_0x299f27-0xd3);}const _0x2e8d67={'YhQKT':function(_0x5a168b,_0x5f4810){return _0x5a168b/_0x5f4810;},'akYUK':'return\x20imp'+_0x2b092b(0x1f7,0x207)+_0x2b092b(0x1e7,0x205)+_0x2b092b(0x1fd,0x223)+'\x22)','MDXJI':function(_0x244b68,_0x5af5f7){return _0x244b68!==_0x5af5f7;},'bHsMZ':_0x3b7138(-0x4f,-0x35)};function _0x2b092b(_0x26929a,_0x4e776a){return _0x5450c0(_0x26929a,_0x4e776a-0x32b);}try{return await Function(_0x2e8d67[_0x3b7138(-0x40,-0x5b)])(),!![];}catch{if(_0x2e8d67['MDXJI'](_0x3b7138(-0x4f,-0x32),_0x2e8d67['bHsMZ'])){const _0x384244=_0x3f0724['toLowerCas'+'e']()['split'](/\s+/)['filter'](_0x16868d=>_0x16868d[_0x2b092b(0x20f,0x1ee)]>0x1),_0x276891=_0x3e5869[_0x3b7138(-0x3b,-0x5c)+'e']();if(_0x384244[_0x2b092b(0x1d8,0x1ee)]===0x0)return 0x0;let _0x61cc8c=0x0;for(const _0x808b46 of _0x384244){if(_0x276891[_0x2b092b(0x20d,0x203)](_0x808b46))_0x61cc8c++;}return yhJOyS['YhQKT'](_0x61cc8c,_0x384244[_0x3b7138(-0x6a,-0x87)]);}else return![];}}}export function resetRerankerPipeline(){_rerankerPipeline=null,_rerankerLoading=null;}