kynjal-cli 3.1.3 → 4.0.0

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 (566) hide show
  1. package/.claude/agents/core/coder.md +1 -1
  2. package/.claude/agents/core/planner.md +2 -2
  3. package/.claude/agents/core/researcher.md +1 -1
  4. package/.claude/agents/core/reviewer.md +1 -1
  5. package/.claude/agents/core/tester.md +1 -1
  6. package/.claude/agents/data/data-ml-model.md +4 -4
  7. package/.claude/agents/development/dev-backend-api.md +4 -4
  8. package/.claude/agents/documentation/docs-api-openapi.md +4 -4
  9. package/.claude/agents/github/code-review-swarm.md +2 -2
  10. package/.claude/agents/github/issue-tracker.md +2 -2
  11. package/.claude/agents/github/pr-manager.md +2 -2
  12. package/.claude/agents/github/release-manager.md +2 -2
  13. package/.claude/agents/github/workflow-automation.md +2 -2
  14. package/.claude/agents/sparc/architecture.md +3 -3
  15. package/.claude/agents/sparc/pseudocode.md +2 -2
  16. package/.claude/agents/sparc/refinement.md +3 -3
  17. package/.claude/agents/sparc/specification.md +2 -2
  18. package/.claude/agents/swarm/adaptive-coordinator.md +1 -1
  19. package/.claude/agents/swarm/hierarchical-coordinator.md +1 -1
  20. package/.claude/agents/swarm/mesh-coordinator.md +1 -1
  21. package/.claude/agents/templates/base-template-generator.md +25 -4
  22. package/.claude/agents/templates/sparc-coordinator.md +3 -3
  23. package/.claude/helpers/auto-commit.sh +1 -1
  24. package/.claude/helpers/auto-memory-hook.mjs +27 -9
  25. package/.claude/helpers/hook-handler.cjs +58 -18
  26. package/.claude/helpers/statusline.cjs +14 -33
  27. package/.claude/helpers/statusline.js +3 -3
  28. package/.claude/settings.json +9 -9
  29. package/.claude/skills/reasoningbank-intelligence/SKILL.md +2 -2
  30. package/.claude/skills/swarm-orchestration/SKILL.md +1 -1
  31. package/README.md +383 -170
  32. package/bin/cli.js +6 -6
  33. package/bin/mcp-server.js +1 -1
  34. package/bin/preinstall.cjs +2 -0
  35. package/dist/src/appliance/gguf-engine.js +664 -0
  36. package/dist/src/appliance/gguf-engine.js.map +1 -0
  37. package/dist/src/appliance/ruvllm-bridge.js +492 -0
  38. package/dist/src/appliance/ruvllm-bridge.js.map +1 -0
  39. package/dist/src/appliance/rvfa-builder.js +383 -0
  40. package/dist/src/appliance/rvfa-builder.js.map +1 -0
  41. package/dist/src/appliance/rvfa-distribution.js +533 -0
  42. package/dist/src/appliance/rvfa-distribution.js.map +1 -0
  43. package/dist/src/appliance/rvfa-format.js +465 -0
  44. package/dist/src/appliance/rvfa-format.js.map +1 -0
  45. package/dist/src/appliance/rvfa-runner.js +373 -0
  46. package/dist/src/appliance/rvfa-runner.js.map +1 -0
  47. package/dist/src/appliance/rvfa-signing.js +469 -0
  48. package/dist/src/appliance/rvfa-signing.js.map +1 -0
  49. package/dist/src/benchmarks/pretrain/index.js +542 -331
  50. package/dist/src/benchmarks/pretrain/index.js.map +1 -1
  51. package/dist/src/commands/agent.d.ts.map +1 -1
  52. package/dist/src/commands/agent.js +725 -502
  53. package/dist/src/commands/agent.js.map +1 -1
  54. package/dist/src/commands/analyze.js +1548 -1218
  55. package/dist/src/commands/analyze.js.map +1 -1
  56. package/dist/src/commands/appliance-advanced.d.ts +9 -0
  57. package/dist/src/commands/appliance-advanced.d.ts.map +1 -0
  58. package/dist/src/commands/appliance-advanced.js +324 -0
  59. package/dist/src/commands/appliance-advanced.js.map +1 -0
  60. package/dist/src/commands/appliance.d.ts +8 -0
  61. package/dist/src/commands/appliance.d.ts.map +1 -0
  62. package/dist/src/commands/appliance.js +581 -0
  63. package/dist/src/commands/appliance.js.map +1 -0
  64. package/dist/src/commands/benchmark.js +523 -372
  65. package/dist/src/commands/benchmark.js.map +1 -1
  66. package/dist/src/commands/claims.js +364 -274
  67. package/dist/src/commands/claims.js.map +1 -1
  68. package/dist/src/commands/cleanup.d.ts +13 -0
  69. package/dist/src/commands/cleanup.d.ts.map +1 -0
  70. package/dist/src/commands/cleanup.js +262 -0
  71. package/dist/src/commands/cleanup.js.map +1 -0
  72. package/dist/src/commands/completions.js +118 -477
  73. package/dist/src/commands/completions.js.map +1 -1
  74. package/dist/src/commands/config.js +303 -237
  75. package/dist/src/commands/config.js.map +1 -1
  76. package/dist/src/commands/daemon.d.ts.map +1 -1
  77. package/dist/src/commands/daemon.js +597 -425
  78. package/dist/src/commands/daemon.js.map +1 -1
  79. package/dist/src/commands/deployment.js +275 -194
  80. package/dist/src/commands/deployment.js.map +1 -1
  81. package/dist/src/commands/doctor.d.ts.map +1 -1
  82. package/dist/src/commands/doctor.js +690 -460
  83. package/dist/src/commands/doctor.js.map +1 -1
  84. package/dist/src/commands/embeddings.js +1543 -1293
  85. package/dist/src/commands/embeddings.js.map +1 -1
  86. package/dist/src/commands/guidance.js +596 -449
  87. package/dist/src/commands/guidance.js.map +1 -1
  88. package/dist/src/commands/hive-mind.js +938 -854
  89. package/dist/src/commands/hive-mind.js.map +1 -1
  90. package/dist/src/commands/hooks.d.ts.map +1 -1
  91. package/dist/src/commands/hooks.js +3677 -2570
  92. package/dist/src/commands/hooks.js.map +1 -1
  93. package/dist/src/commands/index.js +322 -122
  94. package/dist/src/commands/index.js.map +1 -1
  95. package/dist/src/commands/init.d.ts +1 -1
  96. package/dist/src/commands/init.d.ts.map +1 -1
  97. package/dist/src/commands/init.js +943 -787
  98. package/dist/src/commands/init.js.map +1 -1
  99. package/dist/src/commands/issues.js +558 -383
  100. package/dist/src/commands/issues.js.map +1 -1
  101. package/dist/src/commands/mcp.d.ts.map +1 -1
  102. package/dist/src/commands/mcp.js +605 -475
  103. package/dist/src/commands/mcp.js.map +1 -1
  104. package/dist/src/commands/memory.d.ts.map +1 -1
  105. package/dist/src/commands/memory.js +1031 -814
  106. package/dist/src/commands/memory.js.map +1 -1
  107. package/dist/src/commands/migrate.js +347 -282
  108. package/dist/src/commands/migrate.js.map +1 -1
  109. package/dist/src/commands/neural.d.ts.map +1 -1
  110. package/dist/src/commands/neural.js +1563 -1283
  111. package/dist/src/commands/neural.js.map +1 -1
  112. package/dist/src/commands/performance.js +643 -497
  113. package/dist/src/commands/performance.js.map +1 -1
  114. package/dist/src/commands/plugins.js +841 -668
  115. package/dist/src/commands/plugins.js.map +1 -1
  116. package/dist/src/commands/process.js +447 -392
  117. package/dist/src/commands/process.js.map +1 -1
  118. package/dist/src/commands/progress.js +256 -162
  119. package/dist/src/commands/progress.js.map +1 -1
  120. package/dist/src/commands/providers.js +220 -150
  121. package/dist/src/commands/providers.js.map +1 -1
  122. package/dist/src/commands/route.js +665 -520
  123. package/dist/src/commands/route.js.map +1 -1
  124. package/dist/src/commands/ruvector/backup.js +651 -505
  125. package/dist/src/commands/ruvector/backup.js.map +1 -1
  126. package/dist/src/commands/ruvector/benchmark.js +401 -349
  127. package/dist/src/commands/ruvector/benchmark.js.map +1 -1
  128. package/dist/src/commands/ruvector/import.js +267 -225
  129. package/dist/src/commands/ruvector/import.js.map +1 -1
  130. package/dist/src/commands/ruvector/index.js +75 -37
  131. package/dist/src/commands/ruvector/index.js.map +1 -1
  132. package/dist/src/commands/ruvector/init.js +359 -336
  133. package/dist/src/commands/ruvector/init.js.map +1 -1
  134. package/dist/src/commands/ruvector/migrate.js +322 -335
  135. package/dist/src/commands/ruvector/migrate.js.map +1 -1
  136. package/dist/src/commands/ruvector/optimize.js +431 -375
  137. package/dist/src/commands/ruvector/optimize.js.map +1 -1
  138. package/dist/src/commands/ruvector/setup.js +117 -703
  139. package/dist/src/commands/ruvector/setup.js.map +1 -1
  140. package/dist/src/commands/ruvector/status.js +419 -364
  141. package/dist/src/commands/ruvector/status.js.map +1 -1
  142. package/dist/src/commands/security.d.ts.map +1 -1
  143. package/dist/src/commands/security.js +610 -456
  144. package/dist/src/commands/security.js.map +1 -1
  145. package/dist/src/commands/session.d.ts +1 -1
  146. package/dist/src/commands/session.js +627 -505
  147. package/dist/src/commands/session.js.map +1 -1
  148. package/dist/src/commands/start.d.ts +1 -1
  149. package/dist/src/commands/start.js +368 -271
  150. package/dist/src/commands/start.js.map +1 -1
  151. package/dist/src/commands/status.d.ts +1 -1
  152. package/dist/src/commands/status.d.ts.map +1 -1
  153. package/dist/src/commands/status.js +492 -379
  154. package/dist/src/commands/status.js.map +1 -1
  155. package/dist/src/commands/swarm.js +488 -408
  156. package/dist/src/commands/swarm.js.map +1 -1
  157. package/dist/src/commands/task.d.ts +1 -1
  158. package/dist/src/commands/task.js +539 -424
  159. package/dist/src/commands/task.js.map +1 -1
  160. package/dist/src/commands/transfer-store.js +412 -322
  161. package/dist/src/commands/transfer-store.js.map +1 -1
  162. package/dist/src/commands/update.js +291 -196
  163. package/dist/src/commands/update.js.map +1 -1
  164. package/dist/src/commands/workflow.js +486 -386
  165. package/dist/src/commands/workflow.js.map +1 -1
  166. package/dist/src/config-adapter.js +40 -39
  167. package/dist/src/config-adapter.js.map +1 -1
  168. package/dist/src/index.js +416 -312
  169. package/dist/src/index.js.map +1 -1
  170. package/dist/src/infrastructure/in-memory-repositories.js +507 -246
  171. package/dist/src/infrastructure/in-memory-repositories.js.map +1 -1
  172. package/dist/src/init/claudemd-generator.js +78 -368
  173. package/dist/src/init/claudemd-generator.js.map +1 -1
  174. package/dist/src/init/executor.js +1019 -1345
  175. package/dist/src/init/executor.js.map +1 -1
  176. package/dist/src/init/helpers-generator.js +60 -635
  177. package/dist/src/init/helpers-generator.js.map +1 -1
  178. package/dist/src/init/index.d.ts +1 -1
  179. package/dist/src/init/index.d.ts.map +1 -1
  180. package/dist/src/init/index.js +1 -1
  181. package/dist/src/init/index.js.map +1 -1
  182. package/dist/src/init/mcp-generator.d.ts +0 -1
  183. package/dist/src/init/mcp-generator.d.ts.map +1 -1
  184. package/dist/src/init/mcp-generator.js +62 -42
  185. package/dist/src/init/mcp-generator.js.map +1 -1
  186. package/dist/src/init/settings-generator.d.ts.map +1 -1
  187. package/dist/src/init/settings-generator.js +167 -100
  188. package/dist/src/init/settings-generator.js.map +1 -1
  189. package/dist/src/init/statusline-generator.d.ts +16 -8
  190. package/dist/src/init/statusline-generator.d.ts.map +1 -1
  191. package/dist/src/init/statusline-generator.js +20 -1300
  192. package/dist/src/init/statusline-generator.js.map +1 -1
  193. package/dist/src/init/types.d.ts +15 -5
  194. package/dist/src/init/types.d.ts.map +1 -1
  195. package/dist/src/init/types.js +66 -76
  196. package/dist/src/init/types.js.map +1 -1
  197. package/dist/src/mcp-client.js +130 -76
  198. package/dist/src/mcp-client.js.map +1 -1
  199. package/dist/src/mcp-server.js +758 -445
  200. package/dist/src/mcp-server.js.map +1 -1
  201. package/dist/src/mcp-tools/agent-tools.js +492 -391
  202. package/dist/src/mcp-tools/agent-tools.js.map +1 -1
  203. package/dist/src/mcp-tools/agentdb-tools.d.ts +30 -0
  204. package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -0
  205. package/dist/src/mcp-tools/agentdb-tools.js +758 -0
  206. package/dist/src/mcp-tools/agentdb-tools.js.map +1 -0
  207. package/dist/src/mcp-tools/analyze-tools.js +236 -172
  208. package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
  209. package/dist/src/mcp-tools/auto-install.js +142 -80
  210. package/dist/src/mcp-tools/auto-install.js.map +1 -1
  211. package/dist/src/mcp-tools/browser-tools.js +375 -252
  212. package/dist/src/mcp-tools/browser-tools.js.map +1 -1
  213. package/dist/src/mcp-tools/claims-tools.js +565 -473
  214. package/dist/src/mcp-tools/claims-tools.js.map +1 -1
  215. package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
  216. package/dist/src/mcp-tools/config-tools.js +284 -190
  217. package/dist/src/mcp-tools/config-tools.js.map +1 -1
  218. package/dist/src/mcp-tools/coordination-tools.d.ts.map +1 -1
  219. package/dist/src/mcp-tools/coordination-tools.js +600 -349
  220. package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
  221. package/dist/src/mcp-tools/daa-tools.js +367 -289
  222. package/dist/src/mcp-tools/daa-tools.js.map +1 -1
  223. package/dist/src/mcp-tools/embeddings-tools.js +693 -582
  224. package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
  225. package/dist/src/mcp-tools/github-tools.js +312 -261
  226. package/dist/src/mcp-tools/github-tools.js.map +1 -1
  227. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
  228. package/dist/src/mcp-tools/hive-mind-tools.js +718 -423
  229. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
  230. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  231. package/dist/src/mcp-tools/hooks-tools.js +2726 -1978
  232. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  233. package/dist/src/mcp-tools/index.d.ts +2 -0
  234. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  235. package/dist/src/mcp-tools/index.js +2 -0
  236. package/dist/src/mcp-tools/index.js.map +1 -1
  237. package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
  238. package/dist/src/mcp-tools/memory-tools.js +514 -329
  239. package/dist/src/mcp-tools/memory-tools.js.map +1 -1
  240. package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
  241. package/dist/src/mcp-tools/neural-tools.js +428 -326
  242. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  243. package/dist/src/mcp-tools/performance-tools.js +480 -420
  244. package/dist/src/mcp-tools/performance-tools.js.map +1 -1
  245. package/dist/src/mcp-tools/progress-tools.js +278 -204
  246. package/dist/src/mcp-tools/progress-tools.js.map +1 -1
  247. package/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
  248. package/dist/src/mcp-tools/ruvllm-tools.d.ts.map +1 -0
  249. package/dist/src/mcp-tools/ruvllm-tools.js +399 -0
  250. package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -0
  251. package/dist/src/mcp-tools/security-tools.js +429 -297
  252. package/dist/src/mcp-tools/security-tools.js.map +1 -1
  253. package/dist/src/mcp-tools/session-tools.js +234 -185
  254. package/dist/src/mcp-tools/session-tools.js.map +1 -1
  255. package/dist/src/mcp-tools/swarm-tools.d.ts +2 -1
  256. package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -1
  257. package/dist/src/mcp-tools/swarm-tools.js +303 -64
  258. package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
  259. package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
  260. package/dist/src/mcp-tools/system-tools.js +352 -200
  261. package/dist/src/mcp-tools/system-tools.js.map +1 -1
  262. package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
  263. package/dist/src/mcp-tools/task-tools.js +357 -189
  264. package/dist/src/mcp-tools/task-tools.js.map +1 -1
  265. package/dist/src/mcp-tools/terminal-tools.js +196 -148
  266. package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
  267. package/dist/src/mcp-tools/transfer-tools.js +333 -186
  268. package/dist/src/mcp-tools/transfer-tools.js.map +1 -1
  269. package/dist/src/mcp-tools/wasm-agent-tools.d.ts +9 -0
  270. package/dist/src/mcp-tools/wasm-agent-tools.d.ts.map +1 -0
  271. package/dist/src/mcp-tools/wasm-agent-tools.js +377 -0
  272. package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -0
  273. package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -1
  274. package/dist/src/mcp-tools/workflow-tools.js +471 -335
  275. package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
  276. package/dist/src/memory/ewc-consolidation.js +345 -173
  277. package/dist/src/memory/ewc-consolidation.js.map +1 -1
  278. package/dist/src/memory/intelligence.js +841 -359
  279. package/dist/src/memory/intelligence.js.map +1 -1
  280. package/dist/src/memory/memory-bridge.js +1964 -0
  281. package/dist/src/memory/memory-bridge.js.map +1 -0
  282. package/dist/src/memory/memory-initializer.js +1895 -1602
  283. package/dist/src/memory/memory-initializer.js.map +1 -1
  284. package/dist/src/memory/sona-optimizer.js +329 -199
  285. package/dist/src/memory/sona-optimizer.js.map +1 -1
  286. package/dist/src/output.d.ts +2 -2
  287. package/dist/src/output.d.ts.map +1 -1
  288. package/dist/src/output.js +273 -242
  289. package/dist/src/output.js.map +1 -1
  290. package/dist/src/parser.js +217 -124
  291. package/dist/src/parser.js.map +1 -1
  292. package/dist/src/plugins/manager.js +531 -278
  293. package/dist/src/plugins/manager.js.map +1 -1
  294. package/dist/src/plugins/store/discovery.js +362 -275
  295. package/dist/src/plugins/store/discovery.js.map +1 -1
  296. package/dist/src/plugins/store/index.js +105 -48
  297. package/dist/src/plugins/store/index.js.map +1 -1
  298. package/dist/src/plugins/store/search.js +107 -69
  299. package/dist/src/plugins/store/search.js.map +1 -1
  300. package/dist/src/plugins/tests/demo-plugin-store.js +160 -113
  301. package/dist/src/plugins/tests/demo-plugin-store.js.map +1 -1
  302. package/dist/src/plugins/tests/standalone-test.js +223 -172
  303. package/dist/src/plugins/tests/standalone-test.js.map +1 -1
  304. package/dist/src/plugins/tests/test-plugin-store.js +228 -190
  305. package/dist/src/plugins/tests/test-plugin-store.js.map +1 -1
  306. package/dist/src/production/circuit-breaker.js +126 -62
  307. package/dist/src/production/circuit-breaker.js.map +1 -1
  308. package/dist/src/production/error-handler.js +156 -86
  309. package/dist/src/production/error-handler.js.map +1 -1
  310. package/dist/src/production/monitoring.js +220 -139
  311. package/dist/src/production/monitoring.js.map +1 -1
  312. package/dist/src/production/rate-limiter.js +93 -74
  313. package/dist/src/production/rate-limiter.js.map +1 -1
  314. package/dist/src/production/retry.js +167 -75
  315. package/dist/src/production/retry.js.map +1 -1
  316. package/dist/src/prompt.js +560 -436
  317. package/dist/src/prompt.js.map +1 -1
  318. package/dist/src/runtime/headless.js +289 -200
  319. package/dist/src/runtime/headless.js.map +1 -1
  320. package/dist/src/ruvector/agent-wasm.js +511 -0
  321. package/dist/src/ruvector/agent-wasm.js.map +1 -0
  322. package/dist/src/ruvector/ast-analyzer.js +232 -145
  323. package/dist/src/ruvector/ast-analyzer.js.map +1 -1
  324. package/dist/src/ruvector/coverage-router.js +419 -287
  325. package/dist/src/ruvector/coverage-router.js.map +1 -1
  326. package/dist/src/ruvector/coverage-tools.js +101 -56
  327. package/dist/src/ruvector/coverage-tools.js.map +1 -1
  328. package/dist/src/ruvector/diff-classifier.js +451 -324
  329. package/dist/src/ruvector/diff-classifier.js.map +1 -1
  330. package/dist/src/ruvector/enhanced-model-router.js +337 -251
  331. package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
  332. package/dist/src/ruvector/flash-attention.js +254 -223
  333. package/dist/src/ruvector/flash-attention.js.map +1 -1
  334. package/dist/src/ruvector/graph-analyzer.js +680 -486
  335. package/dist/src/ruvector/graph-analyzer.js.map +1 -1
  336. package/dist/src/ruvector/index.js +113 -27
  337. package/dist/src/ruvector/index.js.map +1 -1
  338. package/dist/src/ruvector/lora-adapter.js +248 -155
  339. package/dist/src/ruvector/lora-adapter.js.map +1 -1
  340. package/dist/src/ruvector/model-router.js +248 -175
  341. package/dist/src/ruvector/model-router.js.map +1 -1
  342. package/dist/src/ruvector/moe-router.js +286 -228
  343. package/dist/src/ruvector/moe-router.js.map +1 -1
  344. package/dist/src/ruvector/q-learning-router.js +338 -257
  345. package/dist/src/ruvector/q-learning-router.js.map +1 -1
  346. package/dist/src/ruvector/ruvllm-wasm.js +527 -0
  347. package/dist/src/ruvector/ruvllm-wasm.js.map +1 -0
  348. package/dist/src/ruvector/semantic-router.js +67 -60
  349. package/dist/src/ruvector/semantic-router.js.map +1 -1
  350. package/dist/src/ruvector/vector-db.js +205 -119
  351. package/dist/src/ruvector/vector-db.js.map +1 -1
  352. package/dist/src/services/agentic-flow-bridge.js +168 -0
  353. package/dist/src/services/agentic-flow-bridge.js.map +1 -0
  354. package/dist/src/services/claim-service.js +940 -615
  355. package/dist/src/services/claim-service.js.map +1 -1
  356. package/dist/src/services/container-worker-pool.js +669 -399
  357. package/dist/src/services/container-worker-pool.js.map +1 -1
  358. package/dist/src/services/headless-worker-executor.js +467 -441
  359. package/dist/src/services/headless-worker-executor.js.map +1 -1
  360. package/dist/src/services/index.d.ts +5 -5
  361. package/dist/src/services/index.d.ts.map +1 -1
  362. package/dist/src/services/index.js +4 -4
  363. package/dist/src/services/index.js.map +1 -1
  364. package/dist/src/services/registry-api.js +201 -93
  365. package/dist/src/services/registry-api.js.map +1 -1
  366. package/dist/src/services/ruvector-training.js +414 -144
  367. package/dist/src/services/ruvector-training.js.map +1 -1
  368. package/dist/src/services/worker-daemon.js +928 -531
  369. package/dist/src/services/worker-daemon.js.map +1 -1
  370. package/dist/src/services/worker-queue.js +550 -331
  371. package/dist/src/services/worker-queue.js.map +1 -1
  372. package/dist/src/suggest.js +55 -45
  373. package/dist/src/suggest.js.map +1 -1
  374. package/dist/src/transfer/anonymization/index.js +37 -29
  375. package/dist/src/transfer/anonymization/index.js.map +1 -1
  376. package/dist/src/transfer/deploy-seraphine.d.ts +1 -1
  377. package/dist/src/transfer/deploy-seraphine.js +156 -129
  378. package/dist/src/transfer/deploy-seraphine.js.map +1 -1
  379. package/dist/src/transfer/export.js +142 -84
  380. package/dist/src/transfer/export.js.map +1 -1
  381. package/dist/src/transfer/index.d.ts +1 -1
  382. package/dist/src/transfer/index.d.ts.map +1 -1
  383. package/dist/src/transfer/index.js +2 -0
  384. package/dist/src/transfer/index.js.map +1 -1
  385. package/dist/src/transfer/ipfs/client.js +337 -179
  386. package/dist/src/transfer/ipfs/client.js.map +1 -1
  387. package/dist/src/transfer/ipfs/upload.js +434 -290
  388. package/dist/src/transfer/ipfs/upload.js.map +1 -1
  389. package/dist/src/transfer/models/seraphine.js +58 -58
  390. package/dist/src/transfer/models/seraphine.js.map +1 -1
  391. package/dist/src/transfer/serialization/cfp.js +37 -33
  392. package/dist/src/transfer/serialization/cfp.js.map +1 -1
  393. package/dist/src/transfer/storage/gcs.js +248 -139
  394. package/dist/src/transfer/storage/gcs.js.map +1 -1
  395. package/dist/src/transfer/store/discovery.js +353 -243
  396. package/dist/src/transfer/store/discovery.js.map +1 -1
  397. package/dist/src/transfer/store/download.js +365 -243
  398. package/dist/src/transfer/store/download.js.map +1 -1
  399. package/dist/src/transfer/store/index.js +130 -63
  400. package/dist/src/transfer/store/index.js.map +1 -1
  401. package/dist/src/transfer/store/publish.js +258 -184
  402. package/dist/src/transfer/store/publish.js.map +1 -1
  403. package/dist/src/transfer/store/registry.js +73 -51
  404. package/dist/src/transfer/store/registry.js.map +1 -1
  405. package/dist/src/transfer/store/search.js +96 -64
  406. package/dist/src/transfer/store/search.js.map +1 -1
  407. package/dist/src/transfer/store/tests/standalone-test.js +231 -174
  408. package/dist/src/transfer/store/tests/standalone-test.js.map +1 -1
  409. package/dist/src/transfer/test-seraphine.js +130 -95
  410. package/dist/src/transfer/test-seraphine.js.map +1 -1
  411. package/dist/src/transfer/tests/test-store.js +239 -194
  412. package/dist/src/transfer/tests/test-store.js.map +1 -1
  413. package/dist/src/types.js +56 -27
  414. package/dist/src/types.js.map +1 -1
  415. package/dist/src/update/checker.js +183 -106
  416. package/dist/src/update/checker.js.map +1 -1
  417. package/dist/src/update/executor.js +198 -135
  418. package/dist/src/update/executor.js.map +1 -1
  419. package/dist/src/update/index.js +85 -38
  420. package/dist/src/update/index.js.map +1 -1
  421. package/dist/src/update/rate-limiter.js +31 -19
  422. package/dist/src/update/rate-limiter.js.map +1 -1
  423. package/dist/src/update/validator.js +64 -38
  424. package/dist/src/update/validator.js.map +1 -1
  425. package/dist/tsconfig.tsbuildinfo +1 -1
  426. package/package.json +13 -10
  427. package/.claude/agents/custom/accessibility-auditor.yaml +0 -56
  428. package/.claude/agents/custom/design-architect.yaml +0 -48
  429. package/.claude/agents/custom/ui-developer.yaml +0 -46
  430. package/.claude/agents/custom/ux-researcher.yaml +0 -60
  431. package/dist/src/benchmarks/pretrain/index.d.ts +0 -58
  432. package/dist/src/benchmarks/pretrain/index.d.ts.map +0 -1
  433. package/dist/src/commands/index.d.ts +0 -108
  434. package/dist/src/commands/index.d.ts.map +0 -1
  435. package/dist/src/config-adapter.d.ts +0 -15
  436. package/dist/src/config-adapter.d.ts.map +0 -1
  437. package/dist/src/index.d.ts +0 -76
  438. package/dist/src/index.d.ts.map +0 -1
  439. package/dist/src/infrastructure/in-memory-repositories.d.ts +0 -68
  440. package/dist/src/infrastructure/in-memory-repositories.d.ts.map +0 -1
  441. package/dist/src/init/claudemd-generator.d.ts +0 -25
  442. package/dist/src/init/claudemd-generator.d.ts.map +0 -1
  443. package/dist/src/init/executor.d.ts +0 -41
  444. package/dist/src/init/executor.d.ts.map +0 -1
  445. package/dist/src/init/helpers-generator.d.ts +0 -60
  446. package/dist/src/init/helpers-generator.d.ts.map +0 -1
  447. package/dist/src/mcp-client.d.ts +0 -92
  448. package/dist/src/mcp-client.d.ts.map +0 -1
  449. package/dist/src/mcp-server.d.ts +0 -161
  450. package/dist/src/mcp-server.d.ts.map +0 -1
  451. package/dist/src/mcp-tools/auto-install.d.ts +0 -83
  452. package/dist/src/mcp-tools/auto-install.d.ts.map +0 -1
  453. package/dist/src/mcp-tools/types.d.ts +0 -31
  454. package/dist/src/mcp-tools/types.d.ts.map +0 -1
  455. package/dist/src/memory/ewc-consolidation.d.ts +0 -271
  456. package/dist/src/memory/ewc-consolidation.d.ts.map +0 -1
  457. package/dist/src/memory/intelligence.d.ts +0 -285
  458. package/dist/src/memory/intelligence.d.ts.map +0 -1
  459. package/dist/src/memory/memory-initializer.d.ts +0 -396
  460. package/dist/src/memory/memory-initializer.d.ts.map +0 -1
  461. package/dist/src/memory/sona-optimizer.d.ts +0 -227
  462. package/dist/src/memory/sona-optimizer.d.ts.map +0 -1
  463. package/dist/src/parser.d.ts +0 -41
  464. package/dist/src/parser.d.ts.map +0 -1
  465. package/dist/src/plugins/manager.d.ts +0 -133
  466. package/dist/src/plugins/manager.d.ts.map +0 -1
  467. package/dist/src/plugins/store/discovery.d.ts +0 -88
  468. package/dist/src/plugins/store/discovery.d.ts.map +0 -1
  469. package/dist/src/plugins/store/index.d.ts +0 -76
  470. package/dist/src/plugins/store/index.d.ts.map +0 -1
  471. package/dist/src/plugins/store/search.d.ts +0 -46
  472. package/dist/src/plugins/store/search.d.ts.map +0 -1
  473. package/dist/src/plugins/store/types.d.ts +0 -274
  474. package/dist/src/plugins/store/types.d.ts.map +0 -1
  475. package/dist/src/production/circuit-breaker.d.ts +0 -101
  476. package/dist/src/production/circuit-breaker.d.ts.map +0 -1
  477. package/dist/src/production/error-handler.d.ts +0 -92
  478. package/dist/src/production/error-handler.d.ts.map +0 -1
  479. package/dist/src/production/monitoring.d.ts +0 -161
  480. package/dist/src/production/monitoring.d.ts.map +0 -1
  481. package/dist/src/production/rate-limiter.d.ts +0 -80
  482. package/dist/src/production/rate-limiter.d.ts.map +0 -1
  483. package/dist/src/production/retry.d.ts +0 -48
  484. package/dist/src/production/retry.d.ts.map +0 -1
  485. package/dist/src/prompt.d.ts +0 -44
  486. package/dist/src/prompt.d.ts.map +0 -1
  487. package/dist/src/runtime/headless.d.ts +0 -60
  488. package/dist/src/runtime/headless.d.ts.map +0 -1
  489. package/dist/src/ruvector/ast-analyzer.d.ts +0 -67
  490. package/dist/src/ruvector/ast-analyzer.d.ts.map +0 -1
  491. package/dist/src/ruvector/coverage-router.d.ts +0 -160
  492. package/dist/src/ruvector/coverage-router.d.ts.map +0 -1
  493. package/dist/src/ruvector/diff-classifier.d.ts +0 -175
  494. package/dist/src/ruvector/diff-classifier.d.ts.map +0 -1
  495. package/dist/src/ruvector/enhanced-model-router.d.ts +0 -146
  496. package/dist/src/ruvector/enhanced-model-router.d.ts.map +0 -1
  497. package/dist/src/ruvector/flash-attention.d.ts +0 -195
  498. package/dist/src/ruvector/flash-attention.d.ts.map +0 -1
  499. package/dist/src/ruvector/graph-analyzer.d.ts +0 -187
  500. package/dist/src/ruvector/graph-analyzer.d.ts.map +0 -1
  501. package/dist/src/ruvector/index.d.ts +0 -34
  502. package/dist/src/ruvector/index.d.ts.map +0 -1
  503. package/dist/src/ruvector/lora-adapter.d.ts +0 -218
  504. package/dist/src/ruvector/lora-adapter.d.ts.map +0 -1
  505. package/dist/src/ruvector/model-router.d.ts +0 -220
  506. package/dist/src/ruvector/model-router.d.ts.map +0 -1
  507. package/dist/src/ruvector/moe-router.d.ts +0 -206
  508. package/dist/src/ruvector/moe-router.d.ts.map +0 -1
  509. package/dist/src/ruvector/q-learning-router.d.ts +0 -211
  510. package/dist/src/ruvector/q-learning-router.d.ts.map +0 -1
  511. package/dist/src/ruvector/semantic-router.d.ts +0 -77
  512. package/dist/src/ruvector/semantic-router.d.ts.map +0 -1
  513. package/dist/src/ruvector/vector-db.d.ts +0 -69
  514. package/dist/src/ruvector/vector-db.d.ts.map +0 -1
  515. package/dist/src/services/claim-service.d.ts +0 -204
  516. package/dist/src/services/claim-service.d.ts.map +0 -1
  517. package/dist/src/services/container-worker-pool.d.ts +0 -197
  518. package/dist/src/services/container-worker-pool.d.ts.map +0 -1
  519. package/dist/src/services/headless-worker-executor.d.ts +0 -304
  520. package/dist/src/services/headless-worker-executor.d.ts.map +0 -1
  521. package/dist/src/services/registry-api.d.ts +0 -58
  522. package/dist/src/services/registry-api.d.ts.map +0 -1
  523. package/dist/src/services/ruvector-training.d.ts +0 -213
  524. package/dist/src/services/ruvector-training.d.ts.map +0 -1
  525. package/dist/src/services/worker-daemon.d.ts +0 -203
  526. package/dist/src/services/worker-daemon.d.ts.map +0 -1
  527. package/dist/src/services/worker-queue.d.ts +0 -194
  528. package/dist/src/services/worker-queue.d.ts.map +0 -1
  529. package/dist/src/suggest.d.ts +0 -53
  530. package/dist/src/suggest.d.ts.map +0 -1
  531. package/dist/src/transfer/export.d.ts +0 -25
  532. package/dist/src/transfer/export.d.ts.map +0 -1
  533. package/dist/src/transfer/ipfs/client.d.ts +0 -109
  534. package/dist/src/transfer/ipfs/client.d.ts.map +0 -1
  535. package/dist/src/transfer/ipfs/upload.d.ts +0 -95
  536. package/dist/src/transfer/ipfs/upload.d.ts.map +0 -1
  537. package/dist/src/transfer/models/seraphine.d.ts +0 -72
  538. package/dist/src/transfer/models/seraphine.d.ts.map +0 -1
  539. package/dist/src/transfer/serialization/cfp.d.ts +0 -49
  540. package/dist/src/transfer/serialization/cfp.d.ts.map +0 -1
  541. package/dist/src/transfer/storage/gcs.d.ts +0 -82
  542. package/dist/src/transfer/storage/gcs.d.ts.map +0 -1
  543. package/dist/src/transfer/store/discovery.d.ts +0 -84
  544. package/dist/src/transfer/store/discovery.d.ts.map +0 -1
  545. package/dist/src/transfer/store/download.d.ts +0 -70
  546. package/dist/src/transfer/store/download.d.ts.map +0 -1
  547. package/dist/src/transfer/store/index.d.ts +0 -84
  548. package/dist/src/transfer/store/index.d.ts.map +0 -1
  549. package/dist/src/transfer/store/publish.d.ts +0 -76
  550. package/dist/src/transfer/store/publish.d.ts.map +0 -1
  551. package/dist/src/transfer/store/search.d.ts +0 -54
  552. package/dist/src/transfer/store/search.d.ts.map +0 -1
  553. package/dist/src/transfer/types.d.ts +0 -245
  554. package/dist/src/transfer/types.d.ts.map +0 -1
  555. package/dist/src/types.d.ts +0 -198
  556. package/dist/src/types.d.ts.map +0 -1
  557. package/dist/src/update/checker.d.ts +0 -34
  558. package/dist/src/update/checker.d.ts.map +0 -1
  559. package/dist/src/update/executor.d.ts +0 -32
  560. package/dist/src/update/executor.d.ts.map +0 -1
  561. package/dist/src/update/index.d.ts +0 -33
  562. package/dist/src/update/index.d.ts.map +0 -1
  563. package/dist/src/update/rate-limiter.d.ts +0 -20
  564. package/dist/src/update/rate-limiter.d.ts.map +0 -1
  565. package/dist/src/update/validator.d.ts +0 -17
  566. package/dist/src/update/validator.d.ts.map +0 -1
@@ -3,525 +3,389 @@
3
3
  * Properly initializes the memory database with sql.js (WASM SQLite)
4
4
  * Includes pattern tables, vector embeddings, migration state tracking
5
5
  *
6
+ * ADR-053: Routes through ControllerRegistry → AgentDB v3 when available,
7
+ * falls back to raw sql.js for backwards compatibility.
8
+ *
6
9
  * @module v3/cli/memory-initializer
7
10
  */
11
+ var __assign = (this && this.__assign) || function () {
12
+ __assign = Object.assign || function(t) {
13
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
14
+ s = arguments[i];
15
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
16
+ t[p] = s[p];
17
+ }
18
+ return t;
19
+ };
20
+ return __assign.apply(this, arguments);
21
+ };
22
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
23
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
24
+ return new (P || (P = Promise))(function (resolve, reject) {
25
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
26
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
27
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
28
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
29
+ });
30
+ };
31
+ var __generator = (this && this.__generator) || function (thisArg, body) {
32
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
33
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
34
+ function verb(n) { return function (v) { return step([n, v]); }; }
35
+ function step(op) {
36
+ if (f) throw new TypeError("Generator is already executing.");
37
+ while (_) try {
38
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
39
+ if (y = 0, t) op = [op[0] & 2, t.value];
40
+ switch (op[0]) {
41
+ case 0: case 1: t = op; break;
42
+ case 4: _.label++; return { value: op[1], done: false };
43
+ case 5: _.label++; y = op[1]; op = [0]; continue;
44
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
45
+ default:
46
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
47
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
48
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
49
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
50
+ if (t[2]) _.ops.pop();
51
+ _.trys.pop(); continue;
52
+ }
53
+ op = body.call(thisArg, _);
54
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
55
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
56
+ }
57
+ };
8
58
  import * as fs from 'fs';
9
59
  import * as path from 'path';
60
+ // ADR-053: Lazy import of AgentDB v3 bridge
61
+ var _bridge;
62
+ function getBridge() {
63
+ return __awaiter(this, void 0, Promise, function () {
64
+ var _a;
65
+ return __generator(this, function (_b) {
66
+ switch (_b.label) {
67
+ case 0:
68
+ if (_bridge === null)
69
+ return [2 /*return*/, null];
70
+ if (_bridge)
71
+ return [2 /*return*/, _bridge];
72
+ _b.label = 1;
73
+ case 1:
74
+ _b.trys.push([1, 3, , 4]);
75
+ return [4 /*yield*/, import('./memory-bridge.js')];
76
+ case 2:
77
+ _bridge = _b.sent();
78
+ return [2 /*return*/, _bridge];
79
+ case 3:
80
+ _a = _b.sent();
81
+ _bridge = null;
82
+ return [2 /*return*/, null];
83
+ case 4: return [2 /*return*/];
84
+ }
85
+ });
86
+ });
87
+ }
10
88
  /**
11
89
  * Enhanced schema with pattern confidence, temporal decay, versioning
12
90
  * Vector embeddings enabled for semantic search
13
91
  */
14
- export const MEMORY_SCHEMA_V3 = `
15
- -- KynjalFlow V3 Memory Database
16
- -- Version: 3.0.0
17
- -- Features: Pattern learning, vector embeddings, temporal decay, migration tracking
18
-
19
- PRAGMA journal_mode = WAL;
20
- PRAGMA synchronous = NORMAL;
21
- PRAGMA foreign_keys = ON;
22
-
23
- -- ============================================
24
- -- CORE MEMORY TABLES
25
- -- ============================================
26
-
27
- -- Memory entries (main storage)
28
- CREATE TABLE IF NOT EXISTS memory_entries (
29
- id TEXT PRIMARY KEY,
30
- key TEXT NOT NULL,
31
- namespace TEXT DEFAULT 'default',
32
- content TEXT NOT NULL,
33
- type TEXT DEFAULT 'semantic' CHECK(type IN ('semantic', 'episodic', 'procedural', 'working', 'pattern')),
34
-
35
- -- Vector embedding for semantic search (stored as JSON array)
36
- embedding TEXT,
37
- embedding_model TEXT DEFAULT 'local',
38
- embedding_dimensions INTEGER,
39
-
40
- -- Metadata
41
- tags TEXT, -- JSON array
42
- metadata TEXT, -- JSON object
43
- owner_id TEXT,
44
-
45
- -- Timestamps
46
- created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
47
- updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
48
- expires_at INTEGER,
49
- last_accessed_at INTEGER,
50
-
51
- -- Access tracking for hot/cold detection
52
- access_count INTEGER DEFAULT 0,
53
-
54
- -- Status
55
- status TEXT DEFAULT 'active' CHECK(status IN ('active', 'archived', 'deleted')),
56
-
57
- UNIQUE(namespace, key)
58
- );
59
-
60
- -- Indexes for memory entries
61
- CREATE INDEX IF NOT EXISTS idx_memory_namespace ON memory_entries(namespace);
62
- CREATE INDEX IF NOT EXISTS idx_memory_key ON memory_entries(key);
63
- CREATE INDEX IF NOT EXISTS idx_memory_type ON memory_entries(type);
64
- CREATE INDEX IF NOT EXISTS idx_memory_status ON memory_entries(status);
65
- CREATE INDEX IF NOT EXISTS idx_memory_created ON memory_entries(created_at);
66
- CREATE INDEX IF NOT EXISTS idx_memory_accessed ON memory_entries(last_accessed_at);
67
- CREATE INDEX IF NOT EXISTS idx_memory_owner ON memory_entries(owner_id);
68
-
69
- -- ============================================
70
- -- PATTERN LEARNING TABLES
71
- -- ============================================
72
-
73
- -- Learned patterns with confidence scoring and versioning
74
- CREATE TABLE IF NOT EXISTS patterns (
75
- id TEXT PRIMARY KEY,
76
-
77
- -- Pattern identification
78
- name TEXT NOT NULL,
79
- pattern_type TEXT NOT NULL CHECK(pattern_type IN (
80
- 'task-routing', 'error-recovery', 'optimization', 'learning',
81
- 'coordination', 'prediction', 'code-pattern', 'workflow'
82
- )),
83
-
84
- -- Pattern definition
85
- condition TEXT NOT NULL, -- Regex or semantic match
86
- action TEXT NOT NULL, -- What to do when pattern matches
87
- description TEXT,
88
-
89
- -- Confidence scoring (0.0 - 1.0)
90
- confidence REAL DEFAULT 0.5,
91
- success_count INTEGER DEFAULT 0,
92
- failure_count INTEGER DEFAULT 0,
93
-
94
- -- Temporal decay
95
- decay_rate REAL DEFAULT 0.01, -- How fast confidence decays
96
- half_life_days INTEGER DEFAULT 30, -- Days until confidence halves without use
97
-
98
- -- Vector embedding for semantic pattern matching
99
- embedding TEXT,
100
- embedding_dimensions INTEGER,
101
-
102
- -- Versioning
103
- version INTEGER DEFAULT 1,
104
- parent_id TEXT REFERENCES patterns(id),
105
-
106
- -- Metadata
107
- tags TEXT, -- JSON array
108
- metadata TEXT, -- JSON object
109
- source TEXT, -- Where the pattern was learned from
110
-
111
- -- Timestamps
112
- created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
113
- updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
114
- last_matched_at INTEGER,
115
- last_success_at INTEGER,
116
- last_failure_at INTEGER,
117
-
118
- -- Status
119
- status TEXT DEFAULT 'active' CHECK(status IN ('active', 'archived', 'deprecated', 'experimental'))
120
- );
121
-
122
- -- Indexes for patterns
123
- CREATE INDEX IF NOT EXISTS idx_patterns_type ON patterns(pattern_type);
124
- CREATE INDEX IF NOT EXISTS idx_patterns_confidence ON patterns(confidence DESC);
125
- CREATE INDEX IF NOT EXISTS idx_patterns_status ON patterns(status);
126
- CREATE INDEX IF NOT EXISTS idx_patterns_last_matched ON patterns(last_matched_at);
127
-
128
- -- Pattern evolution history (for versioning)
129
- CREATE TABLE IF NOT EXISTS pattern_history (
130
- id INTEGER PRIMARY KEY AUTOINCREMENT,
131
- pattern_id TEXT NOT NULL REFERENCES patterns(id),
132
- version INTEGER NOT NULL,
133
-
134
- -- Snapshot of pattern state
135
- confidence REAL,
136
- success_count INTEGER,
137
- failure_count INTEGER,
138
- condition TEXT,
139
- action TEXT,
140
-
141
- -- What changed
142
- change_type TEXT CHECK(change_type IN ('created', 'updated', 'success', 'failure', 'decay', 'merged', 'split')),
143
- change_reason TEXT,
144
-
145
- created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)
146
- );
147
-
148
- CREATE INDEX IF NOT EXISTS idx_pattern_history_pattern ON pattern_history(pattern_id);
149
-
150
- -- ============================================
151
- -- LEARNING & TRAJECTORY TABLES
152
- -- ============================================
153
-
154
- -- Learning trajectories (SONA integration)
155
- CREATE TABLE IF NOT EXISTS trajectories (
156
- id TEXT PRIMARY KEY,
157
- session_id TEXT,
158
-
159
- -- Trajectory state
160
- status TEXT DEFAULT 'active' CHECK(status IN ('active', 'completed', 'failed', 'abandoned')),
161
- verdict TEXT CHECK(verdict IN ('success', 'failure', 'partial', NULL)),
162
-
163
- -- Context
164
- task TEXT,
165
- context TEXT, -- JSON object
166
-
167
- -- Metrics
168
- total_steps INTEGER DEFAULT 0,
169
- total_reward REAL DEFAULT 0,
170
-
171
- -- Timestamps
172
- started_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
173
- ended_at INTEGER,
174
-
175
- -- Reference to extracted pattern (if any)
176
- extracted_pattern_id TEXT REFERENCES patterns(id)
177
- );
178
-
179
- -- Trajectory steps
180
- CREATE TABLE IF NOT EXISTS trajectory_steps (
181
- id INTEGER PRIMARY KEY AUTOINCREMENT,
182
- trajectory_id TEXT NOT NULL REFERENCES trajectories(id),
183
- step_number INTEGER NOT NULL,
184
-
185
- -- Step data
186
- action TEXT NOT NULL,
187
- observation TEXT,
188
- reward REAL DEFAULT 0,
189
-
190
- -- Metadata
191
- metadata TEXT, -- JSON object
192
-
193
- created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)
194
- );
195
-
196
- CREATE INDEX IF NOT EXISTS idx_steps_trajectory ON trajectory_steps(trajectory_id);
197
-
198
- -- ============================================
199
- -- MIGRATION STATE TRACKING
200
- -- ============================================
201
-
202
- -- Migration state (for resume capability)
203
- CREATE TABLE IF NOT EXISTS migration_state (
204
- id TEXT PRIMARY KEY,
205
- migration_type TEXT NOT NULL, -- 'v2-to-v3', 'pattern', 'memory', etc.
206
-
207
- -- Progress tracking
208
- status TEXT DEFAULT 'pending' CHECK(status IN ('pending', 'in_progress', 'completed', 'failed', 'rolled_back')),
209
- total_items INTEGER DEFAULT 0,
210
- processed_items INTEGER DEFAULT 0,
211
- failed_items INTEGER DEFAULT 0,
212
- skipped_items INTEGER DEFAULT 0,
213
-
214
- -- Current position (for resume)
215
- current_batch INTEGER DEFAULT 0,
216
- last_processed_id TEXT,
217
-
218
- -- Source/destination info
219
- source_path TEXT,
220
- source_type TEXT,
221
- destination_path TEXT,
222
-
223
- -- Backup info
224
- backup_path TEXT,
225
- backup_created_at INTEGER,
226
-
227
- -- Error tracking
228
- last_error TEXT,
229
- errors TEXT, -- JSON array of errors
230
-
231
- -- Timestamps
232
- started_at INTEGER,
233
- completed_at INTEGER,
234
- created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
235
- updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)
236
- );
237
-
238
- -- ============================================
239
- -- SESSION MANAGEMENT
240
- -- ============================================
241
-
242
- -- Sessions for context persistence
243
- CREATE TABLE IF NOT EXISTS sessions (
244
- id TEXT PRIMARY KEY,
245
-
246
- -- Session state
247
- state TEXT NOT NULL, -- JSON object with full session state
248
- status TEXT DEFAULT 'active' CHECK(status IN ('active', 'paused', 'completed', 'expired')),
249
-
250
- -- Context
251
- project_path TEXT,
252
- branch TEXT,
253
-
254
- -- Metrics
255
- tasks_completed INTEGER DEFAULT 0,
256
- patterns_learned INTEGER DEFAULT 0,
257
-
258
- -- Timestamps
259
- created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
260
- updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
261
- expires_at INTEGER
262
- );
263
-
264
- -- ============================================
265
- -- VECTOR INDEX METADATA (for HNSW)
266
- -- ============================================
267
-
268
- -- Track HNSW index state
269
- CREATE TABLE IF NOT EXISTS vector_indexes (
270
- id TEXT PRIMARY KEY,
271
- name TEXT NOT NULL UNIQUE,
272
-
273
- -- Index configuration
274
- dimensions INTEGER NOT NULL,
275
- metric TEXT DEFAULT 'cosine' CHECK(metric IN ('cosine', 'euclidean', 'dot')),
276
-
277
- -- HNSW parameters
278
- hnsw_m INTEGER DEFAULT 16,
279
- hnsw_ef_construction INTEGER DEFAULT 200,
280
- hnsw_ef_search INTEGER DEFAULT 100,
281
-
282
- -- Quantization
283
- quantization_type TEXT CHECK(quantization_type IN ('none', 'scalar', 'product')),
284
- quantization_bits INTEGER DEFAULT 8,
285
-
286
- -- Statistics
287
- total_vectors INTEGER DEFAULT 0,
288
- last_rebuild_at INTEGER,
289
-
290
- created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
291
- updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)
292
- );
293
-
294
- -- ============================================
295
- -- SYSTEM METADATA
296
- -- ============================================
297
-
298
- CREATE TABLE IF NOT EXISTS metadata (
299
- key TEXT PRIMARY KEY,
300
- value TEXT NOT NULL,
301
- updated_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)
302
- );
303
- `;
304
- let hnswIndex = null;
305
- let hnswInitializing = false;
92
+ export var MEMORY_SCHEMA_V3 = "\n-- RuFlo V3 Memory Database\n-- Version: 3.0.0\n-- Features: Pattern learning, vector embeddings, temporal decay, migration tracking\n\nPRAGMA journal_mode = WAL;\nPRAGMA synchronous = NORMAL;\nPRAGMA foreign_keys = ON;\n\n-- ============================================\n-- CORE MEMORY TABLES\n-- ============================================\n\n-- Memory entries (main storage)\nCREATE TABLE IF NOT EXISTS memory_entries (\n id TEXT PRIMARY KEY,\n key TEXT NOT NULL,\n namespace TEXT DEFAULT 'default',\n content TEXT NOT NULL,\n type TEXT DEFAULT 'semantic' CHECK(type IN ('semantic', 'episodic', 'procedural', 'working', 'pattern')),\n\n -- Vector embedding for semantic search (stored as JSON array)\n embedding TEXT,\n embedding_model TEXT DEFAULT 'local',\n embedding_dimensions INTEGER,\n\n -- Metadata\n tags TEXT, -- JSON array\n metadata TEXT, -- JSON object\n owner_id TEXT,\n\n -- Timestamps\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n expires_at INTEGER,\n last_accessed_at INTEGER,\n\n -- Access tracking for hot/cold detection\n access_count INTEGER DEFAULT 0,\n\n -- Status\n status TEXT DEFAULT 'active' CHECK(status IN ('active', 'archived', 'deleted')),\n\n UNIQUE(namespace, key)\n);\n\n-- Indexes for memory entries\nCREATE INDEX IF NOT EXISTS idx_memory_namespace ON memory_entries(namespace);\nCREATE INDEX IF NOT EXISTS idx_memory_key ON memory_entries(key);\nCREATE INDEX IF NOT EXISTS idx_memory_type ON memory_entries(type);\nCREATE INDEX IF NOT EXISTS idx_memory_status ON memory_entries(status);\nCREATE INDEX IF NOT EXISTS idx_memory_created ON memory_entries(created_at);\nCREATE INDEX IF NOT EXISTS idx_memory_accessed ON memory_entries(last_accessed_at);\nCREATE INDEX IF NOT EXISTS idx_memory_owner ON memory_entries(owner_id);\n\n-- ============================================\n-- PATTERN LEARNING TABLES\n-- ============================================\n\n-- Learned patterns with confidence scoring and versioning\nCREATE TABLE IF NOT EXISTS patterns (\n id TEXT PRIMARY KEY,\n\n -- Pattern identification\n name TEXT NOT NULL,\n pattern_type TEXT NOT NULL CHECK(pattern_type IN (\n 'task-routing', 'error-recovery', 'optimization', 'learning',\n 'coordination', 'prediction', 'code-pattern', 'workflow'\n )),\n\n -- Pattern definition\n condition TEXT NOT NULL, -- Regex or semantic match\n action TEXT NOT NULL, -- What to do when pattern matches\n description TEXT,\n\n -- Confidence scoring (0.0 - 1.0)\n confidence REAL DEFAULT 0.5,\n success_count INTEGER DEFAULT 0,\n failure_count INTEGER DEFAULT 0,\n\n -- Temporal decay\n decay_rate REAL DEFAULT 0.01, -- How fast confidence decays\n half_life_days INTEGER DEFAULT 30, -- Days until confidence halves without use\n\n -- Vector embedding for semantic pattern matching\n embedding TEXT,\n embedding_dimensions INTEGER,\n\n -- Versioning\n version INTEGER DEFAULT 1,\n parent_id TEXT REFERENCES patterns(id),\n\n -- Metadata\n tags TEXT, -- JSON array\n metadata TEXT, -- JSON object\n source TEXT, -- Where the pattern was learned from\n\n -- Timestamps\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n last_matched_at INTEGER,\n last_success_at INTEGER,\n last_failure_at INTEGER,\n\n -- Status\n status TEXT DEFAULT 'active' CHECK(status IN ('active', 'archived', 'deprecated', 'experimental'))\n);\n\n-- Indexes for patterns\nCREATE INDEX IF NOT EXISTS idx_patterns_type ON patterns(pattern_type);\nCREATE INDEX IF NOT EXISTS idx_patterns_confidence ON patterns(confidence DESC);\nCREATE INDEX IF NOT EXISTS idx_patterns_status ON patterns(status);\nCREATE INDEX IF NOT EXISTS idx_patterns_last_matched ON patterns(last_matched_at);\n\n-- Pattern evolution history (for versioning)\nCREATE TABLE IF NOT EXISTS pattern_history (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n pattern_id TEXT NOT NULL REFERENCES patterns(id),\n version INTEGER NOT NULL,\n\n -- Snapshot of pattern state\n confidence REAL,\n success_count INTEGER,\n failure_count INTEGER,\n condition TEXT,\n action TEXT,\n\n -- What changed\n change_type TEXT CHECK(change_type IN ('created', 'updated', 'success', 'failure', 'decay', 'merged', 'split')),\n change_reason TEXT,\n\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)\n);\n\nCREATE INDEX IF NOT EXISTS idx_pattern_history_pattern ON pattern_history(pattern_id);\n\n-- ============================================\n-- LEARNING & TRAJECTORY TABLES\n-- ============================================\n\n-- Learning trajectories (SONA integration)\nCREATE TABLE IF NOT EXISTS trajectories (\n id TEXT PRIMARY KEY,\n session_id TEXT,\n\n -- Trajectory state\n status TEXT DEFAULT 'active' CHECK(status IN ('active', 'completed', 'failed', 'abandoned')),\n verdict TEXT CHECK(verdict IN ('success', 'failure', 'partial', NULL)),\n\n -- Context\n task TEXT,\n context TEXT, -- JSON object\n\n -- Metrics\n total_steps INTEGER DEFAULT 0,\n total_reward REAL DEFAULT 0,\n\n -- Timestamps\n started_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n ended_at INTEGER,\n\n -- Reference to extracted pattern (if any)\n extracted_pattern_id TEXT REFERENCES patterns(id)\n);\n\n-- Trajectory steps\nCREATE TABLE IF NOT EXISTS trajectory_steps (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n trajectory_id TEXT NOT NULL REFERENCES trajectories(id),\n step_number INTEGER NOT NULL,\n\n -- Step data\n action TEXT NOT NULL,\n observation TEXT,\n reward REAL DEFAULT 0,\n\n -- Metadata\n metadata TEXT, -- JSON object\n\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)\n);\n\nCREATE INDEX IF NOT EXISTS idx_steps_trajectory ON trajectory_steps(trajectory_id);\n\n-- ============================================\n-- MIGRATION STATE TRACKING\n-- ============================================\n\n-- Migration state (for resume capability)\nCREATE TABLE IF NOT EXISTS migration_state (\n id TEXT PRIMARY KEY,\n migration_type TEXT NOT NULL, -- 'v2-to-v3', 'pattern', 'memory', etc.\n\n -- Progress tracking\n status TEXT DEFAULT 'pending' CHECK(status IN ('pending', 'in_progress', 'completed', 'failed', 'rolled_back')),\n total_items INTEGER DEFAULT 0,\n processed_items INTEGER DEFAULT 0,\n failed_items INTEGER DEFAULT 0,\n skipped_items INTEGER DEFAULT 0,\n\n -- Current position (for resume)\n current_batch INTEGER DEFAULT 0,\n last_processed_id TEXT,\n\n -- Source/destination info\n source_path TEXT,\n source_type TEXT,\n destination_path TEXT,\n\n -- Backup info\n backup_path TEXT,\n backup_created_at INTEGER,\n\n -- Error tracking\n last_error TEXT,\n errors TEXT, -- JSON array of errors\n\n -- Timestamps\n started_at INTEGER,\n completed_at INTEGER,\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)\n);\n\n-- ============================================\n-- SESSION MANAGEMENT\n-- ============================================\n\n-- Sessions for context persistence\nCREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n\n -- Session state\n state TEXT NOT NULL, -- JSON object with full session state\n status TEXT DEFAULT 'active' CHECK(status IN ('active', 'paused', 'completed', 'expired')),\n\n -- Context\n project_path TEXT,\n branch TEXT,\n\n -- Metrics\n tasks_completed INTEGER DEFAULT 0,\n patterns_learned INTEGER DEFAULT 0,\n\n -- Timestamps\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n expires_at INTEGER\n);\n\n-- ============================================\n-- VECTOR INDEX METADATA (for HNSW)\n-- ============================================\n\n-- Track HNSW index state\nCREATE TABLE IF NOT EXISTS vector_indexes (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL UNIQUE,\n\n -- Index configuration\n dimensions INTEGER NOT NULL,\n metric TEXT DEFAULT 'cosine' CHECK(metric IN ('cosine', 'euclidean', 'dot')),\n\n -- HNSW parameters\n hnsw_m INTEGER DEFAULT 16,\n hnsw_ef_construction INTEGER DEFAULT 200,\n hnsw_ef_search INTEGER DEFAULT 100,\n\n -- Quantization\n quantization_type TEXT CHECK(quantization_type IN ('none', 'scalar', 'product')),\n quantization_bits INTEGER DEFAULT 8,\n\n -- Statistics\n total_vectors INTEGER DEFAULT 0,\n last_rebuild_at INTEGER,\n\n created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),\n updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)\n);\n\n-- ============================================\n-- SYSTEM METADATA\n-- ============================================\n\nCREATE TABLE IF NOT EXISTS metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL,\n updated_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)\n);\n";
93
+ var hnswIndex = null;
94
+ var hnswInitializing = false;
306
95
  /**
307
96
  * Get or create the HNSW index singleton
308
97
  * Lazily initializes from SQLite data on first use
309
98
  */
310
- export async function getHNSWIndex(options) {
311
- const dimensions = options?.dimensions ?? 384;
312
- // Return existing index if already initialized
313
- if (hnswIndex?.initialized && !options?.forceRebuild) {
314
- return hnswIndex;
315
- }
316
- // Prevent concurrent initialization
317
- if (hnswInitializing) {
318
- // Wait for initialization to complete
319
- while (hnswInitializing) {
320
- await new Promise(resolve => setTimeout(resolve, 10));
321
- }
322
- return hnswIndex;
323
- }
324
- hnswInitializing = true;
325
- try {
326
- // Import @ruvector/core dynamically
327
- // Handle both ESM (default export) and CJS patterns
328
- const ruvectorModule = await import('@ruvector/core').catch(() => null);
329
- if (!ruvectorModule) {
330
- hnswInitializing = false;
331
- return null; // HNSW not available
332
- }
333
- // ESM returns { default: { VectorDb, ... } }, CJS returns { VectorDb, ... }
334
- const ruvectorCore = ruvectorModule.default || ruvectorModule;
335
- if (!ruvectorCore?.VectorDb) {
336
- hnswInitializing = false;
337
- return null; // VectorDb not found
338
- }
339
- const { VectorDb } = ruvectorCore;
340
- // Persistent storage paths
341
- const swarmDir = path.join(process.cwd(), '.swarm');
342
- if (!fs.existsSync(swarmDir)) {
343
- fs.mkdirSync(swarmDir, { recursive: true });
344
- }
345
- const hnswPath = path.join(swarmDir, 'hnsw.index');
346
- const metadataPath = path.join(swarmDir, 'hnsw.metadata.json');
347
- const dbPath = options?.dbPath || path.join(swarmDir, 'memory.db');
348
- // Create HNSW index with persistent storage
349
- // @ruvector/core uses string enum for distanceMetric: 'Cosine', 'Euclidean', 'DotProduct', 'Manhattan'
350
- const db = new VectorDb({
351
- dimensions,
352
- distanceMetric: 'Cosine',
353
- storagePath: hnswPath // Persistent storage!
354
- });
355
- // Load metadata (entry info) if exists
356
- const entries = new Map();
357
- if (fs.existsSync(metadataPath)) {
358
- try {
359
- const metadataJson = fs.readFileSync(metadataPath, 'utf-8');
360
- const metadata = JSON.parse(metadataJson);
361
- for (const [key, value] of metadata) {
362
- entries.set(key, value);
363
- }
364
- }
365
- catch {
366
- // Metadata load failed, will rebuild
367
- }
368
- }
369
- hnswIndex = {
370
- db,
371
- entries,
372
- dimensions,
373
- initialized: false
374
- };
375
- // Check if index already has data (from persistent storage)
376
- const existingLen = await db.len();
377
- if (existingLen > 0 && entries.size > 0) {
378
- // Index loaded from disk, skip SQLite sync
379
- hnswIndex.initialized = true;
380
- hnswInitializing = false;
381
- return hnswIndex;
382
- }
383
- if (fs.existsSync(dbPath)) {
384
- try {
385
- const initSqlJs = (await import('sql.js')).default;
386
- const SQL = await initSqlJs();
387
- const fileBuffer = fs.readFileSync(dbPath);
388
- const sqlDb = new SQL.Database(fileBuffer);
389
- // Load all entries with embeddings
390
- const result = sqlDb.exec(`
391
- SELECT id, key, namespace, content, embedding
392
- FROM memory_entries
393
- WHERE status = 'active' AND embedding IS NOT NULL
394
- LIMIT 10000
395
- `);
396
- if (result[0]?.values) {
397
- for (const row of result[0].values) {
398
- const [id, key, ns, content, embeddingJson] = row;
399
- if (embeddingJson) {
400
- try {
401
- const embedding = JSON.parse(embeddingJson);
402
- const vector = new Float32Array(embedding);
403
- await db.insert({
404
- id: String(id),
405
- vector
406
- });
407
- hnswIndex.entries.set(String(id), {
408
- id: String(id),
409
- key: key || String(id),
410
- namespace: ns || 'default',
411
- content: content || ''
412
- });
413
- }
414
- catch {
415
- // Skip invalid embeddings
99
+ export function getHNSWIndex(options) {
100
+ var _a, _b;
101
+ return __awaiter(this, void 0, Promise, function () {
102
+ var dimensions, ruvectorModule, ruvectorCore, VectorDb, swarmDir, hnswPath, metadataPath, dbPath, db, entries, metadataJson, metadata, _i, metadata_1, _c, key, value, existingLen, initSqlJs, SQL, fileBuffer, sqlDb, result, _d, _e, row, _f, id, key, ns, content, embeddingJson, embedding, vector, _g, _h, _j;
103
+ return __generator(this, function (_k) {
104
+ switch (_k.label) {
105
+ case 0:
106
+ dimensions = (_a = options === null || options === void 0 ? void 0 : options.dimensions) !== null && _a !== void 0 ? _a : 384;
107
+ // Return existing index if already initialized
108
+ if ((hnswIndex === null || hnswIndex === void 0 ? void 0 : hnswIndex.initialized) && !(options === null || options === void 0 ? void 0 : options.forceRebuild)) {
109
+ return [2 /*return*/, hnswIndex];
110
+ }
111
+ if (!hnswInitializing) return [3 /*break*/, 4];
112
+ _k.label = 1;
113
+ case 1:
114
+ if (!hnswInitializing) return [3 /*break*/, 3];
115
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 10); })];
116
+ case 2:
117
+ _k.sent();
118
+ return [3 /*break*/, 1];
119
+ case 3: return [2 /*return*/, hnswIndex];
120
+ case 4:
121
+ hnswInitializing = true;
122
+ _k.label = 5;
123
+ case 5:
124
+ _k.trys.push([5, 19, , 20]);
125
+ return [4 /*yield*/, import('@ruvector/core')["catch"](function () { return null; })];
126
+ case 6:
127
+ ruvectorModule = _k.sent();
128
+ if (!ruvectorModule) {
129
+ hnswInitializing = false;
130
+ return [2 /*return*/, null]; // HNSW not available
131
+ }
132
+ ruvectorCore = ruvectorModule["default"] || ruvectorModule;
133
+ if (!(ruvectorCore === null || ruvectorCore === void 0 ? void 0 : ruvectorCore.VectorDb)) {
134
+ hnswInitializing = false;
135
+ return [2 /*return*/, null]; // VectorDb not found
136
+ }
137
+ VectorDb = ruvectorCore.VectorDb;
138
+ swarmDir = path.join(process.cwd(), '.swarm');
139
+ if (!fs.existsSync(swarmDir)) {
140
+ fs.mkdirSync(swarmDir, { recursive: true });
141
+ }
142
+ hnswPath = path.join(swarmDir, 'hnsw.index');
143
+ metadataPath = path.join(swarmDir, 'hnsw.metadata.json');
144
+ dbPath = (options === null || options === void 0 ? void 0 : options.dbPath) || path.join(swarmDir, 'memory.db');
145
+ db = new VectorDb({
146
+ dimensions: dimensions,
147
+ distanceMetric: 'Cosine',
148
+ storagePath: hnswPath // Persistent storage!
149
+ });
150
+ entries = new Map();
151
+ if (fs.existsSync(metadataPath)) {
152
+ try {
153
+ metadataJson = fs.readFileSync(metadataPath, 'utf-8');
154
+ metadata = JSON.parse(metadataJson);
155
+ for (_i = 0, metadata_1 = metadata; _i < metadata_1.length; _i++) {
156
+ _c = metadata_1[_i], key = _c[0], value = _c[1];
157
+ entries.set(key, value);
416
158
  }
417
159
  }
160
+ catch (_l) {
161
+ // Metadata load failed, will rebuild
162
+ }
418
163
  }
419
- }
420
- sqlDb.close();
421
- }
422
- catch {
423
- // SQLite load failed, start with empty index
164
+ hnswIndex = {
165
+ db: db,
166
+ entries: entries,
167
+ dimensions: dimensions,
168
+ initialized: false
169
+ };
170
+ return [4 /*yield*/, db.len()];
171
+ case 7:
172
+ existingLen = _k.sent();
173
+ if (existingLen > 0 && entries.size > 0) {
174
+ // Index loaded from disk, skip SQLite sync
175
+ hnswIndex.initialized = true;
176
+ hnswInitializing = false;
177
+ return [2 /*return*/, hnswIndex];
178
+ }
179
+ if (!fs.existsSync(dbPath)) return [3 /*break*/, 18];
180
+ _k.label = 8;
181
+ case 8:
182
+ _k.trys.push([8, 17, , 18]);
183
+ return [4 /*yield*/, import('sql.js')];
184
+ case 9:
185
+ initSqlJs = (_k.sent())["default"];
186
+ return [4 /*yield*/, initSqlJs()];
187
+ case 10:
188
+ SQL = _k.sent();
189
+ fileBuffer = fs.readFileSync(dbPath);
190
+ sqlDb = new SQL.Database(fileBuffer);
191
+ result = sqlDb.exec("\n SELECT id, key, namespace, content, embedding\n FROM memory_entries\n WHERE status = 'active' AND embedding IS NOT NULL\n LIMIT 10000\n ");
192
+ if (!((_b = result[0]) === null || _b === void 0 ? void 0 : _b.values)) return [3 /*break*/, 16];
193
+ _d = 0, _e = result[0].values;
194
+ _k.label = 11;
195
+ case 11:
196
+ if (!(_d < _e.length)) return [3 /*break*/, 16];
197
+ row = _e[_d];
198
+ _f = row, id = _f[0], key = _f[1], ns = _f[2], content = _f[3], embeddingJson = _f[4];
199
+ if (!embeddingJson) return [3 /*break*/, 15];
200
+ _k.label = 12;
201
+ case 12:
202
+ _k.trys.push([12, 14, , 15]);
203
+ embedding = JSON.parse(embeddingJson);
204
+ vector = new Float32Array(embedding);
205
+ return [4 /*yield*/, db.insert({
206
+ id: String(id),
207
+ vector: vector
208
+ })];
209
+ case 13:
210
+ _k.sent();
211
+ hnswIndex.entries.set(String(id), {
212
+ id: String(id),
213
+ key: key || String(id),
214
+ namespace: ns || 'default',
215
+ content: content || ''
216
+ });
217
+ return [3 /*break*/, 15];
218
+ case 14:
219
+ _g = _k.sent();
220
+ return [3 /*break*/, 15];
221
+ case 15:
222
+ _d++;
223
+ return [3 /*break*/, 11];
224
+ case 16:
225
+ sqlDb.close();
226
+ return [3 /*break*/, 18];
227
+ case 17:
228
+ _h = _k.sent();
229
+ return [3 /*break*/, 18];
230
+ case 18:
231
+ hnswIndex.initialized = true;
232
+ hnswInitializing = false;
233
+ return [2 /*return*/, hnswIndex];
234
+ case 19:
235
+ _j = _k.sent();
236
+ hnswInitializing = false;
237
+ return [2 /*return*/, null];
238
+ case 20: return [2 /*return*/];
424
239
  }
425
- }
426
- hnswIndex.initialized = true;
427
- hnswInitializing = false;
428
- return hnswIndex;
429
- }
430
- catch {
431
- hnswInitializing = false;
432
- return null;
433
- }
240
+ });
241
+ });
434
242
  }
435
243
  /**
436
244
  * Save HNSW metadata to disk for persistence
437
245
  */
438
246
  function saveHNSWMetadata() {
439
- if (!hnswIndex?.entries)
247
+ if (!(hnswIndex === null || hnswIndex === void 0 ? void 0 : hnswIndex.entries))
440
248
  return;
441
249
  try {
442
- const swarmDir = path.join(process.cwd(), '.swarm');
443
- const metadataPath = path.join(swarmDir, 'hnsw.metadata.json');
444
- const metadata = Array.from(hnswIndex.entries.entries());
250
+ var swarmDir = path.join(process.cwd(), '.swarm');
251
+ var metadataPath = path.join(swarmDir, 'hnsw.metadata.json');
252
+ var metadata = Array.from(hnswIndex.entries.entries());
445
253
  fs.writeFileSync(metadataPath, JSON.stringify(metadata));
446
254
  }
447
- catch {
255
+ catch (_a) {
448
256
  // Silently fail - metadata save is best-effort
449
257
  }
450
258
  }
451
259
  /**
452
260
  * Add entry to HNSW index (with automatic persistence)
453
261
  */
454
- export async function addToHNSWIndex(id, embedding, entry) {
455
- const index = await getHNSWIndex({ dimensions: embedding.length });
456
- if (!index)
457
- return false;
458
- try {
459
- const vector = new Float32Array(embedding);
460
- await index.db.insert({
461
- id,
462
- vector
262
+ export function addToHNSWIndex(id, embedding, entry) {
263
+ return __awaiter(this, void 0, Promise, function () {
264
+ var bridge, bridgeResult, index, vector, _a;
265
+ return __generator(this, function (_b) {
266
+ switch (_b.label) {
267
+ case 0: return [4 /*yield*/, getBridge()];
268
+ case 1:
269
+ bridge = _b.sent();
270
+ if (!bridge) return [3 /*break*/, 3];
271
+ return [4 /*yield*/, bridge.bridgeAddToHNSW(id, embedding, entry)];
272
+ case 2:
273
+ bridgeResult = _b.sent();
274
+ if (bridgeResult === true)
275
+ return [2 /*return*/, true];
276
+ _b.label = 3;
277
+ case 3: return [4 /*yield*/, getHNSWIndex({ dimensions: embedding.length })];
278
+ case 4:
279
+ index = _b.sent();
280
+ if (!index)
281
+ return [2 /*return*/, false];
282
+ _b.label = 5;
283
+ case 5:
284
+ _b.trys.push([5, 7, , 8]);
285
+ vector = new Float32Array(embedding);
286
+ return [4 /*yield*/, index.db.insert({
287
+ id: id,
288
+ vector: vector
289
+ })];
290
+ case 6:
291
+ _b.sent();
292
+ index.entries.set(id, entry);
293
+ // Save metadata for persistence (debounced would be better for high-volume)
294
+ saveHNSWMetadata();
295
+ return [2 /*return*/, true];
296
+ case 7:
297
+ _a = _b.sent();
298
+ return [2 /*return*/, false];
299
+ case 8: return [2 /*return*/];
300
+ }
463
301
  });
464
- index.entries.set(id, entry);
465
- // Save metadata for persistence (debounced would be better for high-volume)
466
- saveHNSWMetadata();
467
- return true;
468
- }
469
- catch {
470
- return false;
471
- }
302
+ });
472
303
  }
473
304
  /**
474
305
  * Search HNSW index (150x faster than brute-force)
475
306
  * Returns results sorted by similarity (highest first)
476
307
  */
477
- export async function searchHNSWIndex(queryEmbedding, options) {
478
- const index = await getHNSWIndex({ dimensions: queryEmbedding.length });
479
- if (!index)
480
- return null;
481
- try {
482
- const vector = new Float32Array(queryEmbedding);
483
- const k = options?.k ?? 10;
484
- // HNSW search returns results with cosine distance (lower = more similar)
485
- const results = await index.db.search({ vector, k: k * 2 }); // Get extra for filtering
486
- const filtered = [];
487
- for (const result of results) {
488
- const entry = index.entries.get(result.id);
489
- if (!entry)
490
- continue;
491
- // Filter by namespace if specified
492
- if (options?.namespace && options.namespace !== 'all' && entry.namespace !== options.namespace) {
493
- continue;
308
+ export function searchHNSWIndex(queryEmbedding, options) {
309
+ var _a;
310
+ return __awaiter(this, void 0, Promise, function () {
311
+ var bridge, bridgeResult, index, vector, k, results, filtered, _i, results_1, result, entry, score, _b;
312
+ return __generator(this, function (_c) {
313
+ switch (_c.label) {
314
+ case 0: return [4 /*yield*/, getBridge()];
315
+ case 1:
316
+ bridge = _c.sent();
317
+ if (!bridge) return [3 /*break*/, 3];
318
+ return [4 /*yield*/, bridge.bridgeSearchHNSW(queryEmbedding, options)];
319
+ case 2:
320
+ bridgeResult = _c.sent();
321
+ if (bridgeResult)
322
+ return [2 /*return*/, bridgeResult];
323
+ _c.label = 3;
324
+ case 3: return [4 /*yield*/, getHNSWIndex({ dimensions: queryEmbedding.length })];
325
+ case 4:
326
+ index = _c.sent();
327
+ if (!index)
328
+ return [2 /*return*/, null];
329
+ _c.label = 5;
330
+ case 5:
331
+ _c.trys.push([5, 7, , 8]);
332
+ vector = new Float32Array(queryEmbedding);
333
+ k = (_a = options === null || options === void 0 ? void 0 : options.k) !== null && _a !== void 0 ? _a : 10;
334
+ return [4 /*yield*/, index.db.search({ vector: vector, k: k * 2 })];
335
+ case 6:
336
+ results = _c.sent();
337
+ filtered = [];
338
+ for (_i = 0, results_1 = results; _i < results_1.length; _i++) {
339
+ result = results_1[_i];
340
+ entry = index.entries.get(result.id);
341
+ if (!entry)
342
+ continue;
343
+ // Filter by namespace if specified
344
+ if ((options === null || options === void 0 ? void 0 : options.namespace) && options.namespace !== 'all' && entry.namespace !== options.namespace) {
345
+ continue;
346
+ }
347
+ score = 1 - (result.score / 2);
348
+ filtered.push({
349
+ id: entry.id.substring(0, 12),
350
+ key: entry.key || entry.id.substring(0, 15),
351
+ content: entry.content.substring(0, 60) + (entry.content.length > 60 ? '...' : ''),
352
+ score: score,
353
+ namespace: entry.namespace
354
+ });
355
+ if (filtered.length >= k)
356
+ break;
357
+ }
358
+ // Sort by score descending (highest similarity first)
359
+ filtered.sort(function (a, b) { return b.score - a.score; });
360
+ return [2 /*return*/, filtered];
361
+ case 7:
362
+ _b = _c.sent();
363
+ return [2 /*return*/, null];
364
+ case 8: return [2 /*return*/];
494
365
  }
495
- // Convert cosine distance to similarity score (1 - distance)
496
- // Cosine distance from @ruvector/core: 0 = identical, 2 = opposite
497
- const score = 1 - (result.score / 2);
498
- filtered.push({
499
- id: entry.id.substring(0, 12),
500
- key: entry.key || entry.id.substring(0, 15),
501
- content: entry.content.substring(0, 60) + (entry.content.length > 60 ? '...' : ''),
502
- score,
503
- namespace: entry.namespace
504
- });
505
- if (filtered.length >= k)
506
- break;
507
- }
508
- // Sort by score descending (highest similarity first)
509
- filtered.sort((a, b) => b.score - a.score);
510
- return filtered;
511
- }
512
- catch {
513
- return null;
514
- }
366
+ });
367
+ });
515
368
  }
516
369
  /**
517
370
  * Get HNSW index status
518
371
  */
519
372
  export function getHNSWStatus() {
373
+ var _a, _b, _c, _d, _e;
374
+ // ADR-053: If bridge was previously loaded, report availability
375
+ if (_bridge && _bridge !== null) {
376
+ // Bridge is loaded — HNSW-equivalent is available via AgentDB v3
377
+ return {
378
+ available: true,
379
+ initialized: true,
380
+ entryCount: (_a = hnswIndex === null || hnswIndex === void 0 ? void 0 : hnswIndex.entries.size) !== null && _a !== void 0 ? _a : 0,
381
+ dimensions: (_b = hnswIndex === null || hnswIndex === void 0 ? void 0 : hnswIndex.dimensions) !== null && _b !== void 0 ? _b : 384
382
+ };
383
+ }
520
384
  return {
521
385
  available: hnswIndex !== null,
522
- initialized: hnswIndex?.initialized ?? false,
523
- entryCount: hnswIndex?.entries.size ?? 0,
524
- dimensions: hnswIndex?.dimensions ?? 384
386
+ initialized: (_c = hnswIndex === null || hnswIndex === void 0 ? void 0 : hnswIndex.initialized) !== null && _c !== void 0 ? _c : false,
387
+ entryCount: (_d = hnswIndex === null || hnswIndex === void 0 ? void 0 : hnswIndex.entries.size) !== null && _d !== void 0 ? _d : 0,
388
+ dimensions: (_e = hnswIndex === null || hnswIndex === void 0 ? void 0 : hnswIndex.dimensions) !== null && _e !== void 0 ? _e : 384
525
389
  };
526
390
  }
527
391
  /**
@@ -530,6 +394,15 @@ export function getHNSWStatus() {
530
394
  export function clearHNSWIndex() {
531
395
  hnswIndex = null;
532
396
  }
397
+ /**
398
+ * Invalidate the in-memory HNSW cache so the next search rebuilds from DB.
399
+ * Call this after deleting entries that had embeddings to prevent ghost
400
+ * vectors from appearing in search results.
401
+ */
402
+ export function rebuildSearchIndex() {
403
+ hnswIndex = null;
404
+ hnswInitializing = false;
405
+ }
533
406
  // ============================================================================
534
407
  // INT8 VECTOR QUANTIZATION (4x memory reduction)
535
408
  // ============================================================================
@@ -541,27 +414,27 @@ export function clearHNSWIndex() {
541
414
  * @returns Quantized Int8 array with scale factor
542
415
  */
543
416
  export function quantizeInt8(embedding) {
544
- const arr = embedding instanceof Float32Array ? embedding : new Float32Array(embedding);
417
+ var arr = embedding instanceof Float32Array ? embedding : new Float32Array(embedding);
545
418
  // Find min/max for symmetric quantization
546
- let min = Infinity, max = -Infinity;
547
- for (let i = 0; i < arr.length; i++) {
419
+ var min = Infinity, max = -Infinity;
420
+ for (var i = 0; i < arr.length; i++) {
548
421
  if (arr[i] < min)
549
422
  min = arr[i];
550
423
  if (arr[i] > max)
551
424
  max = arr[i];
552
425
  }
553
426
  // Symmetric quantization: scale = max(|min|, |max|) / 127
554
- const absMax = Math.max(Math.abs(min), Math.abs(max));
555
- const scale = absMax / 127 || 1e-10; // Avoid division by zero
556
- const zeroPoint = 0; // Symmetric quantization
427
+ var absMax = Math.max(Math.abs(min), Math.abs(max));
428
+ var scale = absMax / 127 || 1e-10; // Avoid division by zero
429
+ var zeroPoint = 0; // Symmetric quantization
557
430
  // Quantize
558
- const quantized = new Int8Array(arr.length);
559
- for (let i = 0; i < arr.length; i++) {
431
+ var quantized = new Int8Array(arr.length);
432
+ for (var i = 0; i < arr.length; i++) {
560
433
  // Clamp to [-127, 127] to leave room for potential rounding
561
- const q = Math.round(arr[i] / scale);
434
+ var q = Math.round(arr[i] / scale);
562
435
  quantized[i] = Math.max(-127, Math.min(127, q));
563
436
  }
564
- return { quantized, scale, zeroPoint };
437
+ return { quantized: quantized, scale: scale, zeroPoint: zeroPoint };
565
438
  }
566
439
  /**
567
440
  * Dequantize Int8 back to Float32
@@ -571,9 +444,10 @@ export function quantizeInt8(embedding) {
571
444
  * @param zeroPoint - Zero point (usually 0 for symmetric)
572
445
  * @returns Float32Array
573
446
  */
574
- export function dequantizeInt8(quantized, scale, zeroPoint = 0) {
575
- const result = new Float32Array(quantized.length);
576
- for (let i = 0; i < quantized.length; i++) {
447
+ export function dequantizeInt8(quantized, scale, zeroPoint) {
448
+ if (zeroPoint === void 0) { zeroPoint = 0; }
449
+ var result = new Float32Array(quantized.length);
450
+ for (var i = 0; i < quantized.length; i++) {
577
451
  result[i] = (quantized[i] - zeroPoint) * scale;
578
452
  }
579
453
  return result;
@@ -585,25 +459,25 @@ export function dequantizeInt8(quantized, scale, zeroPoint = 0) {
585
459
  export function quantizedCosineSim(a, aScale, b, bScale) {
586
460
  if (a.length !== b.length)
587
461
  return 0;
588
- let dot = 0, normA = 0, normB = 0;
589
- for (let i = 0; i < a.length; i++) {
462
+ var dot = 0, normA = 0, normB = 0;
463
+ for (var i = 0; i < a.length; i++) {
590
464
  dot += a[i] * b[i];
591
465
  normA += a[i] * a[i];
592
466
  normB += b[i] * b[i];
593
467
  }
594
468
  // Scales cancel out in cosine similarity for normalized vectors
595
- const mag = Math.sqrt(normA * normB);
469
+ var mag = Math.sqrt(normA * normB);
596
470
  return mag === 0 ? 0 : dot / mag;
597
471
  }
598
472
  /**
599
473
  * Get quantization statistics for an embedding
600
474
  */
601
475
  export function getQuantizationStats(embedding) {
602
- const len = embedding.length;
603
- const originalBytes = len * 4; // Float32 = 4 bytes
604
- const quantizedBytes = len + 8; // Int8 = 1 byte + 8 bytes for scale/zeroPoint
605
- const compressionRatio = originalBytes / quantizedBytes;
606
- return { originalBytes, quantizedBytes, compressionRatio };
476
+ var len = embedding.length;
477
+ var originalBytes = len * 4; // Float32 = 4 bytes
478
+ var quantizedBytes = len + 8; // Int8 = 1 byte + 8 bytes for scale/zeroPoint
479
+ var compressionRatio = originalBytes / quantizedBytes;
480
+ return { originalBytes: originalBytes, quantizedBytes: quantizedBytes, compressionRatio: compressionRatio };
607
481
  }
608
482
  // ============================================================================
609
483
  // FLASH ATTENTION-STYLE BATCH OPERATIONS (V8-Optimized)
@@ -614,24 +488,24 @@ export function getQuantizationStats(embedding) {
614
488
  * ~50μs per 1000 vectors (384-dim)
615
489
  */
616
490
  export function batchCosineSim(query, vectors) {
617
- const n = vectors.length;
618
- const scores = new Float32Array(n);
491
+ var n = vectors.length;
492
+ var scores = new Float32Array(n);
619
493
  if (n === 0 || query.length === 0)
620
494
  return scores;
621
495
  // Pre-compute query norm
622
- let queryNorm = 0;
623
- for (let i = 0; i < query.length; i++) {
496
+ var queryNorm = 0;
497
+ for (var i = 0; i < query.length; i++) {
624
498
  queryNorm += query[i] * query[i];
625
499
  }
626
500
  queryNorm = Math.sqrt(queryNorm);
627
501
  if (queryNorm === 0)
628
502
  return scores;
629
503
  // Compute similarities
630
- for (let v = 0; v < n; v++) {
631
- const vec = vectors[v];
632
- const len = Math.min(query.length, vec.length);
633
- let dot = 0, vecNorm = 0;
634
- for (let i = 0; i < len; i++) {
504
+ for (var v = 0; v < n; v++) {
505
+ var vec = vectors[v];
506
+ var len = Math.min(query.length, vec.length);
507
+ var dot = 0, vecNorm = 0;
508
+ for (var i = 0; i < len; i++) {
635
509
  dot += query[i] * vec[i];
636
510
  vecNorm += vec[i] * vec[i];
637
511
  }
@@ -644,26 +518,27 @@ export function batchCosineSim(query, vectors) {
644
518
  * Softmax normalization for attention scores
645
519
  * Numerically stable implementation
646
520
  */
647
- export function softmaxAttention(scores, temperature = 1.0) {
648
- const n = scores.length;
649
- const result = new Float32Array(n);
521
+ export function softmaxAttention(scores, temperature) {
522
+ if (temperature === void 0) { temperature = 1.0; }
523
+ var n = scores.length;
524
+ var result = new Float32Array(n);
650
525
  if (n === 0)
651
526
  return result;
652
527
  // Find max for numerical stability
653
- let max = scores[0];
654
- for (let i = 1; i < n; i++) {
528
+ var max = scores[0];
529
+ for (var i = 1; i < n; i++) {
655
530
  if (scores[i] > max)
656
531
  max = scores[i];
657
532
  }
658
533
  // Compute exp and sum
659
- let sum = 0;
660
- for (let i = 0; i < n; i++) {
534
+ var sum = 0;
535
+ for (var i = 0; i < n; i++) {
661
536
  result[i] = Math.exp((scores[i] - max) / temperature);
662
537
  sum += result[i];
663
538
  }
664
539
  // Normalize
665
540
  if (sum > 0) {
666
- for (let i = 0; i < n; i++) {
541
+ for (var i = 0; i < n; i++) {
667
542
  result[i] /= sum;
668
543
  }
669
544
  }
@@ -674,23 +549,24 @@ export function softmaxAttention(scores, temperature = 1.0) {
674
549
  * More efficient than full sort for small k
675
550
  */
676
551
  export function topKIndices(scores, k) {
677
- const n = scores.length;
552
+ var _a, _b;
553
+ var n = scores.length;
678
554
  if (k >= n) {
679
555
  // Return all indices sorted by score
680
- return Array.from({ length: n }, (_, i) => i)
681
- .sort((a, b) => scores[b] - scores[a]);
556
+ return Array.from({ length: n }, function (_, i) { return i; })
557
+ .sort(function (a, b) { return scores[b] - scores[a]; });
682
558
  }
683
559
  // Build min-heap of size k
684
- const heap = [];
685
- for (let i = 0; i < n; i++) {
560
+ var heap = [];
561
+ for (var i = 0; i < n; i++) {
686
562
  if (heap.length < k) {
687
563
  heap.push({ idx: i, score: scores[i] });
688
564
  // Bubble up
689
- let j = heap.length - 1;
565
+ var j = heap.length - 1;
690
566
  while (j > 0) {
691
- const parent = Math.floor((j - 1) / 2);
567
+ var parent = Math.floor((j - 1) / 2);
692
568
  if (heap[j].score < heap[parent].score) {
693
- [heap[j], heap[parent]] = [heap[parent], heap[j]];
569
+ _a = [heap[parent], heap[j]], heap[j] = _a[0], heap[parent] = _a[1];
694
570
  j = parent;
695
571
  }
696
572
  else
@@ -700,45 +576,46 @@ export function topKIndices(scores, k) {
700
576
  else if (scores[i] > heap[0].score) {
701
577
  // Replace min and heapify down
702
578
  heap[0] = { idx: i, score: scores[i] };
703
- let j = 0;
579
+ var j = 0;
704
580
  while (true) {
705
- const left = 2 * j + 1, right = 2 * j + 2;
706
- let smallest = j;
581
+ var left = 2 * j + 1, right = 2 * j + 2;
582
+ var smallest = j;
707
583
  if (left < k && heap[left].score < heap[smallest].score)
708
584
  smallest = left;
709
585
  if (right < k && heap[right].score < heap[smallest].score)
710
586
  smallest = right;
711
587
  if (smallest === j)
712
588
  break;
713
- [heap[j], heap[smallest]] = [heap[smallest], heap[j]];
589
+ _b = [heap[smallest], heap[j]], heap[j] = _b[0], heap[smallest] = _b[1];
714
590
  j = smallest;
715
591
  }
716
592
  }
717
593
  }
718
594
  // Extract and sort descending
719
- return heap.sort((a, b) => b.score - a.score).map(h => h.idx);
595
+ return heap.sort(function (a, b) { return b.score - a.score; }).map(function (h) { return h.idx; });
720
596
  }
721
597
  /**
722
598
  * Flash Attention-style search
723
599
  * Combines batch similarity, softmax, and top-k in one pass
724
600
  * Returns indices and attention weights
725
601
  */
726
- export function flashAttentionSearch(query, vectors, options = {}) {
727
- const { k = 10, temperature = 1.0, threshold = 0 } = options;
602
+ export function flashAttentionSearch(query, vectors, options) {
603
+ if (options === void 0) { options = {}; }
604
+ var _a = options.k, k = _a === void 0 ? 10 : _a, _b = options.temperature, temperature = _b === void 0 ? 1.0 : _b, _c = options.threshold, threshold = _c === void 0 ? 0 : _c;
728
605
  // Compute batch similarity
729
- const scores = batchCosineSim(query, vectors);
606
+ var scores = batchCosineSim(query, vectors);
730
607
  // Get top-k indices
731
- const indices = topKIndices(scores, k);
608
+ var indices = topKIndices(scores, k);
732
609
  // Filter by threshold
733
- const filtered = indices.filter(i => scores[i] >= threshold);
610
+ var filtered = indices.filter(function (i) { return scores[i] >= threshold; });
734
611
  // Extract scores for filtered results
735
- const topScores = new Float32Array(filtered.length);
736
- for (let i = 0; i < filtered.length; i++) {
612
+ var topScores = new Float32Array(filtered.length);
613
+ for (var i = 0; i < filtered.length; i++) {
737
614
  topScores[i] = scores[filtered[i]];
738
615
  }
739
616
  // Compute attention weights (softmax over top-k)
740
- const weights = softmaxAttention(topScores, temperature);
741
- return { indices: filtered, scores: topScores, weights };
617
+ var weights = softmaxAttention(topScores, temperature);
618
+ return { indices: filtered, scores: topScores, weights: weights };
742
619
  }
743
620
  // ============================================================================
744
621
  // METADATA AND INITIALIZATION
@@ -747,510 +624,734 @@ export function flashAttentionSearch(query, vectors, options = {}) {
747
624
  * Initial metadata to insert after schema creation
748
625
  */
749
626
  export function getInitialMetadata(backend) {
750
- return `
751
- INSERT OR REPLACE INTO metadata (key, value) VALUES
752
- ('schema_version', '3.0.0'),
753
- ('backend', '${backend}'),
754
- ('created_at', '${new Date().toISOString()}'),
755
- ('sql_js', 'true'),
756
- ('vector_embeddings', 'enabled'),
757
- ('pattern_learning', 'enabled'),
758
- ('temporal_decay', 'enabled'),
759
- ('hnsw_indexing', 'enabled');
760
-
761
- -- Create default vector index configuration
762
- INSERT OR IGNORE INTO vector_indexes (id, name, dimensions) VALUES
763
- ('default', 'default', 768),
764
- ('patterns', 'patterns', 768);
765
- `;
627
+ return "\nINSERT OR REPLACE INTO metadata (key, value) VALUES\n ('schema_version', '3.0.0'),\n ('backend', '" + backend + "'),\n ('created_at', '" + new Date().toISOString() + "'),\n ('sql_js', 'true'),\n ('vector_embeddings', 'enabled'),\n ('pattern_learning', 'enabled'),\n ('temporal_decay', 'enabled'),\n ('hnsw_indexing', 'enabled');\n\n-- Create default vector index configuration\nINSERT OR IGNORE INTO vector_indexes (id, name, dimensions) VALUES\n ('default', 'default', 768),\n ('patterns', 'patterns', 768);\n";
766
628
  }
767
629
  /**
768
630
  * Ensure memory_entries table has all required columns
769
631
  * Adds missing columns for older databases (e.g., 'content' column)
770
632
  */
771
- export async function ensureSchemaColumns(dbPath) {
772
- const columnsAdded = [];
773
- try {
774
- if (!fs.existsSync(dbPath)) {
775
- return { success: true, columnsAdded: [] };
776
- }
777
- const initSqlJs = (await import('sql.js')).default;
778
- const SQL = await initSqlJs();
779
- const fileBuffer = fs.readFileSync(dbPath);
780
- const db = new SQL.Database(fileBuffer);
781
- // Get current columns in memory_entries
782
- const tableInfo = db.exec("PRAGMA table_info(memory_entries)");
783
- const existingColumns = new Set(tableInfo[0]?.values?.map(row => row[1]) || []);
784
- // Required columns that may be missing in older schemas
785
- // Issue #977: 'type' column was missing from this list, causing store failures on older DBs
786
- const requiredColumns = [
787
- { name: 'content', definition: "content TEXT DEFAULT ''" },
788
- { name: 'type', definition: "type TEXT DEFAULT 'semantic'" },
789
- { name: 'embedding', definition: 'embedding TEXT' },
790
- { name: 'embedding_model', definition: "embedding_model TEXT DEFAULT 'local'" },
791
- { name: 'embedding_dimensions', definition: 'embedding_dimensions INTEGER' },
792
- { name: 'tags', definition: 'tags TEXT' },
793
- { name: 'metadata', definition: 'metadata TEXT' },
794
- { name: 'owner_id', definition: 'owner_id TEXT' },
795
- { name: 'expires_at', definition: 'expires_at INTEGER' },
796
- { name: 'last_accessed_at', definition: 'last_accessed_at INTEGER' },
797
- { name: 'access_count', definition: 'access_count INTEGER DEFAULT 0' },
798
- { name: 'status', definition: "status TEXT DEFAULT 'active'" }
799
- ];
800
- let modified = false;
801
- for (const col of requiredColumns) {
802
- if (!existingColumns.has(col.name)) {
803
- try {
804
- db.run(`ALTER TABLE memory_entries ADD COLUMN ${col.definition}`);
805
- columnsAdded.push(col.name);
806
- modified = true;
807
- }
808
- catch (e) {
809
- // Column might already exist or other error - continue
810
- }
633
+ export function ensureSchemaColumns(dbPath) {
634
+ var _a, _b;
635
+ return __awaiter(this, void 0, Promise, function () {
636
+ var columnsAdded, initSqlJs, SQL, fileBuffer, db, tableInfo, existingColumns, requiredColumns, modified, _i, requiredColumns_1, col, data, error_1;
637
+ return __generator(this, function (_c) {
638
+ switch (_c.label) {
639
+ case 0:
640
+ columnsAdded = [];
641
+ _c.label = 1;
642
+ case 1:
643
+ _c.trys.push([1, 4, , 5]);
644
+ if (!fs.existsSync(dbPath)) {
645
+ return [2 /*return*/, { success: true, columnsAdded: [] }];
646
+ }
647
+ return [4 /*yield*/, import('sql.js')];
648
+ case 2:
649
+ initSqlJs = (_c.sent())["default"];
650
+ return [4 /*yield*/, initSqlJs()];
651
+ case 3:
652
+ SQL = _c.sent();
653
+ fileBuffer = fs.readFileSync(dbPath);
654
+ db = new SQL.Database(fileBuffer);
655
+ tableInfo = db.exec("PRAGMA table_info(memory_entries)");
656
+ existingColumns = new Set(((_b = (_a = tableInfo[0]) === null || _a === void 0 ? void 0 : _a.values) === null || _b === void 0 ? void 0 : _b.map(function (row) { return row[1]; })) || []);
657
+ requiredColumns = [
658
+ { name: 'content', definition: "content TEXT DEFAULT ''" },
659
+ { name: 'type', definition: "type TEXT DEFAULT 'semantic'" },
660
+ { name: 'embedding', definition: 'embedding TEXT' },
661
+ { name: 'embedding_model', definition: "embedding_model TEXT DEFAULT 'local'" },
662
+ { name: 'embedding_dimensions', definition: 'embedding_dimensions INTEGER' },
663
+ { name: 'tags', definition: 'tags TEXT' },
664
+ { name: 'metadata', definition: 'metadata TEXT' },
665
+ { name: 'owner_id', definition: 'owner_id TEXT' },
666
+ { name: 'expires_at', definition: 'expires_at INTEGER' },
667
+ { name: 'last_accessed_at', definition: 'last_accessed_at INTEGER' },
668
+ { name: 'access_count', definition: 'access_count INTEGER DEFAULT 0' },
669
+ { name: 'status', definition: "status TEXT DEFAULT 'active'" }
670
+ ];
671
+ modified = false;
672
+ for (_i = 0, requiredColumns_1 = requiredColumns; _i < requiredColumns_1.length; _i++) {
673
+ col = requiredColumns_1[_i];
674
+ if (!existingColumns.has(col.name)) {
675
+ try {
676
+ db.run("ALTER TABLE memory_entries ADD COLUMN " + col.definition);
677
+ columnsAdded.push(col.name);
678
+ modified = true;
679
+ }
680
+ catch (e) {
681
+ // Column might already exist or other error - continue
682
+ }
683
+ }
684
+ }
685
+ if (modified) {
686
+ data = db["export"]();
687
+ fs.writeFileSync(dbPath, Buffer.from(data));
688
+ }
689
+ db.close();
690
+ return [2 /*return*/, { success: true, columnsAdded: columnsAdded }];
691
+ case 4:
692
+ error_1 = _c.sent();
693
+ return [2 /*return*/, {
694
+ success: false,
695
+ columnsAdded: columnsAdded,
696
+ error: error_1 instanceof Error ? error_1.message : String(error_1)
697
+ }];
698
+ case 5: return [2 /*return*/];
811
699
  }
812
- }
813
- if (modified) {
814
- // Save updated database
815
- const data = db.export();
816
- fs.writeFileSync(dbPath, Buffer.from(data));
817
- }
818
- db.close();
819
- return { success: true, columnsAdded };
820
- }
821
- catch (error) {
822
- return {
823
- success: false,
824
- columnsAdded,
825
- error: error instanceof Error ? error.message : String(error)
826
- };
827
- }
700
+ });
701
+ });
828
702
  }
829
703
  /**
830
704
  * Check for legacy database installations and migrate if needed
831
705
  */
832
- export async function checkAndMigrateLegacy(options) {
833
- const { dbPath, verbose = false } = options;
834
- // Check for legacy locations
835
- const legacyPaths = [
836
- path.join(process.cwd(), 'memory.db'),
837
- path.join(process.cwd(), '.claude/memory.db'),
838
- path.join(process.cwd(), 'data/memory.db'),
839
- path.join(process.cwd(), '.claude-flow/memory.db')
840
- ];
841
- for (const legacyPath of legacyPaths) {
842
- if (fs.existsSync(legacyPath) && legacyPath !== dbPath) {
843
- try {
844
- const initSqlJs = (await import('sql.js')).default;
845
- const SQL = await initSqlJs();
846
- const legacyBuffer = fs.readFileSync(legacyPath);
847
- const legacyDb = new SQL.Database(legacyBuffer);
848
- // Check if it has data
849
- const countResult = legacyDb.exec('SELECT COUNT(*) FROM memory_entries');
850
- const count = countResult[0]?.values[0]?.[0] || 0;
851
- // Get version if available
852
- let version = 'unknown';
853
- try {
854
- const versionResult = legacyDb.exec("SELECT value FROM metadata WHERE key='schema_version'");
855
- version = versionResult[0]?.values[0]?.[0] || 'unknown';
856
- }
857
- catch { /* no metadata table */ }
858
- legacyDb.close();
859
- if (count > 0) {
860
- return {
861
- needsMigration: true,
862
- legacyVersion: version,
863
- legacyEntries: count
864
- };
865
- }
706
+ export function checkAndMigrateLegacy(options) {
707
+ var _a, _b, _c, _d;
708
+ return __awaiter(this, void 0, Promise, function () {
709
+ var dbPath, _e, verbose, legacyPaths, _i, legacyPaths_1, legacyPath, initSqlJs, SQL, legacyBuffer, legacyDb, countResult, count, version, versionResult, _f;
710
+ return __generator(this, function (_g) {
711
+ switch (_g.label) {
712
+ case 0:
713
+ dbPath = options.dbPath, _e = options.verbose, verbose = _e === void 0 ? false : _e;
714
+ legacyPaths = [
715
+ path.join(process.cwd(), 'memory.db'),
716
+ path.join(process.cwd(), '.claude/memory.db'),
717
+ path.join(process.cwd(), 'data/memory.db'),
718
+ path.join(process.cwd(), '.claude-flow/memory.db')
719
+ ];
720
+ _i = 0, legacyPaths_1 = legacyPaths;
721
+ _g.label = 1;
722
+ case 1:
723
+ if (!(_i < legacyPaths_1.length)) return [3 /*break*/, 7];
724
+ legacyPath = legacyPaths_1[_i];
725
+ if (!(fs.existsSync(legacyPath) && legacyPath !== dbPath)) return [3 /*break*/, 6];
726
+ _g.label = 2;
727
+ case 2:
728
+ _g.trys.push([2, 5, , 6]);
729
+ return [4 /*yield*/, import('sql.js')];
730
+ case 3:
731
+ initSqlJs = (_g.sent())["default"];
732
+ return [4 /*yield*/, initSqlJs()];
733
+ case 4:
734
+ SQL = _g.sent();
735
+ legacyBuffer = fs.readFileSync(legacyPath);
736
+ legacyDb = new SQL.Database(legacyBuffer);
737
+ countResult = legacyDb.exec('SELECT COUNT(*) FROM memory_entries');
738
+ count = ((_b = (_a = countResult[0]) === null || _a === void 0 ? void 0 : _a.values[0]) === null || _b === void 0 ? void 0 : _b[0]) || 0;
739
+ version = 'unknown';
740
+ try {
741
+ versionResult = legacyDb.exec("SELECT value FROM metadata WHERE key='schema_version'");
742
+ version = ((_d = (_c = versionResult[0]) === null || _c === void 0 ? void 0 : _c.values[0]) === null || _d === void 0 ? void 0 : _d[0]) || 'unknown';
743
+ }
744
+ catch ( /* no metadata table */_h) { /* no metadata table */ }
745
+ legacyDb.close();
746
+ if (count > 0) {
747
+ return [2 /*return*/, {
748
+ needsMigration: true,
749
+ legacyVersion: version,
750
+ legacyEntries: count
751
+ }];
752
+ }
753
+ return [3 /*break*/, 6];
754
+ case 5:
755
+ _f = _g.sent();
756
+ return [3 /*break*/, 6];
757
+ case 6:
758
+ _i++;
759
+ return [3 /*break*/, 1];
760
+ case 7: return [2 /*return*/, { needsMigration: false }];
866
761
  }
867
- catch {
868
- // Not a valid SQLite database, skip
762
+ });
763
+ });
764
+ }
765
+ /**
766
+ * ADR-053: Activate ControllerRegistry so AgentDB v3 controllers
767
+ * (ReasoningBank, SkillLibrary, ExplainableRecall, etc.) are instantiated.
768
+ *
769
+ * Uses the memory-bridge's getControllerRegistry() which lazily creates
770
+ * a singleton ControllerRegistry and initializes it with the given dbPath.
771
+ * After this call, all enabled controllers are ready for immediate use.
772
+ *
773
+ * Failures are isolated: if @claude-flow/memory or agentdb is not installed,
774
+ * this returns an empty result without throwing.
775
+ */
776
+ function activateControllerRegistry(dbPath, verbose) {
777
+ return __awaiter(this, void 0, Promise, function () {
778
+ var startTime, activated, failed, bridge, registry, controllers, _i, controllers_1, ctrl, _a;
779
+ return __generator(this, function (_b) {
780
+ switch (_b.label) {
781
+ case 0:
782
+ startTime = performance.now();
783
+ activated = [];
784
+ failed = [];
785
+ _b.label = 1;
786
+ case 1:
787
+ _b.trys.push([1, 4, , 5]);
788
+ return [4 /*yield*/, getBridge()];
789
+ case 2:
790
+ bridge = _b.sent();
791
+ if (!bridge) {
792
+ return [2 /*return*/, { activated: activated, failed: failed, initTimeMs: performance.now() - startTime }];
793
+ }
794
+ return [4 /*yield*/, bridge.getControllerRegistry(dbPath)];
795
+ case 3:
796
+ registry = _b.sent();
797
+ if (!registry) {
798
+ return [2 /*return*/, { activated: activated, failed: failed, initTimeMs: performance.now() - startTime }];
799
+ }
800
+ // Collect controller status from the registry
801
+ if (typeof registry.listControllers === 'function') {
802
+ controllers = registry.listControllers();
803
+ for (_i = 0, controllers_1 = controllers; _i < controllers_1.length; _i++) {
804
+ ctrl = controllers_1[_i];
805
+ if (ctrl.enabled) {
806
+ activated.push(ctrl.name);
807
+ }
808
+ else {
809
+ failed.push(ctrl.name);
810
+ }
811
+ }
812
+ }
813
+ if (verbose && activated.length > 0) {
814
+ console.log("ControllerRegistry: " + activated.length + " controllers activated");
815
+ }
816
+ return [3 /*break*/, 5];
817
+ case 4:
818
+ _a = _b.sent();
819
+ return [3 /*break*/, 5];
820
+ case 5: return [2 /*return*/, { activated: activated, failed: failed, initTimeMs: performance.now() - startTime }];
869
821
  }
870
- }
871
- }
872
- return { needsMigration: false };
822
+ });
823
+ });
873
824
  }
874
825
  /**
875
826
  * Initialize the memory database properly using sql.js
876
827
  */
877
- export async function initializeMemoryDatabase(options) {
878
- const { backend = 'hybrid', dbPath: customPath, force = false, verbose = false, migrate = true } = options;
879
- const swarmDir = path.join(process.cwd(), '.swarm');
880
- const dbPath = customPath || path.join(swarmDir, 'memory.db');
881
- const dbDir = path.dirname(dbPath);
882
- try {
883
- // Create directory if needed
884
- if (!fs.existsSync(dbDir)) {
885
- fs.mkdirSync(dbDir, { recursive: true });
886
- }
887
- // Check for legacy installations
888
- if (migrate) {
889
- const legacyCheck = await checkAndMigrateLegacy({ dbPath, verbose });
890
- if (legacyCheck.needsMigration && verbose) {
891
- console.log(`Found legacy database (v${legacyCheck.legacyVersion}) with ${legacyCheck.legacyEntries} entries`);
892
- }
893
- }
894
- // Check existing database
895
- if (fs.existsSync(dbPath) && !force) {
896
- return {
897
- success: false,
898
- backend,
899
- dbPath,
900
- schemaVersion: '3.0.0',
901
- tablesCreated: [],
902
- indexesCreated: [],
903
- features: {
904
- vectorEmbeddings: false,
905
- patternLearning: false,
906
- temporalDecay: false,
907
- hnswIndexing: false,
908
- migrationTracking: false
909
- },
910
- error: 'Database already exists. Use --force to reinitialize.'
911
- };
912
- }
913
- // Try to use sql.js (WASM SQLite)
914
- let db;
915
- let usedSqlJs = false;
916
- try {
917
- // Dynamic import of sql.js
918
- const initSqlJs = (await import('sql.js')).default;
919
- const SQL = await initSqlJs();
920
- // Load existing database or create new
921
- if (fs.existsSync(dbPath) && force) {
922
- fs.unlinkSync(dbPath);
923
- }
924
- db = new SQL.Database();
925
- usedSqlJs = true;
926
- }
927
- catch (e) {
928
- // sql.js not available, fall back to writing schema file
929
- if (verbose) {
930
- console.log('sql.js not available, writing schema file for later initialization');
828
+ export function initializeMemoryDatabase(options) {
829
+ return __awaiter(this, void 0, Promise, function () {
830
+ var _a, backend, customPath, _b, force, _c, verbose, _d, migrate, swarmDir, dbPath, dbDir, legacyCheck, db, usedSqlJs, initSqlJs, SQL, e_1, data, buffer, schemaPath, controllerResult, schemaPath, sqliteHeader, controllerResult, error_2;
831
+ return __generator(this, function (_e) {
832
+ switch (_e.label) {
833
+ case 0:
834
+ _a = options.backend, backend = _a === void 0 ? 'hybrid' : _a, customPath = options.dbPath, _b = options.force, force = _b === void 0 ? false : _b, _c = options.verbose, verbose = _c === void 0 ? false : _c, _d = options.migrate, migrate = _d === void 0 ? true : _d;
835
+ swarmDir = path.join(process.cwd(), '.swarm');
836
+ dbPath = customPath || path.join(swarmDir, 'memory.db');
837
+ dbDir = path.dirname(dbPath);
838
+ _e.label = 1;
839
+ case 1:
840
+ _e.trys.push([1, 13, , 14]);
841
+ // Create directory if needed
842
+ if (!fs.existsSync(dbDir)) {
843
+ fs.mkdirSync(dbDir, { recursive: true });
844
+ }
845
+ if (!migrate) return [3 /*break*/, 3];
846
+ return [4 /*yield*/, checkAndMigrateLegacy({ dbPath: dbPath, verbose: verbose })];
847
+ case 2:
848
+ legacyCheck = _e.sent();
849
+ if (legacyCheck.needsMigration && verbose) {
850
+ console.log("Found legacy database (v" + legacyCheck.legacyVersion + ") with " + legacyCheck.legacyEntries + " entries");
851
+ }
852
+ _e.label = 3;
853
+ case 3:
854
+ // Check existing database
855
+ if (fs.existsSync(dbPath) && !force) {
856
+ return [2 /*return*/, {
857
+ success: false,
858
+ backend: backend,
859
+ dbPath: dbPath,
860
+ schemaVersion: '3.0.0',
861
+ tablesCreated: [],
862
+ indexesCreated: [],
863
+ features: {
864
+ vectorEmbeddings: false,
865
+ patternLearning: false,
866
+ temporalDecay: false,
867
+ hnswIndexing: false,
868
+ migrationTracking: false
869
+ },
870
+ error: 'Database already exists. Use --force to reinitialize.'
871
+ }];
872
+ }
873
+ db = void 0;
874
+ usedSqlJs = false;
875
+ _e.label = 4;
876
+ case 4:
877
+ _e.trys.push([4, 7, , 8]);
878
+ return [4 /*yield*/, import('sql.js')];
879
+ case 5:
880
+ initSqlJs = (_e.sent())["default"];
881
+ return [4 /*yield*/, initSqlJs()];
882
+ case 6:
883
+ SQL = _e.sent();
884
+ // Load existing database or create new
885
+ if (fs.existsSync(dbPath) && force) {
886
+ fs.unlinkSync(dbPath);
887
+ }
888
+ db = new SQL.Database();
889
+ usedSqlJs = true;
890
+ return [3 /*break*/, 8];
891
+ case 7:
892
+ e_1 = _e.sent();
893
+ // sql.js not available, fall back to writing schema file
894
+ if (verbose) {
895
+ console.log('sql.js not available, writing schema file for later initialization');
896
+ }
897
+ return [3 /*break*/, 8];
898
+ case 8:
899
+ if (!(usedSqlJs && db)) return [3 /*break*/, 10];
900
+ // Execute schema
901
+ db.run(MEMORY_SCHEMA_V3);
902
+ // Insert initial metadata
903
+ db.run(getInitialMetadata(backend));
904
+ data = db["export"]();
905
+ buffer = Buffer.from(data);
906
+ fs.writeFileSync(dbPath, buffer);
907
+ // Close database
908
+ db.close();
909
+ schemaPath = path.join(dbDir, 'schema.sql');
910
+ fs.writeFileSync(schemaPath, MEMORY_SCHEMA_V3 + '\n' + getInitialMetadata(backend));
911
+ return [4 /*yield*/, activateControllerRegistry(dbPath, verbose)];
912
+ case 9:
913
+ controllerResult = _e.sent();
914
+ return [2 /*return*/, {
915
+ success: true,
916
+ backend: backend,
917
+ dbPath: dbPath,
918
+ schemaVersion: '3.0.0',
919
+ tablesCreated: [
920
+ 'memory_entries',
921
+ 'patterns',
922
+ 'pattern_history',
923
+ 'trajectories',
924
+ 'trajectory_steps',
925
+ 'migration_state',
926
+ 'sessions',
927
+ 'vector_indexes',
928
+ 'metadata'
929
+ ],
930
+ indexesCreated: [
931
+ 'idx_memory_namespace',
932
+ 'idx_memory_key',
933
+ 'idx_memory_type',
934
+ 'idx_memory_status',
935
+ 'idx_memory_created',
936
+ 'idx_memory_accessed',
937
+ 'idx_memory_owner',
938
+ 'idx_patterns_type',
939
+ 'idx_patterns_confidence',
940
+ 'idx_patterns_status',
941
+ 'idx_patterns_last_matched',
942
+ 'idx_pattern_history_pattern',
943
+ 'idx_steps_trajectory'
944
+ ],
945
+ features: {
946
+ vectorEmbeddings: true,
947
+ patternLearning: true,
948
+ temporalDecay: true,
949
+ hnswIndexing: true,
950
+ migrationTracking: true
951
+ },
952
+ controllers: controllerResult
953
+ }];
954
+ case 10:
955
+ schemaPath = path.join(dbDir, 'schema.sql');
956
+ fs.writeFileSync(schemaPath, MEMORY_SCHEMA_V3 + '\n' + getInitialMetadata(backend));
957
+ sqliteHeader = Buffer.alloc(4096, 0);
958
+ // SQLite format 3 header
959
+ Buffer.from('SQLite format 3\0').copy(sqliteHeader, 0);
960
+ sqliteHeader[16] = 0x10; // page size high byte (4096)
961
+ sqliteHeader[17] = 0x00; // page size low byte
962
+ sqliteHeader[18] = 0x01; // file format write version
963
+ sqliteHeader[19] = 0x01; // file format read version
964
+ sqliteHeader[24] = 0x00; // max embedded payload
965
+ sqliteHeader[25] = 0x40;
966
+ sqliteHeader[26] = 0x20; // min embedded payload
967
+ sqliteHeader[27] = 0x20; // leaf payload
968
+ fs.writeFileSync(dbPath, sqliteHeader);
969
+ return [4 /*yield*/, activateControllerRegistry(dbPath, verbose)];
970
+ case 11:
971
+ controllerResult = _e.sent();
972
+ return [2 /*return*/, {
973
+ success: true,
974
+ backend: backend,
975
+ dbPath: dbPath,
976
+ schemaVersion: '3.0.0',
977
+ tablesCreated: [
978
+ 'memory_entries (pending)',
979
+ 'patterns (pending)',
980
+ 'pattern_history (pending)',
981
+ 'trajectories (pending)',
982
+ 'trajectory_steps (pending)',
983
+ 'migration_state (pending)',
984
+ 'sessions (pending)',
985
+ 'vector_indexes (pending)',
986
+ 'metadata (pending)'
987
+ ],
988
+ indexesCreated: [],
989
+ features: {
990
+ vectorEmbeddings: true,
991
+ patternLearning: true,
992
+ temporalDecay: true,
993
+ hnswIndexing: true,
994
+ migrationTracking: true
995
+ },
996
+ controllers: controllerResult
997
+ }];
998
+ case 12: return [3 /*break*/, 14];
999
+ case 13:
1000
+ error_2 = _e.sent();
1001
+ return [2 /*return*/, {
1002
+ success: false,
1003
+ backend: backend,
1004
+ dbPath: dbPath,
1005
+ schemaVersion: '3.0.0',
1006
+ tablesCreated: [],
1007
+ indexesCreated: [],
1008
+ features: {
1009
+ vectorEmbeddings: false,
1010
+ patternLearning: false,
1011
+ temporalDecay: false,
1012
+ hnswIndexing: false,
1013
+ migrationTracking: false
1014
+ },
1015
+ error: error_2 instanceof Error ? error_2.message : String(error_2)
1016
+ }];
1017
+ case 14: return [2 /*return*/];
931
1018
  }
932
- }
933
- if (usedSqlJs && db) {
934
- // Execute schema
935
- db.run(MEMORY_SCHEMA_V3);
936
- // Insert initial metadata
937
- db.run(getInitialMetadata(backend));
938
- // Save to file
939
- const data = db.export();
940
- const buffer = Buffer.from(data);
941
- fs.writeFileSync(dbPath, buffer);
942
- // Close database
943
- db.close();
944
- // Also create schema file for reference
945
- const schemaPath = path.join(dbDir, 'schema.sql');
946
- fs.writeFileSync(schemaPath, MEMORY_SCHEMA_V3 + '\n' + getInitialMetadata(backend));
947
- return {
948
- success: true,
949
- backend,
950
- dbPath,
951
- schemaVersion: '3.0.0',
952
- tablesCreated: [
953
- 'memory_entries',
954
- 'patterns',
955
- 'pattern_history',
956
- 'trajectories',
957
- 'trajectory_steps',
958
- 'migration_state',
959
- 'sessions',
960
- 'vector_indexes',
961
- 'metadata'
962
- ],
963
- indexesCreated: [
964
- 'idx_memory_namespace',
965
- 'idx_memory_key',
966
- 'idx_memory_type',
967
- 'idx_memory_status',
968
- 'idx_memory_created',
969
- 'idx_memory_accessed',
970
- 'idx_memory_owner',
971
- 'idx_patterns_type',
972
- 'idx_patterns_confidence',
973
- 'idx_patterns_status',
974
- 'idx_patterns_last_matched',
975
- 'idx_pattern_history_pattern',
976
- 'idx_steps_trajectory'
977
- ],
978
- features: {
979
- vectorEmbeddings: true,
980
- patternLearning: true,
981
- temporalDecay: true,
982
- hnswIndexing: true,
983
- migrationTracking: true
984
- }
985
- };
986
- }
987
- else {
988
- // Fall back to schema file approach
989
- const schemaPath = path.join(dbDir, 'schema.sql');
990
- fs.writeFileSync(schemaPath, MEMORY_SCHEMA_V3 + '\n' + getInitialMetadata(backend));
991
- // Create minimal valid SQLite file
992
- const sqliteHeader = Buffer.alloc(4096, 0);
993
- // SQLite format 3 header
994
- Buffer.from('SQLite format 3\0').copy(sqliteHeader, 0);
995
- sqliteHeader[16] = 0x10; // page size high byte (4096)
996
- sqliteHeader[17] = 0x00; // page size low byte
997
- sqliteHeader[18] = 0x01; // file format write version
998
- sqliteHeader[19] = 0x01; // file format read version
999
- sqliteHeader[24] = 0x00; // max embedded payload
1000
- sqliteHeader[25] = 0x40;
1001
- sqliteHeader[26] = 0x20; // min embedded payload
1002
- sqliteHeader[27] = 0x20; // leaf payload
1003
- fs.writeFileSync(dbPath, sqliteHeader);
1004
- return {
1005
- success: true,
1006
- backend,
1007
- dbPath,
1008
- schemaVersion: '3.0.0',
1009
- tablesCreated: [
1010
- 'memory_entries (pending)',
1011
- 'patterns (pending)',
1012
- 'pattern_history (pending)',
1013
- 'trajectories (pending)',
1014
- 'trajectory_steps (pending)',
1015
- 'migration_state (pending)',
1016
- 'sessions (pending)',
1017
- 'vector_indexes (pending)',
1018
- 'metadata (pending)'
1019
- ],
1020
- indexesCreated: [],
1021
- features: {
1022
- vectorEmbeddings: true,
1023
- patternLearning: true,
1024
- temporalDecay: true,
1025
- hnswIndexing: true,
1026
- migrationTracking: true
1027
- }
1028
- };
1029
- }
1030
- }
1031
- catch (error) {
1032
- return {
1033
- success: false,
1034
- backend,
1035
- dbPath,
1036
- schemaVersion: '3.0.0',
1037
- tablesCreated: [],
1038
- indexesCreated: [],
1039
- features: {
1040
- vectorEmbeddings: false,
1041
- patternLearning: false,
1042
- temporalDecay: false,
1043
- hnswIndexing: false,
1044
- migrationTracking: false
1045
- },
1046
- error: error instanceof Error ? error.message : String(error)
1047
- };
1048
- }
1019
+ });
1020
+ });
1049
1021
  }
1050
1022
  /**
1051
1023
  * Check if memory database is properly initialized
1052
1024
  */
1053
- export async function checkMemoryInitialization(dbPath) {
1054
- const swarmDir = path.join(process.cwd(), '.swarm');
1055
- const path_ = dbPath || path.join(swarmDir, 'memory.db');
1056
- if (!fs.existsSync(path_)) {
1057
- return { initialized: false };
1058
- }
1059
- try {
1060
- // Try to load with sql.js
1061
- const initSqlJs = (await import('sql.js')).default;
1062
- const SQL = await initSqlJs();
1063
- const fileBuffer = fs.readFileSync(path_);
1064
- const db = new SQL.Database(fileBuffer);
1065
- // Check for metadata table
1066
- const tables = db.exec("SELECT name FROM sqlite_master WHERE type='table'");
1067
- const tableNames = tables[0]?.values?.map(v => v[0]) || [];
1068
- // Get version
1069
- let version = 'unknown';
1070
- let backend = 'unknown';
1071
- try {
1072
- const versionResult = db.exec("SELECT value FROM metadata WHERE key='schema_version'");
1073
- version = versionResult[0]?.values[0]?.[0] || 'unknown';
1074
- const backendResult = db.exec("SELECT value FROM metadata WHERE key='backend'");
1075
- backend = backendResult[0]?.values[0]?.[0] || 'unknown';
1076
- }
1077
- catch {
1078
- // Metadata table might not exist
1079
- }
1080
- db.close();
1081
- return {
1082
- initialized: true,
1083
- version,
1084
- backend,
1085
- features: {
1086
- vectorEmbeddings: tableNames.includes('vector_indexes'),
1087
- patternLearning: tableNames.includes('patterns'),
1088
- temporalDecay: tableNames.includes('pattern_history')
1089
- },
1090
- tables: tableNames
1091
- };
1092
- }
1093
- catch {
1094
- // Could not read database
1095
- return { initialized: false };
1096
- }
1025
+ export function checkMemoryInitialization(dbPath) {
1026
+ var _a, _b, _c, _d, _e, _f;
1027
+ return __awaiter(this, void 0, Promise, function () {
1028
+ var swarmDir, path_, initSqlJs, SQL, fileBuffer, db, tables, tableNames, version, backend, versionResult, backendResult, _g;
1029
+ return __generator(this, function (_h) {
1030
+ switch (_h.label) {
1031
+ case 0:
1032
+ swarmDir = path.join(process.cwd(), '.swarm');
1033
+ path_ = dbPath || path.join(swarmDir, 'memory.db');
1034
+ if (!fs.existsSync(path_)) {
1035
+ return [2 /*return*/, { initialized: false }];
1036
+ }
1037
+ _h.label = 1;
1038
+ case 1:
1039
+ _h.trys.push([1, 4, , 5]);
1040
+ return [4 /*yield*/, import('sql.js')];
1041
+ case 2:
1042
+ initSqlJs = (_h.sent())["default"];
1043
+ return [4 /*yield*/, initSqlJs()];
1044
+ case 3:
1045
+ SQL = _h.sent();
1046
+ fileBuffer = fs.readFileSync(path_);
1047
+ db = new SQL.Database(fileBuffer);
1048
+ tables = db.exec("SELECT name FROM sqlite_master WHERE type='table'");
1049
+ tableNames = ((_b = (_a = tables[0]) === null || _a === void 0 ? void 0 : _a.values) === null || _b === void 0 ? void 0 : _b.map(function (v) { return v[0]; })) || [];
1050
+ version = 'unknown';
1051
+ backend = 'unknown';
1052
+ try {
1053
+ versionResult = db.exec("SELECT value FROM metadata WHERE key='schema_version'");
1054
+ version = ((_d = (_c = versionResult[0]) === null || _c === void 0 ? void 0 : _c.values[0]) === null || _d === void 0 ? void 0 : _d[0]) || 'unknown';
1055
+ backendResult = db.exec("SELECT value FROM metadata WHERE key='backend'");
1056
+ backend = ((_f = (_e = backendResult[0]) === null || _e === void 0 ? void 0 : _e.values[0]) === null || _f === void 0 ? void 0 : _f[0]) || 'unknown';
1057
+ }
1058
+ catch (_j) {
1059
+ // Metadata table might not exist
1060
+ }
1061
+ db.close();
1062
+ return [2 /*return*/, {
1063
+ initialized: true,
1064
+ version: version,
1065
+ backend: backend,
1066
+ features: {
1067
+ vectorEmbeddings: tableNames.includes('vector_indexes'),
1068
+ patternLearning: tableNames.includes('patterns'),
1069
+ temporalDecay: tableNames.includes('pattern_history')
1070
+ },
1071
+ tables: tableNames
1072
+ }];
1073
+ case 4:
1074
+ _g = _h.sent();
1075
+ // Could not read database
1076
+ return [2 /*return*/, { initialized: false }];
1077
+ case 5: return [2 /*return*/];
1078
+ }
1079
+ });
1080
+ });
1097
1081
  }
1098
1082
  /**
1099
1083
  * Apply temporal decay to patterns
1100
1084
  * Reduces confidence of patterns that haven't been used recently
1101
1085
  */
1102
- export async function applyTemporalDecay(dbPath) {
1103
- const swarmDir = path.join(process.cwd(), '.swarm');
1104
- const path_ = dbPath || path.join(swarmDir, 'memory.db');
1105
- try {
1106
- const initSqlJs = (await import('sql.js')).default;
1107
- const SQL = await initSqlJs();
1108
- const fileBuffer = fs.readFileSync(path_);
1109
- const db = new SQL.Database(fileBuffer);
1110
- // Apply decay: confidence *= exp(-decay_rate * days_since_last_use)
1111
- const now = Date.now();
1112
- const decayQuery = `
1113
- UPDATE patterns
1114
- SET
1115
- confidence = confidence * (1.0 - decay_rate * ((? - COALESCE(last_matched_at, created_at)) / 86400000.0)),
1116
- updated_at = ?
1117
- WHERE status = 'active'
1118
- AND confidence > 0.1
1119
- AND (? - COALESCE(last_matched_at, created_at)) > 86400000
1120
- `;
1121
- db.run(decayQuery, [now, now, now]);
1122
- const changes = db.getRowsModified();
1123
- // Save
1124
- const data = db.export();
1125
- fs.writeFileSync(path_, Buffer.from(data));
1126
- db.close();
1127
- return {
1128
- success: true,
1129
- patternsDecayed: changes
1130
- };
1131
- }
1132
- catch (error) {
1133
- return {
1134
- success: false,
1135
- patternsDecayed: 0,
1136
- error: error instanceof Error ? error.message : String(error)
1137
- };
1138
- }
1086
+ export function applyTemporalDecay(dbPath) {
1087
+ return __awaiter(this, void 0, Promise, function () {
1088
+ var swarmDir, path_, initSqlJs, SQL, fileBuffer, db, now, decayQuery, changes, data, error_3;
1089
+ return __generator(this, function (_a) {
1090
+ switch (_a.label) {
1091
+ case 0:
1092
+ swarmDir = path.join(process.cwd(), '.swarm');
1093
+ path_ = dbPath || path.join(swarmDir, 'memory.db');
1094
+ _a.label = 1;
1095
+ case 1:
1096
+ _a.trys.push([1, 4, , 5]);
1097
+ return [4 /*yield*/, import('sql.js')];
1098
+ case 2:
1099
+ initSqlJs = (_a.sent())["default"];
1100
+ return [4 /*yield*/, initSqlJs()];
1101
+ case 3:
1102
+ SQL = _a.sent();
1103
+ fileBuffer = fs.readFileSync(path_);
1104
+ db = new SQL.Database(fileBuffer);
1105
+ now = Date.now();
1106
+ decayQuery = "\n UPDATE patterns\n SET\n confidence = confidence * (1.0 - decay_rate * ((? - COALESCE(last_matched_at, created_at)) / 86400000.0)),\n updated_at = ?\n WHERE status = 'active'\n AND confidence > 0.1\n AND (? - COALESCE(last_matched_at, created_at)) > 86400000\n ";
1107
+ db.run(decayQuery, [now, now, now]);
1108
+ changes = db.getRowsModified();
1109
+ data = db["export"]();
1110
+ fs.writeFileSync(path_, Buffer.from(data));
1111
+ db.close();
1112
+ return [2 /*return*/, {
1113
+ success: true,
1114
+ patternsDecayed: changes
1115
+ }];
1116
+ case 4:
1117
+ error_3 = _a.sent();
1118
+ return [2 /*return*/, {
1119
+ success: false,
1120
+ patternsDecayed: 0,
1121
+ error: error_3 instanceof Error ? error_3.message : String(error_3)
1122
+ }];
1123
+ case 5: return [2 /*return*/];
1124
+ }
1125
+ });
1126
+ });
1139
1127
  }
1140
- let embeddingModelState = null;
1128
+ var embeddingModelState = null;
1141
1129
  /**
1142
1130
  * Lazy load ONNX embedding model
1143
1131
  * Only loads when first embedding is requested
1144
1132
  */
1145
- export async function loadEmbeddingModel(options) {
1146
- const { verbose = false } = options || {};
1147
- const startTime = Date.now();
1148
- // Already loaded
1149
- if (embeddingModelState?.loaded) {
1150
- return {
1151
- success: true,
1152
- dimensions: embeddingModelState.dimensions,
1153
- modelName: 'cached',
1154
- loadTime: 0
1155
- };
1156
- }
1157
- try {
1158
- // Try to import @xenova/transformers for ONNX embeddings
1159
- const transformers = await import('@xenova/transformers').catch(() => null);
1160
- if (transformers) {
1161
- if (verbose) {
1162
- console.log('Loading ONNX embedding model (all-MiniLM-L6-v2)...');
1163
- }
1164
- // Use small, fast model for local embeddings
1165
- const { pipeline } = transformers;
1166
- const embedder = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
1167
- embeddingModelState = {
1168
- loaded: true,
1169
- model: embedder,
1170
- tokenizer: null,
1171
- dimensions: 384 // MiniLM-L6 produces 384-dim vectors
1172
- };
1173
- return {
1174
- success: true,
1175
- dimensions: 384,
1176
- modelName: 'all-MiniLM-L6-v2',
1177
- loadTime: Date.now() - startTime
1178
- };
1179
- }
1180
- // Fallback: Check for agentic-flow ONNX
1181
- const agenticFlow = await import('agentic-flow').catch(() => null);
1182
- if (agenticFlow && agenticFlow.embeddings) {
1183
- if (verbose) {
1184
- console.log('Loading agentic-flow embedding model...');
1133
+ export function loadEmbeddingModel(options) {
1134
+ var _a;
1135
+ return __awaiter(this, void 0, Promise, function () {
1136
+ var _b, verbose, startTime, bridge, bridgeResult, transformers, pipeline, embedder, reasoningBank, ruvector, onnxEmb_1, probe, _c, agenticFlow, error_4;
1137
+ return __generator(this, function (_d) {
1138
+ switch (_d.label) {
1139
+ case 0:
1140
+ _b = (options || {}).verbose, verbose = _b === void 0 ? false : _b;
1141
+ startTime = Date.now();
1142
+ // Already loaded
1143
+ if (embeddingModelState === null || embeddingModelState === void 0 ? void 0 : embeddingModelState.loaded) {
1144
+ return [2 /*return*/, {
1145
+ success: true,
1146
+ dimensions: embeddingModelState.dimensions,
1147
+ modelName: 'cached',
1148
+ loadTime: 0
1149
+ }];
1150
+ }
1151
+ return [4 /*yield*/, getBridge()];
1152
+ case 1:
1153
+ bridge = _d.sent();
1154
+ if (!bridge) return [3 /*break*/, 3];
1155
+ return [4 /*yield*/, bridge.bridgeLoadEmbeddingModel()];
1156
+ case 2:
1157
+ bridgeResult = _d.sent();
1158
+ if (bridgeResult && bridgeResult.success) {
1159
+ // Mark local state as loaded too so subsequent calls use cache
1160
+ embeddingModelState = {
1161
+ loaded: true,
1162
+ model: null,
1163
+ tokenizer: null,
1164
+ dimensions: bridgeResult.dimensions
1165
+ };
1166
+ return [2 /*return*/, bridgeResult];
1167
+ }
1168
+ _d.label = 3;
1169
+ case 3:
1170
+ _d.trys.push([3, 16, , 17]);
1171
+ return [4 /*yield*/, import('@xenova/transformers')["catch"](function () { return null; })];
1172
+ case 4:
1173
+ transformers = _d.sent();
1174
+ if (!transformers) return [3 /*break*/, 6];
1175
+ if (verbose) {
1176
+ console.log('Loading ONNX embedding model (all-MiniLM-L6-v2)...');
1177
+ }
1178
+ pipeline = transformers.pipeline;
1179
+ return [4 /*yield*/, pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2')];
1180
+ case 5:
1181
+ embedder = _d.sent();
1182
+ embeddingModelState = {
1183
+ loaded: true,
1184
+ model: embedder,
1185
+ tokenizer: null,
1186
+ dimensions: 384 // MiniLM-L6 produces 384-dim vectors
1187
+ };
1188
+ return [2 /*return*/, {
1189
+ success: true,
1190
+ dimensions: 384,
1191
+ modelName: 'all-MiniLM-L6-v2',
1192
+ loadTime: Date.now() - startTime
1193
+ }];
1194
+ case 6: return [4 /*yield*/, import('agentic-flow/reasoningbank')["catch"](function () { return null; })];
1195
+ case 7:
1196
+ reasoningBank = _d.sent();
1197
+ if (reasoningBank === null || reasoningBank === void 0 ? void 0 : reasoningBank.computeEmbedding) {
1198
+ if (verbose) {
1199
+ console.log('Loading agentic-flow ReasoningBank embedding model...');
1200
+ }
1201
+ embeddingModelState = {
1202
+ loaded: true,
1203
+ model: { embed: reasoningBank.computeEmbedding },
1204
+ tokenizer: null,
1205
+ dimensions: 768
1206
+ };
1207
+ return [2 /*return*/, {
1208
+ success: true,
1209
+ dimensions: 768,
1210
+ modelName: 'agentic-flow/reasoningbank',
1211
+ loadTime: Date.now() - startTime
1212
+ }];
1213
+ }
1214
+ return [4 /*yield*/, import('ruvector')["catch"](function () { return null; })];
1215
+ case 8:
1216
+ ruvector = _d.sent();
1217
+ if (!(ruvector === null || ruvector === void 0 ? void 0 : ruvector.initOnnxEmbedder)) return [3 /*break*/, 14];
1218
+ _d.label = 9;
1219
+ case 9:
1220
+ _d.trys.push([9, 13, , 14]);
1221
+ return [4 /*yield*/, ruvector.initOnnxEmbedder()];
1222
+ case 10:
1223
+ _d.sent();
1224
+ onnxEmb_1 = (_a = ruvector.getOptimizedOnnxEmbedder) === null || _a === void 0 ? void 0 : _a.call(ruvector);
1225
+ if (!(onnxEmb_1 === null || onnxEmb_1 === void 0 ? void 0 : onnxEmb_1.embed)) return [3 /*break*/, 12];
1226
+ return [4 /*yield*/, onnxEmb_1.embed('test')];
1227
+ case 11:
1228
+ probe = _d.sent();
1229
+ if (probe && probe.length > 0 && (Array.isArray(probe) ? probe.some(function (v) { return v !== 0; }) : true)) {
1230
+ if (verbose) {
1231
+ console.log("Loading ruvector ONNX embedder (all-MiniLM-L6-v2, " + probe.length + "d)...");
1232
+ }
1233
+ embeddingModelState = {
1234
+ loaded: true,
1235
+ model: function (text) { return onnxEmb_1.embed(text); },
1236
+ tokenizer: null,
1237
+ dimensions: probe.length || 384
1238
+ };
1239
+ return [2 /*return*/, {
1240
+ success: true,
1241
+ dimensions: probe.length || 384,
1242
+ modelName: 'ruvector/onnx',
1243
+ loadTime: Date.now() - startTime
1244
+ }];
1245
+ }
1246
+ _d.label = 12;
1247
+ case 12: return [3 /*break*/, 14];
1248
+ case 13:
1249
+ _c = _d.sent();
1250
+ return [3 /*break*/, 14];
1251
+ case 14: return [4 /*yield*/, import('agentic-flow')["catch"](function () { return null; })];
1252
+ case 15:
1253
+ agenticFlow = _d.sent();
1254
+ if (agenticFlow && agenticFlow.embeddings) {
1255
+ if (verbose) {
1256
+ console.log('Loading agentic-flow embedding model...');
1257
+ }
1258
+ embeddingModelState = {
1259
+ loaded: true,
1260
+ model: agenticFlow.embeddings,
1261
+ tokenizer: null,
1262
+ dimensions: 768
1263
+ };
1264
+ return [2 /*return*/, {
1265
+ success: true,
1266
+ dimensions: 768,
1267
+ modelName: 'agentic-flow',
1268
+ loadTime: Date.now() - startTime
1269
+ }];
1270
+ }
1271
+ // No ONNX model available - use fallback
1272
+ embeddingModelState = {
1273
+ loaded: true,
1274
+ model: null,
1275
+ tokenizer: null,
1276
+ dimensions: 128 // Smaller fallback dimensions
1277
+ };
1278
+ return [2 /*return*/, {
1279
+ success: true,
1280
+ dimensions: 128,
1281
+ modelName: 'hash-fallback',
1282
+ loadTime: Date.now() - startTime
1283
+ }];
1284
+ case 16:
1285
+ error_4 = _d.sent();
1286
+ return [2 /*return*/, {
1287
+ success: false,
1288
+ dimensions: 0,
1289
+ modelName: 'none',
1290
+ error: error_4 instanceof Error ? error_4.message : String(error_4)
1291
+ }];
1292
+ case 17: return [2 /*return*/];
1185
1293
  }
1186
- embeddingModelState = {
1187
- loaded: true,
1188
- model: agenticFlow.embeddings,
1189
- tokenizer: null,
1190
- dimensions: 768
1191
- };
1192
- return {
1193
- success: true,
1194
- dimensions: 768,
1195
- modelName: 'agentic-flow',
1196
- loadTime: Date.now() - startTime
1197
- };
1198
- }
1199
- // No ONNX model available - use fallback
1200
- embeddingModelState = {
1201
- loaded: true,
1202
- model: null, // Will use simple hash-based fallback
1203
- tokenizer: null,
1204
- dimensions: 128 // Smaller fallback dimensions
1205
- };
1206
- return {
1207
- success: true,
1208
- dimensions: 128,
1209
- modelName: 'hash-fallback',
1210
- loadTime: Date.now() - startTime
1211
- };
1212
- }
1213
- catch (error) {
1214
- return {
1215
- success: false,
1216
- dimensions: 0,
1217
- modelName: 'none',
1218
- error: error instanceof Error ? error.message : String(error)
1219
- };
1220
- }
1294
+ });
1295
+ });
1221
1296
  }
1222
1297
  /**
1223
1298
  * Generate real embedding for text
1224
1299
  * Uses ONNX model if available, falls back to deterministic hash
1225
1300
  */
1226
- export async function generateEmbedding(text) {
1227
- // Ensure model is loaded
1228
- if (!embeddingModelState?.loaded) {
1229
- await loadEmbeddingModel();
1230
- }
1231
- const state = embeddingModelState;
1232
- // Use ONNX model if available
1233
- if (state.model && typeof state.model === 'function') {
1234
- try {
1235
- const output = await state.model(text, { pooling: 'mean', normalize: true });
1236
- const embedding = Array.from(output.data);
1237
- return {
1238
- embedding,
1239
- dimensions: embedding.length,
1240
- model: 'onnx'
1241
- };
1242
- }
1243
- catch {
1244
- // Fall through to fallback
1245
- }
1246
- }
1247
- // Deterministic hash-based fallback (for testing/demo without ONNX)
1248
- const embedding = generateHashEmbedding(text, state.dimensions);
1249
- return {
1250
- embedding,
1251
- dimensions: state.dimensions,
1252
- model: 'hash-fallback'
1253
- };
1301
+ export function generateEmbedding(text) {
1302
+ return __awaiter(this, void 0, Promise, function () {
1303
+ var bridge, bridgeResult, state, output, embedding_1, _a, embedding;
1304
+ return __generator(this, function (_b) {
1305
+ switch (_b.label) {
1306
+ case 0: return [4 /*yield*/, getBridge()];
1307
+ case 1:
1308
+ bridge = _b.sent();
1309
+ if (!bridge) return [3 /*break*/, 3];
1310
+ return [4 /*yield*/, bridge.bridgeGenerateEmbedding(text)];
1311
+ case 2:
1312
+ bridgeResult = _b.sent();
1313
+ if (bridgeResult)
1314
+ return [2 /*return*/, bridgeResult];
1315
+ _b.label = 3;
1316
+ case 3:
1317
+ if (!!(embeddingModelState === null || embeddingModelState === void 0 ? void 0 : embeddingModelState.loaded)) return [3 /*break*/, 5];
1318
+ return [4 /*yield*/, loadEmbeddingModel()];
1319
+ case 4:
1320
+ _b.sent();
1321
+ _b.label = 5;
1322
+ case 5:
1323
+ state = embeddingModelState;
1324
+ if (!(state.model && typeof state.model === 'function')) return [3 /*break*/, 9];
1325
+ _b.label = 6;
1326
+ case 6:
1327
+ _b.trys.push([6, 8, , 9]);
1328
+ return [4 /*yield*/, state.model(text, { pooling: 'mean', normalize: true })];
1329
+ case 7:
1330
+ output = _b.sent();
1331
+ embedding_1 = (output === null || output === void 0 ? void 0 : output.data)
1332
+ ? Array.from(output.data)
1333
+ : Array.isArray(output) ? output : null;
1334
+ if (embedding_1) {
1335
+ return [2 /*return*/, {
1336
+ embedding: embedding_1,
1337
+ dimensions: embedding_1.length,
1338
+ model: 'onnx'
1339
+ }];
1340
+ }
1341
+ return [3 /*break*/, 9];
1342
+ case 8:
1343
+ _a = _b.sent();
1344
+ return [3 /*break*/, 9];
1345
+ case 9:
1346
+ embedding = generateHashEmbedding(text, state.dimensions);
1347
+ return [2 /*return*/, {
1348
+ embedding: embedding,
1349
+ dimensions: state.dimensions,
1350
+ model: 'hash-fallback'
1351
+ }];
1352
+ }
1353
+ });
1354
+ });
1254
1355
  }
1255
1356
  /**
1256
1357
  * Generate embeddings for multiple texts
@@ -1261,416 +1362,510 @@ export async function generateEmbedding(text) {
1261
1362
  * @param options - Batch options
1262
1363
  * @returns Array of embedding results with timing info
1263
1364
  */
1264
- export async function generateBatchEmbeddings(texts, options) {
1265
- const { concurrency = texts.length, onProgress } = options || {};
1266
- const startTime = Date.now();
1267
- // Ensure model is loaded first (prevents cold start in parallel)
1268
- if (!embeddingModelState?.loaded) {
1269
- await loadEmbeddingModel();
1270
- }
1271
- // Process in parallel with optional concurrency limit
1272
- if (concurrency >= texts.length) {
1273
- // Full parallelism
1274
- const embeddings = await Promise.all(texts.map(async (text, i) => {
1275
- const result = await generateEmbedding(text);
1276
- onProgress?.(i + 1, texts.length);
1277
- return { text, ...result };
1278
- }));
1279
- const totalTime = Date.now() - startTime;
1280
- return {
1281
- results: embeddings,
1282
- totalTime,
1283
- avgTime: totalTime / texts.length
1284
- };
1285
- }
1286
- // Limited concurrency using chunking
1287
- const results = [];
1288
- let completed = 0;
1289
- for (let i = 0; i < texts.length; i += concurrency) {
1290
- const chunk = texts.slice(i, i + concurrency);
1291
- const chunkResults = await Promise.all(chunk.map(async (text) => {
1292
- const result = await generateEmbedding(text);
1293
- completed++;
1294
- onProgress?.(completed, texts.length);
1295
- return { text, ...result };
1296
- }));
1297
- results.push(...chunkResults);
1298
- }
1299
- const totalTime = Date.now() - startTime;
1300
- return {
1301
- results,
1302
- totalTime,
1303
- avgTime: totalTime / texts.length
1304
- };
1365
+ export function generateBatchEmbeddings(texts, options) {
1366
+ return __awaiter(this, void 0, Promise, function () {
1367
+ var _a, _b, concurrency, onProgress, startTime, embeddings, totalTime_1, results, completed, i, chunk, chunkResults, totalTime;
1368
+ var _this = this;
1369
+ return __generator(this, function (_c) {
1370
+ switch (_c.label) {
1371
+ case 0:
1372
+ _a = options || {}, _b = _a.concurrency, concurrency = _b === void 0 ? texts.length : _b, onProgress = _a.onProgress;
1373
+ startTime = Date.now();
1374
+ if (!!(embeddingModelState === null || embeddingModelState === void 0 ? void 0 : embeddingModelState.loaded)) return [3 /*break*/, 2];
1375
+ return [4 /*yield*/, loadEmbeddingModel()];
1376
+ case 1:
1377
+ _c.sent();
1378
+ _c.label = 2;
1379
+ case 2:
1380
+ if (!(concurrency >= texts.length)) return [3 /*break*/, 4];
1381
+ return [4 /*yield*/, Promise.all(texts.map(function (text, i) { return __awaiter(_this, void 0, void 0, function () {
1382
+ var result;
1383
+ return __generator(this, function (_a) {
1384
+ switch (_a.label) {
1385
+ case 0: return [4 /*yield*/, generateEmbedding(text)];
1386
+ case 1:
1387
+ result = _a.sent();
1388
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress(i + 1, texts.length);
1389
+ return [2 /*return*/, __assign({ text: text }, result)];
1390
+ }
1391
+ });
1392
+ }); }))];
1393
+ case 3:
1394
+ embeddings = _c.sent();
1395
+ totalTime_1 = Date.now() - startTime;
1396
+ return [2 /*return*/, {
1397
+ results: embeddings,
1398
+ totalTime: totalTime_1,
1399
+ avgTime: totalTime_1 / texts.length
1400
+ }];
1401
+ case 4:
1402
+ results = [];
1403
+ completed = 0;
1404
+ i = 0;
1405
+ _c.label = 5;
1406
+ case 5:
1407
+ if (!(i < texts.length)) return [3 /*break*/, 8];
1408
+ chunk = texts.slice(i, i + concurrency);
1409
+ return [4 /*yield*/, Promise.all(chunk.map(function (text) { return __awaiter(_this, void 0, void 0, function () {
1410
+ var result;
1411
+ return __generator(this, function (_a) {
1412
+ switch (_a.label) {
1413
+ case 0: return [4 /*yield*/, generateEmbedding(text)];
1414
+ case 1:
1415
+ result = _a.sent();
1416
+ completed++;
1417
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress(completed, texts.length);
1418
+ return [2 /*return*/, __assign({ text: text }, result)];
1419
+ }
1420
+ });
1421
+ }); }))];
1422
+ case 6:
1423
+ chunkResults = _c.sent();
1424
+ results.push.apply(results, chunkResults);
1425
+ _c.label = 7;
1426
+ case 7:
1427
+ i += concurrency;
1428
+ return [3 /*break*/, 5];
1429
+ case 8:
1430
+ totalTime = Date.now() - startTime;
1431
+ return [2 /*return*/, {
1432
+ results: results,
1433
+ totalTime: totalTime,
1434
+ avgTime: totalTime / texts.length
1435
+ }];
1436
+ }
1437
+ });
1438
+ });
1305
1439
  }
1306
1440
  /**
1307
1441
  * Generate deterministic hash-based embedding
1308
1442
  * Not semantic, but deterministic and useful for testing
1309
1443
  */
1310
1444
  function generateHashEmbedding(text, dimensions) {
1311
- const embedding = new Array(dimensions).fill(0);
1445
+ var embedding = new Array(dimensions).fill(0);
1312
1446
  // Simple hash-based approach for reproducibility
1313
- const words = text.toLowerCase().split(/\s+/);
1314
- for (let i = 0; i < words.length; i++) {
1315
- const word = words[i];
1316
- for (let j = 0; j < word.length; j++) {
1317
- const charCode = word.charCodeAt(j);
1318
- const idx = (charCode * (i + 1) * (j + 1)) % dimensions;
1447
+ var words = text.toLowerCase().split(/\s+/);
1448
+ for (var i = 0; i < words.length; i++) {
1449
+ var word = words[i];
1450
+ for (var j = 0; j < word.length; j++) {
1451
+ var charCode = word.charCodeAt(j);
1452
+ var idx = (charCode * (i + 1) * (j + 1)) % dimensions;
1319
1453
  embedding[idx] += Math.sin(charCode * 0.1) * 0.1;
1320
1454
  }
1321
1455
  }
1322
1456
  // Normalize to unit vector
1323
- const magnitude = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0)) || 1;
1324
- return embedding.map(v => v / magnitude);
1457
+ var magnitude = Math.sqrt(embedding.reduce(function (sum, v) { return sum + v * v; }, 0)) || 1;
1458
+ return embedding.map(function (v) { return v / magnitude; });
1325
1459
  }
1326
1460
  /**
1327
1461
  * Verify memory initialization works correctly
1328
1462
  * Tests: write, read, search, patterns
1329
1463
  */
1330
- export async function verifyMemoryInit(dbPath, options) {
1331
- const { verbose = false } = options || {};
1332
- const tests = [];
1333
- try {
1334
- const initSqlJs = (await import('sql.js')).default;
1335
- const SQL = await initSqlJs();
1336
- const fs = await import('fs');
1337
- // Load database
1338
- const fileBuffer = fs.readFileSync(dbPath);
1339
- const db = new SQL.Database(fileBuffer);
1340
- // Test 1: Schema verification
1341
- const schemaStart = Date.now();
1342
- const tables = db.exec("SELECT name FROM sqlite_master WHERE type='table'");
1343
- const tableNames = tables[0]?.values?.map(v => v[0]) || [];
1344
- const expectedTables = ['memory_entries', 'patterns', 'metadata', 'vector_indexes'];
1345
- const missingTables = expectedTables.filter(t => !tableNames.includes(t));
1346
- tests.push({
1347
- name: 'Schema verification',
1348
- passed: missingTables.length === 0,
1349
- details: missingTables.length > 0 ? `Missing: ${missingTables.join(', ')}` : `${tableNames.length} tables found`,
1350
- duration: Date.now() - schemaStart
1351
- });
1352
- // Test 2: Write entry
1353
- const writeStart = Date.now();
1354
- const testId = `test_${Date.now()}`;
1355
- const testKey = 'verification_test';
1356
- const testValue = 'This is a verification test entry for memory initialization';
1357
- try {
1358
- db.run(`
1359
- INSERT INTO memory_entries (id, key, namespace, content, type, created_at, updated_at)
1360
- VALUES (?, ?, 'test', ?, 'semantic', ?, ?)
1361
- `, [testId, testKey, testValue, Date.now(), Date.now()]);
1362
- tests.push({
1363
- name: 'Write entry',
1364
- passed: true,
1365
- details: 'Entry written successfully',
1366
- duration: Date.now() - writeStart
1367
- });
1368
- }
1369
- catch (e) {
1370
- tests.push({
1371
- name: 'Write entry',
1372
- passed: false,
1373
- details: e instanceof Error ? e.message : 'Write failed',
1374
- duration: Date.now() - writeStart
1375
- });
1376
- }
1377
- // Test 3: Read entry
1378
- const readStart = Date.now();
1379
- try {
1380
- const result = db.exec(`SELECT content FROM memory_entries WHERE id = ?`, [testId]);
1381
- const content = result[0]?.values[0]?.[0];
1382
- tests.push({
1383
- name: 'Read entry',
1384
- passed: content === testValue,
1385
- details: content === testValue ? 'Content matches' : 'Content mismatch',
1386
- duration: Date.now() - readStart
1387
- });
1388
- }
1389
- catch (e) {
1390
- tests.push({
1391
- name: 'Read entry',
1392
- passed: false,
1393
- details: e instanceof Error ? e.message : 'Read failed',
1394
- duration: Date.now() - readStart
1395
- });
1396
- }
1397
- // Test 4: Write with embedding
1398
- const embeddingStart = Date.now();
1399
- try {
1400
- const { embedding, dimensions, model } = await generateEmbedding(testValue);
1401
- const embeddingJson = JSON.stringify(embedding);
1402
- db.run(`
1403
- UPDATE memory_entries
1404
- SET embedding = ?, embedding_dimensions = ?, embedding_model = ?
1405
- WHERE id = ?
1406
- `, [embeddingJson, dimensions, model, testId]);
1407
- tests.push({
1408
- name: 'Generate embedding',
1409
- passed: true,
1410
- details: `${dimensions}-dim vector (${model})`,
1411
- duration: Date.now() - embeddingStart
1412
- });
1413
- }
1414
- catch (e) {
1415
- tests.push({
1416
- name: 'Generate embedding',
1417
- passed: false,
1418
- details: e instanceof Error ? e.message : 'Embedding failed',
1419
- duration: Date.now() - embeddingStart
1420
- });
1421
- }
1422
- // Test 5: Pattern storage
1423
- const patternStart = Date.now();
1424
- try {
1425
- const patternId = `pattern_${Date.now()}`;
1426
- db.run(`
1427
- INSERT INTO patterns (id, name, pattern_type, condition, action, confidence, created_at, updated_at)
1428
- VALUES (?, 'test-pattern', 'task-routing', 'test condition', 'test action', 0.5, ?, ?)
1429
- `, [patternId, Date.now(), Date.now()]);
1430
- tests.push({
1431
- name: 'Pattern storage',
1432
- passed: true,
1433
- details: 'Pattern stored with confidence scoring',
1434
- duration: Date.now() - patternStart
1435
- });
1436
- // Cleanup test pattern
1437
- db.run(`DELETE FROM patterns WHERE id = ?`, [patternId]);
1438
- }
1439
- catch (e) {
1440
- tests.push({
1441
- name: 'Pattern storage',
1442
- passed: false,
1443
- details: e instanceof Error ? e.message : 'Pattern storage failed',
1444
- duration: Date.now() - patternStart
1445
- });
1446
- }
1447
- // Test 6: Vector index configuration
1448
- const indexStart = Date.now();
1449
- try {
1450
- const indexResult = db.exec(`SELECT name, dimensions, hnsw_m, hnsw_ef_construction FROM vector_indexes`);
1451
- const indexes = indexResult[0]?.values || [];
1452
- tests.push({
1453
- name: 'Vector index config',
1454
- passed: indexes.length > 0,
1455
- details: `${indexes.length} indexes configured (HNSW M=16, ef=200)`,
1456
- duration: Date.now() - indexStart
1457
- });
1458
- }
1459
- catch (e) {
1460
- tests.push({
1461
- name: 'Vector index config',
1462
- passed: false,
1463
- details: e instanceof Error ? e.message : 'Index check failed',
1464
- duration: Date.now() - indexStart
1465
- });
1466
- }
1467
- // Cleanup test entry
1468
- db.run(`DELETE FROM memory_entries WHERE id = ?`, [testId]);
1469
- // Save changes
1470
- const data = db.export();
1471
- fs.writeFileSync(dbPath, Buffer.from(data));
1472
- db.close();
1473
- const passed = tests.filter(t => t.passed).length;
1474
- const failed = tests.filter(t => !t.passed).length;
1475
- return {
1476
- success: failed === 0,
1477
- tests,
1478
- summary: {
1479
- passed,
1480
- failed,
1481
- total: tests.length
1464
+ export function verifyMemoryInit(dbPath, options) {
1465
+ var _a, _b, _c, _d, _e;
1466
+ return __awaiter(this, void 0, Promise, function () {
1467
+ var _f, verbose, tests, initSqlJs, SQL, fs_1, fileBuffer, db, schemaStart, tables, tableNames_1, expectedTables, missingTables, writeStart, testId, testKey, testValue, readStart, result, content, embeddingStart, _g, embedding, dimensions, model, embeddingJson, e_2, patternStart, patternId, indexStart, indexResult, indexes, data, passed, failed, error_5;
1468
+ return __generator(this, function (_h) {
1469
+ switch (_h.label) {
1470
+ case 0:
1471
+ _f = (options || {}).verbose, verbose = _f === void 0 ? false : _f;
1472
+ tests = [];
1473
+ _h.label = 1;
1474
+ case 1:
1475
+ _h.trys.push([1, 9, , 10]);
1476
+ return [4 /*yield*/, import('sql.js')];
1477
+ case 2:
1478
+ initSqlJs = (_h.sent())["default"];
1479
+ return [4 /*yield*/, initSqlJs()];
1480
+ case 3:
1481
+ SQL = _h.sent();
1482
+ return [4 /*yield*/, import('fs')];
1483
+ case 4:
1484
+ fs_1 = _h.sent();
1485
+ fileBuffer = fs_1.readFileSync(dbPath);
1486
+ db = new SQL.Database(fileBuffer);
1487
+ schemaStart = Date.now();
1488
+ tables = db.exec("SELECT name FROM sqlite_master WHERE type='table'");
1489
+ tableNames_1 = ((_b = (_a = tables[0]) === null || _a === void 0 ? void 0 : _a.values) === null || _b === void 0 ? void 0 : _b.map(function (v) { return v[0]; })) || [];
1490
+ expectedTables = ['memory_entries', 'patterns', 'metadata', 'vector_indexes'];
1491
+ missingTables = expectedTables.filter(function (t) { return !tableNames_1.includes(t); });
1492
+ tests.push({
1493
+ name: 'Schema verification',
1494
+ passed: missingTables.length === 0,
1495
+ details: missingTables.length > 0 ? "Missing: " + missingTables.join(', ') : tableNames_1.length + " tables found",
1496
+ duration: Date.now() - schemaStart
1497
+ });
1498
+ writeStart = Date.now();
1499
+ testId = "test_" + Date.now();
1500
+ testKey = 'verification_test';
1501
+ testValue = 'This is a verification test entry for memory initialization';
1502
+ try {
1503
+ db.run("\n INSERT INTO memory_entries (id, key, namespace, content, type, created_at, updated_at)\n VALUES (?, ?, 'test', ?, 'semantic', ?, ?)\n ", [testId, testKey, testValue, Date.now(), Date.now()]);
1504
+ tests.push({
1505
+ name: 'Write entry',
1506
+ passed: true,
1507
+ details: 'Entry written successfully',
1508
+ duration: Date.now() - writeStart
1509
+ });
1510
+ }
1511
+ catch (e) {
1512
+ tests.push({
1513
+ name: 'Write entry',
1514
+ passed: false,
1515
+ details: e instanceof Error ? e.message : 'Write failed',
1516
+ duration: Date.now() - writeStart
1517
+ });
1518
+ }
1519
+ readStart = Date.now();
1520
+ try {
1521
+ result = db.exec("SELECT content FROM memory_entries WHERE id = ?", [testId]);
1522
+ content = (_d = (_c = result[0]) === null || _c === void 0 ? void 0 : _c.values[0]) === null || _d === void 0 ? void 0 : _d[0];
1523
+ tests.push({
1524
+ name: 'Read entry',
1525
+ passed: content === testValue,
1526
+ details: content === testValue ? 'Content matches' : 'Content mismatch',
1527
+ duration: Date.now() - readStart
1528
+ });
1529
+ }
1530
+ catch (e) {
1531
+ tests.push({
1532
+ name: 'Read entry',
1533
+ passed: false,
1534
+ details: e instanceof Error ? e.message : 'Read failed',
1535
+ duration: Date.now() - readStart
1536
+ });
1537
+ }
1538
+ embeddingStart = Date.now();
1539
+ _h.label = 5;
1540
+ case 5:
1541
+ _h.trys.push([5, 7, , 8]);
1542
+ return [4 /*yield*/, generateEmbedding(testValue)];
1543
+ case 6:
1544
+ _g = _h.sent(), embedding = _g.embedding, dimensions = _g.dimensions, model = _g.model;
1545
+ embeddingJson = JSON.stringify(embedding);
1546
+ db.run("\n UPDATE memory_entries\n SET embedding = ?, embedding_dimensions = ?, embedding_model = ?\n WHERE id = ?\n ", [embeddingJson, dimensions, model, testId]);
1547
+ tests.push({
1548
+ name: 'Generate embedding',
1549
+ passed: true,
1550
+ details: dimensions + "-dim vector (" + model + ")",
1551
+ duration: Date.now() - embeddingStart
1552
+ });
1553
+ return [3 /*break*/, 8];
1554
+ case 7:
1555
+ e_2 = _h.sent();
1556
+ tests.push({
1557
+ name: 'Generate embedding',
1558
+ passed: false,
1559
+ details: e_2 instanceof Error ? e_2.message : 'Embedding failed',
1560
+ duration: Date.now() - embeddingStart
1561
+ });
1562
+ return [3 /*break*/, 8];
1563
+ case 8:
1564
+ patternStart = Date.now();
1565
+ try {
1566
+ patternId = "pattern_" + Date.now();
1567
+ db.run("\n INSERT INTO patterns (id, name, pattern_type, condition, action, confidence, created_at, updated_at)\n VALUES (?, 'test-pattern', 'task-routing', 'test condition', 'test action', 0.5, ?, ?)\n ", [patternId, Date.now(), Date.now()]);
1568
+ tests.push({
1569
+ name: 'Pattern storage',
1570
+ passed: true,
1571
+ details: 'Pattern stored with confidence scoring',
1572
+ duration: Date.now() - patternStart
1573
+ });
1574
+ // Cleanup test pattern
1575
+ db.run("DELETE FROM patterns WHERE id = ?", [patternId]);
1576
+ }
1577
+ catch (e) {
1578
+ tests.push({
1579
+ name: 'Pattern storage',
1580
+ passed: false,
1581
+ details: e instanceof Error ? e.message : 'Pattern storage failed',
1582
+ duration: Date.now() - patternStart
1583
+ });
1584
+ }
1585
+ indexStart = Date.now();
1586
+ try {
1587
+ indexResult = db.exec("SELECT name, dimensions, hnsw_m, hnsw_ef_construction FROM vector_indexes");
1588
+ indexes = ((_e = indexResult[0]) === null || _e === void 0 ? void 0 : _e.values) || [];
1589
+ tests.push({
1590
+ name: 'Vector index config',
1591
+ passed: indexes.length > 0,
1592
+ details: indexes.length + " indexes configured (HNSW M=16, ef=200)",
1593
+ duration: Date.now() - indexStart
1594
+ });
1595
+ }
1596
+ catch (e) {
1597
+ tests.push({
1598
+ name: 'Vector index config',
1599
+ passed: false,
1600
+ details: e instanceof Error ? e.message : 'Index check failed',
1601
+ duration: Date.now() - indexStart
1602
+ });
1603
+ }
1604
+ // Cleanup test entry
1605
+ db.run("DELETE FROM memory_entries WHERE id = ?", [testId]);
1606
+ data = db["export"]();
1607
+ fs_1.writeFileSync(dbPath, Buffer.from(data));
1608
+ db.close();
1609
+ passed = tests.filter(function (t) { return t.passed; }).length;
1610
+ failed = tests.filter(function (t) { return !t.passed; }).length;
1611
+ return [2 /*return*/, {
1612
+ success: failed === 0,
1613
+ tests: tests,
1614
+ summary: {
1615
+ passed: passed,
1616
+ failed: failed,
1617
+ total: tests.length
1618
+ }
1619
+ }];
1620
+ case 9:
1621
+ error_5 = _h.sent();
1622
+ return [2 /*return*/, {
1623
+ success: false,
1624
+ tests: [{
1625
+ name: 'Database access',
1626
+ passed: false,
1627
+ details: error_5 instanceof Error ? error_5.message : 'Unknown error'
1628
+ }],
1629
+ summary: { passed: 0, failed: 1, total: 1 }
1630
+ }];
1631
+ case 10: return [2 /*return*/];
1482
1632
  }
1483
- };
1484
- }
1485
- catch (error) {
1486
- return {
1487
- success: false,
1488
- tests: [{
1489
- name: 'Database access',
1490
- passed: false,
1491
- details: error instanceof Error ? error.message : 'Unknown error'
1492
- }],
1493
- summary: { passed: 0, failed: 1, total: 1 }
1494
- };
1495
- }
1633
+ });
1634
+ });
1496
1635
  }
1497
1636
  /**
1498
1637
  * Store an entry directly using sql.js
1499
1638
  * This bypasses MCP and writes directly to the database
1500
1639
  */
1501
- export async function storeEntry(options) {
1502
- const { key, value, namespace = 'default', generateEmbeddingFlag = true, tags = [], ttl, dbPath: customPath, upsert = false } = options;
1503
- const swarmDir = path.join(process.cwd(), '.swarm');
1504
- const dbPath = customPath || path.join(swarmDir, 'memory.db');
1505
- try {
1506
- if (!fs.existsSync(dbPath)) {
1507
- return { success: false, id: '', error: 'Database not initialized. Run: claude-flow memory init' };
1508
- }
1509
- // Ensure schema has all required columns (migration for older DBs)
1510
- await ensureSchemaColumns(dbPath);
1511
- const initSqlJs = (await import('sql.js')).default;
1512
- const SQL = await initSqlJs();
1513
- const fileBuffer = fs.readFileSync(dbPath);
1514
- const db = new SQL.Database(fileBuffer);
1515
- const id = `entry_${Date.now()}_${Math.random().toString(36).substring(7)}`;
1516
- const now = Date.now();
1517
- // Generate embedding if requested
1518
- let embeddingJson = null;
1519
- let embeddingDimensions = null;
1520
- let embeddingModel = null;
1521
- if (generateEmbeddingFlag && value.length > 0) {
1522
- const embResult = await generateEmbedding(value);
1523
- embeddingJson = JSON.stringify(embResult.embedding);
1524
- embeddingDimensions = embResult.dimensions;
1525
- embeddingModel = embResult.model;
1526
- }
1527
- // Insert or update entry (upsert mode uses REPLACE)
1528
- const insertSql = upsert
1529
- ? `INSERT OR REPLACE INTO memory_entries (
1530
- id, key, namespace, content, type,
1531
- embedding, embedding_dimensions, embedding_model,
1532
- tags, metadata, created_at, updated_at, expires_at, status
1533
- ) VALUES (?, ?, ?, ?, 'semantic', ?, ?, ?, ?, ?, ?, ?, ?, 'active')`
1534
- : `INSERT INTO memory_entries (
1535
- id, key, namespace, content, type,
1536
- embedding, embedding_dimensions, embedding_model,
1537
- tags, metadata, created_at, updated_at, expires_at, status
1538
- ) VALUES (?, ?, ?, ?, 'semantic', ?, ?, ?, ?, ?, ?, ?, ?, 'active')`;
1539
- db.run(insertSql, [
1540
- id,
1541
- key,
1542
- namespace,
1543
- value,
1544
- embeddingJson,
1545
- embeddingDimensions,
1546
- embeddingModel,
1547
- tags.length > 0 ? JSON.stringify(tags) : null,
1548
- '{}',
1549
- now,
1550
- now,
1551
- ttl ? now + (ttl * 1000) : null
1552
- ]);
1553
- // Save
1554
- const data = db.export();
1555
- fs.writeFileSync(dbPath, Buffer.from(data));
1556
- db.close();
1557
- // Add to HNSW index for faster future searches
1558
- if (embeddingJson) {
1559
- const embResult = JSON.parse(embeddingJson);
1560
- await addToHNSWIndex(id, embResult, {
1561
- id,
1562
- key,
1563
- namespace,
1564
- content: value
1565
- });
1566
- }
1567
- return {
1568
- success: true,
1569
- id,
1570
- embedding: embeddingJson ? { dimensions: embeddingDimensions, model: embeddingModel } : undefined
1571
- };
1572
- }
1573
- catch (error) {
1574
- return {
1575
- success: false,
1576
- id: '',
1577
- error: error instanceof Error ? error.message : String(error)
1578
- };
1579
- }
1640
+ export function storeEntry(options) {
1641
+ return __awaiter(this, void 0, Promise, function () {
1642
+ var bridge, bridgeResult, key, value, _a, namespace, _b, generateEmbeddingFlag, _c, tags, ttl, customPath, _d, upsert, swarmDir, dbPath, initSqlJs, SQL, fileBuffer, db, id, now, embeddingJson, embeddingDimensions, embeddingModel, embResult, insertSql, data, embResult, error_6;
1643
+ return __generator(this, function (_e) {
1644
+ switch (_e.label) {
1645
+ case 0: return [4 /*yield*/, getBridge()];
1646
+ case 1:
1647
+ bridge = _e.sent();
1648
+ if (!bridge) return [3 /*break*/, 3];
1649
+ return [4 /*yield*/, bridge.bridgeStoreEntry(options)];
1650
+ case 2:
1651
+ bridgeResult = _e.sent();
1652
+ if (bridgeResult)
1653
+ return [2 /*return*/, bridgeResult];
1654
+ _e.label = 3;
1655
+ case 3:
1656
+ key = options.key, value = options.value, _a = options.namespace, namespace = _a === void 0 ? 'default' : _a, _b = options.generateEmbeddingFlag, generateEmbeddingFlag = _b === void 0 ? true : _b, _c = options.tags, tags = _c === void 0 ? [] : _c, ttl = options.ttl, customPath = options.dbPath, _d = options.upsert, upsert = _d === void 0 ? false : _d;
1657
+ swarmDir = path.join(process.cwd(), '.swarm');
1658
+ dbPath = customPath || path.join(swarmDir, 'memory.db');
1659
+ _e.label = 4;
1660
+ case 4:
1661
+ _e.trys.push([4, 12, , 13]);
1662
+ if (!fs.existsSync(dbPath)) {
1663
+ return [2 /*return*/, { success: false, id: '', error: 'Database not initialized. Run: claude-flow memory init' }];
1664
+ }
1665
+ // Ensure schema has all required columns (migration for older DBs)
1666
+ return [4 /*yield*/, ensureSchemaColumns(dbPath)];
1667
+ case 5:
1668
+ // Ensure schema has all required columns (migration for older DBs)
1669
+ _e.sent();
1670
+ return [4 /*yield*/, import('sql.js')];
1671
+ case 6:
1672
+ initSqlJs = (_e.sent())["default"];
1673
+ return [4 /*yield*/, initSqlJs()];
1674
+ case 7:
1675
+ SQL = _e.sent();
1676
+ fileBuffer = fs.readFileSync(dbPath);
1677
+ db = new SQL.Database(fileBuffer);
1678
+ id = "entry_" + Date.now() + "_" + Math.random().toString(36).substring(7);
1679
+ now = Date.now();
1680
+ embeddingJson = null;
1681
+ embeddingDimensions = null;
1682
+ embeddingModel = null;
1683
+ if (!(generateEmbeddingFlag && value.length > 0)) return [3 /*break*/, 9];
1684
+ return [4 /*yield*/, generateEmbedding(value)];
1685
+ case 8:
1686
+ embResult = _e.sent();
1687
+ embeddingJson = JSON.stringify(embResult.embedding);
1688
+ embeddingDimensions = embResult.dimensions;
1689
+ embeddingModel = embResult.model;
1690
+ _e.label = 9;
1691
+ case 9:
1692
+ insertSql = upsert
1693
+ ? "INSERT OR REPLACE INTO memory_entries (\n id, key, namespace, content, type,\n embedding, embedding_dimensions, embedding_model,\n tags, metadata, created_at, updated_at, expires_at, status\n ) VALUES (?, ?, ?, ?, 'semantic', ?, ?, ?, ?, ?, ?, ?, ?, 'active')"
1694
+ : "INSERT INTO memory_entries (\n id, key, namespace, content, type,\n embedding, embedding_dimensions, embedding_model,\n tags, metadata, created_at, updated_at, expires_at, status\n ) VALUES (?, ?, ?, ?, 'semantic', ?, ?, ?, ?, ?, ?, ?, ?, 'active')";
1695
+ db.run(insertSql, [
1696
+ id,
1697
+ key,
1698
+ namespace,
1699
+ value,
1700
+ embeddingJson,
1701
+ embeddingDimensions,
1702
+ embeddingModel,
1703
+ tags.length > 0 ? JSON.stringify(tags) : null,
1704
+ '{}',
1705
+ now,
1706
+ now,
1707
+ ttl ? now + (ttl * 1000) : null
1708
+ ]);
1709
+ data = db["export"]();
1710
+ fs.writeFileSync(dbPath, Buffer.from(data));
1711
+ db.close();
1712
+ if (!embeddingJson) return [3 /*break*/, 11];
1713
+ embResult = JSON.parse(embeddingJson);
1714
+ return [4 /*yield*/, addToHNSWIndex(id, embResult, {
1715
+ id: id,
1716
+ key: key,
1717
+ namespace: namespace,
1718
+ content: value
1719
+ })];
1720
+ case 10:
1721
+ _e.sent();
1722
+ _e.label = 11;
1723
+ case 11: return [2 /*return*/, {
1724
+ success: true,
1725
+ id: id,
1726
+ embedding: embeddingJson ? { dimensions: embeddingDimensions, model: embeddingModel } : undefined
1727
+ }];
1728
+ case 12:
1729
+ error_6 = _e.sent();
1730
+ return [2 /*return*/, {
1731
+ success: false,
1732
+ id: '',
1733
+ error: error_6 instanceof Error ? error_6.message : String(error_6)
1734
+ }];
1735
+ case 13: return [2 /*return*/];
1736
+ }
1737
+ });
1738
+ });
1580
1739
  }
1581
1740
  /**
1582
1741
  * Search entries using sql.js with vector similarity
1583
1742
  * Uses HNSW index for 150x faster search when available
1584
1743
  */
1585
- export async function searchEntries(options) {
1586
- const { query, namespace = 'default', limit = 10, threshold = 0.3, dbPath: customPath } = options;
1587
- const swarmDir = path.join(process.cwd(), '.swarm');
1588
- const dbPath = customPath || path.join(swarmDir, 'memory.db');
1589
- const startTime = Date.now();
1590
- try {
1591
- if (!fs.existsSync(dbPath)) {
1592
- return { success: false, results: [], searchTime: 0, error: 'Database not found' };
1593
- }
1594
- // Ensure schema has all required columns (migration for older DBs)
1595
- await ensureSchemaColumns(dbPath);
1596
- // Generate query embedding
1597
- const queryEmb = await generateEmbedding(query);
1598
- const queryEmbedding = queryEmb.embedding;
1599
- // Try HNSW search first (150x faster)
1600
- const hnswResults = await searchHNSWIndex(queryEmbedding, { k: limit, namespace });
1601
- if (hnswResults && hnswResults.length > 0) {
1602
- // Filter by threshold
1603
- const filtered = hnswResults.filter(r => r.score >= threshold);
1604
- return {
1605
- success: true,
1606
- results: filtered,
1607
- searchTime: Date.now() - startTime
1608
- };
1609
- }
1610
- // Fall back to brute-force SQLite search
1611
- const initSqlJs = (await import('sql.js')).default;
1612
- const SQL = await initSqlJs();
1613
- const fileBuffer = fs.readFileSync(dbPath);
1614
- const db = new SQL.Database(fileBuffer);
1615
- // Get entries with embeddings
1616
- const entries = db.exec(`
1617
- SELECT id, key, namespace, content, embedding
1618
- FROM memory_entries
1619
- WHERE status = 'active'
1620
- ${namespace !== 'all' ? `AND namespace = '${namespace.replace(/'/g, "''")}'` : ''}
1621
- LIMIT 1000
1622
- `);
1623
- const results = [];
1624
- if (entries[0]?.values) {
1625
- for (const row of entries[0].values) {
1626
- const [id, key, ns, content, embeddingJson] = row;
1627
- let score = 0;
1628
- if (embeddingJson) {
1629
- try {
1630
- const embedding = JSON.parse(embeddingJson);
1631
- score = cosineSim(queryEmbedding, embedding);
1744
+ export function searchEntries(options) {
1745
+ var _a;
1746
+ return __awaiter(this, void 0, Promise, function () {
1747
+ var bridge, bridgeResult, query, _b, namespace, _c, limit, _d, threshold, customPath, swarmDir, dbPath, startTime, queryEmb, queryEmbedding, hnswResults, filtered, initSqlJs, SQL, fileBuffer, db, searchStmt, searchRows, entries, results, _loop_1, _i, _e, row, error_7;
1748
+ return __generator(this, function (_f) {
1749
+ switch (_f.label) {
1750
+ case 0: return [4 /*yield*/, getBridge()];
1751
+ case 1:
1752
+ bridge = _f.sent();
1753
+ if (!bridge) return [3 /*break*/, 3];
1754
+ return [4 /*yield*/, bridge.bridgeSearchEntries(options)];
1755
+ case 2:
1756
+ bridgeResult = _f.sent();
1757
+ if (bridgeResult)
1758
+ return [2 /*return*/, bridgeResult];
1759
+ _f.label = 3;
1760
+ case 3:
1761
+ query = options.query, _b = options.namespace, namespace = _b === void 0 ? 'default' : _b, _c = options.limit, limit = _c === void 0 ? 10 : _c, _d = options.threshold, threshold = _d === void 0 ? 0.3 : _d, customPath = options.dbPath;
1762
+ swarmDir = path.join(process.cwd(), '.swarm');
1763
+ dbPath = customPath || path.join(swarmDir, 'memory.db');
1764
+ startTime = Date.now();
1765
+ _f.label = 4;
1766
+ case 4:
1767
+ _f.trys.push([4, 10, , 11]);
1768
+ if (!fs.existsSync(dbPath)) {
1769
+ return [2 /*return*/, { success: false, results: [], searchTime: 0, error: 'Database not found' }];
1632
1770
  }
1633
- catch {
1634
- // Invalid embedding, use keyword score
1771
+ // Ensure schema has all required columns (migration for older DBs)
1772
+ return [4 /*yield*/, ensureSchemaColumns(dbPath)];
1773
+ case 5:
1774
+ // Ensure schema has all required columns (migration for older DBs)
1775
+ _f.sent();
1776
+ return [4 /*yield*/, generateEmbedding(query)];
1777
+ case 6:
1778
+ queryEmb = _f.sent();
1779
+ queryEmbedding = queryEmb.embedding;
1780
+ return [4 /*yield*/, searchHNSWIndex(queryEmbedding, { k: limit, namespace: namespace })];
1781
+ case 7:
1782
+ hnswResults = _f.sent();
1783
+ if (hnswResults && hnswResults.length > 0) {
1784
+ filtered = hnswResults.filter(function (r) { return r.score >= threshold; });
1785
+ return [2 /*return*/, {
1786
+ success: true,
1787
+ results: filtered,
1788
+ searchTime: Date.now() - startTime
1789
+ }];
1635
1790
  }
1636
- }
1637
- // Fallback to keyword matching
1638
- if (score < threshold) {
1639
- const lowerContent = (content || '').toLowerCase();
1640
- const lowerQuery = query.toLowerCase();
1641
- const words = lowerQuery.split(/\s+/);
1642
- const matchCount = words.filter(w => lowerContent.includes(w)).length;
1643
- const keywordScore = matchCount / words.length * 0.5;
1644
- score = Math.max(score, keywordScore);
1645
- }
1646
- if (score >= threshold) {
1647
- results.push({
1648
- id: id.substring(0, 12),
1649
- key: key || id.substring(0, 15),
1650
- content: (content || '').substring(0, 60) + ((content || '').length > 60 ? '...' : ''),
1651
- score,
1652
- namespace: ns || 'default'
1653
- });
1654
- }
1791
+ return [4 /*yield*/, import('sql.js')];
1792
+ case 8:
1793
+ initSqlJs = (_f.sent())["default"];
1794
+ return [4 /*yield*/, initSqlJs()];
1795
+ case 9:
1796
+ SQL = _f.sent();
1797
+ fileBuffer = fs.readFileSync(dbPath);
1798
+ db = new SQL.Database(fileBuffer);
1799
+ searchStmt = db.prepare(namespace !== 'all'
1800
+ ? "SELECT id, key, namespace, content, embedding FROM memory_entries WHERE status = 'active' AND namespace = ? LIMIT 1000"
1801
+ : "SELECT id, key, namespace, content, embedding FROM memory_entries WHERE status = 'active' LIMIT 1000");
1802
+ if (namespace !== 'all') {
1803
+ searchStmt.bind([namespace]);
1804
+ }
1805
+ searchRows = [];
1806
+ while (searchStmt.step()) {
1807
+ searchRows.push(searchStmt.get());
1808
+ }
1809
+ searchStmt.free();
1810
+ entries = searchRows.length > 0 ? [{ values: searchRows }] : [];
1811
+ results = [];
1812
+ if ((_a = entries[0]) === null || _a === void 0 ? void 0 : _a.values) {
1813
+ _loop_1 = function (row) {
1814
+ var _g = row, id = _g[0], key = _g[1], ns = _g[2], content = _g[3], embeddingJson = _g[4];
1815
+ var score = 0;
1816
+ if (embeddingJson) {
1817
+ try {
1818
+ var embedding = JSON.parse(embeddingJson);
1819
+ score = cosineSim(queryEmbedding, embedding);
1820
+ }
1821
+ catch (_h) {
1822
+ // Invalid embedding, use keyword score
1823
+ }
1824
+ }
1825
+ // Fallback to keyword matching
1826
+ if (score < threshold) {
1827
+ var lowerContent_1 = (content || '').toLowerCase();
1828
+ var lowerQuery = query.toLowerCase();
1829
+ var words = lowerQuery.split(/\s+/);
1830
+ var matchCount = words.filter(function (w) { return lowerContent_1.includes(w); }).length;
1831
+ var keywordScore = matchCount / words.length * 0.5;
1832
+ score = Math.max(score, keywordScore);
1833
+ }
1834
+ if (score >= threshold) {
1835
+ results.push({
1836
+ id: id.substring(0, 12),
1837
+ key: key || id.substring(0, 15),
1838
+ content: (content || '').substring(0, 60) + ((content || '').length > 60 ? '...' : ''),
1839
+ score: score,
1840
+ namespace: ns || 'default'
1841
+ });
1842
+ }
1843
+ };
1844
+ for (_i = 0, _e = entries[0].values; _i < _e.length; _i++) {
1845
+ row = _e[_i];
1846
+ _loop_1(row);
1847
+ }
1848
+ }
1849
+ db.close();
1850
+ // Sort by score
1851
+ results.sort(function (a, b) { return b.score - a.score; });
1852
+ return [2 /*return*/, {
1853
+ success: true,
1854
+ results: results.slice(0, limit),
1855
+ searchTime: Date.now() - startTime
1856
+ }];
1857
+ case 10:
1858
+ error_7 = _f.sent();
1859
+ return [2 /*return*/, {
1860
+ success: false,
1861
+ results: [],
1862
+ searchTime: Date.now() - startTime,
1863
+ error: error_7 instanceof Error ? error_7.message : String(error_7)
1864
+ }];
1865
+ case 11: return [2 /*return*/];
1655
1866
  }
1656
- }
1657
- db.close();
1658
- // Sort by score
1659
- results.sort((a, b) => b.score - a.score);
1660
- return {
1661
- success: true,
1662
- results: results.slice(0, limit),
1663
- searchTime: Date.now() - startTime
1664
- };
1665
- }
1666
- catch (error) {
1667
- return {
1668
- success: false,
1669
- results: [],
1670
- searchTime: Date.now() - startTime,
1671
- error: error instanceof Error ? error.message : String(error)
1672
- };
1673
- }
1867
+ });
1868
+ });
1674
1869
  }
1675
1870
  /**
1676
1871
  * Optimized cosine similarity
@@ -1680,250 +1875,348 @@ export async function searchEntries(options) {
1680
1875
  function cosineSim(a, b) {
1681
1876
  if (!a || !b || a.length === 0 || b.length === 0)
1682
1877
  return 0;
1683
- const len = Math.min(a.length, b.length);
1684
- let dot = 0, normA = 0, normB = 0;
1878
+ var len = Math.min(a.length, b.length);
1879
+ var dot = 0, normA = 0, normB = 0;
1685
1880
  // Simple loop - V8 optimizes this well
1686
- for (let i = 0; i < len; i++) {
1687
- const ai = a[i], bi = b[i];
1881
+ for (var i = 0; i < len; i++) {
1882
+ var ai = a[i], bi = b[i];
1688
1883
  dot += ai * bi;
1689
1884
  normA += ai * ai;
1690
1885
  normB += bi * bi;
1691
1886
  }
1692
1887
  // Combined sqrt for slightly better performance
1693
- const mag = Math.sqrt(normA * normB);
1888
+ var mag = Math.sqrt(normA * normB);
1694
1889
  return mag === 0 ? 0 : dot / mag;
1695
1890
  }
1696
1891
  /**
1697
1892
  * List all entries from the memory database
1698
1893
  */
1699
- export async function listEntries(options) {
1700
- const { namespace, limit = 20, offset = 0, dbPath: customPath } = options;
1701
- const swarmDir = path.join(process.cwd(), '.swarm');
1702
- const dbPath = customPath || path.join(swarmDir, 'memory.db');
1703
- try {
1704
- if (!fs.existsSync(dbPath)) {
1705
- return { success: false, entries: [], total: 0, error: 'Database not found' };
1706
- }
1707
- // Ensure schema has all required columns (migration for older DBs)
1708
- await ensureSchemaColumns(dbPath);
1709
- const initSqlJs = (await import('sql.js')).default;
1710
- const SQL = await initSqlJs();
1711
- const fileBuffer = fs.readFileSync(dbPath);
1712
- const db = new SQL.Database(fileBuffer);
1713
- // Get total count
1714
- const countQuery = namespace
1715
- ? `SELECT COUNT(*) as cnt FROM memory_entries WHERE status = 'active' AND namespace = '${namespace.replace(/'/g, "''")}'`
1716
- : `SELECT COUNT(*) as cnt FROM memory_entries WHERE status = 'active'`;
1717
- const countResult = db.exec(countQuery);
1718
- const total = countResult[0]?.values?.[0]?.[0] || 0;
1719
- // Get entries
1720
- const listQuery = `
1721
- SELECT id, key, namespace, content, embedding, access_count, created_at, updated_at
1722
- FROM memory_entries
1723
- WHERE status = 'active'
1724
- ${namespace ? `AND namespace = '${namespace.replace(/'/g, "''")}'` : ''}
1725
- ORDER BY updated_at DESC
1726
- LIMIT ${limit} OFFSET ${offset}
1727
- `;
1728
- const result = db.exec(listQuery);
1729
- const entries = [];
1730
- if (result[0]?.values) {
1731
- for (const row of result[0].values) {
1732
- const [id, key, ns, content, embedding, accessCount, createdAt, updatedAt] = row;
1733
- entries.push({
1734
- id: String(id).substring(0, 20),
1735
- key: key || String(id).substring(0, 15),
1736
- namespace: ns || 'default',
1737
- size: (content || '').length,
1738
- accessCount: accessCount || 0,
1739
- createdAt: createdAt || new Date().toISOString(),
1740
- updatedAt: updatedAt || new Date().toISOString(),
1741
- hasEmbedding: !!embedding && embedding.length > 10
1742
- });
1894
+ export function listEntries(options) {
1895
+ var _a, _b, _c, _d;
1896
+ return __awaiter(this, void 0, Promise, function () {
1897
+ var bridge, bridgeResult, namespace, _e, limit, _f, offset, customPath, swarmDir, dbPath, initSqlJs, SQL, fileBuffer, db, countStmt, countRows, countResult, total, safeLimit, safeOffset, listStmt, listRows, result, entries, _i, _g, row, _h, id, key, ns, content, embedding, accessCount, createdAt, updatedAt, error_8;
1898
+ return __generator(this, function (_j) {
1899
+ switch (_j.label) {
1900
+ case 0: return [4 /*yield*/, getBridge()];
1901
+ case 1:
1902
+ bridge = _j.sent();
1903
+ if (!bridge) return [3 /*break*/, 3];
1904
+ return [4 /*yield*/, bridge.bridgeListEntries(options)];
1905
+ case 2:
1906
+ bridgeResult = _j.sent();
1907
+ if (bridgeResult)
1908
+ return [2 /*return*/, bridgeResult];
1909
+ _j.label = 3;
1910
+ case 3:
1911
+ namespace = options.namespace, _e = options.limit, limit = _e === void 0 ? 20 : _e, _f = options.offset, offset = _f === void 0 ? 0 : _f, customPath = options.dbPath;
1912
+ swarmDir = path.join(process.cwd(), '.swarm');
1913
+ dbPath = customPath || path.join(swarmDir, 'memory.db');
1914
+ _j.label = 4;
1915
+ case 4:
1916
+ _j.trys.push([4, 8, , 9]);
1917
+ if (!fs.existsSync(dbPath)) {
1918
+ return [2 /*return*/, { success: false, entries: [], total: 0, error: 'Database not found' }];
1919
+ }
1920
+ // Ensure schema has all required columns (migration for older DBs)
1921
+ return [4 /*yield*/, ensureSchemaColumns(dbPath)];
1922
+ case 5:
1923
+ // Ensure schema has all required columns (migration for older DBs)
1924
+ _j.sent();
1925
+ return [4 /*yield*/, import('sql.js')];
1926
+ case 6:
1927
+ initSqlJs = (_j.sent())["default"];
1928
+ return [4 /*yield*/, initSqlJs()];
1929
+ case 7:
1930
+ SQL = _j.sent();
1931
+ fileBuffer = fs.readFileSync(dbPath);
1932
+ db = new SQL.Database(fileBuffer);
1933
+ countStmt = namespace
1934
+ ? db.prepare("SELECT COUNT(*) as cnt FROM memory_entries WHERE status = 'active' AND namespace = ?")
1935
+ : db.prepare("SELECT COUNT(*) as cnt FROM memory_entries WHERE status = 'active'");
1936
+ if (namespace) {
1937
+ countStmt.bind([namespace]);
1938
+ }
1939
+ countRows = [];
1940
+ while (countStmt.step()) {
1941
+ countRows.push(countStmt.get());
1942
+ }
1943
+ countStmt.free();
1944
+ countResult = countRows.length > 0 ? [{ values: countRows }] : [];
1945
+ total = ((_c = (_b = (_a = countResult[0]) === null || _a === void 0 ? void 0 : _a.values) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c[0]) || 0;
1946
+ safeLimit = parseInt(String(limit), 10) || 100;
1947
+ safeOffset = parseInt(String(offset), 10) || 0;
1948
+ listStmt = namespace
1949
+ ? db.prepare("SELECT id, key, namespace, content, embedding, access_count, created_at, updated_at FROM memory_entries WHERE status = 'active' AND namespace = ? ORDER BY updated_at DESC LIMIT ? OFFSET ?")
1950
+ : db.prepare("SELECT id, key, namespace, content, embedding, access_count, created_at, updated_at FROM memory_entries WHERE status = 'active' ORDER BY updated_at DESC LIMIT ? OFFSET ?");
1951
+ if (namespace) {
1952
+ listStmt.bind([namespace, safeLimit, safeOffset]);
1953
+ }
1954
+ else {
1955
+ listStmt.bind([safeLimit, safeOffset]);
1956
+ }
1957
+ listRows = [];
1958
+ while (listStmt.step()) {
1959
+ listRows.push(listStmt.get());
1960
+ }
1961
+ listStmt.free();
1962
+ result = listRows.length > 0 ? [{ values: listRows }] : [];
1963
+ entries = [];
1964
+ if ((_d = result[0]) === null || _d === void 0 ? void 0 : _d.values) {
1965
+ for (_i = 0, _g = result[0].values; _i < _g.length; _i++) {
1966
+ row = _g[_i];
1967
+ _h = row, id = _h[0], key = _h[1], ns = _h[2], content = _h[3], embedding = _h[4], accessCount = _h[5], createdAt = _h[6], updatedAt = _h[7];
1968
+ entries.push({
1969
+ id: String(id).substring(0, 20),
1970
+ key: key || String(id).substring(0, 15),
1971
+ namespace: ns || 'default',
1972
+ size: (content || '').length,
1973
+ accessCount: accessCount || 0,
1974
+ createdAt: createdAt || new Date().toISOString(),
1975
+ updatedAt: updatedAt || new Date().toISOString(),
1976
+ hasEmbedding: !!embedding && embedding.length > 10
1977
+ });
1978
+ }
1979
+ }
1980
+ db.close();
1981
+ return [2 /*return*/, { success: true, entries: entries, total: total }];
1982
+ case 8:
1983
+ error_8 = _j.sent();
1984
+ return [2 /*return*/, {
1985
+ success: false,
1986
+ entries: [],
1987
+ total: 0,
1988
+ error: error_8 instanceof Error ? error_8.message : String(error_8)
1989
+ }];
1990
+ case 9: return [2 /*return*/];
1743
1991
  }
1744
- }
1745
- db.close();
1746
- return { success: true, entries, total };
1747
- }
1748
- catch (error) {
1749
- return {
1750
- success: false,
1751
- entries: [],
1752
- total: 0,
1753
- error: error instanceof Error ? error.message : String(error)
1754
- };
1755
- }
1992
+ });
1993
+ });
1756
1994
  }
1757
1995
  /**
1758
1996
  * Get a specific entry from the memory database
1759
1997
  */
1760
- export async function getEntry(options) {
1761
- const { key, namespace = 'default', dbPath: customPath } = options;
1762
- const swarmDir = path.join(process.cwd(), '.swarm');
1763
- const dbPath = customPath || path.join(swarmDir, 'memory.db');
1764
- try {
1765
- if (!fs.existsSync(dbPath)) {
1766
- return { success: false, found: false, error: 'Database not found' };
1767
- }
1768
- // Ensure schema has all required columns (migration for older DBs)
1769
- await ensureSchemaColumns(dbPath);
1770
- const initSqlJs = (await import('sql.js')).default;
1771
- const SQL = await initSqlJs();
1772
- const fileBuffer = fs.readFileSync(dbPath);
1773
- const db = new SQL.Database(fileBuffer);
1774
- // Find entry by key
1775
- const result = db.exec(`
1776
- SELECT id, key, namespace, content, embedding, access_count, created_at, updated_at, tags
1777
- FROM memory_entries
1778
- WHERE status = 'active'
1779
- AND key = '${key.replace(/'/g, "''")}'
1780
- AND namespace = '${namespace.replace(/'/g, "''")}'
1781
- LIMIT 1
1782
- `);
1783
- if (!result[0]?.values?.[0]) {
1784
- db.close();
1785
- return { success: true, found: false };
1786
- }
1787
- const [id, entryKey, ns, content, embedding, accessCount, createdAt, updatedAt, tagsJson] = result[0].values[0];
1788
- // Update access count
1789
- db.run(`
1790
- UPDATE memory_entries
1791
- SET access_count = access_count + 1, last_accessed_at = strftime('%s', 'now') * 1000
1792
- WHERE id = '${String(id).replace(/'/g, "''")}'
1793
- `);
1794
- // Save updated database
1795
- const data = db.export();
1796
- fs.writeFileSync(dbPath, Buffer.from(data));
1797
- db.close();
1798
- let tags = [];
1799
- if (tagsJson) {
1800
- try {
1801
- tags = JSON.parse(tagsJson);
1802
- }
1803
- catch {
1804
- // Invalid JSON
1805
- }
1806
- }
1807
- return {
1808
- success: true,
1809
- found: true,
1810
- entry: {
1811
- id: String(id),
1812
- key: entryKey || String(id),
1813
- namespace: ns || 'default',
1814
- content: content || '',
1815
- accessCount: (accessCount || 0) + 1,
1816
- createdAt: createdAt || new Date().toISOString(),
1817
- updatedAt: updatedAt || new Date().toISOString(),
1818
- hasEmbedding: !!embedding && embedding.length > 10,
1819
- tags
1998
+ export function getEntry(options) {
1999
+ var _a, _b;
2000
+ return __awaiter(this, void 0, Promise, function () {
2001
+ var bridge, bridgeResult, key, _c, namespace, customPath, swarmDir, dbPath, initSqlJs, SQL, fileBuffer, db, getStmt, getRows, result, _d, id, entryKey, ns, content, embedding, accessCount, createdAt, updatedAt, tagsJson, data, tags, error_9;
2002
+ return __generator(this, function (_e) {
2003
+ switch (_e.label) {
2004
+ case 0: return [4 /*yield*/, getBridge()];
2005
+ case 1:
2006
+ bridge = _e.sent();
2007
+ if (!bridge) return [3 /*break*/, 3];
2008
+ return [4 /*yield*/, bridge.bridgeGetEntry(options)];
2009
+ case 2:
2010
+ bridgeResult = _e.sent();
2011
+ if (bridgeResult)
2012
+ return [2 /*return*/, bridgeResult];
2013
+ _e.label = 3;
2014
+ case 3:
2015
+ key = options.key, _c = options.namespace, namespace = _c === void 0 ? 'default' : _c, customPath = options.dbPath;
2016
+ swarmDir = path.join(process.cwd(), '.swarm');
2017
+ dbPath = customPath || path.join(swarmDir, 'memory.db');
2018
+ _e.label = 4;
2019
+ case 4:
2020
+ _e.trys.push([4, 8, , 9]);
2021
+ if (!fs.existsSync(dbPath)) {
2022
+ return [2 /*return*/, { success: false, found: false, error: 'Database not found' }];
2023
+ }
2024
+ // Ensure schema has all required columns (migration for older DBs)
2025
+ return [4 /*yield*/, ensureSchemaColumns(dbPath)];
2026
+ case 5:
2027
+ // Ensure schema has all required columns (migration for older DBs)
2028
+ _e.sent();
2029
+ return [4 /*yield*/, import('sql.js')];
2030
+ case 6:
2031
+ initSqlJs = (_e.sent())["default"];
2032
+ return [4 /*yield*/, initSqlJs()];
2033
+ case 7:
2034
+ SQL = _e.sent();
2035
+ fileBuffer = fs.readFileSync(dbPath);
2036
+ db = new SQL.Database(fileBuffer);
2037
+ getStmt = db.prepare("\n SELECT id, key, namespace, content, embedding, access_count, created_at, updated_at, tags\n FROM memory_entries\n WHERE status = 'active'\n AND key = ?\n AND namespace = ?\n LIMIT 1\n ");
2038
+ getStmt.bind([key, namespace]);
2039
+ getRows = [];
2040
+ while (getStmt.step()) {
2041
+ getRows.push(getStmt.get());
2042
+ }
2043
+ getStmt.free();
2044
+ result = getRows.length > 0 ? [{ values: getRows }] : [];
2045
+ if (!((_b = (_a = result[0]) === null || _a === void 0 ? void 0 : _a.values) === null || _b === void 0 ? void 0 : _b[0])) {
2046
+ db.close();
2047
+ return [2 /*return*/, { success: true, found: false }];
2048
+ }
2049
+ _d = result[0].values[0], id = _d[0], entryKey = _d[1], ns = _d[2], content = _d[3], embedding = _d[4], accessCount = _d[5], createdAt = _d[6], updatedAt = _d[7], tagsJson = _d[8];
2050
+ // Update access count
2051
+ db.run("\n UPDATE memory_entries\n SET access_count = access_count + 1, last_accessed_at = strftime('%s', 'now') * 1000\n WHERE id = ?\n ", [String(id)]);
2052
+ data = db["export"]();
2053
+ fs.writeFileSync(dbPath, Buffer.from(data));
2054
+ db.close();
2055
+ tags = [];
2056
+ if (tagsJson) {
2057
+ try {
2058
+ tags = JSON.parse(tagsJson);
2059
+ }
2060
+ catch (_f) {
2061
+ // Invalid JSON
2062
+ }
2063
+ }
2064
+ return [2 /*return*/, {
2065
+ success: true,
2066
+ found: true,
2067
+ entry: {
2068
+ id: String(id),
2069
+ key: entryKey || String(id),
2070
+ namespace: ns || 'default',
2071
+ content: content || '',
2072
+ accessCount: (accessCount || 0) + 1,
2073
+ createdAt: createdAt || new Date().toISOString(),
2074
+ updatedAt: updatedAt || new Date().toISOString(),
2075
+ hasEmbedding: !!embedding && embedding.length > 10,
2076
+ tags: tags
2077
+ }
2078
+ }];
2079
+ case 8:
2080
+ error_9 = _e.sent();
2081
+ return [2 /*return*/, {
2082
+ success: false,
2083
+ found: false,
2084
+ error: error_9 instanceof Error ? error_9.message : String(error_9)
2085
+ }];
2086
+ case 9: return [2 /*return*/];
1820
2087
  }
1821
- };
1822
- }
1823
- catch (error) {
1824
- return {
1825
- success: false,
1826
- found: false,
1827
- error: error instanceof Error ? error.message : String(error)
1828
- };
1829
- }
2088
+ });
2089
+ });
1830
2090
  }
1831
2091
  /**
1832
2092
  * Delete a memory entry by key and namespace
1833
2093
  * Issue #980: Properly supports namespaced entries
1834
2094
  */
1835
- export async function deleteEntry(options) {
1836
- const { key, namespace = 'default', dbPath: customPath } = options;
1837
- const swarmDir = path.join(process.cwd(), '.swarm');
1838
- const dbPath = customPath || path.join(swarmDir, 'memory.db');
1839
- try {
1840
- if (!fs.existsSync(dbPath)) {
1841
- return {
1842
- success: false,
1843
- deleted: false,
1844
- key,
1845
- namespace,
1846
- remainingEntries: 0,
1847
- error: 'Database not found'
1848
- };
1849
- }
1850
- // Ensure schema has all required columns (migration for older DBs)
1851
- await ensureSchemaColumns(dbPath);
1852
- const initSqlJs = (await import('sql.js')).default;
1853
- const SQL = await initSqlJs();
1854
- const fileBuffer = fs.readFileSync(dbPath);
1855
- const db = new SQL.Database(fileBuffer);
1856
- // Check if entry exists first
1857
- const checkResult = db.exec(`
1858
- SELECT id FROM memory_entries
1859
- WHERE status = 'active'
1860
- AND key = '${key.replace(/'/g, "''")}'
1861
- AND namespace = '${namespace.replace(/'/g, "''")}'
1862
- LIMIT 1
1863
- `);
1864
- if (!checkResult[0]?.values?.[0]) {
1865
- // Get remaining count before closing
1866
- const countResult = db.exec(`SELECT COUNT(*) FROM memory_entries WHERE status = 'active'`);
1867
- const remainingEntries = countResult[0]?.values?.[0]?.[0] || 0;
1868
- db.close();
1869
- return {
1870
- success: true,
1871
- deleted: false,
1872
- key,
1873
- namespace,
1874
- remainingEntries,
1875
- error: `Key '${key}' not found in namespace '${namespace}'`
1876
- };
1877
- }
1878
- // Delete the entry (soft delete by setting status to 'deleted')
1879
- db.run(`
1880
- UPDATE memory_entries
1881
- SET status = 'deleted', updated_at = strftime('%s', 'now') * 1000
1882
- WHERE key = '${key.replace(/'/g, "''")}'
1883
- AND namespace = '${namespace.replace(/'/g, "''")}'
1884
- AND status = 'active'
1885
- `);
1886
- // Get remaining count
1887
- const countResult = db.exec(`SELECT COUNT(*) FROM memory_entries WHERE status = 'active'`);
1888
- const remainingEntries = countResult[0]?.values?.[0]?.[0] || 0;
1889
- // Save updated database
1890
- const data = db.export();
1891
- fs.writeFileSync(dbPath, Buffer.from(data));
1892
- db.close();
1893
- return {
1894
- success: true,
1895
- deleted: true,
1896
- key,
1897
- namespace,
1898
- remainingEntries
1899
- };
1900
- }
1901
- catch (error) {
1902
- return {
1903
- success: false,
1904
- deleted: false,
1905
- key,
1906
- namespace,
1907
- remainingEntries: 0,
1908
- error: error instanceof Error ? error.message : String(error)
1909
- };
1910
- }
2095
+ export function deleteEntry(options) {
2096
+ var _a, _b, _c, _d, _e, _f, _g, _h;
2097
+ return __awaiter(this, void 0, Promise, function () {
2098
+ var bridge, bridgeResult, key, _j, namespace, customPath, swarmDir, dbPath, initSqlJs, SQL, fileBuffer, db, checkStmt, checkRows, checkResult, countResult_1, remainingEntries_1, entryId, countResult, remainingEntries, data, error_10;
2099
+ return __generator(this, function (_k) {
2100
+ switch (_k.label) {
2101
+ case 0: return [4 /*yield*/, getBridge()];
2102
+ case 1:
2103
+ bridge = _k.sent();
2104
+ if (!bridge) return [3 /*break*/, 3];
2105
+ return [4 /*yield*/, bridge.bridgeDeleteEntry(options)];
2106
+ case 2:
2107
+ bridgeResult = _k.sent();
2108
+ if (bridgeResult)
2109
+ return [2 /*return*/, bridgeResult];
2110
+ _k.label = 3;
2111
+ case 3:
2112
+ key = options.key, _j = options.namespace, namespace = _j === void 0 ? 'default' : _j, customPath = options.dbPath;
2113
+ swarmDir = path.join(process.cwd(), '.swarm');
2114
+ dbPath = customPath || path.join(swarmDir, 'memory.db');
2115
+ _k.label = 4;
2116
+ case 4:
2117
+ _k.trys.push([4, 8, , 9]);
2118
+ if (!fs.existsSync(dbPath)) {
2119
+ return [2 /*return*/, {
2120
+ success: false,
2121
+ deleted: false,
2122
+ key: key,
2123
+ namespace: namespace,
2124
+ remainingEntries: 0,
2125
+ error: 'Database not found'
2126
+ }];
2127
+ }
2128
+ // Ensure schema has all required columns (migration for older DBs)
2129
+ return [4 /*yield*/, ensureSchemaColumns(dbPath)];
2130
+ case 5:
2131
+ // Ensure schema has all required columns (migration for older DBs)
2132
+ _k.sent();
2133
+ return [4 /*yield*/, import('sql.js')];
2134
+ case 6:
2135
+ initSqlJs = (_k.sent())["default"];
2136
+ return [4 /*yield*/, initSqlJs()];
2137
+ case 7:
2138
+ SQL = _k.sent();
2139
+ fileBuffer = fs.readFileSync(dbPath);
2140
+ db = new SQL.Database(fileBuffer);
2141
+ checkStmt = db.prepare("\n SELECT id FROM memory_entries\n WHERE status = 'active'\n AND key = ?\n AND namespace = ?\n LIMIT 1\n ");
2142
+ checkStmt.bind([key, namespace]);
2143
+ checkRows = [];
2144
+ while (checkStmt.step()) {
2145
+ checkRows.push(checkStmt.get());
2146
+ }
2147
+ checkStmt.free();
2148
+ checkResult = checkRows.length > 0 ? [{ values: checkRows }] : [];
2149
+ if (!((_b = (_a = checkResult[0]) === null || _a === void 0 ? void 0 : _a.values) === null || _b === void 0 ? void 0 : _b[0])) {
2150
+ countResult_1 = db.exec("SELECT COUNT(*) FROM memory_entries WHERE status = 'active'");
2151
+ remainingEntries_1 = ((_e = (_d = (_c = countResult_1[0]) === null || _c === void 0 ? void 0 : _c.values) === null || _d === void 0 ? void 0 : _d[0]) === null || _e === void 0 ? void 0 : _e[0]) || 0;
2152
+ db.close();
2153
+ return [2 /*return*/, {
2154
+ success: true,
2155
+ deleted: false,
2156
+ key: key,
2157
+ namespace: namespace,
2158
+ remainingEntries: remainingEntries_1,
2159
+ error: "Key '" + key + "' not found in namespace '" + namespace + "'"
2160
+ }];
2161
+ }
2162
+ entryId = String(checkResult[0].values[0][0]);
2163
+ // Delete the entry (soft delete by setting status to 'deleted')
2164
+ // Also null out the embedding to clean up vector data from SQLite
2165
+ db.run("\n UPDATE memory_entries\n SET status = 'deleted',\n embedding = NULL,\n updated_at = strftime('%s', 'now') * 1000\n WHERE key = ?\n AND namespace = ?\n AND status = 'active'\n ", [key, namespace]);
2166
+ countResult = db.exec("SELECT COUNT(*) FROM memory_entries WHERE status = 'active'");
2167
+ remainingEntries = ((_h = (_g = (_f = countResult[0]) === null || _f === void 0 ? void 0 : _f.values) === null || _g === void 0 ? void 0 : _g[0]) === null || _h === void 0 ? void 0 : _h[0]) || 0;
2168
+ data = db["export"]();
2169
+ fs.writeFileSync(dbPath, Buffer.from(data));
2170
+ db.close();
2171
+ // Clean up in-memory HNSW index so ghost vectors don't appear in searches.
2172
+ // Remove the entry from the HNSW entries map and invalidate the index.
2173
+ // The next search will rebuild the HNSW index from the remaining DB rows.
2174
+ if (hnswIndex === null || hnswIndex === void 0 ? void 0 : hnswIndex.entries) {
2175
+ hnswIndex.entries["delete"](entryId);
2176
+ saveHNSWMetadata();
2177
+ // Invalidate the HNSW index so it rebuilds from DB on next search.
2178
+ // We can't surgically remove a vector from the HNSW graph, so we
2179
+ // clear the entire index; it will be lazily rebuilt from SQLite.
2180
+ rebuildSearchIndex();
2181
+ }
2182
+ return [2 /*return*/, {
2183
+ success: true,
2184
+ deleted: true,
2185
+ key: key,
2186
+ namespace: namespace,
2187
+ remainingEntries: remainingEntries
2188
+ }];
2189
+ case 8:
2190
+ error_10 = _k.sent();
2191
+ return [2 /*return*/, {
2192
+ success: false,
2193
+ deleted: false,
2194
+ key: key,
2195
+ namespace: namespace,
2196
+ remainingEntries: 0,
2197
+ error: error_10 instanceof Error ? error_10.message : String(error_10)
2198
+ }];
2199
+ case 9: return [2 /*return*/];
2200
+ }
2201
+ });
2202
+ });
1911
2203
  }
1912
2204
  export default {
1913
- initializeMemoryDatabase,
1914
- checkMemoryInitialization,
1915
- checkAndMigrateLegacy,
1916
- ensureSchemaColumns,
1917
- applyTemporalDecay,
1918
- loadEmbeddingModel,
1919
- generateEmbedding,
1920
- verifyMemoryInit,
1921
- storeEntry,
1922
- searchEntries,
1923
- listEntries,
1924
- getEntry,
1925
- deleteEntry,
1926
- MEMORY_SCHEMA_V3,
1927
- getInitialMetadata
2205
+ initializeMemoryDatabase: initializeMemoryDatabase,
2206
+ checkMemoryInitialization: checkMemoryInitialization,
2207
+ checkAndMigrateLegacy: checkAndMigrateLegacy,
2208
+ ensureSchemaColumns: ensureSchemaColumns,
2209
+ applyTemporalDecay: applyTemporalDecay,
2210
+ loadEmbeddingModel: loadEmbeddingModel,
2211
+ generateEmbedding: generateEmbedding,
2212
+ verifyMemoryInit: verifyMemoryInit,
2213
+ storeEntry: storeEntry,
2214
+ searchEntries: searchEntries,
2215
+ listEntries: listEntries,
2216
+ getEntry: getEntry,
2217
+ deleteEntry: deleteEntry,
2218
+ rebuildSearchIndex: rebuildSearchIndex,
2219
+ MEMORY_SCHEMA_V3: MEMORY_SCHEMA_V3,
2220
+ getInitialMetadata: getInitialMetadata
1928
2221
  };
1929
2222
  //# sourceMappingURL=memory-initializer.js.map