@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.
- package/.depcheckrc +31 -0
- package/bin/knowhow.js +1 -1
- package/package.json +4 -32
- package/src/agents/tools/executeScript/index.ts +5 -0
- package/src/agents/tools/googleSearch.ts +2 -2
- package/src/agents/tools/index.ts +0 -3
- package/src/agents/tools/list.ts +0 -147
- package/src/agents/tools/loadWebpage.ts +3 -113
- package/src/auth/browserLogin.ts +10 -13
- package/src/cli.ts +63 -3
- package/src/clients/gemini.ts +96 -25
- package/src/clients/http.ts +7 -11
- package/src/clients/pricing/google.ts +122 -26
- package/src/conversion.ts +24 -54
- package/src/index.ts +8 -1
- package/src/login.ts +5 -6
- package/src/plugins/language.ts +0 -4
- package/src/plugins/plugins.ts +0 -14
- package/src/plugins/url.ts +31 -12
- package/src/services/GitHub.ts +2 -2
- package/src/services/KnowhowClient.ts +34 -34
- package/src/{plugins/downloader/downloader.ts → services/MediaProcessorService.ts} +109 -267
- package/src/services/S3.ts +16 -16
- package/src/services/index.ts +4 -4
- package/src/services/modules/index.ts +10 -2
- package/src/services/modules/types.ts +5 -2
- package/src/services/script-execution/ScriptExecutor.ts +29 -10
- package/src/services/script-execution/ScriptPolicy.ts +6 -2
- package/src/types.ts +1 -0
- package/src/utils/http.ts +127 -0
- package/src/workers/auth/PasskeySetup.ts +7 -11
- package/tests/clients/AIClient.test.ts +24 -21
- package/tests/manual/file-edits/figma.test.ts +3 -70
- package/tests/plugins/language/languagePlugin-content-triggers.test.ts +2 -0
- package/tests/plugins/language/languagePlugin.test.ts +2 -0
- package/tests/processors/ToolResponseCache.test.ts +2 -2
- package/tests/test.spec.ts +0 -14
- package/tests/unit/modules/moduleLoading.test.ts +7 -4
- package/tests/unit/plugins/pluginLoading.test.ts +6 -6
- package/ts_build/package.json +4 -32
- package/ts_build/src/agents/tools/ast/astAppendNode.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astAppendNode.js +2 -90
- package/ts_build/src/agents/tools/ast/astAppendNode.js.map +1 -1
- package/ts_build/src/agents/tools/ast/astDeleteNode.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astDeleteNode.js +2 -88
- package/ts_build/src/agents/tools/ast/astDeleteNode.js.map +1 -1
- package/ts_build/src/agents/tools/ast/astEditNode.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astEditNode.js +2 -90
- package/ts_build/src/agents/tools/ast/astEditNode.js.map +1 -1
- package/ts_build/src/agents/tools/ast/astGetPathForLine.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astGetPathForLine.js +2 -72
- package/ts_build/src/agents/tools/ast/astGetPathForLine.js.map +1 -1
- package/ts_build/src/agents/tools/ast/astListPaths.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astListPaths.js +2 -72
- package/ts_build/src/agents/tools/ast/astListPaths.js.map +1 -1
- package/ts_build/src/agents/tools/executeScript/index.d.ts +3 -2
- package/ts_build/src/agents/tools/executeScript/index.js +4 -1
- package/ts_build/src/agents/tools/executeScript/index.js.map +1 -1
- package/ts_build/src/agents/tools/googleSearch.js +2 -2
- package/ts_build/src/agents/tools/googleSearch.js.map +1 -1
- package/ts_build/src/agents/tools/index.d.ts +0 -3
- package/ts_build/src/agents/tools/index.js +0 -3
- package/ts_build/src/agents/tools/index.js.map +1 -1
- package/ts_build/src/agents/tools/list.js +0 -138
- package/ts_build/src/agents/tools/list.js.map +1 -1
- package/ts_build/src/agents/tools/loadWebpage.js +1 -89
- package/ts_build/src/agents/tools/loadWebpage.js.map +1 -1
- package/ts_build/src/agents/tools/textSearch.d.ts +1 -1
- package/ts_build/src/auth/browserLogin.js +7 -7
- package/ts_build/src/auth/browserLogin.js.map +1 -1
- package/ts_build/src/cli.d.ts +1 -1
- package/ts_build/src/cli.js +47 -1
- package/ts_build/src/cli.js.map +1 -1
- package/ts_build/src/clients/gemini.d.ts +1 -73
- package/ts_build/src/clients/gemini.js +57 -19
- package/ts_build/src/clients/gemini.js.map +1 -1
- package/ts_build/src/clients/http.js +5 -9
- package/ts_build/src/clients/http.js.map +1 -1
- package/ts_build/src/clients/pricing/google.d.ts +17 -73
- package/ts_build/src/clients/pricing/google.js +47 -10
- package/ts_build/src/clients/pricing/google.js.map +1 -1
- package/ts_build/src/conversion.d.ts +1 -4
- package/ts_build/src/conversion.js +12 -27
- package/ts_build/src/conversion.js.map +1 -1
- package/ts_build/src/index.d.ts +4 -0
- package/ts_build/src/index.js +7 -1
- package/ts_build/src/index.js.map +1 -1
- package/ts_build/src/login.js +5 -4
- package/ts_build/src/login.js.map +1 -1
- package/ts_build/src/plugins/downloader/downloader.js +3 -3
- package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
- package/ts_build/src/plugins/language.js.map +1 -1
- package/ts_build/src/plugins/plugins.js +0 -14
- package/ts_build/src/plugins/plugins.js.map +1 -1
- package/ts_build/src/plugins/tree-sitter/editor.d.ts +3 -32
- package/ts_build/src/plugins/tree-sitter/editor.js +6 -208
- package/ts_build/src/plugins/tree-sitter/editor.js.map +1 -1
- package/ts_build/src/plugins/tree-sitter/parser.d.ts +19 -54
- package/ts_build/src/plugins/tree-sitter/parser.js +19 -293
- package/ts_build/src/plugins/tree-sitter/parser.js.map +1 -1
- package/ts_build/src/plugins/tree-sitter/simple-paths.d.ts +2 -15
- package/ts_build/src/plugins/tree-sitter/simple-paths.js +2 -324
- package/ts_build/src/plugins/tree-sitter/simple-paths.js.map +1 -1
- package/ts_build/src/plugins/url.js +27 -8
- package/ts_build/src/plugins/url.js.map +1 -1
- package/ts_build/src/services/GitHub.js +2 -2
- package/ts_build/src/services/GitHub.js.map +1 -1
- package/ts_build/src/services/KnowhowClient.d.ts +29 -29
- package/ts_build/src/services/KnowhowClient.js +33 -33
- package/ts_build/src/services/KnowhowClient.js.map +1 -1
- package/ts_build/src/services/MediaProcessorService.d.ts +22 -0
- package/ts_build/src/services/MediaProcessorService.js +215 -0
- package/ts_build/src/services/MediaProcessorService.js.map +1 -0
- package/ts_build/src/services/S3.js +12 -18
- package/ts_build/src/services/S3.js.map +1 -1
- package/ts_build/src/services/index.d.ts +3 -2
- package/ts_build/src/services/index.js +3 -3
- package/ts_build/src/services/index.js.map +1 -1
- package/ts_build/src/services/modules/index.js +10 -2
- package/ts_build/src/services/modules/index.js.map +1 -1
- package/ts_build/src/services/modules/types.d.ts +5 -2
- package/ts_build/src/services/script-execution/ScriptExecutor.js +22 -7
- package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
- package/ts_build/src/services/script-execution/ScriptPolicy.d.ts +1 -1
- package/ts_build/src/services/script-execution/ScriptPolicy.js +4 -2
- package/ts_build/src/services/script-execution/ScriptPolicy.js.map +1 -1
- package/ts_build/src/types.d.ts +1 -0
- package/ts_build/src/types.js +1 -0
- package/ts_build/src/types.js.map +1 -1
- package/ts_build/src/utils/http.d.ts +27 -0
- package/ts_build/src/utils/http.js +98 -0
- package/ts_build/src/utils/http.js.map +1 -0
- package/ts_build/src/workers/auth/PasskeySetup.js +6 -7
- package/ts_build/src/workers/auth/PasskeySetup.js.map +1 -1
- package/ts_build/tests/clients/AIClient.test.js +11 -14
- package/ts_build/tests/clients/AIClient.test.js.map +1 -1
- package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -1
- package/ts_build/tests/manual/file-edits/figma.test.js +1 -46
- package/ts_build/tests/manual/file-edits/figma.test.js.map +1 -1
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +2 -0
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +1 -1
- package/ts_build/tests/plugins/language/languagePlugin.test.js +2 -0
- package/ts_build/tests/plugins/language/languagePlugin.test.js.map +1 -1
- package/ts_build/tests/processors/ToolResponseCache.test.js +2 -2
- package/ts_build/tests/processors/ToolResponseCache.test.js.map +1 -1
- package/ts_build/tests/test.spec.js +0 -14
- package/ts_build/tests/test.spec.js.map +1 -1
- package/ts_build/tests/tree-sitter/tree-sitter.test.d.ts +0 -1
- package/ts_build/tests/tree-sitter/tree-sitter.test.js +2 -183
- package/ts_build/tests/tree-sitter/tree-sitter.test.js.map +1 -1
- package/ts_build/tests/unit/modules/moduleLoading.test.js +6 -4
- package/ts_build/tests/unit/modules/moduleLoading.test.js.map +1 -1
- package/ts_build/tests/unit/plugins/pluginLoading.test.js +4 -4
- package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +1 -1
- package/benchmarks/.dockerignore +0 -7
- package/benchmarks/README.md +0 -166
- package/benchmarks/docker/Dockerfile +0 -68
- package/benchmarks/example-config.yml +0 -27
- package/benchmarks/jest.config.js +0 -13
- package/benchmarks/package-lock.json +0 -4297
- package/benchmarks/package.json +0 -39
- package/benchmarks/results/27b0a06/2025-09-27/xai/xai-grok-code-fast-1.json +0 -2909
- package/benchmarks/results/4057aed/2025-08-14/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -1671
- package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +0 -2814
- package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -2014
- package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3121
- package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +0 -98
- package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +0 -3256
- package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +0 -4298
- package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3031
- package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -2990
- package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3256
- package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3007
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -3256
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +0 -3036
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +0 -3280
- package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -1920
- package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +0 -3281
- package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +0 -2896
- package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3011
- package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +0 -3003
- package/benchmarks/scripts/build-and-run.sh +0 -47
- package/benchmarks/scripts/clone-exercism.sh +0 -92
- package/benchmarks/scripts/validate.sh +0 -48
- package/benchmarks/src/__tests__/runner.test.ts +0 -27
- package/benchmarks/src/cli.ts +0 -90
- package/benchmarks/src/evaluators/EvaluatorRegistry.ts +0 -64
- package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +0 -183
- package/benchmarks/src/evaluators/index.ts +0 -3
- package/benchmarks/src/evaluators/types.ts +0 -22
- package/benchmarks/src/index.ts +0 -3
- package/benchmarks/src/providers.ts +0 -13
- package/benchmarks/src/runner.ts +0 -824
- package/benchmarks/src/types.ts +0 -63
- package/benchmarks/tsconfig.json +0 -19
- package/leaderboard/README.md +0 -148
- package/leaderboard/app/api/benchmark-data/route.ts +0 -131
- package/leaderboard/app/api/benchmark-detail/route.ts +0 -172
- package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +0 -501
- package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +0 -375
- package/leaderboard/app/globals.css +0 -27
- package/leaderboard/app/layout.tsx +0 -21
- package/leaderboard/app/page.tsx +0 -170
- package/leaderboard/components/LeaderboardTable.tsx +0 -168
- package/leaderboard/components/PerformanceChart.tsx +0 -109
- package/leaderboard/next-env.d.ts +0 -5
- package/leaderboard/next.config.js +0 -4
- package/leaderboard/package-lock.json +0 -6363
- package/leaderboard/package.json +0 -28
- package/leaderboard/postcss.config.js +0 -6
- package/leaderboard/tailwind.config.js +0 -17
- package/leaderboard/tsconfig.json +0 -28
- package/leaderboard/types/benchmark.ts +0 -67
- package/leaderboard/utils/dataProcessor.ts +0 -33
- package/src/agents/tools/asana/definitions.ts +0 -199
- package/src/agents/tools/asana/index.ts +0 -108
- package/src/agents/tools/ast/astAppendNode.ts +0 -90
- package/src/agents/tools/ast/astDeleteNode.ts +0 -88
- package/src/agents/tools/ast/astEditNode.ts +0 -95
- package/src/agents/tools/ast/astGetPathForLine.ts +0 -73
- package/src/agents/tools/ast/astListPaths.ts +0 -66
- package/src/agents/tools/ast/index.ts +0 -7
- package/src/agents/tools/github/definitions.ts +0 -89
- package/src/agents/tools/github/index.ts +0 -67
- package/src/chat-old.ts +0 -446
- package/src/plugins/asana.ts +0 -146
- package/src/plugins/downloader/plugin.ts +0 -103
- package/src/plugins/downloader/types.ts +0 -92
- package/src/plugins/figma.ts +0 -158
- package/src/plugins/github.ts +0 -219
- package/src/plugins/jira.ts +0 -115
- package/src/plugins/linear.ts +0 -230
- package/src/plugins/notion.ts +0 -179
- package/src/plugins/tree-sitter/editor.ts +0 -369
- package/src/plugins/tree-sitter/lang-packs/index.ts +0 -23
- package/src/plugins/tree-sitter/lang-packs/java.ts +0 -59
- package/src/plugins/tree-sitter/lang-packs/javascript.ts +0 -57
- package/src/plugins/tree-sitter/lang-packs/python.ts +0 -45
- package/src/plugins/tree-sitter/lang-packs/types.ts +0 -79
- package/src/plugins/tree-sitter/lang-packs/typescript.ts +0 -49
- package/src/plugins/tree-sitter/parser.ts +0 -470
- package/src/plugins/tree-sitter/simple-paths.ts +0 -467
- package/tests/tree-sitter/editor.test.ts +0 -113
- package/tests/tree-sitter/invalid.test.ts +0 -299
- package/tests/tree-sitter/paths/common-edits.test.ts +0 -564
- package/tests/tree-sitter/paths/debug-exact-position.test.ts +0 -44
- package/tests/tree-sitter/paths/debug-line-indexing.test.ts +0 -49
- package/tests/tree-sitter/paths/debug-paths.test.ts +0 -90
- package/tests/tree-sitter/paths/paths.test.ts +0 -170
- package/tests/tree-sitter/paths/simple-paths.test.ts +0 -367
- package/tests/tree-sitter/sample-after.ts +0 -48
- package/tests/tree-sitter/sample-before.ts +0 -25
- package/tests/tree-sitter/test-files/completely-broken.ts +0 -7
- package/tests/tree-sitter/test-files/duplicate-braces.ts +0 -39
- package/tests/tree-sitter/test-files/invalid-nesting.ts +0 -39
- package/tests/tree-sitter/test-files/malformed-signature.ts +0 -39
- package/tests/tree-sitter/test-files/mismatched-parens.ts +0 -39
- package/tests/tree-sitter/test-files/missing-semicolon.ts +0 -39
- package/tests/tree-sitter/test-files/partially-broken.ts +0 -20
- package/tests/tree-sitter/test-files/specific-errors.ts +0 -14
- package/tests/tree-sitter/test-files/unclosed-string.ts +0 -39
- 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
|
-
}
|