agentv 5.3.0-next.1 → 5.3.1-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 +22 -20
- package/dist/{artifact-writer-JFNIPMKW.js → artifact-writer-7NBCOAYC.js} +4 -4
- package/dist/{chunk-T32NL3E6.js → chunk-ASIGJIOJ.js} +50 -30
- package/dist/chunk-ASIGJIOJ.js.map +1 -0
- package/dist/{chunk-6ZZCDZPD.js → chunk-ELCJ23K4.js} +12766 -12478
- package/dist/chunk-ELCJ23K4.js.map +1 -0
- package/dist/{chunk-FVR4RQFK.js → chunk-LKGARI3W.js} +333 -24
- package/dist/chunk-LKGARI3W.js.map +1 -0
- package/dist/{chunk-V52ATPTT.js → chunk-LXBI3SPX.js} +142 -14
- package/dist/chunk-LXBI3SPX.js.map +1 -0
- package/dist/{chunk-BHKQHG26.js → chunk-RKE7SSET.js} +2 -2
- package/dist/cli.js +5 -5
- package/dist/dashboard/assets/{index-DNgf3qJ2.js → index-CbEMiJSb.js} +1 -1
- package/dist/dashboard/assets/{index-r_jSJmlw.js → index-DTA6-l7q.js} +3 -3
- package/dist/dashboard/index.html +1 -1
- package/dist/{dist-6Z7U473R.js → dist-NMXMI5SK.js} +17 -5
- package/dist/index.js +5 -5
- package/dist/{interactive-RUY3OCBI.js → interactive-BN527UV3.js} +5 -5
- 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 +39 -21
- package/dist/skills/agentv-eval-writer/SKILL.md +75 -46
- package/dist/skills/agentv-eval-writer/references/custom-evaluators.md +10 -5
- package/dist/skills/agentv-eval-writer/references/eval.schema.json +749 -2158
- package/dist/skills/agentv-eval-writer/references/rubric-evaluator.md +1 -1
- package/dist/{ts-eval-loader-DQDYRULE-V3377FOL.js → ts-eval-loader-2RFVZHCT-7CZ3DCDD.js} +8 -4
- package/package.json +1 -1
- package/dist/chunk-6ZZCDZPD.js.map +0 -1
- package/dist/chunk-FVR4RQFK.js.map +0 -1
- package/dist/chunk-T32NL3E6.js.map +0 -1
- package/dist/chunk-V52ATPTT.js.map +0 -1
- /package/dist/{artifact-writer-JFNIPMKW.js.map → artifact-writer-7NBCOAYC.js.map} +0 -0
- /package/dist/{chunk-BHKQHG26.js.map → chunk-RKE7SSET.js.map} +0 -0
- /package/dist/{dist-6Z7U473R.js.map → dist-NMXMI5SK.js.map} +0 -0
- /package/dist/{interactive-RUY3OCBI.js.map → interactive-BN527UV3.js.map} +0 -0
- /package/dist/{ts-eval-loader-DQDYRULE-V3377FOL.js.map → ts-eval-loader-2RFVZHCT-7CZ3DCDD.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
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/index.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","../../../packages/sdk/src/schemas.ts","../../../packages/sdk/src/index.ts","../../../packages/sdk/src/eval.ts","../../../packages/sdk/src/graders.ts","../../../packages/sdk/src/target-client.ts","../../../packages/sdk/src/workspace.ts","../../../packages/sdk/src/runtime.ts","../../../packages/sdk/src/deprecation.ts","../../../packages/sdk/src/vitest.ts","../../../packages/sdk/src/assertion.ts","../../../packages/sdk/src/prompt-template.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"],"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 { loadConfig, runBeforeSessionHook } 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 // Run before_session hook once at startup, before any command executes.\n // Uses cwd as the search root for .agentv/config.yaml.\n const cwd = process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n const sessionConfig = await loadConfig(path.join(cwd, '_'), repoRoot);\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/sdk';\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/sdk';\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\ntarget: 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\ntarget: 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/targets.yaml using the CLI provider:\n *\n * targets:\n * - name: my-target\n * provider: cli\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/targets.yaml:\\n targets:\\n - name: ${name}\\n provider: cli\\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 TargetDefinition,\n loadTestSuite,\n readTargetDefinitions,\n} from '@agentv/core';\nimport { array, command, multioption, option, optional, positional, string } from 'cmd-ts';\n\nimport { discoverTargetsFile } from '../../../utils/targets.js';\nimport { loadEnvFromHierarchy } from '../env.js';\nimport { findRepoRoot, resolveEvalPaths } from '../shared.js';\nimport { readTestSuiteTarget } from '../targets.js';\nimport { type TaskBundleTargetSelection, 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: TargetDefinition): 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 targetName: string,\n definitions: readonly TargetDefinition[],\n targetsFilePath: 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 target '${requestedBy}'` : '';\n throw new Error(\n `Target '${name}'${owner} not found in ${targetsFilePath}. Available targets: ${available}`,\n );\n }\n seen.add(name);\n for (const referenceName of targetReferenceNames(definition)) {\n visit(referenceName, name);\n }\n }\n\n visit(targetName);\n}\n\nfunction definitionsWithEvalTargetRefs(\n definitions: readonly TargetDefinition[],\n targetRefs: readonly EvalTargetRef[] | undefined,\n): readonly TargetDefinition[] {\n if (!targetRefs) {\n return definitions;\n }\n\n const result = [...definitions];\n for (const ref of targetRefs) {\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 TargetDefinition);\n }\n }\n return result;\n}\n\nfunction definitionsWithEvalTargetSpec(\n definitions: readonly TargetDefinition[],\n targetSpec: EvalTargetSpec | undefined,\n): readonly TargetDefinition[] {\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 `Target '${targetSpec.extends}' not found for eval-local target '${targetSpec.name}'. Available targets: ${available}`,\n );\n }\n const effective = {\n ...base,\n ...targetSpec.definition,\n name: targetSpec.name,\n } as TargetDefinition;\n return [effective, ...definitions.filter((definition) => definition.name !== targetSpec.name)];\n}\n\nfunction buildBundleRuntime(options: {\n readonly targetNames: readonly string[];\n readonly budgetUsd?: number;\n readonly threshold?: number;\n}): Record<string, unknown> {\n const runtime: Record<string, unknown> =\n options.targetNames.length === 1 ? { target: options.targetNames[0] } : {};\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: 'Target name to bundle (repeatable). Defaults to eval target(s) or default.',\n }),\n targets: option({\n type: optional(string),\n long: 'targets',\n description: 'Path to targets.yaml (overrides discovery)',\n }),\n },\n handler: async (args) => {\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 TargetDefinition[];\n let targetNames: readonly string[];\n if (suite.inlineTarget) {\n definitions = [suite.inlineTarget];\n targetNames = unique(args.target.length > 0 ? args.target : [suite.inlineTarget.name]);\n } else {\n const targetsFilePath = await discoverTargetsFile({\n explicitPath: args.targets,\n testFilePath: evalFilePath,\n repoRoot,\n cwd,\n });\n definitions = definitionsWithEvalTargetSpec(\n definitionsWithEvalTargetRefs(\n await readTargetDefinitions(targetsFilePath),\n suite.targetRefs,\n ),\n suite.targetSpec,\n );\n const suiteTarget = await readTestSuiteTarget(evalFilePath);\n targetNames = unique(\n args.target.length > 0\n ? args.target\n : (suite.targets ?? [suite.targetSpec?.name ?? suiteTarget ?? 'default']),\n );\n for (const targetName of targetNames) {\n ensureTargetGraph(targetName, definitions, targetsFilePath);\n }\n }\n\n const targetSelections: TaskBundleTargetSelection[] = targetNames.map((targetName) => ({\n evalFileAbsolutePath: evalFilePath,\n targetName,\n definitions,\n }));\n\n const paths = await materializeEvalBundle({\n evalFilePath,\n tests: suite.tests,\n targetSelections,\n outputDir: args.out,\n cwd,\n repoRoot,\n runtime: buildBundleRuntime({\n targetNames,\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 ` Targets: ${path.relative(paths.bundleDir, paths.targetsPath).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 target: multioption({\n type: array(string),\n long: 'target',\n description: 'Override target name(s) from targets.yaml (repeatable for matrix evaluation)',\n }),\n targets: option({\n type: optional(string),\n long: 'targets',\n description: 'Path to targets.yaml (overrides discovery)',\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-target in targets.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 graderTarget: option({\n type: optional(string),\n long: 'grader-target',\n description:\n 'Override grader target for all evaluators (e.g., \"agentv\", or a target name from targets.yaml)',\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 targets.',\n }),\n recordReplay: option({\n type: optional(string),\n long: 'record-replay',\n description:\n 'Append live target 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: Record<string, unknown> = {\n target: args.target,\n targets: args.targets,\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.graderTarget,\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 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","/**\n * Zod schemas for script grader input/output validation.\n * Provides both compile-time types and runtime validation.\n *\n * ## Content model\n *\n * `Message.content` accepts `string | object[] | object`:\n * - `string` — backward-compatible plain text (most common case)\n * - `object[]` — typed content blocks for multimodal messages, plus AgentV\n * eval input blocks such as `{ type: \"file\", value, path, text }`\n * - `object` — structured YAML/JSON content such as expected outputs\n *\n * Content variants:\n * - `ContentText` — `{ type: 'text', text: string }`\n * - `ContentImage` — `{ type: 'image', media_type: string, path: string }` (file path, not base64)\n * - `ContentFile` — `{ type: 'file', media_type: string, path: string }`\n *\n * To add a new content variant:\n * 1. Define a new Zod schema with a unique `type` literal\n * 2. Add it to `ContentSchema` discriminated union\n * 3. Re-export from `index.ts`\n */\nimport { z } from 'zod';\n\n/**\n * Token usage metrics schema.\n */\nexport const TokenUsageSchema = z.object({\n input: z.number(),\n output: z.number(),\n cached: z.number().optional(),\n reasoning: z.number().optional(),\n});\n\n/**\n * Derived trace summary schema (camelCase for TypeScript ergonomics).\n *\n * This is a compact read model for metric-style graders. Full transcript/tool\n * evidence lives in the canonical `Trace` under `messages` and `events`.\n */\nexport const TraceSummarySchema = z.object({\n eventCount: z.number(),\n toolCalls: z.record(z.string(), z.number()),\n errorCount: z.number(),\n toolDurations: z.record(z.string(), z.array(z.number())).optional(),\n llmCallCount: z.number().optional(),\n});\n\nexport const TRACE_SOURCE_KINDS = [\n 'agentv_run',\n 'otlp',\n 'phoenix',\n 'langfuse',\n 'pi_session',\n 'imported_transcript',\n 'compact_transcript',\n] as const;\n\nexport const TRACE_EVENT_TYPES = [\n 'message',\n 'model_turn',\n 'tool_call',\n 'tool_result',\n 'final_response',\n 'error',\n] as const;\n\nexport const TRACE_TOOL_STATUSES = ['ok', 'error', 'timeout', 'cancelled', 'unknown'] as const;\n\nexport const TRACE_REDACTION_LEVELS = ['none', 'partial', 'full'] as const;\n\nconst MetadataSchema = z.record(z.string(), z.unknown());\n\nexport const TraceRedactionStateSchema = z.object({\n level: z.enum(TRACE_REDACTION_LEVELS),\n fields: z.array(z.string()).optional(),\n reason: z.string().optional(),\n});\n\nexport const TraceErrorSchema = z.object({\n message: z.string(),\n name: z.string().optional(),\n code: z.string().optional(),\n stack: z.string().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const TraceSourceSchema = z.object({\n kind: z.enum(TRACE_SOURCE_KINDS),\n path: z.string().optional(),\n url: z.string().optional(),\n provider: z.string().optional(),\n format: z.string().optional(),\n version: z.string().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const TraceSessionSchema = z.object({\n sessionId: z.string().optional(),\n conversationId: z.string().optional(),\n cwd: z.string().optional(),\n startedAt: z.string().optional(),\n endedAt: z.string().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const TraceBranchSchema = z.object({\n selectedLeafId: z.string().optional(),\n selectedPathIds: z.array(z.string()).optional(),\n includedEventIds: z.array(z.string()).optional(),\n omittedEventIds: z.array(z.string()).optional(),\n selectionReason: z.string().optional(),\n});\n\nexport const TraceSourceRefSchema = z.object({\n eventId: z.string().optional(),\n messageId: z.string().optional(),\n spanId: z.string().optional(),\n traceId: z.string().optional(),\n rawKind: z.string().optional(),\n path: z.string().optional(),\n line: z.number().int().nonnegative().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const TraceRawEvidenceSchema = z.object({\n kind: z.string(),\n ref: z.string().optional(),\n mediaType: z.string().optional(),\n content: z.unknown().optional(),\n redacted: z.boolean().optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const TraceMessageSchema = z.object({\n role: z.string(),\n name: z.string().optional(),\n content: z.unknown().optional(),\n redaction: TraceRedactionStateSchema.optional(),\n tokenUsage: TokenUsageSchema.optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const TraceModelSchema = z.object({\n provider: z.string().optional(),\n name: z.string().optional(),\n invocationId: z.string().optional(),\n tokenUsage: TokenUsageSchema.optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const TraceToolSchema = z.object({\n name: z.string(),\n callId: z.string().optional(),\n input: z.unknown().optional(),\n output: z.unknown().optional(),\n status: z.enum(TRACE_TOOL_STATUSES).optional(),\n error: TraceErrorSchema.optional(),\n redaction: TraceRedactionStateSchema.optional(),\n metadata: MetadataSchema.optional(),\n});\n\nexport const TraceEventSchema = z.object({\n eventId: z.string(),\n parentEventId: z.string().optional(),\n ordinal: z.number().int().nonnegative(),\n type: z.enum(TRACE_EVENT_TYPES),\n timestamp: z.string().optional(),\n durationMs: z.number().nonnegative().optional(),\n durationInferred: z.boolean().optional(),\n turnIndex: z.number().int().nonnegative().optional(),\n message: TraceMessageSchema.optional(),\n model: TraceModelSchema.optional(),\n tool: TraceToolSchema.optional(),\n error: TraceErrorSchema.optional(),\n sourceRef: TraceSourceRefSchema.optional(),\n rawEvidence: z.array(TraceRawEvidenceSchema).optional(),\n redaction: TraceRedactionStateSchema.optional(),\n metadata: MetadataSchema.optional(),\n});\n\n/**\n * Derived trace artifact shape used by import/replay helpers.\n *\n * This is not a persisted public trace contract. Grader authors normally\n * receive the result-local `Trace` shape below.\n */\nexport const TraceArtifactSchema = z.object({\n source: TraceSourceSchema,\n session: TraceSessionSchema,\n branch: TraceBranchSchema.optional(),\n events: z.array(TraceEventSchema),\n tokenUsage: TokenUsageSchema.optional(),\n costUsd: z.number().optional(),\n durationMs: z.number().optional(),\n startedAt: z.string().optional(),\n endedAt: z.string().optional(),\n metadata: MetadataSchema.optional(),\n});\n\n/**\n * Tool call schema.\n */\nexport const ToolCallSchema = z.object({\n tool: z.string(),\n input: z.unknown().optional(),\n output: z.unknown().optional(),\n id: z.string().optional(),\n startTime: z.string().optional(),\n endTime: z.string().optional(),\n durationMs: z.number().optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Content block schemas (discriminated union on `type`)\n// ---------------------------------------------------------------------------\n\n/** Text content block. */\nexport const ContentTextSchema = z.object({\n type: z.literal('text'),\n text: z.string(),\n});\n\n/**\n * Image content block.\n * `path` is a filesystem path — never inline base64.\n */\nexport const ContentImageSchema = z.object({\n type: z.literal('image'),\n media_type: z.string(),\n path: z.string(),\n});\n\n/** File content block. */\nexport const ContentFileSchema = z.object({\n type: z.literal('file'),\n media_type: z.string(),\n path: z.string(),\n});\n\n/** Discriminated union of all content block types. */\nexport const ContentSchema = z.discriminatedUnion('type', [\n ContentTextSchema,\n ContentImageSchema,\n ContentFileSchema,\n]);\n\nconst MessageContentBlockSchema = z.union([ContentSchema, z.record(z.unknown())]);\n\n/**\n * Unified message schema for input, expected, and output messages.\n *\n * `content` is a plain string, an array of structured blocks, or a\n * structured object from YAML/JSON eval files. Use `getTextContent()` from\n * `@agentv/core` to extract plain text when the content is textual.\n */\nexport const MessageSchema = z.object({\n role: z.enum(['assistant', 'user', 'system', 'tool']),\n content: z\n .union([z.string(), z.array(MessageContentBlockSchema), z.record(z.unknown())])\n .optional(),\n toolCalls: z.array(ToolCallSchema).optional(),\n name: z.string().optional(),\n startTime: z.string().optional(),\n endTime: z.string().optional(),\n durationMs: z.number().optional(),\n metadata: z.record(z.unknown()).optional(),\n});\n\n/**\n * Derived evaluation trace read model exposed to custom assertions and script graders.\n *\n * Top-level summary fields (`eventCount`, `toolCalls`, `errorCount`) remain\n * available for existing metric graders; full transcript/tool evidence is under\n * `messages` and structured execution events under `events`.\n */\nexport const TraceSchema = TraceSummarySchema.extend({\n messages: z.array(MessageSchema),\n events: z.array(TraceEventSchema),\n tokenUsage: TokenUsageSchema.optional(),\n costUsd: z.number().optional(),\n durationMs: z.number().optional(),\n startTime: z.string().optional(),\n endTime: z.string().optional(),\n metadata: MetadataSchema.optional(),\n});\n\n/**\n * Script grader input schema (camelCase, converted from snake_case wire format).\n *\n * `output` is the final answer/scored result only. Transcript-aware graders\n * should inspect `messages`, `trace.messages`, or `trace.events`.\n */\nexport const ScriptGraderInputSchema = z.object({\n criteria: z.string(),\n expectedOutput: z.array(MessageSchema),\n output: z.string().nullable().optional(),\n messages: z.array(MessageSchema).optional().default([]),\n /** Path to a temp file containing the output JSON (used for large payloads). */\n outputPath: z.string().optional(),\n inputFiles: z.array(z.string()),\n input: z.array(MessageSchema),\n metadata: z.record(z.unknown()).nullable().optional(),\n trace: TraceSchema.nullable().optional(),\n traceSummary: TraceSummarySchema.nullable().optional(),\n tokenUsage: TokenUsageSchema.nullable().optional(),\n costUsd: z.number().nullable().optional(),\n durationMs: z.number().nullable().optional(),\n startTime: z.string().nullable().optional(),\n endTime: z.string().nullable().optional(),\n fileChanges: z.string().nullable().optional(),\n workspacePath: z.string().nullable().optional(),\n config: z.record(z.unknown()).nullable().optional(),\n});\n\nexport const ScriptGraderCheckSchema = z.object({\n id: z.string().optional(),\n text: z.string(),\n pass: z.boolean(),\n score: z.number().min(0).max(1).optional(),\n reason: z.string(),\n evidence: z.string().optional(),\n});\n\n/**\n * Script grader result schema (validated before output).\n */\nexport const ScriptGraderResultSchema = z.object({\n pass: z.boolean(),\n score: z.number().min(0).max(1),\n reason: z.string(),\n checks: z.array(ScriptGraderCheckSchema).optional().default([]),\n /** Optional structured details for domain-specific metrics (e.g., TP/TN/FP/FN counts, alignments). */\n details: z.record(z.unknown()).optional(),\n});\n\n/**\n * Inferred types from schemas.\n */\nexport type ScriptGraderInput = z.infer<typeof ScriptGraderInputSchema>;\nexport type ScriptGraderCheck = z.infer<typeof ScriptGraderCheckSchema>;\nexport type ScriptGraderResult = z.infer<typeof ScriptGraderResultSchema>;\n\nexport type TraceSummary = z.infer<typeof TraceSummarySchema>;\nexport type Trace = z.infer<typeof TraceSchema>;\nexport type TraceArtifact = z.infer<typeof TraceArtifactSchema>;\nexport type TraceSource = z.infer<typeof TraceSourceSchema>;\nexport type TraceSession = z.infer<typeof TraceSessionSchema>;\nexport type TraceBranch = z.infer<typeof TraceBranchSchema>;\nexport type TraceEvent = z.infer<typeof TraceEventSchema>;\nexport type TraceMessage = z.infer<typeof TraceMessageSchema>;\nexport type TraceModel = z.infer<typeof TraceModelSchema>;\nexport type TraceTool = z.infer<typeof TraceToolSchema>;\nexport type TraceError = z.infer<typeof TraceErrorSchema>;\nexport type TraceSourceRef = z.infer<typeof TraceSourceRefSchema>;\nexport type TraceRawEvidence = z.infer<typeof TraceRawEvidenceSchema>;\nexport type TraceRedactionState = z.infer<typeof TraceRedactionStateSchema>;\nexport type Message = z.infer<typeof MessageSchema>;\nexport type ToolCall = z.infer<typeof ToolCallSchema>;\nexport type TokenUsage = z.infer<typeof TokenUsageSchema>;\n\nexport type ContentText = z.infer<typeof ContentTextSchema>;\nexport type ContentImage = z.infer<typeof ContentImageSchema>;\nexport type ContentFile = z.infer<typeof ContentFileSchema>;\nexport type Content = z.infer<typeof ContentSchema>;\n\n/**\n * Prompt template input schema (camelCase, converted from snake_case wire format).\n * Uses the same schema as ScriptGraderInput since the orchestrator sends identical payloads.\n */\nexport const PromptTemplateInputSchema = ScriptGraderInputSchema;\n\nexport type PromptTemplateInput = ScriptGraderInput;\n\n// ── Backward-compat aliases (deprecated) ────────────────────────────────────────\n/** @deprecated Use ScriptGraderInputSchema */\nexport const CodeGraderInputSchema = ScriptGraderInputSchema;\n/** @deprecated Use ScriptGraderResultSchema */\nexport const CodeGraderResultSchema = ScriptGraderResultSchema;\n/** @deprecated Use ScriptGraderInput */\nexport type CodeGraderInput = ScriptGraderInput;\n/** @deprecated Use ScriptGraderResult */\nexport type CodeGraderResult = ScriptGraderResult;\n/** @deprecated Use ScriptGraderInputSchema */\nexport const CodeJudgeInputSchema = ScriptGraderInputSchema;\n/** @deprecated Use ScriptGraderResultSchema */\nexport const CodeJudgeResultSchema = ScriptGraderResultSchema;\n/** @deprecated Use ScriptGraderInput */\nexport type CodeJudgeInput = ScriptGraderInput;\n/** @deprecated Use ScriptGraderResult */\nexport type CodeJudgeResult = ScriptGraderResult;\n","/**\n * AgentV Evaluation SDK\n *\n * Build custom assertions, script graders, and eval authoring helpers for AI agent outputs.\n *\n * @example Custom assertion (simplest way to add evaluation logic)\n * ```typescript\n * #!/usr/bin/env bun\n * import { defineAssertion } from '@agentv/sdk';\n *\n * export default defineAssertion(({ output, criteria }) => {\n * const answer = output ?? '';\n * return {\n * pass: answer.includes('hello'),\n * score: answer.includes('hello') ? 1 : 0,\n * reason: answer.includes('hello') ? 'Greeting found' : 'Greeting missing',\n * };\n * }));\n * ```\n *\n * @example script grader (full control)\n * ```typescript\n * #!/usr/bin/env bun\n * import { defineScriptGrader } from '@agentv/sdk';\n *\n * export default defineScriptGrader(({ output, traceSummary }) => {\n * return {\n * score: (output ?? '').length > 0 && (traceSummary?.eventCount ?? 0) <= 5 ? 1.0 : 0.5,\n * pass: (output ?? '').length > 0 && (traceSummary?.eventCount ?? 0) <= 5,\n * reason: 'Checks answer text and trace size',\n * checks: [\n * { text: 'Answer is not empty', pass: (output ?? '').length > 0, reason: 'Output text is present' },\n * { text: 'Efficient tool usage', pass: (traceSummary?.eventCount ?? 0) <= 5, reason: 'Trace event count is within limit' },\n * ],\n * };\n * }));\n * ```\n *\n * @example Vitest workspace verifier adapter (custom wrapper form)\n * ```typescript\n * #!/usr/bin/env bun\n * import { defineVitestWorkspaceGrader } from '@agentv/sdk';\n *\n * export default defineVitestWorkspaceGrader({\n * testFile: 'graders/welcome-banner.test.ts',\n * copyTestFilesToWorkspace: true,\n * });\n * ```\n *\n * @example Workspace grader (small file checks)\n * ```typescript\n * #!/usr/bin/env bun\n * import { defineWorkspaceGrader } from '@agentv/sdk';\n *\n * export default defineWorkspaceGrader(async ({ workspace }) => [\n * await workspace.file('app/page.tsx').contains('Status: All systems ready'),\n * await workspace.file('app/page.tsx').contains('Open dashboard'),\n * await workspace.file('app/page.tsx').matches(/href=[\"']\\/dashboard[\"']/),\n * await workspace.file('app/page.tsx').notMatches(/TODO/i),\n * ]);\n * ```\n *\n * @packageDocumentation\n */\n\n// Re-export schemas and types\nexport {\n ScriptGraderInputSchema,\n ScriptGraderCheckSchema,\n ScriptGraderResultSchema,\n CodeGraderInputSchema,\n CodeGraderResultSchema,\n TRACE_REDACTION_LEVELS,\n TRACE_SOURCE_KINDS,\n TRACE_EVENT_TYPES,\n TRACE_TOOL_STATUSES,\n TraceSummarySchema,\n TraceSchema,\n TraceArtifactSchema,\n TraceRawEvidenceSchema,\n TraceRedactionStateSchema,\n TraceBranchSchema,\n TraceErrorSchema,\n TraceEventSchema,\n TraceMessageSchema,\n TraceModelSchema,\n TraceSessionSchema,\n TraceSourceRefSchema,\n TraceSourceSchema,\n TraceToolSchema,\n MessageSchema,\n ToolCallSchema,\n TokenUsageSchema,\n PromptTemplateInputSchema,\n ContentTextSchema,\n ContentImageSchema,\n ContentFileSchema,\n ContentSchema,\n type ScriptGraderInput,\n type ScriptGraderCheck,\n type ScriptGraderResult,\n type CodeGraderInput,\n type CodeGraderResult,\n type TraceArtifact,\n type TraceRawEvidence,\n type TraceRedactionState,\n type TraceBranch,\n type TraceError,\n type TraceEvent,\n type TraceMessage,\n type TraceModel,\n type TraceSession,\n type TraceSource,\n type TraceSourceRef,\n type TraceTool,\n type TraceSummary,\n type Trace,\n type Message,\n type ToolCall,\n type TokenUsage,\n type PromptTemplateInput,\n type ContentText,\n type ContentImage,\n type ContentFile,\n type Content,\n} from './schemas.js';\n\n// Re-export YAML-aligned eval authoring helpers\nexport {\n evaluate,\n type AssertEntry,\n type ConversationTurnInput,\n type EvalAssertionInput,\n type EvalConfig,\n type EvalRunArtifacts,\n type EvalRunResult,\n type EvalSummary,\n type EvalTestInput,\n} from '@agentv/core';\n\nexport {\n defineEval,\n evalSuite,\n serializeEvalYaml,\n toEvalYamlObject,\n type DefinedEvalSuite,\n type EvalAssertionConfig,\n type EvalDefinition,\n type EvalDockerEnvironment,\n type EvalDockerEnvironmentMount,\n type EvalDockerEnvironmentResources,\n type EvalEnvironment,\n type EvalEnvironmentSetup,\n type EvalExecution,\n type EvalHostEnvironment,\n type EvalLifecycleHook,\n type EvalLifecycleHooks,\n type EvalMessage,\n type EvalMessageContent,\n type EvalRequires,\n type EvalTargetRef,\n type EvalTest,\n type EvalTrials,\n type EvalTurn,\n type LowerEvalYamlValue,\n} from './eval.js';\n\n// Re-export grader config helpers\nexport {\n codeGrader,\n containsGrader,\n equalsGrader,\n exactGrader,\n graders,\n isJsonGrader,\n jsonGrader,\n llmGrader,\n llmRubricGrader,\n regexGrader,\n scriptGrader,\n type ScriptGraderConfig,\n type ScriptGraderOptions,\n type ScriptGraderTargetOptions,\n type CodeGraderConfig,\n type CodeGraderOptions,\n type CodeGraderTargetOptions,\n type ContainsGraderConfig,\n type EqualsGraderConfig,\n type GraderCatalog,\n type GraderCommand,\n type GraderCommonConfig,\n type GraderHelperConfig,\n type GraderHelperOptions,\n type GraderPromptScriptConfig,\n type GraderRubric,\n type GraderRubricCriterion,\n type GraderRubricOperator,\n type GraderScoreRange,\n type IsJsonGraderConfig,\n type LlmGraderConfig,\n type LlmGraderOptions,\n type LlmRubricGraderConfig,\n type RegexGraderConfig,\n type RegexGraderOptions,\n} from './graders.js';\n\n// Re-export target client\nexport {\n createTargetClient,\n TargetNotAvailableError,\n TargetInvocationError,\n type TargetClient,\n type TargetInfo,\n type TargetInvokeRequest,\n type TargetInvokeResponse,\n} from './target-client.js';\n\n// Re-export workspace grader helpers\nexport {\n createWorkspace,\n defineWorkspaceGrader,\n normalizeWorkspaceGraderResult,\n runWorkspaceGrader,\n type Workspace,\n type WorkspaceAssertion,\n type WorkspaceCheck,\n type WorkspaceFile,\n type WorkspaceFileAssertionOptions,\n type WorkspaceGraderContext,\n type WorkspaceGraderHandler,\n type WorkspaceGraderReturn,\n} from './workspace.js';\n\n// Re-export Vitest workspace verifier adapter\nexport {\n defineVitestWorkspaceGrader,\n runVitestWorkspaceGrader,\n vitestReportToScriptGraderResult,\n vitestReportToCodeGraderResult,\n type VitestWorkspaceGraderOptions,\n} from './vitest.js';\n\n// Re-export Zod for typed config support\nexport { z } from 'zod';\n\n// Re-export assertion types\nexport type {\n AssertionCheck,\n AssertionContext,\n AssertionHandler,\n AssertionScore,\n AssertionType,\n} from './assertion.js';\n\nimport { type AssertionHandler, runAssertion } from './assertion.js';\nimport { type PromptTemplateHandler, runPromptTemplate } from './prompt-template.js';\nimport {\n type CodeGraderHandler,\n type ScriptGraderHandler,\n runCodeGrader,\n runScriptGrader,\n} from './runtime.js';\n\nexport { runCodeGrader, runScriptGrader };\nexport type { CodeGraderHandler, ScriptGraderHandler };\nexport type { PromptTemplateHandler };\n\n/**\n * Define a script grader with automatic stdin/stdout handling.\n *\n * This function:\n * 1. Reads JSON from stdin (snake_case format)\n * 2. Converts to camelCase and validates with Zod\n * 3. Calls your handler with typed input\n * 4. Validates the result and outputs JSON to stdout\n * 5. Handles errors gracefully with proper exit codes\n *\n * @param handler - Function that evaluates the input and returns a result\n *\n * @example\n * ```typescript\n * import { defineScriptGrader } from '@agentv/sdk';\n *\n * export default defineScriptGrader(({ trace }) => {\n * if (!trace) {\n * return { pass: false, score: 0.5, reason: 'No trace available' };\n * }\n *\n * const efficient = trace.eventCount <= 10;\n * return {\n * pass: efficient,\n * score: efficient ? 1.0 : 0.5,\n * reason: efficient ? 'Efficient execution' : 'Too many tool calls',\n * checks: [{ text: 'Trace event count within limit', pass: efficient, reason: `${trace.eventCount} events observed` }],\n * };\n * });\n * ```\n *\n * @example With typed config\n * ```typescript\n * import { defineScriptGrader, z } from '@agentv/sdk';\n *\n * const ConfigSchema = z.object({\n * maxToolCalls: z.number().default(10),\n * });\n *\n * export default defineScriptGrader(({ trace, config }) => {\n * const { maxToolCalls } = ConfigSchema.parse(config ?? {});\n * // Use maxToolCalls...\n * });\n * ```\n */\nexport function defineScriptGrader(handler: ScriptGraderHandler): void {\n // Run immediately when module is loaded\n runScriptGrader(handler);\n}\n\n/** @deprecated Use defineScriptGrader. */\nexport function defineCodeGrader(handler: ScriptGraderHandler): void {\n defineScriptGrader(handler);\n}\n\n/**\n * Define a prompt template with automatic stdin/stdout handling.\n *\n * This function:\n * 1. Reads JSON from stdin (snake_case format)\n * 2. Converts to camelCase and validates with Zod\n * 3. Calls your handler with typed input\n * 4. Outputs the generated prompt string to stdout\n * 5. Handles errors gracefully with proper exit codes\n *\n * @param handler - Function that generates the prompt string from input\n *\n * @example\n * ```typescript\n * import { definePromptTemplate } from '@agentv/sdk';\n *\n * export default definePromptTemplate((ctx) => {\n * const question = ctx.input\n * .filter((message) => message.role === 'user')\n * .map((message) => typeof message.content === 'string' ? message.content : '')\n * .join('\\n');\n * const answer = ctx.output ?? '';\n * return `Question: ${question}\\nAnswer: ${answer}`;\n * });\n * ```\n */\nexport function definePromptTemplate(handler: PromptTemplateHandler): void {\n // Run immediately when module is loaded\n runPromptTemplate(handler);\n}\n\n/**\n * Define a custom assertion with automatic stdin/stdout handling.\n *\n * Assertions are the simplest way to add reusable custom checks. They receive\n * the full evaluation context and return a pass/fail result with optional\n * granular scoring. Place these files in `.agentv/assertions/` and reference\n * them by discovered assertion type name. Use defineScriptGrader for\n * command-backed graders referenced with `type: script`.\n *\n * This function:\n * 1. Reads JSON from stdin (snake_case format)\n * 2. Converts to camelCase and validates with Zod\n * 3. Calls your handler with typed context\n * 4. Normalizes the result (pass→score, clamp, etc.)\n * 5. Outputs JSON to stdout\n * 6. Handles errors gracefully with proper exit codes\n *\n * @param handler - Function that evaluates the context and returns a result\n *\n * @example Simple pass/fail\n * ```typescript\n * import { defineAssertion } from '@agentv/sdk';\n *\n * export default defineAssertion(({ output }) => {\n * const text = output ?? '';\n * return {\n * pass: text.toLowerCase().includes('hello'),\n * reason: text.toLowerCase().includes('hello') ? 'Greeting found' : 'Greeting missing',\n * };\n * }));\n * ```\n *\n * @example Granular scoring\n * ```typescript\n * import { defineAssertion } from '@agentv/sdk';\n *\n * export default defineAssertion(({ output, traceSummary }) => {\n * const text = output ?? '';\n * const hasContent = text.length > 0 ? 0.5 : 0;\n * const isEfficient = (traceSummary?.eventCount ?? 0) <= 5 ? 0.5 : 0;\n * return {\n * score: hasContent + isEfficient,\n * reason: 'Checks content exists and trace size',\n * checks: [\n * { text: 'Has content', pass: !!hasContent, reason: hasContent ? 'Output is non-empty' : 'Output is empty' },\n * { text: 'Efficient', pass: !!isEfficient, reason: isEfficient ? 'Trace is within limit' : 'Trace exceeds limit' },\n * ],\n * };\n * }));\n * ```\n */\nexport function defineAssertion(handler: AssertionHandler): void {\n runAssertion(handler);\n}\n","import { stringify as stringifyYaml } from 'yaml';\n\nconst EVAL_SUITE_SYMBOL = Symbol.for('@agentv/sdk/eval-suite');\nconst TO_EVAL_YAML_OBJECT_SYMBOL = Symbol.for('@agentv/sdk/to-eval-yaml-object');\n\nconst KNOWN_SNAKE_CASE_KEYS = {\n afterAll: 'after_all',\n afterEach: 'after_each',\n argsMatch: 'args_match',\n beforeAll: 'before_all',\n beforeEach: 'before_each',\n budgetUsd: 'budget_usd',\n conversationId: 'conversation_id',\n costLimitUsd: 'cost_limit_usd',\n dependsOn: 'depends_on',\n earlyExit: 'early_exit',\n expectedOutput: 'expected_output',\n explorationTolerance: 'exploration_tolerance',\n failOnError: 'fail_on_error',\n inputFiles: 'input_files',\n keepWorkspaces: 'keep_workspaces',\n maxCalls: 'max_calls',\n maxCostUsd: 'max_cost_usd',\n maxDurationMs: 'max_duration_ms',\n maxInput: 'max_input',\n maxLlmCalls: 'max_llm_calls',\n maxOutput: 'max_output',\n maxSteps: 'max_steps',\n maxTokens: 'max_tokens',\n maxToolCalls: 'max_tool_calls',\n minScore: 'min_score',\n onDependencyFailure: 'on_dependency_failure',\n onTurnFailure: 'on_turn_failure',\n outputPath: 'output_path',\n readOnly: 'read_only',\n reasoningEffort: 'reasoning_effort',\n scoreRange: 'score_range',\n scoreRanges: 'score_ranges',\n skipDefaults: 'skip_defaults',\n targetExplorationRatio: 'target_exploration_ratio',\n timeoutMs: 'timeout_ms',\n timeoutSeconds: 'timeout_seconds',\n useTarget: 'use_target',\n windowSize: 'window_size',\n} as const;\n\ntype KnownSnakeCaseKeyMap = typeof KNOWN_SNAKE_CASE_KEYS;\n\ntype LowerEvalKey<Key extends string> = Key extends keyof KnownSnakeCaseKeyMap\n ? KnownSnakeCaseKeyMap[Key]\n : Key;\n\nexport type LowerEvalYamlValue<Value> = Value extends readonly (infer Item)[]\n ? LowerEvalYamlValue<Item>[]\n : Value extends object\n ? {\n [Key in keyof Value as Key extends string ? LowerEvalKey<Key> : never]: LowerEvalYamlValue<\n Value[Key]\n >;\n }\n : Value;\n\nexport type EvalMessageContent =\n | string\n | Readonly<Record<string, unknown>>\n | readonly (string | Readonly<Record<string, unknown>>)[];\n\nexport interface EvalMessage {\n readonly role: 'system' | 'user' | 'assistant' | 'tool';\n readonly content: EvalMessageContent;\n readonly [key: string]: unknown;\n}\n\nexport interface EvalAssertionConfig {\n readonly type: string;\n readonly [key: string]: unknown;\n}\n\nexport interface EvalLifecycleHook {\n readonly command?: string | readonly string[];\n readonly timeoutMs?: number;\n readonly cwd?: string;\n readonly reset?: 'none' | 'fast' | 'strict';\n readonly [key: string]: unknown;\n}\n\nexport interface EvalLifecycleHooks {\n readonly enabled?: boolean;\n readonly beforeAll?: EvalLifecycleHook;\n readonly beforeEach?: EvalLifecycleHook;\n readonly afterEach?: EvalLifecycleHook;\n readonly afterAll?: EvalLifecycleHook;\n}\n\nexport interface EvalEnvironmentSetup {\n readonly command: readonly string[];\n readonly cwd?: string;\n readonly timeoutMs?: number;\n}\n\nexport interface EvalDockerEnvironmentMount {\n readonly source: string;\n readonly target: string;\n readonly access?: 'ro' | 'rw';\n readonly readOnly?: boolean;\n}\n\nexport interface EvalDockerEnvironmentResources {\n readonly cpus?: number;\n readonly memory?: string;\n readonly disk?: string;\n readonly gpu?: boolean | string;\n}\n\nexport interface EvalHostEnvironment {\n readonly type: 'host';\n readonly workdir: string;\n readonly setup?: EvalEnvironmentSetup;\n readonly env?: Readonly<Record<string, string>>;\n}\n\nexport interface EvalDockerEnvironment {\n readonly type: 'docker';\n readonly workdir: string;\n readonly context?: string;\n readonly dockerfile?: string;\n readonly image?: string;\n readonly setup?: EvalEnvironmentSetup;\n readonly env?: Readonly<Record<string, string>>;\n readonly resources?: EvalDockerEnvironmentResources;\n readonly mounts?: readonly EvalDockerEnvironmentMount[];\n readonly secrets?: Readonly<Record<string, string>>;\n}\n\nexport type EvalEnvironment = EvalHostEnvironment | EvalDockerEnvironment;\n\nexport interface EvalTargetRef {\n readonly label: string;\n readonly id?: string;\n readonly useTarget?: string;\n readonly hooks?: EvalLifecycleHooks;\n}\n\nexport interface EvalTargetConfig {\n readonly extends?: string;\n readonly id?: string;\n readonly label?: string;\n readonly provider?: string;\n readonly model?: string;\n readonly config?: Readonly<Record<string, unknown>>;\n readonly prompts?: unknown;\n readonly transform?: unknown;\n readonly delay?: number;\n readonly env?: Readonly<Record<string, string>>;\n readonly reasoningEffort?: string;\n readonly hooks?: EvalLifecycleHooks;\n readonly [key: string]: unknown;\n}\n\nexport interface EvalTrials {\n readonly count: number;\n readonly strategy?: 'pass_any' | 'pass_all' | 'mean' | 'confidence_interval';\n readonly earlyExit?: boolean;\n readonly costLimitUsd?: number;\n}\n\nexport type EvalRepeat = EvalTrials;\n\nexport interface EvalExecution {\n readonly target?: string;\n readonly targets?: readonly (string | EvalTargetRef)[];\n readonly assert?: readonly EvalAssertionConfig[];\n readonly skipDefaults?: boolean;\n readonly cache?: boolean;\n readonly trials?: EvalTrials;\n readonly budgetUsd?: number;\n readonly failOnError?: boolean;\n readonly threshold?: number;\n readonly [key: string]: unknown;\n}\n\nexport interface EvalTurn {\n readonly input: EvalMessageContent;\n readonly expectedOutput?: EvalMessageContent;\n readonly assert?: readonly (string | EvalAssertionConfig)[];\n}\n\nexport interface EvalTest {\n readonly id: string;\n readonly vars?: Readonly<Record<string, unknown>>;\n readonly criteria?: string;\n readonly inputFiles?: readonly string[];\n readonly expectedOutput?: string | Readonly<Record<string, unknown>> | readonly EvalMessage[];\n readonly assert?: readonly EvalAssertionConfig[];\n readonly execution?: EvalExecution;\n readonly environment?: EvalEnvironment | string;\n readonly metadata?: Readonly<Record<string, unknown>>;\n readonly conversationId?: string;\n readonly suite?: string;\n readonly dependsOn?: readonly string[];\n readonly onDependencyFailure?: 'skip' | 'fail' | 'run';\n readonly mode?: 'conversation';\n readonly turns?: readonly EvalTurn[];\n readonly aggregation?: 'mean' | 'min' | 'max';\n readonly onTurnFailure?: 'continue' | 'stop';\n readonly windowSize?: number;\n}\n\nexport interface EvalRequires {\n readonly agentv?: string;\n readonly [key: string]: unknown;\n}\n\nexport interface EvalDefinition {\n readonly $schema?: string;\n readonly name?: string;\n readonly description?: string;\n readonly category?: string;\n readonly version?: string;\n readonly author?: string;\n /**\n * Suite tags. Either the selection list form (`string[]`, drives\n * `select.tags` / `--tag name` filtering) or the promptfoo-shaped\n * `Record<string,string>` map. In the map form the reserved `experiment` key\n * labels the run/experiment (grouped by the Dashboard), matching\n * `tags.experiment` in YAML evals.\n */\n readonly tags?: readonly string[] | Readonly<Record<string, string>>;\n readonly license?: string;\n readonly requires?: EvalRequires;\n readonly inputFiles?: readonly string[];\n readonly prompts?: unknown;\n readonly tests: readonly EvalTest[] | string;\n /**\n * @deprecated A top-level `experiment` label no longer sets the run's\n * experiment namespace. Use `tags: { experiment: '<name>' }` instead.\n */\n readonly experiment?: string;\n readonly target?: string | EvalTargetConfig;\n readonly repeat?: EvalRepeat;\n readonly timeoutSeconds?: number;\n readonly threshold?: number;\n readonly budgetUsd?: number;\n readonly assert?: readonly EvalAssertionConfig[];\n readonly environment?: EvalEnvironment | string;\n}\n\nexport interface DefinedEvalSuite {\n readonly [EVAL_SUITE_SYMBOL]: true;\n readonly [TO_EVAL_YAML_OBJECT_SYMBOL]: () => Record<string, unknown>;\n}\n\nfunction lowerEvalYamlValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => lowerEvalYamlValue(item));\n }\n\n if (value && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, nestedValue] of Object.entries(value)) {\n const loweredKey = KNOWN_SNAKE_CASE_KEYS[key as keyof KnownSnakeCaseKeyMap] ?? key;\n result[loweredKey] = lowerEvalYamlValue(nestedValue);\n }\n return result;\n }\n\n return value;\n}\n\nfunction lowerEvalDefinition(definition: unknown): Record<string, unknown> {\n const lowered = lowerEvalYamlValue(definition) as Record<string, unknown>;\n const { budget_usd: budgetUsd, repeat, ...loweredWithoutRuntimeOptions } = lowered;\n if (budgetUsd === undefined && repeat === undefined) {\n return lowered;\n }\n\n const evaluateOptions =\n lowered.evaluate_options &&\n typeof lowered.evaluate_options === 'object' &&\n !Array.isArray(lowered.evaluate_options)\n ? { ...(lowered.evaluate_options as Record<string, unknown>) }\n : {};\n\n if (budgetUsd !== undefined && evaluateOptions.budget_usd === undefined) {\n evaluateOptions.budget_usd = budgetUsd;\n }\n if (repeat !== undefined && evaluateOptions.repeat === undefined) {\n evaluateOptions.repeat = repeat;\n }\n return {\n ...loweredWithoutRuntimeOptions,\n evaluate_options: evaluateOptions,\n };\n}\n\nfunction attachEvalSuiteBrand<T extends EvalDefinition>(definition: T): T & DefinedEvalSuite {\n validateTopLevelRuntimeFields(definition);\n const branded = definition as T & Partial<DefinedEvalSuite>;\n\n if (branded[EVAL_SUITE_SYMBOL] === true) {\n return branded as T & DefinedEvalSuite;\n }\n\n Object.defineProperties(branded, {\n [EVAL_SUITE_SYMBOL]: {\n value: true,\n enumerable: false,\n configurable: false,\n writable: false,\n },\n [TO_EVAL_YAML_OBJECT_SYMBOL]: {\n value: () => toEvalYamlObject(definition),\n enumerable: false,\n configurable: false,\n writable: false,\n },\n });\n\n return branded as T & DefinedEvalSuite;\n}\n\nfunction validateTopLevelRuntimeFields(definition: EvalDefinition): void {\n const rawDefinition = definition as unknown as Record<string, unknown>;\n if (Object.prototype.hasOwnProperty.call(rawDefinition, 'input')) {\n throw new Error(\n \"defineEval() does not accept top-level 'input'. Use prompts with default test vars or tests[].vars instead.\",\n );\n }\n if (Object.prototype.hasOwnProperty.call(rawDefinition, 'preprocessors')) {\n throw new Error(\n \"defineEval() does not accept top-level 'preprocessors'. Use defaultTest.options.transform or assertion-level transform instead.\",\n );\n }\n if (\n Object.prototype.hasOwnProperty.call(rawDefinition, 'experiment') &&\n typeof rawDefinition.experiment !== 'string'\n ) {\n throw new Error(\"defineEval() expects top-level 'experiment' to be a string label.\");\n }\n for (const field of ['model', 'policy', 'execution', 'runs', 'earlyExit']) {\n if (Object.prototype.hasOwnProperty.call(rawDefinition, field)) {\n throw new Error(\n `defineEval() does not accept top-level '${field}'. Put target overrides in target and repeat controls under repeat, which serializes to evaluate_options.repeat.`,\n );\n }\n }\n if (Array.isArray(rawDefinition.tests)) {\n rawDefinition.tests.forEach((test, index) => {\n if (test && typeof test === 'object' && Object.prototype.hasOwnProperty.call(test, 'input')) {\n throw new Error(\n `defineEval() does not accept tests[${index}].input. Use prompts with tests[].vars instead.`,\n );\n }\n });\n }\n}\n\n/**\n * Define a YAML-aligned eval suite in TypeScript.\n *\n * The returned object preserves the TypeScript authoring shape and carries a\n * non-enumerable lowering hook so AgentV can materialize the canonical\n * snake_case eval contract when the suite is loaded from a `.eval.ts` file.\n */\nexport function defineEval<T extends EvalDefinition>(definition: T): T & DefinedEvalSuite {\n return attachEvalSuiteBrand(definition);\n}\n\n/**\n * Alias for `defineEval()` when a suite reads more clearly as a plain object.\n */\nexport function evalSuite<T extends EvalDefinition>(definition: T): T & DefinedEvalSuite {\n return defineEval(definition);\n}\n\n/**\n * Lower a TypeScript-authored eval suite into the canonical snake_case object\n * contract used by YAML files and the runtime loader.\n *\n * Only known AgentV wire keys are converted. Unknown keys are preserved as-is\n * so opaque assertion, provider, and metadata payloads are not corrupted.\n */\nexport function toEvalYamlObject<T extends EvalDefinition | DefinedEvalSuite>(\n definition: T,\n): LowerEvalYamlValue<T> {\n return lowerEvalDefinition(definition) as LowerEvalYamlValue<T>;\n}\n\n/**\n * Serialize an eval suite to canonical YAML.\n */\nexport function serializeEvalYaml<T extends EvalDefinition | DefinedEvalSuite>(\n definition: T,\n): string {\n return stringifyYaml(toEvalYamlObject(definition), { lineWidth: 0 }).trimEnd();\n}\n","import type { EvalAssertionConfig } from './eval.js';\n\nexport type GraderCommand = string | readonly string[];\n\nexport interface GraderHelperOptions {\n readonly metric?: string;\n readonly weight?: number;\n readonly required?: boolean;\n readonly minScore?: number;\n readonly negate?: boolean;\n readonly transform?: string;\n}\n\nexport interface GraderCommonConfig {\n readonly metric?: string;\n readonly weight?: number;\n readonly required?: boolean;\n readonly minScore?: number;\n readonly negate?: boolean;\n readonly transform?: string;\n}\n\nexport interface ContainsGraderConfig extends EvalAssertionConfig, GraderCommonConfig {\n readonly type: 'contains';\n readonly value: string;\n}\n\nexport interface EqualsGraderConfig extends EvalAssertionConfig, GraderCommonConfig {\n readonly type: 'equals';\n readonly value: string;\n}\n\nexport interface RegexGraderOptions extends GraderHelperOptions {\n readonly flags?: string;\n}\n\nexport interface RegexGraderConfig extends EvalAssertionConfig, GraderCommonConfig {\n readonly type: 'regex';\n readonly value: string;\n readonly flags?: string;\n}\n\nexport interface IsJsonGraderConfig extends EvalAssertionConfig, GraderCommonConfig {\n readonly type: 'is-json';\n}\n\nexport type GraderRubricOperator = 'correctness' | 'contradiction';\n\nexport interface GraderScoreRange {\n readonly scoreRange: readonly [number, number];\n readonly outcome: string;\n}\n\nexport interface GraderRubric {\n readonly id?: string;\n readonly outcome?: string;\n readonly criteria?: string;\n readonly operator?: GraderRubricOperator;\n readonly weight?: number;\n readonly required?: boolean;\n readonly minScore?: number;\n readonly scoreRanges?: readonly GraderScoreRange[];\n}\n\nexport type GraderRubricCriterion = string | GraderRubric;\n\nexport interface LlmRubricGraderConfig extends EvalAssertionConfig, GraderCommonConfig {\n readonly type: 'llm-rubric';\n readonly value?: unknown;\n readonly prompt?: string | GraderPromptScriptConfig;\n readonly target?: string;\n readonly config?: Readonly<Record<string, unknown>>;\n readonly maxSteps?: number;\n readonly temperature?: number;\n}\n\nexport interface GraderPromptScriptConfig {\n readonly command: readonly string[];\n readonly config?: Readonly<Record<string, unknown>>;\n}\n\nexport interface LlmGraderOptions extends GraderHelperOptions {\n readonly prompt?: string | GraderPromptScriptConfig;\n readonly rubrics?: readonly GraderRubric[];\n readonly target?: string;\n readonly config?: Readonly<Record<string, unknown>>;\n readonly maxSteps?: number;\n readonly temperature?: number;\n}\n\nexport interface LlmGraderConfig extends EvalAssertionConfig, GraderCommonConfig {\n readonly type: 'llm-grader';\n readonly prompt?: string | GraderPromptScriptConfig;\n readonly rubrics?: readonly GraderRubric[];\n readonly target?: string;\n readonly config?: Readonly<Record<string, unknown>>;\n readonly maxSteps?: number;\n readonly temperature?: number;\n}\n\nexport interface ScriptGraderTargetOptions {\n readonly maxCalls?: number;\n}\n\nexport interface ScriptGraderOptions extends GraderHelperOptions {\n readonly cwd?: string;\n readonly target?: true | ScriptGraderTargetOptions;\n readonly config?: Readonly<Record<string, unknown>>;\n}\n\nexport interface ScriptGraderConfig extends EvalAssertionConfig, GraderCommonConfig {\n readonly type: 'script';\n readonly command: GraderCommand;\n readonly cwd?: string;\n readonly target?: true | ScriptGraderTargetOptions;\n readonly config?: Readonly<Record<string, unknown>>;\n}\n\n/** @deprecated Use ScriptGraderTargetOptions. */\nexport type CodeGraderTargetOptions = ScriptGraderTargetOptions;\n\n/** @deprecated Use ScriptGraderOptions. */\nexport type CodeGraderOptions = ScriptGraderOptions;\n\n/** @deprecated Use ScriptGraderConfig with type: 'script'. */\nexport type CodeGraderConfig = ScriptGraderConfig;\n\nexport type GraderHelperConfig =\n | ContainsGraderConfig\n | EqualsGraderConfig\n | RegexGraderConfig\n | IsJsonGraderConfig\n | LlmRubricGraderConfig\n | LlmGraderConfig\n | ScriptGraderConfig;\n\nfunction withCommon<T extends { readonly type: string }>(\n config: T,\n options: GraderHelperOptions = {},\n): T & GraderCommonConfig & EvalAssertionConfig {\n return {\n ...(options.metric !== undefined ? { metric: options.metric } : {}),\n ...config,\n ...(options.weight !== undefined ? { weight: options.weight } : {}),\n ...(options.required !== undefined ? { required: options.required } : {}),\n ...(options.minScore !== undefined ? { minScore: options.minScore } : {}),\n ...(options.negate !== undefined ? { negate: options.negate } : {}),\n ...(options.transform !== undefined ? { transform: options.transform } : {}),\n } as T & GraderCommonConfig & EvalAssertionConfig;\n}\n\nexport function containsGrader(value: string, options?: GraderHelperOptions): ContainsGraderConfig {\n return withCommon({ type: 'contains', value }, options);\n}\n\nexport function equalsGrader(value: string, options?: GraderHelperOptions): EqualsGraderConfig {\n return withCommon({ type: 'equals', value }, options);\n}\n\nexport function exactGrader(value: string, options?: GraderHelperOptions): EqualsGraderConfig {\n return equalsGrader(value, options);\n}\n\nexport function regexGrader(\n pattern: string | RegExp,\n options: RegexGraderOptions = {},\n): RegexGraderConfig {\n const value = pattern instanceof RegExp ? pattern.source : pattern;\n const flags = options.flags ?? (pattern instanceof RegExp ? pattern.flags : undefined);\n\n return withCommon(\n {\n type: 'regex',\n value,\n ...(flags ? { flags } : {}),\n },\n options,\n );\n}\n\nexport function isJsonGrader(options?: GraderHelperOptions): IsJsonGraderConfig {\n return withCommon({ type: 'is-json' }, options);\n}\n\nexport function jsonGrader(options?: GraderHelperOptions): IsJsonGraderConfig {\n return isJsonGrader(options);\n}\n\nexport function llmRubricGrader(\n valueOrCriteria?: string | readonly GraderRubricCriterion[] | Readonly<Record<string, unknown>>,\n options: GraderHelperOptions & {\n readonly prompt?: string | GraderPromptScriptConfig;\n readonly target?: string;\n readonly config?: Readonly<Record<string, unknown>>;\n readonly maxSteps?: number;\n readonly temperature?: number;\n } = {},\n): LlmRubricGraderConfig {\n return withCommon(\n {\n type: 'llm-rubric',\n ...(valueOrCriteria !== undefined ? { value: valueOrCriteria } : {}),\n ...(options.prompt !== undefined ? { prompt: options.prompt } : {}),\n ...(options.target !== undefined ? { target: options.target } : {}),\n ...(options.config !== undefined ? { config: options.config } : {}),\n ...(options.maxSteps !== undefined ? { maxSteps: options.maxSteps } : {}),\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n },\n options,\n );\n}\n\nexport function llmGrader(options: LlmGraderOptions = {}): LlmGraderConfig {\n return withCommon(\n {\n type: 'llm-grader',\n ...(options.prompt !== undefined ? { prompt: options.prompt } : {}),\n ...(options.rubrics !== undefined ? { rubrics: options.rubrics } : {}),\n ...(options.target !== undefined ? { target: options.target } : {}),\n ...(options.config !== undefined ? { config: options.config } : {}),\n ...(options.maxSteps !== undefined ? { maxSteps: options.maxSteps } : {}),\n ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),\n },\n options,\n );\n}\n\n/** @deprecated Use scriptGrader. */\nexport function codeGrader(\n command: GraderCommand,\n options: ScriptGraderOptions = {},\n): ScriptGraderConfig {\n return scriptGrader(command, options);\n}\n\nexport function scriptGrader(\n command: GraderCommand,\n options: ScriptGraderOptions = {},\n): ScriptGraderConfig {\n return withCommon(\n {\n type: 'script',\n command,\n ...(options.cwd !== undefined ? { cwd: options.cwd } : {}),\n ...(options.target !== undefined ? { target: options.target } : {}),\n ...(options.config !== undefined ? { config: options.config } : {}),\n },\n options,\n );\n}\n\nexport const graders = Object.freeze({\n contains: containsGrader,\n equals: equalsGrader,\n exact: exactGrader,\n regex: regexGrader,\n isJson: isJsonGrader,\n json: jsonGrader,\n llmRubric: llmRubricGrader,\n llmGrader,\n codeGrader,\n script: scriptGrader,\n scriptGrader,\n});\n\nexport type GraderCatalog = typeof graders;\n","/**\n * Client for invoking configured targets from script-grader scripts.\n *\n * Environment variables (set automatically by AgentV when `target` config is present):\n * - AGENTV_TARGET_PROXY_URL: The URL of the local proxy server\n * - AGENTV_TARGET_PROXY_TOKEN: Bearer token for authentication\n */\n\nimport type { TokenUsage } from './schemas.js';\n\n/**\n * Request to invoke the target\n */\nexport interface TargetInvokeRequest {\n readonly question: string;\n readonly systemPrompt?: string;\n readonly evalCaseId?: string;\n readonly attempt?: number;\n /** Optional target override - use a different target for this invocation */\n readonly target?: string;\n}\n\n/**\n * Response from a target invocation\n */\nexport interface TargetInvokeResponse {\n readonly output: readonly unknown[];\n readonly rawText?: string;\n readonly tokenUsage?: TokenUsage;\n}\n\n/**\n * Information about the target proxy configuration\n */\nexport interface TargetInfo {\n /** Name of the default target being used */\n readonly targetName: string;\n /** Maximum number of calls allowed */\n readonly maxCalls: number;\n /** Current number of calls made */\n readonly callCount: number;\n /** List of all available target names */\n readonly availableTargets: readonly string[];\n}\n\n/**\n * Target client for making target invocations\n */\nexport interface TargetClient {\n /**\n * Invoke the configured target with a prompt.\n * @param request - The question and optional system prompt\n * @returns The target's response with output messages and optional raw text\n */\n invoke(request: TargetInvokeRequest): Promise<TargetInvokeResponse>;\n\n /**\n * Invoke the target with multiple requests in sequence.\n * Each request counts toward the max_calls limit.\n * @param requests - Array of target requests\n * @returns Array of target responses\n */\n invokeBatch(requests: readonly TargetInvokeRequest[]): Promise<readonly TargetInvokeResponse[]>;\n\n /**\n * Get information about the target proxy configuration.\n * Returns the default target name, max calls, current call count, and available targets.\n */\n getInfo(): Promise<TargetInfo>;\n}\n\n/**\n * Error thrown when target proxy is not available\n */\nexport class TargetNotAvailableError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TargetNotAvailableError';\n }\n}\n\n/**\n * Error thrown when target invocation fails\n */\nexport class TargetInvocationError extends Error {\n readonly statusCode?: number;\n\n constructor(message: string, statusCode?: number) {\n super(message);\n this.name = 'TargetInvocationError';\n this.statusCode = statusCode;\n }\n}\n\n/**\n * Create a target client from environment variables.\n *\n * This function reads the proxy URL and token from environment variables\n * that are automatically set by AgentV when a `target` config block is present\n * on a `script` evaluator.\n *\n * @returns A target client if environment variables are set, otherwise undefined\n * @throws TargetNotAvailableError if token is missing when URL is present\n *\n * @example\n * ```typescript\n * import { createTargetClient, defineScriptGrader } from '@agentv/sdk';\n *\n * export default defineScriptGrader(async ({ input, criteria, output }) => {\n * const target = createTargetClient();\n * const question = input\n * .filter((message) => message.role === 'user')\n * .map((message) => typeof message.content === 'string' ? message.content : '')\n * .join('\\n');\n *\n * if (!target) {\n * // Target not available - no target config on this evaluator\n * return { pass: false, score: 0.5, reason: 'Target not available' };\n * }\n *\n * const response = await target.invoke({\n * question: `Is this answer correct? Question: ${question}, Expected: ${criteria}, Answer: ${output ?? ''}`,\n * systemPrompt: 'You are an expert grader. Respond with JSON: { \"correct\": true/false }'\n * });\n *\n * const result = JSON.parse(response.rawText ?? '{}');\n * return {\n * pass: result.correct === true,\n * score: result.correct === true ? 1.0 : 0.0,\n * reason: result.correct === true ? 'Target judged the answer correct' : 'Target judged the answer incorrect',\n * };\n * });\n * ```\n */\nexport function createTargetClient(): TargetClient | undefined {\n const proxyUrl = process.env.AGENTV_TARGET_PROXY_URL;\n const proxyToken = process.env.AGENTV_TARGET_PROXY_TOKEN;\n\n if (!proxyUrl) {\n return undefined;\n }\n\n if (!proxyToken) {\n throw new TargetNotAvailableError(\n 'AGENTV_TARGET_PROXY_URL is set but AGENTV_TARGET_PROXY_TOKEN is missing',\n );\n }\n\n return createTargetClientInternal(proxyUrl, proxyToken);\n}\n\n/**\n * Internal: Create a target client with explicit URL and token.\n * Exported for testing only - use createTargetClient() in production.\n */\nexport function createTargetClientInternal(url: string, token: string): TargetClient {\n const headers = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n };\n\n return {\n async invoke(request: TargetInvokeRequest): Promise<TargetInvokeResponse> {\n const response = await fetch(`${url}/invoke`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n question: request.question,\n systemPrompt: request.systemPrompt,\n evalCaseId: request.evalCaseId,\n attempt: request.attempt,\n target: request.target,\n }),\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n let errorMessage: string;\n try {\n const errorJson = JSON.parse(errorBody) as { error?: string };\n errorMessage = errorJson.error ?? `HTTP ${response.status}`;\n } catch {\n errorMessage = errorBody || `HTTP ${response.status}`;\n }\n throw new TargetInvocationError(errorMessage, response.status);\n }\n\n return (await response.json()) as TargetInvokeResponse;\n },\n\n async invokeBatch(\n requests: readonly TargetInvokeRequest[],\n ): Promise<readonly TargetInvokeResponse[]> {\n const response = await fetch(`${url}/invokeBatch`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n requests: requests.map((r) => ({\n question: r.question,\n systemPrompt: r.systemPrompt,\n evalCaseId: r.evalCaseId,\n attempt: r.attempt,\n target: r.target,\n })),\n }),\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n let errorMessage: string;\n try {\n const errorJson = JSON.parse(errorBody) as { error?: string };\n errorMessage = errorJson.error ?? `HTTP ${response.status}`;\n } catch {\n errorMessage = errorBody || `HTTP ${response.status}`;\n }\n throw new TargetInvocationError(errorMessage, response.status);\n }\n\n const result = (await response.json()) as { responses: TargetInvokeResponse[] };\n return result.responses;\n },\n\n async getInfo(): Promise<TargetInfo> {\n const response = await fetch(`${url}/info`, {\n method: 'GET',\n headers,\n });\n\n if (!response.ok) {\n const errorBody = await response.text();\n let errorMessage: string;\n try {\n const errorJson = JSON.parse(errorBody) as { error?: string };\n errorMessage = errorJson.error ?? `HTTP ${response.status}`;\n } catch {\n errorMessage = errorBody || `HTTP ${response.status}`;\n }\n throw new TargetInvocationError(errorMessage, response.status);\n }\n\n return (await response.json()) as TargetInfo;\n },\n };\n}\n","/**\n * Workspace grader helpers for deterministic file checks.\n *\n * `defineWorkspaceGrader()` wraps the script-grader runtime with a small\n * workspace object so graders can read files and return check arrays\n * without hand-rolling stdin parsing, workspace path fallback, file reads, or\n * score aggregation.\n */\nimport { readFile, stat } from 'node:fs/promises';\nimport nodePath from 'node:path';\n\nimport { runScriptGrader } from './runtime.js';\nimport {\n type ScriptGraderCheck,\n type ScriptGraderInput,\n type ScriptGraderResult,\n ScriptGraderResultSchema,\n} from './schemas.js';\n\nexport interface WorkspaceCheck {\n readonly text: string;\n readonly pass: boolean;\n readonly score?: number;\n readonly reason: string;\n readonly evidence?: string;\n}\n\n/** @deprecated Use WorkspaceCheck. */\nexport type WorkspaceAssertion = WorkspaceCheck;\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport type WorkspaceGraderReturn =\n | ScriptGraderResult\n | WorkspaceCheck\n | readonly Awaitable<WorkspaceCheck>[];\n\nexport interface WorkspaceFileAssertionOptions {\n readonly text?: string;\n}\n\nexport interface WorkspaceFile {\n readonly path: string;\n readonly absolutePath?: string;\n readText(): Promise<string>;\n exists(options?: WorkspaceFileAssertionOptions): Promise<WorkspaceCheck>;\n contains(expected: string, options?: WorkspaceFileAssertionOptions): Promise<WorkspaceCheck>;\n notContains(expected: string, options?: WorkspaceFileAssertionOptions): Promise<WorkspaceCheck>;\n matches(pattern: RegExp, options?: WorkspaceFileAssertionOptions): Promise<WorkspaceCheck>;\n notMatches(pattern: RegExp, options?: WorkspaceFileAssertionOptions): Promise<WorkspaceCheck>;\n}\n\nexport interface Workspace {\n readonly path?: string;\n file(relativePath: string): WorkspaceFile;\n readText(relativePath: string): Promise<string>;\n}\n\nexport type WorkspaceGraderContext = ScriptGraderInput & {\n readonly workspace: Workspace;\n};\n\nexport type WorkspaceGraderHandler = (\n context: WorkspaceGraderContext,\n) => WorkspaceGraderReturn | Promise<WorkspaceGraderReturn>;\n\ninterface ResolvedWorkspacePath {\n readonly displayPath: string;\n readonly absolutePath?: string;\n readonly error?: string;\n}\n\nfunction workspacePathFrom(input: ScriptGraderInput): string | undefined {\n const workspacePath = input.workspacePath ?? process.env.AGENTV_WORKSPACE_PATH;\n if (!workspacePath?.trim()) {\n return undefined;\n }\n return workspacePath;\n}\n\nfunction normalizeDisplayPath(relativePath: string): string {\n return relativePath.split(nodePath.sep).join('/');\n}\n\nfunction resolveWorkspacePath(workspacePath: string | undefined, relativePath: string) {\n const displayPath = normalizeDisplayPath(relativePath);\n\n if (!workspacePath) {\n return {\n displayPath,\n error: 'Workspace path is not available. Configure an environment recipe in the eval YAML.',\n };\n }\n\n if (!relativePath.trim()) {\n return { displayPath, error: 'Workspace file path must not be empty.' };\n }\n\n if (nodePath.isAbsolute(relativePath)) {\n return {\n displayPath,\n error: `Workspace file path must be relative: ${displayPath}`,\n };\n }\n\n const root = nodePath.resolve(workspacePath);\n const absolutePath = nodePath.resolve(root, relativePath);\n const relativeToRoot = nodePath.relative(root, absolutePath);\n\n if (\n relativeToRoot === '' ||\n relativeToRoot.startsWith('..') ||\n nodePath.isAbsolute(relativeToRoot)\n ) {\n return {\n displayPath,\n error: `Workspace file path must stay inside the workspace: ${displayPath}`,\n };\n }\n\n return {\n displayPath: normalizeDisplayPath(relativeToRoot),\n absolutePath,\n };\n}\n\nfunction check(text: string, pass: boolean, reason: string, evidence?: string): WorkspaceCheck {\n return {\n text,\n pass,\n reason,\n ...(evidence !== undefined ? { evidence } : {}),\n };\n}\n\nfunction quote(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction regexLabel(pattern: RegExp): string {\n return `/${pattern.source}/${pattern.flags}`;\n}\n\nasync function readFileForAssertion(\n file: WorkspaceFile,\n): Promise<{ readonly content: string } | { readonly error: string }> {\n try {\n return { content: await file.readText() };\n } catch (error) {\n return { error: error instanceof Error ? error.message : String(error) };\n }\n}\n\nfunction isScriptGraderResult(value: WorkspaceGraderReturn): value is ScriptGraderResult {\n return !Array.isArray(value) && typeof value === 'object' && value !== null && 'score' in value;\n}\n\nexport function createWorkspace(input: ScriptGraderInput): Workspace {\n const workspacePath = workspacePathFrom(input);\n const textCache = new Map<string, Promise<string>>();\n\n async function readText(relativePath: string) {\n const resolved = resolveWorkspacePath(workspacePath, relativePath);\n if (resolved.error) {\n throw new Error(resolved.error);\n }\n\n const absolutePath = resolved.absolutePath;\n if (!absolutePath) {\n throw new Error(`Unable to resolve workspace file: ${resolved.displayPath}`);\n }\n\n let pendingRead = textCache.get(absolutePath);\n if (!pendingRead) {\n pendingRead = readFile(absolutePath, 'utf8');\n textCache.set(absolutePath, pendingRead);\n }\n return pendingRead;\n }\n\n function file(relativePath: string): WorkspaceFile {\n const resolved = resolveWorkspacePath(workspacePath, relativePath);\n const label = resolved.displayPath;\n\n return {\n path: label,\n ...(resolved.absolutePath !== undefined ? { absolutePath: resolved.absolutePath } : {}),\n\n readText() {\n return readText(relativePath);\n },\n\n async exists(options: WorkspaceFileAssertionOptions = {}) {\n const text = options.text ?? `${label} exists`;\n if (resolved.error) {\n return check(text, false, resolved.error);\n }\n\n try {\n const fileStat = await stat(resolved.absolutePath as string);\n if (fileStat.isFile()) {\n return check(text, true, `${label} exists.`);\n }\n return check(text, false, `${label} exists but is not a file.`);\n } catch {\n return check(text, false, `${label} does not exist.`);\n }\n },\n\n async contains(expected: string, options: WorkspaceFileAssertionOptions = {}) {\n const text = options.text ?? `${label} contains ${quote(expected)}`;\n const content = await readFileForAssertion(this);\n if ('error' in content) {\n return check(text, false, content.error);\n }\n\n const pass = content.content.includes(expected);\n return check(\n text,\n pass,\n pass\n ? `${label} contains ${quote(expected)}.`\n : `${label} is missing ${quote(expected)}.`,\n );\n },\n\n async notContains(expected: string, options: WorkspaceFileAssertionOptions = {}) {\n const text = options.text ?? `${label} does not contain ${quote(expected)}`;\n const content = await readFileForAssertion(this);\n if ('error' in content) {\n return check(text, false, content.error);\n }\n\n const pass = !content.content.includes(expected);\n return check(\n text,\n pass,\n pass\n ? `${label} does not contain ${quote(expected)}.`\n : `${label} contains unexpected text ${quote(expected)}.`,\n );\n },\n\n async matches(pattern: RegExp, options: WorkspaceFileAssertionOptions = {}) {\n const text = options.text ?? `${label} matches ${regexLabel(pattern)}`;\n const content = await readFileForAssertion(this);\n if ('error' in content) {\n return check(text, false, content.error);\n }\n\n pattern.lastIndex = 0;\n const pass = pattern.test(content.content);\n return check(\n text,\n pass,\n pass\n ? `${label} matches ${regexLabel(pattern)}.`\n : `${label} does not match ${regexLabel(pattern)}.`,\n );\n },\n\n async notMatches(pattern: RegExp, options: WorkspaceFileAssertionOptions = {}) {\n const text = options.text ?? `${label} does not match ${regexLabel(pattern)}`;\n const content = await readFileForAssertion(this);\n if ('error' in content) {\n return check(text, false, content.error);\n }\n\n pattern.lastIndex = 0;\n const pass = !pattern.test(content.content);\n return check(\n text,\n pass,\n pass\n ? `${label} does not match ${regexLabel(pattern)}.`\n : `${label} matches unexpected pattern ${regexLabel(pattern)}.`,\n );\n },\n };\n }\n\n return {\n ...(workspacePath !== undefined ? { path: workspacePath } : {}),\n file,\n readText,\n };\n}\n\nexport async function normalizeWorkspaceGraderResult(\n result: WorkspaceGraderReturn,\n): Promise<ScriptGraderResult> {\n if (isScriptGraderResult(result)) {\n return ScriptGraderResultSchema.parse(result);\n }\n\n const checks = Array.isArray(result) ? await Promise.all(result) : [result];\n const passed = checks.filter((item) => item.pass).length;\n const score =\n checks.length > 0\n ? checks.reduce((sum, item) => sum + (item.score ?? (item.pass ? 1 : 0)), 0) / checks.length\n : 0;\n\n return ScriptGraderResultSchema.parse({\n pass: checks.length > 0 && passed === checks.length,\n score,\n reason: checks.length > 0 ? `${passed}/${checks.length} checks passed.` : 'No checks ran.',\n checks: checks satisfies readonly ScriptGraderCheck[],\n });\n}\n\nexport async function runWorkspaceGrader(\n handler: WorkspaceGraderHandler,\n input: ScriptGraderInput,\n): Promise<ScriptGraderResult> {\n return normalizeWorkspaceGraderResult(\n await handler({\n ...input,\n workspace: createWorkspace(input),\n }),\n );\n}\n\nexport function defineWorkspaceGrader(handler: WorkspaceGraderHandler): void {\n runScriptGrader((input) => runWorkspaceGrader(handler, input));\n}\n","/**\n * Runtime for script grader evaluators.\n * Handles stdin parsing, validation, error handling, and output formatting.\n */\nimport { readFileSync } from 'node:fs';\nimport { toCamelCaseDeep } from '@agentv/core';\n\nimport { enrichInput } from './deprecation.js';\nimport {\n type ScriptGraderInput,\n ScriptGraderInputSchema,\n type ScriptGraderResult,\n ScriptGraderResultSchema,\n} from './schemas.js';\n\n/**\n * Handler function type for script graders.\n */\nexport type ScriptGraderHandler = (\n input: ScriptGraderInput,\n) => ScriptGraderResult | Promise<ScriptGraderResult>;\n\n/**\n * Read stdin synchronously (works in both Node.js and Bun).\n */\nfunction readStdin(): string {\n return readFileSync(0, 'utf8');\n}\n\n/**\n * Clamp a value to the range [0, 1].\n */\nfunction clampScore(value: number): number {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return 0;\n }\n return Math.max(0, Math.min(1, value));\n}\n\n/**\n * Format an error for output.\n */\nfunction formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Run a script grader handler with full stdin/stdout handling.\n * This is the internal implementation called by defineScriptGrader.\n */\nexport async function runScriptGrader(handler: ScriptGraderHandler): Promise<void> {\n try {\n // 1. Read stdin\n const stdin = readStdin();\n\n // 2. Parse JSON\n const rawInput = JSON.parse(stdin) as Record<string, unknown>;\n\n // 3. Convert snake_case to camelCase\n const camelInput = toCamelCaseDeep(rawInput);\n\n // 4. Validate input with Zod\n const input = ScriptGraderInputSchema.parse(camelInput);\n\n // 5. Set up lazy file-backed output loading if applicable\n if (input.outputPath && (input.output === null || input.output === undefined)) {\n let cachedOutput: ScriptGraderInput['output'] | undefined;\n const filePath = input.outputPath;\n Object.defineProperty(input, 'output', {\n get() {\n if (cachedOutput === undefined) {\n cachedOutput = JSON.parse(readFileSync(filePath, 'utf8'));\n }\n return cachedOutput;\n },\n configurable: true,\n enumerable: true,\n });\n }\n\n // 6. Enrich input — no-op pass-through\n enrichInput(input);\n\n // 7. Run handler\n const rawResult = await handler(input);\n\n // 8. Validate and normalize output\n const result = ScriptGraderResultSchema.parse({\n ...rawResult,\n score: clampScore(rawResult.score),\n checks: rawResult.checks?.map((check) => ({\n ...check,\n ...(check.score !== undefined ? { score: clampScore(check.score) } : {}),\n })),\n });\n\n // 9. Output JSON\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n // Output failure result\n const errorMessage = formatError(error);\n const errorResult: ScriptGraderResult = {\n pass: false,\n score: 0,\n reason: `Evaluation failed: ${errorMessage}`,\n checks: [\n {\n text: 'Script grader execution',\n pass: false,\n reason: errorMessage,\n },\n ],\n };\n console.log(JSON.stringify(errorResult, null, 2));\n process.exit(1);\n }\n}\n\n/** @deprecated Use ScriptGraderHandler. */\nexport type CodeGraderHandler = ScriptGraderHandler;\n\n/** @deprecated Use runScriptGrader. */\nexport const runCodeGrader = runScriptGrader;\n","/**\n * Input enrichment utilities for script grader and assertion runtimes.\n *\n * With the removal of text convenience accessors (`inputText`, `outputText`,\n * `expectedOutputText`) from ScriptGraderInput, this module is a no-op pass-through.\n * Kept for backward compatibility — existing runtimes call `enrichInput()` and\n * the call is harmless.\n */\nimport type { ScriptGraderInput } from './schemas.js';\n\n/**\n * Enrich a validated ScriptGraderInput.\n *\n * Previously populated text convenience accessors; now a no-op pass-through since\n * those fields were removed. script graders should extract text from `Message.content`\n * using `getTextContent()` from `@agentv/core` instead.\n */\nexport function enrichInput(input: ScriptGraderInput): ScriptGraderInput {\n return input;\n}\n","/**\n * Vitest workspace verifier adapter.\n *\n * This module keeps deterministic workspace verification in familiar Vitest\n * tests while translating the JSON reporter output into AgentV's script-grader\n * result contract.\n */\nimport { spawn } from 'node:child_process';\nimport { copyFile, mkdtemp, readFile, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport nodePath from 'node:path';\n\nimport { runScriptGrader } from './runtime.js';\nimport {\n type ScriptGraderInput,\n type ScriptGraderResult,\n ScriptGraderResultSchema,\n} from './schemas.js';\n\nexport interface VitestWorkspaceGraderOptions {\n /**\n * Vitest verifier file(s). By default these are relative to the prepared\n * workspace. When `copyTestFilesToWorkspace` is true, relative paths resolve\n * from `testFileRoot` instead.\n *\n * When provided without `command`, the adapter runs\n * `bunx vitest run <testFile> --reporter=json --outputFile <tmp>`.\n */\n readonly testFile?: string | readonly string[];\n /**\n * Copy `testFile` entries into a temporary directory inside the workspace\n * before running Vitest. Use this for hidden verifier files that live beside\n * the eval instead of inside the prepared workspace.\n */\n readonly copyTestFilesToWorkspace?: boolean;\n /**\n * Base directory for copied `testFile` entries. Defaults to `process.cwd()`.\n */\n readonly testFileRoot?: string;\n /**\n * Full command to run. Use this for package scripts such as\n * `[\"bun\", \"run\", \"verify:workspace\"]`.\n */\n readonly command?: readonly string[];\n /**\n * Base Vitest command used with `testFile`. Defaults to\n * `[\"bunx\", \"vitest\", \"run\"]`.\n */\n readonly vitestCommand?: readonly string[];\n /** Workspace-relative directory to run the command in. Defaults to workspace root. */\n readonly cwd?: string;\n /** Append `--reporter=json --outputFile <tmp>` to the command. Defaults to true for testFile mode. */\n readonly appendReporterArgs?: boolean;\n /** Read Vitest JSON from this path instead of stdout. Relative paths resolve under `cwd`. */\n readonly outputFile?: string;\n readonly timeoutMs?: number;\n readonly env?: Readonly<Record<string, string>>;\n readonly passWithNoTests?: boolean;\n}\n\ninterface CommandResult {\n readonly exitCode: number | null;\n readonly stdout: string;\n readonly stderr: string;\n}\n\ninterface VitestAssertionResult {\n readonly ancestorTitles?: readonly string[];\n readonly fullName?: string;\n readonly title?: string;\n readonly status?: string;\n readonly failureMessages?: readonly string[];\n readonly duration?: number;\n}\n\ninterface VitestFileResult {\n readonly name?: string;\n readonly assertionResults?: readonly VitestAssertionResult[];\n}\n\ninterface VitestJsonReport {\n readonly success?: boolean;\n readonly numTotalTests?: number;\n readonly numPassedTests?: number;\n readonly numFailedTests?: number;\n readonly numPendingTests?: number;\n readonly numTodoTests?: number;\n readonly testResults?: readonly VitestFileResult[];\n}\n\nfunction workspacePathFrom(input: ScriptGraderInput): string | undefined {\n const workspacePath = input.workspacePath ?? process.env.AGENTV_WORKSPACE_PATH;\n return workspacePath?.trim() ? workspacePath : undefined;\n}\n\nfunction truncate(value: string, maxLength = 2000): string {\n if (value.length <= maxLength) {\n return value;\n }\n return `${value.slice(0, maxLength)}\\n...(truncated)`;\n}\n\nfunction resolveInsideWorkspace(\n workspacePath: string,\n relativePath: string,\n label: string,\n options: { readonly allowRoot?: boolean } = {},\n): string {\n if (!relativePath.trim()) {\n throw new Error(`${label} must not be empty.`);\n }\n\n if (nodePath.isAbsolute(relativePath)) {\n throw new Error(`${label} must be relative to the workspace: ${relativePath}`);\n }\n\n const root = nodePath.resolve(workspacePath);\n const resolvedPath = nodePath.resolve(root, relativePath);\n const relativeToRoot = nodePath.relative(root, resolvedPath);\n if (relativeToRoot === '' && options.allowRoot === true) {\n return resolvedPath;\n }\n\n if (\n relativeToRoot === '' ||\n relativeToRoot.startsWith('..') ||\n nodePath.isAbsolute(relativeToRoot)\n ) {\n throw new Error(`${label} must stay inside the workspace: ${relativePath}`);\n }\n\n return resolvedPath;\n}\n\nfunction normalizeTestFiles(testFile: string | readonly string[] | undefined): readonly string[] {\n if (testFile === undefined) {\n return [];\n }\n return typeof testFile === 'string' ? [testFile] : [...testFile];\n}\n\nfunction buildCommand(\n options: VitestWorkspaceGraderOptions,\n testFiles: readonly string[] = normalizeTestFiles(options.testFile),\n) {\n if (options.command && options.command.length > 0) {\n return [...options.command];\n }\n\n const command = [...(options.vitestCommand ?? ['bunx', 'vitest', 'run'])];\n command.push(...testFiles);\n return command;\n}\n\nfunction parseJsonObjectFromText(text: string): unknown {\n const trimmed = text.trim();\n if (!trimmed) {\n return undefined;\n }\n\n try {\n return JSON.parse(trimmed);\n } catch {\n const start = trimmed.indexOf('{');\n const end = trimmed.lastIndexOf('}');\n if (start >= 0 && end > start) {\n return JSON.parse(trimmed.slice(start, end + 1));\n }\n throw new Error('Vitest output did not contain a JSON object.');\n }\n}\n\nfunction isVitestJsonReport(value: unknown): value is VitestJsonReport {\n return (\n typeof value === 'object' &&\n value !== null &&\n Array.isArray((value as VitestJsonReport).testResults)\n );\n}\n\nfunction assertionText(file: VitestFileResult, assertion: VitestAssertionResult): string {\n const title =\n assertion.fullName ??\n [...(assertion.ancestorTitles ?? []), assertion.title].filter(Boolean).join(' ');\n return title || file.name || 'Vitest assertion';\n}\n\nexport function vitestReportToScriptGraderResult(\n report: VitestJsonReport,\n options: Pick<VitestWorkspaceGraderOptions, 'passWithNoTests'> = {},\n): ScriptGraderResult {\n const checks = (report.testResults ?? []).flatMap((file) =>\n (file.assertionResults ?? []).map((item) => {\n const pass = item.status === 'passed';\n const evidence =\n item.failureMessages && item.failureMessages.length > 0\n ? truncate(item.failureMessages.join('\\n\\n'))\n : undefined;\n return {\n text: assertionText(file, item),\n pass,\n reason: pass ? 'Vitest test passed.' : 'Vitest test failed.',\n ...(evidence !== undefined ? { evidence } : {}),\n };\n }),\n );\n\n if (checks.length === 0) {\n const pass = options.passWithNoTests === true;\n return ScriptGraderResultSchema.parse({\n pass,\n score: pass ? 1 : 0,\n reason: pass ? 'Vitest reported no tests; configured to pass.' : 'Vitest reported no tests.',\n checks: [\n {\n text: 'Vitest reported no tests',\n pass,\n reason: pass ? 'passWithNoTests is enabled.' : 'No Vitest tests were discovered.',\n },\n ],\n details: {\n vitest_success: report.success ?? false,\n num_total_tests: report.numTotalTests ?? 0,\n num_passed_tests: report.numPassedTests ?? 0,\n num_failed_tests: report.numFailedTests ?? 0,\n num_pending_tests: report.numPendingTests ?? 0,\n num_todo_tests: report.numTodoTests ?? 0,\n },\n });\n }\n\n const passedCount = checks.filter((item) => item.pass).length;\n const pass = passedCount === checks.length;\n return ScriptGraderResultSchema.parse({\n pass,\n score: passedCount / checks.length,\n reason: `${passedCount}/${checks.length} Vitest tests passed.`,\n checks,\n details: {\n vitest_success: report.success ?? pass,\n num_total_tests: report.numTotalTests ?? checks.length,\n num_passed_tests: report.numPassedTests ?? passedCount,\n num_failed_tests: report.numFailedTests ?? checks.length - passedCount,\n num_pending_tests: report.numPendingTests ?? 0,\n num_todo_tests: report.numTodoTests ?? 0,\n },\n });\n}\n\n/** @deprecated Use vitestReportToScriptGraderResult. */\nexport const vitestReportToCodeGraderResult = vitestReportToScriptGraderResult;\n\nfunction runCommand(\n command: readonly string[],\n options: {\n readonly cwd: string;\n readonly timeoutMs?: number;\n readonly env?: Readonly<Record<string, string>>;\n },\n): Promise<CommandResult> {\n if (command.length === 0) {\n return Promise.reject(new Error('Vitest command must not be empty.'));\n }\n\n return new Promise((resolve, reject) => {\n const child = spawn(command[0], command.slice(1), {\n cwd: options.cwd,\n env: { ...process.env, ...options.env },\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n const timeout =\n options.timeoutMs !== undefined\n ? setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeoutMs)\n : undefined;\n\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n child.stdout.on('data', (chunk) => {\n stdout += chunk;\n });\n child.stderr.on('data', (chunk) => {\n stderr += chunk;\n });\n child.on('error', reject);\n child.on('close', (exitCode) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n if (timedOut) {\n reject(new Error(`Vitest command timed out after ${options.timeoutMs}ms.`));\n return;\n }\n resolve({ exitCode, stdout, stderr });\n });\n });\n}\n\nfunction resolveSourceTestFile(testFileRoot: string, testFile: string): string {\n if (!testFile.trim()) {\n throw new Error('testFile entries must not be empty.');\n }\n\n return nodePath.isAbsolute(testFile)\n ? nodePath.resolve(testFile)\n : nodePath.resolve(testFileRoot, testFile);\n}\n\nasync function copyTestFilesIntoWorkspace(\n testFiles: readonly string[],\n options: Pick<VitestWorkspaceGraderOptions, 'testFileRoot'>,\n cwd: string,\n): Promise<{ readonly testFiles: readonly string[]; readonly tempDir?: string }> {\n if (testFiles.length === 0) {\n return { testFiles };\n }\n\n const tempDir = await mkdtemp(nodePath.join(cwd, '.agentv-vitest-'));\n const testFileRoot = nodePath.resolve(options.testFileRoot ?? process.cwd());\n const copiedFiles = await Promise.all(\n testFiles.map(async (testFile, index) => {\n const sourcePath = resolveSourceTestFile(testFileRoot, testFile);\n const destinationPath = nodePath.join(tempDir, `${index}-${nodePath.basename(testFile)}`);\n await copyFile(sourcePath, destinationPath);\n return nodePath.relative(cwd, destinationPath);\n }),\n );\n return { testFiles: copiedFiles, tempDir };\n}\n\nasync function readVitestReport(\n commandResult: CommandResult,\n outputFile: string | undefined,\n): Promise<VitestJsonReport> {\n const rawReport =\n outputFile !== undefined ? await readFile(outputFile, 'utf8') : commandResult.stdout;\n const parsed = parseJsonObjectFromText(rawReport);\n if (!isVitestJsonReport(parsed)) {\n throw new Error('Vitest JSON report did not include testResults[].');\n }\n return parsed;\n}\n\nexport async function runVitestWorkspaceGrader(\n options: VitestWorkspaceGraderOptions,\n input: ScriptGraderInput,\n): Promise<ScriptGraderResult> {\n const workspacePath = workspacePathFrom(input);\n if (!workspacePath) {\n return {\n pass: false,\n score: 0,\n reason: 'Vitest workspace verifier requires workspace_path.',\n checks: [\n {\n text: 'Vitest workspace verifier requires workspace_path',\n pass: false,\n reason:\n 'Configure an environment recipe in the eval YAML so AgentV can pass workspace_path.',\n },\n ],\n };\n }\n\n const tempDirs: string[] = [];\n try {\n const cwd = options.cwd\n ? resolveInsideWorkspace(workspacePath, options.cwd, 'cwd', { allowRoot: true })\n : workspacePath;\n const testFiles = normalizeTestFiles(options.testFile);\n const preparedTestFiles =\n options.copyTestFilesToWorkspace === true\n ? await copyTestFilesIntoWorkspace(testFiles, options, cwd)\n : { testFiles };\n if (preparedTestFiles.tempDir) {\n tempDirs.push(preparedTestFiles.tempDir);\n }\n\n const command = buildCommand(options, preparedTestFiles.testFiles);\n const appendReporterArgs = options.appendReporterArgs ?? options.command === undefined;\n let outputFile = options.outputFile\n ? resolveInsideWorkspace(cwd, options.outputFile, 'outputFile')\n : undefined;\n\n if (appendReporterArgs) {\n const tempDir = await mkdtemp(nodePath.join(tmpdir(), 'agentv-vitest-'));\n tempDirs.push(tempDir);\n outputFile = nodePath.join(tempDir, 'results.json');\n command.push('--reporter=json', `--outputFile=${outputFile}`);\n }\n\n const result = await runCommand(command, {\n cwd,\n timeoutMs: options.timeoutMs,\n env: {\n AGENTV_WORKSPACE_PATH: workspacePath,\n ...(outputFile !== undefined ? { AGENTV_VITEST_JSON_PATH: outputFile } : {}),\n ...options.env,\n },\n });\n\n const report = await readVitestReport(result, outputFile);\n return vitestReportToScriptGraderResult(report, options);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return {\n pass: false,\n score: 0,\n reason: 'Vitest workspace verifier failed to run.',\n checks: [\n {\n text: 'Vitest workspace verifier failed to run',\n pass: false,\n reason,\n },\n ],\n };\n } finally {\n for (const tempDir of tempDirs.reverse()) {\n await rm(tempDir, { recursive: true, force: true }).catch(() => {});\n }\n }\n}\n\nexport function defineVitestWorkspaceGrader(options: VitestWorkspaceGraderOptions): void {\n runScriptGrader((input) => runVitestWorkspaceGrader(options, input));\n}\n","/**\n * Runtime for custom assertion evaluators.\n * Handles stdin parsing, validation, error handling, and output formatting.\n *\n * Assertions receive the same input as script graders but use a simplified result\n * contract focused on pass/fail with optional score granularity.\n */\nimport { readFileSync } from 'node:fs';\nimport { toCamelCaseDeep } from '@agentv/core';\n\nimport { enrichInput } from './deprecation.js';\nimport {\n type ScriptGraderInput,\n ScriptGraderInputSchema,\n type ScriptGraderResult,\n ScriptGraderResultSchema,\n} from './schemas.js';\n\n/**\n * Context provided to assertion handlers.\n */\nexport type AssertionContext = ScriptGraderInput;\n\n/**\n * Known built-in assertion types. Custom types are extensible via string.\n *\n * Use in EVAL.yaml `assert` blocks:\n * ```yaml\n * assert:\n * - type: contains\n * value: \"Paris\"\n * ```\n *\n * Custom types registered via `.agentv/assertions/` or `defineAssertion()`\n * are also valid — the `string & {}` escape hatch provides autocomplete\n * for known types while accepting any string.\n */\nexport type AssertionType =\n // kebab-case (canonical internal form)\n | 'llm-grader'\n | 'llm-rubric'\n | 'script'\n | 'assert-set'\n /** @deprecated Authored eval YAML rejects this compatibility-only runtime type. */\n | 'tool-trajectory'\n | 'skill-used'\n | 'not-skill-used'\n | 'trajectory:tool-used'\n | 'trajectory:tool-args-match'\n | 'trajectory:tool-sequence'\n | 'trajectory:step-count'\n | 'trajectory:goal-success'\n | 'field-accuracy'\n | 'latency'\n | 'cost'\n | 'token-usage'\n | 'execution-metrics'\n /** @deprecated Authored eval YAML rejects this compatibility-only runtime type. */\n | 'skill-trigger'\n | 'contains'\n | 'contains-any'\n | 'contains-all'\n | 'icontains'\n | 'icontains-any'\n | 'icontains-all'\n | 'starts-with'\n | 'ends-with'\n | 'equals'\n | 'regex'\n | 'is-json'\n | 'javascript'\n | 'python'\n | 'webhook'\n | 'similar'\n | (string & {});\n\n/**\n * Check returned from an assertion handler.\n */\nexport interface AssertionCheck {\n readonly id?: string;\n readonly text: string;\n readonly pass: boolean;\n readonly score?: number;\n readonly reason: string;\n readonly evidence?: string;\n}\n\n/**\n * Result returned from an assertion handler.\n *\n * @example Pass with score\n * ```ts\n * { pass: true, score: 1, reason: 'Output contains expected keywords' }\n * ```\n *\n * @example Fail with checks\n * ```ts\n * { pass: false, score: 0.3, reason: 'Missing required header', checks: [\n * { text: 'Header present', pass: false, reason: 'No header found' },\n * ] }\n * ```\n *\n * @example Granular score (0-1)\n * ```ts\n * { score: 0.75, reason: 'Two of three checks passed', checks: [\n * { text: 'Format correct', pass: true, reason: 'Matches expected format' },\n * { text: 'Content relevant', pass: true, reason: 'Addresses the request' },\n * { text: 'Citation present', pass: false, reason: 'Missing citation' },\n * ] }\n * ```\n */\nexport interface AssertionScore {\n /** Explicit pass/fail. If omitted, derived from score (>= 0.5 = pass). */\n readonly pass?: boolean;\n /** Numeric score between 0 and 1. Defaults to 1 if pass=true, 0 if pass=false. */\n readonly score?: number;\n /** Explanation for the aggregate pass/fail decision. */\n readonly reason?: string;\n /** Per-check verdicts with optional score and evidence. */\n readonly checks?: readonly AssertionCheck[];\n /** Optional structured details for domain-specific metrics. */\n readonly details?: Record<string, unknown>;\n}\n\n/**\n * Handler function type for assertions.\n */\nexport type AssertionHandler = (ctx: AssertionContext) => AssertionScore | Promise<AssertionScore>;\n\n/**\n * Read stdin synchronously.\n */\nfunction readStdin(): string {\n return readFileSync(0, 'utf8');\n}\n\n/**\n * Clamp a value to the range [0, 1].\n */\nfunction clampScore(value: number): number {\n if (Number.isNaN(value) || !Number.isFinite(value)) {\n return 0;\n }\n return Math.max(0, Math.min(1, value));\n}\n\nfunction formatError(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Normalize an AssertionScore to a ScriptGraderResult for wire compatibility.\n */\nfunction normalizeScore(result: AssertionScore): ScriptGraderResult {\n let score: number;\n if (result.score !== undefined) {\n score = clampScore(result.score);\n } else if (result.pass !== undefined) {\n score = result.pass ? 1 : 0;\n } else {\n score = 0;\n }\n const pass = result.pass ?? score >= 0.5;\n\n return {\n pass,\n score,\n reason: result.reason ?? (pass ? 'Assertion passed' : 'Assertion failed'),\n checks: result.checks\n ? result.checks.map((check) => ({\n ...check,\n ...(check.score !== undefined ? { score: clampScore(check.score) } : {}),\n }))\n : [],\n details: result.details,\n };\n}\n\n/**\n * Run an assertion handler with full stdin/stdout handling.\n * This is the internal implementation called by defineAssertion.\n */\nexport async function runAssertion(handler: AssertionHandler): Promise<void> {\n try {\n const stdin = readStdin();\n const rawInput = JSON.parse(stdin) as Record<string, unknown>;\n const camelInput = toCamelCaseDeep(rawInput);\n const input = ScriptGraderInputSchema.parse(camelInput);\n\n // Lazy file-backed output loading\n if (input.outputPath && (input.output === null || input.output === undefined)) {\n let cachedOutput: ScriptGraderInput['output'] | undefined;\n const filePath = input.outputPath;\n Object.defineProperty(input, 'output', {\n get() {\n if (cachedOutput === undefined) {\n cachedOutput = JSON.parse(readFileSync(filePath, 'utf8'));\n }\n return cachedOutput;\n },\n configurable: true,\n enumerable: true,\n });\n }\n\n // Enrich input — no-op pass-through\n enrichInput(input);\n\n // Run handler\n const rawResult = await handler(input);\n const normalized = normalizeScore(rawResult);\n const result = ScriptGraderResultSchema.parse(normalized);\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n const errorMessage = formatError(error);\n const errorResult: ScriptGraderResult = {\n pass: false,\n score: 0,\n reason: `Assertion failed: ${errorMessage}`,\n checks: [{ text: 'Assertion execution', pass: false, reason: errorMessage }],\n };\n console.log(JSON.stringify(errorResult, null, 2));\n process.exit(1);\n }\n}\n","/**\n * Runtime for prompt template evaluators.\n * Handles stdin parsing, validation, error handling, and string output.\n */\nimport { readFileSync } from 'node:fs';\nimport { toCamelCaseDeep } from '@agentv/core';\n\nimport { enrichInput } from './deprecation.js';\nimport { PromptTemplateInputSchema, type ScriptGraderInput } from './schemas.js';\n\n/**\n * Handler function type for prompt templates.\n * Returns the prompt string to use for evaluation.\n */\nexport type PromptTemplateHandler = (input: ScriptGraderInput) => string | Promise<string>;\n\n/**\n * Read stdin synchronously (works in both Node.js and Bun).\n */\nfunction readStdin(): string {\n return readFileSync(0, 'utf8');\n}\n\n/**\n * Run a prompt template handler with full stdin/stdout handling.\n * This is the internal implementation called by definePromptTemplate.\n */\nexport async function runPromptTemplate(handler: PromptTemplateHandler): Promise<void> {\n try {\n // 1. Read stdin\n const stdin = readStdin();\n\n // 2. Parse JSON\n const rawInput = JSON.parse(stdin) as Record<string, unknown>;\n\n // 3. Convert snake_case to camelCase\n const camelInput = toCamelCaseDeep(rawInput);\n\n // 4. Validate input with Zod\n const input = PromptTemplateInputSchema.parse(camelInput);\n\n // 5. Enrich input — no-op pass-through\n enrichInput(input);\n\n // 6. Run handler\n const prompt = await handler(input);\n\n // 6. Output raw string (not JSON) - the prompt itself\n console.log(prompt);\n } catch (error) {\n // Output error to stderr and exit with non-zero code\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n\n/**\n * Define a prompt template with automatic stdin/stdout handling.\n *\n * This function:\n * 1. Reads JSON from stdin (snake_case format)\n * 2. Converts to camelCase and validates with Zod\n * 3. Calls your handler with typed input\n * 4. Outputs the generated prompt string to stdout\n * 5. Handles errors gracefully with proper exit codes\n *\n * @param handler - Function that generates the prompt string from input\n *\n * @example\n * ```typescript\n * import { definePromptTemplate, type ScriptGraderInput } from '@agentv/sdk';\n *\n * export default definePromptTemplate((ctx: ScriptGraderInput) => {\n * const question = ctx.input\n * .filter((message) => message.role === 'user')\n * .map((message) => typeof message.content === 'string' ? message.content : '')\n * .join('\\n');\n * const answer = ctx.output ?? '';\n * return `Question: ${question}\\nAnswer: ${answer}`;\n * });\n * ```\n */\nexport function definePromptTemplate(handler: PromptTemplateHandler): void {\n // Run immediately when module is loaded\n runPromptTemplate(handler);\n}\n","import { command, flag, number, option, optional, restPositionals, string } from 'cmd-ts';\n\nimport { runScriptGrader, runVitestWorkspaceGrader } from '@agentv/sdk';\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 ResolvedTarget,\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 { selectMultipleTargets } 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 selectMultipleTargets({\n testFilePath: evalPath,\n repoRoot,\n cwd: process.cwd(),\n env: process.env,\n targetNames: [manifest.target],\n targetRefs: 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.resolvedTarget,\n name: manifest.target,\n } as ResolvedTarget;\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 graderTarget: option({\n type: optional(string),\n long: 'grader-target',\n description:\n 'Override grader target for all evaluators (e.g., \"agentv\", or a target name from targets.yaml)',\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 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 graderTarget,\n model,\n threshold,\n format,\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,\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 targets in .agentv/targets.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, target 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 { selectTarget } 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: 'Override target name from targets.yaml (mirrors eval run --target)',\n }),\n targets: option({\n type: optional(string),\n long: 'targets',\n description: 'Path to targets.yaml (overrides discovery)',\n }),\n },\n handler: async ({ evalPath, out, experiment, target, targets }) => {\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 target for CLI invocation info.\n // Non-CLI providers default to agent mode (executor subagents) unless\n // subagent_mode_allowed: false is set in targets.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 selectTarget({\n testFilePath: resolvedEvalPath,\n repoRoot,\n cwd: evalDir,\n cliTargetName: target,\n explicitTargetsPath: targets,\n env: process.env,\n });\n\n targetName = selection.targetName;\n const resolved = selection.resolvedTarget;\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 target\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 target in parallel (writing response.md + metrics.json)\n * 3. `agentv pipeline grade <dir>`\n *\n * For `kind: agent` targets, 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 { selectTarget } 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 targets, and run script graders (for agent targets, 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: 'Parallel workers for target invocation (default: targets.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: 'Override target name from targets.yaml (mirrors eval run --target)',\n }),\n targets: option({\n type: optional(string),\n long: 'targets',\n description: 'Path to targets.yaml (overrides discovery)',\n }),\n },\n handler: async ({ evalPath, out, workers, experiment, graderType, target, targets }) => {\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 selectTarget({\n testFilePath: resolvedEvalPath,\n repoRoot,\n cwd: evalDir,\n cliTargetName: target,\n explicitTargetsPath: targets,\n env: process.env,\n });\n targetName = selection.targetName;\n targetWorkers = selection.resolvedTarget.workers;\n if (selection.resolvedTarget.kind === 'cli') {\n targetKind = 'cli';\n const config = selection.resolvedTarget.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 ResolvedTarget,\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 { selectMultipleTargets } 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 targetRefs?: readonly EvalTargetRef[];\n}): Promise<{\n readonly resolvedTarget: ResolvedTarget;\n readonly targetHooks?: TargetHooksConfig;\n}> {\n const selections = await selectMultipleTargets({\n testFilePath: options.evalPath,\n repoRoot: options.repoRoot,\n cwd: process.cwd(),\n env: process.env,\n targetNames: [options.target],\n targetRefs: options.targetRefs,\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.resolvedTarget,\n name: options.target,\n } as ResolvedTarget,\n ...(selection.targetHooks !== undefined && { targetHooks: selection.targetHooks }),\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 targetRefs =\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 targetRefs,\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: string,\n long: 'target',\n description: 'Target name 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, out, format }) => {\n const result = await prepareAttempt({ evalPath, testId, target, 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 'targets_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 targets_path: toRelativeArtifactPath(\n options.outputDir,\n path.join(testBundlePath, 'targets.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 | 'targets_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 targets_path: indexEntry.targets_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 passed =\n typeof metadata.pass_count === 'number' ? metadata.pass_count : grading.pass ? total : 0;\n failed =\n typeof metadata.sample_count === 'number' && typeof metadata.pass_count === 'number'\n ? metadata.sample_count - metadata.pass_count\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 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 attempt of entry.attempts ?? entry.trials ?? []) {\n const attemptPath = attempt.attempt_path ?? attempt.run_path;\n if (!entry.result_dir || !attemptPath) {\n continue;\n }\n const runDirPath = path.join(runDir, entry.result_dir, attemptPath);\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, attemptPath, '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, attemptPath, '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.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.targets_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 attempts = record.attempts ?? record.trials;\n if (!attempts || attempts.length === 0) return undefined;\n const resultDir = record.result_dir\n ? normalizeArtifactRelativePath(record.result_dir)\n : undefined;\n\n return attempts.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\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 attempts = buildRepeatTrialReadModels(baseDir, record);\n return {\n ...result,\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 ...(attempts && { attempts }),\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 category?: string;\n score: number;\n passed: boolean;\n execution_status?: string;\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 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 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 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({\n test_id: r.testId,\n ...(r.category && { category: normalizeCategoryPath(r.category) }),\n score: r.score,\n passed,\n execution_status: r.executionStatus,\n });\n cellMap.set(key, entry);\n\n // Per-run accumulation. Dedupe tests within the run by last-wins.\n runTestMap.set(r.testId, {\n test_id: r.testId,\n ...(r.category && { category: normalizeCategoryPath(r.category) }),\n score: r.score,\n passed,\n execution_status: r.executionStatus,\n });\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 runEntries.push({\n run_id: m.filename,\n started_at: runStartedAt,\n experiment: runExperiment,\n target: runTarget,\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 target names\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 { listTargetNames, readTargetDefinitions } from '@agentv/core';\nimport type { Context } from 'hono';\nimport type { Hono } from 'hono';\n\nimport { TARGET_FILE_CANDIDATES } from '../../utils/targets.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 /** Target name passed via --target (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 targets 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 targets file using the standard discovery\n let targetsFilePath: string | undefined;\n for (const candidate of TARGET_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 TARGET_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 readTargetDefinitions(targetsFilePath);\n return listTargetNames(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 // Target override\n if (req.target?.trim()) {\n args.push('--target', 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 { parseYamlValue } 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_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 targetsPath: 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 readTargetDefinitions(\n targetsPath: string,\n): Promise<readonly Record<string, unknown>[]> {\n const parsed = parseYamlValue(await readFile(targetsPath, 'utf8'));\n if (!isRecord(parsed) || !Array.isArray(parsed.targets)) {\n throw new Error(`Targets file is missing a top-level targets array: ${targetsPath}`);\n }\n return parsed.targets.filter(isRecord);\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 targetsPath: string,\n targetNames: readonly string[],\n label: string,\n): Promise<void> {\n const definitions = await readTargetDefinitions(targetsPath);\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: ${targetsPath} does not define target(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 ${targetsPath}: ${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 targetsPath =\n resolveRelativeRunPath(options.sourceRunDir, record.targets_path) ??\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 || !targetsPath || !testDir || !resultDir) {\n throw new Error(\n `Selected result ${recordLabel} is missing test bundle paths. Re-run requires test/EVAL.yaml and test/targets.yaml.`,\n );\n }\n\n await ensureFile(evalPath, `Test eval for ${recordLabel}`);\n await ensureFile(targetsPath, `Test targets 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 targetsPath,\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\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 targets.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 overrideTargetsPath = path.resolve(cwd, args.targets);\n await ensureFile(overrideTargetsPath, 'Target override');\n const targetNames =\n targetOverrides.length > 0 ? targetOverrides : selected.map((bundle) => bundle.taskTarget);\n await validateTargetFile(overrideTargetsPath, targetNames, 'Target 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.targetsPath) ?? new Set<string>();\n for (const targetName of targetNames) {\n names.add(targetName);\n }\n targetNamesByFile.set(bundle.targetsPath, names);\n }\n for (const [targetsPath, names] of targetNamesByFile.entries()) {\n await validateTargetFile(targetsPath, [...names], 'Test bundle targets');\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 target: targetOverrides,\n targets: 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 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 validateCasesFile,\n validateConfigFile,\n validateEvalFile,\n validateFileReferences,\n validateTargetsFile,\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 // 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)) expanded.add(absolutePath);\n continue;\n }\n if (stats.isDirectory()) {\n const yamlFiles = await findYamlFiles(absolutePath);\n for (const f of yamlFiles) 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 yamlMatches = matches.filter((f) => isYamlFile(f));\n if (yamlMatches.length === 0) {\n console.warn(`Warning: No YAML files matched pattern: ${inputPath}`);\n }\n for (const f of yamlMatches) expanded.add(path.normalize(f));\n }\n\n const sorted = Array.from(expanded);\n sorted.sort();\n return sorted;\n}\n\nasync function findYamlFiles(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 findYamlFiles(fullPath);\n results.push(...subFiles);\n } else if (entry.isFile() && isEvalYamlFile(entry.name)) {\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 and targets YAML 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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AA0IA,KAAC,WAAW;AACV;AAGA,eAASA,YAAW,KAAK,MAAM,KAAK;AAClC,YAAI,CAAC,IAAK,QAAO;AAGjB,YAAI,CAACA,YAAW,eAAe;AAAE,gBAAM,IAAI,YAAY;AAAA,QAAG;AAG1D,YAAI,oBAAoBA,YAAW,cAAc,OAAO,OAAOA,YAAW,YAAY,IAAI,QACtF,oBAAoBA,YAAW,mBAC/B;AACJ,YAAI,sBAAsB,QAAQ,sBAAsB,KAAM,cAAa,KAAK,IAAI,mBAAmB,iBAAiB;AAAA,iBAC/G,sBAAsB,KAAM,cAAa;AAAA,iBACzC,sBAAsB,KAAM,cAAa;AAAA,YAC7C,cAAa;AAIlB,YAAI,QAAQ,WAAW,eAAe,KAClC,GAAG,MAAM,KAAK;AAClB,aAAK,IAAI,GAAG,IAAI,KAAK,KAAK;AAExB,sBAAY,KAAK,CAAC;AAElB,cAAI,KAAK;AAAE,wBAAY,UAAU,GAAG;AAAA,UAAG;AAEvC,cAAI,CAAC,WAAW;AAAE;AAAA,UAAU;AAE5B,cAAI,CAACA,YAAW,eAAe;AAAE,4BAAgB,UAAU,YAAY;AAAA,UAAG,OACrE;AAAE,4BAAgB;AAAA,UAAW;AAElC,gBAAM,gBAAgB,KAAK,eAAe,UAAU;AAIpD,cAAI,eAAe,QAAQ,MAAM,YAAY;AAC3C,yBAAa;AAEb,gBAAI,OAAOA,YAAW,oBAAqB,UAAS,KAAK,CAAC;AAAA,gBACrD,UAAS;AAEd,gBAAIA,YAAW,iBAAkB,QAAO;AAAA,UAC1C;AAAA,QACF;AAGA,eAAO,UAAUA,YAAW;AAAA,MAC9B;AAGA,MAAAA,YAAW,YAAY;AACvB,MAAAA,YAAW,oBAAoB;AAC/B,MAAAA,YAAW,gBAAgB;AAC3B,MAAAA,YAAW,kBAAkB;AAC7B,MAAAA,YAAW,sBAAsB;AACjC,MAAAA,YAAW,mBAAmB;AAI9B,UAAI,OAAO,WAAW,eAAe,OAAO,SAAS;AACnD,eAAO,UAAUA;AAAA,MACnB,OAEK;AACH,eAAO,aAAaA;AAAA,MACtB;AAEA,UAAI,UAAU,KAAK,IAAI,GAAE,EAAE,IAAI;AAC/B,eAAS,gBAAgB,GAAG,GAAG,KAAK;AAElC,cAAM,OAAO,QAAQ,IAAI,MAAM;AAE/B,YAAI,OAAO,EAAE;AACb,YAAI,OAAO,EAAE;AAGb,YAAI,SAAS,EAAG,QAAO,KAAK,IAAI,MAAM,GAAG,IAAI;AAC7C,YAAI,SAAS,EAAG,QAAO,KAAK,IAAI,MAAM,GAAG,IAAI;AAG7C,YAAI,KAAK,IAAI,OAAO,IAAI,IAAI,IAAK,QAAO,MAAM;AAG9C,YAAI,SAAS,CAAC,GACV,GAAG,GAAG,QAAQ,MAAM;AAGxB,aAAK,IAAI,GAAG,KAAK,MAAM,KAAK;AAAE,iBAAO,CAAC,IAAI,CAAC,CAAC;AAAA,QAAG;AAG/C,aAAK,IAAI,GAAG,KAAK,MAAM,KAAK;AAAE,iBAAO,CAAC,EAAE,CAAC,IAAI;AAAA,QAAG;AAGhD,aAAK,IAAI,GAAG,KAAK,MAAM,KAAK;AAC1B,mBAAS;AACT,iBAAO;AACP,cAAI,IAAI,IAAK,QAAO,IAAI;AACxB,iBAAO,OAAO;AACd,cAAI,OAAO,MAAM,EAAG,QAAO,MAAM;AAEjC,eAAK,IAAI,GAAG,KAAK,MAAM,KAAK;AAE1B,gBAAI,IAAI,QAAQ,IAAI,MAAM;AACxB,qBAAO,CAAC,EAAE,CAAC,IAAI,MAAM;AAAA,YACvB,OAGK;AAEH,kBAAI,EAAE,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,GAAG;AACvC,uBAAO,CAAC,EAAE,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,cACpC,OAEK;AACH,uBAAO,CAAC,EAAE,CAAC,IAAI,KAAK;AAAA,kBAAI,OAAO,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;AAAA;AAAA,kBACvB,KAAK;AAAA,oBAAI,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI;AAAA;AAAA,oBAC5B,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI;AAAA,kBAAC;AAAA,gBAAC;AAAA,cAC/C;AAAA,YACF;AAGA,gBAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAQ,UAAS,OAAO,CAAC,EAAE,CAAC;AAAA,UACjD;AAIA,cAAI,SAAS,IAAK,QAAO,MAAM;AAAA,QACjC;AAEA,eAAO,OAAO,IAAI,EAAE,IAAI;AAAA,MAC1B;AAAA,IAEF,GAAG;AAAA;AAAA;;;ACjRH;AAAA;AAAA;AAIA,QAAI,IAAI;AACR,QAAI,IAAI,IAAI;AACZ,QAAI,IAAI,IAAI;AACZ,QAAI,IAAI,IAAI;AACZ,QAAI,IAAI,IAAI;AACZ,QAAI,IAAI,IAAI;AAgBZ,WAAO,UAAU,SAAU,KAAK,SAAS;AACvC,gBAAU,WAAW,CAAC;AACtB,UAAI,OAAO,OAAO;AAClB,UAAI,SAAS,YAAY,IAAI,SAAS,GAAG;AACvC,eAAOC,OAAM,GAAG;AAAA,MAClB,WAAW,SAAS,YAAY,SAAS,GAAG,GAAG;AAC7C,eAAO,QAAQ,OAAO,QAAQ,GAAG,IAAI,SAAS,GAAG;AAAA,MACnD;AACA,YAAM,IAAI;AAAA,QACR,0DACE,KAAK,UAAU,GAAG;AAAA,MACtB;AAAA,IACF;AAUA,aAASA,OAAM,KAAK;AAClB,YAAM,OAAO,GAAG;AAChB,UAAI,IAAI,SAAS,KAAK;AACpB;AAAA,MACF;AACA,UAAI,QAAQ,mIAAmI;AAAA,QAC7I;AAAA,MACF;AACA,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AACA,UAAI,IAAI,WAAW,MAAM,CAAC,CAAC;AAC3B,UAAI,QAAQ,MAAM,CAAC,KAAK,MAAM,YAAY;AAC1C,cAAQ,MAAM;AAAA,QACZ,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,IAAI;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,IAAI;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,IAAI;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,IAAI;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,IAAI;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,IAAI;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AACH,iBAAO;AAAA,QACT;AACE,iBAAO;AAAA,MACX;AAAA,IACF;AAUA,aAAS,SAAS,IAAI;AACpB,UAAI,QAAQ,KAAK,IAAI,EAAE;AACvB,UAAI,SAAS,GAAG;AACd,eAAO,KAAK,MAAM,KAAK,CAAC,IAAI;AAAA,MAC9B;AACA,UAAI,SAAS,GAAG;AACd,eAAO,KAAK,MAAM,KAAK,CAAC,IAAI;AAAA,MAC9B;AACA,UAAI,SAAS,GAAG;AACd,eAAO,KAAK,MAAM,KAAK,CAAC,IAAI;AAAA,MAC9B;AACA,UAAI,SAAS,GAAG;AACd,eAAO,KAAK,MAAM,KAAK,CAAC,IAAI;AAAA,MAC9B;AACA,aAAO,KAAK;AAAA,IACd;AAUA,aAAS,QAAQ,IAAI;AACnB,UAAI,QAAQ,KAAK,IAAI,EAAE;AACvB,UAAI,SAAS,GAAG;AACd,eAAO,OAAO,IAAI,OAAO,GAAG,KAAK;AAAA,MACnC;AACA,UAAI,SAAS,GAAG;AACd,eAAO,OAAO,IAAI,OAAO,GAAG,MAAM;AAAA,MACpC;AACA,UAAI,SAAS,GAAG;AACd,eAAO,OAAO,IAAI,OAAO,GAAG,QAAQ;AAAA,MACtC;AACA,UAAI,SAAS,GAAG;AACd,eAAO,OAAO,IAAI,OAAO,GAAG,QAAQ;AAAA,MACtC;AACA,aAAO,KAAK;AAAA,IACd;AAMA,aAAS,OAAO,IAAI,OAAO,GAAG,MAAM;AAClC,UAAI,WAAW,SAAS,IAAI;AAC5B,aAAO,KAAK,MAAM,KAAK,CAAC,IAAI,MAAM,QAAQ,WAAW,MAAM;AAAA,IAC7D;AAAA;AAAA;;;ACjKA;AAAA;AAAA;AAMA,aAAS,MAAMC,MAAK;AACnB,kBAAY,QAAQ;AACpB,kBAAY,UAAU;AACtB,kBAAY,SAAS;AACrB,kBAAY,UAAU;AACtB,kBAAY,SAAS;AACrB,kBAAY,UAAU;AACtB,kBAAY,WAAW;AACvB,kBAAY,UAAU;AAEtB,aAAO,KAAKA,IAAG,EAAE,QAAQ,SAAO;AAC/B,oBAAY,GAAG,IAAIA,KAAI,GAAG;AAAA,MAC3B,CAAC;AAMD,kBAAY,QAAQ,CAAC;AACrB,kBAAY,QAAQ,CAAC;AAOrB,kBAAY,aAAa,CAAC;AAQ1B,eAAS,YAAY,WAAW;AAC/B,YAAI,OAAO;AAEX,iBAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AAC1C,kBAAS,QAAQ,KAAK,OAAQ,UAAU,WAAW,CAAC;AACpD,kBAAQ;AAAA,QACT;AAEA,eAAO,YAAY,OAAO,KAAK,IAAI,IAAI,IAAI,YAAY,OAAO,MAAM;AAAA,MACrE;AACA,kBAAY,cAAc;AAS1B,eAAS,YAAY,WAAW;AAC/B,YAAI;AACJ,YAAI,iBAAiB;AACrB,YAAI;AACJ,YAAI;AAEJ,iBAASC,UAAS,MAAM;AAEvB,cAAI,CAACA,OAAM,SAAS;AACnB;AAAA,UACD;AAEA,gBAAM,OAAOA;AAGb,gBAAM,OAAO,OAAO,oBAAI,KAAK,CAAC;AAC9B,gBAAM,KAAK,QAAQ,YAAY;AAC/B,eAAK,OAAO;AACZ,eAAK,OAAO;AACZ,eAAK,OAAO;AACZ,qBAAW;AAEX,eAAK,CAAC,IAAI,YAAY,OAAO,KAAK,CAAC,CAAC;AAEpC,cAAI,OAAO,KAAK,CAAC,MAAM,UAAU;AAEhC,iBAAK,QAAQ,IAAI;AAAA,UAClB;AAGA,cAAI,QAAQ;AACZ,eAAK,CAAC,IAAI,KAAK,CAAC,EAAE,QAAQ,iBAAiB,CAAC,OAAO,WAAW;AAE7D,gBAAI,UAAU,MAAM;AACnB,qBAAO;AAAA,YACR;AACA;AACA,kBAAM,YAAY,YAAY,WAAW,MAAM;AAC/C,gBAAI,OAAO,cAAc,YAAY;AACpC,oBAAM,MAAM,KAAK,KAAK;AACtB,sBAAQ,UAAU,KAAK,MAAM,GAAG;AAGhC,mBAAK,OAAO,OAAO,CAAC;AACpB;AAAA,YACD;AACA,mBAAO;AAAA,UACR,CAAC;AAGD,sBAAY,WAAW,KAAK,MAAM,IAAI;AAEtC,gBAAM,QAAQ,KAAK,OAAO,YAAY;AACtC,gBAAM,MAAM,MAAM,IAAI;AAAA,QACvB;AAEA,QAAAA,OAAM,YAAY;AAClB,QAAAA,OAAM,YAAY,YAAY,UAAU;AACxC,QAAAA,OAAM,QAAQ,YAAY,YAAY,SAAS;AAC/C,QAAAA,OAAM,SAAS;AACf,QAAAA,OAAM,UAAU,YAAY;AAE5B,eAAO,eAAeA,QAAO,WAAW;AAAA,UACvC,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,KAAK,MAAM;AACV,gBAAI,mBAAmB,MAAM;AAC5B,qBAAO;AAAA,YACR;AACA,gBAAI,oBAAoB,YAAY,YAAY;AAC/C,gCAAkB,YAAY;AAC9B,6BAAe,YAAY,QAAQ,SAAS;AAAA,YAC7C;AAEA,mBAAO;AAAA,UACR;AAAA,UACA,KAAK,OAAK;AACT,6BAAiB;AAAA,UAClB;AAAA,QACD,CAAC;AAGD,YAAI,OAAO,YAAY,SAAS,YAAY;AAC3C,sBAAY,KAAKA,MAAK;AAAA,QACvB;AAEA,eAAOA;AAAA,MACR;AAEA,eAAS,OAAO,WAAW,WAAW;AACrC,cAAM,WAAW,YAAY,KAAK,aAAa,OAAO,cAAc,cAAc,MAAM,aAAa,SAAS;AAC9G,iBAAS,MAAM,KAAK;AACpB,eAAO;AAAA,MACR;AASA,eAAS,OAAO,YAAY;AAC3B,oBAAY,KAAK,UAAU;AAC3B,oBAAY,aAAa;AAEzB,oBAAY,QAAQ,CAAC;AACrB,oBAAY,QAAQ,CAAC;AAErB,cAAM,SAAS,OAAO,eAAe,WAAW,aAAa,IAC3D,KAAK,EACL,QAAQ,QAAQ,GAAG,EACnB,MAAM,GAAG,EACT,OAAO,OAAO;AAEhB,mBAAW,MAAM,OAAO;AACvB,cAAI,GAAG,CAAC,MAAM,KAAK;AAClB,wBAAY,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA,UACnC,OAAO;AACN,wBAAY,MAAM,KAAK,EAAE;AAAA,UAC1B;AAAA,QACD;AAAA,MACD;AAUA,eAAS,gBAAgB,QAAQ,UAAU;AAC1C,YAAI,cAAc;AAClB,YAAI,gBAAgB;AACpB,YAAI,YAAY;AAChB,YAAI,aAAa;AAEjB,eAAO,cAAc,OAAO,QAAQ;AACnC,cAAI,gBAAgB,SAAS,WAAW,SAAS,aAAa,MAAM,OAAO,WAAW,KAAK,SAAS,aAAa,MAAM,MAAM;AAE5H,gBAAI,SAAS,aAAa,MAAM,KAAK;AACpC,0BAAY;AACZ,2BAAa;AACb;AAAA,YACD,OAAO;AACN;AACA;AAAA,YACD;AAAA,UACD,WAAW,cAAc,IAAI;AAE5B,4BAAgB,YAAY;AAC5B;AACA,0BAAc;AAAA,UACf,OAAO;AACN,mBAAO;AAAA,UACR;AAAA,QACD;AAGA,eAAO,gBAAgB,SAAS,UAAU,SAAS,aAAa,MAAM,KAAK;AAC1E;AAAA,QACD;AAEA,eAAO,kBAAkB,SAAS;AAAA,MACnC;AAQA,eAAS,UAAU;AAClB,cAAM,aAAa;AAAA,UAClB,GAAG,YAAY;AAAA,UACf,GAAG,YAAY,MAAM,IAAI,eAAa,MAAM,SAAS;AAAA,QACtD,EAAE,KAAK,GAAG;AACV,oBAAY,OAAO,EAAE;AACrB,eAAO;AAAA,MACR;AASA,eAAS,QAAQ,MAAM;AACtB,mBAAW,QAAQ,YAAY,OAAO;AACrC,cAAI,gBAAgB,MAAM,IAAI,GAAG;AAChC,mBAAO;AAAA,UACR;AAAA,QACD;AAEA,mBAAW,MAAM,YAAY,OAAO;AACnC,cAAI,gBAAgB,MAAM,EAAE,GAAG;AAC9B,mBAAO;AAAA,UACR;AAAA,QACD;AAEA,eAAO;AAAA,MACR;AASA,eAAS,OAAO,KAAK;AACpB,YAAI,eAAe,OAAO;AACzB,iBAAO,IAAI,SAAS,IAAI;AAAA,QACzB;AACA,eAAO;AAAA,MACR;AAMA,eAAS,UAAU;AAClB,gBAAQ,KAAK,uIAAuI;AAAA,MACrJ;AAEA,kBAAY,OAAO,YAAY,KAAK,CAAC;AAErC,aAAO;AAAA,IACR;AAEA,WAAO,UAAU;AAAA;AAAA;;;ACnSjB;AAAA;AAAA;AAMA,YAAQ,aAAa;AACrB,YAAQ,OAAO;AACf,YAAQ,OAAO;AACf,YAAQ,YAAY;AACpB,YAAQ,UAAU,aAAa;AAC/B,YAAQ,UAAW,uBAAM;AACxB,UAAI,SAAS;AAEb,aAAO,MAAM;AACZ,YAAI,CAAC,QAAQ;AACZ,mBAAS;AACT,kBAAQ,KAAK,uIAAuI;AAAA,QACrJ;AAAA,MACD;AAAA,IACD,GAAG;AAMH,YAAQ,SAAS;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAWA,aAAS,YAAY;AAIpB,UAAI,OAAO,WAAW,eAAe,OAAO,YAAY,OAAO,QAAQ,SAAS,cAAc,OAAO,QAAQ,SAAS;AACrH,eAAO;AAAA,MACR;AAGA,UAAI,OAAO,cAAc,eAAe,UAAU,aAAa,UAAU,UAAU,YAAY,EAAE,MAAM,uBAAuB,GAAG;AAChI,eAAO;AAAA,MACR;AAEA,UAAI;AAKJ,aAAQ,OAAO,aAAa,eAAe,SAAS,mBAAmB,SAAS,gBAAgB,SAAS,SAAS,gBAAgB,MAAM;AAAA,MAEtI,OAAO,WAAW,eAAe,OAAO,YAAY,OAAO,QAAQ,WAAY,OAAO,QAAQ,aAAa,OAAO,QAAQ;AAAA;AAAA,MAG1H,OAAO,cAAc,eAAe,UAAU,cAAc,IAAI,UAAU,UAAU,YAAY,EAAE,MAAM,gBAAgB,MAAM,SAAS,EAAE,CAAC,GAAG,EAAE,KAAK;AAAA,MAEpJ,OAAO,cAAc,eAAe,UAAU,aAAa,UAAU,UAAU,YAAY,EAAE,MAAM,oBAAoB;AAAA,IAC1H;AAQA,aAAS,WAAW,MAAM;AACzB,WAAK,CAAC,KAAK,KAAK,YAAY,OAAO,MAClC,KAAK,aACJ,KAAK,YAAY,QAAQ,OAC1B,KAAK,CAAC,KACL,KAAK,YAAY,QAAQ,OAC1B,MAAM,OAAO,QAAQ,SAAS,KAAK,IAAI;AAExC,UAAI,CAAC,KAAK,WAAW;AACpB;AAAA,MACD;AAEA,YAAMC,KAAI,YAAY,KAAK;AAC3B,WAAK,OAAO,GAAG,GAAGA,IAAG,gBAAgB;AAKrC,UAAI,QAAQ;AACZ,UAAI,QAAQ;AACZ,WAAK,CAAC,EAAE,QAAQ,eAAe,WAAS;AACvC,YAAI,UAAU,MAAM;AACnB;AAAA,QACD;AACA;AACA,YAAI,UAAU,MAAM;AAGnB,kBAAQ;AAAA,QACT;AAAA,MACD,CAAC;AAED,WAAK,OAAO,OAAO,GAAGA,EAAC;AAAA,IACxB;AAUA,YAAQ,MAAM,QAAQ,SAAS,QAAQ,QAAQ,MAAM;AAAA,IAAC;AAQtD,aAAS,KAAK,YAAY;AACzB,UAAI;AACH,YAAI,YAAY;AACf,kBAAQ,QAAQ,QAAQ,SAAS,UAAU;AAAA,QAC5C,OAAO;AACN,kBAAQ,QAAQ,WAAW,OAAO;AAAA,QACnC;AAAA,MACD,SAAS,OAAO;AAAA,MAGhB;AAAA,IACD;AAQA,aAAS,OAAO;AACf,UAAI;AACJ,UAAI;AACH,YAAI,QAAQ,QAAQ,QAAQ,OAAO,KAAK,QAAQ,QAAQ,QAAQ,OAAO;AAAA,MACxE,SAAS,OAAO;AAAA,MAGhB;AAGA,UAAI,CAAC,KAAK,OAAO,YAAY,eAAe,SAAS,SAAS;AAC7D,YAAI,QAAQ,IAAI;AAAA,MACjB;AAEA,aAAO;AAAA,IACR;AAaA,aAAS,eAAe;AACvB,UAAI;AAGH,eAAO;AAAA,MACR,SAAS,OAAO;AAAA,MAGhB;AAAA,IACD;AAEA,WAAO,UAAU,iBAAoB,OAAO;AAE5C,QAAM,EAAC,WAAU,IAAI,OAAO;AAM5B,eAAW,IAAI,SAAU,GAAG;AAC3B,UAAI;AACH,eAAO,KAAK,UAAU,CAAC;AAAA,MACxB,SAAS,OAAO;AACf,eAAO,iCAAiC,MAAM;AAAA,MAC/C;AAAA,IACD;AAAA;AAAA;;;AC/QA;AAAA;AAAA;AAIA,QAAMC,OAAM,UAAQ,KAAK;AACzB,QAAM,OAAO,UAAQ,MAAM;AAM3B,YAAQ,OAAO;AACf,YAAQ,MAAM;AACd,YAAQ,aAAa;AACrB,YAAQ,OAAO;AACf,YAAQ,OAAO;AACf,YAAQ,YAAY;AACpB,YAAQ,UAAU,KAAK;AAAA,MACtB,MAAM;AAAA,MAAC;AAAA,MACP;AAAA,IACD;AAMA,YAAQ,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAElC,QAAI;AAGH,YAAMC,iBAAgB,UAAQ,gBAAgB;AAE9C,UAAIA,mBAAkBA,eAAc,UAAUA,gBAAe,SAAS,GAAG;AACxE,gBAAQ,SAAS;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,IACD,SAAS,OAAO;AAAA,IAEhB;AAQA,YAAQ,cAAc,OAAO,KAAK,QAAQ,GAAG,EAAE,OAAO,SAAO;AAC5D,aAAO,WAAW,KAAK,GAAG;AAAA,IAC3B,CAAC,EAAE,OAAO,CAAC,KAAK,QAAQ;AAEvB,YAAM,OAAO,IACX,UAAU,CAAC,EACX,YAAY,EACZ,QAAQ,aAAa,CAAC,GAAG,MAAM;AAC/B,eAAO,EAAE,YAAY;AAAA,MACtB,CAAC;AAGF,UAAI,MAAM,QAAQ,IAAI,GAAG;AACzB,UAAI,2BAA2B,KAAK,GAAG,GAAG;AACzC,cAAM;AAAA,MACP,WAAW,6BAA6B,KAAK,GAAG,GAAG;AAClD,cAAM;AAAA,MACP,WAAW,QAAQ,QAAQ;AAC1B,cAAM;AAAA,MACP,OAAO;AACN,cAAM,OAAO,GAAG;AAAA,MACjB;AAEA,UAAI,IAAI,IAAI;AACZ,aAAO;AAAA,IACR,GAAG,CAAC,CAAC;AAML,aAAS,YAAY;AACpB,aAAO,YAAY,QAAQ,cAC1B,QAAQ,QAAQ,YAAY,MAAM,IAClCD,KAAI,OAAO,QAAQ,OAAO,EAAE;AAAA,IAC9B;AAQA,aAAS,WAAW,MAAM;AACzB,YAAM,EAAC,WAAW,MAAM,WAAAE,WAAS,IAAI;AAErC,UAAIA,YAAW;AACd,cAAMC,KAAI,KAAK;AACf,cAAM,YAAY,YAAcA,KAAI,IAAIA,KAAI,SAASA;AACrD,cAAM,SAAS,KAAK,SAAS,MAAM,IAAI;AAEvC,aAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,MAAM,IAAI,EAAE,KAAK,OAAO,MAAM;AACzD,aAAK,KAAK,YAAY,OAAO,OAAO,QAAQ,SAAS,KAAK,IAAI,IAAI,SAAW;AAAA,MAC9E,OAAO;AACN,aAAK,CAAC,IAAI,QAAQ,IAAI,OAAO,MAAM,KAAK,CAAC;AAAA,MAC1C;AAAA,IACD;AAEA,aAAS,UAAU;AAClB,UAAI,QAAQ,YAAY,UAAU;AACjC,eAAO;AAAA,MACR;AACA,cAAO,oBAAI,KAAK,GAAE,YAAY,IAAI;AAAA,IACnC;AAMA,aAAS,OAAO,MAAM;AACrB,aAAO,QAAQ,OAAO,MAAM,KAAK,kBAAkB,QAAQ,aAAa,GAAG,IAAI,IAAI,IAAI;AAAA,IACxF;AAQA,aAAS,KAAK,YAAY;AACzB,UAAI,YAAY;AACf,gBAAQ,IAAI,QAAQ;AAAA,MACrB,OAAO;AAGN,eAAO,QAAQ,IAAI;AAAA,MACpB;AAAA,IACD;AASA,aAAS,OAAO;AACf,aAAO,QAAQ,IAAI;AAAA,IACpB;AASA,aAAS,KAAKC,QAAO;AACpB,MAAAA,OAAM,cAAc,CAAC;AAErB,YAAM,OAAO,OAAO,KAAK,QAAQ,WAAW;AAC5C,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACrC,QAAAA,OAAM,YAAY,KAAK,CAAC,CAAC,IAAI,QAAQ,YAAY,KAAK,CAAC,CAAC;AAAA,MACzD;AAAA,IACD;AAEA,WAAO,UAAU,iBAAoB,OAAO;AAE5C,QAAM,EAAC,WAAU,IAAI,OAAO;AAM5B,eAAW,IAAI,SAAU,GAAG;AAC3B,WAAK,YAAY,SAAS,KAAK;AAC/B,aAAO,KAAK,QAAQ,GAAG,KAAK,WAAW,EACrC,MAAM,IAAI,EACV,IAAI,SAAO,IAAI,KAAK,CAAC,EACrB,KAAK,GAAG;AAAA,IACX;AAMA,eAAW,IAAI,SAAU,GAAG;AAC3B,WAAK,YAAY,SAAS,KAAK;AAC/B,aAAO,KAAK,QAAQ,GAAG,KAAK,WAAW;AAAA,IACxC;AAAA;AAAA;;;ACtQA;AAAA;AAAA;AAKA,QAAI,OAAO,YAAY,eAAe,QAAQ,SAAS,cAAc,QAAQ,YAAY,QAAQ,QAAQ,QAAQ;AAChH,aAAO,UAAU;AAAA,IAClB,OAAO;AACN,aAAO,UAAU;AAAA,IAClB;AAAA;AAAA;;;ACTA,OAAOC,YAAU;;;ACAjB,IAAM,yBAAyB;AAE/B,IAAM,aAAa,CAAC,SAAS,MAAM,UAAQ,QAAU,OAAO,MAAM;AAElE,IAAM,cAAc,CAAC,SAAS,MAAM,UAAQ,QAAU,KAAK,MAAM,MAAM,IAAI;AAE3E,IAAM,cAAc,CAAC,SAAS,MAAM,CAAC,KAAK,OAAO,SAAS,QAAU,KAAK,MAAM,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI;AAEzG,IAAM,SAAS;AAAA,EACd,UAAU;AAAA,IACT,OAAO,CAAC,GAAG,CAAC;AAAA;AAAA,IAEZ,MAAM,CAAC,GAAG,EAAE;AAAA,IACZ,KAAK,CAAC,GAAG,EAAE;AAAA,IACX,QAAQ,CAAC,GAAG,EAAE;AAAA,IACd,WAAW,CAAC,GAAG,EAAE;AAAA,IACjB,UAAU,CAAC,IAAI,EAAE;AAAA,IACjB,SAAS,CAAC,GAAG,EAAE;AAAA,IACf,QAAQ,CAAC,GAAG,EAAE;AAAA,IACd,eAAe,CAAC,GAAG,EAAE;AAAA,EACtB;AAAA,EACA,OAAO;AAAA,IACN,OAAO,CAAC,IAAI,EAAE;AAAA,IACd,KAAK,CAAC,IAAI,EAAE;AAAA,IACZ,OAAO,CAAC,IAAI,EAAE;AAAA,IACd,QAAQ,CAAC,IAAI,EAAE;AAAA,IACf,MAAM,CAAC,IAAI,EAAE;AAAA,IACb,SAAS,CAAC,IAAI,EAAE;AAAA,IAChB,MAAM,CAAC,IAAI,EAAE;AAAA,IACb,OAAO,CAAC,IAAI,EAAE;AAAA;AAAA,IAGd,aAAa,CAAC,IAAI,EAAE;AAAA,IACpB,MAAM,CAAC,IAAI,EAAE;AAAA;AAAA,IACb,MAAM,CAAC,IAAI,EAAE;AAAA;AAAA,IACb,WAAW,CAAC,IAAI,EAAE;AAAA,IAClB,aAAa,CAAC,IAAI,EAAE;AAAA,IACpB,cAAc,CAAC,IAAI,EAAE;AAAA,IACrB,YAAY,CAAC,IAAI,EAAE;AAAA,IACnB,eAAe,CAAC,IAAI,EAAE;AAAA,IACtB,YAAY,CAAC,IAAI,EAAE;AAAA,IACnB,aAAa,CAAC,IAAI,EAAE;AAAA,EACrB;AAAA,EACA,SAAS;AAAA,IACR,SAAS,CAAC,IAAI,EAAE;AAAA,IAChB,OAAO,CAAC,IAAI,EAAE;AAAA,IACd,SAAS,CAAC,IAAI,EAAE;AAAA,IAChB,UAAU,CAAC,IAAI,EAAE;AAAA,IACjB,QAAQ,CAAC,IAAI,EAAE;AAAA,IACf,WAAW,CAAC,IAAI,EAAE;AAAA,IAClB,QAAQ,CAAC,IAAI,EAAE;AAAA,IACf,SAAS,CAAC,IAAI,EAAE;AAAA;AAAA,IAGhB,eAAe,CAAC,KAAK,EAAE;AAAA,IACvB,QAAQ,CAAC,KAAK,EAAE;AAAA;AAAA,IAChB,QAAQ,CAAC,KAAK,EAAE;AAAA;AAAA,IAChB,aAAa,CAAC,KAAK,EAAE;AAAA,IACrB,eAAe,CAAC,KAAK,EAAE;AAAA,IACvB,gBAAgB,CAAC,KAAK,EAAE;AAAA,IACxB,cAAc,CAAC,KAAK,EAAE;AAAA,IACtB,iBAAiB,CAAC,KAAK,EAAE;AAAA,IACzB,cAAc,CAAC,KAAK,EAAE;AAAA,IACtB,eAAe,CAAC,KAAK,EAAE;AAAA,EACxB;AACD;AAEO,IAAM,gBAAgB,OAAO,KAAK,OAAO,QAAQ;AACjD,IAAM,uBAAuB,OAAO,KAAK,OAAO,KAAK;AACrD,IAAM,uBAAuB,OAAO,KAAK,OAAO,OAAO;AACvD,IAAM,aAAa,CAAC,GAAG,sBAAsB,GAAG,oBAAoB;AAE3E,SAAS,iBAAiB;AACzB,QAAM,QAAQ,oBAAI,IAAI;AAEtB,aAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACxD,eAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AACvD,aAAO,SAAS,IAAI;AAAA,QACnB,MAAM,QAAU,MAAM,CAAC,CAAC;AAAA,QACxB,OAAO,QAAU,MAAM,CAAC,CAAC;AAAA,MAC1B;AAEA,YAAM,SAAS,IAAI,OAAO,SAAS;AAEnC,YAAM,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAAA,IAC7B;AAEA,WAAO,eAAe,QAAQ,WAAW;AAAA,MACxC,OAAO;AAAA,MACP,YAAY;AAAA,IACb,CAAC;AAAA,EACF;AAEA,SAAO,eAAe,QAAQ,SAAS;AAAA,IACtC,OAAO;AAAA,IACP,YAAY;AAAA,EACb,CAAC;AAED,SAAO,MAAM,QAAQ;AACrB,SAAO,QAAQ,QAAQ;AAEvB,SAAO,MAAM,OAAO,WAAW;AAC/B,SAAO,MAAM,UAAU,YAAY;AACnC,SAAO,MAAM,UAAU,YAAY;AACnC,SAAO,QAAQ,OAAO,WAAW,sBAAsB;AACvD,SAAO,QAAQ,UAAU,YAAY,sBAAsB;AAC3D,SAAO,QAAQ,UAAU,YAAY,sBAAsB;AAG3D,SAAO,iBAAiB,QAAQ;AAAA,IAC/B,cAAc;AAAA,MACb,MAAM,KAAK,OAAO,MAAM;AAGvB,YAAI,QAAQ,SAAS,UAAU,MAAM;AACpC,cAAI,MAAM,GAAG;AACZ,mBAAO;AAAA,UACR;AAEA,cAAI,MAAM,KAAK;AACd,mBAAO;AAAA,UACR;AAEA,iBAAO,KAAK,OAAQ,MAAM,KAAK,MAAO,EAAE,IAAI;AAAA,QAC7C;AAEA,eAAO,KACH,KAAK,KAAK,MAAM,MAAM,MAAM,CAAC,IAC7B,IAAI,KAAK,MAAM,QAAQ,MAAM,CAAC,IAC/B,KAAK,MAAM,OAAO,MAAM,CAAC;AAAA,MAC7B;AAAA,MACA,YAAY;AAAA,IACb;AAAA,IACA,UAAU;AAAA,MACT,MAAM,KAAK;AACV,cAAM,UAAU,yBAAyB,KAAK,IAAI,SAAS,EAAE,CAAC;AAC9D,YAAI,CAAC,SAAS;AACb,iBAAO,CAAC,GAAG,GAAG,CAAC;AAAA,QAChB;AAEA,YAAI,CAAC,WAAW,IAAI;AAEpB,YAAI,YAAY,WAAW,GAAG;AAC7B,wBAAc,CAAC,GAAG,WAAW,EAAE,IAAI,eAAa,YAAY,SAAS,EAAE,KAAK,EAAE;AAAA,QAC/E;AAEA,cAAM,UAAU,OAAO,SAAS,aAAa,EAAE;AAE/C,eAAO;AAAA;AAAA,UAEL,WAAW,KAAM;AAAA,UACjB,WAAW,IAAK;AAAA,UACjB,UAAU;AAAA;AAAA,QAEX;AAAA,MACD;AAAA,MACA,YAAY;AAAA,IACb;AAAA,IACA,cAAc;AAAA,MACb,OAAO,SAAO,OAAO,aAAa,GAAG,OAAO,SAAS,GAAG,CAAC;AAAA,MACzD,YAAY;AAAA,IACb;AAAA,IACA,eAAe;AAAA,MACd,MAAM,MAAM;AACX,YAAI,OAAO,GAAG;AACb,iBAAO,KAAK;AAAA,QACb;AAEA,YAAI,OAAO,IAAI;AACd,iBAAO,MAAM,OAAO;AAAA,QACrB;AAEA,YAAI;AACJ,YAAI;AACJ,YAAI;AAEJ,YAAI,QAAQ,KAAK;AAChB,kBAAS,OAAO,OAAO,KAAM,KAAK;AAClC,kBAAQ;AACR,iBAAO;AAAA,QACR,OAAO;AACN,kBAAQ;AAER,gBAAM,YAAY,OAAO;AAEzB,gBAAM,KAAK,MAAM,OAAO,EAAE,IAAI;AAC9B,kBAAQ,KAAK,MAAM,YAAY,CAAC,IAAI;AACpC,iBAAQ,YAAY,IAAK;AAAA,QAC1B;AAEA,cAAM,QAAQ,KAAK,IAAI,KAAK,OAAO,IAAI,IAAI;AAE3C,YAAI,UAAU,GAAG;AAChB,iBAAO;AAAA,QACR;AAGA,YAAI,SAAS,MAAO,KAAK,MAAM,IAAI,KAAK,IAAM,KAAK,MAAM,KAAK,KAAK,IAAK,KAAK,MAAM,GAAG;AAEtF,YAAI,UAAU,GAAG;AAChB,oBAAU;AAAA,QACX;AAEA,eAAO;AAAA,MACR;AAAA,MACA,YAAY;AAAA,IACb;AAAA,IACA,WAAW;AAAA,MACV,OAAO,CAAC,KAAK,OAAO,SAAS,OAAO,cAAc,OAAO,aAAa,KAAK,OAAO,IAAI,CAAC;AAAA,MACvF,YAAY;AAAA,IACb;AAAA,IACA,WAAW;AAAA,MACV,OAAO,SAAO,OAAO,cAAc,OAAO,aAAa,GAAG,CAAC;AAAA,MAC3D,YAAY;AAAA,IACb;AAAA,EACD,CAAC;AAED,SAAO;AACR;AAEA,IAAM,aAAa,eAAe;AAElC,IAAO,sBAAQ;;;AC9Nf,OAAOC,cAAa;AACpB,OAAO,QAAQ;AACf,OAAO,SAAS;AAIhB,SAAS,QAAQC,OAAM,OAAO,WAAW,OAAO,WAAW,KAAK,OAAOD,SAAQ,MAAM;AACpF,QAAM,SAASC,MAAK,WAAW,GAAG,IAAI,KAAMA,MAAK,WAAW,IAAI,MAAM;AACtE,QAAM,WAAW,KAAK,QAAQ,SAASA,KAAI;AAC3C,QAAM,qBAAqB,KAAK,QAAQ,IAAI;AAC5C,SAAO,aAAa,OAAO,uBAAuB,MAAM,WAAW;AACpE;AAEA,IAAM,EAAC,IAAG,IAAID;AAEd,IAAI;AACJ,IACC,QAAQ,UAAU,KACf,QAAQ,WAAW,KACnB,QAAQ,aAAa,KACrB,QAAQ,aAAa,GACvB;AACD,mBAAiB;AAClB,WACC,QAAQ,OAAO,KACZ,QAAQ,QAAQ,KAChB,QAAQ,YAAY,KACpB,QAAQ,cAAc,GACxB;AACD,mBAAiB;AAClB;AAEA,SAAS,gBAAgB;AACxB,MAAI,iBAAiB,KAAK;AACzB,QAAI,IAAI,gBAAgB,QAAQ;AAC/B,aAAO;AAAA,IACR;AAEA,QAAI,IAAI,gBAAgB,SAAS;AAChC,aAAO;AAAA,IACR;AAEA,WAAO,IAAI,YAAY,WAAW,IAAI,IAAI,KAAK,IAAI,OAAO,SAAS,IAAI,aAAa,EAAE,GAAG,CAAC;AAAA,EAC3F;AACD;AAEA,SAAS,eAAe,OAAO;AAC9B,MAAI,UAAU,GAAG;AAChB,WAAO;AAAA,EACR;AAEA,SAAO;AAAA,IACN;AAAA,IACA,UAAU;AAAA,IACV,QAAQ,SAAS;AAAA,IACjB,QAAQ,SAAS;AAAA,EAClB;AACD;AAEA,SAAS,eAAe,YAAY,EAAC,aAAa,aAAa,KAAI,IAAI,CAAC,GAAG;AAC1E,QAAM,mBAAmB,cAAc;AACvC,MAAI,qBAAqB,QAAW;AACnC,qBAAiB;AAAA,EAClB;AAEA,QAAM,aAAa,aAAa,iBAAiB;AAEjD,MAAI,eAAe,GAAG;AACrB,WAAO;AAAA,EACR;AAEA,MAAI,YAAY;AACf,QAAI,QAAQ,WAAW,KACnB,QAAQ,YAAY,KACpB,QAAQ,iBAAiB,GAAG;AAC/B,aAAO;AAAA,IACR;AAEA,QAAI,QAAQ,WAAW,GAAG;AACzB,aAAO;AAAA,IACR;AAAA,EACD;AAIA,MAAI,cAAc,OAAO,gBAAgB,KAAK;AAC7C,WAAO;AAAA,EACR;AAEA,MAAI,cAAc,CAAC,eAAe,eAAe,QAAW;AAC3D,WAAO;AAAA,EACR;AAEA,QAAM,MAAM,cAAc;AAE1B,MAAI,IAAI,SAAS,QAAQ;AACxB,WAAO;AAAA,EACR;AAEA,MAAIA,SAAQ,aAAa,SAAS;AAGjC,UAAM,YAAY,GAAG,QAAQ,EAAE,MAAM,GAAG;AACxC,QACC,OAAO,UAAU,CAAC,CAAC,KAAK,MACrB,OAAO,UAAU,CAAC,CAAC,KAAK,OAC1B;AACD,aAAO,OAAO,UAAU,CAAC,CAAC,KAAK,QAAS,IAAI;AAAA,IAC7C;AAEA,WAAO;AAAA,EACR;AAEA,MAAI,QAAQ,KAAK;AAChB,QAAI,CAAC,kBAAkB,iBAAiB,UAAU,EAAE,KAAK,SAAO,OAAO,GAAG,GAAG;AAC5E,aAAO;AAAA,IACR;AAEA,QAAI,CAAC,UAAU,YAAY,aAAa,aAAa,OAAO,EAAE,KAAK,UAAQ,QAAQ,GAAG,KAAK,IAAI,YAAY,YAAY;AACtH,aAAO;AAAA,IACR;AAEA,WAAO;AAAA,EACR;AAEA,MAAI,sBAAsB,KAAK;AAC9B,WAAO,gCAAgC,KAAK,IAAI,gBAAgB,IAAI,IAAI;AAAA,EACzE;AAEA,MAAI,IAAI,cAAc,aAAa;AAClC,WAAO;AAAA,EACR;AAEA,MAAI,IAAI,SAAS,eAAe;AAC/B,WAAO;AAAA,EACR;AAEA,MAAI,IAAI,SAAS,iBAAiB;AACjC,WAAO;AAAA,EACR;AAEA,MAAI,IAAI,SAAS,WAAW;AAC3B,WAAO;AAAA,EACR;AAEA,MAAI,kBAAkB,KAAK;AAC1B,UAAM,UAAU,OAAO,UAAU,IAAI,wBAAwB,IAAI,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AAElF,YAAQ,IAAI,cAAc;AAAA,MACzB,KAAK,aAAa;AACjB,eAAO,WAAW,IAAI,IAAI;AAAA,MAC3B;AAAA,MAEA,KAAK,kBAAkB;AACtB,eAAO;AAAA,MACR;AAAA,IAED;AAAA,EACD;AAEA,MAAI,iBAAiB,KAAK,IAAI,IAAI,GAAG;AACpC,WAAO;AAAA,EACR;AAEA,MAAI,8DAA8D,KAAK,IAAI,IAAI,GAAG;AACjF,WAAO;AAAA,EACR;AAEA,MAAI,eAAe,KAAK;AACvB,WAAO;AAAA,EACR;AAEA,SAAO;AACR;AAEO,SAAS,oBAAoB,QAAQ,UAAU,CAAC,GAAG;AACzD,QAAM,QAAQ,eAAe,QAAQ;AAAA,IACpC,aAAa,UAAU,OAAO;AAAA,IAC9B,GAAG;AAAA,EACJ,CAAC;AAED,SAAO,eAAe,KAAK;AAC5B;AAEA,IAAM,gBAAgB;AAAA,EACrB,QAAQ,oBAAoB,EAAC,OAAO,IAAI,OAAO,CAAC,EAAC,CAAC;AAAA,EAClD,QAAQ,oBAAoB,EAAC,OAAO,IAAI,OAAO,CAAC,EAAC,CAAC;AACnD;AAEA,IAAO,yBAAQ;;;AC5LR,SAAS,iBAAiBE,SAAQ,WAAW,UAAU;AAC7D,MAAI,QAAQA,QAAO,QAAQ,SAAS;AACpC,MAAI,UAAU,IAAI;AACjB,WAAOA;AAAA,EACR;AAEA,QAAM,kBAAkB,UAAU;AAClC,MAAI,WAAW;AACf,MAAI,cAAc;AAClB,KAAG;AACF,mBAAeA,QAAO,MAAM,UAAU,KAAK,IAAI,YAAY;AAC3D,eAAW,QAAQ;AACnB,YAAQA,QAAO,QAAQ,WAAW,QAAQ;AAAA,EAC3C,SAAS,UAAU;AAEnB,iBAAeA,QAAO,MAAM,QAAQ;AACpC,SAAO;AACR;AAEO,SAAS,+BAA+BA,SAAQ,QAAQ,SAAS,OAAO;AAC9E,MAAI,WAAW;AACf,MAAI,cAAc;AAClB,KAAG;AACF,UAAM,QAAQA,QAAO,QAAQ,CAAC,MAAM;AACpC,mBAAeA,QAAO,MAAM,UAAW,QAAQ,QAAQ,IAAI,KAAM,IAAI,UAAU,QAAQ,SAAS,QAAQ;AACxG,eAAW,QAAQ;AACnB,YAAQA,QAAO,QAAQ,MAAM,QAAQ;AAAA,EACtC,SAAS,UAAU;AAEnB,iBAAeA,QAAO,MAAM,QAAQ;AACpC,SAAO;AACR;;;ACzBA,IAAM,EAAC,QAAQ,aAAa,QAAQ,YAAW,IAAI;AAEnD,IAAM,YAAY,OAAO,WAAW;AACpC,IAAM,SAAS,OAAO,QAAQ;AAC9B,IAAM,WAAW,OAAO,UAAU;AAGlC,IAAM,eAAe;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEA,IAAMC,UAAS,uBAAO,OAAO,IAAI;AAEjC,IAAM,eAAe,CAAC,QAAQ,UAAU,CAAC,MAAM;AAC9C,MAAI,QAAQ,SAAS,EAAE,OAAO,UAAU,QAAQ,KAAK,KAAK,QAAQ,SAAS,KAAK,QAAQ,SAAS,IAAI;AACpG,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACtE;AAGA,QAAM,aAAa,cAAc,YAAY,QAAQ;AACrD,SAAO,QAAQ,QAAQ,UAAU,SAAY,aAAa,QAAQ;AACnE;AASA,IAAM,eAAe,aAAW;AAC/B,QAAMC,SAAQ,IAAI,YAAY,QAAQ,KAAK,GAAG;AAC9C,eAAaA,QAAO,OAAO;AAE3B,SAAO,eAAeA,QAAO,YAAY,SAAS;AAElD,SAAOA;AACR;AAEA,SAAS,YAAY,SAAS;AAC7B,SAAO,aAAa,OAAO;AAC5B;AAEA,OAAO,eAAe,YAAY,WAAW,SAAS,SAAS;AAE/D,WAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,mBAAU,GAAG;AAC5D,EAAAC,QAAO,SAAS,IAAI;AAAA,IACnB,MAAM;AACL,YAAM,UAAU,cAAc,MAAM,aAAa,MAAM,MAAM,MAAM,OAAO,KAAK,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC;AACvG,aAAO,eAAe,MAAM,WAAW,EAAC,OAAO,QAAO,CAAC;AACvD,aAAO;AAAA,IACR;AAAA,EACD;AACD;AAEAA,QAAO,UAAU;AAAA,EAChB,MAAM;AACL,UAAM,UAAU,cAAc,MAAM,KAAK,MAAM,GAAG,IAAI;AACtD,WAAO,eAAe,MAAM,WAAW,EAAC,OAAO,QAAO,CAAC;AACvD,WAAO;AAAA,EACR;AACD;AAEA,IAAM,eAAe,CAAC,OAAO,OAAO,SAAS,eAAe;AAC3D,MAAI,UAAU,OAAO;AACpB,QAAI,UAAU,WAAW;AACxB,aAAO,oBAAW,IAAI,EAAE,QAAQ,GAAG,UAAU;AAAA,IAC9C;AAEA,QAAI,UAAU,WAAW;AACxB,aAAO,oBAAW,IAAI,EAAE,QAAQ,oBAAW,aAAa,GAAG,UAAU,CAAC;AAAA,IACvE;AAEA,WAAO,oBAAW,IAAI,EAAE,KAAK,oBAAW,UAAU,GAAG,UAAU,CAAC;AAAA,EACjE;AAEA,MAAI,UAAU,OAAO;AACpB,WAAO,aAAa,OAAO,OAAO,MAAM,GAAG,oBAAW,SAAS,GAAG,UAAU,CAAC;AAAA,EAC9E;AAEA,SAAO,oBAAW,IAAI,EAAE,KAAK,EAAE,GAAG,UAAU;AAC7C;AAEA,IAAM,aAAa,CAAC,OAAO,OAAO,SAAS;AAE3C,WAAW,SAAS,YAAY;AAC/B,EAAAA,QAAO,KAAK,IAAI;AAAA,IACf,MAAM;AACL,YAAM,EAAC,MAAK,IAAI;AAChB,aAAO,YAAa,YAAY;AAC/B,cAAM,SAAS,aAAa,aAAa,OAAO,aAAa,KAAK,GAAG,SAAS,GAAG,UAAU,GAAG,oBAAW,MAAM,OAAO,KAAK,MAAM,CAAC;AAClI,eAAO,cAAc,MAAM,QAAQ,KAAK,QAAQ,CAAC;AAAA,MAClD;AAAA,IACD;AAAA,EACD;AAEA,QAAM,UAAU,OAAO,MAAM,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC;AAC7D,EAAAA,QAAO,OAAO,IAAI;AAAA,IACjB,MAAM;AACL,YAAM,EAAC,MAAK,IAAI;AAChB,aAAO,YAAa,YAAY;AAC/B,cAAM,SAAS,aAAa,aAAa,OAAO,aAAa,KAAK,GAAG,WAAW,GAAG,UAAU,GAAG,oBAAW,QAAQ,OAAO,KAAK,MAAM,CAAC;AACtI,eAAO,cAAc,MAAM,QAAQ,KAAK,QAAQ,CAAC;AAAA,MAClD;AAAA,IACD;AAAA,EACD;AACD;AAEA,IAAM,QAAQ,OAAO,iBAAiB,MAAM;AAAC,GAAG;AAAA,EAC/C,GAAGA;AAAA,EACH,OAAO;AAAA,IACN,YAAY;AAAA,IACZ,MAAM;AACL,aAAO,KAAK,SAAS,EAAE;AAAA,IACxB;AAAA,IACA,IAAI,OAAO;AACV,WAAK,SAAS,EAAE,QAAQ;AAAA,IACzB;AAAA,EACD;AACD,CAAC;AAED,IAAM,eAAe,CAAC,MAAM,OAAO,WAAW;AAC7C,MAAI;AACJ,MAAI;AACJ,MAAI,WAAW,QAAW;AACzB,cAAU;AACV,eAAW;AAAA,EACZ,OAAO;AACN,cAAU,OAAO,UAAU;AAC3B,eAAW,QAAQ,OAAO;AAAA,EAC3B;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAEA,IAAM,gBAAgB,CAAC,MAAM,SAAS,aAAa;AAGlD,QAAM,UAAU,IAAI,eAAe,WAAW,SAAU,WAAW,WAAW,IAAM,KAAK,WAAW,CAAC,IAAK,WAAW,KAAK,GAAG,CAAC;AAI9H,SAAO,eAAe,SAAS,KAAK;AAEpC,UAAQ,SAAS,IAAI;AACrB,UAAQ,MAAM,IAAI;AAClB,UAAQ,QAAQ,IAAI;AAEpB,SAAO;AACR;AAEA,IAAM,aAAa,CAAC,MAAMC,YAAW;AACpC,MAAI,KAAK,SAAS,KAAK,CAACA,SAAQ;AAC/B,WAAO,KAAK,QAAQ,IAAI,KAAKA;AAAA,EAC9B;AAEA,MAAI,SAAS,KAAK,MAAM;AAExB,MAAI,WAAW,QAAW;AACzB,WAAOA;AAAA,EACR;AAEA,QAAM,EAAC,SAAS,SAAQ,IAAI;AAC5B,MAAIA,QAAO,SAAS,MAAQ,GAAG;AAC9B,WAAO,WAAW,QAAW;AAI5B,MAAAA,UAAS,iBAAiBA,SAAQ,OAAO,OAAO,OAAO,IAAI;AAE3D,eAAS,OAAO;AAAA,IACjB;AAAA,EACD;AAKA,QAAM,UAAUA,QAAO,QAAQ,IAAI;AACnC,MAAI,YAAY,IAAI;AACnB,IAAAA,UAAS,+BAA+BA,SAAQ,UAAU,SAAS,OAAO;AAAA,EAC3E;AAEA,SAAO,UAAUA,UAAS;AAC3B;AAEA,OAAO,iBAAiB,YAAY,WAAWD,OAAM;AAErD,IAAM,QAAQ,YAAY;AACnB,IAAM,cAAc,YAAY,EAAC,OAAO,cAAc,YAAY,QAAQ,EAAC,CAAC;AAoBnF,IAAO,iBAAQ;;;AC/Nf,wBAAuB;;;ACkBjB,SAAU,GAAM,OAAQ;AAC7B,SAAO,EAAE,MAAM,MAAM,MAAK;AAC3B;AAEM,SAAU,IAAO,OAAQ;AAC9B,SAAO,EAAE,MAAM,SAAS,MAAK;AAC9B;AAMM,SAAU,KAAQ,QAAsB;AAC7C,SAAO,OAAO,SAAS;AACxB;AAMM,SAAU,MAAS,QAAsB;AAC9C,SAAO,OAAO,SAAS;AACxB;AAMA,eAAsB,UACrB,SAAmB;AAEnB,MAAI;AACH,UAAM,QAAQ,MAAM;AACpB,WAAO,GAAG,KAAK;EAChB,SAAS,GAAQ;AAChB,WAAO,IAAI,CAAC;EACb;AACD;;;AC9BM,IAAO,OAAP,MAAW;EAChB,YACiB,QAIf;AAJe,SAAA,SAAA;EAKd;EAEH,MAAG;AACF,UAAM,SAAS,KAAK,OAAM;AAC1B,WAAO,KAAK,OAAO,OAAO;AAC1B,YAAQ,KAAK,KAAK,OAAO,QAAQ;EAClC;EAEA,SAAM;AACL,UAAM,EAAE,MAAM,SAAS,SAAQ,IAAK,KAAK;AACzC,UAAM,cAAc,eAAM,IACzB,8BAA8B,QAAQ,KAAK,IAAI,GAAG;AAEnD,WAAO,GAAG,OAAO;;EAAO,WAAW;EACpC;EAEQ,SAAM;AACb,QAAI,KAAK,OAAO,SAAS,UAAU;AAClC,aAAO,QAAQ;IAChB;AACA,WAAO,QAAQ;EAChB;;;;AC5CK,SAAU,WACf,OACA,MAGC;AAED,QAAM,SAAmB,CAAA;AAEzB,aAAW,QAAQ,OAAO;AACzB,QAAI,KAAK,SAAS,gBAAgB,KAAK,UAAU,SAAS,KAAK,GAAG,GAAG;AACpE,aAAO,KAAK,IAAI;AAChB;IACD;AAEA,QAAI,KAAK,SAAS,kBAAkB,KAAK,WAAW,QAAQ;AAC3D,iBAAWE,WAAU,KAAK,SAAS;AAClC,YAAI,KAAK,WAAW,SAASA,QAAO,GAAG,GAAG;AACzC,iBAAO,KAAKA,OAAM;QACnB;MACD;IACD;EACD;AAEA,SAAO;AACR;;;ACNM,SAAU,WAAQ;AACvB,SAAO;IACN,MAAM,KAAK,GAAC;AACX,aAAO;IACR;;AAEF;;;ACvBM,SAAU,QACf,MAAO;AAEP,MAAI,OAAO,SAAS,YAAY;AAC/B,WAAO,CAAA;EACR;AACA,SAAO;AACR;AAKM,SAAU,OAAa,GAA4B;AACxD,MAAI,OAAO,MAAM,YAAY;AAC5B,WAAO;EACR;AACA,SAAO,EAAE;AACV;AAYM,SAAU,WAMf,MACA,4BAAoC;AAIpC,QAAM,EACL,cAAc,eACd,WAAW,YACX,MAAM,OACN,GAAG,iBAAgB,IAChB;AACJ,QAAM,WAAW,QAAQ,0BAA0B;AACnD,QAAM,SAAS,OAAO,0BAA0B;AAEhD,SAAO;IACN,GAAG;IACH,GAAG;IACH,MAAM,KAAK,GAAC;AACX,YAAM,WAAW,MAAM,KAAK,KAAK,CAAC;AAClC,aAAO,MAAM,OAAO,QAAQ;IAC7B;;AAEF;;;AC9DO,IAAM,SAA+B;EAC3C,MAAM,KAAK,KAAG;AACb,UAAM,UAAU,OAAO,WAAW,GAAG;AAErC,QAAI,OAAO,MAAM,OAAO,GAAG;AAC1B,YAAM,IAAI,MAAM,cAAc;IAC/B;AACA,WAAO;EACR;EACA,aAAa;EACb,aAAa;;AAMP,IAAM,SAA+B;EAC3C,GAAG,SAAQ;EACX,aAAa;EACb,aAAa;;AAMP,IAAM,UAAkC;EAC9C,GAAG,SAAQ;EACX,aAAa;EACb,aAAa;EACb,eAAY;AACX,WAAO;EACR;;AAMK,SAAU,SACf,GAAI;AAEJ,SAAO;IACN,GAAG;IACH,eAAY;AACX,aAAO;IACR;;AAEF;AAMM,SAAU,MACf,GAAI;AAEJ,SAAO;IACN,GAAG;IACH,MAAM,KAAK,QAAoB;AAC9B,aAAO,QAAQ,IAAI,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,KAAK,CAAC,CAAC;IACxD;;AAEF;;;ACtCO,IAAMC,WAAiC;EAC7C,MAAM,KAAK,KAAG;AACb,QAAI,QAAQ;AAAQ,aAAO;AAC3B,QAAI,QAAQ;AAAS,aAAO;AAC5B,UAAM,IAAI,MACT,wDAAwD,GAAG,GAAG;EAEhE;EACA,aAAa;EACb,cAAc,MAAM;;AAGf,SAAU,SACf,QAA2B;;AAK3B,QAAM,UAAU,WAAWA,UAAS,OAAO,IAAI;AAE/C,SAAO;IACN,cAAa,KAAA,OAAO,iBAAW,QAAA,OAAA,SAAA,KAAI,OAAO,KAAK;IAC/C,aAAU;;AACT,UAAI,QAAQ,KAAK,OAAO,IAAI;AAC5B,UAAI,OAAO,OAAO;AACjB,iBAAS,MAAM,OAAO,KAAK;MAC5B;AACA,YAAM,WAAqB,CAAA;AAE3B,UAAI,OAAO,KAAK;AACf,cAAMC,OACL,QAAQ,IAAI,OAAO,GAAG,MAAM,SACzB,KACA,IAAI,eAAM,OAAO,QAAQ,IAAI,OAAO,GAAG,CAAC,CAAC;AAC7C,iBAAS,KAAK,QAAQ,OAAO,GAAG,GAAGA,IAAG,EAAE;MACzC;AAEA,UAAI,OAAO,cAAc;AACxB,YAAI;AACH,gBAAM,eAAe,OAAO,aAAY;AACxC,cAAI,OAAO,4BAA4B;AACtC,qBAAS,KAAK,YAAY,eAAM,OAAO,YAAY,CAAC,EAAE;UACvD,OAAO;AACN,qBAAS,KAAK,UAAU;UACzB;QACD,SAAS,GAAG;QAAC;MACd,WAAW,OAAO,KAAK,cAAc;AACpC,YAAI;AACH,gBAAM,eAAe,OAAO,KAAK,aAAY;AAC7C,cAAI,OAAO,KAAK,4BAA4B;AAC3C,qBAAS,KAAK,YAAY,eAAM,OAAO,YAAY,CAAC,EAAE;UACvD,OAAO;AACN,qBAAS,KAAK,UAAU;UACzB;QACD,SAAS,GAAG;QAAC;MACd,WAAW,OAAO,aAAa,OAAO,KAAK,WAAW;AACrD,iBAAS,KAAK,UAAU;MACzB;AAEA,aAAO;QACN;UACC,UAAU;UACV;UACA;UACA,cACC,MAAAC,MAAA,OAAO,iBAAW,QAAAA,QAAA,SAAAA,MAAI,OAAO,KAAK,iBAAW,QAAA,OAAA,SAAA,KAAI;;;IAGrD;IACA,SAAS,MAAI;AACZ,WAAK,mBAAmB,IAAI,OAAO,IAAI;AACvC,UAAI,OAAO,OAAO;AACjB,aAAK,oBAAoB,IAAI,OAAO,KAAK;MAC1C;IACD;IACA,MAAM,MAAM,EACX,OACA,aAAY,GACE;;AACd,YAAM,UAAU,WAAW,OAAO;QACjC,WAAW,CAAC,OAAO,IAAI;QACvB,YAAY,OAAO,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAA;OAC5C,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC;AACrC,cAAQ,QAAQ,CAAC,QAAQ,aAAa,IAAI,GAAG,CAAC;AAE9C,UAAI,QAAQ,SAAS,GAAG;AACvB,eAAc,IAAI;UACjB,QAAQ;YACP;cACC,OAAO;cACP,SAAS,6BAA6B,QAAQ,MAAM;;;SAGtD;MACF;AAEA,YAAM,eAAe,OAAO,MAAM,QAAQ,IAAI,OAAO,GAAG,IAAI;AAC5D,YAAM,cAAc,OAAO,aAAa,OAAO,KAAK;AAEpD,UAAI;AACJ,UAAI,YAAY;AAEhB,UAAI,QAAQ,WAAW,KAAK,iBAAiB,QAAW;AACvD,mBAAW;AACX,oBAAY,OAAO,eAAM,OAAO,OAAO,GAAG,CAAC;MAC5C,WAAW,QAAQ,WAAW,KAAK,OAAO,cAAc;AACvD,YAAI;AACH,gBAAM,eAAe,OAAO,aAAY;AACxC,iBAAc,GAAG,YAAY;QAC9B,SAAS,GAAQ;AAChB,gBAAM,UAAU,kCAAkC,OAAO,IAAI,MAAM,EAAE,OAAO;AAC5E,iBAAc,IAAI;YACjB,QAAQ,CAAC,EAAE,SAAS,OAAO,CAAA,EAAE,CAAE;WAC/B;QACF;MACD,WAAW,QAAQ,WAAW,KAAK,aAAa;AAC/C,YAAI;AACH,gBAAM,eAAe,MAAM,YAAW;AACtC,iBAAc,GAAG,YAAY;QAC9B,SAAS,GAAQ;AAChB,gBAAM,UAAU,sCAAsC,OAAO,IAAI,MAAM,EAAE,OAAO;AAChF,iBAAc,IAAI;YACjB,QAAQ,CAAC,EAAE,SAAS,OAAO,CAAA,EAAE,CAAE;WAC/B;QACF;MACD,WAAW,QAAQ,WAAW,KAAK,OAAO,KAAK,cAAc;AAC5D,YAAI;AACH,gBAAM,eAAe,OAAO,KAAK,aAAY;AAC7C,iBAAc,GAAG,YAAY;QAC9B,SAAS,GAAQ;AAChB,gBAAM,UAAU,kCAAkC,OAAO,IAAI,MAAM,EAAE,OAAO;AAC5E,iBAAc,IAAI;YACjB,QAAQ,CAAC,EAAE,SAAS,OAAO,CAAA,EAAE,CAAE;WAC/B;QACF;MACD,WAAW,QAAQ,WAAW,GAAG;AAChC,oBAAW,MAAAA,MAAA,QAAQ,CAAC,EAAE,WAAK,QAAAA,QAAA,SAAA,SAAAA,IAAE,KAAK,SAAG,QAAA,OAAA,SAAA,KAAI;MAC1C,OAAO;AACN,eAAc,IAAI;UACjB,QAAQ;YACP,EAAE,OAAO,CAAA,GAAI,SAAS,2BAA2B,OAAO,IAAI,GAAE;;SAE/D;MACF;AAEA,YAAM,UAAU,MAAa,UAAU,QAAQ,KAAK,QAAQ,CAAC;AAE7D,UAAW,MAAM,OAAO,GAAG;AAC1B,eAAc,IAAI;UACjB,QAAQ;YACP;cACC,OAAO;cACP,SAAS,YAAY,QAAQ,MAAM;;;SAGrC;MACF;AAEA,aAAO;IACR;;AAEF;AAiCM,SAAU,KACf,QAEqC;AAErC,SAAO,SAAS;IACf,MAAM;IACN,GAAG;GACH;AACF;;;AChOO,IAAM,WAAW,KAAK;EAC5B,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;CACb;AAEM,IAAM,cAAc,KAAK;EAC/B,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;CACb;AAEK,SAAU,qBACf,SACA,OACA,SAA2C;AAE3C,MAAW,MAAM,OAAO,GAAG;AAC1B;EACD;AAEA,MAAI,QAAQ,UAAU,QAAQ;AAC7B,UAAM,UAAU,MAAM,UAAU,OAAO;AACvC,UAAM,IAAI,KAAK,EAAE,UAAU,GAAG,SAAS,MAAM,SAAQ,CAAE;EACxD;AACA,MAAI,QAAQ,UAAU,WAAW;AAChC,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,IAAI,KAAK,EAAE,UAAU,GAAG,SAAS,MAAM,SAAQ,CAAE;EACxD;AACD;AAUM,SAAU,qBACf,aAAoB;AAEpB,SAAO;IACN,SAAS,MAAI;AACZ,eAAS,SAAS,IAAI;AACtB,UAAI,aAAa;AAChB,oBAAY,SAAS,IAAI;MAC1B;IACD;IACA,aAAU;AACT,YAAM,aAAa,SAAS,WAAU;AACtC,UAAI,aAAa;AAChB,mBAAW,KAAK,GAAG,YAAY,WAAU,CAAE;MAC5C;AACA,aAAO;IACR;IACA,MAAM,MAAM,SAAO;AAClB,YAAM,OAAO,MAAM,SAAS,MAAM,OAAO;AACzC,YAAM,UAAU,cACb,MAAM,YAAY,MAAM,OAAO,IAC/B;AAEH,UAAW,MAAM,IAAI,KAAM,WAAkB,MAAM,OAAO,GAAI;AAC7D,cAAM,aAAoB,MAAM,IAAI,IAAI,KAAK,MAAM,SAAS,CAAA;AAC5D,cAAM,gBACL,WAAkB,MAAM,OAAO,IAAI,QAAQ,MAAM,SAAS,CAAA;AAC3D,eAAc,IAAI,EAAE,QAAQ,CAAC,GAAG,YAAY,GAAG,aAAa,EAAC,CAAE;MAChE;AAEA,UAAI,KAAK,OAAO;AACf,eAAc,GAAG,MAAM;MACxB;AACA,UAAI,YAAO,QAAP,YAAO,SAAA,SAAP,QAAS,OAAO;AACnB,eAAc,GAAG,SAAS;MAC3B;AACA,aAAc,IAAI;QACjB,QAAQ;UACP;YACC,OAAO,CAAA;YACP,SAAS;;;OAGX;IACF;;AAEF;;;AC3EA,SAAS,eACR,QAAiC;;AAEjC,QAAM,eAAc,MAAA,KAAA,OAAO,iBAAW,QAAA,OAAA,SAAA,KAAI,OAAO,KAAK,iBAAW,QAAA,OAAA,SAAA,KAAI;AAErE,SAAO;IACN,cAAa,KAAA,OAAO,iBAAW,QAAA,OAAA,SAAA,KAAI,OAAO,KAAK;IAC/C,aAAU;;AACT,YAAM,WAAqB,CAAA;AAC3B,YAAM,kBAAiBC,MAAA,OAAO,kBAAY,QAAAA,QAAA,SAAAA,MAAI,OAAO,KAAK;AAE1D,UAAI,gBAAgB;AACnB,YAAI;AACH,gBAAM,eAAe,eAAc;AACnC,eACCC,MAAA,OAAO,gCAA0B,QAAAA,QAAA,SAAAA,MACjC,OAAO,KAAK,4BACX;AACD,qBAAS,KAAK,YAAY,eAAM,OAAO,YAAY,CAAC,EAAE;UACvD,OAAO;AACN,qBAAS,KAAK,UAAU;UACzB;QACD,SAAS,GAAG;QAAC;MACd;AAEA,YAAM,QACL,SAAS,SAAS,IAAI,IAAI,WAAW,MAAM,IAAI,WAAW;AAE3D,aAAO;QACN;UACC,UAAU;UACV;UACA,cACC,MAAAC,MAAA,OAAO,iBAAW,QAAAA,QAAA,SAAAA,MAAI,OAAO,KAAK,iBAAW,QAAA,OAAA,SAAA,KAAI;UAClD;;;IAGH;IACA,SAAS,OAAK;IAAG;IACjB,MAAM,MAAM,EACX,OACA,aAAY,GACE;;AACd,YAAM,cAAc,MAAM,OACzB,CAAC,SACA,KAAK,SAAS,wBAAwB,CAAC,aAAa,IAAI,IAAI,CAAC;AAG/D,YAAM,kBAAiBF,MAAA,OAAO,kBAAY,QAAAA,QAAA,SAAAA,MAAI,OAAO,KAAK;AAE1D,YAAMG,cAAa,YAAY,CAAC;AAEhC,UAAI,CAACA,aAAY;AAChB,YAAI,gBAAgB;AACnB,iBAAc,GAAG,eAAc,CAAE;QAClC;AACA,eAAc,IAAI;UACjB,QAAQ;YACP;cACC,OAAO,CAAA;cACP,SAAS,yBAAyB,WAAW;;;SAG/C;MACF;AAEA,mBAAa,IAAIA,WAAU;AAC3B,YAAM,UAAU,MAAa,UAAU,OAAO,KAAK,KAAKA,YAAW,GAAG,CAAC;AAEvE,UAAW,MAAM,OAAO,GAAG;AAC1B,eAAc,IAAI;UACjB,QAAQ;YACP;cACC,OAAO,CAACA,WAAU;cAClB,SAAS,QAAQ,MAAM;;;SAGzB;MACF;AAEA,aAAc,GAAG,QAAQ,KAAK;IAC/B;;AAEF;AAkBM,SAAU,WACf,QAAiE;AAEjE,SAAO,eAAe;IACrB,MAAM;IACN,GAAG;GACH;AACF;;;AT/FM,SAAU,YAKd,QAKD;AAIA,QAAM,iBAAiB,qBAAqB,CAAC,CAAC,OAAO,OAAO;AAC5D,QAAM,OAAqC;IAC1C,MAAM,KAAK,KAAG;AACb,YAAM,WAAW,OAAO,QAAQ,OAAO,IAAI,EAAE,IAAI,CAAC,CAAC,MAAMC,IAAG,MAAK;;AAChE,eAAO;UACN,SAAS;UACT,OAAO,CAAC,MAAM,IAAI,KAAAA,KAAI,aAAO,QAAA,OAAA,SAAA,KAAI,CAAA,CAAG;;MAEtC,CAAC;AACD,YAAM,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,MAAM,SAAS,GAAG,CAAC;AACtD,UAAI,KAAK;AACR,eAAO,IAAI;MACZ;AACA,UAAI,eAAe;AAEnB,YAAM,mBAAe,kBAAAC,SACpB,KACA,QAAQ,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC;AAElC,UAAI,cAAc;AACjB,cAAMC,UAAS,MAAM,QAAQ,YAAY,IACtC,aAAa,CAAC,IACd;AACH,wBAAgB;eAAkB,eAAM,OAAOA,OAAM,CAAC;MACvD;AAEA,YAAM,IAAI,MAAM,YAAY;IAC7B;;AAGD,QAAM,aAAa,WAAW;IAC7B,aAAa;IACb,aAAa,UAAU,OAAO,KAAK,OAAO,IAAI,EAAE,KAAK,IAAI,CAAC;IAC1D;GACA;AAED,WAAS,iBAAiB,SAAqB;;AAC9C,UAAI,KAAA,QAAQ,aAAO,QAAA,OAAA,SAAA,SAAA,GAAE,YAAW,GAAG;AAClC,cAAQ,QAAQ,KAAK,OAAO,IAAI;IACjC;AAGA,QAAI,CAAC,QAAQ,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,aAAa,IAAI,CAAC,CAAC,GAAG;AAC7D,cAAQ,MAAM,KAAK;QAClB,MAAM;QACN,OAAO;QACP,KAAK;QACL,KAAK;OACL;IACF;EACD;AAEA,SAAO;IACN,SAAS,OAAO;IAChB,aAAa,OAAO;IACpB,MAAM,OAAO;IACb,SAAS,CAAC,UAAS;AAClB,YAAM,MAAM,OAAO,KAAK,MAAM,OAAO;AACrC,aAAO,IAAI,QAAQ,MAAM,IAAI;IAC9B;IACA,SAAS,MAAI;AACZ,iBAAW,OAAO,OAAO,OAAO,OAAO,IAAI,GAAG;AAC7C,YAAI,SAAS,IAAI;MAClB;AACA,qBAAe,SAAS,IAAI;IAC7B;IACA,UAAU,SAAO;;AAChB,YAAM,QAAkB,CAAA;AACxB,YAAM,aAAY,MAAA,KAAA,QAAQ,aAAO,QAAA,OAAA,SAAA,SAAA,GAAE,KAAK,GAAG,OAAC,QAAA,OAAA,SAAA,KAAI;AAEhD,YAAM,KAAK,eAAM,KAAK,YAAY,eAAM,OAAO,eAAe,CAAC,CAAC;AAEhE,UAAI,OAAO,aAAa;AACvB,cAAM,KAAK,eAAM,IAAI,IAAI,IAAI,OAAO,WAAW;MAChD;AAEA,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,SAAS,eAAM,OAAO,cAAc,CAAC,iBAAiB;AACjE,YAAM,KAAK,EAAE;AAEb,iBAAW,OAAO,OAAO,KAAK,OAAO,IAAI,GAAG;AAC3C,cAAM,MAAM,OAAO,KAAK,GAAG;AAC3B,YAAI,eAAc,KAAA,IAAI,iBAAW,QAAA,OAAA,SAAA,KAAI;AACrC,sBAAc,eAAe,MAAM,WAAW;AAC9C,aAAI,KAAA,IAAI,aAAO,QAAA,OAAA,SAAA,SAAA,GAAE,QAAQ;AACxB,gBAAM,WAAW,IAAI,QAAQ,WAAW,IAAI,UAAU;AACtD,gBAAM,UAAU,IAAI,QAAQ,KAAK,IAAI;AACrC,yBAAe,eAAM,IAAI,IAAI,QAAQ,KAAK,OAAO,GAAG;QACrD;AACA,cAAM,MAAM,eAAM,IAAI,IAAI,IAAI,MAAM;AACpC,cAAM,KAAK,IAAI,KAAI,CAAE;MACtB;AAEA,YAAM,cAAc,eAAM,OAAO,GAAG,SAAS,sBAAsB;AAEnE,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,eAAM,IAAI,gCAAgC,WAAW,IAAI,CAAC;AACrE,aAAO,MAAM,KAAK,IAAI;IACvB;IACA,MAAM,MACL,SAAqB;;AAErB,uBAAiB,OAAO;AACxB,YAAM,SAAS,MAAM,WAAW,MAAM,OAAO;AAE7C,UAAW,MAAM,MAAM,GAAG;AACzB,eAAc,IAAI;UACjB,QAAQ,OAAO,MAAM;UACrB,cAAc,CAAA;SACd;MACF;AAEA,OAAA,KAAA,QAAQ,aAAO,QAAA,OAAA,SAAA,SAAA,GAAE,KAAK,OAAO,KAAe;AAE5C,YAAM,MAAM,OAAO,KAAK,OAAO,KAAK;AACpC,YAAM,gBAAgB,MAAM,IAAI,MAAM,OAAO;AAC7C,UAAW,MAAM,aAAa,GAAG;AAChC,eAAc,IAAI;UACjB,QAAQ,cAAc,MAAM;UAC5B,cAAc;YACb,SAAS,OAAO;YAChB,MAAM,cAAc,MAAM;;SAE3B;MACF;AACA,aAAc,GAAG;QAChB,MAAM,cAAc;QACpB,SAAS,OAAO;OAChB;IACF;IACA,MAAM,IAAI,SAAO;;AAChB,uBAAiB,OAAO;AACxB,YAAM,mBAAmB,MAAM,WAAW,MAAM,OAAO;AAEvD,UAAW,MAAM,gBAAgB,GAAG;AACnC,cAAM,UAAU,MAAM,eAAe,MAAM,OAAO;AAClD,6BAAqB,SAAS,MAAM,OAAO;AAE3C,eAAc,IAAI,EAAE,GAAG,iBAAiB,OAAO,cAAc,CAAA,EAAE,CAAE;MAClE;AAEA,OAAA,KAAA,QAAQ,aAAO,QAAA,OAAA,SAAA,SAAA,GAAE,KAAK,iBAAiB,KAAe;AAEtD,YAAM,MAAM,OAAO,KAAK,iBAAiB,KAAK;AAC9C,YAAM,aAAa,MAAM,IAAI,IAAI,OAAO;AAExC,UAAW,KAAK,UAAU,GAAG;AAC5B,eAAc,GAAG;UAChB,SAAS,iBAAiB;UAC1B,OAAO,WAAW;SAClB;MACF;AAEA,aAAc,IAAI;QACjB,GAAG,WAAW;QACd,cAAc;UACb,SAAS,iBAAiB;UAC1B,OAAO,WAAW,MAAM;;OAEzB;IACF;;AAEF;AAEA,SAAS,QAAcC,QAAY,GAAgB;AAClD,QAAM,KAAU,CAAA;AAChB,aAAW,QAAQA,QAAO;AACzB,OAAG,KAAK,GAAG,EAAE,IAAI,CAAC;EACnB;AACA,SAAO;AACR;;;AUjNM,SAAU,OACf,KAAY;AAEZ,SAAO;IACN,GAAG;IACH,IAAI,SAAqB;;AACxB,YAAM,OAAO,IAAI,QAAQ,QAAQ,MAAM,CAAC,EAAE;AAC1C,OAAA,KAAA,QAAQ,aAAO,QAAA,OAAA,SAAA,SAAA,GAAE,KAAK,IAAI;AAC1B,cAAQ,MAAM,OAAO,GAAG,CAAC;AACzB,cAAQ,MAAM,CAAC,EAAE,MAAM;AACvB,cAAQ,aAAa,IAAI,QAAQ,MAAM,CAAC,CAAC;AACzC,aAAO,IAAI,IAAI,OAAO;IACvB;;AAEF;;;ACvBe,SAAR,UAA2B,EAAC,YAAY,MAAK,IAAI,CAAC,GAAG;AAE3D,QAAM,KAAK;AAGX,QAAM,MAAM,0BAA0B,EAAE;AAGxC,QAAM,MAAM;AAEZ,QAAM,UAAU,GAAG,GAAG,IAAI,GAAG;AAE7B,SAAO,IAAI,OAAO,SAAS,YAAY,SAAY,GAAG;AACvD;;;ACXA,IAAM,QAAQ,UAAU;AAET,SAAR,UAA2BC,SAAQ;AACzC,MAAI,OAAOA,YAAW,UAAU;AAC/B,UAAM,IAAI,UAAU,gCAAgC,OAAOA,OAAM,IAAI;AAAA,EACtE;AAKA,SAAOA,QAAO,QAAQ,OAAO,EAAE;AAChC;;;ACRM,SAAU,UACf,KACA,QACA,OAAsB;AAEtB,QAAM,YAAY,UAAU,GAAG;AAC/B,MAAI,SAAS,UAAU;AAAQ,WAAO;AACtC,QAAM,MAAM,MAAM,SAAS,UAAU,SAAS,CAAC,EAAE,KAAK,GAAG;AACzD,MAAI,UAAU,OAAO;AACpB,WAAO,MAAM;EACd;AACA,SAAO,MAAM;AACd;AAOM,SAAU,QACf,MACA,GAAc;;AAEd,QAAM,SAAS,CAAA;AACf,aAAW,OAAO,MAAM;AACvB,UAAM,MAAM,EAAE,GAAG;AACjB,WAAO,GAAG,KAAI,KAAA,OAAO,GAAG,OAAC,QAAA,OAAA,SAAA,KAAI,CAAA;AAC7B,WAAO,GAAG,EAAE,KAAK,GAAG;EACrB;AACA,SAAO;AACR;AAOM,SAAU,QACf,KAAQ;AAER,SAAO,OAAO,QAAQ,GAAG;AAC1B;AAOM,UAAW,UAAa,KAAQ;AACrC,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACpC,UAAM,CAAC,GAAG,IAAI,CAAC,CAAC;EACjB;AACD;AAOM,SAAUC,SAAc,IAAS,IAAiB;AACvD,QAAM,UAAe,CAAA;AACrB,aAAW,KAAK,IAAI;AACnB,YAAQ,KAAK,GAAG,GAAG,CAAC,CAAC;EACtB;AACA,SAAO;AACR;;;ACvBM,SAAU,QAIf,QAAyC;AAOzC,QAAM,aAAa,QAAQ,OAAO,IAAI;AACtC,QAAM,iBAAiB,qBAAqB,CAAC,CAAC,OAAO,OAAO;AAE5D,SAAO;IACN,MAAM,OAAO;IACb,SAAS,OAAO;IAChB,SAAS,OAAO;IAChB,aAAa,OAAO;IACpB,SAAS,OAAO;IAChB,aAAU;AACT,aAAOC,SACN,OAAO,OAAO,OAAO,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,GAClD,CAAC,MAAK;AAAA,YAAA,IAAA;AAAC,gBAAA,MAAA,KAAA,EAAE,gBAAU,QAAA,OAAA,SAAA,SAAA,GAAA,KAAA,CAAA,OAAI,QAAA,OAAA,SAAA,KAAI,CAAA;MAAE,CAAA;IAE/B;IACA,UAAU,SAAO;;AAChB,YAAM,QAAkB,CAAA;AACxB,UAAI,QAAO,MAAA,KAAA,QAAQ,aAAO,QAAA,OAAA,SAAA,SAAA,GAAE,KAAK,GAAG,OAAC,QAAA,OAAA,SAAA,KAAI;AACzC,UAAI,CAAC,MAAM;AACV,eAAO,OAAO;MACf;AAEA,aAAO,eAAM,KAAK,IAAI;AAEtB,UAAI,OAAO,SAAS;AACnB,gBAAQ,IAAI,eAAM,IAAI,OAAO,OAAO,CAAC;MACtC;AAEA,YAAM,KAAK,IAAI;AAEf,UAAI,OAAO,aAAa;AACvB,cAAM,KAAK,eAAM,IAAI,IAAI,IAAI,OAAO,WAAW;MAChD;AAEA,YAAM,iBAAiB,QAAQ,KAAK,WAAU,GAAI,CAAC,MAAM,EAAE,QAAQ;AAEnE,iBAAW,CAAC,UAAU,UAAU,KAAK,QAAQ,cAAc,GAAG;AAC7D,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,GAAG,SAAS,YAAW,CAAE,GAAG;AACvC,cAAM,cAAc,WAAW,OAAO,CAAC,KAAK,SAAQ;AACnD,iBAAO,KAAK,IAAI,KAAK,KAAK,MAAM,MAAM;QACvC,GAAG,CAAC;AACJ,mBAAW,aAAa,YAAY;AACnC,cAAI,OAAO;AACX,kBAAQ,KAAK,UAAU,UAAU,OAAO,aAAa,KAAK,CAAC;AAC3D,kBAAQ;AACR,kBAAQ,UAAU;AAClB,qBAAW,gBAAgB,UAAU,UAAU;AAC9C,oBAAQ,eAAM,IAAI,KAAK,YAAY,GAAG;UACvC;AACA,gBAAM,KAAK,IAAI;QAChB;MACD;AAEA,aAAO,MAAM,KAAK,IAAI;IACvB;IACA,SAAS,MAAI;;AACZ,iBAAW,CAAC,EAAE,GAAG,KAAK,YAAY;AACjC,SAAA,KAAA,IAAI,cAAQ,QAAA,OAAA,SAAA,SAAA,GAAA,KAAA,KAAG,IAAI;MACpB;IACD;IACA,MAAM,MACL,SAAqB;;AAErB,YAAI,KAAA,QAAQ,aAAO,QAAA,OAAA,SAAA,SAAA,GAAE,YAAW,GAAG;AAClC,gBAAQ,QAAQ,KAAK,OAAO,IAAI;MACjC;AAEA,YAAM,eAAe,CAAA;AACrB,YAAM,SAAyB,CAAA;AAE/B,iBAAW,CAAC,SAAS,GAAG,KAAK,YAAY;AACxC,cAAM,SAAS,MAAM,IAAI,MAAM,OAAO;AACtC,YAAW,MAAM,MAAM,GAAG;AACzB,iBAAO,KAAK,GAAG,OAAO,MAAM,MAAM;QACnC,OAAO;AACN,uBAAa,OAAO,IAAI,OAAO;QAChC;MACD;AAEA,YAAM,mBAA8B,CAAA;AACpC,iBAAW,QAAQ,QAAQ,OAAO;AACjC,YAAI,QAAQ,aAAa,IAAI,IAAI,GAAG;AACnC;QACD;AAEA,YAAI,KAAK,SAAS,mBAAmB;QACrC,WAAW,KAAK,SAAS,gBAAgB;AACxC,qBAAWC,WAAU,KAAK,SAAS;AAClC,gBAAI,QAAQ,aAAa,IAAIA,OAAM,GAAG;AACrC;YACD;AACA,6BAAiB,KAAKA,OAAM;UAC7B;QACD,OAAO;AACN,2BAAiB,KAAK,IAAI;QAC3B;MACD;AAEA,UAAI,iBAAiB,SAAS,GAAG;AAChC,eAAO,KAAK;UACX,SAAS;UACT,OAAO;SACP;MACF;AAEA,UAAI,OAAO,SAAS,GAAG;AACtB,eAAc,IAAI;UACjB;UACA,cAAc;SACd;MACF;AACA,aAAc,GAAG,YAAY;IAC9B;IACA,MAAM,IAAI,SAAO;AAChB,YAAM,UAAU,MAAM,eAAe,MAAM,OAAO;AAClD,2BAAqB,SAAS,MAAM,OAAO;AAC3C,YAAM,SAAS,MAAM,KAAK,MAAM,OAAO;AAEvC,UAAW,MAAM,MAAM,GAAG;AACzB,eAAc,IAAI,OAAO,KAAK;MAC/B;AAEA,aAAc,GAAG,MAAM,KAAK,QAAQ,OAAO,KAAK,CAAC;IAClD;;AAEF;;;AC7JA,SAAS,WACR,QAA6B;;AAE7B,SAAO;IACN,cAAa,KAAA,OAAO,iBAAW,QAAA,OAAA,SAAA,KAAI,OAAO,KAAK;IAC/C,aAAU;;AACT,YAAM,eAAcC,MAAA,OAAO,KAAK,iBAAW,QAAAA,QAAA,SAAAA,MAAI;AAC/C,UAAI,QAAQ,KAAK,OAAO,IAAI;AAC5B,UAAI,OAAO,OAAO;AACjB,iBAAS,MAAM,OAAO,KAAK;MAC5B;AACA,eAAS,KAAK,WAAW;AAEzB,YAAM,WAAqB,CAAA;AAE3B,UAAI,OAAO,KAAK;AACf,cAAMC,OACL,QAAQ,IAAI,OAAO,GAAG,MAAM,SACzB,KACA,IAAI,eAAM,OAAO,QAAQ,IAAI,OAAO,GAAG,CAAC,CAAC;AAC7C,iBAAS,KAAK,QAAQ,OAAO,GAAG,GAAGA,IAAG,EAAE;MACzC;AAEA,UAAI,OAAO,cAAc;AACxB,YAAI;AACH,gBAAM,eAAe,OAAO,aAAY;AACxC,cAAI,OAAO,4BAA4B;AACtC,qBAAS,KAAK,YAAY,eAAM,OAAO,YAAY,CAAC,EAAE;UACvD,OAAO;AACN,qBAAS,KAAK,UAAU;UACzB;QACD,SAAS,GAAG;QAAC;MACd,WAAW,OAAO,KAAK,cAAc;AACpC,YAAI;AACH,gBAAM,eAAe,OAAO,KAAK,aAAY;AAC7C,cAAI,OAAO,KAAK,4BAA4B;AAC3C,qBAAS,KAAK,YAAY,eAAM,OAAO,YAAY,CAAC,EAAE;UACvD,OAAO;AACN,qBAAS,KAAK,UAAU;UACzB;QACD,SAAS,GAAG;QAAC;MACd,WAAW,OAAO,aAAa,OAAO,KAAK,WAAW;AACrD,iBAAS,KAAK,UAAU;MACzB;AAEA,aAAO;QACN;UACC,UAAU;UACV;UACA;UACA,cACC,MAAA,KAAA,OAAO,iBAAW,QAAA,OAAA,SAAA,KAAI,OAAO,KAAK,iBAAW,QAAA,OAAA,SAAA,KAAI;;;IAGrD;IACA,SAAS,MAAI;AACZ,WAAK,qBAAqB,IAAI,OAAO,IAAI;AACzC,UAAI,OAAO,OAAO;AACjB,aAAK,sBAAsB,IAAI,OAAO,KAAK;MAC5C;IACD;IACA,MAAM,MAAM,EACX,OACA,aAAY,GACE;AACd,YAAM,UAAU,WAAW,OAAO;QACjC,WAAW,CAAC,OAAO,IAAI;QACvB,YAAY,OAAO,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAA;OAC5C,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC;AAErC,cAAQ,QAAQ,CAAC,QAAQ,aAAa,IAAI,GAAG,CAAC;AAE9C,UAAI,QAAQ,SAAS,GAAG;AACvB,cAAM,QAAsB;UAC3B,SAAS,6CAA6C,QAAQ,MAAM;UACpE,OAAO;;AAER,eAAc,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAC,CAAE;MACtC;AAEA,YAAM,eAAe,OAAO,MAAM,QAAQ,IAAI,OAAO,GAAG,IAAI;AAC5D,YAAM,iBAAiB,OAAO,gBAAgB,OAAO,KAAK;AAC1D,YAAM,cAAc,OAAO,aAAa,OAAO,KAAK;AAEpD,YAAMC,UAAS,QAAQ,CAAC;AACxB,UAAI;AACJ,UAAI,YAAY;AAChB,UAAIA,YAAM,QAANA,YAAM,SAAA,SAANA,QAAQ,OAAO;AAClB,mBAAWA,QAAO,MAAM,KAAK;MAC9B,WAAW,iBAAiB,QAAW;AACtC,mBAAW;AACX,oBAAY,OAAO,eAAM,OAAO,OAAO,GAAG,CAAC;MAC5C,WAAW,gBAAgB;AAC1B,YAAI;AACH,gBAAM,eAAe,eAAc;AACnC,iBAAc,GAAG,YAAY;QAC9B,SAAS,GAAQ;AAChB,gBAAM,UAAU,kCAAkC,OAAO,IAAI,MAAM,EAAE,OAAO;AAC5E,iBAAc,IAAI;YACjB,QAAQ;cACP;gBACC,OAAO,CAAA;gBACP;;;WAGF;QACF;MACD,WAAW,aAAa;AACvB,YAAI;AACH,gBAAM,eAAe,MAAM,YAAW;AACtC,iBAAc,GAAG,YAAY;QAC9B,SAAS,GAAQ;AAChB,gBAAM,UAAU,sCAAsC,OAAO,IAAI,MAAM,EAAE,OAAO;AAChF,iBAAc,IAAI;YACjB,QAAQ;cACP;gBACC,OAAO,CAAA;gBACP;;;WAGF;QACF;MACD,OAAO;AAEN,cAAM,OACLA,YAAM,QAANA,YAAM,SAAA,SAANA,QAAQ,UAAS,gBACd,IAAIA,YAAM,QAANA,YAAM,SAAA,SAANA,QAAQ,GAAG,KACf,KAAK,OAAO,IAAI;AACpB,eAAc,IAAI;UACjB,QAAQ;YACP;cACC,OAAO;cACP,SAAS,yBAAyB,GAAG;;;SAGvC;MACF;AAEA,YAAM,UAAU,MAAa,UAAU,OAAO,KAAK,KAAK,QAAQ,CAAC;AACjE,UAAW,MAAM,OAAO,GAAG;AAC1B,eAAc,IAAI;UACjB,QAAQ;YACP,EAAE,OAAO,SAAS,SAAS,YAAY,QAAQ,MAAM,QAAO;;SAE7D;MACF;AAEA,aAAc,GAAG,QAAQ,KAAK;IAC/B;;AAEF;AA8BM,SAAU,OACf,QAEyC;AAEzC,SAAO,WAAW;IACjB,MAAM;IACN,GAAG;GACH;AACF;;;ACzMA,SAAS,UACR,OACA,OAAmB;AAEnB,QAAM,UAAoB,CAAA;AAC1B,MAAI,aAAiC;AAErC,WAAS,aAAU;AAClB,QAAI,eAAe;AAAW;AAC9B,iBAAa,UAAU,QAAQ,KAAK,GAAG,CAAC,EAAE;EAC3C;AAEA,MAAI,MAAM,MAAM,WAAW;AAAG;AAE9B,QAAM,QAAQ,CAAC,SAAQ;AACtB,QAAI,MAAM,MAAM,SAAS,IAAI,GAAG;AAC/B,iBAAU;AACV,aAAO,QAAQ,KAAK,eAAM,IAAI,KAAK,GAAG,CAAC;IACxC;AACA,QAAI,KAAK,SAAS,gBAAgB;AACjC,UAAI,SAAS;AACb,UAAI,IAAI;AACR,iBAAWC,WAAU,KAAK,SAAS;AAClC,YAAI,MAAM,MAAM,SAASA,OAAM,GAAG;AACjC,eAAK,eAAM,IAAIA,QAAO,GAAG;AACzB,mBAAS;QACV,OAAO;AACN,eAAK,eAAM,IAAIA,QAAO,GAAG;QAC1B;MACD;AACA,YAAM,SAAS,SAAS,eAAM,IAAI,GAAG,IAAI,eAAM,IAAI,GAAG;AACtD,UAAI,QAAQ;AACX,mBAAU;MACX;AACA,aAAO,QAAQ,KAAK,SAAS,CAAC;IAC/B;AAEA,WAAO,QAAQ,KAAK,eAAM,IAAI,KAAK,GAAG,CAAC;EACxC,CAAC;AAED,SAAO,EAAE,WAAW,QAAQ,KAAK,GAAG,GAAG,YAAY,eAAU,QAAV,eAAU,SAAV,aAAc,EAAC;AACnE;AAOM,SAAU,SACf,OACA,QACA,aAAqB;AAErB,QAAM,gBACL,CAAA;AAED,QAAM,gBAA0B,CAAA;AAEhC,aAAW,SAAS,QAAQ;AAC3B,UAAM,cAAc,UAAU,OAAO,KAAK;AAC1C,kBAAc,KAAK,EAAE,SAAS,MAAM,SAAS,YAAW,CAAE;EAC3D;AAEA,MAAIC,UAAS;AACb,QAAM,iBAAiB,OAAO,cAAc,MAAM,EAAE;AAEpD,gBAAc,KACb,GAAG,eAAM,IAAI,KAAK,SAAS,CAAC,SAAS,eAAM,OAAO,cAAc,MAAM,CAAC,SAAS,cAAc,SAAS,IAAI,MAAM,EAAE,EAAE;AAEtH,gBAAc,KAAK,EAAE;AAErB,gBACE,OAAO,CAAC,MAAM,EAAE,WAAW,EAC3B,QAAQ,CAAC,MAAK;AACd,QAAI,CAAC,EAAE,aAAa;AACnB,YAAM,IAAI,MAAM,MAAM;IACvB;AAEA,UAAM,MAAM,GAAG,SAAS,EAAE,YAAY,UAAU;AAEhD,kBAAc,KAAK,KAAK,EAAE,YAAY,SAAS,EAAE;AACjD,eAAW,CAAC,OAAO,IAAI,KAAK,UAAU,EAAE,QAAQ,MAAM,IAAI,CAAC,GAAG;AAC7D,YAAM,SAAS,UAAU,IAAI,eAAM,KAAK,GAAG,IAAI;AAC/C,YAAM,MAAM,eAAM,IAAI,KAAK,GAAG,IAAI,MAAM,IAAI,IAAI,EAAE;AAClD,oBAAc,KAAK,GAAG;IACvB;AACA,kBAAc,KAAK,EAAE;AACrB,IAAAA;EACD,CAAC;AAEF,QAAM,kBAAkB,cAAc,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW;AAElE,MAAIA,UAAS,GAAG;AACf,QAAI,gBAAgB,WAAW,GAAG;AACjC,oBAAc,KAAK,iCAAiC;IACrD,WAAW,gBAAgB,SAAS,GAAG;AACtC,oBAAc,KAAK,kCAAkC;IACtD;EACD;AAEA,kBAAgB,QAAQ,CAAC,EAAE,QAAO,MAAM;AACvC,UAAM,MAAM,eAAM,IAAI,KACrB,GAAG,UAAUA,QAAO,SAAQ,GAAI,gBAAgB,OAAO,CAAC,GAAG;AAE5D,kBAAc,KAAK,KAAK,GAAG,IAAI,eAAM,IAAI,OAAO,CAAC,EAAE;AACnD,IAAAA;EACD,CAAC;AAED,QAAM,UAAU,eAAM,OAAO,GAAG,YAAY,KAAK,GAAG,CAAC,SAAS;AAE9D,gBAAc,KAAK,EAAE;AACrB,gBAAc,KACb,GAAG,eAAM,IAAI,KAAK,QAAQ,CAAC,8BAA8B,OAAO,GAAG;AAGpE,SAAO,cAAc,KAAK,IAAI;AAC/B;;;ACnIA,mBAA2B;AAI3B,IAAM,YAAQ,aAAAC,SAAe,eAAe;AAmDtC,SAAU,MAAM,QAAiB,WAA0B;AAChE,MAAI,MAAM,SAAS;AAClB,UAAM,aAAa;MAClB,YAAY,CAAC,GAAG,UAAU,mBAAmB;MAC7C,WAAW,CAAC,GAAG,UAAU,kBAAkB;MAC3C,cAAc,CAAC,GAAG,UAAU,qBAAqB;MACjD,aAAa,CAAC,GAAG,UAAU,oBAAoB;;AAEhD,UAAM,eAAe,KAAK,UAAU,UAAU,CAAC;EAChD;AAEA,QAAM,QAAmB,CAAA;AACzB,MAAI,QAAQ;AACZ,MAAI,mBAAmB;AAEvB,WAAS,WAAQ;AAChB,WAAO,OAAO,OAAO;EACtB;AAEA,WAAS,YAAS;AACjB,WAAO,OAAO,KAAK;EACpB;AAEA,SAAO,QAAQ,OAAO,QAAQ;AAC7B,UAAM,eAAe,SAAQ;AAC7B,QAAI,CAAC;AAAc;AAEnB,QAAI,aAAa,SAAS,mBAAmB;AAC5C;IACD;AAEA,QAAI,kBAAkB;AACrB,UAAI,MAAM,aAAa;AACvB,UAAI,YAAY,SAAQ;AACxB,aAAO,cAAa,cAAS,QAAT,cAAS,SAAA,SAAT,UAAW,UAAS,mBAAmB;AAC1D,eAAO,UAAU;AACjB,oBAAY,SAAQ;MACrB;AACA,YAAM,KAAK;QACV,MAAM;QACN,OAAO,aAAa;QACpB,KAAK;OACL;AACD;IACD;AAEA,QAAI,aAAa,SAAS,QAAQ;AACjC,UAAI,MAAM,aAAa;AACvB,UAAI,YAAY,SAAQ;AACxB,aAAO,cAAa,cAAS,QAAT,cAAS,SAAA,SAAT,UAAW,UAAS,mBAAmB;AAC1D,eAAO,UAAU;AACjB,oBAAY,SAAQ;MACrB;AACA,YAAM,KAAK;QACV,MAAM;QACN,OAAO,aAAa;QACpB,KAAK;OACL;AACD;IACD;AAEA,QAAI,aAAa,SAAS,cAAc;AACvC,UAAI,YAAY,SAAQ;AAExB,WAAI,cAAS,QAAT,cAAS,SAAA,SAAT,UAAW,UAAS,qBAAqB,CAAC,WAAW;AACxD,cAAM,KAAK;UACV,MAAM;UACN,OAAO,aAAa;UACpB,KAAK;SACL;AACD,2BAAmB;AACnB;MACD;AAEA,UAAI,MAAM;AACV,aACC,cACA,cAAS,QAAT,cAAS,SAAA,SAAT,UAAW,SAAQ,QACnB,cAAS,QAAT,cAAS,SAAA,SAAT,UAAW,UAAS,mBACnB;AACD,eAAO,UAAU;AACjB,oBAAY,SAAQ;MACrB;AAEA,YAAM,cAAc,iBAAiB;QACpC;QACA,gBAAgB;QAChB,WAAW,UAAU;QACrB;QACA;QACA,aAAa,UAAU;OACvB;AACD,UAAI,MAAM,KAAK,GAAG;AAElB,UAAI,aAAa;AAChB,eAAO,YAAY;MACpB;AAEA,YAAM,KAAK;QACV,MAAM;QACN;QACA,OAAO,aAAa;QACpB;QACA,OAAO;OACP;AACD;IACD;AAEA,QAAI,aAAa,SAAS,eAAe;AACxC,YAAM,OAAgB,CAAA;AACtB,UAAI,YAAY,SAAQ;AAExB,WAAI,cAAS,QAAT,cAAS,SAAA,SAAT,UAAW,UAAS,qBAAqB,CAAC,WAAW;AACxD,cAAM,KAAK;UACV,MAAM;UACN,OAAO,aAAa;UACpB,KAAK;SACL;AACD;MACD;AAEA,aACC,cACA,cAAS,QAAT,cAAS,SAAA,SAAT,UAAW,UAAS,sBACpB,cAAS,QAAT,cAAS,SAAA,SAAT,UAAW,SAAQ,KAClB;AACD,aAAK,KAAK,SAAS;AACnB,oBAAY,SAAQ;MACrB;AAGA,YAAM,UAAU,KAAK,IAAG;AACxB,YAAM,cAAc,iBAAiB;QACpC,KAAK,QAAQ;QACb,gBAAgB;QAChB,WAAW,UAAU;QACrB,aAAa,UAAU;QACvB;QACA;OACA;AAED,YAAM,UAAyB,CAAA;AAE/B,iBAAW,OAAO,MAAM;AACvB,gBAAQ,KAAK;UACZ,MAAM;UACN,OAAO,IAAI;UACX,KAAK,IAAI;UACT,KAAK,IAAI;SACT;MACF;AAEA,UAAI,aAAa,QAAQ;AAEzB,UAAI,aAAa;AAChB,sBAAc,YAAY;MAC3B;AAEA,cAAQ,KAAK;QACZ,MAAM;QACN,OAAO,QAAQ;QACf,KAAK;QACL,OAAO;QACP,KAAK,QAAQ;OACb;AAED,UAAI,aAAa,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,QAAQ,GAAG;AAClE,UAAI,aAAa;AAChB,sBAAc,YAAY;MAC3B;AAEA,YAAM,eAA6B;QAClC,MAAM;QACN,OAAO,aAAa;QACpB,KAAK;QACL;;AAGD,YAAM,KAAK,YAAY;AACvB;IACD;AAEA;EACD;AAEA,MAAI,MAAM,SAAS;AAClB,UAAM,cAAc,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,IAAG,EAAG;AACnE,UAAM,iBAAiB,KAAK,UAAU,WAAW,CAAC;EACnD;AAEA,SAAO;AACR;AAEA,SAAS,iBAAiB,MAOzB;;AACA,QAAM,EAAE,UAAU,gBAAgB,WAAW,KAAK,YAAW,IAAK;AAClE,QAAM,wBAAwB,YAAY,IAAI,GAAG;AACjD,QAAM,sBACL,CAAC,0BACA,UAAU,IAAI,GAAG,OAAK,KAAA,KAAK,UAAS,OAAE,QAAA,OAAA,SAAA,SAAA,GAAE,UAAS;AAEnD,MAAI,CAAC,kBAAmB,eAAe,QAAQ,OAAO,qBAAsB;AAC3E;EACD;AAEA,QAAM,YAAY,eAAe,QAAQ,MAAM,MAAM;AACrD,QAAM,iBAAiB,eAAe;AAEtC,MAAI,YAAY,SAAQ;AACxB,MAAI,CAAC,WAAW;AACf;EACD;AAEA,MAAI,QAAQ;AACZ,QAAM,aAAa,UAAU;AAC7B,SAAO,cAAa,cAAS,QAAT,cAAS,SAAA,SAAT,UAAW,UAAS,mBAAmB;AAC1D,aAAS,UAAU;AACnB,gBAAY,SAAQ;EACrB;AAEA,SAAO;IACN,MAAM;IACN,OAAO,eAAe;IACtB,WAAW,EAAE,MAAM,aAAa,KAAK,WAAW,OAAO,eAAc;IACrE,MAAM,EAAE,MAAM,SAAS,KAAK,OAAO,OAAO,WAAU;IACpD,KAAK,GAAG,SAAS,GAAG,KAAK;;AAE3B;;;ACvQM,SAAU,SAAS,SAAiB;AACzC,QAAM,SAAkB,CAAA;AACxB,MAAI,eAAe;AAEnB,QAAM,OAAO,CAAC,UAAgB;AAC7B,WAAO,KAAK,KAAK;AACjB,oBAAgB,MAAM,IAAI;EAC3B;AAEA,aAAW,CAAC,aAAaC,OAAM,KAAK,UAAU,OAAO,GAAG;AACvD,UAAM,QAAQ,CAAC,GAAGA,OAAM;AACxB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,UAAI,MAAM,CAAC,MAAM,OAAO,MAAM,IAAI,CAAC,MAAM,KAAK;AAC7C,aAAK,EAAE,MAAM,cAAc,KAAK,MAAM,OAAO,aAAY,CAAE;AAC3D;MACD,WAAW,MAAM,CAAC,MAAM,KAAK;AAC5B,aAAK,EAAE,MAAM,eAAe,KAAK,KAAK,OAAO,aAAY,CAAE;MAC5D,OAAO;AACN,aAAK,EAAE,MAAM,QAAQ,KAAK,MAAM,CAAC,GAAG,OAAO,aAAY,CAAE;MAC1D;IACD;AAEA,QAAI,cAAc,MAAM,QAAQ,QAAQ;AACvC,WAAK,EAAE,MAAM,mBAAmB,KAAK,KAAK,OAAO,aAAY,CAAE;IAChE;EACD;AAEA,SAAO;AACR;;;AC1BA,eAAsB,IACrB,IACA,SAAiB;AAEjB,QAAM,SAAS,MAAM,UAAU,IAAI,OAAO;AAC1C,MAAI,MAAM,MAAM,GAAG;AAClB,WAAO,OAAO,MAAM,IAAG;EACxB;AACA,SAAO,OAAO;AACf;AAKA,eAAsB,UACrB,IACA,SAAiB;AAEjB,QAAM,UAAoB,CAAA;AAC1B,QAAM,QAAQ,YAAY,IAAI,OAAO;AAErC,MAAI;AACH,UAAM,SAAS,MAAM,GAAG,IAAI,EAAE,OAAO,cAAc,oBAAI,IAAG,GAAI,QAAO,CAAE;AAEvE,QAAI,MAAM,MAAM,GAAG;AAClB,YAAM,IAAI,KAAK;QACd,SAAS,SAAS,OAAO,OAAO,MAAM,QAAQ,OAAO;QACrD,UAAU;QACV,MAAM;OACN;IACF;AACA,WAAO,GAAG,OAAO,KAAK;EACvB,SAAS,GAAG;AACX,QAAI,aAAa,MAAM;AACtB,aAAO,IAAI,CAAC;IACb;AACA,UAAM;EACP;AACD;AA4BA,SAAS,YACR,IACA,SAAiB;AAEjB,QAAM,eAAe,oBAAI,IAAG;AAC5B,QAAM,gBAAgB,oBAAI,IAAG;AAC7B,QAAM,iBAAiB,oBAAI,IAAG;AAC9B,QAAM,kBAAkB,oBAAI,IAAG;AAC/B,QAAM,kBAAkB;IACvB,qBAAqB;IACrB,oBAAoB;IACpB,uBAAuB;IACvB,sBAAsB;;AAGvB,KAAG,SAAS,eAAe;AAE3B,QAAM,SAAS,SAAS,OAAO;AAC/B,SAAO,MAAQ,QAAQ,eAAe;AACvC;;;AC3FA,SAAS,oBACR,QAAsC;AAEtC,SAAO;IACN,aAAU;;AACT,YAAM,eACL,MAAA,KAAA,OAAO,iBAAW,QAAA,OAAA,SAAA,KAAI,OAAO,KAAK,iBAAW,QAAA,OAAA,SAAA,KAAI;AAClD,aAAO;QACN;UACC,OAAO,OAAO,WAAW;UACzB,UAAU;UACV,UAAU,CAAA;UACV,cAAa,MAAA,KAAA,OAAO,iBAAW,QAAA,OAAA,SAAA,KAAI,OAAO,KAAK,iBAAW,QAAA,OAAA,SAAA,KAAI;;;IAGjE;IACA,SAAS,OAAK;IAAG;IACjB,MAAM,MAAM,EACX,OACA,aAAY,GACE;AACd,YAAM,cAAc,MAAM,OACzB,CAAC,SACA,KAAK,SAAS,wBAAwB,CAAC,aAAa,IAAI,IAAI,CAAC;AAG/D,YAAM,UAA+B,CAAA;AACrC,YAAM,SAAyB,CAAA;AAE/B,iBAAWC,eAAc,aAAa;AACrC,qBAAa,IAAIA,WAAU;AAC3B,cAAM,UAAU,MAAa,UAC5B,OAAO,KAAK,KAAKA,YAAW,GAAG,CAAC;AAEjC,YAAW,KAAK,OAAO,GAAG;AACzB,kBAAQ,KAAK,QAAQ,KAAK;QAC3B,OAAO;AACN,iBAAO,KAAK;YACX,OAAO,CAACA,WAAU;YAClB,SAAS,QAAQ,MAAM;WACvB;QACF;MACD;AAEA,UAAI,OAAO,SAAS,GAAG;AACtB,eAAc,IAAI;UACjB;SACA;MACF;AAEA,aAAc,GAAG,OAAO;IACzB;;AAEF;AAsBM,SAAU,gBACf,QAAiE;AAEjE,SAAO,oBAAoB;IAC1B,MAAM;IACN,GAAG;GACH;AACF;;;AC1EM,SAAU,YACf,QAAkC;AAElC,SAAO;IACN,aAAU;;AACT,YAAM,eAAc,KAAA,OAAO,KAAK,iBAAW,QAAA,OAAA,SAAA,KAAI;AAC/C,UAAI,QAAQ,KAAK,OAAO,IAAI,KAAK,WAAW;AAC5C,UAAI,OAAO,OAAO;AACjB,iBAAS,MAAM,OAAO,KAAK,KAAK,WAAW;MAC5C;AAEA,YAAM,WAAqB,CAAA;AAE3B,UAAI,OAAO,cAAc;AACxB,YAAI;AACH,gBAAM,eAAe,OAAO,aAAY;AACxC,cAAI,OAAO,4BAA4B;AACtC,qBAAS,KAAK,YAAY,eAAM,OAAO,YAAY,CAAC,EAAE;UACvD,OAAO;AACN,qBAAS,KAAK,eAAe;UAC9B;QACD,SAAS,GAAG;QAAC;MACd,WAAW,OAAO,KAAK,cAAc;AACpC,YAAI;AACH,gBAAM,eAAe,OAAO,KAAK,aAAY;AAC7C,cAAI,OAAO,KAAK,4BAA4B;AAC3C,qBAAS,KAAK,YAAY,eAAM,OAAO,YAAY,CAAC,EAAE;UACvD,OAAO;AACN,qBAAS,KAAK,eAAe;UAC9B;QACD,SAAS,GAAG;QAAC;MACd,WAAW,OAAO,aAAa,OAAO,KAAK,WAAW;AACrD,iBAAS,KAAK,eAAe;MAC9B;AAEA,aAAO;QACN;UACC,UAAU;UACV;UACA;UACA,cAAa,KAAA,OAAO,iBAAW,QAAA,OAAA,SAAA,KAAI;;;IAGtC;IACA,SAAS,MAAI;AACZ,WAAK,qBAAqB,IAAI,OAAO,IAAI;AACzC,UAAI,OAAO,OAAO;AACjB,aAAK,sBAAsB,IAAI,OAAO,KAAK;MAC5C;IACD;IACA,MAAM,MAAM,EACX,OACA,aAAY,GACE;;AACd,YAAM,UAAU,WAAW,OAAO;QACjC,WAAW,CAAC,OAAO,IAAI;QACvB,YAAY,OAAO,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAA;OAC5C,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC;AAErC,YAAM,iBAAiB,OAAO,gBAAgB,OAAO,KAAK;AAC1D,YAAM,cAAc,OAAO,aAAa,OAAO,KAAK;AAEpD,UAAI,QAAQ,WAAW,KAAK,gBAAgB;AAC3C,YAAI;AACH,gBAAM,eAAe,eAAc;AACnC,iBAAc,GAAG,YAAY;QAC9B,SAAS,GAAQ;AAChB,gBAAM,UAAU,0CAA0C,OAAO,IAAI,MAAM,EAAE,OAAO;AACpF,iBAAc,IAAI;YACjB,QAAQ;cACP;gBACC,OAAO,CAAA;gBACP;;;WAGF;QACF;MACD,WAAW,QAAQ,WAAW,KAAK,aAAa;AAC/C,YAAI;AACH,gBAAM,eAAe,MAAM,YAAW;AACtC,iBAAc,GAAG,YAAY;QAC9B,SAAS,GAAQ;AAChB,gBAAM,UAAU,sCAAsC,OAAO,IAAI,MAAM,EAAE,OAAO;AAChF,iBAAc,IAAI;YACjB,QAAQ;cACP;gBACC,OAAO,CAAA;gBACP;;;WAGF;QACF;MACD;AAEA,iBAAWC,WAAU,SAAS;AAC7B,qBAAa,IAAIA,OAAM;MACxB;AAEA,YAAM,eAAyB,CAAA;AAC/B,YAAM,SAAyB,CAAA;AAC/B,YAAM,YAAuB,CAAA;AAE7B,iBAAWA,WAAU,SAAS;AAC7B,cAAM,iBAAgB,KAAAA,QAAO,WAAK,QAAA,OAAA,SAAA,SAAA,GAAE,KAAK;AACzC,YAAI,kBAAkB,QAAW;AAChC,oBAAU,KAAKA,OAAM;AACrB;QACD;AACA,qBAAa,KAAK,aAAa;MAChC;AAEA,UAAI,UAAU,SAAS,GAAG;AACzB,eAAO,KAAK;UACX,OAAO;UACP,SAAS;SACT;MACF;AAEA,UAAI,OAAO,SAAS,GAAG;AACtB,eAAc,IAAI,EAAE,OAAM,CAAE;MAC7B;AAEA,YAAM,eAAe,MAAa,UACjC,OAAO,KAAK,KAAK,YAAY,CAAC;AAG/B,UAAW,MAAM,YAAY,GAAG;AAC/B,eAAc,IAAI;UACjB,QAAQ,CAAC,EAAE,OAAO,SAAS,SAAS,aAAa,MAAM,QAAO,CAAE;SAChE;MACF;AAEA,aAAO;IACR;;AAEF;;;ACpKA,SAAS,eAAe;AAMlB,SAAU,MACf,UAAsB;AAEtB,QAAM,WAAW,SAAS,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,EAAE,KAAK,IAAI;AAC1D,SAAO;IACN,MAAM,KAAK,KAAG;AACb,YAAM,QAAQ,SAAS,KAAK,CAAC,MAAM,MAAM,GAAG;AAC5C,UAAI,CAAC,OAAO;AACX,cAAM,IAAI,MAAM,kBAAkB,GAAG,uBAAuB,QAAQ,EAAE;MACvE;AACA,aAAO;IACR;IACA,aAAa,UAAU,QAAQ;;AAEjC;;;ACHA,IAAM,SAAS;AAAA,EACb,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AACR;AAGA,IAAM,UAAU,QAAQ,IAAI,aAAa,UAAa,CAAC,QAAQ,OAAO;AACtE,IAAMC,KAAI,UAAU,OAAO,YAAY,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI;AAyClF,SAAS,mBAAmB,UAAwC;AAClE,SAAO,uBAAuB,wBAAwB,QAAQ,CAAC,EAAE,IAAI,CAAC,WAAW;AAC/E,QAAI,CAAC,OAAO,UAAU,OAAO,WAAW,WAAW;AACjD,YAAM,IAAI,MAAM,qCAAqC,QAAQ,EAAE;AAAA,IACjE;AACA,QAAI,OAAO,OAAO,UAAU,YAAY,OAAO,MAAM,OAAO,KAAK,GAAG;AAClE,YAAM,IAAI,MAAM,8CAA8C,QAAQ,EAAE;AAAA,IAC1E;AACA,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC;AACH;AAQO,SAAS,iBAAiB,UAAgC;AAC/D,SAAO,mBAAmB,QAAQ,EAAE,IAAI,CAAC,EAAE,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,EAAE;AACpF;AAEO,SAAS,oBAAoB,UAA6C;AAC/E,QAAM,SAAS,oBAAI,IAA0B;AAE7C,aAAW,UAAU,mBAAmB,QAAQ,GAAG;AACjD,QAAI,OAAO,OAAO,WAAW,UAAU;AACrC,YAAM,IAAI,MAAM,mDAAmD,QAAQ,EAAE;AAAA,IAC/E;AAEA,UAAM,SAAS,OAAO;AACtB,QAAI,CAAC,OAAO,IAAI,MAAM,GAAG;AACvB,aAAO,IAAI,QAAQ,CAAC,CAAC;AAAA,IACvB;AACA,WAAO,IAAI,MAAM,GAAG,KAAK,EAAE,QAAQ,OAAO,QAAQ,OAAO,OAAO,MAAM,CAAC;AAAA,EACzE;AAEA,SAAO;AACT;AAQO,SAAS,sBACd,eACA,gBACe;AACf,MAAI,iBAAiB,EAAK,QAAO;AACjC,UAAQ,iBAAiB,kBAAkB,IAAI;AACjD;AAEO,SAAS,gBAAgB,OAAe,WAA2C;AACxF,MAAI,SAAS,UAAW,QAAO;AAC/B,MAAI,SAAS,CAAC,UAAW,QAAO;AAChC,SAAO;AACT;AAEO,SAAS,eACd,UACA,UACA,WACkB;AAClB,QAAM,OAAO,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC7D,QAAM,OAAO,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAE7D,QAAM,UAA2B,CAAC;AAClC,QAAM,aAAa,oBAAI,IAAY;AAEnC,aAAW,CAAC,QAAQ,MAAM,KAAK,MAAM;AACnC,UAAM,SAAS,KAAK,IAAI,MAAM;AAC9B,QAAI,WAAW,QAAW;AACxB,YAAM,QAAQ,SAAS;AACvB,cAAQ,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,gBAAgB,sBAAsB,QAAQ,MAAM;AAAA,QACpD,SAAS,gBAAgB,OAAO,SAAS;AAAA,MAC3C,CAAC;AACD,iBAAW,IAAI,MAAM;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,iBAAiB,SAAS,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,MAAM,CAAC,EAAE;AACzE,QAAM,iBAAiB,SAAS,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,MAAM,CAAC,EAAE;AAEnE,QAAM,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,KAAK,EAAE;AACxD,QAAM,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,MAAM,EAAE;AAC3D,QAAM,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,KAAK,EAAE;AAExD,QAAM,YACJ,QAAQ,SAAS,IAAI,QAAQ,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC,IAAI,QAAQ,SAAS;AAEvF,QAAM,aAAa,QAAQ,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,MAAmB,MAAM,IAAI;AAC7F,QAAM,qBACJ,WAAW,SAAS,IAChB,KAAK,MAAO,WAAW,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC,IAAI,WAAW,SAAU,GAAI,IAAI,MACrF;AAEN,SAAO;AAAA,IACL;AAAA,IACA,WAAW,EAAE,OAAO,gBAAgB,OAAO,eAAe;AAAA,IAC1D,SAAS;AAAA,MACP,OAAO,SAAS,SAAS,SAAS;AAAA,MAClC,SAAS,QAAQ;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,MAAM,YAAY,GAAI,IAAI;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,cAAc,QAAmC,WAAiC;AAChG,QAAM,UAAU,CAAC,GAAG,OAAO,KAAK,CAAC,EAAE,KAAK;AAGxC,QAAM,aAAa,oBAAI,IAAY;AACnC,aAAW,WAAW,OAAO,OAAO,GAAG;AACrC,eAAW,KAAK,SAAS;AACvB,iBAAW,IAAI,EAAE,MAAM;AAAA,IACzB;AAAA,EACF;AACA,QAAM,gBAAgB,CAAC,GAAG,UAAU,EAAE,KAAK;AAG3C,QAAM,cAAc,oBAAI,IAAiC;AACzD,aAAW,CAAC,QAAQ,OAAO,KAAK,QAAQ;AACtC,gBAAY,IAAI,QAAQ,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAAA,EAC1E;AAGA,QAAM,SAAsB,cAAc,IAAI,CAAC,WAAW;AACxD,UAAM,SAAiC,CAAC;AACxC,eAAW,UAAU,SAAS;AAC5B,YAAM,QAAQ,YAAY,IAAI,MAAM,GAAG,IAAI,MAAM;AACjD,UAAI,UAAU,QAAW;AACvB,eAAO,MAAM,IAAI;AAAA,MACnB;AAAA,IACF;AACA,WAAO,EAAE,QAAQ,OAAO;AAAA,EAC1B,CAAC;AAGD,QAAM,WAA+B,CAAC;AACtC,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,aAAS,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AAC3C,YAAM,KAAK,QAAQ,CAAC;AACpB,YAAM,KAAK,QAAQ,CAAC;AACpB,YAAM,KAAK,OAAO,IAAI,EAAE,KAAK,CAAC;AAC9B,YAAM,KAAK,OAAO,IAAI,EAAE,KAAK,CAAC;AAC9B,YAAM,aAAa,eAAe,IAAI,IAAI,SAAS;AACnD,iBAAW,WAAW;AACtB,iBAAW,YAAY;AACvB,eAAS,KAAK,UAAU;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,UAAU,QAAQ;AACrC;AAEO,SAAS,kBAAkB,WAA2B;AAE3D,SAAO,aAAa,IAAI,IAAI;AAC9B;AAEO,SAAS,wBACd,cACA,gBACQ;AACR,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAKA,aAAW,KAAK,aAAa,UAAU;AACrC,QAAI,EAAE,aAAa,kBAAkB,EAAE,QAAQ,YAAY,GAAG;AAE5D,aAAO;AAAA,IACT;AACA,QAAI,EAAE,cAAc,kBAAkB,EAAE,QAAQ,YAAY,GAAG;AAE7D,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAuB;AAC1C,QAAM,OAAO,SAAS,IAAI,MAAM;AAChC,QAAM,YAAY,GAAG,IAAI,GAAG,MAAM,QAAQ,CAAC,CAAC;AAC5C,MAAI,QAAQ,EAAG,QAAO,GAAGA,GAAE,KAAK,GAAG,SAAS,GAAGA,GAAE,KAAK;AACtD,MAAI,QAAQ,EAAG,QAAO,GAAGA,GAAE,GAAG,GAAG,SAAS,GAAGA,GAAE,KAAK;AACpD,SAAO,GAAGA,GAAE,IAAI,GAAG,SAAS,GAAGA,GAAE,KAAK;AACxC;AAEA,SAAS,cAAc,SAAyC;AAC9D,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO,GAAGA,GAAE,KAAK,aAAQA,GAAE,KAAK;AAAA,IAClC,KAAK;AACH,aAAO,GAAGA,GAAE,GAAG,cAASA,GAAE,KAAK;AAAA,IACjC,KAAK;AACH,aAAO,GAAGA,GAAE,IAAI,QAAQA,GAAE,KAAK;AAAA,EACnC;AACF;AAGA,IAAM,cAAc,IAAI,OAAO,GAAG,OAAO,aAAa,EAAE,CAAC,eAAe,GAAG;AAE3E,SAASC,WAAU,KAAqB;AACtC,SAAO,IAAI,QAAQ,aAAa,EAAE;AACpC;AAEA,SAASC,UAAS,KAAa,KAAqB;AAClD,QAAM,WAAWD,WAAU,GAAG,EAAE;AAChC,SAAO,MAAM,IAAI,OAAO,KAAK,IAAI,GAAG,MAAM,QAAQ,CAAC;AACrD;AAEA,SAASE,SAAQ,KAAa,KAAqB;AACjD,QAAM,WAAWF,WAAU,GAAG,EAAE;AAChC,SAAO,IAAI,OAAO,KAAK,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI;AACnD;AAEO,SAAS,YAAY,YAA8B,OAAe,OAAuB;AAC9F,QAAM,QAAkB,CAAC;AAGzB,QAAM,KAAK,EAAE;AACb,QAAM;AAAA,IACJ,GAAGD,GAAE,IAAI,aAAaA,GAAE,KAAK,IAAIA,GAAE,IAAI,GAAG,KAAK,GAAGA,GAAE,KAAK,WAAMA,GAAE,IAAI,GAAG,KAAK,GAAGA,GAAE,KAAK;AAAA,EACzF;AACA,QAAM,KAAK,EAAE;AAEb,MAAI,WAAW,QAAQ,WAAW,GAAG;AACnC,UAAM,KAAK,GAAGA,GAAE,MAAM,4CAA4CA,GAAE,KAAK,EAAE;AAAA,EAC7E,OAAO;AAEL,UAAM,WAAW,KAAK;AAAA,MACpB;AAAA,MACA,GAAG,WAAW,QAAQ,IAAI,CAAC,MAAM,EAAE,OAAO,MAAM;AAAA,IAClD;AAGA,UAAM,SAAS,KAAKE,UAAS,WAAW,QAAQ,CAAC,KAAKC,SAAQ,YAAY,CAAC,CAAC,KAAKA,SAAQ,aAAa,CAAC,CAAC,KAAKA,SAAQ,SAAS,CAAC,CAAC;AAChI,UAAM,KAAK,GAAGH,GAAE,GAAG,GAAG,MAAM,GAAGA,GAAE,KAAK,EAAE;AACxC,UAAM;AAAA,MACJ,GAAGA,GAAE,GAAG,KAAK,SAAI,OAAO,QAAQ,CAAC,KAAK,SAAI,OAAO,CAAC,CAAC,KAAK,SAAI,OAAO,CAAC,CAAC,KAAK,SAAI,OAAO,CAAC,CAAC,KAAK,SAAI,OAAO,CAAC,CAAC,GAAGA,GAAE,KAAK;AAAA,IACrH;AAGA,eAAW,KAAK,WAAW,SAAS;AAClC,YAAM,MAAM,KAAKE,UAAS,EAAE,QAAQ,QAAQ,CAAC,KAAKC,SAAQ,EAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAKA,SAAQ,EAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAKA,SAAQ,YAAY,EAAE,KAAK,GAAG,CAAC,CAAC,KAAK,cAAc,EAAE,OAAO,CAAC;AACvL,YAAM,KAAK,GAAG;AAAA,IAChB;AAAA,EACF;AAGA,MAAI,WAAW,UAAU,QAAQ,KAAK,WAAW,UAAU,QAAQ,GAAG;AACpE,UAAM,KAAK,EAAE;AACb,UAAM;AAAA,MACJ,GAAGH,GAAE,MAAM,oBAAeA,GAAE,KAAK,IAAI,WAAW,UAAU,KAAK,iBAAiB,WAAW,UAAU,KAAK;AAAA,IAC5G;AAAA,EACF;AAGA,QAAM,KAAK,EAAE;AACb,QAAM,EAAE,MAAM,QAAQ,MAAM,WAAW,mBAAmB,IAAI,WAAW;AAEzE,QAAM,SACJ,OAAO,IAAI,GAAGA,GAAE,KAAK,GAAG,IAAI,OAAO,SAAS,IAAI,MAAM,EAAE,GAAGA,GAAE,KAAK,KAAK,GAAG,IAAI;AAChF,QAAM,UACJ,SAAS,IAAI,GAAGA,GAAE,GAAG,GAAG,MAAM,QAAQ,WAAW,IAAI,OAAO,EAAE,GAAGA,GAAE,KAAK,KAAK,GAAG,MAAM;AACxF,QAAM,SAAS,GAAG,IAAI,OAAO,SAAS,IAAI,MAAM,EAAE;AAElD,QAAM,aAAa,YAAY,IAAIA,GAAE,QAAQ,YAAY,IAAIA,GAAE,MAAMA,GAAE;AACvE,QAAM,YAAY,aAAa,IAAI,MAAM;AACzC,QAAM,SACJ,YAAY,IACR,GAAGA,GAAE,KAAK,WAAWA,GAAE,KAAK,KAC5B,YAAY,IACV,GAAGA,GAAE,GAAG,YAAYA,GAAE,KAAK,KAC3B,GAAGA,GAAE,IAAI,UAAUA,GAAE,KAAK;AAElC,MAAI,cAAc,GAAGA,GAAE,IAAI,WAAWA,GAAE,KAAK,IAAI,MAAM,KAAK,OAAO,KAAK,MAAM,mBAAc,UAAU,GAAG,SAAS,GAAG,UAAU,QAAQ,CAAC,CAAC,GAAGA,GAAE,KAAK;AACnJ,MAAI,sBAAsB,MAAM;AAC9B,UAAM,SAAS,qBAAqB,IAAIA,GAAE,QAAQ,qBAAqB,IAAIA,GAAE,MAAMA,GAAE;AACrF,UAAM,QAAQ,sBAAsB,IAAI,MAAM;AAC9C,mBAAe,SAAS,MAAM,GAAG,KAAK,GAAG,mBAAmB,QAAQ,CAAC,CAAC,GAAGA,GAAE,KAAK;AAAA,EAClF;AACA,iBAAe,cAAc,MAAM;AAEnC,QAAM,KAAK,WAAW;AACtB,QAAM,KAAK,EAAE;AAEb,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,aAAa,cAA4B,gBAAiC;AACxF,QAAM,EAAE,QAAQ,UAAU,QAAQ,IAAI;AACtC,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,GAAGA,GAAE,IAAI,eAAeA,GAAE,KAAK,EAAE;AAC5C,QAAM,KAAK,EAAE;AAEb,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,KAAK,GAAGA,GAAE,MAAM,oBAAoBA,GAAE,KAAK,EAAE;AACnD,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAGA,QAAM,cAAc,KAAK;AAAA,IACvB;AAAA,IACA,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,MAAM;AAAA,EACtC;AACA,QAAM,eAAe,QAAQ,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAC;AAG7D,MAAI,SAAS,KAAKE,UAAS,WAAW,WAAW,CAAC;AAClD,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,cAAU,KAAKC,SAAQ,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;AAAA,EACrD;AACA,QAAM,KAAK,GAAGH,GAAE,GAAG,GAAG,MAAM,GAAGA,GAAE,KAAK,EAAE;AAGxC,MAAI,MAAM,KAAK,SAAI,OAAO,WAAW,CAAC;AACtC,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,WAAO,KAAK,SAAI,OAAO,aAAa,CAAC,CAAC,CAAC;AAAA,EACzC;AACA,QAAM,KAAK,GAAGA,GAAE,GAAG,GAAG,GAAG,GAAGA,GAAE,KAAK,EAAE;AAGrC,aAAW,OAAO,QAAQ;AACxB,QAAI,OAAO,KAAKE,UAAS,IAAI,QAAQ,WAAW,CAAC;AACjD,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,QAAQ,IAAI,OAAO,QAAQ,CAAC,CAAC;AACnC,YAAM,WAAW,UAAU,SAAY,MAAM,QAAQ,CAAC,IAAI;AAE1D,UAAI,kBAAkB,QAAQ,CAAC,MAAM,kBAAkB,UAAU,QAAW;AAC1E,cAAM,gBAAgB,IAAI,OAAO,cAAc;AAC/C,YAAI,kBAAkB,UAAa,QAAQ,eAAe;AACxD,kBAAQ,KAAKC,SAAQ,GAAGH,GAAE,GAAG,GAAG,QAAQ,GAAGA,GAAE,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC;AAAA,QACxE,WAAW,kBAAkB,UAAa,QAAQ,eAAe;AAC/D,kBAAQ,KAAKG,SAAQ,GAAGH,GAAE,KAAK,GAAG,QAAQ,GAAGA,GAAE,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC;AAAA,QAC1E,OAAO;AACL,kBAAQ,KAAKG,SAAQ,UAAU,aAAa,CAAC,CAAC,CAAC;AAAA,QACjD;AAAA,MACF,OAAO;AACL,gBAAQ,KAAKA,SAAQ,UAAU,aAAa,CAAC,CAAC,CAAC;AAAA,MACjD;AAAA,IACF;AACA,UAAM,KAAK,IAAI;AAAA,EACjB;AAGA,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,GAAGH,GAAE,IAAI,oBAAoBA,GAAE,KAAK,EAAE;AAEjD,UAAM,cAAc,KAAK;AAAA,MACvB,GAAG,SAAS,IAAI,CAAC,OAAO,KAAK,GAAG,QAAQ,WAAM,GAAG,SAAS,IAAI,MAAM;AAAA,IACtE;AACA,eAAW,KAAK,UAAU;AACxB,YAAM,EAAE,MAAM,QAAQ,MAAM,WAAW,mBAAmB,IAAI,EAAE;AAChE,YAAM,OAAO,aAAa,IAAI,MAAM;AACpC,YAAM,aAAa,YAAY,IAAIA,GAAE,QAAQ,YAAY,IAAIA,GAAE,MAAMA,GAAE;AACvE,YAAM,QAAQ,KAAK,EAAE,QAAQ,WAAM,EAAE,SAAS;AAC9C,UAAI,WAAW,GAAGE,UAAS,OAAO,WAAW,CAAC,KAAK,IAAI,OAAO,SAAS,IAAI,MAAM,EAAE,KAAK,MAAM,QAAQ,WAAW,IAAI,OAAO,EAAE,KAAK,IAAI,OAAO,SAAS,IAAI,MAAM,EAAE,MAAMF,GAAE,IAAI,SAAIA,GAAE,KAAK,IAAI,UAAU,GAAG,IAAI,GAAG,UAAU,QAAQ,CAAC,CAAC,GAAGA,GAAE,KAAK;AAChP,UAAI,sBAAsB,MAAM;AAC9B,cAAM,SAAS,qBAAqB,IAAIA,GAAE,QAAQ,qBAAqB,IAAIA,GAAE,MAAMA,GAAE;AACrF,cAAM,QAAQ,sBAAsB,IAAI,MAAM;AAC9C,oBAAY,KAAKA,GAAE,IAAI,IAAIA,GAAE,KAAK,IAAI,MAAM,GAAG,KAAK,GAAG,mBAAmB,QAAQ,CAAC,CAAC,GAAGA,GAAE,KAAK;AAAA,MAChG;AACA,kBAAY;AACZ,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,IAAM,iBAAiB,QAAQ;AAAA,EACpC,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAM;AAAA,IACJ,SAAS,gBAAgB;AAAA,MACvB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,aACE;AAAA,IACJ,CAAC;AAAA,IACD,WAAW,OAAO;AAAA,MAChB,MAAM,SAAS,MAAM;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AAAA,IACD,UAAU,OAAO;AAAA,MACf,MAAM,SAAS,MAAM;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AAAA,IACD,WAAW,OAAO;AAAA,MAChB,MAAM,SAAS,MAAM;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AAAA,IACD,SAAS,YAAY;AAAA,MACnB,MAAM,MAAM,MAAM;AAAA,MAClB,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,IACD,QAAQ,OAAO;AAAA,MACb,MAAM,SAAS,MAAM,CAAC,SAAS,MAAM,CAAC,CAAC;AAAA,MACvC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AAAA,IACD,MAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EACA,SAAS,OAAO,EAAE,SAAS,WAAW,UAAU,WAAW,SAAS,QAAQ,KAAK,MAAM;AACrF,UAAM,qBAAqB,aAAa;AACxC,UAAM,eAAe,OAAO,SAAU,UAAU;AAEhD,QAAI;AACF,UAAI,QAAQ,WAAW,GAAG;AACxB,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC1E;AAEA,UAAI,QAAQ,WAAW,GAAG;AAExB,cAAM,WAAW,iBAAiB,QAAQ,CAAC,CAAC;AAC5C,cAAM,WAAW,iBAAiB,QAAQ,CAAC,CAAC;AAC5C,cAAM,aAAa,eAAe,UAAU,UAAU,kBAAkB;AAExE,YAAI,iBAAiB,QAAQ;AAC3B,kBAAQ,IAAI,KAAK,UAAU,gBAAgB,UAAU,GAAG,MAAM,CAAC,CAAC;AAAA,QAClE,OAAO;AACL,kBAAQ,IAAI,YAAY,YAAY,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;AAAA,QAC7D;AAEA,cAAM,WAAW,kBAAkB,WAAW,QAAQ,SAAS;AAC/D,gBAAQ,KAAK,QAAQ;AAAA,MACvB,WAAW,QAAQ,WAAW,GAAG;AAE/B,YAAI,SAAS,oBAAoB,QAAQ,CAAC,CAAC;AAG3C,YAAI,QAAQ,SAAS,GAAG;AACtB,gBAAM,WAAW,oBAAI,IAA0B;AAC/C,qBAAW,KAAK,SAAS;AACvB,kBAAM,QAAQ,OAAO,IAAI,CAAC;AAC1B,gBAAI,OAAO;AACT,uBAAS,IAAI,GAAG,KAAK;AAAA,YACvB;AAAA,UACF;AACA,cAAI,SAAS,SAAS,GAAG;AACvB,kBAAM,YAAY,CAAC,GAAG,OAAO,KAAK,CAAC,EAAE,KAAK,IAAI;AAC9C,kBAAM,IAAI;AAAA,cACR,sEAAsE,SAAS;AAAA,YACjF;AAAA,UACF;AACA,mBAAS;AAAA,QACX;AAGA,YAAI,YAAY,CAAC,OAAO,IAAI,QAAQ,GAAG;AACrC,gBAAM,YAAY,CAAC,GAAG,OAAO,KAAK,CAAC,EAAE,KAAK,IAAI;AAC9C,gBAAM,IAAI;AAAA,YACR,oBAAoB,QAAQ,8CAA8C,SAAS;AAAA,UACrF;AAAA,QACF;AAEA,YAAI,aAAa,CAAC,UAAU;AAC1B,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,YAAI,YAAY,WAAW;AAEzB,gBAAM,kBAAkB,OAAO,IAAI,QAAQ;AAC3C,gBAAM,mBAAmB,OAAO,IAAI,SAAS;AAC7C,cAAI,CAAC,iBAAiB;AACpB,kBAAM,IAAI,MAAM,oBAAoB,QAAQ,wBAAwB;AAAA,UACtE;AACA,cAAI,CAAC,kBAAkB;AACrB,kBAAM,IAAI,MAAM,qBAAqB,SAAS,wBAAwB;AAAA,UACxE;AAEA,gBAAM,aAAa,eAAe,iBAAiB,kBAAkB,kBAAkB;AAEvF,cAAI,iBAAiB,QAAQ;AAC3B,oBAAQ,IAAI,KAAK,UAAU,gBAAgB,UAAU,GAAG,MAAM,CAAC,CAAC;AAAA,UAClE,OAAO;AACL,oBAAQ,IAAI,YAAY,YAAY,UAAU,SAAS,CAAC;AAAA,UAC1D;AAEA,gBAAM,WAAW,kBAAkB,WAAW,QAAQ,SAAS;AAC/D,kBAAQ,KAAK,QAAQ;AAAA,QACvB,OAAO;AAEL,gBAAM,eAAe,cAAc,QAAQ,kBAAkB;AAE7D,cAAI,iBAAiB,QAAQ;AAC3B,oBAAQ,IAAI,KAAK,UAAU,gBAAgB,YAAY,GAAG,MAAM,CAAC,CAAC;AAAA,UACpE,OAAO;AACL,oBAAQ,IAAI,aAAa,cAAc,QAAQ,CAAC;AAAA,UAClD;AAEA,gBAAM,WAAW,wBAAwB,cAAc,QAAQ;AAC/D,kBAAQ,KAAK,QAAQ;AAAA,QACvB;AAAA,MACF,OAAO;AACL,cAAM,IAAI,MAAM,iDAAiD;AAAA,MACnE;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,UAAW,MAAgB,OAAO,EAAE;AAClD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACnmBD,SAAS,cAAc,qBAAqB;AAC5C,OAAOI,WAAU;AAEjB,SAAS,aAAa,qBAAqB;;;ACH3C,SAAS,OAAO,iBAAiB;AACjC,OAAO,UAAU;AAMV,IAAM,aAAN,MAAM,YAAW;AAAA,EACL;AAAA,EACA,UAA8B,CAAC;AAAA,EAC/B,QAAQ,IAAI,MAAM;AAAA,EAC3B,SAAS;AAAA,EACT,SAAS;AAAA,EAET,YAAY,UAAkB;AACpC,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,aAAa,KAAK,UAAuC;AACvD,UAAM,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AACvD,UAAM,SAAS,IAAI,YAAW,QAAQ;AACtC,UAAM,OAAO,UAAU;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,QAAyC;AACpD,UAAM,KAAK,MAAM,aAAa,YAAY;AACxC,UAAI,KAAK,QAAQ;AACf,cAAM,IAAI,MAAM,oCAAoC;AAAA,MACtD;AACA,WAAK,QAAQ,KAAK,MAAM;AACxB,YAAM,KAAK,UAAU;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,MAAM,aAAa,YAAY;AACxC,UAAI,KAAK,QAAQ;AACf;AAAA,MACF;AACA,WAAK,SAAS;AACd,WAAK,SAAS;AACd,YAAM,KAAK,UAAU;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,YAA2B;AACvC,UAAM,OAAO,aAAa,KAAK,SAAS,KAAK,MAAM;AACnD,UAAM,UAAU,KAAK,UAAU,MAAM,MAAM;AAAA,EAC7C;AACF;AAEA,SAAS,aAAa,SAAsC,QAAyB;AAEnF,QAAM,eAAe,QAAQ,IAAI,CAAC,MAAM;AACtC,UAAM,EAAE,UAAU,OAAO,GAAG,KAAK,IAAI;AACrC,WAAO;AAAA,EACT,CAAC;AAED,QAAM,WAAW,KAAK,UAAU,YAAY,EAAE,QAAQ,QAAQ,MAAM;AACpE,QAAM,cAAc,SAAS,kDAAkD;AAC/E,QAAM,gBAAgB,SAClB,gDACA,2BAA2B,YAAW,oBAAI,KAAK,GAAE,YAAY,CAAC,CAAC;AAEnE,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAKP,WAAW;AAAA;AAAA,EAEX,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oCAW4B,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAQhC,QAAQ;AAAA,oBACL,OAAO,MAAM,CAAC;AAAA,EAChC,MAAM;AAAA;AAAA;AAAA;AAIR;AAEA,SAAS,WAAW,GAAmB;AACrC,SAAO,EACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ;AAC3B;AAKA,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+Hf,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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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","targetName","path","stringifyYaml","readFileSync","readFile","nodePath","command","readFileSync","check","workspacePathFrom","nodePath","command","pass","command","resolve","nodePath","readFile","workspacePathFrom","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","tmpdir","dirname","join","relative","resolve","resolve","join","existsSync","env","readFileSync","dirname","evalRunCommand","relative","targetName","mkdir","writeJson","writeFile","writeGraderConfigs","readFile","tmpdir","readdir","evalRunCommand","mkdir","rm","writeFile","path","path","rm","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","spawn","existsSync","mkdirSync","path","fileURLToPath","run","path","RESULT_INDEX_FILENAME","existsSync","c","fileURLToPath","execFileSync","mkdirSync","app","err","command","spawn","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","readTargetDefinitions","relative","loadEnvFile","targetName","spawn","existsSync","dirname","join","runCommand","resolve","command","existsSync","readFileSync","readdirSync","path","fileURLToPath","existsSync","readdirSync","path","fileURLToPath","readFileSync","skill","writeFileSync","path","path","writeFileSync","readFileSync","writeFileSync","readFileSync","writeFileSync","formatSummary","formatError","constants","access","readdir","stat","path","fg","path","access","constants","stat","entries","readdir","formatSummary","spawn","readFile","join","NPM_REGISTRY_BASE","path","join","readFile","spawn","path"]}
|