cognitive-core 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +302 -116
- package/SKILL.md +193 -0
- package/dist/agents/index.d.ts +3 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +5 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/mock-provider.d.ts +23 -0
- package/dist/agents/mock-provider.d.ts.map +1 -0
- package/dist/agents/mock-provider.js +71 -0
- package/dist/agents/mock-provider.js.map +1 -0
- package/dist/agents/types.d.ts +98 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +44 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/atlas.d.ts +196 -0
- package/dist/atlas.d.ts.map +1 -0
- package/dist/atlas.js +373 -0
- package/dist/atlas.js.map +1 -0
- package/dist/bin/cognitive-core.d.ts +18 -0
- package/dist/bin/cognitive-core.d.ts.map +1 -0
- package/dist/bin/cognitive-core.js +419 -0
- package/dist/bin/cognitive-core.js.map +1 -0
- package/dist/embeddings/bm25.d.ts +104 -0
- package/dist/embeddings/bm25.d.ts.map +1 -0
- package/dist/embeddings/bm25.js +264 -0
- package/dist/embeddings/bm25.js.map +1 -0
- package/dist/embeddings/index.d.ts +12 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +16 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/manager.d.ts +112 -0
- package/dist/embeddings/manager.d.ts.map +1 -0
- package/dist/embeddings/manager.js +215 -0
- package/dist/embeddings/manager.js.map +1 -0
- package/dist/embeddings/provider.d.ts +101 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +232 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/embeddings/vector-store.d.ts +101 -0
- package/dist/embeddings/vector-store.d.ts.map +1 -0
- package/dist/embeddings/vector-store.js +256 -0
- package/dist/embeddings/vector-store.js.map +1 -0
- package/dist/factory.d.ts +193 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +109 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +30 -453
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -509
- package/dist/index.js.map +1 -0
- package/dist/learning/analyzer.d.ts +110 -0
- package/dist/learning/analyzer.d.ts.map +1 -0
- package/dist/learning/analyzer.js +213 -0
- package/dist/learning/analyzer.js.map +1 -0
- package/dist/learning/effectiveness.d.ts +158 -0
- package/dist/learning/effectiveness.d.ts.map +1 -0
- package/dist/learning/effectiveness.js +251 -0
- package/dist/learning/effectiveness.js.map +1 -0
- package/dist/learning/index.d.ts +8 -0
- package/dist/learning/index.d.ts.map +1 -0
- package/dist/learning/index.js +11 -0
- package/dist/learning/index.js.map +1 -0
- package/dist/learning/llm-extractor.d.ts +88 -0
- package/dist/learning/llm-extractor.d.ts.map +1 -0
- package/dist/learning/llm-extractor.js +372 -0
- package/dist/learning/llm-extractor.js.map +1 -0
- package/dist/learning/meta-learner.d.ts +80 -0
- package/dist/learning/meta-learner.d.ts.map +1 -0
- package/dist/learning/meta-learner.js +355 -0
- package/dist/learning/meta-learner.js.map +1 -0
- package/dist/learning/pipeline.d.ts +65 -0
- package/dist/learning/pipeline.d.ts.map +1 -0
- package/dist/learning/pipeline.js +170 -0
- package/dist/learning/pipeline.js.map +1 -0
- package/dist/learning/playbook-extractor.d.ts +113 -0
- package/dist/learning/playbook-extractor.d.ts.map +1 -0
- package/dist/learning/playbook-extractor.js +523 -0
- package/dist/learning/playbook-extractor.js.map +1 -0
- package/dist/learning/usage-inference.d.ts +82 -0
- package/dist/learning/usage-inference.d.ts.map +1 -0
- package/dist/learning/usage-inference.js +261 -0
- package/dist/learning/usage-inference.js.map +1 -0
- package/dist/mcp/index.d.ts +6 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +6 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/playbook-server.d.ts +120 -0
- package/dist/mcp/playbook-server.d.ts.map +1 -0
- package/dist/mcp/playbook-server.js +427 -0
- package/dist/mcp/playbook-server.js.map +1 -0
- package/dist/memory/curated-loader.d.ts +62 -0
- package/dist/memory/curated-loader.d.ts.map +1 -0
- package/dist/memory/curated-loader.js +106 -0
- package/dist/memory/curated-loader.js.map +1 -0
- package/dist/memory/experience.d.ts +122 -0
- package/dist/memory/experience.d.ts.map +1 -0
- package/dist/memory/experience.js +392 -0
- package/dist/memory/experience.js.map +1 -0
- package/dist/memory/index.d.ts +6 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +9 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/meta.d.ts +90 -0
- package/dist/memory/meta.d.ts.map +1 -0
- package/dist/memory/meta.js +362 -0
- package/dist/memory/meta.js.map +1 -0
- package/dist/memory/playbook.d.ts +133 -0
- package/dist/memory/playbook.d.ts.map +1 -0
- package/dist/memory/playbook.js +357 -0
- package/dist/memory/playbook.js.map +1 -0
- package/dist/memory/system.d.ts +167 -0
- package/dist/memory/system.d.ts.map +1 -0
- package/dist/memory/system.js +383 -0
- package/dist/memory/system.js.map +1 -0
- package/dist/runtime/backends/acp.d.ts +67 -0
- package/dist/runtime/backends/acp.d.ts.map +1 -0
- package/dist/runtime/backends/acp.js +290 -0
- package/dist/runtime/backends/acp.js.map +1 -0
- package/dist/runtime/backends/index.d.ts +5 -0
- package/dist/runtime/backends/index.d.ts.map +1 -0
- package/dist/runtime/backends/index.js +6 -0
- package/dist/runtime/backends/index.js.map +1 -0
- package/dist/runtime/backends/mock.d.ts +67 -0
- package/dist/runtime/backends/mock.d.ts.map +1 -0
- package/dist/runtime/backends/mock.js +153 -0
- package/dist/runtime/backends/mock.js.map +1 -0
- package/dist/runtime/backends/subprocess.d.ts +56 -0
- package/dist/runtime/backends/subprocess.d.ts.map +1 -0
- package/dist/runtime/backends/subprocess.js +260 -0
- package/dist/runtime/backends/subprocess.js.map +1 -0
- package/dist/runtime/flows/learning.d.ts +73 -0
- package/dist/runtime/flows/learning.d.ts.map +1 -0
- package/dist/runtime/flows/learning.js +116 -0
- package/dist/runtime/flows/learning.js.map +1 -0
- package/dist/runtime/flows/validation.d.ts +122 -0
- package/dist/runtime/flows/validation.d.ts.map +1 -0
- package/dist/runtime/flows/validation.js +223 -0
- package/dist/runtime/flows/validation.js.map +1 -0
- package/dist/runtime/index.d.ts +6 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +8 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/manager.d.ts +116 -0
- package/dist/runtime/manager.d.ts.map +1 -0
- package/dist/runtime/manager.js +416 -0
- package/dist/runtime/manager.js.map +1 -0
- package/dist/runtime/types.d.ts +138 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/search/evaluator.d.ts +102 -0
- package/dist/search/evaluator.d.ts.map +1 -0
- package/dist/search/evaluator.js +352 -0
- package/dist/search/evaluator.js.map +1 -0
- package/dist/search/index.d.ts +7 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +11 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/refinement-loop.d.ts +73 -0
- package/dist/search/refinement-loop.d.ts.map +1 -0
- package/dist/search/refinement-loop.js +245 -0
- package/dist/search/refinement-loop.js.map +1 -0
- package/dist/search/refinement-types.d.ts +154 -0
- package/dist/search/refinement-types.d.ts.map +1 -0
- package/dist/search/refinement-types.js +99 -0
- package/dist/search/refinement-types.js.map +1 -0
- package/dist/search/router.d.ts +61 -0
- package/dist/search/router.d.ts.map +1 -0
- package/dist/search/router.js +197 -0
- package/dist/search/router.js.map +1 -0
- package/dist/search/solver.d.ts +75 -0
- package/dist/search/solver.d.ts.map +1 -0
- package/dist/search/solver.js +216 -0
- package/dist/search/solver.js.map +1 -0
- package/dist/search/verification-runner.d.ts +125 -0
- package/dist/search/verification-runner.d.ts.map +1 -0
- package/dist/search/verification-runner.js +440 -0
- package/dist/search/verification-runner.js.map +1 -0
- package/dist/surfacing/index.d.ts +2 -0
- package/dist/surfacing/index.d.ts.map +1 -0
- package/dist/surfacing/index.js +2 -0
- package/dist/surfacing/index.js.map +1 -0
- package/dist/surfacing/skill-library.d.ts +158 -0
- package/dist/surfacing/skill-library.d.ts.map +1 -0
- package/dist/surfacing/skill-library.js +429 -0
- package/dist/surfacing/skill-library.js.map +1 -0
- package/dist/types/config.d.ts +1113 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +274 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +14 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/memory.d.ts +339 -0
- package/dist/types/memory.d.ts.map +1 -0
- package/dist/types/memory.js +207 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/types/meta.d.ts +146 -0
- package/dist/types/meta.d.ts.map +1 -0
- package/dist/types/meta.js +51 -0
- package/dist/types/meta.js.map +1 -0
- package/dist/types/outcome.d.ts +42 -0
- package/dist/types/outcome.d.ts.map +1 -0
- package/dist/types/outcome.js +50 -0
- package/dist/types/outcome.js.map +1 -0
- package/dist/types/playbook.d.ts +119 -0
- package/dist/types/playbook.d.ts.map +1 -0
- package/dist/types/playbook.js +71 -0
- package/dist/types/playbook.js.map +1 -0
- package/dist/types/step.d.ts +44 -0
- package/dist/types/step.d.ts.map +1 -0
- package/dist/types/step.js +32 -0
- package/dist/types/step.js.map +1 -0
- package/dist/types/task.d.ts +91 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +39 -0
- package/dist/types/task.js.map +1 -0
- package/dist/types/trajectory.d.ts +221 -0
- package/dist/types/trajectory.d.ts.map +1 -0
- package/dist/types/trajectory.js +60 -0
- package/dist/types/trajectory.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/similarity.d.ts +31 -0
- package/dist/utils/similarity.d.ts.map +1 -0
- package/dist/utils/similarity.js +107 -0
- package/dist/utils/similarity.js.map +1 -0
- package/dist/utils/storage.d.ts +106 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +203 -0
- package/dist/utils/storage.js.map +1 -0
- package/dist/utils/validation.d.ts +129 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +171 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +50 -34
- package/scripts/migrate-to-playbooks.ts +307 -0
- package/src/agents/index.ts +14 -0
- package/src/agents/mock-provider.ts +93 -0
- package/src/agents/types.ts +137 -0
- package/src/atlas.ts +560 -0
- package/src/bin/cognitive-core.ts +470 -0
- package/src/embeddings/bm25.ts +337 -0
- package/src/embeddings/index.ts +39 -0
- package/src/embeddings/manager.ts +288 -0
- package/src/embeddings/provider.ts +311 -0
- package/src/embeddings/vector-store.ts +353 -0
- package/src/factory.ts +263 -0
- package/src/index.ts +246 -0
- package/src/learning/analyzer.ts +335 -0
- package/src/learning/effectiveness.ts +428 -0
- package/src/learning/index.ts +58 -0
- package/src/learning/llm-extractor.ts +542 -0
- package/src/learning/meta-learner.ts +516 -0
- package/src/learning/pipeline.ts +244 -0
- package/src/learning/playbook-extractor.ts +702 -0
- package/src/learning/usage-inference.ts +372 -0
- package/src/mcp/index.ts +12 -0
- package/src/mcp/playbook-server.ts +565 -0
- package/src/memory/curated-loader.ts +160 -0
- package/src/memory/experience.ts +515 -0
- package/src/memory/index.ts +27 -0
- package/src/memory/meta.ts +506 -0
- package/src/memory/playbook.ts +493 -0
- package/src/memory/system.ts +551 -0
- package/src/runtime/backends/acp.ts +378 -0
- package/src/runtime/backends/index.ts +24 -0
- package/src/runtime/backends/mock.ts +218 -0
- package/src/runtime/backends/subprocess.ts +356 -0
- package/src/runtime/flows/learning.ts +183 -0
- package/src/runtime/flows/validation.ts +381 -0
- package/src/runtime/index.ts +53 -0
- package/src/runtime/manager.ts +541 -0
- package/src/runtime/types.ts +157 -0
- package/src/search/evaluator.ts +474 -0
- package/src/search/index.ts +59 -0
- package/src/search/refinement-loop.ts +363 -0
- package/src/search/refinement-types.ts +159 -0
- package/src/search/router.ts +261 -0
- package/src/search/solver.ts +303 -0
- package/src/search/verification-runner.ts +570 -0
- package/src/surfacing/index.ts +6 -0
- package/src/surfacing/skill-library.ts +594 -0
- package/src/types/config.ts +333 -0
- package/src/types/index.ts +130 -0
- package/src/types/memory.ts +270 -0
- package/src/types/meta.ts +218 -0
- package/src/types/outcome.ts +66 -0
- package/src/types/playbook.ts +196 -0
- package/src/types/step.ts +40 -0
- package/src/types/task.ts +52 -0
- package/src/types/trajectory.ts +80 -0
- package/src/utils/index.ts +38 -0
- package/src/utils/similarity.ts +139 -0
- package/src/utils/storage.ts +249 -0
- package/src/utils/validation.ts +286 -0
- package/tests/embeddings/bm25.test.ts +130 -0
- package/tests/embeddings/manager.test.ts +205 -0
- package/tests/integration/atlas.test.ts +266 -0
- package/tests/integration/e2e.test.ts +929 -0
- package/tests/learning/analyzer.test.ts +426 -0
- package/tests/learning/effectiveness.test.ts +542 -0
- package/tests/learning/pipeline.test.ts +176 -0
- package/tests/learning/playbook-extractor-provenance.test.ts +114 -0
- package/tests/learning/usage-inference.test.ts +254 -0
- package/tests/mcp/playbook-server.test.ts +252 -0
- package/tests/memory/experience.test.ts +198 -0
- package/tests/memory/playbook.test.ts +338 -0
- package/tests/memory/provenance.test.ts +639 -0
- package/tests/memory/system.test.ts +325 -0
- package/tests/runtime/agent-manager.test.ts +512 -0
- package/tests/runtime/mock-backend.test.ts +248 -0
- package/tests/search/refinement-loop.test.ts +468 -0
- package/tests/search/refinement.test.ts +267 -0
- package/tests/search/router.test.ts +427 -0
- package/tests/surfacing/skill-library.test.ts +292 -0
- package/tests/types/outcome.test.ts +147 -0
- package/tests/types/step.test.ts +133 -0
- package/tests/types/task.test.ts +158 -0
- package/tests/types/trajectory.test.ts +253 -0
- package/tests/utils/similarity.test.ts +188 -0
- package/tests/utils/validation.test.ts +252 -0
- package/tsconfig.json +25 -0
- package/vitest.config.ts +22 -0
- package/dist/index.d.mts +0 -466
- package/dist/index.mjs +0 -478
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BM25 Index
|
|
3
|
+
*
|
|
4
|
+
* A text-based similarity search index using BM25 (Best Match 25) algorithm.
|
|
5
|
+
* Used as a fallback when no embedding provider is configured.
|
|
6
|
+
*
|
|
7
|
+
* BM25 is a ranking function used in information retrieval that considers
|
|
8
|
+
* term frequency, document length, and inverse document frequency.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* BM25 text similarity search index
|
|
12
|
+
*/
|
|
13
|
+
export class BM25Index {
|
|
14
|
+
documents;
|
|
15
|
+
idf;
|
|
16
|
+
avgDocLength;
|
|
17
|
+
k1;
|
|
18
|
+
b;
|
|
19
|
+
dirty;
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.documents = new Map();
|
|
22
|
+
this.idf = new Map();
|
|
23
|
+
this.avgDocLength = 0;
|
|
24
|
+
// k1 controls term frequency saturation (typical: 1.2-2.0)
|
|
25
|
+
this.k1 = options?.k1 ?? 1.5;
|
|
26
|
+
// b controls document length normalization (typical: 0.75)
|
|
27
|
+
this.b = options?.b ?? 0.75;
|
|
28
|
+
this.dirty = false;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Add a document to the index
|
|
32
|
+
*/
|
|
33
|
+
add(id, content, type) {
|
|
34
|
+
const tokens = this.tokenize(content);
|
|
35
|
+
this.documents.set(id, { id, tokens, type, content });
|
|
36
|
+
this.dirty = true;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Remove a document from the index
|
|
40
|
+
*/
|
|
41
|
+
remove(id) {
|
|
42
|
+
const removed = this.documents.delete(id);
|
|
43
|
+
if (removed) {
|
|
44
|
+
this.dirty = true;
|
|
45
|
+
}
|
|
46
|
+
return removed;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check if a document exists
|
|
50
|
+
*/
|
|
51
|
+
has(id) {
|
|
52
|
+
return this.documents.has(id);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get document count
|
|
56
|
+
*/
|
|
57
|
+
get size() {
|
|
58
|
+
return this.documents.size;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Search for similar documents
|
|
62
|
+
*/
|
|
63
|
+
search(query, options = {}) {
|
|
64
|
+
// Rebuild IDF if needed
|
|
65
|
+
if (this.dirty) {
|
|
66
|
+
this.rebuildIdf();
|
|
67
|
+
}
|
|
68
|
+
const queryTokens = this.tokenize(query);
|
|
69
|
+
// Return empty for empty query
|
|
70
|
+
if (queryTokens.length === 0) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const results = [];
|
|
74
|
+
for (const doc of this.documents.values()) {
|
|
75
|
+
// Skip if type filter doesn't match
|
|
76
|
+
if (options.type && doc.type !== options.type)
|
|
77
|
+
continue;
|
|
78
|
+
const score = this.computeScore(queryTokens, doc.tokens);
|
|
79
|
+
// Normalize score to 0-1 range (approximate)
|
|
80
|
+
const normalizedScore = this.normalizeScore(score, queryTokens.length);
|
|
81
|
+
if (normalizedScore >= (options.threshold ?? 0)) {
|
|
82
|
+
results.push({
|
|
83
|
+
id: doc.id,
|
|
84
|
+
score: normalizedScore,
|
|
85
|
+
content: doc.content,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return results.sort((a, b) => b.score - a.score).slice(0, options.k ?? 10);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Tokenize text for indexing and search
|
|
93
|
+
*/
|
|
94
|
+
tokenize(text) {
|
|
95
|
+
return text
|
|
96
|
+
.toLowerCase()
|
|
97
|
+
.replace(/[^\w\s]/g, ' ')
|
|
98
|
+
.split(/\s+/)
|
|
99
|
+
.filter((t) => t.length > 1)
|
|
100
|
+
.filter((t) => !STOP_WORDS.has(t));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Rebuild IDF values for all terms
|
|
104
|
+
*/
|
|
105
|
+
rebuildIdf() {
|
|
106
|
+
this.idf.clear();
|
|
107
|
+
const N = this.documents.size;
|
|
108
|
+
if (N === 0) {
|
|
109
|
+
this.avgDocLength = 0;
|
|
110
|
+
this.dirty = false;
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const termDocCounts = new Map();
|
|
114
|
+
let totalLength = 0;
|
|
115
|
+
for (const doc of this.documents.values()) {
|
|
116
|
+
totalLength += doc.tokens.length;
|
|
117
|
+
const uniqueTerms = new Set(doc.tokens);
|
|
118
|
+
for (const term of uniqueTerms) {
|
|
119
|
+
termDocCounts.set(term, (termDocCounts.get(term) ?? 0) + 1);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
this.avgDocLength = totalLength / N;
|
|
123
|
+
// Calculate IDF for each term
|
|
124
|
+
for (const [term, df] of termDocCounts) {
|
|
125
|
+
// IDF formula: log((N - df + 0.5) / (df + 0.5) + 1)
|
|
126
|
+
this.idf.set(term, Math.log((N - df + 0.5) / (df + 0.5) + 1));
|
|
127
|
+
}
|
|
128
|
+
this.dirty = false;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Compute BM25 score for a document
|
|
132
|
+
*/
|
|
133
|
+
computeScore(queryTokens, docTokens) {
|
|
134
|
+
const docLength = docTokens.length;
|
|
135
|
+
// Build term frequency map for document
|
|
136
|
+
const termFreq = new Map();
|
|
137
|
+
for (const token of docTokens) {
|
|
138
|
+
termFreq.set(token, (termFreq.get(token) ?? 0) + 1);
|
|
139
|
+
}
|
|
140
|
+
let score = 0;
|
|
141
|
+
for (const term of queryTokens) {
|
|
142
|
+
const tf = termFreq.get(term) ?? 0;
|
|
143
|
+
const idf = this.idf.get(term) ?? 0;
|
|
144
|
+
if (tf === 0 || idf === 0)
|
|
145
|
+
continue;
|
|
146
|
+
// BM25 formula
|
|
147
|
+
const numerator = tf * (this.k1 + 1);
|
|
148
|
+
const denominator = tf +
|
|
149
|
+
this.k1 * (1 - this.b + this.b * (docLength / this.avgDocLength));
|
|
150
|
+
score += idf * (numerator / denominator);
|
|
151
|
+
}
|
|
152
|
+
return score;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Normalize BM25 score to approximately 0-1 range
|
|
156
|
+
* This is an approximation since BM25 scores are unbounded
|
|
157
|
+
*/
|
|
158
|
+
normalizeScore(score, queryLength) {
|
|
159
|
+
if (score <= 0 || queryLength === 0)
|
|
160
|
+
return 0;
|
|
161
|
+
// Approximate maximum possible score per term
|
|
162
|
+
// Assuming perfect TF and high IDF
|
|
163
|
+
const maxScorePerTerm = 2.5; // Typical upper bound
|
|
164
|
+
const maxPossibleScore = queryLength * maxScorePerTerm;
|
|
165
|
+
// Sigmoid-like normalization
|
|
166
|
+
const normalized = score / (score + maxPossibleScore * 0.5);
|
|
167
|
+
return Math.min(1, Math.max(0, normalized));
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Serialize index to JSON (for persistence)
|
|
171
|
+
*/
|
|
172
|
+
toJSON() {
|
|
173
|
+
return {
|
|
174
|
+
documents: Array.from(this.documents.values()),
|
|
175
|
+
k1: this.k1,
|
|
176
|
+
b: this.b,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Restore index from JSON
|
|
181
|
+
*/
|
|
182
|
+
static fromJSON(data) {
|
|
183
|
+
const index = new BM25Index({ k1: data.k1, b: data.b });
|
|
184
|
+
for (const doc of data.documents) {
|
|
185
|
+
index.documents.set(doc.id, doc);
|
|
186
|
+
}
|
|
187
|
+
index.dirty = true;
|
|
188
|
+
return index;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Common English stop words to filter out
|
|
193
|
+
*/
|
|
194
|
+
const STOP_WORDS = new Set([
|
|
195
|
+
'a',
|
|
196
|
+
'an',
|
|
197
|
+
'and',
|
|
198
|
+
'are',
|
|
199
|
+
'as',
|
|
200
|
+
'at',
|
|
201
|
+
'be',
|
|
202
|
+
'by',
|
|
203
|
+
'for',
|
|
204
|
+
'from',
|
|
205
|
+
'has',
|
|
206
|
+
'he',
|
|
207
|
+
'in',
|
|
208
|
+
'is',
|
|
209
|
+
'it',
|
|
210
|
+
'its',
|
|
211
|
+
'of',
|
|
212
|
+
'on',
|
|
213
|
+
'or',
|
|
214
|
+
'that',
|
|
215
|
+
'the',
|
|
216
|
+
'to',
|
|
217
|
+
'was',
|
|
218
|
+
'were',
|
|
219
|
+
'will',
|
|
220
|
+
'with',
|
|
221
|
+
'this',
|
|
222
|
+
'but',
|
|
223
|
+
'they',
|
|
224
|
+
'have',
|
|
225
|
+
'had',
|
|
226
|
+
'what',
|
|
227
|
+
'when',
|
|
228
|
+
'where',
|
|
229
|
+
'who',
|
|
230
|
+
'which',
|
|
231
|
+
'why',
|
|
232
|
+
'how',
|
|
233
|
+
'all',
|
|
234
|
+
'each',
|
|
235
|
+
'every',
|
|
236
|
+
'both',
|
|
237
|
+
'few',
|
|
238
|
+
'more',
|
|
239
|
+
'most',
|
|
240
|
+
'other',
|
|
241
|
+
'some',
|
|
242
|
+
'such',
|
|
243
|
+
'no',
|
|
244
|
+
'nor',
|
|
245
|
+
'not',
|
|
246
|
+
'only',
|
|
247
|
+
'own',
|
|
248
|
+
'same',
|
|
249
|
+
'so',
|
|
250
|
+
'than',
|
|
251
|
+
'too',
|
|
252
|
+
'very',
|
|
253
|
+
'can',
|
|
254
|
+
'just',
|
|
255
|
+
'should',
|
|
256
|
+
'now',
|
|
257
|
+
]);
|
|
258
|
+
/**
|
|
259
|
+
* Create a new BM25 index
|
|
260
|
+
*/
|
|
261
|
+
export function createBM25Index(options) {
|
|
262
|
+
return new BM25Index(options);
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=bm25.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../src/embeddings/bm25.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embeddings Module
|
|
3
|
+
*
|
|
4
|
+
* Provides embedding generation, storage, and similarity search capabilities.
|
|
5
|
+
* Supports multiple embedding providers (OpenAI, Voyage, local) with automatic
|
|
6
|
+
* fallback to BM25 text search when no provider is configured.
|
|
7
|
+
*/
|
|
8
|
+
export { type EmbeddingProvider, type EmbeddingProviderConfig, OpenAIEmbeddingProvider, VoyageEmbeddingProvider, LocalEmbeddingProvider, createEmbeddingProvider, } from './provider.js';
|
|
9
|
+
export { BM25Index, createBM25Index, type MemoryItemType, } from './bm25.js';
|
|
10
|
+
export { SqliteVectorStore, createVectorStore, type VectorSearchResult, } from './vector-store.js';
|
|
11
|
+
export { EmbeddingManager, createEmbeddingManager, type EmbeddingManagerOptions, type SearchResult, } from './manager.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,SAAS,EACT,eAAe,EACf,KAAK,cAAc,GACpB,MAAM,WAAW,CAAC;AAGnB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,YAAY,GAClB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embeddings Module
|
|
3
|
+
*
|
|
4
|
+
* Provides embedding generation, storage, and similarity search capabilities.
|
|
5
|
+
* Supports multiple embedding providers (OpenAI, Voyage, local) with automatic
|
|
6
|
+
* fallback to BM25 text search when no provider is configured.
|
|
7
|
+
*/
|
|
8
|
+
// Provider interface and implementations
|
|
9
|
+
export { OpenAIEmbeddingProvider, VoyageEmbeddingProvider, LocalEmbeddingProvider, createEmbeddingProvider, } from './provider.js';
|
|
10
|
+
// BM25 text search (fallback)
|
|
11
|
+
export { BM25Index, createBM25Index, } from './bm25.js';
|
|
12
|
+
// Vector store using sqlite-vec
|
|
13
|
+
export { SqliteVectorStore, createVectorStore, } from './vector-store.js';
|
|
14
|
+
// Embedding manager (main interface)
|
|
15
|
+
export { EmbeddingManager, createEmbeddingManager, } from './manager.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,yCAAyC;AACzC,OAAO,EAGL,uBAAuB,EACvB,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AAEvB,8BAA8B;AAC9B,OAAO,EACL,SAAS,EACT,eAAe,GAEhB,MAAM,WAAW,CAAC;AAEnB,gCAAgC;AAChC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;AAE3B,qCAAqC;AACrC,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GAGvB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Manager
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates embedding generation, storage, and search.
|
|
5
|
+
* Provides automatic fallback to BM25 when no embedding provider is configured.
|
|
6
|
+
*/
|
|
7
|
+
import type { EmbeddingProvider } from './provider.js';
|
|
8
|
+
import { type MemoryItemType } from './bm25.js';
|
|
9
|
+
export { type MemoryItemType } from './bm25.js';
|
|
10
|
+
export interface SearchResult {
|
|
11
|
+
id: string;
|
|
12
|
+
score: number;
|
|
13
|
+
content: string;
|
|
14
|
+
}
|
|
15
|
+
export interface EmbeddingManagerOptions {
|
|
16
|
+
/** Embedding provider (null for BM25-only mode) */
|
|
17
|
+
provider?: EmbeddingProvider | null;
|
|
18
|
+
/** Path to sqlite-vec database file */
|
|
19
|
+
vectorStorePath?: string;
|
|
20
|
+
/** Embedding dimension (required if provider is set) */
|
|
21
|
+
dimension?: number;
|
|
22
|
+
/** BM25 parameters */
|
|
23
|
+
bm25?: {
|
|
24
|
+
k1?: number;
|
|
25
|
+
b?: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Manages embeddings with automatic fallback to BM25
|
|
30
|
+
*/
|
|
31
|
+
export declare class EmbeddingManager {
|
|
32
|
+
private provider;
|
|
33
|
+
private vectorStore;
|
|
34
|
+
private bm25Index;
|
|
35
|
+
private useVectorSearch;
|
|
36
|
+
constructor(options: EmbeddingManagerOptions);
|
|
37
|
+
/**
|
|
38
|
+
* Check if vector search is available
|
|
39
|
+
*/
|
|
40
|
+
get hasVectorSearch(): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Get the embedding dimension (if available)
|
|
43
|
+
*/
|
|
44
|
+
get dimension(): number | null;
|
|
45
|
+
/**
|
|
46
|
+
* Store an item with its embedding
|
|
47
|
+
* Returns the embedding if generated, undefined otherwise
|
|
48
|
+
*/
|
|
49
|
+
store(id: string, content: string, type: MemoryItemType): Promise<number[] | undefined>;
|
|
50
|
+
/**
|
|
51
|
+
* Store multiple items with embeddings (batch)
|
|
52
|
+
* More efficient than calling store() multiple times
|
|
53
|
+
*/
|
|
54
|
+
storeBatch(items: Array<{
|
|
55
|
+
id: string;
|
|
56
|
+
content: string;
|
|
57
|
+
type: MemoryItemType;
|
|
58
|
+
}>): Promise<Map<string, number[] | undefined>>;
|
|
59
|
+
/**
|
|
60
|
+
* Search for similar items
|
|
61
|
+
* Uses vector search if available, falls back to BM25
|
|
62
|
+
*/
|
|
63
|
+
search(query: string, options?: {
|
|
64
|
+
k?: number;
|
|
65
|
+
type?: MemoryItemType;
|
|
66
|
+
threshold?: number;
|
|
67
|
+
}): Promise<SearchResult[]>;
|
|
68
|
+
/**
|
|
69
|
+
* Search using a pre-computed embedding
|
|
70
|
+
* Only works if vector store is available
|
|
71
|
+
*/
|
|
72
|
+
searchByEmbedding(embedding: number[], options?: {
|
|
73
|
+
k?: number;
|
|
74
|
+
type?: MemoryItemType;
|
|
75
|
+
threshold?: number;
|
|
76
|
+
}): SearchResult[] | null;
|
|
77
|
+
/**
|
|
78
|
+
* Generate an embedding without storing it
|
|
79
|
+
*/
|
|
80
|
+
embed(text: string): Promise<number[] | null>;
|
|
81
|
+
/**
|
|
82
|
+
* Generate embeddings for multiple texts without storing
|
|
83
|
+
*/
|
|
84
|
+
embedBatch(texts: string[]): Promise<number[][] | null>;
|
|
85
|
+
/**
|
|
86
|
+
* Remove an item from all indexes
|
|
87
|
+
*/
|
|
88
|
+
remove(id: string): void;
|
|
89
|
+
/**
|
|
90
|
+
* Check if an item exists
|
|
91
|
+
*/
|
|
92
|
+
has(id: string): boolean;
|
|
93
|
+
/**
|
|
94
|
+
* Get statistics about the indexes
|
|
95
|
+
*/
|
|
96
|
+
getStats(): {
|
|
97
|
+
bm25Count: number;
|
|
98
|
+
vectorCount: number | null;
|
|
99
|
+
hasVectorSearch: boolean;
|
|
100
|
+
dimension: number | null;
|
|
101
|
+
providerName: string | null;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Close all resources
|
|
105
|
+
*/
|
|
106
|
+
close(): void;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Create an embedding manager
|
|
110
|
+
*/
|
|
111
|
+
export declare function createEmbeddingManager(options: EmbeddingManagerOptions): EmbeddingManager;
|
|
112
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/embeddings/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Manager
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates embedding generation, storage, and search.
|
|
5
|
+
* Provides automatic fallback to BM25 when no embedding provider is configured.
|
|
6
|
+
*/
|
|
7
|
+
import { SqliteVectorStore } from './vector-store.js';
|
|
8
|
+
import { BM25Index } from './bm25.js';
|
|
9
|
+
/**
|
|
10
|
+
* Manages embeddings with automatic fallback to BM25
|
|
11
|
+
*/
|
|
12
|
+
export class EmbeddingManager {
|
|
13
|
+
provider;
|
|
14
|
+
vectorStore;
|
|
15
|
+
bm25Index;
|
|
16
|
+
useVectorSearch;
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.provider = options.provider ?? null;
|
|
19
|
+
this.useVectorSearch = this.provider !== null && !!options.vectorStorePath;
|
|
20
|
+
// Initialize vector store if we have a provider and path
|
|
21
|
+
if (this.useVectorSearch && options.vectorStorePath) {
|
|
22
|
+
const dimension = options.dimension ?? this.provider.dimension;
|
|
23
|
+
this.vectorStore = new SqliteVectorStore({
|
|
24
|
+
dbPath: options.vectorStorePath,
|
|
25
|
+
dimension,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this.vectorStore = null;
|
|
30
|
+
}
|
|
31
|
+
// Always maintain BM25 as fallback
|
|
32
|
+
this.bm25Index = new BM25Index(options.bm25);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if vector search is available
|
|
36
|
+
*/
|
|
37
|
+
get hasVectorSearch() {
|
|
38
|
+
return this.useVectorSearch && this.vectorStore !== null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the embedding dimension (if available)
|
|
42
|
+
*/
|
|
43
|
+
get dimension() {
|
|
44
|
+
return this.provider?.dimension ?? null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Store an item with its embedding
|
|
48
|
+
* Returns the embedding if generated, undefined otherwise
|
|
49
|
+
*/
|
|
50
|
+
async store(id, content, type) {
|
|
51
|
+
// Always add to BM25 index for fallback
|
|
52
|
+
this.bm25Index.add(id, content, type);
|
|
53
|
+
// Generate and store embedding if provider available
|
|
54
|
+
if (this.useVectorSearch && this.provider && this.vectorStore) {
|
|
55
|
+
try {
|
|
56
|
+
const embedding = await this.provider.embed(content);
|
|
57
|
+
this.vectorStore.insert(id, embedding, type, content);
|
|
58
|
+
return embedding;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error(`Failed to generate embedding for ${id}:`, error);
|
|
62
|
+
// Fall through to return undefined - BM25 is still available
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Store multiple items with embeddings (batch)
|
|
69
|
+
* More efficient than calling store() multiple times
|
|
70
|
+
*/
|
|
71
|
+
async storeBatch(items) {
|
|
72
|
+
const results = new Map();
|
|
73
|
+
// Add all to BM25 index
|
|
74
|
+
for (const item of items) {
|
|
75
|
+
this.bm25Index.add(item.id, item.content, item.type);
|
|
76
|
+
}
|
|
77
|
+
// Batch embed if provider available
|
|
78
|
+
if (this.useVectorSearch && this.provider && this.vectorStore) {
|
|
79
|
+
try {
|
|
80
|
+
const contents = items.map((i) => i.content);
|
|
81
|
+
const embeddings = await this.provider.embedBatch(contents);
|
|
82
|
+
const batchItems = items.map((item, i) => ({
|
|
83
|
+
id: item.id,
|
|
84
|
+
embedding: embeddings[i],
|
|
85
|
+
type: item.type,
|
|
86
|
+
content: item.content,
|
|
87
|
+
}));
|
|
88
|
+
this.vectorStore.insertBatch(batchItems);
|
|
89
|
+
for (let i = 0; i < items.length; i++) {
|
|
90
|
+
results.set(items[i].id, embeddings[i]);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
console.error('Failed to generate batch embeddings:', error);
|
|
95
|
+
// Fall through - items are still in BM25 index
|
|
96
|
+
for (const item of items) {
|
|
97
|
+
results.set(item.id, undefined);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
for (const item of items) {
|
|
103
|
+
results.set(item.id, undefined);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return results;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Search for similar items
|
|
110
|
+
* Uses vector search if available, falls back to BM25
|
|
111
|
+
*/
|
|
112
|
+
async search(query, options = {}) {
|
|
113
|
+
// Use vector search if available
|
|
114
|
+
if (this.useVectorSearch && this.provider && this.vectorStore) {
|
|
115
|
+
try {
|
|
116
|
+
const queryEmbedding = await this.provider.embed(query);
|
|
117
|
+
const results = this.vectorStore.search(queryEmbedding, options);
|
|
118
|
+
return results.map((r) => ({
|
|
119
|
+
id: r.id,
|
|
120
|
+
score: r.score,
|
|
121
|
+
content: r.content,
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
console.error('Vector search failed, falling back to BM25:', error);
|
|
126
|
+
// Fall through to BM25
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Fallback to BM25
|
|
130
|
+
return this.bm25Index.search(query, options);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Search using a pre-computed embedding
|
|
134
|
+
* Only works if vector store is available
|
|
135
|
+
*/
|
|
136
|
+
searchByEmbedding(embedding, options = {}) {
|
|
137
|
+
if (!this.vectorStore) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const results = this.vectorStore.search(embedding, options);
|
|
141
|
+
return results.map((r) => ({
|
|
142
|
+
id: r.id,
|
|
143
|
+
score: r.score,
|
|
144
|
+
content: r.content,
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Generate an embedding without storing it
|
|
149
|
+
*/
|
|
150
|
+
async embed(text) {
|
|
151
|
+
if (!this.provider) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
return await this.provider.embed(text);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
console.error('Failed to generate embedding:', error);
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Generate embeddings for multiple texts without storing
|
|
164
|
+
*/
|
|
165
|
+
async embedBatch(texts) {
|
|
166
|
+
if (!this.provider) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
return await this.provider.embedBatch(texts);
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
console.error('Failed to generate batch embeddings:', error);
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Remove an item from all indexes
|
|
179
|
+
*/
|
|
180
|
+
remove(id) {
|
|
181
|
+
this.bm25Index.remove(id);
|
|
182
|
+
this.vectorStore?.delete(id);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Check if an item exists
|
|
186
|
+
*/
|
|
187
|
+
has(id) {
|
|
188
|
+
return this.bm25Index.has(id);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Get statistics about the indexes
|
|
192
|
+
*/
|
|
193
|
+
getStats() {
|
|
194
|
+
return {
|
|
195
|
+
bm25Count: this.bm25Index.size,
|
|
196
|
+
vectorCount: this.vectorStore?.count ?? null,
|
|
197
|
+
hasVectorSearch: this.hasVectorSearch,
|
|
198
|
+
dimension: this.dimension,
|
|
199
|
+
providerName: this.provider?.name ?? null,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Close all resources
|
|
204
|
+
*/
|
|
205
|
+
close() {
|
|
206
|
+
this.vectorStore?.close();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Create an embedding manager
|
|
211
|
+
*/
|
|
212
|
+
export function createEmbeddingManager(options) {
|
|
213
|
+
return new EmbeddingManager(options);
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/embeddings/manager.ts"],"names":[],"mappings":"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"}
|