/** * 单测视角渲染器 — 把 EvaluationReport 当作 vitest 风格的测试结果看: * * 每个 sample = 一个 test case * ┌─ 用例设计(测试契约): prompt / rubric / 期望 assertions / 工具调用 mock * ├─ 执行轨迹: thinking + tool calls + 断言绑定到 turn * └─ 断言汇总: 每条 assertion 在哪一步触发,pass/fail * * 数据全部来自 EvaluationReport,不引入新数据源: * - 设计 ← report.sampleSnapshots[sample_id] * - 执行 ← VariantResult.turns / .toolCalls / .mockStats / .fullOutput * - 断言 ← VariantResult.assertions.details (已经有 passed/failed) * * 旧 report 缺 sampleSnapshots 时降级显示("无设计快照,只有执行结果")。 */ import type { EvaluationReport, SampleSnapshot, VariantResult, Lang } from '../types/index.js'; import type { Assertion } from '../types/eval.js'; import type { ToolCallInfo, TurnInfo } from '../types/executor.js'; import type { AssertionDetail } from '../types/judge.js'; /** Tool call 的稳定签名,用于在 turns 里反查 turn 序号。 */ export declare function toolCallSignature(tc: ToolCallInfo): string; /** 走 turns 数组,给每个 tool call 标一个 turn 编号(1-based)。导出供单测验证。 */ export declare function indexToolCallsByTurn(turns: TurnInfo[] | undefined): Map; /** 字符串解析:`tool_input_contains` / `tool_output_contains` 用 `Tool:substring` 格式。 */ export declare function parseToolColonValue(value: string): { tool: string; needle: string; }; /** 把单条 assertion 绑定到某一步。匹配不到返回 null(contains/regex 等作用于 fullOutput * 的天然没有 turn 绑定)。导出供单测。 * * 局限:mock_hit 的 turn 绑定靠"该 tool 的第 N 次调用 = 第 N 个 mock"启发式, * 和真实 mock matcher(按 match 规则)可能不一致——状态机 mock 场景下 turn 标签可能近似。 * pass/fail 仍以 AssertionDetail.passed 为准。 */ export declare function findAssertionTurn(assertion: Assertion, detail: AssertionDetail, toolCalls: ToolCallInfo[], turnByCallSig: Map): { turn: number | null; matchedCall?: ToolCallInfo; }; /** 用例的整体 verdict:全部 assertion 通过 → pass;任一失败 → fail;无 assertion → 视为 pass(谨慎)。 */ export declare function sampleVerdict(details: AssertionDetail[] | undefined): 'pass' | 'fail'; /** * 判断 sample 是否是"诱错样本(tripwire)"——视觉上要跟普通 fail 区分开。 * * 识别来源(任一即算): * 1. snapshot.tripwire === true(generator/作者显式标记) * 2. diagnostic.rootCause 包含 'tripwire_intentional'(LLM 诊断时自己识破的) * * 用途:UI 把诱错样本的失败渲染成紫色 "🪤 诱错触发" 而非红色 "✗ FAIL", * 避免使用者误以为是要修的真 bug。 */ export declare function isTripwireSample(snapshot: SampleSnapshot | undefined, variant: VariantResult): boolean; export declare function renderTurnContent(turn: TurnInfo, lang: Lang): string; export declare function renderTestView(report: EvaluationReport, lang: Lang): string; /** 单测视角的 CSS。 * * 设计原则: * - **scoped 浅色岛**:外层 layout 是深色主题(评分 tab 用),test view 在 .tv-root * 里覆盖一套浅色变量,实现"切到单测 tab = 切到杂志阅读模式"。 * - **潘通启发的哑色调**:sage/dusty rose/mauve(饱和度 ~50%),不像 GitHub error log。 * - **大字号 + 高行高**:正文 15px / 行高 1.75,代码 13px。中文优先 PingFang/YaHei。 * - **subtle shadow 替代 border**:卡片间 16-24px 留白,box-shadow 浮起感。 * - **default-collapsed**:通过的用例只显一行;失败/诱错展开诊断,其余 section 折叠。 */ export declare const TEST_VIEW_CSS = "\n/* tv-root: \u767D\u5E95\u5361\u7247(\u4E0E hero / \u7ED3\u8BBA / fold \u540C\u4E00\u89C6\u89C9\u8BED\u8A00),\u5185\u90E8\u9010\u7528\u4F8B\u662F hairline \u5206\u9694\u7684\u5217\u8868\u9879\u3002\n \u4ECD\u4FDD\u7559\u4E00\u5957 scoped \u53D8\u91CF\u7ED9\u5BCC\u5185\u5BB9(\u8BCA\u65AD / \u8F68\u8FF9)\u7528,\u8272\u8C03\u5BF9\u9F50\u5916\u5C42\u51B7\u7070\u9875\u9762\u3002 */\n.tv-root {\n --tv-bg:#ffffff; --tv-bg-card:#ffffff; --tv-bg-soft:rgba(99,112,131,.05);\n --tv-text:#2c333f; --tv-text-2:#637083; --tv-text-3:#9ca3af;\n --tv-divider:#edf0f5;\n /* pass / fail / tripwire \u7528\u5F62\u72B6 + \u8272\u76F8\u533A\u5206(\u8272\u76F2\u53CB\u597D) */\n --tv-pass:#1f9d63; --tv-fail:#dc2626; --tv-tripwire:#7c3aed;\n --tv-pass-soft:rgba(31,157,99,.10); --tv-fail-soft:rgba(220,38,38,.10); --tv-tripwire-soft:rgba(124,58,237,.10);\n --tv-accent:#4f46e5; --tv-warn:#d97706;\n --tv-shadow:0 1px 3px rgba(0,0,0,.06);\n --tv-shadow-hover:0 2px 8px rgba(0,0,0,.10);\n background:#fff; color:var(--tv-text);\n border:1px solid #e4e8f1; border-radius:12px; box-shadow:0 8px 24px rgba(31,41,55,.04);\n padding:8px 16px 12px; margin:0;\n font-family:-apple-system,BlinkMacSystemFont,\"PingFang SC\",\"Microsoft YaHei\",\"Segoe UI\",sans-serif;\n font-size:15px; line-height:1.75;\n}\n/* \u591A variant \u63D0\u793A + \u4E3B\u8F6E\u6807\u7B7E */\n.tv-root .tv-multi-hint { font-size:13px;color:var(--tv-text-2);margin:0 0 16px;line-height:1.6 }\n.tv-root .tv-primary-note { font-size:13px;color:var(--tv-text-3);font-family:\"SF Mono\",Menlo,monospace;margin-right:6px }\n/* \u5404\u8F6E\u5206\u6570\u8F68\u8FF9\u6761 \u2014 round-0 3.86 \u203A round-1 1.71 \u203A round-2 1.59[\u6700\u65B0],\u6309\u5206\u7740\u8272,\u4E3B\u8F6E\u52A0\u6846 */\n.tv-root .tv-rounds { display:flex;flex-wrap:wrap;align-items:center;gap:6px 4px;margin:0 0 18px }\n.tv-root .tv-round { display:inline-flex;align-items:center;gap:5px;font-size:13px;padding:5px 10px;border-radius:14px;background:var(--tv-bg-soft);color:var(--tv-text-2);border:1px solid transparent }\n.tv-root .tv-round b { font-variant-numeric:tabular-nums;font-family:\"SF Mono\",Menlo,monospace;font-weight:700 }\n.tv-root .tv-round--pass b { color:var(--tv-pass) }\n.tv-root .tv-round--warn b { color:var(--tv-warn) }\n.tv-root .tv-round--fail b { color:var(--tv-fail) }\n.tv-root .tv-round--current { border-color:var(--tv-accent);background:rgba(79,70,229,.06);color:var(--tv-text);font-weight:600 }\n.tv-root .tv-round--missing { color:var(--tv-text-3);font-style:italic }\n.tv-root .tv-round-icon { font-size:11px;font-weight:700 }\n.tv-root .tv-round-icon--pass { color:var(--tv-pass) }\n.tv-root .tv-round-icon--fail { color:var(--tv-fail) }\n.tv-root .tv-round-cur { font-size:11px;color:var(--tv-accent);font-weight:600;margin-left:2px }\n.tv-root .tv-round-arrow { color:var(--tv-text-3);font-size:13px;margin:0 1px }\n/* \u5176\u4ED6\u8F6E\u8BE6\u60C5\u5757(\u6298\u53E0\u5185) */\n.tv-root .tv-round-detail { padding:14px 0;border-top:1px dashed var(--tv-divider) }\n.tv-root .tv-round-detail:first-child { border-top:none;padding-top:4px }\n.tv-root .tv-round-detail-h { font-size:14px;font-weight:600;color:var(--tv-text);margin-bottom:10px;display:flex;align-items:center;gap:8px }\n.tv-root .tv-round-detail-icon { font-size:13px;font-weight:700 }\n.tv-root .tv-round-detail-icon--pass { color:var(--tv-pass) }\n.tv-root .tv-round-detail-icon--fail { color:var(--tv-fail) }\n.tv-root .tv-round-detail-icon--tripwire { color:var(--tv-tripwire) }\n.tv-root .tv-round-detail-score { font-family:\"SF Mono\",Menlo,monospace;font-weight:400;color:var(--tv-text-2);font-size:13px }\n/* Stats \u2014 \u66F4\u6241\u5E73\u7684\u6570\u5B57+\u6807\u7B7E\u5E03\u5C40 */\n.tv-root .tv-variant-stats { display:flex;gap:32px;margin:6px 0 10px;padding:0 14px;font-size:14px;color:var(--tv-text-2);align-items:baseline }\n.tv-root .tv-stat { display:flex;align-items:baseline;gap:6px }\n.tv-root .tv-stat-num { color:var(--tv-text);font-weight:600;font-size:18px;font-variant-numeric:tabular-nums }\n.tv-root .tv-stat--pass .tv-stat-num { color:var(--tv-pass) }\n.tv-root .tv-stat--fail .tv-stat-num { color:var(--tv-fail) }\n.tv-root .tv-stat--tripwire .tv-stat-num { color:var(--tv-tripwire) }\n/* Group separator \u2014 \u5361\u7247\u5185\u5206\u7EC4\u5C0F\u6807\u9898 */\n.tv-root .tv-group-sep { display:flex;align-items:center;gap:12px;margin:18px 0 4px;padding:0 14px;color:var(--tv-text-3);font-size:11.5px;text-transform:uppercase;letter-spacing:0.08em;font-weight:600 }\n.tv-root .tv-group-sep::after { content:'';flex:1;height:1px;background:var(--tv-divider) }\n/* \u5217\u8868\u9879 \u2014 pass row \u4E0E fail/tripwire card \u7EDF\u4E00\u6210 hairline \u5206\u9694\u7684\u884C,\u65E0\u9634\u5F71/\u65E0\u5DE6\u8272\u6761;\n \u72B6\u6001\u9760\u5DE6\u4FA7\u72B6\u6001\u70B9,hover/\u5C55\u5F00\u65F6\u6574\u884C\u6DE1\u5E95\u9AD8\u4EAE\u3002 */\n.tv-root .tv-rows { display:flex;flex-direction:column;margin:0 }\n.tv-root .tv-row, .tv-root .tv-card { background:transparent;border:none;border-bottom:1px solid var(--tv-divider);border-radius:8px;box-shadow:none;margin:0;transition:background .12s }\n.tv-root .tv-row:hover, .tv-root .tv-card:hover { background:var(--tv-bg-soft) }\n.tv-root .tv-row[open], .tv-root .tv-card[open] { background:var(--tv-bg-soft);border-bottom-color:transparent }\n.tv-root .tv-rows .tv-row:last-child, .tv-root .tv-card:last-child { border-bottom:none }\n/* \u805A\u7126:\u5C55\u5F00\u67D0\u6761\u7528\u4F8B\u65F6,\u5176\u4F59\u6536\u8D77\u7684\u884C\u6DE1\u5316,\u7A81\u51FA\u5F53\u524D;hover \u88AB\u6DE1\u5316\u7684\u884C\u53EF\u4E34\u65F6\u6062\u590D\u3002 */\n.tv-root:has(.tv-card[open], .tv-row[open]) .tv-card:not([open]),\n.tv-root:has(.tv-card[open], .tv-row[open]) .tv-row:not([open]) { opacity:.42;transition:opacity .15s }\n.tv-root:has(.tv-card[open], .tv-row[open]) .tv-card:not([open]):hover,\n.tv-root:has(.tv-card[open], .tv-row[open]) .tv-row:not([open]):hover { opacity:1 }\n.tv-root .tv-row-h, .tv-root .tv-card-h { display:flex;align-items:center;gap:13px;padding:14px;cursor:pointer;list-style:none;font-size:14.5px }\n.tv-root .tv-row-h::-webkit-details-marker, .tv-root .tv-card-h::-webkit-details-marker { display:none }\n.tv-root .tv-row-h::after, .tv-root .tv-card-h::after { content:'\u203A';margin-left:4px;color:var(--tv-text-3);font-size:17px;transition:transform .15s }\n.tv-root .tv-row[open] .tv-row-h::after, .tv-root .tv-card[open] .tv-card-h::after { transform:rotate(90deg) }\n.tv-root .tv-card[open] .tv-card-h { border-bottom:1px solid var(--tv-divider) }\n.tv-root .tv-card-preview { padding:0 14px 13px;color:var(--tv-text-2);font-size:13.5px;line-height:1.6 }\n.tv-root .tv-card[open] .tv-card-preview { display:none }\n/* Status dots \u2014 \u7528\u5F62\u72B6 + \u8272 + \u5B57\u7B26\u7684\u4E09\u91CD\u533A\u5206,\u907F\u514D\u8272\u76F2 / \u8FDC\u770B\u96F7\u540C\u3002\n pass: \u5B9E\u5FC3\u5706 sage;fail: \u7EA2 \u2717 \u5B57\u7B26(\u66F4\u663E\u773C);tripwire: \u7D2B\u8272 \u25C6 \u83F1\u5F62\u3002 */\n.tv-root .tv-dot { display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0;font-size:14px;font-weight:700;line-height:1 }\n.tv-root .tv-dot--pass::before { content:'';width:10px;height:10px;border-radius:50%;background:var(--tv-pass);box-shadow:0 0 0 3px var(--tv-pass-soft) }\n.tv-root .tv-dot--fail::before { content:'\u2717';color:var(--tv-fail);font-size:16px;font-weight:700 }\n.tv-root .tv-dot--tripwire::before { content:'\u25C6';color:var(--tv-tripwire);font-size:13px }\n.tv-root .tv-id { font-family:\"SF Mono\",\"JetBrains Mono\",Menlo,Consolas,monospace;font-size:13px;color:var(--tv-text-3) }\n.tv-root .tv-title { flex:1;font-size:15px;color:var(--tv-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap }\n.tv-root .tv-meta { font-size:13px;color:var(--tv-text-3);font-variant-numeric:tabular-nums;font-family:\"SF Mono\",\"JetBrains Mono\",Menlo,monospace }\n/* Composite badge in header \u2014 \u7EFC\u5408\u5206,\u5361\u5934\u53F3\u4FA7\u7D27\u8D34\u8017\u65F6,\u4E00\u773C\u770B\u5206\u9AD8\u4F4E */\n.tv-root .tv-composite { flex-shrink:0;font-size:16px;font-weight:700;font-variant-numeric:tabular-nums;font-family:\"SF Mono\",\"JetBrains Mono\",Menlo,monospace;letter-spacing:-0.02em }\n.tv-root .tv-composite--pass { color:var(--tv-pass) }\n.tv-root .tv-composite--warn { color:var(--tv-warn) }\n.tv-root .tv-composite--fail { color:var(--tv-fail) }\n.tv-root .tv-composite-unit { font-size:11px;color:var(--tv-text-3);font-weight:400;margin-left:1px }\n/* Body padding */\n.tv-root .tv-card-body, .tv-root .tv-row-body { padding:4px 14px 20px }\n/* Score strip \u2014 body \u9876\u90E8\u5206\u5E03\u6761:\u7EFC\u5408 + \u4E09\u5C42 + \u65AD\u8A00,\u6D45\u5E95 chip \u884C */\n.tv-root .tv-scores { display:flex;flex-wrap:wrap;align-items:baseline;gap:8px 20px;margin:0 0 18px;padding:12px 16px;background:var(--tv-bg-soft);border-radius:6px;font-size:13.5px }\n.tv-root .tv-score-item { color:var(--tv-text-2);display:inline-flex;align-items:baseline;gap:5px }\n.tv-root .tv-score-item--primary { color:var(--tv-text);font-weight:600 }\n.tv-root .tv-score-v { font-weight:700;font-variant-numeric:tabular-nums;font-family:\"SF Mono\",\"JetBrains Mono\",Menlo,monospace }\n.tv-root .tv-score-v--pass { color:var(--tv-pass) }\n.tv-root .tv-score-v--warn { color:var(--tv-warn) }\n.tv-root .tv-score-v--fail { color:var(--tv-fail) }\n/* Judge \u8BC4\u4EF7\u6587\u672C\u5757 \u2014 \u4E0E diagnostic \u5E76\u5217,judge \u7B54\"\u6253\u51E0\u5206 + \u4E3A\u4EC0\u4E48\" */\n.tv-root .tv-judge { margin:0 0 18px }\n.tv-root .tv-judge-h { font-size:13px;font-weight:600;color:var(--tv-text-2);margin-bottom:6px;letter-spacing:0.02em;display:flex;align-items:center;gap:8px;flex-wrap:wrap }\n.tv-root .tv-judge-text { font-size:14px;line-height:1.75;color:var(--tv-text);white-space:pre-wrap;word-break:break-word }\n.tv-root .tv-judge-stab { font-size:12px;color:var(--tv-text-3);font-weight:500;font-family:\"SF Mono\",Menlo,monospace;background:var(--tv-bg-soft);padding:1px 6px;border-radius:3px }\n.tv-root .tv-judge-stab--fail { color:var(--tv-fail);background:var(--tv-fail-soft) }\n/* \u591A\u8BC4\u59D4 ensemble \u5206\u9879 */\n.tv-root .tv-ensemble { margin-top:10px }\n.tv-root .tv-ensemble-row { font-size:13.5px;margin-top:6px;color:var(--tv-text-2) }\n.tv-root .tv-ensemble-row b { color:var(--tv-text);font-weight:600 }\n.tv-root .tv-ensemble-agree { font-size:12px;color:var(--tv-text-3);margin-top:8px }\n/* Tripwire banner \u2014 \u5361\u7247\u9876\u90E8\u7684\u7D2B\u8272\u89E3\u91CA\u5E26 */\n.tv-root .tv-tripwire-banner { margin:0 0 18px;padding:14px 16px;background:var(--tv-tripwire-soft);border-radius:8px }\n.tv-root .tv-tripwire-banner-title { font-size:14px;font-weight:600;color:var(--tv-tripwire);margin-bottom:6px;letter-spacing:0.02em }\n.tv-root .tv-tripwire-banner-body { font-size:14px;color:var(--tv-text-2);line-height:1.7 }\n/* Diagnosis \u2014 \u4E00\u6BB5\u767D\u8BDD + \u5355\u4E00\u84DD\u8272\u5EFA\u8BAE\u5757 + \u6298\u53E0\u7EC6\u8282 */\n.tv-root .tv-diag { margin:4px 0 16px }\n.tv-root .tv-diag-text { font-size:15px;line-height:1.75;color:var(--tv-text);margin:0 0 16px }\n.tv-root .tv-suggestion { background:rgba(79,70,229,.06);border-left:3px solid var(--tv-accent);padding:14px 18px;margin:12px 0;border-radius:0 4px 4px 0 }\n.tv-root .tv-suggestion-label { display:inline-block;color:var(--tv-accent);font-weight:600;font-size:13px;margin-right:8px;letter-spacing:0.02em }\n.tv-root .tv-suggestion-body { margin:6px 0 0;font-size:14.5px;line-height:1.7;color:var(--tv-text) }\n.tv-root .tv-diag-details { margin-top:14px }\n.tv-root .tv-diag-details > summary { cursor:pointer;font-size:13px;color:var(--tv-text-2);list-style:none }\n.tv-root .tv-diag-details > summary::-webkit-details-marker { display:none }\n.tv-root .tv-diag-details > summary::before { content:'\u25B8 ';color:var(--tv-text-3);display:inline-block;width:16px }\n.tv-root .tv-diag-details[open] > summary::before { content:'\u25BE ' }\n.tv-root .tv-diag-details-body { padding:10px 0 0 16px;font-size:14px;line-height:1.7;color:var(--tv-text-2) }\n.tv-root .tv-diag-details-body p { margin:6px 0 }\n.tv-root .tv-diag-details-body strong { color:var(--tv-text);margin-right:6px }\n/* RootCause inline pill */\n.tv-root .tv-diag-rc-pill { font-size:11px;padding:2px 8px;border-radius:10px;background:var(--tv-bg-soft);color:var(--tv-text-2);margin-right:6px;display:inline-block }\n.tv-root .tv-diag-rc--tripwire_intentional { background:rgba(139,124,147,.12);color:var(--tv-tripwire) }\n.tv-root .tv-diag-rc--sample_design { background:rgba(79,70,229,.10);color:var(--tv-accent) }\n.tv-root .tv-diag-rc--skill_doc_unclear, .tv-diag-rc--skill_doc_missing, .tv-root .tv-diag-rc--llm_misread { background:rgba(217,119,6,.10);color:var(--tv-warn) }\n/* Failure-mode chips \u2014 \u4E2D\u6587\u6807\u7B7E,\u663E\u8457\u5C55\u793A\u5728 summary \u4E0B */\n.tv-root .tv-diag-modes { display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:8px 0 14px }\n.tv-root .tv-diag-modes-label { font-size:12px;color:var(--tv-text-2);margin-right:4px }\n.tv-root .tv-diag-mode-pill { font-size:12px;padding:3px 10px;border-radius:11px;background:var(--tv-bg-soft);color:var(--tv-text);font-weight:500 }\n.tv-root .tv-diag-mode--workflow-skip { background:rgba(217,119,6,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--hardcoded { background:rgba(217,119,6,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--hallucination { background:rgba(180,75,75,.14);color:#b44b4b }\n.tv-root .tv-diag-mode--tool-misuse { background:rgba(217,119,6,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--env-blocked { background:rgba(79,70,229,.12);color:var(--tv-accent) }\n.tv-root .tv-diag-mode--misread { background:rgba(217,119,6,.12);color:var(--tv-warn) }\n.tv-root .tv-diag-mode--other { background:var(--tv-bg-soft);color:var(--tv-text-2) }\n/* Workflow checklist \u2014 \u9ED8\u8BA4\u5C55\u5F00,\u653E\u5728 suggestion \u4E4B\u4E0A,\u76F4\u89C2\u5C55\u793A LLM \u8D70\u5BF9\u54EA\u51E0\u6B65 */\n.tv-root .tv-diag-workflow { margin:14px 0;padding:12px 14px;background:var(--tv-bg-soft);border-radius:6px }\n.tv-root .tv-diag-workflow-title { font-size:13px;font-weight:600;color:var(--tv-text);margin:0 0 10px;letter-spacing:0.02em }\n.tv-root .tv-diag-workflow-list { list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px }\n.tv-root .tv-diag-workflow-item { display:flex;align-items:flex-start;gap:10px;line-height:1.6 }\n.tv-root .tv-diag-workflow-icon { flex-shrink:0;font-weight:700;font-size:14px;width:16px;text-align:center;margin-top:2px }\n.tv-root .tv-diag-workflow-item--pass .tv-diag-workflow-icon { color:#3a8a3a }\n.tv-root .tv-diag-workflow-item--fail .tv-diag-workflow-icon { color:#b44b4b }\n.tv-root .tv-diag-workflow-body { display:flex;flex-direction:column;gap:2px;flex:1 }\n.tv-root .tv-diag-workflow-step { font-size:14px;color:var(--tv-text) }\n.tv-root .tv-diag-workflow-evidence { font-size:12.5px;color:var(--tv-text-2);line-height:1.55 }\n.tv-root .tv-diag-workflow-item--fail .tv-diag-workflow-step { color:#b44b4b }\n/* Partial salvage \u63D0\u793A */\n.tv-root .tv-diag-partial { font-size:12px;color:var(--tv-text-3);margin:0 0 8px;font-style:italic }\n/* Sub-sections \u2014 design / trace / assertions, \u5168\u90E8\u9ED8\u8BA4\u6298\u53E0 */\n.tv-root .tv-section { margin-top:6px;border-top:1px solid var(--tv-divider);padding-top:14px }\n.tv-root .tv-section > summary { cursor:pointer;font-size:14px;font-weight:500;color:var(--tv-text);padding:6px 0;list-style:none }\n.tv-root .tv-section > summary::-webkit-details-marker { display:none }\n.tv-root .tv-section > summary::before { content:'\u25B8 ';color:var(--tv-text-3);display:inline-block;width:16px;font-weight:400 }\n.tv-root .tv-section[open] > summary::before { content:'\u25BE ' }\n.tv-root .tv-section-stat { font-weight:400;color:var(--tv-text-3);margin-left:6px;font-size:13px }\n.tv-root .tv-section-body { padding:14px 0 0 16px;font-size:14.5px;line-height:1.7 }\n/* Design fields */\n.tv-root .tv-prompt, .tv-root .tv-rubric { font-size:14.5px;line-height:1.75;margin:8px 0;color:var(--tv-text-2) }\n.tv-root .tv-prompt strong, .tv-root .tv-rubric strong { color:var(--tv-text);margin-right:6px;font-weight:600 }\n.tv-root .tv-meta-pills { margin:10px 0;display:flex;flex-wrap:wrap;gap:8px }\n.tv-root .tv-meta-pill { font-size:12px;padding:3px 10px;background:var(--tv-bg-soft);border-radius:10px;color:var(--tv-text-2);font-family:\"SF Mono\",Menlo,monospace }\n.tv-root .tv-expected { margin-top:12px }\n.tv-root .tv-expected-h { font-size:13px;color:var(--tv-text-2);margin-bottom:6px }\n.tv-root .tv-expect-line { font-size:13px;font-family:\"SF Mono\",Menlo,monospace;color:var(--tv-text-2);padding:3px 0;line-height:1.6 }\n.tv-root .tv-collapsible { margin-top:10px;font-size:13px }\n.tv-root .tv-collapsible > summary { cursor:pointer;color:var(--tv-text-2) }\n/* Mocks */\n.tv-root .tv-mocks { margin-top:8px }\n.tv-root .tv-mock-line { font-size:12px;font-family:\"SF Mono\",Menlo,monospace;padding:3px 0;display:flex;flex-wrap:wrap;gap:6px;align-items:center;line-height:1.6 }\n.tv-root .tv-mock-idx { color:var(--tv-text-3);font-weight:600 }\n.tv-root .tv-mock-tool { background:var(--tv-bg-soft);padding:2px 6px;border-radius:3px }\n.tv-root .tv-mock-match, .tv-root .tv-mock-return { color:var(--tv-text-2);overflow:hidden;text-overflow:ellipsis;max-width:340px;white-space:nowrap }\n.tv-root .tv-mock-arrow { color:var(--tv-text-3) }\n/* Trace turns */\n.tv-root .tv-turn { margin:10px 0;padding:12px 16px;background:var(--tv-bg-soft);border-radius:4px;border-left:2px solid var(--tv-divider) }\n.tv-root .tv-turn-h { font-size:14px;font-weight:500;color:var(--tv-text);margin-bottom:6px }\n.tv-root .tv-turn-dur { color:var(--tv-text-3);font-weight:400;font-size:12px;margin-left:6px }\n.tv-root .tv-thinking { margin:6px 0;font-size:13px }\n.tv-root .tv-thinking summary { cursor:pointer;color:var(--tv-text-3);font-style:italic }\n.tv-root .tv-thinking-body { padding:10px 14px;background:rgba(0,0,0,.04);border-radius:4px;color:var(--tv-text-2);white-space:pre-wrap;font-size:13px;line-height:1.7;margin-top:6px }\n/* Tool calls */\n.tv-root .tv-call { margin:6px 0;padding:10px 14px;background:rgba(0,0,0,.03);border-radius:4px;font-size:13px }\n.tv-root .tv-call--err { border-left:2px solid var(--tv-fail) }\n.tv-root .tv-call-h { font-weight:500;color:var(--tv-text);margin-bottom:4px;font-size:14px }\n.tv-root .tv-call details { margin:4px 0;font-size:12px }\n.tv-root .tv-call summary { cursor:pointer;color:var(--tv-text-3);padding:2px 0 }\n.tv-root .tv-pre { font-family:\"SF Mono\",\"JetBrains Mono\",Menlo,Consolas,monospace;font-size:13px;background:rgba(0,0,0,.04);padding:10px 14px;border-radius:4px;overflow:auto;max-height:320px;white-space:pre-wrap;margin:4px 0;color:var(--tv-text-2);line-height:1.55 }\n.tv-root .tv-mock-badge { font-size:12px;color:var(--tv-pass);background:rgba(125,155,118,.12);padding:2px 8px;border-radius:10px;margin-left:8px }\n.tv-root .tv-trace-assert { font-size:13px;font-family:\"SF Mono\",Menlo,monospace;padding:3px 0;margin-top:6px;line-height:1.5 }\n.tv-root .tv-trace-assert.tv-assert--fail { color:var(--tv-fail) }\n.tv-root .tv-trace-assert.tv-assert--pass { color:var(--tv-text-2) }\n/* Final answer */\n.tv-root .tv-final { margin-top:14px }\n.tv-root .tv-final-h { font-size:14px;font-weight:500;color:var(--tv-text);margin-bottom:6px }\n/* Assertions */\n.tv-root .tv-assert { font-size:14px;font-family:\"SF Mono\",Menlo,monospace;padding:5px 0;line-height:1.6 }\n.tv-root .tv-assert--pass { color:var(--tv-text-2) }\n.tv-root .tv-assert--fail { color:var(--tv-fail) }\n.tv-root .tv-assert-value { background:rgba(0,0,0,.04);padding:2px 6px;border-radius:3px;margin:0 2px }\n.tv-root .tv-turn-tag { font-size:12px;color:var(--tv-text-3);margin-left:8px;font-style:italic;font-family:-apple-system,sans-serif }\n.tv-root .tv-turn-tag--ok { color:var(--tv-pass) }\n.tv-root .tv-turn-tag--miss { color:var(--tv-fail) }\n.tv-root .tv-assert-msg { font-size:13px;color:var(--tv-text-3);margin-left:20px;margin-top:3px }\n/* Empty/warn states */\n.tv-root .tv-empty, .tv-root .tv-empty-page { color:var(--tv-text-3);font-style:italic;padding:14px 0;font-size:14px }\n.tv-root .tv-warn { color:var(--tv-warn);background:rgba(217,119,6,.08);padding:14px 18px;border-radius:4px;margin:8px 24px;font-size:14px;line-height:1.7 }\n"; /** 融合单页全部用原生
折叠,逐用例与各轮对比都不再需要 JS 切换。 * 保留导出(html-renderer 仍引用),内容置空。 */ export declare const TEST_VIEW_JS = "";