@claude-flow/cli 3.32.2 → 3.32.3

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 (655) hide show
  1. package/.claude/helpers/helpers.manifest.json +3 -3
  2. package/.claude/helpers/statusline.cjs +38 -38
  3. package/catalog-manifest.json +2 -2
  4. package/package.json +2 -2
  5. package/plugins/ruflo-metaharness/scripts/smoke.sh +11 -11
  6. package/dist/src/agenticow/speculative-exploration.d.ts +0 -148
  7. package/dist/src/agenticow/speculative-exploration.js +0 -218
  8. package/dist/src/appliance/gguf-engine.d.ts +0 -91
  9. package/dist/src/appliance/gguf-engine.js +0 -425
  10. package/dist/src/appliance/ruvllm-bridge.d.ts +0 -102
  11. package/dist/src/appliance/ruvllm-bridge.js +0 -292
  12. package/dist/src/appliance/rvfa-builder.d.ts +0 -44
  13. package/dist/src/appliance/rvfa-builder.js +0 -329
  14. package/dist/src/appliance/rvfa-distribution.d.ts +0 -97
  15. package/dist/src/appliance/rvfa-distribution.js +0 -370
  16. package/dist/src/appliance/rvfa-format.d.ts +0 -111
  17. package/dist/src/appliance/rvfa-format.js +0 -393
  18. package/dist/src/appliance/rvfa-runner.d.ts +0 -69
  19. package/dist/src/appliance/rvfa-runner.js +0 -237
  20. package/dist/src/appliance/rvfa-signing.d.ts +0 -123
  21. package/dist/src/appliance/rvfa-signing.js +0 -347
  22. package/dist/src/autopilot-state.d.ts +0 -77
  23. package/dist/src/autopilot-state.js +0 -271
  24. package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts +0 -18
  25. package/dist/src/benchmarks/gaia-agent-planning.smoke.js +0 -253
  26. package/dist/src/benchmarks/gaia-agent.d.ts +0 -198
  27. package/dist/src/benchmarks/gaia-agent.js +0 -651
  28. package/dist/src/benchmarks/gaia-causal-memory.d.ts +0 -133
  29. package/dist/src/benchmarks/gaia-causal-memory.js +0 -281
  30. package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts +0 -22
  31. package/dist/src/benchmarks/gaia-causal-memory.smoke.js +0 -300
  32. package/dist/src/benchmarks/gaia-convergence.d.ts +0 -138
  33. package/dist/src/benchmarks/gaia-convergence.js +0 -260
  34. package/dist/src/benchmarks/gaia-convergence.smoke.d.ts +0 -19
  35. package/dist/src/benchmarks/gaia-convergence.smoke.js +0 -246
  36. package/dist/src/benchmarks/gaia-critic.d.ts +0 -123
  37. package/dist/src/benchmarks/gaia-critic.js +0 -312
  38. package/dist/src/benchmarks/gaia-critic.smoke.d.ts +0 -21
  39. package/dist/src/benchmarks/gaia-critic.smoke.js +0 -327
  40. package/dist/src/benchmarks/gaia-decomposer.d.ts +0 -125
  41. package/dist/src/benchmarks/gaia-decomposer.js +0 -350
  42. package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts +0 -21
  43. package/dist/src/benchmarks/gaia-decomposer.smoke.js +0 -228
  44. package/dist/src/benchmarks/gaia-e2e-smoke.d.ts +0 -27
  45. package/dist/src/benchmarks/gaia-e2e-smoke.js +0 -136
  46. package/dist/src/benchmarks/gaia-extract.smoke.d.ts +0 -45
  47. package/dist/src/benchmarks/gaia-extract.smoke.js +0 -242
  48. package/dist/src/benchmarks/gaia-hardness/features.d.ts +0 -46
  49. package/dist/src/benchmarks/gaia-hardness/features.js +0 -170
  50. package/dist/src/benchmarks/gaia-hardness/predictor.d.ts +0 -105
  51. package/dist/src/benchmarks/gaia-hardness/predictor.js +0 -260
  52. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts +0 -20
  53. package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js +0 -235
  54. package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts +0 -51
  55. package/dist/src/benchmarks/gaia-hardness/train-data-loader.js +0 -179
  56. package/dist/src/benchmarks/gaia-judge.d.ts +0 -88
  57. package/dist/src/benchmarks/gaia-judge.js +0 -437
  58. package/dist/src/benchmarks/gaia-loader.d.ts +0 -87
  59. package/dist/src/benchmarks/gaia-loader.js +0 -326
  60. package/dist/src/benchmarks/gaia-tools/file_read.d.ts +0 -35
  61. package/dist/src/benchmarks/gaia-tools/file_read.js +0 -403
  62. package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts +0 -126
  63. package/dist/src/benchmarks/gaia-tools/grounded_query.js +0 -225
  64. package/dist/src/benchmarks/gaia-tools/index.d.ts +0 -32
  65. package/dist/src/benchmarks/gaia-tools/index.js +0 -36
  66. package/dist/src/benchmarks/gaia-tools/types.d.ts +0 -62
  67. package/dist/src/benchmarks/gaia-tools/types.js +0 -12
  68. package/dist/src/benchmarks/gaia-tools/web_search.d.ts +0 -30
  69. package/dist/src/benchmarks/gaia-tools/web_search.js +0 -210
  70. package/dist/src/benchmarks/gaia-voting.d.ts +0 -88
  71. package/dist/src/benchmarks/gaia-voting.js +0 -297
  72. package/dist/src/benchmarks/gaia-voting.smoke.d.ts +0 -20
  73. package/dist/src/benchmarks/gaia-voting.smoke.js +0 -332
  74. package/dist/src/benchmarks/pretrain/index.d.ts +0 -58
  75. package/dist/src/benchmarks/pretrain/index.js +0 -404
  76. package/dist/src/business-pods/bbs-budget-tracker.d.ts +0 -139
  77. package/dist/src/business-pods/bbs-budget-tracker.js +0 -358
  78. package/dist/src/business-pods/domain-affinity-policy.d.ts +0 -47
  79. package/dist/src/business-pods/domain-affinity-policy.js +0 -65
  80. package/dist/src/business-pods/pod-schema.d.ts +0 -96
  81. package/dist/src/business-pods/pod-schema.js +0 -225
  82. package/dist/src/commands/advisor.d.ts +0 -15
  83. package/dist/src/commands/advisor.js +0 -94
  84. package/dist/src/commands/agent-wasm.d.ts +0 -14
  85. package/dist/src/commands/agent-wasm.js +0 -333
  86. package/dist/src/commands/agent.d.ts +0 -8
  87. package/dist/src/commands/agent.js +0 -927
  88. package/dist/src/commands/analyze.d.ts +0 -19
  89. package/dist/src/commands/analyze.js +0 -2047
  90. package/dist/src/commands/announcements.d.ts +0 -17
  91. package/dist/src/commands/announcements.js +0 -0
  92. package/dist/src/commands/appliance-advanced.d.ts +0 -9
  93. package/dist/src/commands/appliance-advanced.js +0 -215
  94. package/dist/src/commands/appliance.d.ts +0 -8
  95. package/dist/src/commands/appliance.js +0 -404
  96. package/dist/src/commands/autopilot.d.ts +0 -15
  97. package/dist/src/commands/autopilot.js +0 -407
  98. package/dist/src/commands/benchmark.d.ts +0 -10
  99. package/dist/src/commands/benchmark.js +0 -460
  100. package/dist/src/commands/claims.d.ts +0 -10
  101. package/dist/src/commands/claims.js +0 -620
  102. package/dist/src/commands/cleanup.d.ts +0 -13
  103. package/dist/src/commands/cleanup.js +0 -250
  104. package/dist/src/commands/completions.d.ts +0 -10
  105. package/dist/src/commands/completions.js +0 -539
  106. package/dist/src/commands/config.d.ts +0 -8
  107. package/dist/src/commands/config.js +0 -428
  108. package/dist/src/commands/daemon.d.ts +0 -59
  109. package/dist/src/commands/daemon.js +0 -1733
  110. package/dist/src/commands/deployment.d.ts +0 -10
  111. package/dist/src/commands/deployment.js +0 -672
  112. package/dist/src/commands/doctor.d.ts +0 -10
  113. package/dist/src/commands/doctor.js +0 -1695
  114. package/dist/src/commands/eject.d.ts +0 -33
  115. package/dist/src/commands/eject.js +0 -195
  116. package/dist/src/commands/embeddings.d.ts +0 -18
  117. package/dist/src/commands/embeddings.js +0 -1623
  118. package/dist/src/commands/funnel.d.ts +0 -18
  119. package/dist/src/commands/funnel.js +0 -302
  120. package/dist/src/commands/gaia-bench.d.ts +0 -40
  121. package/dist/src/commands/gaia-bench.js +0 -597
  122. package/dist/src/commands/guidance.d.ts +0 -8
  123. package/dist/src/commands/guidance.js +0 -556
  124. package/dist/src/commands/hive-mind.d.ts +0 -11
  125. package/dist/src/commands/hive-mind.js +0 -1319
  126. package/dist/src/commands/hooks.d.ts +0 -8
  127. package/dist/src/commands/hooks.js +0 -4606
  128. package/dist/src/commands/index.d.ts +0 -118
  129. package/dist/src/commands/index.js +0 -364
  130. package/dist/src/commands/init.d.ts +0 -13
  131. package/dist/src/commands/init.js +0 -1297
  132. package/dist/src/commands/issues.d.ts +0 -21
  133. package/dist/src/commands/issues.js +0 -567
  134. package/dist/src/commands/mcp.d.ts +0 -11
  135. package/dist/src/commands/mcp.js +0 -732
  136. package/dist/src/commands/memory-backup.d.ts +0 -11
  137. package/dist/src/commands/memory-backup.js +0 -46
  138. package/dist/src/commands/memory-distill.d.ts +0 -27
  139. package/dist/src/commands/memory-distill.js +0 -374
  140. package/dist/src/commands/memory.d.ts +0 -8
  141. package/dist/src/commands/memory.js +0 -1596
  142. package/dist/src/commands/metaharness.d.ts +0 -39
  143. package/dist/src/commands/metaharness.js +0 -215
  144. package/dist/src/commands/migrate.d.ts +0 -8
  145. package/dist/src/commands/migrate.js +0 -742
  146. package/dist/src/commands/neural.d.ts +0 -10
  147. package/dist/src/commands/neural.js +0 -4331
  148. package/dist/src/commands/performance.d.ts +0 -10
  149. package/dist/src/commands/performance.js +0 -583
  150. package/dist/src/commands/plugins.d.ts +0 -11
  151. package/dist/src/commands/plugins.js +0 -826
  152. package/dist/src/commands/process.d.ts +0 -10
  153. package/dist/src/commands/process.js +0 -694
  154. package/dist/src/commands/progress.d.ts +0 -11
  155. package/dist/src/commands/progress.js +0 -259
  156. package/dist/src/commands/providers.d.ts +0 -10
  157. package/dist/src/commands/providers.js +0 -502
  158. package/dist/src/commands/proxy.d.ts +0 -21
  159. package/dist/src/commands/proxy.js +0 -310
  160. package/dist/src/commands/route.d.ts +0 -16
  161. package/dist/src/commands/route.js +0 -822
  162. package/dist/src/commands/ruvector/backup.d.ts +0 -11
  163. package/dist/src/commands/ruvector/backup.js +0 -747
  164. package/dist/src/commands/ruvector/benchmark.d.ts +0 -11
  165. package/dist/src/commands/ruvector/benchmark.js +0 -490
  166. package/dist/src/commands/ruvector/import.d.ts +0 -18
  167. package/dist/src/commands/ruvector/import.js +0 -373
  168. package/dist/src/commands/ruvector/index.d.ts +0 -29
  169. package/dist/src/commands/ruvector/index.js +0 -129
  170. package/dist/src/commands/ruvector/init.d.ts +0 -11
  171. package/dist/src/commands/ruvector/init.js +0 -467
  172. package/dist/src/commands/ruvector/migrate.d.ts +0 -11
  173. package/dist/src/commands/ruvector/migrate.js +0 -498
  174. package/dist/src/commands/ruvector/optimize.d.ts +0 -11
  175. package/dist/src/commands/ruvector/optimize.js +0 -505
  176. package/dist/src/commands/ruvector/pg-utils.d.ts +0 -14
  177. package/dist/src/commands/ruvector/pg-utils.js +0 -41
  178. package/dist/src/commands/ruvector/setup.d.ts +0 -18
  179. package/dist/src/commands/ruvector/setup.js +0 -765
  180. package/dist/src/commands/ruvector/status.d.ts +0 -11
  181. package/dist/src/commands/ruvector/status.js +0 -479
  182. package/dist/src/commands/security.d.ts +0 -10
  183. package/dist/src/commands/security.js +0 -1012
  184. package/dist/src/commands/session.d.ts +0 -8
  185. package/dist/src/commands/session.js +0 -757
  186. package/dist/src/commands/settings.d.ts +0 -19
  187. package/dist/src/commands/settings.js +0 -180
  188. package/dist/src/commands/spinner.d.ts +0 -16
  189. package/dist/src/commands/spinner.js +0 -329
  190. package/dist/src/commands/start.d.ts +0 -8
  191. package/dist/src/commands/start.js +0 -418
  192. package/dist/src/commands/status.d.ts +0 -8
  193. package/dist/src/commands/status.js +0 -608
  194. package/dist/src/commands/swarm.d.ts +0 -8
  195. package/dist/src/commands/swarm.js +0 -891
  196. package/dist/src/commands/task.d.ts +0 -8
  197. package/dist/src/commands/task.js +0 -675
  198. package/dist/src/commands/transfer-store.d.ts +0 -13
  199. package/dist/src/commands/transfer-store.js +0 -428
  200. package/dist/src/commands/update.d.ts +0 -8
  201. package/dist/src/commands/update.js +0 -276
  202. package/dist/src/commands/verify.d.ts +0 -19
  203. package/dist/src/commands/verify.js +0 -261
  204. package/dist/src/commands/version.d.ts +0 -42
  205. package/dist/src/commands/version.js +0 -106
  206. package/dist/src/commands/workflow.d.ts +0 -8
  207. package/dist/src/commands/workflow.js +0 -617
  208. package/dist/src/config/harness-feedback-applier.d.ts +0 -50
  209. package/dist/src/config/harness-feedback-applier.js +0 -122
  210. package/dist/src/config/proven-config-refresh.d.ts +0 -39
  211. package/dist/src/config/proven-config-refresh.js +0 -154
  212. package/dist/src/config/proven-config-rvfa.d.ts +0 -23
  213. package/dist/src/config/proven-config-rvfa.js +0 -73
  214. package/dist/src/config/proven-config.d.ts +0 -86
  215. package/dist/src/config/proven-config.js +0 -176
  216. package/dist/src/config-adapter.d.ts +0 -15
  217. package/dist/src/config-adapter.js +0 -186
  218. package/dist/src/encryption/vault.d.ts +0 -94
  219. package/dist/src/encryption/vault.js +0 -172
  220. package/dist/src/fs-secure.d.ts +0 -86
  221. package/dist/src/fs-secure.js +0 -133
  222. package/dist/src/funnel/advisor-tip.d.ts +0 -58
  223. package/dist/src/funnel/advisor-tip.js +0 -92
  224. package/dist/src/funnel/attribution.d.ts +0 -37
  225. package/dist/src/funnel/attribution.js +0 -101
  226. package/dist/src/funnel/consent.d.ts +0 -22
  227. package/dist/src/funnel/consent.js +0 -58
  228. package/dist/src/funnel/credit-errors.d.ts +0 -31
  229. package/dist/src/funnel/credit-errors.js +0 -88
  230. package/dist/src/funnel/credit-notifier.d.ts +0 -44
  231. package/dist/src/funnel/credit-notifier.js +0 -74
  232. package/dist/src/funnel/disclosure.d.ts +0 -47
  233. package/dist/src/funnel/disclosure.js +0 -109
  234. package/dist/src/funnel/enrollment.d.ts +0 -36
  235. package/dist/src/funnel/enrollment.js +0 -64
  236. package/dist/src/funnel/environment.d.ts +0 -17
  237. package/dist/src/funnel/environment.js +0 -39
  238. package/dist/src/funnel/event-transport.d.ts +0 -51
  239. package/dist/src/funnel/event-transport.js +0 -199
  240. package/dist/src/funnel/events.d.ts +0 -42
  241. package/dist/src/funnel/events.js +0 -150
  242. package/dist/src/funnel/index.d.ts +0 -21
  243. package/dist/src/funnel/index.js +0 -21
  244. package/dist/src/funnel/insights.d.ts +0 -50
  245. package/dist/src/funnel/insights.js +0 -120
  246. package/dist/src/funnel/local-signals.d.ts +0 -20
  247. package/dist/src/funnel/local-signals.js +0 -77
  248. package/dist/src/funnel/message-transport.d.ts +0 -51
  249. package/dist/src/funnel/message-transport.js +0 -149
  250. package/dist/src/funnel/messages.d.ts +0 -55
  251. package/dist/src/funnel/messages.js +0 -160
  252. package/dist/src/funnel/payout.d.ts +0 -40
  253. package/dist/src/funnel/payout.js +0 -60
  254. package/dist/src/funnel/power-saver-notifier.d.ts +0 -44
  255. package/dist/src/funnel/power-saver-notifier.js +0 -92
  256. package/dist/src/funnel/precedence.d.ts +0 -16
  257. package/dist/src/funnel/precedence.js +0 -85
  258. package/dist/src/funnel/promo.d.ts +0 -41
  259. package/dist/src/funnel/promo.js +0 -144
  260. package/dist/src/funnel/rate-limit-notifier.d.ts +0 -55
  261. package/dist/src/funnel/rate-limit-notifier.js +0 -102
  262. package/dist/src/funnel/rotation.d.ts +0 -19
  263. package/dist/src/funnel/rotation.js +0 -70
  264. package/dist/src/funnel/state.d.ts +0 -13
  265. package/dist/src/funnel/state.js +0 -52
  266. package/dist/src/funnel/toggle-cooldown.d.ts +0 -17
  267. package/dist/src/funnel/toggle-cooldown.js +0 -32
  268. package/dist/src/funnel/types.d.ts +0 -98
  269. package/dist/src/funnel/types.js +0 -26
  270. package/dist/src/index.d.ts +0 -81
  271. package/dist/src/index.js +0 -609
  272. package/dist/src/infrastructure/in-memory-repositories.d.ts +0 -68
  273. package/dist/src/infrastructure/in-memory-repositories.js +0 -264
  274. package/dist/src/init/claudemd-generator.d.ts +0 -16
  275. package/dist/src/init/claudemd-generator.js +0 -368
  276. package/dist/src/init/executor.d.ts +0 -41
  277. package/dist/src/init/executor.js +0 -2142
  278. package/dist/src/init/helper-refresh.d.ts +0 -79
  279. package/dist/src/init/helper-refresh.js +0 -347
  280. package/dist/src/init/helper-signing.d.ts +0 -37
  281. package/dist/src/init/helper-signing.js +0 -67
  282. package/dist/src/init/helpers-generator.d.ts +0 -87
  283. package/dist/src/init/helpers-generator.js +0 -1456
  284. package/dist/src/init/index.d.ts +0 -13
  285. package/dist/src/init/index.js +0 -15
  286. package/dist/src/init/mcp-generator.d.ts +0 -26
  287. package/dist/src/init/mcp-generator.js +0 -126
  288. package/dist/src/init/memory-package-resolver.d.ts +0 -53
  289. package/dist/src/init/memory-package-resolver.js +0 -118
  290. package/dist/src/init/settings-generator.d.ts +0 -14
  291. package/dist/src/init/settings-generator.js +0 -462
  292. package/dist/src/init/statusline-generator.d.ts +0 -28
  293. package/dist/src/init/statusline-generator.js +0 -177
  294. package/dist/src/init/types.d.ts +0 -331
  295. package/dist/src/init/types.js +0 -276
  296. package/dist/src/log-filters.d.ts +0 -46
  297. package/dist/src/log-filters.js +0 -107
  298. package/dist/src/mcp-client.d.ts +0 -92
  299. package/dist/src/mcp-client.js +0 -397
  300. package/dist/src/mcp-server.d.ts +0 -163
  301. package/dist/src/mcp-server.js +0 -751
  302. package/dist/src/mcp-tools/agent-execute-core.d.ts +0 -115
  303. package/dist/src/mcp-tools/agent-execute-core.js +0 -587
  304. package/dist/src/mcp-tools/agent-tools.d.ts +0 -9
  305. package/dist/src/mcp-tools/agent-tools.js +0 -837
  306. package/dist/src/mcp-tools/agentbbs-tools.d.ts +0 -28
  307. package/dist/src/mcp-tools/agentbbs-tools.js +0 -394
  308. package/dist/src/mcp-tools/agentdb-tools.d.ts +0 -35
  309. package/dist/src/mcp-tools/agentdb-tools.js +0 -1473
  310. package/dist/src/mcp-tools/agenticow-loader.d.ts +0 -59
  311. package/dist/src/mcp-tools/agenticow-loader.js +0 -105
  312. package/dist/src/mcp-tools/agenticow-speculate-tools.d.ts +0 -24
  313. package/dist/src/mcp-tools/agenticow-speculate-tools.js +0 -209
  314. package/dist/src/mcp-tools/agenticow-tools.d.ts +0 -36
  315. package/dist/src/mcp-tools/agenticow-tools.js +0 -360
  316. package/dist/src/mcp-tools/analyze-tools.d.ts +0 -38
  317. package/dist/src/mcp-tools/analyze-tools.js +0 -346
  318. package/dist/src/mcp-tools/auto-install.d.ts +0 -83
  319. package/dist/src/mcp-tools/auto-install.js +0 -131
  320. package/dist/src/mcp-tools/autopilot-tools.d.ts +0 -12
  321. package/dist/src/mcp-tools/autopilot-tools.js +0 -231
  322. package/dist/src/mcp-tools/browser-intent-tools.d.ts +0 -162
  323. package/dist/src/mcp-tools/browser-intent-tools.js +0 -548
  324. package/dist/src/mcp-tools/browser-session-tools.d.ts +0 -27
  325. package/dist/src/mcp-tools/browser-session-tools.js +0 -398
  326. package/dist/src/mcp-tools/browser-tools.d.ts +0 -21
  327. package/dist/src/mcp-tools/browser-tools.js +0 -760
  328. package/dist/src/mcp-tools/business-pod-tools.d.ts +0 -20
  329. package/dist/src/mcp-tools/business-pod-tools.js +0 -169
  330. package/dist/src/mcp-tools/claims-tools.d.ts +0 -12
  331. package/dist/src/mcp-tools/claims-tools.js +0 -863
  332. package/dist/src/mcp-tools/config-tools.d.ts +0 -8
  333. package/dist/src/mcp-tools/config-tools.js +0 -411
  334. package/dist/src/mcp-tools/coordination-tools.d.ts +0 -13
  335. package/dist/src/mcp-tools/coordination-tools.js +0 -729
  336. package/dist/src/mcp-tools/daa-tools.d.ts +0 -13
  337. package/dist/src/mcp-tools/daa-tools.js +0 -534
  338. package/dist/src/mcp-tools/embeddings-tools.d.ts +0 -9
  339. package/dist/src/mcp-tools/embeddings-tools.js +0 -904
  340. package/dist/src/mcp-tools/github-tools.d.ts +0 -9
  341. package/dist/src/mcp-tools/github-tools.js +0 -659
  342. package/dist/src/mcp-tools/guidance-tools.d.ts +0 -15
  343. package/dist/src/mcp-tools/guidance-tools.js +0 -639
  344. package/dist/src/mcp-tools/hive-mind-tools.d.ts +0 -8
  345. package/dist/src/mcp-tools/hive-mind-tools.js +0 -953
  346. package/dist/src/mcp-tools/hooks-tools.d.ts +0 -65
  347. package/dist/src/mcp-tools/hooks-tools.js +0 -4836
  348. package/dist/src/mcp-tools/http-fetch-tools.d.ts +0 -55
  349. package/dist/src/mcp-tools/http-fetch-tools.js +0 -329
  350. package/dist/src/mcp-tools/index.d.ts +0 -34
  351. package/dist/src/mcp-tools/index.js +0 -40
  352. package/dist/src/mcp-tools/managed-agent-tools.d.ts +0 -22
  353. package/dist/src/mcp-tools/managed-agent-tools.js +0 -357
  354. package/dist/src/mcp-tools/memory-tools.d.ts +0 -14
  355. package/dist/src/mcp-tools/memory-tools.js +0 -1330
  356. package/dist/src/mcp-tools/metaharness-tools.d.ts +0 -51
  357. package/dist/src/mcp-tools/metaharness-tools.js +0 -684
  358. package/dist/src/mcp-tools/neural-tools.d.ts +0 -54
  359. package/dist/src/mcp-tools/neural-tools.js +0 -1168
  360. package/dist/src/mcp-tools/performance-tools.d.ts +0 -16
  361. package/dist/src/mcp-tools/performance-tools.js +0 -675
  362. package/dist/src/mcp-tools/progress-tools.d.ts +0 -14
  363. package/dist/src/mcp-tools/progress-tools.js +0 -348
  364. package/dist/src/mcp-tools/request-tracker.d.ts +0 -17
  365. package/dist/src/mcp-tools/request-tracker.js +0 -27
  366. package/dist/src/mcp-tools/ruvllm-tools.d.ts +0 -9
  367. package/dist/src/mcp-tools/ruvllm-tools.js +0 -355
  368. package/dist/src/mcp-tools/security-tools.d.ts +0 -18
  369. package/dist/src/mcp-tools/security-tools.js +0 -556
  370. package/dist/src/mcp-tools/session-tools.d.ts +0 -8
  371. package/dist/src/mcp-tools/session-tools.js +0 -517
  372. package/dist/src/mcp-tools/swarm-tools.d.ts +0 -37
  373. package/dist/src/mcp-tools/swarm-tools.js +0 -390
  374. package/dist/src/mcp-tools/system-tools.d.ts +0 -13
  375. package/dist/src/mcp-tools/system-tools.js +0 -688
  376. package/dist/src/mcp-tools/task-tools.d.ts +0 -8
  377. package/dist/src/mcp-tools/task-tools.js +0 -487
  378. package/dist/src/mcp-tools/terminal-tools.d.ts +0 -8
  379. package/dist/src/mcp-tools/terminal-tools.js +0 -306
  380. package/dist/src/mcp-tools/testgen-tools.d.ts +0 -26
  381. package/dist/src/mcp-tools/testgen-tools.js +0 -168
  382. package/dist/src/mcp-tools/tool-loop-guardrail.d.ts +0 -31
  383. package/dist/src/mcp-tools/tool-loop-guardrail.js +0 -71
  384. package/dist/src/mcp-tools/transfer-tools.d.ts +0 -14
  385. package/dist/src/mcp-tools/transfer-tools.js +0 -447
  386. package/dist/src/mcp-tools/types.d.ts +0 -8
  387. package/dist/src/mcp-tools/types.js +0 -8
  388. package/dist/src/mcp-tools/validate-input.d.ts +0 -9
  389. package/dist/src/mcp-tools/validate-input.js +0 -9
  390. package/dist/src/mcp-tools/wasm-agent-tools.d.ts +0 -13
  391. package/dist/src/mcp-tools/wasm-agent-tools.js +0 -840
  392. package/dist/src/mcp-tools/workflow-tools.d.ts +0 -8
  393. package/dist/src/mcp-tools/workflow-tools.js +0 -884
  394. package/dist/src/memory/bge-embedder.d.ts +0 -25
  395. package/dist/src/memory/bge-embedder.js +0 -121
  396. package/dist/src/memory/cross-encoder-rerank.d.ts +0 -33
  397. package/dist/src/memory/cross-encoder-rerank.js +0 -123
  398. package/dist/src/memory/embedding-policy.d.ts +0 -21
  399. package/dist/src/memory/embedding-policy.js +0 -30
  400. package/dist/src/memory/embedding-quantization.d.ts +0 -62
  401. package/dist/src/memory/embedding-quantization.js +0 -156
  402. package/dist/src/memory/ewc-consolidation.d.ts +0 -305
  403. package/dist/src/memory/ewc-consolidation.js +0 -611
  404. package/dist/src/memory/graph-edge-writer.d.ts +0 -95
  405. package/dist/src/memory/graph-edge-writer.js +0 -217
  406. package/dist/src/memory/hybrid-retrieval.d.ts +0 -77
  407. package/dist/src/memory/hybrid-retrieval.js +0 -192
  408. package/dist/src/memory/intelligence.d.ts +0 -405
  409. package/dist/src/memory/intelligence.js +0 -1316
  410. package/dist/src/memory/lucene-bm25.d.ts +0 -19
  411. package/dist/src/memory/lucene-bm25.js +0 -308
  412. package/dist/src/memory/memory-bridge.d.ts +0 -537
  413. package/dist/src/memory/memory-bridge.js +0 -2460
  414. package/dist/src/memory/memory-initializer.d.ts +0 -556
  415. package/dist/src/memory/memory-initializer.js +0 -3021
  416. package/dist/src/memory/neural-package-bridge.d.ts +0 -48
  417. package/dist/src/memory/neural-package-bridge.js +0 -87
  418. package/dist/src/memory/rabitq-index.d.ts +0 -60
  419. package/dist/src/memory/rabitq-index.js +0 -242
  420. package/dist/src/memory/sona-optimizer.d.ts +0 -267
  421. package/dist/src/memory/sona-optimizer.js +0 -779
  422. package/dist/src/memory/structured-distill.d.ts +0 -48
  423. package/dist/src/memory/structured-distill.js +0 -125
  424. package/dist/src/output.d.ts +0 -9
  425. package/dist/src/output.js +0 -9
  426. package/dist/src/parser.d.ts +0 -89
  427. package/dist/src/parser.js +0 -516
  428. package/dist/src/plugins/manager.d.ts +0 -133
  429. package/dist/src/plugins/manager.js +0 -415
  430. package/dist/src/plugins/store/discovery.d.ts +0 -99
  431. package/dist/src/plugins/store/discovery.js +0 -1224
  432. package/dist/src/plugins/store/index.d.ts +0 -76
  433. package/dist/src/plugins/store/index.js +0 -141
  434. package/dist/src/plugins/store/search.d.ts +0 -46
  435. package/dist/src/plugins/store/search.js +0 -230
  436. package/dist/src/plugins/store/types.d.ts +0 -279
  437. package/dist/src/plugins/store/types.js +0 -7
  438. package/dist/src/plugins/tests/demo-plugin-store.d.ts +0 -7
  439. package/dist/src/plugins/tests/demo-plugin-store.js +0 -126
  440. package/dist/src/plugins/tests/standalone-test.d.ts +0 -12
  441. package/dist/src/plugins/tests/standalone-test.js +0 -188
  442. package/dist/src/plugins/tests/test-plugin-store.d.ts +0 -7
  443. package/dist/src/plugins/tests/test-plugin-store.js +0 -206
  444. package/dist/src/production/circuit-breaker.d.ts +0 -101
  445. package/dist/src/production/circuit-breaker.js +0 -241
  446. package/dist/src/production/error-handler.d.ts +0 -92
  447. package/dist/src/production/error-handler.js +0 -299
  448. package/dist/src/production/index.d.ts +0 -23
  449. package/dist/src/production/index.js +0 -18
  450. package/dist/src/production/monitoring.d.ts +0 -161
  451. package/dist/src/production/monitoring.js +0 -356
  452. package/dist/src/production/rate-limiter.d.ts +0 -80
  453. package/dist/src/production/rate-limiter.js +0 -201
  454. package/dist/src/production/retry.d.ts +0 -48
  455. package/dist/src/production/retry.js +0 -179
  456. package/dist/src/prompt.d.ts +0 -44
  457. package/dist/src/prompt.js +0 -501
  458. package/dist/src/runtime/headless.d.ts +0 -60
  459. package/dist/src/runtime/headless.js +0 -284
  460. package/dist/src/runtime/parent-death-watchdog.d.ts +0 -42
  461. package/dist/src/runtime/parent-death-watchdog.js +0 -70
  462. package/dist/src/ruvector/agent-wasm.d.ts +0 -228
  463. package/dist/src/ruvector/agent-wasm.js +0 -463
  464. package/dist/src/ruvector/ast-analyzer.d.ts +0 -67
  465. package/dist/src/ruvector/ast-analyzer.js +0 -277
  466. package/dist/src/ruvector/codemods/engine.d.ts +0 -45
  467. package/dist/src/ruvector/codemods/engine.js +0 -291
  468. package/dist/src/ruvector/codemods/scope-analysis.d.ts +0 -29
  469. package/dist/src/ruvector/codemods/scope-analysis.js +0 -162
  470. package/dist/src/ruvector/coverage-router.d.ts +0 -160
  471. package/dist/src/ruvector/coverage-router.js +0 -531
  472. package/dist/src/ruvector/coverage-tools.d.ts +0 -33
  473. package/dist/src/ruvector/coverage-tools.js +0 -157
  474. package/dist/src/ruvector/diff-classifier.d.ts +0 -175
  475. package/dist/src/ruvector/diff-classifier.js +0 -699
  476. package/dist/src/ruvector/diskann-backend.d.ts +0 -78
  477. package/dist/src/ruvector/diskann-backend.js +0 -310
  478. package/dist/src/ruvector/enhanced-model-router.d.ts +0 -172
  479. package/dist/src/ruvector/enhanced-model-router.js +0 -577
  480. package/dist/src/ruvector/graph-analyzer.d.ts +0 -187
  481. package/dist/src/ruvector/graph-analyzer.js +0 -929
  482. package/dist/src/ruvector/graph-backend.d.ts +0 -79
  483. package/dist/src/ruvector/graph-backend.js +0 -220
  484. package/dist/src/ruvector/index.d.ts +0 -38
  485. package/dist/src/ruvector/index.js +0 -86
  486. package/dist/src/ruvector/lora-adapter.d.ts +0 -292
  487. package/dist/src/ruvector/lora-adapter.js +0 -710
  488. package/dist/src/ruvector/model-prices.d.ts +0 -50
  489. package/dist/src/ruvector/model-prices.js +0 -72
  490. package/dist/src/ruvector/model-router.d.ts +0 -408
  491. package/dist/src/ruvector/model-router.js +0 -1162
  492. package/dist/src/ruvector/neural-router.d.ts +0 -182
  493. package/dist/src/ruvector/neural-router.js +0 -825
  494. package/dist/src/ruvector/output-verifier.d.ts +0 -83
  495. package/dist/src/ruvector/output-verifier.js +0 -277
  496. package/dist/src/ruvector/q-learning-router.d.ts +0 -227
  497. package/dist/src/ruvector/q-learning-router.js +0 -721
  498. package/dist/src/ruvector/router-calibrator.d.ts +0 -65
  499. package/dist/src/ruvector/router-calibrator.js +0 -120
  500. package/dist/src/ruvector/router-parallel-recorder.d.ts +0 -127
  501. package/dist/src/ruvector/router-parallel-recorder.js +0 -183
  502. package/dist/src/ruvector/router-trajectory.d.ts +0 -194
  503. package/dist/src/ruvector/router-trajectory.js +0 -281
  504. package/dist/src/ruvector/run-transcript-recorder.d.ts +0 -154
  505. package/dist/src/ruvector/run-transcript-recorder.js +0 -209
  506. package/dist/src/ruvector/ruvllm-wasm.d.ts +0 -179
  507. package/dist/src/ruvector/ruvllm-wasm.js +0 -379
  508. package/dist/src/ruvector/semantic-router.d.ts +0 -77
  509. package/dist/src/ruvector/semantic-router.js +0 -178
  510. package/dist/src/ruvector/task-embedder.d.ts +0 -56
  511. package/dist/src/ruvector/task-embedder.js +0 -237
  512. package/dist/src/ruvector/trajectory-tree.d.ts +0 -113
  513. package/dist/src/ruvector/trajectory-tree.js +0 -237
  514. package/dist/src/ruvector/vector-db.d.ts +0 -73
  515. package/dist/src/ruvector/vector-db.js +0 -301
  516. package/dist/src/ruvector/wasm-embedder.d.ts +0 -13
  517. package/dist/src/ruvector/wasm-embedder.js +0 -143
  518. package/dist/src/security/builtin-aidefence.d.ts +0 -34
  519. package/dist/src/security/builtin-aidefence.js +0 -86
  520. package/dist/src/services/agentic-flow-bridge.d.ts +0 -50
  521. package/dist/src/services/agentic-flow-bridge.js +0 -95
  522. package/dist/src/services/ai-job-dedup.d.ts +0 -61
  523. package/dist/src/services/ai-job-dedup.js +0 -136
  524. package/dist/src/services/checkpoint-gate.d.ts +0 -140
  525. package/dist/src/services/checkpoint-gate.js +0 -223
  526. package/dist/src/services/claim-service.d.ts +0 -204
  527. package/dist/src/services/claim-service.js +0 -818
  528. package/dist/src/services/config-file-manager.d.ts +0 -37
  529. package/dist/src/services/config-file-manager.js +0 -224
  530. package/dist/src/services/container-worker-pool.d.ts +0 -204
  531. package/dist/src/services/container-worker-pool.js +0 -589
  532. package/dist/src/services/daemon-autostart.d.ts +0 -17
  533. package/dist/src/services/daemon-autostart.js +0 -102
  534. package/dist/src/services/distill-oracle.d.ts +0 -190
  535. package/dist/src/services/distill-oracle.js +0 -349
  536. package/dist/src/services/distill-tuning.d.ts +0 -111
  537. package/dist/src/services/distill-tuning.js +0 -510
  538. package/dist/src/services/evolve-proof.d.ts +0 -253
  539. package/dist/src/services/evolve-proof.js +0 -343
  540. package/dist/src/services/fable-harness.d.ts +0 -208
  541. package/dist/src/services/fable-harness.js +0 -388
  542. package/dist/src/services/git-workspace-identity.d.ts +0 -42
  543. package/dist/src/services/git-workspace-identity.js +0 -99
  544. package/dist/src/services/global-ai-budget.d.ts +0 -135
  545. package/dist/src/services/global-ai-budget.js +0 -415
  546. package/dist/src/services/harness-benchmark.d.ts +0 -68
  547. package/dist/src/services/harness-benchmark.js +0 -94
  548. package/dist/src/services/harness-canary.d.ts +0 -60
  549. package/dist/src/services/harness-canary.js +0 -69
  550. package/dist/src/services/harness-corpus-harvester.d.ts +0 -51
  551. package/dist/src/services/harness-corpus-harvester.js +0 -74
  552. package/dist/src/services/harness-flywheel-generations.d.ts +0 -115
  553. package/dist/src/services/harness-flywheel-generations.js +0 -360
  554. package/dist/src/services/harness-flywheel-runtime.d.ts +0 -25
  555. package/dist/src/services/harness-flywheel-runtime.js +0 -92
  556. package/dist/src/services/harness-flywheel.d.ts +0 -48
  557. package/dist/src/services/harness-flywheel.js +0 -207
  558. package/dist/src/services/harness-frozen-eval.d.ts +0 -22
  559. package/dist/src/services/harness-frozen-eval.js +0 -66
  560. package/dist/src/services/harness-hosts.d.ts +0 -40
  561. package/dist/src/services/harness-hosts.js +0 -88
  562. package/dist/src/services/harness-improvement-ledger.d.ts +0 -63
  563. package/dist/src/services/harness-improvement-ledger.js +0 -101
  564. package/dist/src/services/harness-loop.d.ts +0 -53
  565. package/dist/src/services/harness-loop.js +0 -85
  566. package/dist/src/services/harness-qualification.d.ts +0 -66
  567. package/dist/src/services/harness-qualification.js +0 -143
  568. package/dist/src/services/harness-replay.d.ts +0 -37
  569. package/dist/src/services/harness-replay.js +0 -92
  570. package/dist/src/services/harness-verify.d.ts +0 -33
  571. package/dist/src/services/harness-verify.js +0 -26
  572. package/dist/src/services/harness-worker.d.ts +0 -23
  573. package/dist/src/services/harness-worker.js +0 -66
  574. package/dist/src/services/headless-worker-executor.d.ts +0 -358
  575. package/dist/src/services/headless-worker-executor.js +0 -1269
  576. package/dist/src/services/index.d.ts +0 -13
  577. package/dist/src/services/index.js +0 -11
  578. package/dist/src/services/memory-backup.d.ts +0 -53
  579. package/dist/src/services/memory-backup.js +0 -198
  580. package/dist/src/services/memory-distillation.d.ts +0 -41
  581. package/dist/src/services/memory-distillation.js +0 -277
  582. package/dist/src/services/native-training.d.ts +0 -68
  583. package/dist/src/services/native-training.js +0 -141
  584. package/dist/src/services/registry-api.d.ts +0 -58
  585. package/dist/src/services/registry-api.js +0 -146
  586. package/dist/src/services/repo-supervisor.d.ts +0 -70
  587. package/dist/src/services/repo-supervisor.js +0 -228
  588. package/dist/src/services/ruvector-training.d.ts +0 -222
  589. package/dist/src/services/ruvector-training.js +0 -693
  590. package/dist/src/services/swarm-memory-branches.d.ts +0 -135
  591. package/dist/src/services/swarm-memory-branches.js +0 -213
  592. package/dist/src/services/weight-eft.d.ts +0 -305
  593. package/dist/src/services/weight-eft.js +0 -296
  594. package/dist/src/services/worker-daemon.d.ts +0 -439
  595. package/dist/src/services/worker-daemon.js +0 -1865
  596. package/dist/src/services/worker-queue.d.ts +0 -194
  597. package/dist/src/services/worker-queue.js +0 -513
  598. package/dist/src/services/workspace-lease.d.ts +0 -55
  599. package/dist/src/services/workspace-lease.js +0 -191
  600. package/dist/src/suggest.d.ts +0 -53
  601. package/dist/src/suggest.js +0 -200
  602. package/dist/src/transfer/anonymization/index.d.ts +0 -25
  603. package/dist/src/transfer/anonymization/index.js +0 -175
  604. package/dist/src/transfer/deploy-seraphine.d.ts +0 -13
  605. package/dist/src/transfer/deploy-seraphine.js +0 -205
  606. package/dist/src/transfer/export.d.ts +0 -25
  607. package/dist/src/transfer/export.js +0 -113
  608. package/dist/src/transfer/index.d.ts +0 -12
  609. package/dist/src/transfer/index.js +0 -31
  610. package/dist/src/transfer/ipfs/client.d.ts +0 -109
  611. package/dist/src/transfer/ipfs/client.js +0 -307
  612. package/dist/src/transfer/ipfs/upload.d.ts +0 -95
  613. package/dist/src/transfer/ipfs/upload.js +0 -413
  614. package/dist/src/transfer/models/seraphine.d.ts +0 -72
  615. package/dist/src/transfer/models/seraphine.js +0 -373
  616. package/dist/src/transfer/serialization/cfp.d.ts +0 -49
  617. package/dist/src/transfer/serialization/cfp.js +0 -183
  618. package/dist/src/transfer/storage/gcs.d.ts +0 -82
  619. package/dist/src/transfer/storage/gcs.js +0 -272
  620. package/dist/src/transfer/storage/index.d.ts +0 -6
  621. package/dist/src/transfer/storage/index.js +0 -6
  622. package/dist/src/transfer/store/discovery.d.ts +0 -84
  623. package/dist/src/transfer/store/discovery.js +0 -382
  624. package/dist/src/transfer/store/download.d.ts +0 -70
  625. package/dist/src/transfer/store/download.js +0 -334
  626. package/dist/src/transfer/store/index.d.ts +0 -84
  627. package/dist/src/transfer/store/index.js +0 -153
  628. package/dist/src/transfer/store/publish.d.ts +0 -76
  629. package/dist/src/transfer/store/publish.js +0 -294
  630. package/dist/src/transfer/store/registry.d.ts +0 -58
  631. package/dist/src/transfer/store/registry.js +0 -285
  632. package/dist/src/transfer/store/search.d.ts +0 -54
  633. package/dist/src/transfer/store/search.js +0 -232
  634. package/dist/src/transfer/store/tests/standalone-test.d.ts +0 -12
  635. package/dist/src/transfer/store/tests/standalone-test.js +0 -190
  636. package/dist/src/transfer/store/types.d.ts +0 -193
  637. package/dist/src/transfer/store/types.js +0 -6
  638. package/dist/src/transfer/test-seraphine.d.ts +0 -6
  639. package/dist/src/transfer/test-seraphine.js +0 -105
  640. package/dist/src/transfer/tests/test-store.d.ts +0 -7
  641. package/dist/src/transfer/tests/test-store.js +0 -214
  642. package/dist/src/transfer/types.d.ts +0 -245
  643. package/dist/src/transfer/types.js +0 -6
  644. package/dist/src/types.d.ts +0 -13
  645. package/dist/src/types.js +0 -13
  646. package/dist/src/update/checker.d.ts +0 -34
  647. package/dist/src/update/checker.js +0 -191
  648. package/dist/src/update/executor.d.ts +0 -33
  649. package/dist/src/update/executor.js +0 -217
  650. package/dist/src/update/index.d.ts +0 -33
  651. package/dist/src/update/index.js +0 -64
  652. package/dist/src/update/rate-limiter.d.ts +0 -20
  653. package/dist/src/update/rate-limiter.js +0 -96
  654. package/dist/src/update/validator.d.ts +0 -17
  655. package/dist/src/update/validator.js +0 -123
@@ -1,1596 +0,0 @@
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