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,458 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { LightweightEmbeddingService, LightweightEmbeddingResult, LightweightSimilarityResult } from './lightweight-embedding-service.js';
3
+ import { getStopWords } from '../utils/stopwords.js';
4
+
5
+ // Mock stopwords
6
+ vi.mock('../utils/stopwords.js', () => ({
7
+ getStopWords: vi.fn(() => new Set(['the', 'is', 'at', 'which', 'on', 'a', 'an', 'and', 'or', 'but']))
8
+ }));
9
+
10
+ describe('LightweightEmbeddingService', () => {
11
+ let service: LightweightEmbeddingService;
12
+
13
+ beforeEach(() => {
14
+ vi.clearAllMocks();
15
+ service = new LightweightEmbeddingService();
16
+ });
17
+
18
+ describe('constructor', () => {
19
+ it('should initialize with default settings', () => {
20
+ expect(service).toBeInstanceOf(LightweightEmbeddingService);
21
+ expect(service.isAvailable()).toBe(true);
22
+ });
23
+
24
+ it('should load stop words', () => {
25
+ expect(getStopWords).toHaveBeenCalled();
26
+ });
27
+ });
28
+
29
+ describe('generateEmbedding', () => {
30
+ it('should generate embedding for valid text', async () => {
31
+ const text = 'This is a test document for embedding generation';
32
+ const result = await service.generateEmbedding(text);
33
+
34
+ expect(result).toBeDefined();
35
+ expect(result?.embedding).toBeDefined();
36
+ expect(Array.isArray(result?.embedding)).toBe(true);
37
+ expect(result?.embedding.length).toBe(512); // Fixed dimensions
38
+ expect(result?.model).toBe('lightweight-hybrid');
39
+ expect(result?.usage).toBeDefined();
40
+ expect(result?.usage.prompt_tokens).toBeGreaterThan(0);
41
+ expect(result?.usage.total_tokens).toBeGreaterThan(0);
42
+ });
43
+
44
+ it('should throw error for empty text', async () => {
45
+ await expect(service.generateEmbedding('')).rejects.toThrow('텍스트가 비어있습니다');
46
+ await expect(service.generateEmbedding(' ')).rejects.toThrow('텍스트가 비어있습니다');
47
+ });
48
+
49
+ it('should handle Korean text', async () => {
50
+ const text = '안녕하세요. 이것은 한국어 텍스트입니다.';
51
+ const result = await service.generateEmbedding(text);
52
+
53
+ expect(result).toBeDefined();
54
+ expect(result?.embedding).toBeDefined();
55
+ expect(result?.embedding.length).toBe(512);
56
+ });
57
+
58
+ it('should handle technical terms', async () => {
59
+ const text = 'React API HTTP JSON TypeScript camelCase snake_case';
60
+ const result = await service.generateEmbedding(text);
61
+
62
+ expect(result).toBeDefined();
63
+ expect(result?.embedding).toBeDefined();
64
+ });
65
+
66
+ it('should generate consistent embeddings for same text', async () => {
67
+ const text = 'Consistent test text';
68
+ const result1 = await service.generateEmbedding(text);
69
+ const result2 = await service.generateEmbedding(text);
70
+
71
+ expect(result1?.embedding).toEqual(result2?.embedding);
72
+ });
73
+
74
+ it('should generate different embeddings for different text', async () => {
75
+ const text1 = 'First test text';
76
+ const text2 = 'Second test text';
77
+ const result1 = await service.generateEmbedding(text1);
78
+ const result2 = await service.generateEmbedding(text2);
79
+
80
+ expect(result1?.embedding).not.toEqual(result2?.embedding);
81
+ });
82
+ });
83
+
84
+ describe('searchSimilar', () => {
85
+ it('should find similar embeddings', async () => {
86
+ const query = 'test query';
87
+ const embeddings = [
88
+ { id: '1', content: 'similar test content', embedding: new Array(512).fill(0.1) },
89
+ { id: '2', content: 'different content', embedding: new Array(512).fill(0.9) }
90
+ ];
91
+
92
+ const results = await service.searchSimilar(query, embeddings, 10, 0.5);
93
+
94
+ expect(Array.isArray(results)).toBe(true);
95
+ expect(results.length).toBeGreaterThan(0);
96
+ results.forEach(result => {
97
+ expect(result).toHaveProperty('id');
98
+ expect(result).toHaveProperty('content');
99
+ expect(result).toHaveProperty('similarity');
100
+ expect(result).toHaveProperty('score');
101
+ expect(typeof result.similarity).toBe('number');
102
+ expect(typeof result.score).toBe('number');
103
+ });
104
+ });
105
+
106
+ it('should filter by threshold', async () => {
107
+ const query = 'test query';
108
+ const embeddings = [
109
+ { id: '1', content: 'similar content', embedding: new Array(512).fill(0.1) },
110
+ { id: '2', content: 'different content', embedding: new Array(512).fill(0.9) }
111
+ ];
112
+
113
+ const results = await service.searchSimilar(query, embeddings, 10, 0.9);
114
+
115
+ expect(Array.isArray(results)).toBe(true);
116
+ results.forEach(result => {
117
+ expect(result.similarity).toBeGreaterThanOrEqual(0.9);
118
+ });
119
+ });
120
+
121
+ it('should limit results', async () => {
122
+ const query = 'test query';
123
+ const embeddings = Array.from({ length: 20 }, (_, i) => ({
124
+ id: `${i}`,
125
+ content: `content ${i}`,
126
+ embedding: new Array(512).fill(0.1)
127
+ }));
128
+
129
+ const results = await service.searchSimilar(query, embeddings, 5, 0.5);
130
+
131
+ expect(results.length).toBeLessThanOrEqual(5);
132
+ });
133
+
134
+ it('should return empty array when query embedding fails', async () => {
135
+ // Mock generateEmbedding to return null
136
+ vi.spyOn(service, 'generateEmbedding').mockResolvedValue(null);
137
+
138
+ const query = 'test query';
139
+ const embeddings = [
140
+ { id: '1', content: 'content', embedding: new Array(512).fill(0.1) }
141
+ ];
142
+
143
+ const results = await service.searchSimilar(query, embeddings);
144
+
145
+ expect(results).toEqual([]);
146
+ });
147
+
148
+ it('should sort results by similarity descending', async () => {
149
+ const query = 'test query';
150
+ const embeddings = [
151
+ { id: '1', content: 'low similarity', embedding: new Array(512).fill(0.1) },
152
+ { id: '2', content: 'high similarity', embedding: new Array(512).fill(0.9) },
153
+ { id: '3', content: 'medium similarity', embedding: new Array(512).fill(0.5) }
154
+ ];
155
+
156
+ const results = await service.searchSimilar(query, embeddings, 10, 0.1);
157
+
158
+ expect(results.length).toBe(3);
159
+ for (let i = 1; i < results.length; i++) {
160
+ expect(results[i-1].similarity).toBeGreaterThanOrEqual(results[i].similarity);
161
+ }
162
+ });
163
+ });
164
+
165
+ describe('getModelInfo', () => {
166
+ it('should return correct model information', () => {
167
+ const info = service.getModelInfo();
168
+
169
+ expect(info.model).toBe('lightweight-hybrid');
170
+ expect(info.dimensions).toBe(512);
171
+ expect(info.maxTokens).toBe(8191);
172
+ });
173
+ });
174
+
175
+ describe('isAvailable', () => {
176
+ it('should always return true', () => {
177
+ expect(service.isAvailable()).toBe(true);
178
+ });
179
+ });
180
+
181
+ describe('private methods', () => {
182
+ describe('preprocessText', () => {
183
+ it('should preprocess text correctly', () => {
184
+ const text = 'Hello World! This is a TEST.';
185
+ const result = (service as any).preprocessText(text);
186
+
187
+ expect(Array.isArray(result)).toBe(true);
188
+ expect(result).toContain('hello');
189
+ expect(result).toContain('world');
190
+ expect(result).toContain('test');
191
+ expect(result).not.toContain('this'); // Should be filtered as stop word
192
+ expect(result).not.toContain('is'); // Should be filtered as stop word
193
+ expect(result).not.toContain('a'); // Should be filtered as stop word
194
+ });
195
+
196
+ it('should handle Korean text', () => {
197
+ const text = '안녕하세요! 이것은 테스트입니다.';
198
+ const result = (service as any).preprocessText(text);
199
+
200
+ expect(Array.isArray(result)).toBe(true);
201
+ expect(result).toContain('안녕하세요');
202
+ expect(result).toContain('테스트입니다');
203
+ });
204
+
205
+ it('should filter out short words', () => {
206
+ const text = 'a b c hello world';
207
+ const result = (service as any).preprocessText(text);
208
+
209
+ expect(result).not.toContain('a');
210
+ expect(result).not.toContain('b');
211
+ expect(result).not.toContain('c');
212
+ expect(result).toContain('hello');
213
+ expect(result).toContain('world');
214
+ });
215
+
216
+ it('should filter out stop words', () => {
217
+ const text = 'the quick brown fox jumps over the lazy dog';
218
+ const result = (service as any).preprocessText(text);
219
+
220
+ expect(result).not.toContain('the');
221
+ expect(result).toContain('quick');
222
+ expect(result).toContain('brown');
223
+ expect(result).toContain('fox');
224
+ });
225
+ });
226
+
227
+ describe('createTFIDFVector', () => {
228
+ it('should create TF-IDF vector', () => {
229
+ const words = ['hello', 'world', 'hello', 'test'];
230
+ const result = (service as any).createTFIDFVector(words);
231
+
232
+ expect(Array.isArray(result)).toBe(true);
233
+ expect(result.length).toBe(512);
234
+ expect(result.every(val => typeof val === 'number')).toBe(true);
235
+ });
236
+
237
+ it('should handle empty words array', () => {
238
+ const words: string[] = [];
239
+ const result = (service as any).createTFIDFVector(words);
240
+
241
+ expect(Array.isArray(result)).toBe(true);
242
+ expect(result.length).toBe(512);
243
+ expect(result.every(val => val === 0)).toBe(true);
244
+ });
245
+ });
246
+
247
+ describe('calculateIDF', () => {
248
+ it('should calculate IDF for different word types', () => {
249
+ const shortWord = 'hi';
250
+ const longWord = 'supercalifragilisticexpialidocious';
251
+ const numberWord = 'test123';
252
+ const specialWord = 'test-word';
253
+
254
+ const shortIDF = (service as any).calculateIDF(shortWord);
255
+ const longIDF = (service as any).calculateIDF(longWord);
256
+ const numberIDF = (service as any).calculateIDF(numberWord);
257
+ const specialIDF = (service as any).calculateIDF(specialWord);
258
+
259
+ expect(shortIDF).toBeGreaterThan(0);
260
+ expect(longIDF).toBeGreaterThan(shortIDF);
261
+ expect(numberIDF).toBeLessThan(shortIDF);
262
+ expect(specialIDF).toBeGreaterThan(shortIDF);
263
+ });
264
+ });
265
+
266
+ describe('applyKeywordWeights', () => {
267
+ it('should apply weights to technical terms', () => {
268
+ const vector = new Array(512).fill(0.1);
269
+ const words = ['React', 'API', 'HTTP', 'JSON'];
270
+
271
+ const result = (service as any).applyKeywordWeights(vector, words);
272
+
273
+ expect(Array.isArray(result)).toBe(true);
274
+ expect(result.length).toBe(512);
275
+ });
276
+
277
+ it('should handle empty words array', () => {
278
+ const vector = new Array(512).fill(0.1);
279
+ const words: string[] = [];
280
+
281
+ const result = (service as any).applyKeywordWeights(vector, words);
282
+
283
+ expect(result).toEqual(vector);
284
+ });
285
+
286
+ it('should handle undefined values safely', () => {
287
+ const vector = new Array(512).fill(0.1);
288
+ const words = ['test', '', undefined, 'word'];
289
+
290
+ expect(() => (service as any).applyKeywordWeights(vector, words)).not.toThrow();
291
+ });
292
+ });
293
+
294
+ describe('isTechnicalTerm', () => {
295
+ it('should identify camelCase as technical term', () => {
296
+ const result = (service as any).isTechnicalTerm('camelCase');
297
+ expect(result).toBe(true);
298
+ });
299
+
300
+ it('should identify PascalCase as technical term', () => {
301
+ const result = (service as any).isTechnicalTerm('PascalCase');
302
+ expect(result).toBe(true);
303
+ });
304
+
305
+ it('should identify snake_case as technical term', () => {
306
+ const result = (service as any).isTechnicalTerm('snake_case');
307
+ expect(result).toBe(true);
308
+ });
309
+
310
+ it('should identify kebab-case as technical term', () => {
311
+ const result = (service as any).isTechnicalTerm('kebab-case');
312
+ expect(result).toBe(true);
313
+ });
314
+
315
+ it('should identify technology terms', () => {
316
+ const techTerms = ['API', 'HTTP', 'JSON', 'XML', 'SQL', 'DB', 'UI', 'UX', 'AI', 'ML', 'NLP'];
317
+
318
+ techTerms.forEach(term => {
319
+ const result = (service as any).isTechnicalTerm(term);
320
+ expect(result).toBe(true);
321
+ });
322
+ });
323
+
324
+ it('should identify framework terms', () => {
325
+ const frameworkTerms = ['React', 'Vue', 'Angular', 'Node', 'Python', 'Java', 'TypeScript'];
326
+
327
+ frameworkTerms.forEach(term => {
328
+ const result = (service as any).isTechnicalTerm(term);
329
+ expect(result).toBe(true);
330
+ });
331
+ });
332
+
333
+ it('should not identify regular words as technical terms', () => {
334
+ const regularWords = ['hello', 'world', 'test', 'document'];
335
+
336
+ regularWords.forEach(word => {
337
+ const result = (service as any).isTechnicalTerm(word);
338
+ expect(result).toBe(false);
339
+ });
340
+ });
341
+ });
342
+
343
+ describe('normalizeVector', () => {
344
+ it('should normalize vector correctly', () => {
345
+ const vector = [3, 4, 0];
346
+ const result = (service as any).normalizeVector(vector);
347
+
348
+ expect(result.length).toBe(3);
349
+ expect(result[0]).toBeCloseTo(0.6, 1);
350
+ expect(result[1]).toBeCloseTo(0.8, 1);
351
+ expect(result[2]).toBe(0);
352
+ });
353
+
354
+ it('should handle zero vector', () => {
355
+ const vector = [0, 0, 0];
356
+ const result = (service as any).normalizeVector(vector);
357
+
358
+ expect(result).toEqual(vector);
359
+ });
360
+ });
361
+
362
+ describe('adjustDimensions', () => {
363
+ it('should pad vector when too short', () => {
364
+ const vector = [1, 2, 3];
365
+ const result = (service as any).adjustDimensions(vector);
366
+
367
+ expect(result.length).toBe(512);
368
+ expect(result[0]).toBe(1);
369
+ expect(result[1]).toBe(2);
370
+ expect(result[2]).toBe(3);
371
+ expect(result.slice(3).every(val => val === 0)).toBe(true);
372
+ });
373
+
374
+ it('should truncate vector when too long', () => {
375
+ const vector = new Array(600).fill(1);
376
+ const result = (service as any).adjustDimensions(vector);
377
+
378
+ expect(result.length).toBe(512);
379
+ expect(result.every(val => val === 1)).toBe(true);
380
+ });
381
+
382
+ it('should return same vector when dimensions match', () => {
383
+ const vector = new Array(512).fill(0.5);
384
+ const result = (service as any).adjustDimensions(vector);
385
+
386
+ expect(result).toEqual(vector);
387
+ });
388
+ });
389
+
390
+ describe('hashToIndex', () => {
391
+ it('should generate consistent indices', () => {
392
+ const word = 'test';
393
+ const index1 = (service as any).hashToIndex(word);
394
+ const index2 = (service as any).hashToIndex(word);
395
+
396
+ expect(index1).toBe(index2);
397
+ expect(index1).toBeGreaterThanOrEqual(0);
398
+ expect(index1).toBeLessThan(512);
399
+ });
400
+
401
+ it('should generate different indices for different words', () => {
402
+ const index1 = (service as any).hashToIndex('word1');
403
+ const index2 = (service as any).hashToIndex('word2');
404
+
405
+ expect(index1).not.toBe(index2);
406
+ });
407
+ });
408
+
409
+ describe('cosineSimilarity', () => {
410
+ it('should calculate cosine similarity correctly', () => {
411
+ const a = [1, 0, 0];
412
+ const b = [1, 0, 0];
413
+ const similarity = (service as any).cosineSimilarity(a, b);
414
+
415
+ expect(similarity).toBe(1);
416
+ });
417
+
418
+ it('should calculate cosine similarity for different vectors', () => {
419
+ const a = [1, 0, 0];
420
+ const b = [0, 1, 0];
421
+ const similarity = (service as any).cosineSimilarity(a, b);
422
+
423
+ expect(similarity).toBe(0);
424
+ });
425
+
426
+ it('should handle zero vectors', () => {
427
+ const a = [0, 0, 0];
428
+ const b = [1, 1, 1];
429
+ const similarity = (service as any).cosineSimilarity(a, b);
430
+
431
+ expect(similarity).toBe(0);
432
+ });
433
+
434
+ it('should throw error for mismatched dimensions', () => {
435
+ const a = [1, 2, 3];
436
+ const b = [1, 2];
437
+
438
+ expect(() => (service as any).cosineSimilarity(a, b)).toThrow('벡터 차원이 일치하지 않습니다');
439
+ });
440
+ });
441
+
442
+ describe('estimateTokens', () => {
443
+ it('should estimate tokens correctly', () => {
444
+ const text = 'hello world'; // 11 characters
445
+ const tokens = (service as any).estimateTokens(text);
446
+
447
+ expect(tokens).toBe(3); // 11 / 4 = 2.75, rounded up to 3
448
+ });
449
+
450
+ it('should handle empty text', () => {
451
+ const text = '';
452
+ const tokens = (service as any).estimateTokens(text);
453
+
454
+ expect(tokens).toBe(0);
455
+ });
456
+ });
457
+ });
458
+ });