niceeval 0.6.1 → 0.7.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 (378) hide show
  1. package/INDEX.md +23 -23
  2. package/README.zh.md +6 -6
  3. package/dist/agents/types.d.ts +69 -7
  4. package/dist/context/types.d.ts +32 -12
  5. package/dist/i18n/en.d.ts +54 -0
  6. package/dist/i18n/zh-CN.d.ts +57 -3
  7. package/dist/o11y/types.d.ts +16 -2
  8. package/dist/report/aggregate.d.ts +32 -24
  9. package/dist/report/aggregate.js +158 -50
  10. package/dist/report/built-in/index.d.ts +2 -0
  11. package/dist/report/built-in/index.js +8 -0
  12. package/dist/report/components.d.ts +93 -160
  13. package/dist/report/components.js +377 -114
  14. package/dist/report/compute.d.ts +87 -81
  15. package/dist/report/compute.js +597 -417
  16. package/dist/report/flag.d.ts +32 -6
  17. package/dist/report/flag.js +92 -4
  18. package/dist/report/format.d.ts +19 -11
  19. package/dist/report/format.js +30 -13
  20. package/dist/report/index.d.ts +16 -16
  21. package/dist/report/index.js +20 -21
  22. package/dist/report/load.js +3 -2
  23. package/dist/report/locale.d.ts +57 -33
  24. package/dist/report/locale.js +122 -56
  25. package/dist/report/metrics.d.ts +23 -4
  26. package/dist/report/metrics.js +110 -25
  27. package/dist/report/primitives.d.ts +48 -15
  28. package/dist/report/primitives.js +135 -26
  29. package/dist/report/react/AttemptList.d.ts +9 -7
  30. package/dist/report/react/AttemptList.js +17 -10
  31. package/dist/report/react/DeltaTable.js +19 -18
  32. package/dist/report/react/EvalList.d.ts +4 -4
  33. package/dist/report/react/EvalList.js +0 -0
  34. package/dist/report/react/ExperimentComparison.d.ts +10 -0
  35. package/dist/report/react/ExperimentComparison.js +12 -0
  36. package/dist/report/react/ExperimentList.d.ts +4 -3
  37. package/dist/report/react/ExperimentList.js +17 -18
  38. package/dist/report/react/MetricBars.js +5 -4
  39. package/dist/report/react/MetricLine.js +12 -5
  40. package/dist/report/react/MetricMatrix.js +1 -1
  41. package/dist/report/react/MetricScatter.js +59 -28
  42. package/dist/report/react/MetricTable.js +2 -12
  43. package/dist/report/react/ScopeSummary.d.ts +10 -0
  44. package/dist/report/react/ScopeSummary.js +17 -0
  45. package/dist/report/react/Scoreboard.js +6 -6
  46. package/dist/report/react/cell.js +2 -2
  47. package/dist/report/react/chart-math.d.ts +23 -6
  48. package/dist/report/react/chart-math.js +71 -19
  49. package/dist/report/react/fixtures.d.ts +5 -9
  50. package/dist/report/react/fixtures.js +110 -147
  51. package/dist/report/react/index.d.ts +15 -5
  52. package/dist/report/react/index.js +18 -7
  53. package/dist/report/report.d.ts +137 -16
  54. package/dist/report/report.js +259 -28
  55. package/dist/report/text/faces.d.ts +17 -19
  56. package/dist/report/text/faces.js +253 -184
  57. package/dist/report/text/plot.js +1 -1
  58. package/dist/report/text/table.js +38 -7
  59. package/dist/report/tree.d.ts +90 -40
  60. package/dist/report/tree.js +252 -94
  61. package/dist/report/types.d.ts +247 -284
  62. package/dist/report/types.js +4 -3
  63. package/dist/report/web.d.ts +21 -5
  64. package/dist/report/web.js +42 -16
  65. package/dist/results/select.d.ts +38 -16
  66. package/dist/results/select.js +73 -25
  67. package/dist/results/types.d.ts +49 -14
  68. package/dist/runner/feedback/sink.d.ts +110 -0
  69. package/dist/runner/types.d.ts +513 -22
  70. package/dist/sandbox/docker.d.ts +23 -2
  71. package/dist/sandbox/e2b.d.ts +15 -1
  72. package/dist/sandbox/errors.d.ts +30 -3
  73. package/dist/sandbox/io-retry.d.ts +17 -0
  74. package/dist/sandbox/registry.d.ts +2 -0
  75. package/dist/sandbox/resolve.d.ts +18 -5
  76. package/dist/sandbox/retry.d.ts +11 -1
  77. package/dist/sandbox/types.d.ts +39 -5
  78. package/dist/sandbox/vercel.d.ts +7 -1
  79. package/dist/scoring/coverage.d.ts +30 -0
  80. package/dist/scoring/display.d.ts +21 -0
  81. package/dist/scoring/display.js +120 -0
  82. package/dist/scoring/types.d.ts +103 -20
  83. package/dist/shared/aggregate.d.ts +4 -2
  84. package/dist/shared/aggregate.js +8 -7
  85. package/dist/shared/types.d.ts +28 -0
  86. package/dist/tty-line.d.ts +0 -4
  87. package/dist/util.d.ts +23 -0
  88. package/docs-site/zh/README.md +44 -0
  89. package/docs-site/zh/examples/ai-agent-application.mdx +63 -0
  90. package/docs-site/zh/examples/coding-agent-extensions.mdx +57 -0
  91. package/docs-site/zh/examples/index.mdx +50 -0
  92. package/docs-site/zh/{concepts → explanation}/adapter.mdx +31 -13
  93. package/docs-site/zh/{concepts → explanation}/assert.mdx +7 -7
  94. package/docs-site/zh/{concepts → explanation}/drive.mdx +8 -8
  95. package/docs-site/zh/{concepts → explanation}/evals.mdx +4 -4
  96. package/docs-site/zh/{concepts → explanation}/experiment.mdx +8 -8
  97. package/docs-site/zh/{concepts → explanation}/hitl.mdx +8 -8
  98. package/docs-site/zh/{concepts → explanation}/judge.mdx +5 -5
  99. package/docs-site/zh/{concepts → explanation}/overview.mdx +11 -11
  100. package/docs-site/zh/{guides → explanation}/runner.mdx +18 -8
  101. package/docs-site/zh/{concepts → explanation}/tier.mdx +6 -6
  102. package/docs-site/zh/{guides → how-to}/agent-feedback-loop.mdx +35 -33
  103. package/docs-site/zh/{guides → how-to}/authoring.mdx +35 -2
  104. package/docs-site/zh/{guides → how-to}/ci-integration.mdx +23 -12
  105. package/docs-site/zh/{guides → how-to}/connect-otel.mdx +6 -6
  106. package/docs-site/zh/{guides → how-to}/connect-your-agent.mdx +47 -21
  107. package/docs-site/zh/{guides → how-to}/custom-reports.mdx +34 -39
  108. package/docs-site/zh/{guides → how-to}/dataset-fanout.mdx +25 -3
  109. package/docs-site/zh/{guides → how-to}/experiments.mdx +12 -5
  110. package/docs-site/zh/how-to/publish-report.mdx +105 -0
  111. package/docs-site/zh/{guides → how-to}/reporters.mdx +2 -2
  112. package/docs-site/zh/{guides → how-to}/sandbox-agent.mdx +56 -7
  113. package/docs-site/zh/how-to/sandbox-providers.mdx +350 -0
  114. package/docs-site/zh/{guides → how-to}/scoring-guide.mdx +4 -4
  115. package/docs-site/zh/{guides → how-to}/viewing-results.mdx +82 -39
  116. package/docs-site/zh/{guides → how-to}/write-experiment.mdx +6 -4
  117. package/docs-site/zh/{guides → how-to}/write-send.mdx +30 -14
  118. package/docs-site/zh/index.mdx +24 -26
  119. package/docs-site/zh/introduction.mdx +8 -8
  120. package/docs-site/zh/reference/builtin-agents.mdx +32 -5
  121. package/docs-site/zh/reference/capabilities.mdx +8 -8
  122. package/docs-site/zh/reference/cli.mdx +40 -12
  123. package/docs-site/zh/reference/define-agent.mdx +58 -5
  124. package/docs-site/zh/reference/define-config.mdx +1 -1
  125. package/docs-site/zh/reference/define-eval.mdx +42 -9
  126. package/docs-site/zh/reference/events.mdx +3 -3
  127. package/docs-site/zh/reference/expect.mdx +26 -1
  128. package/docs-site/zh/{guides → reference}/official-adapters.mdx +32 -8
  129. package/docs-site/zh/{guides → reference}/report-components.mdx +45 -33
  130. package/docs-site/zh/{guides → reference}/results-data.mdx +21 -13
  131. package/docs-site/zh/troubleshooting/debug-sandbox.mdx +57 -0
  132. package/docs-site/zh/troubleshooting/debugging.mdx +212 -0
  133. package/docs-site/zh/{quickstart.mdx → tutorials/quickstart.mdx} +5 -17
  134. package/package.json +10 -2
  135. package/src/agents/ai-sdk-otel.test.ts +1 -0
  136. package/src/agents/ai-sdk.test.ts +3 -0
  137. package/src/agents/ai-sdk.ts +3 -0
  138. package/src/agents/bub-install-spec.test.ts +34 -0
  139. package/src/agents/bub-install-spec.ts +32 -0
  140. package/src/agents/bub.ts +31 -32
  141. package/src/agents/claude-code.test.ts +130 -9
  142. package/src/agents/claude-code.ts +76 -4
  143. package/src/agents/codex.test.ts +189 -40
  144. package/src/agents/codex.ts +155 -14
  145. package/src/agents/coding-cli-versions.test.ts +15 -0
  146. package/src/agents/coding-cli-versions.ts +3 -0
  147. package/src/agents/index.ts +13 -2
  148. package/src/agents/langgraph.test.ts +204 -0
  149. package/src/agents/langgraph.ts +495 -0
  150. package/src/agents/marketplace.ts +85 -0
  151. package/src/agents/native-config.test.ts +179 -0
  152. package/src/agents/native-config.ts +267 -0
  153. package/src/agents/openai-compat.test.ts +1 -0
  154. package/src/agents/openai-compat.ts +1 -1
  155. package/src/agents/openclaw.test.ts +31 -0
  156. package/src/agents/openclaw.ts +171 -0
  157. package/src/agents/plugin-config.test.ts +1 -0
  158. package/src/agents/sdk-streams.test.ts +79 -0
  159. package/src/agents/sdk-streams.ts +55 -10
  160. package/src/agents/skills.test.ts +1 -0
  161. package/src/agents/streaming.test.ts +3 -9
  162. package/src/agents/streaming.ts +2 -2
  163. package/src/agents/types.ts +71 -8
  164. package/src/agents/ui-message-stream.test.ts +3 -0
  165. package/src/cli.ts +446 -124
  166. package/src/context/context.test.ts +51 -12
  167. package/src/context/context.ts +162 -30
  168. package/src/context/session.test.ts +2 -1
  169. package/src/context/session.ts +115 -7
  170. package/src/context/types.ts +30 -12
  171. package/src/define.test.ts +13 -8
  172. package/src/define.ts +25 -4
  173. package/src/expect/index.ts +53 -23
  174. package/src/i18n/en.ts +81 -17
  175. package/src/i18n/zh-CN.ts +80 -17
  176. package/src/o11y/cost.test.ts +1 -0
  177. package/src/o11y/execution-tree.test.ts +1 -20
  178. package/src/o11y/otlp/mappers/claude-code.test.ts +1 -0
  179. package/src/o11y/otlp/parse.test.ts +1 -0
  180. package/src/o11y/otlp/turn-otel.test.ts +1 -0
  181. package/src/o11y/parsers/bub.test.ts +1 -0
  182. package/src/o11y/parsers/claude-code.test.ts +1 -34
  183. package/src/o11y/parsers/openclaw.test.ts +154 -0
  184. package/src/o11y/parsers/openclaw.ts +310 -0
  185. package/src/o11y/prices.json +746 -311
  186. package/src/o11y/tool-names.test.ts +1 -0
  187. package/src/o11y/types.ts +16 -2
  188. package/src/report/aggregate.ts +178 -61
  189. package/src/report/built-in/index.tsx +9 -0
  190. package/src/report/components.tsx +625 -279
  191. package/src/report/compute.ts +723 -491
  192. package/src/report/dual-render.test.tsx +741 -1024
  193. package/src/report/flag.ts +104 -12
  194. package/src/report/format.ts +32 -12
  195. package/src/report/index.ts +119 -46
  196. package/src/report/load.ts +3 -2
  197. package/src/report/locale.ts +136 -65
  198. package/src/report/metrics.ts +108 -25
  199. package/src/report/primitives.tsx +196 -45
  200. package/src/report/react/AttemptList.tsx +30 -43
  201. package/src/report/react/DeltaTable.tsx +63 -45
  202. package/src/report/react/EvalList.tsx +0 -0
  203. package/src/report/react/ExperimentComparison.tsx +73 -0
  204. package/src/report/react/ExperimentList.tsx +50 -32
  205. package/src/report/react/MetricBars.tsx +5 -4
  206. package/src/report/react/MetricLine.tsx +13 -8
  207. package/src/report/react/MetricMatrix.tsx +2 -2
  208. package/src/report/react/MetricScatter.tsx +86 -34
  209. package/src/report/react/MetricTable.tsx +4 -76
  210. package/src/report/react/ScopeSummary.tsx +86 -0
  211. package/src/report/react/Scoreboard.tsx +28 -10
  212. package/src/report/react/cell.tsx +2 -2
  213. package/src/report/react/chart-math.test.ts +85 -0
  214. package/src/report/react/chart-math.ts +101 -22
  215. package/src/report/react/enhance.js +89 -5
  216. package/src/report/react/fixtures.ts +114 -154
  217. package/src/report/react/index.tsx +24 -39
  218. package/src/report/react/render.test.tsx +138 -158
  219. package/src/report/react/styles.css +243 -82
  220. package/src/report/report.test.ts +779 -841
  221. package/src/report/report.ts +423 -41
  222. package/src/report/text/faces.ts +290 -193
  223. package/src/report/text/plot.ts +1 -1
  224. package/src/report/text/table.ts +44 -7
  225. package/src/report/tree.ts +362 -104
  226. package/src/report/types.ts +261 -271
  227. package/src/report/web.ts +63 -20
  228. package/src/results/annotated-source.test.ts +62 -9
  229. package/src/results/annotated-source.ts +64 -6
  230. package/src/results/attempt-evidence.test.ts +13 -11
  231. package/src/results/attempt-evidence.ts +20 -13
  232. package/src/results/attempt-source.ts +6 -3
  233. package/src/results/copy.ts +150 -60
  234. package/src/results/host-equivalence.test.ts +34 -20
  235. package/src/results/index.ts +12 -4
  236. package/src/results/locator.test.ts +1 -22
  237. package/src/results/open.ts +15 -5
  238. package/src/results/publish.ts +149 -0
  239. package/src/results/results.test.ts +89 -54
  240. package/src/results/select.ts +104 -34
  241. package/src/results/truncate.ts +90 -0
  242. package/src/results/types.ts +43 -14
  243. package/src/results/writer.ts +31 -13
  244. package/src/runner/attempt.test.ts +138 -7
  245. package/src/runner/attempt.ts +603 -104
  246. package/src/runner/discover.test.ts +47 -0
  247. package/src/runner/discover.ts +36 -2
  248. package/src/runner/eval-source.test.ts +1 -27
  249. package/src/runner/feedback/agent.test.ts +504 -0
  250. package/src/runner/feedback/agent.ts +409 -0
  251. package/src/runner/feedback/ci.test.ts +562 -0
  252. package/src/runner/feedback/ci.ts +401 -0
  253. package/src/runner/feedback/coordinator.test.ts +317 -0
  254. package/src/runner/feedback/coordinator.ts +397 -0
  255. package/src/runner/feedback/failure.ts +40 -0
  256. package/src/runner/feedback/human.test.ts +616 -0
  257. package/src/runner/feedback/human.ts +535 -0
  258. package/src/runner/feedback/index.ts +66 -0
  259. package/src/runner/feedback/io.ts +78 -0
  260. package/src/runner/feedback/profile.test.ts +50 -0
  261. package/src/runner/feedback/profile.ts +58 -0
  262. package/src/runner/feedback/reducer.test.ts +395 -0
  263. package/src/runner/feedback/reducer.ts +260 -0
  264. package/src/runner/feedback/renderer.ts +82 -0
  265. package/src/runner/feedback/sink.ts +203 -0
  266. package/src/runner/feedback/testing.ts +106 -0
  267. package/src/runner/ledger.test.ts +230 -0
  268. package/src/runner/ledger.ts +329 -0
  269. package/src/runner/report.test.ts +128 -3
  270. package/src/runner/report.ts +33 -9
  271. package/src/runner/reporters/artifacts.ts +8 -2
  272. package/src/runner/reporters/braintrust.test.ts +8 -7
  273. package/src/runner/reporters/braintrust.ts +9 -2
  274. package/src/runner/reporters/index.ts +2 -2
  275. package/src/runner/reporters/json.test.ts +162 -0
  276. package/src/runner/reporters/json.ts +35 -8
  277. package/src/runner/reporters/shared.ts +1 -5
  278. package/src/runner/run.test.ts +760 -3
  279. package/src/runner/run.ts +243 -37
  280. package/src/runner/sandbox-prep.ts +3 -42
  281. package/src/runner/timing.ts +158 -0
  282. package/src/runner/types.ts +518 -22
  283. package/src/sandbox/checkpoint.test.ts +55 -0
  284. package/src/sandbox/checkpoint.ts +29 -8
  285. package/src/sandbox/cli-commands.ts +407 -0
  286. package/src/sandbox/docker.ts +115 -16
  287. package/src/sandbox/e2b-agent-template.test.ts +56 -0
  288. package/src/sandbox/e2b-agent-template.ts +94 -0
  289. package/src/sandbox/e2b.ts +74 -9
  290. package/src/sandbox/errors.ts +111 -4
  291. package/src/sandbox/index.ts +2 -0
  292. package/src/sandbox/io-retry.test.ts +58 -0
  293. package/src/sandbox/io-retry.ts +45 -0
  294. package/src/sandbox/keep-registry.test.ts +86 -0
  295. package/src/sandbox/keep-registry.ts +142 -0
  296. package/src/sandbox/keep.ts +178 -0
  297. package/src/sandbox/paths.test.ts +1 -0
  298. package/src/sandbox/paths.ts +19 -8
  299. package/src/sandbox/registry.ts +20 -3
  300. package/src/sandbox/resolve.ts +76 -11
  301. package/src/sandbox/retry.test.ts +70 -0
  302. package/src/sandbox/retry.ts +46 -4
  303. package/src/sandbox/types.ts +44 -6
  304. package/src/sandbox/vercel.ts +43 -20
  305. package/src/scoring/collector.ts +60 -17
  306. package/src/scoring/coverage.ts +95 -0
  307. package/src/scoring/diff.ts +81 -0
  308. package/src/scoring/display.test.ts +121 -0
  309. package/src/scoring/display.ts +133 -0
  310. package/src/scoring/evidence.test.ts +189 -0
  311. package/src/scoring/judge.test.ts +142 -0
  312. package/src/scoring/judge.ts +15 -18
  313. package/src/scoring/scoped.ts +217 -50
  314. package/src/scoring/types.ts +117 -20
  315. package/src/scoring/verdict.ts +16 -4
  316. package/src/shared/aggregate.ts +8 -6
  317. package/src/shared/types.ts +31 -0
  318. package/src/show/compose.ts +50 -67
  319. package/src/show/index.ts +127 -56
  320. package/src/show/render.ts +662 -131
  321. package/src/show/report-host.test.ts +188 -0
  322. package/src/show/report-host.ts +375 -0
  323. package/src/show/show.test.ts +320 -54
  324. package/src/tty-line.ts +8 -26
  325. package/src/util.test.ts +1 -0
  326. package/src/util.ts +41 -0
  327. package/src/view/app/App.test.tsx +69 -0
  328. package/src/view/app/App.tsx +144 -48
  329. package/src/view/app/components/AttemptModal.tsx +423 -11
  330. package/src/view/app/components/CodeView.tsx +41 -14
  331. package/src/view/app/components/CopyControls.tsx +2 -2
  332. package/src/view/app/i18n.ts +37 -17
  333. package/src/view/app/lib/attempt-route.test.ts +1 -0
  334. package/src/view/app/lib/verdict.ts +7 -9
  335. package/src/view/app/main.tsx +13 -8
  336. package/src/view/app/pages/{RunsPage.tsx → AttemptsPage.tsx} +6 -6
  337. package/src/view/app/types.ts +4 -1
  338. package/src/view/artifact-serving.test.ts +2 -1
  339. package/src/view/client-dist/app.css +1 -1
  340. package/src/view/client-dist/app.js +17 -17
  341. package/src/view/data.test.ts +10 -3
  342. package/src/view/data.ts +155 -49
  343. package/src/view/index.ts +56 -41
  344. package/src/view/server.ts +37 -15
  345. package/src/view/shared/types.ts +34 -5
  346. package/src/view/styles.css +227 -0
  347. package/src/view/view-report.test.ts +167 -62
  348. package/dist/report/built-ins/experiment-comparison.d.ts +0 -1
  349. package/dist/report/built-ins/experiment-comparison.js +0 -13
  350. package/dist/report/built-ins/index.d.ts +0 -1
  351. package/dist/report/built-ins/index.js +0 -2
  352. package/dist/report/react/GroupSummary.d.ts +0 -8
  353. package/dist/report/react/GroupSummary.js +0 -8
  354. package/dist/report/react/RunOverview.d.ts +0 -8
  355. package/dist/report/react/RunOverview.js +0 -12
  356. package/docs-site/zh/example/ai-agent-application.mdx +0 -152
  357. package/docs-site/zh/example/claude-code-codex-plugin.mdx +0 -167
  358. package/docs-site/zh/example/claude-code-codex-skill.mdx +0 -152
  359. package/docs-site/zh/example/showcase.mdx +0 -39
  360. package/docs-site/zh/guides/publish-report.mdx +0 -91
  361. package/docs-site/zh/guides/sandbox-providers.mdx +0 -102
  362. package/src/report/built-in-user-parity.test.tsx +0 -640
  363. package/src/report/built-ins/experiment-comparison.tsx +0 -19
  364. package/src/report/built-ins/index.ts +0 -2
  365. package/src/report/react/GroupSummary.tsx +0 -66
  366. package/src/report/react/RunOverview.tsx +0 -109
  367. package/src/runner/reporters/console.ts +0 -70
  368. package/src/runner/reporters/live.test.ts +0 -56
  369. package/src/runner/reporters/live.ts +0 -247
  370. package/src/runner/reporters/quiet.test.ts +0 -66
  371. package/src/runner/reporters/quiet.ts +0 -49
  372. package/src/runner/reporters/table.ts +0 -277
  373. /package/docs-site/zh/{example/tier1-ai-sdk-v7.mdx → examples/integrations/ai-sdk-v7.mdx} +0 -0
  374. /package/docs-site/zh/{example/tier1-claude-sdk.mdx → examples/integrations/claude-sdk.mdx} +0 -0
  375. /package/docs-site/zh/{example/tier1-codex-sdk.mdx → examples/integrations/codex-sdk.mdx} +0 -0
  376. /package/docs-site/zh/{example/tier1-langgraph.mdx → examples/integrations/langgraph.mdx} +0 -0
  377. /package/docs-site/zh/{example/tier1-pi-sdk.mdx → examples/integrations/pi-sdk.mdx} +0 -0
  378. /package/docs-site/zh/{guides → how-to}/fixtures.mdx +0 -0
@@ -8,7 +8,7 @@ export type MessageKey =
8
8
  | "nav.label"
9
9
  | "nav.report"
10
10
  | "nav.experiments"
11
- | "nav.runs"
11
+ | "nav.attempts"
12
12
  | "nav.traces"
13
13
  | "hero.title"
14
14
  | "hero.lastRun"
@@ -18,13 +18,13 @@ export type MessageKey =
18
18
  | "metric.duration"
19
19
  | "metric.cost"
20
20
  | "section.experiments"
21
- | "section.individualRuns"
21
+ | "section.attempts"
22
22
  | "section.traces"
23
23
  | "search.experiments"
24
- | "search.runs"
24
+ | "search.attempts"
25
25
  | "empty.summary"
26
- | "empty.individualRuns"
27
- | "empty.runsFilter"
26
+ | "empty.attempts"
27
+ | "empty.attemptsFilter"
28
28
  | "empty.traces"
29
29
  | "table.experiment"
30
30
  | "table.model"
@@ -100,8 +100,14 @@ export type MessageKey =
100
100
  | "code.conversation"
101
101
  | "code.noSource"
102
102
  | "code.sourceUnavailable"
103
+ | "attempt.timing"
104
+ | "attempt.teardown"
105
+ | "attempt.diagnostics"
103
106
  | "assert.pass"
104
107
  | "assert.fail"
108
+ | "assert.passedCollapsed"
109
+ | "assert.unavailable"
110
+ | "assert.optional"
105
111
  | "assert.soft"
106
112
  | "assert.evidence"
107
113
  | "verdict.passed"
@@ -130,9 +136,11 @@ const dictionaries: Record<Locale, Dictionary> = {
130
136
  "nav.label": "Report",
131
137
  "nav.report": "Report",
132
138
  "nav.experiments": "Experiments",
133
- "nav.runs": "Runs",
139
+ "nav.attempts": "Attempts",
134
140
  "nav.traces": "Traces",
135
- "hero.title": "Eval Run Results",
141
+ // 标题回退链终点的内置文案(shell.md:「Eval 运行结果 / Eval Results」);
142
+ // 正常路径 server 侧已走完回退链,这里只兜旧数据 / 缺声明。
143
+ "hero.title": "Eval Results",
136
144
  "hero.lastRun": "Last run:",
137
145
  "hero.noRuns": "No runs yet",
138
146
  "metric.passRate": "Pass Rate",
@@ -140,13 +148,13 @@ const dictionaries: Record<Locale, Dictionary> = {
140
148
  "metric.duration": "Duration",
141
149
  "metric.cost": "Estimated Cost",
142
150
  "section.experiments": "Experiments",
143
- "section.individualRuns": "Individual Runs",
151
+ "section.attempts": "Attempts",
144
152
  "section.traces": "Traces",
145
153
  "search.experiments": "Filter experiment, agent, model, or eval...",
146
- "search.runs": "Filter eval ID or experiment...",
154
+ "search.attempts": "Filter eval ID or experiment...",
147
155
  "empty.summary": "No snapshots found. Run niceeval or pass niceeval view path/to/snapshot.json.",
148
- "empty.individualRuns": "No individual runs found.",
149
- "empty.runsFilter": "No results match the filter.",
156
+ "empty.attempts": "No attempts found.",
157
+ "empty.attemptsFilter": "No results match the filter.",
150
158
  "empty.traces": "No traces available. Traces are collected during eval runs when artifacts are saved.",
151
159
  "table.experiment": "Experiment",
152
160
  "table.model": "Model",
@@ -222,8 +230,14 @@ const dictionaries: Record<Locale, Dictionary> = {
222
230
  "code.conversation": "conversation",
223
231
  "code.noSource": "Source was not captured. This run may predate source-loc or the source may be unavailable. Re-run this eval to see the code view.",
224
232
  "code.sourceUnavailable": "Source was captured for this run, but its artifact files are missing from this deployment. Re-export with `niceeval view --out <dir>` (directory mode bundles artifacts), or open the results locally with `niceeval view`.",
233
+ "attempt.timing": "timing",
234
+ "attempt.teardown": "teardown (not counted in total)",
235
+ "attempt.diagnostics": "diagnostics",
225
236
  "assert.pass": "pass",
226
237
  "assert.fail": "fail",
238
+ "assert.passedCollapsed": "{{count}} passed",
239
+ "assert.unavailable": "unavailable",
240
+ "assert.optional": "optional",
227
241
  "assert.soft": "soft",
228
242
  "assert.evidence": "What was checked",
229
243
  "verdict.passed": "passed",
@@ -249,7 +263,7 @@ const dictionaries: Record<Locale, Dictionary> = {
249
263
  "nav.label": "报告",
250
264
  "nav.report": "报告",
251
265
  "nav.experiments": "实验",
252
- "nav.runs": "运行",
266
+ "nav.attempts": "Attempts",
253
267
  "nav.traces": "追踪",
254
268
  "hero.title": "Eval 运行结果",
255
269
  "hero.lastRun": "最近运行:",
@@ -259,13 +273,13 @@ const dictionaries: Record<Locale, Dictionary> = {
259
273
  "metric.duration": "耗时",
260
274
  "metric.cost": "预估成本",
261
275
  "section.experiments": "实验",
262
- "section.individualRuns": "单次运行",
276
+ "section.attempts": "Attempts",
263
277
  "section.traces": "追踪",
264
278
  "search.experiments": "筛选实验、agent、model 或 eval...",
265
- "search.runs": "筛选 eval ID 或实验...",
279
+ "search.attempts": "筛选 eval ID 或实验...",
266
280
  "empty.summary": "没有找到快照。请先运行 niceeval,或传入 niceeval view path/to/snapshot.json。",
267
- "empty.individualRuns": "没有单次运行结果。",
268
- "empty.runsFilter": "没有匹配筛选条件的结果。",
281
+ "empty.attempts": "还没有 attempt。",
282
+ "empty.attemptsFilter": "没有匹配筛选条件的结果。",
269
283
  "empty.traces": "没有可用追踪。保存 artifact 的 eval run 会收集 traces。",
270
284
  "table.experiment": "实验",
271
285
  "table.model": "模型",
@@ -321,7 +335,7 @@ const dictionaries: Record<Locale, Dictionary> = {
321
335
  "trace.clickDetails": "点击行查看详情",
322
336
  "trace.enableHint": "这次运行没有 trace。接入 OTel 才有调用瀑布图——看",
323
337
  "trace.enableHintLink": "OTel 接入指南",
324
- "trace.enableHintUrl": "https://niceeval.com/docs/zh/guides/connect-otel",
338
+ "trace.enableHintUrl": "https://niceeval.com/docs/zh/how-to/connect-otel",
325
339
  "transcript.noEvents": "没有事件",
326
340
  "transcript.user": "user",
327
341
  "transcript.assistant": "assistant",
@@ -341,8 +355,14 @@ const dictionaries: Record<Locale, Dictionary> = {
341
355
  "code.conversation": "会话",
342
356
  "code.noSource": "源码未捕获。此 run 可能早于 source-loc,或源码不可读。重跑此 eval 即可看到代码视图。",
343
357
  "code.sourceUnavailable": "此 run 捕获过源码,但当前部署里缺少它的 artifact 文件。用 `niceeval view --out <目录>` 重新导出(目录模式会带上 artifact),或在本地 `niceeval view` 查看。",
358
+ "attempt.timing": "耗时",
359
+ "attempt.teardown": "收尾(不计入总耗时)",
360
+ "attempt.diagnostics": "诊断",
344
361
  "assert.pass": "通过",
345
362
  "assert.fail": "失败",
363
+ "assert.passedCollapsed": "{{count}} 条通过",
364
+ "assert.unavailable": "评不了",
365
+ "assert.optional": "可缺席",
346
366
  "assert.soft": "soft",
347
367
  "assert.evidence": "实际被检查的内容",
348
368
  "verdict.passed": "通过",
@@ -1,3 +1,4 @@
1
+ // cases: docs/engineering/unit-tests/reports/cases.md
1
2
  // #/attempt/@<locator> 深链的纯函数单测:解析 / 格式化往返、坏输入、按 locator 定位。
2
3
 
3
4
  import { describe, expect, it } from "vitest";
@@ -1,5 +1,7 @@
1
- import type { Assertion, Verdict, ViewResult } from "../types.ts";
1
+ import type { Verdict, ViewResult } from "../types.ts";
2
2
  import type { T } from "../shared.ts";
3
+ import { compactAssertionSummary, primaryAssertionSummary } from "../../../scoring/display.ts";
4
+ import type { Verdict as CoreVerdict } from "../../../scoring/types.ts";
3
5
 
4
6
  export function verdictClass(verdict: Verdict): string {
5
7
  return verdict === "passed" ? "good" : verdict === "errored" ? "infra-err" : verdict === "failed" ? "bad" : "warn";
@@ -13,13 +15,9 @@ export function verdictLabel(verdict: Verdict, t: T): string {
13
15
  return verdict || "—";
14
16
  }
15
17
 
16
- // Only gate-severity failures are eval "failure reasons"; soft failures show as scores
17
- export function failingAssertions(result: ViewResult): Assertion[] {
18
- return (result.assertions || []).filter((a: Assertion) => !a.passed && a.severity === "gate");
19
- }
20
-
21
- export function reasonFor(result: ViewResult, failedGates: Assertion[]): string {
22
- if (result.error) return result.error;
18
+ export function reasonFor(result: ViewResult): string {
19
+ if (result.error) return result.error.message;
23
20
  if (result.skipReason) return result.skipReason;
24
- return failedGates.map((a: Assertion) => (a.detail ? `${a.name}: ${a.detail}` : a.name)).join(", ");
21
+ const summary = primaryAssertionSummary(result.assertions ?? [], result.verdict as CoreVerdict);
22
+ return summary ? compactAssertionSummary(summary) : "";
25
23
  }
@@ -11,14 +11,19 @@ const emptyViewData: ViewData = {
11
11
 
12
12
  const initialData: ViewData = window.__NICEEVAL_VIEW_DATA__ ?? emptyViewData;
13
13
 
14
- // 报告槽:server 把报告树的静态 HTML 烘成 en / zh-CN 两个 <template> 静态块
15
- // (__NICEEVAL_VIEW_DATA__ 旁)。前端按当前界面语言把对应块摆进报告槽位置,
16
- // 切语言即换块;不解析、不 hydrate
17
- const reportHtml: ReportSlotHtml = {
18
- en: document.getElementById("niceeval-report-en")?.innerHTML ?? "",
19
- "zh-CN": document.getElementById("niceeval-report-zh-CN")?.innerHTML ?? "",
20
- };
14
+ // 报告页:server 把每页的静态 HTML 烘成 <template id="niceeval-report-<pageId>-<locale>">
15
+ // 静态块(__NICEEVAL_VIEW_DATA__ 旁)。前端按当前页与界面语言把对应块摆进报告槽位置,
16
+ // 切页 / 切语言即换块;不解析、不 hydrate。页 id 来自 viewData.report.pages;
17
+ // 旧数据 / 缺声明时按单页 `report` 兜底。
18
+ const pageIds = initialData.report?.pages?.length ? initialData.report.pages.map((p) => p.id) : ["report"];
19
+ const reportPages: Record<string, ReportSlotHtml> = {};
20
+ for (const id of pageIds) {
21
+ reportPages[id] = {
22
+ en: document.getElementById(`niceeval-report-${id}-en`)?.innerHTML ?? "",
23
+ "zh-CN": document.getElementById(`niceeval-report-${id}-zh-CN`)?.innerHTML ?? "",
24
+ };
25
+ }
21
26
 
22
27
  const rootEl = document.getElementById("root");
23
28
  if (!rootEl) throw new Error("Missing #root element");
24
- createRoot(rootEl).render(<App data={initialData} reportHtml={reportHtml} />);
29
+ createRoot(rootEl).render(<App data={initialData} reportPages={reportPages} />);
@@ -4,7 +4,7 @@ import { verdictClass, verdictLabel } from "../lib/verdict.ts";
4
4
  import { formatCost, formatDateTime, formatDuration, formatTokens, totalTokens } from "../lib/format.ts";
5
5
 
6
6
  /** 全部历史 attempt 打平成一张表;列表在 App 里由 flattenAttempts(全部快照,已跨快照去重)算好。 */
7
- export function RunsView({ attempts, t }: { attempts: RowRun[]; t: T }) {
7
+ export function AttemptsView({ attempts, t }: { attempts: RowRun[]; t: T }) {
8
8
  const [query, setQuery] = useState("");
9
9
  const allRuns = attempts;
10
10
  const filtered = allRuns.filter((r: RowRun) => {
@@ -12,14 +12,14 @@ export function RunsView({ attempts, t }: { attempts: RowRun[]; t: T }) {
12
12
  return !q || `${r.id} ${r.rowLabel} ${r.rowAgent} ${r.rowModel || ""}`.toLowerCase().includes(q);
13
13
  });
14
14
  return (
15
- <section id="tab-runs">
15
+ <section id="tab-attempts">
16
16
  <div className="section-head">
17
- <h2>{t("section.individualRuns")}</h2>
17
+ <h2>{t("section.attempts")}</h2>
18
18
  <div className="controls">
19
19
  <input
20
20
  className="search"
21
21
  type="search"
22
- placeholder={t("search.runs")}
22
+ placeholder={t("search.attempts")}
23
23
  autoComplete="off"
24
24
  value={query}
25
25
  onChange={(e) => setQuery(e.target.value)}
@@ -27,7 +27,7 @@ export function RunsView({ attempts, t }: { attempts: RowRun[]; t: T }) {
27
27
  </div>
28
28
  </div>
29
29
  {!allRuns.length ? (
30
- <div className="empty">{t("empty.individualRuns")}</div>
30
+ <div className="empty">{t("empty.attempts")}</div>
31
31
  ) : (
32
32
  <div className="table-wrap">
33
33
  <table>
@@ -67,7 +67,7 @@ export function RunsView({ attempts, t }: { attempts: RowRun[]; t: T }) {
67
67
  ) : (
68
68
  <tr>
69
69
  <td colSpan={9} style={{ textAlign: "center", color: "var(--muted)" }}>
70
- {t("empty.runsFilter")}
70
+ {t("empty.attemptsFilter")}
71
71
  </td>
72
72
  </tr>
73
73
  )}
@@ -18,10 +18,13 @@ export type {
18
18
  ReportSlotHtml,
19
19
  SkippedRunNotice,
20
20
  ViewData,
21
+ ViewReportMeta,
22
+ ViewReportPageMeta,
21
23
  ViewSnapshot,
22
24
  } from "../shared/types.ts";
23
25
 
24
- export type Tab = "report" | "runs" | "traces";
26
+ /** 导航 tab:报告页(`page:<id>`,路由 `#/page/<id>`)在前,内置证据页 Attempts / Traces 恒在其后。 */
27
+ export type Tab = `page:${string}` | "attempts" | "traces";
25
28
 
26
29
  /** 前端拿到的单条 attempt 结果就是瘦身后的 EvalResult(locator / artifactBase 由 loader 注入)。 */
27
30
  export type ViewResult = ViewEvalResult;
@@ -1,3 +1,4 @@
1
+ // cases: docs/engineering/unit-tests/reports/cases.md
1
2
  // 回归覆盖:src/results/open.ts 把 sources.json 从「全量 SourceArtifact[]」改成两层去重存储
2
3
  // (attempt 级引用 `{path, sha256}[]` + 快照根 `sources/<sha256>.json` 内容仓库,见 memory/
3
4
  // attempt-locator-and-source-dedup.md)之后,view 的两条 artifact 出口(server.ts 的
@@ -118,7 +119,7 @@ describe("index.ts · copyFetchedArtifacts(--out 静态导出)对 sources.json
118
119
  await seedDedupedSnapshot(root);
119
120
 
120
121
  const out = join(root, "site");
121
- await buildView({ input: root, out });
122
+ await buildView({ input: root, out , allowSensitiveArtifacts: true });
122
123
 
123
124
  const scan = await loadViewScan(root);
124
125
  const byId = new Map(scan.viewData.snapshots.flatMap((s) => s.results.map((r) => [r.id, r])));
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-bold:700;--radius-md:.375rem;--radius-xl:.75rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-panel:var(--panel);--color-panel-2:var(--panel-2);--color-line:var(--line);--color-line-strong:var(--line-strong);--color-text:var(--text);--color-muted:var(--muted)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.top-1\/2{top:50%}.left-1\/2{left:50%}.z-\[200\]{z-index:200}.mt-3{margin-top:calc(var(--spacing) * 3)}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.h-7{height:calc(var(--spacing) * 7)}.max-h-\[min\(86vh\,820px\)\]{max-height:min(86vh,820px)}.w-7{width:calc(var(--spacing) * 7)}.w-\[min\(1120px\,calc\(100vw-48px\)\)\]{width:min(1120px,100vw - 48px)}.w-fit{width:fit-content}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.cursor-pointer{cursor:pointer}.flex-col{flex-direction:column}.place-items-center{place-items:center}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-3{gap:calc(var(--spacing) * 3)}.gap-\[3px\]{gap:3px}.gap-\[22px\]{gap:22px}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-\[5px\]{border-radius:5px}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-none{--tw-border-style:none;border-style:none}.border-current{border-color:currentColor}.border-line{border-color:var(--color-line)}.border-line-strong{border-color:var(--color-line-strong)}.border-transparent{border-color:#0000}.bg-black\/90{background-color:#000000e6}@supports (color:color-mix(in lab, red, red)){.bg-black\/90{background-color:color-mix(in oklab, var(--color-black) 90%, transparent)}}.bg-current\/10{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.bg-current\/10{background-color:color-mix(in oklab, currentcolor 10%, transparent)}}.bg-panel{background-color:var(--color-panel)}.bg-transparent{background-color:#0000}.p-0{padding:0}.px-\[7px\]{padding-inline:7px}.px-\[18px\]{padding-inline:18px}.py-px{padding-block:1px}.pt-\[13px\]{padding-top:13px}.pt-\[14px\]{padding-top:14px}.pb-\[11px\]{padding-bottom:11px}.pb-\[18px\]{padding-bottom:18px}.font-\[inherit\]{font-family:inherit}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-\[640\]{--tw-font-weight:640;font-weight:640}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.tracking-\[0\.05em\]{--tw-tracking:.05em;letter-spacing:.05em}.text-muted{color:var(--color-muted)}.text-text{color:var(--color-text)}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.shadow-\[0_20px_60px_rgba\(0\,0\,0\,0\.45\)\]{--tw-shadow:0 20px 60px var(--tw-shadow-color,#00000073);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:border-line:hover{border-color:var(--color-line)}.hover\:bg-panel-2:hover{background-color:var(--color-panel-2)}.hover\:text-text:hover{color:var(--color-text)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.data-\[state\=active\]\:font-\[560\][data-state=active]{--tw-font-weight:560;font-weight:560}.data-\[state\=active\]\:text-text[data-state=active]{color:var(--color-text)}@media not all and (width>=760px){.max-\[760px\]\:hidden{display:none}}}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--bg:var(--lightningcss-light,#fafafa)var(--lightningcss-dark,#050505);--panel:var(--lightningcss-light,#fff)var(--lightningcss-dark,#0b0b0b);--panel-2:var(--lightningcss-light,#f4f4f5)var(--lightningcss-dark,#111);--line:var(--lightningcss-light,#dedee2)var(--lightningcss-dark,#262626);--line-strong:var(--lightningcss-light,#c9c9cf)var(--lightningcss-dark,#343434);--text:var(--lightningcss-light,#111113)var(--lightningcss-dark,#ededed);--muted:var(--lightningcss-light,#62636a)var(--lightningcss-dark,#a1a1aa);--soft:var(--lightningcss-light,#8b8d98)var(--lightningcss-dark,#74747b);--good:var(--lightningcss-light,#087f5b)var(--lightningcss-dark,#3ddc97);--bad:var(--lightningcss-light,#b42318)var(--lightningcss-dark,#ff6b6b);--warn:var(--lightningcss-light,#9a6700)var(--lightningcss-dark,#e8b84a);--blue:var(--lightningcss-light,#1d63d8)var(--lightningcss-dark,#6ea8fe);--focus:var(--lightningcss-light,#111113)var(--lightningcss-dark,#ededed);--series-1:var(--lightningcss-light,#2a78d6)var(--lightningcss-dark,#3987e5);--series-2:var(--lightningcss-light,#1baf7a)var(--lightningcss-dark,#199e70);--series-3:var(--lightningcss-light,#eda100)var(--lightningcss-dark,#c98500);--series-4:var(--lightningcss-light,#008300)var(--lightningcss-dark,#008300);--series-5:var(--lightningcss-light,#e34948)var(--lightningcss-dark,#e66767);--series-6:var(--lightningcss-light,#eb6834)var(--lightningcss-dark,#d95926);font-family:ui-sans-serif,-apple-system,BlinkMacSystemFont,SF Pro Text,Segoe UI,sans-serif}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}*{box-sizing:border-box}html{scrollbar-gutter:stable;overflow-y:scroll}body{background:var(--bg);color:var(--text);letter-spacing:0;margin:0}a{color:inherit}.topbar{border-bottom:1px solid var(--line);background:var(--bg);justify-content:space-between;align-items:center;height:64px;padding:0 clamp(20px,5vw,80px);display:flex}@supports (color:color-mix(in lab, red, red)){.topbar{background:color-mix(in oklch, var(--bg), transparent 4%)}}.topbar{z-index:10;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);position:sticky;top:0}.brand{align-items:baseline;gap:12px;font-size:20px;font-weight:690;display:flex}.mark{border:1.25px solid var(--text);width:18px;height:18px;display:inline-block;transform:rotate(45deg)}.lang-switch{border:1px solid var(--line);background:var(--panel);border-radius:7px;flex:none;align-items:center;display:inline-flex;overflow:hidden}.lang-switch button{border:0;border-right:1px solid var(--line);min-width:44px;height:30px;color:var(--muted);font:inherit;cursor:pointer;background:0 0;font-size:12px;line-height:1}.lang-switch button:last-child{border-right:0}.lang-switch button:hover{color:var(--text)}.lang-switch button.is-active{background:var(--panel-2);color:var(--text);font-weight:620}main{width:min(1120px,100vw - 40px);margin:0 auto;padding:clamp(52px,7vw,82px) 0 72px}.hero{text-align:center;max-width:740px;margin:0 auto clamp(38px,6vw,58px)}h1{letter-spacing:0;margin:0;font-size:clamp(42px,5.6vw,66px);font-weight:760;line-height:.94}.subtitle{color:var(--muted);margin:20px auto 0}@supports (color:color-mix(in lab, red, red)){.subtitle{color:color-mix(in oklch, var(--muted), var(--text) 12%)}}.subtitle{max-width:660px;font-size:clamp(17px,2vw,21px);line-height:1.58}.meta{color:var(--muted);flex-wrap:wrap;justify-content:center;gap:14px;margin-top:24px;font-size:14px;display:flex}.meta b{color:var(--text);font-weight:570}.report-slot{margin:0 auto 36px}.incompatible-banner{border:1px solid var(--warn)}@supports (color:color-mix(in lab, red, red)){.incompatible-banner{border:1px solid color-mix(in oklch, var(--warn), var(--line) 35%)}}.incompatible-banner{border-left:3px solid var(--warn);background:var(--warn);border-radius:8px}@supports (color:color-mix(in lab, red, red)){.incompatible-banner{background:color-mix(in oklch, var(--warn), var(--panel) 85%)}}.incompatible-banner{margin:0 auto 36px;padding:12px 16px 14px;font-size:13px}.ib-head{align-items:center;gap:8px;display:flex}.ib-head b{font-weight:640}.ib-icon{width:16px;height:16px;color:var(--warn);stroke-width:2px;flex-shrink:0}.ib-groups{gap:10px;margin-top:10px;display:grid}.ib-group-head{align-items:baseline;gap:8px;display:flex}.ib-group-count{background:var(--warn);border-radius:999px;flex-shrink:0;justify-content:center;align-items:center;min-width:20px;height:20px;padding:0 6px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.ib-group-count{background:color-mix(in oklch, var(--warn), var(--panel) 72%)}}.ib-group-count{color:var(--text);font-variant-numeric:tabular-nums;font-size:11px;font-weight:640}.ib-group-desc{color:var(--soft)}.ib-group ul{gap:3px;margin:5px 0 0;padding:0;list-style:none;display:grid}.ib-group li{align-items:center;gap:8px;min-height:22px;display:flex}.ib-dir{font-family:var(--mono,ui-monospace, monospace);font-weight:560}.ib-more{color:var(--soft);font-size:12px}.ib-copy{border:1px solid var(--line);background:var(--panel);width:22px;height:22px;color:var(--muted);cursor:pointer;border-radius:5px;flex-shrink:0;justify-content:center;align-items:center;transition:color .12s,border-color .12s;display:inline-flex}.ib-copy svg{stroke:currentColor;fill:none;stroke-width:2px;width:12px;height:12px}.ib-copy:hover{color:var(--text);border-color:var(--line-strong)}.ib-copy.is-copied{color:var(--good);border-color:var(--good)}@supports (color:color-mix(in lab, red, red)){.ib-copy.is-copied{border-color:color-mix(in oklch, var(--good), var(--line) 40%)}}.ib-toggle{color:var(--muted);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:4px;margin-top:10px;padding:0;font-size:12px;display:inline-flex}.ib-toggle svg{width:12px;height:12px;transition:transform .12s}.ib-toggle svg.is-open{transform:rotate(90deg)}.ib-toggle:hover{color:var(--text)}.section-head{justify-content:space-between;align-items:end;gap:18px;margin-bottom:16px;display:flex}h2{margin:0;font-size:clamp(24px,2.6vw,31px);font-weight:720;line-height:1.1}.controls{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.search{border:1px solid var(--line);background:var(--panel);min-width:320px;height:36px;color:var(--text);border-radius:7px;outline:none;padding:0 12px}.search:focus{border-color:var(--focus)}.table-wrap{border:1px solid var(--line);background:var(--panel);border-radius:8px;overflow:auto}table{border-collapse:collapse;width:100%;min-width:1040px}th,td{border-bottom:1px solid var(--line);text-align:left;vertical-align:middle;height:52px;padding:0 16px;font-size:14px}th{color:var(--muted);background:var(--panel);z-index:2;font-weight:500;position:sticky;top:0}tbody tr:last-child td{border-bottom:0}.section-sub-head{justify-content:space-between;align-items:center;gap:18px;min-height:36px;margin-bottom:16px;display:flex}.group-detail-label{color:var(--text);font-size:15px;font-weight:680}.name{font-weight:610}.sub{color:var(--muted);margin-top:3px;font-size:12px}.num{font-variant-numeric:tabular-nums;white-space:nowrap;font-feature-settings:"tnum"}.good{color:var(--good)}.bad{color:var(--bad)}.warn,.infra-err{color:var(--warn)}.eval-id{overflow-wrap:anywhere;align-items:center;font-weight:560;display:flex}.copy-all-errors{border:1px solid var(--line);background:var(--panel);height:36px;color:var(--muted);cursor:pointer;white-space:nowrap;border-radius:7px;flex-shrink:0;align-items:center;gap:6px;padding:0 12px;font-family:inherit;font-size:13px;transition:color .12s,border-color .12s,background .12s;display:inline-flex}.copy-all-errors svg{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;width:14px;height:14px}.copy-all-errors:hover{color:var(--text);border-color:var(--line-strong)}.copy-all-errors.is-copied{color:var(--good);border-color:var(--good)}@supports (color:color-mix(in lab, red, red)){.copy-all-errors.is-copied{border-color:color-mix(in oklch, var(--good), var(--line) 40%)}}.copy-all-errors.is-copied{background:var(--good)}@supports (color:color-mix(in lab, red, red)){.copy-all-errors.is-copied{background:color-mix(in oklch, var(--good), transparent 88%)}}.raw-details{border-top:1px solid var(--line);margin-top:16px}@supports (color:color-mix(in lab, red, red)){.raw-details{border-top:1px solid color-mix(in oklch, var(--line), transparent 15%)}}.raw-details{color:var(--muted);padding-top:14px}@supports (color:color-mix(in lab, red, red)){.raw-details{color:color-mix(in oklch, var(--muted), var(--text) 6%)}}.raw-details summary{cursor:pointer;color:var(--muted);-webkit-user-select:none;user-select:none;font-size:13px;font-weight:560}.raw-details pre{margin-top:12px}.raw-note{color:var(--soft);margin-left:8px;font-weight:400}.reason-empty{color:var(--soft)}.ran-at{color:var(--soft);font-variant-numeric:tabular-nums;margin-top:2px;font-size:11px;display:block}.attempt-status{align-items:center;gap:4px;min-width:0;display:flex}.eval-item-clickable{cursor:pointer;-webkit-user-select:none;user-select:none}.eval-item-clickable:hover{background:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){.eval-item-clickable:hover{background:color-mix(in oklch, var(--panel-2), var(--panel) 30%)}}.run-ratio{color:var(--soft)}.eval-attempts{border-left:2px solid var(--accent,var(--line));margin-left:8px;display:grid}@supports (color:color-mix(in lab, red, red)){.eval-attempts{border-left:2px solid color-mix(in oklch, var(--accent,var(--line)), transparent 55%)}}.eval-attempts{background:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){.eval-attempts{background:color-mix(in oklch, var(--panel-2), transparent 55%)}}.eval-attempts .eval-item{padding-left:12px}.eval-attempts .eval-item:last-child{border-bottom:none}.nosource{flex-direction:column;gap:14px;display:flex}.nosource-note{color:var(--muted);border:1px dashed var(--line-strong);padding:9px 12px;font-size:12.5px;line-height:1.55}@supports (color:color-mix(in lab, red, red)){.nosource-note{border:1px dashed color-mix(in oklch, var(--line-strong), transparent 25%)}}.nosource-note{background:var(--panel);border-radius:8px}@supports (color:color-mix(in lab, red, red)){.nosource-note{background:color-mix(in oklch, var(--panel), var(--line) 20%)}}.nosource-block{border:1px solid var(--line);background:var(--panel-2);border-radius:10px;overflow:hidden}.nosource-head{color:var(--muted);background:var(--panel-2);padding:7px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}@supports (color:color-mix(in lab, red, red)){.nosource-head{background:color-mix(in oklch, var(--panel-2), var(--line) 35%)}}.nosource-head{border-bottom:1px solid var(--line)}.nosource-block>.assert-detail,.nosource-block>.transcript{padding:10px 14px}.conv-loading{color:var(--soft);padding:8px 0;font-size:12px}.trace-details{border-bottom:1px solid var(--line)}@supports (color:color-mix(in lab, red, red)){.trace-details{border-bottom:1px solid color-mix(in oklch, var(--line), transparent 35%)}}.trace-details{padding:4px 0 10px}.trace-details summary{cursor:pointer;color:var(--muted);-webkit-user-select:none;user-select:none;padding:4px 0;font-size:12px}.trace-details summary:hover{color:var(--text)}.trace{border:1px solid var(--line);margin:8px 0 4px;padding:10px 12px}@supports (color:color-mix(in lab, red, red)){.trace{border:1px solid color-mix(in oklch, var(--line), transparent 20%)}}.trace{background:var(--panel);border-radius:7px}@supports (color:color-mix(in lab, red, red)){.trace{background:color-mix(in oklch, var(--panel), black 6%)}}.trace-span-meta{color:var(--soft);text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px;font-size:11px}.span-d{border-radius:4px}.span-d>.trace-row{cursor:default}details.span-d>summary.trace-row{cursor:pointer;list-style:none}details.span-d>summary.trace-row::-webkit-details-marker{display:none}details.span-d[open]>summary.trace-row{background:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){details.span-d[open]>summary.trace-row{background:color-mix(in oklch, var(--panel-2), var(--panel) 10%)}}details.span-d>summary.trace-row:hover{background:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){details.span-d>summary.trace-row:hover{background:color-mix(in oklch, var(--panel-2), var(--panel) 20%)}}.trace-row{grid-template-columns:minmax(140px,.9fr) minmax(0,2fr) 56px;align-items:center;column-gap:12px;height:22px;font-size:12px;display:grid}.span-attrs{border-left:2px solid var(--line-strong);margin:2px 0 6px;padding:6px 8px 10px 16px}@supports (color:color-mix(in lab, red, red)){.span-attrs{border-left:2px solid color-mix(in oklch, var(--line-strong), transparent 30%)}}.span-attrs{font-size:12px}.attr-row{grid-template-columns:minmax(120px,220px) 1fr;column-gap:12px;padding:2px 0;display:grid}.attr-k{color:var(--soft);overflow-wrap:anywhere}.attr-v{color:var(--text);overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.attr-io{margin:4px 0}.attr-io .attr-k{text-transform:uppercase;letter-spacing:.05em;margin-bottom:3px;font-size:11px;display:block}.attr-pre{border:1px solid var(--line);background:var(--panel);border-radius:6px;max-height:220px;margin:0;padding:8px 10px;overflow:auto}@supports (color:color-mix(in lab, red, red)){.attr-pre{background:color-mix(in oklch, var(--panel), black 8%)}}.attr-pre{color:var(--muted);white-space:pre-wrap;overflow-wrap:anywhere;font-size:11px;line-height:1.45}.trace-label{text-overflow:ellipsis;white-space:nowrap;color:var(--muted);overflow:hidden}@supports (color:color-mix(in lab, red, red)){.trace-label{color:color-mix(in oklch, var(--muted), var(--text) 12%)}}.trace-track{background:var(--panel-2);border-radius:3px;height:12px;position:relative}@supports (color:color-mix(in lab, red, red)){.trace-track{background:color-mix(in oklch, var(--panel-2), var(--panel) 20%)}}.trace-bar{background:var(--good);border-radius:3px;min-width:2px;height:12px;position:absolute;top:0}.trace-bar.bad{background:var(--bad)}.trace-bar.k-model{background:oklch(72% .13 250)}.trace-bar.k-tool{background:oklch(74% .14 150)}.trace-bar.k-agent{background:oklch(74% .15 300)}.trace-bar.k-turn{background:oklch(78% .13 90)}.trace-bar.k-other{background:var(--soft)}@supports (color:color-mix(in lab, red, red)){.trace-bar.k-other{background:color-mix(in oklch, var(--soft), var(--panel) 30%)}}.trace-dur{color:var(--soft);text-align:right}.kind-chip{text-transform:uppercase;letter-spacing:.03em;color:var(--panel);vertical-align:middle;border-radius:3px;margin-right:6px;padding:0 5px;font-size:10px;font-weight:600;display:inline-block}.kind-chip.k-model{background:oklch(72% .13 250)}.kind-chip.k-tool{background:oklch(74% .14 150)}.kind-chip.k-agent{background:oklch(74% .15 300)}.kind-chip.k-turn{background:oklch(78% .13 90)}.transcript{flex-direction:column;gap:6px;margin:8px 0 4px;display:flex}.ts-msg{border:1px solid var(--line);border-radius:7px;padding:8px 11px}@supports (color:color-mix(in lab, red, red)){.ts-msg{border:1px solid color-mix(in oklch, var(--line), transparent 30%)}}.ts-msg{background:var(--panel)}@supports (color:color-mix(in lab, red, red)){.ts-msg{background:color-mix(in oklch, var(--panel), black 4%)}}.ts-assistant{border-left:2px solid var(--good)}.ts-user{border-left:2px solid var(--line-strong)}.ts-input{border-left:2px solid var(--warn)}.ts-role{text-transform:uppercase;letter-spacing:.07em;color:var(--soft);margin-bottom:4px;font-size:10px;display:block}.ts-text{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text);max-height:360px;font-size:13px;line-height:1.55;overflow:auto}.ts-think{font-size:12px}.ts-think>summary{cursor:pointer;color:var(--soft);padding:2px 0;font-style:italic;list-style:none}.ts-think>summary::-webkit-details-marker{display:none}.ts-think>summary:before{content:"✦ "}.ts-think-text{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--muted);max-height:280px;padding:4px 0 6px 16px;font-style:italic;overflow:auto}.ts-tool-d{border:1px solid var(--line)}@supports (color:color-mix(in lab, red, red)){.ts-tool-d{border:1px solid color-mix(in oklch, var(--line), transparent 30%)}}.ts-tool-d{background:var(--panel);border-radius:7px}@supports (color:color-mix(in lab, red, red)){.ts-tool-d{background:color-mix(in oklch, var(--panel), black 6%)}}.ts-tool-d>summary.ts-row{cursor:pointer;grid-template-columns:8px minmax(110px,max-content) 1fr;align-items:center;column-gap:9px;padding:7px 11px;list-style:none;display:grid}.ts-tool-d>summary.ts-row::-webkit-details-marker{display:none}.ts-tool-d[open]>summary.ts-row{border-bottom:1px solid var(--line)}@supports (color:color-mix(in lab, red, red)){.ts-tool-d[open]>summary.ts-row{border-bottom:1px solid color-mix(in oklch, var(--line), transparent 40%)}}.ts-tool-d>summary.ts-row:hover{background:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){.ts-tool-d>summary.ts-row:hover{background:color-mix(in oklch, var(--panel-2), var(--panel) 20%)}}.ts-dot{background:var(--good);border-radius:50%;width:8px;height:8px}.ts-dot.bad{background:var(--bad)}.ts-dot.warn{background:var(--warn)}.ts-dot.pending{background:var(--soft)}.ts-tool{color:var(--text);white-space:nowrap;text-overflow:ellipsis;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;font-weight:600;overflow:hidden}.ts-preview{color:var(--soft);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.ts-body{flex-direction:column;gap:8px;padding:8px 11px 10px;display:flex}.ts-field .ts-k{text-transform:uppercase;letter-spacing:.05em;color:var(--soft);margin-bottom:3px;font-size:10px;display:block}.ts-error{border:1px solid var(--bad);border-radius:7px;padding:8px 11px}@supports (color:color-mix(in lab, red, red)){.ts-error{border:1px solid color-mix(in oklch, var(--bad), transparent 55%)}}.ts-error{color:var(--bad);font-size:12.5px}.ts-compaction{text-align:center;color:var(--soft);text-transform:uppercase;letter-spacing:.06em;padding:2px 0;font-size:11px}pre{border:1px solid var(--line);background:var(--panel);border-radius:7px;margin:0;padding:12px}@supports (color:color-mix(in lab, red, red)){pre{background:color-mix(in oklch, var(--panel), black 8%)}}pre{color:var(--muted);overflow-wrap:anywhere;max-height:360px;font-size:12px;line-height:1.5;overflow:auto}.empty{border:1px dashed var(--line-strong);color:var(--muted);text-align:center;background:var(--panel);border-radius:8px;padding:40px 24px}a.brand{color:inherit;text-decoration:none}a.brand:hover{opacity:.75}.traces-entry{border:1px solid var(--line);background:var(--panel);border-radius:8px;margin-bottom:12px;padding:14px 18px}.traces-entry-head{align-items:baseline;gap:12px;margin-bottom:8px;font-size:13px;display:flex}.traces-verdict{min-width:52px;font-weight:600}.traces-exp{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.traces-dur{color:var(--soft)}@media (width<=760px){.topbar{padding:0 20px}.lang-switch button{min-width:40px}main{width:min(100vw - 28px,1120px);padding-top:42px}.hero{text-align:left;margin-left:0}.meta{justify-content:flex-start}.section-head{flex-direction:column;align-items:stretch}.search{width:100%;min-width:0}.detail{padding:18px 16px 20px}.config-strip{gap:6px}.detail-kpis{grid-template-columns:repeat(2,minmax(0,1fr));row-gap:10px}.eval-grid-head,.eval-item{grid-template-columns:72px minmax(180px,1fr) minmax(220px,1fr) 76px 78px 72px 50px}}.modal-error{color:var(--bad);background:var(--bad);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}@supports (color:color-mix(in lab, red, red)){.modal-error{background:color-mix(in oklch, var(--bad), transparent 92%)}}.modal-error{border:1px solid var(--bad)}@supports (color:color-mix(in lab, red, red)){.modal-error{border:1px solid color-mix(in oklch, var(--bad), var(--line) 50%)}}.modal-error{white-space:pre-wrap;word-break:break-word;border-radius:8px;margin-bottom:12px;padding:8px 10px}.codeview{flex-direction:column;gap:14px;display:flex}.code-file{border:1px solid var(--line);background:var(--panel);border-radius:10px;overflow:hidden}.code-file-head{color:var(--muted);background:var(--panel-2);padding:7px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}@supports (color:color-mix(in lab, red, red)){.code-file-head{background:color-mix(in oklch, var(--panel-2), var(--line) 35%)}}.code-file-head{border-bottom:1px solid var(--line)}.code-lines{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;line-height:1.7;overflow-x:auto}.code-lines::-webkit-scrollbar{height:8px}.code-lines::-webkit-scrollbar-track{background:0 0}.code-lines::-webkit-scrollbar-thumb{background:var(--line-strong);border-radius:4px}.code-lines::-webkit-scrollbar-thumb:hover{background:var(--soft)}.code-line{border-left:3px solid #0000;grid-template-columns:46px 22px minmax(0,1fr) auto;align-items:center;width:max-content;min-width:100%;display:grid}.code-line.line-clickable{cursor:pointer}.code-line.line-clickable:hover{background:var(--panel)}@supports (color:color-mix(in lab, red, red)){.code-line.line-clickable:hover{background:color-mix(in oklch, var(--panel), var(--line) 45%)}}.code-line.line-send{background:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-send{background:color-mix(in oklch, var(--blue), var(--panel) 88%)}}.code-line.line-send{border-left-color:var(--blue)}.code-line.line-send .ln{background:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-send .ln{background:color-mix(in oklch, var(--blue), var(--panel) 74%)}}.code-line.line-send .ln{color:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-send .ln{color:color-mix(in oklch, var(--blue), var(--text) 45%)}}.code-line.line-send.line-clickable:hover{background:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-send.line-clickable:hover{background:color-mix(in oklch, var(--blue), var(--panel) 82%)}}.code-line.is-open{background:var(--panel)}@supports (color:color-mix(in lab, red, red)){.code-line.is-open{background:color-mix(in oklch, var(--panel), var(--line) 34%)}}.code-line.line-pass{background:var(--good)}@supports (color:color-mix(in lab, red, red)){.code-line.line-pass{background:color-mix(in oklch, var(--good), var(--panel) 58%)}}.code-line.line-pass{border-left-color:var(--good)}.code-line.line-pass .ln{background:var(--good)}@supports (color:color-mix(in lab, red, red)){.code-line.line-pass .ln{background:color-mix(in oklch, var(--good), var(--panel) 34%)}}.code-line.line-pass .ln{color:var(--text)}.code-line.line-fail{background:var(--bad)}@supports (color:color-mix(in lab, red, red)){.code-line.line-fail{background:color-mix(in oklch, var(--bad), var(--panel) 58%)}}.code-line.line-fail{border-left-color:var(--bad)}.code-line.line-fail .ln{background:var(--bad)}@supports (color:color-mix(in lab, red, red)){.code-line.line-fail .ln{background:color-mix(in oklch, var(--bad), var(--panel) 34%)}}.code-line.line-fail .ln{color:var(--text)}.code-line.line-warn{background:var(--warn)}@supports (color:color-mix(in lab, red, red)){.code-line.line-warn{background:color-mix(in oklch, var(--warn), var(--panel) 58%)}}.code-line.line-warn{border-left-color:var(--warn)}.code-line.line-warn .ln{background:var(--warn)}@supports (color:color-mix(in lab, red, red)){.code-line.line-warn .ln{background:color-mix(in oklch, var(--warn), var(--panel) 34%)}}.code-line.line-warn .ln{color:var(--text)}.code-line.line-pass.line-clickable:hover{background:var(--good)}@supports (color:color-mix(in lab, red, red)){.code-line.line-pass.line-clickable:hover{background:color-mix(in oklch, var(--good), var(--panel) 64%)}}.code-line.line-fail.line-clickable:hover{background:var(--bad)}@supports (color:color-mix(in lab, red, red)){.code-line.line-fail.line-clickable:hover{background:color-mix(in oklch, var(--bad), var(--panel) 64%)}}.code-line.line-warn.line-clickable:hover{background:var(--warn)}@supports (color:color-mix(in lab, red, red)){.code-line.line-warn.line-clickable:hover{background:color-mix(in oklch, var(--warn), var(--panel) 64%)}}.ln{text-align:right;color:var(--soft);-webkit-user-select:none;user-select:none;justify-content:flex-end;align-self:stretch;align-items:center;padding:1px 8px 1px 0;font-size:11px;display:flex}.gmark{justify-content:center;align-items:center;display:inline-flex}.gstat{flex-shrink:0;width:13px;height:13px}.gstat.good{color:var(--good)}.gstat.bad{color:var(--bad)}.gstat.warn{color:var(--warn)}.gsend{width:13px;height:13px;color:var(--blue);flex-shrink:0}.ctext{white-space:pre;color:var(--text);padding-left:8px}.lbadges{white-space:nowrap;justify-self:end;align-items:center;gap:6px;padding-right:12px;display:inline-flex}.abadge{border:1px solid #0000;border-radius:5px;padding:0 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;font-weight:650}.abadge.good{color:var(--good);border-color:var(--good)}@supports (color:color-mix(in lab, red, red)){.abadge.good{border-color:color-mix(in oklch, var(--good), var(--line) 55%)}}.abadge.good{background:var(--good)}@supports (color:color-mix(in lab, red, red)){.abadge.good{background:color-mix(in oklch, var(--good), transparent 90%)}}.abadge.bad{color:var(--bad);border-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.abadge.bad{border-color:color-mix(in oklch, var(--bad), var(--line) 55%)}}.abadge.bad{background:var(--bad)}@supports (color:color-mix(in lab, red, red)){.abadge.bad{background:color-mix(in oklch, var(--bad), transparent 90%)}}.abadge.warn{color:var(--warn);border-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.abadge.warn{border-color:color-mix(in oklch, var(--warn), var(--line) 55%)}}.abadge.warn{background:var(--warn)}@supports (color:color-mix(in lab, red, red)){.abadge.warn{background:color-mix(in oklch, var(--warn), transparent 90%)}}.abadge-th{opacity:.55;font-weight:400}.reply-hint{letter-spacing:.02em;color:var(--muted);border:1px solid var(--line-strong);font-size:10px;font-weight:650}@supports (color:color-mix(in lab, red, red)){.reply-hint{border:1px solid color-mix(in oklch, var(--line-strong), transparent 12%)}}.reply-hint{background:var(--panel);border-radius:5px;padding:1px 7px}@supports (color:color-mix(in lab, red, red)){.reply-hint{background:color-mix(in oklch, var(--panel), var(--line) 28%)}}.reply-hint{transition:color .12s,border-color .12s,background .12s}.code-line.line-send .reply-hint{color:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-send .reply-hint{color:color-mix(in oklch, var(--blue), var(--text) 30%)}}.code-line.line-send .reply-hint{border-color:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-send .reply-hint{border-color:color-mix(in oklch, var(--blue), var(--line) 55%)}}.code-line.line-send .reply-hint{background:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-send .reply-hint{background:color-mix(in oklch, var(--blue), transparent 88%)}}.code-line.line-clickable:hover .reply-hint{color:var(--text);border-color:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-clickable:hover .reply-hint{border-color:color-mix(in oklch, var(--blue), var(--line) 30%)}}.code-line.line-clickable:hover .reply-hint{background:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-clickable:hover .reply-hint{background:color-mix(in oklch, var(--blue), transparent 80%)}}.line-chev{width:14px;height:14px;color:var(--soft);transition:transform .12s,color .12s}.line-chev.is-open{transform:rotate(90deg)}.code-line.line-clickable:hover .line-chev{color:var(--text)}.line-detail{font-family:var(--sans,-apple-system, system-ui, "Segoe UI", sans-serif);white-space:normal;background:var(--panel);padding:10px 16px 12px 60px}@supports (color:color-mix(in lab, red, red)){.line-detail{background:color-mix(in oklch, var(--panel), var(--line) 22%)}}.line-detail{border-left:3px solid var(--line-strong);font-size:12.5px}.reply-panel{border-left-color:var(--blue);flex-direction:column;gap:9px;display:flex}@supports (color:color-mix(in lab, red, red)){.reply-panel{border-left-color:color-mix(in oklch, var(--blue), var(--line) 40%)}}.reply-role{text-transform:uppercase;letter-spacing:.05em;color:var(--blue);margin-bottom:2px;font-size:10px;display:block}.reply-text{color:var(--text);white-space:pre-wrap;word-break:break-word}.reply-think{color:var(--muted);font-size:12px}.reply-think summary{cursor:pointer;-webkit-user-select:none;user-select:none}.reply-think-text{white-space:pre-wrap;color:var(--soft);margin-top:4px;padding-left:4px}.reply-tool{color:var(--text);flex-wrap:wrap;gap:8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;display:flex}.reply-tool-name{color:var(--warn)}.reply-tool-out{color:var(--muted)}.reply-err{color:var(--bad);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.reply-empty{color:var(--soft)}.assert-detail{flex-direction:column;gap:9px;display:flex}.assert-row{grid-template-columns:auto minmax(0,1fr) auto;align-items:baseline;gap:8px;display:grid}.assert-name{color:var(--text);overflow-wrap:anywhere;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.assert-sev{color:var(--soft);text-transform:uppercase;letter-spacing:.04em;font-size:10px}.assert-score{color:var(--muted);white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.assert-reason{color:var(--muted);white-space:pre-wrap;grid-column:1/-1;font-size:12px}.assert-evidence{grid-column:1/-1;margin-top:2px}.assert-evidence>summary{cursor:pointer;-webkit-user-select:none;user-select:none;color:var(--soft);letter-spacing:.02em;font-size:11px}.assert-evidence>summary:hover{color:var(--text)}.assert-evidence-pre{color:var(--text);white-space:pre-wrap;overflow-wrap:anywhere;background:var(--panel);margin:6px 0 0;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.assert-evidence-pre{background:color-mix(in oklch, var(--panel), var(--line) 24%)}}.assert-evidence-pre{border:1px solid var(--line);border-radius:7px;max-height:260px;overflow-y:auto}.code-orphans{border:1px solid var(--line);border-radius:10px;padding:10px 12px}.code-orphans-head{color:var(--muted);margin-bottom:8px;font-size:11px}.tok-comment{color:var(--soft);font-style:italic}.tok-str{color:var(--lightningcss-light,#0a7d3c)var(--lightningcss-dark,#7ee787)}.tok-kw{color:var(--lightningcss-light,#9333ea)var(--lightningcss-dark,#c792ea)}.tok-num{color:var(--lightningcss-light,#b25000)var(--lightningcss-dark,#f0a36b)}.tok-fn{color:var(--lightningcss-light,#0b62d6)var(--lightningcss-dark,#82aaff)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-bold:700;--radius-md:.375rem;--radius-xl:.75rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-panel:var(--panel);--color-panel-2:var(--panel-2);--color-line:var(--line);--color-line-strong:var(--line-strong);--color-text:var(--text);--color-muted:var(--muted)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.top-1\/2{top:50%}.left-1\/2{left:50%}.z-\[200\]{z-index:200}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.h-7{height:calc(var(--spacing) * 7)}.max-h-\[min\(86vh\,820px\)\]{max-height:min(86vh,820px)}.w-7{width:calc(var(--spacing) * 7)}.w-\[min\(1120px\,calc\(100vw-48px\)\)\]{width:min(1120px,100vw - 48px)}.w-fit{width:fit-content}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.cursor-pointer{cursor:pointer}.grid-cols-\[max-content_1fr\]{grid-template-columns:max-content 1fr}.flex-col{flex-direction:column}.place-items-center{place-items:center}.items-center{align-items:center}.justify-between{justify-content:space-between}.gap-3{gap:calc(var(--spacing) * 3)}.gap-\[3px\]{gap:3px}.gap-\[22px\]{gap:22px}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-1{row-gap:var(--spacing)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded-\[5px\]{border-radius:5px}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-none{--tw-border-style:none;border-style:none}.border-current{border-color:currentColor}.border-line{border-color:var(--color-line)}.border-line-strong{border-color:var(--color-line-strong)}.border-transparent{border-color:#0000}.bg-black\/90{background-color:#000000e6}@supports (color:color-mix(in lab, red, red)){.bg-black\/90{background-color:color-mix(in oklab, var(--color-black) 90%, transparent)}}.bg-current\/10{background-color:currentColor}@supports (color:color-mix(in lab, red, red)){.bg-current\/10{background-color:color-mix(in oklab, currentcolor 10%, transparent)}}.bg-panel{background-color:var(--color-panel)}.bg-transparent{background-color:#0000}.p-0{padding:0}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-\[7px\]{padding-inline:7px}.py-px{padding-block:1px}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-5{padding-top:calc(var(--spacing) * 5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-7{padding-bottom:calc(var(--spacing) * 7)}.pl-3{padding-left:calc(var(--spacing) * 3)}.font-\[inherit\]{font-family:inherit}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.font-\[640\]{--tw-font-weight:640;font-weight:640}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.tracking-\[0\.05em\]{--tw-tracking:.05em;letter-spacing:.05em}.break-words{overflow-wrap:break-word}.whitespace-pre-wrap{white-space:pre-wrap}.text-muted{color:var(--color-muted)}.text-text{color:var(--color-text)}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.shadow-\[0_20px_60px_rgba\(0\,0\,0\,0\.45\)\]{--tw-shadow:0 20px 60px var(--tw-shadow-color,#00000073);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:border-line:hover{border-color:var(--color-line)}.hover\:bg-panel-2:hover{background-color:var(--color-panel-2)}.hover\:text-text:hover{color:var(--color-text)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.data-\[state\=active\]\:font-\[560\][data-state=active]{--tw-font-weight:560;font-weight:560}.data-\[state\=active\]\:text-text[data-state=active]{color:var(--color-text)}@media not all and (width>=760px){.max-\[760px\]\:hidden{display:none}}}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--bg:var(--lightningcss-light,#fafafa)var(--lightningcss-dark,#050505);--panel:var(--lightningcss-light,#fff)var(--lightningcss-dark,#0b0b0b);--panel-2:var(--lightningcss-light,#f4f4f5)var(--lightningcss-dark,#111);--line:var(--lightningcss-light,#dedee2)var(--lightningcss-dark,#262626);--line-strong:var(--lightningcss-light,#c9c9cf)var(--lightningcss-dark,#343434);--text:var(--lightningcss-light,#111113)var(--lightningcss-dark,#ededed);--muted:var(--lightningcss-light,#62636a)var(--lightningcss-dark,#a1a1aa);--soft:var(--lightningcss-light,#8b8d98)var(--lightningcss-dark,#74747b);--good:var(--lightningcss-light,#087f5b)var(--lightningcss-dark,#3ddc97);--bad:var(--lightningcss-light,#b42318)var(--lightningcss-dark,#ff6b6b);--warn:var(--lightningcss-light,#9a6700)var(--lightningcss-dark,#e8b84a);--blue:var(--lightningcss-light,#1d63d8)var(--lightningcss-dark,#6ea8fe);--focus:var(--lightningcss-light,#111113)var(--lightningcss-dark,#ededed);--series-1:var(--lightningcss-light,#2a78d6)var(--lightningcss-dark,#3987e5);--series-2:var(--lightningcss-light,#1baf7a)var(--lightningcss-dark,#199e70);--series-3:var(--lightningcss-light,#eda100)var(--lightningcss-dark,#c98500);--series-4:var(--lightningcss-light,#008300)var(--lightningcss-dark,#008300);--series-5:var(--lightningcss-light,#e34948)var(--lightningcss-dark,#e66767);--series-6:var(--lightningcss-light,#eb6834)var(--lightningcss-dark,#d95926);font-family:ui-sans-serif,-apple-system,BlinkMacSystemFont,SF Pro Text,Segoe UI,sans-serif}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}*{box-sizing:border-box}html{scrollbar-gutter:stable;overflow-y:scroll}body{background:var(--bg);color:var(--text);letter-spacing:0;margin:0}a{color:inherit}.topbar{border-bottom:1px solid var(--line);background:var(--bg);justify-content:space-between;align-items:center;gap:28px;height:64px;padding:0 clamp(20px,5vw,80px);display:flex}@supports (color:color-mix(in lab, red, red)){.topbar{background:color-mix(in oklch, var(--bg), transparent 4%)}}.topbar{z-index:10;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);position:sticky;top:0}.brand{align-items:baseline;gap:12px;font-size:20px;font-weight:690;display:flex}.mark{border:1.25px solid var(--text);width:18px;height:18px;display:inline-block;transform:rotate(45deg)}.lang-switch{border:1px solid var(--line);background:var(--panel);border-radius:7px;flex:none;align-items:center;display:inline-flex;overflow:hidden}.lang-switch button{border:0;border-right:1px solid var(--line);min-width:44px;height:30px;color:var(--muted);font:inherit;cursor:pointer;background:0 0;font-size:12px;line-height:1}.lang-switch button:last-child{border-right:0}.lang-switch button:hover{color:var(--text)}.lang-switch button.is-active{background:var(--panel-2);color:var(--text);font-weight:620}main{width:min(1120px,100vw - 40px);margin:0 auto;padding:clamp(52px,7vw,82px) 0 72px}.hero{text-align:center;max-width:740px;margin:0 auto clamp(38px,6vw,58px)}h1{letter-spacing:0;margin:0;font-size:clamp(42px,5.6vw,66px);font-weight:760;line-height:.94}.subtitle{color:var(--muted);margin:20px auto 0}@supports (color:color-mix(in lab, red, red)){.subtitle{color:color-mix(in oklch, var(--muted), var(--text) 12%)}}.subtitle{max-width:660px;font-size:clamp(17px,2vw,21px);line-height:1.58}.meta{color:var(--muted);flex-wrap:wrap;justify-content:center;gap:14px;margin-top:24px;font-size:14px;display:flex}.meta b{color:var(--text);font-weight:570}.report-slot{margin:0 auto 36px}.incompatible-banner{border:1px solid var(--warn)}@supports (color:color-mix(in lab, red, red)){.incompatible-banner{border:1px solid color-mix(in oklch, var(--warn), var(--line) 35%)}}.incompatible-banner{border-left:3px solid var(--warn);background:var(--warn);border-radius:8px}@supports (color:color-mix(in lab, red, red)){.incompatible-banner{background:color-mix(in oklch, var(--warn), var(--panel) 85%)}}.incompatible-banner{margin:0 auto 36px;padding:12px 16px 14px;font-size:13px}.ib-head{align-items:center;gap:8px;display:flex}.ib-head b{font-weight:640}.ib-icon{width:16px;height:16px;color:var(--warn);stroke-width:2px;flex-shrink:0}.ib-groups{gap:10px;margin-top:10px;display:grid}.ib-group-head{align-items:baseline;gap:8px;display:flex}.ib-group-count{background:var(--warn);border-radius:999px;flex-shrink:0;justify-content:center;align-items:center;min-width:20px;height:20px;padding:0 6px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.ib-group-count{background:color-mix(in oklch, var(--warn), var(--panel) 72%)}}.ib-group-count{color:var(--text);font-variant-numeric:tabular-nums;font-size:11px;font-weight:640}.ib-group-desc{color:var(--soft)}.ib-group ul{gap:3px;margin:5px 0 0;padding:0;list-style:none;display:grid}.ib-group li{align-items:center;gap:8px;min-height:22px;display:flex}.ib-dir{font-family:var(--mono,ui-monospace, monospace);font-weight:560}.ib-more{color:var(--soft);font-size:12px}.ib-copy{border:1px solid var(--line);background:var(--panel);width:22px;height:22px;color:var(--muted);cursor:pointer;border-radius:5px;flex-shrink:0;justify-content:center;align-items:center;transition:color .12s,border-color .12s;display:inline-flex}.ib-copy svg{stroke:currentColor;fill:none;stroke-width:2px;width:12px;height:12px}.ib-copy:hover{color:var(--text);border-color:var(--line-strong)}.ib-copy.is-copied{color:var(--good);border-color:var(--good)}@supports (color:color-mix(in lab, red, red)){.ib-copy.is-copied{border-color:color-mix(in oklch, var(--good), var(--line) 40%)}}.ib-toggle{color:var(--muted);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:4px;margin-top:10px;padding:0;font-size:12px;display:inline-flex}.ib-toggle svg{width:12px;height:12px;transition:transform .12s}.ib-toggle svg.is-open{transform:rotate(90deg)}.ib-toggle:hover{color:var(--text)}.section-head{justify-content:space-between;align-items:end;gap:18px;margin-bottom:16px;display:flex}h2{margin:0;font-size:clamp(24px,2.6vw,31px);font-weight:720;line-height:1.1}.controls{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.search{border:1px solid var(--line);background:var(--panel);min-width:320px;height:36px;color:var(--text);border-radius:7px;outline:none;padding:0 12px}.search:focus{border-color:var(--focus)}.table-wrap{border:1px solid var(--line);background:var(--panel);border-radius:8px;overflow:auto}table{border-collapse:collapse;width:100%;min-width:1040px}th,td{border-bottom:1px solid var(--line);text-align:left;vertical-align:middle;height:52px;padding:0 16px;font-size:14px}th{color:var(--muted);background:var(--panel);z-index:2;font-weight:500;position:sticky;top:0}tbody tr:last-child td{border-bottom:0}.section-sub-head{justify-content:space-between;align-items:center;gap:18px;min-height:36px;margin-bottom:16px;display:flex}.group-detail-label{color:var(--text);font-size:15px;font-weight:680}.name{font-weight:610}.sub{color:var(--muted);margin-top:3px;font-size:12px}.num{font-variant-numeric:tabular-nums;white-space:nowrap;font-feature-settings:"tnum"}.good{color:var(--good)}.bad{color:var(--bad)}.warn,.infra-err{color:var(--warn)}.eval-id{overflow-wrap:anywhere;align-items:center;font-weight:560;display:flex}.copy-all-errors{border:1px solid var(--line);background:var(--panel);height:36px;color:var(--muted);cursor:pointer;white-space:nowrap;border-radius:7px;flex-shrink:0;align-items:center;gap:6px;padding:0 12px;font-family:inherit;font-size:13px;transition:color .12s,border-color .12s,background .12s;display:inline-flex}.copy-all-errors svg{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;width:14px;height:14px}.copy-all-errors:hover{color:var(--text);border-color:var(--line-strong)}.copy-all-errors.is-copied{color:var(--good);border-color:var(--good)}@supports (color:color-mix(in lab, red, red)){.copy-all-errors.is-copied{border-color:color-mix(in oklch, var(--good), var(--line) 40%)}}.copy-all-errors.is-copied{background:var(--good)}@supports (color:color-mix(in lab, red, red)){.copy-all-errors.is-copied{background:color-mix(in oklch, var(--good), transparent 88%)}}.raw-details{border-top:1px solid var(--line);margin-top:16px}@supports (color:color-mix(in lab, red, red)){.raw-details{border-top:1px solid color-mix(in oklch, var(--line), transparent 15%)}}.raw-details{color:var(--muted);padding-top:14px}@supports (color:color-mix(in lab, red, red)){.raw-details{color:color-mix(in oklch, var(--muted), var(--text) 6%)}}.raw-details summary{cursor:pointer;color:var(--muted);-webkit-user-select:none;user-select:none;font-size:13px;font-weight:560}.raw-details pre{margin-top:12px}.raw-note{color:var(--soft);margin-left:8px;font-weight:400}.reason-empty{color:var(--soft)}.ran-at{color:var(--soft);font-variant-numeric:tabular-nums;margin-top:2px;font-size:11px;display:block}.attempt-status{align-items:center;gap:4px;min-width:0;display:flex}.eval-item-clickable{cursor:pointer;-webkit-user-select:none;user-select:none}.eval-item-clickable:hover{background:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){.eval-item-clickable:hover{background:color-mix(in oklch, var(--panel-2), var(--panel) 30%)}}.run-ratio{color:var(--soft)}.eval-attempts{border-left:2px solid var(--accent,var(--line));margin-left:8px;display:grid}@supports (color:color-mix(in lab, red, red)){.eval-attempts{border-left:2px solid color-mix(in oklch, var(--accent,var(--line)), transparent 55%)}}.eval-attempts{background:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){.eval-attempts{background:color-mix(in oklch, var(--panel-2), transparent 55%)}}.eval-attempts .eval-item{padding-left:12px}.eval-attempts .eval-item:last-child{border-bottom:none}.nosource{flex-direction:column;gap:14px;display:flex}.nosource-note{color:var(--muted);border:1px dashed var(--line-strong);padding:9px 12px;font-size:12.5px;line-height:1.55}@supports (color:color-mix(in lab, red, red)){.nosource-note{border:1px dashed color-mix(in oklch, var(--line-strong), transparent 25%)}}.nosource-note{background:var(--panel);border-radius:8px}@supports (color:color-mix(in lab, red, red)){.nosource-note{background:color-mix(in oklch, var(--panel), var(--line) 20%)}}.nosource-block{border:1px solid var(--line);background:var(--panel-2);border-radius:10px;overflow:hidden}.nosource-head{color:var(--muted);background:var(--panel-2);padding:7px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}@supports (color:color-mix(in lab, red, red)){.nosource-head{background:color-mix(in oklch, var(--panel-2), var(--line) 35%)}}.nosource-head{border-bottom:1px solid var(--line)}.nosource-block>.assert-detail,.nosource-block>.transcript{padding:10px 14px}.conv-loading{color:var(--soft);padding:8px 0;font-size:12px}.trace-details{border-bottom:1px solid var(--line)}@supports (color:color-mix(in lab, red, red)){.trace-details{border-bottom:1px solid color-mix(in oklch, var(--line), transparent 35%)}}.trace-details{padding:4px 0 10px}.trace-details summary{cursor:pointer;color:var(--muted);-webkit-user-select:none;user-select:none;padding:4px 0;font-size:12px}.trace-details summary:hover{color:var(--text)}.trace{border:1px solid var(--line);margin:8px 0 4px;padding:10px 12px}@supports (color:color-mix(in lab, red, red)){.trace{border:1px solid color-mix(in oklch, var(--line), transparent 20%)}}.trace{background:var(--panel);border-radius:7px}@supports (color:color-mix(in lab, red, red)){.trace{background:color-mix(in oklch, var(--panel), black 6%)}}.trace-span-meta{color:var(--soft);text-transform:uppercase;letter-spacing:.06em;margin-bottom:8px;font-size:11px}.span-d{border-radius:4px}.span-d>.trace-row{cursor:default}details.span-d>summary.trace-row{cursor:pointer;list-style:none}details.span-d>summary.trace-row::-webkit-details-marker{display:none}details.span-d[open]>summary.trace-row{background:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){details.span-d[open]>summary.trace-row{background:color-mix(in oklch, var(--panel-2), var(--panel) 10%)}}details.span-d>summary.trace-row:hover{background:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){details.span-d>summary.trace-row:hover{background:color-mix(in oklch, var(--panel-2), var(--panel) 20%)}}.trace-row{grid-template-columns:minmax(140px,.9fr) minmax(0,2fr) 56px;align-items:center;column-gap:12px;height:22px;font-size:12px;display:grid}.span-attrs{border-left:2px solid var(--line-strong);margin:2px 0 6px;padding:6px 8px 10px 16px}@supports (color:color-mix(in lab, red, red)){.span-attrs{border-left:2px solid color-mix(in oklch, var(--line-strong), transparent 30%)}}.span-attrs{font-size:12px}.attr-row{grid-template-columns:minmax(120px,220px) 1fr;column-gap:12px;padding:2px 0;display:grid}.attr-k{color:var(--soft);overflow-wrap:anywhere}.attr-v{color:var(--text);overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.attr-io{margin:4px 0}.attr-io .attr-k{text-transform:uppercase;letter-spacing:.05em;margin-bottom:3px;font-size:11px;display:block}.attr-pre{border:1px solid var(--line);background:var(--panel);border-radius:6px;max-height:220px;margin:0;padding:8px 10px;overflow:auto}@supports (color:color-mix(in lab, red, red)){.attr-pre{background:color-mix(in oklch, var(--panel), black 8%)}}.attr-pre{color:var(--muted);white-space:pre-wrap;overflow-wrap:anywhere;font-size:11px;line-height:1.45}.trace-label{text-overflow:ellipsis;white-space:nowrap;color:var(--muted);overflow:hidden}@supports (color:color-mix(in lab, red, red)){.trace-label{color:color-mix(in oklch, var(--muted), var(--text) 12%)}}.trace-track{background:var(--panel-2);border-radius:3px;height:12px;position:relative}@supports (color:color-mix(in lab, red, red)){.trace-track{background:color-mix(in oklch, var(--panel-2), var(--panel) 20%)}}.trace-bar{background:var(--good);border-radius:3px;min-width:2px;height:12px;position:absolute;top:0}.trace-bar.bad{background:var(--bad)}.trace-bar.k-model{background:oklch(72% .13 250)}.trace-bar.k-tool{background:oklch(74% .14 150)}.trace-bar.k-agent{background:oklch(74% .15 300)}.trace-bar.k-turn{background:oklch(78% .13 90)}.trace-bar.k-other{background:var(--soft)}@supports (color:color-mix(in lab, red, red)){.trace-bar.k-other{background:color-mix(in oklch, var(--soft), var(--panel) 30%)}}.trace-dur{color:var(--soft);text-align:right}.kind-chip{text-transform:uppercase;letter-spacing:.03em;color:var(--panel);vertical-align:middle;border-radius:3px;margin-right:6px;padding:0 5px;font-size:10px;font-weight:600;display:inline-block}.kind-chip.k-model{background:oklch(72% .13 250)}.kind-chip.k-tool{background:oklch(74% .14 150)}.kind-chip.k-agent{background:oklch(74% .15 300)}.kind-chip.k-turn{background:oklch(78% .13 90)}.transcript{flex-direction:column;gap:6px;margin:8px 0 4px;display:flex}.ts-msg{border:1px solid var(--line);border-radius:7px;padding:8px 11px}@supports (color:color-mix(in lab, red, red)){.ts-msg{border:1px solid color-mix(in oklch, var(--line), transparent 30%)}}.ts-msg{background:var(--panel)}@supports (color:color-mix(in lab, red, red)){.ts-msg{background:color-mix(in oklch, var(--panel), black 4%)}}.ts-assistant{border-left:2px solid var(--good)}.ts-user{border-left:2px solid var(--line-strong)}.ts-input{border-left:2px solid var(--warn)}.ts-role{text-transform:uppercase;letter-spacing:.07em;color:var(--soft);margin-bottom:4px;font-size:10px;display:block}.ts-text{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text);max-height:360px;font-size:13px;line-height:1.55;overflow:auto}.ts-think{font-size:12px}.ts-think>summary{cursor:pointer;color:var(--soft);padding:2px 0;font-style:italic;list-style:none}.ts-think>summary::-webkit-details-marker{display:none}.ts-think>summary:before{content:"✦ "}.ts-think-text{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--muted);max-height:280px;padding:4px 0 6px 16px;font-style:italic;overflow:auto}.ts-tool-d{border:1px solid var(--line)}@supports (color:color-mix(in lab, red, red)){.ts-tool-d{border:1px solid color-mix(in oklch, var(--line), transparent 30%)}}.ts-tool-d{background:var(--panel);border-radius:7px}@supports (color:color-mix(in lab, red, red)){.ts-tool-d{background:color-mix(in oklch, var(--panel), black 6%)}}.ts-tool-d>summary.ts-row{cursor:pointer;grid-template-columns:8px minmax(110px,max-content) 1fr;align-items:center;column-gap:9px;padding:7px 11px;list-style:none;display:grid}.ts-tool-d>summary.ts-row::-webkit-details-marker{display:none}.ts-tool-d[open]>summary.ts-row{border-bottom:1px solid var(--line)}@supports (color:color-mix(in lab, red, red)){.ts-tool-d[open]>summary.ts-row{border-bottom:1px solid color-mix(in oklch, var(--line), transparent 40%)}}.ts-tool-d>summary.ts-row:hover{background:var(--panel-2)}@supports (color:color-mix(in lab, red, red)){.ts-tool-d>summary.ts-row:hover{background:color-mix(in oklch, var(--panel-2), var(--panel) 20%)}}.ts-dot{background:var(--good);border-radius:50%;width:8px;height:8px}.ts-dot.bad{background:var(--bad)}.ts-dot.warn{background:var(--warn)}.ts-dot.pending{background:var(--soft)}.ts-tool{color:var(--text);white-space:nowrap;text-overflow:ellipsis;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;font-weight:600;overflow:hidden}.ts-preview{color:var(--soft);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.ts-body{flex-direction:column;gap:8px;padding:8px 11px 10px;display:flex}.ts-field .ts-k{text-transform:uppercase;letter-spacing:.05em;color:var(--soft);margin-bottom:3px;font-size:10px;display:block}.ts-error{border:1px solid var(--bad);border-radius:7px;padding:8px 11px}@supports (color:color-mix(in lab, red, red)){.ts-error{border:1px solid color-mix(in oklch, var(--bad), transparent 55%)}}.ts-error{color:var(--bad);font-size:12.5px}.ts-compaction{text-align:center;color:var(--soft);text-transform:uppercase;letter-spacing:.06em;padding:2px 0;font-size:11px}pre{border:1px solid var(--line);background:var(--panel);border-radius:7px;margin:0;padding:12px}@supports (color:color-mix(in lab, red, red)){pre{background:color-mix(in oklch, var(--panel), black 8%)}}pre{color:var(--muted);overflow-wrap:anywhere;max-height:360px;font-size:12px;line-height:1.5;overflow:auto}.empty{border:1px dashed var(--line-strong);color:var(--muted);text-align:center;background:var(--panel);border-radius:8px;padding:40px 24px}a.brand{color:inherit;text-decoration:none}a.brand:hover{opacity:.75}.traces-entry{border:1px solid var(--line);background:var(--panel);border-radius:8px;margin-bottom:12px;padding:14px 18px}.traces-entry-head{align-items:baseline;gap:12px;margin-bottom:8px;font-size:13px;display:flex}.traces-verdict{min-width:52px;font-weight:600}.traces-exp{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.traces-dur{color:var(--soft)}@media (width<=760px){.topbar{padding:0 20px}.lang-switch button{min-width:40px}main{width:min(100vw - 28px,1120px);padding-top:42px}.hero{text-align:left;margin-left:0}.meta{justify-content:flex-start}.section-head{flex-direction:column;align-items:stretch}.search{width:100%;min-width:0}.detail{padding:18px 16px 20px}.config-strip{gap:6px}.detail-kpis{grid-template-columns:repeat(2,minmax(0,1fr));row-gap:10px}.eval-grid-head,.eval-item{grid-template-columns:72px minmax(180px,1fr) minmax(220px,1fr) 76px 78px 72px 50px}}.modal-error{color:var(--bad);background:var(--bad);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}@supports (color:color-mix(in lab, red, red)){.modal-error{background:color-mix(in oklch, var(--bad), transparent 92%)}}.modal-error{border:1px solid var(--bad)}@supports (color:color-mix(in lab, red, red)){.modal-error{border:1px solid color-mix(in oklch, var(--bad), var(--line) 50%)}}.modal-error{white-space:pre-wrap;word-break:break-word;border-radius:8px;margin-bottom:12px;padding:8px 10px}.codeview{flex-direction:column;gap:14px;display:flex}.code-file{border:1px solid var(--line);background:var(--panel);border-radius:10px;overflow:hidden}.code-file-head{color:var(--muted);background:var(--panel-2);padding:7px 12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}@supports (color:color-mix(in lab, red, red)){.code-file-head{background:color-mix(in oklch, var(--panel-2), var(--line) 35%)}}.code-file-head{border-bottom:1px solid var(--line)}.code-lines{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;line-height:1.7;overflow-x:auto}.code-lines::-webkit-scrollbar{height:8px}.code-lines::-webkit-scrollbar-track{background:0 0}.code-lines::-webkit-scrollbar-thumb{background:var(--line-strong);border-radius:4px}.code-lines::-webkit-scrollbar-thumb:hover{background:var(--soft)}.code-line{border-left:3px solid #0000;grid-template-columns:46px 22px minmax(0,1fr) auto;align-items:center;width:max-content;min-width:100%;display:grid}.code-line.line-clickable{cursor:pointer}.code-line.line-clickable:hover{background:var(--panel)}@supports (color:color-mix(in lab, red, red)){.code-line.line-clickable:hover{background:color-mix(in oklch, var(--panel), var(--line) 45%)}}.code-line.line-send{background:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-send{background:color-mix(in oklch, var(--blue), var(--panel) 88%)}}.code-line.line-send{border-left-color:var(--blue)}.code-line.line-send .ln{background:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-send .ln{background:color-mix(in oklch, var(--blue), var(--panel) 74%)}}.code-line.line-send .ln{color:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-send .ln{color:color-mix(in oklch, var(--blue), var(--text) 45%)}}.code-line.line-send.line-clickable:hover{background:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-send.line-clickable:hover{background:color-mix(in oklch, var(--blue), var(--panel) 82%)}}.code-line.is-open{background:var(--panel)}@supports (color:color-mix(in lab, red, red)){.code-line.is-open{background:color-mix(in oklch, var(--panel), var(--line) 34%)}}.code-line.line-pass{background:var(--good)}@supports (color:color-mix(in lab, red, red)){.code-line.line-pass{background:color-mix(in oklch, var(--good), var(--panel) 58%)}}.code-line.line-pass{border-left-color:var(--good)}.code-line.line-pass .ln{background:var(--good)}@supports (color:color-mix(in lab, red, red)){.code-line.line-pass .ln{background:color-mix(in oklch, var(--good), var(--panel) 34%)}}.code-line.line-pass .ln{color:var(--text)}.code-line.line-fail{background:var(--bad)}@supports (color:color-mix(in lab, red, red)){.code-line.line-fail{background:color-mix(in oklch, var(--bad), var(--panel) 58%)}}.code-line.line-fail{border-left-color:var(--bad)}.code-line.line-fail .ln{background:var(--bad)}@supports (color:color-mix(in lab, red, red)){.code-line.line-fail .ln{background:color-mix(in oklch, var(--bad), var(--panel) 34%)}}.code-line.line-fail .ln{color:var(--text)}.code-line.line-warn{background:var(--warn)}@supports (color:color-mix(in lab, red, red)){.code-line.line-warn{background:color-mix(in oklch, var(--warn), var(--panel) 58%)}}.code-line.line-warn{border-left-color:var(--warn)}.code-line.line-warn .ln{background:var(--warn)}@supports (color:color-mix(in lab, red, red)){.code-line.line-warn .ln{background:color-mix(in oklch, var(--warn), var(--panel) 34%)}}.code-line.line-warn .ln{color:var(--text)}.code-line.line-pass.line-clickable:hover{background:var(--good)}@supports (color:color-mix(in lab, red, red)){.code-line.line-pass.line-clickable:hover{background:color-mix(in oklch, var(--good), var(--panel) 64%)}}.code-line.line-fail.line-clickable:hover{background:var(--bad)}@supports (color:color-mix(in lab, red, red)){.code-line.line-fail.line-clickable:hover{background:color-mix(in oklch, var(--bad), var(--panel) 64%)}}.code-line.line-warn.line-clickable:hover{background:var(--warn)}@supports (color:color-mix(in lab, red, red)){.code-line.line-warn.line-clickable:hover{background:color-mix(in oklch, var(--warn), var(--panel) 64%)}}.ln{text-align:right;color:var(--soft);-webkit-user-select:none;user-select:none;justify-content:flex-end;align-self:stretch;align-items:center;padding:1px 8px 1px 0;font-size:11px;display:flex}.gmark{justify-content:center;align-items:center;display:inline-flex}.gstat{flex-shrink:0;width:13px;height:13px}.gstat.good{color:var(--good)}.gstat.bad{color:var(--bad)}.gstat.warn{color:var(--warn)}.gstat.na{color:var(--muted,#8a8f98)}.gsend{width:13px;height:13px;color:var(--blue);flex-shrink:0}.ctext{white-space:pre;color:var(--text);padding-left:8px}.lbadges{white-space:nowrap;justify-self:end;align-items:center;gap:6px;padding-right:12px;display:inline-flex}.abadge{border:1px solid #0000;border-radius:5px;padding:0 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;font-weight:650}.abadge.good{color:var(--good);border-color:var(--good)}@supports (color:color-mix(in lab, red, red)){.abadge.good{border-color:color-mix(in oklch, var(--good), var(--line) 55%)}}.abadge.good{background:var(--good)}@supports (color:color-mix(in lab, red, red)){.abadge.good{background:color-mix(in oklch, var(--good), transparent 90%)}}.abadge.bad{color:var(--bad);border-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.abadge.bad{border-color:color-mix(in oklch, var(--bad), var(--line) 55%)}}.abadge.bad{background:var(--bad)}@supports (color:color-mix(in lab, red, red)){.abadge.bad{background:color-mix(in oklch, var(--bad), transparent 90%)}}.abadge.warn{color:var(--warn);border-color:var(--warn)}@supports (color:color-mix(in lab, red, red)){.abadge.warn{border-color:color-mix(in oklch, var(--warn), var(--line) 55%)}}.abadge.warn{background:var(--warn)}@supports (color:color-mix(in lab, red, red)){.abadge.warn{background:color-mix(in oklch, var(--warn), transparent 90%)}}.abadge.na{color:var(--muted,#8a8f98);border-color:var(--line);background:var(--muted,#8a8f98)}@supports (color:color-mix(in lab, red, red)){.abadge.na{background:color-mix(in oklch, var(--muted,#8a8f98), transparent 92%)}}.abadge-th{opacity:.55;font-weight:400}.reply-hint{letter-spacing:.02em;color:var(--muted);border:1px solid var(--line-strong);font-size:10px;font-weight:650}@supports (color:color-mix(in lab, red, red)){.reply-hint{border:1px solid color-mix(in oklch, var(--line-strong), transparent 12%)}}.reply-hint{background:var(--panel);border-radius:5px;padding:1px 7px}@supports (color:color-mix(in lab, red, red)){.reply-hint{background:color-mix(in oklch, var(--panel), var(--line) 28%)}}.reply-hint{transition:color .12s,border-color .12s,background .12s}.code-line.line-send .reply-hint{color:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-send .reply-hint{color:color-mix(in oklch, var(--blue), var(--text) 30%)}}.code-line.line-send .reply-hint{border-color:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-send .reply-hint{border-color:color-mix(in oklch, var(--blue), var(--line) 55%)}}.code-line.line-send .reply-hint{background:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-send .reply-hint{background:color-mix(in oklch, var(--blue), transparent 88%)}}.code-line.line-clickable:hover .reply-hint{color:var(--text);border-color:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-clickable:hover .reply-hint{border-color:color-mix(in oklch, var(--blue), var(--line) 30%)}}.code-line.line-clickable:hover .reply-hint{background:var(--blue)}@supports (color:color-mix(in lab, red, red)){.code-line.line-clickable:hover .reply-hint{background:color-mix(in oklch, var(--blue), transparent 80%)}}.line-chev{width:14px;height:14px;color:var(--soft);transition:transform .12s,color .12s}.line-chev.is-open{transform:rotate(90deg)}.code-line.line-clickable:hover .line-chev{color:var(--text)}.line-detail{font-family:var(--sans,-apple-system, system-ui, "Segoe UI", sans-serif);white-space:normal;background:var(--panel);padding:10px 16px 12px 60px}@supports (color:color-mix(in lab, red, red)){.line-detail{background:color-mix(in oklch, var(--panel), var(--line) 22%)}}.line-detail{border-left:3px solid var(--line-strong);font-size:12.5px}.reply-panel{border-left-color:var(--blue);flex-direction:column;gap:9px;display:flex}@supports (color:color-mix(in lab, red, red)){.reply-panel{border-left-color:color-mix(in oklch, var(--blue), var(--line) 40%)}}.reply-role{text-transform:uppercase;letter-spacing:.05em;color:var(--blue);margin-bottom:2px;font-size:10px;display:block}.reply-text{color:var(--text);white-space:pre-wrap;word-break:break-word}.reply-think{color:var(--muted);font-size:12px}.reply-think summary{cursor:pointer;-webkit-user-select:none;user-select:none}.reply-think-text{white-space:pre-wrap;color:var(--soft);margin-top:4px;padding-left:4px}.reply-tool{color:var(--text);flex-wrap:wrap;gap:8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;display:flex}.reply-tool-name{color:var(--warn)}.reply-tool-out{color:var(--muted)}.reply-err{color:var(--bad);font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.reply-empty{color:var(--soft)}.assert-detail{flex-direction:column;gap:9px;display:flex}.assert-row{grid-template-columns:auto minmax(0,1fr) auto;align-items:baseline;gap:8px;display:grid}.assert-name{color:var(--text);overflow-wrap:anywhere;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.assert-sev{color:var(--soft);text-transform:uppercase;letter-spacing:.04em;font-size:10px}.assert-score{color:var(--muted);white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.assert-reason{color:var(--muted);white-space:pre-wrap;grid-column:1/-1;font-size:12px}.assert-evidence{grid-column:1/-1;margin-top:2px}.assert-evidence>summary{cursor:pointer;-webkit-user-select:none;user-select:none;color:var(--soft);letter-spacing:.02em;font-size:11px}.assert-evidence>summary:hover{color:var(--text)}.assert-evidence-pre{color:var(--text);white-space:pre-wrap;overflow-wrap:anywhere;background:var(--panel);margin:6px 0 0;padding:8px 10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;line-height:1.5}@supports (color:color-mix(in lab, red, red)){.assert-evidence-pre{background:color-mix(in oklch, var(--panel), var(--line) 24%)}}.assert-evidence-pre{border:1px solid var(--line);border-radius:7px;max-height:260px;overflow-y:auto}.code-orphans{border:1px solid var(--line);border-radius:10px;padding:10px 12px}.code-orphans-head{color:var(--muted);margin-bottom:8px;font-size:11px}.modal-sect{letter-spacing:.06em;text-transform:uppercase;color:var(--muted);margin-bottom:6px;font-size:11px;font-weight:660}.attempt-asserts{margin-bottom:14px}.attempt-asserts-open{border:1px solid var(--line);background:var(--panel);border-radius:10px;margin-top:6px;overflow:hidden}.attempt-asserts .assert-detail{background:0 0;border-left:0;padding:10px 12px}.assert-reason{max-height:180px;overflow-y:auto}.fail-row{border-bottom:1px solid var(--line)}.fail-row:last-child{border-bottom:0}.fail-sum{cursor:pointer;-webkit-user-select:none;user-select:none;flex-wrap:wrap;align-items:baseline;gap:4px 8px;min-width:0;padding:8px 12px;list-style:none;display:flex}.fail-sum::-webkit-details-marker{display:none}.fail-sum:before{content:"";border-left:4px solid var(--soft);border-top:3.5px solid #0000;border-bottom:3.5px solid #0000;flex-shrink:0;align-self:center;width:0;height:0;transition:transform .12s}.fail-row[open]>.fail-sum:before{transform:rotate(90deg)}.fail-sum:hover{background:var(--panel)}@supports (color:color-mix(in lab, red, red)){.fail-sum:hover{background:color-mix(in oklch, var(--panel), var(--line) 30%)}}.fail-name{color:var(--text);overflow-wrap:anywhere;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.fail-matcher{color:var(--muted);overflow-wrap:anywhere;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px}.fail-body{flex-direction:column;gap:6px;padding:2px 12px 10px 24px;display:flex}.assert-loc{color:var(--soft);white-space:nowrap;margin-left:8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.asserts-passed{margin-top:8px}.asserts-passed>summary,.asserts-passed-group>summary{cursor:pointer;-webkit-user-select:none;user-select:none;color:var(--muted);font-size:12px}.asserts-passed>summary:hover,.asserts-passed-group>summary:hover{color:var(--text)}.asserts-passed-group{margin:6px 0 0 14px}.asserts-passed-group>.assert-detail{margin-top:4px}.attempt-timing{margin:14px 0}summary.timing-sum{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:8px;list-style:none;display:flex}summary.timing-sum::-webkit-details-marker{display:none}summary.timing-sum:before{content:"";border-left:4px solid var(--soft);border-top:3.5px solid #0000;border-bottom:3.5px solid #0000;flex-shrink:0;width:0;height:0;transition:transform .12s}details[open]>summary.timing-sum:before{transform:rotate(90deg)}summary.timing-sum:hover .modal-sect{color:var(--text)}.timing-sum .modal-sect{margin-bottom:0}.phase-bar{border-radius:4px;gap:1px;height:8px;margin:7px 0 8px;display:flex;overflow:hidden}.phase-seg{flex-basis:0;min-width:2px}.phase-seg-1{background:var(--series-1)}.phase-seg-2{background:var(--series-2)}.phase-seg-3{background:var(--series-3)}.phase-seg-4{background:var(--series-4)}.phase-seg-5{background:var(--series-5)}.phase-seg-6{background:var(--series-6)}.phase-seg-bad{background:var(--bad)}.phase-list,.timing-kids{flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;display:flex}.timing-kids{margin-top:2px;padding-left:18px}.phase-row,.tnode-row{align-items:center;gap:7px;min-width:0;font-size:12px;line-height:1.7;display:flex}summary.phase-row,summary.tnode-row{cursor:pointer;-webkit-user-select:none;user-select:none;list-style:none}summary.phase-row::-webkit-details-marker{display:none}summary.tnode-row::-webkit-details-marker{display:none}summary.phase-row:before,summary.tnode-row:before{content:"";border-left:4px solid var(--soft);border-top:3.5px solid #0000;border-bottom:3.5px solid #0000;flex-shrink:0;width:0;height:0;transition:transform .12s}details[open]>summary.phase-row:before,details[open]>summary.tnode-row:before{transform:rotate(90deg)}li.phase-row:before,li.tnode-row:before{content:"";flex-shrink:0;width:4px}.phase-dot{border-radius:2px;flex-shrink:0;width:8px;height:8px}.phase-dot-none{background:0 0}.phase-name{color:var(--text);white-space:nowrap;flex-shrink:0;width:168px}.phase-dur{color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}.phase-fail{color:var(--bad);font-weight:650}.phase-kids{color:var(--soft);border:1px solid var(--line);border-radius:999px;padding:0 6px;font-size:10px;line-height:1.5}.tnode-label{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;overflow:hidden}.tnode-meta{color:var(--soft);padding:3px 0 3px 18px;font-size:11px}.tnode-trace{margin:4px 0 6px 18px}.phase-closing{margin-top:8px}.phase-closing-head{color:var(--soft);margin-bottom:2px;font-size:11px}.meta-chips{flex-wrap:wrap;gap:8px;margin-top:12px;display:flex}.meta-chip{color:var(--muted);border:1px solid var(--line);background:var(--panel);border-radius:6px;padding:3px 9px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px}.meta-chip b{color:var(--text);font-weight:640}.tok-comment{color:var(--soft);font-style:italic}.tok-str{color:var(--lightningcss-light,#0a7d3c)var(--lightningcss-dark,#7ee787)}.tok-kw{color:var(--lightningcss-light,#9333ea)var(--lightningcss-dark,#c792ea)}.tok-num{color:var(--lightningcss-light,#b25000)var(--lightningcss-dark,#f0a36b)}.tok-fn{color:var(--lightningcss-light,#0b62d6)var(--lightningcss-dark,#82aaff)}.shell-links{align-items:center;gap:8px;margin-left:auto;display:flex}.shell-links a{color:var(--soft);align-items:center;gap:6px;padding:6px 4px;font-size:13px;text-decoration:none;display:inline-flex}.shell-links a:hover{color:var(--text)}.shell-link-icon{align-items:center;display:inline-flex}.shell-link-icon svg{fill:currentColor;width:14px;height:14px;display:block}.site-footer{color:var(--soft);flex-wrap:wrap;justify-content:center;align-items:baseline;gap:12px;padding:24px 24px 32px;font-size:12px;display:flex}.hero .powered-by{margin-top:16px;font-size:12px;display:block}.hero .powered-by a{color:var(--blue);text-decoration:none}.hero .powered-by a:hover{text-decoration:underline}.nre-page-error pre{white-space:pre-wrap}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}