agentv 4.31.3 → 4.32.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +14 -0
  2. package/dist/{artifact-writer-FZ5RUHWC.js → artifact-writer-VDF7KRWL.js} +4 -4
  3. package/dist/{chunk-IJPWTVDU.js → chunk-2ZEY3WBH.js} +3 -3
  4. package/dist/{chunk-CO23UZAA.js → chunk-5JMFFG36.js} +13 -9
  5. package/dist/chunk-5JMFFG36.js.map +1 -0
  6. package/dist/{chunk-4POCDPC2.js → chunk-IGTRNQAM.js} +106 -63
  7. package/dist/chunk-IGTRNQAM.js.map +1 -0
  8. package/dist/{chunk-LOYPSIE7.js → chunk-LX5AK3P7.js} +22 -12
  9. package/dist/chunk-LX5AK3P7.js.map +1 -0
  10. package/dist/{chunk-377GONL7.js → chunk-TAZBCVEZ.js} +66 -62
  11. package/dist/chunk-TAZBCVEZ.js.map +1 -0
  12. package/dist/cli.js +5 -5
  13. package/dist/cli.js.map +1 -1
  14. package/dist/{studio/assets/index-sazn_aO8.js → dashboard/assets/index-BdoQWnyM.js} +1 -1
  15. package/dist/{studio/assets/index-CYUVGyMn.css → dashboard/assets/index-DcPH8PyS.css} +1 -1
  16. package/dist/dashboard/assets/index-EXkiwqam.js +116 -0
  17. package/dist/{studio → dashboard}/index.html +3 -3
  18. package/dist/{dist-CRYAFKLS.js → dist-GICSKMNP.js} +5 -3
  19. package/dist/index.js +9 -7
  20. package/dist/{interactive-QBLQNYDH.js → interactive-GIDBBDYZ.js} +5 -5
  21. package/dist/{ts-eval-loader-XR6DNOZ3-GA7B5N26.js → ts-eval-loader-Z6IUSDNA-YBOE4JIQ.js} +2 -2
  22. package/package.json +1 -1
  23. package/dist/chunk-377GONL7.js.map +0 -1
  24. package/dist/chunk-4POCDPC2.js.map +0 -1
  25. package/dist/chunk-CO23UZAA.js.map +0 -1
  26. package/dist/chunk-LOYPSIE7.js.map +0 -1
  27. package/dist/studio/assets/index-DBSSri9Q.js +0 -116
  28. /package/dist/{artifact-writer-FZ5RUHWC.js.map → artifact-writer-VDF7KRWL.js.map} +0 -0
  29. /package/dist/{chunk-IJPWTVDU.js.map → chunk-2ZEY3WBH.js.map} +0 -0
  30. /package/dist/{dist-CRYAFKLS.js.map → dist-GICSKMNP.js.map} +0 -0
  31. /package/dist/{interactive-QBLQNYDH.js.map → interactive-GIDBBDYZ.js.map} +0 -0
  32. /package/dist/{ts-eval-loader-XR6DNOZ3-GA7B5N26.js.map → ts-eval-loader-Z6IUSDNA-YBOE4JIQ.js.map} +0 -0
@@ -46,7 +46,7 @@ import {
46
46
  validateFileReferences,
47
47
  validateTargetsFile,
48
48
  validateWorkspacePaths
49
- } from "./chunk-CO23UZAA.js";
49
+ } from "./chunk-5JMFFG36.js";
50
50
  import {
51
51
  RESULT_INDEX_FILENAME,
52
52
  aggregateRunDir,
@@ -54,7 +54,7 @@ import {
54
54
  resolveRunManifestPath,
55
55
  toSnakeCaseDeep as toSnakeCaseDeep2,
56
56
  writeArtifactsFromResults
57
- } from "./chunk-IJPWTVDU.js";
57
+ } from "./chunk-2ZEY3WBH.js";
58
58
  import {
59
59
  DEFAULT_CATEGORY,
60
60
  addProject,
@@ -75,7 +75,7 @@ import {
75
75
  touchProject,
76
76
  transpileEvalYamlFile,
77
77
  trimBaselineResult
78
- } from "./chunk-LOYPSIE7.js";
78
+ } from "./chunk-LX5AK3P7.js";
79
79
  import {
80
80
  DEFAULT_THRESHOLD,
81
81
  createBuiltinRegistry,
@@ -105,7 +105,7 @@ import {
105
105
  runStartsWithAssertion,
106
106
  toCamelCaseDeep,
107
107
  toSnakeCaseDeep
108
- } from "./chunk-377GONL7.js";
108
+ } from "./chunk-TAZBCVEZ.js";
109
109
  import {
110
110
  __commonJS,
111
111
  __require,
@@ -4055,7 +4055,7 @@ var evalRunCommand = command({
4055
4055
  },
4056
4056
  handler: async (args) => {
4057
4057
  if (args.evalPaths.length === 0 && process.stdin.isTTY) {
4058
- const { launchInteractiveWizard } = await import("./interactive-QBLQNYDH.js");
4058
+ const { launchInteractiveWizard } = await import("./interactive-GIDBBDYZ.js");
4059
4059
  await launchInteractiveWizard();
4060
4060
  return;
4061
4061
  }
@@ -8995,7 +8995,7 @@ var RESULTS_REPORT_TEMPLATE = `<!DOCTYPE html>
8995
8995
  <div class="header-title-wrap">
8996
8996
  <div class="eyebrow">AgentV static export</div>
8997
8997
  <h1 class="header-title">Evaluation Report</h1>
8998
- <p class="header-subtitle">Studio-themed HTML generated from an existing AgentV results workspace.</p>
8998
+ <p class="header-subtitle">Dashboard-themed HTML generated from an existing AgentV results workspace.</p>
8999
8999
  </div>
9000
9000
  <div class="header-meta" id="header-meta"></div>
9001
9001
  </header>
@@ -10344,7 +10344,7 @@ function generateRunId() {
10344
10344
  const pad = (n, w = 2) => String(n).padStart(w, "0");
10345
10345
  const ts = `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;
10346
10346
  const rand = Math.random().toString(36).slice(2, 6);
10347
- return `studio-${ts}-${rand}`;
10347
+ return `dashboard-${ts}-${rand}`;
10348
10348
  }
10349
10349
  function pruneFinishedRuns() {
10350
10350
  const finished = [...activeRuns.entries()].filter(([, r]) => r.status === "finished" || r.status === "failed").sort((a, b) => (b[1].finishedAt ?? "").localeCompare(a[1].finishedAt ?? ""));
@@ -10521,7 +10521,7 @@ function registerEvalRoutes(app2, getCwd, options) {
10521
10521
  });
10522
10522
  app2.post("/api/eval/run", async (c4) => {
10523
10523
  if (readOnly) {
10524
- return c4.json({ error: "Studio is running in read-only mode" }, 403);
10524
+ return c4.json({ error: "Dashboard is running in read-only mode" }, 403);
10525
10525
  }
10526
10526
  const cwd = getCwd(c4);
10527
10527
  let body;
@@ -10620,7 +10620,7 @@ Process error: ${err2.message}
10620
10620
  });
10621
10621
  app2.post("/api/eval/run/:id/stop", (c4) => {
10622
10622
  if (readOnly) {
10623
- return c4.json({ error: "Studio is running in read-only mode" }, 403);
10623
+ return c4.json({ error: "Dashboard is running in read-only mode" }, 403);
10624
10624
  }
10625
10625
  const id = c4.req.param("id");
10626
10626
  const run2 = activeRuns.get(id ?? "");
@@ -10699,7 +10699,7 @@ Process error: ${err2.message}
10699
10699
  });
10700
10700
  app2.post("/api/projects/:projectId/eval/run", async (c4) => {
10701
10701
  if (readOnly) {
10702
- return c4.json({ error: "Studio is running in read-only mode" }, 403);
10702
+ return c4.json({ error: "Dashboard is running in read-only mode" }, 403);
10703
10703
  }
10704
10704
  const cwd = getCwd(c4);
10705
10705
  let body;
@@ -10786,7 +10786,7 @@ Process error: ${err2.message}
10786
10786
  });
10787
10787
  app2.post("/api/projects/:projectId/eval/run/:id/stop", (c4) => {
10788
10788
  if (readOnly) {
10789
- return c4.json({ error: "Studio is running in read-only mode" }, 403);
10789
+ return c4.json({ error: "Dashboard is running in read-only mode" }, 403);
10790
10790
  }
10791
10791
  const id = c4.req.param("id");
10792
10792
  const run2 = activeRuns.get(id ?? "");
@@ -10923,34 +10923,49 @@ import { existsSync as existsSync14, mkdirSync as mkdirSync4, readFileSync as re
10923
10923
  import path20 from "node:path";
10924
10924
  import { stringify as stringifyYaml3 } from "yaml";
10925
10925
  var DEFAULTS = {
10926
- threshold: DEFAULT_THRESHOLD
10926
+ threshold: DEFAULT_THRESHOLD,
10927
+ appName: "agentv"
10927
10928
  };
10928
10929
  function loadStudioConfig(agentvDir) {
10929
- const configPath = path20.join(agentvDir, "config.yaml");
10930
- if (!existsSync14(configPath)) {
10931
- return { ...DEFAULTS };
10932
- }
10933
- const raw = readFileSync11(configPath, "utf-8");
10934
- const parsed = parseYamlValue(raw);
10935
- if (!parsed || typeof parsed !== "object") {
10936
- return { ...DEFAULTS };
10937
- }
10938
- const studio = parsed.studio;
10939
- let threshold = DEFAULTS.threshold;
10940
- if (studio && typeof studio === "object" && !Array.isArray(studio)) {
10941
- const studioObj = studio;
10942
- if (typeof studioObj.threshold === "number") {
10943
- threshold = studioObj.threshold;
10944
- } else if (typeof studioObj.pass_threshold === "number") {
10945
- threshold = studioObj.pass_threshold;
10946
- }
10947
- } else if (typeof parsed.pass_threshold === "number") {
10948
- threshold = parsed.pass_threshold;
10949
- }
10930
+ const localConfigPath = path20.join(agentvDir, "config.yaml");
10931
+ const globalConfigPath = path20.join(getAgentvConfigDir(), "config.yaml");
10932
+ const localConfig = loadParsedConfig(localConfigPath);
10933
+ const globalConfig = path20.resolve(globalConfigPath) === path20.resolve(localConfigPath) ? void 0 : loadParsedConfig(globalConfigPath);
10934
+ const threshold = [
10935
+ readThreshold(localConfig?.dashboard),
10936
+ readThreshold(localConfig?.studio),
10937
+ typeof localConfig?.pass_threshold === "number" ? localConfig.pass_threshold : void 0,
10938
+ readThreshold(globalConfig?.dashboard),
10939
+ readThreshold(globalConfig?.studio),
10940
+ typeof globalConfig?.pass_threshold === "number" ? globalConfig.pass_threshold : void 0,
10941
+ DEFAULTS.threshold
10942
+ ].find((value) => value !== void 0);
10950
10943
  return {
10951
- threshold: Math.min(1, Math.max(0, threshold))
10944
+ threshold: Math.min(1, Math.max(0, threshold)),
10945
+ appName: readAppName(localConfig?.dashboard) ?? readAppName(globalConfig?.dashboard) ?? DEFAULTS.appName
10952
10946
  };
10953
10947
  }
10948
+ function loadParsedConfig(configPath) {
10949
+ if (!existsSync14(configPath)) return void 0;
10950
+ const raw = readFileSync11(configPath, "utf-8");
10951
+ const parsed = parseYamlValue(raw);
10952
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return void 0;
10953
+ return parsed;
10954
+ }
10955
+ function readThreshold(section) {
10956
+ if (!section || typeof section !== "object" || Array.isArray(section)) return void 0;
10957
+ const values = section;
10958
+ if (typeof values.threshold === "number") return values.threshold;
10959
+ if (typeof values.pass_threshold === "number") return values.pass_threshold;
10960
+ return void 0;
10961
+ }
10962
+ function readAppName(section) {
10963
+ if (!section || typeof section !== "object" || Array.isArray(section)) return void 0;
10964
+ const value = section.app_name;
10965
+ if (typeof value !== "string") return void 0;
10966
+ const trimmed = value.trim();
10967
+ return trimmed.length > 0 ? trimmed : void 0;
10968
+ }
10954
10969
  function saveStudioConfig(agentvDir, config) {
10955
10970
  if (!existsSync14(agentvDir)) {
10956
10971
  mkdirSync4(agentvDir, { recursive: true });
@@ -10966,13 +10981,22 @@ function saveStudioConfig(agentvDir, config) {
10966
10981
  }
10967
10982
  const { pass_threshold: _, ...rest } = existing;
10968
10983
  existing = rest;
10984
+ const existingDashboard = existing.dashboard;
10969
10985
  const existingStudio = existing.studio;
10970
- if (existingStudio && typeof existingStudio === "object" && !Array.isArray(existingStudio)) {
10971
- const { pass_threshold: __, ...studioRest } = existingStudio;
10972
- existing.studio = { ...studioRest, ...config };
10973
- } else {
10974
- existing.studio = { ...config };
10975
- }
10986
+ const dashboardRest = existingDashboard && typeof existingDashboard === "object" && !Array.isArray(existingDashboard) ? (({ pass_threshold: _2, ...rest2 }) => rest2)(existingDashboard) : {};
10987
+ const studioRest = existingStudio && typeof existingStudio === "object" && !Array.isArray(existingStudio) ? (({ threshold: _2, pass_threshold: __, ...rest2 }) => rest2)(
10988
+ existingStudio
10989
+ ) : {};
10990
+ const { studio: _legacyStudio, ...withoutStudio } = existing;
10991
+ existing = {
10992
+ ...withoutStudio,
10993
+ dashboard: {
10994
+ ...studioRest,
10995
+ ...dashboardRest,
10996
+ threshold: config.threshold,
10997
+ app_name: config.appName
10998
+ }
10999
+ };
10976
11000
  const yamlStr = stringifyYaml3(existing);
10977
11001
  writeFileSync5(configPath, yamlStr, "utf-8");
10978
11002
  }
@@ -11174,12 +11198,14 @@ async function handleRuns(c4, { searchDir, agentvDir }) {
11174
11198
  let target;
11175
11199
  let experiment = inferExperimentFromRunId(m.raw_filename);
11176
11200
  let passRate = m.passRate;
11201
+ let avgScore = m.avgScore;
11177
11202
  try {
11178
11203
  const records = await loadLightweightResultsForMeta(searchDir, m);
11179
11204
  if (records.length > 0) {
11180
11205
  target = records[0].target;
11181
11206
  experiment = records[0].experiment ?? experiment;
11182
11207
  passRate = records.filter((r) => r.score >= passThreshold).length / records.length;
11208
+ avgScore = records.reduce((sum, r) => sum + r.score, 0) / records.length;
11183
11209
  } else {
11184
11210
  target = getActiveRunTarget(m.path);
11185
11211
  }
@@ -11194,7 +11220,7 @@ async function handleRuns(c4, { searchDir, agentvDir }) {
11194
11220
  timestamp: m.timestamp,
11195
11221
  test_count: m.testCount,
11196
11222
  pass_rate: passRate,
11197
- avg_score: m.avgScore,
11223
+ avg_score: avgScore,
11198
11224
  size_bytes: m.sizeBytes,
11199
11225
  source: m.source,
11200
11226
  ...target && { target },
@@ -11636,8 +11662,10 @@ async function handleTargets(c4, { searchDir, agentvDir }) {
11636
11662
  return c4.json({ targets });
11637
11663
  }
11638
11664
  function handleConfig(c4, { agentvDir, searchDir }, options) {
11665
+ const config = loadStudioConfig(agentvDir);
11639
11666
  return c4.json({
11640
- ...loadStudioConfig(agentvDir),
11667
+ threshold: config.threshold,
11668
+ app_name: config.appName,
11641
11669
  read_only: options?.readOnly === true,
11642
11670
  project_name: path21.basename(searchDir),
11643
11671
  project_dashboard: options?.projectDashboard === true,
@@ -11710,7 +11738,7 @@ function createApp(results, resultDir, cwd, sourceFile, options) {
11710
11738
  }
11711
11739
  app2.post("/api/config", async (c4) => {
11712
11740
  if (readOnly) {
11713
- return c4.json({ error: "Studio is running in read-only mode" }, 403);
11741
+ return c4.json({ error: "Dashboard is running in read-only mode" }, 403);
11714
11742
  }
11715
11743
  try {
11716
11744
  const body = await c4.req.json();
@@ -11763,7 +11791,7 @@ function createApp(results, resultDir, cwd, sourceFile, options) {
11763
11791
  });
11764
11792
  app2.post("/api/projects", async (c4) => {
11765
11793
  if (readOnly) {
11766
- return c4.json({ error: "Studio is running in read-only mode" }, 403);
11794
+ return c4.json({ error: "Dashboard is running in read-only mode" }, 403);
11767
11795
  }
11768
11796
  try {
11769
11797
  const body = await c4.req.json();
@@ -11835,7 +11863,7 @@ function createApp(results, resultDir, cwd, sourceFile, options) {
11835
11863
  });
11836
11864
  app2.delete("/api/projects/:projectId", (c4) => {
11837
11865
  if (readOnly) {
11838
- return c4.json({ error: "Studio is running in read-only mode" }, 403);
11866
+ return c4.json({ error: "Dashboard is running in read-only mode" }, 403);
11839
11867
  }
11840
11868
  const removed = removeProject(c4.req.param("projectId") ?? "");
11841
11869
  if (!removed) return c4.json({ error: "Project not found" }, 404);
@@ -11854,13 +11882,13 @@ function createApp(results, resultDir, cwd, sourceFile, options) {
11854
11882
  app2.get("/api/runs", (c4) => handleRuns(c4, defaultCtx));
11855
11883
  app2.put("/api/runs/:filename/tags", (c4) => {
11856
11884
  if (readOnly) {
11857
- return c4.json({ error: "Studio is running in read-only mode" }, 403);
11885
+ return c4.json({ error: "Dashboard is running in read-only mode" }, 403);
11858
11886
  }
11859
11887
  return handleRunTagsPut(c4, defaultCtx);
11860
11888
  });
11861
11889
  app2.delete("/api/runs/:filename/tags", (c4) => {
11862
11890
  if (readOnly) {
11863
- return c4.json({ error: "Studio is running in read-only mode" }, 403);
11891
+ return c4.json({ error: "Dashboard is running in read-only mode" }, 403);
11864
11892
  }
11865
11893
  return handleRunTagsDelete(c4, defaultCtx);
11866
11894
  });
@@ -11884,7 +11912,7 @@ function createApp(results, resultDir, cwd, sourceFile, options) {
11884
11912
  });
11885
11913
  app2.post("/api/feedback", async (c4) => {
11886
11914
  if (readOnly) {
11887
- return c4.json({ error: "Studio is running in read-only mode" }, 403);
11915
+ return c4.json({ error: "Dashboard is running in read-only mode" }, 403);
11888
11916
  }
11889
11917
  let body;
11890
11918
  try {
@@ -11970,13 +11998,13 @@ function createApp(results, resultDir, cwd, sourceFile, options) {
11970
11998
  app2.get("/api/projects/:projectId/runs", (c4) => withProject(c4, handleRuns));
11971
11999
  app2.put("/api/projects/:projectId/runs/:filename/tags", (c4) => {
11972
12000
  if (readOnly) {
11973
- return c4.json({ error: "Studio is running in read-only mode" }, 403);
12001
+ return c4.json({ error: "Dashboard is running in read-only mode" }, 403);
11974
12002
  }
11975
12003
  return withProject(c4, handleRunTagsPut);
11976
12004
  });
11977
12005
  app2.delete("/api/projects/:projectId/runs/:filename/tags", (c4) => {
11978
12006
  if (readOnly) {
11979
- return c4.json({ error: "Studio is running in read-only mode" }, 403);
12007
+ return c4.json({ error: "Dashboard is running in read-only mode" }, 403);
11980
12008
  }
11981
12009
  return withProject(c4, handleRunTagsDelete);
11982
12010
  });
@@ -12021,7 +12049,9 @@ function createApp(results, resultDir, cwd, sourceFile, options) {
12021
12049
  );
12022
12050
  const studioDistPath = options?.studioDir ?? resolveStudioDistDir();
12023
12051
  if (!studioDistPath || !existsSync15(path21.join(studioDistPath, "index.html"))) {
12024
- throw new Error('Studio dist not found. Run "bun run build" in apps/studio/ to build the SPA.');
12052
+ throw new Error(
12053
+ 'Dashboard dist not found. Run "bun run build" in apps/dashboard/ to build the SPA.'
12054
+ );
12025
12055
  }
12026
12056
  app2.get("/", (c4) => {
12027
12057
  const indexPath = path21.join(studioDistPath, "index.html");
@@ -12063,14 +12093,14 @@ function createApp(results, resultDir, cwd, sourceFile, options) {
12063
12093
  function resolveStudioDistDir() {
12064
12094
  const currentDir = typeof __dirname !== "undefined" ? __dirname : path21.dirname(fileURLToPath3(import.meta.url));
12065
12095
  const candidates = [
12066
- // From src/commands/results/ → sibling apps/studio/dist
12067
- path21.resolve(currentDir, "../../../../studio/dist"),
12068
- // From dist/ → sibling apps/studio/dist (monorepo dev)
12069
- path21.resolve(currentDir, "../../studio/dist"),
12070
- // Bundled inside CLI dist (published package: dist/studio/)
12071
- path21.resolve(currentDir, "studio"),
12096
+ // From src/commands/results/ → sibling apps/dashboard/dist
12097
+ path21.resolve(currentDir, "../../../../dashboard/dist"),
12098
+ // From dist/ → sibling apps/dashboard/dist (monorepo dev)
12099
+ path21.resolve(currentDir, "../../dashboard/dist"),
12100
+ // Bundled inside CLI dist (published package: dist/dashboard/)
12101
+ path21.resolve(currentDir, "dashboard"),
12072
12102
  // From dist/ in monorepo root context
12073
- path21.resolve(currentDir, "../../../apps/studio/dist")
12103
+ path21.resolve(currentDir, "../../../apps/dashboard/dist")
12074
12104
  ];
12075
12105
  for (const candidate of candidates) {
12076
12106
  if (existsSync15(candidate) && existsSync15(path21.join(candidate, "index.html"))) {
@@ -12080,8 +12110,8 @@ function resolveStudioDistDir() {
12080
12110
  return void 0;
12081
12111
  }
12082
12112
  var resultsServeCommand = command({
12083
- name: "studio",
12084
- description: "Start AgentV Studio \u2014 a local dashboard for reviewing evaluation results",
12113
+ name: "dashboard",
12114
+ description: "Start AgentV Dashboard \u2014 a local dashboard for reviewing evaluation results",
12085
12115
  args: {
12086
12116
  source: positional({
12087
12117
  type: optional(string),
@@ -12116,7 +12146,7 @@ var resultsServeCommand = command({
12116
12146
  }),
12117
12147
  readOnly: flag({
12118
12148
  long: "read-only",
12119
- description: "Disable write operations and launch Studio in read-only leaderboard mode"
12149
+ description: "Disable write operations and launch Dashboard in read-only leaderboard mode"
12120
12150
  })
12121
12151
  },
12122
12152
  handler: async ({ source, port, dir, single, add, remove, readOnly }) => {
@@ -13572,6 +13602,7 @@ var app = subcommands({
13572
13602
  description: "AgentV CLI",
13573
13603
  version: package_default.version,
13574
13604
  cmds: {
13605
+ dashboard: resultsServeCommand,
13575
13606
  eval: evalCommand,
13576
13607
  import: importCommand,
13577
13608
  compare: compareCommand,
@@ -13584,7 +13615,6 @@ var app = subcommands({
13584
13615
  self: selfCommand,
13585
13616
  skills: skillsCommand,
13586
13617
  serve: resultsServeCommand,
13587
- studio: resultsServeCommand,
13588
13618
  inspect: inspectCommand,
13589
13619
  trend: trendCommand,
13590
13620
  transpile: transpileCommand,
@@ -13600,6 +13630,7 @@ var TOP_LEVEL_COMMANDS = /* @__PURE__ */ new Set([
13600
13630
  "compare",
13601
13631
  "convert",
13602
13632
  "create",
13633
+ "dashboard",
13603
13634
  "doctor",
13604
13635
  "init",
13605
13636
  "pipeline",
@@ -13614,8 +13645,14 @@ var TOP_LEVEL_COMMANDS = /* @__PURE__ */ new Set([
13614
13645
  "validate",
13615
13646
  "workspace"
13616
13647
  ]);
13648
+ function usesDeprecatedStudioAlias(argv) {
13649
+ return argv[2] === "studio";
13650
+ }
13617
13651
  function preprocessArgv(argv) {
13618
13652
  const result = [...argv];
13653
+ if (result[2] === "studio") {
13654
+ result[2] = "dashboard";
13655
+ }
13619
13656
  for (let i = 0; i < result.length; i++) {
13620
13657
  if (result[i] === "--eval-id") {
13621
13658
  result[i] = "--test-id";
@@ -13648,6 +13685,11 @@ ${updateNotice}
13648
13685
  updateNotice = n;
13649
13686
  });
13650
13687
  const processedArgv = preprocessArgv(argv);
13688
+ if (usesDeprecatedStudioAlias(argv)) {
13689
+ process.stderr.write(
13690
+ "Warning: `agentv studio` is deprecated and will be removed in a future release. Use `agentv dashboard` instead.\n"
13691
+ );
13692
+ }
13651
13693
  const cwd = process.cwd();
13652
13694
  const repoRoot = await findRepoRoot(cwd);
13653
13695
  const sessionConfig = await loadConfig(path29.join(cwd, "_"), repoRoot);
@@ -13660,7 +13702,8 @@ ${updateNotice}
13660
13702
 
13661
13703
  export {
13662
13704
  app,
13705
+ usesDeprecatedStudioAlias,
13663
13706
  preprocessArgv,
13664
13707
  runCli
13665
13708
  };
13666
- //# sourceMappingURL=chunk-4POCDPC2.js.map
13709
+ //# sourceMappingURL=chunk-IGTRNQAM.js.map