@netlify/axis 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +977 -0
- package/dist/adapters/base/acp-adapter.d.ts +44 -0
- package/dist/adapters/base/acp-adapter.d.ts.map +1 -0
- package/dist/adapters/base/acp-adapter.js +559 -0
- package/dist/adapters/base/acp-adapter.js.map +1 -0
- package/dist/adapters/base/agent-adapter.d.ts +132 -0
- package/dist/adapters/base/agent-adapter.d.ts.map +1 -0
- package/dist/adapters/base/agent-adapter.js +212 -0
- package/dist/adapters/base/agent-adapter.js.map +1 -0
- package/dist/adapters/claude-code.d.ts +3 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +138 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/claude-sdk.d.ts +11 -0
- package/dist/adapters/claude-sdk.d.ts.map +1 -0
- package/dist/adapters/claude-sdk.js +46 -0
- package/dist/adapters/claude-sdk.js.map +1 -0
- package/dist/adapters/codex.d.ts +3 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +183 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/gemini-acp.d.ts +11 -0
- package/dist/adapters/gemini-acp.d.ts.map +1 -0
- package/dist/adapters/gemini-acp.js +60 -0
- package/dist/adapters/gemini-acp.js.map +1 -0
- package/dist/adapters/gemini.d.ts +3 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +222 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/goose.d.ts +3 -0
- package/dist/adapters/goose.d.ts.map +1 -0
- package/dist/adapters/goose.js +9 -0
- package/dist/adapters/goose.js.map +1 -0
- package/dist/adapters/registry.d.ts +7 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +37 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/utils/mcp.d.ts +23 -0
- package/dist/adapters/utils/mcp.d.ts.map +1 -0
- package/dist/adapters/utils/mcp.js +114 -0
- package/dist/adapters/utils/mcp.js.map +1 -0
- package/dist/adapters/utils/resolve.d.ts +20 -0
- package/dist/adapters/utils/resolve.d.ts.map +1 -0
- package/dist/adapters/utils/resolve.js +48 -0
- package/dist/adapters/utils/resolve.js.map +1 -0
- package/dist/adapters/utils/skills.d.ts +17 -0
- package/dist/adapters/utils/skills.d.ts.map +1 -0
- package/dist/adapters/utils/skills.js +52 -0
- package/dist/adapters/utils/skills.js.map +1 -0
- package/dist/adapters/utils/token-estimator.d.ts +21 -0
- package/dist/adapters/utils/token-estimator.d.ts.map +1 -0
- package/dist/adapters/utils/token-estimator.js +37 -0
- package/dist/adapters/utils/token-estimator.js.map +1 -0
- package/dist/baselines/diff.d.ts +9 -0
- package/dist/baselines/diff.d.ts.map +1 -0
- package/dist/baselines/diff.js +83 -0
- package/dist/baselines/diff.js.map +1 -0
- package/dist/baselines/index.d.ts +3 -0
- package/dist/baselines/index.d.ts.map +1 -0
- package/dist/baselines/index.js +3 -0
- package/dist/baselines/index.js.map +1 -0
- package/dist/baselines/store.d.ts +19 -0
- package/dist/baselines/store.d.ts.map +1 -0
- package/dist/baselines/store.js +104 -0
- package/dist/baselines/store.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +487 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/loader.d.ts +8 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +99 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/validator.d.ts +11 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +203 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/docs-site/_astro/cli.DDWZtG0-.css +1 -0
- package/dist/docs-site/cli/index.html +18 -0
- package/dist/docs-site/configuration/index.html +121 -0
- package/dist/docs-site/content-assets.mjs +1 -0
- package/dist/docs-site/content-modules.mjs +1 -0
- package/dist/docs-site/data-store.json +9 -0
- package/dist/docs-site/index.html +69 -0
- package/dist/docs-site/quickstart/index.html +59 -0
- package/dist/docs-site/running/index.html +87 -0
- package/dist/docs-site/scoring/index.html +135 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/report-ui/index.html +291 -0
- package/dist/report-ui/mock-data.json +298 -0
- package/dist/reports/html.d.ts +7 -0
- package/dist/reports/html.d.ts.map +1 -0
- package/dist/reports/html.js +27 -0
- package/dist/reports/html.js.map +1 -0
- package/dist/reports/reader.d.ts +21 -0
- package/dist/reports/reader.d.ts.map +1 -0
- package/dist/reports/reader.js +110 -0
- package/dist/reports/reader.js.map +1 -0
- package/dist/reports/writer.d.ts +14 -0
- package/dist/reports/writer.d.ts.map +1 -0
- package/dist/reports/writer.js +106 -0
- package/dist/reports/writer.js.map +1 -0
- package/dist/runner/lifecycle.d.ts +10 -0
- package/dist/runner/lifecycle.d.ts.map +1 -0
- package/dist/runner/lifecycle.js +58 -0
- package/dist/runner/lifecycle.js.map +1 -0
- package/dist/runner/runner.d.ts +34 -0
- package/dist/runner/runner.d.ts.map +1 -0
- package/dist/runner/runner.js +330 -0
- package/dist/runner/runner.js.map +1 -0
- package/dist/scoring/category-score.d.ts +52 -0
- package/dist/scoring/category-score.d.ts.map +1 -0
- package/dist/scoring/category-score.js +157 -0
- package/dist/scoring/category-score.js.map +1 -0
- package/dist/scoring/composite.d.ts +5 -0
- package/dist/scoring/composite.d.ts.map +1 -0
- package/dist/scoring/composite.js +24 -0
- package/dist/scoring/composite.js.map +1 -0
- package/dist/scoring/deep-eval.d.ts +25 -0
- package/dist/scoring/deep-eval.d.ts.map +1 -0
- package/dist/scoring/deep-eval.js +382 -0
- package/dist/scoring/deep-eval.js.map +1 -0
- package/dist/scoring/goal-achievement.d.ts +5 -0
- package/dist/scoring/goal-achievement.d.ts.map +1 -0
- package/dist/scoring/goal-achievement.js +241 -0
- package/dist/scoring/goal-achievement.js.map +1 -0
- package/dist/scoring/index.d.ts +22 -0
- package/dist/scoring/index.d.ts.map +1 -0
- package/dist/scoring/index.js +115 -0
- package/dist/scoring/index.js.map +1 -0
- package/dist/scoring/parse-json.d.ts +6 -0
- package/dist/scoring/parse-json.d.ts.map +1 -0
- package/dist/scoring/parse-json.js +18 -0
- package/dist/scoring/parse-json.js.map +1 -0
- package/dist/scoring/sparse-index.d.ts +15 -0
- package/dist/scoring/sparse-index.d.ts.map +1 -0
- package/dist/scoring/sparse-index.js +338 -0
- package/dist/scoring/sparse-index.js.map +1 -0
- package/dist/scoring/triage.d.ts +15 -0
- package/dist/scoring/triage.d.ts.map +1 -0
- package/dist/scoring/triage.js +204 -0
- package/dist/scoring/triage.js.map +1 -0
- package/dist/skills/resolver.d.ts +19 -0
- package/dist/skills/resolver.d.ts.map +1 -0
- package/dist/skills/resolver.js +95 -0
- package/dist/skills/resolver.js.map +1 -0
- package/dist/transcript/categorize.d.ts +24 -0
- package/dist/transcript/categorize.d.ts.map +1 -0
- package/dist/transcript/categorize.js +233 -0
- package/dist/transcript/categorize.js.map +1 -0
- package/dist/transcript/classify.d.ts +7 -0
- package/dist/transcript/classify.d.ts.map +1 -0
- package/dist/transcript/classify.js +32 -0
- package/dist/transcript/classify.js.map +1 -0
- package/dist/transcript/extract.d.ts +24 -0
- package/dist/transcript/extract.d.ts.map +1 -0
- package/dist/transcript/extract.js +266 -0
- package/dist/transcript/extract.js.map +1 -0
- package/dist/transcript/index.d.ts +3 -0
- package/dist/transcript/index.d.ts.map +1 -0
- package/dist/transcript/index.js +2 -0
- package/dist/transcript/index.js.map +1 -0
- package/dist/transcript/normalize.d.ts +15 -0
- package/dist/transcript/normalize.d.ts.map +1 -0
- package/dist/transcript/normalize.js +160 -0
- package/dist/transcript/normalize.js.map +1 -0
- package/dist/transcript/types.d.ts +92 -0
- package/dist/transcript/types.d.ts.map +1 -0
- package/dist/transcript/types.js +2 -0
- package/dist/transcript/types.js.map +1 -0
- package/dist/transcript/urls.d.ts +10 -0
- package/dist/transcript/urls.d.ts.map +1 -0
- package/dist/transcript/urls.js +31 -0
- package/dist/transcript/urls.js.map +1 -0
- package/dist/types/agent.d.ts +80 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +2 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/baseline.d.ts +65 -0
- package/dist/types/baseline.d.ts.map +1 -0
- package/dist/types/baseline.js +2 -0
- package/dist/types/baseline.js.map +1 -0
- package/dist/types/config.d.ts +76 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/output.d.ts +70 -0
- package/dist/types/output.d.ts.map +1 -0
- package/dist/types/output.js +15 -0
- package/dist/types/output.js.map +1 -0
- package/dist/types/report.d.ts +37 -0
- package/dist/types/report.d.ts.map +1 -0
- package/dist/types/report.js +2 -0
- package/dist/types/report.js.map +1 -0
- package/dist/types/scenario.d.ts +23 -0
- package/dist/types/scenario.d.ts.map +1 -0
- package/dist/types/scenario.js +2 -0
- package/dist/types/scenario.js.map +1 -0
- package/dist/types/scoring.d.ts +176 -0
- package/dist/types/scoring.d.ts.map +1 -0
- package/dist/types/scoring.js +2 -0
- package/dist/types/scoring.js.map +1 -0
- package/dist/ui/AnimatedTokens.d.ts +29 -0
- package/dist/ui/AnimatedTokens.d.ts.map +1 -0
- package/dist/ui/AnimatedTokens.js +53 -0
- package/dist/ui/AnimatedTokens.js.map +1 -0
- package/dist/ui/App.d.ts +6 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +16 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/LiveDuration.d.ts +20 -0
- package/dist/ui/LiveDuration.d.ts.map +1 -0
- package/dist/ui/LiveDuration.js +31 -0
- package/dist/ui/LiveDuration.js.map +1 -0
- package/dist/ui/LiveStatus.d.ts +7 -0
- package/dist/ui/LiveStatus.d.ts.map +1 -0
- package/dist/ui/LiveStatus.js +52 -0
- package/dist/ui/LiveStatus.js.map +1 -0
- package/dist/ui/format.d.ts +29 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +514 -0
- package/dist/ui/format.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,291 @@
|
|
|
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: #faf9f5;--bg-card: #ffffff;--text: #141413;--text-secondary: #6b6962;--text-muted: #9a958d;--mid-gray: #b0aea5;--light-gray: #e8e6dc;--border: #e0ddd4;--accent: #d97757;--accent-hover: #c4654a;--accent-blue: #6a9bcc;--success: #788c5d;--success-light: #e8eddf;--yellow: #c9a227;--yellow-light: #faf3d8;--warning: #d97757;--warning-light: #fceee8;--danger: #c0392b;--danger-light: #fce4e1;--radius: 6px;--radius-lg: 10px;--shadow: 0 1px 3px rgba(20, 20, 19, .06), 0 2px 8px rgba(20, 20, 19, .04);--shadow-lg: 0 4px 16px rgba(20, 20, 19, .08);--font: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, Roboto, sans-serif;--font-mono: "SF Mono", SFMono-Regular, Menlo, Consolas, monospace;--transition: .2s 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:1.75rem;font-weight:600;letter-spacing:-.02em;color:var(--text)}h2{font-size:1.25rem;font-weight:600;letter-spacing:-.01em;color:var(--text)}h3{font-size:1rem;font-weight:600;color:var(--text)}.report-header{margin-bottom:32px}.report-title{display:flex;align-items:baseline;gap:12px;margin-bottom:4px}.report-title h1{flex-shrink:0}.report-id{font-family:var(--font-mono);font-size:.875rem;color:var(--text-secondary);font-weight:400}.report-timestamp{font-size:.8125rem;color:var(--text-muted);margin-bottom:24px;display:block}.summary-cards{display:flex;gap:12px;flex-wrap:wrap}.summary-card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:16px 20px;min-width:120px;flex:1;box-shadow:var(--shadow)}.summary-card .card-value{font-size:1.5rem;font-weight:700;color:var(--text);line-height:1.2;margin-bottom:2px}.summary-card .card-label{font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);font-weight:500}.summary-card.card-failed .card-value{color:var(--danger)}.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:var(--warning)}.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:#00000005}.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:.75rem}.result-row.expanded .expand-icon{transform:rotate(90deg)}.result-row .error-hint{display:block;font-size:.75rem;color:var(--danger);margin-top:2px}.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:var(--warning)}.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:var(--warning)}.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)}.deductions-summary{background:var(--warning-light);border:1px solid var(--warning);border-radius:var(--radius);padding:14px 16px;margin-bottom:16px}.deductions-header{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--warning);margin-bottom:10px}.deduction-item{display:grid;grid-template-columns:1fr auto;gap:4px 12px;padding:6px 0;border-bottom:1px solid rgba(217,119,87,.15)}.deduction-item:last-child{border-bottom:none;padding-bottom:0}.deduction-criterion{font-size:.8125rem;font-weight:500;color:var(--text)}.deduction-lost{font-size:.75rem;font-weight:600;font-family:var(--font-mono);color:var(--warning);white-space:nowrap}.deduction-rationale{grid-column:1 / -1;font-size:.75rem;color:var(--text-secondary);line-height:1.5;font-style:italic}.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:var(--warning)}.dim-tag.fill-red{background:var(--danger)}.cat-deduction-item{padding:8px 0;border-bottom:1px solid rgba(217,119,87,.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-blue);background:none;border:none;cursor:pointer;font-family:var(--font);padding:4px 0;font-weight:500}.audits-toggle:hover{color:var(--accent)}.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:#00000005}.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(--success)}.wf-svc .wf-bar{background:var(--accent-blue)}.wf-agent .wf-bar{background:var(--mid-gray)}.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-blue);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:#6a9bcc0d;border-color:var(--accent-blue)}.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(--success)}.wf-legend-dot.wf-svc{background:var(--accent-blue)}.wf-legend-dot.wf-agent{background:var(--mid-gray)}.sparse-index-section{margin-top:16px}.sparse-index-toggle{font-size:.75rem;color:var(--accent-blue);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(--mid-gray);white-space:pre;overflow-x:auto}.sparse-line.cat-env{border-left-color:var(--success);background:#788c5d0a}.sparse-line.cat-svc{border-left-color:var(--accent-blue);background:#6a9bcc0a}.sparse-line.cat-agent{border-left-color:var(--mid-gray)}.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:#00000005}.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-blue);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-blue);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:#6a9bcc14;border-color:var(--accent-blue)}.modal-backdrop{display:none;position:fixed;inset:0;z-index:100;background:#14141373;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 #1414131f;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)}.report-footer{margin-top:48px;padding-top:16px;border-top:1px solid var(--light-gray);text-align:center;font-size:.6875rem;color:var(--text-muted);letter-spacing:.02em}@media(max-width:768px){.container{padding:16px 12px 48px}.summary-cards{flex-direction:column}.summary-card{min-width:0}.score-overview{flex-direction:column;align-items:center;gap:16px}.dimensions-grid{grid-template-columns:1fr}.wf-label-col{width:120px}.wf-dur-col{width:48px}.wf-tool{font-size:.6875rem}.results-table{font-size:.8125rem}.results-table thead th.hide-mobile,.results-table tbody td.hide-mobile{display:none}.detail-panel{padding:16px 12px}}@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,.modal-backdrop{display:none!important}}
|
|
2
|
+
</style></head> <body> <div id="app"> <div class="loading">Loading report…</div> </div> <script id="axis-data" type="application/json">__AXIS_REPORT_DATA__</script> <script type="module">function x(e){return"averageAxisScore"in e}function o(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}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 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 y(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 v(e,s=!1){return e===void 0?`<span class="score-badge score-na${s?" score-badge-lg":""}">—</span>`:`<span class="score-badge ${y(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 k(e,s){return`
|
|
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 L(e){return`
|
|
8
|
+
<div class="container">
|
|
9
|
+
${R(e)}
|
|
10
|
+
${M(e)}
|
|
11
|
+
<footer class="report-footer">AXIS — Agent eXperience Index Score</footer>
|
|
12
|
+
</div>
|
|
13
|
+
${J(e.results)}`}function R(e){const s=x(e.summary),t=e.results.reduce((a,n)=>a+(n.totalCostUsd??0),0);return`
|
|
14
|
+
<header class="report-header">
|
|
15
|
+
<div class="report-title">
|
|
16
|
+
<h1>AXIS Report</h1>
|
|
17
|
+
<span class="report-id">${o(e.reportId)}</span>
|
|
18
|
+
</div>
|
|
19
|
+
<span class="report-timestamp">${A(e.timestamp)}</span>
|
|
20
|
+
<div class="summary-cards">
|
|
21
|
+
<div class="summary-card">
|
|
22
|
+
<div class="card-value">${e.summary.total}</div>
|
|
23
|
+
<div class="card-label">Scenarios</div>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="summary-card">
|
|
26
|
+
<div class="card-value">${e.summary.completed}</div>
|
|
27
|
+
<div class="card-label">Passed</div>
|
|
28
|
+
</div>
|
|
29
|
+
<div class="summary-card${e.summary.failed>0?" card-failed":""}">
|
|
30
|
+
<div class="card-value">${e.summary.failed}</div>
|
|
31
|
+
<div class="card-label">Failed</div>
|
|
32
|
+
</div>
|
|
33
|
+
${s?`
|
|
34
|
+
<div class="summary-card">
|
|
35
|
+
<div class="card-value">${v(e.summary.averageAxisScore)}</div>
|
|
36
|
+
<div class="card-label">Avg AXIS Result</div>
|
|
37
|
+
</div>`:""}
|
|
38
|
+
<div class="summary-card">
|
|
39
|
+
<div class="card-value">${u(e.durationMs)}</div>
|
|
40
|
+
<div class="card-label">Duration</div>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="summary-card">
|
|
43
|
+
<div class="card-value">${f(t>0?t:void 0)}</div>
|
|
44
|
+
<div class="card-label">Total Cost</div>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
</header>`}function M(e){if(e.results.length===0)return'<div class="empty-state">No results in this report.</div>';const s=e.results.some(a=>a.score!==void 0),t=e.results.map((a,n)=>I(a,n,s)+D(a,n)).join("");return`
|
|
48
|
+
<section class="results-section">
|
|
49
|
+
<table class="results-table">
|
|
50
|
+
<thead>
|
|
51
|
+
<tr>
|
|
52
|
+
<th></th>
|
|
53
|
+
<th>Scenario</th>
|
|
54
|
+
<th>Agent</th>
|
|
55
|
+
${s?`
|
|
56
|
+
<th class="col-score">AXIS</th>
|
|
57
|
+
<th class="col-score hide-mobile">Goal</th>
|
|
58
|
+
<th class="col-score hide-mobile">Env</th>
|
|
59
|
+
<th class="col-score hide-mobile">Svc</th>
|
|
60
|
+
<th class="col-score hide-mobile">Agent</th>`:`
|
|
61
|
+
<th class="col-score">Status</th>`}
|
|
62
|
+
<th class="col-right hide-mobile">Duration</th>
|
|
63
|
+
<th class="col-right hide-mobile">Cost</th>
|
|
64
|
+
</tr>
|
|
65
|
+
</thead>
|
|
66
|
+
<tbody>${t}</tbody>
|
|
67
|
+
</table>
|
|
68
|
+
</section>`}function I(e,s,t){const a=e.score,n=e.exitCode!==0||!!e.error,i=e.error?`<span class="error-hint">${o(se(e.error))}</span>`:"",c=e.prompt?`<button class="info-btn" data-modal-index="${s}" title="View scenario settings">ℹ</button>`:"";if(t)return`
|
|
69
|
+
<tr class="result-row" data-index="${s}">
|
|
70
|
+
<td><span class="expand-icon">▶</span></td>
|
|
71
|
+
<td class="col-scenario">${o(e.scenarioName)}${c}${i}</td>
|
|
72
|
+
<td class="col-agent">${o(e.agentName)}</td>
|
|
73
|
+
<td class="col-score">${v(a?.axisScore)}</td>
|
|
74
|
+
<td class="col-score hide-mobile">${v(a?.goalAchievement.score)}</td>
|
|
75
|
+
<td class="col-score hide-mobile">${v(a?.environment.score)}</td>
|
|
76
|
+
<td class="col-score hide-mobile">${v(a?.service.score)}</td>
|
|
77
|
+
<td class="col-score hide-mobile">${v(a?.agent.score)}</td>
|
|
78
|
+
<td class="col-right hide-mobile">${u(e.durationMs)}</td>
|
|
79
|
+
<td class="col-right hide-mobile">${f(e.totalCostUsd)}</td>
|
|
80
|
+
</tr>`;const l=n?'<span class="score-badge score-red">Fail</span>':'<span class="score-badge score-green">Pass</span>';return`
|
|
81
|
+
<tr class="result-row" data-index="${s}">
|
|
82
|
+
<td><span class="expand-icon">▶</span></td>
|
|
83
|
+
<td class="col-scenario">${o(e.scenarioName)}${c}${i}</td>
|
|
84
|
+
<td class="col-agent">${o(e.agentName)}</td>
|
|
85
|
+
<td class="col-score">${l}</td>
|
|
86
|
+
<td class="col-right hide-mobile">${u(e.durationMs)}</td>
|
|
87
|
+
<td class="col-right hide-mobile">${f(e.totalCostUsd)}</td>
|
|
88
|
+
</tr>`}function D(e,s){const t=e.score?10:7;return`
|
|
89
|
+
<tr class="detail-row" id="detail-${s}">
|
|
90
|
+
<td colspan="${t}">
|
|
91
|
+
<div class="detail-panel">
|
|
92
|
+
${e.error?`<div class="error-banner">${o(e.error)}</div>`:""}
|
|
93
|
+
${e.score?N(e.score):T(e)}
|
|
94
|
+
</div>
|
|
95
|
+
</td>
|
|
96
|
+
</tr>`}function T(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()}`)),`
|
|
97
|
+
<div class="detail-sections">
|
|
98
|
+
<div class="detail-section">
|
|
99
|
+
<div class="section-header"><h3>Run Details</h3></div>
|
|
100
|
+
<p style="color: var(--text-secondary); font-size: 0.875rem;">
|
|
101
|
+
Duration: ${u(e.durationMs)}
|
|
102
|
+
${s.length?` · Tokens: ${s.join(", ")}`:""}
|
|
103
|
+
${e.totalCostUsd?` · Cost: ${f(e.totalCostUsd)}`:""}
|
|
104
|
+
</p>
|
|
105
|
+
</div>
|
|
106
|
+
</div>`}function N(e){return`
|
|
107
|
+
<div class="score-overview">
|
|
108
|
+
${v(e.axisScore,!0)}
|
|
109
|
+
<div class="category-bars">
|
|
110
|
+
${p("Goal Achievement",e.goalAchievement.score)}
|
|
111
|
+
${p("Environment",e.environment.score)}
|
|
112
|
+
${p("Service",e.service.score)}
|
|
113
|
+
${p("Agent",e.agent.score)}
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
<div class="detail-sections">
|
|
117
|
+
${e.sparseIndex?_(e.sparseIndex):""}
|
|
118
|
+
${j(e.goalAchievement)}
|
|
119
|
+
${h("Environment",e.environment)}
|
|
120
|
+
${h("Service",e.service)}
|
|
121
|
+
${h("Agent",e.agent)}
|
|
122
|
+
${e.sparseIndex?V(e.sparseIndex):""}
|
|
123
|
+
</div>`}function p(e,s){return`
|
|
124
|
+
<div class="category-bar-row">
|
|
125
|
+
<span class="category-bar-label">${e}</span>
|
|
126
|
+
${b(s)}
|
|
127
|
+
<span class="category-bar-value">${s}</span>
|
|
128
|
+
</div>`}function j(e){const s=e.criteria.filter(n=>n.score<10),t=s.length>0?q(s):"",a=e.criteria.map(P).join("");return`
|
|
129
|
+
<div class="detail-section">
|
|
130
|
+
<div class="section-header">
|
|
131
|
+
<h3>Goal Achievement</h3>
|
|
132
|
+
<span class="section-score">${e.score} / 100</span>
|
|
133
|
+
</div>
|
|
134
|
+
${t}
|
|
135
|
+
<div class="criteria-list">${a}</div>
|
|
136
|
+
</div>`}function q(e){return`
|
|
137
|
+
<div class="deductions-summary">
|
|
138
|
+
<div class="deductions-header">Areas for improvement</div>
|
|
139
|
+
${e.map(t=>{const a=10-t.score;return`
|
|
140
|
+
<div class="deduction-item">
|
|
141
|
+
<span class="deduction-criterion">${o(t.check)}</span>
|
|
142
|
+
<span class="deduction-lost">-${a} pts</span>
|
|
143
|
+
<span class="deduction-rationale">${o(t.rationale)}</span>
|
|
144
|
+
</div>`}).join("")}
|
|
145
|
+
</div>`}function P(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`
|
|
146
|
+
<div class="${s?"criterion-item criterion-perfect":"criterion-item criterion-imperfect"}">
|
|
147
|
+
<div class="criterion-top">
|
|
148
|
+
<span class="criterion-icon ${n}">${a}</span>
|
|
149
|
+
<span class="criterion-name">${o(e.check)}</span>
|
|
150
|
+
<span class="criterion-score">${e.score}/10</span>
|
|
151
|
+
<span class="criterion-weight">${i}%</span>
|
|
152
|
+
</div>
|
|
153
|
+
<div class="criterion-bar">${b(e.score,10)}</div>
|
|
154
|
+
${s?"":`<div class="criterion-rationale">${o(e.rationale)}</div>`}
|
|
155
|
+
</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=>k(d.label,d.value)).join("")}</div>`:"",r=c.length>0?B(c,a):"";return`
|
|
156
|
+
<div class="detail-section">
|
|
157
|
+
<div class="section-header">
|
|
158
|
+
<h3>${o(e)}</h3>
|
|
159
|
+
<span class="section-score">${s.score} / 100</span>
|
|
160
|
+
</div>
|
|
161
|
+
<div class="interaction-meta">
|
|
162
|
+
${s.interactionCount} interaction${s.interactionCount!==1?"s":""}
|
|
163
|
+
${n?`· ${s.auditedCount} audited`:""}
|
|
164
|
+
</div>
|
|
165
|
+
${l}
|
|
166
|
+
${r}
|
|
167
|
+
${n?U(a):""}
|
|
168
|
+
${H(s.necessity)}
|
|
169
|
+
</div>`}function B(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=>`
|
|
170
|
+
<div class="cat-deduction-item">
|
|
171
|
+
<span class="cat-deduction-id">#${i.id}</span>
|
|
172
|
+
<span class="cat-deduction-scores">${F(i)}</span>
|
|
173
|
+
<span class="cat-deduction-rationale">${o(i.rationale)}</span>
|
|
174
|
+
</div>`).join("");return`
|
|
175
|
+
<div class="deductions-summary">
|
|
176
|
+
<div class="deductions-header">Score breakdown</div>
|
|
177
|
+
<div class="dim-tags">${a}</div>
|
|
178
|
+
${n}
|
|
179
|
+
</div>`}function F(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 U(e){const s=e.map(O).join("");return`
|
|
180
|
+
<div class="audits-section">
|
|
181
|
+
<button class="audits-toggle">Show audits (${e.length})</button>
|
|
182
|
+
<div class="audits-list">${s}</div>
|
|
183
|
+
</div>`}function O(e){return`
|
|
184
|
+
<div class="audit-item">
|
|
185
|
+
<div class="audit-header">
|
|
186
|
+
<span class="audit-id">#${e.id}</span>
|
|
187
|
+
<span class="audit-scores">
|
|
188
|
+
S:${m(e.success)} Sp:${m(e.speed)} R:${m(e.contextRelevance)}
|
|
189
|
+
</span>
|
|
190
|
+
</div>
|
|
191
|
+
<div class="audit-rationale">${o(e.rationale)}</div>
|
|
192
|
+
</div>`}function m(e){return(e*100).toFixed(0)}function H(e){if(e.rationale==="default")return"";const s=Math.round(e.score*100),t=e.unnecessaryIds.length>0?` · Unnecessary: #${e.unnecessaryIds.join(", #")}`:"";return`
|
|
193
|
+
<div class="necessity-section">
|
|
194
|
+
<div class="necessity-header">
|
|
195
|
+
<span class="necessity-label">Necessity</span>
|
|
196
|
+
<span class="necessity-score ${y(s)}">${s}/100</span>
|
|
197
|
+
${t}
|
|
198
|
+
</div>
|
|
199
|
+
<div class="necessity-rationale">${o(e.rationale)}</div>
|
|
200
|
+
</div>`}const $=30;function _(e){const{interactions:s}=e;if(!s.some(r=>r.startMs!==null)||s.length===0)return"";const a=e.stats.wallClockMs||G(s);if(a<=0)return"";const n=z(a),i=s.length>$,c=i?s.slice(0,$):s,l=i?s.slice($):[];return`
|
|
201
|
+
<div class="detail-section">
|
|
202
|
+
<div class="section-header">
|
|
203
|
+
<h3>Timeline</h3>
|
|
204
|
+
<span class="section-score">${u(a)} · ${s.length} interactions</span>
|
|
205
|
+
</div>
|
|
206
|
+
<div class="waterfall">
|
|
207
|
+
<div class="waterfall-header">
|
|
208
|
+
<div class="wf-label-col"></div>
|
|
209
|
+
<div class="wf-timeline-col">
|
|
210
|
+
<div class="wf-ticks">
|
|
211
|
+
${n.map(r=>`<span class="wf-tick" style="left: ${r.pct.toFixed(2)}%">${r.label}</span>`).join("")}
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
<div class="wf-dur-col">Duration</div>
|
|
215
|
+
</div>
|
|
216
|
+
<div class="waterfall-body">
|
|
217
|
+
${c.map(r=>w(r,a)).join("")}
|
|
218
|
+
${i?`<div class="wf-overflow" style="display:none">${l.map(r=>w(r,a)).join("")}</div>`:""}
|
|
219
|
+
</div>
|
|
220
|
+
${i?`<button class="wf-show-all">Show all ${s.length} interactions</button>`:""}
|
|
221
|
+
<div class="wf-legend">
|
|
222
|
+
<span class="wf-legend-item"><span class="wf-legend-dot wf-env"></span>Environment</span>
|
|
223
|
+
<span class="wf-legend-item"><span class="wf-legend-dot wf-svc"></span>Service</span>
|
|
224
|
+
<span class="wf-legend-item"><span class="wf-legend-dot wf-agent"></span>Agent</span>
|
|
225
|
+
</div>
|
|
226
|
+
</div>
|
|
227
|
+
</div>`}function w(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",C=[`#${e.id} ${r} (${d})`,e.durationMs!==null?`Duration: ${u(e.durationMs)}`:null,`Context: ${W(e.contextBytes)}`,e.hasError?"ERROR":null].filter(Boolean).join(`
|
|
228
|
+
`);return`
|
|
229
|
+
<div class="wf-row ${c}">
|
|
230
|
+
<div class="wf-label-col">
|
|
231
|
+
<span class="wf-id">#${e.id}</span>
|
|
232
|
+
<span class="wf-cat">${d}</span>
|
|
233
|
+
<span class="wf-tool">${o(r)}</span>
|
|
234
|
+
</div>
|
|
235
|
+
<div class="wf-timeline-col">
|
|
236
|
+
<div class="wf-track">
|
|
237
|
+
<div class="wf-bar${l}" style="left:${n.toFixed(2)}%;width:${i.toFixed(2)}%" title="${o(C)}"></div>
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
240
|
+
<div class="wf-dur-col">${e.durationMs!==null?u(e.durationMs):"—"}</div>
|
|
241
|
+
</div>`}function X(e){return e.categories.includes("environment")?"wf-env":e.categories.includes("service")?"wf-svc":"wf-agent"}function W(e){return e<1024?`${e}B`:`${(e/1024).toFixed(1)}KB`}function G(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 z(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 V(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`
|
|
242
|
+
<div class="detail-section">
|
|
243
|
+
<div class="section-header">
|
|
244
|
+
<h3>Transcript</h3>
|
|
245
|
+
<span class="section-score">${e.stats.totalInteractions} interactions</span>
|
|
246
|
+
</div>
|
|
247
|
+
<div class="sparse-index-section">
|
|
248
|
+
<button class="sparse-index-toggle">Show transcript</button>
|
|
249
|
+
${s?'<button class="sparse-expand-all">Expand all</button>':""}
|
|
250
|
+
<div class="sparse-index-content">${t}</div>
|
|
251
|
+
</div>
|
|
252
|
+
</div>`}function J(e){return e.map((s,t)=>s.prompt?K(s,t):"").join("")}function K(e,s){return`
|
|
253
|
+
<div class="modal-backdrop" data-modal-index="${s}">
|
|
254
|
+
<div class="modal">
|
|
255
|
+
<div class="modal-header">
|
|
256
|
+
<div>
|
|
257
|
+
<h3>${o(e.scenarioName)}</h3>
|
|
258
|
+
<span class="modal-subtitle">${o(e.scenarioKey)} · ${o(e.agentName)}</span>
|
|
259
|
+
</div>
|
|
260
|
+
<button class="modal-close">×</button>
|
|
261
|
+
</div>
|
|
262
|
+
<div class="modal-body">
|
|
263
|
+
${Q(e.prompt)}
|
|
264
|
+
${e.rubric?Y(e.rubric):""}
|
|
265
|
+
${e.agentConfig?Z(e.agentConfig):""}
|
|
266
|
+
</div>
|
|
267
|
+
</div>
|
|
268
|
+
</div>`}function Q(e){return`
|
|
269
|
+
<div class="modal-section">
|
|
270
|
+
<h4>Prompt</h4>
|
|
271
|
+
<pre class="modal-prompt">${o(e)}</pre>
|
|
272
|
+
</div>`}function Y(e){return typeof e=="string"?`
|
|
273
|
+
<div class="modal-section">
|
|
274
|
+
<h4>Rubric</h4>
|
|
275
|
+
<pre class="modal-prompt">${o(e)}</pre>
|
|
276
|
+
</div>`:`
|
|
277
|
+
<div class="modal-section">
|
|
278
|
+
<h4>Rubric</h4>
|
|
279
|
+
<table class="modal-rubric-table">
|
|
280
|
+
<thead><tr><th>Check</th><th>Weight</th></tr></thead>
|
|
281
|
+
<tbody>${e.map(t=>`
|
|
282
|
+
<tr>
|
|
283
|
+
<td>${o(t.check)}</td>
|
|
284
|
+
<td class="modal-rubric-weight">${Math.round(t.weight*100)}%</td>
|
|
285
|
+
</tr>`).join("")}</tbody>
|
|
286
|
+
</table>
|
|
287
|
+
</div>`}function Z(e){const s=Object.entries(e);return s.length===0?"":`
|
|
288
|
+
<div class="modal-section">
|
|
289
|
+
<h4>Agent Configuration</h4>
|
|
290
|
+
<div class="modal-config">${s.map(([a,n])=>{const i=typeof n=="string"?n:JSON.stringify(n);return`<div class="modal-config-item"><span class="modal-config-key">${o(a)}</span><span class="modal-config-val">${o(String(i))}</span></div>`}).join("")}</div>
|
|
291
|
+
</div>`}const ee=[[/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 se(e){for(const[s,t]of ee)if(s.test(e))return t;return e.length>80?e.slice(0,77)+"...":e}function te(){document.querySelectorAll(".result-row").forEach(e=>{e.addEventListener("click",()=>{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(".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 S(e){const s=document.getElementById("app");s&&(s.innerHTML=L(e),document.title=`AXIS Report — ${o(e.reportId)}`,te())}const ae=document.getElementById("axis-data"),g=ae?.textContent?.trim();if(g&&g!=="__AXIS_REPORT_DATA__")try{S(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=>S(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>
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.1.0",
|
|
3
|
+
"reportId": "2026-04-23-222213",
|
|
4
|
+
"timestamp": "2026-04-23T22:22:13.210Z",
|
|
5
|
+
"durationMs": 102590,
|
|
6
|
+
"summary": {
|
|
7
|
+
"total": 1,
|
|
8
|
+
"completed": 1,
|
|
9
|
+
"failed": 0,
|
|
10
|
+
"averageAxisScore": 74
|
|
11
|
+
},
|
|
12
|
+
"results": [
|
|
13
|
+
{
|
|
14
|
+
"scenarioKey": "explain-docs",
|
|
15
|
+
"scenarioName": "Fetch and summarize documentation",
|
|
16
|
+
"agentName": "claude-sdk",
|
|
17
|
+
"durationMs": 29570,
|
|
18
|
+
"exitCode": 0,
|
|
19
|
+
"file": "scenarios/explain-docs/claude-sdk.json",
|
|
20
|
+
"tokenUsage": {
|
|
21
|
+
"input": 8,
|
|
22
|
+
"output": 1146,
|
|
23
|
+
"cacheReadInput": 51619
|
|
24
|
+
},
|
|
25
|
+
"totalCostUsd": 0.05663694999999999,
|
|
26
|
+
"prompt": "Fetch the documentation page at https://docs.netlify.com/build/async-workloads/overview/ and write a detailed summary to summary.md. The summary should cover what the product does, setup steps, and key concepts.",
|
|
27
|
+
"rubric": [
|
|
28
|
+
{ "check": "Agent fetched the documentation URL", "weight": 0.25 },
|
|
29
|
+
{ "check": "Agent wrote summary.md with substantive content", "weight": 0.25 },
|
|
30
|
+
{ "check": "Summary covers what the product does", "weight": 0.25 },
|
|
31
|
+
{ "check": "Summary includes setup steps and key concepts", "weight": 0.25 }
|
|
32
|
+
],
|
|
33
|
+
"agentConfig": { "adapter": "claude-sdk", "model": "claude-sonnet-4-5-20250929", "maxTurns": 10 },
|
|
34
|
+
"score": {
|
|
35
|
+
"axisScore": 74,
|
|
36
|
+
"goalAchievement": {
|
|
37
|
+
"score": 88,
|
|
38
|
+
"criteria": [
|
|
39
|
+
{
|
|
40
|
+
"check": "Agent fetched the documentation URL",
|
|
41
|
+
"weight": 0.25,
|
|
42
|
+
"score": 10,
|
|
43
|
+
"rationale": "Agent used WebFetch on the exact URL provided and the fetched content matches what I independently retrieved from the live page."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"check": "Agent wrote summary.md with substantive content",
|
|
47
|
+
"weight": 0.25,
|
|
48
|
+
"score": 10,
|
|
49
|
+
"rationale": "summary.md exists at the expected path with 42 lines of well-structured, substantive markdown including headers, a feature table, and use cases."
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"check": "Summary covers what the product does",
|
|
53
|
+
"weight": 0.25,
|
|
54
|
+
"score": 10,
|
|
55
|
+
"rationale": "The summary clearly explains what async workloads are (background fault-tolerant tasks decoupled from client requests), problems solved (retries, scheduling, workflow complexity, infrastructure overhead), and how they relate to Netlify's serverless platform."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"check": "Summary includes setup steps and key concepts",
|
|
59
|
+
"weight": 0.25,
|
|
60
|
+
"score": 5,
|
|
61
|
+
"rationale": "Key concepts (durable execution, multi-step workflows, scheduling, event-based triggers) are well covered. However, setup steps are entirely absent \u2014 the actual docs describe team-level (Extensions page) and site-level (Project > Build & Deploy) configuration, which the summary omits."
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
"environment": {
|
|
66
|
+
"score": 67,
|
|
67
|
+
"interactionCount": 1,
|
|
68
|
+
"auditedCount": 1,
|
|
69
|
+
"dimensions": {
|
|
70
|
+
"success": 100,
|
|
71
|
+
"speed": 100,
|
|
72
|
+
"weight": 100,
|
|
73
|
+
"relevance": 60,
|
|
74
|
+
"necessity": 100
|
|
75
|
+
},
|
|
76
|
+
"audits": [
|
|
77
|
+
{
|
|
78
|
+
"id": 6,
|
|
79
|
+
"categories": ["environment"],
|
|
80
|
+
"success": 1,
|
|
81
|
+
"speed": 1,
|
|
82
|
+
"weight": 1,
|
|
83
|
+
"contextRelevance": 0.6,
|
|
84
|
+
"rationale": "The write operation itself succeeded and was right-sized \u2014 the agent wrote what it intended to write (2.9KB). Weight scores high because the tool was used appropriately for the intended operation. contextRelevance is reduced because the output closely mirrors the fetched content structure rather than distilling it, undermining the summarization goal \u2014 though this is a content quality issue, not a tool operation issue."
|
|
85
|
+
}
|
|
86
|
+
],
|
|
87
|
+
"necessity": {
|
|
88
|
+
"category": "environment",
|
|
89
|
+
"score": 1,
|
|
90
|
+
"unnecessaryIds": [],
|
|
91
|
+
"rationale": "Writing summary.md was the core task deliverable. The write was necessary."
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
"service": {
|
|
95
|
+
"score": 65,
|
|
96
|
+
"interactionCount": 1,
|
|
97
|
+
"auditedCount": 1,
|
|
98
|
+
"dimensions": {
|
|
99
|
+
"success": 70,
|
|
100
|
+
"speed": 100,
|
|
101
|
+
"weight": 60,
|
|
102
|
+
"relevance": 70,
|
|
103
|
+
"necessity": 100
|
|
104
|
+
},
|
|
105
|
+
"audits": [
|
|
106
|
+
{
|
|
107
|
+
"id": 4,
|
|
108
|
+
"categories": ["service"],
|
|
109
|
+
"success": 0.7,
|
|
110
|
+
"speed": 1,
|
|
111
|
+
"weight": 0.6,
|
|
112
|
+
"contextRelevance": 0.7,
|
|
113
|
+
"rationale": "Fetch succeeded and returned structured content, but 3.0KB for a documentation overview page is suspiciously small, suggesting possible JS-gated content was missed. The content returned appears to be a subset of the full page. Weight is penalized because the prompt was verbose but the returned payload was minimal, indicating the fetch likely hit a lightweight shell rather than full rendered docs."
|
|
114
|
+
}
|
|
115
|
+
],
|
|
116
|
+
"necessity": {
|
|
117
|
+
"category": "service",
|
|
118
|
+
"score": 1,
|
|
119
|
+
"unnecessaryIds": [],
|
|
120
|
+
"rationale": "Fetching the documentation page was required to complete the task. The single fetch was necessary and no retries were made."
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
"agent": {
|
|
124
|
+
"score": 63,
|
|
125
|
+
"interactionCount": 5,
|
|
126
|
+
"auditedCount": 0,
|
|
127
|
+
"dimensions": {
|
|
128
|
+
"success": 100,
|
|
129
|
+
"speed": 80,
|
|
130
|
+
"weight": 80,
|
|
131
|
+
"relevance": 80,
|
|
132
|
+
"necessity": 80
|
|
133
|
+
},
|
|
134
|
+
"audits": [
|
|
135
|
+
{
|
|
136
|
+
"id": 1,
|
|
137
|
+
"categories": ["agent"],
|
|
138
|
+
"success": 1,
|
|
139
|
+
"speed": 0.8,
|
|
140
|
+
"weight": 0.8,
|
|
141
|
+
"contextRelevance": 0.8,
|
|
142
|
+
"rationale": "default"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"id": 2,
|
|
146
|
+
"categories": ["agent"],
|
|
147
|
+
"success": 1,
|
|
148
|
+
"speed": 0.8,
|
|
149
|
+
"weight": 0.8,
|
|
150
|
+
"contextRelevance": 0.8,
|
|
151
|
+
"rationale": "default"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"id": 3,
|
|
155
|
+
"categories": ["agent"],
|
|
156
|
+
"success": 1,
|
|
157
|
+
"speed": 0.8,
|
|
158
|
+
"weight": 0.8,
|
|
159
|
+
"contextRelevance": 0.8,
|
|
160
|
+
"rationale": "default"
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"id": 5,
|
|
164
|
+
"categories": ["agent"],
|
|
165
|
+
"success": 1,
|
|
166
|
+
"speed": 0.8,
|
|
167
|
+
"weight": 0.8,
|
|
168
|
+
"contextRelevance": 0.8,
|
|
169
|
+
"rationale": "default"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": 7,
|
|
173
|
+
"categories": ["agent"],
|
|
174
|
+
"success": 1,
|
|
175
|
+
"speed": 0.8,
|
|
176
|
+
"weight": 0.8,
|
|
177
|
+
"contextRelevance": 0.8,
|
|
178
|
+
"rationale": "default"
|
|
179
|
+
}
|
|
180
|
+
],
|
|
181
|
+
"necessity": {
|
|
182
|
+
"category": "agent",
|
|
183
|
+
"score": 0.8,
|
|
184
|
+
"unnecessaryIds": [],
|
|
185
|
+
"rationale": "default"
|
|
186
|
+
}
|
|
187
|
+
},
|
|
188
|
+
"weights": {
|
|
189
|
+
"goal_achievement": 0.4,
|
|
190
|
+
"environment": 0.2,
|
|
191
|
+
"service": 0.2,
|
|
192
|
+
"agent": 0.2
|
|
193
|
+
},
|
|
194
|
+
"sparseIndex": {
|
|
195
|
+
"lines": [
|
|
196
|
+
"#1 agent user Fetch the documentation page at https://docs.netlify.com/build/async-workload...",
|
|
197
|
+
"#2 agent assistant Fetching the Netlify async workloads documentation page.",
|
|
198
|
+
"#3 agent tool_use ToolSearch(query: select:WebFetch, max_results: 1) -> ok, 57B, 211ms",
|
|
199
|
+
"#4 service tool_use Fetch(url: https://docs.netlify.com/build/async-workloads/overv...) -> ok, 3.0KB, 10.2s",
|
|
200
|
+
"#5 agent assistant Now writing the summary to `summary.md`.",
|
|
201
|
+
"#6 env tool_use Write(file_path: /private/var/folders/rw/rqr32pr1037grxt33xs5y6...) -> ok, 2.9KB, 11.7s",
|
|
202
|
+
"#7 agent assistant `summary.md` has been written. It covers: - **What async workloads are** \u2014 ba..."
|
|
203
|
+
],
|
|
204
|
+
"interactions": [
|
|
205
|
+
{
|
|
206
|
+
"id": 1,
|
|
207
|
+
"entryIndices": [0],
|
|
208
|
+
"categories": ["agent"],
|
|
209
|
+
"sparseLine": "#1 agent user Fetch the documentation page at https://docs.netlify.com/build/async-workload...",
|
|
210
|
+
"toolName": null,
|
|
211
|
+
"hasError": false,
|
|
212
|
+
"durationMs": 2100,
|
|
213
|
+
"contextBytes": 236,
|
|
214
|
+
"startMs": 0
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
"id": 2,
|
|
218
|
+
"entryIndices": [1],
|
|
219
|
+
"categories": ["agent"],
|
|
220
|
+
"sparseLine": "#2 agent assistant Fetching the Netlify async workloads documentation page.",
|
|
221
|
+
"toolName": null,
|
|
222
|
+
"hasError": false,
|
|
223
|
+
"durationMs": 1300,
|
|
224
|
+
"contextBytes": 56,
|
|
225
|
+
"startMs": 2100
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"id": 3,
|
|
229
|
+
"entryIndices": [2, 3],
|
|
230
|
+
"categories": ["agent"],
|
|
231
|
+
"sparseLine": "#3 agent tool_use ToolSearch(query: select:WebFetch, max_results: 1) -> ok, 57B, 211ms",
|
|
232
|
+
"toolName": "ToolSearch",
|
|
233
|
+
"hasError": false,
|
|
234
|
+
"durationMs": 211,
|
|
235
|
+
"contextBytes": 57,
|
|
236
|
+
"startMs": 3400
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"id": 4,
|
|
240
|
+
"entryIndices": [4, 5],
|
|
241
|
+
"categories": ["service"],
|
|
242
|
+
"sparseLine": "#4 service tool_use Fetch(url: https://docs.netlify.com/build/async-workloads/overv...) -> ok, 3.0KB, 10.2s",
|
|
243
|
+
"toolName": "Fetch",
|
|
244
|
+
"hasError": false,
|
|
245
|
+
"durationMs": 10195,
|
|
246
|
+
"contextBytes": 3089,
|
|
247
|
+
"startMs": 3611
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"id": 5,
|
|
251
|
+
"entryIndices": [6],
|
|
252
|
+
"categories": ["agent"],
|
|
253
|
+
"sparseLine": "#5 agent assistant Now writing the summary to `summary.md`.",
|
|
254
|
+
"toolName": null,
|
|
255
|
+
"hasError": false,
|
|
256
|
+
"durationMs": 2194,
|
|
257
|
+
"contextBytes": 40,
|
|
258
|
+
"startMs": 13806
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
"id": 6,
|
|
262
|
+
"entryIndices": [7, 8],
|
|
263
|
+
"categories": ["environment"],
|
|
264
|
+
"sparseLine": "#6 env tool_use Write(file_path: /private/var/folders/rw/rqr32pr1037grxt33xs5y6...) -> ok, 2.9KB, 11.7s",
|
|
265
|
+
"toolName": "Write",
|
|
266
|
+
"hasError": false,
|
|
267
|
+
"durationMs": 11670,
|
|
268
|
+
"contextBytes": 2975,
|
|
269
|
+
"startMs": 16000
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"id": 7,
|
|
273
|
+
"entryIndices": [9],
|
|
274
|
+
"categories": ["agent"],
|
|
275
|
+
"sparseLine": "#7 agent assistant `summary.md` has been written. It covers: - **What async workloads are** \u2014 ba...",
|
|
276
|
+
"toolName": null,
|
|
277
|
+
"hasError": false,
|
|
278
|
+
"durationMs": 2000,
|
|
279
|
+
"contextBytes": 465,
|
|
280
|
+
"startMs": 27670
|
|
281
|
+
}
|
|
282
|
+
],
|
|
283
|
+
"stats": {
|
|
284
|
+
"totalInteractions": 7,
|
|
285
|
+
"byCategory": {
|
|
286
|
+
"environment": 1,
|
|
287
|
+
"service": 1,
|
|
288
|
+
"agent": 5
|
|
289
|
+
},
|
|
290
|
+
"totalErrors": 0,
|
|
291
|
+
"totalDurationMs": 22076,
|
|
292
|
+
"wallClockMs": 29670
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
]
|
|
298
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ReportManifest } from "../types/report.js";
|
|
2
|
+
/**
|
|
3
|
+
* Generate a self-contained HTML report page from a report manifest.
|
|
4
|
+
* Reads the pre-built Astro template and injects the report data as JSON.
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateReportHtml(report: ReportManifest): string;
|
|
7
|
+
//# sourceMappingURL=html.d.ts.map
|