kynjal-cli 4.0.0 → 4.0.2

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 (502) hide show
  1. package/dist/src/appliance/gguf-engine.d.ts +91 -0
  2. package/dist/src/appliance/gguf-engine.d.ts.map +1 -0
  3. package/dist/src/appliance/gguf-engine.js +286 -525
  4. package/dist/src/appliance/gguf-engine.js.map +1 -1
  5. package/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
  6. package/dist/src/appliance/ruvllm-bridge.d.ts.map +1 -0
  7. package/dist/src/appliance/ruvllm-bridge.js +203 -403
  8. package/dist/src/appliance/ruvllm-bridge.js.map +1 -1
  9. package/dist/src/appliance/rvfa-builder.d.ts +44 -0
  10. package/dist/src/appliance/rvfa-builder.d.ts.map +1 -0
  11. package/dist/src/appliance/rvfa-builder.js +154 -208
  12. package/dist/src/appliance/rvfa-builder.js.map +1 -1
  13. package/dist/src/appliance/rvfa-distribution.d.ts +97 -0
  14. package/dist/src/appliance/rvfa-distribution.d.ts.map +1 -0
  15. package/dist/src/appliance/rvfa-distribution.js +260 -423
  16. package/dist/src/appliance/rvfa-distribution.js.map +1 -1
  17. package/dist/src/appliance/rvfa-format.d.ts +111 -0
  18. package/dist/src/appliance/rvfa-format.d.ts.map +1 -0
  19. package/dist/src/appliance/rvfa-format.js +128 -200
  20. package/dist/src/appliance/rvfa-format.js.map +1 -1
  21. package/dist/src/appliance/rvfa-runner.d.ts +69 -0
  22. package/dist/src/appliance/rvfa-runner.d.ts.map +1 -0
  23. package/dist/src/appliance/rvfa-runner.js +168 -304
  24. package/dist/src/appliance/rvfa-runner.js.map +1 -1
  25. package/dist/src/appliance/rvfa-signing.d.ts +123 -0
  26. package/dist/src/appliance/rvfa-signing.d.ts.map +1 -0
  27. package/dist/src/appliance/rvfa-signing.js +173 -295
  28. package/dist/src/appliance/rvfa-signing.js.map +1 -1
  29. package/dist/src/benchmarks/pretrain/index.d.ts +58 -0
  30. package/dist/src/benchmarks/pretrain/index.d.ts.map +1 -0
  31. package/dist/src/benchmarks/pretrain/index.js +331 -542
  32. package/dist/src/benchmarks/pretrain/index.js.map +1 -1
  33. package/dist/src/commands/agent.js +574 -697
  34. package/dist/src/commands/agent.js.map +1 -1
  35. package/dist/src/commands/analyze.js +1218 -1548
  36. package/dist/src/commands/analyze.js.map +1 -1
  37. package/dist/src/commands/appliance-advanced.js +158 -267
  38. package/dist/src/commands/appliance-advanced.js.map +1 -1
  39. package/dist/src/commands/appliance.js +318 -493
  40. package/dist/src/commands/appliance.js.map +1 -1
  41. package/dist/src/commands/benchmark.js +372 -523
  42. package/dist/src/commands/benchmark.js.map +1 -1
  43. package/dist/src/commands/claims.js +274 -364
  44. package/dist/src/commands/claims.js.map +1 -1
  45. package/dist/src/commands/cleanup.js +113 -157
  46. package/dist/src/commands/cleanup.js.map +1 -1
  47. package/dist/src/commands/completions.js +477 -118
  48. package/dist/src/commands/completions.js.map +1 -1
  49. package/dist/src/commands/config.js +237 -303
  50. package/dist/src/commands/config.js.map +1 -1
  51. package/dist/src/commands/daemon.js +487 -596
  52. package/dist/src/commands/daemon.js.map +1 -1
  53. package/dist/src/commands/deployment.js +194 -275
  54. package/dist/src/commands/deployment.js.map +1 -1
  55. package/dist/src/commands/doctor.js +504 -686
  56. package/dist/src/commands/doctor.js.map +1 -1
  57. package/dist/src/commands/embeddings.js +1293 -1543
  58. package/dist/src/commands/embeddings.js.map +1 -1
  59. package/dist/src/commands/guidance.js +449 -596
  60. package/dist/src/commands/guidance.js.map +1 -1
  61. package/dist/src/commands/hive-mind.js +854 -938
  62. package/dist/src/commands/hive-mind.js.map +1 -1
  63. package/dist/src/commands/hooks.js +3112 -3519
  64. package/dist/src/commands/hooks.js.map +1 -1
  65. package/dist/src/commands/index.d.ts +115 -0
  66. package/dist/src/commands/index.d.ts.map +1 -0
  67. package/dist/src/commands/index.js +126 -308
  68. package/dist/src/commands/index.js.map +1 -1
  69. package/dist/src/commands/init.js +788 -940
  70. package/dist/src/commands/init.js.map +1 -1
  71. package/dist/src/commands/issues.js +383 -558
  72. package/dist/src/commands/issues.js.map +1 -1
  73. package/dist/src/commands/mcp.js +493 -605
  74. package/dist/src/commands/mcp.js.map +1 -1
  75. package/dist/src/commands/memory.js +833 -1026
  76. package/dist/src/commands/memory.js.map +1 -1
  77. package/dist/src/commands/migrate.js +282 -347
  78. package/dist/src/commands/migrate.js.map +1 -1
  79. package/dist/src/commands/neural.js +1289 -1563
  80. package/dist/src/commands/neural.js.map +1 -1
  81. package/dist/src/commands/performance.js +497 -643
  82. package/dist/src/commands/performance.js.map +1 -1
  83. package/dist/src/commands/plugins.js +668 -841
  84. package/dist/src/commands/plugins.js.map +1 -1
  85. package/dist/src/commands/process.js +392 -447
  86. package/dist/src/commands/process.js.map +1 -1
  87. package/dist/src/commands/progress.js +162 -256
  88. package/dist/src/commands/progress.js.map +1 -1
  89. package/dist/src/commands/providers.js +150 -220
  90. package/dist/src/commands/providers.js.map +1 -1
  91. package/dist/src/commands/route.js +520 -665
  92. package/dist/src/commands/route.js.map +1 -1
  93. package/dist/src/commands/ruvector/backup.js +505 -651
  94. package/dist/src/commands/ruvector/backup.js.map +1 -1
  95. package/dist/src/commands/ruvector/benchmark.js +349 -401
  96. package/dist/src/commands/ruvector/benchmark.js.map +1 -1
  97. package/dist/src/commands/ruvector/import.js +224 -266
  98. package/dist/src/commands/ruvector/import.js.map +1 -1
  99. package/dist/src/commands/ruvector/index.js +37 -75
  100. package/dist/src/commands/ruvector/index.js.map +1 -1
  101. package/dist/src/commands/ruvector/init.js +336 -359
  102. package/dist/src/commands/ruvector/init.js.map +1 -1
  103. package/dist/src/commands/ruvector/migrate.js +335 -322
  104. package/dist/src/commands/ruvector/migrate.js.map +1 -1
  105. package/dist/src/commands/ruvector/optimize.js +375 -431
  106. package/dist/src/commands/ruvector/optimize.js.map +1 -1
  107. package/dist/src/commands/ruvector/setup.js +703 -117
  108. package/dist/src/commands/ruvector/setup.js.map +1 -1
  109. package/dist/src/commands/ruvector/status.js +364 -419
  110. package/dist/src/commands/ruvector/status.js.map +1 -1
  111. package/dist/src/commands/security.js +485 -608
  112. package/dist/src/commands/security.js.map +1 -1
  113. package/dist/src/commands/session.js +504 -626
  114. package/dist/src/commands/session.js.map +1 -1
  115. package/dist/src/commands/start.js +267 -364
  116. package/dist/src/commands/start.js.map +1 -1
  117. package/dist/src/commands/status.js +380 -486
  118. package/dist/src/commands/status.js.map +1 -1
  119. package/dist/src/commands/swarm.js +408 -488
  120. package/dist/src/commands/swarm.js.map +1 -1
  121. package/dist/src/commands/task.js +423 -538
  122. package/dist/src/commands/task.js.map +1 -1
  123. package/dist/src/commands/transfer-store.js +322 -412
  124. package/dist/src/commands/transfer-store.js.map +1 -1
  125. package/dist/src/commands/update.js +196 -291
  126. package/dist/src/commands/update.js.map +1 -1
  127. package/dist/src/commands/workflow.js +386 -486
  128. package/dist/src/commands/workflow.js.map +1 -1
  129. package/dist/src/config-adapter.d.ts +15 -0
  130. package/dist/src/config-adapter.d.ts.map +1 -0
  131. package/dist/src/config-adapter.js +38 -39
  132. package/dist/src/config-adapter.js.map +1 -1
  133. package/dist/src/index.d.ts +77 -0
  134. package/dist/src/index.d.ts.map +1 -0
  135. package/dist/src/index.js +309 -411
  136. package/dist/src/index.js.map +1 -1
  137. package/dist/src/infrastructure/in-memory-repositories.d.ts +68 -0
  138. package/dist/src/infrastructure/in-memory-repositories.d.ts.map +1 -0
  139. package/dist/src/infrastructure/in-memory-repositories.js +246 -507
  140. package/dist/src/infrastructure/in-memory-repositories.js.map +1 -1
  141. package/dist/src/init/claudemd-generator.d.ts +25 -0
  142. package/dist/src/init/claudemd-generator.d.ts.map +1 -0
  143. package/dist/src/init/claudemd-generator.js +368 -78
  144. package/dist/src/init/claudemd-generator.js.map +1 -1
  145. package/dist/src/init/executor.d.ts +41 -0
  146. package/dist/src/init/executor.d.ts.map +1 -0
  147. package/dist/src/init/executor.js +1307 -996
  148. package/dist/src/init/executor.js.map +1 -1
  149. package/dist/src/init/helpers-generator.d.ts +60 -0
  150. package/dist/src/init/helpers-generator.d.ts.map +1 -0
  151. package/dist/src/init/helpers-generator.js +657 -12
  152. package/dist/src/init/helpers-generator.js.map +1 -1
  153. package/dist/src/init/index.d.ts +1 -1
  154. package/dist/src/init/index.d.ts.map +1 -1
  155. package/dist/src/init/index.js +1 -1
  156. package/dist/src/init/index.js.map +1 -1
  157. package/dist/src/init/mcp-generator.js +33 -37
  158. package/dist/src/init/mcp-generator.js.map +1 -1
  159. package/dist/src/init/settings-generator.js +76 -77
  160. package/dist/src/init/settings-generator.js.map +1 -1
  161. package/dist/src/init/statusline-generator.js +801 -3
  162. package/dist/src/init/statusline-generator.js.map +1 -1
  163. package/dist/src/init/types.d.ts +1 -1
  164. package/dist/src/init/types.d.ts.map +1 -1
  165. package/dist/src/init/types.js +76 -59
  166. package/dist/src/init/types.js.map +1 -1
  167. package/dist/src/mcp-client.d.ts +92 -0
  168. package/dist/src/mcp-client.d.ts.map +1 -0
  169. package/dist/src/mcp-client.js +81 -125
  170. package/dist/src/mcp-client.js.map +1 -1
  171. package/dist/src/mcp-server.d.ts +161 -0
  172. package/dist/src/mcp-server.d.ts.map +1 -0
  173. package/dist/src/mcp-server.js +470 -757
  174. package/dist/src/mcp-server.js.map +1 -1
  175. package/dist/src/mcp-tools/agent-tools.js +391 -492
  176. package/dist/src/mcp-tools/agent-tools.js.map +1 -1
  177. package/dist/src/mcp-tools/agentdb-tools.js +332 -533
  178. package/dist/src/mcp-tools/agentdb-tools.js.map +1 -1
  179. package/dist/src/mcp-tools/analyze-tools.js +172 -236
  180. package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
  181. package/dist/src/mcp-tools/auto-install.d.ts +83 -0
  182. package/dist/src/mcp-tools/auto-install.d.ts.map +1 -0
  183. package/dist/src/mcp-tools/auto-install.js +80 -142
  184. package/dist/src/mcp-tools/auto-install.js.map +1 -1
  185. package/dist/src/mcp-tools/browser-tools.js +252 -375
  186. package/dist/src/mcp-tools/browser-tools.js.map +1 -1
  187. package/dist/src/mcp-tools/claims-tools.js +473 -565
  188. package/dist/src/mcp-tools/claims-tools.js.map +1 -1
  189. package/dist/src/mcp-tools/config-tools.js +197 -272
  190. package/dist/src/mcp-tools/config-tools.js.map +1 -1
  191. package/dist/src/mcp-tools/coordination-tools.js +500 -572
  192. package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
  193. package/dist/src/mcp-tools/daa-tools.js +286 -364
  194. package/dist/src/mcp-tools/daa-tools.js.map +1 -1
  195. package/dist/src/mcp-tools/embeddings-tools.js +582 -693
  196. package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
  197. package/dist/src/mcp-tools/github-tools.js +260 -311
  198. package/dist/src/mcp-tools/github-tools.js.map +1 -1
  199. package/dist/src/mcp-tools/hive-mind-tools.js +573 -640
  200. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
  201. package/dist/src/mcp-tools/hooks-tools.js +2215 -2648
  202. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  203. package/dist/src/mcp-tools/memory-tools.js +350 -505
  204. package/dist/src/mcp-tools/memory-tools.js.map +1 -1
  205. package/dist/src/mcp-tools/neural-tools.js +315 -412
  206. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  207. package/dist/src/mcp-tools/performance-tools.js +420 -480
  208. package/dist/src/mcp-tools/performance-tools.js.map +1 -1
  209. package/dist/src/mcp-tools/progress-tools.js +204 -278
  210. package/dist/src/mcp-tools/progress-tools.js.map +1 -1
  211. package/dist/src/mcp-tools/ruvllm-tools.js +163 -279
  212. package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -1
  213. package/dist/src/mcp-tools/security-tools.js +297 -429
  214. package/dist/src/mcp-tools/security-tools.js.map +1 -1
  215. package/dist/src/mcp-tools/session-tools.js +185 -234
  216. package/dist/src/mcp-tools/session-tools.js.map +1 -1
  217. package/dist/src/mcp-tools/swarm-tools.js +207 -260
  218. package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
  219. package/dist/src/mcp-tools/system-tools.js +276 -325
  220. package/dist/src/mcp-tools/system-tools.js.map +1 -1
  221. package/dist/src/mcp-tools/task-tools.js +270 -336
  222. package/dist/src/mcp-tools/task-tools.js.map +1 -1
  223. package/dist/src/mcp-tools/terminal-tools.js +148 -196
  224. package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
  225. package/dist/src/mcp-tools/transfer-tools.js +186 -333
  226. package/dist/src/mcp-tools/transfer-tools.js.map +1 -1
  227. package/dist/src/mcp-tools/types.d.ts +31 -0
  228. package/dist/src/mcp-tools/types.d.ts.map +1 -0
  229. package/dist/src/mcp-tools/wasm-agent-tools.js +133 -280
  230. package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -1
  231. package/dist/src/mcp-tools/workflow-tools.js +405 -450
  232. package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
  233. package/dist/src/memory/ewc-consolidation.d.ts +295 -0
  234. package/dist/src/memory/ewc-consolidation.d.ts.map +1 -0
  235. package/dist/src/memory/ewc-consolidation.js +190 -303
  236. package/dist/src/memory/ewc-consolidation.js.map +1 -1
  237. package/dist/src/memory/intelligence.d.ts +338 -0
  238. package/dist/src/memory/intelligence.d.ts.map +1 -0
  239. package/dist/src/memory/intelligence.js +569 -794
  240. package/dist/src/memory/intelligence.js.map +1 -1
  241. package/dist/src/memory/memory-bridge.d.ts +407 -0
  242. package/dist/src/memory/memory-bridge.d.ts.map +1 -0
  243. package/dist/src/memory/memory-bridge.js +1170 -1640
  244. package/dist/src/memory/memory-bridge.js.map +1 -1
  245. package/dist/src/memory/memory-initializer.d.ts +412 -0
  246. package/dist/src/memory/memory-initializer.d.ts.map +1 -0
  247. package/dist/src/memory/memory-initializer.js +1836 -1851
  248. package/dist/src/memory/memory-initializer.js.map +1 -1
  249. package/dist/src/memory/sona-optimizer.d.ts +227 -0
  250. package/dist/src/memory/sona-optimizer.d.ts.map +1 -0
  251. package/dist/src/memory/sona-optimizer.js +199 -329
  252. package/dist/src/memory/sona-optimizer.js.map +1 -1
  253. package/dist/src/output.d.ts +2 -2
  254. package/dist/src/output.d.ts.map +1 -1
  255. package/dist/src/output.js +242 -272
  256. package/dist/src/output.js.map +1 -1
  257. package/dist/src/parser.d.ts +51 -0
  258. package/dist/src/parser.d.ts.map +1 -0
  259. package/dist/src/parser.js +140 -187
  260. package/dist/src/parser.js.map +1 -1
  261. package/dist/src/plugins/manager.d.ts +133 -0
  262. package/dist/src/plugins/manager.d.ts.map +1 -0
  263. package/dist/src/plugins/manager.js +285 -521
  264. package/dist/src/plugins/manager.js.map +1 -1
  265. package/dist/src/plugins/store/discovery.d.ts +88 -0
  266. package/dist/src/plugins/store/discovery.d.ts.map +1 -0
  267. package/dist/src/plugins/store/discovery.js +271 -358
  268. package/dist/src/plugins/store/discovery.js.map +1 -1
  269. package/dist/src/plugins/store/index.d.ts +76 -0
  270. package/dist/src/plugins/store/index.d.ts.map +1 -0
  271. package/dist/src/plugins/store/index.js +48 -105
  272. package/dist/src/plugins/store/index.js.map +1 -1
  273. package/dist/src/plugins/store/search.d.ts +46 -0
  274. package/dist/src/plugins/store/search.d.ts.map +1 -0
  275. package/dist/src/plugins/store/search.js +69 -107
  276. package/dist/src/plugins/store/search.js.map +1 -1
  277. package/dist/src/plugins/store/types.d.ts +274 -0
  278. package/dist/src/plugins/store/types.d.ts.map +1 -0
  279. package/dist/src/plugins/tests/demo-plugin-store.js +113 -160
  280. package/dist/src/plugins/tests/demo-plugin-store.js.map +1 -1
  281. package/dist/src/plugins/tests/standalone-test.js +172 -223
  282. package/dist/src/plugins/tests/standalone-test.js.map +1 -1
  283. package/dist/src/plugins/tests/test-plugin-store.js +190 -228
  284. package/dist/src/plugins/tests/test-plugin-store.js.map +1 -1
  285. package/dist/src/production/circuit-breaker.d.ts +101 -0
  286. package/dist/src/production/circuit-breaker.d.ts.map +1 -0
  287. package/dist/src/production/circuit-breaker.js +62 -126
  288. package/dist/src/production/circuit-breaker.js.map +1 -1
  289. package/dist/src/production/error-handler.d.ts +92 -0
  290. package/dist/src/production/error-handler.d.ts.map +1 -0
  291. package/dist/src/production/error-handler.js +86 -156
  292. package/dist/src/production/error-handler.js.map +1 -1
  293. package/dist/src/production/monitoring.d.ts +161 -0
  294. package/dist/src/production/monitoring.d.ts.map +1 -0
  295. package/dist/src/production/monitoring.js +139 -220
  296. package/dist/src/production/monitoring.js.map +1 -1
  297. package/dist/src/production/rate-limiter.d.ts +80 -0
  298. package/dist/src/production/rate-limiter.d.ts.map +1 -0
  299. package/dist/src/production/rate-limiter.js +74 -93
  300. package/dist/src/production/rate-limiter.js.map +1 -1
  301. package/dist/src/production/retry.d.ts +48 -0
  302. package/dist/src/production/retry.d.ts.map +1 -0
  303. package/dist/src/production/retry.js +75 -167
  304. package/dist/src/production/retry.js.map +1 -1
  305. package/dist/src/prompt.d.ts +44 -0
  306. package/dist/src/prompt.d.ts.map +1 -0
  307. package/dist/src/prompt.js +436 -560
  308. package/dist/src/prompt.js.map +1 -1
  309. package/dist/src/runtime/headless.d.ts +60 -0
  310. package/dist/src/runtime/headless.d.ts.map +1 -0
  311. package/dist/src/runtime/headless.js +197 -286
  312. package/dist/src/runtime/headless.js.map +1 -1
  313. package/dist/src/ruvector/agent-wasm.d.ts +182 -0
  314. package/dist/src/ruvector/agent-wasm.d.ts.map +1 -0
  315. package/dist/src/ruvector/agent-wasm.js +156 -351
  316. package/dist/src/ruvector/agent-wasm.js.map +1 -1
  317. package/dist/src/ruvector/ast-analyzer.d.ts +67 -0
  318. package/dist/src/ruvector/ast-analyzer.d.ts.map +1 -0
  319. package/dist/src/ruvector/ast-analyzer.js +145 -232
  320. package/dist/src/ruvector/ast-analyzer.js.map +1 -1
  321. package/dist/src/ruvector/coverage-router.d.ts +160 -0
  322. package/dist/src/ruvector/coverage-router.d.ts.map +1 -0
  323. package/dist/src/ruvector/coverage-router.js +287 -419
  324. package/dist/src/ruvector/coverage-router.js.map +1 -1
  325. package/dist/src/ruvector/coverage-tools.js +56 -101
  326. package/dist/src/ruvector/coverage-tools.js.map +1 -1
  327. package/dist/src/ruvector/diff-classifier.d.ts +175 -0
  328. package/dist/src/ruvector/diff-classifier.d.ts.map +1 -0
  329. package/dist/src/ruvector/diff-classifier.js +324 -451
  330. package/dist/src/ruvector/diff-classifier.js.map +1 -1
  331. package/dist/src/ruvector/enhanced-model-router.d.ts +146 -0
  332. package/dist/src/ruvector/enhanced-model-router.d.ts.map +1 -0
  333. package/dist/src/ruvector/enhanced-model-router.js +260 -336
  334. package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
  335. package/dist/src/ruvector/flash-attention.d.ts +195 -0
  336. package/dist/src/ruvector/flash-attention.d.ts.map +1 -0
  337. package/dist/src/ruvector/flash-attention.js +223 -254
  338. package/dist/src/ruvector/flash-attention.js.map +1 -1
  339. package/dist/src/ruvector/graph-analyzer.d.ts +187 -0
  340. package/dist/src/ruvector/graph-analyzer.d.ts.map +1 -0
  341. package/dist/src/ruvector/graph-analyzer.js +486 -680
  342. package/dist/src/ruvector/graph-analyzer.js.map +1 -1
  343. package/dist/src/ruvector/index.d.ts +40 -0
  344. package/dist/src/ruvector/index.d.ts.map +1 -0
  345. package/dist/src/ruvector/index.js +36 -106
  346. package/dist/src/ruvector/index.js.map +1 -1
  347. package/dist/src/ruvector/lora-adapter.d.ts +218 -0
  348. package/dist/src/ruvector/lora-adapter.d.ts.map +1 -0
  349. package/dist/src/ruvector/lora-adapter.js +155 -248
  350. package/dist/src/ruvector/lora-adapter.js.map +1 -1
  351. package/dist/src/ruvector/model-router.d.ts +220 -0
  352. package/dist/src/ruvector/model-router.d.ts.map +1 -0
  353. package/dist/src/ruvector/model-router.js +175 -248
  354. package/dist/src/ruvector/model-router.js.map +1 -1
  355. package/dist/src/ruvector/moe-router.d.ts +206 -0
  356. package/dist/src/ruvector/moe-router.d.ts.map +1 -0
  357. package/dist/src/ruvector/moe-router.js +228 -286
  358. package/dist/src/ruvector/moe-router.js.map +1 -1
  359. package/dist/src/ruvector/q-learning-router.d.ts +211 -0
  360. package/dist/src/ruvector/q-learning-router.d.ts.map +1 -0
  361. package/dist/src/ruvector/q-learning-router.js +257 -338
  362. package/dist/src/ruvector/q-learning-router.js.map +1 -1
  363. package/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
  364. package/dist/src/ruvector/ruvllm-wasm.d.ts.map +1 -0
  365. package/dist/src/ruvector/ruvllm-wasm.js +270 -434
  366. package/dist/src/ruvector/ruvllm-wasm.js.map +1 -1
  367. package/dist/src/ruvector/semantic-router.d.ts +77 -0
  368. package/dist/src/ruvector/semantic-router.d.ts.map +1 -0
  369. package/dist/src/ruvector/semantic-router.js +60 -67
  370. package/dist/src/ruvector/semantic-router.js.map +1 -1
  371. package/dist/src/ruvector/vector-db.d.ts +69 -0
  372. package/dist/src/ruvector/vector-db.d.ts.map +1 -0
  373. package/dist/src/ruvector/vector-db.js +119 -205
  374. package/dist/src/ruvector/vector-db.js.map +1 -1
  375. package/dist/src/services/agentic-flow-bridge.d.ts +50 -0
  376. package/dist/src/services/agentic-flow-bridge.d.ts.map +1 -0
  377. package/dist/src/services/agentic-flow-bridge.js +32 -105
  378. package/dist/src/services/agentic-flow-bridge.js.map +1 -1
  379. package/dist/src/services/claim-service.d.ts +204 -0
  380. package/dist/src/services/claim-service.d.ts.map +1 -0
  381. package/dist/src/services/claim-service.js +615 -940
  382. package/dist/src/services/claim-service.js.map +1 -1
  383. package/dist/src/services/container-worker-pool.d.ts +197 -0
  384. package/dist/src/services/container-worker-pool.d.ts.map +1 -0
  385. package/dist/src/services/container-worker-pool.js +398 -666
  386. package/dist/src/services/container-worker-pool.js.map +1 -1
  387. package/dist/src/services/headless-worker-executor.d.ts +304 -0
  388. package/dist/src/services/headless-worker-executor.d.ts.map +1 -0
  389. package/dist/src/services/headless-worker-executor.js +441 -467
  390. package/dist/src/services/headless-worker-executor.js.map +1 -1
  391. package/dist/src/services/index.d.ts +4 -4
  392. package/dist/src/services/index.d.ts.map +1 -1
  393. package/dist/src/services/index.js +4 -4
  394. package/dist/src/services/index.js.map +1 -1
  395. package/dist/src/services/registry-api.d.ts +58 -0
  396. package/dist/src/services/registry-api.d.ts.map +1 -0
  397. package/dist/src/services/registry-api.js +92 -200
  398. package/dist/src/services/registry-api.js.map +1 -1
  399. package/dist/src/services/ruvector-training.d.ts +222 -0
  400. package/dist/src/services/ruvector-training.d.ts.map +1 -0
  401. package/dist/src/services/ruvector-training.js +257 -337
  402. package/dist/src/services/ruvector-training.js.map +1 -1
  403. package/dist/src/services/worker-daemon.d.ts +228 -0
  404. package/dist/src/services/worker-daemon.d.ts.map +1 -0
  405. package/dist/src/services/worker-daemon.js +591 -849
  406. package/dist/src/services/worker-daemon.js.map +1 -1
  407. package/dist/src/services/worker-queue.d.ts +194 -0
  408. package/dist/src/services/worker-queue.d.ts.map +1 -0
  409. package/dist/src/services/worker-queue.js +331 -548
  410. package/dist/src/services/worker-queue.js.map +1 -1
  411. package/dist/src/suggest.d.ts +53 -0
  412. package/dist/src/suggest.d.ts.map +1 -0
  413. package/dist/src/suggest.js +45 -55
  414. package/dist/src/suggest.js.map +1 -1
  415. package/dist/src/transfer/anonymization/index.js +29 -37
  416. package/dist/src/transfer/anonymization/index.js.map +1 -1
  417. package/dist/src/transfer/deploy-seraphine.js +128 -155
  418. package/dist/src/transfer/deploy-seraphine.js.map +1 -1
  419. package/dist/src/transfer/export.d.ts +25 -0
  420. package/dist/src/transfer/export.d.ts.map +1 -0
  421. package/dist/src/transfer/export.js +84 -142
  422. package/dist/src/transfer/export.js.map +1 -1
  423. package/dist/src/transfer/index.d.ts +1 -1
  424. package/dist/src/transfer/index.d.ts.map +1 -1
  425. package/dist/src/transfer/index.js +0 -2
  426. package/dist/src/transfer/index.js.map +1 -1
  427. package/dist/src/transfer/ipfs/client.d.ts +109 -0
  428. package/dist/src/transfer/ipfs/client.d.ts.map +1 -0
  429. package/dist/src/transfer/ipfs/client.js +187 -337
  430. package/dist/src/transfer/ipfs/client.js.map +1 -1
  431. package/dist/src/transfer/ipfs/upload.d.ts +95 -0
  432. package/dist/src/transfer/ipfs/upload.d.ts.map +1 -0
  433. package/dist/src/transfer/ipfs/upload.js +288 -434
  434. package/dist/src/transfer/ipfs/upload.js.map +1 -1
  435. package/dist/src/transfer/models/seraphine.d.ts +72 -0
  436. package/dist/src/transfer/models/seraphine.d.ts.map +1 -0
  437. package/dist/src/transfer/models/seraphine.js +55 -55
  438. package/dist/src/transfer/models/seraphine.js.map +1 -1
  439. package/dist/src/transfer/serialization/cfp.d.ts +49 -0
  440. package/dist/src/transfer/serialization/cfp.d.ts.map +1 -0
  441. package/dist/src/transfer/serialization/cfp.js +30 -31
  442. package/dist/src/transfer/serialization/cfp.js.map +1 -1
  443. package/dist/src/transfer/storage/gcs.d.ts +82 -0
  444. package/dist/src/transfer/storage/gcs.d.ts.map +1 -0
  445. package/dist/src/transfer/storage/gcs.js +165 -232
  446. package/dist/src/transfer/storage/gcs.js.map +1 -1
  447. package/dist/src/transfer/store/discovery.d.ts +84 -0
  448. package/dist/src/transfer/store/discovery.d.ts.map +1 -0
  449. package/dist/src/transfer/store/discovery.js +239 -349
  450. package/dist/src/transfer/store/discovery.js.map +1 -1
  451. package/dist/src/transfer/store/download.d.ts +70 -0
  452. package/dist/src/transfer/store/download.d.ts.map +1 -0
  453. package/dist/src/transfer/store/download.js +243 -365
  454. package/dist/src/transfer/store/download.js.map +1 -1
  455. package/dist/src/transfer/store/index.d.ts +84 -0
  456. package/dist/src/transfer/store/index.d.ts.map +1 -0
  457. package/dist/src/transfer/store/index.js +63 -130
  458. package/dist/src/transfer/store/index.js.map +1 -1
  459. package/dist/src/transfer/store/publish.d.ts +76 -0
  460. package/dist/src/transfer/store/publish.d.ts.map +1 -0
  461. package/dist/src/transfer/store/publish.js +184 -258
  462. package/dist/src/transfer/store/publish.js.map +1 -1
  463. package/dist/src/transfer/store/registry.js +50 -72
  464. package/dist/src/transfer/store/registry.js.map +1 -1
  465. package/dist/src/transfer/store/search.d.ts +54 -0
  466. package/dist/src/transfer/store/search.d.ts.map +1 -0
  467. package/dist/src/transfer/store/search.js +64 -96
  468. package/dist/src/transfer/store/search.js.map +1 -1
  469. package/dist/src/transfer/store/tests/standalone-test.js +174 -231
  470. package/dist/src/transfer/store/tests/standalone-test.js.map +1 -1
  471. package/dist/src/transfer/test-seraphine.js +95 -130
  472. package/dist/src/transfer/test-seraphine.js.map +1 -1
  473. package/dist/src/transfer/tests/test-store.js +194 -239
  474. package/dist/src/transfer/tests/test-store.js.map +1 -1
  475. package/dist/src/transfer/types.d.ts +245 -0
  476. package/dist/src/transfer/types.d.ts.map +1 -0
  477. package/dist/src/types.d.ts +198 -0
  478. package/dist/src/types.d.ts.map +1 -0
  479. package/dist/src/types.js +26 -55
  480. package/dist/src/types.js.map +1 -1
  481. package/dist/src/update/checker.d.ts +34 -0
  482. package/dist/src/update/checker.d.ts.map +1 -0
  483. package/dist/src/update/checker.js +106 -183
  484. package/dist/src/update/checker.js.map +1 -1
  485. package/dist/src/update/executor.d.ts +32 -0
  486. package/dist/src/update/executor.d.ts.map +1 -0
  487. package/dist/src/update/executor.js +135 -198
  488. package/dist/src/update/executor.js.map +1 -1
  489. package/dist/src/update/index.d.ts +33 -0
  490. package/dist/src/update/index.d.ts.map +1 -0
  491. package/dist/src/update/index.js +38 -85
  492. package/dist/src/update/index.js.map +1 -1
  493. package/dist/src/update/rate-limiter.d.ts +20 -0
  494. package/dist/src/update/rate-limiter.d.ts.map +1 -0
  495. package/dist/src/update/rate-limiter.js +19 -31
  496. package/dist/src/update/rate-limiter.js.map +1 -1
  497. package/dist/src/update/validator.d.ts +17 -0
  498. package/dist/src/update/validator.d.ts.map +1 -0
  499. package/dist/src/update/validator.js +38 -64
  500. package/dist/src/update/validator.js.map +1 -1
  501. package/dist/tsconfig.tsbuildinfo +1 -1
  502. package/package.json +1 -1
@@ -2,42 +2,6 @@
2
2
  * V3 CLI RuVector Benchmark Command
3
3
  * Performance benchmarking for RuVector PostgreSQL Bridge
4
4
  */
5
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
6
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
7
- return new (P || (P = Promise))(function (resolve, reject) {
8
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
9
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
10
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
11
- step((generator = generator.apply(thisArg, _arguments || [])).next());
12
- });
13
- };
14
- var __generator = (this && this.__generator) || function (thisArg, body) {
15
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
16
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
17
- function verb(n) { return function (v) { return step([n, v]); }; }
18
- function step(op) {
19
- if (f) throw new TypeError("Generator is already executing.");
20
- while (_) try {
21
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
22
- if (y = 0, t) op = [op[0] & 2, t.value];
23
- switch (op[0]) {
24
- case 0: case 1: t = op; break;
25
- case 4: _.label++; return { value: op[1], done: false };
26
- case 5: _.label++; y = op[1]; op = [0]; continue;
27
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
28
- default:
29
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
30
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
31
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
32
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
33
- if (t[2]) _.ops.pop();
34
- _.trys.pop(); continue;
35
- }
36
- op = body.call(thisArg, _);
37
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
38
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
39
- }
40
- };
41
5
  import { output } from '../../output.js';
42
6
  import { confirm } from '../../prompt.js';
43
7
  /**
@@ -51,32 +15,32 @@ function getConnectionConfig(ctx) {
51
15
  user: ctx.flags.user || process.env.PGUSER || 'postgres',
52
16
  password: ctx.flags.password || process.env.PGPASSWORD || '',
53
17
  ssl: ctx.flags.ssl || process.env.PGSSLMODE === 'require',
54
- schema: ctx.flags.schema || 'claude_flow'
18
+ schema: ctx.flags.schema || 'claude_flow',
55
19
  };
56
20
  }
57
21
  /**
58
22
  * Generate random vector
59
23
  */
60
24
  function generateRandomVector(dimensions) {
61
- var vector = [];
62
- for (var i = 0; i < dimensions; i++) {
25
+ const vector = [];
26
+ for (let i = 0; i < dimensions; i++) {
63
27
  vector.push(Math.random() * 2 - 1);
64
28
  }
65
29
  // Normalize
66
- var magnitude = Math.sqrt(vector.reduce(function (sum, v) { return sum + v * v; }, 0));
67
- return vector.map(function (v) { return v / magnitude; });
30
+ const magnitude = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));
31
+ return vector.map(v => v / magnitude);
68
32
  }
69
33
  /**
70
34
  * Calculate percentile from sorted array
71
35
  */
72
36
  function percentile(sortedArr, p) {
73
- var index = Math.ceil((p / 100) * sortedArr.length) - 1;
37
+ const index = Math.ceil((p / 100) * sortedArr.length) - 1;
74
38
  return sortedArr[Math.max(0, index)];
75
39
  }
76
40
  /**
77
41
  * RuVector benchmark command
78
42
  */
79
- export var benchmarkCommand = {
43
+ export const benchmarkCommand = {
80
44
  name: 'benchmark',
81
45
  description: 'Performance benchmarking',
82
46
  options: [
@@ -85,98 +49,98 @@ export var benchmarkCommand = {
85
49
  short: 'n',
86
50
  description: 'Number of test vectors',
87
51
  type: 'number',
88
- "default": 10000
52
+ default: 10000,
89
53
  },
90
54
  {
91
55
  name: 'dimensions',
92
56
  short: 'd',
93
57
  description: 'Vector dimensions',
94
58
  type: 'number',
95
- "default": 1536
59
+ default: 1536,
96
60
  },
97
61
  {
98
62
  name: 'queries',
99
63
  short: 'q',
100
64
  description: 'Number of test queries',
101
65
  type: 'number',
102
- "default": 100
66
+ default: 100,
103
67
  },
104
68
  {
105
69
  name: 'k',
106
70
  description: 'Top-k results to retrieve',
107
71
  type: 'number',
108
- "default": 10
72
+ default: 10,
109
73
  },
110
74
  {
111
75
  name: 'metric',
112
76
  short: 'm',
113
77
  description: 'Distance metric',
114
78
  type: 'string',
115
- "default": 'cosine',
116
- choices: ['cosine', 'l2', 'inner']
79
+ default: 'cosine',
80
+ choices: ['cosine', 'l2', 'inner'],
117
81
  },
118
82
  {
119
83
  name: 'index',
120
84
  short: 'i',
121
85
  description: 'Index type to test',
122
86
  type: 'string',
123
- "default": 'hnsw',
124
- choices: ['hnsw', 'ivfflat', 'none']
87
+ default: 'hnsw',
88
+ choices: ['hnsw', 'ivfflat', 'none'],
125
89
  },
126
90
  {
127
91
  name: 'batch-size',
128
92
  description: 'Batch size for inserts',
129
93
  type: 'number',
130
- "default": 1000
94
+ default: 1000,
131
95
  },
132
96
  {
133
97
  name: 'cleanup',
134
98
  description: 'Clean up test data after benchmark',
135
99
  type: 'boolean',
136
- "default": true
100
+ default: true,
137
101
  },
138
102
  {
139
103
  name: 'host',
140
104
  short: 'h',
141
105
  description: 'PostgreSQL host',
142
106
  type: 'string',
143
- "default": 'localhost'
107
+ default: 'localhost',
144
108
  },
145
109
  {
146
110
  name: 'port',
147
111
  short: 'p',
148
112
  description: 'PostgreSQL port',
149
113
  type: 'number',
150
- "default": 5432
114
+ default: 5432,
151
115
  },
152
116
  {
153
117
  name: 'database',
154
118
  description: 'Database name',
155
- type: 'string'
119
+ type: 'string',
156
120
  },
157
121
  {
158
122
  name: 'user',
159
123
  short: 'u',
160
124
  description: 'Database user',
161
- type: 'string'
125
+ type: 'string',
162
126
  },
163
127
  {
164
128
  name: 'password',
165
129
  description: 'Database password',
166
- type: 'string'
130
+ type: 'string',
167
131
  },
168
132
  {
169
133
  name: 'ssl',
170
134
  description: 'Enable SSL',
171
135
  type: 'boolean',
172
- "default": false
136
+ default: false,
173
137
  },
174
138
  {
175
139
  name: 'schema',
176
140
  short: 's',
177
141
  description: 'Schema name',
178
142
  type: 'string',
179
- "default": 'claude_flow'
143
+ default: 'claude_flow',
180
144
  },
181
145
  ],
182
146
  examples: [
@@ -185,348 +149,332 @@ export var benchmarkCommand = {
185
149
  { command: 'claude-flow ruvector benchmark --index ivfflat', description: 'Test IVFFlat index' },
186
150
  { command: 'claude-flow ruvector benchmark --dimensions 768 --metric l2', description: 'Custom dimensions and metric' },
187
151
  ],
188
- action: function (ctx) { return __awaiter(void 0, void 0, Promise, function () {
189
- var config, numVectors, dimensions, numQueries, topK, metric, indexType, batchSize, cleanup, confirmRun, spinner, results, pg, _a, client, benchmarkTable, insertStart, insertedCount, batch, batchStart, batchEnd, batchVectors, i, vector, insertDuration, insertThroughput, indexStart, metricOp, lists, indexDuration, queryLatencies, distanceOp, q, queryVector, queryStart, avgLatency, p50, p95, p99, minLatency, maxLatency, qps, sizeResult, tableSize, totalSize, indexSize, bytesPerVector, estimatedRecall, formatBytes, grade, gradeColor, error_1;
190
- return __generator(this, function (_b) {
191
- switch (_b.label) {
192
- case 0:
193
- config = getConnectionConfig(ctx);
194
- numVectors = parseInt(ctx.flags.vectors || '10000', 10);
195
- dimensions = parseInt(ctx.flags.dimensions || '1536', 10);
196
- numQueries = parseInt(ctx.flags.queries || '100', 10);
197
- topK = parseInt(ctx.flags.k || '10', 10);
198
- metric = ctx.flags.metric || 'cosine';
199
- indexType = ctx.flags.index || 'hnsw';
200
- batchSize = parseInt(ctx.flags['batch-size'] || '1000', 10);
201
- cleanup = ctx.flags.cleanup !== false;
202
- output.writeln();
203
- output.writeln(output.bold('RuVector Performance Benchmark'));
204
- output.writeln(output.dim('='.repeat(60)));
205
- output.writeln();
206
- if (!config.database) {
207
- output.printError('Database name is required. Use --database or -d flag, or set PGDATABASE env.');
208
- return [2 /*return*/, { success: false, exitCode: 1 }];
209
- }
210
- // Show benchmark configuration
211
- output.writeln(output.highlight('Benchmark Configuration:'));
212
- output.printTable({
213
- columns: [
214
- { key: 'setting', header: 'Setting', width: 20 },
215
- { key: 'value', header: 'Value', width: 20 },
216
- ],
217
- data: [
218
- { setting: 'Vectors', value: numVectors.toLocaleString() },
219
- { setting: 'Dimensions', value: dimensions.toLocaleString() },
220
- { setting: 'Queries', value: numQueries.toLocaleString() },
221
- { setting: 'Top-K', value: topK.toLocaleString() },
222
- { setting: 'Metric', value: metric },
223
- { setting: 'Index Type', value: indexType.toUpperCase() },
224
- { setting: 'Batch Size', value: batchSize.toLocaleString() },
225
- ]
226
- });
227
- output.writeln();
228
- if (!(numVectors >= 50000 && ctx.interactive)) return [3 /*break*/, 2];
229
- return [4 /*yield*/, confirm({
230
- message: "This will insert " + numVectors.toLocaleString() + " vectors. Continue?",
231
- "default": true
232
- })];
233
- case 1:
234
- confirmRun = _b.sent();
235
- if (!confirmRun) {
236
- output.printInfo('Benchmark cancelled');
237
- return [2 /*return*/, { success: false, exitCode: 0 }];
238
- }
239
- _b.label = 2;
240
- case 2:
241
- spinner = output.createSpinner({ text: 'Connecting to PostgreSQL...', spinner: 'dots' });
242
- spinner.start();
243
- results = {
244
- config: { numVectors: numVectors, dimensions: dimensions, numQueries: numQueries, topK: topK, metric: metric, indexType: indexType },
245
- insert: {},
246
- query: {},
247
- memory: {}
248
- };
249
- _b.label = 3;
250
- case 3:
251
- _b.trys.push([3, 31, , 32]);
252
- pg = null;
253
- _b.label = 4;
254
- case 4:
255
- _b.trys.push([4, 6, , 7]);
256
- return [4 /*yield*/, import('pg')];
257
- case 5:
258
- pg = _b.sent();
259
- return [3 /*break*/, 7];
260
- case 6:
261
- _a = _b.sent();
262
- spinner.fail('PostgreSQL driver not found');
263
- output.printError('Install pg package: npm install pg');
264
- return [2 /*return*/, { success: false, exitCode: 1 }];
265
- case 7:
266
- client = new pg.Client({
267
- host: config.host,
268
- port: config.port,
269
- database: config.database,
270
- user: config.user,
271
- password: config.password,
272
- ssl: config.ssl ? { rejectUnauthorized: false } : false
273
- });
274
- return [4 /*yield*/, client.connect()];
275
- case 8:
276
- _b.sent();
277
- spinner.succeed('Connected to PostgreSQL');
278
- benchmarkTable = config.schema + ".benchmark_" + Date.now();
279
- spinner.setText('Creating benchmark table...');
280
- spinner.start();
281
- return [4 /*yield*/, client.query("\n CREATE TABLE " + benchmarkTable + " (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n embedding vector(" + dimensions + "),\n created_at TIMESTAMPTZ DEFAULT NOW()\n )\n ")];
282
- case 9:
283
- _b.sent();
284
- spinner.succeed('Benchmark table created');
285
- // Insert vectors
286
- spinner.setText("Inserting " + numVectors.toLocaleString() + " vectors...");
287
- spinner.start();
288
- insertStart = Date.now();
289
- insertedCount = 0;
290
- batch = 0;
291
- _b.label = 10;
292
- case 10:
293
- if (!(batch < Math.ceil(numVectors / batchSize))) return [3 /*break*/, 13];
294
- batchStart = batch * batchSize;
295
- batchEnd = Math.min(batchStart + batchSize, numVectors);
296
- batchVectors = [];
297
- for (i = batchStart; i < batchEnd; i++) {
298
- vector = generateRandomVector(dimensions);
299
- batchVectors.push("('[" + vector.join(',') + "]')");
300
- }
301
- return [4 /*yield*/, client.query("\n INSERT INTO " + benchmarkTable + " (embedding)\n VALUES " + batchVectors.join(',') + "\n ")];
302
- case 11:
303
- _b.sent();
304
- insertedCount = batchEnd;
305
- spinner.setText("Inserting vectors... " + insertedCount.toLocaleString() + "/" + numVectors.toLocaleString());
306
- _b.label = 12;
307
- case 12:
308
- batch++;
309
- return [3 /*break*/, 10];
310
- case 13:
311
- insertDuration = Date.now() - insertStart;
312
- insertThroughput = Math.round(numVectors / (insertDuration / 1000));
313
- results.insert = {
314
- totalTime: insertDuration,
315
- throughput: insertThroughput,
316
- vectorsInserted: numVectors
317
- };
318
- spinner.succeed("Inserted " + numVectors.toLocaleString() + " vectors in " + (insertDuration / 1000).toFixed(2) + "s (" + insertThroughput.toLocaleString() + " vectors/sec)");
319
- if (!(indexType !== 'none')) return [3 /*break*/, 21];
320
- spinner.setText("Creating " + indexType.toUpperCase() + " index...");
321
- spinner.start();
322
- indexStart = Date.now();
323
- metricOp = metric === 'cosine' ? 'vector_cosine_ops' :
324
- metric === 'l2' ? 'vector_l2_ops' : 'vector_ip_ops';
325
- if (!(indexType === 'hnsw')) return [3 /*break*/, 15];
326
- return [4 /*yield*/, client.query("\n CREATE INDEX idx_benchmark_hnsw\n ON " + benchmarkTable + "\n USING hnsw (embedding " + metricOp + ")\n WITH (m = 16, ef_construction = 64)\n ")];
327
- case 14:
328
- _b.sent();
329
- return [3 /*break*/, 17];
330
- case 15:
331
- if (!(indexType === 'ivfflat')) return [3 /*break*/, 17];
332
- lists = Math.max(100, Math.floor(numVectors / 1000));
333
- return [4 /*yield*/, client.query("\n CREATE INDEX idx_benchmark_ivfflat\n ON " + benchmarkTable + "\n USING ivfflat (embedding " + metricOp + ")\n WITH (lists = " + lists + ")\n ")];
334
- case 16:
335
- _b.sent();
336
- _b.label = 17;
337
- case 17:
338
- indexDuration = Date.now() - indexStart;
339
- results.insert.indexTime = indexDuration;
340
- spinner.succeed(indexType.toUpperCase() + " index created in " + (indexDuration / 1000).toFixed(2) + "s");
341
- if (!(indexType === 'hnsw')) return [3 /*break*/, 19];
342
- return [4 /*yield*/, client.query("SET hnsw.ef_search = 100")];
343
- case 18:
344
- _b.sent();
345
- return [3 /*break*/, 21];
346
- case 19:
347
- if (!(indexType === 'ivfflat')) return [3 /*break*/, 21];
348
- return [4 /*yield*/, client.query("SET ivfflat.probes = 10")];
349
- case 20:
350
- _b.sent();
351
- _b.label = 21;
352
- case 21:
353
- // Run queries
354
- spinner.setText("Running " + numQueries + " queries...");
355
- spinner.start();
356
- queryLatencies = [];
357
- distanceOp = metric === 'cosine' ? '<=>' :
358
- metric === 'l2' ? '<->' : '<#>';
359
- q = 0;
360
- _b.label = 22;
361
- case 22:
362
- if (!(q < numQueries)) return [3 /*break*/, 25];
363
- queryVector = generateRandomVector(dimensions);
364
- queryStart = Date.now();
365
- return [4 /*yield*/, client.query("\n SELECT id, embedding " + distanceOp + " '[" + queryVector.join(',') + "]' as distance\n FROM " + benchmarkTable + "\n ORDER BY embedding " + distanceOp + " '[" + queryVector.join(',') + "]'\n LIMIT " + topK + "\n ")];
366
- case 23:
367
- _b.sent();
368
- queryLatencies.push(Date.now() - queryStart);
369
- if (q % 10 === 0) {
370
- spinner.setText("Running queries... " + (q + 1) + "/" + numQueries);
371
- }
372
- _b.label = 24;
373
- case 24:
374
- q++;
375
- return [3 /*break*/, 22];
376
- case 25:
377
- // Calculate query statistics
378
- queryLatencies.sort(function (a, b) { return a - b; });
379
- avgLatency = queryLatencies.reduce(function (a, b) { return a + b; }, 0) / queryLatencies.length;
380
- p50 = percentile(queryLatencies, 50);
381
- p95 = percentile(queryLatencies, 95);
382
- p99 = percentile(queryLatencies, 99);
383
- minLatency = queryLatencies[0];
384
- maxLatency = queryLatencies[queryLatencies.length - 1];
385
- qps = Math.round(1000 / avgLatency);
386
- results.query = {
387
- totalQueries: numQueries,
388
- avgLatency: avgLatency,
389
- p50: p50,
390
- p95: p95,
391
- p99: p99,
392
- minLatency: minLatency,
393
- maxLatency: maxLatency,
394
- qps: qps
395
- };
396
- spinner.succeed("Completed " + numQueries + " queries");
397
- // Get memory usage
398
- spinner.setText('Analyzing memory usage...');
399
- spinner.start();
400
- return [4 /*yield*/, client.query("\n SELECT\n pg_relation_size('" + benchmarkTable + "') as table_size,\n pg_total_relation_size('" + benchmarkTable + "') as total_size,\n pg_indexes_size('" + benchmarkTable + "') as index_size\n ")];
401
- case 26:
402
- sizeResult = _b.sent();
403
- tableSize = parseInt(sizeResult.rows[0].table_size, 10);
404
- totalSize = parseInt(sizeResult.rows[0].total_size, 10);
405
- indexSize = parseInt(sizeResult.rows[0].index_size, 10);
406
- bytesPerVector = totalSize / numVectors;
407
- results.memory = {
408
- tableSize: tableSize,
409
- indexSize: indexSize,
410
- totalSize: totalSize,
411
- bytesPerVector: bytesPerVector,
412
- vectorDimensions: dimensions
413
- };
414
- spinner.succeed('Memory analysis complete');
415
- estimatedRecall = 1.0;
416
- if (indexType === 'hnsw') {
417
- estimatedRecall = 0.99; // HNSW typically achieves 99%+ recall with default params
418
- }
419
- else if (indexType === 'ivfflat') {
420
- estimatedRecall = 0.95; // IVFFlat typically 95% with probes=10
421
- }
422
- results.query.estimatedRecall = estimatedRecall;
423
- if (!cleanup) return [3 /*break*/, 28];
424
- spinner.setText('Cleaning up benchmark data...');
425
- spinner.start();
426
- return [4 /*yield*/, client.query("DROP TABLE IF EXISTS " + benchmarkTable)];
427
- case 27:
428
- _b.sent();
429
- spinner.succeed('Benchmark data cleaned up');
430
- return [3 /*break*/, 29];
431
- case 28:
432
- output.printInfo("Benchmark table retained: " + benchmarkTable);
433
- _b.label = 29;
434
- case 29: return [4 /*yield*/, client.end()];
435
- case 30:
436
- _b.sent();
437
- // Display results
438
- output.writeln();
439
- output.writeln(output.bold('Benchmark Results'));
440
- output.writeln(output.dim('-'.repeat(60)));
441
- output.writeln();
442
- // Insert performance
443
- output.writeln(output.highlight('Insert Performance:'));
444
- output.printTable({
445
- columns: [
446
- { key: 'metric', header: 'Metric', width: 25 },
447
- { key: 'value', header: 'Value', width: 25 },
448
- ],
449
- data: [
450
- { metric: 'Total Vectors', value: numVectors.toLocaleString() },
451
- { metric: 'Total Time', value: (insertDuration / 1000).toFixed(2) + "s" },
452
- { metric: 'Throughput', value: insertThroughput.toLocaleString() + " vectors/sec" },
453
- { metric: 'Index Build Time', value: results.insert.indexTime
454
- ? (results.insert.indexTime / 1000).toFixed(2) + "s"
455
- : 'N/A' },
456
- ]
457
- });
458
- output.writeln();
459
- // Query performance
460
- output.writeln(output.highlight('Query Performance:'));
461
- output.printTable({
462
- columns: [
463
- { key: 'metric', header: 'Metric', width: 25 },
464
- { key: 'value', header: 'Value', width: 25 },
465
- ],
466
- data: [
467
- { metric: 'Total Queries', value: numQueries.toLocaleString() },
468
- { metric: 'Avg Latency', value: avgLatency.toFixed(2) + "ms" },
469
- { metric: 'P50 Latency', value: p50.toFixed(2) + "ms" },
470
- { metric: 'P95 Latency', value: p95.toFixed(2) + "ms" },
471
- { metric: 'P99 Latency', value: p99.toFixed(2) + "ms" },
472
- { metric: 'Min/Max Latency', value: minLatency.toFixed(2) + "ms / " + maxLatency.toFixed(2) + "ms" },
473
- { metric: 'Queries/Second', value: qps.toLocaleString() },
474
- { metric: 'Estimated Recall@K', value: (estimatedRecall * 100).toFixed(1) + "%" },
475
- ]
476
- });
477
- output.writeln();
478
- // Memory usage
479
- output.writeln(output.highlight('Memory Usage:'));
480
- formatBytes = function (b) {
481
- if (b < 1024)
482
- return b + " B";
483
- if (b < 1024 * 1024)
484
- return (b / 1024).toFixed(2) + " KB";
485
- if (b < 1024 * 1024 * 1024)
486
- return (b / 1024 / 1024).toFixed(2) + " MB";
487
- return (b / 1024 / 1024 / 1024).toFixed(2) + " GB";
488
- };
489
- output.printTable({
490
- columns: [
491
- { key: 'metric', header: 'Metric', width: 25 },
492
- { key: 'value', header: 'Value', width: 25 },
493
- ],
494
- data: [
495
- { metric: 'Table Size', value: formatBytes(tableSize) },
496
- { metric: 'Index Size', value: formatBytes(indexSize) },
497
- { metric: 'Total Size', value: formatBytes(totalSize) },
498
- { metric: 'Bytes per Vector', value: bytesPerVector.toFixed(2) + " bytes" },
499
- ]
500
- });
501
- output.writeln();
502
- grade = qps >= 1000 ? 'Excellent' :
503
- qps >= 500 ? 'Good' :
504
- qps >= 100 ? 'Fair' : 'Needs Optimization';
505
- gradeColor = qps >= 1000 ? output.success.bind(output) :
506
- qps >= 500 ? output.highlight.bind(output) :
507
- qps >= 100 ? output.warning.bind(output) : output.error.bind(output);
508
- output.printBox([
509
- "Performance Grade: " + gradeColor(grade),
510
- '',
511
- "Throughput: " + insertThroughput.toLocaleString() + " inserts/sec, " + qps.toLocaleString() + " queries/sec",
512
- "Latency: " + avgLatency.toFixed(2) + "ms avg, " + p99.toFixed(2) + "ms p99",
513
- "Memory: " + formatBytes(bytesPerVector) + " per " + dimensions + "-dim vector",
514
- "Recall: ~" + (estimatedRecall * 100).toFixed(0) + "% @ k=" + topK,
515
- '',
516
- indexType === 'hnsw' ? 'HNSW index provides excellent recall with good performance.' :
517
- indexType === 'ivfflat' ? 'IVFFlat index balances memory usage and query speed.' :
518
- 'No index: exact search provides 100% recall but slower queries.',
519
- ].join('\n'), 'Summary');
520
- return [2 /*return*/, { success: true, data: results }];
521
- case 31:
522
- error_1 = _b.sent();
523
- spinner.fail('Benchmark failed');
524
- output.printError(error_1 instanceof Error ? error_1.message : String(error_1));
525
- return [2 /*return*/, { success: false, exitCode: 1 }];
526
- case 32: return [2 /*return*/];
527
- }
152
+ action: async (ctx) => {
153
+ const config = getConnectionConfig(ctx);
154
+ const numVectors = parseInt(ctx.flags.vectors || '10000', 10);
155
+ const dimensions = parseInt(ctx.flags.dimensions || '1536', 10);
156
+ const numQueries = parseInt(ctx.flags.queries || '100', 10);
157
+ const topK = parseInt(ctx.flags.k || '10', 10);
158
+ const metric = ctx.flags.metric || 'cosine';
159
+ const indexType = ctx.flags.index || 'hnsw';
160
+ const batchSize = parseInt(ctx.flags['batch-size'] || '1000', 10);
161
+ const cleanup = ctx.flags.cleanup !== false;
162
+ output.writeln();
163
+ output.writeln(output.bold('RuVector Performance Benchmark'));
164
+ output.writeln(output.dim('='.repeat(60)));
165
+ output.writeln();
166
+ if (!config.database) {
167
+ output.printError('Database name is required. Use --database or -d flag, or set PGDATABASE env.');
168
+ return { success: false, exitCode: 1 };
169
+ }
170
+ // Show benchmark configuration
171
+ output.writeln(output.highlight('Benchmark Configuration:'));
172
+ output.printTable({
173
+ columns: [
174
+ { key: 'setting', header: 'Setting', width: 20 },
175
+ { key: 'value', header: 'Value', width: 20 },
176
+ ],
177
+ data: [
178
+ { setting: 'Vectors', value: numVectors.toLocaleString() },
179
+ { setting: 'Dimensions', value: dimensions.toLocaleString() },
180
+ { setting: 'Queries', value: numQueries.toLocaleString() },
181
+ { setting: 'Top-K', value: topK.toLocaleString() },
182
+ { setting: 'Metric', value: metric },
183
+ { setting: 'Index Type', value: indexType.toUpperCase() },
184
+ { setting: 'Batch Size', value: batchSize.toLocaleString() },
185
+ ],
528
186
  });
529
- }); }
187
+ output.writeln();
188
+ // Confirm large benchmarks
189
+ if (numVectors >= 50000 && ctx.interactive) {
190
+ const confirmRun = await confirm({
191
+ message: `This will insert ${numVectors.toLocaleString()} vectors. Continue?`,
192
+ default: true,
193
+ });
194
+ if (!confirmRun) {
195
+ output.printInfo('Benchmark cancelled');
196
+ return { success: false, exitCode: 0 };
197
+ }
198
+ }
199
+ const spinner = output.createSpinner({ text: 'Connecting to PostgreSQL...', spinner: 'dots' });
200
+ spinner.start();
201
+ const results = {
202
+ config: { numVectors, dimensions, numQueries, topK, metric, indexType },
203
+ insert: {},
204
+ query: {},
205
+ memory: {},
206
+ };
207
+ try {
208
+ // Import pg
209
+ let pg = null;
210
+ try {
211
+ pg = await import('pg');
212
+ }
213
+ catch {
214
+ spinner.fail('PostgreSQL driver not found');
215
+ output.printError('Install pg package: npm install pg');
216
+ return { success: false, exitCode: 1 };
217
+ }
218
+ const client = new pg.Client({
219
+ host: config.host,
220
+ port: config.port,
221
+ database: config.database,
222
+ user: config.user,
223
+ password: config.password,
224
+ ssl: config.ssl ? { rejectUnauthorized: false } : false,
225
+ });
226
+ await client.connect();
227
+ spinner.succeed('Connected to PostgreSQL');
228
+ // Create benchmark table
229
+ const benchmarkTable = `${config.schema}.benchmark_${Date.now()}`;
230
+ spinner.setText('Creating benchmark table...');
231
+ spinner.start();
232
+ await client.query(`
233
+ CREATE TABLE ${benchmarkTable} (
234
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
235
+ embedding vector(${dimensions}),
236
+ created_at TIMESTAMPTZ DEFAULT NOW()
237
+ )
238
+ `);
239
+ spinner.succeed('Benchmark table created');
240
+ // Insert vectors
241
+ spinner.setText(`Inserting ${numVectors.toLocaleString()} vectors...`);
242
+ spinner.start();
243
+ const insertStart = Date.now();
244
+ let insertedCount = 0;
245
+ for (let batch = 0; batch < Math.ceil(numVectors / batchSize); batch++) {
246
+ const batchStart = batch * batchSize;
247
+ const batchEnd = Math.min(batchStart + batchSize, numVectors);
248
+ const batchVectors = [];
249
+ for (let i = batchStart; i < batchEnd; i++) {
250
+ const vector = generateRandomVector(dimensions);
251
+ batchVectors.push(`('[${vector.join(',')}]')`);
252
+ }
253
+ await client.query(`
254
+ INSERT INTO ${benchmarkTable} (embedding)
255
+ VALUES ${batchVectors.join(',')}
256
+ `);
257
+ insertedCount = batchEnd;
258
+ spinner.setText(`Inserting vectors... ${insertedCount.toLocaleString()}/${numVectors.toLocaleString()}`);
259
+ }
260
+ const insertDuration = Date.now() - insertStart;
261
+ const insertThroughput = Math.round(numVectors / (insertDuration / 1000));
262
+ results.insert = {
263
+ totalTime: insertDuration,
264
+ throughput: insertThroughput,
265
+ vectorsInserted: numVectors,
266
+ };
267
+ spinner.succeed(`Inserted ${numVectors.toLocaleString()} vectors in ${(insertDuration / 1000).toFixed(2)}s (${insertThroughput.toLocaleString()} vectors/sec)`);
268
+ // Create index
269
+ if (indexType !== 'none') {
270
+ spinner.setText(`Creating ${indexType.toUpperCase()} index...`);
271
+ spinner.start();
272
+ const indexStart = Date.now();
273
+ const metricOp = metric === 'cosine' ? 'vector_cosine_ops' :
274
+ metric === 'l2' ? 'vector_l2_ops' : 'vector_ip_ops';
275
+ if (indexType === 'hnsw') {
276
+ await client.query(`
277
+ CREATE INDEX idx_benchmark_hnsw
278
+ ON ${benchmarkTable}
279
+ USING hnsw (embedding ${metricOp})
280
+ WITH (m = 16, ef_construction = 64)
281
+ `);
282
+ }
283
+ else if (indexType === 'ivfflat') {
284
+ // Need to train IVFFlat with existing data
285
+ const lists = Math.max(100, Math.floor(numVectors / 1000));
286
+ await client.query(`
287
+ CREATE INDEX idx_benchmark_ivfflat
288
+ ON ${benchmarkTable}
289
+ USING ivfflat (embedding ${metricOp})
290
+ WITH (lists = ${lists})
291
+ `);
292
+ }
293
+ const indexDuration = Date.now() - indexStart;
294
+ results.insert.indexTime = indexDuration;
295
+ spinner.succeed(`${indexType.toUpperCase()} index created in ${(indexDuration / 1000).toFixed(2)}s`);
296
+ // Set search parameters
297
+ if (indexType === 'hnsw') {
298
+ await client.query(`SET hnsw.ef_search = 100`);
299
+ }
300
+ else if (indexType === 'ivfflat') {
301
+ await client.query(`SET ivfflat.probes = 10`);
302
+ }
303
+ }
304
+ // Run queries
305
+ spinner.setText(`Running ${numQueries} queries...`);
306
+ spinner.start();
307
+ const queryLatencies = [];
308
+ const distanceOp = metric === 'cosine' ? '<=>' :
309
+ metric === 'l2' ? '<->' : '<#>';
310
+ for (let q = 0; q < numQueries; q++) {
311
+ const queryVector = generateRandomVector(dimensions);
312
+ const queryStart = Date.now();
313
+ await client.query(`
314
+ SELECT id, embedding ${distanceOp} '[${queryVector.join(',')}]' as distance
315
+ FROM ${benchmarkTable}
316
+ ORDER BY embedding ${distanceOp} '[${queryVector.join(',')}]'
317
+ LIMIT ${topK}
318
+ `);
319
+ queryLatencies.push(Date.now() - queryStart);
320
+ if (q % 10 === 0) {
321
+ spinner.setText(`Running queries... ${q + 1}/${numQueries}`);
322
+ }
323
+ }
324
+ // Calculate query statistics
325
+ queryLatencies.sort((a, b) => a - b);
326
+ const avgLatency = queryLatencies.reduce((a, b) => a + b, 0) / queryLatencies.length;
327
+ const p50 = percentile(queryLatencies, 50);
328
+ const p95 = percentile(queryLatencies, 95);
329
+ const p99 = percentile(queryLatencies, 99);
330
+ const minLatency = queryLatencies[0];
331
+ const maxLatency = queryLatencies[queryLatencies.length - 1];
332
+ const qps = Math.round(1000 / avgLatency);
333
+ results.query = {
334
+ totalQueries: numQueries,
335
+ avgLatency,
336
+ p50,
337
+ p95,
338
+ p99,
339
+ minLatency,
340
+ maxLatency,
341
+ qps,
342
+ };
343
+ spinner.succeed(`Completed ${numQueries} queries`);
344
+ // Get memory usage
345
+ spinner.setText('Analyzing memory usage...');
346
+ spinner.start();
347
+ const sizeResult = await client.query(`
348
+ SELECT
349
+ pg_relation_size('${benchmarkTable}') as table_size,
350
+ pg_total_relation_size('${benchmarkTable}') as total_size,
351
+ pg_indexes_size('${benchmarkTable}') as index_size
352
+ `);
353
+ const tableSize = parseInt(sizeResult.rows[0].table_size, 10);
354
+ const totalSize = parseInt(sizeResult.rows[0].total_size, 10);
355
+ const indexSize = parseInt(sizeResult.rows[0].index_size, 10);
356
+ const bytesPerVector = totalSize / numVectors;
357
+ results.memory = {
358
+ tableSize,
359
+ indexSize,
360
+ totalSize,
361
+ bytesPerVector,
362
+ vectorDimensions: dimensions,
363
+ };
364
+ spinner.succeed('Memory analysis complete');
365
+ // Calculate recall (if we have ground truth)
366
+ // For now, we'll estimate based on index type
367
+ let estimatedRecall = 1.0;
368
+ if (indexType === 'hnsw') {
369
+ estimatedRecall = 0.99; // HNSW typically achieves 99%+ recall with default params
370
+ }
371
+ else if (indexType === 'ivfflat') {
372
+ estimatedRecall = 0.95; // IVFFlat typically 95% with probes=10
373
+ }
374
+ results.query.estimatedRecall = estimatedRecall;
375
+ // Cleanup
376
+ if (cleanup) {
377
+ spinner.setText('Cleaning up benchmark data...');
378
+ spinner.start();
379
+ await client.query(`DROP TABLE IF EXISTS ${benchmarkTable}`);
380
+ spinner.succeed('Benchmark data cleaned up');
381
+ }
382
+ else {
383
+ output.printInfo(`Benchmark table retained: ${benchmarkTable}`);
384
+ }
385
+ await client.end();
386
+ // Display results
387
+ output.writeln();
388
+ output.writeln(output.bold('Benchmark Results'));
389
+ output.writeln(output.dim('-'.repeat(60)));
390
+ output.writeln();
391
+ // Insert performance
392
+ output.writeln(output.highlight('Insert Performance:'));
393
+ output.printTable({
394
+ columns: [
395
+ { key: 'metric', header: 'Metric', width: 25 },
396
+ { key: 'value', header: 'Value', width: 25 },
397
+ ],
398
+ data: [
399
+ { metric: 'Total Vectors', value: numVectors.toLocaleString() },
400
+ { metric: 'Total Time', value: `${(insertDuration / 1000).toFixed(2)}s` },
401
+ { metric: 'Throughput', value: `${insertThroughput.toLocaleString()} vectors/sec` },
402
+ { metric: 'Index Build Time', value: results.insert.indexTime
403
+ ? `${(results.insert.indexTime / 1000).toFixed(2)}s`
404
+ : 'N/A' },
405
+ ],
406
+ });
407
+ output.writeln();
408
+ // Query performance
409
+ output.writeln(output.highlight('Query Performance:'));
410
+ output.printTable({
411
+ columns: [
412
+ { key: 'metric', header: 'Metric', width: 25 },
413
+ { key: 'value', header: 'Value', width: 25 },
414
+ ],
415
+ data: [
416
+ { metric: 'Total Queries', value: numQueries.toLocaleString() },
417
+ { metric: 'Avg Latency', value: `${avgLatency.toFixed(2)}ms` },
418
+ { metric: 'P50 Latency', value: `${p50.toFixed(2)}ms` },
419
+ { metric: 'P95 Latency', value: `${p95.toFixed(2)}ms` },
420
+ { metric: 'P99 Latency', value: `${p99.toFixed(2)}ms` },
421
+ { metric: 'Min/Max Latency', value: `${minLatency.toFixed(2)}ms / ${maxLatency.toFixed(2)}ms` },
422
+ { metric: 'Queries/Second', value: qps.toLocaleString() },
423
+ { metric: 'Estimated Recall@K', value: `${(estimatedRecall * 100).toFixed(1)}%` },
424
+ ],
425
+ });
426
+ output.writeln();
427
+ // Memory usage
428
+ output.writeln(output.highlight('Memory Usage:'));
429
+ const formatBytes = (b) => {
430
+ if (b < 1024)
431
+ return `${b} B`;
432
+ if (b < 1024 * 1024)
433
+ return `${(b / 1024).toFixed(2)} KB`;
434
+ if (b < 1024 * 1024 * 1024)
435
+ return `${(b / 1024 / 1024).toFixed(2)} MB`;
436
+ return `${(b / 1024 / 1024 / 1024).toFixed(2)} GB`;
437
+ };
438
+ output.printTable({
439
+ columns: [
440
+ { key: 'metric', header: 'Metric', width: 25 },
441
+ { key: 'value', header: 'Value', width: 25 },
442
+ ],
443
+ data: [
444
+ { metric: 'Table Size', value: formatBytes(tableSize) },
445
+ { metric: 'Index Size', value: formatBytes(indexSize) },
446
+ { metric: 'Total Size', value: formatBytes(totalSize) },
447
+ { metric: 'Bytes per Vector', value: `${bytesPerVector.toFixed(2)} bytes` },
448
+ ],
449
+ });
450
+ output.writeln();
451
+ // Summary box
452
+ const grade = qps >= 1000 ? 'Excellent' :
453
+ qps >= 500 ? 'Good' :
454
+ qps >= 100 ? 'Fair' : 'Needs Optimization';
455
+ const gradeColor = qps >= 1000 ? output.success.bind(output) :
456
+ qps >= 500 ? output.highlight.bind(output) :
457
+ qps >= 100 ? output.warning.bind(output) : output.error.bind(output);
458
+ output.printBox([
459
+ `Performance Grade: ${gradeColor(grade)}`,
460
+ '',
461
+ `Throughput: ${insertThroughput.toLocaleString()} inserts/sec, ${qps.toLocaleString()} queries/sec`,
462
+ `Latency: ${avgLatency.toFixed(2)}ms avg, ${p99.toFixed(2)}ms p99`,
463
+ `Memory: ${formatBytes(bytesPerVector)} per ${dimensions}-dim vector`,
464
+ `Recall: ~${(estimatedRecall * 100).toFixed(0)}% @ k=${topK}`,
465
+ '',
466
+ indexType === 'hnsw' ? 'HNSW index provides excellent recall with good performance.' :
467
+ indexType === 'ivfflat' ? 'IVFFlat index balances memory usage and query speed.' :
468
+ 'No index: exact search provides 100% recall but slower queries.',
469
+ ].join('\n'), 'Summary');
470
+ return { success: true, data: results };
471
+ }
472
+ catch (error) {
473
+ spinner.fail('Benchmark failed');
474
+ output.printError(error instanceof Error ? error.message : String(error));
475
+ return { success: false, exitCode: 1 };
476
+ }
477
+ },
530
478
  };
531
479
  export default benchmarkCommand;
532
480
  //# sourceMappingURL=benchmark.js.map