@mcp-monorepo/notion-query 1.1.0 → 1.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.
- package/dist/index.js +56 -7
- package/dist/index.js.map +1 -1
- package/dist/lib/client.d.ts +9 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +19 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/config.d.ts +44 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +49 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/id-utils.d.ts +8 -0
- package/dist/lib/id-utils.d.ts.map +1 -0
- package/dist/lib/id-utils.js +20 -0
- package/dist/lib/id-utils.js.map +1 -0
- package/dist/lib/markdown-converter.d.ts +8 -0
- package/dist/lib/markdown-converter.d.ts.map +1 -0
- package/dist/lib/markdown-converter.js +95 -0
- package/dist/lib/markdown-converter.js.map +1 -0
- package/dist/lib/notion-syncer.d.ts +27 -0
- package/dist/lib/notion-syncer.d.ts.map +1 -0
- package/dist/lib/notion-syncer.js +212 -0
- package/dist/lib/notion-syncer.js.map +1 -0
- package/dist/lib/parser.d.ts +13 -0
- package/dist/lib/parser.d.ts.map +1 -0
- package/dist/lib/parser.js +88 -0
- package/dist/lib/parser.js.map +1 -0
- package/dist/lib/property-parser.d.ts +23 -0
- package/dist/lib/property-parser.d.ts.map +1 -0
- package/dist/lib/property-parser.js +200 -0
- package/dist/lib/property-parser.js.map +1 -0
- package/dist/lib/response-formatter.d.ts +16 -0
- package/dist/lib/response-formatter.d.ts.map +1 -0
- package/dist/lib/response-formatter.js +173 -0
- package/dist/lib/response-formatter.js.map +1 -0
- package/dist/lib/sync-state-manager.d.ts +29 -0
- package/dist/lib/sync-state-manager.d.ts.map +1 -0
- package/dist/lib/sync-state-manager.js +45 -0
- package/dist/lib/sync-state-manager.js.map +1 -0
- package/dist/local-rag/DEMO.d.ts +22 -0
- package/dist/local-rag/DEMO.d.ts.map +1 -0
- package/dist/local-rag/DEMO.js +142 -0
- package/dist/local-rag/DEMO.js.map +1 -0
- package/dist/local-rag/chunker.d.ts +24 -0
- package/dist/local-rag/chunker.d.ts.map +1 -0
- package/dist/local-rag/chunker.js +58 -0
- package/dist/local-rag/chunker.js.map +1 -0
- package/dist/local-rag/embedder.d.ts +43 -0
- package/dist/local-rag/embedder.d.ts.map +1 -0
- package/dist/local-rag/embedder.js +74 -0
- package/dist/local-rag/embedder.js.map +1 -0
- package/dist/local-rag/embedder.service.d.ts +15 -0
- package/dist/local-rag/embedder.service.d.ts.map +1 -0
- package/dist/local-rag/embedder.service.js +84 -0
- package/dist/local-rag/embedder.service.js.map +1 -0
- package/dist/local-rag/embedder.worker.d.ts +2 -0
- package/dist/local-rag/embedder.worker.d.ts.map +1 -0
- package/dist/local-rag/embedder.worker.js +34 -0
- package/dist/local-rag/embedder.worker.js.map +1 -0
- package/dist/local-rag/errors.d.ts +31 -0
- package/dist/local-rag/errors.d.ts.map +1 -0
- package/dist/local-rag/errors.js +47 -0
- package/dist/local-rag/errors.js.map +1 -0
- package/dist/local-rag/html-parser.d.ts +2 -0
- package/dist/local-rag/html-parser.d.ts.map +1 -0
- package/dist/local-rag/html-parser.js +32 -0
- package/dist/local-rag/html-parser.js.map +1 -0
- package/dist/local-rag/index.d.ts +67 -0
- package/dist/local-rag/index.d.ts.map +1 -0
- package/dist/local-rag/index.js +410 -0
- package/dist/local-rag/index.js.map +1 -0
- package/dist/local-rag/parser.d.ts +59 -0
- package/dist/local-rag/parser.d.ts.map +1 -0
- package/dist/local-rag/parser.js +206 -0
- package/dist/local-rag/parser.js.map +1 -0
- package/dist/local-rag/types.d.ts +209 -0
- package/dist/local-rag/types.d.ts.map +1 -0
- package/dist/local-rag/types.js +5 -0
- package/dist/local-rag/types.js.map +1 -0
- package/dist/local-rag/utils/pool.d.ts +60 -0
- package/dist/local-rag/utils/pool.d.ts.map +1 -0
- package/dist/local-rag/utils/pool.js +140 -0
- package/dist/local-rag/utils/pool.js.map +1 -0
- package/dist/local-rag/utils/typed-emitter.d.ts +28 -0
- package/dist/local-rag/utils/typed-emitter.d.ts.map +1 -0
- package/dist/local-rag/utils/typed-emitter.js +44 -0
- package/dist/local-rag/utils/typed-emitter.js.map +1 -0
- package/dist/local-rag/vectordb/index.d.ts +91 -0
- package/dist/local-rag/vectordb/index.d.ts.map +1 -0
- package/dist/local-rag/vectordb/index.js +278 -0
- package/dist/local-rag/vectordb/index.js.map +1 -0
- package/dist/local-rag/vectordb/manager.d.ts +28 -0
- package/dist/local-rag/vectordb/manager.d.ts.map +1 -0
- package/dist/local-rag/vectordb/manager.js +91 -0
- package/dist/local-rag/vectordb/manager.js.map +1 -0
- package/dist/local-rag/vectordb/migration.d.ts +27 -0
- package/dist/local-rag/vectordb/migration.d.ts.map +1 -0
- package/dist/local-rag/vectordb/migration.js +121 -0
- package/dist/local-rag/vectordb/migration.js.map +1 -0
- package/dist/local-rag/vectordb/retriever.d.ts +51 -0
- package/dist/local-rag/vectordb/retriever.d.ts.map +1 -0
- package/dist/local-rag/vectordb/retriever.js +157 -0
- package/dist/local-rag/vectordb/retriever.js.map +1 -0
- package/dist/local-rag/vectordb/schema.d.ts +33 -0
- package/dist/local-rag/vectordb/schema.d.ts.map +1 -0
- package/dist/local-rag/vectordb/schema.js +102 -0
- package/dist/local-rag/vectordb/schema.js.map +1 -0
- package/dist/local-rag/watcher.d.ts +48 -0
- package/dist/local-rag/watcher.d.ts.map +1 -0
- package/dist/local-rag/watcher.js +102 -0
- package/dist/local-rag/watcher.js.map +1 -0
- package/dist/tools/create-pages.d.ts +4 -0
- package/dist/tools/create-pages.d.ts.map +1 -0
- package/dist/tools/create-pages.js +184 -0
- package/dist/tools/create-pages.js.map +1 -0
- package/dist/tools/fetch.d.ts +4 -0
- package/dist/tools/fetch.d.ts.map +1 -0
- package/dist/tools/fetch.js +90 -0
- package/dist/tools/fetch.js.map +1 -0
- package/dist/tools/query-datasource.d.ts +4 -0
- package/dist/tools/query-datasource.d.ts.map +1 -0
- package/dist/tools/{notion-query.js → query-datasource.js} +31 -38
- package/dist/tools/query-datasource.js.map +1 -0
- package/dist/tools/search.d.ts +12 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +75 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/update-page.d.ts +4 -0
- package/dist/tools/update-page.d.ts.map +1 -0
- package/dist/tools/update-page.js +135 -0
- package/dist/tools/update-page.js.map +1 -0
- package/package.json +23 -8
- package/dist/tools/notion-query.d.ts +0 -3
- package/dist/tools/notion-query.d.ts.map +0 -1
- package/dist/tools/notion-query.js.map +0 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* =============================================================================
|
|
3
|
+
* LocalRAG Self-Contained Demo Script
|
|
4
|
+
* =============================================================================
|
|
5
|
+
*
|
|
6
|
+
* This script is now fully self-contained. It will create its own test data.
|
|
7
|
+
*
|
|
8
|
+
* How to Run:
|
|
9
|
+
* 1. From the root of the `packages/notion-query` directory, run:
|
|
10
|
+
* npx ts-node-esm ./src/DEMO.ts
|
|
11
|
+
*
|
|
12
|
+
* What this script does:
|
|
13
|
+
* 1. Cleans up any previous demo database and data directory.
|
|
14
|
+
* 2. Creates the `./src/data` directory and test files (`rag-intro.txt`, `project-phoenix.md`).
|
|
15
|
+
* 3. Initializes the LocalRAG library.
|
|
16
|
+
* 4. Ingests a raw text snippet and the newly created files.
|
|
17
|
+
* 5. Lists all indexed documents.
|
|
18
|
+
* 6. Performs a natural language query and prints the results.
|
|
19
|
+
* 7. Shuts down the RAG instance gracefully.
|
|
20
|
+
*/
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=DEMO.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DEMO.d.ts","sourceRoot":"","sources":["../../src/local-rag/DEMO.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;GAmBG"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/* eslint-disable use-logger-not-console/replace-console-with-logger */
|
|
2
|
+
/**
|
|
3
|
+
* =============================================================================
|
|
4
|
+
* LocalRAG Self-Contained Demo Script
|
|
5
|
+
* =============================================================================
|
|
6
|
+
*
|
|
7
|
+
* This script is now fully self-contained. It will create its own test data.
|
|
8
|
+
*
|
|
9
|
+
* How to Run:
|
|
10
|
+
* 1. From the root of the `packages/notion-query` directory, run:
|
|
11
|
+
* npx ts-node-esm ./src/DEMO.ts
|
|
12
|
+
*
|
|
13
|
+
* What this script does:
|
|
14
|
+
* 1. Cleans up any previous demo database and data directory.
|
|
15
|
+
* 2. Creates the `./src/data` directory and test files (`rag-intro.txt`, `project-phoenix.md`).
|
|
16
|
+
* 3. Initializes the LocalRAG library.
|
|
17
|
+
* 4. Ingests a raw text snippet and the newly created files.
|
|
18
|
+
* 5. Lists all indexed documents.
|
|
19
|
+
* 6. Performs a natural language query and prints the results.
|
|
20
|
+
* 7. Shuts down the RAG instance gracefully.
|
|
21
|
+
*/
|
|
22
|
+
import { mkdir, rm, writeFile } from 'node:fs/promises';
|
|
23
|
+
import { resolve } from 'node:path';
|
|
24
|
+
import { logger } from '@mcp-monorepo/shared';
|
|
25
|
+
import { LocalRAG } from './index.js';
|
|
26
|
+
// --- Demo File Content ---
|
|
27
|
+
const RAG_INTRO_CONTENT = `LocalRAG is a powerful, private, and configurable local library for Retrieval-Augmented Generation.
|
|
28
|
+
This library allows developers to easily build applications that can reason about local files and data.
|
|
29
|
+
Key features include file and folder ingestion, text and URL ingestion, and fast vector-based search.`;
|
|
30
|
+
const HEADING_ONLY = `# Too Small`;
|
|
31
|
+
const PROJECT_PHOENIX_CONTENT = `# Project Phoenix: A Next-Generation AI Assistant
|
|
32
|
+
|
|
33
|
+
Project Phoenix is a new initiative focused on building an AI assistant that runs entirely on-device.
|
|
34
|
+
It prioritizes user privacy and data security above all else.
|
|
35
|
+
The core technology leverages small, efficient language models combined with a robust vector database for long-term memory.
|
|
36
|
+
The assistant can help with tasks like summarizing documents, answering questions about your local files, and managing your schedule.`;
|
|
37
|
+
/**
|
|
38
|
+
* Creates the necessary demo data directory and files.
|
|
39
|
+
* This makes the demo script fully self-contained.
|
|
40
|
+
* @param dataPath - The path to the directory where data should be created.
|
|
41
|
+
*/
|
|
42
|
+
async function setupDemoData(dataPath) {
|
|
43
|
+
console.log(`\n--- 2. Setting up demo data in ${dataPath} ---`);
|
|
44
|
+
try {
|
|
45
|
+
// Ensure the data directory exists
|
|
46
|
+
await mkdir(dataPath, { recursive: true });
|
|
47
|
+
const introFilePath = resolve(dataPath, 'rag-intro.txt');
|
|
48
|
+
const phoenixFilePath = resolve(dataPath, 'project-phoenix.md');
|
|
49
|
+
const smallPath = resolve(dataPath, 'small.md');
|
|
50
|
+
// Write both files asynchronously
|
|
51
|
+
await Promise.all([
|
|
52
|
+
writeFile(introFilePath, RAG_INTRO_CONTENT, 'utf-8'),
|
|
53
|
+
writeFile(phoenixFilePath, PROJECT_PHOENIX_CONTENT, 'utf-8'),
|
|
54
|
+
writeFile(smallPath, HEADING_ONLY, 'utf-8'),
|
|
55
|
+
]);
|
|
56
|
+
console.log(' -> Created rag-intro.txt');
|
|
57
|
+
console.log(' -> Created project-phoenix.md');
|
|
58
|
+
console.log('✅ Demo data created successfully.');
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error('Failed to create demo data:', error);
|
|
62
|
+
// If data creation fails, we should stop the demo
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// --- Main Demo Function ---
|
|
67
|
+
async function runDemo() {
|
|
68
|
+
const dbPath = resolve(process.cwd(), '.rag_db_demo');
|
|
69
|
+
const dataPath = resolve(process.cwd(), 'src', 'data');
|
|
70
|
+
let rag;
|
|
71
|
+
console.log('🚀 Starting LocalRAG Demo 🚀');
|
|
72
|
+
try {
|
|
73
|
+
// --- 1. Cleanup ---
|
|
74
|
+
console.log('\n--- 1. Cleaning up previous demo files ---');
|
|
75
|
+
await Promise.all([rm(dbPath, { recursive: true, force: true }), rm(dataPath, { recursive: true, force: true })]);
|
|
76
|
+
console.log(`Previous database and data directory removed.`);
|
|
77
|
+
// --- 2. Create Demo Data ---
|
|
78
|
+
await setupDemoData(dataPath);
|
|
79
|
+
// --- 3. Initialize RAG ---
|
|
80
|
+
console.log('\n--- 3. Initializing LocalRAG ---');
|
|
81
|
+
rag = await LocalRAG.create({ dbPath });
|
|
82
|
+
console.log('✅ LocalRAG initialized successfully.');
|
|
83
|
+
// --- 4. Ingesting Content ---
|
|
84
|
+
console.log('\n--- 4. Ingesting content ---');
|
|
85
|
+
await rag.ingestText({
|
|
86
|
+
label: 'greeting-message',
|
|
87
|
+
text: 'Hello, world! This is a raw text snippet added to the vector store.',
|
|
88
|
+
tags: ['test', 'greeting'],
|
|
89
|
+
});
|
|
90
|
+
console.log(' -> Ingested a raw text snippet.');
|
|
91
|
+
await rag.ingestFolder({
|
|
92
|
+
folderPath: dataPath,
|
|
93
|
+
project: 'demo-project',
|
|
94
|
+
});
|
|
95
|
+
console.log(` -> Ingested all files from the '${dataPath}' folder.`);
|
|
96
|
+
console.log('✅ Ingestion complete.');
|
|
97
|
+
// --- 5. Listing Ingested Documents ---
|
|
98
|
+
console.log('\n--- 5. Listing all ingested documents ---');
|
|
99
|
+
const allItems = await rag.list();
|
|
100
|
+
console.log(`Found ${allItems.length} documents in the store:`);
|
|
101
|
+
allItems.forEach((item) => {
|
|
102
|
+
console.log(` - [${item.metadata?.project}] ${item.filePath} (${item.chunkCount} chunks)`);
|
|
103
|
+
});
|
|
104
|
+
// --- 6. Performing a Query ---
|
|
105
|
+
console.log('\n--- 6. Performing a query ---');
|
|
106
|
+
const queryText = 'What is a local rag?';
|
|
107
|
+
console.log(`❓ Query: "${queryText}"\n`);
|
|
108
|
+
console.time('query');
|
|
109
|
+
const results = await rag.query({
|
|
110
|
+
query: queryText,
|
|
111
|
+
limit: 3,
|
|
112
|
+
});
|
|
113
|
+
console.timeEnd('query');
|
|
114
|
+
console.log('✅ Query completed. Top results:');
|
|
115
|
+
if (results.length > 0) {
|
|
116
|
+
results.forEach((result, index) => {
|
|
117
|
+
console.log(`\n--- Result ${index + 1} (Score: ${result.score.toFixed(4)}) ---`);
|
|
118
|
+
console.log(` Source: ${result.filePath}`);
|
|
119
|
+
console.log(` Content: "${result.text.trim().replace(/\n/g, ' ')}"`);
|
|
120
|
+
console.log(` Metadata: ${JSON.stringify(result.metadata)}`);
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
console.log('No relevant results found.');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.error('\n❌ An error occurred during the demo:', error);
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
// --- 7. Shutdown ---
|
|
132
|
+
if (rag) {
|
|
133
|
+
console.log('\n--- 7. Shutting down LocalRAG ---');
|
|
134
|
+
await rag.shutdown();
|
|
135
|
+
logger.close();
|
|
136
|
+
console.log('✅ Shutdown complete.');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Run the demo
|
|
141
|
+
runDemo();
|
|
142
|
+
//# sourceMappingURL=DEMO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DEMO.js","sourceRoot":"","sources":["../../src/local-rag/DEMO.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface ChunkerConfig {
|
|
2
|
+
chunkSize: number;
|
|
3
|
+
chunkOverlap: number;
|
|
4
|
+
}
|
|
5
|
+
export interface TextChunk {
|
|
6
|
+
text: string;
|
|
7
|
+
index: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Splits text into overlapping chunks for embedding.
|
|
11
|
+
*/
|
|
12
|
+
export declare class DocumentChunker {
|
|
13
|
+
private readonly splitter;
|
|
14
|
+
constructor(config: ChunkerConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Splits a given text into an array of indexed chunks with intelligent filtering.
|
|
17
|
+
* If a document is short and results in only one chunk, that chunk is always kept.
|
|
18
|
+
* For multi-chunk documents, small, noisy chunks are filtered out.
|
|
19
|
+
* @param text The input text to split.
|
|
20
|
+
* @returns A promise that resolves to an array of text chunks.
|
|
21
|
+
*/
|
|
22
|
+
chunkText(text: string): Promise<TextChunk[]>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=chunker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.d.ts","sourceRoot":"","sources":["../../src/local-rag/chunker.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;gBAE7C,MAAM,EAAE,aAAa;IAOjC;;;;;;OAMG;IACU,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CA+B3D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters';
|
|
2
|
+
import { logger } from '@mcp-monorepo/shared';
|
|
3
|
+
/**
|
|
4
|
+
* Minimum chunk length in characters.
|
|
5
|
+
* Chunks shorter than this are filtered out to reduce noise from document
|
|
6
|
+
* artifacts like page numbers or isolated headings.
|
|
7
|
+
* This rule does not apply if a document is so short that it only consists of a single chunk.
|
|
8
|
+
*/
|
|
9
|
+
const MIN_CHUNK_LENGTH = 50;
|
|
10
|
+
/**
|
|
11
|
+
* Splits text into overlapping chunks for embedding.
|
|
12
|
+
*/
|
|
13
|
+
export class DocumentChunker {
|
|
14
|
+
splitter;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.splitter = new RecursiveCharacterTextSplitter({
|
|
17
|
+
chunkSize: config.chunkSize,
|
|
18
|
+
chunkOverlap: config.chunkOverlap,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Splits a given text into an array of indexed chunks with intelligent filtering.
|
|
23
|
+
* If a document is short and results in only one chunk, that chunk is always kept.
|
|
24
|
+
* For multi-chunk documents, small, noisy chunks are filtered out.
|
|
25
|
+
* @param text The input text to split.
|
|
26
|
+
* @returns A promise that resolves to an array of text chunks.
|
|
27
|
+
*/
|
|
28
|
+
async chunkText(text) {
|
|
29
|
+
if (!text?.trim()) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const chunks = await this.splitter.splitText(text);
|
|
34
|
+
// If the document is so short that it only produces one chunk,
|
|
35
|
+
// we keep it, as it represents the entire content.
|
|
36
|
+
if (chunks.length === 1) {
|
|
37
|
+
return [
|
|
38
|
+
{
|
|
39
|
+
text: chunks[0],
|
|
40
|
+
index: 0,
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
// For multi-chunk documents, filter out small, noisy chunks to improve quality.
|
|
45
|
+
return chunks
|
|
46
|
+
.filter((chunk) => chunk.length >= MIN_CHUNK_LENGTH)
|
|
47
|
+
.map((chunk, index) => ({
|
|
48
|
+
text: chunk,
|
|
49
|
+
index,
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
logger.error('Failed to chunk text:', error);
|
|
54
|
+
throw error; // Re-throw to be handled by the caller
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=chunker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunker.js","sourceRoot":"","sources":["../../src/local-rag/chunker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAA;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAY3B;;GAEG;AACH,MAAM,OAAO,eAAe;IACT,QAAQ,CAAgC;IAEzD,YAAY,MAAqB;QAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,8BAA8B,CAAC;YACjD,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAA;IACJ,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,SAAS,CAAC,IAAY;QACjC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;YAClB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YAElD,+DAA+D;YAC/D,mDAAmD;YACnD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO;oBACL;wBACE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;wBACf,KAAK,EAAE,CAAC;qBACT;iBACF,CAAA;YACH,CAAC;YAED,gFAAgF;YAChF,OAAO,MAAM;iBACV,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,gBAAgB,CAAC;iBACnD,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBACtB,IAAI,EAAE,KAAK;gBACX,KAAK;aACN,CAAC,CAAC,CAAA;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAA;YAC5C,MAAM,KAAK,CAAA,CAAC,uCAAuC;QACrD,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { PoolConfig } from './types.js';
|
|
2
|
+
export interface EmbedderConfig {
|
|
3
|
+
modelPath: string;
|
|
4
|
+
/**
|
|
5
|
+
* The number of texts to process in a single batch sent to a worker.
|
|
6
|
+
* @default 32
|
|
7
|
+
**/
|
|
8
|
+
batchSize?: number;
|
|
9
|
+
cacheDir: string;
|
|
10
|
+
poolConfig?: PoolConfig;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Manages the embedding process by offloading the CPU-intensive work to a pool of worker threads.
|
|
14
|
+
* This class acts as a proxy to the actual embedding logic, keeping the main thread non-blocking.
|
|
15
|
+
*/
|
|
16
|
+
export declare class Embedder {
|
|
17
|
+
private readonly pool;
|
|
18
|
+
private readonly batchSize;
|
|
19
|
+
private constructor();
|
|
20
|
+
/**
|
|
21
|
+
* Creates and initializes an Embedder instance.
|
|
22
|
+
* It ensures the model is downloaded and cached before creating worker threads.
|
|
23
|
+
*/
|
|
24
|
+
static create(config: EmbedderConfig): Promise<Embedder>;
|
|
25
|
+
/**
|
|
26
|
+
* Generates an embedding vector for a single string of text.
|
|
27
|
+
* @param text The text to embed.
|
|
28
|
+
* @returns A promise that resolves to a numeric vector.
|
|
29
|
+
*/
|
|
30
|
+
embed(text: string): Promise<number[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Generates embedding vectors for an array of texts in batches using the worker pool.
|
|
33
|
+
* This is much more efficient than calling `embed` for each text individually.
|
|
34
|
+
* @param texts An array of texts to embed.
|
|
35
|
+
* @returns A promise that resolves to an array of numeric vectors.
|
|
36
|
+
*/
|
|
37
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
38
|
+
/**
|
|
39
|
+
* Gracefully shuts down all worker threads.
|
|
40
|
+
*/
|
|
41
|
+
destroy(): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=embedder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../../src/local-rag/embedder.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB;;;QAGI;IACJ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,UAAU,CAAA;CACxB;AAED;;;GAGG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAElC,OAAO;IAKP;;;OAGG;WACiB,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiBrE;;;;OAIG;IACU,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAWnD;;;;;OAKG;IACU,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAsB7D;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAGtC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { EmbeddingService } from './embedder.service.js';
|
|
2
|
+
import { EmbeddingError } from './errors.js';
|
|
3
|
+
import { WorkerPool } from './utils/pool.js';
|
|
4
|
+
/**
|
|
5
|
+
* Manages the embedding process by offloading the CPU-intensive work to a pool of worker threads.
|
|
6
|
+
* This class acts as a proxy to the actual embedding logic, keeping the main thread non-blocking.
|
|
7
|
+
*/
|
|
8
|
+
export class Embedder {
|
|
9
|
+
pool;
|
|
10
|
+
batchSize;
|
|
11
|
+
constructor(config, pool) {
|
|
12
|
+
this.batchSize = config.batchSize ?? 32;
|
|
13
|
+
this.pool = pool;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Creates and initializes an Embedder instance.
|
|
17
|
+
* It ensures the model is downloaded and cached before creating worker threads.
|
|
18
|
+
*/
|
|
19
|
+
static async create(config) {
|
|
20
|
+
await EmbeddingService.primeCache(config.modelPath, config.cacheDir);
|
|
21
|
+
const workerPath = new URL('./embedder.worker.js', import.meta.url);
|
|
22
|
+
const pool = new WorkerPool(workerPath, {
|
|
23
|
+
modelPath: config.modelPath,
|
|
24
|
+
cacheDir: config.cacheDir,
|
|
25
|
+
}, config.poolConfig);
|
|
26
|
+
return new Embedder(config, pool);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Generates an embedding vector for a single string of text.
|
|
30
|
+
* @param text The text to embed.
|
|
31
|
+
* @returns A promise that resolves to a numeric vector.
|
|
32
|
+
*/
|
|
33
|
+
async embed(text) {
|
|
34
|
+
if (text.trim().length === 0) {
|
|
35
|
+
throw new EmbeddingError('Cannot generate embedding for empty text.');
|
|
36
|
+
}
|
|
37
|
+
const task = {
|
|
38
|
+
type: 'embed',
|
|
39
|
+
payload: { text },
|
|
40
|
+
};
|
|
41
|
+
return this.pool.runTask(task);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Generates embedding vectors for an array of texts in batches using the worker pool.
|
|
45
|
+
* This is much more efficient than calling `embed` for each text individually.
|
|
46
|
+
* @param texts An array of texts to embed.
|
|
47
|
+
* @returns A promise that resolves to an array of numeric vectors.
|
|
48
|
+
*/
|
|
49
|
+
async embedBatch(texts) {
|
|
50
|
+
if (texts.length === 0) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
const batches = [];
|
|
54
|
+
for (let i = 0; i < texts.length; i += this.batchSize) {
|
|
55
|
+
batches.push(texts.slice(i, i + this.batchSize));
|
|
56
|
+
}
|
|
57
|
+
const batchPromises = batches.map((batch) => {
|
|
58
|
+
const task = {
|
|
59
|
+
type: 'embedBatch',
|
|
60
|
+
payload: { texts: batch },
|
|
61
|
+
};
|
|
62
|
+
return this.pool.runTask(task);
|
|
63
|
+
});
|
|
64
|
+
const results = await Promise.all(batchPromises);
|
|
65
|
+
return results.flat();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Gracefully shuts down all worker threads.
|
|
69
|
+
*/
|
|
70
|
+
async destroy() {
|
|
71
|
+
await this.pool.destroy();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=embedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../src/local-rag/embedder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAsB,MAAM,iBAAiB,CAAA;AAehE;;;GAGG;AACH,MAAM,OAAO,QAAQ;IACF,IAAI,CAAY;IAChB,SAAS,CAAQ;IAElC,YAAoB,MAAsB,EAAE,IAAgB;QAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAA;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAsB;QAC/C,MAAM,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;QAEpE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAEnE,MAAM,IAAI,GAAG,IAAI,UAAU,CACzB,UAAU,EACV;YACE,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,EACD,MAAM,CAAC,UAAU,CAClB,CAAA;QAED,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACnC,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,KAAK,CAAC,IAAY;QAC7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,cAAc,CAAC,2CAA2C,CAAC,CAAA;QACvE,CAAC;QACD,MAAM,IAAI,GAAkB;YAC1B,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,IAAI,EAAE;SAClB,CAAA;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,UAAU,CAAC,KAAe;QACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,OAAO,GAAe,EAAE,CAAA;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QAClD,CAAC;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1C,MAAM,IAAI,GAAkB;gBAC1B,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;aAC1B,CAAA;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAwB,CAAA;QACvD,CAAC,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QAChD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAA;IACvB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,OAAO;QAClB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class EmbeddingService {
|
|
2
|
+
private model;
|
|
3
|
+
private initPromise;
|
|
4
|
+
/**
|
|
5
|
+
* Static method to ensure the model is downloaded to the cache directory.
|
|
6
|
+
* This should be called from the main thread before any workers are created
|
|
7
|
+
* to prevent a download race condition.
|
|
8
|
+
*/
|
|
9
|
+
static primeCache(modelPath: string, cacheDir: string): Promise<void>;
|
|
10
|
+
ensureInitialized(modelPath: string, cacheDir: string): Promise<void>;
|
|
11
|
+
embed(text: string): Promise<number[]>;
|
|
12
|
+
embed(text: string[]): Promise<number[][]>;
|
|
13
|
+
private static getFeatureExtractionPipeline;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=embedder.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.service.d.ts","sourceRoot":"","sources":["../../src/local-rag/embedder.service.ts"],"names":[],"mappings":"AAKA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAmD;IAChE,OAAO,CAAC,WAAW,CAAuC;IAE1D;;;;OAIG;WACiB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBrE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAerE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IACtC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAiCvD,OAAO,CAAC,MAAM,CAAC,4BAA4B,CAK1C;CACF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { env, pipeline } from '@huggingface/transformers';
|
|
2
|
+
import { logger } from '@mcp-monorepo/shared';
|
|
3
|
+
import { EmbeddingError } from './errors.js';
|
|
4
|
+
export class EmbeddingService {
|
|
5
|
+
model = undefined;
|
|
6
|
+
initPromise = undefined;
|
|
7
|
+
/**
|
|
8
|
+
* Static method to ensure the model is downloaded to the cache directory.
|
|
9
|
+
* This should be called from the main thread before any workers are created
|
|
10
|
+
* to prevent a download race condition.
|
|
11
|
+
*/
|
|
12
|
+
static async primeCache(modelPath, cacheDir) {
|
|
13
|
+
try {
|
|
14
|
+
env.cacheDir = cacheDir;
|
|
15
|
+
logger.info(`Main thread: Priming model cache for "${modelPath}"...`);
|
|
16
|
+
// We call pipeline() here just to trigger the download if the model is not cached.
|
|
17
|
+
// The returned pipeline instance is discarded as we don't need it in the main thread.
|
|
18
|
+
await EmbeddingService.getFeatureExtractionPipeline(modelPath, {
|
|
19
|
+
progress_callback: (info) => {
|
|
20
|
+
if (info.status === 'progress')
|
|
21
|
+
logger.info(`Downloading model: ${info.file} [${Math.round(info.progress)}%]`);
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
logger.info('Main thread: Model cache is ready.');
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
throw new EmbeddingError('Main thread failed to prime the model cache.', error);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async ensureInitialized(modelPath, cacheDir) {
|
|
31
|
+
if (this.model)
|
|
32
|
+
return;
|
|
33
|
+
if (this.initPromise)
|
|
34
|
+
return this.initPromise;
|
|
35
|
+
this.initPromise = (async () => {
|
|
36
|
+
try {
|
|
37
|
+
env.cacheDir = cacheDir;
|
|
38
|
+
this.model = await EmbeddingService.getFeatureExtractionPipeline(modelPath);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
this.initPromise = undefined;
|
|
42
|
+
throw new EmbeddingError(`Worker failed to initialize embedding model.`, error);
|
|
43
|
+
}
|
|
44
|
+
})();
|
|
45
|
+
return this.initPromise;
|
|
46
|
+
}
|
|
47
|
+
async embed(text) {
|
|
48
|
+
if (!this.model) {
|
|
49
|
+
throw new EmbeddingError('Worker model not available. ensureInitialized must be called first.');
|
|
50
|
+
}
|
|
51
|
+
const texts = Array.isArray(text) ? text : [text];
|
|
52
|
+
if (texts.some((t) => t.trim().length === 0)) {
|
|
53
|
+
throw new EmbeddingError('Cannot generate embedding for empty text.');
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const output = await this.model(texts, { pooling: 'mean', normalize: true });
|
|
57
|
+
// The output shape depends on whether the input was a single string or an array.
|
|
58
|
+
// We normalize it to always be an array of vectors for consistency.
|
|
59
|
+
if (!Array.isArray(text)) {
|
|
60
|
+
// Input was a single string, result is a 1D tensor represented as a 2D array [1, dim]
|
|
61
|
+
return Array.from(output.data);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
// Input was an array, result is a 2D tensor. We need to slice it.
|
|
65
|
+
const vectors = [];
|
|
66
|
+
const vectorSize = output.dims[1];
|
|
67
|
+
if (vectorSize !== 384)
|
|
68
|
+
throw new EmbeddingError(`Unexpected vector size. Expected 384, got ${vectorSize}.`);
|
|
69
|
+
const flatData = output.data;
|
|
70
|
+
for (let i = 0; i < output.dims[0]; i++) {
|
|
71
|
+
vectors.push(Array.from(flatData.slice(i * vectorSize, (i + 1) * vectorSize)));
|
|
72
|
+
}
|
|
73
|
+
return vectors;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
throw new EmbeddingError('Worker failed to generate embedding for text.', error);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
static getFeatureExtractionPipeline = (model, opts) => {
|
|
81
|
+
return pipeline('feature-extraction', model, opts);
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=embedder.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.service.js","sourceRoot":"","sources":["../../src/local-rag/embedder.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.worker.d.ts","sourceRoot":"","sources":["../../src/local-rag/embedder.worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { parentPort, workerData } from 'node:worker_threads';
|
|
2
|
+
import { EmbeddingService } from './embedder.service.js';
|
|
3
|
+
if (!parentPort)
|
|
4
|
+
throw new Error('This script must be run as a worker thread.');
|
|
5
|
+
const embeddingService = new EmbeddingService();
|
|
6
|
+
const { modelPath, cacheDir } = workerData;
|
|
7
|
+
const initPromise = embeddingService.ensureInitialized(modelPath, cacheDir);
|
|
8
|
+
function serializeError(error) {
|
|
9
|
+
if (error instanceof Error) {
|
|
10
|
+
return { name: error.name, message: error.message, stack: error.stack, cause: error.cause };
|
|
11
|
+
}
|
|
12
|
+
return { name: 'UnknownError', message: String(error) };
|
|
13
|
+
}
|
|
14
|
+
parentPort.on('message', async (data) => {
|
|
15
|
+
const { task, taskId } = data;
|
|
16
|
+
try {
|
|
17
|
+
await initPromise;
|
|
18
|
+
if (task.type === 'embed') {
|
|
19
|
+
const vector = await embeddingService.embed(task.payload.text);
|
|
20
|
+
const result = { taskId, status: 'success', result: vector };
|
|
21
|
+
parentPort?.postMessage(result);
|
|
22
|
+
}
|
|
23
|
+
else if (task.type === 'embedBatch') {
|
|
24
|
+
const vectors = await embeddingService.embed(task.payload.texts);
|
|
25
|
+
const result = { taskId, status: 'success', result: vectors };
|
|
26
|
+
parentPort?.postMessage(result);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
const result = { taskId, status: 'error', error: serializeError(e) };
|
|
31
|
+
parentPort?.postMessage(result);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=embedder.worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.worker.js","sourceRoot":"","sources":["../../src/local-rag/embedder.worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAGxD,IAAI,CAAC,UAAU;IAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;AAE/E,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAA;AAC/C,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,UAAqD,CAAA;AACrF,MAAM,WAAW,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;AAE3E,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAA;IAC7F,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;AACzD,CAAC;AAED,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,IAA6C,EAAE,EAAE;IAC/E,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC7B,IAAI,CAAC;QACH,MAAM,WAAW,CAAA;QACjB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC9D,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;YAC5D,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;QACjC,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAChE,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;YAC7D,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,MAAM,GAAoB,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;QACrF,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents an error due to invalid user input or configuration.
|
|
3
|
+
* Maps to a 400 Bad Request in a server context.
|
|
4
|
+
*/
|
|
5
|
+
export declare class ValidationError extends Error {
|
|
6
|
+
readonly cause?: unknown | undefined;
|
|
7
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Represents an error during a file system operation.
|
|
11
|
+
* Maps to a 500 Internal Server Error in a server context.
|
|
12
|
+
*/
|
|
13
|
+
export declare class FileOperationError extends Error {
|
|
14
|
+
readonly cause?: unknown | undefined;
|
|
15
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Represents an error related to the embedding model.
|
|
19
|
+
*/
|
|
20
|
+
export declare class EmbeddingError extends Error {
|
|
21
|
+
readonly cause?: unknown | undefined;
|
|
22
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Represents an error related to the vector database.
|
|
26
|
+
*/
|
|
27
|
+
export declare class DatabaseError extends Error {
|
|
28
|
+
readonly cause?: unknown | undefined;
|
|
29
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/local-rag/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,KAAK;aAGtB,KAAK,CAAC,EAAE,OAAO;gBAD/B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKlC;AAED;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,KAAK,CAAC,EAAE,OAAO;gBAD/B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKlC;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;aAGrB,KAAK,CAAC,EAAE,OAAO;gBAD/B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKlC;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK;aAGpB,KAAK,CAAC,EAAE,OAAO;gBAD/B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKlC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Represents an error due to invalid user input or configuration.
|
|
3
|
+
* Maps to a 400 Bad Request in a server context.
|
|
4
|
+
*/
|
|
5
|
+
export class ValidationError extends Error {
|
|
6
|
+
cause;
|
|
7
|
+
constructor(message, cause) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.cause = cause;
|
|
10
|
+
this.name = 'ValidationError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Represents an error during a file system operation.
|
|
15
|
+
* Maps to a 500 Internal Server Error in a server context.
|
|
16
|
+
*/
|
|
17
|
+
export class FileOperationError extends Error {
|
|
18
|
+
cause;
|
|
19
|
+
constructor(message, cause) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.cause = cause;
|
|
22
|
+
this.name = 'FileOperationError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Represents an error related to the embedding model.
|
|
27
|
+
*/
|
|
28
|
+
export class EmbeddingError extends Error {
|
|
29
|
+
cause;
|
|
30
|
+
constructor(message, cause) {
|
|
31
|
+
super(message);
|
|
32
|
+
this.cause = cause;
|
|
33
|
+
this.name = 'EmbeddingError';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Represents an error related to the vector database.
|
|
38
|
+
*/
|
|
39
|
+
export class DatabaseError extends Error {
|
|
40
|
+
cause;
|
|
41
|
+
constructor(message, cause) {
|
|
42
|
+
super(message);
|
|
43
|
+
this.cause = cause;
|
|
44
|
+
this.name = 'DatabaseError';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/local-rag/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAGtB;IAFlB,YACE,OAAe,EACC,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzB;IAFlB,YACE,OAAe,EACC,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAGrB;IAFlB,YACE,OAAe,EACC,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;IAC9B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAGpB;IAFlB,YACE,OAAe,EACC,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAA;IAC7B,CAAC;CACF"}
|