@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}from"./chunk-WUCACPGC.js";import"./chunk-IZTIYR5Q.js";import"./chunk-WL5ZWQAS.js";import"./chunk-KEVDLLHT.js";import"./chunk-DX6IPDED.js";import"./chunk-3AV3GTMP.js";import"./chunk-GIXHG5FK.js";import"./chunk-X6CF5KTW.js";import"./chunk-XQYAVSUQ.js";import"./chunk-PZNWH4VQ.js";import"./chunk-ZLLER3HP.js";export{a as BaseCommand};
1
+ import{a}from"./chunk-MOQTSJNZ.js";import"./chunk-IZTIYR5Q.js";import"./chunk-TDDJOSFQ.js";import"./chunk-433HK3QQ.js";import"./chunk-WDLAPZPN.js";import"./chunk-3AV3GTMP.js";import"./chunk-Z7UN4R7T.js";import"./chunk-X6CF5KTW.js";import"./chunk-XQYAVSUQ.js";import"./chunk-PZNWH4VQ.js";import"./chunk-ZLLER3HP.js";export{a as BaseCommand};
@@ -1,4 +1,4 @@
1
- import{a as S,b as P}from"./chunk-PPAHIVG5.js";import{a as V,b as v,c as T}from"./chunk-5MXZJWQS.js";import{a as E,b as C,c as _}from"./chunk-CT7FWSIU.js";import{a as b}from"./chunk-N7ODX6PO.js";import{d as K}from"./chunk-JNLDISBA.js";import{c as z,d as H}from"./chunk-GPBN4ROE.js";import{a as g,b as U}from"./chunk-6XTLP2G7.js";import{a as c}from"./chunk-ZLLER3HP.js";import{execSync as M,spawn as ee}from"node:child_process";import{tmpdir as B}from"node:os";import{mkdtempSync as te,rmSync as ne,writeFileSync as re}from"node:fs";import{join as Y}from"node:path";function oe(t,o){let{available:r,backend:n}=o??{available:c(l=>g(l)!==null,"available"),backend:A()},e=P(t);if(r(e.bin))return{bin:e.bin,args:e.args,delivery:e.delivery??"stdin",substitutedFrom:null};let i=n==="codex-cli"?S.codex:n==="claude-cli"?S.claude_code:n==="copilot-cli"?S.copilot:null;return!i||!r(i.bin)?null:{bin:i.bin,args:i.args,delivery:i.delivery??"stdin",substitutedFrom:e.bin}}c(oe,"planToolExecution");function X(t,o=300){let r=t.trim().replace(/\s+/g," ");return r.length>o?`${r.slice(0,o)}\u2026`:r}c(X,"excerpt");async function ye(t,o,r){let n=oe(t);if(!n){let s=`no engine can run ${t}'s prompt: ${P(t).bin} is not installed and no substitutable backend was detected`;return console.warn(`[llm-client] ${s}`),{ok:!1,reason:s}}let{bin:e,args:i,delivery:l}=n;n.substitutedFrom&&console.warn(`[llm-client] ${n.substitutedFrom} is not installed \u2014 running ${t}'s analysis prompt on ${e} instead`);let a=g(e);if(!a){let s=`${e} not found on PATH, well-known dirs, or the node bin dir`;return console.warn(`[llm-client] ${s}`),{ok:!1,reason:s}}let u=`${o}
1
+ import{a as S,b as P}from"./chunk-PPAHIVG5.js";import{a as V,b as v,c as T}from"./chunk-5MXZJWQS.js";import{a as E,b as C,c as _}from"./chunk-CT7FWSIU.js";import{a as b}from"./chunk-N7ODX6PO.js";import{d as K}from"./chunk-SVZYRGO5.js";import{c as z,d as H}from"./chunk-GPBN4ROE.js";import{a as g,b as U}from"./chunk-6XTLP2G7.js";import{a as c}from"./chunk-ZLLER3HP.js";import{execSync as M,spawn as ee}from"node:child_process";import{tmpdir as B}from"node:os";import{mkdtempSync as te,rmSync as ne,writeFileSync as re}from"node:fs";import{join as Y}from"node:path";function oe(t,o){let{available:r,backend:n}=o??{available:c(l=>g(l)!==null,"available"),backend:A()},e=P(t);if(r(e.bin))return{bin:e.bin,args:e.args,delivery:e.delivery??"stdin",substitutedFrom:null};let i=n==="codex-cli"?S.codex:n==="claude-cli"?S.claude_code:n==="copilot-cli"?S.copilot:null;return!i||!r(i.bin)?null:{bin:i.bin,args:i.args,delivery:i.delivery??"stdin",substitutedFrom:e.bin}}c(oe,"planToolExecution");function X(t,o=300){let r=t.trim().replace(/\s+/g," ");return r.length>o?`${r.slice(0,o)}\u2026`:r}c(X,"excerpt");async function ye(t,o,r){let n=oe(t);if(!n){let s=`no engine can run ${t}'s prompt: ${P(t).bin} is not installed and no substitutable backend was detected`;return console.warn(`[llm-client] ${s}`),{ok:!1,reason:s}}let{bin:e,args:i,delivery:l}=n;n.substitutedFrom&&console.warn(`[llm-client] ${n.substitutedFrom} is not installed \u2014 running ${t}'s analysis prompt on ${e} instead`);let a=g(e);if(!a){let s=`${e} not found on PATH, well-known dirs, or the node bin dir`;return console.warn(`[llm-client] ${s}`),{ok:!1,reason:s}}let u=`${o}
2
2
 
3
3
  SESSION DATA:
4
4
  ${r}`,m={...b()};delete m.HTTPS_PROXY;let p=null,y=i,$=u;if(l==="argv-file"){p=te(Y(B(),"rulemetric-tool-prompt-"));let s=Y(p,"session-data.txt");re(s,r),y=[...i,`@${s}`,`${o}
@@ -0,0 +1 @@
1
+ import{c as re}from"./chunk-GPWLS64K.js";import{b as te}from"./chunk-IEQDLURA.js";import{d as oe,e as ae,f as ie}from"./chunk-KINIFUZQ.js";import{a as $}from"./chunk-HB4RUEEE.js";import{a as B}from"./chunk-TFJAT263.js";import{a as O}from"./chunk-GLZBTGN5.js";import{a as Q}from"./chunk-V2G6E53W.js";import{b as J}from"./chunk-G2226CG6.js";import{a as Y}from"./chunk-ZZZ7ECPT.js";import{a as q}from"./chunk-AZK4Y5DB.js";import{a as F}from"./chunk-ZYGBABMZ.js";import{b as x}from"./chunk-5RBLIVBF.js";import{a as K}from"./chunk-BLGICIV4.js";import{e as T}from"./chunk-RAIXY6YA.js";import{b as G}from"./chunk-LEUXIXIS.js";import{c as C}from"./chunk-FZMO7XSN.js";import{a as U}from"./chunk-4XRPSKIJ.js";import{a as z}from"./chunk-M2CPTQZL.js";import{a as j}from"./chunk-LMNUO32P.js";import{a as L}from"./chunk-N7P3HUPD.js";import{a as ee}from"./chunk-ACJ2DBOE.js";import{a as X}from"./chunk-FPEC6DJV.js";import{d as P}from"./chunk-SW24KZ5C.js";import{a as ne}from"./chunk-57YXM7AI.js";import{a as Z}from"./chunk-WM437XV6.js";import{a as se}from"./chunk-DB4ZM5N3.js";import{b as E,c as V,f as o,g as A,i as W,j as b}from"./chunk-3WNQ52TW.js";import{k as N}from"./chunk-YSY25OGG.js";import{d as M}from"./chunk-GPBN4ROE.js";import{b as y,e as H,f as D}from"./chunk-Z7UN4R7T.js";import{a as l}from"./chunk-ZLLER3HP.js";var R=null,S=new Map,me={process_eval:B,process_suggestion_eval:$,process_insights:O,process_launch:J,process_send_message:F,process_conversation:U,process_session_goal:K,distill_memories:G,memory_ab:Y,process_run_cleanup:q,cron_refine_cases:ee,cron_retire_unused_skills:ne,cron_reconcile_attribution:L,cron_suggest_instructions:T,cron_refresh_skills:P,cron_refresh_pricing:X,cron_eval_autorun:z,cron_auto_accept_suggestions:Z,cron_instruction_training:j,cron_instruction_evolution:N,process_judge_review:Q,harbor_ab:C},le=500,de=1e4,ce=Object.keys(me),fe=new Set([]);function ke(e=process.env){return e.DATABASE_URL?ce:ce.filter(t=>!fe.has(t))}l(ke,"availableCapabilities");var ve=3e4,we=3e4;async function he(e,t,s=M(),i){let d=[...s.claudeBin?["claude"]:[],...s.codexBin?["codex"]:[],...s.piBin?["pi"]:[]],c=`capabilities=${encodeURIComponent(e.join(","))}&waitMs=${t}&measurementProtocol=1&studyProtocol=1&scopedCollector=2&memorySnapshots=1&boundedAutorun=1&measurementEngines=${encodeURIComponent(d.join(","))}`,u=await H(`/api/work/next?${c}${i?`&launchMode=${i}`:""}`);return u==null||typeof u=="string"?null:u}l(he,"pollForWork");function be(e,t,s){return{logger:{info:l(i=>t(i),"info"),warn:l(i=>t(i),"warn"),error:l(i=>t(i),"error")},job:{attempts:e},leaseSignal:s}}l(be,"makeHelpers");async function Se(e,t,s,i){let d=me[e.kind],c=Date.now();if(o(s,{event:"claim",jobId:e.id,kind:e.kind,attempts:e.attempts}),!d){let n=`unknown kind: ${e.kind}`;o(s,{event:"fail",jobId:e.id,kind:e.kind,terminal:!0,error:n}),await D(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:n,terminal:!0}).catch(()=>{});return}let u=new AbortController,m=!1,k,g=l(()=>{m||(o(s,{event:"heartbeat",jobId:e.id}),b(`/api/work/${e.id}/heartbeat`,{leaseToken:e.leaseToken},{budgetMs:Math.min(V,Math.max(0,t-1e3)),signal:i,log:s,event:"heartbeat",jobId:e.id}).then(n=>{if(!(n.ok||m)){if(W(n.error)){m=!0,k!==void 0&&clearInterval(k),o(s,{event:"lease_lost",jobId:e.id,kind:e.kind,elapsedMs:Date.now()-c,error:n.error instanceof Error?n.error.message:String(n.error)}),u.abort(new Error(`lease lost for job ${e.id} (${e.kind}); stop work`));return}o(s,{event:"heartbeat_error",jobId:e.id,attempts:n.attempts,error:n.error instanceof Error?n.error.message:String(n.error)})}}))},"beat");k=setInterval(g,t),S.set(e.id,g);let a;try{let n=be(e.attempts,s,u.signal);a={kind:"complete",result:await d(e.payload,n)??{}}}catch(n){let v=R?.pausesSince(c)??[],_=ie(v),w=n instanceof Error?n.message:String(n),r=x(n),p=!r&&ae(v);a={kind:"fail",message:_?`${_}; ${w}`:w,pausedDuringJob:!!_,terminal:r,hostSuspended:p}}try{if(m)o(s,{event:"lease_lost_stop",jobId:e.id,kind:e.kind,durationMs:Date.now()-c,handlerOutcome:a.kind,...a.kind==="fail"?{error:a.message}:{}});else if(a.kind==="complete"){o(s,{event:"complete",jobId:e.id,kind:e.kind,durationMs:Date.now()-c});let n=await b(`/api/work/${e.id}/complete`,{leaseToken:e.leaseToken,result:a.result},{budgetMs:E,signal:i,log:s,event:"complete_post",jobId:e.id});n.ok||o(s,{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{o(s,{event:"fail",jobId:e.id,kind:e.kind,durationMs:Date.now()-c,terminal:a.terminal,error:a.message,...a.pausedDuringJob?{pausedDuringJob:!0}:{},...a.hostSuspended?{hostSuspended:!0}:{}});let n=await b(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:a.message,terminal:a.terminal,hostSuspended:a.hostSuspended},{budgetMs:E,signal:i,log:s,event:"fail_post",jobId:e.id});n.ok||o(s,{event:"fail_post_error",jobId:e.id,attempts:n.attempts,error:n.error instanceof Error?n.error.message:String(n.error)})}}finally{clearInterval(k),S.delete(e.id)}}l(Se,"runOne");var ue=new Set(["process_launch","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"]),pe=new Set(["cron_refresh_skills"]);async function en(e){let t=e.log??(()=>{}),s=e.pollWaitMs??ve,i=e.heartbeatIntervalMs??we,d=e.capabilities??ke();o(t,{event:"agent_start",capabilities:d,pollWaitMs:s,heartbeatIntervalMs:i});try{let r=te();r.removed.length>0&&o(t,{event:"eval_worktrees_swept",removed:r.removed.length})}catch(r){o(t,{event:"eval_worktree_sweep_failed",error:r instanceof Error?r.message:String(r)})}R=oe({signal:e.signal,onPause:l(r=>{o(t,{event:"machine_pause",...r,jobIds:[...S.keys()]});for(let p of S.values())p()},"onPause")});let c=se(d,e.signal,t,e.version,()=>R);re({signal:e.signal,log:t}).catch(r=>{o(t,{event:"tt_heartbeat_fatal",error:r instanceof Error?r.message:String(r)})});let u=5*6e4,m=0,k=l(()=>{if(!e.readInstalledVersion||!e.version)return!1;let r=Date.now();if(r-m<u)return!1;m=r;let p=e.readInstalledVersion();return!!(p&&p!==e.version)},"versionDrifted"),g=new AbortController,a=g.signal;e.signal.aborted?g.abort():e.signal.addEventListener("abort",()=>g.abort(),{once:!0});let n=l(async(r,p,ge)=>{let f=le;for(;!a.aborted;){if(k()){o(t,{event:"agent_version_drift",bootVersion:e.version,installedVersion:e.readInstalledVersion?.()??null}),g.abort(),e.onVersionDrift?.();break}let I=null;try{I=await he([...p],s,void 0,ge)}catch(h){let _e=h instanceof y?h.statusCode:void 0;if(o(t,{event:"poll_error",lane:r,status:_e,error:h instanceof Error?h.message:String(h)}),!await A(f,a))break;f=Math.min(f*2,de);continue}if(!I){if(o(t,{event:"poll_204",lane:r}),!await A(f,a))break;f=Math.min(f*2,de);continue}f=le,await Se(I,i,t,a)}},"runLane"),v=d.filter(r=>ue.has(r)),_=d.filter(r=>(r==="process_launch"||!ue.has(r))&&!pe.has(r)),w=d.filter(r=>pe.has(r));o(t,{event:"agent_lanes",heavy:v.length,fast:_.length,background:w.length}),await Promise.all([...v.length?[n("heavy",v,"headless")]:[],..._.length?[n("fast",_,"interactive")]:[],...w.length?[n("background",w)]:[]]),await c.shutdown(),o(t,{event:"agent_stop"})}l(en,"runAgentLoop");export{me as a,ce as b,ke as c,he as d,en as e};
@@ -1,2 +1,2 @@
1
- import{x as w}from"./chunk-MMMT34KO.js";import{a as m}from"./chunk-N7ODX6PO.js";import{a as s}from"./chunk-ZLLER3HP.js";import{spawn as g}from"node:child_process";import d from"node:fs";import b from"node:path";function c(e,t){return new Promise((r,n)=>{let o=g("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:m()}),i="",f="";o.stdout.on("data",a=>{i+=a.toString()}),o.stderr.on("data",a=>{f+=a.toString()}),o.on("error",a=>n(new Error(`git ${e.join(" ")} failed to spawn: ${a.message}`))),o.on("close",a=>{a===0?r({code:a,stdout:i,stderr:f}):n(new Error(`git ${e.join(" ")} exited ${a}: ${f.trim()||i.trim()}`))})})}s(c,"runGit");async function k(e,t){if(!t||!t.trim())throw new Error('invalid branch name "": branch must be a non-empty git refname');if(t.startsWith("-"))throw new Error(`invalid branch name "${t}": must not start with "-" (git would parse it as an option)`);if(/\s/.test(t))throw new Error(`invalid branch name "${t}": must not contain whitespace`);try{await c(["check-ref-format","--branch",t],e)}catch{throw new Error(`invalid branch name "${t}": not a valid git refname`)}}s(k,"assertValidBranch");function h(e){let t=b.resolve(e);try{return d.realpathSync(t)}catch{return t}}s(h,"canonical");function y(e){let t=[],r=null;for(let n of e.split(`
1
+ import{x as w}from"./chunk-WWL4HNXM.js";import{a as m}from"./chunk-N7ODX6PO.js";import{a as s}from"./chunk-ZLLER3HP.js";import{spawn as g}from"node:child_process";import d from"node:fs";import b from"node:path";function c(e,t){return new Promise((r,n)=>{let o=g("git",e,{cwd:t,stdio:["ignore","pipe","pipe"],env:m()}),i="",f="";o.stdout.on("data",a=>{i+=a.toString()}),o.stderr.on("data",a=>{f+=a.toString()}),o.on("error",a=>n(new Error(`git ${e.join(" ")} failed to spawn: ${a.message}`))),o.on("close",a=>{a===0?r({code:a,stdout:i,stderr:f}):n(new Error(`git ${e.join(" ")} exited ${a}: ${f.trim()||i.trim()}`))})})}s(c,"runGit");async function k(e,t){if(!t||!t.trim())throw new Error('invalid branch name "": branch must be a non-empty git refname');if(t.startsWith("-"))throw new Error(`invalid branch name "${t}": must not start with "-" (git would parse it as an option)`);if(/\s/.test(t))throw new Error(`invalid branch name "${t}": must not contain whitespace`);try{await c(["check-ref-format","--branch",t],e)}catch{throw new Error(`invalid branch name "${t}": not a valid git refname`)}}s(k,"assertValidBranch");function h(e){let t=b.resolve(e);try{return d.realpathSync(t)}catch{return t}}s(h,"canonical");function y(e){let t=[],r=null;for(let n of e.split(`
2
2
  `))n.startsWith("worktree ")?(r&&t.push(r),r={path:n.slice(9).trim()}):n.startsWith("branch ")&&r&&(r.branch=n.slice(7).trim().replace(/^refs\/heads\//,""));return r&&t.push(r),t}s(y,"parseWorktreeList");async function v(e,t){try{return await c(["show-ref","--verify","--quiet",`refs/heads/${t}`],e),!0}catch{return!1}}s(v,"branchExists");async function B(e){let{repoRoot:t,branch:r,baseRef:n,allowExistingBranch:o=!1}=e;await k(t,r);let i=w({repoRoot:t,branch:r,basePath:e.basePath}),f=await c(["worktree","list","--porcelain"],t),a=y(f.stdout),p=a.find(u=>u.branch===r);if(p)return{path:h(p.path),branch:r,created:!1};let l=a.find(u=>h(u.path)===i);if(l)return{path:h(l.path),branch:l.branch??r,created:!1};if(await v(t,r)){if(!o)throw new Error(`branch "${r}" already exists with no worktree; refusing to clobber (pass allowExistingBranch:true to attach a worktree onto it)`);return await c(["worktree","add",i,r],t),{path:h(i),branch:r,created:!0}}return await c(["worktree","add",i,"-b",r,n],t),{path:h(i),branch:r,created:!0}}s(B,"ensureWorktree");async function S(e){let{repoRoot:t,worktreePath:r}=e;if(!d.existsSync(r))return{removed:!1,reason:"absent"};let n=!1;try{n=(await c(["status","--porcelain"],r)).stdout.trim().length>0}catch{n=!1}if(n)return{removed:!1,reason:"dirty"};try{return await c(["worktree","remove",r],t),{removed:!0}}catch(o){let i=o instanceof Error?o.message:String(o);if(/not a working tree|No such file or directory|not a valid path|is not a working tree/i.test(i))return{removed:!1,reason:"absent"};throw o}}s(S,"removeWorktree");export{c as a,B as b,S as c};
@@ -0,0 +1 @@
1
+ import{e as $,j as P,k as T,l as A,m as I,n as v,o as _,p as y,q as O,r as C,s as L,t as M}from"./chunk-XFOG2PDJ.js";import{b as x,c as D}from"./chunk-SIGZEQ3K.js";import{b as R,e as E,f as b}from"./chunk-Z7UN4R7T.js";import{a as c}from"./chunk-ZLLER3HP.js";import{join as q}from"node:path";import{pathToFileURL as F}from"node:url";import{scriptsDir as z}from"@rulemetric/hooks/scripts-dir";var N=2e7,l=class extends Error{constructor(t,r,u,a,d){super(r,d instanceof Error?{cause:d}:void 0);this.phase=t;this.step=u;this.receiptDir=a;this.name="ScopedOutcomeError"}static{c(this,"ScopedOutcomeError")}};function te(e,o,t){if(e instanceof l&&e.phase==="deliver"&&e.receiptDir)return{status:"undelivered",sessionId:o,studyId:t,receiptDir:e.receiptDir,step:e.step,reason:e.message};let r=e instanceof l?e.step:"measure",u=e instanceof l?e.receiptDir:null;return{status:"unmeasured",sessionId:o,studyId:t,step:r,reason:e instanceof Error?e.message:String(e),receiptDir:u}}c(te,"scopedOutcomeFailure");async function U(){return import(F(q(z,"scoped-live.mjs")).href)}c(U,"loadCollector");async function Y(e,o){let{confirmation:t}=await E(`/api/scoped-live-confirmations/${e}/contract`,{signal:o?AbortSignal.any([o,AbortSignal.timeout(3e4)]):AbortSignal.timeout(3e4)});return P(e,t.protocol),t.protocol}c(Y,"stageScopedProtocol");async function G(e,o){let t=e.scopedConfirmation,r=$(t.id,o),u=v(r);if(u)return{dir:r,record:u,created:!1};let a=D(o,x(()=>null,()=>null)),d=a?C(a):null;if(!a||d===null||d>N)throw new l("collect","Completed actor transcript is missing or exceeds the capture bound","transcript",null);let s=A(r,a),n=T(t.id);if(n===null)try{n=await Y(t.id)}catch(i){throw new l("collect",`Frozen protocol unavailable after exit: ${i.message}`,"protocol",r,i)}let p;try{let i=await U();i.transcriptEvidence(s.path,o),p=i.collectScopedOutcome(n,t.taskId,o,e.projectPath,s.path)}catch(i){throw new l("collect",i.message,"measure",r,i)}let f=I(r,{confirmationId:t.id,taskId:t.taskId,externalSessionId:o,projectPath:e.projectPath,collectedAt:new Date().toISOString(),transcriptSha256:s.sha256,transcriptBytes:s.bytes,receipt:p});return{dir:r,...f}}c(G,"collectScopedReceipt");function V(e,{requestTimeoutMs:o,signal:t,deadlineAt:r,now:u=Date.now},a){if(t?.aborted)return Promise.reject(new Error(`${a} not attempted: ${k(t)}`));if(!o&&!t&&r===void 0)return e();let d=r===void 0?1/0:r-u();if(d<=0)return Promise.reject(new Error(`${a} not attempted: sweep deadline exhausted`));let s=Math.min(o??1/0,d),n=new AbortController;return new Promise((p,f)=>{let i=!1,g=c(w=>{i||(i=!0,clearTimeout(S),t?.removeEventListener("abort",m),w())},"finish"),m=c(()=>g(()=>{n.abort(t?.reason),f(new Error(`${a} interrupted: ${k(t)}`))}),"onAbort"),S=Number.isFinite(s)?setTimeout(()=>g(()=>{n.abort(),f(new Error(`${a} request exceeded ${Math.max(1,Math.round(s/1e3))}s deadline`))}),Math.max(1,s)):void 0;t?.addEventListener("abort",m,{once:!0}),e(n.signal).then(w=>g(()=>p(w)),w=>g(()=>f(w)))})}c(V,"bounded");function k(e){let o=e.reason;return o instanceof Error?o.message:typeof o=="string"?o:"aborted"}c(k,"abortReason");function h(e,o,t){return t?b(e,o,{signal:t}):b(e,o)}c(h,"postReceipt");async function B(e,o={}){let t=v(e);if(!t)throw new l("collect",`No receipt at ${e}; the outcome was never measured and cannot be reconstructed`,"measure",e);let r=_(e);if(r.completedAt)return{ledger:r,record:t};r.attempts+=1;let u=c(s=>r.completed.includes(s),"done"),a=c(s=>{u(s)||r.completed.push(s),y(e,r)},"mark"),d=c(async(s,n)=>{if(!u(s)){try{await V(n,o,s)}catch(p){throw r.lastError={at:new Date().toISOString(),step:s,message:p.message},y(e,r),new l("deliver",`${s} failed: ${p.message}`,s,e,p)}r.lastError=null,a(s)}},"run");return await d("session",async s=>{let n=await h("/api/sessions",{tool:"claude_code",externalSessionId:t.externalSessionId,projectPath:t.projectPath},s);r.sessionId=n.id}),await d("reimport",async s=>{await h(`/api/sessions/${r.sessionId}/reimport`,{tool:"claude_code",content:O(e).toString("utf8")},s)}),await d("verify",async s=>{await h(`/api/scoped-live-confirmations/${t.confirmationId}/verify`,t.receipt,s)}),await d("settle",async s=>{await h("/api/instruction-experiments/settle",{projectPath:t.projectPath},s)}),r.completedAt=new Date().toISOString(),y(e,r),{ledger:r,record:t}}c(B,"deliverScopedReceipt");async function re(e,o,t){let r=e.scopedConfirmation,{dir:u,created:a}=await G(e,o);return await B(u,{signal:t,requestTimeoutMs:3e4,deadlineAt:Date.now()+12e4}),{status:"recorded",sessionId:o,studyId:r.id,receiptDir:u,resumed:!a}}c(re,"finalizeScopedLaunch");var H={sweepBudgetMs:12e4,requestTimeoutMs:3e4,maxEntries:50};async function ne(e=()=>{},o={}){let{sweepBudgetMs:t,requestTimeoutMs:r,maxEntries:u}={...H,...o},a=o.now??Date.now,d=a(),s=o.signal,n={scanned:0,delivered:0,failed:0,unmeasured:0,pending:0,deferred:0,stopReason:"complete",entries:[]},p=[];for(let i of L()){if(n.scanned+=1,M(i)){n.entries.push({dir:i.dir,status:"already_delivered"});continue}if(!i.receipt){n.unmeasured+=1,n.entries.push({dir:i.dir,status:"unmeasured",reason:i.hasTranscript?"transcript preserved but no receipt was collected":"entry has neither transcript nor receipt"}),e(`scoped outcome ${i.confirmationId}/${i.externalSessionId}: unmeasured (no receipt); not reconstructed`);continue}p.push(i)}p.sort((i,g)=>(i.ledger?.lastError?.at??"").localeCompare(g.ledger?.lastError?.at??"")),n.pending=p.length;let f=0;for(let i of p){let g=a()-d;if(s?.aborted?n.stopReason="lease_lost":(g>=t||f>=u)&&(n.stopReason="budget_exhausted"),n.stopReason!=="complete"){n.deferred+=1,n.entries.push({dir:i.dir,status:"deferred",reason:n.stopReason});continue}f+=1;try{await B(i.dir,{requestTimeoutMs:r,signal:s,deadlineAt:d+t,now:a}),n.delivered+=1,n.pending-=1,n.entries.push({dir:i.dir,status:"delivered"}),e(`scoped outcome ${i.confirmationId}/${i.externalSessionId}: delivered`)}catch(m){n.failed+=1;let S=m instanceof l?m.step:"unknown",w=m instanceof Error?m.cause:void 0,j=w instanceof R?` (${w.statusCode})`:"";n.entries.push({dir:i.dir,status:"failed",step:S,reason:m.message}),e(`scoped outcome ${i.confirmationId}/${i.externalSessionId}: ${S} still failing${j}: ${m.message}`),s?.aborted&&(n.stopReason="lease_lost")}}return n.pending>0&&e(`scoped outcomes: ${n.pending} receipt(s) still pending upload (${n.deferred} deferred, stop=${n.stopReason})`),n}c(ne,"resumePendingScopedOutcomes");export{l as a,te as b,Y as c,G as d,B as e,re as f,H as g,ne as h};
@@ -0,0 +1 @@
1
+ import{b as a,f as m}from"./chunk-Z7UN4R7T.js";import{a as s}from"./chunk-ZLLER3HP.js";var R=new Set([408,429,502,503,504]),_=12e4,T=2e4,b=1e3,f=15e3;function l(t,e){try{t(JSON.stringify({ts:new Date().toISOString(),...e}))}catch{t(`[agent-loop] log_error event=${e.event}`)}}s(l,"structuredLog");function p(t,e){return e.aborted?Promise.resolve(!1):t<=0?Promise.resolve(!0):new Promise(r=>{let u=setTimeout(()=>{e.removeEventListener("abort",o),r(!0)},t),o=s(()=>{clearTimeout(u),e.removeEventListener("abort",o),r(!1)},"onAbort");e.addEventListener("abort",o,{once:!0})})}s(p,"abortableSleep");function d(t){return t instanceof a?R.has(t.statusCode):!0}s(d,"isRetryableReportError");function S(t){return t instanceof a&&t.statusCode===404}s(S,"isDefinitiveLeaseLoss");async function v(t,e,r){let u=Date.now()+r.budgetMs,o=b;for(let i=1;;i++)try{return await m(t,e),{ok:!0,attempts:i}}catch(n){let c=u-Date.now();if(!d(n)||c<=0||r.signal.aborted)return{ok:!1,attempts:i,error:n};if(l(r.log,{event:`${r.event}_retry`,jobId:r.jobId,attempt:i,status:n instanceof a?n.statusCode:void 0,error:n instanceof Error?n.message:String(n),retryInMs:Math.min(o,c)}),!await p(Math.min(o,c),r.signal))return{ok:!1,attempts:i,error:n};o=Math.min(o*2,f)}}s(v,"postReportWithRetry");export{R as a,_ as b,T as c,b as d,f as e,l as f,p as g,d as h,S as i,v as j};
@@ -1 +1 @@
1
- import{c as l}from"./chunk-GIXHG5FK.js";import{c as a,l as u}from"./chunk-PZNWH4VQ.js";import{a as o}from"./chunk-ZLLER3HP.js";var c=120*1e3,t=null;async function k(){if(process.env.RULEMETRIC_API_KEY)return!0;let e=a(u());if(!e.isRefreshable(c))return!0;let r=e.loadToken();return r?.refreshToken?t||(t=f(e,r).finally(()=>{t=null}),t):!0}o(k,"ensureFreshToken");async function f(e,r){let s;try{s=await fetch(`${l()}/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:r.refreshToken})})}catch{return!0}if(s.status===401)return e.clearToken(),!1;if(!s.ok)return!0;let n=await s.json().catch(()=>null);if(!n?.accessToken||!n.refreshToken)return!0;let i={accessToken:n.accessToken,refreshToken:n.refreshToken,expiresAt:n.expiresAt??r.expiresAt,email:n.email??r.email};return e.saveToken(i),e.saveEnvFile(i.accessToken),!0}o(f,"doRefresh");export{k as a};
1
+ import{c as l}from"./chunk-Z7UN4R7T.js";import{c as a,l as u}from"./chunk-PZNWH4VQ.js";import{a as o}from"./chunk-ZLLER3HP.js";var c=120*1e3,t=null;async function k(){if(process.env.RULEMETRIC_API_KEY)return!0;let e=a(u());if(!e.isRefreshable(c))return!0;let r=e.loadToken();return r?.refreshToken?t||(t=f(e,r).finally(()=>{t=null}),t):!0}o(k,"ensureFreshToken");async function f(e,r){let s;try{s=await fetch(`${l()}/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refreshToken:r.refreshToken})})}catch{return!0}if(s.status===401)return e.clearToken(),!1;if(!s.ok)return!0;let n=await s.json().catch(()=>null);if(!n?.accessToken||!n.refreshToken)return!0;let i={accessToken:n.accessToken,refreshToken:n.refreshToken,expiresAt:n.expiresAt??r.expiresAt,email:n.email??r.email};return e.saveToken(i),e.saveEnvFile(i.accessToken),!0}o(f,"doRefresh");export{k as a};
@@ -1,4 +1,4 @@
1
- import{f as u}from"./chunk-4GOXEEXZ.js";import{a as o}from"./chunk-ZLLER3HP.js";var l=`You are a meta-judge evaluating the quality of an eval run \u2014 not the code output, but whether the test cases and grading themselves are rigorous and meaningful.
1
+ import{g as u}from"./chunk-LARY6ZFT.js";import{a as o}from"./chunk-ZLLER3HP.js";var l=`You are a meta-judge evaluating the quality of an eval run \u2014 not the code output, but whether the test cases and grading themselves are rigorous and meaningful.
2
2
 
3
3
  You will receive a summary of eval cases, their expectations, and grading results.
4
4
 
@@ -1 +1 @@
1
- import{a as i}from"./chunk-WL34G6IR.js";import{h as s}from"./chunk-GIXHG5FK.js";import{a as n}from"./chunk-ZLLER3HP.js";async function l(a,c){let{mirrorId:g,evalTargetId:p,config:r}=a,e=n(o=>c.logger.info(o),"log");await i(r,p,e);let t={type:"conversation",conversationId:r.conversationId};return await s(`/api/eval-jobs/${g}/state`,{result:t}).catch(o=>{e(`result persist failed: ${o instanceof Error?o.message:String(o)}`)}),t}n(l,"processConversation");export{l as a};
1
+ import{a as i}from"./chunk-YVEI7XR6.js";import{h as s}from"./chunk-Z7UN4R7T.js";import{a as n}from"./chunk-ZLLER3HP.js";async function l(a,c){let{mirrorId:g,evalTargetId:p,config:r}=a,e=n(o=>c.logger.info(o),"log");await i(r,p,e);let t={type:"conversation",conversationId:r.conversationId};return await s(`/api/eval-jobs/${g}/state`,{result:t}).catch(o=>{e(`result persist failed: ${o instanceof Error?o.message:String(o)}`)}),t}n(l,"processConversation");export{l as a};
@@ -1 +1 @@
1
- import{b as t,e as E}from"./chunk-KGU2IW54.js";import{a as r}from"./chunk-ZLLER3HP.js";function s(o=10,_=t){for(let e=1;e<=o;e++)if(E(e,o,_).feasible)return e;return o}r(s,"minFeasibleLiveCases");var S=s(),A=3;export{s as a,S as b,A as c};
1
+ import{b as t,e as E}from"./chunk-YSY25OGG.js";import{a as r}from"./chunk-ZLLER3HP.js";function s(o=10,_=t){for(let e=1;e<=o;e++)if(E(e,o,_).feasible)return e;return o}r(s,"minFeasibleLiveCases");var S=s(),A=3;export{s as a,S as b,A as c};
@@ -1 +1 @@
1
- import{b as s,c as a}from"./chunk-5MXZJWQS.js";import{f as c}from"./chunk-4GOXEEXZ.js";import{f as u}from"./chunk-XQYAVSUQ.js";import{a as m}from"./chunk-ZLLER3HP.js";import{mkdtempSync as p,rmSync as d}from"node:fs";import{join as f}from"node:path";import{tmpdir as l}from"node:os";async function g(n,o,i){let r=u.parse(n),e=p(f(l(),"rulemetric-measurement-generation-"));try{let t=await c({engine:r.engine,model:r.model??void 0,systemPrompt:o,prompt:i,workDir:e,timeout:12e4});if(t.error||t.exitCode!==0||!t.output.trim())throw new Error(`Selected ${r.engine} generator failed: ${t.error??`exit ${t.exitCode}, empty output`}`);return t.output}finally{d(e,{recursive:!0,force:!0})}}m(g,"runMeasurementText");async function S(n,o,i){let r=await g(n,o,i),e=s(a(r)??r);if(!e.ok||!e.value||Array.isArray(e.value)||typeof e.value!="object")throw new Error(`Selected ${n.engine} generator returned invalid JSON`);return e.value}m(S,"runMeasurementJson");export{g as a,S as b};
1
+ import{b as s,c as a}from"./chunk-5MXZJWQS.js";import{g as c}from"./chunk-LARY6ZFT.js";import{f as u}from"./chunk-XQYAVSUQ.js";import{a as m}from"./chunk-ZLLER3HP.js";import{mkdtempSync as p,rmSync as d}from"node:fs";import{join as f}from"node:path";import{tmpdir as l}from"node:os";async function g(n,o,i){let r=u.parse(n),e=p(f(l(),"rulemetric-measurement-generation-"));try{let t=await c({engine:r.engine,model:r.model??void 0,systemPrompt:o,prompt:i,workDir:e,timeout:12e4});if(t.error||t.exitCode!==0||!t.output.trim())throw new Error(`Selected ${r.engine} generator failed: ${t.error??`exit ${t.exitCode}, empty output`}`);return t.output}finally{d(e,{recursive:!0,force:!0})}}m(g,"runMeasurementText");async function S(n,o,i){let r=await g(n,o,i),e=s(a(r)??r);if(!e.ok||!e.value||Array.isArray(e.value)||typeof e.value!="object")throw new Error(`Selected ${n.engine} generator returned invalid JSON`);return e.value}m(S,"runMeasurementJson");export{g as a,S as b};
@@ -1 +1 @@
1
- import{b as g}from"./chunk-3ZHVP3KE.js";import{d as k,e as h}from"./chunk-FXQS7AEZ.js";import{e as m,i as f}from"./chunk-GIXHG5FK.js";import{a as c}from"./chunk-ZLLER3HP.js";import{existsSync as b}from"node:fs";async function w($,y){let r=c(t=>y?.logger?.info?.(t)??console.log(t),"log"),{projectPath:s}=$,n=`[cron_retire_unused_skills] ${s}`;if(!s||!b(s))return{skipped:"project-missing",reason:`${s} does not exist on this machine \u2014 refusing to delete files for a project that is not here.`};let o=await m("/api/insights/groom-candidates"),e=g({captureHealthy:o.skillCaptureHealthy===!0,captureReason:o.skillCaptureHealthy===void 0?"API did not report skill capture health (older deployment)":o.skillCaptureReason,candidates:o.unusedSkills??[]});if(e.refused)return r(`${n} ${e.refused}: ${e.summary}`),{skipped:e.refused,reason:e.summary,held:e.held.length};r(`${n} ${e.summary}`);let a=[],d=[],l=0;for(let t of e.retire){let u=k({kind:"skill_file",target:t.name,cwd:s});if(!u.ok){l+=1,r(`${n} could not plan removal of ${t.name}: ${u.refusal??"unresolved"}`);continue}let R=new Date().toISOString().replace(/[:.]/g,"-"),i=h(u,R);if(!i.applied){l+=1,r(`${n} failed to remove ${t.name}: ${i.error??"unknown error"}`);continue}a.push(t.name),i.backupPath&&d.push(i.backupPath),r(`${n} retired ${t.name} (backup: ${i.backupPath??"none"})`);try{await f(`/api/instructions/${t.instructionId}`)}catch(p){r(`${n} removed ${t.name} but could not archive its instruction row: ${p instanceof Error?p.message:String(p)}`)}}return{retired:a.length,failed:l,held:e.held.length,names:a,backups:d,reason:e.summary}}c(w,"cronRetireUnusedSkills");export{w as a};
1
+ import{b as g}from"./chunk-3ZHVP3KE.js";import{d as k,e as h}from"./chunk-FXQS7AEZ.js";import{e as m,i as f}from"./chunk-Z7UN4R7T.js";import{a as c}from"./chunk-ZLLER3HP.js";import{existsSync as b}from"node:fs";async function w($,y){let r=c(t=>y?.logger?.info?.(t)??console.log(t),"log"),{projectPath:s}=$,n=`[cron_retire_unused_skills] ${s}`;if(!s||!b(s))return{skipped:"project-missing",reason:`${s} does not exist on this machine \u2014 refusing to delete files for a project that is not here.`};let o=await m("/api/insights/groom-candidates"),e=g({captureHealthy:o.skillCaptureHealthy===!0,captureReason:o.skillCaptureHealthy===void 0?"API did not report skill capture health (older deployment)":o.skillCaptureReason,candidates:o.unusedSkills??[]});if(e.refused)return r(`${n} ${e.refused}: ${e.summary}`),{skipped:e.refused,reason:e.summary,held:e.held.length};r(`${n} ${e.summary}`);let a=[],d=[],l=0;for(let t of e.retire){let u=k({kind:"skill_file",target:t.name,cwd:s});if(!u.ok){l+=1,r(`${n} could not plan removal of ${t.name}: ${u.refusal??"unresolved"}`);continue}let R=new Date().toISOString().replace(/[:.]/g,"-"),i=h(u,R);if(!i.applied){l+=1,r(`${n} failed to remove ${t.name}: ${i.error??"unknown error"}`);continue}a.push(t.name),i.backupPath&&d.push(i.backupPath),r(`${n} retired ${t.name} (backup: ${i.backupPath??"none"})`);try{await f(`/api/instructions/${t.instructionId}`)}catch(p){r(`${n} removed ${t.name} but could not archive its instruction row: ${p instanceof Error?p.message:String(p)}`)}}return{retired:a.length,failed:l,held:e.held.length,names:a,backups:d,reason:e.summary}}c(w,"cronRetireUnusedSkills");export{w as a};
@@ -1 +1 @@
1
- import{c as g}from"./chunk-DANMUHNW.js";import{e as h,f}from"./chunk-GIXHG5FK.js";import{q as u,r as m}from"./chunk-X6CF5KTW.js";import{a as c}from"./chunk-ZLLER3HP.js";import*as i from"node:fs";import*as d from"node:path";var v=new Set(u);async function w(r){let{applications:l}=await h(`/api/recommendation-applications?instructionId=${encodeURIComponent(r.instructionId)}&projectPath=${encodeURIComponent(r.projectPath)}&limit=200`),t=l.filter(e=>v.has(e.status)&&e.inverse),s=[];for(let e of m(t.map(n=>({...n,appliedAt:n.appliedAt})))){let n=e.inverse;if(n.kind==="delete-paths"){let p=y(r.dir,n.paths);s.push({applicationId:e.id,target:e.targetPath,reversed:p.removed,drifted:!1,reason:p.reason}),(p.removed||p.alreadyGone)&&await f(`/api/recommendation-applications/${encodeURIComponent(e.id)}/transition`,{status:"reverted"});continue}if(n.kind!=="remove-hook-entry"){s.push({applicationId:e.id,target:e.targetPath,reversed:!1,drifted:!1,reason:`no reverser for inverse kind '${n.kind}' \u2014 recorded, not reversed`});continue}let o=g({dir:r.dir,inverse:n});s.push({applicationId:e.id,target:e.targetPath,reversed:o.removed,drifted:o.drifted,reason:o.reason}),(o.removed||o.code==="not-present")&&await f(`/api/recommendation-applications/${encodeURIComponent(e.id)}/transition`,{status:"reverted"})}return s}c(w,"reverseApplications");function y(r,l){let t=d.resolve(r),s=!1,e=0;for(let n of l){let o=d.resolve(t,n);if(o===t||!o.startsWith(t+d.sep))return{removed:!1,alreadyGone:!1,reason:`refused: ${n} does not resolve to a path inside the project`};if(!i.existsSync(o)&&!I(o)){e+=1;continue}try{i.rmSync(o,{recursive:!0,force:!0}),s=!0;let a=d.dirname(o);a.startsWith(t+d.sep)&&i.readdirSync(a).length===0&&i.rmdirSync(a)}catch(a){return{removed:!1,alreadyGone:!1,reason:`could not remove ${n}: ${a instanceof Error?a.message:String(a)}`}}}return!s&&e===l.length?{removed:!1,alreadyGone:!0,reason:"already removed"}:{removed:s,alreadyGone:!1}}c(y,"deletePaths");function I(r){try{return i.lstatSync(r).isSymbolicLink()}catch{return!1}}c(I,"isSymlink");function b(r){let l=r.name??r.instructionId,t=[],s=r.reversals.filter(e=>e.reversed);if(r.stripped.length>0)t.push(`Removed ${l} from ${r.stripped.join(", ")}.`);else if(s.length>0)for(let e of s)t.push(`Removed ${l} from ${e.target}.`),e.drifted&&t.push(" (that file had changed since it was installed; only the recorded entry was removed)");else{let e=r.searched.length>0?` (searched ${r.searched.join(", ")})`:"";t.push(`No rulemetric-managed block for ${r.instructionId} was found in this directory${e}.`)}for(let e of r.reversals.filter(n=>!n.reversed))t.push(`Still installed in ${e.target}: ${e.reason??"the recorded inverse did not apply"}`);return r.dismissalError?(t.push(`Could not record the dismissal: ${r.dismissalError}`),t.push(r.stripped.length>0||s.length>0?' What was removed above stays removed \u2014 only the "stop proposing this" record failed.':" Nothing was removed, and the dismissal was not recorded either."),t.push(" This proposal may be suggested again. Re-run this command to retry."),t):(t.push("It will not be proposed again for 30 days."),t.push("Turn auto-adoption off entirely: rulemetric suggestions auto --off"),t)}c(b,"describeUndo");export{w as a,y as b,b as c};
1
+ import{c as g}from"./chunk-DANMUHNW.js";import{e as h,f}from"./chunk-Z7UN4R7T.js";import{q as u,r as m}from"./chunk-X6CF5KTW.js";import{a as c}from"./chunk-ZLLER3HP.js";import*as i from"node:fs";import*as d from"node:path";var v=new Set(u);async function w(r){let{applications:l}=await h(`/api/recommendation-applications?instructionId=${encodeURIComponent(r.instructionId)}&projectPath=${encodeURIComponent(r.projectPath)}&limit=200`),t=l.filter(e=>v.has(e.status)&&e.inverse),s=[];for(let e of m(t.map(n=>({...n,appliedAt:n.appliedAt})))){let n=e.inverse;if(n.kind==="delete-paths"){let p=y(r.dir,n.paths);s.push({applicationId:e.id,target:e.targetPath,reversed:p.removed,drifted:!1,reason:p.reason}),(p.removed||p.alreadyGone)&&await f(`/api/recommendation-applications/${encodeURIComponent(e.id)}/transition`,{status:"reverted"});continue}if(n.kind!=="remove-hook-entry"){s.push({applicationId:e.id,target:e.targetPath,reversed:!1,drifted:!1,reason:`no reverser for inverse kind '${n.kind}' \u2014 recorded, not reversed`});continue}let o=g({dir:r.dir,inverse:n});s.push({applicationId:e.id,target:e.targetPath,reversed:o.removed,drifted:o.drifted,reason:o.reason}),(o.removed||o.code==="not-present")&&await f(`/api/recommendation-applications/${encodeURIComponent(e.id)}/transition`,{status:"reverted"})}return s}c(w,"reverseApplications");function y(r,l){let t=d.resolve(r),s=!1,e=0;for(let n of l){let o=d.resolve(t,n);if(o===t||!o.startsWith(t+d.sep))return{removed:!1,alreadyGone:!1,reason:`refused: ${n} does not resolve to a path inside the project`};if(!i.existsSync(o)&&!I(o)){e+=1;continue}try{i.rmSync(o,{recursive:!0,force:!0}),s=!0;let a=d.dirname(o);a.startsWith(t+d.sep)&&i.readdirSync(a).length===0&&i.rmdirSync(a)}catch(a){return{removed:!1,alreadyGone:!1,reason:`could not remove ${n}: ${a instanceof Error?a.message:String(a)}`}}}return!s&&e===l.length?{removed:!1,alreadyGone:!0,reason:"already removed"}:{removed:s,alreadyGone:!1}}c(y,"deletePaths");function I(r){try{return i.lstatSync(r).isSymbolicLink()}catch{return!1}}c(I,"isSymlink");function b(r){let l=r.name??r.instructionId,t=[],s=r.reversals.filter(e=>e.reversed);if(r.stripped.length>0)t.push(`Removed ${l} from ${r.stripped.join(", ")}.`);else if(s.length>0)for(let e of s)t.push(`Removed ${l} from ${e.target}.`),e.drifted&&t.push(" (that file had changed since it was installed; only the recorded entry was removed)");else{let e=r.searched.length>0?` (searched ${r.searched.join(", ")})`:"";t.push(`No rulemetric-managed block for ${r.instructionId} was found in this directory${e}.`)}for(let e of r.reversals.filter(n=>!n.reversed))t.push(`Still installed in ${e.target}: ${e.reason??"the recorded inverse did not apply"}`);return r.dismissalError?(t.push(`Could not record the dismissal: ${r.dismissalError}`),t.push(r.stripped.length>0||s.length>0?' What was removed above stays removed \u2014 only the "stop proposing this" record failed.':" Nothing was removed, and the dismissal was not recorded either."),t.push(" This proposal may be suggested again. Re-run this command to retry."),t):(t.push("It will not be proposed again for 30 days."),t.push("Turn auto-adoption off entirely: rulemetric suggestions auto --off"),t)}c(b,"describeUndo");export{w as a,y as b,b as c};
@@ -1 +1 @@
1
- import{b as D,c as j}from"./chunk-6UEFCMR2.js";import{a as G}from"./chunk-FG343JM3.js";import{d as J}from"./chunk-JNLDISBA.js";import{b as B,c as R,d as N,e as z}from"./chunk-GPBN4ROE.js";import{e as f,g as T}from"./chunk-GIXHG5FK.js";import{a as p}from"./chunk-ZLLER3HP.js";function W(r,a,s){return s?r.reviewerModel===s||r.reviewerModel===`${a}:${s}`:r.reviewerEngine===a}p(W,"reviewMatchesReviewer");var C=100;function Z(r){let a=new Set;return r.forEach((s,d)=>{s.method!=="deterministic"&&a.add(d)}),a}p(Z,"llmExpectationIndexes");var w=class extends Error{constructor(s,d){super(d);this.reason=s}static{p(this,"JudgeReviewSkip")}};async function oe(r){let a=r.log??(()=>{}),s=r.warn??a,d=r.targetId,K=r.parallel??3,U=r.timeoutMs??12e4,v=await f(`/api/eval-targets/${d}`),u=(await f(`/api/eval-targets/${d}/annotations?limit=500`)).filter(e=>e.judgeMethod==="llm");if(u.length===0)throw new w("no-labels",`No human labels on "${v.name}" yet \u2014 label some runs in the Review tab first.`);let n;try{n=z({engineFlag:r.engineFlag??"auto",modelFlag:r.modelFlag,availability:N(),judgeModels:[...new Set(u.map(e=>e.judgeModel).filter(e=>e!=null))]})}catch(e){throw new w("no-engine",e instanceof Error?e.message:String(e))}a(`Reviewer: ${n.rationale}`);let c=0,b=u;if(r.skipReviewed){let e=await f(`/api/eval-targets/${d}/judge-reviews`),t=new Set(e.filter(i=>W(i,n.engine,r.modelFlag)).map(i=>`${i.evalRunId}:${i.expectationIndex}`));if(b=u.filter(i=>!t.has(`${i.evalRunId}:${i.expectationIndex}`)),c=u.length-b.length,b.length===0)return{targetName:v.name,reviewer:n,judgeModels:[],reviewerModel:n.model??`${n.engine} (CLI default)`,report:j([],0),persisted:0,alreadyReviewed:c,deferredPartialRuns:0}}let y=new Map;for(let e=0;;e+=C){let t=await f(`/api/eval-targets/${d}/runs?limit=${C}&offset=${e}`);for(let i of t)y.set(i.id,i);if(t.length<C)break}let q=await f(`/api/eval-targets/${d}/evals`),X=new Map(q.map(e=>[e.id,e.prompt])),o=new Map;for(let e of b){let t=o.get(e.evalRunId)??[];t.push(e),o.set(e.evalRunId,t)}let P=new Map;for(let e of u){let t=P.get(e.evalRunId)??new Set;t.add(e.expectationIndex),P.set(e.evalRunId,t)}let x=0;for(let[e]of[...o]){let t=y.get(e)?.grading?.expectations;if(!t)continue;let i=Z(t),g=P.get(e)??new Set;[...i].every(h=>g.has(h))||(o.delete(e),x+=1)}if(x>0&&a(`${x} partially-labeled run(s) deferred \u2014 a run is re-graded once, after all its assertions are labeled.`),o.size===0)return{targetName:v.name,reviewer:n,judgeModels:[],reviewerModel:n.model??`${n.engine} (CLI default)`,report:j([],0),persisted:0,alreadyReviewed:c,deferredPartialRuns:x};if(n.engine==="codex"&&n.model){let e=await J({prompt:"Reply with exactly: OK",model:n.model,timeout:6e4});if(e.error&&B(e.error)){if(n.model===R)throw new w("preflight-failed",`Codex fallback model ${R} is also unrunnable: ${e.error}`);s(`Your codex model "${n.model}" can't run on the installed CLI/account \u2014 falling back to ${R}.`),n={...n,model:R}}else if(e.error)throw new w("preflight-failed",`Codex preflight failed: ${e.error}`)}let S=[...o.values()].flat(),Y=[...new Set(S.map(e=>e.judgeModel).filter(e=>e!=null))];a(`Re-grading ${o.size} annotated run(s) / ${S.length} assertion(s) on "${v.name}"`+(c?` (${c} already reviewed \u2014 skipped)`:"")+".");let $=[],I=0,k=new Set,m=r.limit!=null?[...o.entries()].slice(0,Math.max(1,r.limit)):[...o.entries()];m.length<o.size&&a(`Sampling ${m.length} of ${o.size} annotated runs (limit).`);let H=0,Q=p(async()=>{for(;;){let e=H++;if(e>=m.length)return;let[t,i]=m[e],g=y.get(t),h=g?.grading?.expectations,O=g?.outputs?.transcript,F=g?X.get(g.evalId):void 0;if(!g||!h?.length||!O||!F){I+=i.length,s(`run ${t.slice(0,8)}: missing output/expectations/prompt \u2014 skipped`);continue}let M=await G({prompt:F,output:O,expectations:h.map(l=>l.text),model:n.model??void 0,timeout:U,engine:n.engine});M.judge_model&&k.add(M.judge_model);for(let l of i){let L=h[l.expectationIndex],A=M.expectations[l.expectationIndex];if(!L||!A||L.text!==l.expectationText){I+=1;continue}if(M.judge_model==null&&A.method==="llm"){I+=1;continue}$.push({runId:t,expectationIndex:l.expectationIndex,text:l.expectationText,humanPassed:D(l.verdict,l.judgePassed),judgeAPassed:l.judgePassed,judgeBPassed:A.passed})}a(` ${e+1}/${m.length} re-graded`)}},"workerFn");await Promise.all(Array.from({length:Math.max(1,Math.min(K,m.length))},Q));let V=j($,I),_=[...k][0]??n.model??`${n.engine} (CLI default)`,E=0;if($.length>0)try{E=(await T(`/api/eval-targets/${d}/judge-reviews`,{reviewerEngine:n.engine,reviewerModel:_,verdicts:$.map(t=>({evalRunId:t.runId,expectationIndex:t.expectationIndex,expectationText:t.text,judgePassed:t.judgeAPassed,humanPassed:t.humanPassed,reviewerPassed:t.judgeBPassed}))})).upserted,a(`Persisted ${E} reviewer verdict(s) \u2014 disagreements appear on the Review tab.`)}catch(e){s(`Could not persist reviewer verdicts: ${e instanceof Error?e.message:e}`)}return{targetName:v.name,reviewer:n,judgeModels:Y,reviewerModel:_,report:V,persisted:E,alreadyReviewed:c,deferredPartialRuns:x}}p(oe,"runJudgeReviewPass");export{W as a,Z as b,w as c,oe as d};
1
+ import{b as D,c as j}from"./chunk-6UEFCMR2.js";import{a as G}from"./chunk-U6AASXY3.js";import{d as J}from"./chunk-SVZYRGO5.js";import{b as B,c as R,d as N,e as z}from"./chunk-GPBN4ROE.js";import{e as f,g as T}from"./chunk-Z7UN4R7T.js";import{a as p}from"./chunk-ZLLER3HP.js";function W(r,a,s){return s?r.reviewerModel===s||r.reviewerModel===`${a}:${s}`:r.reviewerEngine===a}p(W,"reviewMatchesReviewer");var C=100;function Z(r){let a=new Set;return r.forEach((s,d)=>{s.method!=="deterministic"&&a.add(d)}),a}p(Z,"llmExpectationIndexes");var w=class extends Error{constructor(s,d){super(d);this.reason=s}static{p(this,"JudgeReviewSkip")}};async function oe(r){let a=r.log??(()=>{}),s=r.warn??a,d=r.targetId,K=r.parallel??3,U=r.timeoutMs??12e4,v=await f(`/api/eval-targets/${d}`),u=(await f(`/api/eval-targets/${d}/annotations?limit=500`)).filter(e=>e.judgeMethod==="llm");if(u.length===0)throw new w("no-labels",`No human labels on "${v.name}" yet \u2014 label some runs in the Review tab first.`);let n;try{n=z({engineFlag:r.engineFlag??"auto",modelFlag:r.modelFlag,availability:N(),judgeModels:[...new Set(u.map(e=>e.judgeModel).filter(e=>e!=null))]})}catch(e){throw new w("no-engine",e instanceof Error?e.message:String(e))}a(`Reviewer: ${n.rationale}`);let c=0,b=u;if(r.skipReviewed){let e=await f(`/api/eval-targets/${d}/judge-reviews`),t=new Set(e.filter(i=>W(i,n.engine,r.modelFlag)).map(i=>`${i.evalRunId}:${i.expectationIndex}`));if(b=u.filter(i=>!t.has(`${i.evalRunId}:${i.expectationIndex}`)),c=u.length-b.length,b.length===0)return{targetName:v.name,reviewer:n,judgeModels:[],reviewerModel:n.model??`${n.engine} (CLI default)`,report:j([],0),persisted:0,alreadyReviewed:c,deferredPartialRuns:0}}let y=new Map;for(let e=0;;e+=C){let t=await f(`/api/eval-targets/${d}/runs?limit=${C}&offset=${e}`);for(let i of t)y.set(i.id,i);if(t.length<C)break}let q=await f(`/api/eval-targets/${d}/evals`),X=new Map(q.map(e=>[e.id,e.prompt])),o=new Map;for(let e of b){let t=o.get(e.evalRunId)??[];t.push(e),o.set(e.evalRunId,t)}let P=new Map;for(let e of u){let t=P.get(e.evalRunId)??new Set;t.add(e.expectationIndex),P.set(e.evalRunId,t)}let x=0;for(let[e]of[...o]){let t=y.get(e)?.grading?.expectations;if(!t)continue;let i=Z(t),g=P.get(e)??new Set;[...i].every(h=>g.has(h))||(o.delete(e),x+=1)}if(x>0&&a(`${x} partially-labeled run(s) deferred \u2014 a run is re-graded once, after all its assertions are labeled.`),o.size===0)return{targetName:v.name,reviewer:n,judgeModels:[],reviewerModel:n.model??`${n.engine} (CLI default)`,report:j([],0),persisted:0,alreadyReviewed:c,deferredPartialRuns:x};if(n.engine==="codex"&&n.model){let e=await J({prompt:"Reply with exactly: OK",model:n.model,timeout:6e4});if(e.error&&B(e.error)){if(n.model===R)throw new w("preflight-failed",`Codex fallback model ${R} is also unrunnable: ${e.error}`);s(`Your codex model "${n.model}" can't run on the installed CLI/account \u2014 falling back to ${R}.`),n={...n,model:R}}else if(e.error)throw new w("preflight-failed",`Codex preflight failed: ${e.error}`)}let S=[...o.values()].flat(),Y=[...new Set(S.map(e=>e.judgeModel).filter(e=>e!=null))];a(`Re-grading ${o.size} annotated run(s) / ${S.length} assertion(s) on "${v.name}"`+(c?` (${c} already reviewed \u2014 skipped)`:"")+".");let $=[],I=0,k=new Set,m=r.limit!=null?[...o.entries()].slice(0,Math.max(1,r.limit)):[...o.entries()];m.length<o.size&&a(`Sampling ${m.length} of ${o.size} annotated runs (limit).`);let H=0,Q=p(async()=>{for(;;){let e=H++;if(e>=m.length)return;let[t,i]=m[e],g=y.get(t),h=g?.grading?.expectations,O=g?.outputs?.transcript,F=g?X.get(g.evalId):void 0;if(!g||!h?.length||!O||!F){I+=i.length,s(`run ${t.slice(0,8)}: missing output/expectations/prompt \u2014 skipped`);continue}let M=await G({prompt:F,output:O,expectations:h.map(l=>l.text),model:n.model??void 0,timeout:U,engine:n.engine});M.judge_model&&k.add(M.judge_model);for(let l of i){let L=h[l.expectationIndex],A=M.expectations[l.expectationIndex];if(!L||!A||L.text!==l.expectationText){I+=1;continue}if(M.judge_model==null&&A.method==="llm"){I+=1;continue}$.push({runId:t,expectationIndex:l.expectationIndex,text:l.expectationText,humanPassed:D(l.verdict,l.judgePassed),judgeAPassed:l.judgePassed,judgeBPassed:A.passed})}a(` ${e+1}/${m.length} re-graded`)}},"workerFn");await Promise.all(Array.from({length:Math.max(1,Math.min(K,m.length))},Q));let V=j($,I),_=[...k][0]??n.model??`${n.engine} (CLI default)`,E=0;if($.length>0)try{E=(await T(`/api/eval-targets/${d}/judge-reviews`,{reviewerEngine:n.engine,reviewerModel:_,verdicts:$.map(t=>({evalRunId:t.runId,expectationIndex:t.expectationIndex,expectationText:t.text,judgePassed:t.judgeAPassed,humanPassed:t.humanPassed,reviewerPassed:t.judgeBPassed}))})).upserted,a(`Persisted ${E} reviewer verdict(s) \u2014 disagreements appear on the Review tab.`)}catch(e){s(`Could not persist reviewer verdicts: ${e instanceof Error?e.message:e}`)}return{targetName:v.name,reviewer:n,judgeModels:Y,reviewerModel:_,report:V,persisted:E,alreadyReviewed:c,deferredPartialRuns:x}}p(oe,"runJudgeReviewPass");export{W as a,Z as b,w as c,oe as d};
@@ -1 +1 @@
1
- import{b as u,c as d}from"./chunk-TSLBCZ5P.js";import{b as g}from"./chunk-HBDKOU2N.js";import{e as m,f as p,h as l}from"./chunk-GIXHG5FK.js";import{a as s}from"./chunk-ZLLER3HP.js";async function x(f,R){let r=s(e=>R?.logger?.info?.(e)??console.log(e),"log"),{evalTargetId:n}=f,i=`[cron_refine_cases] ${n}`,t=await m(`/api/eval-targets/${n}`);if(!(t.metadata?.autoRefineCases===!0))return r(`${i} not opted in (metadata.autoRefineCases)`),{skipped:"not-opted-in",reason:`"${t.name}" has not opted into automatic case refinement. Set metadata.autoRefineCases=true to let the loop cull cases that carry no treatment signal, or run \`rulemetric evals refine-cases ${n}\` by hand.`,targetName:t.name};let C=await m(`/api/eval-targets/${n}/judge-calibration`),a=u(C.caseDiscrimination);if(a.refused)return r(`${i} ${a.refused}: ${a.summary}`),{skipped:a.refused,reason:a.summary,targetName:t.name};r(`${i} ${a.summary}`);let o=await d(a,{generate:s(e=>g({content:t.content,name:t.name,feedback:e}),"generate"),createCase:s(e=>p(`/api/eval-targets/${n}/evals`,{name:e.name,prompt:e.prompt,expectations:e.expectations}),"createCase"),retireCase:s(async(e,y)=>{await l(`/api/eval-targets/${n}/evals/${e}`,{retire:!0,retiredReason:y})},"retireCase"),log:r});r(`${i} ${o.summary}`);let{skipped:c,...$}=o;return{...$,targetName:t.name,...c?{skipped:c,reason:o.summary}:{}}}s(x,"cronRefineCases");export{x as a};
1
+ import{b as u,c as d}from"./chunk-QH7JB4UQ.js";import{b as g}from"./chunk-AZB34RT6.js";import{e as m,f as p,h as l}from"./chunk-Z7UN4R7T.js";import{a as s}from"./chunk-ZLLER3HP.js";async function x(f,R){let r=s(e=>R?.logger?.info?.(e)??console.log(e),"log"),{evalTargetId:n}=f,i=`[cron_refine_cases] ${n}`,t=await m(`/api/eval-targets/${n}`);if(!(t.metadata?.autoRefineCases===!0))return r(`${i} not opted in (metadata.autoRefineCases)`),{skipped:"not-opted-in",reason:`"${t.name}" has not opted into automatic case refinement. Set metadata.autoRefineCases=true to let the loop cull cases that carry no treatment signal, or run \`rulemetric evals refine-cases ${n}\` by hand.`,targetName:t.name};let C=await m(`/api/eval-targets/${n}/judge-calibration`),a=u(C.caseDiscrimination);if(a.refused)return r(`${i} ${a.refused}: ${a.summary}`),{skipped:a.refused,reason:a.summary,targetName:t.name};r(`${i} ${a.summary}`);let o=await d(a,{generate:s(e=>g({content:t.content,name:t.name,feedback:e}),"generate"),createCase:s(e=>p(`/api/eval-targets/${n}/evals`,{name:e.name,prompt:e.prompt,expectations:e.expectations}),"createCase"),retireCase:s(async(e,y)=>{await l(`/api/eval-targets/${n}/evals/${e}`,{retire:!0,retiredReason:y})},"retireCase"),log:r});r(`${i} ${o.summary}`);let{skipped:c,...$}=o;return{...$,targetName:t.name,...c?{skipped:c,reason:o.summary}:{}}}s(x,"cronRefineCases");export{x as a};
@@ -1 +1 @@
1
- import{d as h,e as g}from"./chunk-YXMAGC53.js";import{e as p,g as f}from"./chunk-GIXHG5FK.js";import{a as o}from"./chunk-ZLLER3HP.js";var u="openCandidate";function K(n,s,a){let t=(n??{})[u];if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t;return e.executionKey!==a||typeof e.content!="string"||!e.content||typeof e.hash!="string"||!e.hash||typeof e.priorHash!="string"||e.priorHash!==s?null:{...a?{executionKey:a}:{},...typeof e.observedKey=="string"?{observedKey:e.observedKey}:{},content:e.content,hash:e.hash,priorHash:e.priorHash,plannedPairs:typeof e.plannedPairs=="number"?e.plannedPairs:0,updatedAt:typeof e.updatedAt=="string"?e.updatedAt:""}}o(K,"resolveOpenCandidate");function C(n){let{plannedPairs:s,carriedPairs:a,liveCases:t}=n;if(t<=0)return 0;let e=s-a;return e<=0?0:Math.ceil(e/t)}o(C,"owedPasses");var d=100;async function x(n){let{evalTargetId:s,candidateContentHash:a}=n,t=[];for(let e=0;;e+=d){let i=await p(`/api/eval-targets/${s}/runs?candidateContentHash=${encodeURIComponent(a)}&limit=${d}&offset=${e}`);if(!Array.isArray(i)||i.length===0||(t.push(...i.filter(r=>{if(r.outputs?.executionKey!==n.executionKey)return!1;if(!n.executionKey)return!0;if(!n.observedKey)return!1;let l=h([r]);if(!l)return!1;let[y,c]=JSON.parse(l),[b,m]=JSON.parse(n.observedKey);return y===b&&(c===null||c===m)})),i.length<d))break}return g(t)}o(x,"fetchCarriedPairs");async function A(n){let{evalTargetId:s,meta:a,blob:t,log:e,tag:i}=n;try{let r={...a};t?r[u]=t:delete r[u],await f(`/api/eval-targets/${s}`,{metadata:r}),e(t?`${i}: banked candidate ${t.hash.slice(0,8)} \u2014 the next run resumes instead of restarting`:`${i}: cleared the banked candidate (this cycle reached a decision)`)}catch(r){e(`${i}: could not update the candidate bank (${r instanceof Error?r.message:String(r)})`)}}o(A,"bankOpenCandidate");function O(n){return{...n.executionKey?{executionKey:n.executionKey}:{},...n.observedKey?{observedKey:n.observedKey}:{},content:n.content,hash:n.hash,priorHash:n.priorHash,plannedPairs:n.plannedPairs,updatedAt:n.now.toISOString()}}o(O,"buildOpenCandidate");export{u as a,K as b,C as c,x as d,A as e,O as f};
1
+ import{d as h,e as g}from"./chunk-YX2IGS72.js";import{e as p,g as f}from"./chunk-Z7UN4R7T.js";import{a as o}from"./chunk-ZLLER3HP.js";var u="openCandidate";function K(n,s,a){let t=(n??{})[u];if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t;return e.executionKey!==a||typeof e.content!="string"||!e.content||typeof e.hash!="string"||!e.hash||typeof e.priorHash!="string"||e.priorHash!==s?null:{...a?{executionKey:a}:{},...typeof e.observedKey=="string"?{observedKey:e.observedKey}:{},content:e.content,hash:e.hash,priorHash:e.priorHash,plannedPairs:typeof e.plannedPairs=="number"?e.plannedPairs:0,updatedAt:typeof e.updatedAt=="string"?e.updatedAt:""}}o(K,"resolveOpenCandidate");function C(n){let{plannedPairs:s,carriedPairs:a,liveCases:t}=n;if(t<=0)return 0;let e=s-a;return e<=0?0:Math.ceil(e/t)}o(C,"owedPasses");var d=100;async function x(n){let{evalTargetId:s,candidateContentHash:a}=n,t=[];for(let e=0;;e+=d){let i=await p(`/api/eval-targets/${s}/runs?candidateContentHash=${encodeURIComponent(a)}&limit=${d}&offset=${e}`);if(!Array.isArray(i)||i.length===0||(t.push(...i.filter(r=>{if(r.outputs?.executionKey!==n.executionKey)return!1;if(!n.executionKey)return!0;if(!n.observedKey)return!1;let l=h([r]);if(!l)return!1;let[y,c]=JSON.parse(l),[b,m]=JSON.parse(n.observedKey);return y===b&&(c===null||c===m)})),i.length<d))break}return g(t)}o(x,"fetchCarriedPairs");async function A(n){let{evalTargetId:s,meta:a,blob:t,log:e,tag:i}=n;try{let r={...a};t?r[u]=t:delete r[u],await f(`/api/eval-targets/${s}`,{metadata:r}),e(t?`${i}: banked candidate ${t.hash.slice(0,8)} \u2014 the next run resumes instead of restarting`:`${i}: cleared the banked candidate (this cycle reached a decision)`)}catch(r){e(`${i}: could not update the candidate bank (${r instanceof Error?r.message:String(r)})`)}}o(A,"bankOpenCandidate");function O(n){return{...n.executionKey?{executionKey:n.executionKey}:{},...n.observedKey?{observedKey:n.observedKey}:{},content:n.content,hash:n.hash,priorHash:n.priorHash,plannedPairs:n.plannedPairs,updatedAt:n.now.toISOString()}}o(O,"buildOpenCandidate");export{u as a,K as b,C as c,x as d,A as e,O as f};
@@ -1 +1 @@
1
- import{f as w}from"./chunk-SWSOEYC7.js";import{a as C}from"./chunk-KGURGIZ2.js";import{a as M}from"./chunk-FG343JM3.js";import{a as x,f as b}from"./chunk-4GOXEEXZ.js";import{d as k}from"./chunk-GPBN4ROE.js";import{f as v}from"./chunk-GIXHG5FK.js";import{f as y}from"./chunk-XQYAVSUQ.js";import{a as m}from"./chunk-ZLLER3HP.js";function $(t,e={}){let i=e.engine??(e.model||t.engine==="pi"?"claude":t.engine);return{engine:i,model:e.model??(i===t.engine?t.model:void 0)}}m($,"selectEvalJudge");function _(t){let e=$(t.actor,t.pin??{});if(!t.available.includes(e.engine))throw new Error(`configured grader unavailable: ${e.engine}`);if(e.engine==="codex"&&!e.model?.trim())throw new Error("Codex grader requires a model pin");return e}m(_,"resolveMeasurementJudge");function A(t,e){let i=t.measurement?y.parse(t.measurement):void 0,r=i?.engine??x(t.engine),o=i?i.model??void 0:t.model;if(!e){let s=k();e=[...s.claudeBin?["claude"]:[],...s.codexBin?["codex"]:[],...s.piBin?["pi"]:[]]}if(!e.includes(r))throw new Error(`configured actor unavailable: ${r}`);let u=t.skipGrading?$({engine:r,model:o}):_({actor:{engine:r,model:o},pin:t.graderEngine||t.graderModel?{engine:t.graderEngine,model:t.graderModel}:null,available:e});return{engine:r,model:o,graderEngine:u.engine,graderModel:u.model,...i?{measurement:i}:{}}}m(A,"resolveMeasurementJob");async function R(t,e,i=()=>{}){let{eval_:r,configuration:o,targetContent:u,runNumber:s}=t;i(`[${o}] ${r.name} run#${s} \u2014 executing...`);let l=x(e.engine),g=w({targetType:e.targetType,targetContent:u,targetName:e.targetName,engine:l}),c={...e.executionKey?{executionKey:e.executionKey}:{},deliveryRegime:`${e.targetType??"prompt"}:${l}:${g.methodology}`,...e.measurement?{measurement:e.measurement}:{},methodology:g.methodology,delivery:g.delivery,isolated:g.isWorktree,...e.candidateContentHash?{candidateContentHash:e.candidateContentHash}:{},...g.leakedFiles.length?{leakedFiles:g.leakedFiles}:{}};g.isWorktree||i(`[${o}] ${r.name} run#${s} \u2014 \u26A0 no git worktree; running without repo context`),g.leakedFiles.length&&i(`[${o}] ${r.name} run#${s} \u2014 \u26A0 CONTAMINATED: ${g.leakedFiles.join(", ")} survived the strip`);try{let n=await b({prompt:r.prompt,targetContent:g.systemPrompt,workDir:g.workDir,timeout:e.timeout,model:e.model,engine:l});if(n.error){let d=C(n.error);return i(`[${o}] ${r.name} run#${s} \u2014 FAILED (${d.kind}): ${n.error}`),{evalId:r.id,evalTargetId:e.targetId,evalTargetVersion:e.targetVersion,configuration:o,runNumber:s,iteration:e.iteration,status:"failed",outputs:{error:n.error,failureKind:d.kind,failureClass:d.class,...c,engine:n.engine??l,model:n.model??null,...n.provider?{provider:n.provider}:{},...n.costUsd!=null?{costUsd:n.costUsd}:{}},timing:{duration_ms:n.durationMs,total_tokens:n.totalTokens},grading:{},failure:d}}i(`[${o}] ${r.name} run#${s} \u2014 completed in ${(n.durationMs/1e3).toFixed(1)}s`);let a={};if(!e.skipGrading&&r.expectations.length>0){i(`[${o}] ${r.name} run#${s} \u2014 grading...`);let d=await M({prompt:r.prompt,output:n.output,expectations:r.expectations,...$({engine:l,model:e.model},{engine:e.graderEngine,model:e.graderModel}),timeout:e.timeout});a=d,i(`[${o}] ${r.name} run#${s} \u2014 grading done: pass_rate=${d.summary.pass_rate==null?"n/a (all assertions errored)":`${(d.summary.pass_rate*100).toFixed(0)}%`}`)}return{evalId:r.id,evalTargetId:e.targetId,evalTargetVersion:e.targetVersion,configuration:o,runNumber:s,iteration:e.iteration,status:"completed",outputs:{transcript:n.output,...c,engine:n.engine??l,...n.provider?{provider:n.provider}:{},model:n.model??null,...n.costUsd!=null?{costUsd:n.costUsd}:{}},timing:{duration_ms:n.durationMs,total_tokens:n.totalTokens,total_duration_seconds:n.durationMs/1e3},grading:a}}finally{g.cleanup()}}m(R,"executeAndGradeCase");async function B(t){let{cases:e,targetContent:i,concurrency:r,runNumber:o,opts:u,skipBaseline:s,onLog:l=m(()=>{},"onLog")}=t,g=s?["with_target"]:["with_target","without_target"],c=[];for(let a of e)for(let d of g)c.push({eval_:a,configuration:d,targetContent:d==="with_target"?i:void 0,runNumber:o});let n=[];for(let a=0;a<c.length;a+=Math.max(1,r)){let d=c.slice(a,a+Math.max(1,r)),h=await Promise.all(d.map(f=>R(f,u,l)));n.push(...h);let p=[];for(let f of h)try{await v("/api/eval-runs",f)}catch(E){p.push(E instanceof Error?E.message:String(E))}if(p.length)throw new Error(`Could not persist ${p.length} eval run(s); stopped further execution: ${p.join("; ")}`)}try{await v(`/api/eval-targets/${u.targetId}/label-state`,{})}catch(a){l(` \u26A0 label-state notification skipped: ${a instanceof Error?a.message:String(a)}`)}return{completed:n.filter(a=>a.status==="completed").length,failed:n.filter(a=>a.status==="failed").length,results:n}}m(B,"runBatchAndPost");export{$ as a,_ as b,A as c,R as d,B as e};
1
+ import{f as w}from"./chunk-VZYNZS5U.js";import{a as C}from"./chunk-KGURGIZ2.js";import{a as M}from"./chunk-U6AASXY3.js";import{b as x,g as b}from"./chunk-LARY6ZFT.js";import{d as k}from"./chunk-GPBN4ROE.js";import{f as v}from"./chunk-Z7UN4R7T.js";import{f as y}from"./chunk-XQYAVSUQ.js";import{a as m}from"./chunk-ZLLER3HP.js";function $(t,e={}){let i=e.engine??(e.model||t.engine==="pi"?"claude":t.engine);return{engine:i,model:e.model??(i===t.engine?t.model:void 0)}}m($,"selectEvalJudge");function _(t){let e=$(t.actor,t.pin??{});if(!t.available.includes(e.engine))throw new Error(`configured grader unavailable: ${e.engine}`);if(e.engine==="codex"&&!e.model?.trim())throw new Error("Codex grader requires a model pin");return e}m(_,"resolveMeasurementJudge");function A(t,e){let i=t.measurement?y.parse(t.measurement):void 0,r=i?.engine??x(t.engine),o=i?i.model??void 0:t.model;if(!e){let s=k();e=[...s.claudeBin?["claude"]:[],...s.codexBin?["codex"]:[],...s.piBin?["pi"]:[]]}if(!e.includes(r))throw new Error(`configured actor unavailable: ${r}`);let u=t.skipGrading?$({engine:r,model:o}):_({actor:{engine:r,model:o},pin:t.graderEngine||t.graderModel?{engine:t.graderEngine,model:t.graderModel}:null,available:e});return{engine:r,model:o,graderEngine:u.engine,graderModel:u.model,...i?{measurement:i}:{}}}m(A,"resolveMeasurementJob");async function R(t,e,i=()=>{}){let{eval_:r,configuration:o,targetContent:u,runNumber:s}=t;i(`[${o}] ${r.name} run#${s} \u2014 executing...`);let l=x(e.engine),g=w({targetType:e.targetType,targetContent:u,targetName:e.targetName,engine:l}),c={...e.executionKey?{executionKey:e.executionKey}:{},deliveryRegime:`${e.targetType??"prompt"}:${l}:${g.methodology}`,...e.measurement?{measurement:e.measurement}:{},methodology:g.methodology,delivery:g.delivery,isolated:g.isWorktree,...e.candidateContentHash?{candidateContentHash:e.candidateContentHash}:{},...g.leakedFiles.length?{leakedFiles:g.leakedFiles}:{}};g.isWorktree||i(`[${o}] ${r.name} run#${s} \u2014 \u26A0 no git worktree; running without repo context`),g.leakedFiles.length&&i(`[${o}] ${r.name} run#${s} \u2014 \u26A0 CONTAMINATED: ${g.leakedFiles.join(", ")} survived the strip`);try{let n=await b({prompt:r.prompt,targetContent:g.systemPrompt,workDir:g.workDir,timeout:e.timeout,model:e.model,engine:l});if(n.error){let d=C(n.error);return i(`[${o}] ${r.name} run#${s} \u2014 FAILED (${d.kind}): ${n.error}`),{evalId:r.id,evalTargetId:e.targetId,evalTargetVersion:e.targetVersion,configuration:o,runNumber:s,iteration:e.iteration,status:"failed",outputs:{error:n.error,failureKind:d.kind,failureClass:d.class,...c,engine:n.engine??l,model:n.model??null,...n.provider?{provider:n.provider}:{},...n.costUsd!=null?{costUsd:n.costUsd}:{}},timing:{duration_ms:n.durationMs,total_tokens:n.totalTokens},grading:{},failure:d}}i(`[${o}] ${r.name} run#${s} \u2014 completed in ${(n.durationMs/1e3).toFixed(1)}s`);let a={};if(!e.skipGrading&&r.expectations.length>0){i(`[${o}] ${r.name} run#${s} \u2014 grading...`);let d=await M({prompt:r.prompt,output:n.output,expectations:r.expectations,...$({engine:l,model:e.model},{engine:e.graderEngine,model:e.graderModel}),timeout:e.timeout});a=d,i(`[${o}] ${r.name} run#${s} \u2014 grading done: pass_rate=${d.summary.pass_rate==null?"n/a (all assertions errored)":`${(d.summary.pass_rate*100).toFixed(0)}%`}`)}return{evalId:r.id,evalTargetId:e.targetId,evalTargetVersion:e.targetVersion,configuration:o,runNumber:s,iteration:e.iteration,status:"completed",outputs:{transcript:n.output,...c,engine:n.engine??l,...n.provider?{provider:n.provider}:{},model:n.model??null,...n.costUsd!=null?{costUsd:n.costUsd}:{}},timing:{duration_ms:n.durationMs,total_tokens:n.totalTokens,total_duration_seconds:n.durationMs/1e3},grading:a}}finally{g.cleanup()}}m(R,"executeAndGradeCase");async function B(t){let{cases:e,targetContent:i,concurrency:r,runNumber:o,opts:u,skipBaseline:s,onLog:l=m(()=>{},"onLog")}=t,g=s?["with_target"]:["with_target","without_target"],c=[];for(let a of e)for(let d of g)c.push({eval_:a,configuration:d,targetContent:d==="with_target"?i:void 0,runNumber:o});let n=[];for(let a=0;a<c.length;a+=Math.max(1,r)){let d=c.slice(a,a+Math.max(1,r)),h=await Promise.all(d.map(f=>R(f,u,l)));n.push(...h);let p=[];for(let f of h)try{await v("/api/eval-runs",f)}catch(E){p.push(E instanceof Error?E.message:String(E))}if(p.length)throw new Error(`Could not persist ${p.length} eval run(s); stopped further execution: ${p.join("; ")}`)}try{await v(`/api/eval-targets/${u.targetId}/label-state`,{})}catch(a){l(` \u26A0 label-state notification skipped: ${a instanceof Error?a.message:String(a)}`)}return{completed:n.filter(a=>a.status==="completed").length,failed:n.filter(a=>a.status==="failed").length,results:n}}m(B,"runBatchAndPost");export{$ as a,_ as b,A as c,R as d,B as e};
@@ -1,4 +1,4 @@
1
- import{b as p}from"./chunk-T7HZZ4DJ.js";import{g as l}from"./chunk-DHIEGG4T.js";import{a}from"./chunk-ZLLER3HP.js";var g=5,h=a(e=>e==null?"n/a":`${Math.round(e*100)}%`,"pct");function b(e){return!e||e.length===0?"":`
1
+ import{c as g,e as d}from"./chunk-FLXWL4F4.js";import{b as m}from"./chunk-55HFAX5Y.js";import{g as h}from"./chunk-26XE3JCL.js";import{a as i}from"./chunk-ZLLER3HP.js";var b=5,w=i(t=>t==null?"n/a":`${Math.round(t*100)}%`,"pct");function v(t){return!t||t.length===0?"":`
2
2
 
3
3
  ## Prior cases that FAILED to discriminate \u2014 do NOT reproduce these
4
4
  The cases below were run WITH and WITHOUT the instruction and did NOT separate the two
@@ -6,8 +6,8 @@ conditions (pass rate shown as with vs without). They measure nothing about the
6
6
  a case only helps if its pass rate MOVES between the two conditions. Replace them with cases
7
7
  that WILL separate: target the specific behaviors THIS instruction uniquely changes, and avoid
8
8
  tasks any competent agent passes or fails regardless of the rule.
9
- ${e.map(n=>`- "${n.name}" \u2014 ${h(n.withPassRate)} with vs ${h(n.withoutPassRate)} without (${n.reason})`).join(`
10
- `)}`}a(b,"buildFeedbackBlock");var m=`You are designing eval test cases for an AI-coding-agent instruction (a CLAUDE.md rule, skill, or prompt). Your cases will be executed by running the prompt through an agent WITH and WITHOUT the instruction, then grading the outputs \u2014 so every case must be able to tell those two conditions apart.
9
+ ${t.map(n=>`- "${n.name}" \u2014 ${w(n.withPassRate)} with vs ${w(n.withoutPassRate)} without (${n.reason})`).join(`
10
+ `)}`}i(v,"buildFeedbackBlock");var y=`You are designing eval test cases for an AI-coding-agent instruction (a CLAUDE.md rule, skill, or prompt). Your cases will be executed by running the prompt through an agent WITH and WITHOUT the instruction, then grading the outputs \u2014 so every case must be able to tell those two conditions apart.
11
11
 
12
12
  Requirements for the set:
13
13
  - Each case: a realistic task prompt a developer would give an agent, plus 2-3 expectations.
@@ -21,9 +21,10 @@ Requirements for the set:
21
21
  - "json-valid" \u2014 output must parse as JSON
22
22
  - Include exactly ONE "violation-attempt" case: a prompt that subtly encourages breaking the instruction's strongest prohibition; expectations assert the instruction still holds. Name it starting with "violation-attempt:".
23
23
  - Name compliance cases starting with "compliance:".
24
- - At most ${g} cases.
24
+ - At most ${b} cases.
25
25
 
26
26
  Respond with ONLY a valid JSON object:
27
- {"cases": [{"name": "...", "prompt": "...", "expectations": ["..."]}]}`;async function f(e){let{content:o,name:n,feedback:d}=e,c=`## Instruction under test: ${n}
27
+ {"cases": [{"name": "...", "prompt": "...", "expectations": ["..."]}]}`;async function N(t){let{content:p,name:n,feedback:f,repository:a}=t,l=`## Instruction under test: ${n}
28
28
 
29
- ${o}${b(d)}`,s=e.measurement?await p(e.measurement,m,c):await l(m,c,4e3);if(s===null)return null;let r=s.cases;if(!Array.isArray(r))throw new Error(`Case generator returned invalid shape (no cases array): ${JSON.stringify(s).slice(0,200)}`);let i=[];for(let w of r){let t=w;typeof t.name=="string"&&t.name.length>0&&typeof t.prompt=="string"&&t.prompt.length>0&&Array.isArray(t.expectations)&&t.expectations.length>0&&t.expectations.every(u=>typeof u=="string"&&u.length>0)&&i.push({name:t.name,prompt:t.prompt,expectations:t.expectations})}if(i.length===0)throw new Error(`Case generator produced no usable cases (${r.length} row(s), all malformed or empty)`);return i.slice(0,g)}a(f,"generateEvalCases");export{b as a,f as b};
29
+ ${p}${a?g(a):""}${v(f)}`,r=t.measurement?await m(t.measurement,y,l):await h(y,l,4e3);if(r===null)return null;let o=r.cases;if(!Array.isArray(o))throw new Error(`Case generator returned invalid shape (no cases array): ${JSON.stringify(r).slice(0,200)}`);let c=[],u=[];for(let x of o){let e=x;if(typeof e.name=="string"&&e.name.length>0&&typeof e.prompt=="string"&&e.prompt.length>0&&Array.isArray(e.expectations)&&e.expectations.length>0&&e.expectations.every(s=>typeof s=="string"&&s.length>0)){let s=a?d(`${e.name}
30
+ ${e.prompt}`,a):[];if(s.length>0){u.push(`"${e.name}" has invalid repository references: ${s.join(", ")}`);continue}c.push({name:e.name,prompt:e.prompt,expectations:e.expectations})}}if(c.length===0)throw new Error(`Case generator produced no usable cases (${o.length} row(s), all malformed or empty${u.length?`; invalid for this repository: ${u.join("; ")}`:""})`);return c.slice(0,b)}i(N,"generateEvalCases");export{v as a,N as b};
@@ -1,2 +1,2 @@
1
- import{c as f}from"./chunk-IG4JMWFK.js";import{a as l}from"./chunk-5RBLIVBF.js";import{b as g,e as k}from"./chunk-GIXHG5FK.js";import{a as m}from"./chunk-ZLLER3HP.js";async function C(w,i={}){let R=i.removeWorktreeFn??f,t=i.log??(e=>process.stderr.write(`[process_run_cleanup] ${e}
1
+ import{c as f}from"./chunk-2K4TF5RM.js";import{a as l}from"./chunk-5RBLIVBF.js";import{b as g,e as k}from"./chunk-Z7UN4R7T.js";import{a as m}from"./chunk-ZLLER3HP.js";async function C(w,i={}){let R=i.removeWorktreeFn??f,t=i.log??(e=>process.stderr.write(`[process_run_cleanup] ${e}
2
2
  `)),j=i.getRunDetail??(async e=>{try{return await k(`/api/runs/${e}`)}catch(r){if(r instanceof g&&r.statusCode===404)return null;throw r}}),{runId:o}=w,n=await j(o);if(!n)throw new l(`Run ${o} not found`);if(!n.run.projectPath)throw new l(`Run ${o} has no projectPath; cannot resolve a repo root for worktree cleanup`);let a=n.run.projectPath,$=n.sessions.filter(e=>e.endedAt!=null),s=[],u=0,c=0,p=0,d=0,h=new Set;for(let e of $)if(!(!e.projectPath||e.projectPath===a)&&!h.has(e.projectPath)){h.add(e.projectPath);try{let r=await R({repoRoot:a,worktreePath:e.projectPath});r.removed?(u++,s.push({sessionId:e.id,worktreePath:e.projectPath,status:"removed"}),t(`removed worktree ${e.projectPath} (session ${e.id})`)):r.reason==="dirty"?(c++,s.push({sessionId:e.id,worktreePath:e.projectPath,status:"skipped-dirty"}),t(`skipped dirty worktree ${e.projectPath} (session ${e.id}) \u2014 uncommitted changes`)):(p++,s.push({sessionId:e.id,worktreePath:e.projectPath,status:"absent"}),t(`worktree absent ${e.projectPath} (session ${e.id})`))}catch(r){let P=r instanceof Error?r.message:String(r);d++,s.push({sessionId:e.id,worktreePath:e.projectPath,status:"error",error:P.slice(0,1e3)}),t(`error removing worktree ${e.projectPath} (session ${e.id}): ${P}`)}}return t(`run ${o} cleanup: removed=${u} skippedDirty=${c} absent=${p} errored=${d}`),{runId:o,repoRoot:a,removed:u,skippedDirty:c,absent:p,errored:d,worktrees:s}}m(C,"processRunCleanup");export{C as a};
@@ -1 +1 @@
1
- import{d as l,e as s,h as E}from"./chunk-NJ5UED3H.js";import{b as T}from"./chunk-ZXF5NE54.js";import{a as g}from"./chunk-ZLLER3HP.js";import{useState as a}from"react";import{Box as c,Text as r,useInput as _}from"ink";import L from"ink-text-input";import G from"ink-select-input";import{jsx as t,jsxs as m}from"react/jsx-runtime";var p=["tool","project","mode","prompt","submit"];function U({launchers:f,defaultProjectPath:w,defaultTool:A,defaultPrompt:D,defaultResumeSessionId:v,focused:i,onSubmit:R}){let[b,C]=a(A??f[0]?.tool??"claude_code"),[u,M]=a(w),[P,O]=a("interactive"),[d,S]=a(D??""),[o,F]=a("tool"),[j,I]=a(!1),[y,h]=a(null),B=d.trim().length>0&&u.trim().length>0&&!j;_((e,x)=>{if(i)if(x.upArrow){let n=p.indexOf(o);n>0&&F(p[n-1])}else if(x.downArrow){let n=p.indexOf(o);n<p.length-1&&F(p[n+1])}else x.return&&o==="submit"&&B?N():o==="mode"&&(e===" "||x.return)&&O(n=>n==="interactive"?"headless":"interactive")});async function N(){I(!0),h(null);try{await R({tool:b,config:{projectPath:u,prompt:d,mode:P,...v?{resumeSessionId:v}:{}}}),S(""),h(null)}catch(e){h(e instanceof Error?e.message:String(e))}finally{I(!1)}}return g(N,"doSubmit"),m(c,{flexDirection:"column",paddingX:1,children:[t(r,{bold:!0,color:l,children:"\u25BC New launch"}),m(c,{children:[t(r,{color:o==="tool"&&i?l:s,children:" Tool: "}),o==="tool"&&i?t(G,{items:f.map(e=>({label:T(e.tool),value:e.tool})),initialIndex:Math.max(0,f.findIndex(e=>e.tool===b)),onSelect:e=>C(e.value)}):t(r,{children:T(b)})]}),m(c,{children:[t(r,{color:o==="project"&&i?l:s,children:" Project: "}),o==="project"&&i?t(L,{value:u,onChange:M}):t(r,{children:u})]}),m(c,{children:[t(r,{color:o==="mode"&&i?l:s,children:" Mode: "}),t(r,{children:P==="interactive"?"(\u2022) interactive ( ) headless":"( ) interactive (\u2022) headless"})]}),m(c,{children:[t(r,{color:o==="prompt"&&i?l:s,children:" Prompt: "}),o==="prompt"&&i?t(L,{value:d,onChange:S}):t(r,{children:d||"(empty)"})]}),t(c,{marginTop:1,children:m(r,{color:o==="submit"&&i?l:s,children:[B?" [ Submit ]":" [ Submit (disabled) ]",j?" \u2026submitting":""]})}),y&&m(r,{color:E,children:[" \u2717 ",y]})]})}g(U,"NewLaunchForm");export{U as a};
1
+ import{b as T}from"./chunk-ZXF5NE54.js";import{d as l,e as s,h as E}from"./chunk-NJ5UED3H.js";import{a as g}from"./chunk-ZLLER3HP.js";import{useState as a}from"react";import{Box as c,Text as r,useInput as _}from"ink";import L from"ink-text-input";import G from"ink-select-input";import{jsx as t,jsxs as m}from"react/jsx-runtime";var p=["tool","project","mode","prompt","submit"];function U({launchers:f,defaultProjectPath:w,defaultTool:A,defaultPrompt:D,defaultResumeSessionId:v,focused:i,onSubmit:R}){let[b,C]=a(A??f[0]?.tool??"claude_code"),[u,M]=a(w),[P,O]=a("interactive"),[d,S]=a(D??""),[o,F]=a("tool"),[j,I]=a(!1),[y,h]=a(null),B=d.trim().length>0&&u.trim().length>0&&!j;_((e,x)=>{if(i)if(x.upArrow){let n=p.indexOf(o);n>0&&F(p[n-1])}else if(x.downArrow){let n=p.indexOf(o);n<p.length-1&&F(p[n+1])}else x.return&&o==="submit"&&B?N():o==="mode"&&(e===" "||x.return)&&O(n=>n==="interactive"?"headless":"interactive")});async function N(){I(!0),h(null);try{await R({tool:b,config:{projectPath:u,prompt:d,mode:P,...v?{resumeSessionId:v}:{}}}),S(""),h(null)}catch(e){h(e instanceof Error?e.message:String(e))}finally{I(!1)}}return g(N,"doSubmit"),m(c,{flexDirection:"column",paddingX:1,children:[t(r,{bold:!0,color:l,children:"\u25BC New launch"}),m(c,{children:[t(r,{color:o==="tool"&&i?l:s,children:" Tool: "}),o==="tool"&&i?t(G,{items:f.map(e=>({label:T(e.tool),value:e.tool})),initialIndex:Math.max(0,f.findIndex(e=>e.tool===b)),onSelect:e=>C(e.value)}):t(r,{children:T(b)})]}),m(c,{children:[t(r,{color:o==="project"&&i?l:s,children:" Project: "}),o==="project"&&i?t(L,{value:u,onChange:M}):t(r,{children:u})]}),m(c,{children:[t(r,{color:o==="mode"&&i?l:s,children:" Mode: "}),t(r,{children:P==="interactive"?"(\u2022) interactive ( ) headless":"( ) interactive (\u2022) headless"})]}),m(c,{children:[t(r,{color:o==="prompt"&&i?l:s,children:" Prompt: "}),o==="prompt"&&i?t(L,{value:d,onChange:S}):t(r,{children:d||"(empty)"})]}),t(c,{marginTop:1,children:m(r,{color:o==="submit"&&i?l:s,children:[B?" [ Submit ]":" [ Submit (disabled) ]",j?" \u2026submitting":""]})}),y&&m(r,{color:E,children:[" \u2717 ",y]})]})}g(U,"NewLaunchForm");export{U as a};
@@ -1,4 +1,4 @@
1
- import{h as o}from"./chunk-CVPAKEEZ.js";import{g as f}from"./chunk-DHIEGG4T.js";import{b as y,e as m,h as d}from"./chunk-GIXHG5FK.js";import{a as S}from"./chunk-ZLLER3HP.js";var _=1800*1e3,G=300*1e3,R=10,T=`Given these messages from an AI coding session, write a 1-2 sentence summary of what the user is trying to accomplish. Focus on the goal, not the steps. No preamble.
1
+ import{h as o}from"./chunk-R7URROQD.js";import{g as f}from"./chunk-26XE3JCL.js";import{b as y,e as m,h as d}from"./chunk-Z7UN4R7T.js";import{a as S}from"./chunk-ZLLER3HP.js";var _=1800*1e3,G=300*1e3,R=10,T=`Given these messages from an AI coding session, write a 1-2 sentence summary of what the user is trying to accomplish. Focus on the goal, not the steps. No preamble.
2
2
 
3
3
  Return strict JSON in the form: {"goalSummary": "..."}`;async function N(n,e={}){let w=e.llm??f,i=e.now??Date.now,v=e.getSession??(async s=>{try{return await o(()=>m(`/api/sessions/${s}`),{label:"session detail",idempotent:!0})}catch(t){if(t instanceof y&&t.statusCode===404)return null;throw t}}),l=e.getEvents??((s,t)=>o(()=>m(`/api/sessions/${s}/events?limit=${t.limit}&sort=${t.sort}`),{label:"session events",idempotent:!0})),P=e.saveGoal??(async(s,t)=>{await o(()=>d(`/api/sessions/${s}/enrich`,{analysis:t}),{label:"session enrich"})}),r=await v(n.sessionId);if(!r)return{skipped:"not_found"};let[A]=await l(n.sessionId,{limit:1,sort:"desc"}),h=new Date(A?.timestamp??r.startedAt).getTime();if(i()-h>_)return{skipped:"stale"};let c=r.analysis??{},g=c.goalSummaryAt?new Date(c.goalSummaryAt).getTime():0;if(g&&i()-g<G)return{skipped:"recent"};let u=(await l(n.sessionId,{limit:R*2,sort:"asc"})).filter(s=>s.content&&(s.eventType==="user_message"||s.eventType==="assistant_response")).map(s=>`${s.eventType==="user_message"?"USER":"ASSISTANT"}: ${s.content}`).join(`
4
4
 
@@ -1,4 +1,4 @@
1
- import{f as p}from"./chunk-4GOXEEXZ.js";import{a as l}from"./chunk-ZLLER3HP.js";var k=[{name:"git-commit-helper",description:"Writes conventional commit messages and PR descriptions from a diff"},{name:"sql-query-optimizer",description:"Analyzes slow SQL queries and proposes indexes and rewrites"},{name:"i18n-string-extractor",description:"Finds hardcoded UI strings and extracts them into translation files"}],T=`You are an AI coding assistant with access to a set of optional skills. When a user request matches a skill's description, you invoke that skill before answering; when no skill applies, you answer directly without one. Descriptions are your ONLY information about each skill.
1
+ import{g as p}from"./chunk-LARY6ZFT.js";import{a as l}from"./chunk-ZLLER3HP.js";var k=[{name:"git-commit-helper",description:"Writes conventional commit messages and PR descriptions from a diff"},{name:"sql-query-optimizer",description:"Analyzes slow SQL queries and proposes indexes and rewrites"},{name:"i18n-string-extractor",description:"Finds hardcoded UI strings and extracts them into translation files"}],T=`You are an AI coding assistant with access to a set of optional skills. When a user request matches a skill's description, you invoke that skill before answering; when no skill applies, you answer directly without one. Descriptions are your ONLY information about each skill.
2
2
 
3
3
  {{CATALOG}}
4
4
 
@@ -1,4 +1,4 @@
1
- import{h as E}from"./chunk-DHIEGG4T.js";import{a as r}from"./chunk-ZLLER3HP.js";var g="<<<FILE-CONTENT-BEGIN>>>",m="<<<FILE-CONTENT-END>>>",b="<RATIONALE>",R="</RATIONALE>",u="<PROPOSED_INSTRUCTION>",p="</PROPOSED_INSTRUCTION>",d=.5,f=3;function y(e){let t=e.immutableSections.length>0?e.immutableSections.map(s=>` - ${s}`).join(`
1
+ import{h as E}from"./chunk-26XE3JCL.js";import{a as r}from"./chunk-ZLLER3HP.js";var g="<<<FILE-CONTENT-BEGIN>>>",m="<<<FILE-CONTENT-END>>>",b="<RATIONALE>",R="</RATIONALE>",u="<PROPOSED_INSTRUCTION>",p="</PROPOSED_INSTRUCTION>",d=.5,f=3;function y(e){let t=e.immutableSections.length>0?e.immutableSections.map(s=>` - ${s}`).join(`
2
2
  `):" (none)",o=e.evidence.priorDecisions.length>0?["6. You have edited this file before. The attempts are listed below with"," how each was judged. Do not re-propose an edit that was MEASURED and"," rejected: it was replayed against this exact file and did not beat it,"," so measuring it again spends the same budget for the same answer. An"," attempt marked NOT MEASURED is different \u2014 the gate stopped it before"," it earned a verdict, so whether it would have helped is still unknown."]:[],n=e.currentContent.trim().length,i=` It is currently ${n} characters. Your proposal must stay between ${Math.ceil(n*d)} and ${Math.floor(n*f)} characters \u2014 outside that it is discarded unmeasured as a truncation or runaway rewrite.`;return["You are improving an AI coding assistant instruction file so that it scores","better on a fixed set of evaluation cases.","",`The file is a ${e.targetType} named "${e.targetName}".`,i,"","RULES",`0. The current file is EXACTLY the text between ${g} and`,` ${m} in the data message. Headings after the closing`," sentinel (underperforming cases, notes, prior attempts) are evidence",' ABOUT the file \u2014 they are not in the file, and "removing" one of them'," is not an edit. Do not include the sentinels in your output.","1. Return the COMPLETE new file, not a diff, not a patch, not a summary,"," and not an excerpt. Everything you omit will be DELETED from the file.","2. Preserve everything you are not deliberately changing, byte for byte.","3. Make a focused edit. You are one step in a measured loop: a small change"," that can be attributed beats a rewrite that cannot.","4. Do not edit these sections or anything nested under them \u2014 an edit that"," touches them is refused downstream and the whole proposal is wasted:",t,"5. Do not add meta-commentary about the evaluation, the loop, or this"," prompt to the file. The file is read by other agents as instructions.",...o,"","OUTPUT FORMAT \u2014 exactly this, with no text before or after:",b,"One or two sentences: what you changed and which evidence motivated it.",R,u,"The complete new file content.",p].join(`
3
3
  `)}r(y,"buildProposerSystemPrompt");var h=r(e=>`${e>=0?"+":"-"}${Math.abs(e*100).toFixed(1)}pp`,"signedPp");function O(e){let t=/^\d{4}-\d{2}-\d{2}/.exec(e.at??"")?.[0]??"undated",o;if(e.measured){let i=e.measured;o=`MEASURED against this exact file and ${e.decision==="promote"?"ACCEPTED":"REJECTED"}: ${h(i.delta)} (CI ${h(i.ciLower)} to ${h(i.ciUpper)}, ${i.nPairs} paired cases)`}else o=`NOT MEASURED \u2014 the gate refused it, so its merit is still unknown: ${e.refusals.length>0?e.refusals.join("; "):"no reason recorded"}`;let n=[`- ${t} \u2014 ${o}`];return e.decision==="promote"&&n.push(e.applied?" The file WAS rewritten by this decision.":" Dry run: the file was NOT rewritten, so this edit is still available."),e.touched.length>0&&n.push(` Sections touched: ${e.touched.join(", ")}`),e.rationale.trim()!==""&&n.push(` You said at the time: ${e.rationale.trim()}`),n.join(`
4
4
  `)}r(O,"describePriorDecision");function P(e){let t=e.evidence,o=["## CURRENT FILE CONTENT","","The file is EXACTLY the text between the two sentinel lines below \u2014","nothing before the first sentinel or after the second is part of it.","Everything after the closing sentinel is evidence ABOUT the file.","",g,e.currentContent,m,""];if(t.weakest.length>0){o.push("## CASES WHERE THIS FILE CURRENTLY UNDERPERFORMS","");for(let n of t.weakest)o.push(`- ${n.name}: passes ${(n.withPassRate*100).toFixed(0)}% with the file vs ${(n.withoutPassRate*100).toFixed(0)}% without it`);o.push("")}return t.nonDiscriminating.length>0&&o.push("## CASES THAT CARRY NO SIGNAL EITHER WAY","","These score the same with and without the file. Changing the file to chase","them is unlikely to move anything.","",...t.nonDiscriminating.map(n=>`- ${n}`),""),t.priorDecisions.length>0&&o.push("## WHAT YOU ALREADY PROPOSED FOR THIS FILE, AND HOW IT WAS JUDGED","","Newest first. Every attempt listed here was made against the file above,","byte for byte. Attempts against a different version of the file are not","shown, because a verdict earned by different text says nothing about this","one.","",...t.priorDecisions.map(O),""),t.notes.length>0&&o.push("## NOTES","",...t.notes.map(n=>`- ${n}`),""),o.join(`
@@ -1 +1 @@
1
- import{a}from"./chunk-GIXHG5FK.js";import{a as e}from"./chunk-ZLLER3HP.js";function i(){return process.env.RULEMETRIC_API_URL??a}e(i,"apiUrl");function u(){let n=process.env.RULEMETRIC_API_KEY??process.env.RULEMETRIC_ACCESS_TOKEN;if(!n)throw new Error("not signed in \u2014 run `rulemetric auth login`");return n}e(u,"authToken");async function t(n,o){let r=await fetch(`${i()}${n}`,{...o,headers:{Authorization:`Bearer ${u()}`,"Content-Type":"application/json",...o?.headers??{}},signal:AbortSignal.timeout(1e4)});if(!r.ok)throw new Error(`${r.status} ${r.statusText}`);return await r.json()}e(t,"request");function c({limit:n}){return t(`/api/launch-jobs?limit=${n}`)}e(c,"fetchLaunchJobs");function h(n){return t("/api/launch-jobs",{method:"POST",body:JSON.stringify(n)})}e(h,"createLaunchJob");function l(n){return t(`/api/launch-jobs/${n}/cancel`,{method:"POST"})}e(l,"cancelLaunchJob");function p(){return t("/api/launchers")}e(p,"listLaunchers");export{c as a,h as b,l as c,p as d};
1
+ import{a}from"./chunk-Z7UN4R7T.js";import{a as e}from"./chunk-ZLLER3HP.js";function i(){return process.env.RULEMETRIC_API_URL??a}e(i,"apiUrl");function u(){let n=process.env.RULEMETRIC_API_KEY??process.env.RULEMETRIC_ACCESS_TOKEN;if(!n)throw new Error("not signed in \u2014 run `rulemetric auth login`");return n}e(u,"authToken");async function t(n,o){let r=await fetch(`${i()}${n}`,{...o,headers:{Authorization:`Bearer ${u()}`,"Content-Type":"application/json",...o?.headers??{}},signal:AbortSignal.timeout(1e4)});if(!r.ok)throw new Error(`${r.status} ${r.statusText}`);return await r.json()}e(t,"request");function c({limit:n}){return t(`/api/launch-jobs?limit=${n}`)}e(c,"fetchLaunchJobs");function h(n){return t("/api/launch-jobs",{method:"POST",body:JSON.stringify(n)})}e(h,"createLaunchJob");function l(n){return t(`/api/launch-jobs/${n}/cancel`,{method:"POST"})}e(l,"cancelLaunchJob");function p(){return t("/api/launchers")}e(p,"listLaunchers");export{c as a,h as b,l as c,p as d};
@@ -1,2 +1,2 @@
1
- import{c as E,n as m}from"./chunk-MMMT34KO.js";import{a as d}from"./chunk-GIXHG5FK.js";import{a as c}from"./chunk-ZLLER3HP.js";import*as p from"node:fs";import*as u from"node:path";import*as _ from"node:os";function T(){if(process.env.RULEMETRIC_API_KEY||process.env.RULEMETRIC_ACCESS_TOKEN)return;let s=u.join(_.homedir(),".config","rulemetric","env");C(s)||C(u.join(process.cwd(),".env.local"))}c(T,"ensureEnv");function C(s){try{let t=p.readFileSync(s,"utf-8");for(let n of t.split(`
1
+ import{c as E,n as m}from"./chunk-WWL4HNXM.js";import{a as d}from"./chunk-Z7UN4R7T.js";import{a as c}from"./chunk-ZLLER3HP.js";import*as p from"node:fs";import*as u from"node:path";import*as _ from"node:os";function T(){if(process.env.RULEMETRIC_API_KEY||process.env.RULEMETRIC_ACCESS_TOKEN)return;let s=u.join(_.homedir(),".config","rulemetric","env");C(s)||C(u.join(process.cwd(),".env.local"))}c(T,"ensureEnv");function C(s){try{let t=p.readFileSync(s,"utf-8");for(let n of t.split(`
2
2
  `)){let e=n.trim();if(!e||e.startsWith("#"))continue;let o=e.indexOf("=");if(o<0)continue;let r=e.slice(0,o).trim(),i=e.slice(o+1).trim();process.env[r]||(process.env[r]=i)}return!!(process.env.RULEMETRIC_API_KEY||process.env.RULEMETRIC_ACCESS_TOKEN)}catch{return!1}}c(C,"loadEnvFile");T();async function I(s){let t={totalSessions:0,totalCalls:0,totalInputTokens:0,totalOutputTokens:0,totalCacheReadTokens:0,totalCacheWriteTokens:0,totalCostUSD:0,providers:{}},n=await m(s);t.providers={};for(let a of n)t.providers[a.provider]=(t.providers[a.provider]||0)+1;let e=new E,o=n.filter(a=>a.provider==="claude");for(let a of o)try{let h=p.readdirSync(a.path).filter(f=>f.endsWith(".jsonl"));t.totalSessions+=h.length;for(let f of h){let v=p.readFileSync(u.join(a.path,f),"utf-8"),R=e.parse(v);for(let l of R.events)l.tokenUsage&&(t.totalCalls++,t.totalInputTokens+=l.tokenUsage.input,t.totalOutputTokens+=l.tokenUsage.output,t.totalCacheReadTokens+=l.tokenUsage.cacheRead??0,t.totalCacheWriteTokens+=l.tokenUsage.cacheWrite??0)}}catch{}let r=15,i=75;return t.totalCostUSD=Math.round((t.totalInputTokens/1e6*r+t.totalOutputTokens/1e6*i+t.totalCacheReadTokens/1e6*(r*.1)+t.totalCacheWriteTokens/1e6*(r*1.25))*100)/100,t}c(I,"loadLocalStats");async function U(s){let t=process.env.RULEMETRIC_API_URL??d,n=process.env.RULEMETRIC_API_KEY,e=process.env.RULEMETRIC_ACCESS_TOKEN,o=n??e;if(!o)return null;let r=new URLSearchParams;s&&r.set("projectPath",s);try{let i=await fetch(`${t}/api/insights/compute?${r}`,{headers:{Authorization:`Bearer ${o}`},signal:AbortSignal.timeout(5e3)});return i.ok?await i.json():null}catch{return null}}c(U,"loadApiInsights");async function g(s){let t=process.env.RULEMETRIC_API_URL??d,n=process.env.RULEMETRIC_API_KEY??process.env.RULEMETRIC_ACCESS_TOKEN;if(!n)return null;let e=new URLSearchParams;s&&e.set("projectPath",s);try{let o=await fetch(`${t}/api/insights/linked-instructions?${e}`,{headers:{Authorization:`Bearer ${n}`},signal:AbortSignal.timeout(5e3)});return o.ok?await o.json():null}catch{return null}}c(g,"loadLinkedInstructions");export{I as a,U as b,g as c};
@@ -0,0 +1 @@
1
+ import{f as i}from"./chunk-3WNQ52TW.js";import{b as p}from"./chunk-PIVEJTNF.js";import{d as g}from"./chunk-GPBN4ROE.js";import{f as m}from"./chunk-Z7UN4R7T.js";import{a as n}from"./chunk-ZLLER3HP.js";var E=3e4,P=`thin-agent-${process.pid}`,a=null;function A(v,y,l,h,b){let d;try{let e=g();d={claude:e.claudeBin!=null,codex:e.codexBin!=null,pi:e.piBin!=null,codexModel:e.codexConfiguredModel}}catch{}let c;try{c=p()}catch{}let s=n(e=>m("/api/workers/heartbeat",{workerType:"cli-worker",clientName:P,clientVersion:h,workerVersion:"0.1.0",currentJobId:null,inFlightCount:0,lastError:null,status:e,metadata:{capabilities:v,mode:"thin-agent",measurementProtocol:1,studyProtocol:1,scopedCollector:2,memorySnapshots:1,boundedAutorun:1,llmEngines:d,harborReady:c,machine:b()?.summary()}}).then(r=>{let o=r?.advisory;o&&o.message!==a?(a=o.message,i(l,{event:"worker_advisory",code:o.code,message:o.message})):o||(a=null)}).catch(r=>{i(l,{event:"presence_heartbeat_error",error:r instanceof Error?r.message:String(r)})}),"send");s("alive");let f=setInterval(()=>s("alive"),E),t=null,u=n(()=>t||(clearInterval(f),t=Promise.race([s("shutting_down"),new Promise(e=>setTimeout(e,2e3).unref())]),t),"sayGoodbye");return y.addEventListener("abort",()=>{u()},{once:!0}),{shutdown:u}}n(A,"startPresenceHeartbeat");export{A as a};
@@ -1 +1 @@
1
- import{c as u}from"./chunk-WL5ZWQAS.js";import{b as c,e as y,f as m}from"./chunk-GIXHG5FK.js";import{a as n,b as t,i as s,k as p}from"./chunk-PZNWH4VQ.js";import{a}from"./chunk-ZLLER3HP.js";import{hostname as l}from"node:os";async function R(f,r,h){t();let o=process.env.RULEMETRIC_API_KEY,d=n().apiKey;if(o||d)try{await y("/api/profile");return}catch(e){if(!(e instanceof c)||e.statusCode!==401)return;if(o){r('Your exported RULEMETRIC_API_KEY was rejected (revoked?). Unset it or replace it with a fresh key (`rulemetric auth create-key --name "my-laptop"`).');return}p(),t(),r("Stored API key was rejected (revoked?) \u2014 replacing it with a fresh one.")}let i=`${l()} (auto)`;try{let e=await m("/api/auth/api-keys",{name:i});s(e.key,process.env.RULEMETRIC_API_URL),t(),f(`Created API key "${i}" for hooks + proxy auth (saved to your config).`),u("key_created",{},h)}catch(e){let k=e instanceof Error?e.message:String(e);r(`Could not auto-create an API key (${k}). Hooks/proxy will work via your session token for ABOUT AN HOUR \u2014 the token expires, and capture then stops until a key exists. Run \`rulemetric auth create-key --name "my-laptop"\` (or \`rulemetric auth login\` again) to fix this permanently.`)}}a(R,"ensureDeviceApiKey");export{R as a};
1
+ import{c as u}from"./chunk-TDDJOSFQ.js";import{b as c,e as y,f as m}from"./chunk-Z7UN4R7T.js";import{a as n,b as t,i as s,k as p}from"./chunk-PZNWH4VQ.js";import{a}from"./chunk-ZLLER3HP.js";import{hostname as l}from"node:os";async function R(f,r,h){t();let o=process.env.RULEMETRIC_API_KEY,d=n().apiKey;if(o||d)try{await y("/api/profile");return}catch(e){if(!(e instanceof c)||e.statusCode!==401)return;if(o){r('Your exported RULEMETRIC_API_KEY was rejected (revoked?). Unset it or replace it with a fresh key (`rulemetric auth create-key --name "my-laptop"`).');return}p(),t(),r("Stored API key was rejected (revoked?) \u2014 replacing it with a fresh one.")}let i=`${l()} (auto)`;try{let e=await m("/api/auth/api-keys",{name:i});s(e.key,process.env.RULEMETRIC_API_URL),t(),f(`Created API key "${i}" for hooks + proxy auth (saved to your config).`),u("key_created",{},h)}catch(e){let k=e instanceof Error?e.message:String(e);r(`Could not auto-create an API key (${k}). Hooks/proxy will work via your session token for ABOUT AN HOUR \u2014 the token expires, and capture then stops until a key exists. Run \`rulemetric auth create-key --name "my-laptop"\` (or \`rulemetric auth login\` again) to fix this permanently.`)}}a(R,"ensureDeviceApiKey");export{R as a};
@@ -0,0 +1,8 @@
1
+ import{a}from"./chunk-ZLLER3HP.js";import{existsSync as c,readdirSync as u,readFileSync as b}from"node:fs";import{join as g,resolve as p,relative as d,isAbsolute as f}from"node:path";var y=40,k=200,h=2,R=new Set(["node_modules","dist","build","target","vendor",".git"]),m=[{name:"typescript",markers:["tsconfig.json","tsconfig.base.json"]},{name:"node",markers:["package.json"]},{name:"python",markers:["pyproject.toml","requirements.txt","setup.py","Pipfile"]},{name:"go",markers:["go.mod"]},{name:"rust",markers:["Cargo.toml"]},{name:"ruby",markers:["Gemfile"]},{name:"java",markers:["pom.xml","build.gradle"]}];function j(e){let n=new Set;if(!c(e))return n;let r=0,o=a((s,t)=>{let i;try{i=u(s,{withFileTypes:!0})}catch{return}for(let l of i)l.name.startsWith(".")||R.has(l.name)||(l.isFile()?n.add(l.name):l.isDirectory()&&t<h&&r<k&&(r+=1,o(g(s,l.name),t+1)))},"walk");return o(e,0),n}a(j,"collectManifestNames");function M(e){let n=c(e)?u(e).filter(t=>!t.startsWith(".")):[],r=j(e),o=m.filter(t=>t.markers.some(i=>r.has(i))).map(t=>t.name),s=null;if(n.includes("pnpm-lock.yaml")?s="pnpm":n.includes("yarn.lock")?s="yarn":n.includes("package-lock.json")&&(s="npm"),!s&&n.includes("package.json"))try{let t=JSON.parse(b(g(e,"package.json"),"utf8")).packageManager;typeof t=="string"&&(s=t.split("@")[0]??null)}catch{}return{root:p(e),runtimes:o,packageManager:s,topLevelPaths:n.sort().slice(0,y),unsupportedRuntimes:m.map(t=>t.name).filter(t=>!o.includes(t))}}a(M,"describeRepositoryCapabilities");function T(e){return`
2
+
3
+ ## Repository the cases will run in
4
+ - Runtimes present: ${e.runtimes.length?e.runtimes.join(", "):"none detected"}
5
+ - Package manager: ${e.packageManager??"none detected"}
6
+ - Top-level paths: ${e.topLevelPaths.join(", ")||"(empty)"}
7
+ - NOT present (do NOT write cases for these): ${e.unsupportedRuntimes.join(", ")}
8
+ Every prompt must reference only files, languages and tooling this repository actually has. A case that asks for a Python worker in a TypeScript repository cannot be executed and is discarded as invalid.`}a(T,"renderRepositoryBlock");var v={python:/\.py\b|\bpython\b|\brq\b|\bcelery\b|\bdjango\b|\bflask\b|\bpip\b/i,go:/\.go\b|\bgolang\b|\bgo\.mod\b/i,rust:/\.rs\b|\bcargo\b/i,ruby:/\.rb\b|\bgemfile\b|\bbundler\b/i,java:/\.java\b|\bmaven\b|\bgradle\b/i,node:/\bpackage\.json\b|\bnode_modules\b|\bnpm\b/i,typescript:/\.tsx?\b/i};function S(e,n){return n.unsupportedRuntimes.filter(r=>v[r]?.test(e))}a(S,"findUnsupportedRuntimeReferences");function _(e,n){let r=S(e,n);if(!n.root)return r;let o=e.matchAll(/\b(?:edit|modify|update|inspect|open|read|fix)\s+(?:the\s+)?[`"']?([\w./-]+\.(?:tsx?|jsx?|mjs|cjs|py|go|rs|rb|java))\b/gi);for(let s of[...o].slice(0,50)){let t=s[1],i=d(n.root,p(n.root,t));(f(i)||i===".."||i.startsWith("../")||!c(p(n.root,t)))&&r.push(`missing repository file: ${t}`)}return r}a(_,"invalidRepositoryReferences");export{j as a,M as b,T as c,S as d,_ as e};
@@ -1,4 +1,4 @@
1
- import{e as b,g as y}from"./chunk-DHIEGG4T.js";import{e as M,f as w}from"./chunk-GIXHG5FK.js";import{a as u}from"./chunk-ZLLER3HP.js";var $={anthropic:["https://platform.claude.com/docs/en/about-claude/pricing.md"],openai:["https://platform.openai.com/docs/pricing"]},R=.7,v=16e3,x=["You extract LLM API pricing from a provider pricing page.","You will be given the page text in <data> tags and, in this system prompt,","a list of model ids to find. For EACH requested model id, return its","published USD price per 1,000,000 tokens.","","Rules:","- Only report a model if you can find its rate ON THE PAGE. If it is not on"," the page, set found=false and omit the numbers \u2014 never guess from memory.","- inputPerM and outputPerM are the standard (non-batch, non-priority) rates.","- cacheReadPerM: the cached/discounted-input rate if published, else omit.","- For Anthropic models ONLY, if cache-write rates are not explicitly listed,"," compute them as cacheWrite5mPerM = inputPerM * 1.25 and"," cacheWrite1hPerM = inputPerM * 2.0. For all other providers, omit them.","- confidence is 0..1: how sure you are the numbers are correct for THIS id.","- contextWindow in tokens if stated, else omit.","","Respond with ONLY a JSON object of the form:",'{"rates":[{"modelId":"...","found":true,"confidence":0.9,"inputPerM":5,"outputPerM":25,"cacheReadPerM":0.5,"contextWindow":1000000}]}'].join(`
1
+ import{e as b,g as y}from"./chunk-26XE3JCL.js";import{e as M,f as w}from"./chunk-Z7UN4R7T.js";import{a as u}from"./chunk-ZLLER3HP.js";var $={anthropic:["https://platform.claude.com/docs/en/about-claude/pricing.md"],openai:["https://platform.openai.com/docs/pricing"]},R=.7,v=16e3,x=["You extract LLM API pricing from a provider pricing page.","You will be given the page text in <data> tags and, in this system prompt,","a list of model ids to find. For EACH requested model id, return its","published USD price per 1,000,000 tokens.","","Rules:","- Only report a model if you can find its rate ON THE PAGE. If it is not on"," the page, set found=false and omit the numbers \u2014 never guess from memory.","- inputPerM and outputPerM are the standard (non-batch, non-priority) rates.","- cacheReadPerM: the cached/discounted-input rate if published, else omit.","- For Anthropic models ONLY, if cache-write rates are not explicitly listed,"," compute them as cacheWrite5mPerM = inputPerM * 1.25 and"," cacheWrite1hPerM = inputPerM * 2.0. For all other providers, omit them.","- confidence is 0..1: how sure you are the numbers are correct for THIS id.","- contextWindow in tokens if stated, else omit.","","Respond with ONLY a JSON object of the form:",'{"rates":[{"modelId":"...","found":true,"confidence":0.9,"inputPerM":5,"outputPerM":25,"cacheReadPerM":0.5,"contextWindow":1000000}]}'].join(`
2
2
  `);async function C(f){try{let n=await fetch(f,{headers:{accept:"text/plain, text/markdown, text/html"}});if(!n.ok)return null;let i=await n.text();return i.length>v?i.slice(0,v):i}catch{return null}}u(C,"fetchPage");var L=u(async(f,n)=>{let i=await M("/api/pricing/coverage"),I=[...i.unpriced,...i.stale],m=new Map;for(let r of I)m.set(`${r.provider}::${r.modelId}`,r);let a=[...m.values()];if(a.length===0)return n.logger.info("[cron-refresh-pricing] coverage clean \u2014 nothing unpriced or stale"),{status:"clean",checked:i.unpriced.length+i.stale.length};if(b()==="none")return n.logger.warn(`[cron-refresh-pricing] ${a.length} model(s) need pricing but no LLM backend (install the claude CLI or set ANTHROPIC_API_KEY) \u2014 skipping`),{status:"no-llm",pending:a.length};let d=new Map;for(let r of a){let o=d.get(r.provider)??[];o.push(r.modelId),d.set(r.provider,o)}let t={written:0,unchanged:0,flagged:0,rejected:0,skipped:0},c=[];for(let[r,o]of d){let h=$[r];if(!h){n.logger.warn(`[cron-refresh-pricing] no pricing source configured for provider '${r}' (${o.length} model(s)) \u2014 skipping`),t.skipped+=o.length;continue}let p="",l="";for(let e of h){let s=await C(e);s&&(p+=`
3
3
 
4
4
  === ${e} ===
@@ -0,0 +1 @@
1
+ import{b as S}from"./chunk-2K4TF5RM.js";import{a as b}from"./chunk-5RBLIVBF.js";import{b as h,c as p,f as w}from"./chunk-3IAZMJA4.js";import{h as m}from"./chunk-Z7UN4R7T.js";import{a as u}from"./chunk-ZLLER3HP.js";async function $(r){if(!r.worktree?.create)return r;let{branch:t,baseRef:l}=r.worktree,i=await S({repoRoot:r.projectPath,branch:t,baseRef:l});return{...r,projectPath:i.path,gitBranch:i.branch}}u($,"resolveWorktreeForLaunch");async function C(r,t){let{mirrorId:l,tool:i}=r,{config:e}=r,n=u(o=>t.logger.info(o),"log");if(t.job.attempts>1)throw new b(`process_launch is not safe to retry (attempt ${t.job.attempts}). Re-launch manually.`);t.leaseSignal?.throwIfAborted(),e=await $(e),e.worktree?.create&&n(`Worktree resolved: ${e.projectPath} (branch ${e.gitBranch})`);let d=!!e.scopedConfirmation&&e.mode==="headless";if(d)try{await p(e.scopedConfirmation.id,t.leaseSignal)}catch(o){n(`scoped protocol staging failed (will fetch after exit): ${o instanceof Error?o.message:String(o)}`)}t.leaseSignal?.throwIfAborted(),n(`Launching ${i}...`);let{getLauncher:L}=await import("./dist-WGZCHQTC.js"),g=L(i),s=e.mode==="headless"?await g.launch(e,{signal:t.leaseSignal}):await g.launch(e);n(`Launch completed: sessionId=${s.sessionId}`);let c;if(d)try{c=await w(e,s.sessionId,t.leaseSignal)}catch(o){let a=h(o,s.sessionId,e.scopedConfirmation.id);c=a,a.status!=="recorded"&&n(`scoped outcome ${a.status} at ${a.step}: ${a.reason}${a.receiptDir?` (receipt: ${a.receiptDir})`:""}`)}let f={...s,...c?{studyOutcome:c}:{},worktreePath:e.worktree?.create?e.projectPath:void 0,runId:e.runId};return t.leaseSignal?.aborted||await m(`/api/launch-jobs/${l}/state`,{result:f},{signal:t.leaseSignal?AbortSignal.any([t.leaseSignal,AbortSignal.timeout(3e4)]):AbortSignal.timeout(3e4)}).catch(o=>{n(`result persist failed: ${o instanceof Error?o.message:String(o)}`)}),f}u(C,"processLaunch");export{$ as a,C as b};
@@ -1,4 +1,4 @@
1
- import{a as M}from"./chunk-5RBLIVBF.js";import{c as q}from"./chunk-GLBWNB2N.js";import{a as K,b as Y}from"./chunk-CQD2R3BA.js";import{a as A,d as N}from"./chunk-3UKZJAFS.js";import{a as j,b as k,c as V,d as D}from"./chunk-77FH6UZP.js";import{a as Z}from"./chunk-KE5K3F7J.js";import{b as W,e as B,g as T}from"./chunk-DHIEGG4T.js";import{e as h,f as U,h as m}from"./chunk-GIXHG5FK.js";import{a as L,b as H}from"./chunk-X6CF5KTW.js";import{a as f}from"./chunk-ZLLER3HP.js";var Q=f((l,{limit:a,sort:n,eventTypes:s})=>h(`/api/sessions/${l}/events?limit=${a}&sort=${n}&eventType=${encodeURIComponent(s.join(","))}&hasContent=true`),"fetchTranscriptTurns");async function ms(l,a){let{mirrorId:n,projectPath:s,projectId:r,config:u}=l,e=f(t=>a.logger.info(t),"log");if(u?.sessionId)return es({mirrorId:n,sessionId:u.sessionId},e);e(`Processing insights job ${n}...`),await m(`/api/insights-jobs/${n}/progress`,{status:"running",progress:{step:"reading_data"}});try{let{repaired:t}=await U("/api/sessions/repair-analyzed-at",{});t>0&&e(` Repaired analyzed_at on ${t} orphan session(s).`)}catch(t){e(` Warning: analyzed_at repair failed: ${t instanceof Error?t.message:String(t)}`)}let p=20,C=200,z=15*6e4,F=3,E=Date.now()+z,I=B()==="none"?"no-llm-backend":null;if(I&&a.logger.warn?.("[process-insights] no LLM backend (no claude/codex CLI and no ANTHROPIC_API_KEY) \u2014 facet grading SKIPPED for this run; the summary below is computed from already-graded sessions only"),!I){let t=0,i=0;try{for(;t<C&&Date.now()<E;){let c=await h(`/api/sessions?needsFacets=true&graderVersion=${2}&limit=${p}&offset=${i}`);if(c.length===0)break;e(` Generating facets for ${c.length} un-analyzed sessions (drained ${t} so far)...`);for(let b=0;b<c.length&&!(t>=C||Date.now()>=E);b+=F){let R=c.slice(b,b+F);await Promise.all(R.map(async g=>{if(!(t>=C||Date.now()>=E))try{let d=await N(ss=>Q(g.id,ss));if(d.turnCount<2){t++,i++;return}let O=await T(D,d.text,4096);O&&typeof O.outcome=="string"?(await m(`/api/sessions/${g.id}/enrich`,{analysis:{source:"generated_facets",...O,graderVersion:2},...g.eventCount!=null?{analyzedEventCount:g.eventCount}:{},analyzedTurnCount:d.turnCount}),e(` Generated facets for session ${g.id} (${g.tool}, ${d.turnCount} turns)`)):i++,t++}catch(d){e(` Failed to generate facets for session ${g.id}: ${d instanceof Error?d.message:String(d)}`),t++,i++}}))}if(c.length<p)break}}catch(c){e(` Warning: facet generation failed after ${t} sessions: ${c instanceof Error?c.message:String(c)}`)}if(t>0){let c=Date.now()>=E?`time budget (${Math.round(z/6e4)}m)`:t>=C?`hard cap (${C})`:"queue empty";e(` Facet drain stopped on ${c} after ${t} session(s); the rest resume next run.`)}}let _=await ns(s,r);if(!_)throw new M("No session data found \u2014 ensure sessions are captured and enriched.");e(` Found ${_.stats.sessions} sessions, generating recommendations...`);let y=await Y({projectId:r,projectPath:s},h);_.summary+=`
1
+ import{a as M}from"./chunk-5RBLIVBF.js";import{a as Z}from"./chunk-VFWQ2W4B.js";import{c as q}from"./chunk-GLBWNB2N.js";import{a as K,b as Y}from"./chunk-CQD2R3BA.js";import{a as A,d as N}from"./chunk-3UKZJAFS.js";import{a as j,b as k,c as V,d as D}from"./chunk-77FH6UZP.js";import{b as W,e as B,g as T}from"./chunk-26XE3JCL.js";import{e as h,f as U,h as m}from"./chunk-Z7UN4R7T.js";import{a as L,b as H}from"./chunk-X6CF5KTW.js";import{a as f}from"./chunk-ZLLER3HP.js";var Q=f((l,{limit:a,sort:n,eventTypes:s})=>h(`/api/sessions/${l}/events?limit=${a}&sort=${n}&eventType=${encodeURIComponent(s.join(","))}&hasContent=true`),"fetchTranscriptTurns");async function ms(l,a){let{mirrorId:n,projectPath:s,projectId:r,config:u}=l,e=f(t=>a.logger.info(t),"log");if(u?.sessionId)return es({mirrorId:n,sessionId:u.sessionId},e);e(`Processing insights job ${n}...`),await m(`/api/insights-jobs/${n}/progress`,{status:"running",progress:{step:"reading_data"}});try{let{repaired:t}=await U("/api/sessions/repair-analyzed-at",{});t>0&&e(` Repaired analyzed_at on ${t} orphan session(s).`)}catch(t){e(` Warning: analyzed_at repair failed: ${t instanceof Error?t.message:String(t)}`)}let p=20,C=200,z=15*6e4,F=3,E=Date.now()+z,I=B()==="none"?"no-llm-backend":null;if(I&&a.logger.warn?.("[process-insights] no LLM backend (no claude/codex CLI and no ANTHROPIC_API_KEY) \u2014 facet grading SKIPPED for this run; the summary below is computed from already-graded sessions only"),!I){let t=0,i=0;try{for(;t<C&&Date.now()<E;){let c=await h(`/api/sessions?needsFacets=true&graderVersion=${2}&limit=${p}&offset=${i}`);if(c.length===0)break;e(` Generating facets for ${c.length} un-analyzed sessions (drained ${t} so far)...`);for(let b=0;b<c.length&&!(t>=C||Date.now()>=E);b+=F){let R=c.slice(b,b+F);await Promise.all(R.map(async g=>{if(!(t>=C||Date.now()>=E))try{let d=await N(ss=>Q(g.id,ss));if(d.turnCount<2){t++,i++;return}let O=await T(D,d.text,4096);O&&typeof O.outcome=="string"?(await m(`/api/sessions/${g.id}/enrich`,{analysis:{source:"generated_facets",...O,graderVersion:2},...g.eventCount!=null?{analyzedEventCount:g.eventCount}:{},analyzedTurnCount:d.turnCount}),e(` Generated facets for session ${g.id} (${g.tool}, ${d.turnCount} turns)`)):i++,t++}catch(d){e(` Failed to generate facets for session ${g.id}: ${d instanceof Error?d.message:String(d)}`),t++,i++}}))}if(c.length<p)break}}catch(c){e(` Warning: facet generation failed after ${t} sessions: ${c instanceof Error?c.message:String(c)}`)}if(t>0){let c=Date.now()>=E?`time budget (${Math.round(z/6e4)}m)`:t>=C?`hard cap (${C})`:"queue empty";e(` Facet drain stopped on ${c} after ${t} session(s); the rest resume next run.`)}}let _=await ns(s,r);if(!_)throw new M("No session data found \u2014 ensure sessions are captured and enriched.");e(` Found ${_.stats.sessions} sessions, generating recommendations...`);let y=await Y({projectId:r,projectPath:s},h);_.summary+=`
2
2
 
3
3
  ${y.text}`,e(` Session evidence: ${y.sessionIds.length} usable, ${y.failedSessionIds.length} unavailable`);let S=await ts(s,e);S&&e(` Generator memory: ${S.split(`
4
4
  `).length} lines of prior-advice context`);let o={},$=[],w=k.length+1;for(let t=0;t<k.length;t++){let i=k[t];e(` [${t+1}/${w}] Generating ${i.name}...`);try{await m(`/api/insights-jobs/${n}/progress`,{status:"running",progress:{step:i.name,current:t+1,total:w,partial:{...o}}})}catch(d){e(` Warning: progress update failed for ${i.name}: ${d instanceof Error?d.message:String(d)}`)}e(` Running LLM prompt for ${i.name}...`);let c=i.usesGeneratorMemory&&S?`${_.summary}
@@ -1 +1 @@
1
- import{b as g,c as m}from"./chunk-N7ODX6PO.js";import{e as s,h as c}from"./chunk-GIXHG5FK.js";import{a as i}from"./chunk-ZLLER3HP.js";var u=6e4;function o(t,e){try{t(JSON.stringify({ts:new Date().toISOString(),...e}))}catch{t(`[tt-heartbeat] log_error event=${e.event}`)}}i(o,"structuredLog");function d(t,e){return e.aborted?Promise.resolve(!1):t<=0?Promise.resolve(!0):new Promise(r=>{let a=setTimeout(()=>{e.removeEventListener("abort",n),r(!0)},t),n=i(()=>{clearTimeout(a),e.removeEventListener("abort",n),r(!1)},"onAbort");e.addEventListener("abort",n,{once:!0})})}i(d,"abortableSleep");async function l(t,e){if(t.kind!=="tmux")return;let a=(await g(m(t.target))).code===0?"active":"missing";try{await c(`/api/terminal-targets/${t.id}/status`,{status:a,lastSeenAt:new Date().toISOString()}),o(e,{event:"tt_heartbeat",targetId:t.id,target:t.target,status:a})}catch(n){o(e,{event:"tt_heartbeat_error",targetId:t.id,target:t.target,error:n instanceof Error?n.message:String(n)})}}i(l,"probeAndReport");async function b(t){let e;try{e=await s("/api/terminal-targets?status=active")}catch(r){o(t,{event:"tt_heartbeat_list_error",error:r instanceof Error?r.message:String(r)});return}for(let r of e.targets??[])try{await l(r,t)}catch(a){o(t,{event:"tt_heartbeat_probe_error",targetId:r.id,error:a instanceof Error?a.message:String(a)})}}i(b,"runOneHeartbeatCycle");async function p(t){let e=t.log??(()=>{}),r=t.intervalMs??u;for(o(e,{event:"tt_heartbeat_start",intervalMs:r});!t.signal.aborted&&(await b(e),!!await d(r,t.signal)););o(e,{event:"tt_heartbeat_stop"})}i(p,"startTerminalTargetHeartbeat");export{l as a,b,p as c};
1
+ import{b as g,c as m}from"./chunk-N7ODX6PO.js";import{e as s,h as c}from"./chunk-Z7UN4R7T.js";import{a as i}from"./chunk-ZLLER3HP.js";var u=6e4;function o(t,e){try{t(JSON.stringify({ts:new Date().toISOString(),...e}))}catch{t(`[tt-heartbeat] log_error event=${e.event}`)}}i(o,"structuredLog");function d(t,e){return e.aborted?Promise.resolve(!1):t<=0?Promise.resolve(!0):new Promise(r=>{let a=setTimeout(()=>{e.removeEventListener("abort",n),r(!0)},t),n=i(()=>{clearTimeout(a),e.removeEventListener("abort",n),r(!1)},"onAbort");e.addEventListener("abort",n,{once:!0})})}i(d,"abortableSleep");async function l(t,e){if(t.kind!=="tmux")return;let a=(await g(m(t.target))).code===0?"active":"missing";try{await c(`/api/terminal-targets/${t.id}/status`,{status:a,lastSeenAt:new Date().toISOString()}),o(e,{event:"tt_heartbeat",targetId:t.id,target:t.target,status:a})}catch(n){o(e,{event:"tt_heartbeat_error",targetId:t.id,target:t.target,error:n instanceof Error?n.message:String(n)})}}i(l,"probeAndReport");async function b(t){let e;try{e=await s("/api/terminal-targets?status=active")}catch(r){o(t,{event:"tt_heartbeat_list_error",error:r instanceof Error?r.message:String(r)});return}for(let r of e.targets??[])try{await l(r,t)}catch(a){o(t,{event:"tt_heartbeat_probe_error",targetId:r.id,error:a instanceof Error?a.message:String(a)})}}i(b,"runOneHeartbeatCycle");async function p(t){let e=t.log??(()=>{}),r=t.intervalMs??u;for(o(e,{event:"tt_heartbeat_start",intervalMs:r});!t.signal.aborted&&(await b(e),!!await d(r,t.signal)););o(e,{event:"tt_heartbeat_stop"})}i(p,"startTerminalTargetHeartbeat");export{l as a,b,p as c};
@@ -0,0 +1 @@
1
+ import{a as d}from"./chunk-TFJAT263.js";import{a as l}from"./chunk-RCJTCLZO.js";import{a as u}from"./chunk-VBGHPAUT.js";import{e as c,h as p}from"./chunk-Z7UN4R7T.js";import{a}from"./chunk-ZLLER3HP.js";import{createHash as m}from"node:crypto";import{z as t}from"zod";var h=t.object({content:t.string().min(1),name:t.string().min(1),type:t.enum(["instruction","skill"]),contentHash:t.string().regex(/^[a-f0-9]{64}$/),suggestionId:t.string().uuid()}).strict();async function j(e,g){e.preparationOnly&&u.parse(e.research);let r=h.parse(e.candidateSnapshot);if(m("sha256").update(r.content).digest("hex")!==r.contentHash)throw new Error("Candidate snapshot hash mismatch");let i=e.preparationOnly||e.preparationSourceJobId?{preparationSourceJobId:e.preparationSourceJobId}:await d({...e,candidateSnapshot:r,config:{...e.config,parallel:1,runsPerEval:1,iteration:1,skipBaseline:!1,skipGrading:!1,generateIfEmpty:!0,timeout:12e4}},g);if((await c(`/api/eval-targets/${e.evalTargetId}/jobs`)).find(n=>n.id===e.mirrorId)?.status==="cancelled")return{...i,cancelled:!0,adoptionAllowed:!1};let s;try{s=await l({research:e.research,requestedModel:e.requestedModel,evalTargetId:e.evalTargetId,evalJobId:e.preparationSourceJobId??e.mirrorId,preparationJobId:e.mirrorId,...r})}catch(n){s={status:"blocked",reason:n instanceof Error?n.message:String(n)}}if(s.status==="cancelled")return{...i,cancelled:!0,livePreparation:s,adoptionAllowed:!1};let o={...i,livePreparation:s,evidenceKind:e.preparationOnly?"live_preparation":"constructed_evaluation",candidateHash:r.contentHash,suggestionId:r.suggestionId,adoptionAllowed:!1};return await p(`/api/eval-jobs/${e.mirrorId}/state`,{result:o}),o}a(j,"processSuggestionEval");export{j as a};
@@ -1 +1 @@
1
- import{b as o,f as a}from"./chunk-GIXHG5FK.js";import{a as n}from"./chunk-ZLLER3HP.js";function c(e){return e==null?e??null:e instanceof Date?e.toISOString():e}n(c,"serializeDate");async function d(e){let r={provider:e.provider,plan:e.plan,limitType:e.limitType,value:e.value,unit:e.unit,comparator:e.comparator,resetsAt:c(e.resetsAt),sourceType:e.sourceType,sourceUrl:e.sourceUrl,sourceEvidence:e.sourceEvidence,confidence:e.confidence,observedAt:c(e.observedAt)};return a("/api/internal/research/observe",r)}n(d,"postObservation");async function f(e){let r=0,i=0,s=[];for(let u of e)try{await d(u),r++}catch(t){i++;let p=t instanceof o?`HTTP ${t.statusCode}: ${t.message}`:String(t);s.length<5&&s.push(p)}return{posted:r,failed:i,errors:s}}n(f,"postObservations");export{d as a,f as b};
1
+ import{b as o,f as a}from"./chunk-Z7UN4R7T.js";import{a as n}from"./chunk-ZLLER3HP.js";function c(e){return e==null?e??null:e instanceof Date?e.toISOString():e}n(c,"serializeDate");async function d(e){let r={provider:e.provider,plan:e.plan,limitType:e.limitType,value:e.value,unit:e.unit,comparator:e.comparator,resetsAt:c(e.resetsAt),sourceType:e.sourceType,sourceUrl:e.sourceUrl,sourceEvidence:e.sourceEvidence,confidence:e.confidence,observedAt:c(e.observedAt)};return a("/api/internal/research/observe",r)}n(d,"postObservation");async function f(e){let r=0,i=0,s=[];for(let u of e)try{await d(u),r++}catch(t){i++;let p=t instanceof o?`HTTP ${t.statusCode}: ${t.message}`:String(t);s.length<5&&s.push(p)}return{posted:r,failed:i,errors:s}}n(f,"postObservations");export{d as a,f as b};
@@ -1 +1 @@
1
- import{f as r}from"./chunk-GIXHG5FK.js";import{a as i}from"./chunk-ZLLER3HP.js";async function p(e,t,n,o){await r(`/api/instruction-suggestions/${encodeURIComponent(e)}/events`,{eventType:"accepted",projectPath:t,instructionId:n,actor:o})}i(p,"logAccepted");async function a(e,t,n,o,s="redundant"){await r(`/api/instruction-suggestions/${encodeURIComponent(e)}/events`,{eventType:s,projectPath:t,instructionId:n,actor:o})}i(a,"logRefused");export{p as a,a as b};
1
+ import{f as r}from"./chunk-Z7UN4R7T.js";import{a as i}from"./chunk-ZLLER3HP.js";async function p(e,t,n,o){await r(`/api/instruction-suggestions/${encodeURIComponent(e)}/events`,{eventType:"accepted",projectPath:t,instructionId:n,actor:o})}i(p,"logAccepted");async function a(e,t,n,o,s="redundant"){await r(`/api/instruction-suggestions/${encodeURIComponent(e)}/events`,{eventType:s,projectPath:t,instructionId:n,actor:o})}i(a,"logRefused");export{p as a,a as b};
@@ -1,4 +1,4 @@
1
- import{a as U,b as F}from"./chunk-6T6YFPBW.js";import{a as h,b as I}from"./chunk-ISYU5BMU.js";import{a as $,b as k,e as R}from"./chunk-LJRE3LZ2.js";import{d as w}from"./chunk-GYNZ3OZF.js";import{g as C,i as D,j as P}from"./chunk-UPFH72PF.js";import{e as v,f as x,i as j}from"./chunk-GIXHG5FK.js";import{D as b,F as S,G as T,o as A}from"./chunk-X6CF5KTW.js";import{a as l}from"./chunk-ZLLER3HP.js";import*as u from"node:fs";import*as m from"node:path";var O=new Set(["mcp","subagent","feature"]);function ie(e,t,n){return E(m.join(e,"CLAUDE.md"),t,n)}l(ie,"appendToCLAUDEmd");function E(e,t,n){let i=$(t),s=k(t),a=u.existsSync(e)?u.readFileSync(e,"utf8"):"";if(a.includes(i))return!1;let p=`${a.length>0&&!a.endsWith(`
1
+ import{a as U,b as F}from"./chunk-LMQDS47I.js";import{a as h,b as I}from"./chunk-JQ2ZCUEC.js";import{a as $,b as k,e as R}from"./chunk-LJRE3LZ2.js";import{d as w}from"./chunk-GYNZ3OZF.js";import{g as C,i as D,j as P}from"./chunk-UPFH72PF.js";import{e as v,f as x,i as j}from"./chunk-Z7UN4R7T.js";import{D as b,F as S,G as T,o as A}from"./chunk-X6CF5KTW.js";import{a as l}from"./chunk-ZLLER3HP.js";import*as u from"node:fs";import*as m from"node:path";var O=new Set(["mcp","subagent","feature"]);function ie(e,t,n){return E(m.join(e,"CLAUDE.md"),t,n)}l(ie,"appendToCLAUDEmd");function E(e,t,n){let i=$(t),s=k(t),a=u.existsSync(e)?u.readFileSync(e,"utf8"):"";if(a.includes(i))return!1;let p=`${a.length>0&&!a.endsWith(`
2
2
  `)?`
3
3
 
4
4
  `:a.length>0?`
@@ -1 +1 @@
1
- import{g}from"./chunk-KFNFLMUR.js";import{e as c,f as p}from"./chunk-GIXHG5FK.js";import{a}from"./chunk-ZLLER3HP.js";import{createHash as C,randomUUID as R}from"node:crypto";import{lstatSync as u,readFileSync as b,writeFileSync as v,openSync as k,closeSync as y,fsyncSync as x,renameSync as $,unlinkSync as A}from"node:fs";import{isAbsolute as I,parse as F,join as E,dirname as P}from"node:path";var w=a(e=>C("sha256").update(e).digest("hex"),"hash");function f(e){if(!I(e))throw new Error("Restoration requires an absolute file anchor");let o=F(e).root;for(let t of e.slice(o.length).split("/"))if(o=E(o,t),u(o).isSymbolicLink())throw new Error("Restoration refuses symlink anchors");if(!u(e).isFile())throw new Error("Restoration requires a regular file");return b(e,"utf8")}a(f,"readFile");function h(e,o,t){if(f(e)!==o)return!1;let i=E(P(e),`.rulemetric-restore-${R()}`),n;try{return n=k(i,"wx",u(e).mode&511),v(n,t),x(n),y(n),n=void 0,f(e)!==o?!1:($(i,e),!0)}finally{n!==void 0&&y(n);try{A(i)}catch(s){if(s.code!=="ENOENT")throw s}}}a(h,"replaceExact");async function j(e,o){let t=await c(`/api/promotions/${o.promotionId}`),i=await c(`/api/eval-targets/${e}`),n=a(r=>({applied:!1,fileWritten:!1,reason:r}),"refuse");if(o.version!==1||o.authority!=="manual"||t.evalTargetId!==e||!t.applied||t.decision!=="promote"||i.content!==t.toContent)return n("Stale or unsupported restoration");let s=i.metadata?.immutableSections;if(!Array.isArray(s)||!s.every(r=>typeof r=="string"))return n("Explicit immutable sections are required");let S=Array.isArray(t.gates?.immutableSections)?t.gates.immutableSections.filter(r=>typeof r=="string"):[];if(g(t.toContent,t.fromContent,[...s,...S]).length)return n("Restoration would change immutable sections");let d=!1;try{if(!h(i.name,t.toContent,t.fromContent))return n("File changed; preserving human edits");if(d=!0,f(i.name)!==t.fromContent)throw new Error("Predecessor read-back failed");let r=await p(`/api/promotions/${t.id}/restore`,{authority:o.authority,reason:o.reason,expectedVersion:i.version,path:i.name,diskBeforeHash:w(t.toContent),diskAfterHash:w(t.fromContent)});return{applied:r.applied,fileWritten:!0,promotionId:r.id}}catch(r){if(!d)return n(r instanceof Error?r.message:String(r));let l=await c(`/api/eval-targets/${e}`).catch(()=>null),m=await c(`/api/promotions/${t.id}/restoration`).catch(()=>null);if(m&&l?.content===t.fromContent&&l.version===m.gates.newVersion&&f(i.name)===t.fromContent)return{applied:!0,fileWritten:!0,promotionId:m.id,reason:"Restoration verified after response failure"};if(!l||l.content===t.fromContent)throw new Error("Restoration state unknown; disk retained for reconciliation",{cause:r});return h(i.name,t.fromContent,t.toContent),n(`Restoration refused: ${r instanceof Error?r.message:String(r)}`)}}a(j,"restoreInstruction");export{j as a};
1
+ import{g}from"./chunk-KFNFLMUR.js";import{e as c,f as p}from"./chunk-Z7UN4R7T.js";import{a}from"./chunk-ZLLER3HP.js";import{createHash as C,randomUUID as R}from"node:crypto";import{lstatSync as u,readFileSync as b,writeFileSync as v,openSync as k,closeSync as y,fsyncSync as x,renameSync as $,unlinkSync as A}from"node:fs";import{isAbsolute as I,parse as F,join as E,dirname as P}from"node:path";var w=a(e=>C("sha256").update(e).digest("hex"),"hash");function f(e){if(!I(e))throw new Error("Restoration requires an absolute file anchor");let o=F(e).root;for(let t of e.slice(o.length).split("/"))if(o=E(o,t),u(o).isSymbolicLink())throw new Error("Restoration refuses symlink anchors");if(!u(e).isFile())throw new Error("Restoration requires a regular file");return b(e,"utf8")}a(f,"readFile");function h(e,o,t){if(f(e)!==o)return!1;let i=E(P(e),`.rulemetric-restore-${R()}`),n;try{return n=k(i,"wx",u(e).mode&511),v(n,t),x(n),y(n),n=void 0,f(e)!==o?!1:($(i,e),!0)}finally{n!==void 0&&y(n);try{A(i)}catch(s){if(s.code!=="ENOENT")throw s}}}a(h,"replaceExact");async function j(e,o){let t=await c(`/api/promotions/${o.promotionId}`),i=await c(`/api/eval-targets/${e}`),n=a(r=>({applied:!1,fileWritten:!1,reason:r}),"refuse");if(o.version!==1||o.authority!=="manual"||t.evalTargetId!==e||!t.applied||t.decision!=="promote"||i.content!==t.toContent)return n("Stale or unsupported restoration");let s=i.metadata?.immutableSections;if(!Array.isArray(s)||!s.every(r=>typeof r=="string"))return n("Explicit immutable sections are required");let S=Array.isArray(t.gates?.immutableSections)?t.gates.immutableSections.filter(r=>typeof r=="string"):[];if(g(t.toContent,t.fromContent,[...s,...S]).length)return n("Restoration would change immutable sections");let d=!1;try{if(!h(i.name,t.toContent,t.fromContent))return n("File changed; preserving human edits");if(d=!0,f(i.name)!==t.fromContent)throw new Error("Predecessor read-back failed");let r=await p(`/api/promotions/${t.id}/restore`,{authority:o.authority,reason:o.reason,expectedVersion:i.version,path:i.name,diskBeforeHash:w(t.toContent),diskAfterHash:w(t.fromContent)});return{applied:r.applied,fileWritten:!0,promotionId:r.id}}catch(r){if(!d)return n(r instanceof Error?r.message:String(r));let l=await c(`/api/eval-targets/${e}`).catch(()=>null),m=await c(`/api/promotions/${t.id}/restoration`).catch(()=>null);if(m&&l?.content===t.fromContent&&l.version===m.gates.newVersion&&f(i.name)===t.fromContent)return{applied:!0,fileWritten:!0,promotionId:m.id,reason:"Restoration verified after response failure"};if(!l||l.content===t.fromContent)throw new Error("Restoration state unknown; disk retained for reconciliation",{cause:r});return h(i.name,t.fromContent,t.toContent),n(`Restoration refused: ${r instanceof Error?r.message:String(r)}`)}}a(j,"restoreInstruction");export{j as a};
@@ -0,0 +1 @@
1
+ import{d as T}from"./chunk-JP6ULOEX.js";import{d as k}from"./chunk-SVZYRGO5.js";import{b as f}from"./chunk-WULEBQPI.js";import{c as C,d as b}from"./chunk-GPBN4ROE.js";import{a as u}from"./chunk-ZLLER3HP.js";import{spawn as M}from"node:child_process";var m=["claude","codex","pi"],O=["--strict-mcp-config","--mcp-config",'{"mcpServers":{}}'];function L(e,t=process.env){if(e){if(m.includes(e))return e;throw new Error(`Eval engine "${String(e)}" is not known (expected one of: ${m.join(", ")})`)}let r=t.RULEMETRIC_EVAL_ENGINE?.trim().toLowerCase();if(!r)return"claude";if(m.includes(r))return r;throw new Error(`RULEMETRIC_EVAL_ENGINE="${t.RULEMETRIC_EVAL_ENGINE}" is not a known engine (expected one of: ${m.join(", ")})`)}u(L,"resolveEvalEngine");function h(e,t=process.env){return e?.trim()||t.RULEMETRIC_CODEX_MODEL?.trim()||b().codexConfiguredModel||C}u(h,"resolveCodexEvalModel");function F(e){try{let t=JSON.parse(e),r=t.result??t.content??e,i=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 s=typeof d?.outputTokens=="number"?d.outputTokens:0;s>o&&(o=s,n=l)}}return{output:r,totalTokens:i,model:n,...t.usage&&typeof t.usage=="object"&&!Array.isArray(t.usage)?{usage:t.usage}:{}}}catch{return{output:e,totalTokens:0}}}u(F,"parseClaudeJsonOutput");function S(e){let{prompt:t,targetContent:r,systemPrompt:i,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}}}:{}})];o.push(...O),e.writableFixture&&o.push("--safe-mode","--restricted","--tools","Read,Write,Edit,Bash","--permission-mode","acceptEdits","--allowedTools","Read,Write,Edit,Bash");let l=r??i;return l&&o.push(e.appendTarget?"--append-system-prompt":"--system-prompt",l),n&&o.push("--model",n),o}u(S,"buildClaudeArgs");function N(e,t,r,i){let n=t.trim()||r.trim()||i.trim()||"(no output on stderr or stdout)";return`Exit code ${e}: ${n.slice(0,1e3)}`}u(N,"describeExitFailure");async function I(e){let{prompt:t,targetContent:r,systemPrompt:i,workDir:n,timeout:o,model:l}=e,d=r??i,s=await k({prompt:t,systemPrompt:d,model:h(l),writableFixture:e.writableFixture,timeout:o,workDir:n});return{output:s.output,exitCode:s.exitCode,durationMs:s.durationMs,totalTokens:s.usage?.totalTokens??0,model:s.model,engine:"codex",delivery:d?"prompt_prefix":"none",error:s.error}}u(I,"executeCodexArm");async function U(e){let t=e.targetContent??e.systemPrompt,r=await T({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(U,"executePiArm");async function W(e){let{prompt:t,targetContent:r,systemPrompt:i,workDir:n=process.cwd(),timeout:o=12e4,model:l}=e,d=L(e.engine);if(d==="codex")return I({...e,workDir:n,timeout:o});if(d==="pi")return U({...e,workDir:n,timeout:o});let s=S({prompt:t,targetContent:r,systemPrompt:i,model:l,appendTarget:e.appendTarget,writableFixture:e.writableFixture}),g=r??i?"system_prompt":"none",E=Date.now();return new Promise(x=>{let _=f(),p=M("claude",s,{cwd:n,env:_,stdio:["ignore","pipe","pipe"]}),c="",v="";p.stdout.on("data",a=>{c+=a.toString()}),p.stderr.on("data",a=>{v+=a.toString()});let y=setTimeout(()=>{p.kill("SIGTERM"),x({output:c,exitCode:null,durationMs:Date.now()-E,totalTokens:0,engine:"claude",delivery:g,error:`Timed out after ${o}ms`})},o);p.on("close",a=>{clearTimeout(y);let P=Date.now()-E,{output:w,totalTokens:R,model:A,usage:D}=F(c);x({output:w,exitCode:a,durationMs:P,totalTokens:R,usage:D,model:A,engine:"claude",delivery:g,error:a!==0?N(a,v,w,c):void 0})}),p.on("error",a=>{clearTimeout(y),x({output:"",exitCode:null,durationMs:Date.now()-E,totalTokens:0,engine:"claude",delivery:g,error:`Failed to spawn claude: ${a.message}`})})})}u(W,"executeEval");export{O as a,L as b,h as c,F as d,S as e,N as f,W as g};
@@ -1,4 +1,4 @@
1
- import{g as E}from"./chunk-DHIEGG4T.js";import{b,e as y,f as k,h as M}from"./chunk-GIXHG5FK.js";import{a as u}from"./chunk-ZLLER3HP.js";var v=50,I=24e3,P=3,R=3,C=40,N=4e3,x=new Set(["fact","decision","correction","convention"]),L=`You are distilling DURABLE, PROJECT-SPECIFIC knowledge from an AI coding session so a future agent working on the SAME project starts smarter.
1
+ import{g as E}from"./chunk-26XE3JCL.js";import{b,e as y,f as k,h as M}from"./chunk-Z7UN4R7T.js";import{a as u}from"./chunk-ZLLER3HP.js";var v=50,I=24e3,P=3,R=3,C=40,N=4e3,x=new Set(["fact","decision","correction","convention"]),L=`You are distilling DURABLE, PROJECT-SPECIFIC knowledge from an AI coding session so a future agent working on the SAME project starts smarter.
2
2
 
3
3
  Extract ONLY facts / decisions / corrections / conventions that will STILL be true and useful in FUTURE sessions \u2014 architecture facts, deliberate design decisions, corrections of a wrong approach, or project conventions.
4
4
 
@@ -1 +1 @@
1
- import{e as g,f as m}from"./chunk-GIXHG5FK.js";import{a as l}from"./chunk-ZLLER3HP.js";async function f(c,p){let r=l(e=>p?.logger?.info?.(e)??console.log(e),"log"),{projectPath:o}=c,i=`[cron_instruction_training] ${o}`;if(!o)return{skipped:"no-project-path"};let n=await m("/api/instruction-experiments/settle",{projectPath:o}),a=n.settled.map(e=>e.outcome),d=a.filter(e=>e==="graduated").length;for(let e of n.settled)r(`${i}: experiment ${e.experimentId} \u2192 ${e.outcome}`);n.examined>0&&r(`${i}: examined ${n.examined} running experiment(s) \u2014 ${n.settled.length} settled (${d} graduated), ${n.stillRunning} still gathering`);let t=await g(`/api/instruction-suggestions/trialable?projectPath=${encodeURIComponent(o)}`);for(let e of t.refused)r(`${i}: not trialling "${e.name}" \u2014 ${e.reason}`);if(t.candidates.length===0)return r(`${i}: no new trial started (${t.running}/${t.limits.maxConcurrent} running, ${t.slots} slot(s) free)`),{examined:n.examined,settled:n.settled.length,graduated:d,nominated:0,running:t.running,outcomes:a};let u=0;for(let e of t.candidates)try{let s=await m(`/api/instruction-suggestions/${e.id}/test`,{});if(s.existing){r(`${i}: comparison already recorded for "${e.name}" (${s.evalJobId})`);continue}u+=1,r(`${i}: queued bounded comparison and live-study preparation for "${e.name}"`)}catch(s){r(`${i}: could not measure "${e.name}" \u2014 ${s instanceof Error?s.message:String(s)}`)}return{examined:n.examined,settled:n.settled.length,graduated:d,nominated:u,queued:u,running:t.running,outcomes:a}}l(f,"cronInstructionTraining");export{f as a};
1
+ import{e as g,f as m}from"./chunk-Z7UN4R7T.js";import{a as l}from"./chunk-ZLLER3HP.js";async function f(c,p){let r=l(e=>p?.logger?.info?.(e)??console.log(e),"log"),{projectPath:o}=c,i=`[cron_instruction_training] ${o}`;if(!o)return{skipped:"no-project-path"};let n=await m("/api/instruction-experiments/settle",{projectPath:o}),a=n.settled.map(e=>e.outcome),d=a.filter(e=>e==="graduated").length;for(let e of n.settled)r(`${i}: experiment ${e.experimentId} \u2192 ${e.outcome}`);n.examined>0&&r(`${i}: examined ${n.examined} running experiment(s) \u2014 ${n.settled.length} settled (${d} graduated), ${n.stillRunning} still gathering`);let t=await g(`/api/instruction-suggestions/trialable?projectPath=${encodeURIComponent(o)}`);for(let e of t.refused)r(`${i}: not trialling "${e.name}" \u2014 ${e.reason}`);if(t.candidates.length===0)return r(`${i}: no new trial started (${t.running}/${t.limits.maxConcurrent} running, ${t.slots} slot(s) free)`),{examined:n.examined,settled:n.settled.length,graduated:d,nominated:0,running:t.running,outcomes:a};let u=0;for(let e of t.candidates)try{let s=await m(`/api/instruction-suggestions/${e.id}/test`,{});if(s.existing){r(`${i}: comparison already recorded for "${e.name}" (${s.evalJobId})`);continue}u+=1,r(`${i}: queued bounded comparison and live-study preparation for "${e.name}"`)}catch(s){r(`${i}: could not measure "${e.name}" \u2014 ${s instanceof Error?s.message:String(s)}`)}return{examined:n.examined,settled:n.settled.length,graduated:d,nominated:u,queued:u,running:t.running,outcomes:a}}l(f,"cronInstructionTraining");export{f as a};
@@ -1 +1 @@
1
- import{a as I}from"./chunk-ISYU5BMU.js";import{b as A,c as l,d as b}from"./chunk-DANMUHNW.js";import{f as k}from"./chunk-GIXHG5FK.js";import{n as f,o as g,p as u,v,w as $,x as y}from"./chunk-X6CF5KTW.js";import{a as c}from"./chunk-ZLLER3HP.js";import{randomUUID as P}from"node:crypto";async function H(s){let{applyMode:e="human",...r}=s;await k("/api/recommendation-applications",{...r,harness:"claude_code",applyMode:e,status:"applied",applyBatchId:P(),applySeq:0})}c(H,"recordApplication");async function M(s,e){let r=c(t=>({action:"manual-required",instructionId:e.id,name:e.name,fileModified:!1,messages:t}),"refuse");if(s.actor!=="human")return r([`Not installed: ${e.name} is a hook, and a hook is a command this machine runs unattended.`,"Installing one is always a human decision \u2014 the same refusal the API makes server-side.",` Review it: rulemetric suggestions accept ${s.suggestionId}`]);let n=y(e);if(!n.spec)return r([`Not installed: ${e.name} does not contain an installable hook spec.`,...n.problems.map(t=>` ${t.field}: ${t.message}`)]);if(n.problems.length>0)return r([`Not installed: ${e.name}'s hook spec is not fit to act on.`,...n.problems.map(t=>` ${t.field}: ${t.message}`)]);let w=u(e.frontmatter),i=v(n.spec,w??void 0),p=f(i);if(p.length>0)return r([`Not installed: ${e.name}'s artifact spec is not fit to act on.`,...p.map(t=>` ${t.field}: ${t.message}`)]);let o=b(s.dir,i.requires);if(o.missing.length>0)return r([`Not installed: ${e.name} needs ${o.missing.join(", ")}, which is not present here.`,"It is left unapplied rather than installed and broken \u2014 a hook whose command is missing still runs, and fails, on every matching event.","Accept it again once the dependency exists."]);let a=A({dir:s.dir,instructionId:e.id,spec:n.spec});if(a.status==="refused")return r([`Not installed: ${e.name}.`,` ${a.reason}`]);let m=g(i,a.inverse);if(m.length>0)return l({dir:s.dir,inverse:a.inverse}),r([`Not installed: ${e.name} was written and then rolled back \u2014 the actuator could not produce a valid inverse.`,...m.map(t=>` ${t.field}: ${t.message}`)]);try{await H({instructionId:e.id,projectPath:s.projectPath,targetPath:a.target,beforeHash:a.beforeHash,appliedHash:a.inverse.hashAtWrite,boundaryClass:i.boundaryClass,targets:i.targets,inverse:a.inverse,requires:i.requires,provides:i.provides})}catch(t){let h=l({dir:s.dir,inverse:a.inverse});return r([`Not installed: ${e.name} \u2014 the effect could not be recorded, so it was undone.`,` ${t instanceof Error?t.message:String(t)}`,h.removed?" The hook was removed; your settings are as they were.":` WARNING: the rollback did not complete (${h.reason??"unknown reason"}). Check ${a.target} for the entry tagged with ${e.id}.`])}await I(s.suggestionId,s.projectPath,e.id,s.actor);let d=a.status==="installed"?[`Accepted: installed a ${n.spec.event} hook into ${a.target}.`]:[`Already present: this hook is already installed in ${a.target}.`];for(let t of $(n.spec))d.push(` ${t}`);return o.unverifiable.length>0&&d.push(` unchecked: ${o.unverifiable.join(", ")} \u2014 this command cannot verify that namespace.`),d.push(`Undo with: rulemetric suggestions undo ${e.id}`),{action:a.status==="installed"?"added":"already-present",instructionId:e.id,name:e.name,fileModified:a.status==="installed",messages:d}}c(M,"acceptHook");export{H as a,M as b};
1
+ import{b as A,c as l,d as b}from"./chunk-DANMUHNW.js";import{a as I}from"./chunk-JQ2ZCUEC.js";import{f as k}from"./chunk-Z7UN4R7T.js";import{n as f,o as g,p as u,v,w as $,x as y}from"./chunk-X6CF5KTW.js";import{a as c}from"./chunk-ZLLER3HP.js";import{randomUUID as P}from"node:crypto";async function H(s){let{applyMode:e="human",...r}=s;await k("/api/recommendation-applications",{...r,harness:"claude_code",applyMode:e,status:"applied",applyBatchId:P(),applySeq:0})}c(H,"recordApplication");async function M(s,e){let r=c(t=>({action:"manual-required",instructionId:e.id,name:e.name,fileModified:!1,messages:t}),"refuse");if(s.actor!=="human")return r([`Not installed: ${e.name} is a hook, and a hook is a command this machine runs unattended.`,"Installing one is always a human decision \u2014 the same refusal the API makes server-side.",` Review it: rulemetric suggestions accept ${s.suggestionId}`]);let n=y(e);if(!n.spec)return r([`Not installed: ${e.name} does not contain an installable hook spec.`,...n.problems.map(t=>` ${t.field}: ${t.message}`)]);if(n.problems.length>0)return r([`Not installed: ${e.name}'s hook spec is not fit to act on.`,...n.problems.map(t=>` ${t.field}: ${t.message}`)]);let w=u(e.frontmatter),i=v(n.spec,w??void 0),p=f(i);if(p.length>0)return r([`Not installed: ${e.name}'s artifact spec is not fit to act on.`,...p.map(t=>` ${t.field}: ${t.message}`)]);let o=b(s.dir,i.requires);if(o.missing.length>0)return r([`Not installed: ${e.name} needs ${o.missing.join(", ")}, which is not present here.`,"It is left unapplied rather than installed and broken \u2014 a hook whose command is missing still runs, and fails, on every matching event.","Accept it again once the dependency exists."]);let a=A({dir:s.dir,instructionId:e.id,spec:n.spec});if(a.status==="refused")return r([`Not installed: ${e.name}.`,` ${a.reason}`]);let m=g(i,a.inverse);if(m.length>0)return l({dir:s.dir,inverse:a.inverse}),r([`Not installed: ${e.name} was written and then rolled back \u2014 the actuator could not produce a valid inverse.`,...m.map(t=>` ${t.field}: ${t.message}`)]);try{await H({instructionId:e.id,projectPath:s.projectPath,targetPath:a.target,beforeHash:a.beforeHash,appliedHash:a.inverse.hashAtWrite,boundaryClass:i.boundaryClass,targets:i.targets,inverse:a.inverse,requires:i.requires,provides:i.provides})}catch(t){let h=l({dir:s.dir,inverse:a.inverse});return r([`Not installed: ${e.name} \u2014 the effect could not be recorded, so it was undone.`,` ${t instanceof Error?t.message:String(t)}`,h.removed?" The hook was removed; your settings are as they were.":` WARNING: the rollback did not complete (${h.reason??"unknown reason"}). Check ${a.target} for the entry tagged with ${e.id}.`])}await I(s.suggestionId,s.projectPath,e.id,s.actor);let d=a.status==="installed"?[`Accepted: installed a ${n.spec.event} hook into ${a.target}.`]:[`Already present: this hook is already installed in ${a.target}.`];for(let t of $(n.spec))d.push(` ${t}`);return o.unverifiable.length>0&&d.push(` unchecked: ${o.unverifiable.join(", ")} \u2014 this command cannot verify that namespace.`),d.push(`Undo with: rulemetric suggestions undo ${e.id}`),{action:a.status==="installed"?"added":"already-present",instructionId:e.id,name:e.name,fileModified:a.status==="installed",messages:d}}c(M,"acceptHook");export{H as a,M as b};