agent-nuvira 1.14.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 (379) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +891 -0
  3. package/dist/agent-sdk/src/agent.d.ts +118 -0
  4. package/dist/agent-sdk/src/agent.d.ts.map +1 -0
  5. package/dist/agent-sdk/src/agent.js +88 -0
  6. package/dist/agent-sdk/src/agent.js.map +1 -0
  7. package/dist/agent-sdk/src/index.d.ts +33 -0
  8. package/dist/agent-sdk/src/index.d.ts.map +1 -0
  9. package/dist/agent-sdk/src/index.js +32 -0
  10. package/dist/agent-sdk/src/index.js.map +1 -0
  11. package/dist/agent-sdk/src/register.d.ts +70 -0
  12. package/dist/agent-sdk/src/register.d.ts.map +1 -0
  13. package/dist/agent-sdk/src/register.js +181 -0
  14. package/dist/agent-sdk/src/register.js.map +1 -0
  15. package/dist/agent-sdk/src/scaffold.d.ts +50 -0
  16. package/dist/agent-sdk/src/scaffold.d.ts.map +1 -0
  17. package/dist/agent-sdk/src/scaffold.js +291 -0
  18. package/dist/agent-sdk/src/scaffold.js.map +1 -0
  19. package/dist/agent-sdk/src/testing.d.ts +187 -0
  20. package/dist/agent-sdk/src/testing.d.ts.map +1 -0
  21. package/dist/agent-sdk/src/testing.js +243 -0
  22. package/dist/agent-sdk/src/testing.js.map +1 -0
  23. package/dist/agent-sdk/src/types.d.ts +202 -0
  24. package/dist/agent-sdk/src/types.d.ts.map +1 -0
  25. package/dist/agent-sdk/src/types.js +11 -0
  26. package/dist/agent-sdk/src/types.js.map +1 -0
  27. package/dist/agents/agent.d.ts +132 -0
  28. package/dist/agents/agent.d.ts.map +1 -0
  29. package/dist/agents/agent.js +19 -0
  30. package/dist/agents/agent.js.map +1 -0
  31. package/dist/agents/agents/context-gatherer.d.ts +42 -0
  32. package/dist/agents/agents/context-gatherer.d.ts.map +1 -0
  33. package/dist/agents/agents/context-gatherer.js +366 -0
  34. package/dist/agents/agents/context-gatherer.js.map +1 -0
  35. package/dist/agents/agents/debugger.d.ts +58 -0
  36. package/dist/agents/agents/debugger.d.ts.map +1 -0
  37. package/dist/agents/agents/debugger.js +257 -0
  38. package/dist/agents/agents/debugger.js.map +1 -0
  39. package/dist/agents/agents/git-agent.d.ts +34 -0
  40. package/dist/agents/agents/git-agent.d.ts.map +1 -0
  41. package/dist/agents/agents/git-agent.js +200 -0
  42. package/dist/agents/agents/git-agent.js.map +1 -0
  43. package/dist/agents/agents/github-release-agent.d.ts +65 -0
  44. package/dist/agents/agents/github-release-agent.d.ts.map +1 -0
  45. package/dist/agents/agents/github-release-agent.js +439 -0
  46. package/dist/agents/agents/github-release-agent.js.map +1 -0
  47. package/dist/agents/agents/package-agent.d.ts +33 -0
  48. package/dist/agents/agents/package-agent.d.ts.map +1 -0
  49. package/dist/agents/agents/package-agent.js +233 -0
  50. package/dist/agents/agents/package-agent.js.map +1 -0
  51. package/dist/agents/agents/planner.d.ts +26 -0
  52. package/dist/agents/agents/planner.d.ts.map +1 -0
  53. package/dist/agents/agents/planner.js +222 -0
  54. package/dist/agents/agents/planner.js.map +1 -0
  55. package/dist/agents/agents/reviewer.d.ts +34 -0
  56. package/dist/agents/agents/reviewer.d.ts.map +1 -0
  57. package/dist/agents/agents/reviewer.js +159 -0
  58. package/dist/agents/agents/reviewer.js.map +1 -0
  59. package/dist/agents/agents/runner.d.ts +73 -0
  60. package/dist/agents/agents/runner.d.ts.map +1 -0
  61. package/dist/agents/agents/runner.js +299 -0
  62. package/dist/agents/agents/runner.js.map +1 -0
  63. package/dist/agents/agents/security-agent.d.ts +33 -0
  64. package/dist/agents/agents/security-agent.d.ts.map +1 -0
  65. package/dist/agents/agents/security-agent.js +184 -0
  66. package/dist/agents/agents/security-agent.js.map +1 -0
  67. package/dist/agents/agents/tester.d.ts +96 -0
  68. package/dist/agents/agents/tester.d.ts.map +1 -0
  69. package/dist/agents/agents/tester.js +410 -0
  70. package/dist/agents/agents/tester.js.map +1 -0
  71. package/dist/agents/agents/writer.d.ts +51 -0
  72. package/dist/agents/agents/writer.d.ts.map +1 -0
  73. package/dist/agents/agents/writer.js +384 -0
  74. package/dist/agents/agents/writer.js.map +1 -0
  75. package/dist/agents/context-vault.d.ts +49 -0
  76. package/dist/agents/context-vault.d.ts.map +1 -0
  77. package/dist/agents/context-vault.js +134 -0
  78. package/dist/agents/context-vault.js.map +1 -0
  79. package/dist/agents/orchestrator.d.ts +97 -0
  80. package/dist/agents/orchestrator.d.ts.map +1 -0
  81. package/dist/agents/orchestrator.js +696 -0
  82. package/dist/agents/orchestrator.js.map +1 -0
  83. package/dist/agents/utils/file-tree.d.ts +28 -0
  84. package/dist/agents/utils/file-tree.d.ts.map +1 -0
  85. package/dist/agents/utils/file-tree.js +93 -0
  86. package/dist/agents/utils/file-tree.js.map +1 -0
  87. package/dist/cli/agent.d.ts +25 -0
  88. package/dist/cli/agent.d.ts.map +1 -0
  89. package/dist/cli/agent.js +374 -0
  90. package/dist/cli/agent.js.map +1 -0
  91. package/dist/cli/benchmark.d.ts +24 -0
  92. package/dist/cli/benchmark.d.ts.map +1 -0
  93. package/dist/cli/benchmark.js +235 -0
  94. package/dist/cli/benchmark.js.map +1 -0
  95. package/dist/cli/cache.d.ts +12 -0
  96. package/dist/cli/cache.d.ts.map +1 -0
  97. package/dist/cli/cache.js +58 -0
  98. package/dist/cli/cache.js.map +1 -0
  99. package/dist/cli/chat.d.ts +37 -0
  100. package/dist/cli/chat.d.ts.map +1 -0
  101. package/dist/cli/chat.js +393 -0
  102. package/dist/cli/chat.js.map +1 -0
  103. package/dist/cli/commands.d.ts +24 -0
  104. package/dist/cli/commands.d.ts.map +1 -0
  105. package/dist/cli/commands.js +18 -0
  106. package/dist/cli/commands.js.map +1 -0
  107. package/dist/cli/config.d.ts +19 -0
  108. package/dist/cli/config.d.ts.map +1 -0
  109. package/dist/cli/config.js +162 -0
  110. package/dist/cli/config.js.map +1 -0
  111. package/dist/cli/dashboard.d.ts +34 -0
  112. package/dist/cli/dashboard.d.ts.map +1 -0
  113. package/dist/cli/dashboard.js +126 -0
  114. package/dist/cli/dashboard.js.map +1 -0
  115. package/dist/cli/doctor.d.ts +68 -0
  116. package/dist/cli/doctor.d.ts.map +1 -0
  117. package/dist/cli/doctor.js +585 -0
  118. package/dist/cli/doctor.js.map +1 -0
  119. package/dist/cli/edit.d.ts +11 -0
  120. package/dist/cli/edit.d.ts.map +1 -0
  121. package/dist/cli/edit.js +86 -0
  122. package/dist/cli/edit.js.map +1 -0
  123. package/dist/cli/execute.d.ts +25 -0
  124. package/dist/cli/execute.d.ts.map +1 -0
  125. package/dist/cli/execute.js +186 -0
  126. package/dist/cli/execute.js.map +1 -0
  127. package/dist/cli/federation.d.ts +31 -0
  128. package/dist/cli/federation.d.ts.map +1 -0
  129. package/dist/cli/federation.js +387 -0
  130. package/dist/cli/federation.js.map +1 -0
  131. package/dist/cli/history.d.ts +22 -0
  132. package/dist/cli/history.d.ts.map +1 -0
  133. package/dist/cli/history.js +140 -0
  134. package/dist/cli/history.js.map +1 -0
  135. package/dist/cli/init.d.ts +49 -0
  136. package/dist/cli/init.d.ts.map +1 -0
  137. package/dist/cli/init.js +423 -0
  138. package/dist/cli/init.js.map +1 -0
  139. package/dist/cli/learn.d.ts +31 -0
  140. package/dist/cli/learn.d.ts.map +1 -0
  141. package/dist/cli/learn.js +320 -0
  142. package/dist/cli/learn.js.map +1 -0
  143. package/dist/cli/memory.d.ts +38 -0
  144. package/dist/cli/memory.d.ts.map +1 -0
  145. package/dist/cli/memory.js +295 -0
  146. package/dist/cli/memory.js.map +1 -0
  147. package/dist/cli/model-picker.d.ts +18 -0
  148. package/dist/cli/model-picker.d.ts.map +1 -0
  149. package/dist/cli/model-picker.js +225 -0
  150. package/dist/cli/model-picker.js.map +1 -0
  151. package/dist/cli/models.d.ts +11 -0
  152. package/dist/cli/models.d.ts.map +1 -0
  153. package/dist/cli/models.js +132 -0
  154. package/dist/cli/models.js.map +1 -0
  155. package/dist/cli/plan.d.ts +11 -0
  156. package/dist/cli/plan.d.ts.map +1 -0
  157. package/dist/cli/plan.js +94 -0
  158. package/dist/cli/plan.js.map +1 -0
  159. package/dist/cli/plugins.d.ts +15 -0
  160. package/dist/cli/plugins.d.ts.map +1 -0
  161. package/dist/cli/plugins.js +123 -0
  162. package/dist/cli/plugins.js.map +1 -0
  163. package/dist/cli/router.d.ts +20 -0
  164. package/dist/cli/router.d.ts.map +1 -0
  165. package/dist/cli/router.js +142 -0
  166. package/dist/cli/router.js.map +1 -0
  167. package/dist/cli/run.d.ts +22 -0
  168. package/dist/cli/run.d.ts.map +1 -0
  169. package/dist/cli/run.js +110 -0
  170. package/dist/cli/run.js.map +1 -0
  171. package/dist/cli/sandbox.d.ts +27 -0
  172. package/dist/cli/sandbox.d.ts.map +1 -0
  173. package/dist/cli/sandbox.js +264 -0
  174. package/dist/cli/sandbox.js.map +1 -0
  175. package/dist/cli/sdk.d.ts +27 -0
  176. package/dist/cli/sdk.d.ts.map +1 -0
  177. package/dist/cli/sdk.js +204 -0
  178. package/dist/cli/sdk.js.map +1 -0
  179. package/dist/cli/stats.d.ts +18 -0
  180. package/dist/cli/stats.d.ts.map +1 -0
  181. package/dist/cli/stats.js +78 -0
  182. package/dist/cli/stats.js.map +1 -0
  183. package/dist/cli/team.d.ts +42 -0
  184. package/dist/cli/team.d.ts.map +1 -0
  185. package/dist/cli/team.js +473 -0
  186. package/dist/cli/team.js.map +1 -0
  187. package/dist/cli/workflow.d.ts +27 -0
  188. package/dist/cli/workflow.d.ts.map +1 -0
  189. package/dist/cli/workflow.js +347 -0
  190. package/dist/cli/workflow.js.map +1 -0
  191. package/dist/config/manager.d.ts +37 -0
  192. package/dist/config/manager.d.ts.map +1 -0
  193. package/dist/config/manager.js +147 -0
  194. package/dist/config/manager.js.map +1 -0
  195. package/dist/config/types.d.ts +53 -0
  196. package/dist/config/types.d.ts.map +1 -0
  197. package/dist/config/types.js +2 -0
  198. package/dist/config/types.js.map +1 -0
  199. package/dist/context/cache.d.ts +27 -0
  200. package/dist/context/cache.d.ts.map +1 -0
  201. package/dist/context/cache.js +116 -0
  202. package/dist/context/cache.js.map +1 -0
  203. package/dist/context/history.d.ts +87 -0
  204. package/dist/context/history.d.ts.map +1 -0
  205. package/dist/context/history.js +249 -0
  206. package/dist/context/history.js.map +1 -0
  207. package/dist/context/parser.d.ts +61 -0
  208. package/dist/context/parser.d.ts.map +1 -0
  209. package/dist/context/parser.js +194 -0
  210. package/dist/context/parser.js.map +1 -0
  211. package/dist/federation/client.d.ts +49 -0
  212. package/dist/federation/client.d.ts.map +1 -0
  213. package/dist/federation/client.js +239 -0
  214. package/dist/federation/client.js.map +1 -0
  215. package/dist/federation/protocol.d.ts +155 -0
  216. package/dist/federation/protocol.d.ts.map +1 -0
  217. package/dist/federation/protocol.js +57 -0
  218. package/dist/federation/protocol.js.map +1 -0
  219. package/dist/federation/server.d.ts +25 -0
  220. package/dist/federation/server.d.ts.map +1 -0
  221. package/dist/federation/server.js +401 -0
  222. package/dist/federation/server.js.map +1 -0
  223. package/dist/index.d.ts +67 -0
  224. package/dist/index.d.ts.map +1 -0
  225. package/dist/index.js +93 -0
  226. package/dist/index.js.map +1 -0
  227. package/dist/inference/factory.d.ts +20 -0
  228. package/dist/inference/factory.d.ts.map +1 -0
  229. package/dist/inference/factory.js +46 -0
  230. package/dist/inference/factory.js.map +1 -0
  231. package/dist/inference/gemini-adapter.d.ts +17 -0
  232. package/dist/inference/gemini-adapter.d.ts.map +1 -0
  233. package/dist/inference/gemini-adapter.js +176 -0
  234. package/dist/inference/gemini-adapter.js.map +1 -0
  235. package/dist/inference/groq-adapter.d.ts +17 -0
  236. package/dist/inference/groq-adapter.d.ts.map +1 -0
  237. package/dist/inference/groq-adapter.js +103 -0
  238. package/dist/inference/groq-adapter.js.map +1 -0
  239. package/dist/inference/interface.d.ts +49 -0
  240. package/dist/inference/interface.d.ts.map +1 -0
  241. package/dist/inference/interface.js +2 -0
  242. package/dist/inference/interface.js.map +1 -0
  243. package/dist/inference/local-adapter.d.ts +35 -0
  244. package/dist/inference/local-adapter.d.ts.map +1 -0
  245. package/dist/inference/local-adapter.js +311 -0
  246. package/dist/inference/local-adapter.js.map +1 -0
  247. package/dist/inference/model-catalog.d.ts +53 -0
  248. package/dist/inference/model-catalog.d.ts.map +1 -0
  249. package/dist/inference/model-catalog.js +306 -0
  250. package/dist/inference/model-catalog.js.map +1 -0
  251. package/dist/inference/nim-adapter.d.ts +17 -0
  252. package/dist/inference/nim-adapter.d.ts.map +1 -0
  253. package/dist/inference/nim-adapter.js +103 -0
  254. package/dist/inference/nim-adapter.js.map +1 -0
  255. package/dist/inference/openrouter-adapter.d.ts +17 -0
  256. package/dist/inference/openrouter-adapter.d.ts.map +1 -0
  257. package/dist/inference/openrouter-adapter.js +105 -0
  258. package/dist/inference/openrouter-adapter.js.map +1 -0
  259. package/dist/inference/sse.d.ts +20 -0
  260. package/dist/inference/sse.d.ts.map +1 -0
  261. package/dist/inference/sse.js +91 -0
  262. package/dist/inference/sse.js.map +1 -0
  263. package/dist/learning/agent-stats.d.ts +109 -0
  264. package/dist/learning/agent-stats.d.ts.map +1 -0
  265. package/dist/learning/agent-stats.js +240 -0
  266. package/dist/learning/agent-stats.js.map +1 -0
  267. package/dist/learning/benchmark.d.ts +161 -0
  268. package/dist/learning/benchmark.d.ts.map +1 -0
  269. package/dist/learning/benchmark.js +589 -0
  270. package/dist/learning/benchmark.js.map +1 -0
  271. package/dist/learning/cost-tracker.d.ts +101 -0
  272. package/dist/learning/cost-tracker.d.ts.map +1 -0
  273. package/dist/learning/cost-tracker.js +224 -0
  274. package/dist/learning/cost-tracker.js.map +1 -0
  275. package/dist/learning/feedback.d.ts +88 -0
  276. package/dist/learning/feedback.d.ts.map +1 -0
  277. package/dist/learning/feedback.js +169 -0
  278. package/dist/learning/feedback.js.map +1 -0
  279. package/dist/learning/hybrid-router.d.ts +201 -0
  280. package/dist/learning/hybrid-router.d.ts.map +1 -0
  281. package/dist/learning/hybrid-router.js +450 -0
  282. package/dist/learning/hybrid-router.js.map +1 -0
  283. package/dist/learning/model-compare.d.ts +76 -0
  284. package/dist/learning/model-compare.d.ts.map +1 -0
  285. package/dist/learning/model-compare.js +252 -0
  286. package/dist/learning/model-compare.js.map +1 -0
  287. package/dist/learning/model-router.d.ts +68 -0
  288. package/dist/learning/model-router.d.ts.map +1 -0
  289. package/dist/learning/model-router.js +140 -0
  290. package/dist/learning/model-router.js.map +1 -0
  291. package/dist/learning/pattern-extractor.d.ts +99 -0
  292. package/dist/learning/pattern-extractor.d.ts.map +1 -0
  293. package/dist/learning/pattern-extractor.js +310 -0
  294. package/dist/learning/pattern-extractor.js.map +1 -0
  295. package/dist/learning/scorer.d.ts +51 -0
  296. package/dist/learning/scorer.d.ts.map +1 -0
  297. package/dist/learning/scorer.js +64 -0
  298. package/dist/learning/scorer.js.map +1 -0
  299. package/dist/learning/self-improver.d.ts +48 -0
  300. package/dist/learning/self-improver.d.ts.map +1 -0
  301. package/dist/learning/self-improver.js +161 -0
  302. package/dist/learning/self-improver.js.map +1 -0
  303. package/dist/memory/embedder.d.ts +65 -0
  304. package/dist/memory/embedder.d.ts.map +1 -0
  305. package/dist/memory/embedder.js +424 -0
  306. package/dist/memory/embedder.js.map +1 -0
  307. package/dist/memory/memory-integration.d.ts +56 -0
  308. package/dist/memory/memory-integration.d.ts.map +1 -0
  309. package/dist/memory/memory-integration.js +95 -0
  310. package/dist/memory/memory-integration.js.map +1 -0
  311. package/dist/memory/trajectory-store.d.ts +149 -0
  312. package/dist/memory/trajectory-store.d.ts.map +1 -0
  313. package/dist/memory/trajectory-store.js +476 -0
  314. package/dist/memory/trajectory-store.js.map +1 -0
  315. package/dist/memory/vector-store.d.ts +78 -0
  316. package/dist/memory/vector-store.d.ts.map +1 -0
  317. package/dist/memory/vector-store.js +186 -0
  318. package/dist/memory/vector-store.js.map +1 -0
  319. package/dist/plugins/agent-plugin.d.ts +73 -0
  320. package/dist/plugins/agent-plugin.d.ts.map +1 -0
  321. package/dist/plugins/agent-plugin.js +199 -0
  322. package/dist/plugins/agent-plugin.js.map +1 -0
  323. package/dist/plugins/registry.d.ts +61 -0
  324. package/dist/plugins/registry.d.ts.map +1 -0
  325. package/dist/plugins/registry.js +67 -0
  326. package/dist/plugins/registry.js.map +1 -0
  327. package/dist/sandbox/images.d.ts +31 -0
  328. package/dist/sandbox/images.d.ts.map +1 -0
  329. package/dist/sandbox/images.js +129 -0
  330. package/dist/sandbox/images.js.map +1 -0
  331. package/dist/sandbox/manager.d.ts +134 -0
  332. package/dist/sandbox/manager.d.ts.map +1 -0
  333. package/dist/sandbox/manager.js +470 -0
  334. package/dist/sandbox/manager.js.map +1 -0
  335. package/dist/sandbox/types.d.ts +113 -0
  336. package/dist/sandbox/types.d.ts.map +1 -0
  337. package/dist/sandbox/types.js +107 -0
  338. package/dist/sandbox/types.js.map +1 -0
  339. package/dist/security/scanner.d.ts +53 -0
  340. package/dist/security/scanner.d.ts.map +1 -0
  341. package/dist/security/scanner.js +271 -0
  342. package/dist/security/scanner.js.map +1 -0
  343. package/dist/team/config.d.ts +50 -0
  344. package/dist/team/config.d.ts.map +1 -0
  345. package/dist/team/config.js +108 -0
  346. package/dist/team/config.js.map +1 -0
  347. package/dist/team/memory.d.ts +63 -0
  348. package/dist/team/memory.d.ts.map +1 -0
  349. package/dist/team/memory.js +282 -0
  350. package/dist/team/memory.js.map +1 -0
  351. package/dist/team/review.d.ts +123 -0
  352. package/dist/team/review.d.ts.map +1 -0
  353. package/dist/team/review.js +293 -0
  354. package/dist/team/review.js.map +1 -0
  355. package/dist/utils/env.d.ts +19 -0
  356. package/dist/utils/env.d.ts.map +1 -0
  357. package/dist/utils/env.js +250 -0
  358. package/dist/utils/env.js.map +1 -0
  359. package/dist/utils/logger.d.ts +11 -0
  360. package/dist/utils/logger.d.ts.map +1 -0
  361. package/dist/utils/logger.js +45 -0
  362. package/dist/utils/logger.js.map +1 -0
  363. package/dist/web-dashboard/server.d.ts +59 -0
  364. package/dist/web-dashboard/server.d.ts.map +1 -0
  365. package/dist/web-dashboard/server.js +418 -0
  366. package/dist/web-dashboard/server.js.map +1 -0
  367. package/dist/workflow/registry.d.ts +127 -0
  368. package/dist/workflow/registry.d.ts.map +1 -0
  369. package/dist/workflow/registry.js +482 -0
  370. package/dist/workflow/registry.js.map +1 -0
  371. package/dist/workflow/templates.d.ts +93 -0
  372. package/dist/workflow/templates.d.ts.map +1 -0
  373. package/dist/workflow/templates.js +481 -0
  374. package/dist/workflow/templates.js.map +1 -0
  375. package/package.json +78 -0
  376. package/src/web-dashboard/public/assets/index-B08nDkSB.css +1 -0
  377. package/src/web-dashboard/public/assets/index-BKL8YOFD.js +135 -0
  378. package/src/web-dashboard/public/assets/index-BKL8YOFD.js.map +1 -0
  379. package/src/web-dashboard/public/index.html +13 -0
@@ -0,0 +1,589 @@
1
+ /**
2
+ * Benchmark — Standardized model benchmarking system for coding tasks.
3
+ *
4
+ * Runs a suite of coding tasks against configured providers/models and
5
+ * measures: success rate, output quality, latency, and cost.
6
+ *
7
+ * Usage:
8
+ * buff benchmark — Run all tasks against default provider
9
+ * buff benchmark --provider groq — Run against a specific provider
10
+ * buff benchmark --model llama-3.3-70b — Run against a specific model
11
+ * buff benchmark --tasks quick — Run only quick tasks
12
+ * buff benchmark --budget 0.50 — Stop if costs exceed $0.50
13
+ * buff benchmark list — List available benchmark tasks
14
+ * buff benchmark results — Show previous benchmark results
15
+ *
16
+ * Results stored in: ~/.buff/memory/benchmarks.json
17
+ */
18
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
19
+ import { join } from 'node:path';
20
+ import { homedir } from 'node:os';
21
+ import { estimateTokens, calculateCost } from './cost-tracker.js';
22
+ import { logger } from '../utils/logger.js';
23
+ // ─── Benchmark Tasks ────────────────────────────────────────────────────────
24
+ const BENCHMARK_TASKS = [
25
+ // ── Easy: Code Generation ─────────────────────────────────────────────
26
+ {
27
+ id: 'hello-world',
28
+ title: 'Hello World Function',
29
+ tag: 'code-generation',
30
+ difficulty: 'easy',
31
+ prompt: 'Write a JavaScript function called `greet` that takes a name parameter and returns "Hello, {name}!". Include a default parameter value.',
32
+ expectedPatterns: ['function greet', 'Hello,', 'default'],
33
+ maxExpectedTokens: 150,
34
+ timeEstimate: 'quick',
35
+ outputLanguage: 'javascript',
36
+ },
37
+ {
38
+ id: 'fibonacci',
39
+ title: 'Fibonacci Sequence',
40
+ tag: 'code-generation',
41
+ difficulty: 'easy',
42
+ prompt: 'Write a Python function `fibonacci(n)` that returns the nth Fibonacci number using recursion. Include a comment explaining the base case.',
43
+ expectedPatterns: ['def fibonacci', 'return', '#'],
44
+ maxExpectedTokens: 200,
45
+ timeEstimate: 'quick',
46
+ outputLanguage: 'python',
47
+ },
48
+ {
49
+ id: 'fizzbuzz',
50
+ title: 'FizzBuzz Implementation',
51
+ tag: 'code-generation',
52
+ difficulty: 'easy',
53
+ prompt: 'Write a TypeScript function `fizzBuzz(n)` that prints numbers 1 to n, replacing multiples of 3 with "Fizz", multiples of 5 with "Buzz", and multiples of both with "FizzBuzz".',
54
+ expectedPatterns: ['Fizz', 'Buzz', 'FizzBuzz', 'function fizzBuzz'],
55
+ maxExpectedTokens: 300,
56
+ timeEstimate: 'quick',
57
+ outputLanguage: 'typescript',
58
+ },
59
+ // ── Medium: Code Generation ───────────────────────────────────────────
60
+ {
61
+ id: 'express-api',
62
+ title: 'Express.js API Route',
63
+ tag: 'code-generation',
64
+ difficulty: 'medium',
65
+ prompt: 'Create an Express.js route handler for a REST API endpoint that handles POST requests to /api/users. It should validate that the request body has "name" and "email" fields, and return a 201 status with the user object. Include error handling for missing fields (400 status).',
66
+ expectedPatterns: ['app.post', '/api/users', 'res.status', 'name', 'email'],
67
+ maxExpectedTokens: 500,
68
+ timeEstimate: 'medium',
69
+ outputLanguage: 'javascript',
70
+ },
71
+ {
72
+ id: 'typescript-generics',
73
+ title: 'TypeScript Generics',
74
+ tag: 'code-generation',
75
+ difficulty: 'medium',
76
+ prompt: 'Write a TypeScript generic function `mergeObjects<T, U>(obj1: T, obj2: U): T & U` that merges two objects. Then write a type-safe function `getProperty<T, K extends keyof T>(obj: T, key: K): T[K]`.',
77
+ expectedPatterns: ['<T,', 'extends', 'keyof', 'T & U'],
78
+ maxExpectedTokens: 400,
79
+ timeEstimate: 'medium',
80
+ outputLanguage: 'typescript',
81
+ },
82
+ {
83
+ id: 'react-component',
84
+ title: 'React Component',
85
+ tag: 'code-generation',
86
+ difficulty: 'medium',
87
+ prompt: 'Write a React TypeScript component called `UserList` that fetches users from `https://jsonplaceholder.typicode.com/users` using useEffect and useState. Display loading, error, and success states. Include proper TypeScript interfaces.',
88
+ expectedPatterns: ['useState', 'useEffect', 'interface', 'fetch', 'UserList'],
89
+ maxExpectedTokens: 600,
90
+ timeEstimate: 'medium',
91
+ outputLanguage: 'typescript',
92
+ },
93
+ // ── Refactoring ───────────────────────────────────────────────────────
94
+ {
95
+ id: 'refactor-callback',
96
+ title: 'Callback to Async/Await',
97
+ tag: 'refactoring',
98
+ difficulty: 'medium',
99
+ prompt: 'Refactor this callback-based function to use async/await:\n\nfunction getUserData(userId, callback) {\n getUser(userId, (err, user) => {\n if (err) return callback(err);\n getPosts(user.id, (err, posts) => {\n if (err) return callback(err);\n getComments(posts[0].id, (err, comments) => {\n if (err) return callback(err);\n callback(null, { user, posts, comments });\n });\n });\n });\n}',
100
+ expectedPatterns: ['async', 'await', 'try', 'catch'],
101
+ antiPatterns: ['callback'],
102
+ maxExpectedTokens: 400,
103
+ timeEstimate: 'medium',
104
+ outputLanguage: 'javascript',
105
+ },
106
+ {
107
+ id: 'refactor-class-to-func',
108
+ title: 'Class to Functional Component',
109
+ tag: 'refactoring',
110
+ difficulty: 'medium',
111
+ prompt: 'Refactor this React class component to a functional component with hooks:\n\nclass Counter extends React.Component {\n constructor(props) {\n super(props);\n this.state = { count: 0 };\n }\n componentDidMount() { document.title = `Count: ${this.state.count}`; }\n componentDidUpdate() { document.title = `Count: ${this.state.count}`; }\n render() {\n return <div><p>Count: {this.state.count}</p><button onClick={() => this.setState({ count: this.state.count + 1 })}>+</button></div>;\n }\n}',
112
+ expectedPatterns: ['useState', 'useEffect', '=>'],
113
+ antiPatterns: ['class Counter', 'this.state', 'extends React'],
114
+ maxExpectedTokens: 400,
115
+ timeEstimate: 'medium',
116
+ outputLanguage: 'typescript',
117
+ },
118
+ // ── Debugging ─────────────────────────────────────────────────────────
119
+ {
120
+ id: 'debug-closure',
121
+ title: 'Fix Closure Bug',
122
+ tag: 'debugging',
123
+ difficulty: 'medium',
124
+ prompt: 'Find and fix the bug in this code:\n\nfor (var i = 0; i < 5; i++) {\n setTimeout(function() {\n console.log(i);\n }, 100);\n}\n\nExpected output: 0, 1, 2, 3, 4\nActual output: 5, 5, 5, 5, 5\n\nExplain the bug and provide the fix.',
125
+ expectedPatterns: ['let', 'closure', 'var', 'block scope'],
126
+ maxExpectedTokens: 300,
127
+ timeEstimate: 'quick',
128
+ outputLanguage: 'javascript',
129
+ },
130
+ {
131
+ id: 'debug-null',
132
+ title: 'Fix Null Reference',
133
+ tag: 'debugging',
134
+ difficulty: 'easy',
135
+ prompt: 'Find and fix the bug: \n\nconst users = [\n { name: "Alice", address: { city: "NYC" } },\n { name: "Bob" },\n { name: "Charlie", address: { city: "LA" } }\n];\n\nusers.forEach(user => console.log(user.address.city.toUpperCase()));\n\nExplain the error and provide a fix using optional chaining.',
136
+ expectedPatterns: ['?.', 'optional chaining', 'undefined'],
137
+ maxExpectedTokens: 250,
138
+ timeEstimate: 'quick',
139
+ outputLanguage: 'javascript',
140
+ },
141
+ // ── Testing ───────────────────────────────────────────────────────────
142
+ {
143
+ id: 'unit-test',
144
+ title: 'Write Unit Tests',
145
+ tag: 'testing',
146
+ difficulty: 'medium',
147
+ prompt: 'Write Vitest unit tests for this function:\n\nexport function calculateDiscount(price: number, isMember: boolean): number {\n if (price < 0) throw new Error("Price cannot be negative");\n if (isMember) return price * 0.9;\n if (price > 100) return price * 0.95;\n return price;\n}\n\nInclude tests for: normal cases, member discount, high-value discount, negative price error, and edge cases.',
148
+ expectedPatterns: ['describe', 'it', 'expect', 'calculateDiscount', 'throw'],
149
+ maxExpectedTokens: 500,
150
+ timeEstimate: 'medium',
151
+ outputLanguage: 'typescript',
152
+ },
153
+ // ── Documentation ─────────────────────────────────────────────────────
154
+ {
155
+ id: 'jsdoc',
156
+ title: 'Generate Documentation',
157
+ tag: 'documentation',
158
+ difficulty: 'easy',
159
+ prompt: 'Add JSDoc comments to this function:\n\nfunction parseConfig(configStr, options) {\n const config = JSON.parse(configStr);\n if (options.validate) {\n validateConfig(config);\n }\n return config;\n}\n\nInclude: parameter descriptions, return type, and a usage example.',
160
+ expectedPatterns: ['@param', '@returns', '@example', 'parseConfig'],
161
+ maxExpectedTokens: 250,
162
+ timeEstimate: 'quick',
163
+ outputLanguage: 'javascript',
164
+ },
165
+ // ── Security ──────────────────────────────────────────────────────────
166
+ {
167
+ id: 'security-sql',
168
+ title: 'Fix SQL Injection',
169
+ tag: 'security',
170
+ difficulty: 'hard',
171
+ prompt: 'Identify and fix the security vulnerability in this code:\n\napp.get("/users", (req, res) => {\n const name = req.query.name;\n const query = `SELECT * FROM users WHERE name = "${name}"`;\n db.query(query, (err, results) => {\n res.json(results);\n });\n});\n\nExplain the vulnerability and provide a secure implementation using parameterized queries.',
172
+ expectedPatterns: ['parameterized', 'prepared statement', 'SQL injection', '$1', '?'],
173
+ antiPatterns: ['string interpolation', 'template literal'],
174
+ maxExpectedTokens: 400,
175
+ timeEstimate: 'medium',
176
+ outputLanguage: 'javascript',
177
+ },
178
+ {
179
+ id: 'security-xss',
180
+ title: 'Fix XSS Vulnerability',
181
+ tag: 'security',
182
+ difficulty: 'medium',
183
+ prompt: 'Identify and fix the XSS vulnerability:\n\napp.get("/profile", (req, res) => {\n const username = req.query.username;\n res.send(`<h1>Welcome, ${username}!</h1>`);\n});\n\nExplain the vulnerability and show two fix approaches: (1) escaping output, (2) using a template engine with auto-escaping.',
184
+ expectedPatterns: ['escape', 'XSS', 'sanitize', 'textContent'],
185
+ antiPatterns: ['res.send', 'innerHTML'],
186
+ maxExpectedTokens: 400,
187
+ timeEstimate: 'medium',
188
+ outputLanguage: 'javascript',
189
+ },
190
+ // ── Optimization ──────────────────────────────────────────────────────
191
+ {
192
+ id: 'optimize-array',
193
+ title: 'Optimize Array Operations',
194
+ tag: 'optimization',
195
+ difficulty: 'medium',
196
+ prompt: 'Optimize this code for performance:\n\nfunction findDuplicates(arr) {\n const duplicates = [];\n for (let i = 0; i < arr.length; i++) {\n for (let j = 0; j < arr.length; j++) {\n if (i !== j && arr[i] === arr[j]) {\n if (!duplicates.includes(arr[i])) {\n duplicates.push(arr[i]);\n }\n }\n }\n }\n return duplicates;\n}\n\nExplain why the original is slow (O(n²)) and provide an O(n) solution.',
197
+ expectedPatterns: ['Set', 'O(n', 'has', 'new Set'],
198
+ antiPatterns: ['nested loop', 'includes'],
199
+ maxExpectedTokens: 400,
200
+ timeEstimate: 'medium',
201
+ outputLanguage: 'javascript',
202
+ },
203
+ // ── Explanation / Comprehension ───────────────────────────────────────
204
+ {
205
+ id: 'explain-prototype',
206
+ title: 'Explain Prototype Chain',
207
+ tag: 'comprehension',
208
+ difficulty: 'medium',
209
+ prompt: 'Explain JavaScript prototype chain in 3-4 sentences. Include what `__proto__` is, how `Function.prototype` works, and give a simple example of prototypal inheritance.',
210
+ expectedPatterns: ['prototype', '__proto__', 'inheritance', 'Object.create'],
211
+ maxExpectedTokens: 300,
212
+ timeEstimate: 'quick',
213
+ outputLanguage: 'text',
214
+ },
215
+ {
216
+ id: 'explain-event-loop',
217
+ title: 'Explain Event Loop',
218
+ tag: 'comprehension',
219
+ difficulty: 'medium',
220
+ prompt: 'Explain the JavaScript event loop in simple terms. Cover: call stack, task queue, microtasks (Promise), and the order of execution. Give a short code example that demonstrates the order.',
221
+ expectedPatterns: ['call stack', 'task queue', 'microtask', 'Promise', 'event loop'],
222
+ maxExpectedTokens: 400,
223
+ timeEstimate: 'quick',
224
+ outputLanguage: 'text',
225
+ },
226
+ // ── Hard: Complex Code Generation ─────────────────────────────────────
227
+ {
228
+ id: 'middleware-chain',
229
+ title: 'Express Middleware Chain',
230
+ tag: 'code-generation',
231
+ difficulty: 'hard',
232
+ prompt: 'Write an Express middleware chain for a production API: (1) request logging middleware that logs method, URL, and response time, (2) authentication middleware that checks a JWT token from the Authorization header, (3) error handling middleware that catches all errors and returns consistent JSON error responses. Include TypeScript types.',
233
+ expectedPatterns: ['next', 'req', 'res', 'JWT', 'Authorization', 'middleware'],
234
+ maxExpectedTokens: 700,
235
+ timeEstimate: 'slow',
236
+ outputLanguage: 'typescript',
237
+ },
238
+ {
239
+ id: 'rate-limiter',
240
+ title: 'Rate Limiter Implementation',
241
+ tag: 'code-generation',
242
+ difficulty: 'hard',
243
+ prompt: 'Implement a token bucket rate limiter in TypeScript:\n- Configurable: maxTokens, refillRate (tokens per second)\n- allowRequest(): boolean method\n- Thread-safe consideration (single-threaded JS is fine)\n- Include a usage example\n- Add JSDoc comments',
244
+ expectedPatterns: ['class', 'token', 'bucket', 'refill', 'allowRequest', 'RateLimiter'],
245
+ maxExpectedTokens: 500,
246
+ timeEstimate: 'medium',
247
+ outputLanguage: 'typescript',
248
+ },
249
+ // ── Translation ───────────────────────────────────────────────────────
250
+ {
251
+ id: 'translate-py-to-ts',
252
+ title: 'Python to TypeScript Translation',
253
+ tag: 'translation',
254
+ difficulty: 'medium',
255
+ prompt: 'Translate this Python function to TypeScript:\n\ndef process_items(items: list[dict]) -> dict[str, list]:\n result = {"valid": [], "invalid": []}\n for item in items:\n if item.get("active") and item.get("value", 0) > 0:\n result["valid"].append(item)\n else:\n result["invalid"].append(item)\n return result\n\nInclude proper TypeScript interfaces and types.',
256
+ expectedPatterns: ['interface', 'processItems', 'valid', 'invalid', 'Array'],
257
+ maxExpectedTokens: 400,
258
+ timeEstimate: 'medium',
259
+ outputLanguage: 'typescript',
260
+ },
261
+ ];
262
+ // ─── Constants ──────────────────────────────────────────────────────────────
263
+ const MEMORY_DIR = join(homedir(), '.buff', 'memory');
264
+ const BENCHMARK_PATH = join(MEMORY_DIR, 'benchmarks.json');
265
+ const CURRENT_VERSION = 1;
266
+ const MAX_BENCHMARK_RUNS = 50;
267
+ // ─── Helpers ────────────────────────────────────────────────────────────────
268
+ function ensureDir() {
269
+ if (!existsSync(MEMORY_DIR)) {
270
+ mkdirSync(MEMORY_DIR, { recursive: true });
271
+ }
272
+ }
273
+ function readBenchmarkData() {
274
+ try {
275
+ ensureDir();
276
+ if (!existsSync(BENCHMARK_PATH)) {
277
+ return { runs: [], version: CURRENT_VERSION };
278
+ }
279
+ const raw = readFileSync(BENCHMARK_PATH, 'utf-8');
280
+ return JSON.parse(raw);
281
+ }
282
+ catch {
283
+ return { runs: [], version: CURRENT_VERSION };
284
+ }
285
+ }
286
+ function writeBenchmarkData(data) {
287
+ ensureDir();
288
+ writeFileSync(BENCHMARK_PATH, JSON.stringify(data, null, 2), 'utf-8');
289
+ }
290
+ /**
291
+ * Generate a quality score for a model's output based on heuristics.
292
+ * Scores range from 0 (poor) to 1 (excellent).
293
+ */
294
+ export function scoreQuality(output, task) {
295
+ let score = 0.5; // Start at neutral
296
+ // Bonus: output matches expected patterns
297
+ if (task.expectedPatterns) {
298
+ const matched = task.expectedPatterns.filter((p) => output.toLowerCase().includes(p.toLowerCase())).length;
299
+ score += (matched / task.expectedPatterns.length) * 0.3;
300
+ }
301
+ // Penalty: output contains anti-patterns
302
+ if (task.antiPatterns) {
303
+ const antiMatched = task.antiPatterns.filter((p) => output.toLowerCase().includes(p.toLowerCase())).length;
304
+ score -= (antiMatched / task.antiPatterns.length) * 0.3;
305
+ }
306
+ // Bonus: output is not too short (meaningful response)
307
+ if (output.length > 100)
308
+ score += 0.1;
309
+ if (output.length > 500)
310
+ score += 0.1;
311
+ // Bonus: contains code blocks when expected
312
+ if (task.outputLanguage && task.outputLanguage !== 'text') {
313
+ if (output.includes('```'))
314
+ score += 0.1;
315
+ }
316
+ // Clamp between 0 and 1
317
+ return Math.max(0, Math.min(1, score));
318
+ }
319
+ /**
320
+ * Calculate median of an array of numbers.
321
+ */
322
+ function median(values) {
323
+ if (values.length === 0)
324
+ return 0;
325
+ const sorted = [...values].sort((a, b) => a - b);
326
+ const mid = Math.floor(sorted.length / 2);
327
+ return sorted.length % 2 !== 0
328
+ ? sorted[mid]
329
+ : (sorted[mid - 1] + sorted[mid]) / 2;
330
+ }
331
+ // ─── Benchmark Runner ───────────────────────────────────────────────────────
332
+ /**
333
+ * Run the benchmark suite against a provider/model.
334
+ */
335
+ export async function runBenchmark(provider, providerName, model, options) {
336
+ // Filter tasks
337
+ let tasks = [...BENCHMARK_TASKS];
338
+ if (options?.taskIds && options.taskIds.length > 0) {
339
+ tasks = tasks.filter((t) => options.taskIds.includes(t.id));
340
+ }
341
+ if (options?.timeEstimate) {
342
+ tasks = tasks.filter((t) => t.timeEstimate === options.timeEstimate);
343
+ }
344
+ const runId = `benchmark-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`;
345
+ const startedAt = Date.now();
346
+ const results = [];
347
+ let totalCost = 0;
348
+ for (let i = 0; i < tasks.length; i++) {
349
+ const task = tasks[i];
350
+ // Check budget
351
+ if (options?.budget && totalCost >= options.budget) {
352
+ logger.info(`Budget of $${options.budget.toFixed(2)} reached. Stopping benchmark.`);
353
+ break;
354
+ }
355
+ options?.onProgress?.(i + 1, tasks.length, task);
356
+ const taskStartTime = Date.now();
357
+ try {
358
+ const output = await provider.generate(task.prompt, {
359
+ model,
360
+ temperature: 0.3, // Low temperature for deterministic results
361
+ maxTokens: task.maxExpectedTokens + 512, // Allow extra tokens
362
+ });
363
+ const latencyMs = Date.now() - taskStartTime;
364
+ const inputTokens = estimateTokens(task.prompt);
365
+ const outputTokens = estimateTokens(output);
366
+ const costUsd = calculateCost(providerName, model, inputTokens, outputTokens);
367
+ totalCost += costUsd;
368
+ const result = {
369
+ taskId: task.id,
370
+ provider: providerName,
371
+ model,
372
+ output,
373
+ success: true,
374
+ latencyMs,
375
+ inputTokens,
376
+ outputTokens,
377
+ costUsd,
378
+ qualityScore: scoreQuality(output, task),
379
+ timestamp: Date.now(),
380
+ };
381
+ results.push(result);
382
+ }
383
+ catch (err) {
384
+ const latencyMs = Date.now() - taskStartTime;
385
+ results.push({
386
+ taskId: task.id,
387
+ provider: providerName,
388
+ model,
389
+ output: '',
390
+ success: false,
391
+ latencyMs,
392
+ inputTokens: estimateTokens(task.prompt),
393
+ outputTokens: 0,
394
+ costUsd: 0,
395
+ qualityScore: 0,
396
+ error: err instanceof Error ? err.message : String(err),
397
+ timestamp: Date.now(),
398
+ });
399
+ }
400
+ }
401
+ const endedAt = Date.now();
402
+ // Compute summary
403
+ const passed = results.filter((r) => r.success);
404
+ const qualityScores = passed.map((r) => r.qualityScore);
405
+ const latencies = results.map((r) => r.latencyMs);
406
+ const run = {
407
+ id: runId,
408
+ provider: providerName,
409
+ model,
410
+ startedAt,
411
+ endedAt,
412
+ results,
413
+ summary: {
414
+ totalTasks: results.length,
415
+ tasksPassed: passed.length,
416
+ tasksFailed: results.length - passed.length,
417
+ avgQualityScore: qualityScores.length > 0
418
+ ? qualityScores.reduce((a, b) => a + b, 0) / qualityScores.length
419
+ : 0,
420
+ medianLatencyMs: median(latencies),
421
+ totalCostUsd: results.reduce((sum, r) => sum + r.costUsd, 0),
422
+ totalTokens: results.reduce((sum, r) => sum + r.inputTokens + r.outputTokens, 0),
423
+ },
424
+ };
425
+ // Persist
426
+ const data = readBenchmarkData();
427
+ data.runs.push(run);
428
+ // Prune old runs
429
+ if (data.runs.length > MAX_BENCHMARK_RUNS) {
430
+ data.runs = data.runs.slice(-MAX_BENCHMARK_RUNS);
431
+ }
432
+ writeBenchmarkData(data);
433
+ return run;
434
+ }
435
+ // ─── Report Formatting ──────────────────────────────────────────────────────
436
+ /**
437
+ * Format a benchmark run as a human-readable report.
438
+ */
439
+ export function formatBenchmarkReport(run) {
440
+ const lines = [];
441
+ const s = run.summary;
442
+ const elapsed = ((run.endedAt - run.startedAt) / 1000).toFixed(1);
443
+ lines.push('═'.repeat(60));
444
+ lines.push(` 📊 Benchmark Results: ${run.provider}/${run.model}`);
445
+ lines.push('═'.repeat(60));
446
+ lines.push('');
447
+ lines.push(` Run ID: ${run.id}`);
448
+ lines.push(` Duration: ${elapsed}s`);
449
+ lines.push(` Tasks: ${s.tasksPassed}/${s.totalTasks} passed (${s.tasksFailed} failed)`);
450
+ lines.push(` Avg quality: ${(s.avgQualityScore * 100).toFixed(1)}%`);
451
+ lines.push(` Median latency: ${s.medianLatencyMs}ms`);
452
+ lines.push(` Total cost: $${s.totalCostUsd.toFixed(6)}`);
453
+ lines.push(` Total tokens: ${s.totalTokens.toLocaleString()}`);
454
+ lines.push('');
455
+ // Results table
456
+ lines.push(` ${'─'.repeat(58)}`);
457
+ lines.push(` ${'Task'.padEnd(25)} ${'Status'.padEnd(8)} ${'Quality'.padEnd(9)} ${'Latency'.padEnd(9)} ${'Cost'}`);
458
+ lines.push(` ${'─'.repeat(58)}`);
459
+ for (const r of run.results) {
460
+ const status = r.success ? '✅' : '❌';
461
+ const quality = r.success ? `${(r.qualityScore * 100).toFixed(0)}%` : 'N/A';
462
+ const latency = `${r.latencyMs}ms`;
463
+ const cost = `$${r.costUsd.toFixed(8)}`;
464
+ lines.push(` ${r.taskId.padEnd(25)} ${status.padEnd(8)} ${quality.padEnd(9)} ${latency.padEnd(9)} ${cost}`);
465
+ }
466
+ lines.push(` ${'─'.repeat(58)}`);
467
+ lines.push('');
468
+ return lines.join('\n');
469
+ }
470
+ /**
471
+ * Format a benchmark run as JSON (for machine consumption).
472
+ */
473
+ export function formatBenchmarkJSON(run) {
474
+ return JSON.stringify(run, null, 2);
475
+ }
476
+ /**
477
+ * Format a benchmark run as Markdown (for documentation).
478
+ */
479
+ export function formatBenchmarkMarkdown(run) {
480
+ const s = run.summary;
481
+ const elapsed = ((run.endedAt - run.startedAt) / 1000).toFixed(1);
482
+ const lines = [
483
+ `# Benchmark: ${run.provider}/${run.model}`,
484
+ '',
485
+ `- **Run ID:** ${run.id}`,
486
+ `- **Duration:** ${elapsed}s`,
487
+ `- **Tasks:** ${s.tasksPassed}/${s.totalTasks} passed`,
488
+ `- **Avg Quality Score:** ${(s.avgQualityScore * 100).toFixed(1)}%`,
489
+ `- **Median Latency:** ${s.medianLatencyMs}ms`,
490
+ `- **Total Cost:** $${s.totalCostUsd.toFixed(6)}`,
491
+ `- **Total Tokens:** ${s.totalTokens.toLocaleString()}`,
492
+ '',
493
+ '## Results',
494
+ '',
495
+ '| Task | Status | Quality | Latency | Cost |',
496
+ '|------|--------|---------|---------|------|',
497
+ ];
498
+ for (const r of run.results) {
499
+ const status = r.success ? '✅ Pass' : '❌ Fail';
500
+ const quality = r.success ? `${(r.qualityScore * 100).toFixed(0)}%` : 'N/A';
501
+ lines.push(`| ${r.taskId} | ${status} | ${quality} | ${r.latencyMs}ms | $${r.costUsd.toFixed(8)} |`);
502
+ }
503
+ return lines.join('\n');
504
+ }
505
+ // ─── Query Functions ────────────────────────────────────────────────────────
506
+ /**
507
+ * Get all available benchmark tasks.
508
+ */
509
+ export function getBenchmarkTasks() {
510
+ return [...BENCHMARK_TASKS];
511
+ }
512
+ /**
513
+ * Get a specific benchmark task by ID.
514
+ */
515
+ export function getBenchmarkTask(id) {
516
+ return BENCHMARK_TASKS.find((t) => t.id === id);
517
+ }
518
+ /**
519
+ * Get all past benchmark runs.
520
+ */
521
+ export function getBenchmarkRuns() {
522
+ const data = readBenchmarkData();
523
+ return [...data.runs].reverse(); // Most recent first
524
+ }
525
+ /**
526
+ * Get the most recent benchmark run for a specific provider/model.
527
+ */
528
+ export function getLatestBenchmarkRun(provider, model) {
529
+ const data = readBenchmarkData();
530
+ const runs = data.runs
531
+ .filter((r) => r.provider === provider && r.model === model)
532
+ .sort((a, b) => b.startedAt - a.startedAt);
533
+ return runs[0] || null;
534
+ }
535
+ /**
536
+ * Compare two benchmark runs side by side.
537
+ */
538
+ export function compareBenchmarks(runA, runB) {
539
+ const a = runA.summary;
540
+ const b = runB.summary;
541
+ const winner = (aVal, bVal, higherBetter) => {
542
+ if (aVal === bVal)
543
+ return 'tie';
544
+ return (higherBetter ? aVal > bVal : aVal < bVal)
545
+ ? '← ' + runA.model
546
+ : runB.model + ' →';
547
+ };
548
+ const aPassRate = ((a.tasksPassed / a.totalTasks) * 100).toFixed(0);
549
+ const bPassRate = ((b.tasksPassed / b.totalTasks) * 100).toFixed(0);
550
+ const aQual = (a.avgQualityScore * 100).toFixed(1);
551
+ const bQual = (b.avgQualityScore * 100).toFixed(1);
552
+ const aLat = a.medianLatencyMs + 'ms';
553
+ const bLat = b.medianLatencyMs + 'ms';
554
+ const aCost = '$' + a.totalCostUsd.toFixed(6);
555
+ const bCost = '$' + b.totalCostUsd.toFixed(6);
556
+ const lines = [
557
+ '═'.repeat(60),
558
+ ' ⚔️ Benchmark Comparison: ' + runA.model + ' vs ' + runB.model,
559
+ '═'.repeat(60),
560
+ '',
561
+ ' ' + 'Metric'.padEnd(30) + runA.model.padEnd(20) + runB.model.padEnd(20) + 'Winner',
562
+ ' ' + '─'.repeat(70),
563
+ ' ' + 'Pass Rate'.padEnd(30) +
564
+ (aPassRate + '%').padEnd(20) +
565
+ (bPassRate + '%').padEnd(20) +
566
+ winner(a.tasksPassed / a.totalTasks, b.tasksPassed / a.totalTasks, true),
567
+ ' ' + 'Avg Quality'.padEnd(30) +
568
+ (aQual + '%').padEnd(20) +
569
+ (bQual + '%').padEnd(20) +
570
+ winner(a.avgQualityScore, b.avgQualityScore, true),
571
+ ' ' + 'Median Latency'.padEnd(30) +
572
+ aLat.padEnd(20) +
573
+ bLat.padEnd(20) +
574
+ winner(a.medianLatencyMs, b.medianLatencyMs, false),
575
+ ' ' + 'Total Cost'.padEnd(30) +
576
+ aCost.padEnd(20) +
577
+ bCost.padEnd(20) +
578
+ winner(a.totalCostUsd, b.totalCostUsd, false),
579
+ '',
580
+ ];
581
+ return lines.join('\n');
582
+ }
583
+ /**
584
+ * Clear all benchmark data.
585
+ */
586
+ export function clearBenchmarks() {
587
+ writeBenchmarkData({ runs: [], version: CURRENT_VERSION });
588
+ }
589
+ //# sourceMappingURL=benchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../src/learning/benchmark.ts"],"names":[],"mappings":"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"}