@toolpack-sdk/knowledge 1.2.0-SNAPSHOT.04032026-2

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 (46) hide show
  1. package/README.md +220 -0
  2. package/dist/embedders/ollama.d.ts +15 -0
  3. package/dist/embedders/ollama.d.ts.map +1 -0
  4. package/dist/embedders/ollama.js +51 -0
  5. package/dist/embedders/ollama.js.map +1 -0
  6. package/dist/embedders/openai.d.ts +18 -0
  7. package/dist/embedders/openai.d.ts.map +1 -0
  8. package/dist/embedders/openai.js +63 -0
  9. package/dist/embedders/openai.js.map +1 -0
  10. package/dist/errors.d.ts +25 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +58 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/index.d.ts +14 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +31 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/interfaces.d.ts +48 -0
  19. package/dist/interfaces.d.ts.map +1 -0
  20. package/dist/interfaces.js +3 -0
  21. package/dist/interfaces.js.map +1 -0
  22. package/dist/knowledge.d.ts +74 -0
  23. package/dist/knowledge.d.ts.map +1 -0
  24. package/dist/knowledge.js +120 -0
  25. package/dist/knowledge.js.map +1 -0
  26. package/dist/providers/memory.d.ts +16 -0
  27. package/dist/providers/memory.d.ts.map +1 -0
  28. package/dist/providers/memory.js +72 -0
  29. package/dist/providers/memory.js.map +1 -0
  30. package/dist/providers/persistent.d.ts +23 -0
  31. package/dist/providers/persistent.d.ts.map +1 -0
  32. package/dist/providers/persistent.js +162 -0
  33. package/dist/providers/persistent.js.map +1 -0
  34. package/dist/sources/markdown.d.ts +20 -0
  35. package/dist/sources/markdown.d.ts.map +1 -0
  36. package/dist/sources/markdown.js +196 -0
  37. package/dist/sources/markdown.js.map +1 -0
  38. package/dist/utils/chunking.d.ts +6 -0
  39. package/dist/utils/chunking.d.ts.map +1 -0
  40. package/dist/utils/chunking.js +86 -0
  41. package/dist/utils/chunking.js.map +1 -0
  42. package/dist/utils/cosine.d.ts +4 -0
  43. package/dist/utils/cosine.d.ts.map +1 -0
  44. package/dist/utils/cosine.js +52 -0
  45. package/dist/utils/cosine.js.map +1 -0
  46. package/package.json +39 -0
package/README.md ADDED
@@ -0,0 +1,220 @@
1
+ # toolpack-knowledge
2
+
3
+ RAG (Retrieval-Augmented Generation) package for Toolpack SDK.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install toolpack-knowledge
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ### Development (Zero Infrastructure)
14
+
15
+ ```typescript
16
+ import { Knowledge, MemoryProvider, MarkdownSource, OllamaEmbedder } from 'toolpack-knowledge';
17
+
18
+ const kb = await Knowledge.create({
19
+ provider: new MemoryProvider(),
20
+ sources: [new MarkdownSource('./docs/**/*.md')],
21
+ embedder: new OllamaEmbedder({ model: 'nomic-embed-text' }),
22
+ description: 'SDK documentation — setup guides, API reference, and examples.',
23
+ });
24
+
25
+ const results = await kb.query('how to install');
26
+ console.log(results[0].chunk.content);
27
+ ```
28
+
29
+ ### Production (Persistent)
30
+
31
+ ```typescript
32
+ import { Knowledge, PersistentKnowledgeProvider, MarkdownSource, OpenAIEmbedder } from 'toolpack-knowledge';
33
+
34
+ const kb = await Knowledge.create({
35
+ provider: new PersistentKnowledgeProvider({
36
+ namespace: 'cli',
37
+ reSync: false, // Load from disk if already indexed
38
+ }),
39
+ sources: [new MarkdownSource('./docs/**/*.md')],
40
+ embedder: new OpenAIEmbedder({
41
+ model: 'text-embedding-3-small',
42
+ apiKey: process.env.OPENAI_API_KEY!,
43
+ }),
44
+ description: 'CLI documentation and guides.',
45
+ onEmbeddingProgress: (event) => {
46
+ console.log(`Embedding: ${event.percent}% (${event.current}/${event.total})`);
47
+ },
48
+ });
49
+
50
+ const results = await kb.query('authentication setup', {
51
+ limit: 5,
52
+ threshold: 0.8,
53
+ filter: { hasCode: true },
54
+ });
55
+ ```
56
+
57
+ ### Agent Integration
58
+
59
+ ```typescript
60
+ import { Toolpack } from 'toolpack-sdk';
61
+ import { Knowledge, MemoryProvider, MarkdownSource, OllamaEmbedder } from 'toolpack-knowledge';
62
+
63
+ const kb = await Knowledge.create({
64
+ provider: new MemoryProvider(),
65
+ sources: [new MarkdownSource('./docs/**/*.md')],
66
+ embedder: new OllamaEmbedder({ model: 'nomic-embed-text' }),
67
+ description: 'Search this when the user asks about setup, configuration, or API usage.',
68
+ });
69
+
70
+ const toolpack = await Toolpack.init({
71
+ provider: 'anthropic',
72
+ knowledge: kb, // Registered as knowledge_search tool
73
+ });
74
+
75
+ const response = await toolpack.chat('How do I configure authentication?');
76
+ ```
77
+
78
+ ## Providers
79
+
80
+ ### MemoryProvider
81
+
82
+ In-memory vector storage. Zero configuration, perfect for development and prototyping.
83
+
84
+ ```typescript
85
+ new MemoryProvider({
86
+ maxChunks: 10000, // Optional limit
87
+ })
88
+ ```
89
+
90
+ ### PersistentKnowledgeProvider
91
+
92
+ SQLite-backed persistence for CLI tools and desktop apps.
93
+
94
+ ```typescript
95
+ new PersistentKnowledgeProvider({
96
+ namespace: 'my-app', // Creates ~/.toolpack/knowledge/my-app.db
97
+ storagePath: './custom/path', // Optional: override storage location
98
+ reSync: false, // Optional: skip re-indexing if DB exists
99
+ })
100
+ ```
101
+
102
+ ## Sources
103
+
104
+ ### MarkdownSource
105
+
106
+ Chunks markdown files by heading hierarchy.
107
+
108
+ ```typescript
109
+ new MarkdownSource('./docs/**/*.md', {
110
+ maxChunkSize: 2000, // Max tokens per chunk
111
+ chunkOverlap: 200, // Overlap between chunks
112
+ minChunkSize: 100, // Merge small sections
113
+ namespace: 'docs', // Prefix for chunk IDs
114
+ metadata: { type: 'documentation' }, // Added to all chunks
115
+ })
116
+ ```
117
+
118
+ **Features:**
119
+ - Heading-based chunking (preserves document structure)
120
+ - Frontmatter extraction (YAML)
121
+ - Code block detection (`hasCode` metadata)
122
+ - Deterministic chunk IDs
123
+
124
+ ## Embedders
125
+
126
+ ### OllamaEmbedder
127
+
128
+ Local embeddings via Ollama. Zero API cost.
129
+
130
+ ```typescript
131
+ new OllamaEmbedder({
132
+ model: 'nomic-embed-text', // or 'mxbai-embed-large'
133
+ baseUrl: 'http://localhost:11434', // default
134
+ })
135
+ ```
136
+
137
+ ### OpenAIEmbedder
138
+
139
+ OpenAI text-embedding models with retry logic.
140
+
141
+ ```typescript
142
+ new OpenAIEmbedder({
143
+ model: 'text-embedding-3-small', // or 'text-embedding-3-large'
144
+ apiKey: process.env.OPENAI_API_KEY,
145
+ retries: 3, // default
146
+ retryDelay: 1000, // ms, default
147
+ timeout: 30000, // ms, default
148
+ })
149
+ ```
150
+
151
+ ## API Reference
152
+
153
+ ### Knowledge.create()
154
+
155
+ ```typescript
156
+ interface KnowledgeOptions {
157
+ provider: KnowledgeProvider;
158
+ sources: KnowledgeSource[];
159
+ embedder: Embedder;
160
+ description: string; // Required: used as tool description
161
+ reSync?: boolean; // default: true
162
+ onError?: (error, context) => 'skip' | 'abort';
163
+ onSync?: (event: SyncEvent) => void;
164
+ onEmbeddingProgress?: (event: EmbeddingProgressEvent) => void;
165
+ }
166
+ ```
167
+
168
+ ### query()
169
+
170
+ ```typescript
171
+ await kb.query('search query', {
172
+ limit: 10, // Max results
173
+ threshold: 0.7, // Similarity threshold (0-1)
174
+ filter: { // Metadata filters
175
+ hasCode: true,
176
+ category: { $in: ['api', 'guide'] },
177
+ },
178
+ includeMetadata: true, // default
179
+ includeVectors: false, // default
180
+ });
181
+ ```
182
+
183
+ ### Metadata Filters
184
+
185
+ ```typescript
186
+ {
187
+ field: 'value', // Exact match
188
+ field: { $in: ['a', 'b'] }, // In array
189
+ field: { $gt: 100 }, // Greater than
190
+ field: { $lt: 100 }, // Less than
191
+ }
192
+ ```
193
+
194
+ ## Error Handling
195
+
196
+ ```typescript
197
+ const kb = await Knowledge.create({
198
+ // ...
199
+ onError: (error, context) => {
200
+ console.error(`Failed: ${context.file} — ${error.message}`);
201
+
202
+ if (error instanceof EmbeddingError) {
203
+ return 'skip'; // Skip this chunk, continue
204
+ }
205
+ return 'abort'; // Stop ingestion
206
+ },
207
+ });
208
+ ```
209
+
210
+ **Error Types:**
211
+ - `KnowledgeError` — Base class
212
+ - `EmbeddingError` — Embedding API failure
213
+ - `IngestionError` — Source file parsing failure
214
+ - `ChunkTooLargeError` — Chunk exceeds max size
215
+ - `DimensionMismatchError` — Embedder dimensions mismatch
216
+ - `KnowledgeProviderError` — Provider operation failure
217
+
218
+ ## License
219
+
220
+ Apache-2.0
@@ -0,0 +1,15 @@
1
+ import { Embedder } from '../interfaces.js';
2
+ export interface OllamaEmbedderOptions {
3
+ model: string;
4
+ baseUrl?: string;
5
+ }
6
+ export declare class OllamaEmbedder implements Embedder {
7
+ private options;
8
+ readonly dimensions: number;
9
+ private baseUrl;
10
+ constructor(options: OllamaEmbedderOptions);
11
+ private getModelDimensions;
12
+ embed(text: string): Promise<number[]>;
13
+ embedBatch(texts: string[]): Promise<number[][]>;
14
+ }
15
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/embedders/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,YAAW,QAAQ;IAIjC,OAAO,CAAC,OAAO;IAH3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,OAAO,CAAS;gBAEJ,OAAO,EAAE,qBAAqB;IAKlD,OAAO,CAAC,kBAAkB;IASpB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsBtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAOvD"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OllamaEmbedder = void 0;
4
+ const errors_js_1 = require("../errors.js");
5
+ class OllamaEmbedder {
6
+ options;
7
+ dimensions;
8
+ baseUrl;
9
+ constructor(options) {
10
+ this.options = options;
11
+ this.baseUrl = options.baseUrl || 'http://localhost:11434';
12
+ this.dimensions = this.getModelDimensions(options.model);
13
+ }
14
+ getModelDimensions(model) {
15
+ const dimensionsMap = {
16
+ 'nomic-embed-text': 768,
17
+ 'mxbai-embed-large': 1024,
18
+ 'all-minilm': 384,
19
+ };
20
+ return dimensionsMap[model] || 768;
21
+ }
22
+ async embed(text) {
23
+ try {
24
+ const response = await fetch(`${this.baseUrl}/api/embeddings`, {
25
+ method: 'POST',
26
+ headers: { 'Content-Type': 'application/json' },
27
+ body: JSON.stringify({ model: this.options.model, prompt: text }),
28
+ });
29
+ if (!response.ok) {
30
+ throw new errors_js_1.EmbeddingError(`Ollama embedding failed: ${response.statusText}`, response.status);
31
+ }
32
+ const data = await response.json();
33
+ return data.embedding;
34
+ }
35
+ catch (error) {
36
+ if (error instanceof errors_js_1.EmbeddingError) {
37
+ throw error;
38
+ }
39
+ throw new errors_js_1.EmbeddingError(`Ollama embedding failed: ${error.message}`);
40
+ }
41
+ }
42
+ async embedBatch(texts) {
43
+ const embeddings = [];
44
+ for (const text of texts) {
45
+ embeddings.push(await this.embed(text));
46
+ }
47
+ return embeddings;
48
+ }
49
+ }
50
+ exports.OllamaEmbedder = OllamaEmbedder;
51
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/embedders/ollama.ts"],"names":[],"mappings":";;;AACA,4CAA8C;AAO9C,MAAa,cAAc;IAIL;IAHX,UAAU,CAAS;IACpB,OAAO,CAAS;IAExB,YAAoB,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,wBAAwB,CAAC;QAC3D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAEO,kBAAkB,CAAC,KAAa;QACtC,MAAM,aAAa,GAA2B;YAC5C,kBAAkB,EAAE,GAAG;YACvB,mBAAmB,EAAE,IAAI;YACzB,YAAY,EAAE,GAAG;SAClB,CAAC;QACF,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,iBAAiB,EAAE;gBAC7D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;aAClE,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,0BAAc,CAAC,4BAA4B,QAAQ,CAAC,UAAU,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC/F,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA6B,CAAC;YAC9D,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,0BAAc,EAAE,CAAC;gBACpC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,IAAI,0BAAc,CAAC,4BAA6B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,MAAM,UAAU,GAAe,EAAE,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;CACF;AA/CD,wCA+CC"}
@@ -0,0 +1,18 @@
1
+ import { Embedder } from '../interfaces.js';
2
+ export interface OpenAIEmbedderOptions {
3
+ model: string;
4
+ apiKey: string;
5
+ retries?: number;
6
+ retryDelay?: number;
7
+ timeout?: number;
8
+ }
9
+ export declare class OpenAIEmbedder implements Embedder {
10
+ private options;
11
+ readonly dimensions: number;
12
+ private client;
13
+ constructor(options: OpenAIEmbedderOptions);
14
+ private getModelDimensions;
15
+ embed(text: string): Promise<number[]>;
16
+ embedBatch(texts: string[]): Promise<number[][]>;
17
+ }
18
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/embedders/openai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,YAAW,QAAQ;IAIjC,OAAO,CAAC,OAAO;IAH3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEH,OAAO,EAAE,qBAAqB;IAQlD,OAAO,CAAC,kBAAkB;IASpB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsBtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAWvD"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenAIEmbedder = void 0;
7
+ const openai_1 = __importDefault(require("openai"));
8
+ const errors_js_1 = require("../errors.js");
9
+ class OpenAIEmbedder {
10
+ options;
11
+ dimensions;
12
+ client;
13
+ constructor(options) {
14
+ this.options = options;
15
+ this.client = new openai_1.default({
16
+ apiKey: options.apiKey,
17
+ timeout: options.timeout || 30000,
18
+ });
19
+ this.dimensions = this.getModelDimensions(options.model);
20
+ }
21
+ getModelDimensions(model) {
22
+ const dimensionsMap = {
23
+ 'text-embedding-3-small': 1536,
24
+ 'text-embedding-3-large': 3072,
25
+ 'text-embedding-ada-002': 1536,
26
+ };
27
+ return dimensionsMap[model] || 1536;
28
+ }
29
+ async embed(text) {
30
+ let lastError = null;
31
+ const retries = this.options.retries || 3;
32
+ for (let attempt = 0; attempt < retries; attempt++) {
33
+ try {
34
+ const response = await this.client.embeddings.create({
35
+ model: this.options.model,
36
+ input: text,
37
+ });
38
+ return response.data[0].embedding;
39
+ }
40
+ catch (error) {
41
+ lastError = error;
42
+ if (attempt < retries - 1) {
43
+ await new Promise(resolve => setTimeout(resolve, this.options.retryDelay || 1000));
44
+ }
45
+ }
46
+ }
47
+ throw new errors_js_1.EmbeddingError(`OpenAI embedding failed after ${retries} retries: ${lastError?.message}`);
48
+ }
49
+ async embedBatch(texts) {
50
+ try {
51
+ const response = await this.client.embeddings.create({
52
+ model: this.options.model,
53
+ input: texts,
54
+ });
55
+ return response.data.map(d => d.embedding);
56
+ }
57
+ catch (error) {
58
+ throw new errors_js_1.EmbeddingError(`OpenAI batch embedding failed: ${error.message}`);
59
+ }
60
+ }
61
+ }
62
+ exports.OpenAIEmbedder = OpenAIEmbedder;
63
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/embedders/openai.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAE5B,4CAA8C;AAU9C,MAAa,cAAc;IAIL;IAHX,UAAU,CAAS;IACpB,MAAM,CAAS;IAEvB,YAAoB,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;QAChD,IAAI,CAAC,MAAM,GAAG,IAAI,gBAAM,CAAC;YACvB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IAEO,kBAAkB,CAAC,KAAa;QACtC,MAAM,aAAa,GAA2B;YAC5C,wBAAwB,EAAE,IAAI;YAC9B,wBAAwB,EAAE,IAAI;YAC9B,wBAAwB,EAAE,IAAI;SAC/B,CAAC;QACF,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,IAAI,SAAS,GAAiB,IAAI,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;QAE1C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;YACnD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;oBACnD,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;oBACzB,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;gBACH,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAc,CAAC;gBAC3B,IAAI,OAAO,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC;gBACrF,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,0BAAc,CAAC,iCAAiC,OAAO,aAAa,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IACtG,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;gBACnD,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;gBACzB,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,0BAAc,CAAC,kCAAmC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;CACF;AAtDD,wCAsDC"}
@@ -0,0 +1,25 @@
1
+ export declare class KnowledgeError extends Error {
2
+ readonly code?: string | undefined;
3
+ constructor(message: string, code?: string | undefined);
4
+ }
5
+ export declare class EmbeddingError extends KnowledgeError {
6
+ readonly statusCode?: number | undefined;
7
+ constructor(message: string, statusCode?: number | undefined);
8
+ }
9
+ export declare class IngestionError extends KnowledgeError {
10
+ readonly file?: string | undefined;
11
+ constructor(message: string, file?: string | undefined);
12
+ }
13
+ export declare class ChunkTooLargeError extends KnowledgeError {
14
+ readonly chunkSize: number;
15
+ constructor(message: string, chunkSize: number);
16
+ }
17
+ export declare class DimensionMismatchError extends KnowledgeError {
18
+ readonly expected: number;
19
+ readonly actual: number;
20
+ constructor(expected: number, actual: number);
21
+ }
22
+ export declare class KnowledgeProviderError extends KnowledgeError {
23
+ constructor(message: string);
24
+ }
25
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;aACM,IAAI,CAAC,EAAE,MAAM;gBAA9C,OAAO,EAAE,MAAM,EAAkB,IAAI,CAAC,EAAE,MAAM,YAAA;CAI3D;AAED,qBAAa,cAAe,SAAQ,cAAc;aACH,UAAU,CAAC,EAAE,MAAM;gBAApD,OAAO,EAAE,MAAM,EAAkB,UAAU,CAAC,EAAE,MAAM,YAAA;CAIjE;AAED,qBAAa,cAAe,SAAQ,cAAc;aACH,IAAI,CAAC,EAAE,MAAM;gBAA9C,OAAO,EAAE,MAAM,EAAkB,IAAI,CAAC,EAAE,MAAM,YAAA;CAI3D;AAED,qBAAa,kBAAmB,SAAQ,cAAc;aACP,SAAS,EAAE,MAAM;gBAAlD,OAAO,EAAE,MAAM,EAAkB,SAAS,EAAE,MAAM;CAI/D;AAED,qBAAa,sBAAuB,SAAQ,cAAc;IACxD,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAEnB,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAS7C;AAED,qBAAa,sBAAuB,SAAQ,cAAc;gBAC5C,OAAO,EAAE,MAAM;CAI5B"}
package/dist/errors.js ADDED
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KnowledgeProviderError = exports.DimensionMismatchError = exports.ChunkTooLargeError = exports.IngestionError = exports.EmbeddingError = exports.KnowledgeError = void 0;
4
+ class KnowledgeError extends Error {
5
+ code;
6
+ constructor(message, code) {
7
+ super(message);
8
+ this.code = code;
9
+ this.name = 'KnowledgeError';
10
+ }
11
+ }
12
+ exports.KnowledgeError = KnowledgeError;
13
+ class EmbeddingError extends KnowledgeError {
14
+ statusCode;
15
+ constructor(message, statusCode) {
16
+ super(message, 'EMBEDDING_ERROR');
17
+ this.statusCode = statusCode;
18
+ this.name = 'EmbeddingError';
19
+ }
20
+ }
21
+ exports.EmbeddingError = EmbeddingError;
22
+ class IngestionError extends KnowledgeError {
23
+ file;
24
+ constructor(message, file) {
25
+ super(message, 'INGESTION_ERROR');
26
+ this.file = file;
27
+ this.name = 'IngestionError';
28
+ }
29
+ }
30
+ exports.IngestionError = IngestionError;
31
+ class ChunkTooLargeError extends KnowledgeError {
32
+ chunkSize;
33
+ constructor(message, chunkSize) {
34
+ super(message, 'CHUNK_TOO_LARGE');
35
+ this.chunkSize = chunkSize;
36
+ this.name = 'ChunkTooLargeError';
37
+ }
38
+ }
39
+ exports.ChunkTooLargeError = ChunkTooLargeError;
40
+ class DimensionMismatchError extends KnowledgeError {
41
+ expected;
42
+ actual;
43
+ constructor(expected, actual) {
44
+ super(`Dimension mismatch: expected ${expected}, got ${actual}`, 'DIMENSION_MISMATCH');
45
+ this.name = 'DimensionMismatchError';
46
+ this.expected = expected;
47
+ this.actual = actual;
48
+ }
49
+ }
50
+ exports.DimensionMismatchError = DimensionMismatchError;
51
+ class KnowledgeProviderError extends KnowledgeError {
52
+ constructor(message) {
53
+ super(message, 'PROVIDER_ERROR');
54
+ this.name = 'KnowledgeProviderError';
55
+ }
56
+ }
57
+ exports.KnowledgeProviderError = KnowledgeProviderError;
58
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,cAAe,SAAQ,KAAK;IACM;IAA7C,YAAY,OAAe,EAAkB,IAAa;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,SAAI,GAAJ,IAAI,CAAS;QAExD,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AALD,wCAKC;AAED,MAAa,cAAe,SAAQ,cAAc;IACH;IAA7C,YAAY,OAAe,EAAkB,UAAmB;QAC9D,KAAK,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QADS,eAAU,GAAV,UAAU,CAAS;QAE9D,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AALD,wCAKC;AAED,MAAa,cAAe,SAAQ,cAAc;IACH;IAA7C,YAAY,OAAe,EAAkB,IAAa;QACxD,KAAK,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QADS,SAAI,GAAJ,IAAI,CAAS;QAExD,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AALD,wCAKC;AAED,MAAa,kBAAmB,SAAQ,cAAc;IACP;IAA7C,YAAY,OAAe,EAAkB,SAAiB;QAC5D,KAAK,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QADS,cAAS,GAAT,SAAS,CAAQ;QAE5D,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC;AAED,MAAa,sBAAuB,SAAQ,cAAc;IACxC,QAAQ,CAAS;IACjB,MAAM,CAAS;IAE/B,YAAY,QAAgB,EAAE,MAAc;QAC1C,KAAK,CACH,gCAAgC,QAAQ,SAAS,MAAM,EAAE,EACzD,oBAAoB,CACrB,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAbD,wDAaC;AAED,MAAa,sBAAuB,SAAQ,cAAc;IACxD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AALD,wDAKC"}
@@ -0,0 +1,14 @@
1
+ export * from './interfaces.js';
2
+ export * from './errors.js';
3
+ export * from './knowledge.js';
4
+ export { MemoryProvider } from './providers/memory.js';
5
+ export type { MemoryProviderOptions } from './providers/memory.js';
6
+ export { PersistentKnowledgeProvider } from './providers/persistent.js';
7
+ export type { PersistentKnowledgeProviderOptions } from './providers/persistent.js';
8
+ export { MarkdownSource } from './sources/markdown.js';
9
+ export type { MarkdownSourceOptions } from './sources/markdown.js';
10
+ export { OllamaEmbedder } from './embedders/ollama.js';
11
+ export type { OllamaEmbedderOptions } from './embedders/ollama.js';
12
+ export { OpenAIEmbedder } from './embedders/openai.js';
13
+ export type { OpenAIEmbedderOptions } from './embedders/openai.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAE/B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,YAAY,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAC;AAEpF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,31 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.OpenAIEmbedder = exports.OllamaEmbedder = exports.MarkdownSource = exports.PersistentKnowledgeProvider = exports.MemoryProvider = void 0;
18
+ __exportStar(require("./interfaces.js"), exports);
19
+ __exportStar(require("./errors.js"), exports);
20
+ __exportStar(require("./knowledge.js"), exports);
21
+ var memory_js_1 = require("./providers/memory.js");
22
+ Object.defineProperty(exports, "MemoryProvider", { enumerable: true, get: function () { return memory_js_1.MemoryProvider; } });
23
+ var persistent_js_1 = require("./providers/persistent.js");
24
+ Object.defineProperty(exports, "PersistentKnowledgeProvider", { enumerable: true, get: function () { return persistent_js_1.PersistentKnowledgeProvider; } });
25
+ var markdown_js_1 = require("./sources/markdown.js");
26
+ Object.defineProperty(exports, "MarkdownSource", { enumerable: true, get: function () { return markdown_js_1.MarkdownSource; } });
27
+ var ollama_js_1 = require("./embedders/ollama.js");
28
+ Object.defineProperty(exports, "OllamaEmbedder", { enumerable: true, get: function () { return ollama_js_1.OllamaEmbedder; } });
29
+ var openai_js_1 = require("./embedders/openai.js");
30
+ Object.defineProperty(exports, "OpenAIEmbedder", { enumerable: true, get: function () { return openai_js_1.OpenAIEmbedder; } });
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,8CAA4B;AAC5B,iDAA+B;AAE/B,mDAAuD;AAA9C,2GAAA,cAAc,OAAA;AAGvB,2DAAwE;AAA/D,4HAAA,2BAA2B,OAAA;AAGpC,qDAAuD;AAA9C,6GAAA,cAAc,OAAA;AAGvB,mDAAuD;AAA9C,2GAAA,cAAc,OAAA;AAGvB,mDAAuD;AAA9C,2GAAA,cAAc,OAAA"}
@@ -0,0 +1,48 @@
1
+ export interface Chunk {
2
+ id: string;
3
+ content: string;
4
+ metadata: Record<string, unknown>;
5
+ vector?: number[];
6
+ }
7
+ export interface ChunkUpdate {
8
+ type: 'add' | 'update' | 'delete';
9
+ chunk: Chunk;
10
+ }
11
+ export interface QueryOptions {
12
+ limit?: number;
13
+ threshold?: number;
14
+ filter?: MetadataFilter;
15
+ includeMetadata?: boolean;
16
+ includeVectors?: boolean;
17
+ }
18
+ export interface MetadataFilter {
19
+ [key: string]: string | number | boolean | {
20
+ $in: unknown[];
21
+ } | {
22
+ $gt: number;
23
+ } | {
24
+ $lt: number;
25
+ };
26
+ }
27
+ export interface QueryResult {
28
+ chunk: Chunk;
29
+ score: number;
30
+ distance?: number;
31
+ }
32
+ export interface KnowledgeProvider {
33
+ add(chunks: Chunk[]): Promise<void>;
34
+ query(queryVector: number[], options?: QueryOptions): Promise<QueryResult[]>;
35
+ delete(ids: string[]): Promise<void>;
36
+ clear(): Promise<void>;
37
+ validateDimensions(dimensions: number): Promise<void>;
38
+ }
39
+ export interface KnowledgeSource {
40
+ load(): AsyncIterable<Chunk>;
41
+ watch?(): AsyncIterable<ChunkUpdate>;
42
+ }
43
+ export interface Embedder {
44
+ embed(text: string): Promise<number[]>;
45
+ embedBatch(texts: string[]): Promise<number[][]>;
46
+ readonly dimensions: number;
47
+ }
48
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClC,KAAK,EAAE,KAAK,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GACpC;QAAE,GAAG,EAAE,OAAO,EAAE,CAAA;KAAE,GAClB;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GACf;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":""}