@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.
Files changed (335) hide show
  1. package/dist/base-command.js +1 -1
  2. package/dist/chunk-2UK4DZFW.js +12 -0
  3. package/dist/{chunk-3UPHCQWI.js → chunk-35YVHBLL.js} +1 -1
  4. package/dist/{chunk-VH2EAP4J.js → chunk-3FNTV2TW.js} +1 -1
  5. package/dist/{chunk-WQX4RRBQ.js → chunk-3IMRLHJJ.js} +1 -1
  6. package/dist/chunk-42A4PUW7.js +48 -0
  7. package/dist/chunk-43VKTVM3.js +1 -0
  8. package/dist/{chunk-CYYDQFRY.js → chunk-44TYRMIS.js} +1 -1
  9. package/dist/{chunk-25RDT32M.js → chunk-4FJYVYCU.js} +1 -1
  10. package/dist/{chunk-I3M5VBLT.js → chunk-5BT375C7.js} +1 -1
  11. package/dist/{chunk-7AWFSFR7.js → chunk-5Z3H5JHK.js} +1 -1
  12. package/dist/{chunk-25Q3Y7TC.js → chunk-6ANODRDT.js} +1 -1
  13. package/dist/{chunk-APDRR6FS.js → chunk-76UKAFNM.js} +1 -1
  14. package/dist/{chunk-VXUKXGRX.js → chunk-7MTYUTUN.js} +2 -2
  15. package/dist/{chunk-JWFRI32Y.js → chunk-AGEZAKCC.js} +1 -1
  16. package/dist/chunk-AHLVY52I.js +1 -0
  17. package/dist/{chunk-MNQPCNGQ.js → chunk-AIYFT4P6.js} +1 -1
  18. package/dist/{chunk-UYPBIXF2.js → chunk-B5X6HCBK.js} +1 -1
  19. package/dist/chunk-BAITMD76.js +1 -0
  20. package/dist/{chunk-GJBS6QYC.js → chunk-BFQVAU6N.js} +1 -1
  21. package/dist/{chunk-UE76F2NQ.js → chunk-BMT5WMEV.js} +20 -20
  22. package/dist/chunk-CT6GJQIR.js +1 -0
  23. package/dist/chunk-CT7FWSIU.js +3 -0
  24. package/dist/chunk-DHX4U6EC.js +13 -0
  25. package/dist/chunk-DQYYHX6K.js +1 -0
  26. package/dist/{chunk-WH3IPXXQ.js → chunk-DVU5PHPM.js} +5 -5
  27. package/dist/chunk-E7GQJML3.js +1 -0
  28. package/dist/{chunk-4N43IBXH.js → chunk-EMLLGASZ.js} +1 -1
  29. package/dist/{chunk-Y7QIOPN5.js → chunk-EUHRTEVJ.js} +1 -1
  30. package/dist/chunk-FBSZ6KCM.js +1 -0
  31. package/dist/{chunk-5XK6LB2T.js → chunk-FKTT7A4H.js} +1 -1
  32. package/dist/{chunk-V2USQH27.js → chunk-FYZ6HHCV.js} +1 -1
  33. package/dist/chunk-GH4EZK2O.js +1 -0
  34. package/dist/{chunk-DUBBL57L.js → chunk-GKVHFXUQ.js} +1 -1
  35. package/dist/chunk-GPBN4ROE.js +2 -0
  36. package/dist/chunk-GYNZ3OZF.js +1 -0
  37. package/dist/chunk-H6FVXVGG.js +1 -0
  38. package/dist/{chunk-6GAIYJ6K.js → chunk-HNYHZO2J.js} +1 -1
  39. package/dist/{chunk-RJX75Y7J.js → chunk-I6ZQOMZS.js} +1 -1
  40. package/dist/{chunk-O2HCD6XL.js → chunk-IO46ICZY.js} +1 -1
  41. package/dist/chunk-IQEZ3T5A.js +1 -0
  42. package/dist/{chunk-KV5A77XW.js → chunk-ISFPPDDB.js} +1 -1
  43. package/dist/chunk-J4W6GNCF.js +2 -0
  44. package/dist/chunk-JP6ULOEX.js +2 -0
  45. package/dist/{chunk-J6QMBMC2.js → chunk-JTYVBR5H.js} +1 -1
  46. package/dist/{chunk-BG55WDDX.js → chunk-KOYHJFB3.js} +1 -1
  47. package/dist/chunk-LJRJ2RAC.js +4 -0
  48. package/dist/chunk-MHVHGKDK.js +3 -0
  49. package/dist/{chunk-PVGUDJD7.js → chunk-MMLRWCBW.js} +1 -1
  50. package/dist/chunk-MMM4B3KH.js +1 -0
  51. package/dist/{chunk-ZGW3N3A6.js → chunk-MU7KKU3O.js} +1 -1
  52. package/dist/{chunk-YI2OWO6R.js → chunk-MXHAXY66.js} +1 -1
  53. package/dist/chunk-N4YPDZJF.js +9 -0
  54. package/dist/{chunk-VIQ25ORK.js → chunk-NYNHX7OX.js} +1 -1
  55. package/dist/{chunk-RK663O4M.js → chunk-OP4U3XBZ.js} +6 -6
  56. package/dist/{chunk-6W2GSV4O.js → chunk-OVS7ZDJ4.js} +1 -1
  57. package/dist/chunk-PIVEJTNF.js +1 -0
  58. package/dist/chunk-POEMCITL.js +1 -0
  59. package/dist/chunk-PPAHIVG5.js +1 -0
  60. package/dist/{chunk-NBEZ5FAU.js → chunk-Q36QSFSB.js} +1 -1
  61. package/dist/chunk-Q776YUBD.js +1 -0
  62. package/dist/chunk-QAMHZY2P.js +1 -0
  63. package/dist/chunk-QI3FJKGK.js +1 -0
  64. package/dist/{chunk-WOJ733IB.js → chunk-QRIJ3AHP.js} +1 -1
  65. package/dist/chunk-RAQLVO2X.js +1 -0
  66. package/dist/{chunk-M2VVRQKA.js → chunk-RG3R4EAB.js} +1 -1
  67. package/dist/{chunk-WY3VVX3R.js → chunk-RMRVUI7B.js} +1 -1
  68. package/dist/{chunk-GBWQENAH.js → chunk-RXZLBSDO.js} +1 -1
  69. package/dist/chunk-SCQK52SL.js +1 -0
  70. package/dist/{chunk-BZS5QRWB.js → chunk-SG4UDDHB.js} +1 -1
  71. package/dist/chunk-SWSOEYC7.js +1 -0
  72. package/dist/chunk-T75KAEJO.js +25 -0
  73. package/dist/{chunk-U7TBEC3I.js → chunk-V55ROUNP.js} +1 -1
  74. package/dist/{chunk-SHYP27B7.js → chunk-VALRPZXH.js} +1 -1
  75. package/dist/{chunk-P2WSDHIA.js → chunk-VIFOLTZT.js} +1 -1
  76. package/dist/{chunk-6QLZT7EP.js → chunk-VU24IH5S.js} +1 -1
  77. package/dist/{chunk-6ZPSVZNH.js → chunk-VXL5H3VZ.js} +1 -1
  78. package/dist/{chunk-QFKUSNUB.js → chunk-W23OYQXI.js} +1 -1
  79. package/dist/{chunk-QTCWOIT4.js → chunk-WWQWHC4K.js} +1 -1
  80. package/dist/{chunk-LTQ5BJYL.js → chunk-XGMOVQ5G.js} +1 -1
  81. package/dist/{chunk-4COLIGD7.js → chunk-XJ25HFIT.js} +1 -1
  82. package/dist/{chunk-3MDEGOUG.js → chunk-XMA6SWOT.js} +1 -1
  83. package/dist/{chunk-WJZY5Y22.js → chunk-XMTKP74H.js} +1 -1
  84. package/dist/chunk-XQYAVSUQ.js +1 -0
  85. package/dist/{chunk-2EX27VJ3.js → chunk-YK2IEHLB.js} +1 -1
  86. package/dist/chunk-ZK3ACE4T.js +1 -0
  87. package/dist/commands/antigravity/backfill.js +1 -1
  88. package/dist/commands/auth/create-key.js +1 -1
  89. package/dist/commands/auth/login.js +1 -1
  90. package/dist/commands/auth/logout.js +1 -1
  91. package/dist/commands/auth/revoke-key.js +1 -1
  92. package/dist/commands/auth/signup.js +1 -1
  93. package/dist/commands/auth/status.js +1 -1
  94. package/dist/commands/capture/scope.js +1 -1
  95. package/dist/commands/catalog/index.js +1 -1
  96. package/dist/commands/catalog/recommend.js +1 -1
  97. package/dist/commands/crons/list.js +1 -1
  98. package/dist/commands/crons/run.js +2 -2
  99. package/dist/commands/dashboard.js +1 -1
  100. package/dist/commands/diagnostics.js +1 -1
  101. package/dist/commands/eval-targets/create.js +1 -1
  102. package/dist/commands/eval-targets/list.js +1 -1
  103. package/dist/commands/evals/agent.js +3 -3
  104. package/dist/commands/evals/auto-run.js +1 -1
  105. package/dist/commands/evals/benchmark.js +1 -1
  106. package/dist/commands/evals/compare.js +1 -1
  107. package/dist/commands/evals/create.js +1 -1
  108. package/dist/commands/evals/optimize-description.js +1 -1
  109. package/dist/commands/evals/optimize.js +1 -1
  110. package/dist/commands/evals/refine-cases.js +1 -1
  111. package/dist/commands/evals/run.js +1 -1
  112. package/dist/commands/evals/validate-judge.js +1 -1
  113. package/dist/commands/experiments/list.js +1 -1
  114. package/dist/commands/gateway/ensure.js +1 -1
  115. package/dist/commands/hooks/emit-instructions.js +1 -1
  116. package/dist/commands/hooks/install.js +1 -1
  117. package/dist/commands/hooks/run.js +1 -1
  118. package/dist/commands/hooks/uninstall.js +1 -1
  119. package/dist/commands/instructions/create.js +1 -1
  120. package/dist/commands/instructions/dedupe.js +1 -1
  121. package/dist/commands/instructions/delete.js +1 -1
  122. package/dist/commands/instructions/fork.js +1 -1
  123. package/dist/commands/instructions/get.js +1 -1
  124. package/dist/commands/instructions/list.js +1 -1
  125. package/dist/commands/instructions/promote.js +1 -1
  126. package/dist/commands/instructions/pull.js +1 -1
  127. package/dist/commands/instructions/restore.js +1 -1
  128. package/dist/commands/instructions/retract.js +1 -1
  129. package/dist/commands/instructions/upstream.js +1 -1
  130. package/dist/commands/instructions/versions.js +1 -1
  131. package/dist/commands/launcher.js +1 -1
  132. package/dist/commands/local/down.js +1 -1
  133. package/dist/commands/local/up.js +1 -1
  134. package/dist/commands/org/current.js +1 -1
  135. package/dist/commands/org/list.js +1 -1
  136. package/dist/commands/org/switch.js +1 -1
  137. package/dist/commands/packs/add-instruction.js +1 -1
  138. package/dist/commands/packs/apply.js +1 -1
  139. package/dist/commands/packs/create.js +1 -1
  140. package/dist/commands/packs/fork.js +1 -1
  141. package/dist/commands/packs/get.js +1 -1
  142. package/dist/commands/packs/list.js +1 -1
  143. package/dist/commands/packs/remove-instruction.js +1 -1
  144. package/dist/commands/proxy/env.js +1 -1
  145. package/dist/commands/proxy/logs.js +1 -1
  146. package/dist/commands/proxy/restart.js +1 -1
  147. package/dist/commands/proxy/setup.js +1 -1
  148. package/dist/commands/proxy/start.js +1 -1
  149. package/dist/commands/proxy/status.js +1 -1
  150. package/dist/commands/proxy/stop.js +1 -1
  151. package/dist/commands/research/backfill.js +1 -1
  152. package/dist/commands/research/tail-transcript.js +1 -1
  153. package/dist/commands/service/install.js +18 -18
  154. package/dist/commands/service/status.js +1 -1
  155. package/dist/commands/service/uninstall.js +1 -1
  156. package/dist/commands/sessions/analyze.js +1 -1
  157. package/dist/commands/sessions/delete.js +1 -1
  158. package/dist/commands/sessions/end.js +1 -1
  159. package/dist/commands/sessions/import.js +1 -1
  160. package/dist/commands/sessions/list.js +1 -1
  161. package/dist/commands/sessions/start.js +1 -1
  162. package/dist/commands/setup.js +1 -1
  163. package/dist/commands/skills/export-approved.js +1 -1
  164. package/dist/commands/skills/install.js +1 -1
  165. package/dist/commands/skills/list.js +1 -1
  166. package/dist/commands/skills/publish.js +1 -1
  167. package/dist/commands/skills/search.js +1 -1
  168. package/dist/commands/skills/update.js +1 -1
  169. package/dist/commands/suggestions/accept.js +1 -1
  170. package/dist/commands/suggestions/auto.js +1 -1
  171. package/dist/commands/suggestions/dismiss.js +1 -1
  172. package/dist/commands/suggestions/list.js +1 -1
  173. package/dist/commands/suggestions/refresh.js +1 -1
  174. package/dist/commands/suggestions/undo.js +1 -1
  175. package/dist/dashboard/Dashboard.js +1 -1
  176. package/dist/dashboard/data.js +1 -1
  177. package/dist/dashboard/launcher/LauncherOverlay.js +1 -1
  178. package/dist/dashboard/launcher/api.js +1 -1
  179. package/dist/dashboard/launcher/useLaunchJobs.js +1 -1
  180. package/dist/dashboard/panels/measurement.js +1 -0
  181. package/dist/dist-GSHUC7UU.js +1 -0
  182. package/dist/harbor/cost_delta.py +377 -0
  183. package/dist/harbor/mcp_container_shell.py +156 -0
  184. package/dist/harbor/provenance.py +361 -0
  185. package/dist/harbor/rm-batch-task/environment/Dockerfile +6 -0
  186. package/dist/harbor/rm-batch-task/environment/items.jsonl +60 -0
  187. package/dist/harbor/rm-batch-task/inject.md +8 -0
  188. package/dist/harbor/rm-batch-task/instruction.md +8 -0
  189. package/dist/harbor/rm-batch-task/solution/solve.sh +68 -0
  190. package/dist/harbor/rm-batch-task/task.toml +30 -0
  191. package/dist/harbor/rm-batch-task/tests/test.sh +23 -0
  192. package/dist/harbor/rm-batch-task/tests/test_outputs.py +32 -0
  193. package/dist/harbor/rm-locality-task/environment/Dockerfile +8 -0
  194. package/dist/harbor/rm-locality-task/environment/workspace/deploy/prod/ingest.yaml +3 -0
  195. package/dist/harbor/rm-locality-task/environment/workspace/deploy/staging/ingest.yaml +3 -0
  196. package/dist/harbor/rm-locality-task/environment/workspace/docs/architecture/ingest.md +6 -0
  197. package/dist/harbor/rm-locality-task/environment/workspace/legacy/ingest_v1/config.yaml +2 -0
  198. package/dist/harbor/rm-locality-task/environment/workspace/packages/shared/defaults.py +4 -0
  199. package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/config/limits.defaults.yaml +4 -0
  200. package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/config/limits.yaml +3 -0
  201. package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/loader.py +15 -0
  202. package/dist/harbor/rm-locality-task/environment/workspace/tests/fixtures/ingest_config.yaml +3 -0
  203. package/dist/harbor/rm-locality-task/inject.md +12 -0
  204. package/dist/harbor/rm-locality-task/instruction.md +4 -0
  205. package/dist/harbor/rm-locality-task/solution/solve.sh +14 -0
  206. package/dist/harbor/rm-locality-task/task.toml +30 -0
  207. package/dist/harbor/rm-locality-task/tests/test.sh +23 -0
  208. package/dist/harbor/rm-locality-task/tests/test_outputs.py +19 -0
  209. package/dist/harbor/rm-migrations-task/environment/Dockerfile +7 -0
  210. package/dist/harbor/rm-migrations-task/environment/applied.txt +2 -0
  211. package/dist/harbor/rm-migrations-task/environment/migrations/00001_init.sql +1 -0
  212. package/dist/harbor/rm-migrations-task/environment/migrations/00002_add_email.sql +1 -0
  213. package/dist/harbor/rm-migrations-task/inject.md +7 -0
  214. package/dist/harbor/rm-migrations-task/instruction.md +8 -0
  215. package/dist/harbor/rm-migrations-task/solution/solve.sh +8 -0
  216. package/dist/harbor/rm-migrations-task/task.toml +30 -0
  217. package/dist/harbor/rm-migrations-task/tests/test.sh +23 -0
  218. package/dist/harbor/rm-migrations-task/tests/test_outputs.py +36 -0
  219. package/dist/harbor/rm-pagination-task/environment/Dockerfile +6 -0
  220. package/dist/harbor/rm-pagination-task/environment/store.py +29 -0
  221. package/dist/harbor/rm-pagination-task/inject.md +8 -0
  222. package/dist/harbor/rm-pagination-task/instruction.md +5 -0
  223. package/dist/harbor/rm-pagination-task/solution/solve.sh +7 -0
  224. package/dist/harbor/rm-pagination-task/task.toml +30 -0
  225. package/dist/harbor/rm-pagination-task/tests/test.sh +23 -0
  226. package/dist/harbor/rm-pagination-task/tests/test_outputs.py +14 -0
  227. package/dist/harbor/rm_host_claude.py +264 -0
  228. package/dist/harbor/rm_host_codex.py +208 -0
  229. package/dist/harbor/run.sh +268 -0
  230. package/dist/harbor/summarize.py +248 -0
  231. package/dist/lib/active-org-refresh.js +1 -1
  232. package/dist/lib/agent-loop.js +1 -1
  233. package/dist/lib/antigravity-transcript.js +1 -1
  234. package/dist/lib/api-client.js +1 -1
  235. package/dist/lib/autorun-batch.js +1 -0
  236. package/dist/lib/capture-scope-config.js +1 -1
  237. package/dist/lib/codex-capture-scope.js +1 -1
  238. package/dist/lib/codex-exec.js +1 -1
  239. package/dist/lib/ensure-api-key.js +1 -1
  240. package/dist/lib/ensure-fresh-token.js +1 -1
  241. package/dist/lib/eval-accumulation.js +1 -0
  242. package/dist/lib/eval-analyzer.js +1 -1
  243. package/dist/lib/eval-benchmark.js +1 -1
  244. package/dist/lib/eval-candidate-run.js +1 -1
  245. package/dist/lib/eval-case-generator.js +1 -1
  246. package/dist/lib/eval-conversation-handler.js +1 -1
  247. package/dist/lib/eval-executor.js +1 -1
  248. package/dist/lib/eval-grader.js +1 -1
  249. package/dist/lib/eval-meta-judge.js +1 -1
  250. package/dist/lib/eval-resume.js +1 -1
  251. package/dist/lib/eval-run-batch.js +1 -1
  252. package/dist/lib/eval-trigger-tester.js +1 -1
  253. package/dist/lib/evolution-enrolment.js +1 -1
  254. package/dist/lib/harbor-readiness.js +1 -1
  255. package/dist/lib/hooks-capture-gate.js +1 -1
  256. package/dist/lib/insights/generation/installed-asks.js +1 -1
  257. package/dist/lib/insights/nomination/nominate.js +1 -1
  258. package/dist/lib/instruction-proposer.js +1 -1
  259. package/dist/lib/instruction-snapshot.js +1 -1
  260. package/dist/lib/instructions/acceptance/accept-events.js +1 -1
  261. package/dist/lib/instructions/acceptance/accept-hook.js +1 -1
  262. package/dist/lib/instructions/acceptance/agent-instruction-files.js +1 -1
  263. package/dist/lib/instructions/acceptance/hook-install.js +1 -1
  264. package/dist/lib/instructions/acceptance/reverse-applications.js +1 -1
  265. package/dist/lib/instructions/acceptance/suggestion-accept.js +1 -1
  266. package/dist/lib/jobs/handlers/cron-auto-accept-suggestions.js +1 -1
  267. package/dist/lib/jobs/handlers/cron-eval-autorun.js +1 -1
  268. package/dist/lib/jobs/handlers/cron-instruction-evolution.js +1 -1
  269. package/dist/lib/jobs/handlers/cron-instruction-training.js +1 -1
  270. package/dist/lib/jobs/handlers/cron-reconcile-attribution.js +1 -1
  271. package/dist/lib/jobs/handlers/cron-refine-cases.js +1 -1
  272. package/dist/lib/jobs/handlers/cron-refresh-pricing.js +1 -1
  273. package/dist/lib/jobs/handlers/cron-retire-unused-skills.js +1 -1
  274. package/dist/lib/jobs/handlers/cron-suggest-instructions.js +1 -1
  275. package/dist/lib/jobs/handlers/distill-memories.js +1 -1
  276. package/dist/lib/jobs/handlers/harbor-ab-verdict.js +1 -1
  277. package/dist/lib/jobs/handlers/harbor-ab.js +1 -1
  278. package/dist/lib/jobs/handlers/process-changelog.js +1 -1
  279. package/dist/lib/jobs/handlers/process-conversation.js +1 -1
  280. package/dist/lib/jobs/handlers/process-eval.js +1 -1
  281. package/dist/lib/jobs/handlers/process-insights.js +1 -1
  282. package/dist/lib/jobs/handlers/process-judge-review.js +1 -1
  283. package/dist/lib/jobs/handlers/process-launch.js +1 -1
  284. package/dist/lib/jobs/handlers/process-memory-ab.js +1 -1
  285. package/dist/lib/jobs/handlers/process-run-cleanup.js +1 -1
  286. package/dist/lib/jobs/handlers/process-session-goal.js +1 -1
  287. package/dist/lib/jobs/shed-retry.js +1 -1
  288. package/dist/lib/judge-review-runner.js +1 -1
  289. package/dist/lib/llm-client.js +1 -1
  290. package/dist/lib/llm-reply-parsers.js +1 -0
  291. package/dist/lib/manual-tasks.js +1 -1
  292. package/dist/lib/measurement-llm.js +1 -0
  293. package/dist/lib/pi-exec.js +1 -0
  294. package/dist/lib/projects/workspace/eval-workspace.js +1 -1
  295. package/dist/lib/projects/workspace/worktree.js +1 -1
  296. package/dist/lib/refine-cases.js +1 -1
  297. package/dist/lib/research-client.js +1 -1
  298. package/dist/lib/retraction.js +1 -1
  299. package/dist/lib/reviewer-detect.js +1 -1
  300. package/dist/lib/service-environment.js +1 -0
  301. package/dist/lib/setup-steps.js +1 -1
  302. package/dist/lib/telemetry.js +1 -1
  303. package/dist/lib/terminal-target-heartbeat.js +1 -1
  304. package/dist/lib/tool-cli-map.js +1 -0
  305. package/dist/lib/transcript-instruction-linking.js +1 -1
  306. package/dist/lib/transcript-sync.js +1 -1
  307. package/dist/lib/work-report.js +1 -1
  308. package/oclif.manifest.json +7 -1
  309. package/package.json +5 -4
  310. package/dist/chunk-4FSQSETR.js +0 -12
  311. package/dist/chunk-6WQG6C7F.js +0 -1
  312. package/dist/chunk-C42NTI2V.js +0 -3
  313. package/dist/chunk-F6DAHCJC.js +0 -20
  314. package/dist/chunk-GN3ZHQ46.js +0 -1
  315. package/dist/chunk-H3BCWSYO.js +0 -1
  316. package/dist/chunk-HLNHBZLI.js +0 -1
  317. package/dist/chunk-HLQZR4XJ.js +0 -13
  318. package/dist/chunk-J5HW45PZ.js +0 -48
  319. package/dist/chunk-JNFB22FD.js +0 -1
  320. package/dist/chunk-KCOJLTVX.js +0 -1
  321. package/dist/chunk-MLV2RHRE.js +0 -1
  322. package/dist/chunk-N7GK33PU.js +0 -1
  323. package/dist/chunk-NRYLYMDM.js +0 -1
  324. package/dist/chunk-OZNKMJ5B.js +0 -1
  325. package/dist/chunk-PPXOC7IV.js +0 -1
  326. package/dist/chunk-QXPYGN7I.js +0 -1
  327. package/dist/chunk-R4QIPG4V.js +0 -2
  328. package/dist/chunk-RGUCR7T6.js +0 -1
  329. package/dist/chunk-RO3ZZVCG.js +0 -1
  330. package/dist/chunk-SBGXIPRN.js +0 -2
  331. package/dist/chunk-SN3CHV66.js +0 -1
  332. package/dist/chunk-U3XKXJ3A.js +0 -5
  333. package/dist/chunk-UM4CBCXI.js +0 -1
  334. package/dist/chunk-WHQ4BDSM.js +0 -4
  335. 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-25RDT32M.js";import"../chunk-3AV3GTMP.js";import"../chunk-APDRR6FS.js";import"../chunk-J5HW45PZ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{c as _resetRefreshAttempt,b as bootstrapActiveOrg,a as maybeRefreshActiveOrg};
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};
@@ -1 +1 @@
1
- import{a,b,c,d,e}from"../chunk-MLV2RHRE.js";import"../chunk-QFKUSNUB.js";import"../chunk-4N43IBXH.js";import"../chunk-IEQDLURA.js";import"../chunk-KINIFUZQ.js";import"../chunk-VIQ25ORK.js";import"../chunk-6ZPSVZNH.js";import"../chunk-RGUCR7T6.js";import"../chunk-WY3VVX3R.js";import"../chunk-KV5A77XW.js";import"../chunk-ZYGBABMZ.js";import"../chunk-U7TBEC3I.js";import"../chunk-Y7QIOPN5.js";import"../chunk-HOQPVOMF.js";import"../chunk-DUBBL57L.js";import"../chunk-WHQ4BDSM.js";import"../chunk-PPXOC7IV.js";import"../chunk-3MDEGOUG.js";import"../chunk-JNFB22FD.js";import"../chunk-HLQZR4XJ.js";import"../chunk-5RBLIVBF.js";import"../chunk-SN3CHV66.js";import"../chunk-6W2GSV4O.js";import"../chunk-JWFRI32Y.js";import"../chunk-25Q3Y7TC.js";import"../chunk-MNQPCNGQ.js";import"../chunk-PZS55PW2.js";import"../chunk-WQX4RRBQ.js";import"../chunk-3ZHVP3KE.js";import"../chunk-WOJ733IB.js";import"../chunk-RJX75Y7J.js";import"../chunk-SJKS3PYX.js";import"../chunk-2EX27VJ3.js";import"../chunk-UM4CBCXI.js";import"../chunk-3UKZJAFS.js";import"../chunk-4COLIGD7.js";import"../chunk-VXUKXGRX.js";import"../chunk-PVGUDJD7.js";import"../chunk-GIRPEMTW.js";import"../chunk-SIGZEQ3K.js";import"../chunk-4FSQSETR.js";import"../chunk-VH2EAP4J.js";import"../chunk-J6QMBMC2.js";import"../chunk-UYPBIXF2.js";import"../chunk-OZNKMJ5B.js";import"../chunk-F6DAHCJC.js";import"../chunk-GBWQENAH.js";import"../chunk-LJRE3LZ2.js";import"../chunk-YI2OWO6R.js";import"../chunk-V2USQH27.js";import"../chunk-RK663O4M.js";import"../chunk-6GAIYJ6K.js";import"../chunk-6UEFCMR2.js";import"../chunk-MODXEGCU.js";import"../chunk-RBSEE2Z6.js";import"../chunk-BG55WDDX.js";import"../chunk-H3BCWSYO.js";import"../chunk-M7QSC64D.js";import"../chunk-LTQ5BJYL.js";import"../chunk-G7V4ZZZ3.js";import"../chunk-6WQG6C7F.js";import"../chunk-LB24UKHZ.js";import"../chunk-NRYLYMDM.js";import"../chunk-U3XKXJ3A.js";import"../chunk-5MXZJWQS.js";import"../chunk-N7ODX6PO.js";import"../chunk-OZQNSELV.js";import"../chunk-HFGO5762.js";import"../chunk-VS5ROGDP.js";import"../chunk-KCOJLTVX.js";import"../chunk-GN3ZHQ46.js";import"../chunk-U2NT5OSQ.js";import"../chunk-KGURGIZ2.js";import"../chunk-UPFH72PF.js";import"../chunk-WH3IPXXQ.js";import"../chunk-CDY7TQFZ.js";import"../chunk-VBXL7XO7.js";import"../chunk-HLNHBZLI.js";import"../chunk-BZS5QRWB.js";import"../chunk-SBGXIPRN.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-APDRR6FS.js";import"../chunk-J5HW45PZ.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
+ 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-QTCWOIT4.js";import"../chunk-APDRR6FS.js";import"../chunk-J5HW45PZ.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};
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};
@@ -1 +1 @@
1
- import{a,b,c,d,e,f,g,h,i}from"../chunk-APDRR6FS.js";import"../chunk-J5HW45PZ.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};
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-SHYP27B7.js";import"../chunk-QXPYGN7I.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
+ 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-QXPYGN7I.js";import"../chunk-ZLLER3HP.js";export{a as CAPTURE_CONFIG_FILENAME,h as createCodexScopeWatcher,e as describeCaptureScope,f as describeCodexCaptureScope,g as describeHooksCaptureScope,d as isPathInScope,b as loadCodexCaptureScope,c as loadHooksCaptureScope};
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};
@@ -1 +1 @@
1
- import{a,b,c,d}from"../chunk-BZS5QRWB.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
+ 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-M2VVRQKA.js";import"../chunk-5XK6LB2T.js";import"../chunk-APDRR6FS.js";import"../chunk-J5HW45PZ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{a as ensureDeviceApiKey};
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-P2WSDHIA.js";import"../chunk-APDRR6FS.js";import"../chunk-J5HW45PZ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{a as ensureFreshToken};
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-BG55WDDX.js";import"../chunk-HLNHBZLI.js";import"../chunk-BZS5QRWB.js";import"../chunk-SBGXIPRN.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-ZLLER3HP.js";export{a as analyzeEvalResults};
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-O2HCD6XL.js";import"../chunk-VBXL7XO7.js";import"../chunk-APDRR6FS.js";import"../chunk-J5HW45PZ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{b as aggregateBenchmark,c as postBenchmark,a as summarizeRuns};
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-NRYLYMDM.js";import"../chunk-KCOJLTVX.js";import"../chunk-GN3ZHQ46.js";import"../chunk-U2NT5OSQ.js";import"../chunk-KGURGIZ2.js";import"../chunk-UPFH72PF.js";import"../chunk-WH3IPXXQ.js";import"../chunk-CDY7TQFZ.js";import"../chunk-HLNHBZLI.js";import"../chunk-BZS5QRWB.js";import"../chunk-SBGXIPRN.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-APDRR6FS.js";import"../chunk-J5HW45PZ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{a as CANDIDATE_ARM,b as PRIOR_VERSION_ARM,d as accountForFailures,e as attributeShortfall,f as buildCandidateQueue,c as pairCandidateRuns,g as runCandidateBatchAndPost};
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-RK663O4M.js";import"../chunk-U3XKXJ3A.js";import"../chunk-5MXZJWQS.js";import"../chunk-N7ODX6PO.js";import"../chunk-BZS5QRWB.js";import"../chunk-SBGXIPRN.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-ZLLER3HP.js";export{a as buildFeedbackBlock,b as generateEvalCases};
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-PVGUDJD7.js";import"../chunk-RK663O4M.js";import"../chunk-BG55WDDX.js";import"../chunk-U3XKXJ3A.js";import"../chunk-5MXZJWQS.js";import"../chunk-N7ODX6PO.js";import"../chunk-WH3IPXXQ.js";import"../chunk-CDY7TQFZ.js";import"../chunk-HLNHBZLI.js";import"../chunk-BZS5QRWB.js";import"../chunk-SBGXIPRN.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-APDRR6FS.js";import"../chunk-J5HW45PZ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{a as processConversationJob};
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-HLNHBZLI.js";import"../chunk-BZS5QRWB.js";import"../chunk-SBGXIPRN.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};
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};
@@ -1 +1 @@
1
- import{a}from"../chunk-WH3IPXXQ.js";import"../chunk-CDY7TQFZ.js";import"../chunk-HLNHBZLI.js";import"../chunk-BZS5QRWB.js";import"../chunk-SBGXIPRN.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-ZLLER3HP.js";export{a as gradeEvalOutput};
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-VXUKXGRX.js";import"../chunk-HLNHBZLI.js";import"../chunk-BZS5QRWB.js";import"../chunk-SBGXIPRN.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-ZLLER3HP.js";export{a as judgeEvalQuality};
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};