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,875 @@
1
+ /**
2
+ * Memento MCP Server 메인 진입점
3
+ */
4
+
5
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
7
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
8
+ import { z } from 'zod';
9
+ import { initializeDatabase, closeDatabase } from '../database/init.js';
10
+ import { mementoConfig, validateConfig } from '../config/index.js';
11
+ import type { MemoryType, PrivacyScope } from '../types/index.js';
12
+ import { DatabaseUtils } from '../utils/database.js';
13
+ import { SearchEngine } from '../algorithms/search-engine.js';
14
+ import { HybridSearchEngine } from '../algorithms/hybrid-search-engine.js';
15
+ import { MemoryEmbeddingService } from '../services/memory-embedding-service.js';
16
+ import { ForgettingPolicyService } from '../services/forgetting-policy-service.js';
17
+ import { PerformanceMonitor } from '../services/performance-monitor.js';
18
+ import { SearchCacheService } from '../services/cache-service.js';
19
+ import { DatabaseOptimizer } from '../services/database-optimizer.js';
20
+ import Database from 'better-sqlite3';
21
+
22
+ // MCP 서버 인스턴스
23
+ let server: Server;
24
+ let db: Database.Database | null = null;
25
+ let searchEngine: SearchEngine;
26
+ let hybridSearchEngine: HybridSearchEngine;
27
+ let embeddingService: MemoryEmbeddingService;
28
+ let forgettingPolicyService: ForgettingPolicyService;
29
+ let performanceMonitor: PerformanceMonitor;
30
+ let searchCache: SearchCacheService;
31
+ let databaseOptimizer: DatabaseOptimizer;
32
+
33
+ // MCP 서버에서는 모든 로그 출력을 완전히 차단
34
+ // 모든 console 메서드를 빈 함수로 교체
35
+ console.log = () => {};
36
+ console.error = () => {};
37
+ console.warn = () => {};
38
+ console.info = () => {};
39
+ console.debug = () => {};
40
+
41
+ // MCP Tools 스키마 정의
42
+ const RememberSchema = z.object({
43
+ content: z.string().min(1, 'Content cannot be empty'),
44
+ type: z.enum(['working', 'episodic', 'semantic', 'procedural']).default('episodic'),
45
+ tags: z.array(z.string()).optional(),
46
+ importance: z.number().min(0).max(1).default(0.5),
47
+ source: z.string().optional(),
48
+ privacy_scope: z.enum(['private', 'team', 'public']).default('private')
49
+ });
50
+
51
+ const RecallSchema = z.object({
52
+ query: z.string().min(1, 'Query cannot be empty'),
53
+ filters: z.object({
54
+ type: z.array(z.enum(['working', 'episodic', 'semantic', 'procedural'])).optional(),
55
+ tags: z.array(z.string()).optional(),
56
+ privacy_scope: z.array(z.enum(['private', 'team', 'public'])).optional(),
57
+ time_from: z.string().optional(),
58
+ time_to: z.string().optional(),
59
+ pinned: z.boolean().optional()
60
+ }).optional(),
61
+ limit: z.number().min(1).max(50).default(10)
62
+ });
63
+
64
+ const ForgetSchema = z.object({
65
+ id: z.string().min(1, 'Memory ID cannot be empty'),
66
+ hard: z.boolean().default(false)
67
+ });
68
+
69
+ const PinSchema = z.object({
70
+ id: z.string().min(1, 'Memory ID cannot be empty')
71
+ });
72
+
73
+ const UnpinSchema = z.object({
74
+ id: z.string().min(1, 'Memory ID cannot be empty')
75
+ });
76
+
77
+ // 망각 정책 관련 스키마
78
+ const CleanupMemorySchema = z.object({
79
+ dry_run: z.boolean().default(false).optional()
80
+ });
81
+
82
+ const ForgettingStatsSchema = z.object({});
83
+
84
+ // 성능 모니터링 관련 스키마
85
+ const PerformanceStatsSchema = z.object({});
86
+ const DatabaseOptimizeSchema = z.object({
87
+ analyze: z.boolean().default(false).optional(),
88
+ create_indexes: z.boolean().default(false).optional()
89
+ });
90
+
91
+ // Tool 핸들러들 (개선된 구현)
92
+ async function handleRemember(params: z.infer<typeof RememberSchema>) {
93
+ const { content, type, tags, importance, source, privacy_scope } = params;
94
+
95
+ // UUID 생성 (임시로 간단한 ID 사용)
96
+ const id = `mem_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
97
+
98
+ // 데이터베이스 연결 확인
99
+ if (!db) {
100
+ throw new Error('데이터베이스가 초기화되지 않았습니다');
101
+ }
102
+
103
+ try {
104
+ // 개선된 트랜잭션 재시도 로직 사용
105
+ const result = await DatabaseUtils.runTransaction(db!, async () => {
106
+ await DatabaseUtils.run(db!, `
107
+ INSERT INTO memory_item (id, type, content, importance, privacy_scope, tags, source, created_at)
108
+ VALUES (?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
109
+ `, [id, type, content, importance, privacy_scope,
110
+ tags ? JSON.stringify(tags) : null, source]);
111
+
112
+ return { id, type, content, importance, privacy_scope, tags, source };
113
+ });
114
+
115
+ // 임베딩 생성 (비동기, 실패해도 메모리 저장은 성공)
116
+ if (embeddingService.isAvailable()) {
117
+ embeddingService.createAndStoreEmbedding(db, id, content, type)
118
+ .then(result => {
119
+ if (result) {
120
+ // 임베딩 생성 완료
121
+ }
122
+ })
123
+ .catch(error => {
124
+ console.warn(`⚠️ 임베딩 생성 실패 (${id}):`, error.message);
125
+ });
126
+ }
127
+
128
+ return {
129
+ content: [
130
+ {
131
+ type: 'text',
132
+ text: JSON.stringify({
133
+ memory_id: id,
134
+ message: `기억이 저장되었습니다: ${id}`,
135
+ embedding_created: embeddingService.isAvailable()
136
+ })
137
+ }
138
+ ]
139
+ };
140
+ } catch (error) {
141
+ // 데이터베이스 락 문제인 경우 WAL 체크포인트 시도
142
+ if ((error as any).code === 'SQLITE_BUSY') {
143
+ // 데이터베이스 락 감지, WAL 체크포인트 시도
144
+ try {
145
+ await DatabaseUtils.checkpointWAL(db);
146
+ // WAL 체크포인트 완료
147
+ } catch (checkpointError) {
148
+ // WAL 체크포인트 실패
149
+ }
150
+ }
151
+ throw error;
152
+ }
153
+ }
154
+
155
+ async function handleRecall(params: z.infer<typeof RecallSchema>) {
156
+ const { query, filters, limit } = params;
157
+
158
+ if (!db) {
159
+ throw new Error('데이터베이스가 초기화되지 않았습니다');
160
+ }
161
+
162
+ if (!hybridSearchEngine) {
163
+ throw new Error('하이브리드 검색 엔진이 초기화되지 않았습니다');
164
+ }
165
+
166
+ // 하이브리드 검색 엔진 사용 (텍스트 + 벡터 검색)
167
+ const results = await hybridSearchEngine.search(db, {
168
+ query,
169
+ filters,
170
+ limit,
171
+ vectorWeight: 0.6, // 벡터 검색 60%
172
+ textWeight: 0.4, // 텍스트 검색 40%
173
+ });
174
+
175
+ return {
176
+ content: [
177
+ {
178
+ type: 'text',
179
+ text: JSON.stringify({
180
+ items: results,
181
+ search_type: 'hybrid',
182
+ vector_search_available: hybridSearchEngine.isEmbeddingAvailable()
183
+ })
184
+ }
185
+ ]
186
+ };
187
+ }
188
+
189
+ async function handleForget(params: z.infer<typeof ForgetSchema>) {
190
+ const { id, hard } = params;
191
+
192
+ if (!db) {
193
+ throw new Error('데이터베이스가 초기화되지 않았습니다');
194
+ }
195
+
196
+ try {
197
+ // 개선된 트랜잭션 재시도 로직 사용
198
+ const result = await DatabaseUtils.runTransaction(db!, async () => {
199
+ if (hard) {
200
+ // 하드 삭제
201
+ const deleteResult = await DatabaseUtils.run(db!, 'DELETE FROM memory_item WHERE id = ?', [id]);
202
+
203
+ if (deleteResult.changes === 0) {
204
+ throw new Error(`Memory with ID ${id} not found`);
205
+ }
206
+
207
+ return { type: 'hard', changes: deleteResult.changes };
208
+ } else {
209
+ // 소프트 삭제 (pinned 해제 후 TTL에 의해 삭제)
210
+ const updateResult = await DatabaseUtils.run(db!, 'UPDATE memory_item SET pinned = FALSE WHERE id = ?', [id]);
211
+
212
+ if (updateResult.changes === 0) {
213
+ throw new Error(`Memory with ID ${id} not found`);
214
+ }
215
+
216
+ return { type: 'soft', changes: updateResult.changes };
217
+ }
218
+ });
219
+
220
+ // 임베딩도 삭제 (하드 삭제인 경우)
221
+ if (hard && embeddingService.isAvailable()) {
222
+ try {
223
+ await embeddingService.deleteEmbedding(db, id);
224
+ } catch (embeddingError) {
225
+ console.warn(`⚠️ 임베딩 삭제 실패 (${id}):`, embeddingError);
226
+ }
227
+ }
228
+
229
+ return {
230
+ content: [
231
+ {
232
+ type: 'text',
233
+ text: JSON.stringify({
234
+ memory_id: id,
235
+ message: hard ? `기억이 완전히 삭제되었습니다: ${id}` : `기억이 삭제 대상으로 표시되었습니다: ${id}`
236
+ })
237
+ }
238
+ ]
239
+ };
240
+ } catch (error) {
241
+ // 데이터베이스 락 문제인 경우 WAL 체크포인트 시도
242
+ if ((error as any).code === 'SQLITE_BUSY') {
243
+ // 데이터베이스 락 감지, WAL 체크포인트 시도
244
+ try {
245
+ await DatabaseUtils.checkpointWAL(db);
246
+ // WAL 체크포인트 완료
247
+ } catch (checkpointError) {
248
+ // WAL 체크포인트 실패
249
+ }
250
+ }
251
+ throw error;
252
+ }
253
+ }
254
+
255
+ async function handlePin(params: z.infer<typeof PinSchema>) {
256
+ const { id } = params;
257
+
258
+ if (!db) {
259
+ throw new Error('데이터베이스가 초기화되지 않았습니다');
260
+ }
261
+
262
+ try {
263
+ // 개선된 트랜잭션 재시도 로직 사용
264
+ await DatabaseUtils.runTransaction(db!, async () => {
265
+ const result = await DatabaseUtils.run(db!, 'UPDATE memory_item SET pinned = TRUE WHERE id = ?', [id]);
266
+
267
+ if (result.changes === 0) {
268
+ throw new Error(`Memory with ID ${id} not found`);
269
+ }
270
+
271
+ return result;
272
+ });
273
+
274
+ return {
275
+ content: [
276
+ {
277
+ type: 'text',
278
+ text: JSON.stringify({
279
+ memory_id: id,
280
+ message: `기억이 고정되었습니다: ${id}`
281
+ })
282
+ }
283
+ ]
284
+ };
285
+ } catch (error) {
286
+ // 데이터베이스 락 문제인 경우 WAL 체크포인트 시도
287
+ if ((error as any).code === 'SQLITE_BUSY') {
288
+ // 데이터베이스 락 감지, WAL 체크포인트 시도
289
+ try {
290
+ await DatabaseUtils.checkpointWAL(db);
291
+ // WAL 체크포인트 완료
292
+ } catch (checkpointError) {
293
+ // WAL 체크포인트 실패
294
+ }
295
+ }
296
+ throw error;
297
+ }
298
+ }
299
+
300
+ async function handleUnpin(params: z.infer<typeof UnpinSchema>) {
301
+ const { id } = params;
302
+
303
+ if (!db) {
304
+ throw new Error('데이터베이스가 초기화되지 않았습니다');
305
+ }
306
+
307
+ try {
308
+ // 개선된 트랜잭션 재시도 로직 사용
309
+ await DatabaseUtils.runTransaction(db!, async () => {
310
+ const result = await DatabaseUtils.run(db!, 'UPDATE memory_item SET pinned = FALSE WHERE id = ?', [id]);
311
+
312
+ if (result.changes === 0) {
313
+ throw new Error(`Memory with ID ${id} not found`);
314
+ }
315
+
316
+ return result;
317
+ });
318
+
319
+ return {
320
+ content: [
321
+ {
322
+ type: 'text',
323
+ text: JSON.stringify({
324
+ memory_id: id,
325
+ message: `기억 고정이 해제되었습니다: ${id}`
326
+ })
327
+ }
328
+ ]
329
+ };
330
+ } catch (error) {
331
+ // 데이터베이스 락 문제인 경우 WAL 체크포인트 시도
332
+ if ((error as any).code === 'SQLITE_BUSY') {
333
+ // 데이터베이스 락 감지, WAL 체크포인트 시도
334
+ try {
335
+ await DatabaseUtils.checkpointWAL(db);
336
+ // WAL 체크포인트 완료
337
+ } catch (checkpointError) {
338
+ // WAL 체크포인트 실패
339
+ }
340
+ }
341
+ throw error;
342
+ }
343
+ }
344
+
345
+ // 망각 정책 핸들러들
346
+ async function handleCleanupMemory(params: z.infer<typeof CleanupMemorySchema>) {
347
+ const { dry_run } = params;
348
+
349
+ if (!db) {
350
+ throw new Error('데이터베이스가 초기화되지 않았습니다');
351
+ }
352
+
353
+ if (!forgettingPolicyService) {
354
+ throw new Error('망각 정책 서비스가 초기화되지 않았습니다');
355
+ }
356
+
357
+ try {
358
+ if (dry_run) {
359
+ // 드라이런 모드: 실제 삭제 없이 분석만 수행
360
+ const stats = await forgettingPolicyService.generateForgettingStats(db);
361
+
362
+ return {
363
+ content: [
364
+ {
365
+ type: 'text',
366
+ text: JSON.stringify({
367
+ mode: 'dry_run',
368
+ stats: {
369
+ totalMemories: stats.totalMemories,
370
+ forgetCandidates: stats.forgetCandidates,
371
+ reviewCandidates: stats.reviewCandidates,
372
+ averageForgetScore: stats.averageForgetScore,
373
+ memoryDistribution: stats.memoryDistribution
374
+ },
375
+ message: '망각 후보 분석 완료 (실제 삭제 없음)'
376
+ })
377
+ }
378
+ ]
379
+ };
380
+ } else {
381
+ // 실제 정리 실행
382
+ const result = await forgettingPolicyService.executeMemoryCleanup(db);
383
+
384
+ return {
385
+ content: [
386
+ {
387
+ type: 'text',
388
+ text: JSON.stringify({
389
+ mode: 'execution',
390
+ result: {
391
+ softDeleted: result.softDeleted,
392
+ hardDeleted: result.hardDeleted,
393
+ reviewed: result.reviewed,
394
+ totalProcessed: result.totalProcessed,
395
+ summary: result.summary
396
+ },
397
+ message: `메모리 정리 완료: 소프트 삭제 ${result.summary.actualSoftDeletes}개, 하드 삭제 ${result.summary.actualHardDeletes}개, 리뷰 ${result.summary.actualReviews}개`
398
+ })
399
+ }
400
+ ]
401
+ };
402
+ }
403
+ } catch (error) {
404
+ throw new Error(`메모리 정리 실패: ${error instanceof Error ? error.message : 'Unknown error'}`);
405
+ }
406
+ }
407
+
408
+ async function handleForgettingStats(params: z.infer<typeof ForgettingStatsSchema>) {
409
+ if (!db) {
410
+ throw new Error('데이터베이스가 초기화되지 않았습니다');
411
+ }
412
+
413
+ if (!forgettingPolicyService) {
414
+ throw new Error('망각 정책 서비스가 초기화되지 않았습니다');
415
+ }
416
+
417
+ try {
418
+ const stats = await forgettingPolicyService.generateForgettingStats(db);
419
+
420
+ return {
421
+ content: [
422
+ {
423
+ type: 'text',
424
+ text: JSON.stringify({
425
+ stats: {
426
+ totalMemories: stats.totalMemories,
427
+ forgetCandidates: stats.forgetCandidates,
428
+ reviewCandidates: stats.reviewCandidates,
429
+ averageForgetScore: stats.averageForgetScore,
430
+ memoryDistribution: stats.memoryDistribution
431
+ },
432
+ message: '망각 통계 조회 완료'
433
+ })
434
+ }
435
+ ]
436
+ };
437
+ } catch (error) {
438
+ throw new Error(`망각 통계 조회 실패: ${error instanceof Error ? error.message : 'Unknown error'}`);
439
+ }
440
+ }
441
+
442
+ // 성능 모니터링 핸들러들
443
+ async function handlePerformanceStats(params: z.infer<typeof PerformanceStatsSchema>) {
444
+ if (!db) {
445
+ throw new Error('데이터베이스가 초기화되지 않았습니다');
446
+ }
447
+
448
+ if (!performanceMonitor) {
449
+ throw new Error('성능 모니터가 초기화되지 않았습니다');
450
+ }
451
+
452
+ try {
453
+ const metrics = await performanceMonitor.collectMetrics();
454
+ const report = await performanceMonitor.generateReport();
455
+
456
+ return {
457
+ content: [
458
+ {
459
+ type: 'text',
460
+ text: JSON.stringify({
461
+ metrics: {
462
+ database: metrics.database,
463
+ search: metrics.search,
464
+ memory: metrics.memory,
465
+ system: metrics.system
466
+ },
467
+ report: report,
468
+ message: '성능 통계 조회 완료'
469
+ })
470
+ }
471
+ ]
472
+ };
473
+ } catch (error) {
474
+ throw new Error(`성능 통계 조회 실패: ${error instanceof Error ? error.message : 'Unknown error'}`);
475
+ }
476
+ }
477
+
478
+ async function handleDatabaseOptimize(params: z.infer<typeof DatabaseOptimizeSchema>) {
479
+ const { analyze, create_indexes } = params;
480
+
481
+ if (!db) {
482
+ throw new Error('데이터베이스가 초기화되지 않았습니다');
483
+ }
484
+
485
+ if (!databaseOptimizer) {
486
+ throw new Error('데이터베이스 최적화기가 초기화되지 않았습니다');
487
+ }
488
+
489
+ try {
490
+ const results: any = {
491
+ message: '데이터베이스 최적화 완료',
492
+ operations: []
493
+ };
494
+
495
+ if (analyze) {
496
+ await databaseOptimizer.analyzeDatabase();
497
+ results.operations.push('데이터베이스 분석 완료');
498
+ }
499
+
500
+ if (create_indexes) {
501
+ const recommendations = await databaseOptimizer.generateIndexRecommendations();
502
+ const highPriorityRecs = recommendations.filter(r => r.priority === 'high');
503
+
504
+ for (const rec of highPriorityRecs) {
505
+ const indexName = `idx_${rec.table}_${rec.columns.join('_')}`;
506
+ await databaseOptimizer.createIndex(indexName, rec.table, rec.columns);
507
+ results.operations.push(`인덱스 생성: ${indexName}`);
508
+ }
509
+ }
510
+
511
+ const report = await databaseOptimizer.generateOptimizationReport();
512
+
513
+ return {
514
+ content: [
515
+ {
516
+ type: 'text',
517
+ text: JSON.stringify({
518
+ ...results,
519
+ report: report
520
+ })
521
+ }
522
+ ]
523
+ };
524
+ } catch (error) {
525
+ throw new Error(`데이터베이스 최적화 실패: ${error instanceof Error ? error.message : 'Unknown error'}`);
526
+ }
527
+ }
528
+
529
+ // 데이터베이스 상태 모니터링
530
+ async function monitorDatabaseStatus() {
531
+ if (!db) return;
532
+
533
+ try {
534
+ const status = await DatabaseUtils.getDatabaseStatus(db);
535
+ log('📊 데이터베이스 상태:', {
536
+ journalMode: status.journalMode,
537
+ walAutoCheckpoint: status.walAutoCheckpoint,
538
+ busyTimeout: status.busyTimeout,
539
+ isLocked: status.isLocked ? '🔒 잠김' : '🔓 정상'
540
+ });
541
+
542
+ // 락이 감지되면 WAL 체크포인트 실행
543
+ if (status.isLocked) {
544
+ log('⚠️ 데이터베이스 락 감지, WAL 체크포인트 실행...');
545
+ await DatabaseUtils.checkpointWAL(db);
546
+ }
547
+ } catch (error) {
548
+ // 데이터베이스 상태 모니터링 실패
549
+ }
550
+ }
551
+
552
+ // MCP 모드 감지 (stdio를 통해 실행되는지 확인)
553
+ const isMCPMode = process.stdin.isTTY === false && process.stdout.isTTY === false;
554
+
555
+ // MCP 모드에서는 로그를 stderr로 출력
556
+ const log = isMCPMode ? console.error : console.log;
557
+
558
+ // MCP 서버 초기화
559
+ async function initializeServer() {
560
+ try {
561
+ process.stderr.write('🚀 MCP 서버 초기화 시작...\n');
562
+
563
+ // 설정 검증
564
+ validateConfig();
565
+ process.stderr.write('✅ 설정 검증 완료\n');
566
+
567
+ // 데이터베이스 초기화
568
+ db = await initializeDatabase();
569
+ process.stderr.write('✅ 데이터베이스 초기화 완료\n');
570
+
571
+ // 데이터베이스 상태 모니터링
572
+ await monitorDatabaseStatus();
573
+ process.stderr.write('✅ 데이터베이스 상태 모니터링 완료\n');
574
+
575
+ // 검색 엔진 초기화
576
+ searchEngine = new SearchEngine();
577
+ hybridSearchEngine = new HybridSearchEngine();
578
+ embeddingService = new MemoryEmbeddingService();
579
+ forgettingPolicyService = new ForgettingPolicyService();
580
+ performanceMonitor = new PerformanceMonitor(db);
581
+ searchCache = new SearchCacheService(1000, 300000); // 5분 TTL
582
+ databaseOptimizer = new DatabaseOptimizer(db);
583
+ process.stderr.write('✅ 검색 엔진 초기화 완료\n');
584
+
585
+ // MCP 서버 생성
586
+ server = new Server(
587
+ {
588
+ name: mementoConfig.serverName,
589
+ version: mementoConfig.serverVersion,
590
+ },
591
+ {
592
+ capabilities: {
593
+ tools: {},
594
+ resources: {},
595
+ prompts: {}
596
+ }
597
+ }
598
+ );
599
+ process.stderr.write('✅ MCP 서버 생성 완료\n');
600
+
601
+ // Tools 등록
602
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
603
+ process.stderr.write('📋 도구 목록 요청 처리\n');
604
+ return {
605
+ tools: [
606
+ {
607
+ name: 'remember',
608
+ description: '새로운 기억을 저장합니다',
609
+ inputSchema: {
610
+ type: 'object',
611
+ properties: {
612
+ content: { type: 'string', description: '저장할 내용' },
613
+ type: {
614
+ type: 'string',
615
+ enum: ['working', 'episodic', 'semantic', 'procedural'],
616
+ description: '기억 타입',
617
+ default: 'episodic'
618
+ },
619
+ tags: {
620
+ type: 'array',
621
+ items: { type: 'string' },
622
+ description: '태그 목록'
623
+ },
624
+ importance: {
625
+ type: 'number',
626
+ minimum: 0,
627
+ maximum: 1,
628
+ description: '중요도 (0-1)',
629
+ default: 0.5
630
+ },
631
+ source: { type: 'string', description: '출처' },
632
+ privacy_scope: {
633
+ type: 'string',
634
+ enum: ['private', 'team', 'public'],
635
+ description: '프라이버시 범위',
636
+ default: 'private'
637
+ }
638
+ },
639
+ required: ['content']
640
+ }
641
+ },
642
+ {
643
+ name: 'recall',
644
+ description: '관련 기억을 검색합니다',
645
+ inputSchema: {
646
+ type: 'object',
647
+ properties: {
648
+ query: { type: 'string', description: '검색 쿼리' },
649
+ filters: {
650
+ type: 'object',
651
+ properties: {
652
+ type: {
653
+ type: 'array',
654
+ items: { type: 'string', enum: ['working', 'episodic', 'semantic', 'procedural'] }
655
+ },
656
+ tags: { type: 'array', items: { type: 'string' } },
657
+ privacy_scope: {
658
+ type: 'array',
659
+ items: { type: 'string', enum: ['private', 'team', 'public'] }
660
+ },
661
+ time_from: { type: 'string' },
662
+ time_to: { type: 'string' },
663
+ pinned: { type: 'boolean' }
664
+ }
665
+ },
666
+ limit: { type: 'number', minimum: 1, maximum: 50, default: 10 }
667
+ },
668
+ required: ['query']
669
+ }
670
+ },
671
+ {
672
+ name: 'forget',
673
+ description: '기억을 삭제합니다',
674
+ inputSchema: {
675
+ type: 'object',
676
+ properties: {
677
+ id: { type: 'string', description: '삭제할 기억의 ID' },
678
+ hard: { type: 'boolean', description: '완전 삭제 여부', default: false }
679
+ },
680
+ required: ['id']
681
+ }
682
+ },
683
+ {
684
+ name: 'pin',
685
+ description: '기억을 고정합니다',
686
+ inputSchema: {
687
+ type: 'object',
688
+ properties: {
689
+ id: { type: 'string', description: '고정할 기억의 ID' }
690
+ },
691
+ required: ['id']
692
+ }
693
+ },
694
+ {
695
+ name: 'unpin',
696
+ description: '기억 고정을 해제합니다',
697
+ inputSchema: {
698
+ type: 'object',
699
+ properties: {
700
+ id: { type: 'string', description: '고정 해제할 기억의 ID' }
701
+ },
702
+ required: ['id']
703
+ }
704
+ },
705
+ {
706
+ name: 'cleanup_memory',
707
+ description: '망각 정책에 따라 메모리를 정리합니다',
708
+ inputSchema: {
709
+ type: 'object',
710
+ properties: {
711
+ dry_run: {
712
+ type: 'boolean',
713
+ description: '드라이런 모드 (실제 삭제 없이 분석만)',
714
+ default: false
715
+ }
716
+ }
717
+ }
718
+ },
719
+ {
720
+ name: 'forgetting_stats',
721
+ description: '망각 통계를 조회합니다',
722
+ inputSchema: {
723
+ type: 'object',
724
+ properties: {}
725
+ }
726
+ },
727
+ {
728
+ name: 'performance_stats',
729
+ description: '성능 통계를 조회합니다',
730
+ inputSchema: {
731
+ type: 'object',
732
+ properties: {}
733
+ }
734
+ },
735
+ {
736
+ name: 'database_optimize',
737
+ description: '데이터베이스 최적화를 수행합니다',
738
+ inputSchema: {
739
+ type: 'object',
740
+ properties: {
741
+ analyze: {
742
+ type: 'boolean',
743
+ description: '데이터베이스 분석 실행',
744
+ default: false
745
+ },
746
+ create_indexes: {
747
+ type: 'boolean',
748
+ description: '추천 인덱스 생성',
749
+ default: false
750
+ }
751
+ }
752
+ }
753
+ }
754
+ ]
755
+ };
756
+ });
757
+
758
+ // Tool 실행 핸들러
759
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
760
+ const { name, arguments: args } = request.params;
761
+ process.stderr.write(`🔧 도구 실행 요청: ${name}\n`);
762
+
763
+ try {
764
+ switch (name) {
765
+ case 'remember':
766
+ return await handleRemember(RememberSchema.parse(args));
767
+ case 'recall':
768
+ return await handleRecall(RecallSchema.parse(args));
769
+ case 'forget':
770
+ return await handleForget(ForgetSchema.parse(args));
771
+ case 'pin':
772
+ return await handlePin(PinSchema.parse(args));
773
+ case 'unpin':
774
+ return await handleUnpin(UnpinSchema.parse(args));
775
+
776
+ case 'cleanup_memory':
777
+ return await handleCleanupMemory(CleanupMemorySchema.parse(args));
778
+
779
+ case 'forgetting_stats':
780
+ return await handleForgettingStats(ForgettingStatsSchema.parse(args));
781
+
782
+ case 'performance_stats':
783
+ return await handlePerformanceStats(PerformanceStatsSchema.parse(args));
784
+
785
+ case 'database_optimize':
786
+ return await handleDatabaseOptimize(DatabaseOptimizeSchema.parse(args));
787
+
788
+ default:
789
+ throw new Error(`Unknown tool: ${name}`);
790
+ }
791
+ } catch (error) {
792
+ if (error instanceof z.ZodError) {
793
+ throw new Error(`Invalid parameters: ${error.errors.map(e => e.message).join(', ')}`);
794
+ }
795
+ throw error;
796
+ }
797
+ });
798
+
799
+ process.stderr.write('✅ MCP 서버 초기화 완료\n');
800
+ process.stderr.write('🚀 Memento MCP Server가 시작되었습니다!\n');
801
+
802
+ } catch (error) {
803
+ process.stderr.write(`❌ 서버 초기화 실패: ${error}\n`);
804
+ process.exit(1);
805
+ }
806
+ }
807
+
808
+ // 서버 시작
809
+ async function startServer() {
810
+ try {
811
+ await initializeServer();
812
+ process.stderr.write('✅ 서버 초기화 완료\n');
813
+
814
+ // Stdio 전송 계층 사용
815
+ const transport = new StdioServerTransport();
816
+ await server.connect(transport);
817
+ process.stderr.write('✅ MCP 전송 계층 연결 완료\n');
818
+
819
+ // MCP 클라이언트 연결 대기 중
820
+ process.stderr.write('🔗 MCP 클라이언트 연결 대기 중...\n');
821
+
822
+ // 서버가 종료될 때까지 대기
823
+ return new Promise<void>((resolve) => {
824
+ process.on('SIGINT', () => {
825
+ process.stderr.write('👋 서버 종료 신호 수신\n');
826
+ cleanup().then(() => {
827
+ process.exit(0);
828
+ });
829
+ });
830
+
831
+ process.on('SIGTERM', () => {
832
+ process.stderr.write('👋 서버 종료 신호 수신\n');
833
+ cleanup().then(() => {
834
+ process.exit(0);
835
+ });
836
+ });
837
+ });
838
+ } catch (error) {
839
+ process.stderr.write(`❌ 서버 시작 실패: ${error}\n`);
840
+ process.exit(1);
841
+ }
842
+ }
843
+
844
+ // 정리 함수
845
+ let isCleaningUp = false;
846
+
847
+ async function cleanup() {
848
+ if (isCleaningUp) {
849
+ return; // 이미 정리 중이면 중복 실행 방지
850
+ }
851
+
852
+ isCleaningUp = true;
853
+
854
+ if (db) {
855
+ closeDatabase(db);
856
+ db = null; // 참조 제거
857
+ }
858
+ // Memento MCP Server 종료
859
+ }
860
+
861
+ // 프로세스 종료 시 정리
862
+ process.on('SIGINT', cleanup);
863
+ process.on('SIGTERM', cleanup);
864
+ process.on('uncaughtException', (error) => {
865
+ // 예상치 못한 오류
866
+ cleanup();
867
+ process.exit(1);
868
+ });
869
+
870
+ // 서버 시작
871
+ if (process.argv[1] && process.argv[1].endsWith('index.js')) {
872
+ startServer().catch(error => {
873
+ process.exit(1);
874
+ });
875
+ }