opengauge 0.1.0 → 0.1.1
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/README.md +42 -25
- package/dist/core/attachments/processor.d.ts +23 -0
- package/dist/core/attachments/processor.d.ts.map +1 -0
- package/dist/core/attachments/processor.js +253 -0
- package/dist/core/attachments/processor.js.map +1 -0
- package/dist/core/attachments/retriever.d.ts +7 -0
- package/dist/core/attachments/retriever.d.ts.map +1 -0
- package/dist/core/attachments/retriever.js +58 -0
- package/dist/core/attachments/retriever.js.map +1 -0
- package/dist/core/optimizer/compressor.d.ts.map +1 -1
- package/dist/core/optimizer/compressor.js +4 -9
- package/dist/core/optimizer/compressor.js.map +1 -1
- package/dist/core/rag/embedder.d.ts +1 -0
- package/dist/core/rag/embedder.d.ts.map +1 -1
- package/dist/core/rag/embedder.js +8 -0
- package/dist/core/rag/embedder.js.map +1 -1
- package/dist/db/queries.d.ts +33 -0
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +79 -0
- package/dist/db/queries.js.map +1 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +38 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +13 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/index.d.ts.map +1 -1
- package/dist/server/routes/index.js +83 -8
- package/dist/server/routes/index.js.map +1 -1
- package/dist/ui/static/app.js +76 -5
- package/package.json +9 -6
package/README.md
CHANGED
|
@@ -1,46 +1,53 @@
|
|
|
1
1
|
# OpenGauge
|
|
2
2
|
|
|
3
|
-
A local-first, token-efficient LLM chat interface
|
|
3
|
+
A local-first, token-efficient LLM chat interface.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
If you just want to use it, you only need one command:
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
- Context retrieval from past messages (RAG-style memory)
|
|
11
|
-
- Provider support for Anthropic, OpenAI, Gemini, and Ollama
|
|
12
|
-
- Local storage via SQLite in `~/.opengauge/opengauge.db`
|
|
7
|
+
```bash
|
|
8
|
+
npx opengauge
|
|
9
|
+
```
|
|
13
10
|
|
|
14
|
-
##
|
|
11
|
+
## What this repo does
|
|
12
|
+
|
|
13
|
+
OpenGauge runs a local web chat app with:
|
|
14
|
+
- Token optimization (compression + deduplication + checkpoints)
|
|
15
|
+
- Context retrieval from conversation history (RAG-style)
|
|
16
|
+
- Multiple providers: Anthropic, OpenAI, Gemini, Ollama
|
|
17
|
+
- Local storage in SQLite at `~/.opengauge/opengauge.db`
|
|
15
18
|
|
|
16
|
-
|
|
19
|
+
## Use via npx (recommended)
|
|
17
20
|
|
|
18
21
|
```bash
|
|
19
22
|
npx opengauge
|
|
20
23
|
```
|
|
21
24
|
|
|
22
|
-
|
|
25
|
+
You do not need to install OpenGauge globally first.
|
|
26
|
+
`npx` will download the package (if not already cached) and run it.
|
|
27
|
+
On first run, it may take a little longer while it fetches the package.
|
|
23
28
|
|
|
24
|
-
|
|
25
|
-
git clone https://github.com/applytorque/opengauge.git
|
|
26
|
-
cd opengauge
|
|
27
|
-
npm install
|
|
28
|
-
npm run build
|
|
29
|
-
npm start
|
|
30
|
-
```
|
|
29
|
+
This starts a local server and opens the app in your browser.
|
|
31
30
|
|
|
32
|
-
|
|
31
|
+
Default URL:
|
|
33
32
|
|
|
34
33
|
```txt
|
|
35
34
|
http://localhost:3000
|
|
36
35
|
```
|
|
37
36
|
|
|
38
|
-
|
|
37
|
+
If port 3000 is busy:
|
|
39
38
|
|
|
40
|
-
|
|
39
|
+
```bash
|
|
40
|
+
npx opengauge --port 3001
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## First-time setup
|
|
44
|
+
|
|
45
|
+
When the app opens, configure your provider in the UI wizard, or create:
|
|
41
46
|
|
|
42
47
|
`~/.opengauge/config.yml`
|
|
43
48
|
|
|
49
|
+
Example:
|
|
50
|
+
|
|
44
51
|
```yaml
|
|
45
52
|
providers:
|
|
46
53
|
anthropic:
|
|
@@ -51,12 +58,22 @@ defaults:
|
|
|
51
58
|
provider: anthropic
|
|
52
59
|
```
|
|
53
60
|
|
|
54
|
-
##
|
|
61
|
+
## Developer setup (from source)
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
git clone https://github.com/applytorque/opengauge.git
|
|
65
|
+
cd opengauge
|
|
66
|
+
npm install
|
|
67
|
+
npm run build
|
|
68
|
+
npm start
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Useful commands
|
|
55
72
|
|
|
56
73
|
```bash
|
|
57
|
-
npm run build #
|
|
58
|
-
npm start #
|
|
59
|
-
npm pack --dry-run #
|
|
74
|
+
npm run build # Compile TypeScript + copy UI assets
|
|
75
|
+
npm start # Run CLI entry locally
|
|
76
|
+
npm pack --dry-run # Preview npm package contents
|
|
60
77
|
```
|
|
61
78
|
|
|
62
79
|
## License
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface UploadedAttachment {
|
|
2
|
+
filename: string;
|
|
3
|
+
mimetype: string;
|
|
4
|
+
buffer: Buffer;
|
|
5
|
+
size: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ProcessedAttachment {
|
|
8
|
+
filename: string;
|
|
9
|
+
mimetype: string;
|
|
10
|
+
size: number;
|
|
11
|
+
kind: 'pdf' | 'image' | 'text' | 'binary';
|
|
12
|
+
extractedText: string;
|
|
13
|
+
summary: string;
|
|
14
|
+
keyPoints: string[];
|
|
15
|
+
chunks: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface AttachmentProcessResult {
|
|
18
|
+
files: ProcessedAttachment[];
|
|
19
|
+
inlineContext: string;
|
|
20
|
+
count: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function processAttachments(files: UploadedAttachment[]): Promise<AttachmentProcessResult | null>;
|
|
23
|
+
//# sourceMappingURL=processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../../src/core/attachments/processor.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AASD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,kBAAkB,EAAE,GAC1B,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAiCzC"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.processAttachments = processAttachments;
|
|
40
|
+
const path_1 = __importDefault(require("path"));
|
|
41
|
+
const compressor_1 = require("../optimizer/compressor");
|
|
42
|
+
const MAX_FILES = 8;
|
|
43
|
+
const MAX_FILE_BYTES = 8 * 1024 * 1024;
|
|
44
|
+
const MAX_TEXT_CHARS_PER_FILE = 20000;
|
|
45
|
+
const MAX_TOTAL_CONTEXT_CHARS = 22000;
|
|
46
|
+
const CHUNK_SIZE = 1200;
|
|
47
|
+
const CHUNK_OVERLAP = 180;
|
|
48
|
+
async function processAttachments(files) {
|
|
49
|
+
if (!files.length)
|
|
50
|
+
return null;
|
|
51
|
+
const limitedFiles = files.slice(0, MAX_FILES);
|
|
52
|
+
const processed = [];
|
|
53
|
+
const sections = [];
|
|
54
|
+
let totalChars = 0;
|
|
55
|
+
for (const file of limitedFiles) {
|
|
56
|
+
const result = await processSingleAttachment(file);
|
|
57
|
+
if (!result)
|
|
58
|
+
continue;
|
|
59
|
+
processed.push(result);
|
|
60
|
+
const keyPointsText = result.keyPoints.map((point, i) => `${i + 1}. ${point}`).join('\n');
|
|
61
|
+
const section = `[File: ${result.filename}]\nType: ${result.kind} (${result.mimetype || 'unknown'})\nSummary: ${result.summary}\nKey Points:\n${keyPointsText}`;
|
|
62
|
+
if (totalChars + section.length <= MAX_TOTAL_CONTEXT_CHARS) {
|
|
63
|
+
sections.push(section);
|
|
64
|
+
totalChars += section.length;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (!processed.length)
|
|
68
|
+
return null;
|
|
69
|
+
const combined = `[Attached Files]\nUse this processed file context when answering. Prioritize user message when conflicts occur.\n\n${sections.join('\n\n')}\n\n[End Attached Files]`;
|
|
70
|
+
const compressed = (0, compressor_1.compressPrompt)(combined, 0.7).compressed;
|
|
71
|
+
return {
|
|
72
|
+
files: processed,
|
|
73
|
+
inlineContext: compressed,
|
|
74
|
+
count: processed.length,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
async function processSingleAttachment(file) {
|
|
78
|
+
const ext = path_1.default.extname(file.filename).toLowerCase();
|
|
79
|
+
const mime = (file.mimetype || '').toLowerCase();
|
|
80
|
+
const safeName = file.filename || 'unnamed-file';
|
|
81
|
+
if (file.size > MAX_FILE_BYTES) {
|
|
82
|
+
const summary = `File skipped due to size limit (${file.size} bytes).`;
|
|
83
|
+
return {
|
|
84
|
+
filename: safeName,
|
|
85
|
+
mimetype: mime,
|
|
86
|
+
size: file.size,
|
|
87
|
+
kind: inferKind(mime, ext),
|
|
88
|
+
extractedText: summary,
|
|
89
|
+
summary,
|
|
90
|
+
keyPoints: [summary],
|
|
91
|
+
chunks: [summary],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const kind = inferKind(mime, ext);
|
|
95
|
+
let text = '';
|
|
96
|
+
if (kind === 'pdf') {
|
|
97
|
+
text = await extractPdfText(file.buffer);
|
|
98
|
+
if (!text) {
|
|
99
|
+
text = 'PDF detected but text extraction returned empty. The file may be scanned or image-based.';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else if (kind === 'text') {
|
|
103
|
+
text = file.buffer.toString('utf8');
|
|
104
|
+
}
|
|
105
|
+
else if (kind === 'image') {
|
|
106
|
+
text = await extractImageTextWithOptionalOCR(file.buffer);
|
|
107
|
+
if (!text) {
|
|
108
|
+
text = `Image attached (${safeName}). OCR is not available in this runtime, so only metadata is stored.`;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
const headerHex = file.buffer.subarray(0, 64).toString('hex');
|
|
113
|
+
text = `Binary file attached (${safeName}). Full parser not available for this type. Size: ${file.size} bytes. Header(hex): ${headerHex}`;
|
|
114
|
+
}
|
|
115
|
+
const normalized = normalizeText(text).slice(0, MAX_TEXT_CHARS_PER_FILE);
|
|
116
|
+
const chunks = chunkText(normalized, CHUNK_SIZE, CHUNK_OVERLAP);
|
|
117
|
+
const { summary, keyPoints } = summarizeTextIntelligently(normalized);
|
|
118
|
+
return {
|
|
119
|
+
filename: safeName,
|
|
120
|
+
mimetype: mime,
|
|
121
|
+
size: file.size,
|
|
122
|
+
kind,
|
|
123
|
+
extractedText: normalized,
|
|
124
|
+
summary,
|
|
125
|
+
keyPoints,
|
|
126
|
+
chunks,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function inferKind(mime, ext) {
|
|
130
|
+
if (mime.includes('pdf') || ext === '.pdf')
|
|
131
|
+
return 'pdf';
|
|
132
|
+
if (mime.startsWith('image/'))
|
|
133
|
+
return 'image';
|
|
134
|
+
if (isTextLike(mime, ext))
|
|
135
|
+
return 'text';
|
|
136
|
+
return 'binary';
|
|
137
|
+
}
|
|
138
|
+
async function extractPdfText(buffer) {
|
|
139
|
+
try {
|
|
140
|
+
const pdfParseModule = await Promise.resolve().then(() => __importStar(require('pdf-parse')));
|
|
141
|
+
const pdfParse = pdfParseModule.default || pdfParseModule;
|
|
142
|
+
const result = await pdfParse(buffer);
|
|
143
|
+
return result?.text || '';
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return '';
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async function extractImageTextWithOptionalOCR(_buffer) {
|
|
150
|
+
try {
|
|
151
|
+
const dynamicImport = new Function('specifier', 'return import(specifier)');
|
|
152
|
+
const tesseract = await dynamicImport('tesseract.js');
|
|
153
|
+
const createWorker = tesseract.createWorker || tesseract.default?.createWorker;
|
|
154
|
+
if (!createWorker)
|
|
155
|
+
return '';
|
|
156
|
+
const worker = await createWorker('eng');
|
|
157
|
+
const result = await worker.recognize(_buffer);
|
|
158
|
+
await worker.terminate();
|
|
159
|
+
return normalizeText(result?.data?.text || '');
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return '';
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function isTextLike(mime, ext) {
|
|
166
|
+
if (mime.startsWith('text/'))
|
|
167
|
+
return true;
|
|
168
|
+
if (mime.includes('json') || mime.includes('xml') || mime.includes('yaml') || mime.includes('csv')) {
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
const textExtensions = new Set([
|
|
172
|
+
'.txt', '.md', '.markdown', '.json', '.yaml', '.yml', '.xml', '.csv', '.ts', '.js', '.jsx', '.tsx',
|
|
173
|
+
'.py', '.java', '.c', '.cpp', '.cs', '.go', '.rs', '.rb', '.php', '.swift', '.kt', '.sql', '.html',
|
|
174
|
+
'.css', '.scss', '.sh', '.bash', '.zsh', '.toml', '.ini', '.cfg', '.conf', '.log', '.rtf'
|
|
175
|
+
]);
|
|
176
|
+
return textExtensions.has(ext);
|
|
177
|
+
}
|
|
178
|
+
function normalizeText(text) {
|
|
179
|
+
return text
|
|
180
|
+
.replace(/\r/g, '\n')
|
|
181
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
182
|
+
.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F]/g, ' ')
|
|
183
|
+
.trim();
|
|
184
|
+
}
|
|
185
|
+
function chunkText(text, chunkSize, overlap) {
|
|
186
|
+
if (!text)
|
|
187
|
+
return [];
|
|
188
|
+
const chunks = [];
|
|
189
|
+
let start = 0;
|
|
190
|
+
while (start < text.length) {
|
|
191
|
+
let end = Math.min(start + chunkSize, text.length);
|
|
192
|
+
if (end < text.length) {
|
|
193
|
+
const boundary = text.lastIndexOf('\n', end);
|
|
194
|
+
const sentenceBoundary = text.lastIndexOf('. ', end);
|
|
195
|
+
const bestBoundary = Math.max(boundary, sentenceBoundary);
|
|
196
|
+
if (bestBoundary > start + Math.floor(chunkSize * 0.5)) {
|
|
197
|
+
end = bestBoundary + 1;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
const chunk = text.slice(start, end).trim();
|
|
201
|
+
if (chunk)
|
|
202
|
+
chunks.push(chunk);
|
|
203
|
+
if (end >= text.length)
|
|
204
|
+
break;
|
|
205
|
+
start = Math.max(end - overlap, start + 1);
|
|
206
|
+
}
|
|
207
|
+
return chunks.slice(0, 30);
|
|
208
|
+
}
|
|
209
|
+
function summarizeTextIntelligently(text) {
|
|
210
|
+
if (!text) {
|
|
211
|
+
return { summary: 'No extractable text content found.', keyPoints: ['No text content available.'] };
|
|
212
|
+
}
|
|
213
|
+
const sentences = text
|
|
214
|
+
.split(/(?<=[.!?])\s+/)
|
|
215
|
+
.map((s) => s.trim())
|
|
216
|
+
.filter((s) => s.length > 20 && s.length < 320)
|
|
217
|
+
.slice(0, 200);
|
|
218
|
+
if (sentences.length === 0) {
|
|
219
|
+
const snippet = text.slice(0, 240);
|
|
220
|
+
return { summary: snippet, keyPoints: [snippet] };
|
|
221
|
+
}
|
|
222
|
+
const stopwords = new Set([
|
|
223
|
+
'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'to', 'of', 'and', 'in', 'on',
|
|
224
|
+
'for', 'with', 'as', 'by', 'at', 'from', 'or', 'that', 'this', 'it', 'its', 'if', 'then', 'than',
|
|
225
|
+
'into', 'about', 'over', 'under', 'between', 'after', 'before', 'can', 'could', 'should', 'would',
|
|
226
|
+
'may', 'might', 'will', 'shall', 'do', 'does', 'did', 'not', 'no', 'yes', 'we', 'you', 'they'
|
|
227
|
+
]);
|
|
228
|
+
const freq = new Map();
|
|
229
|
+
for (const sentence of sentences) {
|
|
230
|
+
const words = sentence.toLowerCase().match(/[a-z0-9]{3,}/g) || [];
|
|
231
|
+
for (const word of words) {
|
|
232
|
+
if (stopwords.has(word))
|
|
233
|
+
continue;
|
|
234
|
+
freq.set(word, (freq.get(word) || 0) + 1);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const scored = sentences.map((sentence) => {
|
|
238
|
+
const words = sentence.toLowerCase().match(/[a-z0-9]{3,}/g) || [];
|
|
239
|
+
const score = words.reduce((sum, word) => sum + (freq.get(word) || 0), 0) / Math.max(words.length, 1);
|
|
240
|
+
return { sentence, score };
|
|
241
|
+
});
|
|
242
|
+
const top = scored
|
|
243
|
+
.sort((a, b) => b.score - a.score)
|
|
244
|
+
.slice(0, 6)
|
|
245
|
+
.map((s) => s.sentence);
|
|
246
|
+
const keyPoints = top.slice(0, 5);
|
|
247
|
+
const summary = (0, compressor_1.compressPrompt)(top.slice(0, 3).join(' '), 0.55).compressed;
|
|
248
|
+
return {
|
|
249
|
+
summary,
|
|
250
|
+
keyPoints: keyPoints.length ? keyPoints : [summary],
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processor.js","sourceRoot":"","sources":["../../../src/core/attachments/processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Queries, FileChunk } from '../../db/queries';
|
|
2
|
+
export interface RetrievedFileChunk extends FileChunk {
|
|
3
|
+
similarity: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function retrieveRelevantFileChunks(query: string, conversationId: string, queries: Queries, k?: number): Promise<RetrievedFileChunk[]>;
|
|
6
|
+
export declare function buildFileContextBlock(chunks: RetrievedFileChunk[]): string;
|
|
7
|
+
//# sourceMappingURL=retriever.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retriever.d.ts","sourceRoot":"","sources":["../../../src/core/attachments/retriever.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAKtD,MAAM,WAAW,kBAAmB,SAAQ,SAAS;IACnD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,OAAO,EAChB,CAAC,GAAE,MAAU,GACZ,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA4C/B;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAS1E"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.retrieveRelevantFileChunks = retrieveRelevantFileChunks;
|
|
4
|
+
exports.buildFileContextBlock = buildFileContextBlock;
|
|
5
|
+
const embedder_1 = require("../rag/embedder");
|
|
6
|
+
const dedup_1 = require("../optimizer/dedup");
|
|
7
|
+
const compressor_1 = require("../optimizer/compressor");
|
|
8
|
+
async function retrieveRelevantFileChunks(query, conversationId, queries, k = 8) {
|
|
9
|
+
const queryEmbedding = await (0, embedder_1.embed)(query);
|
|
10
|
+
if (!queryEmbedding)
|
|
11
|
+
return [];
|
|
12
|
+
const chunks = queries.listFileChunksByConversation(conversationId);
|
|
13
|
+
if (!chunks.length)
|
|
14
|
+
return [];
|
|
15
|
+
// Try vector search if sqlite-vec table is available.
|
|
16
|
+
const vectorHits = queries.searchSimilarFileChunks(queryEmbedding, k * 2);
|
|
17
|
+
if (vectorHits.length > 0) {
|
|
18
|
+
const chunkMap = new Map(chunks.map((chunk) => [chunk.id, chunk]));
|
|
19
|
+
const retrieved = [];
|
|
20
|
+
for (const hit of vectorHits) {
|
|
21
|
+
const chunk = chunkMap.get(hit.chunk_id);
|
|
22
|
+
if (!chunk)
|
|
23
|
+
continue;
|
|
24
|
+
retrieved.push({
|
|
25
|
+
...chunk,
|
|
26
|
+
similarity: 1 - hit.distance,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return retrieved
|
|
30
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
31
|
+
.slice(0, k);
|
|
32
|
+
}
|
|
33
|
+
// Fallback in-memory similarity (bounded to latest chunks for efficiency)
|
|
34
|
+
const recentChunks = chunks.slice(0, 160);
|
|
35
|
+
const scored = [];
|
|
36
|
+
for (const chunk of recentChunks) {
|
|
37
|
+
const chunkEmbedding = await (0, embedder_1.embed)(chunk.content);
|
|
38
|
+
if (!chunkEmbedding)
|
|
39
|
+
continue;
|
|
40
|
+
scored.push({
|
|
41
|
+
...chunk,
|
|
42
|
+
similarity: (0, dedup_1.cosineSimilarity)(queryEmbedding, chunkEmbedding),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return scored
|
|
46
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
47
|
+
.slice(0, k);
|
|
48
|
+
}
|
|
49
|
+
function buildFileContextBlock(chunks) {
|
|
50
|
+
if (!chunks.length)
|
|
51
|
+
return '';
|
|
52
|
+
const lines = chunks.map((chunk, index) => {
|
|
53
|
+
const compressed = (0, compressor_1.compressPrompt)(chunk.content, 0.72).compressed;
|
|
54
|
+
return `${index + 1}. ${compressed}`;
|
|
55
|
+
});
|
|
56
|
+
return `[Retrieved File Knowledge]\n${lines.join('\n\n')}\n[End Retrieved File Knowledge]`;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=retriever.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retriever.js","sourceRoot":"","sources":["../../../src/core/attachments/retriever.ts"],"names":[],"mappings":";;AASA,gEAiDC;AAED,sDASC;AApED,8CAAwC;AACxC,8CAAsD;AACtD,wDAAyD;AAMlD,KAAK,UAAU,0BAA0B,CAC9C,KAAa,EACb,cAAsB,EACtB,OAAgB,EAChB,IAAY,CAAC;IAEb,MAAM,cAAc,GAAG,MAAM,IAAA,gBAAK,EAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,cAAc;QAAE,OAAO,EAAE,CAAC;IAE/B,MAAM,MAAM,GAAG,OAAO,CAAC,4BAA4B,CAAC,cAAc,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAE9B,sDAAsD;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,SAAS,GAAyB,EAAE,CAAC;QAE3C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,SAAS,CAAC,IAAI,CAAC;gBACb,GAAG,KAAK;gBACR,UAAU,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,SAAS;aACb,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;aAC3C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,0EAA0E;IAC1E,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAyB,EAAE,CAAC;IAExC,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,MAAM,IAAA,gBAAK,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,cAAc;YAAE,SAAS;QAE9B,MAAM,CAAC,IAAI,CAAC;YACV,GAAG,KAAK;YACR,UAAU,EAAE,IAAA,wBAAgB,EAAC,cAAc,EAAE,cAAc,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM;SACV,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;SAC3C,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,SAAgB,qBAAqB,CAAC,MAA4B;IAChE,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAE9B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACxC,MAAM,UAAU,GAAG,IAAA,2BAAc,EAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC;QAClE,OAAO,GAAG,KAAK,GAAG,CAAC,KAAK,UAAU,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,OAAO,+BAA+B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,kCAAkC,CAAC;AAC7F,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compressor.d.ts","sourceRoot":"","sources":["../../../src/core/optimizer/compressor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAyCH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AASD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,cAAc,GAAE,MAAY,GAC3B,iBAAiB,
|
|
1
|
+
{"version":3,"file":"compressor.d.ts","sourceRoot":"","sources":["../../../src/core/optimizer/compressor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAyCH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AASD;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,cAAc,GAAE,MAAY,GAC3B,iBAAiB,CAgDnB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAClD,cAAc,GAAE,MAAU,EAC1B,cAAc,GAAE,MAAY,GAC3B,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBhF"}
|
|
@@ -62,13 +62,14 @@ function estimateTokens(text) {
|
|
|
62
62
|
* @param aggressiveness - 0 (no compression) to 1 (maximum compression). Default 0.3.
|
|
63
63
|
*/
|
|
64
64
|
function compressPrompt(text, aggressiveness = 0.3) {
|
|
65
|
+
const safeAggressiveness = Math.max(0, Math.min(0.85, aggressiveness));
|
|
65
66
|
const tokensRaw = estimateTokens(text);
|
|
66
67
|
let result = text;
|
|
67
68
|
// Always apply phrase compression (these are lossless transformations)
|
|
68
69
|
for (const [pattern, replacement] of COMPRESSION_MAP) {
|
|
69
70
|
result = result.replace(pattern, replacement);
|
|
70
71
|
}
|
|
71
|
-
if (
|
|
72
|
+
if (safeAggressiveness > 0.4) {
|
|
72
73
|
// Strip markdown formatting from older context while preserving meaning
|
|
73
74
|
result = result
|
|
74
75
|
.replace(/^#{1,6}\s+/gm, '')
|
|
@@ -78,22 +79,16 @@ function compressPrompt(text, aggressiveness = 0.3) {
|
|
|
78
79
|
.replace(/`([^`]+)`/g, '$1');
|
|
79
80
|
}
|
|
80
81
|
// Apply word-level compression proportional to aggressiveness
|
|
81
|
-
if (
|
|
82
|
+
if (safeAggressiveness > 0.2) {
|
|
82
83
|
// Remove filler words
|
|
83
84
|
const fillerPatterns = LOW_IMPORTANCE_PATTERNS.slice(3); // very, really, just, etc.
|
|
84
85
|
for (const pattern of fillerPatterns) {
|
|
85
86
|
result = result.replace(pattern, '');
|
|
86
87
|
}
|
|
87
88
|
}
|
|
88
|
-
if (
|
|
89
|
+
if (safeAggressiveness > 0.5) {
|
|
89
90
|
// Remove articles (more aggressive)
|
|
90
91
|
result = result.replace(/\b(the|a|an)\s+/gi, '');
|
|
91
|
-
// Remove additional low-information discourse words
|
|
92
|
-
result = result.replace(/\b(i|you|we|they|it|this|that|these|those|here|there|today|now|then|also|well|okay|great|sure)\b/gi, '');
|
|
93
|
-
}
|
|
94
|
-
if (aggressiveness > 0.7) {
|
|
95
|
-
// Remove copulas where surrounding context is clear
|
|
96
|
-
result = result.replace(/\b(is|are|was|were)\s+/gi, ' ');
|
|
97
92
|
}
|
|
98
93
|
// Clean up extra whitespace
|
|
99
94
|
result = result.replace(/\s{2,}/g, ' ').trim();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compressor.js","sourceRoot":"","sources":["../../../src/core/optimizer/compressor.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AA8DH,
|
|
1
|
+
{"version":3,"file":"compressor.js","sourceRoot":"","sources":["../../../src/core/optimizer/compressor.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Zero API cost, ~23ms per embedding, fully offline.
|
|
5
5
|
* Output dimension: 384
|
|
6
6
|
*/
|
|
7
|
+
export declare function getEmbeddingMode(): 'onnx-minilm' | 'fallback-hash';
|
|
7
8
|
/**
|
|
8
9
|
* Generate embedding for a text using the ONNX model.
|
|
9
10
|
* Returns null if the model is not available.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../../../src/core/rag/embedder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../../../src/core/rag/embedder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuDH,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,eAAe,CAElE;AAmDD;;;GAGG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAuDtE;AA2CD;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,CAMlF"}
|
|
@@ -42,6 +42,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
42
42
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
43
43
|
};
|
|
44
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.getEmbeddingMode = getEmbeddingMode;
|
|
45
46
|
exports.embed = embed;
|
|
46
47
|
exports.embedBatch = embedBatch;
|
|
47
48
|
const path_1 = __importDefault(require("path"));
|
|
@@ -49,6 +50,7 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
49
50
|
const os_1 = __importDefault(require("os"));
|
|
50
51
|
let session = null;
|
|
51
52
|
let sessionChecked = false;
|
|
53
|
+
let usingFallbackEmbeddings = false;
|
|
52
54
|
let tokenizer = null;
|
|
53
55
|
// Simple word-piece tokenizer for MiniLM
|
|
54
56
|
// In production, you'd use the actual tokenizer from the model
|
|
@@ -70,6 +72,7 @@ async function getSession() {
|
|
|
70
72
|
const modelDir = path_1.default.join(os_1.default.homedir(), '.opengauge', 'models');
|
|
71
73
|
const modelPath = path_1.default.join(modelDir, 'all-MiniLM-L6-v2.onnx');
|
|
72
74
|
if (!fs_1.default.existsSync(modelPath)) {
|
|
75
|
+
usingFallbackEmbeddings = true;
|
|
73
76
|
console.log('[OpenGauge] Embedding model not found. Using fallback hash embeddings.');
|
|
74
77
|
console.log(` To enable full semantic search, place all-MiniLM-L6-v2.onnx in ${modelDir}`);
|
|
75
78
|
return null;
|
|
@@ -77,14 +80,19 @@ async function getSession() {
|
|
|
77
80
|
session = await ort.InferenceSession.create(modelPath, {
|
|
78
81
|
executionProviders: ['cpu'],
|
|
79
82
|
});
|
|
83
|
+
usingFallbackEmbeddings = false;
|
|
80
84
|
console.log('[OpenGauge] ONNX embedding model loaded successfully.');
|
|
81
85
|
return session;
|
|
82
86
|
}
|
|
83
87
|
catch (error) {
|
|
88
|
+
usingFallbackEmbeddings = true;
|
|
84
89
|
console.warn('[OpenGauge] Failed to initialize ONNX embedding model. Using fallback.', error);
|
|
85
90
|
return null;
|
|
86
91
|
}
|
|
87
92
|
}
|
|
93
|
+
function getEmbeddingMode() {
|
|
94
|
+
return usingFallbackEmbeddings ? 'fallback-hash' : 'onnx-minilm';
|
|
95
|
+
}
|
|
88
96
|
/**
|
|
89
97
|
* Simple tokenization: split on whitespace and punctuation,
|
|
90
98
|
* convert to indices. This is a fallback; a proper tokenizer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../../src/core/rag/embedder.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../../src/core/rag/embedder.ts"],"names":[],"mappings":"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"}
|