agentic-flow 2.0.7 → 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 +27 -9
  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
@@ -0,0 +1,103 @@
1
+ /**
2
+ * SharedMemoryPool — singleton resource pool that backs HybridReasoningBank
3
+ * and AdvancedMemorySystem.
4
+ *
5
+ * Centralises a single SQLite database handle (better-sqlite3) and a single
6
+ * `EmbeddingService` instance so multiple memory consumers share the same
7
+ * underlying tables / embedding cache without conflicting writes.
8
+ *
9
+ * The pool is constructed lazily on first `getInstance()` call. All heavy
10
+ * resources (sqlite handle, embedder pipeline) are created on demand inside
11
+ * `ensureInitialized()` so simply importing this module is side-effect free.
12
+ *
13
+ * Used by:
14
+ * - reasoningbank/HybridBackend.ts (HybridReasoningBank)
15
+ * - reasoningbank/AdvancedMemory.ts (AdvancedMemorySystem)
16
+ *
17
+ * Fixes issue #102 — this file was previously imported but missing on disk,
18
+ * which broke `import 'agentic-flow'` at the top level.
19
+ */
20
+ import { EmbeddingService } from 'agentdb';
21
+ type DatabaseHandle = any;
22
+ type EmbedderHandle = EmbeddingService;
23
+ export interface SharedMemoryPoolOptions {
24
+ /** SQLite database path. Defaults to `~/.agentic-flow/reasoningbank.db`. */
25
+ dbPath?: string;
26
+ /** Embedding model id. Defaults to `Xenova/all-MiniLM-L6-v2`. */
27
+ embeddingModel?: string;
28
+ /** Embedding vector dimension. Defaults to 384 (MiniLM-L6). */
29
+ embeddingDimension?: number;
30
+ /** Embedding provider. Defaults to `'transformers'`. */
31
+ embeddingProvider?: 'transformers' | 'openai' | 'local';
32
+ }
33
+ export interface SharedMemoryPoolStats {
34
+ initialized: boolean;
35
+ dbPath: string;
36
+ embeddingModel: string;
37
+ embeddingDimension: number;
38
+ cache: {
39
+ entries: number;
40
+ hits: number;
41
+ misses: number;
42
+ evictions: number;
43
+ };
44
+ }
45
+ export declare class SharedMemoryPool {
46
+ private static _instance;
47
+ private readonly options;
48
+ private db;
49
+ private embedder;
50
+ private initPromise;
51
+ private cache;
52
+ private cacheStats;
53
+ private constructor();
54
+ /**
55
+ * Singleton accessor. The first caller wins for option overrides; later
56
+ * callers always get the existing pool. To reconfigure, call `reset()`.
57
+ */
58
+ static getInstance(options?: SharedMemoryPoolOptions): SharedMemoryPool;
59
+ /** Tear down the singleton — primarily for tests. */
60
+ static reset(): void;
61
+ /**
62
+ * Idempotently ensure the database and embedder are ready. Subsequent calls
63
+ * return the same in-flight promise so concurrent consumers share init.
64
+ */
65
+ ensureInitialized(): Promise<void>;
66
+ private initialize;
67
+ /** Apply the minimum schema that ReflexionMemory / SkillLibrary require. */
68
+ private applySchema;
69
+ /**
70
+ * Synchronous accessor for the database handle. Throws if init hasn't run —
71
+ * call `ensureInitialized()` first. Provided for compatibility with
72
+ * controllers that take a `Database` instance in their constructor.
73
+ */
74
+ getDatabase(): DatabaseHandle;
75
+ /**
76
+ * Synchronous accessor for the embedder. Throws if init hasn't run.
77
+ */
78
+ getEmbedder(): EmbedderHandle;
79
+ /**
80
+ * Cache a query result with a TTL (milliseconds). Keys are arbitrary
81
+ * strings; consumers (HybridReasoningBank) typically encode the query
82
+ * shape into the key.
83
+ */
84
+ cacheQuery<T>(key: string, value: T, ttlMs: number): void;
85
+ /**
86
+ * Read a cached query result. Returns the cached value if present and not
87
+ * expired; lazily evicts expired entries on lookup.
88
+ *
89
+ * The default `T` is `any` for ergonomic interop with the existing
90
+ * HybridReasoningBank call sites that expect a loose return type.
91
+ * Pass an explicit type parameter (`getCachedQuery<MyShape>(...)`) when
92
+ * you want stricter typing.
93
+ */
94
+ getCachedQuery<T = any>(key: string): T | undefined;
95
+ /** Drop all cached query results. */
96
+ invalidateCache(): void;
97
+ /** Diagnostic stats for telemetry / health endpoints. */
98
+ getStats(): SharedMemoryPoolStats;
99
+ /** Close the underlying database handle and clear cached state. */
100
+ close(): void;
101
+ }
102
+ export {};
103
+ //# sourceMappingURL=SharedMemoryPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedMemoryPool.d.ts","sourceRoot":"","sources":["../../src/memory/SharedMemoryPool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,KAAK,cAAc,GAAG,GAAG,CAAC;AAC1B,KAAK,cAAc,GAAG,gBAAgB,CAAC;AAEvC,MAAM,WAAW,uBAAuB;IACtC,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,cAAc,GAAG,QAAQ,GAAG,OAAO,CAAC;CACzD;AAcD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAiC;IAEzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,WAAW,CAA8B;IAIjD,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,UAAU,CAAwC;IAE1D,OAAO;IAIP;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,gBAAgB;IAOvE,qDAAqD;IACrD,MAAM,CAAC,KAAK,IAAI,IAAI;IAOpB;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;YAQ1B,UAAU;IAsBxB,4EAA4E;IAC5E,OAAO,CAAC,WAAW;IAoEnB;;;;OAIG;IACH,WAAW,IAAI,cAAc;IAS7B;;OAEG;IACH,WAAW,IAAI,cAAc;IAS7B;;;;OAIG;IACH,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAQzD;;;;;;;;OAQG;IAEH,cAAc,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAgBnD,qCAAqC;IACrC,eAAe,IAAI,IAAI;IAKvB,yDAAyD;IACzD,QAAQ,IAAI,qBAAqB;IAejC,mEAAmE;IACnE,KAAK,IAAI,IAAI;CAYd"}
@@ -0,0 +1,263 @@
1
+ /**
2
+ * SharedMemoryPool — singleton resource pool that backs HybridReasoningBank
3
+ * and AdvancedMemorySystem.
4
+ *
5
+ * Centralises a single SQLite database handle (better-sqlite3) and a single
6
+ * `EmbeddingService` instance so multiple memory consumers share the same
7
+ * underlying tables / embedding cache without conflicting writes.
8
+ *
9
+ * The pool is constructed lazily on first `getInstance()` call. All heavy
10
+ * resources (sqlite handle, embedder pipeline) are created on demand inside
11
+ * `ensureInitialized()` so simply importing this module is side-effect free.
12
+ *
13
+ * Used by:
14
+ * - reasoningbank/HybridBackend.ts (HybridReasoningBank)
15
+ * - reasoningbank/AdvancedMemory.ts (AdvancedMemorySystem)
16
+ *
17
+ * Fixes issue #102 — this file was previously imported but missing on disk,
18
+ * which broke `import 'agentic-flow'` at the top level.
19
+ */
20
+ import { mkdirSync } from 'node:fs';
21
+ import { dirname, join } from 'node:path';
22
+ import { homedir } from 'node:os';
23
+ import { EmbeddingService } from 'agentdb';
24
+ const DEFAULT_OPTIONS = {
25
+ dbPath: join(homedir(), '.agentic-flow', 'reasoningbank.db'),
26
+ embeddingModel: 'Xenova/all-MiniLM-L6-v2',
27
+ embeddingDimension: 384,
28
+ embeddingProvider: 'transformers',
29
+ };
30
+ export class SharedMemoryPool {
31
+ static _instance = null;
32
+ options;
33
+ db = null;
34
+ embedder = null;
35
+ initPromise = null;
36
+ // Lightweight in-process query cache used by HybridReasoningBank to avoid
37
+ // re-running the same retrieval across consumers in one session.
38
+ cache = new Map();
39
+ cacheStats = { hits: 0, misses: 0, evictions: 0 };
40
+ constructor(options = {}) {
41
+ this.options = { ...DEFAULT_OPTIONS, ...options };
42
+ }
43
+ /**
44
+ * Singleton accessor. The first caller wins for option overrides; later
45
+ * callers always get the existing pool. To reconfigure, call `reset()`.
46
+ */
47
+ static getInstance(options) {
48
+ if (!SharedMemoryPool._instance) {
49
+ SharedMemoryPool._instance = new SharedMemoryPool(options);
50
+ }
51
+ return SharedMemoryPool._instance;
52
+ }
53
+ /** Tear down the singleton — primarily for tests. */
54
+ static reset() {
55
+ if (SharedMemoryPool._instance) {
56
+ SharedMemoryPool._instance.close();
57
+ }
58
+ SharedMemoryPool._instance = null;
59
+ }
60
+ /**
61
+ * Idempotently ensure the database and embedder are ready. Subsequent calls
62
+ * return the same in-flight promise so concurrent consumers share init.
63
+ */
64
+ async ensureInitialized() {
65
+ if (this.db && this.embedder)
66
+ return;
67
+ if (!this.initPromise) {
68
+ this.initPromise = this.initialize();
69
+ }
70
+ return this.initPromise;
71
+ }
72
+ async initialize() {
73
+ // Dynamic import keeps node:fs, better-sqlite3, and the embedding pipeline
74
+ // out of the import graph for callers that never use them.
75
+ const Database = await loadBetterSqlite3();
76
+ mkdirSync(dirname(this.options.dbPath), { recursive: true });
77
+ this.db = new Database(this.options.dbPath);
78
+ // Reasonable defaults for an embedded reasoning database.
79
+ this.db.pragma('journal_mode = WAL');
80
+ this.db.pragma('foreign_keys = ON');
81
+ this.db.pragma('synchronous = NORMAL');
82
+ this.applySchema(this.db);
83
+ this.embedder = new EmbeddingService({
84
+ model: this.options.embeddingModel,
85
+ dimension: this.options.embeddingDimension,
86
+ provider: this.options.embeddingProvider,
87
+ });
88
+ await this.embedder.initialize();
89
+ }
90
+ /** Apply the minimum schema that ReflexionMemory / SkillLibrary require. */
91
+ applySchema(db) {
92
+ db.exec(`
93
+ CREATE TABLE IF NOT EXISTS episodes (
94
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
95
+ ts INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
96
+ session_id TEXT NOT NULL,
97
+ task TEXT NOT NULL,
98
+ input TEXT,
99
+ output TEXT,
100
+ critique TEXT,
101
+ reward REAL NOT NULL,
102
+ success INTEGER NOT NULL,
103
+ latency_ms INTEGER,
104
+ tokens_used INTEGER,
105
+ tags TEXT,
106
+ metadata TEXT
107
+ );
108
+
109
+ CREATE TABLE IF NOT EXISTS episode_embeddings (
110
+ episode_id INTEGER PRIMARY KEY,
111
+ embedding BLOB NOT NULL,
112
+ FOREIGN KEY (episode_id) REFERENCES episodes(id) ON DELETE CASCADE
113
+ );
114
+
115
+ CREATE INDEX IF NOT EXISTS idx_episodes_task ON episodes(task);
116
+ CREATE INDEX IF NOT EXISTS idx_episodes_ts ON episodes(ts);
117
+ CREATE INDEX IF NOT EXISTS idx_episodes_success ON episodes(success);
118
+
119
+ CREATE TABLE IF NOT EXISTS skills (
120
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
121
+ ts INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
122
+ name TEXT NOT NULL,
123
+ description TEXT,
124
+ precondition TEXT,
125
+ action TEXT,
126
+ outcome TEXT,
127
+ success_rate REAL,
128
+ uses INTEGER DEFAULT 0,
129
+ tags TEXT,
130
+ metadata TEXT,
131
+ UNIQUE(name)
132
+ );
133
+
134
+ CREATE TABLE IF NOT EXISTS skill_embeddings (
135
+ skill_id INTEGER PRIMARY KEY,
136
+ embedding BLOB NOT NULL,
137
+ FOREIGN KEY (skill_id) REFERENCES skills(id) ON DELETE CASCADE
138
+ );
139
+
140
+ CREATE TABLE IF NOT EXISTS causal_edges (
141
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
142
+ ts INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
143
+ from_memory_id INTEGER NOT NULL,
144
+ from_memory_type TEXT NOT NULL,
145
+ to_memory_id INTEGER NOT NULL,
146
+ to_memory_type TEXT NOT NULL,
147
+ similarity REAL,
148
+ uplift REAL,
149
+ confidence REAL,
150
+ sample_size INTEGER,
151
+ metadata TEXT
152
+ );
153
+
154
+ CREATE INDEX IF NOT EXISTS idx_causal_from ON causal_edges(from_memory_id, from_memory_type);
155
+ CREATE INDEX IF NOT EXISTS idx_causal_to ON causal_edges(to_memory_id, to_memory_type);
156
+ `);
157
+ }
158
+ /**
159
+ * Synchronous accessor for the database handle. Throws if init hasn't run —
160
+ * call `ensureInitialized()` first. Provided for compatibility with
161
+ * controllers that take a `Database` instance in their constructor.
162
+ */
163
+ getDatabase() {
164
+ if (!this.db) {
165
+ throw new Error('SharedMemoryPool: database not initialised. Call ensureInitialized() first.');
166
+ }
167
+ return this.db;
168
+ }
169
+ /**
170
+ * Synchronous accessor for the embedder. Throws if init hasn't run.
171
+ */
172
+ getEmbedder() {
173
+ if (!this.embedder) {
174
+ throw new Error('SharedMemoryPool: embedder not initialised. Call ensureInitialized() first.');
175
+ }
176
+ return this.embedder;
177
+ }
178
+ /**
179
+ * Cache a query result with a TTL (milliseconds). Keys are arbitrary
180
+ * strings; consumers (HybridReasoningBank) typically encode the query
181
+ * shape into the key.
182
+ */
183
+ cacheQuery(key, value, ttlMs) {
184
+ if (!key || ttlMs <= 0)
185
+ return;
186
+ this.cache.set(key, {
187
+ value: value,
188
+ expiresAt: Date.now() + ttlMs,
189
+ });
190
+ }
191
+ /**
192
+ * Read a cached query result. Returns the cached value if present and not
193
+ * expired; lazily evicts expired entries on lookup.
194
+ *
195
+ * The default `T` is `any` for ergonomic interop with the existing
196
+ * HybridReasoningBank call sites that expect a loose return type.
197
+ * Pass an explicit type parameter (`getCachedQuery<MyShape>(...)`) when
198
+ * you want stricter typing.
199
+ */
200
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
201
+ getCachedQuery(key) {
202
+ const entry = this.cache.get(key);
203
+ if (!entry) {
204
+ this.cacheStats.misses++;
205
+ return undefined;
206
+ }
207
+ if (entry.expiresAt < Date.now()) {
208
+ this.cache.delete(key);
209
+ this.cacheStats.evictions++;
210
+ this.cacheStats.misses++;
211
+ return undefined;
212
+ }
213
+ this.cacheStats.hits++;
214
+ return entry.value;
215
+ }
216
+ /** Drop all cached query results. */
217
+ invalidateCache() {
218
+ this.cacheStats.evictions += this.cache.size;
219
+ this.cache.clear();
220
+ }
221
+ /** Diagnostic stats for telemetry / health endpoints. */
222
+ getStats() {
223
+ return {
224
+ initialized: this.db !== null && this.embedder !== null,
225
+ dbPath: this.options.dbPath,
226
+ embeddingModel: this.options.embeddingModel,
227
+ embeddingDimension: this.options.embeddingDimension,
228
+ cache: {
229
+ entries: this.cache.size,
230
+ hits: this.cacheStats.hits,
231
+ misses: this.cacheStats.misses,
232
+ evictions: this.cacheStats.evictions,
233
+ },
234
+ };
235
+ }
236
+ /** Close the underlying database handle and clear cached state. */
237
+ close() {
238
+ try {
239
+ this.db?.close?.();
240
+ }
241
+ catch {
242
+ /* swallow — closing twice is benign */
243
+ }
244
+ this.db = null;
245
+ this.embedder = null;
246
+ this.initPromise = null;
247
+ this.cache.clear();
248
+ this.cacheStats = { hits: 0, misses: 0, evictions: 0 };
249
+ }
250
+ }
251
+ async function loadBetterSqlite3() {
252
+ // better-sqlite3 is a heavy native module; load it lazily so the rest of the
253
+ // package can be imported even when this optional dep is unavailable.
254
+ try {
255
+ const mod = await import('better-sqlite3');
256
+ return mod.default ?? mod;
257
+ }
258
+ catch (err) {
259
+ throw new Error(`SharedMemoryPool requires 'better-sqlite3' but it could not be loaded: ${err?.message || err}. ` +
260
+ `Install it with: npm install better-sqlite3`);
261
+ }
262
+ }
263
+ //# sourceMappingURL=SharedMemoryPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SharedMemoryPool.js","sourceRoot":"","sources":["../../src/memory/SharedMemoryPool.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * SharedMemoryPool — singleton resource pool that backs HybridReasoningBank\n * and AdvancedMemorySystem.\n *\n * Centralises a single SQLite database handle (better-sqlite3) and a single\n * `EmbeddingService` instance so multiple memory consumers share the same\n * underlying tables / embedding cache without conflicting writes.\n *\n * The pool is constructed lazily on first `getInstance()` call. All heavy\n * resources (sqlite handle, embedder pipeline) are created on demand inside\n * `ensureInitialized()` so simply importing this module is side-effect free.\n *\n * Used by:\n * - reasoningbank/HybridBackend.ts (HybridReasoningBank)\n * - reasoningbank/AdvancedMemory.ts (AdvancedMemorySystem)\n *\n * Fixes issue #102 — this file was previously imported but missing on disk,\n * which broke `import 'agentic-flow'` at the top level.\n */\n\nimport { mkdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { EmbeddingService } from 'agentdb';\n\ntype DatabaseHandle = any;\ntype EmbedderHandle = EmbeddingService;\n\nexport interface SharedMemoryPoolOptions {\n /** SQLite database path. Defaults to `~/.agentic-flow/reasoningbank.db`. */\n dbPath?: string;\n /** Embedding model id. Defaults to `Xenova/all-MiniLM-L6-v2`. */\n embeddingModel?: string;\n /** Embedding vector dimension. Defaults to 384 (MiniLM-L6). */\n embeddingDimension?: number;\n /** Embedding provider. Defaults to `'transformers'`. */\n embeddingProvider?: 'transformers' | 'openai' | 'local';\n}\n\nconst DEFAULT_OPTIONS: Required<SharedMemoryPoolOptions> = {\n dbPath: join(homedir(), '.agentic-flow', 'reasoningbank.db'),\n embeddingModel: 'Xenova/all-MiniLM-L6-v2',\n embeddingDimension: 384,\n embeddingProvider: 'transformers',\n};\n\ninterface CacheEntry<T> {\n value: T;\n expiresAt: number;\n}\n\nexport interface SharedMemoryPoolStats {\n initialized: boolean;\n dbPath: string;\n embeddingModel: string;\n embeddingDimension: number;\n cache: {\n entries: number;\n hits: number;\n misses: number;\n evictions: number;\n };\n}\n\nexport class SharedMemoryPool {\n private static _instance: SharedMemoryPool | null = null;\n\n private readonly options: Required<SharedMemoryPoolOptions>;\n private db: DatabaseHandle | null = null;\n private embedder: EmbedderHandle | null = null;\n private initPromise: Promise<void> | null = null;\n\n // Lightweight in-process query cache used by HybridReasoningBank to avoid\n // re-running the same retrieval across consumers in one session.\n private cache = new Map<string, CacheEntry<unknown>>();\n private cacheStats = { hits: 0, misses: 0, evictions: 0 };\n\n private constructor(options: SharedMemoryPoolOptions = {}) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n /**\n * Singleton accessor. The first caller wins for option overrides; later\n * callers always get the existing pool. To reconfigure, call `reset()`.\n */\n static getInstance(options?: SharedMemoryPoolOptions): SharedMemoryPool {\n if (!SharedMemoryPool._instance) {\n SharedMemoryPool._instance = new SharedMemoryPool(options);\n }\n return SharedMemoryPool._instance;\n }\n\n /** Tear down the singleton — primarily for tests. */\n static reset(): void {\n if (SharedMemoryPool._instance) {\n SharedMemoryPool._instance.close();\n }\n SharedMemoryPool._instance = null;\n }\n\n /**\n * Idempotently ensure the database and embedder are ready. Subsequent calls\n * return the same in-flight promise so concurrent consumers share init.\n */\n async ensureInitialized(): Promise<void> {\n if (this.db && this.embedder) return;\n if (!this.initPromise) {\n this.initPromise = this.initialize();\n }\n return this.initPromise;\n }\n\n private async initialize(): Promise<void> {\n // Dynamic import keeps node:fs, better-sqlite3, and the embedding pipeline\n // out of the import graph for callers that never use them.\n const Database = await loadBetterSqlite3();\n\n mkdirSync(dirname(this.options.dbPath), { recursive: true });\n this.db = new Database(this.options.dbPath);\n // Reasonable defaults for an embedded reasoning database.\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.db.pragma('synchronous = NORMAL');\n\n this.applySchema(this.db);\n\n this.embedder = new EmbeddingService({\n model: this.options.embeddingModel,\n dimension: this.options.embeddingDimension,\n provider: this.options.embeddingProvider,\n });\n await this.embedder.initialize();\n }\n\n /** Apply the minimum schema that ReflexionMemory / SkillLibrary require. */\n private applySchema(db: DatabaseHandle): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS episodes (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n ts INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\n session_id TEXT NOT NULL,\n task TEXT NOT NULL,\n input TEXT,\n output TEXT,\n critique TEXT,\n reward REAL NOT NULL,\n success INTEGER NOT NULL,\n latency_ms INTEGER,\n tokens_used INTEGER,\n tags TEXT,\n metadata TEXT\n );\n\n CREATE TABLE IF NOT EXISTS episode_embeddings (\n episode_id INTEGER PRIMARY KEY,\n embedding BLOB NOT NULL,\n FOREIGN KEY (episode_id) REFERENCES episodes(id) ON DELETE CASCADE\n );\n\n CREATE INDEX IF NOT EXISTS idx_episodes_task ON episodes(task);\n CREATE INDEX IF NOT EXISTS idx_episodes_ts ON episodes(ts);\n CREATE INDEX IF NOT EXISTS idx_episodes_success ON episodes(success);\n\n CREATE TABLE IF NOT EXISTS skills (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n ts INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\n name TEXT NOT NULL,\n description TEXT,\n precondition TEXT,\n action TEXT,\n outcome TEXT,\n success_rate REAL,\n uses INTEGER DEFAULT 0,\n tags TEXT,\n metadata TEXT,\n UNIQUE(name)\n );\n\n CREATE TABLE IF NOT EXISTS skill_embeddings (\n skill_id INTEGER PRIMARY KEY,\n embedding BLOB NOT NULL,\n FOREIGN KEY (skill_id) REFERENCES skills(id) ON DELETE CASCADE\n );\n\n CREATE TABLE IF NOT EXISTS causal_edges (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n ts INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),\n from_memory_id INTEGER NOT NULL,\n from_memory_type TEXT NOT NULL,\n to_memory_id INTEGER NOT NULL,\n to_memory_type TEXT NOT NULL,\n similarity REAL,\n uplift REAL,\n confidence REAL,\n sample_size INTEGER,\n metadata TEXT\n );\n\n CREATE INDEX IF NOT EXISTS idx_causal_from ON causal_edges(from_memory_id, from_memory_type);\n CREATE INDEX IF NOT EXISTS idx_causal_to ON causal_edges(to_memory_id, to_memory_type);\n `);\n }\n\n /**\n * Synchronous accessor for the database handle. Throws if init hasn't run —\n * call `ensureInitialized()` first. Provided for compatibility with\n * controllers that take a `Database` instance in their constructor.\n */\n getDatabase(): DatabaseHandle {\n if (!this.db) {\n throw new Error(\n 'SharedMemoryPool: database not initialised. Call ensureInitialized() first.'\n );\n }\n return this.db;\n }\n\n /**\n * Synchronous accessor for the embedder. Throws if init hasn't run.\n */\n getEmbedder(): EmbedderHandle {\n if (!this.embedder) {\n throw new Error(\n 'SharedMemoryPool: embedder not initialised. Call ensureInitialized() first.'\n );\n }\n return this.embedder;\n }\n\n /**\n * Cache a query result with a TTL (milliseconds). Keys are arbitrary\n * strings; consumers (HybridReasoningBank) typically encode the query\n * shape into the key.\n */\n cacheQuery<T>(key: string, value: T, ttlMs: number): void {\n if (!key || ttlMs <= 0) return;\n this.cache.set(key, {\n value: value as unknown,\n expiresAt: Date.now() + ttlMs,\n });\n }\n\n /**\n * Read a cached query result. Returns the cached value if present and not\n * expired; lazily evicts expired entries on lookup.\n *\n * The default `T` is `any` for ergonomic interop with the existing\n * HybridReasoningBank call sites that expect a loose return type.\n * Pass an explicit type parameter (`getCachedQuery<MyShape>(...)`) when\n * you want stricter typing.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getCachedQuery<T = any>(key: string): T | undefined {\n const entry = this.cache.get(key);\n if (!entry) {\n this.cacheStats.misses++;\n return undefined;\n }\n if (entry.expiresAt < Date.now()) {\n this.cache.delete(key);\n this.cacheStats.evictions++;\n this.cacheStats.misses++;\n return undefined;\n }\n this.cacheStats.hits++;\n return entry.value as T;\n }\n\n /** Drop all cached query results. */\n invalidateCache(): void {\n this.cacheStats.evictions += this.cache.size;\n this.cache.clear();\n }\n\n /** Diagnostic stats for telemetry / health endpoints. */\n getStats(): SharedMemoryPoolStats {\n return {\n initialized: this.db !== null && this.embedder !== null,\n dbPath: this.options.dbPath,\n embeddingModel: this.options.embeddingModel,\n embeddingDimension: this.options.embeddingDimension,\n cache: {\n entries: this.cache.size,\n hits: this.cacheStats.hits,\n misses: this.cacheStats.misses,\n evictions: this.cacheStats.evictions,\n },\n };\n }\n\n /** Close the underlying database handle and clear cached state. */\n close(): void {\n try {\n this.db?.close?.();\n } catch {\n /* swallow — closing twice is benign */\n }\n this.db = null;\n this.embedder = null;\n this.initPromise = null;\n this.cache.clear();\n this.cacheStats = { hits: 0, misses: 0, evictions: 0 };\n }\n}\n\nasync function loadBetterSqlite3(): Promise<any> {\n // better-sqlite3 is a heavy native module; load it lazily so the rest of the\n // package can be imported even when this optional dep is unavailable.\n try {\n const mod: any = await import('better-sqlite3');\n return mod.default ?? mod;\n } catch (err: any) {\n throw new Error(\n `SharedMemoryPool requires 'better-sqlite3' but it could not be loaded: ${err?.message || err}. ` +\n `Install it with: npm install better-sqlite3`\n );\n }\n}\n"]}
@@ -38,9 +38,9 @@ interface EditResult {
38
38
  export declare class AgentBoosterMigration {
39
39
  private config;
40
40
  private boosterEngine;
41
+ private boosterEnginePromise;
41
42
  private stats;
42
43
  constructor(config?: Partial<AgentBoosterConfig>);
43
- private ensureEngine;
44
44
  /**
45
45
  * Perform code edit using Agent Booster
46
46
  */
@@ -52,6 +52,7 @@ export declare class AgentBoosterMigration {
52
52
  /**
53
53
  * Edit using Agent Booster (352x faster)
54
54
  */
55
+ private getBoosterEngine;
55
56
  private editWithAgentBooster;
56
57
  /**
57
58
  * Traditional code edit (slow - 352ms average)
@@ -1 +1 @@
1
- {"version":3,"file":"agent-booster-migration.d.ts","sourceRoot":"","sources":["../../src/optimizations/agent-booster-migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkBH,UAAU,kBAAkB;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE;QACX,mBAAmB,EAAE,MAAM,CAAC;QAC5B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,UAAU,QAAQ;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,eAAe,GAAG,aAAa,GAAG,UAAU,CAAC;IACrD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,KAAK,CAMX;gBAEU,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;YA2BtC,YAAY;IAW1B;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;IAcnD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;YACW,oBAAoB;IA0ClC;;OAEG;YACW,eAAe;IAyB7B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,QAAQ;;;;oBA9LM,MAAM;sBACJ,MAAM;0BACF,MAAM;wBACR,MAAM;qBACT,MAAM;;IA2MrB;;OAEG;IACH,cAAc,IAAI,MAAM;IAqCxB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IASzD;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAChD,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,uBAAuB,EAAE,MAAM,CAAC;KACjC,CAAC;CAWH;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,uBAA8B,CAAC;AAEjE;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAOrB;AAED;;GAEG;AACH,wBAAsB,YAAY,kBAuDjC"}
1
+ {"version":3,"file":"agent-booster-migration.d.ts","sourceRoot":"","sources":["../../src/optimizations/agent-booster-migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmCH,UAAU,kBAAkB;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,EAAE;QACX,mBAAmB,EAAE,MAAM,CAAC;QAC5B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,UAAU,QAAQ;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,eAAe,GAAG,aAAa,GAAG,UAAU,CAAC;IACrD,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,oBAAoB,CAA4C;IACxE,OAAO,CAAC,KAAK,CAMX;gBAEU,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IA6CpD;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;IAcnD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;YACW,gBAAgB;YAahB,oBAAoB;IA8ClC;;OAEG;YACW,eAAe;IAyB7B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,QAAQ;;;;oBAtNM,MAAM;sBACJ,MAAM;0BACF,MAAM;wBACR,MAAM;qBACT,MAAM;;IAsOrB;;OAEG;IACH,cAAc,IAAI,MAAM;IAqCxB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAOzD;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAChD,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,uBAAuB,EAAE,MAAM,CAAC;KACjC,CAAC;CAWH;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,uBAA8B,CAAC;AAEjE;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAOrB;AAED;;GAEG;AACH,wBAAsB,YAAY,kBAuDjC"}
@@ -9,19 +9,19 @@
9
9
  * Impact: All code editing operations
10
10
  */
11
11
  import { writeFileSync } from 'fs';
12
- // Optional: Agent Booster for local code editing (lazy loaded)
13
- let AgentBoosterEngine = null;
14
- async function getAgentBoosterEngine() {
15
- if (AgentBoosterEngine)
16
- return AgentBoosterEngine;
17
- try {
18
- const mod = await import('agent-booster');
19
- AgentBoosterEngine = mod.AgentBooster;
20
- return AgentBoosterEngine;
21
- }
22
- catch {
23
- return null;
12
+ let _AgentBoosterCtor = null;
13
+ async function loadAgentBoosterCtor() {
14
+ if (_AgentBoosterCtor)
15
+ return _AgentBoosterCtor;
16
+ const mod = await import('agent-booster').catch((err) => {
17
+ throw new Error(`Optional package 'agent-booster' is not installed: ${err?.message || err}. ` +
18
+ `Run: npm install agent-booster`);
19
+ });
20
+ _AgentBoosterCtor = mod.AgentBooster ?? mod.default?.AgentBooster ?? mod.default;
21
+ if (!_AgentBoosterCtor) {
22
+ throw new Error("'agent-booster' loaded but does not export AgentBooster");
24
23
  }
24
+ return _AgentBoosterCtor;
25
25
  }
26
26
  /**
27
27
  * Agent Booster Migration Class
@@ -29,6 +29,7 @@ async function getAgentBoosterEngine() {
29
29
  export class AgentBoosterMigration {
30
30
  config;
31
31
  boosterEngine = null;
32
+ boosterEnginePromise = null;
32
33
  stats;
33
34
  constructor(config = {}) {
34
35
  this.config = {
@@ -37,36 +38,42 @@ export class AgentBoosterMigration {
37
38
  fallback: true,
38
39
  maxFileSize: 10 * 1024 * 1024, // 10MB
39
40
  supportedLanguages: [
40
- 'typescript', 'javascript', 'python', 'java', 'cpp', 'c',
41
- 'rust', 'go', 'ruby', 'php', 'swift', 'kotlin', 'scala',
42
- 'haskell', 'elixir', 'clojure', 'r', 'julia', 'dart'
41
+ 'typescript',
42
+ 'javascript',
43
+ 'python',
44
+ 'java',
45
+ 'cpp',
46
+ 'c',
47
+ 'rust',
48
+ 'go',
49
+ 'ruby',
50
+ 'php',
51
+ 'swift',
52
+ 'kotlin',
53
+ 'scala',
54
+ 'haskell',
55
+ 'elixir',
56
+ 'clojure',
57
+ 'r',
58
+ 'julia',
59
+ 'dart',
43
60
  ],
44
61
  performance: {
45
62
  targetSpeedupFactor: 352,
46
- maxLatencyMs: 1
63
+ maxLatencyMs: 1,
47
64
  },
48
- ...config
65
+ ...config,
49
66
  };
67
+ // Defer Agent Booster engine initialization until first use so the
68
+ // optional dependency can be loaded lazily.
50
69
  this.stats = {
51
70
  totalEdits: 0,
52
71
  boosterEdits: 0,
53
72
  traditionalEdits: 0,
54
73
  totalSavingsMs: 0,
55
- costSavings: 0
74
+ costSavings: 0,
56
75
  };
57
76
  }
58
- async ensureEngine() {
59
- if (this.boosterEngine)
60
- return true;
61
- const Engine = await getAgentBoosterEngine();
62
- if (!Engine)
63
- return false;
64
- this.boosterEngine = new Engine({
65
- confidenceThreshold: 0.5,
66
- maxChunks: 100
67
- });
68
- return true;
69
- }
70
77
  /**
71
78
  * Perform code edit using Agent Booster
72
79
  */
@@ -104,14 +111,31 @@ export class AgentBoosterMigration {
104
111
  /**
105
112
  * Edit using Agent Booster (352x faster)
106
113
  */
114
+ async getBoosterEngine() {
115
+ if (this.boosterEngine)
116
+ return this.boosterEngine;
117
+ if (!this.boosterEnginePromise) {
118
+ this.boosterEnginePromise = (async () => {
119
+ const Ctor = await loadAgentBoosterCtor();
120
+ const engine = new Ctor({ confidenceThreshold: 0.5, maxChunks: 100 });
121
+ this.boosterEngine = engine;
122
+ return engine;
123
+ })();
124
+ }
125
+ return this.boosterEnginePromise;
126
+ }
107
127
  async editWithAgentBooster(edit, startTime) {
108
128
  try {
109
129
  const bytesProcessed = Buffer.byteLength(edit.newContent, 'utf8');
110
- // Call REAL Agent Booster WASM engine
111
- const result = await this.boosterEngine.apply({
130
+ // Call REAL Agent Booster WASM engine - use any for flexible signature
131
+ const engine = await this.getBoosterEngine();
132
+ const result = await engine.apply({
112
133
  code: edit.oldContent,
113
134
  edit: edit.newContent,
114
- language: edit.language
135
+ language: edit.language,
136
+ target_filepath: edit.filePath || '',
137
+ instructions: edit.newContent,
138
+ code_edit: edit.newContent,
115
139
  });
116
140
  // Write the edit if successful
117
141
  if (result.success && edit.filePath) {
@@ -122,14 +146,14 @@ export class AgentBoosterMigration {
122
146
  const speedupFactor = traditionalTime / executionTimeMs;
123
147
  // Update stats
124
148
  this.stats.boosterEdits++;
125
- this.stats.totalSavingsMs += (traditionalTime - executionTimeMs);
149
+ this.stats.totalSavingsMs += traditionalTime - executionTimeMs;
126
150
  this.stats.costSavings += this.calculateCostSavings(traditionalTime, executionTimeMs);
127
151
  return {
128
152
  success: result.success,
129
153
  executionTimeMs,
130
154
  speedupFactor,
131
155
  method: 'agent-booster',
132
- bytesProcessed
156
+ bytesProcessed,
133
157
  };
134
158
  }
135
159
  catch (error) {
@@ -160,7 +184,7 @@ export class AgentBoosterMigration {
160
184
  executionTimeMs,
161
185
  speedupFactor: 1,
162
186
  method: 'traditional',
163
- bytesProcessed
187
+ bytesProcessed,
164
188
  };
165
189
  }
166
190
  /**
@@ -204,7 +228,7 @@ export class AgentBoosterMigration {
204
228
  ...this.stats,
205
229
  avgSpeedupFactor,
206
230
  monthlySavings: monthlySavings.toFixed(2),
207
- boosterAdoptionRate: ((this.stats.boosterEdits / this.stats.totalEdits) * 100).toFixed(1) + '%'
231
+ boosterAdoptionRate: ((this.stats.boosterEdits / this.stats.totalEdits) * 100).toFixed(1) + '%',
208
232
  };
209
233
  }
210
234
  /**
@@ -249,14 +273,14 @@ export class AgentBoosterMigration {
249
273
  * Sleep helper
250
274
  */
251
275
  sleep(ms) {
252
- return new Promise(resolve => setTimeout(resolve, ms));
276
+ return new Promise((resolve) => setTimeout(resolve, ms));
253
277
  }
254
278
  /**
255
279
  * Batch edit multiple files
256
280
  */
257
281
  async batchEdit(edits) {
258
282
  // Process edits in parallel for maximum performance
259
- const results = await Promise.all(edits.map(edit => this.editCode(edit)));
283
+ const results = await Promise.all(edits.map((edit) => this.editCode(edit)));
260
284
  return results;
261
285
  }
262
286
  /**
@@ -269,7 +293,7 @@ export class AgentBoosterMigration {
269
293
  return {
270
294
  filesProcessed: 1000,
271
295
  totalSpeedup: 352,
272
- estimatedMonthlySavings: 240
296
+ estimatedMonthlySavings: 240,
273
297
  };
274
298
  }
275
299
  }
@@ -285,7 +309,7 @@ export async function editCode(filePath, oldContent, newContent, language) {
285
309
  filePath,
286
310
  oldContent,
287
311
  newContent,
288
- language
312
+ language,
289
313
  });
290
314
  }
291
315
  /**
@@ -306,20 +330,20 @@ export async function exampleUsage() {
306
330
  filePath: '/tmp/file1.ts',
307
331
  oldContent: 'old1',
308
332
  newContent: 'new1',
309
- language: 'typescript'
333
+ language: 'typescript',
310
334
  },
311
335
  {
312
336
  filePath: '/tmp/file2.js',
313
337
  oldContent: 'old2',
314
338
  newContent: 'new2',
315
- language: 'javascript'
339
+ language: 'javascript',
316
340
  },
317
341
  {
318
342
  filePath: '/tmp/file3.py',
319
343
  oldContent: 'old3',
320
344
  newContent: 'new3',
321
- language: 'python'
322
- }
345
+ language: 'python',
346
+ },
323
347
  ];
324
348
  const batchResults = await agentBoosterMigration.batchEdit(batchEdits);
325
349
  console.log(`Batch Edit Results: ${batchResults.length} files processed`);