agentic-flow 3.4.1 → 3.4.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.
@@ -26,7 +26,7 @@ export declare function getMemoryConfig(agentName?: string): {
26
26
  * Initialize swarm coordination for multi-agent tasks
27
27
  */
28
28
  export declare function getSwarmConfig(topology?: ClaudeFlowConfig['coordinationTopology']): {
29
- topology: "hierarchical" | "mesh" | "ring" | "star";
29
+ topology: "mesh" | "hierarchical" | "ring" | "star";
30
30
  maxAgents: number;
31
31
  strategy: "balanced";
32
32
  };
@@ -5,6 +5,11 @@
5
5
  * Eliminates 2.3s overhead from process spawning and transformers.js init
6
6
  */
7
7
  import { EventEmitter } from 'events';
8
+ /**
9
+ * Thrown by storeEpisode/storePattern on the rvf backend when a metadata
10
+ * field's type differs from its first stored type; nothing was written.
11
+ */
12
+ export { RvfMetadataTypeConflictError } from 'agentdb/backends';
8
13
  /**
9
14
  * How AgentDBFast embeds text:
10
15
  * - 'auto' (default): all-MiniLM-L6-v2 via ruvector-onnx-embeddings-wasm when the
@@ -115,6 +120,10 @@ export declare class AgentDBFast extends EventEmitter {
115
120
  * semantics (similar texts do not get similar vectors).
116
121
  */
117
122
  private simpleHashEmbedding;
123
+ /** Write through the async API so an rvf type conflict rejects this call */
124
+ private insertVector;
125
+ /** agentdb filtered search (see agentdb-filtered-search.ts for the fallback) */
126
+ private search;
118
127
  /**
119
128
  * Generate unique ID
120
129
  */
@@ -1 +1 @@
1
- {"version":3,"file":"agentdb-fast.d.ts","sourceRoot":"","sources":["../../src/core/agentdb-fast.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agentdb-fast.d.ts","sourceRoot":"","sources":["../../src/core/agentdb-fast.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,12 @@
7
7
  import { AgentDB } from 'agentdb';
8
8
  import { EventEmitter } from 'events';
9
9
  import { getOnnxWasmEmbedder, ONNX_WASM_DIMENSION } from '../integrations/onnx-wasm-embedder.js';
10
+ import { filteredVectorSearch, MAX_FALLBACK_K } from './agentdb-filtered-search.js';
11
+ /**
12
+ * Thrown by storeEpisode/storePattern on the rvf backend when a metadata
13
+ * field's type differs from its first stored type; nothing was written.
14
+ */
15
+ export { RvfMetadataTypeConflictError } from 'agentdb/backends';
10
16
  /**
11
17
  * Fast AgentDB client that avoids CLI overhead
12
18
  *
@@ -42,9 +48,9 @@ export class AgentDBFast extends EventEmitter {
42
48
  return;
43
49
  try {
44
50
  // Create AgentDB instance - use any for flexible config
51
+ // agentdb reads `vectorDimension` (singular); the index is in-memory.
45
52
  this.db = new AgentDB({
46
- dimensions: this.config.vectorDimensions,
47
- storagePath: this.config.path
53
+ vectorDimension: this.config.vectorDimensions,
48
54
  });
49
55
  await this.db.initialize();
50
56
  // Access the vector backend as a direct property
@@ -75,7 +81,7 @@ export class AgentDBFast extends EventEmitter {
75
81
  if (!this.backend) {
76
82
  throw new Error('Backend not initialized');
77
83
  }
78
- await this.backend.insert(episodeId, new Float32Array(episode.embedding), {
84
+ await this.insertVector(episodeId, new Float32Array(episode.embedding), {
79
85
  type: 'episode',
80
86
  sessionId: episode.sessionId,
81
87
  task: episode.task,
@@ -96,21 +102,16 @@ export class AgentDBFast extends EventEmitter {
96
102
  const dimensions = this.config.vectorDimensions ?? 384;
97
103
  const queryEmbedding = options.task
98
104
  ? await this.getEmbedding(options.task)
99
- : Array(dimensions).fill(0);
105
+ : Array(dimensions).fill(1 / Math.sqrt(dimensions)); // no task: any direction
100
106
  const k = options.k || 5;
101
- // Build filter
102
- const filter = { type: 'episode' };
107
+ // Filter in agentdb (always by type, so patterns never come back as episodes)
108
+ const query = { equals: { type: 'episode' } };
103
109
  if (options.sessionId)
104
- filter.sessionId = options.sessionId;
105
- if (options.minReward !== undefined)
106
- filter.reward = { $gte: options.minReward };
107
- if (options.maxReward !== undefined) {
108
- filter.reward = { ...(filter.reward || {}), $lte: options.maxReward };
109
- }
110
- if (!this.backend) {
111
- throw new Error('Backend not initialized');
110
+ query.equals.sessionId = options.sessionId;
111
+ if (options.minReward !== undefined || options.maxReward !== undefined) {
112
+ query.ranges = { reward: { min: options.minReward, max: options.maxReward } };
112
113
  }
113
- const results = await this.backend.search(new Float32Array(queryEmbedding), k, { filter: Object.keys(filter).length > 1 ? filter : undefined });
114
+ const results = await this.search(queryEmbedding, k, query);
114
115
  return results.map((result) => ({
115
116
  id: result.id,
116
117
  sessionId: result.metadata.sessionId,
@@ -118,7 +119,7 @@ export class AgentDBFast extends EventEmitter {
118
119
  trajectory: JSON.parse(result.metadata.trajectory || '[]'),
119
120
  reward: result.metadata.reward,
120
121
  quality: result.metadata.quality,
121
- embedding: result.vector,
122
+ embedding: result.vector, // agentdb search results carry no vector
122
123
  context: result.metadata.context,
123
124
  timestamp: result.metadata.timestamp
124
125
  }));
@@ -135,7 +136,7 @@ export class AgentDBFast extends EventEmitter {
135
136
  if (!this.backend) {
136
137
  throw new Error('Backend not initialized');
137
138
  }
138
- await this.backend.insert(patternId, new Float32Array(pattern.embedding), {
139
+ await this.insertVector(patternId, new Float32Array(pattern.embedding), {
139
140
  type: 'pattern',
140
141
  task: pattern.task,
141
142
  input: pattern.input,
@@ -153,21 +154,18 @@ export class AgentDBFast extends EventEmitter {
153
154
  async searchPatterns(query, k = 5, minQuality) {
154
155
  await this.initialize();
155
156
  const queryEmbedding = await this.getEmbedding(query);
156
- const filter = { type: 'pattern' };
157
+ const filter = { equals: { type: 'pattern' } };
157
158
  if (minQuality !== undefined) {
158
- filter.quality = { $gte: minQuality };
159
+ filter.ranges = { quality: { min: minQuality } };
159
160
  }
160
- if (!this.backend) {
161
- throw new Error('Backend not initialized');
162
- }
163
- const results = await this.backend.search(new Float32Array(queryEmbedding), k, { filter: Object.keys(filter).length > 1 ? filter : undefined });
161
+ const results = await this.search(queryEmbedding, k, filter);
164
162
  return results.map((result) => ({
165
163
  id: result.id,
166
164
  task: result.metadata.task,
167
165
  input: result.metadata.input,
168
166
  output: result.metadata.output,
169
167
  quality: result.metadata.quality,
170
- embedding: result.vector,
168
+ embedding: result.vector, // agentdb search results carry no vector
171
169
  context: result.metadata.context,
172
170
  timestamp: result.metadata.timestamp
173
171
  }));
@@ -180,16 +178,22 @@ export class AgentDBFast extends EventEmitter {
180
178
  if (!this.backend) {
181
179
  throw new Error('Backend not initialized');
182
180
  }
183
- const stats = await this.backend.stats();
184
- // Count by type - get all results
185
- const allResults = await this.backend.search(new Float32Array(this.config.vectorDimensions).fill(0), 10000, // Get all
186
- {});
187
- const episodes = allResults.filter((r) => r.metadata?.type === 'episode');
188
- const patterns = allResults.filter((r) => r.metadata?.type === 'pattern');
181
+ const stats = typeof this.backend.getStatsAsync === 'function'
182
+ ? await this.backend.getStatsAsync()
183
+ : this.backend.getStats();
184
+ const total = stats?.count ?? 0;
185
+ // Count by type with agentdb's filtered search (exact on rvf). Any
186
+ // non-zero probe works; a zero vector has no cosine direction.
187
+ const probe = new Array(this.config.vectorDimensions).fill(1 / Math.sqrt(this.config.vectorDimensions));
188
+ const k = Math.min(Math.max(total, 1), MAX_FALLBACK_K);
189
+ const [episodes, patterns] = await Promise.all([
190
+ this.search(probe, k, { equals: { type: 'episode' } }, true),
191
+ this.search(probe, k, { equals: { type: 'pattern' } }, true),
192
+ ]);
189
193
  const avgQuality = patterns.reduce((sum, p) => sum + (p.metadata?.quality || 0), 0) /
190
194
  (patterns.length || 1);
191
195
  return {
192
- totalVectors: stats.totalVectors || allResults.length || 0,
196
+ totalVectors: total,
193
197
  totalEpisodes: episodes.length,
194
198
  totalPatterns: patterns.length,
195
199
  avgQuality
@@ -202,6 +206,12 @@ export class AgentDBFast extends EventEmitter {
202
206
  this.removeAllListeners();
203
207
  this.embeddingCache.clear();
204
208
  if (this.db) {
209
+ // closeAsync (agentdb >= 3.7.0, rvf) flushes queued writes and waits for
210
+ // the writer lock to be released; AgentDB.close() does not wait.
211
+ if (typeof this.backend?.closeAsync === 'function') {
212
+ await this.backend.closeAsync();
213
+ this.db.vectorBackend = null;
214
+ }
205
215
  await this.db.close();
206
216
  this.db = null;
207
217
  this.backend = null;
@@ -281,6 +291,27 @@ export class AgentDBFast extends EventEmitter {
281
291
  const norm = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0));
282
292
  return embedding.map(v => v / norm);
283
293
  }
294
+ /** Write through the async API so an rvf type conflict rejects this call */
295
+ async insertVector(id, embedding, metadata) {
296
+ if (!this.backend) {
297
+ throw new Error('Backend not initialized');
298
+ }
299
+ const clean = Object.fromEntries(Object.entries(metadata).filter(([, v]) => v !== undefined));
300
+ if (typeof this.backend.insertAsync === 'function') {
301
+ await this.backend.insertAsync(id, embedding, clean);
302
+ }
303
+ else {
304
+ this.backend.insert(id, embedding, clean);
305
+ }
306
+ }
307
+ /** agentdb filtered search (see agentdb-filtered-search.ts for the fallback) */
308
+ async search(embedding, k, query, forceExact = false) {
309
+ if (!this.backend) {
310
+ throw new Error('Backend not initialized');
311
+ }
312
+ const { hits } = await filteredVectorSearch(this.backend, new Float32Array(embedding), k, query, { forceExact });
313
+ return hits;
314
+ }
284
315
  /**
285
316
  * Generate unique ID
286
317
  */
@@ -1 +1 @@
1
- {"version":3,"file":"agentdb-fast.js","sourceRoot":"","sources":["../../src/core/agentdb-fast.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AgentDB Fast API\n *\n * Provides programmatic access to AgentDB without CLI overhead\n * Eliminates 2.3s overhead from process spawning and transformers.js init\n */\n\nimport { AgentDB } from 'agentdb';\nimport { EventEmitter } from 'events';\nimport { getOnnxWasmEmbedder, ONNX_WASM_DIMENSION } from '../integrations/onnx-wasm-embedder.js';\n\n/**\n * How AgentDBFast embeds text:\n * - 'auto' (default): all-MiniLM-L6-v2 via ruvector-onnx-embeddings-wasm when the\n * package and model are available and vectorDimensions is 384, else hash\n * - 'onnx-wasm': same, but emit a 'warning' event when it is unavailable\n * - 'hash': deterministic hash vectors (no semantics; fast, offline)\n */\nexport type FastEmbeddingMode = 'auto' | 'onnx-wasm' | 'hash';\n\nexport interface Episode {\n id?: string;\n sessionId: string;\n task: string;\n trajectory: string[];\n reward: number;\n quality?: number;\n embedding?: number[];\n context?: Record<string, any>;\n timestamp?: number;\n}\n\nexport interface EpisodeSearchOptions {\n task?: string;\n minReward?: number;\n maxReward?: number;\n sessionId?: string;\n k?: number;\n filter?: Record<string, any>;\n}\n\nexport interface Pattern {\n id?: string;\n task: string;\n input: string;\n output: string;\n quality: number;\n embedding?: number[];\n context?: Record<string, any>;\n timestamp?: number;\n}\n\n/**\n * Fast AgentDB client that avoids CLI overhead\n *\n * Performance:\n * - CLI: ~2,350ms per operation\n * - Direct API: ~10-50ms per operation\n * - Speedup: ~50-200x faster\n */\nexport class AgentDBFast extends EventEmitter {\n private db: AgentDB | null = null;\n private backend: any = null;\n private config: {\n path: string;\n vectorDimensions: number;\n enableHNSW: boolean;\n hnswM?: number;\n hnswEfConstruction?: number;\n embeddings: FastEmbeddingMode;\n };\n private initialized: boolean = false;\n private embeddingCache: Map<string, number[]> = new Map();\n private embeddingSource: 'onnx-wasm' | 'hash' | null = null;\n private semanticEmbedder: Promise<{ embed(text: string): Promise<Float32Array> } | null> | null = null;\n\n constructor(config: {\n path?: string;\n vectorDimensions?: number;\n enableHNSW?: boolean;\n hnswM?: number;\n hnswEfConstruction?: number;\n embeddings?: FastEmbeddingMode;\n } = {}) {\n super();\n\n this.config = {\n path: config.path || '.agentdb-fast',\n vectorDimensions: config.vectorDimensions || 384,\n enableHNSW: config.enableHNSW !== false,\n hnswM: config.hnswM || 16,\n hnswEfConstruction: config.hnswEfConstruction || 200,\n embeddings: config.embeddings ?? (process.env.AGENTIC_FLOW_EMBEDDINGS === 'hash' ? 'hash' : 'auto'),\n };\n }\n\n /**\n * Initialize database connection (lazy)\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Create AgentDB instance - use any for flexible config\n this.db = new AgentDB({\n dimensions: this.config.vectorDimensions,\n storagePath: this.config.path\n } as any);\n\n await this.db.initialize();\n\n // Access the vector backend as a direct property\n if (this.db.vectorBackend) {\n this.backend = this.db.vectorBackend;\n } else {\n throw new Error('Vector backend not available');\n }\n\n this.initialized = true;\n this.emit('initialized');\n } catch (error: any) {\n throw new Error(`Failed to initialize AgentDB: ${error.message}`);\n }\n }\n\n /**\n * Store an episode (fast, no CLI overhead)\n */\n async storeEpisode(episode: Episode): Promise<string> {\n await this.initialize();\n\n // Generate embedding if not provided\n if (!episode.embedding) {\n episode.embedding = await this.getEmbedding(episode.task);\n }\n\n const episodeId = episode.id || this.generateId('episode');\n\n // Use backend insert method\n if (!this.backend) {\n throw new Error('Backend not initialized');\n }\n\n await this.backend.insert(\n episodeId,\n new Float32Array(episode.embedding),\n {\n type: 'episode',\n sessionId: episode.sessionId,\n task: episode.task,\n trajectory: JSON.stringify(episode.trajectory),\n reward: episode.reward,\n quality: episode.quality,\n context: episode.context,\n timestamp: episode.timestamp || Date.now()\n }\n );\n\n this.emit('episode:stored', episodeId);\n return episodeId;\n }\n\n /**\n * Retrieve episodes by task similarity (fast)\n */\n async retrieveEpisodes(options: EpisodeSearchOptions): Promise<Episode[]> {\n await this.initialize();\n\n const dimensions = this.config.vectorDimensions ?? 384;\n const queryEmbedding = options.task\n ? await this.getEmbedding(options.task)\n : Array(dimensions).fill(0);\n\n const k = options.k || 5;\n\n // Build filter\n const filter: Record<string, any> = { type: 'episode' };\n if (options.sessionId) filter.sessionId = options.sessionId;\n if (options.minReward !== undefined) filter.reward = { $gte: options.minReward };\n if (options.maxReward !== undefined) {\n filter.reward = { ...(filter.reward || {}), $lte: options.maxReward };\n }\n\n if (!this.backend) {\n throw new Error('Backend not initialized');\n }\n\n const results = await this.backend.search(\n new Float32Array(queryEmbedding),\n k,\n { filter: Object.keys(filter).length > 1 ? filter : undefined }\n );\n\n return results.map((result: any) => ({\n id: result.id,\n sessionId: result.metadata.sessionId,\n task: result.metadata.task,\n trajectory: JSON.parse(result.metadata.trajectory || '[]'),\n reward: result.metadata.reward,\n quality: result.metadata.quality,\n embedding: result.vector,\n context: result.metadata.context,\n timestamp: result.metadata.timestamp\n }));\n }\n\n /**\n * Store a pattern (for ReasoningBank)\n */\n async storePattern(pattern: Pattern): Promise<string> {\n await this.initialize();\n\n if (!pattern.embedding) {\n pattern.embedding = await this.getEmbedding(`${pattern.input} ${pattern.output}`);\n }\n\n const patternId = pattern.id || this.generateId('pattern');\n\n if (!this.backend) {\n throw new Error('Backend not initialized');\n }\n\n await this.backend.insert(\n patternId,\n new Float32Array(pattern.embedding),\n {\n type: 'pattern',\n task: pattern.task,\n input: pattern.input,\n output: pattern.output,\n quality: pattern.quality,\n context: pattern.context,\n timestamp: pattern.timestamp || Date.now()\n }\n );\n\n this.emit('pattern:stored', patternId);\n return patternId;\n }\n\n /**\n * Search for similar patterns\n */\n async searchPatterns(\n query: string,\n k: number = 5,\n minQuality?: number\n ): Promise<Pattern[]> {\n await this.initialize();\n\n const queryEmbedding = await this.getEmbedding(query);\n\n const filter: Record<string, any> = { type: 'pattern' };\n if (minQuality !== undefined) {\n filter.quality = { $gte: minQuality };\n }\n\n if (!this.backend) {\n throw new Error('Backend not initialized');\n }\n\n const results = await this.backend.search(\n new Float32Array(queryEmbedding),\n k,\n { filter: Object.keys(filter).length > 1 ? filter : undefined }\n );\n\n return results.map((result: any) => ({\n id: result.id,\n task: result.metadata.task,\n input: result.metadata.input,\n output: result.metadata.output,\n quality: result.metadata.quality,\n embedding: result.vector,\n context: result.metadata.context,\n timestamp: result.metadata.timestamp\n }));\n }\n\n /**\n * Get database statistics\n */\n async getStats(): Promise<{\n totalVectors: number;\n totalEpisodes: number;\n totalPatterns: number;\n avgQuality: number;\n }> {\n await this.initialize();\n\n if (!this.backend) {\n throw new Error('Backend not initialized');\n }\n\n const stats = await this.backend.stats();\n\n // Count by type - get all results\n const allResults = await this.backend.search(\n new Float32Array(this.config.vectorDimensions).fill(0),\n 10000, // Get all\n {}\n );\n\n const episodes = allResults.filter((r: any) => r.metadata?.type === 'episode');\n const patterns = allResults.filter((r: any) => r.metadata?.type === 'pattern');\n\n const avgQuality =\n patterns.reduce((sum: number, p: any) => sum + (p.metadata?.quality || 0), 0) /\n (patterns.length || 1);\n\n return {\n totalVectors: stats.totalVectors || allResults.length || 0,\n totalEpisodes: episodes.length,\n totalPatterns: patterns.length,\n avgQuality\n };\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n this.removeAllListeners();\n this.embeddingCache.clear();\n\n if (this.db) {\n await this.db.close();\n this.db = null;\n this.backend = null;\n }\n\n this.initialized = false;\n }\n\n /** Which embedder produced vectors so far: 'onnx-wasm', 'hash', or null before the first. */\n getEmbeddingSource(): 'onnx-wasm' | 'hash' | null {\n return this.embeddingSource;\n }\n\n private getSemanticEmbedder() {\n if (!this.semanticEmbedder) {\n this.semanticEmbedder =\n this.config.embeddings !== 'hash' && this.config.vectorDimensions === ONNX_WASM_DIMENSION\n ? getOnnxWasmEmbedder()\n : Promise.resolve(null);\n }\n return this.semanticEmbedder;\n }\n\n /**\n * Generate embedding for text (with caching).\n *\n * Real all-MiniLM-L6-v2 vectors when ruvector-onnx-embeddings-wasm is\n * available (see FastEmbeddingMode), deterministic hash vectors otherwise.\n * The source is fixed by the first embedding so one store never mixes both.\n */\n private async getEmbedding(text: string): Promise<number[]> {\n // Check cache\n if (this.embeddingCache.has(text)) {\n return this.embeddingCache.get(text)!;\n }\n\n let embedding: number[] | null = null;\n if (this.embeddingSource !== 'hash') {\n const semantic = await this.getSemanticEmbedder();\n if (semantic) {\n embedding = Array.from(await semantic.embed(text));\n this.embeddingSource = 'onnx-wasm';\n } else if (this.config.embeddings === 'onnx-wasm') {\n this.emit('warning', new Error('onnx-wasm embeddings requested but unavailable; using hash embeddings'));\n }\n }\n if (!embedding) {\n embedding = this.simpleHashEmbedding(text);\n this.embeddingSource = 'hash';\n }\n\n // Cache it\n this.embeddingCache.set(text, embedding);\n if (this.embeddingCache.size > 1000) {\n // LRU-style cleanup\n const firstKey = this.embeddingCache.keys().next().value as string | undefined;\n if (firstKey) {\n this.embeddingCache.delete(firstKey);\n }\n }\n\n return embedding;\n }\n\n /**\n * Deterministic hash-based embedding: the offline fallback. It carries no\n * semantics (similar texts do not get similar vectors).\n */\n private simpleHashEmbedding(text: string): number[] {\n const embedding = new Array(this.config.vectorDimensions);\n\n // Seed with text hash\n let hash = 0;\n for (let i = 0; i < text.length; i++) {\n hash = (hash << 5) - hash + text.charCodeAt(i);\n hash = hash & hash;\n }\n\n // Generate pseudo-random embedding\n for (let i = 0; i < this.config.vectorDimensions; i++) {\n const seed = hash + i * 2654435761;\n const x = Math.sin(seed) * 10000;\n embedding[i] = x - Math.floor(x);\n }\n\n // Normalize\n const norm = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0));\n return embedding.map(v => v / norm);\n }\n\n /**\n * Generate unique ID\n */\n private generateId(prefix: string): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\n/**\n * Convenience function to create a fast AgentDB client\n */\nexport function createFastAgentDB(config?: {\n path?: string;\n vectorDimensions?: number;\n enableHNSW?: boolean;\n embeddings?: FastEmbeddingMode;\n}): AgentDBFast {\n return new AgentDBFast(config);\n}\n\n/**\n * Performance comparison helper\n */\nexport async function benchmarkAgentDB(): Promise<{\n cli: { store: number; retrieve: number };\n api: { store: number; retrieve: number };\n speedup: { store: number; retrieve: number };\n}> {\n const client = createFastAgentDB({ path: '.agentdb-benchmark' });\n\n // API benchmark\n const apiStoreStart = Date.now();\n const episodeId = await client.storeEpisode({\n sessionId: 'test-session',\n task: 'test-task',\n trajectory: ['step1', 'step2'],\n reward: 0.8\n });\n const apiStoreTime = Date.now() - apiStoreStart;\n\n const apiRetrieveStart = Date.now();\n await client.retrieveEpisodes({ task: 'test-task', k: 5 });\n const apiRetrieveTime = Date.now() - apiRetrieveStart;\n\n await client.close();\n\n // CLI times from benchmarks\n const cliStoreTime = 2350;\n const cliRetrieveTime = 2400;\n\n return {\n cli: {\n store: cliStoreTime,\n retrieve: cliRetrieveTime\n },\n api: {\n store: apiStoreTime,\n retrieve: apiRetrieveTime\n },\n speedup: {\n store: cliStoreTime / apiStoreTime,\n retrieve: cliRetrieveTime / apiRetrieveTime\n }\n };\n}\n"]}
1
+ {"version":3,"file":"agentdb-fast.js","sourceRoot":"","sources":["../../src/core/agentdb-fast.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AgentDB Fast API\n *\n * Provides programmatic access to AgentDB without CLI overhead\n * Eliminates 2.3s overhead from process spawning and transformers.js init\n */\n\nimport { AgentDB } from 'agentdb';\nimport { EventEmitter } from 'events';\nimport { getOnnxWasmEmbedder, ONNX_WASM_DIMENSION } from '../integrations/onnx-wasm-embedder.js';\nimport { filteredVectorSearch, MAX_FALLBACK_K, type MetadataQuery } from './agentdb-filtered-search.js';\n\n/**\n * Thrown by storeEpisode/storePattern on the rvf backend when a metadata\n * field's type differs from its first stored type; nothing was written.\n */\nexport { RvfMetadataTypeConflictError } from 'agentdb/backends';\n\n/**\n * How AgentDBFast embeds text:\n * - 'auto' (default): all-MiniLM-L6-v2 via ruvector-onnx-embeddings-wasm when the\n * package and model are available and vectorDimensions is 384, else hash\n * - 'onnx-wasm': same, but emit a 'warning' event when it is unavailable\n * - 'hash': deterministic hash vectors (no semantics; fast, offline)\n */\nexport type FastEmbeddingMode = 'auto' | 'onnx-wasm' | 'hash';\n\nexport interface Episode {\n id?: string;\n sessionId: string;\n task: string;\n trajectory: string[];\n reward: number;\n quality?: number;\n embedding?: number[];\n context?: Record<string, any>;\n timestamp?: number;\n}\n\nexport interface EpisodeSearchOptions {\n task?: string;\n minReward?: number;\n maxReward?: number;\n sessionId?: string;\n k?: number;\n filter?: Record<string, any>;\n}\n\nexport interface Pattern {\n id?: string;\n task: string;\n input: string;\n output: string;\n quality: number;\n embedding?: number[];\n context?: Record<string, any>;\n timestamp?: number;\n}\n\n/**\n * Fast AgentDB client that avoids CLI overhead\n *\n * Performance:\n * - CLI: ~2,350ms per operation\n * - Direct API: ~10-50ms per operation\n * - Speedup: ~50-200x faster\n */\nexport class AgentDBFast extends EventEmitter {\n private db: AgentDB | null = null;\n private backend: any = null;\n private config: {\n path: string;\n vectorDimensions: number;\n enableHNSW: boolean;\n hnswM?: number;\n hnswEfConstruction?: number;\n embeddings: FastEmbeddingMode;\n };\n private initialized: boolean = false;\n private embeddingCache: Map<string, number[]> = new Map();\n private embeddingSource: 'onnx-wasm' | 'hash' | null = null;\n private semanticEmbedder: Promise<{ embed(text: string): Promise<Float32Array> } | null> | null = null;\n\n constructor(config: {\n path?: string;\n vectorDimensions?: number;\n enableHNSW?: boolean;\n hnswM?: number;\n hnswEfConstruction?: number;\n embeddings?: FastEmbeddingMode;\n } = {}) {\n super();\n\n this.config = {\n path: config.path || '.agentdb-fast',\n vectorDimensions: config.vectorDimensions || 384,\n enableHNSW: config.enableHNSW !== false,\n hnswM: config.hnswM || 16,\n hnswEfConstruction: config.hnswEfConstruction || 200,\n embeddings: config.embeddings ?? (process.env.AGENTIC_FLOW_EMBEDDINGS === 'hash' ? 'hash' : 'auto'),\n };\n }\n\n /**\n * Initialize database connection (lazy)\n */\n async initialize(): Promise<void> {\n if (this.initialized) return;\n\n try {\n // Create AgentDB instance - use any for flexible config\n // agentdb reads `vectorDimension` (singular); the index is in-memory.\n this.db = new AgentDB({\n vectorDimension: this.config.vectorDimensions,\n } as any);\n\n await this.db.initialize();\n\n // Access the vector backend as a direct property\n if (this.db.vectorBackend) {\n this.backend = this.db.vectorBackend;\n } else {\n throw new Error('Vector backend not available');\n }\n\n this.initialized = true;\n this.emit('initialized');\n } catch (error: any) {\n throw new Error(`Failed to initialize AgentDB: ${error.message}`);\n }\n }\n\n /**\n * Store an episode (fast, no CLI overhead)\n */\n async storeEpisode(episode: Episode): Promise<string> {\n await this.initialize();\n\n // Generate embedding if not provided\n if (!episode.embedding) {\n episode.embedding = await this.getEmbedding(episode.task);\n }\n\n const episodeId = episode.id || this.generateId('episode');\n\n // Use backend insert method\n if (!this.backend) {\n throw new Error('Backend not initialized');\n }\n\n await this.insertVector(\n episodeId,\n new Float32Array(episode.embedding),\n {\n type: 'episode',\n sessionId: episode.sessionId,\n task: episode.task,\n trajectory: JSON.stringify(episode.trajectory),\n reward: episode.reward,\n quality: episode.quality,\n context: episode.context,\n timestamp: episode.timestamp || Date.now()\n }\n );\n\n this.emit('episode:stored', episodeId);\n return episodeId;\n }\n\n /**\n * Retrieve episodes by task similarity (fast)\n */\n async retrieveEpisodes(options: EpisodeSearchOptions): Promise<Episode[]> {\n await this.initialize();\n\n const dimensions = this.config.vectorDimensions ?? 384;\n const queryEmbedding = options.task\n ? await this.getEmbedding(options.task)\n : Array(dimensions).fill(1 / Math.sqrt(dimensions)); // no task: any direction\n\n const k = options.k || 5;\n\n // Filter in agentdb (always by type, so patterns never come back as episodes)\n const query: MetadataQuery = { equals: { type: 'episode' } };\n if (options.sessionId) query.equals!.sessionId = options.sessionId;\n if (options.minReward !== undefined || options.maxReward !== undefined) {\n query.ranges = { reward: { min: options.minReward, max: options.maxReward } };\n }\n const results = await this.search(queryEmbedding, k, query);\n\n return results.map((result: any) => ({\n id: result.id,\n sessionId: result.metadata.sessionId,\n task: result.metadata.task,\n trajectory: JSON.parse(result.metadata.trajectory || '[]'),\n reward: result.metadata.reward,\n quality: result.metadata.quality,\n embedding: result.vector, // agentdb search results carry no vector\n context: result.metadata.context,\n timestamp: result.metadata.timestamp\n }));\n }\n\n /**\n * Store a pattern (for ReasoningBank)\n */\n async storePattern(pattern: Pattern): Promise<string> {\n await this.initialize();\n\n if (!pattern.embedding) {\n pattern.embedding = await this.getEmbedding(`${pattern.input} ${pattern.output}`);\n }\n\n const patternId = pattern.id || this.generateId('pattern');\n\n if (!this.backend) {\n throw new Error('Backend not initialized');\n }\n\n await this.insertVector(\n patternId,\n new Float32Array(pattern.embedding),\n {\n type: 'pattern',\n task: pattern.task,\n input: pattern.input,\n output: pattern.output,\n quality: pattern.quality,\n context: pattern.context,\n timestamp: pattern.timestamp || Date.now()\n }\n );\n\n this.emit('pattern:stored', patternId);\n return patternId;\n }\n\n /**\n * Search for similar patterns\n */\n async searchPatterns(\n query: string,\n k: number = 5,\n minQuality?: number\n ): Promise<Pattern[]> {\n await this.initialize();\n\n const queryEmbedding = await this.getEmbedding(query);\n\n const filter: MetadataQuery = { equals: { type: 'pattern' } };\n if (minQuality !== undefined) {\n filter.ranges = { quality: { min: minQuality } };\n }\n const results = await this.search(queryEmbedding, k, filter);\n\n return results.map((result: any) => ({\n id: result.id,\n task: result.metadata.task,\n input: result.metadata.input,\n output: result.metadata.output,\n quality: result.metadata.quality,\n embedding: result.vector, // agentdb search results carry no vector\n context: result.metadata.context,\n timestamp: result.metadata.timestamp\n }));\n }\n\n /**\n * Get database statistics\n */\n async getStats(): Promise<{\n totalVectors: number;\n totalEpisodes: number;\n totalPatterns: number;\n avgQuality: number;\n }> {\n await this.initialize();\n\n if (!this.backend) {\n throw new Error('Backend not initialized');\n }\n\n const stats = typeof this.backend.getStatsAsync === 'function'\n ? await this.backend.getStatsAsync()\n : this.backend.getStats();\n const total: number = stats?.count ?? 0;\n\n // Count by type with agentdb's filtered search (exact on rvf). Any\n // non-zero probe works; a zero vector has no cosine direction.\n const probe = new Array(this.config.vectorDimensions).fill(1 / Math.sqrt(this.config.vectorDimensions));\n const k = Math.min(Math.max(total, 1), MAX_FALLBACK_K);\n const [episodes, patterns] = await Promise.all([\n this.search(probe, k, { equals: { type: 'episode' } }, true),\n this.search(probe, k, { equals: { type: 'pattern' } }, true),\n ]);\n\n const avgQuality =\n patterns.reduce((sum: number, p: any) => sum + (p.metadata?.quality || 0), 0) /\n (patterns.length || 1);\n\n return {\n totalVectors: total,\n totalEpisodes: episodes.length,\n totalPatterns: patterns.length,\n avgQuality\n };\n }\n\n /**\n * Close database connection\n */\n async close(): Promise<void> {\n this.removeAllListeners();\n this.embeddingCache.clear();\n\n if (this.db) {\n // closeAsync (agentdb >= 3.7.0, rvf) flushes queued writes and waits for\n // the writer lock to be released; AgentDB.close() does not wait.\n if (typeof this.backend?.closeAsync === 'function') {\n await this.backend.closeAsync();\n (this.db as any).vectorBackend = null;\n }\n await this.db.close();\n this.db = null;\n this.backend = null;\n }\n\n this.initialized = false;\n }\n\n /** Which embedder produced vectors so far: 'onnx-wasm', 'hash', or null before the first. */\n getEmbeddingSource(): 'onnx-wasm' | 'hash' | null {\n return this.embeddingSource;\n }\n\n private getSemanticEmbedder() {\n if (!this.semanticEmbedder) {\n this.semanticEmbedder =\n this.config.embeddings !== 'hash' && this.config.vectorDimensions === ONNX_WASM_DIMENSION\n ? getOnnxWasmEmbedder()\n : Promise.resolve(null);\n }\n return this.semanticEmbedder;\n }\n\n /**\n * Generate embedding for text (with caching).\n *\n * Real all-MiniLM-L6-v2 vectors when ruvector-onnx-embeddings-wasm is\n * available (see FastEmbeddingMode), deterministic hash vectors otherwise.\n * The source is fixed by the first embedding so one store never mixes both.\n */\n private async getEmbedding(text: string): Promise<number[]> {\n // Check cache\n if (this.embeddingCache.has(text)) {\n return this.embeddingCache.get(text)!;\n }\n\n let embedding: number[] | null = null;\n if (this.embeddingSource !== 'hash') {\n const semantic = await this.getSemanticEmbedder();\n if (semantic) {\n embedding = Array.from(await semantic.embed(text));\n this.embeddingSource = 'onnx-wasm';\n } else if (this.config.embeddings === 'onnx-wasm') {\n this.emit('warning', new Error('onnx-wasm embeddings requested but unavailable; using hash embeddings'));\n }\n }\n if (!embedding) {\n embedding = this.simpleHashEmbedding(text);\n this.embeddingSource = 'hash';\n }\n\n // Cache it\n this.embeddingCache.set(text, embedding);\n if (this.embeddingCache.size > 1000) {\n // LRU-style cleanup\n const firstKey = this.embeddingCache.keys().next().value as string | undefined;\n if (firstKey) {\n this.embeddingCache.delete(firstKey);\n }\n }\n\n return embedding;\n }\n\n /**\n * Deterministic hash-based embedding: the offline fallback. It carries no\n * semantics (similar texts do not get similar vectors).\n */\n private simpleHashEmbedding(text: string): number[] {\n const embedding = new Array(this.config.vectorDimensions);\n\n // Seed with text hash\n let hash = 0;\n for (let i = 0; i < text.length; i++) {\n hash = (hash << 5) - hash + text.charCodeAt(i);\n hash = hash & hash;\n }\n\n // Generate pseudo-random embedding\n for (let i = 0; i < this.config.vectorDimensions; i++) {\n const seed = hash + i * 2654435761;\n const x = Math.sin(seed) * 10000;\n embedding[i] = x - Math.floor(x);\n }\n\n // Normalize\n const norm = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0));\n return embedding.map(v => v / norm);\n }\n\n /** Write through the async API so an rvf type conflict rejects this call */\n private async insertVector(id: string, embedding: Float32Array, metadata: Record<string, unknown>): Promise<void> {\n if (!this.backend) {\n throw new Error('Backend not initialized');\n }\n const clean = Object.fromEntries(Object.entries(metadata).filter(([, v]) => v !== undefined));\n if (typeof this.backend.insertAsync === 'function') {\n await this.backend.insertAsync(id, embedding, clean);\n } else {\n this.backend.insert(id, embedding, clean);\n }\n }\n\n /** agentdb filtered search (see agentdb-filtered-search.ts for the fallback) */\n private async search(embedding: number[], k: number, query: MetadataQuery, forceExact = false): Promise<any[]> {\n if (!this.backend) {\n throw new Error('Backend not initialized');\n }\n const { hits } = await filteredVectorSearch(this.backend, new Float32Array(embedding), k, query, { forceExact });\n return hits;\n }\n\n /**\n * Generate unique ID\n */\n private generateId(prefix: string): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\n/**\n * Convenience function to create a fast AgentDB client\n */\nexport function createFastAgentDB(config?: {\n path?: string;\n vectorDimensions?: number;\n enableHNSW?: boolean;\n embeddings?: FastEmbeddingMode;\n}): AgentDBFast {\n return new AgentDBFast(config);\n}\n\n/**\n * Performance comparison helper\n */\nexport async function benchmarkAgentDB(): Promise<{\n cli: { store: number; retrieve: number };\n api: { store: number; retrieve: number };\n speedup: { store: number; retrieve: number };\n}> {\n const client = createFastAgentDB({ path: '.agentdb-benchmark' });\n\n // API benchmark\n const apiStoreStart = Date.now();\n const episodeId = await client.storeEpisode({\n sessionId: 'test-session',\n task: 'test-task',\n trajectory: ['step1', 'step2'],\n reward: 0.8\n });\n const apiStoreTime = Date.now() - apiStoreStart;\n\n const apiRetrieveStart = Date.now();\n await client.retrieveEpisodes({ task: 'test-task', k: 5 });\n const apiRetrieveTime = Date.now() - apiRetrieveStart;\n\n await client.close();\n\n // CLI times from benchmarks\n const cliStoreTime = 2350;\n const cliRetrieveTime = 2400;\n\n return {\n cli: {\n store: cliStoreTime,\n retrieve: cliRetrieveTime\n },\n api: {\n store: apiStoreTime,\n retrieve: apiRetrieveTime\n },\n speedup: {\n store: cliStoreTime / apiStoreTime,\n retrieve: cliRetrieveTime / apiRetrieveTime\n }\n };\n}\n"]}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Metadata-filtered k-NN over an agentdb vector backend (agentdb >= 3.7.0).
3
+ *
4
+ * agentdb's backends filter differently:
5
+ * - rvf (@ruvector/rvf >= 0.4.7) filters natively, by field name, with
6
+ * eq/ne/lt/le/gt/ge/in/range. The predicate DSL is `$ge`/`$le`, not
7
+ * `$gte`/`$lte`: those build no filter at all and are silently dropped.
8
+ * - ruvector filters by strict equality only, after the ANN search.
9
+ * - others may ignore `filter`.
10
+ *
11
+ * So equality is always pushed down; ranges are pushed down on rvf and
12
+ * applied here otherwise. Every hit is re-checked locally, which keeps a
13
+ * backend that ignores `filter` correct. If the filtered search throws, or a
14
+ * post-filtered answer comes back short, this falls back to an exhaustive
15
+ * unfiltered search filtered here.
16
+ */
17
+ export type FilterScalar = string | number | boolean;
18
+ export interface NumericRange {
19
+ min?: number;
20
+ max?: number;
21
+ }
22
+ export interface MetadataQuery {
23
+ /** Fields that must equal these values */
24
+ equals?: Record<string, FilterScalar>;
25
+ /** Inclusive numeric bounds */
26
+ ranges?: Record<string, NumericRange>;
27
+ }
28
+ export interface FilteredSearchOptions {
29
+ /** rvf: exact brute-force scan instead of HNSW (other backends ignore it) */
30
+ forceExact?: boolean;
31
+ efSearch?: number;
32
+ threshold?: number;
33
+ }
34
+ export interface FilteredHit {
35
+ id: string;
36
+ distance: number;
37
+ similarity: number;
38
+ metadata?: Record<string, any>;
39
+ }
40
+ export interface FilteredSearchResult {
41
+ hits: FilteredHit[];
42
+ /** 'native': the backend's filtered search answered; 'fallback': filtered here */
43
+ path: 'native' | 'fallback';
44
+ }
45
+ /** Largest k ever requested from the backend by the fallback */
46
+ export declare const MAX_FALLBACK_K = 10000;
47
+ /** Predicate DSL for agentdb's FilterBuilder / RuVector equality filter */
48
+ export declare function toBackendFilter(q: MetadataQuery, includeRanges: boolean): Record<string, unknown>;
49
+ export declare function matchesMetadataQuery(metadata: Record<string, any> | undefined, q: MetadataQuery): boolean;
50
+ /**
51
+ * k nearest neighbours of `query` whose metadata matches `q`, best first.
52
+ */
53
+ export declare function filteredVectorSearch(backend: any, query: Float32Array, k: number, q: MetadataQuery, options?: FilteredSearchOptions): Promise<FilteredSearchResult>;
54
+ //# sourceMappingURL=agentdb-filtered-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentdb-filtered-search.d.ts","sourceRoot":"","sources":["../../src/core/agentdb-filtered-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC,+BAA+B;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,qBAAqB;IACpC,6EAA6E;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,kFAAkF;IAClF,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC7B;AAED,gEAAgE;AAChE,eAAO,MAAM,cAAc,QAAS,CAAC;AAUrC,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUjG;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,aAAa,GAAG,OAAO,CAYzG;AAkBD;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,GAAG,EACZ,KAAK,EAAE,YAAY,EACnB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,aAAa,EAChB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAgC/B"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Metadata-filtered k-NN over an agentdb vector backend (agentdb >= 3.7.0).
3
+ *
4
+ * agentdb's backends filter differently:
5
+ * - rvf (@ruvector/rvf >= 0.4.7) filters natively, by field name, with
6
+ * eq/ne/lt/le/gt/ge/in/range. The predicate DSL is `$ge`/`$le`, not
7
+ * `$gte`/`$lte`: those build no filter at all and are silently dropped.
8
+ * - ruvector filters by strict equality only, after the ANN search.
9
+ * - others may ignore `filter`.
10
+ *
11
+ * So equality is always pushed down; ranges are pushed down on rvf and
12
+ * applied here otherwise. Every hit is re-checked locally, which keeps a
13
+ * backend that ignores `filter` correct. If the filtered search throws, or a
14
+ * post-filtered answer comes back short, this falls back to an exhaustive
15
+ * unfiltered search filtered here.
16
+ */
17
+ /** Largest k ever requested from the backend by the fallback */
18
+ export const MAX_FALLBACK_K = 10_000;
19
+ const POST_FILTER_OVERFETCH = 4;
20
+ function rangeEntries(q) {
21
+ return Object.entries(q.ranges ?? {}).filter(([, r]) => r && (r.min !== undefined || r.max !== undefined));
22
+ }
23
+ /** Predicate DSL for agentdb's FilterBuilder / RuVector equality filter */
24
+ export function toBackendFilter(q, includeRanges) {
25
+ const filter = { ...(q.equals ?? {}) };
26
+ if (includeRanges) {
27
+ for (const [field, { min, max }] of rangeEntries(q)) {
28
+ if (min !== undefined && max !== undefined)
29
+ filter[field] = { $range: [min, max] };
30
+ else if (min !== undefined)
31
+ filter[field] = { $ge: min };
32
+ else
33
+ filter[field] = { $le: max };
34
+ }
35
+ }
36
+ return filter;
37
+ }
38
+ export function matchesMetadataQuery(metadata, q) {
39
+ if (!metadata)
40
+ return false;
41
+ for (const [field, value] of Object.entries(q.equals ?? {})) {
42
+ if (metadata[field] !== value)
43
+ return false;
44
+ }
45
+ for (const [field, { min, max }] of rangeEntries(q)) {
46
+ const v = metadata[field];
47
+ if (typeof v !== 'number')
48
+ return false;
49
+ if (min !== undefined && v < min)
50
+ return false;
51
+ if (max !== undefined && v > max)
52
+ return false;
53
+ }
54
+ return true;
55
+ }
56
+ function rawSearch(backend, query, k, options) {
57
+ if (typeof backend.searchAsync === 'function')
58
+ return backend.searchAsync(query, k, options);
59
+ return Promise.resolve(backend.search(query, k, options));
60
+ }
61
+ async function backendCount(backend) {
62
+ try {
63
+ const stats = typeof backend.getStatsAsync === 'function'
64
+ ? await backend.getStatsAsync()
65
+ : backend.getStats?.();
66
+ return typeof stats?.count === 'number' ? stats.count : undefined;
67
+ }
68
+ catch {
69
+ return undefined;
70
+ }
71
+ }
72
+ /**
73
+ * k nearest neighbours of `query` whose metadata matches `q`, best first.
74
+ */
75
+ export async function filteredVectorSearch(backend, query, k, q, options = {}) {
76
+ if (k <= 0)
77
+ return { hits: [], path: 'native' };
78
+ const nativeRanges = backend?.name === 'rvf';
79
+ const postFiltered = !nativeRanges && rangeEntries(q).length > 0;
80
+ const filter = toBackendFilter(q, nativeRanges);
81
+ const base = {};
82
+ if (options.forceExact)
83
+ base.forceExact = true;
84
+ if (options.efSearch !== undefined)
85
+ base.efSearch = options.efSearch;
86
+ if (options.threshold !== undefined)
87
+ base.threshold = options.threshold;
88
+ const fetchK = postFiltered ? k * POST_FILTER_OVERFETCH : k;
89
+ try {
90
+ const raw = await rawSearch(backend, query, fetchK, {
91
+ ...base,
92
+ ...(Object.keys(filter).length > 0 ? { filter } : {}),
93
+ });
94
+ const hits = raw.filter((h) => matchesMetadataQuery(h.metadata, q));
95
+ // A short answer is final only from rvf's native filter with nothing
96
+ // dropped here; ruvector filters a bounded over-fetch and can miss matches.
97
+ if (hits.length >= k || (nativeRanges && hits.length === raw.length)) {
98
+ return { hits: hits.slice(0, k), path: 'native' };
99
+ }
100
+ }
101
+ catch {
102
+ // Filter not supported by this backend: filter here instead. Errors that
103
+ // are not about the filter (closed store, bad dimension) recur below.
104
+ }
105
+ const count = await backendCount(backend);
106
+ const allK = Math.min(Math.max(count ?? 0, fetchK * POST_FILTER_OVERFETCH), MAX_FALLBACK_K);
107
+ const raw = await rawSearch(backend, query, allK, base);
108
+ const hits = raw.filter((h) => matchesMetadataQuery(h.metadata, q));
109
+ return { hits: hits.slice(0, k), path: 'fallback' };
110
+ }
111
+ //# sourceMappingURL=agentdb-filtered-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentdb-filtered-search.js","sourceRoot":"","sources":["../../src/core/agentdb-filtered-search.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Metadata-filtered k-NN over an agentdb vector backend (agentdb >= 3.7.0).\n *\n * agentdb's backends filter differently:\n * - rvf (@ruvector/rvf >= 0.4.7) filters natively, by field name, with\n * eq/ne/lt/le/gt/ge/in/range. The predicate DSL is `$ge`/`$le`, not\n * `$gte`/`$lte`: those build no filter at all and are silently dropped.\n * - ruvector filters by strict equality only, after the ANN search.\n * - others may ignore `filter`.\n *\n * So equality is always pushed down; ranges are pushed down on rvf and\n * applied here otherwise. Every hit is re-checked locally, which keeps a\n * backend that ignores `filter` correct. If the filtered search throws, or a\n * post-filtered answer comes back short, this falls back to an exhaustive\n * unfiltered search filtered here.\n */\n\nexport type FilterScalar = string | number | boolean;\n\nexport interface NumericRange {\n min?: number;\n max?: number;\n}\n\nexport interface MetadataQuery {\n /** Fields that must equal these values */\n equals?: Record<string, FilterScalar>;\n /** Inclusive numeric bounds */\n ranges?: Record<string, NumericRange>;\n}\n\nexport interface FilteredSearchOptions {\n /** rvf: exact brute-force scan instead of HNSW (other backends ignore it) */\n forceExact?: boolean;\n efSearch?: number;\n threshold?: number;\n}\n\nexport interface FilteredHit {\n id: string;\n distance: number;\n similarity: number;\n metadata?: Record<string, any>;\n}\n\nexport interface FilteredSearchResult {\n hits: FilteredHit[];\n /** 'native': the backend's filtered search answered; 'fallback': filtered here */\n path: 'native' | 'fallback';\n}\n\n/** Largest k ever requested from the backend by the fallback */\nexport const MAX_FALLBACK_K = 10_000;\n\nconst POST_FILTER_OVERFETCH = 4;\n\nfunction rangeEntries(q: MetadataQuery): Array<[string, NumericRange]> {\n return Object.entries(q.ranges ?? {}).filter(\n ([, r]) => r && (r.min !== undefined || r.max !== undefined)\n );\n}\n\n/** Predicate DSL for agentdb's FilterBuilder / RuVector equality filter */\nexport function toBackendFilter(q: MetadataQuery, includeRanges: boolean): Record<string, unknown> {\n const filter: Record<string, unknown> = { ...(q.equals ?? {}) };\n if (includeRanges) {\n for (const [field, { min, max }] of rangeEntries(q)) {\n if (min !== undefined && max !== undefined) filter[field] = { $range: [min, max] };\n else if (min !== undefined) filter[field] = { $ge: min };\n else filter[field] = { $le: max };\n }\n }\n return filter;\n}\n\nexport function matchesMetadataQuery(metadata: Record<string, any> | undefined, q: MetadataQuery): boolean {\n if (!metadata) return false;\n for (const [field, value] of Object.entries(q.equals ?? {})) {\n if (metadata[field] !== value) return false;\n }\n for (const [field, { min, max }] of rangeEntries(q)) {\n const v = metadata[field];\n if (typeof v !== 'number') return false;\n if (min !== undefined && v < min) return false;\n if (max !== undefined && v > max) return false;\n }\n return true;\n}\n\nfunction rawSearch(backend: any, query: Float32Array, k: number, options: Record<string, unknown>): Promise<FilteredHit[]> {\n if (typeof backend.searchAsync === 'function') return backend.searchAsync(query, k, options);\n return Promise.resolve(backend.search(query, k, options));\n}\n\nasync function backendCount(backend: any): Promise<number | undefined> {\n try {\n const stats = typeof backend.getStatsAsync === 'function'\n ? await backend.getStatsAsync()\n : backend.getStats?.();\n return typeof stats?.count === 'number' ? stats.count : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * k nearest neighbours of `query` whose metadata matches `q`, best first.\n */\nexport async function filteredVectorSearch(\n backend: any,\n query: Float32Array,\n k: number,\n q: MetadataQuery,\n options: FilteredSearchOptions = {}\n): Promise<FilteredSearchResult> {\n if (k <= 0) return { hits: [], path: 'native' };\n const nativeRanges = backend?.name === 'rvf';\n const postFiltered = !nativeRanges && rangeEntries(q).length > 0;\n const filter = toBackendFilter(q, nativeRanges);\n const base: Record<string, unknown> = {};\n if (options.forceExact) base.forceExact = true;\n if (options.efSearch !== undefined) base.efSearch = options.efSearch;\n if (options.threshold !== undefined) base.threshold = options.threshold;\n\n const fetchK = postFiltered ? k * POST_FILTER_OVERFETCH : k;\n try {\n const raw = await rawSearch(backend, query, fetchK, {\n ...base,\n ...(Object.keys(filter).length > 0 ? { filter } : {}),\n });\n const hits = raw.filter((h) => matchesMetadataQuery(h.metadata, q));\n // A short answer is final only from rvf's native filter with nothing\n // dropped here; ruvector filters a bounded over-fetch and can miss matches.\n if (hits.length >= k || (nativeRanges && hits.length === raw.length)) {\n return { hits: hits.slice(0, k), path: 'native' };\n }\n } catch {\n // Filter not supported by this backend: filter here instead. Errors that\n // are not about the filter (closed store, bad dimension) recur below.\n }\n\n const count = await backendCount(backend);\n const allK = Math.min(Math.max(count ?? 0, fetchK * POST_FILTER_OVERFETCH), MAX_FALLBACK_K);\n const raw = await rawSearch(backend, query, allK, base);\n const hits = raw.filter((h) => matchesMetadataQuery(h.metadata, q));\n return { hits: hits.slice(0, k), path: 'fallback' };\n}\n"]}
@@ -122,7 +122,7 @@ export declare class ConfigurationTuning {
122
122
  entries: number;
123
123
  };
124
124
  topology: {
125
- mode: "hierarchical" | "mesh" | "ring" | "star" | "auto";
125
+ mode: "auto" | "mesh" | "hierarchical" | "ring" | "star";
126
126
  changes: number;
127
127
  improvement: string;
128
128
  };
@@ -108,4 +108,21 @@ export declare class AgentDBService {
108
108
  * Get or create the singleton AgentDBService instance
109
109
  */
110
110
  export declare function getAgentDBService(): Promise<AgentDBService>;
111
+ /** Filters ReflexionMemory.retrieveRelevant applies natively */
112
+ export interface NativeEpisodeFilters {
113
+ minReward?: number;
114
+ onlySuccesses?: boolean;
115
+ onlyFailures?: boolean;
116
+ timeWindowDays?: number;
117
+ }
118
+ /**
119
+ * Split recallEpisodes filters into the part agentdb's ReflexionMemory
120
+ * answers itself (`minReward`, `reward: {$gte}`, `success: true|false`,
121
+ * `onlySuccesses`, `onlyFailures`, `timeWindowDays`) and the rest, which is
122
+ * applied with MetadataFilter after retrieval.
123
+ */
124
+ export declare function splitEpisodeFilters(filters?: Record<string, any>): {
125
+ native: NativeEpisodeFilters;
126
+ rest: Record<string, any>;
127
+ };
111
128
  //# sourceMappingURL=agentdb-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agentdb-service.d.ts","sourceRoot":"","sources":["../../src/services/agentdb-service.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,OAAQ,SAAQ,WAAW;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,OAAQ,SAAQ,WAAW;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gFAAgF;AAChF,eAAO,MAAM,eAAe,6BAA6B,CAAC;AA4B1D,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA+B;IAEtD,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAA6B;IAE7C,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,YAAY,CAA0D;IAE9E,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO;WAEM,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC;IAQnD,MAAM,CAAC,aAAa,IAAI,IAAI;IAE5B,gFAAgF;IAChF,cAAc,IAAI,MAAM;YAIV,UAAU;IA6CxB;;;;;;;OAOG;IACH,OAAO,CAAC,UAAU;IAUZ,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IASnD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA0B3F,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAYnD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAoBlE;;;OAGG;IACG,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB9E;;;;OAIG;IACG,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC;IAmBzD;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC;IAoBrC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAmBhC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC,CAEjE"}
1
+ {"version":3,"file":"agentdb-service.d.ts","sourceRoot":"","sources":["../../src/services/agentdb-service.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,OAAQ,SAAQ,WAAW;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,OAAQ,SAAQ,WAAW;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,gFAAgF;AAChF,eAAO,MAAM,eAAe,6BAA6B,CAAC;AA4B1D,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA+B;IAEtD,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,QAAQ,CAA6B;IAE7C,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,YAAY,CAA0D;IAE9E,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO;WAEM,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC;IAQnD,MAAM,CAAC,aAAa,IAAI,IAAI;IAE5B,gFAAgF;IAChF,cAAc,IAAI,MAAM;YAIV,UAAU;IA6CxB;;;;;;;OAOG;IACH,OAAO,CAAC,UAAU;IAUZ,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IASnD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAgC3F,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAYnD,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAoBlE;;;OAGG;IACG,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB9E;;;;OAIG;IACG,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC;IAmBzD;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC;IAoBrC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAmBhC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,cAAc,CAAC,CAEjE;AAED,gEAAgE;AAChE,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IAClE,MAAM,EAAE,oBAAoB,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3B,CAuBA"}