niceeval 0.9.1 → 0.10.2

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