agentv 4.0.0 → 4.1.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.
@@ -24,7 +24,7 @@ import {
24
24
  validateFileReferences,
25
25
  validateTargetsFile,
26
26
  writeArtifactsFromResults
27
- } from "./chunk-OT2J474N.js";
27
+ } from "./chunk-4Z326WWF.js";
28
28
  import {
29
29
  DEFAULT_CATEGORY,
30
30
  createBuiltinRegistry,
@@ -43,7 +43,7 @@ import {
43
43
  toSnakeCaseDeep as toSnakeCaseDeep2,
44
44
  transpileEvalYamlFile,
45
45
  trimBaselineResult
46
- } from "./chunk-OXBBWZOY.js";
46
+ } from "./chunk-XEAW7OQT.js";
47
47
  import {
48
48
  __commonJS,
49
49
  __esm,
@@ -4217,7 +4217,7 @@ var evalRunCommand = command({
4217
4217
  },
4218
4218
  handler: async (args) => {
4219
4219
  if (args.evalPaths.length === 0 && process.stdin.isTTY) {
4220
- const { launchInteractiveWizard } = await import("./interactive-D5UTP72M.js");
4220
+ const { launchInteractiveWizard } = await import("./interactive-7ZYS6IOC.js");
4221
4221
  await launchInteractiveWizard();
4222
4222
  return;
4223
4223
  }
@@ -4972,9 +4972,14 @@ var evalRunCommand2 = command({
4972
4972
  type: optional(string),
4973
4973
  long: "experiment",
4974
4974
  description: "Experiment label (e.g. with_skills, without_skills)"
4975
+ }),
4976
+ graderType: option({
4977
+ type: optional(oneOf(["code", "none"])),
4978
+ long: "grader-type",
4979
+ description: 'Which grading phase to run: "code" runs code-graders inline, omit to skip grading (use pipeline grade separately)'
4975
4980
  })
4976
4981
  },
4977
- handler: async ({ evalPath, out, workers, experiment }) => {
4982
+ handler: async ({ evalPath, out, workers, experiment, graderType }) => {
4978
4983
  const resolvedEvalPath = resolve2(evalPath);
4979
4984
  const outDir = resolve2(out ?? buildDefaultRunDir(process.cwd()));
4980
4985
  const repoRoot = await findRepoRoot(dirname2(resolvedEvalPath));
@@ -5143,6 +5148,12 @@ var evalRunCommand2 = command({
5143
5148
  } else {
5144
5149
  console.log("Subagent-as-target mode \u2014 skipping CLI invocation.");
5145
5150
  }
5151
+ if (graderType !== "code") {
5152
+ console.log(`
5153
+ Done. Results in ${outDir}`);
5154
+ console.log("To run code graders: agentv pipeline grade <run-dir> (or re-run with --grader-type code)");
5155
+ return;
5156
+ }
5146
5157
  let totalGraders = 0;
5147
5158
  let totalPassed = 0;
5148
5159
  for (const testId of testIds) {
@@ -6261,15 +6272,16 @@ function writeFeedback(cwd, data) {
6261
6272
  function createApp(results, resultDir, cwd, sourceFile, options) {
6262
6273
  const searchDir = cwd ?? resultDir;
6263
6274
  const app2 = new Hono();
6264
- const studioDistPath = options?.studioDir === false ? void 0 : options?.studioDir ?? resolveStudioDistDir();
6275
+ const studioDistPath = options?.studioDir ?? resolveStudioDistDir();
6276
+ if (!studioDistPath || !existsSync7(path9.join(studioDistPath, "index.html"))) {
6277
+ throw new Error('Studio dist not found. Run "bun run build" in apps/studio/ to build the SPA.');
6278
+ }
6265
6279
  app2.get("/", (c3) => {
6266
- if (studioDistPath) {
6267
- const indexPath = path9.join(studioDistPath, "index.html");
6268
- if (existsSync7(indexPath)) {
6269
- return c3.html(readFileSync8(indexPath, "utf8"));
6270
- }
6280
+ const indexPath = path9.join(studioDistPath, "index.html");
6281
+ if (existsSync7(indexPath)) {
6282
+ return c3.html(readFileSync8(indexPath, "utf8"));
6271
6283
  }
6272
- return c3.html(generateServeHtml(results, sourceFile));
6284
+ return c3.notFound();
6273
6285
  });
6274
6286
  app2.get("/api/runs", (c3) => {
6275
6287
  const metas = listResultFiles(searchDir);
@@ -6684,44 +6696,42 @@ function createApp(results, resultDir, cwd, sourceFile, options) {
6684
6696
  }));
6685
6697
  return c3.json({ targets });
6686
6698
  });
6687
- if (studioDistPath) {
6688
- app2.get("/assets/*", (c3) => {
6689
- const assetPath = c3.req.path;
6690
- const filePath = path9.join(studioDistPath, assetPath);
6691
- if (!existsSync7(filePath)) {
6692
- return c3.notFound();
6693
- }
6694
- const content = readFileSync8(filePath);
6695
- const ext = path9.extname(filePath);
6696
- const mimeTypes = {
6697
- ".js": "application/javascript",
6698
- ".css": "text/css",
6699
- ".html": "text/html",
6700
- ".json": "application/json",
6701
- ".svg": "image/svg+xml",
6702
- ".png": "image/png",
6703
- ".woff2": "font/woff2",
6704
- ".woff": "font/woff"
6705
- };
6706
- const contentType = mimeTypes[ext] ?? "application/octet-stream";
6707
- return new Response(content, {
6708
- headers: {
6709
- "Content-Type": contentType,
6710
- "Cache-Control": "public, max-age=31536000, immutable"
6711
- }
6712
- });
6713
- });
6714
- app2.get("*", (c3) => {
6715
- if (c3.req.path.startsWith("/api/")) {
6716
- return c3.json({ error: "Not found" }, 404);
6717
- }
6718
- const indexPath = path9.join(studioDistPath, "index.html");
6719
- if (existsSync7(indexPath)) {
6720
- return c3.html(readFileSync8(indexPath, "utf8"));
6721
- }
6699
+ app2.get("/assets/*", (c3) => {
6700
+ const assetPath = c3.req.path;
6701
+ const filePath = path9.join(studioDistPath, assetPath);
6702
+ if (!existsSync7(filePath)) {
6722
6703
  return c3.notFound();
6704
+ }
6705
+ const content = readFileSync8(filePath);
6706
+ const ext = path9.extname(filePath);
6707
+ const mimeTypes = {
6708
+ ".js": "application/javascript",
6709
+ ".css": "text/css",
6710
+ ".html": "text/html",
6711
+ ".json": "application/json",
6712
+ ".svg": "image/svg+xml",
6713
+ ".png": "image/png",
6714
+ ".woff2": "font/woff2",
6715
+ ".woff": "font/woff"
6716
+ };
6717
+ const contentType = mimeTypes[ext] ?? "application/octet-stream";
6718
+ return new Response(content, {
6719
+ headers: {
6720
+ "Content-Type": contentType,
6721
+ "Cache-Control": "public, max-age=31536000, immutable"
6722
+ }
6723
6723
  });
6724
- }
6724
+ });
6725
+ app2.get("*", (c3) => {
6726
+ if (c3.req.path.startsWith("/api/")) {
6727
+ return c3.json({ error: "Not found" }, 404);
6728
+ }
6729
+ const indexPath = path9.join(studioDistPath, "index.html");
6730
+ if (existsSync7(indexPath)) {
6731
+ return c3.html(readFileSync8(indexPath, "utf8"));
6732
+ }
6733
+ return c3.notFound();
6734
+ });
6725
6735
  return app2;
6726
6736
  }
6727
6737
  function resolveStudioDistDir() {
@@ -6755,675 +6765,6 @@ function stripHeavyFields(results) {
6755
6765
  };
6756
6766
  });
6757
6767
  }
6758
- function escapeHtml(s) {
6759
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
6760
- }
6761
- function generateServeHtml(results, sourceFile) {
6762
- const lightResults = stripHeavyFields(results);
6763
- const dataJson = JSON.stringify(lightResults).replace(/</g, "\\u003c").replace(/>/g, "\\u003e").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
6764
- return `<!DOCTYPE html>
6765
- <html lang="en">
6766
- <head>
6767
- <meta charset="utf-8">
6768
- <meta name="viewport" content="width=device-width, initial-scale=1">
6769
- <title>AgentV Results Review</title>
6770
- <style>
6771
- ${SERVE_STYLES}
6772
- </style>
6773
- </head>
6774
- <body>
6775
- <header class="header">
6776
- <div class="header-left">
6777
- <h1 class="header-title">AgentV</h1>
6778
- <span class="header-subtitle">Results Review</span>
6779
- </div>
6780
- <div class="header-center">
6781
- <select id="run-picker" class="run-picker" title="Switch result file">
6782
- <option value="">Loading runs...</option>
6783
- </select>
6784
- </div>
6785
- <div class="header-right">
6786
- <span class="timestamp">${escapeHtml((/* @__PURE__ */ new Date()).toISOString())}</span>
6787
- </div>
6788
- </header>
6789
- <nav class="tabs" id="tabs">
6790
- <button class="tab active" data-tab="overview">Overview</button>
6791
- <button class="tab" data-tab="tests">Test Cases</button>
6792
- </nav>
6793
- <main id="app"></main>
6794
- <script>
6795
- var DATA = ${dataJson};
6796
- var INITIAL_SOURCE = ${sourceFile ? JSON.stringify(path9.basename(sourceFile)).replace(/</g, "\\u003c").replace(/>/g, "\\u003e") : "null"};
6797
- ${SERVE_SCRIPT}
6798
- </script>
6799
- </body>
6800
- </html>`;
6801
- }
6802
- var SERVE_STYLES = `
6803
- *{margin:0;padding:0;box-sizing:border-box}
6804
- :root{
6805
- --bg:#f6f8fa;--surface:#fff;--border:#d0d7de;--border-light:#e8ebee;
6806
- --text:#1f2328;--text-muted:#656d76;
6807
- --primary:#0969da;--primary-bg:#ddf4ff;
6808
- --success:#1a7f37;--success-bg:#dafbe1;
6809
- --danger:#cf222e;--danger-bg:#ffebe9;
6810
- --warning:#9a6700;--warning-bg:#fff8c5;
6811
- --radius:6px;
6812
- --shadow:0 1px 3px rgba(31,35,40,.04),0 1px 2px rgba(31,35,40,.06);
6813
- --font:-apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif;
6814
- --mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;
6815
- }
6816
- body{font-family:var(--font);background:var(--bg);color:var(--text);line-height:1.5;font-size:14px}
6817
-
6818
- /* Header */
6819
- .header{background:var(--surface);border-bottom:1px solid var(--border);padding:12px 24px;display:flex;align-items:center;justify-content:space-between}
6820
- .header-left{display:flex;align-items:baseline;gap:12px}
6821
- .header-title{font-size:18px;font-weight:600}
6822
- .header-subtitle{font-size:14px;color:var(--text-muted)}
6823
- .header-center{flex:1;display:flex;justify-content:center;padding:0 16px}
6824
- .run-picker{padding:6px 10px;border:1px solid var(--border);border-radius:var(--radius);font-size:13px;background:var(--surface);color:var(--text);font-family:var(--font);max-width:400px;width:100%;cursor:pointer}
6825
- .run-picker:hover{border-color:var(--primary)}
6826
- .run-picker:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-bg)}
6827
- .timestamp{font-size:12px;color:var(--text-muted);font-family:var(--mono)}
6828
-
6829
- /* Tabs */
6830
- .tabs{background:var(--surface);border-bottom:1px solid var(--border);padding:0 24px;display:flex}
6831
- .tab{background:none;border:none;padding:10px 16px;font-size:14px;color:var(--text-muted);cursor:pointer;border-bottom:2px solid transparent;font-family:var(--font);transition:color .15s,border-color .15s}
6832
- .tab:hover{color:var(--text)}
6833
- .tab.active{color:var(--text);font-weight:600;border-bottom-color:var(--primary)}
6834
-
6835
- #app{max-width:1280px;margin:0 auto;padding:24px}
6836
-
6837
- /* Stat cards */
6838
- .stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:24px}
6839
- .stat-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:16px;text-align:center;box-shadow:var(--shadow)}
6840
- .stat-card.pass .stat-value{color:var(--success)}
6841
- .stat-card.fail .stat-value{color:var(--danger)}
6842
- .stat-card.error .stat-value{color:var(--danger)}
6843
- .stat-card.warn .stat-value{color:var(--warning)}
6844
- .stat-card.total .stat-value{color:var(--primary)}
6845
- .stat-value{font-size:28px;font-weight:700;line-height:1.2}
6846
- .stat-label{font-size:12px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;margin-top:4px}
6847
-
6848
- /* Sections */
6849
- .section{margin-bottom:24px}
6850
- .section-title{font-size:16px;font-weight:600;margin-bottom:12px}
6851
-
6852
- /* Tables */
6853
- .table-wrap{overflow-x:auto;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow)}
6854
- .data-table{width:100%;border-collapse:collapse;font-size:13px}
6855
- .data-table th{background:var(--bg);border-bottom:1px solid var(--border);padding:8px 12px;text-align:left;font-weight:600;font-size:12px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.3px;white-space:nowrap}
6856
- .data-table th.sortable{cursor:pointer;user-select:none}
6857
- .data-table th.sortable:hover{color:var(--text)}
6858
- .data-table td{padding:8px 12px;border-bottom:1px solid var(--border-light);vertical-align:middle}
6859
- .data-table tbody tr:last-child td{border-bottom:none}
6860
-
6861
- /* Status icons */
6862
- .status-icon{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;font-size:12px;font-weight:700}
6863
- .status-icon.pass{background:var(--success-bg);color:var(--success)}
6864
- .status-icon.fail{background:var(--danger-bg);color:var(--danger)}
6865
- .status-icon.error{background:var(--warning-bg);color:var(--warning)}
6866
-
6867
- /* Score colors */
6868
- .score-high{color:var(--success);font-weight:600}
6869
- .score-mid{color:var(--warning);font-weight:600}
6870
- .score-low{color:var(--danger);font-weight:600}
6871
-
6872
- /* Pass-rate bar */
6873
- .bar-bg{width:100px;height:8px;background:var(--border-light);border-radius:4px;overflow:hidden}
6874
- .bar-fill{height:100%;border-radius:4px;transition:width .3s}
6875
- .bar-fill.score-high{background:var(--success)}
6876
- .bar-fill.score-mid{background:var(--warning)}
6877
- .bar-fill.score-low{background:var(--danger)}
6878
-
6879
- /* Histogram */
6880
- .histogram{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:16px;box-shadow:var(--shadow)}
6881
- .hist-row{display:flex;align-items:center;gap:12px;margin-bottom:8px}
6882
- .hist-row:last-child{margin-bottom:0}
6883
- .hist-label{width:60px;font-size:12px;color:var(--text-muted);text-align:right;flex-shrink:0}
6884
- .hist-bar-bg{flex:1;height:20px;background:var(--border-light);border-radius:3px;overflow:hidden}
6885
- .hist-bar{height:100%;border-radius:3px;transition:width .3s}
6886
- .hist-count{width:30px;font-size:12px;color:var(--text-muted);text-align:right;flex-shrink:0}
6887
-
6888
- /* Filters */
6889
- .filter-bar{display:flex;gap:8px;margin-bottom:16px;align-items:center;flex-wrap:wrap}
6890
- .filter-select,.filter-search{padding:6px 10px;border:1px solid var(--border);border-radius:var(--radius);font-size:13px;background:var(--surface);color:var(--text);font-family:var(--font)}
6891
- .filter-search{flex:1;min-width:200px}
6892
- .filter-count{font-size:12px;color:var(--text-muted);margin-left:auto}
6893
-
6894
- /* Test rows */
6895
- .test-row{cursor:pointer;transition:background .1s}
6896
- .test-row:hover{background:var(--bg)!important}
6897
- .test-row.expanded{background:var(--primary-bg)!important}
6898
- .expand-col{width:32px;text-align:center}
6899
- .expand-icon{color:var(--text-muted);font-size:12px}
6900
- .fw-medium{font-weight:500}
6901
- .text-pass{color:var(--success)}.text-fail{color:var(--danger)}.text-error{color:var(--warning)}
6902
-
6903
- /* Detail panel */
6904
- .detail-row td{padding:0!important;background:var(--bg)!important}
6905
- .detail-panel{padding:16px 24px}
6906
- .detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px}
6907
- .detail-block h4{font-size:12px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.3px;margin-bottom:6px}
6908
- .detail-pre{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:12px;font-family:var(--mono);font-size:12px;white-space:pre-wrap;word-break:break-word;max-height:300px;overflow-y:auto;line-height:1.6}
6909
- .detail-panel h4{font-size:13px;font-weight:600;margin:16px 0 8px}
6910
- .eval-table{width:100%;border-collapse:collapse;font-size:13px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);margin-bottom:12px}
6911
- .eval-table th{background:var(--bg);padding:6px 10px;text-align:left;font-size:11px;font-weight:600;color:var(--text-muted);text-transform:uppercase;border-bottom:1px solid var(--border)}
6912
- .eval-table td{padding:8px 10px;border-bottom:1px solid var(--border-light)}
6913
- .reasoning-cell{max-width:500px;font-size:12px;color:var(--text-muted)}
6914
- .expect-list{list-style:none;padding:0;margin-bottom:12px}
6915
- .expect-list li{padding:4px 8px 4px 24px;position:relative;font-size:13px}
6916
- .expect-list.pass li::before{content:"\\2713";position:absolute;left:4px;color:var(--success);font-weight:700}
6917
- .expect-list.fail li::before{content:"\\2717";position:absolute;left:4px;color:var(--danger);font-weight:700}
6918
- .error-box{background:var(--danger-bg);border:1px solid var(--danger);border-radius:var(--radius);padding:12px;margin-bottom:12px}
6919
- .error-box h4{color:var(--danger);margin:0 0 6px}
6920
- .error-box pre{font-family:var(--mono);font-size:12px;white-space:pre-wrap;word-break:break-word}
6921
- .detail-meta{font-size:12px;color:var(--text-muted);margin-top:12px;padding-top:12px;border-top:1px solid var(--border-light)}
6922
- .tool-calls{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:12px}
6923
- .tool-tag{display:inline-block;padding:2px 10px;font-size:12px;font-family:var(--mono);background:var(--primary-bg);color:var(--primary);border:1px solid var(--border);border-radius:12px}
6924
- .empty-state{text-align:center;padding:48px 24px;color:var(--text-muted)}
6925
- .empty-state h3{font-size:16px;margin-bottom:8px;color:var(--text)}
6926
- .welcome-state{text-align:center;padding:80px 24px;color:var(--text-muted)}
6927
- .welcome-state h2{font-size:24px;margin-bottom:12px;color:var(--text);font-weight:600}
6928
- .welcome-state p{font-size:15px;margin-bottom:8px;max-width:500px;margin-left:auto;margin-right:auto}
6929
- .welcome-state code{font-family:var(--mono);background:var(--surface);border:1px solid var(--border);border-radius:3px;padding:2px 6px;font-size:13px}
6930
- .welcome-state .hint{margin-top:24px;font-size:13px;color:var(--text-muted)}
6931
-
6932
- /* Feedback */
6933
- .feedback-section{margin-top:16px;padding-top:16px;border-top:1px solid var(--border-light)}
6934
- .feedback-input{width:100%;min-height:80px;padding:8px 12px;border:1px solid var(--border);border-radius:var(--radius);font-family:var(--font);font-size:13px;resize:vertical;background:var(--surface);color:var(--text)}
6935
- .feedback-input:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-bg)}
6936
- .feedback-submit{margin-top:8px;padding:6px 16px;background:var(--primary);color:#fff;border:none;border-radius:var(--radius);font-size:13px;cursor:pointer;font-family:var(--font)}
6937
- .feedback-submit:hover{opacity:.9}
6938
- .feedback-submit:disabled{opacity:.5;cursor:default}
6939
- .feedback-status{margin-left:8px;font-size:12px;color:var(--success)}
6940
- `;
6941
- var SERVE_SCRIPT = `
6942
- (function(){
6943
- /* ---- helpers ---- */
6944
- function esc(s){
6945
- if(s==null)return"";
6946
- return String(s).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;");
6947
- }
6948
- function getStatus(r){
6949
- if(r.executionStatus==="execution_error")return"error";
6950
- if(r.executionStatus==="quality_failure")return"fail";
6951
- if(r.executionStatus==="ok")return"pass";
6952
- if(r.error)return"error";
6953
- return r.score>=0.5?"pass":"fail";
6954
- }
6955
- function sIcon(s){
6956
- if(s==="pass")return'<span class="status-icon pass">\\u2713</span>';
6957
- if(s==="fail")return'<span class="status-icon fail">\\u2717</span>';
6958
- return'<span class="status-icon error">!</span>';
6959
- }
6960
- function fmtDur(ms){
6961
- if(ms==null)return"\\u2014";
6962
- if(ms<1000)return ms+"ms";
6963
- if(ms<60000)return(ms/1000).toFixed(1)+"s";
6964
- return Math.floor(ms/60000)+"m "+Math.round((ms%60000)/1000)+"s";
6965
- }
6966
- function fmtTok(n){
6967
- if(n==null)return"\\u2014";
6968
- if(n>=1e6)return(n/1e6).toFixed(1)+"M";
6969
- if(n>=1e3)return(n/1e3).toFixed(1)+"K";
6970
- return String(n);
6971
- }
6972
- function fmtCost(u){if(u==null)return"\\u2014";if(u<0.01)return"<$0.01";return"$"+u.toFixed(2);}
6973
- function fmtPct(v){if(v==null)return"\\u2014";return(v*100).toFixed(1)+"%";}
6974
- function sCls(v){if(v==null)return"";if(v>=0.9)return"score-high";if(v>=0.5)return"score-mid";return"score-low";}
6975
-
6976
- /* ---- feedback state ---- */
6977
- var feedbackCache={};
6978
-
6979
- function loadFeedback(){
6980
- fetch("/api/feedback").then(function(r){return r.json();}).then(function(d){
6981
- if(d&&d.reviews){
6982
- for(var i=0;i<d.reviews.length;i++){
6983
- feedbackCache[d.reviews[i].test_id]=d.reviews[i].comment;
6984
- }
6985
- populateFeedbackTextareas();
6986
- }
6987
- }).catch(function(){});
6988
- }
6989
-
6990
- function populateFeedbackTextareas(){
6991
- var areas=document.querySelectorAll(".feedback-input");
6992
- for(var i=0;i<areas.length;i++){
6993
- var tid=areas[i].getAttribute("data-test-id");
6994
- if(tid&&feedbackCache[tid]!=null){
6995
- areas[i].value=feedbackCache[tid];
6996
- }
6997
- }
6998
- }
6999
-
7000
- function saveFeedback(testId,comment,statusEl,btn){
7001
- btn.disabled=true;
7002
- statusEl.textContent="Saving...";
7003
- statusEl.style.color="var(--text-muted)";
7004
- fetch("/api/feedback",{
7005
- method:"POST",
7006
- headers:{"Content-Type":"application/json"},
7007
- body:JSON.stringify({reviews:[{test_id:testId,comment:comment}]})
7008
- }).then(function(r){return r.json();}).then(function(){
7009
- feedbackCache[testId]=comment;
7010
- statusEl.textContent="Saved";
7011
- statusEl.style.color="var(--success)";
7012
- btn.disabled=false;
7013
- setTimeout(function(){statusEl.textContent="";},2000);
7014
- }).catch(function(){
7015
- statusEl.textContent="Error saving";
7016
- statusEl.style.color="var(--danger)";
7017
- btn.disabled=false;
7018
- });
7019
- }
7020
-
7021
- /* ---- compute stats ---- */
7022
- function computeStats(d){
7023
- var t=d.length,p=0,f=0,e=0,dur=0,ti=0,to=0,cost=0,sc=[],tc=0;
7024
- for(var i=0;i<d.length;i++){
7025
- var r=d[i],s=getStatus(r);
7026
- if(s==="pass")p++;else if(s==="fail")f++;else e++;
7027
- if(r.durationMs)dur+=r.durationMs;
7028
- if(r.tokenUsage){ti+=(r.tokenUsage.input||0);to+=(r.tokenUsage.output||0);}
7029
- if(r.costUsd)cost+=r.costUsd;
7030
- if(s!=="error")sc.push(r.score);
7031
- if(r._toolCalls){for(var k in r._toolCalls)tc+=r._toolCalls[k];}
7032
- }
7033
- var g=t-e;
7034
- return{total:t,passed:p,failed:f,errors:e,passRate:g>0?p/g:0,dur:dur,tokens:ti+to,inTok:ti,outTok:to,cost:cost,scores:sc,toolCalls:tc};
7035
- }
7036
- function computeTargets(d){
7037
- var m={};
7038
- for(var i=0;i<d.length;i++){
7039
- var r=d[i],tgt=r.target||"unknown";
7040
- if(!m[tgt])m[tgt]={target:tgt,results:[],p:0,f:0,e:0,ts:0,sc:0,dur:0,tok:0,cost:0};
7041
- var o=m[tgt];o.results.push(r);
7042
- var s=getStatus(r);
7043
- if(s==="pass")o.p++;else if(s==="fail")o.f++;else o.e++;
7044
- if(s!=="error"){o.ts+=r.score;o.sc++;}
7045
- if(r.durationMs)o.dur+=r.durationMs;
7046
- if(r.tokenUsage)o.tok+=(r.tokenUsage.input||0)+(r.tokenUsage.output||0);
7047
- if(r.costUsd)o.cost+=r.costUsd;
7048
- }
7049
- var a=[];for(var k in m)a.push(m[k]);return a;
7050
- }
7051
- function getEvalNames(){
7052
- var n={};
7053
- for(var i=0;i<DATA.length;i++){
7054
- var sc=DATA[i].scores;
7055
- if(sc)for(var j=0;j<sc.length;j++)n[sc[j].name]=true;
7056
- }
7057
- return Object.keys(n);
7058
- }
7059
- function getEvalScore(r,name){
7060
- if(!r.scores)return null;
7061
- for(var i=0;i<r.scores.length;i++)if(r.scores[i].name===name)return r.scores[i].score;
7062
- return null;
7063
- }
7064
-
7065
- var stats=computeStats(DATA);
7066
- var tgtStats=computeTargets(DATA);
7067
- var tgtNames=tgtStats.map(function(t){return t.target;});
7068
-
7069
- /* ---- state ---- */
7070
- var state={tab:"overview",filter:{status:"all",target:"all",search:""},sort:{col:"testId",dir:"asc"},expanded:{}};
7071
-
7072
- /* ---- DOM refs ---- */
7073
- var app=document.getElementById("app");
7074
- var tabBtns=document.querySelectorAll(".tab");
7075
-
7076
- /* ---- tabs ---- */
7077
- function setTab(t){
7078
- state.tab=t;
7079
- for(var i=0;i<tabBtns.length;i++)tabBtns[i].classList.toggle("active",tabBtns[i].getAttribute("data-tab")===t);
7080
- render();
7081
- }
7082
- for(var i=0;i<tabBtns.length;i++){
7083
- tabBtns[i].addEventListener("click",(function(b){return function(){setTab(b.getAttribute("data-tab"));};})(tabBtns[i]));
7084
- }
7085
-
7086
- /* ---- render ---- */
7087
- function render(){
7088
- if(DATA.length===0){
7089
- app.innerHTML='<div class="welcome-state">'
7090
- +'<h2>No results yet</h2>'
7091
- +'<p>Run an evaluation or mount a results directory to see results here.</p>'
7092
- +'<p><code>agentv eval &lt;eval-file&gt;</code></p>'
7093
- +'<p class="hint">The dashboard will automatically detect new result files.</p>'
7094
- +'</div>';
7095
- return;
7096
- }
7097
- if(state.tab==="overview")renderOverview();else renderTests();
7098
- }
7099
-
7100
- /* ---- stat card helper ---- */
7101
- function card(label,value,type){
7102
- return'<div class="stat-card '+type+'"><div class="stat-value">'+value+'</div><div class="stat-label">'+label+"</div></div>";
7103
- }
7104
-
7105
- /* ---- overview ---- */
7106
- function renderOverview(){
7107
- var h='<div class="stats-grid">';
7108
- h+=card("Total Tests",stats.total,"total");
7109
- h+=card("Passed",stats.passed,"pass");
7110
- h+=card("Failed",stats.failed,"fail");
7111
- h+=card("Errors",stats.errors,"error");
7112
- var prCls=stats.passRate>=0.9?"pass":stats.passRate>=0.5?"warn":"fail";
7113
- h+=card("Pass Rate",fmtPct(stats.passRate),prCls);
7114
- h+=card("Duration",fmtDur(stats.dur),"neutral");
7115
- h+=card("Tokens",fmtTok(stats.tokens),"neutral");
7116
- h+=card("Est. Cost",fmtCost(stats.cost),"neutral");
7117
- if(stats.toolCalls>0)h+=card("Tool Calls",fmtTok(stats.toolCalls),"neutral");
7118
- h+="</div>";
7119
-
7120
- /* targets table */
7121
- if(tgtStats.length>1){
7122
- h+='<div class="section"><h2 class="section-title">Targets</h2><div class="table-wrap"><table class="data-table">';
7123
- h+="<thead><tr><th>Target</th><th>Pass Rate</th><th></th><th>Passed</th><th>Failed</th><th>Errors</th><th>Avg Score</th><th>Duration</th><th>Tokens</th><th>Cost</th></tr></thead><tbody>";
7124
- for(var i=0;i<tgtStats.length;i++){
7125
- var t=tgtStats[i],g=t.p+t.f,pr=g>0?t.p/g:0,avg=t.sc>0?t.ts/t.sc:0;
7126
- h+="<tr><td class=\\"fw-medium\\">"+esc(t.target)+"</td><td>"+fmtPct(pr)+'</td><td><div class="bar-bg"><div class="bar-fill '+sCls(pr)+'" style="width:'+(pr*100)+'%"></div></div></td>';
7127
- h+='<td class="text-pass">'+t.p+'</td><td class="text-fail">'+t.f+'</td><td class="text-error">'+t.e+"</td>";
7128
- h+='<td class="'+sCls(avg)+'">'+fmtPct(avg)+"</td><td>"+fmtDur(t.dur)+"</td><td>"+fmtTok(t.tok)+"</td><td>"+fmtCost(t.cost)+"</td></tr>";
7129
- }
7130
- h+="</tbody></table></div></div>";
7131
- }
7132
-
7133
- /* histogram */
7134
- if(stats.scores.length>0){
7135
- var bk=[0,0,0,0,0];
7136
- for(var i=0;i<stats.scores.length;i++){var idx=Math.min(Math.floor(stats.scores[i]*5),4);bk[idx]++;}
7137
- var mx=Math.max.apply(null,bk);
7138
- var lb=["0\\u201320%","20\\u201340%","40\\u201360%","60\\u201380%","80\\u2013100%"];
7139
- h+='<div class="section"><h2 class="section-title">Score Distribution</h2><div class="histogram">';
7140
- for(var i=0;i<bk.length;i++){
7141
- var pct=mx>0?(bk[i]/mx*100):0;
7142
- h+='<div class="hist-row"><span class="hist-label">'+lb[i]+'</span><div class="hist-bar-bg"><div class="hist-bar '+(i>=4?"score-high":i>=2?"score-mid":"score-low")+'" style="width:'+pct+'%"></div></div><span class="hist-count">'+bk[i]+"</span></div>";
7143
- }
7144
- h+="</div></div>";
7145
- }
7146
- app.innerHTML=h;
7147
- }
7148
-
7149
- /* ---- test cases ---- */
7150
- function renderTests(){
7151
- var evalNames=getEvalNames();
7152
- var h='<div class="filter-bar">';
7153
- h+='<select id="flt-status" class="filter-select"><option value="all">All Status</option><option value="pass">Passed</option><option value="fail">Failed</option><option value="error">Errors</option></select>';
7154
- if(tgtNames.length>1){
7155
- h+='<select id="flt-target" class="filter-select"><option value="all">All Targets</option>';
7156
- for(var i=0;i<tgtNames.length;i++)h+='<option value="'+esc(tgtNames[i])+'">'+esc(tgtNames[i])+"</option>";
7157
- h+="</select>";
7158
- }
7159
- h+='<input type="text" id="flt-search" class="filter-search" placeholder="Search tests..." value="'+esc(state.filter.search)+'">';
7160
- h+='<span class="filter-count" id="flt-count"></span></div>';
7161
-
7162
- h+='<div class="table-wrap"><table class="data-table" id="test-tbl"><thead><tr>';
7163
- h+='<th class="expand-col"></th>';
7164
- h+=sHdr("Status","status");
7165
- h+=sHdr("Test ID","testId");
7166
- if(tgtNames.length>1)h+=sHdr("Target","target");
7167
- h+=sHdr("Score","score");
7168
- for(var i=0;i<evalNames.length;i++)h+="<th>"+esc(evalNames[i])+"</th>";
7169
- h+=sHdr("Duration","durationMs");
7170
- h+=sHdr("Cost","costUsd");
7171
- h+="</tr></thead><tbody id=\\"test-body\\"></tbody></table></div>";
7172
- app.innerHTML=h;
7173
-
7174
- /* wire events */
7175
- var selS=document.getElementById("flt-status");
7176
- selS.value=state.filter.status;
7177
- selS.addEventListener("change",function(e){state.filter.status=e.target.value;renderRows();});
7178
- var selT=document.getElementById("flt-target");
7179
- if(selT){selT.value=state.filter.target;selT.addEventListener("change",function(e){state.filter.target=e.target.value;renderRows();});}
7180
- document.getElementById("flt-search").addEventListener("input",function(e){state.filter.search=e.target.value;renderRows();});
7181
- var ths=document.querySelectorAll("th[data-sort]");
7182
- for(var i=0;i<ths.length;i++){
7183
- ths[i].addEventListener("click",(function(th){return function(){
7184
- var c=th.getAttribute("data-sort");
7185
- if(state.sort.col===c)state.sort.dir=state.sort.dir==="asc"?"desc":"asc";
7186
- else{state.sort.col=c;state.sort.dir="asc";}
7187
- renderTests();
7188
- };})(ths[i]));
7189
- }
7190
- renderRows();
7191
- }
7192
-
7193
- function sHdr(label,col){
7194
- var arrow="";
7195
- if(state.sort.col===col)arrow=state.sort.dir==="asc"?" \\u2191":" \\u2193";
7196
- return'<th class="sortable" data-sort="'+col+'">'+label+arrow+"</th>";
7197
- }
7198
-
7199
- function filtered(){
7200
- var out=[];
7201
- for(var i=0;i<DATA.length;i++){
7202
- var r=DATA[i],s=getStatus(r);
7203
- if(state.filter.status!=="all"&&s!==state.filter.status)continue;
7204
- if(state.filter.target!=="all"&&r.target!==state.filter.target)continue;
7205
- if(state.filter.search&&(r.testId||"").toLowerCase().indexOf(state.filter.search.toLowerCase())===-1)continue;
7206
- out.push(r);
7207
- }
7208
- var col=state.sort.col,dir=state.sort.dir==="asc"?1:-1;
7209
- out.sort(function(a,b){
7210
- var va=col==="status"?getStatus(a):a[col],vb=col==="status"?getStatus(b):b[col];
7211
- if(va==null&&vb==null)return 0;if(va==null)return 1;if(vb==null)return-1;
7212
- if(typeof va==="string")return va.localeCompare(vb)*dir;
7213
- return(va-vb)*dir;
7214
- });
7215
- return out;
7216
- }
7217
-
7218
- function renderRows(){
7219
- var rows=filtered(),evalNames=getEvalNames();
7220
- var tbody=document.getElementById("test-body");
7221
- var colSpan=5+evalNames.length+(tgtNames.length>1?1:0);
7222
- document.getElementById("flt-count").textContent=rows.length+" of "+DATA.length+" tests";
7223
- var h="";
7224
- for(var i=0;i<rows.length;i++){
7225
- var r=rows[i],s=getStatus(r),key=r.testId+":"+r.target,exp=!!state.expanded[key];
7226
- h+='<tr class="test-row '+s+(exp?" expanded":"")+'" data-key="'+esc(key)+'" data-test-id="'+esc(r.testId)+'">';
7227
- h+='<td class="expand-col"><span class="expand-icon">'+(exp?"\\u25BE":"\\u25B8")+"</span></td>";
7228
- h+="<td>"+sIcon(s)+"</td>";
7229
- h+='<td class="fw-medium">'+esc(r.testId)+"</td>";
7230
- if(tgtNames.length>1)h+="<td>"+esc(r.target)+"</td>";
7231
- h+='<td class="'+sCls(r.score)+'">'+fmtPct(r.score)+"</td>";
7232
- for(var j=0;j<evalNames.length;j++){
7233
- var es=getEvalScore(r,evalNames[j]);
7234
- h+='<td class="'+sCls(es)+'">'+(es!=null?fmtPct(es):"\\u2014")+"</td>";
7235
- }
7236
- h+="<td>"+fmtDur(r.durationMs)+"</td><td>"+fmtCost(r.costUsd)+"</td></tr>";
7237
- if(exp)h+='<tr class="detail-row"><td colspan="'+colSpan+'">'+renderDetail(r)+"</td></tr>";
7238
- }
7239
- if(rows.length===0)h+='<tr><td colspan="'+colSpan+'" class="empty-state">No matching tests</td></tr>';
7240
- tbody.innerHTML=h;
7241
-
7242
- /* row click */
7243
- var trs=tbody.querySelectorAll(".test-row");
7244
- for(var k=0;k<trs.length;k++){
7245
- trs[k].addEventListener("click",(function(tr){return function(){
7246
- var key=tr.getAttribute("data-key");
7247
- state.expanded[key]=!state.expanded[key];
7248
- renderRows();
7249
- };})(trs[k]));
7250
- }
7251
-
7252
- /* wire feedback buttons */
7253
- var btns=tbody.querySelectorAll(".feedback-submit");
7254
- for(var k=0;k<btns.length;k++){
7255
- btns[k].addEventListener("click",(function(btn){return function(ev){
7256
- ev.stopPropagation();
7257
- var tid=btn.getAttribute("data-test-id");
7258
- var sec=btn.closest(".feedback-section");
7259
- var ta=sec.querySelector(".feedback-input");
7260
- var st=sec.querySelector(".feedback-status");
7261
- saveFeedback(tid,ta.value,st,btn);
7262
- };})(btns[k]));
7263
- }
7264
-
7265
- /* prevent textarea clicks from toggling row */
7266
- var tas=tbody.querySelectorAll(".feedback-input");
7267
- for(var k=0;k<tas.length;k++){
7268
- tas[k].addEventListener("click",function(ev){ev.stopPropagation();});
7269
- }
7270
-
7271
- populateFeedbackTextareas();
7272
- }
7273
-
7274
- /* ---- detail panel ---- */
7275
- function renderDetail(r){
7276
- var h='<div class="detail-panel">';
7277
-
7278
- /* input / output */
7279
- h+='<div class="detail-grid">';
7280
- if(r.input!=null){
7281
- h+='<div class="detail-block"><h4>Input</h4><pre class="detail-pre">'+esc(JSON.stringify(r.input,null,2))+"</pre></div>";
7282
- }
7283
- h+='<div class="detail-block"><h4>Output</h4><pre class="detail-pre">'+esc(r.output?JSON.stringify(r.output,null,2):"")+"</pre></div>";
7284
- h+="</div>";
7285
-
7286
- /* evaluator results */
7287
- if(r.scores&&r.scores.length>0){
7288
- h+="<h4>Evaluator Results</h4>";
7289
- h+='<table class="eval-table"><thead><tr><th>Evaluator</th><th>Score</th><th>Status</th><th>Assertions</th></tr></thead><tbody>';
7290
- for(var i=0;i<r.scores.length;i++){
7291
- var ev=r.scores[i],evS=ev.score>=0.5?"pass":"fail";
7292
- var evAssertions=ev.assertions||[];
7293
- var evSummary=evAssertions.map(function(a){return (a.passed?"\\u2713 ":"\\u2717 ")+a.text;}).join("; ");
7294
- h+="<tr><td class=\\"fw-medium\\">"+esc(ev.name)+'</td><td class="'+sCls(ev.score)+'">'+fmtPct(ev.score)+"</td><td>"+sIcon(evS)+'</td><td class="reasoning-cell">'+esc(evSummary)+"</td></tr>";
7295
- }
7296
- h+="</tbody></table>";
7297
- }
7298
-
7299
- /* assertions */
7300
- var passedA=r.assertions?r.assertions.filter(function(a){return a.passed;}):[];
7301
- var failedA=r.assertions?r.assertions.filter(function(a){return !a.passed;}):[];
7302
- if(passedA.length>0){
7303
- h+='<h4>Passed Assertions</h4><ul class="expect-list pass">';
7304
- for(var i=0;i<passedA.length;i++)h+="<li>"+esc(passedA[i].text)+(passedA[i].evidence?" <span class=\\"reasoning-cell\\">("+esc(passedA[i].evidence)+")</span>":"")+"</li>";
7305
- h+="</ul>";
7306
- }
7307
- if(failedA.length>0){
7308
- h+='<h4>Failed Assertions</h4><ul class="expect-list fail">';
7309
- for(var i=0;i<failedA.length;i++)h+="<li>"+esc(failedA[i].text)+(failedA[i].evidence?" <span class=\\"reasoning-cell\\">("+esc(failedA[i].evidence)+")</span>":"")+"</li>";
7310
- h+="</ul>";
7311
- }
7312
-
7313
- /* tool calls */
7314
- if(r._toolCalls){
7315
- var tc=r._toolCalls,tcArr=[];
7316
- for(var k in tc)tcArr.push({name:k,count:tc[k]});
7317
- tcArr.sort(function(a,b){return b.count-a.count;});
7318
- h+='<h4>Tool Calls</h4><div class="tool-calls">';
7319
- for(var i=0;i<tcArr.length;i++)h+='<span class="tool-tag">'+esc(tcArr[i].name)+": "+tcArr[i].count+"</span>";
7320
- h+="</div>";
7321
- }
7322
-
7323
- /* error */
7324
- if(r.error)h+='<div class="error-box"><h4>Error</h4><pre>'+esc(r.error)+"</pre></div>";
7325
-
7326
- /* metadata */
7327
- h+='<div class="detail-meta">';
7328
- var m=[];
7329
- if(r.tokenUsage)m.push(fmtTok(r.tokenUsage.input)+" in / "+fmtTok(r.tokenUsage.output)+" out tokens");
7330
- if(r.durationMs){
7331
- if(r._graderDurationMs>0){
7332
- var execMs=r.durationMs-r._graderDurationMs;
7333
- m.push(fmtDur(execMs>0?execMs:0)+" executor + "+fmtDur(r._graderDurationMs)+" grader");
7334
- }else{
7335
- m.push(fmtDur(r.durationMs));
7336
- }
7337
- }
7338
- if(r.target)m.push(r.target);
7339
- if(r.costUsd)m.push(fmtCost(r.costUsd));
7340
- if(r.timestamp)m.push(r.timestamp);
7341
- h+=esc(m.join(" \\u00B7 "));
7342
- h+="</div>";
7343
-
7344
- /* feedback section */
7345
- var tid=r.testId||"";
7346
- var existingComment=feedbackCache[tid]||"";
7347
- h+='<div class="feedback-section">';
7348
- h+='<h4>Feedback</h4>';
7349
- h+='<textarea class="feedback-input" data-test-id="'+esc(tid)+'" placeholder="Add feedback for this test..." onclick="event.stopPropagation()">'+esc(existingComment)+'</textarea>';
7350
- h+='<div style="display:flex;align-items:center">';
7351
- h+='<button class="feedback-submit" data-test-id="'+esc(tid)+'">Save Feedback</button>';
7352
- h+='<span class="feedback-status"></span>';
7353
- h+='</div></div>';
7354
-
7355
- h+="</div>";
7356
- return h;
7357
- }
7358
-
7359
- /* ---- run picker ---- */
7360
- var runPicker=document.getElementById("run-picker");
7361
- var knownRunFilenames=[];
7362
-
7363
- function refreshRunList(){
7364
- fetch("/api/runs").then(function(r){return r.json();}).then(function(d){
7365
- if(!d||!d.runs)return;
7366
- var runs=d.runs;
7367
- var newFilenames=runs.map(function(r){return r.filename;});
7368
-
7369
- /* Detect new runs that appeared since last poll */
7370
- if(knownRunFilenames.length>0){
7371
- var hasNew=newFilenames.some(function(f){return knownRunFilenames.indexOf(f)===-1;});
7372
- if(hasNew&&DATA.length===0){
7373
- /* Auto-load the first (most recent) run when starting from empty state */
7374
- loadRun(runs[0].filename);
7375
- }
7376
- }
7377
- knownRunFilenames=newFilenames;
7378
-
7379
- /* Rebuild picker options */
7380
- var h='<option value="">Select a result file...</option>';
7381
- if(runs.length===0){
7382
- h='<option value="">No result files</option>';
7383
- }
7384
- for(var i=0;i<runs.length;i++){
7385
- var r=runs[i];
7386
- var label=r.filename+" ("+r.test_count+" tests, "+(r.pass_rate*100).toFixed(0)+"% pass)";
7387
- h+='<option value="'+esc(r.filename)+'">'+esc(label)+"</option>";
7388
- }
7389
- runPicker.innerHTML=h;
7390
- /* Pre-select the initially loaded run */
7391
- if(INITIAL_SOURCE&&runs.length>0){
7392
- runPicker.value=INITIAL_SOURCE;
7393
- }
7394
- }).catch(function(err){console.warn("Failed to refresh run list:",err);});
7395
- }
7396
-
7397
- function loadRun(filename){
7398
- fetch("/api/runs/"+encodeURIComponent(filename)).then(function(r){return r.json();}).then(function(d){
7399
- if(d.error){console.error(d.error);return;}
7400
- DATA=d.results;
7401
- stats=computeStats(DATA);
7402
- tgtStats=computeTargets(DATA);
7403
- tgtNames=tgtStats.map(function(t){return t.target;});
7404
- state.expanded={};
7405
- feedbackCache={};
7406
- loadFeedback();
7407
- render();
7408
- /* Update picker selection */
7409
- runPicker.value=filename;
7410
- }).catch(function(err){console.error("Failed to load run:",err);});
7411
- }
7412
-
7413
- runPicker.addEventListener("change",function(){
7414
- var val=runPicker.value;
7415
- if(val)loadRun(val);
7416
- });
7417
-
7418
- /* Poll for new result files every 5 seconds */
7419
- refreshRunList();
7420
- setInterval(refreshRunList,5000);
7421
-
7422
- /* ---- init ---- */
7423
- loadFeedback();
7424
- render();
7425
- })();
7426
- `;
7427
6768
  var resultsServeCommand = command({
7428
6769
  name: "studio",
7429
6770
  description: "Start AgentV Studio \u2014 a local dashboard for reviewing evaluation results",
@@ -8952,8 +8293,6 @@ var app = subcommands({
8952
8293
  results: resultsCommand,
8953
8294
  self: selfCommand,
8954
8295
  studio: resultsServeCommand,
8955
- serve: resultsServeCommand,
8956
- // hidden alias for backward compatibility
8957
8296
  trace: traceCommand,
8958
8297
  transpile: transpileCommand,
8959
8298
  trim: trimCommand,
@@ -8971,7 +8310,6 @@ var TOP_LEVEL_COMMANDS = /* @__PURE__ */ new Set([
8971
8310
  "pipeline",
8972
8311
  "results",
8973
8312
  "self",
8974
- "serve",
8975
8313
  "studio",
8976
8314
  "trace",
8977
8315
  "transpile",
@@ -9019,4 +8357,4 @@ export {
9019
8357
  preprocessArgv,
9020
8358
  runCli
9021
8359
  };
9022
- //# sourceMappingURL=chunk-E3VSJJI4.js.map
8360
+ //# sourceMappingURL=chunk-2W5JKKXC.js.map