@backendkit-labs/agent-enterprise 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +185 -0
  2. package/dist/__tests__/integration/ObsidianRAGProvider.test.d.ts +2 -0
  3. package/dist/__tests__/integration/ObsidianRAGProvider.test.d.ts.map +1 -0
  4. package/dist/__tests__/integration/ObsidianRAGProvider.test.js +237 -0
  5. package/dist/__tests__/integration/ObsidianRAGProvider.test.js.map +1 -0
  6. package/dist/__tests__/integration/OllamaEmbedder.test.d.ts +2 -0
  7. package/dist/__tests__/integration/OllamaEmbedder.test.d.ts.map +1 -0
  8. package/dist/__tests__/integration/OllamaEmbedder.test.js +101 -0
  9. package/dist/__tests__/integration/OllamaEmbedder.test.js.map +1 -0
  10. package/dist/__tests__/unit/VaultIndexer.test.d.ts +2 -0
  11. package/dist/__tests__/unit/VaultIndexer.test.d.ts.map +1 -0
  12. package/dist/__tests__/unit/VaultIndexer.test.js +174 -0
  13. package/dist/__tests__/unit/VaultIndexer.test.js.map +1 -0
  14. package/dist/__tests__/unit/VectorStore.test.d.ts +2 -0
  15. package/dist/__tests__/unit/VectorStore.test.d.ts.map +1 -0
  16. package/dist/__tests__/unit/VectorStore.test.js +146 -0
  17. package/dist/__tests__/unit/VectorStore.test.js.map +1 -0
  18. package/dist/index.d.ts +11 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +16 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/rag/ObsidianRAGProvider.d.ts +52 -0
  23. package/dist/rag/ObsidianRAGProvider.d.ts.map +1 -0
  24. package/dist/rag/ObsidianRAGProvider.js +148 -0
  25. package/dist/rag/ObsidianRAGProvider.js.map +1 -0
  26. package/dist/rag/OllamaEmbedder.d.ts +15 -0
  27. package/dist/rag/OllamaEmbedder.d.ts.map +1 -0
  28. package/dist/rag/OllamaEmbedder.js +50 -0
  29. package/dist/rag/OllamaEmbedder.js.map +1 -0
  30. package/dist/rag/VaultIndexer.d.ts +34 -0
  31. package/dist/rag/VaultIndexer.d.ts.map +1 -0
  32. package/dist/rag/VaultIndexer.js +230 -0
  33. package/dist/rag/VaultIndexer.js.map +1 -0
  34. package/dist/rag/VaultWriter.d.ts +33 -0
  35. package/dist/rag/VaultWriter.d.ts.map +1 -0
  36. package/dist/rag/VaultWriter.js +112 -0
  37. package/dist/rag/VaultWriter.js.map +1 -0
  38. package/dist/rag/VectorStore.d.ts +36 -0
  39. package/dist/rag/VectorStore.d.ts.map +1 -0
  40. package/dist/rag/VectorStore.js +119 -0
  41. package/dist/rag/VectorStore.js.map +1 -0
  42. package/package.json +35 -0
@@ -0,0 +1,174 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const fs = __importStar(require("fs/promises"));
37
+ const os = __importStar(require("os"));
38
+ const path = __importStar(require("path"));
39
+ const VaultIndexer_1 = require("../../rag/VaultIndexer");
40
+ async function writeFixture(dir, name, content) {
41
+ const filePath = path.join(dir, name);
42
+ await fs.writeFile(filePath, content, 'utf-8');
43
+ return filePath;
44
+ }
45
+ describe('VaultIndexer — unit', () => {
46
+ let tmpDir;
47
+ beforeAll(async () => {
48
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'bk-vault-test-'));
49
+ });
50
+ afterAll(async () => {
51
+ await fs.rm(tmpDir, { recursive: true, force: true });
52
+ });
53
+ // ── buildChunks ──────────────────────────────────────────────────────────
54
+ test('extrae título del frontmatter', async () => {
55
+ const fp = await writeFixture(tmpDir, 'title-test.md', `---
56
+ title: Mi Documento
57
+ tags: [área/backend]
58
+ ---
59
+
60
+ Contenido sin secciones.
61
+ `);
62
+ const indexer = new VaultIndexer_1.VaultIndexer({ vaultPath: tmpDir });
63
+ const chunks = await indexer.buildChunks(fp, 1000);
64
+ expect(chunks[0].title).toBe('Mi Documento');
65
+ });
66
+ test('usa nombre de archivo si no hay title en frontmatter', async () => {
67
+ const fp = await writeFixture(tmpDir, 'sin-titulo.md', `Contenido simple.`);
68
+ const indexer = new VaultIndexer_1.VaultIndexer({ vaultPath: tmpDir });
69
+ const chunks = await indexer.buildChunks(fp, 1000);
70
+ expect(chunks[0].title).toBe('sin-titulo');
71
+ });
72
+ test('chunkea por headings ##', async () => {
73
+ const fp = await writeFixture(tmpDir, 'secciones.md', `---
74
+ title: Doc con secciones
75
+ ---
76
+
77
+ ## Sección A
78
+
79
+ Contenido de la sección A.
80
+
81
+ ## Sección B
82
+
83
+ Contenido de la sección B.
84
+ `);
85
+ const indexer = new VaultIndexer_1.VaultIndexer({ vaultPath: tmpDir });
86
+ const chunks = await indexer.buildChunks(fp, 1000);
87
+ expect(chunks).toHaveLength(2);
88
+ expect(chunks[0].section).toBe('Sección A');
89
+ expect(chunks[1].section).toBe('Sección B');
90
+ });
91
+ test('el texto del chunk incluye título y sección como prefijo', async () => {
92
+ const fp = await writeFixture(tmpDir, 'prefijo.md', `---
93
+ title: Mi Nota
94
+ ---
95
+
96
+ ## Detalles
97
+
98
+ Información importante.
99
+ `);
100
+ const indexer = new VaultIndexer_1.VaultIndexer({ vaultPath: tmpDir });
101
+ const chunks = await indexer.buildChunks(fp, 1000);
102
+ expect(chunks[0].text).toMatch(/^Mi Nota — Detalles/);
103
+ });
104
+ test('excluye archivos con tag de exclusión', async () => {
105
+ const fp = await writeFixture(tmpDir, 'skill-file.md', `---
106
+ tags: [skill]
107
+ ---
108
+
109
+ Este es un skill, no debe indexarse.
110
+ `);
111
+ const indexer = new VaultIndexer_1.VaultIndexer({ vaultPath: tmpDir, excludeTags: ['skill'] });
112
+ const chunks = await indexer.buildChunks(fp, 1000);
113
+ expect(chunks).toHaveLength(0);
114
+ });
115
+ test('cuerpo sin secciones produce un chunk con section vacía', async () => {
116
+ const fp = await writeFixture(tmpDir, 'sin-secciones.md', `---
117
+ title: Flat
118
+ ---
119
+
120
+ Un párrafo sin headings de nivel 2.
121
+ `);
122
+ const indexer = new VaultIndexer_1.VaultIndexer({ vaultPath: tmpDir });
123
+ const chunks = await indexer.buildChunks(fp, 1000);
124
+ expect(chunks).toHaveLength(1);
125
+ expect(chunks[0].section).toBe('');
126
+ });
127
+ test('sección larga se divide en sub-chunks por párrafos', async () => {
128
+ const manyWords = Array.from({ length: 60 }, (_, i) => `palabra${i}`).join(' ');
129
+ const body = Array.from({ length: 12 }, () => manyWords).join('\n\n'); // ~720 palabras
130
+ const fp = await writeFixture(tmpDir, 'largo.md', `---
131
+ title: Largo
132
+ ---
133
+
134
+ ## Sección grande
135
+
136
+ ${body}
137
+ `);
138
+ const indexer = new VaultIndexer_1.VaultIndexer({ vaultPath: tmpDir });
139
+ const chunks = await indexer.buildChunks(fp, 1000);
140
+ expect(chunks.length).toBeGreaterThan(1);
141
+ expect(chunks[0].section).toMatch(/^Sección grande/);
142
+ });
143
+ // ── getChangedFiles ──────────────────────────────────────────────────────
144
+ test('archivos nuevos van a toIndex', async () => {
145
+ const subDir = path.join(tmpDir, 'changed-test');
146
+ await fs.mkdir(subDir, { recursive: true });
147
+ await writeFixture(subDir, 'nuevo.md', `# Nuevo\n\nContenido.`);
148
+ const indexer = new VaultIndexer_1.VaultIndexer({ vaultPath: subDir });
149
+ const { toIndex, toRemove } = await indexer.getChangedFiles(new Map());
150
+ expect(toIndex.some(f => f.filePath.endsWith('nuevo.md'))).toBe(true);
151
+ expect(toRemove).toHaveLength(0);
152
+ });
153
+ test('archivos eliminados van a toRemove', async () => {
154
+ const subDir = path.join(tmpDir, 'removed-test');
155
+ await fs.mkdir(subDir, { recursive: true });
156
+ const knownMtimes = new Map([
157
+ [path.join(subDir, 'fantasma.md'), 1000], // ya no existe
158
+ ]);
159
+ const indexer = new VaultIndexer_1.VaultIndexer({ vaultPath: subDir });
160
+ const { toRemove } = await indexer.getChangedFiles(knownMtimes);
161
+ expect(toRemove).toContain(path.join(subDir, 'fantasma.md'));
162
+ });
163
+ test('archivos sin cambios no van a toIndex', async () => {
164
+ const subDir = path.join(tmpDir, 'unchanged-test');
165
+ await fs.mkdir(subDir, { recursive: true });
166
+ const fp = await writeFixture(subDir, 'igual.md', `# Igual\n\nSin cambios.`);
167
+ const stat = await fs.stat(fp);
168
+ const knownMtimes = new Map([[fp, stat.mtimeMs]]);
169
+ const indexer = new VaultIndexer_1.VaultIndexer({ vaultPath: subDir });
170
+ const { toIndex } = await indexer.getChangedFiles(knownMtimes);
171
+ expect(toIndex.some(f => f.filePath === fp)).toBe(false);
172
+ });
173
+ });
174
+ //# sourceMappingURL=VaultIndexer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VaultIndexer.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/VaultIndexer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=VectorStore.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorStore.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/VectorStore.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,146 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const fs = __importStar(require("fs/promises"));
37
+ const os = __importStar(require("os"));
38
+ const path = __importStar(require("path"));
39
+ const VectorStore_1 = require("../../rag/VectorStore");
40
+ function makeChunk(id, filePath, embedding, mtime = 1000) {
41
+ return {
42
+ id,
43
+ filePath,
44
+ title: `Title ${id}`,
45
+ section: '',
46
+ text: `Text for chunk ${id}`,
47
+ embedding,
48
+ metadata: { tags: [], description: '', mtime },
49
+ };
50
+ }
51
+ describe('VectorStore — unit', () => {
52
+ let tmpDir;
53
+ let storePath;
54
+ beforeAll(async () => {
55
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'bk-rag-test-'));
56
+ storePath = path.join(tmpDir, 'store.json');
57
+ });
58
+ afterAll(async () => {
59
+ await fs.rm(tmpDir, { recursive: true, force: true });
60
+ });
61
+ // ── in-memory operations ──────────────────────────────────────────────────
62
+ test('addChunks aumenta el tamaño', () => {
63
+ const store = new VectorStore_1.VectorStore(storePath, 'test-model');
64
+ expect(store.size).toBe(0);
65
+ store.addChunks([makeChunk('a', '/doc1.md', [1, 0, 0])]);
66
+ expect(store.size).toBe(1);
67
+ store.addChunks([makeChunk('b', '/doc2.md', [0, 1, 0])]);
68
+ expect(store.size).toBe(2);
69
+ });
70
+ test('removeFile elimina todos los chunks del archivo', () => {
71
+ const store = new VectorStore_1.VectorStore(storePath, 'test-model');
72
+ store.addChunks([
73
+ makeChunk('c1', '/multi.md', [1, 0, 0]),
74
+ makeChunk('c2', '/multi.md', [0, 1, 0]),
75
+ makeChunk('c3', '/other.md', [0, 0, 1]),
76
+ ]);
77
+ store.removeFile('/multi.md');
78
+ expect(store.size).toBe(1);
79
+ });
80
+ test('getKnownMtimes devuelve un entry por filePath', () => {
81
+ const store = new VectorStore_1.VectorStore(storePath, 'test-model');
82
+ store.addChunks([
83
+ makeChunk('m1', '/a.md', [1, 0], 1000),
84
+ makeChunk('m2', '/a.md', [0, 1], 1000), // mismo archivo, mismo mtime
85
+ makeChunk('m3', '/b.md', [1, 1], 2000),
86
+ ]);
87
+ const mtimes = store.getKnownMtimes();
88
+ expect(mtimes.size).toBe(2);
89
+ expect(mtimes.get('/a.md')).toBe(1000);
90
+ expect(mtimes.get('/b.md')).toBe(2000);
91
+ });
92
+ test('search devuelve resultados ordenados por similitud descendente', () => {
93
+ const store = new VectorStore_1.VectorStore(storePath, 'test-model');
94
+ // Vector base [1, 0, 0]: chunks más cercanos primero
95
+ store.addChunks([
96
+ makeChunk('s1', '/a.md', [1, 0, 0]), // idéntico → score 1.0
97
+ makeChunk('s2', '/b.md', [0, 1, 0]), // ortogonal → score 0.0
98
+ makeChunk('s3', '/c.md', [0.9, 0.1, 0]), // parecido → score ~0.99
99
+ ]);
100
+ const query = [1, 0, 0];
101
+ const results = store.search(query, 3);
102
+ expect(results[0].chunk.id).toBe('s1');
103
+ expect(results[1].chunk.id).toBe('s3');
104
+ expect(results[2].chunk.id).toBe('s2');
105
+ expect(results[0].score).toBeCloseTo(1.0, 4);
106
+ expect(results[2].score).toBeCloseTo(0.0, 4);
107
+ });
108
+ test('search respeta topK', () => {
109
+ const store = new VectorStore_1.VectorStore(storePath, 'test-model');
110
+ store.addChunks([
111
+ makeChunk('t1', '/a.md', [1, 0]),
112
+ makeChunk('t2', '/b.md', [0, 1]),
113
+ makeChunk('t3', '/c.md', [0.5, 0.5]),
114
+ ]);
115
+ const results = store.search([1, 0], 2);
116
+ expect(results).toHaveLength(2);
117
+ });
118
+ // ── persistencia ─────────────────────────────────────────────────────────
119
+ test('save/load round-trip preserva chunks', async () => {
120
+ const sp = path.join(tmpDir, 'round-trip.json');
121
+ const store = new VectorStore_1.VectorStore(sp, 'nomic-embed-text');
122
+ store.addChunks([makeChunk('rt1', '/x.md', [1, 0, 0])]);
123
+ await store.save();
124
+ const loaded = new VectorStore_1.VectorStore(sp, 'nomic-embed-text');
125
+ await loaded.load();
126
+ expect(loaded.size).toBe(1);
127
+ const results = loaded.search([1, 0, 0], 1);
128
+ expect(results[0].chunk.id).toBe('rt1');
129
+ });
130
+ test('load con modelo diferente resetea el índice', async () => {
131
+ const sp = path.join(tmpDir, 'mismatch.json');
132
+ const storeA = new VectorStore_1.VectorStore(sp, 'model-a');
133
+ storeA.addChunks([makeChunk('mm1', '/y.md', [1, 0])]);
134
+ await storeA.save();
135
+ const storeB = new VectorStore_1.VectorStore(sp, 'model-b');
136
+ await storeB.load();
137
+ expect(storeB.size).toBe(0);
138
+ });
139
+ test('save no escribe a disco si no hay cambios', async () => {
140
+ const sp = path.join(tmpDir, 'no-write.json');
141
+ const store = new VectorStore_1.VectorStore(sp, 'test-model');
142
+ await store.save(); // dirty=false, no debe crear el archivo
143
+ await expect(fs.access(sp)).rejects.toThrow();
144
+ });
145
+ });
146
+ //# sourceMappingURL=VectorStore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorStore.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/VectorStore.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { ObsidianRAGProvider } from './rag/ObsidianRAGProvider';
2
+ export type { ObsidianRAGOptions, Embedder } from './rag/ObsidianRAGProvider';
3
+ export { OllamaEmbedder, OLLAMA_EMBED_DEFAULT_HOST, OLLAMA_EMBED_DEFAULT_MODEL } from './rag/OllamaEmbedder';
4
+ export type { OllamaEmbedderOptions } from './rag/OllamaEmbedder';
5
+ export { VectorStore } from './rag/VectorStore';
6
+ export type { VectorChunk, SearchResult } from './rag/VectorStore';
7
+ export { VaultIndexer } from './rag/VaultIndexer';
8
+ export type { IndexerOptions, RawChunk } from './rag/VaultIndexer';
9
+ export { VaultWriter } from './rag/VaultWriter';
10
+ export type { VaultWriterOptions, WriteNoteParams } from './rag/VaultWriter';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,YAAY,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE9E,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAC7G,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VaultWriter = exports.VaultIndexer = exports.VectorStore = exports.OLLAMA_EMBED_DEFAULT_MODEL = exports.OLLAMA_EMBED_DEFAULT_HOST = exports.OllamaEmbedder = exports.ObsidianRAGProvider = void 0;
4
+ var ObsidianRAGProvider_1 = require("./rag/ObsidianRAGProvider");
5
+ Object.defineProperty(exports, "ObsidianRAGProvider", { enumerable: true, get: function () { return ObsidianRAGProvider_1.ObsidianRAGProvider; } });
6
+ var OllamaEmbedder_1 = require("./rag/OllamaEmbedder");
7
+ Object.defineProperty(exports, "OllamaEmbedder", { enumerable: true, get: function () { return OllamaEmbedder_1.OllamaEmbedder; } });
8
+ Object.defineProperty(exports, "OLLAMA_EMBED_DEFAULT_HOST", { enumerable: true, get: function () { return OllamaEmbedder_1.OLLAMA_EMBED_DEFAULT_HOST; } });
9
+ Object.defineProperty(exports, "OLLAMA_EMBED_DEFAULT_MODEL", { enumerable: true, get: function () { return OllamaEmbedder_1.OLLAMA_EMBED_DEFAULT_MODEL; } });
10
+ var VectorStore_1 = require("./rag/VectorStore");
11
+ Object.defineProperty(exports, "VectorStore", { enumerable: true, get: function () { return VectorStore_1.VectorStore; } });
12
+ var VaultIndexer_1 = require("./rag/VaultIndexer");
13
+ Object.defineProperty(exports, "VaultIndexer", { enumerable: true, get: function () { return VaultIndexer_1.VaultIndexer; } });
14
+ var VaultWriter_1 = require("./rag/VaultWriter");
15
+ Object.defineProperty(exports, "VaultWriter", { enumerable: true, get: function () { return VaultWriter_1.VaultWriter; } });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iEAAgE;AAAvD,0HAAA,mBAAmB,OAAA;AAG5B,uDAA6G;AAApG,gHAAA,cAAc,OAAA;AAAE,2HAAA,yBAAyB,OAAA;AAAE,4HAAA,0BAA0B,OAAA;AAG9E,iDAAgD;AAAvC,0GAAA,WAAW,OAAA;AAGpB,mDAAkD;AAAzC,4GAAA,YAAY,OAAA;AAGrB,iDAAgD;AAAvC,0GAAA,WAAW,OAAA"}
@@ -0,0 +1,52 @@
1
+ import type { ToolDefinition } from '@backendkit-labs/agent-core';
2
+ /** Minimal interface any embedder must satisfy. */
3
+ export interface Embedder {
4
+ readonly model: string;
5
+ embed(texts: string[]): Promise<number[][]>;
6
+ embedOne(text: string): Promise<number[]>;
7
+ }
8
+ export interface ObsidianRAGOptions {
9
+ /** Ruta absoluta al vault de Obsidian. */
10
+ vaultPath: string;
11
+ /** Subcarpetas a indexar. Si está vacío, indexa todo el vault. */
12
+ folders?: string[];
13
+ /** Dónde guardar el índice vectorial. Default: ~/.bk-agent/rag/<vault-name>.json */
14
+ indexPath?: string;
15
+ /** Custom embedder. When provided, ollamaHost and embeddingModel are ignored. */
16
+ embedder?: Embedder;
17
+ /** Host de Ollama para embeddings. Default: http://localhost:11434 */
18
+ ollamaHost?: string;
19
+ /** Modelo de embeddings. Default: nomic-embed-text */
20
+ embeddingModel?: string;
21
+ /** Resultados máximos por búsqueda. Default: 5 */
22
+ topK?: number;
23
+ /** Score mínimo de similitud para incluir un resultado (0-1). Default: 0.3 */
24
+ minScore?: number;
25
+ /** Tags del frontmatter a excluir de la indexación. Default: ['skill'] */
26
+ excludeTags?: string[];
27
+ }
28
+ export declare class ObsidianRAGProvider {
29
+ private readonly embedder;
30
+ private readonly store;
31
+ private readonly indexer;
32
+ private readonly topK;
33
+ private readonly minScore;
34
+ private indexed;
35
+ constructor(opts: ObsidianRAGOptions);
36
+ /**
37
+ * Indexa el vault de forma incremental.
38
+ * Solo re-embede archivos nuevos o modificados desde la última indexación.
39
+ */
40
+ index(opts?: {
41
+ verbose?: boolean;
42
+ }): Promise<{
43
+ indexed: number;
44
+ removed: number;
45
+ }>;
46
+ /** Busca en el vault usando similitud semántica. */
47
+ search(query: string, topK?: number): Promise<string>;
48
+ /** Devuelve el tool search_knowledge listo para registrar en ToolRegistry. */
49
+ createTool(): ToolDefinition;
50
+ get chunkCount(): number;
51
+ }
52
+ //# sourceMappingURL=ObsidianRAGProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObsidianRAGProvider.d.ts","sourceRoot":"","sources":["../../src/rag/ObsidianRAGProvider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAKlE,mDAAmD;AACnD,MAAM,WAAW,QAAQ;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,kBAAkB;IAC/B,0CAA0C;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAID,qBAAa,mBAAmB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,OAAO,CAAS;gBAEZ,IAAI,EAAE,kBAAkB;IA2BpC;;;OAGG;IACG,KAAK,CAAC,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAwC5F,oDAAoD;IAC9C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA2B3D,8EAA8E;IAC9E,UAAU,IAAI,cAAc;IAkB5B,IAAI,UAAU,IAAI,MAAM,CAEvB;CACJ"}
@@ -0,0 +1,148 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ObsidianRAGProvider = void 0;
37
+ const path = __importStar(require("path"));
38
+ const os = __importStar(require("os"));
39
+ const agent_core_1 = require("@backendkit-labs/agent-core");
40
+ const OllamaEmbedder_1 = require("./OllamaEmbedder");
41
+ const VectorStore_1 = require("./VectorStore");
42
+ const VaultIndexer_1 = require("./VaultIndexer");
43
+ const BATCH_SIZE = 10;
44
+ class ObsidianRAGProvider {
45
+ embedder;
46
+ store;
47
+ indexer;
48
+ topK;
49
+ minScore;
50
+ indexed = false;
51
+ constructor(opts) {
52
+ if (opts.embedder) {
53
+ this.embedder = opts.embedder;
54
+ }
55
+ else {
56
+ const host = opts.ollamaHost ?? OllamaEmbedder_1.OLLAMA_EMBED_DEFAULT_HOST;
57
+ const model = opts.embeddingModel ?? OllamaEmbedder_1.OLLAMA_EMBED_DEFAULT_MODEL;
58
+ this.embedder = new OllamaEmbedder_1.OllamaEmbedder({ host, model });
59
+ }
60
+ const defaultIndexPath = path.join(os.homedir(), '.bk-agent', 'rag', `${path.basename(opts.vaultPath)}.json`);
61
+ this.store = new VectorStore_1.VectorStore(opts.indexPath ?? defaultIndexPath, this.embedder.model);
62
+ this.indexer = new VaultIndexer_1.VaultIndexer({
63
+ vaultPath: opts.vaultPath,
64
+ folders: opts.folders,
65
+ excludeTags: opts.excludeTags ?? ['skill'],
66
+ });
67
+ this.topK = opts.topK ?? 5;
68
+ this.minScore = opts.minScore ?? 0.3;
69
+ }
70
+ /**
71
+ * Indexa el vault de forma incremental.
72
+ * Solo re-embede archivos nuevos o modificados desde la última indexación.
73
+ */
74
+ async index(opts = {}) {
75
+ await this.store.load();
76
+ const knownMtimes = this.store.getKnownMtimes();
77
+ const { toIndex, toRemove } = await this.indexer.getChangedFiles(knownMtimes);
78
+ for (const filePath of toRemove) {
79
+ this.store.removeFile(filePath);
80
+ }
81
+ let indexed = 0;
82
+ for (let i = 0; i < toIndex.length; i += BATCH_SIZE) {
83
+ const batch = toIndex.slice(i, i + BATCH_SIZE);
84
+ const rawChunksBatch = await Promise.all(batch.map(f => this.indexer.buildChunks(f.filePath, f.mtime)));
85
+ const allRaw = rawChunksBatch.flat();
86
+ if (allRaw.length === 0)
87
+ continue;
88
+ const embeddings = await this.embedder.embed(allRaw.map(c => c.text));
89
+ const vectorChunks = allRaw.map((raw, idx) => this.indexer.toVectorChunk(raw, embeddings[idx] ?? []));
90
+ for (const f of batch)
91
+ this.store.removeFile(f.filePath);
92
+ this.store.addChunks(vectorChunks);
93
+ indexed += vectorChunks.length;
94
+ if (opts.verbose) {
95
+ console.log(`[RAG] Indexados ${Math.min(i + BATCH_SIZE, toIndex.length)}/${toIndex.length} archivos`);
96
+ }
97
+ }
98
+ await this.store.save();
99
+ this.indexed = true;
100
+ return { indexed, removed: toRemove.length };
101
+ }
102
+ /** Busca en el vault usando similitud semántica. */
103
+ async search(query, topK) {
104
+ if (!this.indexed) {
105
+ await this.index();
106
+ }
107
+ const queryEmbedding = await this.embedder.embedOne(query);
108
+ const results = this.store.search(queryEmbedding, topK ?? this.topK);
109
+ const filtered = results.filter(r => r.score >= this.minScore);
110
+ if (filtered.length === 0) {
111
+ return 'No se encontró información relevante en la base de conocimiento para esa consulta.';
112
+ }
113
+ return filtered
114
+ .map((r, i) => {
115
+ const { chunk, score } = r;
116
+ const area = chunk.metadata.area ? ` | área: ${chunk.metadata.area}` : '';
117
+ const stack = chunk.metadata.stack ? ` | stack: ${chunk.metadata.stack}` : '';
118
+ return [
119
+ `--- Resultado ${i + 1} (relevancia: ${(score * 100).toFixed(0)}%${area}${stack}) ---`,
120
+ `Fuente: ${chunk.title}${chunk.section ? ` › ${chunk.section}` : ''}`,
121
+ chunk.text,
122
+ ].join('\n');
123
+ })
124
+ .join('\n\n');
125
+ }
126
+ /** Devuelve el tool search_knowledge listo para registrar en ToolRegistry. */
127
+ createTool() {
128
+ const self = this;
129
+ return (0, agent_core_1.defineTool)({
130
+ name: 'search_knowledge',
131
+ description: 'Busca información en la base de conocimiento de la empresa (vault de Obsidian). ' +
132
+ 'Úsalo cuando necesites información específica del dominio, procesos, políticas o documentación interna.',
133
+ input: agent_core_1.z.object({
134
+ query: agent_core_1.z.string().describe('Pregunta o tema a buscar en lenguaje natural'),
135
+ top_k: agent_core_1.z.number().int().min(1).max(20).optional()
136
+ .describe('Número máximo de resultados (default: 5)'),
137
+ }),
138
+ execute: async ({ query, top_k }) => {
139
+ return self.search(query, top_k);
140
+ },
141
+ });
142
+ }
143
+ get chunkCount() {
144
+ return this.store.size;
145
+ }
146
+ }
147
+ exports.ObsidianRAGProvider = ObsidianRAGProvider;
148
+ //# sourceMappingURL=ObsidianRAGProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObsidianRAGProvider.js","sourceRoot":"","sources":["../../src/rag/ObsidianRAGProvider.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAC7B,uCAAyB;AACzB,4DAA4D;AAE5D,qDAAyG;AACzG,+CAA4C;AAC5C,iDAA8C;AA8B9C,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,MAAa,mBAAmB;IACX,QAAQ,CAAW;IACnB,KAAK,CAAc;IACnB,OAAO,CAAe;IACtB,IAAI,CAAS;IACb,QAAQ,CAAS;IAC1B,OAAO,GAAG,KAAK,CAAC;IAExB,YAAY,IAAwB;QAChC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAClC,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,IAAI,0CAAyB,CAAC;YAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,IAAI,2CAA0B,CAAC;YAChE,IAAI,CAAC,QAAQ,GAAG,IAAI,+BAAc,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAC9B,EAAE,CAAC,OAAO,EAAE,EACZ,WAAW,EACX,KAAK,EACL,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAC1C,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,SAAS,IAAI,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEtF,IAAI,CAAC,OAAO,GAAG,IAAI,2BAAY,CAAC;YAC5B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC;SAC7C,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAK,CAAC,OAA8B,EAAE;QACxC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAE9E,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;YAC/C,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAChE,CAAC;YAEF,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;YACrC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAElC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAEtE,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACzC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CACzD,CAAC;YAEF,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACzD,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACnC,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC;YAE/B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,WAAW,CAAC,CAAC;YAC1G,CAAC;QACL,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACjD,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,IAAa;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE/D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,oFAAoF,CAAC;QAChG,CAAC;QAED,OAAO,QAAQ;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACV,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,OAAO;gBACH,iBAAiB,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,KAAK,OAAO;gBACtF,WAAW,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;gBACrE,KAAK,CAAC,IAAI;aACb,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC,CAAC;aACD,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,8EAA8E;IAC9E,UAAU;QACN,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,OAAO,IAAA,uBAAU,EAAC;YACd,IAAI,EAAE,kBAAkB;YACxB,WAAW,EACP,kFAAkF;gBAClF,yGAAyG;YAC7G,KAAK,EAAE,cAAC,CAAC,MAAM,CAAC;gBACZ,KAAK,EAAE,cAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;gBAC1E,KAAK,EAAE,cAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;qBAC5C,QAAQ,CAAC,0CAA0C,CAAC;aAC5D,CAAC;YACF,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;gBAChC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IAC3B,CAAC;CACJ;AAjID,kDAiIC"}
@@ -0,0 +1,15 @@
1
+ export declare const OLLAMA_EMBED_DEFAULT_MODEL = "nomic-embed-text";
2
+ export declare const OLLAMA_EMBED_DEFAULT_HOST = "http://localhost:11434";
3
+ export interface OllamaEmbedderOptions {
4
+ host?: string;
5
+ model?: string;
6
+ }
7
+ export declare class OllamaEmbedder {
8
+ private readonly host;
9
+ readonly model: string;
10
+ constructor(opts?: OllamaEmbedderOptions);
11
+ embed(texts: string[]): Promise<number[][]>;
12
+ embedOne(text: string): Promise<number[]>;
13
+ checkConnection(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=OllamaEmbedder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OllamaEmbedder.d.ts","sourceRoot":"","sources":["../../src/rag/OllamaEmbedder.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,qBAAqB,CAAC;AAC7D,eAAO,MAAM,yBAAyB,2BAA2B,CAAC;AAElE,MAAM,WAAW,qBAAqB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,IAAI,GAAE,qBAA0B;IAKtC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAwB3C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKzC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAYzC"}