memento-mcp-server 0.1.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 (555) hide show
  1. package/.cursor/rules/cache-management.mdc +171 -0
  2. package/.cursor/rules/database-schema.mdc +344 -0
  3. package/.cursor/rules/deployment.mdc +596 -0
  4. package/.cursor/rules/error-logging.mdc +298 -0
  5. package/.cursor/rules/forgetting-algorithms.mdc +426 -0
  6. package/.cursor/rules/http-server.mdc +432 -0
  7. package/.cursor/rules/hybrid-search.mdc +424 -0
  8. package/.cursor/rules/implementation.mdc +369 -0
  9. package/.cursor/rules/lightweight-embedding.mdc +178 -0
  10. package/.cursor/rules/mcp-client-development.mdc +0 -0
  11. package/.cursor/rules/mcp-server-development.mdc +0 -0
  12. package/.cursor/rules/mcp-tools-architecture.mdc +205 -0
  13. package/.cursor/rules/memento-memory-rule.mdc +8 -0
  14. package/.cursor/rules/memento-project-overview.mdc +0 -0
  15. package/.cursor/rules/memory-algorithms.mdc +502 -0
  16. package/.cursor/rules/monitoring.mdc +622 -0
  17. package/.cursor/rules/performance-alerts.mdc +537 -0
  18. package/.cursor/rules/performance-monitoring.mdc +345 -0
  19. package/.cursor/rules/performance-optimization.mdc +563 -0
  20. package/.cursor/rules/project-structure.mdc +310 -0
  21. package/.cursor/rules/testing.mdc +473 -0
  22. package/.dockerignore +15 -0
  23. package/.eslintrc.json +34 -0
  24. package/.github/ISSUE_TEMPLATE/bug_report.md +51 -0
  25. package/.github/ISSUE_TEMPLATE/feature_request.md +45 -0
  26. package/.github/ISSUE_TEMPLATE/question.md +31 -0
  27. package/.github/PULL_REQUEST_TEMPLATE.md +97 -0
  28. package/AGENTS.md +28 -0
  29. package/CHANGELOG.md +416 -0
  30. package/CODE_OF_CONDUCT.md +62 -0
  31. package/CONTRIBUTING.md +165 -0
  32. package/DOCKER_SETUP_GUIDE.md +84 -0
  33. package/Dockerfile +90 -0
  34. package/INSTALL.en.md +303 -0
  35. package/INSTALL.md +303 -0
  36. package/README.en.md +330 -0
  37. package/README.md +427 -0
  38. package/backup/legacy-removal-20250930-201816/http-server-legacy.ts +1068 -0
  39. package/backup/legacy-removal-20250930-201816/rollback-to-legacy.ps1 +46 -0
  40. package/backup/legacy-removal-20250930-201816/rollback-to-legacy.sh +48 -0
  41. package/dist/algorithms/forgetting-algorithm.d.ts +90 -0
  42. package/dist/algorithms/forgetting-algorithm.d.ts.map +1 -0
  43. package/dist/algorithms/forgetting-algorithm.js +160 -0
  44. package/dist/algorithms/forgetting-algorithm.js.map +1 -0
  45. package/dist/algorithms/hybrid-search-engine.d.ts +108 -0
  46. package/dist/algorithms/hybrid-search-engine.d.ts.map +1 -0
  47. package/dist/algorithms/hybrid-search-engine.js +384 -0
  48. package/dist/algorithms/hybrid-search-engine.js.map +1 -0
  49. package/dist/algorithms/search-engine.d.ts +64 -0
  50. package/dist/algorithms/search-engine.d.ts.map +1 -0
  51. package/dist/algorithms/search-engine.js +304 -0
  52. package/dist/algorithms/search-engine.js.map +1 -0
  53. package/dist/algorithms/search-ranking.d.ts +145 -0
  54. package/dist/algorithms/search-ranking.d.ts.map +1 -0
  55. package/dist/algorithms/search-ranking.js +311 -0
  56. package/dist/algorithms/search-ranking.js.map +1 -0
  57. package/dist/algorithms/spaced-repetition.d.ts +83 -0
  58. package/dist/algorithms/spaced-repetition.d.ts.map +1 -0
  59. package/dist/algorithms/spaced-repetition.js +153 -0
  60. package/dist/algorithms/spaced-repetition.js.map +1 -0
  61. package/dist/algorithms/vector-search-engine.d.ts +96 -0
  62. package/dist/algorithms/vector-search-engine.d.ts.map +1 -0
  63. package/dist/algorithms/vector-search-engine.js +410 -0
  64. package/dist/algorithms/vector-search-engine.js.map +1 -0
  65. package/dist/client/index.d.ts +55 -0
  66. package/dist/client/index.d.ts.map +1 -0
  67. package/dist/client/index.js +179 -0
  68. package/dist/client/index.js.map +1 -0
  69. package/dist/config/index.d.ts +20 -0
  70. package/dist/config/index.d.ts.map +1 -0
  71. package/dist/config/index.js +87 -0
  72. package/dist/config/index.js.map +1 -0
  73. package/dist/database/init.d.ts +7 -0
  74. package/dist/database/init.d.ts.map +1 -0
  75. package/dist/database/init.js +117 -0
  76. package/dist/database/init.js.map +1 -0
  77. package/dist/database/migrate.d.ts +6 -0
  78. package/dist/database/migrate.d.ts.map +1 -0
  79. package/dist/database/migrate.js +84 -0
  80. package/dist/database/migrate.js.map +1 -0
  81. package/dist/database/schema.sql +159 -0
  82. package/dist/npm-client/context-injector.d.ts +106 -0
  83. package/dist/npm-client/context-injector.d.ts.map +1 -0
  84. package/dist/npm-client/context-injector.js +296 -0
  85. package/dist/npm-client/context-injector.js.map +1 -0
  86. package/dist/npm-client/index.d.ts +42 -0
  87. package/dist/npm-client/index.d.ts.map +1 -0
  88. package/dist/npm-client/index.js +43 -0
  89. package/dist/npm-client/index.js.map +1 -0
  90. package/dist/npm-client/memento-client.d.ts +114 -0
  91. package/dist/npm-client/memento-client.d.ts.map +1 -0
  92. package/dist/npm-client/memento-client.js +391 -0
  93. package/dist/npm-client/memento-client.js.map +1 -0
  94. package/dist/npm-client/memory-manager.d.ts +137 -0
  95. package/dist/npm-client/memory-manager.d.ts.map +1 -0
  96. package/dist/npm-client/memory-manager.js +341 -0
  97. package/dist/npm-client/memory-manager.js.map +1 -0
  98. package/dist/npm-client/types.d.ts +216 -0
  99. package/dist/npm-client/types.d.ts.map +1 -0
  100. package/dist/npm-client/types.js +44 -0
  101. package/dist/npm-client/types.js.map +1 -0
  102. package/dist/npm-client/utils.d.ts +91 -0
  103. package/dist/npm-client/utils.d.ts.map +1 -0
  104. package/dist/npm-client/utils.js +351 -0
  105. package/dist/npm-client/utils.js.map +1 -0
  106. package/dist/scripts/copy-assets.d.ts +3 -0
  107. package/dist/scripts/copy-assets.d.ts.map +1 -0
  108. package/dist/scripts/copy-assets.js +31 -0
  109. package/dist/scripts/copy-assets.js.map +1 -0
  110. package/dist/server/http-server.d.ts +28 -0
  111. package/dist/server/http-server.d.ts.map +1 -0
  112. package/dist/server/http-server.js +930 -0
  113. package/dist/server/http-server.js.map +1 -0
  114. package/dist/server/index-backup.d.ts +5 -0
  115. package/dist/server/index-backup.d.ts.map +1 -0
  116. package/dist/server/index-backup.js +793 -0
  117. package/dist/server/index-backup.js.map +1 -0
  118. package/dist/server/index-refactored.d.ts +6 -0
  119. package/dist/server/index-refactored.d.ts.map +1 -0
  120. package/dist/server/index-refactored.js +206 -0
  121. package/dist/server/index-refactored.js.map +1 -0
  122. package/dist/server/index.d.ts +12 -0
  123. package/dist/server/index.d.ts.map +1 -0
  124. package/dist/server/index.js +301 -0
  125. package/dist/server/index.js.map +1 -0
  126. package/dist/server/simple-mcp-server.d.ts +8 -0
  127. package/dist/server/simple-mcp-server.d.ts.map +1 -0
  128. package/dist/server/simple-mcp-server.js +152 -0
  129. package/dist/server/simple-mcp-server.js.map +1 -0
  130. package/dist/services/async-optimizer.d.ts +136 -0
  131. package/dist/services/async-optimizer.d.ts.map +1 -0
  132. package/dist/services/async-optimizer.js +406 -0
  133. package/dist/services/async-optimizer.js.map +1 -0
  134. package/dist/services/batch-scheduler.d.ts +156 -0
  135. package/dist/services/batch-scheduler.d.ts.map +1 -0
  136. package/dist/services/batch-scheduler.js +612 -0
  137. package/dist/services/batch-scheduler.js.map +1 -0
  138. package/dist/services/cache-service.d.ts +168 -0
  139. package/dist/services/cache-service.d.ts.map +1 -0
  140. package/dist/services/cache-service.js +360 -0
  141. package/dist/services/cache-service.js.map +1 -0
  142. package/dist/services/database-optimizer.d.ts +110 -0
  143. package/dist/services/database-optimizer.d.ts.map +1 -0
  144. package/dist/services/database-optimizer.js +369 -0
  145. package/dist/services/database-optimizer.js.map +1 -0
  146. package/dist/services/embedding-provider-factory.d.ts +62 -0
  147. package/dist/services/embedding-provider-factory.d.ts.map +1 -0
  148. package/dist/services/embedding-provider-factory.js +152 -0
  149. package/dist/services/embedding-provider-factory.js.map +1 -0
  150. package/dist/services/embedding-service.d.ts +95 -0
  151. package/dist/services/embedding-service.d.ts.map +1 -0
  152. package/dist/services/embedding-service.js +276 -0
  153. package/dist/services/embedding-service.js.map +1 -0
  154. package/dist/services/error-logging-service.d.ts +134 -0
  155. package/dist/services/error-logging-service.d.ts.map +1 -0
  156. package/dist/services/error-logging-service.js +271 -0
  157. package/dist/services/error-logging-service.js.map +1 -0
  158. package/dist/services/forgetting-policy-service.d.ts +94 -0
  159. package/dist/services/forgetting-policy-service.d.ts.map +1 -0
  160. package/dist/services/forgetting-policy-service.js +233 -0
  161. package/dist/services/forgetting-policy-service.js.map +1 -0
  162. package/dist/services/gemini-embedding-service.d.ts +82 -0
  163. package/dist/services/gemini-embedding-service.d.ts.map +1 -0
  164. package/dist/services/gemini-embedding-service.js +232 -0
  165. package/dist/services/gemini-embedding-service.js.map +1 -0
  166. package/dist/services/lightweight-embedding-service.d.ts +95 -0
  167. package/dist/services/lightweight-embedding-service.d.ts.map +1 -0
  168. package/dist/services/lightweight-embedding-service.js +263 -0
  169. package/dist/services/lightweight-embedding-service.js.map +1 -0
  170. package/dist/services/memory-embedding-service.d.ts +69 -0
  171. package/dist/services/memory-embedding-service.d.ts.map +1 -0
  172. package/dist/services/memory-embedding-service.js +223 -0
  173. package/dist/services/memory-embedding-service.js.map +1 -0
  174. package/dist/services/minilm-embedding-service.d.ts +92 -0
  175. package/dist/services/minilm-embedding-service.d.ts.map +1 -0
  176. package/dist/services/minilm-embedding-service.js +216 -0
  177. package/dist/services/minilm-embedding-service.js.map +1 -0
  178. package/dist/services/performance-alert-service.d.ts +142 -0
  179. package/dist/services/performance-alert-service.d.ts.map +1 -0
  180. package/dist/services/performance-alert-service.js +366 -0
  181. package/dist/services/performance-alert-service.js.map +1 -0
  182. package/dist/services/performance-monitor.d.ts +144 -0
  183. package/dist/services/performance-monitor.d.ts.map +1 -0
  184. package/dist/services/performance-monitor.js +416 -0
  185. package/dist/services/performance-monitor.js.map +1 -0
  186. package/dist/services/performance-monitoring-integration.d.ts +77 -0
  187. package/dist/services/performance-monitoring-integration.d.ts.map +1 -0
  188. package/dist/services/performance-monitoring-integration.js +177 -0
  189. package/dist/services/performance-monitoring-integration.js.map +1 -0
  190. package/dist/services/unified-embedding-service.d.ts +75 -0
  191. package/dist/services/unified-embedding-service.d.ts.map +1 -0
  192. package/dist/services/unified-embedding-service.js +211 -0
  193. package/dist/services/unified-embedding-service.js.map +1 -0
  194. package/dist/test/debug-http-v2.d.ts +5 -0
  195. package/dist/test/debug-http-v2.d.ts.map +1 -0
  196. package/dist/test/debug-http-v2.js +28 -0
  197. package/dist/test/debug-http-v2.js.map +1 -0
  198. package/dist/test/performance-benchmark.d.ts +57 -0
  199. package/dist/test/performance-benchmark.d.ts.map +1 -0
  200. package/dist/test/performance-benchmark.js +427 -0
  201. package/dist/test/performance-benchmark.js.map +1 -0
  202. package/dist/test/test-alerts-direct.d.ts +7 -0
  203. package/dist/test/test-alerts-direct.d.ts.map +1 -0
  204. package/dist/test/test-alerts-direct.js +101 -0
  205. package/dist/test/test-alerts-direct.js.map +1 -0
  206. package/dist/test/test-batch-scheduler.d.ts +2 -0
  207. package/dist/test/test-batch-scheduler.d.ts.map +1 -0
  208. package/dist/test/test-batch-scheduler.js +156 -0
  209. package/dist/test/test-batch-scheduler.js.map +1 -0
  210. package/dist/test/test-client.d.ts +5 -0
  211. package/dist/test/test-client.d.ts.map +1 -0
  212. package/dist/test/test-client.js +86 -0
  213. package/dist/test/test-client.js.map +1 -0
  214. package/dist/test/test-embedding.d.ts +6 -0
  215. package/dist/test/test-embedding.d.ts.map +1 -0
  216. package/dist/test/test-embedding.js +142 -0
  217. package/dist/test/test-embedding.js.map +1 -0
  218. package/dist/test/test-error-logging.d.ts +7 -0
  219. package/dist/test/test-error-logging.d.ts.map +1 -0
  220. package/dist/test/test-error-logging.js +105 -0
  221. package/dist/test/test-error-logging.js.map +1 -0
  222. package/dist/test/test-forgetting.d.ts +6 -0
  223. package/dist/test/test-forgetting.d.ts.map +1 -0
  224. package/dist/test/test-forgetting.js +154 -0
  225. package/dist/test/test-forgetting.js.map +1 -0
  226. package/dist/test/test-gemini-embedding.d.ts +7 -0
  227. package/dist/test/test-gemini-embedding.d.ts.map +1 -0
  228. package/dist/test/test-gemini-embedding.js +134 -0
  229. package/dist/test/test-gemini-embedding.js.map +1 -0
  230. package/dist/test/test-http-server-v2-simple.d.ts +6 -0
  231. package/dist/test/test-http-server-v2-simple.d.ts.map +1 -0
  232. package/dist/test/test-http-server-v2-simple.js +131 -0
  233. package/dist/test/test-http-server-v2-simple.js.map +1 -0
  234. package/dist/test/test-http-server-v2.d.ts +7 -0
  235. package/dist/test/test-http-server-v2.d.ts.map +1 -0
  236. package/dist/test/test-http-server-v2.js +529 -0
  237. package/dist/test/test-http-server-v2.js.map +1 -0
  238. package/dist/test/test-lightweight-embedding.d.ts +6 -0
  239. package/dist/test/test-lightweight-embedding.d.ts.map +1 -0
  240. package/dist/test/test-lightweight-embedding.js +189 -0
  241. package/dist/test/test-lightweight-embedding.js.map +1 -0
  242. package/dist/test/test-m1-completion.d.ts +7 -0
  243. package/dist/test/test-m1-completion.d.ts.map +1 -0
  244. package/dist/test/test-m1-completion.js +124 -0
  245. package/dist/test/test-m1-completion.js.map +1 -0
  246. package/dist/test/test-memory-injection-prompt.d.ts +2 -0
  247. package/dist/test/test-memory-injection-prompt.d.ts.map +1 -0
  248. package/dist/test/test-memory-injection-prompt.js +299 -0
  249. package/dist/test/test-memory-injection-prompt.js.map +1 -0
  250. package/dist/test/test-performance-alerts.d.ts +7 -0
  251. package/dist/test/test-performance-alerts.d.ts.map +1 -0
  252. package/dist/test/test-performance-alerts.js +109 -0
  253. package/dist/test/test-performance-alerts.js.map +1 -0
  254. package/dist/test/test-performance-monitor.d.ts +2 -0
  255. package/dist/test/test-performance-monitor.d.ts.map +1 -0
  256. package/dist/test/test-performance-monitor.js +182 -0
  257. package/dist/test/test-performance-monitor.js.map +1 -0
  258. package/dist/test/test-performance-monitoring.d.ts +6 -0
  259. package/dist/test/test-performance-monitoring.d.ts.map +1 -0
  260. package/dist/test/test-performance-monitoring.js +156 -0
  261. package/dist/test/test-performance-monitoring.js.map +1 -0
  262. package/dist/test/test-search.d.ts +5 -0
  263. package/dist/test/test-search.d.ts.map +1 -0
  264. package/dist/test/test-search.js +141 -0
  265. package/dist/test/test-search.js.map +1 -0
  266. package/dist/test/test-simple-alerts.d.ts +6 -0
  267. package/dist/test/test-simple-alerts.d.ts.map +1 -0
  268. package/dist/test/test-simple-alerts.js +106 -0
  269. package/dist/test/test-simple-alerts.js.map +1 -0
  270. package/dist/test/test-vector-search-engine.d.ts +2 -0
  271. package/dist/test/test-vector-search-engine.d.ts.map +1 -0
  272. package/dist/test/test-vector-search-engine.js +225 -0
  273. package/dist/test/test-vector-search-engine.js.map +1 -0
  274. package/dist/tools/base-tool.d.ts +64 -0
  275. package/dist/tools/base-tool.d.ts.map +1 -0
  276. package/dist/tools/base-tool.js +158 -0
  277. package/dist/tools/base-tool.js.map +1 -0
  278. package/dist/tools/cleanup-memory-tool.d.ts +10 -0
  279. package/dist/tools/cleanup-memory-tool.d.ts.map +1 -0
  280. package/dist/tools/cleanup-memory-tool.js +66 -0
  281. package/dist/tools/cleanup-memory-tool.js.map +1 -0
  282. package/dist/tools/database-optimize-tool.d.ts +10 -0
  283. package/dist/tools/database-optimize-tool.d.ts.map +1 -0
  284. package/dist/tools/database-optimize-tool.js +64 -0
  285. package/dist/tools/database-optimize-tool.js.map +1 -0
  286. package/dist/tools/error-stats.d.ts +93 -0
  287. package/dist/tools/error-stats.d.ts.map +1 -0
  288. package/dist/tools/error-stats.js +115 -0
  289. package/dist/tools/error-stats.js.map +1 -0
  290. package/dist/tools/forget-tool.d.ts +63 -0
  291. package/dist/tools/forget-tool.d.ts.map +1 -0
  292. package/dist/tools/forget-tool.js +340 -0
  293. package/dist/tools/forget-tool.js.map +1 -0
  294. package/dist/tools/forgetting-stats-tool.d.ts +10 -0
  295. package/dist/tools/forgetting-stats-tool.d.ts.map +1 -0
  296. package/dist/tools/forgetting-stats-tool.js +37 -0
  297. package/dist/tools/forgetting-stats-tool.js.map +1 -0
  298. package/dist/tools/index.d.ts +33 -0
  299. package/dist/tools/index.d.ts.map +1 -0
  300. package/dist/tools/index.js +55 -0
  301. package/dist/tools/index.js.map +1 -0
  302. package/dist/tools/memory-injection-prompt.d.ts +31 -0
  303. package/dist/tools/memory-injection-prompt.d.ts.map +1 -0
  304. package/dist/tools/memory-injection-prompt.js +203 -0
  305. package/dist/tools/memory-injection-prompt.js.map +1 -0
  306. package/dist/tools/performance-alerts.d.ts +127 -0
  307. package/dist/tools/performance-alerts.d.ts.map +1 -0
  308. package/dist/tools/performance-alerts.js +208 -0
  309. package/dist/tools/performance-alerts.js.map +1 -0
  310. package/dist/tools/performance-stats-tool.d.ts +10 -0
  311. package/dist/tools/performance-stats-tool.d.ts.map +1 -0
  312. package/dist/tools/performance-stats-tool.js +38 -0
  313. package/dist/tools/performance-stats-tool.js.map +1 -0
  314. package/dist/tools/pin-tool.d.ts +39 -0
  315. package/dist/tools/pin-tool.d.ts.map +1 -0
  316. package/dist/tools/pin-tool.js +211 -0
  317. package/dist/tools/pin-tool.js.map +1 -0
  318. package/dist/tools/recall-tool.d.ts +27 -0
  319. package/dist/tools/recall-tool.d.ts.map +1 -0
  320. package/dist/tools/recall-tool.js +335 -0
  321. package/dist/tools/recall-tool.js.map +1 -0
  322. package/dist/tools/remember-tool.d.ts +10 -0
  323. package/dist/tools/remember-tool.d.ts.map +1 -0
  324. package/dist/tools/remember-tool.js +101 -0
  325. package/dist/tools/remember-tool.js.map +1 -0
  326. package/dist/tools/resolve-error.d.ts +54 -0
  327. package/dist/tools/resolve-error.d.ts.map +1 -0
  328. package/dist/tools/resolve-error.js +63 -0
  329. package/dist/tools/resolve-error.js.map +1 -0
  330. package/dist/tools/tool-registry.d.ts +134 -0
  331. package/dist/tools/tool-registry.d.ts.map +1 -0
  332. package/dist/tools/tool-registry.js +337 -0
  333. package/dist/tools/tool-registry.js.map +1 -0
  334. package/dist/tools/types.d.ts +56 -0
  335. package/dist/tools/types.d.ts.map +1 -0
  336. package/dist/tools/types.js +23 -0
  337. package/dist/tools/types.js.map +1 -0
  338. package/dist/tools/unpin-tool.d.ts +43 -0
  339. package/dist/tools/unpin-tool.d.ts.map +1 -0
  340. package/dist/tools/unpin-tool.js +233 -0
  341. package/dist/tools/unpin-tool.js.map +1 -0
  342. package/dist/types/embedding.types.d.ts +65 -0
  343. package/dist/types/embedding.types.d.ts.map +1 -0
  344. package/dist/types/embedding.types.js +6 -0
  345. package/dist/types/embedding.types.js.map +1 -0
  346. package/dist/types/index.d.ts +103 -0
  347. package/dist/types/index.d.ts.map +1 -0
  348. package/dist/types/index.js +5 -0
  349. package/dist/types/index.js.map +1 -0
  350. package/dist/utils/database.d.ts +62 -0
  351. package/dist/utils/database.d.ts.map +1 -0
  352. package/dist/utils/database.js +399 -0
  353. package/dist/utils/database.js.map +1 -0
  354. package/dist/utils/stopwords.d.ts +18 -0
  355. package/dist/utils/stopwords.d.ts.map +1 -0
  356. package/dist/utils/stopwords.js +117 -0
  357. package/dist/utils/stopwords.js.map +1 -0
  358. package/docker-compose.dev.yml +50 -0
  359. package/docker-compose.prod.yml +77 -0
  360. package/docker-compose.yml +43 -0
  361. package/docs/en/Memento-Goals.md +217 -0
  362. package/docs/en/Memento-M1-DetailSpecs.md +130 -0
  363. package/docs/en/Memento-Milestones.md +135 -0
  364. package/docs/en/Search-Ranking-Memory-Decay-Formulas.md +177 -0
  365. package/docs/en/api-reference.md +658 -0
  366. package/docs/en/architecture.md +1302 -0
  367. package/docs/en/developer-guide.md +1005 -0
  368. package/docs/en/user-manual.md +595 -0
  369. package/docs/ko/Memento-Goals.md +217 -0
  370. package/docs/ko/Memento-M1-DetailSpecs.md +130 -0
  371. package/docs/ko/Memento-Milestones.md +134 -0
  372. package/docs/ko/Search-Ranking-Memory-Decay-Formulas.md +177 -0
  373. package/docs/ko/api-reference.md +658 -0
  374. package/docs/ko/architecture.md +1302 -0
  375. package/docs/ko/developer-guide.md +1006 -0
  376. package/docs/ko/embedding-api-reference.md +122 -0
  377. package/docs/ko/embedding-configuration.md +62 -0
  378. package/docs/ko/embedding-performance-benchmark.md +62 -0
  379. package/docs/ko/embedding-service-guide.md +314 -0
  380. package/docs/ko/user-manual.md +595 -0
  381. package/env.example +49 -0
  382. package/install.sh +191 -0
  383. package/mcp-http-client.js +218 -0
  384. package/mcp.json +0 -0
  385. package/package.json +125 -0
  386. package/packages/mcp-client/docs/API-REFERENCE.md +560 -0
  387. package/packages/mcp-client/docs/BEST-PRACTICES.md +564 -0
  388. package/packages/mcp-client/docs/MIGRATION-GUIDE.md +344 -0
  389. package/packages/mcp-client/docs/PERFORMANCE-GUIDE.md +476 -0
  390. package/packages/mcp-client/docs/TROUBLESHOOTING.md +564 -0
  391. package/packages/mcp-client/package-lock.json +907 -0
  392. package/packages/mcp-client/package.json +58 -0
  393. package/packages/mcp-client/performance-optimizer.js +428 -0
  394. package/packages/mcp-client/test-basic.js +65 -0
  395. package/packages/mcp-client/test-integration.js +366 -0
  396. package/scripts/auto-setup.js +234 -0
  397. package/scripts/backup-daily.bat +28 -0
  398. package/scripts/backup-embeddings.js +108 -0
  399. package/scripts/check-db-integrity.js +93 -0
  400. package/scripts/debug-embeddings.js +184 -0
  401. package/scripts/direct-sql-migration.sql +36 -0
  402. package/scripts/docker-migration.sh +105 -0
  403. package/scripts/fix-migration.js +93 -0
  404. package/scripts/fix-vector-dimensions.js +206 -0
  405. package/scripts/migrate-embedding-data.js +307 -0
  406. package/scripts/regenerate-embeddings.js +144 -0
  407. package/scripts/restore-legacy.ps1 +60 -0
  408. package/scripts/restore-legacy.sh +62 -0
  409. package/scripts/run-migration.js +122 -0
  410. package/scripts/safe-migration.js +150 -0
  411. package/scripts/simple-migrate.js +41 -0
  412. package/scripts/simple-update.js +123 -0
  413. package/scripts/start-container.sh +10 -0
  414. package/src/algorithms/forgetting-algorithm.spec.ts +538 -0
  415. package/src/algorithms/forgetting-algorithm.ts +243 -0
  416. package/src/algorithms/hybrid-search-engine.spec.ts +484 -0
  417. package/src/algorithms/hybrid-search-engine.ts +489 -0
  418. package/src/algorithms/search-engine.spec.ts +429 -0
  419. package/src/algorithms/search-engine.ts +392 -0
  420. package/src/algorithms/search-ranking.spec.ts +293 -0
  421. package/src/algorithms/search-ranking.ts +407 -0
  422. package/src/algorithms/spaced-repetition.spec.ts +510 -0
  423. package/src/algorithms/spaced-repetition.ts +238 -0
  424. package/src/algorithms/vector-search-engine.ts +505 -0
  425. package/src/client/index.spec.ts +427 -0
  426. package/src/client/index.ts +222 -0
  427. package/src/config/index.spec.ts +339 -0
  428. package/src/config/index.ts +106 -0
  429. package/src/database/init.spec.ts +239 -0
  430. package/src/database/init.ts +130 -0
  431. package/src/database/migrate.spec.ts +293 -0
  432. package/src/database/migrate.ts +94 -0
  433. package/src/database/migrations/001_add_embedding_metadata.sql +29 -0
  434. package/src/database/schema.sql +159 -0
  435. package/src/npm-client/context-injector.spec.ts +335 -0
  436. package/src/npm-client/context-injector.ts +412 -0
  437. package/src/npm-client/index.spec.ts +108 -0
  438. package/src/npm-client/index.ts +96 -0
  439. package/src/npm-client/memento-client.spec.ts +549 -0
  440. package/src/npm-client/memento-client.ts +501 -0
  441. package/src/npm-client/memory-manager.spec.ts +374 -0
  442. package/src/npm-client/memory-manager.ts +414 -0
  443. package/src/npm-client/types.spec.ts +427 -0
  444. package/src/npm-client/types.ts +296 -0
  445. package/src/npm-client/utils.spec.ts +355 -0
  446. package/src/npm-client/utils.ts +423 -0
  447. package/src/scripts/copy-assets.js +37 -0
  448. package/src/server/http-server.spec.ts +648 -0
  449. package/src/server/http-server.ts +1030 -0
  450. package/src/server/index-backup.ts +875 -0
  451. package/src/server/index-refactored.ts +237 -0
  452. package/src/server/index.spec.ts +281 -0
  453. package/src/server/index.ts +347 -0
  454. package/src/server/simple-mcp-server.spec.ts +207 -0
  455. package/src/server/simple-mcp-server.ts +173 -0
  456. package/src/services/async-optimizer.spec.ts +569 -0
  457. package/src/services/async-optimizer.ts +484 -0
  458. package/src/services/batch-scheduler.ts +759 -0
  459. package/src/services/cache-service.spec.ts +372 -0
  460. package/src/services/cache-service.ts +434 -0
  461. package/src/services/database-optimizer.spec.ts +344 -0
  462. package/src/services/database-optimizer.ts +450 -0
  463. package/src/services/embedding-provider-factory.ts +173 -0
  464. package/src/services/embedding-service.spec.ts +342 -0
  465. package/src/services/embedding-service.ts +333 -0
  466. package/src/services/error-logging-service.spec.ts +416 -0
  467. package/src/services/error-logging-service.ts +383 -0
  468. package/src/services/forgetting-policy-service.spec.ts +140 -0
  469. package/src/services/forgetting-policy-service.ts +334 -0
  470. package/src/services/gemini-embedding-service.spec.ts +463 -0
  471. package/src/services/gemini-embedding-service.ts +283 -0
  472. package/src/services/lightweight-embedding-service.spec.ts +458 -0
  473. package/src/services/lightweight-embedding-service.ts +324 -0
  474. package/src/services/memory-embedding-service.spec.ts +417 -0
  475. package/src/services/memory-embedding-service.ts +289 -0
  476. package/src/services/minilm-embedding-service.spec.ts +104 -0
  477. package/src/services/minilm-embedding-service.ts +262 -0
  478. package/src/services/performance-alert-service.spec.ts +517 -0
  479. package/src/services/performance-alert-service.ts +477 -0
  480. package/src/services/performance-monitor.spec.ts +401 -0
  481. package/src/services/performance-monitor.ts +532 -0
  482. package/src/services/performance-monitoring-integration.spec.ts +478 -0
  483. package/src/services/performance-monitoring-integration.ts.bak +276 -0
  484. package/src/services/unified-embedding-service.spec.ts +224 -0
  485. package/src/services/unified-embedding-service.ts +255 -0
  486. package/src/test/debug-http-v2.ts +30 -0
  487. package/src/test/embedding-integration-test.spec.ts +295 -0
  488. package/src/test/embedding-integration-test.ts +295 -0
  489. package/src/test/embedding-performance-benchmark.spec.ts +354 -0
  490. package/src/test/embedding-performance-benchmark.ts +312 -0
  491. package/src/test/performance-benchmark.ts +565 -0
  492. package/src/test/test-alerts-direct.ts +136 -0
  493. package/src/test/test-batch-scheduler-simple.spec.ts +122 -0
  494. package/src/test/test-batch-scheduler.spec.ts +453 -0
  495. package/src/test/test-batch-scheduler.ts +182 -0
  496. package/src/test/test-client.ts +97 -0
  497. package/src/test/test-embedding.ts +153 -0
  498. package/src/test/test-error-handling.spec.ts +575 -0
  499. package/src/test/test-error-logging.ts +117 -0
  500. package/src/test/test-forgetting.ts +162 -0
  501. package/src/test/test-gemini-embedding.ts +159 -0
  502. package/src/test/test-http-server-v2-simple.ts +147 -0
  503. package/src/test/test-http-server-v2.ts +586 -0
  504. package/src/test/test-hybrid-search-engine.spec.ts +521 -0
  505. package/src/test/test-integration-fixed.spec.ts +612 -0
  506. package/src/test/test-integration.spec.ts +463 -0
  507. package/src/test/test-lightweight-embedding.ts +208 -0
  508. package/src/test/test-m1-completion.spec.ts +614 -0
  509. package/src/test/test-m1-completion.ts +141 -0
  510. package/src/test/test-m1-integration.spec.ts +514 -0
  511. package/src/test/test-memory-injection-prompt.spec.ts +650 -0
  512. package/src/test/test-memory-injection-prompt.ts +391 -0
  513. package/src/test/test-performance-alerts.ts +125 -0
  514. package/src/test/test-performance-monitor-updates.spec.ts +490 -0
  515. package/src/test/test-performance-monitor.spec.ts +284 -0
  516. package/src/test/test-performance-monitor.ts +228 -0
  517. package/src/test/test-performance-monitoring.ts +171 -0
  518. package/src/test/test-search.ts +151 -0
  519. package/src/test/test-simple-alerts.ts +136 -0
  520. package/src/test/test-vector-search-engine.spec.ts +408 -0
  521. package/src/test/test-vector-search-engine.ts +303 -0
  522. package/src/tools/base-tool.ts +189 -0
  523. package/src/tools/cleanup-memory-tool.ts +77 -0
  524. package/src/tools/database-optimize-tool.ts +79 -0
  525. package/src/tools/error-stats.ts +119 -0
  526. package/src/tools/forget-tool.spec.ts +613 -0
  527. package/src/tools/forget-tool.ts +454 -0
  528. package/src/tools/forgetting-stats-tool.ts +47 -0
  529. package/src/tools/index.ts +71 -0
  530. package/src/tools/memory-injection-prompt.ts +257 -0
  531. package/src/tools/performance-alerts.ts +226 -0
  532. package/src/tools/performance-stats-tool.ts +48 -0
  533. package/src/tools/pin-tool.spec.ts +497 -0
  534. package/src/tools/pin-tool.ts +277 -0
  535. package/src/tools/recall-tool.spec.ts +475 -0
  536. package/src/tools/recall-tool.ts +389 -0
  537. package/src/tools/remember-tool.spec.ts +469 -0
  538. package/src/tools/remember-tool.ts +112 -0
  539. package/src/tools/resolve-error.ts +69 -0
  540. package/src/tools/tool-registry.ts +417 -0
  541. package/src/tools/types.ts +63 -0
  542. package/src/tools/unpin-tool.spec.ts +549 -0
  543. package/src/tools/unpin-tool.ts +306 -0
  544. package/src/types/embedding.types.ts +78 -0
  545. package/src/types/index.spec.ts +420 -0
  546. package/src/types/index.ts +117 -0
  547. package/src/utils/database.spec.ts +77 -0
  548. package/src/utils/database.ts +458 -0
  549. package/src/utils/stopwords.ts +128 -0
  550. package/start-docker-setup.bat +38 -0
  551. package/static/logo.png +0 -0
  552. package/static/memento_logo.svg +2 -0
  553. package/test-docker.js +103 -0
  554. package/tsconfig.json +46 -0
  555. package/vitest.config.ts +23 -0
@@ -0,0 +1,284 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { getPerformanceMonitor, PerformanceMonitor } from '../services/performance-monitor.js';
3
+ import Database from 'better-sqlite3';
4
+ import { DatabaseUtils } from '../utils/database.js';
5
+
6
+ describe('PerformanceMonitor', () => {
7
+ let db: Database.Database;
8
+ let performanceMonitor: PerformanceMonitor;
9
+
10
+ beforeEach(() => {
11
+ // Create in-memory database for testing
12
+ db = new Database(':memory:');
13
+ // Initialize database schema
14
+ db.exec(`
15
+ CREATE TABLE memory_item (
16
+ id TEXT PRIMARY KEY,
17
+ type TEXT CHECK (type IN ('working','episodic','semantic','procedural')),
18
+ content TEXT NOT NULL,
19
+ importance REAL CHECK (importance >= 0 AND importance <= 1) DEFAULT 0.5,
20
+ privacy_scope TEXT CHECK (privacy_scope IN ('private','team','public')) DEFAULT 'private',
21
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
22
+ last_accessed TIMESTAMP,
23
+ pinned BOOLEAN DEFAULT FALSE,
24
+ source TEXT,
25
+ agent_id TEXT,
26
+ user_id TEXT,
27
+ project_id TEXT,
28
+ origin_trace TEXT
29
+ );
30
+ `);
31
+
32
+ performanceMonitor = getPerformanceMonitor();
33
+ performanceMonitor.initialize(db);
34
+ });
35
+
36
+ afterEach(() => {
37
+ if (db) {
38
+ db.close();
39
+ }
40
+ });
41
+
42
+ describe('초기화', () => {
43
+ it('should initialize successfully', () => {
44
+ expect(() => performanceMonitor.initialize(db)).not.toThrow();
45
+ });
46
+
47
+ it('should reset state on initialization', () => {
48
+ performanceMonitor.initialize(db);
49
+ const alerts = performanceMonitor.getActiveAlerts();
50
+ expect(alerts).toEqual([]);
51
+ });
52
+ });
53
+
54
+ describe('메트릭 수집', () => {
55
+ it('should collect basic metrics', async () => {
56
+ const metrics = await performanceMonitor.collectMetrics();
57
+
58
+ expect(metrics).toHaveProperty('timestamp');
59
+ expect(metrics).toHaveProperty('cpu');
60
+ expect(metrics).toHaveProperty('memory');
61
+ expect(metrics).toHaveProperty('database');
62
+ expect(metrics).toHaveProperty('uptime');
63
+
64
+ expect(metrics.cpu).toHaveProperty('user');
65
+ expect(metrics.cpu).toHaveProperty('system');
66
+ expect(metrics.memory).toHaveProperty('rss');
67
+ expect(metrics.memory).toHaveProperty('heapTotal');
68
+ expect(metrics.memory).toHaveProperty('heapUsed');
69
+ expect(metrics.memory).toHaveProperty('external');
70
+
71
+ expect(metrics.database).toHaveProperty('size');
72
+ expect(metrics.database).toHaveProperty('memoryCount');
73
+ expect(metrics.database).toHaveProperty('queryTime');
74
+ });
75
+
76
+ it('should collect database metrics', async () => {
77
+ // Add test data
78
+ db.prepare(`
79
+ INSERT INTO memory_item (id, type, content, importance, created_at)
80
+ VALUES ('test1', 'episodic', 'Test memory 1', 0.5, datetime('now'))
81
+ `).run();
82
+
83
+ const metrics = await performanceMonitor.collectMetrics();
84
+
85
+ expect(metrics.database.memoryCount).toBe(1);
86
+ expect(metrics.database.size).toBeGreaterThan(0);
87
+ });
88
+
89
+ it('should handle database errors gracefully', async () => {
90
+ // Close database to simulate error
91
+ db.close();
92
+
93
+ const metrics = await performanceMonitor.collectMetrics();
94
+
95
+ expect(metrics.database.memoryCount).toBe(0);
96
+ expect(metrics.database.size).toBe(0);
97
+ });
98
+ });
99
+
100
+ describe('메트릭 히스토리', () => {
101
+ it('should maintain metrics history', async () => {
102
+ await performanceMonitor.collectMetrics();
103
+ await performanceMonitor.collectMetrics();
104
+
105
+ const history = performanceMonitor.getMetricsHistory();
106
+ expect(history.length).toBeGreaterThanOrEqual(2);
107
+ });
108
+
109
+ it('should limit metrics history size', async () => {
110
+ // Collect more than maxHistorySize (1000) metrics
111
+ for (let i = 0; i < 5; i++) {
112
+ await performanceMonitor.collectMetrics();
113
+ }
114
+
115
+ const history = performanceMonitor.getMetricsHistory();
116
+ expect(history.length).toBeLessThanOrEqual(1000);
117
+ });
118
+
119
+ it('should return limited history when limit specified', async () => {
120
+ await performanceMonitor.collectMetrics();
121
+ await performanceMonitor.collectMetrics();
122
+ await performanceMonitor.collectMetrics();
123
+
124
+ const limitedHistory = performanceMonitor.getMetricsHistory(2);
125
+ expect(limitedHistory.length).toBe(2);
126
+ });
127
+ });
128
+
129
+ describe('알림 관리', () => {
130
+ it('should return active alerts', () => {
131
+ const alerts = performanceMonitor.getActiveAlerts();
132
+ expect(Array.isArray(alerts)).toBe(true);
133
+ });
134
+
135
+ it('should return all alerts', () => {
136
+ const allAlerts = performanceMonitor.getAllAlerts();
137
+ expect(Array.isArray(allAlerts)).toBe(true);
138
+ });
139
+
140
+ it('should resolve alerts', () => {
141
+ // Create a mock alert by triggering high memory usage
142
+ const originalMemoryUsage = process.memoryUsage;
143
+ process.memoryUsage = vi.fn().mockReturnValue({
144
+ rss: 0,
145
+ heapTotal: 1000,
146
+ heapUsed: 900, // 90% usage
147
+ external: 0,
148
+ arrayBuffers: 0
149
+ });
150
+
151
+ // Trigger alert by collecting metrics
152
+ performanceMonitor.collectMetrics();
153
+
154
+ const alerts = performanceMonitor.getActiveAlerts();
155
+ if (alerts.length > 0) {
156
+ const alertId = alerts[0].id;
157
+ const resolved = performanceMonitor.resolveAlert(alertId);
158
+
159
+ expect(resolved).toBe(true);
160
+
161
+ const activeAlerts = performanceMonitor.getActiveAlerts();
162
+ expect(activeAlerts.find(a => a.id === alertId)?.resolved).toBe(true);
163
+ }
164
+
165
+ // Restore original function
166
+ process.memoryUsage = originalMemoryUsage;
167
+ });
168
+
169
+ it('should not resolve non-existent alert', () => {
170
+ const resolved = performanceMonitor.resolveAlert('non-existent-id');
171
+ expect(resolved).toBe(false);
172
+ });
173
+ });
174
+
175
+ describe('성능 요약', () => {
176
+ it('should return performance summary', () => {
177
+ const summary = performanceMonitor.getPerformanceSummary();
178
+
179
+ expect(summary).toHaveProperty('current');
180
+ expect(summary).toHaveProperty('alerts');
181
+ expect(summary).toHaveProperty('trends');
182
+ expect(summary.alerts).toHaveProperty('active');
183
+ expect(summary.alerts).toHaveProperty('total');
184
+ expect(summary.trends).toHaveProperty('memoryTrend');
185
+ expect(summary.trends).toHaveProperty('dbSizeTrend');
186
+ });
187
+
188
+ it('should calculate trends when metrics available', async () => {
189
+ // Collect some metrics
190
+ await performanceMonitor.collectMetrics();
191
+ await performanceMonitor.collectMetrics();
192
+
193
+ const summary = performanceMonitor.getPerformanceSummary();
194
+
195
+ expect(summary.current).toBeDefined();
196
+ expect(summary.trends.memoryTrend).toMatch(/^(increasing|decreasing|stable)$/);
197
+ expect(summary.trends.dbSizeTrend).toMatch(/^(increasing|decreasing|stable)$/);
198
+ });
199
+ });
200
+
201
+ describe('알림 규칙', () => {
202
+ it('should trigger memory alert on high usage', async () => {
203
+ // Mock high memory usage
204
+ const originalMemoryUsage = process.memoryUsage;
205
+ process.memoryUsage = vi.fn().mockReturnValue({
206
+ rss: 0,
207
+ heapTotal: 1000,
208
+ heapUsed: 900, // 90% usage
209
+ external: 0,
210
+ arrayBuffers: 0
211
+ });
212
+
213
+ await performanceMonitor.collectMetrics();
214
+
215
+ const alerts = performanceMonitor.getActiveAlerts();
216
+ const memoryAlert = alerts.find(a => a.type === 'memory');
217
+
218
+ expect(memoryAlert).toBeDefined();
219
+ expect(memoryAlert?.severity).toBe('warning');
220
+
221
+ // Restore original function
222
+ process.memoryUsage = originalMemoryUsage;
223
+ });
224
+
225
+ it('should trigger database size alert on large database', async () => {
226
+ // Mock large database size
227
+ const originalPrepare = db.prepare;
228
+ db.prepare = vi.fn().mockImplementation((query: string) => {
229
+ if (query.includes('PRAGMA page_count')) {
230
+ return { get: () => ({ page_count: 100000 }) };
231
+ }
232
+ if (query.includes('PRAGMA page_size')) {
233
+ return { get: () => ({ page_size: 4096 }) };
234
+ }
235
+ return originalPrepare.call(db, query);
236
+ });
237
+
238
+ await performanceMonitor.collectMetrics();
239
+
240
+ const alerts = performanceMonitor.getActiveAlerts();
241
+ const dbAlert = alerts.find(a => a.type === 'database');
242
+
243
+ expect(dbAlert).toBeDefined();
244
+ expect(dbAlert?.severity).toBe('critical');
245
+
246
+ // Restore original function
247
+ db.prepare = originalPrepare;
248
+ });
249
+
250
+ it('should trigger query time alert on slow queries', async () => {
251
+ // Mock slow query time by directly calling checkAlerts with slow query metrics
252
+ const slowMetrics = {
253
+ timestamp: new Date(),
254
+ memory: { rss: 100000000, heapTotal: 100000000, heapUsed: 100000000, external: 0 },
255
+ cpu: { user: 0, system: 0 },
256
+ database: { size: 1000000, memoryCount: 0, queryTime: 2500 }, // 2.5 seconds
257
+ uptime: 1000
258
+ };
259
+
260
+ // Call checkAlerts directly to test alert generation
261
+ await (performanceMonitor as any).checkAlerts(slowMetrics);
262
+
263
+ const alerts = performanceMonitor.getActiveAlerts();
264
+ const queryAlert = alerts.find(a => a.type === 'query');
265
+
266
+ expect(queryAlert).toBeDefined();
267
+ expect(queryAlert?.severity).toBe('critical');
268
+ });
269
+ });
270
+
271
+ describe('임계값 관리', () => {
272
+ it('should update thresholds', () => {
273
+ const newThresholds = {
274
+ memoryUsagePercent: 90,
275
+ databaseSizeMB: 200
276
+ };
277
+
278
+ performanceMonitor.updateThresholds(newThresholds);
279
+
280
+ // Should not throw
281
+ expect(() => performanceMonitor.updateThresholds(newThresholds)).not.toThrow();
282
+ });
283
+ });
284
+ });
@@ -0,0 +1,228 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { getPerformanceMonitor, PerformanceMonitor } from '../services/performance-monitor.js';
3
+ import Database from 'better-sqlite3';
4
+ import { DatabaseUtils } from '../utils/database.js';
5
+
6
+ describe('PerformanceMonitor', () => {
7
+ let db: Database.Database;
8
+ let performanceMonitor: PerformanceMonitor;
9
+
10
+ beforeEach(() => {
11
+ // Create in-memory database for testing
12
+ db = new Database(':memory:');
13
+ DatabaseUtils.initializeDatabase(db);
14
+
15
+ performanceMonitor = getPerformanceMonitor();
16
+ performanceMonitor.initialize(db);
17
+ });
18
+
19
+ afterEach(() => {
20
+ if (db) {
21
+ db.close();
22
+ }
23
+ });
24
+
25
+ describe('초기화', () => {
26
+ it('should initialize successfully', () => {
27
+ expect(() => performanceMonitor.initialize(db)).not.toThrow();
28
+ });
29
+
30
+ it('should reset state on initialization', () => {
31
+ performanceMonitor.initialize(db);
32
+ const alerts = performanceMonitor.getActiveAlerts();
33
+ expect(alerts).toEqual([]);
34
+ });
35
+ });
36
+
37
+ describe('메트릭 수집', () => {
38
+ it('should collect basic metrics', async () => {
39
+ const metrics = await performanceMonitor.collectMetrics();
40
+
41
+ expect(metrics).toHaveProperty('timestamp');
42
+ expect(metrics).toHaveProperty('cpu');
43
+ expect(metrics).toHaveProperty('memory');
44
+ expect(metrics).toHaveProperty('database');
45
+ expect(metrics).toHaveProperty('uptime');
46
+
47
+ expect(metrics.cpu).toHaveProperty('user');
48
+ expect(metrics.cpu).toHaveProperty('system');
49
+ expect(metrics.cpu).toHaveProperty('idle');
50
+
51
+ expect(metrics.memory).toHaveProperty('rss');
52
+ expect(metrics.memory).toHaveProperty('heapTotal');
53
+ expect(metrics.memory).toHaveProperty('heapUsed');
54
+ expect(metrics.memory).toHaveProperty('external');
55
+ expect(metrics.memory).toHaveProperty('arrayBuffers');
56
+
57
+ expect(metrics.database).toHaveProperty('totalMemories');
58
+ expect(metrics.database).toHaveProperty('size');
59
+ expect(metrics.database).toHaveProperty('queryTime');
60
+ });
61
+
62
+ it('should collect database metrics', async () => {
63
+ // Add test data
64
+ DatabaseUtils.runQuery(db, `
65
+ INSERT INTO memory_item (id, type, content, importance, created_at)
66
+ VALUES ('test1', 'episodic', 'Test memory 1', 0.5, datetime('now'))
67
+ `);
68
+
69
+ const metrics = await performanceMonitor.collectMetrics();
70
+
71
+ expect(metrics.database.totalMemories).toBe(1);
72
+ expect(metrics.database.size).toBeGreaterThan(0);
73
+ });
74
+
75
+ it('should handle database errors gracefully', async () => {
76
+ // Close database to simulate error
77
+ db.close();
78
+
79
+ const metrics = await performanceMonitor.collectMetrics();
80
+
81
+ expect(metrics.database.totalMemories).toBe(0);
82
+ expect(metrics.database.size).toBe(0);
83
+ });
84
+ });
85
+
86
+ describe('쿼리 시간 기록', () => {
87
+ it('should record query times', () => {
88
+ performanceMonitor.recordQueryTime(100);
89
+ performanceMonitor.recordQueryTime(200);
90
+ performanceMonitor.recordQueryTime(300);
91
+
92
+ // Should not throw
93
+ expect(() => performanceMonitor.recordQueryTime(150)).not.toThrow();
94
+ });
95
+
96
+ it('should maintain max query times limit', () => {
97
+ // Record more than MAX_QUERY_TIMES (100)
98
+ for (let i = 0; i < 150; i++) {
99
+ performanceMonitor.recordQueryTime(i);
100
+ }
101
+
102
+ // Should not throw
103
+ expect(() => performanceMonitor.recordQueryTime(999)).not.toThrow();
104
+ });
105
+ });
106
+
107
+ describe('알림 관리', () => {
108
+ it('should return active alerts', () => {
109
+ const alerts = performanceMonitor.getActiveAlerts();
110
+ expect(Array.isArray(alerts)).toBe(true);
111
+ });
112
+
113
+ it('should resolve alerts', () => {
114
+ // Create a mock alert by triggering high memory usage
115
+ const mockMetrics = {
116
+ timestamp: new Date().toISOString(),
117
+ cpu: { user: 0, system: 0, idle: 0 },
118
+ memory: { rss: 0, heapTotal: 1000, heapUsed: 900, external: 0, arrayBuffers: 0 },
119
+ database: { totalMemories: 0, size: 0, queryTime: 0 },
120
+ uptime: 0
121
+ };
122
+
123
+ // Trigger alert by calling checkAlerts directly
124
+ (performanceMonitor as any).checkAlerts(mockMetrics);
125
+
126
+ const alerts = performanceMonitor.getActiveAlerts();
127
+ expect(alerts.length).toBeGreaterThan(0);
128
+
129
+ const alertId = alerts[0].id;
130
+ const resolved = performanceMonitor.resolveAlert(alertId);
131
+
132
+ expect(resolved).toBe(true);
133
+
134
+ const activeAlerts = performanceMonitor.getActiveAlerts();
135
+ expect(activeAlerts.find(a => a.id === alertId)?.resolved).toBe(true);
136
+ });
137
+
138
+ it('should not resolve non-existent alert', () => {
139
+ const resolved = performanceMonitor.resolveAlert('non-existent-id');
140
+ expect(resolved).toBe(false);
141
+ });
142
+ });
143
+
144
+ describe('성능 요약', () => {
145
+ it('should return performance summary', () => {
146
+ const summary = performanceMonitor.getPerformanceSummary();
147
+
148
+ expect(summary).toHaveProperty('activeAlertsCount');
149
+ expect(summary).toHaveProperty('criticalAlertsCount');
150
+ expect(typeof summary.activeAlertsCount).toBe('number');
151
+ expect(typeof summary.criticalAlertsCount).toBe('number');
152
+ });
153
+
154
+ it('should calculate averages when metrics available', async () => {
155
+ // Collect some metrics
156
+ await performanceMonitor.collectMetrics();
157
+ await performanceMonitor.collectMetrics();
158
+
159
+ const summary = performanceMonitor.getPerformanceSummary();
160
+
161
+ expect(summary.averageCpuUsage).toBeDefined();
162
+ expect(summary.averageMemoryUsage).toBeDefined();
163
+ expect(summary.averageDbSize).toBeDefined();
164
+ expect(summary.averageQueryTime).toBeDefined();
165
+ });
166
+ });
167
+
168
+ describe('알림 규칙', () => {
169
+ it('should trigger memory alert on high usage', async () => {
170
+ // Mock high memory usage
171
+ const originalMemoryUsage = process.memoryUsage;
172
+ process.memoryUsage = vi.fn().mockReturnValue({
173
+ rss: 0,
174
+ heapTotal: 1000,
175
+ heapUsed: 900, // 90% usage
176
+ external: 0,
177
+ arrayBuffers: 0
178
+ });
179
+
180
+ await performanceMonitor.collectMetrics();
181
+
182
+ const alerts = performanceMonitor.getActiveAlerts();
183
+ const memoryAlert = alerts.find(a => a.metric === 'memory.heapUsed');
184
+
185
+ expect(memoryAlert).toBeDefined();
186
+ expect(memoryAlert?.severity).toBe('critical');
187
+
188
+ // Restore original function
189
+ process.memoryUsage = originalMemoryUsage;
190
+ });
191
+
192
+ it('should trigger query time alert on slow queries', async () => {
193
+ // Record slow query times
194
+ performanceMonitor.recordQueryTime(150); // Above threshold of 100
195
+ performanceMonitor.recordQueryTime(200);
196
+
197
+ await performanceMonitor.collectMetrics();
198
+
199
+ const alerts = performanceMonitor.getActiveAlerts();
200
+ const queryAlert = alerts.find(a => a.metric === 'database.queryTime');
201
+
202
+ expect(queryAlert).toBeDefined();
203
+ expect(queryAlert?.severity).toBe('warning');
204
+ });
205
+ });
206
+
207
+ describe('메트릭 히스토리', () => {
208
+ it('should maintain metrics history', async () => {
209
+ await performanceMonitor.collectMetrics();
210
+ await performanceMonitor.collectMetrics();
211
+ await performanceMonitor.collectMetrics();
212
+
213
+ const summary = performanceMonitor.getPerformanceSummary();
214
+ expect(summary.lastMetrics).toBeDefined();
215
+ });
216
+
217
+ it('should limit metrics history size', async () => {
218
+ // Collect more than MAX_METRICS_HISTORY (100) metrics
219
+ for (let i = 0; i < 150; i++) {
220
+ await performanceMonitor.collectMetrics();
221
+ }
222
+
223
+ // Should not throw and should maintain reasonable history size
224
+ const summary = performanceMonitor.getPerformanceSummary();
225
+ expect(summary.lastMetrics).toBeDefined();
226
+ });
227
+ });
228
+ });
@@ -0,0 +1,171 @@
1
+ /**
2
+ * 성능 모니터링 기능 테스트
3
+ * Memento MCP 서버의 성능 모니터링 도구들 테스트
4
+ */
5
+
6
+ import { createMementoClient } from '../client/index.js';
7
+
8
+ async function testPerformanceMonitoring() {
9
+ console.log('📊 성능 모니터링 기능 테스트 시작');
10
+
11
+ const client = createMementoClient();
12
+
13
+ try {
14
+ // 1. 서버 연결
15
+ console.log('\n1️⃣ 서버 연결 중...');
16
+ await client.connect();
17
+ console.log('✅ Memento MCP 서버에 연결되었습니다');
18
+
19
+ // 2. 테스트 데이터 생성
20
+ console.log('\n2️⃣ 테스트 데이터 생성');
21
+ const testMemories = [];
22
+ for (let i = 0; i < 20; i++) {
23
+ const id = await client.remember({
24
+ content: `성능 테스트 메모리 ${i}: 다양한 타입의 메모리를 생성하여 성능을 측정합니다.`,
25
+ type: i % 2 === 0 ? 'episodic' : 'semantic',
26
+ tags: ['performance', 'test', `batch-${Math.floor(i / 5)}`],
27
+ importance: 0.5 + Math.random() * 0.5,
28
+ source: 'performance-test'
29
+ });
30
+ testMemories.push(id);
31
+ console.log(`✅ 저장됨: ${id.substring(0, 20)}...`);
32
+ }
33
+
34
+ // 3. 성능 통계 조회
35
+ console.log('\n3️⃣ 성능 통계 조회');
36
+ try {
37
+ const perfStats = await client.callTool('performance_stats', {});
38
+ console.log('📊 성능 통계:');
39
+ console.log(` 데이터베이스:`);
40
+ console.log(` 총 메모리: ${perfStats.metrics?.database?.totalMemories || 0}개`);
41
+ console.log(` 데이터베이스 크기: ${((perfStats.metrics?.database?.databaseSize || 0) / 1024 / 1024).toFixed(2)} MB`);
42
+ console.log(` 평균 메모리 크기: ${perfStats.metrics?.database?.averageMemorySize || 0} 문자`);
43
+ console.log(` 평균 쿼리 시간: ${perfStats.metrics?.database?.queryPerformance?.averageQueryTime?.toFixed(2) || 'N/A'}ms`);
44
+
45
+ console.log(` 검색:`);
46
+ console.log(` 총 검색: ${perfStats.metrics?.search?.totalSearches || 0}회`);
47
+ console.log(` 평균 검색 시간: ${perfStats.metrics?.search?.averageSearchTime || 0}ms`);
48
+ console.log(` 캐시 적중률: ${((perfStats.metrics?.search?.cacheHitRate || 0) * 100).toFixed(1)}%`);
49
+
50
+ console.log(` 메모리 사용량:`);
51
+ console.log(` 힙 사용량: ${((perfStats.metrics?.memory?.heapUsed || 0) / 1024 / 1024).toFixed(2)} MB`);
52
+ console.log(` RSS: ${((perfStats.metrics?.memory?.rss || 0) / 1024 / 1024).toFixed(2)} MB`);
53
+
54
+ console.log(` 시스템:`);
55
+ console.log(` 가동 시간: ${Math.floor((perfStats.metrics?.system?.uptime || 0) / 60)}분`);
56
+
57
+ } catch (error) {
58
+ console.error(` ❌ 성능 통계 조회 실패: ${error}`);
59
+ }
60
+
61
+ // 4. 데이터베이스 최적화 (분석만)
62
+ console.log('\n4️⃣ 데이터베이스 최적화 (분석)');
63
+ try {
64
+ const optimizeResult = await client.callTool('database_optimize', {
65
+ analyze: true,
66
+ create_indexes: false
67
+ });
68
+ console.log('🔧 데이터베이스 최적화 결과:');
69
+ console.log(` 메시지: ${optimizeResult.message}`);
70
+ console.log(` 수행된 작업: ${optimizeResult.operations?.join(', ') || '없음'}`);
71
+
72
+ if (optimizeResult.report) {
73
+ console.log('📋 최적화 리포트:');
74
+ console.log(optimizeResult.report);
75
+ }
76
+ } catch (error) {
77
+ console.error(` ❌ 데이터베이스 최적화 실패: ${error}`);
78
+ }
79
+
80
+ // 5. 검색 성능 테스트
81
+ console.log('\n5️⃣ 검색 성능 테스트');
82
+ const searchQueries = [
83
+ '성능 테스트',
84
+ '메모리',
85
+ '데이터베이스',
86
+ '최적화',
87
+ '벤치마크'
88
+ ];
89
+
90
+ for (const query of searchQueries) {
91
+ const startTime = process.hrtime.bigint();
92
+ try {
93
+ const results = await client.recall({ query, limit: 5 });
94
+ const endTime = process.hrtime.bigint();
95
+ const searchTime = Number(endTime - startTime) / 1_000_000;
96
+
97
+ console.log(` 🔍 "${query}": ${results.length}개 결과 (${searchTime.toFixed(2)}ms)`);
98
+ } catch (error) {
99
+ console.error(` ❌ 검색 실패 ("${query}"): ${error}`);
100
+ }
101
+ }
102
+
103
+ // 6. 망각 통계 조회
104
+ console.log('\n6️⃣ 망각 통계 조회');
105
+ try {
106
+ const forgettingStats = await client.callTool('forgetting_stats', {});
107
+ console.log('🧠 망각 통계:');
108
+ console.log(` 총 메모리: ${forgettingStats.stats?.totalMemories || 0}개`);
109
+ console.log(` 망각 후보: ${forgettingStats.stats?.forgetCandidates || 0}개`);
110
+ console.log(` 리뷰 후보: ${forgettingStats.stats?.reviewCandidates || 0}개`);
111
+ console.log(` 평균 망각 점수: ${forgettingStats.stats?.averageForgetScore?.toFixed(3) || 'N/A'}`);
112
+ console.log(` 메모리 분포:`, forgettingStats.stats?.memoryDistribution || {});
113
+ } catch (error) {
114
+ console.error(` ❌ 망각 통계 조회 실패: ${error}`);
115
+ }
116
+
117
+ // 7. 메모리 정리 (드라이런)
118
+ console.log('\n7️⃣ 메모리 정리 (드라이런)');
119
+ try {
120
+ const cleanupResult = await client.callTool('cleanup_memory', { dry_run: true });
121
+ console.log('🧹 메모리 정리 분석:');
122
+ console.log(` 모드: ${cleanupResult.mode}`);
123
+ console.log(` 총 메모리: ${cleanupResult.stats?.totalMemories || 0}개`);
124
+ console.log(` 망각 후보: ${cleanupResult.stats?.forgetCandidates || 0}개`);
125
+ console.log(` 리뷰 후보: ${cleanupResult.stats?.reviewCandidates || 0}개`);
126
+ console.log(` 평균 망각 점수: ${cleanupResult.stats?.averageForgetScore?.toFixed(3) || 'N/A'}`);
127
+ } catch (error) {
128
+ console.error(` ❌ 메모리 정리 분석 실패: ${error}`);
129
+ }
130
+
131
+ // 8. 최종 성능 통계
132
+ console.log('\n8️⃣ 최종 성능 통계');
133
+ try {
134
+ const finalStats = await client.callTool('performance_stats', {});
135
+ console.log('📊 최종 성능 통계:');
136
+ console.log(` 데이터베이스:`);
137
+ console.log(` 총 메모리: ${finalStats.metrics?.database?.totalMemories || 0}개`);
138
+ console.log(` 평균 쿼리 시간: ${finalStats.metrics?.database?.queryPerformance?.averageQueryTime?.toFixed(2) || 'N/A'}ms`);
139
+
140
+ console.log(` 검색:`);
141
+ console.log(` 총 검색: ${finalStats.metrics?.search?.totalSearches || 0}회`);
142
+ console.log(` 평균 검색 시간: ${finalStats.metrics?.search?.averageSearchTime || 0}ms`);
143
+
144
+ console.log(` 메모리 사용량:`);
145
+ console.log(` 힙 사용량: ${((finalStats.metrics?.memory?.heapUsed || 0) / 1024 / 1024).toFixed(2)} MB`);
146
+
147
+ } catch (error) {
148
+ console.error(` ❌ 최종 성능 통계 조회 실패: ${error}`);
149
+ }
150
+
151
+ console.log('\n🎉 성능 모니터링 기능 테스트 완료!');
152
+
153
+ } catch (error) {
154
+ console.error('❌ 테스트 실패:', error);
155
+ } finally {
156
+ await client.disconnect();
157
+ }
158
+ }
159
+
160
+ // 테스트 실행
161
+ if (process.argv[1] && process.argv[1].endsWith('test-performance-monitoring.ts')) {
162
+ testPerformanceMonitoring()
163
+ .then(() => {
164
+ console.log('✅ 성능 모니터링 테스트 완료');
165
+ process.exit(0);
166
+ })
167
+ .catch((error) => {
168
+ console.error('❌ 성능 모니터링 테스트 실패:', error);
169
+ process.exit(1);
170
+ });
171
+ }