agentv 5.0.0-next.1 → 5.2.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +239 -53
- package/dist/{agentv-provider-AYXH7WLW-NJRC6UQX.js → agentv-provider-AYXH7WLW-6YZKZ7PS.js} +2 -2
- package/dist/{artifact-writer-QD52FC56.js → artifact-writer-SN6UNL5G.js} +15 -8
- package/dist/{chunk-GZJMODLW.js → chunk-3S6A2RKR.js} +45880 -30542
- package/dist/chunk-3S6A2RKR.js.map +1 -0
- package/dist/{chunk-6Q56CEXV.js → chunk-3X357HS4.js} +7900 -8985
- package/dist/chunk-3X357HS4.js.map +1 -0
- package/dist/{chunk-6JVM4GJI.js → chunk-46K2OET3.js} +187 -80
- package/dist/chunk-46K2OET3.js.map +1 -0
- package/dist/{chunk-IJEZFZJR.js → chunk-7BGERE6L.js} +2 -2
- package/dist/chunk-7BGERE6L.js.map +1 -0
- package/dist/{chunk-UG4JHZYM.js → chunk-ALVZQUZP.js} +670 -1427
- package/dist/chunk-ALVZQUZP.js.map +1 -0
- package/dist/{chunk-RCIEHFQ2.js → chunk-PEUTJS7B.js} +3 -3
- package/dist/{chunk-5H446C7X.js → chunk-QMRVH5ZP.js} +2 -8
- package/dist/{chunk-IBI7A5RP.js → chunk-T4AD3H3Y.js} +3444 -2251
- package/dist/chunk-T4AD3H3Y.js.map +1 -0
- package/dist/cli.js +8 -9
- package/dist/cli.js.map +1 -1
- package/dist/dashboard/assets/{index-D5_8DE_B.js → index-DNgf3qJ2.js} +1 -1
- package/dist/dashboard/assets/index-D_bokML8.css +1 -0
- package/dist/dashboard/assets/index-r_jSJmlw.js +121 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/{dist-KJ6PELQY.js → dist-DEPJOMCA.js} +74 -60
- package/dist/{docker-workspace-ZJ2ESVBI-6UDETQII.js → docker-workspace-NNK4Z6FR-QRTIG6TM.js} +3 -3
- package/dist/{exec-MYPAJJP7-C5HD5WG5.js → exec-4HFFRQ3B-AXDMJNLJ.js} +3 -3
- package/dist/index.js +8 -9
- package/dist/{interactive-2WMVAASS.js → interactive-36ZNMQB2.js} +13 -29
- package/dist/interactive-36ZNMQB2.js.map +1 -0
- package/dist/skills/agentv-bench/SKILL.md +38 -34
- package/dist/skills/agentv-bench/agents/analyzer.md +6 -6
- package/dist/skills/agentv-bench/agents/comparator.md +4 -5
- package/dist/skills/agentv-bench/agents/grader.md +4 -4
- package/dist/skills/agentv-bench/references/autoresearch.md +3 -3
- package/dist/skills/agentv-bench/references/description-optimization.md +2 -2
- package/dist/skills/agentv-bench/references/environment-adaptation.md +10 -10
- package/dist/skills/agentv-bench/references/eval-yaml-spec.md +51 -30
- package/dist/skills/agentv-bench/references/migrating-from-skill-creator.md +4 -4
- package/dist/skills/agentv-bench/references/subagent-pipeline.md +13 -12
- package/dist/skills/agentv-eval-migrations/SKILL.md +33 -0
- package/dist/skills/agentv-eval-migrations/references/breaking-changes.md +1012 -0
- package/dist/skills/agentv-eval-review/SKILL.md +6 -3
- package/dist/skills/agentv-eval-review/scripts/lint_eval.py +1 -1
- package/dist/skills/agentv-eval-writer/SKILL.md +380 -246
- package/dist/skills/agentv-eval-writer/references/{config-schema.json → config.schema.json} +6 -5
- package/dist/skills/agentv-eval-writer/references/custom-evaluators.md +23 -18
- package/dist/skills/agentv-eval-writer/references/eval.schema.json +9852 -0
- package/dist/skills/agentv-eval-writer/references/python-helpers.md +8 -8
- package/dist/skills/agentv-eval-writer/references/rubric-evaluator.md +21 -22
- package/dist/skills/agentv-trace-analyst/SKILL.md +4 -4
- package/dist/templates/.agentv/targets.yaml +41 -40
- package/dist/{ts-eval-loader-RE43OAGX-AMRCUKBZ.js → ts-eval-loader-OMG2JBHP-OP5RR7A3.js} +5 -4
- package/package.json +19 -4
- package/dist/chunk-6JVM4GJI.js.map +0 -1
- package/dist/chunk-6Q56CEXV.js.map +0 -1
- package/dist/chunk-76FOHROU.js +0 -96
- package/dist/chunk-76FOHROU.js.map +0 -1
- package/dist/chunk-GZJMODLW.js.map +0 -1
- package/dist/chunk-HSHTTN6C.js +0 -565
- package/dist/chunk-HSHTTN6C.js.map +0 -1
- package/dist/chunk-IBI7A5RP.js.map +0 -1
- package/dist/chunk-IJEZFZJR.js.map +0 -1
- package/dist/chunk-LRULMAAA.js +0 -1711
- package/dist/chunk-LRULMAAA.js.map +0 -1
- package/dist/chunk-R3CXYNTN.js +0 -1238
- package/dist/chunk-R3CXYNTN.js.map +0 -1
- package/dist/chunk-UG4JHZYM.js.map +0 -1
- package/dist/chunk-VQ2ZO7XJ.js +0 -2098
- package/dist/chunk-VQ2ZO7XJ.js.map +0 -1
- package/dist/chunk-XALGXSKB.js +0 -21
- package/dist/chunk-XALGXSKB.js.map +0 -1
- package/dist/dashboard/assets/index-BVMrdN8a.js +0 -119
- package/dist/dashboard/assets/index-DZWXfWsv.css +0 -1
- package/dist/esm-NNMQYIKT.js +0 -32
- package/dist/esm-R77SNOF5.js +0 -65
- package/dist/esm-RVQPUGWH.js +0 -1207
- package/dist/esm-RVQPUGWH.js.map +0 -1
- package/dist/esm-TTEMJEVV.js +0 -933
- package/dist/esm-TTEMJEVV.js.map +0 -1
- package/dist/esm-ZADQ4XQH-QUFGGZL4.js +0 -924
- package/dist/esm-ZADQ4XQH-QUFGGZL4.js.map +0 -1
- package/dist/exec-MYPAJJP7-C5HD5WG5.js.map +0 -1
- package/dist/getMachineId-bsd-HSK5LZMG.js +0 -41
- package/dist/getMachineId-bsd-HSK5LZMG.js.map +0 -1
- package/dist/getMachineId-darwin-4DP6CCJV.js +0 -41
- package/dist/getMachineId-darwin-4DP6CCJV.js.map +0 -1
- package/dist/getMachineId-linux-44LJ5UJB.js +0 -33
- package/dist/getMachineId-linux-44LJ5UJB.js.map +0 -1
- package/dist/getMachineId-unsupported-NVK6IATM.js +0 -24
- package/dist/getMachineId-unsupported-NVK6IATM.js.map +0 -1
- package/dist/getMachineId-win-YZ36S7VA.js +0 -43
- package/dist/getMachineId-win-YZ36S7VA.js.map +0 -1
- package/dist/interactive-2WMVAASS.js.map +0 -1
- package/dist/otlp-json-file-exporter-RY63S3IG-PZBQPVYY.js +0 -9
- package/dist/otlp-json-file-exporter-RY63S3IG-PZBQPVYY.js.map +0 -1
- package/dist/skills/agentv-eval-writer/references/eval-schema.json +0 -17295
- package/dist/skills/agentv-eval-writer/references/experiment-schema.json +0 -278
- package/dist/src-76ISS3LH.js +0 -1733
- package/dist/src-76ISS3LH.js.map +0 -1
- package/dist/ts-eval-loader-RE43OAGX-AMRCUKBZ.js.map +0 -1
- /package/dist/{agentv-provider-AYXH7WLW-NJRC6UQX.js.map → agentv-provider-AYXH7WLW-6YZKZ7PS.js.map} +0 -0
- /package/dist/{artifact-writer-QD52FC56.js.map → artifact-writer-SN6UNL5G.js.map} +0 -0
- /package/dist/{chunk-RCIEHFQ2.js.map → chunk-PEUTJS7B.js.map} +0 -0
- /package/dist/{chunk-5H446C7X.js.map → chunk-QMRVH5ZP.js.map} +0 -0
- /package/dist/{dist-KJ6PELQY.js.map → dist-DEPJOMCA.js.map} +0 -0
- /package/dist/{docker-workspace-ZJ2ESVBI-6UDETQII.js.map → docker-workspace-NNK4Z6FR-QRTIG6TM.js.map} +0 -0
- /package/dist/{esm-NNMQYIKT.js.map → exec-4HFFRQ3B-AXDMJNLJ.js.map} +0 -0
- /package/dist/{esm-R77SNOF5.js.map → ts-eval-loader-OMG2JBHP-OP5RR7A3.js.map} +0 -0
|
@@ -8,7 +8,7 @@ Use it when the user wants Python-based custom graders or wants to emit AgentV Y
|
|
|
8
8
|
|
|
9
9
|
- Prefer canonical AgentV wire and YAML fields.
|
|
10
10
|
- Do not accept deprecated wire aliases like `output_text`, `input_text`, or `reference_answer`.
|
|
11
|
-
- Keep Python eval authoring YAML-shaped. Mirror `execution`, `tests`, `
|
|
11
|
+
- Keep Python eval authoring YAML-shaped. Mirror `execution`, `tests`, `assert`, `expected_output`, and related AgentV keys directly.
|
|
12
12
|
- Run evals through the AgentV CLI, not through a separate Python runtime.
|
|
13
13
|
- If adapting Braintrust or DeepEval patterns, write Python functions that return ordinary AgentV assertion dictionaries rather than new terms like `scores`.
|
|
14
14
|
|
|
@@ -16,8 +16,8 @@ Use it when the user wants Python-based custom graders or wants to emit AgentV Y
|
|
|
16
16
|
|
|
17
17
|
- `agentv_py.grader`
|
|
18
18
|
- `load_grader_input()`
|
|
19
|
-
- `
|
|
20
|
-
- `
|
|
19
|
+
- `run_script_grader(handler)`
|
|
20
|
+
- `define_script_grader(handler)`
|
|
21
21
|
- `TargetClient.from_env()`
|
|
22
22
|
- `agentv_py.evals`
|
|
23
23
|
- `EvalDefinition`
|
|
@@ -30,21 +30,21 @@ Use it when the user wants Python-based custom graders or wants to emit AgentV Y
|
|
|
30
30
|
## Example
|
|
31
31
|
|
|
32
32
|
```python
|
|
33
|
-
from agentv_py.grader import Assertion,
|
|
33
|
+
from agentv_py.grader import Assertion, ScriptGraderResult, define_script_grader
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
def evaluate(context):
|
|
37
37
|
actual = context.output or ""
|
|
38
38
|
expected = context.expected_output[0]["content"]
|
|
39
39
|
passed = actual.strip() == expected.strip()
|
|
40
|
-
return
|
|
40
|
+
return ScriptGraderResult(
|
|
41
41
|
score=1.0 if passed else 0.0,
|
|
42
42
|
assertions=[Assertion(text="Exact match", passed=passed)],
|
|
43
43
|
)
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
if __name__ == "__main__":
|
|
47
|
-
|
|
47
|
+
define_script_grader(evaluate)
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
## YAML helper example
|
|
@@ -56,7 +56,7 @@ from agentv_py.evals import EvalDefinition, JsonlCase, write_eval_yaml, write_js
|
|
|
56
56
|
def rag_faithfulness():
|
|
57
57
|
return {
|
|
58
58
|
"name": "rag-faithfulness",
|
|
59
|
-
"type": "llm-
|
|
59
|
+
"type": "llm-rubric",
|
|
60
60
|
"target": "grader-target",
|
|
61
61
|
"prompt": "Grade whether the answer is supported by the retrieved context.",
|
|
62
62
|
}
|
|
@@ -69,7 +69,7 @@ write_jsonl(
|
|
|
69
69
|
id="grounded-answer",
|
|
70
70
|
input=[{"role": "user", "content": "Answer using context."}],
|
|
71
71
|
expected_output=[{"role": "assistant", "content": "Answer cites context."}],
|
|
72
|
-
extra={"
|
|
72
|
+
extra={"assert": [rag_faithfulness()]},
|
|
73
73
|
)
|
|
74
74
|
],
|
|
75
75
|
)
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
# Rubric
|
|
1
|
+
# Rubric Graders
|
|
2
2
|
|
|
3
|
-
Rubrics are defined as `
|
|
3
|
+
Rubrics are defined as `assert` entries with plain strings or `type: llm-rubric`. They support binary checklist grading and score-range analytic grading.
|
|
4
4
|
|
|
5
5
|
## Field Reference
|
|
6
6
|
|
|
7
7
|
| Field | Type | Default | Description |
|
|
8
8
|
|-------|------|---------|-------------|
|
|
9
|
-
| `type` | string | required |
|
|
10
|
-
| `
|
|
9
|
+
| `type` | string | required | Use `llm-rubric` for a structured rubric; plain strings in `assert` use the same grader path |
|
|
10
|
+
| `value` | array | required | List of criterion strings or objects |
|
|
11
11
|
| `required` | boolean or number | - | Gate: `true` requires score >= 0.8; a number (0–1) sets a custom threshold |
|
|
12
12
|
|
|
13
13
|
### Criterion Object Fields
|
|
@@ -20,38 +20,37 @@ Rubrics are defined as `assertions` entries with `type: rubrics`. They support b
|
|
|
20
20
|
| `weight` | number | 1.0 | Relative importance |
|
|
21
21
|
| `required` | boolean | true | Failing forces verdict to 'fail' (checklist mode) |
|
|
22
22
|
| `min_score` | number | - | Minimum score (0–1) to pass this criterion |
|
|
23
|
-
| `required_min_score` | integer | - | **Deprecated.** Use `min_score` instead. Legacy 0–10 scale. |
|
|
24
23
|
| `score_ranges` | map or array | - | Score range definitions for analytic scoring |
|
|
25
24
|
|
|
26
25
|
## String Shorthand (Recommended)
|
|
27
26
|
|
|
28
|
-
Plain strings in `
|
|
27
|
+
Plain strings in `assert` are automatically treated as rubric criteria:
|
|
29
28
|
|
|
30
29
|
```yaml
|
|
31
|
-
|
|
30
|
+
assert:
|
|
32
31
|
- Mentions divide-and-conquer approach
|
|
33
32
|
- Explains partition step
|
|
34
33
|
- States time complexity
|
|
35
34
|
```
|
|
36
35
|
|
|
37
|
-
Equivalent to the full form with `type:
|
|
36
|
+
Equivalent to the full form with `type: llm-rubric`. Use the full form only when you need weights, `required: false`, or `score_ranges`.
|
|
38
37
|
|
|
39
|
-
Mixed strings and objects are supported in `
|
|
38
|
+
Mixed strings and objects are supported in `assert`: strings are grouped into a single rubric grader at the position of the first string:
|
|
40
39
|
|
|
41
40
|
```yaml
|
|
42
|
-
|
|
43
|
-
- Mentions divide-and-conquer approach # grouped into
|
|
44
|
-
- type:
|
|
41
|
+
assert:
|
|
42
|
+
- Mentions divide-and-conquer approach # grouped into a rubric
|
|
43
|
+
- type: script
|
|
45
44
|
command: [check_syntax.py]
|
|
46
|
-
- States time complexity # grouped into
|
|
45
|
+
- States time complexity # grouped into a rubric
|
|
47
46
|
```
|
|
48
47
|
|
|
49
48
|
## Checklist Mode
|
|
50
49
|
|
|
51
50
|
```yaml
|
|
52
|
-
|
|
53
|
-
- type:
|
|
54
|
-
|
|
51
|
+
assert:
|
|
52
|
+
- type: llm-rubric
|
|
53
|
+
value:
|
|
55
54
|
- Mentions divide-and-conquer approach
|
|
56
55
|
- id: complexity
|
|
57
56
|
outcome: States time complexity correctly
|
|
@@ -68,9 +67,9 @@ assertions:
|
|
|
68
67
|
Use `operator` when outcome text should carry grading intent without embedding words like "must not contradict" in the outcome itself:
|
|
69
68
|
|
|
70
69
|
```yaml
|
|
71
|
-
|
|
72
|
-
- type:
|
|
73
|
-
|
|
70
|
+
assert:
|
|
71
|
+
- type: llm-rubric
|
|
72
|
+
value:
|
|
74
73
|
- id: supported-fact
|
|
75
74
|
operator: correctness
|
|
76
75
|
outcome: States revenue increased to $10M
|
|
@@ -87,9 +86,9 @@ assertions:
|
|
|
87
86
|
Shorthand map format (recommended):
|
|
88
87
|
|
|
89
88
|
```yaml
|
|
90
|
-
|
|
91
|
-
- type:
|
|
92
|
-
|
|
89
|
+
assert:
|
|
90
|
+
- type: llm-rubric
|
|
91
|
+
value:
|
|
93
92
|
- id: correctness
|
|
94
93
|
weight: 2.0
|
|
95
94
|
min_score: 0.7
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: agentv-trace-analyst
|
|
3
3
|
description: >-
|
|
4
|
-
Analyze AgentV evaluation traces and result JSONL files using `agentv inspect` and `agentv compare` CLI commands.
|
|
4
|
+
Analyze AgentV evaluation traces and result JSONL files using `agentv inspect` and `agentv results compare` CLI commands.
|
|
5
5
|
Use when asked to inspect AgentV eval results, find regressions between AgentV evaluation runs,
|
|
6
6
|
identify failure patterns in AgentV trace data, analyze tool trajectories, or compute cost/latency/score statistics
|
|
7
7
|
from AgentV result files.
|
|
@@ -26,7 +26,7 @@ agentv inspect show <result-file> [--test-id <id>] [--tree] [--format json|table
|
|
|
26
26
|
agentv inspect stats <result-file> [--group-by target|suite|test-id] [--format json|table]
|
|
27
27
|
|
|
28
28
|
# A/B comparison between runs
|
|
29
|
-
agentv compare <baseline.jsonl> <candidate.jsonl> [--threshold 0.1] [--format json|table]
|
|
29
|
+
agentv results compare <baseline.jsonl> <candidate.jsonl> [--threshold 0.1] [--format json|table]
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
## Analysis Workflow
|
|
@@ -81,7 +81,7 @@ The tree view shows the agent's execution path — LLM calls interspersed with t
|
|
|
81
81
|
### 5. Compare runs
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
|
-
agentv compare <baseline.jsonl> <candidate.jsonl>
|
|
84
|
+
agentv results compare <baseline.jsonl> <candidate.jsonl>
|
|
85
85
|
```
|
|
86
86
|
|
|
87
87
|
Look for:
|
|
@@ -123,7 +123,7 @@ agentv inspect show <result-file> --format json \
|
|
|
123
123
|
| jq '[.[].trace.tool_calls // {} | to_entries[]] | group_by(.key) | .[] | {tool: .[0].key, total_calls: ([.[].value] | add)}'
|
|
124
124
|
|
|
125
125
|
# Find regressions > 0.1 between two runs
|
|
126
|
-
agentv compare baseline.jsonl candidate.jsonl --format json \
|
|
126
|
+
agentv results compare baseline.jsonl candidate.jsonl --format json \
|
|
127
127
|
| jq '.matched[] | select(.delta < -0.1) | {test_id: .testId, delta, from: .score1, to: .score2}'
|
|
128
128
|
```
|
|
129
129
|
|
|
@@ -1,96 +1,97 @@
|
|
|
1
1
|
# A list of all supported evaluation targets for the project.
|
|
2
2
|
# Each target defines a provider and its specific configuration.
|
|
3
3
|
# Actual values for paths/keys are stored in the local .env file.
|
|
4
|
+
# Agent and CLI targets use grader_target to reference an LLM target for scoring.
|
|
4
5
|
|
|
5
6
|
targets:
|
|
6
|
-
-
|
|
7
|
+
- id: default
|
|
7
8
|
provider: azure
|
|
8
|
-
endpoint:
|
|
9
|
-
api_key:
|
|
10
|
-
model:
|
|
11
|
-
# version:
|
|
9
|
+
endpoint: "{{ env.AZURE_OPENAI_ENDPOINT }}"
|
|
10
|
+
api_key: "{{ env.AZURE_OPENAI_API_KEY }}"
|
|
11
|
+
model: "{{ env.AZURE_DEPLOYMENT_NAME }}"
|
|
12
|
+
# version: "{{ env.AZURE_OPENAI_API_VERSION }}" # Optional: uncomment to override default (v1)
|
|
12
13
|
|
|
13
|
-
-
|
|
14
|
+
- id: codex
|
|
14
15
|
provider: codex
|
|
15
|
-
|
|
16
|
+
grader_target: azure-llm
|
|
16
17
|
# Uses the Codex CLI (defaults to `codex` on PATH)
|
|
17
|
-
# executable:
|
|
18
|
+
# executable: "{{ env.CODEX_CLI_PATH }}" # Optional: override executable path
|
|
18
19
|
# args: # Optional additional CLI arguments
|
|
19
20
|
# - --profile
|
|
20
|
-
# -
|
|
21
|
+
# - "{{ env.CODEX_PROFILE }}"
|
|
21
22
|
# - --model
|
|
22
|
-
# -
|
|
23
|
+
# - "{{ env.CODEX_MODEL }}"
|
|
23
24
|
# - --ask-for-approval
|
|
24
|
-
# -
|
|
25
|
-
cwd:
|
|
26
|
-
log_dir:
|
|
25
|
+
# - "{{ env.CODEX_APPROVAL_PRESET }}"
|
|
26
|
+
cwd: "{{ env.CODEX_WORKSPACE_DIR }}" # Where scratch workspaces are created
|
|
27
|
+
log_dir: "{{ env.CODEX_LOG_DIR }}" # Optional: where Codex CLI stream logs are stored (defaults to ./.agentv/logs/codex)
|
|
27
28
|
stream_log: raw # Optional: 'summary' for consolidated logs or 'raw' for per-event logs
|
|
28
29
|
|
|
29
30
|
# Claude - Anthropic's Claude Agent SDK
|
|
30
|
-
-
|
|
31
|
+
- id: claude
|
|
31
32
|
provider: claude
|
|
32
|
-
|
|
33
|
+
grader_target: azure-llm
|
|
33
34
|
# Uses the @anthropic-ai/claude-agent-sdk
|
|
34
35
|
# model: claude-sonnet-4-20250514 # Optional: override model
|
|
35
|
-
# cwd:
|
|
36
|
+
# cwd: "{{ env.CLAUDE_WORKSPACE_DIR }}" # Optional: working directory (defaults to process.cwd())
|
|
36
37
|
# max_turns: 50 # Optional: max conversation turns
|
|
37
38
|
# max_budget_usd: 5.0 # Optional: max cost budget in USD
|
|
38
|
-
# log_dir:
|
|
39
|
+
# log_dir: "{{ env.CLAUDE_LOG_DIR }}" # Optional: where stream logs are stored (defaults to ./.agentv/logs/claude)
|
|
39
40
|
stream_log: raw # Optional: 'summary' for consolidated logs or 'raw' for per-event logs
|
|
40
41
|
# system_prompt: optional override (default instructs agent to include code in response)
|
|
41
42
|
|
|
42
|
-
-
|
|
43
|
+
- id: azure-llm
|
|
43
44
|
provider: azure
|
|
44
|
-
endpoint:
|
|
45
|
-
api_key:
|
|
46
|
-
model:
|
|
47
|
-
version:
|
|
45
|
+
endpoint: "{{ env.AZURE_OPENAI_ENDPOINT }}"
|
|
46
|
+
api_key: "{{ env.AZURE_OPENAI_API_KEY }}"
|
|
47
|
+
model: "{{ env.AZURE_DEPLOYMENT_NAME }}"
|
|
48
|
+
version: "{{ env.AZURE_OPENAI_API_VERSION }}"
|
|
48
49
|
|
|
49
|
-
-
|
|
50
|
+
- id: gemini-llm
|
|
50
51
|
provider: gemini
|
|
51
|
-
api_key:
|
|
52
|
-
model:
|
|
52
|
+
api_key: "{{ env.GOOGLE_GENERATIVE_AI_API_KEY }}"
|
|
53
|
+
model: "{{ env.GEMINI_MODEL_NAME }}"
|
|
53
54
|
|
|
54
|
-
-
|
|
55
|
+
- id: local_cli
|
|
55
56
|
provider: cli
|
|
56
|
-
|
|
57
|
+
grader_target: azure-llm
|
|
57
58
|
# Passes the fully rendered prompt and any attached files to a local Python script
|
|
58
59
|
# NOTE: Do not add quotes around {PROMPT} or {FILES} - they are already shell-escaped
|
|
59
60
|
command: uv run ./mock_cli.py --prompt {PROMPT} {FILES} --output {OUTPUT_FILE}
|
|
60
61
|
# Format for each file in {FILES}. {path} and {basename} are automatically shell-escaped, so no quotes needed
|
|
61
62
|
files_format: --file {path}
|
|
62
63
|
# Optional working directory resolved from .env
|
|
63
|
-
cwd:
|
|
64
|
+
cwd: "{{ env.CLI_EVALS_DIR }}"
|
|
64
65
|
healthcheck:
|
|
65
66
|
command: uv run ./mock_cli.py --healthcheck
|
|
66
67
|
|
|
67
|
-
#
|
|
68
|
+
# -- MiMo (Xiaomi) via OpenRouter -----------------------------------
|
|
68
69
|
# All MiMo models are available through OpenRouter with OpenAI-compatible API.
|
|
69
70
|
# See https://openrouter.ai/xiaomi/mimo-v2.5-pro for pricing and limits.
|
|
70
71
|
#
|
|
71
72
|
# Models:
|
|
72
|
-
# mimo-v2.5-pro
|
|
73
|
-
# mimo-v2-pro
|
|
74
|
-
# mimo-v2.5
|
|
75
|
-
# mimo-v2-flash
|
|
76
|
-
# mimo-v2-omni
|
|
77
|
-
-
|
|
73
|
+
# mimo-v2.5-pro - 1M context, 131K output, flagship
|
|
74
|
+
# mimo-v2-pro - 1M context, ~131K output
|
|
75
|
+
# mimo-v2.5 - 1M context, ~131K output, multimodal
|
|
76
|
+
# mimo-v2-flash - 262K context, 65K output, fast MoE (open-source)
|
|
77
|
+
# mimo-v2-omni - 262K context, 65K output, omni-modal
|
|
78
|
+
- id: mimo
|
|
78
79
|
provider: openrouter
|
|
79
|
-
api_key:
|
|
80
|
+
api_key: "{{ env.OPENROUTER_API_KEY }}"
|
|
80
81
|
model: xiaomi/mimo-v2.5-pro
|
|
81
82
|
|
|
82
|
-
-
|
|
83
|
+
- id: mimo-flash
|
|
83
84
|
provider: openrouter
|
|
84
|
-
api_key:
|
|
85
|
+
api_key: "{{ env.OPENROUTER_API_KEY }}"
|
|
85
86
|
model: xiaomi/mimo-v2-flash
|
|
86
87
|
|
|
87
|
-
#
|
|
88
|
+
# -- Direct provider (not through OpenRouter) -----------------------
|
|
88
89
|
# For providers not in pi-ai's model registry, set max_output_tokens
|
|
89
90
|
# to match your model's actual output limit. Without this, the default
|
|
90
91
|
# is 16K which may cap output below the model's capability.
|
|
91
92
|
# - name: mimo-direct
|
|
92
93
|
# provider: openai
|
|
93
94
|
# base_url: https://token-plan-sgp.xiaomimimo.com/v1
|
|
94
|
-
# api_key:
|
|
95
|
+
# api_key: "{{ env.XIAOMI_MIMO_API_KEY }}"
|
|
95
96
|
# model: xiaomi/mimo-v2.5-pro
|
|
96
97
|
# max_output_tokens: 131072
|
|
@@ -2,12 +2,13 @@ import { createRequire } from 'node:module'; const require = createRequire(impor
|
|
|
2
2
|
import {
|
|
3
3
|
loadTsEvalFile,
|
|
4
4
|
loadTsEvalSuite
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-3S6A2RKR.js";
|
|
6
|
+
import "./chunk-7BGERE6L.js";
|
|
7
|
+
import "./chunk-PEUTJS7B.js";
|
|
7
8
|
import "./chunk-M7BUKBAF.js";
|
|
8
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-QMRVH5ZP.js";
|
|
9
10
|
export {
|
|
10
11
|
loadTsEvalFile,
|
|
11
12
|
loadTsEvalSuite
|
|
12
13
|
};
|
|
13
|
-
//# sourceMappingURL=ts-eval-loader-
|
|
14
|
+
//# sourceMappingURL=ts-eval-loader-OMG2JBHP-OP5RR7A3.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentv",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.2.0-next.1",
|
|
4
4
|
"description": "CLI entry point for AgentV",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -28,12 +28,9 @@
|
|
|
28
28
|
"test:watch": "bun test --watch"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@anthropic-ai/claude-agent-sdk": "^0.2.49",
|
|
32
|
-
"@github/copilot-sdk": "^1.0.3",
|
|
33
31
|
"@hono/node-server": "^1.19.11",
|
|
34
32
|
"@inquirer/prompts": "^8.2.1",
|
|
35
33
|
"@earendil-works/pi-ai": "^0.74.0",
|
|
36
|
-
"@openai/codex-sdk": "^0.136.0",
|
|
37
34
|
"cmd-ts": "^0.14.3",
|
|
38
35
|
"dotenv": "^16.4.5",
|
|
39
36
|
"fast-glob": "^3.3.3",
|
|
@@ -44,13 +41,31 @@
|
|
|
44
41
|
"yaml": "^2.8.3"
|
|
45
42
|
},
|
|
46
43
|
"peerDependencies": {
|
|
44
|
+
"@anthropic-ai/claude-agent-sdk": "^0.2.89",
|
|
45
|
+
"@github/copilot-sdk": "^1.0.3",
|
|
46
|
+
"@openai/codex-sdk": "^0.136.0",
|
|
47
47
|
"@earendil-works/pi-coding-agent": "^0.74.0"
|
|
48
48
|
},
|
|
49
49
|
"peerDependenciesMeta": {
|
|
50
|
+
"@anthropic-ai/claude-agent-sdk": {
|
|
51
|
+
"optional": true
|
|
52
|
+
},
|
|
53
|
+
"@github/copilot-sdk": {
|
|
54
|
+
"optional": true
|
|
55
|
+
},
|
|
56
|
+
"@openai/codex-sdk": {
|
|
57
|
+
"optional": true
|
|
58
|
+
},
|
|
50
59
|
"@earendil-works/pi-coding-agent": {
|
|
51
60
|
"optional": true
|
|
52
61
|
}
|
|
53
62
|
},
|
|
63
|
+
"optionalDependencies": {
|
|
64
|
+
"@anthropic-ai/claude-agent-sdk": "^0.2.89",
|
|
65
|
+
"@github/copilot-sdk": "^1.0.3",
|
|
66
|
+
"@openai/codex-sdk": "^0.136.0",
|
|
67
|
+
"@earendil-works/pi-coding-agent": "^0.74.0"
|
|
68
|
+
},
|
|
54
69
|
"devDependencies": {
|
|
55
70
|
"@agentv/core": "workspace:*",
|
|
56
71
|
"@agentv/sdk": "workspace:*",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/eval/artifact-writer.ts","../src/commands/eval/task-bundle.ts","../src/utils/case-conversion.ts"],"sourcesContent":["import path from 'node:path';\n\nimport {\n type AdditionalResultArtifactsWriter,\n type AggregateGradingArtifact,\n type EvalTest,\n type EvaluationResult,\n type ExperimentArtifactMetadata,\n type ExportDuplicatePolicy,\n type GradingArtifact,\n type IndexArtifactEntry,\n RESULT_INDEX_FILENAME,\n RUN_SUMMARY_FILENAME,\n type ResultIndexArtifact,\n type RunSummaryArtifact,\n type TimingArtifact,\n aggregateRunDir,\n buildAggregateGradingArtifact,\n buildIndexArtifactEntry as buildCoreIndexArtifactEntry,\n buildResultIndexArtifact as buildCoreResultIndexArtifact,\n buildGradingArtifact,\n buildRunSummaryArtifact,\n buildTestTargetKey,\n buildTimingArtifact,\n deduplicateByTestIdTarget,\n parseJsonlResults,\n writeArtifacts,\n writeArtifactsFromResults as writeCoreArtifactsFromResults,\n writePerTestArtifacts as writeCorePerTestArtifacts,\n writeInitialRunSummaryArtifact,\n} from '@agentv/core';\nimport type { TargetDefinition } from '@agentv/core';\n\nimport {\n type MaterializedTaskBundlePaths,\n type TaskBundleTargetSelection,\n materializeTaskBundle,\n} from './task-bundle.js';\n\nexport {\n aggregateRunDir,\n buildAggregateGradingArtifact,\n buildRunSummaryArtifact,\n buildGradingArtifact,\n buildTestTargetKey,\n buildTimingArtifact,\n deduplicateByTestIdTarget,\n parseJsonlResults,\n RESULT_INDEX_FILENAME,\n RUN_SUMMARY_FILENAME,\n writeArtifacts,\n writeInitialRunSummaryArtifact,\n};\nexport type {\n AggregateGradingArtifact,\n GradingArtifact,\n IndexArtifactEntry,\n ResultIndexArtifact,\n RunSummaryArtifact,\n TimingArtifact,\n};\n\nfunction toRelativeArtifactPath(outputDir: string, filePath: string): string {\n return path.relative(outputDir, filePath).split(path.sep).join('/');\n}\n\nfunction buildTaskBundleIndexFields(\n outputDir: string,\n taskBundle: MaterializedTaskBundlePaths | undefined,\n): Pick<\n IndexArtifactEntry,\n 'task_dir' | 'eval_path' | 'targets_path' | 'files_path' | 'graders_path'\n> {\n if (!taskBundle) {\n return {};\n }\n return {\n task_dir: toRelativeArtifactPath(outputDir, taskBundle.taskDir),\n eval_path: toRelativeArtifactPath(outputDir, taskBundle.evalPath),\n targets_path: toRelativeArtifactPath(outputDir, taskBundle.targetsPath),\n ...(taskBundle.filesPath\n ? { files_path: toRelativeArtifactPath(outputDir, taskBundle.filesPath) }\n : {}),\n ...(taskBundle.gradersPath\n ? { graders_path: toRelativeArtifactPath(outputDir, taskBundle.gradersPath) }\n : {}),\n };\n}\n\nexport function buildIndexArtifactEntry(\n result: EvaluationResult,\n options: {\n outputDir: string;\n artifactDir?: string;\n gradingPath?: string;\n timingPath?: string;\n summaryPath?: string;\n outputPath?: string;\n answerPath?: string;\n tracePath?: string;\n transcriptPath?: string;\n metricsPath?: string;\n rawProviderLogPath?: string;\n responsePath?: string;\n taskBundle?: MaterializedTaskBundlePaths;\n },\n): IndexArtifactEntry {\n return buildCoreIndexArtifactEntry(result, {\n ...options,\n extraIndexFields: buildTaskBundleIndexFields(options.outputDir, options.taskBundle),\n });\n}\n\nexport function buildResultIndexArtifact(\n result: EvaluationResult,\n taskBundle?: MaterializedTaskBundlePaths,\n): ResultIndexArtifact {\n const artifactSubdir = (buildCoreResultIndexArtifact(result).artifact_dir ?? '').trim();\n const extraIndexFields = taskBundle\n ? {\n task_dir: path.posix.join(artifactSubdir, 'task'),\n eval_path: path.posix.join(artifactSubdir, 'task', 'EVAL.yaml'),\n targets_path: path.posix.join(artifactSubdir, 'task', 'targets.yaml'),\n ...(taskBundle.filesPath\n ? { files_path: path.posix.join(artifactSubdir, 'task', 'files') }\n : {}),\n ...(taskBundle.gradersPath\n ? { graders_path: path.posix.join(artifactSubdir, 'task', 'graders') }\n : {}),\n }\n : undefined;\n return buildCoreResultIndexArtifact(result, extraIndexFields);\n}\n\nfunction targetSelectionKey(evalFileAbsolutePath: string | undefined, targetName: string): string {\n return `${evalFileAbsolutePath ? path.resolve(evalFileAbsolutePath) : ''}::${targetName}`;\n}\n\nfunction buildTargetSelectionMap(\n selections: readonly TaskBundleTargetSelection[] | undefined,\n): Map<string, TaskBundleTargetSelection> {\n const targets = new Map<string, TaskBundleTargetSelection>();\n for (const selection of selections ?? []) {\n targets.set(\n targetSelectionKey(selection.evalFileAbsolutePath, selection.targetName),\n selection,\n );\n if (selection.resolvedTargetName) {\n targets.set(\n targetSelectionKey(selection.evalFileAbsolutePath, selection.resolvedTargetName),\n selection,\n );\n }\n if (!selection.evalFileAbsolutePath) {\n targets.set(targetSelectionKey(undefined, selection.targetName), selection);\n if (selection.resolvedTargetName) {\n targets.set(targetSelectionKey(undefined, selection.resolvedTargetName), selection);\n }\n }\n }\n return targets;\n}\n\nfunction findTargetSelection(\n result: EvaluationResult,\n test: EvalTest | undefined,\n targets: ReadonlyMap<string, TaskBundleTargetSelection>,\n): TaskBundleTargetSelection | undefined {\n const targetName = result.target ?? 'unknown';\n const evalFileAbsolutePath = test?.source?.evalFileAbsolutePath;\n return (\n targets.get(targetSelectionKey(evalFileAbsolutePath, targetName)) ??\n targets.get(targetSelectionKey(undefined, targetName))\n );\n}\n\nfunction createTaskBundleArtifactsWriter(options?: {\n cwd?: string;\n repoRoot?: string;\n taskBundleTargets?: readonly TaskBundleTargetSelection[];\n}): AdditionalResultArtifactsWriter | undefined {\n const targetSelections = buildTargetSelectionMap(options?.taskBundleTargets);\n if (targetSelections.size === 0) {\n return undefined;\n }\n\n return async ({ outputDir, result, sourceTest, testDir }) => {\n const targetSelection = findTargetSelection(result, sourceTest, targetSelections);\n if (!sourceTest || !targetSelection) {\n return undefined;\n }\n\n const taskBundle = await materializeTaskBundle({\n test: sourceTest,\n targetName: targetSelection.targetName,\n targetDefinitions: targetSelection.definitions as readonly TargetDefinition[],\n outputDir: testDir,\n cwd: options?.cwd,\n repoRoot: options?.repoRoot,\n });\n\n return buildTaskBundleIndexFields(outputDir, taskBundle);\n };\n}\n\nexport async function writePerTestArtifacts(\n results: readonly EvaluationResult[],\n outputDir: string,\n options?: {\n experiment?: string;\n runId?: string;\n duplicatePolicy?: ExportDuplicatePolicy;\n cwd?: string;\n repoRoot?: string;\n sourceTests?: readonly EvalTest[];\n taskBundleTargets?: readonly TaskBundleTargetSelection[];\n },\n): Promise<void> {\n await writeCorePerTestArtifacts(results, outputDir, {\n experiment: options?.experiment,\n runId: options?.runId,\n duplicatePolicy: options?.duplicatePolicy,\n sourceTests: options?.sourceTests,\n additionalArtifacts: createTaskBundleArtifactsWriter(options),\n });\n}\n\nexport async function writeArtifactsFromResults(\n results: readonly EvaluationResult[],\n outputDir: string,\n options?: {\n evalFile?: string;\n experiment?: string;\n experimentMetadata?: ExperimentArtifactMetadata;\n plannedTestCount?: number;\n runId?: string;\n duplicatePolicy?: ExportDuplicatePolicy;\n cwd?: string;\n repoRoot?: string;\n sourceTests?: readonly EvalTest[];\n taskBundleTargets?: readonly TaskBundleTargetSelection[];\n },\n): Promise<{\n testArtifactDir: string;\n summaryPath: string;\n indexPath: string;\n}> {\n return writeCoreArtifactsFromResults(results, outputDir, {\n evalFile: options?.evalFile,\n experiment: options?.experiment,\n experimentMetadata: options?.experimentMetadata,\n plannedTestCount: options?.plannedTestCount,\n runId: options?.runId,\n duplicatePolicy: options?.duplicatePolicy,\n sourceTests: options?.sourceTests,\n additionalArtifacts: createTaskBundleArtifactsWriter(options),\n });\n}\n","import { createHash } from 'node:crypto';\nimport { mkdir, readFile, readdir, stat, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport {\n type EvalSourceReference,\n type EvalTest,\n type JsonObject,\n type TargetDefinition,\n type TestMessage,\n type WorkspaceConfig,\n parseYamlValue,\n} from '@agentv/core';\nimport { stringify as stringifyYaml } from 'yaml';\n\nimport { toSnakeCaseDeep } from '../../utils/case-conversion.js';\n\nconst TASK_DIRNAME = 'task';\nconst TASK_EVAL_FILENAME = 'EVAL.yaml';\nconst TASK_TARGETS_FILENAME = 'targets.yaml';\nconst TASK_FILES_DIRNAME = 'files';\nconst TASK_GRADERS_DIRNAME = 'graders';\nconst BUNDLE_EVALS_DIRNAME = 'evals';\nconst BUNDLE_MANIFEST_FILENAME = 'agentv_bundle.json';\nconst BUNDLE_TARGETS_FILENAME = 'targets.yaml';\nconst BUNDLE_WORKSPACES_DIRNAME = 'workspaces';\nconst BUNDLE_SCRIPTS_DIRNAME = 'scripts';\nconst REDACTED_SOURCE_VALUE = '[redacted]';\nconst SECRET_KEY_PATTERN =\n /(?:api[_-]?key|authorization|bearer|credential|password|private[_-]?key|secret|token)/i;\nconst SOURCE_SECRET_LINE_PATTERN =\n /^(\\s*[\\w.-]*(?:api[_-]?key|authorization|bearer|credential|password|private[_-]?key|secret|token)[\\w.-]*\\s*:\\s*).+$/gim;\nconst SOURCE_SECRET_ASSIGNMENT_PATTERN =\n /^((?:--?)?[\\w.-]*(?:api[_-]?key|authorization|bearer|credential|password|private[_-]?key|secret|token)[\\w.-]*[=:]).+$/i;\nconst SOURCE_SECRET_FLAG_PATTERN =\n /^--?[\\w.-]*(?:api[_-]?key|authorization|bearer|credential|password|private[_-]?key|secret|token)[\\w.-]*$/i;\nconst SECRET_PATH_SEGMENT_PATTERN =\n /(^|[/\\\\._-])(?:\\.env(?:\\..*)?|id_rsa|id_dsa|id_ecdsa|id_ed25519|oauth|credentials?|secrets?|tokens?|private[_-]?key)(?:$|[/\\\\._-])/i;\nconst SKIPPED_DIR_NAMES = new Set([\n '.git',\n 'node_modules',\n '.agentv',\n '.ntm',\n '.beads',\n '.DS_Store',\n]);\n\nexport interface TaskBundleTargetSelection {\n readonly evalFileAbsolutePath?: string;\n readonly targetName: string;\n readonly resolvedTargetName?: string;\n readonly definitions: readonly TargetDefinition[];\n}\n\nexport interface MaterializeTaskBundleOptions {\n readonly test: EvalTest;\n readonly targetName: string;\n readonly targetDefinitions: readonly TargetDefinition[];\n readonly outputDir: string;\n readonly cwd?: string;\n readonly repoRoot?: string;\n}\n\nexport interface MaterializedTaskBundlePaths {\n readonly taskDir: string;\n readonly evalPath: string;\n readonly targetsPath: string;\n readonly filesPath?: string;\n readonly gradersPath?: string;\n}\n\nexport interface MaterializeEvalBundleOptions {\n readonly evalFilePath: string;\n readonly tests: readonly EvalTest[];\n readonly targetSelections: readonly TaskBundleTargetSelection[];\n readonly outputDir: string;\n readonly cwd?: string;\n readonly repoRoot?: string;\n readonly execution?: Record<string, unknown>;\n readonly now?: () => Date;\n}\n\nexport interface MaterializedEvalBundlePaths {\n readonly bundleDir: string;\n readonly evalsDir: string;\n readonly evalPath: string;\n readonly targetsPath: string;\n readonly manifestPath: string;\n readonly filesPath?: string;\n readonly gradersPath?: string;\n readonly workspacesPath?: string;\n readonly scriptsPath?: string;\n}\n\ntype BundleReferenceKind =\n | EvalSourceReference['kind']\n | 'expected_output_file'\n | 'workspace_template'\n | 'workspace_hook_command';\n\ninterface BundleSourceReference extends Omit<EvalSourceReference, 'kind'> {\n readonly kind: BundleReferenceKind;\n readonly location?: string;\n}\n\ninterface CopiedReference {\n readonly reference: BundleSourceReference;\n readonly localPath: string;\n readonly destinationPath: string;\n}\n\ninterface BundleReferenceFailure {\n readonly reference: BundleSourceReference;\n readonly reason: 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 toPortableRelativePath(root: string | undefined, candidate: string): string | undefined {\n if (!root) {\n return undefined;\n }\n const relative = path.relative(root, candidate);\n if (relative && !relative.startsWith('..') && !path.isAbsolute(relative)) {\n return relative.split(path.sep).join('/');\n }\n return undefined;\n}\n\nfunction safeRelativePath(value: string): string | undefined {\n const normalized = value.replace(/\\\\/g, '/').replace(/^\\/+/, '');\n const segments = normalized.split('/').filter((segment) => segment && segment !== '.');\n if (segments.length === 0 || segments.some((segment) => segment === '..')) {\n return undefined;\n }\n return segments.join('/');\n}\n\nfunction hashedExternalPath(resolvedPath: string): string {\n const hash = createHash('sha256').update(path.resolve(resolvedPath)).digest('hex').slice(0, 10);\n const basename = path.basename(resolvedPath) || 'asset';\n return `external/${hash}-${basename}`;\n}\n\nfunction relativeReferencePath(\n reference: BundleSourceReference,\n options: Pick<MaterializeTaskBundleOptions, 'cwd' | 'repoRoot'>,\n): string | undefined {\n if (reference.resolvedPath) {\n const resolved = path.resolve(reference.resolvedPath);\n const portable =\n toPortableRelativePath(options.repoRoot, resolved) ??\n toPortableRelativePath(options.cwd, resolved);\n return safeRelativePath(portable ?? hashedExternalPath(resolved));\n }\n return safeRelativePath(reference.displayPath);\n}\n\nfunction referenceBucket(\n reference: BundleSourceReference,\n): 'files' | 'graders' | 'workspaces' | 'scripts' {\n if (reference.kind === 'input_file' || reference.kind === 'expected_output_file') {\n return TASK_FILES_DIRNAME;\n }\n if (reference.kind === 'workspace_template') {\n return BUNDLE_WORKSPACES_DIRNAME;\n }\n if (reference.kind === 'workspace_hook_command') {\n return BUNDLE_SCRIPTS_DIRNAME;\n }\n return TASK_GRADERS_DIRNAME;\n}\n\nfunction isLikelyBinary(buffer: Buffer): boolean {\n return buffer.subarray(0, Math.min(buffer.length, 8000)).includes(0);\n}\n\nfunction redactSecretLikeLines(content: string): string {\n return content.replace(SOURCE_SECRET_LINE_PATTERN, `$1${REDACTED_SOURCE_VALUE}`);\n}\n\nfunction isSecretLikePath(filePath: string): boolean {\n return SECRET_PATH_SEGMENT_PATTERN.test(filePath.replace(/\\\\/g, '/'));\n}\n\nfunction preservesPlaceholder(value: string): boolean {\n return value.includes('${{');\n}\n\nfunction sanitizeSecretString(value: string, keyHint?: string): string {\n if (preservesPlaceholder(value)) {\n return value;\n }\n if (keyHint && SECRET_KEY_PATTERN.test(keyHint)) {\n return REDACTED_SOURCE_VALUE;\n }\n if (SOURCE_SECRET_ASSIGNMENT_PATTERN.test(value)) {\n return value.replace(SOURCE_SECRET_ASSIGNMENT_PATTERN, `$1${REDACTED_SOURCE_VALUE}`);\n }\n return value;\n}\n\nfunction sanitizeBundleValue(value: unknown, keyHint?: string): unknown {\n if (typeof value === 'string') {\n return sanitizeSecretString(value, keyHint);\n }\n if (Array.isArray(value)) {\n let redactNext = false;\n return value.map((item) => {\n if (typeof item !== 'string') {\n return sanitizeBundleValue(item);\n }\n if (redactNext) {\n redactNext = false;\n return preservesPlaceholder(item) ? item : REDACTED_SOURCE_VALUE;\n }\n if (SOURCE_SECRET_FLAG_PATTERN.test(item)) {\n redactNext = true;\n return item;\n }\n return sanitizeSecretString(item);\n });\n }\n if (isRecord(value)) {\n const sanitized: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n sanitized[key] = sanitizeBundleValue(child, key);\n }\n return sanitized;\n }\n return value;\n}\n\nasync function copyFileRedactingText(\n sourcePath: string,\n destinationPath: string,\n): Promise<boolean> {\n await mkdir(path.dirname(destinationPath), { recursive: true });\n if (isSecretLikePath(sourcePath)) {\n await writeFile(destinationPath, `${REDACTED_SOURCE_VALUE}\\n`, 'utf8');\n return true;\n }\n\n const content = await readFile(sourcePath);\n if (isLikelyBinary(content)) {\n await writeFile(destinationPath, content);\n return true;\n }\n\n const redacted = redactSecretLikeLines(content.toString('utf8').replace(/\\r\\n/g, '\\n'));\n await writeFile(destinationPath, redacted, 'utf8');\n return true;\n}\n\nasync function copyDirectory(sourcePath: string, destinationPath: string): Promise<boolean> {\n if (isSecretLikePath(sourcePath)) {\n return false;\n }\n\n await mkdir(destinationPath, { recursive: true });\n let copiedAny = false;\n const entries = await readdir(sourcePath, { withFileTypes: true });\n for (const entry of entries) {\n if (SKIPPED_DIR_NAMES.has(entry.name) || isSecretLikePath(entry.name)) {\n continue;\n }\n const sourceChild = path.join(sourcePath, entry.name);\n const destinationChild = path.join(destinationPath, entry.name);\n if (entry.isDirectory()) {\n copiedAny = (await copyDirectory(sourceChild, destinationChild)) || copiedAny;\n } else if (entry.isFile()) {\n copiedAny = (await copyFileRedactingText(sourceChild, destinationChild)) || copiedAny;\n }\n }\n return copiedAny;\n}\n\nfunction shouldCopyDirectory(reference: BundleSourceReference): boolean {\n if (reference.kind !== 'code_grader_cwd') {\n return true;\n }\n return !path.isAbsolute(reference.displayPath);\n}\n\nasync function copyReferenceWithFailure(\n reference: BundleSourceReference,\n taskDir: string,\n options: Pick<MaterializeTaskBundleOptions, 'cwd' | 'repoRoot'>,\n): Promise<{ copied?: CopiedReference; failure?: BundleReferenceFailure }> {\n if (!reference.resolvedPath) {\n return {\n failure: {\n reference,\n reason: `${reference.location ?? reference.kind} has no resolved path: ${reference.displayPath}`,\n },\n };\n }\n\n const relPath = relativeReferencePath(reference, options);\n if (!relPath) {\n return {\n failure: {\n reference,\n reason: `${reference.location ?? reference.kind} could not be assigned a portable path: ${reference.displayPath}`,\n },\n };\n }\n\n const bucket = referenceBucket(reference);\n const localPath = `${bucket}/${relPath}`;\n const destinationPath = path.join(taskDir, localPath);\n const sourcePath = path.resolve(reference.resolvedPath);\n const sourceStat = await stat(sourcePath).catch(() => undefined);\n if (!sourceStat) {\n return {\n failure: {\n reference,\n reason: `${reference.location ?? reference.kind} not found: ${reference.displayPath} (resolved to ${sourcePath})`,\n },\n };\n }\n\n if (sourceStat.isDirectory()) {\n if (!shouldCopyDirectory(reference)) {\n return {\n failure: {\n reference,\n reason: `${reference.location ?? reference.kind} uses an absolute directory that is not safe to copy automatically: ${reference.displayPath}`,\n },\n };\n }\n if (!(await copyDirectory(sourcePath, destinationPath))) {\n return {\n failure: {\n reference,\n reason: `${reference.location ?? reference.kind} directory contained no bundleable files: ${reference.displayPath}`,\n },\n };\n }\n } else if (sourceStat.isFile()) {\n if (!(await copyFileRedactingText(sourcePath, destinationPath))) {\n return {\n failure: {\n reference,\n reason: `${reference.location ?? reference.kind} could not be copied: ${reference.displayPath}`,\n },\n };\n }\n } else {\n return {\n failure: {\n reference,\n reason: `${reference.location ?? reference.kind} is not a regular file or directory: ${reference.displayPath}`,\n },\n };\n }\n\n return { copied: { reference, localPath: localPath.split(path.sep).join('/'), destinationPath } };\n}\n\nasync function copyReference(\n reference: BundleSourceReference,\n taskDir: string,\n options: Pick<MaterializeTaskBundleOptions, 'cwd' | 'repoRoot'>,\n): Promise<CopiedReference | undefined> {\n return (await copyReferenceWithFailure(reference, taskDir, options)).copied;\n}\n\nasync function copyReferences(\n references: readonly BundleSourceReference[],\n taskDir: string,\n options: Pick<MaterializeTaskBundleOptions, 'cwd' | 'repoRoot'>,\n): Promise<readonly CopiedReference[]> {\n const copied: CopiedReference[] = [];\n const seenDestinations = new Set<string>();\n for (const reference of references) {\n const result = await copyReference(reference, taskDir, options);\n if (!result || seenDestinations.has(result.destinationPath)) {\n continue;\n }\n seenDestinations.add(result.destinationPath);\n copied.push(result);\n }\n return copied;\n}\n\nasync function copyReferencesStrict(\n references: readonly BundleSourceReference[],\n taskDir: string,\n options: Pick<MaterializeEvalBundleOptions, 'cwd' | 'repoRoot'>,\n): Promise<{\n readonly copied: readonly CopiedReference[];\n readonly failures: readonly BundleReferenceFailure[];\n}> {\n const copied: CopiedReference[] = [];\n const failures: BundleReferenceFailure[] = [];\n const seenDestinations = new Set<string>();\n const seenFailures = new Set<string>();\n\n for (const reference of references) {\n const result = await copyReferenceWithFailure(reference, taskDir, options);\n if (result.copied) {\n if (seenDestinations.has(result.copied.destinationPath)) {\n continue;\n }\n seenDestinations.add(result.copied.destinationPath);\n copied.push(result.copied);\n continue;\n }\n\n if (result.failure) {\n const key = `${result.failure.reference.kind}:${result.failure.reference.displayPath}:${result.failure.reason}`;\n if (!seenFailures.has(key)) {\n seenFailures.add(key);\n failures.push(result.failure);\n }\n }\n }\n\n return { copied, failures };\n}\n\nfunction addRewrite(rewrites: Map<string, string>, from: string | undefined, to: string): void {\n if (!from || from.trim().length === 0) {\n return;\n }\n rewrites.set(from, to);\n}\n\nfunction buildPathRewrites(copiedReferences: readonly CopiedReference[]): Map<string, string> {\n const rewrites = new Map<string, string>();\n for (const { reference, localPath } of copiedReferences) {\n addRewrite(rewrites, reference.displayPath, localPath);\n addRewrite(rewrites, reference.resolvedPath, localPath);\n addRewrite(rewrites, `file://${reference.displayPath}`, `file://${localPath}`);\n if (reference.resolvedPath) {\n addRewrite(rewrites, `file://${reference.resolvedPath}`, `file://${localPath}`);\n }\n for (const arg of reference.command ?? []) {\n if (arg === reference.displayPath || arg === reference.resolvedPath) {\n addRewrite(rewrites, arg, localPath);\n }\n }\n }\n return rewrites;\n}\n\nfunction rewritePathsDeep(value: unknown, rewrites: ReadonlyMap<string, string>): unknown {\n if (typeof value === 'string') {\n return rewrites.get(value) ?? value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => rewritePathsDeep(item, rewrites));\n }\n if (isRecord(value)) {\n const rewritten: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n rewritten[key] = rewritePathsDeep(child, rewrites);\n }\n return rewritten;\n }\n return value;\n}\n\nfunction parseSourceTestCase(test: EvalTest): Record<string, unknown> {\n const parsed = test.source ? parseYamlValue(test.source.testSnapshotYaml) : undefined;\n const testCase = isRecord(parsed) ? { ...parsed } : { id: test.id, input: test.question };\n if (typeof testCase.id !== 'string' || testCase.id.length === 0) {\n testCase.id = test.id;\n }\n return testCase;\n}\n\nfunction withoutLegacyAssertionKeys(testCase: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(testCase).filter(([key]) => key !== 'assert' && key !== 'evaluators'),\n );\n}\n\nfunction buildEvalCase(\n test: EvalTest,\n rewrites: ReadonlyMap<string, string>,\n): Record<string, unknown> {\n const testCase = rewritePathsDeep(parseSourceTestCase(test), rewrites) as Record<string, unknown>;\n const graderDefinitions = test.source?.graderDefinitions ?? [];\n if (graderDefinitions.length > 0) {\n return {\n ...withoutLegacyAssertionKeys(testCase),\n assertions: graderDefinitions.map((grader) =>\n rewritePathsDeep(toSnakeCaseDeep(grader.definition), rewrites),\n ),\n };\n }\n return testCase;\n}\n\nfunction targetReferenceNames(target: TargetDefinition): readonly string[] {\n const references: string[] = [];\n for (const key of ['use_target', 'grader_target', 'judge_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 selectTargetDefinitions(\n targetName: string,\n definitions: readonly TargetDefinition[],\n): readonly TargetDefinition[] {\n const byName = new Map(definitions.map((definition) => [definition.name, definition]));\n const selected: TargetDefinition[] = [];\n const seen = new Set<string>();\n\n function visit(name: string): void {\n if (seen.has(name)) {\n return;\n }\n const definition = byName.get(name);\n if (!definition) {\n return;\n }\n seen.add(name);\n selected.push(definition);\n for (const referenceName of targetReferenceNames(definition)) {\n visit(referenceName);\n }\n }\n\n visit(targetName);\n return selected;\n}\n\nasync function writeYamlFile(filePath: string, value: unknown): Promise<void> {\n const yaml = stringifyYaml(toSnakeCaseDeep(sanitizeBundleValue(value)), {\n lineWidth: 0,\n }).trimEnd();\n await writeFile(filePath, `${yaml}\\n`, 'utf8');\n}\n\nfunction hasCopiedBucket(\n copied: readonly CopiedReference[],\n bucket: 'files' | 'graders' | 'workspaces' | 'scripts',\n): boolean {\n return copied.some((entry) => entry.localPath.startsWith(`${bucket}/`));\n}\n\nfunction bundledEvalFileName(evalFilePath: string): string {\n const basename = path.basename(evalFilePath);\n const withoutKnownExtension = basename\n .replace(/\\.eval\\.[cm]?ts$/i, '')\n .replace(/\\.eval\\.ya?ml$/i, '')\n .replace(/\\.[cm]?ts$/i, '')\n .replace(/\\.ya?ml$/i, '')\n .replace(/\\.jsonl?$/i, '');\n const safeName = withoutKnownExtension\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return `${safeName || 'bundle'}.eval.yaml`;\n}\n\nfunction uniqueTargetDefinitions(\n selections: readonly TaskBundleTargetSelection[],\n): readonly TargetDefinition[] {\n const selected: TargetDefinition[] = [];\n const seen = new Set<string>();\n\n for (const selection of selections) {\n for (const definition of selectTargetDefinitions(selection.targetName, selection.definitions)) {\n if (seen.has(definition.name)) {\n continue;\n }\n seen.add(definition.name);\n selected.push(definition);\n }\n }\n\n return selected;\n}\n\nfunction uniqueTargetNames(selections: readonly TaskBundleTargetSelection[]): readonly string[] {\n const names: string[] = [];\n const seen = new Set<string>();\n for (const selection of selections) {\n if (seen.has(selection.targetName)) {\n continue;\n }\n seen.add(selection.targetName);\n names.push(selection.targetName);\n }\n return names;\n}\n\nfunction rewritePathString(value: string, rewrites: ReadonlyMap<string, string>): string {\n const direct = rewrites.get(value);\n if (direct) {\n return direct.startsWith('file://') ? direct.slice('file://'.length) : direct;\n }\n const fileUrl = rewrites.get(`file://${value}`);\n if (fileUrl) {\n return fileUrl.startsWith('file://') ? fileUrl.slice('file://'.length) : fileUrl;\n }\n return value;\n}\n\nfunction serializeContentValue(value: unknown, rewrites: ReadonlyMap<string, string>): unknown {\n if (typeof value === 'string') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => serializeContentItem(item, rewrites));\n }\n\n if (isRecord(value)) {\n return rewritePathsDeep(value, rewrites);\n }\n\n return value;\n}\n\nfunction serializeContentItem(value: unknown, rewrites: ReadonlyMap<string, string>): unknown {\n if (typeof value === 'string') {\n return value;\n }\n if (!isRecord(value)) {\n return value;\n }\n\n const type = value.type;\n if (type === 'text') {\n const text = typeof value.value === 'string' ? value.value : value.text;\n return { type: 'text', value: typeof text === 'string' ? text : '' };\n }\n\n if (type === 'file') {\n const source =\n typeof value.value === 'string'\n ? value.value\n : typeof value.path === 'string'\n ? value.path\n : typeof value.resolvedPath === 'string'\n ? value.resolvedPath\n : undefined;\n return source\n ? { type: 'file', value: rewritePathString(source, rewrites) }\n : { type: 'file', value: '' };\n }\n\n if (type === 'image') {\n const source =\n typeof value.value === 'string'\n ? value.value\n : typeof value.path === 'string'\n ? value.path\n : typeof value.resolvedPath === 'string'\n ? value.resolvedPath\n : undefined;\n if (source) {\n return { type: 'image', value: rewritePathString(source, rewrites) };\n }\n }\n\n return rewritePathsDeep(value, rewrites);\n}\n\nfunction serializeMessage(\n message: TestMessage,\n rewrites: ReadonlyMap<string, string>,\n): Record<string, unknown> {\n return {\n role: message.role,\n content: serializeContentValue(message.content, rewrites),\n };\n}\n\nfunction serializeExpectedMessage(\n message: JsonObject,\n rewrites: ReadonlyMap<string, string>,\n): Record<string, unknown> {\n const serialized: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(message)) {\n serialized[key] = key === 'content' ? serializeContentValue(value, rewrites) : value;\n }\n return rewritePathsDeep(serialized, rewrites) as Record<string, unknown>;\n}\n\nfunction serializeWorkspace(\n workspace: WorkspaceConfig,\n rewrites: ReadonlyMap<string, string>,\n): Record<string, unknown> {\n const {\n workspaceFileDir: _workspaceFileDir,\n path: _path,\n mode,\n ...portableWorkspace\n } = workspace;\n const withoutStaticMode =\n mode === 'static' ? portableWorkspace : { ...portableWorkspace, ...(mode ? { mode } : {}) };\n return rewritePathsDeep(withoutStaticMode, rewrites) as Record<string, unknown>;\n}\n\nfunction buildPortableEvalCase(\n test: EvalTest,\n rewrites: ReadonlyMap<string, string>,\n): Record<string, unknown> {\n const testCase = buildEvalCase(test, rewrites);\n testCase.id = test.id;\n testCase.input = test.input.map((message) => serializeMessage(message, rewrites));\n\n if (test.criteria.trim().length > 0) {\n testCase.criteria = test.criteria;\n }\n if (test.expected_output.length > 0) {\n testCase.expected_output = test.expected_output.map((message) =>\n serializeExpectedMessage(message, rewrites),\n );\n }\n if (test.workspace) {\n testCase.workspace = serializeWorkspace(test.workspace, rewrites);\n }\n if (test.metadata && Object.keys(test.metadata).length > 0) {\n testCase.metadata = rewritePathsDeep(test.metadata, rewrites);\n }\n if (test.conversation_id) {\n testCase.conversation_id = test.conversation_id;\n }\n if (test.targets && test.targets.length > 0) {\n const existingExecution = isRecord(testCase.execution) ? testCase.execution : {};\n testCase.execution = { ...existingExecution, targets: test.targets };\n }\n if (test.threshold !== undefined) {\n const existingExecution = isRecord(testCase.execution) ? testCase.execution : {};\n testCase.execution = { ...existingExecution, threshold: test.threshold };\n }\n if (test.mode) {\n testCase.mode = test.mode;\n }\n if (test.turns && test.turns.length > 0) {\n testCase.turns = rewritePathsDeep(test.turns, rewrites);\n }\n if (test.aggregation) {\n testCase.aggregation = test.aggregation;\n }\n if (test.on_turn_failure) {\n testCase.on_turn_failure = test.on_turn_failure;\n }\n if (test.window_size !== undefined) {\n testCase.window_size = test.window_size;\n }\n if (test.depends_on && test.depends_on.length > 0) {\n testCase.depends_on = test.depends_on;\n }\n if (test.on_dependency_failure) {\n testCase.on_dependency_failure = test.on_dependency_failure;\n }\n\n return testCase;\n}\n\nfunction isLikelyCommandPath(value: string): boolean {\n if (value.trim().length === 0 || value.startsWith('-') || value.includes('${{')) {\n return false;\n }\n return (\n value.startsWith('.') ||\n value.includes('/') ||\n value.includes('\\\\') ||\n path.extname(value).length > 0\n );\n}\n\nasync function maybeWorkspaceHookCommandReference(options: {\n readonly arg: string;\n readonly baseDir: string;\n readonly testId: string;\n readonly hookName: string;\n}): Promise<BundleSourceReference | undefined> {\n if (!isLikelyCommandPath(options.arg)) {\n return undefined;\n }\n const resolvedPath = path.isAbsolute(options.arg)\n ? path.resolve(options.arg)\n : path.resolve(options.baseDir, options.arg);\n const sourceStat = await stat(resolvedPath).catch(() => undefined);\n if (!sourceStat?.isFile()) {\n return undefined;\n }\n return {\n kind: 'workspace_hook_command',\n displayPath: options.arg,\n resolvedPath,\n location: `workspace.hooks.${options.hookName}.command for test \"${options.testId}\"`,\n };\n}\n\nasync function collectWorkspaceReferences(\n tests: readonly EvalTest[],\n evalFileDir: string,\n): Promise<{\n readonly references: readonly BundleSourceReference[];\n readonly errors: readonly string[];\n}> {\n const references: BundleSourceReference[] = [];\n const errors: string[] = [];\n\n for (const test of tests) {\n const workspace = test.workspace;\n if (!workspace) {\n continue;\n }\n\n if (workspace.path || workspace.mode === 'static') {\n errors.push(\n `workspace.path for test \"${test.id}\" cannot be bundled because it points at an existing static workspace. Use workspace.template, workspace.repos, or workspace.hooks for portable bundles.`,\n );\n }\n\n if (workspace.template) {\n references.push({\n kind: 'workspace_template',\n displayPath: workspace.template,\n resolvedPath: workspace.template,\n location: `workspace.template for test \"${test.id}\"`,\n });\n }\n\n const hooks = workspace.hooks;\n if (!hooks) {\n continue;\n }\n\n for (const hookName of ['before_all', 'before_each', 'after_each', 'after_all'] as const) {\n const hook = hooks[hookName];\n const command = hook?.command ?? hook?.script;\n if (!command || command.length === 0) {\n continue;\n }\n if (hook?.cwd) {\n errors.push(\n `workspace.hooks.${hookName}.cwd for test \"${test.id}\" cannot be bundled safely yet: ${hook.cwd}`,\n );\n continue;\n }\n\n const baseDir = workspace.workspaceFileDir ?? evalFileDir;\n for (const arg of command) {\n const reference = await maybeWorkspaceHookCommandReference({\n arg,\n baseDir,\n testId: test.id,\n hookName,\n });\n if (reference) {\n references.push(reference);\n }\n }\n }\n }\n\n return { references, errors };\n}\n\nfunction collectExpectedOutputReferences(\n tests: readonly EvalTest[],\n): readonly BundleSourceReference[] {\n const references: BundleSourceReference[] = [];\n for (const test of tests) {\n for (const message of test.expected_output) {\n const content = message.content;\n if (!Array.isArray(content)) {\n continue;\n }\n for (const segment of content) {\n if (!isRecord(segment) || segment.type !== 'file') {\n continue;\n }\n const resolvedPath =\n typeof segment.resolvedPath === 'string' ? path.resolve(segment.resolvedPath) : undefined;\n const displayPath =\n typeof segment.path === 'string'\n ? segment.path\n : typeof segment.value === 'string'\n ? segment.value\n : resolvedPath;\n if (!displayPath) {\n continue;\n }\n references.push({\n kind: 'expected_output_file',\n displayPath,\n ...(resolvedPath ? { resolvedPath } : {}),\n location: `expected_output file for test \"${test.id}\"`,\n });\n }\n }\n }\n return references;\n}\n\nfunction bundleManifest(options: {\n readonly outputDir: string;\n readonly evalFilePath: string;\n readonly evalPath: string;\n readonly targetsPath: string;\n readonly copiedReferences: readonly CopiedReference[];\n readonly tests: readonly EvalTest[];\n readonly targetNames: readonly string[];\n readonly createdAt: string;\n}): Record<string, unknown> {\n const relative = (filePath: string) =>\n path.relative(options.outputDir, filePath).split(path.sep).join('/');\n return {\n schema_version: 1,\n created_at: options.createdAt,\n source_eval: options.evalFilePath,\n eval_path: relative(options.evalPath),\n targets_path: relative(options.targetsPath),\n test_count: options.tests.length,\n targets: options.targetNames,\n ...(hasCopiedBucket(options.copiedReferences, 'files') ? { files_path: 'evals/files' } : {}),\n ...(hasCopiedBucket(options.copiedReferences, 'graders')\n ? { graders_path: 'evals/graders' }\n : {}),\n ...(hasCopiedBucket(options.copiedReferences, 'workspaces')\n ? { workspaces_path: 'evals/workspaces' }\n : {}),\n ...(hasCopiedBucket(options.copiedReferences, 'scripts')\n ? { scripts_path: 'evals/scripts' }\n : {}),\n };\n}\n\n/**\n * Materialize the native AgentV task source for one completed result row.\n *\n * The bundle is intentionally just an eval file, a selected targets file, and\n * copied referenced assets. It does not create `.agentv/` under the result\n * artifact directory, so future reruns can choose their output root explicitly.\n */\nexport async function materializeTaskBundle(\n options: MaterializeTaskBundleOptions,\n): Promise<MaterializedTaskBundlePaths | undefined> {\n if (!options.test.source) {\n return undefined;\n }\n\n const targetDefinitions = selectTargetDefinitions(options.targetName, options.targetDefinitions);\n if (targetDefinitions.length === 0) {\n return undefined;\n }\n\n const taskDir = path.join(options.outputDir, TASK_DIRNAME);\n await mkdir(taskDir, { recursive: true });\n\n const copiedReferences = await copyReferences(options.test.source.references, taskDir, options);\n const rewrites = buildPathRewrites(copiedReferences);\n const evalCase = buildEvalCase(options.test, rewrites);\n const evalPath = path.join(taskDir, TASK_EVAL_FILENAME);\n const targetsPath = path.join(taskDir, TASK_TARGETS_FILENAME);\n\n await writeYamlFile(evalPath, {\n execution: { target: options.targetName },\n tests: [evalCase],\n });\n await writeYamlFile(targetsPath, { targets: targetDefinitions });\n\n return {\n taskDir,\n evalPath,\n targetsPath,\n ...(hasCopiedBucket(copiedReferences, 'files')\n ? { filesPath: path.join(taskDir, TASK_FILES_DIRNAME) }\n : {}),\n ...(hasCopiedBucket(copiedReferences, 'graders')\n ? { gradersPath: path.join(taskDir, TASK_GRADERS_DIRNAME) }\n : {}),\n };\n}\n\n/**\n * Materialize a whole eval suite as a portable directory.\n *\n * This reuses the same source snapshots, dependency copying, path rewriting,\n * target slicing, and secret redaction used by per-result task bundles. The\n * output eval is intentionally explicit: inherited suite defaults are written\n * onto each bundled test case so the bundle can run without the source tree.\n */\nexport async function materializeEvalBundle(\n options: MaterializeEvalBundleOptions,\n): Promise<MaterializedEvalBundlePaths> {\n if (options.tests.length === 0) {\n throw new Error('Cannot bundle eval with no runnable tests.');\n }\n if (options.targetSelections.length === 0) {\n throw new Error('Cannot bundle eval without a selected target.');\n }\n\n const missingSource = options.tests.find((test) => !test.source);\n if (missingSource) {\n throw new Error(\n `Cannot bundle test \"${missingSource.id}\" because it has no source metadata. YAML evals are supported; programmatic evals with inline functions are not portable yet.`,\n );\n }\n\n const outputDir = path.resolve(options.outputDir);\n const evalsDir = path.join(outputDir, BUNDLE_EVALS_DIRNAME);\n await mkdir(evalsDir, { recursive: true });\n\n const evalFileDir = path.dirname(path.resolve(options.evalFilePath));\n const workspaceReferences = await collectWorkspaceReferences(options.tests, evalFileDir);\n const references: BundleSourceReference[] = [\n ...options.tests.flatMap((test) => test.source?.references ?? []),\n ...collectExpectedOutputReferences(options.tests),\n ...workspaceReferences.references,\n ];\n\n const { copied, failures } = await copyReferencesStrict(references, evalsDir, options);\n const errors = [...workspaceReferences.errors, ...failures.map((failure) => failure.reason)];\n if (errors.length > 0) {\n throw new Error(`Cannot bundle eval:\\n${errors.map((error) => `- ${error}`).join('\\n')}`);\n }\n\n const rewrites = buildPathRewrites(copied);\n const targetNames = uniqueTargetNames(options.targetSelections);\n const evalPath = path.join(evalsDir, bundledEvalFileName(options.evalFilePath));\n const targetsPath = path.join(outputDir, BUNDLE_TARGETS_FILENAME);\n const manifestPath = path.join(outputDir, BUNDLE_MANIFEST_FILENAME);\n const execution =\n options.execution ??\n (targetNames.length === 1 ? { target: targetNames[0] } : { targets: targetNames });\n\n await writeYamlFile(evalPath, {\n execution,\n tests: options.tests.map((test) => buildPortableEvalCase(test, rewrites)),\n });\n await writeYamlFile(targetsPath, {\n targets: uniqueTargetDefinitions(options.targetSelections),\n });\n\n const manifest = bundleManifest({\n outputDir,\n evalFilePath: path.resolve(options.evalFilePath),\n evalPath,\n targetsPath,\n copiedReferences: copied,\n tests: options.tests,\n targetNames,\n createdAt: (options.now ?? (() => new Date()))().toISOString(),\n });\n await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n\n return {\n bundleDir: outputDir,\n evalsDir,\n evalPath,\n targetsPath,\n manifestPath,\n ...(hasCopiedBucket(copied, 'files')\n ? { filesPath: path.join(evalsDir, TASK_FILES_DIRNAME) }\n : {}),\n ...(hasCopiedBucket(copied, 'graders')\n ? { gradersPath: path.join(evalsDir, TASK_GRADERS_DIRNAME) }\n : {}),\n ...(hasCopiedBucket(copied, 'workspaces')\n ? { workspacesPath: path.join(evalsDir, BUNDLE_WORKSPACES_DIRNAME) }\n : {}),\n ...(hasCopiedBucket(copied, 'scripts')\n ? { scriptsPath: path.join(evalsDir, BUNDLE_SCRIPTS_DIRNAME) }\n : {}),\n };\n}\n","/**\n * Converts a camelCase string to snake_case.\n * Examples:\n * testId -> test_id\n * outputText -> output_text\n * conversationId -> conversation_id\n *\n * Note: Keys that start with an uppercase letter are treated as proper nouns\n * and returned unchanged (e.g., \"Read\", \"Edit\" for tool names).\n */\nfunction toSnakeCase(str: string): string {\n // Don't convert keys that start with uppercase (proper nouns/tool names)\n if (/^[A-Z]/.test(str)) {\n return str;\n }\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\n/**\n * Recursively converts all keys in an object from camelCase to snake_case.\n * This is used to convert TypeScript internal representations to snake_case\n * for Python ecosystem compatibility in JSONL output files.\n *\n * Conversion rules:\n * - Object keys: camelCase -> snake_case\n * - Array elements: recursively converted\n * - Primitives: returned unchanged\n * - null/undefined: returned unchanged\n *\n * @param obj - The object to convert (can be any JSON-serializable value)\n * @returns A new object with all keys converted to snake_case\n */\nexport function toSnakeCaseDeep(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => toSnakeCaseDeep(item));\n }\n\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n const snakeKey = toSnakeCase(key);\n result[snakeKey] = toSnakeCaseDeep(value);\n }\n return result;\n }\n\n return obj;\n}\n"],"mappings":"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","names":["path","path","buildIndexArtifactEntry","buildResultIndexArtifact","writePerTestArtifacts","writeArtifactsFromResults"]}
|