oh-my-knowledge 0.0.1 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +600 -322
  3. package/README.zh.md +724 -0
  4. package/dist/src/analysis/coverage-analyzer.d.ts +57 -0
  5. package/dist/src/analysis/coverage-analyzer.d.ts.map +1 -0
  6. package/dist/src/analysis/coverage-analyzer.js +262 -0
  7. package/dist/src/analysis/coverage-analyzer.js.map +1 -0
  8. package/dist/src/analysis/gap-analyzer.d.ts +114 -0
  9. package/dist/src/analysis/gap-analyzer.d.ts.map +1 -0
  10. package/dist/src/analysis/gap-analyzer.js +439 -0
  11. package/dist/src/analysis/gap-analyzer.js.map +1 -0
  12. package/dist/src/analysis/hedging-classifier.d.ts +34 -0
  13. package/dist/src/analysis/hedging-classifier.d.ts.map +1 -0
  14. package/dist/src/analysis/hedging-classifier.js +144 -0
  15. package/dist/src/analysis/hedging-classifier.js.map +1 -0
  16. package/dist/src/analysis/report-diagnostics.d.ts +9 -0
  17. package/dist/src/analysis/report-diagnostics.d.ts.map +1 -0
  18. package/dist/src/analysis/report-diagnostics.js +631 -0
  19. package/dist/src/analysis/report-diagnostics.js.map +1 -0
  20. package/dist/src/authoring/evolver.d.ts +64 -0
  21. package/dist/src/authoring/evolver.d.ts.map +1 -0
  22. package/dist/src/authoring/evolver.js +275 -0
  23. package/dist/src/authoring/evolver.js.map +1 -0
  24. package/dist/src/authoring/generator.d.ts +13 -0
  25. package/dist/src/authoring/generator.d.ts.map +1 -0
  26. package/dist/src/authoring/generator.js +60 -0
  27. package/dist/src/authoring/generator.js.map +1 -0
  28. package/dist/src/cli.d.ts +3 -0
  29. package/dist/src/cli.d.ts.map +1 -0
  30. package/dist/src/cli.js +1012 -0
  31. package/dist/src/cli.js.map +1 -0
  32. package/dist/src/eval-core/cache.d.ts +11 -0
  33. package/dist/src/eval-core/cache.d.ts.map +1 -0
  34. package/dist/src/eval-core/cache.js +53 -0
  35. package/dist/src/eval-core/cache.js.map +1 -0
  36. package/dist/src/eval-core/ci-gates.d.ts +17 -0
  37. package/dist/src/eval-core/ci-gates.d.ts.map +1 -0
  38. package/dist/src/eval-core/ci-gates.js +42 -0
  39. package/dist/src/eval-core/ci-gates.js.map +1 -0
  40. package/dist/src/eval-core/dependency-checker.d.ts +37 -0
  41. package/dist/src/eval-core/dependency-checker.d.ts.map +1 -0
  42. package/dist/src/eval-core/dependency-checker.js +280 -0
  43. package/dist/src/eval-core/dependency-checker.js.map +1 -0
  44. package/dist/src/eval-core/evaluation-execution.d.ts +26 -0
  45. package/dist/src/eval-core/evaluation-execution.d.ts.map +1 -0
  46. package/dist/src/eval-core/evaluation-execution.js +196 -0
  47. package/dist/src/eval-core/evaluation-execution.js.map +1 -0
  48. package/dist/src/eval-core/evaluation-job.d.ts +50 -0
  49. package/dist/src/eval-core/evaluation-job.d.ts.map +1 -0
  50. package/dist/src/eval-core/evaluation-job.js +114 -0
  51. package/dist/src/eval-core/evaluation-job.js.map +1 -0
  52. package/dist/src/eval-core/evaluation-reporting.d.ts +28 -0
  53. package/dist/src/eval-core/evaluation-reporting.d.ts.map +1 -0
  54. package/dist/src/eval-core/evaluation-reporting.js +123 -0
  55. package/dist/src/eval-core/evaluation-reporting.js.map +1 -0
  56. package/dist/src/eval-core/execution-strategy.d.ts +11 -0
  57. package/dist/src/eval-core/execution-strategy.d.ts.map +1 -0
  58. package/dist/src/eval-core/execution-strategy.js +121 -0
  59. package/dist/src/eval-core/execution-strategy.js.map +1 -0
  60. package/dist/src/eval-core/fact-checker.d.ts +25 -0
  61. package/dist/src/eval-core/fact-checker.d.ts.map +1 -0
  62. package/dist/src/eval-core/fact-checker.js +66 -0
  63. package/dist/src/eval-core/fact-checker.js.map +1 -0
  64. package/dist/src/eval-core/schema.d.ts +30 -0
  65. package/dist/src/eval-core/schema.d.ts.map +1 -0
  66. package/dist/src/eval-core/schema.js +195 -0
  67. package/dist/src/eval-core/schema.js.map +1 -0
  68. package/dist/src/eval-core/statistics.d.ts +86 -0
  69. package/dist/src/eval-core/statistics.d.ts.map +1 -0
  70. package/dist/src/eval-core/statistics.js +210 -0
  71. package/dist/src/eval-core/statistics.js.map +1 -0
  72. package/dist/src/eval-core/task-planner.d.ts +4 -0
  73. package/dist/src/eval-core/task-planner.d.ts.map +1 -0
  74. package/dist/src/eval-core/task-planner.js +33 -0
  75. package/dist/src/eval-core/task-planner.js.map +1 -0
  76. package/dist/src/eval-workflows/each-evaluation-workflow.d.ts +137 -0
  77. package/dist/src/eval-workflows/each-evaluation-workflow.d.ts.map +1 -0
  78. package/dist/src/eval-workflows/each-evaluation-workflow.js +174 -0
  79. package/dist/src/eval-workflows/each-evaluation-workflow.js.map +1 -0
  80. package/dist/src/eval-workflows/evaluation-pipeline.d.ts +42 -0
  81. package/dist/src/eval-workflows/evaluation-pipeline.d.ts.map +1 -0
  82. package/dist/src/eval-workflows/evaluation-pipeline.js +218 -0
  83. package/dist/src/eval-workflows/evaluation-pipeline.js.map +1 -0
  84. package/dist/src/eval-workflows/evaluation-preparation.d.ts +64 -0
  85. package/dist/src/eval-workflows/evaluation-preparation.d.ts.map +1 -0
  86. package/dist/src/eval-workflows/evaluation-preparation.js +90 -0
  87. package/dist/src/eval-workflows/evaluation-preparation.js.map +1 -0
  88. package/dist/src/eval-workflows/run-evaluation.d.ts +111 -0
  89. package/dist/src/eval-workflows/run-evaluation.d.ts.map +1 -0
  90. package/dist/src/eval-workflows/run-evaluation.js +272 -0
  91. package/dist/src/eval-workflows/run-evaluation.js.map +1 -0
  92. package/dist/src/executors/anthropic-api.d.ts +3 -0
  93. package/dist/src/executors/anthropic-api.d.ts.map +1 -0
  94. package/dist/src/executors/anthropic-api.js +43 -0
  95. package/dist/src/executors/anthropic-api.js.map +1 -0
  96. package/dist/src/executors/claude-cli.d.ts +3 -0
  97. package/dist/src/executors/claude-cli.d.ts.map +1 -0
  98. package/dist/src/executors/claude-cli.js +103 -0
  99. package/dist/src/executors/claude-cli.js.map +1 -0
  100. package/dist/src/executors/claude-sdk-trace.d.ts +10 -0
  101. package/dist/src/executors/claude-sdk-trace.d.ts.map +1 -0
  102. package/dist/src/executors/claude-sdk-trace.js +100 -0
  103. package/dist/src/executors/claude-sdk-trace.js.map +1 -0
  104. package/dist/src/executors/claude-sdk.d.ts +3 -0
  105. package/dist/src/executors/claude-sdk.d.ts.map +1 -0
  106. package/dist/src/executors/claude-sdk.js +160 -0
  107. package/dist/src/executors/claude-sdk.js.map +1 -0
  108. package/dist/src/executors/gemini.d.ts +3 -0
  109. package/dist/src/executors/gemini.d.ts.map +1 -0
  110. package/dist/src/executors/gemini.js +78 -0
  111. package/dist/src/executors/gemini.js.map +1 -0
  112. package/dist/src/executors/index.d.ts +7 -0
  113. package/dist/src/executors/index.d.ts.map +1 -0
  114. package/dist/src/executors/index.js +22 -0
  115. package/dist/src/executors/index.js.map +1 -0
  116. package/dist/src/executors/openai-api.d.ts +3 -0
  117. package/dist/src/executors/openai-api.d.ts.map +1 -0
  118. package/dist/src/executors/openai-api.js +40 -0
  119. package/dist/src/executors/openai-api.js.map +1 -0
  120. package/dist/src/executors/openai-cli.d.ts +3 -0
  121. package/dist/src/executors/openai-cli.d.ts.map +1 -0
  122. package/dist/src/executors/openai-cli.js +60 -0
  123. package/dist/src/executors/openai-cli.js.map +1 -0
  124. package/dist/src/executors/script.d.ts +3 -0
  125. package/dist/src/executors/script.d.ts.map +1 -0
  126. package/dist/src/executors/script.js +63 -0
  127. package/dist/src/executors/script.js.map +1 -0
  128. package/dist/src/executors/shared.d.ts +117 -0
  129. package/dist/src/executors/shared.d.ts.map +1 -0
  130. package/dist/src/executors/shared.js +49 -0
  131. package/dist/src/executors/shared.js.map +1 -0
  132. package/dist/src/grading/assertions.d.ts +18 -0
  133. package/dist/src/grading/assertions.d.ts.map +1 -0
  134. package/dist/src/grading/assertions.js +239 -0
  135. package/dist/src/grading/assertions.js.map +1 -0
  136. package/dist/src/grading/index.d.ts +26 -0
  137. package/dist/src/grading/index.d.ts.map +1 -0
  138. package/dist/src/grading/index.js +98 -0
  139. package/dist/src/grading/index.js.map +1 -0
  140. package/dist/src/grading/judge.d.ts +13 -0
  141. package/dist/src/grading/judge.d.ts.map +1 -0
  142. package/dist/src/grading/judge.js +98 -0
  143. package/dist/src/grading/judge.js.map +1 -0
  144. package/dist/src/grading/layered-scores.d.ts +13 -0
  145. package/dist/src/grading/layered-scores.d.ts.map +1 -0
  146. package/dist/src/grading/layered-scores.js +62 -0
  147. package/dist/src/grading/layered-scores.js.map +1 -0
  148. package/dist/src/inputs/eval-config.d.ts +13 -0
  149. package/dist/src/inputs/eval-config.d.ts.map +1 -0
  150. package/dist/src/inputs/eval-config.js +136 -0
  151. package/dist/src/inputs/eval-config.js.map +1 -0
  152. package/dist/src/inputs/load-samples.d.ts +16 -0
  153. package/dist/src/inputs/load-samples.d.ts.map +1 -0
  154. package/dist/src/inputs/load-samples.js +51 -0
  155. package/dist/src/inputs/load-samples.js.map +1 -0
  156. package/dist/src/inputs/mcp-resolver.d.ts +50 -0
  157. package/dist/src/inputs/mcp-resolver.d.ts.map +1 -0
  158. package/dist/src/inputs/mcp-resolver.js +307 -0
  159. package/dist/src/inputs/mcp-resolver.js.map +1 -0
  160. package/dist/src/inputs/skill-loader.d.ts +18 -0
  161. package/dist/src/inputs/skill-loader.d.ts.map +1 -0
  162. package/dist/src/inputs/skill-loader.js +222 -0
  163. package/dist/src/inputs/skill-loader.js.map +1 -0
  164. package/dist/src/inputs/url-fetcher.d.ts +19 -0
  165. package/dist/src/inputs/url-fetcher.d.ts.map +1 -0
  166. package/dist/src/inputs/url-fetcher.js +241 -0
  167. package/dist/src/inputs/url-fetcher.js.map +1 -0
  168. package/dist/src/observability/skill-health-analyzer.d.ts +83 -0
  169. package/dist/src/observability/skill-health-analyzer.d.ts.map +1 -0
  170. package/dist/src/observability/skill-health-analyzer.js +238 -0
  171. package/dist/src/observability/skill-health-analyzer.js.map +1 -0
  172. package/dist/src/observability/trace-adapter.d.ts +75 -0
  173. package/dist/src/observability/trace-adapter.d.ts.map +1 -0
  174. package/dist/src/observability/trace-adapter.js +367 -0
  175. package/dist/src/observability/trace-adapter.js.map +1 -0
  176. package/dist/src/renderer/html-renderer.d.ts +9 -0
  177. package/dist/src/renderer/html-renderer.d.ts.map +1 -0
  178. package/dist/src/renderer/html-renderer.js +360 -0
  179. package/dist/src/renderer/html-renderer.js.map +1 -0
  180. package/dist/src/renderer/layout.d.ts +13 -0
  181. package/dist/src/renderer/layout.d.ts.map +1 -0
  182. package/dist/src/renderer/layout.js +582 -0
  183. package/dist/src/renderer/layout.js.map +1 -0
  184. package/dist/src/renderer/skill-health-renderer.d.ts +20 -0
  185. package/dist/src/renderer/skill-health-renderer.d.ts.map +1 -0
  186. package/dist/src/renderer/skill-health-renderer.js +253 -0
  187. package/dist/src/renderer/skill-health-renderer.js.map +1 -0
  188. package/dist/src/renderer/summary.d.ts +21 -0
  189. package/dist/src/renderer/summary.d.ts.map +1 -0
  190. package/dist/src/renderer/summary.js +1072 -0
  191. package/dist/src/renderer/summary.js.map +1 -0
  192. package/dist/src/renderer/table.d.ts +3 -0
  193. package/dist/src/renderer/table.d.ts.map +1 -0
  194. package/dist/src/renderer/table.js +134 -0
  195. package/dist/src/renderer/table.js.map +1 -0
  196. package/dist/src/renderer/trends.d.ts +6 -0
  197. package/dist/src/renderer/trends.d.ts.map +1 -0
  198. package/dist/src/renderer/trends.js +127 -0
  199. package/dist/src/renderer/trends.js.map +1 -0
  200. package/dist/src/server/job-store.d.ts +4 -0
  201. package/dist/src/server/job-store.d.ts.map +1 -0
  202. package/dist/src/server/job-store.js +68 -0
  203. package/dist/src/server/job-store.js.map +1 -0
  204. package/dist/src/server/report-server.d.ts +17 -0
  205. package/dist/src/server/report-server.d.ts.map +1 -0
  206. package/dist/src/server/report-server.js +591 -0
  207. package/dist/src/server/report-server.js.map +1 -0
  208. package/dist/src/server/report-store.d.ts +44 -0
  209. package/dist/src/server/report-store.d.ts.map +1 -0
  210. package/dist/src/server/report-store.js +190 -0
  211. package/dist/src/server/report-store.js.map +1 -0
  212. package/dist/src/types.d.ts +559 -0
  213. package/dist/src/types.d.ts.map +1 -0
  214. package/dist/src/types.js +2 -0
  215. package/dist/src/types.js.map +1 -0
  216. package/package.json +53 -5
@@ -0,0 +1,360 @@
1
+ /**
2
+ * HTML report renderer — orchestrates sub-modules.
3
+ */
4
+ import { e, fmtCost, fmtDuration, COLORS, DEFAULT_LANG, t, layout } from './layout.js';
5
+ import { renderAgentOverview, renderAnalysis, renderKnowledgeInteractionSection, renderSummaryCards, renderVarianceComparisons, } from './summary.js';
6
+ import { renderSampleTable } from './table.js';
7
+ import { renderTrendsBody } from './trends.js';
8
+ export function renderRunList(runs, lang = DEFAULT_LANG) {
9
+ const langQ = lang === DEFAULT_LANG ? '' : `?lang=${lang}`;
10
+ const skillHealthLink = `<a href="/analyses${langQ}" style="color:var(--text-muted);font-size:12px;text-decoration:none;border:1px solid var(--border);padding:4px 10px;border-radius:var(--radius);display:inline-block">📊 <span data-i18n="skillHealthTitle">${t('skillHealthTitle', lang)}</span> →</a>`;
11
+ if (!runs || runs.length === 0) {
12
+ return layout(t('title', lang), `
13
+ <main>
14
+ <h1>${t('title', lang)}</h1>
15
+ <p class="subtitle">${t('subtitle', lang)}</p>
16
+ <div style="margin-top:16px">${skillHealthLink}</div>
17
+ <p style="color:var(--text-muted);margin-top:40px">${t('noRuns', lang)}</p>
18
+ </main>
19
+ `, lang);
20
+ }
21
+ const rows = runs.map((run) => {
22
+ const m = run.meta;
23
+ const hasScores = Object.values(run.summary || {}).some((s) => typeof s.avgCompositeScore === 'number' || typeof s.avgLlmScore === 'number');
24
+ const scoreCol = hasScores
25
+ ? Object.entries(run.summary || {}).map(([v, s]) => {
26
+ const score = s.avgCompositeScore ?? s.avgLlmScore ?? null;
27
+ if (score == null)
28
+ return `<span style="color:var(--text-muted)">${e(v)}: -</span>`;
29
+ const color = score >= 4 ? 'var(--green)' : score >= 3 ? 'var(--yellow)' : 'var(--red)';
30
+ const barW = Math.round((score / 5) * 100);
31
+ return `<div style="display:flex;align-items:center;gap:6px;margin:2px 0">` +
32
+ `<span title="${e(v)}" style="font-size:11px;color:var(--text-muted);width:56px;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0">${e(v)}</span>` +
33
+ `<div style="width:64px;height:6px;background:var(--bg-surface);border-radius:3px;flex-shrink:0">` +
34
+ `<div style="width:${barW}%;height:100%;background:${color};border-radius:3px"></div></div>` +
35
+ `<span style="font-size:12px;font-weight:600;color:${color};min-width:24px">${score}</span></div>`;
36
+ }).join('')
37
+ : '<div style="color:var(--text-faint);font-size:0.6875rem;text-align:center">no score</div>';
38
+ const badges = ''; // TODO: artifact kind 体系完善后,按 kind 显示评测类型标签
39
+ return `<tr>
40
+ <td><a href="/run/${e(run.id)}"><span style="color:var(--text-primary)">${e(run.id)}${badges}</span><br><span style="font-size:0.6875rem;color:var(--text-muted)">${(() => {
41
+ // Extract date/time from report ID: ...-YYYYMMDD-HHmm
42
+ const idMatch = run.id.match(/(\d{4})(\d{2})(\d{2})-(\d{2})(\d{2})$/);
43
+ if (idMatch)
44
+ return `${idMatch[2]}/${idMatch[3]} ${idMatch[4]}:${idMatch[5]}`;
45
+ return m.timestamp ? new Date(m.timestamp).toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }) : e(run.id);
46
+ })()}</span></a></td>
47
+ <td>${e(m.model || '-')}</td>
48
+ <td>${m.sampleCount || 0}</td>
49
+ <td>${scoreCol}</td>
50
+ <td>${fmtCost(Object.values(run.summary || {}).reduce((s, v) => s + (v.totalExecCostUSD || 0), 0))}</td>
51
+ <td>${fmtDuration(Object.values(run.summary || {}).reduce((s, v) => s + (v.avgDurationMs || 0) * (v.successCount || 0), 0))}</td>
52
+ <td style="white-space:nowrap"><button onclick="deleteRun('${e(run.id)}',this)" class="btn-danger" data-i18n="deleteBtnText">${t('deleteBtnText', lang)}</button></td>
53
+ </tr>`;
54
+ }).join('');
55
+ const runCount = lang === 'zh' ? `${runs.length} 次评测` : `${runs.length} runs`;
56
+ const totalCost = runs.reduce((s, r) => s + Object.values(r.summary || {}).reduce((sv, v) => sv + (v.totalExecCostUSD || 0), 0), 0);
57
+ const costLabel = lang === 'zh' ? `累计 ${fmtCost(totalCost)}` : `Total ${fmtCost(totalCost)}`;
58
+ // Collect variants with ≥2 reports for trend links
59
+ const variantCounts = {};
60
+ for (const run of runs) {
61
+ for (const v of (run.meta?.variants || [])) {
62
+ if (v === 'baseline')
63
+ continue;
64
+ variantCounts[v] = (variantCounts[v] || 0) + 1;
65
+ }
66
+ }
67
+ const trendLinks = Object.entries(variantCounts)
68
+ .filter(([, count]) => count >= 2)
69
+ .map(([v]) => `<a href="/trends/${encodeURIComponent(v)}" style="display:inline-block;margin:4px 6px 4px 0;padding:3px 10px;font-size:12px;border:1px solid var(--border);border-radius:var(--radius);color:var(--accent);text-decoration:none">${e(v)} (${variantCounts[v]})</a>`)
70
+ .join('');
71
+ const trendsSection = trendLinks ? `<div style="margin:12px 0"><span style="font-size:12px;color:var(--text-muted);margin-right:8px">${lang === 'zh' ? '📈 趋势:' : '📈 Trends:'}</span>${trendLinks}</div>` : '';
72
+ return layout(t('title', lang), `
73
+ <main>
74
+ <h1>${t('title', lang)}</h1>
75
+ <p class="subtitle" data-i18n="subtitle">${t('subtitle', lang)} &middot; ${runCount} &middot; ${costLabel}</p>
76
+ ${trendsSection}
77
+ <div style="margin:12px 0">${skillHealthLink}</div>
78
+ <div style="margin:12px 0;display:flex;gap:8px;align-items:center">
79
+ <input id="filter-input" type="text" placeholder="${lang === 'zh' ? '搜索报告名称、变体...' : 'Filter by name, variant...'}" style="flex:1;max-width:320px;padding:6px 10px;font-size:13px;background:var(--bg-surface);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius);outline:none" oninput="filterTable(this.value)">
80
+ <span id="filter-count" style="font-size:11px;color:var(--text-muted)"></span>
81
+ </div>
82
+ <div class="table-wrap">
83
+ <table id="report-table">
84
+ <thead><tr>
85
+ <th data-i18n="runId">${t('runId', lang)}</th>
86
+ <th data-i18n="model">${t('model', lang)}</th>
87
+ <th data-i18n="samples">${t('samples', lang)}</th>
88
+ <th data-i18n="score">${t('score', lang)}</th>
89
+ <th data-i18n="cost">${t('cost', lang)}</th>
90
+ <th>${lang === 'zh' ? '耗时' : 'Duration'}</th>
91
+ <th></th>
92
+ </tr></thead>
93
+ <tbody>${rows}</tbody>
94
+ </table>
95
+ </div>
96
+ <script>
97
+ function filterTable(q) {
98
+ var rows = document.querySelectorAll('#report-table tbody tr');
99
+ var lower = q.toLowerCase();
100
+ var shown = 0;
101
+ rows.forEach(function(row) {
102
+ var text = row.textContent.toLowerCase();
103
+ var match = !q || text.indexOf(lower) !== -1;
104
+ row.style.display = match ? '' : 'none';
105
+ if (match) shown++;
106
+ });
107
+ var countEl = document.getElementById('filter-count');
108
+ countEl.textContent = q ? (shown + '/${runs.length}') : '';
109
+ }
110
+ function deleteRun(id, btn) {
111
+ var lang = document.documentElement.dataset.lang || '${DEFAULT_LANG}';
112
+ if (!confirm(I18N[lang].deleteConfirm + ' ' + id + ' ?')) return;
113
+ fetch('/api/run/' + encodeURIComponent(id), { method: 'DELETE' })
114
+ .then(function(r) { return r.json(); })
115
+ .then(function(d) {
116
+ if (d.ok) { btn.closest('tr').remove(); }
117
+ else { alert(I18N[lang].deleteFail + ': ' + (d.error || 'unknown')); }
118
+ })
119
+ .catch(function(err) { alert(I18N[lang].deleteFail + ': ' + err.message); });
120
+ }
121
+ </script>
122
+ </main>
123
+ `, lang);
124
+ }
125
+ export function renderRunDetail(report, lang = DEFAULT_LANG) {
126
+ if (!report) {
127
+ return layout(t('title', lang), `
128
+ <main>
129
+ <nav class="nav"><a href="/">${t('backToList', lang)}</a></nav>
130
+ <h1>Run not found</h1>
131
+ </main>
132
+ `, lang);
133
+ }
134
+ const m = report.meta;
135
+ const variants = m.variants || [];
136
+ const summary = report.summary || {};
137
+ const results = report.results || [];
138
+ const cards = renderSummaryCards(variants, summary, lang, report.variance);
139
+ const sampleTable = renderSampleTable(variants, results, lang);
140
+ const totalExecCost = Object.values(summary).reduce((s, v) => s + (v.totalExecCostUSD || 0), 0);
141
+ const totalDurationMs = Object.values(summary).reduce((s, v) => s + (v.avgDurationMs || 0) * (v.successCount || 0), 0);
142
+ const sourceLabels = {
143
+ zh: { 'variant-name': '本地文件', 'file-path': '本地文件', git: 'Git 版本', inline: '内联', baseline: '无', custom: '自定义' },
144
+ en: { 'variant-name': 'Local file', 'file-path': 'Local file', git: 'Git ref', inline: 'Inline', baseline: 'None', custom: 'Custom' },
145
+ };
146
+ const typeLabels = {
147
+ zh: { baseline: '基线', 'runtime-context-only': '仅运行环境', 'artifact-injection': '知识注入' },
148
+ en: { baseline: 'Baseline', 'runtime-context-only': 'Runtime context only', 'artifact-injection': 'Artifact injection' },
149
+ };
150
+ const strategyLabels = {
151
+ zh: { baseline: '无注入', 'system-prompt': '系统提示词', 'user-prompt': '用户提示词', 'agent-session': 'Agent 会话', 'workflow-session': '工作流会话' },
152
+ en: { baseline: 'None', 'system-prompt': 'System prompt', 'user-prompt': 'User prompt', 'agent-session': 'Agent session', 'workflow-session': 'Workflow session' },
153
+ };
154
+ const variantConfigRows = (m.variantConfigs || []).map((config, i) => {
155
+ const expTypeRaw = config.experimentType || '-';
156
+ const expType = (typeLabels[lang] || typeLabels.en)[String(expTypeRaw)] || expTypeRaw;
157
+ const source = config.artifactKind === 'baseline'
158
+ ? (lang === 'zh' ? '无' : 'None')
159
+ : (sourceLabels[lang] || sourceLabels.en)[config.artifactSource] || config.artifactSource;
160
+ const strategy = (strategyLabels[lang] || strategyLabels.en)[config.executionStrategy] || config.executionStrategy;
161
+ const cwdRaw = config.cwd || '';
162
+ const runtimeContext = cwdRaw
163
+ ? cwdRaw.replace(/.*\/Projects\//, '').replace(/.*\/Documents\//, '').replace(/\/Users\/[^/]+\//, '~/')
164
+ : (lang === 'zh' ? '默认' : 'default');
165
+ const color = COLORS[i % COLORS.length];
166
+ return `<tr>
167
+ <td style="border-left:3px solid ${color};padding-left:12px"><strong>${e(config.variant)}</strong></td>
168
+ <td>${e(expType)}</td>
169
+ <td>${e(config.artifactKind)}</td>
170
+ <td>${e(source)}</td>
171
+ <td>${e(strategy)}</td>
172
+ <td title="${e(cwdRaw)}">${e(runtimeContext)}</td>
173
+ </tr>`;
174
+ }).join('');
175
+ const configModalId = 'guide-variant-config';
176
+ const repeatSuffix = report.variance
177
+ ? (lang === 'zh' ? ` × ${report.variance.runs} 轮` : ` × ${report.variance.runs} runs`)
178
+ : '';
179
+ const experimentSummary = lang === 'zh'
180
+ ? `${m.sampleCount} 个测评用例 × ${variants.length} 组实验${repeatSuffix}`
181
+ : `${m.sampleCount} samples × ${variants.length} variants${repeatSuffix}`;
182
+ const variantConfigSection = variantConfigRows ? `
183
+ <section style="margin:20px 0">
184
+ <h2 style="display:flex;align-items:center;gap:4px">${t('variantConfig', lang)} <button type="button" class="hint-btn" onclick="openModal('${configModalId}')" aria-label="${e(t('variantConfigDesc', lang))}" aria-haspopup="dialog">?</button></h2>
185
+ <p style="font-size:12px;color:var(--text-muted);margin-bottom:8px">${experimentSummary}</p>
186
+ <div class="table-wrap">
187
+ <table>
188
+ <thead><tr>
189
+ <th>🏷️ ${t('variants', lang)}</th>
190
+ <th>🧪 ${t('variantType', lang)}</th>
191
+ <th>📦 ${t('variantArtifactKind', lang)}</th>
192
+ <th>📂 ${t('variantArtifactSource', lang)}</th>
193
+ <th>⚙️ ${t('variantExecutionStrategy', lang)}</th>
194
+ <th>🖥️ ${t('variantRuntimeContext', lang)}</th>
195
+ </tr></thead>
196
+ <tbody>${variantConfigRows}</tbody>
197
+ </table>
198
+ </div>
199
+ </section>
200
+ <div id="${configModalId}" class="modal-overlay" role="dialog" aria-modal="true" aria-labelledby="${configModalId}-title" onclick="if(event.target===this)closeModal('${configModalId}')">
201
+ <div class="modal-content">
202
+ <div class="modal-header">
203
+ <strong id="${configModalId}-title" style="font-size:1rem">${lang === 'zh' ? '如何阅读实验配置?' : 'How to read experiment setup?'}</strong>
204
+ <button type="button" class="modal-close" onclick="closeModal('${configModalId}')" aria-label="${lang === 'zh' ? '关闭' : 'Close'}">✕</button>
205
+ </div>
206
+ <p style="font-size:13px;color:var(--text-secondary);margin:4px 0 16px">${e(t('variantConfigDesc', lang))}</p>
207
+ <table class="modal-table"><tbody>
208
+ ${lang === 'zh' ? `
209
+ <tr><td style="padding:6px 0;color:var(--text-primary)"><strong>${t('variants', lang)}</strong></td><td style="padding:6px 0;color:var(--text-secondary)">实验分组的名称标签</td></tr>
210
+ <tr><td style="padding:6px 0;color:var(--text-primary)"><strong>${t('variantType', lang)}</strong></td><td style="padding:6px 0;color:var(--text-secondary)">该分组属于哪种实验类型(baseline / 仅运行环境 / 知识注入)</td></tr>
211
+ <tr><td style="padding:6px 0;color:var(--text-primary)"><strong>知识类型</strong></td><td style="padding:6px 0;color:var(--text-secondary)">被评测对象的类型(skill / agent / workflow / baseline)</td></tr>
212
+ <tr><td style="padding:6px 0;color:var(--text-primary)"><strong>${t('variantArtifactSource', lang)}</strong></td><td style="padding:6px 0;color:var(--text-secondary)">知识从哪里加载(本地文件 / Git 版本 / 内联)</td></tr>
213
+ <tr><td style="padding:6px 0;color:var(--text-primary)"><strong>${t('variantExecutionStrategy', lang)}</strong></td><td style="padding:6px 0;color:var(--text-secondary)">知识如何注入执行(system-prompt / user-prompt / agent-session)</td></tr>
214
+ <tr><td style="padding:6px 0;color:var(--text-primary)"><strong>${t('variantRuntimeContext', lang)}</strong></td><td style="padding:6px 0;color:var(--text-secondary)">Agent 运行的工作目录(影响可访问的文件和工具)</td></tr>
215
+ ` : `
216
+ <tr><td style="padding:6px 0;color:var(--text-primary)"><strong>${t('variants', lang)}</strong></td><td style="padding:6px 0;color:var(--text-secondary)">Name label for this experiment group</td></tr>
217
+ <tr><td style="padding:6px 0;color:var(--text-primary)"><strong>${t('variantType', lang)}</strong></td><td style="padding:6px 0;color:var(--text-secondary)">Role in the experiment (baseline / runtime-context-only / artifact-injection)</td></tr>
218
+ <tr><td style="padding:6px 0;color:var(--text-primary)"><strong>Artifact Kind</strong></td><td style="padding:6px 0;color:var(--text-secondary)">Type of artifact being evaluated (skill / agent / workflow / baseline)</td></tr>
219
+ <tr><td style="padding:6px 0;color:var(--text-primary)"><strong>${t('variantArtifactSource', lang)}</strong></td><td style="padding:6px 0;color:var(--text-secondary)">Where the artifact comes from (local file / git ref / inline)</td></tr>
220
+ <tr><td style="padding:6px 0;color:var(--text-primary)"><strong>${t('variantExecutionStrategy', lang)}</strong></td><td style="padding:6px 0;color:var(--text-secondary)">How the artifact is injected (system-prompt / user-prompt / agent-session)</td></tr>
221
+ <tr><td style="padding:6px 0;color:var(--text-primary)"><strong>Runtime Context</strong></td><td style="padding:6px 0;color:var(--text-secondary)">Working directory the agent runs in (affects accessible files and tools)</td></tr>
222
+ `}
223
+ </tbody></table>
224
+ </div>
225
+ </div>
226
+ ` : '';
227
+ return layout(`${report.id}`, `
228
+ <main>
229
+ <nav class="nav"><a href="/" data-i18n="backToList">${t('backToList', lang)}</a></nav>
230
+ <h1>${e(report.id)}</h1>
231
+ <div class="meta-tags">
232
+ <span class="meta-tag">${t('model', lang)}: ${e(m.model)}</span>
233
+ <span class="meta-tag">${t('judge', lang)}: ${e(m.judgeModel || 'none')}</span>
234
+ <span class="meta-tag">${t('executor', lang)}: ${e(m.executor || 'claude')}</span>
235
+ <span class="meta-tag">${t('cost', lang)}: ${fmtCost(totalExecCost)}</span>
236
+ <span class="meta-tag">${lang === 'zh' ? '耗时' : 'duration'}: ${fmtDuration(totalDurationMs)}</span>
237
+ ${m.gitInfo ? `<span class="meta-tag">commit: ${e(m.gitInfo.commitShort)}${m.gitInfo.dirty ? '*' : ''} (${e(m.gitInfo.branch)})</span>` : ''}
238
+ ${m.blind ? `<span class="meta-tag" style="color:var(--green)" data-i18n="blindLabel">${t('blindLabel', lang)}</span>` : ''}
239
+ </div>
240
+ ${m.blind ? `
241
+ <div style="margin:12px 0">
242
+ <button onclick="document.getElementById('blind-reveal').style.display=document.getElementById('blind-reveal').style.display==='none'?'block':'none'" data-i18n="revealBlind">${t('revealBlind', lang)}</button>
243
+ <div id="blind-reveal" style="display:none;margin-top:8px;padding:12px;background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius)" role="region" aria-label="Blind variant mapping">
244
+ ${Object.entries(m.blindMap || {}).map(([label, real]) => `<div style="font-size:13px;color:var(--text-secondary)"><strong>Variant ${e(label)}</strong> → ${e(real)}</div>`).join('')}
245
+ </div>
246
+ </div>` : ''}
247
+
248
+ ${variantConfigSection}
249
+
250
+ <section>${cards}</section>
251
+
252
+ ${renderVarianceComparisons(report.variance, lang, Boolean(report.meta.layeredStats))}
253
+
254
+ ${renderAnalysis(report.analysis, lang)}
255
+
256
+ ${renderAgentOverview(variants, summary, lang)}
257
+
258
+ ${renderKnowledgeInteractionSection(report.analysis?.coverage, report.analysis?.gapReports, lang)}
259
+
260
+ <section>${sampleTable}</section>
261
+
262
+ </main>
263
+ `, lang);
264
+ }
265
+ export function renderEachRunDetail(report, lang = DEFAULT_LANG) {
266
+ if (!report) {
267
+ return layout(t('title', lang), `
268
+ <main>
269
+ <nav class="nav"><a href="/">${t('backToList', lang)}</a></nav>
270
+ <h1>Run not found</h1>
271
+ </main>
272
+ `, lang);
273
+ }
274
+ const m = report.meta;
275
+ const overview = report.overview || null;
276
+ const eachArtifacts = report.artifacts || [];
277
+ // Overview table
278
+ const overviewRows = (overview?.artifacts || []).map((sk) => {
279
+ const bs = typeof sk.baselineScore === 'number' ? sk.baselineScore.toFixed(2) : '-';
280
+ const ss = typeof sk.artifactScore === 'number' ? sk.artifactScore.toFixed(2) : '-';
281
+ const imp = sk.improvement || '-';
282
+ const impColor = imp.startsWith('+') ? 'var(--green)' : imp.startsWith('-') ? 'var(--red)' : 'var(--text-muted)';
283
+ return `<tr>
284
+ <td><a href="#skill-${e(sk.name)}">${e(sk.name)}</a></td>
285
+ <td>${bs}</td>
286
+ <td>${ss}</td>
287
+ <td style="color:${impColor};font-weight:600">${imp}</td>
288
+ </tr>`;
289
+ }).join('');
290
+ // Per-artifact detail sections
291
+ const skillSections = eachArtifacts.map((sk) => {
292
+ const variants = ['baseline', 'skill'];
293
+ const summary = sk.summary || {};
294
+ // 传 sk.variance 给 summaryCards, 稳定性 CV 列才有数据 (非 each 模式是传 report.variance)
295
+ const cards = renderSummaryCards(variants, summary, lang, sk.variance);
296
+ const sampleTable = renderSampleTable(variants, sk.results, lang);
297
+ // --each --repeat N 时每个 skill 有自己的 variance; 复用 bench 的 renderVarianceComparisons
298
+ const varianceBlock = sk.variance
299
+ ? renderVarianceComparisons(sk.variance, lang, Boolean(report.meta.layeredStats))
300
+ : '';
301
+ const hashShort = sk.artifactHash ? e(sk.artifactHash).slice(0, 12) : '-';
302
+ const hashBlock = sk.artifactHash
303
+ ? `<span title="${t('artifactHashTooltip', lang)}"><span data-i18n="artifactHashLabel">${t('artifactHashLabel', lang)}</span>: <code style="font-family:ui-monospace,SFMono-Regular,Menlo,monospace">${hashShort}</code></span>`
304
+ : '';
305
+ return `
306
+ <section id="skill-${e(sk.name)}" style="margin-top:36px;padding-top:20px;border-top:1px solid var(--border)">
307
+ <h2>${e(sk.name)}</h2>
308
+ <p style="font-size:12px;color:var(--text-muted)">${t('samples', lang)}: ${sk.sampleCount}${hashBlock ? ' &middot; ' + hashBlock : ''}</p>
309
+ ${cards}
310
+ ${varianceBlock}
311
+ ${sampleTable}
312
+ </section>
313
+ `;
314
+ }).join('');
315
+ // 轮次信息放总览。统一用 · 分隔(each 下 skills×samples 不是严格乘法,避免 × 的误导)
316
+ const repeatN = report.meta.request?.repeat;
317
+ const repeatSegment = repeatN && repeatN > 1
318
+ ? (lang === 'zh' ? ` · ${repeatN} 轮重复` : ` · ${repeatN} runs`)
319
+ : '';
320
+ const overviewSubtitle = lang === 'zh'
321
+ ? `${overview?.totalArtifacts || 0} 个 Skill · ${overview?.totalSamples || 0} 个样本${repeatSegment} · ${fmtCost(overview?.totalCostUSD || 0)}`
322
+ : `${overview?.totalArtifacts || 0} skills · ${overview?.totalSamples || 0} samples${repeatSegment} · ${fmtCost(overview?.totalCostUSD || 0)}`;
323
+ return layout(`${t('reportTitle', lang)} - ${report.id}`, `
324
+ <main>
325
+ <nav class="nav"><a href="/" data-i18n="backToList">${t('backToList', lang)}</a></nav>
326
+ <h1>${e(report.id)}</h1>
327
+ <div class="meta-tags">
328
+ <span class="meta-tag">${t('model', lang)}: ${e(m.model)}</span>
329
+ <span class="meta-tag">${t('judge', lang)}: ${e(m.judgeModel || 'none')}</span>
330
+ <span class="meta-tag">${t('executor', lang)}: ${e(m.executor || 'claude')}</span>
331
+ <span class="meta-tag">${t('cost', lang)}: ${fmtCost(m.totalCostUSD)}</span>
332
+ </div>
333
+
334
+ <section>
335
+ <h2>${t('eachOverview', lang)}</h2>
336
+
337
+ <p style="font-size:13px;color:var(--text-muted)">${overviewSubtitle}</p>
338
+ <div class="table-wrap">
339
+ <table>
340
+ <thead><tr>
341
+ <th>${t('eachSkill', lang)}</th>
342
+ <th>${t('eachBaseline', lang)}</th>
343
+ <th>${t('eachWithSkill', lang)}</th>
344
+ <th>${t('eachImprovement', lang)}</th>
345
+ </tr></thead>
346
+ <tbody>${overviewRows}</tbody>
347
+ </table>
348
+ </div>
349
+ </section>
350
+
351
+ ${skillSections}
352
+
353
+ </main>
354
+ `, lang);
355
+ }
356
+ export function renderTrendsPage(variantName, runs, lang = DEFAULT_LANG) {
357
+ const body = renderTrendsBody(variantName, runs, lang);
358
+ return layout(`${variantName} — ${lang === 'zh' ? '趋势' : 'Trends'}`, `<main>${body}</main>`, lang);
359
+ }
360
+ //# sourceMappingURL=html-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-renderer.js","sourceRoot":"","sources":["../../../src/renderer/html-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Lang } from '../types.js';
2
+ export declare function e(text: unknown): string;
3
+ export declare function fmtNum(n: number | undefined | null, digits?: number): string;
4
+ export declare function fmtDuration(ms: number | undefined | null): string;
5
+ export declare function fmtCost(usd: number | undefined | null): string;
6
+ export declare function fmtLocalTime(isoStr: string): string;
7
+ export declare function delta(a: number | undefined | null, b: number | undefined | null, lowerIsBetter?: boolean): string;
8
+ export declare const COLORS: string[];
9
+ export declare const I18N: Record<Lang, Record<string, string>>;
10
+ export declare const DEFAULT_LANG: Lang;
11
+ export declare function t(key: string, lang?: Lang): string;
12
+ export declare function layout(title: string, body: string, lang?: Lang): string;
13
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/renderer/layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,wBAAgB,CAAC,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAOvC;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM,CAE/E;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAOjE;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAE9D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAInD;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,aAAa,GAAE,OAAe,GAAG,MAAM,CAOxH;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,EAAiH,CAAC;AAE7I,eAAO,MAAM,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAqMrD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,IAAW,CAAC;AAEvC,wBAAgB,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,IAAmB,GAAG,MAAM,CAEhE;AA6ED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,IAAmB,GAAG,MAAM,CA2QrF"}