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,1302 @@
1
+ # 아키텍처 문서
2
+
3
+ ## 개요
4
+
5
+ Memento MCP Server는 AI Agent의 기억을 인간의 기억 체계를 모사하여 관리하는 시스템입니다. 이 문서는 시스템의 전체 아키텍처, 컴포넌트 간 상호작용, 데이터 플로우를 상세히 설명합니다.
6
+
7
+ ## 목차
8
+
9
+ 1. [시스템 아키텍처](#시스템-아키텍처)
10
+ 2. [핵심 컴포넌트](#핵심-컴포넌트)
11
+ 3. [데이터 모델](#데이터-모델)
12
+ 4. [검색 시스템](#검색-시스템)
13
+ 5. [망각 시스템](#망각-시스템)
14
+ 6. [마일스톤별 아키텍처](#마일스톤별-아키텍처)
15
+ 7. [성능 고려사항](#성능-고려사항)
16
+ 8. [보안 아키텍처](#보안-아키텍처)
17
+
18
+ ## 시스템 아키텍처
19
+
20
+ ### 전체 아키텍처 다이어그램
21
+
22
+ ```mermaid
23
+ graph TB
24
+ subgraph "AI Agent Layer"
25
+ A[Claude Desktop] --> B[MCP Client]
26
+ C[ChatGPT] --> B
27
+ D[Cursor] --> B
28
+ E[Other AI Agents] --> B
29
+ end
30
+
31
+ subgraph "MCP Protocol Layer"
32
+ B --> F[MCP Memory Server]
33
+ end
34
+
35
+ subgraph "Memory Management Layer"
36
+ F --> G[Memory Manager]
37
+ F --> H[Search Engine]
38
+ F --> I[Forgetting Policy]
39
+ F --> J[Spaced Review]
40
+ F --> K[Error Logging Service]
41
+ F --> L[Performance Alert Service]
42
+ F --> M[Performance Monitoring Integration]
43
+ end
44
+
45
+ subgraph "Storage Layer"
46
+ G --> N[SQLite M1]
47
+ G --> O[PostgreSQL M3+]
48
+ H --> P[Vector Search]
49
+ H --> Q[Text Search]
50
+ I --> R[Memory Queue]
51
+ K --> S[Error Logs]
52
+ L --> T[Alert Logs]
53
+ end
54
+
55
+ subgraph "Data Processing"
56
+ J --> U[Memory Consolidation]
57
+ I --> V[Memory Deletion]
58
+ U --> W[Memory Summary]
59
+ M --> X[Real-time Monitoring]
60
+ K --> Y[Error Analysis]
61
+ L --> Z[Alert Management]
62
+ end
63
+ ```
64
+
65
+ ### 레이어별 역할
66
+
67
+ #### 1. AI Agent Layer
68
+ - **역할**: MCP 클라이언트를 통해 기억 시스템과 상호작용
69
+ - **구성요소**: Claude Desktop, ChatGPT, Cursor 등
70
+ - **특징**: 다양한 AI Agent가 동일한 MCP 프로토콜 사용
71
+
72
+ #### 2. MCP Protocol Layer
73
+ - **역할**: 표준화된 통신 프로토콜 제공
74
+ - **구성요소**: MCP Memory Server
75
+ - **특징**: Tools, Resources, Prompts를 통한 기능 제공
76
+
77
+ #### 3. Memory Management Layer
78
+ - **역할**: 기억의 생성, 검색, 관리, 삭제 및 시스템 모니터링
79
+ - **구성요소**: Memory Manager, Search Engine, Forgetting Policy, Spaced Review, Error Logging Service, Performance Alert Service, Performance Monitoring Integration
80
+ - **특징**: 인간의 기억 체계를 모사한 관리 및 실시간 시스템 모니터링
81
+
82
+ #### 4. Storage Layer
83
+ - **역할**: 데이터 영구 저장 및 검색
84
+ - **구성요소**: SQLite/PostgreSQL, Vector Search, Text Search
85
+ - **특징**: 마일스톤별 다른 저장소 사용
86
+
87
+ ## 핵심 컴포넌트
88
+
89
+ ### 1. MCP Memory Server
90
+
91
+ #### 구조
92
+
93
+ ```typescript
94
+ interface MCPServer {
95
+ // Tools
96
+ tools: {
97
+ remember: RememberTool;
98
+ recall: RecallTool;
99
+ pin: PinTool;
100
+ unpin: UnpinTool;
101
+ forget: ForgetTool;
102
+ summarize_thread: SummarizeThreadTool;
103
+ link: LinkTool;
104
+ export: ExportTool;
105
+ feedback: FeedbackTool;
106
+ };
107
+
108
+ // Resources
109
+ resources: {
110
+ memory: MemoryResource;
111
+ search: SearchResource;
112
+ };
113
+
114
+ // Prompts
115
+ prompts: {
116
+ memory_injection: MemoryInjectionPrompt;
117
+ };
118
+ }
119
+ ```
120
+
121
+ #### 주요 기능
122
+
123
+ - **Tool 처리**: MCP Tools 실행 및 응답
124
+ - **Resource 제공**: 캐시된 데이터 제공
125
+ - **Prompt 생성**: 컨텍스트 주입용 프롬프트 생성
126
+ - **인증/권한**: 사용자 인증 및 권한 관리 (M2+)
127
+
128
+ ### 2. Memory Manager
129
+
130
+ #### 구조
131
+
132
+ ```typescript
133
+ interface MemoryManager {
134
+ // 기억 생성
135
+ createMemory(params: CreateMemoryParams): Promise<MemoryItem>;
136
+
137
+ // 기억 조회
138
+ getMemory(id: string): Promise<MemoryItem | null>;
139
+
140
+ // 기억 업데이트
141
+ updateMemory(id: string, updates: Partial<MemoryItem>): Promise<MemoryItem>;
142
+
143
+ // 기억 삭제
144
+ deleteMemory(id: string, hard?: boolean): Promise<boolean>;
145
+
146
+ // 기억 고정
147
+ pinMemory(id: string): Promise<boolean>;
148
+ unpinMemory(id: string): Promise<boolean>;
149
+ }
150
+ ```
151
+
152
+ #### 주요 기능
153
+
154
+ - **CRUD 작업**: 기억의 생성, 조회, 수정, 삭제
155
+ - **타입 관리**: 작업기억, 일화기억, 의미기억, 절차기억 구분
156
+ - **메타데이터 관리**: 태그, 중요도, 출처 등 관리
157
+ - **관계 관리**: 기억 간의 관계 설정 및 관리
158
+
159
+ ### 3. Search Engine
160
+
161
+ #### 구조
162
+
163
+ ```typescript
164
+ interface SearchEngine {
165
+ // 2단계 검색
166
+ search(query: string, filters?: SearchFilters): Promise<SearchResult>;
167
+
168
+ // 벡터 검색
169
+ vectorSearch(query: string, limit: number): Promise<VectorSearchResult>;
170
+
171
+ // 키워드 검색
172
+ keywordSearch(query: string, filters?: SearchFilters): Promise<KeywordSearchResult>;
173
+
174
+ // 랭킹 계산
175
+ calculateRanking(results: SearchResult[]): Promise<RankedResult[]>;
176
+ }
177
+ ```
178
+
179
+ #### 검색 파이프라인
180
+
181
+ ```mermaid
182
+ graph LR
183
+ A[검색 쿼리] --> B[쿼리 전처리]
184
+ B --> C[벡터 검색]
185
+ B --> D[키워드 검색]
186
+ C --> E[결과 병합]
187
+ D --> E
188
+ E --> F[랭킹 계산]
189
+ F --> G[MMR 다양성 제어]
190
+ G --> H[최종 결과]
191
+ ```
192
+
193
+ #### 랭킹 알고리즘
194
+
195
+ ```typescript
196
+ interface SearchRanking {
197
+ calculateFinalScore(features: SearchFeatures): number {
198
+ return this.ALPHA * features.relevance + // 0.50
199
+ this.BETA * features.recency + // 0.20
200
+ this.GAMMA * features.importance + // 0.20
201
+ this.DELTA * features.usage - // 0.10
202
+ this.EPSILON * features.duplication_penalty; // 0.15
203
+ }
204
+ }
205
+ ```
206
+
207
+ ### 4. Forgetting Policy
208
+
209
+ #### 구조
210
+
211
+ ```typescript
212
+ interface ForgettingPolicy {
213
+ // 망각 점수 계산
214
+ calculateForgetScore(memory: MemoryItem): number;
215
+
216
+ // 삭제 후보 선정
217
+ getDeletionCandidates(): Promise<MemoryItem[]>;
218
+
219
+ // 소프트 삭제
220
+ softDelete(memory: MemoryItem): Promise<boolean>;
221
+
222
+ // 하드 삭제
223
+ hardDelete(memory: MemoryItem): Promise<boolean>;
224
+ }
225
+ ```
226
+
227
+ #### 망각 알고리즘
228
+
229
+ ```typescript
230
+ interface ForgetScore {
231
+ calculate(memory: MemoryItem): number {
232
+ const age = this.calculateAge(memory.created_at);
233
+ const importance = memory.importance;
234
+ const usage = this.calculateUsage(memory);
235
+
236
+ return this.baseForgetScore *
237
+ Math.exp(-this.importanceWeight * importance) *
238
+ Math.exp(-this.usageWeight * usage) *
239
+ Math.exp(this.ageWeight * age);
240
+ }
241
+ }
242
+ ```
243
+
244
+ ### 5. Spaced Review
245
+
246
+ #### 구조
247
+
248
+ ```typescript
249
+ interface SpacedReview {
250
+ // 리뷰 스케줄 계산
251
+ calculateReviewSchedule(memory: MemoryItem): Date;
252
+
253
+ // 리뷰 대상 선정
254
+ getReviewCandidates(): Promise<MemoryItem[]>;
255
+
256
+ // 리뷰 실행
257
+ executeReview(memory: MemoryItem): Promise<ReviewResult>;
258
+
259
+ // 간격 조정
260
+ adjustInterval(memory: MemoryItem, performance: number): void;
261
+ }
262
+ ```
263
+
264
+ ### 6. Error Logging Service
265
+
266
+ #### 구조
267
+
268
+ ```typescript
269
+ interface ErrorLoggingService {
270
+ // 에러 로깅
271
+ logError(error: Error, severity: ErrorSeverity, category: ErrorCategory, context?: Record<string, any>): void;
272
+
273
+ // 에러 통계 조회
274
+ getErrorStats(filters?: ErrorFilters): Promise<ErrorStats>;
275
+
276
+ // 에러 해결
277
+ resolveError(errorId: string, resolvedBy: string, resolution?: string): Promise<boolean>;
278
+
279
+ // 에러 검색
280
+ searchErrors(filters: ErrorSearchFilters): Promise<ErrorLog[]>;
281
+ }
282
+
283
+ enum ErrorSeverity {
284
+ LOW = 'LOW',
285
+ MEDIUM = 'MEDIUM',
286
+ HIGH = 'HIGH',
287
+ CRITICAL = 'CRITICAL'
288
+ }
289
+
290
+ enum ErrorCategory {
291
+ UNKNOWN = 'UNKNOWN',
292
+ DATABASE = 'DATABASE',
293
+ NETWORK = 'NETWORK',
294
+ TOOL_EXECUTION = 'TOOL_EXECUTION',
295
+ VALIDATION = 'VALIDATION',
296
+ SYSTEM = 'SYSTEM'
297
+ }
298
+ ```
299
+
300
+ #### 주요 기능
301
+
302
+ - **구조화된 에러 로깅**: 심각도, 카테고리, 컨텍스트 정보 포함
303
+ - **에러 통계 수집**: 심각도별, 카테고리별 에러 분석
304
+ - **에러 해결 추적**: 에러 해결 상태 및 해결 방법 기록
305
+ - **실시간 모니터링**: 에러 발생 패턴 분석 및 알림
306
+
307
+ ### 7. Performance Alert Service
308
+
309
+ #### 구조
310
+
311
+ ```typescript
312
+ interface PerformanceAlertService {
313
+ // 알림 생성
314
+ createAlert(level: AlertLevel, type: AlertType, metric: string, value: number, threshold: number, message: string, context?: Record<string, any>): PerformanceAlert;
315
+
316
+ // 알림 해결
317
+ resolveAlert(alertId: string, resolvedBy: string, resolution?: string): PerformanceAlert | null;
318
+
319
+ // 활성 알림 조회
320
+ getActiveAlerts(): PerformanceAlert[];
321
+
322
+ // 알림 검색
323
+ searchAlerts(filters: AlertSearchFilters): PerformanceAlert[];
324
+
325
+ // 알림 통계
326
+ getStats(): AlertStats;
327
+ }
328
+
329
+ enum AlertLevel {
330
+ INFO = 'INFO',
331
+ WARNING = 'WARNING',
332
+ CRITICAL = 'CRITICAL'
333
+ }
334
+
335
+ enum AlertType {
336
+ RESPONSE_TIME = 'response_time',
337
+ MEMORY_USAGE = 'memory_usage',
338
+ ERROR_RATE = 'error_rate',
339
+ THROUGHPUT = 'throughput',
340
+ CUSTOM = 'custom'
341
+ }
342
+ ```
343
+
344
+ #### 주요 기능
345
+
346
+ - **임계값 기반 알림**: 성능 메트릭이 임계값을 초과할 때 자동 알림
347
+ - **알림 관리**: 알림 생성, 해결, 검색, 통계 기능
348
+ - **로그 파일 저장**: 알림을 JSONL 형식으로 파일에 저장
349
+ - **콘솔 출력**: 심각도별 색상 구분된 콘솔 알림
350
+
351
+ ### 8. Performance Monitoring Integration
352
+
353
+ #### 구조
354
+
355
+ ```typescript
356
+ interface PerformanceMonitoringIntegration {
357
+ // 실시간 모니터링 시작
358
+ startRealTimeMonitoring(): void;
359
+
360
+ // 실시간 모니터링 중지
361
+ stopRealTimeMonitoring(): void;
362
+
363
+ // 성능 체크
364
+ private checkPerformance(): Promise<void>;
365
+
366
+ // 임계값 확인
367
+ private checkResponseTime(avgResponseTime: number): void;
368
+ private checkMemoryUsage(heapUsedMB: number): void;
369
+ private checkErrorRate(errorRate: number): void;
370
+ private checkThroughput(throughput: number): void;
371
+ }
372
+
373
+ interface AlertThresholds {
374
+ responseTime: { warning: number; critical: number }; // ms
375
+ memoryUsage: { warning: number; critical: number }; // MB
376
+ errorRate: { warning: number; critical: number }; // %
377
+ throughput: { warning: number; critical: number }; // ops/sec
378
+ }
379
+ ```
380
+
381
+ #### 주요 기능
382
+
383
+ - **실시간 모니터링**: 30초마다 자동 성능 체크
384
+ - **임계값 기반 알림**: 설정된 임계값 초과 시 자동 알림 생성
385
+ - **통합 모니터링**: PerformanceMonitor와 PerformanceAlertService 연동
386
+ - **자동 복구**: 심각한 문제 발생 시 자동 복구 작업 수행
387
+
388
+ #### 간격 반복 알고리즘
389
+
390
+ ```typescript
391
+ interface SpacedRepetition {
392
+ calculateNextReview(memory: MemoryItem, performance: number): Date {
393
+ const currentInterval = memory.review_interval || 1;
394
+ const newInterval = this.calculateInterval(currentInterval, performance);
395
+
396
+ return new Date(Date.now() + newInterval * 24 * 60 * 60 * 1000);
397
+ }
398
+ }
399
+ ```
400
+
401
+ ## 데이터 모델
402
+
403
+ ### 1. 메모리 아이템
404
+
405
+ ```typescript
406
+ interface MemoryItem {
407
+ id: string; // 고유 식별자
408
+ content: string; // 기억 내용
409
+ type: 'working' | 'episodic' | 'semantic' | 'procedural'; // 기억 타입
410
+ importance: number; // 중요도 (0-1)
411
+ created_at: Date; // 생성 시간
412
+ last_accessed: Date; // 마지막 접근 시간
413
+ access_count: number; // 접근 횟수
414
+ pinned: boolean; // 고정 여부
415
+ source?: string; // 출처
416
+ tags: string[]; // 태그
417
+ privacy_scope: 'private' | 'team' | 'public'; // 공개 범위
418
+ project_id?: string; // 프로젝트 ID (M2+)
419
+ user_id?: string; // 사용자 ID (M3+)
420
+ metadata: Record<string, any>; // 추가 메타데이터
421
+ }
422
+ ```
423
+
424
+ ### 2. 검색 결과
425
+
426
+ ```typescript
427
+ interface SearchResult {
428
+ items: MemoryItem[]; // 검색된 기억 목록
429
+ total_count: number; // 전체 결과 수
430
+ query_time: number; // 검색 소요 시간 (ms)
431
+ search_metadata: {
432
+ vector_matches: number; // 벡터 검색 매치 수
433
+ keyword_matches: number; // 키워드 검색 매치 수
434
+ ranking_time: number; // 랭킹 계산 시간
435
+ };
436
+ }
437
+ ```
438
+
439
+ ### 3. 기억 관계
440
+
441
+ ```typescript
442
+ interface MemoryLink {
443
+ id: string; // 링크 ID
444
+ source_id: string; // 소스 기억 ID
445
+ target_id: string; // 대상 기억 ID
446
+ relation_type: 'cause_of' | 'derived_from' | 'duplicates' | 'contradicts';
447
+ created_at: Date; // 생성 시간
448
+ strength: number; // 관계 강도 (0-1)
449
+ }
450
+ ```
451
+
452
+ ### 4. 피드백
453
+
454
+ ```typescript
455
+ interface Feedback {
456
+ id: string; // 피드백 ID
457
+ memory_id: string; // 기억 ID
458
+ helpful: boolean; // 유용성 여부
459
+ score?: number; // 점수 (0-1)
460
+ comment?: string; // 코멘트
461
+ created_at: Date; // 생성 시간
462
+ user_id?: string; // 사용자 ID (M3+)
463
+ }
464
+ ```
465
+
466
+ ## 검색 시스템
467
+
468
+ ### 하이브리드 검색 아키텍처
469
+
470
+ Memento는 FTS5 텍스트 검색과 벡터 검색을 결합한 하이브리드 검색 시스템을 제공합니다.
471
+
472
+ ```mermaid
473
+ graph TB
474
+ subgraph "하이브리드 검색 엔진"
475
+ A[사용자 쿼리] --> B[하이브리드 검색 엔진]
476
+ B --> C[FTS5 텍스트 검색]
477
+ B --> D[벡터 검색]
478
+ C --> E[텍스트 점수]
479
+ D --> F[벡터 점수]
480
+ E --> G[점수 정규화]
481
+ F --> G
482
+ G --> H[가중치 적용]
483
+ H --> I[최종 하이브리드 점수]
484
+ I --> J[결과 정렬 및 반환]
485
+ end
486
+
487
+ subgraph "임베딩 서비스"
488
+ K[텍스트 입력] --> L[OpenAI API]
489
+ L --> M[1536차원 벡터]
490
+ M --> N[데이터베이스 저장]
491
+ N --> O[벡터 검색 인덱스]
492
+ end
493
+ ```
494
+
495
+ ### 임베딩 서비스 아키텍처
496
+
497
+ ```mermaid
498
+ graph TB
499
+ subgraph "임베딩 서비스 레이어"
500
+ A[텍스트 입력] --> B[EmbeddingService]
501
+ B --> C[OpenAI API 호출]
502
+ C --> D[text-embedding-3-small]
503
+ D --> E[1536차원 벡터]
504
+ E --> F[MemoryEmbeddingService]
505
+ F --> G[데이터베이스 저장]
506
+ G --> H[벡터 검색 인덱스]
507
+ end
508
+
509
+ subgraph "에러 처리 및 캐싱"
510
+ I[API 재시도 로직]
511
+ J[임베딩 결과 캐싱]
512
+ K[에러 복구 메커니즘]
513
+ end
514
+ ```
515
+
516
+ ### 1. 2단계 검색 파이프라인
517
+
518
+ #### 1단계: 벡터 검색 (ANN)
519
+
520
+ ```typescript
521
+ interface VectorSearch {
522
+ // 임베딩 생성
523
+ generateEmbedding(text: string): Promise<number[]>;
524
+
525
+ // 벡터 검색
526
+ search(embedding: number[], limit: number): Promise<VectorSearchResult>;
527
+
528
+ // 인덱스 업데이트
529
+ updateIndex(memory: MemoryItem): Promise<void>;
530
+ }
531
+ ```
532
+
533
+ **특징**:
534
+ - 의미적 유사도 검색
535
+ - 빠른 검색 속도 (O(log n))
536
+ - 다국어 지원
537
+
538
+ #### 2단계: 키워드 검색 (BM25)
539
+
540
+ ```typescript
541
+ interface KeywordSearch {
542
+ // 텍스트 인덱싱
543
+ indexText(memory: MemoryItem): Promise<void>;
544
+
545
+ // BM25 검색
546
+ search(query: string, filters?: SearchFilters): Promise<KeywordSearchResult>;
547
+
548
+ // 인덱스 최적화
549
+ optimizeIndex(): Promise<void>;
550
+ }
551
+ ```
552
+
553
+ **특징**:
554
+ - 정확한 키워드 매칭
555
+ - 가중치 기반 랭킹
556
+ - 필터링 지원
557
+
558
+ ### 2. 랭킹 알고리즘
559
+
560
+ #### 복합 점수 계산
561
+
562
+ ```typescript
563
+ interface SearchRanking {
564
+ calculateFinalScore(features: SearchFeatures): number {
565
+ const relevance = this.calculateRelevance(features);
566
+ const recency = this.calculateRecency(features);
567
+ const importance = this.calculateImportance(features);
568
+ const usage = this.calculateUsage(features);
569
+ const duplication = this.calculateDuplicationPenalty(features);
570
+
571
+ return this.ALPHA * relevance + // 0.50
572
+ this.BETA * recency + // 0.20
573
+ this.GAMMA * importance + // 0.20
574
+ this.DELTA * usage - // 0.10
575
+ this.EPSILON * duplication; // 0.15
576
+ }
577
+ }
578
+ ```
579
+
580
+ #### 관련성 계산
581
+
582
+ ```typescript
583
+ interface RelevanceCalculation {
584
+ calculate(features: SearchFeatures): number {
585
+ const vectorSimilarity = features.vector_similarity;
586
+ const bm25Score = features.bm25_score;
587
+ const tagMatch = features.tag_match_score;
588
+ const titleHit = features.title_hit_score;
589
+
590
+ return (vectorSimilarity * 0.4) +
591
+ (bm25Score * 0.3) +
592
+ (tagMatch * 0.2) +
593
+ (titleHit * 0.1);
594
+ }
595
+ }
596
+ ```
597
+
598
+ ### 3. MMR 다양성 제어
599
+
600
+ ```typescript
601
+ interface MMRDiversity {
602
+ selectDiverseResults(results: SearchResult[], lambda: number = 0.7): SearchResult[] {
603
+ const selected: SearchResult[] = [];
604
+ const remaining = [...results];
605
+
606
+ while (remaining.length > 0 && selected.length < this.maxResults) {
607
+ let bestIndex = 0;
608
+ let bestScore = -Infinity;
609
+
610
+ for (let i = 0; i < remaining.length; i++) {
611
+ const relevance = remaining[i].score;
612
+ const diversity = this.calculateDiversity(remaining[i], selected);
613
+ const score = lambda * relevance + (1 - lambda) * diversity;
614
+
615
+ if (score > bestScore) {
616
+ bestScore = score;
617
+ bestIndex = i;
618
+ }
619
+ }
620
+
621
+ selected.push(remaining[bestIndex]);
622
+ remaining.splice(bestIndex, 1);
623
+ }
624
+
625
+ return selected;
626
+ }
627
+ }
628
+ ```
629
+
630
+ ## 망각 시스템
631
+
632
+ ### 1. TTL 기반 자동 삭제
633
+
634
+ #### 기억 타입별 TTL
635
+
636
+ ```typescript
637
+ interface MemoryTTL {
638
+ WORKING_MEMORY: 48 * 60 * 60 * 1000; // 48시간
639
+ EPISODIC_MEMORY: 90 * 24 * 60 * 60 * 1000; // 90일
640
+ SEMANTIC_MEMORY: Infinity; // 무기한
641
+ PROCEDURAL_MEMORY: Infinity; // 무기한
642
+ }
643
+ ```
644
+
645
+ #### 삭제 스케줄링
646
+
647
+ ```typescript
648
+ interface DeletionScheduler {
649
+ scheduleDeletion(memory: MemoryItem): void {
650
+ const ttl = this.getTTL(memory.type);
651
+ if (ttl === Infinity) return;
652
+
653
+ const deletionTime = new Date(memory.created_at.getTime() + ttl);
654
+ this.scheduleTask(deletionTime, () => this.deleteMemory(memory));
655
+ }
656
+ }
657
+ ```
658
+
659
+ ### 2. 중요도 기반 망각
660
+
661
+ #### 망각 점수 계산
662
+
663
+ ```typescript
664
+ interface ForgetScore {
665
+ calculate(memory: MemoryItem): number {
666
+ const age = this.calculateAge(memory.created_at);
667
+ const importance = memory.importance;
668
+ const usage = this.calculateUsage(memory);
669
+ const recency = this.calculateRecency(memory.last_accessed);
670
+
671
+ return this.baseForgetScore *
672
+ Math.exp(-this.importanceWeight * importance) *
673
+ Math.exp(-this.usageWeight * usage) *
674
+ Math.exp(-this.recencyWeight * recency) *
675
+ Math.exp(this.ageWeight * age);
676
+ }
677
+ }
678
+ ```
679
+
680
+ ### 3. 간격 반복 시스템
681
+
682
+ #### 리뷰 스케줄 계산
683
+
684
+ ```typescript
685
+ interface SpacedRepetition {
686
+ calculateNextReview(memory: MemoryItem, performance: number): Date {
687
+ const currentInterval = memory.review_interval || 1;
688
+ const newInterval = this.calculateInterval(currentInterval, performance);
689
+
690
+ return new Date(Date.now() + newInterval * 24 * 60 * 60 * 1000);
691
+ }
692
+
693
+ calculateInterval(currentInterval: number, performance: number): number {
694
+ if (performance >= 0.8) {
695
+ return Math.min(currentInterval * 2.5, 365); // 성공 시 간격 증가
696
+ } else if (performance >= 0.6) {
697
+ return Math.max(currentInterval * 1.2, 1); // 보통 시 약간 증가
698
+ } else {
699
+ return 1; // 실패 시 다시 1일 후
700
+ }
701
+ }
702
+ }
703
+ ```
704
+
705
+ ## 마일스톤별 아키텍처
706
+
707
+ ### M1: 개인용 (MVP)
708
+
709
+ #### 아키텍처
710
+
711
+ ```mermaid
712
+ graph TB
713
+ A[AI Agent] --> B[MCP Client]
714
+ B --> C[MCP Memory Server]
715
+ C --> D[SQLite Database]
716
+ C --> E[FTS5 Index]
717
+ C --> F[VEC Index]
718
+ C --> G[Local File System]
719
+ ```
720
+
721
+ #### 특징
722
+
723
+ - **스토리지**: better-sqlite3 임베디드
724
+ - **검색**: FTS5 + sqlite-vec
725
+ - **인증**: 없음 (로컬 전용)
726
+ - **배포**: 로컬 실행
727
+ - **추가 기능**: 경량 임베딩, 성능 모니터링, 캐시 시스템
728
+ - **확장성**: 단일 사용자
729
+
730
+ #### 기술 스택
731
+
732
+ - **데이터베이스**: better-sqlite3 12.4+
733
+ - **벡터 검색**: sqlite-vec
734
+ - **텍스트 검색**: FTS5
735
+ - **웹 서버**: Express 5.1+
736
+ - **WebSocket**: ws 8.18+
737
+ - **테스트**: Vitest 1.0+
738
+ - **런타임**: Node.js 20+
739
+
740
+ ### M2: 팀 협업
741
+
742
+ #### 아키텍처
743
+
744
+ ```mermaid
745
+ graph TB
746
+ A[AI Agents] --> B[MCP Client]
747
+ B --> C[MCP Memory Server]
748
+ C --> D[SQLite Server Mode]
749
+ C --> E[Redis Cache]
750
+ C --> F[API Gateway]
751
+ F --> G[Authentication]
752
+ ```
753
+
754
+ #### 특징
755
+
756
+ - **스토리지**: SQLite 서버 모드 (WAL)
757
+ - **캐싱**: Redis
758
+ - **인증**: API Key
759
+ - **배포**: Docker
760
+ - **확장성**: 팀 단위 (10-50명)
761
+
762
+ #### 기술 스택
763
+
764
+ - **데이터베이스**: SQLite Server Mode
765
+ - **캐시**: Redis 7+
766
+ - **컨테이너**: Docker
767
+ - **인증**: API Key
768
+
769
+ ### M3: 조직 초입
770
+
771
+ #### 아키텍처
772
+
773
+ ```mermaid
774
+ graph TB
775
+ A[AI Agents] --> B[MCP Client]
776
+ B --> C[Load Balancer]
777
+ C --> D[MCP Memory Server]
778
+ D --> E[PostgreSQL]
779
+ D --> F[Redis Cache]
780
+ D --> G[Authentication Service]
781
+ G --> H[JWT Token]
782
+ ```
783
+
784
+ #### 특징
785
+
786
+ - **스토리지**: PostgreSQL + pgvector
787
+ - **검색**: pgvector + tsvector
788
+ - **인증**: JWT
789
+ - **배포**: Docker Compose
790
+ - **확장성**: 조직 단위 (100-1000명)
791
+
792
+ #### 기술 스택
793
+
794
+ - **데이터베이스**: PostgreSQL 15+ + pgvector
795
+ - **검색**: pgvector, tsvector
796
+ - **캐시**: Redis 7+
797
+ - **인증**: JWT
798
+ - **배포**: Docker Compose
799
+
800
+ ### M4: 엔터프라이즈
801
+
802
+ #### 아키텍처
803
+
804
+ ```mermaid
805
+ graph TB
806
+ A[AI Agents] --> B[MCP Client]
807
+ B --> C[API Gateway]
808
+ C --> D[Load Balancer]
809
+ D --> E[MCP Memory Server Cluster]
810
+ E --> F[PostgreSQL HA]
811
+ E --> G[Redis Cluster]
812
+ E --> H[Authentication Service]
813
+ H --> I[SSO/LDAP]
814
+ E --> J[Monitoring]
815
+ J --> K[Prometheus]
816
+ J --> L[Grafana]
817
+ ```
818
+
819
+ #### 특징
820
+
821
+ - **스토리지**: PostgreSQL 고가용성
822
+ - **캐싱**: Redis 클러스터
823
+ - **인증**: JWT + RBAC + SSO/LDAP
824
+ - **배포**: Kubernetes
825
+ - **확장성**: 엔터프라이즈 (1000명+)
826
+
827
+ #### 기술 스택
828
+
829
+ - **데이터베이스**: PostgreSQL HA + pgvector
830
+ - **캐시**: Redis Cluster
831
+ - **인증**: JWT + RBAC + SSO/LDAP
832
+ - **배포**: Kubernetes
833
+ - **모니터링**: Prometheus + Grafana
834
+
835
+ ## 성능 고려사항
836
+
837
+ ### 1. 검색 성능
838
+
839
+ #### 하이브리드 검색 최적화
840
+
841
+ ```typescript
842
+ interface HybridSearchOptimization {
843
+ // FTS5 + 벡터 검색 결합
844
+ optimizeHybridSearch(): void {
845
+ this.createFTSIndex('memory_item_fts', 'content');
846
+ this.createVectorIndex('memory_embedding', 'embedding', 'ivfflat');
847
+ this.analyzeTable('memory_item');
848
+ }
849
+
850
+ // 배치 처리
851
+ batchUpdateEmbeddings(memories: MemoryItem[]): void {
852
+ const batchSize = 100;
853
+ for (let i = 0; i < memories.length; i += batchSize) {
854
+ const batch = memories.slice(i, i + batchSize);
855
+ this.updateEmbeddingsBatch(batch);
856
+ }
857
+ }
858
+ }
859
+ ```
860
+
861
+ #### 경량 임베딩 최적화
862
+
863
+ ```typescript
864
+ interface LightweightEmbeddingOptimization {
865
+ // TF-IDF 벡터화
866
+ optimizeTFIDF(): void {
867
+ this.updateVocabulary();
868
+ this.calculateIDF();
869
+ this.normalizeVectors();
870
+ }
871
+
872
+ // 다국어 지원
873
+ preprocessText(text: string): string {
874
+ return this.removeStopWords(text)
875
+ .normalizeUnicode()
876
+ .tokenize()
877
+ .stem();
878
+ }
879
+ }
880
+ ```
881
+
882
+ #### 캐싱 전략
883
+
884
+ ```typescript
885
+ interface CachingStrategy {
886
+ // LRU 캐시 구현
887
+ cacheSearchResult(query: string, result: SearchResult): void {
888
+ const key = `search:${this.hashQuery(query)}`;
889
+ this.lruCache.set(key, result, 3600); // 1시간 TTL
890
+ }
891
+
892
+ // 임베딩 캐싱
893
+ cacheEmbedding(text: string, embedding: number[]): void {
894
+ const key = `embedding:${this.hashText(text)}`;
895
+ this.lruCache.set(key, embedding, 86400); // 24시간 TTL
896
+ }
897
+
898
+ // 인기 검색어 캐싱
899
+ cachePopularQueries(): void {
900
+ const popular = this.getPopularQueries(100);
901
+ this.lruCache.set('popular_queries', popular, 86400); // 24시간 TTL
902
+ }
903
+ }
904
+ ```
905
+
906
+ ### 2. 메모리 사용량
907
+
908
+ #### 성능 모니터링
909
+
910
+ ```typescript
911
+ interface PerformanceMonitoring {
912
+ // 메모리 사용량 모니터링
913
+ monitorMemoryUsage(): void {
914
+ const usage = process.memoryUsage();
915
+ this.metrics.record('memory.heapUsed', usage.heapUsed);
916
+ this.metrics.record('memory.heapTotal', usage.heapTotal);
917
+ this.metrics.record('memory.rss', usage.rss);
918
+ }
919
+
920
+ // 캐시 성능 모니터링
921
+ monitorCachePerformance(): void {
922
+ this.metrics.record('cache.hitRate', this.cache.getHitRate());
923
+ this.metrics.record('cache.size', this.cache.getSize());
924
+ this.metrics.record('cache.memoryUsage', this.cache.getMemoryUsage());
925
+ }
926
+ }
927
+ ```
928
+
929
+ #### 메모리 풀 관리
930
+
931
+ ```typescript
932
+ interface MemoryPool {
933
+ private pool: Buffer[] = [];
934
+ private maxSize: number = 100;
935
+
936
+ getBuffer(size: number): Buffer {
937
+ const buffer = this.pool.find(b => b.length >= size);
938
+ if (buffer) {
939
+ return buffer;
940
+ }
941
+ return Buffer.alloc(size);
942
+ }
943
+
944
+ returnBuffer(buffer: Buffer): void {
945
+ if (this.pool.length < this.maxSize) {
946
+ this.pool.push(buffer);
947
+ }
948
+ }
949
+ }
950
+ ```
951
+
952
+ #### 가비지 컬렉션 최적화
953
+
954
+ ```typescript
955
+ interface GCOptimization {
956
+ // 메모리 사용량 모니터링
957
+ monitorMemoryUsage(): void {
958
+ const usage = process.memoryUsage();
959
+ if (usage.heapUsed > this.threshold) {
960
+ this.triggerGC();
961
+ }
962
+ }
963
+
964
+ // 불필요한 객체 정리
965
+ cleanup(): void {
966
+ this.clearExpiredCache();
967
+ this.clearUnusedConnections();
968
+ this.optimizeIndexes();
969
+ }
970
+ }
971
+ ```
972
+
973
+ ### 3. 데이터베이스 성능
974
+
975
+ #### better-sqlite3 최적화
976
+
977
+ ```sql
978
+ -- 인덱스 최적화
979
+ CREATE INDEX idx_memory_type_created ON memory_item(type, created_at);
980
+ CREATE INDEX idx_memory_importance ON memory_item(importance DESC);
981
+ CREATE INDEX idx_memory_tags ON memory_item USING GIN(tags);
982
+
983
+ -- 벡터 검색 인덱스
984
+ CREATE INDEX idx_memory_embedding ON memory_embedding
985
+ USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
986
+
987
+ -- FTS 인덱스
988
+ CREATE VIRTUAL TABLE memory_fts USING fts5(
989
+ content,
990
+ tags,
991
+ source,
992
+ content='memory_item',
993
+ content_rowid='id'
994
+ );
995
+ ```
996
+
997
+ #### 데이터베이스 최적화 서비스
998
+
999
+ ```typescript
1000
+ interface DatabaseOptimization {
1001
+ // 자동 인덱스 추천
1002
+ recommendIndexes(): IndexRecommendation[] {
1003
+ const slowQueries = this.analyzeSlowQueries();
1004
+ return slowQueries.map(query => this.generateIndexRecommendation(query));
1005
+ }
1006
+
1007
+ // 쿼리 성능 분석
1008
+ analyzeQueryPerformance(): QueryAnalysis {
1009
+ return {
1010
+ averageQueryTime: this.getAverageQueryTime(),
1011
+ slowQueries: this.getSlowQueries(),
1012
+ indexUsage: this.getIndexUsage(),
1013
+ recommendations: this.generateRecommendations()
1014
+ };
1015
+ }
1016
+ }
1017
+ ```
1018
+
1019
+ #### 연결 풀 관리
1020
+
1021
+ ```typescript
1022
+ interface ConnectionPool {
1023
+ private pool: DatabaseConnection[] = [];
1024
+ private maxConnections: number = 20;
1025
+
1026
+ async getConnection(): Promise<DatabaseConnection> {
1027
+ if (this.pool.length > 0) {
1028
+ return this.pool.pop()!;
1029
+ }
1030
+
1031
+ if (this.activeConnections < this.maxConnections) {
1032
+ return await this.createConnection();
1033
+ }
1034
+
1035
+ return await this.waitForConnection();
1036
+ }
1037
+
1038
+ releaseConnection(conn: DatabaseConnection): void {
1039
+ if (this.pool.length < this.maxConnections) {
1040
+ this.pool.push(conn);
1041
+ } else {
1042
+ conn.close();
1043
+ }
1044
+ }
1045
+ }
1046
+ ```
1047
+
1048
+ ## 보안 아키텍처
1049
+
1050
+ ### 1. 인증 및 권한
1051
+
1052
+ #### JWT 기반 인증 (M3+)
1053
+
1054
+ ```typescript
1055
+ interface JWTAuthentication {
1056
+ generateToken(user: User): string {
1057
+ const payload = {
1058
+ sub: user.id,
1059
+ email: user.email,
1060
+ role: user.role,
1061
+ exp: Math.floor(Date.now() / 1000) + (60 * 60 * 24) // 24시간
1062
+ };
1063
+
1064
+ return jwt.sign(payload, this.secretKey, { algorithm: 'HS256' });
1065
+ }
1066
+
1067
+ verifyToken(token: string): UserPayload {
1068
+ return jwt.verify(token, this.secretKey) as UserPayload;
1069
+ }
1070
+ }
1071
+ ```
1072
+
1073
+ #### RBAC 권한 관리 (M4)
1074
+
1075
+ ```typescript
1076
+ interface RBAC {
1077
+ hasPermission(user: User, resource: string, action: string): boolean {
1078
+ const role = this.getRole(user.role);
1079
+ return role.permissions.some(p =>
1080
+ p.resource === resource && p.actions.includes(action)
1081
+ );
1082
+ }
1083
+
1084
+ checkMemoryAccess(user: User, memory: MemoryItem): boolean {
1085
+ if (memory.privacy_scope === 'public') return true;
1086
+ if (memory.privacy_scope === 'team' && user.team_id === memory.team_id) return true;
1087
+ if (memory.privacy_scope === 'private' && user.id === memory.user_id) return true;
1088
+ return false;
1089
+ }
1090
+ }
1091
+ ```
1092
+
1093
+ ### 2. 데이터 암호화
1094
+
1095
+ #### 민감한 데이터 암호화
1096
+
1097
+ ```typescript
1098
+ interface DataEncryption {
1099
+ encryptSensitiveData(data: string): string {
1100
+ const cipher = crypto.createCipher('aes-256-gcm', this.encryptionKey);
1101
+ let encrypted = cipher.update(data, 'utf8', 'hex');
1102
+ encrypted += cipher.final('hex');
1103
+ return encrypted;
1104
+ }
1105
+
1106
+ decryptSensitiveData(encryptedData: string): string {
1107
+ const decipher = crypto.createDecipher('aes-256-gcm', this.encryptionKey);
1108
+ let decrypted = decipher.update(encryptedData, 'hex', 'utf8');
1109
+ decrypted += decipher.final('utf8');
1110
+ return decrypted;
1111
+ }
1112
+ }
1113
+ ```
1114
+
1115
+ #### 전송 중 암호화
1116
+
1117
+ ```typescript
1118
+ interface TransportEncryption {
1119
+ // HTTPS 강제
1120
+ enforceHTTPS(): void {
1121
+ this.app.use((req, res, next) => {
1122
+ if (!req.secure && req.get('x-forwarded-proto') !== 'https') {
1123
+ return res.redirect(`https://${req.get('host')}${req.url}`);
1124
+ }
1125
+ next();
1126
+ });
1127
+ }
1128
+
1129
+ // HSTS 헤더 설정
1130
+ setHSTS(): void {
1131
+ this.app.use((req, res, next) => {
1132
+ res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
1133
+ next();
1134
+ });
1135
+ }
1136
+ }
1137
+ ```
1138
+
1139
+ ### 3. 감사 로깅
1140
+
1141
+ #### 보안 이벤트 로깅
1142
+
1143
+ ```typescript
1144
+ interface SecurityAudit {
1145
+ logSecurityEvent(event: SecurityEvent): void {
1146
+ const logEntry = {
1147
+ timestamp: new Date().toISOString(),
1148
+ event_type: event.type,
1149
+ user_id: event.user_id,
1150
+ ip_address: event.ip_address,
1151
+ user_agent: event.user_agent,
1152
+ details: event.details,
1153
+ severity: event.severity
1154
+ };
1155
+
1156
+ this.auditLogger.info(logEntry);
1157
+ }
1158
+
1159
+ detectAnomalies(): void {
1160
+ // 비정상적인 접근 패턴 감지
1161
+ const recentEvents = this.getRecentEvents(5 * 60 * 1000); // 5분
1162
+ const suspiciousEvents = this.analyzePatterns(recentEvents);
1163
+
1164
+ if (suspiciousEvents.length > 0) {
1165
+ this.alertSecurityTeam(suspiciousEvents);
1166
+ }
1167
+ }
1168
+ }
1169
+ ```
1170
+
1171
+ ## 모니터링 및 관측성
1172
+
1173
+ ### 1. 메트릭 수집
1174
+
1175
+ #### Prometheus 메트릭
1176
+
1177
+ ```typescript
1178
+ interface Metrics {
1179
+ // 메모리 관련 메트릭
1180
+ memoryCounter: Counter<string>;
1181
+ memorySize: Gauge<string>;
1182
+
1183
+ // 검색 관련 메트릭
1184
+ searchDuration: Histogram<string>;
1185
+ searchResults: Counter<string>;
1186
+
1187
+ // 에러 관련 메트릭
1188
+ errorCounter: Counter<string>;
1189
+ errorRate: Gauge<string>;
1190
+
1191
+ // 성능 관련 메트릭
1192
+ responseTime: Histogram<string>;
1193
+ throughput: Counter<string>;
1194
+ }
1195
+ ```
1196
+
1197
+ ### 2. 로깅
1198
+
1199
+ #### 구조화된 로깅
1200
+
1201
+ ```typescript
1202
+ interface StructuredLogging {
1203
+ logMemoryOperation(operation: string, memoryId: string, userId?: string): void {
1204
+ this.logger.info({
1205
+ operation,
1206
+ memory_id: memoryId,
1207
+ user_id: userId,
1208
+ timestamp: new Date().toISOString(),
1209
+ level: 'info'
1210
+ });
1211
+ }
1212
+
1213
+ logSearchQuery(query: string, resultCount: number, duration: number): void {
1214
+ this.logger.info({
1215
+ event: 'search_query',
1216
+ query,
1217
+ result_count: resultCount,
1218
+ duration_ms: duration,
1219
+ timestamp: new Date().toISOString()
1220
+ });
1221
+ }
1222
+ }
1223
+ ```
1224
+
1225
+ ### 3. 헬스 체크
1226
+
1227
+ #### 서비스 상태 모니터링
1228
+
1229
+ ```typescript
1230
+ interface HealthCheck {
1231
+ async checkHealth(): Promise<HealthStatus> {
1232
+ const checks = await Promise.allSettled([
1233
+ this.checkDatabase(),
1234
+ this.checkRedis(),
1235
+ this.checkSearchIndex(),
1236
+ this.checkMemoryUsage()
1237
+ ]);
1238
+
1239
+ return {
1240
+ status: checks.every(c => c.status === 'fulfilled') ? 'healthy' : 'unhealthy',
1241
+ checks: checks.map((check, index) => ({
1242
+ name: this.checkNames[index],
1243
+ status: check.status === 'fulfilled' ? 'ok' : 'error',
1244
+ details: check.status === 'fulfilled' ? check.value : check.reason
1245
+ }))
1246
+ };
1247
+ }
1248
+ }
1249
+ ```
1250
+
1251
+ ## 확장성 고려사항
1252
+
1253
+ ### 1. 수평적 확장
1254
+
1255
+ #### 샤딩 전략
1256
+
1257
+ ```typescript
1258
+ interface ShardingStrategy {
1259
+ getShard(memoryId: string): string {
1260
+ const hash = this.hash(memoryId);
1261
+ return `shard_${hash % this.shardCount}`;
1262
+ }
1263
+
1264
+ routeQuery(query: string): string[] {
1265
+ // 쿼리를 모든 샤드에 전송
1266
+ return this.shards.map(shard => `${shard}/search`);
1267
+ }
1268
+ }
1269
+ ```
1270
+
1271
+ ### 2. 캐싱 전략
1272
+
1273
+ #### 다층 캐싱
1274
+
1275
+ ```typescript
1276
+ interface MultiLevelCache {
1277
+ async get(key: string): Promise<any> {
1278
+ // L1: 메모리 캐시
1279
+ let value = this.memoryCache.get(key);
1280
+ if (value) return value;
1281
+
1282
+ // L2: Redis 캐시
1283
+ value = await this.redis.get(key);
1284
+ if (value) {
1285
+ this.memoryCache.set(key, value);
1286
+ return value;
1287
+ }
1288
+
1289
+ // L3: 데이터베이스
1290
+ value = await this.database.get(key);
1291
+ if (value) {
1292
+ this.memoryCache.set(key, value);
1293
+ await this.redis.setex(key, 3600, value);
1294
+ return value;
1295
+ }
1296
+
1297
+ return null;
1298
+ }
1299
+ }
1300
+ ```
1301
+
1302
+ 이 아키텍처 문서는 Memento MCP Server의 전체적인 구조와 설계 원칙을 설명합니다. 각 컴포넌트의 상세한 구현은 개별 개발 문서를 참조하세요.