kynjal-cli 3.1.4 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (566) hide show
  1. package/.claude/agents/core/coder.md +1 -1
  2. package/.claude/agents/core/planner.md +2 -2
  3. package/.claude/agents/core/researcher.md +1 -1
  4. package/.claude/agents/core/reviewer.md +1 -1
  5. package/.claude/agents/core/tester.md +1 -1
  6. package/.claude/agents/data/data-ml-model.md +4 -4
  7. package/.claude/agents/development/dev-backend-api.md +4 -4
  8. package/.claude/agents/documentation/docs-api-openapi.md +4 -4
  9. package/.claude/agents/github/code-review-swarm.md +2 -2
  10. package/.claude/agents/github/issue-tracker.md +2 -2
  11. package/.claude/agents/github/pr-manager.md +2 -2
  12. package/.claude/agents/github/release-manager.md +2 -2
  13. package/.claude/agents/github/workflow-automation.md +2 -2
  14. package/.claude/agents/sparc/architecture.md +3 -3
  15. package/.claude/agents/sparc/pseudocode.md +2 -2
  16. package/.claude/agents/sparc/refinement.md +3 -3
  17. package/.claude/agents/sparc/specification.md +2 -2
  18. package/.claude/agents/swarm/adaptive-coordinator.md +1 -1
  19. package/.claude/agents/swarm/hierarchical-coordinator.md +1 -1
  20. package/.claude/agents/swarm/mesh-coordinator.md +1 -1
  21. package/.claude/agents/templates/base-template-generator.md +25 -4
  22. package/.claude/agents/templates/sparc-coordinator.md +3 -3
  23. package/.claude/helpers/auto-commit.sh +1 -1
  24. package/.claude/helpers/auto-memory-hook.mjs +27 -9
  25. package/.claude/helpers/hook-handler.cjs +58 -18
  26. package/.claude/helpers/statusline.cjs +420 -613
  27. package/.claude/helpers/statusline.js +3 -3
  28. package/.claude/settings.json +9 -9
  29. package/.claude/skills/reasoningbank-intelligence/SKILL.md +2 -2
  30. package/.claude/skills/swarm-orchestration/SKILL.md +1 -1
  31. package/README.md +383 -170
  32. package/bin/cli.js +6 -6
  33. package/bin/mcp-server.js +1 -1
  34. package/bin/preinstall.cjs +2 -0
  35. package/dist/src/appliance/gguf-engine.js +664 -0
  36. package/dist/src/appliance/gguf-engine.js.map +1 -0
  37. package/dist/src/appliance/ruvllm-bridge.js +492 -0
  38. package/dist/src/appliance/ruvllm-bridge.js.map +1 -0
  39. package/dist/src/appliance/rvfa-builder.js +383 -0
  40. package/dist/src/appliance/rvfa-builder.js.map +1 -0
  41. package/dist/src/appliance/rvfa-distribution.js +533 -0
  42. package/dist/src/appliance/rvfa-distribution.js.map +1 -0
  43. package/dist/src/appliance/rvfa-format.js +465 -0
  44. package/dist/src/appliance/rvfa-format.js.map +1 -0
  45. package/dist/src/appliance/rvfa-runner.js +373 -0
  46. package/dist/src/appliance/rvfa-runner.js.map +1 -0
  47. package/dist/src/appliance/rvfa-signing.js +469 -0
  48. package/dist/src/appliance/rvfa-signing.js.map +1 -0
  49. package/dist/src/benchmarks/pretrain/index.js +542 -331
  50. package/dist/src/benchmarks/pretrain/index.js.map +1 -1
  51. package/dist/src/commands/agent.d.ts.map +1 -1
  52. package/dist/src/commands/agent.js +725 -502
  53. package/dist/src/commands/agent.js.map +1 -1
  54. package/dist/src/commands/analyze.js +1548 -1218
  55. package/dist/src/commands/analyze.js.map +1 -1
  56. package/dist/src/commands/appliance-advanced.d.ts +9 -0
  57. package/dist/src/commands/appliance-advanced.d.ts.map +1 -0
  58. package/dist/src/commands/appliance-advanced.js +324 -0
  59. package/dist/src/commands/appliance-advanced.js.map +1 -0
  60. package/dist/src/commands/appliance.d.ts +8 -0
  61. package/dist/src/commands/appliance.d.ts.map +1 -0
  62. package/dist/src/commands/appliance.js +581 -0
  63. package/dist/src/commands/appliance.js.map +1 -0
  64. package/dist/src/commands/benchmark.js +523 -372
  65. package/dist/src/commands/benchmark.js.map +1 -1
  66. package/dist/src/commands/claims.js +364 -274
  67. package/dist/src/commands/claims.js.map +1 -1
  68. package/dist/src/commands/cleanup.d.ts +13 -0
  69. package/dist/src/commands/cleanup.d.ts.map +1 -0
  70. package/dist/src/commands/cleanup.js +262 -0
  71. package/dist/src/commands/cleanup.js.map +1 -0
  72. package/dist/src/commands/completions.js +118 -477
  73. package/dist/src/commands/completions.js.map +1 -1
  74. package/dist/src/commands/config.js +303 -237
  75. package/dist/src/commands/config.js.map +1 -1
  76. package/dist/src/commands/daemon.d.ts.map +1 -1
  77. package/dist/src/commands/daemon.js +597 -425
  78. package/dist/src/commands/daemon.js.map +1 -1
  79. package/dist/src/commands/deployment.js +275 -194
  80. package/dist/src/commands/deployment.js.map +1 -1
  81. package/dist/src/commands/doctor.d.ts.map +1 -1
  82. package/dist/src/commands/doctor.js +690 -460
  83. package/dist/src/commands/doctor.js.map +1 -1
  84. package/dist/src/commands/embeddings.js +1543 -1293
  85. package/dist/src/commands/embeddings.js.map +1 -1
  86. package/dist/src/commands/guidance.js +596 -449
  87. package/dist/src/commands/guidance.js.map +1 -1
  88. package/dist/src/commands/hive-mind.js +938 -854
  89. package/dist/src/commands/hive-mind.js.map +1 -1
  90. package/dist/src/commands/hooks.d.ts.map +1 -1
  91. package/dist/src/commands/hooks.js +3677 -2570
  92. package/dist/src/commands/hooks.js.map +1 -1
  93. package/dist/src/commands/index.js +322 -122
  94. package/dist/src/commands/index.js.map +1 -1
  95. package/dist/src/commands/init.d.ts +1 -1
  96. package/dist/src/commands/init.d.ts.map +1 -1
  97. package/dist/src/commands/init.js +943 -787
  98. package/dist/src/commands/init.js.map +1 -1
  99. package/dist/src/commands/issues.js +558 -383
  100. package/dist/src/commands/issues.js.map +1 -1
  101. package/dist/src/commands/mcp.d.ts.map +1 -1
  102. package/dist/src/commands/mcp.js +605 -475
  103. package/dist/src/commands/mcp.js.map +1 -1
  104. package/dist/src/commands/memory.d.ts.map +1 -1
  105. package/dist/src/commands/memory.js +1031 -814
  106. package/dist/src/commands/memory.js.map +1 -1
  107. package/dist/src/commands/migrate.js +347 -282
  108. package/dist/src/commands/migrate.js.map +1 -1
  109. package/dist/src/commands/neural.d.ts.map +1 -1
  110. package/dist/src/commands/neural.js +1563 -1283
  111. package/dist/src/commands/neural.js.map +1 -1
  112. package/dist/src/commands/performance.js +643 -497
  113. package/dist/src/commands/performance.js.map +1 -1
  114. package/dist/src/commands/plugins.js +841 -668
  115. package/dist/src/commands/plugins.js.map +1 -1
  116. package/dist/src/commands/process.js +447 -392
  117. package/dist/src/commands/process.js.map +1 -1
  118. package/dist/src/commands/progress.js +256 -162
  119. package/dist/src/commands/progress.js.map +1 -1
  120. package/dist/src/commands/providers.js +220 -150
  121. package/dist/src/commands/providers.js.map +1 -1
  122. package/dist/src/commands/route.js +665 -520
  123. package/dist/src/commands/route.js.map +1 -1
  124. package/dist/src/commands/ruvector/backup.js +651 -505
  125. package/dist/src/commands/ruvector/backup.js.map +1 -1
  126. package/dist/src/commands/ruvector/benchmark.js +401 -349
  127. package/dist/src/commands/ruvector/benchmark.js.map +1 -1
  128. package/dist/src/commands/ruvector/import.js +267 -225
  129. package/dist/src/commands/ruvector/import.js.map +1 -1
  130. package/dist/src/commands/ruvector/index.js +75 -37
  131. package/dist/src/commands/ruvector/index.js.map +1 -1
  132. package/dist/src/commands/ruvector/init.js +359 -336
  133. package/dist/src/commands/ruvector/init.js.map +1 -1
  134. package/dist/src/commands/ruvector/migrate.js +322 -335
  135. package/dist/src/commands/ruvector/migrate.js.map +1 -1
  136. package/dist/src/commands/ruvector/optimize.js +431 -375
  137. package/dist/src/commands/ruvector/optimize.js.map +1 -1
  138. package/dist/src/commands/ruvector/setup.js +117 -703
  139. package/dist/src/commands/ruvector/setup.js.map +1 -1
  140. package/dist/src/commands/ruvector/status.js +419 -364
  141. package/dist/src/commands/ruvector/status.js.map +1 -1
  142. package/dist/src/commands/security.d.ts.map +1 -1
  143. package/dist/src/commands/security.js +610 -456
  144. package/dist/src/commands/security.js.map +1 -1
  145. package/dist/src/commands/session.d.ts +1 -1
  146. package/dist/src/commands/session.js +627 -505
  147. package/dist/src/commands/session.js.map +1 -1
  148. package/dist/src/commands/start.d.ts +1 -1
  149. package/dist/src/commands/start.js +368 -271
  150. package/dist/src/commands/start.js.map +1 -1
  151. package/dist/src/commands/status.d.ts +1 -1
  152. package/dist/src/commands/status.d.ts.map +1 -1
  153. package/dist/src/commands/status.js +492 -379
  154. package/dist/src/commands/status.js.map +1 -1
  155. package/dist/src/commands/swarm.js +488 -408
  156. package/dist/src/commands/swarm.js.map +1 -1
  157. package/dist/src/commands/task.d.ts +1 -1
  158. package/dist/src/commands/task.js +539 -424
  159. package/dist/src/commands/task.js.map +1 -1
  160. package/dist/src/commands/transfer-store.js +412 -322
  161. package/dist/src/commands/transfer-store.js.map +1 -1
  162. package/dist/src/commands/update.js +291 -196
  163. package/dist/src/commands/update.js.map +1 -1
  164. package/dist/src/commands/workflow.js +486 -386
  165. package/dist/src/commands/workflow.js.map +1 -1
  166. package/dist/src/config-adapter.js +40 -39
  167. package/dist/src/config-adapter.js.map +1 -1
  168. package/dist/src/index.js +416 -312
  169. package/dist/src/index.js.map +1 -1
  170. package/dist/src/infrastructure/in-memory-repositories.js +507 -246
  171. package/dist/src/infrastructure/in-memory-repositories.js.map +1 -1
  172. package/dist/src/init/claudemd-generator.js +78 -368
  173. package/dist/src/init/claudemd-generator.js.map +1 -1
  174. package/dist/src/init/executor.js +1019 -1345
  175. package/dist/src/init/executor.js.map +1 -1
  176. package/dist/src/init/helpers-generator.js +60 -635
  177. package/dist/src/init/helpers-generator.js.map +1 -1
  178. package/dist/src/init/index.d.ts +1 -1
  179. package/dist/src/init/index.d.ts.map +1 -1
  180. package/dist/src/init/index.js +1 -1
  181. package/dist/src/init/index.js.map +1 -1
  182. package/dist/src/init/mcp-generator.d.ts +0 -1
  183. package/dist/src/init/mcp-generator.d.ts.map +1 -1
  184. package/dist/src/init/mcp-generator.js +62 -42
  185. package/dist/src/init/mcp-generator.js.map +1 -1
  186. package/dist/src/init/settings-generator.d.ts.map +1 -1
  187. package/dist/src/init/settings-generator.js +167 -100
  188. package/dist/src/init/settings-generator.js.map +1 -1
  189. package/dist/src/init/statusline-generator.d.ts +16 -8
  190. package/dist/src/init/statusline-generator.d.ts.map +1 -1
  191. package/dist/src/init/statusline-generator.js +20 -1300
  192. package/dist/src/init/statusline-generator.js.map +1 -1
  193. package/dist/src/init/types.d.ts +15 -5
  194. package/dist/src/init/types.d.ts.map +1 -1
  195. package/dist/src/init/types.js +66 -76
  196. package/dist/src/init/types.js.map +1 -1
  197. package/dist/src/mcp-client.js +130 -76
  198. package/dist/src/mcp-client.js.map +1 -1
  199. package/dist/src/mcp-server.js +758 -445
  200. package/dist/src/mcp-server.js.map +1 -1
  201. package/dist/src/mcp-tools/agent-tools.js +492 -391
  202. package/dist/src/mcp-tools/agent-tools.js.map +1 -1
  203. package/dist/src/mcp-tools/agentdb-tools.d.ts +30 -0
  204. package/dist/src/mcp-tools/agentdb-tools.d.ts.map +1 -0
  205. package/dist/src/mcp-tools/agentdb-tools.js +758 -0
  206. package/dist/src/mcp-tools/agentdb-tools.js.map +1 -0
  207. package/dist/src/mcp-tools/analyze-tools.js +236 -172
  208. package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
  209. package/dist/src/mcp-tools/auto-install.js +142 -80
  210. package/dist/src/mcp-tools/auto-install.js.map +1 -1
  211. package/dist/src/mcp-tools/browser-tools.js +375 -252
  212. package/dist/src/mcp-tools/browser-tools.js.map +1 -1
  213. package/dist/src/mcp-tools/claims-tools.js +565 -473
  214. package/dist/src/mcp-tools/claims-tools.js.map +1 -1
  215. package/dist/src/mcp-tools/config-tools.d.ts.map +1 -1
  216. package/dist/src/mcp-tools/config-tools.js +284 -190
  217. package/dist/src/mcp-tools/config-tools.js.map +1 -1
  218. package/dist/src/mcp-tools/coordination-tools.d.ts.map +1 -1
  219. package/dist/src/mcp-tools/coordination-tools.js +600 -349
  220. package/dist/src/mcp-tools/coordination-tools.js.map +1 -1
  221. package/dist/src/mcp-tools/daa-tools.js +367 -289
  222. package/dist/src/mcp-tools/daa-tools.js.map +1 -1
  223. package/dist/src/mcp-tools/embeddings-tools.js +693 -582
  224. package/dist/src/mcp-tools/embeddings-tools.js.map +1 -1
  225. package/dist/src/mcp-tools/github-tools.js +312 -261
  226. package/dist/src/mcp-tools/github-tools.js.map +1 -1
  227. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
  228. package/dist/src/mcp-tools/hive-mind-tools.js +718 -423
  229. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
  230. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  231. package/dist/src/mcp-tools/hooks-tools.js +2726 -1978
  232. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  233. package/dist/src/mcp-tools/index.d.ts +2 -0
  234. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  235. package/dist/src/mcp-tools/index.js +2 -0
  236. package/dist/src/mcp-tools/index.js.map +1 -1
  237. package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
  238. package/dist/src/mcp-tools/memory-tools.js +514 -329
  239. package/dist/src/mcp-tools/memory-tools.js.map +1 -1
  240. package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
  241. package/dist/src/mcp-tools/neural-tools.js +428 -326
  242. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  243. package/dist/src/mcp-tools/performance-tools.js +480 -420
  244. package/dist/src/mcp-tools/performance-tools.js.map +1 -1
  245. package/dist/src/mcp-tools/progress-tools.js +278 -204
  246. package/dist/src/mcp-tools/progress-tools.js.map +1 -1
  247. package/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
  248. package/dist/src/mcp-tools/ruvllm-tools.d.ts.map +1 -0
  249. package/dist/src/mcp-tools/ruvllm-tools.js +399 -0
  250. package/dist/src/mcp-tools/ruvllm-tools.js.map +1 -0
  251. package/dist/src/mcp-tools/security-tools.js +429 -297
  252. package/dist/src/mcp-tools/security-tools.js.map +1 -1
  253. package/dist/src/mcp-tools/session-tools.js +234 -185
  254. package/dist/src/mcp-tools/session-tools.js.map +1 -1
  255. package/dist/src/mcp-tools/swarm-tools.d.ts +2 -1
  256. package/dist/src/mcp-tools/swarm-tools.d.ts.map +1 -1
  257. package/dist/src/mcp-tools/swarm-tools.js +303 -64
  258. package/dist/src/mcp-tools/swarm-tools.js.map +1 -1
  259. package/dist/src/mcp-tools/system-tools.d.ts.map +1 -1
  260. package/dist/src/mcp-tools/system-tools.js +352 -200
  261. package/dist/src/mcp-tools/system-tools.js.map +1 -1
  262. package/dist/src/mcp-tools/task-tools.d.ts.map +1 -1
  263. package/dist/src/mcp-tools/task-tools.js +357 -189
  264. package/dist/src/mcp-tools/task-tools.js.map +1 -1
  265. package/dist/src/mcp-tools/terminal-tools.js +196 -148
  266. package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
  267. package/dist/src/mcp-tools/transfer-tools.js +333 -186
  268. package/dist/src/mcp-tools/transfer-tools.js.map +1 -1
  269. package/dist/src/mcp-tools/wasm-agent-tools.d.ts +9 -0
  270. package/dist/src/mcp-tools/wasm-agent-tools.d.ts.map +1 -0
  271. package/dist/src/mcp-tools/wasm-agent-tools.js +377 -0
  272. package/dist/src/mcp-tools/wasm-agent-tools.js.map +1 -0
  273. package/dist/src/mcp-tools/workflow-tools.d.ts.map +1 -1
  274. package/dist/src/mcp-tools/workflow-tools.js +471 -335
  275. package/dist/src/mcp-tools/workflow-tools.js.map +1 -1
  276. package/dist/src/memory/ewc-consolidation.js +345 -173
  277. package/dist/src/memory/ewc-consolidation.js.map +1 -1
  278. package/dist/src/memory/intelligence.js +841 -359
  279. package/dist/src/memory/intelligence.js.map +1 -1
  280. package/dist/src/memory/memory-bridge.js +1964 -0
  281. package/dist/src/memory/memory-bridge.js.map +1 -0
  282. package/dist/src/memory/memory-initializer.js +1895 -1602
  283. package/dist/src/memory/memory-initializer.js.map +1 -1
  284. package/dist/src/memory/sona-optimizer.js +329 -199
  285. package/dist/src/memory/sona-optimizer.js.map +1 -1
  286. package/dist/src/output.d.ts +2 -2
  287. package/dist/src/output.d.ts.map +1 -1
  288. package/dist/src/output.js +273 -242
  289. package/dist/src/output.js.map +1 -1
  290. package/dist/src/parser.js +217 -124
  291. package/dist/src/parser.js.map +1 -1
  292. package/dist/src/plugins/manager.js +531 -278
  293. package/dist/src/plugins/manager.js.map +1 -1
  294. package/dist/src/plugins/store/discovery.js +362 -275
  295. package/dist/src/plugins/store/discovery.js.map +1 -1
  296. package/dist/src/plugins/store/index.js +105 -48
  297. package/dist/src/plugins/store/index.js.map +1 -1
  298. package/dist/src/plugins/store/search.js +107 -69
  299. package/dist/src/plugins/store/search.js.map +1 -1
  300. package/dist/src/plugins/tests/demo-plugin-store.js +160 -113
  301. package/dist/src/plugins/tests/demo-plugin-store.js.map +1 -1
  302. package/dist/src/plugins/tests/standalone-test.js +223 -172
  303. package/dist/src/plugins/tests/standalone-test.js.map +1 -1
  304. package/dist/src/plugins/tests/test-plugin-store.js +228 -190
  305. package/dist/src/plugins/tests/test-plugin-store.js.map +1 -1
  306. package/dist/src/production/circuit-breaker.js +126 -62
  307. package/dist/src/production/circuit-breaker.js.map +1 -1
  308. package/dist/src/production/error-handler.js +156 -86
  309. package/dist/src/production/error-handler.js.map +1 -1
  310. package/dist/src/production/monitoring.js +220 -139
  311. package/dist/src/production/monitoring.js.map +1 -1
  312. package/dist/src/production/rate-limiter.js +93 -74
  313. package/dist/src/production/rate-limiter.js.map +1 -1
  314. package/dist/src/production/retry.js +167 -75
  315. package/dist/src/production/retry.js.map +1 -1
  316. package/dist/src/prompt.js +560 -436
  317. package/dist/src/prompt.js.map +1 -1
  318. package/dist/src/runtime/headless.js +289 -200
  319. package/dist/src/runtime/headless.js.map +1 -1
  320. package/dist/src/ruvector/agent-wasm.js +511 -0
  321. package/dist/src/ruvector/agent-wasm.js.map +1 -0
  322. package/dist/src/ruvector/ast-analyzer.js +232 -145
  323. package/dist/src/ruvector/ast-analyzer.js.map +1 -1
  324. package/dist/src/ruvector/coverage-router.js +419 -287
  325. package/dist/src/ruvector/coverage-router.js.map +1 -1
  326. package/dist/src/ruvector/coverage-tools.js +101 -56
  327. package/dist/src/ruvector/coverage-tools.js.map +1 -1
  328. package/dist/src/ruvector/diff-classifier.js +451 -324
  329. package/dist/src/ruvector/diff-classifier.js.map +1 -1
  330. package/dist/src/ruvector/enhanced-model-router.js +337 -251
  331. package/dist/src/ruvector/enhanced-model-router.js.map +1 -1
  332. package/dist/src/ruvector/flash-attention.js +254 -223
  333. package/dist/src/ruvector/flash-attention.js.map +1 -1
  334. package/dist/src/ruvector/graph-analyzer.js +680 -486
  335. package/dist/src/ruvector/graph-analyzer.js.map +1 -1
  336. package/dist/src/ruvector/index.js +113 -27
  337. package/dist/src/ruvector/index.js.map +1 -1
  338. package/dist/src/ruvector/lora-adapter.js +248 -155
  339. package/dist/src/ruvector/lora-adapter.js.map +1 -1
  340. package/dist/src/ruvector/model-router.js +248 -175
  341. package/dist/src/ruvector/model-router.js.map +1 -1
  342. package/dist/src/ruvector/moe-router.js +286 -228
  343. package/dist/src/ruvector/moe-router.js.map +1 -1
  344. package/dist/src/ruvector/q-learning-router.js +338 -257
  345. package/dist/src/ruvector/q-learning-router.js.map +1 -1
  346. package/dist/src/ruvector/ruvllm-wasm.js +527 -0
  347. package/dist/src/ruvector/ruvllm-wasm.js.map +1 -0
  348. package/dist/src/ruvector/semantic-router.js +67 -60
  349. package/dist/src/ruvector/semantic-router.js.map +1 -1
  350. package/dist/src/ruvector/vector-db.js +205 -119
  351. package/dist/src/ruvector/vector-db.js.map +1 -1
  352. package/dist/src/services/agentic-flow-bridge.js +168 -0
  353. package/dist/src/services/agentic-flow-bridge.js.map +1 -0
  354. package/dist/src/services/claim-service.js +940 -615
  355. package/dist/src/services/claim-service.js.map +1 -1
  356. package/dist/src/services/container-worker-pool.js +669 -399
  357. package/dist/src/services/container-worker-pool.js.map +1 -1
  358. package/dist/src/services/headless-worker-executor.js +467 -441
  359. package/dist/src/services/headless-worker-executor.js.map +1 -1
  360. package/dist/src/services/index.d.ts +5 -5
  361. package/dist/src/services/index.d.ts.map +1 -1
  362. package/dist/src/services/index.js +4 -4
  363. package/dist/src/services/index.js.map +1 -1
  364. package/dist/src/services/registry-api.js +201 -93
  365. package/dist/src/services/registry-api.js.map +1 -1
  366. package/dist/src/services/ruvector-training.js +414 -144
  367. package/dist/src/services/ruvector-training.js.map +1 -1
  368. package/dist/src/services/worker-daemon.js +928 -531
  369. package/dist/src/services/worker-daemon.js.map +1 -1
  370. package/dist/src/services/worker-queue.js +550 -331
  371. package/dist/src/services/worker-queue.js.map +1 -1
  372. package/dist/src/suggest.js +55 -45
  373. package/dist/src/suggest.js.map +1 -1
  374. package/dist/src/transfer/anonymization/index.js +37 -29
  375. package/dist/src/transfer/anonymization/index.js.map +1 -1
  376. package/dist/src/transfer/deploy-seraphine.d.ts +1 -1
  377. package/dist/src/transfer/deploy-seraphine.js +156 -129
  378. package/dist/src/transfer/deploy-seraphine.js.map +1 -1
  379. package/dist/src/transfer/export.js +142 -84
  380. package/dist/src/transfer/export.js.map +1 -1
  381. package/dist/src/transfer/index.d.ts +1 -1
  382. package/dist/src/transfer/index.d.ts.map +1 -1
  383. package/dist/src/transfer/index.js +2 -0
  384. package/dist/src/transfer/index.js.map +1 -1
  385. package/dist/src/transfer/ipfs/client.js +337 -179
  386. package/dist/src/transfer/ipfs/client.js.map +1 -1
  387. package/dist/src/transfer/ipfs/upload.js +434 -290
  388. package/dist/src/transfer/ipfs/upload.js.map +1 -1
  389. package/dist/src/transfer/models/seraphine.js +58 -58
  390. package/dist/src/transfer/models/seraphine.js.map +1 -1
  391. package/dist/src/transfer/serialization/cfp.js +37 -33
  392. package/dist/src/transfer/serialization/cfp.js.map +1 -1
  393. package/dist/src/transfer/storage/gcs.js +248 -139
  394. package/dist/src/transfer/storage/gcs.js.map +1 -1
  395. package/dist/src/transfer/store/discovery.js +353 -243
  396. package/dist/src/transfer/store/discovery.js.map +1 -1
  397. package/dist/src/transfer/store/download.js +365 -243
  398. package/dist/src/transfer/store/download.js.map +1 -1
  399. package/dist/src/transfer/store/index.js +130 -63
  400. package/dist/src/transfer/store/index.js.map +1 -1
  401. package/dist/src/transfer/store/publish.js +258 -184
  402. package/dist/src/transfer/store/publish.js.map +1 -1
  403. package/dist/src/transfer/store/registry.js +73 -51
  404. package/dist/src/transfer/store/registry.js.map +1 -1
  405. package/dist/src/transfer/store/search.js +96 -64
  406. package/dist/src/transfer/store/search.js.map +1 -1
  407. package/dist/src/transfer/store/tests/standalone-test.js +231 -174
  408. package/dist/src/transfer/store/tests/standalone-test.js.map +1 -1
  409. package/dist/src/transfer/test-seraphine.js +130 -95
  410. package/dist/src/transfer/test-seraphine.js.map +1 -1
  411. package/dist/src/transfer/tests/test-store.js +239 -194
  412. package/dist/src/transfer/tests/test-store.js.map +1 -1
  413. package/dist/src/types.js +56 -27
  414. package/dist/src/types.js.map +1 -1
  415. package/dist/src/update/checker.js +183 -106
  416. package/dist/src/update/checker.js.map +1 -1
  417. package/dist/src/update/executor.js +198 -135
  418. package/dist/src/update/executor.js.map +1 -1
  419. package/dist/src/update/index.js +85 -38
  420. package/dist/src/update/index.js.map +1 -1
  421. package/dist/src/update/rate-limiter.js +31 -19
  422. package/dist/src/update/rate-limiter.js.map +1 -1
  423. package/dist/src/update/validator.js +64 -38
  424. package/dist/src/update/validator.js.map +1 -1
  425. package/dist/tsconfig.tsbuildinfo +1 -1
  426. package/package.json +13 -10
  427. package/.claude/agents/custom/accessibility-auditor.yaml +0 -56
  428. package/.claude/agents/custom/design-architect.yaml +0 -48
  429. package/.claude/agents/custom/ui-developer.yaml +0 -46
  430. package/.claude/agents/custom/ux-researcher.yaml +0 -60
  431. package/dist/src/benchmarks/pretrain/index.d.ts +0 -58
  432. package/dist/src/benchmarks/pretrain/index.d.ts.map +0 -1
  433. package/dist/src/commands/index.d.ts +0 -108
  434. package/dist/src/commands/index.d.ts.map +0 -1
  435. package/dist/src/config-adapter.d.ts +0 -15
  436. package/dist/src/config-adapter.d.ts.map +0 -1
  437. package/dist/src/index.d.ts +0 -76
  438. package/dist/src/index.d.ts.map +0 -1
  439. package/dist/src/infrastructure/in-memory-repositories.d.ts +0 -68
  440. package/dist/src/infrastructure/in-memory-repositories.d.ts.map +0 -1
  441. package/dist/src/init/claudemd-generator.d.ts +0 -25
  442. package/dist/src/init/claudemd-generator.d.ts.map +0 -1
  443. package/dist/src/init/executor.d.ts +0 -41
  444. package/dist/src/init/executor.d.ts.map +0 -1
  445. package/dist/src/init/helpers-generator.d.ts +0 -60
  446. package/dist/src/init/helpers-generator.d.ts.map +0 -1
  447. package/dist/src/mcp-client.d.ts +0 -92
  448. package/dist/src/mcp-client.d.ts.map +0 -1
  449. package/dist/src/mcp-server.d.ts +0 -161
  450. package/dist/src/mcp-server.d.ts.map +0 -1
  451. package/dist/src/mcp-tools/auto-install.d.ts +0 -83
  452. package/dist/src/mcp-tools/auto-install.d.ts.map +0 -1
  453. package/dist/src/mcp-tools/types.d.ts +0 -31
  454. package/dist/src/mcp-tools/types.d.ts.map +0 -1
  455. package/dist/src/memory/ewc-consolidation.d.ts +0 -271
  456. package/dist/src/memory/ewc-consolidation.d.ts.map +0 -1
  457. package/dist/src/memory/intelligence.d.ts +0 -285
  458. package/dist/src/memory/intelligence.d.ts.map +0 -1
  459. package/dist/src/memory/memory-initializer.d.ts +0 -396
  460. package/dist/src/memory/memory-initializer.d.ts.map +0 -1
  461. package/dist/src/memory/sona-optimizer.d.ts +0 -227
  462. package/dist/src/memory/sona-optimizer.d.ts.map +0 -1
  463. package/dist/src/parser.d.ts +0 -41
  464. package/dist/src/parser.d.ts.map +0 -1
  465. package/dist/src/plugins/manager.d.ts +0 -133
  466. package/dist/src/plugins/manager.d.ts.map +0 -1
  467. package/dist/src/plugins/store/discovery.d.ts +0 -88
  468. package/dist/src/plugins/store/discovery.d.ts.map +0 -1
  469. package/dist/src/plugins/store/index.d.ts +0 -76
  470. package/dist/src/plugins/store/index.d.ts.map +0 -1
  471. package/dist/src/plugins/store/search.d.ts +0 -46
  472. package/dist/src/plugins/store/search.d.ts.map +0 -1
  473. package/dist/src/plugins/store/types.d.ts +0 -274
  474. package/dist/src/plugins/store/types.d.ts.map +0 -1
  475. package/dist/src/production/circuit-breaker.d.ts +0 -101
  476. package/dist/src/production/circuit-breaker.d.ts.map +0 -1
  477. package/dist/src/production/error-handler.d.ts +0 -92
  478. package/dist/src/production/error-handler.d.ts.map +0 -1
  479. package/dist/src/production/monitoring.d.ts +0 -161
  480. package/dist/src/production/monitoring.d.ts.map +0 -1
  481. package/dist/src/production/rate-limiter.d.ts +0 -80
  482. package/dist/src/production/rate-limiter.d.ts.map +0 -1
  483. package/dist/src/production/retry.d.ts +0 -48
  484. package/dist/src/production/retry.d.ts.map +0 -1
  485. package/dist/src/prompt.d.ts +0 -44
  486. package/dist/src/prompt.d.ts.map +0 -1
  487. package/dist/src/runtime/headless.d.ts +0 -60
  488. package/dist/src/runtime/headless.d.ts.map +0 -1
  489. package/dist/src/ruvector/ast-analyzer.d.ts +0 -67
  490. package/dist/src/ruvector/ast-analyzer.d.ts.map +0 -1
  491. package/dist/src/ruvector/coverage-router.d.ts +0 -160
  492. package/dist/src/ruvector/coverage-router.d.ts.map +0 -1
  493. package/dist/src/ruvector/diff-classifier.d.ts +0 -175
  494. package/dist/src/ruvector/diff-classifier.d.ts.map +0 -1
  495. package/dist/src/ruvector/enhanced-model-router.d.ts +0 -146
  496. package/dist/src/ruvector/enhanced-model-router.d.ts.map +0 -1
  497. package/dist/src/ruvector/flash-attention.d.ts +0 -195
  498. package/dist/src/ruvector/flash-attention.d.ts.map +0 -1
  499. package/dist/src/ruvector/graph-analyzer.d.ts +0 -187
  500. package/dist/src/ruvector/graph-analyzer.d.ts.map +0 -1
  501. package/dist/src/ruvector/index.d.ts +0 -34
  502. package/dist/src/ruvector/index.d.ts.map +0 -1
  503. package/dist/src/ruvector/lora-adapter.d.ts +0 -218
  504. package/dist/src/ruvector/lora-adapter.d.ts.map +0 -1
  505. package/dist/src/ruvector/model-router.d.ts +0 -220
  506. package/dist/src/ruvector/model-router.d.ts.map +0 -1
  507. package/dist/src/ruvector/moe-router.d.ts +0 -206
  508. package/dist/src/ruvector/moe-router.d.ts.map +0 -1
  509. package/dist/src/ruvector/q-learning-router.d.ts +0 -211
  510. package/dist/src/ruvector/q-learning-router.d.ts.map +0 -1
  511. package/dist/src/ruvector/semantic-router.d.ts +0 -77
  512. package/dist/src/ruvector/semantic-router.d.ts.map +0 -1
  513. package/dist/src/ruvector/vector-db.d.ts +0 -69
  514. package/dist/src/ruvector/vector-db.d.ts.map +0 -1
  515. package/dist/src/services/claim-service.d.ts +0 -204
  516. package/dist/src/services/claim-service.d.ts.map +0 -1
  517. package/dist/src/services/container-worker-pool.d.ts +0 -197
  518. package/dist/src/services/container-worker-pool.d.ts.map +0 -1
  519. package/dist/src/services/headless-worker-executor.d.ts +0 -304
  520. package/dist/src/services/headless-worker-executor.d.ts.map +0 -1
  521. package/dist/src/services/registry-api.d.ts +0 -58
  522. package/dist/src/services/registry-api.d.ts.map +0 -1
  523. package/dist/src/services/ruvector-training.d.ts +0 -213
  524. package/dist/src/services/ruvector-training.d.ts.map +0 -1
  525. package/dist/src/services/worker-daemon.d.ts +0 -203
  526. package/dist/src/services/worker-daemon.d.ts.map +0 -1
  527. package/dist/src/services/worker-queue.d.ts +0 -194
  528. package/dist/src/services/worker-queue.d.ts.map +0 -1
  529. package/dist/src/suggest.d.ts +0 -53
  530. package/dist/src/suggest.d.ts.map +0 -1
  531. package/dist/src/transfer/export.d.ts +0 -25
  532. package/dist/src/transfer/export.d.ts.map +0 -1
  533. package/dist/src/transfer/ipfs/client.d.ts +0 -109
  534. package/dist/src/transfer/ipfs/client.d.ts.map +0 -1
  535. package/dist/src/transfer/ipfs/upload.d.ts +0 -95
  536. package/dist/src/transfer/ipfs/upload.d.ts.map +0 -1
  537. package/dist/src/transfer/models/seraphine.d.ts +0 -72
  538. package/dist/src/transfer/models/seraphine.d.ts.map +0 -1
  539. package/dist/src/transfer/serialization/cfp.d.ts +0 -49
  540. package/dist/src/transfer/serialization/cfp.d.ts.map +0 -1
  541. package/dist/src/transfer/storage/gcs.d.ts +0 -82
  542. package/dist/src/transfer/storage/gcs.d.ts.map +0 -1
  543. package/dist/src/transfer/store/discovery.d.ts +0 -84
  544. package/dist/src/transfer/store/discovery.d.ts.map +0 -1
  545. package/dist/src/transfer/store/download.d.ts +0 -70
  546. package/dist/src/transfer/store/download.d.ts.map +0 -1
  547. package/dist/src/transfer/store/index.d.ts +0 -84
  548. package/dist/src/transfer/store/index.d.ts.map +0 -1
  549. package/dist/src/transfer/store/publish.d.ts +0 -76
  550. package/dist/src/transfer/store/publish.d.ts.map +0 -1
  551. package/dist/src/transfer/store/search.d.ts +0 -54
  552. package/dist/src/transfer/store/search.d.ts.map +0 -1
  553. package/dist/src/transfer/types.d.ts +0 -245
  554. package/dist/src/transfer/types.d.ts.map +0 -1
  555. package/dist/src/types.d.ts +0 -198
  556. package/dist/src/types.d.ts.map +0 -1
  557. package/dist/src/update/checker.d.ts +0 -34
  558. package/dist/src/update/checker.d.ts.map +0 -1
  559. package/dist/src/update/executor.d.ts +0 -32
  560. package/dist/src/update/executor.d.ts.map +0 -1
  561. package/dist/src/update/index.d.ts +0 -33
  562. package/dist/src/update/index.d.ts.map +0 -1
  563. package/dist/src/update/rate-limiter.d.ts +0 -20
  564. package/dist/src/update/rate-limiter.d.ts.map +0 -1
  565. package/dist/src/update/validator.d.ts +0 -17
  566. package/dist/src/update/validator.d.ts.map +0 -1
@@ -2,6 +2,42 @@
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
+ };
5
41
  import { output } from '../../output.js';
6
42
  import { confirm } from '../../prompt.js';
7
43
  /**
@@ -15,32 +51,32 @@ function getConnectionConfig(ctx) {
15
51
  user: ctx.flags.user || process.env.PGUSER || 'postgres',
16
52
  password: ctx.flags.password || process.env.PGPASSWORD || '',
17
53
  ssl: ctx.flags.ssl || process.env.PGSSLMODE === 'require',
18
- schema: ctx.flags.schema || 'claude_flow',
54
+ schema: ctx.flags.schema || 'claude_flow'
19
55
  };
20
56
  }
21
57
  /**
22
58
  * Generate random vector
23
59
  */
24
60
  function generateRandomVector(dimensions) {
25
- const vector = [];
26
- for (let i = 0; i < dimensions; i++) {
61
+ var vector = [];
62
+ for (var i = 0; i < dimensions; i++) {
27
63
  vector.push(Math.random() * 2 - 1);
28
64
  }
29
65
  // Normalize
30
- const magnitude = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));
31
- return vector.map(v => v / magnitude);
66
+ var magnitude = Math.sqrt(vector.reduce(function (sum, v) { return sum + v * v; }, 0));
67
+ return vector.map(function (v) { return v / magnitude; });
32
68
  }
33
69
  /**
34
70
  * Calculate percentile from sorted array
35
71
  */
36
72
  function percentile(sortedArr, p) {
37
- const index = Math.ceil((p / 100) * sortedArr.length) - 1;
73
+ var index = Math.ceil((p / 100) * sortedArr.length) - 1;
38
74
  return sortedArr[Math.max(0, index)];
39
75
  }
40
76
  /**
41
77
  * RuVector benchmark command
42
78
  */
43
- export const benchmarkCommand = {
79
+ export var benchmarkCommand = {
44
80
  name: 'benchmark',
45
81
  description: 'Performance benchmarking',
46
82
  options: [
@@ -49,98 +85,98 @@ export const benchmarkCommand = {
49
85
  short: 'n',
50
86
  description: 'Number of test vectors',
51
87
  type: 'number',
52
- default: 10000,
88
+ "default": 10000
53
89
  },
54
90
  {
55
91
  name: 'dimensions',
56
92
  short: 'd',
57
93
  description: 'Vector dimensions',
58
94
  type: 'number',
59
- default: 1536,
95
+ "default": 1536
60
96
  },
61
97
  {
62
98
  name: 'queries',
63
99
  short: 'q',
64
100
  description: 'Number of test queries',
65
101
  type: 'number',
66
- default: 100,
102
+ "default": 100
67
103
  },
68
104
  {
69
105
  name: 'k',
70
106
  description: 'Top-k results to retrieve',
71
107
  type: 'number',
72
- default: 10,
108
+ "default": 10
73
109
  },
74
110
  {
75
111
  name: 'metric',
76
112
  short: 'm',
77
113
  description: 'Distance metric',
78
114
  type: 'string',
79
- default: 'cosine',
80
- choices: ['cosine', 'l2', 'inner'],
115
+ "default": 'cosine',
116
+ choices: ['cosine', 'l2', 'inner']
81
117
  },
82
118
  {
83
119
  name: 'index',
84
120
  short: 'i',
85
121
  description: 'Index type to test',
86
122
  type: 'string',
87
- default: 'hnsw',
88
- choices: ['hnsw', 'ivfflat', 'none'],
123
+ "default": 'hnsw',
124
+ choices: ['hnsw', 'ivfflat', 'none']
89
125
  },
90
126
  {
91
127
  name: 'batch-size',
92
128
  description: 'Batch size for inserts',
93
129
  type: 'number',
94
- default: 1000,
130
+ "default": 1000
95
131
  },
96
132
  {
97
133
  name: 'cleanup',
98
134
  description: 'Clean up test data after benchmark',
99
135
  type: 'boolean',
100
- default: true,
136
+ "default": true
101
137
  },
102
138
  {
103
139
  name: 'host',
104
140
  short: 'h',
105
141
  description: 'PostgreSQL host',
106
142
  type: 'string',
107
- default: 'localhost',
143
+ "default": 'localhost'
108
144
  },
109
145
  {
110
146
  name: 'port',
111
147
  short: 'p',
112
148
  description: 'PostgreSQL port',
113
149
  type: 'number',
114
- default: 5432,
150
+ "default": 5432
115
151
  },
116
152
  {
117
153
  name: 'database',
118
154
  description: 'Database name',
119
- type: 'string',
155
+ type: 'string'
120
156
  },
121
157
  {
122
158
  name: 'user',
123
159
  short: 'u',
124
160
  description: 'Database user',
125
- type: 'string',
161
+ type: 'string'
126
162
  },
127
163
  {
128
164
  name: 'password',
129
165
  description: 'Database password',
130
- type: 'string',
166
+ type: 'string'
131
167
  },
132
168
  {
133
169
  name: 'ssl',
134
170
  description: 'Enable SSL',
135
171
  type: 'boolean',
136
- default: false,
172
+ "default": false
137
173
  },
138
174
  {
139
175
  name: 'schema',
140
176
  short: 's',
141
177
  description: 'Schema name',
142
178
  type: 'string',
143
- default: 'claude_flow',
179
+ "default": 'claude_flow'
144
180
  },
145
181
  ],
146
182
  examples: [
@@ -149,332 +185,348 @@ export const benchmarkCommand = {
149
185
  { command: 'claude-flow ruvector benchmark --index ivfflat', description: 'Test IVFFlat index' },
150
186
  { command: 'claude-flow ruvector benchmark --dimensions 768 --metric l2', description: 'Custom dimensions and metric' },
151
187
  ],
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
- ],
186
- });
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');
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*/];
212
527
  }
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
- },
528
+ });
529
+ }); }
478
530
  };
479
531
  export default benchmarkCommand;
480
532
  //# sourceMappingURL=benchmark.js.map