cccmemory 1.8.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/LICENSE +21 -0
- package/README.md +349 -0
- package/dist/ConversationMemory.d.ts +231 -0
- package/dist/ConversationMemory.d.ts.map +1 -0
- package/dist/ConversationMemory.js +357 -0
- package/dist/ConversationMemory.js.map +1 -0
- package/dist/cache/QueryCache.d.ts +215 -0
- package/dist/cache/QueryCache.d.ts.map +1 -0
- package/dist/cache/QueryCache.js +294 -0
- package/dist/cache/QueryCache.js.map +1 -0
- package/dist/cli/commands.d.ts +9 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +954 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/help.d.ts +16 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +361 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.d.ts +30 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +111 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/context/ContextInjector.d.ts +38 -0
- package/dist/context/ContextInjector.d.ts.map +1 -0
- package/dist/context/ContextInjector.js +235 -0
- package/dist/context/ContextInjector.js.map +1 -0
- package/dist/documentation/CodeAnalyzer.d.ts +29 -0
- package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
- package/dist/documentation/CodeAnalyzer.js +122 -0
- package/dist/documentation/CodeAnalyzer.js.map +1 -0
- package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
- package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
- package/dist/documentation/ConversationAnalyzer.js +157 -0
- package/dist/documentation/ConversationAnalyzer.js.map +1 -0
- package/dist/documentation/CrossReferencer.d.ts +67 -0
- package/dist/documentation/CrossReferencer.d.ts.map +1 -0
- package/dist/documentation/CrossReferencer.js +247 -0
- package/dist/documentation/CrossReferencer.js.map +1 -0
- package/dist/documentation/DocumentationGenerator.d.ts +22 -0
- package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
- package/dist/documentation/DocumentationGenerator.js +57 -0
- package/dist/documentation/DocumentationGenerator.js.map +1 -0
- package/dist/documentation/MarkdownFormatter.d.ts +26 -0
- package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
- package/dist/documentation/MarkdownFormatter.js +301 -0
- package/dist/documentation/MarkdownFormatter.js.map +1 -0
- package/dist/documentation/types.d.ts +176 -0
- package/dist/documentation/types.d.ts.map +1 -0
- package/dist/documentation/types.js +5 -0
- package/dist/documentation/types.js.map +1 -0
- package/dist/embeddings/ConfigManager.d.ts +46 -0
- package/dist/embeddings/ConfigManager.d.ts.map +1 -0
- package/dist/embeddings/ConfigManager.js +177 -0
- package/dist/embeddings/ConfigManager.js.map +1 -0
- package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
- package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingConfig.js +132 -0
- package/dist/embeddings/EmbeddingConfig.js.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts +51 -0
- package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingGenerator.js +157 -0
- package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
- package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
- package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
- package/dist/embeddings/EmbeddingProvider.js +6 -0
- package/dist/embeddings/EmbeddingProvider.js.map +1 -0
- package/dist/embeddings/ModelRegistry.d.ts +48 -0
- package/dist/embeddings/ModelRegistry.d.ts.map +1 -0
- package/dist/embeddings/ModelRegistry.js +170 -0
- package/dist/embeddings/ModelRegistry.js.map +1 -0
- package/dist/embeddings/VectorStore.d.ts +114 -0
- package/dist/embeddings/VectorStore.d.ts.map +1 -0
- package/dist/embeddings/VectorStore.js +393 -0
- package/dist/embeddings/VectorStore.js.map +1 -0
- package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
- package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/OllamaEmbeddings.js +125 -0
- package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.js +129 -0
- package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
- package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
- package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js +115 -0
- package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
- package/dist/handoff/SessionHandoffStore.d.ts +80 -0
- package/dist/handoff/SessionHandoffStore.d.ts.map +1 -0
- package/dist/handoff/SessionHandoffStore.js +314 -0
- package/dist/handoff/SessionHandoffStore.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +115 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.d.ts +27 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +157 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/memory/WorkingMemoryStore.d.ts +83 -0
- package/dist/memory/WorkingMemoryStore.d.ts.map +1 -0
- package/dist/memory/WorkingMemoryStore.js +318 -0
- package/dist/memory/WorkingMemoryStore.js.map +1 -0
- package/dist/memory/types.d.ts +192 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +8 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/parsers/CodexConversationParser.d.ts +51 -0
- package/dist/parsers/CodexConversationParser.d.ts.map +1 -0
- package/dist/parsers/CodexConversationParser.js +301 -0
- package/dist/parsers/CodexConversationParser.js.map +1 -0
- package/dist/parsers/ConversationParser.d.ts +286 -0
- package/dist/parsers/ConversationParser.d.ts.map +1 -0
- package/dist/parsers/ConversationParser.js +795 -0
- package/dist/parsers/ConversationParser.js.map +1 -0
- package/dist/parsers/DecisionExtractor.d.ts +144 -0
- package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
- package/dist/parsers/DecisionExtractor.js +434 -0
- package/dist/parsers/DecisionExtractor.js.map +1 -0
- package/dist/parsers/GitIntegrator.d.ts +156 -0
- package/dist/parsers/GitIntegrator.d.ts.map +1 -0
- package/dist/parsers/GitIntegrator.js +348 -0
- package/dist/parsers/GitIntegrator.js.map +1 -0
- package/dist/parsers/MistakeExtractor.d.ts +151 -0
- package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
- package/dist/parsers/MistakeExtractor.js +460 -0
- package/dist/parsers/MistakeExtractor.js.map +1 -0
- package/dist/parsers/RequirementsExtractor.d.ts +166 -0
- package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
- package/dist/parsers/RequirementsExtractor.js +338 -0
- package/dist/parsers/RequirementsExtractor.js.map +1 -0
- package/dist/realtime/ConversationWatcher.d.ts +87 -0
- package/dist/realtime/ConversationWatcher.d.ts.map +1 -0
- package/dist/realtime/ConversationWatcher.js +204 -0
- package/dist/realtime/ConversationWatcher.js.map +1 -0
- package/dist/realtime/IncrementalParser.d.ts +83 -0
- package/dist/realtime/IncrementalParser.d.ts.map +1 -0
- package/dist/realtime/IncrementalParser.js +232 -0
- package/dist/realtime/IncrementalParser.js.map +1 -0
- package/dist/realtime/LiveExtractor.d.ts +72 -0
- package/dist/realtime/LiveExtractor.d.ts.map +1 -0
- package/dist/realtime/LiveExtractor.js +288 -0
- package/dist/realtime/LiveExtractor.js.map +1 -0
- package/dist/search/SemanticSearch.d.ts +121 -0
- package/dist/search/SemanticSearch.d.ts.map +1 -0
- package/dist/search/SemanticSearch.js +823 -0
- package/dist/search/SemanticSearch.js.map +1 -0
- package/dist/storage/BackupManager.d.ts +58 -0
- package/dist/storage/BackupManager.d.ts.map +1 -0
- package/dist/storage/BackupManager.js +223 -0
- package/dist/storage/BackupManager.js.map +1 -0
- package/dist/storage/ConversationStorage.d.ts +341 -0
- package/dist/storage/ConversationStorage.d.ts.map +1 -0
- package/dist/storage/ConversationStorage.js +792 -0
- package/dist/storage/ConversationStorage.js.map +1 -0
- package/dist/storage/DeletionService.d.ts +70 -0
- package/dist/storage/DeletionService.d.ts.map +1 -0
- package/dist/storage/DeletionService.js +253 -0
- package/dist/storage/DeletionService.js.map +1 -0
- package/dist/storage/GlobalIndex.d.ts +133 -0
- package/dist/storage/GlobalIndex.d.ts.map +1 -0
- package/dist/storage/GlobalIndex.js +310 -0
- package/dist/storage/GlobalIndex.js.map +1 -0
- package/dist/storage/SQLiteManager.d.ts +114 -0
- package/dist/storage/SQLiteManager.d.ts.map +1 -0
- package/dist/storage/SQLiteManager.js +636 -0
- package/dist/storage/SQLiteManager.js.map +1 -0
- package/dist/storage/migrations.d.ts +54 -0
- package/dist/storage/migrations.d.ts.map +1 -0
- package/dist/storage/migrations.js +285 -0
- package/dist/storage/migrations.js.map +1 -0
- package/dist/storage/schema.sql +436 -0
- package/dist/tools/ToolDefinitions.d.ts +946 -0
- package/dist/tools/ToolDefinitions.d.ts.map +1 -0
- package/dist/tools/ToolDefinitions.js +937 -0
- package/dist/tools/ToolDefinitions.js.map +1 -0
- package/dist/tools/ToolHandlers.d.ts +791 -0
- package/dist/tools/ToolHandlers.d.ts.map +1 -0
- package/dist/tools/ToolHandlers.js +3262 -0
- package/dist/tools/ToolHandlers.js.map +1 -0
- package/dist/types/ToolTypes.d.ts +824 -0
- package/dist/types/ToolTypes.d.ts.map +1 -0
- package/dist/types/ToolTypes.js +6 -0
- package/dist/types/ToolTypes.js.map +1 -0
- package/dist/utils/Logger.d.ts +70 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +131 -0
- package/dist/utils/Logger.js.map +1 -0
- package/dist/utils/McpConfig.d.ts +54 -0
- package/dist/utils/McpConfig.d.ts.map +1 -0
- package/dist/utils/McpConfig.js +136 -0
- package/dist/utils/McpConfig.js.map +1 -0
- package/dist/utils/ProjectMigration.d.ts +82 -0
- package/dist/utils/ProjectMigration.d.ts.map +1 -0
- package/dist/utils/ProjectMigration.js +416 -0
- package/dist/utils/ProjectMigration.js.map +1 -0
- package/dist/utils/constants.d.ts +75 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +105 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/safeJson.d.ts +37 -0
- package/dist/utils/safeJson.d.ts.map +1 -0
- package/dist/utils/safeJson.js +48 -0
- package/dist/utils/safeJson.js.map +1 -0
- package/dist/utils/sanitization.d.ts +45 -0
- package/dist/utils/sanitization.d.ts.map +1 -0
- package/dist/utils/sanitization.js +153 -0
- package/dist/utils/sanitization.js.map +1 -0
- package/dist/utils/worktree.d.ts +15 -0
- package/dist/utils/worktree.d.ts.map +1 -0
- package/dist/utils/worktree.js +86 -0
- package/dist/utils/worktree.js.map +1 -0
- package/package.json +98 -0
- package/scripts/changelog-check.sh +62 -0
- package/scripts/check-node.js +17 -0
- package/scripts/dev-config.js +56 -0
- package/scripts/postinstall.js +117 -0
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vector Store with sqlite-vec integration
|
|
3
|
+
* Dual-schema support (vector extension or BLOB fallback)
|
|
4
|
+
*/
|
|
5
|
+
export class VectorStore {
|
|
6
|
+
db;
|
|
7
|
+
sqliteManager;
|
|
8
|
+
hasVecExtension = false;
|
|
9
|
+
vecTablesInitialized = false;
|
|
10
|
+
constructor(sqliteManager) {
|
|
11
|
+
this.db = sqliteManager.getDatabase();
|
|
12
|
+
this.sqliteManager = sqliteManager;
|
|
13
|
+
this.detectVecExtension();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Detect if sqlite-vec extension is available
|
|
17
|
+
*/
|
|
18
|
+
detectVecExtension() {
|
|
19
|
+
try {
|
|
20
|
+
// First, check if vec0 module is registered by querying sqlite_master
|
|
21
|
+
// This works even in read-only mode
|
|
22
|
+
const vecTables = this.db
|
|
23
|
+
.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'vec_%'")
|
|
24
|
+
.all();
|
|
25
|
+
// If vec tables exist, the extension was loaded successfully before
|
|
26
|
+
if (vecTables.length > 0) {
|
|
27
|
+
this.hasVecExtension = true;
|
|
28
|
+
console.error("✓ sqlite-vec extension detected (existing tables found)");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
// Try to create a test virtual table (requires write access)
|
|
32
|
+
this.db.exec("CREATE VIRTUAL TABLE IF NOT EXISTS vec_test USING vec0(test float[1])");
|
|
33
|
+
this.db.exec("DROP TABLE vec_test");
|
|
34
|
+
this.hasVecExtension = true;
|
|
35
|
+
console.error("✓ sqlite-vec extension detected");
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
const errorMessage = error.message;
|
|
39
|
+
// Check if it's a read-only error vs actual missing extension
|
|
40
|
+
if (errorMessage.includes("readonly") || errorMessage.includes("read-only")) {
|
|
41
|
+
// Database is read-only, assume vec is available if extension loaded
|
|
42
|
+
// (SQLiteManager would have failed to load if it wasn't)
|
|
43
|
+
this.hasVecExtension = true;
|
|
44
|
+
console.error("✓ sqlite-vec extension assumed available (read-only mode)");
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
this.hasVecExtension = false;
|
|
48
|
+
console.error("⚠ sqlite-vec not available:", errorMessage);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if vec extension is enabled
|
|
54
|
+
*/
|
|
55
|
+
isVecEnabled() {
|
|
56
|
+
return this.hasVecExtension;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generic helper to get existing embedding IDs from both BLOB and vec tables.
|
|
60
|
+
* @param blobTable - BLOB table name (e.g., "message_embeddings")
|
|
61
|
+
* @param idColumn - Column name for the entity ID (e.g., "message_id")
|
|
62
|
+
* @param vecTable - Vec table name (e.g., "vec_message_embeddings")
|
|
63
|
+
* @param prefix - ID prefix in vec table (e.g., "msg_")
|
|
64
|
+
*/
|
|
65
|
+
getExistingEmbeddingIds(blobTable, idColumn, vecTable, prefix) {
|
|
66
|
+
const ids = new Set();
|
|
67
|
+
// Query BLOB fallback table
|
|
68
|
+
try {
|
|
69
|
+
const rows = this.db
|
|
70
|
+
.prepare(`SELECT ${idColumn} FROM ${blobTable}`)
|
|
71
|
+
.all();
|
|
72
|
+
for (const row of rows) {
|
|
73
|
+
ids.add(row[idColumn]);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (_e) {
|
|
77
|
+
// Table might not exist yet
|
|
78
|
+
}
|
|
79
|
+
// Also query sqlite-vec table if extension is available
|
|
80
|
+
if (this.hasVecExtension) {
|
|
81
|
+
try {
|
|
82
|
+
const vecRows = this.db
|
|
83
|
+
.prepare(`SELECT id FROM ${vecTable}`)
|
|
84
|
+
.all();
|
|
85
|
+
for (const row of vecRows) {
|
|
86
|
+
// Strip prefix to get actual entity ID
|
|
87
|
+
if (row.id.startsWith(prefix)) {
|
|
88
|
+
ids.add(row.id.substring(prefix.length));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (_e) {
|
|
93
|
+
// Vec table might not exist yet
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return ids;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get set of message IDs that already have embeddings.
|
|
100
|
+
*/
|
|
101
|
+
getExistingMessageEmbeddingIds() {
|
|
102
|
+
return this.getExistingEmbeddingIds("message_embeddings", "message_id", "vec_message_embeddings", "msg_");
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get set of decision IDs that already have embeddings.
|
|
106
|
+
*/
|
|
107
|
+
getExistingDecisionEmbeddingIds() {
|
|
108
|
+
return this.getExistingEmbeddingIds("decision_embeddings", "decision_id", "vec_decision_embeddings", "dec_");
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get set of mistake IDs that already have embeddings.
|
|
112
|
+
*/
|
|
113
|
+
getExistingMistakeEmbeddingIds() {
|
|
114
|
+
return this.getExistingEmbeddingIds("mistake_embeddings", "mistake_id", "vec_mistake_embeddings", "mst_");
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Ensure vec tables exist with correct dimensions
|
|
118
|
+
*/
|
|
119
|
+
ensureVecTables(dimensions) {
|
|
120
|
+
if (!this.hasVecExtension || this.vecTablesInitialized) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
this.sqliteManager.createVecTablesWithDimensions(dimensions);
|
|
124
|
+
this.vecTablesInitialized = true;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Store an embedding for a message
|
|
128
|
+
* @param messageId - The message ID
|
|
129
|
+
* @param content - The message content
|
|
130
|
+
* @param embedding - The embedding vector
|
|
131
|
+
* @param modelName - The model used to generate the embedding (default: all-MiniLM-L6-v2)
|
|
132
|
+
*/
|
|
133
|
+
async storeMessageEmbedding(messageId, content, embedding, modelName = "all-MiniLM-L6-v2") {
|
|
134
|
+
const embedId = `msg_${messageId}`;
|
|
135
|
+
// ALWAYS store content in BLOB table for JOINs and fallback
|
|
136
|
+
// This ensures search can always retrieve content regardless of vec mode
|
|
137
|
+
this.storeInBlobTable(messageId, content, embedding, modelName);
|
|
138
|
+
if (this.hasVecExtension) {
|
|
139
|
+
// Ensure vec tables exist with correct dimensions
|
|
140
|
+
try {
|
|
141
|
+
this.ensureVecTables(embedding.length);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
console.error("Failed to ensure vec tables:", error.message);
|
|
145
|
+
// Content already stored in BLOB table, so we can continue
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Also store in sqlite-vec virtual table for fast similarity search
|
|
149
|
+
try {
|
|
150
|
+
// Try to delete existing entry first (handles dimension mismatches)
|
|
151
|
+
try {
|
|
152
|
+
this.db
|
|
153
|
+
.prepare("DELETE FROM vec_message_embeddings WHERE id = ?")
|
|
154
|
+
.run(embedId);
|
|
155
|
+
}
|
|
156
|
+
catch (_deleteError) {
|
|
157
|
+
// Ignore - entry might not exist
|
|
158
|
+
}
|
|
159
|
+
// Now insert the new embedding
|
|
160
|
+
this.db
|
|
161
|
+
.prepare("INSERT INTO vec_message_embeddings (id, embedding) VALUES (?, ?)")
|
|
162
|
+
.run(embedId, this.float32ArrayToBuffer(embedding));
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
// Only log non-UNIQUE-constraint errors
|
|
166
|
+
const errorMessage = error.message;
|
|
167
|
+
if (!errorMessage.includes("UNIQUE constraint")) {
|
|
168
|
+
console.error("Vec embedding storage failed, using BLOB only:", errorMessage);
|
|
169
|
+
}
|
|
170
|
+
// Content already stored in BLOB table, so search will still work
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Store embedding in BLOB table (fallback)
|
|
176
|
+
*/
|
|
177
|
+
storeInBlobTable(messageId, content, embedding, modelName) {
|
|
178
|
+
this.db
|
|
179
|
+
.prepare(`INSERT INTO message_embeddings
|
|
180
|
+
(id, message_id, content, embedding, model_name, created_at)
|
|
181
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
182
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
183
|
+
message_id = excluded.message_id,
|
|
184
|
+
content = excluded.content,
|
|
185
|
+
embedding = excluded.embedding,
|
|
186
|
+
model_name = excluded.model_name,
|
|
187
|
+
created_at = excluded.created_at`)
|
|
188
|
+
.run(`msg_${messageId}`, messageId, content, this.float32ArrayToBuffer(embedding), modelName, Date.now());
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Generic helper to store embeddings for decisions/mistakes (simpler schema without content).
|
|
192
|
+
* @param entityId - The entity ID (decision or mistake)
|
|
193
|
+
* @param embedding - The embedding vector
|
|
194
|
+
* @param blobTable - BLOB table name (e.g., "decision_embeddings")
|
|
195
|
+
* @param idColumn - Column name for entity ID (e.g., "decision_id")
|
|
196
|
+
* @param vecTable - Vec table name (e.g., "vec_decision_embeddings")
|
|
197
|
+
* @param prefix - ID prefix (e.g., "dec_")
|
|
198
|
+
* @param entityType - For logging (e.g., "decision")
|
|
199
|
+
*/
|
|
200
|
+
storeEntityEmbedding(entityId, embedding, blobTable, idColumn, vecTable, prefix, entityType) {
|
|
201
|
+
const embedId = `${prefix}${entityId}`;
|
|
202
|
+
// Store in BLOB table
|
|
203
|
+
this.db
|
|
204
|
+
.prepare(`INSERT INTO ${blobTable}
|
|
205
|
+
(id, ${idColumn}, embedding, created_at)
|
|
206
|
+
VALUES (?, ?, ?, ?)
|
|
207
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
208
|
+
${idColumn} = excluded.${idColumn},
|
|
209
|
+
embedding = excluded.embedding,
|
|
210
|
+
created_at = excluded.created_at`)
|
|
211
|
+
.run(embedId, entityId, this.float32ArrayToBuffer(embedding), Date.now());
|
|
212
|
+
// Also store in sqlite-vec if available
|
|
213
|
+
if (this.hasVecExtension) {
|
|
214
|
+
try {
|
|
215
|
+
this.ensureVecTables(embedding.length);
|
|
216
|
+
try {
|
|
217
|
+
this.db.prepare(`DELETE FROM ${vecTable} WHERE id = ?`).run(embedId);
|
|
218
|
+
}
|
|
219
|
+
catch (_e) {
|
|
220
|
+
// Ignore - entry might not exist
|
|
221
|
+
}
|
|
222
|
+
this.db
|
|
223
|
+
.prepare(`INSERT INTO ${vecTable} (id, embedding) VALUES (?, ?)`)
|
|
224
|
+
.run(embedId, this.float32ArrayToBuffer(embedding));
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
const errorMessage = error.message;
|
|
228
|
+
if (!errorMessage.includes("UNIQUE constraint")) {
|
|
229
|
+
console.error(`Vec ${entityType} embedding storage failed:`, errorMessage);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Store an embedding for a decision
|
|
236
|
+
*/
|
|
237
|
+
async storeDecisionEmbedding(decisionId, embedding) {
|
|
238
|
+
this.storeEntityEmbedding(decisionId, embedding, "decision_embeddings", "decision_id", "vec_decision_embeddings", "dec_", "decision");
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Store an embedding for a mistake
|
|
242
|
+
*/
|
|
243
|
+
async storeMistakeEmbedding(mistakeId, embedding) {
|
|
244
|
+
this.storeEntityEmbedding(mistakeId, embedding, "mistake_embeddings", "mistake_id", "vec_mistake_embeddings", "mst_", "mistake");
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Search for similar messages
|
|
248
|
+
*/
|
|
249
|
+
async searchMessages(queryEmbedding, limit = 10) {
|
|
250
|
+
if (this.hasVecExtension) {
|
|
251
|
+
return this.searchWithVecExtension(queryEmbedding, limit);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
return this.searchWithCosine(queryEmbedding, limit);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Search using sqlite-vec extension
|
|
259
|
+
*/
|
|
260
|
+
searchWithVecExtension(queryEmbedding, limit) {
|
|
261
|
+
try {
|
|
262
|
+
const queryBuffer = this.float32ArrayToBuffer(queryEmbedding);
|
|
263
|
+
const results = this.db
|
|
264
|
+
.prepare(`SELECT
|
|
265
|
+
vec.id,
|
|
266
|
+
me.content,
|
|
267
|
+
vec_distance_cosine(vec.embedding, ?) as distance
|
|
268
|
+
FROM vec_message_embeddings vec
|
|
269
|
+
JOIN message_embeddings me ON vec.id = me.id
|
|
270
|
+
ORDER BY distance
|
|
271
|
+
LIMIT ?`)
|
|
272
|
+
.all(queryBuffer, limit);
|
|
273
|
+
return results.map((r) => ({
|
|
274
|
+
id: r.id.replace("msg_", ""),
|
|
275
|
+
content: r.content,
|
|
276
|
+
similarity: 1 - r.distance, // Convert distance to similarity
|
|
277
|
+
}));
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
console.error("Error in vec search:", error);
|
|
281
|
+
// Fallback to cosine
|
|
282
|
+
return this.searchWithCosine(queryEmbedding, limit);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Search using manual cosine similarity (fallback)
|
|
287
|
+
*/
|
|
288
|
+
searchWithCosine(queryEmbedding, limit) {
|
|
289
|
+
const allEmbeddings = this.db
|
|
290
|
+
.prepare("SELECT id, message_id, content, embedding FROM message_embeddings")
|
|
291
|
+
.all();
|
|
292
|
+
const results = allEmbeddings
|
|
293
|
+
.map((row) => {
|
|
294
|
+
const embedding = this.bufferToFloat32Array(row.embedding);
|
|
295
|
+
const similarity = this.cosineSimilarity(queryEmbedding, embedding);
|
|
296
|
+
return {
|
|
297
|
+
id: row.message_id,
|
|
298
|
+
content: row.content,
|
|
299
|
+
similarity,
|
|
300
|
+
};
|
|
301
|
+
})
|
|
302
|
+
.sort((a, b) => b.similarity - a.similarity)
|
|
303
|
+
.slice(0, limit);
|
|
304
|
+
return results;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Calculate cosine similarity between two vectors
|
|
308
|
+
*/
|
|
309
|
+
cosineSimilarity(a, b) {
|
|
310
|
+
if (a.length !== b.length) {
|
|
311
|
+
throw new Error(`Vectors must have same length: got ${a.length} and ${b.length}`);
|
|
312
|
+
}
|
|
313
|
+
let dotProduct = 0;
|
|
314
|
+
let normA = 0;
|
|
315
|
+
let normB = 0;
|
|
316
|
+
for (let i = 0; i < a.length; i++) {
|
|
317
|
+
dotProduct += a[i] * b[i];
|
|
318
|
+
normA += a[i] * a[i];
|
|
319
|
+
normB += b[i] * b[i];
|
|
320
|
+
}
|
|
321
|
+
// Guard against division by zero (zero vectors)
|
|
322
|
+
if (normA === 0 || normB === 0) {
|
|
323
|
+
return 0;
|
|
324
|
+
}
|
|
325
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Convert Float32Array to Buffer for storage
|
|
329
|
+
*/
|
|
330
|
+
float32ArrayToBuffer(array) {
|
|
331
|
+
return Buffer.from(array.buffer, array.byteOffset, array.byteLength);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Convert Buffer to Float32Array for retrieval
|
|
335
|
+
*/
|
|
336
|
+
bufferToFloat32Array(buffer) {
|
|
337
|
+
// Validate byte alignment (must be divisible by 4 for Float32)
|
|
338
|
+
if (buffer.byteLength % 4 !== 0) {
|
|
339
|
+
console.error(`Invalid embedding buffer size: ${buffer.byteLength} bytes (not divisible by 4)`);
|
|
340
|
+
return new Float32Array(0);
|
|
341
|
+
}
|
|
342
|
+
// Copy to ensure proper alignment (Node Buffers may not be aligned)
|
|
343
|
+
const aligned = new Float32Array(buffer.byteLength / 4);
|
|
344
|
+
const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
|
|
345
|
+
for (let i = 0; i < aligned.length; i++) {
|
|
346
|
+
aligned[i] = view.getFloat32(i * 4, true); // little-endian
|
|
347
|
+
}
|
|
348
|
+
return aligned;
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Get embedding count
|
|
352
|
+
*/
|
|
353
|
+
getEmbeddingCount() {
|
|
354
|
+
const result = this.db
|
|
355
|
+
.prepare("SELECT COUNT(*) as count FROM message_embeddings")
|
|
356
|
+
.get();
|
|
357
|
+
return result.count;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Clear all embeddings
|
|
361
|
+
*/
|
|
362
|
+
clearAllEmbeddings() {
|
|
363
|
+
this.db.exec("DELETE FROM message_embeddings");
|
|
364
|
+
this.db.exec("DELETE FROM decision_embeddings");
|
|
365
|
+
try {
|
|
366
|
+
this.db.exec("DELETE FROM mistake_embeddings");
|
|
367
|
+
}
|
|
368
|
+
catch (_e) {
|
|
369
|
+
// Table might not exist yet
|
|
370
|
+
}
|
|
371
|
+
if (this.hasVecExtension) {
|
|
372
|
+
try {
|
|
373
|
+
this.db.exec("DELETE FROM vec_message_embeddings");
|
|
374
|
+
}
|
|
375
|
+
catch (_e) {
|
|
376
|
+
// Vector table might not exist
|
|
377
|
+
}
|
|
378
|
+
try {
|
|
379
|
+
this.db.exec("DELETE FROM vec_decision_embeddings");
|
|
380
|
+
}
|
|
381
|
+
catch (_e) {
|
|
382
|
+
// Vector table might not exist
|
|
383
|
+
}
|
|
384
|
+
try {
|
|
385
|
+
this.db.exec("DELETE FROM vec_mistake_embeddings");
|
|
386
|
+
}
|
|
387
|
+
catch (_e) {
|
|
388
|
+
// Vector table might not exist
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=VectorStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VectorStore.js","sourceRoot":"","sources":["../../src/embeddings/VectorStore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,MAAM,OAAO,WAAW;IACd,EAAE,CAAoB;IACtB,aAAa,CAAgB;IAC7B,eAAe,GAAY,KAAK,CAAC;IACjC,oBAAoB,GAAY,KAAK,CAAC;IAE9C,YAAY,aAA4B;QACtC,IAAI,CAAC,EAAE,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,kBAAkB;QACxB,IAAI,CAAC;YACH,sEAAsE;YACtE,oCAAoC;YACpC,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE;iBACtB,OAAO,CAAC,yEAAyE,CAAC;iBAClF,GAAG,EAA6B,CAAC;YAEpC,oEAAoE;YACpE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;gBACzE,OAAO;YACT,CAAC;YAED,6DAA6D;YAC7D,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;YACtF,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,CAAC;YAC9C,8DAA8D;YAC9D,IAAI,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5E,qEAAqE;gBACrE,yDAAyD;gBACzD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC7B,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,YAAY,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;;;;;OAMG;IACK,uBAAuB,CAC7B,SAAiB,EACjB,QAAgB,EAChB,QAAgB,EAChB,MAAc;QAEd,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;QAE9B,4BAA4B;QAC5B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE;iBACjB,OAAO,CAAC,UAAU,QAAQ,SAAS,SAAS,EAAE,CAAC;iBAC/C,GAAG,EAAmC,CAAC;YAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,4BAA4B;QAC9B,CAAC;QAED,wDAAwD;QACxD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE;qBACpB,OAAO,CAAC,kBAAkB,QAAQ,EAAE,CAAC;qBACrC,GAAG,EAA2B,CAAC;gBAClC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;oBAC1B,uCAAuC;oBACvC,IAAI,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,gCAAgC;YAClC,CAAC;QACH,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACH,8BAA8B;QAC5B,OAAO,IAAI,CAAC,uBAAuB,CACjC,oBAAoB,EACpB,YAAY,EACZ,wBAAwB,EACxB,MAAM,CACP,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,+BAA+B;QAC7B,OAAO,IAAI,CAAC,uBAAuB,CACjC,qBAAqB,EACrB,aAAa,EACb,yBAAyB,EACzB,MAAM,CACP,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,8BAA8B;QAC5B,OAAO,IAAI,CAAC,uBAAuB,CACjC,oBAAoB,EACpB,YAAY,EACZ,wBAAwB,EACxB,MAAM,CACP,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,UAAkB;QACxC,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACvD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,6BAA6B,CAAC,UAAU,CAAC,CAAC;QAC7D,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;IACnC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,qBAAqB,CACzB,SAAiB,EACjB,OAAe,EACf,SAAuB,EACvB,YAAoB,kBAAkB;QAEtC,MAAM,OAAO,GAAG,OAAO,SAAS,EAAE,CAAC;QAEnC,4DAA4D;QAC5D,yEAAyE;QACzE,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAEhE,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,kDAAkD;YAClD,IAAI,CAAC;gBACH,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;gBACxE,2DAA2D;gBAC3D,OAAO;YACT,CAAC;YAED,oEAAoE;YACpE,IAAI,CAAC;gBACH,oEAAoE;gBACpE,IAAI,CAAC;oBACH,IAAI,CAAC,EAAE;yBACJ,OAAO,CAAC,iDAAiD,CAAC;yBAC1D,GAAG,CAAC,OAAO,CAAC,CAAC;gBAClB,CAAC;gBAAC,OAAO,YAAY,EAAE,CAAC;oBACtB,iCAAiC;gBACnC,CAAC;gBAED,+BAA+B;gBAC/B,IAAI,CAAC,EAAE;qBACJ,OAAO,CACN,kEAAkE,CACnE;qBACA,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,wCAAwC;gBACxC,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,CAAC;gBAC9C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBAChD,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,YAAY,CAAC,CAAC;gBAChF,CAAC;gBACD,kEAAkE;YACpE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CACtB,SAAiB,EACjB,OAAe,EACf,SAAuB,EACvB,SAAiB;QAEjB,IAAI,CAAC,EAAE;aACJ,OAAO,CACN;;;;;;;;4CAQoC,CACrC;aACA,GAAG,CACF,OAAO,SAAS,EAAE,EAClB,SAAS,EACT,OAAO,EACP,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,EACpC,SAAS,EACT,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;IACN,CAAC;IAED;;;;;;;;;OASG;IACK,oBAAoB,CAC1B,QAAgB,EAChB,SAAuB,EACvB,SAAiB,EACjB,QAAgB,EAChB,QAAgB,EAChB,MAAc,EACd,UAAkB;QAElB,MAAM,OAAO,GAAG,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;QAEvC,sBAAsB;QACtB,IAAI,CAAC,EAAE;aACJ,OAAO,CACN,eAAe,SAAS;gBAChB,QAAQ;;;aAGX,QAAQ,eAAe,QAAQ;;4CAEA,CACrC;aACA,GAAG,CACF,OAAO,EACP,QAAQ,EACR,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,EACpC,IAAI,CAAC,GAAG,EAAE,CACX,CAAC;QAEJ,wCAAwC;QACxC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACvC,IAAI,CAAC;oBACH,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,QAAQ,eAAe,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACvE,CAAC;gBAAC,OAAO,EAAE,EAAE,CAAC;oBACZ,iCAAiC;gBACnC,CAAC;gBACD,IAAI,CAAC,EAAE;qBACJ,OAAO,CAAC,eAAe,QAAQ,gCAAgC,CAAC;qBAChE,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,CAAC;gBAC9C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBAChD,OAAO,CAAC,KAAK,CAAC,OAAO,UAAU,4BAA4B,EAAE,YAAY,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB,CAC1B,UAAkB,EAClB,SAAuB;QAEvB,IAAI,CAAC,oBAAoB,CACvB,UAAU,EACV,SAAS,EACT,qBAAqB,EACrB,aAAa,EACb,yBAAyB,EACzB,MAAM,EACN,UAAU,CACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,qBAAqB,CACzB,SAAiB,EACjB,SAAuB;QAEvB,IAAI,CAAC,oBAAoB,CACvB,SAAS,EACT,SAAS,EACT,oBAAoB,EACpB,YAAY,EACZ,wBAAwB,EACxB,MAAM,EACN,SAAS,CACV,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,cAA4B,EAC5B,QAAgB,EAAE;QAElB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,sBAAsB,CAC5B,cAA4B,EAC5B,KAAa;QAEb,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;YAE9D,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE;iBACpB,OAAO,CACN;;;;;;;kBAOQ,CACT;iBACA,GAAG,CAAC,WAAW,EAAE,KAAK,CAIvB,CAAC;YAEH,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC5B,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,iCAAiC;aAC9D,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,qBAAqB;YACrB,OAAO,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CACtB,cAA4B,EAC5B,KAAa;QAEb,MAAM,aAAa,GAAG,IAAI,CAAC,EAAE;aAC1B,OAAO,CAAC,mEAAmE,CAAC;aAC5E,GAAG,EAKJ,CAAC;QAEH,MAAM,OAAO,GAAG,aAAa;aAC1B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACX,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;YAEpE,OAAO;gBACL,EAAE,EAAE,GAAG,CAAC,UAAU;gBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,UAAU;aACX,CAAC;QACJ,CAAC,CAAC;aACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;aAC3C,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAEnB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,CAAe,EAAE,CAAe;QACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QAED,gDAAgD;QAChD,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,CAAC;QACX,CAAC;QAED,OAAO,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,KAAmB;QAC9C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,MAAc;QACzC,+DAA+D;QAC/D,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,kCAAkC,MAAM,CAAC,UAAU,6BAA6B,CAAC,CAAC;YAChG,OAAO,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,oEAAoE;QACpE,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,gBAAgB;QAC7D,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,OAAO,CAAC,kDAAkD,CAAC;aAC3D,GAAG,EAAuB,CAAC;QAC9B,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,4BAA4B;QAC9B,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,+BAA+B;YACjC,CAAC;YACD,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,+BAA+B;YACjC,CAAC;YACD,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,+BAA+B;YACjC,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama Embeddings Provider
|
|
3
|
+
* Uses local Ollama API for embeddings
|
|
4
|
+
*/
|
|
5
|
+
import type { EmbeddingProvider, ModelInfo } from "../EmbeddingProvider.js";
|
|
6
|
+
export declare class OllamaEmbeddings implements EmbeddingProvider {
|
|
7
|
+
private baseUrl;
|
|
8
|
+
private model;
|
|
9
|
+
private dimensions;
|
|
10
|
+
private available;
|
|
11
|
+
private initializationError;
|
|
12
|
+
constructor(baseUrl?: string, model?: string, dimensions?: number);
|
|
13
|
+
/**
|
|
14
|
+
* Initialize by checking if Ollama is available
|
|
15
|
+
*/
|
|
16
|
+
initialize(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Check if embeddings are available
|
|
19
|
+
*/
|
|
20
|
+
isAvailable(): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Generate embedding for a single text
|
|
23
|
+
*/
|
|
24
|
+
embed(text: string): Promise<Float32Array>;
|
|
25
|
+
/**
|
|
26
|
+
* Generate embeddings for multiple texts (batched)
|
|
27
|
+
*/
|
|
28
|
+
embedBatch(texts: string[], batchSize?: number): Promise<Float32Array[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Get model information
|
|
31
|
+
*/
|
|
32
|
+
getModelInfo(): ModelInfo;
|
|
33
|
+
/**
|
|
34
|
+
* Get default dimensions for common Ollama models using ModelRegistry
|
|
35
|
+
*/
|
|
36
|
+
private getDefaultDimensions;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=OllamaEmbeddings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OllamaEmbeddings.d.ts","sourceRoot":"","sources":["../../../src/embeddings/providers/OllamaEmbeddings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAO5E,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,mBAAmB,CAAsB;gBAErC,OAAO,GAAE,MAAiC,EAAE,KAAK,GAAE,MAA4B,EAAE,UAAU,CAAC,EAAE,MAAM;IAMhH;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCjC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA+BhD;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,GAAE,MAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA0BlF;;OAEG;IACH,YAAY,IAAI,SAAS;IASzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAa7B"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama Embeddings Provider
|
|
3
|
+
* Uses local Ollama API for embeddings
|
|
4
|
+
*/
|
|
5
|
+
import { getModelDimensions } from "../ModelRegistry.js";
|
|
6
|
+
export class OllamaEmbeddings {
|
|
7
|
+
baseUrl;
|
|
8
|
+
model;
|
|
9
|
+
dimensions;
|
|
10
|
+
available = false;
|
|
11
|
+
initializationError = null;
|
|
12
|
+
constructor(baseUrl = "http://localhost:11434", model = "mxbai-embed-large", dimensions) {
|
|
13
|
+
this.baseUrl = baseUrl.replace(/\/$/, ""); // Remove trailing slash
|
|
14
|
+
this.model = model;
|
|
15
|
+
this.dimensions = dimensions || this.getDefaultDimensions(model);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Initialize by checking if Ollama is available
|
|
19
|
+
*/
|
|
20
|
+
async initialize() {
|
|
21
|
+
try {
|
|
22
|
+
// Check if Ollama is running
|
|
23
|
+
const response = await fetch(`${this.baseUrl}/api/tags`, {
|
|
24
|
+
method: "GET",
|
|
25
|
+
});
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
throw new Error(`Ollama API returned ${response.status}`);
|
|
28
|
+
}
|
|
29
|
+
// Check if model is available
|
|
30
|
+
const data = (await response.json());
|
|
31
|
+
const hasModel = data.models.some((m) => m.name.includes(this.model));
|
|
32
|
+
if (!hasModel) {
|
|
33
|
+
console.error(`⚠️ Model '${this.model}' not found in Ollama. Available models: ${data.models.map((m) => m.name).join(", ")}`);
|
|
34
|
+
console.error(` Pull the model with: ollama pull ${this.model}`);
|
|
35
|
+
throw new Error(`Model ${this.model} not available in Ollama`);
|
|
36
|
+
}
|
|
37
|
+
this.available = true;
|
|
38
|
+
console.error(`✓ Ollama embeddings ready (${this.model})`);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
this.initializationError = error;
|
|
42
|
+
this.available = false;
|
|
43
|
+
console.error("⚠️ Ollama not available:", error.message);
|
|
44
|
+
console.error(" Make sure Ollama is running: ollama serve");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check if embeddings are available
|
|
49
|
+
*/
|
|
50
|
+
isAvailable() {
|
|
51
|
+
return this.available;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Generate embedding for a single text
|
|
55
|
+
*/
|
|
56
|
+
async embed(text) {
|
|
57
|
+
if (!this.available) {
|
|
58
|
+
throw new Error(`Ollama embeddings not available: ${this.initializationError?.message || "Not initialized"}`);
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const response = await fetch(`${this.baseUrl}/api/embeddings`, {
|
|
62
|
+
method: "POST",
|
|
63
|
+
headers: {
|
|
64
|
+
"Content-Type": "application/json",
|
|
65
|
+
},
|
|
66
|
+
body: JSON.stringify({
|
|
67
|
+
model: this.model,
|
|
68
|
+
prompt: text,
|
|
69
|
+
}),
|
|
70
|
+
});
|
|
71
|
+
if (!response.ok) {
|
|
72
|
+
throw new Error(`Ollama API error: ${response.status} ${response.statusText}`);
|
|
73
|
+
}
|
|
74
|
+
const data = (await response.json());
|
|
75
|
+
return new Float32Array(data.embedding);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error("Error generating embedding with Ollama:", error);
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Generate embeddings for multiple texts (batched)
|
|
84
|
+
*/
|
|
85
|
+
async embedBatch(texts, batchSize = 32) {
|
|
86
|
+
if (!this.available) {
|
|
87
|
+
throw new Error("Ollama embeddings not initialized");
|
|
88
|
+
}
|
|
89
|
+
const embeddings = [];
|
|
90
|
+
// Process in batches
|
|
91
|
+
for (let i = 0; i < texts.length; i += batchSize) {
|
|
92
|
+
const batch = texts.slice(i, i + batchSize);
|
|
93
|
+
console.error(`Generating embeddings for batch ${Math.floor(i / batchSize) + 1}/${Math.ceil(texts.length / batchSize)} (Ollama)`);
|
|
94
|
+
// Ollama doesn't have batch endpoint, so we do parallel requests
|
|
95
|
+
const batchEmbeddings = await Promise.all(batch.map((text) => this.embed(text)));
|
|
96
|
+
embeddings.push(...batchEmbeddings);
|
|
97
|
+
}
|
|
98
|
+
return embeddings;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get model information
|
|
102
|
+
*/
|
|
103
|
+
getModelInfo() {
|
|
104
|
+
return {
|
|
105
|
+
provider: "ollama",
|
|
106
|
+
model: this.model,
|
|
107
|
+
dimensions: this.dimensions,
|
|
108
|
+
available: this.available,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get default dimensions for common Ollama models using ModelRegistry
|
|
113
|
+
*/
|
|
114
|
+
getDefaultDimensions(model) {
|
|
115
|
+
// Try to get dimensions from ModelRegistry
|
|
116
|
+
const dimensions = getModelDimensions(model);
|
|
117
|
+
if (dimensions) {
|
|
118
|
+
return dimensions;
|
|
119
|
+
}
|
|
120
|
+
// Default to 768 if unknown (most common for Ollama models)
|
|
121
|
+
console.error(`Unknown model dimensions for '${model}', defaulting to 768. Specify dimensions in config if different.`);
|
|
122
|
+
return 768;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=OllamaEmbeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OllamaEmbeddings.js","sourceRoot":"","sources":["../../../src/embeddings/providers/OllamaEmbeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Embeddings Provider
|
|
3
|
+
* Uses OpenAI API for high-quality embeddings
|
|
4
|
+
*/
|
|
5
|
+
import type { EmbeddingProvider, ModelInfo } from "../EmbeddingProvider.js";
|
|
6
|
+
export declare class OpenAIEmbeddings implements EmbeddingProvider {
|
|
7
|
+
private client;
|
|
8
|
+
private model;
|
|
9
|
+
private dimensions;
|
|
10
|
+
private apiKey;
|
|
11
|
+
private available;
|
|
12
|
+
private initializationError;
|
|
13
|
+
constructor(apiKey: string, model?: string, dimensions?: number);
|
|
14
|
+
/**
|
|
15
|
+
* Initialize OpenAI client
|
|
16
|
+
*/
|
|
17
|
+
initialize(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Check if embeddings are available
|
|
20
|
+
*/
|
|
21
|
+
isAvailable(): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Generate embedding for a single text
|
|
24
|
+
*/
|
|
25
|
+
embed(text: string): Promise<Float32Array>;
|
|
26
|
+
/**
|
|
27
|
+
* Generate embeddings for multiple texts (batched)
|
|
28
|
+
* OpenAI supports batch requests natively
|
|
29
|
+
*/
|
|
30
|
+
embedBatch(texts: string[], batchSize?: number): Promise<Float32Array[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Get model information
|
|
33
|
+
*/
|
|
34
|
+
getModelInfo(): ModelInfo;
|
|
35
|
+
/**
|
|
36
|
+
* Get default dimensions for OpenAI models using ModelRegistry
|
|
37
|
+
*/
|
|
38
|
+
private getDefaultDimensions;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=OpenAIEmbeddings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenAIEmbeddings.d.ts","sourceRoot":"","sources":["../../../src/embeddings/providers/OpenAIEmbeddings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAe5E,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,mBAAmB,CAAsB;gBAErC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAiC,EAAE,UAAU,CAAC,EAAE,MAAM;IAMzF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCjC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAoBhD;;;OAGG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,GAAE,MAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoCnF;;OAEG;IACH,YAAY,IAAI,SAAS;IASzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAU7B"}
|