moflo 4.0.1 → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/.claude/guidance/agent-bootstrap.md +12 -6
  2. package/bin/setup-project.mjs +201 -0
  3. package/package.json +114 -109
  4. package/v3/@claude-flow/cli/dist/src/memory/memory-bridge.js +194 -81
  5. package/v3/@claude-flow/cli/dist/src/memory/memory-initializer.js +1892 -1841
  6. package/v3/@claude-flow/memory/README.md +587 -0
  7. package/v3/@claude-flow/memory/dist/agent-memory-scope.d.ts +131 -0
  8. package/v3/@claude-flow/memory/dist/agent-memory-scope.js +223 -0
  9. package/v3/@claude-flow/memory/dist/agent-memory-scope.test.d.ts +8 -0
  10. package/v3/@claude-flow/memory/dist/agent-memory-scope.test.js +463 -0
  11. package/v3/@claude-flow/memory/dist/agentdb-adapter.d.ts +165 -0
  12. package/v3/@claude-flow/memory/dist/agentdb-adapter.js +806 -0
  13. package/v3/@claude-flow/memory/dist/agentdb-backend.d.ts +214 -0
  14. package/v3/@claude-flow/memory/dist/agentdb-backend.js +844 -0
  15. package/v3/@claude-flow/memory/dist/agentdb-backend.test.d.ts +7 -0
  16. package/v3/@claude-flow/memory/dist/agentdb-backend.test.js +258 -0
  17. package/v3/@claude-flow/memory/dist/application/commands/delete-memory.command.d.ts +65 -0
  18. package/v3/@claude-flow/memory/dist/application/commands/delete-memory.command.js +129 -0
  19. package/v3/@claude-flow/memory/dist/application/commands/store-memory.command.d.ts +48 -0
  20. package/v3/@claude-flow/memory/dist/application/commands/store-memory.command.js +72 -0
  21. package/v3/@claude-flow/memory/dist/application/index.d.ts +12 -0
  22. package/v3/@claude-flow/memory/dist/application/index.js +15 -0
  23. package/v3/@claude-flow/memory/dist/application/queries/search-memory.query.d.ts +72 -0
  24. package/v3/@claude-flow/memory/dist/application/queries/search-memory.query.js +143 -0
  25. package/v3/@claude-flow/memory/dist/application/services/memory-application-service.d.ts +121 -0
  26. package/v3/@claude-flow/memory/dist/application/services/memory-application-service.js +190 -0
  27. package/v3/@claude-flow/memory/dist/auto-memory-bridge.d.ts +226 -0
  28. package/v3/@claude-flow/memory/dist/auto-memory-bridge.js +709 -0
  29. package/v3/@claude-flow/memory/dist/auto-memory-bridge.test.d.ts +8 -0
  30. package/v3/@claude-flow/memory/dist/auto-memory-bridge.test.js +754 -0
  31. package/v3/@claude-flow/memory/dist/benchmark.test.d.ts +2 -0
  32. package/v3/@claude-flow/memory/dist/benchmark.test.js +277 -0
  33. package/v3/@claude-flow/memory/dist/cache-manager.d.ts +134 -0
  34. package/v3/@claude-flow/memory/dist/cache-manager.js +407 -0
  35. package/v3/@claude-flow/memory/dist/controller-registry.d.ts +216 -0
  36. package/v3/@claude-flow/memory/dist/controller-registry.js +893 -0
  37. package/v3/@claude-flow/memory/dist/controller-registry.test.d.ts +14 -0
  38. package/v3/@claude-flow/memory/dist/controller-registry.test.js +636 -0
  39. package/v3/@claude-flow/memory/dist/database-provider.d.ts +87 -0
  40. package/v3/@claude-flow/memory/dist/database-provider.js +410 -0
  41. package/v3/@claude-flow/memory/dist/database-provider.test.d.ts +7 -0
  42. package/v3/@claude-flow/memory/dist/database-provider.test.js +285 -0
  43. package/v3/@claude-flow/memory/dist/domain/entities/memory-entry.d.ts +143 -0
  44. package/v3/@claude-flow/memory/dist/domain/entities/memory-entry.js +226 -0
  45. package/v3/@claude-flow/memory/dist/domain/index.d.ts +11 -0
  46. package/v3/@claude-flow/memory/dist/domain/index.js +12 -0
  47. package/v3/@claude-flow/memory/dist/domain/repositories/memory-repository.interface.d.ts +102 -0
  48. package/v3/@claude-flow/memory/dist/domain/repositories/memory-repository.interface.js +11 -0
  49. package/v3/@claude-flow/memory/dist/domain/services/memory-domain-service.d.ts +105 -0
  50. package/v3/@claude-flow/memory/dist/domain/services/memory-domain-service.js +297 -0
  51. package/v3/@claude-flow/memory/dist/hnsw-index.d.ts +111 -0
  52. package/v3/@claude-flow/memory/dist/hnsw-index.js +781 -0
  53. package/v3/@claude-flow/memory/dist/hnsw-lite.d.ts +23 -0
  54. package/v3/@claude-flow/memory/dist/hnsw-lite.js +168 -0
  55. package/v3/@claude-flow/memory/dist/hybrid-backend.d.ts +245 -0
  56. package/v3/@claude-flow/memory/dist/hybrid-backend.js +569 -0
  57. package/v3/@claude-flow/memory/dist/hybrid-backend.test.d.ts +8 -0
  58. package/v3/@claude-flow/memory/dist/hybrid-backend.test.js +320 -0
  59. package/v3/@claude-flow/memory/dist/index.d.ts +208 -0
  60. package/v3/@claude-flow/memory/dist/index.js +362 -0
  61. package/v3/@claude-flow/memory/dist/infrastructure/index.d.ts +17 -0
  62. package/v3/@claude-flow/memory/dist/infrastructure/index.js +16 -0
  63. package/v3/@claude-flow/memory/dist/infrastructure/repositories/hybrid-memory-repository.d.ts +66 -0
  64. package/v3/@claude-flow/memory/dist/infrastructure/repositories/hybrid-memory-repository.js +409 -0
  65. package/v3/@claude-flow/memory/dist/learning-bridge.d.ts +137 -0
  66. package/v3/@claude-flow/memory/dist/learning-bridge.js +335 -0
  67. package/v3/@claude-flow/memory/dist/learning-bridge.test.d.ts +8 -0
  68. package/v3/@claude-flow/memory/dist/learning-bridge.test.js +578 -0
  69. package/v3/@claude-flow/memory/dist/memory-graph.d.ts +100 -0
  70. package/v3/@claude-flow/memory/dist/memory-graph.js +333 -0
  71. package/v3/@claude-flow/memory/dist/memory-graph.test.d.ts +8 -0
  72. package/v3/@claude-flow/memory/dist/memory-graph.test.js +609 -0
  73. package/v3/@claude-flow/memory/dist/migration.d.ts +68 -0
  74. package/v3/@claude-flow/memory/dist/migration.js +513 -0
  75. package/v3/@claude-flow/memory/dist/persistent-sona.d.ts +144 -0
  76. package/v3/@claude-flow/memory/dist/persistent-sona.js +332 -0
  77. package/v3/@claude-flow/memory/dist/query-builder.d.ts +211 -0
  78. package/v3/@claude-flow/memory/dist/query-builder.js +438 -0
  79. package/v3/@claude-flow/memory/dist/rvf-backend.d.ts +51 -0
  80. package/v3/@claude-flow/memory/dist/rvf-backend.js +481 -0
  81. package/v3/@claude-flow/memory/dist/rvf-learning-store.d.ts +139 -0
  82. package/v3/@claude-flow/memory/dist/rvf-learning-store.js +295 -0
  83. package/v3/@claude-flow/memory/dist/rvf-migration.d.ts +45 -0
  84. package/v3/@claude-flow/memory/dist/rvf-migration.js +254 -0
  85. package/v3/@claude-flow/memory/dist/sqlite-backend.d.ts +121 -0
  86. package/v3/@claude-flow/memory/dist/sqlite-backend.js +564 -0
  87. package/v3/@claude-flow/memory/dist/sqljs-backend.d.ts +128 -0
  88. package/v3/@claude-flow/memory/dist/sqljs-backend.js +601 -0
  89. package/v3/@claude-flow/memory/dist/types.d.ts +484 -0
  90. package/v3/@claude-flow/memory/dist/types.js +58 -0
  91. package/v3/@claude-flow/memory/package.json +46 -0
@@ -0,0 +1,332 @@
1
+ /**
2
+ * PersistentSonaCoordinator - SONA learning with RVF persistence
3
+ *
4
+ * Wraps RvfLearningStore to provide an in-memory pattern bank with
5
+ * brute-force cosine similarity, trajectory buffering, EWC tracking,
6
+ * and automatic periodic persistence to disk.
7
+ *
8
+ * This is intentionally decoupled from the ruvector SONA classes:
9
+ * it defines its own compatible types and delegates persistence to
10
+ * RvfLearningStore.
11
+ *
12
+ * @module @claude-flow/memory/persistent-sona
13
+ */
14
+ import { RvfLearningStore, } from './rvf-learning-store.js';
15
+ // ===== Constants =====
16
+ const DEFAULT_PATTERN_THRESHOLD = 0.85;
17
+ const DEFAULT_MAX_TRAJECTORY_BUFFER = 1000;
18
+ const DEFAULT_AUTO_PERSIST_MS = 30_000;
19
+ // ===== Helpers =====
20
+ /**
21
+ * Compute cosine similarity between two number arrays.
22
+ * Returns 0 when either vector has zero magnitude.
23
+ */
24
+ function cosineSimilarity(a, b) {
25
+ const len = Math.min(a.length, b.length);
26
+ let dot = 0;
27
+ let normA = 0;
28
+ let normB = 0;
29
+ // Process in groups of 4 for better throughput
30
+ let i = 0;
31
+ for (; i + 3 < len; i += 4) {
32
+ dot += a[i] * b[i] + a[i + 1] * b[i + 1] + a[i + 2] * b[i + 2] + a[i + 3] * b[i + 3];
33
+ normA += a[i] * a[i] + a[i + 1] * a[i + 1] + a[i + 2] * a[i + 2] + a[i + 3] * a[i + 3];
34
+ normB += b[i] * b[i] + b[i + 1] * b[i + 1] + b[i + 2] * b[i + 2] + b[i + 3] * b[i + 3];
35
+ }
36
+ for (; i < len; i++) {
37
+ dot += a[i] * b[i];
38
+ normA += a[i] * a[i];
39
+ normB += b[i] * b[i];
40
+ }
41
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
42
+ return denom > 0 ? dot / denom : 0;
43
+ }
44
+ function generateId(prefix) {
45
+ return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
46
+ }
47
+ // ===== PersistentSonaCoordinator =====
48
+ /**
49
+ * Coordinates SONA learning with persistent storage.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * const sona = new PersistentSonaCoordinator({
54
+ * storePath: './data/sona-learning.rvls',
55
+ * });
56
+ * await sona.initialize();
57
+ *
58
+ * // Store a pattern
59
+ * const id = sona.storePattern('query_response', embedding);
60
+ *
61
+ * // Find similar patterns
62
+ * const matches = sona.findSimilarPatterns(queryEmbedding, 5);
63
+ *
64
+ * // Record a trajectory
65
+ * sona.recordTrajectory({ id: 'traj-1', steps: [...], outcome: 'success', ... });
66
+ *
67
+ * // Periodic background learning
68
+ * const result = sona.runBackgroundLoop();
69
+ *
70
+ * await sona.shutdown();
71
+ * ```
72
+ */
73
+ export class PersistentSonaCoordinator {
74
+ store;
75
+ patterns = new Map();
76
+ trajectoryBuffer = [];
77
+ ewcState = null;
78
+ patternThreshold;
79
+ maxTrajectoryBuffer;
80
+ verbose;
81
+ initialized = false;
82
+ constructor(config) {
83
+ this.patternThreshold = config.patternThreshold ?? DEFAULT_PATTERN_THRESHOLD;
84
+ this.maxTrajectoryBuffer = config.maxTrajectoryBuffer ?? DEFAULT_MAX_TRAJECTORY_BUFFER;
85
+ this.verbose = config.verbose ?? false;
86
+ const storeConfig = {
87
+ storePath: config.storePath,
88
+ autoPersistInterval: config.autoPersistInterval ?? DEFAULT_AUTO_PERSIST_MS,
89
+ verbose: config.verbose,
90
+ };
91
+ this.store = new RvfLearningStore(storeConfig);
92
+ }
93
+ /**
94
+ * Initialize by loading persisted state from the RVF store.
95
+ */
96
+ async initialize() {
97
+ if (this.initialized)
98
+ return;
99
+ await this.store.initialize();
100
+ // Rebuild in-memory state from store
101
+ const patterns = await this.store.loadPatterns();
102
+ for (const p of patterns) {
103
+ this.patterns.set(p.id, p);
104
+ }
105
+ const ewc = await this.store.loadEwcState();
106
+ this.ewcState = ewc;
107
+ const trajectories = await this.store.getTrajectories();
108
+ // getTrajectories returns newest-first, reverse for chronological buffer
109
+ this.trajectoryBuffer = trajectories.reverse();
110
+ this.initialized = true;
111
+ this.log(`Initialized: ${this.patterns.size} patterns, ` +
112
+ `${this.trajectoryBuffer.length} trajectories, ` +
113
+ `EWC: ${this.ewcState ? 'yes' : 'no'}`);
114
+ }
115
+ // ===== Pattern operations =====
116
+ /**
117
+ * Store a new pattern and return its ID.
118
+ *
119
+ * @param type - Pattern type (e.g. 'query_response', 'routing')
120
+ * @param embedding - The pattern embedding vector
121
+ * @param metadata - Optional extra metadata (currently unused, reserved)
122
+ * @returns The generated pattern ID
123
+ */
124
+ storePattern(type, embedding, metadata) {
125
+ this.ensureInitialized();
126
+ const id = generateId('pat');
127
+ const record = {
128
+ id,
129
+ type,
130
+ embedding: [...embedding],
131
+ successRate: 1.0,
132
+ useCount: 0,
133
+ lastUsed: new Date().toISOString(),
134
+ };
135
+ this.patterns.set(id, record);
136
+ // Mark for persistence on next persist() call
137
+ void this.store.savePatterns([record]).catch(() => { });
138
+ return id;
139
+ }
140
+ /**
141
+ * Find the k most similar patterns above the configured threshold.
142
+ * Uses brute-force cosine similarity (suitable for small pattern sets).
143
+ */
144
+ findSimilarPatterns(embedding, k = 5) {
145
+ this.ensureInitialized();
146
+ const results = [];
147
+ for (const record of this.patterns.values()) {
148
+ const score = cosineSimilarity(embedding, record.embedding);
149
+ if (score >= this.patternThreshold) {
150
+ results.push({ record, score });
151
+ }
152
+ }
153
+ // Sort descending by score and take top-k
154
+ results.sort((a, b) => b.score - a.score);
155
+ return results.slice(0, k).map((r) => r.record);
156
+ }
157
+ /**
158
+ * Record a pattern usage outcome. Updates the success rate using an
159
+ * exponential moving average (alpha = 0.1).
160
+ */
161
+ recordPatternUsage(patternId, success) {
162
+ this.ensureInitialized();
163
+ const pattern = this.patterns.get(patternId);
164
+ if (!pattern)
165
+ return;
166
+ pattern.useCount++;
167
+ pattern.lastUsed = new Date().toISOString();
168
+ const alpha = 0.1;
169
+ const outcome = success ? 1.0 : 0.0;
170
+ pattern.successRate = alpha * outcome + (1 - alpha) * pattern.successRate;
171
+ }
172
+ /**
173
+ * Remove patterns that have low success rates after sufficient usage.
174
+ *
175
+ * @returns The number of patterns pruned
176
+ */
177
+ prunePatterns(minSuccessRate = 0.3, minUseCount = 5) {
178
+ this.ensureInitialized();
179
+ let pruned = 0;
180
+ for (const [id, pattern] of this.patterns) {
181
+ if (pattern.useCount >= minUseCount && pattern.successRate < minSuccessRate) {
182
+ this.patterns.delete(id);
183
+ pruned++;
184
+ }
185
+ }
186
+ if (pruned > 0) {
187
+ this.log(`Pruned ${pruned} low-performing patterns`);
188
+ }
189
+ return pruned;
190
+ }
191
+ // ===== Trajectory tracking =====
192
+ /**
193
+ * Buffer a completed trajectory for later processing.
194
+ * When the buffer exceeds maxTrajectoryBuffer, the oldest entries
195
+ * are evicted.
196
+ */
197
+ recordTrajectory(trajectory) {
198
+ this.ensureInitialized();
199
+ const copy = { ...trajectory };
200
+ this.trajectoryBuffer.push(copy);
201
+ // Persist to store immediately so evicted entries are not lost
202
+ void this.store.appendTrajectory(copy).catch(() => { });
203
+ while (this.trajectoryBuffer.length > this.maxTrajectoryBuffer) {
204
+ this.trajectoryBuffer.shift();
205
+ }
206
+ }
207
+ // ===== Learning loop =====
208
+ /**
209
+ * Process buffered trajectories to extract new patterns.
210
+ * Successful and partial trajectories are mined for high-confidence
211
+ * steps; new patterns are stored if they are sufficiently different
212
+ * from existing ones.
213
+ *
214
+ * After processing, the trajectory buffer is cleared and low-performing
215
+ * patterns are pruned.
216
+ *
217
+ * @returns Summary of the learning pass
218
+ */
219
+ runBackgroundLoop() {
220
+ this.ensureInitialized();
221
+ let patternsLearned = 0;
222
+ const trajectoriesProcessed = this.trajectoryBuffer.length;
223
+ for (const traj of this.trajectoryBuffer) {
224
+ if (traj.outcome === 'success' || traj.outcome === 'partial') {
225
+ patternsLearned += this.extractPatternsFromTrajectory(traj);
226
+ }
227
+ }
228
+ this.prunePatterns();
229
+ this.trajectoryBuffer = [];
230
+ this.log(`Background loop: ${patternsLearned} patterns learned, ` +
231
+ `${trajectoriesProcessed} trajectories processed`);
232
+ return { patternsLearned, trajectoriesProcessed };
233
+ }
234
+ // ===== Persistence =====
235
+ /**
236
+ * Flush current in-memory state to the RVF store on disk.
237
+ */
238
+ async persist() {
239
+ const allPatterns = Array.from(this.patterns.values());
240
+ await this.store.savePatterns(allPatterns);
241
+ if (this.ewcState) {
242
+ await this.store.saveEwcState(this.ewcState);
243
+ }
244
+ // Persist any buffered trajectories that have not yet been saved
245
+ for (const traj of this.trajectoryBuffer) {
246
+ await this.store.appendTrajectory(traj);
247
+ }
248
+ await this.store.persist();
249
+ }
250
+ /**
251
+ * Persist state and shut down the store.
252
+ */
253
+ async shutdown() {
254
+ if (!this.initialized)
255
+ return;
256
+ await this.persist();
257
+ await this.store.close();
258
+ this.initialized = false;
259
+ this.log('Shutdown complete');
260
+ }
261
+ // ===== Stats =====
262
+ /**
263
+ * Return a summary of the coordinator's current state.
264
+ */
265
+ getStats() {
266
+ let totalSuccessRate = 0;
267
+ let count = 0;
268
+ for (const p of this.patterns.values()) {
269
+ totalSuccessRate += p.successRate;
270
+ count++;
271
+ }
272
+ return {
273
+ patterns: this.patterns.size,
274
+ avgSuccessRate: count > 0 ? totalSuccessRate / count : 0,
275
+ trajectoriesBuffered: this.trajectoryBuffer.length,
276
+ ewcTasksLearned: this.ewcState?.tasksLearned ?? 0,
277
+ };
278
+ }
279
+ // ===== Private =====
280
+ /**
281
+ * Extract patterns from a trajectory's high-confidence steps.
282
+ * A step produces a new pattern only if no sufficiently similar
283
+ * pattern already exists.
284
+ */
285
+ extractPatternsFromTrajectory(trajectory) {
286
+ let extracted = 0;
287
+ for (const step of trajectory.steps) {
288
+ if (step.confidence < this.patternThreshold)
289
+ continue;
290
+ const embedding = this.createHashEmbedding(step.input + step.output);
291
+ const similar = this.findSimilarPatterns(embedding, 1);
292
+ if (similar.length === 0) {
293
+ this.storePattern(step.type, embedding);
294
+ extracted++;
295
+ }
296
+ }
297
+ return extracted;
298
+ }
299
+ /**
300
+ * Deterministic hash-based embedding for pattern extraction.
301
+ * This is a lightweight stand-in for a real embedding model,
302
+ * matching the approach used in SonaCoordinator.
303
+ */
304
+ createHashEmbedding(text, dim = 64) {
305
+ const embedding = new Array(dim).fill(0);
306
+ for (let i = 0; i < text.length; i++) {
307
+ const idx = (text.charCodeAt(i) * (i + 1)) % dim;
308
+ embedding[idx] += 0.1;
309
+ }
310
+ let norm = 0;
311
+ for (let i = 0; i < dim; i++) {
312
+ norm += embedding[i] * embedding[i];
313
+ }
314
+ norm = Math.sqrt(norm) || 1;
315
+ for (let i = 0; i < dim; i++) {
316
+ embedding[i] /= norm;
317
+ }
318
+ return embedding;
319
+ }
320
+ ensureInitialized() {
321
+ if (!this.initialized) {
322
+ throw new Error('PersistentSonaCoordinator has not been initialized. Call initialize() first.');
323
+ }
324
+ }
325
+ log(message) {
326
+ if (this.verbose) {
327
+ // eslint-disable-next-line no-console
328
+ console.log(`[PersistentSona] ${message}`);
329
+ }
330
+ }
331
+ }
332
+ //# sourceMappingURL=persistent-sona.js.map
@@ -0,0 +1,211 @@
1
+ /**
2
+ * V3 Query Builder
3
+ *
4
+ * Fluent API for building memory queries with filter chaining,
5
+ * sorting options, and pagination support.
6
+ *
7
+ * @module v3/memory/query-builder
8
+ */
9
+ import { MemoryQuery, MemoryType, AccessLevel, DistanceMetric } from './types.js';
10
+ /**
11
+ * Sort direction
12
+ */
13
+ export type SortDirection = 'asc' | 'desc';
14
+ /**
15
+ * Sort field options
16
+ */
17
+ export type SortField = 'createdAt' | 'updatedAt' | 'lastAccessedAt' | 'accessCount' | 'key' | 'score';
18
+ /**
19
+ * Fluent query builder for constructing memory queries
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const query = new QueryBuilder()
24
+ * .semantic('user authentication patterns')
25
+ * .inNamespace('security')
26
+ * .withTags(['auth', 'patterns'])
27
+ * .ofType('semantic')
28
+ * .limit(10)
29
+ * .threshold(0.8)
30
+ * .build();
31
+ * ```
32
+ */
33
+ export declare class QueryBuilder {
34
+ private state;
35
+ constructor();
36
+ /**
37
+ * Create a semantic (vector similarity) query
38
+ */
39
+ semantic(content: string): this;
40
+ /**
41
+ * Create a semantic query with pre-computed embedding
42
+ */
43
+ semanticWithEmbedding(embedding: Float32Array): this;
44
+ /**
45
+ * Create an exact key match query
46
+ */
47
+ exact(key: string): this;
48
+ /**
49
+ * Create a key prefix match query
50
+ */
51
+ prefix(keyPrefix: string): this;
52
+ /**
53
+ * Create a tag-based query
54
+ */
55
+ byTags(tags: string[]): this;
56
+ /**
57
+ * Create a hybrid query (semantic + filters)
58
+ */
59
+ hybrid(content: string): this;
60
+ /**
61
+ * Filter by namespace
62
+ */
63
+ inNamespace(namespace: string): this;
64
+ /**
65
+ * Add tag filter (entries must have all specified tags)
66
+ */
67
+ withTags(tags: string[]): this;
68
+ /**
69
+ * Add a single tag filter
70
+ */
71
+ withTag(tag: string): this;
72
+ /**
73
+ * Filter by memory type
74
+ */
75
+ ofType(type: MemoryType): this;
76
+ /**
77
+ * Filter by access level
78
+ */
79
+ withAccessLevel(level: AccessLevel): this;
80
+ /**
81
+ * Filter by owner
82
+ */
83
+ ownedBy(ownerId: string): this;
84
+ /**
85
+ * Filter by metadata field
86
+ */
87
+ whereMetadata(key: string, value: unknown): this;
88
+ /**
89
+ * Filter by creation date range
90
+ */
91
+ createdBetween(after: Date | number, before?: Date | number): this;
92
+ /**
93
+ * Filter entries created after a date
94
+ */
95
+ createdAfter(date: Date | number): this;
96
+ /**
97
+ * Filter entries created before a date
98
+ */
99
+ createdBefore(date: Date | number): this;
100
+ /**
101
+ * Filter by update date range
102
+ */
103
+ updatedBetween(after: Date | number, before?: Date | number): this;
104
+ /**
105
+ * Filter entries updated in the last N milliseconds
106
+ */
107
+ updatedWithin(milliseconds: number): this;
108
+ /**
109
+ * Set maximum number of results
110
+ */
111
+ limit(count: number): this;
112
+ /**
113
+ * Set pagination offset
114
+ */
115
+ offset(count: number): this;
116
+ /**
117
+ * Set pagination with page number and size
118
+ */
119
+ page(pageNumber: number, pageSize: number): this;
120
+ /**
121
+ * Set minimum similarity threshold for semantic search
122
+ */
123
+ threshold(minScore: number): this;
124
+ /**
125
+ * Include expired entries in results
126
+ */
127
+ includeExpired(include?: boolean): this;
128
+ /**
129
+ * Set distance metric for semantic search
130
+ */
131
+ withMetric(metric: DistanceMetric): this;
132
+ /**
133
+ * Sort results by field
134
+ */
135
+ sortBy(field: SortField, direction?: SortDirection): this;
136
+ /**
137
+ * Sort by creation date (newest first)
138
+ */
139
+ newestFirst(): this;
140
+ /**
141
+ * Sort by creation date (oldest first)
142
+ */
143
+ oldestFirst(): this;
144
+ /**
145
+ * Sort by relevance score (highest first)
146
+ */
147
+ mostRelevant(): this;
148
+ /**
149
+ * Sort by access count (most accessed first)
150
+ */
151
+ mostAccessed(): this;
152
+ /**
153
+ * Sort by last accessed time (most recent first)
154
+ */
155
+ recentlyAccessed(): this;
156
+ /**
157
+ * Build the final query object
158
+ */
159
+ build(): MemoryQuery;
160
+ /**
161
+ * Clone this builder
162
+ */
163
+ clone(): QueryBuilder;
164
+ /**
165
+ * Reset the builder to initial state
166
+ */
167
+ reset(): this;
168
+ }
169
+ /**
170
+ * Convenience function to create a new query builder
171
+ */
172
+ export declare function query(): QueryBuilder;
173
+ /**
174
+ * Predefined query templates for common use cases
175
+ */
176
+ export declare const QueryTemplates: {
177
+ /**
178
+ * Find recent entries in a namespace
179
+ */
180
+ recentInNamespace(namespace: string, limit?: number): MemoryQuery;
181
+ /**
182
+ * Find entries by exact key
183
+ */
184
+ byKey(namespace: string, key: string): MemoryQuery;
185
+ /**
186
+ * Semantic search with threshold
187
+ */
188
+ semanticSearch(content: string, namespace?: string, threshold?: number, limit?: number): MemoryQuery;
189
+ /**
190
+ * Find entries with specific tags
191
+ */
192
+ withTags(tags: string[], namespace?: string, limit?: number): MemoryQuery;
193
+ /**
194
+ * Find entries owned by a specific agent
195
+ */
196
+ ownedBy(ownerId: string, namespace?: string, limit?: number): MemoryQuery;
197
+ /**
198
+ * Find episodic memories within a time range
199
+ */
200
+ episodicInRange(after: Date | number, before: Date | number, limit?: number): MemoryQuery;
201
+ /**
202
+ * Find hot entries (frequently accessed)
203
+ */
204
+ hotEntries(namespace?: string, limit?: number): MemoryQuery;
205
+ /**
206
+ * Find stale entries (not accessed recently)
207
+ */
208
+ staleEntries(staleThresholdMs: number, namespace?: string, limit?: number): MemoryQuery;
209
+ };
210
+ export default QueryBuilder;
211
+ //# sourceMappingURL=query-builder.d.ts.map