@claude-flow/cli 3.32.3 → 3.32.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (683) hide show
  1. package/.claude/helpers/helpers.manifest.json +2 -2
  2. package/catalog-manifest.json +2 -2
  3. package/dist/src/agenticow/speculative-exploration.d.ts +148 -0
  4. package/dist/src/agenticow/speculative-exploration.js +218 -0
  5. package/dist/src/appliance/gguf-engine.d.ts +91 -0
  6. package/dist/src/appliance/gguf-engine.js +425 -0
  7. package/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
  8. package/dist/src/appliance/ruvllm-bridge.js +292 -0
  9. package/dist/src/appliance/rvfa-builder.d.ts +44 -0
  10. package/dist/src/appliance/rvfa-builder.js +329 -0
  11. package/dist/src/appliance/rvfa-distribution.d.ts +97 -0
  12. package/dist/src/appliance/rvfa-distribution.js +370 -0
  13. package/dist/src/appliance/rvfa-format.d.ts +111 -0
  14. package/dist/src/appliance/rvfa-format.js +393 -0
  15. package/dist/src/appliance/rvfa-runner.d.ts +69 -0
  16. package/dist/src/appliance/rvfa-runner.js +237 -0
  17. package/dist/src/appliance/rvfa-signing.d.ts +123 -0
  18. package/dist/src/appliance/rvfa-signing.js +347 -0
  19. package/dist/src/auth/client.d.ts +89 -0
  20. package/dist/src/auth/client.js +242 -0
  21. package/dist/src/auth/constants.d.ts +7 -0
  22. package/dist/src/auth/constants.js +7 -0
  23. package/dist/src/auth/scopes.d.ts +14 -0
  24. package/dist/src/auth/scopes.js +21 -0
  25. package/dist/src/auth/security-bridge.d.ts +36 -0
  26. package/dist/src/auth/security-bridge.js +42 -0
  27. package/dist/src/auth/session.d.ts +20 -0
  28. package/dist/src/auth/session.js +32 -0
  29. package/dist/src/auth/state.d.ts +19 -0
  30. package/dist/src/auth/state.js +53 -0
  31. package/dist/src/auth/types.d.ts +27 -0
  32. package/dist/src/auth/types.js +11 -0
  33. package/dist/src/autopilot-state.d.ts +77 -0
  34. package/dist/src/autopilot-state.js +271 -0
  35. package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts +18 -0
  36. package/dist/src/benchmarks/gaia-agent-planning.smoke.js +253 -0
  37. package/dist/src/benchmarks/gaia-agent.d.ts +198 -0
  38. package/dist/src/benchmarks/gaia-agent.js +651 -0
  39. package/dist/src/benchmarks/gaia-causal-memory.d.ts +133 -0
  40. package/dist/src/benchmarks/gaia-causal-memory.js +281 -0
  41. package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts +22 -0
  42. package/dist/src/benchmarks/gaia-causal-memory.smoke.js +300 -0
  43. package/dist/src/benchmarks/gaia-convergence.d.ts +138 -0
  44. package/dist/src/benchmarks/gaia-convergence.js +260 -0
  45. package/dist/src/benchmarks/gaia-convergence.smoke.d.ts +19 -0
  46. package/dist/src/benchmarks/gaia-convergence.smoke.js +246 -0
  47. package/dist/src/benchmarks/gaia-critic.d.ts +123 -0
  48. package/dist/src/benchmarks/gaia-critic.js +312 -0
  49. package/dist/src/benchmarks/gaia-critic.smoke.d.ts +21 -0
  50. package/dist/src/benchmarks/gaia-critic.smoke.js +327 -0
  51. package/dist/src/benchmarks/gaia-decomposer.d.ts +125 -0
  52. package/dist/src/benchmarks/gaia-decomposer.js +350 -0
  53. package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts +21 -0
  54. package/dist/src/benchmarks/gaia-decomposer.smoke.js +228 -0
  55. package/dist/src/benchmarks/gaia-e2e-smoke.d.ts +27 -0
  56. package/dist/src/benchmarks/gaia-e2e-smoke.js +136 -0
  57. package/dist/src/benchmarks/gaia-extract.smoke.d.ts +45 -0
  58. package/dist/src/benchmarks/gaia-extract.smoke.js +242 -0
  59. package/dist/src/benchmarks/gaia-hardness/features.d.ts +46 -0
  60. package/dist/src/benchmarks/gaia-hardness/features.js +170 -0
  61. package/dist/src/benchmarks/gaia-hardness/predictor.d.ts +105 -0
  62. package/dist/src/benchmarks/gaia-hardness/predictor.js +260 -0
  63. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts +20 -0
  64. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js +235 -0
  65. package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts +51 -0
  66. package/dist/src/benchmarks/gaia-hardness/train-data-loader.js +179 -0
  67. package/dist/src/benchmarks/gaia-judge.d.ts +88 -0
  68. package/dist/src/benchmarks/gaia-judge.js +437 -0
  69. package/dist/src/benchmarks/gaia-loader.d.ts +87 -0
  70. package/dist/src/benchmarks/gaia-loader.js +326 -0
  71. package/dist/src/benchmarks/gaia-tools/file_read.d.ts +35 -0
  72. package/dist/src/benchmarks/gaia-tools/file_read.js +403 -0
  73. package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts +126 -0
  74. package/dist/src/benchmarks/gaia-tools/grounded_query.js +225 -0
  75. package/dist/src/benchmarks/gaia-tools/index.d.ts +32 -0
  76. package/dist/src/benchmarks/gaia-tools/index.js +36 -0
  77. package/dist/src/benchmarks/gaia-tools/types.d.ts +62 -0
  78. package/dist/src/benchmarks/gaia-tools/types.js +12 -0
  79. package/dist/src/benchmarks/gaia-tools/web_search.d.ts +30 -0
  80. package/dist/src/benchmarks/gaia-tools/web_search.js +210 -0
  81. package/dist/src/benchmarks/gaia-voting.d.ts +88 -0
  82. package/dist/src/benchmarks/gaia-voting.js +297 -0
  83. package/dist/src/benchmarks/gaia-voting.smoke.d.ts +20 -0
  84. package/dist/src/benchmarks/gaia-voting.smoke.js +332 -0
  85. package/dist/src/benchmarks/pretrain/index.d.ts +58 -0
  86. package/dist/src/benchmarks/pretrain/index.js +404 -0
  87. package/dist/src/business-pods/bbs-budget-tracker.d.ts +139 -0
  88. package/dist/src/business-pods/bbs-budget-tracker.js +358 -0
  89. package/dist/src/business-pods/domain-affinity-policy.d.ts +47 -0
  90. package/dist/src/business-pods/domain-affinity-policy.js +65 -0
  91. package/dist/src/business-pods/pod-schema.d.ts +96 -0
  92. package/dist/src/business-pods/pod-schema.js +225 -0
  93. package/dist/src/commands/advisor.d.ts +15 -0
  94. package/dist/src/commands/advisor.js +94 -0
  95. package/dist/src/commands/agent-wasm.d.ts +14 -0
  96. package/dist/src/commands/agent-wasm.js +333 -0
  97. package/dist/src/commands/agent.d.ts +8 -0
  98. package/dist/src/commands/agent.js +927 -0
  99. package/dist/src/commands/analyze.d.ts +19 -0
  100. package/dist/src/commands/analyze.js +2047 -0
  101. package/dist/src/commands/announcements.d.ts +17 -0
  102. package/dist/src/commands/announcements.js +0 -0
  103. package/dist/src/commands/appliance-advanced.d.ts +9 -0
  104. package/dist/src/commands/appliance-advanced.js +215 -0
  105. package/dist/src/commands/appliance.d.ts +8 -0
  106. package/dist/src/commands/appliance.js +404 -0
  107. package/dist/src/commands/auth.d.ts +15 -0
  108. package/dist/src/commands/auth.js +244 -0
  109. package/dist/src/commands/autopilot.d.ts +15 -0
  110. package/dist/src/commands/autopilot.js +407 -0
  111. package/dist/src/commands/benchmark.d.ts +10 -0
  112. package/dist/src/commands/benchmark.js +460 -0
  113. package/dist/src/commands/claims.d.ts +10 -0
  114. package/dist/src/commands/claims.js +620 -0
  115. package/dist/src/commands/cleanup.d.ts +13 -0
  116. package/dist/src/commands/cleanup.js +250 -0
  117. package/dist/src/commands/completions.d.ts +10 -0
  118. package/dist/src/commands/completions.js +539 -0
  119. package/dist/src/commands/config.d.ts +8 -0
  120. package/dist/src/commands/config.js +428 -0
  121. package/dist/src/commands/daemon.d.ts +59 -0
  122. package/dist/src/commands/daemon.js +1733 -0
  123. package/dist/src/commands/deployment.d.ts +10 -0
  124. package/dist/src/commands/deployment.js +672 -0
  125. package/dist/src/commands/doctor.d.ts +10 -0
  126. package/dist/src/commands/doctor.js +1902 -0
  127. package/dist/src/commands/eject.d.ts +33 -0
  128. package/dist/src/commands/eject.js +195 -0
  129. package/dist/src/commands/embeddings.d.ts +18 -0
  130. package/dist/src/commands/embeddings.js +1623 -0
  131. package/dist/src/commands/funnel.d.ts +18 -0
  132. package/dist/src/commands/funnel.js +302 -0
  133. package/dist/src/commands/gaia-bench.d.ts +40 -0
  134. package/dist/src/commands/gaia-bench.js +597 -0
  135. package/dist/src/commands/guidance.d.ts +8 -0
  136. package/dist/src/commands/guidance.js +556 -0
  137. package/dist/src/commands/hive-mind.d.ts +11 -0
  138. package/dist/src/commands/hive-mind.js +1319 -0
  139. package/dist/src/commands/hooks.d.ts +8 -0
  140. package/dist/src/commands/hooks.js +4606 -0
  141. package/dist/src/commands/index.d.ts +118 -0
  142. package/dist/src/commands/index.js +366 -0
  143. package/dist/src/commands/init.d.ts +13 -0
  144. package/dist/src/commands/init.js +1297 -0
  145. package/dist/src/commands/issues.d.ts +21 -0
  146. package/dist/src/commands/issues.js +567 -0
  147. package/dist/src/commands/mcp.d.ts +11 -0
  148. package/dist/src/commands/mcp.js +732 -0
  149. package/dist/src/commands/memory-backup.d.ts +11 -0
  150. package/dist/src/commands/memory-backup.js +46 -0
  151. package/dist/src/commands/memory-distill.d.ts +27 -0
  152. package/dist/src/commands/memory-distill.js +374 -0
  153. package/dist/src/commands/memory.d.ts +8 -0
  154. package/dist/src/commands/memory.js +1596 -0
  155. package/dist/src/commands/metaharness.d.ts +39 -0
  156. package/dist/src/commands/metaharness.js +215 -0
  157. package/dist/src/commands/migrate.d.ts +8 -0
  158. package/dist/src/commands/migrate.js +742 -0
  159. package/dist/src/commands/neural.d.ts +10 -0
  160. package/dist/src/commands/neural.js +4331 -0
  161. package/dist/src/commands/performance.d.ts +10 -0
  162. package/dist/src/commands/performance.js +583 -0
  163. package/dist/src/commands/plugins.d.ts +11 -0
  164. package/dist/src/commands/plugins.js +826 -0
  165. package/dist/src/commands/process.d.ts +10 -0
  166. package/dist/src/commands/process.js +694 -0
  167. package/dist/src/commands/progress.d.ts +11 -0
  168. package/dist/src/commands/progress.js +259 -0
  169. package/dist/src/commands/providers.d.ts +10 -0
  170. package/dist/src/commands/providers.js +502 -0
  171. package/dist/src/commands/proxy-lifecycle.d.ts +12 -0
  172. package/dist/src/commands/proxy-lifecycle.js +232 -0
  173. package/dist/src/commands/proxy.d.ts +21 -0
  174. package/dist/src/commands/proxy.js +398 -0
  175. package/dist/src/commands/route.d.ts +16 -0
  176. package/dist/src/commands/route.js +822 -0
  177. package/dist/src/commands/ruvector/backup.d.ts +11 -0
  178. package/dist/src/commands/ruvector/backup.js +747 -0
  179. package/dist/src/commands/ruvector/benchmark.d.ts +11 -0
  180. package/dist/src/commands/ruvector/benchmark.js +490 -0
  181. package/dist/src/commands/ruvector/import.d.ts +18 -0
  182. package/dist/src/commands/ruvector/import.js +373 -0
  183. package/dist/src/commands/ruvector/index.d.ts +29 -0
  184. package/dist/src/commands/ruvector/index.js +129 -0
  185. package/dist/src/commands/ruvector/init.d.ts +11 -0
  186. package/dist/src/commands/ruvector/init.js +467 -0
  187. package/dist/src/commands/ruvector/migrate.d.ts +11 -0
  188. package/dist/src/commands/ruvector/migrate.js +498 -0
  189. package/dist/src/commands/ruvector/optimize.d.ts +11 -0
  190. package/dist/src/commands/ruvector/optimize.js +505 -0
  191. package/dist/src/commands/ruvector/pg-utils.d.ts +14 -0
  192. package/dist/src/commands/ruvector/pg-utils.js +41 -0
  193. package/dist/src/commands/ruvector/setup.d.ts +18 -0
  194. package/dist/src/commands/ruvector/setup.js +765 -0
  195. package/dist/src/commands/ruvector/status.d.ts +11 -0
  196. package/dist/src/commands/ruvector/status.js +479 -0
  197. package/dist/src/commands/security.d.ts +10 -0
  198. package/dist/src/commands/security.js +1012 -0
  199. package/dist/src/commands/session.d.ts +8 -0
  200. package/dist/src/commands/session.js +757 -0
  201. package/dist/src/commands/settings.d.ts +19 -0
  202. package/dist/src/commands/settings.js +180 -0
  203. package/dist/src/commands/spinner.d.ts +16 -0
  204. package/dist/src/commands/spinner.js +329 -0
  205. package/dist/src/commands/start.d.ts +8 -0
  206. package/dist/src/commands/start.js +418 -0
  207. package/dist/src/commands/status.d.ts +8 -0
  208. package/dist/src/commands/status.js +608 -0
  209. package/dist/src/commands/swarm.d.ts +8 -0
  210. package/dist/src/commands/swarm.js +891 -0
  211. package/dist/src/commands/task.d.ts +8 -0
  212. package/dist/src/commands/task.js +675 -0
  213. package/dist/src/commands/transfer-store.d.ts +13 -0
  214. package/dist/src/commands/transfer-store.js +428 -0
  215. package/dist/src/commands/update.d.ts +8 -0
  216. package/dist/src/commands/update.js +276 -0
  217. package/dist/src/commands/verify.d.ts +19 -0
  218. package/dist/src/commands/verify.js +261 -0
  219. package/dist/src/commands/version.d.ts +42 -0
  220. package/dist/src/commands/version.js +106 -0
  221. package/dist/src/commands/workflow.d.ts +8 -0
  222. package/dist/src/commands/workflow.js +617 -0
  223. package/dist/src/config/harness-feedback-applier.d.ts +50 -0
  224. package/dist/src/config/harness-feedback-applier.js +122 -0
  225. package/dist/src/config/proven-config-refresh.d.ts +39 -0
  226. package/dist/src/config/proven-config-refresh.js +154 -0
  227. package/dist/src/config/proven-config-rvfa.d.ts +23 -0
  228. package/dist/src/config/proven-config-rvfa.js +73 -0
  229. package/dist/src/config/proven-config.d.ts +86 -0
  230. package/dist/src/config/proven-config.js +176 -0
  231. package/dist/src/config-adapter.d.ts +15 -0
  232. package/dist/src/config-adapter.js +186 -0
  233. package/dist/src/encryption/vault.d.ts +94 -0
  234. package/dist/src/encryption/vault.js +172 -0
  235. package/dist/src/fs-secure.d.ts +86 -0
  236. package/dist/src/fs-secure.js +133 -0
  237. package/dist/src/funnel/advisor-tip.d.ts +58 -0
  238. package/dist/src/funnel/advisor-tip.js +92 -0
  239. package/dist/src/funnel/attribution.d.ts +37 -0
  240. package/dist/src/funnel/attribution.js +101 -0
  241. package/dist/src/funnel/consent.d.ts +22 -0
  242. package/dist/src/funnel/consent.js +58 -0
  243. package/dist/src/funnel/credit-errors.d.ts +31 -0
  244. package/dist/src/funnel/credit-errors.js +88 -0
  245. package/dist/src/funnel/credit-notifier.d.ts +44 -0
  246. package/dist/src/funnel/credit-notifier.js +74 -0
  247. package/dist/src/funnel/disclosure.d.ts +47 -0
  248. package/dist/src/funnel/disclosure.js +109 -0
  249. package/dist/src/funnel/enrollment.d.ts +36 -0
  250. package/dist/src/funnel/enrollment.js +64 -0
  251. package/dist/src/funnel/environment.d.ts +17 -0
  252. package/dist/src/funnel/environment.js +39 -0
  253. package/dist/src/funnel/event-transport.d.ts +51 -0
  254. package/dist/src/funnel/event-transport.js +199 -0
  255. package/dist/src/funnel/events.d.ts +42 -0
  256. package/dist/src/funnel/events.js +150 -0
  257. package/dist/src/funnel/index.d.ts +21 -0
  258. package/dist/src/funnel/index.js +21 -0
  259. package/dist/src/funnel/insights.d.ts +50 -0
  260. package/dist/src/funnel/insights.js +120 -0
  261. package/dist/src/funnel/local-signals.d.ts +20 -0
  262. package/dist/src/funnel/local-signals.js +77 -0
  263. package/dist/src/funnel/message-transport.d.ts +51 -0
  264. package/dist/src/funnel/message-transport.js +149 -0
  265. package/dist/src/funnel/messages.d.ts +55 -0
  266. package/dist/src/funnel/messages.js +160 -0
  267. package/dist/src/funnel/payout.d.ts +40 -0
  268. package/dist/src/funnel/payout.js +60 -0
  269. package/dist/src/funnel/power-saver-notifier.d.ts +44 -0
  270. package/dist/src/funnel/power-saver-notifier.js +92 -0
  271. package/dist/src/funnel/precedence.d.ts +16 -0
  272. package/dist/src/funnel/precedence.js +85 -0
  273. package/dist/src/funnel/promo.d.ts +41 -0
  274. package/dist/src/funnel/promo.js +144 -0
  275. package/dist/src/funnel/rate-limit-notifier.d.ts +55 -0
  276. package/dist/src/funnel/rate-limit-notifier.js +102 -0
  277. package/dist/src/funnel/rotation.d.ts +19 -0
  278. package/dist/src/funnel/rotation.js +70 -0
  279. package/dist/src/funnel/state.d.ts +13 -0
  280. package/dist/src/funnel/state.js +52 -0
  281. package/dist/src/funnel/toggle-cooldown.d.ts +17 -0
  282. package/dist/src/funnel/toggle-cooldown.js +32 -0
  283. package/dist/src/funnel/types.d.ts +98 -0
  284. package/dist/src/funnel/types.js +26 -0
  285. package/dist/src/index.d.ts +81 -0
  286. package/dist/src/index.js +609 -0
  287. package/dist/src/infrastructure/in-memory-repositories.d.ts +68 -0
  288. package/dist/src/infrastructure/in-memory-repositories.js +264 -0
  289. package/dist/src/init/claudemd-generator.d.ts +16 -0
  290. package/dist/src/init/claudemd-generator.js +368 -0
  291. package/dist/src/init/executor.d.ts +41 -0
  292. package/dist/src/init/executor.js +2142 -0
  293. package/dist/src/init/helper-refresh.d.ts +79 -0
  294. package/dist/src/init/helper-refresh.js +347 -0
  295. package/dist/src/init/helper-signing.d.ts +37 -0
  296. package/dist/src/init/helper-signing.js +67 -0
  297. package/dist/src/init/helpers-generator.d.ts +87 -0
  298. package/dist/src/init/helpers-generator.js +1456 -0
  299. package/dist/src/init/index.d.ts +13 -0
  300. package/dist/src/init/index.js +15 -0
  301. package/dist/src/init/mcp-generator.d.ts +26 -0
  302. package/dist/src/init/mcp-generator.js +126 -0
  303. package/dist/src/init/memory-package-resolver.d.ts +53 -0
  304. package/dist/src/init/memory-package-resolver.js +118 -0
  305. package/dist/src/init/settings-generator.d.ts +14 -0
  306. package/dist/src/init/settings-generator.js +462 -0
  307. package/dist/src/init/statusline-generator.d.ts +28 -0
  308. package/dist/src/init/statusline-generator.js +177 -0
  309. package/dist/src/init/types.d.ts +331 -0
  310. package/dist/src/init/types.js +276 -0
  311. package/dist/src/log-filters.d.ts +46 -0
  312. package/dist/src/log-filters.js +107 -0
  313. package/dist/src/mcp-client.d.ts +92 -0
  314. package/dist/src/mcp-client.js +397 -0
  315. package/dist/src/mcp-server.d.ts +163 -0
  316. package/dist/src/mcp-server.js +751 -0
  317. package/dist/src/mcp-tools/agent-execute-core.d.ts +115 -0
  318. package/dist/src/mcp-tools/agent-execute-core.js +587 -0
  319. package/dist/src/mcp-tools/agent-tools.d.ts +9 -0
  320. package/dist/src/mcp-tools/agent-tools.js +837 -0
  321. package/dist/src/mcp-tools/agentbbs-tools.d.ts +28 -0
  322. package/dist/src/mcp-tools/agentbbs-tools.js +394 -0
  323. package/dist/src/mcp-tools/agentdb-tools.d.ts +35 -0
  324. package/dist/src/mcp-tools/agentdb-tools.js +1473 -0
  325. package/dist/src/mcp-tools/agenticow-loader.d.ts +59 -0
  326. package/dist/src/mcp-tools/agenticow-loader.js +105 -0
  327. package/dist/src/mcp-tools/agenticow-speculate-tools.d.ts +24 -0
  328. package/dist/src/mcp-tools/agenticow-speculate-tools.js +209 -0
  329. package/dist/src/mcp-tools/agenticow-tools.d.ts +36 -0
  330. package/dist/src/mcp-tools/agenticow-tools.js +360 -0
  331. package/dist/src/mcp-tools/analyze-tools.d.ts +38 -0
  332. package/dist/src/mcp-tools/analyze-tools.js +346 -0
  333. package/dist/src/mcp-tools/auto-install.d.ts +83 -0
  334. package/dist/src/mcp-tools/auto-install.js +131 -0
  335. package/dist/src/mcp-tools/autopilot-tools.d.ts +12 -0
  336. package/dist/src/mcp-tools/autopilot-tools.js +231 -0
  337. package/dist/src/mcp-tools/browser-intent-tools.d.ts +162 -0
  338. package/dist/src/mcp-tools/browser-intent-tools.js +548 -0
  339. package/dist/src/mcp-tools/browser-session-tools.d.ts +27 -0
  340. package/dist/src/mcp-tools/browser-session-tools.js +398 -0
  341. package/dist/src/mcp-tools/browser-tools.d.ts +21 -0
  342. package/dist/src/mcp-tools/browser-tools.js +760 -0
  343. package/dist/src/mcp-tools/business-pod-tools.d.ts +20 -0
  344. package/dist/src/mcp-tools/business-pod-tools.js +169 -0
  345. package/dist/src/mcp-tools/claims-tools.d.ts +12 -0
  346. package/dist/src/mcp-tools/claims-tools.js +863 -0
  347. package/dist/src/mcp-tools/config-tools.d.ts +8 -0
  348. package/dist/src/mcp-tools/config-tools.js +411 -0
  349. package/dist/src/mcp-tools/coordination-tools.d.ts +13 -0
  350. package/dist/src/mcp-tools/coordination-tools.js +729 -0
  351. package/dist/src/mcp-tools/daa-tools.d.ts +13 -0
  352. package/dist/src/mcp-tools/daa-tools.js +534 -0
  353. package/dist/src/mcp-tools/embeddings-tools.d.ts +9 -0
  354. package/dist/src/mcp-tools/embeddings-tools.js +904 -0
  355. package/dist/src/mcp-tools/github-tools.d.ts +9 -0
  356. package/dist/src/mcp-tools/github-tools.js +659 -0
  357. package/dist/src/mcp-tools/guidance-tools.d.ts +15 -0
  358. package/dist/src/mcp-tools/guidance-tools.js +639 -0
  359. package/dist/src/mcp-tools/hive-mind-tools.d.ts +8 -0
  360. package/dist/src/mcp-tools/hive-mind-tools.js +953 -0
  361. package/dist/src/mcp-tools/hooks-tools.d.ts +65 -0
  362. package/dist/src/mcp-tools/hooks-tools.js +4836 -0
  363. package/dist/src/mcp-tools/http-fetch-tools.d.ts +55 -0
  364. package/dist/src/mcp-tools/http-fetch-tools.js +329 -0
  365. package/dist/src/mcp-tools/index.d.ts +34 -0
  366. package/dist/src/mcp-tools/index.js +40 -0
  367. package/dist/src/mcp-tools/managed-agent-tools.d.ts +22 -0
  368. package/dist/src/mcp-tools/managed-agent-tools.js +357 -0
  369. package/dist/src/mcp-tools/memory-tools.d.ts +14 -0
  370. package/dist/src/mcp-tools/memory-tools.js +1330 -0
  371. package/dist/src/mcp-tools/metaharness-tools.d.ts +51 -0
  372. package/dist/src/mcp-tools/metaharness-tools.js +684 -0
  373. package/dist/src/mcp-tools/neural-tools.d.ts +54 -0
  374. package/dist/src/mcp-tools/neural-tools.js +1168 -0
  375. package/dist/src/mcp-tools/performance-tools.d.ts +16 -0
  376. package/dist/src/mcp-tools/performance-tools.js +675 -0
  377. package/dist/src/mcp-tools/progress-tools.d.ts +14 -0
  378. package/dist/src/mcp-tools/progress-tools.js +348 -0
  379. package/dist/src/mcp-tools/request-tracker.d.ts +17 -0
  380. package/dist/src/mcp-tools/request-tracker.js +27 -0
  381. package/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
  382. package/dist/src/mcp-tools/ruvllm-tools.js +355 -0
  383. package/dist/src/mcp-tools/security-tools.d.ts +18 -0
  384. package/dist/src/mcp-tools/security-tools.js +556 -0
  385. package/dist/src/mcp-tools/session-tools.d.ts +8 -0
  386. package/dist/src/mcp-tools/session-tools.js +517 -0
  387. package/dist/src/mcp-tools/swarm-tools.d.ts +37 -0
  388. package/dist/src/mcp-tools/swarm-tools.js +390 -0
  389. package/dist/src/mcp-tools/system-tools.d.ts +13 -0
  390. package/dist/src/mcp-tools/system-tools.js +688 -0
  391. package/dist/src/mcp-tools/task-tools.d.ts +8 -0
  392. package/dist/src/mcp-tools/task-tools.js +487 -0
  393. package/dist/src/mcp-tools/terminal-tools.d.ts +8 -0
  394. package/dist/src/mcp-tools/terminal-tools.js +306 -0
  395. package/dist/src/mcp-tools/testgen-tools.d.ts +26 -0
  396. package/dist/src/mcp-tools/testgen-tools.js +168 -0
  397. package/dist/src/mcp-tools/tool-loop-guardrail.d.ts +31 -0
  398. package/dist/src/mcp-tools/tool-loop-guardrail.js +71 -0
  399. package/dist/src/mcp-tools/transfer-tools.d.ts +14 -0
  400. package/dist/src/mcp-tools/transfer-tools.js +447 -0
  401. package/dist/src/mcp-tools/types.d.ts +8 -0
  402. package/dist/src/mcp-tools/types.js +8 -0
  403. package/dist/src/mcp-tools/validate-input.d.ts +9 -0
  404. package/dist/src/mcp-tools/validate-input.js +9 -0
  405. package/dist/src/mcp-tools/wasm-agent-tools.d.ts +13 -0
  406. package/dist/src/mcp-tools/wasm-agent-tools.js +840 -0
  407. package/dist/src/mcp-tools/workflow-tools.d.ts +8 -0
  408. package/dist/src/mcp-tools/workflow-tools.js +884 -0
  409. package/dist/src/memory/bge-embedder.d.ts +25 -0
  410. package/dist/src/memory/bge-embedder.js +121 -0
  411. package/dist/src/memory/cross-encoder-rerank.d.ts +33 -0
  412. package/dist/src/memory/cross-encoder-rerank.js +123 -0
  413. package/dist/src/memory/embedding-policy.d.ts +21 -0
  414. package/dist/src/memory/embedding-policy.js +30 -0
  415. package/dist/src/memory/embedding-quantization.d.ts +62 -0
  416. package/dist/src/memory/embedding-quantization.js +156 -0
  417. package/dist/src/memory/ewc-consolidation.d.ts +305 -0
  418. package/dist/src/memory/ewc-consolidation.js +611 -0
  419. package/dist/src/memory/graph-edge-writer.d.ts +95 -0
  420. package/dist/src/memory/graph-edge-writer.js +217 -0
  421. package/dist/src/memory/hybrid-retrieval.d.ts +77 -0
  422. package/dist/src/memory/hybrid-retrieval.js +192 -0
  423. package/dist/src/memory/intelligence.d.ts +405 -0
  424. package/dist/src/memory/intelligence.js +1316 -0
  425. package/dist/src/memory/lucene-bm25.d.ts +19 -0
  426. package/dist/src/memory/lucene-bm25.js +308 -0
  427. package/dist/src/memory/memory-bridge.d.ts +537 -0
  428. package/dist/src/memory/memory-bridge.js +2460 -0
  429. package/dist/src/memory/memory-initializer.d.ts +556 -0
  430. package/dist/src/memory/memory-initializer.js +3021 -0
  431. package/dist/src/memory/neural-package-bridge.d.ts +48 -0
  432. package/dist/src/memory/neural-package-bridge.js +87 -0
  433. package/dist/src/memory/rabitq-index.d.ts +60 -0
  434. package/dist/src/memory/rabitq-index.js +242 -0
  435. package/dist/src/memory/sona-optimizer.d.ts +267 -0
  436. package/dist/src/memory/sona-optimizer.js +779 -0
  437. package/dist/src/memory/structured-distill.d.ts +48 -0
  438. package/dist/src/memory/structured-distill.js +125 -0
  439. package/dist/src/output.d.ts +9 -0
  440. package/dist/src/output.js +9 -0
  441. package/dist/src/parser.d.ts +89 -0
  442. package/dist/src/parser.js +516 -0
  443. package/dist/src/plugins/manager.d.ts +133 -0
  444. package/dist/src/plugins/manager.js +415 -0
  445. package/dist/src/plugins/store/discovery.d.ts +99 -0
  446. package/dist/src/plugins/store/discovery.js +1224 -0
  447. package/dist/src/plugins/store/index.d.ts +76 -0
  448. package/dist/src/plugins/store/index.js +141 -0
  449. package/dist/src/plugins/store/search.d.ts +46 -0
  450. package/dist/src/plugins/store/search.js +230 -0
  451. package/dist/src/plugins/store/types.d.ts +279 -0
  452. package/dist/src/plugins/store/types.js +7 -0
  453. package/dist/src/plugins/tests/demo-plugin-store.d.ts +7 -0
  454. package/dist/src/plugins/tests/demo-plugin-store.js +126 -0
  455. package/dist/src/plugins/tests/standalone-test.d.ts +12 -0
  456. package/dist/src/plugins/tests/standalone-test.js +188 -0
  457. package/dist/src/plugins/tests/test-plugin-store.d.ts +7 -0
  458. package/dist/src/plugins/tests/test-plugin-store.js +206 -0
  459. package/dist/src/production/circuit-breaker.d.ts +101 -0
  460. package/dist/src/production/circuit-breaker.js +241 -0
  461. package/dist/src/production/error-handler.d.ts +92 -0
  462. package/dist/src/production/error-handler.js +299 -0
  463. package/dist/src/production/index.d.ts +23 -0
  464. package/dist/src/production/index.js +18 -0
  465. package/dist/src/production/monitoring.d.ts +161 -0
  466. package/dist/src/production/monitoring.js +356 -0
  467. package/dist/src/production/rate-limiter.d.ts +80 -0
  468. package/dist/src/production/rate-limiter.js +201 -0
  469. package/dist/src/production/retry.d.ts +48 -0
  470. package/dist/src/production/retry.js +179 -0
  471. package/dist/src/prompt.d.ts +44 -0
  472. package/dist/src/prompt.js +501 -0
  473. package/dist/src/proxy/install.d.ts +29 -0
  474. package/dist/src/proxy/install.js +135 -0
  475. package/dist/src/proxy/lifecycle.d.ts +61 -0
  476. package/dist/src/proxy/lifecycle.js +249 -0
  477. package/dist/src/proxy/paths.d.ts +34 -0
  478. package/dist/src/proxy/paths.js +70 -0
  479. package/dist/src/proxy/release.d.ts +47 -0
  480. package/dist/src/proxy/release.js +138 -0
  481. package/dist/src/proxy/token-bridge.d.ts +5 -0
  482. package/dist/src/proxy/token-bridge.js +61 -0
  483. package/dist/src/proxy/verify.d.ts +44 -0
  484. package/dist/src/proxy/verify.js +68 -0
  485. package/dist/src/runtime/headless.d.ts +60 -0
  486. package/dist/src/runtime/headless.js +284 -0
  487. package/dist/src/runtime/parent-death-watchdog.d.ts +42 -0
  488. package/dist/src/runtime/parent-death-watchdog.js +70 -0
  489. package/dist/src/ruvector/agent-wasm.d.ts +228 -0
  490. package/dist/src/ruvector/agent-wasm.js +463 -0
  491. package/dist/src/ruvector/ast-analyzer.d.ts +67 -0
  492. package/dist/src/ruvector/ast-analyzer.js +277 -0
  493. package/dist/src/ruvector/codemods/engine.d.ts +45 -0
  494. package/dist/src/ruvector/codemods/engine.js +291 -0
  495. package/dist/src/ruvector/codemods/scope-analysis.d.ts +29 -0
  496. package/dist/src/ruvector/codemods/scope-analysis.js +162 -0
  497. package/dist/src/ruvector/coverage-router.d.ts +160 -0
  498. package/dist/src/ruvector/coverage-router.js +531 -0
  499. package/dist/src/ruvector/coverage-tools.d.ts +33 -0
  500. package/dist/src/ruvector/coverage-tools.js +157 -0
  501. package/dist/src/ruvector/diff-classifier.d.ts +175 -0
  502. package/dist/src/ruvector/diff-classifier.js +699 -0
  503. package/dist/src/ruvector/diskann-backend.d.ts +78 -0
  504. package/dist/src/ruvector/diskann-backend.js +310 -0
  505. package/dist/src/ruvector/enhanced-model-router.d.ts +172 -0
  506. package/dist/src/ruvector/enhanced-model-router.js +577 -0
  507. package/dist/src/ruvector/graph-analyzer.d.ts +187 -0
  508. package/dist/src/ruvector/graph-analyzer.js +929 -0
  509. package/dist/src/ruvector/graph-backend.d.ts +79 -0
  510. package/dist/src/ruvector/graph-backend.js +220 -0
  511. package/dist/src/ruvector/index.d.ts +38 -0
  512. package/dist/src/ruvector/index.js +86 -0
  513. package/dist/src/ruvector/lora-adapter.d.ts +292 -0
  514. package/dist/src/ruvector/lora-adapter.js +710 -0
  515. package/dist/src/ruvector/model-prices.d.ts +50 -0
  516. package/dist/src/ruvector/model-prices.js +72 -0
  517. package/dist/src/ruvector/model-router.d.ts +408 -0
  518. package/dist/src/ruvector/model-router.js +1162 -0
  519. package/dist/src/ruvector/neural-router.d.ts +182 -0
  520. package/dist/src/ruvector/neural-router.js +825 -0
  521. package/dist/src/ruvector/output-verifier.d.ts +83 -0
  522. package/dist/src/ruvector/output-verifier.js +277 -0
  523. package/dist/src/ruvector/q-learning-router.d.ts +227 -0
  524. package/dist/src/ruvector/q-learning-router.js +721 -0
  525. package/dist/src/ruvector/router-calibrator.d.ts +65 -0
  526. package/dist/src/ruvector/router-calibrator.js +120 -0
  527. package/dist/src/ruvector/router-parallel-recorder.d.ts +127 -0
  528. package/dist/src/ruvector/router-parallel-recorder.js +183 -0
  529. package/dist/src/ruvector/router-trajectory.d.ts +194 -0
  530. package/dist/src/ruvector/router-trajectory.js +281 -0
  531. package/dist/src/ruvector/run-transcript-recorder.d.ts +154 -0
  532. package/dist/src/ruvector/run-transcript-recorder.js +209 -0
  533. package/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
  534. package/dist/src/ruvector/ruvllm-wasm.js +379 -0
  535. package/dist/src/ruvector/semantic-router.d.ts +77 -0
  536. package/dist/src/ruvector/semantic-router.js +178 -0
  537. package/dist/src/ruvector/task-embedder.d.ts +56 -0
  538. package/dist/src/ruvector/task-embedder.js +237 -0
  539. package/dist/src/ruvector/trajectory-tree.d.ts +113 -0
  540. package/dist/src/ruvector/trajectory-tree.js +237 -0
  541. package/dist/src/ruvector/vector-db.d.ts +73 -0
  542. package/dist/src/ruvector/vector-db.js +301 -0
  543. package/dist/src/ruvector/wasm-embedder.d.ts +13 -0
  544. package/dist/src/ruvector/wasm-embedder.js +143 -0
  545. package/dist/src/security/builtin-aidefence.d.ts +34 -0
  546. package/dist/src/security/builtin-aidefence.js +86 -0
  547. package/dist/src/services/agentic-flow-bridge.d.ts +50 -0
  548. package/dist/src/services/agentic-flow-bridge.js +95 -0
  549. package/dist/src/services/ai-job-dedup.d.ts +61 -0
  550. package/dist/src/services/ai-job-dedup.js +136 -0
  551. package/dist/src/services/checkpoint-gate.d.ts +140 -0
  552. package/dist/src/services/checkpoint-gate.js +223 -0
  553. package/dist/src/services/claim-service.d.ts +204 -0
  554. package/dist/src/services/claim-service.js +818 -0
  555. package/dist/src/services/config-file-manager.d.ts +37 -0
  556. package/dist/src/services/config-file-manager.js +224 -0
  557. package/dist/src/services/container-worker-pool.d.ts +204 -0
  558. package/dist/src/services/container-worker-pool.js +589 -0
  559. package/dist/src/services/daemon-autostart.d.ts +17 -0
  560. package/dist/src/services/daemon-autostart.js +102 -0
  561. package/dist/src/services/distill-oracle.d.ts +190 -0
  562. package/dist/src/services/distill-oracle.js +349 -0
  563. package/dist/src/services/distill-tuning.d.ts +111 -0
  564. package/dist/src/services/distill-tuning.js +510 -0
  565. package/dist/src/services/evolve-proof.d.ts +253 -0
  566. package/dist/src/services/evolve-proof.js +343 -0
  567. package/dist/src/services/fable-harness.d.ts +208 -0
  568. package/dist/src/services/fable-harness.js +388 -0
  569. package/dist/src/services/git-workspace-identity.d.ts +42 -0
  570. package/dist/src/services/git-workspace-identity.js +99 -0
  571. package/dist/src/services/global-ai-budget.d.ts +135 -0
  572. package/dist/src/services/global-ai-budget.js +415 -0
  573. package/dist/src/services/harness-benchmark.d.ts +68 -0
  574. package/dist/src/services/harness-benchmark.js +94 -0
  575. package/dist/src/services/harness-canary.d.ts +60 -0
  576. package/dist/src/services/harness-canary.js +69 -0
  577. package/dist/src/services/harness-corpus-harvester.d.ts +51 -0
  578. package/dist/src/services/harness-corpus-harvester.js +74 -0
  579. package/dist/src/services/harness-flywheel-generations.d.ts +115 -0
  580. package/dist/src/services/harness-flywheel-generations.js +360 -0
  581. package/dist/src/services/harness-flywheel-runtime.d.ts +25 -0
  582. package/dist/src/services/harness-flywheel-runtime.js +92 -0
  583. package/dist/src/services/harness-flywheel.d.ts +48 -0
  584. package/dist/src/services/harness-flywheel.js +207 -0
  585. package/dist/src/services/harness-frozen-eval.d.ts +22 -0
  586. package/dist/src/services/harness-frozen-eval.js +66 -0
  587. package/dist/src/services/harness-hosts.d.ts +40 -0
  588. package/dist/src/services/harness-hosts.js +88 -0
  589. package/dist/src/services/harness-improvement-ledger.d.ts +63 -0
  590. package/dist/src/services/harness-improvement-ledger.js +101 -0
  591. package/dist/src/services/harness-loop.d.ts +53 -0
  592. package/dist/src/services/harness-loop.js +85 -0
  593. package/dist/src/services/harness-qualification.d.ts +66 -0
  594. package/dist/src/services/harness-qualification.js +143 -0
  595. package/dist/src/services/harness-replay.d.ts +37 -0
  596. package/dist/src/services/harness-replay.js +92 -0
  597. package/dist/src/services/harness-verify.d.ts +33 -0
  598. package/dist/src/services/harness-verify.js +26 -0
  599. package/dist/src/services/harness-worker.d.ts +23 -0
  600. package/dist/src/services/harness-worker.js +66 -0
  601. package/dist/src/services/headless-worker-executor.d.ts +358 -0
  602. package/dist/src/services/headless-worker-executor.js +1269 -0
  603. package/dist/src/services/index.d.ts +13 -0
  604. package/dist/src/services/index.js +11 -0
  605. package/dist/src/services/memory-backup.d.ts +53 -0
  606. package/dist/src/services/memory-backup.js +198 -0
  607. package/dist/src/services/memory-distillation.d.ts +41 -0
  608. package/dist/src/services/memory-distillation.js +277 -0
  609. package/dist/src/services/native-training.d.ts +68 -0
  610. package/dist/src/services/native-training.js +141 -0
  611. package/dist/src/services/registry-api.d.ts +58 -0
  612. package/dist/src/services/registry-api.js +146 -0
  613. package/dist/src/services/repo-supervisor.d.ts +70 -0
  614. package/dist/src/services/repo-supervisor.js +228 -0
  615. package/dist/src/services/ruvector-training.d.ts +222 -0
  616. package/dist/src/services/ruvector-training.js +693 -0
  617. package/dist/src/services/swarm-memory-branches.d.ts +135 -0
  618. package/dist/src/services/swarm-memory-branches.js +213 -0
  619. package/dist/src/services/weight-eft.d.ts +305 -0
  620. package/dist/src/services/weight-eft.js +296 -0
  621. package/dist/src/services/worker-daemon.d.ts +439 -0
  622. package/dist/src/services/worker-daemon.js +1865 -0
  623. package/dist/src/services/worker-queue.d.ts +194 -0
  624. package/dist/src/services/worker-queue.js +513 -0
  625. package/dist/src/services/workspace-lease.d.ts +55 -0
  626. package/dist/src/services/workspace-lease.js +191 -0
  627. package/dist/src/suggest.d.ts +53 -0
  628. package/dist/src/suggest.js +200 -0
  629. package/dist/src/transfer/anonymization/index.d.ts +25 -0
  630. package/dist/src/transfer/anonymization/index.js +175 -0
  631. package/dist/src/transfer/deploy-seraphine.d.ts +13 -0
  632. package/dist/src/transfer/deploy-seraphine.js +205 -0
  633. package/dist/src/transfer/export.d.ts +25 -0
  634. package/dist/src/transfer/export.js +113 -0
  635. package/dist/src/transfer/index.d.ts +12 -0
  636. package/dist/src/transfer/index.js +31 -0
  637. package/dist/src/transfer/ipfs/client.d.ts +109 -0
  638. package/dist/src/transfer/ipfs/client.js +307 -0
  639. package/dist/src/transfer/ipfs/upload.d.ts +95 -0
  640. package/dist/src/transfer/ipfs/upload.js +413 -0
  641. package/dist/src/transfer/models/seraphine.d.ts +72 -0
  642. package/dist/src/transfer/models/seraphine.js +373 -0
  643. package/dist/src/transfer/serialization/cfp.d.ts +49 -0
  644. package/dist/src/transfer/serialization/cfp.js +183 -0
  645. package/dist/src/transfer/storage/gcs.d.ts +82 -0
  646. package/dist/src/transfer/storage/gcs.js +272 -0
  647. package/dist/src/transfer/storage/index.d.ts +6 -0
  648. package/dist/src/transfer/storage/index.js +6 -0
  649. package/dist/src/transfer/store/discovery.d.ts +84 -0
  650. package/dist/src/transfer/store/discovery.js +382 -0
  651. package/dist/src/transfer/store/download.d.ts +70 -0
  652. package/dist/src/transfer/store/download.js +334 -0
  653. package/dist/src/transfer/store/index.d.ts +84 -0
  654. package/dist/src/transfer/store/index.js +153 -0
  655. package/dist/src/transfer/store/publish.d.ts +76 -0
  656. package/dist/src/transfer/store/publish.js +294 -0
  657. package/dist/src/transfer/store/registry.d.ts +58 -0
  658. package/dist/src/transfer/store/registry.js +285 -0
  659. package/dist/src/transfer/store/search.d.ts +54 -0
  660. package/dist/src/transfer/store/search.js +232 -0
  661. package/dist/src/transfer/store/tests/standalone-test.d.ts +12 -0
  662. package/dist/src/transfer/store/tests/standalone-test.js +190 -0
  663. package/dist/src/transfer/store/types.d.ts +193 -0
  664. package/dist/src/transfer/store/types.js +6 -0
  665. package/dist/src/transfer/test-seraphine.d.ts +6 -0
  666. package/dist/src/transfer/test-seraphine.js +105 -0
  667. package/dist/src/transfer/tests/test-store.d.ts +7 -0
  668. package/dist/src/transfer/tests/test-store.js +214 -0
  669. package/dist/src/transfer/types.d.ts +245 -0
  670. package/dist/src/transfer/types.js +6 -0
  671. package/dist/src/types.d.ts +13 -0
  672. package/dist/src/types.js +13 -0
  673. package/dist/src/update/checker.d.ts +34 -0
  674. package/dist/src/update/checker.js +191 -0
  675. package/dist/src/update/executor.d.ts +33 -0
  676. package/dist/src/update/executor.js +217 -0
  677. package/dist/src/update/index.d.ts +33 -0
  678. package/dist/src/update/index.js +64 -0
  679. package/dist/src/update/rate-limiter.d.ts +20 -0
  680. package/dist/src/update/rate-limiter.js +96 -0
  681. package/dist/src/update/validator.d.ts +17 -0
  682. package/dist/src/update/validator.js +123 -0
  683. package/package.json +1 -1
@@ -0,0 +1,1596 @@
1
+ /**
2
+ * V3 CLI Memory Command
3
+ * Memory operations for AgentDB integration
4
+ */
5
+ import { output } from '../output.js';
6
+ import { select, confirm, input } from '../prompt.js';
7
+ import { callMCPTool, MCPClientError } from '../mcp-client.js';
8
+ import { distillCommand } from './memory-distill.js';
9
+ import { backupCommand } from './memory-backup.js';
10
+ // Memory backends
11
+ const BACKENDS = [
12
+ { value: 'agentdb', label: 'AgentDB', hint: 'Vector database with HNSW indexing (150x-12,500x faster)' },
13
+ { value: 'sqlite', label: 'SQLite', hint: 'Lightweight local storage' },
14
+ { value: 'hybrid', label: 'Hybrid', hint: 'SQLite + AgentDB (recommended)' },
15
+ { value: 'memory', label: 'In-Memory', hint: 'Fast but non-persistent' }
16
+ ];
17
+ // #2105: shared --path option for memory subcommands.
18
+ // Precedence: --path > CLAUDE_FLOW_DB_PATH env var > default root
19
+ const DB_PATH_OPTION = {
20
+ name: 'path',
21
+ description: 'Override DB file path (also: CLAUDE_FLOW_DB_PATH env var). ' +
22
+ 'Precedence: --path > CLAUDE_FLOW_DB_PATH > CLAUDE_FLOW_MEMORY_PATH/memory.db > cwd/.swarm/memory.db',
23
+ type: 'string',
24
+ };
25
+ // Store command
26
+ const storeCommand = {
27
+ name: 'store',
28
+ description: 'Store data in memory',
29
+ options: [
30
+ {
31
+ name: 'key',
32
+ short: 'k',
33
+ description: 'Storage key/namespace',
34
+ type: 'string',
35
+ required: true
36
+ },
37
+ {
38
+ name: 'value',
39
+ // Note: No short flag - global -v is reserved for verbose
40
+ description: 'Value to store (use --value)',
41
+ type: 'string'
42
+ },
43
+ {
44
+ name: 'namespace',
45
+ short: 'n',
46
+ description: 'Memory namespace',
47
+ type: 'string',
48
+ default: 'default'
49
+ },
50
+ {
51
+ name: 'ttl',
52
+ description: 'Time to live in seconds',
53
+ type: 'number'
54
+ },
55
+ {
56
+ name: 'tags',
57
+ description: 'Comma-separated tags',
58
+ type: 'string'
59
+ },
60
+ {
61
+ name: 'vector',
62
+ description: 'Store as vector embedding',
63
+ type: 'boolean',
64
+ default: false
65
+ },
66
+ {
67
+ name: 'upsert',
68
+ short: 'u',
69
+ // #2594: default true so `store → delete → store` doesn't hit the UNIQUE
70
+ // (namespace, key) constraint on the soft-deleted row. Pass --no-upsert
71
+ // for strict insert semantics.
72
+ description: 'Update if key exists (default; pass --no-upsert for strict insert)',
73
+ type: 'boolean',
74
+ default: true
75
+ },
76
+ DB_PATH_OPTION
77
+ ],
78
+ examples: [
79
+ { command: 'claude-flow memory store -k "api/auth" -v "JWT implementation"', description: 'Store text' },
80
+ { command: 'claude-flow memory store -k "pattern/singleton" --vector', description: 'Store vector' },
81
+ { command: 'claude-flow memory store -k "pattern" -v "new" --no-upsert', description: 'Strict insert (fail if key exists)' }
82
+ ],
83
+ action: async (ctx) => {
84
+ const key = ctx.flags.key;
85
+ let value = ctx.flags.value || ctx.args[0];
86
+ // #2461: without `|| 'default'`, omitting -n stores under the literal
87
+ // string namespace "undefined" — silent data loss for first-time users.
88
+ const namespace = ctx.flags.namespace || 'default';
89
+ const ttl = ctx.flags.ttl;
90
+ const tags = ctx.flags.tags ? ctx.flags.tags.split(',') : [];
91
+ const asVector = ctx.flags.vector;
92
+ const upsert = ctx.flags.upsert;
93
+ if (!key) {
94
+ output.printError('Key is required. Use --key or -k');
95
+ return { success: false, exitCode: 1 };
96
+ }
97
+ if (!value && ctx.interactive) {
98
+ value = await input({
99
+ message: 'Enter value to store:',
100
+ validate: (v) => v.length > 0 || 'Value is required'
101
+ });
102
+ }
103
+ if (!value) {
104
+ output.printError('Value is required. Use --value');
105
+ return { success: false, exitCode: 1 };
106
+ }
107
+ const storeData = {
108
+ key,
109
+ namespace,
110
+ value,
111
+ ttl,
112
+ tags,
113
+ asVector,
114
+ storedAt: new Date().toISOString(),
115
+ size: Buffer.byteLength(value, 'utf8')
116
+ };
117
+ output.printInfo(`Storing in ${namespace}/${key}...`);
118
+ // Use direct sql.js storage with automatic embedding generation
119
+ try {
120
+ const { storeEntry, resolveDbPath: _rdbStore } = await import('../memory/memory-initializer.js');
121
+ const dbPath = _rdbStore(ctx.flags.path);
122
+ if (asVector) {
123
+ output.writeln(output.dim(' Generating embedding vector...'));
124
+ }
125
+ const result = await storeEntry({
126
+ key,
127
+ value,
128
+ namespace,
129
+ generateEmbeddingFlag: true, // Always generate embeddings for semantic search
130
+ tags,
131
+ ttl,
132
+ upsert,
133
+ dbPath
134
+ });
135
+ if (!result.success) {
136
+ output.printError(result.error || 'Failed to store');
137
+ return { success: false, exitCode: 1 };
138
+ }
139
+ output.writeln();
140
+ output.printTable({
141
+ columns: [
142
+ { key: 'property', header: 'Property', width: 15 },
143
+ { key: 'val', header: 'Value', width: 40 }
144
+ ],
145
+ data: [
146
+ { property: 'Key', val: key },
147
+ { property: 'Namespace', val: namespace },
148
+ { property: 'Size', val: `${storeData.size} bytes` },
149
+ { property: 'TTL', val: ttl ? `${ttl}s` : 'None' },
150
+ { property: 'Tags', val: tags.length > 0 ? tags.join(', ') : 'None' },
151
+ { property: 'Vector', val: result.embedding ? `Yes (${result.embedding.dimensions}-dim)` : 'No' },
152
+ { property: 'ID', val: result.id.substring(0, 20) }
153
+ ]
154
+ });
155
+ output.writeln();
156
+ output.printSuccess('Data stored successfully');
157
+ return { success: true, data: { ...storeData, id: result.id, embedding: result.embedding } };
158
+ }
159
+ catch (error) {
160
+ output.printError(`Failed to store: ${error instanceof Error ? error.message : 'Unknown error'}`);
161
+ return { success: false, exitCode: 1 };
162
+ }
163
+ }
164
+ };
165
+ // Retrieve command
166
+ const retrieveCommand = {
167
+ name: 'retrieve',
168
+ aliases: ['get'],
169
+ description: 'Retrieve data from memory',
170
+ options: [
171
+ {
172
+ name: 'key',
173
+ short: 'k',
174
+ description: 'Storage key',
175
+ type: 'string'
176
+ },
177
+ {
178
+ name: 'namespace',
179
+ short: 'n',
180
+ description: 'Memory namespace',
181
+ type: 'string',
182
+ default: 'default'
183
+ },
184
+ // #2073: --format is the GLOBAL option (parser.ts:78) with choices
185
+ // ['text', 'json', 'table'] and default 'text'. The retrieve handler
186
+ // discriminates: 'json' emits parseable JSON, anything else (text/box/...)
187
+ // emits the human-readable box. No per-command override needed; we just
188
+ // document the behavior in the help text via examples.
189
+ {
190
+ // #2073: --value-only emits ONLY the value string (no wrapper).
191
+ // Designed for piping into JSON.parse without any cleanup.
192
+ name: 'value-only',
193
+ description: 'Print only the stored value to stdout (no wrapper)',
194
+ type: 'boolean',
195
+ default: false
196
+ },
197
+ DB_PATH_OPTION
198
+ ],
199
+ action: async (ctx) => {
200
+ const key = ctx.flags.key || ctx.args[0];
201
+ // #2461: mirror the store-side default so `memory retrieve -k k` (no -n)
202
+ // looks under "default" rather than the literal namespace "undefined".
203
+ const namespace = ctx.flags.namespace || 'default';
204
+ if (!key) {
205
+ output.printError('Key is required');
206
+ return { success: false, exitCode: 1 };
207
+ }
208
+ // Use sql.js directly for consistent data access
209
+ try {
210
+ const { getEntry, resolveDbPath: _rdbRetrieve } = await import('../memory/memory-initializer.js');
211
+ const dbPathRetrieve = _rdbRetrieve(ctx.flags.path);
212
+ const result = await getEntry({ key, namespace, dbPath: dbPathRetrieve });
213
+ if (!result.success) {
214
+ output.printError(`Failed to retrieve: ${result.error}`);
215
+ return { success: false, exitCode: 1 };
216
+ }
217
+ if (!result.found || !result.entry) {
218
+ output.printWarning(`Key not found: ${key}`);
219
+ return { success: false, exitCode: 1, data: { key, found: false } };
220
+ }
221
+ const entry = result.entry;
222
+ // #2073: --value-only emits just the raw value (no decoration) for
223
+ // piping into JSON.parse / jq / other downstream parsers without
224
+ // any cleanup.
225
+ if (ctx.flags['value-only'] || ctx.flags.valueOnly) {
226
+ // Use process.stdout.write directly to bypass any printer-side
227
+ // transformation of quotes/structural characters.
228
+ process.stdout.write(entry.content);
229
+ if (process.stdout.isTTY)
230
+ process.stdout.write('\n');
231
+ return { success: true, data: entry };
232
+ }
233
+ if (ctx.flags.format === 'json') {
234
+ output.printJson(entry);
235
+ return { success: true, data: entry };
236
+ }
237
+ output.writeln();
238
+ output.printBox([
239
+ `Namespace: ${entry.namespace}`,
240
+ `Key: ${entry.key}`,
241
+ `Size: ${entry.content.length} bytes`,
242
+ `Access Count: ${entry.accessCount}`,
243
+ `Tags: ${entry.tags.length > 0 ? entry.tags.join(', ') : 'None'}`,
244
+ `Vector: ${entry.hasEmbedding ? 'Yes' : 'No'}`,
245
+ '',
246
+ output.bold('Value:'),
247
+ entry.content
248
+ ].join('\n'), 'Memory Entry');
249
+ return { success: true, data: entry };
250
+ }
251
+ catch (error) {
252
+ output.printError(`Failed to retrieve: ${error instanceof Error ? error.message : 'Unknown error'}`);
253
+ return { success: false, exitCode: 1 };
254
+ }
255
+ }
256
+ };
257
+ // Search command
258
+ const searchCommand = {
259
+ name: 'search',
260
+ description: 'Search memory with semantic/vector search',
261
+ options: [
262
+ {
263
+ name: 'query',
264
+ short: 'q',
265
+ description: 'Search query',
266
+ type: 'string',
267
+ required: true
268
+ },
269
+ {
270
+ name: 'namespace',
271
+ short: 'n',
272
+ description: 'Memory namespace',
273
+ type: 'string'
274
+ },
275
+ {
276
+ name: 'limit',
277
+ short: 'l',
278
+ description: 'Maximum results',
279
+ type: 'number',
280
+ default: 10
281
+ },
282
+ {
283
+ name: 'threshold',
284
+ description: 'Similarity threshold (0-1)',
285
+ type: 'number',
286
+ default: 0.7
287
+ },
288
+ {
289
+ name: 'type',
290
+ short: 't',
291
+ description: 'Search type (semantic, keyword, hybrid)',
292
+ type: 'string',
293
+ default: 'semantic',
294
+ choices: ['semantic', 'keyword', 'hybrid']
295
+ },
296
+ {
297
+ name: 'build-hnsw',
298
+ description: 'Build/rebuild HNSW index before searching (enables 150x-12,500x speedup)',
299
+ type: 'boolean',
300
+ default: false
301
+ },
302
+ {
303
+ name: 'smart',
304
+ short: 's',
305
+ description: 'Use SmartRetrieval pipeline (query expansion, RRF, MMR, recency)',
306
+ type: 'boolean',
307
+ default: false
308
+ },
309
+ DB_PATH_OPTION
310
+ ],
311
+ examples: [
312
+ { command: 'claude-flow memory search -q "authentication patterns"', description: 'Semantic search' },
313
+ { command: 'claude-flow memory search -q "JWT" -t keyword', description: 'Keyword search' },
314
+ { command: 'claude-flow memory search -q "test" --build-hnsw', description: 'Build HNSW index and search' },
315
+ { command: 'claude-flow memory search -q "auth patterns" --smart', description: 'SmartRetrieval with RRF + MMR' }
316
+ ],
317
+ action: async (ctx) => {
318
+ const query = ctx.flags.query || ctx.args[0];
319
+ const namespace = ctx.flags.namespace || 'all';
320
+ const limit = ctx.flags.limit || 10;
321
+ const threshold = ctx.flags.threshold || 0.3;
322
+ const searchType = ctx.flags.type || 'semantic';
323
+ const buildHnsw = (ctx.flags['build-hnsw'] || ctx.flags.buildHnsw);
324
+ if (!query) {
325
+ output.printError('Query is required. Use --query or -q');
326
+ return { success: false, exitCode: 1 };
327
+ }
328
+ // Build/rebuild HNSW index if requested
329
+ if (buildHnsw) {
330
+ output.printInfo('Building HNSW index...');
331
+ try {
332
+ const { getHNSWIndex, getHNSWStatus } = await import('../memory/memory-initializer.js');
333
+ const startTime = Date.now();
334
+ const index = await getHNSWIndex({ forceRebuild: true });
335
+ const buildTime = Date.now() - startTime;
336
+ if (index) {
337
+ const status = getHNSWStatus();
338
+ output.printSuccess(`HNSW index built (${status.entryCount} vectors, ${buildTime}ms)`);
339
+ output.writeln(output.dim(` Dimensions: ${status.dimensions}, Metric: cosine`));
340
+ output.writeln(output.dim(` Search speedup: ${status.entryCount > 10000 ? '12,500x' : status.entryCount > 1000 ? '150x' : '10x'}`));
341
+ }
342
+ else {
343
+ output.printWarning('HNSW index not available (install @ruvector/core for acceleration)');
344
+ }
345
+ output.writeln();
346
+ }
347
+ catch (error) {
348
+ output.printWarning(`HNSW build failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
349
+ output.writeln(output.dim(' Falling back to brute-force search'));
350
+ output.writeln();
351
+ }
352
+ }
353
+ output.printInfo(`Searching: "${query}" (${searchType})`);
354
+ output.writeln();
355
+ // Use direct sql.js search with vector similarity
356
+ try {
357
+ const { searchEntries, resolveDbPath: _rdbSearch } = await import('../memory/memory-initializer.js');
358
+ const dbPathSearch = _rdbSearch(ctx.flags.path);
359
+ const useSmart = (ctx.flags.smart || ctx.flags.s);
360
+ let results;
361
+ let searchTimeMs;
362
+ let smartStats;
363
+ let backendLabel = 'HNSW + sql.js';
364
+ // #1846: feature-detect smartSearch — older published builds of
365
+ // @claude-flow/memory don't expose it. Fall through to plain
366
+ // semantic search with a one-line warning instead of throwing.
367
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
368
+ let smartSearchFn;
369
+ if (useSmart) {
370
+ try {
371
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
372
+ const memMod = await import('@claude-flow/memory');
373
+ if (typeof memMod.smartSearch === 'function') {
374
+ smartSearchFn = memMod.smartSearch;
375
+ }
376
+ }
377
+ catch {
378
+ /* memory package not loadable */
379
+ }
380
+ if (!smartSearchFn) {
381
+ output.printWarning('Smart search requested but smartSearch is not available on the installed @claude-flow/memory build (#1846). Falling back to standard semantic search.');
382
+ }
383
+ }
384
+ if (useSmart && smartSearchFn) {
385
+ // Adapt searchEntries to the SearchFn interface
386
+ const rawSearch = async (req) => {
387
+ const r = await searchEntries({
388
+ query: req.query,
389
+ namespace: req.namespace || namespace,
390
+ limit: req.limit || limit * 3,
391
+ threshold: req.threshold ?? threshold,
392
+ dbPath: dbPathSearch,
393
+ });
394
+ return {
395
+ results: r.results.map(e => ({
396
+ id: e.id,
397
+ key: e.key,
398
+ content: e.content,
399
+ score: e.score,
400
+ namespace: e.namespace,
401
+ })),
402
+ };
403
+ };
404
+ const smartResult = await smartSearchFn(rawSearch, {
405
+ query,
406
+ namespace,
407
+ limit,
408
+ threshold,
409
+ });
410
+ results = smartResult.results.map((r) => ({
411
+ key: r.key,
412
+ score: r.score,
413
+ namespace: r.namespace,
414
+ preview: r.content,
415
+ }));
416
+ searchTimeMs = smartResult.stats.durationMs;
417
+ smartStats = smartResult.stats;
418
+ backendLabel = 'SmartRetrieval (RRF + MMR + Recency)';
419
+ }
420
+ else {
421
+ const searchResult = await searchEntries({
422
+ query,
423
+ namespace,
424
+ limit,
425
+ threshold,
426
+ dbPath: dbPathSearch
427
+ });
428
+ if (!searchResult.success) {
429
+ output.printError(searchResult.error || 'Search failed');
430
+ return { success: false, exitCode: 1 };
431
+ }
432
+ results = searchResult.results.map(r => ({
433
+ key: r.key,
434
+ score: r.score,
435
+ namespace: r.namespace,
436
+ preview: r.content
437
+ }));
438
+ searchTimeMs = searchResult.searchTime;
439
+ }
440
+ if (ctx.flags.format === 'json') {
441
+ output.printJson({ query, searchType, results, searchTime: `${searchTimeMs}ms`, ...(smartStats ? { stats: smartStats } : {}) });
442
+ return { success: true, data: results };
443
+ }
444
+ // Performance stats
445
+ output.writeln(output.dim(` Search time: ${searchTimeMs}ms`));
446
+ if (useSmart && smartStats) {
447
+ output.writeln(output.dim(` Backend: ${backendLabel}`));
448
+ output.writeln(output.dim(` Variants: ${smartStats.variantCount}, Raw candidates: ${smartStats.rawCandidateCount}`));
449
+ }
450
+ output.writeln();
451
+ if (results.length === 0) {
452
+ output.printWarning('No results found');
453
+ output.writeln(output.dim('Try: claude-flow memory store -k "key" --value "data"'));
454
+ return { success: true, data: [] };
455
+ }
456
+ output.printTable({
457
+ columns: [
458
+ { key: 'key', header: 'Key', width: 20 },
459
+ { key: 'score', header: 'Score', width: 8, align: 'right', format: (v) => Number(v).toFixed(2) },
460
+ { key: 'namespace', header: 'Namespace', width: 12 },
461
+ { key: 'preview', header: 'Preview', width: 35 }
462
+ ],
463
+ data: results
464
+ });
465
+ output.writeln();
466
+ output.printInfo(`Found ${results.length} results`);
467
+ return { success: true, data: results };
468
+ }
469
+ catch (error) {
470
+ output.printError(`Search failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
471
+ return { success: false, exitCode: 1 };
472
+ }
473
+ }
474
+ };
475
+ // List command
476
+ const listCommand = {
477
+ name: 'list',
478
+ aliases: ['ls'],
479
+ description: 'List memory entries',
480
+ options: [
481
+ {
482
+ name: 'namespace',
483
+ short: 'n',
484
+ description: 'Filter by namespace',
485
+ type: 'string'
486
+ },
487
+ {
488
+ name: 'tags',
489
+ short: 't',
490
+ description: 'Filter by tags (comma-separated)',
491
+ type: 'string'
492
+ },
493
+ {
494
+ name: 'limit',
495
+ short: 'l',
496
+ description: 'Maximum entries',
497
+ type: 'number',
498
+ default: 20
499
+ },
500
+ DB_PATH_OPTION
501
+ ],
502
+ action: async (ctx) => {
503
+ const namespace = ctx.flags.namespace;
504
+ const limit = ctx.flags.limit;
505
+ // Use sql.js directly for consistent data access
506
+ try {
507
+ const { listEntries, resolveDbPath: _rdbList } = await import('../memory/memory-initializer.js');
508
+ const dbPathList = _rdbList(ctx.flags.path);
509
+ const listResult = await listEntries({ namespace, limit, offset: 0, dbPath: dbPathList });
510
+ if (!listResult.success) {
511
+ output.printError(`Failed to list: ${listResult.error}`);
512
+ return { success: false, exitCode: 1 };
513
+ }
514
+ // Format entries for display
515
+ const entries = listResult.entries.map(e => ({
516
+ key: e.key,
517
+ namespace: e.namespace,
518
+ size: e.size + ' B',
519
+ vector: e.hasEmbedding ? '✓' : '-',
520
+ accessCount: e.accessCount,
521
+ updated: formatRelativeTime(e.updatedAt)
522
+ }));
523
+ if (ctx.flags.format === 'json') {
524
+ output.printJson(listResult.entries);
525
+ return { success: true, data: listResult.entries };
526
+ }
527
+ output.writeln();
528
+ output.writeln(output.bold('Memory Entries'));
529
+ output.writeln();
530
+ if (entries.length === 0) {
531
+ output.printWarning('No entries found');
532
+ output.printInfo('Store data: claude-flow memory store -k "key" --value "data"');
533
+ return { success: true, data: [] };
534
+ }
535
+ output.printTable({
536
+ columns: [
537
+ { key: 'key', header: 'Key', width: 25 },
538
+ { key: 'namespace', header: 'Namespace', width: 12 },
539
+ { key: 'size', header: 'Size', width: 10, align: 'right' },
540
+ { key: 'vector', header: 'Vector', width: 8, align: 'center' },
541
+ { key: 'accessCount', header: 'Accessed', width: 10, align: 'right' },
542
+ { key: 'updated', header: 'Updated', width: 12 }
543
+ ],
544
+ data: entries
545
+ });
546
+ output.writeln();
547
+ output.printInfo(`Showing ${entries.length} of ${listResult.total} entries`);
548
+ return { success: true, data: listResult.entries };
549
+ }
550
+ catch (error) {
551
+ output.printError(`Failed to list: ${error instanceof Error ? error.message : 'Unknown error'}`);
552
+ return { success: false, exitCode: 1 };
553
+ }
554
+ }
555
+ };
556
+ // Helper function to format relative time
557
+ function formatRelativeTime(isoDate) {
558
+ const now = Date.now();
559
+ const date = new Date(isoDate).getTime();
560
+ const diff = now - date;
561
+ const seconds = Math.floor(diff / 1000);
562
+ const minutes = Math.floor(seconds / 60);
563
+ const hours = Math.floor(minutes / 60);
564
+ const days = Math.floor(hours / 24);
565
+ if (days > 0)
566
+ return `${days}d ago`;
567
+ if (hours > 0)
568
+ return `${hours}h ago`;
569
+ if (minutes > 0)
570
+ return `${minutes}m ago`;
571
+ return 'just now';
572
+ }
573
+ // Delete command
574
+ const deleteCommand = {
575
+ name: 'delete',
576
+ aliases: ['rm'],
577
+ description: 'Delete memory entry',
578
+ options: [
579
+ {
580
+ name: 'key',
581
+ short: 'k',
582
+ description: 'Storage key',
583
+ type: 'string'
584
+ },
585
+ {
586
+ name: 'namespace',
587
+ short: 'n',
588
+ description: 'Memory namespace',
589
+ type: 'string',
590
+ default: 'default'
591
+ },
592
+ {
593
+ name: 'force',
594
+ short: 'f',
595
+ description: 'Skip confirmation',
596
+ type: 'boolean',
597
+ default: false
598
+ },
599
+ DB_PATH_OPTION
600
+ ],
601
+ examples: [
602
+ { command: 'claude-flow memory delete -k "mykey"', description: 'Delete entry with default namespace' },
603
+ { command: 'claude-flow memory delete -k "lesson" -n "lessons"', description: 'Delete entry from specific namespace' },
604
+ { command: 'claude-flow memory delete mykey -f', description: 'Delete without confirmation' }
605
+ ],
606
+ action: async (ctx) => {
607
+ // Support both --key flag and positional argument
608
+ const key = ctx.flags.key || ctx.args[0];
609
+ const namespace = ctx.flags.namespace || 'default';
610
+ const force = ctx.flags.force;
611
+ if (!key) {
612
+ output.printError('Key is required. Use: memory delete -k "key" [-n "namespace"]');
613
+ return { success: false, exitCode: 1 };
614
+ }
615
+ if (!force && ctx.interactive) {
616
+ const confirmed = await confirm({
617
+ message: `Delete memory entry "${key}" from namespace "${namespace}"?`,
618
+ default: false
619
+ });
620
+ if (!confirmed) {
621
+ output.printInfo('Operation cancelled');
622
+ return { success: true };
623
+ }
624
+ }
625
+ // Use sql.js directly for consistent data access (Issue #980)
626
+ try {
627
+ const { deleteEntry, resolveDbPath: _rdbDelete } = await import('../memory/memory-initializer.js');
628
+ const dbPathDelete = _rdbDelete(ctx.flags.path);
629
+ const result = await deleteEntry({ key, namespace, dbPath: dbPathDelete });
630
+ if (!result.success) {
631
+ output.printError(result.error || 'Failed to delete');
632
+ return { success: false, exitCode: 1 };
633
+ }
634
+ if (result.deleted) {
635
+ output.printSuccess(`Deleted "${key}" from namespace "${namespace}"`);
636
+ output.printInfo(`Remaining entries: ${result.remainingEntries}`);
637
+ }
638
+ else {
639
+ output.printWarning(`Key not found: "${key}" in namespace "${namespace}"`);
640
+ }
641
+ return { success: result.deleted, data: result };
642
+ }
643
+ catch (error) {
644
+ output.printError(`Failed to delete: ${error instanceof Error ? error.message : 'Unknown error'}`);
645
+ return { success: false, exitCode: 1 };
646
+ }
647
+ }
648
+ };
649
+ // #2666 — Hard, namespace-scoped purge. `delete` above only ever
650
+ // soft-deletes a single key (status='deleted', row stays and still occupies
651
+ // the UNIQUE(namespace, key) slot — #2652). Reconciling an entire namespace
652
+ // after its source-of-truth changed (e.g. a plugin's index after a source
653
+ // file was removed) needs the row to actually be gone, not tombstoned.
654
+ // Irreversible — always requires --namespace explicitly (no default) and
655
+ // either interactive confirmation or --force.
656
+ const purgeCommand = {
657
+ name: 'purge',
658
+ description: 'Permanently delete every entry in a namespace (hard delete — not the soft delete/tombstone that `memory delete` uses)',
659
+ options: [
660
+ {
661
+ name: 'namespace',
662
+ short: 'n',
663
+ description: 'Namespace to purge (required — no default, to avoid an accidental whole-namespace wipe)',
664
+ type: 'string'
665
+ },
666
+ {
667
+ name: 'dry-run',
668
+ short: 'd',
669
+ description: 'Report how many entries would be deleted, without deleting them',
670
+ type: 'boolean',
671
+ default: false
672
+ },
673
+ {
674
+ name: 'force',
675
+ short: 'f',
676
+ description: 'Skip confirmation',
677
+ type: 'boolean',
678
+ default: false
679
+ },
680
+ DB_PATH_OPTION
681
+ ],
682
+ examples: [
683
+ { command: 'claude-flow memory purge --namespace stale-cache --dry-run', description: 'Preview a purge' },
684
+ { command: 'claude-flow memory purge --namespace stale-cache --force', description: 'Purge without confirmation (e.g. in a script)' }
685
+ ],
686
+ action: async (ctx) => {
687
+ const namespace = ctx.flags.namespace;
688
+ const dryRun = ctx.flags.dryRun;
689
+ const force = ctx.flags.force;
690
+ const dbPath = ctx.flags.path;
691
+ if (!namespace) {
692
+ output.printError('Namespace is required. Use: memory purge -n "namespace" [--dry-run | --force]');
693
+ return { success: false, exitCode: 1 };
694
+ }
695
+ try {
696
+ const { listEntries, purgeNamespace, resolveDbPath: _rdbPurge } = await import('../memory/memory-initializer.js');
697
+ const resolvedDbPath = _rdbPurge(dbPath);
698
+ const preview = await listEntries({ namespace, limit: 1, dbPath: resolvedDbPath });
699
+ const previewCount = preview.total ?? preview.entries?.length ?? 0;
700
+ if (dryRun) {
701
+ output.printInfo(`Would permanently delete ${previewCount} entr${previewCount === 1 ? 'y' : 'ies'} from namespace "${namespace}" (dry run — nothing deleted)`);
702
+ return { success: true, data: { namespace, wouldDelete: previewCount } };
703
+ }
704
+ if (!force && ctx.interactive) {
705
+ const confirmed = await confirm({
706
+ message: `Permanently delete ${previewCount} entr${previewCount === 1 ? 'y' : 'ies'} from namespace "${namespace}"? This is a hard delete — not reversible with \`memory delete\`'s soft-undo.`,
707
+ default: false
708
+ });
709
+ if (!confirmed) {
710
+ output.printInfo('Operation cancelled');
711
+ return { success: true };
712
+ }
713
+ }
714
+ else if (!force) {
715
+ output.printError(`Refusing to purge namespace "${namespace}" without --force in non-interactive mode`);
716
+ return { success: false, exitCode: 1 };
717
+ }
718
+ const result = await purgeNamespace({ namespace, dbPath: resolvedDbPath });
719
+ if (!result.success) {
720
+ output.printError(result.error || 'Failed to purge');
721
+ return { success: false, exitCode: 1 };
722
+ }
723
+ output.printSuccess(`Purged ${result.deletedCount} entr${result.deletedCount === 1 ? 'y' : 'ies'} from namespace "${namespace}"`);
724
+ output.printInfo(`Remaining entries (all namespaces): ${result.remainingEntries}`);
725
+ return { success: true, data: result };
726
+ }
727
+ catch (error) {
728
+ output.printError(`Failed to purge: ${error instanceof Error ? error.message : 'Unknown error'}`);
729
+ return { success: false, exitCode: 1 };
730
+ }
731
+ }
732
+ };
733
+ // Stats command
734
+ const statsCommand = {
735
+ name: 'stats',
736
+ description: 'Show memory statistics',
737
+ options: [DB_PATH_OPTION],
738
+ action: async (ctx) => {
739
+ // Call MCP memory/stats tool for real statistics
740
+ try {
741
+ const statsResult = await callMCPTool('memory_stats', {});
742
+ const stats = {
743
+ backend: statsResult.backend,
744
+ entries: {
745
+ total: statsResult.totalEntries,
746
+ vectors: 0, // Would need vector backend support
747
+ text: statsResult.totalEntries
748
+ },
749
+ storage: {
750
+ total: statsResult.totalSize,
751
+ location: statsResult.location
752
+ },
753
+ version: statsResult.version,
754
+ oldestEntry: statsResult.oldestEntry,
755
+ newestEntry: statsResult.newestEntry
756
+ };
757
+ if (ctx.flags.format === 'json') {
758
+ output.printJson(stats);
759
+ return { success: true, data: stats };
760
+ }
761
+ output.writeln();
762
+ output.writeln(output.bold('Memory Statistics'));
763
+ output.writeln();
764
+ output.writeln(output.bold('Overview'));
765
+ output.printTable({
766
+ columns: [
767
+ { key: 'metric', header: 'Metric', width: 20 },
768
+ { key: 'value', header: 'Value', width: 30, align: 'right' }
769
+ ],
770
+ data: [
771
+ { metric: 'Backend', value: stats.backend },
772
+ { metric: 'Version', value: stats.version },
773
+ { metric: 'Total Entries', value: stats.entries.total.toLocaleString() },
774
+ { metric: 'Total Storage', value: stats.storage.total },
775
+ { metric: 'Location', value: stats.storage.location }
776
+ ]
777
+ });
778
+ output.writeln();
779
+ output.writeln(output.bold('Timeline'));
780
+ output.printTable({
781
+ columns: [
782
+ { key: 'metric', header: 'Metric', width: 20 },
783
+ { key: 'value', header: 'Value', width: 30, align: 'right' }
784
+ ],
785
+ data: [
786
+ { metric: 'Oldest Entry', value: stats.oldestEntry || 'N/A' },
787
+ { metric: 'Newest Entry', value: stats.newestEntry || 'N/A' }
788
+ ]
789
+ });
790
+ // #1622 — Surface the active embedding provider in `memory stats` so
791
+ // users can tell which backend resolved at runtime (the 6-level
792
+ // fallback chain in loadEmbeddingModel ranges from full ONNX to a
793
+ // 128-dim hash that has no semantic understanding). Calling
794
+ // loadEmbeddingModel() is cheap when the model is already cached;
795
+ // a fresh call still resolves quickly because we only need the
796
+ // metadata, not a real embedding.
797
+ try {
798
+ const { loadEmbeddingModel, getHNSWStatus } = await import('../memory/memory-initializer.js');
799
+ const embedding = await loadEmbeddingModel({ verbose: false });
800
+ const hnsw = getHNSWStatus();
801
+ // Map model name → semantic capability so users can spot the
802
+ // hash-fallback case without reading docs.
803
+ const semanticProviders = new Set([
804
+ 'Xenova/all-MiniLM-L6-v2',
805
+ 'Xenova/all-mpnet-base-v2',
806
+ 'Xenova/bge-small-en-v1.5',
807
+ 'agentic-flow',
808
+ 'agentic-flow/reasoningbank',
809
+ 'ruvector/onnx',
810
+ 'cached',
811
+ ]);
812
+ const isSemantic = embedding.success && semanticProviders.has(embedding.modelName);
813
+ output.writeln();
814
+ output.writeln(output.bold('Embedding'));
815
+ output.printTable({
816
+ columns: [
817
+ { key: 'metric', header: 'Metric', width: 20 },
818
+ { key: 'value', header: 'Value', width: 30, align: 'right' }
819
+ ],
820
+ data: [
821
+ {
822
+ metric: 'Provider',
823
+ value: embedding.success
824
+ ? embedding.modelName
825
+ : output.warning(`unavailable: ${embedding.error || 'unknown'}`),
826
+ },
827
+ { metric: 'Dimensions', value: String(embedding.dimensions) },
828
+ {
829
+ metric: 'Semantic Search',
830
+ value: isSemantic
831
+ ? output.success('yes')
832
+ : output.warning('no — using hash fallback'),
833
+ },
834
+ {
835
+ metric: 'HNSW Index',
836
+ // ruflo#1989 / #1987: `hnsw.entryCount` is in-process JS state
837
+ // (the live HNSW index of the current Node process). A fresh
838
+ // `memory stats` invocation has never indexed anything, so it
839
+ // reports 0 even when the persistent DB has thousands of
840
+ // entries with embeddings. Use the persistent count from the
841
+ // MCP tool (`entriesWithEmbeddings`, which is the actual
842
+ // count of rows that have a vector) as the source of truth.
843
+ value: (() => {
844
+ const persisted = typeof statsResult.entriesWithEmbeddings === 'number'
845
+ ? statsResult.entriesWithEmbeddings
846
+ : null;
847
+ const live = hnsw.entryCount || 0;
848
+ const total = persisted !== null ? Math.max(persisted, live) : live;
849
+ if (!hnsw.available)
850
+ return output.dim('not active');
851
+ if (total === 0)
852
+ return output.warning('available but not initialized');
853
+ return output.success(`active (${total.toLocaleString()} entries)`);
854
+ })(),
855
+ },
856
+ ]
857
+ });
858
+ }
859
+ catch (e) {
860
+ // Don't fail the whole stats command if introspection breaks —
861
+ // the rest of the dashboard is still useful.
862
+ output.writeln();
863
+ output.writeln(output.bold('Embedding'));
864
+ output.printInfo(`Provider info unavailable: ${e instanceof Error ? e.message : String(e)}`);
865
+ }
866
+ output.writeln();
867
+ output.printInfo('V3 Performance: 150x-12,500x faster search with HNSW indexing');
868
+ return { success: true, data: stats };
869
+ }
870
+ catch (error) {
871
+ output.printError(`Failed to get stats: ${error instanceof Error ? error.message : 'Unknown error'}`);
872
+ return { success: false, exitCode: 1 };
873
+ }
874
+ }
875
+ };
876
+ // Configure command
877
+ const configureCommand = {
878
+ name: 'configure',
879
+ aliases: ['config'],
880
+ description: 'Configure memory backend',
881
+ options: [
882
+ {
883
+ name: 'backend',
884
+ short: 'b',
885
+ description: 'Memory backend',
886
+ type: 'string',
887
+ choices: BACKENDS.map(b => b.value)
888
+ },
889
+ {
890
+ name: 'path',
891
+ description: 'Storage path',
892
+ type: 'string'
893
+ },
894
+ {
895
+ name: 'cache-size',
896
+ description: 'Cache size in MB',
897
+ type: 'number'
898
+ },
899
+ {
900
+ name: 'hnsw-m',
901
+ description: 'HNSW M parameter',
902
+ type: 'number',
903
+ default: 16
904
+ },
905
+ {
906
+ name: 'hnsw-ef',
907
+ description: 'HNSW ef parameter',
908
+ type: 'number',
909
+ default: 200
910
+ }
911
+ ],
912
+ action: async (ctx) => {
913
+ let backend = ctx.flags.backend;
914
+ if (!backend && ctx.interactive) {
915
+ backend = await select({
916
+ message: 'Select memory backend:',
917
+ options: BACKENDS,
918
+ default: 'hybrid'
919
+ });
920
+ }
921
+ const config = {
922
+ backend: backend || 'hybrid',
923
+ path: ctx.flags.path || './data/memory',
924
+ cacheSize: ctx.flags.cacheSize || 256,
925
+ hnsw: {
926
+ m: ctx.flags.hnswM || 16,
927
+ ef: ctx.flags.hnswEf || 200
928
+ }
929
+ };
930
+ output.writeln();
931
+ output.printInfo('Memory Configuration');
932
+ output.writeln();
933
+ output.printTable({
934
+ columns: [
935
+ { key: 'setting', header: 'Setting', width: 20 },
936
+ { key: 'value', header: 'Value', width: 25 }
937
+ ],
938
+ data: [
939
+ { setting: 'Backend', value: config.backend },
940
+ { setting: 'Storage Path', value: config.path },
941
+ { setting: 'Cache Size', value: `${config.cacheSize} MB` },
942
+ { setting: 'HNSW M', value: config.hnsw.m },
943
+ { setting: 'HNSW ef', value: config.hnsw.ef }
944
+ ]
945
+ });
946
+ output.writeln();
947
+ output.printSuccess('Memory configuration updated');
948
+ return { success: true, data: config };
949
+ }
950
+ };
951
+ // Cleanup command
952
+ const cleanupCommand = {
953
+ name: 'cleanup',
954
+ description: 'Clean up stale and expired memory entries',
955
+ options: [
956
+ {
957
+ name: 'dry-run',
958
+ short: 'd',
959
+ description: 'Show what would be deleted',
960
+ type: 'boolean',
961
+ default: false
962
+ },
963
+ {
964
+ name: 'older-than',
965
+ short: 'o',
966
+ description: 'Delete entries older than (e.g., "7d", "30d")',
967
+ type: 'string'
968
+ },
969
+ {
970
+ name: 'expired-only',
971
+ short: 'e',
972
+ description: 'Only delete expired TTL entries',
973
+ type: 'boolean',
974
+ default: false
975
+ },
976
+ {
977
+ name: 'low-quality',
978
+ short: 'l',
979
+ description: 'Delete low quality patterns (threshold)',
980
+ type: 'number'
981
+ },
982
+ {
983
+ name: 'namespace',
984
+ short: 'n',
985
+ description: 'Clean specific namespace only',
986
+ type: 'string'
987
+ },
988
+ {
989
+ name: 'force',
990
+ short: 'f',
991
+ description: 'Skip confirmation',
992
+ type: 'boolean',
993
+ default: false
994
+ }
995
+ ],
996
+ examples: [
997
+ { command: 'claude-flow memory cleanup --dry-run', description: 'Preview cleanup' },
998
+ { command: 'claude-flow memory cleanup --older-than 30d', description: 'Delete entries older than 30 days' },
999
+ { command: 'claude-flow memory cleanup --expired-only', description: 'Clean expired entries' }
1000
+ ],
1001
+ action: async (ctx) => {
1002
+ const dryRun = ctx.flags.dryRun;
1003
+ const force = ctx.flags.force;
1004
+ if (dryRun) {
1005
+ output.writeln(output.warning('DRY RUN - No changes will be made'));
1006
+ }
1007
+ output.printInfo('Analyzing memory for cleanup...');
1008
+ try {
1009
+ const result = await callMCPTool('memory_cleanup', {
1010
+ dryRun,
1011
+ olderThan: ctx.flags.olderThan,
1012
+ expiredOnly: ctx.flags.expiredOnly,
1013
+ lowQualityThreshold: ctx.flags.lowQuality,
1014
+ namespace: ctx.flags.namespace,
1015
+ });
1016
+ if (ctx.flags.format === 'json') {
1017
+ output.printJson(result);
1018
+ return { success: true, data: result };
1019
+ }
1020
+ output.writeln();
1021
+ output.writeln(output.bold('Cleanup Analysis'));
1022
+ output.printTable({
1023
+ columns: [
1024
+ { key: 'category', header: 'Category', width: 20 },
1025
+ { key: 'count', header: 'Count', width: 15, align: 'right' }
1026
+ ],
1027
+ data: [
1028
+ { category: 'Expired (TTL)', count: result.candidates.expired },
1029
+ { category: 'Stale (unused)', count: result.candidates.stale },
1030
+ { category: 'Low Quality', count: result.candidates.lowQuality },
1031
+ { category: output.bold('Total'), count: output.bold(String(result.candidates.total)) }
1032
+ ]
1033
+ });
1034
+ if (!dryRun && result.candidates.total > 0 && !force) {
1035
+ const confirmed = await confirm({
1036
+ message: `Delete ${result.candidates.total} entries (${result.freed.formatted})?`,
1037
+ default: false
1038
+ });
1039
+ if (!confirmed) {
1040
+ output.printInfo('Cleanup cancelled');
1041
+ return { success: true, data: result };
1042
+ }
1043
+ }
1044
+ if (!dryRun) {
1045
+ output.writeln();
1046
+ output.printSuccess(`Cleaned ${result.deleted.entries} entries`);
1047
+ output.printList([
1048
+ `Vectors removed: ${result.deleted.vectors}`,
1049
+ `Patterns removed: ${result.deleted.patterns}`,
1050
+ `Space freed: ${result.freed.formatted}`,
1051
+ `Duration: ${result.duration}ms`
1052
+ ]);
1053
+ }
1054
+ return { success: true, data: result };
1055
+ }
1056
+ catch (error) {
1057
+ if (error instanceof MCPClientError) {
1058
+ output.printError(`Cleanup error: ${error.message}`);
1059
+ }
1060
+ else {
1061
+ output.printError(`Unexpected error: ${String(error)}`);
1062
+ }
1063
+ return { success: false, exitCode: 1 };
1064
+ }
1065
+ }
1066
+ };
1067
+ // Compress command
1068
+ const compressCommand = {
1069
+ name: 'compress',
1070
+ description: 'Compress and optimize memory storage',
1071
+ options: [
1072
+ {
1073
+ name: 'level',
1074
+ short: 'l',
1075
+ description: 'Compression level (fast, balanced, max)',
1076
+ type: 'string',
1077
+ choices: ['fast', 'balanced', 'max'],
1078
+ default: 'balanced'
1079
+ },
1080
+ {
1081
+ name: 'target',
1082
+ short: 't',
1083
+ description: 'Target (vectors, text, patterns, all)',
1084
+ type: 'string',
1085
+ choices: ['vectors', 'text', 'patterns', 'all'],
1086
+ default: 'all'
1087
+ },
1088
+ {
1089
+ name: 'quantize',
1090
+ short: 'z',
1091
+ description: 'Enable vector quantization (reduces memory 4-32x)',
1092
+ type: 'boolean',
1093
+ default: false
1094
+ },
1095
+ {
1096
+ name: 'bits',
1097
+ description: 'Quantization bits (4, 8, 16)',
1098
+ type: 'number',
1099
+ default: 8
1100
+ },
1101
+ {
1102
+ name: 'rebuild-index',
1103
+ short: 'r',
1104
+ description: 'Rebuild HNSW index after compression',
1105
+ type: 'boolean',
1106
+ default: true
1107
+ }
1108
+ ],
1109
+ examples: [
1110
+ { command: 'claude-flow memory compress', description: 'Balanced compression' },
1111
+ { command: 'claude-flow memory compress --quantize --bits 4', description: '4-bit quantization (32x reduction)' },
1112
+ { command: 'claude-flow memory compress -l max -t vectors', description: 'Max compression on vectors' }
1113
+ ],
1114
+ action: async (ctx) => {
1115
+ const level = ctx.flags.level || 'balanced';
1116
+ const target = ctx.flags.target || 'all';
1117
+ const quantize = ctx.flags.quantize;
1118
+ const bits = ctx.flags.bits || 8;
1119
+ const rebuildIndex = ctx.flags.rebuildIndex ?? true;
1120
+ output.writeln();
1121
+ output.writeln(output.bold('Memory Compression'));
1122
+ output.writeln(output.dim(`Level: ${level}, Target: ${target}, Quantize: ${quantize ? `${bits}-bit` : 'no'}`));
1123
+ output.writeln();
1124
+ const spinner = output.createSpinner({ text: 'Analyzing current storage...', spinner: 'dots' });
1125
+ spinner.start();
1126
+ try {
1127
+ const result = await callMCPTool('memory_compress', {
1128
+ level,
1129
+ target,
1130
+ quantize,
1131
+ bits,
1132
+ rebuildIndex,
1133
+ });
1134
+ spinner.succeed('Compression complete');
1135
+ if (ctx.flags.format === 'json') {
1136
+ output.printJson(result);
1137
+ return { success: true, data: result };
1138
+ }
1139
+ output.writeln();
1140
+ output.writeln(output.bold('Storage Comparison'));
1141
+ output.printTable({
1142
+ columns: [
1143
+ { key: 'category', header: 'Category', width: 15 },
1144
+ { key: 'before', header: 'Before', width: 12, align: 'right' },
1145
+ { key: 'after', header: 'After', width: 12, align: 'right' },
1146
+ { key: 'saved', header: 'Saved', width: 12, align: 'right' }
1147
+ ],
1148
+ data: [
1149
+ { category: 'Vectors', before: result.before.vectorsSize, after: result.after.vectorsSize, saved: '-' },
1150
+ { category: 'Text', before: result.before.textSize, after: result.after.textSize, saved: '-' },
1151
+ { category: 'Patterns', before: result.before.patternsSize, after: result.after.patternsSize, saved: '-' },
1152
+ { category: 'Index', before: result.before.indexSize, after: result.after.indexSize, saved: '-' },
1153
+ { category: output.bold('Total'), before: result.before.totalSize, after: result.after.totalSize, saved: output.success(result.compression.formattedSaved) }
1154
+ ]
1155
+ });
1156
+ output.writeln();
1157
+ output.printBox([
1158
+ `Compression Ratio: ${result.compression.ratio.toFixed(2)}x`,
1159
+ `Space Saved: ${result.compression.formattedSaved}`,
1160
+ `Quantization: ${result.compression.quantizationApplied ? `Yes (${bits}-bit)` : 'No'}`,
1161
+ `Index Rebuilt: ${result.compression.indexRebuilt ? 'Yes' : 'No'}`,
1162
+ `Duration: ${(result.duration / 1000).toFixed(1)}s`
1163
+ ].join('\n'), 'Results');
1164
+ if (result.performance) {
1165
+ output.writeln();
1166
+ output.writeln(output.bold('Performance Impact'));
1167
+ output.printList([
1168
+ `Search latency: ${result.performance.searchLatencyBefore.toFixed(2)}ms → ${result.performance.searchLatencyAfter.toFixed(2)}ms`,
1169
+ `Speedup: ${output.success(result.performance.searchSpeedup)}`
1170
+ ]);
1171
+ }
1172
+ return { success: true, data: result };
1173
+ }
1174
+ catch (error) {
1175
+ spinner.fail('Compression failed');
1176
+ if (error instanceof MCPClientError) {
1177
+ output.printError(`Compression error: ${error.message}`);
1178
+ }
1179
+ else {
1180
+ output.printError(`Unexpected error: ${String(error)}`);
1181
+ }
1182
+ return { success: false, exitCode: 1 };
1183
+ }
1184
+ }
1185
+ };
1186
+ // Export command
1187
+ const exportCommand = {
1188
+ name: 'export',
1189
+ description: 'Export memory to file',
1190
+ options: [
1191
+ {
1192
+ name: 'output',
1193
+ short: 'o',
1194
+ description: 'Output file path',
1195
+ type: 'string',
1196
+ required: true
1197
+ },
1198
+ {
1199
+ name: 'format',
1200
+ short: 'f',
1201
+ description: 'Export format (json, csv, binary)',
1202
+ type: 'string',
1203
+ choices: ['json', 'csv', 'binary'],
1204
+ default: 'json'
1205
+ },
1206
+ {
1207
+ name: 'namespace',
1208
+ short: 'n',
1209
+ description: 'Export specific namespace',
1210
+ type: 'string'
1211
+ },
1212
+ {
1213
+ name: 'include-vectors',
1214
+ description: 'Include vector embeddings',
1215
+ type: 'boolean',
1216
+ default: true
1217
+ }
1218
+ ],
1219
+ examples: [
1220
+ { command: 'claude-flow memory export -o ./backup.json', description: 'Export all to JSON' },
1221
+ { command: 'claude-flow memory export -o ./data.csv -f csv', description: 'Export to CSV' }
1222
+ ],
1223
+ action: async (ctx) => {
1224
+ const outputPath = ctx.flags.output;
1225
+ const format = ctx.flags.format || 'json';
1226
+ if (!outputPath) {
1227
+ output.printError('Output path is required. Use --output or -o');
1228
+ return { success: false, exitCode: 1 };
1229
+ }
1230
+ output.printInfo(`Exporting memory to ${outputPath}...`);
1231
+ try {
1232
+ const result = await callMCPTool('memory_export', {
1233
+ outputPath,
1234
+ format,
1235
+ namespace: ctx.flags.namespace,
1236
+ includeVectors: ctx.flags.includeVectors ?? true,
1237
+ });
1238
+ output.printSuccess(`Exported to ${result.outputPath}`);
1239
+ output.printList([
1240
+ `Entries: ${result.exported.entries}`,
1241
+ `Vectors: ${result.exported.vectors}`,
1242
+ `Patterns: ${result.exported.patterns}`,
1243
+ `File size: ${result.fileSize}`
1244
+ ]);
1245
+ return { success: true, data: result };
1246
+ }
1247
+ catch (error) {
1248
+ if (error instanceof MCPClientError) {
1249
+ output.printError(`Export error: ${error.message}`);
1250
+ }
1251
+ else {
1252
+ output.printError(`Unexpected error: ${String(error)}`);
1253
+ }
1254
+ return { success: false, exitCode: 1 };
1255
+ }
1256
+ }
1257
+ };
1258
+ // Import command
1259
+ const importCommand = {
1260
+ name: 'import',
1261
+ description: 'Import memory from file',
1262
+ options: [
1263
+ {
1264
+ name: 'input',
1265
+ short: 'i',
1266
+ description: 'Input file path',
1267
+ type: 'string',
1268
+ required: true
1269
+ },
1270
+ {
1271
+ name: 'merge',
1272
+ short: 'm',
1273
+ description: 'Merge with existing (skip duplicates)',
1274
+ type: 'boolean',
1275
+ default: true
1276
+ },
1277
+ {
1278
+ name: 'namespace',
1279
+ short: 'n',
1280
+ description: 'Import into specific namespace',
1281
+ type: 'string'
1282
+ }
1283
+ ],
1284
+ examples: [
1285
+ { command: 'claude-flow memory import -i ./backup.json', description: 'Import from file' },
1286
+ { command: 'claude-flow memory import -i ./data.json -n archive', description: 'Import to namespace' }
1287
+ ],
1288
+ action: async (ctx) => {
1289
+ const inputPath = ctx.flags.input || ctx.args[0];
1290
+ if (!inputPath) {
1291
+ output.printError('Input path is required. Use --input or -i');
1292
+ return { success: false, exitCode: 1 };
1293
+ }
1294
+ output.printInfo(`Importing memory from ${inputPath}...`);
1295
+ try {
1296
+ const result = await callMCPTool('memory_import', {
1297
+ inputPath,
1298
+ merge: ctx.flags.merge ?? true,
1299
+ namespace: ctx.flags.namespace,
1300
+ });
1301
+ output.printSuccess(`Imported from ${result.inputPath}`);
1302
+ output.printList([
1303
+ `Entries: ${result.imported.entries}`,
1304
+ `Vectors: ${result.imported.vectors}`,
1305
+ `Patterns: ${result.imported.patterns}`,
1306
+ `Skipped (duplicates): ${result.skipped}`,
1307
+ `Duration: ${result.duration}ms`
1308
+ ]);
1309
+ return { success: true, data: result };
1310
+ }
1311
+ catch (error) {
1312
+ if (error instanceof MCPClientError) {
1313
+ output.printError(`Import error: ${error.message}`);
1314
+ }
1315
+ else {
1316
+ output.printError(`Unexpected error: ${String(error)}`);
1317
+ }
1318
+ return { success: false, exitCode: 1 };
1319
+ }
1320
+ }
1321
+ };
1322
+ // Init subcommand - initialize memory database using sql.js
1323
+ const initMemoryCommand = {
1324
+ name: 'init',
1325
+ description: 'Initialize memory database with sql.js (WASM SQLite) - includes vector embeddings, pattern learning, temporal decay',
1326
+ options: [
1327
+ {
1328
+ name: 'backend',
1329
+ short: 'b',
1330
+ description: 'Backend type: hybrid (default), sqlite, or agentdb',
1331
+ type: 'string',
1332
+ default: 'hybrid'
1333
+ },
1334
+ {
1335
+ name: 'path',
1336
+ short: 'p',
1337
+ description: 'Database path',
1338
+ type: 'string'
1339
+ },
1340
+ {
1341
+ name: 'force',
1342
+ short: 'f',
1343
+ description: 'Overwrite existing database',
1344
+ type: 'boolean',
1345
+ default: false
1346
+ },
1347
+ {
1348
+ name: 'verbose',
1349
+ description: 'Show detailed initialization output',
1350
+ type: 'boolean',
1351
+ default: false
1352
+ },
1353
+ {
1354
+ name: 'verify',
1355
+ description: 'Run verification tests after initialization',
1356
+ type: 'boolean',
1357
+ default: true
1358
+ },
1359
+ {
1360
+ name: 'load-embeddings',
1361
+ description: 'Pre-load ONNX embedding model (lazy by default)',
1362
+ type: 'boolean',
1363
+ default: false
1364
+ }
1365
+ ],
1366
+ examples: [
1367
+ { command: 'claude-flow memory init', description: 'Initialize hybrid backend with all features' },
1368
+ { command: 'claude-flow memory init -b agentdb', description: 'Initialize AgentDB backend' },
1369
+ { command: 'claude-flow memory init -p ./data/memory.db --force', description: 'Reinitialize at custom path' },
1370
+ { command: 'claude-flow memory init --verbose --verify', description: 'Initialize with full verification' }
1371
+ ],
1372
+ action: async (ctx) => {
1373
+ const backend = ctx.flags.backend || 'hybrid';
1374
+ const customPath = ctx.flags.path;
1375
+ const force = ctx.flags.force;
1376
+ const verbose = ctx.flags.verbose;
1377
+ const verify = ctx.flags.verify !== false; // Default true
1378
+ const loadEmbeddings = ctx.flags.loadEmbeddings;
1379
+ output.writeln();
1380
+ output.writeln(output.bold('Initializing Memory Database'));
1381
+ output.writeln(output.dim('─'.repeat(50)));
1382
+ const spinner = output.createSpinner({ text: 'Initializing schema...', spinner: 'dots' });
1383
+ spinner.start();
1384
+ try {
1385
+ // Import the memory initializer
1386
+ const { initializeMemoryDatabase, loadEmbeddingModel, verifyMemoryInit } = await import('../memory/memory-initializer.js');
1387
+ const result = await initializeMemoryDatabase({
1388
+ backend,
1389
+ dbPath: customPath,
1390
+ force,
1391
+ verbose
1392
+ });
1393
+ if (!result.success) {
1394
+ spinner.fail('Initialization failed');
1395
+ output.printError(result.error || 'Unknown error');
1396
+ return { success: false, exitCode: 1 };
1397
+ }
1398
+ // #1791.6 — DB already initialized and --force not passed: friendly no-op.
1399
+ if (result.alreadyExists) {
1400
+ spinner.succeed(`Memory database already initialized at ${result.dbPath}`);
1401
+ output.printInfo('Use `--force` to reinitialize from scratch (destructive).');
1402
+ return { success: true, exitCode: 0 };
1403
+ }
1404
+ spinner.succeed('Schema initialized');
1405
+ // Lazy load or pre-load embedding model
1406
+ if (loadEmbeddings) {
1407
+ const embeddingSpinner = output.createSpinner({ text: 'Loading embedding model...', spinner: 'dots' });
1408
+ embeddingSpinner.start();
1409
+ const embeddingResult = await loadEmbeddingModel({ verbose });
1410
+ if (embeddingResult.success) {
1411
+ embeddingSpinner.succeed(`Embedding model loaded: ${embeddingResult.modelName} (${embeddingResult.dimensions}-dim, ${embeddingResult.loadTime}ms)`);
1412
+ }
1413
+ else {
1414
+ embeddingSpinner.stop(output.warning(`Embedding model: ${embeddingResult.error || 'Using fallback'}`));
1415
+ }
1416
+ }
1417
+ output.writeln();
1418
+ // Show features enabled with detailed capabilities
1419
+ const featureLines = [
1420
+ `Backend: ${result.backend}`,
1421
+ `Schema Version: ${result.schemaVersion}`,
1422
+ `Database Path: ${result.dbPath}`,
1423
+ '',
1424
+ output.bold('Features:'),
1425
+ ` Vector Embeddings: ${result.features.vectorEmbeddings ? output.success('✓ Enabled') : output.dim('✗ Disabled')}`,
1426
+ ` Pattern Learning: ${result.features.patternLearning ? output.success('✓ Enabled') : output.dim('✗ Disabled')}`,
1427
+ ` Temporal Decay: ${result.features.temporalDecay ? output.success('✓ Enabled') : output.dim('✗ Disabled')}`,
1428
+ ` HNSW Indexing: ${result.features.hnswIndexing ? output.success('✓ Enabled') : output.dim('✗ Disabled')}`,
1429
+ ` Migration Tracking: ${result.features.migrationTracking ? output.success('✓ Enabled') : output.dim('✗ Disabled')}`
1430
+ ];
1431
+ if (verbose) {
1432
+ featureLines.push('', output.bold('HNSW Configuration:'), ` M (connections): 16`, ` ef (construction): 200`, ` ef (search): 100`, ` Metric: cosine`, '', output.bold('Pattern Learning:'), ` Confidence scoring: 0.0 - 1.0`, ` Temporal decay: Half-life 30 days`, ` Pattern versioning: Enabled`, ` Types: task-routing, error-recovery, optimization, coordination, prediction`);
1433
+ }
1434
+ output.printBox(featureLines.join('\n'), 'Configuration');
1435
+ output.writeln();
1436
+ // ADR-053: Show ControllerRegistry activation results
1437
+ if (result.controllers) {
1438
+ const { activated, failed, initTimeMs } = result.controllers;
1439
+ if (activated.length > 0 || failed.length > 0) {
1440
+ const controllerLines = [
1441
+ output.bold('AgentDB Controllers:'),
1442
+ ` Activated: ${activated.length} Failed: ${failed.length} Init: ${Math.round(initTimeMs)}ms`,
1443
+ ];
1444
+ if (verbose && activated.length > 0) {
1445
+ controllerLines.push('');
1446
+ for (const name of activated) {
1447
+ controllerLines.push(` ${output.success('✓')} ${name}`);
1448
+ }
1449
+ }
1450
+ if (failed.length > 0 && verbose) {
1451
+ controllerLines.push('');
1452
+ for (const name of failed) {
1453
+ controllerLines.push(` ${output.dim('✗')} ${name}`);
1454
+ }
1455
+ }
1456
+ output.printBox(controllerLines.join('\n'), 'Controller Registry (ADR-053)');
1457
+ output.writeln();
1458
+ }
1459
+ }
1460
+ // Show tables created
1461
+ if (verbose && result.tablesCreated.length > 0) {
1462
+ output.writeln(output.bold('Tables Created:'));
1463
+ output.printTable({
1464
+ columns: [
1465
+ { key: 'table', header: 'Table', width: 22 },
1466
+ { key: 'purpose', header: 'Purpose', width: 38 }
1467
+ ],
1468
+ data: [
1469
+ { table: 'memory_entries', purpose: 'Core memory storage with embeddings' },
1470
+ { table: 'patterns', purpose: 'Learned patterns with confidence scores' },
1471
+ { table: 'pattern_history', purpose: 'Pattern versioning and evolution' },
1472
+ { table: 'trajectories', purpose: 'SONA learning trajectories' },
1473
+ { table: 'trajectory_steps', purpose: 'Individual trajectory steps' },
1474
+ { table: 'migration_state', purpose: 'Migration progress tracking' },
1475
+ { table: 'sessions', purpose: 'Context persistence' },
1476
+ { table: 'vector_indexes', purpose: 'HNSW index configuration' },
1477
+ { table: 'metadata', purpose: 'System metadata' }
1478
+ ]
1479
+ });
1480
+ output.writeln();
1481
+ output.writeln(output.bold('Indexes Created:'));
1482
+ output.printList(result.indexesCreated.slice(0, 8).map(idx => output.dim(idx)));
1483
+ if (result.indexesCreated.length > 8) {
1484
+ output.writeln(output.dim(` ... and ${result.indexesCreated.length - 8} more`));
1485
+ }
1486
+ output.writeln();
1487
+ }
1488
+ // Run verification if enabled
1489
+ if (verify) {
1490
+ const verifySpinner = output.createSpinner({ text: 'Verifying initialization...', spinner: 'dots' });
1491
+ verifySpinner.start();
1492
+ const verification = await verifyMemoryInit(result.dbPath, { verbose });
1493
+ if (verification.success) {
1494
+ verifySpinner.succeed(`Verification passed (${verification.summary.passed}/${verification.summary.total} tests)`);
1495
+ }
1496
+ else {
1497
+ verifySpinner.fail(`Verification failed (${verification.summary.failed}/${verification.summary.total} tests failed)`);
1498
+ }
1499
+ if (verbose || !verification.success) {
1500
+ output.writeln();
1501
+ output.writeln(output.bold('Verification Results:'));
1502
+ output.printTable({
1503
+ columns: [
1504
+ { key: 'status', header: '', width: 3 },
1505
+ { key: 'name', header: 'Test', width: 22 },
1506
+ { key: 'details', header: 'Details', width: 30 },
1507
+ { key: 'duration', header: 'Time', width: 8, align: 'right' }
1508
+ ],
1509
+ data: verification.tests.map(t => ({
1510
+ status: t.passed ? output.success('✓') : output.error('✗'),
1511
+ name: t.name,
1512
+ details: t.details || '',
1513
+ duration: t.duration ? `${t.duration}ms` : '-'
1514
+ }))
1515
+ });
1516
+ }
1517
+ output.writeln();
1518
+ }
1519
+ // Show next steps
1520
+ output.writeln(output.bold('Next Steps:'));
1521
+ output.printList([
1522
+ `Store data: ${output.highlight('claude-flow memory store -k "key" --value "data"')}`,
1523
+ `Search: ${output.highlight('claude-flow memory search -q "query"')}`,
1524
+ `Train patterns: ${output.highlight('claude-flow neural train -p coordination')}`,
1525
+ `View stats: ${output.highlight('claude-flow memory stats')}`
1526
+ ]);
1527
+ // Also sync to .claude directory
1528
+ const fs = await import('fs');
1529
+ const path = await import('path');
1530
+ const claudeDir = path.join(process.cwd(), '.claude');
1531
+ const claudeDbPath = path.join(claudeDir, 'memory.db');
1532
+ if (!fs.existsSync(claudeDir)) {
1533
+ fs.mkdirSync(claudeDir, { recursive: true });
1534
+ }
1535
+ if (fs.existsSync(result.dbPath) && (!fs.existsSync(claudeDbPath) || force)) {
1536
+ fs.copyFileSync(result.dbPath, claudeDbPath);
1537
+ output.writeln();
1538
+ output.writeln(output.dim(`Synced to: ${claudeDbPath}`));
1539
+ }
1540
+ // Fix #1428: ONNX worker threads keep the event loop alive after init.
1541
+ // Force-exit after a short delay to allow final I/O to flush.
1542
+ if (typeof globalThis !== 'undefined') {
1543
+ setTimeout(() => {
1544
+ process.exit(0);
1545
+ }, 500).unref();
1546
+ }
1547
+ return {
1548
+ success: true,
1549
+ data: result
1550
+ };
1551
+ }
1552
+ catch (error) {
1553
+ spinner.fail('Initialization failed');
1554
+ output.printError(`Failed to initialize memory: ${error instanceof Error ? error.message : String(error)}`);
1555
+ return { success: false, exitCode: 1 };
1556
+ }
1557
+ }
1558
+ };
1559
+ // Main memory command
1560
+ export const memoryCommand = {
1561
+ name: 'memory',
1562
+ description: 'Memory management commands',
1563
+ subcommands: [initMemoryCommand, storeCommand, retrieveCommand, searchCommand, listCommand, deleteCommand, purgeCommand, statsCommand, configureCommand, cleanupCommand, compressCommand, exportCommand, importCommand, distillCommand, backupCommand],
1564
+ options: [],
1565
+ examples: [
1566
+ { command: 'claude-flow memory store -k "key" -v "value"', description: 'Store data' },
1567
+ { command: 'claude-flow memory search -q "auth patterns"', description: 'Search memory' },
1568
+ { command: 'claude-flow memory stats', description: 'Show statistics' }
1569
+ ],
1570
+ action: async (ctx) => {
1571
+ output.writeln();
1572
+ output.writeln(output.bold('Memory Management Commands'));
1573
+ output.writeln();
1574
+ output.writeln('Usage: claude-flow memory <subcommand> [options]');
1575
+ output.writeln();
1576
+ output.writeln('Subcommands:');
1577
+ output.printList([
1578
+ `${output.highlight('init')} - Initialize memory database (sql.js)`,
1579
+ `${output.highlight('store')} - Store data in memory`,
1580
+ `${output.highlight('retrieve')} - Retrieve data from memory`,
1581
+ `${output.highlight('search')} - Semantic/vector search`,
1582
+ `${output.highlight('list')} - List memory entries`,
1583
+ `${output.highlight('delete')} - Delete memory entry`,
1584
+ `${output.highlight('stats')} - Show statistics`,
1585
+ `${output.highlight('configure')} - Configure backend`,
1586
+ `${output.highlight('cleanup')} - Clean expired entries`,
1587
+ `${output.highlight('compress')} - Compress database`,
1588
+ `${output.highlight('export')} - Export memory to file`,
1589
+ `${output.highlight('import')} - Import from file`,
1590
+ `${output.highlight('distill')} - Distill memory_entries into structured intelligence (ADR-174)`
1591
+ ]);
1592
+ return { success: true };
1593
+ }
1594
+ };
1595
+ export default memoryCommand;
1596
+ //# sourceMappingURL=memory.js.map