@aiconnect/easy-rag 0.3.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 (132) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +181 -0
  3. package/dist/chunker/csv.d.ts +4 -0
  4. package/dist/chunker/csv.d.ts.map +1 -0
  5. package/dist/chunker/csv.js +10 -0
  6. package/dist/chunker/csv.js.map +1 -0
  7. package/dist/chunker/index.d.ts +5 -0
  8. package/dist/chunker/index.d.ts.map +1 -0
  9. package/dist/chunker/index.js +20 -0
  10. package/dist/chunker/index.js.map +1 -0
  11. package/dist/chunker/markdown.d.ts +4 -0
  12. package/dist/chunker/markdown.d.ts.map +1 -0
  13. package/dist/chunker/markdown.js +35 -0
  14. package/dist/chunker/markdown.js.map +1 -0
  15. package/dist/chunker/pdf.d.ts +4 -0
  16. package/dist/chunker/pdf.d.ts.map +1 -0
  17. package/dist/chunker/pdf.js +26 -0
  18. package/dist/chunker/pdf.js.map +1 -0
  19. package/dist/chunker/types.d.ts +12 -0
  20. package/dist/chunker/types.d.ts.map +1 -0
  21. package/dist/chunker/types.js +2 -0
  22. package/dist/chunker/types.js.map +1 -0
  23. package/dist/commands/init.d.ts +2 -0
  24. package/dist/commands/init.d.ts.map +1 -0
  25. package/dist/commands/init.js +120 -0
  26. package/dist/commands/init.js.map +1 -0
  27. package/dist/commands/serve.d.ts +2 -0
  28. package/dist/commands/serve.d.ts.map +1 -0
  29. package/dist/commands/serve.js +17 -0
  30. package/dist/commands/serve.js.map +1 -0
  31. package/dist/config/index.d.ts +9 -0
  32. package/dist/config/index.d.ts.map +1 -0
  33. package/dist/config/index.js +66 -0
  34. package/dist/config/index.js.map +1 -0
  35. package/dist/config/types.d.ts +5 -0
  36. package/dist/config/types.d.ts.map +1 -0
  37. package/dist/config/types.js +2 -0
  38. package/dist/config/types.js.map +1 -0
  39. package/dist/embeddings/index.d.ts +3 -0
  40. package/dist/embeddings/index.d.ts.map +1 -0
  41. package/dist/embeddings/index.js +2 -0
  42. package/dist/embeddings/index.js.map +1 -0
  43. package/dist/embeddings/openai.d.ts +2 -0
  44. package/dist/embeddings/openai.d.ts.map +1 -0
  45. package/dist/embeddings/openai.js +57 -0
  46. package/dist/embeddings/openai.js.map +1 -0
  47. package/dist/embeddings/types.d.ts +15 -0
  48. package/dist/embeddings/types.d.ts.map +1 -0
  49. package/dist/embeddings/types.js +2 -0
  50. package/dist/embeddings/types.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +248 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/indexer/index.d.ts +4 -0
  56. package/dist/indexer/index.d.ts.map +1 -0
  57. package/dist/indexer/index.js +3 -0
  58. package/dist/indexer/index.js.map +1 -0
  59. package/dist/indexer/orchestrator.d.ts +3 -0
  60. package/dist/indexer/orchestrator.d.ts.map +1 -0
  61. package/dist/indexer/orchestrator.js +106 -0
  62. package/dist/indexer/orchestrator.js.map +1 -0
  63. package/dist/indexer/scanner.d.ts +2 -0
  64. package/dist/indexer/scanner.d.ts.map +1 -0
  65. package/dist/indexer/scanner.js +34 -0
  66. package/dist/indexer/scanner.js.map +1 -0
  67. package/dist/indexer/types.d.ts +12 -0
  68. package/dist/indexer/types.d.ts.map +1 -0
  69. package/dist/indexer/types.js +2 -0
  70. package/dist/indexer/types.js.map +1 -0
  71. package/dist/parsers/csv.d.ts +3 -0
  72. package/dist/parsers/csv.d.ts.map +1 -0
  73. package/dist/parsers/csv.js +63 -0
  74. package/dist/parsers/csv.js.map +1 -0
  75. package/dist/parsers/fileTypeDetector.d.ts +3 -0
  76. package/dist/parsers/fileTypeDetector.d.ts.map +1 -0
  77. package/dist/parsers/fileTypeDetector.js +16 -0
  78. package/dist/parsers/fileTypeDetector.js.map +1 -0
  79. package/dist/parsers/index.d.ts +3 -0
  80. package/dist/parsers/index.d.ts.map +1 -0
  81. package/dist/parsers/index.js +18 -0
  82. package/dist/parsers/index.js.map +1 -0
  83. package/dist/parsers/markdown.d.ts +3 -0
  84. package/dist/parsers/markdown.d.ts.map +1 -0
  85. package/dist/parsers/markdown.js +30 -0
  86. package/dist/parsers/markdown.js.map +1 -0
  87. package/dist/parsers/pdf.d.ts +3 -0
  88. package/dist/parsers/pdf.d.ts.map +1 -0
  89. package/dist/parsers/pdf.js +22 -0
  90. package/dist/parsers/pdf.js.map +1 -0
  91. package/dist/parsers/types.d.ts +17 -0
  92. package/dist/parsers/types.d.ts.map +1 -0
  93. package/dist/parsers/types.js +2 -0
  94. package/dist/parsers/types.js.map +1 -0
  95. package/dist/query/embedding.d.ts +2 -0
  96. package/dist/query/embedding.d.ts.map +1 -0
  97. package/dist/query/embedding.js +6 -0
  98. package/dist/query/embedding.js.map +1 -0
  99. package/dist/query/index.d.ts +3 -0
  100. package/dist/query/index.d.ts.map +1 -0
  101. package/dist/query/index.js +86 -0
  102. package/dist/query/index.js.map +1 -0
  103. package/dist/query/search.d.ts +6 -0
  104. package/dist/query/search.d.ts.map +1 -0
  105. package/dist/query/search.js +45 -0
  106. package/dist/query/search.js.map +1 -0
  107. package/dist/query/types.d.ts +19 -0
  108. package/dist/query/types.d.ts.map +1 -0
  109. package/dist/query/types.js +2 -0
  110. package/dist/query/types.js.map +1 -0
  111. package/dist/vector-store/chroma-server.d.ts +10 -0
  112. package/dist/vector-store/chroma-server.d.ts.map +1 -0
  113. package/dist/vector-store/chroma-server.js +102 -0
  114. package/dist/vector-store/chroma-server.js.map +1 -0
  115. package/dist/vector-store/chromadb.d.ts +8 -0
  116. package/dist/vector-store/chromadb.d.ts.map +1 -0
  117. package/dist/vector-store/chromadb.js +98 -0
  118. package/dist/vector-store/chromadb.js.map +1 -0
  119. package/dist/vector-store/index.d.ts +4 -0
  120. package/dist/vector-store/index.d.ts.map +1 -0
  121. package/dist/vector-store/index.js +3 -0
  122. package/dist/vector-store/index.js.map +1 -0
  123. package/dist/vector-store/types.d.ts +12 -0
  124. package/dist/vector-store/types.d.ts.map +1 -0
  125. package/dist/vector-store/types.js +2 -0
  126. package/dist/vector-store/types.js.map +1 -0
  127. package/dist/vector-store/utils.d.ts +2 -0
  128. package/dist/vector-store/utils.d.ts.map +1 -0
  129. package/dist/vector-store/utils.js +17 -0
  130. package/dist/vector-store/utils.js.map +1 -0
  131. package/package.json +57 -0
  132. package/skills/easy-rag/SKILL.md +198 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { generateEmbeddings } from './openai.js';
2
+ export type { Embedding, EmbeddingResponse } from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { generateEmbeddings } from './openai.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function generateEmbeddings(texts: string[]): Promise<number[][]>;
2
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"AAyBA,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CA2C7E"}
@@ -0,0 +1,57 @@
1
+ import OpenAI from 'openai';
2
+ import { getOpenAIKey, getEmbeddingModel } from '../config/index.js';
3
+ const MAX_RETRIES = 3;
4
+ const INITIAL_RETRY_DELAY = 1000;
5
+ let openaiClient = null;
6
+ let cachedApiKey;
7
+ async function getClient() {
8
+ if (!openaiClient || cachedApiKey !== await getOpenAIKey()) {
9
+ cachedApiKey = await getOpenAIKey();
10
+ if (!cachedApiKey) {
11
+ throw new Error('OpenAI API key is required. Set it with "easy-rag init" or OPENAI_API_KEY environment variable.');
12
+ }
13
+ openaiClient = new OpenAI({ apiKey: cachedApiKey });
14
+ }
15
+ return openaiClient;
16
+ }
17
+ async function delay(ms) {
18
+ return new Promise((resolve) => setTimeout(resolve, ms));
19
+ }
20
+ export async function generateEmbeddings(texts) {
21
+ const client = await getClient();
22
+ const model = await getEmbeddingModel();
23
+ let lastError = null;
24
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
25
+ try {
26
+ const response = await client.embeddings.create({
27
+ model,
28
+ input: texts,
29
+ });
30
+ return response.data
31
+ .sort((a, b) => a.index - b.index)
32
+ .map((item) => item.embedding);
33
+ }
34
+ catch (error) {
35
+ lastError = error instanceof Error ? error : new Error(String(error));
36
+ if (error instanceof Error && 'status' in error) {
37
+ const status = error.status;
38
+ if (status === 401) {
39
+ throw new Error('Invalid OPENAI_API_KEY. Please check your API key.');
40
+ }
41
+ if (status === 429 && attempt < MAX_RETRIES - 1) {
42
+ const retryDelay = INITIAL_RETRY_DELAY * Math.pow(2, attempt);
43
+ await delay(retryDelay);
44
+ continue;
45
+ }
46
+ }
47
+ if (attempt < MAX_RETRIES - 1) {
48
+ const retryDelay = INITIAL_RETRY_DELAY * Math.pow(2, attempt);
49
+ await delay(retryDelay);
50
+ continue;
51
+ }
52
+ throw lastError;
53
+ }
54
+ }
55
+ throw lastError || new Error('Failed to generate embeddings');
56
+ }
57
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface Embedding {
2
+ embedding: number[];
3
+ index: number;
4
+ object: string;
5
+ }
6
+ export interface EmbeddingResponse {
7
+ object: string;
8
+ data: Embedding[];
9
+ model: string;
10
+ usage: {
11
+ prompt_tokens: number;
12
+ total_tokens: number;
13
+ };
14
+ }
15
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/embeddings/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/embeddings/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,248 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { parseDocument } from './parsers/index.js';
4
+ import { indexFolder } from './indexer/index.js';
5
+ import { executeQuery } from './query/index.js';
6
+ import { listCollections, deleteCollection, initializeChromaDB } from './vector-store/index.js';
7
+ import { ensureChromaRunning } from './vector-store/chroma-server.js';
8
+ import { init } from './commands/init.js';
9
+ import { serve } from './commands/serve.js';
10
+ import { getOpenAIKey } from './config/index.js';
11
+ import path from 'path';
12
+ import fs from 'fs/promises';
13
+ const program = new Command();
14
+ program
15
+ .name('easy-rag')
16
+ .description('A TypeScript CLI tool for local RAG indexing and querying')
17
+ .version('0.3.0');
18
+ program
19
+ .command('init')
20
+ .description('Initialize EasyRAG configuration (OpenAI API key and embedding model)')
21
+ .action(async () => {
22
+ try {
23
+ await init();
24
+ }
25
+ catch (error) {
26
+ if (error instanceof Error) {
27
+ console.error(`Error: ${error.message}`);
28
+ }
29
+ else {
30
+ console.error('Error: Unknown error occurred');
31
+ }
32
+ process.exit(1);
33
+ }
34
+ });
35
+ program
36
+ .command('serve')
37
+ .description('Start the ChromaDB server and keep it running in the foreground')
38
+ .action(async () => {
39
+ try {
40
+ await serve();
41
+ }
42
+ catch (error) {
43
+ if (error instanceof Error) {
44
+ console.error(`Error: ${error.message}`);
45
+ }
46
+ else {
47
+ console.error('Error: Unknown error occurred');
48
+ }
49
+ process.exit(1);
50
+ }
51
+ });
52
+ program
53
+ .command('parse')
54
+ .description('Parse a document file (PDF, Markdown, CSV) and extract text with metadata')
55
+ .argument('<filePath>', 'Path to the document file')
56
+ .action(async (filePath) => {
57
+ try {
58
+ await fs.access(filePath);
59
+ const result = await parseDocument(filePath);
60
+ if (Array.isArray(result)) {
61
+ console.log(`\nParsed ${result.length} documents from ${path.basename(filePath)}:\n`);
62
+ result.forEach((doc, index) => {
63
+ console.log(`--- Document ${index + 1} ---`);
64
+ console.log(`Row Number: ${doc.metadata.rowNumber}`);
65
+ console.log(`Source: ${doc.metadata.sourcePath}`);
66
+ console.log(`Content Type: ${doc.metadata.contentType}`);
67
+ console.log(`\nContent:\n${doc.content}\n`);
68
+ });
69
+ }
70
+ else {
71
+ console.log(`\nParsed document from ${path.basename(filePath)}:\n`);
72
+ console.log(`Source: ${result.metadata.sourcePath}`);
73
+ console.log(`Content Type: ${result.metadata.contentType}`);
74
+ if (result.metadata.sections) {
75
+ console.log(`Sections: ${result.metadata.sections.join(', ')}`);
76
+ }
77
+ console.log(`\nContent:\n${result.content}\n`);
78
+ }
79
+ }
80
+ catch (error) {
81
+ if (error instanceof Error) {
82
+ console.error(`Error: ${error.message}`);
83
+ }
84
+ else {
85
+ console.error('Error: Unknown error occurred');
86
+ }
87
+ process.exit(1);
88
+ }
89
+ });
90
+ program
91
+ .command('index')
92
+ .description('Index documents from a folder into ChromaDB for RAG queries')
93
+ .argument('<folder>', 'Path to the folder containing documents to index')
94
+ .action(async (folder) => {
95
+ const apiKey = await getOpenAIKey();
96
+ if (!apiKey) {
97
+ console.error('Error: OpenAI API key is required');
98
+ console.error('\nTo set your API key:');
99
+ console.error(' 1. Run: easy-rag init');
100
+ console.error(' 2. Set environment variable:');
101
+ console.error(' export OPENAI_API_KEY=your-api-key-here');
102
+ process.exit(1);
103
+ }
104
+ const folderPath = path.resolve(folder);
105
+ try {
106
+ await fs.access(folderPath);
107
+ }
108
+ catch {
109
+ console.error(`Error: Folder not found: ${folder}`);
110
+ console.error(`\nPlease check the path and try again.`);
111
+ process.exit(1);
112
+ }
113
+ if (!await ensureChromaRunning()) {
114
+ console.error('Error: ChromaDB is required for indexing.');
115
+ process.exit(1);
116
+ }
117
+ const result = await indexFolder(folderPath);
118
+ if (!result.success) {
119
+ console.error('\nIndexing failed.');
120
+ if (result.stats.errors.length > 0) {
121
+ console.error('\nErrors:');
122
+ result.stats.errors.forEach((err) => console.error(` - ${err}`));
123
+ }
124
+ process.exit(1);
125
+ }
126
+ });
127
+ program
128
+ .command('query')
129
+ .description('Query indexed documents using vector similarity search')
130
+ .argument('<question>', 'Question to search for in indexed documents')
131
+ .option('-t, --top <number>', 'Number of results to return', '5')
132
+ .option('-m, --metadata', 'Include metadata in results (source, score, chunk index)')
133
+ .option('-c, --collection <name>', 'Search in a specific collection (default: all collections)')
134
+ .action(async (question, options) => {
135
+ const apiKey = await getOpenAIKey();
136
+ if (!apiKey) {
137
+ console.error('Error: OpenAI API key is required');
138
+ console.error('\nTo set your API key:');
139
+ console.error(' 1. Run: easy-rag init');
140
+ console.error(' 2. Set environment variable:');
141
+ console.error(' export OPENAI_API_KEY=your-api-key-here');
142
+ process.exit(1);
143
+ }
144
+ const top = parseInt(options.top, 10);
145
+ if (isNaN(top) || top <= 0) {
146
+ console.error('Error: --top must be a positive number');
147
+ process.exit(1);
148
+ }
149
+ const queryOptions = {
150
+ top,
151
+ includeMetadata: !!options.metadata,
152
+ collection: options.collection,
153
+ };
154
+ if (!await ensureChromaRunning()) {
155
+ console.error('Error: ChromaDB is required for querying.');
156
+ process.exit(1);
157
+ }
158
+ try {
159
+ await executeQuery(question, queryOptions);
160
+ }
161
+ catch (error) {
162
+ if (error instanceof Error) {
163
+ console.error(`Error: ${error.message}`);
164
+ }
165
+ else {
166
+ console.error('Error: Unknown error occurred');
167
+ }
168
+ process.exit(1);
169
+ }
170
+ });
171
+ program
172
+ .command('collections')
173
+ .description('List all ChromaDB collections with document counts')
174
+ .action(async () => {
175
+ if (!await ensureChromaRunning()) {
176
+ console.error('Error: ChromaDB is required to list collections.');
177
+ process.exit(1);
178
+ }
179
+ try {
180
+ await initializeChromaDB();
181
+ const collections = await listCollections();
182
+ if (collections.length === 0) {
183
+ console.log('No collections found.');
184
+ process.exit(0);
185
+ }
186
+ console.log('\nCollections:');
187
+ console.log('─'.repeat(50));
188
+ for (const collection of collections) {
189
+ console.log(`${collection.name.padEnd(30)} ${collection.count} documents`);
190
+ }
191
+ console.log('─'.repeat(50));
192
+ }
193
+ catch (error) {
194
+ if (error instanceof Error) {
195
+ console.error(`Error: ${error.message}`);
196
+ }
197
+ else {
198
+ console.error('Error: Failed to list collections');
199
+ }
200
+ process.exit(1);
201
+ }
202
+ });
203
+ program
204
+ .command('delete')
205
+ .description('Delete a ChromaDB collection')
206
+ .argument('<collectionName>', 'Name of the collection to delete')
207
+ .option('-f, --force', 'Skip confirmation prompt')
208
+ .action(async (collectionName, options) => {
209
+ if (!await ensureChromaRunning()) {
210
+ console.error('Error: ChromaDB is required to delete collections.');
211
+ process.exit(1);
212
+ }
213
+ try {
214
+ await initializeChromaDB();
215
+ const collections = await listCollections();
216
+ const collectionExists = collections.some(c => c.name === collectionName);
217
+ if (!collectionExists) {
218
+ console.error(`Error: Collection '${collectionName}' not found`);
219
+ process.exit(1);
220
+ }
221
+ if (!options.force) {
222
+ const readline = await import('node:readline/promises');
223
+ const rl = readline.createInterface({
224
+ input: process.stdin,
225
+ output: process.stdout,
226
+ });
227
+ const answer = await rl.question(`Are you sure you want to delete collection '${collectionName}'? (y/N): `);
228
+ rl.close();
229
+ if (answer.toLowerCase() !== 'y') {
230
+ console.log('Deletion cancelled.');
231
+ process.exit(0);
232
+ }
233
+ }
234
+ await deleteCollection(collectionName);
235
+ console.log(`Collection '${collectionName}' deleted successfully.`);
236
+ }
237
+ catch (error) {
238
+ if (error instanceof Error) {
239
+ console.error(`Error: ${error.message}`);
240
+ }
241
+ else {
242
+ console.error('Error: Failed to delete collection');
243
+ }
244
+ process.exit(1);
245
+ }
246
+ });
247
+ program.parse();
248
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { indexFolder } from './orchestrator.js';
2
+ export { scanFolder } from './scanner.js';
3
+ export type { IndexResult, IndexStats } from './types.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { indexFolder } from './orchestrator.js';
2
+ export { scanFolder } from './scanner.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { IndexResult } from './types.js';
2
+ export declare function indexFolder(folderPath: string): Promise<IndexResult>;
3
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/indexer/orchestrator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAU1D,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA6G1E"}
@@ -0,0 +1,106 @@
1
+ import { scanFolder } from './scanner.js';
2
+ import { parseDocument } from '../parsers/index.js';
3
+ import { chunkDocument } from '../chunker/index.js';
4
+ import { generateEmbeddings } from '../embeddings/index.js';
5
+ import { getOrCreateCollection, storeEmbeddings, initializeChromaDB } from '../vector-store/index.js';
6
+ import path from 'path';
7
+ import crypto from 'crypto';
8
+ import fs from 'fs/promises';
9
+ export async function indexFolder(folderPath) {
10
+ const stats = {
11
+ filesProcessed: 0,
12
+ filesSkipped: 0,
13
+ chunksIndexed: 0,
14
+ errors: [],
15
+ };
16
+ try {
17
+ await fs.access(folderPath);
18
+ }
19
+ catch {
20
+ return {
21
+ success: false,
22
+ stats,
23
+ collectionName: '',
24
+ };
25
+ }
26
+ const folderName = path.basename(folderPath);
27
+ try {
28
+ await initializeChromaDB();
29
+ }
30
+ catch (error) {
31
+ stats.errors.push(error instanceof Error ? error.message : String(error));
32
+ return {
33
+ success: false,
34
+ stats,
35
+ collectionName: '',
36
+ };
37
+ }
38
+ let collection;
39
+ try {
40
+ collection = await getOrCreateCollection(folderName);
41
+ }
42
+ catch (error) {
43
+ stats.errors.push(error instanceof Error ? error.message : String(error));
44
+ return {
45
+ success: false,
46
+ stats,
47
+ collectionName: '',
48
+ };
49
+ }
50
+ const files = await scanFolder(folderPath);
51
+ if (files.length === 0) {
52
+ console.log('No supported files found in the folder.');
53
+ return {
54
+ success: true,
55
+ stats,
56
+ collectionName: folderName,
57
+ };
58
+ }
59
+ console.log(`Found ${files.length} supported file(s).`);
60
+ for (let i = 0; i < files.length; i++) {
61
+ const filePath = files[i];
62
+ const fileName = path.basename(filePath);
63
+ console.log(`\n[${i + 1}/${files.length}] Processing: ${fileName}`);
64
+ try {
65
+ const parsed = await parseDocument(filePath);
66
+ const chunks = chunkDocument(parsed);
67
+ if (chunks.length === 0) {
68
+ console.warn(` Warning: No chunks generated from ${fileName}`);
69
+ stats.filesSkipped++;
70
+ continue;
71
+ }
72
+ const texts = chunks.map((c) => c.content);
73
+ const embeddings = await generateEmbeddings(texts);
74
+ const vectorChunks = chunks.map((chunk, idx) => ({
75
+ id: crypto.createHash('md5').update(`${filePath}:${idx}`).digest('hex'),
76
+ embedding: embeddings[idx],
77
+ metadata: chunk.metadata,
78
+ content: chunk.content,
79
+ }));
80
+ await storeEmbeddings(collection, vectorChunks);
81
+ stats.filesProcessed++;
82
+ stats.chunksIndexed += chunks.length;
83
+ console.log(` Indexed ${chunks.length} chunk(s)`);
84
+ }
85
+ catch (error) {
86
+ const errorMessage = error instanceof Error ? error.message : String(error);
87
+ console.warn(` Warning: Failed to process ${fileName}: ${errorMessage}`);
88
+ stats.errors.push(`${filePath}: ${errorMessage}`);
89
+ stats.filesSkipped++;
90
+ }
91
+ }
92
+ console.log(`\nIndexing complete!`);
93
+ console.log(`Files processed: ${stats.filesProcessed}`);
94
+ console.log(`Files skipped: ${stats.filesSkipped}`);
95
+ console.log(`Total chunks indexed: ${stats.chunksIndexed}`);
96
+ console.log(`Collection: ${folderName}`);
97
+ if (stats.errors.length > 0) {
98
+ console.log(`\nErrors encountered: ${stats.errors.length}`);
99
+ }
100
+ return {
101
+ success: true,
102
+ stats,
103
+ collectionName: folderName,
104
+ };
105
+ }
106
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/indexer/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function scanFolder(folderPath: string): Promise<string[]>;
2
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/indexer/scanner.ts"],"names":[],"mappings":"AAKA,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA8BtE"}
@@ -0,0 +1,34 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ const SUPPORTED_EXTENSIONS = ['.pdf', '.md', '.csv'];
4
+ export async function scanFolder(folderPath) {
5
+ const files = [];
6
+ async function scan(currentPath) {
7
+ try {
8
+ const entries = await fs.readdir(currentPath, { withFileTypes: true });
9
+ for (const entry of entries) {
10
+ const fullPath = path.join(currentPath, entry.name);
11
+ if (entry.isDirectory()) {
12
+ await scan(fullPath);
13
+ }
14
+ else if (entry.isFile()) {
15
+ const ext = path.extname(entry.name).toLowerCase();
16
+ if (SUPPORTED_EXTENSIONS.includes(ext)) {
17
+ files.push(fullPath);
18
+ }
19
+ }
20
+ }
21
+ }
22
+ catch (error) {
23
+ if (error instanceof Error && 'code' in error && error.code === 'EACCES') {
24
+ console.warn(`Warning: Skipping directory due to permission error: ${currentPath}`);
25
+ }
26
+ else {
27
+ throw error;
28
+ }
29
+ }
30
+ }
31
+ await scan(folderPath);
32
+ return files;
33
+ }
34
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/indexer/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,UAAU,IAAI,CAAC,WAAmB;QACrC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAEvE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEpD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;oBACxB,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;oBAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;oBACnD,IAAI,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBACvC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACvB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAK,KAAa,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClF,OAAO,CAAC,IAAI,CAAC,wDAAwD,WAAW,EAAE,CAAC,CAAC;YACtF,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface IndexStats {
2
+ filesProcessed: number;
3
+ filesSkipped: number;
4
+ chunksIndexed: number;
5
+ errors: string[];
6
+ }
7
+ export interface IndexResult {
8
+ success: boolean;
9
+ stats: IndexStats;
10
+ collectionName: string;
11
+ }
12
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { CSVDocument } from './types.js';
2
+ export declare function parseCSV(filePath: string): Promise<CSVDocument[]>;
3
+ //# sourceMappingURL=csv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../src/parsers/csv.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAuCvE"}