mcp-local-rag 0.1.5 → 0.2.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 (41) hide show
  1. package/README.md +25 -5
  2. package/dist/embedder/index.d.ts +6 -0
  3. package/dist/embedder/index.d.ts.map +1 -1
  4. package/dist/embedder/index.js +33 -6
  5. package/dist/embedder/index.js.map +1 -1
  6. package/dist/index.js +0 -0
  7. package/dist/server/index.d.ts +16 -0
  8. package/dist/server/index.d.ts.map +1 -1
  9. package/dist/server/index.js +49 -1
  10. package/dist/server/index.js.map +1 -1
  11. package/dist/vectordb/index.js +2 -2
  12. package/dist/vectordb/index.js.map +1 -1
  13. package/package.json +1 -1
  14. package/dist/chunker.d.ts +0 -42
  15. package/dist/chunker.d.ts.map +0 -1
  16. package/dist/chunker.js +0 -68
  17. package/dist/chunker.js.map +0 -1
  18. package/dist/embedder.d.ts +0 -48
  19. package/dist/embedder.d.ts.map +0 -1
  20. package/dist/embedder.js +0 -108
  21. package/dist/embedder.js.map +0 -1
  22. package/dist/parser.d.ts +0 -92
  23. package/dist/parser.d.ts.map +0 -1
  24. package/dist/parser.js +0 -186
  25. package/dist/parser.js.map +0 -1
  26. package/dist/server.d.ts +0 -125
  27. package/dist/server.d.ts.map +0 -1
  28. package/dist/server.js +0 -300
  29. package/dist/server.js.map +0 -1
  30. package/dist/test-helpers/test-data.d.ts +0 -31
  31. package/dist/test-helpers/test-data.d.ts.map +0 -1
  32. package/dist/test-helpers/test-data.js +0 -53
  33. package/dist/test-helpers/test-data.js.map +0 -1
  34. package/dist/test-helpers/test-utils.d.ts +0 -21
  35. package/dist/test-helpers/test-utils.d.ts.map +0 -1
  36. package/dist/test-helpers/test-utils.js +0 -35
  37. package/dist/test-helpers/test-utils.js.map +0 -1
  38. package/dist/vectordb.d.ts +0 -121
  39. package/dist/vectordb.d.ts.map +0 -1
  40. package/dist/vectordb.js +0 -243
  41. package/dist/vectordb.js.map +0 -1
package/dist/vectordb.js DELETED
@@ -1,243 +0,0 @@
1
- "use strict";
2
- // src/vectordb.ts - VectorStore implementation with LanceDB integration
3
- // Design Doc: rag-mcp-server-design.md (v1.1)
4
- // ADR-0001: LanceDB選定とベクトルストレージ戦略
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.VectorStore = exports.DatabaseError = void 0;
7
- const lancedb_1 = require("@lancedb/lancedb");
8
- // ============================================
9
- // エラークラス
10
- // ============================================
11
- /**
12
- * データベースエラー
13
- */
14
- class DatabaseError extends Error {
15
- constructor(message, cause) {
16
- super(message);
17
- this.cause = cause;
18
- this.name = 'DatabaseError';
19
- }
20
- }
21
- exports.DatabaseError = DatabaseError;
22
- // ============================================
23
- // VectorStoreクラス
24
- // ============================================
25
- /**
26
- * LanceDBを活用したベクトルストレージクラス
27
- *
28
- * 責務:
29
- * - LanceDB操作(挿入、削除、検索)
30
- * - トランザクション処理(削除→挿入の原子性)
31
- * - メタデータ管理
32
- */
33
- class VectorStore {
34
- constructor(config) {
35
- this.db = null;
36
- this.table = null;
37
- this.config = config;
38
- }
39
- /**
40
- * LanceDBを初期化し、テーブルを作成する
41
- */
42
- async initialize() {
43
- try {
44
- // LanceDB接続
45
- this.db = await (0, lancedb_1.connect)(this.config.dbPath);
46
- // テーブルの存在確認と作成
47
- const tableNames = await this.db.tableNames();
48
- if (tableNames.includes(this.config.tableName)) {
49
- // 既存テーブルを開く
50
- this.table = await this.db.openTable(this.config.tableName);
51
- console.log(`VectorStore: 既存テーブル "${this.config.tableName}" を開きました`);
52
- }
53
- else {
54
- // 新規テーブルを作成(スキーマは最初のデータ挿入時に自動定義)
55
- console.log(`VectorStore: テーブル "${this.config.tableName}" は初回データ挿入時に作成されます`);
56
- }
57
- console.log(`VectorStore initialized: ${this.config.dbPath}`);
58
- }
59
- catch (error) {
60
- throw new DatabaseError('Failed to initialize VectorStore', error);
61
- }
62
- }
63
- /**
64
- * 指定されたファイルパスのすべてのチャンクを削除する
65
- *
66
- * @param filePath - ファイルパス(絶対パス)
67
- */
68
- async deleteChunks(filePath) {
69
- if (!this.table) {
70
- // テーブルが存在しない場合は削除対象もないため、正常終了
71
- console.log('VectorStore: テーブルが存在しないため、削除をスキップします');
72
- return;
73
- }
74
- try {
75
- // LanceDBのdelete APIを使用してfilePathに一致するレコードを削除
76
- // SQL injectionを防ぐため、シングルクォートをエスケープ
77
- const escapedFilePath = filePath.replace(/'/g, "''");
78
- // LanceDBのdeleteメソッドは、削除対象が存在しない場合でもエラーを投げないため、
79
- // 直接deleteを呼び出す
80
- // 注: フィールド名は大文字小文字を区別するため、ダブルクォートで囲む
81
- await this.table.delete(`"filePath" = '${escapedFilePath}'`);
82
- console.log(`VectorStore: ファイル "${filePath}" のチャンクを削除しました`);
83
- }
84
- catch (error) {
85
- // エラーが発生した場合、警告ログを出力
86
- console.warn(`VectorStore: ファイル "${filePath}" の削除中にエラーが発生しました:`, error);
87
- // 削除対象が存在しない場合やテーブルが空の場合はエラーとしない
88
- // それ以外の場合は例外をスロー
89
- const errorMessage = error.message.toLowerCase();
90
- if (!errorMessage.includes('not found') &&
91
- !errorMessage.includes('does not exist') &&
92
- !errorMessage.includes('no matching')) {
93
- throw new DatabaseError(`Failed to delete chunks for file: ${filePath}`, error);
94
- }
95
- }
96
- }
97
- /**
98
- * ベクトルチャンクをバッチ挿入する
99
- *
100
- * @param chunks - ベクトルチャンクの配列
101
- */
102
- async insertChunks(chunks) {
103
- if (chunks.length === 0) {
104
- return;
105
- }
106
- try {
107
- if (!this.table) {
108
- // 初回挿入時にテーブルを作成
109
- if (!this.db) {
110
- throw new DatabaseError('VectorStore is not initialized. Call initialize() first.');
111
- }
112
- // LanceDBのcreateTable APIは、データを Record<string, unknown>[] として受け取る
113
- const records = chunks.map((chunk) => chunk);
114
- this.table = await this.db.createTable(this.config.tableName, records);
115
- console.log(`VectorStore: テーブル "${this.config.tableName}" を作成しました`);
116
- }
117
- else {
118
- // 既存テーブルにデータを追加
119
- const records = chunks.map((chunk) => chunk);
120
- await this.table.add(records);
121
- }
122
- console.log(`VectorStore: ${chunks.length}件のチャンクを挿入しました`);
123
- }
124
- catch (error) {
125
- throw new DatabaseError('Failed to insert chunks', error);
126
- }
127
- }
128
- /**
129
- * ベクトル検索を実行する
130
- *
131
- * @param queryVector - クエリベクトル(384次元)
132
- * @param limit - 取得件数(デフォルト5)
133
- * @returns 検索結果の配列(スコア順降順)
134
- */
135
- async search(queryVector, limit = 5) {
136
- if (!this.table) {
137
- // テーブルが存在しない場合は空配列を返す
138
- console.log('VectorStore: テーブルが存在しないため、空の結果を返します');
139
- return [];
140
- }
141
- if (queryVector.length !== 384) {
142
- throw new DatabaseError(`Invalid query vector dimension: expected 384, got ${queryVector.length}`);
143
- }
144
- if (limit < 1 || limit > 20) {
145
- throw new DatabaseError(`Invalid limit: expected 1-20, got ${limit}`);
146
- }
147
- try {
148
- // LanceDBのベクトル検索APIを使用
149
- const results = await this.table.vectorSearch(queryVector).limit(limit).toArray();
150
- // SearchResult形式に変換
151
- return results.map((result) => ({
152
- filePath: result.filePath,
153
- chunkIndex: result.chunkIndex,
154
- text: result.text,
155
- score: result._distance, // LanceDBは距離スコアを返す(0に近いほど類似)
156
- metadata: result.metadata,
157
- }));
158
- }
159
- catch (error) {
160
- throw new DatabaseError('Failed to search vectors', error);
161
- }
162
- }
163
- /**
164
- * 取り込み済みファイル一覧を取得する
165
- *
166
- * @returns ファイル情報の配列
167
- */
168
- async listFiles() {
169
- if (!this.table) {
170
- return []; // テーブルが存在しない場合は空配列を返す
171
- }
172
- try {
173
- // すべてのレコードを取得
174
- const allRecords = await this.table.query().toArray();
175
- // ファイルパスごとにグループ化
176
- const fileMap = new Map();
177
- for (const record of allRecords) {
178
- const filePath = record.filePath;
179
- const timestamp = record.timestamp;
180
- if (fileMap.has(filePath)) {
181
- const fileInfo = fileMap.get(filePath);
182
- if (fileInfo) {
183
- fileInfo.chunkCount += 1;
184
- // 最新のタイムスタンプを保持
185
- if (timestamp > fileInfo.timestamp) {
186
- fileInfo.timestamp = timestamp;
187
- }
188
- }
189
- }
190
- else {
191
- fileMap.set(filePath, { chunkCount: 1, timestamp });
192
- }
193
- }
194
- // Map をオブジェクトの配列に変換
195
- return Array.from(fileMap.entries()).map(([filePath, info]) => ({
196
- filePath,
197
- chunkCount: info.chunkCount,
198
- timestamp: info.timestamp,
199
- }));
200
- }
201
- catch (error) {
202
- throw new DatabaseError('Failed to list files', error);
203
- }
204
- }
205
- /**
206
- * システムステータスを取得する
207
- *
208
- * @returns システムステータス情報
209
- */
210
- async getStatus() {
211
- if (!this.table) {
212
- return {
213
- documentCount: 0,
214
- chunkCount: 0,
215
- memoryUsage: 0,
216
- uptime: process.uptime(),
217
- };
218
- }
219
- try {
220
- // すべてのレコードを取得
221
- const allRecords = await this.table.query().toArray();
222
- const chunkCount = allRecords.length;
223
- // 一意なファイルパスの数を数える
224
- const uniqueFilePaths = new Set(allRecords.map((record) => record.filePath));
225
- const documentCount = uniqueFilePaths.size;
226
- // メモリ使用量を取得(MB単位)
227
- const memoryUsage = process.memoryUsage().heapUsed / 1024 / 1024;
228
- // 稼働時間を取得(秒単位)
229
- const uptime = process.uptime();
230
- return {
231
- documentCount,
232
- chunkCount,
233
- memoryUsage,
234
- uptime,
235
- };
236
- }
237
- catch (error) {
238
- throw new DatabaseError('Failed to get status', error);
239
- }
240
- }
241
- }
242
- exports.VectorStore = VectorStore;
243
- //# sourceMappingURL=vectordb.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vectordb.js","sourceRoot":"","sources":["../src/vectordb.ts"],"names":[],"mappings":"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"}