@rulemetric/cli 0.16.0 → 0.17.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 (254) hide show
  1. package/dist/base-command.js +1 -1
  2. package/dist/{chunk-DHIEGG4T.js → chunk-26XE3JCL.js} +1 -1
  3. package/dist/chunk-2IQBXE6F.js +1 -0
  4. package/dist/{chunk-IG4JMWFK.js → chunk-2K4TF5RM.js} +1 -1
  5. package/dist/chunk-3IAZMJA4.js +1 -0
  6. package/dist/chunk-3WNQ52TW.js +1 -0
  7. package/dist/{chunk-KEVDLLHT.js → chunk-433HK3QQ.js} +1 -1
  8. package/dist/{chunk-KR36ZDGN.js → chunk-4GM4OEQY.js} +1 -1
  9. package/dist/{chunk-5A6TMSRO.js → chunk-4XRPSKIJ.js} +1 -1
  10. package/dist/{chunk-65LFPUDB.js → chunk-52OHAULM.js} +1 -1
  11. package/dist/{chunk-T7HZZ4DJ.js → chunk-55HFAX5Y.js} +1 -1
  12. package/dist/{chunk-QPAOX7P2.js → chunk-57YXM7AI.js} +1 -1
  13. package/dist/{chunk-SFZPFNC6.js → chunk-6YSTU453.js} +1 -1
  14. package/dist/{chunk-3H44B6PB.js → chunk-7V6LLVAY.js} +1 -1
  15. package/dist/{chunk-USKRCVX3.js → chunk-ACJ2DBOE.js} +1 -1
  16. package/dist/{chunk-LJE5J3EW.js → chunk-ANHFE6US.js} +1 -1
  17. package/dist/{chunk-FADINV4H.js → chunk-AXTEV56C.js} +1 -1
  18. package/dist/{chunk-HBDKOU2N.js → chunk-AZB34RT6.js} +7 -6
  19. package/dist/{chunk-WOANSBMJ.js → chunk-AZK4Y5DB.js} +1 -1
  20. package/dist/{chunk-TU2AR6XO.js → chunk-B22HYCBV.js} +1 -1
  21. package/dist/{chunk-GIQ2HK3W.js → chunk-BLGICIV4.js} +1 -1
  22. package/dist/{chunk-6QMIDH6X.js → chunk-BV3JMD3A.js} +1 -1
  23. package/dist/{chunk-ZKPURXUS.js → chunk-CEM7JMUW.js} +1 -1
  24. package/dist/{chunk-NWV66NMA.js → chunk-CWVXTLXZ.js} +1 -1
  25. package/dist/{chunk-XQCGAPLN.js → chunk-CXSDZ473.js} +1 -1
  26. package/dist/chunk-DB4ZM5N3.js +1 -0
  27. package/dist/{chunk-QPVUGTDP.js → chunk-EOTSCWFS.js} +1 -1
  28. package/dist/chunk-FLXWL4F4.js +8 -0
  29. package/dist/{chunk-7YZURVZD.js → chunk-FPEC6DJV.js} +1 -1
  30. package/dist/chunk-G2226CG6.js +1 -0
  31. package/dist/{chunk-KOORMTZO.js → chunk-GLZBTGN5.js} +1 -1
  32. package/dist/{chunk-5TM7AOH2.js → chunk-GPWLS64K.js} +1 -1
  33. package/dist/chunk-HB4RUEEE.js +1 -0
  34. package/dist/{chunk-UVCVJKEN.js → chunk-JEZ5ZTKR.js} +1 -1
  35. package/dist/{chunk-ISYU5BMU.js → chunk-JQ2ZCUEC.js} +1 -1
  36. package/dist/{chunk-RIYVZDOQ.js → chunk-KSKC5SEQ.js} +1 -1
  37. package/dist/{chunk-ISEUEYSC.js → chunk-L3AXNCWC.js} +1 -1
  38. package/dist/chunk-LARY6ZFT.js +1 -0
  39. package/dist/{chunk-E4CIJ67Z.js → chunk-LEUXIXIS.js} +1 -1
  40. package/dist/{chunk-GGUXEZC3.js → chunk-LMNUO32P.js} +1 -1
  41. package/dist/{chunk-6T6YFPBW.js → chunk-LMQDS47I.js} +1 -1
  42. package/dist/{chunk-VUNJGZPP.js → chunk-M2CPTQZL.js} +1 -1
  43. package/dist/{chunk-WUCACPGC.js → chunk-MOQTSJNZ.js} +1 -1
  44. package/dist/chunk-N7P3HUPD.js +3 -0
  45. package/dist/{chunk-7LE2W3WP.js → chunk-PHBPHZSZ.js} +1 -1
  46. package/dist/{chunk-TSLBCZ5P.js → chunk-QH7JB4UQ.js} +1 -1
  47. package/dist/{chunk-CVPAKEEZ.js → chunk-R7URROQD.js} +1 -1
  48. package/dist/{chunk-EFEPD4AZ.js → chunk-RAIXY6YA.js} +1 -1
  49. package/dist/chunk-RCJTCLZO.js +1 -0
  50. package/dist/chunk-SVZYRGO5.js +4 -0
  51. package/dist/chunk-SW24KZ5C.js +1 -0
  52. package/dist/{chunk-WL5ZWQAS.js → chunk-TDDJOSFQ.js} +1 -1
  53. package/dist/{chunk-GDLQNY4V.js → chunk-TDRUVE4J.js} +1 -1
  54. package/dist/chunk-TFJAT263.js +2 -0
  55. package/dist/{chunk-PDXHRF4E.js → chunk-TL57YUJV.js} +1 -1
  56. package/dist/{chunk-QNSIBPWG.js → chunk-TZC4CYPD.js} +1 -1
  57. package/dist/{chunk-FG343JM3.js → chunk-U6AASXY3.js} +1 -1
  58. package/dist/{chunk-BDQTVYYF.js → chunk-UDNEOJWY.js} +1 -1
  59. package/dist/{chunk-PJ4RIUI3.js → chunk-UPJVMMDK.js} +1 -1
  60. package/dist/{chunk-Q7IDLOSP.js → chunk-V2G6E53W.js} +1 -1
  61. package/dist/chunk-VBGHPAUT.js +2 -0
  62. package/dist/{chunk-MYGVN6X4.js → chunk-VF54EOLZ.js} +1 -1
  63. package/dist/{chunk-KE5K3F7J.js → chunk-VFWQ2W4B.js} +1 -1
  64. package/dist/chunk-VZYNZS5U.js +1 -0
  65. package/dist/{chunk-DX6IPDED.js → chunk-WDLAPZPN.js} +1 -1
  66. package/dist/{chunk-D4FP5M2B.js → chunk-WM437XV6.js} +1 -1
  67. package/dist/chunk-WULEBQPI.js +1 -0
  68. package/dist/chunk-WWL4HNXM.js +28 -0
  69. package/dist/{chunk-NBTC5FNV.js → chunk-X23L2MF6.js} +1 -1
  70. package/dist/chunk-XFOG2PDJ.js +1 -0
  71. package/dist/{chunk-KGU2IW54.js → chunk-YSY25OGG.js} +1 -1
  72. package/dist/{chunk-WL34G6IR.js → chunk-YVEI7XR6.js} +1 -1
  73. package/dist/{chunk-YXMAGC53.js → chunk-YX2IGS72.js} +1 -1
  74. package/dist/chunk-Z7UN4R7T.js +1 -0
  75. package/dist/{chunk-TQM7MF5C.js → chunk-ZZZ7ECPT.js} +1 -1
  76. package/dist/commands/antigravity/backfill.js +1 -1
  77. package/dist/commands/auth/create-key.js +1 -1
  78. package/dist/commands/auth/login.js +1 -1
  79. package/dist/commands/auth/logout.js +1 -1
  80. package/dist/commands/auth/revoke-key.js +1 -1
  81. package/dist/commands/auth/signup.js +1 -1
  82. package/dist/commands/auth/status.js +1 -1
  83. package/dist/commands/capture/scope.js +1 -1
  84. package/dist/commands/catalog/index.js +1 -1
  85. package/dist/commands/catalog/recommend.js +1 -1
  86. package/dist/commands/crons/list.js +1 -1
  87. package/dist/commands/crons/run.js +1 -1
  88. package/dist/commands/dashboard.js +1 -1
  89. package/dist/commands/diagnostics.js +1 -1
  90. package/dist/commands/eval-targets/create.js +1 -1
  91. package/dist/commands/eval-targets/list.js +1 -1
  92. package/dist/commands/evals/agent.js +1 -1
  93. package/dist/commands/evals/auto-run.js +1 -1
  94. package/dist/commands/evals/benchmark.js +1 -1
  95. package/dist/commands/evals/compare.js +1 -1
  96. package/dist/commands/evals/create.js +1 -1
  97. package/dist/commands/evals/optimize-description.js +1 -1
  98. package/dist/commands/evals/optimize.js +1 -1
  99. package/dist/commands/evals/refine-cases.js +1 -1
  100. package/dist/commands/evals/run.js +1 -1
  101. package/dist/commands/evals/validate-judge.js +1 -1
  102. package/dist/commands/experiments/list.js +1 -1
  103. package/dist/commands/gateway/ensure.js +1 -1
  104. package/dist/commands/hooks/install.js +1 -1
  105. package/dist/commands/hooks/run.js +1 -1
  106. package/dist/commands/hooks/uninstall.js +1 -1
  107. package/dist/commands/instructions/create.js +1 -1
  108. package/dist/commands/instructions/dedupe.js +1 -1
  109. package/dist/commands/instructions/delete.js +1 -1
  110. package/dist/commands/instructions/fork.js +1 -1
  111. package/dist/commands/instructions/get.js +1 -1
  112. package/dist/commands/instructions/list.js +1 -1
  113. package/dist/commands/instructions/promote.js +1 -1
  114. package/dist/commands/instructions/pull.js +1 -1
  115. package/dist/commands/instructions/restore.js +1 -1
  116. package/dist/commands/instructions/retract.js +1 -1
  117. package/dist/commands/instructions/upstream.js +1 -1
  118. package/dist/commands/instructions/versions.js +1 -1
  119. package/dist/commands/launcher.js +1 -1
  120. package/dist/commands/local/down.js +1 -1
  121. package/dist/commands/local/up.js +1 -1
  122. package/dist/commands/org/current.js +1 -1
  123. package/dist/commands/org/list.js +1 -1
  124. package/dist/commands/org/switch.js +1 -1
  125. package/dist/commands/packs/add-instruction.js +1 -1
  126. package/dist/commands/packs/apply.js +1 -1
  127. package/dist/commands/packs/create.js +1 -1
  128. package/dist/commands/packs/fork.js +1 -1
  129. package/dist/commands/packs/get.js +1 -1
  130. package/dist/commands/packs/list.js +1 -1
  131. package/dist/commands/packs/remove-instruction.js +1 -1
  132. package/dist/commands/proxy/env.js +1 -1
  133. package/dist/commands/proxy/logs.js +1 -1
  134. package/dist/commands/proxy/restart.js +1 -1
  135. package/dist/commands/proxy/setup.js +1 -1
  136. package/dist/commands/proxy/start.js +1 -1
  137. package/dist/commands/proxy/status.js +1 -1
  138. package/dist/commands/proxy/stop.js +1 -1
  139. package/dist/commands/research/backfill.js +1 -1
  140. package/dist/commands/research/resume-scoped-outcomes.js +1 -0
  141. package/dist/commands/research/tail-transcript.js +1 -1
  142. package/dist/commands/service/install.js +1 -1
  143. package/dist/commands/service/status.js +1 -1
  144. package/dist/commands/service/uninstall.js +1 -1
  145. package/dist/commands/sessions/analyze.js +1 -1
  146. package/dist/commands/sessions/delete.js +1 -1
  147. package/dist/commands/sessions/end.js +1 -1
  148. package/dist/commands/sessions/import.js +1 -1
  149. package/dist/commands/sessions/list.js +1 -1
  150. package/dist/commands/sessions/start.js +1 -1
  151. package/dist/commands/setup.js +1 -1
  152. package/dist/commands/skills/export-approved.js +1 -1
  153. package/dist/commands/skills/install.js +1 -1
  154. package/dist/commands/skills/list.js +1 -1
  155. package/dist/commands/skills/publish.js +1 -1
  156. package/dist/commands/skills/search.js +1 -1
  157. package/dist/commands/skills/update.js +1 -1
  158. package/dist/commands/suggestions/accept.js +1 -1
  159. package/dist/commands/suggestions/auto.js +1 -1
  160. package/dist/commands/suggestions/dismiss.js +1 -1
  161. package/dist/commands/suggestions/list.js +1 -1
  162. package/dist/commands/suggestions/refresh.js +1 -1
  163. package/dist/commands/suggestions/undo.js +1 -1
  164. package/dist/dashboard/Dashboard.js +1 -1
  165. package/dist/dashboard/data.js +1 -1
  166. package/dist/dashboard/launcher/ActiveJobsList.js +1 -1
  167. package/dist/dashboard/launcher/LauncherOverlay.js +1 -1
  168. package/dist/dashboard/launcher/NewLaunchForm.js +1 -1
  169. package/dist/dashboard/launcher/api.js +1 -1
  170. package/dist/dashboard/launcher/useLaunchJobs.js +1 -1
  171. package/dist/dashboard/panels/measurement.js +1 -1
  172. package/dist/{dist-UAAG2IWQ.js → dist-WGZCHQTC.js} +1 -1
  173. package/dist/lib/active-org-refresh.js +1 -1
  174. package/dist/lib/actor-env.js +1 -0
  175. package/dist/lib/agent-loop.js +1 -1
  176. package/dist/lib/agent-presence.js +1 -0
  177. package/dist/lib/antigravity-transcript.js +1 -1
  178. package/dist/lib/api-client.js +1 -1
  179. package/dist/lib/codex-exec.js +1 -1
  180. package/dist/lib/ensure-api-key.js +1 -1
  181. package/dist/lib/ensure-fresh-token.js +1 -1
  182. package/dist/lib/eval-analyzer.js +1 -1
  183. package/dist/lib/eval-benchmark.js +1 -1
  184. package/dist/lib/eval-candidate-run.js +1 -1
  185. package/dist/lib/eval-case-generator.js +1 -1
  186. package/dist/lib/eval-conversation-handler.js +1 -1
  187. package/dist/lib/eval-executor.js +1 -1
  188. package/dist/lib/eval-grader.js +1 -1
  189. package/dist/lib/eval-meta-judge.js +1 -1
  190. package/dist/lib/eval-resume.js +1 -1
  191. package/dist/lib/eval-run-batch.js +1 -1
  192. package/dist/lib/eval-trigger-tester.js +1 -1
  193. package/dist/lib/evolution-enrolment.js +1 -1
  194. package/dist/lib/insights/nomination/nominate.js +1 -1
  195. package/dist/lib/instruction-proposer.js +1 -1
  196. package/dist/lib/instruction-restoration.js +1 -1
  197. package/dist/lib/instructions/acceptance/accept-events.js +1 -1
  198. package/dist/lib/instructions/acceptance/accept-hook.js +1 -1
  199. package/dist/lib/instructions/acceptance/reverse-applications.js +1 -1
  200. package/dist/lib/instructions/acceptance/suggestion-accept.js +1 -1
  201. package/dist/lib/jobs/handlers/cron-auto-accept-suggestions.js +1 -1
  202. package/dist/lib/jobs/handlers/cron-eval-autorun.js +1 -1
  203. package/dist/lib/jobs/handlers/cron-instruction-evolution.js +1 -1
  204. package/dist/lib/jobs/handlers/cron-instruction-training.js +1 -1
  205. package/dist/lib/jobs/handlers/cron-reconcile-attribution.js +1 -1
  206. package/dist/lib/jobs/handlers/cron-refine-cases.js +1 -1
  207. package/dist/lib/jobs/handlers/cron-refresh-pricing.js +1 -1
  208. package/dist/lib/jobs/handlers/cron-refresh-skills.js +1 -1
  209. package/dist/lib/jobs/handlers/cron-retire-unused-skills.js +1 -1
  210. package/dist/lib/jobs/handlers/cron-suggest-instructions.js +1 -1
  211. package/dist/lib/jobs/handlers/distill-memories.js +1 -1
  212. package/dist/lib/jobs/handlers/finalize-scoped-launch.js +1 -1
  213. package/dist/lib/jobs/handlers/prepare-suggestion-live.js +1 -1
  214. package/dist/lib/jobs/handlers/process-conversation.js +1 -1
  215. package/dist/lib/jobs/handlers/process-eval.js +1 -1
  216. package/dist/lib/jobs/handlers/process-insights.js +1 -1
  217. package/dist/lib/jobs/handlers/process-judge-review.js +1 -1
  218. package/dist/lib/jobs/handlers/process-launch.js +1 -1
  219. package/dist/lib/jobs/handlers/process-memory-ab.js +1 -1
  220. package/dist/lib/jobs/handlers/process-run-cleanup.js +1 -1
  221. package/dist/lib/jobs/handlers/process-session-goal.js +1 -1
  222. package/dist/lib/jobs/handlers/process-suggestion-eval.js +1 -1
  223. package/dist/lib/jobs/shed-retry.js +1 -1
  224. package/dist/lib/judge-review-runner.js +1 -1
  225. package/dist/lib/llm-client.js +1 -1
  226. package/dist/lib/manual-tasks.js +1 -1
  227. package/dist/lib/measurement-llm.js +1 -1
  228. package/dist/lib/projects/workspace/eval-workspace.js +1 -1
  229. package/dist/lib/projects/workspace/worktree.js +1 -1
  230. package/dist/lib/refine-cases.js +1 -1
  231. package/dist/lib/repository-capabilities.js +1 -0
  232. package/dist/lib/research-client.js +1 -1
  233. package/dist/lib/scoped-outcome-store.js +1 -0
  234. package/dist/lib/setup-steps.js +1 -1
  235. package/dist/lib/telemetry.js +1 -1
  236. package/dist/lib/terminal-target-heartbeat.js +1 -1
  237. package/dist/lib/work-report.js +1 -1
  238. package/oclif.manifest.json +43 -1
  239. package/package.json +4 -4
  240. package/dist/chunk-3WCX2SLU.js +0 -1
  241. package/dist/chunk-4GOXEEXZ.js +0 -1
  242. package/dist/chunk-CZBO3A6B.js +0 -3
  243. package/dist/chunk-EHW2KS6R.js +0 -1
  244. package/dist/chunk-GIXHG5FK.js +0 -1
  245. package/dist/chunk-HYQ5YKBC.js +0 -1
  246. package/dist/chunk-I6W2KC6W.js +0 -1
  247. package/dist/chunk-JNLDISBA.js +0 -4
  248. package/dist/chunk-MMMT34KO.js +0 -28
  249. package/dist/chunk-OCCJEWOF.js +0 -1
  250. package/dist/chunk-PZS55PW2.js +0 -1
  251. package/dist/chunk-SWSOEYC7.js +0 -1
  252. package/dist/chunk-TTZWVZIW.js +0 -1
  253. package/dist/chunk-U3YPVLM3.js +0 -1
  254. package/dist/chunk-XXPWPKTD.js +0 -1
@@ -1 +1 @@
1
- import{a as b,b as c,c as d}from"../../../chunk-IG4JMWFK.js";import{w as a}from"../../../chunk-MMMT34KO.js";import"../../../chunk-N7ODX6PO.js";import"../../../chunk-ZLLER3HP.js";export{c as ensureWorktree,d as removeWorktree,b as runGit,a as sanitizeBranch};
1
+ import{a as b,b as c,c as d}from"../../../chunk-2K4TF5RM.js";import{w as a}from"../../../chunk-WWL4HNXM.js";import"../../../chunk-N7ODX6PO.js";import"../../../chunk-ZLLER3HP.js";export{c as ensureWorktree,d as removeWorktree,b as runGit,a as sanitizeBranch};
@@ -1 +1 @@
1
- import{a,b,c}from"../chunk-TSLBCZ5P.js";import"../chunk-65LFPUDB.js";import"../chunk-KGU2IW54.js";import"../chunk-M7QSC64D.js";import"../chunk-ZKPURXUS.js";import"../chunk-ISEUEYSC.js";import"../chunk-GYKYJJNF.js";import"../chunk-G7V4ZZZ3.js";import"../chunk-LJE5J3EW.js";import"../chunk-AHLVY52I.js";import"../chunk-YXMAGC53.js";import"../chunk-T7HZZ4DJ.js";import"../chunk-DHIEGG4T.js";import"../chunk-PPAHIVG5.js";import"../chunk-5MXZJWQS.js";import"../chunk-CT7FWSIU.js";import"../chunk-N7ODX6PO.js";import"../chunk-FADINV4H.js";import"../chunk-SWSOEYC7.js";import"../chunk-U2NT5OSQ.js";import"../chunk-KGURGIZ2.js";import"../chunk-GYNZ3OZF.js";import"../chunk-UPFH72PF.js";import"../chunk-FG343JM3.js";import"../chunk-CDY7TQFZ.js";import"../chunk-KFNFLMUR.js";import"../chunk-4GOXEEXZ.js";import"../chunk-JP6ULOEX.js";import"../chunk-JNLDISBA.js";import"../chunk-GPBN4ROE.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-GIXHG5FK.js";import"../chunk-X6CF5KTW.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{a as MAX_RETIREMENTS_PER_REFINEMENT,c as executeCaseRefinement,b as planCaseRefinement};
1
+ import{a,b,c}from"../chunk-QH7JB4UQ.js";import"../chunk-52OHAULM.js";import"../chunk-YSY25OGG.js";import"../chunk-M7QSC64D.js";import"../chunk-CEM7JMUW.js";import"../chunk-L3AXNCWC.js";import"../chunk-ANHFE6US.js";import"../chunk-GYKYJJNF.js";import"../chunk-G7V4ZZZ3.js";import"../chunk-AHLVY52I.js";import"../chunk-YX2IGS72.js";import"../chunk-55HFAX5Y.js";import"../chunk-26XE3JCL.js";import"../chunk-PPAHIVG5.js";import"../chunk-5MXZJWQS.js";import"../chunk-CT7FWSIU.js";import"../chunk-N7ODX6PO.js";import"../chunk-AXTEV56C.js";import"../chunk-VZYNZS5U.js";import"../chunk-U2NT5OSQ.js";import"../chunk-KGURGIZ2.js";import"../chunk-GYNZ3OZF.js";import"../chunk-UPFH72PF.js";import"../chunk-U6AASXY3.js";import"../chunk-CDY7TQFZ.js";import"../chunk-KFNFLMUR.js";import"../chunk-LARY6ZFT.js";import"../chunk-JP6ULOEX.js";import"../chunk-SVZYRGO5.js";import"../chunk-WULEBQPI.js";import"../chunk-GPBN4ROE.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-Z7UN4R7T.js";import"../chunk-X6CF5KTW.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{a as MAX_RETIREMENTS_PER_REFINEMENT,c as executeCaseRefinement,b as planCaseRefinement};
@@ -0,0 +1 @@
1
+ import{a,b,c,d,e}from"../chunk-FLXWL4F4.js";import"../chunk-ZLLER3HP.js";export{a as collectManifestNames,b as describeRepositoryCapabilities,d as findUnsupportedRuntimeReferences,e as invalidRepositoryReferences,c as renderRepositoryBlock};
@@ -1 +1 @@
1
- import{a,b}from"../chunk-UVCVJKEN.js";import"../chunk-GIXHG5FK.js";import"../chunk-X6CF5KTW.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{a as postObservation,b as postObservations};
1
+ import{a,b}from"../chunk-JEZ5ZTKR.js";import"../chunk-Z7UN4R7T.js";import"../chunk-X6CF5KTW.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{a as postObservation,b as postObservations};
@@ -0,0 +1 @@
1
+ import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u}from"../chunk-XFOG2PDJ.js";import"../chunk-ZLLER3HP.js";export{b as DELIVERY_STEPS,a as SCOPED_OUTCOME_STORE_VERSION,d as confirmationDir,t as isDelivered,i as ledgerPath,s as listScopedOutcomeEntries,e as outcomeDir,l as preserveTranscript,f as protocolPath,o as readLedger,n as readReceipt,k as readStagedProtocol,h as receiptPath,u as removeScopedOutcomeEntry,c as scopedOutcomeStoreRoot,j as stageProtocol,q as transcriptBytes,g as transcriptPath,r as transcriptSize,p as writeLedger,m as writeReceiptOnce};
@@ -1 +1 @@
1
- import{a,b,c,d,e,f,g,h,i,j}from"../chunk-QNSIBPWG.js";import"../chunk-QWCEZEDO.js";import"../chunk-KKDHD4XA.js";import"../chunk-SZ62CP55.js";import"../chunk-OZQNSELV.js";import"../chunk-HFGO5762.js";import"../chunk-VS5ROGDP.js";import"../chunk-GPBN4ROE.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-GIXHG5FK.js";import"../chunk-X6CF5KTW.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{c as ALL_STEP_IDS,a as CORE_STEP_IDS,b as OPTIONAL_STEP_IDS,g as STEPS,j as computeStatus,d as defaultContext,h as getStep,i as isStepId,e as maskToken,f as renderDiff};
1
+ import{a,b,c,d,e,f,g,h,i,j}from"../chunk-TZC4CYPD.js";import"../chunk-QWCEZEDO.js";import"../chunk-KKDHD4XA.js";import"../chunk-SZ62CP55.js";import"../chunk-OZQNSELV.js";import"../chunk-HFGO5762.js";import"../chunk-VS5ROGDP.js";import"../chunk-GPBN4ROE.js";import"../chunk-6XTLP2G7.js";import"../chunk-PJ3WHQ67.js";import"../chunk-Z7UN4R7T.js";import"../chunk-X6CF5KTW.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{c as ALL_STEP_IDS,a as CORE_STEP_IDS,b as OPTIONAL_STEP_IDS,g as STEPS,j as computeStatus,d as defaultContext,h as getStep,i as isStepId,e as maskToken,f as renderDiff};
@@ -1 +1 @@
1
- import{a,b,c,d}from"../chunk-WL5ZWQAS.js";import"../chunk-GIXHG5FK.js";import"../chunk-X6CF5KTW.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{d as emitErrorBeacon,c as emitSetupEvent,b as getDeviceId,a as telemetryDisabled};
1
+ import{a,b,c,d}from"../chunk-TDDJOSFQ.js";import"../chunk-Z7UN4R7T.js";import"../chunk-X6CF5KTW.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{d as emitErrorBeacon,c as emitSetupEvent,b as getDeviceId,a as telemetryDisabled};
@@ -1 +1 @@
1
- import{a,b,c}from"../chunk-5TM7AOH2.js";import"../chunk-N7ODX6PO.js";import"../chunk-GIXHG5FK.js";import"../chunk-X6CF5KTW.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{a as probeAndReport,b as runOneHeartbeatCycle,c as startTerminalTargetHeartbeat};
1
+ import{a,b,c}from"../chunk-GPWLS64K.js";import"../chunk-N7ODX6PO.js";import"../chunk-Z7UN4R7T.js";import"../chunk-X6CF5KTW.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{a as probeAndReport,b as runOneHeartbeatCycle,c as startTerminalTargetHeartbeat};
@@ -1 +1 @@
1
- import{a,b,c,d,e,f,g,h,i}from"../chunk-XXPWPKTD.js";import"../chunk-GIXHG5FK.js";import"../chunk-X6CF5KTW.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{c as HEARTBEAT_RETRY_BUDGET_MS,b as REPORT_RETRY_BUDGET_MS,d as REPORT_RETRY_INITIAL_MS,e as REPORT_RETRY_MAX_MS,a as RETRYABLE_REPORT_STATUSES,g as abortableSleep,h as isRetryableReportError,i as postReportWithRetry,f as structuredLog};
1
+ import{a,b,c,d,e,f,g,h,i,j}from"../chunk-3WNQ52TW.js";import"../chunk-Z7UN4R7T.js";import"../chunk-X6CF5KTW.js";import"../chunk-XQYAVSUQ.js";import"../chunk-PZNWH4VQ.js";import"../chunk-ZLLER3HP.js";export{c as HEARTBEAT_RETRY_BUDGET_MS,b as REPORT_RETRY_BUDGET_MS,d as REPORT_RETRY_INITIAL_MS,e as REPORT_RETRY_MAX_MS,a as RETRYABLE_REPORT_STATUSES,g as abortableSleep,i as isDefinitiveLeaseLoss,h as isRetryableReportError,j as postReportWithRetry,f as structuredLog};
@@ -3636,6 +3636,48 @@
3636
3636
  "backfill.js"
3637
3637
  ]
3638
3638
  },
3639
+ "research:resume-scoped-outcomes": {
3640
+ "aliases": [],
3641
+ "args": {},
3642
+ "description": "Finish uploading scoped headless outcomes whose receipt was preserved locally after the actor exited but whose capture or verification upload failed. Never re-runs the actor or re-measures the repository; ships the stored receipt and exact transcript only.",
3643
+ "examples": [
3644
+ "<%= config.bin %> research resume-scoped-outcomes",
3645
+ "<%= config.bin %> research resume-scoped-outcomes --list"
3646
+ ],
3647
+ "flags": {
3648
+ "api-url": {
3649
+ "description": "Override API base URL",
3650
+ "env": "RULEMETRIC_API_URL",
3651
+ "hidden": true,
3652
+ "name": "api-url",
3653
+ "hasDynamicHelp": false,
3654
+ "multiple": false,
3655
+ "type": "option"
3656
+ },
3657
+ "list": {
3658
+ "description": "Show the outcome store without uploading anything",
3659
+ "name": "list",
3660
+ "allowNo": false,
3661
+ "type": "boolean"
3662
+ }
3663
+ },
3664
+ "hasDynamicHelp": false,
3665
+ "hidden": true,
3666
+ "hiddenAliases": [],
3667
+ "id": "research:resume-scoped-outcomes",
3668
+ "pluginAlias": "@rulemetric/cli",
3669
+ "pluginName": "@rulemetric/cli",
3670
+ "pluginType": "core",
3671
+ "strict": true,
3672
+ "enableJsonFlag": false,
3673
+ "isESM": true,
3674
+ "relativePath": [
3675
+ "dist",
3676
+ "commands",
3677
+ "research",
3678
+ "resume-scoped-outcomes.js"
3679
+ ]
3680
+ },
3639
3681
  "research:tail-transcript": {
3640
3682
  "aliases": [],
3641
3683
  "args": {
@@ -4800,5 +4842,5 @@
4800
4842
  ]
4801
4843
  }
4802
4844
  },
4803
- "version": "0.16.0"
4845
+ "version": "0.17.1"
4804
4846
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rulemetric/cli",
3
- "version": "0.16.0",
3
+ "version": "0.17.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -80,9 +80,9 @@
80
80
  "postgres": "^3.4.0",
81
81
  "react": "^19.0.0",
82
82
  "zod": "^3.24.0",
83
- "@rulemetric/hooks": "0.16.0",
84
- "@rulemetric/proxy": "0.16.0",
85
- "@rulemetric/skills-registry": "0.16.0"
83
+ "@rulemetric/proxy": "0.17.1",
84
+ "@rulemetric/skills-registry": "0.17.1",
85
+ "@rulemetric/hooks": "0.17.1"
86
86
  },
87
87
  "//deps": "Worker (`evals agent`) runtime deps: the @opentelemetry/* set, @sentry/node, and postgres are STATIC top-level imports loaded at worker startup (via bundled @rulemetric/{telemetry,db}) — they MUST be runtime deps or a clean `npm i -g` crashes with ModuleLoadError. `better-sqlite3` is optionalDependencies (below): it's a native module, lazy `require()`'d inside a try/catch (packages/session providers cursor/opencode) so a missing binary degrades gracefully — making it a hard dep would break `npm i -g` on platforms without prebuilt binaries. `resend` stays a devDep: lazy `await import('resend')` guarded by RESEND_API_KEY, which end-user workers never set (provider falls back to noop). Classification verified via import-graph scan of dist/commands/evals/agent.js + per-importer static/lazy check.",
88
88
  "optionalDependencies": {
@@ -1 +0,0 @@
1
- import{a as f}from"./chunk-ZLLER3HP.js";import{z as e}from"zod";var m=e.string().regex(/^[a-f0-9]{64}$/),t=e.string().min(1).max(2e4),d=e.string().min(1).max(240).refine(i=>!i.startsWith("/")&&!i.includes("\\")&&i.split("/").every(r=>r!==".."&&r!=="."&&r!==""&&!r.startsWith(".")),"fixture paths must be relative, without traversal or hidden configuration"),p=e.object({path:d,content:e.string().max(1e5)}).strict(),h=e.object({name:t,path:d,kind:e.enum(["text_equals","json_equals","file_absent"]),expected:e.string().max(1e5),primary:e.boolean()}).strict(),g=e.object({evalId:e.string().uuid(),taskId:t,family:t,lineage:t,split:e.enum(["exploration","validation"]),incidentSessionIds:e.array(e.string().uuid()).min(1),opportunity:e.enum(["failure","success","costly_success","should_not_trigger"]),prompt:t,fixtureVersion:t,verifierVersion:t,files:e.array(p).max(100),checks:e.array(h).min(1).max(30),oracleFiles:e.array(p).max(100)}).strict(),b=e.object({version:e.literal(1),revision:e.number().int().positive(),question:t,hypotheses:e.array(t).min(2),interventionType:e.enum(["instruction","retrieval","tool","executable_check","workflow","removal","none"]),baseline:e.object({content:e.string().max(16e3),files:e.array(p).max(30)}).strict(),treatment:e.object({content:e.string().max(16e3),files:e.array(p).max(30)}).strict(),scope:e.object({projectPath:t,harnessVersion:t,deliveryMode:e.literal("explicit-system-and-fixture-file"),engine:e.enum(["claude","codex"]),model:t,provider:e.enum(["anthropic","openai"]),repositoryRevision:e.string().regex(/^[a-f0-9]{40}$/),ambientContext:e.literal("frozen-fixture"),permissions:e.literal("isolated-fixture-write"),tools:e.array(t).min(1),expiresAt:e.string().datetime()}).strict(),sampling:e.object({rationale:t,exclusions:e.array(t),eligibleOpportunities:e.number().int().positive(),sampledOpportunities:e.number().int().positive()}).strict(),analysis:e.object({role:e.enum(["diagnostic","exploration","frozen_validation"]),primaryOutcome:t,safeguards:e.array(t).min(1),eligibility:t,assignmentUnit:e.literal("task"),weighting:e.literal("equal-task"),method:e.literal("paired-task-bootstrap"),stopping:e.literal("fixed-final"),primaryComparison:e.literal("treatment-minus-baseline"),repetitions:e.number().int().min(1).max(10),usefulEffect:e.number().positive().max(1),reliabilityMargin:e.number().min(0).max(1),maxCalls:e.number().int().min(2).max(200),maxSecondsPerCall:e.number().int().min(10).max(600),humanReviewMinutes:e.number().nonnegative().nullable(),reviewNote:t}).strict(),tasks:e.array(g).min(1).max(50),supersedes:e.string().uuid().nullable()}).strict().superRefine((i,r)=>{let a=f(s=>r.addIssue({code:"custom",message:s}),"fail");(new Set(i.tasks.map(s=>s.evalId)).size!==i.tasks.length||new Set(i.tasks.map(s=>s.taskId)).size!==i.tasks.length)&&a("task identity must be unique, not repetition"),i.scope.engine==="claude"!=(i.scope.provider==="anthropic")&&a("engine/provider mismatch"),i.scope.engine==="claude"&&[...i.scope.tools].sort().join(",")!=="Bash,Edit,Read,Write"&&a("Claude fixture execution supports exactly Read, Write, Edit and Bash");for(let s of[i.baseline,i.treatment])Array.from(s.content).reduce((n,c)=>{let u=c.codePointAt(0);return n+(u<128?1:u<2048?2:u<65536?3:4)},0)>16e3&&a("Instruction delivery exceeds the UTF-8 byte budget");let o=new Map;for(let s of i.tasks){for(let n of[s.lineage,s.family])o.has(n)&&o.get(n)!==s.split&&a("family or incident lineage leaks across splits"),o.set(n,s.split);[...s.files,...i.baseline.files,...i.treatment.files].some(n=>["CLAUDE.md","CLAUDE.local.md","AGENTS.md"].includes(n.path.split("/").at(-1)))&&a("Fixture files cannot introduce ambient instruction files"),new Set(s.checks.map(n=>n.name)).size!==s.checks.length&&a("Check names must be unique"),s.checks.some(n=>n.primary)||a("each task needs an independent primary artifact check"),new Set(s.files.map(n=>n.path)).size!==s.files.length&&a("duplicate fixture file path");for(let n of[i.baseline,i.treatment])new Set(n.files.map(c=>c.path)).size!==n.files.length&&a("duplicate intervention file path"),n.files.some(c=>s.files.some(u=>u.path===c.path))&&a("intervention must not overwrite common fixture files")}let l=i.tasks.filter(s=>s.split===(i.analysis.role==="frozen_validation"?"validation":"exploration"));l.length||a("no tasks in the selected split"),l.length*2*i.analysis.repetitions>i.analysis.maxCalls&&a("planned calls exceed resource ceiling"),i.sampling.sampledOpportunities>i.sampling.eligibleOpportunities&&a("sampled opportunities exceed eligible opportunities")}),I=e.object({version:e.literal(1),id:e.string().uuid(),protocolHash:m,protocol:b}).strict(),j=e.object({studyId:e.string().uuid(),protocolHash:m,taskId:t,arm:e.enum(["baseline","treatment"]),repetition:e.number().int().positive(),eligible:e.boolean(),exclusion:e.string().nullable(),primaryPassed:e.boolean(),safeguardsPassed:e.boolean(),checks:e.array(e.object({name:t,passed:e.boolean(),actual:e.string().nullable()})),deliveryHash:m,fixtureHash:m,harnessVersion:e.string().nullable(),engine:e.string().nullable(),model:e.string().nullable(),provider:e.string().nullable(),durationMs:e.number().nonnegative(),tokens:e.number().nonnegative().nullable(),costUsd:e.number().nonnegative().nullable()}).strict(),x=e.object({harnessVersion:t,repositoryRevision:e.string().regex(/^[a-f0-9]{40}$/),contextHashes:e.record(m.nullable())}).strict(),y=e.object({name:t,path:d,kind:e.literal("command_exit"),expected:e.literal("0"),primary:e.boolean(),command:e.array(e.string().min(1).max(2e3)).min(1).max(30),timeoutMs:e.number().int().min(100).max(12e4),fileHashes:e.record(d,m).refine(i=>Object.keys(i).length>0&&Object.keys(i).length<=300,"Freeze verifier files")}).strict().refine(i=>Object.hasOwn(i.fileHashes,i.path),"The verifier entry point must be frozen"),v=e.union([h,y]),k=e.object({version:e.literal(1),kind:e.literal("artifact-checks"),environment:x,tasks:e.array(e.object({taskId:e.string().min(1).max(500),checks:e.array(v).min(1).max(30)}).strict()).min(4).max(200)}).strict(),w=e.object({version:e.literal(1),mode:e.enum(["confirmation","exploration"]).optional(),research:e.object({question:t,rationale:t,eligibility:t,riskReview:t,enrollment:e.literal("prospective-launches").optional(),suggestionId:e.string().uuid().optional(),evalTargetId:e.string().uuid().optional(),carryoverPolicy:e.literal("fresh-session-per-task"),adoptionPolicy:e.literal("no-adoption")}).strict().optional(),projectPath:t,taskFamily:t,harness:e.literal("claude_code"),model:t,configurationHash:m,baselineDeliveryHash:m,treatmentDeliveryHash:m,primaryOutcome:t,verification:k.optional(),outcomeRule:e.object({source:e.literal("session_analysis"),completedValues:e.array(e.string().min(1)).min(1),failedValues:e.array(e.string().min(1)).min(1)}).strict(),eligibleTaskIds:e.array(e.string().min(1).max(500)).min(4).max(200),maxAssignments:e.number().int().min(4).max(200),decisionRule:e.object({method:e.literal("fisher-exact-two-sided-v1").default("fisher-exact-two-sided-v1"),alpha:e.literal(.05).default(.05),minCompletedPerArm:e.number().int().min(2).max(100),minimumAbsoluteEffect:e.number().min(.01).max(1)}).strict(),expiresAt:e.string().datetime()}).strict().superRefine((i,r)=>{if(i.mode==="exploration"&&(!i.research||!i.verification||i.eligibleTaskIds.length<=i.maxAssignments)&&r.addIssue({code:"custom",message:"Exploration requires a research justification, independent verification and reserved follow-up tasks"}),i.mode!=="exploration"&&i.verification?.tasks.some(o=>o.checks.some(l=>l.kind==="command_exit"))&&r.addIssue({code:"custom",message:"Repository checks currently support exploration only"}),i.mode!=="exploration"&&i.research&&r.addIssue({code:"custom",message:"Research enrollment is only available in explicit exploration mode"}),new Set(i.eligibleTaskIds).size!==i.eligibleTaskIds.length&&r.addIssue({code:"custom",path:["eligibleTaskIds"],message:"Eligible task IDs must be unique"}),i.maxAssignments>i.eligibleTaskIds.length&&r.addIssue({code:"custom",path:["maxAssignments"],message:"Assignment ceiling exceeds the pre-registered eligible task set"}),i.verification){let o=i.verification.tasks;(new Set(o.map(l=>l.taskId)).size!==o.length||o.length!==i.eligibleTaskIds.length||o.some(l=>!i.eligibleTaskIds.includes(l.taskId)||!l.checks.some(s=>s.primary)||new Set(l.checks.map(s=>s.name)).size!==l.checks.length))&&r.addIssue({code:"custom",path:["verification"],message:"Every eligible task needs one frozen verifier with unique checks and a primary outcome"})}i.outcomeRule.completedValues.some(o=>i.outcomeRule.failedValues.includes(o))&&r.addIssue({code:"custom",path:["outcomeRule"],message:"Outcome values must map to exactly one result"})});export{I as a,w as b};
@@ -1 +0,0 @@
1
- import{d as P}from"./chunk-JP6ULOEX.js";import{d as k}from"./chunk-JNLDISBA.js";import{c as b,d as _}from"./chunk-GPBN4ROE.js";import{a as u}from"./chunk-ZLLER3HP.js";import{spawn as M}from"node:child_process";var E=["claude","codex","pi"];function N(e,t=process.env){if(e){if(E.includes(e))return e;throw new Error(`Eval engine "${String(e)}" is not known (expected one of: ${E.join(", ")})`)}let r=t.RULEMETRIC_EVAL_ENGINE?.trim().toLowerCase();if(!r)return"claude";if(E.includes(r))return r;throw new Error(`RULEMETRIC_EVAL_ENGINE="${t.RULEMETRIC_EVAL_ENGINE}" is not a known engine (expected one of: ${E.join(", ")})`)}u(N,"resolveEvalEngine");function S(e,t=process.env){return e?.trim()||t.RULEMETRIC_CODEX_MODEL?.trim()||_().codexConfiguredModel||b}u(S,"resolveCodexEvalModel");function h(e){try{let t=JSON.parse(e),r=t.result??t.content??e,a=t.usage?.total_tokens??(t.usage?.input_tokens??0)+(t.usage?.output_tokens??0)+(t.usage?.cache_creation_input_tokens??0)+(t.usage?.cache_read_input_tokens??0),n;if(t.modelUsage&&typeof t.modelUsage=="object"){let o=-1;for(let[l,d]of Object.entries(t.modelUsage)){let i=typeof d?.outputTokens=="number"?d.outputTokens:0;i>o&&(o=i,n=l)}}return{output:r,totalTokens:a,model:n,...t.usage&&typeof t.usage=="object"&&!Array.isArray(t.usage)?{usage:t.usage}:{}}}catch{return{output:e,totalTokens:0}}}u(h,"parseClaudeJsonOutput");function F(e){let{prompt:t,targetContent:r,systemPrompt:a,model:n}=e,o=["-p",t,"--output-format","json","--settings",JSON.stringify({disableAllHooks:!0,...e.writableFixture?{permissions:{blockReadsOutsideWorkingDirectories:!0},sandbox:{enabled:!0,failIfUnavailable:!0,autoAllowBashIfSandboxed:!0,allowUnsandboxedCommands:!1,excludedCommands:[],filesystem:{disabled:!1},network:{allowedDomains:[],strictAllowlist:!0}}}:{}})];e.writableFixture&&o.push("--safe-mode","--restricted","--strict-mcp-config","--tools","Read,Write,Edit,Bash","--permission-mode","acceptEdits","--allowedTools","Read,Write,Edit,Bash");let l=r??a;return l&&o.push(e.appendTarget?"--append-system-prompt":"--system-prompt",l),n&&o.push("--model",n),o}u(F,"buildClaudeArgs");function I(e,t,r,a){let n=t.trim()||r.trim()||a.trim()||"(no output on stderr or stdout)";return`Exit code ${e}: ${n.slice(0,1e3)}`}u(I,"describeExitFailure");async function U(e){let{prompt:t,targetContent:r,systemPrompt:a,workDir:n,timeout:o,model:l}=e,d=r??a,i=await k({prompt:t,systemPrompt:d,model:S(l),writableFixture:e.writableFixture,timeout:o,workDir:n});return{output:i.output,exitCode:i.exitCode,durationMs:i.durationMs,totalTokens:i.usage?.totalTokens??0,model:i.model,engine:"codex",delivery:d?"prompt_prefix":"none",error:i.error}}u(U,"executeCodexArm");async function j(e){let t=e.targetContent??e.systemPrompt,r=await P({prompt:e.prompt,...e.appendTarget?{appendSystemPrompt:t}:{systemPrompt:t},ignoreContextFiles:e.ignoreContextFiles,model:e.model,timeout:e.timeout,workDir:e.workDir});return{output:r.output,exitCode:r.exitCode,durationMs:r.durationMs,totalTokens:r.usage?.totalTokens??0,model:r.model,provider:r.provider,costUsd:r.costUsd,engine:"pi",delivery:t?"system_prompt":"none",error:r.error}}u(j,"executePiArm");async function J(e){let{prompt:t,targetContent:r,systemPrompt:a,workDir:n=process.cwd(),timeout:o=12e4,model:l}=e,d=N(e.engine);if(d==="codex")return U({...e,workDir:n,timeout:o});if(d==="pi")return j({...e,workDir:n,timeout:o});let i=F({prompt:t,targetContent:r,systemPrompt:a,model:l,appendTarget:e.appendTarget,writableFixture:e.writableFixture}),g=r??a?"system_prompt":"none",x=Date.now();return new Promise(f=>{let c=e.writableFixture?Object.fromEntries(Object.entries(process.env).filter(([s])=>["HOME","PATH","USER","LOGNAME","SHELL","TMPDIR","LANG","LC_ALL","TZ","SSL_CERT_FILE","NODE_EXTRA_CA_CERTS","ANTHROPIC_API_KEY","CLAUDE_CODE_OAUTH_TOKEN","CLAUDE_CONFIG_DIR"].includes(s))):{...process.env};delete c.CLAUDECODE,delete c.HTTPS_PROXY;let D=["/opt/homebrew/bin","/usr/local/bin"],C=(c.PATH??"").split(":").filter(Boolean),v=D.filter(s=>!C.includes(s));v.length&&(c.PATH=[...C,...v].join(":"));let p=M("claude",i,{cwd:n,env:c,stdio:["ignore","pipe","pipe"]}),m="",T="";p.stdout.on("data",s=>{m+=s.toString()}),p.stderr.on("data",s=>{T+=s.toString()});let w=setTimeout(()=>{p.kill("SIGTERM"),f({output:m,exitCode:null,durationMs:Date.now()-x,totalTokens:0,engine:"claude",delivery:g,error:`Timed out after ${o}ms`})},o);p.on("close",s=>{clearTimeout(w);let R=Date.now()-x,{output:y,totalTokens:A,model:O,usage:L}=h(m);f({output:y,exitCode:s,durationMs:R,totalTokens:A,usage:L,model:O,engine:"claude",delivery:g,error:s!==0?I(s,T,y,m):void 0})}),p.on("error",s=>{clearTimeout(w),f({output:"",exitCode:null,durationMs:Date.now()-x,totalTokens:0,engine:"claude",delivery:g,error:`Failed to spawn claude: ${s.message}`})})})}u(J,"executeEval");export{N as a,S as b,h as c,F as d,I as e,J as f};
@@ -1,3 +0,0 @@
1
- import{h as R}from"./chunk-CVPAKEEZ.js";import{a as S,b as v,c as $,f as w,g as A}from"./chunk-SIGZEQ3K.js";import{e as y,f}from"./chunk-GIXHG5FK.js";import{a as c}from"./chunk-ZLLER3HP.js";import{execFileSync as x}from"node:child_process";import{openSync as P,readSync as C,closeSync as j,readFileSync as E}from"node:fs";function I(l){let t;try{t=P(l,"r");let o=Buffer.alloc(64*1024),s=C(t,o,0,o.length,0),i=o.subarray(0,s).toString("utf-8");for(let r of i.split(`
2
- `))if(r.startsWith("{"))try{let a=JSON.parse(r).cwd;if(typeof a=="string"&&a.startsWith("/"))return a}catch{}return null}catch{return null}finally{t!==void 0&&j(t)}}c(I,"readTranscriptCwd");function W(l){let t=c(r=>{try{return x("git",["-C",l,...r],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],timeout:5e3}).trim()||null}catch{return null}},"git");if(!t(["rev-parse","--show-toplevel"]))return null;let s=t(["rev-parse","--git-dir"]),i=t(["rev-parse","--git-common-dir"]);return{gitRemote:t(["remote","get-url","origin"]),gitRootCommit:t(["rev-list","--max-parents=0","HEAD"])?.split(`
3
- `).pop()?.trim()??null,gitBranch:t(["branch","--show-current"]),isWorktree:!!s&&!!i&&s!==i}}c(W,"gitAnchors");async function O(l,t,o=v(W,I)){let s=Math.min(l.limit??200,1e3),i=await R(()=>y(`/api/sessions/unattributed?limit=${s}`),{log:c(e=>t.logger.info(e),"log"),label:"sessions/unattributed",idempotent:!0}),r=i.sessions??[],a=i.total??r.length;if(r.length===0)return t.logger.info("no unattributed sessions"),{scanned:0,repaired:0,reimported:0,unrepairable:0,remaining:0};let m=0,g=0,u=0;for(let e of r){if(!e.externalSessionId){u++;continue}let n=A(e,o);if(!n){u++;continue}try{await f("/api/sessions",{tool:e.tool,externalSessionId:e.externalSessionId,projectPath:n.projectPath,...n.gitBranch?{gitBranch:n.gitBranch}:{},metadata:{...n.gitRemote?{gitRemote:n.gitRemote}:{},...n.gitRootCommit?{gitRootCommit:n.gitRootCommit}:{},isWorktree:n.isWorktree,reconciledAttribution:!0}}),m++}catch(d){u++,t.logger.info(`reconcile failed for ${e.externalSessionId}: ${d.message}`);continue}let p=e.tool==="claude_code"?$(e.externalSessionId,o):null,b=w({tool:e.tool,pathWasJunk:!!e.projectPath&&S(e.projectPath),endedAt:e.endedAt??null,transcript:p?o.stat(p):null});if(b.reimport&&p)try{let d=E(p,"utf-8");await f(`/api/sessions/${e.id}/reimport`,{content:d,tool:"claude_code"}),g++}catch(d){t.logger.info(`reimport failed for ${e.externalSessionId} (${b.reason}): ${d.message}`)}}let h=a-m;return t.logger.info(`reconciled attribution: scanned=${r.length} repaired=${m} reimported=${g} unrepairable=${u} remaining=${h} (of ${a} total)`),{scanned:r.length,repaired:m,reimported:g,unrepairable:u,remaining:h}}c(O,"cronReconcileAttribution");export{O as a};
@@ -1 +0,0 @@
1
- import{b as p,c as s}from"./chunk-SIGZEQ3K.js";import{e as n,f as i}from"./chunk-GIXHG5FK.js";import{a}from"./chunk-ZLLER3HP.js";import{readFileSync as u,statSync as f}from"node:fs";import{join as h}from"node:path";import{pathToFileURL as w}from"node:url";import{scriptsDir as j}from"@rulemetric/hooks/scripts-dir";async function L(r,t){let e=r.scopedConfirmation,o=s(t,p(()=>null,()=>null));if(!o||f(o).size>2e7)throw new Error("Completed actor transcript is missing or exceeds the capture bound");let c=await import(w(h(j,"scoped-live.mjs")).href);c.transcriptEvidence(o,t);let d=await i("/api/sessions",{tool:"claude_code",externalSessionId:t,projectPath:r.projectPath});await i(`/api/sessions/${d.id}/reimport`,{tool:"claude_code",content:u(o,"utf8")});let{confirmation:m}=await n(`/api/scoped-live-confirmations/${e.id}/contract`),l=c.collectScopedOutcome(m.protocol,e.taskId,t,r.projectPath,o);return await i(`/api/scoped-live-confirmations/${e.id}/verify`,l),await i("/api/instruction-experiments/settle",{projectPath:r.projectPath}),{status:"recorded",sessionId:t,studyId:e.id}}a(L,"finalizeScopedLaunch");export{L as a};
@@ -1 +0,0 @@
1
- import{l as E}from"./chunk-X6CF5KTW.js";import{a as p,e as w}from"./chunk-PZNWH4VQ.js";import{a as o}from"./chunk-ZLLER3HP.js";import{fileURLToPath as v}from"node:url";import{existsSync as A,readFileSync as b}from"node:fs";import{dirname as L,join as x}from"node:path";function C(){let t=L(v(import.meta.url));for(let e=0;e<8;e++){let s=x(t,"package.json");if(A(s))try{let i=JSON.parse(b(s,"utf8"));if(i.name==="@rulemetric/cli"&&i.version)return i.version}catch{}let n=L(t);if(n===t)break;t=n}return"0.0.0"}o(C,"readCliVersion");var O=C(),I="https://rulemetric.com",l=class extends Error{constructor(s,n){super(n);this.statusCode=s;this.name="ApiError"}static{o(this,"ApiError")}};function S(){let t=p(),e=process.env.RULEMETRIC_API_URL??t.apiUrl;if(!e){if(process.env.RULEMETRIC_STRICT_LOCAL==="1"||t.strictLocal==="1")throw new Error("RULEMETRIC_STRICT_LOCAL is set but no RULEMETRIC_API_URL is configured \u2014 refusing the cloud default. Set RULEMETRIC_API_URL in the environment or ~/.config/rulemetric/env.");e=I}let s=new URL(e);if(s.protocol==="http:"&&s.hostname!=="localhost"&&s.hostname!=="127.0.0.1")throw new Error(`API URL must use HTTPS for non-localhost hosts: ${e}`);return e}o(S,"getBaseUrl");async function a(t,e={}){let n=`${S()}${t}`,i={"Content-Type":"application/json","User-Agent":`rulemetric-cli/${O}`,...e.headers},m=p(),d=process.env.RULEMETRIC_API_KEY||m.apiKey||w()?.accessToken||m.accessToken;d&&(i.Authorization=`Bearer ${d}`);let h=new URL(n),f=h.hostname==="localhost"||h.hostname==="127.0.0.1",P=process.env.HTTPS_PROXY,R=process.env.HTTP_PROXY;f&&(delete process.env.HTTPS_PROXY,delete process.env.HTTP_PROXY);let u=e.timeoutMs?new AbortController:void 0,g=!1,y=u?setTimeout(()=>{g=!0,u.abort()},e.timeoutMs):void 0,r;try{r=await fetch(n,{method:e.method??"GET",headers:i,body:e.body?JSON.stringify(e.body):void 0,signal:u?.signal})}catch(T){if(g){let U=new URL(n).host,_=Math.round(e.timeoutMs/1e3);throw new l(408,`Request to ${U} timed out after ${_}s. This is usually transient or a local proxy/gateway issue \u2014 retry, and if it persists check HTTPS_PROXY / the RuleMetric gateway (:8787).`)}throw T}finally{y&&clearTimeout(y),f&&(P!==void 0&&(process.env.HTTPS_PROXY=P),R!==void 0&&(process.env.HTTP_PROXY=R))}let c;if(r.headers.get("content-type")?.includes("application/json")?c=await r.json():c=await r.text(),!r.ok){let{message:T}=E(r.status,c);throw new l(r.status,T)}return c}o(a,"api");var j=o(t=>a(t),"apiGet"),F=o((t,e)=>a(t,{method:"POST",body:e}),"apiPost"),B=o((t,e)=>a(t,{method:"PUT",body:e}),"apiPut"),D=o((t,e)=>a(t,{method:"PATCH",body:e}),"apiPatch"),G=o(t=>a(t,{method:"DELETE"}),"apiDelete");export{I as a,l as b,S as c,a as d,j as e,F as f,B as g,D as h,G as i};
@@ -1 +0,0 @@
1
- import{a as K,b as N,c as M,d as X,e as Y}from"./chunk-JU5ZNXPK.js";import{a as W}from"./chunk-3WCX2SLU.js";import{a as h}from"./chunk-5RBLIVBF.js";import{a as Z}from"./chunk-KR36ZDGN.js";import{b as ee}from"./chunk-HBDKOU2N.js";import{a as C,c as V}from"./chunk-FADINV4H.js";import{f as j}from"./chunk-SWSOEYC7.js";import{a as Q}from"./chunk-FG343JM3.js";import{a as q,f as B}from"./chunk-4GOXEEXZ.js";import{e as R,f as I,h as $}from"./chunk-GIXHG5FK.js";import{a as x}from"./chunk-ZLLER3HP.js";import{execFileSync as re}from"node:child_process";import{tmpdir as te}from"node:os";async function he(a,k){let{mirrorId:u,evalTargetId:p}=a,s=a.measurement?{...a.config,...V({...a.config,measurement:a.measurement})}:a.config,l=x(e=>k.logger.info(e),"log"),t=a.study?W.parse(a.study):null;if(t&&t.protocol.scope.engine!=="claude")throw new h("Frozen study isolation is currently verified only for Claude");if(t&&K(t.protocol)!==t.protocolHash)throw new h("Study snapshot hash mismatch");let P=await R(`/api/eval-targets/${p}`),d=a.candidateSnapshot?{...P,...a.candidateSnapshot}:P,c=await R(`/api/eval-targets/${p}/evals`);if(t&&(c=t.protocol.tasks.filter(e=>e.split===(t.protocol.analysis.role==="frozen_validation"?"validation":"exploration")).map(e=>({id:e.evalId,name:e.taskId,prompt:e.prompt,expectedOutput:"",expectations:[]}))),c.length===0&&s.generateIfEmpty){l("No eval cases on target \u2014 generating from content via local LLM...");let e=await ee({content:d.content,name:d.name,...a.measurement?{measurement:a.measurement}:{}});if(e===null)throw new Error("Case generation requires a local LLM backend (Claude or Codex CLI) \u2014 none available on this worker.");let r=[];for(let n of e)r.push(await I(`/api/eval-targets/${p}/evals`,n));c=r,l(`Generated ${r.length} eval case(s)`)}if(a.candidateSnapshot&&(c=c.slice(0,5)),c.length===0)throw new h("No evals defined for target");let _=null;if(t&&(_=re(t.protocol.scope.engine,["--version"],{encoding:"utf8",timeout:1e4}).trim(),_!==t.protocol.scope.harnessVersion))throw new h("Observed harness version differs from frozen protocol");if(t){if(s.engine!==t.protocol.scope.engine||s.model!==t.protocol.scope.model||s.runsPerEval!==t.protocol.analysis.repetitions||s.timeout!==t.protocol.analysis.maxSecondsPerCall*1e3||s.skipBaseline||new Date(t.protocol.scope.expiresAt)<=new Date)throw new h("Study execution configuration differs from frozen protocol or scope expired");for(let e of t.protocol.tasks.filter(r=>c.some(n=>n.id===r.evalId))){let r=j({baseDir:te(),engine:t.protocol.scope.engine});try{N(r.workDir,[...e.files,...e.oracleFiles]);let n=M(r.workDir,e);if(!n.primaryPassed||!n.safeguardsPassed)throw new h(`Oracle failed for ${e.taskId}; no actor calls started`)}finally{r.cleanup()}}}let ne=s.runsPerEval??1,D=s.timeout??12e4,H=t?1:s.iteration??1,S=new Set;if(k.job.attempts>1)for(let r=0;;r+=100){let n=await R(`/api/eval-targets/${p}/runs?jobId=${u}&limit=100&offset=${r}`);for(let i of n)S.add(`${i.evalId}|${i.configuration}|${i.runNumber}|${i.iteration}`);if(n.length<100)break}let T=[{name:"with_target",content:t?.protocol.treatment.content??d.content}];s.skipBaseline||T.push({name:"without_target",...t?{content:t.protocol.baseline.content}:{}});let f=[];for(let e of c)for(let r of T)for(let n=1;n<=ne;n++)S.has(`${e.id}|${r.name}|${n}|${H}`)||f.push({eval_:e,configuration:r.name,targetContent:r.content,runNumber:n});t&&f.sort((e,r)=>e.eval_.id.localeCompare(r.eval_.id)||e.runNumber-r.runNumber||((c.findIndex(n=>n.id===e.eval_.id)+e.runNumber)%2?e.configuration.localeCompare(r.configuration):r.configuration.localeCompare(e.configuration))),S.size>0&&l(`Resuming attempt ${k.job.attempts}: ${S.size} run(s) already persisted, ${f.length} remaining`);let m=f.length,v=0,w=q(s.engine),b=Math.min(s.parallel??1,4);await $(`/api/eval-jobs/${u}/progress`,{status:"running",progress:{total:m,completed:0,current:null,message:`Starting ${m} eval runs (concurrency: ${b})...`}});let y=[];async function F(e){let r=`${e.configuration} \xB7 ${e.eval_.name} \xB7 run#${e.runNumber}`;l(`[${v+1}/${m}] ${r}`);let n=j({...t?{baseDir:te()}:{},targetType:t?"instruction":d.type,targetContent:e.targetContent,targetName:d.name,engine:w});n.leakedFiles.length&&l(`\u26A0 CONTAMINATED ${r}: ${n.leakedFiles.join(", ")} survived the strip`);try{let i=t?.protocol.tasks.find(U=>U.evalId===e.eval_.id),g=e.configuration==="with_target"?"treatment":"baseline";t&&i&&N(n.workDir,[...i.files,...t.protocol[g].files]);let O=t&&i?Y(n.workDir,i,t.protocol[g],w):null;t&&i&&await I(`/api/studies/${t.id}/calls`,{jobId:u,taskId:i.taskId,arm:g,repetition:e.runNumber});let o=await B({prompt:e.eval_.prompt,targetContent:t?e.targetContent:n.systemPrompt,...t?{appendTarget:!0}:{},workDir:n.workDir,timeout:D,model:s.model,engine:w,...t?{writableFixture:!0}:{}}),G={};!s.skipGrading&&e.eval_.expectations.length>0&&!o.error&&(G=await Q({...C({engine:w,model:s.model},{engine:s.graderEngine,model:s.graderModel}),prompt:e.eval_.prompt,output:o.output,expectations:e.eval_.expectations,timeout:D}));let A=t?X(t.protocol,o):null,L=t&&i?{studyId:t.id,protocolHash:t.protocolHash,taskId:i.taskId,arm:g,repetition:e.runNumber,eligible:A===null,exclusion:A,...M(n.workDir,i),deliveryHash:O.deliveryHash,fixtureHash:O.fixtureHash,harnessVersion:_,engine:o.engine??null,model:o.model??null,provider:o.engine==="claude"?"anthropic":o.provider??null,durationMs:o.durationMs,tokens:o.totalTokens||null,costUsd:o.costUsd??null}:null;return{jobId:u,evalId:e.eval_.id,evalTargetId:d.id,evalTargetVersion:d.version,configuration:e.configuration,runNumber:e.runNumber,iteration:H,status:o.error?"failed":"completed",outputs:{...L?{study:L}:{},...a.candidateSnapshot?{candidateHash:a.candidateSnapshot.contentHash,suggestionId:a.candidateSnapshot.suggestionId,evidenceKind:"constructed_evaluation"}:{},...o.usage?{usage:o.usage}:{},...o.error?{error:o.error}:{transcript:o.output,...o.model?{model:o.model}:{}},methodology:n.methodology,delivery:n.delivery,isolated:n.isWorktree,engine:o.engine??w,model:o.model??null,deliveryRegime:`${d.type}:${w}:${n.methodology}`,...a.measurement?{measurement:a.measurement}:{},...o.provider?{provider:o.provider}:{},...o.costUsd!=null?{costUsd:o.costUsd}:{},...n.leakedFiles.length?{leakedFiles:n.leakedFiles}:{}},timing:{duration_ms:o.durationMs,total_tokens:o.totalTokens},grading:G,worktree:n.isWorktree?!0:void 0}}finally{n.cleanup()}}if(x(F,"processItem"),b<=1)for(let e of f){let r=`${e.configuration} \xB7 ${e.eval_.name} \xB7 run#${e.runNumber}`,n=await $(`/api/eval-jobs/${u}/progress`,{status:"running",progress:{total:m,completed:v,current:r,message:`Executing ${r}...`}});if(a.candidateSnapshot&&n?.status==="cancelled")throw new h("Suggestion testing cancelled; no further actor calls");let i=await F(e);await I("/api/eval-runs",i),y.push(i),v++,await $(`/api/eval-jobs/${u}/progress`,{status:"running",progress:{total:m,completed:v,current:r,message:`Completed ${r}`}})}else{l(`Running ${m} evals with concurrency=${b} (worktree isolation)`);for(let e=0;e<f.length;e+=b){let r=f.slice(e,e+b),n=`batch ${Math.floor(e/b)+1}/${Math.ceil(f.length/b)}`;await $(`/api/eval-jobs/${u}/progress`,{status:"running",progress:{total:m,completed:v,current:n,message:`Executing ${n} (${r.length} parallel)...`}});let i=await Promise.all(r.map(F));for(let g of i)await I("/api/eval-runs",g),y.push(g),v++;await $(`/api/eval-jobs/${u}/progress`,{status:"running",progress:{total:m,completed:v,current:n,message:`Completed ${n}`}})}}let J=oe(y),E;if(!s.skipGrading&&y.some(e=>e.grading&&Object.keys(e.grading).length>0))try{l(`Running meta-judge for job ${u}...`);let e=c.map(r=>{let i=y.filter(g=>g.evalId===r.id&&g.configuration==="with_target")[0];return{evalName:r.name,prompt:r.prompt,expectations:r.expectations,grading:i?.grading?i.grading:null,output:i?.outputs?.transcript?.slice(0,500)}});E=await Z({...C({engine:w,model:s.model},{engine:s.graderEngine,model:s.graderModel}),targetName:d.name,evalResults:e,timeout:6e4}),l(`Meta-judge: quality=${E.quality_score}/5, issues=${E.issues.length}`)}catch(e){l(`Meta-judge failed (non-fatal): ${e instanceof Error?e.message:String(e)}`)}let z=E?{...J,meta_judgement:E}:J;return l(`Job ${u} completed: ${v}/${m} runs`),await $(`/api/eval-jobs/${u}/state`,{result:z}).catch(e=>{l(`result persist failed: ${e instanceof Error?e.message:String(e)}`)}),z}x(he,"processEval");function oe(a){let k=a.filter(l=>l.status==="completed"),u=a.filter(l=>l.status==="failed"),p=k.filter(l=>{let t=l.grading;return t&&Object.keys(t).length>0}),s=p.length>0?p.reduce((l,t)=>l+(t.grading?.summary?.pass_rate??0),0)/p.length:null;return{total:a.length,completed:k.length,failed:u.length,avgPassRate:s}}x(oe,"buildSummary");export{he as a};
@@ -1 +0,0 @@
1
- import{b as I}from"./chunk-3WCX2SLU.js";import{e as a,f as u}from"./chunk-GIXHG5FK.js";import{a as d}from"./chunk-ZLLER3HP.js";import{createHash as P,randomUUID as R}from"node:crypto";import{readFileSync as m,existsSync as g}from"node:fs";import{join as r}from"node:path";import{pathToFileURL as $}from"node:url";import{execFileSync as H}from"node:child_process";import{scriptsDir as C}from"@rulemetric/hooks/scripts-dir";var h=d(t=>P("sha256").update(t).digest("hex"),"hash");async function N(t){let k=await a(`/api/instruction-suggestions/${t.suggestionId}/test`);if(k.liveStudies?.length)return{status:"existing",studyId:k.liveStudies[0].id};let o=await a(`/api/eval-targets/${t.evalTargetId}`);if(!o.projectPath||!o.instructionId)return{status:"blocked",reason:"The suggestion has no project and instruction link."};let s=o.projectPath;if(!g(r(s,"package.json")))return{status:"blocked",reason:"Automatic repository checks currently require a package.json type-check or typecheck script."};let c=JSON.parse(m(r(s,"package.json"),"utf8")),f=["type-check","typecheck"].find(e=>typeof c.scripts?.[e]=="string");if(!f)return{status:"blocked",reason:"Add a type-check or typecheck script to prepare independently checked code tasks."};let y=await a(`/api/eval-targets/${t.evalTargetId}/runs?jobId=${t.evalJobId}&limit=100`),v=y.flatMap(e=>e.outputs?.engine==="claude"&&e.outputs.model?[e.outputs.model]:[]),p=[...new Set(v)];if(p.length!==1||v.length!==y.length)return{status:"blocked",reason:"Live delivery needs one observed Claude model across the comparison runs."};let l=await import($(r(C,"scoped-live.mjs")).href);if(typeof l.runRepositoryCheck!="function")return{status:"blocked",reason:"Upgrade the installed hooks to support repository checks."};let n=l.observeEnvironment(s);for(let e of Object.keys(n.contextHashes))if(n.contextHashes[e]&&/(?:CLAUDE(?:\.local)?|AGENTS)\.md$/.test(e)&&m(e,"utf8").includes(t.content.trim()))return{status:"blocked",reason:"The candidate already exists in background instructions; it cannot be withheld from baseline tasks."};let S=H("git",["ls-files","-z"],{cwd:s,encoding:"utf8",timeout:5e3}).split("\0"),b=[...new Set(["package.json",...S.filter(e=>/(^|\/)(package\.json|tsconfig[^/]*\.json|turbo\.json|pnpm-workspace\.yaml|pnpm-lock\.yaml|package-lock\.json|yarn\.lock)$/.test(e))])];if(b.length>300)return{status:"blocked",reason:"Repository verifier configuration exceeds the 300-file preparation bound."};let T=Object.fromEntries(b.sort().map(e=>[e,h(m(r(s,e),"utf8"))])),x={name:"Repository type checking passes",path:"package.json",kind:"command_exit",expected:"0",primary:!0,command:[c.packageManager?.startsWith("pnpm@")||g(r(s,"pnpm-lock.yaml"))?"pnpm":c.packageManager?.startsWith("yarn@")||g(r(s,"yarn.lock"))?"yarn":"npm","run",f],timeoutMs:12e4,fileHashes:T},i=l.runRepositoryCheck(s,x);if(i.error||i.exitCode===null)return{status:"blocked",reason:`The verifier could not execute: ${i.error??"no exit status"}`};let j=Array.from({length:21},()=>`work-${R()}`),w=I.parse({version:1,mode:"exploration",research:{question:`Does ${o.name} increase the fraction of fresh launched tasks leaving repository type checks passing?`,rationale:o.description||"Test the exact suggested instruction on prospective project work.",eligibility:"Fresh work requests supplied before launch in this project, using the pinned Claude model. One request per task; resumed and repeated work excluded.",riskReview:"Twenty task assignments, one baseline follow-up, seven-day expiry. Frozen repository checks; changes to checker configuration invalidate outcomes. Shared-checkout carryover is recorded; final causal interpretation remains inconclusive. No automatic adoption.",enrollment:"prospective-launches",suggestionId:t.suggestionId,evalTargetId:t.evalTargetId,carryoverPolicy:"fresh-session-per-task",adoptionPolicy:"no-adoption"},projectPath:s,taskFamily:"fresh-project-work",harness:"claude_code",model:p[0],configurationHash:h(JSON.stringify(n)),baselineDeliveryHash:h(""),treatmentDeliveryHash:t.contentHash,primaryOutcome:"Repository type checking passes after the task; this is not a claim of full task correctness.",outcomeRule:{source:"session_analysis",completedValues:["achieved"],failedValues:["failed"]},eligibleTaskIds:j,maxAssignments:20,decisionRule:{minCompletedPerArm:2,minimumAbsoluteEffect:.1},expiresAt:new Date(Date.now()+7*864e5).toISOString(),verification:{version:1,kind:"artifact-checks",environment:n,tasks:j.map(e=>({taskId:e,checks:[x]}))}}),A=await u("/api/instruction-experiments",{instructionId:o.instructionId,projectPath:s,source:"trial",mode:"scoped"});return{status:"waiting_for_work",studyId:(await u(`/api/instruction-experiments/${A.experimentId}/scoped-live-confirmations`,{protocol:w})).confirmation.id,verifierReadiness:i,taskLimit:20,outcome:w.primaryOutcome,model:p[0]}}d(N,"prepareSuggestionLive");export{N as a};
@@ -1,4 +0,0 @@
1
- import{a as y}from"./chunk-6XTLP2G7.js";import{a as s}from"./chunk-ZLLER3HP.js";import{spawn as v}from"node:child_process";import{mkdtempSync as O,readFileSync as D,rmSync as I}from"node:fs";import{tmpdir as M}from"node:os";import{join as E}from"node:path";var R=s(t=>`codex:${t.replace(/^codex:/,"")}`,"codexModelId");function $(t,o,i=!1){return["exec","--json","--sandbox",i?"workspace-write":"read-only","--skip-git-repo-check","--ephemeral","--model",t.replace(/^codex:/,""),"--output-last-message",o,"-"]}s($,"buildCodexArgs");function A(t){let o;for(let i of t.split(`
2
- `)){let c=i.trim();if(!c.startsWith("{"))continue;let n;try{n=JSON.parse(c)}catch{continue}if(typeof n!="object"||n===null)continue;let d=n.usage;if(typeof d!="object"||d===null)continue;let u=s(x=>{let p=d[x];return typeof p=="number"&&Number.isFinite(p)?p:0},"num"),l=u("input_tokens"),a=u("output_tokens");o={inputTokens:l,cachedInputTokens:u("cached_input_tokens"),outputTokens:a,reasoningOutputTokens:u("reasoning_output_tokens"),totalTokens:l+a}}return o}s(A,"parseCodexUsage");async function L(t){let{prompt:o,systemPrompt:i,model:c,timeout:n=12e4,workDir:d=process.cwd()}=t,u=i?`${i}
3
-
4
- ${o}`:o,l=y("codex");if(!l)return{output:"",exitCode:null,durationMs:0,error:"Codex CLI not found on PATH, well-known install dirs, or the node bin dir \u2014 is it installed?"};let a=O(E(M(),"rulemetric-codex-")),x=E(a,"last-message.txt"),p=Date.now();return new Promise(S=>{let f={...process.env};delete f.HTTPS_PROXY;let _=["/opt/homebrew/bin","/usr/local/bin"],T=(f.PATH??"").split(":").filter(Boolean),b=_.filter(e=>!T.includes(e));b.length&&(f.PATH=[...T,...b].join(":"));let r=v(l,$(c,x,t.writableFixture),{cwd:d,env:f,stdio:["pipe","pipe","pipe"]}),C="",m="",w=256*1024;r.stdout.on("data",e=>{m+=e.toString(),m.length>w&&(m=m.slice(-w))}),r.stderr.on("data",e=>{C+=e.toString()});let g=s(e=>{I(a,{recursive:!0,force:!0}),S({...e,durationMs:Date.now()-p})},"finish"),h=setTimeout(()=>{r.kill("SIGTERM"),g({output:"",exitCode:null,error:`codex exec timed out after ${n}ms`})},n);r.on("error",e=>{clearTimeout(h),g({output:"",exitCode:null,error:`failed to spawn codex: ${e.message} (is the Codex CLI installed?)`})}),r.on("close",e=>{clearTimeout(h);let k="";try{k=D(x,"utf8").trim()}catch{}let P=A(m);if(e!==0||k===""){g({output:k,exitCode:e,usage:P,error:`codex exec failed (exit ${e}): ${C.trim().slice(-500)||"no last message produced"}`});return}g({output:k,exitCode:e,model:R(c),usage:P})}),r.stdin.write(u),r.stdin.end()})}s(L,"executeCodexEval");export{R as a,$ as b,A as c,L as d};
@@ -1,28 +0,0 @@
1
- import{a as l,b as Lt}from"./chunk-ZLLER3HP.js";var Xe=["claude_code","cursor","vscode_copilot","copilot_agent","rulemetric_mcp","codex","pi","opencode","antigravity"],Ye=["user_message","assistant_message","assistant_response","tool_call","tool_result","thinking","error"];var Jt=new Set(["","unknown","<synthetic>"]);function Gt(e){if(typeof e!="string")return null;let t=e.trim();return Jt.has(t)?null:t}l(Gt,"resolveEventModel");var C=class{static{l(this,"ClaudeCodeAdapter")}tool="claude_code";parse(t){let n=t.split(`
2
- `).filter(c=>c.trim()),o=[];for(let c of n)try{o.push(JSON.parse(c))}catch{}let s=o.filter(c=>c.type==="user"||c.type==="assistant"),r=null,i=null,u={},a=o.find(c=>c.type==="user");a&&(r=a.cwd??null,i=a.gitBranch??null,a.version&&(u.claudeCodeVersion=a.version),a.sessionId&&(u.sessionId=a.sessionId));let p=o.find(c=>c.type==="assistant");p?.message?.model&&(u.model=p.message.model);let m=[],f=0;for(let c of s){let y=c.timestamp??new Date().toISOString();if(c.type==="user"){let h=c.message?.content;if(typeof h=="string")m.push({sequence:f++,eventType:"user_message",content:h,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:y,metadata:{}});else if(Array.isArray(h))for(let _ of h)_.type==="tool_result"&&m.push({sequence:f++,eventType:"tool_result",content:typeof _.content=="string"?_.content:JSON.stringify(_.content),toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:y,metadata:{toolUseId:_.tool_use_id}})}else if(c.type==="assistant"){let h=Array.isArray(c.message?.content)?c.message.content:[],_=c.message?.usage,I=_?{input:_.input_tokens??0,output:_.output_tokens??0,cacheRead:_.cache_read_input_tokens??0,cacheWrite:_.cache_creation_input_tokens??0}:null,T={};c.message?.model&&(T.model=c.message.model);let x=Gt(c.message?.model);c.message?.stop_reason&&(T.stopReason=c.message.stop_reason),c.requestId&&(T.requestId=c.requestId),_?.service_tier&&(T.serviceTier=_.service_tier),_?.speed&&(T.speed=_.speed),_?.cache_creation&&(T.cacheCreationDetail=_.cache_creation),_?.server_tool_use&&(T.serverToolUse=_.server_tool_use);for(let S of h)S.type==="text"?m.push({sequence:f++,eventType:"assistant_message",content:S.text??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:I,model:x,timestamp:y,metadata:T}):S.type==="thinking"?m.push({sequence:f++,eventType:"thinking",content:S.thinking??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:I,model:x,timestamp:y,metadata:T}):S.type==="tool_use"&&m.push({sequence:f++,eventType:"tool_call",content:null,toolName:S.name??"unknown",toolInput:S.input??null,toolOutput:null,tokenUsage:I,model:x,timestamp:y,metadata:{...T,toolUseId:S.id}})}}let d=m.map(c=>c.timestamp).sort(),g=new Date().toISOString();return{tool:"claude_code",projectPath:r,gitBranch:i,startedAt:d[0]??g,endedAt:d[d.length-1]??null,events:m,metadata:u}}};var A=class{static{l(this,"CursorAdapter")}tool="cursor";parse(t){let n=Lt("better-sqlite3"),o=new n(t,{readonly:!0});try{let s=o.prepare("SELECT value FROM ItemTable WHERE key = 'composer.composerData'").get();return s?this.parseComposerJson(s.value):this.emptySession()}finally{o.close()}}parseComposerJson(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let o=Object.values(n.allComposers??{});if(o.length===0)return this.emptySession();let s=o.sort((p,m)=>{let f=p.createdAt?new Date(p.createdAt).getTime():0;return(m.createdAt?new Date(m.createdAt).getTime():0)-f})[0],r=s.conversation??[],i=[];for(let p=0;p<r.length;p++){let m=r[p],f=m.createdAt??new Date().toISOString();i.push({sequence:p,eventType:m.type===1?"user_message":"assistant_message",content:m.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:f,metadata:{}})}let u=i.map(p=>p.timestamp).sort(),a=new Date().toISOString();return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:u[0]??a,endedAt:u[u.length-1]??null,events:i,metadata:{composerId:s.composerId}}}emptySession(){return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};var N=class{static{l(this,"VSCodeCopilotAdapter")}tool="vscode_copilot";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let o=n.requests??[],s=[],r=0;for(let a of o){let p=a.timestamp?new Date(a.timestamp).toISOString():new Date().toISOString();if(s.push({sequence:r++,eventType:"user_message",content:a.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:p,metadata:{}}),a.response){let m=a.response.timestamp?new Date(a.response.timestamp).toISOString():p;s.push({sequence:r++,eventType:"assistant_message",content:a.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}}let i=s.map(a=>a.timestamp).sort(),u=new Date().toISOString();return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:i[0]??u,endedAt:i[i.length-1]??null,events:s,metadata:{...n.requesterUsername&&{username:n.requesterUsername},...n.customTitle&&{title:n.customTitle}}}}emptySession(){return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};var P=class{static{l(this,"CopilotAgentAdapter")}tool="copilot_agent";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let o=n.requests??[],s=[],r=0;for(let a of o){let p=a.timestamp?new Date(a.timestamp).toISOString():new Date().toISOString();if(s.push({sequence:r++,eventType:"user_message",content:a.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:p,metadata:{}}),a.toolCalls)for(let m of a.toolCalls){let f=m.timestamp?new Date(m.timestamp).toISOString():p;s.push({sequence:r++,eventType:"tool_call",content:null,toolName:m.name??"unknown",toolInput:m.input??null,toolOutput:m.output??null,tokenUsage:null,timestamp:f,metadata:{}})}if(a.response){let m=a.response.timestamp?new Date(a.response.timestamp).toISOString():p;s.push({sequence:r++,eventType:"assistant_message",content:a.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}}let i=s.map(a=>a.timestamp).sort(),u=new Date().toISOString();return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:i[0]??u,endedAt:i[i.length-1]??null,events:s,metadata:{...n.requesterUsername&&{username:n.requesterUsername},...n.customTitle&&{title:n.customTitle},...n.agentMode!=null&&{agentMode:n.agentMode}}}}emptySession(){return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};var D=class{static{l(this,"RuleMetricMcpAdapter")}tool="rulemetric_mcp";parse(t){let n;try{n=JSON.parse(t)}catch{return this.emptySession()}let s=(n.events??[]).map((i,u)=>({sequence:i.sequence??u,eventType:this.normalizeEventType(i.eventType),content:i.content??null,toolName:i.toolName??null,toolInput:i.toolInput??null,toolOutput:i.toolOutput??null,tokenUsage:i.tokenUsage??null,timestamp:i.timestamp??new Date().toISOString(),metadata:i.metadata??{}})),r=new Date().toISOString();return{tool:"rulemetric_mcp",projectPath:n.projectPath??null,gitBranch:n.gitBranch??null,startedAt:n.startedAt??s[0]?.timestamp??r,endedAt:n.endedAt??s[s.length-1]?.timestamp??null,events:s,metadata:n.metadata??{}}}normalizeEventType(t){return t&&["user_message","assistant_message","tool_call","tool_result","thinking","error"].includes(t)?t:"assistant_message"}emptySession(){return{tool:"rulemetric_mcp",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};function Bt(e){try{return JSON.parse(e)}catch{return e}}l(Bt,"safeJsonParse");function tt(e,t){return Array.isArray(e)?e.filter(n=>n.type&&t.includes(n.type)).map(n=>n.text??"").filter(Boolean).join(`
3
-
4
- `):""}l(tt,"textFromBlocks");function Ft(e){if(!e)return null;let t=e.cached_input_tokens??0,n=Math.max(0,(e.input_tokens??0)-t),o=(e.output_tokens??0)+(e.reasoning_output_tokens??0);return n===0&&o===0&&t===0?null:{input:n,output:o,cacheRead:t,cacheWrite:0}}l(Ft,"tokenUsageFromCodex");function Ht(e){if(!e)return new Date().toISOString();let t=new Date(e);return Number.isFinite(t.getTime())?t.toISOString():new Date().toISOString()}l(Ht,"normalizeTimestamp");function et(){return{sequence:0,model:null,prevCumulativeTotal:0,callNames:{}}}l(et,"freshCodexState");var b=class{static{l(this,"CodexAdapter")}tool="codex";parse(t){let n=et(),{events:o,projectPath:s,gitBranch:r,metadata:i}=this.parseLines(t,n),u=o.map(p=>p.timestamp).sort(),a=new Date().toISOString();return{tool:"codex",projectPath:s,gitBranch:r,startedAt:u[0]??a,endedAt:u[u.length-1]??null,events:o,metadata:i}}parseAppend(t,n){let o={...n,callNames:{...n.callNames}},{events:s}=this.parseLines(t,o);return{events:s,state:o}}parseLines(t,n){let o=t.split(`
5
- `).filter(m=>m.trim()),s=[],r={},i=n.callNames,u=null,a=null,p=null;for(let m of o){let f;try{f=JSON.parse(m)}catch{continue}let d=f.payload;if(!d)continue;let g=Ht(f.timestamp);if(f.type==="session_meta"){p=d.session_id??d.id??p,u=d.cwd??u,d.git_branch&&(a=d.git_branch),d.model&&(n.model=d.model),r.sessionId=p,r.codexSessionId=p,r.originator=d.originator,r.source=d.source,r.modelProvider=d.model_provider,r.codexCliVersion=d.cli_version;continue}if(f.type==="turn_context"){u=d.cwd??u,d.model&&(n.model=d.model,r.model=d.model);continue}if(f.type==="response_item"&&d.type==="message"){if(d.role==="user"){let c=tt(d.content,["input_text"]);if(!c)continue;s.push({sequence:n.sequence++,eventType:"user_message",content:c,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:g,metadata:{}})}else if(d.role==="assistant"){let c=tt(d.content,["output_text"]);if(!c)continue;s.push({sequence:n.sequence++,eventType:"assistant_message",content:c,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:n.model,timestamp:g,metadata:n.model?{model:n.model}:{}})}continue}if(f.type==="response_item"&&d.type==="function_call"){let c=d.name??"unknown";d.call_id&&(i[d.call_id]=c);let y=typeof d.arguments=="string"?Bt(d.arguments):{};s.push({sequence:n.sequence++,eventType:"tool_call",content:null,toolName:c,toolInput:y&&typeof y=="object"&&!Array.isArray(y)?y:{arguments:y},toolOutput:null,tokenUsage:null,model:n.model,timestamp:g,metadata:{callId:d.call_id}});continue}if(f.type==="response_item"&&d.type==="function_call_output"){let c=d.call_id?i[d.call_id]??null:null;s.push({sequence:n.sequence++,eventType:"tool_result",content:d.output??null,toolName:c,toolInput:null,toolOutput:d.output==null?null:{output:d.output},tokenUsage:null,model:n.model,timestamp:g,metadata:{callId:d.call_id}});continue}if(f.type==="event_msg"&&d.type==="token_count"){let c=d.info,y=c?.total_token_usage?.total_tokens??0;if(y>0&&y===n.prevCumulativeTotal)continue;y>0&&(n.prevCumulativeTotal=y);let h=Ft(c?.last_token_usage??c?.total_token_usage);if(!h)continue;let _=c?.model??c?.model_name??n.model;s.push({sequence:n.sequence++,eventType:"assistant_response",content:null,toolName:null,toolInput:null,toolOutput:null,tokenUsage:h,model:_??null,timestamp:g,metadata:{codexEventType:"token_count",..._?{model:_}:{},reasoningOutputTokens:c?.last_token_usage?.reasoning_output_tokens??0,usage:{input_tokens:h.input,output_tokens:h.output,cache_read_input_tokens:h.cacheRead??0,cache_creation_input_tokens:h.cacheWrite??0}}})}}return{events:s,projectPath:u,gitBranch:a,sessionId:p,metadata:r}}};function nt(e,t){let n=e??(typeof t=="number"?new Date(t).toISOString():""),o=new Date(n);return Number.isFinite(o.getTime())?o.toISOString():new Date().toISOString()}l(nt,"timestamp");function st(e){return Array.isArray(e.content)?e.content:[]}l(st,"blocks");function ot(e){return typeof e.content=="string"?e.content:st(e).filter(t=>t.type==="text").map(t=>t.text??"").filter(Boolean).join(`
6
-
7
- `)}l(ot,"messageText");function Wt(e){if(!e)return null;let t={input:Math.max(0,e.input??0),output:Math.max(0,e.output??0),cacheRead:Math.max(0,e.cacheRead??0),cacheWrite:Math.max(0,e.cacheWrite??0)};return Object.values(t).some(n=>n>0)?t:null}l(Wt,"usageOf");var E=class{static{l(this,"PiAdapter")}tool="pi";parse(t){let n=[],o={},s=null,r=null,i=null,u=null,a=l(f=>{n.push({sequence:n.length,...f})},"push");for(let f of t.split(`
8
- `)){if(!f.trim())continue;let d;try{d=JSON.parse(f)}catch{continue}if(d.type==="session"){r||(r=nt(d.timestamp)),s=d.cwd??s,o.sessionId=d.id,o.piSessionId=d.id,o.sessionVersion=d.version;continue}if(d.type==="model_change"){i=d.provider??i,u=d.modelId??u,i&&(o.provider=i),u&&(o.model=u);continue}if(d.type!=="message"||!d.message)continue;let g=d.message,c=nt(d.timestamp,g.timestamp);if(i=g.provider??i,u=g.model??u,i&&(o.provider=i),u&&(o.model=u),g.role==="user"){let h=ot(g);if(!h)continue;a({eventType:"user_message",content:h,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:c,metadata:{}});continue}if(g.role==="toolResult"){let h=ot(g);a({eventType:"tool_result",content:h||null,toolName:g.toolName??null,toolInput:null,toolOutput:{content:h,details:g.details??null,isError:g.isError??!1},tokenUsage:null,model:u,timestamp:c,metadata:{toolCallId:g.toolCallId,isError:g.isError??!1}});continue}if(g.role!=="assistant")continue;if(g.stopReason==="error"||g.stopReason==="aborted"){a({eventType:"error",content:g.errorMessage??`Pi stopped with ${g.stopReason}`,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:u,timestamp:c,metadata:{provider:i,stopReason:g.stopReason}});continue}for(let h of st(g))h.type==="thinking"&&h.thinking?a({eventType:"thinking",content:h.thinking,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:u,timestamp:c,metadata:{provider:i}}):h.type==="text"&&h.text?a({eventType:"assistant_message",content:h.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:u,timestamp:c,metadata:{provider:i}}):h.type==="toolCall"&&h.name&&a({eventType:"tool_call",content:null,toolName:h.name,toolInput:h.arguments??{},toolOutput:null,tokenUsage:null,model:u,timestamp:c,metadata:{provider:i,toolCallId:h.id}});let y=Wt(g.usage);y&&a({eventType:"assistant_response",content:null,toolName:null,toolInput:null,toolOutput:null,tokenUsage:y,model:u,timestamp:c,metadata:{piEventType:"assistant_usage",provider:i,responseId:g.responseId,stopReason:g.stopReason,costUsd:g.usage?.cost?.total,usage:{input_tokens:y.input,output_tokens:y.output,cache_read_input_tokens:y.cacheRead??0,cache_creation_input_tokens:y.cacheWrite??0}}})}let p=n.map(f=>f.timestamp).sort(),m=new Date().toISOString();return{tool:"pi",projectPath:s,gitBranch:null,startedAt:r??p[0]??m,endedAt:p[p.length-1]??null,events:n,metadata:o}}};var zt={claude_code:l(()=>new C,"claude_code"),cursor:l(()=>new A,"cursor"),vscode_copilot:l(()=>new N,"vscode_copilot"),copilot_agent:l(()=>new P,"copilot_agent"),rulemetric_mcp:l(()=>new D,"rulemetric_mcp"),codex:l(()=>new b,"codex"),pi:l(()=>new E,"pi")};function Kt(e){let t=zt[e];if(!t)throw new Error(`Unknown session tool: ${e}`);return t()}l(Kt,"getAdapter");function Vt(e){let t=e.trim();if(t.startsWith("{")){let n=t.split(`
9
- `)[0],o=null;try{o=JSON.parse(n)}catch{try{o=JSON.parse(t)}catch{}}if(o){if(o.type==="user"||o.type==="assistant")return"claude_code";if(o.type==="session"&&typeof o.id=="string"&&typeof o.cwd=="string"&&typeof o.version=="number")return"pi";if(Array.isArray(o.events)&&!o.requests&&!o.allComposers)return"rulemetric_mcp";if(Array.isArray(o.requests))return o.requests.some(r=>Array.isArray(r.toolCalls))||o.agentMode?"copilot_agent":"vscode_copilot";if(o.allComposers)return"cursor"}if(!o)try{let s=t.split(`
10
- `).filter(r=>r.trim());if(s.length>1){let r=JSON.parse(s[0]);if(r.type==="user"||r.type==="assistant")return"claude_code"}}catch{}}return null}l(Vt,"detectTool");import{readdir as H,stat as W}from"fs/promises";import{basename as Xt,join as w}from"path";import{homedir as R}from"os";var Yt={"claude-opus-4-7":"Opus 4.7","claude-opus-4-6":"Opus 4.6","claude-opus-4-5":"Opus 4.5","claude-opus-4-1":"Opus 4.1","claude-opus-4":"Opus 4","claude-sonnet-4-6":"Sonnet 4.6","claude-sonnet-4-5":"Sonnet 4.5","claude-sonnet-4":"Sonnet 4","claude-3-7-sonnet":"Sonnet 3.7","claude-3-5-sonnet":"Sonnet 3.5","claude-haiku-4-5":"Haiku 4.5","claude-3-5-haiku":"Haiku 3.5"};function Zt(){return process.env.CLAUDE_CONFIG_DIR||w(R(),".claude")}l(Zt,"getClaudeDir");function Qt(){return w(Zt(),"projects")}l(Qt,"getProjectsDir");function te(){return process.platform==="darwin"?w(R(),"Library","Application Support","Claude","local-agent-mode-sessions"):process.platform==="win32"?w(R(),"AppData","Roaming","Claude","local-agent-mode-sessions"):w(R(),".config","Claude","local-agent-mode-sessions")}l(te,"getDesktopSessionsDir");async function ee(e){let t=[];async function n(o,s){if(s>8)return;let r=await H(o).catch(()=>[]);for(let i of r){if(i==="node_modules"||i===".git")continue;let u=w(o,i);if((await W(u).catch(()=>null))?.isDirectory())if(i==="projects"){let p=await H(u).catch(()=>[]);for(let m of p){let f=w(u,m);(await W(f).catch(()=>null))?.isDirectory()&&t.push(f)}}else await n(u,s+1)}}return l(n,"walk"),await n(e,0),t}l(ee,"findDesktopProjectDirs");var rt={name:"claude",displayName:"Claude Code",modelDisplayName(e){let t=e.replace(/@.*$/,"").replace(/-\d{8}$/,"");for(let[n,o]of Object.entries(Yt))if(t.startsWith(n))return o;return t},toolDisplayName(e){return e},async discoverSessions(){let e=[],t=Qt();try{let o=await H(t);for(let s of o){let r=w(t,s);(await W(r).catch(()=>null))?.isDirectory()&&e.push({path:r,project:s,provider:"claude"})}}catch{}let n=await ee(te());for(let o of n)e.push({path:o,project:Xt(o),provider:"claude"});return e},createSessionParser(){return{async*parse(){}}}};import{readdir as $,readFile as at,stat as ne}from"fs/promises";import{basename as oe,join as O}from"path";import{homedir as se}from"os";var re={"gpt-5.3-codex":"GPT-5.3 Codex","gpt-5.4-mini":"GPT-5.4 Mini","gpt-5.4":"GPT-5.4","gpt-5":"GPT-5","gpt-4o-mini":"GPT-4o Mini","gpt-4o":"GPT-4o"},it={exec_command:"Bash",read_file:"Read",write_file:"Edit",apply_diff:"Edit",apply_patch:"Edit",spawn_agent:"Agent",close_agent:"Agent",wait_agent:"Agent",read_dir:"Glob"};function ae(){return process.env.CODEX_HOME??O(se(),".codex")}l(ae,"getCodexDir");function ie(e){return e.replace(/^\//,"").replace(/\//g,"-")}l(ie,"sanitizeProject");async function le(e){try{let n=(await at(e,"utf-8")).split(`
11
- `)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}l(le,"readFirstLine");async function ce(e){let t=await le(e);if(!t)return{valid:!1};let n=t.type==="session_meta"&&typeof t.payload?.originator=="string"&&t.payload.originator.toLowerCase().startsWith("codex");return{valid:n,meta:n?t:void 0}}l(ce,"isValidCodexSession");async function ue(e){let t=O(e,"sessions"),n=[],o;try{o=await $(t)}catch{return n}for(let s of o){if(!/^\d{4}$/.test(s))continue;let r=O(t,s),i=await $(r).catch(()=>[]);for(let u of i){if(!/^\d{2}$/.test(u))continue;let a=O(r,u),p=await $(a).catch(()=>[]);for(let m of p){if(!/^\d{2}$/.test(m))continue;let f=O(a,m),d=await $(f).catch(()=>[]);for(let g of d){if(!g.startsWith("rollout-")||!g.endsWith(".jsonl"))continue;let c=O(f,g);if(!(await ne(c).catch(()=>null))?.isFile())continue;let{valid:h,meta:_}=await ce(c);if(!h||!_)continue;let I=_.payload?.cwd??"unknown";n.push({path:c,project:ie(I),provider:"codex"})}}}}return n}l(ue,"discoverSessionsInDir");function pe(e,t){return e?.info?.model??e?.info?.model_name??t??"gpt-5"}l(pe,"resolveModel");function de(e,t){return{async*parse(){let n;try{n=await at(e.path,"utf-8")}catch{return}let o=n.split(`
12
- `).filter(g=>g.trim()),s,r="",i=0,u=0,a=0,p=0,m=0,f=[],d="";for(let g of o){let c;try{c=JSON.parse(g)}catch{continue}if(c.type==="session_meta"){r=c.payload?.session_id??oe(e.path,".jsonl"),s=c.payload?.model;continue}if(c.type==="response_item"&&c.payload?.type==="function_call"){let y=c.payload.name??"";f.push(it[y]??y);continue}if(c.type==="response_item"&&c.payload?.type==="message"&&c.payload?.role==="user"){let y=(c.payload.content??[]).filter(h=>h.type==="input_text").map(h=>h.text??"").filter(Boolean);y.length>0&&(d=y.join(" "));continue}if(c.type==="event_msg"&&c.payload?.type==="token_count"){let y=c.payload.info;if(!y)continue;let h=y.total_token_usage?.total_tokens??0;if(h>0&&h===i)continue;i=h;let _=y.last_token_usage,I=0,T=0,x=0,S=0;if(_)I=_.input_tokens??0,T=_.cached_input_tokens??0,x=_.output_tokens??0,S=_.reasoning_output_tokens??0;else if(h>0){let v=y.total_token_usage;if(!v)continue;I=(v.input_tokens??0)-u,T=(v.cached_input_tokens??0)-a,x=(v.output_tokens??0)-p,S=(v.reasoning_output_tokens??0)-m}if(!_){let v=y.total_token_usage;v&&(u=v.input_tokens??0,a=v.cached_input_tokens??0,p=v.output_tokens??0,m=v.reasoning_output_tokens??0)}if(I+T+x+S===0)continue;let Mt=Math.max(0,I-T),qt=pe(c.payload,s),Q=c.timestamp??"",F=`codex:${e.path}:${Q}:${h}`;if(t.has(F))continue;t.add(F),yield{provider:"codex",model:qt,inputTokens:Mt,outputTokens:x,cacheCreationInputTokens:0,cacheReadInputTokens:T,cachedInputTokens:T,reasoningTokens:S,costUSD:0,tools:f,bashCommands:[],timestamp:Q,speed:"standard",deduplicationKey:F,userMessage:d,sessionId:r},f=[],d=""}}}}}l(de,"createParser");var lt={name:"codex",displayName:"Codex",modelDisplayName(e){for(let[t,n]of Object.entries(re))if(e.startsWith(t))return n;return e},toolDisplayName(e){return it[e]??e},async discoverSessions(){return ue(ae())},createSessionParser(e,t){return de(e,t)}};import{readdir as me,readFile as ct,stat as fe}from"fs/promises";import{basename as ut,dirname as he,join as z}from"path";import{homedir as ge}from"os";var ye={"gpt-4.1-nano":"GPT-4.1 Nano","gpt-4.1-mini":"GPT-4.1 Mini","gpt-4.1":"GPT-4.1","gpt-4o-mini":"GPT-4o Mini","gpt-4o":"GPT-4o","gpt-5-mini":"GPT-5 Mini","gpt-5":"GPT-5","claude-sonnet-4-5":"Sonnet 4.5","claude-sonnet-4":"Sonnet 4","claude-3-7-sonnet":"Sonnet 3.7","claude-3-5-sonnet":"Sonnet 3.5","o4-mini":"o4-mini",o3:"o3"},pt={bash:"Bash",read_file:"Read",write_file:"Edit",edit_file:"Edit",create_file:"Write",delete_file:"Delete",search_files:"Grep",find_files:"Glob",list_directory:"LS",web_search:"WebSearch",fetch_webpage:"WebFetch",github_repo:"GitHub"},_e=Object.entries(ye).sort((e,t)=>t[0].length-e[0].length);function Se(){return z(ge(),".copilot","session-state")}l(Se,"getCopilotSessionStateDir");function Te(e){let t=e.match(/^cwd:\s*(.+)$/m);return t?.[1]&&t[1].replace(/\s*#.*$/,"").replace(/^['"]|['"]$/g,"").trim()||null}l(Te,"parseCwd");function Ie(e,t){return{async*parse(){let n;try{n=await ct(e.path,"utf-8")}catch{return}let o=ut(he(e.path)),s=n.split(`
13
- `).filter(u=>u.trim()),r="",i="";for(let u of s){let a;try{a=JSON.parse(u)}catch{continue}if(a.type==="session.model_change"){r=a.data.newModel??r;continue}if(a.type==="user.message"){i=a.data.content??"";continue}if(a.type==="assistant.message"){let{messageId:p,outputTokens:m,toolRequests:f=[]}=a.data;if(m===0||!r)continue;let d=`copilot:${o}:${p}`;if(t.has(d))continue;t.add(d);let g=f.map(c=>c.name??"").filter(Boolean).map(c=>pt[c]??c);yield{provider:"copilot",model:r,inputTokens:0,outputTokens:m,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:g,bashCommands:[],timestamp:a.timestamp??"",speed:"standard",deduplicationKey:d,userMessage:i,sessionId:o},i=""}}}}}l(Ie,"createParser");async function ve(e){let t=[],n;try{n=await me(e)}catch{return t}for(let o of n){let s=z(e,o,"events.jsonl");if(!(await fe(s).catch(()=>null))?.isFile())continue;let i=o;try{let u=await ct(z(e,o,"workspace.yaml"),"utf-8"),a=Te(u);a&&(i=ut(a))}catch{}t.push({path:s,project:i,provider:"copilot"})}return t}l(ve,"discoverSessionsInDir");var dt={name:"copilot",displayName:"GitHub Copilot",modelDisplayName(e){for(let[t,n]of _e)if(e===t||e.startsWith(t+"-"))return n;return e},toolDisplayName(e){return pt[e]??e},async discoverSessions(){return ve(Se())},createSessionParser(e,t){return Ie(e,t)}};import{readdir as mt,readFile as ht,stat as ft}from"fs/promises";import{basename as gt,join as K}from"path";import{homedir as xe}from"os";var we={"gpt-5.4":"GPT-5.4","gpt-5.4-mini":"GPT-5.4 Mini","gpt-5":"GPT-5","gpt-4o":"GPT-4o","gpt-4o-mini":"GPT-4o Mini"},yt={bash:"Bash",read:"Read",edit:"Edit",write:"Write",glob:"Glob",grep:"Grep",task:"Agent",dispatch_agent:"Agent",fetch:"WebFetch",search:"WebSearch",todo:"TodoWrite",patch:"Patch"},ke=Object.entries(we).sort((e,t)=>t[0].length-e[0].length);function Oe(){return K(xe(),".pi","agent","sessions")}l(Oe,"getPiSessionsDir");async function Ce(e){try{let n=(await ht(e,"utf-8")).split(`
14
- `)[0];return n?.trim()?JSON.parse(n):null}catch{return null}}l(Ce,"readFirstEntry");function Ae(e){return e.split(/[;&|]+/).map(t=>t.trim().split(/\s+/)[0]).filter(Boolean)}l(Ae,"extractBashCommands");async function Ne(e){let t=[],n;try{n=await mt(e)}catch{return t}for(let o of n){let s=K(e,o);if(!(await ft(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await mt(s)}catch{continue}for(let u of i){if(!u.endsWith(".jsonl"))continue;let a=K(s,u);if(!(await ft(a).catch(()=>null))?.isFile())continue;let m=await Ce(a);if(!m||m.type!=="session")continue;let f=m.cwd??o;t.push({path:a,project:gt(f),provider:"pi"})}}return t}l(Ne,"discoverSessionsInDir");function Pe(e,t){return{async*parse(){let n;try{n=await ht(e.path,"utf-8")}catch{return}let o=n.split(`
15
- `).filter(i=>i.trim()),s=gt(e.path,".jsonl"),r="";for(let[i,u]of o.entries()){let a;try{a=JSON.parse(u)}catch{continue}if(a.type==="session"){s=a.id??s;continue}if(a.type!=="message")continue;let p=a.message;if(!p)continue;if(p.role==="user"){let S=(p.content??[]).filter(k=>k.type==="text").map(k=>k.text??"").filter(Boolean);S.length>0&&(r=S.join(" "));continue}if(p.role!=="assistant"||!p.usage)continue;let{input:m,output:f,cacheRead:d,cacheWrite:g}=p.usage;if(m===0&&f===0)continue;let c=p.model??"gpt-5",y=p.responseId??"",h=`pi:${e.path}:${y||a.id||a.timestamp||String(i)}`;if(t.has(h))continue;t.add(h);let _=(p.content??[]).filter(S=>S.type==="toolCall"&&S.name),I=_.map(S=>yt[S.name]??S.name),T=_.filter(S=>S.name==="bash").flatMap(S=>{let k=S.arguments?.command;return typeof k=="string"?Ae(k):[]}),x=a.timestamp??"";yield{provider:"pi",model:c,inputTokens:m,outputTokens:f,cacheCreationInputTokens:g,cacheReadInputTokens:d,cachedInputTokens:d,reasoningTokens:0,costUSD:0,tools:I,bashCommands:T,timestamp:x,speed:"standard",deduplicationKey:h,userMessage:r,sessionId:s},r=""}}}}l(Pe,"createParser");var _t={name:"pi",displayName:"Pi",modelDisplayName(e){for(let[t,n]of ke)if(e.startsWith(t))return n;return e},toolDisplayName(e){return yt[e]??e},async discoverSessions(){return Ne(Oe())},createSessionParser(e,t){return Pe(e,t)}};var xt=[rt,lt,dt,_t],St=null,Tt=!1;async function wt(){if(Tt)return St;Tt=!0;try{let{cursor:e}=await import("./cursor-T7AMCMKS.js");return St=e,e}catch{return null}}l(wt,"loadCursor");var It=null,vt=!1;async function kt(){if(vt)return It;vt=!0;try{let{opencode:e}=await import("./opencode-QRJ3BH23.js");return It=e,e}catch{return null}}l(kt,"loadOpenCode");async function Ot(){let[e,t]=await Promise.all([wt(),kt()]),n=[...xt];return e&&n.push(e),t&&n.push(t),n}l(Ot,"getAllProviders");async function De(e){let t=await Ot(),n=e&&e!=="all"?t.filter(s=>s.name===e):t,o=[];for(let s of n){let r=await s.discoverSessions();o.push(...r)}return o}l(De,"discoverAllSessions");async function be(e){return e==="cursor"?await wt()??void 0:e==="opencode"?await kt()??void 0:xt.find(t=>t.name===e)}l(be,"getProvider");import{spawn as Z}from"node:child_process";import{randomUUID as Ue}from"node:crypto";import{writeFile as At}from"node:fs/promises";import{tmpdir as Nt}from"node:os";import{join as Pt}from"node:path";import{spawn as Ee}from"node:child_process";function V(e){return`rm-${e.trim().replace(/[^A-Za-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"session"}`}l(V,"sanitizeTmuxName");function X(e){let t=[...e.runId?[`RULEMETRIC_RUN_ID=${e.runId}`]:[],...e.scopedConfirmation?[`RULEMETRIC_SCOPED_CONFIRMATION_ID=${e.scopedConfirmation.id}`,`RULEMETRIC_SCOPED_TASK_ID=${e.scopedConfirmation.taskId}`,`RULEMETRIC_SCOPED_CONFIGURATION_HASH=${e.scopedConfirmation.configurationHash}`]:[]],n=t.length?["env",...t,"claude"]:["claude"];return e.resumeSessionId&&n.push("--resume",e.resumeSessionId),e.model&&n.push("--model",e.model),["new-session","-d","-s",e.sessionName,"-c",e.projectPath,"--",...n]}l(X,"buildTmuxLaunchArgs");function U(e,t,n={}){return n.literal===!1?["send-keys","-t",e,t]:["send-keys","-t",e,"-l","--",t]}l(U,"buildTmuxSendKeysArgs");function Re(e){return["has-session","-t",e]}l(Re,"buildTmuxHasSessionArgs");function j(e){return`tmux attach -t ${e}`}l(j,"buildTmuxAttachCommand");function $e(){let e=["/opt/homebrew/bin","/usr/local/bin"],t=(process.env.PATH??"").split(":").filter(Boolean),n=e.filter(o=>!t.includes(o));return n.length===0?process.env:{...process.env,PATH:[...t,...n].join(":")}}l($e,"tmuxSpawnEnv");function Y(e){return new Promise(t=>{let n=Ee("tmux",e,{stdio:["ignore","ignore","pipe"],env:$e()}),o="";n.stderr.on("data",s=>{o+=s.toString()}),n.on("close",s=>t({code:s,stderr:o})),n.on("error",s=>t({code:null,stderr:s.message}))})}l(Y,"runTmux");async function Ct(){return(await Y(["-V"])).code===0}l(Ct,"isTmuxAvailable");var Dt=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,je=/^[a-f0-9]{64}$/;function Me(e){if(e){if(Dt.test(e.id)&&je.test(e.configurationHash)&&e.taskId.length>0&&e.taskId.length<=500)return e;console.warn("[claude-code-launcher] dropping invalid scoped confirmation identity")}}l(Me,"validateScopedConfirmation");function qe(e){if(e!==void 0){if(Dt.test(e))return e;console.warn(`[claude-code-launcher] dropping non-uuid runId (RULEMETRIC_RUN_ID not injected): ${JSON.stringify(e)}`)}}l(qe,"validateRunId");function M(e){return`'${e.replace(/'/g,"'\\''")}'`}l(M,"shellSingleQuote");var q=class{static{l(this,"ClaudeCodeLauncher")}options;tool="claude_code";constructor(t={}){this.options=t}capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Ue(),o={...t,runId:qe(t.runId),scopedConfirmation:Me(t.scopedConfirmation)};return o.mode==="headless"?this.launchHeadless(o,n):this.launchInteractive(o,n)}async launchHeadless(t,n){let o=["-p",t.prompt??"","--output-format","json"];t.scopedConfirmation&&o.push("--session-id",n,"--tools","Read,Write,Edit,Bash"),t.systemPrompt&&o.push("--system-prompt",t.systemPrompt),t.model&&o.push("--model",t.model);let s={...process.env};return delete s.CLAUDECODE,delete s.HTTPS_PROXY,t.runId&&(s.RULEMETRIC_RUN_ID=t.runId),t.scopedConfirmation&&(s.RULEMETRIC_SCOPED_CONFIRMATION_ID=t.scopedConfirmation.id,s.RULEMETRIC_SCOPED_TASK_ID=t.scopedConfirmation.taskId,s.RULEMETRIC_SCOPED_CONFIGURATION_HASH=t.scopedConfirmation.configurationHash),new Promise(r=>{let i=Z("claude",o,{cwd:t.projectPath,env:s,stdio:["ignore","pipe","pipe"]}),u="",a="";i.stdout.on("data",m=>{u+=m.toString()}),i.stderr.on("data",m=>{a+=m.toString()});let p=t.timeout?setTimeout(()=>{i.kill("SIGTERM")},t.timeout):null;i.on("close",m=>{p&&clearTimeout(p);let f=u;try{let d=JSON.parse(u);f=d.result??d.content??u}catch{}r({sessionId:n,pid:i.pid,exitCode:m,output:f,error:m!==0?a:void 0})}),i.on("error",m=>{p&&clearTimeout(p),r({sessionId:n,error:`Failed to spawn claude: ${m.message}`})})})}async launchInteractive(t,n){return await(this.options.tmuxAvailable??Ct)().catch(()=>!1)?this.launchInteractiveTmux(t,n):this.launchInteractiveTerminal(t,n,"tmux_not_found")}async launchInteractiveTmux(t,n){let o=this.options.runTmux??Y,s=V(`claude-${t.resumeSessionId??n}`),r=await o(X({sessionName:s,projectPath:t.projectPath,resumeSessionId:t.resumeSessionId,model:t.model,runId:t.runId,scopedConfirmation:t.scopedConfirmation}));if(r.code!==0)return this.launchInteractiveTerminal(t,n,"tmux_launch_failed",`tmux new-session exited ${r.code}: ${r.stderr.trim()||"no stderr"}`);let i=await this.openTerminalAttach(s,n);if(t.prompt){let u=await o(U(s,t.prompt));if(u.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send-keys exited ${u.code}: ${u.stderr.trim()||"no stderr"}`};let a=await o(U(s,"Enter",{literal:!1}));if(a.code!==0)return{sessionId:n,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send Enter exited ${a.code}: ${a.stderr.trim()||"no stderr"}`}}return{sessionId:n,pid:i.pid,liveSendAvailable:!0,...i.error?{error:i.error}:{},terminalTarget:{kind:"tmux",target:s,attachCommand:j(s),live:!0}}}async openTerminalAttach(t,n){let o=Pt(Nt(),`rulemetric-attach-${n}.command`),s=`#!/bin/zsh
16
- rm -- "$0"
17
- ${j(t)}
18
- `;return await At(o,s,{mode:493}),new Promise(r=>{let i=Z("open",["-a","Terminal",o],{stdio:["ignore","pipe","pipe"]}),u="";i.stderr.on("data",a=>{u+=a.toString()}),i.on("close",a=>{r(a===0?{pid:i.pid}:{pid:i.pid,error:`open attach exited ${a}: ${u.trim()||"no stderr"}`})}),i.on("error",a=>{r({error:`Failed to spawn open attach: ${a.message}`})})})}async launchInteractiveTerminal(t,n,o,s){let r=["claude"];t.resumeSessionId?r.push("--resume",t.resumeSessionId):t.prompt&&r.push("-p",JSON.stringify(t.prompt)),t.model&&r.push("--model",t.model);let i=r.join(" "),u=Pt(Nt(),`rulemetric-launch-${n}.command`),a=t.runId?`export RULEMETRIC_RUN_ID=${M(t.runId)}
19
- `:"",p=t.scopedConfirmation?`export RULEMETRIC_SCOPED_CONFIRMATION_ID=${M(t.scopedConfirmation.id)}
20
- export RULEMETRIC_SCOPED_TASK_ID=${M(t.scopedConfirmation.taskId)}
21
- export RULEMETRIC_SCOPED_CONFIGURATION_HASH=${M(t.scopedConfirmation.configurationHash)}
22
- `:"",m=`#!/bin/zsh
23
- rm -- "$0"
24
- cd ${JSON.stringify(t.projectPath)} || exit
25
- `+a+p+`${i}
26
- `;return await At(u,m,{mode:493}),new Promise(f=>{let d=Z("open",["-a","Terminal",u],{stdio:["ignore","pipe","pipe"]}),g="";d.stderr.on("data",c=>{g+=c.toString()}),d.on("close",c=>{if(c===0)f({sessionId:n,pid:d.pid,liveSendAvailable:!1,fallbackReason:o,...s?{error:s}:{}});else{let y=g.trim()||"no stderr";f({sessionId:n,pid:d.pid,liveSendAvailable:!1,fallbackReason:o,error:s?`${s}; open exited ${c}: ${y}`:`open exited ${c}: ${y}`})}}),d.on("error",c=>{f({sessionId:n,liveSendAvailable:!1,fallbackReason:o,error:`Failed to spawn open: ${c.message}`})})})}};import{spawn as bt}from"node:child_process";import{randomUUID as Le}from"node:crypto";var L=class{static{l(this,"CodexLauncher")}tool="codex";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Le();return t.mode==="headless"?this.launchHeadless(t,n):this.launchInteractive(t,n)}launchHeadless(t,n){let o=["-q",t.prompt??""];return t.model&&o.push("--model",t.model),new Promise(s=>{let r=bt("codex",o,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",u="";r.stdout.on("data",p=>{i+=p.toString()}),r.stderr.on("data",p=>{u+=p.toString()});let a=t.timeout?setTimeout(()=>{r.kill("SIGTERM")},t.timeout):null;r.on("close",p=>{a&&clearTimeout(a),s({sessionId:n,pid:r.pid,exitCode:p,output:i,error:p!==0?u:void 0})}),r.on("error",p=>{a&&clearTimeout(a),s({sessionId:n,error:`Failed to spawn codex: ${p.message}`})})})}launchInteractive(t,n){let o=["codex"];t.prompt&&o.push(JSON.stringify(t.prompt));let s=`cd ${JSON.stringify(t.projectPath)} && ${o.join(" ")}`,r=bt("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(s)}`],{stdio:"ignore",detached:!0});return r.unref(),Promise.resolve({sessionId:n,pid:r.pid})}};import{spawn as Et}from"node:child_process";import{randomUUID as Je}from"node:crypto";function Ge(e){let t=e.mode==="headless"?["--print","--mode","json","--no-session"]:[];return e.systemPrompt&&t.push("--system-prompt",e.systemPrompt),e.model&&t.push("--model",e.model),e.prompt&&t.push(e.prompt),t}l(Ge,"buildPiLaunchArgs");function Be(e){let t;for(let o of e.split(`
27
- `))if(o.trim())try{let s=JSON.parse(o);if(s.type!=="agent_end"||!Array.isArray(s.messages))continue;t=s.messages.filter(r=>r.role==="assistant").at(-1)}catch{}if(!t)return{output:e};if(t.stopReason==="error"||t.stopReason==="aborted")return{output:"",error:`Pi provider error: ${t.errorMessage??t.stopReason}`};let n=t.content?.filter(o=>o.type==="text"&&typeof o.text=="string").map(o=>o.text).join(`
28
- `)??"";return n?{output:n}:{output:e}}l(Be,"parsePiLaunchOutput");var J=class{static{l(this,"PiLauncher")}tool="pi";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Je(),o=Ge(t);if(t.mode==="interactive"){let s=["pi",...o].map(u=>JSON.stringify(u)).join(" "),r=`cd ${JSON.stringify(t.projectPath)} && ${s}`,i=Et("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(r)}`],{stdio:"ignore",detached:!0});return i.unref(),{sessionId:n,pid:i.pid}}return new Promise(s=>{let r=Et("pi",o,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",u="";r.stdout.on("data",p=>{i+=p.toString()}),r.stderr.on("data",p=>{u+=p.toString()});let a=t.timeout?setTimeout(()=>r.kill("SIGTERM"),t.timeout):null;r.on("close",p=>{a&&clearTimeout(a);let m=Be(i);s({sessionId:n,pid:r.pid,exitCode:p,output:m.output,error:m.error??(p!==0?u.trim()||i.trim()||`pi exited ${p}`:void 0)})}),r.on("error",p=>{a&&clearTimeout(a),s({sessionId:n,error:`Failed to spawn pi: ${p.message}`})})})}};import{spawn as Rt}from"node:child_process";import{randomUUID as Fe}from"node:crypto";var G=class{static{l(this,"AiderLauncher")}tool="aider";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(t){let n=Fe();return t.mode==="headless"?this.launchHeadless(t,n):this.launchInteractive(t,n)}launchHeadless(t,n){let o=["--message",t.prompt??"","--yes"];return t.model&&o.push("--model",t.model),new Promise(s=>{let r=Rt("aider",o,{cwd:t.projectPath,stdio:["ignore","pipe","pipe"]}),i="",u="";r.stdout.on("data",p=>{i+=p.toString()}),r.stderr.on("data",p=>{u+=p.toString()});let a=t.timeout?setTimeout(()=>{r.kill("SIGTERM")},t.timeout):null;r.on("close",p=>{a&&clearTimeout(a),s({sessionId:n,pid:r.pid,exitCode:p,output:i,error:p!==0?u:void 0})}),r.on("error",p=>{a&&clearTimeout(a),s({sessionId:n,error:`Failed to spawn aider: ${p.message}`})})})}launchInteractive(t,n){let o=["aider"];t.model&&o.push("--model",t.model);let s=`cd ${JSON.stringify(t.projectPath)} && ${o.join(" ")}`,r=Rt("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(s)}`],{stdio:"ignore",detached:!0});return r.unref(),Promise.resolve({sessionId:n,pid:r.pid})}};import{spawn as He}from"node:child_process";import{randomUUID as We}from"node:crypto";var B=class{static{l(this,"GenericLauncher")}tool;constructor(t){this.tool=t}capabilities={headless:!1,interactive:!0,remoteSpawn:!1};async launch(t){let n=We();if(t.mode==="headless")return{sessionId:n,error:`${this.tool} does not support headless mode`};let o=`cd ${JSON.stringify(t.projectPath)} && echo "Session ${n} \u2014 tool: ${this.tool}" && exec $SHELL`,s=He("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(o)}`],{stdio:"ignore",detached:!0});return s.unref(),{sessionId:n,pid:s.pid}}};var $t={claude_code:l(()=>new q,"claude_code"),codex:l(()=>new L,"codex"),pi:l(()=>new J,"pi"),aider:l(()=>new G,"aider")};function ze(e){let t=$t[e];return t?t():new B(e)}l(ze,"getLauncher");function Ke(){return Object.entries($t).map(([e,t])=>({tool:e,capabilities:t().capabilities}))}l(Ke,"getAvailableLaunchers");import Ut from"node:path";function jt(e){return e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"")||"worktree"}l(jt,"sanitizeBranch");function Ve(e){return Ut.resolve(e.basePath??Ut.join(e.repoRoot,"..",".rulemetric-worktrees",jt(e.branch)))}l(Ve,"worktreePathFor");export{Xe as a,Ye as b,C as c,A as d,N as e,P as f,D as g,et as h,b as i,E as j,Kt as k,Vt as l,Ot as m,De as n,be as o,V as p,X as q,U as r,Re as s,j as t,ze as u,Ke as v,jt as w,Ve as x};
@@ -1 +0,0 @@
1
- import{b as R,c as $,f as s,g as I,i as w}from"./chunk-XXPWPKTD.js";import{c as re}from"./chunk-5TM7AOH2.js";import{b as te}from"./chunk-IEQDLURA.js";import{d as oe,e as se,f as ae}from"./chunk-KINIFUZQ.js";import{b as F}from"./chunk-U3YPVLM3.js";import{a as Y}from"./chunk-TQM7MF5C.js";import{a as q}from"./chunk-WOANSBMJ.js";import{a as U}from"./chunk-ZYGBABMZ.js";import{a as G}from"./chunk-GIQ2HK3W.js";import{a as W}from"./chunk-TTZWVZIW.js";import{c as N}from"./chunk-FZMO7XSN.js";import{a as O}from"./chunk-5A6TMSRO.js";import{a as V}from"./chunk-HYQ5YKBC.js";import{a as J}from"./chunk-KOORMTZO.js";import{b as L}from"./chunk-5RBLIVBF.js";import{a as Q}from"./chunk-Q7IDLOSP.js";import{a as x}from"./chunk-CZBO3A6B.js";import{a as ee}from"./chunk-USKRCVX3.js";import{a as X}from"./chunk-7YZURVZD.js";import{a as D}from"./chunk-PZS55PW2.js";import{a as ne}from"./chunk-QPAOX7P2.js";import{e as P}from"./chunk-EFEPD4AZ.js";import{b as K}from"./chunk-E4CIJ67Z.js";import{a as Z}from"./chunk-D4FP5M2B.js";import{a as z}from"./chunk-VUNJGZPP.js";import{a as j}from"./chunk-GGUXEZC3.js";import{b as C}from"./chunk-PIVEJTNF.js";import{k as B}from"./chunk-KGU2IW54.js";import{d as S}from"./chunk-GPBN4ROE.js";import{b as M,e as T,f as E}from"./chunk-GIXHG5FK.js";import{a as l}from"./chunk-ZLLER3HP.js";var H=null,h=null,ue={process_eval:V,process_suggestion_eval:W,process_insights:J,process_launch:F,process_send_message:U,process_conversation:O,process_session_goal:G,distill_memories:K,memory_ab:Y,process_run_cleanup:q,cron_refine_cases:ee,cron_retire_unused_skills:ne,cron_reconcile_attribution:x,cron_suggest_instructions:P,cron_refresh_skills:D,cron_refresh_pricing:X,cron_eval_autorun:z,cron_auto_accept_suggestions:Z,cron_instruction_training:j,cron_instruction_evolution:B,process_judge_review:Q,harbor_ab:N},ie=Object.keys(ue),pe=new Set([]);function ge(e=process.env){return e.DATABASE_URL?ie:ie.filter(t=>!pe.has(t))}l(ge,"availableCapabilities");var _e=3e4,fe=3e4,ve=3e4,le=500,de=1e4,ke=`thin-agent-${process.pid}`,A=null;function be(e,t,r,p){let d;try{let i=S();d={claude:i.claudeBin!=null,codex:i.codexBin!=null,pi:i.piBin!=null,codexModel:i.codexConfiguredModel}}catch{}let m;try{m=C()}catch{}let g=l(i=>E("/api/workers/heartbeat",{workerType:"cli-worker",clientName:ke,clientVersion:p,workerVersion:"0.1.0",currentJobId:null,inFlightCount:0,lastError:null,status:i,metadata:{capabilities:e,mode:"thin-agent",measurementProtocol:1,studyProtocol:1,scopedCollector:2,memorySnapshots:1,boundedAutorun:1,llmEngines:d,harborReady:m,machine:H?.summary()}}).then(c=>{let u=c?.advisory;u&&u.message!==A?(A=u.message,s(r,{event:"worker_advisory",code:u.code,message:u.message})):u||(A=null)}).catch(c=>{s(r,{event:"presence_heartbeat_error",error:c instanceof Error?c.message:String(c)})}),"send");g("alive");let f=setInterval(()=>g("alive"),ve),a=null,n=l(()=>a||(clearInterval(f),a=Promise.race([g("shutting_down"),new Promise(i=>setTimeout(i,2e3).unref())]),a),"sayGoodbye");return t.addEventListener("abort",()=>{n()},{once:!0}),{shutdown:n}}l(be,"startPresenceHeartbeat");async function we(e,t,r=S()){let p=[...r.claudeBin?["claude"]:[],...r.codexBin?["codex"]:[],...r.piBin?["pi"]:[]],d=`capabilities=${encodeURIComponent(e.join(","))}&waitMs=${t}&measurementProtocol=1&studyProtocol=1&scopedCollector=2&memorySnapshots=1&boundedAutorun=1&measurementEngines=${encodeURIComponent(p.join(","))}`,m=await T(`/api/work/next?${d}`);return m==null||typeof m=="string"?null:m}l(we,"pollForWork");function he(e,t){return{logger:{info:l(r=>t(r),"info"),warn:l(r=>t(r),"warn"),error:l(r=>t(r),"error")},job:{attempts:e}}}l(he,"makeHelpers");async function ye(e,t,r,p){let d=ue[e.kind],m=Date.now();if(s(r,{event:"claim",jobId:e.id,kind:e.kind,attempts:e.attempts}),!d){let n=`unknown kind: ${e.kind}`;s(r,{event:"fail",jobId:e.id,kind:e.kind,terminal:!0,error:n}),await E(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:n,terminal:!0}).catch(()=>{});return}let g=l(()=>{s(r,{event:"heartbeat",jobId:e.id}),w(`/api/work/${e.id}/heartbeat`,{leaseToken:e.leaseToken},{budgetMs:Math.min($,Math.max(0,t-1e3)),signal:p,log:r,event:"heartbeat",jobId:e.id}).then(n=>{n.ok||s(r,{event:"heartbeat_error",jobId:e.id,attempts:n.attempts,error:n.error instanceof Error?n.error.message:String(n.error)})})},"beat"),f=setInterval(g,t);h={jobId:e.id,beat:g};let a;try{let n=he(e.attempts,r);a={kind:"complete",result:await d(e.payload,n)??{}}}catch(n){let i=H?.pausesSince(m)??[],c=ae(i),u=n instanceof Error?n.message:String(n),v=L(n),o=!v&&se(i);a={kind:"fail",message:c?`${c}; ${u}`:u,pausedDuringJob:!!c,terminal:v,hostSuspended:o}}try{if(a.kind==="complete"){s(r,{event:"complete",jobId:e.id,kind:e.kind,durationMs:Date.now()-m});let n=await w(`/api/work/${e.id}/complete`,{leaseToken:e.leaseToken,result:a.result},{budgetMs:R,signal:p,log:r,event:"complete_post",jobId:e.id});n.ok||s(r,{event:"complete_post_error",jobId:e.id,kind:e.kind,attempts:n.attempts,error:n.error instanceof Error?n.error.message:String(n.error)})}else{s(r,{event:"fail",jobId:e.id,kind:e.kind,durationMs:Date.now()-m,terminal:a.terminal,error:a.message,...a.pausedDuringJob?{pausedDuringJob:!0}:{},...a.hostSuspended?{hostSuspended:!0}:{}});let n=await w(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:a.message,terminal:a.terminal,hostSuspended:a.hostSuspended},{budgetMs:R,signal:p,log:r,event:"fail_post",jobId:e.id});n.ok||s(r,{event:"fail_post_error",jobId:e.id,attempts:n.attempts,error:n.error instanceof Error?n.error.message:String(n.error)})}}finally{clearInterval(f),h=null}}l(ye,"runOne");var ce=new Set(["process_eval","process_suggestion_eval","process_conversation","process_insights","process_session_goal","distill_memories","memory_ab","cron_suggest_instructions","cron_eval_autorun","cron_instruction_evolution","process_judge_review","harbor_ab"]);async function en(e){let t=e.log??(()=>{}),r=e.pollWaitMs??_e,p=e.heartbeatIntervalMs??fe,d=e.capabilities??ge();s(t,{event:"agent_start",capabilities:d,pollWaitMs:r,heartbeatIntervalMs:p});try{let o=te();o.removed.length>0&&s(t,{event:"eval_worktrees_swept",removed:o.removed.length})}catch(o){s(t,{event:"eval_worktree_sweep_failed",error:o instanceof Error?o.message:String(o)})}H=oe({signal:e.signal,onPause:l(o=>{s(t,{event:"machine_pause",...o,jobId:h?.jobId??null}),h?.beat()},"onPause")});let m=be(d,e.signal,t,e.version);re({signal:e.signal,log:t}).catch(o=>{s(t,{event:"tt_heartbeat_fatal",error:o instanceof Error?o.message:String(o)})});let g=5*6e4,f=0,a=l(()=>{if(!e.readInstalledVersion||!e.version)return!1;let o=Date.now();if(o-f<g)return!1;f=o;let b=e.readInstalledVersion();return!!(b&&b!==e.version)},"versionDrifted"),n=new AbortController,i=n.signal;e.signal.aborted?n.abort():e.signal.addEventListener("abort",()=>n.abort(),{once:!0});let c=l(async(o,b)=>{let _=le;for(;!i.aborted;){if(a()){s(t,{event:"agent_version_drift",bootVersion:e.version,installedVersion:e.readInstalledVersion?.()??null}),n.abort(),e.onVersionDrift?.();break}let y=null;try{y=await we([...b],r)}catch(k){let me=k instanceof M?k.statusCode:void 0;if(s(t,{event:"poll_error",lane:o,status:me,error:k instanceof Error?k.message:String(k)}),!await I(_,i))break;_=Math.min(_*2,de);continue}if(!y){if(s(t,{event:"poll_204",lane:o}),!await I(_,i))break;_=Math.min(_*2,de);continue}_=le,await ye(y,p,t,i)}},"runLane"),u=d.filter(o=>ce.has(o)),v=d.filter(o=>!ce.has(o));u.length>0&&v.length>0?(s(t,{event:"agent_lanes",heavy:u.length,fast:v.length}),await Promise.all([c("heavy",u),c("fast",v)])):await c("single",d),await m.shutdown(),s(t,{event:"agent_stop"})}l(en,"runAgentLoop");export{ue as a,ie as b,ge as c,we as d,en as e};
@@ -1 +0,0 @@
1
- import{a as c}from"./chunk-ZLLER3HP.js";import{fetchAllSources as _,TIER_1_SOURCES as b,TIER_2_SOURCES as w,loadDiscoveredSources as $}from"@rulemetric/skills-registry";import{writeFile as U,mkdir as I}from"node:fs/promises";import O from"node:os";import E from"node:path";var l=200;async function v(m,e){let u=e.failed>0?16096779:2278750,d={title:e.failed>0?"\u26A0\uFE0F Skills registry refresh (partial failures)":"\u2705 Skills registry refreshed",color:u,fields:[{name:"Total skills",value:String(e.total),inline:!0},{name:"Sources",value:String(e.sources),inline:!0},{name:"Duration",value:`${Math.round(e.durationMs/1e3)}s`,inline:!0},{name:"Inserted",value:String(e.inserted),inline:!0},{name:"Updated",value:String(e.updated),inline:!0},{name:"Unchanged",value:String(e.unchanged),inline:!0},...e.failed>0?[{name:"Failed",value:String(e.failed),inline:!0}]:[]],timestamp:new Date().toISOString()};try{let n=await fetch(m,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({embeds:[d]})});n.ok||console.error("[cron-refresh-skills] Discord alert failed",n.status)}catch(n){console.error("[cron-refresh-skills] Discord alert threw",n)}}c(v,"postDiscordAlert");var C=c(async(m,e)=>{if(!process.env.GITHUB_TOKEN){e.logger.warn("GITHUB_TOKEN unset \u2014 skipping skills registry refresh. Without a token the unauthenticated 60 req/hr cap is too tight for ~351 sources; set GITHUB_TOKEN (5000 req/hr) and re-run.");return}let u=Date.now(),g=$(),d=new Set,n=[...b,...w,...g].filter(r=>d.has(r.repo)?!1:(d.add(r.repo),!0));e.logger.info(`Fetching from ${n.length} sources (T1=${b.length}, T2=${w.length}, discovered=${g.length})`);let o=await _(n,{onProgress:c((r,a)=>e.logger.info(`fetched ${a} from ${r}`),"onProgress")}),S=E.join(O.homedir(),".config","rulemetric");await I(S,{recursive:!0});let R=E.join(S,"skills-registry.json");await U(R,JSON.stringify({generatedAt:new Date().toISOString(),skills:o.entries},null,2)),e.logger.info(`Refreshed disk registry: ${o.entries.length} skills`);let k=process.env.RULEMETRIC_API_URL,T=process.env.RULEMETRIC_REGISTRY_BOT_TOKEN;if(!k||!T){e.logger.warn("RULEMETRIC_API_URL or RULEMETRIC_REGISTRY_BOT_TOKEN unset; skipping DB sync");return}let f=0,h=0,p=0,s=0;for(let r=0;r<o.entries.length;r+=l){let a=o.entries.slice(r,r+l).map(t=>({id:t.id,name:t.name,description:t.description,content:t.content,source:t.source,tags:t.tags,category:t.category,updatedAt:t.updatedAt,sourceUpdatedAt:t.sourceUpdatedAt,popularity:t.popularity}));try{let t=await fetch(`${k}/api/skills/sync-public`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${T}`},body:JSON.stringify({skills:a})});if(!t.ok){e.logger.warn(`Batch ${r/l} failed: ${t.status} ${await t.text()}`),s+=a.length;continue}let i=await t.json();f+=i.inserted,h+=i.updated,p+=i.unchanged,i.skipped&&(e.logger.warn(`Batch ${r/l}: ${i.skipped} skills skipped (invalid)`),s+=i.skipped)}catch(t){e.logger.warn(`Batch ${r/l} threw: ${t instanceof Error?t.message:String(t)}`),s+=a.length}}e.logger.info(`DB sync: inserted=${f} updated=${h} unchanged=${p} failed=${s}`);let y=process.env.DISCORD_WEBHOOK_URL;y&&await v(y,{total:o.entries.length,inserted:f,updated:h,unchanged:p,failed:s,sources:n.length,durationMs:Date.now()-u})},"cronRefreshSkills");export{C as a};
@@ -1 +0,0 @@
1
- import{a as v}from"./chunk-U2NT5OSQ.js";import{a as u}from"./chunk-GYNZ3OZF.js";import{c as k,e as E}from"./chunk-UPFH72PF.js";import{a}from"./chunk-ZLLER3HP.js";import{mkdirSync as N,readdirSync as h,rmSync as I,writeFileSync as S}from"node:fs";import{join as p,relative as y,sep as _}from"node:path";var b="v2-neutral-workspace";function C(e){return e==="codex"?"v3-codex-project-neutral":b}a(C,"evalMethodology");var T=["CLAUDE.md","CLAUDE.local.md","AGENTS.md"],A=new Set(["node_modules",".git","dist","build",".next","coverage"]),W={claude:{file:u.claude_code,delivery:"claude_md"},codex:{file:u.codex,delivery:"agents_md"},pi:{file:u.codex,delivery:"agents_md"}};function x(e,s="claude"){let n=[],t=new Set(T);s==="codex"&&t.add("AGENTS.override.md");let d=a(i=>{let r;try{r=h(i,{withFileTypes:!0})}catch{return}for(let o of r){let l=p(i,o.name);if(s==="codex"&&[".codex",".agents"].includes(o.name)){n.push(y(e,l));continue}if(o.isDirectory()){if(A.has(o.name)||o.name.startsWith(".")&&o.name!==".claude")continue;d(l)}else t.has(o.name)&&n.push(y(e,l))}},"walk");return d(e),n}a(x,"findAmbientInstructionFiles");function F(e,s){let n=[];for(let t of x(e,s))try{I(p(e,t),{force:!0,recursive:!0}),n.push(t)}catch{}return n}a(F,"stripAmbientInstructions");function O(e){return/[a-z0-9]/i.test(e??"")?k(e??""):"eval-target-skill"}a(O,"skillSlug");function j(e={}){let{baseDir:s,targetType:n,targetContent:t,targetName:d,engine:i="claude"}=e,r=v(s),o=F(r.workDir,i),l="none",m,f=[];if(t)switch(n){case"prompt":m=t,l="system_prompt";break;case"skill":{if(i!=="claude")throw r.cleanup(),new Error(`createEvalWorkspace: a skill target cannot be measured on ${i} \u2014 .claude/skills is read by Claude Code only, so both arms would run without it.`);let c=O(d),g=E({dirName:c,content:t});D(r.workDir,p(".claude","skills",c,"SKILL.md"),g.text),l="skill";break}default:{let{file:c,delivery:g}=W[i];D(r.workDir,c,t),f.push(c),l=g;break}}let w=x(r.workDir,i).filter(c=>!f.includes(c));return{workDir:r.workDir,systemPrompt:m,delivery:l,methodology:C(i),isWorktree:r.isWorktree,strippedFiles:o,leakedFiles:w,cleanup:r.cleanup}}a(j,"createEvalWorkspace");function D(e,s,n){let t=p(e,s),d=t.slice(0,t.lastIndexOf(_));N(d,{recursive:!0}),S(t,n,"utf8")}a(D,"writeFileInWorkspace");export{b as a,C as b,T as c,x as d,O as e,j as f};
@@ -1 +0,0 @@
1
- import{a as d}from"./chunk-I6W2KC6W.js";import{a as g}from"./chunk-HYQ5YKBC.js";import{e as c,h as p}from"./chunk-GIXHG5FK.js";import{a as i}from"./chunk-ZLLER3HP.js";import{createHash as l}from"node:crypto";import{z as r}from"zod";var m=r.object({content:r.string().min(1),name:r.string().min(1),type:r.enum(["instruction","skill"]),contentHash:r.string().regex(/^[a-f0-9]{64}$/),suggestionId:r.string().uuid()}).strict();async function w(e,u){let t=m.parse(e.candidateSnapshot);if(l("sha256").update(t.content).digest("hex")!==t.contentHash)throw new Error("Candidate snapshot hash mismatch");let o=e.preparationSourceJobId?{preparationSourceJobId:e.preparationSourceJobId}:await g({...e,candidateSnapshot:t,config:{...e.config,parallel:1,runsPerEval:1,iteration:1,skipBaseline:!1,skipGrading:!1,generateIfEmpty:!0,timeout:12e4}},u);if((await c(`/api/eval-targets/${e.evalTargetId}/jobs`)).find(s=>s.id===e.mirrorId)?.status==="cancelled")return{...o,cancelled:!0,adoptionAllowed:!1};let a;try{a=await d({evalTargetId:e.evalTargetId,evalJobId:e.preparationSourceJobId??e.mirrorId,...t})}catch(s){a={status:"blocked",reason:s instanceof Error?s.message:String(s)}}let n={...o,livePreparation:a,evidenceKind:"constructed_evaluation",candidateHash:t.contentHash,suggestionId:t.suggestionId,adoptionAllowed:!1};return await p(`/api/eval-jobs/${e.mirrorId}/state`,{result:n}),n}i(w,"processSuggestionEval");export{w as a};
@@ -1 +0,0 @@
1
- import{b as l}from"./chunk-IG4JMWFK.js";import{a as f}from"./chunk-5RBLIVBF.js";import{a as p}from"./chunk-EHW2KS6R.js";import{h as m}from"./chunk-GIXHG5FK.js";import{a as c}from"./chunk-ZLLER3HP.js";async function d(t){if(!t.worktree?.create)return t;let{branch:n,baseRef:i}=t.worktree,o=await l({repoRoot:t.projectPath,branch:n,baseRef:i});return{...t,projectPath:o.path,gitBranch:o.branch}}c(d,"resolveWorktreeForLaunch");async function j(t,n){let{mirrorId:i,tool:o}=t,{config:r}=t,a=c(e=>n.logger.info(e),"log");if(n.job.attempts>1)throw new f(`process_launch is not safe to retry (attempt ${n.job.attempts}). Re-launch manually.`);r=await d(r),r.worktree?.create&&a(`Worktree resolved: ${r.projectPath} (branch ${r.gitBranch})`),a(`Launching ${o}...`);let{getLauncher:g}=await import("./dist-UAAG2IWQ.js"),u=await g(o).launch(r);a(`Launch completed: sessionId=${u.sessionId}`);let s;if(r.scopedConfirmation&&r.mode==="headless")try{s=await p(r,u.sessionId)}catch(e){s={status:"unmeasured",reason:e instanceof Error?e.message:String(e)}}let h={...u,...s?{studyOutcome:s}:{},worktreePath:r.worktree?.create?r.projectPath:void 0,runId:r.runId};return await m(`/api/launch-jobs/${i}/state`,{result:h}).catch(e=>{a(`result persist failed: ${e instanceof Error?e.message:String(e)}`)}),h}c(j,"processLaunch");export{d as a,j as b};
@@ -1 +0,0 @@
1
- import{b as c,f as m}from"./chunk-GIXHG5FK.js";import{a as s}from"./chunk-ZLLER3HP.js";var R=new Set([408,429,502,503,504]),_=12e4,T=2e4,b=1e3,l=15e3;function p(t,e){try{t(JSON.stringify({ts:new Date().toISOString(),...e}))}catch{t(`[agent-loop] log_error event=${e.event}`)}}s(p,"structuredLog");function f(t,e){return e.aborted?Promise.resolve(!1):t<=0?Promise.resolve(!0):new Promise(r=>{let a=setTimeout(()=>{e.removeEventListener("abort",o),r(!0)},t),o=s(()=>{clearTimeout(a),e.removeEventListener("abort",o),r(!1)},"onAbort");e.addEventListener("abort",o,{once:!0})})}s(f,"abortableSleep");function g(t){return t instanceof c?R.has(t.statusCode):!0}s(g,"isRetryableReportError");async function S(t,e,r){let a=Date.now()+r.budgetMs,o=b;for(let i=1;;i++)try{return await m(t,e),{ok:!0,attempts:i}}catch(n){let u=a-Date.now();if(!g(n)||u<=0||r.signal.aborted)return{ok:!1,attempts:i,error:n};if(p(r.log,{event:`${r.event}_retry`,jobId:r.jobId,attempt:i,status:n instanceof c?n.statusCode:void 0,error:n instanceof Error?n.message:String(n),retryInMs:Math.min(o,u)}),!await f(Math.min(o,u),r.signal))return{ok:!1,attempts:i,error:n};o=Math.min(o*2,l)}}s(S,"postReportWithRetry");export{R as a,_ as b,T as c,b as d,l as e,p as f,f as g,g as h,S as i};