@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.
Files changed (58) hide show
  1. package/README.md +8 -8
  2. package/dist/adapters/base/agent-adapter.d.ts.map +1 -1
  3. package/dist/adapters/base/agent-adapter.js +43 -2
  4. package/dist/adapters/base/agent-adapter.js.map +1 -1
  5. package/dist/adapters/registry.d.ts +2 -0
  6. package/dist/adapters/registry.d.ts.map +1 -1
  7. package/dist/adapters/registry.js +6 -2
  8. package/dist/adapters/registry.js.map +1 -1
  9. package/dist/cli.js +109 -9
  10. package/dist/cli.js.map +1 -1
  11. package/dist/config/loader.d.ts +2 -2
  12. package/dist/config/loader.d.ts.map +1 -1
  13. package/dist/config/loader.js +229 -28
  14. package/dist/config/loader.js.map +1 -1
  15. package/dist/config/validator.d.ts +9 -1
  16. package/dist/config/validator.d.ts.map +1 -1
  17. package/dist/config/validator.js +75 -4
  18. package/dist/config/validator.js.map +1 -1
  19. package/dist/report-ui/index.html +201 -151
  20. package/dist/reports/html.d.ts.map +1 -1
  21. package/dist/reports/html.js +2 -1
  22. package/dist/reports/html.js.map +1 -1
  23. package/dist/reports/writer.d.ts.map +1 -1
  24. package/dist/reports/writer.js +3 -0
  25. package/dist/reports/writer.js.map +1 -1
  26. package/dist/runner/runner.d.ts.map +1 -1
  27. package/dist/runner/runner.js +152 -13
  28. package/dist/runner/runner.js.map +1 -1
  29. package/dist/scoring/index.d.ts.map +1 -1
  30. package/dist/scoring/index.js +4 -1
  31. package/dist/scoring/index.js.map +1 -1
  32. package/dist/scoring/sparse-index.d.ts +6 -1
  33. package/dist/scoring/sparse-index.d.ts.map +1 -1
  34. package/dist/scoring/sparse-index.js +43 -15
  35. package/dist/scoring/sparse-index.js.map +1 -1
  36. package/dist/transcript/extract.d.ts.map +1 -1
  37. package/dist/transcript/extract.js +33 -3
  38. package/dist/transcript/extract.js.map +1 -1
  39. package/dist/types/agent.d.ts +4 -0
  40. package/dist/types/agent.d.ts.map +1 -1
  41. package/dist/types/config.d.ts +27 -1
  42. package/dist/types/config.d.ts.map +1 -1
  43. package/dist/types/output.d.ts +12 -2
  44. package/dist/types/output.d.ts.map +1 -1
  45. package/dist/types/output.js.map +1 -1
  46. package/dist/types/report.d.ts +3 -1
  47. package/dist/types/report.d.ts.map +1 -1
  48. package/dist/types/scenario.d.ts +16 -2
  49. package/dist/types/scenario.d.ts.map +1 -1
  50. package/dist/types/scoring.d.ts +4 -0
  51. package/dist/types/scoring.d.ts.map +1 -1
  52. package/dist/ui/LiveStatus.js +10 -5
  53. package/dist/ui/LiveStatus.js.map +1 -1
  54. package/dist/ui/format.d.ts +4 -0
  55. package/dist/ui/format.d.ts.map +1 -1
  56. package/dist/ui/format.js +34 -18
  57. package/dist/ui/format.js.map +1 -1
  58. 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&hellip;</div> </div> <script id="axis-data" type="application/json">__AXIS_REPORT_DATA__</script> <script type="module">function L(e){return"averageAxisScore"in e}function o(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function u(e){return!Number.isFinite(e)||e<0?"—":e<1e3?`${Math.round(e)}ms`:`${(e/1e3).toFixed(1)}s`}function f(e){return e===void 0||e<=0?"—":`$${e.toFixed(4)}`}function w(e){if(!e)return"—";const s=e.input+e.output+(e.cacheReadInput??0);return s===0?"—":s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}k`:s.toLocaleString()}function A(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 S(e){return e>=90?"score-green":e>=80?"score-yellow":e>=70?"score-orange":"score-red"}function E(e){return e>=90?"fill-green":e>=80?"fill-yellow":e>=70?"fill-orange":"fill-red"}function C(e){const s=new Map;for(const t of e){let a=s.get(t.scenarioKey);a||(a={scenarioKey:t.scenarioKey,scenarioName:t.scenarioName,entries:[],prompt:t.prompt,rubric:t.rubric},s.set(t.scenarioKey,a)),a.entries.push(t)}return Array.from(s.values())}function v(e,s=!1){return e===void 0?`<span class="score-badge score-na${s?" score-badge-lg":""}">—</span>`:`<span class="score-badge ${S(e)}${s?" score-badge-lg":""}">${e}</span>`}function b(e,s=100){const t=Math.max(0,Math.min(100,e/s*100));return`<div class="progress-bar"><div class="fill ${E(t)}" style="width: ${t}%"></div></div>`}function R(e,s){return`
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&hellip;</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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}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">${o(e)}</span>
5
- ${b(s)}
6
- <span class="dimension-value">${s}</span>
7
- </div>`}function M(e){return`
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
- ${I(e)}
10
- ${q(e)}
9
+ ${_(s)}
10
+ ${K(s)}
11
11
  </div>
12
- ${Y(e.results)}`}function I(e){const s=L(e.summary),t=e.results.reduce((a,n)=>a+(n.totalCostUsd??0),0);return`
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">${o(e.name)}</span></div>`:""}
21
- <div class="report-meta-row"><span class="report-meta-label">Generated on:</span> <span class="report-meta-value">${A(e.timestamp)}</span></div>
22
- <div class="report-meta-row"><span class="report-meta-label">Total duration:</span> <span class="report-meta-value">${u(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">${o(e.reportId)}</span></div>
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
- ${s?`
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
- ${t>0?`
50
+ ${s>0?`
51
51
  <div class="summary-stat">
52
- <div class="stat-value">${f(t)}</div>
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 q(e){if(e.results.length===0)return'<div class="empty-state">No results in this report.</div>';const s=e.results.some(i=>i.score!==void 0),t=C(e.results);let a=0;const n=t.map(i=>{const c=a;return a+=i.entries.length,T(i,c,s)}).join("");return`
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
- ${s?`
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>${n}</tbody>
76
+ <tbody>${a}</tbody>
77
77
  </table>
78
- </section>`}function T(e,s,t){const a=N(e,s,t),n=e.entries.map((i,c)=>{const l=s+c;return D(i,l,t,e.scenarioKey)+P(i,l,e.scenarioKey)}).join("");return a+n}function N(e,s,t){const a=e.prompt?`<button class="info-btn" data-modal-index="${s}" title="View scenario settings">ℹ</button>`:"";return t?`
79
- <tr class="scenario-header-row expanded" data-scenario="${o(e.scenarioKey)}">
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">${o(e.scenarioName)}${a}</td>
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="${o(e.scenarioKey)}">
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">${o(e.scenarioName)}${a}</td>
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 D(e,s,t,a){const n=e.score,i=e.exitCode!==0||!!e.error,c=e.error?`<button class="error-btn" data-error-index="${s}" title="${o(ne(e.error))}">!</button>`:"";if(t)return`
99
- <tr class="result-row agent-row" data-index="${s}" data-scenario="${o(a)}">
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">${o(e.agentName)}${c}</td>
102
- <td class="col-score">${v(n?.axisScore)}</td>
103
- <td class="col-score hide-mobile">${v(n?.goalAchievement.score)}</td>
104
- <td class="col-score hide-mobile">${v(n?.environment.score)}</td>
105
- <td class="col-score hide-mobile">${v(n?.service.score)}</td>
106
- <td class="col-score hide-mobile">${v(n?.agent.score)}</td>
107
- <td class="col-right hide-mobile">${w(e.tokenUsage)}</td>
108
- <td class="col-right hide-mobile">${u(e.durationMs)}</td>
109
- <td class="col-right hide-mobile">${f(e.totalCostUsd)}</td>
110
- </tr>`;const l=i?'<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="${s}" data-scenario="${o(a)}">
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">${o(e.agentName)}${c}</td>
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">${w(e.tokenUsage)}</td>
116
- <td class="col-right hide-mobile">${u(e.durationMs)}</td>
117
- <td class="col-right hide-mobile">${f(e.totalCostUsd)}</td>
118
- </tr>`}function P(e,s,t){const a=e.score?10:7,n=t?` data-scenario="${o(t)}"`:"";return`
119
- <tr class="detail-row" id="detail-${s}"${n}>
120
- <td colspan="${a}">
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">${o(e.error)}</div>`:""}
123
- ${e.score?B(e.score):j(e)}
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 j(e){const s=[];return e.tokenUsage&&(s.push(`Input: ${e.tokenUsage.input.toLocaleString()}`),s.push(`Output: ${e.tokenUsage.output.toLocaleString()}`),e.tokenUsage.cacheReadInput&&s.push(`Cache: ${e.tokenUsage.cacheReadInput.toLocaleString()}`)),`
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: ${u(e.durationMs)}
132
- ${s.length?` &middot; Tokens: ${s.join(", ")}`:""}
133
- ${e.totalCostUsd?` &middot; Cost: ${f(e.totalCostUsd)}`:""}
131
+ Duration: ${v(e.durationMs)}
132
+ ${t.length?` &middot; Tokens: ${t.join(", ")}`:""}
133
+ ${e.totalCostUsd?` &middot; Cost: ${b(e.totalCostUsd)}`:""}
134
134
  </p>
135
135
  </div>
136
- </div>`}function B(e){return`
136
+ </div>`}function J(e,t){return`
137
137
  <div class="score-overview">
138
- ${v(e.axisScore,!0)}
138
+ ${f(e.axisScore,!0)}
139
139
  <div class="category-bars">
140
- ${p("Goal Achievement",e.goalAchievement.score)}
141
- ${p("Environment",e.environment.score)}
142
- ${p("Service",e.service.score)}
143
- ${p("Agent",e.agent.score)}
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?W(e.sparseIndex):""}
148
- ${F(e.goalAchievement)}
149
- ${h("Environment",e.environment)}
150
- ${h("Service",e.service)}
151
- ${h("Agent",e.agent)}
152
- ${e.sparseIndex?Q(e.sparseIndex):""}
153
- </div>`}function p(e,s){return`
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
- ${b(s)}
157
- <span class="category-bar-value">${s}</span>
158
- </div>`}function F(e){const s=e.criteria.map(U).join("");return`
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">${s}</div>
165
- </div>`}function U(e){const s=e.score===10,t=e.score*10,a=t>=90||t>=80?"✔":t>=70?"◐":"✗",n=t>=90?"high":t>=80?"good":t>=70?"medium":"low",i=Math.round(e.weight*100);return`
166
- <div class="${s?"criterion-item criterion-perfect":"criterion-item criterion-imperfect"}">
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 ${n}">${a}</span>
169
- <span class="criterion-name">${o(e.check)}</span>
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">${i}%</span>
171
+ <span class="criterion-weight">${o}%</span>
172
172
  </div>
173
- <div class="criterion-bar">${b(e.score,10)}</div>
174
- ${s?"":`<div class="criterion-rationale">${o(e.rationale)}</div>`}
175
- </div>`}function h(e,s){const t=s.dimensions,a=s.audits.filter(d=>d.rationale!=="default"),n=a.length>0,i=[{label:"Success",value:t.success},{label:"Speed",value:t.speed},{label:"Relevance",value:t.relevance},{label:"Necessity",value:t.necessity}],c=i.filter(d=>d.value<100),l=n?`<div class="dimensions-grid">${i.map(d=>R(d.label,d.value)).join("")}</div>`:"",r=c.length>0?O(c,a):"";return`
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
- <h3>${o(e)}</h3>
179
- <span class="section-score">${s.score} / 100</span>
185
+ ${s}
186
+ <span class="section-score">${t.score} / 100</span>
180
187
  </div>
181
188
  <div class="interaction-meta">
182
- ${s.interactionCount} interaction${s.interactionCount!==1?"s":""}
183
- ${n?`&middot; ${s.auditedCount} audited`:""}
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?`&middot; ${t.auditedCount} audited`:""}
210
191
  </div>
211
- <div class="audit-rationale">${o(e.rationale)}</div>
212
- </div>`}function m(e){return(e*100).toFixed(0)}function G(e){if(e.rationale==="default")return"";const s=Math.round(e.score*100),t=e.unnecessaryIds.length>0?` &middot; Unnecessary: #${e.unnecessaryIds.join(", #")}`:"";return`
213
- <div class="necessity-section">
214
- <div class="necessity-header">
215
- <span class="necessity-label">Necessity</span>
216
- <span class="necessity-score ${S(s)}">${s}/100</span>
217
- ${t}
218
- </div>
219
- <div class="necessity-rationale">${o(e.rationale)}</div>
220
- </div>`}const $=30;function W(e){const{interactions:s}=e;if(!s.some(r=>r.startMs!==null)||s.length===0)return"";const a=e.stats.wallClockMs||V(s);if(a<=0)return"";const n=J(a),i=s.length>$,c=i?s.slice(0,$):s,l=i?s.slice($):[];return`
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">${u(a)} &middot; ${s.length} interactions</span>
216
+ <span class="section-score">${v(a)} &middot; ${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
- ${n.map(r=>`<span class="wf-tick" style="left: ${r.pct.toFixed(2)}%">${r.label}</span>`).join("")}
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
- ${c.map(r=>y(r,a)).join("")}
238
- ${i?`<div class="wf-overflow" style="display:none">${l.map(r=>y(r,a)).join("")}</div>`:""}
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
- ${i?`<button class="wf-show-all">Show all ${s.length} interactions</button>`:""}
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 y(e,s){const t=e.startMs??0,a=e.durationMs??0,n=t/s*100,i=Math.max(.4,a/s*100),c=X(e),l=e.hasError?" wf-bar-error":"",r=e.toolName??"thinking",d=e.categories.includes("environment")?"env":e.categories.includes("service")?"svc":"agent",k=[`#${e.id} ${r} (${d})`,e.durationMs!==null?`Duration: ${u(e.durationMs)}`:null,`Context: ${z(e.contextBytes)}`,e.hasError?"ERROR":null].filter(Boolean).join(`
248
- `);return`
249
- <div class="wf-row ${c}">
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">#${e.id}</span>
252
- <span class="wf-cat">${d}</span>
253
- <span class="wf-tool">${o(r)}</span>
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${l}" style="left:${n.toFixed(2)}%;width:${i.toFixed(2)}%" title="${o(k)}"></div>
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">${e.durationMs!==null?u(e.durationMs):"—"}</div>
261
- </div>`}function X(e){return e.categories.includes("environment")?"wf-env":e.categories.includes("service")?"wf-svc":"wf-agent"}function z(e){return e<1024?`${e}B`:`${(e/1024).toFixed(1)}KB`}function V(e){let s=0;for(const t of e)if(t.startMs!==null){const a=t.startMs+(t.durationMs??0);a>s&&(s=a)}return s}function J(e){const s=[50,100,200,250,500,1e3,2e3,2500,5e3,1e4,15e3,3e4,6e4,12e4,3e5];let t=s[s.length-1];for(const n of s){const i=Math.floor(e/n);if(i>=3&&i<=8){t=n;break}}const a=[];for(let n=0;n<=e;n+=t)a.push({pct:n/e*100,label:u(n)});return a.length===0&&a.push({pct:0,label:"0s"}),a}function Q(e){const s=e.interactions.some(a=>a.content),t=e.lines.map((a,n)=>{const i=e.interactions[n];let c="cat-agent";i?i.categories.includes("environment")?c="cat-env":i.categories.includes("service")&&(c="cat-svc"):a.includes(" env ")?c="cat-env":(a.includes(" service ")||a.includes(" svc "))&&(c="cat-svc");const l=i?.content?" sparse-line-expandable":"",r=i?.content?`<div class="sparse-line-content"><pre>${o(i.content)}</pre></div>`:"";return`<div class="sparse-line ${c}${l}">${o(a)}${r}</div>`}).join("");return`
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</h3>
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
- ${s?'<button class="sparse-expand-all">Expand all</button>':""}
270
- <div class="sparse-index-content">${t}</div>
285
+ ${t?'<button class="sparse-expand-all">Expand all</button>':""}
286
+ <div class="sparse-index-content">${s}</div>
271
287
  </div>
272
- </div>`}function Y(e){const s=e.map((a,n)=>a.prompt?Z(a,n):"").join(""),t=e.map((a,n)=>a.error?te(a,n):"").join("");return s+t}function Z(e,s){return`
273
- <div class="modal-backdrop" data-modal-index="${s}">
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>${o(e.scenarioName)}</h3>
278
- <span class="modal-subtitle">${o(e.scenarioKey)}</span>
293
+ <h3>${i(n)}</h3>
294
+ ${s?`<span class="modal-subtitle">Variant: ${i(s)}</span>`:""}
279
295
  </div>
280
296
  <button class="modal-close">&times;</button>
281
297
  </div>
282
298
  <div class="modal-body">
283
- ${ee(e.prompt)}
284
- ${e.rubric?se(e.rubric):""}
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 ee(e){return`
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">${o(e)}</pre>
291
- </div>`}function se(e){return typeof e=="string"?`
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">${o(e)}</pre>
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(t=>`
350
+ <tbody>${e.map(s=>`
301
351
  <tr>
302
- <td>${o(t.check)}</td>
303
- <td class="modal-rubric-weight">${Math.round(t.weight*100)}%</td>
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 te(e,s){return`
307
- <div class="modal-backdrop" data-error-index="${s}">
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>${o(e.agentName)}</h3>
312
- <span class="modal-subtitle">${o(e.scenarioName)}</span>
361
+ <h3>${i(E(e))}</h3>
362
+ <span class="modal-subtitle">${i(e.scenarioName)}</span>
313
363
  </div>
314
364
  <button class="modal-close">&times;</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">${o(e.error)}</pre>
369
+ <pre class="modal-prompt modal-error-text">${i(e.error)}</pre>
320
370
  </div>
321
371
  </div>
322
372
  </div>
323
- </div>`}const ae=[[/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 ne(e){for(const[s,t]of ae)if(s.test(e))return t;return e.length>80?e.slice(0,77)+"...":e}function ie(){document.querySelectorAll(".scenario-header-row").forEach(e=>{e.addEventListener("click",s=>{if(s.target.closest(".info-btn"))return;const t=e.dataset.scenario;if(!t)return;const a=e.classList.contains("expanded"),n=document.querySelectorAll(`.agent-row[data-scenario="${t}"]`),i=document.querySelectorAll(`.detail-row[data-scenario="${t}"]`);a?(e.classList.remove("expanded"),n.forEach(c=>c.classList.add("scenario-collapsed")),i.forEach(c=>{c.classList.remove("visible"),c.classList.add("scenario-collapsed");const l=c.id.replace("detail-","");document.querySelector(`.result-row[data-index="${l}"]`)?.classList.remove("expanded")})):(e.classList.add("expanded"),n.forEach(c=>c.classList.remove("scenario-collapsed")),i.forEach(c=>c.classList.remove("scenario-collapsed")))})}),document.querySelectorAll(".result-row").forEach(e=>{e.addEventListener("click",()=>{if(e.classList.contains("scenario-collapsed"))return;const s=e.dataset.index;if(s===void 0)return;const t=document.getElementById(`detail-${s}`);if(!t)return;const a=e.classList.contains("expanded");document.querySelectorAll(".result-row").forEach(n=>{n.classList.remove("expanded")}),document.querySelectorAll(".detail-row").forEach(n=>{n.classList.remove("visible")}),a||(e.classList.add("expanded"),t.classList.add("visible"))})}),document.querySelectorAll(".audits-toggle").forEach(e=>{e.addEventListener("click",s=>{s.stopPropagation();const t=e.closest(".audits-section");if(!t)return;const a=t.querySelector(".audits-list");if(!a)return;const n=a.classList.contains("visible");a.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",s=>{s.stopPropagation();const t=e.closest(".waterfall");if(!t)return;const a=t.querySelector(".wf-overflow");a&&(a.style.display="block",e.style.display="none")})}),document.querySelectorAll(".info-btn").forEach(e=>{e.addEventListener("click",s=>{s.stopPropagation();const t=e.dataset.modalIndex;if(t===void 0)return;const a=document.querySelector(`.modal-backdrop[data-modal-index="${t}"]`);a&&a.classList.add("visible")})}),document.querySelectorAll(".error-btn").forEach(e=>{e.addEventListener("click",s=>{s.stopPropagation();const t=e.dataset.errorIndex;if(t===void 0)return;const a=document.querySelector(`.modal-backdrop[data-error-index="${t}"]`);a&&a.classList.add("visible")})}),document.querySelectorAll(".modal-backdrop").forEach(e=>{e.addEventListener("click",t=>{t.target===e&&e.classList.remove("visible")});const s=e.querySelector(".modal-close");s&&s.addEventListener("click",()=>e.classList.remove("visible"))}),document.addEventListener("keydown",e=>{e.key==="Escape"&&document.querySelectorAll(".modal-backdrop.visible").forEach(s=>s.classList.remove("visible"))}),document.querySelectorAll(".sparse-index-toggle").forEach(e=>{e.addEventListener("click",s=>{s.stopPropagation();const t=e.closest(".sparse-index-section");if(!t)return;const a=t.querySelector(".sparse-index-content");if(!a)return;const n=a.classList.contains("visible");a.classList.toggle("visible"),e.textContent=n?"Show transcript":"Hide transcript"})}),document.querySelectorAll(".sparse-line-expandable").forEach(e=>{e.addEventListener("click",s=>{s.stopPropagation(),e.classList.toggle("expanded")})}),document.querySelectorAll(".sparse-expand-all").forEach(e=>{e.addEventListener("click",s=>{s.stopPropagation();const t=e.closest(".sparse-index-section");if(!t)return;const a=t.querySelectorAll(".sparse-line-expandable"),n=Array.from(a).every(i=>i.classList.contains("expanded"));a.forEach(i=>{n?i.classList.remove("expanded"):i.classList.add("expanded")}),e.textContent=n?"Expand all":"Collapse all"})})}function x(e){const s=document.getElementById("app");s&&(s.innerHTML=M(e),document.title=`AXIS Report — ${o(e.reportId)}`,ie())}const oe=document.getElementById("axis-data"),g=oe?.textContent?.trim();if(g&&g!=="__AXIS_REPORT_DATA__")try{x(JSON.parse(g))}catch{const s=document.getElementById("app");s&&(s.innerHTML='<div class="error-banner">Failed to parse report data.</div>')}else fetch("/mock-data.json").then(e=>e.json()).then(e=>x(e)).catch(e=>{const s=document.getElementById("app");s&&(s.innerHTML=`<div class="error-banner">Failed to load mock data: ${e.message}</div>`)});</script> </body> </html>
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>