@rulemetric/cli 0.13.0 → 0.14.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/dist/base-command.js +1 -1
- package/dist/chunk-2UK4DZFW.js +12 -0
- package/dist/{chunk-3UPHCQWI.js → chunk-35YVHBLL.js} +1 -1
- package/dist/{chunk-VH2EAP4J.js → chunk-3FNTV2TW.js} +1 -1
- package/dist/{chunk-WQX4RRBQ.js → chunk-3IMRLHJJ.js} +1 -1
- package/dist/chunk-42A4PUW7.js +48 -0
- package/dist/chunk-43VKTVM3.js +1 -0
- package/dist/{chunk-CYYDQFRY.js → chunk-44TYRMIS.js} +1 -1
- package/dist/{chunk-25RDT32M.js → chunk-4FJYVYCU.js} +1 -1
- package/dist/{chunk-I3M5VBLT.js → chunk-5BT375C7.js} +1 -1
- package/dist/{chunk-7AWFSFR7.js → chunk-5Z3H5JHK.js} +1 -1
- package/dist/{chunk-25Q3Y7TC.js → chunk-6ANODRDT.js} +1 -1
- package/dist/{chunk-APDRR6FS.js → chunk-76UKAFNM.js} +1 -1
- package/dist/{chunk-VXUKXGRX.js → chunk-7MTYUTUN.js} +2 -2
- package/dist/{chunk-JWFRI32Y.js → chunk-AGEZAKCC.js} +1 -1
- package/dist/chunk-AHLVY52I.js +1 -0
- package/dist/{chunk-MNQPCNGQ.js → chunk-AIYFT4P6.js} +1 -1
- package/dist/{chunk-UYPBIXF2.js → chunk-B5X6HCBK.js} +1 -1
- package/dist/chunk-BAITMD76.js +1 -0
- package/dist/{chunk-GJBS6QYC.js → chunk-BFQVAU6N.js} +1 -1
- package/dist/{chunk-UE76F2NQ.js → chunk-BMT5WMEV.js} +20 -20
- package/dist/chunk-CT6GJQIR.js +1 -0
- package/dist/chunk-CT7FWSIU.js +3 -0
- package/dist/chunk-DHX4U6EC.js +13 -0
- package/dist/chunk-DQYYHX6K.js +1 -0
- package/dist/{chunk-WH3IPXXQ.js → chunk-DVU5PHPM.js} +5 -5
- package/dist/chunk-E7GQJML3.js +1 -0
- package/dist/{chunk-4N43IBXH.js → chunk-EMLLGASZ.js} +1 -1
- package/dist/{chunk-Y7QIOPN5.js → chunk-EUHRTEVJ.js} +1 -1
- package/dist/chunk-FBSZ6KCM.js +1 -0
- package/dist/{chunk-5XK6LB2T.js → chunk-FKTT7A4H.js} +1 -1
- package/dist/{chunk-V2USQH27.js → chunk-FYZ6HHCV.js} +1 -1
- package/dist/chunk-GH4EZK2O.js +1 -0
- package/dist/{chunk-DUBBL57L.js → chunk-GKVHFXUQ.js} +1 -1
- package/dist/chunk-GPBN4ROE.js +2 -0
- package/dist/chunk-GYNZ3OZF.js +1 -0
- package/dist/chunk-H6FVXVGG.js +1 -0
- package/dist/{chunk-6GAIYJ6K.js → chunk-HNYHZO2J.js} +1 -1
- package/dist/{chunk-RJX75Y7J.js → chunk-I6ZQOMZS.js} +1 -1
- package/dist/{chunk-O2HCD6XL.js → chunk-IO46ICZY.js} +1 -1
- package/dist/chunk-IQEZ3T5A.js +1 -0
- package/dist/{chunk-KV5A77XW.js → chunk-ISFPPDDB.js} +1 -1
- package/dist/chunk-J4W6GNCF.js +2 -0
- package/dist/chunk-JP6ULOEX.js +2 -0
- package/dist/{chunk-J6QMBMC2.js → chunk-JTYVBR5H.js} +1 -1
- package/dist/{chunk-BG55WDDX.js → chunk-KOYHJFB3.js} +1 -1
- package/dist/chunk-LJRJ2RAC.js +4 -0
- package/dist/chunk-MHVHGKDK.js +3 -0
- package/dist/{chunk-PVGUDJD7.js → chunk-MMLRWCBW.js} +1 -1
- package/dist/chunk-MMM4B3KH.js +1 -0
- package/dist/{chunk-ZGW3N3A6.js → chunk-MU7KKU3O.js} +1 -1
- package/dist/{chunk-YI2OWO6R.js → chunk-MXHAXY66.js} +1 -1
- package/dist/chunk-N4YPDZJF.js +9 -0
- package/dist/{chunk-VIQ25ORK.js → chunk-NYNHX7OX.js} +1 -1
- package/dist/{chunk-RK663O4M.js → chunk-OP4U3XBZ.js} +6 -6
- package/dist/{chunk-6W2GSV4O.js → chunk-OVS7ZDJ4.js} +1 -1
- package/dist/chunk-PIVEJTNF.js +1 -0
- package/dist/chunk-POEMCITL.js +1 -0
- package/dist/chunk-PPAHIVG5.js +1 -0
- package/dist/{chunk-NBEZ5FAU.js → chunk-Q36QSFSB.js} +1 -1
- package/dist/chunk-Q776YUBD.js +1 -0
- package/dist/chunk-QAMHZY2P.js +1 -0
- package/dist/chunk-QI3FJKGK.js +1 -0
- package/dist/{chunk-WOJ733IB.js → chunk-QRIJ3AHP.js} +1 -1
- package/dist/chunk-RAQLVO2X.js +1 -0
- package/dist/{chunk-M2VVRQKA.js → chunk-RG3R4EAB.js} +1 -1
- package/dist/{chunk-WY3VVX3R.js → chunk-RMRVUI7B.js} +1 -1
- package/dist/{chunk-GBWQENAH.js → chunk-RXZLBSDO.js} +1 -1
- package/dist/chunk-SCQK52SL.js +1 -0
- package/dist/{chunk-BZS5QRWB.js → chunk-SG4UDDHB.js} +1 -1
- package/dist/chunk-SWSOEYC7.js +1 -0
- package/dist/chunk-T75KAEJO.js +25 -0
- package/dist/{chunk-U7TBEC3I.js → chunk-V55ROUNP.js} +1 -1
- package/dist/{chunk-SHYP27B7.js → chunk-VALRPZXH.js} +1 -1
- package/dist/{chunk-P2WSDHIA.js → chunk-VIFOLTZT.js} +1 -1
- package/dist/{chunk-6QLZT7EP.js → chunk-VU24IH5S.js} +1 -1
- package/dist/{chunk-6ZPSVZNH.js → chunk-VXL5H3VZ.js} +1 -1
- package/dist/{chunk-QFKUSNUB.js → chunk-W23OYQXI.js} +1 -1
- package/dist/{chunk-QTCWOIT4.js → chunk-WWQWHC4K.js} +1 -1
- package/dist/{chunk-LTQ5BJYL.js → chunk-XGMOVQ5G.js} +1 -1
- package/dist/{chunk-4COLIGD7.js → chunk-XJ25HFIT.js} +1 -1
- package/dist/{chunk-3MDEGOUG.js → chunk-XMA6SWOT.js} +1 -1
- package/dist/{chunk-WJZY5Y22.js → chunk-XMTKP74H.js} +1 -1
- package/dist/chunk-XQYAVSUQ.js +1 -0
- package/dist/{chunk-2EX27VJ3.js → chunk-YK2IEHLB.js} +1 -1
- package/dist/chunk-ZK3ACE4T.js +1 -0
- package/dist/commands/antigravity/backfill.js +1 -1
- package/dist/commands/auth/create-key.js +1 -1
- package/dist/commands/auth/login.js +1 -1
- package/dist/commands/auth/logout.js +1 -1
- package/dist/commands/auth/revoke-key.js +1 -1
- package/dist/commands/auth/signup.js +1 -1
- package/dist/commands/auth/status.js +1 -1
- package/dist/commands/capture/scope.js +1 -1
- package/dist/commands/catalog/index.js +1 -1
- package/dist/commands/catalog/recommend.js +1 -1
- package/dist/commands/crons/list.js +1 -1
- package/dist/commands/crons/run.js +2 -2
- package/dist/commands/dashboard.js +1 -1
- package/dist/commands/diagnostics.js +1 -1
- package/dist/commands/eval-targets/create.js +1 -1
- package/dist/commands/eval-targets/list.js +1 -1
- package/dist/commands/evals/agent.js +3 -3
- package/dist/commands/evals/auto-run.js +1 -1
- package/dist/commands/evals/benchmark.js +1 -1
- package/dist/commands/evals/compare.js +1 -1
- package/dist/commands/evals/create.js +1 -1
- package/dist/commands/evals/optimize-description.js +1 -1
- package/dist/commands/evals/optimize.js +1 -1
- package/dist/commands/evals/refine-cases.js +1 -1
- package/dist/commands/evals/run.js +1 -1
- package/dist/commands/evals/validate-judge.js +1 -1
- package/dist/commands/experiments/list.js +1 -1
- package/dist/commands/gateway/ensure.js +1 -1
- package/dist/commands/hooks/emit-instructions.js +1 -1
- package/dist/commands/hooks/install.js +1 -1
- package/dist/commands/hooks/run.js +1 -1
- package/dist/commands/hooks/uninstall.js +1 -1
- package/dist/commands/instructions/create.js +1 -1
- package/dist/commands/instructions/dedupe.js +1 -1
- package/dist/commands/instructions/delete.js +1 -1
- package/dist/commands/instructions/fork.js +1 -1
- package/dist/commands/instructions/get.js +1 -1
- package/dist/commands/instructions/list.js +1 -1
- package/dist/commands/instructions/promote.js +1 -1
- package/dist/commands/instructions/pull.js +1 -1
- package/dist/commands/instructions/restore.js +1 -1
- package/dist/commands/instructions/retract.js +1 -1
- package/dist/commands/instructions/upstream.js +1 -1
- package/dist/commands/instructions/versions.js +1 -1
- package/dist/commands/launcher.js +1 -1
- package/dist/commands/local/down.js +1 -1
- package/dist/commands/local/up.js +1 -1
- package/dist/commands/org/current.js +1 -1
- package/dist/commands/org/list.js +1 -1
- package/dist/commands/org/switch.js +1 -1
- package/dist/commands/packs/add-instruction.js +1 -1
- package/dist/commands/packs/apply.js +1 -1
- package/dist/commands/packs/create.js +1 -1
- package/dist/commands/packs/fork.js +1 -1
- package/dist/commands/packs/get.js +1 -1
- package/dist/commands/packs/list.js +1 -1
- package/dist/commands/packs/remove-instruction.js +1 -1
- package/dist/commands/proxy/env.js +1 -1
- package/dist/commands/proxy/logs.js +1 -1
- package/dist/commands/proxy/restart.js +1 -1
- package/dist/commands/proxy/setup.js +1 -1
- package/dist/commands/proxy/start.js +1 -1
- package/dist/commands/proxy/status.js +1 -1
- package/dist/commands/proxy/stop.js +1 -1
- package/dist/commands/research/backfill.js +1 -1
- package/dist/commands/research/tail-transcript.js +1 -1
- package/dist/commands/service/install.js +18 -18
- package/dist/commands/service/status.js +1 -1
- package/dist/commands/service/uninstall.js +1 -1
- package/dist/commands/sessions/analyze.js +1 -1
- package/dist/commands/sessions/delete.js +1 -1
- package/dist/commands/sessions/end.js +1 -1
- package/dist/commands/sessions/import.js +1 -1
- package/dist/commands/sessions/list.js +1 -1
- package/dist/commands/sessions/start.js +1 -1
- package/dist/commands/setup.js +1 -1
- package/dist/commands/skills/export-approved.js +1 -1
- package/dist/commands/skills/install.js +1 -1
- package/dist/commands/skills/list.js +1 -1
- package/dist/commands/skills/publish.js +1 -1
- package/dist/commands/skills/search.js +1 -1
- package/dist/commands/skills/update.js +1 -1
- package/dist/commands/suggestions/accept.js +1 -1
- package/dist/commands/suggestions/auto.js +1 -1
- package/dist/commands/suggestions/dismiss.js +1 -1
- package/dist/commands/suggestions/list.js +1 -1
- package/dist/commands/suggestions/refresh.js +1 -1
- package/dist/commands/suggestions/undo.js +1 -1
- package/dist/dashboard/Dashboard.js +1 -1
- package/dist/dashboard/data.js +1 -1
- package/dist/dashboard/launcher/LauncherOverlay.js +1 -1
- package/dist/dashboard/launcher/api.js +1 -1
- package/dist/dashboard/launcher/useLaunchJobs.js +1 -1
- package/dist/dashboard/panels/measurement.js +1 -0
- package/dist/dist-GSHUC7UU.js +1 -0
- package/dist/harbor/cost_delta.py +377 -0
- package/dist/harbor/mcp_container_shell.py +156 -0
- package/dist/harbor/provenance.py +361 -0
- package/dist/harbor/rm-batch-task/environment/Dockerfile +6 -0
- package/dist/harbor/rm-batch-task/environment/items.jsonl +60 -0
- package/dist/harbor/rm-batch-task/inject.md +8 -0
- package/dist/harbor/rm-batch-task/instruction.md +8 -0
- package/dist/harbor/rm-batch-task/solution/solve.sh +68 -0
- package/dist/harbor/rm-batch-task/task.toml +30 -0
- package/dist/harbor/rm-batch-task/tests/test.sh +23 -0
- package/dist/harbor/rm-batch-task/tests/test_outputs.py +32 -0
- package/dist/harbor/rm-locality-task/environment/Dockerfile +8 -0
- package/dist/harbor/rm-locality-task/environment/workspace/deploy/prod/ingest.yaml +3 -0
- package/dist/harbor/rm-locality-task/environment/workspace/deploy/staging/ingest.yaml +3 -0
- package/dist/harbor/rm-locality-task/environment/workspace/docs/architecture/ingest.md +6 -0
- package/dist/harbor/rm-locality-task/environment/workspace/legacy/ingest_v1/config.yaml +2 -0
- package/dist/harbor/rm-locality-task/environment/workspace/packages/shared/defaults.py +4 -0
- package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/config/limits.defaults.yaml +4 -0
- package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/config/limits.yaml +3 -0
- package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/loader.py +15 -0
- package/dist/harbor/rm-locality-task/environment/workspace/tests/fixtures/ingest_config.yaml +3 -0
- package/dist/harbor/rm-locality-task/inject.md +12 -0
- package/dist/harbor/rm-locality-task/instruction.md +4 -0
- package/dist/harbor/rm-locality-task/solution/solve.sh +14 -0
- package/dist/harbor/rm-locality-task/task.toml +30 -0
- package/dist/harbor/rm-locality-task/tests/test.sh +23 -0
- package/dist/harbor/rm-locality-task/tests/test_outputs.py +19 -0
- package/dist/harbor/rm-migrations-task/environment/Dockerfile +7 -0
- package/dist/harbor/rm-migrations-task/environment/applied.txt +2 -0
- package/dist/harbor/rm-migrations-task/environment/migrations/00001_init.sql +1 -0
- package/dist/harbor/rm-migrations-task/environment/migrations/00002_add_email.sql +1 -0
- package/dist/harbor/rm-migrations-task/inject.md +7 -0
- package/dist/harbor/rm-migrations-task/instruction.md +8 -0
- package/dist/harbor/rm-migrations-task/solution/solve.sh +8 -0
- package/dist/harbor/rm-migrations-task/task.toml +30 -0
- package/dist/harbor/rm-migrations-task/tests/test.sh +23 -0
- package/dist/harbor/rm-migrations-task/tests/test_outputs.py +36 -0
- package/dist/harbor/rm-pagination-task/environment/Dockerfile +6 -0
- package/dist/harbor/rm-pagination-task/environment/store.py +29 -0
- package/dist/harbor/rm-pagination-task/inject.md +8 -0
- package/dist/harbor/rm-pagination-task/instruction.md +5 -0
- package/dist/harbor/rm-pagination-task/solution/solve.sh +7 -0
- package/dist/harbor/rm-pagination-task/task.toml +30 -0
- package/dist/harbor/rm-pagination-task/tests/test.sh +23 -0
- package/dist/harbor/rm-pagination-task/tests/test_outputs.py +14 -0
- package/dist/harbor/rm_host_claude.py +264 -0
- package/dist/harbor/rm_host_codex.py +208 -0
- package/dist/harbor/run.sh +268 -0
- package/dist/harbor/summarize.py +248 -0
- package/dist/lib/active-org-refresh.js +1 -1
- package/dist/lib/agent-loop.js +1 -1
- package/dist/lib/antigravity-transcript.js +1 -1
- package/dist/lib/api-client.js +1 -1
- package/dist/lib/autorun-batch.js +1 -0
- package/dist/lib/capture-scope-config.js +1 -1
- package/dist/lib/codex-capture-scope.js +1 -1
- package/dist/lib/codex-exec.js +1 -1
- package/dist/lib/ensure-api-key.js +1 -1
- package/dist/lib/ensure-fresh-token.js +1 -1
- package/dist/lib/eval-accumulation.js +1 -0
- package/dist/lib/eval-analyzer.js +1 -1
- package/dist/lib/eval-benchmark.js +1 -1
- package/dist/lib/eval-candidate-run.js +1 -1
- package/dist/lib/eval-case-generator.js +1 -1
- package/dist/lib/eval-conversation-handler.js +1 -1
- package/dist/lib/eval-executor.js +1 -1
- package/dist/lib/eval-grader.js +1 -1
- package/dist/lib/eval-meta-judge.js +1 -1
- package/dist/lib/eval-resume.js +1 -1
- package/dist/lib/eval-run-batch.js +1 -1
- package/dist/lib/eval-trigger-tester.js +1 -1
- package/dist/lib/evolution-enrolment.js +1 -1
- package/dist/lib/harbor-readiness.js +1 -1
- package/dist/lib/hooks-capture-gate.js +1 -1
- package/dist/lib/insights/generation/installed-asks.js +1 -1
- package/dist/lib/insights/nomination/nominate.js +1 -1
- package/dist/lib/instruction-proposer.js +1 -1
- package/dist/lib/instruction-snapshot.js +1 -1
- package/dist/lib/instructions/acceptance/accept-events.js +1 -1
- package/dist/lib/instructions/acceptance/accept-hook.js +1 -1
- package/dist/lib/instructions/acceptance/agent-instruction-files.js +1 -1
- package/dist/lib/instructions/acceptance/hook-install.js +1 -1
- package/dist/lib/instructions/acceptance/reverse-applications.js +1 -1
- package/dist/lib/instructions/acceptance/suggestion-accept.js +1 -1
- package/dist/lib/jobs/handlers/cron-auto-accept-suggestions.js +1 -1
- package/dist/lib/jobs/handlers/cron-eval-autorun.js +1 -1
- package/dist/lib/jobs/handlers/cron-instruction-evolution.js +1 -1
- package/dist/lib/jobs/handlers/cron-instruction-training.js +1 -1
- package/dist/lib/jobs/handlers/cron-reconcile-attribution.js +1 -1
- package/dist/lib/jobs/handlers/cron-refine-cases.js +1 -1
- package/dist/lib/jobs/handlers/cron-refresh-pricing.js +1 -1
- package/dist/lib/jobs/handlers/cron-retire-unused-skills.js +1 -1
- package/dist/lib/jobs/handlers/cron-suggest-instructions.js +1 -1
- package/dist/lib/jobs/handlers/distill-memories.js +1 -1
- package/dist/lib/jobs/handlers/harbor-ab-verdict.js +1 -1
- package/dist/lib/jobs/handlers/harbor-ab.js +1 -1
- package/dist/lib/jobs/handlers/process-changelog.js +1 -1
- package/dist/lib/jobs/handlers/process-conversation.js +1 -1
- package/dist/lib/jobs/handlers/process-eval.js +1 -1
- package/dist/lib/jobs/handlers/process-insights.js +1 -1
- package/dist/lib/jobs/handlers/process-judge-review.js +1 -1
- package/dist/lib/jobs/handlers/process-launch.js +1 -1
- package/dist/lib/jobs/handlers/process-memory-ab.js +1 -1
- package/dist/lib/jobs/handlers/process-run-cleanup.js +1 -1
- package/dist/lib/jobs/handlers/process-session-goal.js +1 -1
- package/dist/lib/jobs/shed-retry.js +1 -1
- package/dist/lib/judge-review-runner.js +1 -1
- package/dist/lib/llm-client.js +1 -1
- package/dist/lib/llm-reply-parsers.js +1 -0
- package/dist/lib/manual-tasks.js +1 -1
- package/dist/lib/measurement-llm.js +1 -0
- package/dist/lib/pi-exec.js +1 -0
- package/dist/lib/projects/workspace/eval-workspace.js +1 -1
- package/dist/lib/projects/workspace/worktree.js +1 -1
- package/dist/lib/refine-cases.js +1 -1
- package/dist/lib/research-client.js +1 -1
- package/dist/lib/retraction.js +1 -1
- package/dist/lib/reviewer-detect.js +1 -1
- package/dist/lib/service-environment.js +1 -0
- package/dist/lib/setup-steps.js +1 -1
- package/dist/lib/telemetry.js +1 -1
- package/dist/lib/terminal-target-heartbeat.js +1 -1
- package/dist/lib/tool-cli-map.js +1 -0
- package/dist/lib/transcript-instruction-linking.js +1 -1
- package/dist/lib/transcript-sync.js +1 -1
- package/dist/lib/work-report.js +1 -1
- package/oclif.manifest.json +7 -1
- package/package.json +5 -4
- package/dist/chunk-4FSQSETR.js +0 -12
- package/dist/chunk-6WQG6C7F.js +0 -1
- package/dist/chunk-C42NTI2V.js +0 -3
- package/dist/chunk-F6DAHCJC.js +0 -20
- package/dist/chunk-GN3ZHQ46.js +0 -1
- package/dist/chunk-H3BCWSYO.js +0 -1
- package/dist/chunk-HLNHBZLI.js +0 -1
- package/dist/chunk-HLQZR4XJ.js +0 -13
- package/dist/chunk-J5HW45PZ.js +0 -48
- package/dist/chunk-JNFB22FD.js +0 -1
- package/dist/chunk-KCOJLTVX.js +0 -1
- package/dist/chunk-MLV2RHRE.js +0 -1
- package/dist/chunk-N7GK33PU.js +0 -1
- package/dist/chunk-NRYLYMDM.js +0 -1
- package/dist/chunk-OZNKMJ5B.js +0 -1
- package/dist/chunk-PPXOC7IV.js +0 -1
- package/dist/chunk-QXPYGN7I.js +0 -1
- package/dist/chunk-R4QIPG4V.js +0 -2
- package/dist/chunk-RGUCR7T6.js +0 -1
- package/dist/chunk-RO3ZZVCG.js +0 -1
- package/dist/chunk-SBGXIPRN.js +0 -2
- package/dist/chunk-SN3CHV66.js +0 -1
- package/dist/chunk-U3XKXJ3A.js +0 -5
- package/dist/chunk-UM4CBCXI.js +0 -1
- package/dist/chunk-WHQ4BDSM.js +0 -4
- package/dist/dist-45KJH5M7.js +0 -1
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# RuleMetric Harbor runner.
|
|
3
|
+
#
|
|
4
|
+
# Default = OUR OWN HARNESS: the host agent (rm_host_claude.py → the user's own
|
|
5
|
+
# `claude` CLI, subscription auth) against local Docker. Two opt-in ways to
|
|
6
|
+
# move cost off this machine, both keyed from ~/.config/rulemetric/harbor.env
|
|
7
|
+
# (names in harbor.env.example; the file is never in the repo):
|
|
8
|
+
#
|
|
9
|
+
# --cloud <provider> run the TASK CONTAINERS on a Harbor cloud environment
|
|
10
|
+
# (daytona|modal|e2b|runloop|…) instead of local Docker.
|
|
11
|
+
# The agent still runs here; compute is offloaded.
|
|
12
|
+
# --byok bill the LLM to ANTHROPIC_API_KEY from harbor.env
|
|
13
|
+
# instead of the subscription login. Works with the
|
|
14
|
+
# host agent (key inherited by the child `claude`) and
|
|
15
|
+
# is REQUIRED for --remote-agent.
|
|
16
|
+
# --remote-agent use Harbor's built-in `claude-code` agent INSIDE the
|
|
17
|
+
# sandbox (nothing runs on this host per trial). Needs
|
|
18
|
+
# --byok. Delivery is limited to --prompt-file and
|
|
19
|
+
# --skill; --claude-md needs the host agent.
|
|
20
|
+
# --dry-run print the harbor command(s) with secrets redacted and
|
|
21
|
+
# exit without running anything.
|
|
22
|
+
#
|
|
23
|
+
# Usage:
|
|
24
|
+
# ./run.sh run <task-dir> [options] [harbor flags...] one arm
|
|
25
|
+
# ./run.sh ab <task-dir> (--instructions <file> | --prompt-file <file>) [options] [harbor flags...]
|
|
26
|
+
# baseline + with-arm, prints the delta
|
|
27
|
+
#
|
|
28
|
+
# --engine claude|codex which HARNESS the arms run on (default claude). The
|
|
29
|
+
# instruction file follows the engine: CLAUDE.md for
|
|
30
|
+
# claude, AGENTS.md for codex. --claude-md is kept as an
|
|
31
|
+
# alias of --instructions.
|
|
32
|
+
#
|
|
33
|
+
# Common harbor flags (passed through): -m <model>, --n-attempts N, -n <concurrency>,
|
|
34
|
+
# --ak container_shell=true (local Docker only), --ak skills_dirs=..., --skill <dir>.
|
|
35
|
+
set -euo pipefail
|
|
36
|
+
|
|
37
|
+
HERE="$(cd "$(dirname "$0")" && pwd)"
|
|
38
|
+
JOBS_DIR="${HARBOR_JOBS_DIR:-/tmp/harbor-jobs}" # NEVER inside the repo: config.json records agent env
|
|
39
|
+
ENV_FILE="${HARBOR_ENV_FILE:-$HOME/.config/rulemetric/harbor.env}"
|
|
40
|
+
CA="$HOME/.mitmproxy/mitmproxy-ca-cert.pem"
|
|
41
|
+
[ -f "$CA" ] && export SSL_CERT_FILE="$CA"
|
|
42
|
+
export PYTHONPATH="$HERE${PYTHONPATH:+:$PYTHONPATH}"
|
|
43
|
+
|
|
44
|
+
MODE="${1:?usage: run.sh run|ab <task-dir> [options] [flags]}"; shift
|
|
45
|
+
TASK="${1:?task dir required}"; shift
|
|
46
|
+
[ -d "$TASK" ] || TASK="$HERE/$TASK"
|
|
47
|
+
|
|
48
|
+
# ── option parsing (ours) — everything else passes through to harbor ─────────
|
|
49
|
+
CLOUD=""; BYOK=0; REMOTE=0; DRY=0; CLAUDE_MD=""; PROMPT_FILE=""; ENGINE="claude"
|
|
50
|
+
ARGS=()
|
|
51
|
+
while [ $# -gt 0 ]; do
|
|
52
|
+
case "$1" in
|
|
53
|
+
--cloud) CLOUD="${2:?--cloud needs a provider}"; shift 2 ;;
|
|
54
|
+
--byok) BYOK=1; shift ;;
|
|
55
|
+
--remote-agent) REMOTE=1; shift ;;
|
|
56
|
+
--dry-run) DRY=1; shift ;;
|
|
57
|
+
--engine) ENGINE="${2:?--engine needs claude|codex}"; shift 2 ;;
|
|
58
|
+
# --instructions is the engine-neutral spelling; --claude-md is kept so
|
|
59
|
+
# every existing invocation and doc keeps working unchanged.
|
|
60
|
+
--claude-md|--instructions) CLAUDE_MD="${2:?needs a file}"; shift 2 ;;
|
|
61
|
+
--prompt-file) PROMPT_FILE="${2:?--prompt-file needs a file}"; shift 2 ;;
|
|
62
|
+
*) ARGS+=("$1"); shift ;;
|
|
63
|
+
esac
|
|
64
|
+
done
|
|
65
|
+
|
|
66
|
+
die() { echo "run.sh: $*" >&2; exit 1; }
|
|
67
|
+
|
|
68
|
+
# ── credentials: only ever from the env file (or an already-exported var) ────
|
|
69
|
+
load_env_file() {
|
|
70
|
+
[ -f "$ENV_FILE" ] || return 0
|
|
71
|
+
local perms
|
|
72
|
+
# GNU `stat -c` FIRST, BSD `stat -f` second. The reverse order was silently
|
|
73
|
+
# broken on Linux: there `-f` is a VALID flag meaning "filesystem status", so
|
|
74
|
+
# it exits 0 and the `||` fallback never runs — $perms captured a whole
|
|
75
|
+
# filesystem dump ("File: … Type: ext2/ext3 … Blocks: …"), never equalled
|
|
76
|
+
# "600", and the warning printed that dump instead of a mode. A permissions
|
|
77
|
+
# check on a secrets file that cannot fire is worse than none, because the
|
|
78
|
+
# noise reads like it ran. macOS has no `-c`, so it falls through to `-f`.
|
|
79
|
+
perms=$(stat -c '%a' "$ENV_FILE" 2>/dev/null || stat -f '%Lp' "$ENV_FILE" 2>/dev/null || echo '')
|
|
80
|
+
if [ -z "$perms" ]; then
|
|
81
|
+
echo "run.sh: warning: could not read the mode of $ENV_FILE; ensure it is chmod 600" >&2
|
|
82
|
+
elif [ "$perms" != "600" ]; then
|
|
83
|
+
echo "run.sh: warning: $ENV_FILE is mode $perms; chmod 600 it" >&2
|
|
84
|
+
fi
|
|
85
|
+
set -a; # shellcheck disable=SC1090
|
|
86
|
+
. "$ENV_FILE"; set +a
|
|
87
|
+
}
|
|
88
|
+
require_var() { [ -n "${!1:-}" ] || die "$2 needs $1 — set it in $ENV_FILE (see harbor.env.example)"; }
|
|
89
|
+
|
|
90
|
+
if [ -n "$CLOUD" ] || [ "$BYOK" = 1 ]; then load_env_file; fi
|
|
91
|
+
|
|
92
|
+
# ── cloud preflight: fail here, by name, not three minutes into a sandbox build
|
|
93
|
+
if [ -n "$CLOUD" ]; then
|
|
94
|
+
case "$CLOUD" in
|
|
95
|
+
docker) CLOUD="" ;;
|
|
96
|
+
daytona)
|
|
97
|
+
if [ -z "${DAYTONA_API_KEY:-}" ] && { [ -z "${DAYTONA_JWT_TOKEN:-}" ] || [ -z "${DAYTONA_ORGANIZATION_ID:-}" ]; }; then
|
|
98
|
+
die "--cloud daytona needs DAYTONA_API_KEY (or DAYTONA_JWT_TOKEN + DAYTONA_ORGANIZATION_ID) in $ENV_FILE"
|
|
99
|
+
fi ;;
|
|
100
|
+
modal) require_var MODAL_TOKEN_ID "--cloud modal"; require_var MODAL_TOKEN_SECRET "--cloud modal" ;;
|
|
101
|
+
e2b) require_var E2B_API_KEY "--cloud e2b" ;;
|
|
102
|
+
runloop) require_var RUNLOOP_API_KEY "--cloud runloop" ;;
|
|
103
|
+
*) echo "run.sh: warning: no credential preflight for provider '$CLOUD'; harbor will validate" >&2 ;;
|
|
104
|
+
esac
|
|
105
|
+
for a in ${ARGS[@]+"${ARGS[@]}"}; do
|
|
106
|
+
case "$a" in container_shell=*|--ak=container_shell*) die "--ak container_shell needs local Docker; drop it or drop --cloud" ;; esac
|
|
107
|
+
done
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
# ── engine selection ─────────────────────────────────────────────────────────
|
|
111
|
+
# The instruction file is NOT the same file across harnesses: Claude Code reads
|
|
112
|
+
# CLAUDE.md, Codex reads AGENTS.md. Delivering the wrong one produces a with-arm
|
|
113
|
+
# that ran without its instruction and still reports a clean number — the exact
|
|
114
|
+
# defect that made `run --claude-md X` an undelivered baseline until 2026-08-31.
|
|
115
|
+
case "$ENGINE" in
|
|
116
|
+
claude) AGENT_SPEC="rm_host_claude:HostClaudeCode"; MD_KEY="claude_md"; ENGINE_BIN="claude" ;;
|
|
117
|
+
codex) AGENT_SPEC="rm_host_codex:HostCodex"; MD_KEY="agents_md"; ENGINE_BIN="codex" ;;
|
|
118
|
+
*) echo "run.sh: --engine must be claude or codex (got '$ENGINE')" >&2; exit 1 ;;
|
|
119
|
+
esac
|
|
120
|
+
|
|
121
|
+
# ── BYOK / remote agent ──────────────────────────────────────────────────────
|
|
122
|
+
AGENT_FLAGS=(--agent "$AGENT_SPEC")
|
|
123
|
+
AE=()
|
|
124
|
+
if [ "$REMOTE" = 1 ]; then
|
|
125
|
+
[ "$ENGINE" = claude ] || die "--remote-agent is Harbor's built-in claude-code agent; it has no codex equivalent — drop --engine codex or drop --remote-agent"
|
|
126
|
+
[ "$BYOK" = 1 ] || die "--remote-agent runs Harbor's built-in claude-code inside the sandbox; it needs --byok (no keychain there)"
|
|
127
|
+
[ -z "$CLAUDE_MD" ] || die "--claude-md is host-agent delivery; with --remote-agent use --prompt-file or --skill"
|
|
128
|
+
AGENT_FLAGS=(--agent claude-code)
|
|
129
|
+
fi
|
|
130
|
+
|
|
131
|
+
# The host engine CLI is required only when we are actually going to SPAWN it.
|
|
132
|
+
# This check deliberately sits AFTER argument validation and skips two cases:
|
|
133
|
+
#
|
|
134
|
+
# --dry-run prints the argv and never invokes harbor or the engine. The
|
|
135
|
+
# contract suite runs the whole option matrix this way with no
|
|
136
|
+
# harbor install (see harbor-run-contract.test.ts); requiring a
|
|
137
|
+
# real `claude`/`codex` here made 18 of those cases fail on CI
|
|
138
|
+
# while passing on a laptop that happens to have the CLI.
|
|
139
|
+
# --remote-agent runs Harbor's built-in claude-code INSIDE the sandbox, so the
|
|
140
|
+
# host CLI is not in the loop at all.
|
|
141
|
+
#
|
|
142
|
+
# Order matters as much as the gate: when this ran before the refusals above,
|
|
143
|
+
# `--engine codex --remote-agent` reported "CLI not found" instead of the real
|
|
144
|
+
# reason, so the message named the wrong problem.
|
|
145
|
+
if [ "$DRY" != 1 ] && [ "$REMOTE" != 1 ]; then
|
|
146
|
+
command -v "$ENGINE_BIN" >/dev/null 2>&1 \
|
|
147
|
+
|| die "host \`$ENGINE_BIN\` CLI not found on PATH — --engine $ENGINE needs it"
|
|
148
|
+
fi
|
|
149
|
+
|
|
150
|
+
# Tooling preflight for UNATTENDED runs (2026-09-02). Until this existed the
|
|
151
|
+
# only checked dependency was the engine CLI, and a run missing `harbor` died at
|
|
152
|
+
# line 181 with bash's own `harbor: command not found` — AFTER announcing arm
|
|
153
|
+
# 1/2, naming neither the tool nor the reason. That is survivable when a human
|
|
154
|
+
# is watching and useless at 3am.
|
|
155
|
+
#
|
|
156
|
+
# `harbor` installs to ~/.local/bin, which is NOT on the launchd worker's PATH
|
|
157
|
+
# (launchd omits Homebrew and friends). Docker Desktop installed but ASLEEP is
|
|
158
|
+
# the ordinary state of a laptop overnight, and presence on PATH cannot see it —
|
|
159
|
+
# only `docker info` can. Each refusal names its own tool: a scheduled job that
|
|
160
|
+
# misreports why it failed costs more than one that simply fails.
|
|
161
|
+
if [ "$DRY" != 1 ]; then
|
|
162
|
+
command -v harbor >/dev/null 2>&1 \
|
|
163
|
+
|| die "\`harbor\` not found on PATH — install it, or add its dir (usually ~/.local/bin) to PATH. A launchd/cron PATH does not include it by default."
|
|
164
|
+
# --cloud moves the task containers off this machine; only the local docker
|
|
165
|
+
# environment needs a live daemon here.
|
|
166
|
+
if [ -z "$CLOUD" ] || [ "$CLOUD" = docker ]; then
|
|
167
|
+
docker info >/dev/null 2>&1 \
|
|
168
|
+
|| die "the Docker daemon is not responding — \`docker info\` failed. Start Docker Desktop (an unattended run cannot); or use --cloud <provider> to run the containers off this machine."
|
|
169
|
+
fi
|
|
170
|
+
fi
|
|
171
|
+
if [ "$BYOK" = 1 ]; then
|
|
172
|
+
if [ -n "${ANTHROPIC_API_KEY:-}" ]; then
|
|
173
|
+
export ANTHROPIC_API_KEY # host agent: the child `claude` inherits it and bills the key
|
|
174
|
+
[ "$REMOTE" = 1 ] && AE+=(--ae "ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY")
|
|
175
|
+
elif [ -n "${CLAUDE_CODE_OAUTH_TOKEN:-}" ]; then
|
|
176
|
+
# The host agent strips CLAUDE_CODE_* from the child env on purpose (nested-
|
|
177
|
+
# session hygiene), so an OAuth token can only reach the REMOTE agent.
|
|
178
|
+
[ "$REMOTE" = 1 ] || die "--byok with CLAUDE_CODE_OAUTH_TOKEN only works with --remote-agent; set ANTHROPIC_API_KEY for the host agent"
|
|
179
|
+
AE+=(--ae "CLAUDE_CODE_OAUTH_TOKEN=$CLAUDE_CODE_OAUTH_TOKEN" --ae "CLAUDE_FORCE_OAUTH=1")
|
|
180
|
+
else
|
|
181
|
+
die "--byok needs ANTHROPIC_API_KEY (or CLAUDE_CODE_OAUTH_TOKEN for --remote-agent) in $ENV_FILE"
|
|
182
|
+
fi
|
|
183
|
+
fi
|
|
184
|
+
|
|
185
|
+
ENV_FLAGS=(); [ -n "$CLOUD" ] && ENV_FLAGS=(--env "$CLOUD")
|
|
186
|
+
|
|
187
|
+
redact() { # print argv with any KEY=VALUE secret values masked
|
|
188
|
+
local out=() a
|
|
189
|
+
for a in "$@"; do
|
|
190
|
+
case "$a" in
|
|
191
|
+
*_API_KEY=*|*_TOKEN=*|*_SECRET=*|*_JWT_TOKEN=*) out+=("${a%%=*}=***") ;;
|
|
192
|
+
*) out+=("$(printf '%q' "$a")") ;;
|
|
193
|
+
esac
|
|
194
|
+
done
|
|
195
|
+
printf '%s\n' "${out[*]}"
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
hrun() { # job-name, then extra flags
|
|
199
|
+
local name="$1"; shift
|
|
200
|
+
local cmd=(harbor run -p "$TASK" "${AGENT_FLAGS[@]}" ${ENV_FLAGS[@]+"${ENV_FLAGS[@]}"} ${AE[@]+"${AE[@]}"} \
|
|
201
|
+
-o "$JOBS_DIR" --job-name "$name" -q -y "$@")
|
|
202
|
+
if [ "$DRY" = 1 ]; then echo "+ $(redact "${cmd[@]}")"; return 0; fi
|
|
203
|
+
"${cmd[@]}"
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
# Per-arm reward + cost telemetry (plan §5.3) from summarize.py: reward from
|
|
207
|
+
# harbor's result.json, cost/tokens/turns summed over every claude-output.json
|
|
208
|
+
# the host agent wrote. Remote-agent jobs report cost as n/a, never 0.
|
|
209
|
+
summary() { python3 "$HERE/summarize.py" "$JOBS_DIR/$1" --pretty; }
|
|
210
|
+
field() { python3 "$HERE/summarize.py" "$JOBS_DIR/$1" | python3 -c "import json,sys; v=json.load(sys.stdin)['$2']; print('' if v is None else v)"; }
|
|
211
|
+
|
|
212
|
+
describe() {
|
|
213
|
+
echo "── harness: $([ "$REMOTE" = 1 ] && echo 'built-in claude-code (remote agent)' || echo "host agent (own $ENGINE_BIN CLI)")" \
|
|
214
|
+
"· compute: ${CLOUD:-local docker} · billing: $([ "$BYOK" = 1 ] && echo BYOK || echo subscription)"
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
case "$MODE" in
|
|
218
|
+
run)
|
|
219
|
+
# run mode delivers --claude-md / --prompt-file exactly like ab's with-arm.
|
|
220
|
+
# (Until 2026-08-31 it silently IGNORED them — every `run --claude-md X`
|
|
221
|
+
# trial was an undelivered baseline; the removal arms measured nothing.)
|
|
222
|
+
WITH=()
|
|
223
|
+
[ -z "$CLAUDE_MD" ] || { [ -f "$CLAUDE_MD" ] || CLAUDE_MD="$HERE/$CLAUDE_MD"; WITH+=(--ak "$MD_KEY=$CLAUDE_MD"); }
|
|
224
|
+
[ -z "$PROMPT_FILE" ] || { [ -f "$PROMPT_FILE" ] || PROMPT_FILE="$HERE/$PROMPT_FILE"; WITH+=(--ak "append_system_prompt=$(cat "$PROMPT_FILE")"); }
|
|
225
|
+
describe
|
|
226
|
+
NAME="run-$(date +%H%M%S)"
|
|
227
|
+
hrun "$NAME" ${WITH[@]+"${WITH[@]}"} ${ARGS[@]+"${ARGS[@]}"}
|
|
228
|
+
[ "$DRY" = 1 ] && exit 0
|
|
229
|
+
echo ""
|
|
230
|
+
echo "══ result ($(basename "$TASK")): $(summary "$NAME")"
|
|
231
|
+
echo " job : $JOBS_DIR/$NAME"
|
|
232
|
+
;;
|
|
233
|
+
ab)
|
|
234
|
+
[ -n "$CLAUDE_MD" ] || [ -n "$PROMPT_FILE" ] || die "ab mode needs --claude-md <file> or --prompt-file <file>"
|
|
235
|
+
[ -z "$CLAUDE_MD" ] || [ -f "$CLAUDE_MD" ] || CLAUDE_MD="$HERE/$CLAUDE_MD"
|
|
236
|
+
[ -z "$PROMPT_FILE" ] || [ -f "$PROMPT_FILE" ] || PROMPT_FILE="$HERE/$PROMPT_FILE"
|
|
237
|
+
WITH=()
|
|
238
|
+
[ -z "$CLAUDE_MD" ] || WITH+=(--ak "$MD_KEY=$CLAUDE_MD")
|
|
239
|
+
[ -z "$PROMPT_FILE" ] || WITH+=(--ak "append_system_prompt=$(cat "$PROMPT_FILE")")
|
|
240
|
+
STAMP=$(date +%H%M%S)
|
|
241
|
+
describe
|
|
242
|
+
echo "── arm 1/2: baseline"
|
|
243
|
+
hrun "ab-$STAMP-baseline" ${ARGS[@]+"${ARGS[@]}"}
|
|
244
|
+
echo "── arm 2/2: with $(basename "${CLAUDE_MD:-$PROMPT_FILE}")"
|
|
245
|
+
hrun "ab-$STAMP-with" "${WITH[@]}" ${ARGS[@]+"${ARGS[@]}"}
|
|
246
|
+
[ "$DRY" = 1 ] && exit 0
|
|
247
|
+
B=$(field "ab-$STAMP-baseline" reward_mean); W=$(field "ab-$STAMP-with" reward_mean)
|
|
248
|
+
echo ""
|
|
249
|
+
echo "══ A/B result ($(basename "$TASK"))"
|
|
250
|
+
echo " baseline : $(summary "ab-$STAMP-baseline")"
|
|
251
|
+
echo " with-arm : $(summary "ab-$STAMP-with")"
|
|
252
|
+
python3 - "$B" "$W" <<'PY'
|
|
253
|
+
import sys
|
|
254
|
+
b, w = sys.argv[1:3]
|
|
255
|
+
print(f" delta : {float(w)-float(b):+.3f} reward" if b and w else " delta : n/a (an arm has no reward)")
|
|
256
|
+
PY
|
|
257
|
+
# Cost: a PER-TRIAL delta with a bootstrap CI and a decision, not the
|
|
258
|
+
# difference of two sums the display used to print. A sum has no variance and
|
|
259
|
+
# is confounded by trial count, so it could never tell a saving from noise.
|
|
260
|
+
# Exit 3 = an arm measured no cost at all; that is UNKNOWN, and printing
|
|
261
|
+
# nothing is the honest outcome (cost_delta.py has already said why on stderr).
|
|
262
|
+
python3 "$HERE/cost_delta.py" "$JOBS_DIR/ab-$STAMP-baseline" "$JOBS_DIR/ab-$STAMP-with" --brief \
|
|
263
|
+
| sed 's/^/ /' || true
|
|
264
|
+
echo " jobs : $JOBS_DIR/ab-$STAMP-{baseline,with}"
|
|
265
|
+
;;
|
|
266
|
+
*)
|
|
267
|
+
die "unknown mode: $MODE (use run|ab)" ;;
|
|
268
|
+
esac
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"""Per-arm summary of a Harbor job: reward plus cost telemetry (plan §5.3).
|
|
2
|
+
|
|
3
|
+
python3 summarize.py <job-dir> -> one JSON object on stdout
|
|
4
|
+
python3 summarize.py <job-dir> --pretty -> aligned text for the terminal
|
|
5
|
+
|
|
6
|
+
Reward comes from the job-level result.json (harbor's own aggregate). Cost
|
|
7
|
+
comes from every `claude-output.json` the host agent wrote under the job dir
|
|
8
|
+
(one per trial, `claude -p --output-format json`): total_cost_usd, duration,
|
|
9
|
+
turns and token counts are SUMMED across trials. Cost is reported as null, never
|
|
10
|
+
zero, when no such file exists — "we did not measure" must not read as "it was
|
|
11
|
+
free".
|
|
12
|
+
|
|
13
|
+
The codex host agent writes `codex-output.txt` instead. Since 2026-09-02 that
|
|
14
|
+
file is JSONL (`codex exec --json`), whose final `turn.completed` event carries
|
|
15
|
+
a real usage envelope, so codex arms now report TOKENS. They still report no
|
|
16
|
+
`cost_usd`: codex states token counts, not a price, and inventing one from a
|
|
17
|
+
local price table would be a number nobody measured.
|
|
18
|
+
|
|
19
|
+
That leaves exactly one arm with nothing to read — the remote agent, which
|
|
20
|
+
bills the key directly. The n/a copy therefore still states the FACT rather
|
|
21
|
+
than asserting a cause it cannot verify: a control that lies about WHY it has
|
|
22
|
+
no number is worse than one that says it has none.
|
|
23
|
+
|
|
24
|
+
Kept dependency-free and importable so the contract test can exercise it on a
|
|
25
|
+
synthetic job dir without harbor installed.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
import json
|
|
31
|
+
import sys
|
|
32
|
+
from pathlib import Path
|
|
33
|
+
from typing import Any
|
|
34
|
+
|
|
35
|
+
TOKEN_FIELDS = (
|
|
36
|
+
"input_tokens",
|
|
37
|
+
"output_tokens",
|
|
38
|
+
"cache_read_input_tokens",
|
|
39
|
+
"cache_creation_input_tokens",
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
# codex's usage keys -> the claude-shaped fields this module aggregates, so a
|
|
44
|
+
# mixed job sums into one comparable set. codex has no cache-CREATION counter.
|
|
45
|
+
CODEX_TOKEN_MAP = {
|
|
46
|
+
"input_tokens": "input_tokens",
|
|
47
|
+
"output_tokens": "output_tokens",
|
|
48
|
+
"cached_input_tokens": "cache_read_input_tokens",
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def parse_codex_usage(text: str) -> dict[str, int] | None:
|
|
53
|
+
"""Token usage from `codex exec --json` JSONL, or None when absent.
|
|
54
|
+
|
|
55
|
+
Verified against codex-cli 0.144.0, which emits a final:
|
|
56
|
+
{"type":"turn.completed","usage":{"input_tokens":17970,
|
|
57
|
+
"cached_input_tokens":9984,"output_tokens":5,"reasoning_output_tokens":0}}
|
|
58
|
+
|
|
59
|
+
None means UNKNOWN, never zero. Later events win — a multi-turn run reports
|
|
60
|
+
cumulative usage on its final turn. Non-JSON lines are skipped: the stream
|
|
61
|
+
is progress output and a future codex may add shapes we do not know.
|
|
62
|
+
"""
|
|
63
|
+
found: dict[str, int] | None = None
|
|
64
|
+
for line in text.splitlines():
|
|
65
|
+
line = line.strip()
|
|
66
|
+
if not line.startswith("{"):
|
|
67
|
+
continue
|
|
68
|
+
try:
|
|
69
|
+
event = json.loads(line)
|
|
70
|
+
except ValueError:
|
|
71
|
+
continue
|
|
72
|
+
if not isinstance(event, dict):
|
|
73
|
+
continue
|
|
74
|
+
usage = event.get("usage")
|
|
75
|
+
if not isinstance(usage, dict):
|
|
76
|
+
continue
|
|
77
|
+
mapped = {k: 0 for k in TOKEN_FIELDS}
|
|
78
|
+
for src, dst in CODEX_TOKEN_MAP.items():
|
|
79
|
+
try:
|
|
80
|
+
mapped[dst] = int(usage.get(src) or 0)
|
|
81
|
+
except (TypeError, ValueError):
|
|
82
|
+
mapped[dst] = 0
|
|
83
|
+
found = mapped
|
|
84
|
+
return found
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _mean_reward(result: dict[str, Any]) -> float | None:
|
|
88
|
+
try:
|
|
89
|
+
evals = result["stats"]["evals"]
|
|
90
|
+
first = next(iter(evals.values()))
|
|
91
|
+
return float(first["metrics"][0]["mean"])
|
|
92
|
+
except (KeyError, StopIteration, IndexError, TypeError, ValueError):
|
|
93
|
+
return None
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def trial_reward(agent_output: Path) -> float | None:
|
|
97
|
+
"""This trial's own reward from harbor's per-trial result.json, or None.
|
|
98
|
+
|
|
99
|
+
Layout: <job>/<trial>/agent/claude-output.json alongside
|
|
100
|
+
<job>/<trial>/result.json -> verifier_result.rewards.reward
|
|
101
|
+
|
|
102
|
+
None means UNKNOWN (no verdict written -- a crashed or interrupted trial),
|
|
103
|
+
never 0.0. Scoring an unknown as a failure would make a crashed run look like
|
|
104
|
+
an instruction that did not work.
|
|
105
|
+
"""
|
|
106
|
+
path = agent_output.parent.parent / "result.json"
|
|
107
|
+
try:
|
|
108
|
+
data = json.loads(path.read_text())
|
|
109
|
+
except (OSError, ValueError):
|
|
110
|
+
return None
|
|
111
|
+
if not isinstance(data, dict):
|
|
112
|
+
return None
|
|
113
|
+
rewards = ((data.get("verifier_result") or {}).get("rewards")) or {}
|
|
114
|
+
value = rewards.get("reward")
|
|
115
|
+
try:
|
|
116
|
+
return float(value)
|
|
117
|
+
except (TypeError, ValueError):
|
|
118
|
+
return None
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def summarize(job_dir: Path) -> dict[str, Any]:
|
|
122
|
+
job_dir = Path(job_dir)
|
|
123
|
+
result_path = job_dir / "result.json"
|
|
124
|
+
result = json.loads(result_path.read_text()) if result_path.exists() else {}
|
|
125
|
+
|
|
126
|
+
outputs = sorted(job_dir.rglob("claude-output.json"))
|
|
127
|
+
cost = 0.0
|
|
128
|
+
duration_ms = 0
|
|
129
|
+
turns = 0
|
|
130
|
+
tokens = {k: 0 for k in TOKEN_FIELDS}
|
|
131
|
+
errors = 0
|
|
132
|
+
parsed = 0
|
|
133
|
+
# Per-trial records, kept alongside the sums. The sums answer "what did this
|
|
134
|
+
# arm cost"; only the per-trial series can answer "is the difference real",
|
|
135
|
+
# because a sum has no variance and is confounded by trial count. cost_delta.py
|
|
136
|
+
# reads this; the sums stay for the existing run.sh display contract.
|
|
137
|
+
trials: list[dict[str, Any]] = []
|
|
138
|
+
for path in outputs:
|
|
139
|
+
try:
|
|
140
|
+
out = json.loads(path.read_text())
|
|
141
|
+
except (OSError, ValueError):
|
|
142
|
+
continue
|
|
143
|
+
if not isinstance(out, dict):
|
|
144
|
+
continue
|
|
145
|
+
parsed += 1
|
|
146
|
+
trial_cost = float(out.get("total_cost_usd") or 0.0)
|
|
147
|
+
trial_duration = int(out.get("duration_ms") or 0)
|
|
148
|
+
trial_turns = int(out.get("num_turns") or 0)
|
|
149
|
+
cost += trial_cost
|
|
150
|
+
duration_ms += trial_duration
|
|
151
|
+
turns += trial_turns
|
|
152
|
+
if out.get("is_error"):
|
|
153
|
+
errors += 1
|
|
154
|
+
usage = out.get("usage") or {}
|
|
155
|
+
for k in TOKEN_FIELDS:
|
|
156
|
+
tokens[k] += int(usage.get(k) or 0)
|
|
157
|
+
trials.append(
|
|
158
|
+
{
|
|
159
|
+
"trial": str(path.parent.relative_to(job_dir)),
|
|
160
|
+
"cost_usd": trial_cost,
|
|
161
|
+
"duration_ms": trial_duration,
|
|
162
|
+
"turns": trial_turns,
|
|
163
|
+
"is_error": bool(out.get("is_error")),
|
|
164
|
+
# Paired with the cost so cost-per-success can be resampled: the
|
|
165
|
+
# trial that cost this much is the trial that did or did not pass.
|
|
166
|
+
# None when harbor wrote no verdict for the trial -- unknown, and
|
|
167
|
+
# cost_delta.py drops it rather than counting it as a failure.
|
|
168
|
+
"reward": trial_reward(path),
|
|
169
|
+
}
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
# Codex arms: tokens only. cost_usd stays None because codex reports no price.
|
|
173
|
+
codex_parsed = 0
|
|
174
|
+
for path in sorted(job_dir.rglob("codex-output.txt")):
|
|
175
|
+
try:
|
|
176
|
+
usage = parse_codex_usage(path.read_text(errors="replace"))
|
|
177
|
+
except OSError:
|
|
178
|
+
continue
|
|
179
|
+
if usage is None:
|
|
180
|
+
continue
|
|
181
|
+
codex_parsed += 1
|
|
182
|
+
for k in TOKEN_FIELDS:
|
|
183
|
+
tokens[k] += usage[k]
|
|
184
|
+
|
|
185
|
+
measured_tokens = parsed > 0 or codex_parsed > 0
|
|
186
|
+
|
|
187
|
+
stats = result.get("stats") or {}
|
|
188
|
+
n_trials = stats.get("n_trials")
|
|
189
|
+
if n_trials is None:
|
|
190
|
+
n_trials = len([p for p in job_dir.iterdir() if (p / "result.json").exists()]) if job_dir.exists() else 0
|
|
191
|
+
|
|
192
|
+
return {
|
|
193
|
+
"job": job_dir.name,
|
|
194
|
+
"reward_mean": _mean_reward(result),
|
|
195
|
+
"n_trials": n_trials,
|
|
196
|
+
# null, not 0, when nothing was measured (remote agent, or no trials ran).
|
|
197
|
+
# cost_usd is claude-only: codex reports tokens, never a price.
|
|
198
|
+
"cost_usd": round(cost, 6) if parsed else None,
|
|
199
|
+
"duration_ms": duration_ms if parsed else None,
|
|
200
|
+
"turns": turns if parsed else None,
|
|
201
|
+
"tokens": tokens if measured_tokens else None,
|
|
202
|
+
"agent_errors": errors if parsed else None,
|
|
203
|
+
# null, not [], when nothing was measured — same reason as cost_usd: an
|
|
204
|
+
# empty series and an unmeasured arm must not read alike downstream.
|
|
205
|
+
"trials": trials if parsed else None,
|
|
206
|
+
"host_agent_outputs": parsed,
|
|
207
|
+
"codex_agent_outputs": codex_parsed,
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def pretty(s: dict[str, Any]) -> str:
|
|
212
|
+
reward = "n/a" if s["reward_mean"] is None else f"{s['reward_mean']:.3f}"
|
|
213
|
+
if s["cost_usd"] is None and s["tokens"] is not None:
|
|
214
|
+
# A codex arm: real token counts, but codex states no price, so a dollar
|
|
215
|
+
# figure here would be invented rather than measured.
|
|
216
|
+
t = s["tokens"]
|
|
217
|
+
cost = (
|
|
218
|
+
f"cost n/a (codex reports tokens, not price) · "
|
|
219
|
+
f"in {t['input_tokens']} / out {t['output_tokens']} / "
|
|
220
|
+
f"cache-read {t['cache_read_input_tokens']} tokens"
|
|
221
|
+
)
|
|
222
|
+
elif s["cost_usd"] is None:
|
|
223
|
+
cost = (
|
|
224
|
+
"n/a (no per-trial cost or token output — the remote agent bills "
|
|
225
|
+
"the key directly; a host claude or codex arm would have written one)"
|
|
226
|
+
)
|
|
227
|
+
else:
|
|
228
|
+
t = s["tokens"]
|
|
229
|
+
cost = (
|
|
230
|
+
f"${s['cost_usd']:.4f} · {s['duration_ms'] / 1000:.0f}s · {s['turns']} turns · "
|
|
231
|
+
f"in {t['input_tokens']} / out {t['output_tokens']} / "
|
|
232
|
+
f"cache-read {t['cache_read_input_tokens']} tokens"
|
|
233
|
+
+ (f" · {s['agent_errors']} agent error(s)" if s["agent_errors"] else "")
|
|
234
|
+
)
|
|
235
|
+
return f"reward {reward} over {s['n_trials']} trial(s) · {cost}"
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def main(argv: list[str]) -> int:
|
|
239
|
+
if len(argv) < 2:
|
|
240
|
+
print("usage: summarize.py <job-dir> [--pretty]", file=sys.stderr)
|
|
241
|
+
return 2
|
|
242
|
+
s = summarize(Path(argv[1]))
|
|
243
|
+
print(pretty(s) if "--pretty" in argv[2:] else json.dumps(s))
|
|
244
|
+
return 0
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
if __name__ == "__main__":
|
|
248
|
+
sys.exit(main(sys.argv))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,b,c}from"../chunk-
|
|
1
|
+
import{a,b,c}from"../chunk-4FJYVYCU.js";import"../chunk-3AV3GTMP.js";import"../chunk-76UKAFNM.js";import"../chunk-42A4PUW7.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{c as _resetRefreshAttempt,b as bootstrapActiveOrg,a as maybeRefreshActiveOrg};
|
package/dist/lib/agent-loop.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,b,c,d,e}from"../chunk-
|
|
1
|
+
import{a,b,c,d,e}from"../chunk-BAITMD76.js";import"../chunk-W23OYQXI.js";import"../chunk-EMLLGASZ.js";import"../chunk-IEQDLURA.js";import"../chunk-KINIFUZQ.js";import"../chunk-V55ROUNP.js";import"../chunk-XMA6SWOT.js";import"../chunk-RAQLVO2X.js";import"../chunk-DHX4U6EC.js";import"../chunk-NYNHX7OX.js";import"../chunk-VXL5H3VZ.js";import"../chunk-QAMHZY2P.js";import"../chunk-RMRVUI7B.js";import"../chunk-ISFPPDDB.js";import"../chunk-ZYGBABMZ.js";import"../chunk-5RBLIVBF.js";import"../chunk-AIYFT4P6.js";import"../chunk-PZS55PW2.js";import"../chunk-3IMRLHJJ.js";import"../chunk-3ZHVP3KE.js";import"../chunk-EUHRTEVJ.js";import"../chunk-HOQPVOMF.js";import"../chunk-GKVHFXUQ.js";import"../chunk-LJRJ2RAC.js";import"../chunk-E7GQJML3.js";import"../chunk-QRIJ3AHP.js";import"../chunk-CT6GJQIR.js";import"../chunk-OVS7ZDJ4.js";import"../chunk-AGEZAKCC.js";import"../chunk-I6ZQOMZS.js";import"../chunk-6ANODRDT.js";import"../chunk-3UKZJAFS.js";import"../chunk-XJ25HFIT.js";import"../chunk-SJKS3PYX.js";import"../chunk-YK2IEHLB.js";import"../chunk-PIVEJTNF.js";import"../chunk-7MTYUTUN.js";import"../chunk-MMLRWCBW.js";import"../chunk-GIRPEMTW.js";import"../chunk-SIGZEQ3K.js";import"../chunk-DQYYHX6K.js";import"../chunk-2UK4DZFW.js";import"../chunk-3FNTV2TW.js";import"../chunk-JTYVBR5H.js";import"../chunk-B5X6HCBK.js";import"../chunk-T75KAEJO.js";import"../chunk-RXZLBSDO.js";import"../chunk-LJRE3LZ2.js";import"../chunk-MXHAXY66.js";import"../chunk-FYZ6HHCV.js";import"../chunk-OP4U3XBZ.js";import"../chunk-HNYHZO2J.js";import"../chunk-6UEFCMR2.js";import"../chunk-MODXEGCU.js";import"../chunk-RBSEE2Z6.js";import"../chunk-KOYHJFB3.js";import"../chunk-POEMCITL.js";import"../chunk-M7QSC64D.js";import"../chunk-XGMOVQ5G.js";import"../chunk-LB24UKHZ.js";import"../chunk-G7V4ZZZ3.js";import"../chunk-43VKTVM3.js";import"../chunk-AHLVY52I.js";import"../chunk-SCQK52SL.js";import"../chunk-ZK3ACE4T.js";import"../chunk-N4YPDZJF.js";import"../chunk-PPAHIVG5.js";import"../chunk-5MXZJWQS.js";import"../chunk-CT7FWSIU.js";import"../chunk-N7ODX6PO.js";import"../chunk-OZQNSELV.js";import"../chunk-HFGO5762.js";import"../chunk-VS5ROGDP.js";import"../chunk-H6FVXVGG.js";import"../chunk-SWSOEYC7.js";import"../chunk-U2NT5OSQ.js";import"../chunk-KGURGIZ2.js";import"../chunk-GYNZ3OZF.js";import"../chunk-UPFH72PF.js";import"../chunk-DVU5PHPM.js";import"../chunk-CDY7TQFZ.js";import"../chunk-VBXL7XO7.js";import"../chunk-FBSZ6KCM.js";import"../chunk-JP6ULOEX.js";import"../chunk-SG4UDDHB.js";import"../chunk-GPBN4ROE.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-76UKAFNM.js";import"../chunk-42A4PUW7.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{b as CAPABILITIES,a as HANDLERS,c as availableCapabilities,d as pollForWork,e as runAgentLoop};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,b,c,d,e,f,g}from"../chunk-
|
|
1
|
+
import{a,b,c,d,e,f,g}from"../chunk-WWQWHC4K.js";import"../chunk-76UKAFNM.js";import"../chunk-42A4PUW7.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{d as classifyRecord,e as emitRecordsAsEvents,c as extractUserPrompt,b as findMaxStepIndex,a as readNewRecords,g as stateApi,f as tailAntigravityTranscript};
|
package/dist/lib/api-client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,b,c,d,e,f,g,h,i}from"../chunk-
|
|
1
|
+
import{a,b,c,d,e,f,g,h,i}from"../chunk-76UKAFNM.js";import"../chunk-42A4PUW7.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{b as ApiError,a as DEFAULT_API_URL,d as api,i as apiDelete,e as apiGet,h as apiPatch,f as apiPost,g as apiPut,c as getBaseUrl};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a}from"../chunk-DQYYHX6K.js";import"../chunk-ZLLER3HP.js";export{a as selectNightlyCases};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,b,c,d,e,f,g}from"../chunk-
|
|
1
|
+
import{a,b,c,d,e,f,g}from"../chunk-VALRPZXH.js";import"../chunk-QI3FJKGK.js";import"../chunk-ZLLER3HP.js";export{f as applyScopeEdit,g as backupUnparseableConfig,a as captureConfigPath,e as isUsableRoot,d as normaliseRoot,b as readCaptureConfig,c as writeCaptureConfig};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,b,c,d,e,f,g,h}from"../chunk-
|
|
1
|
+
import{a,b,c,d,e,f,g,h,i,j,k}from"../chunk-QI3FJKGK.js";import"../chunk-ZLLER3HP.js";export{a as CAPTURE_CONFIG_FILENAME,j as createCodexScopeWatcher,k as createPiScopeWatcher,f as describeCaptureScope,g as describeCodexCaptureScope,h as describeHooksCaptureScope,i as describePiCaptureScope,e as isPathInScope,b as loadCodexCaptureScope,c as loadHooksCaptureScope,d as loadPiCaptureScope};
|
package/dist/lib/codex-exec.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,b,c,d}from"../chunk-
|
|
1
|
+
import{a,b,c,d}from"../chunk-SG4UDDHB.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-ZLLER3HP.js";export{b as buildCodexArgs,a as codexModelId,d as executeCodexEval,c as parseCodexUsage};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a}from"../chunk-
|
|
1
|
+
import{a}from"../chunk-RG3R4EAB.js";import"../chunk-FKTT7A4H.js";import"../chunk-76UKAFNM.js";import"../chunk-42A4PUW7.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{a as ensureDeviceApiKey};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a}from"../chunk-
|
|
1
|
+
import{a}from"../chunk-VIFOLTZT.js";import"../chunk-76UKAFNM.js";import"../chunk-42A4PUW7.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{a as ensureFreshToken};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a}from"../chunk-AHLVY52I.js";import"../chunk-ZLLER3HP.js";export{a as findOpenAccumulation};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a}from"../chunk-
|
|
1
|
+
import{a}from"../chunk-KOYHJFB3.js";import"../chunk-FBSZ6KCM.js";import"../chunk-JP6ULOEX.js";import"../chunk-SG4UDDHB.js";import"../chunk-GPBN4ROE.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-ZLLER3HP.js";export{a as analyzeEvalResults};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,b,c}from"../chunk-
|
|
1
|
+
import{a,b,c}from"../chunk-IO46ICZY.js";import"../chunk-VBXL7XO7.js";import"../chunk-76UKAFNM.js";import"../chunk-42A4PUW7.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{b as aggregateBenchmark,c as postBenchmark,a as summarizeRuns};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,b,c,d,e,f,g}from"../chunk-
|
|
1
|
+
import{a,b,c,d,e,f,g,h,i}from"../chunk-SCQK52SL.js";import"../chunk-H6FVXVGG.js";import"../chunk-SWSOEYC7.js";import"../chunk-U2NT5OSQ.js";import"../chunk-KGURGIZ2.js";import"../chunk-GYNZ3OZF.js";import"../chunk-UPFH72PF.js";import"../chunk-DVU5PHPM.js";import"../chunk-CDY7TQFZ.js";import"../chunk-FBSZ6KCM.js";import"../chunk-JP6ULOEX.js";import"../chunk-SG4UDDHB.js";import"../chunk-GPBN4ROE.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-76UKAFNM.js";import"../chunk-42A4PUW7.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{a as CANDIDATE_ARM,b as PRIOR_VERSION_ARM,f as accountForFailures,g as attributeShortfall,h as buildCandidateQueue,d as measurementBatchKey,c as observedExecutionKey,e as pairCandidateRuns,i as runCandidateBatchAndPost};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,b}from"../chunk-
|
|
1
|
+
import{a,b}from"../chunk-OP4U3XBZ.js";import"../chunk-ZK3ACE4T.js";import"../chunk-N4YPDZJF.js";import"../chunk-PPAHIVG5.js";import"../chunk-5MXZJWQS.js";import"../chunk-CT7FWSIU.js";import"../chunk-N7ODX6PO.js";import"../chunk-FBSZ6KCM.js";import"../chunk-JP6ULOEX.js";import"../chunk-SG4UDDHB.js";import"../chunk-GPBN4ROE.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-XQYAVSUQ.js";import"../chunk-ZLLER3HP.js";export{a as buildFeedbackBlock,b as generateEvalCases};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a}from"../chunk-
|
|
1
|
+
import{a}from"../chunk-MMLRWCBW.js";import"../chunk-OP4U3XBZ.js";import"../chunk-KOYHJFB3.js";import"../chunk-ZK3ACE4T.js";import"../chunk-N4YPDZJF.js";import"../chunk-PPAHIVG5.js";import"../chunk-5MXZJWQS.js";import"../chunk-CT7FWSIU.js";import"../chunk-N7ODX6PO.js";import"../chunk-DVU5PHPM.js";import"../chunk-CDY7TQFZ.js";import"../chunk-FBSZ6KCM.js";import"../chunk-JP6ULOEX.js";import"../chunk-SG4UDDHB.js";import"../chunk-GPBN4ROE.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-76UKAFNM.js";import"../chunk-42A4PUW7.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{a as processConversationJob};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a,b,c,d,e,f}from"../chunk-
|
|
1
|
+
import{a,b,c,d,e,f}from"../chunk-FBSZ6KCM.js";import"../chunk-JP6ULOEX.js";import"../chunk-SG4UDDHB.js";import"../chunk-GPBN4ROE.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-ZLLER3HP.js";export{d as buildClaudeArgs,e as describeExitFailure,f as executeEval,c as parseClaudeJsonOutput,b as resolveCodexEvalModel,a as resolveEvalEngine};
|
package/dist/lib/eval-grader.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a}from"../chunk-
|
|
1
|
+
import{a}from"../chunk-DVU5PHPM.js";import"../chunk-CDY7TQFZ.js";import"../chunk-FBSZ6KCM.js";import"../chunk-JP6ULOEX.js";import"../chunk-SG4UDDHB.js";import"../chunk-GPBN4ROE.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-ZLLER3HP.js";export{a as gradeEvalOutput};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a}from"../chunk-
|
|
1
|
+
import{a}from"../chunk-7MTYUTUN.js";import"../chunk-FBSZ6KCM.js";import"../chunk-JP6ULOEX.js";import"../chunk-SG4UDDHB.js";import"../chunk-GPBN4ROE.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-ZLLER3HP.js";export{a as judgeEvalQuality};
|