oh-my-knowledge 0.0.1 → 0.18.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 (215) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +537 -332
  3. package/dist/src/analysis/coverage-analyzer.d.ts +57 -0
  4. package/dist/src/analysis/coverage-analyzer.d.ts.map +1 -0
  5. package/dist/src/analysis/coverage-analyzer.js +262 -0
  6. package/dist/src/analysis/coverage-analyzer.js.map +1 -0
  7. package/dist/src/analysis/gap-analyzer.d.ts +114 -0
  8. package/dist/src/analysis/gap-analyzer.d.ts.map +1 -0
  9. package/dist/src/analysis/gap-analyzer.js +439 -0
  10. package/dist/src/analysis/gap-analyzer.js.map +1 -0
  11. package/dist/src/analysis/hedging-classifier.d.ts +34 -0
  12. package/dist/src/analysis/hedging-classifier.d.ts.map +1 -0
  13. package/dist/src/analysis/hedging-classifier.js +144 -0
  14. package/dist/src/analysis/hedging-classifier.js.map +1 -0
  15. package/dist/src/analysis/report-diagnostics.d.ts +9 -0
  16. package/dist/src/analysis/report-diagnostics.d.ts.map +1 -0
  17. package/dist/src/analysis/report-diagnostics.js +631 -0
  18. package/dist/src/analysis/report-diagnostics.js.map +1 -0
  19. package/dist/src/authoring/evolver.d.ts +64 -0
  20. package/dist/src/authoring/evolver.d.ts.map +1 -0
  21. package/dist/src/authoring/evolver.js +275 -0
  22. package/dist/src/authoring/evolver.js.map +1 -0
  23. package/dist/src/authoring/generator.d.ts +13 -0
  24. package/dist/src/authoring/generator.d.ts.map +1 -0
  25. package/dist/src/authoring/generator.js +60 -0
  26. package/dist/src/authoring/generator.js.map +1 -0
  27. package/dist/src/cli.d.ts +3 -0
  28. package/dist/src/cli.d.ts.map +1 -0
  29. package/dist/src/cli.js +1004 -0
  30. package/dist/src/cli.js.map +1 -0
  31. package/dist/src/eval-core/cache.d.ts +11 -0
  32. package/dist/src/eval-core/cache.d.ts.map +1 -0
  33. package/dist/src/eval-core/cache.js +53 -0
  34. package/dist/src/eval-core/cache.js.map +1 -0
  35. package/dist/src/eval-core/ci-gates.d.ts +17 -0
  36. package/dist/src/eval-core/ci-gates.d.ts.map +1 -0
  37. package/dist/src/eval-core/ci-gates.js +42 -0
  38. package/dist/src/eval-core/ci-gates.js.map +1 -0
  39. package/dist/src/eval-core/dependency-checker.d.ts +37 -0
  40. package/dist/src/eval-core/dependency-checker.d.ts.map +1 -0
  41. package/dist/src/eval-core/dependency-checker.js +280 -0
  42. package/dist/src/eval-core/dependency-checker.js.map +1 -0
  43. package/dist/src/eval-core/evaluation-execution.d.ts +26 -0
  44. package/dist/src/eval-core/evaluation-execution.d.ts.map +1 -0
  45. package/dist/src/eval-core/evaluation-execution.js +196 -0
  46. package/dist/src/eval-core/evaluation-execution.js.map +1 -0
  47. package/dist/src/eval-core/evaluation-job.d.ts +48 -0
  48. package/dist/src/eval-core/evaluation-job.d.ts.map +1 -0
  49. package/dist/src/eval-core/evaluation-job.js +112 -0
  50. package/dist/src/eval-core/evaluation-job.js.map +1 -0
  51. package/dist/src/eval-core/evaluation-reporting.d.ts +28 -0
  52. package/dist/src/eval-core/evaluation-reporting.d.ts.map +1 -0
  53. package/dist/src/eval-core/evaluation-reporting.js +123 -0
  54. package/dist/src/eval-core/evaluation-reporting.js.map +1 -0
  55. package/dist/src/eval-core/execution-strategy.d.ts +11 -0
  56. package/dist/src/eval-core/execution-strategy.d.ts.map +1 -0
  57. package/dist/src/eval-core/execution-strategy.js +121 -0
  58. package/dist/src/eval-core/execution-strategy.js.map +1 -0
  59. package/dist/src/eval-core/fact-checker.d.ts +25 -0
  60. package/dist/src/eval-core/fact-checker.d.ts.map +1 -0
  61. package/dist/src/eval-core/fact-checker.js +66 -0
  62. package/dist/src/eval-core/fact-checker.js.map +1 -0
  63. package/dist/src/eval-core/schema.d.ts +30 -0
  64. package/dist/src/eval-core/schema.d.ts.map +1 -0
  65. package/dist/src/eval-core/schema.js +195 -0
  66. package/dist/src/eval-core/schema.js.map +1 -0
  67. package/dist/src/eval-core/statistics.d.ts +86 -0
  68. package/dist/src/eval-core/statistics.d.ts.map +1 -0
  69. package/dist/src/eval-core/statistics.js +210 -0
  70. package/dist/src/eval-core/statistics.js.map +1 -0
  71. package/dist/src/eval-core/task-planner.d.ts +4 -0
  72. package/dist/src/eval-core/task-planner.d.ts.map +1 -0
  73. package/dist/src/eval-core/task-planner.js +33 -0
  74. package/dist/src/eval-core/task-planner.js.map +1 -0
  75. package/dist/src/eval-workflows/each-evaluation-workflow.d.ts +133 -0
  76. package/dist/src/eval-workflows/each-evaluation-workflow.d.ts.map +1 -0
  77. package/dist/src/eval-workflows/each-evaluation-workflow.js +169 -0
  78. package/dist/src/eval-workflows/each-evaluation-workflow.js.map +1 -0
  79. package/dist/src/eval-workflows/evaluation-pipeline.d.ts +38 -0
  80. package/dist/src/eval-workflows/evaluation-pipeline.d.ts.map +1 -0
  81. package/dist/src/eval-workflows/evaluation-pipeline.js +214 -0
  82. package/dist/src/eval-workflows/evaluation-pipeline.js.map +1 -0
  83. package/dist/src/eval-workflows/evaluation-preparation.d.ts +64 -0
  84. package/dist/src/eval-workflows/evaluation-preparation.d.ts.map +1 -0
  85. package/dist/src/eval-workflows/evaluation-preparation.js +90 -0
  86. package/dist/src/eval-workflows/evaluation-preparation.js.map +1 -0
  87. package/dist/src/eval-workflows/run-evaluation.d.ts +105 -0
  88. package/dist/src/eval-workflows/run-evaluation.d.ts.map +1 -0
  89. package/dist/src/eval-workflows/run-evaluation.js +264 -0
  90. package/dist/src/eval-workflows/run-evaluation.js.map +1 -0
  91. package/dist/src/executors/anthropic-api.d.ts +3 -0
  92. package/dist/src/executors/anthropic-api.d.ts.map +1 -0
  93. package/dist/src/executors/anthropic-api.js +43 -0
  94. package/dist/src/executors/anthropic-api.js.map +1 -0
  95. package/dist/src/executors/claude-cli.d.ts +3 -0
  96. package/dist/src/executors/claude-cli.d.ts.map +1 -0
  97. package/dist/src/executors/claude-cli.js +103 -0
  98. package/dist/src/executors/claude-cli.js.map +1 -0
  99. package/dist/src/executors/claude-sdk-trace.d.ts +10 -0
  100. package/dist/src/executors/claude-sdk-trace.d.ts.map +1 -0
  101. package/dist/src/executors/claude-sdk-trace.js +100 -0
  102. package/dist/src/executors/claude-sdk-trace.js.map +1 -0
  103. package/dist/src/executors/claude-sdk.d.ts +3 -0
  104. package/dist/src/executors/claude-sdk.d.ts.map +1 -0
  105. package/dist/src/executors/claude-sdk.js +160 -0
  106. package/dist/src/executors/claude-sdk.js.map +1 -0
  107. package/dist/src/executors/gemini.d.ts +3 -0
  108. package/dist/src/executors/gemini.d.ts.map +1 -0
  109. package/dist/src/executors/gemini.js +78 -0
  110. package/dist/src/executors/gemini.js.map +1 -0
  111. package/dist/src/executors/index.d.ts +7 -0
  112. package/dist/src/executors/index.d.ts.map +1 -0
  113. package/dist/src/executors/index.js +22 -0
  114. package/dist/src/executors/index.js.map +1 -0
  115. package/dist/src/executors/openai-api.d.ts +3 -0
  116. package/dist/src/executors/openai-api.d.ts.map +1 -0
  117. package/dist/src/executors/openai-api.js +40 -0
  118. package/dist/src/executors/openai-api.js.map +1 -0
  119. package/dist/src/executors/openai-cli.d.ts +3 -0
  120. package/dist/src/executors/openai-cli.d.ts.map +1 -0
  121. package/dist/src/executors/openai-cli.js +60 -0
  122. package/dist/src/executors/openai-cli.js.map +1 -0
  123. package/dist/src/executors/script.d.ts +3 -0
  124. package/dist/src/executors/script.d.ts.map +1 -0
  125. package/dist/src/executors/script.js +63 -0
  126. package/dist/src/executors/script.js.map +1 -0
  127. package/dist/src/executors/shared.d.ts +117 -0
  128. package/dist/src/executors/shared.d.ts.map +1 -0
  129. package/dist/src/executors/shared.js +49 -0
  130. package/dist/src/executors/shared.js.map +1 -0
  131. package/dist/src/grading/assertions.d.ts +18 -0
  132. package/dist/src/grading/assertions.d.ts.map +1 -0
  133. package/dist/src/grading/assertions.js +239 -0
  134. package/dist/src/grading/assertions.js.map +1 -0
  135. package/dist/src/grading/index.d.ts +26 -0
  136. package/dist/src/grading/index.d.ts.map +1 -0
  137. package/dist/src/grading/index.js +98 -0
  138. package/dist/src/grading/index.js.map +1 -0
  139. package/dist/src/grading/judge.d.ts +13 -0
  140. package/dist/src/grading/judge.d.ts.map +1 -0
  141. package/dist/src/grading/judge.js +98 -0
  142. package/dist/src/grading/judge.js.map +1 -0
  143. package/dist/src/grading/layered-scores.d.ts +13 -0
  144. package/dist/src/grading/layered-scores.d.ts.map +1 -0
  145. package/dist/src/grading/layered-scores.js +62 -0
  146. package/dist/src/grading/layered-scores.js.map +1 -0
  147. package/dist/src/inputs/eval-config.d.ts +13 -0
  148. package/dist/src/inputs/eval-config.d.ts.map +1 -0
  149. package/dist/src/inputs/eval-config.js +136 -0
  150. package/dist/src/inputs/eval-config.js.map +1 -0
  151. package/dist/src/inputs/load-samples.d.ts +16 -0
  152. package/dist/src/inputs/load-samples.d.ts.map +1 -0
  153. package/dist/src/inputs/load-samples.js +51 -0
  154. package/dist/src/inputs/load-samples.js.map +1 -0
  155. package/dist/src/inputs/mcp-resolver.d.ts +50 -0
  156. package/dist/src/inputs/mcp-resolver.d.ts.map +1 -0
  157. package/dist/src/inputs/mcp-resolver.js +307 -0
  158. package/dist/src/inputs/mcp-resolver.js.map +1 -0
  159. package/dist/src/inputs/skill-loader.d.ts +18 -0
  160. package/dist/src/inputs/skill-loader.d.ts.map +1 -0
  161. package/dist/src/inputs/skill-loader.js +222 -0
  162. package/dist/src/inputs/skill-loader.js.map +1 -0
  163. package/dist/src/inputs/url-fetcher.d.ts +19 -0
  164. package/dist/src/inputs/url-fetcher.d.ts.map +1 -0
  165. package/dist/src/inputs/url-fetcher.js +241 -0
  166. package/dist/src/inputs/url-fetcher.js.map +1 -0
  167. package/dist/src/observability/production-analyzer.d.ts +61 -0
  168. package/dist/src/observability/production-analyzer.d.ts.map +1 -0
  169. package/dist/src/observability/production-analyzer.js +183 -0
  170. package/dist/src/observability/production-analyzer.js.map +1 -0
  171. package/dist/src/observability/trace-adapter.d.ts +75 -0
  172. package/dist/src/observability/trace-adapter.d.ts.map +1 -0
  173. package/dist/src/observability/trace-adapter.js +341 -0
  174. package/dist/src/observability/trace-adapter.js.map +1 -0
  175. package/dist/src/renderer/html-renderer.d.ts +9 -0
  176. package/dist/src/renderer/html-renderer.d.ts.map +1 -0
  177. package/dist/src/renderer/html-renderer.js +338 -0
  178. package/dist/src/renderer/html-renderer.js.map +1 -0
  179. package/dist/src/renderer/layout.d.ts +13 -0
  180. package/dist/src/renderer/layout.d.ts.map +1 -0
  181. package/dist/src/renderer/layout.js +476 -0
  182. package/dist/src/renderer/layout.js.map +1 -0
  183. package/dist/src/renderer/skill-health-renderer.d.ts +20 -0
  184. package/dist/src/renderer/skill-health-renderer.d.ts.map +1 -0
  185. package/dist/src/renderer/skill-health-renderer.js +218 -0
  186. package/dist/src/renderer/skill-health-renderer.js.map +1 -0
  187. package/dist/src/renderer/summary.d.ts +21 -0
  188. package/dist/src/renderer/summary.d.ts.map +1 -0
  189. package/dist/src/renderer/summary.js +1072 -0
  190. package/dist/src/renderer/summary.js.map +1 -0
  191. package/dist/src/renderer/table.d.ts +3 -0
  192. package/dist/src/renderer/table.d.ts.map +1 -0
  193. package/dist/src/renderer/table.js +134 -0
  194. package/dist/src/renderer/table.js.map +1 -0
  195. package/dist/src/renderer/trends.d.ts +6 -0
  196. package/dist/src/renderer/trends.d.ts.map +1 -0
  197. package/dist/src/renderer/trends.js +127 -0
  198. package/dist/src/renderer/trends.js.map +1 -0
  199. package/dist/src/server/job-store.d.ts +4 -0
  200. package/dist/src/server/job-store.d.ts.map +1 -0
  201. package/dist/src/server/job-store.js +68 -0
  202. package/dist/src/server/job-store.js.map +1 -0
  203. package/dist/src/server/report-server.d.ts +16 -0
  204. package/dist/src/server/report-server.d.ts.map +1 -0
  205. package/dist/src/server/report-server.js +196 -0
  206. package/dist/src/server/report-server.js.map +1 -0
  207. package/dist/src/server/report-store.d.ts +44 -0
  208. package/dist/src/server/report-store.d.ts.map +1 -0
  209. package/dist/src/server/report-store.js +190 -0
  210. package/dist/src/server/report-store.js.map +1 -0
  211. package/dist/src/types.d.ts +553 -0
  212. package/dist/src/types.d.ts.map +1 -0
  213. package/dist/src/types.js +2 -0
  214. package/dist/src/types.js.map +1 -0
  215. package/package.json +44 -3
@@ -0,0 +1,338 @@
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
+ if (!runs || runs.length === 0) {
10
+ return layout(t('title', lang), `
11
+ <main>
12
+ <h1>${t('title', lang)}</h1>
13
+ <p class="subtitle">${t('subtitle', lang)}</p>
14
+ <p style="color:var(--text-muted);margin-top:40px">${t('noRuns', lang)}</p>
15
+ </main>
16
+ `, lang);
17
+ }
18
+ const rows = runs.map((run) => {
19
+ const m = run.meta;
20
+ const hasScores = Object.values(run.summary || {}).some((s) => typeof s.avgCompositeScore === 'number' || typeof s.avgLlmScore === 'number');
21
+ const scoreCol = hasScores
22
+ ? Object.entries(run.summary || {}).map(([v, s]) => {
23
+ const score = s.avgCompositeScore ?? s.avgLlmScore ?? null;
24
+ if (score == null)
25
+ return `<span style="color:var(--text-muted)">${e(v)}: -</span>`;
26
+ const color = score >= 4 ? 'var(--green)' : score >= 3 ? 'var(--yellow)' : 'var(--red)';
27
+ const barW = Math.round((score / 5) * 100);
28
+ return `<div style="display:flex;align-items:center;gap:6px;margin:2px 0">` +
29
+ `<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>` +
30
+ `<div style="width:64px;height:6px;background:var(--bg-surface);border-radius:3px;flex-shrink:0">` +
31
+ `<div style="width:${barW}%;height:100%;background:${color};border-radius:3px"></div></div>` +
32
+ `<span style="font-size:12px;font-weight:600;color:${color};min-width:24px">${score}</span></div>`;
33
+ }).join('')
34
+ : '<div style="color:var(--text-faint);font-size:0.6875rem;text-align:center">no score</div>';
35
+ const badges = ''; // TODO: artifact kind 体系完善后,按 kind 显示评测类型标签
36
+ return `<tr>
37
+ <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)">${(() => {
38
+ // Extract date/time from report ID: ...-YYYYMMDD-HHmm
39
+ const idMatch = run.id.match(/(\d{4})(\d{2})(\d{2})-(\d{2})(\d{2})$/);
40
+ if (idMatch)
41
+ return `${idMatch[2]}/${idMatch[3]} ${idMatch[4]}:${idMatch[5]}`;
42
+ 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);
43
+ })()}</span></a></td>
44
+ <td>${e(m.model || '-')}</td>
45
+ <td>${m.sampleCount || 0}</td>
46
+ <td>${scoreCol}</td>
47
+ <td>${fmtCost(Object.values(run.summary || {}).reduce((s, v) => s + (v.totalExecCostUSD || 0), 0))}</td>
48
+ <td>${fmtDuration(Object.values(run.summary || {}).reduce((s, v) => s + (v.avgDurationMs || 0) * (v.successCount || 0), 0))}</td>
49
+ <td style="white-space:nowrap"><button onclick="deleteRun('${e(run.id)}',this)" class="btn-danger" data-i18n="deleteBtnText">${t('deleteBtnText', lang)}</button></td>
50
+ </tr>`;
51
+ }).join('');
52
+ const runCount = lang === 'zh' ? `${runs.length} 次评测` : `${runs.length} runs`;
53
+ const totalCost = runs.reduce((s, r) => s + Object.values(r.summary || {}).reduce((sv, v) => sv + (v.totalExecCostUSD || 0), 0), 0);
54
+ const costLabel = lang === 'zh' ? `累计 ${fmtCost(totalCost)}` : `Total ${fmtCost(totalCost)}`;
55
+ // Collect variants with ≥2 reports for trend links
56
+ const variantCounts = {};
57
+ for (const run of runs) {
58
+ for (const v of (run.meta?.variants || [])) {
59
+ if (v === 'baseline')
60
+ continue;
61
+ variantCounts[v] = (variantCounts[v] || 0) + 1;
62
+ }
63
+ }
64
+ const trendLinks = Object.entries(variantCounts)
65
+ .filter(([, count]) => count >= 2)
66
+ .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>`)
67
+ .join('');
68
+ 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>` : '';
69
+ return layout(t('title', lang), `
70
+ <main>
71
+ <h1>${t('title', lang)}</h1>
72
+ <p class="subtitle" data-i18n="subtitle">${t('subtitle', lang)} &middot; ${runCount} &middot; ${costLabel}</p>
73
+ ${trendsSection}
74
+ <div style="margin:12px 0;display:flex;gap:8px;align-items:center">
75
+ <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)">
76
+ <span id="filter-count" style="font-size:11px;color:var(--text-muted)"></span>
77
+ </div>
78
+ <div class="table-wrap">
79
+ <table id="report-table">
80
+ <thead><tr>
81
+ <th data-i18n="runId">${t('runId', lang)}</th>
82
+ <th data-i18n="model">${t('model', lang)}</th>
83
+ <th data-i18n="samples">${t('samples', lang)}</th>
84
+ <th data-i18n="score">${t('score', lang)}</th>
85
+ <th data-i18n="cost">${t('cost', lang)}</th>
86
+ <th>${lang === 'zh' ? '耗时' : 'Duration'}</th>
87
+ <th></th>
88
+ </tr></thead>
89
+ <tbody>${rows}</tbody>
90
+ </table>
91
+ </div>
92
+ <script>
93
+ function filterTable(q) {
94
+ var rows = document.querySelectorAll('#report-table tbody tr');
95
+ var lower = q.toLowerCase();
96
+ var shown = 0;
97
+ rows.forEach(function(row) {
98
+ var text = row.textContent.toLowerCase();
99
+ var match = !q || text.indexOf(lower) !== -1;
100
+ row.style.display = match ? '' : 'none';
101
+ if (match) shown++;
102
+ });
103
+ var countEl = document.getElementById('filter-count');
104
+ countEl.textContent = q ? (shown + '/${runs.length}') : '';
105
+ }
106
+ function deleteRun(id, btn) {
107
+ var lang = document.documentElement.dataset.lang || '${DEFAULT_LANG}';
108
+ if (!confirm(I18N[lang].deleteConfirm + ' ' + id + ' ?')) return;
109
+ fetch('/api/run/' + encodeURIComponent(id), { method: 'DELETE' })
110
+ .then(function(r) { return r.json(); })
111
+ .then(function(d) {
112
+ if (d.ok) { btn.closest('tr').remove(); }
113
+ else { alert(I18N[lang].deleteFail + ': ' + (d.error || 'unknown')); }
114
+ })
115
+ .catch(function(err) { alert(I18N[lang].deleteFail + ': ' + err.message); });
116
+ }
117
+ </script>
118
+ </main>
119
+ `, lang);
120
+ }
121
+ export function renderRunDetail(report, lang = DEFAULT_LANG) {
122
+ if (!report) {
123
+ return layout(t('title', lang), `
124
+ <main>
125
+ <nav class="nav"><a href="/">${t('backToList', lang)}</a></nav>
126
+ <h1>Run not found</h1>
127
+ </main>
128
+ `, lang);
129
+ }
130
+ const m = report.meta;
131
+ const variants = m.variants || [];
132
+ const summary = report.summary || {};
133
+ const results = report.results || [];
134
+ const cards = renderSummaryCards(variants, summary, lang, report.variance);
135
+ const sampleTable = renderSampleTable(variants, results, lang);
136
+ const totalExecCost = Object.values(summary).reduce((s, v) => s + (v.totalExecCostUSD || 0), 0);
137
+ const totalDurationMs = Object.values(summary).reduce((s, v) => s + (v.avgDurationMs || 0) * (v.successCount || 0), 0);
138
+ const sourceLabels = {
139
+ zh: { 'variant-name': '本地文件', 'file-path': '本地文件', git: 'Git 版本', inline: '内联', baseline: '无', custom: '自定义' },
140
+ en: { 'variant-name': 'Local file', 'file-path': 'Local file', git: 'Git ref', inline: 'Inline', baseline: 'None', custom: 'Custom' },
141
+ };
142
+ const typeLabels = {
143
+ zh: { baseline: '基线', 'runtime-context-only': '仅运行环境', 'artifact-injection': '知识注入' },
144
+ en: { baseline: 'Baseline', 'runtime-context-only': 'Runtime context only', 'artifact-injection': 'Artifact injection' },
145
+ };
146
+ const strategyLabels = {
147
+ zh: { baseline: '无注入', 'system-prompt': '系统提示词', 'user-prompt': '用户提示词', 'agent-session': 'Agent 会话', 'workflow-session': '工作流会话' },
148
+ en: { baseline: 'None', 'system-prompt': 'System prompt', 'user-prompt': 'User prompt', 'agent-session': 'Agent session', 'workflow-session': 'Workflow session' },
149
+ };
150
+ const variantConfigRows = (m.variantConfigs || []).map((config, i) => {
151
+ const expTypeRaw = config.experimentType || '-';
152
+ const expType = (typeLabels[lang] || typeLabels.en)[String(expTypeRaw)] || expTypeRaw;
153
+ const source = config.artifactKind === 'baseline'
154
+ ? (lang === 'zh' ? '无' : 'None')
155
+ : (sourceLabels[lang] || sourceLabels.en)[config.artifactSource] || config.artifactSource;
156
+ const strategy = (strategyLabels[lang] || strategyLabels.en)[config.executionStrategy] || config.executionStrategy;
157
+ const cwdRaw = config.cwd || '';
158
+ const runtimeContext = cwdRaw
159
+ ? cwdRaw.replace(/.*\/Projects\//, '').replace(/.*\/Documents\//, '').replace(/\/Users\/[^/]+\//, '~/')
160
+ : (lang === 'zh' ? '默认' : 'default');
161
+ const color = COLORS[i % COLORS.length];
162
+ return `<tr>
163
+ <td style="border-left:3px solid ${color};padding-left:12px"><strong>${e(config.variant)}</strong></td>
164
+ <td>${e(expType)}</td>
165
+ <td>${e(config.artifactKind)}</td>
166
+ <td>${e(source)}</td>
167
+ <td>${e(strategy)}</td>
168
+ <td title="${e(cwdRaw)}">${e(runtimeContext)}</td>
169
+ </tr>`;
170
+ }).join('');
171
+ const configModalId = 'guide-variant-config';
172
+ const repeatSuffix = report.variance
173
+ ? (lang === 'zh' ? ` × ${report.variance.runs} 轮` : ` × ${report.variance.runs} runs`)
174
+ : '';
175
+ const experimentSummary = lang === 'zh'
176
+ ? `${m.sampleCount} 个测评用例 × ${variants.length} 组实验${repeatSuffix}`
177
+ : `${m.sampleCount} samples × ${variants.length} variants${repeatSuffix}`;
178
+ const variantConfigSection = variantConfigRows ? `
179
+ <section style="margin:20px 0">
180
+ <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>
181
+ <p style="font-size:12px;color:var(--text-muted);margin-bottom:8px">${experimentSummary}</p>
182
+ <div class="table-wrap">
183
+ <table>
184
+ <thead><tr>
185
+ <th>🏷️ ${t('variants', lang)}</th>
186
+ <th>🧪 ${t('variantType', lang)}</th>
187
+ <th>📦 ${t('variantArtifactKind', lang)}</th>
188
+ <th>📂 ${t('variantArtifactSource', lang)}</th>
189
+ <th>⚙️ ${t('variantExecutionStrategy', lang)}</th>
190
+ <th>🖥️ ${t('variantRuntimeContext', lang)}</th>
191
+ </tr></thead>
192
+ <tbody>${variantConfigRows}</tbody>
193
+ </table>
194
+ </div>
195
+ </section>
196
+ <div id="${configModalId}" class="modal-overlay" role="dialog" aria-modal="true" aria-labelledby="${configModalId}-title" onclick="if(event.target===this)closeModal('${configModalId}')">
197
+ <div class="modal-content">
198
+ <div class="modal-header">
199
+ <strong id="${configModalId}-title" style="font-size:1rem">${lang === 'zh' ? '如何阅读实验配置?' : 'How to read experiment setup?'}</strong>
200
+ <button type="button" class="modal-close" onclick="closeModal('${configModalId}')" aria-label="${lang === 'zh' ? '关闭' : 'Close'}">✕</button>
201
+ </div>
202
+ <p style="font-size:13px;color:var(--text-secondary);margin:4px 0 16px">${e(t('variantConfigDesc', lang))}</p>
203
+ <table class="modal-table"><tbody>
204
+ ${lang === 'zh' ? `
205
+ <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>
206
+ <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>
207
+ <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>
208
+ <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>
209
+ <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>
210
+ <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>
211
+ ` : `
212
+ <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>
213
+ <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>
214
+ <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>
215
+ <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>
216
+ <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>
217
+ <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>
218
+ `}
219
+ </tbody></table>
220
+ </div>
221
+ </div>
222
+ ` : '';
223
+ return layout(`${report.id}`, `
224
+ <main>
225
+ <nav class="nav"><a href="/" data-i18n="backToList">${t('backToList', lang)}</a></nav>
226
+ <h1>${e(report.id)}</h1>
227
+ <div class="meta-tags">
228
+ <span class="meta-tag">${t('model', lang)}: ${e(m.model)}</span>
229
+ <span class="meta-tag">${t('judge', lang)}: ${e(m.judgeModel || 'none')}</span>
230
+ <span class="meta-tag">${t('executor', lang)}: ${e(m.executor || 'claude')}</span>
231
+ <span class="meta-tag">${t('cost', lang)}: ${fmtCost(totalExecCost)}</span>
232
+ <span class="meta-tag">${lang === 'zh' ? '耗时' : 'duration'}: ${fmtDuration(totalDurationMs)}</span>
233
+ ${m.gitInfo ? `<span class="meta-tag">commit: ${e(m.gitInfo.commitShort)}${m.gitInfo.dirty ? '*' : ''} (${e(m.gitInfo.branch)})</span>` : ''}
234
+ ${m.blind ? `<span class="meta-tag" style="color:var(--green)" data-i18n="blindLabel">${t('blindLabel', lang)}</span>` : ''}
235
+ </div>
236
+ ${m.blind ? `
237
+ <div style="margin:12px 0">
238
+ <button onclick="document.getElementById('blind-reveal').style.display=document.getElementById('blind-reveal').style.display==='none'?'block':'none'" data-i18n="revealBlind">${t('revealBlind', lang)}</button>
239
+ <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">
240
+ ${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('')}
241
+ </div>
242
+ </div>` : ''}
243
+
244
+ ${variantConfigSection}
245
+
246
+ <section>${cards}</section>
247
+
248
+ ${renderVarianceComparisons(report.variance, lang, Boolean(report.meta.layeredStats))}
249
+
250
+ ${renderAnalysis(report.analysis, lang)}
251
+
252
+ ${renderAgentOverview(variants, summary, lang)}
253
+
254
+ ${renderKnowledgeInteractionSection(report.analysis?.coverage, report.analysis?.gapReports, lang)}
255
+
256
+ <section>${sampleTable}</section>
257
+
258
+ </main>
259
+ `, lang);
260
+ }
261
+ export function renderEachRunDetail(report, lang = DEFAULT_LANG) {
262
+ if (!report) {
263
+ return layout(t('title', lang), `
264
+ <main>
265
+ <nav class="nav"><a href="/">${t('backToList', lang)}</a></nav>
266
+ <h1>Run not found</h1>
267
+ </main>
268
+ `, lang);
269
+ }
270
+ const m = report.meta;
271
+ const overview = report.overview || null;
272
+ const eachArtifacts = report.artifacts || [];
273
+ // Overview table
274
+ const overviewRows = (overview?.artifacts || []).map((sk) => {
275
+ const bs = typeof sk.baselineScore === 'number' ? sk.baselineScore.toFixed(2) : '-';
276
+ const ss = typeof sk.artifactScore === 'number' ? sk.artifactScore.toFixed(2) : '-';
277
+ const imp = sk.improvement || '-';
278
+ const impColor = imp.startsWith('+') ? 'var(--green)' : imp.startsWith('-') ? 'var(--red)' : 'var(--text-muted)';
279
+ return `<tr>
280
+ <td><a href="#skill-${e(sk.name)}">${e(sk.name)}</a></td>
281
+ <td>${bs}</td>
282
+ <td>${ss}</td>
283
+ <td style="color:${impColor};font-weight:600">${imp}</td>
284
+ </tr>`;
285
+ }).join('');
286
+ // Per-artifact detail sections
287
+ const skillSections = eachArtifacts.map((sk) => {
288
+ const variants = ['baseline', 'skill'];
289
+ const summary = sk.summary || {};
290
+ const cards = renderSummaryCards(variants, summary, lang);
291
+ const sampleTable = renderSampleTable(variants, sk.results, lang);
292
+ return `
293
+ <section id="skill-${e(sk.name)}" style="margin-top:36px;padding-top:20px;border-top:1px solid var(--border)">
294
+ <h2>${e(sk.name)}</h2>
295
+ <p style="font-size:12px;color:var(--text-muted)">${t('samples', lang)}: ${sk.sampleCount} &middot; Hash: ${e(sk.artifactHash || '-')}</p>
296
+ ${cards}
297
+ ${sampleTable}
298
+ </section>
299
+ `;
300
+ }).join('');
301
+ return layout(`${t('reportTitle', lang)} - ${report.id}`, `
302
+ <main>
303
+ <nav class="nav"><a href="/" data-i18n="backToList">${t('backToList', lang)}</a></nav>
304
+ <h1>${e(report.id)}</h1>
305
+ <div class="meta-tags">
306
+ <span class="meta-tag">${t('model', lang)}: ${e(m.model)}</span>
307
+ <span class="meta-tag">${t('judge', lang)}: ${e(m.judgeModel || 'none')}</span>
308
+ <span class="meta-tag">${t('executor', lang)}: ${e(m.executor || 'claude')}</span>
309
+ <span class="meta-tag">${t('cost', lang)}: ${fmtCost(m.totalCostUSD)}</span>
310
+ </div>
311
+
312
+ <section>
313
+ <h2>${t('eachOverview', lang)}</h2>
314
+
315
+ <p style="font-size:13px;color:var(--text-muted)">${overview?.totalArtifacts || 0} ${t('eachSkills', lang)} &middot; ${overview?.totalSamples || 0} ${t('eachSamples', lang)} &middot; ${fmtCost(overview?.totalCostUSD || 0)}</p>
316
+ <div class="table-wrap">
317
+ <table>
318
+ <thead><tr>
319
+ <th>${t('eachSkill', lang)}</th>
320
+ <th>${t('eachBaseline', lang)}</th>
321
+ <th>${t('eachWithSkill', lang)}</th>
322
+ <th>${t('eachImprovement', lang)}</th>
323
+ </tr></thead>
324
+ <tbody>${overviewRows}</tbody>
325
+ </table>
326
+ </div>
327
+ </section>
328
+
329
+ ${skillSections}
330
+
331
+ </main>
332
+ `, lang);
333
+ }
334
+ export function renderTrendsPage(variantName, runs, lang = DEFAULT_LANG) {
335
+ const body = renderTrendsBody(variantName, runs, lang);
336
+ return layout(`${variantName} — ${lang === 'zh' ? '趋势' : 'Trends'}`, `<main>${body}</main>`, lang);
337
+ }
338
+ //# 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,CA+GrD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,IAAW,CAAC;AAEvC,wBAAgB,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,IAAmB,GAAG,MAAM,CAEhE;AAyDD,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,IAAmB,GAAG,MAAM,CA2QrF"}