@netlify/axis 1.1.7 → 1.3.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/README.md +8 -8
- package/dist/adapters/base/agent-adapter.d.ts.map +1 -1
- package/dist/adapters/base/agent-adapter.js +43 -2
- package/dist/adapters/base/agent-adapter.js.map +1 -1
- package/dist/adapters/registry.d.ts +2 -0
- package/dist/adapters/registry.d.ts.map +1 -1
- package/dist/adapters/registry.js +6 -2
- package/dist/adapters/registry.js.map +1 -1
- package/dist/cli.js +109 -9
- package/dist/cli.js.map +1 -1
- package/dist/config/loader.d.ts +2 -2
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +229 -28
- package/dist/config/loader.js.map +1 -1
- package/dist/config/validator.d.ts +9 -1
- package/dist/config/validator.d.ts.map +1 -1
- package/dist/config/validator.js +75 -4
- package/dist/config/validator.js.map +1 -1
- package/dist/report-ui/index.html +201 -151
- package/dist/reports/html.d.ts.map +1 -1
- package/dist/reports/html.js +2 -1
- package/dist/reports/html.js.map +1 -1
- package/dist/reports/writer.d.ts.map +1 -1
- package/dist/reports/writer.js +3 -0
- package/dist/reports/writer.js.map +1 -1
- package/dist/runner/runner.d.ts.map +1 -1
- package/dist/runner/runner.js +152 -13
- package/dist/runner/runner.js.map +1 -1
- package/dist/scoring/index.d.ts.map +1 -1
- package/dist/scoring/index.js +4 -1
- package/dist/scoring/index.js.map +1 -1
- package/dist/scoring/sparse-index.d.ts +6 -1
- package/dist/scoring/sparse-index.d.ts.map +1 -1
- package/dist/scoring/sparse-index.js +43 -15
- package/dist/scoring/sparse-index.js.map +1 -1
- package/dist/transcript/extract.d.ts.map +1 -1
- package/dist/transcript/extract.js +33 -3
- package/dist/transcript/extract.js.map +1 -1
- package/dist/types/agent.d.ts +4 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/config.d.ts +27 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/output.d.ts +12 -2
- package/dist/types/output.d.ts.map +1 -1
- package/dist/types/output.js.map +1 -1
- package/dist/types/report.d.ts +3 -1
- package/dist/types/report.d.ts.map +1 -1
- package/dist/types/scenario.d.ts +16 -2
- package/dist/types/scenario.d.ts.map +1 -1
- package/dist/types/scoring.d.ts +4 -0
- package/dist/types/scoring.d.ts.map +1 -1
- package/dist/ui/LiveStatus.js +10 -5
- package/dist/ui/LiveStatus.js.map +1 -1
- package/dist/ui/format.d.ts +4 -0
- package/dist/ui/format.d.ts.map +1 -1
- package/dist/ui/format.js +34 -18
- package/dist/ui/format.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>AXIS Report</title><style>:root{--bg: #fafbf9;--bg-card: #ffffff;--bg-alt: #f3f4f6;--text: #1a1a2e;--text-secondary: #4a5568;--text-muted: #637083;--mid-gray: #6b7280;--light-gray: #e5e7eb;--border: #e5e7eb;--accent: #016867;--accent-hover: #015554;--accent-bright: #2dd4bf;--accent-light: rgba(1, 104, 103, .07);--success: #059669;--success-light: #ecfdf5;--yellow: #d97706;--yellow-light: #fffbeb;--warning: #d97706;--warning-light: #fffbeb;--danger: #dc2626;--danger-light: #fef2f2;--cat-env: #059669;--cat-svc: #2563eb;--cat-agent: #6b7280;--radius: 8px;--radius-lg: 12px;--shadow: 0 1px 3px rgba(0, 0, 0, .04), 0 2px 8px rgba(0, 0, 0, .03);--shadow-lg: 0 4px 16px rgba(0, 0, 0, .06), 0 0 40px rgba(1, 104, 103, .04);--font: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, Roboto, sans-serif;--font-mono: "SF Mono", SFMono-Regular, Menlo, Consolas, monospace;--transition: .15s ease}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{font-size:15px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{font-family:var(--font);color:var(--text);background:var(--bg);line-height:1.6;min-height:100vh}.container{max-width:1120px;margin:0 auto;padding:32px 24px 64px}h1{font-size:2rem;font-weight:800;letter-spacing:-.02em;background:linear-gradient(135deg,var(--text) 0%,var(--accent) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}h2{font-size:1.375rem;font-weight:700;letter-spacing:-.01em;color:var(--text)}h3{font-size:1.0625rem;font-weight:600;color:var(--text)}.report-header{display:flex;align-items:flex-start;justify-content:space-between;gap:32px;margin-bottom:32px}.header-left{flex:1;min-width:0}.report-branding{display:flex;align-items:baseline;gap:12px;margin-bottom:16px}.site-logo-mark{font-size:2.0625rem;font-weight:800;letter-spacing:.12em;color:var(--accent)}.logo-ax{letter-spacing:-.06em}.logo-i{display:inline-block;font-style:italic;transform:skew(-20deg);margin-left:2px;margin-right:-2px}.report-badge{font-size:2.0625rem;font-weight:800;letter-spacing:.02em;color:var(--accent)}.report-meta{margin:0}.report-meta-row{font-size:.875rem;line-height:1.8;color:var(--text-secondary)}.report-meta-label{font-weight:600;color:var(--text)}.report-meta-value{color:var(--text-secondary)}.report-meta-id{font-family:var(--font-mono);font-size:.8125rem}.summary-card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:24px 28px;box-shadow:var(--shadow);flex-shrink:0;display:flex;align-items:center;gap:24px}.summary-hero{text-align:center;padding:0 8px}.summary-hero .hero-score{font-size:2.5rem;font-weight:800;line-height:1;color:var(--accent)}.summary-hero .hero-label{font-size:.6875rem;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);font-weight:600;margin-top:4px;white-space:nowrap}.summary-divider{width:1px;align-self:stretch;background:var(--border)}.summary-stats{display:flex;gap:20px;align-items:flex-start}.summary-stat{text-align:center;min-width:48px}.summary-stat .stat-value{font-size:1.25rem;font-weight:700;color:var(--text);line-height:1.2;margin-bottom:2px}.summary-stat .stat-label{font-size:.625rem;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);font-weight:500;white-space:nowrap}.summary-stat.stat-passed .stat-value{color:var(--success)}.summary-stat.stat-failed .stat-value{color:var(--danger)}.summary-stat.stat-skipped .stat-value{color:var(--text-muted)}.score-badge{display:inline-flex;align-items:center;justify-content:center;min-width:36px;height:28px;padding:0 8px;border-radius:14px;font-size:.8125rem;font-weight:700;color:#fff;line-height:1}.score-badge.score-green{background:var(--success)}.score-badge.score-yellow{background:var(--yellow)}.score-badge.score-orange{background:#ea580c}.score-badge.score-red{background:var(--danger)}.score-badge.score-na{background:var(--mid-gray);font-weight:500}.score-badge-lg{min-width:64px;height:64px;border-radius:32px;font-size:1.5rem;padding:0 16px}.results-section{margin-top:32px}.results-table{width:100%;border-collapse:collapse;font-size:.875rem}.results-table thead th{text-align:left;padding:10px 12px;font-size:.6875rem;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);font-weight:600;border-bottom:2px solid var(--light-gray);white-space:nowrap}.results-table thead th.col-score{text-align:center;width:60px}.results-table thead th.col-right{text-align:right}.result-row{cursor:pointer;transition:background var(--transition)}.result-row:hover,.result-row.expanded{background:var(--accent-light)}.result-row td{padding:12px;border-bottom:1px solid var(--light-gray);vertical-align:middle}.result-row td.col-score{text-align:center}.result-row td.col-right{text-align:right;font-family:var(--font-mono);font-size:.8125rem;color:var(--text-secondary)}.result-row td.col-scenario{font-weight:500;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.result-row td.col-agent{color:var(--text-secondary);font-family:var(--font-mono);font-size:.8125rem}.result-row .expand-icon{display:inline-block;width:16px;color:var(--text-muted);transition:transform var(--transition);font-size:.625rem;opacity:.5}.result-row.expanded .expand-icon{transform:rotate(90deg)}.error-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;margin-left:6px;border:1px solid var(--light-gray);border-radius:50%;background:var(--bg-card);color:var(--danger);font-size:.75rem;font-weight:600;cursor:pointer;vertical-align:middle;line-height:1;transition:background var(--transition),border-color var(--transition)}.error-btn:hover{background:var(--danger-light);border-color:var(--danger)}.modal-error-text{border-color:var(--danger)!important;background:var(--danger-light)!important}.scenario-header-row{cursor:pointer;background:#e8ebe5;transition:background var(--transition)}.scenario-header-row:hover{background:#e0e3dc}.scenario-header-row td{padding:14px 12px;vertical-align:middle;border-bottom:1px solid var(--border)}.scenario-header-row td.col-scenario-header{font-size:.9375rem;font-weight:700;letter-spacing:-.01em;color:var(--text);padding-left:0}.scenario-header-row .expand-icon{display:inline-block;width:16px;color:var(--text-muted);transition:transform var(--transition);font-size:.75rem}.scenario-header-row.expanded .expand-icon{transform:rotate(90deg)}.agent-row td.col-expand-indent{text-align:center}.agent-row.scenario-collapsed,.detail-row.scenario-collapsed,.detail-row{display:none}.detail-row.visible{display:table-row}.detail-row td{padding:0;border-bottom:2px solid var(--light-gray)}.detail-panel{padding:24px;background:var(--bg)}.score-overview{display:flex;align-items:flex-start;gap:32px;margin-bottom:32px;padding-bottom:24px;border-bottom:1px solid var(--light-gray)}.score-overview .big-score{flex-shrink:0}.category-bars{flex:1;display:flex;flex-direction:column;gap:8px;padding-top:4px}.category-bar-row{display:flex;align-items:center;gap:12px}.category-bar-label{width:120px;font-size:.8125rem;font-weight:500;color:var(--text-secondary);flex-shrink:0}.category-bar-value{font-size:.8125rem;font-weight:600;width:32px;text-align:right;flex-shrink:0}.progress-bar{flex:1;height:8px;background:var(--light-gray);border-radius:4px;overflow:hidden;min-width:80px}.progress-bar .fill{height:100%;border-radius:4px;transition:width .4s ease}.progress-bar .fill.fill-green{background:var(--success)}.progress-bar .fill.fill-yellow{background:var(--yellow)}.progress-bar .fill.fill-orange{background:#ea580c}.progress-bar .fill.fill-red{background:var(--danger)}.detail-sections{display:flex;flex-direction:column;gap:20px}.detail-section{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:20px;box-shadow:var(--shadow)}.section-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}.section-header h3{display:flex;align-items:center;gap:8px}.section-score{font-size:.875rem;font-weight:600;color:var(--text-secondary)}.criteria-list{display:flex;flex-direction:column;gap:12px}.criterion-item{padding:12px;background:var(--bg);border-radius:var(--radius);border:1px solid var(--light-gray)}.criterion-top{display:flex;align-items:center;gap:8px;margin-bottom:6px}.criterion-icon{font-size:.875rem;width:20px;text-align:center;flex-shrink:0}.criterion-icon.high{color:var(--success)}.criterion-icon.good{color:var(--yellow)}.criterion-icon.medium{color:#ea580c}.criterion-icon.low{color:var(--danger)}.criterion-name{flex:1;font-size:.8125rem;font-weight:500}.criterion-score{font-size:.8125rem;font-weight:600;color:var(--text-secondary);flex-shrink:0}.criterion-weight{font-size:.6875rem;color:var(--text-muted);background:var(--light-gray);padding:1px 6px;border-radius:3px;flex-shrink:0}.criterion-bar{margin-bottom:8px}.criterion-rationale{font-size:.8125rem;color:var(--text-secondary);line-height:1.5;font-style:italic}.criterion-perfect{padding:8px 12px;background:var(--success-light);border-left:3px solid var(--success)}.criterion-perfect .criterion-bar{display:none}.criterion-imperfect{border-left:3px solid var(--warning)}.dim-tags{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}.dim-tag{font-size:.6875rem;font-weight:600;font-family:var(--font-mono);padding:2px 8px;border-radius:10px;color:#fff}.dim-tag.fill-green{background:var(--success)}.dim-tag.fill-yellow{background:var(--yellow)}.dim-tag.fill-orange{background:#ea580c}.dim-tag.fill-red{background:var(--danger)}.cat-deduction-item{padding:8px 0;border-bottom:1px solid rgba(217,119,6,.15)}.cat-deduction-item:last-child{border-bottom:none;padding-bottom:0}.cat-deduction-id{font-family:var(--font-mono);font-size:.75rem;font-weight:600;color:var(--text);margin-right:8px}.cat-deduction-scores{display:inline-flex;gap:4px}.dim-score-tag{font-size:.625rem;font-family:var(--font-mono);background:var(--light-gray);padding:1px 5px;border-radius:3px;color:var(--text-secondary)}.cat-deduction-rationale{display:block;font-size:.75rem;color:var(--text-secondary);line-height:1.5;font-style:italic;margin-top:4px}.cat-deduction-note{font-size:.75rem;color:var(--text-muted);font-style:italic}.deductions-baseline{background:var(--bg);border-color:var(--light-gray)}.deductions-baseline .deductions-header{color:var(--text-muted)}.dimensions-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px;margin-bottom:16px}.dimension-item{display:flex;align-items:center;gap:8px}.dimension-label{width:72px;font-size:.75rem;font-weight:500;color:var(--text-secondary);flex-shrink:0}.dimension-value{font-size:.75rem;font-weight:600;width:28px;text-align:right;flex-shrink:0}.interaction-meta{font-size:.75rem;color:var(--text-muted);margin-bottom:12px}.audits-section{margin-top:12px}.audits-toggle{font-size:.75rem;color:var(--accent);background:none;border:none;cursor:pointer;font-family:var(--font);padding:4px 0;font-weight:500}.audits-toggle:hover{color:var(--accent-hover)}.audits-list{display:none;margin-top:8px}.audits-list.visible{display:block}.audit-item{padding:10px 12px;background:var(--bg);border-radius:var(--radius);margin-bottom:6px;border-left:3px solid var(--mid-gray)}.audit-header{display:flex;align-items:center;gap:8px;margin-bottom:4px;flex-wrap:wrap}.audit-id{font-family:var(--font-mono);font-size:.75rem;font-weight:600;color:var(--text)}.audit-scores{font-family:var(--font-mono);font-size:.6875rem;color:var(--text-muted)}.audit-rationale{font-size:.8125rem;color:var(--text-secondary);line-height:1.5}.necessity-section{margin-top:12px;padding-top:12px;border-top:1px solid var(--light-gray)}.necessity-header{display:flex;align-items:center;gap:8px;margin-bottom:4px}.necessity-label{font-size:.75rem;font-weight:600;color:var(--text-secondary)}.necessity-score{font-size:.75rem;font-weight:600}.necessity-rationale{font-size:.8125rem;color:var(--text-secondary);font-style:italic}.waterfall{font-size:.8125rem}.waterfall-header{display:flex;align-items:flex-end;border-bottom:1px solid var(--light-gray);padding-bottom:6px;margin-bottom:2px}.wf-label-col{width:200px;flex-shrink:0;display:flex;align-items:center;gap:6px;overflow:hidden}.waterfall-header .wf-label-col,.waterfall-header .wf-dur-col{font-size:.6875rem;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);font-weight:600}.wf-timeline-col{flex:1;min-width:0;position:relative}.wf-dur-col{width:64px;flex-shrink:0;text-align:right;font-family:var(--font-mono);font-size:.75rem;color:var(--text-secondary)}.wf-ticks{position:relative;height:18px}.wf-tick{position:absolute;transform:translate(-50%);font-family:var(--font-mono);font-size:.625rem;color:var(--text-muted);white-space:nowrap;top:0}.wf-tick:after{content:"";position:absolute;left:50%;top:100%;width:1px;height:4px;background:var(--light-gray)}.waterfall-body{position:relative}.wf-row{display:flex;align-items:center;height:26px;border-bottom:1px solid rgba(0,0,0,.03)}.wf-row:hover{background:var(--accent-light)}.wf-id{font-family:var(--font-mono);font-size:.6875rem;color:var(--text-muted);width:28px;flex-shrink:0}.wf-cat{font-size:.625rem;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted);width:36px;flex-shrink:0}.wf-tool{font-size:.75rem;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wf-track{position:relative;height:14px;background:#00000004;border-radius:2px}.wf-bar{position:absolute;top:2px;height:10px;border-radius:2px;min-width:3px;cursor:default;transition:opacity var(--transition)}.wf-row:hover .wf-bar{opacity:.8}.wf-env .wf-bar{background:var(--cat-env)}.wf-svc .wf-bar{background:var(--cat-svc)}.wf-agent .wf-bar{background:var(--cat-agent)}.wf-bar-error{background:var(--danger)!important}.wf-show-all{display:block;width:100%;margin-top:4px;padding:6px;font-size:.75rem;color:var(--accent);background:none;border:1px dashed var(--light-gray);border-radius:var(--radius);cursor:pointer;font-family:var(--font);font-weight:500}.wf-show-all:hover{background:var(--accent-light);border-color:var(--accent)}.wf-legend{display:flex;gap:16px;margin-top:10px;padding-top:8px;border-top:1px solid var(--light-gray)}.wf-legend-item{display:flex;align-items:center;gap:5px;font-size:.6875rem;color:var(--text-muted)}.wf-legend-dot{width:10px;height:10px;border-radius:2px}.wf-legend-dot.wf-env{background:var(--cat-env)}.wf-legend-dot.wf-svc{background:var(--cat-svc)}.wf-legend-dot.wf-agent{background:var(--cat-agent)}.sparse-index-section{margin-top:16px}.sparse-index-toggle{font-size:.75rem;color:var(--accent);background:none;border:none;cursor:pointer;font-family:var(--font);padding:4px 0;font-weight:500}.sparse-index-content{display:none;margin-top:8px}.sparse-index-content.visible{display:block}.sparse-line{font-family:var(--font-mono);font-size:.75rem;line-height:1.8;padding:3px 10px;border-left:3px solid var(--cat-agent);white-space:pre;overflow-x:auto}.sparse-line.cat-env{border-left-color:var(--cat-env);background:#0596690a}.sparse-line.cat-svc{border-left-color:var(--cat-svc);background:#2563eb0a}.sparse-line.cat-agent{border-left-color:var(--cat-agent)}.sparse-line-expandable{cursor:pointer;position:relative}.sparse-line-expandable:after{content:"▶";position:absolute;right:8px;top:4px;font-size:.6rem;color:var(--text-secondary);transition:transform .15s ease}.sparse-line-expandable.expanded:after{transform:rotate(90deg)}.sparse-line-expandable:hover{background:var(--accent-light)}.sparse-line-content{display:none;margin:4px 0 8px 12px;padding:8px 12px;background:var(--bg-alt);border-radius:4px;border:1px solid var(--border)}.sparse-line-expandable.expanded .sparse-line-content{display:block}.sparse-line-content pre{margin:0;font-family:var(--font-mono);font-size:.7rem;line-height:1.5;white-space:pre-wrap;word-break:break-word;color:var(--text)}.sparse-expand-all{font-size:.75rem;color:var(--accent);background:none;border:none;cursor:pointer;font-family:var(--font);padding:4px 0;font-weight:500;margin-left:12px}.info-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;margin-left:6px;border:1px solid var(--light-gray);border-radius:50%;background:var(--bg-card);color:var(--accent);font-size:.75rem;font-weight:600;cursor:pointer;vertical-align:middle;line-height:1;transition:background var(--transition),border-color var(--transition)}.info-btn:hover{background:var(--accent-light);border-color:var(--accent)}.modal-backdrop{display:none;position:fixed;inset:0;z-index:100;background:#1a1a2e73;align-items:center;justify-content:center;padding:24px}.modal-backdrop.visible{display:flex}.modal{background:var(--bg-card);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg),0 8px 32px #0000001f;max-width:640px;width:100%;max-height:80vh;overflow-y:auto;animation:modal-in .15s ease}@keyframes modal-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px 16px;border-bottom:1px solid var(--light-gray)}.modal-header h3{font-size:1.0625rem;font-weight:600;margin-bottom:2px}.modal-subtitle{font-size:.75rem;font-family:var(--font-mono);color:var(--text-muted)}.modal-close{background:none;border:none;font-size:1.5rem;line-height:1;color:var(--text-muted);cursor:pointer;padding:0 4px;flex-shrink:0;transition:color var(--transition)}.modal-close:hover{color:var(--text)}.modal-body{padding:20px 24px 24px}.modal-section{margin-bottom:20px}.modal-section:last-child{margin-bottom:0}.modal-section h4{font-size:.6875rem;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);font-weight:600;margin-bottom:8px}.modal-prompt{font-family:var(--font-mono);font-size:.8125rem;line-height:1.6;background:var(--bg);border:1px solid var(--light-gray);border-radius:var(--radius);padding:12px 16px;white-space:pre-wrap;word-break:break-word;max-height:240px;overflow-y:auto}.modal-rubric-table{width:100%;border-collapse:collapse;font-size:.8125rem}.modal-rubric-table thead th{text-align:left;padding:6px 10px;font-size:.6875rem;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);font-weight:600;border-bottom:1px solid var(--light-gray)}.modal-rubric-table tbody td{padding:8px 10px;border-bottom:1px solid var(--light-gray);color:var(--text-secondary)}.modal-rubric-weight{width:60px;text-align:right;font-family:var(--font-mono);font-weight:600;color:var(--text)!important}.modal-config{display:flex;flex-direction:column;gap:6px}.modal-config-item{display:flex;align-items:baseline;gap:12px;font-size:.8125rem;padding:6px 10px;background:var(--bg);border-radius:var(--radius)}.modal-config-key{font-family:var(--font-mono);font-weight:600;color:var(--text);flex-shrink:0}.modal-config-val{font-family:var(--font-mono);color:var(--text-secondary);word-break:break-all}.error-banner{background:var(--danger-light);border:1px solid var(--danger);border-radius:var(--radius);padding:12px 16px;color:var(--danger);font-size:.875rem;font-weight:500;margin-bottom:16px}.loading{text-align:center;padding:80px 24px;color:var(--text-muted);font-size:1.125rem}.empty-state{text-align:center;padding:60px 24px;color:var(--text-muted)}@media(max-width:768px){.container{padding:16px 12px 48px}.report-header{flex-direction:column;gap:16px}.report-branding{gap:8px;margin-bottom:8px}.site-logo-mark,.report-badge{font-size:1.5rem}.report-meta-row{font-size:.8125rem;line-height:1.7}.summary-card{padding:16px;flex-direction:column;gap:16px;width:100%}.summary-hero .hero-score{font-size:2rem}.summary-divider{width:100%;height:1px;align-self:auto}.summary-stats{flex-wrap:wrap;gap:16px;justify-content:center}.results-table{font-size:.8125rem}.results-table thead th{padding:8px 6px}.results-table thead th.hide-mobile,.results-table tbody td.hide-mobile{display:none}.result-row td{padding:10px 6px}.result-row td:first-child{padding-left:4px;padding-right:0;width:20px}.result-row .expand-icon{width:12px;font-size:.625rem}.result-row td.col-scenario{max-width:120px;font-size:.75rem}.result-row td.col-agent{max-width:70px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.6875rem}.scenario-header-row td{padding:10px 6px}.scenario-header-row td.col-scenario-header{font-size:.8125rem}.agent-row td.col-agent{padding-left:16px}.detail-panel{padding:16px 12px}.score-overview{flex-direction:column;align-items:center;gap:16px}.category-bars{width:100%}.category-bar-label{width:80px;font-size:.75rem}.dimensions-grid{grid-template-columns:1fr}.criterion-top{flex-wrap:wrap}.criterion-name{min-width:0;word-break:break-word}.cat-deduction-item{flex-direction:column;gap:4px;align-items:flex-start}.waterfall{overflow-x:auto;-webkit-overflow-scrolling:touch}.wf-label-col{width:100px}.wf-dur-col{width:48px;font-size:.6875rem}.wf-tool{font-size:.625rem;max-width:50px;overflow:hidden;text-overflow:ellipsis}.wf-id,.wf-cat{font-size:.5625rem}.wf-legend{flex-wrap:wrap;gap:8px}.sparse-line{font-size:.6875rem;word-break:break-all}.modal-backdrop{padding:12px}.modal{max-height:90vh;border-radius:var(--radius)}.modal-header{padding:16px}.modal-header h3{font-size:1rem}.modal-body{padding:16px}.modal-prompt{font-size:.75rem}.audit-header{flex-direction:column;gap:4px}.necessity-header{flex-wrap:wrap;gap:4px}}@media print{.detail-row{display:table-row!important}.audits-list,.sparse-index-content{display:block!important}.result-row{cursor:default}.wf-overflow{display:block!important}.wf-show-all,.expand-icon,.audits-toggle,.sparse-index-toggle,.info-btn{display:none!important}.agent-row.scenario-collapsed{display:table-row!important}.modal-backdrop{display:none!important}}
|
|
2
|
-
</style></head> <body> <div id="app"> <div class="loading">Loading report…</div> </div> <script id="axis-data" type="application/json">__AXIS_REPORT_DATA__</script> <script type="module">function
|
|
1
|
+
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>AXIS Report</title><style>:root{--bg: #fafbf9;--bg-card: #ffffff;--bg-alt: #f3f4f6;--text: #1a1a2e;--text-secondary: #4a5568;--text-muted: #637083;--mid-gray: #6b7280;--light-gray: #e5e7eb;--border: #e5e7eb;--accent: #016867;--accent-hover: #015554;--accent-bright: #2dd4bf;--accent-light: rgba(1, 104, 103, .07);--success: #059669;--success-light: #ecfdf5;--yellow: #d97706;--yellow-light: #fffbeb;--warning: #d97706;--warning-light: #fffbeb;--danger: #dc2626;--danger-light: #fef2f2;--cat-env: #059669;--cat-svc: #2563eb;--cat-agent: #6b7280;--radius: 8px;--radius-lg: 12px;--shadow: 0 1px 3px rgba(0, 0, 0, .04), 0 2px 8px rgba(0, 0, 0, .03);--shadow-lg: 0 4px 16px rgba(0, 0, 0, .06), 0 0 40px rgba(1, 104, 103, .04);--font: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, Roboto, sans-serif;--font-mono: "SF Mono", SFMono-Regular, Menlo, Consolas, monospace;--transition: .15s ease}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{font-size:15px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{font-family:var(--font);color:var(--text);background:var(--bg);line-height:1.6;min-height:100vh}.container{max-width:1120px;margin:0 auto;padding:32px 24px 64px}h1{font-size:2rem;font-weight:800;letter-spacing:-.02em;background:linear-gradient(135deg,var(--text) 0%,var(--accent) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}h2{font-size:1.375rem;font-weight:700;letter-spacing:-.01em;color:var(--text)}h3{font-size:1.0625rem;font-weight:600;color:var(--text)}.report-header{display:flex;align-items:flex-start;justify-content:space-between;gap:32px;margin-bottom:32px}.header-left{flex:1;min-width:0}.report-branding{display:flex;align-items:baseline;gap:12px;margin-bottom:16px}.site-logo-mark{font-size:2.0625rem;font-weight:800;letter-spacing:.12em;color:var(--accent)}.logo-ax{letter-spacing:-.06em}.logo-i{display:inline-block;font-style:italic;transform:skew(-20deg);margin-left:2px;margin-right:-2px}.report-badge{font-size:2.0625rem;font-weight:800;letter-spacing:.02em;color:var(--accent)}.report-meta{margin:0}.report-meta-row{font-size:.875rem;line-height:1.8;color:var(--text-secondary)}.report-meta-label{font-weight:600;color:var(--text)}.report-meta-value{color:var(--text-secondary)}.report-meta-id{font-family:var(--font-mono);font-size:.8125rem}.summary-card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:24px 28px;box-shadow:var(--shadow);flex-shrink:0;display:flex;align-items:center;gap:24px}.summary-hero{text-align:center;padding:0 8px}.summary-hero .hero-score{font-size:2.5rem;font-weight:800;line-height:1;color:var(--accent)}.summary-hero .hero-label{font-size:.6875rem;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);font-weight:600;margin-top:4px;white-space:nowrap}.summary-divider{width:1px;align-self:stretch;background:var(--border)}.summary-stats{display:flex;gap:20px;align-items:flex-start}.summary-stat{text-align:center;min-width:48px}.summary-stat .stat-value{font-size:1.25rem;font-weight:700;color:var(--text);line-height:1.2;margin-bottom:2px}.summary-stat .stat-label{font-size:.625rem;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);font-weight:500;white-space:nowrap}.summary-stat.stat-passed .stat-value{color:var(--success)}.summary-stat.stat-failed .stat-value{color:var(--danger)}.summary-stat.stat-skipped .stat-value{color:var(--text-muted)}.score-badge{display:inline-flex;align-items:center;justify-content:center;min-width:36px;height:28px;padding:0 8px;border-radius:14px;font-size:.8125rem;font-weight:700;color:#fff;line-height:1}.score-badge.score-green{background:var(--success)}.score-badge.score-yellow{background:var(--yellow)}.score-badge.score-orange{background:#ea580c}.score-badge.score-red{background:var(--danger)}.score-badge.score-na{background:var(--mid-gray);font-weight:500}.score-badge-lg{min-width:64px;height:64px;border-radius:32px;font-size:1.5rem;padding:0 16px}.results-section{margin-top:32px}.results-table{width:100%;border-collapse:collapse;font-size:.875rem;table-layout:fixed}.results-table thead th{text-align:left;padding:10px 12px;font-size:.6875rem;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);font-weight:600;white-space:nowrap;position:sticky;top:0;background:var(--bg);box-shadow:inset 0 -2px 0 var(--light-gray);z-index:2}.results-table thead th:first-child{width:36px}.results-table thead th.col-score{text-align:center;width:60px}.results-table thead th.col-right{text-align:right;width:90px}.results-table td.col-agent,.results-table td.col-scenario-header{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.result-row{cursor:pointer;transition:background var(--transition)}.result-row:hover,.result-row.expanded{background:var(--accent-light)}.result-row td{padding:12px;border-bottom:1px solid var(--light-gray);vertical-align:middle}.result-row td.col-score{text-align:center}.result-row td.col-right{text-align:right;font-family:var(--font-mono);font-size:.8125rem;color:var(--text-secondary)}.result-row td.col-scenario{font-weight:500;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.result-row td.col-agent{color:var(--text-secondary);font-family:var(--font-mono);font-size:.8125rem}.result-row .expand-icon{display:inline-block;width:16px;color:var(--text-muted);transition:transform var(--transition);font-size:.625rem;opacity:.5}.result-row.expanded .expand-icon{transform:rotate(90deg)}.error-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;margin-left:6px;border:1px solid var(--light-gray);border-radius:50%;background:var(--bg-card);color:var(--danger);font-size:.75rem;font-weight:600;cursor:pointer;vertical-align:middle;line-height:1;transition:background var(--transition),border-color var(--transition)}.error-btn:hover{background:var(--danger-light);border-color:var(--danger)}.modal-error-text{border-color:var(--danger)!important;background:var(--danger-light)!important}.scenario-header-row{cursor:pointer;background:#e8ebe5;transition:background var(--transition)}.scenario-header-row:hover{background:#e0e3dc}.scenario-header-row td{padding:14px 12px;vertical-align:middle;border-bottom:1px solid var(--border)}.scenario-header-row td.col-scenario-header{font-size:.9375rem;font-weight:700;letter-spacing:-.01em;color:var(--text);padding-left:0}.scenario-header-row .expand-icon{display:inline-block;width:16px;color:var(--text-muted);transition:transform var(--transition);font-size:.75rem}.scenario-header-row.expanded .expand-icon{transform:rotate(90deg)}.agent-row td.col-expand-indent{text-align:center}.agent-row.scenario-collapsed,.detail-row.scenario-collapsed,.detail-row{display:none}.detail-row.visible{display:table-row}.detail-row td{padding:0;border-bottom:2px solid var(--light-gray)}.detail-panel{padding:24px;background:var(--bg)}.score-overview{display:flex;align-items:flex-start;gap:32px;margin-bottom:32px;padding-bottom:24px;border-bottom:1px solid var(--light-gray)}.score-overview .big-score{flex-shrink:0}.category-bars{flex:1;display:flex;flex-direction:column;gap:8px;padding-top:4px}.category-bar-row{display:flex;align-items:center;gap:12px}.category-bar-label{width:120px;font-size:.8125rem;font-weight:500;color:var(--text-secondary);flex-shrink:0}.category-bar-value{font-size:.8125rem;font-weight:600;width:32px;text-align:right;flex-shrink:0}.progress-bar{flex:1;height:8px;background:var(--light-gray);border-radius:4px;overflow:hidden;min-width:80px}.progress-bar .fill{height:100%;border-radius:4px;transition:width .4s ease}.progress-bar .fill.fill-green{background:var(--success)}.progress-bar .fill.fill-yellow{background:var(--yellow)}.progress-bar .fill.fill-orange{background:#ea580c}.progress-bar .fill.fill-red{background:var(--danger)}.detail-sections{display:flex;flex-direction:column;gap:20px}.detail-section{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:20px;box-shadow:var(--shadow)}.section-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}.section-header h3{display:flex;align-items:center;gap:8px}.section-score{font-size:.875rem;font-weight:600;color:var(--text-secondary)}.section-description{font-size:.8125rem;color:var(--text-muted);line-height:1.5;margin:-8px 0 16px;max-width:70ch}.section-description code{font-family:var(--font-mono);font-size:.75rem;background:var(--bg-alt);color:var(--text-secondary);padding:1px 5px;border-radius:3px}.criteria-list{display:flex;flex-direction:column;gap:12px}.criterion-item{padding:12px;background:var(--bg);border-radius:var(--radius);border:1px solid var(--light-gray)}.criterion-top{display:flex;align-items:center;gap:8px;margin-bottom:6px}.criterion-icon{font-size:.875rem;width:20px;text-align:center;flex-shrink:0}.criterion-icon.high{color:var(--success)}.criterion-icon.good{color:var(--yellow)}.criterion-icon.medium{color:#ea580c}.criterion-icon.low{color:var(--danger)}.criterion-name{flex:1;font-size:.8125rem;font-weight:500}.criterion-score{font-size:.8125rem;font-weight:600;color:var(--text-secondary);flex-shrink:0}.criterion-weight{font-size:.6875rem;color:var(--text-muted);background:var(--light-gray);padding:1px 6px;border-radius:3px;flex-shrink:0}.criterion-bar{margin-bottom:8px}.criterion-rationale{font-size:.8125rem;color:var(--text-secondary);line-height:1.5;font-style:italic}.criterion-perfect{padding:8px 12px;background:var(--success-light);border-left:3px solid var(--success)}.criterion-perfect .criterion-bar{display:none}.criterion-imperfect{border-left:3px solid var(--warning)}.dim-tags{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}.dim-tag{font-size:.6875rem;font-weight:600;font-family:var(--font-mono);padding:2px 8px;border-radius:10px;color:#fff}.dim-tag.fill-green{background:var(--success)}.dim-tag.fill-yellow{background:var(--yellow)}.dim-tag.fill-orange{background:#ea580c}.dim-tag.fill-red{background:var(--danger)}.cat-deduction-item{padding:8px 0;border-bottom:1px solid rgba(217,119,6,.15)}.cat-deduction-item:last-child{border-bottom:none;padding-bottom:0}.cat-deduction-id{font-family:var(--font-mono);font-size:.75rem;font-weight:600;color:var(--text);margin-right:8px}.interaction-link{cursor:pointer;color:var(--accent);text-decoration:none;border-bottom:1px dashed transparent;transition:border-color var(--transition),color var(--transition)}.interaction-link:hover{border-bottom-color:var(--accent)}a.cat-deduction-id.interaction-link,a.wf-id.interaction-link{color:var(--accent)}@keyframes interaction-flash{0%,35%{background:var(--yellow-light);box-shadow:inset 3px 0 0 var(--yellow)}to{background:transparent;box-shadow:inset 3px 0 0 transparent}}.sparse-line.interaction-flash{animation:interaction-flash 1.8s ease-out}.cat-deduction-scores{display:inline-flex;gap:4px}.dim-score-tag{font-size:.625rem;font-family:var(--font-mono);background:var(--light-gray);padding:1px 5px;border-radius:3px;color:var(--text-secondary)}.cat-deduction-rationale{display:block;font-size:.75rem;color:var(--text-secondary);line-height:1.5;font-style:italic;margin-top:4px}.cat-deduction-note{font-size:.75rem;color:var(--text-muted);font-style:italic}.deductions-baseline{background:var(--bg);border-color:var(--light-gray)}.deductions-baseline .deductions-header{color:var(--text-muted)}.dimensions-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px;margin-bottom:16px}.dimension-item{display:flex;align-items:center;gap:8px}.dimension-label{width:72px;font-size:.75rem;font-weight:500;color:var(--text-secondary);flex-shrink:0}.dimension-value{font-size:.75rem;font-weight:600;width:28px;text-align:right;flex-shrink:0}.interaction-meta{font-size:.75rem;color:var(--text-muted);margin-bottom:12px}.category-empty-state{font-size:.8125rem;color:var(--text-muted);font-style:italic;padding:12px 14px;background:var(--bg-alt);border-radius:6px}.audits-section{margin-top:12px}.audits-toggle{font-size:.75rem;color:var(--accent);background:none;border:none;cursor:pointer;font-family:var(--font);padding:4px 0;font-weight:500}.audits-toggle:hover{color:var(--accent-hover)}.audits-list{display:none;margin-top:8px}.audits-list.visible{display:block}.audit-item{padding:10px 12px;background:var(--bg);border-radius:var(--radius);margin-bottom:6px;border-left:3px solid var(--mid-gray)}.audit-header{display:flex;align-items:center;gap:8px;margin-bottom:4px;flex-wrap:wrap}.audit-id{font-family:var(--font-mono);font-size:.75rem;font-weight:600;color:var(--text)}.audit-scores{font-family:var(--font-mono);font-size:.6875rem;color:var(--text-muted)}.audit-rationale{font-size:.8125rem;color:var(--text-secondary);line-height:1.5}.necessity-section{margin-top:12px;padding-top:12px;border-top:1px solid var(--light-gray)}.necessity-header{display:flex;align-items:center;gap:8px;margin-bottom:4px}.necessity-label{font-size:.75rem;font-weight:600;color:var(--text-secondary)}.necessity-score{font-size:.75rem;font-weight:600}.necessity-rationale{font-size:.8125rem;color:var(--text-secondary);font-style:italic}.waterfall{font-size:.8125rem}.waterfall-header{display:flex;align-items:flex-end;border-bottom:1px solid var(--light-gray);padding-bottom:6px;margin-bottom:2px}.wf-label-col{width:200px;flex-shrink:0;display:flex;align-items:center;gap:6px;overflow:hidden}.waterfall-header .wf-label-col,.waterfall-header .wf-dur-col{font-size:.6875rem;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);font-weight:600}.wf-timeline-col{flex:1;min-width:0;position:relative}.wf-dur-col{width:64px;flex-shrink:0;text-align:right;font-family:var(--font-mono);font-size:.75rem;color:var(--text-secondary)}.wf-ticks{position:relative;height:18px}.wf-tick{position:absolute;transform:translate(-50%);font-family:var(--font-mono);font-size:.625rem;color:var(--text-muted);white-space:nowrap;top:0}.wf-tick:after{content:"";position:absolute;left:50%;top:100%;width:1px;height:4px;background:var(--light-gray)}.waterfall-body{position:relative}.wf-row{display:flex;align-items:center;height:26px;border-bottom:1px solid rgba(0,0,0,.03)}.wf-row:hover{background:var(--accent-light)}.wf-id{font-family:var(--font-mono);font-size:.6875rem;color:var(--text-muted);width:28px;flex-shrink:0}.wf-cat{font-size:.625rem;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted);width:36px;flex-shrink:0}.wf-tool{font-size:.75rem;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wf-track{position:relative;height:14px;background:#00000004;border-radius:2px}.wf-bar{position:absolute;top:2px;height:10px;border-radius:2px;min-width:3px;cursor:default;transition:opacity var(--transition)}.wf-row:hover .wf-bar{opacity:.8}.wf-env .wf-bar{background:var(--cat-env)}.wf-svc .wf-bar{background:var(--cat-svc)}.wf-agent .wf-bar{background:var(--cat-agent)}.wf-bar-error{background:var(--danger)!important}.wf-track{position:relative}.wf-tooltip{position:absolute;bottom:calc(100% + 8px);left:0;display:none;background:var(--text);color:var(--bg-card);padding:10px 12px;border-radius:6px;width:max-content;max-width:360px;z-index:20;pointer-events:none;box-shadow:0 6px 16px #0003;font-family:var(--font-sans, inherit);text-transform:none;letter-spacing:normal;text-align:left;font-weight:400}.wf-bar:hover .wf-tooltip{display:block}.wf-track .wf-bar.wf-tip-right .wf-tooltip{left:auto;right:0}.wf-tooltip-header{display:flex;align-items:center;gap:8px;margin-bottom:6px;font-size:.8125rem}.wf-tooltip-id{font-family:var(--font-mono);color:var(--bg-alt);font-size:.75rem}.wf-tooltip-tool{font-family:var(--font-mono);font-weight:600;color:var(--bg-card);word-break:break-all}.wf-tooltip-cat{font-size:.625rem;font-weight:600;padding:1px 6px;border-radius:3px;margin-left:auto;flex-shrink:0}.wf-tooltip-cat-env{background:var(--cat-env);color:var(--text)}.wf-tooltip-cat-svc{background:var(--cat-svc);color:var(--text)}.wf-tooltip-cat-agent{background:var(--cat-agent);color:var(--text)}.wf-tooltip-meta{display:flex;flex-wrap:wrap;gap:8px 14px;font-size:.75rem;color:var(--bg-alt);margin-bottom:4px}.wf-tooltip-meta strong{color:var(--bg-card);font-weight:600;margin-right:4px}.wf-tooltip-error{color:#fca5a5;font-weight:600}.wf-tooltip-snippet{font-family:var(--font-mono);font-size:.6875rem;margin:6px 0 0;padding:6px 8px;background:#ffffff0f;border-radius:4px;white-space:pre-wrap;max-height:120px;overflow:hidden;line-height:1.45;color:var(--bg-card)}.wf-lifecycle .wf-bar{background:repeating-linear-gradient(45deg,var(--mid-gray),var(--mid-gray) 4px,var(--light-gray) 4px,var(--light-gray) 8px);opacity:.7}.wf-lifecycle .wf-tool{font-style:italic;color:var(--text-muted)}.wf-lifecycle .wf-cat{color:var(--text-muted)}.wf-show-all{display:block;width:100%;margin-top:4px;padding:6px;font-size:.75rem;color:var(--accent);background:none;border:1px dashed var(--light-gray);border-radius:var(--radius);cursor:pointer;font-family:var(--font);font-weight:500}.wf-show-all:hover{background:var(--accent-light);border-color:var(--accent)}.wf-legend{display:flex;gap:16px;margin-top:10px;padding-top:8px;border-top:1px solid var(--light-gray)}.wf-legend-item{display:flex;align-items:center;gap:5px;font-size:.6875rem;color:var(--text-muted)}.wf-legend-dot{width:10px;height:10px;border-radius:2px}.wf-legend-dot.wf-env{background:var(--cat-env)}.wf-legend-dot.wf-svc{background:var(--cat-svc)}.wf-legend-dot.wf-agent{background:var(--cat-agent)}.sparse-index-section{margin-top:16px}.sparse-index-toggle{font-size:.75rem;color:var(--accent);background:none;border:none;cursor:pointer;font-family:var(--font);padding:4px 0;font-weight:500}.sparse-index-content{display:none;margin-top:8px}.sparse-index-content.visible{display:block}.sparse-line{font-family:var(--font-mono);font-size:.75rem;line-height:1.8;padding:3px 10px;border-left:3px solid var(--cat-agent);white-space:pre;overflow-x:auto}.sparse-line.cat-env{border-left-color:var(--cat-env);background:#0596690a}.sparse-line.cat-svc{border-left-color:var(--cat-svc);background:#2563eb0a}.sparse-line.cat-agent{border-left-color:var(--cat-agent)}.sparse-line-expandable{cursor:pointer;position:relative}.sparse-line-expandable:after{content:"▶";position:absolute;right:8px;top:4px;font-size:.6rem;color:var(--text-secondary);transition:transform .15s ease}.sparse-line-expandable.expanded:after{transform:rotate(90deg)}.sparse-line-expandable:hover{background:var(--accent-light)}.sparse-line-content{display:none;margin:4px 0 8px 12px;padding:8px 12px;background:var(--bg-alt);border-radius:4px;border:1px solid var(--border)}.sparse-line-expandable.expanded .sparse-line-content{display:block}.sparse-line-content pre{margin:0;font-family:var(--font-mono);font-size:.7rem;line-height:1.5;white-space:pre-wrap;word-break:break-word;color:var(--text)}.sparse-expand-all{font-size:.75rem;color:var(--accent);background:none;border:none;cursor:pointer;font-family:var(--font);padding:4px 0;font-weight:500;margin-left:12px}.info-btn{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;margin-left:6px;border:1px solid var(--light-gray);border-radius:50%;background:var(--bg-card);color:var(--accent);font-size:.75rem;font-weight:600;cursor:pointer;vertical-align:middle;line-height:1;transition:background var(--transition),border-color var(--transition)}.info-btn:hover{background:var(--accent-light);border-color:var(--accent)}.info-btn[data-tooltip]{position:relative}.info-btn[data-tooltip]:hover:after,.info-btn[data-tooltip]:focus-visible:after{content:attr(data-tooltip);position:absolute;top:calc(100% + 8px);left:50%;transform:translate(-50%);background:var(--text);color:var(--bg-card);font-size:.75rem;font-weight:400;font-family:var(--font-sans, inherit);text-transform:none;letter-spacing:normal;line-height:1.5;padding:8px 12px;border-radius:6px;width:max-content;max-width:320px;white-space:normal;text-align:left;z-index:10;pointer-events:none;box-shadow:0 4px 12px #00000026}.modal-backdrop{display:none;position:fixed;inset:0;z-index:100;background:#1a1a2e73;align-items:center;justify-content:center;padding:24px}.modal-backdrop.visible{display:flex}.modal{background:var(--bg-card);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg),0 8px 32px #0000001f;max-width:640px;width:100%;max-height:80vh;overflow-y:auto;animation:modal-in .15s ease}@keyframes modal-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:20px 24px 16px;border-bottom:1px solid var(--light-gray)}.modal-header h3{font-size:1.0625rem;font-weight:600;margin-bottom:2px}.modal-subtitle{font-size:.75rem;font-family:var(--font-mono);color:var(--text-muted)}.modal-close{background:none;border:none;font-size:1.5rem;line-height:1;color:var(--text-muted);cursor:pointer;padding:0 4px;flex-shrink:0;transition:color var(--transition)}.modal-close:hover{color:var(--text)}.modal-body{padding:20px 24px 24px}.modal-section{margin-bottom:20px}.modal-section:last-child{margin-bottom:0}.modal-section h4{font-size:.875rem;color:var(--text);font-weight:600;margin-bottom:10px}.modal-prompt{font-family:var(--font-mono);font-size:.8125rem;line-height:1.6;background:var(--bg);border:1px solid var(--light-gray);border-radius:var(--radius);padding:12px 16px;white-space:pre-wrap;word-break:break-word;max-height:240px;overflow-y:auto}.modal-rubric-table{width:100%;border-collapse:collapse;font-size:.8125rem}.modal-rubric-table thead th{text-align:left;padding:6px 10px;font-size:.6875rem;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);font-weight:600;border-bottom:1px solid var(--light-gray)}.modal-rubric-table tbody td{padding:8px 10px;border-bottom:1px solid var(--light-gray);color:var(--text-secondary)}.modal-rubric-weight{width:60px;text-align:right;font-family:var(--font-mono);font-weight:600;color:var(--text)!important}.modal-config-table{width:100%;border-collapse:collapse;font-size:.8125rem}.modal-config-table tbody td{padding:6px 10px;border-bottom:1px solid var(--light-gray);color:var(--text-secondary);vertical-align:top}.modal-config-table tbody tr:last-child td{border-bottom:none}.modal-config-label{width:140px;font-weight:600;color:var(--text)!important}.modal-config-table code{font-family:var(--font-mono);font-size:.75rem;background:var(--bg-alt);padding:2px 6px;border-radius:3px;color:var(--text);word-break:break-all}.modal-section-value{font-family:var(--font-mono);font-size:.875rem;font-weight:600;background:var(--bg-alt);color:var(--text);padding:2px 8px;border-radius:4px}.modal-config-line{font-size:.8125rem;color:var(--text-secondary);margin:0}.modal-config-line code{font-family:var(--font-mono);font-size:.75rem;background:var(--bg-alt);padding:2px 6px;border-radius:3px;color:var(--text);margin:0 2px}.modal-config-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}.modal-config-list li{font-size:.8125rem;color:var(--text-secondary);display:flex;flex-wrap:wrap;gap:8px;align-items:baseline}.modal-config-list code{font-family:var(--font-mono);font-size:.75rem;background:var(--bg-alt);padding:2px 6px;border-radius:3px;color:var(--text);word-break:break-all}.modal-config-label-inline{font-weight:600;color:var(--text);font-size:.8125rem}.modal-config{display:flex;flex-direction:column;gap:6px}.modal-config-item{display:flex;align-items:baseline;gap:12px;font-size:.8125rem;padding:6px 10px;background:var(--bg);border-radius:var(--radius)}.modal-config-key{font-family:var(--font-mono);font-weight:600;color:var(--text);flex-shrink:0}.modal-config-val{font-family:var(--font-mono);color:var(--text-secondary);word-break:break-all}.error-banner{background:var(--danger-light);border:1px solid var(--danger);border-radius:var(--radius);padding:12px 16px;color:var(--danger);font-size:.875rem;font-weight:500;margin-bottom:16px}.loading{text-align:center;padding:80px 24px;color:var(--text-muted);font-size:1.125rem}.empty-state{text-align:center;padding:60px 24px;color:var(--text-muted)}@media(max-width:768px){.container{padding:16px 12px 48px}.report-header{flex-direction:column;gap:16px}.report-branding{gap:8px;margin-bottom:8px}.site-logo-mark,.report-badge{font-size:1.5rem}.report-meta-row{font-size:.8125rem;line-height:1.7}.summary-card{padding:16px;flex-direction:column;gap:16px;width:100%}.summary-hero .hero-score{font-size:2rem}.summary-divider{width:100%;height:1px;align-self:auto}.summary-stats{flex-wrap:wrap;gap:16px;justify-content:center}.results-table{font-size:.8125rem}.results-table thead th{padding:8px 6px}.results-table thead th.hide-mobile,.results-table tbody td.hide-mobile{display:none}.result-row td{padding:10px 6px}.result-row td:first-child{padding-left:4px;padding-right:0;width:20px}.result-row .expand-icon{width:12px;font-size:.625rem}.result-row td.col-scenario{max-width:120px;font-size:.75rem}.result-row td.col-agent{max-width:70px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.6875rem}.scenario-header-row td{padding:10px 6px}.scenario-header-row td.col-scenario-header{font-size:.8125rem}.agent-row td.col-agent{padding-left:16px}.detail-panel{padding:16px 12px}.score-overview{flex-direction:column;align-items:center;gap:16px}.category-bars{width:100%}.category-bar-label{width:80px;font-size:.75rem}.dimensions-grid{grid-template-columns:1fr}.criterion-top{flex-wrap:wrap}.criterion-name{min-width:0;word-break:break-word}.cat-deduction-item{flex-direction:column;gap:4px;align-items:flex-start}.waterfall{overflow-x:auto;-webkit-overflow-scrolling:touch}.wf-label-col{width:100px}.wf-dur-col{width:48px;font-size:.6875rem}.wf-tool{font-size:.625rem;max-width:50px;overflow:hidden;text-overflow:ellipsis}.wf-id,.wf-cat{font-size:.5625rem}.wf-legend{flex-wrap:wrap;gap:8px}.sparse-line{font-size:.6875rem;word-break:break-all}.modal-backdrop{padding:12px}.modal{max-height:90vh;border-radius:var(--radius)}.modal-header{padding:16px}.modal-header h3{font-size:1rem}.modal-body{padding:16px}.modal-prompt{font-size:.75rem}.audit-header{flex-direction:column;gap:4px}.necessity-header{flex-wrap:wrap;gap:4px}}@media print{.detail-row{display:table-row!important}.audits-list,.sparse-index-content{display:block!important}.result-row{cursor:default}.wf-overflow{display:block!important}.wf-show-all,.expand-icon,.audits-toggle,.sparse-index-toggle,.info-btn{display:none!important}.agent-row.scenario-collapsed{display:table-row!important}.modal-backdrop{display:none!important}}
|
|
2
|
+
</style></head> <body> <div id="app"> <div class="loading">Loading report…</div> </div> <script id="axis-data" type="application/json">__AXIS_REPORT_DATA__</script> <script type="module">function B(e){return"averageAxisScore"in e}function i(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function v(e){return!Number.isFinite(e)||e<0?"—":e<1e3?`${Math.round(e)}ms`:`${(e/1e3).toFixed(1)}s`}function b(e){return e===void 0||e<=0?"—":`$${e.toFixed(4)}`}function C(e){if(!e)return"—";const t=e.input+e.output+(e.cacheReadInput??0);return t===0?"—":t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:t.toLocaleString()}function F(e){try{return new Date(e).toLocaleString("en-US",{year:"numeric",month:"short",day:"numeric",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1})}catch{return e}}function D(e){return e>=90?"score-green":e>=80?"score-yellow":e>=70?"score-orange":"score-red"}function U(e){return e>=90?"fill-green":e>=80?"fill-yellow":e>=70?"fill-orange":"fill-red"}function O(e){const t=e.indexOf("@");return t===-1?e:e.slice(0,t)}function w(e){const t=e.indexOf("@");return t===-1?null:e.slice(t+1)}function T(e){return e.replace(/ \[[^\]]+\]$/,"")}function E(e){const t=w(e.scenarioKey);return t?`${e.agentName} @${t}`:e.agentName}function q(e){const t=new Map;for(const n of e){const a=O(n.scenarioKey);let o=t.get(a);o||(o={scenarioKey:a,scenarioName:T(n.scenarioName),entries:[],prompt:n.prompt,rubric:n.rubric},t.set(a,o)),o.entries.push(n)}const s=Array.from(t.values());for(const n of s)n.entries.sort((a,o)=>{const r=a.agentName.localeCompare(o.agentName);if(r!==0)return r;const c=w(a.scenarioKey)??"",l=w(o.scenarioKey)??"";return c.localeCompare(l)});return s.sort((n,a)=>n.scenarioKey.localeCompare(a.scenarioKey)),s}function f(e,t=!1){return e===void 0?`<span class="score-badge score-na${t?" score-badge-lg":""}">—</span>`:`<span class="score-badge ${D(e)}${t?" score-badge-lg":""}">${e}</span>`}function k(e,t=100){const s=Math.max(0,Math.min(100,e/t*100));return`<div class="progress-bar"><div class="fill ${U(s)}" style="width: ${s}%"></div></div>`}function A(e,t){return`
|
|
3
3
|
<div class="dimension-item">
|
|
4
|
-
<span class="dimension-label">${
|
|
5
|
-
${
|
|
6
|
-
<span class="dimension-value">${
|
|
7
|
-
</div>`}function
|
|
4
|
+
<span class="dimension-label">${i(e)}</span>
|
|
5
|
+
${k(t)}
|
|
6
|
+
<span class="dimension-value">${t}</span>
|
|
7
|
+
</div>`}function H(e){const t=q(e.results).flatMap(n=>n.entries),s={...e,results:t};return`
|
|
8
8
|
<div class="container">
|
|
9
|
-
${
|
|
10
|
-
${
|
|
9
|
+
${_(s)}
|
|
10
|
+
${K(s)}
|
|
11
11
|
</div>
|
|
12
|
-
${
|
|
12
|
+
${ve(t)}`}function _(e){const t=B(e.summary),s=e.results.reduce((n,a)=>n+(a.totalCostUsd??0),0);return`
|
|
13
13
|
<header class="report-header">
|
|
14
14
|
<div class="header-left">
|
|
15
15
|
<div class="report-branding">
|
|
@@ -17,14 +17,14 @@
|
|
|
17
17
|
<span class="report-badge">Report</span>
|
|
18
18
|
</div>
|
|
19
19
|
<div class="report-meta">
|
|
20
|
-
${e.name?`<div class="report-meta-row"><span class="report-meta-label">Report name:</span> <span class="report-meta-value">${
|
|
21
|
-
<div class="report-meta-row"><span class="report-meta-label">Generated on:</span> <span class="report-meta-value">${
|
|
22
|
-
<div class="report-meta-row"><span class="report-meta-label">Total duration:</span> <span class="report-meta-value">${
|
|
23
|
-
<div class="report-meta-row"><span class="report-meta-label">Report ID:</span> <span class="report-meta-value report-meta-id">${
|
|
20
|
+
${e.name?`<div class="report-meta-row"><span class="report-meta-label">Report name:</span> <span class="report-meta-value">${i(e.name)}</span></div>`:""}
|
|
21
|
+
<div class="report-meta-row"><span class="report-meta-label">Generated on:</span> <span class="report-meta-value">${F(e.timestamp)}</span></div>
|
|
22
|
+
<div class="report-meta-row"><span class="report-meta-label">Total duration:</span> <span class="report-meta-value">${v(e.durationMs)}</span></div>
|
|
23
|
+
<div class="report-meta-row"><span class="report-meta-label">Report ID:</span> <span class="report-meta-value report-meta-id">${i(e.reportId)}</span></div>
|
|
24
24
|
</div>
|
|
25
25
|
</div>
|
|
26
26
|
<div class="summary-card">
|
|
27
|
-
${
|
|
27
|
+
${t?`
|
|
28
28
|
<div class="summary-hero">
|
|
29
29
|
<div class="hero-score">${e.summary.averageAxisScore}</div>
|
|
30
30
|
<div class="hero-label">AXIS Result</div>
|
|
@@ -47,21 +47,21 @@
|
|
|
47
47
|
<div class="stat-value">${e.summary.skipped}</div>
|
|
48
48
|
<div class="stat-label">Skipped</div>
|
|
49
49
|
</div>`:""}
|
|
50
|
-
${
|
|
50
|
+
${s>0?`
|
|
51
51
|
<div class="summary-stat">
|
|
52
|
-
<div class="stat-value">${
|
|
52
|
+
<div class="stat-value">${b(s)}</div>
|
|
53
53
|
<div class="stat-label">Cost</div>
|
|
54
54
|
</div>`:""}
|
|
55
55
|
</div>
|
|
56
56
|
</div>
|
|
57
|
-
</header>`}function
|
|
57
|
+
</header>`}function K(e){if(e.results.length===0)return'<div class="empty-state">No results in this report.</div>';const t=e.results.some(o=>o.score!==void 0),s=q(e.results);let n=0;const a=s.map(o=>{const r=n;return n+=o.entries.length,W(o,r,t)}).join("");return`
|
|
58
58
|
<section class="results-section">
|
|
59
59
|
<table class="results-table">
|
|
60
60
|
<thead>
|
|
61
61
|
<tr>
|
|
62
62
|
<th></th>
|
|
63
63
|
<th>Scenario / Agent</th>
|
|
64
|
-
${
|
|
64
|
+
${t?`
|
|
65
65
|
<th class="col-score">AXIS</th>
|
|
66
66
|
<th class="col-score hide-mobile">Goal</th>
|
|
67
67
|
<th class="col-score hide-mobile">Env</th>
|
|
@@ -73,12 +73,12 @@
|
|
|
73
73
|
<th class="col-right hide-mobile">Cost</th>
|
|
74
74
|
</tr>
|
|
75
75
|
</thead>
|
|
76
|
-
<tbody>${
|
|
76
|
+
<tbody>${a}</tbody>
|
|
77
77
|
</table>
|
|
78
|
-
</section>`}function
|
|
79
|
-
<tr class="scenario-header-row expanded" data-scenario="${
|
|
78
|
+
</section>`}function W(e,t,s){const n=G(e,t,s),a=e.entries.map((o,r)=>{const c=t+r;return V(o,c,s,e.scenarioKey)+X(o,c,e.scenarioKey)}).join("");return n+a}function G(e,t,s){return s?`
|
|
79
|
+
<tr class="scenario-header-row expanded" data-scenario="${i(e.scenarioKey)}">
|
|
80
80
|
<td><span class="expand-icon">▶</span></td>
|
|
81
|
-
<td class="col-scenario-header">${
|
|
81
|
+
<td class="col-scenario-header">${i(e.scenarioName)}</td>
|
|
82
82
|
<td class="col-score"></td>
|
|
83
83
|
<td class="col-score hide-mobile"></td>
|
|
84
84
|
<td class="col-score hide-mobile"></td>
|
|
@@ -88,236 +88,286 @@
|
|
|
88
88
|
<td class="col-right hide-mobile"></td>
|
|
89
89
|
<td class="col-right hide-mobile"></td>
|
|
90
90
|
</tr>`:`
|
|
91
|
-
<tr class="scenario-header-row expanded" data-scenario="${
|
|
91
|
+
<tr class="scenario-header-row expanded" data-scenario="${i(e.scenarioKey)}">
|
|
92
92
|
<td><span class="expand-icon">▶</span></td>
|
|
93
|
-
<td class="col-scenario-header">${
|
|
93
|
+
<td class="col-scenario-header">${i(e.scenarioName)}</td>
|
|
94
94
|
<td class="col-score"></td>
|
|
95
95
|
<td class="col-right hide-mobile"></td>
|
|
96
96
|
<td class="col-right hide-mobile"></td>
|
|
97
97
|
<td class="col-right hide-mobile"></td>
|
|
98
|
-
</tr>`}function
|
|
99
|
-
<tr class="result-row agent-row" data-index="${
|
|
98
|
+
</tr>`}function V(e,t,s,n){const a=e.score,o=e.exitCode!==0||!!e.error,r=e.error?`<button class="error-btn" data-error-index="${t}" title="${i(xe(e.error))}">!</button>`:"",c=e.prompt||e.agentConfig?`<button class="info-btn" data-modal-index="${t}" title="View resolved configuration" type="button">ℹ</button>`:"";if(s)return`
|
|
99
|
+
<tr class="result-row agent-row" data-index="${t}" data-scenario="${i(n)}">
|
|
100
100
|
<td class="col-expand-indent"><span class="expand-icon">▶</span></td>
|
|
101
|
-
<td class="col-agent">${
|
|
102
|
-
<td class="col-score">${
|
|
103
|
-
<td class="col-score hide-mobile">${
|
|
104
|
-
<td class="col-score hide-mobile">${
|
|
105
|
-
<td class="col-score hide-mobile">${
|
|
106
|
-
<td class="col-score hide-mobile">${
|
|
107
|
-
<td class="col-right hide-mobile">${
|
|
108
|
-
<td class="col-right hide-mobile">${
|
|
109
|
-
<td class="col-right hide-mobile">${
|
|
110
|
-
</tr>`;const l=
|
|
111
|
-
<tr class="result-row agent-row" data-index="${
|
|
101
|
+
<td class="col-agent">${i(E(e))}${c}${r}</td>
|
|
102
|
+
<td class="col-score">${f(a?.axisScore)}</td>
|
|
103
|
+
<td class="col-score hide-mobile">${f(a?.goalAchievement.score)}</td>
|
|
104
|
+
<td class="col-score hide-mobile">${f(a?.environment.score)}</td>
|
|
105
|
+
<td class="col-score hide-mobile">${f(a?.service.score)}</td>
|
|
106
|
+
<td class="col-score hide-mobile">${f(a?.agent.score)}</td>
|
|
107
|
+
<td class="col-right hide-mobile">${C(e.tokenUsage)}</td>
|
|
108
|
+
<td class="col-right hide-mobile">${v(e.durationMs)}</td>
|
|
109
|
+
<td class="col-right hide-mobile">${b(e.totalCostUsd)}</td>
|
|
110
|
+
</tr>`;const l=o?'<span class="score-badge score-red">Fail</span>':'<span class="score-badge score-green">Pass</span>';return`
|
|
111
|
+
<tr class="result-row agent-row" data-index="${t}" data-scenario="${i(n)}">
|
|
112
112
|
<td class="col-expand-indent"><span class="expand-icon">▶</span></td>
|
|
113
|
-
<td class="col-agent">${
|
|
113
|
+
<td class="col-agent">${i(E(e))}${c}${r}</td>
|
|
114
114
|
<td class="col-score">${l}</td>
|
|
115
|
-
<td class="col-right hide-mobile">${
|
|
116
|
-
<td class="col-right hide-mobile">${
|
|
117
|
-
<td class="col-right hide-mobile">${
|
|
118
|
-
</tr>`}function
|
|
119
|
-
<tr class="detail-row" id="detail-${
|
|
120
|
-
<td colspan="${
|
|
115
|
+
<td class="col-right hide-mobile">${C(e.tokenUsage)}</td>
|
|
116
|
+
<td class="col-right hide-mobile">${v(e.durationMs)}</td>
|
|
117
|
+
<td class="col-right hide-mobile">${b(e.totalCostUsd)}</td>
|
|
118
|
+
</tr>`}function X(e,t,s){const n=e.score?10:6,a=s?` data-scenario="${i(s)}"`:"";return`
|
|
119
|
+
<tr class="detail-row" id="detail-${t}"${a}>
|
|
120
|
+
<td colspan="${n}">
|
|
121
121
|
<div class="detail-panel">
|
|
122
|
-
${e.error?`<div class="error-banner">${
|
|
123
|
-
${e.score?
|
|
122
|
+
${e.error?`<div class="error-banner">${i(e.error)}</div>`:""}
|
|
123
|
+
${e.score?J(e.score,e.durationMs):z(e)}
|
|
124
124
|
</div>
|
|
125
125
|
</td>
|
|
126
|
-
</tr>`}function
|
|
126
|
+
</tr>`}function z(e){const t=[];return e.tokenUsage&&(t.push(`Input: ${e.tokenUsage.input.toLocaleString()}`),t.push(`Output: ${e.tokenUsage.output.toLocaleString()}`),e.tokenUsage.cacheReadInput&&t.push(`Cache: ${e.tokenUsage.cacheReadInput.toLocaleString()}`)),`
|
|
127
127
|
<div class="detail-sections">
|
|
128
128
|
<div class="detail-section">
|
|
129
129
|
<div class="section-header"><h3>Run Details</h3></div>
|
|
130
130
|
<p style="color: var(--text-secondary); font-size: 0.875rem;">
|
|
131
|
-
Duration: ${
|
|
132
|
-
${
|
|
133
|
-
${e.totalCostUsd?` · Cost: ${
|
|
131
|
+
Duration: ${v(e.durationMs)}
|
|
132
|
+
${t.length?` · Tokens: ${t.join(", ")}`:""}
|
|
133
|
+
${e.totalCostUsd?` · Cost: ${b(e.totalCostUsd)}`:""}
|
|
134
134
|
</p>
|
|
135
135
|
</div>
|
|
136
|
-
</div>`}function
|
|
136
|
+
</div>`}function J(e,t){return`
|
|
137
137
|
<div class="score-overview">
|
|
138
|
-
${
|
|
138
|
+
${f(e.axisScore,!0)}
|
|
139
139
|
<div class="category-bars">
|
|
140
|
-
${
|
|
141
|
-
${
|
|
142
|
-
${
|
|
143
|
-
${
|
|
140
|
+
${g("Goal Achievement",e.goalAchievement.score)}
|
|
141
|
+
${g("Environment",e.environment.score)}
|
|
142
|
+
${g("Service",e.service.score)}
|
|
143
|
+
${g("Agent",e.agent.score)}
|
|
144
144
|
</div>
|
|
145
145
|
</div>
|
|
146
146
|
<div class="detail-sections">
|
|
147
|
-
${e.sparseIndex?
|
|
148
|
-
${
|
|
149
|
-
${
|
|
150
|
-
${
|
|
151
|
-
${
|
|
152
|
-
${e.sparseIndex?
|
|
153
|
-
</div>`}function
|
|
147
|
+
${e.sparseIndex?oe(e.sparseIndex,t):""}
|
|
148
|
+
${Q(e.goalAchievement)}
|
|
149
|
+
${y("Environment",e.environment)}
|
|
150
|
+
${y("Service",e.service)}
|
|
151
|
+
${y("Agent",e.agent)}
|
|
152
|
+
${e.sparseIndex?pe(e.sparseIndex):""}
|
|
153
|
+
</div>`}function g(e,t){return`
|
|
154
154
|
<div class="category-bar-row">
|
|
155
155
|
<span class="category-bar-label">${e}</span>
|
|
156
|
-
${
|
|
157
|
-
<span class="category-bar-value">${
|
|
158
|
-
</div>`}function
|
|
156
|
+
${k(t)}
|
|
157
|
+
<span class="category-bar-value">${t}</span>
|
|
158
|
+
</div>`}function Q(e){const t=e.criteria.map(Y).join("");return`
|
|
159
159
|
<div class="detail-section">
|
|
160
160
|
<div class="section-header">
|
|
161
161
|
<h3>Goal Achievement</h3>
|
|
162
162
|
<span class="section-score">${e.score} / 100</span>
|
|
163
163
|
</div>
|
|
164
|
-
<div class="criteria-list">${
|
|
165
|
-
</div>`}function
|
|
166
|
-
<div class="${
|
|
164
|
+
<div class="criteria-list">${t}</div>
|
|
165
|
+
</div>`}function Y(e){const t=e.score===10,s=e.score*10,n=s>=90||s>=80?"✔":s>=70?"◐":"✗",a=s>=90?"high":s>=80?"good":s>=70?"medium":"low",o=Math.round(e.weight*100);return`
|
|
166
|
+
<div class="${t?"criterion-item criterion-perfect":"criterion-item criterion-imperfect"}">
|
|
167
167
|
<div class="criterion-top">
|
|
168
|
-
<span class="criterion-icon ${
|
|
169
|
-
<span class="criterion-name">${
|
|
168
|
+
<span class="criterion-icon ${a}">${n}</span>
|
|
169
|
+
<span class="criterion-name">${i(e.check)}</span>
|
|
170
170
|
<span class="criterion-score">${e.score}/10</span>
|
|
171
|
-
<span class="criterion-weight">${
|
|
171
|
+
<span class="criterion-weight">${o}%</span>
|
|
172
172
|
</div>
|
|
173
|
-
<div class="criterion-bar">${
|
|
174
|
-
${
|
|
175
|
-
</div>`}function
|
|
173
|
+
<div class="criterion-bar">${k(e.score,10)}</div>
|
|
174
|
+
${t?"":`<div class="criterion-rationale">${i(e.rationale)}</div>`}
|
|
175
|
+
</div>`}function y(e,t){const s=`<h3>${i(e)}${Z(e)}</h3>`;if(t.interactionCount===0)return`
|
|
176
|
+
<div class="detail-section">
|
|
177
|
+
<div class="section-header">
|
|
178
|
+
${s}
|
|
179
|
+
<span class="section-score">${t.score} / 100</span>
|
|
180
|
+
</div>
|
|
181
|
+
<div class="category-empty-state">${i(te(e))}</div>
|
|
182
|
+
</div>`;const n=t.dimensions,a=t.audits.filter(h=>h.rationale!=="default"),o=a.length>0,r=e==="Agent",c=e==="Agent",l=[{label:"Success",value:n.success},{label:"Speed",value:n.speed},...c?[{label:"Relevance",value:n.relevance}]:[],...r?[{label:"Necessity",value:n.necessity}]:[]],p=l.filter(h=>h.value<100),m=t.score>=100&&p.length===0,u=r&&t.necessity.rationale!=="default"?t.necessity:null,$=o?se(l,p,a,c,m,u):"";return`
|
|
176
183
|
<div class="detail-section">
|
|
177
184
|
<div class="section-header">
|
|
178
|
-
|
|
179
|
-
<span class="section-score">${
|
|
185
|
+
${s}
|
|
186
|
+
<span class="section-score">${t.score} / 100</span>
|
|
180
187
|
</div>
|
|
181
188
|
<div class="interaction-meta">
|
|
182
|
-
${
|
|
183
|
-
${
|
|
184
|
-
</div>
|
|
185
|
-
${l}
|
|
186
|
-
${r}
|
|
187
|
-
${n?_(a):""}
|
|
188
|
-
${G(s.necessity)}
|
|
189
|
-
</div>`}function O(e,s,t){const a=e.map(i=>`<span class="dim-tag ${E(i.value)}">${i.label}: ${i.value}</span>`).join(""),n=s.map(i=>`
|
|
190
|
-
<div class="cat-deduction-item">
|
|
191
|
-
<span class="cat-deduction-id">#${i.id}</span>
|
|
192
|
-
<span class="cat-deduction-scores">${H(i)}</span>
|
|
193
|
-
<span class="cat-deduction-rationale">${o(i.rationale)}</span>
|
|
194
|
-
</div>`).join("");return`
|
|
195
|
-
<div class="deductions-summary">
|
|
196
|
-
<div class="deductions-header">Score breakdown</div>
|
|
197
|
-
<div class="dim-tags">${a}</div>
|
|
198
|
-
${n}
|
|
199
|
-
</div>`}function H(e){return[{label:"Success",value:e.success},{label:"Speed",value:e.speed},{label:"Relevance",value:e.contextRelevance}].filter(t=>t.value<1).map(t=>`<span class="dim-score-tag">${t.label}: ${m(t.value)}</span>`).join("")}function _(e){const s=e.map(K).join("");return`
|
|
200
|
-
<div class="audits-section">
|
|
201
|
-
<button class="audits-toggle">Show audits (${e.length})</button>
|
|
202
|
-
<div class="audits-list">${s}</div>
|
|
203
|
-
</div>`}function K(e){return`
|
|
204
|
-
<div class="audit-item">
|
|
205
|
-
<div class="audit-header">
|
|
206
|
-
<span class="audit-id">#${e.id}</span>
|
|
207
|
-
<span class="audit-scores">
|
|
208
|
-
S:${m(e.success)} Sp:${m(e.speed)} R:${m(e.contextRelevance)}
|
|
209
|
-
</span>
|
|
189
|
+
${t.interactionCount} interaction${t.interactionCount!==1?"s":""}
|
|
190
|
+
${o?`· ${t.auditedCount} audited`:""}
|
|
210
191
|
</div>
|
|
211
|
-
|
|
212
|
-
</div>`}function
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
192
|
+
${$}
|
|
193
|
+
</div>`}function Z(e){const t=ee(e);return t?`<button class="info-btn" data-tooltip="${i(t)}" aria-label="What is the ${i(e)} score?" type="button">ℹ</button>`:""}function ee(e){switch(e){case"Environment":return"Interactions with the local execution environment — filesystem reads/writes, shell commands, processes. Each call is scored on whether it succeeded and how fast it returned.";case"Service":return"Calls to external services — HTTP requests, MCP tools, third-party APIs. Each call is scored on whether it succeeded and how fast it returned.";case"Agent":return"The agent's own decisions across the run — model thinking, tool choice, and judgment. Scored on success, speed, context relevance, and whether each action was necessary.";default:return""}}function te(e){switch(e){case"Environment":return"No environment interactions (filesystem, shell, processes) in this run.";case"Service":return"No service interactions (HTTP requests, MCP tools, external APIs) in this run.";case"Agent":return"No agent decision points captured in this run.";default:return`No ${e.toLowerCase()} interactions in this run.`}}function se(e,t,s,n,a,o){const r=d=>d.success<1||d.speed<1||n&&d.contextRelevance<1,c=s.filter(r),l=s.filter(d=>!r(d));if(a)return`
|
|
194
|
+
<div class="dimensions-grid">${e.map(d=>A(d.label,d.value)).join("")}</div>`;const p=d=>`
|
|
195
|
+
<div class="cat-deduction-item">
|
|
196
|
+
<a class="cat-deduction-id interaction-link" data-interaction-id="${d.id}" title="Jump to this interaction in the transcript">Interaction #${d.id}</a>
|
|
197
|
+
<span class="cat-deduction-scores">${ne(d,n)}</span>
|
|
198
|
+
<span class="cat-deduction-rationale">${i(d.rationale)}</span>
|
|
199
|
+
</div>`,m=o?o.unnecessaryIds.map(d=>`<a class="interaction-link" data-interaction-id="${d}" title="Jump to this interaction in the transcript">#${d}</a>`).join(", "):"",u=o?`<div class="cat-deduction-item necessity-row">
|
|
200
|
+
<span class="cat-deduction-id">Necessity</span>
|
|
201
|
+
<span class="cat-deduction-scores">${o.unnecessaryIds.length>0?`<span class="dim-score-tag">Unnecessary: ${m}</span>`:""}</span>
|
|
202
|
+
<span class="cat-deduction-rationale">${i(o.rationale)}</span>
|
|
203
|
+
</div>`:"",$=c.map(p).join(""),h=l.map(p).join(""),j=l.length?`
|
|
204
|
+
<button class="audits-toggle">Show ${l.length} other passing interaction${l.length!==1?"s":""}</button>
|
|
205
|
+
<div class="audits-list">${h}</div>`:"",P=!!u||$.length>0||l.length>0;return`
|
|
206
|
+
<div class="dimensions-grid">${e.map(d=>A(d.label,d.value)).join("")}</div>
|
|
207
|
+
${P?`<div class="deductions-summary">
|
|
208
|
+
<div class="deductions-header">Score breakdown</div>
|
|
209
|
+
${u}
|
|
210
|
+
${$}
|
|
211
|
+
${j}
|
|
212
|
+
</div>`:""}`}function ne(e,t){return[{label:"Success",value:e.success},{label:"Speed",value:e.speed},...t?[{label:"Relevance",value:e.contextRelevance}]:[]].filter(n=>n.value<1).map(n=>`<span class="dim-score-tag">${n.label}: ${ae(n.value)}</span>`).join("")}function ae(e){return(e*100).toFixed(0)}const S=30;function oe(e,t){const{interactions:s}=e;if(!s.some(u=>u.startMs!==null)||s.length===0)return"";const a=t>0?t:e.stats.wallClockMs||de(s);if(a<=0)return"";const o=ue(a),r=s.length>S,c=r?s.slice(0,S):s,l=r?s.slice(S):[],p=e.stats.startupMs&&e.stats.startupMs>0?M("agent startup",0,e.stats.startupMs,a):"",m=e.stats.shutdownMs&&e.stats.shutdownMs>0?M("agent shutdown",a-e.stats.shutdownMs,e.stats.shutdownMs,a):"";return`
|
|
221
213
|
<div class="detail-section">
|
|
222
214
|
<div class="section-header">
|
|
223
215
|
<h3>Timeline</h3>
|
|
224
|
-
<span class="section-score">${
|
|
216
|
+
<span class="section-score">${v(a)} · ${s.length} interactions</span>
|
|
225
217
|
</div>
|
|
226
218
|
<div class="waterfall">
|
|
227
219
|
<div class="waterfall-header">
|
|
228
220
|
<div class="wf-label-col"></div>
|
|
229
221
|
<div class="wf-timeline-col">
|
|
230
222
|
<div class="wf-ticks">
|
|
231
|
-
${
|
|
223
|
+
${o.map(u=>`<span class="wf-tick" style="left: ${u.pct.toFixed(2)}%">${u.label}</span>`).join("")}
|
|
232
224
|
</div>
|
|
233
225
|
</div>
|
|
234
226
|
<div class="wf-dur-col">Duration</div>
|
|
235
227
|
</div>
|
|
236
228
|
<div class="waterfall-body">
|
|
237
|
-
${
|
|
238
|
-
${
|
|
229
|
+
${p}
|
|
230
|
+
${c.map(u=>L(u,a)).join("")}
|
|
231
|
+
${r?`<div class="wf-overflow" style="display:none">${l.map(u=>L(u,a)).join("")}${m}</div>`:m}
|
|
239
232
|
</div>
|
|
240
|
-
${
|
|
233
|
+
${r?`<button class="wf-show-all">Show all ${s.length} interactions</button>`:""}
|
|
241
234
|
<div class="wf-legend">
|
|
242
235
|
<span class="wf-legend-item"><span class="wf-legend-dot wf-env"></span>Environment</span>
|
|
243
236
|
<span class="wf-legend-item"><span class="wf-legend-dot wf-svc"></span>Service</span>
|
|
244
237
|
<span class="wf-legend-item"><span class="wf-legend-dot wf-agent"></span>Agent</span>
|
|
245
238
|
</div>
|
|
246
239
|
</div>
|
|
247
|
-
</div>`}function
|
|
248
|
-
|
|
249
|
-
|
|
240
|
+
</div>`}function L(e,t){const s=e.startMs??0,n=e.durationMs??0,a=s/t*100,o=Math.max(.4,n/t*100),r=ce(e),c=e.hasError?" wf-bar-error":"",l=e.toolName??"thinking",p=e.categories.includes("environment")?"env":e.categories.includes("service")?"svc":"agent";return`
|
|
241
|
+
<div class="wf-row ${r}">
|
|
242
|
+
<div class="wf-label-col">
|
|
243
|
+
<a class="wf-id interaction-link" data-interaction-id="${e.id}" title="Jump to this interaction in the transcript">#${e.id}</a>
|
|
244
|
+
<span class="wf-cat">${p}</span>
|
|
245
|
+
<span class="wf-tool">${i(l)}</span>
|
|
246
|
+
</div>
|
|
247
|
+
<div class="wf-timeline-col">
|
|
248
|
+
<div class="wf-track">
|
|
249
|
+
<div class="wf-bar${c}${a>60?" wf-tip-right":""}" style="left:${a.toFixed(2)}%;width:${o.toFixed(2)}%">
|
|
250
|
+
${ie(e,l,p)}
|
|
251
|
+
</div>
|
|
252
|
+
</div>
|
|
253
|
+
</div>
|
|
254
|
+
<div class="wf-dur-col">${e.durationMs!==null?v(e.durationMs):"—"}</div>
|
|
255
|
+
</div>`}function ie(e,t,s){const n=[];e.durationMs!==null&&n.push(`<span><strong>Duration</strong> ${i(v(e.durationMs))}</span>`),n.push(`<span><strong>Context</strong> ${i(le(e.contextBytes))}</span>`),e.startMs!==null&&n.push(`<span><strong>Start</strong> +${i(v(e.startMs))}</span>`),e.hasError&&n.push('<span class="wf-tooltip-error">Error</span>');const a=e.content?re(e.content,280):"";return`
|
|
256
|
+
<div class="wf-tooltip">
|
|
257
|
+
<div class="wf-tooltip-header">
|
|
258
|
+
<span class="wf-tooltip-id">#${e.id}</span>
|
|
259
|
+
<span class="wf-tooltip-tool">${i(t)}</span>
|
|
260
|
+
<span class="wf-tooltip-cat wf-tooltip-cat-${i(s)}">${i(s)}</span>
|
|
261
|
+
</div>
|
|
262
|
+
<div class="wf-tooltip-meta">${n.join("")}</div>
|
|
263
|
+
${a?`<pre class="wf-tooltip-snippet">${i(a)}</pre>`:""}
|
|
264
|
+
</div>`}function re(e,t){const s=e.trim();return s.length<=t?s:s.slice(0,t-1)+"…"}function M(e,t,s,n){const a=t/n*100,o=Math.max(.4,s/n*100),r=`${e} — ${v(s)}`;return`
|
|
265
|
+
<div class="wf-row wf-lifecycle">
|
|
250
266
|
<div class="wf-label-col">
|
|
251
|
-
<span class="wf-id"
|
|
252
|
-
<span class="wf-cat"
|
|
253
|
-
<span class="wf-tool">${
|
|
267
|
+
<span class="wf-id">—</span>
|
|
268
|
+
<span class="wf-cat">sys</span>
|
|
269
|
+
<span class="wf-tool">${i(e)}</span>
|
|
254
270
|
</div>
|
|
255
271
|
<div class="wf-timeline-col">
|
|
256
272
|
<div class="wf-track">
|
|
257
|
-
<div class="wf-bar
|
|
273
|
+
<div class="wf-bar" style="left:${a.toFixed(2)}%;width:${o.toFixed(2)}%" title="${i(r)}"></div>
|
|
258
274
|
</div>
|
|
259
275
|
</div>
|
|
260
|
-
<div class="wf-dur-col">${
|
|
261
|
-
</div>`}function
|
|
276
|
+
<div class="wf-dur-col">${v(s)}</div>
|
|
277
|
+
</div>`}function ce(e){return e.categories.includes("environment")?"wf-env":e.categories.includes("service")?"wf-svc":"wf-agent"}function le(e){return e<1024?`${e}B`:`${(e/1024).toFixed(1)}KB`}function de(e){let t=0;for(const s of e)if(s.startMs!==null){const n=s.startMs+(s.durationMs??0);n>t&&(t=n)}return t}function ue(e){const t=[50,100,200,250,500,1e3,2e3,2500,5e3,1e4,15e3,3e4,6e4,12e4,3e5];let s=t[t.length-1];for(const a of t){const o=Math.floor(e/a);if(o>=3&&o<=8){s=a;break}}const n=[];for(let a=0;a<=e;a+=s)n.push({pct:a/e*100,label:v(a)});return n.length===0&&n.push({pct:0,label:"0s"}),n}function pe(e){const t=e.interactions.some(a=>a.content),s=e.lines.map((a,o)=>{const r=e.interactions[o];let c="cat-agent";r?r.categories.includes("environment")?c="cat-env":r.categories.includes("service")&&(c="cat-svc"):a.includes(" env ")?c="cat-env":(a.includes(" service ")||a.includes(" svc "))&&(c="cat-svc");const l=r?.content?" sparse-line-expandable":"",p=r?.content?`<div class="sparse-line-content"><pre>${i(r.content)}</pre></div>`:"",m=r?` data-interaction-id="${r.id}"`:"";return`<div class="sparse-line ${c}${l}"${m}>${i(a)}${p}</div>`}).join("");return`
|
|
262
278
|
<div class="detail-section">
|
|
263
279
|
<div class="section-header">
|
|
264
|
-
<h3>Transcript
|
|
280
|
+
<h3>Transcript of agent interactions<button class="info-btn" data-tooltip="${i("A condensed, ordered log of every tool call, model response, and decision the agent made during this run, classified as Environment, Service, or Agent. Each numbered line corresponds to the Interaction #N references in the score breakdowns above.")}" aria-label="What is this?" type="button">ℹ</button></h3>
|
|
265
281
|
<span class="section-score">${e.stats.totalInteractions} interactions</span>
|
|
266
282
|
</div>
|
|
267
283
|
<div class="sparse-index-section">
|
|
268
284
|
<button class="sparse-index-toggle">Show transcript</button>
|
|
269
|
-
${
|
|
270
|
-
<div class="sparse-index-content">${
|
|
285
|
+
${t?'<button class="sparse-expand-all">Expand all</button>':""}
|
|
286
|
+
<div class="sparse-index-content">${s}</div>
|
|
271
287
|
</div>
|
|
272
|
-
</div>`}function
|
|
273
|
-
<div class="modal-backdrop" data-modal-index="${
|
|
288
|
+
</div>`}function ve(e){const t=e.map((n,a)=>!n.prompt&&!n.agentConfig&&!n.resolvedConfig?"":me(n,a)).join(""),s=e.map((n,a)=>n.error?ye(n,a):"").join("");return t+s}function me(e,t){const s=w(e.scenarioKey),n=T(e.scenarioName),a=e.resolvedConfig;return`
|
|
289
|
+
<div class="modal-backdrop" data-modal-index="${t}">
|
|
274
290
|
<div class="modal">
|
|
275
291
|
<div class="modal-header">
|
|
276
292
|
<div>
|
|
277
|
-
<h3>${
|
|
278
|
-
|
|
293
|
+
<h3>${i(n)}</h3>
|
|
294
|
+
${s?`<span class="modal-subtitle">Variant: ${i(s)}</span>`:""}
|
|
279
295
|
</div>
|
|
280
296
|
<button class="modal-close">×</button>
|
|
281
297
|
</div>
|
|
282
298
|
<div class="modal-body">
|
|
283
|
-
${
|
|
284
|
-
${
|
|
299
|
+
${e.agentConfig?fe(e.agentConfig,e.agentName):""}
|
|
300
|
+
${a?he(a.limits):""}
|
|
301
|
+
${a?.skills?.length?$e(a.skills):""}
|
|
302
|
+
${a?.setup?.length?R("Setup",a.setup):""}
|
|
303
|
+
${a?.teardown?.length?R("Teardown",a.teardown):""}
|
|
304
|
+
${a?.mcpServers&&Object.keys(a.mcpServers).length?ge(a.mcpServers):""}
|
|
305
|
+
${e.prompt?be(e.prompt):""}
|
|
306
|
+
${e.rubric?we(e.rubric):""}
|
|
285
307
|
</div>
|
|
286
308
|
</div>
|
|
287
|
-
</div>`}function
|
|
309
|
+
</div>`}function fe(e,t){const s=[],n=(a,o)=>{s.push(`
|
|
310
|
+
<tr>
|
|
311
|
+
<td class="modal-config-label">${i(a)}</td>
|
|
312
|
+
<td><code>${i(o)}</code></td>
|
|
313
|
+
</tr>`)};if(typeof e.command=="string"&&n("Command",e.command),typeof e.model=="string"&&n("Model",e.model),Array.isArray(e.skills)&&e.skills.length>0&&n("Skills",e.skills.map(a=>String(a)).join(", ")),e.flags&&typeof e.flags=="object"){const a=Object.entries(e.flags);if(a.length>0){const o=a.map(([r,c])=>c===!0?`--${r}`:c===!1?`--no-${r}`:`--${r}=${c}`).join(" ");n("Flags",o)}}return`
|
|
314
|
+
<div class="modal-section">
|
|
315
|
+
<h4>Agent: <code class="modal-section-value">${i(t)}</code></h4>
|
|
316
|
+
${s.length>0?`<table class="modal-config-table"><tbody>${s.join("")}</tbody></table>`:""}
|
|
317
|
+
</div>`}function he(e){if(!e)return"";const t=[];if(e.time_minutes!==void 0){const s=e.time_minutes;t.push(`<code>${Number.isInteger(s)?s:s.toFixed(1)} min</code> wall-clock`)}return e.tokens!==void 0&&t.push(`<code>${e.tokens.toLocaleString()}</code> tokens`),t.length===0?"":`
|
|
318
|
+
<div class="modal-section">
|
|
319
|
+
<h4>Limits</h4>
|
|
320
|
+
<p class="modal-config-line">${t.join(" · ")}</p>
|
|
321
|
+
</div>`}function $e(e){return`
|
|
322
|
+
<div class="modal-section">
|
|
323
|
+
<h4>Skills</h4>
|
|
324
|
+
<ul class="modal-config-list">${e.map(s=>`<li><code>${i(s)}</code></li>`).join("")}</ul>
|
|
325
|
+
</div>`}function R(e,t){const s=t.map(n=>`
|
|
326
|
+
<li>
|
|
327
|
+
<span class="modal-config-label-inline">${i(n.action)}</span>
|
|
328
|
+
<code>${i(n.command)}</code>
|
|
329
|
+
</li>`).join("");return`
|
|
330
|
+
<div class="modal-section">
|
|
331
|
+
<h4>${i(e)}</h4>
|
|
332
|
+
<ul class="modal-config-list">${s}</ul>
|
|
333
|
+
</div>`}function ge(e){return`
|
|
334
|
+
<div class="modal-section">
|
|
335
|
+
<h4>MCP servers</h4>
|
|
336
|
+
<ul class="modal-config-list">${Object.entries(e).map(([s,n])=>{const a="url"in n&&n.url?`<code>${i(n.url)}</code>`:"command"in n&&n.command?`<code>${i([n.command,...n.args??[]].join(" "))}</code>`:"";return`<li><span class="modal-config-label-inline">${i(s)}</span> ${a}</li>`}).join("")}</ul>
|
|
337
|
+
</div>`}function be(e){return`
|
|
288
338
|
<div class="modal-section">
|
|
289
339
|
<h4>Prompt</h4>
|
|
290
|
-
<pre class="modal-prompt">${
|
|
291
|
-
</div>`}function
|
|
340
|
+
<pre class="modal-prompt">${i(e)}</pre>
|
|
341
|
+
</div>`}function we(e){return typeof e=="string"?`
|
|
292
342
|
<div class="modal-section">
|
|
293
343
|
<h4>Rubric</h4>
|
|
294
|
-
<pre class="modal-prompt">${
|
|
344
|
+
<pre class="modal-prompt">${i(e)}</pre>
|
|
295
345
|
</div>`:`
|
|
296
346
|
<div class="modal-section">
|
|
297
347
|
<h4>Rubric</h4>
|
|
298
348
|
<table class="modal-rubric-table">
|
|
299
349
|
<thead><tr><th>Check</th><th>Weight</th></tr></thead>
|
|
300
|
-
<tbody>${e.map(
|
|
350
|
+
<tbody>${e.map(s=>`
|
|
301
351
|
<tr>
|
|
302
|
-
<td>${
|
|
303
|
-
<td class="modal-rubric-weight">${Math.round(
|
|
352
|
+
<td>${i(s.check)}</td>
|
|
353
|
+
<td class="modal-rubric-weight">${Math.round(s.weight*100)}%</td>
|
|
304
354
|
</tr>`).join("")}</tbody>
|
|
305
355
|
</table>
|
|
306
|
-
</div>`}function
|
|
307
|
-
<div class="modal-backdrop" data-error-index="${
|
|
356
|
+
</div>`}function ye(e,t){return`
|
|
357
|
+
<div class="modal-backdrop" data-error-index="${t}">
|
|
308
358
|
<div class="modal">
|
|
309
359
|
<div class="modal-header">
|
|
310
360
|
<div>
|
|
311
|
-
<h3>${
|
|
312
|
-
<span class="modal-subtitle">${
|
|
361
|
+
<h3>${i(E(e))}</h3>
|
|
362
|
+
<span class="modal-subtitle">${i(e.scenarioName)}</span>
|
|
313
363
|
</div>
|
|
314
364
|
<button class="modal-close">×</button>
|
|
315
365
|
</div>
|
|
316
366
|
<div class="modal-body">
|
|
317
367
|
<div class="modal-section">
|
|
318
368
|
<h4>Error</h4>
|
|
319
|
-
<pre class="modal-prompt modal-error-text">${
|
|
369
|
+
<pre class="modal-prompt modal-error-text">${i(e.error)}</pre>
|
|
320
370
|
</div>
|
|
321
371
|
</div>
|
|
322
372
|
</div>
|
|
323
|
-
</div>`}const
|
|
373
|
+
</div>`}const Se=[[/quota|rate.?limit|429|too many requests/i,"Rate limit / quota exceeded"],[/auth|unauthorized|401|403|api.?key|token/i,"Authentication error"],[/timeout|timed?\s*out|ETIMEDOUT/i,"Timeout"],[/ECONNREFUSED|ENOTFOUND|network|socket/i,"Network error"],[/not found|command not found|ENOENT/i,"CLI not found"],[/spawn|EPERM|EACCES/i,"Permission error"]];function xe(e){for(const[t,s]of Se)if(t.test(e))return s;return e.length>80?e.slice(0,77)+"...":e}function I(){const e=document.querySelector(".results-table thead tr");if(!e)return;const t=Array.from(e.cells).filter(s=>s.offsetParent!==null||s.getClientRects().length>0).length;t!==0&&document.querySelectorAll(".detail-row > td[colspan]").forEach(s=>{s.colSpan=t})}function Ee(){I(),window.addEventListener("resize",I),document.querySelectorAll(".scenario-header-row").forEach(e=>{e.addEventListener("click",t=>{if(t.target.closest(".info-btn"))return;const s=e.dataset.scenario;if(!s)return;const n=e.classList.contains("expanded"),a=document.querySelectorAll(`.agent-row[data-scenario="${s}"]`),o=document.querySelectorAll(`.detail-row[data-scenario="${s}"]`);n?(e.classList.remove("expanded"),a.forEach(r=>r.classList.add("scenario-collapsed")),o.forEach(r=>{r.classList.remove("visible"),r.classList.add("scenario-collapsed");const c=r.id.replace("detail-","");document.querySelector(`.result-row[data-index="${c}"]`)?.classList.remove("expanded")})):(e.classList.add("expanded"),a.forEach(r=>r.classList.remove("scenario-collapsed")),o.forEach(r=>r.classList.remove("scenario-collapsed")))})}),document.querySelectorAll(".result-row").forEach(e=>{e.addEventListener("click",()=>{if(e.classList.contains("scenario-collapsed"))return;const t=e.dataset.index;if(t===void 0)return;const s=document.getElementById(`detail-${t}`);if(!s)return;const n=e.classList.contains("expanded");document.querySelectorAll(".result-row").forEach(a=>{a.classList.remove("expanded")}),document.querySelectorAll(".detail-row").forEach(a=>{a.classList.remove("visible")}),n||(e.classList.add("expanded"),s.classList.add("visible"))})}),document.querySelectorAll(".audits-toggle").forEach(e=>{e.addEventListener("click",t=>{t.stopPropagation();const s=e.nextElementSibling?.classList.contains("audits-list")?e.nextElementSibling:e.parentElement?.querySelector(".audits-list")??null;if(!s)return;const n=s.classList.contains("visible");s.classList.toggle("visible"),e.textContent=n?e.textContent.replace("Hide","Show"):e.textContent.replace("Show","Hide")})}),document.querySelectorAll(".wf-show-all").forEach(e=>{e.addEventListener("click",t=>{t.stopPropagation();const s=e.closest(".waterfall");if(!s)return;const n=s.querySelector(".wf-overflow");n&&(n.style.display="block",e.style.display="none")})}),document.querySelectorAll(".info-btn").forEach(e=>{e.addEventListener("click",t=>{t.stopPropagation();const s=e.dataset.modalIndex;if(s===void 0)return;const n=document.querySelector(`.modal-backdrop[data-modal-index="${s}"]`);n&&n.classList.add("visible")})}),document.querySelectorAll(".error-btn").forEach(e=>{e.addEventListener("click",t=>{t.stopPropagation();const s=e.dataset.errorIndex;if(s===void 0)return;const n=document.querySelector(`.modal-backdrop[data-error-index="${s}"]`);n&&n.classList.add("visible")})}),document.querySelectorAll(".modal-backdrop").forEach(e=>{e.addEventListener("click",s=>{s.target===e&&e.classList.remove("visible")});const t=e.querySelector(".modal-close");t&&t.addEventListener("click",()=>e.classList.remove("visible"))}),document.addEventListener("keydown",e=>{e.key==="Escape"&&document.querySelectorAll(".modal-backdrop.visible").forEach(t=>t.classList.remove("visible"))}),document.querySelectorAll(".interaction-link[data-interaction-id]").forEach(e=>{e.addEventListener("click",t=>{t.stopPropagation(),t.preventDefault();const s=e.dataset.interactionId;if(!s)return;const n=e.closest(".detail-panel");if(!n)return;const a=n.querySelector(`.sparse-line[data-interaction-id="${CSS.escape(s)}"]`);if(!a)return;const o=n.querySelector(".sparse-index-content"),r=n.querySelector(".sparse-index-toggle");o&&!o.classList.contains("visible")&&(o.classList.add("visible"),r&&(r.textContent="Hide transcript")),a.scrollIntoView({behavior:"smooth",block:"center"}),a.classList.remove("interaction-flash"),a.offsetWidth,a.classList.add("interaction-flash")})}),document.querySelectorAll(".sparse-index-toggle").forEach(e=>{e.addEventListener("click",t=>{t.stopPropagation();const s=e.closest(".sparse-index-section");if(!s)return;const n=s.querySelector(".sparse-index-content");if(!n)return;const a=n.classList.contains("visible");n.classList.toggle("visible"),e.textContent=a?"Show transcript":"Hide transcript"})}),document.querySelectorAll(".sparse-line-expandable").forEach(e=>{e.addEventListener("click",t=>{t.stopPropagation(),e.classList.toggle("expanded")})}),document.querySelectorAll(".sparse-expand-all").forEach(e=>{e.addEventListener("click",t=>{t.stopPropagation();const s=e.closest(".sparse-index-section");if(!s)return;const n=s.querySelectorAll(".sparse-line-expandable"),a=Array.from(n).every(o=>o.classList.contains("expanded"));n.forEach(o=>{a?o.classList.remove("expanded"):o.classList.add("expanded")}),e.textContent=a?"Expand all":"Collapse all"})})}function N(e){const t=document.getElementById("app");t&&(t.innerHTML=H(e),document.title=`AXIS Report — ${i(e.reportId)}`,Ee())}const ke=document.getElementById("axis-data"),x=ke?.textContent?.trim();if(x&&x!=="__AXIS_REPORT_DATA__")try{N(JSON.parse(x))}catch{const t=document.getElementById("app");t&&(t.innerHTML='<div class="error-banner">Failed to parse report data.</div>')}else fetch("/mock-data.json").then(e=>e.json()).then(e=>N(e)).catch(e=>{const t=document.getElementById("app");t&&(t.innerHTML=`<div class="error-banner">Failed to load mock data: ${e.message}</div>`)});</script> </body> </html>
|