a2a-memory 0.11.5 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/LICENSE +7 -19
  2. package/README.md +1 -1
  3. package/dist/a2a/client.js +1 -252
  4. package/dist/a2a/discovery.js +1 -115
  5. package/dist/a2a/index.js +1 -8
  6. package/dist/a2a/types.js +1 -42
  7. package/dist/adapters/anthropic.js +1 -117
  8. package/dist/chunking/chunker.js +1 -163
  9. package/dist/claude/sync.d.ts +8 -2
  10. package/dist/claude/sync.js +1 -298
  11. package/dist/cli/commands/add.js +1 -80
  12. package/dist/cli/commands/claude-sync.d.ts +3 -3
  13. package/dist/cli/commands/claude-sync.js +1 -70
  14. package/dist/cli/commands/cleanup.js +1 -83
  15. package/dist/cli/commands/config.js +1 -79
  16. package/dist/cli/commands/edit.js +1 -69
  17. package/dist/cli/commands/embed.js +1 -92
  18. package/dist/cli/commands/extract.js +1 -103
  19. package/dist/cli/commands/health.js +1 -105
  20. package/dist/cli/commands/list.js +1 -46
  21. package/dist/cli/commands/migrate-chunks.js +1 -205
  22. package/dist/cli/commands/migrate-file-refs.js +1 -183
  23. package/dist/cli/commands/proficiency.js +1 -146
  24. package/dist/cli/commands/rm.js +1 -64
  25. package/dist/cli/commands/search.js +1 -90
  26. package/dist/cli/commands/setup-wizard.js +1 -387
  27. package/dist/cli/commands/setup.js +1 -170
  28. package/dist/cli/commands/skill.js +1 -151
  29. package/dist/cli/commands/status.js +1 -70
  30. package/dist/cli/commands/sync.js +1 -202
  31. package/dist/cli/commands/team.js +1 -142
  32. package/dist/cli/index.js +1 -87
  33. package/dist/config/manager.js +1 -372
  34. package/dist/db/database.d.ts +36 -0
  35. package/dist/db/database.js +1 -1400
  36. package/dist/embedding/e5-provider.js +1 -147
  37. package/dist/embedding/index.js +1 -34
  38. package/dist/embedding/local-provider.js +1 -157
  39. package/dist/embedding/openai-provider.js +1 -92
  40. package/dist/embedding/quantization.js +1 -89
  41. package/dist/extraction/dedup-manager.js +1 -161
  42. package/dist/extraction/emotion-filter.js +1 -33
  43. package/dist/extraction/extractor.d.ts +0 -3
  44. package/dist/extraction/extractor.js +1 -648
  45. package/dist/extraction/file-reference.js +1 -77
  46. package/dist/extraction/filter.js +1 -86
  47. package/dist/extraction/scorer.js +1 -142
  48. package/dist/extraction/similarity.js +1 -85
  49. package/dist/hooks/client-factory.js +1 -44
  50. package/dist/hooks/post-tool-use.js +1 -518
  51. package/dist/hooks/pre-compact.js +1 -209
  52. package/dist/hooks/session-end.js +1 -633
  53. package/dist/hooks/session-start.js +1 -549
  54. package/dist/hooks/shared.js +1 -110
  55. package/dist/hooks/stop.d.ts +21 -0
  56. package/dist/hooks/stop.js +1 -0
  57. package/dist/hooks/user-prompt-submit.js +1 -316
  58. package/dist/i18n/index.js +1 -2
  59. package/dist/i18n/messages.js +1 -150
  60. package/dist/index.d.ts +1 -1
  61. package/dist/index.js +1 -43
  62. package/dist/lifecycle/cleanup-scheduler.js +1 -137
  63. package/dist/lifecycle/cleanup.d.ts +1 -0
  64. package/dist/lifecycle/cleanup.js +1 -116
  65. package/dist/lifecycle/consolidation.d.ts +22 -0
  66. package/dist/lifecycle/consolidation.js +1 -0
  67. package/dist/lifecycle/index.d.ts +2 -0
  68. package/dist/lifecycle/index.js +1 -13
  69. package/dist/lifecycle/injection-flush.d.ts +24 -0
  70. package/dist/lifecycle/injection-flush.js +1 -0
  71. package/dist/lifecycle/quality-scorer.d.ts +5 -6
  72. package/dist/lifecycle/quality-scorer.js +1 -46
  73. package/dist/lifecycle/tiering.js +1 -246
  74. package/dist/llm/client.js +1 -226
  75. package/dist/llm/index.js +1 -5
  76. package/dist/proficiency/actr-engine.js +1 -106
  77. package/dist/proficiency/detection.js +1 -77
  78. package/dist/proficiency/index.js +1 -9
  79. package/dist/proficiency/tracker.js +1 -173
  80. package/dist/proficiency/types.js +1 -8
  81. package/dist/providers/adapters.js +1 -140
  82. package/dist/providers/detector.js +1 -57
  83. package/dist/search/adaptive-router.js +1 -93
  84. package/dist/search/index.js +1 -9
  85. package/dist/search/ranker.js +1 -171
  86. package/dist/search/reranker.js +1 -155
  87. package/dist/session/parser.js +1 -130
  88. package/dist/skill/evaluator.js +1 -509
  89. package/dist/skill/index.js +1 -7
  90. package/dist/skill/types.js +1 -7
  91. package/dist/sync/client.d.ts +7 -0
  92. package/dist/sync/client.js +1 -597
  93. package/dist/sync/encryption.js +1 -203
  94. package/dist/sync/index.js +1 -12
  95. package/dist/sync/queue.js +1 -214
  96. package/dist/sync/scheduler.js +1 -140
  97. package/dist/sync/synchronizer.js +1 -241
  98. package/dist/sync/team-synchronizer.js +1 -204
  99. package/dist/sync/vector-clock.js +1 -70
  100. package/dist/types/index.d.ts +13 -1
  101. package/dist/types/index.js +1 -132
  102. package/dist/utils/keychain.js +1 -170
  103. package/dist/utils/logger.js +1 -128
  104. package/package.json +15 -10
  105. package/dist/a2a/client.d.ts.map +0 -1
  106. package/dist/a2a/client.js.map +0 -1
  107. package/dist/a2a/discovery.d.ts.map +0 -1
  108. package/dist/a2a/discovery.js.map +0 -1
  109. package/dist/a2a/index.d.ts.map +0 -1
  110. package/dist/a2a/index.js.map +0 -1
  111. package/dist/a2a/types.d.ts.map +0 -1
  112. package/dist/a2a/types.js.map +0 -1
  113. package/dist/adapters/anthropic.d.ts.map +0 -1
  114. package/dist/adapters/anthropic.js.map +0 -1
  115. package/dist/chunking/chunker.d.ts.map +0 -1
  116. package/dist/chunking/chunker.js.map +0 -1
  117. package/dist/claude/sync.d.ts.map +0 -1
  118. package/dist/claude/sync.js.map +0 -1
  119. package/dist/cli/commands/add.d.ts.map +0 -1
  120. package/dist/cli/commands/add.js.map +0 -1
  121. package/dist/cli/commands/claude-sync.d.ts.map +0 -1
  122. package/dist/cli/commands/claude-sync.js.map +0 -1
  123. package/dist/cli/commands/cleanup.d.ts.map +0 -1
  124. package/dist/cli/commands/cleanup.js.map +0 -1
  125. package/dist/cli/commands/config.d.ts.map +0 -1
  126. package/dist/cli/commands/config.js.map +0 -1
  127. package/dist/cli/commands/edit.d.ts.map +0 -1
  128. package/dist/cli/commands/edit.js.map +0 -1
  129. package/dist/cli/commands/embed.d.ts.map +0 -1
  130. package/dist/cli/commands/embed.js.map +0 -1
  131. package/dist/cli/commands/extract.d.ts.map +0 -1
  132. package/dist/cli/commands/extract.js.map +0 -1
  133. package/dist/cli/commands/health.d.ts.map +0 -1
  134. package/dist/cli/commands/health.js.map +0 -1
  135. package/dist/cli/commands/list.d.ts.map +0 -1
  136. package/dist/cli/commands/list.js.map +0 -1
  137. package/dist/cli/commands/migrate-chunks.d.ts.map +0 -1
  138. package/dist/cli/commands/migrate-chunks.js.map +0 -1
  139. package/dist/cli/commands/migrate-file-refs.d.ts.map +0 -1
  140. package/dist/cli/commands/migrate-file-refs.js.map +0 -1
  141. package/dist/cli/commands/proficiency.d.ts.map +0 -1
  142. package/dist/cli/commands/proficiency.js.map +0 -1
  143. package/dist/cli/commands/rm.d.ts.map +0 -1
  144. package/dist/cli/commands/rm.js.map +0 -1
  145. package/dist/cli/commands/search.d.ts.map +0 -1
  146. package/dist/cli/commands/search.js.map +0 -1
  147. package/dist/cli/commands/setup-wizard.d.ts.map +0 -1
  148. package/dist/cli/commands/setup-wizard.js.map +0 -1
  149. package/dist/cli/commands/setup.d.ts.map +0 -1
  150. package/dist/cli/commands/setup.js.map +0 -1
  151. package/dist/cli/commands/skill.d.ts.map +0 -1
  152. package/dist/cli/commands/skill.js.map +0 -1
  153. package/dist/cli/commands/status.d.ts.map +0 -1
  154. package/dist/cli/commands/status.js.map +0 -1
  155. package/dist/cli/commands/sync.d.ts.map +0 -1
  156. package/dist/cli/commands/sync.js.map +0 -1
  157. package/dist/cli/commands/team.d.ts.map +0 -1
  158. package/dist/cli/commands/team.js.map +0 -1
  159. package/dist/cli/index.d.ts.map +0 -1
  160. package/dist/cli/index.js.map +0 -1
  161. package/dist/config/manager.d.ts.map +0 -1
  162. package/dist/config/manager.js.map +0 -1
  163. package/dist/db/database.d.ts.map +0 -1
  164. package/dist/db/database.js.map +0 -1
  165. package/dist/embedding/e5-provider.d.ts.map +0 -1
  166. package/dist/embedding/e5-provider.js.map +0 -1
  167. package/dist/embedding/index.d.ts.map +0 -1
  168. package/dist/embedding/index.js.map +0 -1
  169. package/dist/embedding/local-provider.d.ts.map +0 -1
  170. package/dist/embedding/local-provider.js.map +0 -1
  171. package/dist/embedding/openai-provider.d.ts.map +0 -1
  172. package/dist/embedding/openai-provider.js.map +0 -1
  173. package/dist/embedding/quantization.d.ts.map +0 -1
  174. package/dist/embedding/quantization.js.map +0 -1
  175. package/dist/extraction/dedup-manager.d.ts.map +0 -1
  176. package/dist/extraction/dedup-manager.js.map +0 -1
  177. package/dist/extraction/emotion-filter.d.ts.map +0 -1
  178. package/dist/extraction/emotion-filter.js.map +0 -1
  179. package/dist/extraction/extractor.d.ts.map +0 -1
  180. package/dist/extraction/extractor.js.map +0 -1
  181. package/dist/extraction/file-reference.d.ts.map +0 -1
  182. package/dist/extraction/file-reference.js.map +0 -1
  183. package/dist/extraction/filter.d.ts.map +0 -1
  184. package/dist/extraction/filter.js.map +0 -1
  185. package/dist/extraction/scorer.d.ts.map +0 -1
  186. package/dist/extraction/scorer.js.map +0 -1
  187. package/dist/extraction/similarity.d.ts.map +0 -1
  188. package/dist/extraction/similarity.js.map +0 -1
  189. package/dist/hooks/client-factory.d.ts.map +0 -1
  190. package/dist/hooks/client-factory.js.map +0 -1
  191. package/dist/hooks/post-tool-use.d.ts.map +0 -1
  192. package/dist/hooks/post-tool-use.js.map +0 -1
  193. package/dist/hooks/pre-compact.d.ts.map +0 -1
  194. package/dist/hooks/pre-compact.js.map +0 -1
  195. package/dist/hooks/session-end.d.ts.map +0 -1
  196. package/dist/hooks/session-end.js.map +0 -1
  197. package/dist/hooks/session-start.d.ts.map +0 -1
  198. package/dist/hooks/session-start.js.map +0 -1
  199. package/dist/hooks/shared.d.ts.map +0 -1
  200. package/dist/hooks/shared.js.map +0 -1
  201. package/dist/hooks/user-prompt-submit.d.ts.map +0 -1
  202. package/dist/hooks/user-prompt-submit.js.map +0 -1
  203. package/dist/i18n/index.d.ts.map +0 -1
  204. package/dist/i18n/index.js.map +0 -1
  205. package/dist/i18n/messages.d.ts.map +0 -1
  206. package/dist/i18n/messages.js.map +0 -1
  207. package/dist/index.d.ts.map +0 -1
  208. package/dist/index.js.map +0 -1
  209. package/dist/lifecycle/cleanup-scheduler.d.ts.map +0 -1
  210. package/dist/lifecycle/cleanup-scheduler.js.map +0 -1
  211. package/dist/lifecycle/cleanup.d.ts.map +0 -1
  212. package/dist/lifecycle/cleanup.js.map +0 -1
  213. package/dist/lifecycle/index.d.ts.map +0 -1
  214. package/dist/lifecycle/index.js.map +0 -1
  215. package/dist/lifecycle/quality-scorer.d.ts.map +0 -1
  216. package/dist/lifecycle/quality-scorer.js.map +0 -1
  217. package/dist/lifecycle/tiering.d.ts.map +0 -1
  218. package/dist/lifecycle/tiering.js.map +0 -1
  219. package/dist/llm/client.d.ts.map +0 -1
  220. package/dist/llm/client.js.map +0 -1
  221. package/dist/llm/index.d.ts.map +0 -1
  222. package/dist/llm/index.js.map +0 -1
  223. package/dist/proficiency/actr-engine.d.ts.map +0 -1
  224. package/dist/proficiency/actr-engine.js.map +0 -1
  225. package/dist/proficiency/detection.d.ts.map +0 -1
  226. package/dist/proficiency/detection.js.map +0 -1
  227. package/dist/proficiency/index.d.ts.map +0 -1
  228. package/dist/proficiency/index.js.map +0 -1
  229. package/dist/proficiency/tracker.d.ts.map +0 -1
  230. package/dist/proficiency/tracker.js.map +0 -1
  231. package/dist/proficiency/types.d.ts.map +0 -1
  232. package/dist/proficiency/types.js.map +0 -1
  233. package/dist/providers/adapters.d.ts.map +0 -1
  234. package/dist/providers/adapters.js.map +0 -1
  235. package/dist/providers/detector.d.ts.map +0 -1
  236. package/dist/providers/detector.js.map +0 -1
  237. package/dist/search/adaptive-router.d.ts.map +0 -1
  238. package/dist/search/adaptive-router.js.map +0 -1
  239. package/dist/search/index.d.ts.map +0 -1
  240. package/dist/search/index.js.map +0 -1
  241. package/dist/search/ranker.d.ts.map +0 -1
  242. package/dist/search/ranker.js.map +0 -1
  243. package/dist/search/reranker.d.ts.map +0 -1
  244. package/dist/search/reranker.js.map +0 -1
  245. package/dist/session/parser.d.ts.map +0 -1
  246. package/dist/session/parser.js.map +0 -1
  247. package/dist/skill/evaluator.d.ts.map +0 -1
  248. package/dist/skill/evaluator.js.map +0 -1
  249. package/dist/skill/index.d.ts.map +0 -1
  250. package/dist/skill/index.js.map +0 -1
  251. package/dist/skill/types.d.ts.map +0 -1
  252. package/dist/skill/types.js.map +0 -1
  253. package/dist/sync/client.d.ts.map +0 -1
  254. package/dist/sync/client.js.map +0 -1
  255. package/dist/sync/encryption.d.ts.map +0 -1
  256. package/dist/sync/encryption.js.map +0 -1
  257. package/dist/sync/index.d.ts.map +0 -1
  258. package/dist/sync/index.js.map +0 -1
  259. package/dist/sync/queue.d.ts.map +0 -1
  260. package/dist/sync/queue.js.map +0 -1
  261. package/dist/sync/scheduler.d.ts.map +0 -1
  262. package/dist/sync/scheduler.js.map +0 -1
  263. package/dist/sync/synchronizer.d.ts.map +0 -1
  264. package/dist/sync/synchronizer.js.map +0 -1
  265. package/dist/sync/team-synchronizer.d.ts.map +0 -1
  266. package/dist/sync/team-synchronizer.js.map +0 -1
  267. package/dist/sync/vector-clock.d.ts.map +0 -1
  268. package/dist/sync/vector-clock.js.map +0 -1
  269. package/dist/types/index.d.ts.map +0 -1
  270. package/dist/types/index.js.map +0 -1
  271. package/dist/utils/keychain.d.ts.map +0 -1
  272. package/dist/utils/keychain.js.map +0 -1
  273. package/dist/utils/logger.d.ts.map +0 -1
  274. package/dist/utils/logger.js.map +0 -1
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Injection Effectiveness Flush
3
+ *
4
+ * 세션의 injection_logs 레코드에서 effectiveness를 계산하고 저장합니다.
5
+ * SessionEnd, PreCompact, Stop hook에서 공용으로 호출됩니다.
6
+ *
7
+ * ADR-016 F1: hit_count / total_injected 기반 effectiveness 집계.
8
+ * 반환값의 reinforceTargets를 받아 호출자가 reinforce 여부를 결정합니다.
9
+ * (네트워크 의존성 없음 → Stop hook의 경량 경로 재사용 가능)
10
+ */
11
+ import type { MemoryDatabase } from '../db/database.js';
12
+ import type { createLogger } from '../utils/logger.js';
13
+ export interface FlushResult {
14
+ /** effectiveness가 갱신된 레코드 수 */
15
+ updated: number;
16
+ /** effectiveness > 0.3인 injection의 누적 memory ID 목록 (reinforce 후보) */
17
+ reinforceTargets: string[];
18
+ }
19
+ /**
20
+ * 세션 ID 기준으로 모든 injection_logs의 effectiveness를 재계산/저장합니다.
21
+ * 동기 함수이며 네트워크 호출 없음. 실패 시 WARN 기록 후 부분 결과 반환.
22
+ */
23
+ export declare function flushInjectionEffectiveness(db: MemoryDatabase, sessionId: string | undefined, logger?: ReturnType<typeof createLogger>): FlushResult;
24
+ //# sourceMappingURL=injection-flush.d.ts.map
@@ -0,0 +1 @@
1
+ function _0x1381(_0x1d35bf,_0x14e9c2){_0x1d35bf=_0x1d35bf-0x1ba;const _0x3d8dd6=_0x3d8d();let _0x1381f4=_0x3d8dd6[_0x1d35bf];if(_0x1381['ovyxea']===undefined){var _0x3b5870=function(_0x1b6b07){const _0x4186ee='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x394acb='',_0x504846='';for(let _0x3f279d=0x0,_0x10869d,_0x43ef31,_0x3b950b=0x0;_0x43ef31=_0x1b6b07['charAt'](_0x3b950b++);~_0x43ef31&&(_0x10869d=_0x3f279d%0x4?_0x10869d*0x40+_0x43ef31:_0x43ef31,_0x3f279d++%0x4)?_0x394acb+=String['fromCharCode'](0xff&_0x10869d>>(-0x2*_0x3f279d&0x6)):0x0){_0x43ef31=_0x4186ee['indexOf'](_0x43ef31);}for(let _0x5a3974=0x0,_0x3ce21c=_0x394acb['length'];_0x5a3974<_0x3ce21c;_0x5a3974++){_0x504846+='%'+('00'+_0x394acb['charCodeAt'](_0x5a3974)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x504846);};_0x1381['xvJBin']=_0x3b5870,_0x1381['wtBLaq']={},_0x1381['ovyxea']=!![];}const _0x47a683=_0x3d8dd6[0x0],_0x202be6=_0x1d35bf+_0x47a683,_0x303422=_0x1381['wtBLaq'][_0x202be6];return!_0x303422?(_0x1381f4=_0x1381['xvJBin'](_0x1381f4),_0x1381['wtBLaq'][_0x202be6]=_0x1381f4):_0x1381f4=_0x303422,_0x1381f4;}function _0x3d8d(){const _0x2d0e99=['DxbKyxrLsw5Qzq','mtK2nJCYme5qvfzVua','mtq1mZy2oe1oDu5mva','CMvPBMzVCMnLva','nJi5mK9gr01irG','BwvZC2fNzq','DgL2zw5LC3m','ChvZAa','z2v0qwXSsw5Qzq','Bw9YEuLKCW','Aw5MBW','mtuYodK1otncCKvKvNu','zxnZigzSDxnOia','AgL0q291BNq','v2vwr1u','mZbfwLPcAwC','DgvK','zMfPBgvK','odyZntaYtu5OA0rg','mJy3suvnAunb','zxnZ','mti0nJGWBvPkzNjS','y3rPB25fzMzLyW','Dg90ywXjBMPLyW','mZi5mJuYmgXcDgrrrG','zwzMzwn0AxzLBG','t25zwMG','txHtAuS','nda1zvzfD2jM','nhnkDgH1ta','Aw5Qzwn0zwrnzq','yxjNzxrZ'];_0x3d8d=function(){return _0x2d0e99;};return _0x3d8d();}(function(_0x200314,_0x4f557e){const _0x4b3bf7=_0x200314();function _0x267ae7(_0x41529d,_0x1df4b0){return _0x1381(_0x1df4b0- -0xa4,_0x41529d);}function _0x452002(_0x1e1564,_0x4bd5f1){return _0x1381(_0x4bd5f1- -0x333,_0x1e1564);}while(!![]){try{const _0x282854=parseInt(_0x267ae7(0x11c,0x12b))/0x1*(parseInt(_0x267ae7(0x116,0x11c))/0x2)+-parseInt(_0x452002(-0x165,-0x175))/0x3*(parseInt(_0x267ae7(0x13c,0x135))/0x4)+parseInt(_0x267ae7(0x12c,0x127))/0x5*(parseInt(_0x267ae7(0x122,0x12a))/0x6)+-parseInt(_0x267ae7(0x115,0x119))/0x7+parseInt(_0x452002(-0x16a,-0x15f))/0x8+-parseInt(_0x267ae7(0x139,0x134))/0x9*(-parseInt(_0x452002(-0x15d,-0x162))/0xa)+-parseInt(_0x452002(-0x167,-0x16c))/0xb;if(_0x282854===_0x4f557e)break;else _0x4b3bf7['push'](_0x4b3bf7['shift']());}catch(_0x4015e3){_0x4b3bf7['push'](_0x4b3bf7['shift']());}}}(_0x3d8d,0x7f1b6));export function flushInjectionEffectiveness(_0x239984,_0x5c3ff4,_0x2776b2){const _0x450722={'MxSiK':function(_0x45bf13,_0x38a866){return _0x45bf13/_0x38a866;},'OnYZh':function(_0x27a666,_0x16d0e5){return _0x27a666>_0x16d0e5;},'WeVGU':'Injection\x20'+_0x599964(0x79,0x80)+_0x599964(0x68,0x73)+_0x599964(0x79,0x78)},_0x1ea792={'updated':0x0,'reinforceTargets':[]};function _0x2a2db6(_0x23c924,_0x1ec20d){return _0x1381(_0x23c924-0x2f1,_0x1ec20d);}if(!_0x5c3ff4)return _0x1ea792;function _0x599964(_0x21994f,_0x4c5171){return _0x1381(_0x4c5171- -0x155,_0x21994f);}try{const _0xb7fe41=_0x239984[_0x599964(0x79,0x6f)+'ctions'](_0x5c3ff4);for(const _0x3e1c49 of _0xb7fe41){const _0x4d45d2=_0x3e1c49[_0x599964(0x7b,0x7e)+_0x2a2db6(0x4bd,0x4c5)]>0x0?_0x450722[_0x2a2db6(0x4c8,0x4c7)](_0x3e1c49[_0x599964(0x83,0x74)],_0x3e1c49['totalInjec'+_0x599964(0x86,0x77)]):0x0;_0x239984[_0x599964(0x71,0x67)+_0x599964(0x89,0x7d)+_0x599964(0x76,0x6d)](_0x3e1c49['id'],_0x4d45d2,_0x3e1c49['hitCount']),_0x1ea792['updated']++,_0x3e1c49[_0x599964(0x71,0x74)]>0x0&&_0x2776b2&&_0x2776b2[_0x599964(0x75,0x71)]('Injection\x20'+_0x2a2db6(0x4c6,0x4c1)+_0x2a2db6(0x4c1,0x4cc),{'id':_0x3e1c49['id'],'effectiveness':_0x4d45d2['toFixed'](0x2),'hits':_0x3e1c49[_0x599964(0x66,0x74)]}),_0x450722[_0x2a2db6(0x4c7,0x4ca)](_0x4d45d2,0.3)&&_0x1ea792[_0x599964(0x74,0x6a)+_0x599964(0x6e,0x66)][_0x2a2db6(0x4b4,0x4bc)](..._0x3e1c49[_0x2a2db6(0x4ab,0x4ae)+_0x599964(0x62,0x70)]);}}catch(_0x2191cd){_0x2776b2&&_0x2776b2['warn'](_0x450722[_0x2a2db6(0x4bb,0x4ae)],{'error':_0x2191cd instanceof Error?_0x2191cd[_0x2a2db6(0x4b2,0x4ba)]:String(_0x2191cd)});}return _0x1ea792;}
@@ -1,18 +1,17 @@
1
1
  /**
2
2
  * Memory Quality Scorer
3
3
  *
4
- * 메모리 품질 점수를 계산합니다.
5
- * - relevance: 접근 횟수 × 최근성 가중 (recencyBoost)
6
- * - freshness: 시간 기반 감쇠 (exponential decay)
7
- * - usage: 일평균 접근 빈도 정규화 (createdAt 대비)
8
- * - overall: 가중 평균 (0.4 * relevance + 0.3 * freshness + 0.3 * usage)
4
+ * ADR-017 L3: Dynamic Decay (FadeMem 패턴)
5
+ * - λ_eff = λ_base / (1 + ln(accessCount + 1))
6
+ * - 접근 많을수록 감쇠 느려짐 — Ebbinghaus spaced repetition 모사
7
+ * - Type별 λ_base 차등: FACT(0.005), EXP(0.03), PROC(0.001), EP(0.05)
9
8
  */
10
9
  import type { Memory, MemoryQuality, LifecycleConfig } from '../types/index.js';
11
10
  /**
12
11
  * 메모리의 품질 점수를 계산합니다.
13
12
  *
14
13
  * @param memory - 평가할 메모리
15
- * @param _config - 라이프사이클 설정 (현재는 미사용, 향후 확장용)
14
+ * @param _config - 라이프사이클 설정
16
15
  * @returns 품질 점수 객체 (0~1 범위)
17
16
  */
18
17
  export declare function scoreQuality(memory: Memory, _config: LifecycleConfig): MemoryQuality;
@@ -1,46 +1 @@
1
- /**
2
- * Memory Quality Scorer
3
- *
4
- * 메모리 품질 점수를 계산합니다.
5
- * - relevance: 접근 횟수 × 최근성 가중 (recencyBoost)
6
- * - freshness: 시간 기반 감쇠 (exponential decay)
7
- * - usage: 일평균 접근 빈도 정규화 (createdAt 대비)
8
- * - overall: 가중 평균 (0.4 * relevance + 0.3 * freshness + 0.3 * usage)
9
- */
10
- /**
11
- * 메모리의 품질 점수를 계산합니다.
12
- *
13
- * @param memory - 평가할 메모리
14
- * @param _config - 라이프사이클 설정 (현재는 미사용, 향후 확장용)
15
- * @returns 품질 점수 객체 (0~1 범위)
16
- */
17
- export function scoreQuality(memory, _config) {
18
- const now = new Date();
19
- // 1. Relevance: 접근 횟수 + 최근성 가중 (최근 접근일수록 높은 가중)
20
- const recencyBoost = memory.lastAccessedAt
21
- ? Math.exp(-0.01 * ((now.getTime() - new Date(memory.lastAccessedAt).getTime()) / (1000 * 60 * 60 * 24)))
22
- : 0.5;
23
- const relevance = Math.min(1.0, (memory.accessCount / 10) * recencyBoost);
24
- // 2. Freshness: 시간 기반 감쇠 (exponential decay)
25
- // freshness = exp(-lambda * daysSinceUpdate)
26
- // lambda = 0.01 (100일 후 약 0.37)
27
- const lambda = 0.01;
28
- const updatedAt = new Date(memory.updatedAt);
29
- const daysSinceUpdate = (now.getTime() - updatedAt.getTime()) / (1000 * 60 * 60 * 24);
30
- const freshness = Math.exp(-lambda * daysSinceUpdate);
31
- // 3. Usage: 일평균 접근 빈도 기반 (생성일 대비 정규화)
32
- // 하루 0.5회 접근이면 1.0 (= 정상적 활용 수준)
33
- const daysAlive = Math.max(1, (now.getTime() - new Date(memory.createdAt).getTime()) / (1000 * 60 * 60 * 24));
34
- const accessRate = memory.accessCount / daysAlive;
35
- const usage = Math.min(1.0, accessRate / 0.5);
36
- // 4. Overall: 가중 평균
37
- // 40% relevance + 30% freshness + 30% usage
38
- const overall = 0.4 * relevance + 0.3 * freshness + 0.3 * usage;
39
- return {
40
- relevance,
41
- freshness,
42
- usage,
43
- overall,
44
- };
45
- }
46
- //# sourceMappingURL=quality-scorer.js.map
1
+ function _0x1b5f(_0x59b219,_0x340786){_0x59b219=_0x59b219-0xe7;const _0x30173e=_0x3017();let _0x1b5fc0=_0x30173e[_0x59b219];if(_0x1b5f['alQEVq']===undefined){var _0x1fc203=function(_0x186d58){const _0xfd181='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3d98b3='',_0x161d84='';for(let _0xf77275=0x0,_0x967428,_0x207775,_0x1ef394=0x0;_0x207775=_0x186d58['charAt'](_0x1ef394++);~_0x207775&&(_0x967428=_0xf77275%0x4?_0x967428*0x40+_0x207775:_0x207775,_0xf77275++%0x4)?_0x3d98b3+=String['fromCharCode'](0xff&_0x967428>>(-0x2*_0xf77275&0x6)):0x0){_0x207775=_0xfd181['indexOf'](_0x207775);}for(let _0x2d02e5=0x0,_0x504b58=_0x3d98b3['length'];_0x2d02e5<_0x504b58;_0x2d02e5++){_0x161d84+='%'+('00'+_0x3d98b3['charCodeAt'](_0x2d02e5)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x161d84);};_0x1b5f['ouaUEB']=_0x1fc203,_0x1b5f['HJMpDN']={},_0x1b5f['alQEVq']=!![];}const _0x5f121f=_0x30173e[0x0],_0x53ca6a=_0x59b219+_0x5f121f,_0x28f765=_0x1b5f['HJMpDN'][_0x53ca6a];return!_0x28f765?(_0x1b5fc0=_0x1b5f['ouaUEB'](_0x1b5fc0),_0x1b5f['HJMpDN'][_0x53ca6a]=_0x1b5fc0):_0x1b5fc0=_0x28f765,_0x1b5fc0;}(function(_0x26a3d6,_0x20c819){const _0x2bf0c8=_0x26a3d6();function _0x3c1a49(_0x377732,_0x37a70f){return _0x1b5f(_0x37a70f- -0x2a9,_0x377732);}function _0x570a94(_0xa5a266,_0x31ab1c){return _0x1b5f(_0x31ab1c-0x323,_0xa5a266);}while(!![]){try{const _0x8733ab=-parseInt(_0x3c1a49(-0x1b5,-0x1b2))/0x1+parseInt(_0x570a94(0x406,0x40d))/0x2+-parseInt(_0x570a94(0x41a,0x41b))/0x3*(-parseInt(_0x570a94(0x42f,0x423))/0x4)+-parseInt(_0x3c1a49(-0x1a3,-0x1ae))/0x5+-parseInt(_0x3c1a49(-0x1c0,-0x1ba))/0x6*(parseInt(_0x570a94(0x41a,0x417))/0x7)+parseInt(_0x570a94(0x41f,0x426))/0x8*(parseInt(_0x3c1a49(-0x1bb,-0x1c1))/0x9)+-parseInt(_0x3c1a49(-0x1b3,-0x1ab))/0xa;if(_0x8733ab===_0x20c819)break;else _0x2bf0c8['push'](_0x2bf0c8['shift']());}catch(_0x73898e){_0x2bf0c8['push'](_0x2bf0c8['shift']());}}}(_0x3017,0xd28ef));const LAMBDA_BASE={'fact':0.005,'experience':0.03,'procedure':0.001,'episode':0.05},DEFAULT_LAMBDA=0.01;export function scoreQuality(_0x580250,_0x4f45de){const _0x4fa871={'Qzham':function(_0x2bb21d,_0x47f1cf){return _0x2bb21d-_0x47f1cf;},'jWHdJ':function(_0x3f3eb9,_0x1b71e3){return _0x3f3eb9*_0x1b71e3;},'XxkYV':function(_0x4c9eb5,_0x43eaf0){return _0x4c9eb5*_0x43eaf0;},'mfBQC':function(_0x1237c5,_0x3fb368){return _0x1237c5+_0x3fb368;},'MZJNx':function(_0x54a3df,_0x34a2c5){return _0x54a3df+_0x34a2c5;},'SkDyi':function(_0x2b4296,_0x4e2b5a){return _0x2b4296/_0x4e2b5a;},'ZqOsV':function(_0x1abfd5,_0x2ca6e3){return _0x1abfd5-_0x2ca6e3;},'RBBYv':function(_0x432e28,_0x18abef){return _0x432e28+_0x18abef;},'UFpiN':function(_0x1036f7,_0x3521d0){return _0x1036f7+_0x3521d0;},'veBdZ':function(_0x1ed76c,_0x3e1cf1){return _0x1ed76c!==_0x3e1cf1;}};function _0xf09e3a(_0x4924fc,_0x352d39){return _0x1b5f(_0x4924fc- -0xe4,_0x352d39);}const _0xeeaa2=new Date(),_0x6cd360=_0x580250[_0x18c7d5(0x114,0x10a)+'edAt']?Math[_0x18c7d5(0xf8,0x102)](-0.01*(_0x4fa871[_0xf09e3a(0x3,-0xc)](_0xeeaa2[_0x18c7d5(0x110,0x109)](),new Date(_0x580250[_0xf09e3a(0xf,0x1)+'edAt'])[_0x18c7d5(0x10e,0x109)]())/_0x4fa871[_0xf09e3a(0x1e,0x1b)](_0x4fa871[_0x18c7d5(0x10b,0x113)](0x3e8,0x3c)*0x3c,0x18))):0.5;function _0x18c7d5(_0x431db4,_0x3d43d3){return _0x1b5f(_0x3d43d3-0x17,_0x431db4);}const _0x4f1cad=Math['min'](0x1,_0x580250[_0xf09e3a(0x11,0x12)+'t']/0xa*_0x6cd360),_0xa570d6=_0x580250['memoryType']?LAMBDA_BASE[_0x580250[_0x18c7d5(0x10e,0x108)]]:DEFAULT_LAMBDA,_0x2aec39=_0xa570d6/_0x4fa871[_0xf09e3a(0x19,0x26)](0x1,Math[_0x18c7d5(0x120,0x118)](_0x4fa871[_0xf09e3a(0x12,0x8)](_0x580250[_0xf09e3a(0x11,0x18)+'t'],0x1))),_0x1feb4b=new Date(_0x580250[_0xf09e3a(0x1b,0x26)]),_0x3dc89a=_0x4fa871['SkDyi'](_0x4fa871[_0x18c7d5(0xff,0x103)](_0xeeaa2[_0x18c7d5(0x106,0x109)](),_0x1feb4b[_0xf09e3a(0xe,0x8)]()),_0x4fa871[_0xf09e3a(0x1e,0x23)](0x3e8,0x3c)*0x3c*0x18),_0xd2abd2=Math[_0x18c7d5(0x107,0x102)](-_0x2aec39*_0x3dc89a),_0x35771d=Math[_0x18c7d5(0x11f,0x111)](0x1,_0x4fa871[_0xf09e3a(0x3,0x1)](_0xeeaa2[_0xf09e3a(0xe,0xc)](),new Date(_0x580250['createdAt'])[_0xf09e3a(0xe,0x3)]())/(0x3e8*0x3c*0x3c*0x18)),_0x541ca9=_0x4fa871['SkDyi'](_0x580250[_0x18c7d5(0x117,0x10c)+'t'],_0x35771d),_0x2a79fe=Math[_0x18c7d5(0xf6,0x105)](0x1,_0x4fa871[_0x18c7d5(0xfa,0x100)](_0x541ca9,0.5)),_0x2108de=_0x4fa871[_0x18c7d5(0x102,0x110)](_0x4fa871[_0xf09e3a(0xc,0xa)](_0x4fa871[_0x18c7d5(0x10c,0x119)](0.4,_0x4f1cad),0.3*_0xd2abd2),_0x4fa871['jWHdJ'](0.3,_0x2a79fe)),_0x2eec4a=_0x580250[_0xf09e3a(0x9,0x8)+'re']!==undefined&&_0x4fa871['veBdZ'](_0x580250['qualitySco'+'re'],null)?0.7*_0x580250[_0x18c7d5(0xf6,0x104)+'re']+0.3*_0x2108de:_0x2108de;return{'relevance':_0x4f1cad,'freshness':_0xd2abd2,'usage':_0x2a79fe,'overall':_0x2eec4a};}function _0x3017(){const _0x5a62f1=['mZe1nty4nevpqu90vq','zxHW','wNfpC1y','CxvHBgL0EvnJBW','BwLU','nZm1nZjmCg9bC1G','vuzWAu4','BwvTB3j5vhLWzq','z2v0vgLTzq','BgfZDefJy2vZCW','mZK5rgnnwwPv','ywnJzxnZq291BG','tvPktNG','mtiXotaZvwDhtMfI','m211tMDrDG','uKjcwxy','Bwf4','nZa3nJa1ruvXwuzO','whHRwvy','Bwzcuum','mtG2mZq4mdbbvvHxwxq','DxbKyxrLzef0','nJC1mdi0ofLYtvriwq','Bg9N','ALDizeO','mZm4mZa0ohDgEKLHAG','uxPOyw0','owruChvIrG','u2TeEwK'];_0x3017=function(){return _0x5a62f1;};return _0x3017();}
@@ -1,246 +1 @@
1
- /**
2
- * Memory Tiering Engine
3
- *
4
- * 메모리 접근 패턴 기반 티어링 시스템:
5
- * - hot: 최근 hotThresholdDays 이내 접근 OR tier='core'
6
- * - warm: 최근 warmThresholdDays 이내 접근 OR tier='active'
7
- * - cold: 나머지 (오래된 메모리)
8
- *
9
- * Cold 메모리는 zlib 압축으로 저장 공간 절약.
10
- */
11
- import { gzipSync, gunzipSync } from 'node:zlib';
12
- const COMPRESSED_PREFIX = 'COMPRESSED:';
13
- /**
14
- * 메모리 접근 패턴 기반 티어 결정
15
- *
16
- * 규칙:
17
- * - tier='working' (core) → 항상 hot (강등 불가)
18
- * - tier='episodic' (active) → 접근 시간과 관계없이 warm 이상
19
- * - 나머지: lastAccessedAt 기준 hot/warm/cold 분류
20
- *
21
- * @param memory - 메모리 객체
22
- * @param config - 티어링 설정
23
- * @returns 결정된 storage tier
24
- */
25
- export function determineTier(memory, config) {
26
- // core 티어는 항상 hot
27
- if (memory.tier === 'working') {
28
- return 'hot';
29
- }
30
- // episodic 티어는 최소 warm 보장 (접근 시간 무관)
31
- if (memory.tier === 'episodic') {
32
- // 단, 접근 기록이 있으면 hot 승격 가능
33
- if (memory.lastAccessedAt) {
34
- const daysSinceAccess = getDaysSince(memory.lastAccessedAt);
35
- if (daysSinceAccess <= config.hotThresholdDays) {
36
- return 'hot';
37
- }
38
- }
39
- return 'warm';
40
- }
41
- // semantic 티어: 접근 패턴 기반
42
- if (!memory.lastAccessedAt) {
43
- // 접근 기록 없음 → createdAt 기준
44
- const daysSinceCreation = getDaysSince(memory.createdAt);
45
- if (daysSinceCreation <= config.hotThresholdDays) {
46
- return 'hot';
47
- }
48
- if (daysSinceCreation <= config.warmThresholdDays) {
49
- return 'warm';
50
- }
51
- return 'cold';
52
- }
53
- const daysSinceAccess = getDaysSince(memory.lastAccessedAt);
54
- if (daysSinceAccess <= config.hotThresholdDays) {
55
- return 'hot';
56
- }
57
- if (daysSinceAccess <= config.warmThresholdDays) {
58
- return 'warm';
59
- }
60
- return 'cold';
61
- }
62
- /**
63
- * 전체 메모리 티어 재계산 및 재배치
64
- *
65
- * 1. 모든 메모리의 적절한 티어 결정
66
- * 2. 현재 티어와 비교하여 승격/강등 카운트
67
- * 3. cold 티어 메모리 압축 (설정 활성화 시)
68
- * 4. DB 업데이트
69
- *
70
- * @param db - 메모리 데이터베이스
71
- * @param config - 티어링 설정
72
- * @returns 티어링 결과 (승격/강등/압축 수)
73
- */
74
- export function rebalanceTiers(db, config) {
75
- if (!config.enabled) {
76
- return { promoted: 0, demoted: 0, compressed: 0, totalProcessed: 0 };
77
- }
78
- // 배치 처리: 1000개씩 분할 조회 (offset 지원)
79
- const BATCH_SIZE = 1000;
80
- const allMemories = [];
81
- let offset = 0;
82
- while (true) {
83
- const batch = db.listMemories({ limit: BATCH_SIZE, offset });
84
- allMemories.push(...batch);
85
- if (batch.length < BATCH_SIZE)
86
- break;
87
- offset += BATCH_SIZE;
88
- }
89
- let promoted = 0;
90
- let demoted = 0;
91
- let compressed = 0;
92
- for (const memory of allMemories) {
93
- const currentTier = getStorageTier(memory);
94
- const targetTier = determineTier(memory, config);
95
- // 티어 변경 필요 여부 확인
96
- if (currentTier === targetTier) {
97
- // 티어 변경 없음, 압축 상태만 확인
98
- if (targetTier === 'cold' && config.coldCompressionEnabled) {
99
- if (!isCompressed(memory.content)) {
100
- const compressedContent = compressContent(memory.content);
101
- db.updateMemory(memory.id, { content: compressedContent });
102
- compressed++;
103
- }
104
- }
105
- continue;
106
- }
107
- // 티어 변경 필요
108
- const tierRank = { hot: 2, warm: 1, cold: 0 };
109
- if (tierRank[targetTier] > tierRank[currentTier]) {
110
- promoted++;
111
- }
112
- else {
113
- demoted++;
114
- }
115
- // content 압축/해제 처리
116
- let newContent = memory.content;
117
- if (targetTier === 'cold' && config.coldCompressionEnabled) {
118
- // cold로 강등 → 압축
119
- if (!isCompressed(memory.content)) {
120
- newContent = compressContent(memory.content);
121
- compressed++;
122
- }
123
- }
124
- else if (currentTier === 'cold' && isCompressed(memory.content)) {
125
- // cold에서 승격 → 압축 해제
126
- newContent = decompressContent(memory.content);
127
- }
128
- // 메타데이터 업데이트 (storage tier는 메타데이터로 추적)
129
- // Memory.tier는 semantic tier이므로 변경하지 않음
130
- // storage tier는 별도 필드나 tags로 관리 필요
131
- // 현재 구현에서는 content만 압축/해제 처리
132
- if (newContent !== memory.content) {
133
- db.updateMemory(memory.id, { content: newContent });
134
- }
135
- }
136
- return {
137
- promoted,
138
- demoted,
139
- compressed,
140
- totalProcessed: allMemories.length,
141
- };
142
- }
143
- /**
144
- * 메모리 접근 시 자동 승격
145
- *
146
- * autoPromote 설정이 활성화되어 있고,
147
- * 현재 cold/warm 티어인 메모리를 hot으로 승격합니다.
148
- *
149
- * @param db - 메모리 데이터베이스
150
- * @param memoryId - 메모리 ID
151
- * @param config - 티어링 설정
152
- */
153
- export function promoteOnAccess(db, memoryId, config) {
154
- if (!config.enabled || !config.autoPromote) {
155
- return;
156
- }
157
- // DB에서 조회하지 않고, 이미 조회된 메모리를 받아 처리하는 것이 효율적이지만
158
- // 현재 API 구조상 id만 받으므로 재조회 필요
159
- const memory = db.getMemory(memoryId);
160
- if (!memory) {
161
- return;
162
- }
163
- const currentTier = getStorageTier(memory);
164
- const targetTier = determineTier(memory, config);
165
- // hot으로 승격 필요한 경우
166
- if (targetTier === 'hot' && currentTier !== 'hot') {
167
- // 압축 해제
168
- if (isCompressed(memory.content)) {
169
- const decompressedContent = decompressContent(memory.content);
170
- db.updateMemory(memoryId, { content: decompressedContent });
171
- }
172
- }
173
- // TODO: Parent-Child 동시 tier 승격 미구현 — Parent와 Children이 다른 tier를 가질 수 있음 (P2-M5)
174
- }
175
- // ============================
176
- // Helper Functions
177
- // ============================
178
- /**
179
- * 메모리의 현재 storage tier 추정
180
- * (실제로는 별도 필드가 필요하지만, 현재는 압축 여부로 판단)
181
- */
182
- function getStorageTier(memory) {
183
- // core는 항상 hot
184
- if (memory.tier === 'working') {
185
- return 'hot';
186
- }
187
- // 압축되어 있으면 cold
188
- if (isCompressed(memory.content)) {
189
- return 'cold';
190
- }
191
- // episodic은 기본 warm
192
- if (memory.tier === 'episodic') {
193
- return 'warm';
194
- }
195
- // semantic은 접근 패턴 기반 추정
196
- if (!memory.lastAccessedAt) {
197
- const daysSinceCreation = getDaysSince(memory.createdAt);
198
- if (daysSinceCreation <= 7)
199
- return 'hot';
200
- if (daysSinceCreation <= 30)
201
- return 'warm';
202
- return 'cold';
203
- }
204
- const daysSinceAccess = getDaysSince(memory.lastAccessedAt);
205
- if (daysSinceAccess <= 7)
206
- return 'hot';
207
- if (daysSinceAccess <= 30)
208
- return 'warm';
209
- return 'cold';
210
- }
211
- /**
212
- * ISO 8601 문자열에서 현재까지의 일수 계산
213
- */
214
- function getDaysSince(isoDate) {
215
- const date = new Date(isoDate);
216
- const now = new Date();
217
- const diffMs = now.getTime() - date.getTime();
218
- return Math.floor(diffMs / (1000 * 60 * 60 * 24));
219
- }
220
- /**
221
- * content가 압축되어 있는지 확인
222
- */
223
- function isCompressed(content) {
224
- return content.startsWith(COMPRESSED_PREFIX);
225
- }
226
- /**
227
- * content 압축 (zlib gzip)
228
- */
229
- function compressContent(content) {
230
- const buffer = Buffer.from(content, 'utf-8');
231
- const compressed = gzipSync(buffer);
232
- return COMPRESSED_PREFIX + compressed.toString('base64');
233
- }
234
- /**
235
- * content 압축 해제
236
- */
237
- function decompressContent(content) {
238
- if (!isCompressed(content)) {
239
- return content;
240
- }
241
- const base64Data = content.slice(COMPRESSED_PREFIX.length);
242
- const compressed = Buffer.from(base64Data, 'base64');
243
- const decompressed = gunzipSync(compressed);
244
- return decompressed.toString('utf-8');
245
- }
246
- //# sourceMappingURL=tiering.js.map
1
+ (function(_0x29965d,_0x352153){function _0x59bb3f(_0x212b45,_0x3e37a5){return _0x23e3(_0x3e37a5- -0x21e,_0x212b45);}function _0x2b21cb(_0x300232,_0x225d1f){return _0x23e3(_0x300232-0x372,_0x225d1f);}const _0x2a5d4d=_0x29965d();while(!![]){try{const _0x869bce=parseInt(_0x2b21cb(0x53e,0x565))/0x1+parseInt(_0x2b21cb(0x51c,0x4f6))/0x2*(-parseInt(_0x2b21cb(0x52f,0x534))/0x3)+parseInt(_0x59bb3f(-0x98,-0x76))/0x4*(parseInt(_0x2b21cb(0x53a,0x561))/0x5)+-parseInt(_0x2b21cb(0x556,0x57b))/0x6*(parseInt(_0x59bb3f(-0x1a,-0x40))/0x7)+parseInt(_0x59bb3f(-0x70,-0x6b))/0x8*(-parseInt(_0x59bb3f(-0x40,-0x41))/0x9)+-parseInt(_0x2b21cb(0x52b,0x509))/0xa+parseInt(_0x59bb3f(-0x31,-0x4a))/0xb*(parseInt(_0x2b21cb(0x533,0x50f))/0xc);if(_0x869bce===_0x352153)break;else _0x2a5d4d['push'](_0x2a5d4d['shift']());}catch(_0x431f06){_0x2a5d4d['push'](_0x2a5d4d['shift']());}}}(_0x53e4,0x5371a));function _0x23e3(_0x1de0f7,_0x4fd818){_0x1de0f7=_0x1de0f7-0x1a2;const _0x53e4e7=_0x53e4();let _0x23e3f1=_0x53e4e7[_0x1de0f7];if(_0x23e3['bpasQX']===undefined){var _0x28fba7=function(_0x5f22ed){const _0x41a233='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x26b4f6='',_0x4bd549='';for(let _0x395b03=0x0,_0x1a2efd,_0x3a9721,_0x588928=0x0;_0x3a9721=_0x5f22ed['charAt'](_0x588928++);~_0x3a9721&&(_0x1a2efd=_0x395b03%0x4?_0x1a2efd*0x40+_0x3a9721:_0x3a9721,_0x395b03++%0x4)?_0x26b4f6+=String['fromCharCode'](0xff&_0x1a2efd>>(-0x2*_0x395b03&0x6)):0x0){_0x3a9721=_0x41a233['indexOf'](_0x3a9721);}for(let _0x407326=0x0,_0x36c472=_0x26b4f6['length'];_0x407326<_0x36c472;_0x407326++){_0x4bd549+='%'+('00'+_0x26b4f6['charCodeAt'](_0x407326)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x4bd549);};_0x23e3['pAKkRU']=_0x28fba7,_0x23e3['dAimlT']={},_0x23e3['bpasQX']=!![];}const _0x262d97=_0x53e4e7[0x0],_0x2b861a=_0x1de0f7+_0x262d97,_0x50f446=_0x23e3['dAimlT'][_0x2b861a];return!_0x50f446?(_0x23e3f1=_0x23e3['pAKkRU'](_0x23e3f1),_0x23e3['dAimlT'][_0x2b861a]=_0x23e3f1):_0x23e3f1=_0x50f446,_0x23e3f1;}import{gzipSync,gunzipSync}from'node:zlib';const COMPRESSED_PREFIX=_0x33b21f(0x1b4,0x1a1)+':';export function determineTier(_0x285556,_0x26b1ad){const _0x5973bf={'fYNtZ':'hot','DMDPk':'episodic','oZQaK':function(_0x26d716,_0xb3cbb3){return _0x26d716!==_0xb3cbb3;},'AXZil':'WrHUO','XlSff':_0x4a9b91(0xc0,0xd1),'LWWbg':function(_0x492027,_0x3573bc){return _0x492027(_0x3573bc);},'FKMXw':'cold','Bcqeg':function(_0x4ebea3,_0x56d1fe){return _0x4ebea3<=_0x56d1fe;},'epQzo':function(_0x3bcd9c,_0x2330ac){return _0x3bcd9c===_0x2330ac;},'AyLcL':_0x2022ca(0x68,0x73),'avIdF':function(_0x47463e,_0x526b4a){return _0x47463e<=_0x526b4a;}};if(_0x285556['tier']==='working')return _0x5973bf[_0x4a9b91(0xa8,0xc3)];if(_0x285556[_0x2022ca(0x8f,0xb1)]===_0x5973bf[_0x4a9b91(0x8a,0x69)]){if(_0x285556[_0x2022ca(0xd0,0xaa)+_0x2022ca(0x8c,0x87)]){if(_0x5973bf['oZQaK'](_0x5973bf[_0x2022ca(0xb7,0x93)],_0x4a9b91(0xbe,0xb8))){const _0x2626db=getDaysSince(_0x285556[_0x4a9b91(0xc5,0xe5)+_0x2022ca(0x7f,0x87)]);if(_0x2626db<=_0x26b1ad[_0x2022ca(0xbd,0xa9)+_0x4a9b91(0xd1,0xed)])return'hot';}else{const _0x4fdaa5=_0x4f592b(_0x51f7b3[_0x2022ca(0x88,0xab)]);_0x3a17c3[_0x4a9b91(0xa4,0xad)+'ry'](_0x31c443,{'content':_0x4fdaa5});}}return _0x5973bf['XlSff'];}function _0x2022ca(_0x5940ba,_0x7aeca6){return _0x33b21f(_0x5940ba,_0x7aeca6- -0x108);}if(!_0x285556['lastAccess'+_0x4a9b91(0xa2,0xb9)]){const _0x161997=_0x5973bf[_0x2022ca(0x80,0x8e)](getDaysSince,_0x285556[_0x2022ca(0xab,0x91)]);if(_0x161997<=_0x26b1ad[_0x4a9b91(0xc4,0xa8)+_0x4a9b91(0xd1,0xe6)])return'hot';if(_0x161997<=_0x26b1ad[_0x2022ca(0x5c,0x74)+'oldDays'])return'warm';return _0x5973bf[_0x2022ca(0x86,0x75)];}const _0x277327=getDaysSince(_0x285556[_0x4a9b91(0xc5,0xb7)+'edAt']);if(_0x5973bf['Bcqeg'](_0x277327,_0x26b1ad['hotThresho'+'ldDays']))return _0x5973bf[_0x4a9b91(0xb2,0xd2)](_0x5973bf['AyLcL'],_0x5973bf[_0x2022ca(0xc0,0x9b)])?_0x5973bf[_0x4a9b91(0xa8,0xa8)]:_0x5973bf['fYNtZ'];if(_0x5973bf[_0x4a9b91(0xba,0xc3)](_0x277327,_0x26b1ad[_0x4a9b91(0x8f,0x68)+_0x2022ca(0x81,0x72)]))return _0x5973bf[_0x4a9b91(0x94,0xa7)];function _0x4a9b91(_0x24fad6,_0x9657e0){return _0x33b21f(_0x9657e0,_0x24fad6- -0xed);}return _0x5973bf[_0x2022ca(0x94,0x75)];}export function rebalanceTiers(_0x5cc18d,_0xefb52c){const _0x4e2a14={'FwyMk':function(_0x11b39e,_0x5b482a){return _0x11b39e<_0x5b482a;},'mbWZn':function(_0xcda325,_0x3356fc){return _0xcda325(_0x3356fc);},'ywTfJ':function(_0x3ba57b,_0x249bf9){return _0x3ba57b===_0x249bf9;},'zjVgS':_0x158355(0x427,0x421),'QdDTU':'xaiZl','kfqFS':function(_0x1f681e,_0x14cfdf){return _0x1f681e>_0x14cfdf;},'Slbga':function(_0x109414,_0x2c443d){return _0x109414!==_0x2c443d;},'PvqRc':function(_0x25d96b,_0x29ce20){return _0x25d96b(_0x29ce20);}};if(!_0xefb52c[_0x4463b(0x53a,0x54f)])return{'promoted':0x0,'demoted':0x0,'compressed':0x0,'totalProcessed':0x0};const _0x2c6cf4=0x3e8,_0x480a3c=[];let _0xbbbe06=0x0;while(!![]){const _0x25610b=_0x5cc18d[_0x4463b(0x532,0x514)+'es']({'limit':_0x2c6cf4,'offset':_0xbbbe06});_0x480a3c[_0x158355(0x442,0x464)](..._0x25610b);if(_0x4e2a14[_0x4463b(0x549,0x552)](_0x25610b[_0x4463b(0x4fa,0x51b)],_0x2c6cf4))break;_0xbbbe06+=_0x2c6cf4;}let _0x301ba0=0x0;function _0x158355(_0x2b8256,_0x4919f3){return _0x33b21f(_0x4919f3,_0x2b8256-0x2a4);}let _0x277ef3=0x0;function _0x4463b(_0x2ba27a,_0x26ef43){return _0x33b21f(_0x2ba27a,_0x26ef43-0x39b);}let _0x282827=0x0;for(const _0x3c2da9 of _0x480a3c){const _0x301357=_0x4e2a14[_0x158355(0x415,0x435)](getStorageTier,_0x3c2da9),_0x4d44ec=determineTier(_0x3c2da9,_0xefb52c);if(_0x301357===_0x4d44ec){if(_0x4e2a14['ywTfJ'](_0x4d44ec,_0x4e2a14['zjVgS'])&&_0xefb52c[_0x158355(0x45c,0x473)+_0x4463b(0x525,0x509)+'ed']){if(!isCompressed(_0x3c2da9[_0x158355(0x457,0x454)])){if('xaiZl'!==_0x4e2a14[_0x4463b(0x52a,0x50d)])_0x5e6597=_0x125fb5(_0x515d0a[_0x158355(0x457,0x46b)]);else{const _0x227491=_0x4e2a14[_0x158355(0x415,0x42d)](compressContent,_0x3c2da9[_0x4463b(0x533,0x54e)]);_0x5cc18d[_0x158355(0x435,0x436)+'ry'](_0x3c2da9['id'],{'content':_0x227491}),_0x282827++;}}}continue;}const _0x2b9a01={'hot':0x2,'warm':0x1,'cold':0x0};if(_0x4e2a14[_0x158355(0x45f,0x473)](_0x2b9a01[_0x4d44ec],_0x2b9a01[_0x301357]))_0x301ba0++;else{if(_0x4e2a14[_0x4463b(0x566,0x543)](_0x4463b(0x543,0x557),_0x158355(0x460,0x45b)))return{'promoted':0x0,'demoted':0x0,'compressed':0x0,'totalProcessed':0x0};else _0x277ef3++;}let _0x1148e5=_0x3c2da9[_0x158355(0x457,0x46a)];if(_0x4d44ec===_0x4e2a14[_0x4463b(0x52e,0x519)]&&_0xefb52c[_0x4463b(0x53f,0x553)+_0x4463b(0x4e7,0x509)+'ed'])!_0x4e2a14[_0x158355(0x436,0x419)](isCompressed,_0x3c2da9['content'])&&(_0x1148e5=compressContent(_0x3c2da9[_0x4463b(0x529,0x54e)]),_0x282827++);else _0x301357===_0x158355(0x427,0x41f)&&_0x4e2a14[_0x158355(0x415,0x42c)](isCompressed,_0x3c2da9[_0x158355(0x457,0x457)])&&(_0x1148e5=_0x4e2a14[_0x158355(0x415,0x405)](decompressContent,_0x3c2da9['content']));_0x1148e5!==_0x3c2da9[_0x158355(0x457,0x46c)]&&_0x5cc18d['updateMemo'+'ry'](_0x3c2da9['id'],{'content':_0x1148e5});}return{'promoted':_0x301ba0,'demoted':_0x277ef3,'compressed':_0x282827,'totalProcessed':_0x480a3c[_0x4463b(0x50f,0x51b)]};}export function promoteOnAccess(_0x507e2e,_0x1f2cbb,_0x2a6254){function _0x56e1dd(_0x20cfa8,_0x2b2758){return _0x33b21f(_0x2b2758,_0x20cfa8- -0x2d2);}const _0x35784c={'PwiqO':function(_0x5cb66f,_0x4c59bf){return _0x5cb66f(_0x4c59bf);},'NyIgI':_0x19c86d(0xe3,0xc8),'qDGDg':function(_0x43f282,_0x517412){return _0x43f282(_0x517412);}};if(!_0x2a6254[_0x19c86d(0xd4,0xc7)]||!_0x2a6254[_0x19c86d(0xc4,0xd0)+'e'])return;const _0x28750d=_0x507e2e[_0x19c86d(0xb1,0xc1)](_0x1f2cbb);function _0x19c86d(_0x50e243,_0x4bf080){return _0x33b21f(_0x50e243,_0x4bf080- -0xed);}if(!_0x28750d)return;const _0x7d209d=_0x35784c[_0x19c86d(0xdc,0xb5)](getStorageTier,_0x28750d),_0x2c3496=determineTier(_0x28750d,_0x2a6254);if(_0x2c3496===_0x35784c[_0x19c86d(0xa0,0xa3)]&&_0x7d209d!==_0x19c86d(0xb7,0xc8)){if(_0x35784c[_0x19c86d(0xc3,0xc9)](isCompressed,_0x28750d[_0x56e1dd(-0x11f,-0x124)])){const _0x28a9de=decompressContent(_0x28750d[_0x19c86d(0xeb,0xc6)]);_0x507e2e[_0x19c86d(0xa3,0xa4)+'ry'](_0x1f2cbb,{'content':_0x28a9de});}}}function getStorageTier(_0x23084f){const _0x1a039f={'aoCcP':_0x19a4ac(0x556,0x53c),'AmfMr':function(_0x58748b,_0x37d2eb){return _0x58748b(_0x37d2eb);},'gLruT':function(_0x3c712b,_0x3f3699){return _0x3c712b===_0x3f3699;},'cIevQ':_0x19a4ac(0x572,0x576),'DaOoA':function(_0x516c04,_0x420b60){return _0x516c04!==_0x420b60;},'IMPWj':_0x19a4ac(0x55a,0x536),'anfBr':_0x449547(0x3e5,0x3ee),'AEcnV':_0x449547(0x3d4,0x3fa),'qLSCJ':function(_0x37fe8d,_0x5a6232){return _0x37fe8d<=_0x5a6232;},'Qwkbf':_0x449547(0x3b3,0x3d4)};if(_0x1a039f[_0x449547(0x3ba,0x3b8)](_0x23084f['tier'],_0x1a039f[_0x19a4ac(0x554,0x552)])){if(_0x1a039f[_0x19a4ac(0x546,0x553)](_0x19a4ac(0x53f,0x53f),_0x1a039f[_0x449547(0x3b8,0x3d0)]))return _0x1a039f[_0x19a4ac(0x55f,0x55a)];else{if(!_0x1c61f0(_0x4e4a18))return _0x53d4bb;const _0x25d7f9=_0x1d3de1[_0x19a4ac(0x554,0x561)](_0x30a422[_0x449547(0x3b0,0x3c6)]),_0x12191c=_0x36e555['from'](_0x25d7f9,_0x1a039f[_0x449547(0x3d6,0x3b4)]),_0x34f1af=_0x1a039f[_0x449547(0x3a3,0x38f)](_0x48737e,_0x12191c);return _0x34f1af['toString'](_0x449547(0x3ea,0x3f3));}}if(isCompressed(_0x23084f['content'])){if('XUqcb'!==_0x1a039f[_0x449547(0x3dc,0x3e4)])return _0x449547(0x3b3,0x3b1);else{if(!_0x317963(_0x199614[_0x19a4ac(0x568,0x57a)])){const _0x33dcb8=_0x57bb21(_0x48ac1f[_0x19a4ac(0x586,0x57a)]);_0x5c8364[_0x449547(0x3c1,0x3d4)+'ry'](_0x1aead5['id'],{'content':_0x33dcb8}),_0x4c2dca++;}}}function _0x19a4ac(_0x31cd72,_0x29c7ed){return _0x33b21f(_0x31cd72,_0x29c7ed-0x3c7);}function _0x449547(_0x31f936,_0x183e74){return _0x33b21f(_0x183e74,_0x31f936-0x230);}if(_0x23084f[_0x19a4ac(0x58a,0x580)]==='episodic')return _0x449547(0x3dd,0x3b7);if(!_0x23084f['lastAccess'+_0x19a4ac(0x538,0x556)]){const _0x384e06=getDaysSince(_0x23084f['createdAt']);if(_0x1a039f[_0x449547(0x3a0,0x397)](_0x384e06,0x7))return _0x1a039f[_0x449547(0x3c3,0x39e)];if(_0x384e06<=0x1e)return _0x449547(0x3dd,0x3bf);return _0x1a039f[_0x19a4ac(0x548,0x55e)];}const _0x5b64ca=_0x1a039f['AmfMr'](getDaysSince,_0x23084f[_0x19a4ac(0x555,0x579)+_0x19a4ac(0x569,0x556)]);if(_0x5b64ca<=0x7)return _0x1a039f['anfBr'];if(_0x1a039f[_0x449547(0x3a0,0x3c7)](_0x5b64ca,0x1e))return _0x449547(0x3dd,0x3ca);return'cold';}function getDaysSince(_0x37d12f){const _0x327924={'fLrgi':function(_0x3f8d06,_0x24a829){return _0x3f8d06*_0x24a829;}},_0x2e0c76=new Date(_0x37d12f);function _0x18586c(_0x2740a3,_0x392981){return _0x33b21f(_0x392981,_0x2740a3-0x10c);}const _0x182cb3=new Date();function _0x3fd8dc(_0x58145e,_0x2a1044){return _0x33b21f(_0x2a1044,_0x58145e-0x35a);}const _0x299d0a=_0x182cb3[_0x18586c(0x293,0x2b5)]()-_0x2e0c76[_0x18586c(0x293,0x2b3)]();return Math[_0x3fd8dc(0x4e8,0x4c9)](_0x299d0a/(_0x327924[_0x18586c(0x2a8,0x289)](0x3e8,0x3c)*0x3c*0x18));}function _0x53e4(){const _0xc39cf7=['mta5nJuYzg1lsgvl','yMfZzty0','mMriugrNqG','re1eugS','s1fJte0','BgLZDe1LBw9YAq','B2XKrgf5CW','A25nzfG','D2fYBvrOCMvZAa','rKTnwhC','EMPwz1m','mZm4ntzmt3LWwNK','BgvUz3rO','wgXtzMy','C3rHCNrZv2L0Aa','y29Sza','CfLPtuW','mtG4mdC4mgDyuhHgEq','Dg9tDhjPBMC','z2v0vgLTzq','su1qv2O','mtaZodKZoxPiAvL6yG','z0XYDvq','y0LLDLe','rgfpB0e','ntu0ntG2mevPqwnZAW','zMXVB3i','zwrbDa','tNLjz0K','DxbKyxrLtwvTBW','uhzXuMm','yw5MqNi','mta1txP6s1vc','zLLoDfO','tfDxyMC','uxDRyMy','mZe1mJrWrwHgCNe','y3jLyxrLzef0','C2XPy2u','qvHAAwW','zKXYz2K','tffVywO','ChvZAa','zxbrEM8','mZnKA2TuELC','q09nufjfu1nfra','uhDPCu8','qxLmy0W','tKjfDwO','zNjVBq','yw9dy1a','yxzjzey','u2XIz2e','otm2CMLQzLjz','n2zJqNjpCW','ANrhBeW','quvJBLy','D2fYBq','z2v0twvTB3j5','D29YA2LUzW','nda2nde0mKP3vxHiDa','Ag90vgHYzxnOBW','BgfZDefJy2vZCW','y29UDgvUDa','zw5HyMXLza','Ag90','CurhrgC','rND5twS','y29SzenVBxbYzq','DgLLCG','DxrMltG','A2zXrLm','sw1Tre0','yxv0B1bYB21VDa','BgreyxLZ','C3nPB25fBMfIBa','wKvdCM8','CuXtq0O','BwjxwM4','uwrevfu','qw1Mtxi'];_0x53e4=function(){return _0xc39cf7;};return _0x53e4();}function _0x33b21f(_0x5bbc93,_0x4ab04f){return _0x23e3(_0x4ab04f- -0x34,_0x5bbc93);}function isCompressed(_0x17b3f8){function _0x26045a(_0x16b528,_0x3ec541){return _0x33b21f(_0x16b528,_0x3ec541- -0x76);}return _0x17b3f8[_0x26045a(0xed,0x10c)](COMPRESSED_PREFIX);}function compressContent(_0x5480b0){const _0x3ec274={'LQoaj':_0x4ecad4(0x3c4,0x3ec)};function _0x3cbb6c(_0xf9160b,_0x244088){return _0x33b21f(_0xf9160b,_0x244088-0xe3);}function _0x4ecad4(_0x4438ed,_0x1f5536){return _0x33b21f(_0x4438ed,_0x1f5536-0x277);}const _0x2a2712=Buffer[_0x4ecad4(0x3fc,0x41c)](_0x5480b0,_0x3cbb6c(0x2c4,0x29d)),_0x66bf1f=gzipSync(_0x2a2712);return COMPRESSED_PREFIX+_0x66bf1f['toString'](_0x3ec274[_0x4ecad4(0x414,0x414)]);}function decompressContent(_0xf60c72){const _0x262630={'pYiML':'base64'};if(!isCompressed(_0xf60c72))return _0xf60c72;const _0x2345d0=_0xf60c72[_0x54ace9(0x303,0x2fb)](COMPRESSED_PREFIX[_0x54ace9(0x2e9,0x2ec)]);function _0x54ace9(_0x36f026,_0x457263){return _0x33b21f(_0x457263,_0x36f026-0x169);}function _0x940062(_0x27bdd3,_0x3db5e3){return _0x33b21f(_0x3db5e3,_0x27bdd3- -0x6f);}const _0x3bdda5=Buffer[_0x940062(0x136,0x115)](_0x2345d0,_0x262630[_0x54ace9(0x2ed,0x314)]),_0x284f27=gunzipSync(_0x3bdda5);return _0x284f27[_0x54ace9(0x2ef,0x2f2)]('utf-8');}