@tyvm/knowhow 0.0.33 → 0.0.35

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 (504) hide show
  1. package/autodoc/plugins/downloader/downloader.mdx +2 -2
  2. package/benchmarks/.dockerignore +7 -0
  3. package/benchmarks/README.md +166 -0
  4. package/benchmarks/docker/Dockerfile +68 -0
  5. package/benchmarks/example-config.yml +27 -0
  6. package/benchmarks/jest.config.js +13 -0
  7. package/benchmarks/package-lock.json +4297 -0
  8. package/benchmarks/package.json +39 -0
  9. package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +2814 -0
  10. package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +2014 -0
  11. package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +3121 -0
  12. package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +98 -0
  13. package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +3256 -0
  14. package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +4298 -0
  15. package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +3031 -0
  16. package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +2990 -0
  17. package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +3256 -0
  18. package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +3007 -0
  19. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +3256 -0
  20. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +3036 -0
  21. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +3280 -0
  22. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +1920 -0
  23. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +3281 -0
  24. package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +2896 -0
  25. package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +3011 -0
  26. package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +3003 -0
  27. package/benchmarks/scripts/build-and-run.sh +47 -0
  28. package/benchmarks/scripts/clone-exercism.sh +92 -0
  29. package/benchmarks/scripts/validate.sh +48 -0
  30. package/benchmarks/src/__tests__/runner.test.ts +27 -0
  31. package/benchmarks/src/cli.ts +90 -0
  32. package/benchmarks/src/evaluators/EvaluatorRegistry.ts +64 -0
  33. package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +183 -0
  34. package/benchmarks/src/evaluators/index.ts +3 -0
  35. package/benchmarks/src/evaluators/types.ts +22 -0
  36. package/benchmarks/src/index.ts +3 -0
  37. package/benchmarks/src/providers.ts +13 -0
  38. package/benchmarks/src/runner.ts +824 -0
  39. package/benchmarks/src/types.ts +63 -0
  40. package/benchmarks/tsconfig.json +19 -0
  41. package/jest.config.js +2 -1
  42. package/leaderboard/README.md +148 -0
  43. package/leaderboard/app/api/benchmark-data/route.ts +131 -0
  44. package/leaderboard/app/api/benchmark-detail/route.ts +172 -0
  45. package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +501 -0
  46. package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +375 -0
  47. package/leaderboard/app/globals.css +27 -0
  48. package/leaderboard/app/layout.tsx +21 -0
  49. package/leaderboard/app/page.tsx +170 -0
  50. package/leaderboard/components/LeaderboardTable.tsx +168 -0
  51. package/leaderboard/components/PerformanceChart.tsx +109 -0
  52. package/leaderboard/next-env.d.ts +5 -0
  53. package/leaderboard/next.config.js +4 -0
  54. package/leaderboard/package-lock.json +6363 -0
  55. package/leaderboard/package.json +28 -0
  56. package/leaderboard/postcss.config.js +6 -0
  57. package/leaderboard/tailwind.config.js +17 -0
  58. package/leaderboard/tsconfig.json +28 -0
  59. package/leaderboard/types/benchmark.ts +67 -0
  60. package/leaderboard/utils/dataProcessor.ts +33 -0
  61. package/package.json +2 -1
  62. package/src/agents/base/base.ts +182 -24
  63. package/src/agents/base/prompt.ts +28 -0
  64. package/src/agents/index.ts +3 -0
  65. package/src/agents/patcher/patcher.ts +6 -4
  66. package/src/agents/setup/setup.ts +56 -0
  67. package/src/agents/tools/agentCall.ts +6 -2
  68. package/src/agents/tools/aiClient.ts +74 -8
  69. package/src/agents/tools/execCommand.ts +13 -14
  70. package/src/agents/tools/executeScript/README.md +16 -0
  71. package/src/agents/tools/index.ts +2 -0
  72. package/src/agents/tools/list.ts +73 -16
  73. package/src/agents/tools/startAgentTask.ts +109 -0
  74. package/src/agents/tools/textSearch.ts +1 -1
  75. package/src/agents/tools/visionTool.ts +31 -2
  76. package/src/agents/tools/ycmd/client.ts +608 -0
  77. package/src/agents/tools/ycmd/definitions.ts +294 -0
  78. package/src/agents/tools/ycmd/detection.ts +211 -0
  79. package/src/agents/tools/ycmd/index.ts +11 -0
  80. package/src/agents/tools/ycmd/installer.ts +251 -0
  81. package/src/agents/tools/ycmd/server.ts +535 -0
  82. package/src/agents/tools/ycmd/serverManager.ts +316 -0
  83. package/src/agents/tools/ycmd/tools/completion.ts +113 -0
  84. package/src/agents/tools/ycmd/tools/diagnostics.ts +155 -0
  85. package/src/agents/tools/ycmd/tools/getLocations.ts +173 -0
  86. package/src/agents/tools/ycmd/tools/goto.ts +169 -0
  87. package/src/agents/tools/ycmd/tools/refactor.ts +204 -0
  88. package/src/agents/tools/ycmd/tools/signature.ts +174 -0
  89. package/src/agents/tools/ycmd/tools/start.ts +95 -0
  90. package/src/agents/tools/ycmd/utils/pathUtils.ts +59 -0
  91. package/src/ai.ts +15 -0
  92. package/src/chat/CliChatService.ts +277 -0
  93. package/src/chat/modules/AgentModule.ts +985 -0
  94. package/src/chat/modules/AskModule.ts +98 -0
  95. package/src/chat/modules/BaseChatModule.ts +66 -0
  96. package/src/chat/modules/InternalChatModule.ts +174 -0
  97. package/src/chat/modules/SearchModule.ts +166 -0
  98. package/src/chat/modules/SetupModule.ts +185 -0
  99. package/src/chat/modules/SystemModule.ts +120 -0
  100. package/src/chat/modules/VoiceModule.ts +70 -0
  101. package/src/chat/modules/index.js +5 -0
  102. package/src/chat/types.ts +97 -0
  103. package/src/chat.ts +9 -1
  104. package/src/chat2.ts +62 -0
  105. package/src/cli.ts +264 -35
  106. package/src/clients/anthropic.ts +14 -7
  107. package/src/clients/gemini.ts +15 -7
  108. package/src/clients/http.ts +17 -7
  109. package/src/clients/index.ts +117 -4
  110. package/src/clients/knowhow.ts +7 -2
  111. package/src/clients/knowhowMcp.ts +118 -0
  112. package/src/clients/openai.ts +32 -8
  113. package/src/clients/types.ts +1 -0
  114. package/src/clients/xai.ts +17 -5
  115. package/src/config.ts +30 -5
  116. package/src/conversion.ts +4 -1
  117. package/src/login.ts +26 -9
  118. package/src/microphone.ts +0 -1
  119. package/src/plugins/downloader/downloader.ts +191 -49
  120. package/src/plugins/downloader/plugin.ts +3 -1
  121. package/src/plugins/plugins.ts +3 -0
  122. package/src/processors/CustomVariables.ts +425 -0
  123. package/src/processors/HarmonyToolProcessor.ts +264 -0
  124. package/src/processors/XmlToolCallProcessor.ts +533 -0
  125. package/src/processors/index.ts +3 -0
  126. package/src/prompts/KnowhowConfigExamples.ts +376 -0
  127. package/src/services/KnowhowClient.ts +49 -3
  128. package/src/services/Mcp.ts +42 -3
  129. package/src/services/McpServer.ts +14 -4
  130. package/src/services/McpWebsocketTransport.ts +21 -7
  131. package/src/services/MessageProcessor.ts +10 -5
  132. package/src/services/index.ts +5 -0
  133. package/src/services/script-execution/ScriptExecutor.ts +34 -1
  134. package/src/services/types.ts +17 -14
  135. package/src/types.ts +17 -0
  136. package/src/utils/index.ts +138 -0
  137. package/tests/XmlToolCallProcessor.test.ts +468 -0
  138. package/tests/manual/ycmd/debug_diagnostics_test.ts +127 -0
  139. package/tests/manual/ycmd/fixtures/debug_diagnostics.ts +26 -0
  140. package/tests/manual/ycmd/fixtures/file_change_test.ts +17 -0
  141. package/tests/manual/ycmd/minimal_advanced_test.ts +108 -0
  142. package/tests/manual/ycmd/simple_diagnostics_test.ts +61 -0
  143. package/tests/manual/ycmd/simple_test.ts +74 -0
  144. package/tests/manual/ycmd/test-typescript-sample.ts +34 -0
  145. package/tests/manual/ycmd/test_advanced_features.ts +407 -0
  146. package/tests/manual/ycmd/test_advanced_with_tools.ts +320 -0
  147. package/tests/manual/ycmd/test_comprehensive_typescript.ts +179 -0
  148. package/tests/manual/ycmd/test_diagnostics_file_changes.ts +249 -0
  149. package/tests/manual/ycmd/test_diagnostics_fix.ts +99 -0
  150. package/tests/manual/ycmd/test_diagnostics_simple.ts +100 -0
  151. package/tests/manual/ycmd/test_diagnostics_timing.ts +120 -0
  152. package/tests/manual/ycmd/test_discover_commands.ts +310 -0
  153. package/tests/manual/ycmd/test_endpoints.ts +115 -0
  154. package/tests/manual/ycmd/test_final_comprehensive.ts +218 -0
  155. package/tests/manual/ycmd/test_final_validation.ts +150 -0
  156. package/tests/manual/ycmd/test_implementation.js +42 -0
  157. package/tests/manual/ycmd/test_individual_ycmd_tool.ts +39 -0
  158. package/tests/manual/ycmd/test_server_manager.ts +52 -0
  159. package/tests/manual/ycmd/test_simple_debug.ts +86 -0
  160. package/tests/manual/ycmd/test_tsserver_workflow.js +83 -0
  161. package/tests/manual/ycmd/test_tsserver_workflow.ts +122 -0
  162. package/tests/manual/ycmd/test_typescript_simple.ts +48 -0
  163. package/tests/manual/ycmd/test_typescript_ycmd.ts +105 -0
  164. package/tests/manual/ycmd/test_workspace_config.ts +90 -0
  165. package/tests/manual/ycmd/test_ycmd_auto_start.ts +137 -0
  166. package/tests/manual/ycmd/test_ycmd_comprehensive.ts +73 -0
  167. package/tests/manual/ycmd/test_ycmd_connection.py +10 -0
  168. package/tests/manual/ycmd/test_ycmd_direct.ts +142 -0
  169. package/tests/manual/ycmd/test_ycmd_experiment.ts +48 -0
  170. package/tests/manual/ycmd/test_ycmd_final.ts +200 -0
  171. package/tests/manual/ycmd/test_ycmd_fixed.py +18 -0
  172. package/tests/manual/ycmd/test_ycmd_integration.ts +112 -0
  173. package/tests/manual/ycmd/test_ycmd_simple.ts +45 -0
  174. package/tests/manual/ycmd/test_ycmd_usage.py +27 -0
  175. package/tests/manual/ycmd/working_simple_test.ts +134 -0
  176. package/ts_build/src/agents/base/base.d.ts +15 -1
  177. package/ts_build/src/agents/base/base.js +121 -20
  178. package/ts_build/src/agents/base/base.js.map +1 -1
  179. package/ts_build/src/agents/base/prompt.d.ts +1 -1
  180. package/ts_build/src/agents/base/prompt.js +28 -0
  181. package/ts_build/src/agents/base/prompt.js.map +1 -1
  182. package/ts_build/src/agents/index.d.ts +2 -0
  183. package/ts_build/src/agents/index.js +2 -0
  184. package/ts_build/src/agents/index.js.map +1 -1
  185. package/ts_build/src/agents/patcher/patcher.js +6 -3
  186. package/ts_build/src/agents/patcher/patcher.js.map +1 -1
  187. package/ts_build/src/agents/setup/setup.d.ts +8 -0
  188. package/ts_build/src/agents/setup/setup.js +59 -0
  189. package/ts_build/src/agents/setup/setup.js.map +1 -0
  190. package/ts_build/src/agents/tools/agentCall.js +5 -2
  191. package/ts_build/src/agents/tools/agentCall.js.map +1 -1
  192. package/ts_build/src/agents/tools/aiClient.d.ts +6 -5
  193. package/ts_build/src/agents/tools/aiClient.js +37 -6
  194. package/ts_build/src/agents/tools/aiClient.js.map +1 -1
  195. package/ts_build/src/agents/tools/execCommand.d.ts +2 -2
  196. package/ts_build/src/agents/tools/execCommand.js +5 -6
  197. package/ts_build/src/agents/tools/execCommand.js.map +1 -1
  198. package/ts_build/src/agents/tools/executeScript/index.d.ts +1 -1
  199. package/ts_build/src/agents/tools/index.d.ts +2 -0
  200. package/ts_build/src/agents/tools/index.js +2 -0
  201. package/ts_build/src/agents/tools/index.js.map +1 -1
  202. package/ts_build/src/agents/tools/list.js +66 -16
  203. package/ts_build/src/agents/tools/list.js.map +1 -1
  204. package/ts_build/src/agents/tools/startAgentTask.d.ts +13 -0
  205. package/ts_build/src/agents/tools/startAgentTask.js +74 -0
  206. package/ts_build/src/agents/tools/startAgentTask.js.map +1 -0
  207. package/ts_build/src/agents/tools/startChatTask.d.ts +13 -0
  208. package/ts_build/src/agents/tools/startChatTask.js +73 -0
  209. package/ts_build/src/agents/tools/startChatTask.js.map +1 -0
  210. package/ts_build/src/agents/tools/textSearch.js +1 -1
  211. package/ts_build/src/agents/tools/textSearch.js.map +1 -1
  212. package/ts_build/src/agents/tools/visionTool.d.ts +1 -1
  213. package/ts_build/src/agents/tools/visionTool.js +23 -3
  214. package/ts_build/src/agents/tools/visionTool.js.map +1 -1
  215. package/ts_build/src/agents/tools/ycmd/client.d.ts +93 -0
  216. package/ts_build/src/agents/tools/ycmd/client.js +355 -0
  217. package/ts_build/src/agents/tools/ycmd/client.js.map +1 -0
  218. package/ts_build/src/agents/tools/ycmd/definitions.d.ts +345 -0
  219. package/ts_build/src/agents/tools/ycmd/definitions.js +298 -0
  220. package/ts_build/src/agents/tools/ycmd/definitions.js.map +1 -0
  221. package/ts_build/src/agents/tools/ycmd/detection.d.ts +11 -0
  222. package/ts_build/src/agents/tools/ycmd/detection.js +175 -0
  223. package/ts_build/src/agents/tools/ycmd/detection.js.map +1 -0
  224. package/ts_build/src/agents/tools/ycmd/index.d.ts +8 -0
  225. package/ts_build/src/agents/tools/ycmd/index.js +20 -0
  226. package/ts_build/src/agents/tools/ycmd/index.js.map +1 -0
  227. package/ts_build/src/agents/tools/ycmd/installer.d.ts +19 -0
  228. package/ts_build/src/agents/tools/ycmd/installer.js +196 -0
  229. package/ts_build/src/agents/tools/ycmd/installer.js.map +1 -0
  230. package/ts_build/src/agents/tools/ycmd/server.d.ts +35 -0
  231. package/ts_build/src/agents/tools/ycmd/server.js +363 -0
  232. package/ts_build/src/agents/tools/ycmd/server.js.map +1 -0
  233. package/ts_build/src/agents/tools/ycmd/serverManager.d.ts +39 -0
  234. package/ts_build/src/agents/tools/ycmd/serverManager.js +210 -0
  235. package/ts_build/src/agents/tools/ycmd/serverManager.js.map +1 -0
  236. package/ts_build/src/agents/tools/ycmd/tools/completion.d.ts +22 -0
  237. package/ts_build/src/agents/tools/ycmd/tools/completion.js +72 -0
  238. package/ts_build/src/agents/tools/ycmd/tools/completion.js.map +1 -0
  239. package/ts_build/src/agents/tools/ycmd/tools/diagnostics.d.ts +42 -0
  240. package/ts_build/src/agents/tools/ycmd/tools/diagnostics.js +88 -0
  241. package/ts_build/src/agents/tools/ycmd/tools/diagnostics.js.map +1 -0
  242. package/ts_build/src/agents/tools/ycmd/tools/getLocations.d.ts +22 -0
  243. package/ts_build/src/agents/tools/ycmd/tools/getLocations.js +142 -0
  244. package/ts_build/src/agents/tools/ycmd/tools/getLocations.js.map +1 -0
  245. package/ts_build/src/agents/tools/ycmd/tools/goto.d.ts +20 -0
  246. package/ts_build/src/agents/tools/ycmd/tools/goto.js +101 -0
  247. package/ts_build/src/agents/tools/ycmd/tools/goto.js.map +1 -0
  248. package/ts_build/src/agents/tools/ycmd/tools/refactor.d.ts +32 -0
  249. package/ts_build/src/agents/tools/ycmd/tools/refactor.js +123 -0
  250. package/ts_build/src/agents/tools/ycmd/tools/refactor.js.map +1 -0
  251. package/ts_build/src/agents/tools/ycmd/tools/signature.d.ts +25 -0
  252. package/ts_build/src/agents/tools/ycmd/tools/signature.js +110 -0
  253. package/ts_build/src/agents/tools/ycmd/tools/signature.js.map +1 -0
  254. package/ts_build/src/agents/tools/ycmd/tools/start.d.ts +17 -0
  255. package/ts_build/src/agents/tools/ycmd/tools/start.js +65 -0
  256. package/ts_build/src/agents/tools/ycmd/tools/start.js.map +1 -0
  257. package/ts_build/src/agents/tools/ycmd/utils/pathUtils.d.ts +4 -0
  258. package/ts_build/src/agents/tools/ycmd/utils/pathUtils.js +67 -0
  259. package/ts_build/src/agents/tools/ycmd/utils/pathUtils.js.map +1 -0
  260. package/ts_build/src/ai.d.ts +1 -0
  261. package/ts_build/src/ai.js +40 -1
  262. package/ts_build/src/ai.js.map +1 -1
  263. package/ts_build/src/chat/ChatCommandHandler.d.ts +36 -0
  264. package/ts_build/src/chat/ChatCommandHandler.js +268 -0
  265. package/ts_build/src/chat/ChatCommandHandler.js.map +1 -0
  266. package/ts_build/src/chat/ChatInputManager.d.ts +22 -0
  267. package/ts_build/src/chat/ChatInputManager.js +85 -0
  268. package/ts_build/src/chat/ChatInputManager.js.map +1 -0
  269. package/ts_build/src/chat/ChatManager.d.ts +49 -0
  270. package/ts_build/src/chat/ChatManager.js +271 -0
  271. package/ts_build/src/chat/ChatManager.js.map +1 -0
  272. package/ts_build/src/chat/ChatSession.d.ts +32 -0
  273. package/ts_build/src/chat/ChatSession.js +3 -0
  274. package/ts_build/src/chat/ChatSession.js.map +1 -0
  275. package/ts_build/src/chat/ChatSessionManager.d.ts +19 -0
  276. package/ts_build/src/chat/ChatSessionManager.js +188 -0
  277. package/ts_build/src/chat/ChatSessionManager.js.map +1 -0
  278. package/ts_build/src/chat/ChatStateManager.d.ts +58 -0
  279. package/ts_build/src/chat/ChatStateManager.js +156 -0
  280. package/ts_build/src/chat/ChatStateManager.js.map +1 -0
  281. package/ts_build/src/chat/CliChatService.d.ts +35 -0
  282. package/ts_build/src/chat/CliChatService.js +201 -0
  283. package/ts_build/src/chat/CliChatService.js.map +1 -0
  284. package/ts_build/src/chat/InterruptibleInput.d.ts +20 -0
  285. package/ts_build/src/chat/InterruptibleInput.js +109 -0
  286. package/ts_build/src/chat/InterruptibleInput.js.map +1 -0
  287. package/ts_build/src/chat/interfaces/ChatModule.d.ts +6 -0
  288. package/ts_build/src/chat/interfaces/ChatModule.js +3 -0
  289. package/ts_build/src/chat/interfaces/ChatModule.js.map +1 -0
  290. package/ts_build/src/chat/modules/AgentModule.d.ts +57 -0
  291. package/ts_build/src/chat/modules/AgentModule.js +709 -0
  292. package/ts_build/src/chat/modules/AgentModule.js.map +1 -0
  293. package/ts_build/src/chat/modules/AskModule.d.ts +10 -0
  294. package/ts_build/src/chat/modules/AskModule.js +63 -0
  295. package/ts_build/src/chat/modules/AskModule.js.map +1 -0
  296. package/ts_build/src/chat/modules/BaseChatModule.d.ts +14 -0
  297. package/ts_build/src/chat/modules/BaseChatModule.js +32 -0
  298. package/ts_build/src/chat/modules/BaseChatModule.js.map +1 -0
  299. package/ts_build/src/chat/modules/InternalChatModule.d.ts +24 -0
  300. package/ts_build/src/chat/modules/InternalChatModule.js +127 -0
  301. package/ts_build/src/chat/modules/InternalChatModule.js.map +1 -0
  302. package/ts_build/src/chat/modules/SearchModule.d.ts +12 -0
  303. package/ts_build/src/chat/modules/SearchModule.js +119 -0
  304. package/ts_build/src/chat/modules/SearchModule.js.map +1 -0
  305. package/ts_build/src/chat/modules/SetupModule.d.ts +15 -0
  306. package/ts_build/src/chat/modules/SetupModule.js +147 -0
  307. package/ts_build/src/chat/modules/SetupModule.js.map +1 -0
  308. package/ts_build/src/chat/modules/SystemModule.d.ts +14 -0
  309. package/ts_build/src/chat/modules/SystemModule.js +90 -0
  310. package/ts_build/src/chat/modules/SystemModule.js.map +1 -0
  311. package/ts_build/src/chat/modules/VoiceModule.d.ts +11 -0
  312. package/ts_build/src/chat/modules/VoiceModule.js +57 -0
  313. package/ts_build/src/chat/modules/VoiceModule.js.map +1 -0
  314. package/ts_build/src/chat/types.d.ts +83 -0
  315. package/ts_build/src/chat/types.js +3 -0
  316. package/ts_build/src/chat/types.js.map +1 -0
  317. package/ts_build/src/chat.js +7 -1
  318. package/ts_build/src/chat.js.map +1 -1
  319. package/ts_build/src/chat2.d.ts +3 -0
  320. package/ts_build/src/chat2.js +47 -0
  321. package/ts_build/src/chat2.js.map +1 -0
  322. package/ts_build/src/cli.js +218 -37
  323. package/ts_build/src/cli.js.map +1 -1
  324. package/ts_build/src/clients/anthropic.d.ts +5 -2
  325. package/ts_build/src/clients/anthropic.js +12 -7
  326. package/ts_build/src/clients/anthropic.js.map +1 -1
  327. package/ts_build/src/clients/gemini.d.ts +6 -3
  328. package/ts_build/src/clients/gemini.js +13 -7
  329. package/ts_build/src/clients/gemini.js.map +1 -1
  330. package/ts_build/src/clients/http.d.ts +1 -0
  331. package/ts_build/src/clients/http.js +12 -5
  332. package/ts_build/src/clients/http.js.map +1 -1
  333. package/ts_build/src/clients/index.d.ts +10 -0
  334. package/ts_build/src/clients/index.js +74 -4
  335. package/ts_build/src/clients/index.js.map +1 -1
  336. package/ts_build/src/clients/knowhow.d.ts +3 -1
  337. package/ts_build/src/clients/knowhow.js +8 -2
  338. package/ts_build/src/clients/knowhow.js.map +1 -1
  339. package/ts_build/src/clients/knowhowMcp.d.ts +20 -0
  340. package/ts_build/src/clients/knowhowMcp.js +86 -0
  341. package/ts_build/src/clients/knowhowMcp.js.map +1 -0
  342. package/ts_build/src/clients/openai.d.ts +5 -2
  343. package/ts_build/src/clients/openai.js +29 -8
  344. package/ts_build/src/clients/openai.js.map +1 -1
  345. package/ts_build/src/clients/types.d.ts +1 -0
  346. package/ts_build/src/clients/xai.d.ts +5 -2
  347. package/ts_build/src/clients/xai.js +15 -5
  348. package/ts_build/src/clients/xai.js.map +1 -1
  349. package/ts_build/src/config.js +24 -3
  350. package/ts_build/src/config.js.map +1 -1
  351. package/ts_build/src/conversion.js +6 -4
  352. package/ts_build/src/conversion.js.map +1 -1
  353. package/ts_build/src/login.d.ts +1 -1
  354. package/ts_build/src/login.js +21 -7
  355. package/ts_build/src/login.js.map +1 -1
  356. package/ts_build/src/microphone.js.map +1 -1
  357. package/ts_build/src/plugins/downloader/downloader.d.ts +7 -5
  358. package/ts_build/src/plugins/downloader/downloader.js +147 -44
  359. package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
  360. package/ts_build/src/plugins/downloader/plugin.js +5 -3
  361. package/ts_build/src/plugins/downloader/plugin.js.map +1 -1
  362. package/ts_build/src/plugins/plugins.js +3 -0
  363. package/ts_build/src/plugins/plugins.js.map +1 -1
  364. package/ts_build/src/processors/CustomVariables.d.ts +32 -0
  365. package/ts_build/src/processors/CustomVariables.js +297 -0
  366. package/ts_build/src/processors/CustomVariables.js.map +1 -0
  367. package/ts_build/src/processors/HarmonyToolProcessor.d.ts +15 -0
  368. package/ts_build/src/processors/HarmonyToolProcessor.js +154 -0
  369. package/ts_build/src/processors/HarmonyToolProcessor.js.map +1 -0
  370. package/ts_build/src/processors/XmlToolCallProcessor.d.ts +14 -0
  371. package/ts_build/src/processors/XmlToolCallProcessor.js +357 -0
  372. package/ts_build/src/processors/XmlToolCallProcessor.js.map +1 -0
  373. package/ts_build/src/processors/index.d.ts +3 -0
  374. package/ts_build/src/processors/index.js +7 -1
  375. package/ts_build/src/processors/index.js.map +1 -1
  376. package/ts_build/src/prompts/KnowhowConfigExamples.d.ts +2 -0
  377. package/ts_build/src/prompts/KnowhowConfigExamples.js +379 -0
  378. package/ts_build/src/prompts/KnowhowConfigExamples.js.map +1 -0
  379. package/ts_build/src/services/KnowhowClient.d.ts +22 -0
  380. package/ts_build/src/services/KnowhowClient.js +14 -2
  381. package/ts_build/src/services/KnowhowClient.js.map +1 -1
  382. package/ts_build/src/services/Mcp.d.ts +1 -0
  383. package/ts_build/src/services/Mcp.js +20 -3
  384. package/ts_build/src/services/Mcp.js.map +1 -1
  385. package/ts_build/src/services/McpServer.d.ts +1 -1
  386. package/ts_build/src/services/McpServer.js +8 -4
  387. package/ts_build/src/services/McpServer.js.map +1 -1
  388. package/ts_build/src/services/McpWebsocketTransport.js +17 -7
  389. package/ts_build/src/services/McpWebsocketTransport.js.map +1 -1
  390. package/ts_build/src/services/MessageProcessor.d.ts +1 -1
  391. package/ts_build/src/services/MessageProcessor.js +4 -4
  392. package/ts_build/src/services/MessageProcessor.js.map +1 -1
  393. package/ts_build/src/services/index.d.ts +2 -0
  394. package/ts_build/src/services/index.js +4 -0
  395. package/ts_build/src/services/index.js.map +1 -1
  396. package/ts_build/src/services/script-execution/ScriptExecutor.d.ts +1 -0
  397. package/ts_build/src/services/script-execution/ScriptExecutor.js +23 -0
  398. package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
  399. package/ts_build/src/services/types.d.ts +2 -6
  400. package/ts_build/src/services/types.js +4 -4
  401. package/ts_build/src/services/types.js.map +1 -1
  402. package/ts_build/src/types.d.ts +11 -0
  403. package/ts_build/src/types.js +8 -0
  404. package/ts_build/src/types.js.map +1 -1
  405. package/ts_build/src/utils/index.d.ts +2 -0
  406. package/ts_build/src/utils/index.js +102 -1
  407. package/ts_build/src/utils/index.js.map +1 -1
  408. package/ts_build/tests/XmlToolCallProcessor.test.d.ts +1 -0
  409. package/ts_build/tests/XmlToolCallProcessor.test.js +376 -0
  410. package/ts_build/tests/XmlToolCallProcessor.test.js.map +1 -0
  411. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.d.ts +1 -0
  412. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js +114 -0
  413. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js.map +1 -0
  414. package/ts_build/tests/manual/ycmd/minimal_advanced_test.d.ts +2 -0
  415. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js +104 -0
  416. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js.map +1 -0
  417. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.d.ts +1 -0
  418. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js +74 -0
  419. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js.map +1 -0
  420. package/ts_build/tests/manual/ycmd/simple_test.d.ts +2 -0
  421. package/ts_build/tests/manual/ycmd/simple_test.js +82 -0
  422. package/ts_build/tests/manual/ycmd/simple_test.js.map +1 -0
  423. package/ts_build/tests/manual/ycmd/test-typescript-sample.d.ts +14 -0
  424. package/ts_build/tests/manual/ycmd/test-typescript-sample.js +20 -0
  425. package/ts_build/tests/manual/ycmd/test-typescript-sample.js.map +1 -0
  426. package/ts_build/tests/manual/ycmd/test_advanced_features.d.ts +2 -0
  427. package/ts_build/tests/manual/ycmd/test_advanced_features.js +297 -0
  428. package/ts_build/tests/manual/ycmd/test_advanced_features.js.map +1 -0
  429. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.d.ts +3 -0
  430. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js +262 -0
  431. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js.map +1 -0
  432. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.d.ts +2 -0
  433. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js +186 -0
  434. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js.map +1 -0
  435. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.d.ts +1 -0
  436. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js +174 -0
  437. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js.map +1 -0
  438. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.d.ts +2 -0
  439. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js +106 -0
  440. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js.map +1 -0
  441. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.d.ts +1 -0
  442. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js +104 -0
  443. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js.map +1 -0
  444. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.d.ts +1 -0
  445. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js +119 -0
  446. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js.map +1 -0
  447. package/ts_build/tests/manual/ycmd/test_discover_commands.d.ts +2 -0
  448. package/ts_build/tests/manual/ycmd/test_discover_commands.js +243 -0
  449. package/ts_build/tests/manual/ycmd/test_discover_commands.js.map +1 -0
  450. package/ts_build/tests/manual/ycmd/test_endpoints.d.ts +2 -0
  451. package/ts_build/tests/manual/ycmd/test_endpoints.js +120 -0
  452. package/ts_build/tests/manual/ycmd/test_endpoints.js.map +1 -0
  453. package/ts_build/tests/manual/ycmd/test_final_comprehensive.d.ts +2 -0
  454. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js +221 -0
  455. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js.map +1 -0
  456. package/ts_build/tests/manual/ycmd/test_final_validation.d.ts +2 -0
  457. package/ts_build/tests/manual/ycmd/test_final_validation.js +160 -0
  458. package/ts_build/tests/manual/ycmd/test_final_validation.js.map +1 -0
  459. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.d.ts +2 -0
  460. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js +37 -0
  461. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js.map +1 -0
  462. package/ts_build/tests/manual/ycmd/test_server_manager.d.ts +1 -0
  463. package/ts_build/tests/manual/ycmd/test_server_manager.js +38 -0
  464. package/ts_build/tests/manual/ycmd/test_server_manager.js.map +1 -0
  465. package/ts_build/tests/manual/ycmd/test_simple_debug.d.ts +2 -0
  466. package/ts_build/tests/manual/ycmd/test_simple_debug.js +99 -0
  467. package/ts_build/tests/manual/ycmd/test_simple_debug.js.map +1 -0
  468. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.d.ts +1 -0
  469. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js +128 -0
  470. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js.map +1 -0
  471. package/ts_build/tests/manual/ycmd/test_typescript_simple.d.ts +1 -0
  472. package/ts_build/tests/manual/ycmd/test_typescript_simple.js +66 -0
  473. package/ts_build/tests/manual/ycmd/test_typescript_simple.js.map +1 -0
  474. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.d.ts +1 -0
  475. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js +105 -0
  476. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js.map +1 -0
  477. package/ts_build/tests/manual/ycmd/test_workspace_config.d.ts +1 -0
  478. package/ts_build/tests/manual/ycmd/test_workspace_config.js +89 -0
  479. package/ts_build/tests/manual/ycmd/test_workspace_config.js.map +1 -0
  480. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.d.ts +2 -0
  481. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js +130 -0
  482. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js.map +1 -0
  483. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.d.ts +1 -0
  484. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js +83 -0
  485. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js.map +1 -0
  486. package/ts_build/tests/manual/ycmd/test_ycmd_direct.d.ts +2 -0
  487. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js +149 -0
  488. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js.map +1 -0
  489. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.d.ts +15 -0
  490. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js +58 -0
  491. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js.map +1 -0
  492. package/ts_build/tests/manual/ycmd/test_ycmd_final.d.ts +2 -0
  493. package/ts_build/tests/manual/ycmd/test_ycmd_final.js +195 -0
  494. package/ts_build/tests/manual/ycmd/test_ycmd_final.js.map +1 -0
  495. package/ts_build/tests/manual/ycmd/test_ycmd_integration.d.ts +3 -0
  496. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js +110 -0
  497. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js.map +1 -0
  498. package/ts_build/tests/manual/ycmd/test_ycmd_simple.d.ts +2 -0
  499. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js +36 -0
  500. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js.map +1 -0
  501. package/ts_build/tests/manual/ycmd/working_simple_test.d.ts +2 -0
  502. package/ts_build/tests/manual/ycmd/working_simple_test.js +134 -0
  503. package/ts_build/tests/manual/ycmd/working_simple_test.js.map +1 -0
  504. package/tsconfig.json +3 -1
@@ -0,0 +1,375 @@
1
+ "use client";
2
+
3
+ import { useState, useEffect } from "react";
4
+ import { useParams, useRouter } from "next/navigation";
5
+ import { BenchmarkResults, ExerciseResult } from "@/types/benchmark";
6
+ import { formatCurrency, formatTime } from "@/utils/dataProcessor";
7
+
8
+ export default function ExerciseDetailPage() {
9
+ const params = useParams();
10
+ const router = useRouter();
11
+ const [benchmarkData, setBenchmarkData] = useState<BenchmarkResults | null>(
12
+ null
13
+ );
14
+ const [exerciseData, setExerciseData] = useState<ExerciseResult | null>(null);
15
+ const [loading, setLoading] = useState(true);
16
+ const [error, setError] = useState<string | null>(null);
17
+
18
+ const model = decodeURIComponent(params.model as string);
19
+ const provider = decodeURIComponent(params.provider as string);
20
+ const language = decodeURIComponent(params.language as string);
21
+ const exerciseName = decodeURIComponent(params.exercise as string);
22
+
23
+ useEffect(() => {
24
+ async function fetchExerciseData() {
25
+ try {
26
+ // First fetch the benchmark data
27
+ const response = await fetch(
28
+ `/api/benchmark-detail?model=${encodeURIComponent(
29
+ model
30
+ )}&provider=${encodeURIComponent(
31
+ provider
32
+ )}&language=${encodeURIComponent(language)}`
33
+ );
34
+ if (!response.ok) {
35
+ throw new Error("Failed to fetch benchmark details");
36
+ }
37
+ const data = await response.json();
38
+ setBenchmarkData(data.latest);
39
+
40
+ // Find the specific exercise
41
+ const exercise = data.latest.exercises.find(
42
+ (ex: ExerciseResult) => ex.exerciseName === exerciseName
43
+ );
44
+
45
+ if (!exercise) {
46
+ throw new Error(`Exercise "${exerciseName}" not found`);
47
+ }
48
+
49
+ setExerciseData(exercise);
50
+ } catch (err) {
51
+ setError(err instanceof Error ? err.message : "An error occurred");
52
+ } finally {
53
+ setLoading(false);
54
+ }
55
+ }
56
+
57
+ fetchExerciseData();
58
+ }, [model, provider, language, exerciseName]);
59
+
60
+ const getStatusBadge = (passed: boolean) => {
61
+ const baseClasses = "px-2 py-1 text-xs font-medium rounded-full";
62
+ return passed
63
+ ? `${baseClasses} bg-green-100 text-green-800`
64
+ : `${baseClasses} bg-red-100 text-red-800`;
65
+ };
66
+
67
+ const getStatusIcon = (passed: boolean) => {
68
+ return passed ? "✅" : "❌";
69
+ };
70
+
71
+ if (loading) {
72
+ return (
73
+ <div className="min-h-screen bg-gray-50 flex items-center justify-center">
74
+ <div className="text-center">
75
+ <div className="animate-spin rounded-full h-32 w-32 border-b-2 border-blue-500 mx-auto"></div>
76
+ <p className="mt-4 text-gray-600">Loading exercise details...</p>
77
+ </div>
78
+ </div>
79
+ );
80
+ }
81
+
82
+ if (error || !exerciseData || !benchmarkData) {
83
+ return (
84
+ <div className="min-h-screen bg-gray-50 flex items-center justify-center">
85
+ <div className="text-center">
86
+ <div className="text-red-500 text-6xl mb-4">⚠️</div>
87
+ <h3 className="text-lg font-medium text-gray-900 mb-2">
88
+ Error Loading Exercise Details
89
+ </h3>
90
+ <p className="text-gray-500 mb-4">
91
+ {error || "Exercise data not found"}
92
+ </p>
93
+ <button
94
+ onClick={() => router.back()}
95
+ className="bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded-md"
96
+ >
97
+ Go Back
98
+ </button>
99
+ </div>
100
+ </div>
101
+ );
102
+ }
103
+
104
+ return (
105
+ <div className="min-h-screen bg-gray-50">
106
+ <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
107
+ {/* Header */}
108
+ <div className="mb-8">
109
+ <button
110
+ onClick={() =>
111
+ router.push(
112
+ `/details/${encodeURIComponent(model)}/${encodeURIComponent(
113
+ provider
114
+ )}/${encodeURIComponent(language)}`
115
+ )
116
+ }
117
+ className="mb-4 text-blue-600 hover:text-blue-800 flex items-center"
118
+ >
119
+ ← Back to Benchmark Details
120
+ </button>
121
+ <h1 className="text-3xl font-bold text-gray-900">
122
+ Exercise: {exerciseName}
123
+ </h1>
124
+ <p className="mt-2 text-gray-600">
125
+ Model: {model} • Provider: {provider} • Language: {language}
126
+ </p>
127
+ </div>
128
+
129
+ {/* Exercise Summary */}
130
+ <div className="grid grid-cols-1 md:grid-cols-4 gap-6 mb-8">
131
+ <div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
132
+ <div className="flex items-center">
133
+ <div className="flex-shrink-0">
134
+ <div
135
+ className={`w-8 h-8 rounded-md flex items-center justify-center ${
136
+ exerciseData.testResult?.success
137
+ ? "bg-green-500"
138
+ : "bg-red-500"
139
+ }`}
140
+ >
141
+ <span className="text-white font-bold">
142
+ {exerciseData.testResult?.success ? "✓" : "✗"}
143
+ </span>
144
+ </div>
145
+ </div>
146
+ <div className="ml-4">
147
+ <p className="text-sm font-medium text-gray-500">
148
+ Overall Status
149
+ </p>
150
+ <p className="text-2xl font-semibold text-gray-900">
151
+ {exerciseData.testResult?.success ? "Pass" : "Fail"}
152
+ </p>
153
+ </div>
154
+ </div>
155
+ </div>
156
+
157
+ <div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
158
+ <div className="flex items-center">
159
+ <div className="flex-shrink-0">
160
+ <div className="w-8 h-8 bg-blue-500 rounded-md flex items-center justify-center">
161
+ <span className="text-white font-bold">T</span>
162
+ </div>
163
+ </div>
164
+ <div className="ml-4">
165
+ <p className="text-sm font-medium text-gray-500">
166
+ Tests Passed
167
+ </p>
168
+ <p className="text-2xl font-semibold text-gray-900">
169
+ {exerciseData.testResult?.passed || 0} /{" "}
170
+ {exerciseData.testResult?.total || 0}
171
+ </p>
172
+ </div>
173
+ </div>
174
+ </div>
175
+
176
+ <div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
177
+ <div className="flex items-center">
178
+ <div className="flex-shrink-0">
179
+ <div className="w-8 h-8 bg-purple-500 rounded-md flex items-center justify-center">
180
+ <span className="text-white font-bold">$</span>
181
+ </div>
182
+ </div>
183
+ <div className="ml-4">
184
+ <p className="text-sm font-medium text-gray-500">Cost</p>
185
+ <p className="text-2xl font-semibold text-gray-900">
186
+ {formatCurrency(exerciseData.cost)}
187
+ </p>
188
+ </div>
189
+ </div>
190
+ </div>
191
+
192
+ <div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
193
+ <div className="flex items-center">
194
+ <div className="flex-shrink-0">
195
+ <div className="w-8 h-8 bg-orange-500 rounded-md flex items-center justify-center">
196
+ <span className="text-white font-bold">⏱</span>
197
+ </div>
198
+ </div>
199
+ <div className="ml-4">
200
+ <p className="text-sm font-medium text-gray-500">Duration</p>
201
+ <p className="text-2xl font-semibold text-gray-900">
202
+ {formatTime(exerciseData.timeElapsed || 0)}
203
+ </p>
204
+ </div>
205
+ </div>
206
+ </div>
207
+ </div>
208
+
209
+ {/* Test Results Section */}
210
+ <div className="bg-white rounded-lg shadow-sm border border-gray-200 mb-8">
211
+ <div className="px-6 py-4 border-b border-gray-200">
212
+ <h2 className="text-lg font-semibold text-gray-900">
213
+ Test Results
214
+ </h2>
215
+ </div>
216
+ <div className="p-6">
217
+ {exerciseData.testResult ? (
218
+ <div className="space-y-6">
219
+ {/* Test Summary */}
220
+ <div className="grid grid-cols-2 md:grid-cols-4 gap-4">
221
+ <div className="bg-green-50 border border-green-200 rounded-lg p-4">
222
+ <div className="text-center">
223
+ <div className="text-2xl font-bold text-green-600">
224
+ {exerciseData.testResult.passed || 0}
225
+ </div>
226
+ <div className="text-sm text-green-700">Tests Passed</div>
227
+ </div>
228
+ </div>
229
+ <div className="bg-red-50 border border-red-200 rounded-lg p-4">
230
+ <div className="text-center">
231
+ <div className="text-2xl font-bold text-red-600">
232
+ {exerciseData.testResult.failed || 0}
233
+ </div>
234
+ <div className="text-sm text-red-700">Tests Failed</div>
235
+ </div>
236
+ </div>
237
+ <div className="bg-yellow-50 border border-yellow-200 rounded-lg p-4">
238
+ <div className="text-center">
239
+ <div className="text-2xl font-bold text-yellow-600">
240
+ {exerciseData.testResult.skipped || 0}
241
+ </div>
242
+ <div className="text-sm text-yellow-700">
243
+ Tests Skipped
244
+ </div>
245
+ </div>
246
+ </div>
247
+ <div className="bg-blue-50 border border-blue-200 rounded-lg p-4">
248
+ <div className="text-center">
249
+ <div className="text-2xl font-bold text-blue-600">
250
+ {exerciseData.testResult.total || 0}
251
+ </div>
252
+ <div className="text-sm text-blue-700">Total Tests</div>
253
+ </div>
254
+ </div>
255
+ </div>
256
+
257
+ {/* Output */}
258
+ {exerciseData.testResult.output && (
259
+ <div className="border border-gray-200 rounded-lg">
260
+ <div className="px-4 py-3 bg-gray-50 border-b border-gray-200 rounded-t-lg">
261
+ <h3 className="text-sm font-medium text-gray-900">
262
+ Test Output
263
+ </h3>
264
+ </div>
265
+ <div className="p-4">
266
+ <pre className="text-sm text-gray-800 whitespace-pre-wrap font-mono bg-gray-50 p-4 rounded border overflow-x-auto">
267
+ {(() => {
268
+ try {
269
+ const r = JSON.stringify(
270
+ typeof exerciseData.testResult.output === "string"
271
+ ? JSON.parse(exerciseData.testResult.output)
272
+ : exerciseData.testResult.output,
273
+ null,
274
+ 2
275
+ );
276
+ return r;
277
+ } catch (e) {
278
+ return exerciseData.testResult.output;
279
+ }
280
+ })()}
281
+ </pre>
282
+ </div>
283
+ </div>
284
+ )}
285
+
286
+ {/* Test Status Summary */}
287
+ <div className="bg-gray-50 border border-gray-200 rounded-lg p-4">
288
+ <div className="flex items-center justify-between">
289
+ <div>
290
+ <h3 className="text-lg font-medium text-gray-900">
291
+ Overall Test Result
292
+ </h3>
293
+ <p className="text-sm text-gray-600">
294
+ {exerciseData.testResult.success
295
+ ? "All tests completed successfully"
296
+ : "Some tests failed or encountered errors"}
297
+ </p>
298
+ </div>
299
+ <div
300
+ className={`px-4 py-2 rounded-full text-sm font-medium ${
301
+ exerciseData.testResult.success
302
+ ? "bg-green-100 text-green-800"
303
+ : "bg-red-100 text-red-800"
304
+ }`}
305
+ >
306
+ {exerciseData.testResult.success ? "PASSED" : "FAILED"}
307
+ </div>
308
+ </div>
309
+ </div>
310
+ </div>
311
+ ) : (
312
+ <div className="text-center py-8">
313
+ <div className="text-gray-400 text-4xl mb-4">📋</div>
314
+ <p className="text-gray-500">
315
+ No detailed test results available
316
+ </p>
317
+ </div>
318
+ )}
319
+ </div>
320
+ </div>
321
+
322
+ {/* Exercise Metadata */}
323
+ <div className="bg-white rounded-lg shadow-sm border border-gray-200">
324
+ <div className="px-6 py-4 border-b border-gray-200">
325
+ <h2 className="text-lg font-semibold text-gray-900">
326
+ Exercise Information
327
+ </h2>
328
+ </div>
329
+ <div className="p-6">
330
+ <dl className="grid grid-cols-1 gap-x-4 gap-y-4 sm:grid-cols-2">
331
+ <div>
332
+ <dt className="text-sm font-medium text-gray-500">
333
+ Exercise Name
334
+ </dt>
335
+ <dd className="mt-1 text-sm text-gray-900">
336
+ {exerciseData.exerciseName}
337
+ </dd>
338
+ </div>
339
+ <div>
340
+ <dt className="text-sm font-medium text-gray-500">Cost</dt>
341
+ <dd className="mt-1 text-sm text-gray-900">
342
+ {formatCurrency(exerciseData.cost)}
343
+ </dd>
344
+ </div>
345
+ <div>
346
+ <dt className="text-sm font-medium text-gray-500">Duration</dt>
347
+ <dd className="mt-1 text-sm text-gray-900">
348
+ {formatTime(exerciseData.timeElapsed || 0)}
349
+ </dd>
350
+ </div>
351
+ <div>
352
+ <dt className="text-sm font-medium text-gray-500">
353
+ Success Rate
354
+ </dt>
355
+ <dd className="mt-1 text-sm text-gray-900">
356
+ {exerciseData.testResult && exerciseData.testResult.total > 0
357
+ ? `${(
358
+ ((exerciseData.testResult.passed || 0) /
359
+ exerciseData.testResult.total) *
360
+ 100
361
+ ).toFixed(1)}%`
362
+ : exerciseData.testResult?.success
363
+ ? "100.0%"
364
+ : exerciseData.testResult?.success === false
365
+ ? "0.0%"
366
+ : "N/A"}
367
+ </dd>
368
+ </div>
369
+ </dl>
370
+ </div>
371
+ </div>
372
+ </div>
373
+ </div>
374
+ );
375
+ }
@@ -0,0 +1,27 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ :root {
6
+ --background: #ffffff;
7
+ --foreground: #171717;
8
+ }
9
+
10
+ @media (prefers-color-scheme: dark) {
11
+ :root {
12
+ --background: #0a0a0a;
13
+ --foreground: #ededed;
14
+ }
15
+ }
16
+
17
+ body {
18
+ color: var(--foreground);
19
+ background: var(--background);
20
+ font-family: Arial, Helvetica, sans-serif;
21
+ }
22
+
23
+ @layer utilities {
24
+ .text-balance {
25
+ text-wrap: balance;
26
+ }
27
+ }
@@ -0,0 +1,21 @@
1
+ import type { Metadata } from 'next'
2
+ import './globals.css'
3
+
4
+ export const metadata: Metadata = {
5
+ title: 'Benchmark Results Leaderboard',
6
+ description: 'Exercise results and model performance tracking',
7
+ }
8
+
9
+ export default function RootLayout({
10
+ children,
11
+ }: {
12
+ children: React.ReactNode
13
+ }) {
14
+ return (
15
+ <html lang="en">
16
+ <body className="antialiased">
17
+ {children}
18
+ </body>
19
+ </html>
20
+ )
21
+ }
@@ -0,0 +1,170 @@
1
+ 'use client';
2
+
3
+ import { useState, useEffect } from 'react';
4
+ import { loadLeaderboardData } from '@/utils/dataProcessor';
5
+ import LeaderboardTable from '@/components/LeaderboardTable';
6
+ import PerformanceChart from '@/components/PerformanceChart';
7
+ import { LeaderboardEntry } from '@/types/benchmark';
8
+
9
+ export default function Home() {
10
+ const [leaderboardEntries, setLeaderboardEntries] = useState<LeaderboardEntry[]>([]);
11
+ const [selectedLanguage, setSelectedLanguage] = useState<string>('all');
12
+ const [loading, setLoading] = useState(true);
13
+
14
+ useEffect(() => {
15
+ async function fetchData() {
16
+ const data = await loadLeaderboardData();
17
+ setLeaderboardEntries(data);
18
+ setLoading(false);
19
+ }
20
+ fetchData();
21
+ }, []);
22
+
23
+ // Extract unique languages for dropdown
24
+ const availableLanguages = Array.from(new Set(leaderboardEntries.map(entry => entry.language))).sort();
25
+
26
+ // Filter entries by selected language
27
+ const filteredEntries = selectedLanguage === 'all'
28
+ ? leaderboardEntries
29
+ : leaderboardEntries.filter(entry => entry.language === selectedLanguage);
30
+
31
+ // Update statistics to use filtered data
32
+ const totalModels = filteredEntries.length;
33
+ const totalExercises = filteredEntries.reduce((sum, entry) => sum + entry.totalExercises, 0);
34
+ const averageSuccessRate = filteredEntries.length > 0
35
+ ? filteredEntries.reduce((sum, entry) => sum + entry.successRate, 0) / filteredEntries.length
36
+ : 0;
37
+
38
+ const handleLanguageChange = (language: string) => {
39
+ setSelectedLanguage(language);
40
+ };
41
+
42
+ if (loading) {
43
+ return (
44
+ <div className="min-h-screen bg-gray-50 flex items-center justify-center">
45
+ <div className="text-center">
46
+ <div className="animate-spin rounded-full h-32 w-32 border-b-2 border-blue-500 mx-auto"></div>
47
+ <p className="mt-4 text-gray-600">Loading benchmark results...</p>
48
+ </div>
49
+ </div>
50
+ );
51
+ }
52
+
53
+ return (
54
+ <div className="min-h-screen bg-gray-50">
55
+ <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
56
+ {/* Header */}
57
+ <div className="mb-8">
58
+ <h1 className="text-3xl font-bold text-gray-900">Benchmark Results Leaderboard</h1>
59
+ <p className="mt-2 text-gray-600">
60
+ Track and compare model performance across coding exercises
61
+ </p>
62
+
63
+ {/* Language Filter Dropdown */}
64
+ {availableLanguages.length > 1 && (
65
+ <div className="mt-4">
66
+ <label htmlFor="language-select" className="block text-sm font-medium text-gray-700 mb-2">
67
+ Filter by Language:
68
+ </label>
69
+ <select
70
+ id="language-select"
71
+ value={selectedLanguage}
72
+ onChange={(e) => handleLanguageChange(e.target.value)}
73
+ className="block w-48 px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm"
74
+ >
75
+ <option value="all">All Languages</option>
76
+ {availableLanguages.map((language) => (
77
+ <option key={language} value={language}>
78
+ {language.charAt(0).toUpperCase() + language.slice(1)}
79
+ </option>
80
+ ))}
81
+ </select>
82
+ </div>
83
+ )}
84
+ </div>
85
+
86
+ {/* Summary Stats */}
87
+ <div className="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8">
88
+ <div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
89
+ <div className="flex items-center">
90
+ <div className="flex-shrink-0">
91
+ <div className="w-8 h-8 bg-blue-500 rounded-md flex items-center justify-center">
92
+ <span className="text-white font-bold">M</span>
93
+ </div>
94
+ </div>
95
+ <div className="ml-4">
96
+ <p className="text-sm font-medium text-gray-500">Total Models</p>
97
+ <p className="text-2xl font-semibold text-gray-900">{totalModels}</p>
98
+ </div>
99
+ </div>
100
+ </div>
101
+
102
+ <div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
103
+ <div className="flex items-center">
104
+ <div className="flex-shrink-0">
105
+ <div className="w-8 h-8 bg-green-500 rounded-md flex items-center justify-center">
106
+ <span className="text-white font-bold">E</span>
107
+ </div>
108
+ </div>
109
+ <div className="ml-4">
110
+ <p className="text-sm font-medium text-gray-500">Total Exercises</p>
111
+ <p className="text-2xl font-semibold text-gray-900">{totalExercises}</p>
112
+ </div>
113
+ </div>
114
+ </div>
115
+
116
+ <div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
117
+ <div className="flex items-center">
118
+ <div className="flex-shrink-0">
119
+ <div className="w-8 h-8 bg-yellow-500 rounded-md flex items-center justify-center">
120
+ <span className="text-white font-bold">%</span>
121
+ </div>
122
+ </div>
123
+ <div className="ml-4">
124
+ <p className="text-sm font-medium text-gray-500">Average Success Rate</p>
125
+ <p className="text-2xl font-semibold text-gray-900">{averageSuccessRate.toFixed(1)}%</p>
126
+ </div>
127
+ </div>
128
+ </div>
129
+ </div>
130
+
131
+ {/* Charts */}
132
+ {filteredEntries.length > 0 && (
133
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-8 mb-8">
134
+ <PerformanceChart entries={filteredEntries} chartType="success-rate" selectedLanguage={selectedLanguage} />
135
+ <PerformanceChart entries={filteredEntries} chartType="cost-vs-performance" selectedLanguage={selectedLanguage} />
136
+ </div>
137
+ )}
138
+
139
+ {/* Leaderboard Table */}
140
+ <div className="bg-white rounded-lg shadow-sm border border-gray-200">
141
+ <div className="px-6 py-4 border-b border-gray-200">
142
+ <h2 className="text-xl font-semibold text-gray-900">Leaderboard</h2>
143
+ <p className="mt-1 text-sm text-gray-500">
144
+ Compare model performance across all benchmark runs
145
+ </p>
146
+ </div>
147
+ <div className="p-6">
148
+ {filteredEntries.length > 0 ? (
149
+ <LeaderboardTable entries={filteredEntries} showLanguageColumn={selectedLanguage === 'all'} />
150
+ ) : (
151
+ <div className="text-center py-12">
152
+ <div className="text-gray-400 text-6xl mb-4">📊</div>
153
+ <h3 className="text-lg font-medium text-gray-900 mb-2">No benchmark results found</h3>
154
+ <p className="text-gray-500">
155
+ Run some benchmarks to see results here. Results should be placed in the
156
+ <code className="bg-gray-100 px-2 py-1 rounded text-sm mx-1">benchmarks/results</code> directory.
157
+ </p>
158
+ </div>
159
+ )}
160
+ </div>
161
+ </div>
162
+
163
+ {/* Footer */}
164
+ <div className="mt-8 text-center text-sm text-gray-500">
165
+ <p>Last updated: {new Date().toLocaleString()}</p>
166
+ </div>
167
+ </div>
168
+ </div>
169
+ );
170
+ }