@tyvm/knowhow 0.0.90 → 0.0.91

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 (262) hide show
  1. package/.depcheckrc +31 -0
  2. package/bin/knowhow.js +1 -1
  3. package/package.json +4 -32
  4. package/src/agents/tools/executeScript/index.ts +5 -0
  5. package/src/agents/tools/googleSearch.ts +2 -2
  6. package/src/agents/tools/index.ts +0 -3
  7. package/src/agents/tools/list.ts +0 -147
  8. package/src/agents/tools/loadWebpage.ts +3 -113
  9. package/src/auth/browserLogin.ts +10 -13
  10. package/src/cli.ts +63 -3
  11. package/src/clients/gemini.ts +96 -25
  12. package/src/clients/http.ts +7 -11
  13. package/src/clients/pricing/google.ts +122 -26
  14. package/src/conversion.ts +24 -54
  15. package/src/index.ts +8 -1
  16. package/src/login.ts +5 -6
  17. package/src/plugins/language.ts +0 -4
  18. package/src/plugins/plugins.ts +0 -14
  19. package/src/plugins/url.ts +31 -12
  20. package/src/services/GitHub.ts +2 -2
  21. package/src/services/KnowhowClient.ts +34 -34
  22. package/src/{plugins/downloader/downloader.ts → services/MediaProcessorService.ts} +109 -267
  23. package/src/services/S3.ts +16 -16
  24. package/src/services/index.ts +4 -4
  25. package/src/services/modules/index.ts +10 -2
  26. package/src/services/modules/types.ts +5 -2
  27. package/src/services/script-execution/ScriptExecutor.ts +29 -10
  28. package/src/services/script-execution/ScriptPolicy.ts +6 -2
  29. package/src/types.ts +1 -0
  30. package/src/utils/http.ts +127 -0
  31. package/src/workers/auth/PasskeySetup.ts +7 -11
  32. package/tests/clients/AIClient.test.ts +24 -21
  33. package/tests/manual/file-edits/figma.test.ts +3 -70
  34. package/tests/plugins/language/languagePlugin-content-triggers.test.ts +2 -0
  35. package/tests/plugins/language/languagePlugin.test.ts +2 -0
  36. package/tests/processors/ToolResponseCache.test.ts +2 -2
  37. package/tests/test.spec.ts +0 -14
  38. package/tests/unit/modules/moduleLoading.test.ts +7 -4
  39. package/tests/unit/plugins/pluginLoading.test.ts +6 -6
  40. package/ts_build/package.json +4 -32
  41. package/ts_build/src/agents/tools/ast/astAppendNode.d.ts +1 -1
  42. package/ts_build/src/agents/tools/ast/astAppendNode.js +2 -90
  43. package/ts_build/src/agents/tools/ast/astAppendNode.js.map +1 -1
  44. package/ts_build/src/agents/tools/ast/astDeleteNode.d.ts +1 -1
  45. package/ts_build/src/agents/tools/ast/astDeleteNode.js +2 -88
  46. package/ts_build/src/agents/tools/ast/astDeleteNode.js.map +1 -1
  47. package/ts_build/src/agents/tools/ast/astEditNode.d.ts +1 -1
  48. package/ts_build/src/agents/tools/ast/astEditNode.js +2 -90
  49. package/ts_build/src/agents/tools/ast/astEditNode.js.map +1 -1
  50. package/ts_build/src/agents/tools/ast/astGetPathForLine.d.ts +1 -1
  51. package/ts_build/src/agents/tools/ast/astGetPathForLine.js +2 -72
  52. package/ts_build/src/agents/tools/ast/astGetPathForLine.js.map +1 -1
  53. package/ts_build/src/agents/tools/ast/astListPaths.d.ts +1 -1
  54. package/ts_build/src/agents/tools/ast/astListPaths.js +2 -72
  55. package/ts_build/src/agents/tools/ast/astListPaths.js.map +1 -1
  56. package/ts_build/src/agents/tools/executeScript/index.d.ts +3 -2
  57. package/ts_build/src/agents/tools/executeScript/index.js +4 -1
  58. package/ts_build/src/agents/tools/executeScript/index.js.map +1 -1
  59. package/ts_build/src/agents/tools/googleSearch.js +2 -2
  60. package/ts_build/src/agents/tools/googleSearch.js.map +1 -1
  61. package/ts_build/src/agents/tools/index.d.ts +0 -3
  62. package/ts_build/src/agents/tools/index.js +0 -3
  63. package/ts_build/src/agents/tools/index.js.map +1 -1
  64. package/ts_build/src/agents/tools/list.js +0 -138
  65. package/ts_build/src/agents/tools/list.js.map +1 -1
  66. package/ts_build/src/agents/tools/loadWebpage.js +1 -89
  67. package/ts_build/src/agents/tools/loadWebpage.js.map +1 -1
  68. package/ts_build/src/agents/tools/textSearch.d.ts +1 -1
  69. package/ts_build/src/auth/browserLogin.js +7 -7
  70. package/ts_build/src/auth/browserLogin.js.map +1 -1
  71. package/ts_build/src/cli.d.ts +1 -1
  72. package/ts_build/src/cli.js +47 -1
  73. package/ts_build/src/cli.js.map +1 -1
  74. package/ts_build/src/clients/gemini.d.ts +1 -73
  75. package/ts_build/src/clients/gemini.js +57 -19
  76. package/ts_build/src/clients/gemini.js.map +1 -1
  77. package/ts_build/src/clients/http.js +5 -9
  78. package/ts_build/src/clients/http.js.map +1 -1
  79. package/ts_build/src/clients/pricing/google.d.ts +17 -73
  80. package/ts_build/src/clients/pricing/google.js +47 -10
  81. package/ts_build/src/clients/pricing/google.js.map +1 -1
  82. package/ts_build/src/conversion.d.ts +1 -4
  83. package/ts_build/src/conversion.js +12 -27
  84. package/ts_build/src/conversion.js.map +1 -1
  85. package/ts_build/src/index.d.ts +4 -0
  86. package/ts_build/src/index.js +7 -1
  87. package/ts_build/src/index.js.map +1 -1
  88. package/ts_build/src/login.js +5 -4
  89. package/ts_build/src/login.js.map +1 -1
  90. package/ts_build/src/plugins/downloader/downloader.js +3 -3
  91. package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
  92. package/ts_build/src/plugins/language.js.map +1 -1
  93. package/ts_build/src/plugins/plugins.js +0 -14
  94. package/ts_build/src/plugins/plugins.js.map +1 -1
  95. package/ts_build/src/plugins/tree-sitter/editor.d.ts +3 -32
  96. package/ts_build/src/plugins/tree-sitter/editor.js +6 -208
  97. package/ts_build/src/plugins/tree-sitter/editor.js.map +1 -1
  98. package/ts_build/src/plugins/tree-sitter/parser.d.ts +19 -54
  99. package/ts_build/src/plugins/tree-sitter/parser.js +19 -293
  100. package/ts_build/src/plugins/tree-sitter/parser.js.map +1 -1
  101. package/ts_build/src/plugins/tree-sitter/simple-paths.d.ts +2 -15
  102. package/ts_build/src/plugins/tree-sitter/simple-paths.js +2 -324
  103. package/ts_build/src/plugins/tree-sitter/simple-paths.js.map +1 -1
  104. package/ts_build/src/plugins/url.js +27 -8
  105. package/ts_build/src/plugins/url.js.map +1 -1
  106. package/ts_build/src/services/GitHub.js +2 -2
  107. package/ts_build/src/services/GitHub.js.map +1 -1
  108. package/ts_build/src/services/KnowhowClient.d.ts +29 -29
  109. package/ts_build/src/services/KnowhowClient.js +33 -33
  110. package/ts_build/src/services/KnowhowClient.js.map +1 -1
  111. package/ts_build/src/services/MediaProcessorService.d.ts +22 -0
  112. package/ts_build/src/services/MediaProcessorService.js +215 -0
  113. package/ts_build/src/services/MediaProcessorService.js.map +1 -0
  114. package/ts_build/src/services/S3.js +12 -18
  115. package/ts_build/src/services/S3.js.map +1 -1
  116. package/ts_build/src/services/index.d.ts +3 -2
  117. package/ts_build/src/services/index.js +3 -3
  118. package/ts_build/src/services/index.js.map +1 -1
  119. package/ts_build/src/services/modules/index.js +10 -2
  120. package/ts_build/src/services/modules/index.js.map +1 -1
  121. package/ts_build/src/services/modules/types.d.ts +5 -2
  122. package/ts_build/src/services/script-execution/ScriptExecutor.js +22 -7
  123. package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
  124. package/ts_build/src/services/script-execution/ScriptPolicy.d.ts +1 -1
  125. package/ts_build/src/services/script-execution/ScriptPolicy.js +4 -2
  126. package/ts_build/src/services/script-execution/ScriptPolicy.js.map +1 -1
  127. package/ts_build/src/types.d.ts +1 -0
  128. package/ts_build/src/types.js +1 -0
  129. package/ts_build/src/types.js.map +1 -1
  130. package/ts_build/src/utils/http.d.ts +27 -0
  131. package/ts_build/src/utils/http.js +98 -0
  132. package/ts_build/src/utils/http.js.map +1 -0
  133. package/ts_build/src/workers/auth/PasskeySetup.js +6 -7
  134. package/ts_build/src/workers/auth/PasskeySetup.js.map +1 -1
  135. package/ts_build/tests/clients/AIClient.test.js +11 -14
  136. package/ts_build/tests/clients/AIClient.test.js.map +1 -1
  137. package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -1
  138. package/ts_build/tests/manual/file-edits/figma.test.js +1 -46
  139. package/ts_build/tests/manual/file-edits/figma.test.js.map +1 -1
  140. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +2 -0
  141. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +1 -1
  142. package/ts_build/tests/plugins/language/languagePlugin.test.js +2 -0
  143. package/ts_build/tests/plugins/language/languagePlugin.test.js.map +1 -1
  144. package/ts_build/tests/processors/ToolResponseCache.test.js +2 -2
  145. package/ts_build/tests/processors/ToolResponseCache.test.js.map +1 -1
  146. package/ts_build/tests/test.spec.js +0 -14
  147. package/ts_build/tests/test.spec.js.map +1 -1
  148. package/ts_build/tests/tree-sitter/tree-sitter.test.d.ts +0 -1
  149. package/ts_build/tests/tree-sitter/tree-sitter.test.js +2 -183
  150. package/ts_build/tests/tree-sitter/tree-sitter.test.js.map +1 -1
  151. package/ts_build/tests/unit/modules/moduleLoading.test.js +6 -4
  152. package/ts_build/tests/unit/modules/moduleLoading.test.js.map +1 -1
  153. package/ts_build/tests/unit/plugins/pluginLoading.test.js +4 -4
  154. package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +1 -1
  155. package/benchmarks/.dockerignore +0 -7
  156. package/benchmarks/README.md +0 -166
  157. package/benchmarks/docker/Dockerfile +0 -68
  158. package/benchmarks/example-config.yml +0 -27
  159. package/benchmarks/jest.config.js +0 -13
  160. package/benchmarks/package-lock.json +0 -4297
  161. package/benchmarks/package.json +0 -39
  162. package/benchmarks/results/27b0a06/2025-09-27/xai/xai-grok-code-fast-1.json +0 -2909
  163. package/benchmarks/results/4057aed/2025-08-14/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -1671
  164. package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +0 -2814
  165. package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -2014
  166. package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3121
  167. package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +0 -98
  168. package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +0 -3256
  169. package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +0 -4298
  170. package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3031
  171. package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -2990
  172. package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3256
  173. package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3007
  174. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -3256
  175. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +0 -3036
  176. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +0 -3280
  177. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -1920
  178. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +0 -3281
  179. package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +0 -2896
  180. package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3011
  181. package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +0 -3003
  182. package/benchmarks/scripts/build-and-run.sh +0 -47
  183. package/benchmarks/scripts/clone-exercism.sh +0 -92
  184. package/benchmarks/scripts/validate.sh +0 -48
  185. package/benchmarks/src/__tests__/runner.test.ts +0 -27
  186. package/benchmarks/src/cli.ts +0 -90
  187. package/benchmarks/src/evaluators/EvaluatorRegistry.ts +0 -64
  188. package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +0 -183
  189. package/benchmarks/src/evaluators/index.ts +0 -3
  190. package/benchmarks/src/evaluators/types.ts +0 -22
  191. package/benchmarks/src/index.ts +0 -3
  192. package/benchmarks/src/providers.ts +0 -13
  193. package/benchmarks/src/runner.ts +0 -824
  194. package/benchmarks/src/types.ts +0 -63
  195. package/benchmarks/tsconfig.json +0 -19
  196. package/leaderboard/README.md +0 -148
  197. package/leaderboard/app/api/benchmark-data/route.ts +0 -131
  198. package/leaderboard/app/api/benchmark-detail/route.ts +0 -172
  199. package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +0 -501
  200. package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +0 -375
  201. package/leaderboard/app/globals.css +0 -27
  202. package/leaderboard/app/layout.tsx +0 -21
  203. package/leaderboard/app/page.tsx +0 -170
  204. package/leaderboard/components/LeaderboardTable.tsx +0 -168
  205. package/leaderboard/components/PerformanceChart.tsx +0 -109
  206. package/leaderboard/next-env.d.ts +0 -5
  207. package/leaderboard/next.config.js +0 -4
  208. package/leaderboard/package-lock.json +0 -6363
  209. package/leaderboard/package.json +0 -28
  210. package/leaderboard/postcss.config.js +0 -6
  211. package/leaderboard/tailwind.config.js +0 -17
  212. package/leaderboard/tsconfig.json +0 -28
  213. package/leaderboard/types/benchmark.ts +0 -67
  214. package/leaderboard/utils/dataProcessor.ts +0 -33
  215. package/src/agents/tools/asana/definitions.ts +0 -199
  216. package/src/agents/tools/asana/index.ts +0 -108
  217. package/src/agents/tools/ast/astAppendNode.ts +0 -90
  218. package/src/agents/tools/ast/astDeleteNode.ts +0 -88
  219. package/src/agents/tools/ast/astEditNode.ts +0 -95
  220. package/src/agents/tools/ast/astGetPathForLine.ts +0 -73
  221. package/src/agents/tools/ast/astListPaths.ts +0 -66
  222. package/src/agents/tools/ast/index.ts +0 -7
  223. package/src/agents/tools/github/definitions.ts +0 -89
  224. package/src/agents/tools/github/index.ts +0 -67
  225. package/src/chat-old.ts +0 -446
  226. package/src/plugins/asana.ts +0 -146
  227. package/src/plugins/downloader/plugin.ts +0 -103
  228. package/src/plugins/downloader/types.ts +0 -92
  229. package/src/plugins/figma.ts +0 -158
  230. package/src/plugins/github.ts +0 -219
  231. package/src/plugins/jira.ts +0 -115
  232. package/src/plugins/linear.ts +0 -230
  233. package/src/plugins/notion.ts +0 -179
  234. package/src/plugins/tree-sitter/editor.ts +0 -369
  235. package/src/plugins/tree-sitter/lang-packs/index.ts +0 -23
  236. package/src/plugins/tree-sitter/lang-packs/java.ts +0 -59
  237. package/src/plugins/tree-sitter/lang-packs/javascript.ts +0 -57
  238. package/src/plugins/tree-sitter/lang-packs/python.ts +0 -45
  239. package/src/plugins/tree-sitter/lang-packs/types.ts +0 -79
  240. package/src/plugins/tree-sitter/lang-packs/typescript.ts +0 -49
  241. package/src/plugins/tree-sitter/parser.ts +0 -470
  242. package/src/plugins/tree-sitter/simple-paths.ts +0 -467
  243. package/tests/tree-sitter/editor.test.ts +0 -113
  244. package/tests/tree-sitter/invalid.test.ts +0 -299
  245. package/tests/tree-sitter/paths/common-edits.test.ts +0 -564
  246. package/tests/tree-sitter/paths/debug-exact-position.test.ts +0 -44
  247. package/tests/tree-sitter/paths/debug-line-indexing.test.ts +0 -49
  248. package/tests/tree-sitter/paths/debug-paths.test.ts +0 -90
  249. package/tests/tree-sitter/paths/paths.test.ts +0 -170
  250. package/tests/tree-sitter/paths/simple-paths.test.ts +0 -367
  251. package/tests/tree-sitter/sample-after.ts +0 -48
  252. package/tests/tree-sitter/sample-before.ts +0 -25
  253. package/tests/tree-sitter/test-files/completely-broken.ts +0 -7
  254. package/tests/tree-sitter/test-files/duplicate-braces.ts +0 -39
  255. package/tests/tree-sitter/test-files/invalid-nesting.ts +0 -39
  256. package/tests/tree-sitter/test-files/malformed-signature.ts +0 -39
  257. package/tests/tree-sitter/test-files/mismatched-parens.ts +0 -39
  258. package/tests/tree-sitter/test-files/missing-semicolon.ts +0 -39
  259. package/tests/tree-sitter/test-files/partially-broken.ts +0 -20
  260. package/tests/tree-sitter/test-files/specific-errors.ts +0 -14
  261. package/tests/tree-sitter/test-files/unclosed-string.ts +0 -39
  262. 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