niceeval 0.6.2 → 0.7.1
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.
- package/INDEX.md +23 -23
- package/README.zh.md +6 -6
- package/dist/agents/types.d.ts +2 -2
- package/dist/i18n/zh-CN.d.ts +3 -3
- package/dist/report/aggregate.d.ts +32 -26
- package/dist/report/aggregate.js +157 -76
- package/dist/report/built-in/index.d.ts +2 -0
- package/dist/report/built-in/index.js +8 -0
- package/dist/report/components.d.ts +91 -164
- package/dist/report/components.js +377 -114
- package/dist/report/compute.d.ts +86 -73
- package/dist/report/compute.js +592 -432
- package/dist/report/flag.d.ts +28 -17
- package/dist/report/flag.js +86 -16
- package/dist/report/format.d.ts +11 -11
- package/dist/report/format.js +17 -15
- package/dist/report/index.d.ts +16 -17
- package/dist/report/index.js +20 -22
- package/dist/report/load.js +3 -2
- package/dist/report/locale.d.ts +49 -34
- package/dist/report/locale.js +106 -58
- package/dist/report/metrics.d.ts +10 -3
- package/dist/report/metrics.js +46 -12
- package/dist/report/primitives.d.ts +42 -15
- package/dist/report/primitives.js +135 -26
- package/dist/report/react/AttemptList.d.ts +10 -8
- package/dist/report/react/AttemptList.js +18 -10
- package/dist/report/react/DeltaTable.js +19 -18
- package/dist/report/react/EvalList.d.ts +3 -3
- package/dist/report/react/EvalList.js +0 -0
- package/dist/report/react/ExperimentComparison.d.ts +4 -2
- package/dist/report/react/ExperimentComparison.js +5 -4
- package/dist/report/react/ExperimentList.d.ts +3 -3
- package/dist/report/react/ExperimentList.js +16 -15
- package/dist/report/react/MetricBars.js +5 -4
- package/dist/report/react/MetricLine.js +12 -5
- package/dist/report/react/MetricMatrix.js +1 -1
- package/dist/report/react/MetricScatter.js +54 -17
- package/dist/report/react/MetricTable.js +2 -12
- package/dist/report/react/ScopeSummary.d.ts +10 -0
- package/dist/report/react/ScopeSummary.js +17 -0
- package/dist/report/react/Scoreboard.js +6 -6
- package/dist/report/react/cell.js +2 -2
- package/dist/report/react/fixtures.d.ts +5 -9
- package/dist/report/react/fixtures.js +105 -149
- package/dist/report/react/index.d.ts +15 -5
- package/dist/report/react/index.js +18 -7
- package/dist/report/report.d.ts +137 -20
- package/dist/report/report.js +261 -34
- package/dist/report/text/faces.d.ts +17 -19
- package/dist/report/text/faces.js +225 -157
- package/dist/report/text/plot.js +1 -1
- package/dist/report/text/table.js +2 -2
- package/dist/report/tree.d.ts +90 -40
- package/dist/report/tree.js +252 -94
- package/dist/report/types.d.ts +245 -300
- package/dist/report/types.js +4 -3
- package/dist/report/web.d.ts +21 -5
- package/dist/report/web.js +42 -16
- package/dist/results/select.d.ts +38 -16
- package/dist/results/select.js +73 -25
- package/dist/results/types.d.ts +38 -14
- package/dist/shared/aggregate.d.ts +3 -2
- package/dist/shared/aggregate.js +5 -4
- package/docs-site/zh/README.md +44 -0
- package/docs-site/zh/examples/ai-agent-application.mdx +63 -0
- package/docs-site/zh/examples/coding-agent-extensions.mdx +57 -0
- package/docs-site/zh/examples/index.mdx +50 -0
- package/docs-site/zh/{concepts → explanation}/adapter.mdx +11 -11
- package/docs-site/zh/{concepts → explanation}/assert.mdx +7 -7
- package/docs-site/zh/{concepts → explanation}/drive.mdx +8 -8
- package/docs-site/zh/{concepts → explanation}/evals.mdx +4 -4
- package/docs-site/zh/{concepts → explanation}/experiment.mdx +8 -8
- package/docs-site/zh/{concepts → explanation}/hitl.mdx +8 -8
- package/docs-site/zh/{concepts → explanation}/judge.mdx +5 -5
- package/docs-site/zh/{concepts → explanation}/overview.mdx +5 -5
- package/docs-site/zh/{guides → explanation}/runner.mdx +1 -1
- package/docs-site/zh/{concepts → explanation}/tier.mdx +6 -6
- package/docs-site/zh/{guides → how-to}/agent-feedback-loop.mdx +7 -7
- package/docs-site/zh/{guides → how-to}/authoring.mdx +2 -2
- package/docs-site/zh/{guides → how-to}/connect-otel.mdx +6 -6
- package/docs-site/zh/{guides → how-to}/connect-your-agent.mdx +18 -18
- package/docs-site/zh/{guides → how-to}/custom-reports.mdx +6 -6
- package/docs-site/zh/{guides → how-to}/experiments.mdx +3 -3
- package/docs-site/zh/{guides → how-to}/publish-report.mdx +2 -2
- package/docs-site/zh/{guides → how-to}/sandbox-agent.mdx +2 -2
- package/docs-site/zh/{guides → how-to}/sandbox-providers.mdx +1 -1
- package/docs-site/zh/{guides → how-to}/viewing-results.mdx +6 -6
- package/docs-site/zh/{guides → how-to}/write-experiment.mdx +3 -3
- package/docs-site/zh/{guides → how-to}/write-send.mdx +13 -13
- package/docs-site/zh/index.mdx +23 -25
- package/docs-site/zh/introduction.mdx +8 -8
- package/docs-site/zh/reference/builtin-agents.mdx +5 -5
- package/docs-site/zh/reference/capabilities.mdx +6 -6
- package/docs-site/zh/reference/cli.mdx +9 -7
- package/docs-site/zh/reference/define-agent.mdx +1 -1
- package/docs-site/zh/reference/events.mdx +3 -3
- package/docs-site/zh/{guides → reference}/official-adapters.mdx +7 -7
- package/docs-site/zh/{guides → reference}/report-components.mdx +5 -5
- package/docs-site/zh/{guides → reference}/results-data.mdx +5 -5
- package/docs-site/zh/{guides → troubleshooting}/debug-sandbox.mdx +2 -2
- package/docs-site/zh/{guides → troubleshooting}/debugging.mdx +4 -2
- package/docs-site/zh/{quickstart.mdx → tutorials/quickstart.mdx} +5 -17
- package/package.json +6 -2
- package/src/agents/index.ts +2 -2
- package/src/agents/openai-compat.ts +1 -1
- package/src/agents/streaming.ts +2 -2
- package/src/agents/types.ts +3 -3
- package/src/cli.ts +42 -23
- package/src/context/context.ts +1 -1
- package/src/context/session.test.ts +1 -1
- package/src/context/session.ts +1 -1
- package/src/i18n/en.ts +18 -16
- package/src/i18n/zh-CN.ts +16 -15
- package/src/report/aggregate.ts +175 -87
- package/src/report/built-in/index.tsx +9 -0
- package/src/report/components.tsx +625 -285
- package/src/report/compute.ts +717 -515
- package/src/report/dual-render.test.tsx +738 -1148
- package/src/report/flag.ts +97 -33
- package/src/report/format.ts +18 -22
- package/src/report/index.ts +113 -58
- package/src/report/load.ts +3 -2
- package/src/report/locale.ts +120 -69
- package/src/report/metrics.ts +42 -12
- package/src/report/primitives.tsx +190 -45
- package/src/report/react/AttemptList.tsx +32 -20
- package/src/report/react/DeltaTable.tsx +63 -45
- package/src/report/react/EvalList.tsx +0 -0
- package/src/report/react/ExperimentComparison.tsx +12 -7
- package/src/report/react/ExperimentList.tsx +38 -26
- package/src/report/react/MetricBars.tsx +5 -4
- package/src/report/react/MetricLine.tsx +13 -8
- package/src/report/react/MetricMatrix.tsx +2 -2
- package/src/report/react/MetricScatter.tsx +74 -20
- package/src/report/react/MetricTable.tsx +4 -76
- package/src/report/react/ScopeSummary.tsx +86 -0
- package/src/report/react/Scoreboard.tsx +28 -10
- package/src/report/react/cell.tsx +2 -2
- package/src/report/react/enhance.js +57 -5
- package/src/report/react/fixtures.ts +109 -156
- package/src/report/react/index.tsx +24 -39
- package/src/report/react/render.test.tsx +139 -104
- package/src/report/react/styles.css +181 -91
- package/src/report/report.test.ts +761 -1031
- package/src/report/report.ts +425 -47
- package/src/report/text/faces.ts +257 -164
- package/src/report/text/plot.ts +1 -1
- package/src/report/text/table.ts +2 -2
- package/src/report/tree.ts +362 -104
- package/src/report/types.ts +257 -287
- package/src/report/web.ts +63 -20
- package/src/results/attempt-evidence.test.ts +4 -4
- package/src/results/attempt-evidence.ts +5 -5
- package/src/results/copy.ts +6 -6
- package/src/results/host-equivalence.test.ts +26 -14
- package/src/results/index.ts +10 -4
- package/src/results/open.ts +8 -4
- package/src/results/results.test.ts +4 -3
- package/src/results/select.ts +104 -34
- package/src/results/types.ts +36 -14
- package/src/runner/feedback/human.test.ts +1 -1
- package/src/runner/run.ts +1 -1
- package/src/sandbox/cli-commands.ts +2 -2
- package/src/scoring/judge.test.ts +1 -1
- package/src/shared/aggregate.ts +5 -4
- package/src/show/compose.ts +50 -67
- package/src/show/index.ts +107 -56
- package/src/show/render.ts +43 -27
- package/src/show/report-host.test.ts +188 -0
- package/src/show/report-host.ts +375 -0
- package/src/show/show.test.ts +86 -36
- package/src/view/app/App.test.tsx +69 -0
- package/src/view/app/App.tsx +144 -48
- package/src/view/app/components/AttemptModal.tsx +324 -63
- package/src/view/app/components/CodeView.tsx +10 -4
- package/src/view/app/i18n.ts +31 -17
- package/src/view/app/lib/artifact-url.ts +14 -3
- package/src/view/app/main.tsx +13 -8
- package/src/view/app/pages/{RunsPage.tsx → AttemptsPage.tsx} +6 -6
- package/src/view/app/types.ts +4 -1
- package/src/view/artifact-serving.test.ts +21 -1
- package/src/view/client-dist/app.css +1 -1
- package/src/view/client-dist/app.js +6 -6
- package/src/view/data.test.ts +9 -3
- package/src/view/data.ts +145 -49
- package/src/view/index.ts +48 -44
- package/src/view/server.ts +35 -15
- package/src/view/shared/types.ts +34 -5
- package/src/view/styles.css +224 -0
- package/src/view/view-report.test.ts +161 -57
- package/dist/report/built-ins/experiment-comparison.d.ts +0 -39
- package/dist/report/built-ins/experiment-comparison.js +0 -119
- package/dist/report/built-ins/index.d.ts +0 -2
- package/dist/report/built-ins/index.js +0 -2
- package/dist/report/react/GroupSummary.d.ts +0 -8
- package/dist/report/react/GroupSummary.js +0 -8
- package/dist/report/react/RunOverview.d.ts +0 -8
- package/dist/report/react/RunOverview.js +0 -12
- package/docs-site/zh/example/ai-agent-application.mdx +0 -152
- package/docs-site/zh/example/claude-code-codex-plugin.mdx +0 -167
- package/docs-site/zh/example/claude-code-codex-skill.mdx +0 -152
- package/docs-site/zh/example/showcase.mdx +0 -39
- package/src/report/built-in-user-parity.test.tsx +0 -597
- package/src/report/built-ins/experiment-comparison.tsx +0 -179
- package/src/report/built-ins/index.ts +0 -7
- package/src/report/react/GroupSummary.tsx +0 -66
- package/src/report/react/RunOverview.tsx +0 -109
- /package/docs-site/zh/{example/tier1-ai-sdk-v7.mdx → examples/integrations/ai-sdk-v7.mdx} +0 -0
- /package/docs-site/zh/{example/tier1-claude-sdk.mdx → examples/integrations/claude-sdk.mdx} +0 -0
- /package/docs-site/zh/{example/tier1-codex-sdk.mdx → examples/integrations/codex-sdk.mdx} +0 -0
- /package/docs-site/zh/{example/tier1-langgraph.mdx → examples/integrations/langgraph.mdx} +0 -0
- /package/docs-site/zh/{example/tier1-pi-sdk.mdx → examples/integrations/pi-sdk.mdx} +0 -0
- /package/docs-site/zh/{guides → how-to}/ci-integration.mdx +0 -0
- /package/docs-site/zh/{guides → how-to}/dataset-fanout.mdx +0 -0
- /package/docs-site/zh/{guides → how-to}/fixtures.mdx +0 -0
- /package/docs-site/zh/{guides → how-to}/reporters.mdx +0 -0
- /package/docs-site/zh/{guides → how-to}/scoring-guide.mdx +0 -0
package/src/view/app/i18n.ts
CHANGED
|
@@ -8,7 +8,7 @@ export type MessageKey =
|
|
|
8
8
|
| "nav.label"
|
|
9
9
|
| "nav.report"
|
|
10
10
|
| "nav.experiments"
|
|
11
|
-
| "nav.
|
|
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.
|
|
21
|
+
| "section.attempts"
|
|
22
22
|
| "section.traces"
|
|
23
23
|
| "search.experiments"
|
|
24
|
-
| "search.
|
|
24
|
+
| "search.attempts"
|
|
25
25
|
| "empty.summary"
|
|
26
|
-
| "empty.
|
|
27
|
-
| "empty.
|
|
26
|
+
| "empty.attempts"
|
|
27
|
+
| "empty.attemptsFilter"
|
|
28
28
|
| "empty.traces"
|
|
29
29
|
| "table.experiment"
|
|
30
30
|
| "table.model"
|
|
@@ -100,8 +100,12 @@ 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"
|
|
105
109
|
| "assert.unavailable"
|
|
106
110
|
| "assert.optional"
|
|
107
111
|
| "assert.soft"
|
|
@@ -132,9 +136,11 @@ const dictionaries: Record<Locale, Dictionary> = {
|
|
|
132
136
|
"nav.label": "Report",
|
|
133
137
|
"nav.report": "Report",
|
|
134
138
|
"nav.experiments": "Experiments",
|
|
135
|
-
"nav.
|
|
139
|
+
"nav.attempts": "Attempts",
|
|
136
140
|
"nav.traces": "Traces",
|
|
137
|
-
|
|
141
|
+
// 标题回退链终点的内置文案(shell.md:「Eval 运行结果 / Eval Results」);
|
|
142
|
+
// 正常路径 server 侧已走完回退链,这里只兜旧数据 / 缺声明。
|
|
143
|
+
"hero.title": "Eval Results",
|
|
138
144
|
"hero.lastRun": "Last run:",
|
|
139
145
|
"hero.noRuns": "No runs yet",
|
|
140
146
|
"metric.passRate": "Pass Rate",
|
|
@@ -142,13 +148,13 @@ const dictionaries: Record<Locale, Dictionary> = {
|
|
|
142
148
|
"metric.duration": "Duration",
|
|
143
149
|
"metric.cost": "Estimated Cost",
|
|
144
150
|
"section.experiments": "Experiments",
|
|
145
|
-
"section.
|
|
151
|
+
"section.attempts": "Attempts",
|
|
146
152
|
"section.traces": "Traces",
|
|
147
153
|
"search.experiments": "Filter experiment, agent, model, or eval...",
|
|
148
|
-
"search.
|
|
154
|
+
"search.attempts": "Filter eval ID or experiment...",
|
|
149
155
|
"empty.summary": "No snapshots found. Run niceeval or pass niceeval view path/to/snapshot.json.",
|
|
150
|
-
"empty.
|
|
151
|
-
"empty.
|
|
156
|
+
"empty.attempts": "No attempts found.",
|
|
157
|
+
"empty.attemptsFilter": "No results match the filter.",
|
|
152
158
|
"empty.traces": "No traces available. Traces are collected during eval runs when artifacts are saved.",
|
|
153
159
|
"table.experiment": "Experiment",
|
|
154
160
|
"table.model": "Model",
|
|
@@ -224,8 +230,12 @@ const dictionaries: Record<Locale, Dictionary> = {
|
|
|
224
230
|
"code.conversation": "conversation",
|
|
225
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.",
|
|
226
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",
|
|
227
236
|
"assert.pass": "pass",
|
|
228
237
|
"assert.fail": "fail",
|
|
238
|
+
"assert.passedCollapsed": "{{count}} passed",
|
|
229
239
|
"assert.unavailable": "unavailable",
|
|
230
240
|
"assert.optional": "optional",
|
|
231
241
|
"assert.soft": "soft",
|
|
@@ -253,7 +263,7 @@ const dictionaries: Record<Locale, Dictionary> = {
|
|
|
253
263
|
"nav.label": "报告",
|
|
254
264
|
"nav.report": "报告",
|
|
255
265
|
"nav.experiments": "实验",
|
|
256
|
-
"nav.
|
|
266
|
+
"nav.attempts": "Attempts",
|
|
257
267
|
"nav.traces": "追踪",
|
|
258
268
|
"hero.title": "Eval 运行结果",
|
|
259
269
|
"hero.lastRun": "最近运行:",
|
|
@@ -263,13 +273,13 @@ const dictionaries: Record<Locale, Dictionary> = {
|
|
|
263
273
|
"metric.duration": "耗时",
|
|
264
274
|
"metric.cost": "预估成本",
|
|
265
275
|
"section.experiments": "实验",
|
|
266
|
-
"section.
|
|
276
|
+
"section.attempts": "Attempts",
|
|
267
277
|
"section.traces": "追踪",
|
|
268
278
|
"search.experiments": "筛选实验、agent、model 或 eval...",
|
|
269
|
-
"search.
|
|
279
|
+
"search.attempts": "筛选 eval ID 或实验...",
|
|
270
280
|
"empty.summary": "没有找到快照。请先运行 niceeval,或传入 niceeval view path/to/snapshot.json。",
|
|
271
|
-
"empty.
|
|
272
|
-
"empty.
|
|
281
|
+
"empty.attempts": "还没有 attempt。",
|
|
282
|
+
"empty.attemptsFilter": "没有匹配筛选条件的结果。",
|
|
273
283
|
"empty.traces": "没有可用追踪。保存 artifact 的 eval run 会收集 traces。",
|
|
274
284
|
"table.experiment": "实验",
|
|
275
285
|
"table.model": "模型",
|
|
@@ -325,7 +335,7 @@ const dictionaries: Record<Locale, Dictionary> = {
|
|
|
325
335
|
"trace.clickDetails": "点击行查看详情",
|
|
326
336
|
"trace.enableHint": "这次运行没有 trace。接入 OTel 才有调用瀑布图——看",
|
|
327
337
|
"trace.enableHintLink": "OTel 接入指南",
|
|
328
|
-
"trace.enableHintUrl": "https://niceeval.com/docs/zh/
|
|
338
|
+
"trace.enableHintUrl": "https://niceeval.com/docs/zh/how-to/connect-otel",
|
|
329
339
|
"transcript.noEvents": "没有事件",
|
|
330
340
|
"transcript.user": "user",
|
|
331
341
|
"transcript.assistant": "assistant",
|
|
@@ -345,8 +355,12 @@ const dictionaries: Record<Locale, Dictionary> = {
|
|
|
345
355
|
"code.conversation": "会话",
|
|
346
356
|
"code.noSource": "源码未捕获。此 run 可能早于 source-loc,或源码不可读。重跑此 eval 即可看到代码视图。",
|
|
347
357
|
"code.sourceUnavailable": "此 run 捕获过源码,但当前部署里缺少它的 artifact 文件。用 `niceeval view --out <目录>` 重新导出(目录模式会带上 artifact),或在本地 `niceeval view` 查看。",
|
|
358
|
+
"attempt.timing": "耗时",
|
|
359
|
+
"attempt.teardown": "收尾(不计入总耗时)",
|
|
360
|
+
"attempt.diagnostics": "诊断",
|
|
348
361
|
"assert.pass": "通过",
|
|
349
362
|
"assert.fail": "失败",
|
|
363
|
+
"assert.passedCollapsed": "{{count}} 条通过",
|
|
350
364
|
"assert.unavailable": "评不了",
|
|
351
365
|
"assert.optional": "可缺席",
|
|
352
366
|
"assert.soft": "soft",
|
|
@@ -1,6 +1,17 @@
|
|
|
1
|
-
// artifact fetch 的 URL
|
|
1
|
+
// artifact fetch 的 URL:以「页面所在目录」为基底的路径 `<页面目录>/artifact/<rel>`。
|
|
2
2
|
// 本地 dev server(server.ts 的 /artifact/ 路由)和目录式静态导出(buildView 拷到 <out>/artifact/)
|
|
3
|
-
//
|
|
3
|
+
// 共用同一布局:artifact/ 恒为 index.html 的同级目录。基底不能交给浏览器的相对解析——
|
|
4
|
+
// 静态托管常把 <dir>/index.html 服务在无尾斜杠的 <dir> 路径上(反代 rewrite、cleanUrls),
|
|
5
|
+
// 此时相对路径 `artifact/...` 会解析到上一级目录断链。这里自己算目录:pathname 末段带 `.`
|
|
6
|
+
// 视为文件名去掉(直接打开 .../index.html),否则整个 pathname 就是目录(含无尾斜杠形态)。
|
|
4
7
|
export function artifactUrl(rel: string): string {
|
|
5
|
-
|
|
8
|
+
const tail = "artifact/" + rel.split("/").map(encodeURIComponent).join("/");
|
|
9
|
+
if (typeof location === "undefined") return tail; // 非浏览器环境(测试直调)保持相对形态
|
|
10
|
+
return pageDir(location.pathname) + tail;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** 页面 pathname → 它所在目录(恒以 `/` 结尾)。 */
|
|
14
|
+
export function pageDir(pathname: string): string {
|
|
15
|
+
if (/\.[^/]*$/.test(pathname)) return pathname.replace(/[^/]*$/, "");
|
|
16
|
+
return pathname.endsWith("/") ? pathname : pathname + "/";
|
|
6
17
|
}
|
package/src/view/app/main.tsx
CHANGED
|
@@ -11,14 +11,19 @@ const emptyViewData: ViewData = {
|
|
|
11
11
|
|
|
12
12
|
const initialData: ViewData = window.__NICEEVAL_VIEW_DATA__ ?? emptyViewData;
|
|
13
13
|
|
|
14
|
-
//
|
|
15
|
-
// (__NICEEVAL_VIEW_DATA__ 旁)
|
|
16
|
-
// 切语言即换块;不解析、不 hydrate
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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}
|
|
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
|
|
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-
|
|
15
|
+
<section id="tab-attempts">
|
|
16
16
|
<div className="section-head">
|
|
17
|
-
<h2>{t("section.
|
|
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.
|
|
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.
|
|
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.
|
|
70
|
+
{t("empty.attemptsFilter")}
|
|
71
71
|
</td>
|
|
72
72
|
</tr>
|
|
73
73
|
)}
|
package/src/view/app/types.ts
CHANGED
|
@@ -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
|
-
|
|
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;
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
import { mkdtemp, readFile, readdir, rm } from "node:fs/promises";
|
|
15
15
|
import { tmpdir } from "node:os";
|
|
16
16
|
import { join } from "node:path";
|
|
17
|
-
import { afterEach, describe, expect, it } from "vitest";
|
|
17
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
18
18
|
import { createResultsWriter } from "../results/index.ts";
|
|
19
19
|
import { loadViewScan } from "./data.ts";
|
|
20
20
|
import { buildView } from "./index.ts";
|
|
@@ -135,3 +135,23 @@ describe("index.ts · copyFetchedArtifacts(--out 静态导出)对 sources.json
|
|
|
135
135
|
expect(exportedEvents).toEqual([{ type: "message", role: "user", text: "hi" }]);
|
|
136
136
|
});
|
|
137
137
|
});
|
|
138
|
+
|
|
139
|
+
describe("artifact-url.ts · fetch 基底 = 页面所在目录(无尾斜杠托管不断链)", () => {
|
|
140
|
+
// bug: memory/showcase-subpath-no-trailing-slash-breaks-artifact-fetch.md
|
|
141
|
+
afterEach(() => vi.unstubAllGlobals());
|
|
142
|
+
|
|
143
|
+
it("页面服务在无尾斜杠子路径(反代 rewrite)时,fetch 拼在该路径目录下", () => {
|
|
144
|
+
vi.stubGlobal("location", { pathname: "/showcase/memory" });
|
|
145
|
+
expect(artifactUrl("e/run/a0/sources.json")).toBe("/showcase/memory/artifact/e/run/a0/sources.json");
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it("直接打开 <dir>/index.html 时末段按文件名去掉,fetch 落在 <dir>/ 下", () => {
|
|
149
|
+
vi.stubGlobal("location", { pathname: "/foo/index.html" });
|
|
150
|
+
expect(artifactUrl("e/run/a0/trace.json")).toBe("/foo/artifact/e/run/a0/trace.json");
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it("站点根路径不产生双斜杠", () => {
|
|
154
|
+
vi.stubGlobal("location", { pathname: "/" });
|
|
155
|
+
expect(artifactUrl("e/run/a0/events.json")).toBe("/artifact/e/run/a0/events.json");
|
|
156
|
+
});
|
|
157
|
+
});
|
|
@@ -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-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);--color-bad:var(--bad)}}@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-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}: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-\[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}.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-bad{color:var(--color-bad)}.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)}.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}.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-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}
|
|
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}
|