memento-mcp-server 1.16.3-a → 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 (68) hide show
  1. package/dist/domains/search/algorithms/vector-search-engine-migration.d.ts +13 -8
  2. package/dist/domains/search/algorithms/vector-search-engine-migration.d.ts.map +1 -1
  3. package/dist/domains/search/algorithms/vector-search-engine-migration.js +19 -41
  4. package/dist/domains/search/algorithms/vector-search-engine-migration.js.map +1 -1
  5. package/dist/domains/search/algorithms/vector-search-engine.d.ts +17 -36
  6. package/dist/domains/search/algorithms/vector-search-engine.d.ts.map +1 -1
  7. package/dist/domains/search/algorithms/vector-search-engine.js +94 -481
  8. package/dist/domains/search/algorithms/vector-search-engine.js.map +1 -1
  9. package/dist/domains/search/repositories/vector-search.repository.d.ts.map +1 -1
  10. package/dist/domains/search/repositories/vector-search.repository.js +28 -12
  11. package/dist/domains/search/repositories/vector-search.repository.js.map +1 -1
  12. package/dist/server/http-server.d.ts.map +1 -1
  13. package/dist/server/http-server.js +2 -7
  14. package/dist/server/http-server.js.map +1 -1
  15. package/dist/server/index.d.ts +3 -0
  16. package/dist/server/index.d.ts.map +1 -1
  17. package/dist/server/index.js +33 -7
  18. package/dist/server/index.js.map +1 -1
  19. package/dist/server/server-factory.d.ts +65 -0
  20. package/dist/server/server-factory.d.ts.map +1 -0
  21. package/dist/server/server-factory.js +40 -0
  22. package/dist/server/server-factory.js.map +1 -0
  23. package/dist/server/servers/sse-server.d.ts +33 -0
  24. package/dist/server/servers/sse-server.d.ts.map +1 -0
  25. package/dist/server/servers/sse-server.js +48 -0
  26. package/dist/server/servers/sse-server.js.map +1 -0
  27. package/dist/server/servers/stdio-server.d.ts +34 -0
  28. package/dist/server/servers/stdio-server.d.ts.map +1 -0
  29. package/dist/server/servers/stdio-server.js +58 -0
  30. package/dist/server/servers/stdio-server.js.map +1 -0
  31. package/dist/server/simple-mcp-server.d.ts +5 -0
  32. package/dist/server/simple-mcp-server.d.ts.map +1 -1
  33. package/dist/server/simple-mcp-server.js +17 -7
  34. package/dist/server/simple-mcp-server.js.map +1 -1
  35. package/dist/server/sse-server-impl.d.ts +22 -0
  36. package/dist/server/sse-server-impl.d.ts.map +1 -0
  37. package/dist/server/sse-server-impl.js +39 -0
  38. package/dist/server/sse-server-impl.js.map +1 -0
  39. package/dist/server/stdio-server-impl.d.ts +12 -0
  40. package/dist/server/stdio-server-impl.d.ts.map +1 -0
  41. package/dist/server/stdio-server-impl.js +19 -0
  42. package/dist/server/stdio-server-impl.js.map +1 -0
  43. package/dist/shared/types/vector-search.types.d.ts +1 -0
  44. package/dist/shared/types/vector-search.types.d.ts.map +1 -1
  45. package/package.json +1 -1
  46. package/scripts/__tests__/check-db-integrity.integration.spec.ts +163 -0
  47. package/scripts/__tests__/fix-migration.integration.spec.ts +203 -0
  48. package/scripts/__tests__/migrate-embedding-data.integration.spec.ts +219 -0
  49. package/scripts/__tests__/regenerate-embeddings.integration.spec.ts +192 -0
  50. package/scripts/backup-embeddings.js +52 -61
  51. package/scripts/check-db-integrity.js +49 -25
  52. package/scripts/check-file-sizes.ts +4 -4
  53. package/scripts/check-pii-masking.ts +0 -3
  54. package/scripts/check-sql-injection.ts +0 -12
  55. package/scripts/debug-embeddings.js +74 -93
  56. package/scripts/fix-migration.js +115 -80
  57. package/scripts/fix-vector-dimensions.js +70 -89
  58. package/scripts/migrate-embedding-data.js +111 -25
  59. package/scripts/regenerate-embeddings.js +31 -15
  60. package/scripts/run-migration.js +144 -107
  61. package/scripts/safe-migration.js +192 -142
  62. package/scripts/save-work-memory.ts +6 -7
  63. package/scripts/simple-migrate.js +66 -34
  64. package/scripts/simple-update.js +147 -109
  65. package/dist/domains/search/algorithms/vector-search-engine-refactored.d.ts +0 -56
  66. package/dist/domains/search/algorithms/vector-search-engine-refactored.d.ts.map +0 -1
  67. package/dist/domains/search/algorithms/vector-search-engine-refactored.js +0 -101
  68. package/dist/domains/search/algorithms/vector-search-engine-refactored.js.map +0 -1
@@ -1,150 +1,200 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ /**
4
+ * 안전한 마이그레이션 스크립트
5
+ * 임시 데이터베이스를 사용하여 안전하게 마이그레이션 수행
6
+ *
7
+ * 리팩토링: 공통 모듈(initializeDatabase)을 사용하여 일관된 DB 초기화 보장
8
+ *
9
+ * 사용법:
10
+ * - 개발 환경: npx tsx scripts/safe-migration.js
11
+ * - 프로덕션: npm run build && node dist/scripts/safe-migration.js
12
+ */
13
+
14
+ // TypeScript 소스를 직접 import (tsx로 실행 시)
15
+ // 빌드된 파일을 사용하려면 '../dist/infrastructure/database/database/init.js'로 변경
16
+ import { initializeDatabase, closeDatabase } from '../src/infrastructure/database/database/init.js';
3
17
  import Database from 'better-sqlite3';
4
18
  import { join } from 'path';
5
- import { existsSync, copyFileSync } from 'fs';
6
-
7
- const dbPath = join(process.cwd(), 'data', 'memory.db');
8
- const tempDbPath = join(process.cwd(), 'data', 'memory-temp.db');
19
+ import { existsSync, copyFileSync, unlinkSync } from 'fs';
9
20
 
10
- console.log('🛡️ 안전한 마이그레이션 시작...');
11
-
12
- try {
13
- // 1. 원본 데이터베이스 백업
14
- console.log('💾 원본 데이터베이스 백업 중...');
15
- const backupPath = join(process.cwd(), 'data', `memory-backup-${Date.now()}.db`);
16
- copyFileSync(dbPath, backupPath);
17
- console.log(`✅ 백업 생성: ${backupPath}`);
18
-
19
- // 2. 임시 데이터베이스 생성 (sqlite-vec 없이)
20
- console.log('📝 임시 데이터베이스 생성 중...');
21
- const tempDb = new Database(tempDbPath);
22
-
23
- // 3. 스키마 복사 (vec0 관련 부분 제외)
24
- console.log('📋 스키마 복사 중...');
25
- tempDb.exec(`
26
- CREATE TABLE memory_item (
27
- id TEXT PRIMARY KEY,
28
- type TEXT CHECK (type IN ('working','episodic','semantic','procedural')) NOT NULL,
29
- content TEXT NOT NULL,
30
- importance REAL CHECK (importance >= 0 AND importance <= 1) DEFAULT 0.5,
31
- privacy_scope TEXT CHECK (privacy_scope IN ('private','team','public')) DEFAULT 'private',
32
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
33
- last_accessed TIMESTAMP,
34
- pinned BOOLEAN DEFAULT FALSE,
35
- tags TEXT,
36
- source TEXT,
37
- view_count INTEGER DEFAULT 0,
38
- cite_count INTEGER DEFAULT 0,
39
- edit_count INTEGER DEFAULT 0
40
- );
41
- `);
42
-
43
- tempDb.exec(`
44
- CREATE TABLE memory_embedding (
45
- id INTEGER PRIMARY KEY AUTOINCREMENT,
46
- memory_id TEXT NOT NULL,
47
- embedding TEXT NOT NULL,
48
- dim INTEGER NOT NULL,
49
- model TEXT,
50
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
51
- embedding_provider TEXT,
52
- dimensions INTEGER,
53
- created_by TEXT DEFAULT 'migration',
54
- FOREIGN KEY (memory_id) REFERENCES memory_item(id) ON DELETE CASCADE,
55
- UNIQUE(memory_id)
56
- );
57
- `);
58
-
59
- // 4. 데이터 복사
60
- console.log('📊 데이터 복사 중...');
61
-
62
- // 원본 데이터베이스 연결
63
- tempDb.exec(`ATTACH DATABASE '${dbPath}' AS source`);
64
-
65
- // memory_item 데이터 복사
66
- tempDb.exec(`INSERT INTO memory_item SELECT * FROM source.memory_item`);
67
-
68
- // memory_embedding 데이터 복사 및 업데이트
69
- tempDb.exec(`
70
- INSERT INTO memory_embedding (memory_id, embedding, dim, model, created_at, embedding_provider, dimensions, created_by)
71
- SELECT
72
- memory_id,
73
- embedding,
74
- dim,
75
- model,
76
- created_at,
77
- CASE
78
- WHEN model = 'lightweight-hybrid' THEN 'tfidf'
79
- WHEN model IS NULL OR model = '' THEN 'tfidf'
80
- ELSE 'unknown'
81
- END as embedding_provider,
82
- dim as dimensions,
83
- 'legacy' as created_by
84
- FROM source.memory_embedding
85
- `);
86
-
87
- tempDb.exec('DETACH DATABASE source');
88
-
89
- console.log('✅ 데이터 복사 완료');
90
-
91
- // 5. 인덱스 생성
92
- console.log('📝 인덱스 생성 중...');
93
- tempDb.exec('CREATE INDEX IF NOT EXISTS idx_memory_embedding_provider ON memory_embedding(embedding_provider)');
94
- tempDb.exec('CREATE INDEX IF NOT EXISTS idx_memory_embedding_dimensions ON memory_embedding(dimensions)');
95
- tempDb.exec('CREATE INDEX IF NOT EXISTS idx_memory_embedding_created_by ON memory_embedding(created_by)');
96
-
97
- tempDb.close();
98
-
99
- // 6. 원본 데이터베이스 교체
100
- console.log('🔄 데이터베이스 교체 중...');
101
- copyFileSync(tempDbPath, dbPath);
102
-
103
- // 7. 임시 파일 정리
104
- if (existsSync(tempDbPath)) {
105
- const fs = require('fs');
106
- fs.unlinkSync(tempDbPath);
107
- }
108
-
109
- // 8. 검증
110
- console.log('🔍 마이그레이션 검증 중...');
111
- const db = new Database(dbPath);
112
-
113
- const validation = db.prepare(`
114
- SELECT
115
- COUNT(*) as total,
116
- COUNT(CASE WHEN embedding_provider IS NOT NULL THEN 1 END) as with_provider,
117
- COUNT(CASE WHEN dimensions IS NOT NULL THEN 1 END) as with_dimensions,
118
- COUNT(CASE WHEN created_by IS NOT NULL THEN 1 END) as with_created_by
119
- FROM memory_embedding
120
- `).get();
121
-
122
- console.log('📊 검증 결과:');
123
- console.table(validation);
124
-
125
- const finalAnalysis = db.prepare(`
126
- SELECT
127
- embedding_provider,
128
- dimensions,
129
- COUNT(*) as count
130
- FROM memory_embedding
131
- GROUP BY embedding_provider, dimensions
132
- ORDER BY count DESC
133
- `).all();
134
-
135
- console.log('\n📊 최종 데이터 분포:');
136
- console.table(finalAnalysis);
137
-
138
- db.close();
139
-
140
- console.log('\n🎉 마이그레이션 완료!');
141
- console.log(`💾 백업 파일: ${backupPath}`);
142
- console.log('🔄 롤백이 필요한 경우: cp ' + backupPath + ' ' + dbPath);
143
-
144
- } catch (error) {
145
- console.error('❌ 마이그레이션 실패:', error.message);
146
- if (typeof backupPath !== 'undefined') {
21
+ async function safeMigration() {
22
+ console.log('🛡️ 안전한 마이그레이션 시작...');
23
+
24
+ const dbPath = process.env.DB_PATH || join(process.cwd(), 'data', 'memory.db');
25
+ const tempDbPath = join(process.cwd(), 'data', 'memory-temp.db');
26
+
27
+ let db = null;
28
+ let tempDb = null;
29
+
30
+ try {
31
+ // 1. 원본 데이터베이스 백업
32
+ console.log('💾 원본 데이터베이스 백업 중...');
33
+ const backupPath = join(process.cwd(), 'data', `memory-backup-${Date.now()}.db`);
34
+ if (existsSync(dbPath)) {
35
+ copyFileSync(dbPath, backupPath);
36
+ console.log(`✅ 백업 생성: ${backupPath}`);
37
+ }
38
+
39
+ // 2. 원본 데이터베이스 초기화 (공통 모듈 사용)
40
+ console.log('📝 원본 데이터베이스 초기화 중...');
41
+ db = await initializeDatabase();
42
+
43
+ // 3. 임시 데이터베이스 생성
44
+ console.log('📝 임시 데이터베이스 생성 중...');
45
+ tempDb = new Database(tempDbPath);
46
+
47
+ // 4. 스키마 복사 (vec0 관련 부분 제외)
48
+ console.log('📋 스키마 복사 중...');
49
+ tempDb.exec(`
50
+ CREATE TABLE memory_item (
51
+ id TEXT PRIMARY KEY,
52
+ type TEXT CHECK (type IN ('working','episodic','semantic','procedural')) NOT NULL,
53
+ content TEXT NOT NULL,
54
+ importance REAL CHECK (importance >= 0 AND importance <= 1) DEFAULT 0.5,
55
+ privacy_scope TEXT CHECK (privacy_scope IN ('private','team','public')) DEFAULT 'private',
56
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
57
+ last_accessed TIMESTAMP,
58
+ pinned BOOLEAN DEFAULT FALSE,
59
+ tags TEXT,
60
+ source TEXT,
61
+ view_count INTEGER DEFAULT 0,
62
+ cite_count INTEGER DEFAULT 0,
63
+ edit_count INTEGER DEFAULT 0
64
+ );
65
+ `);
66
+
67
+ tempDb.exec(`
68
+ CREATE TABLE memory_embedding (
69
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
70
+ memory_id TEXT NOT NULL,
71
+ embedding TEXT NOT NULL,
72
+ dim INTEGER NOT NULL,
73
+ model TEXT,
74
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
75
+ embedding_provider TEXT,
76
+ dimensions INTEGER,
77
+ created_by TEXT DEFAULT 'migration',
78
+ FOREIGN KEY (memory_id) REFERENCES memory_item(id) ON DELETE CASCADE,
79
+ UNIQUE(memory_id)
80
+ );
81
+ `);
82
+
83
+ // 5. 데이터 복사
84
+ console.log('📊 데이터 복사 중...');
85
+
86
+ // 원본 데이터베이스 연결
87
+ tempDb.exec(`ATTACH DATABASE '${dbPath}' AS source`);
88
+
89
+ // memory_item 데이터 복사
90
+ tempDb.exec(`INSERT INTO memory_item SELECT * FROM source.memory_item`);
91
+
92
+ // memory_embedding 데이터 복사 및 업데이트
93
+ tempDb.exec(`
94
+ INSERT INTO memory_embedding (memory_id, embedding, dim, model, created_at, embedding_provider, dimensions, created_by)
95
+ SELECT
96
+ memory_id,
97
+ embedding,
98
+ dim,
99
+ model,
100
+ created_at,
101
+ CASE
102
+ WHEN model = 'lightweight-hybrid' THEN 'tfidf'
103
+ WHEN model IS NULL OR model = '' THEN 'tfidf'
104
+ ELSE 'unknown'
105
+ END,
106
+ dim,
107
+ 'legacy'
108
+ FROM source.memory_embedding
109
+ `);
110
+
111
+ tempDb.exec('DETACH DATABASE source');
112
+
113
+ // 6. 인덱스 추가
114
+ console.log('📝 인덱스 추가 중...');
115
+ tempDb.exec('CREATE INDEX IF NOT EXISTS idx_memory_embedding_provider ON memory_embedding(embedding_provider)');
116
+ tempDb.exec('CREATE INDEX IF NOT EXISTS idx_memory_embedding_dimensions ON memory_embedding(dimensions)');
117
+ tempDb.exec('CREATE INDEX IF NOT EXISTS idx_memory_embedding_created_by ON memory_embedding(created_by)');
118
+
119
+ // 7. 검증
120
+ console.log('🔍 검증 중...');
121
+ const validation = tempDb.prepare(`
122
+ SELECT
123
+ COUNT(*) as total,
124
+ COUNT(CASE WHEN embedding_provider IS NOT NULL THEN 1 END) as with_provider,
125
+ COUNT(CASE WHEN dimensions IS NOT NULL THEN 1 END) as with_dimensions,
126
+ COUNT(CASE WHEN created_by IS NOT NULL THEN 1 END) as with_created_by
127
+ FROM memory_embedding
128
+ `).get();
129
+
130
+ console.log('📊 검증 결과:');
131
+ console.table(validation);
132
+
133
+ // 8. 임시 DB를 원본으로 교체
134
+ console.log('🔄 데이터베이스 교체 중...');
135
+ closeDatabase(db);
136
+ closeDatabase(tempDb);
137
+
138
+ // 원본 백업
139
+ if (existsSync(dbPath)) {
140
+ const finalBackup = join(process.cwd(), 'data', `memory-pre-migration-${Date.now()}.db`);
141
+ copyFileSync(dbPath, finalBackup);
142
+ console.log(`✅ 최종 백업: ${finalBackup}`);
143
+ }
144
+
145
+ // 임시 DB를 원본으로 교체
146
+ copyFileSync(tempDbPath, dbPath);
147
+ console.log('✅ 데이터베이스 교체 완료');
148
+
149
+ // 임시 DB 삭제
150
+ if (existsSync(tempDbPath)) {
151
+ unlinkSync(tempDbPath);
152
+ }
153
+
154
+ console.log('\n🎉 안전한 마이그레이션 완료!');
155
+ console.log(`💾 백업 파일: ${backupPath}`);
156
+
157
+ } catch (error) {
158
+ console.error('❌ 마이그레이션 실패:', error.message);
159
+ if (error.stack) {
160
+ console.error(' 스택 트레이스:', error.stack);
161
+ }
162
+
163
+ // 임시 DB 정리
164
+ if (tempDb) {
165
+ try {
166
+ closeDatabase(tempDb);
167
+ } catch (e) {
168
+ // 무시
169
+ }
170
+ }
171
+ if (existsSync(tempDbPath)) {
172
+ try {
173
+ unlinkSync(tempDbPath);
174
+ } catch (e) {
175
+ // 무시
176
+ }
177
+ }
178
+
147
179
  console.log(`🔄 백업에서 복원하려면: cp ${backupPath} ${dbPath}`);
180
+ process.exit(1);
181
+ } finally {
182
+ // 데이터베이스 연결 종료
183
+ if (db) {
184
+ closeDatabase(db);
185
+ }
186
+ if (tempDb) {
187
+ closeDatabase(tempDb);
188
+ }
148
189
  }
149
- process.exit(1);
150
190
  }
191
+
192
+ // 스크립트 실행
193
+ if (import.meta.url === `file://${process.argv[1]}` || import.meta.url.endsWith(process.argv[1])) {
194
+ safeMigration().catch((error) => {
195
+ console.error('❌ 스크립트 실행 중 오류 발생:', error);
196
+ process.exit(1);
197
+ });
198
+ }
199
+
200
+ export { safeMigration };
@@ -3,7 +3,7 @@
3
3
  */
4
4
 
5
5
  import Database from 'better-sqlite3';
6
- import { DatabaseUtils } from '../src/utils/database.js';
6
+ import { initializeDatabase, closeDatabase } from '../src/infrastructure/database/database/init.js';
7
7
  import { initializeServices } from '../src/server/bootstrap.js';
8
8
  import { executeTool } from '../src/tools/index.js';
9
9
  import type { ToolContext } from '../src/tools/types.js';
@@ -35,11 +35,10 @@ async function saveWorkMemory() {
35
35
  let db: Database.Database | null = null;
36
36
 
37
37
  try {
38
- // 데이터베이스 초기화 (실제 DB 사용)
39
- const dbPath = process.env.MEMENTO_DB_PATH || './data/memory.db';
40
- db = new Database(dbPath);
41
- DatabaseUtils.initializeDatabase(db);
42
- console.log(`✅ 데이터베이스 초기화 완료 (${dbPath})\n`);
38
+ // 공통 모듈을 사용하여 데이터베이스 초기화
39
+ // initializeDatabase는 DB 파일이 없으면 자동으로 생성하고 초기화함
40
+ db = await initializeDatabase();
41
+ console.log(`✅ 데이터베이스 초기화 완료\n`);
43
42
 
44
43
  // 서비스 초기화
45
44
  console.log('2️⃣ 서비스 초기화');
@@ -164,7 +163,7 @@ async function saveWorkMemory() {
164
163
  process.exit(1);
165
164
  } finally {
166
165
  if (db) {
167
- db.close();
166
+ closeDatabase(db);
168
167
  }
169
168
  }
170
169
  }
@@ -1,41 +1,73 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import Database from 'better-sqlite3';
4
- import { join } from 'path';
3
+ /**
4
+ * 간단한 마이그레이션 스크립트
5
+ * 임베딩 데이터 분석
6
+ *
7
+ * 리팩토링: 공통 모듈(initializeDatabase)을 사용하여 일관된 DB 초기화 보장
8
+ *
9
+ * 사용법:
10
+ * - 개발 환경: npx tsx scripts/simple-migrate.js
11
+ * - 프로덕션: npm run build && node dist/scripts/simple-migrate.js
12
+ */
5
13
 
6
- const dbPath = join(process.cwd(), 'data', 'memory.db');
14
+ // TypeScript 소스를 직접 import (tsx로 실행 )
15
+ // 빌드된 파일을 사용하려면 '../dist/infrastructure/database/database/init.js'로 변경
16
+ import { initializeDatabase, closeDatabase } from '../src/infrastructure/database/database/init.js';
7
17
 
8
- console.log('🔍 임베딩 데이터 분석 중...');
9
-
10
- try {
11
- const db = new Database(dbPath);
12
-
13
- // 기존 데이터 분석
14
- const analysis = db.prepare(`
15
- SELECT
16
- dim,
17
- model,
18
- COUNT(*) as count
19
- FROM memory_embedding
20
- GROUP BY dim, model
21
- ORDER BY count DESC
22
- `).all();
23
-
24
- console.log('📊 기존 데이터 분석 결과:');
25
- console.table(analysis);
26
-
27
- // 전체 통계
28
- const total = db.prepare('SELECT COUNT(*) as total FROM memory_embedding').get();
29
- console.log(`\n📈 총 임베딩 수: ${total.total}`);
18
+ async function analyzeEmbeddings() {
19
+ console.log('🔍 임베딩 데이터 분석 중...');
30
20
 
31
- // 스키마 확인
32
- const schema = db.prepare("PRAGMA table_info(memory_embedding)").all();
33
- console.log('\n📋 현재 테이블 구조:');
34
- console.table(schema);
21
+ let db = null;
35
22
 
36
- db.close();
37
-
38
- } catch (error) {
39
- console.error('❌ 오류 발생:', error.message);
40
- process.exit(1);
23
+ try {
24
+ // 공통 모듈을 사용하여 데이터베이스 초기화
25
+ // initializeDatabase는 DB 파일이 없으면 자동으로 생성하고 초기화함
26
+ db = await initializeDatabase();
27
+
28
+ // 기존 데이터 분석
29
+ const analysis = db.prepare(`
30
+ SELECT
31
+ dim,
32
+ model,
33
+ COUNT(*) as count
34
+ FROM memory_embedding
35
+ GROUP BY dim, model
36
+ ORDER BY count DESC
37
+ `).all();
38
+
39
+ console.log('📊 기존 데이터 분석 결과:');
40
+ console.table(analysis);
41
+
42
+ // 전체 통계
43
+ const total = db.prepare('SELECT COUNT(*) as total FROM memory_embedding').get();
44
+ console.log(`\n📈 총 임베딩 수: ${total.total}`);
45
+
46
+ // 스키마 확인
47
+ const schema = db.prepare("PRAGMA table_info(memory_embedding)").all();
48
+ console.log('\n📋 현재 테이블 구조:');
49
+ console.table(schema);
50
+
51
+ } catch (error) {
52
+ console.error('❌ 오류 발생:', error.message);
53
+ if (error.stack) {
54
+ console.error(' 스택 트레이스:', error.stack);
55
+ }
56
+ process.exit(1);
57
+ } finally {
58
+ // 데이터베이스 연결 종료
59
+ if (db) {
60
+ closeDatabase(db);
61
+ }
62
+ }
63
+ }
64
+
65
+ // 스크립트 실행
66
+ if (import.meta.url === `file://${process.argv[1]}` || import.meta.url.endsWith(process.argv[1])) {
67
+ analyzeEmbeddings().catch((error) => {
68
+ console.error('❌ 스크립트 실행 중 오류 발생:', error);
69
+ process.exit(1);
70
+ });
41
71
  }
72
+
73
+ export { analyzeEmbeddings };