agentv 5.3.0-next.1 → 5.3.2-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.
- package/README.md +70 -60
- package/dist/{artifact-writer-JFNIPMKW.js → artifact-writer-KJEOROKQ.js} +5 -5
- package/dist/{chunk-6ZZCDZPD.js → chunk-6262OKXM.js} +21774 -21034
- package/dist/chunk-6262OKXM.js.map +1 -0
- package/dist/chunk-AQ5BIAXF.js +604 -0
- package/dist/chunk-AQ5BIAXF.js.map +1 -0
- package/dist/chunk-BV5VQLI2.js +2 -0
- package/dist/{chunk-V52ATPTT.js → chunk-JGSRUJZQ.js} +186 -32
- package/dist/chunk-JGSRUJZQ.js.map +1 -0
- package/dist/chunk-MMDLXYBX.js +721 -0
- package/dist/chunk-MMDLXYBX.js.map +1 -0
- package/dist/{chunk-FVR4RQFK.js → chunk-QSK3PC44.js} +1131 -580
- package/dist/chunk-QSK3PC44.js.map +1 -0
- package/dist/chunk-TEEXVJWM.js +2 -0
- package/dist/{chunk-BHKQHG26.js → chunk-WIAJ7JAV.js} +186 -64
- package/dist/chunk-WIAJ7JAV.js.map +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +17517 -10
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/{ts-eval-loader-DQDYRULE-V3377FOL.js → config.js} +7 -7
- package/dist/config.js.map +1 -0
- package/dist/contracts-DsZmZLl8.d.ts +742 -0
- package/dist/contracts.d.ts +2 -0
- package/dist/contracts.js +28 -0
- package/dist/contracts.js.map +1 -0
- package/dist/dashboard/assets/{index-DNgf3qJ2.js → index-BfqOlLOF.js} +1 -1
- package/dist/dashboard/assets/index-Bh8lpGce.css +1 -0
- package/dist/dashboard/assets/index-oPR3ywQb.js +121 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/{dist-6Z7U473R.js → dist-A3SGR7TW.js} +30 -18
- package/dist/dist-A3SGR7TW.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +137 -18
- package/dist/{interactive-RUY3OCBI.js → interactive-DL7N2C7K.js} +24 -24
- package/dist/interactive-DL7N2C7K.js.map +1 -0
- package/dist/provider.d.ts +2 -0
- package/dist/provider.js +24 -0
- package/dist/provider.js.map +1 -0
- package/dist/sdk.d.ts +802 -0
- package/dist/sdk.js +145 -0
- package/dist/sdk.js.map +1 -0
- package/dist/skills/agentv-bench/SKILL.md +14 -13
- package/dist/skills/agentv-bench/agents/analyzer.md +1 -1
- package/dist/skills/agentv-bench/agents/executor.md +1 -1
- package/dist/skills/agentv-bench/references/autoresearch.md +9 -9
- package/dist/skills/agentv-bench/references/environment-adaptation.md +4 -4
- package/dist/skills/agentv-bench/references/eval-yaml-spec.md +30 -47
- package/dist/skills/agentv-bench/references/schemas.md +44 -60
- package/dist/skills/agentv-bench/references/subagent-pipeline.md +20 -18
- package/dist/skills/agentv-eval-migrations/SKILL.md +13 -0
- package/dist/skills/agentv-eval-migrations/references/breaking-changes.md +56 -39
- package/dist/skills/agentv-eval-writer/SKILL.md +101 -60
- package/dist/skills/agentv-eval-writer/references/custom-evaluators.md +15 -10
- package/dist/skills/agentv-eval-writer/references/eval.schema.json +4543 -5189
- package/dist/skills/agentv-eval-writer/references/python-helpers.md +2 -2
- package/dist/skills/agentv-eval-writer/references/rubric-evaluator.md +20 -3
- package/dist/templates/.agentv/providers.yaml +42 -0
- package/dist/templates/.env.example +2 -2
- package/dist/ts-eval-loader-3G5GEAEC-6F52JLPP.js +18 -0
- package/dist/ts-eval-loader-3G5GEAEC-6F52JLPP.js.map +1 -0
- package/package.json +29 -4
- package/dist/chunk-6ZZCDZPD.js.map +0 -1
- package/dist/chunk-BHKQHG26.js.map +0 -1
- package/dist/chunk-FVR4RQFK.js.map +0 -1
- package/dist/chunk-T32NL3E6.js +0 -17973
- package/dist/chunk-T32NL3E6.js.map +0 -1
- package/dist/chunk-V52ATPTT.js.map +0 -1
- package/dist/dashboard/assets/index-D_bokML8.css +0 -1
- package/dist/dashboard/assets/index-r_jSJmlw.js +0 -121
- package/dist/interactive-RUY3OCBI.js.map +0 -1
- package/dist/templates/.agentv/targets.yaml +0 -97
- /package/dist/{artifact-writer-JFNIPMKW.js.map → artifact-writer-KJEOROKQ.js.map} +0 -0
- /package/dist/{dist-6Z7U473R.js.map → chunk-BV5VQLI2.js.map} +0 -0
- /package/dist/{ts-eval-loader-DQDYRULE-V3377FOL.js.map → chunk-TEEXVJWM.js.map} +0 -0
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { killAllTrackedChildren } from '@agentv/core';\n\nimport { runCli } from './index.js';\n\n// Forward SIGINT/SIGTERM to spawned provider subprocesses before exiting.\n// Without this, Dashboard's `child.kill('SIGTERM')` against the CLI orphans\n// any in-flight `claude`/`codex`/`pi`/`copilot` subprocess. The partial\n// `index.jsonl` is already row-by-row durable, so finished tests survive.\n//\n// First signal: kill children, exit with the conventional 128+signal code.\n// Second signal within the same process: hard-exit so a hung child cannot\n// trap the user.\nlet interrupted = false;\nfunction installShutdown(signal: NodeJS.Signals, exitCode: number) {\n process.on(signal, () => {\n if (interrupted) {\n process.exit(1);\n }\n interrupted = true;\n killAllTrackedChildren('SIGTERM');\n // Defer exit one tick so SIGTERM has a chance to dispatch before the\n // event loop tears down.\n setTimeout(() => process.exit(exitCode), 50);\n });\n}\ninstallShutdown('SIGINT', 130);\ninstallShutdown('SIGTERM', 143);\n\nrunCli()\n .then(() => {\n process.exit(0);\n })\n .catch((error) => {\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`);\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n } else {\n console.error(error);\n }\n process.exit(1);\n });\n"],"mappings":";;;;;;;;;;;;;;;;;AAaA,IAAI,cAAc;AAClB,SAAS,gBAAgB,QAAwB,UAAkB;AACjE,UAAQ,GAAG,QAAQ,MAAM;AACvB,QAAI,aAAa;AACf,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,kBAAc;AACd,2BAAuB,SAAS;AAGhC,eAAW,MAAM,QAAQ,KAAK,QAAQ,GAAG,EAAE;AAAA,EAC7C,CAAC;AACH;AACA,gBAAgB,UAAU,GAAG;AAC7B,gBAAgB,WAAW,GAAG;AAE9B,OAAO,EACJ,KAAK,MAAM;AACV,UAAQ,KAAK,CAAC;AAChB,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,MAAI,iBAAiB,OAAO;AAC1B,YAAQ,MAAM,UAAU,MAAM,OAAO,EAAE;AACvC,QAAI,QAAQ,IAAI,OAAO;AACrB,cAAQ,MAAM,MAAM,KAAK;AAAA,IAC3B;AAAA,EACF,OAAO;AACL,YAAQ,MAAM,KAAK;AAAA,EACrB;AACA,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.bun/didyoumean@1.2.2/node_modules/didyoumean/didYouMean-1.2.1.js","../../../node_modules/.bun/ms@2.1.3/node_modules/ms/index.js","../../../node_modules/.bun/debug@4.4.3/node_modules/debug/src/common.js","../../../node_modules/.bun/debug@4.4.3/node_modules/debug/src/browser.js","../../../node_modules/.bun/debug@4.4.3/node_modules/debug/src/node.js","../../../node_modules/.bun/debug@4.4.3/node_modules/debug/src/index.js","../src/cli-app.ts","../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.js","../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/vendor/supports-color/index.js","../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/utilities.js","../../../node_modules/.bun/chalk@5.6.2/node_modules/chalk/source/index.js","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/subcommands.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/Result.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/effects.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/newparser/findOption.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/from.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/type.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/types.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/flag.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/circuitbreaker.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/positional.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/binary.ts","../../../node_modules/.bun/ansi-regex@6.2.2/node_modules/ansi-regex/index.js","../../../node_modules/.bun/strip-ansi@7.1.2/node_modules/strip-ansi/index.js","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/utils.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/command.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/option.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/errorBox.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/newparser/parser.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/newparser/tokenizer.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/runner.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/restPositionals.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/multioption.ts","../../../node_modules/.bun/cmd-ts@0.14.3/node_modules/cmd-ts/src/oneOf.ts","../src/commands/compare/index.ts","../src/commands/convert/index.ts","../src/commands/eval/html-writer.ts","../src/commands/create/commands.ts","../src/commands/create/index.ts","../src/commands/doctor/index.ts","../src/commands/eval/commands/aggregate.ts","../src/commands/eval/commands/assert.ts","../src/commands/eval/commands/bundle.ts","../src/commands/eval/commands/run.ts","../src/commands/eval/commands/vitest.ts","../src/commands/eval/index.ts","../src/commands/grade/index.ts","../src/commands/import/claude.ts","../src/commands/import/codex.ts","../src/commands/import/copilot.ts","../src/commands/import/huggingface.ts","../src/commands/import/index.ts","../src/commands/init/index.ts","../src/templates/index.ts","../src/commands/inspect/filter.ts","../src/commands/inspect/list.ts","../src/commands/inspect/score.ts","../src/commands/inspect/search.ts","../src/commands/inspect/show.ts","../src/commands/inspect/stats.ts","../src/commands/inspect/index.ts","../src/commands/pipeline/bench.ts","../src/commands/pipeline/grade.ts","../src/commands/pipeline/input.ts","../src/commands/pipeline/run.ts","../src/commands/pipeline/index.ts","../src/commands/prepare/index.ts","../src/commands/trend/index.ts","../src/commands/results/combine.ts","../src/commands/results/combine-run.ts","../src/commands/results/delete.ts","../src/commands/results/delete-run.ts","../src/commands/results/export.ts","../src/commands/results/projection-bundle.ts","../src/commands/results/shared.ts","../src/commands/results/failures.ts","../src/commands/results/report.ts","../src/commands/results/report-template.ts","../src/commands/results/show.ts","../src/commands/results/summary.ts","../src/commands/results/validate.ts","../src/commands/results/index.ts","../src/commands/results/serve.ts","../src/commands/results/eval-runner.ts","../src/commands/results/studio-config.ts","../src/commands/runs/rerun.ts","../src/commands/runs/index.ts","../src/self-update.ts","../src/commands/self/index.ts","../src/commands/skills/index.ts","../src/commands/transpile/index.ts","../src/commands/trim/index.ts","../src/commands/validate/format-output.ts","../src/commands/validate/validate-files.ts","../src/commands/validate/index.ts","../src/update-check.ts","../src/cli.ts"],"sourcesContent":["/*\n\ndidYouMean.js - A simple JavaScript matching engine\n===================================================\n\n[Available on GitHub](https://github.com/dcporter/didyoumean.js).\n\nA super-simple, highly optimized JS library for matching human-quality input to a list of potential\nmatches. You can use it to suggest a misspelled command-line utility option to a user, or to offer\nlinks to nearby valid URLs on your 404 page. (The examples below are taken from a personal project,\nmy [HTML5 business card](http://dcporter.aws.af.cm/me), which uses didYouMean.js to suggest correct\nURLs from misspelled ones, such as [dcporter.aws.af.cm/me/instagarm](http://dcporter.aws.af.cm/me/instagarm).)\nUses the [Levenshtein distance algorithm](https://en.wikipedia.org/wiki/Levenshtein_distance).\n\ndidYouMean.js works in the browser as well as in node.js. To install it for use in node:\n\n```\nnpm install didyoumean\n```\n\n\nExamples\n--------\n\nMatching against a list of strings:\n```\nvar input = 'insargrm'\nvar list = ['facebook', 'twitter', 'instagram', 'linkedin'];\nconsole.log(didYouMean(input, list));\n> 'instagram'\n// The method matches 'insargrm' to 'instagram'.\n\ninput = 'google plus';\nconsole.log(didYouMean(input, list));\n> null\n// The method was unable to find 'google plus' in the list of options.\n```\n\nMatching against a list of objects:\n```\nvar input = 'insargrm';\nvar list = [ { id: 'facebook' }, { id: 'twitter' }, { id: 'instagram' }, { id: 'linkedin' } ];\nvar key = 'id';\nconsole.log(didYouMean(input, list, key));\n> 'instagram'\n// The method returns the matching value.\n\ndidYouMean.returnWinningObject = true;\nconsole.log(didYouMean(input, list, key));\n> { id: 'instagram' }\n// The method returns the matching object.\n```\n\n\ndidYouMean(str, list, [key])\n----------------------------\n\n- str: The string input to match.\n- list: An array of strings or objects to match against.\n- key (OPTIONAL): If your list array contains objects, you must specify the key which contains the string\n to match against.\n\nReturns: the closest matching string, or null if no strings exceed the threshold.\n\n\nOptions\n-------\n\nOptions are set on the didYouMean function object. You may change them at any time.\n\n### threshold\n\n By default, the method will only return strings whose edit distance is less than 40% (0.4x) of their length.\n For example, if a ten-letter string is five edits away from its nearest match, the method will return null.\n\n You can control this by setting the \"threshold\" value on the didYouMean function. For example, to set the\n edit distance threshold to 50% of the input string's length:\n\n ```\n didYouMean.threshold = 0.5;\n ```\n\n To return the nearest match no matter the threshold, set this value to null.\n\n### thresholdAbsolute\n\n This option behaves the same as threshold, but instead takes an integer number of edit steps. For example,\n if thresholdAbsolute is set to 20 (the default), then the method will only return strings whose edit distance\n is less than 20. Both options apply.\n\n### caseSensitive\n\n By default, the method will perform case-insensitive comparisons. If you wish to force case sensitivity, set\n the \"caseSensitive\" value to true:\n\n ```\n didYouMean.caseSensitive = true;\n ```\n\n### nullResultValue\n\n By default, the method will return null if there is no sufficiently close match. You can change this value here.\n\n### returnWinningObject\n\n By default, the method will return the winning string value (if any). If your list contains objects rather\n than strings, you may set returnWinningObject to true.\n \n ```\n didYouMean.returnWinningObject = true;\n ```\n \n This option has no effect on lists of strings.\n\n### returnFirstMatch\n \n By default, the method will search all values and return the closest match. If you're simply looking for a \"good-\n enough\" match, you can set your thresholds appropriately and set returnFirstMatch to true to substantially speed\n things up.\n\n\nLicense\n-------\n\ndidYouMean copyright (c) 2013-2014 Dave Porter.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License\n[here](http://www.apache.org/licenses/LICENSE-2.0).\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n*/\n(function() {\n \"use strict\";\n\n // The didYouMean method.\n function didYouMean(str, list, key) {\n if (!str) return null;\n\n // If we're running a case-insensitive search, smallify str.\n if (!didYouMean.caseSensitive) { str = str.toLowerCase(); }\n\n // Calculate the initial value (the threshold) if present.\n var thresholdRelative = didYouMean.threshold === null ? null : didYouMean.threshold * str.length,\n thresholdAbsolute = didYouMean.thresholdAbsolute,\n winningVal;\n if (thresholdRelative !== null && thresholdAbsolute !== null) winningVal = Math.min(thresholdRelative, thresholdAbsolute);\n else if (thresholdRelative !== null) winningVal = thresholdRelative;\n else if (thresholdAbsolute !== null) winningVal = thresholdAbsolute;\n else winningVal = null;\n\n // Get the edit distance to each option. If the closest one is less than 40% (by default) of str's length,\n // then return it.\n var winner, candidate, testCandidate, val,\n i, len = list.length;\n for (i = 0; i < len; i++) {\n // Get item.\n candidate = list[i];\n // If there's a key, get the candidate value out of the object.\n if (key) { candidate = candidate[key]; }\n // Gatekeep.\n if (!candidate) { continue; }\n // If we're running a case-insensitive search, smallify the candidate.\n if (!didYouMean.caseSensitive) { testCandidate = candidate.toLowerCase(); }\n else { testCandidate = candidate; }\n // Get and compare edit distance.\n val = getEditDistance(str, testCandidate, winningVal);\n // If this value is smaller than our current winning value, OR if we have no winning val yet (i.e. the\n // threshold option is set to null, meaning the caller wants a match back no matter how bad it is), then\n // this is our new winner.\n if (winningVal === null || val < winningVal) {\n winningVal = val;\n // Set the winner to either the value or its object, depending on the returnWinningObject option.\n if (key && didYouMean.returnWinningObject) winner = list[i];\n else winner = candidate;\n // If we're returning the first match, return it now.\n if (didYouMean.returnFirstMatch) return winner;\n }\n }\n\n // If we have a winner, return it.\n return winner || didYouMean.nullResultValue;\n }\n\n // Set default options.\n didYouMean.threshold = 0.4;\n didYouMean.thresholdAbsolute = 20;\n didYouMean.caseSensitive = false;\n didYouMean.nullResultValue = null;\n didYouMean.returnWinningObject = null;\n didYouMean.returnFirstMatch = false;\n\n // Expose.\n // In node...\n if (typeof module !== 'undefined' && module.exports) {\n module.exports = didYouMean;\n }\n // Otherwise...\n else {\n window.didYouMean = didYouMean;\n }\n\n var MAX_INT = Math.pow(2,32) - 1; // We could probably go higher than this, but for practical reasons let's not.\n function getEditDistance(a, b, max) {\n // Handle null or undefined max.\n max = max || max === 0 ? max : MAX_INT;\n\n var lena = a.length;\n var lenb = b.length;\n\n // Fast path - no A or B.\n if (lena === 0) return Math.min(max + 1, lenb);\n if (lenb === 0) return Math.min(max + 1, lena);\n\n // Fast path - length diff larger than max.\n if (Math.abs(lena - lenb) > max) return max + 1;\n\n // Slow path.\n var matrix = [],\n i, j, colMin, minJ, maxJ;\n\n // Set up the first row ([0, 1, 2, 3, etc]).\n for (i = 0; i <= lenb; i++) { matrix[i] = [i]; }\n\n // Set up the first column (same).\n for (j = 0; j <= lena; j++) { matrix[0][j] = j; }\n\n // Loop over the rest of the columns.\n for (i = 1; i <= lenb; i++) {\n colMin = MAX_INT;\n minJ = 1;\n if (i > max) minJ = i - max;\n maxJ = lenb + 1;\n if (maxJ > max + i) maxJ = max + i;\n // Loop over the rest of the rows.\n for (j = 1; j <= lena; j++) {\n // If j is out of bounds, just put a large value in the slot.\n if (j < minJ || j > maxJ) {\n matrix[i][j] = max + 1;\n }\n\n // Otherwise do the normal Levenshtein thing.\n else {\n // If the characters are the same, there's no change in edit distance.\n if (b.charAt(i - 1) === a.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n }\n // Otherwise, see if we're substituting, inserting or deleting.\n else {\n matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // Substitute\n Math.min(matrix[i][j - 1] + 1, // Insert\n matrix[i - 1][j] + 1)); // Delete\n }\n }\n\n // Either way, update colMin.\n if (matrix[i][j] < colMin) colMin = matrix[i][j];\n }\n\n // If this column's minimum is greater than the allowed maximum, there's no point\n // in going on with life.\n if (colMin > max) return max + 1;\n }\n // If we made it this far without running into the max, then return the final matrix value.\n return matrix[lenb][lena];\n }\n\n})();\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n","/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n","import path from 'node:path';\nimport {\n loadConfig,\n loadEnvPathFiles,\n runBeforeSessionHook,\n runEnvFromEntries,\n} from '@agentv/core';\nimport { binary, run, subcommands } from 'cmd-ts';\nimport { findRepoRoot } from './commands/eval/shared.js';\n\nimport packageJson from '../package.json' with { type: 'json' };\nimport { compareCommand } from './commands/compare/index.js';\nimport { convertCommand } from './commands/convert/index.js';\nimport { createCommand } from './commands/create/index.js';\nimport { doctorCommand } from './commands/doctor/index.js';\nimport { evalCommand } from './commands/eval/index.js';\nimport { gradeCommand } from './commands/grade/index.js';\nimport { importCommand } from './commands/import/index.js';\nimport { initCmdTsCommand } from './commands/init/index.js';\nimport { inspectCommand } from './commands/inspect/index.js';\nimport { pipelineCommand } from './commands/pipeline/index.js';\nimport { prepareCommand } from './commands/prepare/index.js';\nimport { resultsCommand } from './commands/results/index.js';\nimport { resultsServeCommand } from './commands/results/serve.js';\nimport { runsCommand } from './commands/runs/index.js';\nimport { selfCommand } from './commands/self/index.js';\nimport { skillsCommand } from './commands/skills/index.js';\nimport { transpileCommand } from './commands/transpile/index.js';\nimport { trendCommand } from './commands/trend/index.js';\nimport { trimCommand } from './commands/trim/index.js';\nimport { validateCommand } from './commands/validate/index.js';\nimport { getUpdateNotice } from './update-check.js';\n\nexport const app = subcommands({\n name: 'agentv',\n description: 'AgentV CLI',\n version: packageJson.version,\n cmds: {\n dashboard: resultsServeCommand,\n eval: evalCommand,\n grade: gradeCommand,\n import: importCommand,\n compare: compareCommand,\n convert: convertCommand,\n create: createCommand,\n doctor: doctorCommand,\n init: initCmdTsCommand,\n pipeline: pipelineCommand,\n prepare: prepareCommand,\n results: resultsCommand,\n runs: runsCommand,\n self: selfCommand,\n skills: skillsCommand,\n serve: resultsServeCommand,\n inspect: inspectCommand,\n trend: trendCommand,\n transpile: transpileCommand,\n trim: trimCommand,\n validate: validateCommand,\n },\n});\n\n/**\n * Known eval subcommand names — used to decide whether to inject the\n * implicit `run` subcommand for backward-compatible `agentv eval <paths>`.\n */\nconst EVAL_SUBCOMMANDS = new Set(['run', 'assert', 'aggregate', 'bundle', 'vitest']);\nconst VITEST_VERIFIER_RE = /(?:^|[/\\\\])(?:EVAL|[^/\\\\]+[.-](?:test|spec))\\.[cm]?[jt]sx?$/i;\n\n/**\n * Top-level CLI command names (excluding `eval` itself).\n * Used to ensure `eval` is the top-level subcommand, not nested.\n */\nconst TOP_LEVEL_COMMANDS = new Set([\n 'import',\n 'inspect',\n 'compare',\n 'convert',\n 'create',\n 'dashboard',\n 'doctor',\n 'grade',\n 'init',\n 'pipeline',\n 'prepare',\n 'results',\n 'runs',\n 'self',\n 'skills',\n 'serve',\n 'studio',\n 'trend',\n 'transpile',\n 'trim',\n 'validate',\n]);\n\nexport function usesDeprecatedStudioAlias(argv: string[]): boolean {\n return argv[2] === 'studio';\n}\n\nexport function shouldRunBeforeSessionHook(argv: string[]): boolean {\n return !(argv[2] === 'eval' && argv[3] === 'vitest');\n}\n\nexport function inferEvalSubcommand(arg: string | undefined): 'run' | 'vitest' {\n return arg && VITEST_VERIFIER_RE.test(arg) ? 'vitest' : 'run';\n}\n\n/**\n * Preprocess argv for convenience aliases:\n * - `--eval-id` → `--test-id`\n * - `agentv eval <non-subcommand>` → `agentv eval run <non-subcommand>`\n * (backward compat: `eval` used to be a direct command, now it's a group)\n */\nexport function preprocessArgv(argv: string[]): string[] {\n const result = [...argv];\n\n if (result[2] === 'studio') {\n result[2] = 'dashboard';\n }\n\n // Rewrite --eval-id → --test-id (convenience alias)\n for (let i = 0; i < result.length; i++) {\n if (result[i] === '--eval-id') {\n result[i] = '--test-id';\n } else if (result[i].startsWith('--eval-id=')) {\n result[i] = `--test-id=${result[i].slice('--eval-id='.length)}`;\n }\n }\n\n // Implicit eval subcommand: `agentv eval [<arg>]` injects the inferred command\n // when the first arg after `eval` is absent or is not a known eval subcommand.\n // Backward-compat: `eval` used to be a direct command; now it is a subcommands group.\n // Bare `agentv eval` falls through to the run handler so its TTY check can launch\n // the interactive wizard. Vitest-looking verifier files use the protocol adapter\n // directly so deterministic workspace graders can stay short in eval YAML.\n // Only applies when `eval` is the top-level subcommand.\n // Exception: `--help` / `-h` should show the eval group help, not run's help.\n const evalIdx = result.indexOf('eval');\n if (evalIdx !== -1) {\n // Ensure no top-level command appears before `eval` in the argv —\n // if one does, `eval` is a nested subcommand.\n const isTopLevel = !result.slice(0, evalIdx).some((arg) => TOP_LEVEL_COMMANDS.has(arg));\n if (isTopLevel) {\n const nextArg = result[evalIdx + 1];\n const isHelp = nextArg === '--help' || nextArg === '-h';\n const isKnownSubcommand = nextArg !== undefined && EVAL_SUBCOMMANDS.has(nextArg);\n if (!isHelp && !isKnownSubcommand) {\n result.splice(evalIdx + 1, 0, inferEvalSubcommand(nextArg));\n }\n }\n }\n\n return result;\n}\n\nexport async function runCli(argv: string[] = process.argv): Promise<void> {\n // Kick off update check: reads from local cache (fast), spawns a detached\n // child to refresh if stale. The notice is printed on process exit so it\n // appears after command output, even if the command calls process.exit().\n let updateNotice: string | null = null;\n process.on('exit', () => {\n if (updateNotice) process.stderr.write(`\\n${updateNotice}\\n`);\n });\n getUpdateNotice(packageJson.version).then((n) => {\n updateNotice = n;\n });\n\n const processedArgv = preprocessArgv(argv);\n if (usesDeprecatedStudioAlias(argv)) {\n process.stderr.write(\n 'Warning: `agentv studio` is deprecated and will be removed in a future release. Use `agentv dashboard` instead.\\n',\n );\n }\n\n if (shouldRunBeforeSessionHook(processedArgv)) {\n // Load env_path/env_from and run the before_session hook once at startup,\n // before any command executes. Uses cwd as the search root for\n // .agentv/config.yaml so validate/eval commands see the injected vars.\n const cwd = process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n const sessionConfig = await loadConfig(path.join(cwd, '_'), repoRoot);\n const configDir = sessionConfig?.configDir ?? repoRoot;\n\n if (sessionConfig?.env_path) {\n await loadEnvPathFiles(sessionConfig.env_path, configDir);\n }\n if (sessionConfig?.env_from) {\n await runEnvFromEntries(sessionConfig.env_from, { cwd: configDir });\n }\n\n const beforeSessionCommand = sessionConfig?.hooks?.before_session;\n if (beforeSessionCommand) {\n runBeforeSessionHook(beforeSessionCommand);\n }\n }\n\n await run(binary(app), processedArgv);\n}\n","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","import process from 'node:process';\nimport os from 'node:os';\nimport tty from 'node:tty';\n\n// From: https://github.com/sindresorhus/has-flag/blob/main/index.js\n/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) {\nfunction hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n}\n\nconst {env} = process;\n\nlet flagForceColor;\nif (\n\thasFlag('no-color')\n\t|| hasFlag('no-colors')\n\t|| hasFlag('color=false')\n\t|| hasFlag('color=never')\n) {\n\tflagForceColor = 0;\n} else if (\n\thasFlag('color')\n\t|| hasFlag('colors')\n\t|| hasFlag('color=true')\n\t|| hasFlag('color=always')\n) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3,\n\t};\n}\n\nfunction _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m')\n\t\t\t|| hasFlag('color=full')\n\t\t\t|| hasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\t// Check for Azure DevOps pipelines.\n\t// Has to be above the `!streamIsTTY` check.\n\tif ('TF_BUILD' in env && 'AGENT_NAME' in env) {\n\t\treturn 1;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10\n\t\t\t&& Number(osRelease[2]) >= 10_586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14_931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-kitty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'xterm-ghostty') {\n\t\treturn 3;\n\t}\n\n\tif (env.TERM === 'wezterm') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app': {\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\t}\n\n\t\t\tcase 'Apple_Terminal': {\n\t\t\t\treturn 2;\n\t\t\t}\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nexport function createSupportsColor(stream, options = {}) {\n\tconst level = _supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options,\n\t});\n\n\treturn translateLevel(level);\n}\n\nconst supportsColor = {\n\tstdout: createSupportsColor({isTTY: tty.isatty(1)}),\n\tstderr: createSupportsColor({isTTY: tty.isatty(2)}),\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n",null,null,null,null,null,null,null,null,null,null,null,"export default function ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\n\t// OSC sequences only: ESC ] ... ST (non-greedy until the first ST)\n\tconst osc = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]';\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n","import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n",null,null,null,null,null,null,null,null,null,null,"import {\n array,\n command,\n flag,\n multioption,\n number,\n oneOf,\n option,\n optional,\n restPositionals,\n string,\n} from 'cmd-ts';\n\nimport { toSnakeCaseDeep } from '@agentv/core';\nimport { loadLightweightResults, resolveResultSourcePath } from '../results/manifest.js';\n\n// ANSI color codes (no dependency needed)\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n gray: '\\x1b[90m',\n};\n\n// Check if colors should be disabled\nconst noColor = process.env.NO_COLOR !== undefined || !process.stdout.isTTY;\nconst c = noColor ? Object.fromEntries(Object.keys(colors).map((k) => [k, ''])) : colors;\n\nexport interface EvalResult {\n testId: string;\n score: number;\n}\n\ninterface MatchedResult {\n testId: string;\n score1: number;\n score2: number;\n delta: number;\n normalizedGain: number | null;\n outcome: 'win' | 'loss' | 'tie';\n}\n\nexport interface ComparisonOutput {\n matched: MatchedResult[];\n unmatched: { file1: number; file2: number };\n summary: {\n total: number;\n matched: number;\n wins: number;\n losses: number;\n ties: number;\n meanDelta: number;\n meanNormalizedGain: number | null;\n };\n baseline?: string;\n candidate?: string;\n}\n\ninterface MatrixRow {\n testId: string;\n scores: Record<string, number>;\n}\n\ninterface CompareInputRecord extends EvalResult {\n target?: string;\n}\n\nfunction loadCompareResults(filePath: string): CompareInputRecord[] {\n return loadLightweightResults(resolveResultSourcePath(filePath)).map((record) => {\n if (!record.testId || record.testId === 'unknown') {\n throw new Error(`Missing test_id in result source: ${filePath}`);\n }\n if (typeof record.score !== 'number' || Number.isNaN(record.score)) {\n throw new Error(`Missing or invalid score in result source: ${filePath}`);\n }\n return {\n testId: record.testId,\n score: record.score,\n target: record.target,\n };\n });\n}\n\nexport interface MatrixOutput {\n matrix: MatrixRow[];\n pairwise: ComparisonOutput[];\n targets: string[];\n}\n\nexport function loadJsonlResults(filePath: string): EvalResult[] {\n return loadCompareResults(filePath).map(({ testId, score }) => ({ testId, score }));\n}\n\nexport function loadCombinedResults(filePath: string): Map<string, EvalResult[]> {\n const groups = new Map<string, EvalResult[]>();\n\n for (const record of loadCompareResults(filePath)) {\n if (typeof record.target !== 'string') {\n throw new Error(`Missing target field in combined result source: ${filePath}`);\n }\n\n const target = record.target;\n if (!groups.has(target)) {\n groups.set(target, []);\n }\n groups.get(target)?.push({ testId: record.testId, score: record.score });\n }\n\n return groups;\n}\n\n/**\n * Hake's normalized gain: g = (score_candidate − score_baseline) / (1 − score_baseline)\n * Measures improvement relative to remaining headroom. Returns null when baseline is 1.0\n * (perfect score leaves no room for improvement).\n * Reference: Hake (1998), used by SkillsBench (arXiv:2602.12670).\n */\nexport function computeNormalizedGain(\n baselineScore: number,\n candidateScore: number,\n): number | null {\n if (baselineScore >= 1.0) return null;\n return (candidateScore - baselineScore) / (1 - baselineScore);\n}\n\nexport function classifyOutcome(delta: number, threshold: number): 'win' | 'loss' | 'tie' {\n if (delta >= threshold) return 'win';\n if (delta <= -threshold) return 'loss';\n return 'tie';\n}\n\nexport function compareResults(\n results1: EvalResult[],\n results2: EvalResult[],\n threshold: number,\n): ComparisonOutput {\n const map1 = new Map(results1.map((r) => [r.testId, r.score]));\n const map2 = new Map(results2.map((r) => [r.testId, r.score]));\n\n const matched: MatchedResult[] = [];\n const matchedIds = new Set<string>();\n\n for (const [testId, score1] of map1) {\n const score2 = map2.get(testId);\n if (score2 !== undefined) {\n const delta = score2 - score1;\n matched.push({\n testId,\n score1,\n score2,\n delta,\n normalizedGain: computeNormalizedGain(score1, score2),\n outcome: classifyOutcome(delta, threshold),\n });\n matchedIds.add(testId);\n }\n }\n\n const unmatchedFile1 = results1.filter((r) => !matchedIds.has(r.testId)).length;\n const unmatchedFile2 = results2.filter((r) => !map1.has(r.testId)).length;\n\n const wins = matched.filter((m) => m.outcome === 'win').length;\n const losses = matched.filter((m) => m.outcome === 'loss').length;\n const ties = matched.filter((m) => m.outcome === 'tie').length;\n\n const meanDelta =\n matched.length > 0 ? matched.reduce((sum, m) => sum + m.delta, 0) / matched.length : 0;\n\n const gainValues = matched.map((m) => m.normalizedGain).filter((g): g is number => g !== null);\n const meanNormalizedGain =\n gainValues.length > 0\n ? Math.round((gainValues.reduce((sum, g) => sum + g, 0) / gainValues.length) * 1000) / 1000\n : null;\n\n return {\n matched,\n unmatched: { file1: unmatchedFile1, file2: unmatchedFile2 },\n summary: {\n total: results1.length + results2.length,\n matched: matched.length,\n wins,\n losses,\n ties,\n meanDelta: Math.round(meanDelta * 1000) / 1000,\n meanNormalizedGain,\n },\n };\n}\n\nexport function compareMatrix(groups: Map<string, EvalResult[]>, threshold: number): MatrixOutput {\n const targets = [...groups.keys()].sort();\n\n // Collect all test IDs across all targets\n const allTestIds = new Set<string>();\n for (const results of groups.values()) {\n for (const r of results) {\n allTestIds.add(r.testId);\n }\n }\n const sortedTestIds = [...allTestIds].sort();\n\n // Build score lookup: target -> testId -> score\n const scoreLookup = new Map<string, Map<string, number>>();\n for (const [target, results] of groups) {\n scoreLookup.set(target, new Map(results.map((r) => [r.testId, r.score])));\n }\n\n // Build matrix rows\n const matrix: MatrixRow[] = sortedTestIds.map((testId) => {\n const scores: Record<string, number> = {};\n for (const target of targets) {\n const score = scoreLookup.get(target)?.get(testId);\n if (score !== undefined) {\n scores[target] = score;\n }\n }\n return { testId, scores };\n });\n\n // Run pairwise comparisons for all target pairs\n const pairwise: ComparisonOutput[] = [];\n for (let i = 0; i < targets.length; i++) {\n for (let j = i + 1; j < targets.length; j++) {\n const t1 = targets[i];\n const t2 = targets[j];\n const r1 = groups.get(t1) ?? [];\n const r2 = groups.get(t2) ?? [];\n const comparison = compareResults(r1, r2, threshold);\n comparison.baseline = t1;\n comparison.candidate = t2;\n pairwise.push(comparison);\n }\n }\n\n return { matrix, pairwise, targets };\n}\n\nexport function determineExitCode(meanDelta: number): number {\n // Exit 0 if file2 >= file1 (meanDelta >= 0), exit 1 if file1 > file2\n return meanDelta >= 0 ? 0 : 1;\n}\n\nexport function determineMatrixExitCode(\n matrixOutput: MatrixOutput,\n baselineTarget?: string,\n): number {\n if (!baselineTarget) {\n return 0; // Informational mode\n }\n\n // Exit 1 if any target regresses vs baseline.\n // Pairwise pairs are generated in sorted order, so the designated baseline\n // may appear as either .baseline or .candidate depending on alphabetical position.\n for (const p of matrixOutput.pairwise) {\n if (p.baseline === baselineTarget && p.summary.meanDelta < 0) {\n // candidate scored lower than baseline → regression\n return 1;\n }\n if (p.candidate === baselineTarget && p.summary.meanDelta > 0) {\n // baseline scored higher than the other target → other regressed\n return 1;\n }\n }\n return 0;\n}\n\nfunction formatDelta(delta: number): string {\n const sign = delta >= 0 ? '+' : '';\n const formatted = `${sign}${delta.toFixed(2)}`;\n if (delta > 0) return `${c.green}${formatted}${c.reset}`;\n if (delta < 0) return `${c.red}${formatted}${c.reset}`;\n return `${c.gray}${formatted}${c.reset}`;\n}\n\nfunction formatOutcome(outcome: 'win' | 'loss' | 'tie'): string {\n switch (outcome) {\n case 'win':\n return `${c.green}✓ win${c.reset}`;\n case 'loss':\n return `${c.red}✗ loss${c.reset}`;\n case 'tie':\n return `${c.gray}= tie${c.reset}`;\n }\n}\n\n// Regex to strip ANSI escape codes (constructed to avoid lint warning)\nconst ansiPattern = new RegExp(`${String.fromCharCode(27)}\\\\[[0-9;]*m`, 'g');\n\nfunction stripAnsi(str: string): string {\n return str.replace(ansiPattern, '');\n}\n\nfunction padRight(str: string, len: number): string {\n const plainLen = stripAnsi(str).length;\n return str + ' '.repeat(Math.max(0, len - plainLen));\n}\n\nfunction padLeft(str: string, len: number): string {\n const plainLen = stripAnsi(str).length;\n return ' '.repeat(Math.max(0, len - plainLen)) + str;\n}\n\nexport function formatTable(comparison: ComparisonOutput, file1: string, file2: string): string {\n const lines: string[] = [];\n\n // Header\n lines.push('');\n lines.push(\n `${c.bold}Comparing:${c.reset} ${c.cyan}${file1}${c.reset} → ${c.cyan}${file2}${c.reset}`,\n );\n lines.push('');\n\n if (comparison.matched.length === 0) {\n lines.push(`${c.yellow}No matching test IDs found between files.${c.reset}`);\n } else {\n // Calculate column widths\n const maxIdLen = Math.max(\n 7, // \"Test ID\"\n ...comparison.matched.map((m) => m.testId.length),\n );\n\n // Table header\n const header = ` ${padRight('Test ID', maxIdLen)} ${padLeft('Baseline', 8)} ${padLeft('Candidate', 9)} ${padLeft('Delta', 8)} Result`;\n lines.push(`${c.dim}${header}${c.reset}`);\n lines.push(\n `${c.dim} ${'─'.repeat(maxIdLen)} ${'─'.repeat(8)} ${'─'.repeat(9)} ${'─'.repeat(8)} ${'─'.repeat(8)}${c.reset}`,\n );\n\n // Table rows\n for (const m of comparison.matched) {\n const row = ` ${padRight(m.testId, maxIdLen)} ${padLeft(m.score1.toFixed(2), 8)} ${padLeft(m.score2.toFixed(2), 9)} ${padLeft(formatDelta(m.delta), 8)} ${formatOutcome(m.outcome)}`;\n lines.push(row);\n }\n }\n\n // Unmatched warning\n if (comparison.unmatched.file1 > 0 || comparison.unmatched.file2 > 0) {\n lines.push('');\n lines.push(\n `${c.yellow}⚠ Unmatched:${c.reset} ${comparison.unmatched.file1} in baseline, ${comparison.unmatched.file2} in candidate`,\n );\n }\n\n // Summary\n lines.push('');\n const { wins, losses, ties, meanDelta, meanNormalizedGain } = comparison.summary;\n\n const winStr =\n wins > 0 ? `${c.green}${wins} win${wins !== 1 ? 's' : ''}${c.reset}` : `${wins} wins`;\n const lossStr =\n losses > 0 ? `${c.red}${losses} loss${losses !== 1 ? 'es' : ''}${c.reset}` : `${losses} losses`;\n const tieStr = `${ties} tie${ties !== 1 ? 's' : ''}`;\n\n const deltaColor = meanDelta > 0 ? c.green : meanDelta < 0 ? c.red : c.gray;\n const deltaSign = meanDelta >= 0 ? '+' : '';\n const status =\n meanDelta > 0\n ? `${c.green}improved${c.reset}`\n : meanDelta < 0\n ? `${c.red}regressed${c.reset}`\n : `${c.gray}neutral${c.reset}`;\n\n let summaryLine = `${c.bold}Summary:${c.reset} ${winStr}, ${lossStr}, ${tieStr} | Mean Δ: ${deltaColor}${deltaSign}${meanDelta.toFixed(3)}${c.reset}`;\n if (meanNormalizedGain != null) {\n const gColor = meanNormalizedGain > 0 ? c.green : meanNormalizedGain < 0 ? c.red : c.gray;\n const gSign = meanNormalizedGain >= 0 ? '+' : '';\n summaryLine += ` | g: ${gColor}${gSign}${meanNormalizedGain.toFixed(3)}${c.reset}`;\n }\n summaryLine += ` | Status: ${status}`;\n\n lines.push(summaryLine);\n lines.push('');\n\n return lines.join('\\n');\n}\n\nexport function formatMatrix(matrixOutput: MatrixOutput, baselineTarget?: string): string {\n const { matrix, pairwise, targets } = matrixOutput;\n const lines: string[] = [];\n\n lines.push('');\n lines.push(`${c.bold}Score Matrix${c.reset}`);\n lines.push('');\n\n if (matrix.length === 0) {\n lines.push(`${c.yellow}No results found.${c.reset}`);\n return lines.join('\\n');\n }\n\n // Calculate column widths\n const testIdWidth = Math.max(\n 7, // \"Test ID\"\n ...matrix.map((r) => r.testId.length),\n );\n const targetWidths = targets.map((t) => Math.max(t.length, 6));\n\n // Header row\n let header = ` ${padRight('Test ID', testIdWidth)}`;\n for (let i = 0; i < targets.length; i++) {\n header += ` ${padLeft(targets[i], targetWidths[i])}`;\n }\n lines.push(`${c.dim}${header}${c.reset}`);\n\n // Separator\n let sep = ` ${'─'.repeat(testIdWidth)}`;\n for (let i = 0; i < targets.length; i++) {\n sep += ` ${'─'.repeat(targetWidths[i])}`;\n }\n lines.push(`${c.dim}${sep}${c.reset}`);\n\n // Data rows\n for (const row of matrix) {\n let line = ` ${padRight(row.testId, testIdWidth)}`;\n for (let i = 0; i < targets.length; i++) {\n const score = row.scores[targets[i]];\n const scoreStr = score !== undefined ? score.toFixed(2) : ' --';\n // Highlight regressions vs baseline\n if (baselineTarget && targets[i] !== baselineTarget && score !== undefined) {\n const baselineScore = row.scores[baselineTarget];\n if (baselineScore !== undefined && score < baselineScore) {\n line += ` ${padLeft(`${c.red}${scoreStr}${c.reset}`, targetWidths[i])}`;\n } else if (baselineScore !== undefined && score > baselineScore) {\n line += ` ${padLeft(`${c.green}${scoreStr}${c.reset}`, targetWidths[i])}`;\n } else {\n line += ` ${padLeft(scoreStr, targetWidths[i])}`;\n }\n } else {\n line += ` ${padLeft(scoreStr, targetWidths[i])}`;\n }\n }\n lines.push(line);\n }\n\n // Pairwise summary\n if (pairwise.length > 0) {\n lines.push('');\n lines.push(`${c.bold}Pairwise Summary:${c.reset}`);\n\n const maxLabelLen = Math.max(\n ...pairwise.map((pw) => ` ${pw.baseline} → ${pw.candidate}:`.length),\n );\n for (const p of pairwise) {\n const { wins, losses, ties, meanDelta, meanNormalizedGain } = p.summary;\n const sign = meanDelta >= 0 ? '+' : '';\n const deltaColor = meanDelta > 0 ? c.green : meanDelta < 0 ? c.red : c.gray;\n const label = ` ${p.baseline} → ${p.candidate}:`;\n let pairLine = `${padRight(label, maxLabelLen)} ${wins} win${wins !== 1 ? 's' : ''}, ${losses} loss${losses !== 1 ? 'es' : ''}, ${ties} tie${ties !== 1 ? 's' : ''} (${c.bold}Δ${c.reset} ${deltaColor}${sign}${meanDelta.toFixed(3)}${c.reset}`;\n if (meanNormalizedGain != null) {\n const gColor = meanNormalizedGain > 0 ? c.green : meanNormalizedGain < 0 ? c.red : c.gray;\n const gSign = meanNormalizedGain >= 0 ? '+' : '';\n pairLine += `, ${c.bold}g${c.reset} ${gColor}${gSign}${meanNormalizedGain.toFixed(3)}${c.reset}`;\n }\n pairLine += ')';\n lines.push(pairLine);\n }\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\nexport const compareCommand = command({\n name: 'compare',\n description:\n 'Compare evaluation run manifests: two-run pairwise, single-run pairwise, or N-way matrix',\n args: {\n results: restPositionals({\n type: string,\n displayName: 'results',\n description:\n 'Run workspace or run manifest path(s). One source: single-run mode. Two sources: pairwise mode.',\n }),\n threshold: option({\n type: optional(number),\n long: 'threshold',\n short: 't',\n description: 'Score delta threshold for win/loss classification (default: 0.1)',\n }),\n baseline: option({\n type: optional(string),\n long: 'baseline',\n short: 'b',\n description: 'Target name to use as baseline (filters a single run manifest)',\n }),\n candidate: option({\n type: optional(string),\n long: 'candidate',\n short: 'c',\n description: 'Target name to use as candidate (filters a single run manifest)',\n }),\n targets: multioption({\n type: array(string),\n long: 'targets',\n description: 'Target names to include in matrix comparison (repeatable)',\n }),\n format: option({\n type: optional(oneOf(['table', 'json'])),\n long: 'format',\n short: 'f',\n description: 'Output format: table (default, human-readable) or json (machine-readable)',\n }),\n json: flag({\n long: 'json',\n description: 'Output JSON format (shorthand for --format=json)',\n }),\n },\n handler: async ({ results, threshold, baseline, candidate, targets, format, json }) => {\n const effectiveThreshold = threshold ?? 0.1;\n const outputFormat = json ? 'json' : (format ?? 'table');\n\n try {\n if (results.length === 0) {\n throw new Error('At least one run workspace or run manifest is required');\n }\n\n if (results.length === 2) {\n // Two-file pairwise mode (existing behavior)\n const results1 = loadJsonlResults(results[0]);\n const results2 = loadJsonlResults(results[1]);\n const comparison = compareResults(results1, results2, effectiveThreshold);\n\n if (outputFormat === 'json') {\n console.log(JSON.stringify(toSnakeCaseDeep(comparison), null, 2));\n } else {\n console.log(formatTable(comparison, results[0], results[1]));\n }\n\n const exitCode = determineExitCode(comparison.summary.meanDelta);\n process.exit(exitCode);\n } else if (results.length === 1) {\n // Single-run manifest mode\n let groups = loadCombinedResults(results[0]);\n\n // Filter by --targets if specified\n if (targets.length > 0) {\n const filtered = new Map<string, EvalResult[]>();\n for (const t of targets) {\n const group = groups.get(t);\n if (group) {\n filtered.set(t, group);\n }\n }\n if (filtered.size === 0) {\n const available = [...groups.keys()].join(', ');\n throw new Error(\n `None of the specified targets found in results. Available targets: ${available}`,\n );\n }\n groups = filtered;\n }\n\n // Validate --baseline target exists in (possibly filtered) groups\n if (baseline && !groups.has(baseline)) {\n const available = [...groups.keys()].join(', ');\n throw new Error(\n `Baseline target \"${baseline}\" not found in results. Available targets: ${available}`,\n );\n }\n\n if (candidate && !baseline) {\n throw new Error(\n '--candidate requires --baseline. Use both flags for pairwise comparison.',\n );\n }\n\n if (baseline && candidate) {\n // Pairwise mode from a single run manifest\n const baselineResults = groups.get(baseline);\n const candidateResults = groups.get(candidate);\n if (!baselineResults) {\n throw new Error(`Baseline target \"${baseline}\" not found in results`);\n }\n if (!candidateResults) {\n throw new Error(`Candidate target \"${candidate}\" not found in results`);\n }\n\n const comparison = compareResults(baselineResults, candidateResults, effectiveThreshold);\n\n if (outputFormat === 'json') {\n console.log(JSON.stringify(toSnakeCaseDeep(comparison), null, 2));\n } else {\n console.log(formatTable(comparison, baseline, candidate));\n }\n\n const exitCode = determineExitCode(comparison.summary.meanDelta);\n process.exit(exitCode);\n } else {\n // N-way matrix mode\n const matrixOutput = compareMatrix(groups, effectiveThreshold);\n\n if (outputFormat === 'json') {\n console.log(JSON.stringify(toSnakeCaseDeep(matrixOutput), null, 2));\n } else {\n console.log(formatMatrix(matrixOutput, baseline));\n }\n\n const exitCode = determineMatrixExitCode(matrixOutput, baseline);\n process.exit(exitCode);\n }\n } else {\n throw new Error('Expected 1 or 2 run workspaces or run manifests');\n }\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n },\n});\n","import { readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { command, option, optional, positional, string } from 'cmd-ts';\nimport { stringify as stringifyYaml } from 'yaml';\n\nimport { HtmlWriter } from '../eval/html-writer.js';\nimport { readAgentSkillsEvalsFile } from '../read-adapters/agent-skills-evals.js';\n\nfunction quoteYamlString(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction normalizeLineEndings(value: string): string {\n return value.replace(/\\r\\n?/g, '\\n');\n}\n\nasync function convertJsonlToHtml(inputPath: string, outputPath: string): Promise<number> {\n const content = readFileSync(inputPath, 'utf8');\n const lines = content\n .trim()\n .split('\\n')\n .filter((line) => line.trim());\n\n const writer = await HtmlWriter.open(outputPath);\n for (const line of lines) {\n await writer.append(JSON.parse(line));\n }\n await writer.close();\n return lines.length;\n}\n\nfunction convertJsonlToYaml(inputPath: string, outputPath: string): number {\n const content = readFileSync(inputPath, 'utf8');\n const lines = content\n .trim()\n .split('\\n')\n .filter((line) => line.trim());\n\n let yamlOutput = '';\n let isFirst = true;\n\n for (const line of lines) {\n const record = JSON.parse(line);\n const yamlDoc = stringifyYaml(record, {\n indent: 2,\n lineWidth: 0,\n });\n\n const normalizedYaml = normalizeLineEndings(yamlDoc);\n const separator = isFirst ? '---\\n' : '\\n---\\n';\n isFirst = false;\n yamlOutput += separator + normalizedYaml;\n }\n\n writeFileSync(outputPath, yamlOutput);\n return lines.length;\n}\n\n/**\n * Convert an Agent Skills evals.json file into an AgentV EVAL.yaml.\n * Returns the YAML string.\n */\nexport function convertEvalsJsonToYaml(inputPath: string): string {\n const suite = readAgentSkillsEvalsFile(inputPath);\n const lines: string[] = [];\n\n lines.push('# Converted from Agent Skills evals.json');\n lines.push('# See: https://agentskills.io/skill-creation/evaluating-skills');\n lines.push('# Agent Skills expected_output is treated as expected outcome/rubric context,');\n lines.push('# not as AgentV expected_output reference data.');\n lines.push('#');\n lines.push('# AgentV features you can add:');\n lines.push('# - type: is-json, contains, regex for deterministic graders');\n lines.push('# - type: script for custom scoring scripts');\n lines.push('# - type: llm-rubric value arrays with weights and score ranges for rubrics');\n lines.push('# - Multi-turn conversations via input message arrays');\n lines.push('# - Multiple assert entries with weighted scoring');\n lines.push('# - Workspace isolation with repos and hooks');\n lines.push('');\n\n lines.push(`description: ${quoteYamlString(`Evals for ${suite.skillName} skill`)}`);\n lines.push('tags:');\n lines.push(` skill: ${quoteYamlString(suite.skillName)}`);\n lines.push('metadata:');\n lines.push(' source_adapter: \"agent-skills-evals-json\"');\n lines.push('');\n\n lines.push('tests:');\n\n for (const test of suite.tests) {\n lines.push(` - id: \"${test.id}\"`);\n lines.push('');\n\n // Emit criteria from Agent Skills expected_output.\n if (test.expectedOutcome) {\n lines.push(' criteria: |-');\n for (const line of test.expectedOutcome.split('\\n')) {\n lines.push(` ${line}`);\n }\n lines.push('');\n }\n\n // Emit input as shorthand so input_files can attach to the same user prompt.\n if (test.prompt.includes('\\n')) {\n lines.push(' input: |-');\n for (const line of test.prompt.split('\\n')) {\n lines.push(` ${line}`);\n }\n } else {\n lines.push(` input: ${quoteYamlString(test.prompt)}`);\n }\n lines.push('');\n\n if (test.files.length > 0) {\n lines.push(' input_files:');\n for (const file of test.files) {\n lines.push(` - ${quoteYamlString(file)}`);\n }\n lines.push('');\n }\n\n // Emit expected_output / assertions / expectations as rubric criteria.\n if (test.criteria.length > 0) {\n lines.push(\n ' # Promoted from evals.json expected_output, assertions[], and expectations[]',\n );\n lines.push(' # Replace with type: is-json, contains, or regex for deterministic checks');\n lines.push(' assert:');\n lines.push(' - metric: agent-skills-criteria');\n lines.push(' type: llm-rubric');\n lines.push(' value:');\n for (const criterion of test.criteria) {\n lines.push(` - id: ${quoteYamlString(criterion.id)}`);\n lines.push(` outcome: ${quoteYamlString(criterion.outcome)}`);\n lines.push(' required: true');\n }\n lines.push('');\n }\n }\n\n return `${lines.join('\\n')}\\n`;\n}\n\nexport const convertCommand = command({\n name: 'convert',\n description: 'Convert between evaluation formats (JSONL→YAML, JSONL→HTML, evals.json→EVAL.yaml)',\n args: {\n input: positional({\n type: string,\n displayName: 'input',\n description: 'Path to input file (.jsonl or .json)',\n }),\n out: option({\n type: optional(string),\n long: 'out',\n short: 'o',\n description: 'Output file path (defaults to stdout for evals.json, .yaml or .html for JSONL)',\n }),\n },\n handler: async ({ input, out }) => {\n const ext = path.extname(input).toLowerCase();\n\n if (ext === '.json') {\n try {\n const yaml = convertEvalsJsonToYaml(input);\n if (out) {\n writeFileSync(out, yaml);\n console.log(`Converted to ${path.resolve(out)}`);\n } else {\n process.stdout.write(yaml);\n }\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n return;\n }\n\n if (ext === '.jsonl') {\n const outExt = out ? path.extname(out).toLowerCase() : '.yaml';\n if (outExt === '.html' || outExt === '.htm') {\n const outputPath = out ?? input.replace(/\\.jsonl$/, '.html');\n try {\n const count = await convertJsonlToHtml(input, outputPath);\n console.log(`Converted ${count} records to ${path.resolve(outputPath)}`);\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n return;\n }\n const outputPath = out ?? input.replace(/\\.jsonl$/, '.yaml');\n try {\n const count = convertJsonlToYaml(input, outputPath);\n console.log(`Converted ${count} records to ${path.resolve(outputPath)}`);\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n return;\n }\n\n console.error(`Error: Unsupported input format '${ext}'. Supported: .json, .jsonl`);\n process.exit(1);\n },\n});\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { Mutex } from 'async-mutex';\n\nimport type { EvaluationResult } from '@agentv/core';\n\nexport class HtmlWriter {\n private readonly filePath: string;\n private readonly results: EvaluationResult[] = [];\n private readonly mutex = new Mutex();\n private closed = false;\n private isLive = true;\n\n private constructor(filePath: string) {\n this.filePath = filePath;\n }\n\n static async open(filePath: string): Promise<HtmlWriter> {\n await mkdir(path.dirname(filePath), { recursive: true });\n const writer = new HtmlWriter(filePath);\n await writer.writeHtml();\n return writer;\n }\n\n async append(result: EvaluationResult): Promise<void> {\n await this.mutex.runExclusive(async () => {\n if (this.closed) {\n throw new Error('Cannot write to closed HTML writer');\n }\n this.results.push(result);\n await this.writeHtml();\n });\n }\n\n async close(): Promise<void> {\n await this.mutex.runExclusive(async () => {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.isLive = false;\n await this.writeHtml();\n });\n }\n\n private async writeHtml(): Promise<void> {\n const html = generateHtml(this.results, this.isLive);\n await writeFile(this.filePath, html, 'utf8');\n }\n}\n\nfunction generateHtml(results: readonly EvaluationResult[], isLive: boolean): string {\n // Strip heavy fields to keep file size manageable\n const lightResults = results.map((r) => {\n const { requests, trace, ...rest } = r as EvaluationResult & Record<string, unknown>;\n return rest;\n });\n // Escape </script> in JSON to prevent breaking out of script tag\n const dataJson = JSON.stringify(lightResults).replace(/<\\//g, '<\\\\/');\n const metaRefresh = isLive ? ' <meta http-equiv=\"refresh\" content=\"2\">\\n' : '';\n const liveIndicator = isLive\n ? '<span class=\"live-badge\">\\u25CF LIVE</span>'\n : `<span class=\"timestamp\">${escapeHtml(new Date().toISOString())}</span>`;\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n${metaRefresh} <title>AgentV Evaluation Report</title>\n <style>\n${STYLES}\n </style>\n</head>\n<body>\n <header class=\"header\">\n <div class=\"header-left\">\n <h1 class=\"header-title\" aria-label=\"AgentV\">\n <span class=\"brand-letter\" aria-hidden=\"true\">A</span><span class=\"brand-middle\" aria-hidden=\"true\">GENT</span><span class=\"brand-letter\" aria-hidden=\"true\">V</span>\n </h1>\n <span class=\"header-subtitle\">Evaluation Report</span>\n </div>\n <div class=\"header-right\">${liveIndicator}</div>\n </header>\n <nav class=\"tabs\" id=\"tabs\">\n <button class=\"tab active\" data-tab=\"overview\">Overview</button>\n <button class=\"tab\" data-tab=\"tests\">Test Cases</button>\n </nav>\n <main id=\"app\"></main>\n <script>\n var DATA = ${dataJson};\n var IS_LIVE = ${String(isLive)};\n${SCRIPT}\n </script>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\n// ---------------------------------------------------------------------------\n// Embedded CSS\n// ---------------------------------------------------------------------------\nconst STYLES = `\n*{margin:0;padding:0;box-sizing:border-box}\n:root{\n --bg:#f6f8fa;--surface:#fff;--border:#d0d7de;--border-light:#e8ebee;\n --text:#1f2328;--text-muted:#656d76;--brand-middle:#656d76;\n --primary:#0969da;--primary-bg:#ddf4ff;\n --success:#1a7f37;--success-bg:#dafbe1;\n --danger:#cf222e;--danger-bg:#ffebe9;\n --warning:#9a6700;--warning-bg:#fff8c5;\n --radius:6px;\n --shadow:0 1px 3px rgba(31,35,40,.04),0 1px 2px rgba(31,35,40,.06);\n --font:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Noto Sans\",Helvetica,Arial,sans-serif;\n --mono:ui-monospace,SFMono-Regular,\"SF Mono\",Menlo,Consolas,monospace;\n}\nbody{font-family:var(--font);background:var(--bg);color:var(--text);line-height:1.5;font-size:14px}\n\n/* Header */\n.header{background:var(--surface);border-bottom:1px solid var(--border);padding:12px 24px;display:flex;align-items:center;justify-content:space-between}\n.header-left{display:flex;align-items:baseline;gap:12px}\n.header-title{font-size:18px;font-weight:600}\n.brand-letter{color:var(--primary)}\n.brand-middle{color:var(--brand-middle)}\n.header-subtitle{font-size:14px;color:var(--text-muted)}\n.live-badge{color:var(--success);font-size:12px;font-weight:600;animation:pulse 2s infinite}\n@keyframes pulse{0%,100%{opacity:1}50%{opacity:.4}}\n.timestamp{font-size:12px;color:var(--text-muted);font-family:var(--mono)}\n\n/* Tabs */\n.tabs{background:var(--surface);border-bottom:1px solid var(--border);padding:0 24px;display:flex}\n.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}\n.tab:hover{color:var(--text)}\n.tab.active{color:var(--text);font-weight:600;border-bottom-color:var(--primary)}\n\n#app{max-width:1280px;margin:0 auto;padding:24px}\n\n/* Stat cards */\n.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:12px;margin-bottom:24px}\n.stat-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:16px;text-align:center;box-shadow:var(--shadow)}\n.stat-card.pass .stat-value{color:var(--success)}\n.stat-card.fail .stat-value{color:var(--danger)}\n.stat-card.error .stat-value{color:var(--danger)}\n.stat-card.warn .stat-value{color:var(--warning)}\n.stat-card.total .stat-value{color:var(--primary)}\n.stat-value{font-size:28px;font-weight:700;line-height:1.2}\n.stat-label{font-size:12px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;margin-top:4px}\n\n/* Sections */\n.section{margin-bottom:24px}\n.section-title{font-size:16px;font-weight:600;margin-bottom:12px}\n\n/* Tables */\n.table-wrap{overflow-x:auto;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow)}\n.data-table{width:100%;border-collapse:collapse;font-size:13px}\n.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}\n.data-table th.sortable{cursor:pointer;user-select:none}\n.data-table th.sortable:hover{color:var(--text)}\n.data-table td{padding:8px 12px;border-bottom:1px solid var(--border-light);vertical-align:middle}\n.data-table tbody tr:last-child td{border-bottom:none}\n\n/* Status icons */\n.status-icon{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;font-size:12px;font-weight:700}\n.status-icon.pass{background:var(--success-bg);color:var(--success)}\n.status-icon.fail{background:var(--danger-bg);color:var(--danger)}\n.status-icon.error{background:var(--warning-bg);color:var(--warning)}\n\n/* Score colors */\n.score-high{color:var(--success);font-weight:600}\n.score-mid{color:var(--warning);font-weight:600}\n.score-low{color:var(--danger);font-weight:600}\n\n/* Pass-rate bar */\n.bar-bg{width:100px;height:8px;background:var(--border-light);border-radius:4px;overflow:hidden}\n.bar-fill{height:100%;border-radius:4px;transition:width .3s}\n.bar-fill.score-high{background:var(--success)}\n.bar-fill.score-mid{background:var(--warning)}\n.bar-fill.score-low{background:var(--danger)}\n\n/* Histogram */\n.histogram{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:16px;box-shadow:var(--shadow)}\n.hist-row{display:flex;align-items:center;gap:12px;margin-bottom:8px}\n.hist-row:last-child{margin-bottom:0}\n.hist-label{width:60px;font-size:12px;color:var(--text-muted);text-align:right;flex-shrink:0}\n.hist-bar-bg{flex:1;height:20px;background:var(--border-light);border-radius:3px;overflow:hidden}\n.hist-bar{height:100%;border-radius:3px;transition:width .3s}\n.hist-count{width:30px;font-size:12px;color:var(--text-muted);text-align:right;flex-shrink:0}\n\n/* Filters */\n.filter-bar{display:flex;gap:8px;margin-bottom:16px;align-items:center;flex-wrap:wrap}\n.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)}\n.filter-search{flex:1;min-width:200px}\n.filter-count{font-size:12px;color:var(--text-muted);margin-left:auto}\n\n/* Test rows */\n.test-row{cursor:pointer;transition:background .1s}\n.test-row:hover{background:var(--bg)!important}\n.test-row.expanded{background:var(--primary-bg)!important}\n.expand-col{width:32px;text-align:center}\n.expand-icon{color:var(--text-muted);font-size:12px}\n.fw-medium{font-weight:500}\n.text-pass{color:var(--success)}.text-fail{color:var(--danger)}.text-error{color:var(--warning)}\n\n/* Detail panel */\n.detail-row td{padding:0!important;background:var(--bg)!important}\n.detail-panel{padding:16px 24px}\n.detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px}\n.detail-block h4{font-size:12px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.3px;margin-bottom:6px}\n.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}\n.detail-panel h4{font-size:13px;font-weight:600;margin:16px 0 8px}\n.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}\n.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)}\n.eval-table td{padding:8px 10px;border-bottom:1px solid var(--border-light)}\n.reasoning-cell{max-width:500px;font-size:12px;color:var(--text-muted)}\n.expect-list{list-style:none;padding:0;margin-bottom:12px}\n.expect-list li{padding:4px 8px 4px 24px;position:relative;font-size:13px}\n.expect-list.pass li::before{content:\"\\\\2713\";position:absolute;left:4px;color:var(--success);font-weight:700}\n.expect-list.fail li::before{content:\"\\\\2717\";position:absolute;left:4px;color:var(--danger);font-weight:700}\n.error-box{background:var(--danger-bg);border:1px solid var(--danger);border-radius:var(--radius);padding:12px;margin-bottom:12px}\n.error-box h4{color:var(--danger);margin:0 0 6px}\n.error-box pre{font-family:var(--mono);font-size:12px;white-space:pre-wrap;word-break:break-word}\n.detail-meta{font-size:12px;color:var(--text-muted);margin-top:12px;padding-top:12px;border-top:1px solid var(--border-light)}\n.empty-state{text-align:center;padding:48px 24px;color:var(--text-muted)}\n.empty-state h3{font-size:16px;margin-bottom:8px;color:var(--text)}\n`;\n\n// ---------------------------------------------------------------------------\n// Embedded JavaScript (no template literals — all string concatenation)\n// ---------------------------------------------------------------------------\nconst SCRIPT = `\n(function(){\n /* ---- helpers ---- */\n function esc(s){\n if(s==null)return\"\";\n return String(s).replace(/&/g,\"&\").replace(/</g,\"<\").replace(/>/g,\">\").replace(/\"/g,\""\");\n }\n function getStatus(r){\n if(r.executionStatus===\"execution_error\")return\"error\";\n if(r.executionStatus===\"quality_failure\")return\"fail\";\n if(r.executionStatus===\"ok\")return\"pass\";\n if(r.error)return\"error\";\n return r.score>=0.5?\"pass\":\"fail\";\n }\n function sIcon(s){\n if(s===\"pass\")return'<span class=\"status-icon pass\">\\\\u2713</span>';\n if(s===\"fail\")return'<span class=\"status-icon fail\">\\\\u2717</span>';\n return'<span class=\"status-icon error\">!</span>';\n }\n function fmtDur(ms){\n if(ms==null)return\"\\\\u2014\";\n if(ms<1000)return ms+\"ms\";\n if(ms<60000)return(ms/1000).toFixed(1)+\"s\";\n return Math.floor(ms/60000)+\"m \"+Math.round((ms%60000)/1000)+\"s\";\n }\n function fmtTok(n){\n if(n==null)return\"\\\\u2014\";\n if(n>=1e6)return(n/1e6).toFixed(1)+\"M\";\n if(n>=1e3)return(n/1e3).toFixed(1)+\"K\";\n return String(n);\n }\n function fmtCost(u){if(u==null)return\"\\\\u2014\";if(u<0.01)return\"<$0.01\";return\"$\"+u.toFixed(2);}\n function fmtPct(v){if(v==null)return\"\\\\u2014\";return(v*100).toFixed(1)+\"%\";}\n function sCls(v){if(v==null)return\"\";if(v>=0.9)return\"score-high\";if(v>=0.5)return\"score-mid\";return\"score-low\";}\n\n /* ---- compute stats ---- */\n function computeStats(d){\n var t=d.length,p=0,f=0,e=0,dur=0,ti=0,to=0,cost=0,sc=[];\n for(var i=0;i<d.length;i++){\n var r=d[i],s=getStatus(r);\n if(s===\"pass\")p++;else if(s===\"fail\")f++;else e++;\n if(r.durationMs)dur+=r.durationMs;\n if(r.tokenUsage){ti+=(r.tokenUsage.input||0);to+=(r.tokenUsage.output||0);}\n if(r.costUsd)cost+=r.costUsd;\n if(s!==\"error\")sc.push(r.score);\n }\n var g=t-e;\n 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};\n }\n function computeTargets(d){\n var m={};\n for(var i=0;i<d.length;i++){\n var r=d[i],tgt=r.target||\"unknown\";\n if(!m[tgt])m[tgt]={target:tgt,results:[],p:0,f:0,e:0,ts:0,sc:0,dur:0,tok:0,cost:0};\n var o=m[tgt];o.results.push(r);\n var s=getStatus(r);\n if(s===\"pass\")o.p++;else if(s===\"fail\")o.f++;else o.e++;\n if(s!==\"error\"){o.ts+=r.score;o.sc++;}\n if(r.durationMs)o.dur+=r.durationMs;\n if(r.tokenUsage)o.tok+=(r.tokenUsage.input||0)+(r.tokenUsage.output||0);\n if(r.costUsd)o.cost+=r.costUsd;\n }\n var a=[];for(var k in m)a.push(m[k]);return a;\n }\n function getEvalNames(){\n var n={};\n for(var i=0;i<DATA.length;i++){\n var sc=DATA[i].scores;\n if(sc)for(var j=0;j<sc.length;j++)n[sc[j].name]=true;\n }\n return Object.keys(n);\n }\n function getEvalScore(r,name){\n if(!r.scores)return null;\n for(var i=0;i<r.scores.length;i++)if(r.scores[i].name===name)return r.scores[i].score;\n return null;\n }\n\n var stats=computeStats(DATA);\n var tgtStats=computeTargets(DATA);\n var tgtNames=tgtStats.map(function(t){return t.target;});\n\n /* ---- state ---- */\n var state={tab:\"overview\",filter:{status:\"all\",target:\"all\",search:\"\"},sort:{col:\"testId\",dir:\"asc\"},expanded:{}};\n\n /* ---- DOM refs ---- */\n var app=document.getElementById(\"app\");\n var tabBtns=document.querySelectorAll(\".tab\");\n\n /* ---- tabs ---- */\n function setTab(t){\n state.tab=t;\n for(var i=0;i<tabBtns.length;i++)tabBtns[i].classList.toggle(\"active\",tabBtns[i].getAttribute(\"data-tab\")===t);\n render();\n }\n for(var i=0;i<tabBtns.length;i++){\n tabBtns[i].addEventListener(\"click\",(function(b){return function(){setTab(b.getAttribute(\"data-tab\"));};})(tabBtns[i]));\n }\n\n /* ---- render ---- */\n function render(){\n if(DATA.length===0){app.innerHTML='<div class=\"empty-state\"><h3>No results yet</h3><p>'+(IS_LIVE?\"Waiting for evaluation results\\\\u2026 Page will auto-refresh.\":\"Run an evaluation to generate results.\")+\"</p></div>\";return;}\n if(state.tab===\"overview\")renderOverview();else renderTests();\n }\n\n /* ---- stat card helper ---- */\n function card(label,value,type){\n return'<div class=\"stat-card '+type+'\"><div class=\"stat-value\">'+value+'</div><div class=\"stat-label\">'+label+\"</div></div>\";\n }\n\n /* ---- overview ---- */\n function renderOverview(){\n var h='<div class=\"stats-grid\">';\n h+=card(\"Total Tests\",stats.total,\"total\");\n h+=card(\"Passed\",stats.passed,\"pass\");\n h+=card(\"Failed\",stats.failed,\"fail\");\n h+=card(\"Errors\",stats.errors,\"error\");\n var prCls=stats.passRate>=0.9?\"pass\":stats.passRate>=0.5?\"warn\":\"fail\";\n h+=card(\"Pass Rate\",fmtPct(stats.passRate),prCls);\n h+=card(\"Duration\",fmtDur(stats.dur),\"neutral\");\n h+=card(\"Tokens\",fmtTok(stats.tokens),\"neutral\");\n h+=card(\"Est. Cost\",fmtCost(stats.cost),\"neutral\");\n h+=\"</div>\";\n\n /* targets table */\n if(tgtStats.length>1){\n h+='<div class=\"section\"><h2 class=\"section-title\">Targets</h2><div class=\"table-wrap\"><table class=\"data-table\">';\n 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>\";\n for(var i=0;i<tgtStats.length;i++){\n 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;\n 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>';\n h+='<td class=\"text-pass\">'+t.p+'</td><td class=\"text-fail\">'+t.f+'</td><td class=\"text-error\">'+t.e+\"</td>\";\n h+='<td class=\"'+sCls(avg)+'\">'+fmtPct(avg)+\"</td><td>\"+fmtDur(t.dur)+\"</td><td>\"+fmtTok(t.tok)+\"</td><td>\"+fmtCost(t.cost)+\"</td></tr>\";\n }\n h+=\"</tbody></table></div></div>\";\n }\n\n /* histogram */\n if(stats.scores.length>0){\n var bk=[0,0,0,0,0];\n for(var i=0;i<stats.scores.length;i++){var idx=Math.min(Math.floor(stats.scores[i]*5),4);bk[idx]++;}\n var mx=Math.max.apply(null,bk);\n var lb=[\"0\\\\u201320%\",\"20\\\\u201340%\",\"40\\\\u201360%\",\"60\\\\u201380%\",\"80\\\\u2013100%\"];\n h+='<div class=\"section\"><h2 class=\"section-title\">Score Distribution</h2><div class=\"histogram\">';\n for(var i=0;i<bk.length;i++){\n var pct=mx>0?(bk[i]/mx*100):0;\n 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>\";\n }\n h+=\"</div></div>\";\n }\n app.innerHTML=h;\n }\n\n /* ---- test cases ---- */\n function renderTests(){\n var evalNames=getEvalNames();\n var h='<div class=\"filter-bar\">';\n 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>';\n if(tgtNames.length>1){\n h+='<select id=\"flt-target\" class=\"filter-select\"><option value=\"all\">All Targets</option>';\n for(var i=0;i<tgtNames.length;i++)h+='<option value=\"'+esc(tgtNames[i])+'\">'+esc(tgtNames[i])+\"</option>\";\n h+=\"</select>\";\n }\n h+='<input type=\"text\" id=\"flt-search\" class=\"filter-search\" placeholder=\"Search tests...\" value=\"'+esc(state.filter.search)+'\">';\n h+='<span class=\"filter-count\" id=\"flt-count\"></span></div>';\n\n h+='<div class=\"table-wrap\"><table class=\"data-table\" id=\"test-tbl\"><thead><tr>';\n h+='<th class=\"expand-col\"></th>';\n h+=sHdr(\"Status\",\"status\");\n h+=sHdr(\"Test ID\",\"testId\");\n if(tgtNames.length>1)h+=sHdr(\"Target\",\"target\");\n h+=sHdr(\"Score\",\"score\");\n for(var i=0;i<evalNames.length;i++)h+=\"<th>\"+esc(evalNames[i])+\"</th>\";\n h+=sHdr(\"Duration\",\"durationMs\");\n h+=sHdr(\"Cost\",\"costUsd\");\n h+=\"</tr></thead><tbody id=\\\\\"test-body\\\\\"></tbody></table></div>\";\n app.innerHTML=h;\n\n /* wire events */\n var selS=document.getElementById(\"flt-status\");\n selS.value=state.filter.status;\n selS.addEventListener(\"change\",function(e){state.filter.status=e.target.value;renderRows();});\n var selT=document.getElementById(\"flt-target\");\n if(selT){selT.value=state.filter.target;selT.addEventListener(\"change\",function(e){state.filter.target=e.target.value;renderRows();});}\n document.getElementById(\"flt-search\").addEventListener(\"input\",function(e){state.filter.search=e.target.value;renderRows();});\n var ths=document.querySelectorAll(\"th[data-sort]\");\n for(var i=0;i<ths.length;i++){\n ths[i].addEventListener(\"click\",(function(th){return function(){\n var c=th.getAttribute(\"data-sort\");\n if(state.sort.col===c)state.sort.dir=state.sort.dir===\"asc\"?\"desc\":\"asc\";\n else{state.sort.col=c;state.sort.dir=\"asc\";}\n renderTests();\n };})(ths[i]));\n }\n renderRows();\n }\n\n function sHdr(label,col){\n var arrow=\"\";\n if(state.sort.col===col)arrow=state.sort.dir===\"asc\"?\" \\\\u2191\":\" \\\\u2193\";\n return'<th class=\"sortable\" data-sort=\"'+col+'\">'+label+arrow+\"</th>\";\n }\n\n function filtered(){\n var out=[];\n for(var i=0;i<DATA.length;i++){\n var r=DATA[i],s=getStatus(r);\n if(state.filter.status!==\"all\"&&s!==state.filter.status)continue;\n if(state.filter.target!==\"all\"&&r.target!==state.filter.target)continue;\n if(state.filter.search&&r.testId.toLowerCase().indexOf(state.filter.search.toLowerCase())===-1)continue;\n out.push(r);\n }\n var col=state.sort.col,dir=state.sort.dir===\"asc\"?1:-1;\n out.sort(function(a,b){\n var va=col===\"status\"?getStatus(a):a[col],vb=col===\"status\"?getStatus(b):b[col];\n if(va==null&&vb==null)return 0;if(va==null)return 1;if(vb==null)return-1;\n if(typeof va===\"string\")return va.localeCompare(vb)*dir;\n return(va-vb)*dir;\n });\n return out;\n }\n\n function renderRows(){\n var rows=filtered(),evalNames=getEvalNames();\n var tbody=document.getElementById(\"test-body\");\n var colSpan=5+evalNames.length+(tgtNames.length>1?1:0);\n document.getElementById(\"flt-count\").textContent=rows.length+\" of \"+DATA.length+\" tests\";\n var h=\"\";\n for(var i=0;i<rows.length;i++){\n var r=rows[i],s=getStatus(r),key=r.testId+\":\"+r.target,exp=!!state.expanded[key];\n h+='<tr class=\"test-row '+s+(exp?\" expanded\":\"\")+'\" data-key=\"'+esc(key)+'\">';\n h+='<td class=\"expand-col\"><span class=\"expand-icon\">'+(exp?\"\\\\u25BE\":\"\\\\u25B8\")+\"</span></td>\";\n h+=\"<td>\"+sIcon(s)+\"</td>\";\n h+='<td class=\"fw-medium\">'+esc(r.testId)+\"</td>\";\n if(tgtNames.length>1)h+=\"<td>\"+esc(r.target)+\"</td>\";\n h+='<td class=\"'+sCls(r.score)+'\">'+fmtPct(r.score)+\"</td>\";\n for(var j=0;j<evalNames.length;j++){\n var es=getEvalScore(r,evalNames[j]);\n h+='<td class=\"'+sCls(es)+'\">'+(es!=null?fmtPct(es):\"\\\\u2014\")+\"</td>\";\n }\n h+=\"<td>\"+fmtDur(r.durationMs)+\"</td><td>\"+fmtCost(r.costUsd)+\"</td></tr>\";\n if(exp)h+='<tr class=\"detail-row\"><td colspan=\"'+colSpan+'\">'+renderDetail(r)+\"</td></tr>\";\n }\n if(rows.length===0)h+='<tr><td colspan=\"'+colSpan+'\" class=\"empty-state\">No matching tests</td></tr>';\n tbody.innerHTML=h;\n\n /* row click */\n var trs=tbody.querySelectorAll(\".test-row\");\n for(var k=0;k<trs.length;k++){\n trs[k].addEventListener(\"click\",(function(tr){return function(){\n var key=tr.getAttribute(\"data-key\");\n state.expanded[key]=!state.expanded[key];\n renderRows();\n };})(trs[k]));\n }\n }\n\n /* ---- detail panel ---- */\n function renderDetail(r){\n var h='<div class=\"detail-panel\">';\n\n /* input / output */\n h+='<div class=\"detail-grid\">';\n if(r.input!=null){\n h+='<div class=\"detail-block\"><h4>Input</h4><pre class=\"detail-pre\">'+esc(JSON.stringify(r.input,null,2))+\"</pre></div>\";\n }\n h+='<div class=\"detail-block\"><h4>Output</h4><pre class=\"detail-pre\">'+esc(r.output?JSON.stringify(r.output,null,2):\"\")+\"</pre></div>\";\n h+=\"</div>\";\n\n /* grader results */\n if(r.scores&&r.scores.length>0){\n h+=\"<h4>Grader Results</h4>\";\n h+='<table class=\"eval-table\"><thead><tr><th>Grader</th><th>Score</th><th>Status</th><th>Assertions</th></tr></thead><tbody>';\n for(var i=0;i<r.scores.length;i++){\n var ev=r.scores[i],evS=ev.score>=0.5?\"pass\":\"fail\";\n var evAssertions=ev.assertions||[];\n var evSummary=evAssertions.map(function(a){return (a.passed?\"✓ \":\"✗ \")+a.text;}).join(\"; \");\n 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>\";\n }\n h+=\"</tbody></table>\";\n }\n\n /* assertions */\n var passedA=r.assertions?r.assertions.filter(function(a){return a.passed;}):[];\n var failedA=r.assertions?r.assertions.filter(function(a){return !a.passed;}):[];\n if(passedA.length>0){\n h+='<h4>Passed Assertions</h4><ul class=\"expect-list pass\">';\n 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>\";\n h+=\"</ul>\";\n }\n if(failedA.length>0){\n h+='<h4>Failed Assertions</h4><ul class=\"expect-list fail\">';\n 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>\";\n h+=\"</ul>\";\n }\n\n /* error */\n if(r.error)h+='<div class=\"error-box\"><h4>Error</h4><pre>'+esc(r.error)+\"</pre></div>\";\n\n /* metadata */\n h+='<div class=\"detail-meta\">';\n var m=[];\n if(r.tokenUsage)m.push(fmtTok(r.tokenUsage.input)+\" in / \"+fmtTok(r.tokenUsage.output)+\" out tokens\");\n if(r.durationMs)m.push(fmtDur(r.durationMs));\n if(r.target)m.push(r.target);\n if(r.costUsd)m.push(fmtCost(r.costUsd));\n if(r.timestamp)m.push(r.timestamp);\n h+=esc(m.join(\" \\\\u00B7 \"));\n h+=\"</div></div>\";\n return h;\n }\n\n /* ---- init ---- */\n render();\n})();\n`;\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { command, option, optional, positional, string } from 'cmd-ts';\n\nconst ASSERTION_TEMPLATES: Record<string, string> = {\n default: `#!/usr/bin/env bun\nimport { defineAssertion } from 'agentv';\n\nexport default defineAssertion(({ output }) => {\n // TODO: Implement your assertion logic\n const text = output ?? '';\n const pass = text.length > 0;\n return {\n pass,\n score: pass ? 1 : 0,\n reason: pass ? 'Output has content' : 'Output is empty',\n };\n});\n`,\n score: `#!/usr/bin/env bun\nimport { defineAssertion } from 'agentv';\n\nexport default defineAssertion(({ output }) => {\n // TODO: Implement your scoring logic (0.0 to 1.0)\n const text = output ?? '';\n const score = text.length > 0 ? 1.0 : 0.0;\n return {\n pass: score >= 0.5,\n score,\n reason: score === 1.0 ? 'Output has content' : 'Output is empty',\n checks: [\n {\n text: 'Output has content',\n pass: score === 1.0,\n reason: score === 1.0 ? 'Output is non-empty' : 'Output is empty',\n },\n ],\n };\n});\n`,\n};\n\nconst EVAL_TEMPLATES: Record<string, (name: string) => string> = {\n default: (name: string) => `description: ${name} evaluation suite\nproviders:\n - default\n\ntests:\n - id: sample-test\n criteria: Agent responds correctly\n input: \"Hello, how are you?\"\n expected_output: \"I'm doing well\"\n assert:\n - type: contains\n value: \"well\"\n`,\n rubric: (name: string) => `description: ${name} evaluation suite\nproviders:\n - default\n\ntests:\n - id: sample-test\n criteria: Agent responds correctly and completely\n input: \"Hello, how are you?\"\n expected_output: \"I'm doing well, thank you for asking!\"\n assert:\n - metric: response-quality\n type: llm-rubric\n value:\n - id: accuracy\n outcome: Response is factually correct\n weight: 0.6\n - id: completeness\n outcome: Response addresses all parts of the question\n weight: 0.4\n`,\n};\n\nconst PROVIDER_TEMPLATE = `#!/usr/bin/env bun\n/**\n * Custom provider scaffold.\n *\n * AgentV providers are configured via .agentv/providers.yaml using the CLI provider:\n *\n * providers:\n * - id: cli\n * label: my-provider\n * command: \"bun run .agentv/providers/<name>.ts {PROMPT}\"\n *\n * This script receives the prompt as a CLI argument and prints the response to stdout.\n */\n\nconst prompt = process.argv[2];\n\nif (!prompt) {\n console.error('Usage: bun run provider.ts \"<prompt>\"');\n process.exit(1);\n}\n\n// TODO: Replace with your LLM API call or custom logic\nconst response = \\`Echo: \\${prompt}\\`;\n\nconsole.log(response);\n`;\n\nconst EVAL_CASES_TEMPLATE = `{\"id\":\"case-1\",\"criteria\":\"Responds helpfully\",\"input\":\"What is 2+2?\",\"expected_output\":\"4\"}\n`;\n\nexport const createAssertionCommand = command({\n name: 'assertion',\n description: 'Create a custom assertion scaffold',\n args: {\n name: positional({\n type: string,\n displayName: 'name',\n description: 'Name of the assertion (e.g., sentiment)',\n }),\n template: option({\n type: optional(string),\n long: 'template',\n description: `Template variant (${Object.keys(ASSERTION_TEMPLATES).join(', ')})`,\n }),\n },\n handler: async ({ name, template }) => {\n const templateName = template ?? 'default';\n const content = ASSERTION_TEMPLATES[templateName];\n if (!content) {\n console.error(\n `Unknown template \"${templateName}\". Available: ${Object.keys(ASSERTION_TEMPLATES).join(', ')}`,\n );\n process.exit(1);\n }\n\n const dir = path.join(process.cwd(), '.agentv', 'assertions');\n const filePath = path.join(dir, `${name}.ts`);\n\n await mkdir(dir, { recursive: true });\n await writeFile(filePath, content);\n console.log(`Created ${path.relative(process.cwd(), filePath)} (template: ${templateName})`);\n console.log(`\\nUse in EVAL.yaml:\\n assert:\\n - type: ${name}`);\n },\n});\n\nexport const createProviderCommand = command({\n name: 'provider',\n description: 'Create a custom provider scaffold',\n args: {\n name: positional({\n type: string,\n displayName: 'name',\n description: 'Name of the provider (e.g., my-llm)',\n }),\n template: option({\n type: optional(string),\n long: 'template',\n description: 'Template variant (default)',\n }),\n },\n handler: async ({ name, template }) => {\n const templateName = template ?? 'default';\n if (templateName !== 'default') {\n console.error(`Unknown template \"${templateName}\". Available: default`);\n process.exit(1);\n }\n\n const dir = path.join(process.cwd(), '.agentv', 'providers');\n const filePath = path.join(dir, `${name}.ts`);\n\n await mkdir(dir, { recursive: true });\n await writeFile(filePath, PROVIDER_TEMPLATE);\n console.log(`Created ${path.relative(process.cwd(), filePath)} (template: ${templateName})`);\n console.log(\n `\\nConfigure in .agentv/providers.yaml:\\n providers:\\n - id: cli\\n label: ${name}\\n command: \"bun run .agentv/providers/${name}.ts {PROMPT}\"`,\n );\n },\n});\n\nexport const createEvalCommand = command({\n name: 'eval',\n description: 'Create an eval suite scaffold',\n args: {\n name: positional({\n type: string,\n displayName: 'name',\n description: 'Name of the eval suite (e.g., my-agent)',\n }),\n template: option({\n type: optional(string),\n long: 'template',\n description: `Template variant (${Object.keys(EVAL_TEMPLATES).join(', ')})`,\n }),\n },\n handler: async ({ name, template }) => {\n const templateName = template ?? 'default';\n const templateFn = EVAL_TEMPLATES[templateName];\n if (!templateFn) {\n console.error(\n `Unknown template \"${templateName}\". Available: ${Object.keys(EVAL_TEMPLATES).join(', ')}`,\n );\n process.exit(1);\n }\n\n const dir = path.join(process.cwd(), 'evals');\n const yamlPath = path.join(dir, `${name}.eval.yaml`);\n const casesPath = path.join(dir, `${name}.cases.jsonl`);\n\n await mkdir(dir, { recursive: true });\n await writeFile(yamlPath, templateFn(name));\n await writeFile(casesPath, EVAL_CASES_TEMPLATE);\n console.log(`Created ${path.relative(process.cwd(), yamlPath)} (template: ${templateName})`);\n console.log(`Created ${path.relative(process.cwd(), casesPath)}`);\n console.log(`\\nRun with:\\n agentv eval ${path.relative(process.cwd(), yamlPath)}`);\n },\n});\n","import { subcommands } from 'cmd-ts';\n\nimport { createAssertionCommand, createEvalCommand, createProviderCommand } from './commands.js';\n\nexport const createCommand = subcommands({\n name: 'create',\n description: 'Scaffold new AgentV components',\n cmds: {\n assertion: createAssertionCommand,\n eval: createEvalCommand,\n provider: createProviderCommand,\n },\n});\n","/**\n * `agentv doctor` — reports presence/absence of external dependencies.\n *\n * For each known external dep, checks whether the binary is on PATH (or in\n * ~/.agentv/bin/) and reports its version. Missing deps include an install hint.\n *\n * Exit codes:\n * 0 — all deps present\n * 1 — one or more deps missing\n */\n\nimport { execFileSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { command } from 'cmd-ts';\n\nimport { getAgentvConfigDir } from '@agentv/core';\n\ninterface DepCheck {\n name: string;\n description: string;\n installHint: string;\n}\n\nconst DEPS: DepCheck[] = [];\n\nfunction findBinary(name: string): string | undefined {\n // Check ~/.agentv/bin first (installed by agentv install)\n const localBin = path.join(getAgentvConfigDir(), 'bin', name);\n if (existsSync(localBin)) return localBin;\n\n // Fall back to PATH\n const pathDirs = (process.env.PATH ?? '').split(path.delimiter);\n for (const dir of pathDirs) {\n const candidate = path.join(dir, name);\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction getBinaryVersion(binaryPath: string): string {\n try {\n const output = execFileSync(binaryPath, ['--version'], { stdio: 'pipe', encoding: 'utf-8' });\n return output.trim().split('\\n')[0] ?? 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\nexport const doctorCommand = command({\n name: 'doctor',\n description: 'Check external dependencies required by agentv',\n args: {},\n handler: () => {\n const binDir = path.join(getAgentvConfigDir(), 'bin');\n console.log('agentv doctor\\n');\n console.log(`Local bin dir: ${binDir}\\n`);\n\n let allPresent = true;\n\n for (const dep of DEPS) {\n const binaryPath = findBinary(dep.name);\n if (binaryPath) {\n const version = getBinaryVersion(binaryPath);\n console.log(` ✓ ${dep.name}`);\n console.log(` path: ${binaryPath}`);\n console.log(` version: ${version}`);\n console.log(` note: ${dep.description}`);\n } else {\n allPresent = false;\n console.log(` ✗ ${dep.name} (not found)`);\n console.log(` note: ${dep.description}`);\n console.log(` install: ${dep.installHint}`);\n }\n console.log();\n }\n\n if (!allPresent) {\n process.exit(1);\n }\n },\n});\n","import path from 'node:path';\nimport { command, positional, string } from 'cmd-ts';\n\nimport { aggregateRunDir } from '../artifact-writer.js';\n\nexport const evalAggregateCommand = command({\n name: 'aggregate',\n description:\n 'Recompute summary.json from a run directory. Deduplicates by (test_id, target), keeping the last entry.',\n args: {\n runDir: positional({\n type: string,\n displayName: 'run-dir',\n description: 'Path to a run directory containing a run manifest',\n }),\n },\n handler: async (args) => {\n const runDir = path.resolve(args.runDir);\n const { summaryPath, testCount, targetCount } = await aggregateRunDir(runDir);\n console.log(`Aggregated ${testCount} test result(s) across ${targetCount} target(s)`);\n console.log(` Summary: ${summaryPath}`);\n },\n});\n","import { readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { command, option, optional, positional, string } from 'cmd-ts';\nimport fg from 'fast-glob';\n\nimport { buildTraceFromMessages, executeScript } from '@agentv/core';\n\nexport const evalAssertCommand = command({\n name: 'assert',\n description: 'Run a single script grader assertion from .agentv/graders/ and print the score',\n args: {\n graderName: positional({\n type: string,\n displayName: 'name',\n description: 'Assertion name (matches filename without extension in .agentv/graders/)',\n }),\n agentOutput: option({\n type: optional(string),\n long: 'agent-output',\n description: \"The agent's full response text\",\n }),\n agentInput: option({\n type: optional(string),\n long: 'agent-input',\n description: 'The original user prompt',\n }),\n file: option({\n type: optional(string),\n long: 'file',\n description: 'Path to JSON file with { output, input } fields',\n }),\n },\n handler: async ({ graderName, agentOutput: output, agentInput: input, file }) => {\n let resolvedOutput: string;\n let resolvedInput: string;\n\n if (file) {\n const content = JSON.parse(readFileSync(path.resolve(file), 'utf8'));\n resolvedOutput = content.output ?? '';\n resolvedInput = content.input ?? '';\n } else {\n if (output === undefined) {\n console.error('Error: --agent-output is required (or use --file)');\n process.exit(1);\n }\n resolvedOutput = output;\n resolvedInput = input ?? '';\n }\n\n if (!/^[a-zA-Z0-9_-]+$/.test(graderName)) {\n console.error(\n `Error: Invalid grader name '${graderName}' — only letters, digits, hyphens, and underscores allowed`,\n );\n process.exit(1);\n }\n\n const scriptPath = await findGraderScript(graderName, process.cwd());\n if (!scriptPath) {\n console.error(\n `Error: Grader '${graderName}' not found in .agentv/graders/ (or .agentv/judges/)`,\n );\n process.exit(1);\n }\n\n // Build payload matching the script grader protocol (snake_case).\n const messages = [{ role: 'assistant' as const, content: resolvedOutput }];\n const inputMessages = [{ role: 'user' as const, content: resolvedInput }];\n const trace = buildTraceFromMessages({\n input: inputMessages,\n output: messages,\n finalOutput: resolvedOutput,\n });\n const payload = JSON.stringify(\n {\n output: resolvedOutput,\n answer: resolvedOutput,\n messages,\n input: inputMessages,\n question: resolvedInput,\n criteria: '',\n expected_output: [],\n input_files: [],\n trace,\n token_usage: null,\n cost_usd: null,\n duration_ms: null,\n start_time: null,\n end_time: null,\n file_changes: null,\n workspace_path: null,\n config: null,\n metadata: {},\n },\n null,\n 2,\n );\n\n try {\n const stdout = await executeScript(['bun', 'run', scriptPath], payload);\n const parsed = JSON.parse(stdout);\n const score = typeof parsed.score === 'number' ? parsed.score : 0;\n\n process.stdout.write(JSON.stringify(parsed, null, 2));\n process.stdout.write('\\n');\n process.exit(score >= 0.5 ? 0 : 1);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n },\n});\n\nasync function findGraderScript(graderName: string, startDir: string): Promise<string | null> {\n let dir = path.resolve(startDir);\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n // Search .agentv/graders/ first, then fall back to .agentv/judges/ for backward compat\n for (const subdir of ['graders', 'judges']) {\n const gradersDir = path.join(dir, '.agentv', subdir);\n const found = await fg([`${graderName}.{ts,js,mts,mjs}`], {\n cwd: gradersDir,\n absolute: true,\n onlyFiles: true,\n });\n if (found.length > 0) return found[0];\n }\n dir = path.dirname(dir);\n }\n\n return null;\n}\n","import path from 'node:path';\nimport {\n type EvalTargetRef,\n type EvalTargetSpec,\n type ProviderDefinition,\n loadTestSuite,\n readProviderDefinitions,\n} from '@agentv/core';\nimport { array, command, multioption, option, optional, positional, string } from 'cmd-ts';\n\nimport { discoverProvidersFile } from '../../../utils/providers.js';\nimport { loadEnvFromHierarchy } from '../env.js';\nimport { findRepoRoot, resolveEvalPaths } from '../shared.js';\nimport { readTestSuiteProvider } from '../targets.js';\nimport { type TaskBundleProviderSelection, materializeEvalBundle } from '../task-bundle.js';\n\nfunction unique(values: readonly string[]): readonly string[] {\n const result: string[] = [];\n const seen = new Set<string>();\n for (const value of values) {\n const trimmed = value.trim();\n if (!trimmed || seen.has(trimmed)) {\n continue;\n }\n seen.add(trimmed);\n result.push(trimmed);\n }\n return result;\n}\n\nfunction targetReferenceNames(target: ProviderDefinition): readonly string[] {\n const references: string[] = [];\n for (const key of ['use_target', 'grader_target'] as const) {\n const value = target[key];\n if (typeof value === 'string' && value.trim().length > 0 && !value.includes('${{')) {\n references.push(value.trim());\n }\n }\n\n const fallbackTargets = target.fallback_targets;\n if (Array.isArray(fallbackTargets)) {\n for (const value of fallbackTargets) {\n if (typeof value === 'string' && value.trim().length > 0 && !value.includes('${{')) {\n references.push(value.trim());\n }\n }\n }\n\n return references;\n}\n\nfunction ensureTargetGraph(\n providerLabel: string,\n definitions: readonly ProviderDefinition[],\n providersFilePath: string,\n): void {\n const byName = new Map(definitions.map((definition) => [definition.name, definition]));\n const seen = new Set<string>();\n\n function visit(name: string, requestedBy?: string): void {\n if (seen.has(name)) {\n return;\n }\n const definition = byName.get(name);\n if (!definition) {\n const available = definitions\n .map((entry) => entry.name)\n .sort()\n .join(', ');\n const owner = requestedBy ? ` referenced by provider '${requestedBy}'` : '';\n throw new Error(\n `Provider '${name}'${owner} not found in ${providersFilePath}. Available providers: ${available}`,\n );\n }\n seen.add(name);\n for (const referenceName of targetReferenceNames(definition)) {\n visit(referenceName, name);\n }\n }\n\n visit(providerLabel);\n}\n\nfunction definitionsWithEvalProviderRefs(\n definitions: readonly ProviderDefinition[],\n providerRefs: readonly EvalTargetRef[] | undefined,\n): readonly ProviderDefinition[] {\n if (!providerRefs) {\n return definitions;\n }\n\n const result = [...definitions];\n for (const ref of providerRefs) {\n if (ref.definition && !result.some((definition) => definition.name === ref.name)) {\n result.push(ref.definition);\n } else if (ref.use_target && !result.some((definition) => definition.name === ref.name)) {\n result.push({ name: ref.name, use_target: ref.use_target } as ProviderDefinition);\n }\n }\n return result;\n}\n\nfunction definitionsWithEvalTargetSpec(\n definitions: readonly ProviderDefinition[],\n targetSpec: EvalTargetSpec | undefined,\n): readonly ProviderDefinition[] {\n if (!targetSpec?.definition) {\n return definitions;\n }\n if (!targetSpec.extends) {\n return [\n targetSpec.definition,\n ...definitions.filter((definition) => definition.name !== targetSpec.name),\n ];\n }\n const base = definitions.find((definition) => definition.name === targetSpec.extends);\n if (!base) {\n const available = definitions.map((definition) => definition.name).join(', ');\n throw new Error(\n `Provider '${targetSpec.extends}' not found for eval-local provider '${targetSpec.name}'. Available providers: ${available}`,\n );\n }\n const effective = {\n ...base,\n ...targetSpec.definition,\n name: targetSpec.name,\n } as ProviderDefinition;\n return [effective, ...definitions.filter((definition) => definition.name !== targetSpec.name)];\n}\n\nfunction buildBundleRuntime(options: {\n readonly providerLabels: readonly string[];\n readonly budgetUsd?: number;\n readonly threshold?: number;\n}): Record<string, unknown> {\n const runtime: Record<string, unknown> =\n options.providerLabels.length > 0 ? { providers: options.providerLabels } : {};\n if (options.budgetUsd !== undefined) {\n runtime.budget_usd = options.budgetUsd;\n }\n if (options.threshold !== undefined) {\n runtime.threshold = options.threshold;\n }\n return runtime;\n}\n\nexport const evalBundleCommand = command({\n name: 'bundle',\n description: 'Create a portable self-contained directory for an eval suite',\n args: {\n evalPath: positional({\n type: string,\n displayName: 'eval',\n description: 'Path or glob resolving to one eval file',\n }),\n out: option({\n type: string,\n long: 'out',\n description: 'Portable bundle output directory',\n }),\n target: multioption({\n type: array(string),\n long: 'target',\n description: '[Removed: use --provider <label>] Former provider selector',\n }),\n targets: option({\n type: optional(string),\n long: 'targets',\n description: '[Removed: use --providers <path>] Former providers.yaml path',\n }),\n provider: multioption({\n type: array(string),\n long: 'provider',\n description:\n 'Provider label to bundle (repeatable). Defaults to eval provider(s) or default.',\n }),\n providers: option({\n type: optional(string),\n long: 'providers',\n description: 'Path to providers.yaml (overrides discovery)',\n }),\n },\n handler: async (args) => {\n if (args.target.length > 0) {\n throw new Error(\n `--target was removed from agentv eval bundle. Use --provider ${args.target[0]} instead.`,\n );\n }\n if (args.targets !== undefined) {\n throw new Error(\n `--targets was removed from agentv eval bundle. Use --providers ${args.targets} instead.`,\n );\n }\n\n const cwd = process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n const resolvedPaths = await resolveEvalPaths([args.evalPath], cwd);\n if (resolvedPaths.length !== 1) {\n throw new Error(\n `agentv eval bundle requires exactly one eval file, but matched ${resolvedPaths.length}: ${resolvedPaths.join(', ')}`,\n );\n }\n\n const evalFilePath = resolvedPaths[0];\n await loadEnvFromHierarchy({ testFilePath: evalFilePath, repoRoot, verbose: false });\n const suite = await loadTestSuite(evalFilePath, repoRoot);\n if (suite.providerFactory) {\n throw new Error(\n 'TypeScript evals with task() provider functions cannot be bundled into portable YAML yet.',\n );\n }\n\n let definitions: readonly ProviderDefinition[];\n let providerLabels: readonly string[];\n if (suite.inlineTarget) {\n definitions = [suite.inlineTarget];\n providerLabels = unique(args.provider.length > 0 ? args.provider : [suite.inlineTarget.name]);\n } else {\n const providersFilePath = await discoverProvidersFile({\n explicitPath: args.providers,\n testFilePath: evalFilePath,\n repoRoot,\n cwd,\n });\n definitions = definitionsWithEvalTargetSpec(\n definitionsWithEvalProviderRefs(\n await readProviderDefinitions(providersFilePath),\n suite.targetRefs,\n ),\n suite.targetSpec,\n );\n const suiteTarget = await readTestSuiteProvider(evalFilePath);\n providerLabels = unique(\n args.provider.length > 0\n ? args.provider\n : (suite.targets ?? [suite.targetSpec?.name ?? suiteTarget ?? 'default']),\n );\n for (const providerLabel of providerLabels) {\n ensureTargetGraph(providerLabel, definitions, providersFilePath);\n }\n }\n\n const providerSelections: TaskBundleProviderSelection[] = providerLabels.map(\n (providerLabel) => ({\n evalFileAbsolutePath: evalFilePath,\n providerLabel,\n definitions,\n }),\n );\n\n const paths = await materializeEvalBundle({\n evalFilePath,\n tests: suite.tests,\n providerSelections,\n outputDir: args.out,\n cwd,\n repoRoot,\n runtime: buildBundleRuntime({\n providerLabels,\n budgetUsd: suite.budgetUsd,\n threshold: suite.threshold,\n }),\n });\n\n console.log(`Bundle written to: ${paths.bundleDir}`);\n console.log(\n ` Eval: ${path.relative(paths.bundleDir, paths.evalPath).split(path.sep).join('/')}`,\n );\n console.log(\n ` Providers: ${path.relative(paths.bundleDir, paths.providersPath).split(path.sep).join('/')}`,\n );\n console.log(\n ` Manifest: ${path.relative(paths.bundleDir, paths.manifestPath).split(path.sep).join('/')}`,\n );\n },\n});\n","import {\n array,\n command,\n flag,\n multioption,\n number,\n option,\n optional,\n restPositionals,\n string,\n} from 'cmd-ts';\n\nimport { runEvalCommand } from '../run-eval.js';\n\nexport const evalRunCommand = command({\n name: 'eval',\n description: 'Run eval suites and report results',\n args: {\n evalPaths: restPositionals({\n type: string,\n displayName: 'eval-paths',\n description: 'Path(s) or glob(s) to evaluation files (.yaml, .eval.ts)',\n }),\n provider: multioption({\n type: array(string),\n long: 'provider',\n description:\n 'Override provider label(s) from providers.yaml (repeatable for matrix evaluation)',\n }),\n providers: option({\n type: optional(string),\n long: 'providers',\n description: 'Path to providers.yaml (overrides discovery)',\n }),\n target: multioption({\n type: array(string),\n long: 'target',\n description: '[Removed: use --provider <label>] Former target selector',\n }),\n targets: option({\n type: optional(string),\n long: 'targets',\n description: '[Removed: use --providers <path>] Former providers.yaml path',\n }),\n testId: multioption({\n type: array(string),\n long: 'test-id',\n description: 'Filter tests by ID pattern (repeatable, OR logic; glob supported)',\n }),\n workers: option({\n type: optional(number),\n long: 'workers',\n description:\n 'Number of parallel test cases within each eval file (default: 3, max: 50). Eval files always run sequentially. Can also be set per-provider in providers.yaml',\n }),\n out: option({\n type: optional(string),\n long: 'out',\n description: '[Removed: use --output <dir>] Former flat result path',\n }),\n output: option({\n type: optional(string),\n long: 'output',\n short: 'o',\n description:\n 'Run artifact directory (writes index.jsonl, summary.json, and per-case artifacts)',\n }),\n outputFormat: option({\n type: optional(string),\n long: 'output-format',\n description: '[Removed] Run directories always write index.jsonl',\n }),\n experiment: option({\n type: optional(string),\n long: 'experiment',\n description: 'Experiment label for canonical run output (default: default)',\n }),\n resultsRepo: option({\n type: optional(string),\n long: 'results-repo',\n description:\n 'Results Git repo override: current/. for the source repo, a local path, Git URL, or owner/repo',\n }),\n resultsBranch: option({\n type: optional(string),\n long: 'results-branch',\n description: 'Results storage branch (default: agentv/results/v1)',\n }),\n resultsRemote: option({\n type: optional(string),\n long: 'results-remote',\n description: 'Advanced compatibility override: local Git remote name for results push/fetch',\n }),\n resultsPush: flag({\n long: 'results-push',\n description: 'Push the results branch after publishing the completed local run',\n }),\n noResultsPush: flag({\n long: 'no-results-push',\n description: 'Publish to the local results branch without pushing to the remote',\n }),\n resultsRequirePush: flag({\n long: 'results-require-push',\n description: 'Fail the eval command if the completed results branch cannot be pushed',\n }),\n agentTimeout: option({\n type: optional(number),\n long: 'agent-timeout',\n description: 'Optional top-level evaluation timeout in seconds. Unset by default.',\n }),\n maxRetries: option({\n type: optional(number),\n long: 'max-retries',\n description: 'Retry count for timeout recoveries (default: 2)',\n }),\n cache: flag({\n long: 'cache',\n description: 'Enable provider response cache (persisted to disk)',\n }),\n cachePath: option({\n type: optional(string),\n long: 'cache-path',\n description: 'Enable provider response cache at the given directory',\n }),\n noCache: flag({\n long: 'no-cache',\n description: 'Disable response caching (overrides --cache, --cache-path, config, and YAML)',\n }),\n verbose: flag({\n long: 'verbose',\n description: 'Enable verbose logging',\n }),\n workspacePath: option({\n type: optional(string),\n long: 'workspace-path',\n description: 'Static workspace directory path to reuse for this run',\n }),\n keepWorkspaces: flag({\n long: 'keep-workspaces',\n description:\n 'Preserve per-test workspaces after eval (default: keep on failure, cleanup on success)',\n }),\n retryErrors: option({\n type: optional(string),\n long: 'retry-errors',\n description:\n 'Path to a previous run workspace or run manifest — re-run only execution_error test cases',\n }),\n resume: flag({\n long: 'resume',\n description:\n 'Resume an interrupted run: skip already-completed tests and append new results to --output dir',\n }),\n rerunFailed: option({\n type: optional(string),\n long: 'rerun-failed',\n description:\n 'Run ID, run workspace, or index.jsonl to rerun failed/errored tests while keeping passing results',\n }),\n strict: flag({\n long: 'strict',\n description: 'Exit with error on version mismatch (instead of warning)',\n }),\n artifacts: option({\n type: optional(string),\n long: 'artifacts',\n description: '[Removed: use --output <dir>] Former companion artifact directory',\n }),\n graderProvider: option({\n type: optional(string),\n long: 'grader-provider',\n description:\n 'Override grader provider for all evaluators (e.g., \"agentv\", or a provider label from providers.yaml)',\n }),\n graderTarget: option({\n type: optional(string),\n long: 'grader-target',\n description: '[Removed: use --grader-provider <label>] Former grader target selector',\n }),\n model: option({\n type: optional(string),\n long: 'model',\n description: 'Override model for the grader target (e.g., \"openai:gpt-5-mini\")',\n }),\n outputMessages: option({\n type: optional(string),\n long: 'output-messages',\n description:\n 'Number of trailing messages to include in results output (default: 1, or \"all\")',\n }),\n threshold: option({\n type: optional(number),\n long: 'threshold',\n description:\n 'Per-test score threshold (0-1, default 0.8). Exit 1 if any test scores below this value',\n }),\n budgetUsd: option({\n type: optional(number),\n long: 'budget-usd',\n description:\n 'Maximum total cost in USD across all eval files in this run. Stops dispatching new cases when exceeded.',\n }),\n tag: multioption({\n type: array(string),\n long: 'tag',\n description:\n 'Repeatable. `--tag name` filters to eval files with that tag (AND logic). `--tag key=value` sets a promptfoo-shaped run tag; `--tag experiment=<name>` labels the experiment (CLI > project config > eval tags).',\n }),\n excludeTag: multioption({\n type: array(string),\n long: 'exclude-tag',\n description: 'Skip eval files that have this tag (repeatable, file skipped if any match)',\n }),\n transcript: option({\n type: optional(string),\n long: 'transcript',\n description:\n 'Grade a pre-recorded transcript JSONL instead of invoking a live provider. Ignores providers.',\n }),\n recordReplay: option({\n type: optional(string),\n long: 'record-replay',\n description:\n 'Append live provider outputs to a replay fixture JSONL file. Graders still run normally.',\n }),\n recordReplayVariant: option({\n type: optional(string),\n long: 'record-replay-variant',\n description: 'Optional variant key to store with --record-replay fixture rows.',\n }),\n },\n handler: async (args) => {\n if (args.budgetUsd !== undefined && args.budgetUsd <= 0) {\n console.error('Error: --budget-usd must be a positive number.');\n process.exit(2);\n }\n if (args.resultsPush && args.noResultsPush) {\n console.error('Error: --results-push and --no-results-push cannot be used together.');\n process.exit(2);\n }\n const rawOptions = buildEvalRunRawOptions(args);\n const result = await runEvalCommand({ testFiles: args.evalPaths, rawOptions });\n if (result?.allExecutionErrors) {\n process.exit(2);\n }\n if (result?.budgetExceeded) {\n process.exit(1);\n }\n if (result?.thresholdFailed) {\n process.exit(1);\n }\n },\n});\n\nexport function buildEvalRunRawOptions(args: {\n readonly [key: string]: unknown;\n readonly target?: readonly string[];\n readonly targets?: string;\n readonly provider?: readonly string[];\n readonly providers?: string;\n readonly graderTarget?: string;\n readonly graderProvider?: string;\n}): Record<string, unknown> {\n const legacyTargets = Array.isArray(args.target)\n ? args.target.filter((value) => typeof value === 'string' && value.trim().length > 0)\n : [];\n if (legacyTargets.length > 0) {\n throw new Error(\n `--target was removed from agentv eval. Use --provider ${legacyTargets[0]} instead.`,\n );\n }\n if (args.targets !== undefined) {\n throw new Error(\n `--targets was removed from agentv eval. Use --providers ${String(args.targets)} instead.`,\n );\n }\n if (args.graderTarget !== undefined) {\n throw new Error(\n `--grader-target was removed from agentv eval. Use --grader-provider ${args.graderTarget} instead.`,\n );\n }\n\n return {\n provider: args.provider,\n providers: args.providers,\n filter: args.testId,\n workers: args.workers,\n out: args.out,\n output: args.output,\n outputFormat: args.outputFormat,\n experiment: args.experiment,\n resultsRepo: args.resultsRepo,\n resultsBranch: args.resultsBranch,\n resultsRemote: args.resultsRemote,\n resultsPush: args.resultsPush,\n noResultsPush: args.noResultsPush,\n resultsRequirePush: args.resultsRequirePush,\n agentTimeout: args.agentTimeout,\n maxRetries: args.maxRetries,\n cache: args.cache,\n cachePath: args.cachePath,\n noCache: args.noCache,\n verbose: args.verbose,\n workspacePath: args.workspacePath,\n keepWorkspaces: args.keepWorkspaces,\n trace: false,\n retryErrors: args.retryErrors,\n resume: args.resume,\n rerunFailed: args.rerunFailed,\n strict: args.strict,\n artifacts: args.artifacts,\n graderTarget: args.graderProvider,\n model: args.model,\n outputMessages: args.outputMessages,\n threshold: args.threshold,\n budgetUsd: args.budgetUsd,\n tag: args.tag,\n excludeTag: args.excludeTag,\n transcript: args.transcript,\n recordReplay: args.recordReplay,\n recordReplayVariant: args.recordReplayVariant,\n };\n}\n","import { command, flag, number, option, optional, restPositionals, string } from 'cmd-ts';\n\nimport { runScriptGrader, runVitestWorkspaceGrader } from '@agentv/core/script-grader';\n\nfunction parseCommand(value: string | undefined): readonly string[] | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed.split(/\\s+/) : undefined;\n}\n\nexport const evalVitestCommand = command({\n name: 'vitest',\n description: 'Run Vitest workspace verifier files as an AgentV script grader adapter',\n args: {\n testFiles: restPositionals({\n type: string,\n displayName: 'test-files',\n description: 'Vitest verifier file(s) to run',\n }),\n cwd: option({\n type: optional(string),\n long: 'cwd',\n description: 'Workspace-relative directory where Vitest should run',\n }),\n vitestCommand: option({\n type: optional(string),\n long: 'vitest-command',\n description: 'Vitest command to execute, defaults to \"bunx vitest run\"',\n }),\n timeoutMs: option({\n type: optional(number),\n long: 'timeout-ms',\n description: 'Timeout for the Vitest command in milliseconds',\n }),\n inWorkspace: flag({\n long: 'in-workspace',\n description:\n 'Treat test files as already present in the prepared workspace instead of copying them from the current directory',\n }),\n passWithNoTests: flag({\n long: 'pass-with-no-tests',\n description: 'Return score 1 when Vitest reports zero tests',\n }),\n },\n handler: async ({ testFiles, cwd, vitestCommand, timeoutMs, inWorkspace, passWithNoTests }) => {\n await runScriptGrader((input) => {\n if (testFiles.length === 0) {\n throw new Error('Provide at least one Vitest verifier file.');\n }\n\n return runVitestWorkspaceGrader(\n {\n testFile: testFiles,\n cwd,\n vitestCommand: parseCommand(vitestCommand),\n timeoutMs,\n passWithNoTests,\n copyTestFilesToWorkspace: !inWorkspace,\n testFileRoot: process.cwd(),\n },\n input,\n );\n });\n },\n});\n","import { subcommands } from 'cmd-ts';\n\nimport { evalAggregateCommand } from './commands/aggregate.js';\nimport { evalAssertCommand } from './commands/assert.js';\nimport { evalBundleCommand } from './commands/bundle.js';\nimport { evalRunCommand } from './commands/run.js';\nimport { evalVitestCommand } from './commands/vitest.js';\n\nexport const evalCommand = subcommands({\n name: 'eval',\n description:\n 'Evaluation commands. Shorthand: eval files run with `eval run`; verifier-looking test files run with `eval vitest`.',\n cmds: {\n run: evalRunCommand,\n assert: evalAssertCommand,\n aggregate: evalAggregateCommand,\n bundle: evalBundleCommand,\n vitest: evalVitestCommand,\n },\n});\n","/**\n * `agentv grade` evaluates a workspace that was previously materialized by\n * `agentv prepare` and then edited by a human or external agent. This command\n * deliberately stops short of provider execution: the prepared manifest is the\n * source of workspace, prompt, target, setup, and baseline provenance, while\n * core grader/result primitives produce the normal run artifacts.\n */\nimport { readFile, stat } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport {\n EXECUTION_TRACE_SCHEMA_VERSION,\n type PreparedAttemptMetadata,\n type ResolvedProviderBackend,\n type Trace,\n type TranscriptJsonLine,\n buildTraceFromMessages,\n deriveCategory,\n gradePreparedEvalCase,\n loadTestSuite,\n readTraceEnvelopeReplayRecords,\n readTranscriptJsonl,\n traceEnvelopeToTraceSummary,\n traceEnvelopeToTranscriptMessages,\n traceFromTranscriptJsonLines,\n writeArtifactsFromResults,\n} from '@agentv/core';\nimport { command, number, oneOf, option, optional, positional, string } from 'cmd-ts';\n\nimport { loadEnvFromHierarchy } from '../eval/env.js';\nimport { buildDefaultRunDir } from '../eval/result-layout.js';\nimport { findRepoRoot } from '../eval/shared.js';\nimport { selectMultipleProviders } from '../eval/targets.js';\n\ninterface PreparedBaseline {\n readonly status: 'initialized' | 'unavailable';\n readonly commit?: string;\n}\n\ninterface PreparedManifest {\n readonly schemaVersion: 1;\n readonly evalPath: string;\n readonly testId: string;\n readonly target: string;\n readonly workspacePath: string;\n readonly promptPath: string;\n readonly setupStatus: 'ok';\n readonly baseline: PreparedBaseline;\n readonly createdAt: string;\n readonly manifestPath: string;\n readonly preparedDir: string;\n}\n\ninterface GradePreparedResult {\n readonly testId: string;\n readonly target: string;\n readonly score: number;\n readonly executionStatus: string;\n readonly workspacePath: string;\n readonly manifestPath: string;\n readonly tracePath?: string;\n readonly outputDir: string;\n readonly indexPath: string;\n}\n\ninterface GradePreparedResultWire {\n readonly test_id: string;\n readonly target: string;\n readonly score: number;\n readonly execution_status: string;\n readonly workspace_path: string;\n readonly manifest_path: string;\n readonly trace_path?: string;\n readonly output_dir: string;\n readonly index_path: string;\n}\n\ninterface PreparedTraceInput {\n readonly trace: Trace;\n readonly sourcePath: string;\n}\n\ninterface TranscriptLineGroup {\n readonly testId: string;\n readonly target: string;\n readonly lines: readonly TranscriptJsonLine[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction invalidManifest(manifestPath: string, message: string): Error {\n return new Error(`Invalid prepared manifest at ${manifestPath}: ${message}`);\n}\n\nfunction expectString(record: Record<string, unknown>, key: string, manifestPath: string): string {\n const value = record[key];\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw invalidManifest(manifestPath, `missing non-empty string field '${key}'`);\n }\n return value;\n}\n\nfunction expectArray(\n record: Record<string, unknown>,\n key: string,\n manifestPath: string,\n): readonly unknown[] {\n const value = record[key];\n if (!Array.isArray(value)) {\n throw invalidManifest(manifestPath, `missing array field '${key}'`);\n }\n return value;\n}\n\nfunction expectBaseline(value: unknown, manifestPath: string): PreparedBaseline {\n if (!isRecord(value)) {\n throw invalidManifest(manifestPath, \"missing object field 'baseline'\");\n }\n const status = value.status;\n if (status !== 'initialized' && status !== 'unavailable') {\n throw invalidManifest(\n manifestPath,\n \"field 'baseline.status' must be 'initialized' or 'unavailable'\",\n );\n }\n const commit = value.commit;\n if (commit !== undefined && typeof commit !== 'string') {\n throw invalidManifest(manifestPath, \"field 'baseline.commit' must be a string\");\n }\n if (status === 'initialized' && (!commit || commit.trim().length === 0)) {\n throw invalidManifest(\n manifestPath,\n \"field 'baseline.commit' is required when baseline.status is 'initialized'\",\n );\n }\n return {\n status,\n ...(typeof commit === 'string' && commit.trim().length > 0 && { commit }),\n };\n}\n\nfunction fromManifestWire(value: unknown, manifestPath: string): PreparedManifest {\n if (!isRecord(value)) {\n throw invalidManifest(manifestPath, 'expected a JSON object');\n }\n if (value.schema_version !== 1) {\n throw invalidManifest(manifestPath, \"field 'schema_version' must be 1\");\n }\n const setupStatus = value.setup_status;\n if (setupStatus !== 'ok') {\n throw invalidManifest(manifestPath, \"field 'setup_status' must be 'ok'\");\n }\n\n const preparedDir = path.dirname(manifestPath);\n const resolveManifestPath = (rawPath: string) =>\n path.isAbsolute(rawPath) ? rawPath : path.resolve(preparedDir, rawPath);\n expectArray(value, 'setup_steps', manifestPath);\n expectArray(value, 'repo_pins', manifestPath);\n\n return {\n schemaVersion: 1,\n evalPath: resolveManifestPath(expectString(value, 'eval_path', manifestPath)),\n testId: expectString(value, 'test_id', manifestPath),\n target: expectString(value, 'target', manifestPath),\n workspacePath: resolveManifestPath(expectString(value, 'workspace_path', manifestPath)),\n promptPath: resolveManifestPath(expectString(value, 'prompt_path', manifestPath)),\n setupStatus,\n baseline: expectBaseline(value.baseline, manifestPath),\n createdAt: expectString(value, 'created_at', manifestPath),\n manifestPath,\n preparedDir,\n };\n}\n\nasync function resolvePreparedManifestPath(preparedPath: string): Promise<string> {\n const resolved = path.resolve(preparedPath);\n try {\n const stats = await stat(resolved);\n return stats.isDirectory() ? path.join(resolved, 'agentv_prepare.json') : resolved;\n } catch {\n return path.basename(resolved) === 'agentv_prepare.json'\n ? resolved\n : path.join(resolved, 'agentv_prepare.json');\n }\n}\n\nasync function readPreparedManifest(preparedPath: string): Promise<PreparedManifest> {\n const manifestPath = await resolvePreparedManifestPath(preparedPath);\n let raw: string;\n try {\n raw = await readFile(manifestPath, 'utf8');\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(\n `Prepared manifest not found at ${manifestPath}. Run agentv prepare first and pass --prepared <dir>.`,\n );\n }\n throw error;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid prepared manifest JSON at ${manifestPath}: ${message}`);\n }\n return fromManifestWire(parsed, manifestPath);\n}\n\nasync function ensureDirectoryExists(dirPath: string, description: string): Promise<void> {\n try {\n const stats = await stat(dirPath);\n if (!stats.isDirectory()) {\n throw new Error(`${description} is not a directory: ${dirPath}`);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`${description} not found: ${dirPath}`);\n }\n throw error;\n }\n}\n\nasync function ensureFileExists(filePath: string, description: string): Promise<void> {\n try {\n const stats = await stat(filePath);\n if (!stats.isFile()) {\n throw new Error(`${description} is not a file: ${filePath}`);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`${description} not found: ${filePath}`);\n }\n throw error;\n }\n}\n\nfunction assertMatchesManifest(options: {\n readonly manifest: PreparedManifest;\n readonly evalPath: string;\n readonly testId?: string;\n}): string {\n const commandEvalPath = path.resolve(options.evalPath);\n if (path.resolve(options.manifest.evalPath) !== commandEvalPath) {\n throw new Error(\n `Prepared manifest eval_path does not match command eval path: ${options.manifest.evalPath} !== ${commandEvalPath}`,\n );\n }\n if (options.testId && options.testId !== options.manifest.testId) {\n throw new Error(\n `Prepared manifest test_id '${options.manifest.testId}' does not match --test-id '${options.testId}'`,\n );\n }\n return options.testId ?? options.manifest.testId;\n}\n\nfunction toPreparedAttemptMetadata(\n manifest: PreparedManifest,\n tracePath: string | undefined,\n): PreparedAttemptMetadata {\n return {\n source: 'manual',\n manifestPath: manifest.manifestPath,\n preparedDir: manifest.preparedDir,\n workspacePath: manifest.workspacePath,\n promptPath: manifest.promptPath,\n ...(tracePath !== undefined && { tracePath }),\n target: manifest.target,\n preparedAt: manifest.createdAt,\n setupStatus: manifest.setupStatus,\n baselineStatus: manifest.baseline.status,\n ...(manifest.baseline.commit !== undefined && { baselineCommit: manifest.baseline.commit }),\n };\n}\n\nfunction toCommandOutputWire(result: GradePreparedResult): GradePreparedResultWire {\n return {\n test_id: result.testId,\n target: result.target,\n score: result.score,\n execution_status: result.executionStatus,\n workspace_path: result.workspacePath,\n manifest_path: result.manifestPath,\n ...(result.tracePath !== undefined && { trace_path: result.tracePath }),\n output_dir: result.outputDir,\n index_path: result.indexPath,\n };\n}\n\nfunction printHumanOutput(result: GradePreparedResult): void {\n console.log(`Graded prepared attempt for ${result.testId} (${result.target})`);\n console.log(`Score: ${result.score.toFixed(3)} (${result.executionStatus})`);\n console.log(`Workspace: ${result.workspacePath}`);\n console.log(`Manifest: ${result.manifestPath}`);\n if (result.tracePath) {\n console.log(`Trace: ${result.tracePath}`);\n }\n console.log(`Artifact workspace: ${result.outputDir}`);\n console.log(`Run manifest: ${result.indexPath}`);\n}\n\nfunction isTraceEnvelopeDocument(value: unknown): boolean {\n return isRecord(value) && value.schema_version === EXECUTION_TRACE_SCHEMA_VERSION;\n}\n\nfunction isTranscriptJsonLine(value: unknown): boolean {\n return (\n isRecord(value) &&\n typeof value.test_id === 'string' &&\n typeof value.target === 'string' &&\n typeof value.message_index === 'number' &&\n isRecord(value.source)\n );\n}\n\nfunction parseFirstJsonLine(raw: string): unknown | undefined {\n const firstLine = raw\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find((line) => line.length > 0);\n if (!firstLine) {\n return undefined;\n }\n try {\n return JSON.parse(firstLine);\n } catch {\n return undefined;\n }\n}\n\nfunction looksLikeTraceEnvelopeJsonText(trimmed: string): boolean {\n if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {\n return false;\n }\n return (\n trimmed.includes('\"schema_version\"') &&\n trimmed.includes(JSON.stringify(EXECUTION_TRACE_SCHEMA_VERSION))\n );\n}\n\nfunction traceEnvelopeRecordMatchesPreparedAttempt(\n record: Awaited<ReturnType<typeof readTraceEnvelopeReplayRecords>>[number],\n options: { readonly testId: string; readonly target: string },\n): boolean {\n if (record.envelope.eval.testId !== options.testId) {\n return false;\n }\n const sourceTarget = record.envelope.eval.sourceTarget ?? record.envelope.eval.target;\n return sourceTarget === options.target || record.envelope.eval.target === options.target;\n}\n\nfunction selectTraceEnvelopeRecord(\n records: Awaited<ReturnType<typeof readTraceEnvelopeReplayRecords>>,\n options: { readonly sourcePath: string; readonly testId: string; readonly target: string },\n) {\n if (records.length === 0) {\n throw new Error(`Trace file has no execution trace records: ${options.sourcePath}`);\n }\n const matchingTest = records.filter((record) => record.envelope.eval.testId === options.testId);\n const candidates = matchingTest.filter((record) =>\n traceEnvelopeRecordMatchesPreparedAttempt(record, options),\n );\n\n if (candidates.length === 1) {\n return candidates[0];\n }\n\n const detail =\n candidates.length === 0\n ? matchingTest.length === 0\n ? `no record matches test_id '${options.testId}'`\n : `${matchingTest.length} record(s) match test_id '${options.testId}' but none match target '${options.target}'`\n : `${candidates.length} records match test_id '${options.testId}' and target '${options.target}'`;\n throw new Error(\n `Trace file ${options.sourcePath} is ambiguous for prepared grading: ${detail}. Pass a single-record trace file or a file with one matching test/target record.`,\n );\n}\n\nfunction traceFromEnvelopeRecord(\n record: Awaited<ReturnType<typeof readTraceEnvelopeReplayRecords>>[number],\n): Trace {\n const summary = traceEnvelopeToTraceSummary(record.envelope);\n return buildTraceFromMessages({\n output: traceEnvelopeToTranscriptMessages(record.envelope),\n summary: summary.trace,\n tokenUsage: summary.tokenUsage,\n costUsd: summary.costUsd,\n durationMs: summary.durationMs,\n startTime: summary.startTime,\n endTime: summary.endTime,\n provider: record.envelope.source.provider,\n target: record.envelope.eval.target,\n testId: record.envelope.eval.testId,\n conversationId: record.envelope.eval.runId,\n metadata: {\n trace_source_path: record.sourcePath,\n trace_source_format: EXECUTION_TRACE_SCHEMA_VERSION,\n trace_artifact_id: record.envelope.artifactId,\n ...(record.lineNumber !== undefined && { trace_source_line: record.lineNumber }),\n },\n });\n}\n\nfunction groupTranscriptLinesByTestTarget(\n lines: readonly TranscriptJsonLine[],\n): TranscriptLineGroup[] {\n const groups = new Map<string, { testId: string; target: string; lines: TranscriptJsonLine[] }>();\n\n for (const line of lines) {\n const key = `${line.test_id}\\0${line.target}`;\n const group =\n groups.get(key) ??\n (() => {\n const created = { testId: line.test_id, target: line.target, lines: [] };\n groups.set(key, created);\n return created;\n })();\n group.lines.push(line);\n }\n\n return [...groups.values()];\n}\n\nfunction selectTranscriptLines(\n lines: Awaited<ReturnType<typeof readTranscriptJsonl>>,\n options: { readonly sourcePath: string; readonly testId: string; readonly target: string },\n) {\n const groups = groupTranscriptLinesByTestTarget(lines);\n if (groups.length === 0) {\n throw new Error(`Trace file has no transcript rows: ${options.sourcePath}`);\n }\n const matchingTest = groups.filter((group) => group.testId === options.testId);\n const candidates = matchingTest.filter((group) => group.target === options.target);\n\n if (candidates.length === 1) {\n return candidates[0].lines;\n }\n\n const detail =\n candidates.length === 0\n ? matchingTest.length === 0\n ? `no transcript group matches test_id '${options.testId}'`\n : `${matchingTest.length} transcript group(s) match test_id '${options.testId}' but none match target '${options.target}'`\n : `${candidates.length} transcript groups match test_id '${options.testId}' and target '${options.target}'`;\n throw new Error(\n `Trace file ${options.sourcePath} is ambiguous for prepared grading: ${detail}. Pass a single-session transcript or a transcript with one matching test/target group.`,\n );\n}\n\nasync function readPreparedTrace(\n tracePath: string,\n options: { readonly testId: string; readonly target: string },\n): Promise<PreparedTraceInput> {\n const sourcePath = path.resolve(tracePath);\n const raw = await readFile(sourcePath, 'utf8');\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n throw new Error(`Trace file is empty: ${sourcePath}`);\n }\n\n const firstLine = parseFirstJsonLine(raw);\n if (isTraceEnvelopeDocument(firstLine)) {\n const records = await readTraceEnvelopeReplayRecords(sourcePath);\n return {\n sourcePath,\n trace: traceFromEnvelopeRecord(\n selectTraceEnvelopeRecord(records, { sourcePath, ...options }),\n ),\n };\n }\n\n if (isTranscriptJsonLine(firstLine)) {\n const lines = selectTranscriptLines(await readTranscriptJsonl(sourcePath), {\n sourcePath,\n ...options,\n });\n const trace = traceFromTranscriptJsonLines(lines);\n return {\n sourcePath,\n trace: {\n ...trace,\n metadata: {\n ...trace.metadata,\n trace_source_path: sourcePath,\n trace_source_format: 'agentv.transcript.jsonl',\n },\n },\n };\n }\n\n if (looksLikeTraceEnvelopeJsonText(trimmed)) {\n const records = await readTraceEnvelopeReplayRecords(sourcePath);\n return {\n sourcePath,\n trace: traceFromEnvelopeRecord(\n selectTraceEnvelopeRecord(records, { sourcePath, ...options }),\n ),\n };\n }\n\n throw new Error(\n `Unsupported trace format at ${sourcePath}. Expected agentv.trace.v1 JSON/JSONL or AgentV transcript JSONL.`,\n );\n}\n\nasync function gradePreparedAttempt(options: {\n readonly evalPath: string;\n readonly testId?: string;\n readonly preparedPath: string;\n readonly outputDir?: string;\n readonly responsePath?: string;\n readonly tracePath?: string;\n readonly experiment?: string;\n readonly graderTarget?: string;\n readonly model?: string;\n readonly threshold?: number;\n readonly verbose?: boolean;\n}): Promise<GradePreparedResult> {\n const manifest = await readPreparedManifest(options.preparedPath);\n const evalPath = path.resolve(options.evalPath);\n const testId = assertMatchesManifest({ manifest, evalPath, testId: options.testId });\n\n await ensureDirectoryExists(manifest.workspacePath, 'Prepared workspace');\n await ensureFileExists(manifest.promptPath, 'Prepared prompt');\n const preparedTrace =\n options.tracePath !== undefined\n ? await readPreparedTrace(options.tracePath, { testId, target: manifest.target })\n : undefined;\n\n const evalDir = path.dirname(evalPath);\n const repoRoot = await findRepoRoot(evalDir);\n await loadEnvFromHierarchy({ testFilePath: evalPath, repoRoot, verbose: !!options.verbose });\n\n const category = deriveCategory(path.relative(process.cwd(), evalPath));\n const suite = await loadTestSuite(evalPath, repoRoot, { category });\n const test = suite.tests.find((candidate) => candidate.id === testId);\n if (!test) {\n throw new Error(`Test ID '${testId}' not found in ${evalPath}`);\n }\n\n const selections = await selectMultipleProviders({\n testFilePath: evalPath,\n repoRoot,\n cwd: process.cwd(),\n env: process.env,\n providerLabels: [manifest.target],\n providerRefs: suite.targetRefs,\n });\n const selection = selections[0];\n if (!selection) {\n throw new Error(`Target '${manifest.target}' could not be resolved`);\n }\n const target = {\n ...selection.resolvedProvider,\n name: manifest.target,\n } as ResolvedProviderBackend;\n\n const response =\n options.responsePath !== undefined\n ? await readFile(path.resolve(options.responsePath), 'utf8')\n : undefined;\n const runDir = path.resolve(\n options.outputDir ?? buildDefaultRunDir(process.cwd(), options.experiment),\n );\n\n const result = await gradePreparedEvalCase({\n evalCase: test,\n target,\n targets: selection.definitions,\n env: process.env,\n evalFilePath: evalPath,\n workspacePath: manifest.workspacePath,\n baselineCommit: manifest.baseline.commit,\n response,\n trace: preparedTrace?.trace,\n verbose: options.verbose,\n graderTarget: options.graderTarget,\n model: options.model,\n threshold: options.threshold ?? suite.threshold,\n preparedAttempt: toPreparedAttemptMetadata(manifest, preparedTrace?.sourcePath),\n });\n\n const artifacts = await writeArtifactsFromResults([result], runDir, {\n evalFile: evalPath,\n experiment: options.experiment,\n plannedTestCount: 1,\n sourceTests: [test],\n });\n\n return {\n testId,\n target: manifest.target,\n score: result.score,\n executionStatus: result.executionStatus,\n workspacePath: manifest.workspacePath,\n manifestPath: manifest.manifestPath,\n tracePath: preparedTrace?.sourcePath,\n outputDir: runDir,\n indexPath: artifacts.indexPath,\n };\n}\n\nexport const gradeCommand = command({\n name: 'grade',\n description: 'Grade a prepared workspace attempt without running the target provider',\n args: {\n evalPath: positional({\n type: string,\n displayName: 'eval',\n description: 'Path to an eval file',\n }),\n testId: option({\n type: optional(string),\n long: 'test-id',\n description: 'Exact test ID to grade; defaults to agentv_prepare.json test_id',\n }),\n prepared: option({\n type: string,\n long: 'prepared',\n description: 'Prepared-attempt directory or agentv_prepare.json path',\n }),\n output: option({\n type: optional(string),\n long: 'output',\n short: 'o',\n description: 'Run artifact directory (writes index.jsonl and per-test artifacts)',\n }),\n response: option({\n type: optional(string),\n long: 'response',\n description: 'Optional final response text file from the human or external agent',\n }),\n trace: option({\n type: optional(string),\n long: 'trace',\n description:\n 'Optional AgentV trace/session file for trace-aware graders (execution trace JSON/JSONL or transcript JSONL)',\n }),\n experiment: option({\n type: optional(string),\n long: 'experiment',\n description: 'Experiment label for canonical run output (default: default)',\n }),\n graderProvider: option({\n type: optional(string),\n long: 'grader-provider',\n description:\n 'Override grader provider for all evaluators (e.g., \"agentv\", or a provider label from providers.yaml)',\n }),\n graderTarget: option({\n type: optional(string),\n long: 'grader-target',\n description: '[Removed: use --grader-provider <label>] Former grader target selector',\n }),\n model: option({\n type: optional(string),\n long: 'model',\n description: 'Override model for the grader provider (e.g., \"openai:gpt-5-mini\")',\n }),\n threshold: option({\n type: optional(number),\n long: 'threshold',\n description: 'Per-test score threshold (0-1, default 0.8 or suite threshold)',\n }),\n format: option({\n type: optional(oneOf(['text', 'json'])),\n long: 'format',\n description: 'Output format: text (default) or json',\n }),\n },\n handler: async ({\n evalPath,\n testId,\n prepared,\n output,\n response,\n trace,\n experiment,\n graderProvider,\n graderTarget,\n model,\n threshold,\n format,\n }) => {\n if (graderTarget !== undefined) {\n throw new Error(\n `--grader-target was removed from agentv grade. Use --grader-provider ${graderTarget} instead.`,\n );\n }\n const result = await gradePreparedAttempt({\n evalPath,\n testId,\n preparedPath: prepared,\n outputDir: output,\n responsePath: response,\n tracePath: trace,\n experiment,\n graderTarget: graderProvider,\n model,\n threshold,\n verbose: false,\n });\n if (format === 'json') {\n console.log(JSON.stringify(toCommandOutputWire(result), null, 2));\n return;\n }\n printHumanOutput(result);\n },\n});\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport {\n discoverClaudeSessions,\n parseClaudeSession,\n readTranscriptFile,\n toTranscriptJsonLines,\n} from '@agentv/core';\nimport { command, flag, option, optional, string } from 'cmd-ts';\n\nexport const importClaudeCommand = command({\n name: 'claude',\n description: 'Import a Claude Code session transcript for offline grading',\n args: {\n sessionId: option({\n type: optional(string),\n long: 'session-id',\n description: 'UUID of the Claude Code session to import',\n }),\n projectPath: option({\n type: optional(string),\n long: 'project-path',\n description: 'Filter sessions by project path',\n }),\n output: option({\n type: optional(string),\n long: 'output',\n short: 'o',\n description:\n 'Output file path (default: .agentv/transcripts/claude-<session-id-short>.jsonl)',\n }),\n testId: option({\n type: optional(string),\n long: 'test-id',\n description: 'Set the transcript test_id to match an eval test id',\n }),\n target: option({\n type: optional(string),\n long: 'target',\n description: 'Set the transcript target/source_target value (default: claude)',\n }),\n projectsDir: option({\n type: optional(string),\n long: 'projects-dir',\n description: 'Override the default ~/.claude/projects directory',\n }),\n list: flag({\n long: 'list',\n description: 'List available sessions instead of importing',\n }),\n },\n handler: async ({ sessionId, projectPath, output, testId, target, projectsDir, list }) => {\n if (list) {\n const sessions = await discoverClaudeSessions({\n projectPath,\n projectsDir,\n limit: 20,\n });\n\n if (sessions.length === 0) {\n console.log('No Claude Code sessions found.');\n return;\n }\n\n console.log(`Found ${sessions.length} session(s):\\n`);\n for (const session of sessions) {\n const age = formatAge(session.updatedAt);\n console.log(` ${session.sessionId} ${age} ${session.projectDir}`);\n }\n return;\n }\n\n // Determine which session to import\n let sessionFilePath: string;\n\n if (sessionId) {\n const sessions = await discoverClaudeSessions({\n sessionId,\n projectPath,\n projectsDir,\n limit: 1,\n });\n\n if (sessions.length === 0) {\n console.error(`Error: session ${sessionId} not found.`);\n process.exit(1);\n }\n sessionFilePath = sessions[0].filePath;\n } else {\n console.error(\n 'Error: specify --session-id <uuid> to select a session. Use --list to see available sessions.',\n );\n process.exit(1);\n }\n\n // Parse the session\n const rawJsonl = await readTranscriptFile(sessionFilePath);\n const transcript = parseClaudeSession(rawJsonl);\n\n // Determine output path\n const shortId = (sessionId ?? transcript.source.sessionId).slice(0, 8);\n const outputPath = output ?? path.join('.agentv', 'transcripts', `claude-${shortId}.jsonl`);\n\n // Ensure output directory exists\n await mkdir(path.dirname(outputPath), { recursive: true });\n\n // Write transcript as JSONL (one message per line, grouped by test_id)\n const jsonLines = toTranscriptJsonLines(transcript, transcriptWriteOptions(testId, target));\n await writeFile(\n outputPath,\n `${jsonLines.map((line) => JSON.stringify(line)).join('\\n')}\\n`,\n 'utf8',\n );\n\n const msgCount = transcript.messages.length;\n const toolCount = transcript.messages.reduce((sum, m) => sum + (m.toolCalls?.length ?? 0), 0);\n\n console.log(`Imported ${msgCount} messages (${toolCount} tool calls) → ${outputPath}`);\n\n if (transcript.source.model) {\n console.log(` Model: ${transcript.source.model}`);\n }\n if (transcript.durationMs !== undefined) {\n console.log(` Duration: ${formatDurationMs(transcript.durationMs)}`);\n }\n if (transcript.tokenUsage) {\n console.log(\n ` Tokens: ${transcript.tokenUsage.input} in / ${transcript.tokenUsage.output} out`,\n );\n }\n },\n});\n\nfunction formatAge(date: Date): string {\n const diffMs = Date.now() - date.getTime();\n const diffMin = Math.floor(diffMs / 60_000);\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffHours = Math.floor(diffMin / 60);\n if (diffHours < 24) return `${diffHours}h ago`;\n const diffDays = Math.floor(diffHours / 24);\n return `${diffDays}d ago`;\n}\n\nfunction transcriptWriteOptions(\n testId: string | undefined,\n target: string | undefined,\n): { testId?: string; target?: string } {\n return {\n ...(testId ? { testId } : {}),\n ...(target ? { target } : {}),\n };\n}\n\nfunction formatDurationMs(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes}m ${remainingSeconds}s`;\n}\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport {\n discoverCodexSessions,\n parseCodexSession,\n readTranscriptFile,\n toTranscriptJsonLines,\n} from '@agentv/core';\nimport { command, flag, option, optional, string } from 'cmd-ts';\n\nexport const importCodexCommand = command({\n name: 'codex',\n description: 'Import a Codex CLI session transcript for offline grading',\n args: {\n sessionId: option({\n type: optional(string),\n long: 'session-id',\n description: 'UUID of the Codex CLI session to import',\n }),\n date: option({\n type: optional(string),\n long: 'date',\n description: 'Filter sessions by date (YYYY-MM-DD)',\n }),\n output: option({\n type: optional(string),\n long: 'output',\n short: 'o',\n description: 'Output file path (default: .agentv/transcripts/codex-<timestamp>.jsonl)',\n }),\n testId: option({\n type: optional(string),\n long: 'test-id',\n description: 'Set the transcript test_id to match an eval test id',\n }),\n target: option({\n type: optional(string),\n long: 'target',\n description: 'Set the transcript target/source_target value (default: codex)',\n }),\n sessionsDir: option({\n type: optional(string),\n long: 'sessions-dir',\n description: 'Override the default ~/.codex/sessions directory',\n }),\n list: flag({\n long: 'list',\n description: 'List available sessions instead of importing',\n }),\n },\n handler: async ({ sessionId, date, output, testId, target, sessionsDir, list }) => {\n if (list) {\n const sessions = await discoverCodexSessions({\n date,\n sessionsDir,\n limit: 20,\n });\n\n if (sessions.length === 0) {\n console.log('No Codex CLI sessions found.');\n return;\n }\n\n console.log(`Found ${sessions.length} session(s):\\n`);\n for (const session of sessions) {\n const age = formatAge(session.updatedAt);\n console.log(` ${session.sessionId} ${age} ${session.filename}`);\n }\n return;\n }\n\n let session: Awaited<ReturnType<typeof discoverCodexSessions>>[number];\n\n if (sessionId) {\n const sessions = await discoverCodexSessions({\n date,\n sessionsDir,\n limit: 100,\n });\n const match = sessions.find((s) => s.sessionId === sessionId);\n if (!match) {\n console.error(`Error: session ${sessionId} not found.`);\n process.exit(1);\n }\n session = match;\n } else {\n console.error(\n 'Error: specify --session-id <uuid> to select a session. Use --list to see available sessions.',\n );\n process.exit(1);\n }\n\n // Parse the session\n const rawJsonl = await readTranscriptFile(session.filePath);\n const transcript = parseCodexSession(rawJsonl);\n\n // Determine output path\n const shortId = session.sessionId.slice(0, 8);\n const outputPath = output ?? path.join('.agentv', 'transcripts', `codex-${shortId}.jsonl`);\n\n // Ensure output directory exists\n await mkdir(path.dirname(outputPath), { recursive: true });\n\n // Write transcript as JSONL (one message per line, grouped by test_id)\n const jsonLines = toTranscriptJsonLines(transcript, transcriptWriteOptions(testId, target));\n await writeFile(\n outputPath,\n `${jsonLines.map((line) => JSON.stringify(line)).join('\\n')}\\n`,\n 'utf8',\n );\n\n const msgCount = transcript.messages.length;\n const toolCount = transcript.messages.reduce((sum, m) => sum + (m.toolCalls?.length ?? 0), 0);\n\n console.log(`Imported ${msgCount} messages (${toolCount} tool calls) → ${outputPath}`);\n\n if (transcript.source.model) {\n console.log(` Model: ${transcript.source.model}`);\n }\n if (transcript.durationMs !== undefined) {\n console.log(` Duration: ${formatDurationMs(transcript.durationMs)}`);\n }\n },\n});\n\nfunction formatAge(date: Date): string {\n const diffMs = Date.now() - date.getTime();\n const diffMin = Math.floor(diffMs / 60_000);\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffHours = Math.floor(diffMin / 60);\n if (diffHours < 24) return `${diffHours}h ago`;\n const diffDays = Math.floor(diffHours / 24);\n return `${diffDays}d ago`;\n}\n\nfunction transcriptWriteOptions(\n testId: string | undefined,\n target: string | undefined,\n): { testId?: string; target?: string } {\n return {\n ...(testId ? { testId } : {}),\n ...(target ? { target } : {}),\n };\n}\n\nfunction formatDurationMs(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes}m ${remainingSeconds}s`;\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { discoverCopilotSessions, parseCopilotEvents, toTranscriptJsonLines } from '@agentv/core';\nimport { command, flag, option, optional, string } from 'cmd-ts';\n\nexport const importCopilotCommand = command({\n name: 'copilot',\n description: 'Import a Copilot CLI session transcript for offline grading',\n args: {\n sessionId: option({\n type: optional(string),\n long: 'session-id',\n description: 'UUID of the Copilot CLI session to import',\n }),\n output: option({\n type: optional(string),\n long: 'output',\n short: 'o',\n description:\n 'Output file path (default: .agentv/transcripts/copilot-<session-id-short>.jsonl)',\n }),\n testId: option({\n type: optional(string),\n long: 'test-id',\n description: 'Set the transcript test_id to match an eval test id',\n }),\n target: option({\n type: optional(string),\n long: 'target',\n description: 'Set the transcript target/source_target value (default: copilot)',\n }),\n sessionStateDir: option({\n type: optional(string),\n long: 'session-state-dir',\n description: 'Override the default ~/.copilot/session-state directory',\n }),\n list: flag({\n long: 'list',\n description: 'List available sessions instead of importing',\n }),\n },\n handler: async ({ sessionId, output, testId, target, sessionStateDir, list }) => {\n if (list) {\n const sessions = await discoverCopilotSessions({\n sessionStateDir,\n limit: 20,\n });\n\n if (sessions.length === 0) {\n console.log('No Copilot CLI sessions found.');\n return;\n }\n\n console.log(`Found ${sessions.length} session(s):\\n`);\n for (const session of sessions) {\n const age = formatAge(session.updatedAt);\n const status = session.isActive ? ' (active)' : '';\n console.log(` ${session.sessionId} ${age} ${session.cwd}${status}`);\n }\n return;\n }\n\n let sessionDir: string;\n let resolvedSessionId: string;\n\n if (sessionId) {\n const sessions = await discoverCopilotSessions({\n sessionStateDir,\n limit: 100,\n });\n const match = sessions.find((s: { sessionId: string }) => s.sessionId === sessionId);\n if (!match) {\n console.error(`Error: session ${sessionId} not found.`);\n process.exit(1);\n }\n sessionDir = match.sessionDir;\n resolvedSessionId = sessionId;\n } else {\n console.error(\n 'Error: specify --session-id <uuid> to select a session. Use --list to see available sessions.',\n );\n process.exit(1);\n }\n\n // Parse the session\n const eventsPath = path.join(sessionDir, 'events.jsonl');\n const rawJsonl = await readFile(eventsPath, 'utf8');\n const parsed = parseCopilotEvents(rawJsonl);\n\n // Convert to TranscriptEntry format\n const transcript = {\n messages: parsed.messages,\n source: {\n provider: 'copilot' as const,\n sessionId: resolvedSessionId,\n cwd: parsed.meta.cwd,\n startedAt: parsed.meta.startedAt,\n model: parsed.meta.model,\n },\n tokenUsage: parsed.tokenUsage,\n durationMs: parsed.durationMs,\n costUsd: null as number | null,\n };\n\n // Determine output path\n const shortId = resolvedSessionId.slice(0, 8);\n const outputPath = output ?? path.join('.agentv', 'transcripts', `copilot-${shortId}.jsonl`);\n\n // Ensure output directory exists\n await mkdir(path.dirname(outputPath), { recursive: true });\n\n // Write transcript as JSONL (one message per line, grouped by test_id)\n const jsonLines = toTranscriptJsonLines(transcript, transcriptWriteOptions(testId, target));\n await writeFile(\n outputPath,\n `${jsonLines.map((line) => JSON.stringify(line)).join('\\n')}\\n`,\n 'utf8',\n );\n\n const msgCount = transcript.messages.length;\n const toolCount = transcript.messages.reduce((sum, m) => sum + (m.toolCalls?.length ?? 0), 0);\n\n console.log(`Imported ${msgCount} messages (${toolCount} tool calls) → ${outputPath}`);\n\n if (transcript.source.model) {\n console.log(` Model: ${transcript.source.model}`);\n }\n if (transcript.durationMs !== undefined) {\n console.log(` Duration: ${formatDurationMs(transcript.durationMs)}`);\n }\n if (transcript.tokenUsage) {\n console.log(\n ` Tokens: ${transcript.tokenUsage.input} in / ${transcript.tokenUsage.output} out`,\n );\n }\n },\n});\n\nfunction formatAge(date: Date): string {\n const diffMs = Date.now() - date.getTime();\n const diffMin = Math.floor(diffMs / 60_000);\n if (diffMin < 60) return `${diffMin}m ago`;\n const diffHours = Math.floor(diffMin / 60);\n if (diffHours < 24) return `${diffHours}h ago`;\n const diffDays = Math.floor(diffHours / 24);\n return `${diffDays}d ago`;\n}\n\nfunction transcriptWriteOptions(\n testId: string | undefined,\n target: string | undefined,\n): { testId?: string; target?: string } {\n return {\n ...(testId ? { testId } : {}),\n ...(target ? { target } : {}),\n };\n}\n\nfunction formatDurationMs(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return `${minutes}m ${remainingSeconds}s`;\n}\n","/**\n * `agentv import huggingface` — Import a HuggingFace dataset into AgentV EVAL.yaml format.\n *\n * Wraps the Python script `scripts/import-huggingface.py` which uses the\n * `datasets` library to load from HuggingFace Hub and converts instances\n * (e.g. SWE-bench) into individual .EVAL.yaml files.\n *\n * The Python script is executed via `uv run` (per repo convention for Python\n * scripts). The `uv` tool auto-installs script dependencies from the inline\n * metadata block.\n *\n * Usage:\n * agentv import huggingface --repo SWE-bench/SWE-bench_Verified --split test --limit 10 --output evals/swebench/\n */\n\nimport { execFile } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { command, number, option, optional, string } from 'cmd-ts';\n\n/**\n * Resolve the path to the import-huggingface.py script.\n *\n * Searches upward from the CLI package directory to find the repo root\n * (where scripts/ lives). Falls back to cwd-relative path.\n */\nfunction findScript(): string {\n // Try relative to this file's compiled location (apps/cli/dist/ or apps/cli/src/)\n const candidates = [\n path.resolve(__dirname, '..', '..', '..', '..', '..', 'scripts', 'import-huggingface.py'),\n path.resolve(__dirname, '..', '..', '..', '..', 'scripts', 'import-huggingface.py'),\n path.resolve(process.cwd(), 'scripts', 'import-huggingface.py'),\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate)) return candidate;\n }\n return candidates[candidates.length - 1]; // fallback to cwd-relative\n}\n\nexport const importHuggingFaceCommand = command({\n name: 'huggingface',\n description: 'Import a HuggingFace dataset into AgentV EVAL.yaml format',\n args: {\n repo: option({\n type: string,\n long: 'repo',\n description: 'HuggingFace dataset repository (e.g. SWE-bench/SWE-bench_Verified)',\n }),\n split: option({\n type: optional(string),\n long: 'split',\n description: 'Dataset split to load (default: test)',\n }),\n limit: option({\n type: optional(number),\n long: 'limit',\n description: 'Maximum number of instances to import',\n }),\n output: option({\n type: optional(string),\n long: 'output',\n short: 'o',\n description: 'Output directory for EVAL.yaml files (default: evals/)',\n }),\n },\n handler: async ({ repo, split, limit, output }) => {\n const scriptPath = findScript();\n\n if (!existsSync(scriptPath)) {\n console.error(`Error: Python script not found at ${scriptPath}`);\n console.error(\n 'Make sure you are running from the agentv repository root, or install agentv from source.',\n );\n process.exit(1);\n }\n\n // Build arguments for the Python script\n const args = [scriptPath, '--repo', repo];\n if (split) args.push('--split', split);\n if (limit !== undefined) args.push('--limit', String(limit));\n if (output) args.push('--output', output);\n\n console.log(`Importing from HuggingFace: ${repo} (split=${split ?? 'test'})...`);\n\n // Execute via uv run\n try {\n await new Promise<void>((resolve, reject) => {\n const child = execFile('uv', ['run', ...args], { maxBuffer: 50 * 1024 * 1024 }, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n\n // Collect stderr for error reporting\n let stderrBuf = '';\n child.stderr?.on('data', (data: Buffer) => {\n const chunk = data.toString();\n stderrBuf += chunk;\n process.stderr.write(data);\n });\n\n // Capture stdout (JSON summary)\n let stdout = '';\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.on('close', (code) => {\n if (code === 0 && stdout.trim()) {\n try {\n const summary = JSON.parse(stdout.trim());\n console.log(\n `\\nImported ${summary.files_created} eval(s) from ${summary.dataset} → ${summary.output_dir}/`,\n );\n } catch {\n // If JSON parsing fails, just print raw output\n if (stdout.trim()) console.log(stdout.trim());\n }\n } else if (code !== 0) {\n // Surface a bounded stderr summary so the user sees what went wrong\n const tail = stderrBuf.trim().slice(-2000);\n if (tail) {\n console.error('\\n--- import-huggingface.py stderr (last 2 000 chars) ---');\n console.error(tail);\n }\n }\n });\n });\n } catch (err: unknown) {\n // Handle missing `uv` binary (ENOENT) with a clear message\n if (err instanceof Error && (err as NodeJS.ErrnoException).code === 'ENOENT') {\n console.error(\n 'Error: `uv` is not installed or not found on PATH.\\n' +\n 'Install it with: curl -LsSf https://astral.sh/uv/install.sh | sh\\n' +\n 'See https://docs.astral.sh/uv/ for details.',\n );\n process.exit(1);\n }\n throw err;\n }\n },\n});\n","import { subcommands } from 'cmd-ts';\n\nimport { importClaudeCommand } from './claude.js';\nimport { importCodexCommand } from './codex.js';\nimport { importCopilotCommand } from './copilot.js';\nimport { importHuggingFaceCommand } from './huggingface.js';\n\nexport const importCommand = subcommands({\n name: 'import',\n description: 'Import agent session transcripts and datasets for offline grading',\n cmds: {\n claude: importClaudeCommand,\n codex: importCodexCommand,\n copilot: importCopilotCommand,\n huggingface: importHuggingFaceCommand,\n },\n});\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\nimport * as readline from 'node:readline/promises';\nimport { command, option, optional, string } from 'cmd-ts';\n\nimport { getAgentvTemplates, getEnvExampleTemplate } from '../../templates/index.js';\n\nexport interface InitCommandOptions {\n targetPath?: string;\n}\n\nfunction printSkillFirstInstructions(): void {\n console.log('\\nAI-skills-first setup (recommended):');\n console.log(' agentv skills get agentv-bench');\n console.log(' Then ask your agent: \"Set up AgentV in this repo.\"');\n console.log('\\nOr install the agentv-dev plugin for automatic skill discovery:');\n console.log(' npx allagents plugin marketplace add EntityProcess/agentv');\n console.log(' npx allagents plugin install agentv-dev@agentv');\n}\n\nasync function promptYesNo(message: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n const answer = await rl.question(`${message} (y/N): `);\n return answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';\n } finally {\n rl.close();\n }\n}\n\nexport async function initCommand(options: InitCommandOptions = {}): Promise<void> {\n const targetPath = path.resolve(options.targetPath ?? '.');\n const agentvDir = path.join(targetPath, '.agentv');\n\n // Get templates for legacy bootstrap files only.\n const otherAgentvTemplates = getAgentvTemplates();\n\n // .env.example lives at templates root (not inside .agentv/) to avoid duplication\n const envTemplate = getEnvExampleTemplate();\n\n // Check if any files already exist\n const existingFiles: string[] = [];\n\n // Check for .env.example in root\n if (envTemplate) {\n const envFilePath = path.join(targetPath, '.env.example');\n if (existsSync(envFilePath)) {\n existingFiles.push('.env.example');\n }\n }\n\n if (existsSync(agentvDir)) {\n for (const template of otherAgentvTemplates) {\n const targetFilePath = path.join(agentvDir, template.path);\n if (existsSync(targetFilePath)) {\n existingFiles.push(path.relative(targetPath, targetFilePath));\n }\n }\n }\n // If files exist, prompt user\n if (existingFiles.length > 0) {\n console.log('We detected an existing setup:');\n for (const file of existingFiles) {\n console.log(` - ${file}`);\n }\n console.log();\n\n const shouldReplace = await promptYesNo('Do you want to replace these files?');\n if (!shouldReplace) {\n console.log('\\nInit cancelled. No files were changed.');\n printSkillFirstInstructions();\n return;\n }\n console.log();\n }\n\n // Create .agentv directory if it doesn't exist\n if (!existsSync(agentvDir)) {\n mkdirSync(agentvDir, { recursive: true });\n }\n\n // Create .env.example in the current working directory\n if (envTemplate) {\n const envFilePath = path.join(targetPath, '.env.example');\n writeFileSync(envFilePath, envTemplate.content, 'utf-8');\n console.log('Created .env.example');\n }\n\n // Copy remaining .agentv templates (excluding .env.example)\n for (const template of otherAgentvTemplates) {\n const targetFilePath = path.join(agentvDir, template.path);\n const targetDirPath = path.dirname(targetFilePath);\n\n // Create directory if needed\n if (!existsSync(targetDirPath)) {\n mkdirSync(targetDirPath, { recursive: true });\n }\n\n // Write file\n writeFileSync(targetFilePath, template.content, 'utf-8');\n console.log(`Created ${path.relative(targetPath, targetFilePath)}`);\n }\n\n console.log('\\nAgentV initialized successfully!');\n console.log('\\nFiles installed to root:');\n if (envTemplate) {\n console.log(' - .env.example');\n }\n console.log(`\\nFiles installed to ${path.relative(targetPath, agentvDir)}:`);\n for (const t of otherAgentvTemplates) {\n console.log(` - ${t.path}`);\n }\n console.log('\\nYou can now:');\n console.log(' 1. Copy .env.example to .env and add your API credentials');\n console.log(' 2. Configure providers in .agentv/providers.yaml');\n console.log(' 3. Use AI skills to create and run evals');\n printSkillFirstInstructions();\n}\n\nexport const initCmdTsCommand = command({\n name: 'init',\n description: 'Initialize AgentV bootstrap files in your project',\n args: {\n path: option({\n type: optional(string),\n long: 'path',\n description: 'Target directory for initialization (default: current directory)',\n }),\n },\n handler: async ({ path: targetPath }) => {\n try {\n await initCommand({ targetPath });\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n },\n});\n","import { readFileSync, readdirSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface Template {\n path: string;\n content: string;\n}\n\nexport function getAgentvTemplates(): Template[] {\n return getTemplatesFromDir('.agentv');\n}\n\nexport function getEnvExampleTemplate(): Template {\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n const templatesBase = currentDir.includes(`${path.sep}dist`)\n ? path.join(currentDir, 'templates')\n : currentDir;\n const content = readFileSync(path.join(templatesBase, '.env.example'), 'utf-8');\n return { path: '.env.example', content };\n}\n\nfunction getTemplatesFromDir(subdir: string): Template[] {\n const currentDir = path.dirname(fileURLToPath(import.meta.url));\n\n // Check if we're running from dist or src\n let templatesDir: string;\n if (currentDir.includes(`${path.sep}dist`)) {\n // Production: templates are at dist/templates/\n templatesDir = path.join(currentDir, 'templates', subdir);\n } else {\n // Development: templates are at src/templates/ (same directory as this file)\n templatesDir = path.join(currentDir, subdir);\n }\n\n return readTemplatesRecursively(templatesDir, '');\n}\n\nfunction readTemplatesRecursively(dir: string, relativePath: string): Template[] {\n const templates: Template[] = [];\n const entries = readdirSync(dir);\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry);\n const stat = statSync(fullPath);\n const entryRelativePath = relativePath ? path.join(relativePath, entry) : entry;\n\n if (stat.isDirectory()) {\n // Recursively read subdirectories\n templates.push(...readTemplatesRecursively(fullPath, entryRelativePath));\n } else {\n // Read file content\n const content = readFileSync(fullPath, 'utf-8');\n templates.push({\n path: entryRelativePath.split(path.sep).join('/'), // Normalize to forward slashes\n content,\n });\n }\n }\n\n return templates;\n}\n","/**\n * `agentv inspect filter` — filter evaluation results by metadata criteria.\n *\n * Scans JSONL index files in `.agentv/results/` and applies filters\n * such as target name, experiment name, score thresholds, execution status,\n * and tool usage. Outputs matching test IDs with summary info.\n *\n * Each filter is optional and combinable (AND logic). Results must match\n * all specified filters to be included.\n *\n * To extend: add new filter predicates in `buildFilterPredicate()`.\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport { command, number, oneOf, option, optional, positional, string } from 'cmd-ts';\nimport {\n isReservedResultsNamespace,\n resolveExistingRunPrimaryPath,\n} from '../eval/result-layout.js';\nimport { normalizeResultRow } from '../results/result-row-schema.js';\nimport { c, formatScore, padLeft, padRight } from './utils.js';\n\n/** A lightweight result record with fields needed for filtering. */\nexport interface FilterableRecord {\n file: string;\n test_id: string;\n suite?: string;\n target?: string;\n experiment?: string;\n score: number;\n execution_status?: string;\n error?: string;\n timestamp?: string;\n /** Flattened set of tool names found in trace.tool_calls or output messages. */\n tool_names: string[];\n}\n\n/**\n * Recursively collect one run manifest per bundle under the runs directory.\n */\nfunction collectIndexFiles(dir: string): string[] {\n const primaryPath = resolveExistingRunPrimaryPath(dir);\n if (primaryPath) {\n return [primaryPath];\n }\n\n const files: string[] = [];\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...collectIndexFiles(fullPath));\n }\n }\n } catch {\n // Directory may not exist\n }\n return files;\n}\n\nfunction collectCurrentResultIndexFiles(cwd: string): string[] {\n const resultsDir = path.join(cwd, '.agentv', 'results');\n const files: string[] = [];\n try {\n const entries = readdirSync(resultsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (isReservedResultsNamespace(entry.name)) continue;\n const fullPath = path.join(resultsDir, entry.name);\n if (entry.isDirectory()) {\n files.push(...collectIndexFiles(fullPath));\n }\n }\n } catch {\n // Directory may not exist\n }\n return files;\n}\n\n/**\n * Extract tool names from a result record.\n * Looks in trace.tool_calls (Record<string, number>) and output messages (tool_calls[].tool).\n */\nfunction extractToolNames(record: Record<string, unknown>): string[] {\n const tools = new Set<string>();\n\n // From trace.tool_calls\n const trace = record.trace as Record<string, unknown> | undefined;\n if (trace?.tool_calls && typeof trace.tool_calls === 'object') {\n for (const name of Object.keys(trace.tool_calls as Record<string, unknown>)) {\n tools.add(name);\n }\n }\n\n // From output messages (array of messages with tool_calls)\n const output = record.output;\n if (Array.isArray(output)) {\n for (const msg of output) {\n if (\n typeof msg === 'object' &&\n msg !== null &&\n Array.isArray((msg as Record<string, unknown>).tool_calls)\n ) {\n for (const tc of (msg as Record<string, unknown>).tool_calls as Record<string, unknown>[]) {\n if (typeof tc.tool === 'string') {\n tools.add(tc.tool);\n }\n }\n }\n }\n }\n\n // From scores[].type or scores[].assertions evidence mentioning tools\n // (kept minimal — primary source is trace.tool_calls and output messages)\n\n return [...tools];\n}\n\nfunction inferExperimentFromPath(filePath: string): string | undefined {\n const parts = filePath.split(path.sep);\n const resultsIdx = parts.lastIndexOf('results');\n if (resultsIdx === -1) return undefined;\n\n const runPath = parts.slice(resultsIdx + 1, -1);\n if (isReservedResultsNamespace(runPath[0])) return undefined;\n if (runPath.length < 2) return undefined;\n\n const candidate = runPath[0];\n if (candidate && !/^\\d{4}-\\d{2}-\\d{2}T/.test(candidate)) {\n return candidate;\n }\n return undefined;\n}\n\n/**\n * Parse a single JSONL index file into filterable records.\n */\nexport function parseFilterableRecords(filePath: string): FilterableRecord[] {\n let content: string;\n try {\n content = readFileSync(filePath, 'utf8');\n } catch {\n return [];\n }\n\n const lines = content.split('\\n').filter((line) => line.trim());\n const records: FilterableRecord[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n let raw: Record<string, unknown>;\n try {\n raw = JSON.parse(line) as Record<string, unknown>;\n } catch {\n continue;\n }\n raw = normalizeResultRow(raw, { lineNumber: i + 1, sourceLabel: filePath });\n\n // Determine experiment from record or from directory path\n let experiment = typeof raw.experiment === 'string' ? raw.experiment : undefined;\n if (!experiment) {\n experiment = inferExperimentFromPath(filePath);\n }\n\n records.push({\n file: filePath,\n test_id: typeof raw.test_id === 'string' ? raw.test_id : 'unknown',\n suite: typeof raw.suite === 'string' ? raw.suite : undefined,\n target: typeof raw.target === 'string' ? raw.target : undefined,\n experiment,\n score: typeof raw.score === 'number' ? raw.score : 0,\n execution_status: typeof raw.execution_status === 'string' ? raw.execution_status : undefined,\n error: typeof raw.error === 'string' ? raw.error : undefined,\n timestamp: typeof raw.timestamp === 'string' ? raw.timestamp : undefined,\n tool_names: extractToolNames(raw),\n });\n }\n\n return records;\n}\n\n/** Filter predicate that checks all criteria. */\nexport type FilterPredicate = (record: FilterableRecord) => boolean;\n\nexport function buildFilterPredicate(opts: {\n target?: string;\n experiment?: string;\n scoreBelow?: number;\n scoreAbove?: number;\n status?: string;\n hasTool?: string;\n}): FilterPredicate {\n return (record) => {\n if (opts.target && record.target !== opts.target) return false;\n if (opts.experiment && record.experiment !== opts.experiment) return false;\n if (opts.scoreBelow !== undefined && record.score >= opts.scoreBelow) return false;\n if (opts.scoreAbove !== undefined && record.score <= opts.scoreAbove) return false;\n if (opts.status) {\n // Map user-friendly names to execution_status values\n const statusMap: Record<string, string[]> = {\n pass: ['ok'],\n fail: ['quality_failure'],\n error: ['error', 'timeout', 'provider_error'],\n };\n const allowedStatuses = statusMap[opts.status] ?? [opts.status];\n if (record.execution_status && !allowedStatuses.includes(record.execution_status))\n return false;\n if (!record.execution_status) {\n // Infer from score if execution_status is missing\n if (opts.status === 'pass' && record.score < 1) return false;\n if (opts.status === 'fail' && record.score >= 1) return false;\n if (opts.status === 'error' && !record.error) return false;\n }\n }\n if (opts.hasTool) {\n const toolPattern = opts.hasTool.toLowerCase();\n const hasMatch = record.tool_names.some((t) => t.toLowerCase().includes(toolPattern));\n if (!hasMatch) return false;\n }\n return true;\n };\n}\n\nfunction discoverFilterSources(searchPath: string | undefined, cwd: string): string[] {\n if (searchPath) {\n const resolved = path.isAbsolute(searchPath) ? searchPath : path.resolve(cwd, searchPath);\n if (!existsSync(resolved)) {\n console.error(`${c.red}Error:${c.reset} Path does not exist: ${resolved}`);\n process.exit(1);\n }\n try {\n if (statSync(resolved).isDirectory()) {\n return collectIndexFiles(resolved);\n }\n } catch {\n // Fall through\n }\n return [resolved];\n }\n\n return collectCurrentResultIndexFiles(cwd);\n}\n\nfunction formatFilterTable(records: FilterableRecord[]): string {\n const lines: string[] = [];\n\n if (records.length === 0) {\n lines.push(`${c.yellow}No matching results found.${c.reset}`);\n return lines.join('\\n');\n }\n\n lines.push('');\n lines.push(\n `${c.bold}Filtered Results${c.reset} ${c.dim}(${records.length} match${records.length !== 1 ? 'es' : ''})${c.reset}`,\n );\n lines.push('');\n\n // Compute column widths\n const maxIdLen = Math.min(32, Math.max(7, ...records.map((r) => r.test_id.length)));\n const maxTargetLen = Math.min(16, Math.max(6, ...records.map((r) => (r.target ?? '').length)));\n const maxExpLen = Math.min(20, Math.max(10, ...records.map((r) => (r.experiment ?? '').length)));\n\n // Header\n const header = ` ${padRight('Test ID', maxIdLen)} ${padRight('Target', maxTargetLen)} ${padRight('Experiment', maxExpLen)} ${padLeft('Score', 6)} Status`;\n lines.push(`${c.dim}${header}${c.reset}`);\n lines.push(\n `${c.dim} ${'─'.repeat(maxIdLen)} ${'─'.repeat(maxTargetLen)} ${'─'.repeat(maxExpLen)} ${'─'.repeat(6)} ${'─'.repeat(16)}${c.reset}`,\n );\n\n for (const record of records) {\n const scoreColor = record.score >= 1 ? c.green : record.score >= 0.5 ? c.yellow : c.red;\n const status =\n record.execution_status ??\n (record.error ? 'error' : record.score >= 1 ? 'ok' : 'quality_failure');\n const statusColor = status === 'ok' ? c.green : status === 'error' ? c.red : c.yellow;\n\n const row = ` ${padRight(record.test_id.slice(0, maxIdLen), maxIdLen)} ${padRight((record.target ?? '-').slice(0, maxTargetLen), maxTargetLen)} ${padRight((record.experiment ?? '-').slice(0, maxExpLen), maxExpLen)} ${padLeft(`${scoreColor}${formatScore(record.score)}${c.reset}`, 6)} ${statusColor}${status}${c.reset}`;\n lines.push(row);\n }\n\n // Summary\n lines.push('');\n const passCount = records.filter((r) => r.score >= 1).length;\n const avgScore =\n records.length > 0 ? records.reduce((sum, r) => sum + r.score, 0) / records.length : 0;\n lines.push(\n `${c.dim}${records.length} result${records.length !== 1 ? 's' : ''} | ${passCount} passed | avg score: ${formatScore(avgScore)}${c.reset}`,\n );\n lines.push('');\n\n return lines.join('\\n');\n}\n\nexport const inspectFilterCommand = command({\n name: 'filter',\n description: 'Filter evaluation results by target, experiment, score, status, or tool usage',\n args: {\n path: positional({\n type: optional(string),\n displayName: 'path',\n description: 'Directory or file to filter (default: .agentv/results/)',\n }),\n target: option({\n type: optional(string),\n long: 'target',\n description: 'Filter by target name',\n }),\n experiment: option({\n type: optional(string),\n long: 'experiment',\n description: 'Filter by experiment name',\n }),\n scoreBelow: option({\n type: optional(number),\n long: 'score-below',\n description: 'Filter to results with score below this value',\n }),\n scoreAbove: option({\n type: optional(number),\n long: 'score-above',\n description: 'Filter to results with score above this value',\n }),\n status: option({\n type: optional(string),\n long: 'status',\n description:\n 'Filter by execution status: pass, fail, error (or raw value like ok, quality_failure)',\n }),\n hasTool: option({\n type: optional(string),\n long: 'has-tool',\n description: 'Filter to results that used a specific tool (substring match)',\n }),\n dir: option({\n type: optional(string),\n long: 'dir',\n short: 'd',\n description: 'Working directory (default: current directory)',\n }),\n format: option({\n type: optional(oneOf(['table', 'json'])),\n long: 'format',\n short: 'f',\n description: 'Output format: table (default) or json',\n }),\n },\n handler: async ({\n path: searchPath,\n target,\n experiment,\n scoreBelow,\n scoreAbove,\n status,\n hasTool,\n dir,\n format,\n }) => {\n const cwd = dir ?? process.cwd();\n\n // Discover sources\n const sources = discoverFilterSources(searchPath, cwd);\n if (sources.length === 0) {\n console.error(`${c.yellow}No result files found.${c.reset}`);\n console.error(`${c.dim}Run an evaluation first, or specify a path.${c.reset}`);\n process.exit(0);\n }\n\n // Load all records\n const allRecords: FilterableRecord[] = [];\n for (const source of sources) {\n allRecords.push(...parseFilterableRecords(source));\n }\n\n if (allRecords.length === 0) {\n console.error(`${c.yellow}No results found in the specified path.${c.reset}`);\n process.exit(0);\n }\n\n // Apply filters\n const predicate = buildFilterPredicate({\n target,\n experiment,\n scoreBelow,\n scoreAbove,\n status,\n hasTool,\n });\n const filtered = allRecords.filter(predicate);\n\n if (format === 'json') {\n console.log(JSON.stringify(filtered, null, 2));\n } else {\n console.log(formatFilterTable(filtered));\n }\n },\n});\n","import { toSnakeCaseDeep } from '@agentv/core';\nimport { command, number, oneOf, option, optional, string } from 'cmd-ts';\nimport {\n type ResultFileMeta,\n c,\n formatScore,\n formatSize,\n listResultFiles,\n padLeft,\n padRight,\n} from './utils.js';\n\nfunction formatListTable(metas: ResultFileMeta[]): string {\n const lines: string[] = [];\n\n if (metas.length === 0) {\n lines.push(`${c.yellow}No run workspaces found in .agentv/results/${c.reset}`);\n lines.push(`${c.dim}Run an evaluation first: agentv run <eval-file>${c.reset}`);\n return lines.join('\\n');\n }\n\n lines.push('');\n lines.push(`${c.bold}Evaluation Runs${c.reset} ${c.dim}(.agentv/results/)${c.reset}`);\n lines.push('');\n\n // Column widths\n const maxFileLen = Math.max(4, ...metas.map((m) => m.filename.length));\n\n // Header\n const header = ` ${padRight('File', maxFileLen)} ${padLeft('Tests', 5)} ${padLeft('Pass', 5)} ${padLeft('Score', 6)} ${padLeft('Size', 7)} Timestamp`;\n lines.push(`${c.dim}${header}${c.reset}`);\n lines.push(\n `${c.dim} ${'─'.repeat(maxFileLen)} ${'─'.repeat(5)} ${'─'.repeat(5)} ${'─'.repeat(6)} ${'─'.repeat(7)} ${'─'.repeat(24)}${c.reset}`,\n );\n\n for (const meta of metas) {\n const passColor = meta.passRate >= 1.0 ? c.green : meta.passRate >= 0.5 ? c.yellow : c.red;\n const scoreColor = meta.avgScore >= 0.9 ? c.green : meta.avgScore >= 0.5 ? c.yellow : c.red;\n\n const row = ` ${padRight(meta.filename, maxFileLen)} ${padLeft(String(meta.testCount), 5)} ${padLeft(`${passColor}${formatScore(meta.passRate)}${c.reset}`, 5)} ${padLeft(`${scoreColor}${formatScore(meta.avgScore)}${c.reset}`, 6)} ${padLeft(formatSize(meta.sizeBytes), 7)} ${c.dim}${meta.timestamp}${c.reset}`;\n lines.push(row);\n }\n\n lines.push('');\n lines.push(\n `${c.dim}${metas.length} run workspace${metas.length !== 1 ? 's' : ''} found${c.reset}`,\n );\n lines.push('');\n\n return lines.join('\\n');\n}\n\nexport const traceListCommand = command({\n name: 'list',\n description: 'List recent evaluation run workspaces from .agentv/results/',\n args: {\n limit: option({\n type: optional(number),\n long: 'limit',\n short: 'n',\n description: 'Maximum number of results to show (default: all)',\n }),\n format: option({\n type: optional(oneOf(['table', 'json'])),\n long: 'format',\n short: 'f',\n description: 'Output format: table (default) or json',\n }),\n dir: option({\n type: optional(string),\n long: 'dir',\n short: 'd',\n description: 'Working directory (default: current directory)',\n }),\n },\n handler: async ({ limit, format, dir }) => {\n const cwd = dir ?? process.cwd();\n const outputFormat = format ?? 'table';\n\n try {\n const metas = listResultFiles(cwd, limit);\n\n if (outputFormat === 'json') {\n console.log(JSON.stringify(toSnakeCaseDeep(metas), null, 2));\n } else {\n console.log(formatListTable(metas));\n }\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n },\n});\n","import {\n type EvalTest,\n type EvaluationContext,\n type EvaluationScore,\n type Grader,\n type GraderConfig,\n type GraderDispatchContext,\n type Message,\n type Provider,\n type ProviderRequest,\n type ProviderResponse,\n buildTraceFromMessages,\n createBuiltinRegistry,\n toCamelCaseDeep,\n} from '@agentv/core';\nimport { command, oneOf, option, optional, positional, string } from 'cmd-ts';\nimport {\n type RawResult,\n c,\n formatScore,\n loadResultFile,\n padLeft,\n padRight,\n toTraceSummary,\n} from './utils.js';\n\n/**\n * Grader types that work without an LLM provider.\n */\nconst SUPPORTED_TYPES = [\n 'contains',\n 'regex',\n 'is-json',\n 'equals',\n 'latency',\n 'cost',\n 'token-usage',\n 'execution-metrics',\n] as const;\n\n/**\n * Parse key=value pairs from a string like \"max_tool_calls=10,max_tokens=2000\"\n */\nfunction parseKeyValues(s: string): Record<string, string> {\n const result: Record<string, string> = {};\n if (!s) return result;\n for (const pair of s.split(',')) {\n const eqIdx = pair.indexOf('=');\n if (eqIdx === -1) continue;\n result[pair.slice(0, eqIdx).trim()] = pair.slice(eqIdx + 1).trim();\n }\n return result;\n}\n\n/**\n * Parse an inline evaluator spec string into an GraderConfig.\n *\n * Supported formats:\n * contains:value\n * regex:pattern\n * is-json\n * equals:value\n * latency:<threshold_ms>\n * cost:<budget_usd>\n * token-usage:max_total=N,max_input=N,max_output=N\n * execution-metrics:max_tool_calls=N,max_tokens=N,max_llm_calls=N,...\n */\nexport function parseAssertSpec(spec: string): GraderConfig {\n const colonIdx = spec.indexOf(':');\n const type = colonIdx === -1 ? spec : spec.slice(0, colonIdx);\n const params = colonIdx === -1 ? '' : spec.slice(colonIdx + 1);\n\n switch (type) {\n case 'contains':\n if (!params) throw new Error('contains requires a value: contains:<value>');\n return { name: 'contains', type: 'contains', value: params } as GraderConfig;\n\n case 'regex':\n if (!params) throw new Error('regex requires a pattern: regex:<pattern>');\n return { name: 'regex', type: 'regex', value: params } as GraderConfig;\n\n case 'is-json':\n return { name: 'is-json', type: 'is-json' } as GraderConfig;\n\n case 'equals':\n if (!params) throw new Error('equals requires a value: equals:<value>');\n return { name: 'equals', type: 'equals', value: params } as GraderConfig;\n\n case 'latency': {\n const threshold = Number(params);\n if (!params || Number.isNaN(threshold))\n throw new Error('latency requires a threshold in ms: latency:<ms>');\n return { name: 'latency', type: 'latency', threshold } as GraderConfig;\n }\n\n case 'cost': {\n const budget = Number(params);\n if (!params || Number.isNaN(budget))\n throw new Error('cost requires a budget in USD: cost:<usd>');\n return { name: 'cost', type: 'cost', budget } as GraderConfig;\n }\n\n case 'token-usage': {\n const kv = parseKeyValues(params);\n const config: Record<string, unknown> = { name: 'token-usage', type: 'token-usage' };\n if (kv.max_total) config.max_total = Number(kv.max_total);\n if (kv.max_input) config.max_input = Number(kv.max_input);\n if (kv.max_output) config.max_output = Number(kv.max_output);\n return config as GraderConfig;\n }\n\n case 'execution-metrics': {\n const kv = parseKeyValues(params);\n const config: Record<string, unknown> = {\n name: 'execution-metrics',\n type: 'execution-metrics',\n };\n if (kv.max_tool_calls) config.max_tool_calls = Number(kv.max_tool_calls);\n if (kv.max_llm_calls) config.max_llm_calls = Number(kv.max_llm_calls);\n if (kv.max_tokens) config.max_tokens = Number(kv.max_tokens);\n if (kv.max_cost_usd) config.max_cost_usd = Number(kv.max_cost_usd);\n if (kv.max_duration_ms) config.max_duration_ms = Number(kv.max_duration_ms);\n return config as GraderConfig;\n }\n\n default:\n throw new Error(\n `Unsupported grader type: \"${type}\". Supported: ${SUPPORTED_TYPES.join(', ')}`,\n );\n }\n}\n\n/**\n * Extract candidate answer from a result record.\n */\nfunction extractCandidate(raw: RawResult): string {\n if (raw.output !== undefined)\n return typeof raw.output === 'string' ? raw.output : JSON.stringify(raw.output);\n return '';\n}\n\n/**\n * Build a minimal EvalTest stub from a result record.\n * Only used to satisfy the EvaluationContext interface — deterministic and\n * trace-based evaluators don't access these fields.\n */\nfunction buildTestCase(raw: RawResult): EvalTest {\n return {\n id: raw.test_id ?? 'unknown',\n question: '',\n input: [],\n expected_output: [],\n\n file_paths: [],\n criteria: '',\n };\n}\n\n/**\n * A no-op provider stub for evaluators that don't call LLM providers.\n */\nconst stubProvider: Provider = {\n id: 'trace-score-stub',\n kind: 'mock',\n targetName: 'trace-score-stub',\n invoke(_request: ProviderRequest): Promise<ProviderResponse> {\n throw new Error('trace score does not support LLM-based evaluators');\n },\n};\n\n/**\n * A no-op evaluator stub used as the required llmGrader in the dispatch context.\n */\nconst stubLlmGrader: Grader = {\n kind: 'llm-grader',\n evaluate(): EvaluationScore {\n throw new Error('trace score does not support LLM-based evaluators');\n },\n};\n\ninterface ScoreResult {\n testId: string;\n candidate: string;\n originalScore: number;\n newScore: number;\n verdict: string;\n assertions: readonly { text: string; passed: boolean; evidence?: string }[];\n}\n\nasync function runScore(\n results: RawResult[],\n evaluatorConfig: GraderConfig,\n testIdFilter?: string,\n): Promise<ScoreResult[]> {\n const registry = createBuiltinRegistry();\n\n const dispatchContext: GraderDispatchContext = {\n llmGrader: stubLlmGrader,\n registry,\n };\n\n const evaluator = await registry.create(evaluatorConfig, dispatchContext);\n const scored: ScoreResult[] = [];\n\n for (const raw of results) {\n if (testIdFilter && raw.test_id !== testIdFilter) continue;\n\n const candidate = extractCandidate(raw);\n const output =\n (raw.trace as { messages?: unknown } | undefined)?.messages ??\n (Array.isArray(raw.output) ? raw.output : undefined);\n const outputMessages = Array.isArray(output)\n ? (toCamelCaseDeep(output) as readonly Message[])\n : undefined;\n const trace =\n raw.trace &&\n Array.isArray((raw.trace as { messages?: unknown }).messages) &&\n Array.isArray((raw.trace as { events?: unknown }).events)\n ? (toCamelCaseDeep(raw.trace) as EvaluationContext['trace'])\n : buildTraceFromMessages({\n output: outputMessages,\n finalOutput: candidate,\n summary: toTraceSummary(raw),\n target: raw.target,\n testId: raw.test_id,\n });\n\n const evalContext: EvaluationContext = {\n evalCase: buildTestCase(raw),\n candidate,\n target: { kind: 'custom' as const, name: raw.target ?? 'unknown', config: {} } as never,\n provider: stubProvider,\n attempt: 1,\n promptInputs: { question: '' },\n now: new Date(),\n output: outputMessages,\n trace,\n tokenUsage: raw.token_usage\n ? (toCamelCaseDeep(raw.token_usage) as EvaluationContext['tokenUsage'])\n : undefined,\n costUsd: raw.cost_usd,\n durationMs: raw.duration_ms,\n startTime: raw.start_time,\n endTime: raw.end_time,\n };\n\n const score = await evaluator.evaluate(evalContext);\n scored.push({\n testId: raw.test_id ?? 'unknown',\n candidate: candidate.slice(0, 80),\n originalScore: raw.score,\n newScore: score.score,\n verdict: score.verdict,\n assertions: score.assertions,\n });\n }\n\n return scored;\n}\n\nfunction renderTable(scored: ScoreResult[], assertSpec: string): string {\n const lines: string[] = [];\n\n // Header\n const cols = [\n { header: 'Test ID', width: 24 },\n { header: 'Orig', width: 6 },\n { header: 'New', width: 6 },\n { header: 'Verdict', width: 8 },\n { header: 'Detail', width: 50 },\n ];\n\n const headerLine = cols\n .map((col) => padRight(`${c.bold}${col.header}${c.reset}`, col.width))\n .join(' ');\n lines.push(headerLine);\n lines.push(cols.map((col) => '─'.repeat(col.width)).join('──'));\n\n for (const r of scored) {\n const verdictColor = r.verdict === 'pass' ? c.green : c.red;\n const failed = r.assertions.filter((a) => !a.passed);\n const passed = r.assertions.filter((a) => a.passed);\n const detail =\n failed.length > 0\n ? failed[0].text.slice(0, 48)\n : passed.length > 0\n ? passed[0].text.slice(0, 48)\n : '';\n\n const row = [\n padRight(r.testId.slice(0, 24), cols[0].width),\n padLeft(formatScore(r.originalScore), cols[1].width),\n padLeft(`${verdictColor}${formatScore(r.newScore)}${c.reset}`, cols[2].width),\n padRight(`${verdictColor}${r.verdict.toUpperCase()}${c.reset}`, cols[3].width),\n detail.slice(0, cols[4].width),\n ].join(' ');\n lines.push(row);\n }\n\n // Summary\n const passCount = scored.filter((r) => r.verdict === 'pass').length;\n const total = scored.length;\n const meanScore = total > 0 ? scored.reduce((sum, r) => sum + r.newScore, 0) / total : 0;\n lines.push('');\n lines.push(\n `${c.bold}Assert:${c.reset} ${assertSpec} ${c.bold}Results:${c.reset} ${passCount}/${total} passed (${formatScore(passCount / (total || 1))}) ${c.bold}Mean:${c.reset} ${formatScore(meanScore)}`,\n );\n\n return lines.join('\\n');\n}\n\nexport const traceScoreCommand = command({\n name: 'score',\n description: 'Run evaluators against existing trace sources post-hoc',\n args: {\n file: positional({\n type: string,\n displayName: 'trace-source',\n description:\n 'Path to a run workspace, result manifest, simple trace JSONL, or OTLP JSON file',\n }),\n assert: option({\n type: string,\n long: 'assert',\n short: 'a',\n description:\n 'Grader spec: contains:<val>, regex:<pat>, is-json, equals:<val>, latency:<ms>, cost:<usd>, token-usage:<params>, execution-metrics:<params>',\n }),\n testId: option({\n type: optional(string),\n long: 'test-id',\n description: 'Filter to a specific test ID',\n }),\n format: option({\n type: optional(oneOf(['json', 'table'])),\n long: 'format',\n short: 'f',\n description: 'Output format (default: table)',\n }),\n },\n handler: async ({ file, assert: assertSpec, testId, format }) => {\n // Parse the evaluator spec\n let evaluatorConfig: GraderConfig;\n try {\n evaluatorConfig = parseAssertSpec(assertSpec);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`${c.red}Error:${c.reset} ${msg}`);\n process.exit(1);\n }\n\n // Load results\n let results: RawResult[];\n try {\n results = loadResultFile(file);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`${c.red}Error:${c.reset} Could not load result file: ${msg}`);\n process.exit(1);\n }\n\n if (results.length === 0) {\n console.error(`${c.yellow}Warning:${c.reset} No results found in ${file}`);\n process.exit(0);\n }\n\n // Check for trace data if evaluator needs it\n const traceRequired = ['latency', 'cost', 'token-usage', 'execution-metrics'].includes(\n evaluatorConfig.type,\n );\n if (traceRequired) {\n const hasTrace = results.some(\n (r) =>\n toTraceSummary(r) ||\n r.cost_usd !== undefined ||\n r.duration_ms !== undefined ||\n r.token_usage !== undefined,\n );\n if (!hasTrace) {\n console.error(\n `${c.red}Error:${c.reset} Source lacks trace metrics. Use a run manifest with summary metrics in ${c.bold}index.jsonl${c.reset} or import an external OTLP trace that already contains metrics.`,\n );\n process.exit(1);\n }\n }\n\n // Run scoring\n let scored: ScoreResult[];\n try {\n scored = await runScore(results, evaluatorConfig, testId);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error(`${c.red}Error:${c.reset} Scoring failed: ${msg}`);\n process.exit(1);\n }\n\n if (scored.length === 0) {\n console.error(\n `${c.yellow}Warning:${c.reset} No results matched${testId ? ` test ID \"${testId}\"` : ''}`,\n );\n process.exit(0);\n }\n\n // Output\n if (format === 'json') {\n console.log(JSON.stringify(scored, null, 2));\n } else {\n console.log(renderTable(scored, assertSpec));\n }\n\n // Exit with non-zero if any failed\n const hasFailures = scored.some((r) => r.verdict !== 'pass');\n if (hasFailures) {\n process.exit(1);\n }\n },\n});\n","/**\n * `agentv inspect search` — regex search across evaluation results and transcripts.\n *\n * Scans JSONL files in `.agentv/results/` and `.agentv/transcripts/` for\n * lines matching a regex pattern. Outputs file path, test_id, and matching\n * content with surrounding context.\n *\n * Supported sources:\n * - Run result manifests — searches serialized JSON content\n * - Transcript JSONL files — searches message content and tool call data\n *\n * To extend: add new scanners in the `scanSources()` function for additional\n * JSONL-based data directories.\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\nimport path from 'node:path';\nimport { toSnakeCaseDeep } from '@agentv/core';\nimport { command, oneOf, option, optional, positional, string } from 'cmd-ts';\nimport { isReservedResultsNamespace } from '../eval/result-layout.js';\nimport { c, padRight } from './utils.js';\n\n/** A single search match within a JSONL line. */\nexport interface SearchMatch {\n /** Absolute path to the source file. */\n file: string;\n /** Identifier extracted from the record (test_id, session_id, etc.). */\n id: string;\n /** The line number within the file (1-based). */\n lineNumber: number;\n /** The matched text snippet with surrounding context. */\n snippet: string;\n /** Optional metadata: target, experiment, score. */\n target?: string;\n experiment?: string;\n score?: number;\n}\n\n/**\n * Recursively collect all JSONL files under a directory.\n */\nfunction collectJsonlFiles(dir: string): string[] {\n const files: string[] = [];\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...collectJsonlFiles(fullPath));\n } else if (entry.name.endsWith('.jsonl')) {\n files.push(fullPath);\n }\n }\n } catch {\n // Directory may not exist\n }\n return files;\n}\n\nfunction collectCurrentResultJsonlFiles(cwd: string): string[] {\n const resultsDir = path.join(cwd, '.agentv', 'results');\n const files: string[] = [];\n try {\n const entries = readdirSync(resultsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (isReservedResultsNamespace(entry.name)) continue;\n const fullPath = path.join(resultsDir, entry.name);\n if (entry.isDirectory()) {\n files.push(...collectJsonlFiles(fullPath));\n } else if (entry.name.endsWith('.jsonl')) {\n files.push(fullPath);\n }\n }\n } catch {\n // Directory may not exist\n }\n return files;\n}\n\n/**\n * Extract a human-readable snippet around a regex match within a string.\n * Returns up to `contextChars` characters on each side of the match.\n */\nfunction extractSnippet(\n text: string,\n matchIndex: number,\n matchLength: number,\n contextChars = 60,\n): string {\n const start = Math.max(0, matchIndex - contextChars);\n const end = Math.min(text.length, matchIndex + matchLength + contextChars);\n let snippet = text.slice(start, end);\n if (start > 0) snippet = `...${snippet}`;\n if (end < text.length) snippet = `${snippet}...`;\n // Collapse whitespace for readability\n return snippet.replace(/\\n/g, '\\\\n').replace(/\\r/g, '');\n}\n\n/**\n * Search a single JSONL file for regex matches.\n */\nexport function searchJsonlFile(\n filePath: string,\n regex: RegExp,\n targetFilter?: string,\n experimentFilter?: string,\n): SearchMatch[] {\n const matches: SearchMatch[] = [];\n let content: string;\n try {\n content = readFileSync(filePath, 'utf8');\n } catch {\n return matches;\n }\n\n const lines = content.split('\\n').filter((line) => line.trim());\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n let record: Record<string, unknown>;\n try {\n record = JSON.parse(line) as Record<string, unknown>;\n } catch {\n continue;\n }\n\n // Extract metadata for filtering\n const target = typeof record.target === 'string' ? record.target : undefined;\n const experiment = typeof record.experiment === 'string' ? record.experiment : undefined;\n const score = typeof record.score === 'number' ? record.score : undefined;\n const testId =\n typeof record.test_id === 'string'\n ? record.test_id\n : typeof record.testId === 'string'\n ? record.testId\n : typeof record.source === 'object' && record.source !== null\n ? ((record.source as Record<string, unknown>).session_id as string | undefined)\n : undefined;\n\n // Apply metadata filters before regex search\n if (targetFilter && target !== targetFilter) continue;\n if (experimentFilter && experiment !== experimentFilter) continue;\n\n // Search the entire serialized line for the pattern\n const match = regex.exec(line);\n if (match) {\n matches.push({\n file: filePath,\n id: testId ?? `line-${i + 1}`,\n lineNumber: i + 1,\n snippet: extractSnippet(line, match.index, match[0].length),\n target,\n experiment,\n score,\n });\n }\n }\n\n return matches;\n}\n\n/**\n * Discover all searchable JSONL sources under a base path.\n * If the path is a file, search that single file.\n * If it's a directory, recursively find all .jsonl files.\n * If not specified, scan both .agentv/results/ and .agentv/transcripts/.\n */\nfunction discoverSources(basePath: string | undefined, cwd: string): string[] {\n if (basePath) {\n const resolved = path.isAbsolute(basePath) ? basePath : path.resolve(cwd, basePath);\n if (!existsSync(resolved)) {\n console.error(`${c.red}Error:${c.reset} Path does not exist: ${resolved}`);\n process.exit(1);\n }\n try {\n if (statSync(resolved).isDirectory()) {\n return collectJsonlFiles(resolved);\n }\n } catch {\n // Not a directory — treat as file\n }\n return [resolved];\n }\n\n // Default: scan both results and transcripts\n const sources: string[] = [];\n sources.push(...collectCurrentResultJsonlFiles(cwd));\n sources.push(...collectJsonlFiles(path.join(cwd, '.agentv', 'transcripts')));\n return sources;\n}\n\nfunction formatSearchResults(matches: SearchMatch[], pattern: string): string {\n const lines: string[] = [];\n\n if (matches.length === 0) {\n lines.push(`${c.yellow}No matches found for pattern: ${pattern}${c.reset}`);\n return lines.join('\\n');\n }\n\n lines.push('');\n lines.push(`${c.bold}Search Results${c.reset} ${c.dim}pattern: /${pattern}/${c.reset}`);\n lines.push(\n `${c.dim}${matches.length} record${matches.length !== 1 ? 's' : ''} matched${c.reset}`,\n );\n lines.push('');\n\n // Group by file\n const byFile = new Map<string, SearchMatch[]>();\n for (const match of matches) {\n const existing = byFile.get(match.file) ?? [];\n existing.push(match);\n byFile.set(match.file, existing);\n }\n\n for (const [file, fileMatches] of byFile) {\n lines.push(`${c.cyan}${file}${c.reset}`);\n\n for (const match of fileMatches) {\n const meta: string[] = [];\n if (match.target) meta.push(`target:${match.target}`);\n if (match.experiment) meta.push(`exp:${match.experiment}`);\n if (match.score !== undefined) meta.push(`score:${match.score}`);\n const metaStr = meta.length > 0 ? ` ${c.dim}[${meta.join(', ')}]${c.reset}` : '';\n\n lines.push(\n ` ${c.bold}${match.id}${c.reset} ${c.dim}(line ${match.lineNumber})${c.reset}${metaStr}`,\n );\n lines.push(` ${match.snippet}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nexport const inspectSearchCommand = command({\n name: 'search',\n description: 'Search across evaluation results and transcripts for a regex pattern',\n args: {\n pattern: option({\n type: string,\n long: 'pattern',\n short: 'p',\n description: 'Regex pattern to search for in result/transcript content',\n }),\n path: positional({\n type: optional(string),\n displayName: 'path',\n description:\n 'Directory or file to search (default: .agentv/results/ and .agentv/transcripts/)',\n }),\n target: option({\n type: optional(string),\n long: 'target',\n description: 'Filter results to a specific target name',\n }),\n experiment: option({\n type: optional(string),\n long: 'experiment',\n description: 'Filter results to a specific experiment name',\n }),\n dir: option({\n type: optional(string),\n long: 'dir',\n short: 'd',\n description: 'Working directory (default: current directory)',\n }),\n format: option({\n type: optional(oneOf(['table', 'json'])),\n long: 'format',\n short: 'f',\n description: 'Output format: table (default) or json',\n }),\n },\n handler: async ({ pattern, path: searchPath, target, experiment, dir, format }) => {\n const cwd = dir ?? process.cwd();\n\n // Compile the regex\n let regex: RegExp;\n try {\n regex = new RegExp(pattern, 'i');\n } catch (err) {\n console.error(`${c.red}Error:${c.reset} Invalid regex pattern: ${(err as Error).message}`);\n process.exit(1);\n }\n\n // Discover files to search\n const sources = discoverSources(searchPath, cwd);\n if (sources.length === 0) {\n console.error(`${c.yellow}No JSONL files found to search.${c.reset}`);\n console.error(`${c.dim}Run an evaluation first, or specify a path to search.${c.reset}`);\n process.exit(0);\n }\n\n // Search all sources\n const allMatches: SearchMatch[] = [];\n for (const source of sources) {\n const fileMatches = searchJsonlFile(source, regex, target, experiment);\n allMatches.push(...fileMatches);\n }\n\n if (format === 'json') {\n console.log(JSON.stringify(toSnakeCaseDeep(allMatches), null, 2));\n } else {\n console.log(formatSearchResults(allMatches, pattern));\n }\n },\n});\n","import { command, flag, oneOf, option, optional, positional, string } from 'cmd-ts';\nimport {\n type RawResult,\n c,\n formatCost,\n formatDuration,\n formatNumber,\n formatScore,\n getTraceSpans,\n getTraceSummary,\n loadResultFile,\n} from './utils.js';\n\n/**\n * Render flat trace summary line (fallback when full output messages not available).\n */\nfunction renderFlatTrace(result: RawResult): string {\n const trace = getTraceSummary(result);\n const parts: string[] = [];\n\n if (trace?.tool_calls && Object.keys(trace.tool_calls).length > 0) {\n const toolParts = Object.entries(trace.tool_calls).map(([name, count]) => {\n return count > 1 ? `${name} ×${count}` : name;\n });\n parts.push(`Tools: ${toolParts.join(', ')}`);\n }\n\n if (result.duration_ms !== undefined) {\n parts.push(`Duration: ${formatDuration(result.duration_ms)}`);\n }\n\n if (result.token_usage) {\n const total = result.token_usage.input + result.token_usage.output;\n parts.push(`Tokens: ${formatNumber(total)}`);\n }\n\n if (result.cost_usd !== undefined) {\n parts.push(`Cost: ${formatCost(result.cost_usd)}`);\n }\n\n if (trace?.llm_call_count !== undefined) {\n parts.push(`LLM calls: ${trace.llm_call_count}`);\n }\n\n return parts.join(' | ');\n}\n\n/**\n * Render per-grader scores inline.\n */\nfunction renderScores(scores: { name: string; score: number; type: string }[]): string {\n return scores\n .map((s) => {\n const scoreColor = s.score >= 0.9 ? c.green : s.score >= 0.5 ? c.yellow : c.red;\n return `${s.name} ${scoreColor}${formatScore(s.score)}${c.reset}`;\n })\n .join(' | ');\n}\n\n// Raw output message shape (snake_case from JSONL)\ninterface RawMessage {\n role?: string;\n content?: unknown;\n tool_calls?: RawToolCall[];\n start_time?: string;\n end_time?: string;\n duration_ms?: number;\n token_usage?: { input: number; output: number; cached?: number };\n}\n\ninterface RawToolCall {\n tool: string;\n input?: unknown;\n output?: unknown;\n start_time?: string;\n end_time?: string;\n duration_ms?: number;\n}\n\n/**\n * Render tree view from output messages.\n * Shows a hierarchical trace: LLM calls → tool calls.\n */\nfunction renderTree(result: RawResult): string {\n const messages =\n (result.trace as { messages?: RawMessage[] } | undefined)?.messages ??\n (Array.isArray(result.output) ? (result.output as RawMessage[]) : undefined);\n const spans = getTraceSpans(result);\n\n if (!messages || messages.length === 0) {\n if (spans.length > 0) {\n return renderSpanTree(result, spans);\n }\n // Fallback to flat summary\n if (\n getTraceSummary(result) ||\n result.duration_ms !== undefined ||\n result.cost_usd !== undefined\n ) {\n return renderFlatTrace(result);\n }\n return `${c.dim}No trace data available${c.reset}`;\n }\n\n const lines: string[] = [];\n const testId = result.test_id ?? result.eval_id ?? 'unknown';\n\n // Root node: test execution\n const totalDuration = result.duration_ms;\n const totalTokens = result.token_usage\n ? result.token_usage.input + result.token_usage.output\n : undefined;\n const rootParts: string[] = [testId];\n if (totalDuration !== undefined) rootParts.push(formatDuration(totalDuration));\n if (totalTokens !== undefined) rootParts.push(`${formatNumber(totalTokens)} tok`);\n if (result.cost_usd !== undefined) rootParts.push(formatCost(result.cost_usd));\n lines.push(`${c.bold}${rootParts.join(', ')}${c.reset}`);\n\n // Filter to meaningful messages (assistant with tool calls, or assistant responses)\n const steps: { type: 'llm' | 'tools'; msg: RawMessage; index: number }[] = [];\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n if (msg.role === 'assistant') {\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n steps.push({ type: 'tools', msg, index: i });\n } else {\n steps.push({ type: 'llm', msg, index: i });\n }\n }\n }\n\n for (let si = 0; si < steps.length; si++) {\n const step = steps[si];\n const isLast = si === steps.length - 1;\n const connector = isLast ? '└─' : '├─';\n const childPrefix = isLast ? ' ' : '│ ';\n\n if (step.type === 'llm') {\n // LLM response without tool calls\n const parts: string[] = [`${c.cyan}model${c.reset}`];\n if (step.msg.duration_ms !== undefined) parts.push(formatDuration(step.msg.duration_ms));\n if (step.msg.token_usage) {\n const tok = step.msg.token_usage.input + step.msg.token_usage.output;\n parts.push(`${formatNumber(tok)} tok`);\n }\n lines.push(`${connector} ${parts.join(', ')}`);\n } else {\n // Tool calls\n const toolCalls = step.msg.tool_calls ?? [];\n\n if (toolCalls.length === 1) {\n // Single tool call — inline\n const tc = toolCalls[0];\n const parts: string[] = [`${c.yellow}${tc.tool}${c.reset}`];\n if (tc.duration_ms !== undefined) parts.push(formatDuration(tc.duration_ms));\n lines.push(`${connector} ${parts.join(', ')}`);\n } else {\n // Multiple tool calls — expand\n const parts: string[] = [`${c.dim}tools${c.reset}`];\n if (step.msg.duration_ms !== undefined) parts.push(formatDuration(step.msg.duration_ms));\n lines.push(`${connector} ${parts.join(', ')}`);\n\n for (let ti = 0; ti < toolCalls.length; ti++) {\n const tc = toolCalls[ti];\n const isLastTool = ti === toolCalls.length - 1;\n const toolConnector = isLastTool ? '└─' : '├─';\n const tcParts: string[] = [`${c.yellow}${tc.tool}${c.reset}`];\n if (tc.duration_ms !== undefined) tcParts.push(formatDuration(tc.duration_ms));\n lines.push(`${childPrefix}${toolConnector} ${tcParts.join(', ')}`);\n }\n }\n }\n }\n\n // Scores line\n if (result.scores && result.scores.length > 0) {\n lines.push('');\n lines.push(`${c.dim}Scores:${c.reset} ${renderScores(result.scores)}`);\n }\n\n return lines.join('\\n');\n}\n\nfunction renderSpanTree(result: RawResult, spans: ReturnType<typeof getTraceSpans>): string {\n const lines: string[] = [];\n const testId = result.test_id ?? result.eval_id ?? 'unknown';\n const totalTokens = result.token_usage\n ? result.token_usage.input + result.token_usage.output\n : undefined;\n const rootParts: string[] = [testId];\n if (result.duration_ms !== undefined) rootParts.push(formatDuration(result.duration_ms));\n if (totalTokens !== undefined) rootParts.push(`${formatNumber(totalTokens)} tok`);\n if (result.cost_usd !== undefined) rootParts.push(formatCost(result.cost_usd));\n lines.push(`${c.bold}${rootParts.join(', ')}${c.reset}`);\n\n spans.forEach((span, index) => {\n const connector = index === spans.length - 1 ? '└─' : '├─';\n const color = span.type === 'llm' ? c.cyan : c.yellow;\n const parts = [`${color}${span.name}${c.reset}`];\n if (span.duration_ms !== undefined) {\n parts.push(formatDuration(span.duration_ms));\n }\n lines.push(`${connector} ${parts.join(', ')}`);\n });\n\n if (result.scores && result.scores.length > 0) {\n lines.push('');\n lines.push(`${c.dim}Scores:${c.reset} ${renderScores(result.scores)}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format a single result for table display.\n */\nfunction formatResultDetail(result: RawResult, index: number, tree: boolean): string {\n const lines: string[] = [];\n const testId = result.test_id ?? result.eval_id ?? `result-${index}`;\n\n if (tree) {\n // Tree view\n lines.push(renderTree(result));\n return lines.join('\\n');\n }\n\n // Standard flat view\n const scoreColor = result.score >= 0.9 ? c.green : result.score >= 0.5 ? c.yellow : c.red;\n lines.push(\n `${c.bold}${testId}${c.reset} ${scoreColor}${formatScore(result.score)}${c.reset}${result.target ? ` ${c.dim}target: ${result.target}${c.reset}` : ''}${result.suite ? ` ${c.dim}suite: ${result.suite}${c.reset}` : ''}`,\n );\n\n if (result.error) {\n lines.push(` ${c.red}Error: ${result.error}${c.reset}`);\n }\n\n if (result.assertions && result.assertions.length > 0) {\n const passed = result.assertions.filter((a: { passed: boolean }) => a.passed);\n const failed = result.assertions.filter((a: { passed: boolean }) => !a.passed);\n if (passed.length > 0)\n lines.push(\n ` ${c.green}✓ Passed:${c.reset} ${passed.map((a: { text: string }) => a.text).join(', ')}`,\n );\n if (failed.length > 0)\n lines.push(\n ` ${c.red}✗ Failed:${c.reset} ${failed.map((a: { text: string }) => a.text).join(', ')}`,\n );\n }\n\n if (result.scores && result.scores.length > 0) {\n lines.push(` ${c.dim}Scores:${c.reset} ${renderScores(result.scores)}`);\n }\n\n if (result.trace || result.duration_ms !== undefined || result.cost_usd !== undefined) {\n lines.push(` ${c.dim}Trace:${c.reset} ${renderFlatTrace(result)}`);\n }\n\n if (result.assertions && result.assertions.length > 0) {\n const withEvidence = result.assertions.filter((a: { evidence?: string }) => a.evidence);\n if (withEvidence.length > 0) {\n const maxLen = 200;\n const evidence = (withEvidence[0] as { evidence: string }).evidence;\n const truncated = evidence.length > maxLen ? `${evidence.slice(0, maxLen)}...` : evidence;\n lines.push(` ${c.dim}Evidence: ${truncated}${c.reset}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction formatShowTable(\n results: RawResult[],\n filePath: string,\n testIdFilter?: string,\n tree?: boolean,\n): string {\n const lines: string[] = [];\n\n let filtered = results;\n if (testIdFilter) {\n filtered = results.filter((r) => (r.test_id ?? r.eval_id) === testIdFilter);\n if (filtered.length === 0) {\n lines.push(`${c.yellow}No results found with test ID \"${testIdFilter}\"${c.reset}`);\n lines.push('');\n lines.push(`${c.dim}Available test IDs:${c.reset}`);\n for (const r of results) {\n lines.push(` ${r.test_id ?? r.eval_id ?? '(unnamed)'}`);\n }\n return lines.join('\\n');\n }\n }\n\n lines.push('');\n lines.push(`${c.bold}Results:${c.reset} ${c.cyan}${filePath}${c.reset}`);\n\n const totalTests = filtered.length;\n const passCount = filtered.filter((r) => r.score >= 1.0).length;\n const failCount = totalTests - passCount;\n const avgScore = totalTests > 0 ? filtered.reduce((sum, r) => sum + r.score, 0) / totalTests : 0;\n\n lines.push(\n `${c.dim}${totalTests} test${totalTests !== 1 ? 's' : ''} | ${c.green}${passCount} passed${c.reset}${c.dim}${failCount > 0 ? ` | ${c.red}${failCount} failed${c.reset}${c.dim}` : ''} | avg score: ${formatScore(avgScore)}${c.reset}`,\n );\n lines.push('');\n\n for (let i = 0; i < filtered.length; i++) {\n lines.push(formatResultDetail(filtered[i], i, tree ?? false));\n if (i < filtered.length - 1) {\n lines.push(`${c.dim}${'─'.repeat(60)}${c.reset}`);\n }\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\nexport const traceShowCommand = command({\n name: 'show',\n description: 'Show evaluation results with trace details from a result file',\n args: {\n file: positional({\n type: string,\n displayName: 'trace-source',\n description:\n 'Path to a run workspace, result manifest, simple trace JSONL, or OTLP JSON file',\n }),\n testId: option({\n type: optional(string),\n long: 'test-id',\n description: 'Filter to a specific test ID',\n }),\n tree: flag({\n long: 'tree',\n description: 'Show hierarchical trace tree from output messages or exported trace spans',\n }),\n format: option({\n type: optional(oneOf(['table', 'json'])),\n long: 'format',\n short: 'f',\n description: 'Output format: table (default) or json',\n }),\n },\n handler: async ({ file, testId, tree, format }) => {\n const outputFormat = format ?? 'table';\n\n try {\n const results = loadResultFile(file);\n\n let filtered = results;\n if (testId) {\n filtered = results.filter((r) => (r.test_id ?? r.eval_id) === testId);\n }\n\n if (outputFormat === 'json') {\n console.log(JSON.stringify(filtered, null, 2));\n } else {\n console.log(formatShowTable(results, file, testId, tree));\n }\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n },\n});\n","import { toSnakeCaseDeep } from '@agentv/core';\nimport { command, oneOf, option, optional, positional, string } from 'cmd-ts';\nimport {\n type RawResult,\n c,\n formatCost,\n formatNumber,\n getTraceSummary,\n loadResultFile,\n padLeft,\n padRight,\n} from './utils.js';\n\n/**\n * Compute percentiles from a sorted array of numbers.\n */\nexport function percentile(sorted: number[], p: number): number {\n if (sorted.length === 0) return 0;\n const index = (p / 100) * (sorted.length - 1);\n const lower = Math.floor(index);\n const upper = Math.ceil(index);\n if (lower === upper) return sorted[lower];\n return sorted[lower] + (sorted[upper] - sorted[lower]) * (index - lower);\n}\n\nfunction mean(values: number[]): number {\n if (values.length === 0) return 0;\n return values.reduce((sum, v) => sum + v, 0) / values.length;\n}\n\ninterface MetricRow {\n name: string;\n values: number[];\n formatter: (n: number) => string;\n}\n\nfunction collectMetrics(results: RawResult[]): MetricRow[] {\n const rows: MetricRow[] = [];\n\n // Score\n const scores = results.map((r) => r.score);\n if (scores.length > 0) {\n rows.push({ name: 'score', values: scores, formatter: (n) => n.toFixed(2) });\n }\n\n // Latency\n const latencies = results.map((r) => r.duration_ms).filter((v): v is number => v !== undefined);\n if (latencies.length > 0) {\n rows.push({\n name: 'latency_s',\n values: latencies.map((ms) => ms / 1000),\n formatter: (n) => n.toFixed(1),\n });\n }\n\n // Cost\n const costs = results.map((r) => r.cost_usd).filter((v): v is number => v !== undefined);\n if (costs.length > 0) {\n rows.push({ name: 'cost_usd', values: costs, formatter: (n) => formatCost(n) });\n }\n\n // Total tokens\n const tokens = results\n .map((r) => {\n if (!r.token_usage) return undefined;\n return r.token_usage.input + r.token_usage.output;\n })\n .filter((v): v is number => v !== undefined);\n if (tokens.length > 0) {\n rows.push({\n name: 'tokens_total',\n values: tokens,\n formatter: (n) => formatNumber(Math.round(n)),\n });\n }\n\n // Tool calls\n const toolCalls = results\n .map((r) => getTraceSummary(r)?.event_count)\n .filter((v): v is number => v !== undefined);\n if (toolCalls.length > 0) {\n rows.push({ name: 'tool_calls', values: toolCalls, formatter: (n) => String(Math.round(n)) });\n }\n\n // LLM calls\n const llmCalls = results\n .map((r) => getTraceSummary(r)?.llm_call_count)\n .filter((v): v is number => v !== undefined);\n if (llmCalls.length > 0) {\n rows.push({ name: 'llm_calls', values: llmCalls, formatter: (n) => String(Math.round(n)) });\n }\n\n return rows;\n}\n\ninterface GroupedResults {\n label: string;\n results: RawResult[];\n}\n\nfunction groupResults(results: RawResult[], groupBy?: string): GroupedResults[] {\n if (!groupBy) return [{ label: 'all', results }];\n\n const groups = new Map<string, RawResult[]>();\n\n for (const result of results) {\n let key: string;\n switch (groupBy) {\n case 'target':\n key = result.target ?? 'unknown';\n break;\n case 'suite':\n key = result.suite ?? 'unknown';\n break;\n case 'test-id':\n key = result.test_id ?? result.eval_id ?? 'unknown';\n break;\n default:\n key = 'all';\n }\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)?.push(result);\n }\n\n return [...groups.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([label, results]) => ({ label, results }));\n}\n\nfunction formatStatsTable(groups: GroupedResults[], filePath: string): string {\n const lines: string[] = [];\n\n lines.push('');\n lines.push(`${c.bold}Statistics:${c.reset} ${c.cyan}${filePath}${c.reset}`);\n\n for (const group of groups) {\n if (groups.length > 1 || group.label !== 'all') {\n lines.push('');\n lines.push(\n `${c.bold}Group: ${group.label}${c.reset} ${c.dim}(${group.results.length} tests)${c.reset}`,\n );\n } else {\n lines.push(`${c.dim}${group.results.length} tests${c.reset}`);\n }\n lines.push('');\n\n const metrics = collectMetrics(group.results);\n\n if (metrics.length === 0) {\n lines.push(`${c.yellow}No trace metrics available${c.reset}`);\n continue;\n }\n\n // Column headers\n const nameWidth = Math.max(12, ...metrics.map((m) => m.name.length));\n const colWidth = 10;\n\n const header = ` ${padRight('Metric', nameWidth)} ${padLeft('Mean', colWidth)} ${padLeft('P50', colWidth)} ${padLeft('P90', colWidth)} ${padLeft('P95', colWidth)} ${padLeft('P99', colWidth)}`;\n lines.push(`${c.dim}${header}${c.reset}`);\n lines.push(\n `${c.dim} ${'─'.repeat(nameWidth)} ${'─'.repeat(colWidth)} ${'─'.repeat(colWidth)} ${'─'.repeat(colWidth)} ${'─'.repeat(colWidth)} ${'─'.repeat(colWidth)}${c.reset}`,\n );\n\n for (const metric of metrics) {\n const sorted = [...metric.values].sort((a, b) => a - b);\n const row = ` ${padRight(metric.name, nameWidth)} ${padLeft(metric.formatter(mean(sorted)), colWidth)} ${padLeft(metric.formatter(percentile(sorted, 50)), colWidth)} ${padLeft(metric.formatter(percentile(sorted, 90)), colWidth)} ${padLeft(metric.formatter(percentile(sorted, 95)), colWidth)} ${padLeft(metric.formatter(percentile(sorted, 99)), colWidth)}`;\n lines.push(row);\n }\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\ninterface StatsJson {\n file: string;\n groups: {\n label: string;\n count: number;\n metrics: Record<string, { mean: number; p50: number; p90: number; p95: number; p99: number }>;\n }[];\n}\n\nfunction computeStatsJson(groups: GroupedResults[], filePath: string): StatsJson {\n return {\n file: filePath,\n groups: groups.map((group) => {\n const metrics = collectMetrics(group.results);\n const metricsObj: Record<\n string,\n { mean: number; p50: number; p90: number; p95: number; p99: number }\n > = {};\n\n for (const metric of metrics) {\n const sorted = [...metric.values].sort((a, b) => a - b);\n metricsObj[metric.name] = {\n mean: Number(mean(sorted).toFixed(4)),\n p50: Number(percentile(sorted, 50).toFixed(4)),\n p90: Number(percentile(sorted, 90).toFixed(4)),\n p95: Number(percentile(sorted, 95).toFixed(4)),\n p99: Number(percentile(sorted, 99).toFixed(4)),\n };\n }\n\n return {\n label: group.label,\n count: group.results.length,\n metrics: metricsObj,\n };\n }),\n };\n}\n\nexport const traceStatsCommand = command({\n name: 'stats',\n description: 'Compute summary statistics (percentiles) across evaluation results',\n args: {\n file: positional({\n type: string,\n displayName: 'trace-source',\n description:\n 'Path to a run workspace, result manifest, simple trace JSONL, or OTLP JSON file',\n }),\n groupBy: option({\n type: optional(oneOf(['target', 'eval-set', 'test-id'])),\n long: 'group-by',\n short: 'g',\n description: 'Group statistics by: target, eval-set, or test-id',\n }),\n format: option({\n type: optional(oneOf(['table', 'json'])),\n long: 'format',\n short: 'f',\n description: 'Output format: table (default) or json',\n }),\n },\n handler: async ({ file, groupBy, format }) => {\n const outputFormat = format ?? 'table';\n\n try {\n const results = loadResultFile(file);\n\n if (results.length === 0) {\n console.error('Error: Result file is empty');\n process.exit(1);\n }\n\n const groups = groupResults(results, groupBy);\n\n if (outputFormat === 'json') {\n const statsJson = computeStatsJson(groups, file);\n console.log(JSON.stringify(toSnakeCaseDeep(statsJson), null, 2));\n } else {\n console.log(formatStatsTable(groups, file));\n }\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n },\n});\n","import { subcommands } from 'cmd-ts';\n\nimport { inspectFilterCommand } from './filter.js';\nimport { traceListCommand } from './list.js';\nimport { traceScoreCommand } from './score.js';\nimport { inspectSearchCommand } from './search.js';\nimport { traceShowCommand } from './show.js';\nimport { traceStatsCommand } from './stats.js';\n\nexport const inspectCommand = subcommands({\n name: 'inspect',\n description: 'Inspect and analyze evaluation results',\n cmds: {\n filter: inspectFilterCommand,\n list: traceListCommand,\n score: traceScoreCommand,\n search: inspectSearchCommand,\n show: traceShowCommand,\n stats: traceStatsCommand,\n },\n});\n","/**\n * `agentv pipeline bench` — Merge script and LLM grader scores into final\n * benchmark artifacts.\n *\n * Reads script_grader_results and llm_grader_results from disk per test.\n *\n * Writes:\n * - <test-id>/grading.json (per-test grading breakdown)\n * - .internal/index.jsonl (one line per test)\n * - summary.json (aggregate statistics)\n */\nimport { existsSync } from 'node:fs';\nimport { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { command, positional, string } from 'cmd-ts';\n\nimport { DEFAULT_THRESHOLD, type EvaluationResult, RESULT_INDEX_FILENAME } from '@agentv/core';\nimport { maybeAutoExportRunArtifacts } from '../results/remote.js';\n\ninterface EvaluatorScore {\n readonly name: string;\n readonly type: string;\n readonly score: number;\n readonly weight: number;\n readonly assertions: readonly { text: string; passed: boolean; evidence?: string }[];\n}\n\nfunction toComponentResult(\n assertion: { text: string; passed: boolean; evidence?: string },\n evaluator?: Pick<EvaluatorScore, 'name' | 'type'>,\n) {\n return {\n pass: assertion.passed,\n score: assertion.passed ? 1 : 0,\n reason: assertion.evidence ?? assertion.text,\n assertion: {\n ...(evaluator ? { name: evaluator.name, type: evaluator.type } : {}),\n value: assertion.text,\n },\n };\n}\n\nfunction evaluatorComponent(evaluator: EvaluatorScore) {\n const pass = evaluator.score >= DEFAULT_THRESHOLD;\n return {\n pass,\n score: evaluator.score,\n reason: pass ? 'Grader passed.' : 'Grader failed.',\n assertion: {\n name: evaluator.name,\n type: evaluator.type,\n weight: evaluator.weight,\n },\n component_results: evaluator.assertions.map((assertion) =>\n toComponentResult(assertion, evaluator),\n ),\n };\n}\n\nexport const evalBenchCommand = command({\n name: 'bench',\n description: 'Merge grader scores and produce benchmark artifacts',\n args: {\n exportDir: positional({\n type: string,\n displayName: 'export-dir',\n description: 'Export directory from pipeline input/grade',\n }),\n },\n handler: async ({ exportDir }) => {\n const manifest = JSON.parse(await readFile(join(exportDir, 'manifest.json'), 'utf8'));\n const testIds: string[] = manifest.test_ids;\n const targetName: string = manifest.target?.name ?? 'unknown';\n const suiteName: string = manifest.suite ?? '';\n const experiment: string | undefined = manifest.experiment;\n const safeSuiteName = suiteName ? suiteName.replace(/[\\/\\\\:*?\"<>|]/g, '_') : '';\n\n const indexLines: string[] = [];\n const allPassRates: number[] = [];\n\n for (const testId of testIds) {\n const subpath = safeSuiteName ? [safeSuiteName, testId] : [testId];\n const testDir = join(exportDir, ...subpath);\n const artifactSubdir = subpath.join('/');\n const evaluators: EvaluatorScore[] = [];\n const allAssertions: { text: string; passed: boolean; evidence: string }[] = [];\n\n // Collect script grader results\n const codeResultsDir = join(testDir, 'script_grader_results');\n try {\n const resultFiles = (await readdir(codeResultsDir)).filter((f) => f.endsWith('.json'));\n for (const file of resultFiles) {\n const result = JSON.parse(await readFile(join(codeResultsDir, file), 'utf8'));\n evaluators.push({\n name: result.name,\n type: result.type ?? 'script',\n score: result.score,\n weight: result.weight ?? 1.0,\n assertions: result.assertions ?? [],\n });\n for (const a of result.assertions ?? []) {\n allAssertions.push({ text: a.text, passed: a.passed, evidence: a.evidence ?? '' });\n }\n }\n } catch {\n // No script grader results.\n }\n\n // Collect LLM grader scores from per-test disk results\n const llmGradersDir = join(testDir, 'llm_graders');\n try {\n const graderFiles = (await readdir(llmGradersDir)).filter((f) => f.endsWith('.json'));\n for (const file of graderFiles) {\n const graderMeta = JSON.parse(await readFile(join(llmGradersDir, file), 'utf8'));\n const graderName = graderMeta.name;\n\n const diskResultPath = join(testDir, 'llm_grader_results', `${graderName}.json`);\n let llmResult:\n | { score: number; assertions?: { text: string; passed: boolean; evidence?: string }[] }\n | undefined;\n try {\n llmResult = JSON.parse(await readFile(diskResultPath, 'utf8'));\n } catch {\n // No result for this grader\n }\n\n if (llmResult) {\n evaluators.push({\n name: graderName,\n type: 'llm-grader',\n score: llmResult.score,\n weight: graderMeta.weight ?? 1.0,\n assertions: llmResult.assertions ?? [],\n });\n for (const a of llmResult.assertions ?? []) {\n allAssertions.push({ text: a.text, passed: a.passed, evidence: a.evidence ?? '' });\n }\n }\n }\n } catch {\n // No LLM graders\n }\n\n // Compute weighted score\n const totalWeight = evaluators.reduce((sum, e) => sum + e.weight, 0);\n const weightedScore =\n totalWeight > 0\n ? evaluators.reduce((sum, e) => sum + e.score * e.weight, 0) / totalWeight\n : 0;\n\n const passed = allAssertions.filter((a) => a.passed).length;\n const failed = allAssertions.filter((a) => !a.passed).length;\n const passRate =\n allAssertions.length > 0\n ? Math.round((passed / allAssertions.length) * 1000) / 1000\n : weightedScore >= 0.5\n ? 1.0\n : 0.0;\n\n allPassRates.push(passRate);\n\n // Write grading.json\n const pass = weightedScore >= DEFAULT_THRESHOLD;\n const grading = {\n pass,\n score: Math.round(weightedScore * 1000) / 1000,\n reason: pass ? 'All grading components passed.' : 'One or more grading components failed.',\n component_results:\n evaluators.length > 0\n ? evaluators.map(evaluatorComponent)\n : allAssertions.map((assertion) => toComponentResult(assertion)),\n metadata: {\n pass_count: passed,\n fail_count: failed,\n sample_count: allAssertions.length,\n pass_rate: passRate,\n },\n };\n await writeFile(\n join(testDir, 'grading.json'),\n `${JSON.stringify(grading, null, 2)}\\n`,\n 'utf8',\n );\n\n // Build index entry (match CLI-mode schema for dashboard compatibility)\n const scores = evaluators.map((e) => ({\n name: e.name,\n type: e.type,\n pass: e.score >= DEFAULT_THRESHOLD,\n score: e.score,\n weight: e.weight,\n reason: e.score >= DEFAULT_THRESHOLD ? 'Grader passed.' : 'Grader failed.',\n }));\n\n // Read execution_status from metrics.json (written by pipeline run)\n let executionStatus = 'ok';\n const metricsPath = join(testDir, 'metrics.json');\n if (existsSync(metricsPath)) {\n try {\n const metrics = JSON.parse(await readFile(metricsPath, 'utf8'));\n if (typeof metrics.execution?.status === 'string') {\n executionStatus = metrics.execution.status;\n }\n } catch {\n // Fall back to 'ok' if metrics.json is unreadable\n }\n }\n\n const hasResponse = existsSync(join(testDir, 'response.md'));\n indexLines.push(\n JSON.stringify({\n timestamp: manifest.timestamp,\n test_id: testId,\n suite: suiteName || undefined,\n experiment: experiment || undefined,\n score: Math.round(weightedScore * 1000) / 1000,\n target: targetName,\n scores,\n execution_status: executionStatus,\n grading_path: `${artifactSubdir}/grading.json`,\n metrics_path: `${artifactSubdir}/metrics.json`,\n response_path: hasResponse ? `${artifactSubdir}/response.md` : undefined,\n }),\n );\n }\n\n // Write row-level run manifest.\n const indexPath = join(exportDir, '.internal', RESULT_INDEX_FILENAME);\n await mkdir(join(exportDir, '.internal'), { recursive: true });\n await writeFile(indexPath, indexLines.length > 0 ? `${indexLines.join('\\n')}\\n` : '', 'utf8');\n\n // Write summary.json\n const passRateStats = computeStats(allPassRates);\n const summary = {\n index_path: `.internal/${RESULT_INDEX_FILENAME}`,\n metadata: {\n eval_file: manifest.eval_file,\n timestamp: manifest.timestamp,\n experiment: experiment || undefined,\n targets: [targetName],\n tests_run: testIds,\n },\n run_summary: {\n [targetName]: {\n pass_rate: passRateStats,\n time_seconds: { mean: 0, stddev: 0 },\n tokens: { mean: 0, stddev: 0 },\n },\n },\n timing: {\n total_tokens: 0,\n duration_ms: 0,\n total_duration_seconds: 0,\n cost_usd: null,\n token_usage: { input: 0, output: 0, reasoning: 0 },\n usage_sources: {\n token_usage: 'unavailable',\n total_tokens: 'unavailable',\n duration: 'unavailable',\n cost: 'unavailable',\n },\n },\n notes: [],\n };\n await writeFile(\n join(exportDir, 'summary.json'),\n `${JSON.stringify(summary, null, 2)}\\n`,\n 'utf8',\n );\n\n console.log(`Benchmark: ${testIds.length} test(s), pass_rate=${passRateStats.mean}`);\n\n const results = indexLines.map((line) => JSON.parse(line)) as Array<{\n test_id: string;\n score: number;\n execution_status?: string;\n target?: string;\n timestamp?: string;\n }>;\n await maybeAutoExportRunArtifacts({\n cwd: process.cwd(),\n run_dir: exportDir,\n experiment,\n test_files: manifest.eval_file ? [manifest.eval_file] : [],\n results: results.map((result) => ({\n testId: result.test_id,\n score: result.score,\n executionStatus: result.execution_status,\n target: result.target,\n timestamp: result.timestamp,\n })) as EvaluationResult[],\n eval_summaries: [\n {\n eval_file: manifest.eval_file ?? 'pipeline',\n total: results.length,\n passed: results.filter((result) => result.score >= DEFAULT_THRESHOLD).length,\n avg_score:\n results.length > 0\n ? results.reduce((sum, result) => sum + result.score, 0) / results.length\n : 0,\n results: results.map((result) => ({\n test_id: result.test_id,\n score: result.score,\n status:\n result.execution_status === 'execution_error'\n ? 'ERROR'\n : result.score >= DEFAULT_THRESHOLD\n ? 'PASS'\n : 'FAIL',\n })),\n },\n ],\n });\n },\n});\n\nfunction computeStats(values: readonly number[]): { mean: number; stddev: number } {\n if (values.length === 0) return { mean: 0, stddev: 0 };\n const mean = values.reduce((sum, v) => sum + v, 0) / values.length;\n const variance = values.reduce((sum, v) => sum + (v - mean) ** 2, 0) / values.length;\n return {\n mean: Math.round(mean * 1000) / 1000,\n stddev: Math.round(Math.sqrt(variance) * 1000) / 1000,\n };\n}\n","/**\n * `agentv pipeline grade` — Run grader assertions against response.md files\n * in an export directory produced by `pipeline input`.\n *\n * All grader configs live in script_graders/<name>.json. Each config has a `type`\n * field that determines how it's evaluated:\n * - `script` (or configs with a `command` field): executed as external scripts\n * - Built-in types (contains, regex, equals, etc.): evaluated in-process\n *\n * Results are written to script_grader_results/<name>.json for pipeline bench.\n *\n * Export directory additions:\n * <out-dir>/<suite>/<test-id>/script_grader_results/<name>.json\n */\nimport { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport {\n type AssertionResult,\n buildTraceFromMessages,\n executeScript,\n runContainsAllAssertion,\n runContainsAnyAssertion,\n runContainsAssertion,\n runEndsWithAssertion,\n runEqualsAssertion,\n runIcontainsAllAssertion,\n runIcontainsAnyAssertion,\n runIcontainsAssertion,\n runIsJsonAssertion,\n runRegexAssertion,\n runStartsWithAssertion,\n} from '@agentv/core';\nimport { command, number, option, optional, positional, string } from 'cmd-ts';\n\nconst DEFAULT_CONCURRENCY = 10;\n\n/**\n * Convert a Message[] array to plain text.\n * Single message: returns content directly (no role prefix).\n * Multiple messages: prefixes each with @role for clarity.\n */\nfunction extractInputText(input: Array<{ role: string; content: string }>): string {\n if (!input || input.length === 0) return '';\n if (input.length === 1) return input[0].content;\n return input.map((m) => `@[${m.role}]:\\n${m.content}`).join('\\n\\n');\n}\n\n/** Describes a single grader to execute. */\nexport interface GraderTask {\n testId: string;\n testDir: string;\n resultsDir: string;\n graderFile: string;\n responseText: string;\n inputData: {\n input: Array<{ role: string; content: string }>;\n input_files?: unknown[];\n metadata?: Record<string, unknown>;\n };\n}\n\n/**\n * Run grader tasks with concurrency and progress feedback.\n * Dispatches each task based on its config: script graders are executed as\n * external scripts, built-in types (contains, regex, etc.) are evaluated in-process.\n * Shared by `pipeline grade` and `pipeline run`.\n */\nexport async function runScriptGraders(\n tasks: GraderTask[],\n concurrency: number,\n): Promise<{ totalGraders: number; totalPassed: number }> {\n let totalGraders = 0;\n let totalPassed = 0;\n let completed = 0;\n const total = tasks.length;\n\n if (total === 0) return { totalGraders: 0, totalPassed: 0 };\n\n const writeProgress = () => {\n process.stderr.write(`\\rGrading: ${completed}/${total} done`);\n };\n\n writeProgress();\n\n const executeGrader = async (task: GraderTask) => {\n const { testDir, resultsDir, graderFile, responseText } = task;\n const graderConfig = JSON.parse(\n await readFile(join(testDir, 'script_graders', graderFile), 'utf8'),\n );\n\n // Dispatch: configs with a `command` field are external scripts;\n // all others are built-in deterministic assertions evaluated in-process.\n if (graderConfig.command) {\n await executeScriptGrader(graderConfig, task);\n } else {\n await executeBuiltinGrader(graderConfig, responseText, resultsDir);\n }\n\n totalGraders++;\n if (graderConfig._lastScore >= 0.5) totalPassed++;\n completed++;\n writeProgress();\n };\n\n /** Run an external script grader. */\n const executeScriptGrader = async (graderConfig: Record<string, unknown>, task: GraderTask) => {\n const { testId, resultsDir, responseText, inputData } = task;\n const graderName = graderConfig.name as string;\n const graderType = typeof graderConfig.type === 'string' ? graderConfig.type : 'script';\n const messages = [{ role: 'assistant' as const, content: responseText }];\n const trace = buildTraceFromMessages({\n input: inputData.input,\n output: messages,\n finalOutput: responseText,\n testId,\n });\n const payload = JSON.stringify({\n output: responseText,\n answer: responseText,\n messages,\n input: inputData.input,\n criteria: '',\n expected_output: [],\n input_files: inputData.input_files ?? [],\n trace,\n token_usage: null,\n cost_usd: null,\n duration_ms: null,\n start_time: null,\n end_time: null,\n file_changes: null,\n workspace_path: null,\n config: graderConfig.config ?? null,\n metadata: inputData.metadata ?? {},\n });\n\n try {\n const stdout = await executeScript(\n graderConfig.command as string | string[],\n payload,\n undefined,\n graderConfig.cwd as string | undefined,\n );\n const parsed = JSON.parse(stdout);\n const score = typeof parsed.score === 'number' ? parsed.score : 0;\n // TODO: Remove hits/misses fallback once all grader scripts emit assertions natively.\n // The hits/misses format is deprecated; graders should output { assertions: [...] } directly.\n const assertions: { text: string; passed: boolean }[] =\n Array.isArray(parsed.assertions) && parsed.assertions.length > 0\n ? parsed.assertions\n : [\n ...(parsed.hits ?? []).map((h: string) => ({ text: h, passed: true })),\n ...(parsed.misses ?? []).map((m: string) => ({ text: m, passed: false })),\n ];\n\n graderConfig._lastScore = score;\n\n await writeFile(\n join(resultsDir, `${graderName}.json`),\n `${JSON.stringify({ name: graderName, type: graderType, score, weight: graderConfig.weight ?? 1.0, assertions, details: parsed.details ?? {} }, null, 2)}\\n`,\n 'utf8',\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`\\n ${testId}/${graderName}: ERROR — ${message}\\n`);\n graderConfig._lastScore = 0;\n\n await writeFile(\n join(resultsDir, `${graderName}.json`),\n `${JSON.stringify({ name: graderName, type: graderType, score: 0, weight: graderConfig.weight ?? 1.0, assertions: [{ text: `Error: ${message}`, passed: false }], details: { error: message } }, null, 2)}\\n`,\n 'utf8',\n );\n }\n };\n\n /** Evaluate a built-in deterministic assertion in-process. */\n const executeBuiltinGrader = async (\n graderConfig: Record<string, unknown>,\n responseText: string,\n resultsDir: string,\n ) => {\n const raw = evaluateBuiltinAssertion(\n graderConfig as { type: string; value?: unknown; flags?: string },\n responseText,\n );\n\n const negate = graderConfig.negate === true;\n const score = negate ? 1 - raw.score : raw.score;\n const assertions = negate\n ? raw.assertions.map((a: { text: string; passed: boolean }) => ({\n text: a.text,\n passed: !a.passed,\n }))\n : raw.assertions;\n\n graderConfig._lastScore = score;\n\n await writeFile(\n join(resultsDir, `${graderConfig.name}.json`),\n `${JSON.stringify({ name: graderConfig.name, type: graderConfig.type, score, weight: (graderConfig.weight as number) ?? 1.0, assertions, details: {} }, null, 2)}\\n`,\n 'utf8',\n );\n };\n\n // Run with concurrency limit\n const pending = new Set<Promise<void>>();\n for (const task of tasks) {\n const p = executeGrader(task).then(() => {\n pending.delete(p);\n });\n pending.add(p);\n if (pending.size >= concurrency) {\n await Promise.race(pending);\n }\n }\n await Promise.all(pending);\n\n // Clear the progress line and print final summary\n process.stderr.write('\\n');\n\n return { totalGraders, totalPassed };\n}\n\n/**\n * Evaluate a single built-in deterministic assertion against the response text.\n *\n * Dispatches to the appropriate assertion function based on the config type.\n * Returns the assertion result with score and descriptive assertions array.\n *\n * To add a new built-in assertion type:\n * 1. Import the runner from @agentv/core\n * 2. Add a case to the switch below\n * 3. Add the type to BUILTIN_ASSERTION_TYPES in pipeline/input.ts\n */\nfunction evaluateBuiltinAssertion(\n config: { type: string; value?: unknown; flags?: string },\n responseText: string,\n): AssertionResult {\n const value = config.value;\n switch (config.type) {\n case 'contains':\n return runContainsAssertion(responseText, value as string);\n case 'contains-any':\n return runContainsAnyAssertion(responseText, value as string[]);\n case 'contains-all':\n return runContainsAllAssertion(responseText, value as string[]);\n case 'icontains':\n return runIcontainsAssertion(responseText, value as string);\n case 'icontains-any':\n return runIcontainsAnyAssertion(responseText, value as string[]);\n case 'icontains-all':\n return runIcontainsAllAssertion(responseText, value as string[]);\n case 'starts-with':\n return runStartsWithAssertion(responseText, value as string);\n case 'ends-with':\n return runEndsWithAssertion(responseText, value as string);\n case 'regex':\n return runRegexAssertion(responseText, value as string, config.flags);\n case 'is-json':\n return runIsJsonAssertion(responseText);\n case 'equals':\n return runEqualsAssertion(responseText, value as string);\n default:\n return {\n score: 0,\n assertions: [{ text: `Unknown assertion type: ${config.type}`, passed: false }],\n };\n }\n}\n\nexport const evalGradeCommand = command({\n name: 'grade',\n description: 'Run grader assertions on responses in an export directory',\n args: {\n exportDir: positional({\n type: string,\n displayName: 'export-dir',\n description: 'Export directory from pipeline input',\n }),\n concurrency: option({\n type: optional(number),\n long: 'concurrency',\n short: 'j',\n description: `Number of graders to run in parallel (default: ${DEFAULT_CONCURRENCY})`,\n }),\n },\n handler: async ({ exportDir, concurrency }) => {\n const maxWorkers = concurrency ?? DEFAULT_CONCURRENCY;\n const manifestPath = join(exportDir, 'manifest.json');\n const manifest = JSON.parse(await readFile(manifestPath, 'utf8'));\n const testIds: string[] = manifest.test_ids;\n const suiteName: string = manifest.suite ?? '';\n const safeSuiteName = suiteName ? suiteName.replace(/[\\/\\\\:*?\"<>|]/g, '_') : '';\n\n // Collect all grader tasks upfront so we know the total count\n const tasks: GraderTask[] = [];\n\n for (const testId of testIds) {\n const subpath = safeSuiteName ? [safeSuiteName, testId] : [testId];\n const testDir = join(exportDir, ...subpath);\n const scriptGradersDir = join(testDir, 'script_graders');\n const resultsDir = join(testDir, 'script_grader_results');\n\n let graderFiles: string[];\n try {\n graderFiles = (await readdir(scriptGradersDir)).filter((f: string) => f.endsWith('.json'));\n } catch {\n continue; // No graders for this test\n }\n\n if (graderFiles.length === 0) continue;\n await mkdir(resultsDir, { recursive: true });\n\n const responseText = await readFile(join(testDir, 'response.md'), 'utf8');\n const inputData = JSON.parse(await readFile(join(testDir, 'input.json'), 'utf8'));\n\n for (const graderFile of graderFiles) {\n tasks.push({ testId, testDir, resultsDir, graderFile, responseText, inputData });\n }\n }\n\n const { totalGraders, totalPassed } = await runScriptGraders(tasks, maxWorkers);\n console.log(`Graded ${totalGraders} grader(s): ${totalPassed} passed`);\n },\n});\n","/**\n * `agentv pipeline input` — Extract eval inputs, provider invocation info, and grader\n * configurations for subagent-mode eval runs.\n *\n * Reads an eval YAML file and writes a structured export directory that agents\n * and Python wrapper scripts can consume without re-parsing YAML or resolving\n * file references.\n *\n * Export directory layout:\n * <out-dir>/\n * ├── manifest.json\n * └── <suite>/ (omitted if eval.yaml has no name)\n * └── <test-id>/\n * ├── input.json\n * ├── invoke.json\n * ├── criteria.md\n * ├── expected_output.json (if present)\n * ├── llm_graders/<name>.json\n * └── script_graders/<name>.json # script/deterministic grader configs\n */\nimport { readFile } from 'node:fs/promises';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, relative, resolve } from 'node:path';\n\nimport type { GraderConfig, LlmBackedGraderConfig, ScriptGraderConfig } from '@agentv/core';\n\n/** Assertion types that can be graded deterministically without external scripts or LLMs. */\nconst BUILTIN_ASSERTION_TYPES = new Set([\n 'contains',\n 'contains-any',\n 'contains-all',\n 'icontains',\n 'icontains-any',\n 'icontains-all',\n 'starts-with',\n 'ends-with',\n 'regex',\n 'is-json',\n 'equals',\n]);\nimport { deriveCategory, loadTestSuite } from '@agentv/core';\nimport { command, option, optional, positional, string } from 'cmd-ts';\n\nimport { buildDefaultRunDir } from '../eval/result-layout.js';\nimport { findRepoRoot } from '../eval/shared.js';\nimport { selectProvider } from '../eval/targets.js';\n\nexport const evalInputCommand = command({\n name: 'input',\n description: 'Extract eval inputs, target commands, and grader prompts for subagent-mode runs',\n args: {\n evalPath: positional({\n type: string,\n displayName: 'eval-path',\n description: 'Path to eval YAML file',\n }),\n out: option({\n type: optional(string),\n long: 'out',\n description: 'Output directory for extracted inputs (default: .agentv/results/<run_id>)',\n }),\n experiment: option({\n type: optional(string),\n long: 'experiment',\n description: 'Experiment label (e.g. with_skills, without_skills)',\n }),\n target: option({\n type: optional(string),\n long: 'target',\n description: '[Removed: use --provider <label>] Former provider selector',\n }),\n targets: option({\n type: optional(string),\n long: 'targets',\n description: '[Removed: use --providers <path>] Former providers.yaml path',\n }),\n provider: option({\n type: optional(string),\n long: 'provider',\n description: 'Override provider label from providers.yaml',\n }),\n providers: option({\n type: optional(string),\n long: 'providers',\n description: 'Path to providers.yaml (overrides discovery)',\n }),\n },\n handler: async ({ evalPath, out, experiment, target, targets, provider, providers }) => {\n if (target !== undefined) {\n throw new Error(\n `--target was removed from agentv pipeline input. Use --provider ${target} instead.`,\n );\n }\n if (targets !== undefined) {\n throw new Error(\n `--targets was removed from agentv pipeline input. Use --providers ${targets} instead.`,\n );\n }\n\n const resolvedEvalPath = resolve(evalPath);\n const outDir = resolve(out ?? buildDefaultRunDir(process.cwd(), experiment));\n const repoRoot = await findRepoRoot(dirname(resolvedEvalPath));\n const evalDir = dirname(resolvedEvalPath);\n\n const category = deriveCategory(relative(process.cwd(), resolvedEvalPath));\n const suite = await loadTestSuite(resolvedEvalPath, repoRoot, { category });\n const tests = suite.tests;\n\n if (tests.length === 0) {\n console.error('No tests found in eval file.');\n process.exit(1);\n }\n\n // Try to resolve provider for CLI invocation info.\n // Non-CLI providers default to agent mode (executor subagents) unless\n // subagent_mode_allowed: false is set in providers.yaml.\n let targetInfo: { kind: 'cli'; command: string; cwd: string; timeoutMs: number } | null = null;\n let targetName = 'agent';\n let targetKind = 'agent';\n let subagentModeAllowed = true;\n\n try {\n const selection = await selectProvider({\n testFilePath: resolvedEvalPath,\n repoRoot,\n cwd: evalDir,\n cliProviderLabel: provider,\n explicitProvidersPath: providers,\n env: process.env,\n });\n\n targetName = selection.providerLabel;\n const resolved = selection.resolvedProvider;\n subagentModeAllowed = resolved.subagentModeAllowed !== false;\n\n if (resolved.kind === 'cli') {\n targetKind = 'cli';\n subagentModeAllowed = false;\n const config = resolved.config;\n targetInfo = {\n kind: 'cli',\n command: config.command,\n cwd: config.cwd ?? evalDir,\n timeoutMs: config.timeoutMs ?? 30000,\n };\n } else {\n targetKind = resolved.kind;\n }\n } catch {\n // No targets file found — subagent-as-target mode\n }\n\n // Use tests[0].suite — loaders (yaml-parser, jsonl-parser) already apply the\n // metadata.name → filename-basename → 'eval' fallback for subagent-mode labels.\n const suiteName = tests[0]?.suite?.trim() ?? '';\n const safeSuiteName = suiteName ? suiteName.replace(/[\\/\\\\:*?\"<>|]/g, '_') : '';\n\n const testIds: string[] = [];\n\n for (const test of tests) {\n const subpath = safeSuiteName ? [safeSuiteName, test.id] : [test.id];\n const testDir = join(outDir, ...subpath);\n await mkdir(testDir, { recursive: true });\n testIds.push(test.id);\n\n // input.json - aligned with eval YAML schema and script grader payload fields.\n const inputMessages = test.input.map((m) => ({\n role: m.role,\n content: typeof m.content === 'string' ? m.content : m.content,\n }));\n await writeJson(join(testDir, 'input.json'), {\n input: inputMessages,\n input_files: test.file_paths,\n ...(test.description ? { description: test.description } : {}),\n metadata: test.metadata ?? {},\n });\n\n // invoke.json — CLI targets get command info; non-CLI targets get agent mode.\n // The manifest carries subagent_mode_allowed so consumers (the bench skill)\n // can decide whether to dispatch executor subagents or use `agentv eval`.\n if (targetInfo) {\n await writeJson(join(testDir, 'invoke.json'), {\n kind: 'cli',\n command: targetInfo.command,\n cwd: targetInfo.cwd,\n timeout_ms: targetInfo.timeoutMs,\n env: {},\n });\n } else {\n await writeJson(join(testDir, 'invoke.json'), {\n kind: 'agent',\n instructions: 'Execute this task in the current workspace. The agent IS the target.',\n });\n }\n\n // criteria.md\n await writeFile(join(testDir, 'criteria.md'), test.criteria ?? '', 'utf8');\n\n // expected_output.json (if present)\n if (\n test.expected_output.length > 0 ||\n (test.reference_answer !== undefined && test.reference_answer !== '')\n ) {\n await writeJson(join(testDir, 'expected_output.json'), {\n expected_output: test.expected_output,\n reference_answer: test.reference_answer ?? '',\n });\n }\n\n // Grader configs\n await writeGraderConfigs(testDir, test.assertions ?? [], evalDir);\n }\n\n // manifest.json\n await writeJson(join(outDir, 'manifest.json'), {\n eval_file: resolvedEvalPath,\n suite: suiteName || undefined,\n experiment: experiment || undefined,\n timestamp: new Date().toISOString(),\n target: {\n name: targetName,\n kind: targetKind,\n subagent_mode_allowed: subagentModeAllowed,\n },\n test_ids: testIds,\n });\n\n console.log(`Extracted ${testIds.length} test(s) to ${outDir}`);\n\n // --- Subagent mode guidance ---\n if (targetKind === 'agent') {\n console.log(`\n Target: ${targetName} (subagent-as-target mode)`);\n console.log(` Tests: ${testIds.join(', ')}`);\n console.log('');\n console.log(' Next steps for the orchestrating agent:');\n console.log(' 1. Dispatch executor subagents — one per test case (all in parallel):');\n console.log(' - Each reads <run-dir>/<test-id>/input.json');\n console.log(' - Executes the task, writes <run-dir>/<test-id>/response.md');\n console.log(' 2. Run script graders: agentv pipeline grade <run-dir>');\n console.log(\n ' 3. Dispatch grader subagents — one per (test × LLM grader) pair (all in parallel):',\n );\n console.log(\n ' - Read agents/grader.md and embed its content as system instructions in each subagent prompt',\n );\n console.log(' - Each subagent reads llm_graders/<name>.json + response.md for its test');\n console.log(' - Each writes llm_grader_results/<name>.json');\n console.log(' 4. Merge scores: agentv pipeline bench <run-dir>');\n console.log('');\n console.log(' For the full procedure:');\n console.log(' agentv skills get agentv-bench --ref subagent-pipeline');\n console.log('');\n }\n },\n});\n\ninterface GraderCounts {\n scriptGraders: number;\n llmGraders: number;\n builtinAssertions: number;\n}\n\nasync function writeGraderConfigs(\n testDir: string,\n assertions: readonly GraderConfig[],\n evalDir: string,\n): Promise<GraderCounts> {\n const counts: GraderCounts = { scriptGraders: 0, llmGraders: 0, builtinAssertions: 0 };\n const scriptGradersDir = join(testDir, 'script_graders');\n const llmGradersDir = join(testDir, 'llm_graders');\n\n let hasScriptGraders = false;\n let hasLlmGraders = false;\n\n for (const assertion of assertions) {\n if (assertion.type === 'script') {\n if (!hasScriptGraders) {\n await mkdir(scriptGradersDir, { recursive: true });\n hasScriptGraders = true;\n }\n const config = assertion as ScriptGraderConfig;\n await writeJson(join(scriptGradersDir, `${config.name}.json`), {\n name: config.name,\n type: 'script',\n command: config.command,\n cwd: config.resolvedCwd ?? config.cwd ?? evalDir,\n weight: config.weight ?? 1.0,\n config: config.config ?? {},\n });\n } else if (assertion.type === 'llm-grader' || assertion.type === 'llm-rubric') {\n if (!hasLlmGraders) {\n await mkdir(llmGradersDir, { recursive: true });\n hasLlmGraders = true;\n }\n const config = assertion as LlmBackedGraderConfig;\n let promptContent = '';\n\n if (config.resolvedPromptPath) {\n try {\n promptContent = await readFile(config.resolvedPromptPath, 'utf8');\n } catch {\n promptContent = typeof config.prompt === 'string' ? config.prompt : '';\n }\n } else if (typeof config.prompt === 'string') {\n promptContent = config.prompt;\n }\n\n // For rubrics assertions, include the criteria array directly\n // so grader subagents can evaluate without needing a prompt file.\n const rubrics = config.rubrics;\n const rubricsData = rubrics?.map((r) => ({\n id: r.id,\n outcome: r.outcome,\n weight: r.weight ?? 1.0,\n ...(r.score_ranges ? { score_range: r.score_ranges } : {}),\n ...(r.required !== undefined ? { required: r.required } : {}),\n ...(r.min_score !== undefined ? { min_score: r.min_score } : {}),\n }));\n\n await writeJson(join(llmGradersDir, `${config.name}.json`), {\n name: config.name,\n type: config.type,\n prompt_content: promptContent,\n ...(config.type === 'llm-rubric' && config.value !== undefined\n ? { value: config.value }\n : {}),\n ...(rubricsData && rubricsData.length > 0 ? { rubrics: rubricsData } : {}),\n weight: config.weight ?? 1.0,\n threshold: 0.5,\n config: {},\n });\n } else if (BUILTIN_ASSERTION_TYPES.has(assertion.type)) {\n if (!hasScriptGraders) {\n await mkdir(scriptGradersDir, { recursive: true });\n hasScriptGraders = true;\n }\n const config = assertion as GraderConfig & { value?: unknown; flags?: string };\n await writeJson(join(scriptGradersDir, `${config.name}.json`), {\n name: config.name,\n type: config.type,\n value: config.value,\n flags: (config as { flags?: string }).flags,\n weight: config.weight ?? 1.0,\n negate: config.negate ?? false,\n });\n }\n }\n return counts;\n}\n\nasync function writeJson(filePath: string, data: unknown): Promise<void> {\n await writeFile(filePath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n}\n","/**\n * `agentv pipeline run` — Combined command that runs input extraction, CLI provider\n * invocation, and code grading in a single step.\n *\n * Equivalent to running:\n * 1. `agentv pipeline input <eval> --out <dir>`\n * 2. Invoking each CLI provider in parallel (writing response.md + metrics.json)\n * 3. `agentv pipeline grade <dir>`\n *\n * For `kind: agent` providers, step 2 is skipped (subagent handles execution).\n *\n * To add new features: extend the handler — all logic is self-contained.\n */\nimport { exec } from 'node:child_process';\nimport { existsSync, readFileSync, unlinkSync } from 'node:fs';\nimport { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { dirname, join, relative, resolve } from 'node:path';\n\nimport { deriveCategory, loadTestSuite } from '@agentv/core';\nimport type { GraderConfig, LlmBackedGraderConfig, ScriptGraderConfig } from '@agentv/core';\nimport { command, number, oneOf, option, optional, positional, string } from 'cmd-ts';\n\nimport { buildDefaultRunDir } from '../eval/result-layout.js';\nimport { findRepoRoot } from '../eval/shared.js';\nimport { selectProvider } from '../eval/targets.js';\nimport type { GraderTask } from './grade.js';\nimport { runScriptGraders } from './grade.js';\n\n/**\n * Convert a Message[] array to plain text.\n * Single message: returns content directly (no role prefix).\n * Multiple messages: prefixes each with @role for clarity.\n */\nfunction extractInputText(input: Array<{ role: string; content: string }>): string {\n if (!input || input.length === 0) return '';\n if (input.length === 1) return input[0].content;\n return input.map((m) => `@[${m.role}]:\\n${m.content}`).join('\\n\\n');\n}\n\n/** Load key=value pairs from a .env file. Ignores comments and blank lines. */\nfunction loadEnvFile(dir: string): Record<string, string> {\n let current = resolve(dir);\n while (true) {\n const candidate = join(current, '.env');\n if (existsSync(candidate)) {\n const env: Record<string, string> = {};\n for (const line of readFileSync(candidate, 'utf8').split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIdx = trimmed.indexOf('=');\n if (eqIdx === -1) continue;\n env[trimmed.slice(0, eqIdx).trim()] = trimmed.slice(eqIdx + 1).trim();\n }\n return env;\n }\n const parent = dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return {};\n}\n\nexport const evalRunCommand = command({\n name: 'run',\n description:\n 'Extract inputs, invoke CLI providers, and run script graders (for agent providers, use pipeline input + subagents)',\n args: {\n evalPath: positional({\n type: string,\n displayName: 'eval-path',\n description: 'Path to eval YAML file',\n }),\n out: option({\n type: optional(string),\n long: 'out',\n description: 'Output directory for results (default: .agentv/results/<run_id>)',\n }),\n workers: option({\n type: optional(number),\n long: 'workers',\n description:\n 'Parallel workers for provider invocation (default: providers.yaml workers, then 5)',\n }),\n experiment: option({\n type: optional(string),\n long: 'experiment',\n description: 'Experiment label (e.g. with_skills, without_skills)',\n }),\n graderType: option({\n type: optional(oneOf(['code', 'none'])),\n long: 'grader-type',\n description:\n 'Which grading phase to run: \"code\" runs script graders inline, omit to skip grading (use pipeline grade separately)',\n }),\n target: option({\n type: optional(string),\n long: 'target',\n description: '[Removed: use --provider <label>] Former provider selector',\n }),\n targets: option({\n type: optional(string),\n long: 'targets',\n description: '[Removed: use --providers <path>] Former providers.yaml path',\n }),\n provider: option({\n type: optional(string),\n long: 'provider',\n description: 'Override provider label from providers.yaml',\n }),\n providers: option({\n type: optional(string),\n long: 'providers',\n description: 'Path to providers.yaml (overrides discovery)',\n }),\n },\n handler: async ({\n evalPath,\n out,\n workers,\n experiment,\n graderType,\n target,\n targets,\n provider,\n providers,\n }) => {\n if (target !== undefined) {\n throw new Error(\n `--target was removed from agentv pipeline run. Use --provider ${target} instead.`,\n );\n }\n if (targets !== undefined) {\n throw new Error(\n `--targets was removed from agentv pipeline run. Use --providers ${targets} instead.`,\n );\n }\n\n const resolvedEvalPath = resolve(evalPath);\n const outDir = resolve(out ?? buildDefaultRunDir(process.cwd(), experiment));\n const repoRoot = await findRepoRoot(dirname(resolvedEvalPath));\n const evalDir = dirname(resolvedEvalPath);\n\n // ── Step 1: Extract inputs (same as pipeline input) ──────────────\n const category = deriveCategory(relative(process.cwd(), resolvedEvalPath));\n const suite = await loadTestSuite(resolvedEvalPath, repoRoot, { category });\n const tests = suite.tests;\n\n if (tests.length === 0) {\n console.error('No tests found in eval file.');\n process.exit(1);\n }\n\n let targetInfo: {\n kind: 'cli';\n command: string;\n cwd: string;\n timeoutMs: number;\n } | null = null;\n let targetName = 'agent';\n let targetKind = 'agent';\n let targetWorkers: number | undefined;\n\n try {\n const selection = await selectProvider({\n testFilePath: resolvedEvalPath,\n repoRoot,\n cwd: evalDir,\n cliProviderLabel: provider,\n explicitProvidersPath: providers,\n env: process.env,\n });\n targetName = selection.providerLabel;\n targetWorkers = selection.resolvedProvider.workers;\n if (selection.resolvedProvider.kind === 'cli') {\n targetKind = 'cli';\n const config = selection.resolvedProvider.config;\n targetInfo = {\n kind: 'cli',\n command: config.command,\n cwd: config.cwd ?? evalDir,\n timeoutMs: config.timeoutMs ?? 30000,\n };\n }\n } catch {\n // No targets file — subagent-as-target mode\n }\n\n // Use tests[0].suite — loaders (yaml-parser, jsonl-parser) already apply the\n // metadata.name → filename-basename → 'eval' fallback for subagent-mode labels.\n const suiteName = tests[0]?.suite?.trim() ?? '';\n const safeSuiteName = suiteName ? suiteName.replace(/[\\/\\\\:*?\"<>|]/g, '_') : '';\n\n const testIds: string[] = [];\n\n for (const test of tests) {\n const subpath = safeSuiteName ? [safeSuiteName, test.id] : [test.id];\n const testDir = join(outDir, ...subpath);\n await mkdir(testDir, { recursive: true });\n testIds.push(test.id);\n\n const inputMessages = test.input.map((m) => ({\n role: m.role,\n content: typeof m.content === 'string' ? m.content : m.content,\n }));\n await writeJson(join(testDir, 'input.json'), {\n input: inputMessages,\n input_files: test.file_paths,\n ...(test.description ? { description: test.description } : {}),\n metadata: test.metadata ?? {},\n });\n\n if (targetInfo) {\n await writeJson(join(testDir, 'invoke.json'), {\n kind: 'cli',\n command: targetInfo.command,\n cwd: targetInfo.cwd,\n timeout_ms: targetInfo.timeoutMs,\n env: {},\n });\n } else {\n await writeJson(join(testDir, 'invoke.json'), {\n kind: 'agent',\n instructions: 'Execute this task in the current workspace. The agent IS the target.',\n });\n }\n\n await writeFile(join(testDir, 'criteria.md'), test.criteria ?? '', 'utf8');\n\n if (\n test.expected_output.length > 0 ||\n (test.reference_answer !== undefined && test.reference_answer !== '')\n ) {\n await writeJson(join(testDir, 'expected_output.json'), {\n expected_output: test.expected_output,\n reference_answer: test.reference_answer ?? '',\n });\n }\n\n await writeGraderConfigs(testDir, test.assertions ?? [], evalDir);\n }\n\n await writeJson(join(outDir, 'manifest.json'), {\n eval_file: resolvedEvalPath,\n suite: suiteName || undefined,\n experiment: experiment || undefined,\n timestamp: new Date().toISOString(),\n target: { name: targetName, kind: targetKind },\n test_ids: testIds,\n });\n\n console.log(`Extracted ${testIds.length} test(s) to ${outDir}`);\n\n // ── Step 2: Invoke CLI targets in parallel ───────────────────────\n if (targetInfo) {\n const envVars = loadEnvFile(evalDir);\n // Set AGENTV_RUN_* so CLI targets group artifacts under this run folder.\n if (!process.env.AGENTV_RUN_TIMESTAMP) {\n process.env.AGENTV_RUN_TIMESTAMP = new Date()\n .toISOString()\n .replace(/:/g, '-')\n .replace(/\\./g, '-');\n }\n const mergedEnv = { ...process.env, ...envVars, AGENTV_RUN_DIR: outDir };\n const maxWorkers = workers ?? targetWorkers ?? 5;\n let invCompleted = 0;\n const invTotal = testIds.length;\n\n const writeInvProgress = () => {\n process.stderr.write(`\\rInvoking: ${invCompleted}/${invTotal} done`);\n };\n\n console.log(`Invoking ${invTotal} CLI target(s) (${maxWorkers} workers)...`);\n writeInvProgress();\n\n const invokeTarget = async (testId: string): Promise<void> => {\n const subpath = safeSuiteName ? [safeSuiteName, testId] : [testId];\n const testDir = join(outDir, ...subpath);\n const invoke = JSON.parse(await readFile(join(testDir, 'invoke.json'), 'utf8'));\n if (invoke.kind !== 'cli') return;\n\n const inputData = JSON.parse(await readFile(join(testDir, 'input.json'), 'utf8'));\n const template: string = invoke.command;\n const cwd: string = invoke.cwd;\n const timeoutMs: number = invoke.timeout_ms ?? 120000;\n\n // Write temp prompt file\n const promptFile = join(tmpdir(), `agentv-prompt-${testId}-${Date.now()}.txt`);\n const outputFile = join(tmpdir(), `agentv-output-${testId}-${Date.now()}.txt`);\n const inputText = extractInputText(inputData.input);\n await writeFile(promptFile, inputText, 'utf8');\n\n let rendered = template;\n rendered = rendered.replace('{PROMPT_FILE}', promptFile);\n rendered = rendered.replace('{OUTPUT_FILE}', outputFile);\n rendered = rendered.replace('{PROMPT}', inputText);\n\n const start = performance.now();\n try {\n await new Promise<void>((resolveP, rejectP) => {\n exec(\n rendered,\n {\n cwd,\n timeout: timeoutMs,\n env: mergedEnv,\n maxBuffer: 10 * 1024 * 1024,\n },\n (error) => {\n if (error) rejectP(error);\n else resolveP();\n },\n );\n });\n const durationMs = Math.round(performance.now() - start);\n\n let response: string;\n if (existsSync(outputFile)) {\n response = readFileSync(outputFile, 'utf8');\n } else {\n response = 'ERROR: No output file generated';\n }\n\n await writeFile(join(testDir, 'response.md'), response, 'utf8');\n await writeJson(join(testDir, 'metrics.json'), {\n duration: {\n total_ms: durationMs,\n total_seconds: Math.round(durationMs / 10) / 100,\n source: 'provider_reported',\n },\n tokens: { total: 0, input: 0, output: 0, reasoning: 0, source: 'unavailable' },\n cost: { usd: null, source: 'unavailable' },\n execution: { status: 'ok' },\n });\n\n process.stderr.write(`\\n ${testId}: OK (${durationMs}ms, ${response.length} chars)\\n`);\n } catch (error) {\n const durationMs = Math.round(performance.now() - start);\n const message = error instanceof Error ? error.message : String(error);\n const response = `ERROR: target failed — ${message}`;\n await writeFile(join(testDir, 'response.md'), response, 'utf8');\n await writeJson(join(testDir, 'metrics.json'), {\n duration: {\n total_ms: durationMs,\n total_seconds: Math.round(durationMs / 10) / 100,\n source: 'provider_reported',\n },\n tokens: { total: 0, input: 0, output: 0, reasoning: 0, source: 'unavailable' },\n cost: { usd: null, source: 'unavailable' },\n execution: { status: 'execution_error' },\n });\n process.stderr.write(\n `\\n ${testId}: FAILED (${durationMs}ms) — ${message.slice(0, 200)}\\n`,\n );\n } finally {\n invCompleted++;\n writeInvProgress();\n // Cleanup temp files\n try {\n if (existsSync(promptFile)) unlinkSync(promptFile);\n if (existsSync(outputFile)) unlinkSync(outputFile);\n } catch {\n /* ignore cleanup errors */\n }\n }\n };\n\n // Run targets with concurrency limit\n const pending = new Set<Promise<void>>();\n for (const testId of testIds) {\n const task = invokeTarget(testId).then(() => {\n pending.delete(task);\n });\n pending.add(task);\n if (pending.size >= maxWorkers) {\n await Promise.race(pending);\n }\n }\n await Promise.all(pending);\n process.stderr.write('\\n');\n } else {\n console.log('Subagent-as-target mode — the agent IS the target.');\n console.log('');\n console.log(' What happened: pipeline extracted inputs but did NOT invoke a CLI target.');\n console.log(\n ' The orchestrating agent must dispatch executor subagents to process each test.',\n );\n console.log('');\n console.log(' Next steps:');\n console.log(' 1. Dispatch executor subagents — one per test case (all in parallel):');\n console.log(' - Each reads <run-dir>/<test-id>/input.json');\n console.log(' - Executes the task, writes <run-dir>/<test-id>/response.md');\n console.log(' 2. Run script graders: agentv pipeline grade <run-dir>');\n console.log(\n ' 3. Dispatch grader subagents — one per (test x LLM grader) pair (all in parallel):',\n );\n console.log(\n ' - Read agents/grader.md and embed its content as system instructions in each subagent prompt',\n );\n console.log(' - Each subagent reads llm_graders/<name>.json + response.md');\n console.log(' - Each writes llm_grader_results/<name>.json');\n console.log(' 4. Merge scores: agentv pipeline bench <run-dir>');\n console.log('');\n console.log(' For the full procedure:');\n console.log(' agentv skills get agentv-bench --ref subagent-pipeline');\n console.log('');\n }\n\n // Step 3: Run script graders (only when explicitly requested).\n if (graderType !== 'code') {\n console.log(`\\nDone. Results in ${outDir}`);\n console.log('');\n if (targetKind === 'agent') {\n console.log(' The agent must now:');\n console.log(' 1. Dispatch executor subagents to generate response.md files');\n console.log(' 2. Run script graders: agentv pipeline grade <run-dir>');\n console.log(' 3. Dispatch grader subagents for llm_graders/ configs');\n console.log(' 4. Merge scores: agentv pipeline bench <run-dir>');\n } else {\n console.log(' To run script graders: agentv pipeline grade <run-dir>');\n console.log(' Or re-run with --grader-type code to grade inline.');\n }\n return;\n }\n\n // Collect grader tasks and run concurrently with progress feedback\n const graderTasks: GraderTask[] = [];\n\n for (const testId of testIds) {\n const subpath = safeSuiteName ? [safeSuiteName, testId] : [testId];\n const testDir = join(outDir, ...subpath);\n const scriptGradersDir = join(testDir, 'script_graders');\n const resultsDir = join(testDir, 'script_grader_results');\n\n let graderFiles: string[];\n try {\n graderFiles = (await readdir(scriptGradersDir)).filter((f) => f.endsWith('.json'));\n } catch {\n continue;\n }\n if (graderFiles.length === 0) continue;\n await mkdir(resultsDir, { recursive: true });\n\n const responseText = await readFile(join(testDir, 'response.md'), 'utf8');\n const inputData = JSON.parse(await readFile(join(testDir, 'input.json'), 'utf8'));\n\n for (const graderFile of graderFiles) {\n graderTasks.push({ testId, testDir, resultsDir, graderFile, responseText, inputData });\n }\n }\n\n const graderConcurrency = workers ?? 10;\n const { totalGraders, totalPassed } = await runScriptGraders(graderTasks, graderConcurrency);\n console.log(`Graded ${totalGraders} script grader(s): ${totalPassed} passed`);\n console.log('');\n console.log(`Results in ${outDir}`);\n console.log('');\n console.log(' Remaining steps:');\n console.log(' 1. If llm_graders/ configs exist, dispatch grader subagents');\n console.log(\n ' - Read agents/grader.md, embed as system instructions in each subagent prompt',\n );\n console.log(' 2. Merge all scores: agentv pipeline bench <run-dir>');\n },\n});\n\n// ── Helpers (shared with input.ts) ──────────────────────────────────\n\nasync function writeJson(filePath: string, data: unknown): Promise<void> {\n await writeFile(filePath, `${JSON.stringify(data, null, 2)}\\n`, 'utf8');\n}\n\nasync function writeGraderConfigs(\n testDir: string,\n assertions: readonly GraderConfig[],\n evalDir: string,\n): Promise<void> {\n const scriptGradersDir = join(testDir, 'script_graders');\n const llmGradersDir = join(testDir, 'llm_graders');\n\n let hasScriptGraders = false;\n let hasLlmGraders = false;\n\n for (const assertion of assertions) {\n if (assertion.type === 'script') {\n if (!hasScriptGraders) {\n await mkdir(scriptGradersDir, { recursive: true });\n hasScriptGraders = true;\n }\n const config = assertion as ScriptGraderConfig;\n await writeJson(join(scriptGradersDir, `${config.name}.json`), {\n name: config.name,\n type: 'script',\n command: config.command,\n cwd: config.resolvedCwd ?? config.cwd ?? evalDir,\n weight: config.weight ?? 1.0,\n config: config.config ?? {},\n });\n } else if (assertion.type === 'llm-grader' || assertion.type === 'llm-rubric') {\n if (!hasLlmGraders) {\n await mkdir(llmGradersDir, { recursive: true });\n hasLlmGraders = true;\n }\n const config = assertion as LlmBackedGraderConfig;\n let promptContent = '';\n if (config.resolvedPromptPath) {\n try {\n promptContent = readFileSync(config.resolvedPromptPath, 'utf8');\n } catch {\n promptContent = typeof config.prompt === 'string' ? config.prompt : '';\n }\n } else if (typeof config.prompt === 'string') {\n promptContent = config.prompt;\n }\n // For rubrics assertions, include the criteria array directly\n const rubrics = config.rubrics;\n const rubricsData = rubrics?.map((r) => ({\n id: r.id,\n outcome: r.outcome,\n weight: r.weight ?? 1.0,\n ...(r.score_ranges ? { score_range: r.score_ranges } : {}),\n ...(r.required !== undefined ? { required: r.required } : {}),\n ...(r.min_score !== undefined ? { min_score: r.min_score } : {}),\n }));\n\n await writeJson(join(llmGradersDir, `${config.name}.json`), {\n name: config.name,\n type: config.type,\n prompt_content: promptContent,\n ...(config.type === 'llm-rubric' && config.value !== undefined\n ? { value: config.value }\n : {}),\n ...(rubricsData && rubricsData.length > 0 ? { rubrics: rubricsData } : {}),\n weight: config.weight ?? 1.0,\n threshold: 0.5,\n config: {},\n });\n }\n }\n}\n","import { subcommands } from 'cmd-ts';\n\nimport { evalBenchCommand } from './bench.js';\nimport { evalGradeCommand } from './grade.js';\nimport { evalInputCommand } from './input.js';\nimport { evalRunCommand } from './run.js';\n\nexport const pipelineCommand = subcommands({\n name: 'pipeline',\n description:\n 'Subagent-mode eval pipeline (input → executor subagents → grade → bench) — use this when the eval target is an AI agent (Claude, Codex, etc.)',\n cmds: {\n input: evalInputCommand,\n grade: evalGradeCommand,\n bench: evalBenchCommand,\n run: evalRunCommand,\n },\n});\n","/**\n * `agentv prepare` materializes one eval test into a handoff directory for a\n * human or external agent. Core owns workspace setup through the pre-target\n * boundary; this CLI layer owns artifact shape and console output.\n */\nimport { cp, mkdir, rename, rm, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport {\n type EvalTargetRef,\n type JsonObject,\n type PreparedEvalWorkspace,\n type PreparedWorkspaceRepoPin,\n type ResolvedProviderBackend,\n type TargetHooksConfig,\n deriveCategory,\n loadTestSuite,\n prepareEvalWorkspace,\n} from '@agentv/core';\nimport { command, oneOf, option, optional, positional, string } from 'cmd-ts';\n\nimport { loadEnvFromHierarchy } from '../eval/env.js';\nimport { findRepoRoot } from '../eval/shared.js';\nimport { selectMultipleProviders } from '../eval/targets.js';\n\ntype SetupStepStatus = 'ok' | 'skipped' | 'warning';\n\ntype HookExecution = PreparedEvalWorkspace['hookExecutions'][number];\n\ninterface SetupStep {\n readonly name: string;\n readonly status: SetupStepStatus;\n readonly message?: string;\n}\n\ninterface RepoPin {\n readonly path?: string;\n readonly repo?: string;\n readonly commit?: string;\n readonly ancestor?: number;\n readonly sparse?: readonly string[];\n}\n\ninterface PrepareResult {\n readonly schemaVersion: 1;\n readonly evalPath: string;\n readonly testId: string;\n readonly target: string;\n readonly workspacePath: string;\n readonly promptPath: string;\n readonly manifestPath: string;\n readonly setupStatus: 'ok';\n readonly setupSteps: readonly SetupStep[];\n readonly providerContext?: JsonObject;\n readonly metadata?: Record<string, unknown>;\n readonly repoPins: readonly RepoPin[];\n readonly baseline: PreparedEvalWorkspace['baseline'];\n readonly createdAt: string;\n}\n\ninterface PrepareManifestWire {\n readonly schema_version: 1;\n readonly eval_path: string;\n readonly test_id: string;\n readonly target: string;\n readonly workspace_path: string;\n readonly prompt_path: string;\n readonly setup_status: 'ok';\n readonly setup_steps: readonly SetupStepWire[];\n readonly provider_context?: JsonObject;\n readonly metadata?: Record<string, unknown>;\n readonly repo_pins: readonly RepoPinWire[];\n readonly baseline: BaselineWire;\n readonly created_at: string;\n}\n\ninterface PrepareCommandOutputWire extends PrepareManifestWire {\n readonly manifest_path: string;\n}\n\ninterface SetupStepWire {\n readonly name: string;\n readonly status: SetupStepStatus;\n readonly message?: string;\n}\n\ninterface RepoPinWire {\n readonly path?: string;\n readonly repo?: string;\n readonly commit?: string;\n readonly ancestor?: number;\n readonly sparse?: readonly string[];\n}\n\ninterface BaselineWire {\n readonly status: PreparedEvalWorkspace['baseline']['status'];\n readonly commit?: string;\n}\n\nfunction setupStatusFromHook(status: HookExecution['status']): SetupStepStatus {\n if (status === 'success') {\n return 'ok';\n }\n if (status === 'skipped') {\n return 'skipped';\n }\n return 'warning';\n}\n\nfunction setupStepsFromPrepared(prepared: PreparedEvalWorkspace): readonly SetupStep[] {\n return [\n ...prepared.hookExecutions.map((hook) => ({\n name: `${hook.scope}_${hook.name}`,\n status: setupStatusFromHook(hook.status),\n ...(hook.error !== undefined && { message: hook.error }),\n })),\n {\n name: 'workspace_baseline',\n status: prepared.baseline.status === 'initialized' ? 'ok' : 'skipped',\n ...(prepared.baseline.status === 'unavailable' && { message: 'baseline unavailable' }),\n },\n ];\n}\n\nfunction toRepoPins(pins: readonly PreparedWorkspaceRepoPin[]): readonly RepoPin[] {\n return pins.map((pin) => ({\n ...(pin.path !== undefined && { path: pin.path }),\n ...(pin.repo !== undefined && { repo: pin.repo }),\n ...(pin.commit !== undefined && { commit: pin.commit }),\n ...(pin.ancestor !== undefined && { ancestor: pin.ancestor }),\n ...(pin.sparse !== undefined && { sparse: pin.sparse }),\n }));\n}\n\nfunction remapWorkspacePaths<T>(\n value: T,\n sourceWorkspacePath: string,\n targetWorkspacePath: string,\n): T {\n if (typeof value === 'string') {\n const relativePath = path.relative(sourceWorkspacePath, value);\n if (\n relativePath === '' ||\n (!!relativePath && !relativePath.startsWith('..') && !path.isAbsolute(relativePath))\n ) {\n return path.join(targetWorkspacePath, relativePath) as T;\n }\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) =>\n remapWorkspacePaths(item, sourceWorkspacePath, targetWorkspacePath),\n ) as T;\n }\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n remapWorkspacePaths(item, sourceWorkspacePath, targetWorkspacePath),\n ]),\n ) as T;\n }\n return value;\n}\n\nasync function moveDirectory(sourcePath: string, destinationPath: string): Promise<void> {\n try {\n await rename(sourcePath, destinationPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'EXDEV') {\n throw error;\n }\n await cp(sourcePath, destinationPath, { recursive: true });\n await rm(sourcePath, { recursive: true, force: true });\n }\n}\n\nasync function placePreparedWorkspace(\n prepared: PreparedEvalWorkspace,\n destinationPath: string,\n): Promise<string> {\n const sourcePath = prepared.workspacePath;\n if (path.resolve(sourcePath) === path.resolve(destinationPath)) {\n return destinationPath;\n }\n\n await mkdir(path.dirname(destinationPath), { recursive: true });\n await rm(destinationPath, { recursive: true, force: true });\n\n if (prepared.cleanupPolicy.mode !== 'static') {\n await moveDirectory(sourcePath, destinationPath);\n return destinationPath;\n }\n\n await cp(sourcePath, destinationPath, { recursive: true });\n return destinationPath;\n}\n\nfunction renderPrompt(options: {\n readonly workspacePath: string;\n readonly target: string;\n readonly taskInput: string;\n}): string {\n const taskInput = options.taskInput.trim() || '(No text input was provided.)';\n return [\n '# AgentV Prepared Attempt',\n '',\n '## Task Input',\n '',\n taskInput,\n '',\n '## Execution Instructions',\n '',\n `- Work in this workspace: ${options.workspacePath}`,\n `- Complete the task input for target: ${options.target}`,\n '- Leave the final files in the workspace for a later AgentV grading step.',\n '- Do not run AgentV graders or inspect eval answer keys, rubrics, or oracle data.',\n '',\n ].join('\\n');\n}\n\nfunction toManifestWire(result: PrepareResult): PrepareManifestWire {\n return {\n schema_version: result.schemaVersion,\n eval_path: result.evalPath,\n test_id: result.testId,\n target: result.target,\n workspace_path: result.workspacePath,\n prompt_path: result.promptPath,\n setup_status: result.setupStatus,\n setup_steps: result.setupSteps.map((step) => ({\n name: step.name,\n status: step.status,\n ...(step.message !== undefined && { message: step.message }),\n })),\n ...(result.providerContext !== undefined && { provider_context: result.providerContext }),\n ...(result.metadata !== undefined && { metadata: result.metadata }),\n repo_pins: result.repoPins.map((pin) => ({\n ...(pin.path !== undefined && { path: pin.path }),\n ...(pin.repo !== undefined && { repo: pin.repo }),\n ...(pin.commit !== undefined && { commit: pin.commit }),\n ...(pin.ancestor !== undefined && { ancestor: pin.ancestor }),\n ...(pin.sparse !== undefined && { sparse: pin.sparse }),\n })),\n baseline: {\n status: result.baseline.status,\n ...(result.baseline.commit !== undefined && { commit: result.baseline.commit }),\n },\n created_at: result.createdAt,\n };\n}\n\nfunction toCommandOutputWire(result: PrepareResult): PrepareCommandOutputWire {\n return {\n ...toManifestWire(result),\n manifest_path: result.manifestPath,\n };\n}\n\nasync function selectPrepareTarget(options: {\n readonly evalPath: string;\n readonly repoRoot: string;\n readonly target: string;\n readonly providerRefs?: readonly EvalTargetRef[];\n}): Promise<{\n readonly resolvedTarget: ResolvedProviderBackend;\n readonly targetHooks?: TargetHooksConfig;\n}> {\n const selections = await selectMultipleProviders({\n testFilePath: options.evalPath,\n repoRoot: options.repoRoot,\n cwd: process.cwd(),\n env: process.env,\n providerLabels: [options.target],\n providerRefs: options.providerRefs,\n });\n const selection = selections[0];\n if (!selection) {\n throw new Error(`Target '${options.target}' could not be resolved`);\n }\n return {\n resolvedTarget: {\n ...selection.resolvedProvider,\n name: options.target,\n } as ResolvedProviderBackend,\n ...(selection.providerHooks !== undefined && { targetHooks: selection.providerHooks }),\n };\n}\n\nasync function prepareAttempt(options: {\n readonly evalPath: string;\n readonly testId: string;\n readonly target: string;\n readonly outDir: string;\n}): Promise<PrepareResult> {\n const evalPath = path.resolve(options.evalPath);\n const outDir = path.resolve(options.outDir);\n const evalDir = path.dirname(evalPath);\n const repoRoot = await findRepoRoot(evalDir);\n\n await loadEnvFromHierarchy({ testFilePath: evalPath, repoRoot, verbose: false });\n\n const category = deriveCategory(path.relative(process.cwd(), evalPath));\n const suite = await loadTestSuite(evalPath, repoRoot, { category });\n const test = suite.tests.find((candidate) => candidate.id === options.testId);\n if (!test) {\n throw new Error(`Test ID '${options.testId}' not found in ${evalPath}`);\n }\n\n const providerRefs =\n suite.targetSpec?.hooks !== undefined && suite.targetSpec.name === options.target\n ? [\n ...(suite.targetRefs ?? []),\n { name: suite.targetSpec.name, hooks: suite.targetSpec.hooks },\n ]\n : suite.targetRefs;\n const { resolvedTarget, targetHooks } = await selectPrepareTarget({\n evalPath,\n repoRoot,\n target: options.target,\n providerRefs,\n });\n\n const prepared = await prepareEvalWorkspace({\n testFilePath: evalPath,\n repoRoot,\n target: resolvedTarget,\n ...(targetHooks !== undefined && { targetHooks }),\n evalCases: suite.tests,\n testId: options.testId,\n verbose: false,\n retainOnSuccess: 'keep',\n retainOnFailure: 'keep',\n });\n\n await mkdir(outDir, { recursive: true });\n const workspacePath = await placePreparedWorkspace(prepared, path.join(outDir, 'workspace'));\n const promptPath = path.join(outDir, 'prompt.md');\n const manifestPath = path.join(outDir, 'agentv_prepare.json');\n const prompt = renderPrompt({\n workspacePath,\n target: options.target,\n taskInput: prepared.promptSource.question,\n });\n\n await writeFile(promptPath, prompt, 'utf8');\n\n const result: PrepareResult = {\n schemaVersion: 1,\n evalPath,\n testId: prepared.testId,\n target: options.target,\n workspacePath,\n promptPath,\n manifestPath,\n setupStatus: 'ok',\n setupSteps: setupStepsFromPrepared(prepared),\n ...(prepared.providerContext !== undefined && {\n providerContext: remapWorkspacePaths(\n prepared.providerContext,\n prepared.workspacePath,\n workspacePath,\n ),\n }),\n ...(prepared.metadata !== undefined && {\n metadata: remapWorkspacePaths(prepared.metadata, prepared.workspacePath, workspacePath),\n }),\n repoPins: toRepoPins(prepared.repoPins),\n baseline: prepared.baseline,\n createdAt: prepared.createdAt,\n };\n\n await writeFile(manifestPath, `${JSON.stringify(toManifestWire(result), null, 2)}\\n`, 'utf8');\n return result;\n}\n\nfunction printHumanOutput(result: PrepareResult): void {\n console.log(`Prepared attempt for ${result.testId} (${result.target})`);\n console.log(`Workspace: ${result.workspacePath}`);\n console.log(`Prompt: ${result.promptPath}`);\n console.log(`Manifest: ${result.manifestPath}`);\n console.log('');\n console.log('Next steps:');\n console.log(' 1. Give prompt.md to the human or external agent.');\n console.log(` 2. Run the agent in ${result.workspacePath}.`);\n console.log(' 3. Keep the final workspace for a later AgentV grading command.');\n}\n\nexport const prepareCommand = command({\n name: 'prepare',\n description: 'Prepare one eval test workspace and safe prompt without running the target',\n args: {\n evalPath: positional({\n type: string,\n displayName: 'eval',\n description: 'Path to an eval file',\n }),\n testId: option({\n type: string,\n long: 'test-id',\n description: 'Exact test ID to prepare',\n }),\n target: option({\n type: optional(string),\n long: 'target',\n description: '[Removed: use --provider <label>] Former provider selector',\n }),\n provider: option({\n type: optional(string),\n long: 'provider',\n description: 'Provider label this prepared attempt is for',\n }),\n out: option({\n type: string,\n long: 'out',\n description: 'Prepared-attempt output directory',\n }),\n format: option({\n type: optional(oneOf(['text', 'json'])),\n long: 'format',\n description: 'Output format: text (default) or json',\n }),\n },\n handler: async ({ evalPath, testId, target, provider, out, format }) => {\n if (target !== undefined) {\n throw new Error(\n `--target was removed from agentv prepare. Use --provider ${target} instead.`,\n );\n }\n if (!provider) {\n throw new Error('--provider is required.');\n }\n\n const result = await prepareAttempt({ evalPath, testId, target: provider, outDir: out });\n if (format === 'json') {\n console.log(JSON.stringify(toCommandOutputWire(result), null, 2));\n return;\n }\n printHumanOutput(result);\n },\n});\n","import path from 'node:path';\n\nimport { toSnakeCaseDeep } from '@agentv/core';\nimport { command, flag, number, oneOf, option, optional, restPositionals, string } from 'cmd-ts';\n\nimport { RESULT_INDEX_FILENAME, isRunManifestPath } from '../eval/result-layout.js';\nimport { listResultFiles } from '../inspect/utils.js';\nimport {\n type LightweightResultRecord,\n loadLightweightResults,\n resolveResultSourcePath,\n} from '../results/manifest.js';\n\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n gray: '\\x1b[90m',\n};\n\nconst noColor = process.env.NO_COLOR !== undefined || !process.stdout.isTTY;\nconst c = noColor ? Object.fromEntries(Object.keys(colors).map((k) => [k, ''])) : colors;\nconst ansiPattern = new RegExp(`${String.fromCharCode(27)}\\\\[[0-9;]*m`, 'g');\n\nexport interface TrendRunRecord extends LightweightResultRecord {\n readonly sourcePath: string;\n}\n\nexport interface TrendRunPoint {\n readonly label: string;\n readonly path: string;\n readonly timestamp?: string;\n readonly matchedTestCount: number;\n readonly meanScore: number;\n}\n\nexport interface TrendFilters {\n readonly suite?: string;\n readonly target?: string;\n readonly allowMissingTests: boolean;\n}\n\nexport interface TrendSummary {\n readonly runCount: number;\n readonly matchedTestCount: number;\n readonly dateRange: {\n readonly start?: string;\n readonly end?: string;\n };\n readonly slope: number;\n readonly intercept: number;\n readonly rSquared: number;\n readonly direction: 'degrading' | 'improving' | 'stable';\n}\n\nexport interface TrendRegression {\n readonly slopeThreshold: number;\n readonly failOnDegrading: boolean;\n readonly triggered: boolean;\n}\n\nexport interface TrendOutput {\n readonly runs: readonly TrendRunPoint[];\n readonly filters: TrendFilters;\n readonly summary: TrendSummary;\n readonly regression: TrendRegression;\n}\n\ninterface RegressionStats {\n readonly slope: number;\n readonly intercept: number;\n readonly rSquared: number;\n}\n\nfunction stripAnsi(str: string): string {\n return str.replace(ansiPattern, '');\n}\n\nfunction padRight(str: string, len: number): string {\n const plainLen = stripAnsi(str).length;\n return str + ' '.repeat(Math.max(0, len - plainLen));\n}\n\nfunction padLeft(str: string, len: number): string {\n const plainLen = stripAnsi(str).length;\n return ' '.repeat(Math.max(0, len - plainLen)) + str;\n}\n\nfunction formatSignedNumber(value: number, digits = 3): string {\n const sign = value >= 0 ? '+' : '';\n return `${sign}${value.toFixed(digits)}`;\n}\n\nfunction colorizeDirection(direction: TrendSummary['direction']): string {\n switch (direction) {\n case 'improving':\n return `${c.green}${direction}${c.reset}`;\n case 'degrading':\n return `${c.red}${direction}${c.reset}`;\n case 'stable':\n return `${c.gray}${direction}${c.reset}`;\n }\n}\n\nfunction colorizeSlope(value: number): string {\n if (value > 0) {\n return `${c.green}${formatSignedNumber(value)}${c.reset}`;\n }\n if (value < 0) {\n return `${c.red}${formatSignedNumber(value)}${c.reset}`;\n }\n return `${c.gray}${formatSignedNumber(value)}${c.reset}`;\n}\n\nfunction ensureTrendIndexPath(source: string, cwd: string): string {\n const resolved = resolveResultSourcePath(source, cwd);\n if (!isRunManifestPath(resolved)) {\n throw new Error(\n `Unsupported result source for trend: ${source}. Use a run workspace directory or ${RESULT_INDEX_FILENAME} manifest.`,\n );\n }\n return resolved;\n}\n\nexport function resolveTrendSources(\n cwd: string,\n sources: readonly string[],\n last?: number,\n): string[] {\n if (sources.length > 0 && last !== undefined) {\n throw new Error('Use either explicit run sources or --last, not both');\n }\n\n if (sources.length > 0) {\n return sources.map((source) => ensureTrendIndexPath(source, cwd));\n }\n\n if (last === undefined) {\n throw new Error('Provide one or more run workspaces or use --last <n>');\n }\n\n if (last < 2) {\n throw new Error('--last must be at least 2');\n }\n\n const metas = listResultFiles(cwd)\n .filter((meta) => isRunManifestPath(meta.path))\n .slice(0, last);\n\n if (metas.length < 2) {\n throw new Error(\n 'Trend analysis requires at least 2 canonical run workspaces in .agentv/results/',\n );\n }\n\n return metas.map((meta) => meta.path).reverse();\n}\n\nfunction filterRunRecords(\n records: readonly LightweightResultRecord[],\n sourcePath: string,\n suite?: string,\n target?: string,\n): TrendRunRecord[] {\n return records\n .filter((record) => (suite ? record.suite === suite : true))\n .filter((record) => (target ? record.target === target : true))\n .map((record) => ({ ...record, sourcePath }));\n}\n\nfunction getRunLabel(sourcePath: string, timestamp?: string): string {\n if (timestamp) {\n return timestamp;\n }\n return path.basename(path.dirname(sourcePath));\n}\n\nfunction getRunSortKey(sourcePath: string, timestamp?: string): string {\n return timestamp ?? path.basename(path.dirname(sourcePath));\n}\n\nfunction mean(values: readonly number[]): number {\n return values.reduce((sum, value) => sum + value, 0) / values.length;\n}\n\nfunction roundMetric(value: number, digits = 6): number {\n return Number(value.toFixed(digits));\n}\n\nexport function computeMatchedTestIds(\n runs: readonly TrendRunRecord[][],\n allowMissingTests: boolean,\n): string[] | undefined {\n if (allowMissingTests) {\n return undefined;\n }\n\n const [firstRun, ...rest] = runs;\n const intersection = new Set(firstRun.map((record) => record.testId));\n\n for (const run of rest) {\n const runIds = new Set(run.map((record) => record.testId));\n for (const testId of intersection) {\n if (!runIds.has(testId)) {\n intersection.delete(testId);\n }\n }\n }\n\n return [...intersection].sort();\n}\n\nexport function computeRegressionStats(values: readonly number[]): RegressionStats {\n if (values.length < 2) {\n throw new Error('Trend analysis requires at least 2 runs');\n }\n\n const n = values.length;\n const meanX = (n - 1) / 2;\n const meanY = mean(values);\n\n let numerator = 0;\n let denominator = 0;\n for (let i = 0; i < n; i++) {\n const dx = i - meanX;\n numerator += dx * (values[i] - meanY);\n denominator += dx * dx;\n }\n\n const slope = denominator === 0 ? 0 : numerator / denominator;\n const intercept = meanY - slope * meanX;\n\n let ssTot = 0;\n let ssRes = 0;\n for (let i = 0; i < n; i++) {\n const predicted = intercept + slope * i;\n ssTot += (values[i] - meanY) ** 2;\n ssRes += (values[i] - predicted) ** 2;\n }\n\n const rSquared = ssTot === 0 ? 1 : 1 - ssRes / ssTot;\n return { slope, intercept, rSquared };\n}\n\nexport function classifyTrendDirection(\n slope: number,\n slopeThreshold: number,\n): TrendSummary['direction'] {\n if (slope <= -slopeThreshold) {\n return 'degrading';\n }\n if (slope >= slopeThreshold) {\n return 'improving';\n }\n return 'stable';\n}\n\nexport function determineTrendExitCode(\n direction: TrendSummary['direction'],\n failOnDegrading: boolean,\n): number {\n return failOnDegrading && direction === 'degrading' ? 1 : 0;\n}\n\nexport function analyzeTrend(params: {\n readonly sourcePaths: readonly string[];\n readonly suite?: string;\n readonly target?: string;\n readonly slopeThreshold: number;\n readonly allowMissingTests: boolean;\n readonly failOnDegrading: boolean;\n}): TrendOutput {\n const { sourcePaths, suite, target, slopeThreshold, allowMissingTests, failOnDegrading } = params;\n\n if (sourcePaths.length < 2) {\n throw new Error('Trend analysis requires at least 2 runs');\n }\n\n const filteredRuns = sourcePaths.map((sourcePath) => {\n const records = filterRunRecords(loadLightweightResults(sourcePath), sourcePath, suite, target);\n if (records.length === 0) {\n const filters = [suite ? `suite=${suite}` : '', target ? `target=${target}` : '']\n .filter(Boolean)\n .join(', ');\n const suffix = filters ? ` after filtering by ${filters}` : '';\n throw new Error(`Run has no matching records${suffix}: ${sourcePath}`);\n }\n return records;\n });\n\n const chronologicalRuns = filteredRuns\n .map((records, index) => ({\n sourcePath: sourcePaths[index],\n records,\n sortKey: getRunSortKey(sourcePaths[index], records[0]?.timestamp),\n }))\n .sort((a, b) => a.sortKey.localeCompare(b.sortKey));\n\n const matchedTestIds = computeMatchedTestIds(\n chronologicalRuns.map((run) => run.records),\n allowMissingTests,\n );\n if (!allowMissingTests && (!matchedTestIds || matchedTestIds.length === 0)) {\n throw new Error('No shared test IDs remain across the selected runs after filtering');\n }\n\n const runs = chronologicalRuns.map(({ records, sourcePath }) => {\n const applicableRecords =\n matchedTestIds === undefined\n ? records\n : records.filter((record) => matchedTestIds.includes(record.testId));\n\n if (applicableRecords.length === 0) {\n throw new Error(`Run has no matched tests after intersection: ${sourcePath}`);\n }\n\n return {\n label: getRunLabel(sourcePath, applicableRecords[0]?.timestamp ?? records[0]?.timestamp),\n path: sourcePath,\n timestamp: applicableRecords[0]?.timestamp ?? records[0]?.timestamp,\n matchedTestCount: applicableRecords.length,\n meanScore: roundMetric(mean(applicableRecords.map((record) => record.score))),\n } satisfies TrendRunPoint;\n });\n\n const regressionStats = computeRegressionStats(runs.map((run) => run.meanScore));\n const direction = classifyTrendDirection(regressionStats.slope, slopeThreshold);\n\n return {\n runs,\n filters: {\n suite,\n target,\n allowMissingTests,\n },\n summary: {\n runCount: runs.length,\n matchedTestCount:\n matchedTestIds?.length ?? Math.min(...runs.map((run) => run.matchedTestCount)),\n dateRange: {\n start: runs[0]?.timestamp,\n end: runs.at(-1)?.timestamp,\n },\n slope: roundMetric(regressionStats.slope),\n intercept: roundMetric(regressionStats.intercept),\n rSquared: roundMetric(regressionStats.rSquared),\n direction,\n },\n regression: {\n slopeThreshold,\n failOnDegrading,\n triggered: failOnDegrading && direction === 'degrading',\n },\n };\n}\n\nexport function formatTrendTable(output: TrendOutput): string {\n const lines: string[] = [];\n const runLabelWidth = Math.max(3, ...output.runs.map((run) => run.label.length));\n const scoreWidth = Math.max(10, ...output.runs.map((run) => run.meanScore.toFixed(3).length));\n const matchWidth = Math.max(7, ...output.runs.map((run) => String(run.matchedTestCount).length));\n\n lines.push('');\n lines.push(`${c.bold}Trend Analysis${c.reset}`);\n lines.push('');\n lines.push(\n `${c.bold}Runs:${c.reset} ${output.summary.runCount} | ${c.bold}Range:${c.reset} ${output.summary.dateRange.start ?? 'unknown'} → ${output.summary.dateRange.end ?? 'unknown'}`,\n );\n lines.push(\n `${c.bold}Filters:${c.reset} suite=${output.filters.suite ?? '*'} target=${output.filters.target ?? '*'} mode=${output.filters.allowMissingTests ? 'independent' : 'matched-tests'}`,\n );\n lines.push(\n `${c.bold}Matched Tests:${c.reset} ${output.summary.matchedTestCount} | ${c.bold}Verdict:${c.reset} ${colorizeDirection(output.summary.direction)}`,\n );\n lines.push('');\n\n const header = ` ${padRight('Run', runLabelWidth)} ${padLeft('Tests', matchWidth)} ${padLeft('Mean Score', scoreWidth)}`;\n lines.push(`${c.dim}${header}${c.reset}`);\n lines.push(\n `${c.dim} ${'─'.repeat(runLabelWidth)} ${'─'.repeat(matchWidth)} ${'─'.repeat(scoreWidth)}${c.reset}`,\n );\n\n for (const run of output.runs) {\n lines.push(\n ` ${padRight(run.label, runLabelWidth)} ${padLeft(String(run.matchedTestCount), matchWidth)} ${padLeft(run.meanScore.toFixed(3), scoreWidth)}`,\n );\n }\n\n lines.push('');\n lines.push(\n `${c.bold}Summary:${c.reset} slope=${colorizeSlope(output.summary.slope)} intercept=${output.summary.intercept.toFixed(3)} r²=${output.summary.rSquared.toFixed(3)}`,\n );\n lines.push(\n `${c.bold}Regression Gate:${c.reset} threshold=${output.regression.slopeThreshold.toFixed(3)} fail_on_degrading=${output.regression.failOnDegrading ? 'true' : 'false'} triggered=${output.regression.triggered ? `${c.red}true${c.reset}` : 'false'}`,\n );\n lines.push('');\n\n return lines.join('\\n');\n}\n\nexport const trendCommand = command({\n name: 'trend',\n description: 'Analyze score drift across multiple historical run manifests',\n args: {\n runs: restPositionals({\n type: string,\n displayName: 'runs',\n description: 'Run workspace directories or run manifest paths',\n }),\n last: option({\n type: optional(number),\n long: 'last',\n description: 'Use the most recent N runs from .agentv/results/',\n }),\n suite: option({\n type: optional(string),\n long: 'suite',\n description: 'Filter records to a suite name',\n }),\n target: option({\n type: optional(string),\n long: 'target',\n description: 'Filter records to a target name',\n }),\n slopeThreshold: option({\n type: optional(number),\n long: 'slope-threshold',\n description: 'Minimum absolute slope required to classify improving or degrading',\n }),\n failOnDegrading: flag({\n long: 'fail-on-degrading',\n description: 'Exit non-zero when the detected trend is degrading beyond the slope threshold',\n }),\n allowMissingTests: flag({\n long: 'allow-missing-tests',\n description: 'Aggregate each run independently instead of intersecting test IDs across runs',\n }),\n format: option({\n type: optional(oneOf(['table', 'json'])),\n long: 'format',\n short: 'f',\n description: 'Output format: table (default) or json',\n }),\n json: flag({\n long: 'json',\n description: 'Output JSON format (shorthand for --format=json)',\n }),\n },\n handler: async ({\n runs,\n last,\n suite,\n target,\n slopeThreshold,\n failOnDegrading,\n allowMissingTests,\n format,\n json,\n }) => {\n const outputFormat = json ? 'json' : (format ?? 'table');\n const effectiveSlopeThreshold = slopeThreshold ?? 0.01;\n\n try {\n if (effectiveSlopeThreshold < 0) {\n throw new Error('--slope-threshold must be non-negative');\n }\n\n const sourcePaths = resolveTrendSources(process.cwd(), runs, last);\n const output = analyzeTrend({\n sourcePaths,\n suite,\n target,\n slopeThreshold: effectiveSlopeThreshold,\n allowMissingTests,\n failOnDegrading,\n });\n\n if (outputFormat === 'json') {\n console.log(JSON.stringify(toSnakeCaseDeep(output), null, 2));\n } else {\n console.log(formatTrendTable(output));\n }\n\n process.exit(determineTrendExitCode(output.summary.direction, failOnDegrading));\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n },\n});\n","/**\n * `agentv results combine` — combine partial local run workspaces into one\n * canonical local run.\n *\n * Duplicate rows are keyed by `(test_id, target)`. Non-interactive usage\n * defaults to `error`; interactive usage defaults to prompting per duplicate\n * with an apply-to-all shortcut.\n */\n\nimport * as readline from 'node:readline/promises';\nimport { command, oneOf, option, optional, restPositionals, string } from 'cmd-ts';\n\nimport {\n type CombineDuplicatePolicy,\n type CombineRunSource,\n buildCombineRunSources,\n combineRunSources,\n inspectRunSourceDuplicates,\n} from './combine-run.js';\n\nexport async function collectPromptDuplicateChoices(\n conflicts: ReturnType<typeof inspectRunSourceDuplicates>,\n ask: (message: string) => Promise<string>,\n): Promise<Map<string, 'keep' | 'replace'>> {\n const choices = new Map<string, 'keep' | 'replace'>();\n let applyToAll: 'keep' | 'replace' | undefined;\n for (const conflict of conflicts) {\n if (choices.has(conflict.key)) continue;\n if (applyToAll) {\n choices.set(conflict.key, applyToAll);\n continue;\n }\n\n console.log(\n `Duplicate ${conflict.test_id} / ${conflict.target}: kept ${conflict.kept_source_id}, latest is ${conflict.latest_source_id}.`,\n );\n const answer = (await ask('Replace with latest? [y]es/[n]o/[a]ll latest/[k]eep all: '))\n .trim()\n .toLowerCase();\n if (answer === 'a' || answer === 'all') {\n applyToAll = 'replace';\n } else if (answer === 'k' || answer === 'keep') {\n applyToAll = 'keep';\n }\n const choice = applyToAll ?? (answer === 'y' || answer === 'yes' ? 'replace' : 'keep');\n choices.set(conflict.key, choice);\n }\n return choices;\n}\n\nasync function promptDuplicateChoices(\n conflicts: ReturnType<typeof inspectRunSourceDuplicates>,\n): Promise<Map<string, 'keep' | 'replace'>> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n return await collectPromptDuplicateChoices(conflicts, (message) => rl.question(message));\n } finally {\n rl.close();\n }\n}\n\nfunction defaultDuplicatePolicy(\n policy: CombineDuplicatePolicy | undefined,\n): CombineDuplicatePolicy {\n if (policy) return policy;\n return process.stdin.isTTY && process.stdout.isTTY ? 'prompt' : 'error';\n}\n\nfunction parseDuplicatePolicy(policy: string | undefined): CombineDuplicatePolicy | undefined {\n if (policy === 'prompt' || policy === 'error' || policy === 'latest') {\n return policy;\n }\n return undefined;\n}\n\nfunction uniqueSourceExperiments(sources: readonly CombineRunSource[]): string[] {\n return [...new Set(sources.map((source) => source.experiment))].sort();\n}\n\nasync function promptExperimentName(experiments: readonly string[]): Promise<string | undefined> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = await rl.question(\n `Source runs span experiments (${experiments.join(', ')}). New experiment name: `,\n );\n return answer.trim() || undefined;\n } finally {\n rl.close();\n }\n}\n\nexport const resultsCombineCommand = command({\n name: 'combine',\n description: 'Combine two or more partial local run workspaces into a new run workspace',\n args: {\n sources: restPositionals({\n type: string,\n displayName: 'source',\n description: 'Run workspace directory or run manifest',\n }),\n output: option({\n type: optional(string),\n long: 'output',\n short: 'o',\n description:\n 'Output run workspace directory (defaults to .agentv/results/<earliest-source-time>)',\n }),\n experiment: option({\n type: optional(string),\n long: 'experiment',\n description:\n 'Experiment namespace for the combined run. Required when sources span multiple experiments.',\n }),\n displayName: option({\n type: optional(string),\n long: 'display-name',\n description: 'Display name stored in summary.json metadata',\n }),\n duplicatePolicy: option({\n type: optional(oneOf(['prompt', 'error', 'latest'])),\n long: 'duplicate-policy',\n description:\n 'How to handle duplicate (test_id, target) rows: prompt interactively, error, or keep the latest timestamp',\n }),\n },\n handler: async (args) => {\n if (args.sources.length < 2) {\n console.error('Error: provide at least two run workspaces or run manifests');\n process.exit(1);\n }\n\n const cwd = process.cwd();\n const sources = buildCombineRunSources(args.sources, cwd);\n const sourceExperiments = uniqueSourceExperiments(sources);\n let experiment = args.experiment;\n if (\n !experiment &&\n sourceExperiments.length > 1 &&\n process.stdin.isTTY &&\n process.stdout.isTTY\n ) {\n experiment = await promptExperimentName(sourceExperiments);\n }\n if (!experiment && sourceExperiments.length > 1) {\n console.error(\n `Error: combining runs from multiple experiments requires --experiment <name>. Source experiments: ${sourceExperiments.join(', ')}`,\n );\n process.exit(1);\n }\n const duplicatePolicy = defaultDuplicatePolicy(parseDuplicatePolicy(args.duplicatePolicy));\n let promptChoices: Map<string, 'keep' | 'replace'> | undefined;\n\n if (duplicatePolicy === 'prompt') {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n console.error(\n 'Error: --duplicate-policy prompt requires an interactive terminal; use --duplicate-policy error or latest',\n );\n process.exit(1);\n }\n const conflicts = inspectRunSourceDuplicates(sources);\n if (conflicts.length > 0) {\n promptChoices = await promptDuplicateChoices(conflicts);\n }\n }\n\n try {\n const result = combineRunSources({\n cwd,\n sources,\n outputDir: args.output,\n experiment,\n displayName: args.displayName,\n duplicatePolicy,\n promptChoices,\n });\n console.log(`Combined ${result.testCount} result row(s) into ${result.runDir}`);\n console.log(` Run ID: ${result.runId}`);\n console.log(` Summary: ${result.summaryPath}`);\n if (result.duplicateConflicts.length > 0) {\n console.log(` Duplicates handled: ${result.duplicateConflicts.length}`);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n },\n});\n","/**\n * Shared run-combine implementation for `agentv results combine` and the\n * Dashboard API.\n *\n * Combines two or more local run workspace manifests into a new local run\n * workspace. The writer keeps per-test artifacts self-contained by copying\n * referenced source files under `sources/source-N/` and rewriting manifest\n * paths, while recomputing top-level `summary.json` from the selected result\n * rows.\n */\n\nimport {\n copyFileSync,\n cpSync,\n existsSync,\n mkdirSync,\n readFileSync,\n rmSync,\n statSync,\n writeFileSync,\n} from 'node:fs';\nimport path from 'node:path';\n\nimport type {\n EvaluationResult,\n ResultArtifactPointerWire,\n ResultArtifactPointersWire,\n TranscriptArtifactPointerWire,\n} from '@agentv/core';\n\nimport {\n type RunSummaryArtifact,\n buildRunSummaryArtifact,\n buildTestTargetKey,\n} from '../eval/artifact-writer.js';\nimport {\n RESULT_INDEX_FILENAME,\n buildDefaultRunDirFromName,\n createRunDirName,\n normalizeExperimentName,\n relativeRunPathFromCwd,\n resolveRunManifestPath,\n} from '../eval/result-layout.js';\nimport {\n type ResultManifestRecord,\n loadManifestResults,\n parseResultManifest,\n resolveResultSourcePath,\n} from './manifest.js';\n\nexport type CombineDuplicatePolicy = 'error' | 'latest' | 'prompt';\nexport type PromptDuplicateChoice = 'keep' | 'replace';\n\nexport interface CombineRunSource {\n readonly id: string;\n readonly displayName: string;\n readonly manifestPath: string;\n readonly experiment: string;\n}\n\nexport interface DuplicateConflict {\n readonly key: string;\n readonly test_id: string;\n readonly target: string;\n readonly kept_source_id: string;\n readonly incoming_source_id: string;\n readonly kept_timestamp?: string;\n readonly incoming_timestamp?: string;\n readonly latest_source_id: string;\n}\n\nexport class CombineDuplicateError extends Error {\n constructor(readonly conflicts: readonly DuplicateConflict[]) {\n super(`Duplicate result rows found for ${conflicts.length} (test_id, target) pair(s)`);\n this.name = 'CombineDuplicateError';\n }\n}\n\ninterface LoadedSource extends CombineRunSource {\n readonly index: number;\n readonly records: readonly ResultManifestRecord[];\n readonly results: readonly EvaluationResult[];\n readonly startedAt?: string;\n}\n\ninterface SelectedRow {\n readonly source: LoadedSource;\n readonly record: ResultManifestRecord;\n readonly result: EvaluationResult;\n}\n\nexport interface CombineRunOptions {\n readonly cwd: string;\n readonly sources: readonly CombineRunSource[];\n readonly outputDir?: string;\n readonly experiment?: string;\n readonly displayName?: string;\n readonly duplicatePolicy: CombineDuplicatePolicy;\n readonly promptChoices?: ReadonlyMap<string, PromptDuplicateChoice>;\n}\n\nexport interface CombineRunResult {\n readonly runDir: string;\n readonly runId: string;\n readonly manifestPath: string;\n readonly summaryPath: string;\n readonly displayName: string;\n readonly experiment: string;\n readonly combinedFromRunIds: readonly string[];\n readonly duplicateConflicts: readonly DuplicateConflict[];\n readonly testCount: number;\n readonly targetCount: number;\n}\n\nfunction parseJsonlLine(line: string): ResultManifestRecord {\n return JSON.parse(line) as ResultManifestRecord;\n}\n\nfunction readManifestRecords(manifestPath: string): ResultManifestRecord[] {\n return readFileSync(manifestPath, 'utf8')\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map(parseJsonlLine);\n}\n\nfunction readSummaryMetadata(manifestPath: string): {\n timestamp?: string;\n displayName?: string;\n experiment?: string;\n} {\n try {\n const summaryPath = path.join(path.dirname(manifestPath), 'summary.json');\n const parsed = JSON.parse(readFileSync(summaryPath, 'utf8')) as {\n metadata?: { timestamp?: string; display_name?: string; experiment?: string };\n };\n return {\n timestamp: parsed.metadata?.timestamp,\n displayName: parsed.metadata?.display_name,\n experiment: parsed.metadata?.experiment,\n };\n } catch {\n return {};\n }\n}\n\nfunction earliestTimestamp(values: readonly (string | undefined)[]): string | undefined {\n return values\n .filter((value): value is string => typeof value === 'string' && value.trim().length > 0)\n .sort((a, b) => a.localeCompare(b))[0];\n}\n\nfunction latestTimestamp(values: readonly (string | undefined)[]): string | undefined {\n return values\n .filter((value): value is string => typeof value === 'string' && value.trim().length > 0)\n .sort((a, b) => b.localeCompare(a))[0];\n}\n\nfunction resultKey(record: ResultManifestRecord, result: EvaluationResult): string {\n return buildTestTargetKey(\n record.test_id ?? result.testId,\n record.target ?? result.target,\n record.variant ?? result.variant,\n );\n}\n\nfunction loadSources(sources: readonly CombineRunSource[]): LoadedSource[] {\n return sources.map((source, index) => {\n const manifestPath = resolveRunManifestPath(source.manifestPath);\n const records = readManifestRecords(manifestPath);\n const results = loadManifestResults(manifestPath);\n if (records.length !== results.length) {\n throw new Error(`Manifest could not be hydrated completely: ${manifestPath}`);\n }\n const metadata = readSummaryMetadata(manifestPath);\n return {\n ...source,\n index,\n manifestPath,\n displayName: metadata.displayName ?? source.displayName,\n records,\n results,\n startedAt:\n earliestTimestamp(records.map((record) => record.timestamp)) ??\n earliestTimestamp(results.map((result) => result.timestamp)) ??\n metadata.timestamp,\n };\n });\n}\n\nfunction isIncomingLatest(existing: SelectedRow, incoming: SelectedRow): boolean {\n const existingTimestamp =\n latestTimestamp([existing.record.timestamp, existing.result.timestamp]) ?? '';\n const incomingTimestamp =\n latestTimestamp([incoming.record.timestamp, incoming.result.timestamp]) ?? '';\n if (incomingTimestamp !== existingTimestamp) {\n return incomingTimestamp > existingTimestamp;\n }\n return incoming.source.index > existing.source.index;\n}\n\nfunction buildConflict(\n existing: SelectedRow,\n incoming: SelectedRow,\n key: string,\n): DuplicateConflict {\n const latest = isIncomingLatest(existing, incoming) ? incoming : existing;\n return {\n key,\n test_id: incoming.record.test_id ?? incoming.result.testId ?? 'unknown',\n target: incoming.record.target ?? incoming.result.target ?? 'unknown',\n kept_source_id: existing.source.id,\n incoming_source_id: incoming.source.id,\n kept_timestamp: existing.record.timestamp ?? existing.result.timestamp,\n incoming_timestamp: incoming.record.timestamp ?? incoming.result.timestamp,\n latest_source_id: latest.source.id,\n };\n}\n\nfunction selectRows(\n sources: readonly LoadedSource[],\n duplicatePolicy: CombineDuplicatePolicy,\n promptChoices?: ReadonlyMap<string, PromptDuplicateChoice>,\n): { rows: SelectedRow[]; conflicts: DuplicateConflict[] } {\n const rows: SelectedRow[] = [];\n const selectedByKey = new Map<string, number>();\n const conflicts: DuplicateConflict[] = [];\n\n for (const source of sources) {\n for (let i = 0; i < source.records.length; i++) {\n const row: SelectedRow = {\n source,\n record: source.records[i],\n result: source.results[i],\n };\n const key = resultKey(row.record, row.result);\n const existingIndex = selectedByKey.get(key);\n if (existingIndex === undefined) {\n selectedByKey.set(key, rows.length);\n rows.push(row);\n continue;\n }\n\n const existing = rows[existingIndex];\n const conflict = buildConflict(existing, row, key);\n conflicts.push(conflict);\n\n if (duplicatePolicy === 'error') {\n continue;\n }\n\n const shouldUseLatest =\n duplicatePolicy === 'latest' ||\n (duplicatePolicy === 'prompt' && promptChoices?.get(key) === 'replace');\n if (shouldUseLatest && isIncomingLatest(existing, row)) {\n rows[existingIndex] = row;\n }\n }\n }\n\n if (conflicts.length > 0 && duplicatePolicy === 'error') {\n throw new CombineDuplicateError(conflicts);\n }\n if (\n conflicts.some((conflict) => !promptChoices?.has(conflict.key)) &&\n duplicatePolicy === 'prompt'\n ) {\n throw new CombineDuplicateError(conflicts);\n }\n\n return { rows, conflicts };\n}\n\nexport function inspectRunSourceDuplicates(\n sources: readonly CombineRunSource[],\n): readonly DuplicateConflict[] {\n const loaded = loadSources(sources);\n try {\n selectRows(loaded, 'error');\n return [];\n } catch (err) {\n if (err instanceof CombineDuplicateError) {\n return err.conflicts;\n }\n throw err;\n }\n}\n\nfunction sanitizePathSegment(value: string): string {\n return value.replace(/[^A-Za-z0-9._-]+/g, '-').replace(/^-+|-+$/g, '') || 'combined-run';\n}\n\nfunction defaultDisplayName(sources: readonly LoadedSource[]): string {\n return `Combined run (${sources.map((source) => source.displayName).join(' + ')})`;\n}\n\nfunction defaultCombinedRunDirForExperiment(\n cwd: string,\n experiment: string,\n startedAt: string | undefined,\n): string {\n const parsed = startedAt ? new Date(startedAt) : undefined;\n const timestamp =\n parsed && !Number.isNaN(parsed.getTime())\n ? createRunDirName(parsed)\n : sanitizePathSegment(startedAt ?? 'unknown-time');\n return buildDefaultRunDirFromName(cwd, experiment, timestamp);\n}\n\nfunction uniqueRunDir(baseDir: string): string {\n if (!existsSync(baseDir)) return baseDir;\n let suffix = 1;\n while (existsSync(`${baseDir}-${suffix}`)) {\n suffix++;\n }\n return `${baseDir}-${suffix}`;\n}\n\nfunction toRunId(cwd: string, runDir: string): string {\n const relative = relativeRunPathFromCwd(cwd, runDir);\n return relative ?? path.basename(runDir);\n}\n\nfunction resolveCombinedExperiment(\n sources: readonly LoadedSource[],\n requestedExperiment: string | undefined,\n): string {\n const experiments = [...new Set(sources.map((source) => source.experiment))];\n const normalizedRequested = requestedExperiment?.trim()\n ? normalizeExperimentName(requestedExperiment)\n : undefined;\n if (experiments.length === 1) {\n const sourceExperiment = experiments[0];\n if (normalizedRequested === undefined) {\n return sourceExperiment;\n }\n if (normalizedRequested !== sourceExperiment) {\n throw new Error(`Combined runs from the same experiment must inherit \"${sourceExperiment}\".`);\n }\n return sourceExperiment;\n }\n\n if (normalizedRequested !== undefined) {\n return normalizedRequested;\n }\n\n throw new Error(\n `Combining runs from multiple experiments requires an experiment name. Source experiments: ${experiments\n .sort()\n .join(', ')}`,\n );\n}\n\nconst MANIFEST_PATH_FIELDS = [\n 'result_dir',\n 'summary_path',\n 'grading_path',\n 'timing_path',\n 'input_path',\n 'output_path',\n 'response_path',\n 'transcript_path',\n 'transcript_raw_path',\n 'metrics_path',\n 'raw_provider_log_path',\n 'test_dir',\n 'task_dir',\n 'eval_path',\n 'providers_path',\n 'files_path',\n 'graders_path',\n] as const;\n\nconst POINTER_FAMILIES = {\n transcript: 'transcripts',\n} as const;\n\nfunction isSafeRelativeArtifactPath(relativePath: string): boolean {\n return !path.isAbsolute(relativePath) && !relativePath.split(/[\\\\/]+/).includes('..');\n}\n\nfunction copyReferencedArtifact(\n sourceBaseDir: string,\n outputDir: string,\n sourceIndex: number,\n relativePath: string | undefined,\n): string | undefined {\n if (!relativePath) return undefined;\n if (!isSafeRelativeArtifactPath(relativePath)) {\n throw new Error(`Unsafe artifact path in source manifest: ${relativePath}`);\n }\n const sourcePath = path.join(sourceBaseDir, relativePath);\n if (!existsSync(sourcePath)) {\n return relativePath;\n }\n const rewritten = path.posix.join(`sources/source-${sourceIndex + 1}`, relativePath);\n const destPath = path.join(outputDir, rewritten);\n const sourceStat = statSync(sourcePath);\n mkdirSync(path.dirname(destPath), { recursive: true });\n if (sourceStat.isDirectory()) {\n cpSync(sourcePath, destPath, { recursive: true });\n } else if (sourceStat.isFile()) {\n copyFileSync(sourcePath, destPath);\n }\n return rewritten;\n}\n\nfunction rewriteArtifactPointer(\n pointerName: keyof typeof POINTER_FAMILIES,\n pointer: ResultArtifactPointerWire | undefined,\n sourceBaseDir: string,\n outputDir: string,\n sourceIndex: number,\n): ResultArtifactPointerWire | undefined {\n if (!pointer) {\n return undefined;\n }\n\n if (!isSafeRelativeArtifactPath(pointer.path)) {\n throw new Error(`Unsafe artifact path in source manifest: ${pointer.path}`);\n }\n const sourcePath = path.join(sourceBaseDir, pointer.path);\n if (!existsSync(sourcePath)) {\n return { ...pointer };\n }\n\n const rewrittenPath = copyReferencedArtifact(sourceBaseDir, outputDir, sourceIndex, pointer.path);\n if (!rewrittenPath) {\n return { ...pointer };\n }\n\n const family = pointer.family ?? POINTER_FAMILIES[pointerName];\n return {\n ...pointer,\n path: rewrittenPath,\n key: path.posix.join(family, rewrittenPath),\n };\n}\n\nfunction rewriteTranscriptArtifactPointer(\n pointer: TranscriptArtifactPointerWire | undefined,\n sourceBaseDir: string,\n outputDir: string,\n sourceIndex: number,\n): TranscriptArtifactPointerWire | undefined {\n return rewriteArtifactPointer('transcript', pointer, sourceBaseDir, outputDir, sourceIndex) as\n | TranscriptArtifactPointerWire\n | undefined;\n}\n\nfunction rewriteArtifactPointers(\n pointers: ResultArtifactPointersWire | undefined,\n sourceBaseDir: string,\n outputDir: string,\n sourceIndex: number,\n): ResultArtifactPointersWire | undefined {\n if (!pointers) {\n return undefined;\n }\n\n const transcript = rewriteTranscriptArtifactPointer(\n pointers.transcript,\n sourceBaseDir,\n outputDir,\n sourceIndex,\n );\n return transcript ? { transcript } : undefined;\n}\n\nfunction removeCopiedDeprecatedTraceArtifact(\n row: SelectedRow,\n outputDir: string,\n sourceBaseDir: string,\n): void {\n const tracePath = row.record.trace_path;\n if (!tracePath || !isSafeRelativeArtifactPath(tracePath)) {\n return;\n }\n if (!existsSync(path.join(sourceBaseDir, tracePath))) {\n return;\n }\n const copiedTracePath = path.join(outputDir, `sources/source-${row.source.index + 1}`, tracePath);\n rmSync(copiedTracePath, { force: true });\n}\n\nfunction rewriteAndCopyRecord(\n row: SelectedRow,\n outputDir: string,\n experiment: string,\n): ResultManifestRecord {\n const sourceBaseDir = path.dirname(row.source.manifestPath);\n const rewritten: Record<string, unknown> = { ...row.record };\n rewritten.experiment = experiment;\n for (const field of MANIFEST_PATH_FIELDS) {\n rewritten[field] = copyReferencedArtifact(\n sourceBaseDir,\n outputDir,\n row.source.index,\n row.record[field],\n );\n }\n const artifactPointers = rewriteArtifactPointers(\n row.record.artifact_pointers,\n sourceBaseDir,\n outputDir,\n row.source.index,\n );\n rewritten.artifact_pointers = artifactPointers;\n removeCopiedDeprecatedTraceArtifact(row, outputDir, sourceBaseDir);\n rewritten.trace_path = undefined;\n if (\n row.record.transcript_path &&\n rewritten.transcript_path === row.record.transcript_path &&\n artifactPointers?.transcript?.path\n ) {\n rewritten.transcript_path = artifactPointers.transcript.path;\n }\n return rewritten as unknown as ResultManifestRecord;\n}\n\nfunction writeJson(filePath: string, value: unknown): void {\n writeFileSync(filePath, `${JSON.stringify(value, null, 2)}\\n`, 'utf8');\n}\n\nfunction writeJsonl(filePath: string, records: readonly unknown[]): void {\n writeFileSync(\n filePath,\n `${records.map((record) => JSON.stringify(record)).join('\\n')}\\n`,\n 'utf8',\n );\n}\n\nexport function buildCombineRunSources(\n sourcePaths: readonly string[],\n cwd: string,\n options?: {\n ids?: readonly string[];\n displayNames?: readonly string[];\n },\n): CombineRunSource[] {\n return sourcePaths.map((sourcePath, index) => {\n const manifestPath = resolveResultSourcePath(sourcePath, cwd);\n const runDir = path.dirname(resolveRunManifestPath(manifestPath));\n const relativeRunPath = relativeRunPathFromCwd(cwd, runDir);\n if (!relativeRunPath) {\n throw new Error(\n `Run workspace is outside the canonical results layout: ${runDir}. Expected .agentv/results/<run_id>`,\n );\n }\n const records = readManifestRecords(manifestPath);\n const summaryMetadata = readSummaryMetadata(manifestPath);\n const experiment =\n summaryMetadata.experiment ??\n records.find((record) => typeof record.experiment === 'string')?.experiment ??\n 'default';\n return {\n id: options?.ids?.[index] ?? toRunId(cwd, runDir),\n displayName: options?.displayNames?.[index] ?? path.basename(runDir),\n manifestPath,\n experiment: normalizeExperimentName(experiment),\n };\n });\n}\n\nexport function combineRunSources(options: CombineRunOptions): CombineRunResult {\n if (options.sources.length < 2) {\n throw new Error('Select at least two runs to combine');\n }\n\n const loadedSources = loadSources(options.sources);\n const startedAt = earliestTimestamp(loadedSources.map((source) => source.startedAt));\n const experiment = resolveCombinedExperiment(loadedSources, options.experiment);\n const displayName = options.displayName?.trim() || defaultDisplayName(loadedSources);\n const runDir = uniqueRunDir(\n options.outputDir\n ? path.resolve(options.cwd, options.outputDir)\n : defaultCombinedRunDirForExperiment(options.cwd, experiment, startedAt),\n );\n const relativeOutputRunPath = relativeRunPathFromCwd(options.cwd, runDir);\n if (!relativeOutputRunPath) {\n throw new Error(`Output run workspace must use .agentv/results/<run_id>: ${runDir}`);\n }\n const { rows, conflicts } = selectRows(\n loadedSources,\n options.duplicatePolicy,\n options.promptChoices,\n );\n const results = rows\n .map((row) => row.result)\n .sort((a, b) => {\n const left = a.timestamp ?? '';\n const right = b.timestamp ?? '';\n return left.localeCompare(right);\n });\n\n mkdirSync(runDir, { recursive: true });\n const records = rows.map((row) => rewriteAndCopyRecord(row, runDir, experiment));\n const manifestPath = path.join(runDir, RESULT_INDEX_FILENAME);\n writeJsonl(manifestPath, records);\n\n const summary = buildRunSummaryArtifact(\n results,\n '',\n 'combined',\n path.basename(runDir),\n results.length,\n );\n const summaryWithMetadata: RunSummaryArtifact & {\n metadata: RunSummaryArtifact['metadata'] & {\n display_name: string;\n combined_from_run_ids: readonly string[];\n combined_from_display_names: readonly string[];\n experiment: string;\n duplicate_policy: Exclude<CombineDuplicatePolicy, 'prompt'> | 'prompt';\n };\n } = {\n ...summary,\n metadata: {\n ...summary.metadata,\n timestamp: startedAt ?? summary.metadata.timestamp,\n display_name: displayName,\n experiment,\n combined_from_run_ids: loadedSources.map((source) => source.id),\n combined_from_display_names: loadedSources.map((source) => source.displayName),\n duplicate_policy: options.duplicatePolicy,\n },\n };\n const summaryPath = path.join(runDir, 'summary.json');\n writeJson(summaryPath, summaryWithMetadata);\n\n return {\n runDir,\n runId: toRunId(options.cwd, runDir),\n manifestPath,\n summaryPath,\n displayName,\n experiment,\n combinedFromRunIds: loadedSources.map((source) => source.id),\n duplicateConflicts: conflicts,\n testCount: rows.length,\n targetCount: new Set(results.map((result) => result.target ?? 'unknown')).size,\n };\n}\n","/**\n * `agentv results delete` — remove one or more local run workspaces.\n *\n * The command requires confirmation unless `--yes` is passed. It accepts local\n * run IDs, run workspace directories, or run manifests and refuses\n * remote runs.\n */\n\nimport * as readline from 'node:readline/promises';\nimport { command, flag, restPositionals, string } from 'cmd-ts';\n\nimport { deleteLocalRun, resolveDeleteRunTarget } from './delete-run.js';\n\nasync function confirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = (await rl.question(`${message} [y/N] `)).trim().toLowerCase();\n return answer === 'y' || answer === 'yes';\n } finally {\n rl.close();\n }\n}\n\nexport const resultsDeleteCommand = command({\n name: 'delete',\n description: 'Delete one or more local run workspaces',\n args: {\n runs: restPositionals({\n type: string,\n displayName: 'run',\n description: 'Local run ID, run workspace directory, or run manifest',\n }),\n yes: flag({\n long: 'yes',\n short: 'y',\n description: 'Skip confirmation prompt',\n }),\n },\n handler: async ({ runs, yes }) => {\n if (runs.length === 0) {\n console.error('Error: provide at least one local run ID or run workspace path');\n process.exit(1);\n }\n\n const cwd = process.cwd();\n try {\n const targets = runs.map((run) => resolveDeleteRunTarget(cwd, run));\n if (!yes) {\n const confirmed = await confirm(`Delete ${targets.length} local run workspace(s)?`);\n if (!confirmed) {\n console.log('Cancelled.');\n return;\n }\n }\n\n for (const run of runs) {\n const deleted = deleteLocalRun(cwd, run);\n console.log(`Deleted ${deleted.runId}: ${deleted.runDir}`);\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`Error: ${message}`);\n process.exit(1);\n }\n },\n});\n","/**\n * Shared local run deletion primitive for `agentv results delete` and the\n * Dashboard API.\n *\n * Deletes exactly one local run workspace directory under `.agentv/results/`.\n * Callers may pass a run ID, run workspace directory, or run manifest path.\n * Remote runs and paths outside the local results tree are rejected before\n * anything is removed.\n */\n\nimport { existsSync, rmSync } from 'node:fs';\nimport path from 'node:path';\n\nimport {\n RESULT_INDEX_FILENAME,\n isRunManifestPath,\n relativeRunPathFromCwd,\n resolveRunManifestPath,\n} from '../eval/result-layout.js';\nimport { listResultFiles } from '../inspect/utils.js';\nimport { resolveResultSourcePath } from './manifest.js';\nimport { isRemoteRunId } from './remote.js';\n\nexport interface DeleteRunTarget {\n readonly runId: string;\n readonly runDir: string;\n readonly manifestPath: string;\n}\n\nexport interface DeleteRunResult extends DeleteRunTarget {\n readonly deleted: true;\n}\n\nfunction assertLocalRunManifest(cwd: string, manifestPath: string, runId: string): DeleteRunTarget {\n const resolvedManifestPath = path.resolve(manifestPath);\n if (!isRunManifestPath(resolvedManifestPath)) {\n throw new Error(`Expected a run workspace directory or ${RESULT_INDEX_FILENAME} manifest`);\n }\n\n const runDir = path.dirname(resolvedManifestPath);\n if (!relativeRunPathFromCwd(cwd, runDir)) {\n throw new Error('Run workspace is outside the local results directory');\n }\n if (!existsSync(resolvedManifestPath)) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n return { runId, runDir, manifestPath: resolvedManifestPath };\n}\n\nexport function resolveDeleteRunTarget(cwd: string, runIdOrPath: string): DeleteRunTarget {\n const requested = runIdOrPath.trim();\n if (!requested) {\n throw new Error('Run ID is required');\n }\n if (isRemoteRunId(requested)) {\n throw new Error('Run deletion is only available for local runs');\n }\n\n const localMeta = listResultFiles(cwd).find((run) => run.filename === requested);\n if (localMeta) {\n return assertLocalRunManifest(cwd, localMeta.path, requested);\n }\n\n const resolvedSource = resolveResultSourcePath(requested, cwd);\n if (!existsSync(resolvedSource)) {\n throw new Error(`Run not found: ${requested}`);\n }\n const manifestPath = resolveRunManifestPath(resolvedSource);\n return assertLocalRunManifest(cwd, manifestPath, requested);\n}\n\nexport function deleteLocalRun(cwd: string, runIdOrPath: string): DeleteRunResult {\n const target = resolveDeleteRunTarget(cwd, runIdOrPath);\n rmSync(target.runDir, { recursive: true, force: false });\n return { ...target, deleted: true };\n}\n","/**\n * `agentv results export` — converts a canonical run workspace or run manifest\n * manifest into a directory structure matching the artifact-writer output format.\n *\n * Output structure:\n * <output-dir>/\n * summary.json — run aggregate scores, metadata, and timing\n * index.jsonl — per-test manifest with artifact pointers\n * <test-id>/\n * summary.json — per-case aggregate\n * sample-1/result.json — per-sample result\n * sample-1/grading.json — per-sample grading artifact (assertions, graders)\n * sample-1/metrics.json — per-sample metrics artifact\n *\n * This module delegates artifact building to the shared artifact-writer so\n * that summary/grading/timing schemas stay aligned with `agentv eval`.\n *\n * How to extend:\n * - To change artifact schemas, update artifact-writer.ts (single source of truth).\n * - To add new per-test workspace files, add them under each test directory.\n */\n\nimport { cpSync, existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { command, flag, oneOf, option, optional, positional, string } from 'cmd-ts';\n\nimport type {\n AdditionalResultArtifactsWriter,\n AdditionalResultIndexFields,\n EvaluationResult,\n ExportDuplicatePolicy,\n IndexArtifactEntry,\n} from '@agentv/core';\n\nimport { parseJsonlResults, writeArtifactsFromResults } from '../eval/artifact-writer.js';\nimport {\n RESULT_INDEX_FILENAME,\n RUN_INTERNAL_DIRNAME,\n isReservedResultsNamespace,\n isRunManifestPath,\n} from '../eval/result-layout.js';\nimport { loadManifestResults } from './manifest.js';\nimport {\n type ProjectionBundle,\n buildProjectionBundle,\n serializeProjectionBundle,\n writeProjectionBundle,\n} from './projection-bundle.js';\nimport { loadResults as loadSharedResults, resolveSourceFile } from './shared.js';\n\n// ── Export logic ─────────────────────────────────────────────────────────\n\nexport async function exportResults(\n sourceFile: string,\n content: string,\n outputDir: string,\n options?: { duplicatePolicy?: ExportDuplicatePolicy },\n): Promise<void> {\n const results = parseJsonlResults(content);\n const sourceIndexRecords = parseIndexArtifactEntries(content);\n\n if (results.length === 0) {\n throw new Error(`No results found in ${sourceFile}`);\n }\n\n await writeArtifactsFromResults(results, outputDir, {\n evalFile: sourceFile,\n runId: deriveExportRunId(sourceFile),\n duplicatePolicy: options?.duplicatePolicy ?? 'update',\n additionalArtifacts: createExportBundleArtifactsWriter({\n outputDir,\n sourceBaseDir: runRootFromIndexPath(sourceFile),\n sourceRecordsByResult: buildSourceRecordMap(results, sourceIndexRecords),\n }),\n });\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────────\n\n/**\n * Derive the default output directory from a run manifest path.\n */\nexport function deriveOutputDir(cwd: string, sourceFile: string): string {\n if (!isRunManifestPath(sourceFile)) {\n throw new Error(`Expected a run manifest named ${RESULT_INDEX_FILENAME}: ${sourceFile}`);\n }\n\n const runDir = runRootFromIndexPath(sourceFile);\n const segments = path.normalize(runDir).split(path.sep).filter(Boolean);\n const resultsIndex = segments.lastIndexOf('results');\n if (resultsIndex >= 0 && resultsIndex < segments.length - 2) {\n const runSegments = segments.slice(resultsIndex + 1);\n if (!isReservedResultsNamespace(runSegments[0])) {\n return path.join(cwd, '.agentv', 'results', 'export', ...runSegments);\n }\n }\n\n const parentDir = path.basename(runDir);\n if (parentDir.startsWith('eval_')) {\n return path.join(cwd, '.agentv', 'results', 'export', parentDir.slice(5));\n }\n return path.join(cwd, '.agentv', 'results', 'export', parentDir);\n}\n\nexport function deriveExportRunId(sourceFile: string): string {\n if (isRunManifestPath(sourceFile)) {\n return path.basename(runRootFromIndexPath(sourceFile));\n }\n return path.basename(sourceFile, path.extname(sourceFile));\n}\n\nfunction runRootFromIndexPath(sourceFile: string): string {\n const indexDir = path.dirname(sourceFile);\n if (path.basename(indexDir) === RUN_INTERNAL_DIRNAME) {\n return path.dirname(indexDir);\n }\n return indexDir;\n}\n\nexport async function loadExportSource(\n source: string | undefined,\n cwd: string,\n): Promise<{\n sourceFile: string;\n results: readonly EvaluationResult[];\n indexRecords?: readonly IndexArtifactEntry[];\n}> {\n const { sourceFile } = await resolveSourceFile(source, cwd);\n const { results } = await loadSharedResults(source, cwd);\n const indexRecords = isRunManifestPath(sourceFile)\n ? readIndexArtifactEntries(sourceFile)\n : undefined;\n return { sourceFile, results, indexRecords };\n}\n\nfunction parseIndexArtifactEntries(content: string): IndexArtifactEntry[] {\n return content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => JSON.parse(line) as IndexArtifactEntry);\n}\n\nfunction readIndexArtifactEntries(indexPath: string): IndexArtifactEntry[] {\n return parseIndexArtifactEntries(readFileSync(indexPath, 'utf8'));\n}\n\nfunction buildSourceRecordMap(\n results: readonly EvaluationResult[],\n sourceRecords: readonly IndexArtifactEntry[],\n): ReadonlyMap<EvaluationResult, IndexArtifactEntry> {\n return new Map(\n results.flatMap((result, index) => {\n const sourceRecord = sourceRecords[index];\n return sourceRecord ? [[result, sourceRecord] as const] : [];\n }),\n );\n}\n\nfunction isSafeRelativePath(relativePath: string | undefined): relativePath is string {\n return (\n typeof relativePath === 'string' &&\n relativePath.trim().length > 0 &&\n !path.isAbsolute(relativePath) &&\n !relativePath.split(/[\\\\/]+/).includes('..')\n );\n}\n\nfunction toRelativeArtifactPath(outputDir: string, filePath: string): string {\n return path.relative(outputDir, filePath).split(path.sep).join('/');\n}\n\nfunction hasCopiedSubdir(testBundleDir: string, dirname: string): boolean {\n return existsSync(path.join(testBundleDir, dirname));\n}\n\nfunction createExportBundleArtifactsWriter(options: {\n readonly outputDir: string;\n readonly sourceBaseDir: string;\n readonly sourceRecordsByResult: ReadonlyMap<EvaluationResult, IndexArtifactEntry>;\n}): AdditionalResultArtifactsWriter | undefined {\n if (options.sourceRecordsByResult.size === 0) {\n return undefined;\n }\n\n return async ({ result, testDir }): Promise<AdditionalResultIndexFields | undefined> => {\n const sourceRecord = options.sourceRecordsByResult.get(result);\n const sourceBundleDir = sourceRecord?.test_dir ?? sourceRecord?.task_dir;\n if (!isSafeRelativePath(sourceBundleDir)) {\n return undefined;\n }\n\n const sourceBundlePath = path.join(options.sourceBaseDir, sourceBundleDir);\n const testBundlePath = path.join(testDir, 'test');\n if (existsSync(sourceBundlePath)) {\n cpSync(sourceBundlePath, testBundlePath, { recursive: true, force: true });\n }\n\n return {\n test_dir: toRelativeArtifactPath(options.outputDir, testBundlePath),\n eval_path: toRelativeArtifactPath(options.outputDir, path.join(testBundlePath, 'EVAL.yaml')),\n providers_path: toRelativeArtifactPath(\n options.outputDir,\n path.join(testBundlePath, 'providers.yaml'),\n ),\n ...(sourceRecord?.files_path || hasCopiedSubdir(testBundlePath, 'files')\n ? {\n files_path: toRelativeArtifactPath(\n options.outputDir,\n path.join(testBundlePath, 'files'),\n ),\n }\n : {}),\n ...(sourceRecord?.graders_path || hasCopiedSubdir(testBundlePath, 'graders')\n ? {\n graders_path: toRelativeArtifactPath(\n options.outputDir,\n path.join(testBundlePath, 'graders'),\n ),\n }\n : {}),\n };\n };\n}\n\nexport function buildProjectionBundleFromExportedIndex(options: {\n readonly sourceFile: string;\n readonly outputDir: string;\n readonly cwd?: string;\n readonly includeRawContent?: boolean;\n readonly duplicatePolicy?: ExportDuplicatePolicy;\n}): ProjectionBundle {\n const indexPath = path.join(options.outputDir, RUN_INTERNAL_DIRNAME, RESULT_INDEX_FILENAME);\n const indexRecords = readIndexArtifactEntries(indexPath);\n const emittedResults = loadManifestResults(indexPath);\n\n return buildProjectionBundle(emittedResults, {\n sourceFile: options.sourceFile,\n runId: deriveExportRunId(options.sourceFile),\n cwd: options.cwd,\n duplicatePolicy: options.duplicatePolicy,\n includeRawContent: options.includeRawContent,\n artifactRefStatus: 'emitted',\n indexRecords,\n });\n}\n\n// ── CLI command ──────────────────────────────────────────────────────────\n\nexport const resultsExportCommand = command({\n name: 'export',\n description: 'Export a run workspace or run manifest into a per-test directory structure',\n args: {\n source: positional({\n type: optional(string),\n displayName: 'source',\n description:\n 'Run workspace directory or run manifest to export (defaults to most recent in .agentv/results/)',\n }),\n out: option({\n type: optional(string),\n long: 'out',\n short: 'o',\n description: 'Output directory (defaults to .agentv/results/export/<run-timestamp>/)',\n }),\n dir: option({\n type: optional(string),\n long: 'dir',\n short: 'd',\n description: 'Working directory (default: current directory)',\n }),\n duplicatePolicy: option({\n type: optional(oneOf(['skip', 'update', 'error'])),\n long: 'duplicate-policy',\n description:\n 'How to handle duplicate projection identities in the output: update (default), skip, or error',\n }),\n projectionBundle: flag({\n long: 'projection-bundle',\n description:\n 'Write a local vendor-neutral projection_bundle.json for non-Phoenix adapters; no service calls',\n }),\n dryRun: flag({\n long: 'dry-run',\n description: 'Print deterministic projection bundle JSON without writing export artifacts',\n }),\n includeRawContent: flag({\n long: 'include-raw-content',\n description:\n 'Include raw prompt, output, and tool payload content in the projection bundle (off by default)',\n }),\n },\n handler: async ({\n source,\n out,\n dir,\n duplicatePolicy,\n projectionBundle,\n dryRun,\n includeRawContent,\n }) => {\n const cwd = dir ?? process.cwd();\n const policy = (duplicatePolicy ?? 'update') as ExportDuplicatePolicy;\n const shouldWriteProjectionBundle = projectionBundle;\n const shouldDryRun = dryRun;\n const shouldIncludeRawContent = includeRawContent;\n\n try {\n const { sourceFile, results, indexRecords } = await loadExportSource(source, cwd);\n\n const outputDir = out\n ? path.isAbsolute(out)\n ? out\n : path.resolve(cwd, out)\n : deriveOutputDir(cwd, sourceFile);\n\n const buildBundle = () =>\n buildProjectionBundle(results, {\n sourceFile,\n runId: deriveExportRunId(sourceFile),\n cwd,\n duplicatePolicy: policy,\n includeRawContent: shouldIncludeRawContent,\n indexRecords,\n });\n\n if (shouldDryRun) {\n process.stdout.write(serializeProjectionBundle(buildBundle()));\n return;\n }\n\n await writeArtifactsFromResults(results, outputDir, {\n evalFile: sourceFile,\n runId: deriveExportRunId(sourceFile),\n duplicatePolicy: policy,\n additionalArtifacts: createExportBundleArtifactsWriter({\n outputDir,\n sourceBaseDir: runRootFromIndexPath(sourceFile),\n sourceRecordsByResult: buildSourceRecordMap(results, indexRecords ?? []),\n }),\n });\n\n const bundlePath = shouldWriteProjectionBundle\n ? await writeProjectionBundle(\n buildProjectionBundleFromExportedIndex({\n sourceFile,\n outputDir,\n cwd,\n duplicatePolicy: policy,\n includeRawContent: shouldIncludeRawContent,\n }),\n outputDir,\n )\n : undefined;\n\n // Report exported test IDs\n console.log(`Exported ${results.length} test(s) to ${outputDir}`);\n if (bundlePath) {\n console.log(`Projection bundle written to ${bundlePath}`);\n }\n for (const result of results) {\n console.log(` ${result.testId ?? 'unknown'}`);\n }\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n },\n});\n","/**\n * Vendor-neutral projection bundle for completed AgentV runs.\n *\n * This file builds a deterministic, local JSON contract that adapter workers\n * can consume without calling vendor SDKs. The bundle keeps AgentV artifacts as\n * the source of truth, includes metadata-only OpenInference-shaped spans by\n * default, and requires explicit opt-in before raw prompt/output/tool payloads\n * are copied into the bundle.\n */\n\nimport { createHash } from 'node:crypto';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport {\n type EvaluationResult,\n type ExportDuplicatePolicy,\n type IndexArtifactEntry,\n type ProjectionIdentityWire,\n type TraceEnvelopeCaptureWire,\n type TraceEnvelopeConversionWarningWire,\n type TraceEnvelopeScoreWire,\n type TraceEnvelopeWire,\n buildResultIndexArtifact,\n buildTraceEnvelopeFromEvaluationResult,\n toTraceEnvelopeWire,\n} from '@agentv/core';\n\nexport const PROJECTION_BUNDLE_FILENAME = 'projection_bundle.json';\nexport const PROJECTION_BUNDLE_SCHEMA_VERSION = 'agentv.projection_bundle.v1';\n\ntype JsonRecord = Record<string, unknown>;\n\nexport interface ProjectionBundle {\n readonly schema_version: typeof PROJECTION_BUNDLE_SCHEMA_VERSION;\n readonly bundle_id: string;\n readonly created_at: string;\n readonly source: {\n readonly kind: 'agentv_run';\n readonly path: string;\n readonly run_id: string;\n readonly result_count: number;\n };\n readonly content_policy: {\n readonly raw_content: 'excluded' | 'included';\n readonly raw_content_opt_in: boolean;\n readonly default_capture: 'metadata' | 'full';\n readonly backend_anonymizer_boundary: 'adapter';\n };\n readonly capture_summary: TraceEnvelopeCaptureWire;\n readonly entries: readonly ProjectionBundleEntry[];\n readonly conversion_warnings?: readonly TraceEnvelopeConversionWarningWire[];\n}\n\nexport interface ProjectionBundleEntry {\n readonly projection_id: string;\n readonly projection_identity: ProjectionIdentityWire;\n readonly eval: TraceEnvelopeWire['eval'];\n readonly artifact_refs: ProjectionBundleArtifactRefs;\n readonly trace: {\n readonly format: TraceEnvelopeWire['trace']['format'];\n readonly trace_id: string;\n readonly root_span_id: string;\n readonly span_count: number;\n };\n readonly trace_envelope: TraceEnvelopeWire;\n readonly feedback: {\n readonly source: 'agentv_grading_artifacts';\n readonly result_score: number;\n readonly execution_status?: string;\n readonly grading_path?: string;\n readonly metrics_path?: string;\n readonly assertion_count: number;\n readonly scores?: readonly TraceEnvelopeScoreWire[];\n };\n readonly capture: TraceEnvelopeCaptureWire;\n readonly conversion_warnings?: readonly TraceEnvelopeConversionWarningWire[];\n readonly raw_content?: {\n readonly input?: unknown;\n readonly output?: string;\n readonly trace_messages?: unknown;\n };\n}\n\nexport type ProjectionBundleArtifactRefs = Partial<\n Pick<\n IndexArtifactEntry,\n | 'result_dir'\n | 'summary_path'\n | 'grading_path'\n | 'metrics_path'\n | 'input_path'\n | 'output_path'\n | 'answer_path'\n | 'transcript_path'\n | 'transcript_raw_path'\n | 'metrics_path'\n | 'test_dir'\n | 'task_dir'\n | 'eval_path'\n | 'providers_path'\n | 'files_path'\n | 'graders_path'\n >\n> & {\n readonly status: 'planned_export' | 'emitted';\n};\n\nexport interface BuildProjectionBundleOptions {\n readonly sourceFile: string;\n readonly runId: string;\n readonly cwd?: string;\n readonly includeRawContent?: boolean;\n readonly duplicatePolicy?: ExportDuplicatePolicy;\n readonly artifactRefStatus?: ProjectionBundleArtifactRefs['status'];\n readonly indexRecords?: readonly IndexArtifactEntry[];\n}\n\nfunction dropUndefined<T extends JsonRecord>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entryValue]) => entryValue !== undefined),\n ) as T;\n}\n\nfunction toPortablePath(filePath: string, cwd?: string): string {\n const absolutePath = path.resolve(filePath);\n const absoluteCwd = path.resolve(cwd ?? process.cwd());\n const relative = path.relative(absoluteCwd, absolutePath);\n const portable =\n relative && !relative.startsWith('..') && !path.isAbsolute(relative) ? relative : absolutePath;\n return portable.split(path.sep).join('/');\n}\n\nfunction stableDate(value: string | undefined): Date {\n const parsed = value ? Date.parse(value) : Number.NaN;\n return Number.isFinite(parsed) ? new Date(parsed) : new Date(0);\n}\n\nfunction bundleCreatedAt(results: readonly EvaluationResult[]): string {\n const timestamps = results\n .map((result) => stableDate(result.timestamp).toISOString())\n .sort((a, b) => a.localeCompare(b));\n return timestamps[0] ?? new Date(0).toISOString();\n}\n\nfunction shortHash(parts: readonly string[], length = 20): string {\n return createHash('sha256').update(parts.join('\\n')).digest('hex').slice(0, length);\n}\n\nfunction artifactRefs(\n indexEntry: IndexArtifactEntry,\n options: {\n readonly includeRawContent: boolean;\n readonly status: ProjectionBundleArtifactRefs['status'];\n },\n): ProjectionBundleArtifactRefs {\n const metadataRefs = dropUndefined({\n status: options.status,\n metrics_path: indexEntry.metrics_path,\n });\n\n if (!options.includeRawContent) {\n return metadataRefs;\n }\n\n return dropUndefined({\n ...metadataRefs,\n result_dir: indexEntry.result_dir,\n summary_path: indexEntry.summary_path,\n grading_path: indexEntry.grading_path,\n input_path: indexEntry.input_path,\n output_path: indexEntry.output_path,\n answer_path: indexEntry.answer_path,\n transcript_path: indexEntry.transcript_path,\n transcript_raw_path: indexEntry.transcript_raw_path,\n metrics_path: indexEntry.metrics_path,\n test_dir: indexEntry.test_dir,\n task_dir: indexEntry.task_dir,\n eval_path: indexEntry.eval_path,\n providers_path: indexEntry.providers_path,\n files_path: indexEntry.files_path,\n graders_path: indexEntry.graders_path,\n });\n}\n\nfunction removeTranscriptMessageMetadata(envelope: TraceEnvelopeWire): TraceEnvelopeWire {\n return {\n ...envelope,\n trace: {\n ...envelope.trace,\n spans: envelope.trace.spans.map((span) => ({\n ...span,\n events: span.events?.map((event) => {\n const transcriptMessage = event.attributes?.['agentv.transcript.message'];\n if (\n !transcriptMessage ||\n typeof transcriptMessage !== 'object' ||\n Array.isArray(transcriptMessage)\n ) {\n return event;\n }\n const { metadata: _metadata, ...safeMessage } = transcriptMessage as JsonRecord;\n return {\n ...event,\n attributes: {\n ...event.attributes,\n 'agentv.transcript.message': safeMessage,\n },\n };\n }),\n })),\n },\n };\n}\n\nfunction safeEnvelope(\n envelope: TraceEnvelopeWire,\n options: { includeRawContent: boolean },\n): TraceEnvelopeWire {\n if (options.includeRawContent) {\n return envelope;\n }\n\n const withoutRawEvidence = removeTranscriptMessageMetadata({\n ...envelope,\n source: {\n ...envelope.source,\n metadata: undefined,\n },\n artifacts: undefined,\n scores: envelope.scores?.map(({ evidence: _evidence, ...score }) => score),\n });\n\n return JSON.parse(JSON.stringify(withoutRawEvidence)) as TraceEnvelopeWire;\n}\n\nfunction safeScores(\n scores: readonly TraceEnvelopeScoreWire[] | undefined,\n options: { includeRawContent: boolean },\n): readonly TraceEnvelopeScoreWire[] | undefined {\n if (!scores) {\n return undefined;\n }\n return options.includeRawContent\n ? scores\n : scores.map(({ evidence: _evidence, ...score }) => score);\n}\n\nfunction captureOptions(includeRawContent: boolean) {\n return includeRawContent\n ? { content: 'full' as const, redactionLevel: 'none' as const, redactedFields: [] }\n : undefined;\n}\n\nfunction rawContent(result: EvaluationResult): ProjectionBundleEntry['raw_content'] {\n return dropUndefined({\n input: result.input,\n output: result.output,\n trace_messages: result.trace.messages,\n });\n}\n\nfunction buildEntry(\n result: EvaluationResult,\n options: BuildProjectionBundleOptions,\n indexRecord?: IndexArtifactEntry,\n): ProjectionBundleEntry {\n const includeRawContent = options.includeRawContent ?? false;\n const sourcePath = toPortablePath(options.sourceFile, options.cwd);\n const envelope = buildTraceEnvelopeFromEvaluationResult(result, {\n evalPath: sourcePath,\n runId: options.runId,\n source: { kind: 'agentv_run', path: sourcePath, format: 'agentv_result' },\n artifacts: {\n answer_path: result.output.length > 0 ? 'outputs/answer.md' : undefined,\n },\n duplicatePolicy: options.duplicatePolicy,\n capture: captureOptions(includeRawContent),\n now: () => stableDate(result.timestamp),\n });\n const projectionIdentity = envelope.projectionIdentity;\n if (!projectionIdentity) {\n throw new Error(`Result ${result.testId ?? 'unknown'} is missing projection identity`);\n }\n\n const indexEntry =\n indexRecord ??\n buildResultIndexArtifact(result, undefined, {\n projectionIdentity,\n duplicatePolicy: options.duplicatePolicy,\n });\n const refs = artifactRefs(indexEntry, {\n includeRawContent,\n status: options.artifactRefStatus ?? 'planned_export',\n });\n const safeEnvelopeWire = safeEnvelope(toTraceEnvelopeWire(envelope), { includeRawContent });\n const projectionIdentityWire =\n indexEntry.projection_identity ?? safeEnvelopeWire.projection_identity;\n if (!projectionIdentityWire) {\n throw new Error(`Result ${result.testId ?? 'unknown'} is missing projection identity`);\n }\n const envelopeWire = {\n ...safeEnvelopeWire,\n projection_identity: projectionIdentityWire,\n };\n const scores = safeScores(envelopeWire.scores, { includeRawContent });\n\n const feedback: ProjectionBundleEntry['feedback'] = dropUndefined({\n source: 'agentv_grading_artifacts',\n result_score: result.score,\n execution_status: result.executionStatus,\n grading_path: refs.grading_path,\n metrics_path: refs.metrics_path,\n assertion_count: result.assertions?.length ?? 0,\n scores,\n });\n\n return {\n projection_id: projectionIdentity.id,\n projection_identity: projectionIdentityWire,\n eval: envelopeWire.eval,\n artifact_refs: refs,\n trace: dropUndefined({\n format: envelopeWire.trace.format,\n trace_id: envelopeWire.trace.trace_id,\n root_span_id: envelopeWire.trace.root_span_id,\n span_count: envelopeWire.trace.spans.length,\n }),\n trace_envelope: envelopeWire,\n feedback,\n capture: envelopeWire.capture,\n ...(envelopeWire.conversion_warnings\n ? { conversion_warnings: envelopeWire.conversion_warnings }\n : {}),\n ...(includeRawContent ? { raw_content: rawContent(result) } : {}),\n };\n}\n\nexport function buildProjectionBundle(\n results: readonly EvaluationResult[],\n options: BuildProjectionBundleOptions,\n): ProjectionBundle {\n if (results.length === 0) {\n throw new Error(`No results found in ${options.sourceFile}`);\n }\n\n const entries = results.map((result, index) =>\n buildEntry(result, options, options.indexRecords?.[index]),\n );\n const includeRawContent = options.includeRawContent ?? false;\n const artifactRefStatus = options.artifactRefStatus ?? 'planned_export';\n const conversionWarnings = entries.flatMap((entry) => entry.conversion_warnings ?? []);\n const bundleId = `projection-bundle-${shortHash([\n PROJECTION_BUNDLE_SCHEMA_VERSION,\n toPortablePath(options.sourceFile, options.cwd),\n options.runId,\n artifactRefStatus,\n includeRawContent ? 'raw' : 'metadata',\n ...entries.map((entry) => entry.projection_id),\n ])}`;\n\n return {\n schema_version: PROJECTION_BUNDLE_SCHEMA_VERSION,\n bundle_id: bundleId,\n created_at: bundleCreatedAt(results),\n source: {\n kind: 'agentv_run',\n path: toPortablePath(options.sourceFile, options.cwd),\n run_id: options.runId,\n result_count: results.length,\n },\n content_policy: {\n raw_content: includeRawContent ? 'included' : 'excluded',\n raw_content_opt_in: includeRawContent,\n default_capture: includeRawContent ? 'full' : 'metadata',\n backend_anonymizer_boundary: 'adapter',\n },\n capture_summary: entries[0]?.capture ?? {\n content: includeRawContent ? 'full' : 'metadata',\n redaction_level: includeRawContent ? 'none' : 'partial',\n },\n entries,\n ...(conversionWarnings.length > 0 ? { conversion_warnings: conversionWarnings } : {}),\n };\n}\n\nexport function serializeProjectionBundle(bundle: ProjectionBundle): string {\n return `${JSON.stringify(bundle, null, 2)}\\n`;\n}\n\nexport async function writeProjectionBundle(\n bundle: ProjectionBundle,\n outputDir: string,\n): Promise<string> {\n const bundlePath = path.join(outputDir, PROJECTION_BUNDLE_FILENAME);\n await mkdir(outputDir, { recursive: true });\n await writeFile(bundlePath, serializeProjectionBundle(bundle), 'utf8');\n return bundlePath;\n}\n","/**\n * Shared utilities for `agentv results` subcommands.\n *\n * Provides:\n * - resolveSourceFile() — find an index manifest from explicit path or auto-discover latest\n * - sourceArg — cmd-ts positional for optional result source path\n *\n * How to extend:\n * - To add a new subcommand, import loadResults() and sourceArg from this module.\n */\n\nimport { existsSync } from 'node:fs';\nimport { optional, positional, string } from 'cmd-ts';\n\nimport type { EvaluationResult } from '@agentv/core';\nimport { resolveRunManifestPath } from '../eval/result-layout.js';\nimport { loadRunCache, resolveRunCacheFile } from '../eval/run-cache.js';\nimport { listResultFiles } from '../inspect/utils.js';\nimport { loadManifestResults, resolveResultSourcePath } from './manifest.js';\n\n/** cmd-ts positional for optional result source file or workspace directory. */\nexport const sourceArg = positional({\n type: optional(string),\n displayName: 'source',\n description:\n 'Run workspace directory or run manifest (defaults to most recent in .agentv/results/)',\n});\n\n/**\n * Resolve an index/results source path from explicit arg or auto-discovery.\n */\nexport async function resolveSourceFile(\n source: string | undefined,\n cwd: string,\n): Promise<{ sourceFile: string }> {\n let sourceFile: string;\n\n if (source) {\n sourceFile = resolveResultSourcePath(source, cwd);\n if (!existsSync(sourceFile)) {\n console.error(`Error: File not found: ${sourceFile}`);\n process.exit(1);\n }\n sourceFile = resolveRunManifestPath(sourceFile);\n } else {\n const cache = await loadRunCache(cwd);\n const cachedFile = cache ? resolveRunCacheFile(cache) : '';\n if (cachedFile && existsSync(cachedFile)) {\n sourceFile = cachedFile;\n } else {\n const metas = listResultFiles(cwd, 1);\n if (metas.length === 0) {\n console.error('Error: No run workspaces found in .agentv/results/');\n console.error('Run an evaluation first: agentv eval <eval-file>');\n process.exit(1);\n }\n sourceFile = metas[0].path;\n }\n }\n\n return { sourceFile };\n}\n\n/**\n * Load and parse eval results from a run workspace or index manifest.\n */\nexport async function loadResults(\n source: string | undefined,\n cwd: string,\n): Promise<{ results: EvaluationResult[]; sourceFile: string }> {\n const { sourceFile } = await resolveSourceFile(source, cwd);\n const results = loadManifestResults(sourceFile);\n\n if (results.length === 0) {\n console.error(`No results found in ${sourceFile}`);\n process.exit(1);\n }\n\n return { results, sourceFile };\n}\n","/**\n * `agentv results failures` — show only failed tests with assertion evidence.\n *\n * Filters results to score < 1.0 and outputs JSON with each failed test's\n * failed assertions with evidence text. Passing tests are omitted entirely.\n *\n * How to extend:\n * - To add new fields to failure output, update formatFailures and FailureEntry.\n */\n\nimport type { EvaluationResult } from '@agentv/core';\nimport { command, option, optional, string } from 'cmd-ts';\nimport { loadResults, sourceArg } from './shared.js';\n\n// ── Formatting ───────────────────────────────────────────────────────────\n\nexport interface FailureEntry {\n test_id: string;\n score: number;\n assertions: { text: string; passed: boolean; evidence?: string }[];\n}\n\nexport function formatFailures(results: EvaluationResult[]): FailureEntry[] {\n return results\n .filter((r) => r.score < 1.0)\n .map((r) => {\n let assertions = (r.assertions ?? []).map((a) => ({\n text: a.text,\n passed: a.passed,\n evidence: a.evidence,\n }));\n\n // Fall back to per-grader assertions\n if (assertions.length === 0 && r.scores) {\n assertions = r.scores.flatMap((s) =>\n (s.assertions ?? []).map((a) => ({\n text: a.text,\n passed: a.passed,\n evidence: a.evidence,\n })),\n );\n }\n\n return { test_id: r.testId, score: r.score, assertions } satisfies FailureEntry;\n });\n}\n\n// ── CLI command ──────────────────────────────────────────────────────────\n\nexport const resultsFailuresCommand = command({\n name: 'failures',\n description: 'Show only failed tests with assertion evidence',\n args: {\n source: sourceArg,\n dir: option({\n type: optional(string),\n long: 'dir',\n short: 'd',\n description: 'Working directory (default: current directory)',\n }),\n },\n handler: async ({ source, dir }) => {\n const cwd = dir ?? process.cwd();\n try {\n const { results } = await loadResults(source, cwd);\n console.log(JSON.stringify(formatFailures(results), null, 2));\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n },\n});\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { command, option, optional, string } from 'cmd-ts';\n\nimport type { EvaluationResult, RunRuntimeSourceMetadata } from '@agentv/core';\n\nimport { RUN_INTERNAL_DIRNAME } from '../eval/result-layout.js';\nimport { loadManifestResults, parseResultManifest, resolveResultSourcePath } from './manifest.js';\nimport { RESULTS_REPORT_TEMPLATE } from './report-template.js';\nimport { resolveSourceFile, sourceArg } from './shared.js';\n\nconst DEFAULT_REPORT_SUBTITLE =\n 'Dashboard-themed HTML generated from an existing AgentV results workspace.';\n\ninterface ReportManifestRecord {\n readonly eval_file?: string;\n readonly experiment?: string;\n readonly runtime_source?: RunRuntimeSourceMetadata;\n}\n\ninterface RunSummaryReportMetadata {\n readonly evalFile?: string;\n readonly experiment?: string;\n readonly runtimeSource?: RunRuntimeSourceMetadata;\n}\n\nfunction normalizeEvalFileLabel(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n if (!trimmed) {\n return undefined;\n }\n\n return path\n .basename(trimmed)\n .replace(/\\.results\\.jsonl$/i, '')\n .replace(/\\.eval\\.ya?ml$/i, '')\n .replace(/\\.ya?ml$/i, '')\n .replace(/\\.jsonl$/i, '');\n}\n\nfunction readSummaryEvalFile(sourceFile: string): string | undefined {\n return readSummaryReportMetadata(sourceFile).evalFile;\n}\n\nfunction readSummaryReportMetadata(sourceFile: string): RunSummaryReportMetadata {\n const sourceDir = path.dirname(sourceFile);\n const runDir =\n path.basename(sourceDir) === RUN_INTERNAL_DIRNAME ? path.dirname(sourceDir) : sourceDir;\n const summaryPath = path.join(runDir, 'summary.json');\n if (!existsSync(summaryPath)) {\n return {};\n }\n\n try {\n const summary = JSON.parse(readFileSync(summaryPath, 'utf8')) as {\n metadata?: {\n eval_file?: string;\n experiment?: string;\n runtime_source?: RunRuntimeSourceMetadata;\n };\n };\n return {\n evalFile: normalizeEvalFileLabel(summary.metadata?.eval_file),\n ...(summary.metadata?.experiment && { experiment: summary.metadata.experiment }),\n ...(summary.metadata?.runtime_source && { runtimeSource: summary.metadata.runtime_source }),\n };\n } catch {\n return {};\n }\n}\n\nexport function deriveReportPath(sourceFile: string): string {\n const sourceDir = path.dirname(sourceFile);\n const runDir =\n path.basename(sourceDir) === RUN_INTERNAL_DIRNAME ? path.dirname(sourceDir) : sourceDir;\n return path.join(runDir, 'report.html');\n}\n\nfunction serializeReportResult(\n result: EvaluationResult,\n sourceFile: string,\n manifestRecord?: ReportManifestRecord,\n summaryMetadata?: RunSummaryReportMetadata,\n): Record<string, unknown> {\n const runtimeSource = manifestRecord?.runtime_source ?? summaryMetadata?.runtimeSource;\n const resultExperiment = (result as EvaluationResult & { experiment?: string }).experiment;\n const experimentNamespace =\n manifestRecord?.experiment ?? summaryMetadata?.experiment ?? resultExperiment;\n const fallbackEvalFile =\n normalizeEvalFileLabel(manifestRecord?.eval_file) ??\n summaryMetadata?.evalFile ??\n normalizeEvalFileLabel(result.suite) ??\n path.basename(path.dirname(sourceFile));\n\n return {\n timestamp: result.timestamp,\n test_id: result.testId,\n suite: result.suite,\n category: result.category,\n target: result.target,\n score: result.score,\n scores: result.scores,\n execution_status: result.executionStatus,\n error: result.error,\n duration_ms: result.durationMs,\n token_usage: result.tokenUsage,\n cost_usd: result.costUsd,\n input: result.input,\n output: result.output,\n assertions: result.assertions,\n experiment: experimentNamespace,\n runtime_source: runtimeSource,\n runtime_source_label: formatRuntimeSourceLabel(runtimeSource),\n runtime_config_source_label: formatRuntimeConfigSourceLabel(runtimeSource?.config_source),\n eval_file: fallbackEvalFile,\n };\n}\n\nfunction formatRuntimeConfigSourceLabel(\n source: RunRuntimeSourceMetadata['config_source'] | undefined,\n): string {\n switch (source) {\n case 'inline_experiment':\n return 'Inline experiment config';\n case 'cli_flags':\n return 'CLI runtime flags';\n case 'mixed':\n return 'Mixed runtime config';\n case 'defaults':\n return 'Default runtime config';\n default:\n return '';\n }\n}\n\nfunction formatRuntimeSourceLabel(runtimeSource: RunRuntimeSourceMetadata | undefined): string {\n if (!runtimeSource) {\n return '';\n }\n return formatRuntimeConfigSourceLabel(runtimeSource.config_source);\n}\n\nfunction uniqueStrings(values: readonly (string | undefined)[]): string[] {\n return [\n ...new Set(\n values.map((value) => value?.trim()).filter((value): value is string => Boolean(value)),\n ),\n ].sort();\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nfunction formatReportHeaderContext(rows: readonly Record<string, unknown>[]): string {\n const experiments = uniqueStrings(\n rows.map((row) => (typeof row.experiment === 'string' ? row.experiment : undefined)),\n );\n const runtimeSources = uniqueStrings(\n rows.map((row) =>\n typeof row.runtime_source_label === 'string' ? row.runtime_source_label : undefined,\n ),\n );\n const parts = [\n experiments.length === 1\n ? `Experiment namespace: ${experiments[0]}`\n : experiments.length > 1\n ? `Experiment namespaces: ${experiments.join(', ')}`\n : undefined,\n runtimeSources.length === 1\n ? `Runtime source: ${runtimeSources[0]}`\n : runtimeSources.length > 1\n ? `Runtime sources: ${runtimeSources.join(', ')}`\n : undefined,\n ].filter((part): part is string => Boolean(part));\n\n return parts.length > 0 ? parts.join(' · ') : DEFAULT_REPORT_SUBTITLE;\n}\n\nexport async function loadReportSource(\n source: string | undefined,\n cwd: string,\n): Promise<{\n sourceFile: string;\n results: EvaluationResult[];\n records: readonly ReportManifestRecord[];\n summaryEvalFile?: string;\n summaryMetadata?: RunSummaryReportMetadata;\n}> {\n const { sourceFile } = await resolveSourceFile(source, cwd);\n const resolvedSourceFile = resolveResultSourcePath(sourceFile, cwd);\n const content = readFileSync(resolvedSourceFile, 'utf8');\n const records = parseResultManifest(content) as ReportManifestRecord[];\n const results = loadManifestResults(resolvedSourceFile);\n\n if (results.length === 0) {\n throw new Error(`No results found in ${resolvedSourceFile}`);\n }\n\n return {\n sourceFile: resolvedSourceFile,\n results,\n records,\n summaryEvalFile: readSummaryEvalFile(resolvedSourceFile),\n summaryMetadata: readSummaryReportMetadata(resolvedSourceFile),\n };\n}\n\nexport function renderResultsReport(\n results: readonly EvaluationResult[],\n sourceFile: string,\n records: readonly ReportManifestRecord[],\n summaryMetadata?: RunSummaryReportMetadata,\n): string {\n if (!RESULTS_REPORT_TEMPLATE.includes('__DATA_PLACEHOLDER__')) {\n throw new Error('Report template is missing __DATA_PLACEHOLDER__');\n }\n\n const rows = results.map((result, index) =>\n serializeReportResult(result, sourceFile, records[index], summaryMetadata),\n );\n const dataJson = JSON.stringify(rows).replace(/<\\//g, '<\\\\/');\n return RESULTS_REPORT_TEMPLATE.replace('__DATA_PLACEHOLDER__', () => dataJson).replace(\n DEFAULT_REPORT_SUBTITLE,\n escapeHtml(formatReportHeaderContext(rows)),\n );\n}\n\nexport async function writeResultsReport(\n source: string | undefined,\n outputPath: string | undefined,\n cwd: string,\n): Promise<{ sourceFile: string; outputPath: string; html: string }> {\n const { sourceFile, results, records, summaryMetadata } = await loadReportSource(source, cwd);\n const resolvedOutputPath = outputPath\n ? path.isAbsolute(outputPath)\n ? outputPath\n : path.resolve(cwd, outputPath)\n : deriveReportPath(sourceFile);\n const html = renderResultsReport(results, sourceFile, records, summaryMetadata);\n\n mkdirSync(path.dirname(resolvedOutputPath), { recursive: true });\n writeFileSync(resolvedOutputPath, html, 'utf8');\n\n const written = readFileSync(resolvedOutputPath, 'utf8');\n if (written.includes('__DATA_PLACEHOLDER__')) {\n throw new Error('Report placeholder substitution failed');\n }\n\n return { sourceFile, outputPath: resolvedOutputPath, html: written };\n}\n\nexport const resultsReportCommand = command({\n name: 'report',\n description: 'Generate a static HTML report from a run workspace or run manifest',\n args: {\n source: sourceArg,\n out: option({\n type: optional(string),\n long: 'out',\n short: 'o',\n description: 'Output HTML file (defaults to <run-dir>/report.html)',\n }),\n dir: option({\n type: optional(string),\n long: 'dir',\n short: 'd',\n description: 'Working directory (default: current directory)',\n }),\n },\n handler: async ({ source, out, dir }) => {\n const cwd = dir ?? process.cwd();\n\n try {\n const { sourceFile, outputPath } = await writeResultsReport(source, out, cwd);\n console.log(`Report written to ${outputPath}`);\n console.log(`Source: ${sourceFile}`);\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n },\n});\n","export const RESULTS_REPORT_TEMPLATE =\n \"<!DOCTYPE html>\\n<html lang=\\\"en\\\">\\n<head>\\n <meta charset=\\\"utf-8\\\">\\n <meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1\\\">\\n <title>AgentV Evaluation Report</title>\\n <style>\\n * { box-sizing: border-box; }\\n html, body { margin: 0; padding: 0; }\\n :root {\\n color-scheme: dark;\\n --canvas: #030712;\\n --surface: #111827;\\n --surface-muted: rgba(17, 24, 39, 0.5);\\n --surface-hover: rgba(17, 24, 39, 0.3);\\n --border: #1f2937;\\n --text: #d1d5db;\\n --text-muted: #9ca3af;\\n --text-subtle: #6b7280;\\n --heading: #ffffff;\\n --brand-middle: #d1d5db;\\n --accent: #22d3ee;\\n --accent-weak: rgba(8, 145, 178, 0.2);\\n --pass: #34d399;\\n --warn: #facc15;\\n --fail: #f87171;\\n --track: #1f2937;\\n --pill-gradient: linear-gradient(90deg, #60a5fa 0%, #2563eb 100%);\\n --font: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, \\\"Helvetica Neue\\\", Arial, sans-serif;\\n --radius-md: 6px;\\n --radius-lg: 8px;\\n }\\n\\n :root.light {\\n color-scheme: light;\\n --canvas: #f8fafc;\\n --surface: #ffffff;\\n --surface-muted: rgba(241, 245, 249, 0.8);\\n --surface-hover: rgba(241, 245, 249, 0.5);\\n --border: #e2e8f0;\\n --text: #1e293b;\\n --text-muted: #64748b;\\n --text-subtle: #94a3b8;\\n --heading: #0f172a;\\n --brand-middle: #64748b;\\n --accent: #0891b2;\\n --accent-weak: rgba(8, 145, 178, 0.1);\\n --pass: #16a34a;\\n --warn: #ca8a04;\\n --fail: #dc2626;\\n --track: #e2e8f0;\\n --pill-gradient: linear-gradient(90deg, #3b82f6 0%, #2563eb 100%);\\n }\\n\\n :root.light .chip {\\n border-color: rgba(8, 145, 178, 0.3);\\n background: rgba(8, 145, 178, 0.08);\\n color: #0891b2;\\n }\\n\\n :root.light .assertion-badge {\\n border-color: rgba(8, 145, 178, 0.3);\\n background: rgba(8, 145, 178, 0.08);\\n color: #0891b2;\\n }\\n\\n :root.light .pass-rate-label {\\n color: #ffffff;\\n }\\n\\n :root.light .group-header {\\n background: rgba(241, 245, 249, 0.8);\\n }\\n\\n :root.light .status-pill {\\n background: rgba(241, 245, 249, 0.8);\\n }\\n\\n :root.light .assertion-item {\\n background: rgba(241, 245, 249, 0.5);\\n border-color: var(--border);\\n }\\n\\n :root.light .detail-row td {\\n background: rgba(248, 250, 252, 0.8);\\n }\\n\\n body {\\n background: var(--canvas);\\n color: var(--text);\\n font-family: var(--font);\\n font-size: 14px;\\n line-height: 1.5;\\n }\\n\\n button, input, select {\\n font: inherit;\\n }\\n\\n .tabular,\\n .num,\\n .pass-rate-label,\\n .metric-value,\\n .count-label,\\n .table-num {\\n font-variant-numeric: tabular-nums;\\n }\\n\\n .shell {\\n min-height: 100vh;\\n }\\n\\n .header {\\n border-bottom: 1px solid var(--border);\\n background: var(--surface);\\n padding: 16px 24px;\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: 16px;\\n }\\n\\n .header-title-wrap {\\n display: flex;\\n flex-direction: column;\\n gap: 4px;\\n }\\n\\n .eyebrow {\\n color: var(--text-muted);\\n font-size: 12px;\\n letter-spacing: 0.08em;\\n text-transform: uppercase;\\n }\\n\\n .header-title {\\n color: var(--heading);\\n font-size: 24px;\\n font-weight: 600;\\n margin: 0;\\n }\\n\\n .brand-wordmark {\\n white-space: nowrap;\\n }\\n\\n .brand-letter {\\n color: var(--accent);\\n }\\n\\n .brand-middle {\\n color: var(--brand-middle);\\n }\\n\\n .header-subtitle {\\n color: var(--text-muted);\\n margin: 0;\\n }\\n\\n .header-meta {\\n display: flex;\\n flex-wrap: wrap;\\n justify-content: flex-end;\\n align-items: center;\\n gap: 8px;\\n }\\n\\n .chip {\\n border: 1px solid rgba(8, 145, 178, 0.45);\\n background: rgba(8, 145, 178, 0.16);\\n color: #67e8f9;\\n border-radius: var(--radius-md);\\n padding: 4px 8px;\\n font-size: 12px;\\n font-weight: 500;\\n }\\n\\n .tabs {\\n display: flex;\\n gap: 4px;\\n padding: 0 24px;\\n border-bottom: 1px solid var(--border);\\n background: var(--canvas);\\n }\\n\\n .tab {\\n background: transparent;\\n border: none;\\n border-bottom: 2px solid transparent;\\n color: var(--text-muted);\\n cursor: pointer;\\n padding: 12px 8px 10px;\\n transition: color 120ms ease, border-color 120ms ease;\\n }\\n\\n .tab:hover {\\n color: var(--text);\\n }\\n\\n .tab.active {\\n color: var(--accent);\\n border-bottom-color: var(--accent);\\n }\\n\\n .app {\\n padding: 24px;\\n display: flex;\\n flex-direction: column;\\n gap: 24px;\\n }\\n\\n .empty-state {\\n border: 1px solid var(--border);\\n border-radius: var(--radius-lg);\\n background: var(--surface);\\n padding: 32px;\\n text-align: center;\\n }\\n\\n .empty-state h2 {\\n margin: 0 0 8px;\\n color: var(--heading);\\n font-size: 18px;\\n font-weight: 500;\\n }\\n\\n .empty-state p {\\n margin: 0;\\n color: var(--text-muted);\\n }\\n\\n .stats-grid {\\n display: grid;\\n grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\\n gap: 12px;\\n }\\n\\n .stat-card {\\n border: 1px solid var(--border);\\n border-radius: var(--radius-lg);\\n background: var(--surface);\\n padding: 16px;\\n display: flex;\\n flex-direction: column;\\n gap: 6px;\\n min-height: 96px;\\n }\\n\\n .stat-label {\\n color: var(--text-muted);\\n font-size: 12px;\\n letter-spacing: 0.04em;\\n text-transform: uppercase;\\n }\\n\\n .stat-value {\\n color: var(--heading);\\n font-size: 28px;\\n font-weight: 600;\\n line-height: 1.1;\\n }\\n\\n .tone-pass .stat-value,\\n .text-pass { color: var(--pass); }\\n .tone-warn .stat-value,\\n .text-warn { color: var(--warn); }\\n .tone-fail .stat-value,\\n .text-fail { color: var(--fail); }\\n\\n .section {\\n display: flex;\\n flex-direction: column;\\n gap: 12px;\\n }\\n\\n .section-heading {\\n display: flex;\\n align-items: baseline;\\n justify-content: space-between;\\n gap: 12px;\\n flex-wrap: wrap;\\n }\\n\\n .section-heading h2 {\\n margin: 0;\\n color: var(--heading);\\n font-size: 20px;\\n font-weight: 600;\\n }\\n\\n .section-heading p {\\n margin: 0;\\n color: var(--text-muted);\\n }\\n\\n .table-wrap {\\n overflow-x: auto;\\n border: 1px solid var(--border);\\n border-radius: var(--radius-lg);\\n background: var(--surface);\\n }\\n\\n table {\\n width: 100%;\\n border-collapse: collapse;\\n font-size: 14px;\\n }\\n\\n thead {\\n border-bottom: 1px solid var(--border);\\n background: var(--surface-muted);\\n }\\n\\n th {\\n padding: 12px 16px;\\n text-align: left;\\n font-weight: 500;\\n color: var(--text-muted);\\n white-space: nowrap;\\n }\\n\\n td {\\n padding: 12px 16px;\\n border-top: 1px solid rgba(31, 41, 55, 0.5);\\n vertical-align: top;\\n }\\n\\n tbody tr {\\n transition: background-color 120ms ease;\\n }\\n\\n tbody tr:hover {\\n background: var(--surface-hover);\\n }\\n\\n .sortable {\\n cursor: pointer;\\n user-select: none;\\n }\\n\\n .sortable:hover {\\n color: var(--text);\\n }\\n\\n .table-num {\\n text-align: right;\\n color: var(--text);\\n white-space: nowrap;\\n }\\n\\n .table-muted {\\n color: var(--text-muted);\\n }\\n\\n .id-cell {\\n font-weight: 500;\\n color: var(--heading);\\n }\\n\\n .status-pill {\\n display: inline-flex;\\n align-items: center;\\n gap: 6px;\\n padding: 2px 8px;\\n border-radius: 999px;\\n border: 1px solid var(--border);\\n background: rgba(17, 24, 39, 0.6);\\n color: var(--text);\\n font-size: 12px;\\n white-space: nowrap;\\n }\\n\\n .status-dot {\\n width: 8px;\\n height: 8px;\\n border-radius: 999px;\\n background: var(--text-subtle);\\n }\\n\\n .status-pass .status-dot { background: var(--pass); }\\n .status-fail .status-dot { background: var(--fail); }\\n .status-error .status-dot { background: var(--warn); }\\n\\n .pass-rate-track {\\n width: 80px;\\n height: 20px;\\n overflow: hidden;\\n border-radius: 999px;\\n background: var(--track);\\n position: relative;\\n border: 1px solid rgba(31, 41, 55, 0.8);\\n }\\n\\n .pass-rate-fill {\\n position: absolute;\\n inset: 0 auto 0 0;\\n background: var(--pill-gradient);\\n border-radius: 999px;\\n }\\n\\n .pass-rate-label {\\n position: absolute;\\n inset: 0;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n font-size: 12px;\\n font-weight: 600;\\n color: #ffffff;\\n white-space: nowrap;\\n z-index: 1;\\n }\\n\\n .histogram {\\n border: 1px solid var(--border);\\n border-radius: var(--radius-lg);\\n background: var(--surface);\\n padding: 16px;\\n display: flex;\\n flex-direction: column;\\n gap: 10px;\\n }\\n\\n .hist-row {\\n display: grid;\\n grid-template-columns: 72px 1fr 40px;\\n gap: 12px;\\n align-items: center;\\n }\\n\\n .hist-label,\\n .hist-count {\\n color: var(--text-muted);\\n font-size: 12px;\\n }\\n\\n .hist-bar-track {\\n height: 16px;\\n border-radius: 999px;\\n background: var(--track);\\n overflow: hidden;\\n }\\n\\n .hist-bar-fill {\\n height: 100%;\\n border-radius: 999px;\\n background: var(--pill-gradient);\\n }\\n\\n .filter-bar {\\n display: flex;\\n flex-wrap: wrap;\\n gap: 8px;\\n align-items: center;\\n }\\n\\n .filter-input,\\n .filter-select {\\n border: 1px solid #374151;\\n border-radius: var(--radius-md);\\n background: var(--canvas);\\n color: var(--text);\\n padding: 8px 10px;\\n }\\n\\n .filter-input::placeholder {\\n color: var(--text-subtle);\\n }\\n\\n .filter-input:focus,\\n .filter-select:focus {\\n outline: none;\\n border-color: var(--accent);\\n box-shadow: 0 0 0 1px var(--accent);\\n }\\n\\n .filter-input {\\n min-width: 260px;\\n flex: 1 1 260px;\\n }\\n\\n .filter-count {\\n margin-left: auto;\\n color: var(--text-muted);\\n font-size: 12px;\\n }\\n\\n .group-list {\\n display: flex;\\n flex-direction: column;\\n gap: 16px;\\n }\\n\\n .group-card {\\n border: 1px solid var(--border);\\n border-radius: var(--radius-lg);\\n overflow: hidden;\\n background: var(--surface);\\n }\\n\\n .group-header {\\n padding: 16px;\\n border-bottom: 1px solid var(--border);\\n display: flex;\\n justify-content: space-between;\\n align-items: center;\\n gap: 12px;\\n flex-wrap: wrap;\\n background: rgba(17, 24, 39, 0.65);\\n }\\n\\n .group-title-wrap {\\n display: flex;\\n flex-direction: column;\\n gap: 4px;\\n }\\n\\n .group-title {\\n margin: 0;\\n color: var(--heading);\\n font-size: 18px;\\n font-weight: 600;\\n }\\n\\n .group-subtitle {\\n margin: 0;\\n color: var(--text-muted);\\n font-size: 13px;\\n }\\n\\n .group-metrics {\\n display: flex;\\n flex-wrap: wrap;\\n align-items: center;\\n gap: 10px 14px;\\n }\\n\\n .metric {\\n display: flex;\\n flex-direction: column;\\n gap: 2px;\\n }\\n\\n .metric-label {\\n color: var(--text-muted);\\n font-size: 12px;\\n }\\n\\n .metric-value {\\n color: var(--heading);\\n font-weight: 500;\\n }\\n\\n .test-row {\\n cursor: pointer;\\n }\\n\\n .expand-cell {\\n width: 40px;\\n color: var(--text-muted);\\n text-align: center;\\n }\\n\\n .detail-row td {\\n padding: 0;\\n background: rgba(3, 7, 18, 0.5);\\n }\\n\\n .detail-panel {\\n padding: 16px;\\n display: flex;\\n flex-direction: column;\\n gap: 16px;\\n }\\n\\n .detail-grid {\\n display: grid;\\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\\n gap: 16px;\\n }\\n\\n .detail-card,\\n .assertion-card,\\n .error-card {\\n border: 1px solid var(--border);\\n border-radius: var(--radius-lg);\\n background: var(--surface);\\n padding: 16px;\\n }\\n\\n .detail-card h4,\\n .assertion-card h4,\\n .error-card h4 {\\n margin: 0 0 10px;\\n color: var(--heading);\\n font-size: 14px;\\n font-weight: 500;\\n }\\n\\n pre {\\n margin: 0;\\n white-space: pre-wrap;\\n word-break: break-word;\\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\\n font-size: 12px;\\n color: var(--text);\\n max-height: 320px;\\n overflow: auto;\\n }\\n\\n .evaluator-table-wrap {\\n border: 1px solid var(--border);\\n border-radius: var(--radius-lg);\\n overflow-x: auto;\\n background: var(--surface);\\n }\\n\\n .evaluator-table-wrap th,\\n .evaluator-table-wrap td {\\n padding: 14px 20px;\\n }\\n\\n .assertion-grid {\\n display: grid;\\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\\n gap: 16px;\\n }\\n\\n .assertion-list {\\n list-style: none;\\n margin: 0;\\n padding: 0;\\n display: flex;\\n flex-direction: column;\\n gap: 10px;\\n }\\n\\n .assertion-item {\\n border: 1px solid rgba(31, 41, 55, 0.8);\\n border-radius: var(--radius-md);\\n background: rgba(3, 7, 18, 0.45);\\n padding: 10px 12px;\\n display: flex;\\n flex-direction: column;\\n gap: 8px;\\n }\\n\\n .assertion-topline {\\n display: flex;\\n align-items: center;\\n flex-wrap: wrap;\\n gap: 8px;\\n }\\n\\n .assertion-badge {\\n border: 1px solid rgba(8, 145, 178, 0.45);\\n background: rgba(8, 145, 178, 0.16);\\n color: #67e8f9;\\n border-radius: var(--radius-md);\\n padding: 2px 8px;\\n font-size: 12px;\\n font-weight: 500;\\n align-self: flex-start;\\n }\\n\\n .assertion-status {\\n font-size: 12px;\\n font-weight: 500;\\n }\\n\\n .assertion-text {\\n color: var(--text);\\n }\\n\\n .assertion-evidence {\\n color: var(--text-muted);\\n font-size: 12px;\\n white-space: pre-wrap;\\n word-break: break-word;\\n }\\n\\n .meta-row {\\n display: flex;\\n flex-wrap: wrap;\\n gap: 8px 16px;\\n color: var(--text-muted);\\n font-size: 12px;\\n border-top: 1px solid var(--border);\\n padding-top: 12px;\\n }\\n\\n .error-card {\\n border-color: rgba(248, 113, 113, 0.45);\\n background: rgba(127, 29, 29, 0.18);\\n }\\n\\n .error-card h4,\\n .error-card pre {\\n color: #fecaca;\\n }\\n\\n .muted {\\n color: var(--text-muted);\\n }\\n\\n .hidden {\\n display: none;\\n }\\n\\n .theme-toggle {\\n background: var(--surface);\\n border: 1px solid var(--border);\\n border-radius: var(--radius-md);\\n color: var(--text-muted);\\n cursor: pointer;\\n padding: 6px 10px;\\n font-size: 13px;\\n transition: color 120ms ease, border-color 120ms ease;\\n white-space: nowrap;\\n }\\n\\n .theme-toggle:hover {\\n color: var(--text);\\n border-color: var(--text-muted);\\n }\\n\\n .criteria-cell {\\n color: var(--text-muted);\\n font-size: 13px;\\n max-width: 320px;\\n }\\n\\n .io-toggle {\\n cursor: pointer;\\n user-select: none;\\n color: var(--text-muted);\\n font-size: 13px;\\n border: 1px solid var(--border);\\n border-radius: var(--radius-md);\\n background: var(--surface);\\n padding: 8px 12px;\\n display: inline-flex;\\n align-items: center;\\n gap: 6px;\\n }\\n\\n .io-toggle:hover {\\n color: var(--text);\\n }\\n\\n .io-toggle[open] > summary {\\n margin-bottom: 12px;\\n }\\n\\n .io-toggle > summary {\\n list-style: none;\\n }\\n\\n .io-toggle > summary::-webkit-details-marker {\\n display: none;\\n }\\n\\n @media (max-width: 900px) {\\n .header,\\n .group-header,\\n .section-heading {\\n align-items: flex-start;\\n }\\n\\n .filter-count {\\n width: 100%;\\n margin-left: 0;\\n }\\n }\\n\\n @media (prefers-reduced-motion: reduce) {\\n *, *::before, *::after {\\n transition: none !important;\\n scroll-behavior: auto !important;\\n }\\n }\\n </style>\\n</head>\\n<body>\\n <div class=\\\"shell\\\">\\n <header class=\\\"header\\\">\\n <div class=\\\"header-title-wrap\\\">\\n <div class=\\\"eyebrow\\\"><span class=\\\"brand-wordmark\\\" aria-label=\\\"AgentV\\\"><span class=\\\"brand-letter\\\" aria-hidden=\\\"true\\\">A</span><span class=\\\"brand-middle\\\" aria-hidden=\\\"true\\\">gent</span><span class=\\\"brand-letter\\\" aria-hidden=\\\"true\\\">V</span></span> static export</div>\\n <h1 class=\\\"header-title\\\">Evaluation Report</h1>\\n <p class=\\\"header-subtitle\\\">Dashboard-themed HTML generated from an existing AgentV results workspace.</p>\\n </div>\\n <div class=\\\"header-meta\\\" id=\\\"header-meta\\\"></div>\\n </header>\\n\\n <nav class=\\\"tabs\\\" aria-label=\\\"Report sections\\\" id=\\\"tab-nav\\\">\\n <button class=\\\"tab active\\\" type=\\\"button\\\" data-tab=\\\"overview\\\">Overview</button>\\n <button class=\\\"tab\\\" type=\\\"button\\\" data-tab=\\\"tests\\\">Test Cases</button>\\n </nav>\\n\\n <main class=\\\"app\\\" id=\\\"app\\\"></main>\\n </div>\\n\\n <script>\\n const RAW_DATA = __DATA_PLACEHOLDER__;\\n\\n (function () {\\n function pick(obj, keys, fallback) {\\n for (let i = 0; i < keys.length; i += 1) {\\n const key = keys[i];\\n if (obj && Object.prototype.hasOwnProperty.call(obj, key) && obj[key] !== undefined && obj[key] !== null) {\\n return obj[key];\\n }\\n }\\n return fallback;\\n }\\n\\n function asString(value, fallback) {\\n return typeof value === 'string' ? value : fallback;\\n }\\n\\n function asNumber(value, fallback) {\\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\\n }\\n\\n function asArray(value) {\\n return Array.isArray(value) ? value : [];\\n }\\n\\n function normalizeAssertion(value, assertionType) {\\n if (!value || typeof value !== 'object' || Array.isArray(value)) return null;\\n return {\\n text: asString(value.text, 'Untitled assertion'),\\n passed: Boolean(value.passed),\\n evidence: asString(value.evidence, ''),\\n assertion_type: asString(value.assertion_type, '') || assertionType,\\n };\\n }\\n\\n function normalizeScores(value) {\\n return asArray(value)\\n .map((entry) => {\\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) return null;\\n const scoreName = asString(pick(entry, ['name', 'type'], 'assertion'), 'assertion');\\n const scoreType = asString(pick(entry, ['type', 'name'], 'assertion'), 'assertion');\\n const assertions = asArray(entry.assertions)\\n .map((assertion) => normalizeAssertion(assertion, scoreName))\\n .filter(Boolean);\\n return {\\n name: scoreName,\\n type: scoreType,\\n score: asNumber(entry.score, 0),\\n assertions,\\n };\\n })\\n .filter(Boolean);\\n }\\n\\n function normalizeTokenUsage(value) {\\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\\n return { input: 0, output: 0, reasoning: 0 };\\n }\\n return {\\n input: asNumber(pick(value, ['input', 'input_tokens', 'inputTokens'], 0), 0),\\n output: asNumber(pick(value, ['output', 'output_tokens', 'outputTokens'], 0), 0),\\n reasoning: asNumber(pick(value, ['reasoning', 'reasoning_tokens', 'reasoningTokens'], 0), 0),\\n };\\n }\\n\\n function normalizeResult(raw, index) {\\n const scores = normalizeScores(pick(raw, ['scores'], []));\\n const fallbackAssertions = asArray(pick(raw, ['assertions'], []))\\n .map((assertion) => normalizeAssertion(assertion, 'assertion'))\\n .filter(Boolean);\\n const flattenedAssertions = scores.flatMap((score) => score.assertions);\\n const displayAssertions = flattenedAssertions.length > 0 ? flattenedAssertions : fallbackAssertions;\\n const testId = asString(pick(raw, ['test_id', 'testId'], 'unknown'), 'unknown');\\n const target = asString(pick(raw, ['target'], 'unknown'), 'unknown');\\n const evalFile = asString(pick(raw, ['eval_file', 'evalFile'], 'ungrouped'), 'ungrouped');\\n const executionStatus = asString(pick(raw, ['execution_status', 'executionStatus'], ''), '');\\n return {\\n _key: `${evalFile}:${target}:${testId}:${index}`,\\n raw,\\n eval_file: evalFile,\\n test_id: testId,\\n target,\\n score: asNumber(pick(raw, ['score'], 0), 0),\\n duration_ms: asNumber(pick(raw, ['duration_ms', 'durationMs'], 0), 0),\\n cost_usd: asNumber(pick(raw, ['cost_usd', 'costUsd'], 0), 0),\\n timestamp: asString(pick(raw, ['timestamp'], ''), ''),\\n execution_status: executionStatus,\\n error: asString(pick(raw, ['error'], ''), ''),\\n input: pick(raw, ['input'], null),\\n output: pick(raw, ['output'], null),\\n token_usage: normalizeTokenUsage(pick(raw, ['token_usage', 'tokenUsage'], {})),\\n total_tokens: 0,\\n scores,\\n assertions: displayAssertions,\\n };\\n }\\n\\n function escapeHtml(value) {\\n return String(value)\\n .replace(/&/g, '&')\\n .replace(/</g, '<')\\n .replace(/>/g, '>')\\n .replace(/\\\"/g, '"');\\n }\\n\\n function statusOf(result) {\\n if (result.execution_status === 'execution_error') return 'error';\\n if (result.execution_status === 'quality_failure') return 'fail';\\n if (result.execution_status === 'ok') return 'pass';\\n if (result.error) return 'error';\\n return result.score >= 0.5 ? 'pass' : 'fail';\\n }\\n\\n function statusLabel(status) {\\n if (status === 'pass') return 'Passed';\\n if (status === 'fail') return 'Failed';\\n return 'Error';\\n }\\n\\n function toneForScore(value) {\\n if (value >= 0.8) return 'text-pass';\\n if (value >= 0.5) return 'text-warn';\\n return 'text-fail';\\n }\\n\\n function toneClassForRate(value) {\\n if (value >= 0.8) return 'tone-pass';\\n if (value >= 0.5) return 'tone-warn';\\n return 'tone-fail';\\n }\\n\\n function formatPercent(value) {\\n return `${(value * 100).toFixed(1)}%`;\\n }\\n\\n function formatDuration(ms) {\\n if (!ms) return '-';\\n if (ms < 1000) return `${Math.round(ms)}ms`;\\n if (ms < 60000) return `${(ms / 1000).toFixed(1)}s`;\\n const minutes = Math.floor(ms / 60000);\\n const seconds = Math.round((ms % 60000) / 1000);\\n return `${minutes}m ${seconds}s`;\\n }\\n\\n function formatTokens(value) {\\n if (!value) return '-';\\n if (value >= 1000000) return `${(value / 1000000).toFixed(1)}M`;\\n if (value >= 1000) return `${(value / 1000).toFixed(1)}K`;\\n return String(value);\\n }\\n\\n function formatCost(value) {\\n if (!value) return '-';\\n if (value < 0.01) return '<$0.01';\\n return `$${value.toFixed(2)}`;\\n }\\n\\n function totalTokens(result) {\\n return (result.token_usage.input || 0) + (result.token_usage.output || 0) + (result.token_usage.reasoning || 0);\\n }\\n\\n function computeStats(rows) {\\n const stats = {\\n total: rows.length,\\n passed: 0,\\n failed: 0,\\n errors: 0,\\n total_duration_ms: 0,\\n total_tokens: 0,\\n total_cost_usd: 0,\\n scores: [],\\n };\\n rows.forEach((row) => {\\n const status = statusOf(row);\\n if (status === 'pass') stats.passed += 1;\\n else if (status === 'fail') stats.failed += 1;\\n else stats.errors += 1;\\n stats.total_duration_ms += row.duration_ms || 0;\\n stats.total_tokens += totalTokens(row);\\n stats.total_cost_usd += row.cost_usd || 0;\\n if (status !== 'error') stats.scores.push(row.score);\\n });\\n const graded = stats.passed + stats.failed;\\n stats.pass_rate = graded > 0 ? stats.passed / graded : 0;\\n return stats;\\n }\\n\\n function groupBy(rows, key) {\\n const map = new Map();\\n rows.forEach((row) => {\\n const value = row[key];\\n if (!map.has(value)) map.set(value, []);\\n map.get(value).push(row);\\n });\\n return Array.from(map.entries()).map(([name, entries]) => ({\\n name,\\n rows: entries,\\n stats: computeStats(entries),\\n }));\\n }\\n\\n function uniqueScoreNames(rows) {\\n const seen = new Set();\\n rows.forEach((row) => {\\n row.scores.forEach((score) => seen.add(score.name));\\n });\\n return Array.from(seen.values()).sort();\\n }\\n\\n function scoreForName(row, scoreName) {\\n const match = row.scores.find((score) => score.name === scoreName);\\n return match ? match.score : null;\\n }\\n\\n function sortRows(rows, sort) {\\n const direction = sort.dir === 'asc' ? 1 : -1;\\n const statusRank = { pass: 0, fail: 1, error: 2 };\\n return rows.slice().sort((left, right) => {\\n let a;\\n let b;\\n if (sort.col === 'status') {\\n a = statusRank[statusOf(left)];\\n b = statusRank[statusOf(right)];\\n } else if (sort.col.startsWith('score:')) {\\n const scoreName = sort.col.slice('score:'.length);\\n a = scoreForName(left, scoreName);\\n b = scoreForName(right, scoreName);\\n } else {\\n a = left[sort.col];\\n b = right[sort.col];\\n }\\n if (a == null && b == null) return 0;\\n if (a == null) return 1;\\n if (b == null) return -1;\\n if (typeof a === 'string' || typeof b === 'string') {\\n return String(a).localeCompare(String(b)) * direction;\\n }\\n return (a - b) * direction;\\n });\\n }\\n\\n function matchesSearch(row, search) {\\n if (!search) return true;\\n const haystack = [\\n row.test_id,\\n row.target,\\n row.eval_file,\\n row.error,\\n extractCriteria(row),\\n row.assertions.map((assertion) => `${assertion.assertion_type} ${assertion.text} ${assertion.evidence}`).join(' '),\\n ].join(' ').toLowerCase();\\n return haystack.includes(search.toLowerCase());\\n }\\n\\n function filterRows(rows, filter) {\\n return rows.filter((row) => {\\n const status = statusOf(row);\\n if (filter.status !== 'all' && status !== filter.status) return false;\\n if (filter.target !== 'all' && row.target !== filter.target) return false;\\n if (!matchesSearch(row, filter.search)) return false;\\n return true;\\n });\\n }\\n\\n function renderPassRate(rate) {\\n return `\\n <span class=\\\"pass-rate-track\\\">\\n <span class=\\\"pass-rate-fill\\\" style=\\\"width:${Math.max(0, Math.min(100, rate * 100))}%\\\"></span>\\n <span class=\\\"pass-rate-label\\\">${formatPercent(rate)}</span>\\n </span>\\n `;\\n }\\n\\n function formatJson(value) {\\n if (value == null) return '';\\n if (typeof value === 'string') return value;\\n try {\\n return JSON.stringify(value, null, 2);\\n } catch (error) {\\n return String(value);\\n }\\n }\\n\\n function renderStatusPill(status) {\\n return `\\n <span class=\\\"status-pill status-${status}\\\">\\n <span class=\\\"status-dot\\\"></span>\\n <span>${statusLabel(status)}</span>\\n </span>\\n `;\\n }\\n\\n function renderAssertions(assertions) {\\n if (assertions.length === 0) {\\n return '<p class=\\\"muted\\\">No assertions.</p>';\\n }\\n return `\\n <ul class=\\\"assertion-list\\\">\\n ${assertions.map((assertion) => `\\n <li class=\\\"assertion-item\\\">\\n <div class=\\\"assertion-topline\\\">\\n <span class=\\\"assertion-status ${assertion.passed ? 'text-pass' : 'text-fail'}\\\">${assertion.passed ? '\\\\u2713' : '\\\\u2717'}</span>\\n ${assertion.assertion_type ? `<span class=\\\"assertion-badge\\\">${escapeHtml(assertion.assertion_type)}</span>` : ''}\\n <span class=\\\"assertion-text\\\">${escapeHtml(assertion.text)}</span>\\n </div>\\n ${assertion.evidence ? `<div class=\\\"assertion-evidence\\\">${escapeHtml(assertion.evidence)}</div>` : ''}\\n </li>\\n `).join('')}\\n </ul>\\n `;\\n }\\n\\n function extractCriteria(row) {\\n if (row.input && typeof row.input === 'object' && row.input.prompt) {\\n return String(row.input.prompt);\\n }\\n if (typeof row.input === 'string' && row.input.length > 0 && row.input.length <= 200) {\\n return row.input;\\n }\\n if (row.assertions && row.assertions.length > 0) {\\n const types = Array.from(new Set(row.assertions.map(a => a.assertion_type).filter(Boolean)));\\n const firstText = row.assertions[0].text || '';\\n const prefix = types.length > 0 ? types.join(', ') + ': ' : '';\\n const full = prefix + firstText;\\n return full.length > 120 ? full.slice(0, 117) + '...' : full;\\n }\\n return '';\\n }\\n\\n function renderDetail(row, evaluatorNames, hasAnyCost) {\\n const meta = [];\\n if (row.timestamp) meta.push(escapeHtml(row.timestamp));\\n if (row.target) meta.push(escapeHtml(row.target));\\n if (row.duration_ms) meta.push(escapeHtml(formatDuration(row.duration_ms)));\\n if (totalTokens(row)) meta.push(escapeHtml(`${formatTokens(totalTokens(row))} tokens`));\\n if (hasAnyCost && row.cost_usd) meta.push(escapeHtml(formatCost(row.cost_usd)));\\n\\n const hasIo = row.input != null || row.output != null;\\n\\n return `\\n <div class=\\\"detail-panel\\\">\\n <div class=\\\"assertion-card\\\">\\n <h4>Assertions (${row.assertions.length})</h4>\\n ${renderAssertions(row.assertions)}\\n </div>\\n\\n ${row.error ? `\\n <div class=\\\"error-card\\\">\\n <h4>Error</h4>\\n <pre>${escapeHtml(row.error)}</pre>\\n </div>\\n ` : ''}\\n\\n ${hasIo ? `\\n <details class=\\\"io-toggle\\\">\\n <summary>\\\\u25B8 Input / Output</summary>\\n <div class=\\\"detail-grid\\\">\\n <div class=\\\"detail-card\\\">\\n <h4>Input</h4>\\n <pre>${escapeHtml(formatJson(row.input))}</pre>\\n </div>\\n <div class=\\\"detail-card\\\">\\n <h4>Output</h4>\\n <pre>${escapeHtml(formatJson(row.output))}</pre>\\n </div>\\n </div>\\n </details>\\n ` : ''}\\n\\n <div class=\\\"meta-row\\\">${meta.join('<span>·</span>')}</div>\\n </div>\\n `;\\n }\\n\\n const DATA = asArray(RAW_DATA).map(normalizeResult);\\n DATA.forEach((row) => {\\n row.total_tokens = totalTokens(row);\\n });\\n const STATE = {\\n tab: 'overview',\\n filter: { status: 'all', target: 'all', search: '' },\\n sort: { col: 'test_id', dir: 'asc' },\\n expanded: {},\\n };\\n\\n const APP = document.getElementById('app');\\n const HEADER_META = document.getElementById('header-meta');\\n const TAB_BUTTONS = Array.from(document.querySelectorAll('.tab'));\\n const TARGETS = Array.from(new Set(DATA.map((row) => row.target))).sort();\\n const EVALUATOR_NAMES = uniqueScoreNames(DATA);\\n const HAS_ANY_COST = DATA.some((row) => row.cost_usd > 0);\\n const OVERALL_STATS = computeStats(DATA);\\n const EVAL_GROUPS = groupBy(DATA, 'eval_file').sort((a, b) => a.name.localeCompare(b.name));\\n const TARGET_GROUPS = groupBy(DATA, 'target').sort((a, b) => a.name.localeCompare(b.name));\\n\\n function syncHeaderMeta() {\\n const themeLabel = document.documentElement.classList.contains('light') ? '\\\\u263E Dark' : '\\\\u2600 Light';\\n HEADER_META.innerHTML = `\\n <span class=\\\"chip\\\">${escapeHtml(String(DATA.length))} tests</span>\\n <span class=\\\"chip\\\">${escapeHtml(String(EVAL_GROUPS.length))} eval files</span>\\n <span class=\\\"chip\\\">${escapeHtml(String(TARGETS.length))} targets</span>\\n <button class=\\\"theme-toggle\\\" id=\\\"theme-btn\\\" type=\\\"button\\\">${themeLabel}</button>\\n `;\\n document.getElementById('theme-btn').addEventListener('click', toggleTheme);\\n }\\n\\n function toggleTheme() {\\n document.documentElement.classList.toggle('light');\\n syncHeaderMeta();\\n }\\n\\n function setTab(tab) {\\n STATE.tab = tab;\\n TAB_BUTTONS.forEach((button) => {\\n button.classList.toggle('active', button.getAttribute('data-tab') === tab);\\n });\\n render();\\n }\\n\\n TAB_BUTTONS.forEach((button) => {\\n button.addEventListener('click', () => setTab(button.getAttribute('data-tab')));\\n });\\n\\n function renderStatCard(label, value, tone) {\\n return `\\n <div class=\\\"stat-card ${tone || ''}\\\">\\n <div class=\\\"stat-label\\\">${escapeHtml(label)}</div>\\n <div class=\\\"stat-value\\\">${escapeHtml(value)}</div>\\n </div>\\n `;\\n }\\n\\n function renderOverview() {\\n if (DATA.length === 0) {\\n APP.innerHTML = `\\n <div class=\\\"empty-state\\\">\\n <h2>No results loaded</h2>\\n <p>Add one or more parsed JSONL result rows to the template placeholder.</p>\\n </div>\\n `;\\n return;\\n }\\n\\n const overviewSections = [];\\n overviewSections.push(`\\n <section class=\\\"section\\\">\\n <div class=\\\"stats-grid\\\">\\n ${renderStatCard('Total tests', String(OVERALL_STATS.total))}\\n ${renderStatCard('Eval files', String(EVAL_GROUPS.length))}\\n ${renderStatCard('Targets', String(TARGETS.length))}\\n ${renderStatCard('Passed', String(OVERALL_STATS.passed), 'tone-pass')}\\n ${renderStatCard('Failed', String(OVERALL_STATS.failed), 'tone-fail')}\\n ${renderStatCard('Errors', String(OVERALL_STATS.errors), OVERALL_STATS.errors > 0 ? 'tone-warn' : '')}\\n ${renderStatCard('Pass rate', formatPercent(OVERALL_STATS.pass_rate), toneClassForRate(OVERALL_STATS.pass_rate))}\\n ${renderStatCard('Duration', formatDuration(OVERALL_STATS.total_duration_ms))}\\n ${renderStatCard('Tokens', formatTokens(OVERALL_STATS.total_tokens))}\\n ${HAS_ANY_COST ? renderStatCard('Cost', formatCost(OVERALL_STATS.total_cost_usd)) : ''}\\n </div>\\n </section>\\n `);\\n\\n overviewSections.push(`\\n <section class=\\\"section\\\">\\n <div class=\\\"section-heading\\\">\\n <div>\\n <h2>Eval Files</h2>\\n <p>Grouped exactly as the exported template will render them in the Test Cases tab.</p>\\n </div>\\n </div>\\n <div class=\\\"table-wrap\\\">\\n <table>\\n <thead>\\n <tr>\\n <th>Eval file</th>\\n <th>Pass rate</th>\\n <th class=\\\"table-num\\\">Passed</th>\\n <th class=\\\"table-num\\\">Failed</th>\\n <th class=\\\"table-num\\\">Errors</th>\\n <th class=\\\"table-num\\\">Tests</th>\\n <th class=\\\"table-num\\\">Duration</th>\\n <th class=\\\"table-num\\\">Tokens</th>\\n ${HAS_ANY_COST ? '<th class=\\\"table-num\\\">Cost</th>' : ''}\\n </tr>\\n </thead>\\n <tbody>\\n ${EVAL_GROUPS.map((group) => `\\n <tr>\\n <td class=\\\"id-cell\\\">${escapeHtml(group.name)}</td>\\n <td>${renderPassRate(group.stats.pass_rate)}</td>\\n <td class=\\\"table-num text-pass\\\">${escapeHtml(String(group.stats.passed))}</td>\\n <td class=\\\"table-num text-fail\\\">${escapeHtml(String(group.stats.failed))}</td>\\n <td class=\\\"table-num text-warn\\\">${escapeHtml(String(group.stats.errors))}</td>\\n <td class=\\\"table-num\\\">${escapeHtml(String(group.stats.total))}</td>\\n <td class=\\\"table-num\\\">${escapeHtml(formatDuration(group.stats.total_duration_ms))}</td>\\n <td class=\\\"table-num\\\">${escapeHtml(formatTokens(group.stats.total_tokens))}</td>\\n ${HAS_ANY_COST ? `<td class=\\\"table-num\\\">${escapeHtml(formatCost(group.stats.total_cost_usd))}</td>` : ''}\\n </tr>\\n `).join('')}\\n </tbody>\\n </table>\\n </div>\\n </section>\\n `);\\n\\n if (TARGET_GROUPS.length > 1) {\\n overviewSections.push(`\\n <section class=\\\"section\\\">\\n <div class=\\\"section-heading\\\">\\n <div>\\n <h2>Targets</h2>\\n <p>Cross-target summary for the loaded result set.</p>\\n </div>\\n </div>\\n <div class=\\\"table-wrap\\\">\\n <table>\\n <thead>\\n <tr>\\n <th>Target</th>\\n <th>Pass rate</th>\\n <th class=\\\"table-num\\\">Passed</th>\\n <th class=\\\"table-num\\\">Failed</th>\\n <th class=\\\"table-num\\\">Errors</th>\\n <th class=\\\"table-num\\\">Avg score</th>\\n <th class=\\\"table-num\\\">Duration</th>\\n <th class=\\\"table-num\\\">Tokens</th>\\n ${HAS_ANY_COST ? '<th class=\\\"table-num\\\">Cost</th>' : ''}\\n </tr>\\n </thead>\\n <tbody>\\n ${TARGET_GROUPS.map((group) => {\\n const gradedRows = group.rows.filter((row) => statusOf(row) !== 'error');\\n const avgScore = gradedRows.length > 0\\n ? gradedRows.reduce((sum, row) => sum + row.score, 0) / gradedRows.length\\n : 0;\\n return `\\n <tr>\\n <td class=\\\"id-cell\\\">${escapeHtml(group.name)}</td>\\n <td>${renderPassRate(group.stats.pass_rate)}</td>\\n <td class=\\\"table-num text-pass\\\">${escapeHtml(String(group.stats.passed))}</td>\\n <td class=\\\"table-num text-fail\\\">${escapeHtml(String(group.stats.failed))}</td>\\n <td class=\\\"table-num text-warn\\\">${escapeHtml(String(group.stats.errors))}</td>\\n <td class=\\\"table-num ${toneForScore(avgScore)}\\\">${escapeHtml(formatPercent(avgScore))}</td>\\n <td class=\\\"table-num\\\">${escapeHtml(formatDuration(group.stats.total_duration_ms))}</td>\\n <td class=\\\"table-num\\\">${escapeHtml(formatTokens(group.stats.total_tokens))}</td>\\n ${HAS_ANY_COST ? `<td class=\\\"table-num\\\">${escapeHtml(formatCost(group.stats.total_cost_usd))}</td>` : ''}\\n </tr>\\n `;\\n }).join('')}\\n </tbody>\\n </table>\\n </div>\\n </section>\\n `);\\n }\\n\\n if (OVERALL_STATS.scores.length > 0) {\\n const buckets = [0, 0, 0, 0, 0];\\n OVERALL_STATS.scores.forEach((score) => {\\n const index = Math.min(Math.floor(score * 5), 4);\\n buckets[index] += 1;\\n });\\n const maxBucket = Math.max.apply(null, buckets);\\n const labels = ['0-20%', '20-40%', '40-60%', '60-80%', '80-100%'];\\n overviewSections.push(`\\n <section class=\\\"section\\\">\\n <div class=\\\"section-heading\\\">\\n <div>\\n <h2>Score Distribution</h2>\\n <p>Histogram across all non-error result rows.</p>\\n </div>\\n </div>\\n <div class=\\\"histogram\\\">\\n ${buckets.map((count, index) => `\\n <div class=\\\"hist-row\\\">\\n <div class=\\\"hist-label\\\">${labels[index]}</div>\\n <div class=\\\"hist-bar-track\\\">\\n <div class=\\\"hist-bar-fill\\\" style=\\\"width:${maxBucket > 0 ? (count / maxBucket) * 100 : 0}%\\\"></div>\\n </div>\\n <div class=\\\"hist-count tabular\\\">${count}</div>\\n </div>\\n `).join('')}\\n </div>\\n </section>\\n `);\\n }\\n\\n APP.innerHTML = overviewSections.join('');\\n }\\n\\n function renderSortableHeader(label, col) {\\n const arrow = STATE.sort.col === col ? (STATE.sort.dir === 'asc' ? ' ↑' : ' ↓') : '';\\n return `<th class=\\\"sortable\\\" data-sort=\\\"${escapeHtml(col)}\\\">${escapeHtml(label)}${arrow}</th>`;\\n }\\n\\n function renderTestGroups() {\\n const filteredRows = filterRows(DATA, STATE.filter);\\n const filteredGroups = groupBy(filteredRows, 'eval_file').sort((a, b) => a.name.localeCompare(b.name));\\n const hasMultipleTargets = TARGETS.length > 1;\\n const hasCriteria = DATA.some((row) => extractCriteria(row).length > 0);\\n if (filteredRows.length === 0) {\\n return '<div class=\\\"empty-state\\\"><h2>No matching tests</h2><p>Adjust the filters or search text.</p></div>';\\n }\\n\\n const colCount = 4 + (hasCriteria ? 1 : 0) + (hasMultipleTargets ? 1 : 0) + (HAS_ANY_COST ? 1 : 0);\\n\\n return `\\n <div class=\\\"group-list\\\">\\n ${filteredGroups.map((group) => {\\n const sortedRows = sortRows(group.rows, STATE.sort);\\n const groupSummary = [];\\n groupSummary.push(`${group.stats.passed}/${group.stats.total} passed`);\\n if (group.stats.failed > 0) groupSummary.push(`${group.stats.failed} failed`);\\n if (group.stats.errors > 0) groupSummary.push(`${group.stats.errors} errors`);\\n return `\\n <section class=\\\"group-card\\\">\\n <div class=\\\"group-header\\\">\\n <div class=\\\"group-title-wrap\\\">\\n <h2 class=\\\"group-title\\\">${escapeHtml(group.name)}</h2>\\n <p class=\\\"group-subtitle\\\">${escapeHtml(groupSummary.join(' | '))}</p>\\n </div>\\n <div class=\\\"group-metrics\\\">\\n <div class=\\\"metric\\\">\\n <span class=\\\"metric-label\\\">Pass rate</span>\\n <span class=\\\"metric-value\\\">${escapeHtml(formatPercent(group.stats.pass_rate))}</span>\\n </div>\\n <div class=\\\"metric\\\">\\n <span class=\\\"metric-label\\\">Tests</span>\\n <span class=\\\"metric-value\\\">${escapeHtml(String(group.stats.total))}</span>\\n </div>\\n <div class=\\\"metric\\\">\\n <span class=\\\"metric-label\\\">Duration</span>\\n <span class=\\\"metric-value\\\">${escapeHtml(formatDuration(group.stats.total_duration_ms))}</span>\\n </div>\\n </div>\\n </div>\\n <div class=\\\"table-wrap\\\">\\n <table>\\n <thead>\\n <tr>\\n <th class=\\\"expand-cell\\\"></th>\\n ${renderSortableHeader('Test ID', 'test_id')}\\n ${hasCriteria ? '<th>Criteria</th>' : ''}\\n ${hasMultipleTargets ? renderSortableHeader('Target', 'target') : ''}\\n ${renderSortableHeader('Score', 'score')}\\n ${renderSortableHeader('Result', 'status')}\\n ${HAS_ANY_COST ? renderSortableHeader('Cost', 'cost_usd') : ''}\\n </tr>\\n </thead>\\n <tbody>\\n ${sortedRows.map((row) => {\\n const expanded = Boolean(STATE.expanded[row._key]);\\n const criteria = extractCriteria(row);\\n return `\\n <tr class=\\\"test-row\\\" data-expand=\\\"${escapeHtml(row._key)}\\\">\\n <td class=\\\"expand-cell\\\">${expanded ? '\\\\u25BE' : '\\\\u25B8'}</td>\\n <td class=\\\"id-cell\\\">${escapeHtml(row.test_id)}</td>\\n ${hasCriteria ? `<td class=\\\"criteria-cell\\\">${escapeHtml(criteria)}</td>` : ''}\\n ${hasMultipleTargets ? `<td class=\\\"table-muted\\\">${escapeHtml(row.target)}</td>` : ''}\\n <td class=\\\"table-num ${toneForScore(row.score)}\\\">${escapeHtml(formatPercent(row.score))}</td>\\n <td>${renderStatusPill(statusOf(row))}</td>\\n ${HAS_ANY_COST ? `<td class=\\\"table-num\\\">${escapeHtml(formatCost(row.cost_usd))}</td>` : ''}\\n </tr>\\n ${expanded ? `<tr class=\\\"detail-row\\\"><td colspan=\\\"${colCount}\\\">${renderDetail(row, EVALUATOR_NAMES, HAS_ANY_COST)}</td></tr>` : ''}\\n `;\\n }).join('')}\\n </tbody>\\n </table>\\n </div>\\n </section>\\n `;\\n }).join('')}\\n </div>\\n `;\\n }\\n\\n function bindTestEvents() {\\n const statusInput = document.getElementById('filter-status');\\n const targetInput = document.getElementById('filter-target');\\n const searchInput = document.getElementById('filter-search');\\n const sortableHeaders = Array.from(document.querySelectorAll('[data-sort]'));\\n const expandableRows = Array.from(document.querySelectorAll('[data-expand]'));\\n\\n if (statusInput) {\\n statusInput.value = STATE.filter.status;\\n statusInput.addEventListener('change', (event) => {\\n STATE.filter.status = event.target.value;\\n render();\\n });\\n }\\n\\n if (targetInput) {\\n targetInput.value = STATE.filter.target;\\n targetInput.addEventListener('change', (event) => {\\n STATE.filter.target = event.target.value;\\n render();\\n });\\n }\\n\\n if (searchInput) {\\n searchInput.value = STATE.filter.search;\\n searchInput.addEventListener('input', (event) => {\\n STATE.filter.search = event.target.value;\\n render();\\n });\\n }\\n\\n sortableHeaders.forEach((header) => {\\n header.addEventListener('click', () => {\\n const col = header.getAttribute('data-sort');\\n if (STATE.sort.col === col) {\\n STATE.sort.dir = STATE.sort.dir === 'asc' ? 'desc' : 'asc';\\n } else {\\n STATE.sort.col = col;\\n STATE.sort.dir = 'asc';\\n }\\n render();\\n });\\n });\\n\\n expandableRows.forEach((row) => {\\n row.addEventListener('click', () => {\\n const key = row.getAttribute('data-expand');\\n STATE.expanded[key] = !STATE.expanded[key];\\n render();\\n });\\n });\\n }\\n\\n function renderTests() {\\n const filteredRows = filterRows(DATA, STATE.filter);\\n APP.innerHTML = `\\n <section class=\\\"section\\\">\\n <div class=\\\"section-heading\\\">\\n <div>\\n <h2>Test Cases</h2>\\n <p>Grouped by source eval file with assertion type badges carried down from parent score entries.</p>\\n </div>\\n </div>\\n <div class=\\\"filter-bar\\\">\\n <select class=\\\"filter-select\\\" id=\\\"filter-status\\\" aria-label=\\\"Filter by status\\\">\\n <option value=\\\"all\\\">All status</option>\\n <option value=\\\"pass\\\">Passed</option>\\n <option value=\\\"fail\\\">Failed</option>\\n <option value=\\\"error\\\">Errors</option>\\n </select>\\n ${TARGETS.length > 1 ? `\\n <select class=\\\"filter-select\\\" id=\\\"filter-target\\\" aria-label=\\\"Filter by target\\\">\\n <option value=\\\"all\\\">All targets</option>\\n ${TARGETS.map((target) => `<option value=\\\"${escapeHtml(target)}\\\">${escapeHtml(target)}</option>`).join('')}\\n </select>\\n ` : ''}\\n <input class=\\\"filter-input\\\" id=\\\"filter-search\\\" type=\\\"search\\\" placeholder=\\\"Search test IDs, targets, eval files, or assertion text\\\">\\n <span class=\\\"filter-count\\\">${escapeHtml(String(filteredRows.length))} of ${escapeHtml(String(DATA.length))} tests</span>\\n </div>\\n ${renderTestGroups()}\\n </section>\\n `;\\n bindTestEvents();\\n }\\n\\n const IS_SMALL = DATA.length <= 20;\\n const TAB_NAV = document.getElementById('tab-nav');\\n\\n function render() {\\n if (IS_SMALL) {\\n TAB_NAV.classList.add('hidden');\\n renderSinglePage();\\n } else {\\n TAB_NAV.classList.remove('hidden');\\n if (STATE.tab === 'overview') renderOverview();\\n else renderTests();\\n }\\n }\\n\\n function renderSinglePage() {\\n if (DATA.length === 0) {\\n APP.innerHTML = `\\n <div class=\\\"empty-state\\\">\\n <h2>No results loaded</h2>\\n <p>Add one or more parsed JSONL result rows to the template placeholder.</p>\\n </div>\\n `;\\n return;\\n }\\n\\n const sections = [];\\n sections.push(`\\n <section class=\\\"section\\\">\\n <div class=\\\"stats-grid\\\">\\n ${renderStatCard('Total tests', String(OVERALL_STATS.total))}\\n ${renderStatCard('Passed', String(OVERALL_STATS.passed), 'tone-pass')}\\n ${renderStatCard('Failed', String(OVERALL_STATS.failed), OVERALL_STATS.failed > 0 ? 'tone-fail' : '')}\\n ${renderStatCard('Pass rate', formatPercent(OVERALL_STATS.pass_rate), toneClassForRate(OVERALL_STATS.pass_rate))}\\n ${renderStatCard('Duration', formatDuration(OVERALL_STATS.total_duration_ms))}\\n ${HAS_ANY_COST ? renderStatCard('Cost', formatCost(OVERALL_STATS.total_cost_usd)) : ''}\\n </div>\\n </section>\\n `);\\n\\n sections.push(`\\n <section class=\\\"section\\\">\\n <div class=\\\"filter-bar\\\">\\n <select class=\\\"filter-select\\\" id=\\\"filter-status\\\" aria-label=\\\"Filter by status\\\">\\n <option value=\\\"all\\\">All status</option>\\n <option value=\\\"pass\\\">Passed</option>\\n <option value=\\\"fail\\\">Failed</option>\\n <option value=\\\"error\\\">Errors</option>\\n </select>\\n <input class=\\\"filter-input\\\" id=\\\"filter-search\\\" type=\\\"search\\\" placeholder=\\\"Search test IDs, targets, or assertion text\\\">\\n </div>\\n ${renderTestGroups()}\\n </section>\\n `);\\n\\n APP.innerHTML = sections.join('');\\n bindTestEvents();\\n }\\n\\n syncHeaderMeta();\\n render();\\n })();\\n </script>\\n</body>\\n</html>\\n\";\n","/**\n * `agentv results show` — full detail for a single test result.\n *\n * Displays JSON with input, score, duration, tokens, all assertions (pass + fail),\n * and the agent's response output for one test identified by --test-id.\n *\n * How to extend:\n * - To add new detail fields, update formatShow and the ShowJson interface.\n */\n\nimport type { EvaluationResult } from '@agentv/core';\nimport { command, option, optional, string } from 'cmd-ts';\nimport { loadResults, sourceArg } from './shared.js';\n\n// ── Helpers ──────────────────────────────────────────────────────────────\n\nexport function findResult(\n results: EvaluationResult[],\n testId: string,\n): EvaluationResult | undefined {\n return results.find((r) => r.testId === testId);\n}\n\nfunction formatInput(result: EvaluationResult): string {\n const input = (result as unknown as Record<string, unknown>).input;\n if (!input) return '(no input)';\n if (typeof input === 'string') return input;\n if (Array.isArray(input)) {\n return input\n .map((msg: unknown) => String((msg as Record<string, unknown>).content ?? ''))\n .join('\\n');\n }\n return '(no input)';\n}\n\nfunction formatOutput(result: EvaluationResult): string {\n if (!result.output || result.output.length === 0) return '(no output)';\n return result.output;\n}\n\n// ── Formatting ───────────────────────────────────────────────────────────\n\nexport interface ShowJson {\n test_id: string;\n score: number;\n duration_ms?: number;\n total_tokens?: number;\n input: string;\n assertions: { text: string; passed: boolean; evidence?: string }[];\n response: string;\n}\n\nexport function formatShow(result: EvaluationResult): ShowJson {\n const usage = result.tokenUsage as { input?: number; output?: number } | undefined;\n let allAssertions = (result.assertions ?? []).map((a) => ({\n text: a.text,\n passed: a.passed,\n evidence: a.evidence,\n }));\n\n if (allAssertions.length === 0 && result.scores) {\n allAssertions = result.scores.flatMap((s) =>\n (s.assertions ?? []).map((a) => ({\n text: a.text,\n passed: a.passed,\n evidence: a.evidence,\n })),\n );\n }\n\n const totalTokens = usage ? (usage.input ?? 0) + (usage.output ?? 0) : undefined;\n\n return {\n test_id: result.testId,\n score: result.score,\n duration_ms: result.durationMs,\n total_tokens: totalTokens,\n input: formatInput(result),\n assertions: allAssertions,\n response: formatOutput(result),\n };\n}\n\n// ── CLI command ──────────────────────────────────────────────────────────\n\nexport const resultsShowCommand = command({\n name: 'show',\n description: 'Show full detail for a single test result',\n args: {\n source: sourceArg,\n testId: option({\n type: string,\n long: 'test-id',\n short: 't',\n description: 'Test ID to display',\n }),\n dir: option({\n type: optional(string),\n long: 'dir',\n short: 'd',\n description: 'Working directory (default: current directory)',\n }),\n },\n handler: async ({ source, testId, dir }) => {\n const cwd = dir ?? process.cwd();\n try {\n const { results } = await loadResults(source, cwd);\n const result = findResult(results, testId);\n\n if (!result) {\n const available = results.map((r) => r.testId).join(', ');\n console.error(`Error: Test ID \"${testId}\" not found.`);\n console.error(`Available test IDs: ${available}`);\n process.exit(1);\n }\n\n console.log(JSON.stringify(formatShow(result), null, 2));\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n },\n});\n","/**\n * `agentv results summary` — compact pass/fail summary of an eval run.\n *\n * Outputs JSON with:\n * - Total tests, passed, failed, pass rate\n * - Mean score, total duration, total tokens\n * - List of failed test IDs\n *\n * How to extend:\n * - To add new summary fields, update formatSummary and the SummaryJson interface.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport type { EvaluationResult } from '@agentv/core';\nimport { command, option, optional, string } from 'cmd-ts';\nimport type { AggregateGradingArtifact } from '../eval/artifact-writer.js';\nimport { loadResults, sourceArg } from './shared.js';\n\n// ── Formatting ───────────────────────────────────────────────────────────\n\nexport interface SummaryJson {\n total: number;\n passed: number;\n failed: number;\n pass_rate: { mean: number };\n total_duration_ms: number;\n total_tokens: number;\n failed_test_ids: string[];\n}\n\nexport function formatSummary(\n results: EvaluationResult[],\n grading?: AggregateGradingArtifact,\n): SummaryJson {\n const total = results.length;\n\n let passed: number;\n let failed: number;\n let passRate: number;\n\n if (grading) {\n const metadata = grading.metadata ?? {};\n const passedSamples =\n typeof metadata.passed_samples === 'number'\n ? metadata.passed_samples\n : typeof metadata.pass_count === 'number'\n ? metadata.pass_count\n : undefined;\n const totalSamples =\n typeof metadata.total_samples === 'number'\n ? metadata.total_samples\n : typeof metadata.sample_count === 'number'\n ? metadata.sample_count\n : undefined;\n // pass_count/sample_count are legacy pre-v5 aggregate metadata names.\n // Keep reading them so `agentv results summary` works on older bundles.\n passed = passedSamples ?? (grading.pass ? total : 0);\n failed =\n totalSamples !== undefined && passedSamples !== undefined\n ? totalSamples - passed\n : total - passed;\n passRate =\n typeof metadata.pass_rate === 'number'\n ? metadata.pass_rate\n : total > 0\n ? Math.round((passed / total) * 1000) / 1000\n : 0;\n } else {\n // Fall back to computing from per-test scores\n passed = results.filter((r) => r.score >= 1.0).length;\n failed = total - passed;\n passRate =\n total > 0 ? Math.round((results.reduce((s, r) => s + r.score, 0) / total) * 1000) / 1000 : 0;\n }\n\n let totalDurationMs = 0;\n let totalTokens = 0;\n for (const r of results) {\n if (r.durationMs != null) totalDurationMs += r.durationMs;\n const usage = r.tokenUsage as { input?: number; output?: number } | undefined;\n if (usage) totalTokens += (usage.input ?? 0) + (usage.output ?? 0);\n }\n\n const failedTestIds = results.filter((r) => r.score < 1.0).map((r) => r.testId);\n\n return {\n total,\n passed,\n failed,\n pass_rate: { mean: passRate },\n total_duration_ms: totalDurationMs,\n total_tokens: totalTokens,\n failed_test_ids: failedTestIds,\n };\n}\n\n// ── CLI command ──────────────────────────────────────────────────────────\n\nexport const resultsSummaryCommand = command({\n name: 'summary',\n description: 'Show compact pass/fail summary of eval results',\n args: {\n source: sourceArg,\n dir: option({\n type: optional(string),\n long: 'dir',\n short: 'd',\n description: 'Working directory (default: current directory)',\n }),\n },\n handler: async ({ source, dir }) => {\n const cwd = dir ?? process.cwd();\n try {\n const { results, sourceFile } = await loadResults(source, cwd);\n\n // Try to load companion grading.json\n let grading: AggregateGradingArtifact | undefined;\n const gradingPath = sourceFile.replace(/\\.jsonl$/, '.grading.json');\n if (existsSync(gradingPath)) {\n try {\n grading = JSON.parse(readFileSync(gradingPath, 'utf8'));\n } catch {\n // Fall back to JSONL-only computation\n }\n }\n\n console.log(JSON.stringify(formatSummary(results, grading), null, 2));\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n },\n});\n","/**\n * `agentv results validate` — Validate that a run directory contains well-formed\n * artifacts compatible with the AgentV dashboard and results commands.\n *\n * Checks:\n * 1. Directory follows the `.agentv/results/<run_id>` naming convention\n * 2. index.jsonl exists and each line has required fields\n * 3. Per-case summary.json exists for every entry in the index\n * 4. Per-run result.json and grading.json exist for every materialized trial\n * 5. summary.json exists\n * 6. Scores are within [0, 1]\n * 7. Run manifest entries have `scores[]` array (warning if missing — dashboard needs it)\n *\n * Exit code 0 = valid, 1 = errors found.\n *\n * To extend: add new check functions to the `checks` array.\n */\nimport { existsSync, readFileSync, statSync } from 'node:fs';\nimport path from 'node:path';\n\nimport {\n LEGACY_METRICS_SCHEMA_VERSION,\n METRICS_SCHEMA_VERSION,\n normalizeMetricsArtifactWire,\n} from '@agentv/core';\nimport { command, positional, string } from 'cmd-ts';\n\nimport { RESULT_INDEX_FILENAME, resolveExistingRunPrimaryPath } from '../eval/result-layout.js';\n\n// ── Types ────────────────────────────────────────────────────────────────\n\ninterface Diagnostic {\n readonly severity: 'error' | 'warning';\n readonly message: string;\n}\n\ninterface IndexEntry {\n readonly timestamp?: string;\n readonly test_id?: string;\n readonly score?: number;\n readonly target?: string;\n readonly scores?: unknown[];\n readonly execution_status?: string;\n readonly summary_path?: string;\n readonly grading_path?: string;\n readonly timing_path?: string;\n readonly metrics_path?: string;\n readonly result_dir?: string;\n readonly samples?: readonly {\n readonly sample_path?: string;\n readonly attempt_path?: string;\n readonly run_path?: string;\n }[];\n readonly attempts?: readonly {\n readonly attempt_path?: string;\n readonly sample_path?: string;\n readonly run_path?: string;\n }[];\n readonly trials?: readonly {\n readonly attempt_path?: string;\n readonly sample_path?: string;\n readonly run_path?: string;\n }[];\n readonly [key: string]: unknown;\n}\n\nconst LEGACY_GRADING_FIELDS = [\n 'assertion_results',\n 'assertions',\n 'passed',\n 'evidence',\n 'verdict',\n 'graders',\n 'checks',\n] as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction validateGradingNode(value: unknown, pathLabel: string): string[] {\n if (!isRecord(value)) {\n return [`${pathLabel} must be an object`];\n }\n\n const errors: string[] = [];\n if (\n typeof value.pass !== 'boolean' ||\n typeof value.score !== 'number' ||\n typeof value.reason !== 'string'\n ) {\n errors.push(`${pathLabel} must include pass, score, and reason`);\n }\n if (value.component_results !== undefined) {\n if (!Array.isArray(value.component_results)) {\n errors.push(`${pathLabel}.component_results must be an array when present`);\n } else {\n value.component_results.forEach((component, index) => {\n errors.push(...validateGradingNode(component, `${pathLabel}.component_results[${index}]`));\n });\n }\n }\n return errors;\n}\n\nfunction validateNoLegacyGradingFields(value: unknown, pathLabel: string): string[] {\n if (Array.isArray(value)) {\n return value.flatMap((entry, index) =>\n validateNoLegacyGradingFields(entry, `${pathLabel}[${index}]`),\n );\n }\n if (!isRecord(value)) {\n return [];\n }\n\n const errors: string[] = [];\n const legacyFields = LEGACY_GRADING_FIELDS.filter((field) => Object.hasOwn(value, field));\n if (legacyFields.length > 0) {\n errors.push(`${pathLabel} uses legacy field(s): ${legacyFields.join(', ')}`);\n }\n for (const [key, entry] of Object.entries(value)) {\n errors.push(...validateNoLegacyGradingFields(entry, `${pathLabel}.${key}`));\n }\n return errors;\n}\n\nfunction validateMetricsArtifact(value: unknown): Diagnostic[] {\n if (!isRecord(value)) {\n return [{ severity: 'error', message: 'metrics.json must be an object' }];\n }\n\n const diagnostics: Diagnostic[] = [];\n const schemaVersion = value.schema_version;\n const isCurrentSchema = schemaVersion === METRICS_SCHEMA_VERSION;\n const isLegacySchema = schemaVersion === LEGACY_METRICS_SCHEMA_VERSION;\n\n if (isCurrentSchema && Object.hasOwn(value, 'trace')) {\n diagnostics.push({\n severity: 'error',\n message: 'metrics.json must not include trace in agentv.metrics.v2',\n });\n } else if (isLegacySchema && Object.hasOwn(value, 'trace')) {\n diagnostics.push({\n severity: 'warning',\n message: 'metrics.json uses legacy trace identity; readers ignore it',\n });\n }\n\n if (isCurrentSchema && Object.hasOwn(value, 'metrics')) {\n diagnostics.push({\n severity: 'error',\n message: 'metrics.json must not include nested metrics in agentv.metrics.v2',\n });\n } else if (isLegacySchema && Object.hasOwn(value, 'metrics')) {\n diagnostics.push({\n severity: 'warning',\n message: 'metrics.json uses legacy nested metrics; readers flatten it',\n });\n }\n\n if (!normalizeMetricsArtifactWire(value)) {\n diagnostics.push({\n severity: 'error',\n message: 'metrics.json does not match a supported metrics artifact shape',\n });\n }\n\n return diagnostics;\n}\n\n// ── Checks ───────────────────────────────────────────────────────────────\n\nfunction checkDirectoryNaming(runDir: string): Diagnostic[] {\n const dirName = path.basename(runDir);\n const pathSegments = path.normalize(runDir).split(path.sep).filter(Boolean);\n const resultsIndex = pathSegments.lastIndexOf('results');\n const diagnostics: Diagnostic[] = [];\n\n if (resultsIndex >= 0 && pathSegments[resultsIndex + 1] === 'runs') {\n diagnostics.push({\n severity: 'error',\n message:\n 'The .agentv/results/runs namespace is no longer supported. Expected: .agentv/results/<run_id>',\n });\n } else if (resultsIndex < 0 || resultsIndex !== pathSegments.length - 2) {\n diagnostics.push({\n severity: 'warning',\n message:\n 'Directory is not under the canonical results tree. Expected: .agentv/results/<run_id>',\n });\n }\n\n const isNewFormat = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d{2}-\\d{3}Z$/.test(dirName);\n if (!isNewFormat) {\n diagnostics.push({\n severity: 'warning',\n message: `Directory name '${dirName}' does not match the expected pattern '<ISO-timestamp>'. Example: 2026-03-27T12-42-24-429Z`,\n });\n }\n\n return diagnostics;\n}\n\nexport function validateRunDirectory(runDir: string): {\n diagnostics: Diagnostic[];\n entries: IndexEntry[];\n} {\n const diagnostics: Diagnostic[] = [];\n\n diagnostics.push(...checkDirectoryNaming(runDir));\n\n const { diagnostics: indexDiags, entries } = checkIndexJsonl(runDir);\n diagnostics.push(...indexDiags);\n\n if (entries.length > 0) {\n diagnostics.push(...checkArtifactFiles(runDir, entries));\n }\n\n return { diagnostics, entries };\n}\n\nfunction checkIndexJsonl(runDir: string): { diagnostics: Diagnostic[]; entries: IndexEntry[] } {\n const indexPath = resolveExistingRunPrimaryPath(runDir);\n const diagnostics: Diagnostic[] = [];\n const entries: IndexEntry[] = [];\n const manifestLabel = indexPath ? path.basename(indexPath) : RESULT_INDEX_FILENAME;\n\n if (!indexPath || !existsSync(indexPath)) {\n diagnostics.push({\n severity: 'error',\n message: `${RESULT_INDEX_FILENAME} is missing`,\n });\n return { diagnostics, entries };\n }\n\n const content = readFileSync(indexPath, 'utf8');\n const lines = content.split('\\n').filter((l) => l.trim().length > 0);\n\n if (lines.length === 0) {\n diagnostics.push({ severity: 'error', message: `${manifestLabel} is empty` });\n return { diagnostics, entries };\n }\n\n for (let i = 0; i < lines.length; i++) {\n try {\n const entry: IndexEntry = JSON.parse(lines[i]);\n entries.push(entry);\n\n if (!entry.test_id) {\n diagnostics.push({\n severity: 'error',\n message: `${manifestLabel} line ${i + 1}: missing 'test_id'`,\n });\n }\n\n if (entry.score === undefined || entry.score === null) {\n diagnostics.push({\n severity: 'error',\n message: `${manifestLabel} line ${i + 1} (${entry.test_id ?? '?'}): missing 'score'`,\n });\n } else if (typeof entry.score !== 'number' || entry.score < 0 || entry.score > 1) {\n diagnostics.push({\n severity: 'error',\n message: `${manifestLabel} line ${i + 1} (${entry.test_id ?? '?'}): score ${entry.score} is outside [0, 1]`,\n });\n }\n\n if (!entry.target) {\n diagnostics.push({\n severity: 'error',\n message: `${manifestLabel} line ${i + 1} (${entry.test_id ?? '?'}): missing 'target'`,\n });\n }\n\n if (!entry.summary_path) {\n diagnostics.push({\n severity: 'error',\n message: `${manifestLabel} line ${i + 1} (${entry.test_id ?? '?'}): missing 'summary_path'`,\n });\n }\n\n if (typeof entry.trace_path === 'string') {\n diagnostics.push({\n severity: 'error',\n message: `${manifestLabel} line ${i + 1} (${entry.test_id ?? '?'}): trace_path is no longer supported; use transcript_path and metrics_path`,\n });\n }\n\n const artifactPointers = entry.artifact_pointers;\n if (\n artifactPointers &&\n typeof artifactPointers === 'object' &&\n !Array.isArray(artifactPointers) &&\n Object.hasOwn(artifactPointers, 'trace')\n ) {\n diagnostics.push({\n severity: 'error',\n message: `${manifestLabel} line ${i + 1} (${entry.test_id ?? '?'}): artifact_pointers.trace is no longer supported`,\n });\n }\n\n if (!entry.scores || !Array.isArray(entry.scores) || entry.scores.length === 0) {\n diagnostics.push({\n severity: 'warning',\n message: `${manifestLabel} line ${i + 1} (${entry.test_id ?? '?'}): missing 'scores[]' array — dashboard may not show per-grader breakdown`,\n });\n } else {\n for (let j = 0; j < entry.scores.length; j++) {\n const s = entry.scores[j] as Record<string, unknown> | null;\n if (!s || typeof s !== 'object') {\n diagnostics.push({\n severity: 'error',\n message: `${manifestLabel} line ${i + 1} (${entry.test_id ?? '?'}): scores[${j}] is not an object`,\n });\n continue;\n }\n const missing: string[] = [];\n if (typeof s.name !== 'string') missing.push('name');\n if (typeof s.type !== 'string') missing.push('type');\n if (typeof s.score !== 'number') missing.push('score');\n if (typeof s.pass !== 'boolean') missing.push('pass');\n if (typeof s.reason !== 'string') missing.push('reason');\n if (missing.length > 0) {\n diagnostics.push({\n severity: 'warning',\n message: `${manifestLabel} line ${i + 1} (${entry.test_id ?? '?'}): scores[${j}] missing fields: ${missing.join(', ')}`,\n });\n }\n }\n }\n\n if (!entry.execution_status) {\n diagnostics.push({\n severity: 'warning',\n message: `${manifestLabel} line ${i + 1} (${entry.test_id ?? '?'}): missing 'execution_status'`,\n });\n } else if (!['ok', 'quality_failure', 'execution_error'].includes(entry.execution_status)) {\n diagnostics.push({\n severity: 'warning',\n message: `${manifestLabel} line ${i + 1} (${entry.test_id ?? '?'}): unknown execution_status '${entry.execution_status}' (expected: ok, quality_failure, execution_error)`,\n });\n }\n } catch {\n diagnostics.push({\n severity: 'error',\n message: `${manifestLabel} line ${i + 1}: invalid JSON`,\n });\n }\n }\n\n return { diagnostics, entries };\n}\n\nfunction checkArtifactFiles(runDir: string, entries: IndexEntry[]): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n\n for (const entry of entries) {\n const testId = entry.test_id ?? '?';\n\n if (entry.summary_path) {\n const summaryPath = path.join(runDir, entry.summary_path);\n if (!existsSync(summaryPath)) {\n diagnostics.push({\n severity: 'error',\n message: `${testId}: summary.json not found at '${entry.summary_path}'`,\n });\n }\n }\n\n for (const sample of entry.samples ?? entry.attempts ?? entry.trials ?? []) {\n const samplePath = sample.sample_path ?? sample.attempt_path ?? sample.run_path;\n if (!entry.result_dir || !samplePath) {\n continue;\n }\n const runDirPath = path.join(runDir, entry.result_dir, samplePath);\n const resultPath = path.join(runDirPath, 'result.json');\n const gradingPath = path.join(runDirPath, 'grading.json');\n if (!existsSync(resultPath)) {\n diagnostics.push({\n severity: 'error',\n message: `${testId}: result.json not found at '${path.posix.join(entry.result_dir, samplePath, 'result.json')}'`,\n });\n }\n if (!existsSync(gradingPath)) {\n diagnostics.push({\n severity: 'error',\n message: `${testId}: grading.json not found at '${path.posix.join(entry.result_dir, samplePath, 'grading.json')}'`,\n });\n }\n }\n\n // Check grading.json\n if (entry.grading_path) {\n const gradingPath = path.join(runDir, entry.grading_path);\n if (!existsSync(gradingPath)) {\n diagnostics.push({\n severity: 'error',\n message: `${testId}: grading.json not found at '${entry.grading_path}'`,\n });\n } else {\n try {\n const grading = JSON.parse(readFileSync(gradingPath, 'utf8'));\n for (const error of [\n ...validateGradingNode(grading, 'grading.json'),\n ...validateNoLegacyGradingFields(grading, 'grading.json'),\n ]) {\n diagnostics.push({\n severity: 'error',\n message: `${testId}: ${error}`,\n });\n }\n } catch {\n diagnostics.push({\n severity: 'error',\n message: `${testId}: grading.json is not valid JSON`,\n });\n }\n }\n }\n\n // Check metrics.json. Legacy timing_path is tolerated for old bundles.\n if (entry.metrics_path) {\n const metricsPath = path.join(runDir, entry.metrics_path);\n if (!existsSync(metricsPath)) {\n diagnostics.push({\n severity: 'warning',\n message: `${testId}: metrics.json not found at '${entry.metrics_path}'`,\n });\n } else {\n try {\n const metrics = JSON.parse(readFileSync(metricsPath, 'utf8'));\n for (const diagnostic of validateMetricsArtifact(metrics)) {\n diagnostics.push({\n severity: diagnostic.severity,\n message: `${testId}: ${diagnostic.message}`,\n });\n }\n } catch {\n diagnostics.push({\n severity: 'error',\n message: `${testId}: metrics.json is not valid JSON`,\n });\n }\n }\n }\n }\n\n // Check run summary.json\n const summaryPath = path.join(runDir, 'summary.json');\n if (!existsSync(summaryPath)) {\n diagnostics.push({ severity: 'error', message: 'summary.json is missing' });\n }\n\n return diagnostics;\n}\n\n// ── Command ──────────────────────────────────────────────────────────────\n\nexport const resultsValidateCommand = command({\n name: 'validate',\n description: 'Validate that a run directory contains well-formed result artifacts',\n args: {\n runDir: positional({\n type: string,\n displayName: 'run-dir',\n description: 'Path to the run directory to validate',\n }),\n },\n handler: async ({ runDir }) => {\n const resolvedDir = path.resolve(runDir);\n\n if (!existsSync(resolvedDir) || !statSync(resolvedDir).isDirectory()) {\n console.error(`Error: '${runDir}' is not a directory`);\n process.exit(1);\n }\n\n const { diagnostics: allDiagnostics, entries } = validateRunDirectory(resolvedDir);\n\n // Report\n const errors = allDiagnostics.filter((d) => d.severity === 'error');\n const warnings = allDiagnostics.filter((d) => d.severity === 'warning');\n\n if (allDiagnostics.length === 0) {\n console.log(`✓ Valid run directory: ${entries.length} test(s), no issues found`);\n return;\n }\n\n for (const d of errors) {\n console.error(` ERROR: ${d.message}`);\n }\n for (const d of warnings) {\n console.warn(` WARN: ${d.message}`);\n }\n\n console.log(\n `\\n${entries.length} test(s), ${errors.length} error(s), ${warnings.length} warning(s)`,\n );\n\n if (errors.length > 0) {\n process.exit(1);\n }\n },\n});\n","import { subcommands } from 'cmd-ts';\n\nimport { compareCommand } from '../compare/index.js';\nimport { trendCommand } from '../trend/index.js';\nimport { resultsCombineCommand } from './combine.js';\nimport { resultsDeleteCommand } from './delete.js';\nimport { resultsExportCommand } from './export.js';\nimport { resultsFailuresCommand } from './failures.js';\nimport { resultsReportCommand } from './report.js';\nimport { resultsShowCommand } from './show.js';\nimport { resultsSummaryCommand } from './summary.js';\nimport { resultsValidateCommand } from './validate.js';\n\nexport const resultsCommand = subcommands({\n name: 'results',\n description: 'Inspect, export, and manage local evaluation results',\n cmds: {\n combine: resultsCombineCommand,\n compare: compareCommand,\n delete: resultsDeleteCommand,\n export: resultsExportCommand,\n report: resultsReportCommand,\n summary: resultsSummaryCommand,\n failures: resultsFailuresCommand,\n show: resultsShowCommand,\n trend: trendCommand,\n validate: resultsValidateCommand,\n },\n});\n","/**\n * `agentv dashboard` / `agentv serve` — starts the AgentV Dashboard server, a React SPA for\n * reviewing evaluation results.\n *\n * The server uses Hono for routing and @hono/node-server to listen.\n * The Dashboard SPA is served from a pre-built dist directory.\n *\n * API endpoints:\n * - GET / — Dashboard SPA (React app)\n * - GET /api/runs — list available run workspaces with metadata\n * - GET /api/runs/:filename — load results from a specific run workspace\n * - GET /api/runs/:filename/log — stream the captured console.log for a run\n * - GET /api/runs/:filename/evals/:evalId/files/* — read artifact files as JSON,\n * or as raw/downloadable text with ?raw=1 / ?download=1\n * - GET /api/runs/:filename/evals/:evalId/trace-session — read an AgentV\n * trace sidecar through the Dashboard trace/session read model\n * - GET /api/projects — list registered projects\n * - POST /api/projects — register a project by path\n * - DELETE /api/projects/:projectId — unregister a project\n * - GET /api/projects/:projectId/runs — project-scoped run list\n *\n * All data routes (runs, suites, categories, evals, experiments, targets)\n * exist in both unscoped (/api/...) and project-scoped (/api/projects/:projectId/...)\n * variants. They share handler functions via DataContext, differing only in\n * how searchDir is resolved.\n *\n * Before starting the server, the command checks `required_version` from\n * the cwd's `.agentv/config.yaml` (single-project scope) and warns on\n * mismatches without prompting, self-updating, or blocking startup.\n *\n * Exported functions (for testing):\n * - resolveSourceFile(source, cwd) — resolves the canonical project run source\n * - loadResults(content) — parses JSONL into EvaluationResult[]\n * - createApp(results, cwd) — Hono app factory\n */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n realpathSync,\n statSync,\n writeFileSync,\n} from 'node:fs';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { command, flag, number, option, optional, positional, string } from 'cmd-ts';\n\nimport {\n AGENTV_RESULTS_ARTIFACTS_REF,\n DEFAULT_CATEGORY,\n type EvaluationResult,\n type ExternalTraceMetadata,\n type ExternalTraceMetadataWire,\n type RunRuntimeSourceMetadata,\n type TraceSessionResponse,\n addProject,\n externalTraceMetadataFromRecord,\n getProject,\n loadConfig,\n loadProjectRegistry,\n normalizeCategoryPath,\n normalizeMetricsArtifactWire,\n normalizeTraceArtifactToTraceSessionResponse,\n omitExternalTraceMetadataKeys,\n readGitResultArtifact,\n removeProject,\n syncProjects,\n toExternalTraceMetadataWire,\n touchProject,\n} from '@agentv/core';\nimport type { Context } from 'hono';\nimport { Hono } from 'hono';\n\nimport { enforceRequiredVersion } from '../../version-check.js';\nimport { parseJsonlResults } from '../eval/artifact-writer.js';\nimport {\n RESULT_INDEX_FILENAME,\n isRunManifestPath,\n relativeRunPathFromCwd,\n} from '../eval/result-layout.js';\nimport { loadRunCache, resolveRunCacheFile } from '../eval/run-cache.js';\nimport { findRepoRoot } from '../eval/shared.js';\nimport { listResultFiles } from '../inspect/utils.js';\nimport {\n CombineDuplicateError,\n type CombineDuplicatePolicy,\n buildCombineRunSources,\n combineRunSources,\n} from './combine-run.js';\nimport { deleteLocalRun } from './delete-run.js';\nimport { getActiveRunStatus, getActiveRunTarget, registerEvalRoutes } from './eval-runner.js';\nimport {\n type ResultManifestRecord,\n loadLightweightResults,\n loadManifestResults,\n normalizeTagMap,\n parseResultManifest,\n} from './manifest.js';\nimport {\n type SourcedResultFileMeta,\n confirmRemoteResultsMerge,\n ensureRemoteRunAvailable,\n findRunById,\n getRemoteResultsStatus,\n listMergedResultFiles,\n loadNormalizedResultsConfig,\n syncRemoteResults,\n} from './remote.js';\nimport { type StudioConfig, loadStudioConfig, saveStudioConfig } from './studio-config.js';\n\n// ── Source resolution ────────────────────────────────────────────────────\n\n/**\n * Dashboard has one run source per project: the project's\n * `.agentv/results/` tree plus any `results:` repo configured for that\n * project. Direct run workspaces and index manifests are supported by\n * `agentv results report`, not the live Dashboard server.\n */\nconst DIRECT_DASHBOARD_SOURCE_GUIDANCE = [\n 'Dashboard reads configured project run sources only.',\n 'Run it from a project root, or pass --dir so Dashboard uses <project>/.agentv/results/:',\n ' agentv dashboard --dir <project-dir>',\n 'To browse external results, configure results.repo.remote or results.repo.path in config YAML.',\n `For a one-off run bundle, use: agentv results report <run-workspace-or-${RESULT_INDEX_FILENAME}>`,\n].join('\\n');\n\nfunction unsupportedDashboardSourceError(source: string, cwd: string): Error {\n const resolved = path.isAbsolute(source) ? source : path.resolve(cwd, source);\n return new Error(\n `Unsupported Dashboard source: ${resolved}\\n${DIRECT_DASHBOARD_SOURCE_GUIDANCE}`,\n );\n}\n\n/**\n * Resolve a canonical project run manifest path from run cache or directory\n * scan. Throws if an unsupported direct source is provided or no run workspace\n * can be found.\n */\nexport async function resolveSourceFile(source: string | undefined, cwd: string): Promise<string> {\n if (source) {\n throw unsupportedDashboardSourceError(source, cwd);\n }\n\n // Prefer cache pointer, fall back to directory scan\n const cache = await loadRunCache(cwd);\n const cachedFile = cache ? resolveRunCacheFile(cache) : '';\n if (\n cachedFile &&\n existsSync(cachedFile) &&\n relativeRunPathFromCwd(cwd, path.dirname(cachedFile))\n ) {\n return cachedFile;\n }\n\n const metas = listResultFiles(cwd, 10);\n if (metas.length === 0) {\n throw new Error(\n 'No run workspaces found in .agentv/results/\\nRun an evaluation first: agentv eval <eval-file>',\n );\n }\n if (metas.length > 1) {\n console.log('Available run workspaces:');\n for (const m of metas) {\n console.log(` ${m.path}`);\n }\n console.log(`\\nServing most recent: ${metas[0].path}\\n`);\n }\n return metas[0].path;\n}\n\n// ── JSONL parsing ────────────────────────────────────────────────────────\n\n/**\n * Parse JSONL content into EvaluationResult[].\n */\nexport function loadResults(content: string): EvaluationResult[] {\n const results = parseJsonlResults(content);\n if (results.length === 0) {\n throw new Error('No valid results found in JSONL content');\n }\n\n return results;\n}\n\nexport function resolveDashboardMode(\n _projectCount: number,\n options: { single?: boolean },\n): { projectDashboard: boolean } {\n if (options.single === true) {\n return { projectDashboard: false };\n }\n\n return { projectDashboard: true };\n}\n\nfunction bootstrapCurrentProject(\n cwd: string,\n options: { single?: boolean },\n): { currentProjectId?: string } {\n if (options.single === true) return {};\n if (!existsSync(path.join(cwd, '.agentv'))) return {};\n\n const entry = addProject(cwd);\n touchProject(entry.id);\n return { currentProjectId: entry.id };\n}\n\n// ── Shared utilities (used by handler functions) ─────────────────────────\n\nexport interface FileNode {\n name: string;\n path: string;\n type: 'file' | 'dir';\n kind?: string;\n storage?: string;\n ref?: string;\n key?: string;\n sha256?: string;\n media_type?: string;\n children?: FileNode[];\n}\n\ntype ArtifactCatalogStorage = 'local' | 'git';\n\nexport interface ArtifactCatalogEntry {\n readonly displayPath: string;\n readonly kind: 'transcript' | 'trace' | 'answer' | 'artifact';\n readonly storage: ArtifactCatalogStorage;\n readonly ref?: string;\n readonly key?: string;\n readonly path?: string;\n readonly sha256?: string;\n readonly mediaType?: string;\n readonly objectVersion?: string;\n}\n\nfunction buildFileTree(dirPath: string, relativeTo: string): FileNode[] {\n if (!existsSync(dirPath) || !statSync(dirPath).isDirectory()) {\n return [];\n }\n const entries = readdirSync(dirPath, { withFileTypes: true });\n return entries\n .sort((a, b) => {\n if (a.isDirectory() !== b.isDirectory()) return a.isDirectory() ? -1 : 1;\n return a.name.localeCompare(b.name);\n })\n .map((entry) => {\n const fullPath = path.join(dirPath, entry.name);\n const relPath = path.relative(relativeTo, fullPath);\n if (entry.isDirectory()) {\n return {\n name: entry.name,\n path: relPath,\n type: 'dir' as const,\n children: buildFileTree(fullPath, relativeTo),\n };\n }\n return {\n name: entry.name,\n path: relPath.split(path.sep).join('/'),\n type: 'file' as const,\n storage: 'local',\n };\n });\n}\n\nfunction flattenFileTree(nodes: readonly FileNode[]): FileNode[] {\n const files: FileNode[] = [];\n for (const node of nodes) {\n if (node.type === 'file') {\n files.push(node);\n } else if (node.children) {\n files.push(...flattenFileTree(node.children));\n }\n }\n return files;\n}\n\nexport function ensureCatalogFileNode(\n root: FileNode[],\n entry: ArtifactCatalogEntry,\n rootPrefix?: string,\n): void {\n // The local file tree is rooted at `rootPrefix` (the artifacts' common dir):\n // its top-level node names are relative to that dir, but each node's `path`\n // stays relative to the run manifest dir. To overlay a catalog entry into the\n // SAME tree we must nest by the prefix-stripped segments (so we match the\n // existing folder names) while still recording the full `path` for content\n // reads. Skipping this is what made git artifacts form a duplicate subtree.\n const fullPath = entry.displayPath;\n const nestPath =\n rootPrefix && fullPath.startsWith(`${rootPrefix}/`)\n ? fullPath.slice(rootPrefix.length + 1)\n : fullPath;\n const usePrefix = nestPath !== fullPath ? rootPrefix : undefined;\n\n const segments = nestPath.split('/').filter(Boolean);\n if (segments.length === 0) return;\n\n let siblings = root;\n let nestedPath = '';\n for (let i = 0; i < segments.length; i += 1) {\n const segment = segments[i];\n if (!segment) continue;\n nestedPath = nestedPath ? `${nestedPath}/${segment}` : segment;\n const fullNodePath = usePrefix ? `${usePrefix}/${nestedPath}` : nestedPath;\n const isFile = i === segments.length - 1;\n let node = siblings.find((candidate) => candidate.name === segment);\n if (!node) {\n node = {\n name: segment,\n path: fullNodePath,\n type: isFile ? 'file' : 'dir',\n ...(isFile\n ? {\n kind: entry.kind,\n storage: entry.storage,\n ...(entry.ref && { ref: entry.ref }),\n ...(entry.key && { key: entry.key }),\n ...(entry.sha256 && { sha256: entry.sha256 }),\n ...(entry.mediaType && { media_type: entry.mediaType }),\n }\n : { children: [] }),\n };\n siblings.push(node);\n siblings.sort((a, b) => {\n if (a.type !== b.type) return a.type === 'dir' ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n }\n if (isFile) {\n node.kind = entry.kind;\n node.storage = entry.storage;\n if (entry.ref) node.ref = entry.ref;\n if (entry.key) node.key = entry.key;\n if (entry.sha256) node.sha256 = entry.sha256;\n if (entry.mediaType) node.media_type = entry.mediaType;\n return;\n }\n node.children ??= [];\n siblings = node.children;\n }\n}\n\n/**\n * Overlays catalog entries (notably git-stored `agentv/artifacts/v1` files) onto\n * the local file tree. Git entries and any catalog entry not already present as\n * a local file are inserted; `rootPrefix` keeps them rooted in the same tree.\n */\nexport function overlayCatalogFileNodes(\n files: FileNode[],\n catalog: readonly ArtifactCatalogEntry[],\n rootPrefix?: string,\n): FileNode[] {\n const localFilePaths = new Set(flattenFileTree(files).map((file) => file.path));\n for (const entry of catalog) {\n if (entry.storage === 'git' || !localFilePaths.has(entry.displayPath)) {\n ensureCatalogFileNode(files, entry, rootPrefix);\n }\n }\n return files;\n}\n\nfunction inferLanguage(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n const langMap: Record<string, string> = {\n '.json': 'json',\n '.jsonl': 'json',\n '.ts': 'typescript',\n '.tsx': 'typescript',\n '.js': 'javascript',\n '.jsx': 'javascript',\n '.md': 'markdown',\n '.yaml': 'yaml',\n '.yml': 'yaml',\n '.log': 'plaintext',\n '.txt': 'plaintext',\n '.py': 'python',\n '.sh': 'shell',\n '.bash': 'shell',\n '.css': 'css',\n '.html': 'html',\n '.xml': 'xml',\n '.svg': 'xml',\n '.toml': 'toml',\n '.diff': 'diff',\n '.patch': 'diff',\n };\n return langMap[ext] ?? 'plaintext';\n}\n\nfunction inferRawContentType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n if (ext === '.json') return 'application/json; charset=utf-8';\n // Raw artifact links should be inspectable in a tab instead of rendered as\n // same-origin HTML/SVG. The explicit ?download=1 path adds\n // Content-Disposition for users that want a file.\n if (ext === '.jsonl') return 'text/plain; charset=utf-8';\n if (ext === '.md') return 'text/markdown; charset=utf-8';\n return 'text/plain; charset=utf-8';\n}\n\nfunction contentDispositionFilename(filePath: string): string {\n return path.basename(filePath).replace(/[\"\\\\\\r\\n]/g, '_');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nfunction artifactPointerPath(pointer: unknown): string | undefined {\n if (typeof pointer === 'string') return nonEmptyString(pointer);\n if (!isRecord(pointer)) return undefined;\n return (\n nonEmptyString(pointer.path) ??\n nonEmptyString(pointer.artifact_path) ??\n nonEmptyString(pointer.relative_path)\n );\n}\n\nfunction artifactPointerDescription(pointer: unknown): string | undefined {\n if (typeof pointer === 'string') return pointer;\n if (!isRecord(pointer)) return undefined;\n const ref = nonEmptyString(pointer.ref);\n const storage = nonEmptyString(pointer.storage);\n const uri = nonEmptyString(pointer.uri) ?? nonEmptyString(pointer.href);\n const pointerPath = artifactPointerPath(pointer);\n const parts = [\n ref ? `ref ${ref}` : undefined,\n storage ? `storage ${storage}` : undefined,\n uri ? `uri ${uri}` : undefined,\n pointerPath ? `path ${pointerPath}` : undefined,\n ].filter((part): part is string => part !== undefined);\n return parts.length > 0 ? parts.join(', ') : undefined;\n}\n\nfunction artifactPointerRef(pointer: unknown): string | undefined {\n return isRecord(pointer) ? nonEmptyString(pointer.ref) : undefined;\n}\n\nfunction artifactPointerKey(pointer: unknown): string | undefined {\n return isRecord(pointer) ? nonEmptyString(pointer.key) : undefined;\n}\n\nfunction artifactPointerSha256(pointer: unknown): string | undefined {\n return isRecord(pointer) ? nonEmptyString(pointer.sha256) : undefined;\n}\n\nfunction artifactPointerMediaType(pointer: unknown): string | undefined {\n return isRecord(pointer) ? nonEmptyString(pointer.media_type) : undefined;\n}\n\nfunction artifactPointerObjectVersion(pointer: unknown): string | undefined {\n return isRecord(pointer) ? nonEmptyString(pointer.object_version) : undefined;\n}\n\ninterface ResolvedArtifactPointer {\n readonly path?: string;\n readonly key?: string;\n readonly description?: string;\n readonly ref?: string;\n readonly sha256?: string;\n readonly mediaType?: string;\n readonly objectVersion?: string;\n readonly unsupportedReason?: string;\n}\n\nfunction resolveRecordArtifactPointer(\n record: ResultManifestRecord,\n kind: 'transcript' | 'answer' | 'trace',\n): ResolvedArtifactPointer {\n const legacyArtifactPointers = record.artifact_pointers as\n | (ResultManifestRecord['artifact_pointers'] & {\n readonly trace?: NonNullable<ResultManifestRecord['artifact_pointers']>['transcript'];\n })\n | undefined;\n const pointer =\n kind === 'transcript'\n ? record.artifact_pointers?.transcript\n : kind === 'trace'\n ? legacyArtifactPointers?.trace\n : undefined;\n const pointerPath = artifactPointerPath(pointer);\n const description = artifactPointerDescription(pointer);\n const ref = artifactPointerRef(pointer);\n const key = artifactPointerKey(pointer);\n const sha256 = artifactPointerSha256(pointer);\n const mediaType = artifactPointerMediaType(pointer);\n const objectVersion = artifactPointerObjectVersion(pointer);\n if ((kind === 'transcript' || kind === 'trace') && pointerPath) {\n return {\n path: pointerPath,\n description,\n ref,\n ...(key && { key }),\n ...(sha256 && { sha256 }),\n ...(mediaType && { mediaType }),\n ...(objectVersion && { objectVersion }),\n };\n }\n\n const directPath =\n kind === 'transcript'\n ? record.transcript_path\n : kind === 'trace'\n ? record.trace_path\n : (record.answer_path ?? record.output_path);\n if (directPath) {\n return { path: directPath, description: directPath };\n }\n\n if (pointerPath) {\n return {\n path: pointerPath,\n description,\n ref,\n ...(key && { key }),\n ...(sha256 && { sha256 }),\n ...(mediaType && { mediaType }),\n ...(objectVersion && { objectVersion }),\n };\n }\n if (pointer) {\n return {\n description,\n ref,\n ...(key && { key }),\n ...(sha256 && { sha256 }),\n ...(mediaType && { mediaType }),\n ...(objectVersion && { objectVersion }),\n unsupportedReason: description\n ? `${kind} artifact pointer does not include a local path (${description}).`\n : `${kind} artifact pointer does not include a local path.`,\n };\n }\n return {};\n}\n\nfunction resolveRunArtifactPath(\n baseDir: string,\n relativePath: string,\n): { absolutePath?: string; error?: string } {\n const absolutePath = path.resolve(baseDir, relativePath);\n const resolvedBase = path.resolve(baseDir);\n if (!isPathInsideDirectory(resolvedBase, absolutePath)) {\n return { error: 'Artifact path is outside the run workspace.' };\n }\n return { absolutePath };\n}\n\nfunction runWorkspaceDirFromManifestPath(manifestPath: string): string {\n const manifestDir = path.dirname(manifestPath);\n return path.basename(manifestDir) === '.internal' ? path.dirname(manifestDir) : manifestDir;\n}\n\nfunction isPathInsideDirectory(baseDir: string, candidatePath: string): boolean {\n const relative = path.relative(baseDir, candidatePath);\n return (\n relative === '' || (!!relative && !relative.startsWith('..') && !path.isAbsolute(relative))\n );\n}\n\nfunction resolveReadableRunArtifactFile(\n baseDir: string,\n relativePath: string,\n): { absolutePath?: string; error?: string } {\n const resolved = resolveRunArtifactPath(baseDir, relativePath);\n if (!resolved.absolutePath) return { error: resolved.error };\n\n let realBase: string;\n let realArtifact: string;\n try {\n realBase = realpathSync(baseDir);\n realArtifact = realpathSync(resolved.absolutePath);\n } catch {\n return {};\n }\n\n if (!isPathInsideDirectory(realBase, realArtifact)) {\n return { error: 'Artifact path is outside the run workspace.' };\n }\n\n try {\n if (!statSync(realArtifact).isFile()) {\n return {};\n }\n } catch {\n return {};\n }\n\n return { absolutePath: realArtifact };\n}\n\nfunction normalizeArtifactRelativePath(relativePath: string): string | undefined {\n const normalized = relativePath.split(path.sep).join('/');\n const segments = normalized.split('/').filter(Boolean);\n if (\n segments.length === 0 ||\n normalized.startsWith('/') ||\n segments.some((segment) => segment === '..')\n ) {\n return undefined;\n }\n return segments.join('/');\n}\n\nfunction requestedResultDir(c: C): { value?: string; error?: string } {\n const raw = c.req.query('result_dir')?.trim();\n if (!raw) {\n return {};\n }\n const normalized = normalizeArtifactRelativePath(raw);\n if (!normalized) {\n return { error: 'Invalid result_dir' };\n }\n return { value: normalized };\n}\n\nfunction manifestRecordSelection(\n records: readonly ResultManifestRecord[],\n evalId: string,\n resultDir?: string,\n): { record: ResultManifestRecord; index: number } | undefined {\n return records\n .map((record, index) => ({ record, index }))\n .find(({ record }) => {\n if (record.test_id !== evalId) {\n return false;\n }\n if (!resultDir) {\n return true;\n }\n return normalizeArtifactRelativePath(record.result_dir ?? '') === resultDir;\n });\n}\n\nfunction relativeRunPathFromNormalizedManifestPath(manifestPath: string): string | undefined {\n const parts = manifestPath.split('/').filter(Boolean);\n const manifestName = parts.at(-1);\n if (!manifestName || !isRunManifestPath(manifestName)) {\n return undefined;\n }\n const manifestDirParts = parts.slice(0, -1);\n if (manifestDirParts.at(-1) === '.internal') {\n manifestDirParts.pop();\n }\n if (manifestDirParts.length === 0 || manifestDirParts[0]?.startsWith('.')) {\n return undefined;\n }\n const runParts = manifestDirParts;\n return runParts.length > 0 ? runParts.join('/') : undefined;\n}\n\nfunction relativeRunPathFromManifestPath(manifestPath: string): string | undefined {\n return relativeRunPathFromNormalizedManifestPath(manifestPath.split(path.sep).join('/'));\n}\n\nfunction relativeRunPathFromManifest(repoDir: string, manifestPath: string): string | undefined {\n const relativeManifestPath = path.relative(repoDir, manifestPath).split(path.sep).join('/');\n if (\n relativeManifestPath.length === 0 ||\n relativeManifestPath === manifestPath ||\n relativeManifestPath.startsWith('../')\n ) {\n return undefined;\n }\n\n return relativeRunPathFromNormalizedManifestPath(relativeManifestPath);\n}\n\nfunction sidecarArtifactKeyForPointer(\n repoDir: string,\n manifestPath: string,\n artifact: ResolvedArtifactPointer,\n): string | undefined {\n const publishedKey = artifact.key ? normalizeArtifactRelativePath(artifact.key) : undefined;\n if (publishedKey) {\n return publishedKey;\n }\n if (!artifact.path) {\n return publishedKey;\n }\n const relativeArtifactPath = normalizeArtifactRelativePath(artifact.path);\n const relativeRunPath = relativeRunPathFromManifest(repoDir, manifestPath);\n if (!relativeArtifactPath || !relativeRunPath) {\n return undefined;\n }\n return [relativeRunPath, relativeArtifactPath].join('/');\n}\n\nasync function readSidecarArtifactText(\n searchDir: string,\n projectId: string | undefined,\n meta: SourcedResultFileMeta,\n artifact: ResolvedArtifactPointer,\n): Promise<string | undefined> {\n if (artifact.ref !== AGENTV_RESULTS_ARTIFACTS_REF) {\n return undefined;\n }\n const config = await loadNormalizedResultsConfig(searchDir, projectId);\n if (!config) {\n return undefined;\n }\n const key = sidecarArtifactKeyForPointer(config.path, meta.path, artifact);\n if (!key) {\n return undefined;\n }\n const bytes = await readGitResultArtifact({\n repoDir: config.path,\n key,\n ref: AGENTV_RESULTS_ARTIFACTS_REF,\n remote: config.remote,\n ...(artifact.sha256 && { sha256: artifact.sha256 }),\n ...(artifact.objectVersion && { objectVersion: artifact.objectVersion }),\n });\n return bytes?.toString('utf8');\n}\n\nfunction addDirectArtifactCatalogEntry(\n entries: ArtifactCatalogEntry[],\n seen: Set<string>,\n displayPath: string | undefined,\n kind: ArtifactCatalogEntry['kind'],\n): void {\n const normalized = displayPath ? normalizeArtifactRelativePath(displayPath) : undefined;\n if (!normalized || seen.has(normalized)) return;\n seen.add(normalized);\n entries.push({\n displayPath: normalized,\n kind,\n storage: 'local',\n path: normalized,\n });\n}\n\nfunction addPointerArtifactCatalogEntry(\n entries: ArtifactCatalogEntry[],\n seen: Set<string>,\n artifact: ResolvedArtifactPointer,\n kind: ArtifactCatalogEntry['kind'],\n runPath?: string,\n): void {\n const artifactPath = artifact.path ? normalizeArtifactRelativePath(artifact.path) : undefined;\n const displayPath = artifactPath ?? displayPathFromArtifactKey(artifact.key, runPath);\n if (!displayPath || seen.has(displayPath)) return;\n seen.add(displayPath);\n entries.push({\n displayPath,\n kind,\n storage: artifact.ref ? 'git' : 'local',\n ...(artifactPath && { path: artifactPath }),\n ...(artifact.ref && { ref: artifact.ref }),\n ...(artifact.key && { key: artifact.key }),\n ...(artifact.sha256 && { sha256: artifact.sha256 }),\n ...(artifact.mediaType && { mediaType: artifact.mediaType }),\n ...(artifact.objectVersion && { objectVersion: artifact.objectVersion }),\n });\n}\n\nfunction displayPathFromArtifactKey(key: string | undefined, runPath: string | undefined) {\n const normalizedKey = key ? normalizeArtifactRelativePath(key) : undefined;\n if (!normalizedKey) return undefined;\n if (!runPath) return normalizedKey;\n const runPrefix = `${runPath}/`;\n if (!normalizedKey.startsWith(runPrefix)) return normalizedKey;\n return normalizeArtifactRelativePath(normalizedKey.slice(runPrefix.length)) ?? normalizedKey;\n}\n\nfunction addTrialRunCatalogEntries(\n entries: ArtifactCatalogEntry[],\n seen: Set<string>,\n record: ResultManifestRecord,\n): void {\n const resultDir = record.result_dir\n ? normalizeArtifactRelativePath(record.result_dir)\n : undefined;\n if (!resultDir) return;\n for (const trial of record.samples ?? record.attempts ?? record.trials ?? []) {\n const rawPath =\n typeof trial.sample_path === 'string'\n ? trial.sample_path\n : typeof trial.attempt_path === 'string'\n ? trial.attempt_path\n : trial.run_path;\n const runPath = rawPath ? normalizeArtifactRelativePath(rawPath) : undefined;\n if (!runPath) continue;\n const runDir = path.posix.join(resultDir, runPath);\n addDirectArtifactCatalogEntry(\n entries,\n seen,\n path.posix.join(runDir, 'result.json'),\n 'artifact',\n );\n addDirectArtifactCatalogEntry(\n entries,\n seen,\n path.posix.join(runDir, 'grading.json'),\n 'artifact',\n );\n addDirectArtifactCatalogEntry(\n entries,\n seen,\n path.posix.join(runDir, 'metrics.json'),\n 'artifact',\n );\n }\n}\n\nfunction buildResultArtifactCatalog(\n record: ResultManifestRecord,\n options?: { readonly runPath?: string },\n): ArtifactCatalogEntry[] {\n const entries: ArtifactCatalogEntry[] = [];\n const seen = new Set<string>();\n const transcript = resolveRecordArtifactPointer(record, 'transcript');\n const trace = resolveRecordArtifactPointer(record, 'trace');\n const answer = resolveRecordArtifactPointer(record, 'answer');\n\n addPointerArtifactCatalogEntry(entries, seen, transcript, 'transcript', options?.runPath);\n addPointerArtifactCatalogEntry(entries, seen, trace, 'trace', options?.runPath);\n addPointerArtifactCatalogEntry(entries, seen, answer, 'answer', options?.runPath);\n\n addDirectArtifactCatalogEntry(entries, seen, record.summary_path, 'artifact');\n addDirectArtifactCatalogEntry(entries, seen, record.grading_path, 'artifact');\n addDirectArtifactCatalogEntry(entries, seen, record.metrics_path, 'artifact');\n addDirectArtifactCatalogEntry(entries, seen, record.timing_path, 'artifact');\n addDirectArtifactCatalogEntry(entries, seen, record.input_path, 'artifact');\n addDirectArtifactCatalogEntry(entries, seen, record.output_path, 'artifact');\n addDirectArtifactCatalogEntry(entries, seen, record.response_path, 'artifact');\n addDirectArtifactCatalogEntry(entries, seen, record.answer_path, 'answer');\n addDirectArtifactCatalogEntry(entries, seen, record.transcript_path, 'transcript');\n addDirectArtifactCatalogEntry(entries, seen, record.transcript_raw_path, 'artifact');\n addDirectArtifactCatalogEntry(entries, seen, record.trace_path, 'trace');\n addDirectArtifactCatalogEntry(entries, seen, record.eval_path, 'artifact');\n addDirectArtifactCatalogEntry(entries, seen, record.providers_path, 'artifact');\n addTrialRunCatalogEntries(entries, seen, record);\n\n return entries;\n}\n\nfunction resultArtifactTreeRootPaths(\n record: ResultManifestRecord,\n catalog: readonly ArtifactCatalogEntry[],\n): string[] {\n return [\n ...catalog.filter((entry) => entry.storage === 'local').map((entry) => entry.displayPath),\n record.test_dir,\n record.task_dir,\n record.files_path,\n record.graders_path,\n ].filter((p, index, all): p is string => !!p && all.indexOf(p) === index);\n}\n\n/**\n * The directory (relative to the run manifest) that all of a test's artifacts\n * share. The local file tree is rooted here, so its top-level nodes are named\n * by their basename (e.g. `outputs`, `task`) while their `path` stays relative\n * to the manifest dir. Git-stored catalog entries must be overlaid using this\n * same prefix, otherwise they nest by their full path and produce a duplicate\n * parallel subtree instead of merging into the existing folders.\n */\nfunction artifactTreeCommonDir(\n record: ResultManifestRecord,\n catalog: readonly ArtifactCatalogEntry[],\n): string | undefined {\n const knownPaths = resultArtifactTreeRootPaths(record, catalog);\n if (knownPaths.length === 0) return undefined;\n\n const resultDirs = knownPaths.map((p) => path.dirname(p));\n let commonDir = resultDirs[0];\n for (const dir of resultDirs) {\n while (!dir.startsWith(commonDir)) {\n const parent = path.dirname(commonDir);\n if (parent === commonDir) break;\n commonDir = parent;\n }\n }\n return commonDir === '.' || commonDir === '' ? undefined : commonDir;\n}\n\nfunction buildLocalResultArtifactTree(\n baseDir: string,\n record: ResultManifestRecord,\n catalog: readonly ArtifactCatalogEntry[],\n): FileNode[] {\n const commonDir = artifactTreeCommonDir(record, catalog);\n if (commonDir === undefined) {\n return resultArtifactTreeRootPaths(record, catalog).length === 0\n ? []\n : buildFileTree(baseDir, baseDir);\n }\n return buildFileTree(path.join(baseDir, commonDir), baseDir);\n}\n\nfunction catalogEntryForDiscoveredLocalFile(\n nodes: readonly FileNode[],\n displayPath: string,\n): ArtifactCatalogEntry | undefined {\n const normalized = normalizeArtifactRelativePath(displayPath);\n if (!normalized) return undefined;\n const file = flattenFileTree(nodes).find((node) => node.path === normalized);\n return file\n ? { displayPath: normalized, kind: 'artifact', storage: 'local', path: normalized }\n : undefined;\n}\n\nfunction findArtifactCatalogEntry(\n catalog: readonly ArtifactCatalogEntry[],\n displayPath: string,\n): ArtifactCatalogEntry | undefined {\n const normalized = normalizeArtifactRelativePath(displayPath);\n return normalized\n ? catalog.find((entry) => normalizeArtifactRelativePath(entry.displayPath) === normalized)\n : undefined;\n}\n\nfunction findPointerArtifactCatalogEntry(\n catalog: readonly ArtifactCatalogEntry[],\n artifact: ResolvedArtifactPointer,\n kind: ArtifactCatalogEntry['kind'],\n runPath: string | undefined,\n): ArtifactCatalogEntry | undefined {\n const displayPath =\n (artifact.path ? normalizeArtifactRelativePath(artifact.path) : undefined) ??\n displayPathFromArtifactKey(artifact.key, runPath);\n if (displayPath) {\n const entry = findArtifactCatalogEntry(catalog, displayPath);\n if (entry) return entry;\n }\n return catalog.find(\n (entry) =>\n entry.kind === kind &&\n artifact.key !== undefined &&\n entry.key !== undefined &&\n entry.key === artifact.key,\n );\n}\n\nasync function readArtifactCatalogEntryText(\n searchDir: string,\n projectId: string | undefined,\n meta: SourcedResultFileMeta,\n entry: ArtifactCatalogEntry,\n): Promise<{ content?: string; error?: string }> {\n const baseDir = runWorkspaceDirFromManifestPath(meta.path);\n if (entry.storage === 'local') {\n const resolved = resolveReadableRunArtifactFile(baseDir, entry.displayPath);\n if (resolved.error) return { error: resolved.error };\n if (!resolved.absolutePath) return {};\n return { content: readFileSync(resolved.absolutePath, 'utf8') };\n }\n\n const localResolved = resolveReadableRunArtifactFile(baseDir, entry.displayPath);\n if (localResolved.error) return { error: localResolved.error };\n if (localResolved.absolutePath) {\n return { content: readFileSync(localResolved.absolutePath, 'utf8') };\n }\n\n if (entry.ref !== AGENTV_RESULTS_ARTIFACTS_REF) {\n return {};\n }\n const content = await readSidecarArtifactText(searchDir, projectId, meta, {\n path: entry.path ?? entry.displayPath,\n ref: entry.ref,\n ...(entry.key && { key: entry.key }),\n ...(entry.sha256 && { sha256: entry.sha256 }),\n ...(entry.objectVersion && { objectVersion: entry.objectVersion }),\n });\n return { content };\n}\n\nfunction readableLocalCatalogEntry(\n meta: SourcedResultFileMeta,\n entry: ArtifactCatalogEntry | undefined,\n): ArtifactCatalogEntry | undefined {\n if (!entry || entry.storage !== 'local') return entry;\n const baseDir = runWorkspaceDirFromManifestPath(meta.path);\n const resolved = resolveReadableRunArtifactFile(baseDir, entry.displayPath);\n return resolved.absolutePath ? entry : undefined;\n}\n\nfunction artifactFileContentResponse(c: C, filePath: string, fileContent: string) {\n if (c.req.query('raw') === '1' || c.req.query('download') === '1') {\n c.header('Content-Type', inferRawContentType(filePath));\n if (c.req.query('download') === '1') {\n c.header(\n 'Content-Disposition',\n `attachment; filename=\"${contentDispositionFilename(filePath)}\"`,\n );\n }\n return c.body(fileContent);\n }\n const language = inferLanguage(filePath);\n return c.json({ content: fileContent, language });\n}\n\nfunction missingTranscriptMessage(): string {\n return [\n 'This result does not include canonical transcript.json metadata.',\n 'Dashboard does not parse response.md or markdown transcripts for this view.',\n ].join(' ');\n}\n\nconst TRACE_SESSION_ARTIFACT_RESPONSE_SCHEMA_VERSION =\n 'agentv.dashboard.trace_artifact.v1' as const;\n\ntype TraceSessionArtifactStatus =\n | 'ok'\n | 'missing'\n | 'unsupported'\n | 'dangling'\n | 'invalid'\n | 'rejected';\n\ntype TraceSessionArtifactResponse =\n | {\n schema_version: typeof TRACE_SESSION_ARTIFACT_RESPONSE_SCHEMA_VERSION;\n status: 'ok';\n trace_path: string;\n trace_session: TraceSessionResponse;\n pointer?: string;\n }\n | {\n schema_version: typeof TRACE_SESSION_ARTIFACT_RESPONSE_SCHEMA_VERSION;\n status: Exclude<TraceSessionArtifactStatus, 'ok'>;\n message: string;\n trace_path?: string;\n pointer?: string;\n };\n\ntype TraceSessionArtifactResponseInput =\n | Omit<Extract<TraceSessionArtifactResponse, { status: 'ok' }>, 'schema_version'>\n | Omit<Exclude<TraceSessionArtifactResponse, { status: 'ok' }>, 'schema_version'>;\n\nfunction traceSessionArtifactResponse(\n response: TraceSessionArtifactResponseInput,\n): TraceSessionArtifactResponse {\n return {\n schema_version: TRACE_SESSION_ARTIFACT_RESPONSE_SCHEMA_VERSION,\n ...response,\n } as TraceSessionArtifactResponse;\n}\n\nfunction missingTraceMessage(): string {\n return [\n 'This result does not include legacy trace artifact metadata.',\n 'Dashboard transcript inspection uses transcript.json for current run bundles.',\n ].join(' ');\n}\n\nfunction parseTraceArtifactJson(content: string): { value?: unknown; message?: string } {\n try {\n return { value: JSON.parse(content) };\n } catch (error) {\n return {\n message: `Trace artifact is not valid JSON: ${\n error instanceof Error ? error.message : String(error)\n }`,\n };\n }\n}\n\nfunction stripHeavyFields(results: readonly EvaluationResult[]) {\n return results.map((r) => {\n const {\n requests,\n trace,\n metadata: rawMetadata,\n ...rest\n } = r as EvaluationResult & Record<string, unknown>;\n const metadata = omitExternalTraceMetadataKeys(rawMetadata as Record<string, unknown>);\n const toolCalls =\n trace?.toolCalls && Object.keys(trace.toolCalls).length > 0 ? trace.toolCalls : undefined;\n const graderDurationMs = (r.scores ?? []).reduce((sum, s) => sum + (s.durationMs ?? 0), 0);\n return {\n ...rest,\n ...(metadata && { metadata }),\n ...(toolCalls && { _toolCalls: toolCalls }),\n ...(graderDurationMs > 0 && { _graderDurationMs: graderDurationMs }),\n };\n });\n}\n\nfunction readArtifactJsonObject(\n baseDir: string,\n relativePath: string | undefined,\n): Record<string, unknown> | undefined {\n if (!relativePath) return undefined;\n const resolved = resolveReadableRunArtifactFile(baseDir, relativePath);\n if (!resolved.absolutePath) return undefined;\n try {\n const parsed = JSON.parse(readFileSync(resolved.absolutePath, 'utf8')) as unknown;\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction numberField(record: Record<string, unknown> | undefined, key: string): number | undefined {\n const value = record?.[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction objectField(\n record: Record<string, unknown> | undefined,\n key: string,\n): Record<string, unknown> | undefined {\n const value = record?.[key];\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction caseTrialArtifactPath(\n resultDir: string | undefined,\n runPath: string | undefined,\n filePath: string,\n): string | undefined {\n if (!resultDir || !runPath) return undefined;\n return path.posix.join(resultDir, runPath, filePath);\n}\n\nfunction buildRepeatTrialReadModels(\n baseDir: string,\n record: ResultManifestRecord,\n): Array<Record<string, unknown>> | undefined {\n const samples = record.samples ?? record.attempts ?? record.trials;\n if (!samples || samples.length === 0) return undefined;\n const resultDir = record.result_dir\n ? normalizeArtifactRelativePath(record.result_dir)\n : undefined;\n\n return samples.map((trial) => {\n const rawPath =\n typeof trial.sample_path === 'string'\n ? trial.sample_path\n : typeof trial.attempt_path === 'string'\n ? trial.attempt_path\n : trial.run_path;\n const runPath = rawPath ? normalizeArtifactRelativePath(rawPath) : undefined;\n const metricsPath = caseTrialArtifactPath(resultDir, runPath, 'metrics.json');\n const timingPath = caseTrialArtifactPath(resultDir, runPath, 'timing.json');\n const gradingPath = caseTrialArtifactPath(resultDir, runPath, 'grading.json');\n const transcriptPath = caseTrialArtifactPath(resultDir, runPath, 'transcript.json');\n const transcriptRawPath = caseTrialArtifactPath(resultDir, runPath, 'transcript-raw.jsonl');\n const answerPath = caseTrialArtifactPath(resultDir, runPath, 'outputs/answer.md');\n const resultPath = caseTrialArtifactPath(resultDir, runPath, 'result.json');\n const runResult = readArtifactJsonObject(baseDir, resultPath);\n const metrics = normalizeMetricsArtifactWire(readArtifactJsonObject(baseDir, metricsPath));\n const timing = readArtifactJsonObject(baseDir, timingPath);\n const toolCalls = objectField(metrics, 'tool_calls');\n const tokenUsage = objectField(metrics, 'tokens') ?? objectField(timing, 'token_usage');\n const duration = objectField(metrics, 'duration');\n const cost = objectField(metrics, 'cost');\n const transcriptSummary =\n objectField(trial, 'transcript_summary') ?? objectField(runResult, 'transcript_summary');\n\n return {\n ...trial,\n ...(numberField(duration, 'total_ms') !== undefined && {\n duration_ms: numberField(duration, 'total_ms'),\n }),\n ...(numberField(duration, 'total_ms') === undefined &&\n numberField(timing, 'duration_ms') !== undefined && {\n duration_ms: numberField(timing, 'duration_ms'),\n }),\n ...(numberField(tokenUsage, 'total') !== undefined && {\n total_tokens: numberField(tokenUsage, 'total'),\n }),\n ...(numberField(tokenUsage, 'total') === undefined &&\n numberField(timing, 'total_tokens') !== undefined && {\n total_tokens: numberField(timing, 'total_tokens'),\n }),\n ...(numberField(cost, 'usd') !== undefined && {\n cost_usd: numberField(cost, 'usd'),\n }),\n ...(numberField(cost, 'usd') === undefined &&\n numberField(timing, 'cost_usd') !== undefined && {\n cost_usd: numberField(timing, 'cost_usd'),\n }),\n ...(tokenUsage && { token_usage: tokenUsage }),\n ...(numberField(metrics, 'total_tool_calls') !== undefined && {\n total_tool_calls: numberField(metrics, 'total_tool_calls'),\n }),\n ...(toolCalls && { tool_calls: toolCalls }),\n ...(transcriptSummary && { transcript_summary: transcriptSummary }),\n ...(metricsPath && { metrics_path: metricsPath }),\n ...(timing && timingPath && { timing_path: timingPath }),\n ...(gradingPath && { grading_path: gradingPath }),\n ...(transcriptPath && { transcript_path: transcriptPath }),\n ...(transcriptRawPath && { transcript_raw_path: transcriptRawPath }),\n ...(answerPath && { answer_path: answerPath }),\n };\n });\n}\n\n/**\n * Compact target-runtime error classification for a row. New bundles carry\n * `target_error_kind` directly; legacy pre-v5.4 fat rows nested it under\n * `target_execution` instead.\n */\nfunction recordTargetErrorKind(record: ResultManifestRecord): string | undefined {\n return (\n record.target_error_kind ??\n record.target_execution?.error_kind ??\n record.target_execution?.errorKind\n );\n}\n\nfunction attachRunDetailReadModelFields<T extends Record<string, unknown>>(\n results: readonly T[],\n records: readonly ResultManifestRecord[],\n baseDir: string,\n): T[] {\n return results.map((result, index) => {\n const record = records[index];\n if (!record) return result;\n const samples = buildRepeatTrialReadModels(baseDir, record);\n const targetErrorKind = recordTargetErrorKind(record);\n return {\n ...result,\n ...(targetErrorKind && { target_error_kind: targetErrorKind }),\n ...(record.aggregation && { aggregation: record.aggregation }),\n ...(record.eval_path && { eval_path: record.eval_path }),\n ...(record.result_dir && { result_dir: record.result_dir }),\n ...(record.test_dir && { test_dir: record.test_dir }),\n ...(record.summary_path && { summary_path: record.summary_path }),\n ...(record.grading_path && { grading_path: record.grading_path }),\n ...(record.timing_path && { timing_path: record.timing_path }),\n ...(record.metrics_path && { metrics_path: record.metrics_path }),\n ...(record.transcript_path && { transcript_path: record.transcript_path }),\n ...(record.transcript_raw_path && { transcript_raw_path: record.transcript_raw_path }),\n ...(record.output_path && { output_path: record.output_path }),\n ...(record.answer_path && { answer_path: record.answer_path }),\n ...(samples && { samples }),\n };\n });\n}\n\n// ── Shared data-route handlers ───────────────────────────────────────────\n//\n// Each handler takes a Hono Context and a DataContext (resolved directories).\n// Both unscoped and project-scoped routes call the same handler, differing\n// only in how the DataContext is constructed.\n\ninterface DataContext {\n searchDir: string;\n agentvDir: string;\n projectId?: string;\n}\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono Context generic varies by route\ntype C = Context<any, any, any>;\n\nfunction inferExperimentFromRunId(runId: string): string | undefined {\n const separatorIndex = runId.lastIndexOf('::');\n if (separatorIndex === -1) {\n return undefined;\n }\n const experiment = runId.slice(0, separatorIndex).trim();\n if (!experiment || experiment === 'default') {\n return undefined;\n }\n return experiment;\n}\n\nasync function ensureRunReadable(\n searchDir: string,\n meta: SourcedResultFileMeta,\n projectId?: string,\n): Promise<void> {\n await ensureRemoteRunAvailable(searchDir, meta, projectId);\n}\n\nasync function loadManifestResultsForMeta(\n searchDir: string,\n meta: SourcedResultFileMeta,\n projectId?: string,\n): Promise<EvaluationResult[]> {\n await ensureRunReadable(searchDir, meta, projectId);\n return loadManifestResults(meta.path, { hydrateTranscriptTrace: false });\n}\n\nasync function loadLightweightResultsForMeta(\n searchDir: string,\n meta: SourcedResultFileMeta,\n projectId?: string,\n): Promise<ReturnType<typeof loadLightweightResults>> {\n await ensureRunReadable(searchDir, meta, projectId);\n return loadLightweightResults(meta.path);\n}\n\nasync function parseManifestForMeta(\n searchDir: string,\n meta: SourcedResultFileMeta,\n projectId?: string,\n): Promise<ReturnType<typeof parseResultManifest>> {\n await ensureRunReadable(searchDir, meta, projectId);\n return parseResultManifest(readFileSync(meta.path, 'utf8'));\n}\n\nconst DEFAULT_RUN_PAGE_LIMIT = 50;\n\nfunction parseRunPageLimit(limitParam: string | undefined): number | undefined | null {\n if (limitParam === undefined) {\n return undefined;\n }\n if (!/^\\d+$/.test(limitParam)) {\n return null;\n }\n const limit = Number.parseInt(limitParam, 10);\n return limit > 0 ? limit : null;\n}\n\nfunction hasUsableTimestamp(timestamp: string | undefined): boolean {\n return !!timestamp && timestamp !== 'unknown' && !Number.isNaN(new Date(timestamp).getTime());\n}\n\nfunction compareRunsByTimestampDesc<T extends { timestamp: string; filename: string }>(\n a: T,\n b: T,\n): number {\n const aTime = hasUsableTimestamp(a.timestamp) ? new Date(a.timestamp).getTime() : null;\n const bTime = hasUsableTimestamp(b.timestamp) ? new Date(b.timestamp).getTime() : null;\n\n if (aTime !== null && bTime !== null && aTime !== bTime) {\n return bTime - aTime;\n }\n if (aTime !== null && bTime === null) return -1;\n if (aTime === null && bTime !== null) return 1;\n\n return b.filename.localeCompare(a.filename);\n}\n\nexport function shouldHydrateRunRecordsForList(meta: SourcedResultFileMeta): boolean {\n return meta.source !== 'remote' || existsSync(meta.path);\n}\n\ninterface QualitySummaryInput {\n readonly score: number;\n readonly executionStatus?: string;\n}\n\ninterface QualitySummaryStats {\n readonly totalCount: number;\n readonly qualityCount: number;\n readonly passedCount: number;\n readonly qualityFailureCount: number;\n readonly executionErrorCount: number;\n readonly scoreSum: number;\n readonly passRate: number;\n readonly avgScore: number;\n}\n\nfunction isExecutionErrorResult(result: QualitySummaryInput): boolean {\n return result.executionStatus === 'execution_error';\n}\n\nfunction summarizeQualityResults(\n results: readonly QualitySummaryInput[],\n passThreshold: number,\n): QualitySummaryStats {\n let qualityCount = 0;\n let passedCount = 0;\n let executionErrorCount = 0;\n let scoreSum = 0;\n\n for (const result of results) {\n if (isExecutionErrorResult(result)) {\n executionErrorCount++;\n continue;\n }\n\n qualityCount++;\n scoreSum += result.score;\n if (result.score >= passThreshold) {\n passedCount++;\n }\n }\n\n const qualityFailureCount = qualityCount - passedCount;\n return {\n totalCount: results.length,\n qualityCount,\n passedCount,\n qualityFailureCount,\n executionErrorCount,\n scoreSum,\n passRate: qualityCount > 0 ? passedCount / qualityCount : 0,\n avgScore: qualityCount > 0 ? scoreSum / qualityCount : 0,\n };\n}\n\nfunction paginateRuns<T extends { filename: string }>(\n runs: T[],\n cursor: string | undefined,\n limit: number | undefined,\n): { runs: T[]; nextCursor?: string } {\n if (limit === undefined) {\n return { runs };\n }\n\n if (!cursor) {\n const page = runs.slice(0, limit);\n return {\n runs: page,\n ...(limit < runs.length && page.length > 0 ? { nextCursor: page.at(-1)?.filename } : {}),\n };\n }\n\n const cursorIndex = runs.findIndex((run) => run.filename === cursor);\n if (cursorIndex === -1) {\n return { runs: [] };\n }\n\n const page = runs.slice(cursorIndex + 1, cursorIndex + 1 + limit);\n return {\n runs: page,\n ...(cursorIndex + 1 + limit < runs.length && page.length > 0\n ? { nextCursor: page.at(-1)?.filename }\n : {}),\n };\n}\n\nasync function handleRuns(c: C, { searchDir, agentvDir, projectId }: DataContext) {\n const { runs: metas } = await listMergedResultFiles(searchDir, undefined, projectId);\n const { threshold: passThreshold } = loadStudioConfig(agentvDir);\n const parsedLimit = parseRunPageLimit(c.req.query('limit'));\n if (parsedLimit === null) {\n return c.json({ error: 'limit must be a positive integer' }, 400);\n }\n\n const cursor = c.req.query('cursor');\n const limit = parsedLimit ?? (cursor ? DEFAULT_RUN_PAGE_LIMIT : undefined);\n const runs = await Promise.all(\n metas.map(async (m) => {\n let target = m.target;\n let experiment = m.experiment ?? inferExperimentFromRunId(m.raw_filename);\n const summaryMetadata = readRunSummaryMetadataForDashboard(m.path);\n let runTags: Record<string, string> | undefined = summaryMetadata.tags;\n let runtimeSource: RunRuntimeSourceMetadata | undefined = summaryMetadata.runtimeSource;\n let timestamp = m.timestamp;\n let testCount = m.testCount;\n let passRate = m.passRate;\n let avgScore = m.avgScore;\n let executionErrorCount = m.executionErrorCount ?? 0;\n try {\n const records = shouldHydrateRunRecordsForList(m)\n ? await loadLightweightResultsForMeta(searchDir, m, projectId)\n : [];\n if (records.length > 0) {\n const qualitySummary = summarizeQualityResults(records, passThreshold);\n target = records[0].target;\n experiment = records[0].experiment ?? experiment;\n runTags = records[0].tags ?? runTags;\n timestamp =\n hasUsableTimestamp(timestamp) || !records[0].timestamp\n ? timestamp\n : records[0].timestamp;\n testCount = qualitySummary.totalCount;\n passRate = qualitySummary.passRate;\n avgScore = qualitySummary.avgScore;\n executionErrorCount = qualitySummary.executionErrorCount;\n runtimeSource = deriveDashboardRuntimeSource({\n summaryMetadata,\n records,\n });\n } else {\n // Run is in-progress with 0 results written yet — fall back to the\n // in-memory target stored when the Dashboard launched this run.\n target = target ?? getActiveRunTarget(m.path);\n runtimeSource = deriveDashboardRuntimeSource({\n summaryMetadata,\n records: [],\n });\n }\n } catch {\n // ignore enrichment errors\n }\n // Surface live status for Dashboard-launched runs that are still starting\n // or running so the RunList can render a spinner instead of the\n // pass/fail dot derived from a 0% pass rate.\n const liveStatus = getActiveRunStatus(m.path);\n return {\n filename: m.filename,\n display_name: m.displayName,\n path: m.path,\n timestamp,\n test_count: testCount,\n pass_rate: passRate,\n avg_score: avgScore,\n execution_error_count: executionErrorCount,\n size_bytes: m.sizeBytes,\n source: m.source,\n on_remote: m.on_remote,\n ...(target && { target }),\n ...(experiment && { experiment }),\n ...(runTags && { run_tags: runTags }),\n ...(runtimeSource && { runtime_source: runtimeSource }),\n ...(liveStatus && { status: liveStatus }),\n };\n }),\n );\n runs.sort(compareRunsByTimestampDesc);\n const page = paginateRuns(runs, cursor, limit);\n return c.json({\n runs: page.runs,\n ...(page.nextCursor ? { next_cursor: page.nextCursor } : {}),\n });\n}\n\nasync function handleRunLog(c: C, { searchDir, projectId }: DataContext) {\n const filename = c.req.param('filename') ?? '';\n const meta = await findRunById(searchDir, filename, projectId);\n if (!meta) return c.json({ error: 'Run not found' }, 404);\n if (meta.source === 'remote') {\n return c.json({ error: 'Run log is not available for remote runs' }, 404);\n }\n const logPath = path.join(runWorkspaceDirFromManifestPath(meta.path), 'console.log');\n if (!existsSync(logPath)) {\n return c.json({ error: 'Run log not found for this run' }, 404);\n }\n try {\n const content = readFileSync(logPath, 'utf8');\n return c.text(content);\n } catch {\n return c.json({ error: 'Failed to read run log' }, 500);\n }\n}\n\nasync function handleRunDetail(c: C, { searchDir, projectId }: DataContext) {\n const filename = c.req.param('filename') ?? '';\n const meta = await findRunById(searchDir, filename, projectId);\n if (!meta) return c.json({ error: 'Run not found' }, 404);\n try {\n const loaded = await loadManifestResultsForMeta(searchDir, meta, projectId);\n const records = await parseManifestForMeta(searchDir, meta, projectId);\n const summaryMetadata = readRunSummaryMetadataForDashboard(meta.path);\n const runtimeSource = deriveDashboardRuntimeSource({\n summaryMetadata,\n records,\n });\n // Surface run_dir + suite_filter for local runs so the UI can launch a\n // Dashboard-side resume against this exact run. Remote runs live in the\n // results-repo cache and cannot be resumed in place, so omit both fields.\n const resumeMeta =\n meta.source === 'local' ? deriveResumeMeta(searchDir, meta.path, summaryMetadata) : {};\n const liveStatus = meta.source === 'local' ? getActiveRunStatus(meta.path) : undefined;\n const baseDir = runWorkspaceDirFromManifestPath(meta.path);\n return c.json({\n results: attachExternalTraceFields(\n attachRunDetailReadModelFields(stripHeavyFields(loaded), records, baseDir),\n records,\n ),\n source: meta.source,\n source_label: meta.displayName,\n ...(runtimeSource && { runtime_source: runtimeSource }),\n ...(liveStatus && { status: liveStatus }),\n ...resumeMeta,\n });\n } catch {\n return c.json({ error: 'Failed to load run' }, 500);\n }\n}\n\nfunction isPhoenixExternalTrace(metadata: ExternalTraceMetadata): boolean {\n const provider = metadata.provider?.toLowerCase();\n return provider === undefined || provider === 'phoenix';\n}\n\nfunction externalTraceWireFromManifestRecord(\n record: ResultManifestRecord | undefined,\n): ExternalTraceMetadataWire | undefined {\n if (!record) {\n return undefined;\n }\n const metadata =\n externalTraceMetadataFromRecord(record as unknown as Record<string, unknown>) ??\n externalTraceMetadataFromRecord(record.metadata);\n if (!metadata || !isPhoenixExternalTrace(metadata)) {\n return undefined;\n }\n try {\n return toExternalTraceMetadataWire(metadata);\n } catch {\n return undefined;\n }\n}\n\nfunction attachExternalTraceFields<T extends Record<string, unknown>>(\n results: readonly T[],\n records: readonly ResultManifestRecord[],\n): T[] {\n return results.map((result, index) => {\n const externalTrace = externalTraceWireFromManifestRecord(records[index]);\n return externalTrace ? { ...result, external_trace: externalTrace } : result;\n });\n}\n\n/**\n * Compute `run_dir` (relative to cwd, snake_case) and `suite_filter` (the\n * eval file path stored in summary.json metadata) for a local run manifest.\n * Returns whatever fields could be resolved — both are best-effort and only\n * needed by the Dashboard \"Resume run\" / \"Rerun failed\" actions.\n */\ninterface RunSummaryMetadataForDashboard {\n readonly evalFile?: string;\n readonly experiment?: string;\n readonly tags?: Record<string, string>;\n readonly plannedTestCount?: number;\n readonly runtimeSource?: RunRuntimeSourceMetadata;\n}\n\nfunction readRunSummaryMetadataForDashboard(manifestPath: string): RunSummaryMetadataForDashboard {\n try {\n const summaryPath = path.join(path.dirname(manifestPath), 'summary.json');\n if (!existsSync(summaryPath)) {\n return {};\n }\n const parsed = JSON.parse(readFileSync(summaryPath, 'utf8')) as {\n metadata?: {\n eval_file?: string;\n experiment?: string;\n tags?: Record<string, unknown>;\n planned_test_count?: number;\n runtime_source?: RunRuntimeSourceMetadata;\n };\n };\n const planned = parsed.metadata?.planned_test_count;\n const tags = normalizeTagMap(parsed.metadata?.tags);\n return {\n ...(typeof parsed.metadata?.eval_file === 'string' &&\n parsed.metadata.eval_file.trim() && { evalFile: parsed.metadata.eval_file.trim() }),\n ...(typeof parsed.metadata?.experiment === 'string' &&\n parsed.metadata.experiment.trim() && { experiment: parsed.metadata.experiment.trim() }),\n ...(tags && { tags }),\n ...(typeof planned === 'number' &&\n Number.isFinite(planned) &&\n planned > 0 && { plannedTestCount: planned }),\n ...(parsed.metadata?.runtime_source && { runtimeSource: parsed.metadata.runtime_source }),\n };\n } catch {\n return {};\n }\n}\n\nfunction uniqueRuntimeSourceValues(values: Iterable<string | undefined>): readonly string[] {\n return [...new Set([...values].filter((value): value is string => Boolean(value?.trim())))]\n .map((value) => value.trim())\n .sort();\n}\n\nfunction deriveDashboardRuntimeSource(params: {\n readonly summaryMetadata: RunSummaryMetadataForDashboard;\n readonly records: readonly {\n evalPath?: string;\n eval_path?: string;\n suite?: string;\n experiment?: string;\n runtimeSource?: RunRuntimeSourceMetadata;\n runtime_source?: RunRuntimeSourceMetadata;\n }[];\n}): RunRuntimeSourceMetadata | undefined {\n const recordWithRuntimeSource = params.records.find(\n (record) => record.runtimeSource ?? record.runtime_source,\n );\n const explicit =\n params.summaryMetadata.runtimeSource ??\n recordWithRuntimeSource?.runtimeSource ??\n recordWithRuntimeSource?.runtime_source;\n if (explicit) {\n return explicit;\n }\n\n const evalFiles = uniqueRuntimeSourceValues([\n params.summaryMetadata.evalFile,\n ...params.records.map((record) => record.evalPath ?? record.eval_path),\n ]);\n if (evalFiles.length === 0) {\n return undefined;\n }\n\n return {\n schema_version: 'agentv.runtime_source.v1',\n config_source: 'defaults',\n eval_files: evalFiles,\n };\n}\n\nfunction deriveResumeMeta(\n cwd: string,\n manifestPath: string,\n summaryMetadata = readRunSummaryMetadataForDashboard(manifestPath),\n): { run_dir?: string; suite_filter?: string; planned_test_count?: number } {\n const out: { run_dir?: string; suite_filter?: string; planned_test_count?: number } = {};\n const runDir = path.dirname(manifestPath);\n const relative = path.relative(cwd, runDir);\n // path.relative returns '..'-prefixed paths when runDir is outside cwd; keep\n // those absolute so the CLI doesn't get confused. An empty string ('' = same\n // dir as cwd) is unusual but valid — fall through to absolute in that case.\n out.run_dir = relative !== '' && !relative.startsWith('..') ? relative : runDir;\n if (summaryMetadata.evalFile) {\n out.suite_filter = summaryMetadata.evalFile;\n }\n if (summaryMetadata.plannedTestCount !== undefined) {\n out.planned_test_count = summaryMetadata.plannedTestCount;\n }\n return out;\n}\n\nasync function handleRunSuites(c: C, { searchDir, agentvDir, projectId }: DataContext) {\n const filename = c.req.param('filename') ?? '';\n const meta = await findRunById(searchDir, filename, projectId);\n if (!meta) return c.json({ error: 'Run not found' }, 404);\n try {\n const loaded = await loadManifestResultsForMeta(searchDir, meta, projectId);\n const { threshold: pass_threshold } = loadStudioConfig(agentvDir);\n const suiteMap = new Map<string, EvaluationResult[]>();\n for (const r of loaded) {\n const ds = r.suite ?? r.target ?? 'default';\n const entry = suiteMap.get(ds) ?? [];\n entry.push(r);\n suiteMap.set(ds, entry);\n }\n const suites = [...suiteMap.entries()].map(([name, entry]) => {\n const qualitySummary = summarizeQualityResults(entry, pass_threshold);\n return {\n name,\n total: qualitySummary.totalCount,\n passed: qualitySummary.passedCount,\n failed: qualitySummary.qualityFailureCount,\n avg_score: qualitySummary.avgScore,\n execution_error_count: qualitySummary.executionErrorCount,\n };\n });\n return c.json({ suites });\n } catch {\n return c.json({ error: 'Failed to load suites' }, 500);\n }\n}\n\nasync function handleRunCategories(c: C, { searchDir, agentvDir, projectId }: DataContext) {\n const filename = c.req.param('filename') ?? '';\n const meta = await findRunById(searchDir, filename, projectId);\n if (!meta) return c.json({ error: 'Run not found' }, 404);\n try {\n const loaded = await loadManifestResultsForMeta(searchDir, meta, projectId);\n const { threshold: pass_threshold } = loadStudioConfig(agentvDir);\n return c.json(buildCategoryRollups(loaded, pass_threshold));\n } catch {\n return c.json({ error: 'Failed to load categories' }, 500);\n }\n}\n\nasync function handleCategorySuites(c: C, { searchDir, agentvDir, projectId }: DataContext) {\n const filename = c.req.param('filename') ?? '';\n const category = decodeURIComponent(c.req.param('category') ?? '');\n const meta = await findRunById(searchDir, filename, projectId);\n if (!meta) return c.json({ error: 'Run not found' }, 404);\n try {\n const loaded = await loadManifestResultsForMeta(searchDir, meta, projectId);\n const { threshold: pass_threshold } = loadStudioConfig(agentvDir);\n const selectedCategory = normalizeCategoryPath(category);\n const filtered = loaded.filter((r) =>\n isCategoryDescendant(categoryPathFromResult(r), selectedCategory),\n );\n const suiteMap = new Map<string, EvaluationResult[]>();\n for (const r of filtered) {\n const ds = r.suite ?? r.target ?? 'default';\n const entry = suiteMap.get(ds) ?? [];\n entry.push(r);\n suiteMap.set(ds, entry);\n }\n const suites = [...suiteMap.entries()].map(([name, entry]) => {\n const qualitySummary = summarizeQualityResults(entry, pass_threshold);\n return {\n name,\n total: qualitySummary.totalCount,\n passed: qualitySummary.passedCount,\n failed: qualitySummary.qualityFailureCount,\n avg_score: qualitySummary.avgScore,\n execution_error_count: qualitySummary.executionErrorCount,\n };\n });\n return c.json({ suites });\n } catch {\n return c.json({ error: 'Failed to load suites' }, 500);\n }\n}\n\ninterface CategoryRollupBucket {\n readonly results: EvaluationResult[];\n readonly suites: Set<string>;\n readonly children: Set<string>;\n}\n\ninterface CategoryRollupSummary {\n readonly name: string;\n readonly label: string;\n readonly parent?: string;\n readonly depth: number;\n readonly total: number;\n readonly passed: number;\n readonly failed: number;\n readonly avg_score: number;\n readonly execution_error_count: number;\n readonly suite_count: number;\n readonly child_count: number;\n readonly children?: CategoryRollupSummary[];\n}\n\nfunction categoryPathFromResult(result: EvaluationResult): string {\n return normalizeCategoryPath(result.category ?? DEFAULT_CATEGORY);\n}\n\nfunction categoryPrefixes(category: string): string[] {\n const parts = category.split('/').filter((part) => part.length > 0);\n if (parts.length === 0) return [DEFAULT_CATEGORY];\n return parts.map((_, index) => parts.slice(0, index + 1).join('/'));\n}\n\nfunction categoryParent(category: string): string | undefined {\n const parts = category.split('/');\n return parts.length > 1 ? parts.slice(0, -1).join('/') : undefined;\n}\n\nfunction categoryLabel(category: string): string {\n return category.split('/').at(-1) ?? category;\n}\n\nfunction isCategoryDescendant(category: string, selectedCategory: string): boolean {\n return category === selectedCategory || category.startsWith(`${selectedCategory}/`);\n}\n\nfunction summarizeCategoryBucket(\n name: string,\n entry: CategoryRollupBucket,\n passThreshold: number,\n): CategoryRollupSummary {\n const qualitySummary = summarizeQualityResults(entry.results, passThreshold);\n const parent = categoryParent(name);\n return {\n name,\n label: categoryLabel(name),\n ...(parent && { parent }),\n depth: name.split('/').filter(Boolean).length - 1,\n total: qualitySummary.totalCount,\n passed: qualitySummary.passedCount,\n failed: qualitySummary.qualityFailureCount,\n avg_score: qualitySummary.avgScore,\n execution_error_count: qualitySummary.executionErrorCount,\n suite_count: entry.suites.size,\n child_count: entry.children.size,\n };\n}\n\nfunction buildCategoryRollups(\n results: readonly EvaluationResult[],\n passThreshold: number,\n): { categories: CategoryRollupSummary[]; category_tree: CategoryRollupSummary[] } {\n const categoryMap = new Map<string, CategoryRollupBucket>();\n const ensureEntry = (name: string): CategoryRollupBucket => {\n const existing = categoryMap.get(name);\n if (existing) return existing;\n const created = { results: [], suites: new Set<string>(), children: new Set<string>() };\n categoryMap.set(name, created);\n return created;\n };\n\n for (const result of results) {\n const category = categoryPathFromResult(result);\n const suite = result.suite ?? result.target ?? 'default';\n const prefixes = categoryPrefixes(category);\n for (const prefix of prefixes) {\n const entry = ensureEntry(prefix);\n entry.results.push(result);\n entry.suites.add(suite);\n }\n for (let index = 1; index < prefixes.length; index++) {\n ensureEntry(prefixes[index - 1]).children.add(prefixes[index]);\n }\n }\n\n const categories = [...categoryMap.entries()]\n .map(([name, entry]) => summarizeCategoryBucket(name, entry, passThreshold))\n .sort((a, b) => a.name.localeCompare(b.name));\n\n const summariesByName = new Map(categories.map((summary) => [summary.name, summary]));\n const buildTreeNode = (summary: CategoryRollupSummary): CategoryRollupSummary => {\n const children = [...(categoryMap.get(summary.name)?.children ?? [])]\n .map((childName) => summariesByName.get(childName))\n .filter((child): child is CategoryRollupSummary => Boolean(child))\n .sort((a, b) => a.name.localeCompare(b.name))\n .map(buildTreeNode);\n return children.length > 0 ? { ...summary, children } : summary;\n };\n const categoryTree = categories\n .filter((summary) => !summary.parent)\n .sort((a, b) => a.name.localeCompare(b.name))\n .map(buildTreeNode);\n\n return { categories, category_tree: categoryTree };\n}\n\nasync function handleEvalDetail(c: C, { searchDir, projectId }: DataContext) {\n const filename = c.req.param('filename') ?? '';\n const evalId = c.req.param('evalId') ?? '';\n if (!evalId) return c.json({ error: 'Eval id is required' }, 400);\n const resultDir = requestedResultDir(c);\n if (resultDir.error) return c.json({ error: resultDir.error }, 400);\n const meta = await findRunById(searchDir, filename, projectId);\n if (!meta) return c.json({ error: 'Run not found' }, 404);\n try {\n const loaded = await loadManifestResultsForMeta(searchDir, meta, projectId);\n const records = await parseManifestForMeta(searchDir, meta, projectId);\n const selection = manifestRecordSelection(records, evalId, resultDir.value);\n const result = selection ? loaded[selection.index] : undefined;\n if (!selection || !result) return c.json({ error: 'Eval not found' }, 404);\n const baseDir = runWorkspaceDirFromManifestPath(meta.path);\n const [stripped] = attachRunDetailReadModelFields(\n stripHeavyFields([result]),\n [selection.record],\n baseDir,\n );\n return c.json({ eval: stripped });\n } catch {\n return c.json({ error: 'Failed to load eval' }, 500);\n }\n}\n\nasync function handleEvalFiles(c: C, { searchDir, projectId }: DataContext) {\n const filename = c.req.param('filename') ?? '';\n const evalId = c.req.param('evalId') ?? '';\n if (!evalId) return c.json({ error: 'Eval id is required' }, 400);\n const resultDir = requestedResultDir(c);\n if (resultDir.error) return c.json({ error: resultDir.error }, 400);\n const meta = await findRunById(searchDir, filename, projectId);\n if (!meta) return c.json({ error: 'Run not found' }, 404);\n try {\n const records = await parseManifestForMeta(searchDir, meta, projectId);\n const selection = manifestRecordSelection(records, evalId, resultDir.value);\n if (!selection) return c.json({ error: 'Eval not found' }, 404);\n const { record } = selection;\n\n const baseDir = runWorkspaceDirFromManifestPath(meta.path);\n const catalog = buildResultArtifactCatalog(record, {\n runPath: relativeRunPathFromManifestPath(meta.path),\n });\n const files = buildLocalResultArtifactTree(baseDir, record, catalog);\n const rootPrefix = artifactTreeCommonDir(record, catalog);\n overlayCatalogFileNodes(files, catalog, rootPrefix);\n return c.json({ files });\n } catch {\n return c.json({ error: 'Failed to load file tree' }, 500);\n }\n}\n\nasync function handleEvalFileContent(c: C, { searchDir, projectId }: DataContext) {\n const filename = c.req.param('filename') ?? '';\n const evalId = c.req.param('evalId') ?? '';\n if (!evalId) return c.json({ error: 'Eval id is required' }, 400);\n const resultDir = requestedResultDir(c);\n if (resultDir.error) return c.json({ error: resultDir.error }, 400);\n const meta = await findRunById(searchDir, filename, projectId);\n if (!meta) return c.json({ error: 'Run not found' }, 404);\n\n // Extract the wildcard suffix without depending on decoded route params.\n const marker = '/files/';\n const markerIdx = c.req.path.indexOf(marker);\n const encodedFilePath = markerIdx >= 0 ? c.req.path.slice(markerIdx + marker.length) : '';\n let filePath = '';\n try {\n filePath = encodedFilePath ? decodeURIComponent(encodedFilePath) : '';\n } catch {\n return c.json({ error: 'Invalid file path encoding' }, 400);\n }\n\n if (!filePath) return c.json({ error: 'No file path specified' }, 400);\n\n await ensureRunReadable(searchDir, meta, projectId);\n const records = parseResultManifest(readFileSync(meta.path, 'utf8'));\n const selection = manifestRecordSelection(records, evalId, resultDir.value);\n if (!selection) return c.json({ error: 'Eval not found' }, 404);\n const { record } = selection;\n const catalog = buildResultArtifactCatalog(record, {\n runPath: relativeRunPathFromManifestPath(meta.path),\n });\n const entry =\n findArtifactCatalogEntry(catalog, filePath) ??\n catalogEntryForDiscoveredLocalFile(\n buildLocalResultArtifactTree(runWorkspaceDirFromManifestPath(meta.path), record, catalog),\n filePath,\n );\n if (!entry) {\n return c.json({ error: 'File not found' }, 404);\n }\n const resolved = await readArtifactCatalogEntryText(searchDir, projectId, meta, entry);\n if (resolved.error) {\n return c.json({ error: 'Path traversal not allowed' }, 403);\n }\n if (resolved.content === undefined) return c.json({ error: 'File not found' }, 404);\n return artifactFileContentResponse(c, entry.displayPath, resolved.content);\n}\n\nasync function handleEvalTraceSession(c: C, { searchDir, projectId }: DataContext) {\n const filename = c.req.param('filename') ?? '';\n const evalId = c.req.param('evalId') ?? '';\n if (!evalId) return c.json({ error: 'Eval id is required' }, 400);\n const resultDir = requestedResultDir(c);\n if (resultDir.error) return c.json({ error: resultDir.error }, 400);\n const meta = await findRunById(searchDir, filename, projectId);\n if (!meta) return c.json({ error: 'Run not found' }, 404);\n\n try {\n const records = await parseManifestForMeta(searchDir, meta, projectId);\n const selection = manifestRecordSelection(records, evalId, resultDir.value);\n if (!selection) return c.json({ error: 'Eval not found' }, 404);\n const { record } = selection;\n\n const trace = resolveRecordArtifactPointer(record, 'trace');\n const runPath = relativeRunPathFromManifestPath(meta.path);\n const traceEntry = findPointerArtifactCatalogEntry(\n buildResultArtifactCatalog(record, { runPath }),\n trace,\n 'trace',\n runPath,\n );\n\n if (!traceEntry && !trace.path) {\n return c.json(\n traceSessionArtifactResponse({\n status: trace.unsupportedReason ? 'unsupported' : 'missing',\n message: trace.unsupportedReason ?? missingTraceMessage(),\n ...(trace.description && { pointer: trace.description }),\n }),\n );\n }\n if (trace.path && !normalizeArtifactRelativePath(trace.path)) {\n return c.json(\n traceSessionArtifactResponse({\n status: 'rejected',\n trace_path: trace.path,\n message: 'Artifact path is outside the run workspace.',\n ...(trace.description && { pointer: trace.description }),\n }),\n 403,\n );\n }\n if (!traceEntry) {\n return c.json(\n traceSessionArtifactResponse({\n status: 'dangling',\n ...(trace.path && { trace_path: trace.path }),\n message: trace.unsupportedReason\n ? trace.unsupportedReason\n : `Trace artifact pointer is present, but ${trace.path} is not available in this run workspace.`,\n ...(trace.description && { pointer: trace.description }),\n }),\n );\n }\n\n const resolvedTrace = await readArtifactCatalogEntryText(\n searchDir,\n projectId,\n meta,\n traceEntry,\n );\n if (resolvedTrace.error) {\n return c.json(\n traceSessionArtifactResponse({\n status: 'rejected',\n trace_path: traceEntry.displayPath,\n message: resolvedTrace.error,\n ...(trace.description && { pointer: trace.description }),\n }),\n 403,\n );\n }\n const content = resolvedTrace.content;\n\n if (content === undefined) {\n const refMessage = trace.ref ? ` on ${trace.ref}` : '';\n return c.json(\n traceSessionArtifactResponse({\n status: 'dangling',\n trace_path: traceEntry.displayPath,\n message: `Trace artifact pointer${refMessage} is present, but ${traceEntry.displayPath} is not available in this run workspace.`,\n ...(trace.description && { pointer: trace.description }),\n }),\n );\n }\n\n const parsed = parseTraceArtifactJson(content);\n if (parsed.message) {\n return c.json(\n traceSessionArtifactResponse({\n status: 'invalid',\n trace_path: traceEntry.displayPath,\n message: parsed.message,\n ...(trace.description && { pointer: trace.description }),\n }),\n );\n }\n\n const normalized = normalizeTraceArtifactToTraceSessionResponse(parsed.value, {\n runId: filename,\n testId: record.test_id,\n suite: record.suite,\n target: record.target,\n artifactPath: traceEntry.displayPath,\n });\n\n if (normalized.status === 'unsupported') {\n return c.json(\n traceSessionArtifactResponse({\n status: 'unsupported',\n trace_path: traceEntry.displayPath,\n message: normalized.message,\n ...(trace.description && { pointer: trace.description }),\n }),\n );\n }\n\n return c.json(\n traceSessionArtifactResponse({\n status: 'ok',\n trace_path: traceEntry.displayPath,\n trace_session: normalized.traceSession,\n ...(trace.description && { pointer: trace.description }),\n }),\n );\n } catch {\n return c.json({ error: 'Failed to load trace artifact' }, 500);\n }\n}\n\nasync function handleEvalTranscript(c: C, { searchDir, projectId }: DataContext) {\n const filename = c.req.param('filename') ?? '';\n const evalId = c.req.param('evalId') ?? '';\n if (!evalId) return c.json({ error: 'Eval id is required' }, 400);\n const resultDir = requestedResultDir(c);\n if (resultDir.error) return c.json({ error: resultDir.error }, 400);\n const meta = await findRunById(searchDir, filename, projectId);\n if (!meta) return c.json({ error: 'Run not found' }, 404);\n\n try {\n const records = await parseManifestForMeta(searchDir, meta, projectId);\n const selection = manifestRecordSelection(records, evalId, resultDir.value);\n if (!selection) return c.json({ error: 'Eval not found' }, 404);\n const { record } = selection;\n\n const transcript = resolveRecordArtifactPointer(record, 'transcript');\n const answer = resolveRecordArtifactPointer(record, 'answer');\n const runPath = relativeRunPathFromManifestPath(meta.path);\n const catalog = buildResultArtifactCatalog(record, { runPath });\n const transcriptEntry = findPointerArtifactCatalogEntry(\n catalog,\n transcript,\n 'transcript',\n runPath,\n );\n const answerEntry = findPointerArtifactCatalogEntry(catalog, answer, 'answer', runPath);\n const transcriptRawEntry = readableLocalCatalogEntry(\n meta,\n record.transcript_raw_path\n ? findArtifactCatalogEntry(catalog, record.transcript_raw_path)\n : undefined,\n );\n\n if (!transcriptEntry && !transcript.path) {\n return c.json({\n status: transcript.unsupportedReason ? 'unsupported' : 'missing',\n message: transcript.unsupportedReason ?? missingTranscriptMessage(),\n ...(transcript.description && { pointer: transcript.description }),\n });\n }\n if (!transcriptEntry) {\n return c.json({\n status: 'dangling',\n ...(transcript.path && { transcript_path: transcript.path }),\n message: transcript.unsupportedReason\n ? transcript.unsupportedReason\n : `Transcript artifact pointer is present, but ${transcript.path} is not available in this run workspace.`,\n ...(transcript.description && { pointer: transcript.description }),\n });\n }\n const resolvedTranscript = await readArtifactCatalogEntryText(\n searchDir,\n projectId,\n meta,\n transcriptEntry,\n );\n if (resolvedTranscript.error) {\n return c.json({\n status: 'dangling',\n transcript_path: transcriptEntry.displayPath,\n message: resolvedTranscript.error,\n ...(transcript.description && { pointer: transcript.description }),\n });\n }\n const content = resolvedTranscript.content;\n\n if (content === undefined) {\n const refMessage = transcript.ref ? ` on ${transcript.ref}` : '';\n return c.json({\n status: 'dangling',\n transcript_path: transcriptEntry.displayPath,\n message: `Transcript artifact pointer${refMessage} is present, but ${transcriptEntry.displayPath} is not available in this run workspace.`,\n ...(transcript.description && { pointer: transcript.description }),\n });\n }\n\n const answerContent = answerEntry\n ? (await readArtifactCatalogEntryText(searchDir, projectId, meta, answerEntry)).content\n : undefined;\n\n return c.json({\n status: 'ok',\n transcript_path: transcriptEntry.displayPath,\n ...(transcriptRawEntry && { transcript_raw_path: transcriptRawEntry.displayPath }),\n content,\n language: inferLanguage(transcriptEntry.displayPath),\n ...(answerEntry && { answer_path: answerEntry.displayPath }),\n ...(answerContent !== undefined && { answer_content: answerContent }),\n ...(transcript.description && { pointer: transcript.description }),\n });\n } catch {\n return c.json({ error: 'Failed to load transcript artifact' }, 500);\n }\n}\n\n/**\n * The reserved tag key that also feeds the run-level experiment namespace. Runs\n * written before the promptfoo `tags` map shipped carry only a top-level\n * `experiment`, so grouping on this key falls back to\n * `record.experiment ?? record.tags?.experiment ?? 'default'`.\n */\nconst EXPERIMENT_TAG_KEY = 'experiment';\n\n/** Bucket label for runs whose rows do not carry the selected tag key. */\nfunction noKeyBucketLabel(key: string): string {\n return `(no ${key})`;\n}\n\n/**\n * Resolve the grouping value a record contributes for a given tag key. For the\n * reserved `experiment` key we honour the lockstep fallback so old runs (no tags\n * map) still resolve; for any other key we read `record.tags?.[key]` and place\n * records missing the key in a `(no <key>)` bucket.\n */\nfunction resolveTagGroupValue(\n record: { readonly experiment?: string; readonly tags?: Record<string, string> },\n key: string,\n): string {\n if (key === EXPERIMENT_TAG_KEY) {\n return record.experiment ?? record.tags?.experiment ?? 'default';\n }\n const value = record.tags?.[key];\n return value === undefined || value === '' ? noKeyBucketLabel(key) : value;\n}\n\n/**\n * Resolve the single run-level `{experiment, tags}` pair a run contributes,\n * mirroring exactly the resolution `handleRuns` uses to build each `RunMeta`\n * (`experiment` and `run_tags`). Because promptfoo tags are run-level (every row\n * of a run carries the same map), grouping and the run-list detail filter must\n * both key off this one source so a run lands in exactly one group per key and\n * the group card's `run_count` matches the detail view's filtered runs.\n */\nfunction resolveRunLevelTagFields(\n meta: SourcedResultFileMeta,\n records: readonly { readonly experiment?: string; readonly tags?: Record<string, string> }[],\n summaryMetadata: RunSummaryMetadataForDashboard,\n): { experiment?: string; tags?: Record<string, string> } {\n const inferredExperiment = meta.experiment ?? inferExperimentFromRunId(meta.raw_filename);\n const experiment = records[0]?.experiment ?? inferredExperiment;\n const tags = records[0]?.tags ?? summaryMetadata.tags;\n return {\n ...(experiment !== undefined && { experiment }),\n ...(tags !== undefined && { tags }),\n };\n}\n\n/**\n * Generalized `GET /api/tags`. Without `?key=` it enumerates the available tag\n * keys (union of every row's `tags` map keys plus the synthetic `experiment`\n * key, sorted). With `?key=<k>` it groups runs by that key's values and returns\n * per-value summaries (the shape the old `/api/experiments` returned, with\n * `name` = the tag value).\n */\nasync function handleTags(c: C, { searchDir, agentvDir, projectId }: DataContext) {\n const { runs: metas } = await listMergedResultFiles(searchDir, undefined, projectId);\n const { threshold: pass_threshold } = loadStudioConfig(agentvDir);\n const rawKey = c.req.query('key');\n const key = rawKey?.trim() ? rawKey.trim() : undefined;\n\n // Key enumeration mode: union each run's tag keys, always include\n // `experiment`. Read the run-level `metadata.tags` from each run's\n // `summary.json` (cheap) rather than parsing every run's full JSONL — promptfoo\n // tags are run-level, so the summary map carries the same keys. Returned sorted\n // for a stable dropdown.\n if (!key) {\n const keys = new Set<string>([EXPERIMENT_TAG_KEY]);\n for (const m of metas) {\n try {\n await ensureRunReadable(searchDir, m, projectId);\n const summaryMetadata = readRunSummaryMetadataForDashboard(m.path);\n for (const tagKey of Object.keys(summaryMetadata.tags ?? {})) {\n keys.add(tagKey);\n }\n } catch {\n // skip runs that fail to load\n }\n }\n return c.json({ keys: [...keys].sort() });\n }\n\n const groups = await aggregateTagGroups(metas, key, { searchDir, projectId, pass_threshold });\n return c.json({ key, groups });\n}\n\n/**\n * Group runs by a tag key's values and return per-value summaries. Grouping is\n * per-run: each run resolves exactly ONE group value from its run-level\n * `{experiment, tags}` (via {@link resolveRunLevelTagFields}), matching the\n * `RunMeta` the run-list detail filter keys off, so `run_count` per group equals\n * the detail view's filtered run count. Per-row metrics (targets, evals, pass\n * rate, last run) are then accumulated into that one group.\n */\nasync function aggregateTagGroups(\n metas: readonly SourcedResultFileMeta[],\n key: string,\n opts: { searchDir: string; projectId?: string; pass_threshold: number },\n): Promise<\n Array<{\n name: string;\n run_count: number;\n target_count: number;\n eval_count: number;\n quality_count: number;\n passed_count: number;\n execution_error_count: number;\n pass_rate: number;\n last_run: string | null;\n }>\n> {\n const groupMap = new Map<\n string,\n {\n targets: Set<string>;\n runFilenames: Set<string>;\n evalCount: number;\n qualityCount: number;\n passedCount: number;\n executionErrorCount: number;\n lastTimestamp: string;\n }\n >();\n\n for (const m of metas) {\n try {\n const records = await loadLightweightResultsForMeta(opts.searchDir, m, opts.projectId);\n const summaryMetadata = readRunSummaryMetadataForDashboard(m.path);\n const value = resolveTagGroupValue(\n resolveRunLevelTagFields(m, records, summaryMetadata),\n key,\n );\n const entry = groupMap.get(value) ?? {\n targets: new Set<string>(),\n runFilenames: new Set<string>(),\n evalCount: 0,\n qualityCount: 0,\n passedCount: 0,\n executionErrorCount: 0,\n lastTimestamp: '',\n };\n entry.runFilenames.add(m.filename);\n for (const r of records) {\n if (r.target) entry.targets.add(r.target);\n entry.evalCount++;\n if (isExecutionErrorResult(r)) {\n entry.executionErrorCount++;\n } else {\n entry.qualityCount++;\n if (r.score >= opts.pass_threshold) entry.passedCount++;\n }\n if (r.timestamp && r.timestamp > entry.lastTimestamp) {\n entry.lastTimestamp = r.timestamp;\n }\n }\n groupMap.set(value, entry);\n } catch {\n // skip runs that fail to load\n }\n }\n\n return [...groupMap.entries()].map(([name, entry]) => ({\n name,\n run_count: entry.runFilenames.size,\n target_count: entry.targets.size,\n eval_count: entry.evalCount,\n quality_count: entry.qualityCount,\n passed_count: entry.passedCount,\n execution_error_count: entry.executionErrorCount,\n pass_rate: entry.qualityCount > 0 ? entry.passedCount / entry.qualityCount : 0,\n last_run: entry.lastTimestamp || null,\n }));\n}\n\n/**\n * Backward-compatible `GET /api/experiments` alias. Serves the legacy\n * `{ experiments: ExperimentSummary[] }` shape by grouping on the `experiment`\n * key, so existing clients keep working during the Tags-tab migration.\n */\nasync function handleExperiments(c: C, ctx: DataContext) {\n const { runs: metas } = await listMergedResultFiles(ctx.searchDir, undefined, ctx.projectId);\n const { threshold: pass_threshold } = loadStudioConfig(ctx.agentvDir);\n const experiments = await aggregateTagGroups(metas, EXPERIMENT_TAG_KEY, {\n searchDir: ctx.searchDir,\n projectId: ctx.projectId,\n pass_threshold,\n });\n return c.json({ experiments });\n}\n\nasync function handleCompare(c: C, { searchDir, agentvDir, projectId }: DataContext) {\n const { runs: metas } = await listMergedResultFiles(searchDir, undefined, projectId);\n const { threshold: pass_threshold } = loadStudioConfig(agentvDir);\n\n type CompareTestEntry = {\n test_id: string;\n target: string;\n category?: string;\n score: number;\n passed: boolean;\n execution_status?: string;\n answer?: string;\n answer_path?: string;\n output_path?: string;\n grading_path?: string;\n transcript_path?: string;\n metrics_path?: string;\n result_dir?: string;\n duration_ms?: number;\n token_usage?: {\n input?: number;\n output?: number;\n reasoning?: number;\n };\n };\n\n const readAnswerPreview = (\n manifestPath: string,\n relativePath: string | undefined,\n ): string | undefined => {\n if (!relativePath) return undefined;\n const resolved = resolveReadableRunArtifactFile(\n runWorkspaceDirFromManifestPath(manifestPath),\n relativePath,\n );\n if (!resolved.absolutePath) return undefined;\n try {\n const text = readFileSync(resolved.absolutePath, 'utf8').trim();\n const maxLength = 2000;\n return text.length > maxLength ? `${text.slice(0, maxLength)}…` : text;\n } catch {\n return undefined;\n }\n };\n\n const toCompareTestEntry = (\n manifestPath: string,\n record: Awaited<ReturnType<typeof loadLightweightResultsForMeta>>[number],\n passed: boolean,\n ): CompareTestEntry => {\n const target = record.target ?? 'default';\n const answer = readAnswerPreview(manifestPath, record.answerPath ?? record.outputPath);\n return {\n test_id: record.testId,\n target,\n ...(record.category && { category: normalizeCategoryPath(record.category) }),\n score: record.score,\n passed,\n execution_status: record.executionStatus,\n ...(answer && { answer }),\n ...(record.answerPath && { answer_path: record.answerPath }),\n ...(record.outputPath && { output_path: record.outputPath }),\n ...(record.gradingPath && { grading_path: record.gradingPath }),\n ...(record.transcriptPath && { transcript_path: record.transcriptPath }),\n ...(record.metricsPath && { metrics_path: record.metricsPath }),\n ...(record.resultDir && { result_dir: record.resultDir }),\n ...(record.durationMs !== undefined && { duration_ms: record.durationMs }),\n ...(record.tokenUsage && { token_usage: record.tokenUsage }),\n };\n };\n\n // Collect per-test-case results keyed by experiment × target (aggregated view)\n const cellMap = new Map<\n string,\n {\n experiment: string;\n target: string;\n evalCount: number;\n qualityCount: number;\n passedCount: number;\n executionErrorCount: number;\n scoreSum: number;\n tests: CompareTestEntry[];\n }\n >();\n\n // Per-run entries (per-run view). Each run workspace contributes exactly\n // one entry, independent of the aggregated matrix.\n const runEntries: Array<{\n run_id: string;\n started_at: string;\n experiment: string;\n target: string;\n targets: string[];\n source: 'local' | 'remote';\n eval_count: number;\n quality_count: number;\n passed_count: number;\n execution_error_count: number;\n pass_rate: number;\n avg_score: number;\n tests: CompareTestEntry[];\n }> = [];\n\n const experimentsSet = new Set<string>();\n const targetsSet = new Set<string>();\n const MAX_TESTS_PER_CELL = 100;\n\n for (const m of metas) {\n try {\n const records = await loadLightweightResultsForMeta(searchDir, m, projectId);\n const runTestMap = new Map<string, CompareTestEntry>();\n const runTargetsSet = new Set<string>();\n let runEvalCount = 0;\n let runQualityCount = 0;\n let runPassedCount = 0;\n let runExecutionErrorCount = 0;\n let runScoreSum = 0;\n let runExperiment = 'default';\n let runTarget = 'default';\n let runStartedAt = m.timestamp;\n\n for (const r of records) {\n // Resolve experiment with the same lockstep tags.experiment fallback the\n // Tags tab uses (`resolveTagGroupValue` on the reserved key), so a run\n // never appears under a different experiment name across tabs.\n const experiment = resolveTagGroupValue(r, EXPERIMENT_TAG_KEY);\n const target = r.target ?? 'default';\n experimentsSet.add(experiment);\n targetsSet.add(target);\n runTargetsSet.add(target);\n runExperiment = experiment;\n runTarget = target;\n if (r.timestamp && r.timestamp < runStartedAt) runStartedAt = r.timestamp;\n\n const key = JSON.stringify([experiment, target]);\n const entry = cellMap.get(key) ?? {\n experiment,\n target,\n evalCount: 0,\n qualityCount: 0,\n passedCount: 0,\n executionErrorCount: 0,\n scoreSum: 0,\n tests: [],\n };\n const isExecutionError = isExecutionErrorResult(r);\n const passed = !isExecutionError && r.score >= pass_threshold;\n entry.evalCount++;\n if (isExecutionError) {\n entry.executionErrorCount++;\n } else {\n entry.qualityCount++;\n if (passed) entry.passedCount++;\n entry.scoreSum += r.score;\n }\n entry.tests.push(toCompareTestEntry(m.path, r, passed));\n cellMap.set(key, entry);\n\n // Per-run accumulation. Dedupe each provider/model result within the\n // run by last-wins while preserving the provider axis for comparison.\n runTestMap.set(`${r.testId}::${target}`, toCompareTestEntry(m.path, r, passed));\n runEvalCount++;\n if (isExecutionError) {\n runExecutionErrorCount++;\n } else {\n runQualityCount++;\n if (passed) runPassedCount++;\n runScoreSum += r.score;\n }\n }\n\n if (runEvalCount === 0) continue;\n\n const runTests = [...runTestMap.values()].slice(-MAX_TESTS_PER_CELL);\n const runTargets = [...runTargetsSet].sort();\n runEntries.push({\n run_id: m.filename,\n started_at: runStartedAt,\n experiment: runExperiment,\n target: runTargets.length > 1 ? `${runTargets.length} providers` : runTarget,\n targets: runTargets,\n source: m.source,\n eval_count: runEvalCount,\n quality_count: runQualityCount,\n passed_count: runPassedCount,\n execution_error_count: runExecutionErrorCount,\n pass_rate: runQualityCount > 0 ? runPassedCount / runQualityCount : 0,\n avg_score: runQualityCount > 0 ? runScoreSum / runQualityCount : 0,\n tests: runTests,\n });\n } catch {\n // skip runs that fail to load\n }\n }\n\n // ── Baseline delta / normalized-gain computation ─────────────────────\n const baselineTarget = c.req.query('baseline') ?? '';\n if (baselineTarget && !targetsSet.has(baselineTarget)) {\n return c.json({ error: `Baseline target \"${baselineTarget}\" does not exist in the data` }, 400);\n }\n\n // Build baseline lookup before constructing cells so we can include\n // delta/normalized_gain in the initial cell objects (no mutation needed).\n const baselineScores = new Map<string, number>();\n if (baselineTarget) {\n for (const entry of cellMap.values()) {\n if (entry.target === baselineTarget && entry.qualityCount > 0) {\n baselineScores.set(entry.experiment, entry.scoreSum / entry.qualityCount);\n }\n }\n }\n\n const cells = [...cellMap.values()].map((entry) => {\n // Deduplicate tests: keep only the latest entry per test_id (last wins by insertion order)\n const dedupMap = new Map<string, (typeof entry.tests)[number]>();\n for (const t of entry.tests) {\n dedupMap.set(t.test_id, t);\n }\n const dedupedTests = [...dedupMap.values()];\n\n // Cap to most recent entries to prevent unbounded payloads\n const cappedTests = dedupedTests.slice(-MAX_TESTS_PER_CELL);\n\n const avgScore = entry.qualityCount > 0 ? entry.scoreSum / entry.qualityCount : 0;\n const cell: Record<string, unknown> = {\n experiment: entry.experiment,\n target: entry.target,\n eval_count: entry.evalCount,\n quality_count: entry.qualityCount,\n passed_count: entry.passedCount,\n execution_error_count: entry.executionErrorCount,\n pass_rate: entry.qualityCount > 0 ? entry.passedCount / entry.qualityCount : 0,\n avg_score: avgScore,\n tests: cappedTests,\n };\n\n // Append baseline comparison fields when a baseline is selected\n if (baselineTarget && entry.target !== baselineTarget) {\n const baseAvg = baselineScores.get(entry.experiment);\n if (baseAvg !== undefined) {\n cell.delta = Math.round((avgScore - baseAvg) * 1000) / 1000;\n cell.normalized_gain =\n baseAvg >= 1.0 ? null : Math.round(((avgScore - baseAvg) / (1 - baseAvg)) * 1000) / 1000;\n }\n }\n\n return cell;\n });\n\n // Per-run entries sorted by timestamp descending (newest first).\n runEntries.sort((a, b) => b.started_at.localeCompare(a.started_at));\n\n return c.json({\n experiments: [...experimentsSet].sort(),\n targets: [...targetsSet].sort(),\n cells,\n runs: runEntries,\n });\n}\n\nasync function handleTargets(c: C, { searchDir, agentvDir, projectId }: DataContext) {\n const { runs: metas } = await listMergedResultFiles(searchDir, undefined, projectId);\n const { threshold: pass_threshold } = loadStudioConfig(agentvDir);\n const targetMap = new Map<\n string,\n {\n experiments: Set<string>;\n runFilenames: Set<string>;\n evalCount: number;\n qualityCount: number;\n passedCount: number;\n executionErrorCount: number;\n }\n >();\n\n for (const m of metas) {\n try {\n const records = await loadLightweightResultsForMeta(searchDir, m, projectId);\n for (const r of records) {\n const target = r.target ?? 'default';\n const entry = targetMap.get(target) ?? {\n experiments: new Set<string>(),\n runFilenames: new Set<string>(),\n evalCount: 0,\n qualityCount: 0,\n passedCount: 0,\n executionErrorCount: 0,\n };\n entry.runFilenames.add(m.filename);\n if (r.experiment) entry.experiments.add(r.experiment);\n entry.evalCount++;\n if (isExecutionErrorResult(r)) {\n entry.executionErrorCount++;\n } else {\n entry.qualityCount++;\n if (r.score >= pass_threshold) entry.passedCount++;\n }\n targetMap.set(target, entry);\n }\n } catch {\n // skip runs that fail to load\n }\n }\n\n const targets = [...targetMap.entries()].map(([name, entry]) => ({\n name,\n run_count: entry.runFilenames.size,\n experiment_count: entry.experiments.size,\n eval_count: entry.evalCount,\n quality_count: entry.qualityCount,\n passed_count: entry.passedCount,\n execution_error_count: entry.executionErrorCount,\n pass_rate: entry.qualityCount > 0 ? entry.passedCount / entry.qualityCount : 0,\n }));\n\n return c.json({ targets });\n}\n\nfunction handleConfig(\n c: C,\n { agentvDir, searchDir }: DataContext,\n options?: { readOnly?: boolean; projectDashboard?: boolean; currentProjectId?: string },\n) {\n const config = loadStudioConfig(agentvDir);\n return c.json({\n threshold: config.threshold,\n app_name: config.appName,\n read_only: options?.readOnly === true,\n project_name: path.basename(searchDir),\n project_dashboard: options?.projectDashboard === true,\n ...(options?.currentProjectId && { current_project_id: options.currentProjectId }),\n });\n}\n\nfunction expandHomePath(inputPath: string): string {\n if (inputPath === '~') return homedir();\n if (inputPath.startsWith('~/') || inputPath.startsWith('~\\\\')) {\n return path.join(homedir(), inputPath.slice(2));\n }\n return inputPath;\n}\n\nfunction resolveBrowsePath(inputPath: string | undefined, cwd: string): string {\n const trimmed = inputPath?.trim() ?? '';\n const expanded = trimmed.length > 0 ? expandHomePath(trimmed) : cwd;\n return path.resolve(cwd, expanded);\n}\n\nfunction hasAgentvDir(dirPath: string): boolean {\n try {\n return statSync(path.join(dirPath, '.agentv')).isDirectory();\n } catch {\n return false;\n }\n}\n\ninterface DirectoryBrowseEntry {\n name: string;\n path: string;\n hasAgentv: boolean;\n}\n\ninterface DirectoryBrowseResult {\n path: string;\n parentPath?: string;\n current: DirectoryBrowseEntry;\n entries: DirectoryBrowseEntry[];\n}\n\nfunction directoryBrowseEntry(dirPath: string): DirectoryBrowseEntry {\n return {\n name: path.basename(dirPath) || dirPath,\n path: dirPath,\n hasAgentv: hasAgentvDir(dirPath),\n };\n}\n\nfunction browseFilesystemDirectories(\n inputPath: string | undefined,\n cwd: string,\n): DirectoryBrowseResult {\n const browsePath = resolveBrowsePath(inputPath, cwd);\n\n if (!existsSync(browsePath)) {\n throw new Error(`Directory not found: ${browsePath}`);\n }\n\n let stats: ReturnType<typeof statSync>;\n try {\n stats = statSync(browsePath);\n } catch (err) {\n throw new Error(`Unable to read directory: ${(err as Error).message}`);\n }\n\n if (!stats.isDirectory()) {\n throw new Error(`Not a directory: ${browsePath}`);\n }\n\n let entries: DirectoryBrowseEntry[];\n try {\n entries = readdirSync(browsePath, { withFileTypes: true })\n .map((entry) => {\n const entryPath = path.join(browsePath, entry.name);\n if (entry.isDirectory()) return directoryBrowseEntry(entryPath);\n if (entry.isSymbolicLink()) {\n try {\n return statSync(entryPath).isDirectory() ? directoryBrowseEntry(entryPath) : null;\n } catch {\n return null;\n }\n }\n return null;\n })\n .filter((entry): entry is ReturnType<typeof directoryBrowseEntry> => entry !== null)\n .sort((a, b) => {\n if (a.hasAgentv !== b.hasAgentv) return a.hasAgentv ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n } catch (err) {\n throw new Error(`Unable to read directory: ${(err as Error).message}`);\n }\n\n const parentPath = path.dirname(browsePath);\n return {\n path: browsePath,\n parentPath: parentPath !== browsePath ? parentPath : undefined,\n current: directoryBrowseEntry(browsePath),\n entries,\n };\n}\n\nfunction directoryBrowseEntryToWire(entry: DirectoryBrowseEntry) {\n return {\n name: entry.name,\n path: entry.path,\n has_agentv: entry.hasAgentv,\n };\n}\n\nfunction directoryBrowseResultToWire(result: DirectoryBrowseResult) {\n return {\n path: result.path,\n ...(result.parentPath !== undefined && { parent_path: result.parentPath }),\n current: directoryBrowseEntryToWire(result.current),\n entries: result.entries.map(directoryBrowseEntryToWire),\n };\n}\n\nasync function handleRunDelete(c: C, { searchDir, projectId }: DataContext) {\n const filename = c.req.param('filename') ?? '';\n const meta = await findRunById(searchDir, filename, projectId);\n if (!meta) return c.json({ error: 'Run not found' }, 404);\n if (meta.source === 'remote') {\n return c.json({ error: 'Run deletion is only available for local runs' }, 400);\n }\n if (getActiveRunStatus(meta.path) === 'starting' || getActiveRunStatus(meta.path) === 'running') {\n return c.json({ error: 'Run is still active' }, 409);\n }\n\n try {\n const deleted = deleteLocalRun(searchDir, filename);\n return c.json({ ok: true, run_id: deleted.runId });\n } catch (err) {\n return c.json({ error: (err as Error).message }, 400);\n }\n}\n\nfunction validateLocalCompletedRun(\n searchDir: string,\n meta: SourcedResultFileMeta,\n actionName = 'Run combine',\n): { ok: true } | { error: string; status: 400 | 409 } {\n if (meta.source === 'remote') {\n return { error: `${actionName} is only available for local runs`, status: 400 };\n }\n if (getActiveRunStatus(meta.path) === 'starting' || getActiveRunStatus(meta.path) === 'running') {\n return { error: 'Run is still active', status: 409 };\n }\n\n const manifestPath = path.resolve(meta.path);\n if (!isRunManifestPath(manifestPath)) {\n return { error: 'Run workspace is invalid', status: 400 };\n }\n\n const runDir = path.dirname(manifestPath);\n if (relativeRunPathFromCwd(searchDir, runDir) && existsSync(runDir)) {\n return { ok: true };\n }\n return { error: 'Run workspace is outside the local results directory', status: 400 };\n}\n\nasync function handleRunsCombine(c: C, { searchDir, projectId }: DataContext) {\n let body: unknown;\n try {\n body = await c.req.json();\n } catch {\n return c.json({ error: 'Invalid JSON' }, 400);\n }\n if (!body || typeof body !== 'object') {\n return c.json({ error: 'Invalid payload' }, 400);\n }\n\n const payload = body as Record<string, unknown>;\n const runIds = payload.run_ids;\n if (!Array.isArray(runIds) || !runIds.every((id) => typeof id === 'string' && id.trim())) {\n return c.json({ error: 'Missing run_ids array' }, 400);\n }\n if (runIds.length < 2) {\n return c.json({ error: 'Select at least two runs to combine' }, 400);\n }\n const uniqueRunIds = new Set(runIds);\n if (uniqueRunIds.size !== runIds.length) {\n return c.json({ error: 'Duplicate run_ids are not allowed' }, 400);\n }\n const displayNameValue = payload.display_name;\n if (displayNameValue !== undefined && typeof displayNameValue !== 'string') {\n return c.json({ error: 'display_name must be a string' }, 400);\n }\n const experimentValue = payload.experiment;\n if (experimentValue !== undefined && typeof experimentValue !== 'string') {\n return c.json({ error: 'experiment must be a string' }, 400);\n }\n const duplicatePolicyValue = payload.duplicate_policy;\n const duplicatePolicy =\n duplicatePolicyValue === undefined ? 'error' : String(duplicatePolicyValue);\n if (duplicatePolicy !== 'error' && duplicatePolicy !== 'latest') {\n return c.json({ error: 'duplicate_policy must be error or latest' }, 400);\n }\n\n const displayName = displayNameValue?.trim();\n const experiment = experimentValue?.trim() || undefined;\n const metas: SourcedResultFileMeta[] = [];\n\n for (const runId of runIds) {\n const meta = await findRunById(searchDir, runId, projectId);\n if (!meta) return c.json({ error: `Run not found: ${runId}` }, 404);\n const safe = validateLocalCompletedRun(searchDir, meta);\n if ('error' in safe) return c.json({ error: safe.error }, safe.status);\n metas.push(meta);\n }\n\n try {\n const sources = buildCombineRunSources(\n metas.map((meta) => meta.path),\n searchDir,\n {\n ids: runIds,\n displayNames: metas.map((meta) => meta.displayName),\n },\n );\n const combined = combineRunSources({\n cwd: searchDir,\n sources,\n experiment,\n displayName,\n duplicatePolicy: duplicatePolicy as Exclude<CombineDuplicatePolicy, 'prompt'>,\n });\n return c.json(\n {\n ok: true,\n run_id: combined.runId,\n display_name: combined.displayName,\n experiment: combined.experiment,\n combined_from_run_ids: combined.combinedFromRunIds,\n duplicate_conflicts: combined.duplicateConflicts,\n },\n 201,\n );\n } catch (err) {\n if (err instanceof CombineDuplicateError) {\n return c.json({ error: err.message, duplicates: err.conflicts }, 409);\n }\n const message = err instanceof Error ? err.message : String(err);\n if (\n message.includes('requires an experiment name') ||\n message.includes('must inherit') ||\n message.includes('must match combined experiment') ||\n message.includes('Invalid experiment name')\n ) {\n return c.json({ error: message }, 400);\n }\n return c.json({ error: message }, 500);\n }\n}\n\n// ── Hono app factory ─────────────────────────────────────────────────────\n\n/**\n * Create a Hono app with dashboard and result picker API routes.\n * Accepts an empty results array for the empty-state dashboard.\n */\nexport function createApp(\n results: EvaluationResult[],\n resultDir: string,\n cwd?: string,\n sourceFile?: string,\n options?: {\n studioDir?: string;\n readOnly?: boolean;\n projectDashboard?: boolean;\n currentProjectId?: string;\n },\n): Hono {\n const searchDir = cwd ?? resultDir;\n const agentvDir = path.join(searchDir, '.agentv');\n const defaultCtx: DataContext = { searchDir, agentvDir, projectId: options?.currentProjectId };\n const readOnly = options?.readOnly === true;\n const app = new Hono();\n\n // ── Benchmark resolution wrapper ──────────────────────────────────────\n // Resolves projectId → DataContext, returning 404 if not found. The\n // registry is re-read on every request, so edits to config.yaml (or\n // POST /api/projects) take effect without restarting the server.\n function withProject(\n c: C,\n handler: (c: C, ctx: DataContext) => Response | Promise<Response>,\n ): Response | Promise<Response> {\n const project = getProject(c.req.param('projectId') ?? '');\n if (!project || !existsSync(project.path)) {\n return c.json({ error: 'Project not found' }, 404);\n }\n return handler(c, {\n searchDir: project.path,\n agentvDir: path.join(project.path, '.agentv'),\n projectId: project.id,\n });\n }\n\n // ── Dashboard configuration ──────────────────────────────────────────────\n\n app.post('/api/config', async (c) => {\n if (readOnly) {\n return c.json({ error: 'Dashboard is running in read-only mode' }, 403);\n }\n try {\n const body = await c.req.json<Partial<StudioConfig>>();\n const current = loadStudioConfig(agentvDir);\n const updated = { ...current, ...body };\n if (typeof updated.threshold === 'number') {\n updated.threshold = Math.min(1, Math.max(0, updated.threshold));\n }\n saveStudioConfig(agentvDir, updated);\n return c.json(updated);\n } catch {\n return c.json({ error: 'Failed to save config' }, 500);\n }\n });\n\n // ── Benchmark management endpoints ───────────────────────────────────\n\n /** Convert a ProjectEntry to snake_case wire format. */\n function projectEntryToWire(entry: {\n id: string;\n path: string;\n addedAt: string;\n lastOpenedAt: string;\n }) {\n return {\n id: entry.id,\n path: entry.path,\n added_at: entry.addedAt,\n last_opened_at: entry.lastOpenedAt,\n };\n }\n\n async function summarizeProjectRunMetas(project: { id: string; path: string }) {\n const { runs: metas } = await listMergedResultFiles(project.path, undefined, project.id);\n const threshold = loadStudioConfig(path.join(project.path, '.agentv')).threshold;\n let passRateSum = 0;\n let executionErrorCount = 0;\n\n for (const meta of metas) {\n try {\n const records = shouldHydrateRunRecordsForList(meta)\n ? await loadLightweightResultsForMeta(project.path, meta, project.id)\n : [];\n if (records.length > 0) {\n const qualitySummary = summarizeQualityResults(records, threshold);\n passRateSum += qualitySummary.passRate;\n executionErrorCount += qualitySummary.executionErrorCount;\n continue;\n }\n } catch {\n // Fall back to metadata below when materialized rows are unavailable.\n }\n passRateSum += meta.passRate;\n executionErrorCount += meta.executionErrorCount ?? 0;\n }\n\n return {\n runCount: metas.length,\n passRate: metas.length > 0 ? passRateSum / metas.length : 0,\n executionErrorCount,\n lastRun: metas.length > 0 ? metas[0].timestamp : null,\n };\n }\n\n app.get('/api/projects', async (c) => {\n const registry = loadProjectRegistry();\n const projects = await Promise.all(\n registry.projects.map(async (p) => {\n let summary = {\n runCount: 0,\n passRate: 0,\n executionErrorCount: 0,\n lastRun: null as string | null,\n };\n try {\n summary = await summarizeProjectRunMetas(p);\n } catch {\n // Project path may be missing or inaccessible\n }\n return {\n ...projectEntryToWire(p),\n run_count: summary.runCount,\n pass_rate: summary.passRate,\n execution_error_count: summary.executionErrorCount,\n last_run: summary.lastRun,\n };\n }),\n );\n return c.json({ projects });\n });\n\n app.get('/api/filesystem/browse', (c) => {\n try {\n return c.json(\n directoryBrowseResultToWire(browseFilesystemDirectories(c.req.query('path'), searchDir)),\n );\n } catch (err) {\n return c.json({ error: (err as Error).message }, 400);\n }\n });\n\n app.post('/api/projects', async (c) => {\n if (readOnly) {\n return c.json({ error: 'Dashboard is running in read-only mode' }, 403);\n }\n try {\n const body = await c.req.json<{ path: string }>();\n if (!body.path) return c.json({ error: 'Missing path' }, 400);\n const entry = addProject(body.path);\n return c.json(projectEntryToWire(entry), 201);\n } catch (err) {\n return c.json({ error: (err as Error).message }, 400);\n }\n });\n\n app.get('/api/projects/:projectId/summary', async (c) => {\n const project = getProject(c.req.param('projectId') ?? '');\n if (!project) return c.json({ error: 'Project not found' }, 404);\n try {\n const summary = await summarizeProjectRunMetas(project);\n return c.json({\n id: project.id,\n path: project.path,\n run_count: summary.runCount,\n pass_rate: summary.passRate,\n execution_error_count: summary.executionErrorCount,\n last_run: summary.lastRun,\n });\n } catch {\n return c.json({ error: 'Failed to read project' }, 500);\n }\n });\n\n /** Aggregate runs from all registered projects, sorted by timestamp descending. */\n app.get('/api/projects/all-runs', async (c) => {\n const registry = loadProjectRegistry();\n const allRuns: Array<{\n filename: string;\n display_name: string;\n path: string;\n timestamp: string;\n test_count: number;\n pass_rate: number;\n avg_score: number;\n execution_error_count: number;\n size_bytes: number;\n target?: string;\n experiment?: string;\n runtime_source?: RunRuntimeSourceMetadata;\n source: 'local' | 'remote';\n project_id: string;\n }> = [];\n\n for (const p of registry.projects) {\n try {\n const { runs: metas } = await listMergedResultFiles(p.path, undefined, p.id);\n for (const m of metas) {\n let target = m.target;\n let experiment = m.experiment ?? inferExperimentFromRunId(m.raw_filename);\n const summaryMetadata = readRunSummaryMetadataForDashboard(m.path);\n let runtimeSource: RunRuntimeSourceMetadata | undefined = summaryMetadata.runtimeSource;\n let passRate = m.passRate;\n let avgScore = m.avgScore;\n let executionErrorCount = m.executionErrorCount ?? 0;\n try {\n const records = shouldHydrateRunRecordsForList(m)\n ? await loadLightweightResultsForMeta(p.path, m, p.id)\n : [];\n if (records.length > 0) {\n const qualitySummary = summarizeQualityResults(\n records,\n loadStudioConfig(path.join(p.path, '.agentv')).threshold,\n );\n target = records[0].target;\n experiment = records[0].experiment ?? experiment;\n passRate = qualitySummary.passRate;\n avgScore = qualitySummary.avgScore;\n executionErrorCount = qualitySummary.executionErrorCount;\n runtimeSource = deriveDashboardRuntimeSource({\n summaryMetadata,\n records,\n });\n }\n } catch {\n // ignore enrichment errors\n }\n allRuns.push({\n filename: m.filename,\n display_name: m.displayName,\n path: m.path,\n timestamp: m.timestamp,\n test_count: m.testCount,\n pass_rate: passRate,\n avg_score: avgScore,\n execution_error_count: executionErrorCount,\n size_bytes: m.sizeBytes,\n source: m.source,\n ...(target && { target }),\n ...(experiment && { experiment }),\n ...(runtimeSource && { runtime_source: runtimeSource }),\n project_id: p.id,\n });\n }\n } catch {\n // skip inaccessible projects\n }\n }\n\n allRuns.sort(compareRunsByTimestampDesc);\n return c.json({ runs: allRuns });\n });\n\n app.delete('/api/projects/:projectId', (c) => {\n if (readOnly) {\n return c.json({ error: 'Dashboard is running in read-only mode' }, 403);\n }\n const removed = removeProject(c.req.param('projectId') ?? '');\n if (!removed) return c.json({ error: 'Project not found' }, 404);\n return c.json({ ok: true });\n });\n\n // ── Data routes (unscoped) ────────────────────────────────────────────\n\n app.get('/api/config', (c) =>\n handleConfig(c, defaultCtx, {\n readOnly,\n projectDashboard: options?.projectDashboard,\n currentProjectId: options?.currentProjectId,\n }),\n );\n app.get('/api/remote/status', async (c) =>\n c.json(await getRemoteResultsStatus(searchDir, defaultCtx.projectId)),\n );\n app.post('/api/remote/sync', async (c) =>\n c.json(await syncRemoteResults(searchDir, defaultCtx.projectId)),\n );\n app.post('/api/remote/sync/confirm-merge', async (c) =>\n c.json(await confirmRemoteResultsMerge(searchDir, defaultCtx.projectId)),\n );\n app.get('/api/runs', (c) => handleRuns(c, defaultCtx));\n app.post('/api/runs/combine', (c) => {\n if (readOnly) {\n return c.json({ error: 'Dashboard is running in read-only mode' }, 403);\n }\n return handleRunsCombine(c, defaultCtx);\n });\n app.delete('/api/runs/:filename', (c) => {\n if (readOnly) {\n return c.json({ error: 'Dashboard is running in read-only mode' }, 403);\n }\n return handleRunDelete(c, defaultCtx);\n });\n app.get('/api/runs/:filename', (c) => handleRunDetail(c, defaultCtx));\n app.get('/api/runs/:filename/log', (c) => handleRunLog(c, defaultCtx));\n app.get('/api/runs/:filename/suites', (c) => handleRunSuites(c, defaultCtx));\n app.get('/api/runs/:filename/categories', (c) => handleRunCategories(c, defaultCtx));\n app.get('/api/runs/:filename/categories/:category/suites', (c) =>\n handleCategorySuites(c, defaultCtx),\n );\n app.get('/api/runs/:filename/evals/:evalId', (c) => handleEvalDetail(c, defaultCtx));\n app.get('/api/runs/:filename/evals/:evalId/trace-session', (c) =>\n handleEvalTraceSession(c, defaultCtx),\n );\n app.get('/api/runs/:filename/evals/:evalId/transcript', (c) =>\n handleEvalTranscript(c, defaultCtx),\n );\n app.get('/api/runs/:filename/evals/:evalId/files', (c) => handleEvalFiles(c, defaultCtx));\n app.get('/api/runs/:filename/evals/:evalId/files/*', (c) => handleEvalFileContent(c, defaultCtx));\n app.get('/api/tags', (c) => handleTags(c, defaultCtx));\n app.get('/api/experiments', (c) => handleExperiments(c, defaultCtx));\n app.get('/api/compare', (c) => handleCompare(c, defaultCtx));\n app.get('/api/targets', (c) => handleTargets(c, defaultCtx));\n\n // Aggregated index (unscoped only)\n app.get('/api/index', async (c) => {\n const { runs: metas } = await listMergedResultFiles(searchDir, undefined, defaultCtx.projectId);\n const entries = await Promise.all(\n metas.map(async (m) => {\n let totalCostUsd = 0;\n let passRate = m.passRate;\n let avgScore = m.avgScore;\n let testCount = m.testCount;\n let executionErrorCount = m.executionErrorCount ?? 0;\n try {\n const records = shouldHydrateRunRecordsForList(m)\n ? await loadLightweightResultsForMeta(searchDir, m, defaultCtx.projectId)\n : [];\n totalCostUsd = records.reduce((sum, r) => sum + (r.costUsd ?? 0), 0);\n if (records.length > 0) {\n const qualitySummary = summarizeQualityResults(\n records,\n loadStudioConfig(agentvDir).threshold,\n );\n testCount = qualitySummary.totalCount;\n passRate = qualitySummary.passRate;\n avgScore = qualitySummary.avgScore;\n executionErrorCount = qualitySummary.executionErrorCount;\n }\n } catch {\n // ignore load errors for aggregate\n }\n return {\n run_filename: m.filename,\n display_name: m.displayName,\n test_count: testCount,\n pass_rate: passRate,\n avg_score: avgScore,\n execution_error_count: executionErrorCount,\n total_cost_usd: totalCostUsd,\n timestamp: m.timestamp,\n };\n }),\n );\n return c.json({ entries });\n });\n\n // ── Data routes (project-scoped) ───────────────────────────────────\n // Same handlers as above, with project-resolved DataContext via withProject.\n\n app.get('/api/projects/:projectId/config', (c) =>\n withProject(c, (ctx, dataCtx) =>\n handleConfig(ctx, dataCtx, {\n readOnly,\n projectDashboard: options?.projectDashboard,\n }),\n ),\n );\n app.get('/api/projects/:projectId/remote/status', (c) =>\n withProject(c, async (ctx, dataCtx) =>\n ctx.json(await getRemoteResultsStatus(dataCtx.searchDir, dataCtx.projectId)),\n ),\n );\n app.post('/api/projects/:projectId/remote/sync', (c) =>\n withProject(c, async (ctx, dataCtx) =>\n ctx.json(await syncRemoteResults(dataCtx.searchDir, dataCtx.projectId)),\n ),\n );\n app.post('/api/projects/:projectId/remote/sync/confirm-merge', (c) =>\n withProject(c, async (ctx, dataCtx) =>\n ctx.json(await confirmRemoteResultsMerge(dataCtx.searchDir, dataCtx.projectId)),\n ),\n );\n app.get('/api/projects/:projectId/runs', (c) => withProject(c, handleRuns));\n app.post('/api/projects/:projectId/runs/combine', (c) => {\n if (readOnly) {\n return c.json({ error: 'Dashboard is running in read-only mode' }, 403);\n }\n return withProject(c, handleRunsCombine);\n });\n app.delete('/api/projects/:projectId/runs/:filename', (c) => {\n if (readOnly) {\n return c.json({ error: 'Dashboard is running in read-only mode' }, 403);\n }\n return withProject(c, handleRunDelete);\n });\n app.get('/api/projects/:projectId/runs/:filename', (c) => withProject(c, handleRunDetail));\n app.get('/api/projects/:projectId/runs/:filename/log', (c) => withProject(c, handleRunLog));\n app.get('/api/projects/:projectId/runs/:filename/suites', (c) => withProject(c, handleRunSuites));\n app.get('/api/projects/:projectId/runs/:filename/categories', (c) =>\n withProject(c, handleRunCategories),\n );\n app.get('/api/projects/:projectId/runs/:filename/categories/:category/suites', (c) =>\n withProject(c, handleCategorySuites),\n );\n app.get('/api/projects/:projectId/runs/:filename/evals/:evalId', (c) =>\n withProject(c, handleEvalDetail),\n );\n app.get('/api/projects/:projectId/runs/:filename/evals/:evalId/trace-session', (c) =>\n withProject(c, handleEvalTraceSession),\n );\n app.get('/api/projects/:projectId/runs/:filename/evals/:evalId/transcript', (c) =>\n withProject(c, handleEvalTranscript),\n );\n app.get('/api/projects/:projectId/runs/:filename/evals/:evalId/files', (c) =>\n withProject(c, handleEvalFiles),\n );\n app.get('/api/projects/:projectId/runs/:filename/evals/:evalId/files/*', (c) =>\n withProject(c, handleEvalFileContent),\n );\n app.get('/api/projects/:projectId/tags', (c) => withProject(c, handleTags));\n app.get('/api/projects/:projectId/experiments', (c) => withProject(c, handleExperiments));\n app.get('/api/projects/:projectId/compare', (c) => withProject(c, handleCompare));\n app.get('/api/projects/:projectId/targets', (c) => withProject(c, handleTargets));\n // ── Eval runner routes (discovery, launch, status) ────────────────────\n\n registerEvalRoutes(\n app,\n (c) => {\n // For project-scoped routes, resolve to project path; otherwise use searchDir\n const projectId = c.req.param('projectId');\n if (projectId) {\n const project = getProject(projectId);\n if (project) return project.path;\n }\n return searchDir;\n },\n { readOnly },\n );\n\n // ── Static file serving for Dashboard SPA ────────────────────────────────\n\n const studioDistPath = options?.studioDir ?? resolveStudioDistDir();\n if (!studioDistPath || !existsSync(path.join(studioDistPath, 'index.html'))) {\n throw new Error(\n 'Dashboard dist not found. Run \"bun run build\" in apps/dashboard/ to build the SPA.',\n );\n }\n\n app.get('/', (c) => {\n const indexPath = path.join(studioDistPath, 'index.html');\n if (existsSync(indexPath)) return c.html(readFileSync(indexPath, 'utf8'));\n return c.notFound();\n });\n\n app.get('/assets/*', (c) => {\n const assetPath = c.req.path;\n const filePath = path.join(studioDistPath, assetPath);\n if (!existsSync(filePath)) return c.notFound();\n const content = readFileSync(filePath);\n const ext = path.extname(filePath);\n const mimeTypes: Record<string, string> = {\n '.js': 'application/javascript',\n '.css': 'text/css',\n '.html': 'text/html',\n '.json': 'application/json',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.woff2': 'font/woff2',\n '.woff': 'font/woff',\n };\n const contentType = mimeTypes[ext] ?? 'application/octet-stream';\n return new Response(content, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': 'public, max-age=31536000, immutable',\n },\n });\n });\n\n // SPA fallback: serve index.html for any non-API route that isn't matched\n app.get('*', (c) => {\n if (c.req.path.startsWith('/api/')) return c.json({ error: 'Not found' }, 404);\n const indexPath = path.join(studioDistPath, 'index.html');\n if (existsSync(indexPath)) return c.html(readFileSync(indexPath, 'utf8'));\n return c.notFound();\n });\n\n return app;\n}\n\n/**\n * Resolve the path to the dashboard dist directory.\n *\n * Searches several candidate locations covering:\n * - Running from TypeScript source (`bun apps/cli/src/cli.ts`)\n * - Running from built dist (`bun apps/cli/dist/cli.js`)\n * - Published npm package (dashboard bundled inside `dist/dashboard/`)\n */\nfunction resolveStudioDistDir(): string | undefined {\n const currentDir =\n typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n // From src/commands/results/ → sibling apps/dashboard/dist\n path.resolve(currentDir, '../../../../dashboard/dist'),\n // From dist/ → sibling apps/dashboard/dist (monorepo dev)\n path.resolve(currentDir, '../../dashboard/dist'),\n // Bundled inside CLI dist (published package: dist/dashboard/)\n path.resolve(currentDir, 'dashboard'),\n // From dist/ in monorepo root context\n path.resolve(currentDir, '../../../apps/dashboard/dist'),\n ];\n for (const candidate of candidates) {\n if (existsSync(candidate) && existsSync(path.join(candidate, 'index.html'))) {\n return candidate;\n }\n }\n return undefined;\n}\n\n// ── CLI command ──────────────────────────────────────────────────────────\n\nexport const resultsServeCommand = command({\n name: 'dashboard',\n description:\n 'Start AgentV Dashboard - the zero-infra local viewer for AgentV-owned result artifacts',\n args: {\n source: positional({\n type: optional(string),\n displayName: 'source',\n description:\n 'Legacy direct run source (unsupported); use --dir <project-dir> or results: config',\n }),\n port: option({\n type: optional(number),\n long: 'port',\n short: 'p',\n description: 'Port to listen on (flag → PORT env var → 3117)',\n }),\n dir: option({\n type: optional(string),\n long: 'dir',\n short: 'd',\n description: 'Working directory (default: current directory)',\n }),\n single: flag({\n long: 'single',\n description: 'Force single-project dashboard mode',\n }),\n add: option({\n type: optional(string),\n long: 'add',\n description: 'Register a project by path',\n }),\n remove: option({\n type: optional(string),\n long: 'remove',\n description: 'Unregister a project by ID',\n }),\n readOnly: flag({\n long: 'read-only',\n description: 'Disable write operations and launch Dashboard in read-only leaderboard mode',\n }),\n },\n handler: async ({ source, port, dir, single, add, remove, readOnly }) => {\n const cwd = dir ?? process.cwd();\n const listenPort = port ?? (process.env.PORT ? Number(process.env.PORT) : 3117);\n\n // ── Benchmark management commands (non-server) ───────────────────\n if (add) {\n try {\n const entry = addProject(add);\n console.log(`Registered project: ${entry.id} at ${entry.path}`);\n } catch (err) {\n console.error(`Error: ${(err as Error).message}`);\n process.exit(1);\n }\n return;\n }\n\n if (remove) {\n const removed = removeProject(remove);\n if (removed) {\n console.log(`Unregistered project: ${remove}`);\n } else {\n console.error(`Project not found: ${remove}`);\n process.exit(1);\n }\n return;\n }\n\n // ── Version check ────────────────────────────────────────────────\n // Check `required_version` from .agentv/config.yaml so Dashboard/serve\n // match `agentv eval` behavior. Version mismatches are advisory by\n // default. Single-project scope only — when one agentv instance serves\n // multiple repos with differing version requirements, a per-project local\n // install is required instead.\n const repoRoot = await findRepoRoot(cwd);\n const yamlConfig = await loadConfig(path.join(cwd, '_'), repoRoot);\n if (yamlConfig?.required_version) {\n await enforceRequiredVersion(yamlConfig.required_version);\n }\n\n const { currentProjectId } = bootstrapCurrentProject(cwd, { single });\n\n // ── Determine dashboard mode ─────────────────────────────────────\n const registry = loadProjectRegistry();\n const { projectDashboard } = resolveDashboardMode(registry.projects.length, { single });\n\n // ── Project sync preflight ───────────────────────────────────────\n // Clone or pull any project entries that declare a source.\n // Non-blocking: fire-and-forget so startup is instant even when some\n // project paths are missing or slow (e.g. /tmp paths that timeout).\n syncProjects(registry.projects).catch((err) =>\n console.error('Background project sync failed:', err),\n );\n\n try {\n let results: EvaluationResult[] = [];\n let sourceFile: string | undefined;\n\n // Reject unsupported direct sources. Otherwise, auto-discover the\n // project's configured run workspace and fall back to the empty state.\n if (source) {\n sourceFile = await resolveSourceFile(source, cwd);\n results = loadManifestResults(sourceFile, { hydrateTranscriptTrace: false });\n } else {\n // Auto-discover: run cache -> directory scan -> empty state\n const cache = await loadRunCache(cwd);\n const cachedFile = cache ? resolveRunCacheFile(cache) : '';\n if (\n cachedFile &&\n existsSync(cachedFile) &&\n relativeRunPathFromCwd(cwd, path.dirname(cachedFile))\n ) {\n sourceFile = cachedFile;\n results = loadManifestResults(cachedFile, { hydrateTranscriptTrace: false });\n } else {\n const metas = listResultFiles(cwd, 1);\n if (metas.length > 0) {\n sourceFile = metas[0].path;\n results = loadManifestResults(metas[0].path, { hydrateTranscriptTrace: false });\n }\n // If no metas, results stays empty — dashboard shows welcome state\n }\n }\n\n const resultDir = sourceFile ? path.dirname(path.resolve(sourceFile)) : cwd;\n const app = createApp(results, resultDir, cwd, sourceFile, {\n readOnly,\n projectDashboard,\n currentProjectId,\n });\n\n if (projectDashboard) {\n console.log(`Project dashboard: ${registry.projects.length} project(s) registered`);\n if (currentProjectId) {\n console.log(`Default project: ${currentProjectId}`);\n }\n } else if (results.length > 0 && sourceFile) {\n console.log(`Serving ${results.length} result(s) from ${sourceFile}`);\n } else {\n console.log('No results found. Dashboard will show an empty state.');\n console.log('Run an evaluation to see results: agentv eval <eval-file>');\n }\n console.log(`Dashboard: http://localhost:${listenPort}`);\n console.log(`Projects API: http://localhost:${listenPort}/api/projects`);\n console.log('Press Ctrl+C to stop');\n\n const { serve: startServer } = await import('@hono/node-server');\n startServer({\n fetch: app.fetch,\n port: listenPort,\n });\n await new Promise(() => {});\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n },\n});\n","/**\n * Dashboard eval runner — discovery, launch, and status tracking for eval runs\n * initiated from the Dashboard UI.\n *\n * Provides Hono route handlers for:\n * - GET /api/eval/discover — discover eval files in the project\n * - GET /api/eval/targets — list available provider labels\n * - POST /api/eval/run — launch an eval run as a child process\n * - GET /api/eval/status/:id — poll running eval status\n * - GET /api/eval/runs — list active and recent Dashboard-launched runs\n *\n * All handlers accept a `cwd` (project root) to resolve paths against.\n * The module spawns `bun apps/cli/src/cli.ts eval run ...` and tracks\n * process state in memory.\n *\n * Stdout/stderr are also persisted to `<outputDir>/console.log` so that\n * RunDetail can show the full captured log after the in-memory buffers are\n * pruned. The static log file is served by the run-log routes registered in\n * `serve.ts` via `getActiveRunStatus`/`getActiveRunTarget` cross-referencing.\n */\n\nimport { type ChildProcess, execFileSync, spawn } from 'node:child_process';\nimport { type WriteStream, createWriteStream, existsSync, mkdirSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { listProviderLabels, readProviderDefinitions } from '@agentv/core';\nimport type { Context } from 'hono';\nimport type { Hono } from 'hono';\n\nimport { PROVIDER_FILE_CANDIDATES } from '../../utils/providers.js';\nimport { discoverEvalFiles } from '../eval/discover.js';\nimport {\n RESULT_INDEX_FILENAME,\n buildDefaultRunDir,\n normalizeExperimentName,\n} from '../eval/result-layout.js';\nimport { findRepoRoot } from '../eval/shared.js';\n\n// ── In-memory run tracker ────────────────────────────────────────────────\n\ninterface DashboardRun {\n id: string;\n status: 'starting' | 'running' | 'finished' | 'failed';\n command: string;\n /** Provider label passed via --provider (if any). Stored so the run list can show it before the first result is written. */\n target?: string;\n /** Absolute path to the run directory (e.g. .agentv/results/<run_id>). Used to correlate this in-memory run with the filesystem run when the JSONL has 0 records yet. */\n outputDir?: string;\n startedAt: string;\n finishedAt?: string;\n exitCode?: number | null;\n stdout: string;\n stderr: string;\n process?: ChildProcess;\n}\n\nconst activeRuns = new Map<string, DashboardRun>();\n\nfunction generateRunId(): string {\n const now = new Date();\n const pad = (n: number, w = 2) => String(n).padStart(w, '0');\n const ts = `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;\n const rand = Math.random().toString(36).slice(2, 6);\n return `dashboard-${ts}-${rand}`;\n}\n\n// Keep only last 20 finished runs to prevent unbounded memory growth\nfunction pruneFinishedRuns() {\n const finished = [...activeRuns.entries()]\n .filter(([, r]) => r.status === 'finished' || r.status === 'failed')\n .sort((a, b) => (b[1].finishedAt ?? '').localeCompare(a[1].finishedAt ?? ''));\n if (finished.length > 20) {\n for (const [id] of finished.slice(20)) {\n activeRuns.delete(id);\n }\n }\n}\n\n/**\n * Look up the target for a Dashboard-launched run by its run manifest path.\n * Called by handleRuns in serve.ts when the JSONL has 0 records (run just started).\n */\nexport function getActiveRunTarget(indexJsonlPath: string): string | undefined {\n for (const run of activeRuns.values()) {\n if (run.outputDir && path.join(run.outputDir, RESULT_INDEX_FILENAME) === indexJsonlPath) {\n return run.target;\n }\n }\n return undefined;\n}\n\n/**\n * Look up the in-memory status for a Dashboard-launched run by its manifest path.\n * Returns 'starting' | 'running' | 'finished' | 'failed' if the run is tracked,\n * else undefined. Used by handleRuns to render a spinner for active runs in the\n * RunList instead of a misleading red ✗ derived from a 0 pass-rate.\n */\nexport function getActiveRunStatus(indexJsonlPath: string): DashboardRun['status'] | undefined {\n for (const run of activeRuns.values()) {\n if (run.outputDir && path.join(run.outputDir, RESULT_INDEX_FILENAME) === indexJsonlPath) {\n return run.status;\n }\n }\n return undefined;\n}\n\n// ── Discover providers file from project root ────────────────────────────\n\nasync function discoverTargetsInProject(cwd: string): Promise<readonly string[]> {\n const repoRoot = (await findRepoRoot(cwd)) ?? cwd;\n\n // Try to find a providers file using the standard discovery\n let targetsFilePath: string | undefined;\n for (const candidate of PROVIDER_FILE_CANDIDATES) {\n const fullPath = path.join(cwd, candidate);\n if (existsSync(fullPath)) {\n targetsFilePath = fullPath;\n break;\n }\n }\n if (!targetsFilePath) {\n for (const candidate of PROVIDER_FILE_CANDIDATES) {\n const fullPath = path.join(repoRoot, candidate);\n if (existsSync(fullPath)) {\n targetsFilePath = fullPath;\n break;\n }\n }\n }\n\n if (!targetsFilePath) return [];\n\n try {\n const definitions = await readProviderDefinitions(targetsFilePath);\n return listProviderLabels(definitions);\n } catch {\n return [];\n }\n}\n\n// ── Build CLI command from request body ──────────────────────────────────\n\ninterface RunEvalRequest {\n suite_filter?: string;\n test_ids?: string[];\n target?: string;\n experiment?: string;\n threshold?: number;\n workers?: number;\n /** Resume an interrupted run: skip already-completed tests and append results to `output`. */\n resume?: boolean;\n /** Re-run failed/errored tests while keeping passing results. */\n rerun_failed?: boolean;\n /** Path to a previous run dir or run manifest — re-run only execution_error cases. */\n retry_errors?: string;\n /** Artifact directory for run output. Required when resume/rerun_failed are set without auto-detect. */\n output?: string;\n}\n\n/**\n * Validate mutually-exclusive resume modes.\n * Returns an error message if invalid, or undefined if valid.\n */\nfunction validateResumeOptions(req: RunEvalRequest): string | undefined {\n const modes: string[] = [];\n if (req.resume) modes.push('resume');\n if (req.rerun_failed) modes.push('rerun_failed');\n if (req.retry_errors?.trim()) {\n modes.push('retry_errors');\n }\n if (modes.length > 1) {\n return `resume, rerun_failed, and retry_errors are mutually exclusive (got: ${modes.join(', ')})`;\n }\n if (req.rerun_failed && !req.output?.trim()) {\n return 'rerun_failed requires output to identify the prior run workspace';\n }\n return undefined;\n}\n\nfunction normalizeRunMetadata(req: RunEvalRequest): { experiment: string } {\n const experiment = normalizeExperimentName(req.experiment);\n if ((req.resume || req.rerun_failed) && req.experiment?.trim()) {\n throw new Error('experiment cannot be changed when resuming an existing run');\n }\n return { experiment };\n}\n\nfunction buildCliArgs(req: RunEvalRequest, experiment?: string): string[] {\n const args: string[] = ['eval'];\n\n // Suite filter (eval paths/globs)\n if (req.suite_filter?.trim()) {\n for (const part of req.suite_filter.split(',')) {\n const trimmed = part.trim();\n if (trimmed) args.push(trimmed);\n }\n }\n\n // Test ID filters\n if (req.test_ids && req.test_ids.length > 0) {\n for (const id of req.test_ids) {\n const trimmed = id.trim();\n if (trimmed) {\n args.push('--test-id', trimmed);\n }\n }\n }\n\n // Provider override\n if (req.target?.trim()) {\n args.push('--provider', req.target.trim());\n }\n\n if (experiment && req.experiment?.trim()) {\n args.push('--experiment', experiment);\n }\n\n // Threshold\n if (req.threshold !== undefined && req.threshold !== null) {\n args.push('--threshold', String(req.threshold));\n }\n\n // Workers\n if (req.workers !== undefined && req.workers !== null) {\n args.push('--workers', String(req.workers));\n }\n\n // Resume / rerun-failed / retry-errors / output\n if (req.output?.trim()) {\n args.push('--output', req.output.trim());\n }\n if (req.resume) {\n args.push('--resume');\n }\n if (req.rerun_failed) {\n args.push('--rerun-failed', req.output?.trim() ?? '');\n }\n if (req.retry_errors?.trim()) {\n args.push('--retry-errors', req.retry_errors.trim());\n }\n\n return args;\n}\n\nfunction buildCliPreview(args: string[]): string {\n return `agentv ${args.map((a) => (a.includes(' ') || a.includes('*') ? `\"${a}\"` : a)).join(' ')}`;\n}\n\n// ── Resolve the bun + cli.ts path ────────────────────────────────────────\n\nfunction resolveCliPath(cwd: string): { binPath: string; args: string[] } | undefined {\n // 1. Try to find cli.ts in the project (monorepo dev context)\n const candidates = [\n path.join(cwd, 'apps/cli/src/cli.ts'),\n path.join(cwd, 'apps/cli/dist/cli.js'),\n ];\n for (const c of candidates) {\n if (existsSync(c)) {\n return { binPath: 'bun', args: [c] };\n }\n }\n\n // 2. Try from the current running process location (handles both CJS __dirname\n // and ESM import.meta.url; fileURLToPath works correctly on Windows).\n // Layouts we can be loaded from:\n // - dev/source: this module sits at apps/cli/src/commands/results/eval-runner.ts,\n // so cli.ts is two dirs up at apps/cli/src/cli.ts.\n // - bundled dist: tsup emits the chunk into apps/cli/dist/, alongside cli.js,\n // so the entry is in the same directory as currentDir.\n const currentDir =\n typeof __dirname !== 'undefined' ? __dirname : path.dirname(fileURLToPath(import.meta.url));\n const fromSrc = path.resolve(currentDir, '../../cli.ts');\n const fromDist = path.resolve(currentDir, 'cli.js');\n\n if (existsSync(fromSrc)) return { binPath: 'bun', args: [fromSrc] };\n if (existsSync(fromDist)) return { binPath: 'bun', args: [fromDist] };\n\n // 3. Fall back to the globally installed `agentv` command.\n // This covers npm/bun global installs where source files aren't adjacent.\n if (isCommandAvailable('agentv')) {\n return { binPath: 'agentv', args: [] };\n }\n\n return undefined;\n}\n\nfunction isCommandAvailable(cmd: string): boolean {\n try {\n execFileSync(process.platform === 'win32' ? 'where' : 'which', [cmd], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Open a writable stream to `<outputDir>/console.log` for persisting the\n * spawned eval process's combined stdout/stderr. Returns `undefined` when the\n * directory cannot be created or the file cannot be opened — callers fall back\n * to the in-memory buffer in that case.\n *\n * The log file is the source of truth shown by the RunDetail \"Run Log\"\n * section after the run completes. The in-memory `stdout`/`stderr` buffers on\n * `DashboardRun` remain capped for live status polling.\n *\n * Stream `error` events (e.g. the output dir was removed underneath us by a\n * test teardown) are swallowed so they don't surface as unhandled errors and\n * fail unrelated tests.\n */\nfunction openConsoleLogStream(outputDir: string): WriteStream | undefined {\n try {\n mkdirSync(outputDir, { recursive: true });\n const stream = createWriteStream(path.join(outputDir, 'console.log'), { flags: 'w' });\n stream.on('error', () => {\n /* best-effort log capture; ignore filesystem errors */\n });\n return stream;\n } catch {\n return undefined;\n }\n}\n\n// ── Route registration ───────────────────────────────────────────────────\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono Context generic varies by route\ntype C = Context<any, any, any>;\n\nexport function registerEvalRoutes(\n app: Hono,\n getCwd: (c: C) => string,\n options?: { readOnly?: boolean },\n) {\n const readOnly = options?.readOnly === true;\n // ── Discovery: eval files ──────────────────────────────────────────────\n app.get('/api/eval/discover', async (c) => {\n const cwd = getCwd(c);\n try {\n const files = await discoverEvalFiles(cwd);\n return c.json({\n eval_files: files.map((f) => ({\n path: f.path,\n relative_path: f.relativePath,\n category: f.category,\n })),\n });\n } catch (err) {\n return c.json({ error: (err as Error).message, eval_files: [] }, 500);\n }\n });\n\n // ── Discovery: targets ─────────────────────────────────────────────────\n app.get('/api/eval/targets', async (c) => {\n const cwd = getCwd(c);\n try {\n const names = await discoverTargetsInProject(cwd);\n return c.json({ targets: names });\n } catch (err) {\n return c.json({ error: (err as Error).message, targets: [] }, 500);\n }\n });\n\n // ── Launch eval run ────────────────────────────────────────────────────\n app.post('/api/eval/run', async (c) => {\n if (readOnly) {\n return c.json({ error: 'Dashboard is running in read-only mode' }, 403);\n }\n const cwd = getCwd(c);\n\n let body: RunEvalRequest;\n try {\n body = await c.req.json<RunEvalRequest>();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n\n // Validate: need at least a suite filter\n if (!body.suite_filter?.trim() && (!body.test_ids || body.test_ids.length === 0)) {\n return c.json({ error: 'Provide suite_filter or test_ids' }, 400);\n }\n\n const resumeError = validateResumeOptions(body);\n if (resumeError) {\n return c.json({ error: resumeError }, 400);\n }\n\n let metadata: { experiment: string };\n try {\n metadata = normalizeRunMetadata(body);\n } catch (err) {\n return c.json({ error: (err as Error).message }, 400);\n }\n\n const cliPaths = resolveCliPath(cwd);\n if (!cliPaths) {\n return c.json({ error: 'Cannot locate agentv CLI entry point' }, 500);\n }\n\n const args = buildCliArgs(body, metadata.experiment);\n // Determine the output directory for this run. When the caller provides\n // an explicit --output (resume/rerun), use that path. Otherwise generate\n // the default path now so we can pass it via --output and later correlate\n // the filesystem run with this in-memory DashboardRun (needed to show the\n // target in the sidebar before any results have been written).\n const outputDir = body.output?.trim()\n ? path.resolve(cwd, body.output.trim())\n : buildDefaultRunDir(cwd, metadata.experiment);\n if (!body.output?.trim()) {\n args.push('--output', outputDir);\n }\n const command = buildCliPreview(args);\n const runId = generateRunId();\n\n const run: DashboardRun = {\n id: runId,\n status: 'starting',\n command,\n target: body.target?.trim() || undefined,\n outputDir,\n startedAt: new Date().toISOString(),\n stdout: '',\n stderr: '',\n };\n activeRuns.set(runId, run);\n\n try {\n const child = spawn(cliPaths.binPath, [...cliPaths.args, ...args], {\n cwd,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env },\n // Windows requires shell:true to execute .cmd/.bat wrappers (e.g. npm-installed agentv.cmd)\n shell: process.platform === 'win32',\n });\n\n run.process = child;\n run.status = 'running';\n\n const logStream = openConsoleLogStream(outputDir);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n logStream?.write(chunk);\n run.stdout += chunk.toString();\n // Cap buffer at 100KB\n if (run.stdout.length > 100_000) {\n run.stdout = run.stdout.slice(-80_000);\n }\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n logStream?.write(chunk);\n run.stderr += chunk.toString();\n if (run.stderr.length > 100_000) {\n run.stderr = run.stderr.slice(-80_000);\n }\n });\n\n child.on('close', (code) => {\n run.exitCode = code;\n run.status = code === 0 ? 'finished' : 'failed';\n run.finishedAt = new Date().toISOString();\n run.process = undefined;\n logStream?.end();\n pruneFinishedRuns();\n });\n\n child.on('error', (err) => {\n run.status = 'failed';\n run.stderr += `\\nProcess error: ${err.message}`;\n run.finishedAt = new Date().toISOString();\n run.process = undefined;\n logStream?.write(`\\nProcess error: ${err.message}\\n`);\n logStream?.end();\n });\n\n return c.json(\n {\n id: runId,\n status: run.status,\n command,\n },\n 202,\n );\n } catch (err) {\n run.status = 'failed';\n run.stderr = (err as Error).message;\n run.finishedAt = new Date().toISOString();\n return c.json({ error: (err as Error).message }, 500);\n }\n });\n\n // ── Stop a running eval ────────────────────────────────────────────────\n // POST (not DELETE) because Stop is part of the stop → resume → complete\n // workflow, not a destructive cancel. The run remains resumable from the\n // partial run manifest on disk. Idempotent: hitting /stop on a terminal\n // run returns 200 with `stopped: false, reason: 'already_terminal'`\n // rather than 4xx, so clients can fire-and-forget.\n //\n // SIGTERM the spawned CLI; the existing child.on('close') flips status\n // to 'finished'/'failed'. The CLI's own signal handler walks its tracked\n // grandchildren (claude/codex/pi/copilot subprocesses) and kills them\n // before exiting.\n app.post('/api/eval/run/:id/stop', (c) => {\n if (readOnly) {\n return c.json({ error: 'Dashboard is running in read-only mode' }, 403);\n }\n const id = c.req.param('id');\n const run = activeRuns.get(id ?? '');\n if (!run) return c.json({ error: 'Run not found' }, 404);\n if (run.status === 'finished' || run.status === 'failed' || !run.process) {\n return c.json({ stopped: false, reason: 'already_terminal', status: run.status });\n }\n try {\n run.process.kill('SIGTERM');\n } catch (err) {\n return c.json({ error: (err as Error).message }, 500);\n }\n return c.json({ stopped: true, status: run.status });\n });\n\n // ── Run status ─────────────────────────────────────────────────────────\n app.get('/api/eval/status/:id', (c) => {\n const id = c.req.param('id');\n const run = activeRuns.get(id ?? '');\n if (!run) return c.json({ error: 'Run not found' }, 404);\n\n return c.json({\n id: run.id,\n status: run.status,\n command: run.command,\n started_at: run.startedAt,\n finished_at: run.finishedAt ?? null,\n exit_code: run.exitCode ?? null,\n stdout: run.stdout.slice(-10_000),\n stderr: run.stderr.slice(-5_000),\n });\n });\n\n // ── List runs ──────────────────────────────────────────────────────────\n app.get('/api/eval/runs', (c) => {\n const runs = [...activeRuns.values()].map((r) => ({\n id: r.id,\n status: r.status,\n command: r.command,\n target: r.target,\n started_at: r.startedAt,\n finished_at: r.finishedAt ?? null,\n exit_code: r.exitCode ?? null,\n }));\n runs.sort((a, b) => b.started_at.localeCompare(a.started_at));\n return c.json({ runs });\n });\n\n // ── CLI preview (dry endpoint) ─────────────────────────────────────────\n app.post('/api/eval/preview', async (c) => {\n let body: RunEvalRequest;\n try {\n body = await c.req.json<RunEvalRequest>();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n\n let metadata: { experiment: string };\n try {\n metadata = normalizeRunMetadata(body);\n } catch (err) {\n return c.json({ error: (err as Error).message }, 400);\n }\n\n const args = buildCliArgs(body, metadata.experiment);\n return c.json({ command: buildCliPreview(args) });\n });\n\n // ── Project-scoped variants ────────────────────────────────────────────\n app.get('/api/projects/:projectId/eval/discover', async (c) => {\n const cwd = getCwd(c);\n try {\n const files = await discoverEvalFiles(cwd);\n return c.json({\n eval_files: files.map((f) => ({\n path: f.path,\n relative_path: f.relativePath,\n category: f.category,\n })),\n });\n } catch (err) {\n return c.json({ error: (err as Error).message, eval_files: [] }, 500);\n }\n });\n\n app.get('/api/projects/:projectId/eval/targets', async (c) => {\n const cwd = getCwd(c);\n try {\n const names = await discoverTargetsInProject(cwd);\n return c.json({ targets: names });\n } catch (err) {\n return c.json({ error: (err as Error).message, targets: [] }, 500);\n }\n });\n\n app.post('/api/projects/:projectId/eval/run', async (c) => {\n if (readOnly) {\n return c.json({ error: 'Dashboard is running in read-only mode' }, 403);\n }\n const cwd = getCwd(c);\n\n let body: RunEvalRequest;\n try {\n body = await c.req.json<RunEvalRequest>();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n\n if (!body.suite_filter?.trim() && (!body.test_ids || body.test_ids.length === 0)) {\n return c.json({ error: 'Provide suite_filter or test_ids' }, 400);\n }\n\n const resumeError = validateResumeOptions(body);\n if (resumeError) {\n return c.json({ error: resumeError }, 400);\n }\n\n let metadata: { experiment: string };\n try {\n metadata = normalizeRunMetadata(body);\n } catch (err) {\n return c.json({ error: (err as Error).message }, 400);\n }\n\n const cliPaths = resolveCliPath(cwd);\n if (!cliPaths) {\n return c.json({ error: 'Cannot locate agentv CLI entry point' }, 500);\n }\n\n const args = buildCliArgs(body, metadata.experiment);\n const outputDir = body.output?.trim()\n ? path.resolve(cwd, body.output.trim())\n : buildDefaultRunDir(cwd, metadata.experiment);\n if (!body.output?.trim()) {\n args.push('--output', outputDir);\n }\n const command = buildCliPreview(args);\n const runId = generateRunId();\n\n const run: DashboardRun = {\n id: runId,\n status: 'starting',\n command,\n target: body.target?.trim() || undefined,\n outputDir,\n startedAt: new Date().toISOString(),\n stdout: '',\n stderr: '',\n };\n activeRuns.set(runId, run);\n\n try {\n const child = spawn(cliPaths.binPath, [...cliPaths.args, ...args], {\n cwd,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env },\n shell: process.platform === 'win32',\n });\n\n run.process = child;\n run.status = 'running';\n\n const logStream = openConsoleLogStream(outputDir);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n logStream?.write(chunk);\n run.stdout += chunk.toString();\n if (run.stdout.length > 100_000) run.stdout = run.stdout.slice(-80_000);\n });\n child.stderr?.on('data', (chunk: Buffer) => {\n logStream?.write(chunk);\n run.stderr += chunk.toString();\n if (run.stderr.length > 100_000) run.stderr = run.stderr.slice(-80_000);\n });\n child.on('close', (code) => {\n run.exitCode = code;\n run.status = code === 0 ? 'finished' : 'failed';\n run.finishedAt = new Date().toISOString();\n run.process = undefined;\n logStream?.end();\n pruneFinishedRuns();\n });\n child.on('error', (err) => {\n run.status = 'failed';\n run.stderr += `\\nProcess error: ${err.message}`;\n run.finishedAt = new Date().toISOString();\n run.process = undefined;\n logStream?.write(`\\nProcess error: ${err.message}\\n`);\n logStream?.end();\n });\n\n return c.json({ id: runId, status: run.status, command }, 202);\n } catch (err) {\n run.status = 'failed';\n run.stderr = (err as Error).message;\n run.finishedAt = new Date().toISOString();\n return c.json({ error: (err as Error).message }, 500);\n }\n });\n\n app.post('/api/projects/:projectId/eval/run/:id/stop', (c) => {\n if (readOnly) {\n return c.json({ error: 'Dashboard is running in read-only mode' }, 403);\n }\n const id = c.req.param('id');\n const run = activeRuns.get(id ?? '');\n if (!run) return c.json({ error: 'Run not found' }, 404);\n if (run.status === 'finished' || run.status === 'failed' || !run.process) {\n return c.json({ stopped: false, reason: 'already_terminal', status: run.status });\n }\n try {\n run.process.kill('SIGTERM');\n } catch (err) {\n return c.json({ error: (err as Error).message }, 500);\n }\n return c.json({ stopped: true, status: run.status });\n });\n\n app.get('/api/projects/:projectId/eval/status/:id', (c) => {\n const id = c.req.param('id');\n const run = activeRuns.get(id ?? '');\n if (!run) return c.json({ error: 'Run not found' }, 404);\n return c.json({\n id: run.id,\n status: run.status,\n command: run.command,\n started_at: run.startedAt,\n finished_at: run.finishedAt ?? null,\n exit_code: run.exitCode ?? null,\n stdout: run.stdout.slice(-10_000),\n stderr: run.stderr.slice(-5_000),\n });\n });\n\n app.get('/api/projects/:projectId/eval/runs', (c) => {\n const runs = [...activeRuns.values()].map((r) => ({\n id: r.id,\n status: r.status,\n command: r.command,\n target: r.target,\n started_at: r.startedAt,\n finished_at: r.finishedAt ?? null,\n exit_code: r.exitCode ?? null,\n }));\n runs.sort((a, b) => b.started_at.localeCompare(a.started_at));\n return c.json({ runs });\n });\n\n app.post('/api/projects/:projectId/eval/preview', async (c) => {\n let body: RunEvalRequest;\n try {\n body = await c.req.json<RunEvalRequest>();\n } catch {\n return c.json({ error: 'Invalid JSON body' }, 400);\n }\n let metadata: { experiment: string };\n try {\n metadata = normalizeRunMetadata(body);\n } catch (err) {\n return c.json({ error: (err as Error).message }, 400);\n }\n const args = buildCliArgs(body, metadata.experiment);\n return c.json({ command: buildCliPreview(args) });\n });\n}\n","/**\n * Dashboard configuration loader.\n *\n * Reads dashboard-specific settings from the `dashboard:` section of\n * config.yaml plus optional config.local.yaml overlays. Project-local\n * `.agentv/config.yaml` / `.agentv/config.local.yaml` takes precedence over the\n * global `${AGENTV_HOME:-~/.agentv}/config.yaml` pair, with legacy `studio:`\n * and root-level threshold keys still accepted for compatibility. Saving\n * writes only to the project-local config.yaml file and preserves unrelated\n * fields.\n *\n * config.yaml format:\n * required_version: \">=4.2.0\"\n * dashboard:\n * app_name: AgentV # displayed in the Dashboard shell\n * threshold: 0.8 # score >= this value is considered \"pass\"\n *\n * Backward compat: reads `studio.threshold`, `studio.pass_threshold`, and\n * root-level `pass_threshold` as fallbacks. On save, always writes `threshold`\n * under `dashboard:`.\n *\n * If no config.yaml exists in either location, defaults are used.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport {\n DEFAULT_THRESHOLD,\n getAgentvConfigDir,\n getLocalConfigPath,\n mergeConfigObjects,\n parseYamlValue,\n} from '@agentv/core';\nimport { stringify as stringifyYaml } from 'yaml';\n\nexport interface StudioConfig {\n threshold: number;\n appName: string;\n}\n\nconst DEFAULTS: StudioConfig = {\n threshold: DEFAULT_THRESHOLD,\n appName: 'AgentV',\n};\n\n/**\n * Load dashboard config from `config.yaml` in the given `.agentv/` directory,\n * overlaid by sibling `config.local.yaml` when present.\n * Reads from `dashboard.threshold`, falling back to `dashboard.pass_threshold`,\n * `studio.threshold`, `studio.pass_threshold`, then root-level `pass_threshold`\n * for backward compatibility.\n * Returns defaults when the file does not exist or is empty.\n * Clamps `threshold` to [0, 1].\n */\nexport function loadStudioConfig(agentvDir: string): StudioConfig {\n const localConfigPath = path.join(agentvDir, 'config.yaml');\n const globalConfigPath = path.join(getAgentvConfigDir(), 'config.yaml');\n const localConfig = loadParsedConfigPair(localConfigPath);\n const globalConfig =\n path.resolve(path.dirname(globalConfigPath)) === path.resolve(path.dirname(localConfigPath))\n ? undefined\n : loadParsedConfigPair(globalConfigPath);\n\n const threshold = [\n readThreshold(localConfig?.dashboard),\n readThreshold(localConfig?.studio),\n typeof localConfig?.pass_threshold === 'number' ? localConfig.pass_threshold : undefined,\n readThreshold(globalConfig?.dashboard),\n readThreshold(globalConfig?.studio),\n typeof globalConfig?.pass_threshold === 'number' ? globalConfig.pass_threshold : undefined,\n DEFAULTS.threshold,\n ].find((value) => value !== undefined) as number;\n\n return {\n threshold: Math.min(1, Math.max(0, threshold)),\n appName:\n readAppName(localConfig?.dashboard) ??\n readAppName(globalConfig?.dashboard) ??\n DEFAULTS.appName,\n };\n}\n\nfunction loadParsedConfig(configPath: string): Record<string, unknown> | undefined {\n if (!existsSync(configPath)) return undefined;\n\n const raw = readFileSync(configPath, 'utf-8');\n const parsed = parseYamlValue(raw);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return undefined;\n return parsed as Record<string, unknown>;\n}\n\nfunction loadParsedConfigPair(configPath: string): Record<string, unknown> | undefined {\n const base = loadParsedConfig(configPath);\n const local = loadParsedConfig(getLocalConfigPath(configPath));\n if (base && local) return mergeConfigObjects(base, local);\n return local ?? base;\n}\n\nfunction readThreshold(section: unknown): number | undefined {\n if (!section || typeof section !== 'object' || Array.isArray(section)) return undefined;\n const values = section as Record<string, unknown>;\n if (typeof values.threshold === 'number') return values.threshold;\n if (typeof values.pass_threshold === 'number') return values.pass_threshold;\n return undefined;\n}\n\nfunction readAppName(section: unknown): string | undefined {\n if (!section || typeof section !== 'object' || Array.isArray(section)) return undefined;\n const value = (section as Record<string, unknown>).app_name;\n if (typeof value !== 'string') return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\n/**\n * Save dashboard config to `config.yaml` in the given `.agentv/` directory.\n * Merges into the existing file, preserving all non-dashboard fields\n * (required_version, eval_patterns, execution, etc.).\n * Writes dashboard settings under the `dashboard:` key and removes the legacy\n * `studio:` section after migrating any unknown legacy keys.\n * Creates the directory if it does not exist.\n */\nexport function saveStudioConfig(agentvDir: string, config: StudioConfig): void {\n if (!existsSync(agentvDir)) {\n mkdirSync(agentvDir, { recursive: true });\n }\n const configPath = path.join(agentvDir, 'config.yaml');\n\n // Read existing config to preserve non-dashboard fields.\n let existing: Record<string, unknown> = {};\n if (existsSync(configPath)) {\n const raw = readFileSync(configPath, 'utf-8');\n const parsed = parseYamlValue(raw);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n existing = parsed as Record<string, unknown>;\n }\n }\n\n // Remove legacy root-level pass_threshold\n const { pass_threshold: _, ...rest } = existing;\n existing = rest;\n\n // Migrate legacy studio fields into dashboard while dropping legacy threshold spellings.\n const existingDashboard = existing.dashboard;\n const existingStudio = existing.studio;\n const dashboardRest =\n existingDashboard && typeof existingDashboard === 'object' && !Array.isArray(existingDashboard)\n ? (({ pass_threshold: _, ...rest }) => rest)(existingDashboard as Record<string, unknown>)\n : {};\n const studioRest =\n existingStudio && typeof existingStudio === 'object' && !Array.isArray(existingStudio)\n ? (({ threshold: _, pass_threshold: __, ...rest }) => rest)(\n existingStudio as Record<string, unknown>,\n )\n : {};\n\n const { studio: _legacyStudio, ...withoutStudio } = existing;\n existing = {\n ...withoutStudio,\n dashboard: {\n ...studioRest,\n ...dashboardRest,\n threshold: config.threshold,\n app_name: config.appName,\n },\n };\n\n const yamlStr = stringifyYaml(existing);\n writeFileSync(configPath, yamlStr, 'utf-8');\n}\n","import { constants } from 'node:fs';\nimport { access, readFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport {\n parseYamlValue,\n readProviderDefinitions as readCoreProviderDefinitions,\n} from '@agentv/core';\nimport {\n array,\n command,\n flag,\n multioption,\n number,\n option,\n optional,\n positional,\n string,\n} from 'cmd-ts';\nimport { config as loadDotenv } from 'dotenv';\n\nimport {\n buildDefaultRunDir,\n createRunDirName,\n resolveRunManifestPath,\n} from '../eval/result-layout.js';\nimport { runEvalCommand } from '../eval/run-eval.js';\nimport { type ResultManifestRecord, parseResultManifest } from '../results/manifest.js';\n\nconst TASK_EVAL_FILENAME = 'EVAL.yaml';\nconst TASK_PROVIDERS_FILENAME = 'providers.yaml';\nconst TASK_TARGETS_FILENAME = 'targets.yaml';\nconst ENV_REF_PATTERN = /\\$\\{\\{\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*\\}\\}/g;\n\ninterface SelectedTaskBundle {\n readonly record: ResultManifestRecord;\n readonly testId: string;\n readonly sourceTarget: string;\n readonly resultDir: string;\n readonly testDir: string;\n readonly evalPath: string;\n readonly providersPath: string;\n readonly taskTarget: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction displayRecord(record: ResultManifestRecord): string {\n return `${record.test_id ?? 'unknown'}@${record.target ?? 'unknown'}`;\n}\n\nfunction resolveSourcePath(cwd: string, source: string): string {\n return path.isAbsolute(source) ? source : path.resolve(cwd, source);\n}\n\nfunction resolveRelativeRunPath(\n runDir: string,\n relativePath: string | undefined,\n): string | undefined {\n if (!relativePath || relativePath.trim().length === 0) {\n return undefined;\n }\n return path.resolve(runDir, relativePath);\n}\n\nasync function ensureFile(filePath: string, label: string): Promise<void> {\n try {\n await access(filePath, constants.F_OK);\n } catch {\n throw new Error(`${label} not found: ${filePath}`);\n }\n}\n\nfunction matchesAny(value: string, patterns: readonly string[]): boolean {\n return patterns.length === 0 || patterns.some((pattern) => matchesGlob(value, pattern));\n}\n\nfunction matchesGlob(value: string, pattern: string): boolean {\n let source = '';\n for (const char of pattern) {\n if (char === '*') {\n source += '.*';\n } else if (char === '?') {\n source += '.';\n } else {\n source += char.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n }\n return new RegExp(`^${source}$`).test(value);\n}\n\nfunction stringArray(value: unknown): readonly string[] {\n return Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === 'string' && entry.length > 0)\n : [];\n}\n\nfunction readExecutionTarget(parsedEval: unknown): string | undefined {\n if (!isRecord(parsedEval)) {\n return undefined;\n }\n const execution = parsedEval.execution;\n if (isRecord(execution) && typeof execution.target === 'string' && execution.target.length > 0) {\n return execution.target;\n }\n return typeof parsedEval.target === 'string' && parsedEval.target.length > 0\n ? parsedEval.target\n : undefined;\n}\n\nasync function readTaskTarget(evalPath: string, fallback: string): Promise<string> {\n const raw = await readFile(evalPath, 'utf8');\n return readExecutionTarget(parseYamlValue(raw)) ?? fallback;\n}\n\nasync function readRerunTargetDefinitions(\n providersPath: string,\n): Promise<readonly Record<string, unknown>[]> {\n const definitions = await readCoreProviderDefinitions(providersPath);\n return definitions.map((definition) => definition as unknown as Record<string, unknown>);\n}\n\nfunction targetName(definition: Record<string, unknown>): string | undefined {\n if (typeof definition.id === 'string' && definition.id.trim().length > 0) {\n return definition.id.trim();\n }\n if (typeof definition.label === 'string' && definition.label.trim().length > 0) {\n return definition.label.trim();\n }\n return typeof definition.name === 'string' && definition.name.trim().length > 0\n ? definition.name.trim()\n : undefined;\n}\n\nfunction resolveWholeEnvReference(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const match = value.trim().match(/^\\$\\{\\{\\s*([A-Za-z_][A-Za-z0-9_]*)\\s*\\}\\}$/);\n if (!match) {\n return value.trim().length > 0 ? value.trim() : undefined;\n }\n const resolved = process.env[match[1]];\n return resolved && resolved.trim().length > 0 ? resolved.trim() : undefined;\n}\n\nfunction referencedTargetNames(definition: Record<string, unknown>): readonly string[] {\n const names: string[] = [];\n for (const key of ['use_target', 'grader_target'] as const) {\n const resolved = resolveWholeEnvReference(definition[key]);\n if (resolved && !resolved.includes('${{')) {\n names.push(resolved);\n }\n }\n const fallbackTargets = definition.fallback_targets;\n if (Array.isArray(fallbackTargets)) {\n for (const entry of fallbackTargets) {\n const resolved = resolveWholeEnvReference(entry);\n if (resolved && !resolved.includes('${{')) {\n names.push(resolved);\n }\n }\n }\n return names;\n}\n\nfunction collectEnvRefs(value: unknown, names = new Set<string>()): Set<string> {\n if (typeof value === 'string') {\n for (const match of value.matchAll(ENV_REF_PATTERN)) {\n if (match[1]) {\n names.add(match[1]);\n }\n }\n return names;\n }\n if (Array.isArray(value)) {\n for (const entry of value) {\n collectEnvRefs(entry, names);\n }\n return names;\n }\n if (isRecord(value)) {\n for (const [key, entry] of Object.entries(value)) {\n if (key === 'required_env') {\n for (const required of stringArray(entry)) {\n names.add(required);\n }\n }\n collectEnvRefs(entry, names);\n }\n }\n return names;\n}\n\nasync function validateTargetFile(\n providersPath: string,\n targetNames: readonly string[],\n label: string,\n): Promise<void> {\n const definitions = await readRerunTargetDefinitions(providersPath);\n const byName = new Map<string, Record<string, unknown>>();\n for (const definition of definitions) {\n const name = targetName(definition);\n if (name) {\n byName.set(name, definition);\n }\n }\n\n const missingTargets = [...new Set(targetNames)].filter((name) => !byName.has(name));\n if (missingTargets.length > 0) {\n throw new Error(\n `${label} is incompatible: ${providersPath} does not define provider(s): ${missingTargets.join(\n ', ',\n )}`,\n );\n }\n\n const envRefs = new Set<string>();\n const seenTargets = new Set<string>();\n const visit = (name: string) => {\n if (seenTargets.has(name)) {\n return;\n }\n const definition = byName.get(name);\n if (!definition) {\n return;\n }\n seenTargets.add(name);\n collectEnvRefs(definition, envRefs);\n for (const referencedName of referencedTargetNames(definition)) {\n visit(referencedName);\n }\n };\n for (const name of targetNames) {\n visit(name);\n }\n\n const missingEnv = [...envRefs].filter((name) => {\n const value = process.env[name];\n return value === undefined || value.trim().length === 0;\n });\n if (missingEnv.length > 0) {\n throw new Error(\n `Missing environment variable(s) required by ${providersPath}: ${missingEnv.join(\n ', ',\n )}. Provide --env-file <path> or export them before rerun.`,\n );\n }\n}\n\nfunction isInsideOrSame(root: string, candidate: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(candidate));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction forbiddenOutputRoots(\n sourceRunDir: string,\n selected: readonly SelectedTaskBundle[],\n): readonly string[] {\n return [\n path.resolve(sourceRunDir),\n ...selected.flatMap((bundle) => [path.resolve(bundle.resultDir), path.resolve(bundle.testDir)]),\n ];\n}\n\nfunction assertOutputIsSeparate(outputDir: string, roots: readonly string[]): void {\n const forbiddenRoot = roots.find((root) => isInsideOrSame(root, outputDir));\n if (!forbiddenRoot) {\n return;\n }\n throw new Error(\n `Refusing to write rerun output inside the source bundle. Output: ${outputDir}; source: ${forbiddenRoot}`,\n );\n}\n\nfunction defaultOutputDir(\n cwd: string,\n sourceRunDir: string,\n selected: readonly SelectedTaskBundle[],\n experiment?: string,\n): string {\n const roots = forbiddenOutputRoots(sourceRunDir, selected);\n const candidate = buildDefaultRunDir(cwd, experiment ?? 'rerun');\n if (!roots.some((root) => isInsideOrSame(root, candidate))) {\n return candidate;\n }\n return path.join(path.dirname(path.resolve(sourceRunDir)), `rerun-${createRunDirName()}`);\n}\n\nasync function loadEnvFile(\n envFile: string | undefined,\n cwd: string,\n verbose: boolean,\n): Promise<void> {\n if (!envFile) {\n return;\n }\n const resolved = path.isAbsolute(envFile) ? envFile : path.resolve(cwd, envFile);\n await ensureFile(resolved, 'Environment file');\n const loaded = loadDotenv({ path: resolved, override: false });\n if (loaded.error) {\n throw loaded.error;\n }\n if (verbose) {\n console.log(`Loaded environment from: ${resolved}`);\n }\n}\n\nasync function loadSelectedTaskBundles(options: {\n readonly indexPath: string;\n readonly sourceRunDir: string;\n readonly testIds: readonly string[];\n readonly sourceTargets: readonly string[];\n}): Promise<readonly SelectedTaskBundle[]> {\n const content = await readFile(options.indexPath, 'utf8');\n const records = parseResultManifest(content);\n if (records.length === 0) {\n throw new Error(`Run manifest contains no result rows: ${options.indexPath}`);\n }\n\n const selected: SelectedTaskBundle[] = [];\n for (const record of records) {\n const testId = record.test_id ?? 'unknown';\n const sourceTarget = record.target ?? 'unknown';\n if (!matchesAny(testId, options.testIds) || !matchesAny(sourceTarget, options.sourceTargets)) {\n continue;\n }\n\n const recordLabel = displayRecord(record);\n const bundleDir = record.test_dir ?? record.task_dir;\n const evalPath =\n resolveRelativeRunPath(options.sourceRunDir, record.eval_path) ??\n resolveRelativeRunPath(\n options.sourceRunDir,\n bundleDir && `${bundleDir}/${TASK_EVAL_FILENAME}`,\n );\n const rawRecord = record as unknown as Record<string, unknown>;\n const legacyTargetsPath =\n typeof rawRecord.targets_path === 'string' ? rawRecord.targets_path : undefined;\n const providersPath =\n resolveRelativeRunPath(options.sourceRunDir, record.providers_path) ??\n resolveRelativeRunPath(options.sourceRunDir, legacyTargetsPath) ??\n resolveRelativeRunPath(\n options.sourceRunDir,\n bundleDir && `${bundleDir}/${TASK_PROVIDERS_FILENAME}`,\n ) ??\n resolveRelativeRunPath(\n options.sourceRunDir,\n bundleDir && `${bundleDir}/${TASK_TARGETS_FILENAME}`,\n );\n const testDir =\n resolveRelativeRunPath(options.sourceRunDir, bundleDir) ??\n (evalPath ? path.dirname(evalPath) : undefined);\n const resultDir =\n resolveRelativeRunPath(options.sourceRunDir, record.result_dir) ??\n (testDir ? path.dirname(testDir) : undefined);\n\n if (!evalPath || !providersPath || !testDir || !resultDir) {\n throw new Error(\n `Selected result ${recordLabel} is missing test bundle paths. Re-run requires test/EVAL.yaml and test/providers.yaml.`,\n );\n }\n\n await ensureFile(evalPath, `Test eval for ${recordLabel}`);\n await ensureFile(providersPath, `Test providers for ${recordLabel}`);\n const taskTarget = await readTaskTarget(evalPath, sourceTarget);\n selected.push({\n record,\n testId,\n sourceTarget,\n resultDir,\n testDir,\n evalPath,\n providersPath,\n taskTarget,\n });\n }\n\n if (selected.length === 0) {\n throw new Error(\n 'No captured test bundles matched the provided --test-id/--source-target filters.',\n );\n }\n return selected;\n}\n\nfunction buildSourceMetadataByEvalFile(\n sourceRunDir: string,\n indexPath: string,\n selected: readonly SelectedTaskBundle[],\n): ReadonlyMap<string, Record<string, unknown>> {\n return new Map(\n selected.map((bundle) => [\n path.resolve(bundle.evalPath),\n {\n rerunSource: {\n mode: 'rerun',\n sourceRunDir: path.resolve(sourceRunDir),\n sourceIndexPath: path.resolve(indexPath),\n sourceResultDir: path.resolve(bundle.resultDir),\n sourceTestDir: path.resolve(bundle.testDir),\n sourceTestId: bundle.testId,\n sourceTarget: bundle.sourceTarget,\n sourceTimestamp: bundle.record.timestamp,\n },\n },\n ]),\n );\n}\n\nfunction buildProviderCatalogPathByEvalFile(\n selected: readonly SelectedTaskBundle[],\n overrideProvidersPath?: string,\n): ReadonlyMap<string, string> {\n return new Map(\n selected.map((bundle) => [\n path.resolve(bundle.evalPath),\n overrideProvidersPath\n ? path.resolve(overrideProvidersPath)\n : path.resolve(bundle.providersPath),\n ]),\n );\n}\n\nexport const runsRerunCommand = command({\n name: 'rerun',\n description: 'Rerun captured test bundles with local target environment',\n args: {\n runDir: positional({\n type: string,\n displayName: 'run-dir',\n description: 'Run workspace directory or run manifest containing test bundles',\n }),\n testId: multioption({\n type: array(string),\n long: 'test-id',\n description: 'Only rerun captured test ID(s); glob supported, repeatable',\n }),\n sourceTarget: multioption({\n type: array(string),\n long: 'source-target',\n description: 'Only rerun captured source target(s); glob supported, repeatable',\n }),\n target: multioption({\n type: array(string),\n long: 'target',\n description: 'Override target name(s) for the new eval run',\n }),\n targets: option({\n type: optional(string),\n long: 'targets',\n description: 'Path to replacement providers.yaml for the new eval run',\n }),\n envFile: option({\n type: optional(string),\n long: 'env-file',\n description: 'Load local environment variables from a dotenv file before rerun',\n }),\n output: option({\n type: optional(string),\n long: 'output',\n short: 'o',\n description: 'Artifact directory for the new rerun output',\n }),\n experiment: option({\n type: optional(string),\n long: 'experiment',\n description: 'Experiment label for default rerun output (default: rerun)',\n }),\n workers: option({\n type: optional(number),\n long: 'workers',\n description: 'Number of parallel test cases within each task eval file',\n }),\n dryRun: flag({\n long: 'dry-run',\n description: 'Use mock provider responses instead of real provider calls',\n }),\n verbose: flag({\n long: 'verbose',\n description: 'Enable verbose logging',\n }),\n },\n handler: async (args) => {\n const cwd = process.cwd();\n const indexPath = resolveRunManifestPath(resolveSourcePath(cwd, args.runDir));\n const sourceRunDir = path.dirname(indexPath);\n\n await loadEnvFile(args.envFile, cwd, args.verbose);\n\n const selected = await loadSelectedTaskBundles({\n indexPath,\n sourceRunDir,\n testIds: args.testId,\n sourceTargets: args.sourceTarget,\n });\n\n const targetOverrides = args.target;\n const outputDir = args.output\n ? path.resolve(cwd, args.output)\n : defaultOutputDir(cwd, sourceRunDir, selected, args.experiment);\n assertOutputIsSeparate(outputDir, forbiddenOutputRoots(sourceRunDir, selected));\n\n if (args.targets) {\n const overrideProvidersPath = path.resolve(cwd, args.targets);\n await ensureFile(overrideProvidersPath, 'Provider override');\n const targetNames =\n targetOverrides.length > 0 ? targetOverrides : selected.map((bundle) => bundle.taskTarget);\n await validateTargetFile(overrideProvidersPath, targetNames, 'Provider override');\n } else {\n const targetNamesByFile = new Map<string, Set<string>>();\n for (const bundle of selected) {\n const targetNames = targetOverrides.length > 0 ? targetOverrides : [bundle.taskTarget];\n const names = targetNamesByFile.get(bundle.providersPath) ?? new Set<string>();\n for (const targetName of targetNames) {\n names.add(targetName);\n }\n targetNamesByFile.set(bundle.providersPath, names);\n }\n for (const [providersPath, names] of targetNamesByFile.entries()) {\n await validateTargetFile(providersPath, [...names], 'Test bundle providers');\n }\n }\n\n console.log(`Rerunning ${selected.length} captured test bundle(s) from: ${sourceRunDir}`);\n console.log(`Rerun output directory: ${outputDir}`);\n\n const result = await runEvalCommand({\n testFiles: selected.map((bundle) => bundle.evalPath),\n rawOptions: {\n provider: targetOverrides,\n providers: args.targets ? path.resolve(cwd, args.targets) : undefined,\n output: outputDir,\n experiment: args.experiment ?? 'rerun',\n workers: args.workers,\n dryRun: args.dryRun,\n verbose: args.verbose,\n // Legacy generated run bundles stored the captured provider graph as targets.yaml.\n allowLegacyTargetFiles: true,\n providerCatalogPathByEvalFile: buildProviderCatalogPathByEvalFile(\n selected,\n args.targets ? path.resolve(cwd, args.targets) : undefined,\n ),\n sourceMetadataByEvalFile: buildSourceMetadataByEvalFile(sourceRunDir, indexPath, selected),\n },\n });\n\n if (result?.allExecutionErrors) {\n process.exit(2);\n }\n if (result?.budgetExceeded || result?.thresholdFailed) {\n process.exit(1);\n }\n },\n});\n","import { subcommands } from 'cmd-ts';\n\nimport { runsRerunCommand } from './rerun.js';\n\nexport const runsCommand = subcommands({\n name: 'runs',\n description: 'Operate on captured run workspaces',\n cmds: {\n rerun: runsRerunCommand,\n },\n});\n","/**\n * Shared self-update logic for agentv.\n *\n * Used only by the explicit `agentv self update` command. Project\n * `required_version` checks are advisory and never invoke this module.\n *\n * By default it installs `@latest` for stable versions or `@next` when the\n * current version has a prerelease identifier. Callers may pass a\n * `versionRange`/dist tag when they need a specific install specifier.\n *\n * Install scope detection: if `process.argv[1]` contains `node_modules`,\n * agentv was invoked from a local project dependency (e.g. `npx agentv` or\n * `node_modules/.bin/agentv`); update the local dep instead of the global\n * install. Otherwise, update globally (default).\n *\n * Package-manager command resolution prefers runtime-adjacent executables\n * (for example Node's bundled npm-cli.js or the current Bun executable)\n * before falling back to PATH. This keeps self-update working in shells\n * where `agentv` is reachable but `npm`/`bun` are not on PATH.\n *\n * To add a new package manager: add a case to `detectPackageManagerFromPath()`\n * and a corresponding install-args / resolver entry below.\n */\n\nimport { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { get } from 'node:https';\nimport { basename, dirname, join, win32 } from 'node:path';\n\nconst NPM_REGISTRY_BASE = 'https://registry.npmjs.org/agentv/';\n\n/** Returns 'next' if the version has a prerelease identifier, 'latest' otherwise. */\nexport function getDistTagForVersion(version: string): 'next' | 'latest' {\n return version.includes('-') ? 'next' : 'latest';\n}\n\n/**\n * Detect package manager from the script path.\n * If the path contains '.bun', it was installed via bun; otherwise assume npm.\n */\nexport function detectPackageManagerFromPath(scriptPath: string): 'bun' | 'npm' {\n if (scriptPath.includes('.bun')) {\n return 'bun';\n }\n return 'npm';\n}\n\nexport function detectPackageManager(): 'bun' | 'npm' {\n return detectPackageManagerFromPath(process.argv[1] ?? '');\n}\n\n/**\n * Detect whether agentv was invoked from a local project install.\n * npm global installs can also live under a `node_modules` segment, so\n * the path alone is not enough. We treat `npx` cache paths as local and\n * otherwise require the current working directory to be inside the package\n * root before classifying it as local.\n */\nexport function detectInstallScopeFromPath(\n scriptPath: string,\n cwd = process.cwd(),\n): 'local' | 'global' {\n const normalizedScriptPath = scriptPath.replace(/\\\\/g, '/');\n const normalizedCwd = cwd.replace(/\\\\/g, '/');\n\n if (!normalizedScriptPath.includes('/node_modules/')) {\n return 'global';\n }\n\n if (\n normalizedScriptPath.includes('/.npm/_npx/') ||\n normalizedScriptPath.includes('/npm-cache/_npx/')\n ) {\n return 'local';\n }\n\n const packageRoot = normalizedScriptPath.split('/node_modules/')[0];\n if (!packageRoot) {\n return 'global';\n }\n\n const scriptPathComparable =\n process.platform === 'win32' ? normalizedScriptPath.toLowerCase() : normalizedScriptPath;\n const cwdComparable = process.platform === 'win32' ? normalizedCwd.toLowerCase() : normalizedCwd;\n const packageRootComparable =\n process.platform === 'win32' ? packageRoot.toLowerCase() : packageRoot;\n\n const projectOwnsPackage =\n cwdComparable === packageRootComparable ||\n cwdComparable.startsWith(`${packageRootComparable}/`);\n\n return projectOwnsPackage ? 'local' : 'global';\n}\n\nexport function detectInstallScope(): 'local' | 'global' {\n return detectInstallScopeFromPath(process.argv[1] ?? '');\n}\n\nfunction runCommand(cmd: string, args: string[]): Promise<{ exitCode: number; stdout: string }> {\n return new Promise((resolve, reject) => {\n // No shell: true — args are passed directly to execvp, avoiding shell\n // interpretation of semver operators (>, <, |) in version ranges.\n const child = spawn(cmd, args, { stdio: ['inherit', 'pipe', 'inherit'] });\n let stdout = '';\n child.stdout?.on('data', (data: Buffer) => {\n process.stdout.write(data);\n stdout += data.toString();\n });\n child.on('error', reject);\n child.on('close', (code) => resolve({ exitCode: code ?? 1, stdout }));\n });\n}\n\n/**\n * Fetch the latest published version of agentv from the npm registry.\n * Pass distTag='next' for prerelease channels. Returns null on network errors.\n */\nexport function fetchLatestVersion(distTag: 'latest' | 'next' = 'latest'): Promise<string | null> {\n return new Promise((resolve) => {\n const req = get(`${NPM_REGISTRY_BASE}${distTag}`, { timeout: 5000 }, (res) => {\n if (res.statusCode !== 200) {\n res.resume();\n resolve(null);\n return;\n }\n let body = '';\n res.on('data', (chunk: Buffer) => {\n body += chunk.toString();\n });\n res.on('end', () => {\n try {\n const version = JSON.parse(body).version;\n resolve(typeof version === 'string' ? version : null);\n } catch {\n resolve(null);\n }\n });\n });\n req.on('error', () => resolve(null));\n req.on('timeout', () => {\n req.destroy();\n resolve(null);\n });\n });\n}\n\nexport function getInstallArgs(\n pm: 'bun' | 'npm',\n versionSpec: string,\n scope: 'local' | 'global',\n): string[] {\n const pkg = `agentv@${versionSpec}`;\n const baseCmd = pm === 'npm' ? 'install' : 'add';\n return scope === 'global' ? [baseCmd, '-g', pkg] : [baseCmd, pkg];\n}\n\nfunction findBundledNpmCli(\n execPath: string,\n platform: NodeJS.Platform,\n exists: (path: string) => boolean,\n): string | undefined {\n const pathApi = platform === 'win32' ? win32 : { dirname, join };\n const execDir = pathApi.dirname(execPath);\n const candidates =\n platform === 'win32'\n ? [pathApi.join(execDir, 'node_modules', 'npm', 'bin', 'npm-cli.js')]\n : [\n pathApi.join(execDir, '..', 'lib', 'node_modules', 'npm', 'bin', 'npm-cli.js'),\n pathApi.join(execDir, 'node_modules', 'npm', 'bin', 'npm-cli.js'),\n ];\n\n return candidates.find((candidate) => exists(candidate));\n}\n\nexport function resolvePackageManagerCommand(\n pm: 'bun' | 'npm',\n args: string[],\n options?: {\n execPath?: string;\n platform?: NodeJS.Platform;\n exists?: (path: string) => boolean;\n },\n): { cmd: string; args: string[] } {\n const execPath = options?.execPath ?? process.execPath;\n const platform = options?.platform ?? process.platform;\n const exists = options?.exists ?? existsSync;\n const pathApi = platform === 'win32' ? win32 : { basename };\n\n if (pm === 'bun') {\n const runtimeName = pathApi.basename(execPath).toLowerCase();\n if ((runtimeName === 'bun' || runtimeName === 'bun.exe') && exists(execPath)) {\n return { cmd: execPath, args };\n }\n return { cmd: 'bun', args };\n }\n\n const npmCliPath = findBundledNpmCli(execPath, platform, exists);\n if (npmCliPath) {\n return { cmd: execPath, args: [npmCliPath, ...args] };\n }\n\n return { cmd: 'npm', args };\n}\n\n/**\n * Run the self-update flow: install agentv using the detected (or specified)\n * package manager, scoped to the detected install location (global by default,\n * local when invoked from a project's `node_modules`).\n *\n * @param options.pm - Force a specific package manager\n * @param options.currentVersion - Current installed version (for display)\n * @param options.versionRange - Semver range from config (e.g., \">=4.1.0\").\n * When provided, used as the npm/bun version specifier so the update\n * stays within the project's constraints. When omitted, installs `@latest`.\n * @param options.scope - Force local or global install. Defaults to\n * auto-detection based on `process.argv[1]`.\n */\nexport async function performSelfUpdate(options?: {\n pm?: 'bun' | 'npm';\n currentVersion?: string;\n versionRange?: string;\n scope?: 'local' | 'global';\n}): Promise<{\n success: boolean;\n currentVersion: string;\n newVersion?: string;\n scope: 'local' | 'global';\n}> {\n const pm = options?.pm ?? detectPackageManager();\n const currentVersion = options?.currentVersion ?? 'unknown';\n const versionSpec =\n options?.versionRange ??\n getDistTagForVersion(currentVersion === 'unknown' ? '' : currentVersion);\n const scope = options?.scope ?? detectInstallScope();\n\n const args = getInstallArgs(pm, versionSpec, scope);\n const command = resolvePackageManagerCommand(pm, args);\n\n try {\n const result = await runCommand(command.cmd, command.args);\n\n if (result.exitCode !== 0) {\n return { success: false, currentVersion, scope };\n }\n\n // Best-effort version check after update\n let newVersion: string | undefined;\n try {\n const versionResult = await runCommand('agentv', ['--version']);\n newVersion = versionResult.stdout.trim();\n } catch {\n // Ignore - version check is best-effort\n }\n\n return { success: true, currentVersion, newVersion, scope };\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('ENOENT') || error.message.includes('not found')) {\n const alternative = pm === 'npm' ? 'bun' : 'npm';\n console.error(`Error: ${pm} not found. Try using --${alternative} flag.`);\n } else {\n console.error(`Error: ${error.message}`);\n }\n }\n return { success: false, currentVersion, scope };\n }\n}\n","import { command, flag, subcommands } from 'cmd-ts';\nimport packageJson from '../../../package.json' with { type: 'json' };\nimport {\n detectInstallScope,\n detectPackageManager,\n fetchLatestVersion,\n getDistTagForVersion,\n performSelfUpdate,\n} from '../../self-update.js';\n\n// Re-export for existing tests\nexport { detectInstallScopeFromPath, detectPackageManagerFromPath } from '../../self-update.js';\n\nconst updateCommand = command({\n name: 'update',\n description: 'Update agentv to the latest version',\n args: {\n npm: flag({ long: 'npm', description: 'Force update using npm' }),\n bun: flag({ long: 'bun', description: 'Force update using bun' }),\n },\n handler: async ({ npm, bun }) => {\n if (npm && bun) {\n console.error('Error: Cannot specify both --npm and --bun');\n process.exit(1);\n }\n\n let pm: 'bun' | 'npm';\n if (npm) {\n pm = 'npm';\n } else if (bun) {\n pm = 'bun';\n } else {\n pm = detectPackageManager();\n }\n\n const currentVersion = packageJson.version;\n const distTag = getDistTagForVersion(currentVersion);\n console.log(`Current version: ${currentVersion}`);\n console.log('Checking for updates...');\n\n const latestVersion = await fetchLatestVersion(distTag);\n if (latestVersion && latestVersion === currentVersion) {\n console.log(`Already up to date (${currentVersion}).`);\n return;\n }\n\n if (latestVersion) {\n console.log(`Update available: ${currentVersion} → ${latestVersion}`);\n }\n const scope = detectInstallScope();\n const scopeLabel = scope === 'local' ? 'local project install' : 'global install';\n console.log(`Updating agentv using ${pm} (${scopeLabel})...\\n`);\n\n const result = await performSelfUpdate({ pm, currentVersion, versionRange: distTag, scope });\n\n if (!result.success) {\n console.error('\\nUpdate failed.');\n process.exit(1);\n }\n\n if (result.newVersion) {\n console.log(`\\nUpdate complete: ${currentVersion} → ${result.newVersion}`);\n } else {\n console.log('\\nUpdate complete.');\n }\n },\n});\n\nexport const selfCommand = subcommands({\n name: 'self',\n description: 'Manage the agentv installation',\n cmds: {\n update: updateCommand,\n },\n});\n","/**\n * `agentv skills` — serve bundled skill content from inside the CLI tarball.\n *\n * Skills are bundled into `dist/skills/<name>/` at build time (see tsup.config.ts).\n * This ensures skill content always matches the installed CLI version — no drift possible.\n *\n * Subcommands:\n * list — print skill names (one per line, or JSON with --json)\n * get <name> — print SKILL.md content\n * get <name> --full — also include all subdirectories (references/, scripts/, agents/, etc.)\n * get <name> --ref <file> — print any file from the skill directory by relative path\n * get <name> --all — get all skills\n * get --all — get all skills\n * path [<name>] — print resolved path to skills dir or specific skill dir\n *\n * Resolution: walk from this module's file upward to find `dist/skills/` or `skills/`\n * that contains actual skill content (validated by presence of SKILL.md files).\n * Production npm install: binary at dist/cli.js → dist/skills/ is a sibling.\n * Source run (bun src/cli.ts): walks up to apps/cli/ where dist/skills/ lives.\n *\n * JSON output (--json) schema:\n * { success: true, data: [{ name: string, content: string, files?: Record<string,string> }] }\n * { success: false, error: string }\n */\n\nimport { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { command, flag, option, optional, positional, string, subcommands } from 'cmd-ts';\n\n// ── Resolution ────────────────────────────────────────────────────────────────\n\n/** A valid skills dir contains at least one subdirectory with a SKILL.md file. */\nfunction isValidSkillsDir(dir: string): boolean {\n if (!existsSync(dir)) return false;\n try {\n return readdirSync(dir, { withFileTypes: true }).some(\n (e) => e.isDirectory() && existsSync(path.join(dir, e.name, 'SKILL.md')),\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Walk from the directory containing this module's source file up to find\n * a directory that contains actual skill content. In priority order at\n * each ancestor level:\n * 1. `dist/skills/` — production npm install (binary at dist/cli.js,\n * skills are a sibling) and post-build dev runs.\n * 2. `skills-data/` — repo-root source layout (mirrors agent-browser's\n * top-level `skill-data/`); used when running from TypeScript source\n * without a build.\n * 3. `skills/` — legacy in-package location, retained for backward\n * compatibility with any downstream consumer that still bundles\n * this module without the dist copy step.\n */\nfunction findSkillsDir(): string | null {\n const selfFile = fileURLToPath(import.meta.url);\n let dir = path.dirname(selfFile);\n for (let i = 0; i < 6; i++) {\n const distCandidate = path.join(dir, 'dist', 'skills');\n if (isValidSkillsDir(distCandidate)) return distCandidate;\n const repoRootCandidate = path.join(dir, 'skills-data');\n if (isValidSkillsDir(repoRootCandidate)) return repoRootCandidate;\n const legacyCandidate = path.join(dir, 'skills');\n if (isValidSkillsDir(legacyCandidate)) return legacyCandidate;\n dir = path.dirname(dir);\n }\n return null;\n}\n\nfunction requireSkillsDir(): string {\n const dir = findSkillsDir();\n if (!dir) {\n console.error(\n 'Error: bundled skills directory not found. This is a build issue — please reinstall agentv.',\n );\n process.exit(1);\n }\n return dir;\n}\n\n// ── Skill reading ─────────────────────────────────────────────────────────────\n\ninterface SkillData {\n name: string;\n content: string;\n files?: Record<string, string>;\n}\n\nfunction listSkillNames(skillsDir: string): string[] {\n if (!existsSync(skillsDir)) return [];\n return readdirSync(skillsDir, { withFileTypes: true })\n .filter((e) => e.isDirectory())\n .map((e) => e.name)\n .sort();\n}\n\nfunction readSkillFile(skillDir: string, relPath: string): string | null {\n const full = path.join(skillDir, relPath);\n if (!existsSync(full)) return null;\n return readFileSync(full, 'utf-8');\n}\n\n/**\n * Recursively collect all files under a subdirectory.\n * Returns a map of relative paths → contents.\n */\nfunction collectDir(dir: string, prefix = ''): Record<string, string> {\n const result: Record<string, string> = {};\n if (!existsSync(dir)) return result;\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n Object.assign(result, collectDir(path.join(dir, entry.name), relPath));\n } else {\n result[relPath] = readFileSync(path.join(dir, entry.name), 'utf-8');\n }\n }\n return result;\n}\n\n/**\n * List all immediate subdirectories of a skill folder (excluding hidden dirs).\n * This is the dynamic alternative to hardcoding ['references', 'templates', 'agents'].\n */\nfunction listSkillSubdirs(skillDir: string): string[] {\n if (!existsSync(skillDir)) return [];\n return readdirSync(skillDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && !e.name.startsWith('.'))\n .map((e) => e.name)\n .sort();\n}\n\nfunction readSkill(skillsDir: string, name: string, full: boolean): SkillData | null {\n const skillDir = path.join(skillsDir, name);\n if (!existsSync(skillDir)) return null;\n\n const content = readSkillFile(skillDir, 'SKILL.md');\n if (content === null) return null;\n\n if (!full) return { name, content };\n\n // Collect ALL subdirectories dynamically — no hardcoded list\n const files: Record<string, string> = {};\n for (const sub of listSkillSubdirs(skillDir)) {\n const subDir = path.join(skillDir, sub);\n const collected = collectDir(subDir, sub);\n Object.assign(files, collected);\n }\n return { name, content, files: Object.keys(files).length > 0 ? files : undefined };\n}\n\n/**\n * Find a single file by name within a skill.\n *\n * Searches all subdirectories first, then the skill root for a bare filename.\n * The name may include or omit the `.md` extension — we try the literal name\n * first, then with `.md` appended, so callers can write `--ref eval-yaml-spec`\n * instead of `--ref eval-yaml-spec.md`.\n */\nfunction findRefFile(\n skillDir: string,\n refName: string,\n): { relPath: string; content: string } | null {\n const candidates = refName.endsWith('.md') ? [refName] : [refName, `${refName}.md`];\n // Search all subdirectories dynamically\n for (const sub of listSkillSubdirs(skillDir)) {\n for (const candidate of candidates) {\n const filePath = path.join(skillDir, sub, candidate);\n if (existsSync(filePath)) {\n return { relPath: `${sub}/${candidate}`, content: readFileSync(filePath, 'utf-8') };\n }\n }\n }\n // Bare name in the skill root (e.g. LICENSE.txt)\n for (const candidate of candidates) {\n const filePath = path.join(skillDir, candidate);\n if (existsSync(filePath)) {\n return { relPath: candidate, content: readFileSync(filePath, 'utf-8') };\n }\n }\n return null;\n}\n\n/**\n * List all discoverable filenames inside a skill (used to print a useful\n * error when a `--ref` lookup misses).\n */\nfunction listRefFiles(skillDir: string): string[] {\n const out: string[] = [];\n for (const sub of listSkillSubdirs(skillDir)) {\n const subDir = path.join(skillDir, sub);\n for (const entry of readdirSync(subDir, { withFileTypes: true })) {\n if (entry.isFile()) out.push(`${sub}/${entry.name}`);\n }\n }\n return out.sort();\n}\n\n// ── Output helpers ────────────────────────────────────────────────────────────\n\nfunction printSkill(skill: SkillData, json: boolean): void {\n if (json) {\n process.stdout.write(`${JSON.stringify({ success: true, data: [skill] })}\\n`);\n return;\n }\n process.stdout.write(skill.content);\n if (!skill.content.endsWith('\\n')) process.stdout.write('\\n');\n if (skill.files) {\n for (const [relPath, content] of Object.entries(skill.files)) {\n process.stdout.write(`\\n--- ${relPath} ---\\n`);\n process.stdout.write(content);\n if (!content.endsWith('\\n')) process.stdout.write('\\n');\n }\n }\n}\n\n// ── Subcommands ───────────────────────────────────────────────────────────────\n\nconst skillsListCommand = command({\n name: 'list',\n description: 'List available bundled skills',\n args: {\n json: flag({ long: 'json', description: 'Output as JSON' }),\n },\n handler: ({ json }) => {\n const skillsDir = requireSkillsDir();\n const names = listSkillNames(skillsDir);\n if (json) {\n process.stdout.write(`${JSON.stringify({ success: true, data: names })}\\n`);\n } else {\n for (const name of names) {\n console.log(name);\n }\n }\n },\n});\n\nconst skillsGetCommand = command({\n name: 'get',\n description: 'Get skill content by name (or --all for all skills)',\n args: {\n name: positional({ type: optional(string), displayName: 'name', description: 'Skill name' }),\n all: flag({ long: 'all', description: 'Get all skills' }),\n full: flag({\n long: 'full',\n description:\n 'Also include all files under subdirectories (references/, scripts/, agents/, etc.)',\n }),\n ref: option({\n type: optional(string),\n long: 'ref',\n description:\n 'Load a single file from the skill by relative path (searches all subdirectories). Takes precedence over --full.',\n }),\n json: flag({ long: 'json', description: 'Output as JSON' }),\n },\n handler: ({ name, all, full, ref, json }) => {\n const skillsDir = requireSkillsDir();\n\n if (ref !== undefined && all) {\n const msg = '--ref is incompatible with --all';\n if (json) {\n process.stdout.write(`${JSON.stringify({ success: false, error: msg })}\\n`);\n } else {\n console.error(`Error: ${msg}`);\n }\n process.exit(1);\n }\n\n if (ref !== undefined) {\n if (name === undefined) {\n const msg = '--ref requires a skill name';\n if (json) {\n process.stdout.write(`${JSON.stringify({ success: false, error: msg })}\\n`);\n } else {\n console.error(`Error: ${msg}`);\n }\n process.exit(1);\n }\n const skillDir = path.join(skillsDir, name);\n if (!existsSync(skillDir)) {\n const msg = `skill '${name}' not found`;\n if (json) {\n process.stdout.write(`${JSON.stringify({ success: false, error: msg })}\\n`);\n } else {\n console.error(`Error: ${msg}`);\n const available = listSkillNames(skillsDir);\n if (available.length > 0) {\n console.error(`Available skills: ${available.join(', ')}`);\n }\n }\n process.exit(1);\n }\n const file = findRefFile(skillDir, ref);\n if (!file) {\n const msg = `reference '${ref}' not found in skill '${name}'`;\n if (json) {\n process.stdout.write(`${JSON.stringify({ success: false, error: msg })}\\n`);\n } else {\n console.error(`Error: ${msg}`);\n const available = listRefFiles(skillDir);\n if (available.length > 0) {\n console.error(`Available reference files:\\n ${available.join('\\n ')}`);\n }\n }\n process.exit(1);\n }\n if (json) {\n process.stdout.write(\n `${JSON.stringify({ success: true, data: [{ name, content: file.content, files: { [file.relPath]: file.content } }] })}\\n`,\n );\n return;\n }\n process.stdout.write(file.content);\n if (!file.content.endsWith('\\n')) process.stdout.write('\\n');\n return;\n }\n\n if (all || name === undefined) {\n const names = listSkillNames(skillsDir);\n const skills = names\n .map((n) => readSkill(skillsDir, n, full))\n .filter((s): s is SkillData => s !== null);\n\n if (json) {\n process.stdout.write(`${JSON.stringify({ success: true, data: skills })}\\n`);\n return;\n }\n for (const skill of skills) {\n if (skills.length > 1) {\n process.stdout.write(`\\n=== ${skill.name} ===\\n\\n`);\n }\n printSkill(skill, false);\n }\n return;\n }\n\n const skill = readSkill(skillsDir, name, full);\n if (!skill) {\n if (json) {\n process.stdout.write(\n `${JSON.stringify({ success: false, error: `Skill '${name}' not found` })}\\n`,\n );\n } else {\n console.error(`Error: skill '${name}' not found`);\n const available = listSkillNames(skillsDir);\n if (available.length > 0) {\n console.error(`Available skills: ${available.join(', ')}`);\n }\n }\n process.exit(1);\n }\n\n printSkill(skill, json);\n },\n});\n\nconst skillsPathCommand = command({\n name: 'path',\n description: 'Print path to bundled skills directory (or specific skill directory)',\n args: {\n name: positional({ type: optional(string), displayName: 'name', description: 'Skill name' }),\n },\n handler: ({ name }) => {\n const skillsDir = requireSkillsDir();\n if (name) {\n const skillDir = path.join(skillsDir, name);\n if (!existsSync(skillDir)) {\n console.error(`Error: skill '${name}' not found`);\n process.exit(1);\n }\n console.log(skillDir);\n } else {\n console.log(skillsDir);\n }\n },\n});\n\nexport const skillsCommand = subcommands({\n name: 'skills',\n description: 'List and retrieve bundled AgentV skills',\n cmds: {\n list: skillsListCommand,\n get: skillsGetCommand,\n path: skillsPathCommand,\n },\n});\n","import { writeFileSync } from 'node:fs';\nimport path from 'node:path';\nimport { command, flag, option, optional, positional, string } from 'cmd-ts';\n\nimport { getOutputFilenames, transpileEvalYamlFile } from '@agentv/core';\n\nexport const transpileCommand = command({\n name: 'transpile',\n description: 'Convert an EVAL.yaml file to Agent Skills evals.json format',\n args: {\n input: positional({\n type: string,\n displayName: 'input',\n description: 'Path to EVAL.yaml file',\n }),\n outDir: option({\n type: optional(string),\n long: 'out-dir',\n short: 'd',\n description: 'Output directory (defaults to directory of input file)',\n }),\n stdout: flag({\n long: 'stdout',\n description: 'Write to stdout instead of file(s) (only valid for single-skill output)',\n }),\n },\n handler: async ({ input, outDir, stdout }) => {\n let result: ReturnType<typeof transpileEvalYamlFile>;\n try {\n result = transpileEvalYamlFile(path.resolve(input));\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n\n // Print warnings\n for (const warning of result.warnings) {\n console.warn(`Warning: ${warning}`);\n }\n\n if (result.files.size === 0) {\n console.error('Error: No output produced (no tests found)');\n process.exit(1);\n }\n\n if (stdout) {\n if (result.files.size > 1) {\n console.error(\n 'Error: --stdout is only valid when input produces a single evals.json (multi-skill input produces multiple files)',\n );\n process.exit(1);\n }\n const [file] = result.files.values();\n process.stdout.write(JSON.stringify(file, null, 2));\n process.stdout.write('\\n');\n return;\n }\n\n const outputDir = outDir ? path.resolve(outDir) : path.dirname(path.resolve(input));\n const fileNames = getOutputFilenames(result);\n\n for (const [skill, evalsJson] of result.files) {\n const fileName = fileNames.get(skill) ?? 'evals.json';\n const outputPath = path.join(outputDir, fileName);\n writeFileSync(outputPath, `${JSON.stringify(evalsJson, null, 2)}\\n`);\n console.log(`Transpiled to ${outputPath}`);\n }\n },\n});\n","import { readFileSync, writeFileSync } from 'node:fs';\nimport { toCamelCaseDeep, toSnakeCaseDeep, trimBaselineResult } from '@agentv/core';\nimport type { EvaluationResult } from '@agentv/core';\nimport { command, option, optional, positional, string } from 'cmd-ts';\n\n/**\n * Trims a JSONL file of EvaluationResults, stripping debug/audit fields\n * that are unnecessary for baseline comparisons.\n */\nexport const trimCommand = command({\n name: 'trim',\n description: 'Trim evaluation results for baseline storage (strips debug/audit fields)',\n args: {\n input: positional({\n type: string,\n displayName: 'input',\n description: 'Path to input JSONL result file',\n }),\n out: option({\n type: optional(string),\n long: 'out',\n short: 'o',\n description: 'Path to output JSONL file (defaults to stdout)',\n }),\n },\n handler: async ({ input, out }) => {\n try {\n const content = readFileSync(input, 'utf8');\n const lines = content\n .trim()\n .split('\\n')\n .filter((line) => line.trim());\n\n const trimmedLines = lines.map((line) => {\n const record = JSON.parse(line);\n // Records on disk are snake_case; convert to camelCase for trimming, then back\n const camel = toCamelCaseDeep(record) as EvaluationResult;\n const trimmed = trimBaselineResult(camel);\n const snake = toSnakeCaseDeep(trimmed);\n return JSON.stringify(snake);\n });\n\n const output = `${trimmedLines.join('\\n')}\\n`;\n\n if (out) {\n writeFileSync(out, output, 'utf8');\n console.error(`Trimmed ${lines.length} record(s) → ${out}`);\n } else {\n process.stdout.write(output);\n }\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n },\n});\n","import type {\n ValidationError,\n ValidationResult,\n ValidationSummary,\n} from '@agentv/core/evaluation/validation';\n\nconst ANSI_RED = '\\u001b[31m';\nconst ANSI_YELLOW = '\\u001b[33m';\nconst ANSI_GREEN = '\\u001b[32m';\nconst ANSI_CYAN = '\\u001b[36m';\nconst ANSI_BOLD = '\\u001b[1m';\nconst ANSI_RESET = '\\u001b[0m';\n\n/**\n * Format validation summary for console output.\n */\nexport function formatSummary(summary: ValidationSummary, useColors: boolean): string {\n const lines: string[] = [];\n\n // Header\n lines.push('');\n lines.push(formatHeader('Validation Summary', useColors));\n lines.push('');\n\n // Results for each file\n for (const result of summary.results) {\n lines.push(formatFileResult(result, useColors));\n }\n\n // Summary statistics\n lines.push('');\n lines.push(formatStats(summary, useColors));\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction formatHeader(text: string, useColors: boolean): string {\n if (useColors) {\n return `${ANSI_BOLD}${ANSI_CYAN}${text}${ANSI_RESET}`;\n }\n return text;\n}\n\nfunction formatFileResult(result: ValidationResult, useColors: boolean): string {\n const lines: string[] = [];\n\n const status = result.valid ? '✓' : '✗';\n const statusColor = result.valid ? ANSI_GREEN : ANSI_RED;\n const statusText = useColors ? `${statusColor}${status}${ANSI_RESET}` : status;\n\n const fileName = result.filePath;\n lines.push(`${statusText} ${fileName}`);\n\n // Show errors and warnings\n if (result.errors.length > 0) {\n for (const error of result.errors) {\n lines.push(formatError(error, useColors));\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction formatError(error: ValidationError, useColors: boolean): string {\n const prefix = error.severity === 'error' ? ' ✗' : ' ⚠';\n const color = error.severity === 'error' ? ANSI_RED : ANSI_YELLOW;\n const coloredPrefix = useColors ? `${color}${prefix}${ANSI_RESET}` : prefix;\n\n const location = error.location ? ` [${error.location}]` : '';\n return `${coloredPrefix}${location} ${error.message}`;\n}\n\nfunction formatStats(summary: ValidationSummary, useColors: boolean): string {\n const lines: string[] = [];\n\n const totalText = `Total files: ${summary.totalFiles}`;\n const validText = `Valid: ${summary.validFiles}`;\n const invalidText = `Invalid: ${summary.invalidFiles}`;\n\n // Count files with warnings\n const filesWithWarnings = summary.results.filter((r) =>\n r.errors.some((e) => e.severity === 'warning'),\n ).length;\n\n if (useColors) {\n lines.push(`${ANSI_BOLD}${totalText}${ANSI_RESET}`);\n lines.push(`${ANSI_GREEN}${validText}${ANSI_RESET}`);\n if (summary.invalidFiles > 0) {\n lines.push(`${ANSI_RED}${invalidText}${ANSI_RESET}`);\n } else {\n lines.push(invalidText);\n }\n if (filesWithWarnings > 0) {\n lines.push(`${ANSI_YELLOW}Files with warnings: ${filesWithWarnings}${ANSI_RESET}`);\n }\n } else {\n lines.push(totalText);\n lines.push(validText);\n lines.push(invalidText);\n if (filesWithWarnings > 0) {\n lines.push(`Files with warnings: ${filesWithWarnings}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Check if stdout is a TTY (supports colors).\n */\nexport function isTTY(): boolean {\n return process.stdout.isTTY ?? false;\n}\n","import { constants } from 'node:fs';\nimport { access, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport {\n type ValidationResult,\n type ValidationSummary,\n detectFileType,\n isTypeScriptEvalConfigFileName,\n validateCasesFile,\n validateConfigFile,\n validateEvalFile,\n validateFileReferences,\n validateTargetsFile,\n validateTypeScriptEvalConfigFile,\n validateWorkspacePaths,\n} from '@agentv/core/evaluation/validation';\nimport fg from 'fast-glob';\n\n/**\n * Validate YAML files for AgentV schema compliance.\n */\nexport async function validateFiles(paths: readonly string[]): Promise<ValidationSummary> {\n const filePaths = await expandPaths(paths);\n const results = await Promise.all(filePaths.map((filePath) => validateSingleFile(filePath)));\n\n const validFiles = results.filter((r) => r.valid).length;\n const invalidFiles = results.filter((r) => !r.valid).length;\n\n return {\n totalFiles: results.length,\n validFiles,\n invalidFiles,\n results,\n };\n}\n\nasync function validateSingleFile(filePath: string): Promise<ValidationResult> {\n const absolutePath = path.resolve(filePath);\n\n if (isTypeScriptEvalConfigFileName(absolutePath)) {\n return validateTypeScriptEvalConfigFile(absolutePath);\n }\n\n // Detect file type (now infers from path if $schema is missing)\n const fileType = await detectFileType(absolutePath);\n\n // Validate based on file type\n let result: ValidationResult;\n\n if (fileType === 'eval') {\n result = await validateEvalFile(absolutePath);\n\n // Also validate file references and workspace paths for eval files\n if (result.valid || result.errors.filter((e) => e.severity === 'error').length === 0) {\n const [fileRefErrors, workspaceErrors] = await Promise.all([\n validateFileReferences(absolutePath),\n validateWorkspacePaths(absolutePath),\n ]);\n const extraErrors = [...fileRefErrors, ...workspaceErrors];\n if (extraErrors.length > 0) {\n result = {\n ...result,\n errors: [...result.errors, ...extraErrors],\n valid: result.valid && extraErrors.filter((e) => e.severity === 'error').length === 0,\n };\n }\n }\n } else if (fileType === 'cases') {\n result = await validateCasesFile(absolutePath);\n } else if (fileType === 'targets') {\n result = await validateTargetsFile(absolutePath);\n } else if (fileType === 'config') {\n result = await validateConfigFile(absolutePath);\n } else {\n // Unknown file type — skip validation, report as skipped\n result = {\n valid: true,\n filePath: absolutePath,\n fileType: 'unknown',\n errors: [\n {\n severity: 'warning',\n filePath: absolutePath,\n message:\n 'File type not recognized. Eval files should be named suite.yaml or end in .eval.yaml. Skipping validation.',\n },\n ],\n };\n }\n\n return result;\n}\n\nasync function expandPaths(paths: readonly string[]): Promise<readonly string[]> {\n const expanded = new Set<string>();\n\n for (const inputPath of paths) {\n const absolutePath = path.resolve(inputPath);\n\n // Try as literal file or directory first\n try {\n await access(absolutePath, constants.F_OK);\n const stats = await stat(absolutePath);\n\n if (stats.isFile()) {\n if (isYamlFile(absolutePath) || isTypeScriptEvalConfigFileName(absolutePath)) {\n expanded.add(absolutePath);\n }\n continue;\n }\n if (stats.isDirectory()) {\n const evalFiles = await findEvalFiles(absolutePath);\n for (const f of evalFiles) expanded.add(f);\n continue;\n }\n } catch {\n // Not a literal path — fall through to glob matching\n }\n\n // Treat as glob pattern\n const globPattern = inputPath.includes('\\\\') ? inputPath.replace(/\\\\/g, '/') : inputPath;\n const matches = await fg(globPattern, {\n cwd: process.cwd(),\n absolute: true,\n onlyFiles: true,\n unique: true,\n dot: false,\n followSymbolicLinks: true,\n });\n\n const evalMatches = matches.filter((f) => isYamlFile(f) || isTypeScriptEvalConfigFileName(f));\n if (evalMatches.length === 0) {\n console.warn(\n `Warning: No eval YAML or TypeScript config files matched pattern: ${inputPath}`,\n );\n }\n for (const f of evalMatches) expanded.add(path.normalize(f));\n }\n\n const sorted = Array.from(expanded);\n sorted.sort();\n return sorted;\n}\n\nasync function findEvalFiles(dirPath: string): Promise<readonly string[]> {\n const results: string[] = [];\n\n try {\n const entries = await readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dirPath, entry.name);\n\n if (entry.isDirectory()) {\n // Skip node_modules and hidden directories\n if (entry.name === 'node_modules' || entry.name.startsWith('.')) {\n continue;\n }\n const subFiles = await findEvalFiles(fullPath);\n results.push(...subFiles);\n } else if (\n entry.isFile() &&\n (isEvalYamlFile(entry.name) || isTypeScriptEvalConfigFileName(entry.name))\n ) {\n results.push(fullPath);\n }\n }\n } catch (error) {\n console.warn(`Warning: Could not read directory ${dirPath}: ${(error as Error).message}`);\n }\n\n return results;\n}\n\nfunction isYamlFile(filePath: string): boolean {\n const ext = path.extname(filePath).toLowerCase();\n return ext === '.yaml' || ext === '.yml';\n}\n\n/** Returns true for native eval YAML suite files used during directory scanning. */\nfunction isEvalYamlFile(filePath: string): boolean {\n const lower = path.basename(filePath).toLowerCase();\n return (\n lower === 'suite.yaml' ||\n lower === 'suite.yml' ||\n lower.endsWith('.eval.yaml') ||\n lower.endsWith('.eval.yml')\n );\n}\n","import { command, number, option, optional, restPositionals, string } from 'cmd-ts';\n\nimport { formatSummary, isTTY } from './format-output.js';\nimport { validateFiles } from './validate-files.js';\n\nasync function runValidateCommand(\n paths: readonly string[],\n maxWarnings: number | undefined,\n): Promise<void> {\n if (paths.length === 0) {\n console.error('Error: No paths specified. Usage: agentv validate <paths...>');\n process.exit(1);\n }\n\n const summary = await validateFiles(paths);\n\n // Output results\n const useColors = isTTY();\n console.log(formatSummary(summary, useColors));\n\n // Exit with appropriate code\n if (summary.invalidFiles > 0) {\n process.exit(1);\n }\n\n // Fail if warning count exceeds --max-warnings threshold\n if (maxWarnings !== undefined) {\n const warningCount = summary.results.reduce(\n (count, r) => count + r.errors.filter((e) => e.severity === 'warning').length,\n 0,\n );\n if (warningCount > maxWarnings) {\n console.error(\n `Found ${warningCount} warning${warningCount === 1 ? '' : 's'} (max allowed: ${maxWarnings})`,\n );\n process.exit(1);\n }\n }\n}\n\nexport const validateCommand = command({\n name: 'validate',\n description: 'Validate AgentV eval, TypeScript config, and targets files',\n args: {\n paths: restPositionals({\n type: string,\n displayName: 'paths',\n description: 'Files or directories to validate',\n }),\n maxWarnings: option({\n type: optional(number),\n long: 'max-warnings',\n description: 'Maximum number of warnings allowed before failing (e.g., --max-warnings 0)',\n }),\n },\n handler: async ({ paths, maxWarnings }) => {\n try {\n await runValidateCommand(paths, maxWarnings);\n } catch (error) {\n console.error(`Error: ${(error as Error).message}`);\n process.exit(1);\n }\n },\n});\n","import { spawn } from 'node:child_process';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { getAgentvConfigDir } from '@agentv/core';\n\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\nconst CONFIG_DIR = getAgentvConfigDir();\nconst CACHE_FILE = 'version-check.json';\nconst NPM_REGISTRY_BASE = 'https://registry.npmjs.org/agentv/';\n\nexport interface UpdateCache {\n latestVersion: string;\n lastCheckedAt: string; // ISO 8601\n}\n\n/**\n * Read the cached update info from disk. Returns null if missing or malformed.\n */\nexport async function getCachedUpdateInfo(path?: string): Promise<UpdateCache | null> {\n const filePath = path ?? join(CONFIG_DIR, CACHE_FILE);\n try {\n const raw = await readFile(filePath, 'utf-8');\n const data = JSON.parse(raw);\n if (typeof data.latestVersion === 'string' && typeof data.lastCheckedAt === 'string') {\n return data as UpdateCache;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Decide whether a fresh check is needed based on the cache.\n */\nexport function shouldCheck(cache: UpdateCache | null): boolean {\n if (!cache) return true;\n const elapsed = Date.now() - new Date(cache.lastCheckedAt).getTime();\n return elapsed > CHECK_INTERVAL_MS;\n}\n\n/**\n * Compare two semver strings. Returns true if a > b.\n */\nfunction isNewer(a: string, b: string): boolean {\n const pa = a.split('.').map((s) => Number(s.replace(/-.*$/, '')));\n const pb = b.split('.').map((s) => Number(s.replace(/-.*$/, '')));\n for (let i = 0; i < 3; i++) {\n if ((pa[i] ?? 0) > (pb[i] ?? 0)) return true;\n if ((pa[i] ?? 0) < (pb[i] ?? 0)) return false;\n }\n return false;\n}\n\n/**\n * Build a human-readable update notice, or null if no update available.\n */\nexport function buildNotice(currentVersion: string, latestVersion: string | null): string | null {\n if (!latestVersion) return null;\n if (!isNewer(latestVersion, currentVersion)) return null;\n return ` Update available: ${currentVersion} → ${latestVersion}\\n Run \\`agentv self update\\` to upgrade.`;\n}\n\n/**\n * Fire-and-forget background check. Spawns a detached child process that\n * fetches latest version from npm and updates the cache file. The child\n * survives even if the parent calls process.exit().\n */\nexport function backgroundUpdateCheck(distTag: 'latest' | 'next' = 'latest'): void {\n const dir = CONFIG_DIR;\n const filePath = join(dir, CACHE_FILE);\n const registryUrl = `${NPM_REGISTRY_BASE}${distTag}`;\n\n const script = `\n const https = require('https');\n const fs = require('fs');\n const dir = ${JSON.stringify(dir)};\n const filePath = ${JSON.stringify(filePath)};\n https.get(${JSON.stringify(registryUrl)}, { timeout: 5000 }, (res) => {\n if (res.statusCode !== 200) { res.resume(); process.exit(); }\n let body = '';\n res.on('data', (c) => body += c);\n res.on('end', () => {\n try {\n const v = JSON.parse(body).version;\n if (typeof v === 'string') {\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(filePath, JSON.stringify({ latestVersion: v, lastCheckedAt: new Date().toISOString() }, null, 2));\n }\n } catch {}\n process.exit();\n });\n }).on('error', () => process.exit()).on('timeout', function() { this.destroy(); process.exit(); });\n `;\n\n try {\n const child = spawn(process.execPath, ['-e', script], {\n detached: true,\n stdio: 'ignore',\n windowsHide: true,\n });\n child.unref();\n } catch {}\n}\n\n/**\n * Get the update notice to display, or null. Kicks off a background\n * refresh if the cache is stale. Never blocks startup.\n */\nexport async function getUpdateNotice(currentVersion: string): Promise<string | null> {\n if (process.env.AGENTV_NO_UPDATE_CHECK === '1' || process.env.CI === 'true') {\n return null;\n }\n const distTag = currentVersion.includes('-') ? 'next' : 'latest';\n const cache = await getCachedUpdateInfo();\n if (shouldCheck(cache)) {\n backgroundUpdateCheck(distTag);\n }\n return buildNotice(currentVersion, cache?.latestVersion ?? null);\n}\n","#!/usr/bin/env node\nimport { killAllTrackedChildren } from '@agentv/core';\n\nimport { runCli } from './cli-app.js';\n\n// Forward SIGINT/SIGTERM to spawned provider subprocesses before exiting.\n// Without this, Dashboard's `child.kill('SIGTERM')` against the CLI orphans\n// any in-flight `claude`/`codex`/`pi`/`copilot` subprocess. The partial\n// `index.jsonl` is already row-by-row durable, so finished tests survive.\n//\n// First signal: kill children, exit with the conventional 128+signal code.\n// Second signal within the same process: hard-exit so a hung child cannot\n// trap the user.\nlet interrupted = false;\nfunction installShutdown(signal: NodeJS.Signals, exitCode: number) {\n process.on(signal, () => {\n if (interrupted) {\n process.exit(1);\n }\n interrupted = true;\n killAllTrackedChildren('SIGTERM');\n // Defer exit one tick so SIGTERM has a chance to dispatch before the\n // event loop tears down.\n setTimeout(() => process.exit(exitCode), 50);\n });\n}\ninstallShutdown('SIGINT', 130);\ninstallShutdown('SIGTERM', 143);\n\nrunCli()\n .then(() => {\n process.exit(0);\n })\n .catch((error) => {\n if (error instanceof Error) {\n console.error(`Error: ${error.message}`);\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n } else {\n console.error(error);\n }\n process.exit(1);\n });\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["didYouMean","parse","env","debug","c","tty","supportsColor","useColors","c","debug","path","process","flag","string","styles","chalk","styles","string","option","boolean","env","_a","_a","_b","_c","positional","cmd","didYouMean","option","array","string","flatMap","flatMap","option","_a","env","option","option","number","createDebugger","string","positional","option","c","stripAnsi","padRight","padLeft","path","path","outputPath","mkdir","writeFile","path","path","mkdir","writeFile","path","path","path","path","readFileSync","path","readFileSync","path","path","path","path","path","mkdir","writeFile","path","path","mkdir","writeFile","mkdir","writeFile","path","session","formatAge","path","mkdir","transcriptWriteOptions","writeFile","formatDurationMs","mkdir","readFile","writeFile","path","formatAge","path","readFile","mkdir","transcriptWriteOptions","writeFile","formatDurationMs","existsSync","path","path","existsSync","resolve","err","existsSync","writeFileSync","path","readFileSync","path","entries","stat","path","existsSync","writeFileSync","existsSync","readFileSync","readdirSync","statSync","path","entries","readdirSync","path","readFileSync","existsSync","statSync","err","existsSync","readFileSync","readdirSync","statSync","path","entries","readdirSync","path","regex","readFileSync","existsSync","statSync","err","groupBy","results","existsSync","mkdir","readFile","writeFile","readFile","targetName","writeFile","existsSync","mkdir","mean","mkdir","readFile","readdir","writeFile","join","readFile","join","writeFile","readdir","mkdir","readFile","mkdir","writeFile","join","targetName","join","mkdir","writeFile","readFile","existsSync","readFileSync","mkdir","readFile","readdir","writeFile","dirname","join","relative","resolve","resolve","join","existsSync","env","readFileSync","dirname","evalRunCommand","relative","targetName","mkdir","writeJson","writeFile","writeGraderConfigs","readFile","readdir","evalRunCommand","mkdir","writeFile","path","path","mkdir","toCommandOutputWire","writeFile","printHumanOutput","path","colors","noColor","c","ansiPattern","stripAnsi","padRight","padLeft","RESULT_INDEX_FILENAME","path","mean","run","readline","existsSync","mkdirSync","readFileSync","statSync","writeFileSync","path","readFileSync","path","err","existsSync","relative","statSync","mkdirSync","writeJson","writeFileSync","RESULT_INDEX_FILENAME","err","readline","existsSync","rmSync","path","path","RESULT_INDEX_FILENAME","existsSync","run","rmSync","run","err","cpSync","existsSync","readFileSync","path","mkdir","writeFile","path","path","relative","entries","mkdir","writeFile","existsSync","existsSync","RESULT_INDEX_FILENAME","path","readFileSync","dirname","existsSync","cpSync","dryRun","writeArtifactsFromResults","existsSync","mkdirSync","readFileSync","writeFileSync","path","path","existsSync","readFileSync","escapeHtml","mkdirSync","writeFileSync","existsSync","readFileSync","existsSync","readFileSync","existsSync","readFileSync","statSync","path","isRecord","path","entries","RESULT_INDEX_FILENAME","existsSync","readFileSync","summaryPath","statSync","existsSync","readFileSync","readdirSync","statSync","path","fileURLToPath","execFileSync","existsSync","mkdirSync","path","fileURLToPath","run","path","RESULT_INDEX_FILENAME","existsSync","c","fileURLToPath","execFileSync","mkdirSync","app","err","command","existsSync","mkdirSync","readFileSync","writeFileSync","path","stringifyYaml","path","existsSync","readFileSync","mkdirSync","_","rest","writeFileSync","RESULT_INDEX_FILENAME","path","resolveSourceFile","existsSync","existsSync","path","statSync","entries","readdirSync","isRecord","relative","c","readFileSync","page","run","err","app","fileURLToPath","resolveSourceFile","readFile","path","isRecord","path","readFile","relative","loadEnvFile","targetName","spawn","existsSync","dirname","join","resolve","command","existsSync","readFileSync","readdirSync","path","fileURLToPath","existsSync","readdirSync","path","fileURLToPath","readFileSync","skill","writeFileSync","path","path","writeFileSync","readFileSync","writeFileSync","readFileSync","writeFileSync","formatSummary","constants","access","readdir","stat","path","fg","path","access","constants","stat","entries","readdir","formatSummary","spawn","readFile","join","NPM_REGISTRY_BASE","path","join","readFile","spawn","path"]}
|