agentic-qe 2.8.1 → 2.8.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.
- package/CHANGELOG.md +43 -0
- package/README.md +1 -1
- package/dist/agents/BaseAgent.d.ts +201 -0
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +401 -0
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/code-intelligence/embeddings/EmbeddingCacheFactory.d.ts +135 -0
- package/dist/code-intelligence/embeddings/EmbeddingCacheFactory.d.ts.map +1 -0
- package/dist/code-intelligence/embeddings/EmbeddingCacheFactory.js +301 -0
- package/dist/code-intelligence/embeddings/EmbeddingCacheFactory.js.map +1 -0
- package/dist/code-intelligence/embeddings/NomicEmbedder.d.ts +78 -6
- package/dist/code-intelligence/embeddings/NomicEmbedder.d.ts.map +1 -1
- package/dist/code-intelligence/embeddings/NomicEmbedder.js +162 -21
- package/dist/code-intelligence/embeddings/NomicEmbedder.js.map +1 -1
- package/dist/code-intelligence/embeddings/backends/MemoryBackend.d.ts +59 -0
- package/dist/code-intelligence/embeddings/backends/MemoryBackend.d.ts.map +1 -0
- package/dist/code-intelligence/embeddings/backends/MemoryBackend.js +173 -0
- package/dist/code-intelligence/embeddings/backends/MemoryBackend.js.map +1 -0
- package/dist/code-intelligence/embeddings/backends/RedisBackend.d.ts +50 -0
- package/dist/code-intelligence/embeddings/backends/RedisBackend.d.ts.map +1 -0
- package/dist/code-intelligence/embeddings/backends/RedisBackend.js +279 -0
- package/dist/code-intelligence/embeddings/backends/RedisBackend.js.map +1 -0
- package/dist/code-intelligence/embeddings/backends/SQLiteBackend.d.ts +64 -0
- package/dist/code-intelligence/embeddings/backends/SQLiteBackend.d.ts.map +1 -0
- package/dist/code-intelligence/embeddings/backends/SQLiteBackend.js +314 -0
- package/dist/code-intelligence/embeddings/backends/SQLiteBackend.js.map +1 -0
- package/dist/code-intelligence/embeddings/backends/index.d.ts +16 -0
- package/dist/code-intelligence/embeddings/backends/index.d.ts.map +1 -0
- package/dist/code-intelligence/embeddings/backends/index.js +28 -0
- package/dist/code-intelligence/embeddings/backends/index.js.map +1 -0
- package/dist/code-intelligence/embeddings/backends/types.d.ts +177 -0
- package/dist/code-intelligence/embeddings/backends/types.d.ts.map +1 -0
- package/dist/code-intelligence/embeddings/backends/types.js +30 -0
- package/dist/code-intelligence/embeddings/backends/types.js.map +1 -0
- package/dist/code-intelligence/embeddings/index.d.ts +7 -0
- package/dist/code-intelligence/embeddings/index.d.ts.map +1 -1
- package/dist/code-intelligence/embeddings/index.js +16 -1
- package/dist/code-intelligence/embeddings/index.js.map +1 -1
- package/dist/core/memory/HNSWVectorMemory.js +1 -1
- package/dist/infrastructure/index.d.ts +15 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +44 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/infrastructure/network/AgentRateLimiter.d.ts +59 -0
- package/dist/infrastructure/network/AgentRateLimiter.d.ts.map +1 -0
- package/dist/infrastructure/network/AgentRateLimiter.js +186 -0
- package/dist/infrastructure/network/AgentRateLimiter.js.map +1 -0
- package/dist/infrastructure/network/AuditLogger.d.ts +102 -0
- package/dist/infrastructure/network/AuditLogger.d.ts.map +1 -0
- package/dist/infrastructure/network/AuditLogger.js +284 -0
- package/dist/infrastructure/network/AuditLogger.js.map +1 -0
- package/dist/infrastructure/network/DomainWhitelist.d.ts +111 -0
- package/dist/infrastructure/network/DomainWhitelist.d.ts.map +1 -0
- package/dist/infrastructure/network/DomainWhitelist.js +216 -0
- package/dist/infrastructure/network/DomainWhitelist.js.map +1 -0
- package/dist/infrastructure/network/NetworkPolicyManager.d.ts +97 -0
- package/dist/infrastructure/network/NetworkPolicyManager.d.ts.map +1 -0
- package/dist/infrastructure/network/NetworkPolicyManager.js +309 -0
- package/dist/infrastructure/network/NetworkPolicyManager.js.map +1 -0
- package/dist/infrastructure/network/index.d.ts +19 -0
- package/dist/infrastructure/network/index.d.ts.map +1 -0
- package/dist/infrastructure/network/index.js +46 -0
- package/dist/infrastructure/network/index.js.map +1 -0
- package/dist/infrastructure/network/policies/default-policies.d.ts +78 -0
- package/dist/infrastructure/network/policies/default-policies.d.ts.map +1 -0
- package/dist/infrastructure/network/policies/default-policies.js +312 -0
- package/dist/infrastructure/network/policies/default-policies.js.map +1 -0
- package/dist/infrastructure/network/types.d.ts +214 -0
- package/dist/infrastructure/network/types.d.ts.map +1 -0
- package/dist/infrastructure/network/types.js +25 -0
- package/dist/infrastructure/network/types.js.map +1 -0
- package/dist/infrastructure/sandbox/ResourceMonitor.d.ts +124 -0
- package/dist/infrastructure/sandbox/ResourceMonitor.d.ts.map +1 -0
- package/dist/infrastructure/sandbox/ResourceMonitor.js +305 -0
- package/dist/infrastructure/sandbox/ResourceMonitor.js.map +1 -0
- package/dist/infrastructure/sandbox/SandboxManager.d.ts +122 -0
- package/dist/infrastructure/sandbox/SandboxManager.d.ts.map +1 -0
- package/dist/infrastructure/sandbox/SandboxManager.js +527 -0
- package/dist/infrastructure/sandbox/SandboxManager.js.map +1 -0
- package/dist/infrastructure/sandbox/index.d.ts +18 -0
- package/dist/infrastructure/sandbox/index.d.ts.map +1 -0
- package/dist/infrastructure/sandbox/index.js +38 -0
- package/dist/infrastructure/sandbox/index.js.map +1 -0
- package/dist/infrastructure/sandbox/profiles/agent-profiles.d.ts +53 -0
- package/dist/infrastructure/sandbox/profiles/agent-profiles.d.ts.map +1 -0
- package/dist/infrastructure/sandbox/profiles/agent-profiles.js +433 -0
- package/dist/infrastructure/sandbox/profiles/agent-profiles.js.map +1 -0
- package/dist/infrastructure/sandbox/types.d.ts +227 -0
- package/dist/infrastructure/sandbox/types.d.ts.map +1 -0
- package/dist/infrastructure/sandbox/types.js +63 -0
- package/dist/infrastructure/sandbox/types.js.map +1 -0
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/persistence/SupabasePersistenceProvider.d.ts.map +1 -1
- package/dist/persistence/SupabasePersistenceProvider.js +8 -4
- package/dist/persistence/SupabasePersistenceProvider.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Embedding Cache Factory
|
|
4
|
+
*
|
|
5
|
+
* Creates embedding caches with configurable backends and auto-pruning.
|
|
6
|
+
* Provides unified interface for memory, Redis, and SQLite backends.
|
|
7
|
+
*
|
|
8
|
+
* @module code-intelligence/embeddings/EmbeddingCacheFactory
|
|
9
|
+
* @see Issue #146 - Security Hardening: SP-2 Dedicated Embedding Cache
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.EnhancedEmbeddingCache = exports.DEFAULT_CACHE_CONFIG = void 0;
|
|
13
|
+
exports.createBackend = createBackend;
|
|
14
|
+
exports.createEmbeddingCache = createEmbeddingCache;
|
|
15
|
+
exports.createMemoryCache = createMemoryCache;
|
|
16
|
+
exports.createRedisCache = createRedisCache;
|
|
17
|
+
exports.createSQLiteCache = createSQLiteCache;
|
|
18
|
+
const types_js_1 = require("./backends/types.js");
|
|
19
|
+
const MemoryBackend_js_1 = require("./backends/MemoryBackend.js");
|
|
20
|
+
const RedisBackend_js_1 = require("./backends/RedisBackend.js");
|
|
21
|
+
const SQLiteBackend_js_1 = require("./backends/SQLiteBackend.js");
|
|
22
|
+
const crypto_1 = require("crypto");
|
|
23
|
+
/**
|
|
24
|
+
* Default cache configuration
|
|
25
|
+
*/
|
|
26
|
+
exports.DEFAULT_CACHE_CONFIG = {
|
|
27
|
+
backend: 'memory',
|
|
28
|
+
maxSize: types_js_1.DEFAULT_MAX_SIZE,
|
|
29
|
+
ttlMs: types_js_1.DEFAULT_TTL_MS,
|
|
30
|
+
autoPruneIntervalMs: 60 * 60 * 1000, // 1 hour
|
|
31
|
+
debug: false,
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Enhanced Embedding Cache with pluggable backends
|
|
35
|
+
*
|
|
36
|
+
* Features:
|
|
37
|
+
* - Pluggable backends (memory, Redis, SQLite)
|
|
38
|
+
* - Content hash-based deduplication
|
|
39
|
+
* - Automatic TTL-based expiration
|
|
40
|
+
* - Auto-pruning scheduler
|
|
41
|
+
* - Cache statistics
|
|
42
|
+
*/
|
|
43
|
+
class EnhancedEmbeddingCache {
|
|
44
|
+
constructor(backend, config = {}) {
|
|
45
|
+
this.pruneInterval = null;
|
|
46
|
+
this.hits = 0;
|
|
47
|
+
this.misses = 0;
|
|
48
|
+
this.initialized = false;
|
|
49
|
+
this.backend = backend;
|
|
50
|
+
this.config = { ...exports.DEFAULT_CACHE_CONFIG, ...config };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Initialize the cache and start auto-pruning
|
|
54
|
+
*/
|
|
55
|
+
async initialize() {
|
|
56
|
+
if (this.initialized)
|
|
57
|
+
return;
|
|
58
|
+
await this.backend.initialize();
|
|
59
|
+
// Start auto-pruning if configured
|
|
60
|
+
if (this.config.autoPruneIntervalMs > 0) {
|
|
61
|
+
this.startAutoPrune();
|
|
62
|
+
}
|
|
63
|
+
this.initialized = true;
|
|
64
|
+
this.log('Cache initialized');
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Close the cache and stop auto-pruning
|
|
68
|
+
*/
|
|
69
|
+
async close() {
|
|
70
|
+
this.stopAutoPrune();
|
|
71
|
+
await this.backend.close();
|
|
72
|
+
this.initialized = false;
|
|
73
|
+
this.log('Cache closed');
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Generate content hash for cache key
|
|
77
|
+
*/
|
|
78
|
+
hashContent(content, model) {
|
|
79
|
+
return (0, crypto_1.createHash)('sha256')
|
|
80
|
+
.update(`${model}:${content}`)
|
|
81
|
+
.digest('hex');
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get cached embedding
|
|
85
|
+
*/
|
|
86
|
+
async get(content, model) {
|
|
87
|
+
const key = this.hashContent(content, model);
|
|
88
|
+
const entry = await this.backend.get(key);
|
|
89
|
+
if (entry) {
|
|
90
|
+
this.hits++;
|
|
91
|
+
return entry.embedding;
|
|
92
|
+
}
|
|
93
|
+
this.misses++;
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Store embedding in cache
|
|
98
|
+
*/
|
|
99
|
+
async set(content, model, embedding) {
|
|
100
|
+
const key = this.hashContent(content, model);
|
|
101
|
+
const entry = {
|
|
102
|
+
embedding,
|
|
103
|
+
timestamp: Date.now(),
|
|
104
|
+
model,
|
|
105
|
+
};
|
|
106
|
+
await this.backend.set(key, entry);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if embedding is cached
|
|
110
|
+
*/
|
|
111
|
+
async has(content, model) {
|
|
112
|
+
const key = this.hashContent(content, model);
|
|
113
|
+
return this.backend.has(key);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Delete cached embedding
|
|
117
|
+
*/
|
|
118
|
+
async delete(content, model) {
|
|
119
|
+
const key = this.hashContent(content, model);
|
|
120
|
+
return this.backend.delete(key);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Clear all cached embeddings
|
|
124
|
+
*/
|
|
125
|
+
async clear() {
|
|
126
|
+
await this.backend.clear();
|
|
127
|
+
this.hits = 0;
|
|
128
|
+
this.misses = 0;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get cache statistics
|
|
132
|
+
*/
|
|
133
|
+
async getStats() {
|
|
134
|
+
const size = await this.backend.size();
|
|
135
|
+
const total = this.hits + this.misses;
|
|
136
|
+
const hitRate = total > 0 ? this.hits / total : 0;
|
|
137
|
+
return {
|
|
138
|
+
size,
|
|
139
|
+
hitRate,
|
|
140
|
+
hits: this.hits,
|
|
141
|
+
misses: this.misses,
|
|
142
|
+
backendType: this.config.backend,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Batch check for multiple contents
|
|
147
|
+
*/
|
|
148
|
+
async batchHas(contents, model) {
|
|
149
|
+
const results = new Map();
|
|
150
|
+
// Process in parallel with Promise.all
|
|
151
|
+
const checks = contents.map(async (content) => {
|
|
152
|
+
const exists = await this.has(content, model);
|
|
153
|
+
return { content, exists };
|
|
154
|
+
});
|
|
155
|
+
const resolved = await Promise.all(checks);
|
|
156
|
+
for (const { content, exists } of resolved) {
|
|
157
|
+
results.set(content, exists);
|
|
158
|
+
}
|
|
159
|
+
return results;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Batch get for multiple contents
|
|
163
|
+
*/
|
|
164
|
+
async batchGet(contents, model) {
|
|
165
|
+
const results = new Map();
|
|
166
|
+
const gets = contents.map(async (content) => {
|
|
167
|
+
const embedding = await this.get(content, model);
|
|
168
|
+
return { content, embedding };
|
|
169
|
+
});
|
|
170
|
+
const resolved = await Promise.all(gets);
|
|
171
|
+
for (const { content, embedding } of resolved) {
|
|
172
|
+
results.set(content, embedding);
|
|
173
|
+
}
|
|
174
|
+
return results;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Prune expired entries
|
|
178
|
+
*/
|
|
179
|
+
async prune() {
|
|
180
|
+
return this.backend.pruneExpired(this.config.ttlMs);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Check if backend is healthy
|
|
184
|
+
*/
|
|
185
|
+
async isHealthy() {
|
|
186
|
+
return this.backend.isHealthy();
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get backend name
|
|
190
|
+
*/
|
|
191
|
+
getBackendName() {
|
|
192
|
+
return this.backend.name;
|
|
193
|
+
}
|
|
194
|
+
// ============================================
|
|
195
|
+
// Auto-Pruning
|
|
196
|
+
// ============================================
|
|
197
|
+
startAutoPrune() {
|
|
198
|
+
if (this.pruneInterval)
|
|
199
|
+
return;
|
|
200
|
+
this.pruneInterval = setInterval(async () => {
|
|
201
|
+
try {
|
|
202
|
+
const pruned = await this.prune();
|
|
203
|
+
if (pruned > 0) {
|
|
204
|
+
this.log(`Auto-pruned ${pruned} expired entries`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
this.log(`Auto-prune error: ${error.message}`);
|
|
209
|
+
}
|
|
210
|
+
}, this.config.autoPruneIntervalMs);
|
|
211
|
+
this.log(`Auto-pruning started (interval: ${this.config.autoPruneIntervalMs}ms)`);
|
|
212
|
+
}
|
|
213
|
+
stopAutoPrune() {
|
|
214
|
+
if (this.pruneInterval) {
|
|
215
|
+
clearInterval(this.pruneInterval);
|
|
216
|
+
this.pruneInterval = null;
|
|
217
|
+
this.log('Auto-pruning stopped');
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
log(message) {
|
|
221
|
+
if (this.config.debug) {
|
|
222
|
+
console.log(`[EmbeddingCache:${this.backend.name}] ${message}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
exports.EnhancedEmbeddingCache = EnhancedEmbeddingCache;
|
|
227
|
+
// ============================================
|
|
228
|
+
// Factory Functions
|
|
229
|
+
// ============================================
|
|
230
|
+
/**
|
|
231
|
+
* Create a backend instance based on configuration
|
|
232
|
+
*/
|
|
233
|
+
function createBackend(config) {
|
|
234
|
+
switch (config.backend) {
|
|
235
|
+
case 'memory':
|
|
236
|
+
return new MemoryBackend_js_1.MemoryStorageBackend({
|
|
237
|
+
maxSize: config.maxSize,
|
|
238
|
+
defaultTtlMs: config.ttlMs,
|
|
239
|
+
debug: config.debug,
|
|
240
|
+
...config.memory,
|
|
241
|
+
});
|
|
242
|
+
case 'redis':
|
|
243
|
+
if (!config.redis) {
|
|
244
|
+
throw new Error('Redis backend requires redis configuration');
|
|
245
|
+
}
|
|
246
|
+
return new RedisBackend_js_1.RedisStorageBackend({
|
|
247
|
+
...config.redis,
|
|
248
|
+
maxSize: config.maxSize,
|
|
249
|
+
defaultTtlMs: config.ttlMs,
|
|
250
|
+
debug: config.debug,
|
|
251
|
+
});
|
|
252
|
+
case 'sqlite':
|
|
253
|
+
if (!config.sqlite) {
|
|
254
|
+
throw new Error('SQLite backend requires sqlite configuration');
|
|
255
|
+
}
|
|
256
|
+
return new SQLiteBackend_js_1.SQLiteStorageBackend({
|
|
257
|
+
...config.sqlite,
|
|
258
|
+
maxSize: config.maxSize,
|
|
259
|
+
defaultTtlMs: config.ttlMs,
|
|
260
|
+
debug: config.debug,
|
|
261
|
+
});
|
|
262
|
+
default:
|
|
263
|
+
throw new Error(`Unknown backend type: ${config.backend}`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Create an embedding cache with the specified configuration
|
|
268
|
+
*/
|
|
269
|
+
function createEmbeddingCache(config = {}) {
|
|
270
|
+
const fullConfig = { ...exports.DEFAULT_CACHE_CONFIG, ...config };
|
|
271
|
+
const backend = createBackend(fullConfig);
|
|
272
|
+
return new EnhancedEmbeddingCache(backend, fullConfig);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Create a memory-backed embedding cache
|
|
276
|
+
*/
|
|
277
|
+
function createMemoryCache(options = {}) {
|
|
278
|
+
return createEmbeddingCache({
|
|
279
|
+
backend: 'memory',
|
|
280
|
+
memory: options,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Create a Redis-backed embedding cache
|
|
285
|
+
*/
|
|
286
|
+
function createRedisCache(options) {
|
|
287
|
+
return createEmbeddingCache({
|
|
288
|
+
backend: 'redis',
|
|
289
|
+
redis: options,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Create a SQLite-backed embedding cache
|
|
294
|
+
*/
|
|
295
|
+
function createSQLiteCache(options) {
|
|
296
|
+
return createEmbeddingCache({
|
|
297
|
+
backend: 'sqlite',
|
|
298
|
+
sqlite: options,
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=EmbeddingCacheFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbeddingCacheFactory.js","sourceRoot":"","sources":["../../../src/code-intelligence/embeddings/EmbeddingCacheFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,13 +8,81 @@
|
|
|
8
8
|
* - Embedding caching with content hashing
|
|
9
9
|
* - Progress tracking for large batches
|
|
10
10
|
* - Error handling and retries
|
|
11
|
+
* - Pluggable storage backends (SP-2 - Issue #146)
|
|
11
12
|
*/
|
|
12
|
-
import {
|
|
13
|
+
import { EmbeddingCache } from './EmbeddingCache';
|
|
14
|
+
import { EnhancedEmbeddingCache, type EmbeddingCacheConfig } from './EmbeddingCacheFactory.js';
|
|
15
|
+
import type { BackendType } from './backends/types.js';
|
|
16
|
+
import { CodeChunk, EmbeddingBatchResult, ProgressCallback, CacheStats } from './types';
|
|
17
|
+
/**
|
|
18
|
+
* Configuration for NomicEmbedder
|
|
19
|
+
*/
|
|
20
|
+
export interface NomicEmbedderConfig {
|
|
21
|
+
/** Ollama base URL (default: http://localhost:11434) */
|
|
22
|
+
ollamaBaseUrl?: string;
|
|
23
|
+
/** Batch size for processing (default: 100) */
|
|
24
|
+
batchSize?: number;
|
|
25
|
+
/** Maximum cache size for memory backend (default: 10000) */
|
|
26
|
+
maxCacheSize?: number;
|
|
27
|
+
/**
|
|
28
|
+
* Storage backend type (SP-2 - Issue #146)
|
|
29
|
+
* - 'memory': In-memory with LRU (default, backward compatible)
|
|
30
|
+
* - 'redis': Distributed caching (requires Redis config)
|
|
31
|
+
* - 'sqlite': Persistent local storage
|
|
32
|
+
*/
|
|
33
|
+
cacheBackend?: BackendType;
|
|
34
|
+
/** Full cache configuration for advanced setups */
|
|
35
|
+
cacheConfig?: Partial<EmbeddingCacheConfig>;
|
|
36
|
+
/** Pre-configured cache instance (for dependency injection) */
|
|
37
|
+
cache?: EmbeddingCache | EnhancedEmbeddingCache;
|
|
38
|
+
}
|
|
13
39
|
export declare class NomicEmbedder {
|
|
14
40
|
private client;
|
|
15
41
|
private cache;
|
|
42
|
+
private enhancedCache?;
|
|
16
43
|
private batchSize;
|
|
17
|
-
|
|
44
|
+
private cacheInitialized;
|
|
45
|
+
/**
|
|
46
|
+
* Create a NomicEmbedder instance
|
|
47
|
+
*
|
|
48
|
+
* @example Basic usage (backward compatible):
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const embedder = new NomicEmbedder();
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* @example With configuration object:
|
|
54
|
+
* ```typescript
|
|
55
|
+
* const embedder = new NomicEmbedder({
|
|
56
|
+
* ollamaBaseUrl: 'http://localhost:11434',
|
|
57
|
+
* cacheBackend: 'sqlite',
|
|
58
|
+
* cacheConfig: { sqlite: { dbPath: './data/embeddings.db' } }
|
|
59
|
+
* });
|
|
60
|
+
* await embedder.initializeCache();
|
|
61
|
+
* ```
|
|
62
|
+
*
|
|
63
|
+
* @example Legacy constructor (deprecated but supported):
|
|
64
|
+
* ```typescript
|
|
65
|
+
* const embedder = new NomicEmbedder('http://localhost:11434', 5000, 50);
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
constructor(configOrUrl?: NomicEmbedderConfig | string, maxCacheSize?: number, batchSize?: number);
|
|
69
|
+
/**
|
|
70
|
+
* Initialize the cache backend (required for Redis/SQLite)
|
|
71
|
+
* No-op for simple in-memory cache
|
|
72
|
+
*/
|
|
73
|
+
initializeCache(): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Close the cache backend and release resources
|
|
76
|
+
*/
|
|
77
|
+
closeCache(): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Check if using enhanced cache with pluggable backend
|
|
80
|
+
*/
|
|
81
|
+
isUsingEnhancedCache(): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Get the cache backend type
|
|
84
|
+
*/
|
|
85
|
+
getCacheBackendType(): string;
|
|
18
86
|
/**
|
|
19
87
|
* Generate embedding for a single text string
|
|
20
88
|
*/
|
|
@@ -35,13 +103,16 @@ export declare class NomicEmbedder {
|
|
|
35
103
|
/**
|
|
36
104
|
* Clear the embedding cache
|
|
37
105
|
*/
|
|
38
|
-
clearCache(): void
|
|
106
|
+
clearCache(): Promise<void>;
|
|
39
107
|
/**
|
|
40
108
|
* Get cache statistics
|
|
41
109
|
*/
|
|
42
|
-
getCacheStats():
|
|
110
|
+
getCacheStats(): Promise<CacheStats & {
|
|
111
|
+
backendType?: BackendType;
|
|
112
|
+
}>;
|
|
43
113
|
/**
|
|
44
114
|
* Get cache memory usage estimate
|
|
115
|
+
* Note: Only available for simple in-memory cache
|
|
45
116
|
*/
|
|
46
117
|
getCacheMemoryUsage(): number;
|
|
47
118
|
/**
|
|
@@ -54,8 +125,9 @@ export declare class NomicEmbedder {
|
|
|
54
125
|
getServerInfo(): Promise<import("./types").OllamaHealthResponse | null>;
|
|
55
126
|
/**
|
|
56
127
|
* Evict old cache entries
|
|
128
|
+
* Note: For enhanced cache with Redis/SQLite, TTL-based expiration is automatic
|
|
57
129
|
*/
|
|
58
|
-
evictOldCacheEntries(ageMs: number): number
|
|
130
|
+
evictOldCacheEntries(ageMs: number): Promise<number>;
|
|
59
131
|
/**
|
|
60
132
|
* Warmup cache with common code patterns
|
|
61
133
|
*/
|
|
@@ -67,7 +139,7 @@ export declare class NomicEmbedder {
|
|
|
67
139
|
/**
|
|
68
140
|
* Estimate total time for embedding batch
|
|
69
141
|
*/
|
|
70
|
-
estimateBatchTime(chunkCount: number, assumedTimePerEmbeddingMs?: number): number
|
|
142
|
+
estimateBatchTime(chunkCount: number, assumedTimePerEmbeddingMs?: number): Promise<number>;
|
|
71
143
|
/**
|
|
72
144
|
* Get configuration info
|
|
73
145
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NomicEmbedder.d.ts","sourceRoot":"","sources":["../../../src/code-intelligence/embeddings/NomicEmbedder.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"NomicEmbedder.d.ts","sourceRoot":"","sources":["../../../src/code-intelligence/embeddings/NomicEmbedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,sBAAsB,EAEtB,KAAK,oBAAoB,EAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACL,SAAS,EAET,oBAAoB,EAEpB,gBAAgB,EAChB,UAAU,EAEX,MAAM,SAAS,CAAC;AAYjB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,mDAAmD;IACnD,WAAW,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC5C,+DAA+D;IAC/D,KAAK,CAAC,EAAE,cAAc,GAAG,sBAAsB,CAAC;CACjD;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,aAAa,CAAC,CAAyB;IAC/C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAkB;IAE1C;;;;;;;;;;;;;;;;;;;;;;OAsBG;gBAED,WAAW,CAAC,EAAE,mBAAmB,GAAG,MAAM,EAC1C,YAAY,CAAC,EAAE,MAAM,EACrB,SAAS,GAAE,MAAoC;IAwCjD;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAI/B;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAO7B;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAyB5C;;;OAGG;IACH,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM;IAkC5C;;OAEG;IACG,UAAU,CACd,MAAM,EAAE,SAAS,EAAE,EACnB,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,CAAC,oBAAoB,CAAC;IA8DhC;;OAEG;YACW,YAAY;IAoD1B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,UAAU,GAAG;QAAE,WAAW,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC;IAQ1E;;;OAGG;IACH,mBAAmB,IAAI,MAAM;IAc7B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC;;OAEG;IACG,aAAa;IAInB;;;OAGG;IACG,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY1D;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE;IAI1C;;OAEG;IACG,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,yBAAyB,GAAE,MAAY,GACtC,OAAO,CAAC,MAAM,CAAC;IAQlB;;OAEG;IACH,SAAS;;;;;;;CASV"}
|