moflo 4.8.32 → 4.8.34

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 (40) hide show
  1. package/bin/generate-code-map.mjs +955 -955
  2. package/bin/index-guidance.mjs +905 -905
  3. package/bin/index-tests.mjs +728 -728
  4. package/bin/setup-project.mjs +252 -252
  5. package/package.json +10 -5
  6. package/src/@claude-flow/cli/dist/src/commands/doctor.js +1339 -1107
  7. package/src/@claude-flow/cli/dist/src/index.js +2 -18
  8. package/src/@claude-flow/cli/dist/src/mcp-tools/hooks-tools.js +17 -0
  9. package/src/@claude-flow/cli/dist/src/memory/memory-initializer.js +4 -7
  10. package/src/@claude-flow/cli/dist/src/version.js +6 -0
  11. package/src/@claude-flow/cli/package.json +1 -1
  12. package/src/@claude-flow/neural/README.md +260 -0
  13. package/src/@claude-flow/neural/dist/algorithms/a2c.js +361 -0
  14. package/src/@claude-flow/neural/dist/algorithms/curiosity.js +392 -0
  15. package/src/@claude-flow/neural/dist/algorithms/decision-transformer.js +415 -0
  16. package/src/@claude-flow/neural/dist/algorithms/dqn.js +303 -0
  17. package/src/@claude-flow/neural/dist/algorithms/index.js +74 -0
  18. package/src/@claude-flow/neural/dist/algorithms/ppo.js +331 -0
  19. package/src/@claude-flow/neural/dist/algorithms/q-learning.js +259 -0
  20. package/src/@claude-flow/neural/dist/algorithms/sarsa.js +297 -0
  21. package/src/@claude-flow/neural/dist/application/index.js +7 -0
  22. package/src/@claude-flow/neural/dist/application/services/neural-application-service.js +161 -0
  23. package/src/@claude-flow/neural/dist/domain/entities/pattern.js +134 -0
  24. package/src/@claude-flow/neural/dist/domain/index.js +8 -0
  25. package/src/@claude-flow/neural/dist/domain/services/learning-service.js +195 -0
  26. package/src/@claude-flow/neural/dist/index.js +201 -0
  27. package/src/@claude-flow/neural/dist/modes/balanced.js +234 -0
  28. package/src/@claude-flow/neural/dist/modes/base.js +77 -0
  29. package/src/@claude-flow/neural/dist/modes/batch.js +316 -0
  30. package/src/@claude-flow/neural/dist/modes/edge.js +310 -0
  31. package/src/@claude-flow/neural/dist/modes/index.js +13 -0
  32. package/src/@claude-flow/neural/dist/modes/real-time.js +196 -0
  33. package/src/@claude-flow/neural/dist/modes/research.js +389 -0
  34. package/src/@claude-flow/neural/dist/pattern-learner.js +603 -0
  35. package/src/@claude-flow/neural/dist/reasoning-bank.js +993 -0
  36. package/src/@claude-flow/neural/dist/reasoningbank-adapter.js +463 -0
  37. package/src/@claude-flow/neural/dist/sona-integration.js +326 -0
  38. package/src/@claude-flow/neural/dist/sona-manager.js +695 -0
  39. package/src/@claude-flow/neural/dist/types.js +11 -0
  40. package/src/@claude-flow/neural/package.json +26 -0
@@ -0,0 +1,463 @@
1
+ /**
2
+ * V3 ReasoningBank Adapter
3
+ *
4
+ * Provides agentic-flow@alpha compatible ReasoningBank interface:
5
+ * - 4-step pipeline: RETRIEVE, JUDGE, DISTILL, CONSOLIDATE
6
+ * - Trajectory tracking and verdict judgment
7
+ * - Memory distillation from successful trajectories
8
+ * - Pattern consolidation with deduplication and pruning
9
+ *
10
+ * Based on Algorithm 3 & 4 from ReasoningBank paper.
11
+ *
12
+ * Performance Targets:
13
+ * - Pattern retrieval: <5ms
14
+ * - Verdict judgment: <10ms
15
+ * - Memory distillation: <50ms
16
+ * - Consolidation: <100ms
17
+ */
18
+ import { createSONAManager } from './sona-manager.js';
19
+ import { createPatternLearner } from './pattern-learner.js';
20
+ // ============================================================================
21
+ // ReasoningBank Adapter Implementation
22
+ // ============================================================================
23
+ export class ReasoningBankAdapter {
24
+ config;
25
+ sonaManager;
26
+ patternLearner;
27
+ patterns = new Map();
28
+ newPatternsSinceConsolidation = 0;
29
+ initialized = false;
30
+ constructor(config) {
31
+ this.config = {
32
+ dbPath: config?.dbPath || '.agentdb/reasoningbank.db',
33
+ enableLearning: config?.enableLearning ?? true,
34
+ enableReasoning: config?.enableReasoning ?? true,
35
+ sonaMode: config?.sonaMode || 'balanced',
36
+ duplicateThreshold: config?.duplicateThreshold ?? 0.95,
37
+ contradictionThreshold: config?.contradictionThreshold ?? 0.85,
38
+ pruneAgeDays: config?.pruneAgeDays ?? 30,
39
+ minConfidenceKeep: config?.minConfidenceKeep ?? 0.3,
40
+ consolidateTriggerThreshold: config?.consolidateTriggerThreshold ?? 100,
41
+ maxItemsSuccess: config?.maxItemsSuccess ?? 5,
42
+ maxItemsFailure: config?.maxItemsFailure ?? 3,
43
+ confidencePriorSuccess: config?.confidencePriorSuccess ?? 0.8,
44
+ confidencePriorFailure: config?.confidencePriorFailure ?? 0.5,
45
+ };
46
+ this.sonaManager = createSONAManager(this.config.sonaMode);
47
+ this.patternLearner = createPatternLearner({
48
+ maxPatterns: 5000,
49
+ matchThreshold: 0.7,
50
+ qualityThreshold: 0.5,
51
+ });
52
+ }
53
+ async initialize() {
54
+ if (this.initialized)
55
+ return;
56
+ await this.sonaManager.initialize();
57
+ this.initialized = true;
58
+ }
59
+ // ==========================================================================
60
+ // Step 1: RETRIEVE - Top-k memory injection with MMR diversity
61
+ // ==========================================================================
62
+ /**
63
+ * Retrieve relevant patterns for a query
64
+ */
65
+ async retrieve(queryEmbedding, options) {
66
+ const k = options?.k ?? 5;
67
+ const domain = options?.domain;
68
+ const minConfidence = options?.minConfidence ?? 0;
69
+ const useMmr = options?.useMmr ?? true;
70
+ const mmrLambda = options?.mmrLambda ?? 0.7;
71
+ // Get all patterns, filter by domain and confidence
72
+ let candidates = Array.from(this.patterns.values());
73
+ if (domain) {
74
+ candidates = candidates.filter(p => p.domain === domain);
75
+ }
76
+ if (minConfidence > 0) {
77
+ candidates = candidates.filter(p => p.confidence >= minConfidence);
78
+ }
79
+ if (candidates.length === 0) {
80
+ return [];
81
+ }
82
+ // Compute similarities
83
+ const similarities = candidates.map(pattern => ({
84
+ pattern,
85
+ similarity: this.cosineSimilarity(queryEmbedding, pattern.embedding),
86
+ }));
87
+ if (!useMmr) {
88
+ // Simple top-k
89
+ return similarities
90
+ .sort((a, b) => b.similarity - a.similarity)
91
+ .slice(0, k)
92
+ .map(s => s.pattern);
93
+ }
94
+ // Maximal Marginal Relevance (MMR) for diversity
95
+ return this.mmrSelect(queryEmbedding, similarities, k, mmrLambda);
96
+ }
97
+ // ==========================================================================
98
+ // Step 2: JUDGE - LLM-as-judge trajectory evaluation
99
+ // ==========================================================================
100
+ /**
101
+ * Judge a trajectory's success
102
+ */
103
+ async judge(trajectory) {
104
+ // Compute quality metrics
105
+ const qualityScore = trajectory.qualityScore;
106
+ const stepCount = trajectory.steps.length;
107
+ const avgReward = stepCount > 0
108
+ ? trajectory.steps.reduce((sum, s) => sum + s.reward, 0) / stepCount
109
+ : 0;
110
+ // Determine verdict label
111
+ let label;
112
+ if (qualityScore >= 0.8 && avgReward >= 0.7) {
113
+ label = 'Success';
114
+ }
115
+ else if (qualityScore < 0.4 || avgReward < 0.3) {
116
+ label = 'Failure';
117
+ }
118
+ else {
119
+ label = 'Partial';
120
+ }
121
+ // Collect evidence
122
+ const evidence = [];
123
+ evidence.push(`Quality score: ${qualityScore.toFixed(2)}`);
124
+ evidence.push(`Average reward: ${avgReward.toFixed(2)}`);
125
+ evidence.push(`Step count: ${stepCount}`);
126
+ if (trajectory.steps.length > 0) {
127
+ const lastStep = trajectory.steps[trajectory.steps.length - 1];
128
+ evidence.push(`Final action: ${lastStep.action}`);
129
+ evidence.push(`Final reward: ${lastStep.reward.toFixed(2)}`);
130
+ }
131
+ // Generate reasoning
132
+ const reasoning = this.generateJudgmentReasoning(trajectory, label, evidence);
133
+ return {
134
+ label,
135
+ score: qualityScore,
136
+ evidence,
137
+ reasoning,
138
+ };
139
+ }
140
+ // ==========================================================================
141
+ // Step 3: DISTILL - Extract strategy memories from trajectories
142
+ // ==========================================================================
143
+ /**
144
+ * Distill memories from a judged trajectory
145
+ */
146
+ async distill(trajectory, verdict, options) {
147
+ const maxItems = verdict.label === 'Success'
148
+ ? this.config.maxItemsSuccess
149
+ : this.config.maxItemsFailure;
150
+ const confidencePrior = verdict.label === 'Success'
151
+ ? this.config.confidencePriorSuccess
152
+ : this.config.confidencePriorFailure;
153
+ const memoryIds = [];
154
+ // Extract key patterns from trajectory
155
+ const patterns = this.extractPatternsFromTrajectory(trajectory, verdict);
156
+ for (let i = 0; i < Math.min(patterns.length, maxItems); i++) {
157
+ const pattern = patterns[i];
158
+ const id = `mem_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
159
+ const rbPattern = {
160
+ id,
161
+ type: 'reasoning_memory',
162
+ domain: trajectory.domain,
163
+ patternData: {
164
+ title: pattern.title,
165
+ description: pattern.description,
166
+ content: pattern.content,
167
+ source: {
168
+ taskId: options?.taskId || trajectory.trajectoryId,
169
+ agentId: options?.agentId || 'unknown',
170
+ outcome: verdict.label,
171
+ evidence: verdict.evidence,
172
+ },
173
+ tags: pattern.tags,
174
+ domain: trajectory.domain,
175
+ createdAt: new Date().toISOString(),
176
+ confidence: confidencePrior,
177
+ nUses: 0,
178
+ },
179
+ confidence: confidencePrior,
180
+ usageCount: 0,
181
+ embedding: this.computePatternEmbedding(trajectory, i),
182
+ createdAt: Date.now(),
183
+ lastUsed: Date.now(),
184
+ };
185
+ this.patterns.set(id, rbPattern);
186
+ this.newPatternsSinceConsolidation++;
187
+ memoryIds.push(id);
188
+ }
189
+ // Check if consolidation should run
190
+ if (this.shouldConsolidate()) {
191
+ await this.consolidate();
192
+ }
193
+ return memoryIds;
194
+ }
195
+ // ==========================================================================
196
+ // Step 4: CONSOLIDATE - Dedup, detect contradictions, prune old patterns
197
+ // ==========================================================================
198
+ /**
199
+ * Run consolidation: deduplicate, detect contradictions, prune
200
+ */
201
+ async consolidate() {
202
+ const startTime = Date.now();
203
+ const patterns = Array.from(this.patterns.values());
204
+ let duplicatesFound = 0;
205
+ let contradictionsFound = 0;
206
+ let itemsPruned = 0;
207
+ // Step 1: Deduplicate similar patterns
208
+ const toRemove = new Set();
209
+ for (let i = 0; i < patterns.length; i++) {
210
+ if (toRemove.has(patterns[i].id))
211
+ continue;
212
+ for (let j = i + 1; j < patterns.length; j++) {
213
+ if (toRemove.has(patterns[j].id))
214
+ continue;
215
+ const similarity = this.cosineSimilarity(patterns[i].embedding, patterns[j].embedding);
216
+ if (similarity >= this.config.duplicateThreshold) {
217
+ duplicatesFound++;
218
+ // Keep the one with higher usage/confidence
219
+ const score1 = patterns[i].usageCount * patterns[i].confidence;
220
+ const score2 = patterns[j].usageCount * patterns[j].confidence;
221
+ if (score1 >= score2) {
222
+ toRemove.add(patterns[j].id);
223
+ }
224
+ else {
225
+ toRemove.add(patterns[i].id);
226
+ }
227
+ }
228
+ }
229
+ }
230
+ // Step 2: Detect contradictions (similar embeddings, different outcomes)
231
+ for (let i = 0; i < patterns.length; i++) {
232
+ if (toRemove.has(patterns[i].id))
233
+ continue;
234
+ for (let j = i + 1; j < patterns.length; j++) {
235
+ if (toRemove.has(patterns[j].id))
236
+ continue;
237
+ const similarity = this.cosineSimilarity(patterns[i].embedding, patterns[j].embedding);
238
+ const outcome1 = patterns[i].patternData.source.outcome;
239
+ const outcome2 = patterns[j].patternData.source.outcome;
240
+ if (similarity >= this.config.contradictionThreshold &&
241
+ outcome1 !== outcome2) {
242
+ contradictionsFound++;
243
+ // Log contradiction for analysis (don't auto-remove)
244
+ console.warn(`Contradiction detected: ${patterns[i].id} vs ${patterns[j].id}`);
245
+ }
246
+ }
247
+ }
248
+ // Step 3: Prune old, low-confidence patterns
249
+ const now = Date.now();
250
+ const maxAge = this.config.pruneAgeDays * 24 * 60 * 60 * 1000;
251
+ for (const pattern of patterns) {
252
+ if (toRemove.has(pattern.id))
253
+ continue;
254
+ const age = now - pattern.createdAt;
255
+ if (age > maxAge &&
256
+ pattern.confidence < this.config.minConfidenceKeep &&
257
+ pattern.usageCount < 3) {
258
+ toRemove.add(pattern.id);
259
+ itemsPruned++;
260
+ }
261
+ }
262
+ // Remove marked patterns
263
+ for (const id of toRemove) {
264
+ this.patterns.delete(id);
265
+ }
266
+ this.newPatternsSinceConsolidation = 0;
267
+ const durationMs = Date.now() - startTime;
268
+ return {
269
+ itemsProcessed: patterns.length,
270
+ duplicatesFound,
271
+ contradictionsFound,
272
+ itemsPruned,
273
+ durationMs,
274
+ };
275
+ }
276
+ // ==========================================================================
277
+ // Pattern Management
278
+ // ==========================================================================
279
+ /**
280
+ * Insert a pattern directly
281
+ */
282
+ insertPattern(pattern) {
283
+ const fullPattern = {
284
+ ...pattern,
285
+ createdAt: Date.now(),
286
+ lastUsed: Date.now(),
287
+ };
288
+ this.patterns.set(pattern.id, fullPattern);
289
+ this.newPatternsSinceConsolidation++;
290
+ return pattern.id;
291
+ }
292
+ /**
293
+ * Get a pattern by ID
294
+ */
295
+ getPattern(id) {
296
+ const pattern = this.patterns.get(id);
297
+ if (pattern) {
298
+ pattern.lastUsed = Date.now();
299
+ pattern.usageCount++;
300
+ }
301
+ return pattern;
302
+ }
303
+ /**
304
+ * Update pattern confidence
305
+ */
306
+ updateConfidence(id, delta) {
307
+ const pattern = this.patterns.get(id);
308
+ if (pattern) {
309
+ pattern.confidence = Math.max(0, Math.min(1, pattern.confidence + delta));
310
+ pattern.patternData.confidence = pattern.confidence;
311
+ }
312
+ }
313
+ /**
314
+ * Get statistics
315
+ */
316
+ getStats() {
317
+ const patterns = Array.from(this.patterns.values());
318
+ const byDomain = {};
319
+ const byOutcome = {};
320
+ for (const pattern of patterns) {
321
+ byDomain[pattern.domain] = (byDomain[pattern.domain] || 0) + 1;
322
+ byOutcome[pattern.patternData.source.outcome] =
323
+ (byOutcome[pattern.patternData.source.outcome] || 0) + 1;
324
+ }
325
+ const avgConfidence = patterns.length > 0
326
+ ? patterns.reduce((sum, p) => sum + p.confidence, 0) / patterns.length
327
+ : 0;
328
+ return {
329
+ totalPatterns: patterns.length,
330
+ byDomain,
331
+ byOutcome,
332
+ avgConfidence,
333
+ };
334
+ }
335
+ // ==========================================================================
336
+ // Private Helper Methods
337
+ // ==========================================================================
338
+ cosineSimilarity(a, b) {
339
+ if (a.length !== b.length)
340
+ return 0;
341
+ let dot = 0;
342
+ let normA = 0;
343
+ let normB = 0;
344
+ for (let i = 0; i < a.length; i++) {
345
+ dot += a[i] * b[i];
346
+ normA += a[i] * a[i];
347
+ normB += b[i] * b[i];
348
+ }
349
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
350
+ return denom > 0 ? dot / denom : 0;
351
+ }
352
+ mmrSelect(query, candidates, k, lambda) {
353
+ const selected = [];
354
+ const remaining = [...candidates];
355
+ while (selected.length < k && remaining.length > 0) {
356
+ let bestScore = -Infinity;
357
+ let bestIdx = 0;
358
+ for (let i = 0; i < remaining.length; i++) {
359
+ const candidate = remaining[i];
360
+ const relevance = candidate.similarity;
361
+ // Calculate max similarity to already selected patterns
362
+ let maxSimilarity = 0;
363
+ for (const sel of selected) {
364
+ const sim = this.cosineSimilarity(candidate.pattern.embedding, sel.embedding);
365
+ maxSimilarity = Math.max(maxSimilarity, sim);
366
+ }
367
+ // MMR score: lambda * relevance - (1 - lambda) * redundancy
368
+ const score = lambda * relevance - (1 - lambda) * maxSimilarity;
369
+ if (score > bestScore) {
370
+ bestScore = score;
371
+ bestIdx = i;
372
+ }
373
+ }
374
+ selected.push(remaining[bestIdx].pattern);
375
+ remaining.splice(bestIdx, 1);
376
+ }
377
+ return selected;
378
+ }
379
+ shouldConsolidate() {
380
+ return this.newPatternsSinceConsolidation >= this.config.consolidateTriggerThreshold;
381
+ }
382
+ generateJudgmentReasoning(trajectory, label, evidence) {
383
+ const parts = [];
384
+ parts.push(`Trajectory ${trajectory.trajectoryId} judged as ${label}.`);
385
+ parts.push(`Domain: ${trajectory.domain}, Steps: ${trajectory.steps.length}.`);
386
+ if (label === 'Success') {
387
+ parts.push('The trajectory achieved high quality scores with positive rewards.');
388
+ }
389
+ else if (label === 'Failure') {
390
+ parts.push('The trajectory had low quality scores or negative rewards.');
391
+ }
392
+ else {
393
+ parts.push('The trajectory showed mixed results with room for improvement.');
394
+ }
395
+ return parts.join(' ');
396
+ }
397
+ extractPatternsFromTrajectory(trajectory, verdict) {
398
+ const patterns = [];
399
+ // Extract overall strategy pattern
400
+ const actions = trajectory.steps.map(s => s.action);
401
+ patterns.push({
402
+ title: `${verdict.label}: ${trajectory.context.slice(0, 50)}`,
403
+ description: `Strategy for ${trajectory.domain} task with ${verdict.label.toLowerCase()} outcome`,
404
+ content: `Actions: ${actions.slice(0, 5).join(' -> ')}${actions.length > 5 ? '...' : ''}`,
405
+ tags: [verdict.label.toLowerCase(), trajectory.domain, 'strategy'],
406
+ });
407
+ // Extract key step patterns for successful trajectories
408
+ if (verdict.label === 'Success' && trajectory.steps.length > 0) {
409
+ const highRewardSteps = trajectory.steps
410
+ .filter(s => s.reward > 0.7)
411
+ .slice(0, 3);
412
+ for (const step of highRewardSteps) {
413
+ patterns.push({
414
+ title: `High-reward action: ${step.action.slice(0, 30)}`,
415
+ description: `Effective action in ${trajectory.domain} context`,
416
+ content: `Action: ${step.action}, Reward: ${step.reward.toFixed(2)}`,
417
+ tags: ['high-reward', trajectory.domain, 'action'],
418
+ });
419
+ }
420
+ }
421
+ return patterns;
422
+ }
423
+ computePatternEmbedding(trajectory, index) {
424
+ if (trajectory.steps.length === 0) {
425
+ return new Float32Array(768);
426
+ }
427
+ // Use weighted average of step embeddings
428
+ const dim = trajectory.steps[0].stateAfter.length;
429
+ const embedding = new Float32Array(dim);
430
+ let totalWeight = 0;
431
+ for (let i = 0; i < trajectory.steps.length; i++) {
432
+ const weight = (i + 1 + index) / (trajectory.steps.length + index);
433
+ totalWeight += weight;
434
+ for (let j = 0; j < dim; j++) {
435
+ embedding[j] += trajectory.steps[i].stateAfter[j] * weight;
436
+ }
437
+ }
438
+ for (let j = 0; j < dim; j++) {
439
+ embedding[j] /= totalWeight;
440
+ }
441
+ return embedding;
442
+ }
443
+ }
444
+ // ============================================================================
445
+ // Factory Functions
446
+ // ============================================================================
447
+ /**
448
+ * Create ReasoningBank adapter
449
+ */
450
+ export function createReasoningBankAdapter(config) {
451
+ return new ReasoningBankAdapter(config);
452
+ }
453
+ /**
454
+ * Create default ReasoningBank adapter
455
+ */
456
+ export function createDefaultReasoningBankAdapter() {
457
+ return new ReasoningBankAdapter({
458
+ enableLearning: true,
459
+ enableReasoning: true,
460
+ sonaMode: 'balanced',
461
+ });
462
+ }
463
+ //# sourceMappingURL=reasoningbank-adapter.js.map