@tyvm/knowhow 0.0.90 → 0.0.92

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 (272) hide show
  1. package/.depcheckrc +30 -0
  2. package/bin/knowhow.js +1 -1
  3. package/package.json +8 -34
  4. package/src/agents/configurable/ConfigAgent.ts +2 -2
  5. package/src/agents/tools/executeScript/index.ts +5 -0
  6. package/src/agents/tools/googleSearch.ts +2 -2
  7. package/src/agents/tools/index.ts +0 -3
  8. package/src/agents/tools/list.ts +0 -147
  9. package/src/agents/tools/loadWebpage.ts +3 -113
  10. package/src/auth/browserLogin.ts +10 -13
  11. package/src/chat/modules/AgentModule.ts +0 -1
  12. package/src/chat/types.ts +1 -1
  13. package/src/cli.ts +63 -3
  14. package/src/clients/gemini.ts +96 -25
  15. package/src/clients/http.ts +7 -11
  16. package/src/clients/pricing/google.ts +122 -26
  17. package/src/conversion.ts +24 -54
  18. package/src/index.ts +15 -20
  19. package/src/login.ts +5 -6
  20. package/src/plugins/language.ts +0 -4
  21. package/src/plugins/plugins.ts +0 -14
  22. package/src/plugins/url.ts +31 -12
  23. package/src/services/EmbeddingsService.ts +70 -0
  24. package/src/services/KnowhowClient.ts +34 -34
  25. package/src/{plugins/downloader/downloader.ts → services/MediaProcessorService.ts} +109 -267
  26. package/src/services/S3.ts +19 -87
  27. package/src/services/index.ts +8 -8
  28. package/src/services/modules/index.ts +12 -3
  29. package/src/services/modules/types.ts +8 -2
  30. package/src/services/script-execution/ScriptExecutor.ts +29 -10
  31. package/src/services/script-execution/ScriptPolicy.ts +6 -2
  32. package/src/types.ts +1 -0
  33. package/src/utils/http.ts +127 -0
  34. package/src/workers/auth/PasskeySetup.ts +7 -11
  35. package/tests/clients/AIClient.test.ts +24 -21
  36. package/tests/manual/file-edits/figma.test.ts +3 -70
  37. package/tests/plugins/language/languagePlugin-content-triggers.test.ts +2 -0
  38. package/tests/plugins/language/languagePlugin.test.ts +2 -0
  39. package/tests/processors/ToolResponseCache.test.ts +2 -2
  40. package/tests/test.spec.ts +0 -14
  41. package/tests/unit/modules/moduleLoading.test.ts +12 -4
  42. package/tests/unit/plugins/pluginLoading.test.ts +6 -6
  43. package/ts_build/package.json +8 -34
  44. package/ts_build/src/agents/tools/ast/astAppendNode.d.ts +1 -1
  45. package/ts_build/src/agents/tools/ast/astAppendNode.js +2 -90
  46. package/ts_build/src/agents/tools/ast/astAppendNode.js.map +1 -1
  47. package/ts_build/src/agents/tools/ast/astDeleteNode.d.ts +1 -1
  48. package/ts_build/src/agents/tools/ast/astDeleteNode.js +2 -88
  49. package/ts_build/src/agents/tools/ast/astDeleteNode.js.map +1 -1
  50. package/ts_build/src/agents/tools/ast/astEditNode.d.ts +1 -1
  51. package/ts_build/src/agents/tools/ast/astEditNode.js +2 -90
  52. package/ts_build/src/agents/tools/ast/astEditNode.js.map +1 -1
  53. package/ts_build/src/agents/tools/ast/astGetPathForLine.d.ts +1 -1
  54. package/ts_build/src/agents/tools/ast/astGetPathForLine.js +2 -72
  55. package/ts_build/src/agents/tools/ast/astGetPathForLine.js.map +1 -1
  56. package/ts_build/src/agents/tools/ast/astListPaths.d.ts +1 -1
  57. package/ts_build/src/agents/tools/ast/astListPaths.js +2 -72
  58. package/ts_build/src/agents/tools/ast/astListPaths.js.map +1 -1
  59. package/ts_build/src/agents/tools/executeScript/index.d.ts +3 -2
  60. package/ts_build/src/agents/tools/executeScript/index.js +4 -1
  61. package/ts_build/src/agents/tools/executeScript/index.js.map +1 -1
  62. package/ts_build/src/agents/tools/googleSearch.js +2 -2
  63. package/ts_build/src/agents/tools/googleSearch.js.map +1 -1
  64. package/ts_build/src/agents/tools/index.d.ts +0 -3
  65. package/ts_build/src/agents/tools/index.js +0 -3
  66. package/ts_build/src/agents/tools/index.js.map +1 -1
  67. package/ts_build/src/agents/tools/list.js +0 -138
  68. package/ts_build/src/agents/tools/list.js.map +1 -1
  69. package/ts_build/src/agents/tools/loadWebpage.js +1 -89
  70. package/ts_build/src/agents/tools/loadWebpage.js.map +1 -1
  71. package/ts_build/src/agents/tools/textSearch.d.ts +1 -1
  72. package/ts_build/src/auth/browserLogin.js +7 -7
  73. package/ts_build/src/auth/browserLogin.js.map +1 -1
  74. package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
  75. package/ts_build/src/chat/types.d.ts +1 -1
  76. package/ts_build/src/cli.d.ts +1 -1
  77. package/ts_build/src/cli.js +47 -1
  78. package/ts_build/src/cli.js.map +1 -1
  79. package/ts_build/src/clients/gemini.d.ts +1 -73
  80. package/ts_build/src/clients/gemini.js +57 -19
  81. package/ts_build/src/clients/gemini.js.map +1 -1
  82. package/ts_build/src/clients/http.js +5 -9
  83. package/ts_build/src/clients/http.js.map +1 -1
  84. package/ts_build/src/clients/pricing/google.d.ts +17 -73
  85. package/ts_build/src/clients/pricing/google.js +47 -10
  86. package/ts_build/src/clients/pricing/google.js.map +1 -1
  87. package/ts_build/src/conversion.d.ts +1 -4
  88. package/ts_build/src/conversion.js +12 -27
  89. package/ts_build/src/conversion.js.map +1 -1
  90. package/ts_build/src/index.d.ts +4 -0
  91. package/ts_build/src/index.js +15 -14
  92. package/ts_build/src/index.js.map +1 -1
  93. package/ts_build/src/login.js +5 -4
  94. package/ts_build/src/login.js.map +1 -1
  95. package/ts_build/src/plugins/downloader/downloader.js +3 -3
  96. package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
  97. package/ts_build/src/plugins/language.js.map +1 -1
  98. package/ts_build/src/plugins/plugins.js +0 -14
  99. package/ts_build/src/plugins/plugins.js.map +1 -1
  100. package/ts_build/src/plugins/tree-sitter/editor.d.ts +3 -32
  101. package/ts_build/src/plugins/tree-sitter/editor.js +6 -208
  102. package/ts_build/src/plugins/tree-sitter/editor.js.map +1 -1
  103. package/ts_build/src/plugins/tree-sitter/parser.d.ts +19 -54
  104. package/ts_build/src/plugins/tree-sitter/parser.js +19 -293
  105. package/ts_build/src/plugins/tree-sitter/parser.js.map +1 -1
  106. package/ts_build/src/plugins/tree-sitter/simple-paths.d.ts +2 -15
  107. package/ts_build/src/plugins/tree-sitter/simple-paths.js +2 -324
  108. package/ts_build/src/plugins/tree-sitter/simple-paths.js.map +1 -1
  109. package/ts_build/src/plugins/url.js +27 -8
  110. package/ts_build/src/plugins/url.js.map +1 -1
  111. package/ts_build/src/services/EmbeddingsService.d.ts +14 -0
  112. package/ts_build/src/services/EmbeddingsService.js +33 -0
  113. package/ts_build/src/services/EmbeddingsService.js.map +1 -0
  114. package/ts_build/src/services/GitHub.js +2 -2
  115. package/ts_build/src/services/GitHub.js.map +1 -1
  116. package/ts_build/src/services/KnowhowClient.d.ts +29 -29
  117. package/ts_build/src/services/KnowhowClient.js +33 -33
  118. package/ts_build/src/services/KnowhowClient.js.map +1 -1
  119. package/ts_build/src/services/MediaProcessorService.d.ts +22 -0
  120. package/ts_build/src/services/MediaProcessorService.js +215 -0
  121. package/ts_build/src/services/MediaProcessorService.js.map +1 -0
  122. package/ts_build/src/services/S3.d.ts +0 -4
  123. package/ts_build/src/services/S3.js +14 -60
  124. package/ts_build/src/services/S3.js.map +1 -1
  125. package/ts_build/src/services/index.d.ts +6 -5
  126. package/ts_build/src/services/index.js +6 -6
  127. package/ts_build/src/services/index.js.map +1 -1
  128. package/ts_build/src/services/modules/index.js +12 -3
  129. package/ts_build/src/services/modules/index.js.map +1 -1
  130. package/ts_build/src/services/modules/types.d.ts +8 -2
  131. package/ts_build/src/services/script-execution/ScriptExecutor.js +22 -7
  132. package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
  133. package/ts_build/src/services/script-execution/ScriptPolicy.d.ts +1 -1
  134. package/ts_build/src/services/script-execution/ScriptPolicy.js +4 -2
  135. package/ts_build/src/services/script-execution/ScriptPolicy.js.map +1 -1
  136. package/ts_build/src/types.d.ts +1 -0
  137. package/ts_build/src/types.js +1 -0
  138. package/ts_build/src/types.js.map +1 -1
  139. package/ts_build/src/utils/http.d.ts +27 -0
  140. package/ts_build/src/utils/http.js +98 -0
  141. package/ts_build/src/utils/http.js.map +1 -0
  142. package/ts_build/src/workers/auth/PasskeySetup.js +6 -7
  143. package/ts_build/src/workers/auth/PasskeySetup.js.map +1 -1
  144. package/ts_build/tests/clients/AIClient.test.js +11 -14
  145. package/ts_build/tests/clients/AIClient.test.js.map +1 -1
  146. package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -1
  147. package/ts_build/tests/manual/file-edits/figma.test.js +1 -46
  148. package/ts_build/tests/manual/file-edits/figma.test.js.map +1 -1
  149. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +2 -0
  150. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +1 -1
  151. package/ts_build/tests/plugins/language/languagePlugin.test.js +2 -0
  152. package/ts_build/tests/plugins/language/languagePlugin.test.js.map +1 -1
  153. package/ts_build/tests/processors/ToolResponseCache.test.js +2 -2
  154. package/ts_build/tests/processors/ToolResponseCache.test.js.map +1 -1
  155. package/ts_build/tests/test.spec.js +0 -14
  156. package/ts_build/tests/test.spec.js.map +1 -1
  157. package/ts_build/tests/tree-sitter/tree-sitter.test.d.ts +0 -1
  158. package/ts_build/tests/tree-sitter/tree-sitter.test.js +2 -183
  159. package/ts_build/tests/tree-sitter/tree-sitter.test.js.map +1 -1
  160. package/ts_build/tests/unit/modules/moduleLoading.test.js +11 -4
  161. package/ts_build/tests/unit/modules/moduleLoading.test.js.map +1 -1
  162. package/ts_build/tests/unit/plugins/pluginLoading.test.js +4 -4
  163. package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +1 -1
  164. package/benchmarks/.dockerignore +0 -7
  165. package/benchmarks/README.md +0 -166
  166. package/benchmarks/docker/Dockerfile +0 -68
  167. package/benchmarks/example-config.yml +0 -27
  168. package/benchmarks/jest.config.js +0 -13
  169. package/benchmarks/package-lock.json +0 -4297
  170. package/benchmarks/package.json +0 -39
  171. package/benchmarks/results/27b0a06/2025-09-27/xai/xai-grok-code-fast-1.json +0 -2909
  172. package/benchmarks/results/4057aed/2025-08-14/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -1671
  173. package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +0 -2814
  174. package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -2014
  175. package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3121
  176. package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +0 -98
  177. package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +0 -3256
  178. package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +0 -4298
  179. package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3031
  180. package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -2990
  181. package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3256
  182. package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3007
  183. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -3256
  184. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +0 -3036
  185. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +0 -3280
  186. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -1920
  187. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +0 -3281
  188. package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +0 -2896
  189. package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3011
  190. package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +0 -3003
  191. package/benchmarks/scripts/build-and-run.sh +0 -47
  192. package/benchmarks/scripts/clone-exercism.sh +0 -92
  193. package/benchmarks/scripts/validate.sh +0 -48
  194. package/benchmarks/src/__tests__/runner.test.ts +0 -27
  195. package/benchmarks/src/cli.ts +0 -90
  196. package/benchmarks/src/evaluators/EvaluatorRegistry.ts +0 -64
  197. package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +0 -183
  198. package/benchmarks/src/evaluators/index.ts +0 -3
  199. package/benchmarks/src/evaluators/types.ts +0 -22
  200. package/benchmarks/src/index.ts +0 -3
  201. package/benchmarks/src/providers.ts +0 -13
  202. package/benchmarks/src/runner.ts +0 -824
  203. package/benchmarks/src/types.ts +0 -63
  204. package/benchmarks/tsconfig.json +0 -19
  205. package/leaderboard/README.md +0 -148
  206. package/leaderboard/app/api/benchmark-data/route.ts +0 -131
  207. package/leaderboard/app/api/benchmark-detail/route.ts +0 -172
  208. package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +0 -501
  209. package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +0 -375
  210. package/leaderboard/app/globals.css +0 -27
  211. package/leaderboard/app/layout.tsx +0 -21
  212. package/leaderboard/app/page.tsx +0 -170
  213. package/leaderboard/components/LeaderboardTable.tsx +0 -168
  214. package/leaderboard/components/PerformanceChart.tsx +0 -109
  215. package/leaderboard/next-env.d.ts +0 -5
  216. package/leaderboard/next.config.js +0 -4
  217. package/leaderboard/package-lock.json +0 -6363
  218. package/leaderboard/package.json +0 -28
  219. package/leaderboard/postcss.config.js +0 -6
  220. package/leaderboard/tailwind.config.js +0 -17
  221. package/leaderboard/tsconfig.json +0 -28
  222. package/leaderboard/types/benchmark.ts +0 -67
  223. package/leaderboard/utils/dataProcessor.ts +0 -33
  224. package/src/agents/tools/asana/definitions.ts +0 -199
  225. package/src/agents/tools/asana/index.ts +0 -108
  226. package/src/agents/tools/ast/astAppendNode.ts +0 -90
  227. package/src/agents/tools/ast/astDeleteNode.ts +0 -88
  228. package/src/agents/tools/ast/astEditNode.ts +0 -95
  229. package/src/agents/tools/ast/astGetPathForLine.ts +0 -73
  230. package/src/agents/tools/ast/astListPaths.ts +0 -66
  231. package/src/agents/tools/ast/index.ts +0 -7
  232. package/src/agents/tools/github/definitions.ts +0 -89
  233. package/src/agents/tools/github/index.ts +0 -67
  234. package/src/chat-old.ts +0 -446
  235. package/src/plugins/asana.ts +0 -146
  236. package/src/plugins/downloader/plugin.ts +0 -103
  237. package/src/plugins/downloader/types.ts +0 -92
  238. package/src/plugins/figma.ts +0 -158
  239. package/src/plugins/github.ts +0 -219
  240. package/src/plugins/jira.ts +0 -115
  241. package/src/plugins/linear.ts +0 -230
  242. package/src/plugins/notion.ts +0 -179
  243. package/src/plugins/tree-sitter/editor.ts +0 -369
  244. package/src/plugins/tree-sitter/lang-packs/index.ts +0 -23
  245. package/src/plugins/tree-sitter/lang-packs/java.ts +0 -59
  246. package/src/plugins/tree-sitter/lang-packs/javascript.ts +0 -57
  247. package/src/plugins/tree-sitter/lang-packs/python.ts +0 -45
  248. package/src/plugins/tree-sitter/lang-packs/types.ts +0 -79
  249. package/src/plugins/tree-sitter/lang-packs/typescript.ts +0 -49
  250. package/src/plugins/tree-sitter/parser.ts +0 -470
  251. package/src/plugins/tree-sitter/simple-paths.ts +0 -467
  252. package/src/services/GitHub.ts +0 -59
  253. package/tests/tree-sitter/editor.test.ts +0 -113
  254. package/tests/tree-sitter/invalid.test.ts +0 -299
  255. package/tests/tree-sitter/paths/common-edits.test.ts +0 -564
  256. package/tests/tree-sitter/paths/debug-exact-position.test.ts +0 -44
  257. package/tests/tree-sitter/paths/debug-line-indexing.test.ts +0 -49
  258. package/tests/tree-sitter/paths/debug-paths.test.ts +0 -90
  259. package/tests/tree-sitter/paths/paths.test.ts +0 -170
  260. package/tests/tree-sitter/paths/simple-paths.test.ts +0 -367
  261. package/tests/tree-sitter/sample-after.ts +0 -48
  262. package/tests/tree-sitter/sample-before.ts +0 -25
  263. package/tests/tree-sitter/test-files/completely-broken.ts +0 -7
  264. package/tests/tree-sitter/test-files/duplicate-braces.ts +0 -39
  265. package/tests/tree-sitter/test-files/invalid-nesting.ts +0 -39
  266. package/tests/tree-sitter/test-files/malformed-signature.ts +0 -39
  267. package/tests/tree-sitter/test-files/mismatched-parens.ts +0 -39
  268. package/tests/tree-sitter/test-files/missing-semicolon.ts +0 -39
  269. package/tests/tree-sitter/test-files/partially-broken.ts +0 -20
  270. package/tests/tree-sitter/test-files/specific-errors.ts +0 -14
  271. package/tests/tree-sitter/test-files/unclosed-string.ts +0 -39
  272. package/tests/tree-sitter/tree-sitter.test.ts +0 -251
@@ -1,168 +0,0 @@
1
- 'use client';
2
-
3
- import { useState } from 'react';
4
- import { useRouter } from 'next/navigation';
5
- import { LeaderboardEntry } from '@/types/benchmark';
6
- import { formatCurrency, formatTime, formatPercentage } from '@/utils/dataProcessor';
7
-
8
- interface LeaderboardTableProps {
9
- entries: LeaderboardEntry[];
10
- showLanguageColumn?: boolean;
11
- }
12
-
13
- type SortField = keyof LeaderboardEntry;
14
- type SortDirection = 'asc' | 'desc';
15
-
16
- export default function LeaderboardTable({ entries, showLanguageColumn = true }: LeaderboardTableProps) {
17
- const router = useRouter();
18
- const [sortField, setSortField] = useState<SortField>('successRate');
19
- const [sortDirection, setSortDirection] = useState<SortDirection>('desc');
20
-
21
- const handleSort = (field: SortField) => {
22
- if (sortField === field) {
23
- setSortDirection(sortDirection === 'asc' ? 'desc' : 'asc');
24
- } else {
25
- setSortField(field);
26
- setSortDirection('desc');
27
- }
28
- };
29
-
30
- const sortedEntries = [...entries].sort((a, b) => {
31
- const aValue = a[sortField];
32
- const bValue = b[sortField];
33
-
34
- let comparison = 0;
35
- if (typeof aValue === 'string' && typeof bValue === 'string') {
36
- comparison = aValue.localeCompare(bValue);
37
- } else if (typeof aValue === 'number' && typeof bValue === 'number') {
38
- comparison = aValue - bValue;
39
- }
40
-
41
- return sortDirection === 'asc' ? comparison : -comparison;
42
- });
43
-
44
- const getSortIcon = (field: SortField) => {
45
- if (sortField !== field) return '↕️';
46
- return sortDirection === 'asc' ? '↑' : '↓';
47
- };
48
-
49
- const getStatusColor = (successRate: number) => {
50
- if (successRate >= 90) return 'text-green-600';
51
- if (successRate >= 70) return 'text-yellow-600';
52
- return 'text-red-600';
53
- };
54
-
55
- const handleRowClick = (entry: LeaderboardEntry) => {
56
- const model = encodeURIComponent(entry.model);
57
- const provider = encodeURIComponent(entry.provider);
58
- const language = encodeURIComponent(entry.language);
59
- router.push(`/details/${model}/${provider}/${language}`);
60
- };
61
-
62
- return (
63
- <div className="overflow-x-auto">
64
- <table className="min-w-full bg-white border border-gray-200 rounded-lg shadow-sm">
65
- <thead className="bg-gray-50">
66
- <tr>
67
- <th
68
- className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider cursor-pointer hover:bg-gray-100"
69
- onClick={() => handleSort('model')}
70
- >
71
- Model {getSortIcon('model')}
72
- </th>
73
- <th
74
- className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider cursor-pointer hover:bg-gray-100"
75
- onClick={() => handleSort('provider')}
76
- >
77
- Provider {getSortIcon('provider')}
78
- </th>
79
- {showLanguageColumn && (
80
- <th
81
- className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider cursor-pointer hover:bg-gray-100"
82
- onClick={() => handleSort('language')}
83
- >
84
- Language {getSortIcon('language')}
85
- </th>
86
- )}
87
- <th
88
- className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider cursor-pointer hover:bg-gray-100"
89
- onClick={() => handleSort('successRate')}
90
- >
91
- Success Rate {getSortIcon('successRate')}
92
- </th>
93
- <th
94
- className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider cursor-pointer hover:bg-gray-100"
95
- onClick={() => handleSort('totalExercises')}
96
- >
97
- Exercises {getSortIcon('totalExercises')}
98
- </th>
99
- <th
100
- className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider cursor-pointer hover:bg-gray-100"
101
- onClick={() => handleSort('averageCost')}
102
- >
103
- Avg Cost {getSortIcon('averageCost')}
104
- </th>
105
- <th
106
- className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider cursor-pointer hover:bg-gray-100"
107
- onClick={() => handleSort('averageTime')}
108
- >
109
- Avg Time {getSortIcon('averageTime')}
110
- </th>
111
- <th
112
- className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider cursor-pointer hover:bg-gray-100"
113
- onClick={() => handleSort('averageTurns')}
114
- >
115
- Avg Turns {getSortIcon('averageTurns')}
116
- </th>
117
- <th
118
- className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider cursor-pointer hover:bg-gray-100"
119
- onClick={() => handleSort('totalRuns')}
120
- >
121
- Runs {getSortIcon('totalRuns')}
122
- </th>
123
- </tr>
124
- </thead>
125
- <tbody className="bg-white divide-y divide-gray-200">
126
- {sortedEntries.map((entry) => (
127
- <tr
128
- key={`${entry.model}-${entry.provider}-${entry.language}`}
129
- className="hover:bg-gray-50 cursor-pointer transition-colors duration-150"
130
- onClick={() => handleRowClick(entry)}
131
- title="Click to view detailed results"
132
- >
133
- <td className="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
134
- {entry.model}
135
- </td>
136
- <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
137
- {entry.provider}
138
- </td>
139
- {showLanguageColumn && (
140
- <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
141
- {entry.language}
142
- </td>
143
- )}
144
- <td className={`px-6 py-4 whitespace-nowrap text-sm font-medium ${getStatusColor(entry.successRate)}`}>
145
- {formatPercentage(entry.successRate)}
146
- </td>
147
- <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
148
- {entry.totalExercises}
149
- </td>
150
- <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
151
- {formatCurrency(entry.averageCost)}
152
- </td>
153
- <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
154
- {formatTime(entry.averageTime)}
155
- </td>
156
- <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
157
- {entry.averageTurns.toFixed(1)}
158
- </td>
159
- <td className="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
160
- {entry.totalRuns}
161
- </td>
162
- </tr>
163
- ))}
164
- </tbody>
165
- </table>
166
- </div>
167
- );
168
- }
@@ -1,109 +0,0 @@
1
- 'use client';
2
-
3
- import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, ScatterChart, Scatter } from 'recharts';
4
- import { LeaderboardEntry } from '@/types/benchmark';
5
- import { formatCurrency, formatPercentage } from '@/utils/dataProcessor';
6
-
7
- interface PerformanceChartProps {
8
- entries: LeaderboardEntry[];
9
- selectedLanguage?: string;
10
- chartType?: 'success-rate' | 'cost-vs-performance';
11
- }
12
-
13
- export default function PerformanceChart({ entries, selectedLanguage = 'all', chartType = 'success-rate' }: PerformanceChartProps) {
14
- if (chartType === 'success-rate') {
15
- const chartData = entries
16
- .sort((a, b) => b.successRate - a.successRate)
17
- .slice(0, 10) // Show top 10
18
- .map(entry => ({
19
- name: selectedLanguage === 'all' ? `${entry.model} (${entry.language})` : entry.model,
20
- successRate: entry.successRate,
21
- exercises: entry.totalExercises,
22
- }));
23
-
24
- return (
25
- <div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
26
- <h3 className="text-lg font-semibold text-gray-900 mb-4">Success Rate Comparison</h3>
27
- <ResponsiveContainer width="100%" height={400}>
28
- <BarChart data={chartData} margin={{ top: 20, right: 30, left: 20, bottom: 5 }}>
29
- <CartesianGrid strokeDasharray="3 3" />
30
- <XAxis
31
- dataKey="name"
32
- angle={-45}
33
- textAnchor="end"
34
- height={100}
35
- fontSize={12}
36
- />
37
- <YAxis
38
- domain={[0, 100]}
39
- tickFormatter={(value) => `${value}%`}
40
- />
41
- <Tooltip
42
- formatter={(value: number, name: string) => [
43
- name === 'successRate' ? formatPercentage(value) : value,
44
- name === 'successRate' ? 'Success Rate' : 'Exercises'
45
- ]}
46
- />
47
- <Legend />
48
- <Bar dataKey="successRate" fill="#3B82F6" name="Success Rate (%)" />
49
- </BarChart>
50
- </ResponsiveContainer>
51
- </div>
52
- );
53
- }
54
-
55
- // Cost vs Performance scatter plot
56
- const scatterData = entries.map(entry => ({
57
- name: selectedLanguage === 'all' ? `${entry.model} (${entry.language})` : entry.model,
58
- cost: entry.averageCost,
59
- successRate: entry.successRate,
60
- exercises: entry.totalExercises,
61
- }));
62
-
63
- return (
64
- <div className="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
65
- <h3 className="text-lg font-semibold text-gray-900 mb-4">Cost vs Performance</h3>
66
- <ResponsiveContainer width="100%" height={400}>
67
- <ScatterChart data={scatterData} margin={{ top: 20, right: 30, left: 20, bottom: 20 }}>
68
- <CartesianGrid strokeDasharray="3 3" />
69
- <XAxis
70
- dataKey="cost"
71
- type="number"
72
- tickFormatter={(value) => formatCurrency(value)}
73
- name="Average Cost"
74
- />
75
- <YAxis
76
- dataKey="successRate"
77
- type="number"
78
- domain={[0, 100]}
79
- tickFormatter={(value) => `${value}%`}
80
- name="Success Rate"
81
- />
82
- <Tooltip
83
- formatter={(value: number, name: string) => {
84
- if (name === 'cost') return [formatCurrency(value), 'Average Cost'];
85
- if (name === 'successRate') return [formatPercentage(value), 'Success Rate'];
86
- return [value, name];
87
- }}
88
- labelFormatter={() => ''}
89
- content={({ active, payload }) => {
90
- if (active && payload && payload.length) {
91
- const data = payload[0].payload;
92
- return (
93
- <div className="bg-white p-3 border border-gray-200 rounded shadow-lg">
94
- <p className="font-medium">{data.name}</p>
95
- <p className="text-blue-600">Success Rate: {formatPercentage(data.successRate)}</p>
96
- <p className="text-green-600">Average Cost: {formatCurrency(data.cost)}</p>
97
- <p className="text-gray-600">Exercises: {data.exercises}</p>
98
- </div>
99
- );
100
- }
101
- return null;
102
- }}
103
- />
104
- <Scatter dataKey="successRate" fill="#3B82F6" />
105
- </ScatterChart>
106
- </ResponsiveContainer>
107
- </div>
108
- );
109
- }
@@ -1,5 +0,0 @@
1
- /// <reference types="next" />
2
- /// <reference types="next/image-types/global" />
3
-
4
- // NOTE: This file should not be edited
5
- // see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information.
@@ -1,4 +0,0 @@
1
- /** @type {import('next').NextConfig} */
2
- const nextConfig = {}
3
-
4
- module.exports = nextConfig