agentic-flow 2.0.3 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/test-neural.md +14 -0
- package/.claude/settings.json +9 -133
- package/README.md +624 -1776
- package/dist/.tsbuildinfo +1 -1
- package/dist/billing/mcp/tools.js +0 -1
- package/dist/billing/mcp/tools.js.map +1 -1
- package/dist/cli/commands/hooks.d.ts.map +1 -1
- package/dist/cli/commands/hooks.js +4 -79
- package/dist/cli/commands/hooks.js.map +1 -1
- package/dist/cli-proxy.js +1 -89
- package/dist/cli-proxy.js.map +1 -1
- package/dist/core/agentdb-fast.js +3 -3
- package/dist/core/agentdb-fast.js.map +1 -1
- package/dist/core/agentdb-wrapper-enhanced.d.ts.map +1 -1
- package/dist/core/agentdb-wrapper-enhanced.js +4 -20
- package/dist/core/agentdb-wrapper-enhanced.js.map +1 -1
- package/dist/core/agentdb-wrapper.d.ts +2 -3
- package/dist/core/agentdb-wrapper.d.ts.map +1 -1
- package/dist/core/agentdb-wrapper.js +1 -15
- package/dist/core/agentdb-wrapper.js.map +1 -1
- package/dist/core/attention-native.d.ts +0 -4
- package/dist/core/attention-native.d.ts.map +1 -1
- package/dist/core/attention-native.js +2 -14
- package/dist/core/attention-native.js.map +1 -1
- package/dist/federation/SecurityManager.d.ts +2 -11
- package/dist/federation/SecurityManager.d.ts.map +1 -1
- package/dist/federation/SecurityManager.js +17 -50
- package/dist/federation/SecurityManager.js.map +1 -1
- package/dist/federation/integrations/supabase-adapter-debug.js +3 -3
- package/dist/federation/integrations/supabase-adapter-debug.js.map +1 -1
- package/dist/hooks/swarm-learning-optimizer.js +5 -5
- package/dist/hooks/swarm-learning-optimizer.js.map +1 -1
- package/dist/intelligence/IntelligenceStore.d.ts +26 -35
- package/dist/intelligence/IntelligenceStore.d.ts.map +1 -1
- package/dist/intelligence/IntelligenceStore.js +123 -308
- package/dist/intelligence/IntelligenceStore.js.map +1 -1
- package/dist/intelligence/RuVectorIntelligence.d.ts +1 -26
- package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -1
- package/dist/intelligence/RuVectorIntelligence.js +10 -49
- package/dist/intelligence/RuVectorIntelligence.js.map +1 -1
- package/dist/intelligence/agent-booster-enhanced.d.ts +0 -1
- package/dist/intelligence/agent-booster-enhanced.d.ts.map +1 -1
- package/dist/intelligence/agent-booster-enhanced.js +3 -24
- package/dist/intelligence/agent-booster-enhanced.js.map +1 -1
- package/dist/intelligence/index.d.ts +3 -29
- package/dist/intelligence/index.d.ts.map +1 -1
- package/dist/intelligence/index.js +3 -13
- package/dist/intelligence/index.js.map +1 -1
- package/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
- package/dist/mcp/claudeFlowSdkServer.js +3 -9
- package/dist/mcp/claudeFlowSdkServer.js.map +1 -1
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +5 -5
- package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/init.d.ts.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/init.js +7 -36
- package/dist/mcp/fastmcp/tools/swarm/init.js.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/spawn.d.ts.map +1 -1
- package/dist/mcp/fastmcp/tools/swarm/spawn.js +8 -47
- package/dist/mcp/fastmcp/tools/swarm/spawn.js.map +1 -1
- package/dist/mcp/tools/agent-booster-tools.d.ts +1 -1
- package/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -1
- package/dist/mcp/tools/agent-booster-tools.js +4 -10
- package/dist/mcp/tools/agent-booster-tools.js.map +1 -1
- package/dist/mcp/tools/sona-tools.d.ts.map +1 -1
- package/dist/mcp/tools/sona-tools.js +0 -6
- package/dist/mcp/tools/sona-tools.js.map +1 -1
- package/dist/optimizations/agent-booster-migration.d.ts.map +1 -1
- package/dist/optimizations/agent-booster-migration.js +2 -5
- package/dist/optimizations/agent-booster-migration.js.map +1 -1
- package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
- package/dist/proxy/anthropic-to-requesty.js.map +1 -1
- package/dist/proxy/quic-proxy.d.ts +1 -0
- package/dist/proxy/quic-proxy.d.ts.map +1 -1
- package/dist/proxy/quic-proxy.js +2 -2
- package/dist/proxy/quic-proxy.js.map +1 -1
- package/dist/reasoningbank/AdvancedMemory.js +1 -1
- package/dist/reasoningbank/AdvancedMemory.js.map +1 -1
- package/dist/reasoningbank/HybridBackend.d.ts.map +1 -1
- package/dist/reasoningbank/HybridBackend.js +5 -2
- package/dist/reasoningbank/HybridBackend.js.map +1 -1
- package/dist/reasoningbank/backend-selector.d.ts +1 -11
- package/dist/reasoningbank/backend-selector.d.ts.map +1 -1
- package/dist/reasoningbank/backend-selector.js +5 -45
- package/dist/reasoningbank/backend-selector.js.map +1 -1
- package/dist/reasoningbank/core/consolidate.d.ts.map +1 -1
- package/dist/reasoningbank/core/consolidate.js +45 -113
- package/dist/reasoningbank/core/consolidate.js.map +1 -1
- package/dist/reasoningbank/index-new.d.ts +6 -1
- package/dist/reasoningbank/index-new.d.ts.map +1 -1
- package/dist/reasoningbank/index-new.js +6 -1
- package/dist/reasoningbank/index-new.js.map +1 -1
- package/dist/reasoningbank/index.d.ts +6 -2
- package/dist/reasoningbank/index.d.ts.map +1 -1
- package/dist/reasoningbank/index.js +6 -2
- package/dist/reasoningbank/index.js.map +1 -1
- package/dist/reasoningbank/utils/embeddings.d.ts +0 -1
- package/dist/reasoningbank/utils/embeddings.d.ts.map +1 -1
- package/dist/reasoningbank/utils/embeddings.js +26 -53
- package/dist/reasoningbank/utils/embeddings.js.map +1 -1
- package/dist/router/index.d.ts +17 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +19 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/providers/onnx-local-optimized.d.ts +0 -2
- package/dist/router/providers/onnx-local-optimized.d.ts.map +1 -1
- package/dist/router/providers/onnx-local-optimized.js +0 -10
- package/dist/router/providers/onnx-local-optimized.js.map +1 -1
- package/dist/router/providers/onnx-local.d.ts +0 -1
- package/dist/router/providers/onnx-local.d.ts.map +1 -1
- package/dist/router/providers/onnx-local.js +5 -22
- package/dist/router/providers/onnx-local.js.map +1 -1
- package/dist/services/embedding-service.js.map +1 -1
- package/dist/services/sona-agent-training.d.ts +0 -1
- package/dist/services/sona-agent-training.d.ts.map +1 -1
- package/dist/services/sona-agent-training.js.map +1 -1
- package/dist/services/sona-agentdb-integration.d.ts.map +1 -1
- package/dist/services/sona-agentdb-integration.js +6 -9
- package/dist/services/sona-agentdb-integration.js.map +1 -1
- package/dist/services/sona-service.d.ts.map +1 -1
- package/dist/services/sona-service.js +5 -6
- package/dist/services/sona-service.js.map +1 -1
- package/dist/utils/cli.d.ts +1 -1
- package/dist/utils/cli.d.ts.map +1 -1
- package/dist/utils/cli.js +0 -21
- package/dist/utils/cli.js.map +1 -1
- package/package.json +7 -19
- package/scripts/postinstall.js +4 -45
- package/.claude/agents/.claude-flow/metrics/agent-metrics.json +0 -1
- package/.claude/agents/.claude-flow/metrics/performance.json +0 -87
- package/.claude/agents/.claude-flow/metrics/task-metrics.json +0 -10
- package/.claude/skills/.claude-flow/metrics/agent-metrics.json +0 -1
- package/.claude/skills/.claude-flow/metrics/performance.json +0 -87
- package/.claude/skills/.claude-flow/metrics/task-metrics.json +0 -10
- package/.claude/skills/agentic-flow-quickstart/skill.md +0 -69
- package/.claude/skills/hooks-automation/skill.md +0 -155
- package/.claude/skills/memory-patterns/skill.md +0 -110
- package/.claude/skills/skill-builder/.claude-flow/metrics/agent-metrics.json +0 -1
- package/.claude/skills/skill-builder/.claude-flow/metrics/performance.json +0 -87
- package/.claude/skills/skill-builder/.claude-flow/metrics/task-metrics.json +0 -10
- package/.claude/skills/sparc-methodology/skill.md +0 -137
- package/.claude/skills/swarm-coordination/skill.md +0 -94
- package/.claude/skills/worker-benchmarks/skill.md +0 -135
- package/.claude/skills/worker-integration/skill.md +0 -154
- package/.claude/statusline.mjs +0 -109
- package/.claude/statusline.sh +0 -71
- package/dist/agentdb/benchmarks/comprehensive-benchmark.js +0 -664
- package/dist/agentdb/benchmarks/frontier-benchmark.js +0 -419
- package/dist/agentdb/benchmarks/reflexion-benchmark.js +0 -370
- package/dist/agentdb/cli/agentdb-cli.js +0 -717
- package/dist/agentdb/controllers/CausalMemoryGraph.js +0 -322
- package/dist/agentdb/controllers/CausalRecall.js +0 -281
- package/dist/agentdb/controllers/EmbeddingService.d.ts +0 -37
- package/dist/agentdb/controllers/EmbeddingService.d.ts.map +0 -1
- package/dist/agentdb/controllers/EmbeddingService.js +0 -119
- package/dist/agentdb/controllers/EmbeddingService.js.map +0 -1
- package/dist/agentdb/controllers/ExplainableRecall.js +0 -387
- package/dist/agentdb/controllers/NightlyLearner.js +0 -382
- package/dist/agentdb/controllers/ReflexionMemory.js +0 -239
- package/dist/agentdb/controllers/SkillLibrary.js +0 -276
- package/dist/agentdb/controllers/frontier-index.js +0 -9
- package/dist/agentdb/controllers/index.js +0 -8
- package/dist/agentdb/optimizations/BatchOperations.js +0 -198
- package/dist/agentdb/optimizations/QueryOptimizer.js +0 -225
- package/dist/agentdb/optimizations/index.js +0 -7
- package/dist/agentdb/tests/frontier-features.test.js +0 -665
- package/dist/benchmarks/embeddings-benchmark.d.ts +0 -38
- package/dist/benchmarks/embeddings-benchmark.d.ts.map +0 -1
- package/dist/benchmarks/embeddings-benchmark.js +0 -282
- package/dist/benchmarks/embeddings-benchmark.js.map +0 -1
- package/dist/cli/commands/embeddings.d.ts +0 -12
- package/dist/cli/commands/embeddings.d.ts.map +0 -1
- package/dist/cli/commands/embeddings.js +0 -386
- package/dist/cli/commands/embeddings.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -8
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -514
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/workers.d.ts +0 -9
- package/dist/cli/commands/workers.d.ts.map +0 -1
- package/dist/cli/commands/workers.js +0 -991
- package/dist/cli/commands/workers.js.map +0 -1
- package/dist/cli/skills-manager.js +0 -1297
- package/dist/cli/update-message.js +0 -175
- package/dist/embeddings/index.d.ts +0 -17
- package/dist/embeddings/index.d.ts.map +0 -1
- package/dist/embeddings/index.js +0 -17
- package/dist/embeddings/index.js.map +0 -1
- package/dist/embeddings/neural-substrate.d.ts +0 -206
- package/dist/embeddings/neural-substrate.d.ts.map +0 -1
- package/dist/embeddings/neural-substrate.js +0 -629
- package/dist/embeddings/neural-substrate.js.map +0 -1
- package/dist/embeddings/optimized-embedder.d.ts +0 -103
- package/dist/embeddings/optimized-embedder.d.ts.map +0 -1
- package/dist/embeddings/optimized-embedder.js +0 -730
- package/dist/embeddings/optimized-embedder.js.map +0 -1
- package/dist/examples/embedding-geometry.d.ts +0 -105
- package/dist/examples/embedding-geometry.d.ts.map +0 -1
- package/dist/examples/embedding-geometry.js +0 -528
- package/dist/examples/embedding-geometry.js.map +0 -1
- package/dist/memory/SharedMemoryPool.d.ts +0 -129
- package/dist/memory/SharedMemoryPool.d.ts.map +0 -1
- package/dist/memory/SharedMemoryPool.js +0 -243
- package/dist/memory/SharedMemoryPool.js.map +0 -1
- package/dist/memory/index.d.ts +0 -8
- package/dist/memory/index.d.ts.map +0 -1
- package/dist/memory/index.js +0 -7
- package/dist/memory/index.js.map +0 -1
- package/dist/proxy/http3-proxy-old.js +0 -331
- package/dist/proxy/proxy/anthropic-to-gemini.js +0 -439
- package/dist/proxy/utils/logger.js +0 -59
- package/dist/reasoningbank/agentdb-adapter.js +0 -125
- package/dist/reasoningbank/core/database.js +0 -250
- package/dist/reasoningbank/core/memory-engine.js +0 -335
- package/dist/swarm/ipfs-swarm.d.ts +0 -265
- package/dist/swarm/ipfs-swarm.d.ts.map +0 -1
- package/dist/swarm/ipfs-swarm.js +0 -508
- package/dist/swarm/ipfs-swarm.js.map +0 -1
- package/dist/swarm/p2p-free-swarm.d.ts +0 -344
- package/dist/swarm/p2p-free-swarm.d.ts.map +0 -1
- package/dist/swarm/p2p-free-swarm.js +0 -603
- package/dist/swarm/p2p-free-swarm.js.map +0 -1
- package/dist/swarm/real-p2p-swarm.d.ts +0 -183
- package/dist/swarm/real-p2p-swarm.d.ts.map +0 -1
- package/dist/swarm/real-p2p-swarm.js +0 -469
- package/dist/swarm/real-p2p-swarm.js.map +0 -1
- package/dist/utils/adaptive-pool-sizing.js +0 -414
- package/dist/utils/agentdbCommands.js +0 -175
- package/dist/utils/circular-rate-limiter.js +0 -391
- package/dist/utils/dynamic-compression.js +0 -298
- package/dist/utils/http2-multiplexing.js +0 -319
- package/dist/utils/index.d.ts +0 -6
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -6
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/lazy-auth.js +0 -311
- package/dist/utils/model-cache.d.ts +0 -61
- package/dist/utils/model-cache.d.ts.map +0 -1
- package/dist/utils/model-cache.js +0 -176
- package/dist/utils/model-cache.js.map +0 -1
- package/dist/utils/server-push.js +0 -251
- package/dist/utils/suppress-warnings.d.ts +0 -19
- package/dist/utils/suppress-warnings.d.ts.map +0 -1
- package/dist/utils/suppress-warnings.js +0 -59
- package/dist/utils/suppress-warnings.js.map +0 -1
- package/dist/utils/zero-copy-buffer.js +0 -286
- package/dist/workers/consolidated-phases.d.ts +0 -40
- package/dist/workers/consolidated-phases.d.ts.map +0 -1
- package/dist/workers/consolidated-phases.js +0 -497
- package/dist/workers/consolidated-phases.js.map +0 -1
- package/dist/workers/custom-worker-config.d.ts +0 -133
- package/dist/workers/custom-worker-config.d.ts.map +0 -1
- package/dist/workers/custom-worker-config.js +0 -215
- package/dist/workers/custom-worker-config.js.map +0 -1
- package/dist/workers/custom-worker-factory.d.ts +0 -89
- package/dist/workers/custom-worker-factory.d.ts.map +0 -1
- package/dist/workers/custom-worker-factory.js +0 -404
- package/dist/workers/custom-worker-factory.js.map +0 -1
- package/dist/workers/dispatch-service.d.ts +0 -123
- package/dist/workers/dispatch-service.d.ts.map +0 -1
- package/dist/workers/dispatch-service.js +0 -1024
- package/dist/workers/dispatch-service.js.map +0 -1
- package/dist/workers/hooks-integration.d.ts +0 -79
- package/dist/workers/hooks-integration.d.ts.map +0 -1
- package/dist/workers/hooks-integration.js +0 -286
- package/dist/workers/hooks-integration.js.map +0 -1
- package/dist/workers/index.d.ts +0 -42
- package/dist/workers/index.d.ts.map +0 -1
- package/dist/workers/index.js +0 -52
- package/dist/workers/index.js.map +0 -1
- package/dist/workers/mcp-tools.d.ts +0 -56
- package/dist/workers/mcp-tools.d.ts.map +0 -1
- package/dist/workers/mcp-tools.js +0 -359
- package/dist/workers/mcp-tools.js.map +0 -1
- package/dist/workers/phase-executors.d.ts +0 -22
- package/dist/workers/phase-executors.d.ts.map +0 -1
- package/dist/workers/phase-executors.js +0 -445
- package/dist/workers/phase-executors.js.map +0 -1
- package/dist/workers/resource-governor.d.ts +0 -75
- package/dist/workers/resource-governor.d.ts.map +0 -1
- package/dist/workers/resource-governor.js +0 -187
- package/dist/workers/resource-governor.js.map +0 -1
- package/dist/workers/ruvector-integration.d.ts +0 -163
- package/dist/workers/ruvector-integration.d.ts.map +0 -1
- package/dist/workers/ruvector-integration.js +0 -543
- package/dist/workers/ruvector-integration.js.map +0 -1
- package/dist/workers/ruvector-native-integration.d.ts +0 -91
- package/dist/workers/ruvector-native-integration.d.ts.map +0 -1
- package/dist/workers/ruvector-native-integration.js +0 -254
- package/dist/workers/ruvector-native-integration.js.map +0 -1
- package/dist/workers/trigger-detector.d.ts +0 -68
- package/dist/workers/trigger-detector.d.ts.map +0 -1
- package/dist/workers/trigger-detector.js +0 -281
- package/dist/workers/trigger-detector.js.map +0 -1
- package/dist/workers/types.d.ts +0 -145
- package/dist/workers/types.d.ts.map +0 -1
- package/dist/workers/types.js +0 -6
- package/dist/workers/types.js.map +0 -1
- package/dist/workers/worker-agent-integration.d.ts +0 -140
- package/dist/workers/worker-agent-integration.d.ts.map +0 -1
- package/dist/workers/worker-agent-integration.js +0 -471
- package/dist/workers/worker-agent-integration.js.map +0 -1
- package/dist/workers/worker-benchmarks.d.ts +0 -88
- package/dist/workers/worker-benchmarks.d.ts.map +0 -1
- package/dist/workers/worker-benchmarks.js +0 -452
- package/dist/workers/worker-benchmarks.js.map +0 -1
- package/dist/workers/worker-registry.d.ts +0 -85
- package/dist/workers/worker-registry.d.ts.map +0 -1
- package/dist/workers/worker-registry.js +0 -547
- package/dist/workers/worker-registry.js.map +0 -1
- package/docs/.claude-flow/metrics/agent-metrics.json +0 -1
- package/docs/.claude-flow/metrics/performance.json +0 -87
- package/docs/.claude-flow/metrics/task-metrics.json +0 -10
- package/docs/embeddings/EMBEDDING_GEOMETRY.md +0 -935
- /package/.claude/agents/analysis/{analyze-code-quality.md → code-review/analyze-code-quality.md} +0 -0
- /package/.claude/agents/architecture/{arch-system-design.md → system-design/arch-system-design.md} +0 -0
- /package/.claude/agents/data/{data-ml-model.md → ml/data-ml-model.md} +0 -0
- /package/.claude/agents/development/{dev-backend-api.md → backend/dev-backend-api.md} +0 -0
- /package/.claude/agents/devops/{ops-cicd-github.md → ci-cd/ops-cicd-github.md} +0 -0
- /package/.claude/agents/documentation/{docs-api-openapi.md → api-docs/docs-api-openapi.md} +0 -0
- /package/.claude/agents/specialized/{spec-mobile-react-native.md → mobile/spec-mobile-react-native.md} +0 -0
- /package/.claude/agents/testing/{tdd-london-swarm.md → unit/tdd-london-swarm.md} +0 -0
- /package/.claude/agents/testing/{production-validator.md → validation/production-validator.md} +0 -0
|
@@ -53,143 +53,75 @@ export async function consolidate() {
|
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
55
|
* Deduplicate highly similar memories
|
|
56
|
-
* PERFORMANCE FIX: Use bucketing/blocking to reduce O(n²) to ~O(n·k)
|
|
57
|
-
* by only comparing memories within the same semantic bucket
|
|
58
56
|
*/
|
|
59
57
|
async function deduplicateMemories(memories, threshold) {
|
|
60
58
|
let duplicatesFound = 0;
|
|
61
|
-
|
|
62
|
-
return 0;
|
|
63
|
-
// Fetch all embeddings in a single batch query (instead of N queries)
|
|
59
|
+
// Fetch embeddings for all memories
|
|
64
60
|
const dbConn = db.getDb();
|
|
65
|
-
const ids = memories.map(m => m.id);
|
|
66
|
-
const placeholders = ids.map(() => '?').join(',');
|
|
67
|
-
const rows = dbConn.prepare(`SELECT id, vector FROM pattern_embeddings WHERE id IN (${placeholders})`).all(...ids);
|
|
68
61
|
const embeddingsMap = new Map();
|
|
69
|
-
for (const row of rows) {
|
|
70
|
-
embeddingsMap.set(row.id, new Float32Array(row.vector));
|
|
71
|
-
}
|
|
72
|
-
// PERFORMANCE: Use locality-sensitive hashing (LSH) bucketing
|
|
73
|
-
// Group memories by their dominant embedding dimension to reduce comparisons
|
|
74
|
-
const buckets = new Map();
|
|
75
|
-
const BUCKET_GRANULARITY = 10; // Number of buckets per dimension
|
|
76
62
|
for (const mem of memories) {
|
|
77
|
-
const
|
|
78
|
-
if (
|
|
79
|
-
|
|
80
|
-
// Find dominant dimension and bucket
|
|
81
|
-
let maxDim = 0;
|
|
82
|
-
let maxVal = -Infinity;
|
|
83
|
-
for (let i = 0; i < Math.min(emb.length, 32); i++) { // Check first 32 dims
|
|
84
|
-
if (Math.abs(emb[i]) > maxVal) {
|
|
85
|
-
maxVal = Math.abs(emb[i]);
|
|
86
|
-
maxDim = i;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
const bucketKey = maxDim * BUCKET_GRANULARITY + Math.floor((emb[maxDim] + 1) * BUCKET_GRANULARITY / 2);
|
|
90
|
-
if (!buckets.has(bucketKey)) {
|
|
91
|
-
buckets.set(bucketKey, []);
|
|
63
|
+
const row = dbConn.prepare('SELECT vector FROM pattern_embeddings WHERE id = ?').get(mem.id);
|
|
64
|
+
if (row) {
|
|
65
|
+
embeddingsMap.set(mem.id, new Float32Array(row.vector));
|
|
92
66
|
}
|
|
93
|
-
buckets.get(bucketKey).push(mem);
|
|
94
67
|
}
|
|
95
|
-
// Compare
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
const mem1 = bucketMemories[i];
|
|
101
|
-
if (deletedIds.has(mem1.id))
|
|
102
|
-
continue;
|
|
68
|
+
// Compare all pairs
|
|
69
|
+
for (let i = 0; i < memories.length; i++) {
|
|
70
|
+
for (let j = i + 1; j < memories.length; j++) {
|
|
71
|
+
const mem1 = memories[i];
|
|
72
|
+
const mem2 = memories[j];
|
|
103
73
|
const emb1 = embeddingsMap.get(mem1.id);
|
|
104
|
-
|
|
74
|
+
const emb2 = embeddingsMap.get(mem2.id);
|
|
75
|
+
if (!emb1 || !emb2)
|
|
105
76
|
continue;
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
db.storeLink(mem1.id, mem2.id, 'duplicate_of', similarity);
|
|
117
|
-
duplicatesFound++;
|
|
118
|
-
// Merge: keep the one with higher usage
|
|
119
|
-
if (mem1.usage_count < mem2.usage_count) {
|
|
120
|
-
deletedIds.add(mem1.id);
|
|
121
|
-
console.log(`[INFO] Merged duplicate: ${mem1.pattern_data?.title || mem1.id} → ${mem2.pattern_data?.title || mem2.id}`);
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
deletedIds.add(mem2.id);
|
|
125
|
-
}
|
|
77
|
+
const similarity = cosineSimilarity(emb1, emb2);
|
|
78
|
+
if (similarity >= threshold) {
|
|
79
|
+
// Mark as duplicate
|
|
80
|
+
db.storeLink(mem1.id, mem2.id, 'duplicate_of', similarity);
|
|
81
|
+
duplicatesFound++;
|
|
82
|
+
// Merge: keep the one with higher usage
|
|
83
|
+
if (mem1.usage_count < mem2.usage_count) {
|
|
84
|
+
// Delete mem1 (lower usage)
|
|
85
|
+
dbConn.prepare('DELETE FROM patterns WHERE id = ?').run(mem1.id);
|
|
86
|
+
console.log(`[INFO] Merged duplicate: ${mem1.pattern_data.title} → ${mem2.pattern_data.title}`);
|
|
126
87
|
}
|
|
127
88
|
}
|
|
128
89
|
}
|
|
129
90
|
}
|
|
130
|
-
// Batch delete all duplicates in a single transaction
|
|
131
|
-
if (deletedIds.size > 0) {
|
|
132
|
-
const deleteIds = Array.from(deletedIds);
|
|
133
|
-
const deletePlaceholders = deleteIds.map(() => '?').join(',');
|
|
134
|
-
dbConn.prepare(`DELETE FROM patterns WHERE id IN (${deletePlaceholders})`).run(...deleteIds);
|
|
135
|
-
}
|
|
136
91
|
return duplicatesFound;
|
|
137
92
|
}
|
|
138
93
|
/**
|
|
139
94
|
* Detect contradicting memories
|
|
140
95
|
* Uses embedding similarity + semantic analysis
|
|
141
|
-
* PERFORMANCE FIX: Reuses embeddings from deduplication phase and uses bucketing
|
|
142
96
|
*/
|
|
143
|
-
async function detectContradictions(memories, threshold
|
|
97
|
+
async function detectContradictions(memories, threshold) {
|
|
144
98
|
let contradictionsFound = 0;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
// Use preloaded embeddings if available, otherwise fetch in batch
|
|
148
|
-
let embeddingsMap;
|
|
149
|
-
if (preloadedEmbeddings) {
|
|
150
|
-
embeddingsMap = preloadedEmbeddings;
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
153
|
-
const dbConn = db.getDb();
|
|
154
|
-
const ids = memories.map(m => m.id);
|
|
155
|
-
const placeholders = ids.map(() => '?').join(',');
|
|
156
|
-
const rows = dbConn.prepare(`SELECT id, vector FROM pattern_embeddings WHERE id IN (${placeholders})`).all(...ids);
|
|
157
|
-
embeddingsMap = new Map();
|
|
158
|
-
for (const row of rows) {
|
|
159
|
-
embeddingsMap.set(row.id, new Float32Array(row.vector));
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
// PERFORMANCE: Group by outcome first, only compare across different outcomes
|
|
163
|
-
const outcomeGroups = new Map();
|
|
99
|
+
const dbConn = db.getDb();
|
|
100
|
+
const embeddingsMap = new Map();
|
|
164
101
|
for (const mem of memories) {
|
|
165
|
-
const
|
|
166
|
-
if (
|
|
167
|
-
|
|
102
|
+
const row = dbConn.prepare('SELECT vector FROM pattern_embeddings WHERE id = ?').get(mem.id);
|
|
103
|
+
if (row) {
|
|
104
|
+
embeddingsMap.set(mem.id, new Float32Array(row.vector));
|
|
168
105
|
}
|
|
169
|
-
outcomeGroups.get(outcome).push(mem);
|
|
170
106
|
}
|
|
171
|
-
//
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const
|
|
176
|
-
const
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
db.storeLink(mem1.id, mem2.id, 'contradicts', similarity);
|
|
190
|
-
contradictionsFound++;
|
|
191
|
-
console.log(`[WARN] Contradiction detected: ${mem1.pattern_data?.title || mem1.id} vs ${mem2.pattern_data?.title || mem2.id}`);
|
|
192
|
-
}
|
|
107
|
+
// Look for memories with high similarity but opposite outcomes
|
|
108
|
+
for (let i = 0; i < memories.length; i++) {
|
|
109
|
+
for (let j = i + 1; j < memories.length; j++) {
|
|
110
|
+
const mem1 = memories[i];
|
|
111
|
+
const mem2 = memories[j];
|
|
112
|
+
const emb1 = embeddingsMap.get(mem1.id);
|
|
113
|
+
const emb2 = embeddingsMap.get(mem2.id);
|
|
114
|
+
if (!emb1 || !emb2)
|
|
115
|
+
continue;
|
|
116
|
+
const similarity = cosineSimilarity(emb1, emb2);
|
|
117
|
+
// High similarity but different outcomes = potential contradiction
|
|
118
|
+
if (similarity >= threshold) {
|
|
119
|
+
const outcome1 = mem1.pattern_data.source?.outcome;
|
|
120
|
+
const outcome2 = mem2.pattern_data.source?.outcome;
|
|
121
|
+
if (outcome1 !== outcome2) {
|
|
122
|
+
db.storeLink(mem1.id, mem2.id, 'contradicts', similarity);
|
|
123
|
+
contradictionsFound++;
|
|
124
|
+
console.log(`[WARN] Contradiction detected: ${mem1.pattern_data.title} vs ${mem2.pattern_data.title}`);
|
|
193
125
|
}
|
|
194
126
|
}
|
|
195
127
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consolidate.js","sourceRoot":"","sources":["../../../src/reasoningbank/core/consolidate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Memory Consolidation\n * Algorithm 4 from ReasoningBank paper: Dedup, Contradict, Prune\n */\n\nimport { ulid } from 'ulid';\nimport { loadConfig } from '../utils/config.js';\nimport { cosineSimilarity } from '../utils/mmr.js';\nimport * as db from '../db/queries.js';\n\nexport interface ConsolidationResult {\n itemsProcessed: number;\n duplicatesFound: number;\n contradictionsFound: number;\n itemsPruned: number;\n durationMs: number;\n}\n\n/**\n * Run consolidation: deduplicate, detect contradictions, prune old memories\n */\nexport async function consolidate(): Promise<ConsolidationResult> {\n const config = loadConfig();\n const startTime = Date.now();\n\n console.log('[INFO] Starting memory consolidation...');\n\n const runId = ulid();\n const memories = db.getAllActiveMemories();\n\n console.log(`[INFO] Processing ${memories.length} active memories`);\n\n let duplicatesFound = 0;\n let contradictionsFound = 0;\n let itemsPruned = 0;\n\n // Step 1: Deduplicate similar memories\n duplicatesFound = await deduplicateMemories(memories, config.consolidate.duplicate_threshold);\n\n // Step 2: Detect contradictions\n contradictionsFound = await detectContradictions(memories, config.consolidate.contradiction_threshold);\n\n // Step 3: Prune old, unused memories\n itemsPruned = db.pruneOldMemories({\n maxAgeDays: config.consolidate.prune_age_days,\n minConfidence: config.consolidate.min_confidence_keep\n });\n\n const durationMs = Date.now() - startTime;\n\n // Store consolidation run\n db.storeConsolidationRun({\n run_id: runId,\n items_processed: memories.length,\n duplicates_found: duplicatesFound,\n contradictions_found: contradictionsFound,\n items_pruned: itemsPruned,\n duration_ms: durationMs\n });\n\n console.log(`[INFO] Consolidation complete: ${duplicatesFound} dupes, ${contradictionsFound} contradictions, ${itemsPruned} pruned in ${durationMs}ms`);\n\n db.logMetric('rb.consolidate.duration_ms', durationMs);\n db.logMetric('rb.consolidate.duplicates', duplicatesFound);\n db.logMetric('rb.consolidate.contradictions', contradictionsFound);\n db.logMetric('rb.consolidate.pruned', itemsPruned);\n\n return {\n itemsProcessed: memories.length,\n duplicatesFound,\n contradictionsFound,\n itemsPruned,\n durationMs\n };\n}\n\n/**\n * Deduplicate highly similar memories\n * PERFORMANCE FIX: Use bucketing/blocking to reduce O(n²) to ~O(n·k)\n * by only comparing memories within the same semantic bucket\n */\nasync function deduplicateMemories(\n memories: any[],\n threshold: number\n): Promise<number> {\n let duplicatesFound = 0;\n\n if (memories.length === 0) return 0;\n\n // Fetch all embeddings in a single batch query (instead of N queries)\n const dbConn = db.getDb();\n const ids = memories.map(m => m.id);\n const placeholders = ids.map(() => '?').join(',');\n const rows = dbConn.prepare(`SELECT id, vector FROM pattern_embeddings WHERE id IN (${placeholders})`).all(...ids) as Array<{ id: string; vector: Buffer }>;\n\n const embeddingsMap = new Map<string, Float32Array>();\n for (const row of rows) {\n embeddingsMap.set(row.id, new Float32Array(row.vector));\n }\n\n // PERFORMANCE: Use locality-sensitive hashing (LSH) bucketing\n // Group memories by their dominant embedding dimension to reduce comparisons\n const buckets = new Map<number, any[]>();\n const BUCKET_GRANULARITY = 10; // Number of buckets per dimension\n\n for (const mem of memories) {\n const emb = embeddingsMap.get(mem.id);\n if (!emb) continue;\n\n // Find dominant dimension and bucket\n let maxDim = 0;\n let maxVal = -Infinity;\n for (let i = 0; i < Math.min(emb.length, 32); i++) { // Check first 32 dims\n if (Math.abs(emb[i]) > maxVal) {\n maxVal = Math.abs(emb[i]);\n maxDim = i;\n }\n }\n const bucketKey = maxDim * BUCKET_GRANULARITY + Math.floor((emb[maxDim] + 1) * BUCKET_GRANULARITY / 2);\n\n if (!buckets.has(bucketKey)) {\n buckets.set(bucketKey, []);\n }\n buckets.get(bucketKey)!.push(mem);\n }\n\n // Compare only within buckets (and neighboring buckets for safety)\n const deletedIds = new Set<string>();\n\n for (const [bucketKey, bucketMemories] of buckets) {\n // Compare within bucket\n for (let i = 0; i < bucketMemories.length; i++) {\n const mem1 = bucketMemories[i];\n if (deletedIds.has(mem1.id)) continue;\n\n const emb1 = embeddingsMap.get(mem1.id);\n if (!emb1) continue;\n\n for (let j = i + 1; j < bucketMemories.length; j++) {\n const mem2 = bucketMemories[j];\n if (deletedIds.has(mem2.id)) continue;\n\n const emb2 = embeddingsMap.get(mem2.id);\n if (!emb2) continue;\n\n const similarity = cosineSimilarity(emb1, emb2);\n\n if (similarity >= threshold) {\n // Mark as duplicate\n db.storeLink(mem1.id, mem2.id, 'duplicate_of', similarity);\n duplicatesFound++;\n\n // Merge: keep the one with higher usage\n if (mem1.usage_count < mem2.usage_count) {\n deletedIds.add(mem1.id);\n console.log(`[INFO] Merged duplicate: ${mem1.pattern_data?.title || mem1.id} → ${mem2.pattern_data?.title || mem2.id}`);\n } else {\n deletedIds.add(mem2.id);\n }\n }\n }\n }\n }\n\n // Batch delete all duplicates in a single transaction\n if (deletedIds.size > 0) {\n const deleteIds = Array.from(deletedIds);\n const deletePlaceholders = deleteIds.map(() => '?').join(',');\n dbConn.prepare(`DELETE FROM patterns WHERE id IN (${deletePlaceholders})`).run(...deleteIds);\n }\n\n return duplicatesFound;\n}\n\n/**\n * Detect contradicting memories\n * Uses embedding similarity + semantic analysis\n * PERFORMANCE FIX: Reuses embeddings from deduplication phase and uses bucketing\n */\nasync function detectContradictions(\n memories: any[],\n threshold: number,\n preloadedEmbeddings?: Map<string, Float32Array>\n): Promise<number> {\n let contradictionsFound = 0;\n\n if (memories.length === 0) return 0;\n\n // Use preloaded embeddings if available, otherwise fetch in batch\n let embeddingsMap: Map<string, Float32Array>;\n\n if (preloadedEmbeddings) {\n embeddingsMap = preloadedEmbeddings;\n } else {\n const dbConn = db.getDb();\n const ids = memories.map(m => m.id);\n const placeholders = ids.map(() => '?').join(',');\n const rows = dbConn.prepare(`SELECT id, vector FROM pattern_embeddings WHERE id IN (${placeholders})`).all(...ids) as Array<{ id: string; vector: Buffer }>;\n\n embeddingsMap = new Map<string, Float32Array>();\n for (const row of rows) {\n embeddingsMap.set(row.id, new Float32Array(row.vector));\n }\n }\n\n // PERFORMANCE: Group by outcome first, only compare across different outcomes\n const outcomeGroups = new Map<string, any[]>();\n\n for (const mem of memories) {\n const outcome = mem.pattern_data?.source?.outcome ?? 'unknown';\n if (!outcomeGroups.has(outcome)) {\n outcomeGroups.set(outcome, []);\n }\n outcomeGroups.get(outcome)!.push(mem);\n }\n\n // Only compare memories with different outcomes\n const outcomeKeys = Array.from(outcomeGroups.keys());\n\n for (let o1 = 0; o1 < outcomeKeys.length; o1++) {\n for (let o2 = o1 + 1; o2 < outcomeKeys.length; o2++) {\n const group1 = outcomeGroups.get(outcomeKeys[o1])!;\n const group2 = outcomeGroups.get(outcomeKeys[o2])!;\n\n // Compare across groups (different outcomes)\n for (const mem1 of group1) {\n const emb1 = embeddingsMap.get(mem1.id);\n if (!emb1) continue;\n\n for (const mem2 of group2) {\n const emb2 = embeddingsMap.get(mem2.id);\n if (!emb2) continue;\n\n const similarity = cosineSimilarity(emb1, emb2);\n\n // High similarity but different outcomes = contradiction\n if (similarity >= threshold) {\n db.storeLink(mem1.id, mem2.id, 'contradicts', similarity);\n contradictionsFound++;\n console.log(`[WARN] Contradiction detected: ${mem1.pattern_data?.title || mem1.id} vs ${mem2.pattern_data?.title || mem2.id}`);\n }\n }\n }\n }\n }\n\n return contradictionsFound;\n}\n\n/**\n * Check if consolidation should run\n * Returns true if threshold of new memories is reached\n */\nexport function shouldConsolidate(): boolean {\n const config = loadConfig();\n const newCount = db.countNewMemoriesSinceConsolidation();\n return newCount >= config.consolidate.trigger_threshold;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"consolidate.js","sourceRoot":"","sources":["../../../src/reasoningbank/core/consolidate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAUvC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAEvD,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC;IACrB,MAAM,QAAQ,GAAG,EAAE,CAAC,oBAAoB,EAAE,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAEpE,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,uCAAuC;IACvC,eAAe,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;IAE9F,gCAAgC;IAChC,mBAAmB,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;IAEvG,qCAAqC;IACrC,WAAW,GAAG,EAAE,CAAC,gBAAgB,CAAC;QAChC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,cAAc;QAC7C,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,mBAAmB;KACtD,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAE1C,0BAA0B;IAC1B,EAAE,CAAC,qBAAqB,CAAC;QACvB,MAAM,EAAE,KAAK;QACb,eAAe,EAAE,QAAQ,CAAC,MAAM;QAChC,gBAAgB,EAAE,eAAe;QACjC,oBAAoB,EAAE,mBAAmB;QACzC,YAAY,EAAE,WAAW;QACzB,WAAW,EAAE,UAAU;KACxB,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,kCAAkC,eAAe,WAAW,mBAAmB,oBAAoB,WAAW,cAAc,UAAU,IAAI,CAAC,CAAC;IAExJ,EAAE,CAAC,SAAS,CAAC,4BAA4B,EAAE,UAAU,CAAC,CAAC;IACvD,EAAE,CAAC,SAAS,CAAC,2BAA2B,EAAE,eAAe,CAAC,CAAC;IAC3D,EAAE,CAAC,SAAS,CAAC,+BAA+B,EAAE,mBAAmB,CAAC,CAAC;IACnE,EAAE,CAAC,SAAS,CAAC,uBAAuB,EAAE,WAAW,CAAC,CAAC;IAEnD,OAAO;QACL,cAAc,EAAE,QAAQ,CAAC,MAAM;QAC/B,eAAe;QACf,mBAAmB;QACnB,WAAW;QACX,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAChC,QAAe,EACf,SAAiB;IAEjB,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,oCAAoC;IACpC,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IAC1B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEtD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAmC,CAAC;QAC/H,IAAI,GAAG,EAAE,CAAC;YACR,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAEzB,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAExC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;gBAAE,SAAS;YAE7B,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAEhD,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;gBAC5B,oBAAoB;gBACpB,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;gBAC3D,eAAe,EAAE,CAAC;gBAElB,wCAAwC;gBACxC,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;oBACxC,4BAA4B;oBAC5B,MAAM,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACjE,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,YAAY,CAAC,KAAK,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;gBAClG,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,oBAAoB,CACjC,QAAe,EACf,SAAiB;IAEjB,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAE5B,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;IAC1B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEtD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAmC,CAAC;QAC/H,IAAI,GAAG,EAAE,CAAC;YACR,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAEzB,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxC,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAExC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;gBAAE,SAAS;YAE7B,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAEhD,mEAAmE;YACnE,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC;gBACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC;gBAEnD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC1B,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;oBAC1D,mBAAmB,EAAE,CAAC;oBACtB,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,YAAY,CAAC,KAAK,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;gBACzG,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,EAAE,CAAC,kCAAkC,EAAE,CAAC;IACzD,OAAO,QAAQ,IAAI,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC;AAC1D,CAAC","sourcesContent":["/**\n * Memory Consolidation\n * Algorithm 4 from ReasoningBank paper: Dedup, Contradict, Prune\n */\n\nimport { ulid } from 'ulid';\nimport { loadConfig } from '../utils/config.js';\nimport { cosineSimilarity } from '../utils/mmr.js';\nimport * as db from '../db/queries.js';\n\nexport interface ConsolidationResult {\n itemsProcessed: number;\n duplicatesFound: number;\n contradictionsFound: number;\n itemsPruned: number;\n durationMs: number;\n}\n\n/**\n * Run consolidation: deduplicate, detect contradictions, prune old memories\n */\nexport async function consolidate(): Promise<ConsolidationResult> {\n const config = loadConfig();\n const startTime = Date.now();\n\n console.log('[INFO] Starting memory consolidation...');\n\n const runId = ulid();\n const memories = db.getAllActiveMemories();\n\n console.log(`[INFO] Processing ${memories.length} active memories`);\n\n let duplicatesFound = 0;\n let contradictionsFound = 0;\n let itemsPruned = 0;\n\n // Step 1: Deduplicate similar memories\n duplicatesFound = await deduplicateMemories(memories, config.consolidate.duplicate_threshold);\n\n // Step 2: Detect contradictions\n contradictionsFound = await detectContradictions(memories, config.consolidate.contradiction_threshold);\n\n // Step 3: Prune old, unused memories\n itemsPruned = db.pruneOldMemories({\n maxAgeDays: config.consolidate.prune_age_days,\n minConfidence: config.consolidate.min_confidence_keep\n });\n\n const durationMs = Date.now() - startTime;\n\n // Store consolidation run\n db.storeConsolidationRun({\n run_id: runId,\n items_processed: memories.length,\n duplicates_found: duplicatesFound,\n contradictions_found: contradictionsFound,\n items_pruned: itemsPruned,\n duration_ms: durationMs\n });\n\n console.log(`[INFO] Consolidation complete: ${duplicatesFound} dupes, ${contradictionsFound} contradictions, ${itemsPruned} pruned in ${durationMs}ms`);\n\n db.logMetric('rb.consolidate.duration_ms', durationMs);\n db.logMetric('rb.consolidate.duplicates', duplicatesFound);\n db.logMetric('rb.consolidate.contradictions', contradictionsFound);\n db.logMetric('rb.consolidate.pruned', itemsPruned);\n\n return {\n itemsProcessed: memories.length,\n duplicatesFound,\n contradictionsFound,\n itemsPruned,\n durationMs\n };\n}\n\n/**\n * Deduplicate highly similar memories\n */\nasync function deduplicateMemories(\n memories: any[],\n threshold: number\n): Promise<number> {\n let duplicatesFound = 0;\n\n // Fetch embeddings for all memories\n const dbConn = db.getDb();\n const embeddingsMap = new Map<string, Float32Array>();\n\n for (const mem of memories) {\n const row = dbConn.prepare('SELECT vector FROM pattern_embeddings WHERE id = ?').get(mem.id) as { vector: Buffer } | undefined;\n if (row) {\n embeddingsMap.set(mem.id, new Float32Array(row.vector));\n }\n }\n\n // Compare all pairs\n for (let i = 0; i < memories.length; i++) {\n for (let j = i + 1; j < memories.length; j++) {\n const mem1 = memories[i];\n const mem2 = memories[j];\n\n const emb1 = embeddingsMap.get(mem1.id);\n const emb2 = embeddingsMap.get(mem2.id);\n\n if (!emb1 || !emb2) continue;\n\n const similarity = cosineSimilarity(emb1, emb2);\n\n if (similarity >= threshold) {\n // Mark as duplicate\n db.storeLink(mem1.id, mem2.id, 'duplicate_of', similarity);\n duplicatesFound++;\n\n // Merge: keep the one with higher usage\n if (mem1.usage_count < mem2.usage_count) {\n // Delete mem1 (lower usage)\n dbConn.prepare('DELETE FROM patterns WHERE id = ?').run(mem1.id);\n console.log(`[INFO] Merged duplicate: ${mem1.pattern_data.title} → ${mem2.pattern_data.title}`);\n }\n }\n }\n }\n\n return duplicatesFound;\n}\n\n/**\n * Detect contradicting memories\n * Uses embedding similarity + semantic analysis\n */\nasync function detectContradictions(\n memories: any[],\n threshold: number\n): Promise<number> {\n let contradictionsFound = 0;\n\n const dbConn = db.getDb();\n const embeddingsMap = new Map<string, Float32Array>();\n\n for (const mem of memories) {\n const row = dbConn.prepare('SELECT vector FROM pattern_embeddings WHERE id = ?').get(mem.id) as { vector: Buffer } | undefined;\n if (row) {\n embeddingsMap.set(mem.id, new Float32Array(row.vector));\n }\n }\n\n // Look for memories with high similarity but opposite outcomes\n for (let i = 0; i < memories.length; i++) {\n for (let j = i + 1; j < memories.length; j++) {\n const mem1 = memories[i];\n const mem2 = memories[j];\n\n const emb1 = embeddingsMap.get(mem1.id);\n const emb2 = embeddingsMap.get(mem2.id);\n\n if (!emb1 || !emb2) continue;\n\n const similarity = cosineSimilarity(emb1, emb2);\n\n // High similarity but different outcomes = potential contradiction\n if (similarity >= threshold) {\n const outcome1 = mem1.pattern_data.source?.outcome;\n const outcome2 = mem2.pattern_data.source?.outcome;\n\n if (outcome1 !== outcome2) {\n db.storeLink(mem1.id, mem2.id, 'contradicts', similarity);\n contradictionsFound++;\n console.log(`[WARN] Contradiction detected: ${mem1.pattern_data.title} vs ${mem2.pattern_data.title}`);\n }\n }\n }\n }\n\n return contradictionsFound;\n}\n\n/**\n * Check if consolidation should run\n * Returns true if threshold of new memories is reached\n */\nexport function shouldConsolidate(): boolean {\n const config = loadConfig();\n const newCount = db.countNewMemoriesSinceConsolidation();\n return newCount >= config.consolidate.trigger_threshold;\n}\n"]}
|
|
@@ -8,7 +8,12 @@ export { HybridReasoningBank } from './HybridBackend.js';
|
|
|
8
8
|
export { AdvancedMemorySystem } from './AdvancedMemory.js';
|
|
9
9
|
export type { PatternData, RetrievalOptions, CausalInsight } from './HybridBackend.js';
|
|
10
10
|
export type { FailureAnalysis, SkillComposition } from './AdvancedMemory.js';
|
|
11
|
-
export { ReflexionMemory
|
|
11
|
+
export { ReflexionMemory } from 'agentdb/controllers/ReflexionMemory';
|
|
12
|
+
export { SkillLibrary } from 'agentdb/controllers/SkillLibrary';
|
|
13
|
+
export { CausalMemoryGraph } from 'agentdb/controllers/CausalMemoryGraph';
|
|
14
|
+
export { CausalRecall } from 'agentdb/controllers/CausalRecall';
|
|
15
|
+
export { NightlyLearner } from 'agentdb/controllers/NightlyLearner';
|
|
16
|
+
export { EmbeddingService } from 'agentdb/controllers/EmbeddingService';
|
|
12
17
|
export { retrieveMemories, formatMemoriesForPrompt } from './core/retrieve.js';
|
|
13
18
|
export type { RetrievedMemory } from './core/retrieve.js';
|
|
14
19
|
export { judgeTrajectory } from './core/judge.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-new.d.ts","sourceRoot":"","sources":["../../src/reasoningbank/index-new.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG7E,OAAO,
|
|
1
|
+
{"version":3,"file":"index-new.d.ts","sourceRoot":"","sources":["../../src/reasoningbank/index-new.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAGxE,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,CAAC;AACd,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,cAAc,EACf,MAAM,gBAAgB,CAAC;AASxB,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA0BhD;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC9C,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,GAAG,CAAC;IACb,YAAY,EAAE,GAAG,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC,CAuBD;AAED,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,SAAS,wCAAwC,CAAC"}
|
|
@@ -8,7 +8,12 @@
|
|
|
8
8
|
export { HybridReasoningBank } from './HybridBackend.js';
|
|
9
9
|
export { AdvancedMemorySystem } from './AdvancedMemory.js';
|
|
10
10
|
// Re-export AgentDB controllers for advanced usage
|
|
11
|
-
export { ReflexionMemory
|
|
11
|
+
export { ReflexionMemory } from 'agentdb/controllers/ReflexionMemory';
|
|
12
|
+
export { SkillLibrary } from 'agentdb/controllers/SkillLibrary';
|
|
13
|
+
export { CausalMemoryGraph } from 'agentdb/controllers/CausalMemoryGraph';
|
|
14
|
+
export { CausalRecall } from 'agentdb/controllers/CausalRecall';
|
|
15
|
+
export { NightlyLearner } from 'agentdb/controllers/NightlyLearner';
|
|
16
|
+
export { EmbeddingService } from 'agentdb/controllers/EmbeddingService';
|
|
12
17
|
// Original ReasoningBank implementations (backwards compatibility)
|
|
13
18
|
export { retrieveMemories, formatMemoriesForPrompt } from './core/retrieve.js';
|
|
14
19
|
export { judgeTrajectory } from './core/judge.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-new.js","sourceRoot":"","sources":["../../src/reasoningbank/index-new.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,gDAAgD;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAI3D,mDAAmD;AACnD,OAAO,
|
|
1
|
+
{"version":3,"file":"index-new.js","sourceRoot":"","sources":["../../src/reasoningbank/index-new.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ReasoningBank - Closed-loop memory system for AI agents\n * Based on arXiv:2509.25140 (Google DeepMind)\n *\n * @since v1.7.0 - Integrated AgentDB for optimal performance\n */\n\n// New hybrid backend (recommended for new code)\nexport { HybridReasoningBank } from './HybridBackend.js';\nexport { AdvancedMemorySystem } from './AdvancedMemory.js';\nexport type { PatternData, RetrievalOptions, CausalInsight } from './HybridBackend.js';\nexport type { FailureAnalysis, SkillComposition } from './AdvancedMemory.js';\n\n// Re-export AgentDB controllers for advanced usage\nexport { ReflexionMemory } from 'agentdb/controllers/ReflexionMemory';\nexport { SkillLibrary } from 'agentdb/controllers/SkillLibrary';\nexport { CausalMemoryGraph } from 'agentdb/controllers/CausalMemoryGraph';\nexport { CausalRecall } from 'agentdb/controllers/CausalRecall';\nexport { NightlyLearner } from 'agentdb/controllers/NightlyLearner';\nexport { EmbeddingService } from 'agentdb/controllers/EmbeddingService';\n\n// Original ReasoningBank implementations (backwards compatibility)\nexport { retrieveMemories, formatMemoriesForPrompt } from './core/retrieve.js';\nexport type { RetrievedMemory } from './core/retrieve.js';\n\nexport { judgeTrajectory } from './core/judge.js';\nexport type { Verdict } from './core/judge.js';\n\nexport { distillMemories } from './core/distill.js';\nexport type { DistilledMemory } from './core/distill.js';\n\nexport { consolidate, shouldConsolidate } from './core/consolidate.js';\nexport type { ConsolidationResult } from './core/consolidate.js';\n\nexport { mattsParallel, mattsSequential } from './core/matts.js';\nexport type { MattsResult } from './core/matts.js';\n\nexport { computeEmbedding, clearEmbeddingCache } from './utils/embeddings.js';\nexport { mmrSelection, cosineSimilarity } from './utils/mmr.js';\nexport { scrubPII, containsPII, scrubMemory } from './utils/pii-scrubber.js';\nexport { loadConfig } from './utils/config.js';\n\n// Re-export database utilities\nimport * as db from './db/queries.js';\nexport { db };\nexport type {\n ReasoningMemory,\n PatternEmbedding,\n PatternLink,\n TaskTrajectory,\n MattsRun,\n ConsolidationRun,\n Trajectory,\n TrajectoryStep\n} from './db/schema.js';\n\n// Original functions (backwards compatibility)\nimport { loadConfig } from './utils/config.js';\nimport { retrieveMemories } from './core/retrieve.js';\nimport { judgeTrajectory } from './core/judge.js';\nimport { distillMemories } from './core/distill.js';\nimport { shouldConsolidate as shouldCons, consolidate as cons } from './core/consolidate.js';\n\nexport async function initialize(): Promise<void> {\n const config = loadConfig();\n console.log('[ReasoningBank] Initializing...');\n console.log('[ReasoningBank] Enabled: true (initializing...)');\n console.log(`[ReasoningBank] Database: ${process.env.CLAUDE_FLOW_DB_PATH || '.swarm/memory.db'}`);\n console.log(`[ReasoningBank] Embeddings: ${config.embeddings.provider}`);\n console.log(`[ReasoningBank] Retrieval k: ${config.retrieve.k}`);\n\n try {\n await db.runMigrations();\n console.log(`[ReasoningBank] Database migrated successfully`);\n } catch (error) {\n console.error('[ReasoningBank] Migration error:', error);\n throw new Error('ReasoningBank initialization failed: could not run migrations');\n }\n\n try {\n const dbConn = db.getDb();\n const tables = dbConn.prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'pattern%'\").all();\n console.log(`[ReasoningBank] Database OK: ${tables.length} tables found`);\n } catch (error) {\n console.error('[ReasoningBank] Database error:', error);\n throw new Error('ReasoningBank initialization failed: database not accessible');\n }\n\n console.log('[ReasoningBank] Initialization complete');\n}\n\nexport async function runTask(options: {\n taskId: string;\n agentId: string;\n query: string;\n domain?: string;\n executeFn: (memories: any[]) => Promise<any>;\n}): Promise<{\n verdict: any;\n usedMemories: any[];\n newMemories: string[];\n consolidated: boolean;\n}> {\n console.log(`[ReasoningBank] Running task: ${options.taskId}`);\n const memories = await retrieveMemories(options.query, {\n domain: options.domain,\n agent: options.agentId\n });\n console.log(`[ReasoningBank] Retrieved ${memories.length} memories`);\n const trajectory = await options.executeFn(memories);\n const verdict = await judgeTrajectory(trajectory, options.query);\n console.log(`[ReasoningBank] Verdict: ${verdict.label} (${verdict.confidence})`);\n const newMemories = await distillMemories(trajectory, verdict, options.query, {\n taskId: options.taskId,\n agentId: options.agentId,\n domain: options.domain\n });\n console.log(`[ReasoningBank] Distilled ${newMemories.length} new memories`);\n let consolidated = false;\n if (shouldCons()) {\n console.log('[ReasoningBank] Running consolidation...');\n await cons();\n consolidated = true;\n }\n return { verdict, usedMemories: memories, newMemories, consolidated };\n}\n\nexport const VERSION = '1.7.0';\nexport const PAPER_URL = 'https://arxiv.org/html/2509.25140v1';\n"]}
|
|
@@ -6,11 +6,15 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import '../utils/agentdb-runtime-patch.js';
|
|
8
8
|
export { HybridReasoningBank } from './HybridBackend.js';
|
|
9
|
-
export { HybridReasoningBank as ReasoningBank } from './HybridBackend.js';
|
|
10
9
|
export { AdvancedMemorySystem } from './AdvancedMemory.js';
|
|
11
10
|
export type { PatternData, RetrievalOptions, CausalInsight } from './HybridBackend.js';
|
|
12
11
|
export type { FailureAnalysis, SkillComposition } from './AdvancedMemory.js';
|
|
13
|
-
export { ReflexionMemory
|
|
12
|
+
export { ReflexionMemory } from 'agentdb/controllers/ReflexionMemory';
|
|
13
|
+
export { SkillLibrary } from 'agentdb/controllers/SkillLibrary';
|
|
14
|
+
export { CausalMemoryGraph } from 'agentdb/controllers/CausalMemoryGraph';
|
|
15
|
+
export { CausalRecall } from 'agentdb/controllers/CausalRecall';
|
|
16
|
+
export { NightlyLearner } from 'agentdb/controllers/NightlyLearner';
|
|
17
|
+
export { EmbeddingService } from 'agentdb/controllers/EmbeddingService';
|
|
14
18
|
export { retrieveMemories, formatMemoriesForPrompt } from './core/retrieve.js';
|
|
15
19
|
export type { RetrievedMemory } from './core/retrieve.js';
|
|
16
20
|
export { judgeTrajectory } from './core/judge.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reasoningbank/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,mCAAmC,CAAC;AAG3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reasoningbank/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,mCAAmC,CAAC;AAG3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAGxE,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,CAAC;AACd,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,UAAU,EACV,cAAc,EACf,MAAM,gBAAgB,CAAC;AASxB,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA0BhD;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC9C,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,GAAG,CAAC;IACb,YAAY,EAAE,GAAG,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC,CAuBD;AAED,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,SAAS,wCAAwC,CAAC"}
|
|
@@ -8,10 +8,14 @@
|
|
|
8
8
|
import '../utils/agentdb-runtime-patch.js';
|
|
9
9
|
// New hybrid backend (recommended for new code)
|
|
10
10
|
export { HybridReasoningBank } from './HybridBackend.js';
|
|
11
|
-
export { HybridReasoningBank as ReasoningBank } from './HybridBackend.js'; // Alias for backwards compat
|
|
12
11
|
export { AdvancedMemorySystem } from './AdvancedMemory.js';
|
|
13
12
|
// Re-export AgentDB controllers for advanced usage
|
|
14
|
-
export { ReflexionMemory
|
|
13
|
+
export { ReflexionMemory } from 'agentdb/controllers/ReflexionMemory';
|
|
14
|
+
export { SkillLibrary } from 'agentdb/controllers/SkillLibrary';
|
|
15
|
+
export { CausalMemoryGraph } from 'agentdb/controllers/CausalMemoryGraph';
|
|
16
|
+
export { CausalRecall } from 'agentdb/controllers/CausalRecall';
|
|
17
|
+
export { NightlyLearner } from 'agentdb/controllers/NightlyLearner';
|
|
18
|
+
export { EmbeddingService } from 'agentdb/controllers/EmbeddingService';
|
|
15
19
|
// Original ReasoningBank implementations (backwards compatibility)
|
|
16
20
|
export { retrieveMemories, formatMemoriesForPrompt } from './core/retrieve.js';
|
|
17
21
|
export { judgeTrajectory } from './core/judge.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reasoningbank/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yDAAyD;AACzD,OAAO,mCAAmC,CAAC;AAE3C,gDAAgD;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reasoningbank/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ReasoningBank - Closed-loop memory system for AI agents\n * Based on arXiv:2509.25140 (Google DeepMind)\n *\n * @since v1.7.0 - Integrated AgentDB for optimal performance\n */\n\n// Apply AgentDB runtime patch before any AgentDB imports\nimport '../utils/agentdb-runtime-patch.js';\n\n// New hybrid backend (recommended for new code)\nexport { HybridReasoningBank } from './HybridBackend.js';\nexport { AdvancedMemorySystem } from './AdvancedMemory.js';\nexport type { PatternData, RetrievalOptions, CausalInsight } from './HybridBackend.js';\nexport type { FailureAnalysis, SkillComposition } from './AdvancedMemory.js';\n\n// Re-export AgentDB controllers for advanced usage\nexport { ReflexionMemory } from 'agentdb/controllers/ReflexionMemory';\nexport { SkillLibrary } from 'agentdb/controllers/SkillLibrary';\nexport { CausalMemoryGraph } from 'agentdb/controllers/CausalMemoryGraph';\nexport { CausalRecall } from 'agentdb/controllers/CausalRecall';\nexport { NightlyLearner } from 'agentdb/controllers/NightlyLearner';\nexport { EmbeddingService } from 'agentdb/controllers/EmbeddingService';\n\n// Original ReasoningBank implementations (backwards compatibility)\nexport { retrieveMemories, formatMemoriesForPrompt } from './core/retrieve.js';\nexport type { RetrievedMemory } from './core/retrieve.js';\n\nexport { judgeTrajectory } from './core/judge.js';\nexport type { Verdict } from './core/judge.js';\n\nexport { distillMemories } from './core/distill.js';\nexport type { DistilledMemory } from './core/distill.js';\n\nexport { consolidate, shouldConsolidate } from './core/consolidate.js';\nexport type { ConsolidationResult } from './core/consolidate.js';\n\nexport { mattsParallel, mattsSequential } from './core/matts.js';\nexport type { MattsResult } from './core/matts.js';\n\nexport { computeEmbedding, clearEmbeddingCache } from './utils/embeddings.js';\nexport { mmrSelection, cosineSimilarity } from './utils/mmr.js';\nexport { scrubPII, containsPII, scrubMemory } from './utils/pii-scrubber.js';\nexport { loadConfig } from './utils/config.js';\n\n// Re-export database utilities\nimport * as db from './db/queries.js';\nexport { db };\nexport type {\n ReasoningMemory,\n PatternEmbedding,\n PatternLink,\n TaskTrajectory,\n MattsRun,\n ConsolidationRun,\n Trajectory,\n TrajectoryStep\n} from './db/schema.js';\n\n// Original functions (backwards compatibility)\nimport { loadConfig } from './utils/config.js';\nimport { retrieveMemories } from './core/retrieve.js';\nimport { judgeTrajectory } from './core/judge.js';\nimport { distillMemories } from './core/distill.js';\nimport { shouldConsolidate as shouldCons, consolidate as cons } from './core/consolidate.js';\n\nexport async function initialize(): Promise<void> {\n const config = loadConfig();\n console.log('[ReasoningBank] Initializing...');\n console.log('[ReasoningBank] Enabled: true (initializing...)');\n console.log(`[ReasoningBank] Database: ${process.env.CLAUDE_FLOW_DB_PATH || '.swarm/memory.db'}`);\n console.log(`[ReasoningBank] Embeddings: ${config.embeddings.provider}`);\n console.log(`[ReasoningBank] Retrieval k: ${config.retrieve.k}`);\n\n try {\n await db.runMigrations();\n console.log(`[ReasoningBank] Database migrated successfully`);\n } catch (error) {\n console.error('[ReasoningBank] Migration error:', error);\n throw new Error('ReasoningBank initialization failed: could not run migrations');\n }\n\n try {\n const dbConn = db.getDb();\n const tables = dbConn.prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'pattern%'\").all();\n console.log(`[ReasoningBank] Database OK: ${tables.length} tables found`);\n } catch (error) {\n console.error('[ReasoningBank] Database error:', error);\n throw new Error('ReasoningBank initialization failed: database not accessible');\n }\n\n console.log('[ReasoningBank] Initialization complete');\n}\n\nexport async function runTask(options: {\n taskId: string;\n agentId: string;\n query: string;\n domain?: string;\n executeFn: (memories: any[]) => Promise<any>;\n}): Promise<{\n verdict: any;\n usedMemories: any[];\n newMemories: string[];\n consolidated: boolean;\n}> {\n console.log(`[ReasoningBank] Running task: ${options.taskId}`);\n const memories = await retrieveMemories(options.query, {\n domain: options.domain,\n agent: options.agentId\n });\n console.log(`[ReasoningBank] Retrieved ${memories.length} memories`);\n const trajectory = await options.executeFn(memories);\n const verdict = await judgeTrajectory(trajectory, options.query);\n console.log(`[ReasoningBank] Verdict: ${verdict.label} (${verdict.confidence})`);\n const newMemories = await distillMemories(trajectory, verdict, options.query, {\n taskId: options.taskId,\n agentId: options.agentId,\n domain: options.domain\n });\n console.log(`[ReasoningBank] Distilled ${newMemories.length} new memories`);\n let consolidated = false;\n if (shouldCons()) {\n console.log('[ReasoningBank] Running consolidation...');\n await cons();\n consolidated = true;\n }\n return { verdict, usedMemories: memories, newMemories, consolidated };\n}\n\nexport const VERSION = '1.7.1';\nexport const PAPER_URL = 'https://arxiv.org/html/2509.25140v1';\n"]}
|
|
@@ -16,7 +16,6 @@ export declare function computeEmbeddingBatch(texts: string[]): Promise<Float32A
|
|
|
16
16
|
export declare function getEmbeddingDimensions(): number;
|
|
17
17
|
/**
|
|
18
18
|
* Clear embedding cache
|
|
19
|
-
* MEMORY LEAK FIX: Also clear all TTL timers
|
|
20
19
|
*/
|
|
21
20
|
export declare function clearEmbeddingCache(): void;
|
|
22
21
|
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../../src/reasoningbank/utils/embeddings.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../../src/reasoningbank/utils/embeddings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2DH;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAiD1E;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAEpF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AA+CD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C"}
|
|
@@ -9,21 +9,20 @@ import { loadConfig } from './config.js';
|
|
|
9
9
|
env.backends.onnx.wasm.proxy = false; // Disable ONNX runtime proxy
|
|
10
10
|
env.backends.onnx.wasm.numThreads = 1; // Single thread for stability
|
|
11
11
|
let embeddingPipeline = null;
|
|
12
|
-
let
|
|
12
|
+
let isInitializing = false;
|
|
13
13
|
const embeddingCache = new Map();
|
|
14
|
-
// MEMORY LEAK FIX: Track TTL timers so they can be cleaned up
|
|
15
|
-
const embeddingTimers = new Map();
|
|
16
14
|
/**
|
|
17
15
|
* Initialize the embedding pipeline (lazy load)
|
|
18
|
-
* RACE CONDITION FIX: Use promise-based initialization instead of busy-wait
|
|
19
16
|
*/
|
|
20
17
|
async function initializeEmbeddings() {
|
|
21
|
-
// Already initialized
|
|
22
18
|
if (embeddingPipeline)
|
|
23
19
|
return;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
if (isInitializing) {
|
|
21
|
+
// Wait for initialization to complete
|
|
22
|
+
while (isInitializing) {
|
|
23
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
24
|
+
}
|
|
25
|
+
return;
|
|
27
26
|
}
|
|
28
27
|
// Detect npx environment (known transformer initialization issues)
|
|
29
28
|
const isNpxEnv = process.env.npm_lifecycle_event === 'npx' ||
|
|
@@ -33,25 +32,24 @@ async function initializeEmbeddings() {
|
|
|
33
32
|
if (isNpxEnv && !process.env.FORCE_TRANSFORMERS) {
|
|
34
33
|
console.log('[Embeddings] NPX environment detected - using hash-based embeddings');
|
|
35
34
|
console.log('[Embeddings] For semantic search, install globally: npm install -g claude-flow');
|
|
35
|
+
isInitializing = false;
|
|
36
36
|
return;
|
|
37
37
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
})();
|
|
54
|
-
return initializationPromise;
|
|
38
|
+
isInitializing = true;
|
|
39
|
+
console.log('[Embeddings] Initializing local embedding model (Xenova/all-MiniLM-L6-v2)...');
|
|
40
|
+
console.log('[Embeddings] First run will download ~23MB model...');
|
|
41
|
+
try {
|
|
42
|
+
embeddingPipeline = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2', { quantized: true } // Smaller, faster
|
|
43
|
+
);
|
|
44
|
+
console.log('[Embeddings] Local model ready! (384 dimensions)');
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error('[Embeddings] Failed to initialize:', error?.message || error);
|
|
48
|
+
console.warn('[Embeddings] Falling back to hash-based embeddings');
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
isInitializing = false;
|
|
52
|
+
}
|
|
55
53
|
}
|
|
56
54
|
/**
|
|
57
55
|
* Compute embedding for text using local model
|
|
@@ -85,36 +83,17 @@ export async function computeEmbedding(text) {
|
|
|
85
83
|
const dims = config?.embeddings?.dimensions || 384;
|
|
86
84
|
embedding = hashEmbed(text, dims);
|
|
87
85
|
}
|
|
88
|
-
// MEMORY LEAK FIX: Clear existing timer if key exists
|
|
89
|
-
const existingTimer = embeddingTimers.get(cacheKey);
|
|
90
|
-
if (existingTimer) {
|
|
91
|
-
clearTimeout(existingTimer);
|
|
92
|
-
embeddingTimers.delete(cacheKey);
|
|
93
|
-
}
|
|
94
86
|
// Cache with LRU (limit 1000 entries)
|
|
95
|
-
|
|
96
|
-
if (embeddingCache.size >= 1000) {
|
|
97
|
-
// Find and remove oldest entry (first key in iteration order)
|
|
87
|
+
if (embeddingCache.size > 1000) {
|
|
98
88
|
const firstKey = embeddingCache.keys().next().value;
|
|
99
89
|
if (firstKey) {
|
|
100
90
|
embeddingCache.delete(firstKey);
|
|
101
|
-
// Also clear its timer
|
|
102
|
-
const timer = embeddingTimers.get(firstKey);
|
|
103
|
-
if (timer) {
|
|
104
|
-
clearTimeout(timer);
|
|
105
|
-
embeddingTimers.delete(firstKey);
|
|
106
|
-
}
|
|
107
91
|
}
|
|
108
92
|
}
|
|
109
93
|
embeddingCache.set(cacheKey, embedding);
|
|
110
|
-
// Set TTL for cache entry
|
|
94
|
+
// Set TTL for cache entry
|
|
111
95
|
const ttl = config?.embeddings?.cache_ttl_seconds || 3600;
|
|
112
|
-
|
|
113
|
-
embeddingCache.delete(cacheKey);
|
|
114
|
-
embeddingTimers.delete(cacheKey);
|
|
115
|
-
}, ttl * 1000);
|
|
116
|
-
// MEMORY LEAK FIX: Track timer for cleanup
|
|
117
|
-
embeddingTimers.set(cacheKey, timerId);
|
|
96
|
+
setTimeout(() => embeddingCache.delete(cacheKey), ttl * 1000);
|
|
118
97
|
return embedding;
|
|
119
98
|
}
|
|
120
99
|
/**
|
|
@@ -170,14 +149,8 @@ function normalize(vec) {
|
|
|
170
149
|
}
|
|
171
150
|
/**
|
|
172
151
|
* Clear embedding cache
|
|
173
|
-
* MEMORY LEAK FIX: Also clear all TTL timers
|
|
174
152
|
*/
|
|
175
153
|
export function clearEmbeddingCache() {
|
|
176
|
-
// Clear all timers first to prevent memory leaks
|
|
177
|
-
for (const timer of embeddingTimers.values()) {
|
|
178
|
-
clearTimeout(timer);
|
|
179
|
-
}
|
|
180
|
-
embeddingTimers.clear();
|
|
181
154
|
embeddingCache.clear();
|
|
182
155
|
}
|
|
183
156
|
//# sourceMappingURL=embeddings.js.map
|