memento-mcp-server 1.16.2 → 1.16.3-b

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 (220) hide show
  1. package/dist/domains/anchor/services/anchor/n-hop-search-service.d.ts.map +1 -1
  2. package/dist/domains/anchor/services/anchor/n-hop-search-service.js +4 -5
  3. package/dist/domains/anchor/services/anchor/n-hop-search-service.js.map +1 -1
  4. package/dist/domains/embedding/services/embedding-service.d.ts.map +1 -1
  5. package/dist/domains/embedding/services/embedding-service.js +5 -2
  6. package/dist/domains/embedding/services/embedding-service.js.map +1 -1
  7. package/dist/domains/embedding/services/gemini-embedding-service.d.ts.map +1 -1
  8. package/dist/domains/embedding/services/gemini-embedding-service.js +6 -3
  9. package/dist/domains/embedding/services/gemini-embedding-service.js.map +1 -1
  10. package/dist/domains/embedding/services/lightweight-embedding-service.d.ts.map +1 -1
  11. package/dist/domains/embedding/services/lightweight-embedding-service.js +4 -2
  12. package/dist/domains/embedding/services/lightweight-embedding-service.js.map +1 -1
  13. package/dist/domains/embedding/services/minilm-embedding-service.d.ts.map +1 -1
  14. package/dist/domains/embedding/services/minilm-embedding-service.js +6 -3
  15. package/dist/domains/embedding/services/minilm-embedding-service.js.map +1 -1
  16. package/dist/domains/embedding/services/openai-embedding-service.d.ts.map +1 -1
  17. package/dist/domains/embedding/services/openai-embedding-service.js +5 -2
  18. package/dist/domains/embedding/services/openai-embedding-service.js.map +1 -1
  19. package/dist/domains/embedding/services/unified-embedding-service.d.ts.map +1 -1
  20. package/dist/domains/embedding/services/unified-embedding-service.js +6 -3
  21. package/dist/domains/embedding/services/unified-embedding-service.js.map +1 -1
  22. package/dist/domains/forgetting/services/forgetting-policy-service.d.ts.map +1 -1
  23. package/dist/domains/forgetting/services/forgetting-policy-service.js +3 -1
  24. package/dist/domains/forgetting/services/forgetting-policy-service.js.map +1 -1
  25. package/dist/domains/memory/services/memory-embedding-service.d.ts +1 -0
  26. package/dist/domains/memory/services/memory-embedding-service.d.ts.map +1 -1
  27. package/dist/domains/memory/services/memory-embedding-service.js +43 -39
  28. package/dist/domains/memory/services/memory-embedding-service.js.map +1 -1
  29. package/dist/domains/memory/services/memory-neighbor-service.d.ts.map +1 -1
  30. package/dist/domains/memory/services/memory-neighbor-service.js +13 -4
  31. package/dist/domains/memory/services/memory-neighbor-service.js.map +1 -1
  32. package/dist/domains/memory/tools/convert-episodic-to-semantic-tool.js +5 -6
  33. package/dist/domains/memory/tools/convert-episodic-to-semantic-tool.js.map +1 -1
  34. package/dist/domains/memory/tools/forget-tool.d.ts.map +1 -1
  35. package/dist/domains/memory/tools/forget-tool.js +5 -2
  36. package/dist/domains/memory/tools/forget-tool.js.map +1 -1
  37. package/dist/domains/memory/tools/memory-injection-prompt.d.ts.map +1 -1
  38. package/dist/domains/memory/tools/memory-injection-prompt.js +3 -1
  39. package/dist/domains/memory/tools/memory-injection-prompt.js.map +1 -1
  40. package/dist/domains/memory/tools/pin-tool.d.ts.map +1 -1
  41. package/dist/domains/memory/tools/pin-tool.js +5 -2
  42. package/dist/domains/memory/tools/pin-tool.js.map +1 -1
  43. package/dist/domains/memory/tools/unpin-tool.d.ts.map +1 -1
  44. package/dist/domains/memory/tools/unpin-tool.js +5 -2
  45. package/dist/domains/memory/tools/unpin-tool.js.map +1 -1
  46. package/dist/domains/monitoring/services/error-logging-service.d.ts +5 -0
  47. package/dist/domains/monitoring/services/error-logging-service.d.ts.map +1 -1
  48. package/dist/domains/monitoring/services/error-logging-service.js +28 -10
  49. package/dist/domains/monitoring/services/error-logging-service.js.map +1 -1
  50. package/dist/domains/monitoring/services/performance-alert-service.d.ts.map +1 -1
  51. package/dist/domains/monitoring/services/performance-alert-service.js +5 -2
  52. package/dist/domains/monitoring/services/performance-alert-service.js.map +1 -1
  53. package/dist/domains/relation/services/relation-graph.d.ts.map +1 -1
  54. package/dist/domains/relation/services/relation-graph.js +3 -4
  55. package/dist/domains/relation/services/relation-graph.js.map +1 -1
  56. package/dist/domains/search/algorithms/hybrid-search-engine.d.ts.map +1 -1
  57. package/dist/domains/search/algorithms/hybrid-search-engine.js +15 -10
  58. package/dist/domains/search/algorithms/hybrid-search-engine.js.map +1 -1
  59. package/dist/domains/search/algorithms/search-engine.d.ts.map +1 -1
  60. package/dist/domains/search/algorithms/search-engine.js +8 -4
  61. package/dist/domains/search/algorithms/search-engine.js.map +1 -1
  62. package/dist/domains/search/algorithms/vector-search-engine-migration.d.ts +13 -8
  63. package/dist/domains/search/algorithms/vector-search-engine-migration.d.ts.map +1 -1
  64. package/dist/domains/search/algorithms/vector-search-engine-migration.js +28 -45
  65. package/dist/domains/search/algorithms/vector-search-engine-migration.js.map +1 -1
  66. package/dist/domains/search/algorithms/vector-search-engine.d.ts +17 -35
  67. package/dist/domains/search/algorithms/vector-search-engine.d.ts.map +1 -1
  68. package/dist/domains/search/algorithms/vector-search-engine.js +94 -478
  69. package/dist/domains/search/algorithms/vector-search-engine.js.map +1 -1
  70. package/dist/domains/search/repositories/vector-performance.repository.d.ts.map +1 -1
  71. package/dist/domains/search/repositories/vector-performance.repository.js +3 -1
  72. package/dist/domains/search/repositories/vector-performance.repository.js.map +1 -1
  73. package/dist/domains/search/repositories/vector-search.repository.d.ts +1 -0
  74. package/dist/domains/search/repositories/vector-search.repository.d.ts.map +1 -1
  75. package/dist/domains/search/repositories/vector-search.repository.js +178 -157
  76. package/dist/domains/search/repositories/vector-search.repository.js.map +1 -1
  77. package/dist/domains/search/services/vector-search/vector-index-manager.d.ts.map +1 -1
  78. package/dist/domains/search/services/vector-search/vector-index-manager.js +7 -3
  79. package/dist/domains/search/services/vector-search/vector-index-manager.js.map +1 -1
  80. package/dist/domains/search/services/vector-search/vector-performance-tester.d.ts.map +1 -1
  81. package/dist/domains/search/services/vector-search/vector-performance-tester.js +3 -1
  82. package/dist/domains/search/services/vector-search/vector-performance-tester.js.map +1 -1
  83. package/dist/infrastructure/database/database/init.d.ts.map +1 -1
  84. package/dist/infrastructure/database/database/init.js +29 -7
  85. package/dist/infrastructure/database/database/init.js.map +1 -1
  86. package/dist/infrastructure/database/database/migrate.d.ts.map +1 -1
  87. package/dist/infrastructure/database/database/migrate.js +5 -2
  88. package/dist/infrastructure/database/database/migrate.js.map +1 -1
  89. package/dist/infrastructure/database/database/migration/backup-manager.d.ts.map +1 -1
  90. package/dist/infrastructure/database/database/migration/backup-manager.js +11 -5
  91. package/dist/infrastructure/database/database/migration/backup-manager.js.map +1 -1
  92. package/dist/infrastructure/database/database/migration/migration-detector.d.ts.map +1 -1
  93. package/dist/infrastructure/database/database/migration/migration-detector.js +3 -1
  94. package/dist/infrastructure/database/database/migration/migration-detector.js.map +1 -1
  95. package/dist/infrastructure/database/database/migration/migration-logger.d.ts.map +1 -1
  96. package/dist/infrastructure/database/database/migration/migration-logger.js +5 -2
  97. package/dist/infrastructure/database/database/migration/migration-logger.js.map +1 -1
  98. package/dist/infrastructure/database/database/migration/migration-runner.d.ts.map +1 -1
  99. package/dist/infrastructure/database/database/migration/migration-runner.js +24 -13
  100. package/dist/infrastructure/database/database/migration/migration-runner.js.map +1 -1
  101. package/dist/infrastructure/database/database/migration/schema-version-manager.d.ts.map +1 -1
  102. package/dist/infrastructure/database/database/migration/schema-version-manager.js +7 -3
  103. package/dist/infrastructure/database/database/migration/schema-version-manager.js.map +1 -1
  104. package/dist/infrastructure/database/database-optimizer.d.ts.map +1 -1
  105. package/dist/infrastructure/database/database-optimizer.js +7 -6
  106. package/dist/infrastructure/database/database-optimizer.js.map +1 -1
  107. package/dist/infrastructure/database/migration-history-service.d.ts.map +1 -1
  108. package/dist/infrastructure/database/migration-history-service.js +3 -1
  109. package/dist/infrastructure/database/migration-history-service.js.map +1 -1
  110. package/dist/infrastructure/logging/triple-extraction-logger.d.ts +6 -0
  111. package/dist/infrastructure/logging/triple-extraction-logger.d.ts.map +1 -1
  112. package/dist/infrastructure/logging/triple-extraction-logger.js +50 -12
  113. package/dist/infrastructure/logging/triple-extraction-logger.js.map +1 -1
  114. package/dist/infrastructure/scheduler/batch-scheduler.d.ts.map +1 -1
  115. package/dist/infrastructure/scheduler/batch-scheduler.js +5 -2
  116. package/dist/infrastructure/scheduler/batch-scheduler.js.map +1 -1
  117. package/dist/infrastructure/scheduler/file-logger.d.ts +4 -1
  118. package/dist/infrastructure/scheduler/file-logger.d.ts.map +1 -1
  119. package/dist/infrastructure/scheduler/file-logger.js +46 -16
  120. package/dist/infrastructure/scheduler/file-logger.js.map +1 -1
  121. package/dist/scripts/check-migration-status.d.ts.map +1 -1
  122. package/dist/scripts/check-migration-status.js +19 -6
  123. package/dist/scripts/check-migration-status.js.map +1 -1
  124. package/dist/server/http-server.d.ts.map +1 -1
  125. package/dist/server/http-server.js +2 -7
  126. package/dist/server/http-server.js.map +1 -1
  127. package/dist/server/index.d.ts +3 -0
  128. package/dist/server/index.d.ts.map +1 -1
  129. package/dist/server/index.js +33 -7
  130. package/dist/server/index.js.map +1 -1
  131. package/dist/server/server-factory.d.ts +65 -0
  132. package/dist/server/server-factory.d.ts.map +1 -0
  133. package/dist/server/server-factory.js +40 -0
  134. package/dist/server/server-factory.js.map +1 -0
  135. package/dist/server/servers/sse-server.d.ts +33 -0
  136. package/dist/server/servers/sse-server.d.ts.map +1 -0
  137. package/dist/server/servers/sse-server.js +48 -0
  138. package/dist/server/servers/sse-server.js.map +1 -0
  139. package/dist/server/servers/stdio-server.d.ts +34 -0
  140. package/dist/server/servers/stdio-server.d.ts.map +1 -0
  141. package/dist/server/servers/stdio-server.js +58 -0
  142. package/dist/server/servers/stdio-server.js.map +1 -0
  143. package/dist/server/simple-mcp-server.d.ts +5 -0
  144. package/dist/server/simple-mcp-server.d.ts.map +1 -1
  145. package/dist/server/simple-mcp-server.js +17 -7
  146. package/dist/server/simple-mcp-server.js.map +1 -1
  147. package/dist/server/sse-server-impl.d.ts +22 -0
  148. package/dist/server/sse-server-impl.d.ts.map +1 -0
  149. package/dist/server/sse-server-impl.js +39 -0
  150. package/dist/server/sse-server-impl.js.map +1 -0
  151. package/dist/server/stdio-server-impl.d.ts +12 -0
  152. package/dist/server/stdio-server-impl.d.ts.map +1 -0
  153. package/dist/server/stdio-server-impl.js +19 -0
  154. package/dist/server/stdio-server-impl.js.map +1 -0
  155. package/dist/services/quality-assurance/quality-recorder.js +2 -2
  156. package/dist/services/quality-assurance/quality-recorder.js.map +1 -1
  157. package/dist/services/quality-assurance/quality-threshold-manager.js +1 -1
  158. package/dist/services/quality-assurance/quality-threshold-manager.js.map +1 -1
  159. package/dist/shared/config/environment.d.ts.map +1 -1
  160. package/dist/shared/config/environment.js +3 -1
  161. package/dist/shared/config/environment.js.map +1 -1
  162. package/dist/shared/types/vector-search.types.d.ts +1 -0
  163. package/dist/shared/types/vector-search.types.d.ts.map +1 -1
  164. package/dist/shared/utils/fts5-migration-status.d.ts.map +1 -1
  165. package/dist/shared/utils/fts5-migration-status.js +6 -2
  166. package/dist/shared/utils/fts5-migration-status.js.map +1 -1
  167. package/dist/shared/utils/logger.d.ts.map +1 -1
  168. package/dist/shared/utils/logger.js +15 -2
  169. package/dist/shared/utils/logger.js.map +1 -1
  170. package/dist/shared/utils/path-validator.d.ts +27 -0
  171. package/dist/shared/utils/path-validator.d.ts.map +1 -0
  172. package/dist/shared/utils/path-validator.js +166 -0
  173. package/dist/shared/utils/path-validator.js.map +1 -0
  174. package/dist/shared/utils/pii-masker.d.ts +31 -0
  175. package/dist/shared/utils/pii-masker.d.ts.map +1 -1
  176. package/dist/shared/utils/pii-masker.js +99 -0
  177. package/dist/shared/utils/pii-masker.js.map +1 -1
  178. package/dist/shared/utils/procedural-memory-extractor.d.ts.map +1 -1
  179. package/dist/shared/utils/procedural-memory-extractor.js +39 -33
  180. package/dist/shared/utils/procedural-memory-extractor.js.map +1 -1
  181. package/dist/shared/utils/prompt-template-loader.d.ts +6 -0
  182. package/dist/shared/utils/prompt-template-loader.d.ts.map +1 -1
  183. package/dist/shared/utils/prompt-template-loader.js +20 -8
  184. package/dist/shared/utils/prompt-template-loader.js.map +1 -1
  185. package/dist/shared/utils/reflection-notes-merge.d.ts.map +1 -1
  186. package/dist/shared/utils/reflection-notes-merge.js +5 -4
  187. package/dist/shared/utils/reflection-notes-merge.js.map +1 -1
  188. package/dist/shared/utils/sql-security-validator.d.ts +25 -0
  189. package/dist/shared/utils/sql-security-validator.d.ts.map +1 -0
  190. package/dist/shared/utils/sql-security-validator.js +67 -0
  191. package/dist/shared/utils/sql-security-validator.js.map +1 -0
  192. package/dist/shared/utils/write-coalescing.d.ts.map +1 -1
  193. package/dist/shared/utils/write-coalescing.js +7 -3
  194. package/dist/shared/utils/write-coalescing.js.map +1 -1
  195. package/package.json +2 -1
  196. package/scripts/__tests__/check-db-integrity.integration.spec.ts +163 -0
  197. package/scripts/__tests__/fix-migration.integration.spec.ts +203 -0
  198. package/scripts/__tests__/migrate-embedding-data.integration.spec.ts +219 -0
  199. package/scripts/__tests__/regenerate-embeddings.integration.spec.ts +192 -0
  200. package/scripts/backup-daily.bat +10 -2
  201. package/scripts/backup-embeddings.js +67 -56
  202. package/scripts/check-db-integrity.js +49 -25
  203. package/scripts/check-file-sizes.ts +4 -4
  204. package/scripts/check-path-traversal.ts +370 -0
  205. package/scripts/check-pii-masking.ts +357 -0
  206. package/scripts/check-sql-injection.ts +598 -0
  207. package/scripts/debug-embeddings.js +74 -93
  208. package/scripts/fix-migration.js +115 -80
  209. package/scripts/fix-vector-dimensions.js +70 -89
  210. package/scripts/migrate-embedding-data.js +111 -25
  211. package/scripts/regenerate-embeddings.js +31 -15
  212. package/scripts/run-migration.js +144 -107
  213. package/scripts/safe-migration.js +192 -142
  214. package/scripts/save-work-memory.ts +6 -7
  215. package/scripts/simple-migrate.js +66 -34
  216. package/scripts/simple-update.js +147 -109
  217. package/dist/domains/search/algorithms/vector-search-engine-refactored.d.ts +0 -56
  218. package/dist/domains/search/algorithms/vector-search-engine-refactored.d.ts.map +0 -1
  219. package/dist/domains/search/algorithms/vector-search-engine-refactored.js +0 -101
  220. package/dist/domains/search/algorithms/vector-search-engine-refactored.js.map +0 -1
@@ -0,0 +1,25 @@
1
+ /**
2
+ * SQL 보안 검증 유틸리티
3
+ * SQL Injection 방지를 위한 공통 검증 함수 제공
4
+ *
5
+ * PRD 0019: 보안 강화 (Phase 1) - SQL Injection 방지
6
+ */
7
+ /**
8
+ * SQL Injection 방지를 위한 테이블명 화이트리스트 검증
9
+ * 허용된 테이블명만 사용하도록 보장합니다.
10
+ *
11
+ * @param tableName 검증할 테이블명
12
+ * @param allowedTableNames 허용된 테이블명 목록 (선택적, 미지정 시 VECTOR_SEARCH_CONFIG.tableNames 사용)
13
+ * @throws Error 허용되지 않은 테이블명인 경우
14
+ */
15
+ export declare function validateTableName(tableName: string, allowedTableNames?: string[]): void;
16
+ /**
17
+ * 벡터 검색 테이블명을 provider로부터 안전하게 가져오기
18
+ * 화이트리스트 검증을 포함합니다.
19
+ *
20
+ * @param provider 임베딩 provider 이름
21
+ * @returns 검증된 테이블명
22
+ * @throws Error 허용되지 않은 provider인 경우
23
+ */
24
+ export declare function getVectorTableName(provider: string): string;
25
+ //# sourceMappingURL=sql-security-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-security-validator.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/sql-security-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAC3B,IAAI,CAmCN;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkB3D"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * SQL 보안 검증 유틸리티
3
+ * SQL Injection 방지를 위한 공통 검증 함수 제공
4
+ *
5
+ * PRD 0019: 보안 강화 (Phase 1) - SQL Injection 방지
6
+ */
7
+ import { VECTOR_SEARCH_CONFIG } from '../../shared/config/vector-search.config.js';
8
+ /**
9
+ * SQL Injection 방지를 위한 테이블명 화이트리스트 검증
10
+ * 허용된 테이블명만 사용하도록 보장합니다.
11
+ *
12
+ * @param tableName 검증할 테이블명
13
+ * @param allowedTableNames 허용된 테이블명 목록 (선택적, 미지정 시 VECTOR_SEARCH_CONFIG.tableNames 사용)
14
+ * @throws Error 허용되지 않은 테이블명인 경우
15
+ */
16
+ export function validateTableName(tableName, allowedTableNames) {
17
+ // 1. 화이트리스트에 정의된 테이블명만 허용
18
+ const allowed = allowedTableNames ?? Object.values(VECTOR_SEARCH_CONFIG.tableNames);
19
+ if (!allowed.includes(tableName)) {
20
+ throw new Error(`SQL Injection 방지: 허용되지 않은 테이블명입니다. ` +
21
+ `허용된 테이블명: ${allowed.join(', ')}. ` +
22
+ `입력된 테이블명: ${tableName}`);
23
+ }
24
+ // 2. 테이블명 패턴 검증: 소문자, 숫자, 언더스코어만 허용
25
+ const tableNamePattern = /^[a-z0-9_]+$/;
26
+ if (!tableNamePattern.test(tableName)) {
27
+ throw new Error(`SQL Injection 방지: 테이블명은 소문자, 숫자, 언더스코어만 허용됩니다. ` +
28
+ `입력된 테이블명: ${tableName}`);
29
+ }
30
+ // 3. SQL 키워드 포함 여부 확인
31
+ const sqlKeywords = [
32
+ 'SELECT', 'INSERT', 'UPDATE', 'DELETE', 'DROP', 'CREATE', 'ALTER',
33
+ 'FROM', 'WHERE', 'JOIN', 'UNION', 'EXEC', 'EXECUTE', 'SCRIPT',
34
+ '--', '/*', '*/', ';', '\'', '"', '`'
35
+ ];
36
+ const upperTableName = tableName.toUpperCase();
37
+ for (const keyword of sqlKeywords) {
38
+ if (upperTableName.includes(keyword.toUpperCase())) {
39
+ throw new Error(`SQL Injection 방지: 테이블명에 SQL 키워드가 포함되어 있습니다. ` +
40
+ `키워드: ${keyword}, 테이블명: ${tableName}`);
41
+ }
42
+ }
43
+ }
44
+ /**
45
+ * 벡터 검색 테이블명을 provider로부터 안전하게 가져오기
46
+ * 화이트리스트 검증을 포함합니다.
47
+ *
48
+ * @param provider 임베딩 provider 이름
49
+ * @returns 검증된 테이블명
50
+ * @throws Error 허용되지 않은 provider인 경우
51
+ */
52
+ export function getVectorTableName(provider) {
53
+ const normalizedProvider = provider.toLowerCase();
54
+ // 화이트리스트에서 테이블명 조회
55
+ const tableName = VECTOR_SEARCH_CONFIG.tableNames[normalizedProvider];
56
+ if (!tableName) {
57
+ // 알 수 없는 provider의 경우 기본 테이블 사용 (하위 호환성 유지)
58
+ const defaultTableName = VECTOR_SEARCH_CONFIG.tableNames.tfidf;
59
+ // 기본 테이블명도 화이트리스트 검증 수행
60
+ validateTableName(defaultTableName);
61
+ return defaultTableName;
62
+ }
63
+ // 화이트리스트 검증 수행
64
+ validateTableName(tableName);
65
+ return tableName;
66
+ }
67
+ //# sourceMappingURL=sql-security-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-security-validator.js","sourceRoot":"","sources":["../../../src/shared/utils/sql-security-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AAEnF;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,iBAA4B;IAE5B,0BAA0B;IAC1B,MAAM,OAAO,GAAG,iBAAiB,IAAI,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACpF,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,qCAAqC;YACrC,aAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YACnC,aAAa,SAAS,EAAE,CACzB,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,MAAM,gBAAgB,GAAG,cAAc,CAAC;IACxC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,iDAAiD;YACjD,aAAa,SAAS,EAAE,CACzB,CAAC;IACJ,CAAC;IAED,sBAAsB;IACtB,MAAM,WAAW,GAAG;QAClB,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO;QACjE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ;QAC7D,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG;KACtC,CAAC;IACF,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IAC/C,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CACb,8CAA8C;gBAC9C,QAAQ,OAAO,WAAW,SAAS,EAAE,CACtC,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAElD,mBAAmB;IACnB,MAAM,SAAS,GAAG,oBAAoB,CAAC,UAAU,CAAC,kBAAkE,CAAC,CAAC;IAEtH,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,4CAA4C;QAC5C,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,UAAU,CAAC,KAAe,CAAC;QACzE,wBAAwB;QACxB,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;QACpC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,eAAe;IACf,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAE7B,OAAO,SAAmB,CAAC;AAC7B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"write-coalescing.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/write-coalescing.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,MAAM,EAAE;QACN,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH;AAED;;;GAGG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,aAAa,CAA8C;IAEnE;;;OAGG;gBAED,eAAe,EAAE,MAAM,YAAO,EAC9B,aAAa,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC;IAM5D;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IA0BrC;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAMzC;;OAEG;IACH,OAAO,CAAC,eAAe;IA6BvB;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAoC9B;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAwC/B"}
1
+ {"version":3,"file":"write-coalescing.d.ts","sourceRoot":"","sources":["../../../src/shared/utils/write-coalescing.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,MAAM,EAAE;QACN,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH;AAED;;;GAGG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,aAAa,CAA8C;IAEnE;;;OAGG;gBAED,eAAe,EAAE,MAAM,YAAO,EAC9B,aAAa,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC;IAM5D;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IA0BrC;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAMzC;;OAEG;IACH,OAAO,CAAC,eAAe;IA8BvB;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAqC9B;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAyC/B"}
@@ -6,6 +6,7 @@
6
6
  * - last_accessed_at 업데이트를 초당 1회로 제한
7
7
  * - recall_count 업데이트를 버퍼링하여 배치 처리
8
8
  */
9
+ import { PIIMasker } from './pii-masker.js';
9
10
  /**
10
11
  * Write Coalescing Manager
11
12
  * 메모리 버퍼를 사용하여 쓰기 작업을 결합하고 주기적으로 flush합니다.
@@ -88,7 +89,8 @@ export class WriteCoalescingManager {
88
89
  }
89
90
  catch (error) {
90
91
  // flush 실패는 무시 (이미 로깅됨)
91
- console.error('Write coalescing timer flush 실패:', error);
92
+ const maskedError = error instanceof Error ? PIIMasker.maskError(error) : { message: String(error), name: 'Error' };
93
+ console.error('Write coalescing timer flush 실패:', maskedError.message);
92
94
  }
93
95
  }
94
96
  }, this.flushInterval);
@@ -122,7 +124,8 @@ export class WriteCoalescingManager {
122
124
  catch (error) {
123
125
  // 에러 발생 시 버퍼에 다시 추가하지 않음 (데이터 손실 방지)
124
126
  // 대신 에러를 로깅하고 계속 진행
125
- console.error('Write coalescing flush 실패:', error);
127
+ const maskedError = error instanceof Error ? PIIMasker.maskError(error) : { message: String(error), name: 'Error' };
128
+ console.error('Write coalescing flush 실패:', maskedError.message);
126
129
  throw error;
127
130
  }
128
131
  finally {
@@ -174,7 +177,8 @@ export class WriteCoalescingManager {
174
177
  }
175
178
  }
176
179
  catch (error) {
177
- console.error('Write coalescing destroy flush 실패:', error);
180
+ const maskedError = error instanceof Error ? PIIMasker.maskError(error) : { message: String(error), name: 'Error' };
181
+ console.error('Write coalescing destroy 시 flush 실패:', maskedError.message);
178
182
  }
179
183
  }
180
184
  // 버퍼 초기화
@@ -1 +1 @@
1
- {"version":3,"file":"write-coalescing.js","sourceRoot":"","sources":["../../../src/shared/utils/write-coalescing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"write-coalescing.js","sourceRoot":"","sources":["../../../src/shared/utils/write-coalescing.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memento-mcp-server",
3
- "version": "1.16.2",
3
+ "version": "1.16.3-b",
4
4
  "description": "AI Agent 기억 보조 MCP 서버 - 사람의 기억 구조를 모사한 스토리지+검색+요약+망각 메커니즘",
5
5
  "main": "dist/server/index.js",
6
6
  "type": "module",
@@ -127,6 +127,7 @@
127
127
  "@typescript-eslint/parser": "^6.13.0",
128
128
  "@vitest/coverage-v8": "^1.0.0",
129
129
  "eslint": "^8.54.0",
130
+ "eslint-plugin-security": "^3.0.1",
130
131
  "eventsource": "^4.0.0",
131
132
  "tsx": "^4.6.0",
132
133
  "typescript": "^5.3.0",
@@ -0,0 +1,163 @@
1
+ /**
2
+ * check-db-integrity.js 통합 테스트
3
+ *
4
+ * Given/When/Then 구조를 따르는 통합 테스트
5
+ * 공통 모듈(initializeDatabase)을 사용하는 버전으로 리팩토링 후 검증
6
+ */
7
+
8
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
9
+ import { existsSync, unlinkSync, mkdirSync, copyFileSync } from 'fs';
10
+ import { join } from 'path';
11
+ import { tmpdir } from 'os';
12
+ import { initializeDatabase, closeDatabase } from '../../src/infrastructure/database/database/init.js';
13
+ import Database from 'better-sqlite3';
14
+
15
+ describe('check-db-integrity 통합 테스트', () => {
16
+ let testDbPath: string;
17
+ let testLogPath: string;
18
+ let testLogDir: string;
19
+ let originalDbPath: string | undefined;
20
+ let originalLogPath: string | undefined;
21
+
22
+ beforeEach(() => {
23
+ // 테스트용 임시 디렉토리 생성
24
+ const testDir = join(tmpdir(), `memento-test-${Date.now()}`);
25
+ mkdirSync(testDir, { recursive: true });
26
+
27
+ testDbPath = join(testDir, 'memory.db');
28
+ testLogDir = join(testDir, 'logs');
29
+ testLogPath = join(testLogDir, 'db-integrity.log');
30
+
31
+ mkdirSync(testLogDir, { recursive: true });
32
+
33
+ // 환경 변수 백업 및 설정
34
+ originalDbPath = process.env.DB_PATH;
35
+ process.env.DB_PATH = testDbPath;
36
+ });
37
+
38
+ afterEach(() => {
39
+ // 환경 변수 복원
40
+ if (originalDbPath !== undefined) {
41
+ process.env.DB_PATH = originalDbPath;
42
+ } else {
43
+ delete process.env.DB_PATH;
44
+ }
45
+
46
+ // 테스트 파일 정리
47
+ try {
48
+ if (existsSync(testLogPath)) {
49
+ unlinkSync(testLogPath);
50
+ }
51
+ if (existsSync(testDbPath)) {
52
+ unlinkSync(testDbPath);
53
+ }
54
+ } catch (error) {
55
+ // 파일 정리 실패는 무시
56
+ }
57
+ });
58
+
59
+ /**
60
+ * @given 공통 모듈(initializeDatabase)을 사용하는 check-db-integrity 함수
61
+ * @when 정상적인 데이터베이스에서 무결성 검사 실행
62
+ * @then 검사 통과 및 정상 상태 반환
63
+ */
64
+ it('should pass integrity check for valid database', async () => {
65
+ // Given: 정상적인 데이터베이스 초기화
66
+ const db = await initializeDatabase();
67
+
68
+ try {
69
+ // 기본 테이블 생성 (initializeDatabase가 자동으로 생성하지만, 명시적으로 확인)
70
+ const tables = db.prepare(`
71
+ SELECT name FROM sqlite_master
72
+ WHERE type='table' AND name IN ('memory_item', 'memory_embedding')
73
+ `).all();
74
+
75
+ expect(tables.length).toBeGreaterThanOrEqual(0);
76
+
77
+ // When: 무결성 검사 실행
78
+ const integrityResult = db.prepare('PRAGMA integrity_check').get() as { integrity_check: string };
79
+
80
+ // Then: 검사 통과
81
+ expect(integrityResult.integrity_check).toBe('ok');
82
+
83
+ // 데이터 개수 확인
84
+ const memoryCount = db.prepare('SELECT COUNT(*) as count FROM memory_item').get() as { count: number };
85
+ expect(memoryCount.count).toBeGreaterThanOrEqual(0);
86
+ } finally {
87
+ closeDatabase(db);
88
+ }
89
+ });
90
+
91
+ /**
92
+ * @given 공통 모듈(initializeDatabase)을 사용하는 check-db-integrity 함수
93
+ * @when 데이터베이스 파일이 없는 경우
94
+ * @then 적절한 에러 처리 또는 새 DB 생성
95
+ */
96
+ it('should handle missing database file', async () => {
97
+ // Given: DB_PATH를 존재하지 않는 경로로 설정
98
+ const nonExistentPath = join(tmpdir(), `non-existent-${Date.now()}.db`);
99
+ process.env.DB_PATH = nonExistentPath;
100
+
101
+ // When: initializeDatabase 호출
102
+ // Then: 새 데이터베이스가 생성되어야 함 (initializeDatabase의 동작)
103
+ const db = await initializeDatabase();
104
+
105
+ try {
106
+ expect(db).toBeDefined();
107
+ expect(existsSync(nonExistentPath)).toBe(true);
108
+ } finally {
109
+ closeDatabase(db);
110
+ if (existsSync(nonExistentPath)) {
111
+ unlinkSync(nonExistentPath);
112
+ }
113
+ }
114
+ });
115
+
116
+ /**
117
+ * @given 공통 모듈(initializeDatabase)을 사용하는 check-db-integrity 함수
118
+ * @when 필수 테이블이 존재하는 데이터베이스에서 검사 실행
119
+ * @then 필수 테이블 확인 통과
120
+ */
121
+ it('should verify required tables exist', async () => {
122
+ // Given: 정상적인 데이터베이스 초기화
123
+ const db = await initializeDatabase();
124
+
125
+ try {
126
+ // When: 필수 테이블 확인
127
+ const tables = db.prepare(`
128
+ SELECT name FROM sqlite_master
129
+ WHERE type='table' AND name IN ('memory_item', 'memory_embedding', 'memory_tag')
130
+ `).all() as Array<{ name: string }>;
131
+
132
+ // Then: 필수 테이블이 존재해야 함 (initializeDatabase가 스키마를 생성하므로)
133
+ const tableNames = tables.map(t => t.name);
134
+ expect(tableNames).toContain('memory_item');
135
+ // memory_embedding과 memory_tag는 스키마에 따라 있을 수 있음
136
+ } finally {
137
+ closeDatabase(db);
138
+ }
139
+ });
140
+
141
+ /**
142
+ * @given 공통 모듈(initializeDatabase)을 사용하는 check-db-integrity 함수
143
+ * @when 데이터 개수 확인 실행
144
+ * @then 정상적으로 데이터 개수 반환
145
+ */
146
+ it('should count data correctly', async () => {
147
+ // Given: 정상적인 데이터베이스 초기화
148
+ const db = await initializeDatabase();
149
+
150
+ try {
151
+ // When: 데이터 개수 확인
152
+ const memoryCount = db.prepare('SELECT COUNT(*) as count FROM memory_item').get() as { count: number };
153
+ const embeddingCount = db.prepare('SELECT COUNT(*) as count FROM memory_embedding').get() as { count: number };
154
+
155
+ // Then: 정상적으로 개수 반환 (0개 이상)
156
+ expect(memoryCount.count).toBeGreaterThanOrEqual(0);
157
+ expect(embeddingCount.count).toBeGreaterThanOrEqual(0);
158
+ } finally {
159
+ closeDatabase(db);
160
+ }
161
+ });
162
+ });
163
+
@@ -0,0 +1,203 @@
1
+ /**
2
+ * fix-migration.js 통합 테스트
3
+ *
4
+ * Given/When/Then 구조를 따르는 통합 테스트
5
+ * 공통 모듈(initializeDatabase)을 사용하는 버전으로 리팩토링 후 검증
6
+ */
7
+
8
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
9
+ import { existsSync, unlinkSync, mkdirSync } from 'fs';
10
+ import { join } from 'path';
11
+ import { tmpdir } from 'os';
12
+ import { initializeDatabase, closeDatabase } from '../../src/infrastructure/database/database/init.js';
13
+ import Database from 'better-sqlite3';
14
+
15
+ describe('fix-migration 통합 테스트', () => {
16
+ let testDbPath: string;
17
+ let originalDbPath: string | undefined;
18
+
19
+ beforeEach(() => {
20
+ // 테스트용 임시 디렉토리 생성
21
+ const testDir = join(tmpdir(), `memento-test-${Date.now()}`);
22
+ mkdirSync(testDir, { recursive: true });
23
+
24
+ testDbPath = join(testDir, 'memory.db');
25
+
26
+ // 환경 변수 백업 및 설정
27
+ originalDbPath = process.env.DB_PATH;
28
+ process.env.DB_PATH = testDbPath;
29
+ });
30
+
31
+ afterEach(() => {
32
+ // 환경 변수 복원
33
+ if (originalDbPath !== undefined) {
34
+ process.env.DB_PATH = originalDbPath;
35
+ } else {
36
+ delete process.env.DB_PATH;
37
+ }
38
+
39
+ // 테스트 파일 정리
40
+ try {
41
+ if (existsSync(testDbPath)) {
42
+ unlinkSync(testDbPath);
43
+ }
44
+ } catch (error) {
45
+ // 파일 정리 실패는 무시
46
+ }
47
+ });
48
+
49
+ /**
50
+ * @given 공통 모듈(initializeDatabase)을 사용하는 fix-migration 함수
51
+ * @when memory_embedding 테이블에 필요한 컬럼이 있는 경우
52
+ * @then 데이터 업데이트 및 인덱스 생성 성공
53
+ */
54
+ it('should update data and create indexes when required columns exist', async () => {
55
+ // Given: 정상적인 데이터베이스 초기화 및 테스트 데이터 생성
56
+ const db = await initializeDatabase();
57
+
58
+ try {
59
+ // memory_embedding 테이블이 있는지 확인 (initializeDatabase가 생성할 수 있음)
60
+ const tableExists = db.prepare(`
61
+ SELECT name FROM sqlite_master
62
+ WHERE type='table' AND name='memory_embedding'
63
+ `).get();
64
+
65
+ if (!tableExists) {
66
+ // 테이블이 없으면 생성 (테스트용)
67
+ db.exec(`
68
+ CREATE TABLE IF NOT EXISTS memory_embedding (
69
+ id INTEGER PRIMARY KEY,
70
+ embedding TEXT,
71
+ dim INTEGER,
72
+ model TEXT,
73
+ embedding_provider TEXT,
74
+ dimensions INTEGER,
75
+ created_by TEXT
76
+ )
77
+ `);
78
+ }
79
+
80
+ // 테스트 데이터 삽입
81
+ db.exec(`
82
+ INSERT INTO memory_embedding (id, embedding, dim, model, embedding_provider, dimensions, created_by)
83
+ VALUES
84
+ (1, '[]', 384, 'lightweight-hybrid', NULL, NULL, NULL),
85
+ (2, '[]', 512, NULL, NULL, NULL, NULL),
86
+ (3, '[]', 384, '', NULL, NULL, NULL)
87
+ `);
88
+
89
+ // When: fix-migration 로직 실행
90
+ const currentSchema = db.prepare("PRAGMA table_info(memory_embedding)").all() as Array<{ name: string }>;
91
+ const hasProvider = currentSchema.some(col => col.name === 'embedding_provider');
92
+ const hasDimensions = currentSchema.some(col => col.name === 'dimensions');
93
+ const hasCreatedBy = currentSchema.some(col => col.name === 'created_by');
94
+
95
+ if (hasProvider && hasDimensions && hasCreatedBy) {
96
+ // 데이터 업데이트
97
+ const updateResult = db.prepare(`
98
+ UPDATE memory_embedding
99
+ SET
100
+ embedding_provider = CASE
101
+ WHEN model = 'lightweight-hybrid' THEN 'tfidf'
102
+ WHEN model IS NULL OR model = '' THEN 'tfidf'
103
+ ELSE 'unknown'
104
+ END,
105
+ dimensions = dim,
106
+ created_by = 'legacy'
107
+ WHERE embedding_provider IS NULL
108
+ `).run();
109
+
110
+ // 인덱스 생성
111
+ db.exec('CREATE INDEX IF NOT EXISTS idx_memory_embedding_provider ON memory_embedding(embedding_provider)');
112
+ db.exec('CREATE INDEX IF NOT EXISTS idx_memory_embedding_dimensions ON memory_embedding(dimensions)');
113
+ db.exec('CREATE INDEX IF NOT EXISTS idx_memory_embedding_created_by ON memory_embedding(created_by)');
114
+
115
+ // Then: 업데이트 성공 확인
116
+ expect(updateResult.changes).toBeGreaterThan(0);
117
+
118
+ // 검증
119
+ const validation = db.prepare(`
120
+ SELECT
121
+ COUNT(*) as total,
122
+ COUNT(CASE WHEN embedding_provider IS NOT NULL THEN 1 END) as with_provider,
123
+ COUNT(CASE WHEN dimensions IS NOT NULL THEN 1 END) as with_dimensions,
124
+ COUNT(CASE WHEN created_by IS NOT NULL THEN 1 END) as with_created_by
125
+ FROM memory_embedding
126
+ `).get() as { total: number; with_provider: number; with_dimensions: number; with_created_by: number };
127
+
128
+ expect(validation.with_provider).toBeGreaterThan(0);
129
+ expect(validation.with_dimensions).toBeGreaterThan(0);
130
+ expect(validation.with_created_by).toBeGreaterThan(0);
131
+ } else {
132
+ // 필요한 컬럼이 없는 경우 스킵
133
+ console.log('⚠️ 필요한 컬럼이 없습니다. 테스트 스킵');
134
+ }
135
+ } finally {
136
+ closeDatabase(db);
137
+ }
138
+ });
139
+
140
+ /**
141
+ * @given 공통 모듈(initializeDatabase)을 사용하는 fix-migration 함수
142
+ * @when 필요한 컬럼이 없는 경우
143
+ * @then 적절한 에러 메시지 또는 스킵 처리
144
+ */
145
+ it('should handle missing required columns gracefully', async () => {
146
+ // Given: 정상적인 데이터베이스 초기화
147
+ const db = await initializeDatabase();
148
+
149
+ try {
150
+ // When: 컬럼 확인
151
+ const currentSchema = db.prepare("PRAGMA table_info(memory_embedding)").all() as Array<{ name: string }>;
152
+ const hasProvider = currentSchema.some(col => col.name === 'embedding_provider');
153
+ const hasDimensions = currentSchema.some(col => col.name === 'dimensions');
154
+ const hasCreatedBy = currentSchema.some(col => col.name === 'created_by');
155
+
156
+ // Then: 컬럼 존재 여부에 따라 적절히 처리
157
+ if (!hasProvider || !hasDimensions || !hasCreatedBy) {
158
+ // 필요한 컬럼이 없으면 스킵 (에러 없이)
159
+ expect(true).toBe(true); // 테스트 통과
160
+ } else {
161
+ // 컬럼이 있으면 정상 처리
162
+ expect(hasProvider).toBe(true);
163
+ expect(hasDimensions).toBe(true);
164
+ expect(hasCreatedBy).toBe(true);
165
+ }
166
+ } finally {
167
+ closeDatabase(db);
168
+ }
169
+ });
170
+
171
+ /**
172
+ * @given 공통 모듈(initializeDatabase)을 사용하는 fix-migration 함수
173
+ * @when 인덱스 생성 실행
174
+ * @then 인덱스가 정상적으로 생성됨
175
+ */
176
+ it('should create indexes successfully', async () => {
177
+ // Given: 정상적인 데이터베이스 초기화
178
+ const db = await initializeDatabase();
179
+
180
+ try {
181
+ // When: 인덱스 생성
182
+ db.exec('CREATE INDEX IF NOT EXISTS idx_memory_embedding_provider ON memory_embedding(embedding_provider)');
183
+ db.exec('CREATE INDEX IF NOT EXISTS idx_memory_embedding_dimensions ON memory_embedding(dimensions)');
184
+ db.exec('CREATE INDEX IF NOT EXISTS idx_memory_embedding_created_by ON memory_embedding(created_by)');
185
+
186
+ // Then: 인덱스가 생성되었는지 확인
187
+ const indexes = db.prepare(`
188
+ SELECT name FROM sqlite_master
189
+ WHERE type='index' AND name IN (
190
+ 'idx_memory_embedding_provider',
191
+ 'idx_memory_embedding_dimensions',
192
+ 'idx_memory_embedding_created_by'
193
+ )
194
+ `).all() as Array<{ name: string }>;
195
+
196
+ // 인덱스가 생성되었거나, 테이블이 없어서 생성되지 않았을 수 있음
197
+ expect(indexes.length).toBeGreaterThanOrEqual(0);
198
+ } finally {
199
+ closeDatabase(db);
200
+ }
201
+ });
202
+ });
203
+