agentic-flow 2.0.6 → 2.0.8

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 (316) hide show
  1. package/.claude/settings.json +133 -9
  2. package/.claude/skills/agentic-flow-quickstart/skill.md +69 -0
  3. package/.claude/skills/hooks-automation/skill.md +155 -0
  4. package/.claude/skills/memory-patterns/skill.md +110 -0
  5. package/.claude/skills/sparc-methodology/skill.md +137 -0
  6. package/.claude/skills/swarm-coordination/skill.md +94 -0
  7. package/.claude/skills/worker-benchmarks/skill.md +135 -0
  8. package/.claude/skills/worker-integration/skill.md +154 -0
  9. package/.claude/statusline.mjs +109 -0
  10. package/.claude/statusline.sh +71 -0
  11. package/README.md +1797 -624
  12. package/dist/.tsbuildinfo +1 -1
  13. package/dist/agentdb/index.d.ts +2 -0
  14. package/dist/agentdb/index.d.ts.map +1 -1
  15. package/dist/agentdb/index.js +5 -0
  16. package/dist/agentdb/index.js.map +1 -1
  17. package/dist/agentdb/prerequisites.d.ts +25 -0
  18. package/dist/agentdb/prerequisites.d.ts.map +1 -0
  19. package/dist/agentdb/prerequisites.js +180 -0
  20. package/dist/agentdb/prerequisites.js.map +1 -0
  21. package/dist/benchmarks/embeddings-benchmark.d.ts +38 -0
  22. package/dist/benchmarks/embeddings-benchmark.d.ts.map +1 -0
  23. package/dist/benchmarks/embeddings-benchmark.js +282 -0
  24. package/dist/benchmarks/embeddings-benchmark.js.map +1 -0
  25. package/dist/billing/mcp/tools.js +1 -0
  26. package/dist/billing/mcp/tools.js.map +1 -1
  27. package/dist/cli/commands/embeddings.d.ts +12 -0
  28. package/dist/cli/commands/embeddings.d.ts.map +1 -0
  29. package/dist/cli/commands/embeddings.js +386 -0
  30. package/dist/cli/commands/embeddings.js.map +1 -0
  31. package/dist/cli/commands/hooks.d.ts.map +1 -1
  32. package/dist/cli/commands/hooks.js +79 -4
  33. package/dist/cli/commands/hooks.js.map +1 -1
  34. package/dist/cli/commands/init.d.ts +8 -0
  35. package/dist/cli/commands/init.d.ts.map +1 -0
  36. package/dist/cli/commands/init.js +514 -0
  37. package/dist/cli/commands/init.js.map +1 -0
  38. package/dist/cli/commands/workers.d.ts +9 -0
  39. package/dist/cli/commands/workers.d.ts.map +1 -0
  40. package/dist/cli/commands/workers.js +991 -0
  41. package/dist/cli/commands/workers.js.map +1 -0
  42. package/dist/cli/config-wizard.d.ts.map +1 -1
  43. package/dist/cli/config-wizard.js +47 -25
  44. package/dist/cli/config-wizard.js.map +1 -1
  45. package/dist/cli-proxy.js +89 -1
  46. package/dist/cli-proxy.js.map +1 -1
  47. package/dist/core/agentdb-fast.js +3 -3
  48. package/dist/core/agentdb-fast.js.map +1 -1
  49. package/dist/core/agentdb-wrapper-enhanced.d.ts.map +1 -1
  50. package/dist/core/agentdb-wrapper-enhanced.js +37 -11
  51. package/dist/core/agentdb-wrapper-enhanced.js.map +1 -1
  52. package/dist/core/agentdb-wrapper.d.ts +3 -2
  53. package/dist/core/agentdb-wrapper.d.ts.map +1 -1
  54. package/dist/core/agentdb-wrapper.js +15 -1
  55. package/dist/core/agentdb-wrapper.js.map +1 -1
  56. package/dist/core/attention-native.d.ts +4 -0
  57. package/dist/core/attention-native.d.ts.map +1 -1
  58. package/dist/core/attention-native.js +14 -2
  59. package/dist/core/attention-native.js.map +1 -1
  60. package/dist/core/gnn-wrapper.d.ts.map +1 -1
  61. package/dist/core/gnn-wrapper.js +14 -0
  62. package/dist/core/gnn-wrapper.js.map +1 -1
  63. package/dist/embeddings/index.d.ts +17 -0
  64. package/dist/embeddings/index.d.ts.map +1 -0
  65. package/dist/embeddings/index.js +17 -0
  66. package/dist/embeddings/index.js.map +1 -0
  67. package/dist/embeddings/neural-substrate.d.ts +206 -0
  68. package/dist/embeddings/neural-substrate.d.ts.map +1 -0
  69. package/dist/embeddings/neural-substrate.js +629 -0
  70. package/dist/embeddings/neural-substrate.js.map +1 -0
  71. package/dist/embeddings/optimized-embedder.d.ts +103 -0
  72. package/dist/embeddings/optimized-embedder.d.ts.map +1 -0
  73. package/dist/embeddings/optimized-embedder.js +730 -0
  74. package/dist/embeddings/optimized-embedder.js.map +1 -0
  75. package/dist/examples/embedding-geometry.d.ts +105 -0
  76. package/dist/examples/embedding-geometry.d.ts.map +1 -0
  77. package/dist/examples/embedding-geometry.js +528 -0
  78. package/dist/examples/embedding-geometry.js.map +1 -0
  79. package/dist/federation/SecurityManager.d.ts +11 -2
  80. package/dist/federation/SecurityManager.d.ts.map +1 -1
  81. package/dist/federation/SecurityManager.js +50 -17
  82. package/dist/federation/SecurityManager.js.map +1 -1
  83. package/dist/federation/integrations/supabase-adapter-debug.js +3 -3
  84. package/dist/federation/integrations/supabase-adapter-debug.js.map +1 -1
  85. package/dist/hooks/swarm-learning-optimizer.js +5 -5
  86. package/dist/hooks/swarm-learning-optimizer.js.map +1 -1
  87. package/dist/index.d.ts +5 -3
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +89 -51
  90. package/dist/index.js.map +1 -1
  91. package/dist/intelligence/IntelligenceStore.d.ts +35 -26
  92. package/dist/intelligence/IntelligenceStore.d.ts.map +1 -1
  93. package/dist/intelligence/IntelligenceStore.js +308 -123
  94. package/dist/intelligence/IntelligenceStore.js.map +1 -1
  95. package/dist/intelligence/RuVectorIntelligence.d.ts +26 -1
  96. package/dist/intelligence/RuVectorIntelligence.d.ts.map +1 -1
  97. package/dist/intelligence/RuVectorIntelligence.js +49 -10
  98. package/dist/intelligence/RuVectorIntelligence.js.map +1 -1
  99. package/dist/intelligence/agent-booster-enhanced.d.ts +1 -0
  100. package/dist/intelligence/agent-booster-enhanced.d.ts.map +1 -1
  101. package/dist/intelligence/agent-booster-enhanced.js +24 -3
  102. package/dist/intelligence/agent-booster-enhanced.js.map +1 -1
  103. package/dist/intelligence/index.d.ts +29 -3
  104. package/dist/intelligence/index.d.ts.map +1 -1
  105. package/dist/intelligence/index.js +13 -3
  106. package/dist/intelligence/index.js.map +1 -1
  107. package/dist/mcp/claudeFlowSdkServer.d.ts.map +1 -1
  108. package/dist/mcp/claudeFlowSdkServer.js +162 -115
  109. package/dist/mcp/claudeFlowSdkServer.js.map +1 -1
  110. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js +5 -5
  111. package/dist/mcp/fastmcp/tools/hooks/intelligence-bridge.js.map +1 -1
  112. package/dist/mcp/fastmcp/tools/swarm/init.d.ts.map +1 -1
  113. package/dist/mcp/fastmcp/tools/swarm/init.js +36 -7
  114. package/dist/mcp/fastmcp/tools/swarm/init.js.map +1 -1
  115. package/dist/mcp/fastmcp/tools/swarm/spawn.d.ts.map +1 -1
  116. package/dist/mcp/fastmcp/tools/swarm/spawn.js +47 -8
  117. package/dist/mcp/fastmcp/tools/swarm/spawn.js.map +1 -1
  118. package/dist/mcp/tools/agent-booster-tools.d.ts +15 -1
  119. package/dist/mcp/tools/agent-booster-tools.d.ts.map +1 -1
  120. package/dist/mcp/tools/agent-booster-tools.js +79 -63
  121. package/dist/mcp/tools/agent-booster-tools.js.map +1 -1
  122. package/dist/mcp/tools/sona-tools.d.ts.map +1 -1
  123. package/dist/mcp/tools/sona-tools.js +6 -0
  124. package/dist/mcp/tools/sona-tools.js.map +1 -1
  125. package/dist/memory/SharedMemoryPool.d.ts +103 -0
  126. package/dist/memory/SharedMemoryPool.d.ts.map +1 -0
  127. package/dist/memory/SharedMemoryPool.js +263 -0
  128. package/dist/memory/SharedMemoryPool.js.map +1 -0
  129. package/dist/optimizations/agent-booster-migration.d.ts +2 -1
  130. package/dist/optimizations/agent-booster-migration.d.ts.map +1 -1
  131. package/dist/optimizations/agent-booster-migration.js +69 -45
  132. package/dist/optimizations/agent-booster-migration.js.map +1 -1
  133. package/dist/orchestration/index.d.ts +11 -0
  134. package/dist/orchestration/index.d.ts.map +1 -0
  135. package/dist/orchestration/index.js +10 -0
  136. package/dist/orchestration/index.js.map +1 -0
  137. package/dist/orchestration/memory-plane-types.d.ts +23 -0
  138. package/dist/orchestration/memory-plane-types.d.ts.map +1 -0
  139. package/dist/orchestration/memory-plane-types.js +5 -0
  140. package/dist/orchestration/memory-plane-types.js.map +1 -0
  141. package/dist/orchestration/memory-plane.d.ts +41 -0
  142. package/dist/orchestration/memory-plane.d.ts.map +1 -0
  143. package/dist/orchestration/memory-plane.js +84 -0
  144. package/dist/orchestration/memory-plane.js.map +1 -0
  145. package/dist/orchestration/orchestration-client.d.ts +104 -0
  146. package/dist/orchestration/orchestration-client.d.ts.map +1 -0
  147. package/dist/orchestration/orchestration-client.js +94 -0
  148. package/dist/orchestration/orchestration-client.js.map +1 -0
  149. package/dist/orchestration/orchestration-runtime.d.ts +26 -0
  150. package/dist/orchestration/orchestration-runtime.d.ts.map +1 -0
  151. package/dist/orchestration/orchestration-runtime.js +78 -0
  152. package/dist/orchestration/orchestration-runtime.js.map +1 -0
  153. package/dist/orchestration/orchestration-types.d.ts +124 -0
  154. package/dist/orchestration/orchestration-types.d.ts.map +1 -0
  155. package/dist/orchestration/orchestration-types.js +7 -0
  156. package/dist/orchestration/orchestration-types.js.map +1 -0
  157. package/dist/proxy/anthropic-to-openrouter.js.map +1 -1
  158. package/dist/proxy/anthropic-to-requesty.js.map +1 -1
  159. package/dist/proxy/quic-proxy.d.ts +0 -1
  160. package/dist/proxy/quic-proxy.d.ts.map +1 -1
  161. package/dist/proxy/quic-proxy.js +2 -2
  162. package/dist/proxy/quic-proxy.js.map +1 -1
  163. package/dist/reasoningbank/AdvancedMemory.js +1 -1
  164. package/dist/reasoningbank/AdvancedMemory.js.map +1 -1
  165. package/dist/reasoningbank/HybridBackend.d.ts.map +1 -1
  166. package/dist/reasoningbank/HybridBackend.js +2 -5
  167. package/dist/reasoningbank/HybridBackend.js.map +1 -1
  168. package/dist/reasoningbank/backend-selector.d.ts +10 -0
  169. package/dist/reasoningbank/backend-selector.d.ts.map +1 -1
  170. package/dist/reasoningbank/backend-selector.js +45 -5
  171. package/dist/reasoningbank/backend-selector.js.map +1 -1
  172. package/dist/reasoningbank/core/consolidate.d.ts.map +1 -1
  173. package/dist/reasoningbank/core/consolidate.js +113 -45
  174. package/dist/reasoningbank/core/consolidate.js.map +1 -1
  175. package/dist/reasoningbank/index-new.d.ts +1 -6
  176. package/dist/reasoningbank/index-new.d.ts.map +1 -1
  177. package/dist/reasoningbank/index-new.js +1 -6
  178. package/dist/reasoningbank/index-new.js.map +1 -1
  179. package/dist/reasoningbank/index.d.ts +6 -0
  180. package/dist/reasoningbank/index.d.ts.map +1 -1
  181. package/dist/reasoningbank/index.js +6 -13
  182. package/dist/reasoningbank/index.js.map +1 -1
  183. package/dist/reasoningbank/utils/embeddings.d.ts +1 -0
  184. package/dist/reasoningbank/utils/embeddings.d.ts.map +1 -1
  185. package/dist/reasoningbank/utils/embeddings.js +53 -26
  186. package/dist/reasoningbank/utils/embeddings.js.map +1 -1
  187. package/dist/router/index.d.ts +2 -1
  188. package/dist/router/index.d.ts.map +1 -1
  189. package/dist/router/index.js +1 -0
  190. package/dist/router/index.js.map +1 -1
  191. package/dist/router/providers/ollama.d.ts +20 -0
  192. package/dist/router/providers/ollama.d.ts.map +1 -0
  193. package/dist/router/providers/ollama.js +242 -0
  194. package/dist/router/providers/ollama.js.map +1 -0
  195. package/dist/router/providers/onnx-local-optimized.d.ts +2 -0
  196. package/dist/router/providers/onnx-local-optimized.d.ts.map +1 -1
  197. package/dist/router/providers/onnx-local-optimized.js +10 -0
  198. package/dist/router/providers/onnx-local-optimized.js.map +1 -1
  199. package/dist/router/providers/onnx-local.d.ts +1 -0
  200. package/dist/router/providers/onnx-local.d.ts.map +1 -1
  201. package/dist/router/providers/onnx-local.js +22 -5
  202. package/dist/router/providers/onnx-local.js.map +1 -1
  203. package/dist/router/router.d.ts.map +1 -1
  204. package/dist/router/router.js +39 -23
  205. package/dist/router/router.js.map +1 -1
  206. package/dist/sdk/index.d.ts +2 -1
  207. package/dist/sdk/index.d.ts.map +1 -1
  208. package/dist/sdk/index.js +3 -1
  209. package/dist/sdk/index.js.map +1 -1
  210. package/dist/services/embedding-service.js.map +1 -1
  211. package/dist/services/sona-agent-training.d.ts +1 -0
  212. package/dist/services/sona-agent-training.d.ts.map +1 -1
  213. package/dist/services/sona-agent-training.js.map +1 -1
  214. package/dist/services/sona-agentdb-integration.d.ts.map +1 -1
  215. package/dist/services/sona-agentdb-integration.js +9 -6
  216. package/dist/services/sona-agentdb-integration.js.map +1 -1
  217. package/dist/services/sona-service.d.ts.map +1 -1
  218. package/dist/services/sona-service.js +6 -5
  219. package/dist/services/sona-service.js.map +1 -1
  220. package/dist/utils/cli.d.ts +1 -1
  221. package/dist/utils/cli.d.ts.map +1 -1
  222. package/dist/utils/cli.js +21 -0
  223. package/dist/utils/cli.js.map +1 -1
  224. package/dist/utils/index.d.ts +6 -0
  225. package/dist/utils/index.d.ts.map +1 -0
  226. package/dist/utils/index.js +6 -0
  227. package/dist/utils/index.js.map +1 -0
  228. package/dist/utils/model-cache.d.ts +61 -0
  229. package/dist/utils/model-cache.d.ts.map +1 -0
  230. package/dist/utils/model-cache.js +176 -0
  231. package/dist/utils/model-cache.js.map +1 -0
  232. package/dist/utils/suppress-warnings.d.ts +19 -0
  233. package/dist/utils/suppress-warnings.d.ts.map +1 -0
  234. package/dist/utils/suppress-warnings.js +59 -0
  235. package/dist/utils/suppress-warnings.js.map +1 -0
  236. package/dist/workers/consolidated-phases.d.ts +40 -0
  237. package/dist/workers/consolidated-phases.d.ts.map +1 -0
  238. package/dist/workers/consolidated-phases.js +497 -0
  239. package/dist/workers/consolidated-phases.js.map +1 -0
  240. package/dist/workers/custom-worker-config.d.ts +133 -0
  241. package/dist/workers/custom-worker-config.d.ts.map +1 -0
  242. package/dist/workers/custom-worker-config.js +215 -0
  243. package/dist/workers/custom-worker-config.js.map +1 -0
  244. package/dist/workers/custom-worker-factory.d.ts +89 -0
  245. package/dist/workers/custom-worker-factory.d.ts.map +1 -0
  246. package/dist/workers/custom-worker-factory.js +404 -0
  247. package/dist/workers/custom-worker-factory.js.map +1 -0
  248. package/dist/workers/dispatch-service.d.ts +123 -0
  249. package/dist/workers/dispatch-service.d.ts.map +1 -0
  250. package/dist/workers/dispatch-service.js +1024 -0
  251. package/dist/workers/dispatch-service.js.map +1 -0
  252. package/dist/workers/hooks-integration.d.ts +79 -0
  253. package/dist/workers/hooks-integration.d.ts.map +1 -0
  254. package/dist/workers/hooks-integration.js +286 -0
  255. package/dist/workers/hooks-integration.js.map +1 -0
  256. package/dist/workers/index.d.ts +42 -0
  257. package/dist/workers/index.d.ts.map +1 -0
  258. package/dist/workers/index.js +52 -0
  259. package/dist/workers/index.js.map +1 -0
  260. package/dist/workers/mcp-tools.d.ts +56 -0
  261. package/dist/workers/mcp-tools.d.ts.map +1 -0
  262. package/dist/workers/mcp-tools.js +359 -0
  263. package/dist/workers/mcp-tools.js.map +1 -0
  264. package/dist/workers/phase-executors.d.ts +22 -0
  265. package/dist/workers/phase-executors.d.ts.map +1 -0
  266. package/dist/workers/phase-executors.js +445 -0
  267. package/dist/workers/phase-executors.js.map +1 -0
  268. package/dist/workers/resource-governor.d.ts +75 -0
  269. package/dist/workers/resource-governor.d.ts.map +1 -0
  270. package/dist/workers/resource-governor.js +187 -0
  271. package/dist/workers/resource-governor.js.map +1 -0
  272. package/dist/workers/ruvector-integration.d.ts +163 -0
  273. package/dist/workers/ruvector-integration.d.ts.map +1 -0
  274. package/dist/workers/ruvector-integration.js +543 -0
  275. package/dist/workers/ruvector-integration.js.map +1 -0
  276. package/dist/workers/ruvector-native-integration.d.ts +91 -0
  277. package/dist/workers/ruvector-native-integration.d.ts.map +1 -0
  278. package/dist/workers/ruvector-native-integration.js +254 -0
  279. package/dist/workers/ruvector-native-integration.js.map +1 -0
  280. package/dist/workers/trigger-detector.d.ts +68 -0
  281. package/dist/workers/trigger-detector.d.ts.map +1 -0
  282. package/dist/workers/trigger-detector.js +281 -0
  283. package/dist/workers/trigger-detector.js.map +1 -0
  284. package/dist/workers/types.d.ts +145 -0
  285. package/dist/workers/types.d.ts.map +1 -0
  286. package/dist/workers/types.js +6 -0
  287. package/dist/workers/types.js.map +1 -0
  288. package/dist/workers/worker-agent-integration.d.ts +140 -0
  289. package/dist/workers/worker-agent-integration.d.ts.map +1 -0
  290. package/dist/workers/worker-agent-integration.js +471 -0
  291. package/dist/workers/worker-agent-integration.js.map +1 -0
  292. package/dist/workers/worker-benchmarks.d.ts +88 -0
  293. package/dist/workers/worker-benchmarks.d.ts.map +1 -0
  294. package/dist/workers/worker-benchmarks.js +452 -0
  295. package/dist/workers/worker-benchmarks.js.map +1 -0
  296. package/dist/workers/worker-registry.d.ts +85 -0
  297. package/dist/workers/worker-registry.d.ts.map +1 -0
  298. package/dist/workers/worker-registry.js +547 -0
  299. package/dist/workers/worker-registry.js.map +1 -0
  300. package/docs/embeddings/EMBEDDING_GEOMETRY.md +935 -0
  301. package/package.json +26 -8
  302. package/scripts/postinstall.js +45 -4
  303. package/wasm/reasoningbank/reasoningbank_wasm.js +1 -1
  304. package/wasm/reasoningbank/reasoningbank_wasm_bg.js +54 -54
  305. package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm +0 -0
  306. package/wasm/reasoningbank/reasoningbank_wasm_bg.wasm.d.ts +4 -3
  307. package/.claude/agents/test-neural.md +0 -14
  308. /package/.claude/agents/analysis/{code-review/analyze-code-quality.md → analyze-code-quality.md} +0 -0
  309. /package/.claude/agents/architecture/{system-design/arch-system-design.md → arch-system-design.md} +0 -0
  310. /package/.claude/agents/data/{ml/data-ml-model.md → data-ml-model.md} +0 -0
  311. /package/.claude/agents/development/{backend/dev-backend-api.md → dev-backend-api.md} +0 -0
  312. /package/.claude/agents/devops/{ci-cd/ops-cicd-github.md → ops-cicd-github.md} +0 -0
  313. /package/.claude/agents/documentation/{api-docs/docs-api-openapi.md → docs-api-openapi.md} +0 -0
  314. /package/.claude/agents/specialized/{mobile/spec-mobile-react-native.md → spec-mobile-react-native.md} +0 -0
  315. /package/.claude/agents/testing/{validation/production-validator.md → production-validator.md} +0 -0
  316. /package/.claude/agents/testing/{unit/tdd-london-swarm.md → tdd-london-swarm.md} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"HybridBackend.js","sourceRoot":"","sources":["../../src/reasoningbank/HybridBackend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hybrid ReasoningBank Backend - Full Implementation for v1.7.1\n *\n * Combines Rust WASM (compute) + AgentDB TypeScript (storage) for optimal performance:\n * - WASM: 10x faster similarity computation\n * - AgentDB: Persistent SQLite storage with frontier memory\n * - CausalRecall: Utility-based reranking with causal uplift\n * - Automatic backend selection based on task requirements\n *\n * @example\n * ```typescript\n * import { HybridReasoningBank } from 'agentic-flow/reasoningbank';\n *\n * const rb = new HybridReasoningBank({ preferWasm: true });\n * await rb.storePattern({ task: '...', success: true, reward: 0.95 });\n * const patterns = await rb.retrievePatterns('similar task', { k: 5 });\n * const strategy = await rb.learnStrategy('API optimization');\n * ```\n */\n\nimport { SharedMemoryPool } from '../memory/SharedMemoryPool.js';\nimport { ReflexionMemory } from 'agentdb/controllers/ReflexionMemory';\nimport { SkillLibrary } from 'agentdb/controllers/SkillLibrary';\nimport { CausalRecall } from 'agentdb/controllers/CausalRecall';\nimport { CausalMemoryGraph } from 'agentdb/controllers/CausalMemoryGraph';\n\nexport interface PatternData {\n sessionId: string;\n task: string;\n input?: string;\n output?: string;\n critique?: string;\n success: boolean;\n reward: number;\n latencyMs?: number;\n tokensUsed?: number;\n}\n\nexport interface RetrievalOptions {\n k?: number;\n minReward?: number;\n onlySuccesses?: boolean;\n onlyFailures?: boolean;\n}\n\nexport interface CausalInsight {\n action: string;\n avgReward: number;\n avgUplift: number;\n confidence: number;\n evidenceCount: number;\n recommendation: 'DO_IT' | 'AVOID' | 'NEUTRAL';\n}\n\nexport class HybridReasoningBank {\n private memory: SharedMemoryPool;\n private reflexion: ReflexionMemory;\n private skills: SkillLibrary;\n private causalRecall: CausalRecall;\n private causalGraph: CausalMemoryGraph;\n private useWasm: boolean;\n private wasmModule: any;\n\n constructor(options: { preferWasm?: boolean } = {}) {\n this.memory = SharedMemoryPool.getInstance();\n const db = this.memory.getDatabase();\n const embedder = this.memory.getEmbedder();\n\n this.reflexion = new ReflexionMemory(db, embedder);\n this.skills = new SkillLibrary(db, embedder);\n this.causalGraph = new CausalMemoryGraph(db);\n\n // CausalRecall with optimized rerank config\n this.causalRecall = new CausalRecall(db, embedder, {\n alpha: 0.6, // 60% weight on similarity\n beta: 0.3, // 30% weight on causal uplift\n gamma: 0.1, // 10% penalty for latency\n minConfidence: 0.7\n });\n\n this.useWasm = options.preferWasm ?? true;\n this.wasmModule = null;\n\n // Try to load WASM module\n if (this.useWasm) {\n this.loadWasmModule().catch(err => {\n console.warn('[HybridReasoningBank] WASM unavailable, using TypeScript:', err.message);\n this.useWasm = false;\n });\n }\n }\n\n private async loadWasmModule(): Promise<void> {\n try {\n // Dynamic import for WASM module\n const wasm = await import('../../wasm/reasoningbank/reasoningbank_wasm.js');\n this.wasmModule = wasm;\n console.log('[HybridReasoningBank] WASM module loaded successfully');\n } catch (error) {\n throw new Error(`WASM load failed: ${error}`);\n }\n }\n\n /**\n * Store a reasoning pattern\n */\n async storePattern(pattern: PatternData): Promise<number> {\n const episodeId = await this.reflexion.storeEpisode(pattern);\n\n // Store causal edge if action led to outcome\n if (pattern.input && pattern.output && pattern.success) {\n try {\n this.causalGraph.addCausalEdge({\n fromMemoryId: episodeId,\n fromMemoryType: 'episode',\n toMemoryId: episodeId + 1, // Next episode\n toMemoryType: 'episode',\n similarity: pattern.reward,\n uplift: pattern.success ? pattern.reward : -pattern.reward,\n confidence: 0.8,\n sampleSize: 1,\n metadata: {\n sessionId: pattern.sessionId,\n task: pattern.task\n }\n });\n } catch (error) {\n console.warn('[HybridReasoningBank] Failed to record causal edge:', error);\n }\n }\n\n return episodeId;\n }\n\n /**\n * Retrieve similar patterns with optional WASM acceleration\n */\n async retrievePatterns(query: string, options: RetrievalOptions = {}): Promise<any[]> {\n const { k = 5, minReward, onlySuccesses, onlyFailures } = options;\n\n // Check cache first\n const cacheKey = `retrieve:${query}:${k}:${onlySuccesses}:${onlyFailures}`;\n const cached = this.memory.getCachedQuery(cacheKey);\n if (cached) return cached;\n\n // Use CausalRecall for intelligent retrieval with utility-based ranking\n try {\n const result = await this.causalRecall.recall(\n `query-${Date.now()}`,\n query,\n k,\n undefined, // requirements\n 'public' // accessLevel\n );\n\n // Convert candidates to pattern format and filter\n let patterns = result.candidates.map(c => ({\n task: c.content,\n similarity: c.similarity,\n uplift: c.uplift || 0,\n utilityScore: c.utilityScore,\n type: c.type,\n id: c.id\n }));\n\n // Apply filters\n if (minReward !== undefined) {\n patterns = patterns.filter(p => (p.uplift || 0) >= minReward);\n }\n\n // Cache and return\n this.memory.cacheQuery(cacheKey, patterns, 60000);\n return patterns;\n } catch (error) {\n console.warn('[HybridReasoningBank] CausalRecall failed, falling back to ReflexionMemory:', error);\n\n // Fallback to basic ReflexionMemory\n const results = await this.reflexion.retrieveRelevant({\n task: query,\n k,\n minReward,\n onlySuccesses,\n onlyFailures\n });\n\n this.memory.cacheQuery(cacheKey, results, 60000);\n return results;\n }\n }\n\n /**\n * Learn optimal strategy for a task\n *\n * Combines pattern retrieval with causal analysis to provide evidence-based recommendations\n */\n async learnStrategy(task: string): Promise<{\n patterns: any[];\n causality: CausalInsight;\n confidence: number;\n recommendation: string;\n }> {\n // Get successful patterns\n const patterns = await this.retrievePatterns(task, { k: 10, onlySuccesses: true });\n\n // Get causal effects for this task type\n let causalData: any;\n try {\n // Note: queryCausalEffects requires specific memory IDs\n // For task-level analysis, we'll use pattern success rates instead\n const stats = await this.reflexion.getTaskStats(task, 30);\n\n if (stats.totalAttempts > 0) {\n causalData = {\n action: task,\n avgReward: stats.avgReward || 0,\n avgUplift: stats.improvementTrend || 0,\n confidence: Math.min(stats.totalAttempts / 10, 1.0),\n evidenceCount: stats.totalAttempts,\n recommendation: (stats.improvementTrend || 0) > 0.1 ? 'DO_IT' :\n (stats.improvementTrend || 0) < -0.1 ? 'AVOID' : 'NEUTRAL'\n };\n }\n } catch (error) {\n console.warn('[HybridReasoningBank] Causal analysis failed:', error);\n }\n\n // Fallback if no causal data\n if (!causalData) {\n causalData = {\n action: task,\n avgReward: patterns.length > 0 ? (patterns[0].reward || 0) : 0,\n avgUplift: 0,\n confidence: patterns.length > 0 ? 0.6 : 0.3,\n evidenceCount: patterns.length,\n recommendation: patterns.length > 0 ? 'DO_IT' : 'NEUTRAL'\n };\n }\n\n // Calculate overall confidence\n const patternConf = Math.min(patterns.length / 10, 1.0); // 10+ patterns = full confidence\n const causalConf = causalData.confidence;\n const confidence = 0.6 * patternConf + 0.4 * causalConf;\n\n // Generate recommendation\n let recommendation = '';\n if (confidence > 0.8 && causalData.avgUplift > 0.1) {\n recommendation = `Strong evidence for success (${patterns.length} patterns, +${(causalData.avgUplift * 100).toFixed(1)}% uplift)`;\n } else if (confidence > 0.5) {\n recommendation = `Moderate evidence (${patterns.length} patterns available)`;\n } else {\n recommendation = `Limited evidence - proceed with caution`;\n }\n\n return {\n patterns,\n causality: causalData,\n confidence,\n recommendation\n };\n }\n\n /**\n * Auto-consolidate patterns into skills\n */\n async autoConsolidate(minUses: number = 3, minSuccessRate: number = 0.7, lookbackDays: number = 30): Promise<{ skillsCreated: number }> {\n // Get task statistics\n const stats = await this.reflexion.getTaskStats('', lookbackDays);\n\n if (stats.totalAttempts < minUses || stats.successRate < minSuccessRate) {\n return { skillsCreated: 0 };\n }\n\n // Get successful episodes for consolidation\n const episodes = await this.reflexion.retrieveRelevant({\n task: '',\n k: 50,\n onlySuccesses: true,\n timeWindowDays: lookbackDays\n });\n\n // Group by task type and consolidate\n const taskGroups = new Map<string, any[]>();\n episodes.forEach(ep => {\n const group = taskGroups.get(ep.task) || [];\n group.push(ep);\n taskGroups.set(ep.task, group);\n });\n\n let skillsCreated = 0;\n for (const [task, group] of taskGroups) {\n if (group.length >= minUses) {\n const successRate = group.filter(e => e.success).length / group.length;\n if (successRate >= minSuccessRate) {\n await this.skills.createSkill({\n name: `skill_${task.replace(/\\s+/g, '_').toLowerCase()}`,\n description: `Consolidated from ${group.length} successful episodes`,\n signature: { inputs: {}, outputs: {} },\n successRate,\n uses: group.length,\n avgReward: group.reduce((sum, e) => sum + e.reward, 0) / group.length,\n avgLatencyMs: group.reduce((sum, e) => sum + (e.latencyMs || 0), 0) / group.length,\n metadata: { consolidatedAt: Date.now(), taskType: task }\n });\n skillsCreated++;\n }\n }\n }\n\n return { skillsCreated };\n }\n\n /**\n * What-if causal analysis\n */\n async whatIfAnalysis(action: string): Promise<CausalInsight> {\n try {\n // Use task statistics for what-if analysis\n const stats = await this.reflexion.getTaskStats(action, 30);\n\n if (stats.totalAttempts === 0) {\n return {\n action,\n avgReward: 0,\n avgUplift: 0,\n confidence: 0,\n evidenceCount: 0,\n recommendation: 'NEUTRAL'\n };\n }\n\n const avgUplift = stats.improvementTrend || 0;\n const confidence = Math.min(stats.totalAttempts / 10, 1.0);\n\n return {\n action,\n avgReward: stats.avgReward || 0,\n avgUplift,\n confidence,\n evidenceCount: stats.totalAttempts,\n recommendation: avgUplift > 0.1 ? 'DO_IT' : avgUplift < -0.1 ? 'AVOID' : 'NEUTRAL'\n };\n } catch (error) {\n console.error('[HybridReasoningBank] What-if analysis failed:', error);\n return {\n action,\n avgReward: 0,\n avgUplift: 0,\n confidence: 0,\n evidenceCount: 0,\n recommendation: 'NEUTRAL'\n };\n }\n }\n\n /**\n * Search for relevant skills\n */\n async searchSkills(taskType: string, k: number = 5): Promise<any[]> {\n return this.skills.searchSkills({ task: taskType, k, minSuccessRate: 0.5 });\n }\n\n /**\n * Get statistics\n */\n getStats(): {\n causalRecall: any;\n reflexion: any;\n skills: number;\n } {\n return {\n causalRecall: this.causalRecall.getStats(),\n reflexion: {}, // ReflexionMemory doesn't expose global stats\n skills: 0 // Would need to query database\n };\n }\n}\n"]}
1
+ {"version":3,"file":"HybridBackend.js","sourceRoot":"","sources":["../../src/reasoningbank/HybridBackend.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Hybrid ReasoningBank Backend - Full Implementation for v1.7.1\n *\n * Combines Rust WASM (compute) + AgentDB TypeScript (storage) for optimal performance:\n * - WASM: 10x faster similarity computation\n * - AgentDB: Persistent SQLite storage with frontier memory\n * - CausalRecall: Utility-based reranking with causal uplift\n * - Automatic backend selection based on task requirements\n *\n * @example\n * ```typescript\n * import { HybridReasoningBank } from 'agentic-flow/reasoningbank';\n *\n * const rb = new HybridReasoningBank({ preferWasm: true });\n * await rb.storePattern({ task: '...', success: true, reward: 0.95 });\n * const patterns = await rb.retrievePatterns('similar task', { k: 5 });\n * const strategy = await rb.learnStrategy('API optimization');\n * ```\n */\n\nimport { SharedMemoryPool } from '../memory/SharedMemoryPool.js';\nimport { ReflexionMemory, SkillLibrary, CausalRecall, CausalMemoryGraph } from 'agentdb';\n\nexport interface PatternData {\n sessionId: string;\n task: string;\n input?: string;\n output?: string;\n critique?: string;\n success: boolean;\n reward: number;\n latencyMs?: number;\n tokensUsed?: number;\n}\n\nexport interface RetrievalOptions {\n k?: number;\n minReward?: number;\n onlySuccesses?: boolean;\n onlyFailures?: boolean;\n}\n\nexport interface CausalInsight {\n action: string;\n avgReward: number;\n avgUplift: number;\n confidence: number;\n evidenceCount: number;\n recommendation: 'DO_IT' | 'AVOID' | 'NEUTRAL';\n}\n\nexport class HybridReasoningBank {\n private memory: SharedMemoryPool;\n private reflexion: ReflexionMemory;\n private skills: SkillLibrary;\n private causalRecall: CausalRecall;\n private causalGraph: CausalMemoryGraph;\n private useWasm: boolean;\n private wasmModule: any;\n\n constructor(options: { preferWasm?: boolean } = {}) {\n this.memory = SharedMemoryPool.getInstance();\n const db = this.memory.getDatabase();\n const embedder = this.memory.getEmbedder() as any;\n\n this.reflexion = new ReflexionMemory(db, embedder);\n this.skills = new SkillLibrary(db, embedder);\n this.causalGraph = new CausalMemoryGraph(db);\n\n // CausalRecall with optimized rerank config - use any for extended options\n this.causalRecall = new CausalRecall(db, embedder, {\n alpha: 0.6, // 60% weight on similarity\n beta: 0.3, // 30% weight on causal uplift\n gamma: 0.1, // 10% penalty for latency\n minConfidence: 0.7\n } as any);\n\n this.useWasm = options.preferWasm ?? true;\n this.wasmModule = null;\n\n // Try to load WASM module\n if (this.useWasm) {\n this.loadWasmModule().catch(err => {\n console.warn('[HybridReasoningBank] WASM unavailable, using TypeScript:', err.message);\n this.useWasm = false;\n });\n }\n }\n\n private async loadWasmModule(): Promise<void> {\n try {\n // Dynamic import for WASM module\n const wasm = await import('../../wasm/reasoningbank/reasoningbank_wasm.js');\n this.wasmModule = wasm;\n console.log('[HybridReasoningBank] WASM module loaded successfully');\n } catch (error) {\n throw new Error(`WASM load failed: ${error}`);\n }\n }\n\n /**\n * Store a reasoning pattern\n */\n async storePattern(pattern: PatternData): Promise<number> {\n const episodeId = await this.reflexion.storeEpisode(pattern);\n\n // Store causal edge if action led to outcome\n if (pattern.input && pattern.output && pattern.success) {\n try {\n this.causalGraph.addCausalEdge({\n fromMemoryId: episodeId,\n fromMemoryType: 'episode',\n toMemoryId: episodeId + 1, // Next episode\n toMemoryType: 'episode',\n similarity: pattern.reward,\n uplift: pattern.success ? pattern.reward : -pattern.reward,\n confidence: 0.8,\n sampleSize: 1,\n metadata: {\n sessionId: pattern.sessionId,\n task: pattern.task\n }\n });\n } catch (error) {\n console.warn('[HybridReasoningBank] Failed to record causal edge:', error);\n }\n }\n\n return episodeId;\n }\n\n /**\n * Retrieve similar patterns with optional WASM acceleration\n */\n async retrievePatterns(query: string, options: RetrievalOptions = {}): Promise<any[]> {\n const { k = 5, minReward, onlySuccesses, onlyFailures } = options;\n\n // Check cache first\n const cacheKey = `retrieve:${query}:${k}:${onlySuccesses}:${onlyFailures}`;\n const cached = this.memory.getCachedQuery(cacheKey);\n if (cached) return cached;\n\n // Use CausalRecall for intelligent retrieval with utility-based ranking\n try {\n const result = await this.causalRecall.recall(\n `query-${Date.now()}`,\n query,\n k,\n undefined, // requirements\n 'public' // accessLevel\n );\n\n // Convert candidates to pattern format and filter\n let patterns = result.candidates.map(c => ({\n task: c.content,\n similarity: c.similarity,\n uplift: c.uplift || 0,\n utilityScore: c.utilityScore,\n type: c.type,\n id: c.id\n }));\n\n // Apply filters\n if (minReward !== undefined) {\n patterns = patterns.filter(p => (p.uplift || 0) >= minReward);\n }\n\n // Cache and return\n this.memory.cacheQuery(cacheKey, patterns, 60000);\n return patterns;\n } catch (error) {\n console.warn('[HybridReasoningBank] CausalRecall failed, falling back to ReflexionMemory:', error);\n\n // Fallback to basic ReflexionMemory\n const results = await this.reflexion.retrieveRelevant({\n task: query,\n k,\n minReward,\n onlySuccesses,\n onlyFailures\n });\n\n this.memory.cacheQuery(cacheKey, results, 60000);\n return results;\n }\n }\n\n /**\n * Learn optimal strategy for a task\n *\n * Combines pattern retrieval with causal analysis to provide evidence-based recommendations\n */\n async learnStrategy(task: string): Promise<{\n patterns: any[];\n causality: CausalInsight;\n confidence: number;\n recommendation: string;\n }> {\n // Get successful patterns\n const patterns = await this.retrievePatterns(task, { k: 10, onlySuccesses: true });\n\n // Get causal effects for this task type\n let causalData: any;\n try {\n // Note: queryCausalEffects requires specific memory IDs\n // For task-level analysis, we'll use pattern success rates instead\n const stats = await this.reflexion.getTaskStats(task, 30);\n\n if (stats.totalAttempts > 0) {\n causalData = {\n action: task,\n avgReward: stats.avgReward || 0,\n avgUplift: stats.improvementTrend || 0,\n confidence: Math.min(stats.totalAttempts / 10, 1.0),\n evidenceCount: stats.totalAttempts,\n recommendation: (stats.improvementTrend || 0) > 0.1 ? 'DO_IT' :\n (stats.improvementTrend || 0) < -0.1 ? 'AVOID' : 'NEUTRAL'\n };\n }\n } catch (error) {\n console.warn('[HybridReasoningBank] Causal analysis failed:', error);\n }\n\n // Fallback if no causal data\n if (!causalData) {\n causalData = {\n action: task,\n avgReward: patterns.length > 0 ? (patterns[0].reward || 0) : 0,\n avgUplift: 0,\n confidence: patterns.length > 0 ? 0.6 : 0.3,\n evidenceCount: patterns.length,\n recommendation: patterns.length > 0 ? 'DO_IT' : 'NEUTRAL'\n };\n }\n\n // Calculate overall confidence\n const patternConf = Math.min(patterns.length / 10, 1.0); // 10+ patterns = full confidence\n const causalConf = causalData.confidence;\n const confidence = 0.6 * patternConf + 0.4 * causalConf;\n\n // Generate recommendation\n let recommendation = '';\n if (confidence > 0.8 && causalData.avgUplift > 0.1) {\n recommendation = `Strong evidence for success (${patterns.length} patterns, +${(causalData.avgUplift * 100).toFixed(1)}% uplift)`;\n } else if (confidence > 0.5) {\n recommendation = `Moderate evidence (${patterns.length} patterns available)`;\n } else {\n recommendation = `Limited evidence - proceed with caution`;\n }\n\n return {\n patterns,\n causality: causalData,\n confidence,\n recommendation\n };\n }\n\n /**\n * Auto-consolidate patterns into skills\n */\n async autoConsolidate(minUses: number = 3, minSuccessRate: number = 0.7, lookbackDays: number = 30): Promise<{ skillsCreated: number }> {\n // Get task statistics\n const stats = await this.reflexion.getTaskStats('', lookbackDays);\n\n if (stats.totalAttempts < minUses || stats.successRate < minSuccessRate) {\n return { skillsCreated: 0 };\n }\n\n // Get successful episodes for consolidation\n const episodes = await this.reflexion.retrieveRelevant({\n task: '',\n k: 50,\n onlySuccesses: true,\n timeWindowDays: lookbackDays\n });\n\n // Group by task type and consolidate\n const taskGroups = new Map<string, any[]>();\n episodes.forEach(ep => {\n const group = taskGroups.get(ep.task) || [];\n group.push(ep);\n taskGroups.set(ep.task, group);\n });\n\n let skillsCreated = 0;\n for (const [task, group] of taskGroups) {\n if (group.length >= minUses) {\n const successRate = group.filter(e => e.success).length / group.length;\n if (successRate >= minSuccessRate) {\n await this.skills.createSkill({\n name: `skill_${task.replace(/\\s+/g, '_').toLowerCase()}`,\n description: `Consolidated from ${group.length} successful episodes`,\n signature: { inputs: {}, outputs: {} },\n successRate,\n uses: group.length,\n avgReward: group.reduce((sum, e) => sum + e.reward, 0) / group.length,\n avgLatencyMs: group.reduce((sum, e) => sum + (e.latencyMs || 0), 0) / group.length,\n metadata: { consolidatedAt: Date.now(), taskType: task }\n });\n skillsCreated++;\n }\n }\n }\n\n return { skillsCreated };\n }\n\n /**\n * What-if causal analysis\n */\n async whatIfAnalysis(action: string): Promise<CausalInsight> {\n try {\n // Use task statistics for what-if analysis\n const stats = await this.reflexion.getTaskStats(action, 30);\n\n if (stats.totalAttempts === 0) {\n return {\n action,\n avgReward: 0,\n avgUplift: 0,\n confidence: 0,\n evidenceCount: 0,\n recommendation: 'NEUTRAL'\n };\n }\n\n const avgUplift = stats.improvementTrend || 0;\n const confidence = Math.min(stats.totalAttempts / 10, 1.0);\n\n return {\n action,\n avgReward: stats.avgReward || 0,\n avgUplift,\n confidence,\n evidenceCount: stats.totalAttempts,\n recommendation: avgUplift > 0.1 ? 'DO_IT' : avgUplift < -0.1 ? 'AVOID' : 'NEUTRAL'\n };\n } catch (error) {\n console.error('[HybridReasoningBank] What-if analysis failed:', error);\n return {\n action,\n avgReward: 0,\n avgUplift: 0,\n confidence: 0,\n evidenceCount: 0,\n recommendation: 'NEUTRAL'\n };\n }\n }\n\n /**\n * Search for relevant skills\n */\n async searchSkills(taskType: string, k: number = 5): Promise<any[]> {\n return this.skills.searchSkills({ task: taskType, k, minSuccessRate: 0.5 });\n }\n\n /**\n * Get statistics\n */\n getStats(): {\n causalRecall: any;\n reflexion: any;\n skills: number;\n } {\n return {\n causalRecall: this.causalRecall.getStats(),\n reflexion: {}, // ReflexionMemory doesn't expose global stats\n skills: 0 // Would need to query database\n };\n }\n}\n"]}
@@ -29,6 +29,15 @@ export declare function hasIndexedDB(): boolean;
29
29
  * Check if SQLite native module is available (Node.js)
30
30
  */
31
31
  export declare function hasSQLite(): boolean;
32
+ /**
33
+ * Check if sql.js (WASM SQLite) is available
34
+ */
35
+ export declare function hasSqlJs(): boolean;
36
+ /**
37
+ * Get best available SQLite implementation
38
+ * Priority: better-sqlite3 > sql.js > none
39
+ */
40
+ export declare function getSQLiteImplementation(): 'better-sqlite3' | 'sql.js' | 'none';
32
41
  /**
33
42
  * Create ReasoningBank instance with optimal backend for current environment
34
43
  *
@@ -74,6 +83,7 @@ export declare function validateEnvironment(): {
74
83
  valid: boolean;
75
84
  warnings: string[];
76
85
  backend: 'nodejs' | 'wasm';
86
+ sqliteImpl: 'better-sqlite3' | 'sql.js' | 'none';
77
87
  };
78
88
  export { validateEnvironment as checkEnvironment };
79
89
  //# sourceMappingURL=backend-selector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"backend-selector.d.ts","sourceRoot":"","sources":["../../src/reasoningbank/backend-selector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,QAAQ,GAAG,MAAM,CAazD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAOnC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,GAAE,MAAwB,EAChC,OAAO,GAAE;IACP,wDAAwD;IACxD,YAAY,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjC,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACd,GACL,OAAO,CAAC,GAAG,CAAC,CAuCd;AAED;;GAEG;AACH,wBAAgB,cAAc;;;;;;;;;;EAkB7B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC5B,CAqBA;AAGD,OAAO,EAAE,mBAAmB,IAAI,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"backend-selector.d.ts","sourceRoot":"","sources":["../../src/reasoningbank/backend-selector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,QAAQ,GAAG,MAAM,CAazD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAOnC;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,OAAO,CAOlC;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,gBAAgB,GAAG,QAAQ,GAAG,MAAM,CAI9E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,0BAA0B,CAC9C,MAAM,GAAE,MAAwB,EAChC,OAAO,GAAE;IACP,wDAAwD;IACxD,YAAY,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjC,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACd,GACL,OAAO,CAAC,GAAG,CAAC,CAuDd;AAED;;GAEG;AACH,wBAAgB,cAAc;;;;;;;;;;EAkB7B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC3B,UAAU,EAAE,gBAAgB,GAAG,QAAQ,GAAG,MAAM,CAAC;CAClD,CAwBA;AAGD,OAAO,EAAE,mBAAmB,IAAI,gBAAgB,EAAE,CAAC"}
@@ -50,6 +50,29 @@ export function hasSQLite() {
50
50
  return false;
51
51
  }
52
52
  }
53
+ /**
54
+ * Check if sql.js (WASM SQLite) is available
55
+ */
56
+ export function hasSqlJs() {
57
+ try {
58
+ require.resolve('sql.js');
59
+ return true;
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ }
65
+ /**
66
+ * Get best available SQLite implementation
67
+ * Priority: better-sqlite3 > sql.js > none
68
+ */
69
+ export function getSQLiteImplementation() {
70
+ if (hasSQLite())
71
+ return 'better-sqlite3';
72
+ if (hasSqlJs())
73
+ return 'sql.js';
74
+ return 'none';
75
+ }
53
76
  /**
54
77
  * Create ReasoningBank instance with optimal backend for current environment
55
78
  *
@@ -73,11 +96,24 @@ export async function createOptimalReasoningBank(dbName = 'reasoningbank', optio
73
96
  console.log(`[ReasoningBank] Database: ${dbName}`);
74
97
  }
75
98
  if (backend === 'nodejs') {
99
+ const sqliteImpl = getSQLiteImplementation();
100
+ if (options.verbose) {
101
+ console.log(`[ReasoningBank] SQLite implementation: ${sqliteImpl}`);
102
+ }
103
+ // If better-sqlite3 not available, fallback to WASM/sql.js
104
+ if (sqliteImpl === 'none' || sqliteImpl === 'sql.js') {
105
+ if (options.verbose) {
106
+ console.log(`[ReasoningBank] Native SQLite not available, using WASM backend`);
107
+ }
108
+ // Use WASM backend as fallback (works on Windows without native compilation)
109
+ const { createReasoningBank } = await import('./wasm-adapter.js');
110
+ return await createReasoningBank(dbName);
111
+ }
76
112
  // Import Node.js backend (SQLite)
77
113
  const reasoningBankModule = await import('./index.js');
78
114
  const dbPath = options.dbPath || `.swarm/${dbName}.db`;
79
115
  if (options.verbose) {
80
- console.log(`[ReasoningBank] Using Node.js backend with SQLite`);
116
+ console.log(`[ReasoningBank] Using Node.js backend with better-sqlite3`);
81
117
  console.log(`[ReasoningBank] Database path: ${dbPath}`);
82
118
  }
83
119
  // The Node.js backend uses the db module and core algorithms
@@ -125,11 +161,15 @@ export function getBackendInfo() {
125
161
  */
126
162
  export function validateEnvironment() {
127
163
  const backend = getRecommendedBackend();
164
+ const sqliteImpl = getSQLiteImplementation();
128
165
  const warnings = [];
129
166
  let valid = true;
130
- if (backend === 'nodejs' && !hasSQLite()) {
131
- warnings.push('better-sqlite3 not found - database operations will fail');
132
- valid = false;
167
+ if (backend === 'nodejs' && sqliteImpl === 'none') {
168
+ warnings.push('No SQLite implementation available - will use WASM fallback');
169
+ warnings.push('Install sql.js for persistence: npm install sql.js');
170
+ }
171
+ else if (backend === 'nodejs' && sqliteImpl === 'sql.js') {
172
+ warnings.push('Using sql.js (WASM) instead of better-sqlite3 - this is normal on Windows');
133
173
  }
134
174
  if (backend === 'wasm' && typeof window !== 'undefined' && !hasIndexedDB()) {
135
175
  warnings.push('IndexedDB not available - using ephemeral memory storage');
@@ -139,7 +179,7 @@ export function validateEnvironment() {
139
179
  warnings.push('WASM in Node.js uses in-memory storage (ephemeral)');
140
180
  warnings.push('Consider using Node.js backend for persistence');
141
181
  }
142
- return { valid, warnings, backend };
182
+ return { valid, warnings, backend, sqliteImpl };
143
183
  }
144
184
  // Export validation helper for use in initialization
145
185
  export { validateEnvironment as checkEnvironment };
@@ -1 +1 @@
1
- {"version":3,"file":"backend-selector.js","sourceRoot":"","sources":["../../src/reasoningbank/backend-selector.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Backend Selection Helper for ReasoningBank\n *\n * Automatically selects the optimal ReasoningBank backend based on runtime environment.\n *\n * Usage:\n * ```typescript\n * import { createOptimalReasoningBank, getRecommendedBackend } from 'agentic-flow/reasoningbank/backend-selector';\n *\n * // Automatic backend selection\n * const rb = await createOptimalReasoningBank('my-db');\n *\n * // Manual check\n * const backend = getRecommendedBackend();\n * console.log(`Using ${backend} backend`);\n * ```\n */\n\n/**\n * Detect runtime environment and recommend optimal backend\n *\n * @returns 'nodejs' for Node.js/Deno environments, 'wasm' for browsers\n */\nexport function getRecommendedBackend(): 'nodejs' | 'wasm' {\n // Check for browser environment\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n return 'wasm';\n }\n\n // Check for Node.js/Deno\n if (typeof process !== 'undefined' && process.versions?.node) {\n return 'nodejs';\n }\n\n // Default to WASM for unknown environments (likely web workers, etc.)\n return 'wasm';\n}\n\n/**\n * Check if IndexedDB is available (browser environment)\n */\nexport function hasIndexedDB(): boolean {\n return typeof indexedDB !== 'undefined';\n}\n\n/**\n * Check if SQLite native module is available (Node.js)\n */\nexport function hasSQLite(): boolean {\n try {\n require.resolve('better-sqlite3');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Create ReasoningBank instance with optimal backend for current environment\n *\n * @param dbName - Database name (used differently by each backend)\n * @param options - Additional configuration options\n * @returns ReasoningBank instance using optimal backend\n *\n * @example\n * ```typescript\n * // Node.js: Creates SQLite database at .swarm/my-app.db\n * const rb = await createOptimalReasoningBank('my-app');\n *\n * // Browser: Creates IndexedDB database named 'my-app'\n * const rb = await createOptimalReasoningBank('my-app');\n * ```\n */\nexport async function createOptimalReasoningBank(\n dbName: string = 'reasoningbank',\n options: {\n /** Force specific backend (overrides auto-detection) */\n forceBackend?: 'nodejs' | 'wasm';\n /** Custom database path (Node.js only) */\n dbPath?: string;\n /** Enable verbose logging */\n verbose?: boolean;\n } = {}\n): Promise<any> {\n const backend = options.forceBackend || getRecommendedBackend();\n\n if (options.verbose) {\n console.log(`[ReasoningBank] Environment: ${backend}`);\n console.log(`[ReasoningBank] Database: ${dbName}`);\n }\n\n if (backend === 'nodejs') {\n // Import Node.js backend (SQLite)\n const reasoningBankModule = await import('./index.js');\n\n const dbPath = options.dbPath || `.swarm/${dbName}.db`;\n\n if (options.verbose) {\n console.log(`[ReasoningBank] Using Node.js backend with SQLite`);\n console.log(`[ReasoningBank] Database path: ${dbPath}`);\n }\n\n // The Node.js backend uses the db module and core algorithms\n // Initialize the database\n await reasoningBankModule.initialize();\n\n // Note: The Node.js backend has a different API than WASM\n // It uses the functions from db/queries.ts and core algorithms\n // We return the full module for direct access to all functions\n return reasoningBankModule;\n } else {\n // Import WASM backend (IndexedDB in browser, Memory in Node.js)\n const { createReasoningBank } = await import('./wasm-adapter.js');\n\n if (options.verbose) {\n const storageType = hasIndexedDB() ? 'IndexedDB (persistent)' : 'Memory (ephemeral)';\n console.log(`[ReasoningBank] Using WASM backend with ${storageType}`);\n console.log(`[ReasoningBank] Database name: ${dbName}`);\n }\n\n return await createReasoningBank(dbName);\n }\n}\n\n/**\n * Get backend information and capabilities\n */\nexport function getBackendInfo() {\n const backend = getRecommendedBackend();\n\n return {\n backend,\n environment: typeof window !== 'undefined' ? 'browser' : 'nodejs',\n features: {\n persistent: backend === 'nodejs' || hasIndexedDB(),\n sqlite: backend === 'nodejs' && hasSQLite(),\n indexeddb: backend === 'wasm' && hasIndexedDB(),\n wasm: backend === 'wasm',\n },\n storage: backend === 'nodejs'\n ? 'SQLite (disk)'\n : hasIndexedDB()\n ? 'IndexedDB (browser)'\n : 'Memory (ephemeral)',\n };\n}\n\n/**\n * Validate environment and warn about limitations\n */\nexport function validateEnvironment(): {\n valid: boolean;\n warnings: string[];\n backend: 'nodejs' | 'wasm';\n} {\n const backend = getRecommendedBackend();\n const warnings: string[] = [];\n let valid = true;\n\n if (backend === 'nodejs' && !hasSQLite()) {\n warnings.push('better-sqlite3 not found - database operations will fail');\n valid = false;\n }\n\n if (backend === 'wasm' && typeof window !== 'undefined' && !hasIndexedDB()) {\n warnings.push('IndexedDB not available - using ephemeral memory storage');\n warnings.push('Data will be lost when page/process exits');\n }\n\n if (backend === 'wasm' && typeof window === 'undefined') {\n warnings.push('WASM in Node.js uses in-memory storage (ephemeral)');\n warnings.push('Consider using Node.js backend for persistence');\n }\n\n return { valid, warnings, backend };\n}\n\n// Export validation helper for use in initialization\nexport { validateEnvironment as checkEnvironment };\n"]}
1
+ {"version":3,"file":"backend-selector.js","sourceRoot":"","sources":["../../src/reasoningbank/backend-selector.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Backend Selection Helper for ReasoningBank\n *\n * Automatically selects the optimal ReasoningBank backend based on runtime environment.\n *\n * Usage:\n * ```typescript\n * import { createOptimalReasoningBank, getRecommendedBackend } from 'agentic-flow/reasoningbank/backend-selector';\n *\n * // Automatic backend selection\n * const rb = await createOptimalReasoningBank('my-db');\n *\n * // Manual check\n * const backend = getRecommendedBackend();\n * console.log(`Using ${backend} backend`);\n * ```\n */\n\n/**\n * Detect runtime environment and recommend optimal backend\n *\n * @returns 'nodejs' for Node.js/Deno environments, 'wasm' for browsers\n */\nexport function getRecommendedBackend(): 'nodejs' | 'wasm' {\n // Check for browser environment\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n return 'wasm';\n }\n\n // Check for Node.js/Deno\n if (typeof process !== 'undefined' && process.versions?.node) {\n return 'nodejs';\n }\n\n // Default to WASM for unknown environments (likely web workers, etc.)\n return 'wasm';\n}\n\n/**\n * Check if IndexedDB is available (browser environment)\n */\nexport function hasIndexedDB(): boolean {\n return typeof indexedDB !== 'undefined';\n}\n\n/**\n * Check if SQLite native module is available (Node.js)\n */\nexport function hasSQLite(): boolean {\n try {\n require.resolve('better-sqlite3');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if sql.js (WASM SQLite) is available\n */\nexport function hasSqlJs(): boolean {\n try {\n require.resolve('sql.js');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get best available SQLite implementation\n * Priority: better-sqlite3 > sql.js > none\n */\nexport function getSQLiteImplementation(): 'better-sqlite3' | 'sql.js' | 'none' {\n if (hasSQLite()) return 'better-sqlite3';\n if (hasSqlJs()) return 'sql.js';\n return 'none';\n}\n\n/**\n * Create ReasoningBank instance with optimal backend for current environment\n *\n * @param dbName - Database name (used differently by each backend)\n * @param options - Additional configuration options\n * @returns ReasoningBank instance using optimal backend\n *\n * @example\n * ```typescript\n * // Node.js: Creates SQLite database at .swarm/my-app.db\n * const rb = await createOptimalReasoningBank('my-app');\n *\n * // Browser: Creates IndexedDB database named 'my-app'\n * const rb = await createOptimalReasoningBank('my-app');\n * ```\n */\nexport async function createOptimalReasoningBank(\n dbName: string = 'reasoningbank',\n options: {\n /** Force specific backend (overrides auto-detection) */\n forceBackend?: 'nodejs' | 'wasm';\n /** Custom database path (Node.js only) */\n dbPath?: string;\n /** Enable verbose logging */\n verbose?: boolean;\n } = {}\n): Promise<any> {\n const backend = options.forceBackend || getRecommendedBackend();\n\n if (options.verbose) {\n console.log(`[ReasoningBank] Environment: ${backend}`);\n console.log(`[ReasoningBank] Database: ${dbName}`);\n }\n\n if (backend === 'nodejs') {\n const sqliteImpl = getSQLiteImplementation();\n\n if (options.verbose) {\n console.log(`[ReasoningBank] SQLite implementation: ${sqliteImpl}`);\n }\n\n // If better-sqlite3 not available, fallback to WASM/sql.js\n if (sqliteImpl === 'none' || sqliteImpl === 'sql.js') {\n if (options.verbose) {\n console.log(`[ReasoningBank] Native SQLite not available, using WASM backend`);\n }\n // Use WASM backend as fallback (works on Windows without native compilation)\n const { createReasoningBank } = await import('./wasm-adapter.js');\n return await createReasoningBank(dbName);\n }\n\n // Import Node.js backend (SQLite)\n const reasoningBankModule = await import('./index.js');\n\n const dbPath = options.dbPath || `.swarm/${dbName}.db`;\n\n if (options.verbose) {\n console.log(`[ReasoningBank] Using Node.js backend with better-sqlite3`);\n console.log(`[ReasoningBank] Database path: ${dbPath}`);\n }\n\n // The Node.js backend uses the db module and core algorithms\n // Initialize the database\n await reasoningBankModule.initialize();\n\n // Note: The Node.js backend has a different API than WASM\n // It uses the functions from db/queries.ts and core algorithms\n // We return the full module for direct access to all functions\n return reasoningBankModule;\n } else {\n // Import WASM backend (IndexedDB in browser, Memory in Node.js)\n const { createReasoningBank } = await import('./wasm-adapter.js');\n\n if (options.verbose) {\n const storageType = hasIndexedDB() ? 'IndexedDB (persistent)' : 'Memory (ephemeral)';\n console.log(`[ReasoningBank] Using WASM backend with ${storageType}`);\n console.log(`[ReasoningBank] Database name: ${dbName}`);\n }\n\n return await createReasoningBank(dbName);\n }\n}\n\n/**\n * Get backend information and capabilities\n */\nexport function getBackendInfo() {\n const backend = getRecommendedBackend();\n\n return {\n backend,\n environment: typeof window !== 'undefined' ? 'browser' : 'nodejs',\n features: {\n persistent: backend === 'nodejs' || hasIndexedDB(),\n sqlite: backend === 'nodejs' && hasSQLite(),\n indexeddb: backend === 'wasm' && hasIndexedDB(),\n wasm: backend === 'wasm',\n },\n storage: backend === 'nodejs'\n ? 'SQLite (disk)'\n : hasIndexedDB()\n ? 'IndexedDB (browser)'\n : 'Memory (ephemeral)',\n };\n}\n\n/**\n * Validate environment and warn about limitations\n */\nexport function validateEnvironment(): {\n valid: boolean;\n warnings: string[];\n backend: 'nodejs' | 'wasm';\n sqliteImpl: 'better-sqlite3' | 'sql.js' | 'none';\n} {\n const backend = getRecommendedBackend();\n const sqliteImpl = getSQLiteImplementation();\n const warnings: string[] = [];\n let valid = true;\n\n if (backend === 'nodejs' && sqliteImpl === 'none') {\n warnings.push('No SQLite implementation available - will use WASM fallback');\n warnings.push('Install sql.js for persistence: npm install sql.js');\n } else if (backend === 'nodejs' && sqliteImpl === 'sql.js') {\n warnings.push('Using sql.js (WASM) instead of better-sqlite3 - this is normal on Windows');\n }\n\n if (backend === 'wasm' && typeof window !== 'undefined' && !hasIndexedDB()) {\n warnings.push('IndexedDB not available - using ephemeral memory storage');\n warnings.push('Data will be lost when page/process exits');\n }\n\n if (backend === 'wasm' && typeof window === 'undefined') {\n warnings.push('WASM in Node.js uses in-memory storage (ephemeral)');\n warnings.push('Consider using Node.js backend for persistence');\n }\n\n return { valid, warnings, backend, sqliteImpl };\n}\n\n// Export validation helper for use in initialization\nexport { validateEnvironment as checkEnvironment };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"consolidate.d.ts","sourceRoot":"","sources":["../../../src/reasoningbank/core/consolidate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAqDhE;AAuGD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C"}
1
+ {"version":3,"file":"consolidate.d.ts","sourceRoot":"","sources":["../../../src/reasoningbank/core/consolidate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAqDhE;AA+KD;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C"}
@@ -53,75 +53,143 @@ 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
56
58
  */
57
59
  async function deduplicateMemories(memories, threshold) {
58
60
  let duplicatesFound = 0;
59
- // Fetch embeddings for all memories
61
+ if (memories.length === 0)
62
+ return 0;
63
+ // Fetch all embeddings in a single batch query (instead of N queries)
60
64
  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);
61
68
  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
62
76
  for (const mem of memories) {
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));
77
+ const emb = embeddingsMap.get(mem.id);
78
+ if (!emb)
79
+ continue;
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, []);
66
92
  }
93
+ buckets.get(bucketKey).push(mem);
67
94
  }
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];
95
+ // Compare only within buckets (and neighboring buckets for safety)
96
+ const deletedIds = new Set();
97
+ for (const [bucketKey, bucketMemories] of buckets) {
98
+ // Compare within bucket
99
+ for (let i = 0; i < bucketMemories.length; i++) {
100
+ const mem1 = bucketMemories[i];
101
+ if (deletedIds.has(mem1.id))
102
+ continue;
73
103
  const emb1 = embeddingsMap.get(mem1.id);
74
- const emb2 = embeddingsMap.get(mem2.id);
75
- if (!emb1 || !emb2)
104
+ if (!emb1)
76
105
  continue;
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}`);
106
+ for (let j = i + 1; j < bucketMemories.length; j++) {
107
+ const mem2 = bucketMemories[j];
108
+ if (deletedIds.has(mem2.id))
109
+ continue;
110
+ const emb2 = embeddingsMap.get(mem2.id);
111
+ if (!emb2)
112
+ continue;
113
+ const similarity = cosineSimilarity(emb1, emb2);
114
+ if (similarity >= threshold) {
115
+ // Mark as duplicate
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
+ }
87
126
  }
88
127
  }
89
128
  }
90
129
  }
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
+ }
91
136
  return duplicatesFound;
92
137
  }
93
138
  /**
94
139
  * Detect contradicting memories
95
140
  * Uses embedding similarity + semantic analysis
141
+ * PERFORMANCE FIX: Reuses embeddings from deduplication phase and uses bucketing
96
142
  */
97
- async function detectContradictions(memories, threshold) {
143
+ async function detectContradictions(memories, threshold, preloadedEmbeddings) {
98
144
  let contradictionsFound = 0;
99
- const dbConn = db.getDb();
100
- const embeddingsMap = new Map();
145
+ if (memories.length === 0)
146
+ return 0;
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();
101
164
  for (const mem of memories) {
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));
165
+ const outcome = mem.pattern_data?.source?.outcome ?? 'unknown';
166
+ if (!outcomeGroups.has(outcome)) {
167
+ outcomeGroups.set(outcome, []);
105
168
  }
169
+ outcomeGroups.get(outcome).push(mem);
106
170
  }
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}`);
171
+ // Only compare memories with different outcomes
172
+ const outcomeKeys = Array.from(outcomeGroups.keys());
173
+ for (let o1 = 0; o1 < outcomeKeys.length; o1++) {
174
+ for (let o2 = o1 + 1; o2 < outcomeKeys.length; o2++) {
175
+ const group1 = outcomeGroups.get(outcomeKeys[o1]);
176
+ const group2 = outcomeGroups.get(outcomeKeys[o2]);
177
+ // Compare across groups (different outcomes)
178
+ for (const mem1 of group1) {
179
+ const emb1 = embeddingsMap.get(mem1.id);
180
+ if (!emb1)
181
+ continue;
182
+ for (const mem2 of group2) {
183
+ const emb2 = embeddingsMap.get(mem2.id);
184
+ if (!emb2)
185
+ continue;
186
+ const similarity = cosineSimilarity(emb1, emb2);
187
+ // High similarity but different outcomes = contradiction
188
+ if (similarity >= threshold) {
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
+ }
125
193
  }
126
194
  }
127
195
  }
@@ -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 */\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"]}
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"]}
@@ -8,12 +8,7 @@ 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 } 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';
11
+ export { ReflexionMemory, SkillLibrary, CausalMemoryGraph, CausalRecall, NightlyLearner, EmbeddingService } from 'agentdb';
17
12
  export { retrieveMemories, formatMemoriesForPrompt } from './core/retrieve.js';
18
13
  export type { RetrievedMemory } from './core/retrieve.js';
19
14
  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,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"}
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,EACL,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAGjB,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,12 +8,7 @@
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 } 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';
11
+ export { ReflexionMemory, SkillLibrary, CausalMemoryGraph, CausalRecall, NightlyLearner, EmbeddingService } from 'agentdb';
17
12
  // Original ReasoningBank implementations (backwards compatibility)
18
13
  export { retrieveMemories, formatMemoriesForPrompt } from './core/retrieve.js';
19
14
  export { judgeTrajectory } from './core/judge.js';