oh-my-knowledge 0.28.0 → 0.30.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 (281) hide show
  1. package/README.md +49 -3
  2. package/README.zh.md +49 -3
  3. package/dist/src/analysis/failure-clusterer.js +1 -1
  4. package/dist/src/analysis/failure-clusterer.js.map +1 -1
  5. package/dist/src/analysis/gap-analyzer.d.ts +8 -1
  6. package/dist/src/analysis/gap-analyzer.d.ts.map +1 -1
  7. package/dist/src/analysis/gap-analyzer.js +65 -33
  8. package/dist/src/analysis/gap-analyzer.js.map +1 -1
  9. package/dist/src/analysis/report-diagnostics.js +2 -0
  10. package/dist/src/analysis/report-diagnostics.js.map +1 -1
  11. package/dist/src/analysis/sample-diagnostics.js +14 -14
  12. package/dist/src/analysis/sample-diagnostics.js.map +1 -1
  13. package/dist/src/authoring/evolver.d.ts +7 -1
  14. package/dist/src/authoring/evolver.d.ts.map +1 -1
  15. package/dist/src/authoring/evolver.js +8 -5
  16. package/dist/src/authoring/evolver.js.map +1 -1
  17. package/dist/src/authoring/generator.d.ts +21 -23
  18. package/dist/src/authoring/generator.d.ts.map +1 -1
  19. package/dist/src/authoring/generator.js +621 -40
  20. package/dist/src/authoring/generator.js.map +1 -1
  21. package/dist/src/authoring/sample-fixer.d.ts +45 -0
  22. package/dist/src/authoring/sample-fixer.d.ts.map +1 -0
  23. package/dist/src/authoring/sample-fixer.js +186 -0
  24. package/dist/src/authoring/sample-fixer.js.map +1 -0
  25. package/dist/src/cli/commands/evolve.d.ts.map +1 -1
  26. package/dist/src/cli/commands/evolve.js +17 -0
  27. package/dist/src/cli/commands/evolve.js.map +1 -1
  28. package/dist/src/cli/commands/observe.d.ts.map +1 -1
  29. package/dist/src/cli/commands/observe.js +170 -0
  30. package/dist/src/cli/commands/observe.js.map +1 -1
  31. package/dist/src/cli/commands/registry.d.ts.map +1 -1
  32. package/dist/src/cli/commands/registry.js +9 -1
  33. package/dist/src/cli/commands/registry.js.map +1 -1
  34. package/dist/src/cli/commands/sample.d.ts +13 -0
  35. package/dist/src/cli/commands/sample.d.ts.map +1 -1
  36. package/dist/src/cli/commands/sample.js +307 -13
  37. package/dist/src/cli/commands/sample.js.map +1 -1
  38. package/dist/src/cli/commands/studio.d.ts.map +1 -1
  39. package/dist/src/cli/commands/studio.js +8 -0
  40. package/dist/src/cli/commands/studio.js.map +1 -1
  41. package/dist/src/cli/i18n-dict.d.ts +1 -1
  42. package/dist/src/cli/i18n-dict.d.ts.map +1 -1
  43. package/dist/src/cli/i18n-dict.js +189 -17
  44. package/dist/src/cli/i18n-dict.js.map +1 -1
  45. package/dist/src/cli/parse-run-config.d.ts +14 -2
  46. package/dist/src/cli/parse-run-config.d.ts.map +1 -1
  47. package/dist/src/cli/parse-run-config.js +62 -10
  48. package/dist/src/cli/parse-run-config.js.map +1 -1
  49. package/dist/src/doctor/health/builtin-dimensions.d.ts.map +1 -1
  50. package/dist/src/doctor/health/builtin-dimensions.js +20 -23
  51. package/dist/src/doctor/health/builtin-dimensions.js.map +1 -1
  52. package/dist/src/doctor/health/composer.d.ts.map +1 -1
  53. package/dist/src/doctor/health/composer.js +7 -3
  54. package/dist/src/doctor/health/composer.js.map +1 -1
  55. package/dist/src/doctor/health/dimension-spec.d.ts +1 -0
  56. package/dist/src/doctor/health/dimension-spec.d.ts.map +1 -1
  57. package/dist/src/doctor/health/parser.d.ts.map +1 -1
  58. package/dist/src/doctor/health/parser.js +1 -0
  59. package/dist/src/doctor/health/parser.js.map +1 -1
  60. package/dist/src/doctor/health/prompt-builder.js +25 -17
  61. package/dist/src/doctor/health/prompt-builder.js.map +1 -1
  62. package/dist/src/doctor/html-renderer.d.ts.map +1 -1
  63. package/dist/src/doctor/html-renderer.js +76 -66
  64. package/dist/src/doctor/html-renderer.js.map +1 -1
  65. package/dist/src/doctor/rules.d.ts.map +1 -1
  66. package/dist/src/doctor/rules.js +32 -0
  67. package/dist/src/doctor/rules.js.map +1 -1
  68. package/dist/src/eval-core/cache.d.ts +16 -2
  69. package/dist/src/eval-core/cache.d.ts.map +1 -1
  70. package/dist/src/eval-core/cache.js +86 -15
  71. package/dist/src/eval-core/cache.js.map +1 -1
  72. package/dist/src/eval-core/evaluation-execution.d.ts +11 -1
  73. package/dist/src/eval-core/evaluation-execution.d.ts.map +1 -1
  74. package/dist/src/eval-core/evaluation-execution.js +78 -6
  75. package/dist/src/eval-core/evaluation-execution.js.map +1 -1
  76. package/dist/src/eval-core/evaluation-job.d.ts +2 -1
  77. package/dist/src/eval-core/evaluation-job.d.ts.map +1 -1
  78. package/dist/src/eval-core/evaluation-job.js +2 -1
  79. package/dist/src/eval-core/evaluation-job.js.map +1 -1
  80. package/dist/src/eval-core/evaluation-reporting.d.ts +7 -0
  81. package/dist/src/eval-core/evaluation-reporting.d.ts.map +1 -1
  82. package/dist/src/eval-core/evaluation-reporting.js +19 -2
  83. package/dist/src/eval-core/evaluation-reporting.js.map +1 -1
  84. package/dist/src/eval-core/execution-strategy.d.ts +1 -1
  85. package/dist/src/eval-core/execution-strategy.d.ts.map +1 -1
  86. package/dist/src/eval-core/execution-strategy.js +12 -1
  87. package/dist/src/eval-core/execution-strategy.js.map +1 -1
  88. package/dist/src/eval-core/mock-hook.cjs +203 -0
  89. package/dist/src/eval-core/mocks-runtime.d.ts +96 -0
  90. package/dist/src/eval-core/mocks-runtime.d.ts.map +1 -0
  91. package/dist/src/eval-core/mocks-runtime.js +323 -0
  92. package/dist/src/eval-core/mocks-runtime.js.map +1 -0
  93. package/dist/src/eval-core/schema.d.ts.map +1 -1
  94. package/dist/src/eval-core/schema.js +18 -5
  95. package/dist/src/eval-core/schema.js.map +1 -1
  96. package/dist/src/eval-core/task-planner.d.ts +9 -1
  97. package/dist/src/eval-core/task-planner.d.ts.map +1 -1
  98. package/dist/src/eval-core/task-planner.js +40 -1
  99. package/dist/src/eval-core/task-planner.js.map +1 -1
  100. package/dist/src/eval-workflows/batch-evaluation-workflow.d.ts +5 -1
  101. package/dist/src/eval-workflows/batch-evaluation-workflow.d.ts.map +1 -1
  102. package/dist/src/eval-workflows/batch-evaluation-workflow.js +2 -1
  103. package/dist/src/eval-workflows/batch-evaluation-workflow.js.map +1 -1
  104. package/dist/src/eval-workflows/evaluation-pipeline.d.ts +22 -1
  105. package/dist/src/eval-workflows/evaluation-pipeline.d.ts.map +1 -1
  106. package/dist/src/eval-workflows/evaluation-pipeline.js +39 -12
  107. package/dist/src/eval-workflows/evaluation-pipeline.js.map +1 -1
  108. package/dist/src/eval-workflows/evaluation-preparation.d.ts +5 -0
  109. package/dist/src/eval-workflows/evaluation-preparation.d.ts.map +1 -1
  110. package/dist/src/eval-workflows/evaluation-preparation.js +3 -1
  111. package/dist/src/eval-workflows/evaluation-preparation.js.map +1 -1
  112. package/dist/src/eval-workflows/run-evaluation.d.ts +12 -2
  113. package/dist/src/eval-workflows/run-evaluation.d.ts.map +1 -1
  114. package/dist/src/eval-workflows/run-evaluation.js +17 -5
  115. package/dist/src/eval-workflows/run-evaluation.js.map +1 -1
  116. package/dist/src/executors/claude-cli.d.ts +1 -1
  117. package/dist/src/executors/claude-cli.d.ts.map +1 -1
  118. package/dist/src/executors/claude-cli.js +57 -6
  119. package/dist/src/executors/claude-cli.js.map +1 -1
  120. package/dist/src/executors/claude-sdk-trace.d.ts.map +1 -1
  121. package/dist/src/executors/claude-sdk-trace.js +10 -4
  122. package/dist/src/executors/claude-sdk-trace.js.map +1 -1
  123. package/dist/src/executors/claude-sdk.d.ts +1 -1
  124. package/dist/src/executors/claude-sdk.d.ts.map +1 -1
  125. package/dist/src/executors/claude-sdk.js +25 -2
  126. package/dist/src/executors/claude-sdk.js.map +1 -1
  127. package/dist/src/executors/shared.d.ts +1 -1
  128. package/dist/src/executors/shared.d.ts.map +1 -1
  129. package/dist/src/executors/shared.js +6 -1
  130. package/dist/src/executors/shared.js.map +1 -1
  131. package/dist/src/grading/assertions.d.ts +5 -0
  132. package/dist/src/grading/assertions.d.ts.map +1 -1
  133. package/dist/src/grading/assertions.js +27 -1
  134. package/dist/src/grading/assertions.js.map +1 -1
  135. package/dist/src/grading/debias-validate.js +4 -4
  136. package/dist/src/grading/debias-validate.js.map +1 -1
  137. package/dist/src/grading/diagnostic.d.ts +40 -0
  138. package/dist/src/grading/diagnostic.d.ts.map +1 -0
  139. package/dist/src/grading/diagnostic.js +450 -0
  140. package/dist/src/grading/diagnostic.js.map +1 -0
  141. package/dist/src/grading/gold-cli.js +2 -2
  142. package/dist/src/grading/gold-cli.js.map +1 -1
  143. package/dist/src/grading/index.d.ts +5 -0
  144. package/dist/src/grading/index.d.ts.map +1 -1
  145. package/dist/src/grading/judge.d.ts.map +1 -1
  146. package/dist/src/grading/judge.js +54 -2
  147. package/dist/src/grading/judge.js.map +1 -1
  148. package/dist/src/grading/layered-scores.d.ts.map +1 -1
  149. package/dist/src/grading/layered-scores.js +1 -0
  150. package/dist/src/grading/layered-scores.js.map +1 -1
  151. package/dist/src/inputs/eval-config.js +19 -0
  152. package/dist/src/inputs/eval-config.js.map +1 -1
  153. package/dist/src/inputs/load-samples.d.ts +22 -2
  154. package/dist/src/inputs/load-samples.d.ts.map +1 -1
  155. package/dist/src/inputs/load-samples.js +193 -22
  156. package/dist/src/inputs/load-samples.js.map +1 -1
  157. package/dist/src/inputs/skill-loader.d.ts.map +1 -1
  158. package/dist/src/inputs/skill-loader.js +11 -3
  159. package/dist/src/inputs/skill-loader.js.map +1 -1
  160. package/dist/src/observability/experience.d.ts +260 -0
  161. package/dist/src/observability/experience.d.ts.map +1 -0
  162. package/dist/src/observability/experience.js +1233 -0
  163. package/dist/src/observability/experience.js.map +1 -0
  164. package/dist/src/observability/inbox-view-model.d.ts +27 -0
  165. package/dist/src/observability/inbox-view-model.d.ts.map +1 -0
  166. package/dist/src/observability/inbox-view-model.js +135 -0
  167. package/dist/src/observability/inbox-view-model.js.map +1 -0
  168. package/dist/src/observability/inbox.d.ts +125 -0
  169. package/dist/src/observability/inbox.d.ts.map +1 -0
  170. package/dist/src/observability/inbox.js +741 -0
  171. package/dist/src/observability/inbox.js.map +1 -0
  172. package/dist/src/observability/problem-patterns.d.ts +51 -0
  173. package/dist/src/observability/problem-patterns.d.ts.map +1 -0
  174. package/dist/src/observability/problem-patterns.js +205 -0
  175. package/dist/src/observability/problem-patterns.js.map +1 -0
  176. package/dist/src/observability/review-state.d.ts +54 -0
  177. package/dist/src/observability/review-state.d.ts.map +1 -0
  178. package/dist/src/observability/review-state.js +131 -0
  179. package/dist/src/observability/review-state.js.map +1 -0
  180. package/dist/src/observability/skill-chain-advisories.d.ts +25 -0
  181. package/dist/src/observability/skill-chain-advisories.d.ts.map +1 -0
  182. package/dist/src/observability/skill-chain-advisories.js +69 -0
  183. package/dist/src/observability/skill-chain-advisories.js.map +1 -0
  184. package/dist/src/observability/skill-chain.d.ts +61 -0
  185. package/dist/src/observability/skill-chain.d.ts.map +1 -0
  186. package/dist/src/observability/skill-chain.js +233 -0
  187. package/dist/src/observability/skill-chain.js.map +1 -0
  188. package/dist/src/observability/text-signals.d.ts +7 -0
  189. package/dist/src/observability/text-signals.d.ts.map +1 -0
  190. package/dist/src/observability/text-signals.js +22 -0
  191. package/dist/src/observability/text-signals.js.map +1 -0
  192. package/dist/src/observability/trace-adapter.d.ts +12 -64
  193. package/dist/src/observability/trace-adapter.d.ts.map +1 -1
  194. package/dist/src/observability/trace-adapter.js +9 -355
  195. package/dist/src/observability/trace-adapter.js.map +1 -1
  196. package/dist/src/observability/trace-attribution.d.ts +56 -0
  197. package/dist/src/observability/trace-attribution.d.ts.map +1 -0
  198. package/dist/src/observability/trace-attribution.js +200 -0
  199. package/dist/src/observability/trace-attribution.js.map +1 -0
  200. package/dist/src/observability/trace-segmenter.d.ts +52 -0
  201. package/dist/src/observability/trace-segmenter.d.ts.map +1 -0
  202. package/dist/src/observability/trace-segmenter.js +320 -0
  203. package/dist/src/observability/trace-segmenter.js.map +1 -0
  204. package/dist/src/observability/trace-source.d.ts +99 -0
  205. package/dist/src/observability/trace-source.d.ts.map +1 -0
  206. package/dist/src/observability/trace-source.js +492 -0
  207. package/dist/src/observability/trace-source.js.map +1 -0
  208. package/dist/src/renderer/html-renderer.d.ts.map +1 -1
  209. package/dist/src/renderer/html-renderer.js +324 -218
  210. package/dist/src/renderer/html-renderer.js.map +1 -1
  211. package/dist/src/renderer/layout.d.ts.map +1 -1
  212. package/dist/src/renderer/layout.js +155 -71
  213. package/dist/src/renderer/layout.js.map +1 -1
  214. package/dist/src/renderer/observation-inbox-renderer.d.ts +4 -0
  215. package/dist/src/renderer/observation-inbox-renderer.d.ts.map +1 -0
  216. package/dist/src/renderer/observation-inbox-renderer.js +5376 -0
  217. package/dist/src/renderer/observation-inbox-renderer.js.map +1 -0
  218. package/dist/src/renderer/skill-detail-renderer.d.ts +15 -0
  219. package/dist/src/renderer/skill-detail-renderer.d.ts.map +1 -0
  220. package/dist/src/renderer/skill-detail-renderer.js +1234 -0
  221. package/dist/src/renderer/skill-detail-renderer.js.map +1 -0
  222. package/dist/src/renderer/skill-list-renderer.d.ts +4 -0
  223. package/dist/src/renderer/skill-list-renderer.d.ts.map +1 -0
  224. package/dist/src/renderer/skill-list-renderer.js +327 -0
  225. package/dist/src/renderer/skill-list-renderer.js.map +1 -0
  226. package/dist/src/renderer/summary.d.ts +17 -0
  227. package/dist/src/renderer/summary.d.ts.map +1 -1
  228. package/dist/src/renderer/summary.js +346 -74
  229. package/dist/src/renderer/summary.js.map +1 -1
  230. package/dist/src/renderer/table.d.ts.map +1 -1
  231. package/dist/src/renderer/table.js +213 -167
  232. package/dist/src/renderer/table.js.map +1 -1
  233. package/dist/src/renderer/test-view.d.ts +66 -0
  234. package/dist/src/renderer/test-view.d.ts.map +1 -0
  235. package/dist/src/renderer/test-view.js +905 -0
  236. package/dist/src/renderer/test-view.js.map +1 -0
  237. package/dist/src/renderer/trends.d.ts.map +1 -1
  238. package/dist/src/renderer/trends.js +3 -1
  239. package/dist/src/renderer/trends.js.map +1 -1
  240. package/dist/src/server/report-server.d.ts +6 -1
  241. package/dist/src/server/report-server.d.ts.map +1 -1
  242. package/dist/src/server/report-server.js +182 -6
  243. package/dist/src/server/report-server.js.map +1 -1
  244. package/dist/src/server/report-store.d.ts.map +1 -1
  245. package/dist/src/server/report-store.js +33 -1
  246. package/dist/src/server/report-store.js.map +1 -1
  247. package/dist/src/server/skill-index.d.ts +77 -0
  248. package/dist/src/server/skill-index.d.ts.map +1 -0
  249. package/dist/src/server/skill-index.js +331 -0
  250. package/dist/src/server/skill-index.js.map +1 -0
  251. package/dist/src/server/skill-insights.d.ts +92 -0
  252. package/dist/src/server/skill-insights.d.ts.map +1 -0
  253. package/dist/src/server/skill-insights.js +676 -0
  254. package/dist/src/server/skill-insights.js.map +1 -0
  255. package/dist/src/shared/hard-rules.d.ts +40 -0
  256. package/dist/src/shared/hard-rules.d.ts.map +1 -0
  257. package/dist/src/shared/hard-rules.js +200 -0
  258. package/dist/src/shared/hard-rules.js.map +1 -0
  259. package/dist/src/shared/time.d.ts +2 -0
  260. package/dist/src/shared/time.d.ts.map +1 -0
  261. package/dist/src/shared/time.js +10 -0
  262. package/dist/src/shared/time.js.map +1 -0
  263. package/dist/src/shared/tool-search.d.ts +9 -0
  264. package/dist/src/shared/tool-search.d.ts.map +1 -0
  265. package/dist/src/shared/tool-search.js +104 -0
  266. package/dist/src/shared/tool-search.js.map +1 -0
  267. package/dist/src/types/eval.d.ts +83 -0
  268. package/dist/src/types/eval.d.ts.map +1 -1
  269. package/dist/src/types/executor.d.ts +47 -0
  270. package/dist/src/types/executor.d.ts.map +1 -1
  271. package/dist/src/types/judge.d.ts +76 -0
  272. package/dist/src/types/judge.d.ts.map +1 -1
  273. package/dist/src/types/judge.js +3 -1
  274. package/dist/src/types/judge.js.map +1 -1
  275. package/dist/src/types/report.d.ts +63 -3
  276. package/dist/src/types/report.d.ts.map +1 -1
  277. package/dist/src/util/safe-slice.d.ts +23 -0
  278. package/dist/src/util/safe-slice.d.ts.map +1 -0
  279. package/dist/src/util/safe-slice.js +33 -0
  280. package/dist/src/util/safe-slice.js.map +1 -0
  281. package/package.json +5 -4
@@ -1,4 +1,4 @@
1
- import { e, fmtNum, fmtDuration, delta, t } from './layout.js';
1
+ import { e, fmtNum, fmtDuration, t } from './layout.js';
2
2
  /** Render the multi-judge ensemble breakdown for a single (sample × rubric or dimension). */
3
3
  function renderEnsembleBlock(ensemble, agreement, lang) {
4
4
  if (!ensemble || ensemble.length < 2)
@@ -8,188 +8,234 @@ function renderEnsembleBlock(ensemble, agreement, lang) {
8
8
  ? ` <span style="color:var(--text-muted)">±${judge.scoreStddev}</span>`
9
9
  : '';
10
10
  const fail = judge.judgeFailureCount && judge.judgeFailureCount > 0
11
- ? ` <span style="color:var(--red);font-size:10px">${judge.judgeFailureCount}/${judge.scoreSamples?.length || '?'} fail</span>`
11
+ ? ` <span style="color:var(--red);font-size:11px">${judge.judgeFailureCount}/${judge.scoreSamples?.length || '?'} fail</span>`
12
12
  : '';
13
13
  const reasoning = judge.reasoning
14
- ? `<details style="margin-top:2px"><summary style="font-size:10px;color:var(--text-muted);cursor:pointer">${t('judgeReasoning', lang)} ${t('judgeReasoningExpand', lang)}</summary><div style="font-size:11px;color:var(--text-muted);padding:4px;background:var(--bg-subtle);border-radius:3px;white-space:pre-wrap">${e(judge.reasoning)}</div></details>`
14
+ ? `<details class="sc-cot"><summary>${t('judgeReasoning', lang)} ${t('judgeReasoningExpand', lang)}</summary><pre class="sc-cot-body">${e(judge.reasoning)}</pre></details>`
15
15
  : '';
16
- return `<div style="margin-top:3px;font-size:11px"><strong>${e(judge.judge)}</strong>: ${judge.score}${stddev}${fail}${reasoning}</div>`;
16
+ return `<div style="margin-top:6px;font-size:13px"><strong>${e(judge.judge)}</strong>: ${judge.score}${stddev}${fail}${reasoning}</div>`;
17
17
  }).join('');
18
18
  const agreementLine = agreement && agreement.pairCount > 0
19
- ? `<div style="margin-top:4px;font-size:10px;color:var(--text-muted)" title="${t('madDesc', lang)}">MAD ${agreement.meanAbsDiff}${agreement.pearson != null ? ` · Pearson ${agreement.pearson}` : ''}</div>`
19
+ ? `<div style="margin-top:6px;font-size:12px;color:var(--text-muted)" title="${t('madDesc', lang)}">MAD ${agreement.meanAbsDiff}${agreement.pearson != null ? ` · Pearson ${agreement.pearson}` : ''}</div>`
20
20
  : '';
21
- return `<details style="margin-top:6px;border-left:2px solid var(--accent);padding-left:6px"><summary style="font-size:11px;cursor:pointer;color:var(--text-muted)">${t('ensembleHeader', lang)} (${ensemble.length})</summary>${rows}${agreementLine}</details>`;
21
+ return `<details class="sc-section"><summary class="sc-section-h" style="cursor:pointer">${t('ensembleHeader', lang)} (${ensemble.length})</summary>${rows}${agreementLine}</details>`;
22
22
  }
23
- /** Render judge stddev / failure inline next to a score (single rubric or dim). */
24
- function renderJudgeStability(stddev, samples, failures, lang) {
25
- if (!samples || samples.length <= 1)
26
- return '';
27
- const stddevTag = stddev != null
28
- ? `<span class="dim-tag" title="${t('judgeStddevDesc', lang)}">±${stddev}</span>`
29
- : '';
30
- const failTag = failures && failures > 0
31
- ? `<span class="dim-tag" style="background:var(--red-soft);color:var(--red)" title="${t('judgeFailuresDesc', lang)}">${failures}/${samples.length} fail</span>`
32
- : '';
33
- return stddevTag + failTag;
34
- }
35
- /** Render CoT reasoning as a collapsed details block. */
36
- function renderReasoning(reasoning, lang) {
37
- if (!reasoning)
38
- return '';
39
- return `<details style="margin-top:4px"><summary style="font-size:10px;color:var(--text-muted);cursor:pointer">${t('judgeReasoning', lang)} ${t('judgeReasoningExpand', lang)}</summary><div style="font-size:11px;color:var(--text-muted);padding:4px;background:var(--bg-subtle);border-radius:3px;white-space:pre-wrap">${e(reasoning)}</div></details>`;
40
- }
41
- function renderTrace(turns, toolCalls, timing, fullOutput, id, lang) {
42
- if (!turns || turns.length === 0)
43
- return '';
44
- const timingHtml = timing
45
- ? `<div style="font-size:11px;color:var(--text-muted);margin-bottom:8px">${t('traceExecMs', lang)} ${fmtDuration(timing.execMs)} · ${t('traceGradeMs', lang)} ${fmtDuration(timing.gradeMs)} · ${t('traceTotalMs', lang)} ${fmtDuration(timing.totalMs)}</div>`
46
- : '';
47
- const steps = turns.map((turn, i) => {
48
- const durTag = turn.durationMs ? `<span style="color:var(--text-muted);font-size:10px;margin-left:6px">${fmtDuration(turn.durationMs)}</span>` : '';
49
- if (turn.role === 'assistant') {
50
- const toolTags = (turn.toolCalls || []).map((tc) => {
51
- const statusColor = tc.success ? 'var(--green)' : 'var(--red)';
52
- const inputPreview = typeof tc.input === 'string' ? tc.input.slice(0, 80) : JSON.stringify(tc.input || '').slice(0, 80);
53
- return `<div style="margin:2px 0 2px 16px;font-size:11px"><span style="color:${statusColor}">●</span> <strong>${e(tc.tool)}</strong> <span style="color:var(--text-muted)">${e(inputPreview)}</span></div>`;
54
- }).join('');
55
- const textPreview = turn.content ? `<div style="font-size:11px;color:var(--text-secondary);margin-left:16px;white-space:pre-wrap;max-height:60px;overflow:hidden">${e(turn.content.slice(0, 200))}</div>` : '';
56
- return `<div style="margin:4px 0;padding:4px 0;border-left:2px solid var(--accent)">
57
- <div style="font-size:11px;padding-left:8px"><span style="color:var(--accent);font-weight:600">[${i + 1}] ${t('traceAssistant', lang)}</span>${durTag}</div>
58
- ${toolTags}${textPreview}
59
- </div>`;
23
+ /**
24
+ * 渲染单个 variant 在某个 sample 上的"评分卡片块"。
25
+ * 结构化分段:综合分 → 三层分(事实/行为/LLM 评价)→ 失败断言 → judge 推理 → 工具调用统计。
26
+ * 每段独立展示,文本左对齐,数字 tabular-nums 对齐。
27
+ *
28
+ * delta(对比第 1 个 variant)只在多 variant 模式下显示。
29
+ */
30
+ function renderVariantBlock(d, variantName, comparedTo, lang) {
31
+ const score = d.compositeScore ?? d.llmScore;
32
+ const hasScore = typeof score === 'number';
33
+ const scoreText = hasScore ? score : (d.ok ? '—' : 'ERR');
34
+ const scoreColor = !d.ok ? 'var(--red)' : (hasScore && score >= 4) ? 'var(--green)' : (hasScore && score >= 3) ? 'var(--yellow)' : (hasScore ? 'var(--red)' : 'var(--text-muted)');
35
+ // Judge 自一致性指标(单评分模式 ≥2 次评委时):stddev + failure count
36
+ let stabilityHtml = '';
37
+ if (d.llmScoreSamples && d.llmScoreSamples.length > 1) {
38
+ if (d.llmScoreStddev != null) {
39
+ stabilityHtml += ` <span class="sc-stab" title="${t('judgeStddevDesc', lang)}">±${d.llmScoreStddev}</span>`;
60
40
  }
61
- // tool result
62
- const statusIcon = turn.content.length > 0 ? '✓' : '✗';
63
- return `<div style="margin:4px 0;padding:4px 0;border-left:2px solid var(--border)">
64
- <div style="font-size:11px;padding-left:8px"><span style="color:var(--text-muted)">[${i + 1}] ${t('traceTool', lang)} ${statusIcon}</span>${durTag}</div>
65
- <div style="font-size:11px;color:var(--text-muted);margin-left:16px;white-space:pre-wrap;max-height:40px;overflow:hidden">${e(turn.content.slice(0, 200))}</div>
66
- </div>`;
67
- }).join('');
68
- const outputBtn = fullOutput
69
- ? `<button onclick="document.getElementById('modal-${id}').style.display='flex'" style="font-size:11px;margin-top:4px;padding:2px 8px;cursor:pointer;background:var(--bg-surface);color:var(--accent);border:1px solid var(--border);border-radius:var(--radius)">${t('traceFullOutput', lang)}</button>
70
- <div id="modal-${id}" style="display:none;position:fixed;inset:0;z-index:999;background:rgba(0,0,0,0.6);align-items:center;justify-content:center" onclick="if(event.target===this)this.style.display='none'">
71
- <div style="background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);max-width:800px;max-height:80vh;overflow:auto;padding:20px;margin:20px;width:90%">
72
- <div style="display:flex;justify-content:space-between;margin-bottom:12px"><strong>${t('traceFullOutput', lang)}</strong><button onclick="this.closest('[id^=modal]').style.display='none'" style="cursor:pointer;background:none;border:none;color:var(--text-muted);font-size:16px">✕</button></div>
73
- <pre style="font-size:12px;white-space:pre-wrap;word-break:break-word;color:var(--text-primary)">${e(fullOutput)}</pre>
74
- </div>
75
- </div>`
41
+ if (d.llmScoreFailures && d.llmScoreFailures > 0) {
42
+ stabilityHtml += ` <span class="sc-stab sc-stab--fail" title="${t('judgeFailuresDesc', lang)}">${d.llmScoreFailures}/${d.llmScoreSamples.length} fail</span>`;
43
+ }
44
+ }
45
+ // delta 跟首 variant(通常是 baseline)的差值
46
+ let scoreDelta = '';
47
+ if (comparedTo && hasScore && typeof comparedTo.compositeScore === 'number') {
48
+ const diff = score - comparedTo.compositeScore;
49
+ if (Math.abs(diff) >= 0.05) {
50
+ const sign = diff > 0 ? '+' : '';
51
+ const dColor = diff > 0 ? 'var(--green)' : 'var(--red)';
52
+ scoreDelta = `<span style="color:${dColor};font-size:13px;margin-left:8px;font-weight:600">${sign}${diff.toFixed(2)}</span>`;
53
+ }
54
+ }
55
+ // 三层分
56
+ const ls = d.layeredScores;
57
+ const layerRows = [];
58
+ if (ls?.factScore != null) {
59
+ const dColor = ls.factScore >= 4 ? 'var(--green)' : ls.factScore >= 3 ? 'var(--yellow)' : 'var(--red)';
60
+ layerRows.push(`<div class="sc-layer-row"><span class="sc-layer-name">${lang === 'zh' ? '事实' : 'Fact'}</span><span class="sc-layer-val" style="color:${dColor}">${ls.factScore}</span></div>`);
61
+ }
62
+ if (ls?.behaviorScore != null) {
63
+ const dColor = ls.behaviorScore >= 4 ? 'var(--green)' : ls.behaviorScore >= 3 ? 'var(--yellow)' : 'var(--red)';
64
+ layerRows.push(`<div class="sc-layer-row"><span class="sc-layer-name">${lang === 'zh' ? '行为' : 'Behavior'}</span><span class="sc-layer-val" style="color:${dColor}">${ls.behaviorScore}</span></div>`);
65
+ }
66
+ if (ls?.judgeScore != null) {
67
+ const dColor = ls.judgeScore >= 4 ? 'var(--green)' : ls.judgeScore >= 3 ? 'var(--yellow)' : 'var(--red)';
68
+ layerRows.push(`<div class="sc-layer-row"><span class="sc-layer-name">${lang === 'zh' ? 'LLM 评价' : 'Judge'}</span><span class="sc-layer-val" style="color:${dColor}">${ls.judgeScore}</span></div>`);
69
+ }
70
+ const layeredHtml = layerRows.length > 0 ? `<div class="sc-layers">${layerRows.join('')}</div>` : '';
71
+ // 失败断言(只列 fail 的)
72
+ let assertionHtml = '';
73
+ if (d.assertions?.details) {
74
+ const failed = d.assertions.details.filter((a) => !a.passed);
75
+ const total = d.assertions.details.length;
76
+ if (failed.length > 0) {
77
+ const items = failed.map((a) => `<li><code>${e(a.type)}</code>: ${e(String(a.value))}</li>`).join('');
78
+ assertionHtml = `<div class="sc-section"><div class="sc-section-h">${lang === 'zh' ? '失败断言' : 'Failed assertions'} <span class="sc-stat">${failed.length}/${total}</span></div><ul class="sc-assert-list">${items}</ul></div>`;
79
+ }
80
+ else if (total > 0) {
81
+ assertionHtml = `<div class="sc-section sc-section--muted">${lang === 'zh' ? '断言全过' : 'All passed'} <span class="sc-stat">${total}/${total}</span></div>`;
82
+ }
83
+ }
84
+ // Judge 评价
85
+ let judgeHtml = '';
86
+ if (d.llmReason) {
87
+ const reasonText = d.llmReason.length > 200 ? d.llmReason.slice(0, 200) + '…' : d.llmReason;
88
+ const cot = d.llmReasoning
89
+ ? `<details class="sc-cot"><summary>${lang === 'zh' ? '展开完整 CoT' : 'show full CoT'}</summary><pre class="sc-cot-body">${e(d.llmReasoning)}</pre></details>`
90
+ : '';
91
+ judgeHtml = `<div class="sc-section"><div class="sc-section-h">${lang === 'zh' ? 'Judge 评价' : 'Judge'}</div><div class="sc-judge-text">${e(reasonText)}</div>${cot}</div>`;
92
+ }
93
+ // Multi-judge ensemble (collapsed)
94
+ const ensembleHtml = renderEnsembleBlock(d.llmEnsemble, d.llmAgreement, lang);
95
+ // 维度评分(multi-rubric mode)
96
+ let dimHtml = '';
97
+ if (d.dimensions && Object.keys(d.dimensions).length > 0) {
98
+ const dimRows = Object.entries(d.dimensions).map(([dim, info]) => {
99
+ const s = typeof info === 'object' ? info.score : info;
100
+ const dColor = (typeof s === 'number' && s >= 4) ? 'var(--green)' : (typeof s === 'number' && s >= 3) ? 'var(--yellow)' : 'var(--red)';
101
+ return `<div class="sc-layer-row"><span class="sc-layer-name">${e(dim)}</span><span class="sc-layer-val" style="color:${dColor}">${s}</span></div>`;
102
+ }).join('');
103
+ dimHtml = `<div class="sc-section"><div class="sc-section-h">${lang === 'zh' ? '维度评分' : 'Dimensions'}</div><div class="sc-layers">${dimRows}</div></div>`;
104
+ }
105
+ // 事实校验
106
+ let factCheckHtml = '';
107
+ if (d.factCheck && d.factCheck.totalCount > 0) {
108
+ const fc = d.factCheck;
109
+ const fcColor = fc.verifiedRate >= 0.8 ? 'var(--green)' : fc.verifiedRate >= 0.5 ? 'var(--yellow)' : 'var(--red)';
110
+ factCheckHtml = `<div class="sc-meta-row"><span class="sc-meta-name">${lang === 'zh' ? '事实校验' : 'Fact verified'}</span><span style="color:${fcColor}">${fc.verifiedCount}/${fc.totalCount}</span></div>`;
111
+ }
112
+ // 工具调用 + tokens + 耗时
113
+ const totalMs = d.timing?.totalMs || d.durationMs;
114
+ const metaParts = [];
115
+ if (d.numToolCalls != null && d.numToolCalls > 0) {
116
+ const srColor = (d.toolSuccessRate ?? 1) >= 0.8 ? 'var(--green)' : 'var(--red)';
117
+ const srText = d.toolSuccessRate != null ? `${(d.toolSuccessRate * 100).toFixed(0)}%` : '—';
118
+ metaParts.push(`<div class="sc-meta-row"><span class="sc-meta-name">${lang === 'zh' ? '工具调用' : 'Tools'}</span>${d.numToolCalls} <span style="color:${srColor}">(${srText} OK)</span></div>`);
119
+ }
120
+ metaParts.push(`<div class="sc-meta-row"><span class="sc-meta-name">${lang === 'zh' ? 'Tokens' : 'Tokens'}</span>${fmtNum(d.totalTokens)}</div>`);
121
+ metaParts.push(`<div class="sc-meta-row"><span class="sc-meta-name">${lang === 'zh' ? '耗时' : 'Duration'}</span>${fmtDuration(totalMs)}</div>`);
122
+ // Error message
123
+ const errorHtml = !d.ok && d.error
124
+ ? `<div class="sc-error">⚠ ${e(d.error)}</div>`
76
125
  : '';
77
- return `<details style="margin-top:6px">
78
- <summary style="font-size:11px;color:var(--accent);cursor:pointer">${t('traceToggle', lang)} (${turns.length} steps)</summary>
79
- <div style="margin-top:4px;padding:8px;background:var(--bg-surface);border-radius:var(--radius);max-height:400px;overflow-y:auto">
80
- ${timingHtml}${steps}${outputBtn}
81
- </div>
82
- </details>`;
126
+ return `<div class="sc-variant">
127
+ <div class="sc-variant-h">${e(variantName)}</div>
128
+ <div class="sc-score-line"><span class="sc-score" style="color:${scoreColor}">${scoreText}</span><span class="sc-score-unit">/ 5</span>${scoreDelta}${stabilityHtml}</div>
129
+ ${layeredHtml}
130
+ ${errorHtml}
131
+ ${assertionHtml}
132
+ ${dimHtml}
133
+ ${judgeHtml}
134
+ ${ensembleHtml}
135
+ ${factCheckHtml ? `<div class="sc-section">${factCheckHtml}</div>` : ''}
136
+ <div class="sc-meta">${metaParts.join('')}</div>
137
+ </div>`;
83
138
  }
84
139
  export function renderSampleTable(variants, results, lang) {
85
- const headerCols = variants.map((v) => `<th>${e(v)} <span data-i18n="scoreCol">${t('scoreCol', lang)}</span></th><th>${e(v)} <span data-i18n="tokensCol">${t('tokensCol', lang)}</span></th><th>${e(v)} <span data-i18n="msCol">${t('msCol', lang)}</span></th>`).join('');
86
- const sampleRows = results.map((r) => {
87
- const cols = variants.map((v, i) => {
140
+ // v0.30 — 不再用宽表格(每 td 塞 15 种内容居中显示乱);
141
+ // 改成"用例可折叠卡片",点击展开看 variant-by-variant 的结构化评分块。
142
+ // 每条用例先按综合分升序(差的在前),便于聚焦问题样本。
143
+ const sortedResults = [...results].sort((a, b) => {
144
+ // 取首 variant 的 composite,按升序排
145
+ const sa = a.variants?.[variants[0]]?.compositeScore ?? 0;
146
+ const sb = b.variants?.[variants[0]]?.compositeScore ?? 0;
147
+ return sa - sb;
148
+ });
149
+ const sampleCards = sortedResults.map((r) => {
150
+ // 头部摘要:sample_id + 各 variant 的 score 一行带过
151
+ const scoreSummary = variants.map((v) => {
152
+ const d = r.variants?.[v];
153
+ const score = d?.compositeScore ?? d?.llmScore;
154
+ if (typeof score !== 'number')
155
+ return `<span class="sc-summary-score sc-summary-score--muted">${e(v)} —</span>`;
156
+ const color = score >= 4 ? 'var(--green)' : score >= 3 ? 'var(--yellow)' : 'var(--red)';
157
+ return `<span class="sc-summary-score" style="color:${color}">${e(v)} ${score.toFixed(2)}</span>`;
158
+ }).join('<span class="sc-summary-sep">·</span>');
159
+ // 体内每个 variant 一栏(side-by-side),传 baseline (variants[0]) 用于 delta
160
+ const baselineResult = r.variants?.[variants[0]];
161
+ const variantBlocks = variants.map((v, i) => {
88
162
  const d = r.variants?.[v];
89
163
  if (!d)
90
- return '<td>-</td><td>-</td><td>-</td>';
91
- const score = d.compositeScore ?? d.llmScore;
92
- const hasScore = typeof score === 'number';
93
- const scoreClass = !d.ok ? 'badge-err' : hasScore ? 'badge-ok' : 'badge-muted';
94
- const scoreText = hasScore ? score : (d.ok ? '-' : 'ERR');
95
- // Layered score badges
96
- let layeredHtml = '';
97
- if (d.layeredScores) {
98
- const ls = d.layeredScores;
99
- const badges = [];
100
- if (ls.factScore != null)
101
- badges.push(`<span class="dim-tag" title="${lang === 'zh' ? '事实:输出中的事实声明是否正确(规则验证)' : 'Fact: Are factual claims correct (rule-verified)'}">${lang === 'zh' ? '事实' : 'F'}:${ls.factScore}</span>`);
102
- if (ls.behaviorScore != null)
103
- badges.push(`<span class="dim-tag" title="${lang === 'zh' ? '行为:执行路径是否符合预期(规则验证)' : 'Behavior: Is execution path compliant (rule-verified)'}">${lang === 'zh' ? '行为' : 'B'}:${ls.behaviorScore}</span>`);
104
- if (ls.judgeScore != null)
105
- badges.push(`<span class="dim-tag" title="${lang === 'zh' ? 'LLM 评价:LLM 评委按预先写好的评分规则(英文叫 rubric)给输出打的主观分' : 'LLM judge: subjective score given by the judge LLM against a predefined rubric (scoring criteria)'}">${lang === 'zh' ? 'LLM 评价' : 'J'}:${ls.judgeScore}</span>`);
106
- if (badges.length > 0)
107
- layeredHtml = `<div class="dim-scores">${badges.join('')}</div>`;
108
- }
109
- // Fact check badge
110
- let factCheckHtml = '';
111
- if (d.factCheck && d.factCheck.totalCount > 0) {
112
- const fc = d.factCheck;
113
- const fcColor = fc.verifiedRate >= 0.8 ? 'var(--green)' : fc.verifiedRate >= 0.5 ? 'var(--yellow)' : 'var(--red)';
114
- factCheckHtml = `<div style="font-size:11px;margin-top:2px"><span style="color:${fcColor}">${lang === 'zh' ? '事实验证' : 'Verified'} ${fc.verifiedCount}/${fc.totalCount}</span></div>`;
115
- }
116
- const errorHtml = !d.ok && d.error
117
- ? `<br><span class="error-detail">${e(d.error)}</span>`
118
- : '';
119
- // Only show failed assertions
120
- let assertionHtml = '';
121
- if (d.assertions?.details) {
122
- const failed = d.assertions.details.filter((a) => !a.passed);
123
- if (failed.length > 0) {
124
- const items = failed.map((a) => `<li><span class="badge badge-fail" style="font-size:10px;padding:1px 4px">&#10007;</span> ${e(a.type)}: ${e(a.value)}</li>`).join('');
125
- assertionHtml = `<ul class="assertion-list">${items}</ul>`;
126
- }
127
- }
128
- let dimHtml = '';
129
- let dimEnsembleHtml = '';
130
- if (d.dimensions) {
131
- const tags = Object.entries(d.dimensions).map(([dim, info]) => {
132
- const s = typeof info === 'object' ? info.score : info;
133
- const dr = typeof info === 'object' ? info : undefined;
134
- const stab = dr ? renderJudgeStability(dr.scoreStddev, dr.scoreSamples, dr.judgeFailureCount, lang) : '';
135
- return `<span class="dim-tag">${e(dim)}: ${s}</span>${stab}`;
136
- }).join('');
137
- dimHtml = `<div class="dim-scores">${tags}</div>`;
138
- // Per-dimension ensemble blocks (collapsed)
139
- const ensBlocks = Object.entries(d.dimensions)
140
- .map(([dim, info]) => {
141
- if (typeof info !== 'object')
142
- return '';
143
- const dr = info;
144
- const block = renderEnsembleBlock(dr.ensemble, dr.agreement, lang);
145
- const reasoning = renderReasoning(dr.reasoning, lang);
146
- if (!block && !reasoning)
147
- return '';
148
- return `<div style="margin-top:4px"><strong style="font-size:11px">${e(dim)}</strong>${block}${reasoning}</div>`;
149
- })
150
- .filter(Boolean).join('');
151
- if (ensBlocks)
152
- dimEnsembleHtml = ensBlocks;
153
- }
154
- // Single-rubric mode: stddev / failures / reasoning / ensemble inline
155
- const stabilityHtml = renderJudgeStability(d.llmScoreStddev, d.llmScoreSamples, d.llmScoreFailures, lang);
156
- const reasoningHtml = renderReasoning(d.llmReasoning, lang);
157
- const ensembleHtml = renderEnsembleBlock(d.llmEnsemble, d.llmAgreement, lang);
158
- const reasonHtml = d.llmReason
159
- ? `<br><span style="font-size:11px;color:var(--text-muted)">${e(d.llmReason?.slice(0, 80))}</span>`
160
- : '';
161
- // Agent tool call summary
162
- let toolHtml = '';
163
- if (d.numToolCalls != null && d.numToolCalls > 0) {
164
- const srColor = (d.toolSuccessRate ?? 1) >= 0.8 ? 'var(--green)' : 'var(--red)';
165
- const srText = d.toolSuccessRate != null ? `${(d.toolSuccessRate * 100).toFixed(0)}%` : '-';
166
- const toolList = (d.toolNames || []).join(', ');
167
- const toolTip = toolList ? ` title="${e(toolList)}"` : '';
168
- toolHtml = `<div style="font-size:11px;margin-top:2px;color:var(--text-muted)"${toolTip}>🔧 ${d.numToolCalls} calls · <span style="color:${srColor}">${srText} OK</span></div>`;
169
- }
170
- // Execution trace (expandable)
171
- const traceId = `trace-${r.sample_id}-${v}`.replace(/[^a-zA-Z0-9-]/g, '_');
172
- const traceHtml = d.turns ? renderTrace(d.turns, d.toolCalls, d.timing, d.fullOutput, traceId, lang) : '';
173
- // Timing summary
174
- const timingHtml = d.timing
175
- ? `<div style="font-size:10px;color:var(--text-muted);margin-top:2px">${t('traceExecMs', lang)} ${fmtDuration(d.timing.execMs)} · ${t('traceGradeMs', lang)} ${fmtDuration(d.timing.gradeMs)}</div>`
176
- : '';
177
- const firstV = r.variants?.[variants[0]];
178
- const totalMs = d.timing?.totalMs || d.durationMs;
179
- const firstTotalMs = firstV?.timing?.totalMs || firstV?.durationMs || 0;
180
- const tokenDelta = i > 0 && firstV ? delta(firstV.totalTokens, d.totalTokens, true) : '';
181
- const msDelta = i > 0 && firstTotalMs ? delta(firstTotalMs, totalMs, true) : '';
182
- return `<td><span class="badge ${scoreClass}">${scoreText}</span>${stabilityHtml}${layeredHtml}${factCheckHtml}${errorHtml}${reasonHtml}${reasoningHtml}${ensembleHtml}${assertionHtml}${dimHtml}${dimEnsembleHtml}${toolHtml}${timingHtml}${traceHtml}</td><td>${fmtNum(d.totalTokens)}${tokenDelta}</td><td>${fmtDuration(totalMs)}${msDelta}</td>`;
164
+ return `<div class="sc-variant"><div class="sc-variant-h">${e(v)}</div><div class="sc-empty">—</div></div>`;
165
+ // 跟 baseline 比;baseline 自身不显示 delta
166
+ return renderVariantBlock(d, v, i === 0 ? undefined : baselineResult, lang);
183
167
  }).join('');
184
- return `<tr><td><strong>${e(r.sample_id)}</strong></td>${cols}</tr>`;
168
+ return `<details class="sc-sample-card">
169
+ <summary class="sc-sample-h">
170
+ <code class="sc-sample-id">${e(r.sample_id)}</code>
171
+ <span class="sc-sample-scores">${scoreSummary}</span>
172
+ </summary>
173
+ <div class="sc-sample-body">
174
+ <div class="sc-variants" data-cols="${variants.length}">${variantBlocks}</div>
175
+ </div>
176
+ </details>`;
185
177
  }).join('');
186
178
  return `
187
179
  <h2 data-i18n="perSampleDetail">${t('perSampleDetail', lang)}</h2>
188
- <div class="table-wrap">
189
- <table>
190
- <thead><tr><th data-i18n="sample">${t('sample', lang)}</th>${headerCols}</tr></thead>
191
- <tbody>${sampleRows}</tbody>
192
- </table>
193
- </div>`;
180
+ <div class="sc-sample-list">${sampleCards}</div>
181
+ <style>
182
+ /* 评分页 — 逐用例详情卡片(替代旧 table)
183
+ 结构:
184
+ .sc-sample-list 外层 stack
185
+ .sc-sample-card 一条用例,可折叠 details
186
+ .sc-sample-h 头(id + 各 variant 分数摘要)
187
+ .sc-sample-body 体
188
+ .sc-variants grid 多列(每 variant 一栏)
189
+ .sc-variant 单 variant 评分块
190
+ 关键:文本左对齐,数字右对齐 + tabular-nums,分段而非表格,
191
+ 减少居中混排和长短文本拥挤。 */
192
+ .sc-sample-list { display:flex;flex-direction:column;gap:8px;margin:12px 0 }
193
+ .sc-sample-card { background:var(--bg-surface);border-radius:var(--radius);box-shadow:var(--shadow-sm);transition:box-shadow .15s }
194
+ .sc-sample-card:hover { box-shadow:var(--shadow-md) }
195
+ .sc-sample-card[open] { box-shadow:var(--shadow-md) }
196
+ .sc-sample-h { display:flex;align-items:center;gap:14px;padding:14px 18px;cursor:pointer;list-style:none;font-size:14.5px }
197
+ .sc-sample-h::-webkit-details-marker { display:none }
198
+ .sc-sample-h::after { content:'›';margin-left:auto;color:var(--text-muted);font-size:18px;transition:transform .15s }
199
+ .sc-sample-card[open] .sc-sample-h::after { transform:rotate(90deg) }
200
+ .sc-sample-id { font-family:"SF Mono",Menlo,monospace;color:var(--text-muted);font-size:13px;font-weight:500;letter-spacing:-0.01em }
201
+ .sc-sample-scores { display:flex;align-items:center;gap:8px;font-size:13px;font-variant-numeric:tabular-nums;color:var(--text-secondary) }
202
+ .sc-summary-score { font-family:"SF Mono",Menlo,monospace;font-weight:500 }
203
+ .sc-summary-score--muted { color:var(--text-muted) }
204
+ .sc-summary-sep { color:var(--text-muted) }
205
+ .sc-sample-body { padding:0 18px 18px;border-top:1px solid var(--border) }
206
+ /* 多列 grid:1 variant 用单列;2 用 1fr 1fr;>=3 自适应 */
207
+ .sc-variants { display:grid;gap:24px;margin-top:18px;grid-template-columns:1fr }
208
+ .sc-variants[data-cols="2"] { grid-template-columns:1fr 1fr }
209
+ .sc-variants[data-cols="3"] { grid-template-columns:repeat(3,1fr) }
210
+ .sc-variants[data-cols="4"] { grid-template-columns:repeat(2,1fr) }
211
+ @media (max-width:760px){ .sc-variants, .sc-variants[data-cols="2"], .sc-variants[data-cols="3"], .sc-variants[data-cols="4"] { grid-template-columns:1fr } }
212
+ .sc-variant { background:var(--bg-soft);border-radius:6px;padding:14px 16px;font-size:14px;line-height:1.7 }
213
+ .sc-variant-h { font-size:13px;font-weight:600;color:var(--text-muted);margin-bottom:8px;letter-spacing:0.02em;font-family:"SF Mono",Menlo,monospace }
214
+ .sc-score-line { display:flex;align-items:baseline;gap:6px;margin-bottom:14px }
215
+ .sc-score { font-size:32px;font-weight:600;font-variant-numeric:tabular-nums;line-height:1 }
216
+ .sc-score-unit { font-size:14px;color:var(--text-muted);font-weight:400 }
217
+ .sc-stab { font-size:12px;color:var(--text-muted);margin-left:8px;font-family:"SF Mono",Menlo,monospace;background:var(--bg-soft);padding:2px 6px;border-radius:3px }
218
+ .sc-stab--fail { color:var(--red);background:var(--red-bg) }
219
+ .sc-layers { display:flex;flex-direction:column;gap:4px;margin-bottom:8px }
220
+ .sc-layer-row { display:flex;justify-content:space-between;align-items:baseline;font-size:13.5px;line-height:1.6 }
221
+ .sc-layer-name { color:var(--text-secondary) }
222
+ .sc-layer-val { font-weight:600;font-variant-numeric:tabular-nums;font-family:"SF Mono",Menlo,monospace }
223
+ .sc-section { margin-top:14px }
224
+ .sc-section--muted { color:var(--text-muted);font-size:13px }
225
+ .sc-section-h { font-size:13px;font-weight:600;color:var(--text-secondary);margin-bottom:6px }
226
+ .sc-stat { color:var(--text-muted);font-weight:400;margin-left:6px;font-variant-numeric:tabular-nums }
227
+ .sc-assert-list { margin:0;padding-left:20px;font-size:13px;line-height:1.7;color:var(--text-secondary) }
228
+ .sc-assert-list li { margin:3px 0 }
229
+ .sc-assert-list code { font-family:"SF Mono",Menlo,monospace;background:var(--bg-surface);padding:1px 6px;border-radius:3px;font-size:12px }
230
+ .sc-judge-text { font-size:13.5px;line-height:1.7;color:var(--text-primary);white-space:pre-wrap;word-break:break-word }
231
+ .sc-cot { margin-top:8px;font-size:12px }
232
+ .sc-cot summary { cursor:pointer;color:var(--text-muted) }
233
+ .sc-cot-body { font-size:12.5px;line-height:1.7;color:var(--text-secondary);white-space:pre-wrap;font-family:inherit;background:var(--bg-surface);padding:10px 14px;border-radius:4px;margin-top:6px;max-height:400px;overflow-y:auto }
234
+ .sc-meta { margin-top:14px;padding-top:12px;border-top:1px solid var(--border);display:flex;flex-direction:column;gap:4px }
235
+ .sc-meta-row { display:flex;justify-content:space-between;font-size:12.5px;color:var(--text-muted);font-variant-numeric:tabular-nums }
236
+ .sc-meta-name { color:var(--text-muted) }
237
+ .sc-error { margin-top:10px;padding:10px 14px;background:var(--red-bg);border-left:3px solid var(--red);border-radius:4px;font-size:13px;color:var(--red);line-height:1.6 }
238
+ .sc-empty { color:var(--text-muted);font-style:italic;padding:14px 0 }
239
+ </style>`;
194
240
  }
195
241
  //# sourceMappingURL=table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/renderer/table.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/renderer/table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * 单测视角渲染器 — 把 EvaluationReport 当作 vitest 风格的测试结果看:
3
+ *
4
+ * 每个 sample = 一个 test case
5
+ * ┌─ 用例设计(测试契约): prompt / rubric / 期望 assertions / 工具调用 mock
6
+ * ├─ 执行轨迹: thinking + tool calls + 断言绑定到 turn
7
+ * └─ 断言汇总: 每条 assertion 在哪一步触发,pass/fail
8
+ *
9
+ * 数据全部来自 EvaluationReport,不引入新数据源:
10
+ * - 设计 ← report.sampleSnapshots[sample_id]
11
+ * - 执行 ← VariantResult.turns / .toolCalls / .mockStats / .fullOutput
12
+ * - 断言 ← VariantResult.assertions.details (已经有 passed/failed)
13
+ *
14
+ * 旧 report 缺 sampleSnapshots 时降级显示("无设计快照,只有执行结果")。
15
+ */
16
+ import type { EvaluationReport, SampleSnapshot, VariantResult, Lang } from '../types/index.js';
17
+ import type { Assertion } from '../types/eval.js';
18
+ import type { ToolCallInfo, TurnInfo } from '../types/executor.js';
19
+ import type { AssertionDetail } from '../types/judge.js';
20
+ /** Tool call 的稳定签名,用于在 turns 里反查 turn 序号。 */
21
+ export declare function toolCallSignature(tc: ToolCallInfo): string;
22
+ /** 走 turns 数组,给每个 tool call 标一个 turn 编号(1-based)。导出供单测验证。 */
23
+ export declare function indexToolCallsByTurn(turns: TurnInfo[] | undefined): Map<string, number>;
24
+ /** 字符串解析:`tool_input_contains` / `tool_output_contains` 用 `Tool:substring` 格式。 */
25
+ export declare function parseToolColonValue(value: string): {
26
+ tool: string;
27
+ needle: string;
28
+ };
29
+ /** 把单条 assertion 绑定到某一步。匹配不到返回 null(contains/regex 等作用于 fullOutput
30
+ * 的天然没有 turn 绑定)。导出供单测。
31
+ *
32
+ * 局限:mock_hit 的 turn 绑定靠"该 tool 的第 N 次调用 = 第 N 个 mock"启发式,
33
+ * 和真实 mock matcher(按 match 规则)可能不一致——状态机 mock 场景下 turn 标签可能近似。
34
+ * pass/fail 仍以 AssertionDetail.passed 为准。 */
35
+ export declare function findAssertionTurn(assertion: Assertion, detail: AssertionDetail, toolCalls: ToolCallInfo[], turnByCallSig: Map<string, number>): {
36
+ turn: number | null;
37
+ matchedCall?: ToolCallInfo;
38
+ };
39
+ /** 用例的整体 verdict:全部 assertion 通过 → pass;任一失败 → fail;无 assertion → 视为 pass(谨慎)。 */
40
+ export declare function sampleVerdict(details: AssertionDetail[] | undefined): 'pass' | 'fail';
41
+ /**
42
+ * 判断 sample 是否是"诱错样本(tripwire)"——视觉上要跟普通 fail 区分开。
43
+ *
44
+ * 识别来源(任一即算):
45
+ * 1. snapshot.tripwire === true(generator/作者显式标记)
46
+ * 2. diagnostic.rootCause 包含 'tripwire_intentional'(LLM 诊断时自己识破的)
47
+ *
48
+ * 用途:UI 把诱错样本的失败渲染成紫色 "🪤 诱错触发" 而非红色 "✗ FAIL",
49
+ * 避免使用者误以为是要修的真 bug。
50
+ */
51
+ export declare function isTripwireSample(snapshot: SampleSnapshot | undefined, variant: VariantResult): boolean;
52
+ export declare function renderTestView(report: EvaluationReport, lang: Lang): string;
53
+ /** 单测视角的 CSS。
54
+ *
55
+ * 设计原则:
56
+ * - **scoped 浅色岛**:外层 layout 是深色主题(评分 tab 用),test view 在 .tv-root
57
+ * 里覆盖一套浅色变量,实现"切到单测 tab = 切到杂志阅读模式"。
58
+ * - **潘通启发的哑色调**:sage/dusty rose/mauve(饱和度 ~50%),不像 GitHub error log。
59
+ * - **大字号 + 高行高**:正文 15px / 行高 1.75,代码 13px。中文优先 PingFang/YaHei。
60
+ * - **subtle shadow 替代 border**:卡片间 16-24px 留白,box-shadow 浮起感。
61
+ * - **default-collapsed**:通过的用例只显一行;失败/诱错展开诊断,其余 section 折叠。
62
+ */
63
+ export declare const TEST_VIEW_CSS = "\n/* tv-root: \u6D45\u8272\u5C9B,scoped \u8986\u76D6\u5916\u5C42\u6DF1\u8272 layout */\n.tv-root {\n --tv-bg:#fbfaf7; --tv-bg-card:#ffffff; --tv-bg-soft:rgba(58,58,58,.025);\n --tv-text:#3a3a3a; --tv-text-2:#7a7a7a; --tv-text-3:#a8a8a8;\n --tv-divider:#e8e3da;\n /* \u52A0\u5927 pass / fail / tripwire \u7684\u8272\u76F8\u8DDD\u79BB + \u6697\u5EA6\u5DEE,\u907F\u514D\u8FDC\u770B\u96F7\u540C\u3002\n pass: \u9F20\u5C3E\u8349\u7EFF(\u6697\u4E00\u6863,\u9760\u8FD1\u6797\u5730);fail: \u7816\u7EA2\u571F\u9676(\u6697\u4E00\u6863,\u8FDC\u79BB pink);tripwire: \u7D2B\u7F57\u5170(\u72EC\u7ACB\u8272\u76F8)\u3002 */\n --tv-pass:#5e8252; --tv-fail:#9c4a3f; --tv-tripwire:#7a6b89;\n --tv-pass-soft:rgba(94,130,82,.10); --tv-fail-soft:rgba(156,74,63,.10); --tv-tripwire-soft:rgba(122,107,137,.10);\n --tv-accent:#5a7a93; --tv-warn:#b08030;\n --tv-shadow:0 1px 3px rgba(58,58,58,.06);\n --tv-shadow-hover:0 2px 8px rgba(58,58,58,.10);\n background:var(--tv-bg); color:var(--tv-text);\n padding:32px 0; margin:-16px 0 0; border-radius:6px;\n font-family:-apple-system,BlinkMacSystemFont,\"PingFang SC\",\"Microsoft YaHei\",\"Segoe UI\",sans-serif;\n font-size:15px; line-height:1.75;\n}\n/* Variant tabs \u2014 \u663E\u5F0F reset \u6D4F\u89C8\u5668\u9ED8\u8BA4 button \u6837\u5F0F(border-radius / outline / appearance)\n \u9632\u6B62 layout \u90A3\u8FB9\u7684\u5168\u5C40 button \u89C4\u5219\u7ED9\u5E95\u90E8\u52A0\u4E86\u5947\u602A\u5706\u89D2\u548C\u6DF1\u8272\u80CC\u666F\u3002 */\n.tv-root .tv-variant-tabs { display:flex;gap:0;margin:0 0 24px;border-bottom:1px solid var(--tv-divider) }\n.tv-root .tv-vtab { padding:12px 20px;background:transparent;border:none;border-radius:0;cursor:pointer;color:var(--tv-text-2);border-bottom:2px solid transparent;font-size:14px;font-family:inherit;font-weight:500;outline:none;appearance:none;-webkit-appearance:none;margin-bottom:-1px }\n.tv-root .tv-vtab:hover { color:var(--tv-text) }\n.tv-root .tv-vtab--active { color:var(--tv-text);border-bottom-color:var(--tv-accent);font-weight:600 }\n.tv-root .tv-vtab:focus-visible { outline:2px solid var(--tv-accent);outline-offset:-4px;border-radius:4px }\n/* tv-variant-panel: \u4E0D\u6253\u6A2A\u5411 padding,\u5185\u5BB9\u76F4\u63A5\u5BF9\u9F50 .tv-root \u8FB9\u754C,\u8DDF\u5916\u5C42 omk-view-panel \u7684 h1/subtitle \u540C\u57FA\u7EBF\u3002 */\n/* Stats \u2014 \u66F4\u6241\u5E73\u7684\u6570\u5B57+\u6807\u7B7E\u5E03\u5C40 */\n.tv-root .tv-variant-stats { display:flex;gap:32px;margin:0 0 24px;font-size:14px;color:var(--tv-text-2);align-items:baseline }\n.tv-root .tv-stat { display:flex;align-items:baseline;gap:6px }\n.tv-root .tv-stat-num { color:var(--tv-text);font-weight:600;font-size:18px;font-variant-numeric:tabular-nums }\n.tv-root .tv-stat--pass .tv-stat-num { color:var(--tv-pass) }\n.tv-root .tv-stat--fail .tv-stat-num { color:var(--tv-fail) }\n.tv-root .tv-stat--tripwire .tv-stat-num { color:var(--tv-tripwire) }\n/* Group separator */\n.tv-root .tv-group-sep { display:flex;align-items:center;gap:14px;margin:32px 0 16px;color:var(--tv-text-3);font-size:12px;text-transform:uppercase;letter-spacing:0.08em;font-weight:500 }\n.tv-root .tv-group-sep::after { content:'';flex:1;height:1px;background:var(--tv-divider) }\n/* Pass rows \u2014 one-line list,\u5DE6\u8FB9\u4E00\u9053\u6DE1 sage \u8272\u6761\u505A\"\u901A\u8FC7\"\u6697\u793A */\n.tv-root .tv-rows { display:flex;flex-direction:column;gap:6px;margin:0 }\n.tv-root .tv-row { background:var(--tv-bg-card);border-radius:6px;box-shadow:var(--tv-shadow);transition:box-shadow .15s;border-left:3px solid var(--tv-pass) }\n.tv-root .tv-row:hover { box-shadow:var(--tv-shadow-hover) }\n.tv-root .tv-row[open] { box-shadow:var(--tv-shadow-hover) }\n.tv-root .tv-row-h { display:flex;align-items:center;gap:14px;padding:14px 20px;cursor:pointer;list-style:none;font-size:15px }\n.tv-root .tv-row-h::-webkit-details-marker { display:none }\n.tv-root .tv-row-h::after { content:'\u203A';margin-left:8px;color:var(--tv-text-3);font-size:18px;transition:transform .15s }\n.tv-root .tv-row[open] .tv-row-h::after { transform:rotate(90deg) }\n/* Cards (fail / tripwire) \u2014 \u9ED8\u8BA4\u6298\u53E0,\u8DDF pass row \u4E00\u81F4;\u5934\u90E8\u4E0B\u9762\u52A0\u4E00\u884C preview \u8BA9\u6298\u53E0\u6001\u4E5F\u6709\u4FE1\u606F\u5BC6\u5EA6 */\n.tv-root .tv-card { background:var(--tv-bg-card);border-radius:8px;box-shadow:var(--tv-shadow);margin:0 0 12px;transition:box-shadow .15s }\n.tv-root .tv-card:hover { box-shadow:var(--tv-shadow-hover) }\n.tv-root .tv-card--fail { border-left:3px solid var(--tv-fail) }\n.tv-root .tv-card--tripwire { border-left:3px solid var(--tv-tripwire) }\n.tv-root .tv-card-h { display:flex;align-items:center;gap:14px;padding:16px 22px;cursor:pointer;list-style:none;font-size:15px }\n.tv-root .tv-card-h::-webkit-details-marker { display:none }\n.tv-root .tv-card-h::after { content:'\u203A';margin-left:8px;color:var(--tv-text-3);font-size:18px;transition:transform .15s }\n.tv-root .tv-card[open] .tv-card-h::after { transform:rotate(90deg) }\n.tv-root .tv-card[open] .tv-card-h { border-bottom:1px solid var(--tv-divider) }\n.tv-root .tv-card-preview { padding:0 22px 14px;color:var(--tv-text-2);font-size:14px;line-height:1.7;border-bottom:1px solid var(--tv-divider) }\n.tv-root .tv-card[open] .tv-card-preview { display:none }\n/* Status dots \u2014 \u7528\u5F62\u72B6 + \u8272 + \u5B57\u7B26\u7684\u4E09\u91CD\u533A\u5206,\u907F\u514D\u8272\u76F2 / \u8FDC\u770B\u96F7\u540C\u3002\n pass: \u5B9E\u5FC3\u5706 sage;fail: \u7EA2 \u2717 \u5B57\u7B26(\u66F4\u663E\u773C);tripwire: \u7D2B\u8272 \u25C6 \u83F1\u5F62\u3002 */\n.tv-root .tv-dot { display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;font-size:14px;font-weight:700;line-height:1 }\n.tv-root .tv-dot--pass::before { content:'';width:10px;height:10px;border-radius:50%;background:var(--tv-pass);box-shadow:0 0 0 3px var(--tv-pass-soft) }\n.tv-root .tv-dot--fail::before { content:'\u2717';color:var(--tv-fail);font-size:16px;font-weight:700 }\n.tv-root .tv-dot--tripwire::before { content:'\u25C6';color:var(--tv-tripwire);font-size:13px }\n.tv-root .tv-id { font-family:\"SF Mono\",\"JetBrains Mono\",Menlo,Consolas,monospace;font-size:13px;color:var(--tv-text-3) }\n.tv-root .tv-title { flex:1;font-size:15px;color:var(--tv-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap }\n.tv-root .tv-meta { font-size:13px;color:var(--tv-text-3);font-variant-numeric:tabular-nums;font-family:\"SF Mono\",\"JetBrains Mono\",Menlo,monospace }\n/* Body padding */\n.tv-root .tv-card-body, .tv-root .tv-row-body { padding:22px }\n/* Tripwire banner \u2014 \u5361\u7247\u9876\u90E8\u7684\u7D2B\u8272\u89E3\u91CA\u5E26 */\n.tv-root .tv-tripwire-banner { margin:-22px -22px 20px;padding:18px 22px;background:rgba(139,124,147,.08);border-radius:8px 8px 0 0;border-bottom:1px solid var(--tv-divider) }\n.tv-root .tv-tripwire-banner-title { font-size:14px;font-weight:600;color:var(--tv-tripwire);margin-bottom:6px;letter-spacing:0.02em }\n.tv-root .tv-tripwire-banner-body { font-size:14px;color:var(--tv-text-2);line-height:1.7 }\n/* Diagnosis \u2014 \u4E00\u6BB5\u767D\u8BDD + \u5355\u4E00\u84DD\u8272\u5EFA\u8BAE\u5757 + \u6298\u53E0\u7EC6\u8282 */\n.tv-root .tv-diag { margin:4px 0 16px }\n.tv-root .tv-diag-text { font-size:15px;line-height:1.75;color:var(--tv-text);margin:0 0 16px }\n.tv-root .tv-suggestion { background:rgba(90,122,147,.06);border-left:3px solid var(--tv-accent);padding:14px 18px;margin:12px 0;border-radius:0 4px 4px 0 }\n.tv-root .tv-suggestion-label { display:inline-block;color:var(--tv-accent);font-weight:600;font-size:13px;margin-right:8px;letter-spacing:0.02em }\n.tv-root .tv-suggestion-body { margin:6px 0 0;font-size:14.5px;line-height:1.7;color:var(--tv-text) }\n.tv-root .tv-diag-details { margin-top:14px }\n.tv-root .tv-diag-details > summary { cursor:pointer;font-size:13px;color:var(--tv-text-2);list-style:none }\n.tv-root .tv-diag-details > summary::-webkit-details-marker { display:none }\n.tv-root .tv-diag-details > summary::before { content:'\u25B8 ';color:var(--tv-text-3);display:inline-block;width:16px }\n.tv-root .tv-diag-details[open] > summary::before { content:'\u25BE ' }\n.tv-root .tv-diag-details-body { padding:10px 0 0 16px;font-size:14px;line-height:1.7;color:var(--tv-text-2) }\n.tv-root .tv-diag-details-body p { margin:6px 0 }\n.tv-root .tv-diag-details-body strong { color:var(--tv-text);margin-right:6px }\n/* RootCause inline pill */\n.tv-root .tv-diag-rc-pill { font-size:11px;padding:2px 8px;border-radius:10px;background:var(--tv-bg-soft);color:var(--tv-text-2);margin-right:6px;display:inline-block }\n.tv-root .tv-diag-rc--tripwire_intentional { background:rgba(139,124,147,.12);color:var(--tv-tripwire) }\n.tv-root .tv-diag-rc--sample_design { background:rgba(90,122,147,.10);color:var(--tv-accent) }\n.tv-root .tv-diag-rc--skill_doc_unclear, .tv-diag-rc--skill_doc_missing, .tv-root .tv-diag-rc--llm_misread { background:rgba(176,128,48,.10);color:var(--tv-warn) }\n/* Failure-mode chips \u2014 \u4E2D\u6587\u6807\u7B7E,\u663E\u8457\u5C55\u793A\u5728 summary \u4E0B */\n.tv-root .tv-diag-modes { display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:8px 0 14px }\n.tv-root .tv-diag-modes-label { font-size:12px;color:var(--tv-text-2);margin-right:4px }\n.tv-root .tv-diag-mode-pill { font-size:12px;padding:3px 10px;border-radius:11px;background:var(--tv-bg-soft);color:var(--tv-text);font-weight:500 }\n.tv-root .tv-diag-mode--workflow-skip { background:rgba(176,128,48,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--hardcoded { background:rgba(176,128,48,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--hallucination { background:rgba(180,75,75,.14);color:#b44b4b }\n.tv-root .tv-diag-mode--tool-misuse { background:rgba(176,128,48,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--env-blocked { background:rgba(90,122,147,.12);color:var(--tv-accent) }\n.tv-root .tv-diag-mode--misread { background:rgba(176,128,48,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--other { background:var(--tv-bg-soft);color:var(--tv-text-2) }\n/* Workflow checklist \u2014 \u9ED8\u8BA4\u5C55\u5F00,\u653E\u5728 suggestion \u4E4B\u4E0A,\u76F4\u89C2\u5C55\u793A LLM \u8D70\u5BF9\u54EA\u51E0\u6B65 */\n.tv-root .tv-diag-workflow { margin:14px 0;padding:12px 14px;background:var(--tv-bg-soft);border-radius:6px }\n.tv-root .tv-diag-workflow-title { font-size:13px;font-weight:600;color:var(--tv-text);margin:0 0 10px;letter-spacing:0.02em }\n.tv-root .tv-diag-workflow-list { list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px }\n.tv-root .tv-diag-workflow-item { display:flex;align-items:flex-start;gap:10px;line-height:1.6 }\n.tv-root .tv-diag-workflow-icon { flex-shrink:0;font-weight:700;font-size:14px;width:16px;text-align:center;margin-top:2px }\n.tv-root .tv-diag-workflow-item--pass .tv-diag-workflow-icon { color:#3a8a3a }\n.tv-root .tv-diag-workflow-item--fail .tv-diag-workflow-icon { color:#b44b4b }\n.tv-root .tv-diag-workflow-body { display:flex;flex-direction:column;gap:2px;flex:1 }\n.tv-root .tv-diag-workflow-step { font-size:14px;color:var(--tv-text) }\n.tv-root .tv-diag-workflow-evidence { font-size:12.5px;color:var(--tv-text-2);line-height:1.55 }\n.tv-root .tv-diag-workflow-item--fail .tv-diag-workflow-step { color:#b44b4b }\n/* Partial salvage \u63D0\u793A */\n.tv-root .tv-diag-partial { font-size:12px;color:var(--tv-text-3);margin:0 0 8px;font-style:italic }\n/* Sub-sections \u2014 design / trace / assertions, \u5168\u90E8\u9ED8\u8BA4\u6298\u53E0 */\n.tv-root .tv-section { margin-top:6px;border-top:1px solid var(--tv-divider);padding-top:14px }\n.tv-root .tv-section > summary { cursor:pointer;font-size:14px;font-weight:500;color:var(--tv-text);padding:6px 0;list-style:none }\n.tv-root .tv-section > summary::-webkit-details-marker { display:none }\n.tv-root .tv-section > summary::before { content:'\u25B8 ';color:var(--tv-text-3);display:inline-block;width:16px;font-weight:400 }\n.tv-root .tv-section[open] > summary::before { content:'\u25BE ' }\n.tv-root .tv-section-stat { font-weight:400;color:var(--tv-text-3);margin-left:6px;font-size:13px }\n.tv-root .tv-section-body { padding:14px 0 0 16px;font-size:14.5px;line-height:1.7 }\n/* Design fields */\n.tv-root .tv-prompt, .tv-root .tv-rubric { font-size:14.5px;line-height:1.75;margin:8px 0;color:var(--tv-text-2) }\n.tv-root .tv-prompt strong, .tv-root .tv-rubric strong { color:var(--tv-text);margin-right:6px;font-weight:600 }\n.tv-root .tv-meta-pills { margin:10px 0;display:flex;flex-wrap:wrap;gap:8px }\n.tv-root .tv-meta-pill { font-size:12px;padding:3px 10px;background:var(--tv-bg-soft);border-radius:10px;color:var(--tv-text-2);font-family:\"SF Mono\",Menlo,monospace }\n.tv-root .tv-expected { margin-top:12px }\n.tv-root .tv-expected-h { font-size:13px;color:var(--tv-text-2);margin-bottom:6px }\n.tv-root .tv-expect-line { font-size:13px;font-family:\"SF Mono\",Menlo,monospace;color:var(--tv-text-2);padding:3px 0;line-height:1.6 }\n.tv-root .tv-collapsible { margin-top:10px;font-size:13px }\n.tv-root .tv-collapsible > summary { cursor:pointer;color:var(--tv-text-2) }\n/* Mocks */\n.tv-root .tv-mocks { margin-top:8px }\n.tv-root .tv-mock-line { font-size:12px;font-family:\"SF Mono\",Menlo,monospace;padding:3px 0;display:flex;flex-wrap:wrap;gap:6px;align-items:center;line-height:1.6 }\n.tv-root .tv-mock-idx { color:var(--tv-text-3);font-weight:600 }\n.tv-root .tv-mock-tool { background:var(--tv-bg-soft);padding:2px 6px;border-radius:3px }\n.tv-root .tv-mock-match, .tv-root .tv-mock-return { color:var(--tv-text-2);overflow:hidden;text-overflow:ellipsis;max-width:340px;white-space:nowrap }\n.tv-root .tv-mock-arrow { color:var(--tv-text-3) }\n/* Trace turns */\n.tv-root .tv-turn { margin:10px 0;padding:12px 16px;background:var(--tv-bg-soft);border-radius:4px;border-left:2px solid var(--tv-divider) }\n.tv-root .tv-turn-h { font-size:14px;font-weight:500;color:var(--tv-text);margin-bottom:6px }\n.tv-root .tv-turn-dur { color:var(--tv-text-3);font-weight:400;font-size:12px;margin-left:6px }\n.tv-root .tv-thinking { margin:6px 0;font-size:13px }\n.tv-root .tv-thinking summary { cursor:pointer;color:var(--tv-text-3);font-style:italic }\n.tv-root .tv-thinking-body { padding:10px 14px;background:rgba(58,58,58,.04);border-radius:4px;color:var(--tv-text-2);white-space:pre-wrap;font-size:13px;line-height:1.7;margin-top:6px }\n/* Tool calls */\n.tv-root .tv-call { margin:6px 0;padding:10px 14px;background:rgba(58,58,58,.03);border-radius:4px;font-size:13px }\n.tv-root .tv-call--err { border-left:2px solid var(--tv-fail) }\n.tv-root .tv-call-h { font-weight:500;color:var(--tv-text);margin-bottom:4px;font-size:14px }\n.tv-root .tv-call details { margin:4px 0;font-size:12px }\n.tv-root .tv-call summary { cursor:pointer;color:var(--tv-text-3);padding:2px 0 }\n.tv-root .tv-pre { font-family:\"SF Mono\",\"JetBrains Mono\",Menlo,Consolas,monospace;font-size:13px;background:rgba(58,58,58,.04);padding:10px 14px;border-radius:4px;overflow:auto;max-height:320px;white-space:pre-wrap;margin:4px 0;color:var(--tv-text-2);line-height:1.55 }\n.tv-root .tv-mock-badge { font-size:12px;color:var(--tv-pass);background:rgba(125,155,118,.12);padding:2px 8px;border-radius:10px;margin-left:8px }\n.tv-root .tv-trace-assert { font-size:13px;font-family:\"SF Mono\",Menlo,monospace;padding:3px 0;margin-top:6px;line-height:1.5 }\n.tv-root .tv-trace-assert.tv-assert--fail { color:var(--tv-fail) }\n.tv-root .tv-trace-assert.tv-assert--pass { color:var(--tv-text-2) }\n/* Final answer */\n.tv-root .tv-final { margin-top:14px }\n.tv-root .tv-final-h { font-size:14px;font-weight:500;color:var(--tv-text);margin-bottom:6px }\n/* Assertions */\n.tv-root .tv-assert { font-size:14px;font-family:\"SF Mono\",Menlo,monospace;padding:5px 0;line-height:1.6 }\n.tv-root .tv-assert--pass { color:var(--tv-text-2) }\n.tv-root .tv-assert--fail { color:var(--tv-fail) }\n.tv-root .tv-assert-value { background:rgba(58,58,58,.04);padding:2px 6px;border-radius:3px;margin:0 2px }\n.tv-root .tv-turn-tag { font-size:12px;color:var(--tv-text-3);margin-left:8px;font-style:italic;font-family:-apple-system,sans-serif }\n.tv-root .tv-turn-tag--ok { color:var(--tv-pass) }\n.tv-root .tv-turn-tag--miss { color:var(--tv-fail) }\n.tv-root .tv-assert-msg { font-size:13px;color:var(--tv-text-3);margin-left:20px;margin-top:3px }\n/* Empty/warn states */\n.tv-root .tv-empty, .tv-root .tv-empty-page { color:var(--tv-text-3);font-style:italic;padding:14px 0;font-size:14px }\n.tv-root .tv-warn { color:var(--tv-warn);background:rgba(176,128,48,.08);padding:14px 18px;border-radius:4px;margin:8px 24px;font-size:14px;line-height:1.7 }\n";
64
+ /** 单测视角配套 JS:variant 切换 + view tab 切换。挂在 layout 末尾。 */
65
+ export declare const TEST_VIEW_JS = "\nfunction omkSwitchVariant(btn) {\n var target = btn.getAttribute('data-target');\n var tabs = btn.parentElement.querySelectorAll('.tv-vtab');\n tabs.forEach(function(t){ t.classList.toggle('tv-vtab--active', t === btn); });\n var panels = btn.parentElement.parentElement.querySelectorAll('.tv-variant-panel');\n panels.forEach(function(p){ p.hidden = (p.getAttribute('data-variant') !== target); });\n}\nfunction omkSwitchView(name) {\n var tabs = document.querySelectorAll('.omk-view-tab');\n tabs.forEach(function(t){ t.classList.toggle('omk-view-tab--active', t.getAttribute('data-view') === name); });\n var panels = document.querySelectorAll('.omk-view-panel');\n panels.forEach(function(p){ p.hidden = (p.getAttribute('data-view') !== name); });\n}\n";
66
+ //# sourceMappingURL=test-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-view.d.ts","sourceRoot":"","sources":["../../../src/renderer/test-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,KAAK,EAAE,SAAS,EAAQ,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOzD,6CAA6C;AAC7C,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAE1D;AAED,6DAA6D;AAC7D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAYvF;AAED,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAInF;AAED;;;;;8CAK8C;AAC9C,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,YAAY,EAAE,EACzB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,CAAC,EAAE,YAAY,CAAA;CAAE,CA4CrD;AAMD,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAGrF;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,SAAS,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAItG;AAwgBD,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,CAgE3E;AAiCD;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,44gBA8KzB,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,YAAY,owBAcxB,CAAC"}