niceeval 0.9.0 → 0.10.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 (428) hide show
  1. package/INDEX.md +31 -33
  2. package/dist/agents/types.d.ts +20 -17
  3. package/dist/context/types.d.ts +21 -21
  4. package/dist/i18n/en.d.ts +10 -2
  5. package/dist/i18n/zh-CN.d.ts +15 -7
  6. package/dist/o11y/execution-tree.d.ts +103 -0
  7. package/dist/o11y/otlp/select.d.ts +22 -0
  8. package/dist/report/{react → assets}/colors.d.ts +8 -0
  9. package/dist/report/{react → assets}/colors.js +23 -0
  10. package/dist/report/built-in/index.d.ts +2 -2
  11. package/dist/report/built-in/index.js +2 -2
  12. package/dist/report/built-in/standard.d.ts +8 -1
  13. package/dist/report/built-in/standard.js +17 -7
  14. package/dist/report/components/attempt-detail/AttemptAssertions.d.ts +6 -0
  15. package/dist/report/components/attempt-detail/AttemptAssertions.js +17 -0
  16. package/dist/report/components/attempt-detail/AttemptConversation.d.ts +6 -0
  17. package/dist/report/components/attempt-detail/AttemptConversation.js +34 -0
  18. package/dist/report/components/attempt-detail/AttemptDiagnostics.d.ts +6 -0
  19. package/dist/report/components/attempt-detail/AttemptDiagnostics.js +7 -0
  20. package/dist/report/components/attempt-detail/AttemptDiff.d.ts +6 -0
  21. package/dist/report/components/attempt-detail/AttemptDiff.js +11 -0
  22. package/dist/report/components/attempt-detail/AttemptError.d.ts +6 -0
  23. package/dist/report/components/attempt-detail/AttemptError.js +16 -0
  24. package/dist/report/components/attempt-detail/AttemptFixPrompt.d.ts +6 -0
  25. package/dist/report/components/attempt-detail/AttemptFixPrompt.js +7 -0
  26. package/dist/report/components/attempt-detail/AttemptSource.d.ts +6 -0
  27. package/dist/report/components/attempt-detail/AttemptSource.js +27 -0
  28. package/dist/report/components/attempt-detail/AttemptSummary.d.ts +8 -0
  29. package/dist/report/components/attempt-detail/AttemptSummary.js +20 -0
  30. package/dist/report/components/attempt-detail/AttemptTimeline.d.ts +6 -0
  31. package/dist/report/components/attempt-detail/AttemptTimeline.js +28 -0
  32. package/dist/report/components/attempt-detail/AttemptTrace.d.ts +6 -0
  33. package/dist/report/components/attempt-detail/AttemptTrace.js +29 -0
  34. package/dist/report/components/attempt-detail/AttemptUsage.d.ts +6 -0
  35. package/dist/report/components/attempt-detail/AttemptUsage.js +20 -0
  36. package/dist/report/components/attempt-detail/compute.d.ts +24 -0
  37. package/dist/report/components/attempt-detail/compute.js +254 -0
  38. package/dist/report/components/attempt-detail/faces.d.ts +14 -0
  39. package/dist/report/components/attempt-detail/faces.js +235 -0
  40. package/dist/report/components/attempt-detail/index.d.ts +38 -0
  41. package/dist/report/components/attempt-detail/index.js +527 -0
  42. package/dist/report/{react → components}/cell.d.ts +5 -3
  43. package/dist/report/{react → components}/cell.js +3 -3
  44. package/dist/report/{react → components/entity-lists}/AttemptList.d.ts +8 -4
  45. package/dist/report/{react → components/entity-lists}/AttemptList.js +16 -10
  46. package/dist/report/{react → components/entity-lists}/EvalList.d.ts +3 -3
  47. package/dist/report/{react → components/entity-lists}/EvalList.js +0 -0
  48. package/dist/report/{react → components/entity-lists}/ExperimentList.d.ts +3 -3
  49. package/dist/report/{react → components/entity-lists}/ExperimentList.js +10 -10
  50. package/dist/report/components/entity-lists/compute.d.ts +23 -0
  51. package/dist/report/components/entity-lists/compute.js +171 -0
  52. package/dist/report/components/entity-lists/faces.d.ts +5 -0
  53. package/dist/report/components/entity-lists/faces.js +174 -0
  54. package/dist/report/components/entity-lists/index.d.ts +51 -0
  55. package/dist/report/components/entity-lists/index.js +165 -0
  56. package/dist/report/{react → components}/fixtures.d.ts +2 -2
  57. package/dist/report/{react → components}/fixtures.js +1 -1
  58. package/dist/report/{react → components/metric-views}/DeltaTable.d.ts +2 -2
  59. package/dist/report/{react → components/metric-views}/DeltaTable.js +4 -4
  60. package/dist/report/{react → components/metric-views}/MetricBars.d.ts +3 -3
  61. package/dist/report/{react → components/metric-views}/MetricBars.js +3 -3
  62. package/dist/report/{react → components/metric-views}/MetricLine.d.ts +2 -2
  63. package/dist/report/{react → components/metric-views}/MetricLine.js +8 -5
  64. package/dist/report/{react → components/metric-views}/MetricMatrix.d.ts +3 -3
  65. package/dist/report/{react → components/metric-views}/MetricMatrix.js +4 -4
  66. package/dist/report/components/metric-views/MetricScatter.d.ts +11 -0
  67. package/dist/report/{react → components/metric-views}/MetricScatter.js +26 -23
  68. package/dist/report/{react → components/metric-views}/MetricTable.d.ts +3 -3
  69. package/dist/report/{react → components/metric-views}/MetricTable.js +4 -4
  70. package/dist/report/{react → components/metric-views}/Scoreboard.d.ts +2 -2
  71. package/dist/report/{react → components/metric-views}/Scoreboard.js +3 -3
  72. package/dist/report/components/metric-views/compute.d.ts +89 -0
  73. package/dist/report/{compute.js → components/metric-views/compute.js} +32 -415
  74. package/dist/report/components/metric-views/faces.d.ts +13 -0
  75. package/dist/report/components/metric-views/faces.js +381 -0
  76. package/dist/report/components/metric-views/index.d.ts +50 -0
  77. package/dist/report/components/metric-views/index.js +273 -0
  78. package/dist/report/{text → components/metric-views}/plot.js +1 -1
  79. package/dist/report/components/shared-compute.d.ts +22 -0
  80. package/dist/report/components/shared-compute.js +47 -0
  81. package/dist/report/components/shared-faces.d.ts +9 -0
  82. package/dist/report/components/shared-faces.js +26 -0
  83. package/dist/report/components/shared.d.ts +68 -0
  84. package/dist/report/components/shared.js +125 -0
  85. package/dist/report/{react → components/site-components}/CopyFixPrompt.d.ts +2 -2
  86. package/dist/report/{react → components/site-components}/CopyFixPrompt.js +2 -2
  87. package/dist/report/{react → components/site-components}/HeroCard.d.ts +2 -2
  88. package/dist/report/{react → components/site-components}/HeroCard.js +2 -2
  89. package/dist/report/{react → components/site-components}/ScopeWarnings.d.ts +2 -2
  90. package/dist/report/{react → components/site-components}/ScopeWarnings.js +3 -3
  91. package/dist/report/{react → components/site-components}/TraceWaterfall.d.ts +3 -3
  92. package/dist/report/{react → components/site-components}/TraceWaterfall.js +5 -5
  93. package/dist/report/components/site-components/compute.d.ts +28 -0
  94. package/dist/report/components/site-components/compute.js +132 -0
  95. package/dist/report/components/site-components/faces.d.ts +21 -0
  96. package/dist/report/components/site-components/faces.js +75 -0
  97. package/dist/report/components/site-components/index.d.ts +74 -0
  98. package/dist/report/components/site-components/index.js +220 -0
  99. package/dist/report/{scope-warnings.d.ts → components/site-components/scope-warnings.d.ts} +2 -2
  100. package/dist/report/{scope-warnings.js → components/site-components/scope-warnings.js} +2 -2
  101. package/dist/report/{react → components/summaries}/ScopeSummary.d.ts +2 -2
  102. package/dist/report/{react → components/summaries}/ScopeSummary.js +17 -8
  103. package/dist/report/components/summaries/compute.d.ts +7 -0
  104. package/dist/report/components/summaries/compute.js +51 -0
  105. package/dist/report/components/summaries/faces.d.ts +7 -0
  106. package/dist/report/components/summaries/faces.js +38 -0
  107. package/dist/report/components/summaries/index.d.ts +27 -0
  108. package/dist/report/components/summaries/index.js +78 -0
  109. package/dist/report/definition/grid-layout.d.ts +50 -0
  110. package/dist/report/definition/grid-layout.js +89 -0
  111. package/dist/report/{primitives.d.ts → definition/primitives.d.ts} +34 -4
  112. package/dist/report/{primitives.js → definition/primitives.js} +101 -10
  113. package/dist/report/{report.d.ts → definition/report.d.ts} +36 -65
  114. package/dist/report/{report.js → definition/report.js} +58 -90
  115. package/dist/report/{text/table.d.ts → definition/table-text.d.ts} +2 -2
  116. package/dist/report/{text/table.js → definition/table-text.js} +2 -2
  117. package/dist/report/{tree.d.ts → definition/tree.d.ts} +44 -12
  118. package/dist/report/{tree.js → definition/tree.js} +10 -12
  119. package/dist/report/index.d.ts +33 -18
  120. package/dist/report/index.js +23 -14
  121. package/dist/report/{aggregate.d.ts → model/aggregate.d.ts} +12 -4
  122. package/dist/report/{aggregate.js → model/aggregate.js} +28 -8
  123. package/dist/report/{flag.d.ts → model/flag.d.ts} +14 -1
  124. package/dist/report/{flag.js → model/flag.js} +35 -0
  125. package/dist/report/{format.d.ts → model/format.d.ts} +11 -5
  126. package/dist/report/{format.js → model/format.js} +48 -4
  127. package/dist/report/{locale.d.ts → model/locale.d.ts} +17 -17
  128. package/dist/report/{locale.js → model/locale.js} +31 -33
  129. package/dist/report/{metrics.d.ts → model/metrics.d.ts} +2 -2
  130. package/dist/report/{metrics.js → model/metrics.js} +2 -2
  131. package/dist/report/{types.d.ts → model/types.d.ts} +140 -20
  132. package/dist/report/react/index.d.ts +32 -21
  133. package/dist/report/react/index.js +33 -21
  134. package/dist/report/{load.d.ts → runtime/load.d.ts} +1 -1
  135. package/dist/report/{load.js → runtime/load.js} +1 -1
  136. package/dist/report/runtime/text.d.ts +67 -0
  137. package/dist/report/runtime/text.js +114 -0
  138. package/dist/report/runtime/web.d.ts +35 -0
  139. package/dist/report/runtime/web.js +70 -0
  140. package/dist/results/annotated-source.d.ts +87 -0
  141. package/dist/results/attempt-evidence.d.ts +74 -0
  142. package/dist/results/attempt-source.d.ts +15 -0
  143. package/dist/results/select.d.ts +12 -2
  144. package/dist/results/select.js +27 -5
  145. package/dist/runner/eval-selection.d.ts +26 -0
  146. package/dist/runner/feedback/sink.d.ts +26 -1
  147. package/dist/runner/types.d.ts +149 -23
  148. package/dist/sandbox/docker.d.ts +6 -0
  149. package/dist/sandbox/types.d.ts +23 -21
  150. package/dist/scoring/display.d.ts +7 -2
  151. package/dist/scoring/display.js +42 -4
  152. package/dist/scoring/types.d.ts +3 -3
  153. package/dist/shared/aggregate.d.ts +15 -1
  154. package/dist/shared/aggregate.js +32 -1
  155. package/dist/shared/types.d.ts +6 -1
  156. package/docs-site/images/logo-dark.svg +7 -0
  157. package/docs-site/images/logo.svg +6 -5
  158. package/docs-site/zh/README.md +8 -7
  159. package/docs-site/zh/examples/ai-agent-application.mdx +5 -5
  160. package/docs-site/zh/examples/coding-agent-extensions.mdx +4 -4
  161. package/docs-site/zh/examples/index.mdx +3 -3
  162. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +1 -1
  163. package/docs-site/zh/examples/integrations/claude-sdk.mdx +3 -3
  164. package/docs-site/zh/examples/integrations/codex-sdk.mdx +3 -3
  165. package/docs-site/zh/examples/integrations/langgraph.mdx +3 -3
  166. package/docs-site/zh/examples/integrations/pi-sdk.mdx +2 -2
  167. package/docs-site/zh/explanation/adapter.mdx +19 -19
  168. package/docs-site/zh/explanation/assert.mdx +9 -9
  169. package/docs-site/zh/explanation/drive.mdx +4 -4
  170. package/docs-site/zh/explanation/evals.mdx +8 -8
  171. package/docs-site/zh/explanation/experiment.mdx +8 -8
  172. package/docs-site/zh/explanation/hitl.mdx +13 -13
  173. package/docs-site/zh/explanation/judge.mdx +3 -3
  174. package/docs-site/zh/explanation/overview.mdx +7 -7
  175. package/docs-site/zh/explanation/runner.mdx +11 -11
  176. package/docs-site/zh/explanation/tier.mdx +6 -6
  177. package/docs-site/zh/index.mdx +14 -14
  178. package/docs-site/zh/introduction.mdx +13 -16
  179. package/docs-site/zh/reference/builtin-agents.mdx +61 -28
  180. package/docs-site/zh/reference/capabilities.mdx +7 -27
  181. package/docs-site/zh/reference/cli.mdx +35 -32
  182. package/docs-site/zh/reference/define-agent.mdx +32 -31
  183. package/docs-site/zh/reference/define-config.mdx +6 -6
  184. package/docs-site/zh/reference/define-eval.mdx +33 -20
  185. package/docs-site/zh/reference/events.mdx +4 -4
  186. package/docs-site/zh/reference/expect.mdx +3 -3
  187. package/docs-site/zh/reference/official-adapters.mdx +17 -17
  188. package/docs-site/zh/reference/report-components.mdx +193 -121
  189. package/docs-site/zh/reference/results-data.mdx +13 -13
  190. package/docs-site/zh/troubleshooting/debug-sandbox.mdx +11 -11
  191. package/docs-site/zh/troubleshooting/debugging.mdx +43 -19
  192. package/docs-site/zh/{how-to → tutorials}/agent-feedback-loop.mdx +38 -38
  193. package/docs-site/zh/tutorials/agent-onboarding.mdx +100 -0
  194. package/docs-site/zh/tutorials/authoring.mdx +211 -0
  195. package/docs-site/zh/{how-to → tutorials}/ci-integration.mdx +8 -8
  196. package/docs-site/zh/{how-to → tutorials}/connect-otel.mdx +22 -22
  197. package/docs-site/zh/{how-to → tutorials}/connect-your-agent.mdx +58 -63
  198. package/docs-site/zh/tutorials/custom-reports.mdx +453 -0
  199. package/docs-site/zh/{how-to → tutorials}/dataset-fanout.mdx +4 -4
  200. package/docs-site/zh/tutorials/experiments.mdx +103 -0
  201. package/docs-site/zh/{how-to → tutorials}/fixtures.mdx +9 -9
  202. package/docs-site/zh/{how-to → tutorials}/publish-report.mdx +11 -5
  203. package/docs-site/zh/tutorials/quickstart.mdx +18 -18
  204. package/docs-site/zh/{how-to → tutorials}/reporters.mdx +6 -6
  205. package/docs-site/zh/{how-to → tutorials}/sandbox-agent.mdx +6 -6
  206. package/docs-site/zh/{how-to → tutorials}/sandbox-providers.mdx +41 -19
  207. package/docs-site/zh/{how-to → tutorials}/scoring-guide.mdx +4 -4
  208. package/docs-site/zh/{how-to → tutorials}/viewing-results.mdx +59 -50
  209. package/docs-site/zh/tutorials/write-experiment.mdx +355 -0
  210. package/docs-site/zh/{how-to → tutorials}/write-send.mdx +40 -40
  211. package/package.json +8 -4
  212. package/src/agents/bub.ts +21 -8
  213. package/src/agents/claude-code.ts +23 -10
  214. package/src/agents/codex.test.ts +22 -7
  215. package/src/agents/codex.ts +22 -9
  216. package/src/agents/index.ts +2 -2
  217. package/src/agents/openai-compat.ts +1 -1
  218. package/src/agents/post-setup.ts +45 -22
  219. package/src/agents/streaming.ts +1 -1
  220. package/src/agents/types.ts +20 -17
  221. package/src/agents/ui-message-stream.test.ts +10 -0
  222. package/src/agents/ui-message-stream.ts +12 -1
  223. package/src/cli.ts +77 -64
  224. package/src/context/types.ts +21 -21
  225. package/src/define.ts +13 -0
  226. package/src/i18n/en.ts +30 -15
  227. package/src/i18n/zh-CN.ts +30 -15
  228. package/src/index.ts +2 -0
  229. package/src/report/{react → assets}/colors.ts +22 -0
  230. package/src/report/{react → assets}/enhance.js +1 -33
  231. package/src/report/{react → assets}/styles.css +136 -112
  232. package/src/report/built-in/index.tsx +2 -2
  233. package/src/report/built-in/standard.tsx +18 -6
  234. package/src/report/components/attempt-detail/AttemptAssertions.tsx +67 -0
  235. package/src/report/components/attempt-detail/AttemptConversation.tsx +110 -0
  236. package/src/report/components/attempt-detail/AttemptDiagnostics.tsx +38 -0
  237. package/src/report/components/attempt-detail/AttemptDiff.tsx +35 -0
  238. package/src/report/components/attempt-detail/AttemptError.tsx +31 -0
  239. package/src/report/components/attempt-detail/AttemptFixPrompt.tsx +26 -0
  240. package/src/report/components/attempt-detail/AttemptSource.tsx +80 -0
  241. package/src/report/components/attempt-detail/AttemptSummary.tsx +74 -0
  242. package/src/report/components/attempt-detail/AttemptTimeline.tsx +108 -0
  243. package/src/report/components/attempt-detail/AttemptTrace.tsx +63 -0
  244. package/src/report/components/attempt-detail/AttemptUsage.tsx +29 -0
  245. package/src/report/components/attempt-detail/attempt-components.test.tsx +680 -0
  246. package/src/report/components/attempt-detail/compute.ts +287 -0
  247. package/src/report/components/attempt-detail/faces.ts +257 -0
  248. package/src/report/components/attempt-detail/index.tsx +583 -0
  249. package/src/report/components/attempt-detail/validate.test.ts +235 -0
  250. package/src/report/{react → components}/cell.tsx +6 -3
  251. package/src/report/{report.test.ts → components/compute.test.ts} +316 -46
  252. package/src/report/{react → components/entity-lists}/AttemptList.tsx +24 -16
  253. package/src/report/{react → components/entity-lists}/EvalList.tsx +0 -0
  254. package/src/report/{react → components/entity-lists}/ExperimentList.tsx +23 -20
  255. package/src/report/components/entity-lists/compute.ts +196 -0
  256. package/src/report/components/entity-lists/faces.ts +207 -0
  257. package/src/report/components/entity-lists/index.tsx +241 -0
  258. package/src/report/components/entity-lists/validate.test.ts +114 -0
  259. package/src/report/{react → components}/fixtures.ts +2 -2
  260. package/src/report/{react → components/metric-views}/DeltaTable.tsx +5 -5
  261. package/src/report/{react → components/metric-views}/MetricBars.tsx +5 -5
  262. package/src/report/{react → components/metric-views}/MetricLine.tsx +9 -6
  263. package/src/report/{react → components/metric-views}/MetricMatrix.tsx +6 -6
  264. package/src/report/{react → components/metric-views}/MetricScatter.tsx +41 -33
  265. package/src/report/{react → components/metric-views}/MetricTable.tsx +6 -6
  266. package/src/report/{react → components/metric-views}/Scoreboard.tsx +4 -4
  267. package/src/report/{compute.ts → components/metric-views/compute.ts} +51 -477
  268. package/src/report/components/metric-views/faces.ts +423 -0
  269. package/src/report/components/metric-views/index.tsx +352 -0
  270. package/src/report/{text → components/metric-views}/plot.ts +1 -1
  271. package/src/report/components/metric-views/validate.test.ts +211 -0
  272. package/src/report/{react → components}/render.test.tsx +47 -17
  273. package/src/report/components/shared-compute.ts +59 -0
  274. package/src/report/components/shared-faces.ts +30 -0
  275. package/src/report/components/shared.ts +192 -0
  276. package/src/report/{react → components/site-components}/CopyFixPrompt.tsx +3 -3
  277. package/src/report/{react → components/site-components}/HeroCard.tsx +3 -3
  278. package/src/report/{react → components/site-components}/ScopeWarnings.tsx +4 -4
  279. package/src/report/{react → components/site-components}/TraceWaterfall.tsx +13 -10
  280. package/src/report/components/site-components/compute.ts +144 -0
  281. package/src/report/components/site-components/faces.ts +80 -0
  282. package/src/report/components/site-components/index.tsx +265 -0
  283. package/src/report/{scope-warnings.ts → components/site-components/scope-warnings.ts} +3 -3
  284. package/src/report/{site-components.test.tsx → components/site-components/site-components.test.tsx} +23 -21
  285. package/src/report/components/site-components/validate.test.ts +89 -0
  286. package/src/report/{react → components/summaries}/ScopeSummary.tsx +26 -11
  287. package/src/report/components/summaries/compute.ts +56 -0
  288. package/src/report/components/summaries/faces.ts +48 -0
  289. package/src/report/components/summaries/index.tsx +127 -0
  290. package/src/report/components/summaries/validate.test.ts +49 -0
  291. package/src/report/definition/grid-layout.test.ts +124 -0
  292. package/src/report/definition/grid-layout.ts +146 -0
  293. package/src/report/{primitives.tsx → definition/primitives.tsx} +168 -18
  294. package/src/report/{report.ts → definition/report.ts} +98 -165
  295. package/src/report/{shell-head.test.ts → definition/shell-head.test.ts} +2 -2
  296. package/src/report/{text/table.ts → definition/table-text.ts} +4 -4
  297. package/src/report/{tree.ts → definition/tree.ts} +58 -22
  298. package/src/report/index.ts +126 -66
  299. package/src/report/{aggregate.ts → model/aggregate.ts} +31 -9
  300. package/src/report/{flag.ts → model/flag.ts} +39 -1
  301. package/src/report/{format.ts → model/format.ts} +59 -5
  302. package/src/report/{locale.ts → model/locale.ts} +34 -36
  303. package/src/report/{metrics.ts → model/metrics.ts} +3 -3
  304. package/src/report/{types.ts → model/types.ts} +143 -22
  305. package/src/report/react/index.tsx +52 -26
  306. package/src/report/{dual-render.test.tsx → runtime/dual-render.test.tsx} +564 -49
  307. package/src/report/runtime/host.test.ts +44 -0
  308. package/src/report/runtime/host.ts +138 -0
  309. package/src/report/{load.ts → runtime/load.ts} +1 -1
  310. package/src/report/runtime/text.ts +192 -0
  311. package/src/report/runtime/web.ts +106 -0
  312. package/src/results/attempt-evidence.ts +5 -1
  313. package/src/results/host-equivalence.test.ts +54 -3
  314. package/src/results/select.ts +30 -6
  315. package/src/runner/attempt.test.ts +48 -1
  316. package/src/runner/attempt.ts +62 -42
  317. package/src/runner/cleanup-timeout.test.ts +16 -0
  318. package/src/runner/cleanup-timeout.ts +23 -0
  319. package/src/runner/discover.ts +1 -2
  320. package/src/runner/eval-selection.test.ts +187 -0
  321. package/src/runner/eval-selection.ts +109 -0
  322. package/src/runner/experiment-cleanup-registry.test.ts +89 -0
  323. package/src/runner/experiment-cleanup-registry.ts +39 -0
  324. package/src/runner/experiment-labels.test.ts +71 -0
  325. package/src/runner/feedback/agent.test.ts +33 -1
  326. package/src/runner/feedback/agent.ts +12 -16
  327. package/src/runner/feedback/ci.test.ts +35 -1
  328. package/src/runner/feedback/ci.ts +16 -18
  329. package/src/runner/feedback/coordinator.ts +28 -0
  330. package/src/runner/feedback/human.test.ts +108 -1
  331. package/src/runner/feedback/human.ts +71 -21
  332. package/src/runner/feedback/reducer.test.ts +64 -0
  333. package/src/runner/feedback/reducer.ts +26 -0
  334. package/src/runner/feedback/sink.ts +40 -1
  335. package/src/runner/fingerprint.ts +2 -1
  336. package/src/runner/report.test.ts +14 -0
  337. package/src/runner/report.ts +3 -1
  338. package/src/runner/run.test.ts +390 -12
  339. package/src/runner/run.ts +259 -26
  340. package/src/runner/sandbox-selection.test.ts +13 -3
  341. package/src/runner/sandbox-selection.ts +4 -2
  342. package/src/runner/types.ts +158 -23
  343. package/src/sandbox/docker.ts +7 -0
  344. package/src/sandbox/e2b.ts +12 -13
  345. package/src/sandbox/types.ts +23 -21
  346. package/src/scoring/display.test.ts +28 -2
  347. package/src/scoring/display.ts +38 -5
  348. package/src/scoring/types.ts +3 -3
  349. package/src/shared/aggregate.test.ts +52 -0
  350. package/src/shared/aggregate.ts +30 -1
  351. package/src/shared/types.ts +6 -1
  352. package/src/show/command.test.ts +34 -0
  353. package/src/show/command.ts +16 -0
  354. package/src/show/compose.ts +1 -1
  355. package/src/show/index.ts +58 -22
  356. package/src/show/render.ts +16 -240
  357. package/src/show/show.test.ts +128 -35
  358. package/src/view/app/App.test.tsx +8 -7
  359. package/src/view/app/App.tsx +135 -51
  360. package/src/view/app/i18n.ts +7 -147
  361. package/src/view/app/lib/attempt-dialog.test.ts +65 -0
  362. package/src/view/app/lib/attempt-dialog.ts +69 -0
  363. package/src/view/app/main.tsx +0 -1
  364. package/src/view/app/types.ts +3 -86
  365. package/src/view/artifact-serving.test.ts +22 -38
  366. package/src/view/client-dist/app.css +1 -1
  367. package/src/view/client-dist/app.js +15 -22
  368. package/src/view/data.test.ts +48 -36
  369. package/src/view/data.ts +122 -89
  370. package/src/view/index.ts +3 -13
  371. package/src/view/server.ts +36 -6
  372. package/src/view/shared/types.ts +6 -31
  373. package/src/view/site-parity.test.ts +24 -1
  374. package/src/view/site.ts +144 -17
  375. package/src/view/styles.css +18 -806
  376. package/src/view/view-report.test.ts +182 -34
  377. package/dist/report/components.d.ts +0 -179
  378. package/dist/report/components.js +0 -544
  379. package/dist/report/compute.d.ts +0 -139
  380. package/dist/report/react/ExperimentComparison.d.ts +0 -10
  381. package/dist/report/react/ExperimentComparison.js +0 -12
  382. package/dist/report/react/MetricScatter.d.ts +0 -9
  383. package/dist/report/react/format.d.ts +0 -3
  384. package/dist/report/react/format.js +0 -7
  385. package/dist/report/text/faces.d.ts +0 -45
  386. package/dist/report/text/faces.js +0 -671
  387. package/dist/report/web.d.ts +0 -32
  388. package/dist/report/web.js +0 -48
  389. package/docs-site/zh/how-to/authoring.mdx +0 -162
  390. package/docs-site/zh/how-to/custom-reports.mdx +0 -414
  391. package/docs-site/zh/how-to/experiments.mdx +0 -86
  392. package/docs-site/zh/how-to/write-experiment.mdx +0 -164
  393. package/src/report/components.tsx +0 -925
  394. package/src/report/react/ExperimentComparison.tsx +0 -73
  395. package/src/report/react/format.ts +0 -9
  396. package/src/report/text/faces.ts +0 -767
  397. package/src/report/web.ts +0 -77
  398. package/src/show/report-host.test.ts +0 -205
  399. package/src/show/report-host.ts +0 -389
  400. package/src/view/app/components/AttemptModal.tsx +0 -496
  401. package/src/view/app/components/CodeView.test.tsx +0 -142
  402. package/src/view/app/components/CodeView.tsx +0 -310
  403. package/src/view/app/components/CopyControls.tsx +0 -106
  404. package/src/view/app/components/Trace.tsx +0 -100
  405. package/src/view/app/components/Transcript.tsx +0 -157
  406. package/src/view/app/components/ui/badge.tsx +0 -21
  407. package/src/view/app/lib/artifact-url.ts +0 -17
  408. package/src/view/app/lib/attempt-route.test.ts +0 -80
  409. package/src/view/app/lib/attempt-route.ts +0 -52
  410. package/src/view/app/lib/format.ts +0 -70
  411. package/src/view/app/lib/guards.test.ts +0 -108
  412. package/src/view/app/lib/guards.ts +0 -71
  413. package/src/view/app/lib/rows.ts +0 -22
  414. package/src/view/app/lib/transcript-data.tsx +0 -151
  415. package/src/view/app/lib/verdict.ts +0 -23
  416. package/src/view/app/shared.ts +0 -8
  417. /package/dist/report/{react → components/metric-views}/chart-math.d.ts +0 -0
  418. /package/dist/report/{react → components/metric-views}/chart-math.js +0 -0
  419. /package/dist/report/{text → components/metric-views}/plot.d.ts +0 -0
  420. /package/dist/report/{react → components/site-components}/PoweredBy.d.ts +0 -0
  421. /package/dist/report/{react → components/site-components}/PoweredBy.js +0 -0
  422. /package/dist/report/{text/layout.d.ts → model/text-layout.d.ts} +0 -0
  423. /package/dist/report/{text/layout.js → model/text-layout.js} +0 -0
  424. /package/dist/report/{types.js → model/types.js} +0 -0
  425. /package/src/report/{react → components/metric-views}/chart-math.test.ts +0 -0
  426. /package/src/report/{react → components/metric-views}/chart-math.ts +0 -0
  427. /package/src/report/{react → components/site-components}/PoweredBy.tsx +0 -0
  428. /package/src/report/{text/layout.ts → model/text-layout.ts} +0 -0
@@ -34,13 +34,6 @@
34
34
  /* send/回复行的强调色,对齐 landing page setup-card 的 --blue(#6ea8fe)。 */
35
35
  --blue: light-dark(#1d63d8, #6ea8fe);
36
36
  --focus: light-dark(#111113, #ededed);
37
- /* 分类色板(cost/score 散点图按实验区分系列),六色顺序按 CVD 校验过,不要重排。 */
38
- --series-1: light-dark(#2a78d6, #3987e5);
39
- --series-2: light-dark(#1baf7a, #199e70);
40
- --series-3: light-dark(#eda100, #c98500);
41
- --series-4: light-dark(#008300, #008300);
42
- --series-5: light-dark(#e34948, #e66767);
43
- --series-6: light-dark(#eb6834, #d95926);
44
37
  font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", sans-serif;
45
38
  }
46
39
 
@@ -73,7 +66,24 @@ a { color: inherit; }
73
66
  z-index: 10;
74
67
  backdrop-filter: blur(10px);
75
68
  }
76
- /* 页头无品牌位:品牌是页内组件(PoweredBy / Hero 的品牌行,nre-powered-by),宿主不渲染。 */
69
+ /* 页头左端的恒定品牌位:NiceEval 字标 + 45° 方块 mark,外链官网(App.tsx .brand)
70
+ 与 hero 下 nre-powered-by 品牌行同族,由宿主渲染、报告定义不能覆盖或移除。 */
71
+ .brand {
72
+ display: flex;
73
+ align-items: baseline;
74
+ gap: 12px;
75
+ font-weight: 690;
76
+ font-size: 20px;
77
+ flex: 0 0 auto;
78
+ text-decoration: none;
79
+ }
80
+ .mark {
81
+ width: 18px;
82
+ height: 18px;
83
+ border: 1.25px solid var(--text);
84
+ transform: rotate(45deg);
85
+ display: inline-block;
86
+ }
77
87
  /* 顶部导航 .nav / .nav-tab → components/ui/tabs.tsx(Radix Tabs + Tailwind utilities)。 */
78
88
  .lang-switch {
79
89
  display: inline-flex;
@@ -114,810 +124,12 @@ main {
114
124
  .report-slot {
115
125
  margin: 0 auto 36px;
116
126
  }
117
- .name { font-weight: 610; }
118
- .num {
119
- font-variant-numeric: tabular-nums;
120
- white-space: nowrap;
121
- font-feature-settings: "tnum";
122
- }
123
- .good { color: var(--good); }
124
- .bad { color: var(--bad); }
125
- .warn { color: var(--warn); }
126
- .infra-err { color: var(--warn); }
127
- .copy-all-errors {
128
- height: 36px;
129
- display: inline-flex;
130
- align-items: center;
131
- gap: 6px;
132
- padding: 0 12px;
133
- border: 1px solid var(--line);
134
- border-radius: 7px;
135
- background: var(--panel);
136
- color: var(--muted);
137
- font-family: inherit;
138
- font-size: 13px;
139
- cursor: pointer;
140
- white-space: nowrap;
141
- flex-shrink: 0;
142
- transition: color 0.12s, border-color 0.12s, background 0.12s;
143
- }
144
- .copy-all-errors svg {
145
- width: 14px;
146
- height: 14px;
147
- fill: none;
148
- stroke: currentColor;
149
- stroke-width: 2;
150
- stroke-linecap: round;
151
- stroke-linejoin: round;
152
- }
153
- .copy-all-errors:hover {
154
- color: var(--text);
155
- border-color: var(--line-strong);
156
- }
157
- .copy-all-errors.is-copied {
158
- color: var(--good);
159
- border-color: color-mix(in oklch, var(--good), var(--line) 40%);
160
- background: color-mix(in oklch, var(--good), transparent 88%);
161
- }
162
- .raw-details {
163
- margin-top: 16px;
164
- border-top: 1px solid color-mix(in oklch, var(--line), transparent 15%);
165
- padding-top: 14px;
166
- color: color-mix(in oklch, var(--muted), var(--text) 6%);
167
- }
168
- .raw-details summary {
169
- cursor: pointer;
170
- color: var(--muted);
171
- font-size: 13px;
172
- font-weight: 560;
173
- user-select: none;
174
- }
175
- .raw-details pre { margin-top: 12px; }
176
- .raw-note {
177
- margin-left: 8px;
178
- color: var(--soft);
179
- font-weight: 400;
180
- }
181
- .reason-empty { color: var(--soft); }
182
- .ran-at { display: block; margin-top: 2px; color: var(--soft); font-size: 11px; font-variant-numeric: tabular-nums; }
183
-
184
- .attempt-status {
185
- display: flex;
186
- align-items: center;
187
- gap: 4px;
188
- min-width: 0;
189
- }
190
-
191
-
192
- .eval-item-clickable {
193
- cursor: pointer;
194
- user-select: none;
195
- }
196
- .eval-item-clickable:hover {
197
- background: color-mix(in oklch, var(--panel-2), var(--panel) 30%);
198
- }
199
- /* eval 折叠行:Run 列的 通过/总 轮次比 */
200
- .run-ratio { color: var(--soft); }
201
- /* 展开后的各轮 attempt:左侧加描边 + 轻微缩进,标识它们从属于上面的 eval 行 */
202
- .eval-attempts {
203
- display: grid;
204
- margin-left: 8px;
205
- border-left: 2px solid color-mix(in oklch, var(--accent, var(--line)), transparent 55%);
206
- background: color-mix(in oklch, var(--panel-2), transparent 55%);
207
- }
208
- .eval-attempts .eval-item {
209
- padding-left: 12px;
210
- }
211
- .eval-attempts .eval-item:last-child {
212
- border-bottom: none;
213
- }
214
- /* Modal */
215
- /* modal chrome(backdrop / panel / header / title / close / body / verdict chip)→
216
- 迁到 components/ui/dialog.tsx + components/ui/badge.tsx + AttemptModal 的 Tailwind utilities。 */
217
-
218
- /* No-source modal body: same visual language as the code view (checks + transcript). */
219
- .nosource { display: flex; flex-direction: column; gap: 14px; }
220
- .nosource-note {
221
- font-size: 12.5px;
222
- line-height: 1.55;
223
- color: var(--muted);
224
- padding: 9px 12px;
225
- border: 1px dashed color-mix(in oklch, var(--line-strong), transparent 25%);
226
- border-radius: 8px;
227
- background: color-mix(in oklch, var(--panel), var(--line) 20%);
228
- }
229
- .nosource-block {
230
- border: 1px solid var(--line);
231
- border-radius: 10px;
232
- overflow: hidden;
233
- background: var(--panel-2);
234
- }
235
- .nosource-head {
236
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
237
- font-size: 11px;
238
- color: var(--muted);
239
- padding: 7px 12px;
240
- background: color-mix(in oklch, var(--panel-2), var(--line) 35%);
241
- border-bottom: 1px solid var(--line);
242
- }
243
- .nosource-block > .assert-detail,
244
- .nosource-block > .transcript { padding: 10px 14px; }
245
- .conv-loading { color: var(--soft); font-size: 12px; padding: 8px 0; }
246
- .trace-details {
247
- border-bottom: 1px solid color-mix(in oklch, var(--line), transparent 35%);
248
- padding: 4px 0 10px;
249
- }
250
- .trace-details summary {
251
- cursor: pointer;
252
- color: var(--muted);
253
- font-size: 12px;
254
- user-select: none;
255
- padding: 4px 0;
256
- }
257
- .trace-details summary:hover { color: var(--text); }
258
- .trace {
259
- margin: 8px 0 4px;
260
- padding: 10px 12px;
261
- border: 1px solid color-mix(in oklch, var(--line), transparent 20%);
262
- border-radius: 7px;
263
- background: color-mix(in oklch, var(--panel), black 6%);
264
- }
265
- .trace-span-meta {
266
- color: var(--soft);
267
- font-size: 11px;
268
- text-transform: uppercase;
269
- letter-spacing: 0.06em;
270
- margin-bottom: 8px;
271
- }
272
- .span-d { border-radius: 4px; }
273
- .span-d > .trace-row { cursor: default; }
274
- details.span-d > summary.trace-row { cursor: pointer; list-style: none; }
275
- details.span-d > summary.trace-row::-webkit-details-marker { display: none; }
276
- details.span-d[open] > summary.trace-row { background: color-mix(in oklch, var(--panel-2), var(--panel) 10%); }
277
- details.span-d > summary.trace-row:hover { background: color-mix(in oklch, var(--panel-2), var(--panel) 20%); }
278
- .trace-row {
279
- display: grid;
280
- grid-template-columns: minmax(140px, 0.9fr) minmax(0, 2fr) 56px;
281
- column-gap: 12px;
282
- align-items: center;
283
- height: 22px;
284
- font-size: 12px;
285
- }
286
- .span-attrs {
287
- padding: 6px 8px 10px 16px;
288
- margin: 2px 0 6px;
289
- border-left: 2px solid color-mix(in oklch, var(--line-strong), transparent 30%);
290
- font-size: 12px;
291
- }
292
- .attr-row { display: grid; grid-template-columns: minmax(120px, 220px) 1fr; column-gap: 12px; padding: 2px 0; }
293
- .attr-k { color: var(--soft); overflow-wrap: anywhere; }
294
- .attr-v { color: var(--text); overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }
295
- .attr-io { margin: 4px 0; }
296
- .attr-io .attr-k { display: block; margin-bottom: 3px; text-transform: uppercase; letter-spacing: 0.05em; font-size: 11px; }
297
- .attr-pre {
298
- margin: 0;
299
- padding: 8px 10px;
300
- max-height: 220px;
301
- overflow: auto;
302
- border: 1px solid var(--line);
303
- border-radius: 6px;
304
- background: color-mix(in oklch, var(--panel), black 8%);
305
- color: var(--muted);
306
- font-size: 11px;
307
- line-height: 1.45;
308
- white-space: pre-wrap;
309
- overflow-wrap: anywhere;
310
- }
311
- .trace-label {
312
- overflow: hidden;
313
- text-overflow: ellipsis;
314
- white-space: nowrap;
315
- color: color-mix(in oklch, var(--muted), var(--text) 12%);
316
- }
317
- .trace-track {
318
- position: relative;
319
- height: 12px;
320
- border-radius: 3px;
321
- background: color-mix(in oklch, var(--panel-2), var(--panel) 20%);
322
- }
323
- .trace-bar {
324
- position: absolute;
325
- top: 0;
326
- height: 12px;
327
- min-width: 2px;
328
- border-radius: 3px;
329
- background: var(--good);
330
- }
331
- .trace-bar.bad { background: var(--bad); }
332
- /* canonical SpanKind 配色:跨 agent 同义同色(model/tool/agent/turn);raw 名不参与着色。 */
333
- .trace-bar.k-model { background: oklch(0.72 0.13 250); } /* 模型调用 — 蓝 */
334
- .trace-bar.k-tool { background: oklch(0.74 0.14 150); } /* 工具执行 — 绿 */
335
- .trace-bar.k-agent { background: oklch(0.74 0.15 300); } /* 子 agent — 紫 */
336
- .trace-bar.k-turn { background: oklch(0.78 0.13 90); } /* 回合骨架 — 黄 */
337
- .trace-bar.k-other { background: color-mix(in oklch, var(--soft), var(--panel) 30%); } /* plumbing — 灰 */
338
- .trace-dur { color: var(--soft); text-align: right; }
339
- /* kind 小标:span label 前的语义角色徽标,和 bar 同色系。 */
340
- .kind-chip {
341
- display: inline-block;
342
- margin-right: 6px;
343
- padding: 0 5px;
344
- border-radius: 3px;
345
- font-size: 10px;
346
- font-weight: 600;
347
- text-transform: uppercase;
348
- letter-spacing: 0.03em;
349
- color: var(--panel);
350
- vertical-align: middle;
351
- }
352
- .kind-chip.k-model { background: oklch(0.72 0.13 250); }
353
- .kind-chip.k-tool { background: oklch(0.74 0.14 150); }
354
- .kind-chip.k-agent { background: oklch(0.74 0.15 300); }
355
- .kind-chip.k-turn { background: oklch(0.78 0.13 90); }
356
127
 
357
- /* ── Claude-Code 风格 transcript:按事件顺序读「LLM 说了什么 / 调了什么工具」,不强调时间 ── */
358
- .transcript { margin: 8px 0 4px; display: flex; flex-direction: column; gap: 6px; }
359
- .ts-msg {
360
- padding: 8px 11px;
361
- border-radius: 7px;
362
- border: 1px solid color-mix(in oklch, var(--line), transparent 30%);
363
- background: color-mix(in oklch, var(--panel), black 4%);
364
- }
365
- .ts-assistant { border-left: 2px solid var(--good); }
366
- .ts-user { border-left: 2px solid var(--line-strong); }
367
- .ts-input { border-left: 2px solid var(--warn); }
368
- .ts-role {
369
- display: block;
370
- font-size: 10px;
371
- text-transform: uppercase;
372
- letter-spacing: 0.07em;
373
- color: var(--soft);
374
- margin-bottom: 4px;
375
- }
376
- .ts-text {
377
- white-space: pre-wrap;
378
- overflow-wrap: anywhere;
379
- font-size: 13px;
380
- line-height: 1.55;
381
- color: var(--text);
382
- max-height: 360px;
383
- overflow: auto;
384
- }
385
- .ts-think { font-size: 12px; }
386
- .ts-think > summary {
387
- cursor: pointer;
388
- color: var(--soft);
389
- font-style: italic;
390
- list-style: none;
391
- padding: 2px 0;
392
- }
393
- .ts-think > summary::-webkit-details-marker { display: none; }
394
- .ts-think > summary::before { content: "\2726 "; }
395
- .ts-think-text {
396
- white-space: pre-wrap;
397
- overflow-wrap: anywhere;
398
- color: var(--muted);
399
- font-style: italic;
400
- padding: 4px 0 6px 16px;
401
- max-height: 280px;
402
- overflow: auto;
403
- }
404
- .ts-tool-d {
405
- border: 1px solid color-mix(in oklch, var(--line), transparent 30%);
406
- border-radius: 7px;
407
- background: color-mix(in oklch, var(--panel), black 6%);
408
- }
409
- .ts-tool-d > summary.ts-row {
410
- list-style: none;
411
- cursor: pointer;
412
- display: grid;
413
- grid-template-columns: 8px minmax(110px, max-content) 1fr;
414
- align-items: center;
415
- column-gap: 9px;
416
- padding: 7px 11px;
417
- }
418
- .ts-tool-d > summary.ts-row::-webkit-details-marker { display: none; }
419
- .ts-tool-d[open] > summary.ts-row { border-bottom: 1px solid color-mix(in oklch, var(--line), transparent 40%); }
420
- .ts-tool-d > summary.ts-row:hover { background: color-mix(in oklch, var(--panel-2), var(--panel) 20%); }
421
- .ts-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--good); }
422
- .ts-dot.bad { background: var(--bad); }
423
- .ts-dot.warn { background: var(--warn); }
424
- .ts-dot.pending { background: var(--soft); }
425
- .ts-tool {
426
- font-weight: 600;
427
- font-size: 12.5px;
428
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
429
- color: var(--text);
430
- white-space: nowrap;
431
- overflow: hidden;
432
- text-overflow: ellipsis;
433
- }
434
- .ts-preview { font-size: 12px; color: var(--soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
435
- .ts-body { padding: 8px 11px 10px; display: flex; flex-direction: column; gap: 8px; }
436
- .ts-field .ts-k {
437
- display: block;
438
- font-size: 10px;
439
- text-transform: uppercase;
440
- letter-spacing: 0.05em;
441
- color: var(--soft);
442
- margin-bottom: 3px;
443
- }
444
- .ts-error {
445
- padding: 8px 11px;
446
- border-radius: 7px;
447
- border: 1px solid color-mix(in oklch, var(--bad), transparent 55%);
448
- color: var(--bad);
449
- font-size: 12.5px;
450
- }
451
- .ts-skill {
452
- font-size: 12px;
453
- }
454
- .ts-raw .ts-tool { color: var(--soft); }
455
- .ts-skill .ts-text {
456
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
457
- color: var(--muted);
458
- }
459
- .ts-compaction {
460
- text-align: center;
461
- font-size: 11px;
462
- color: var(--soft);
463
- text-transform: uppercase;
464
- letter-spacing: 0.06em;
465
- padding: 2px 0;
466
- }
467
- pre {
468
- margin: 0;
469
- padding: 12px;
470
- border: 1px solid var(--line);
471
- border-radius: 7px;
472
- background: color-mix(in oklch, var(--panel), black 8%);
473
- color: var(--muted);
474
- overflow-wrap: anywhere;
475
- overflow: auto;
476
- max-height: 360px;
477
- font-size: 12px;
478
- line-height: 1.5;
479
- }
480
128
  @media (max-width: 760px) {
481
129
  .topbar { padding: 0 20px; }
482
130
  .lang-switch button { min-width: 40px; }
483
131
  main { width: min(100vw - 28px, 1120px); padding-top: 42px; }
484
- .detail { padding: 18px 16px 20px; }
485
- .config-strip { gap: 6px; }
486
- .detail-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); row-gap: 10px; }
487
- .eval-grid-head,
488
- .eval-item { grid-template-columns: 72px minmax(180px, 1fr) minmax(220px, 1fr) 76px 78px 72px 50px; }
489
- }
490
-
491
- /* ───────────────────────── Modal: error + code view (verdict chip → components/ui/badge.tsx) ───────────────────────── */
492
- .modal-error {
493
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
494
- font-size: 12px;
495
- color: var(--bad);
496
- background: color-mix(in oklch, var(--bad), transparent 92%);
497
- border: 1px solid color-mix(in oklch, var(--bad), var(--line) 50%);
498
- border-radius: 8px;
499
- padding: 8px 10px;
500
- margin-bottom: 12px;
501
- white-space: pre-wrap;
502
- word-break: break-word;
503
- }
504
-
505
- .codeview { display: flex; flex-direction: column; gap: 14px; }
506
-
507
- .code-file {
508
- border: 1px solid var(--line);
509
- border-radius: 10px;
510
- overflow: hidden;
511
- /* review 是独立阅读面;源码区必须完全不透底,不能让报告纹理穿进来。 */
512
- background: var(--panel);
513
- }
514
- .code-file-head {
515
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
516
- font-size: 11px;
517
- color: var(--muted);
518
- padding: 7px 12px;
519
- background: color-mix(in oklch, var(--panel-2), var(--line) 35%);
520
- border-bottom: 1px solid var(--line);
521
- }
522
- .code-lines {
523
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
524
- font-size: 12.5px;
525
- line-height: 1.7;
526
- /* 整块横向滚动(github-diff 式),不是逐行各滚各的——见下面 .code-line 的
527
- width: max-content:一行的真实宽度撑开这个滚动容器,滚动条对齐着整个代码块,
528
- 而不是消失在每行自己那条不可见的 scrollbar 里(旧写法读长 prompt 行直接读丢)。 */
529
- overflow-x: auto;
530
- }
531
- .code-lines::-webkit-scrollbar { height: 8px; }
532
- .code-lines::-webkit-scrollbar-track { background: transparent; }
533
- .code-lines::-webkit-scrollbar-thumb { background: var(--line-strong); border-radius: 4px; }
534
- .code-lines::-webkit-scrollbar-thumb:hover { background: var(--soft); }
535
-
536
- .code-line {
537
- display: grid;
538
- grid-template-columns: 46px 22px minmax(0, 1fr) auto;
539
- align-items: center;
540
- border-left: 3px solid transparent;
541
- /* 行宽跟着内容走(短行仍撑满可见区域,长行把 .code-lines 撑宽触发横向滚动),
542
- 配合 .code-lines 的 overflow-x 实现整块同步滚动。 */
543
- width: max-content;
544
- min-width: 100%;
545
- }
546
- .code-line.line-clickable { cursor: pointer; }
547
- .code-line.line-clickable:hover { background: color-mix(in oklch, var(--panel), var(--line) 45%); }
548
- /* send 行学 landing setup-card 的 reply 行:蓝底 + 蓝左缘 + 蓝行号,和断言行的绿/红/黄一眼区分。 */
549
- .code-line.line-send {
550
- background: color-mix(in oklch, var(--blue), var(--panel) 88%);
551
- border-left-color: var(--blue);
552
- }
553
- .code-line.line-send .ln {
554
- background: color-mix(in oklch, var(--blue), var(--panel) 74%);
555
- color: color-mix(in oklch, var(--blue), var(--text) 45%);
556
- }
557
- .code-line.line-send.line-clickable:hover { background: color-mix(in oklch, var(--blue), var(--panel) 82%); }
558
- .code-line.is-open { background: color-mix(in oklch, var(--panel), var(--line) 34%); }
559
-
560
- /* github-diff 式整行红绿:明确色块 + 更深 gutter + 实色左缘。
561
- 状态色占比必须足够高,暗色模式不能退化成只有一个很淡的图标。 */
562
- .code-line.line-pass {
563
- background: color-mix(in oklch, var(--good), var(--panel) 58%);
564
- border-left-color: var(--good);
565
- }
566
- .code-line.line-pass .ln {
567
- background: color-mix(in oklch, var(--good), var(--panel) 34%);
568
- color: var(--text);
569
- }
570
- .code-line.line-fail {
571
- background: color-mix(in oklch, var(--bad), var(--panel) 58%);
572
- border-left-color: var(--bad);
573
- }
574
- .code-line.line-fail .ln {
575
- background: color-mix(in oklch, var(--bad), var(--panel) 34%);
576
- color: var(--text);
577
- }
578
- /* soft 断言没过阈值:不影响 verdict,视觉上跟真正的 gate 失败(红)区分开,用 warn(黄)。 */
579
- .code-line.line-warn {
580
- background: color-mix(in oklch, var(--warn), var(--panel) 58%);
581
- border-left-color: var(--warn);
582
- }
583
- .code-line.line-warn .ln {
584
- background: color-mix(in oklch, var(--warn), var(--panel) 34%);
585
- color: var(--text);
586
- }
587
- .code-line.line-pass.line-clickable:hover { background: color-mix(in oklch, var(--good), var(--panel) 64%); }
588
- .code-line.line-fail.line-clickable:hover { background: color-mix(in oklch, var(--bad), var(--panel) 64%); }
589
- .code-line.line-warn.line-clickable:hover { background: color-mix(in oklch, var(--warn), var(--panel) 64%); }
590
-
591
- .ln {
592
- text-align: right;
593
- font-size: 11px;
594
- color: var(--soft);
595
- user-select: none;
596
- padding: 1px 8px 1px 0;
597
- align-self: stretch;
598
- display: flex;
599
- align-items: center;
600
- justify-content: flex-end;
601
- }
602
- .gmark { display: inline-flex; align-items: center; justify-content: center; }
603
- /* gutter 用 lucide 图标(对齐 landing:CheckCircle2/MessageCircle),不再用 ✓/✗ 文本字形。 */
604
- .gstat { width: 13px; height: 13px; flex-shrink: 0; }
605
- .gstat.good { color: var(--good); }
606
- .gstat.bad { color: var(--bad); }
607
- .gstat.warn { color: var(--warn); }
608
- .gstat.na { color: var(--muted, #8a8f98); }
609
- .gsend { width: 13px; height: 13px; flex-shrink: 0; color: var(--blue); }
610
-
611
- .ctext { white-space: pre; color: var(--text); padding-left: 8px; }
612
- .lbadges { padding-right: 12px; }
613
-
614
- .lbadges { display: inline-flex; gap: 6px; align-items: center; white-space: nowrap; justify-self: end; }
615
- .abadge {
616
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
617
- font-size: 11px;
618
- font-weight: 650;
619
- padding: 0 6px;
620
- border-radius: 5px;
621
- border: 1px solid transparent;
622
- }
623
- .abadge.good { color: var(--good); border-color: color-mix(in oklch, var(--good), var(--line) 55%); background: color-mix(in oklch, var(--good), transparent 90%); }
624
- .abadge.bad { color: var(--bad); border-color: color-mix(in oklch, var(--bad), var(--line) 55%); background: color-mix(in oklch, var(--bad), transparent 90%); }
625
- .abadge.warn { color: var(--warn); border-color: color-mix(in oklch, var(--warn), var(--line) 55%); background: color-mix(in oklch, var(--warn), transparent 90%); }
626
- /* unavailable:独立第三态(非红非绿),证据评不了 ≠ 失败 */
627
- .abadge.na { color: var(--muted, #8a8f98); border-color: var(--line); background: color-mix(in oklch, var(--muted, #8a8f98), transparent 92%); }
628
- .abadge-th { opacity: 0.55; font-weight: 400; }
629
-
630
- /* 可点击行的显式提示:send 行一个 "reply" 药丸,断言行一个右侧展开箭头;hover 时变亮。 */
631
- .reply-hint {
632
- font-size: 10px;
633
- font-weight: 650;
634
- letter-spacing: 0.02em;
635
- color: var(--muted);
636
- border: 1px solid color-mix(in oklch, var(--line-strong), transparent 12%);
637
- border-radius: 5px;
638
- padding: 1px 7px;
639
- background: color-mix(in oklch, var(--panel), var(--line) 28%);
640
- transition: color 0.12s, border-color 0.12s, background 0.12s;
641
- }
642
- .code-line.line-send .reply-hint {
643
- color: color-mix(in oklch, var(--blue), var(--text) 30%);
644
- border-color: color-mix(in oklch, var(--blue), var(--line) 55%);
645
- background: color-mix(in oklch, var(--blue), transparent 88%);
646
- }
647
- .code-line.line-clickable:hover .reply-hint {
648
- color: var(--text);
649
- border-color: color-mix(in oklch, var(--blue), var(--line) 30%);
650
- background: color-mix(in oklch, var(--blue), transparent 80%);
651
- }
652
- .line-chev {
653
- width: 14px;
654
- height: 14px;
655
- color: var(--soft);
656
- transition: transform 0.12s, color 0.12s;
657
- }
658
- .line-chev.is-open { transform: rotate(90deg); }
659
- .code-line.line-clickable:hover .line-chev { color: var(--text); }
660
-
661
- .line-detail {
662
- font-family: var(--sans, -apple-system, system-ui, "Segoe UI", sans-serif);
663
- white-space: normal;
664
- padding: 10px 16px 12px 60px;
665
- background: color-mix(in oklch, var(--panel), var(--line) 22%);
666
- border-left: 3px solid var(--line-strong);
667
- font-size: 12.5px;
668
- }
669
- .reply-panel { display: flex; flex-direction: column; gap: 9px; border-left-color: color-mix(in oklch, var(--blue), var(--line) 40%); }
670
- /* assistant 角色标签用蓝色,对齐 landing 的 code-note-role;绿色留给断言通过。 */
671
- .reply-role { font-size: 10px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--blue); display: block; margin-bottom: 2px; }
672
- .reply-text { color: var(--text); white-space: pre-wrap; word-break: break-word; }
673
- .reply-think { font-size: 12px; color: var(--muted); }
674
- .reply-think summary { cursor: pointer; user-select: none; }
675
- .reply-think-text { white-space: pre-wrap; color: var(--soft); margin-top: 4px; padding-left: 4px; }
676
- .reply-tool { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; color: var(--text); display: flex; gap: 8px; flex-wrap: wrap; }
677
- .reply-tool-name { color: var(--warn); }
678
- .reply-tool-out { color: var(--muted); }
679
- .reply-err { color: var(--bad); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
680
- .reply-skill { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; color: var(--muted); }
681
- .reply-user .reply-text { color: var(--muted); white-space: pre-wrap; word-break: break-word; }
682
- .reply-empty { color: var(--soft); }
683
-
684
- .assert-detail { display: flex; flex-direction: column; gap: 9px; }
685
- .assert-row { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 8px; align-items: baseline; }
686
- .assert-name { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; color: var(--text); overflow-wrap: anywhere; }
687
- .assert-sev { font-size: 10px; color: var(--soft); text-transform: uppercase; letter-spacing: 0.04em; }
688
- .assert-score { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; color: var(--muted); white-space: nowrap; }
689
- .assert-reason { grid-column: 1 / -1; color: var(--muted); white-space: pre-wrap; font-size: 12px; }
690
-
691
- /* 可观测性:裁判看到的材料(默认折叠,展开排查「为什么是这个分」)。 */
692
- .assert-evidence { grid-column: 1 / -1; margin-top: 2px; }
693
- .assert-evidence > summary {
694
- cursor: pointer;
695
- user-select: none;
696
- font-size: 11px;
697
- color: var(--soft);
698
- letter-spacing: 0.02em;
699
132
  }
700
- .assert-evidence > summary:hover { color: var(--text); }
701
- .assert-evidence-pre {
702
- margin: 6px 0 0;
703
- padding: 8px 10px;
704
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
705
- font-size: 11.5px;
706
- line-height: 1.5;
707
- color: var(--text);
708
- white-space: pre-wrap;
709
- overflow-wrap: anywhere;
710
- background: color-mix(in oklch, var(--panel), var(--line) 24%);
711
- border: 1px solid var(--line);
712
- border-radius: 7px;
713
- max-height: 260px;
714
- overflow-y: auto;
715
- }
716
-
717
- .code-orphans { border: 1px solid var(--line); border-radius: 10px; padding: 10px 12px; }
718
- .code-orphans-head { font-size: 11px; color: var(--muted); margin-bottom: 8px; }
719
-
720
- /* ── Attempt 详情(契约:docs/feature/reports/view.md「Attempt 详情」) ── */
721
- .modal-sect {
722
- font-size: 11px;
723
- font-weight: 660;
724
- letter-spacing: 0.06em;
725
- text-transform: uppercase;
726
- color: var(--muted);
727
- margin-bottom: 6px;
728
- }
729
- /* 断言区:仅源码不可用时出现的 fallback 呈现面。 */
730
- .attempt-asserts { margin-bottom: 14px; }
731
- .attempt-asserts-open {
732
- margin-top: 6px;
733
- border: 1px solid var(--line);
734
- border-radius: 10px;
735
- background: var(--panel);
736
- overflow: hidden;
737
- }
738
- /* 复用 CodeView 的 .assert-detail 排版,但脱离代码行上下文:去掉行内缩进与左缘。 */
739
- .attempt-asserts .assert-detail { padding: 10px 12px; border-left: 0; background: transparent; }
740
- /* 长 expected/received(整文件 dump)一律有界滚动:断言明细无论住在失败索引 fallback、
741
- 源码行展开还是 NoSourceBody,都不把页面其余区块挤出视口。 */
742
- .assert-reason { max-height: 180px; overflow-y: auto; }
743
- /* 失败索引行:summary 一行是标题(徽章/名字/matcher/锚),明细收在行内一次展开。 */
744
- .fail-row { border-bottom: 1px solid var(--line); }
745
- .fail-row:last-child { border-bottom: 0; }
746
- .fail-sum {
747
- display: flex;
748
- align-items: baseline;
749
- flex-wrap: wrap;
750
- gap: 4px 8px;
751
- padding: 8px 12px;
752
- cursor: pointer;
753
- user-select: none;
754
- list-style: none;
755
- min-width: 0;
756
- }
757
- .fail-sum::-webkit-details-marker { display: none; }
758
- .fail-sum::before {
759
- content: "";
760
- width: 0;
761
- height: 0;
762
- border-left: 4px solid var(--soft);
763
- border-top: 3.5px solid transparent;
764
- border-bottom: 3.5px solid transparent;
765
- flex-shrink: 0;
766
- align-self: center;
767
- transition: transform 0.12s;
768
- }
769
- .fail-row[open] > .fail-sum::before { transform: rotate(90deg); }
770
- .fail-sum:hover { background: color-mix(in oklch, var(--panel), var(--line) 30%); }
771
- .fail-name {
772
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
773
- font-size: 12px;
774
- color: var(--text);
775
- overflow-wrap: anywhere;
776
- }
777
- .fail-matcher {
778
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
779
- font-size: 11.5px;
780
- color: var(--muted);
781
- overflow-wrap: anywhere;
782
- }
783
- .fail-body {
784
- display: flex;
785
- flex-direction: column;
786
- gap: 6px;
787
- padding: 2px 12px 10px 24px;
788
- }
789
- .assert-loc {
790
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
791
- font-size: 11px;
792
- color: var(--soft);
793
- margin-left: 8px;
794
- white-space: nowrap;
795
- }
796
- .asserts-passed { margin-top: 8px; }
797
- .asserts-passed > summary,
798
- .asserts-passed-group > summary {
799
- cursor: pointer;
800
- user-select: none;
801
- font-size: 12px;
802
- color: var(--muted);
803
- }
804
- .asserts-passed > summary:hover,
805
- .asserts-passed-group > summary:hover { color: var(--text); }
806
- .asserts-passed-group { margin: 6px 0 0 14px; }
807
- .asserts-passed-group > .assert-detail { margin-top: 4px; }
808
-
809
- /* ── Attempt 详情:统一时间树(整区默认收合;展开后主链分解条 + 默认收合的 children) ── */
810
- .attempt-timing { margin: 14px 0; }
811
- summary.timing-sum {
812
- display: flex;
813
- align-items: center;
814
- gap: 8px;
815
- cursor: pointer;
816
- user-select: none;
817
- list-style: none;
818
- }
819
- summary.timing-sum::-webkit-details-marker { display: none; }
820
- summary.timing-sum::before {
821
- content: "";
822
- width: 0;
823
- height: 0;
824
- border-left: 4px solid var(--soft);
825
- border-top: 3.5px solid transparent;
826
- border-bottom: 3.5px solid transparent;
827
- flex-shrink: 0;
828
- transition: transform 0.12s;
829
- }
830
- details[open] > summary.timing-sum::before { transform: rotate(90deg); }
831
- summary.timing-sum:hover .modal-sect { color: var(--text); }
832
- .timing-sum .modal-sect { margin-bottom: 0; }
833
- .phase-bar {
834
- display: flex;
835
- height: 8px;
836
- border-radius: 4px;
837
- overflow: hidden;
838
- gap: 1px;
839
- margin: 7px 0 8px;
840
- }
841
- .phase-seg { min-width: 2px; flex-basis: 0; }
842
- .phase-seg-1 { background: var(--series-1); }
843
- .phase-seg-2 { background: var(--series-2); }
844
- .phase-seg-3 { background: var(--series-3); }
845
- .phase-seg-4 { background: var(--series-4); }
846
- .phase-seg-5 { background: var(--series-5); }
847
- .phase-seg-6 { background: var(--series-6); }
848
- .phase-seg-bad { background: var(--bad); }
849
- .phase-list,
850
- .timing-kids { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
851
- .timing-kids { padding-left: 18px; margin-top: 2px; }
852
- .phase-row,
853
- .tnode-row { display: flex; align-items: center; gap: 7px; font-size: 12px; line-height: 1.7; min-width: 0; }
854
- summary.phase-row,
855
- summary.tnode-row { cursor: pointer; user-select: none; list-style: none; }
856
- summary.phase-row::-webkit-details-marker,
857
- summary.tnode-row::-webkit-details-marker { display: none; }
858
- summary.phase-row::before,
859
- summary.tnode-row::before {
860
- content: "";
861
- width: 0;
862
- height: 0;
863
- border-left: 4px solid var(--soft);
864
- border-top: 3.5px solid transparent;
865
- border-bottom: 3.5px solid transparent;
866
- flex-shrink: 0;
867
- transition: transform 0.12s;
868
- }
869
- details[open] > summary.phase-row::before,
870
- details[open] > summary.tnode-row::before { transform: rotate(90deg); }
871
- /* 无 children 的行:占位对齐有箭头的行。 */
872
- li.phase-row::before,
873
- li.tnode-row::before { content: ""; width: 4px; flex-shrink: 0; }
874
- .phase-dot { width: 8px; height: 8px; border-radius: 2px; flex-shrink: 0; }
875
- .phase-dot-none { background: transparent; }
876
- /* 名称列定宽:各行的耗时起始对齐成一列(最长 phase 名 telemetry.configure 也在宽度内)。 */
877
- .phase-name { color: var(--text); white-space: nowrap; width: 168px; flex-shrink: 0; }
878
- .phase-dur { color: var(--muted); font-variant-numeric: tabular-nums; white-space: nowrap; }
879
- .phase-fail { color: var(--bad); font-weight: 650; }
880
- .phase-kids {
881
- font-size: 10px;
882
- color: var(--soft);
883
- border: 1px solid var(--line);
884
- border-radius: 999px;
885
- padding: 0 6px;
886
- line-height: 1.5;
887
- }
888
- .tnode-label {
889
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
890
- font-size: 11.5px;
891
- color: var(--muted);
892
- overflow: hidden;
893
- text-overflow: ellipsis;
894
- white-space: nowrap;
895
- min-width: 0;
896
- }
897
- .tnode-meta { font-size: 11px; color: var(--soft); padding: 3px 0 3px 18px; }
898
- .tnode-trace { margin: 4px 0 6px 18px; }
899
- .phase-closing { margin-top: 8px; }
900
- .phase-closing-head { font-size: 11px; color: var(--soft); margin-bottom: 2px; }
901
-
902
- /* usage / sandbox 元信息 chips。 */
903
- .meta-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
904
- .meta-chip {
905
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
906
- font-size: 11px;
907
- color: var(--muted);
908
- border: 1px solid var(--line);
909
- border-radius: 6px;
910
- padding: 3px 9px;
911
- background: var(--panel);
912
- }
913
- .meta-chip b { color: var(--text); font-weight: 640; }
914
-
915
- /* lightweight TS syntax tokens */
916
- .tok-comment { color: var(--soft); font-style: italic; }
917
- .tok-str { color: light-dark(#0a7d3c, #7ee787); }
918
- .tok-kw { color: light-dark(#9333ea, #c792ea); }
919
- .tok-num { color: light-dark(#b25000, #f0a36b); }
920
- .tok-fn { color: light-dark(#0b62d6, #82aaff); }
921
133
 
922
134
  /* ── 外壳:导航右侧外部链接与页脚(docs/feature/reports/library/shell.md) ── */
923
135
  .shell-links { display: flex; gap: 8px; align-items: center; margin-left: auto; }