@rulemetric/cli 0.12.7 → 0.13.0

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 (262) hide show
  1. package/dist/base-command.js +1 -1
  2. package/dist/{chunk-INSKP5ED.js → chunk-25Q3Y7TC.js} +1 -1
  3. package/dist/{chunk-YSLKV4XC.js → chunk-25RDT32M.js} +1 -1
  4. package/dist/{chunk-HQCPGDQE.js → chunk-2EX27VJ3.js} +1 -1
  5. package/dist/{chunk-MJ5H7RDK.js → chunk-3MDEGOUG.js} +1 -1
  6. package/dist/{chunk-AGK5AUWT.js → chunk-3UPHCQWI.js} +1 -1
  7. package/dist/{chunk-FE2UWAIP.js → chunk-4COLIGD7.js} +1 -1
  8. package/dist/chunk-4FSQSETR.js +12 -0
  9. package/dist/{chunk-2KJAM2NG.js → chunk-4N43IBXH.js} +1 -1
  10. package/dist/chunk-4VN5PG2S.js +1 -0
  11. package/dist/chunk-5MXZJWQS.js +2 -0
  12. package/dist/{chunk-OOFGV7EX.js → chunk-5XK6LB2T.js} +1 -1
  13. package/dist/{chunk-MILLBGCB.js → chunk-6GAIYJ6K.js} +1 -1
  14. package/dist/chunk-6QLZT7EP.js +1 -0
  15. package/dist/{chunk-GRPUY2EZ.js → chunk-6W2GSV4O.js} +1 -1
  16. package/dist/{chunk-W23MESHM.js → chunk-6WQG6C7F.js} +1 -1
  17. package/dist/chunk-6XTLP2G7.js +1 -0
  18. package/dist/{chunk-E4RGYYBC.js → chunk-6ZPSVZNH.js} +1 -1
  19. package/dist/{chunk-TBU5SWA4.js → chunk-7AWFSFR7.js} +1 -1
  20. package/dist/{chunk-UGACB66X.js → chunk-APDRR6FS.js} +1 -1
  21. package/dist/{chunk-AFYZYXQ3.js → chunk-BG55WDDX.js} +1 -1
  22. package/dist/chunk-BZS5QRWB.js +4 -0
  23. package/dist/chunk-C42NTI2V.js +3 -0
  24. package/dist/{chunk-A2LHEUNW.js → chunk-CYYDQFRY.js} +1 -1
  25. package/dist/{chunk-NKJTNGXR.js → chunk-DUBBL57L.js} +1 -1
  26. package/dist/{chunk-E7XOYGL5.js → chunk-F6DAHCJC.js} +8 -8
  27. package/dist/{chunk-WCIX5KWG.js → chunk-GBWQENAH.js} +1 -1
  28. package/dist/{chunk-GOA5Q6TY.js → chunk-GJBS6QYC.js} +1 -1
  29. package/dist/{chunk-FUYR7CFD.js → chunk-H3BCWSYO.js} +1 -1
  30. package/dist/chunk-HLNHBZLI.js +1 -0
  31. package/dist/{chunk-WO6MS654.js → chunk-HLQZR4XJ.js} +1 -1
  32. package/dist/{chunk-DCH3QWB7.js → chunk-I3M5VBLT.js} +1 -1
  33. package/dist/{chunk-WMIUFMDI.js → chunk-J5HW45PZ.js} +9 -9
  34. package/dist/{chunk-CPDMJGTC.js → chunk-J6QMBMC2.js} +1 -1
  35. package/dist/{chunk-W67DO5PT.js → chunk-JNFB22FD.js} +1 -1
  36. package/dist/chunk-JWFRI32Y.js +3 -0
  37. package/dist/{chunk-WTMJSL7R.js → chunk-KCOJLTVX.js} +1 -1
  38. package/dist/chunk-KINIFUZQ.js +1 -0
  39. package/dist/{chunk-RFISMWRW.js → chunk-KV5A77XW.js} +1 -1
  40. package/dist/{chunk-DPCAPIQB.js → chunk-LTQ5BJYL.js} +1 -1
  41. package/dist/{chunk-G3HODHFN.js → chunk-M2VVRQKA.js} +1 -1
  42. package/dist/chunk-MLV2RHRE.js +1 -0
  43. package/dist/{chunk-UA5GEVGW.js → chunk-MNQPCNGQ.js} +1 -1
  44. package/dist/chunk-N7GK33PU.js +1 -0
  45. package/dist/{chunk-L54TWWBY.js → chunk-NBEZ5FAU.js} +1 -1
  46. package/dist/{chunk-PWTTCSQA.js → chunk-NRYLYMDM.js} +1 -1
  47. package/dist/{chunk-BTQQPQRG.js → chunk-O2HCD6XL.js} +1 -1
  48. package/dist/chunk-OZNKMJ5B.js +1 -0
  49. package/dist/{chunk-VYZKKSX4.js → chunk-P2WSDHIA.js} +1 -1
  50. package/dist/chunk-PPXOC7IV.js +1 -0
  51. package/dist/{chunk-5PM4E27L.js → chunk-PVGUDJD7.js} +1 -1
  52. package/dist/chunk-QFKUSNUB.js +1 -0
  53. package/dist/{chunk-EZHL527S.js → chunk-QTCWOIT4.js} +1 -1
  54. package/dist/chunk-R4QIPG4V.js +2 -0
  55. package/dist/{chunk-O65AQZYB.js → chunk-RGUCR7T6.js} +1 -1
  56. package/dist/chunk-RJX75Y7J.js +1 -0
  57. package/dist/{chunk-KJRMGTAO.js → chunk-RK663O4M.js} +1 -1
  58. package/dist/chunk-RO3ZZVCG.js +1 -0
  59. package/dist/{chunk-NF2BIEAF.js → chunk-SBGXIPRN.js} +1 -1
  60. package/dist/{chunk-S2SKT5PV.js → chunk-SN3CHV66.js} +1 -1
  61. package/dist/chunk-U3XKXJ3A.js +5 -0
  62. package/dist/chunk-U7TBEC3I.js +5 -0
  63. package/dist/{chunk-CZTTW3MZ.js → chunk-UE76F2NQ.js} +1 -1
  64. package/dist/chunk-UM4CBCXI.js +1 -0
  65. package/dist/{chunk-22ZDUL6H.js → chunk-UYPBIXF2.js} +1 -1
  66. package/dist/{chunk-5N5S3NKS.js → chunk-V2USQH27.js} +1 -1
  67. package/dist/{chunk-PVPYLKB3.js → chunk-VH2EAP4J.js} +1 -1
  68. package/dist/{chunk-UTAETY5Z.js → chunk-VIQ25ORK.js} +1 -1
  69. package/dist/chunk-VMJH4DNA.js +14 -0
  70. package/dist/{chunk-XFAFMYIP.js → chunk-VXUKXGRX.js} +1 -1
  71. package/dist/{chunk-BJSVATVJ.js → chunk-WH3IPXXQ.js} +2 -2
  72. package/dist/chunk-WHQ4BDSM.js +4 -0
  73. package/dist/{chunk-GHWBW2IW.js → chunk-WJZY5Y22.js} +1 -1
  74. package/dist/chunk-WOJ733IB.js +1 -0
  75. package/dist/{chunk-AKXGUQ5B.js → chunk-WQX4RRBQ.js} +1 -1
  76. package/dist/{chunk-ARC4Q3GL.js → chunk-WY3VVX3R.js} +1 -1
  77. package/dist/{chunk-Z4YVOVMM.js → chunk-Y7QIOPN5.js} +1 -1
  78. package/dist/{chunk-UKOI2Q4J.js → chunk-YI2OWO6R.js} +1 -1
  79. package/dist/{chunk-DSJNZWCZ.js → chunk-ZGW3N3A6.js} +1 -1
  80. package/dist/commands/antigravity/backfill.js +1 -1
  81. package/dist/commands/auth/create-key.js +1 -1
  82. package/dist/commands/auth/login.js +1 -1
  83. package/dist/commands/auth/logout.js +1 -1
  84. package/dist/commands/auth/revoke-key.js +1 -1
  85. package/dist/commands/auth/signup.js +1 -1
  86. package/dist/commands/auth/status.js +1 -1
  87. package/dist/commands/capture/scope.js +1 -1
  88. package/dist/commands/catalog/index.js +1 -1
  89. package/dist/commands/catalog/recommend.js +1 -1
  90. package/dist/commands/crons/list.js +1 -1
  91. package/dist/commands/crons/run.js +1 -1
  92. package/dist/commands/dashboard.js +1 -1
  93. package/dist/commands/diagnostics.js +1 -1
  94. package/dist/commands/eval-targets/create.js +1 -1
  95. package/dist/commands/eval-targets/list.js +1 -1
  96. package/dist/commands/evals/agent.js +3 -3
  97. package/dist/commands/evals/auto-run.js +1 -1
  98. package/dist/commands/evals/benchmark.js +1 -1
  99. package/dist/commands/evals/compare.js +1 -1
  100. package/dist/commands/evals/create.js +1 -1
  101. package/dist/commands/evals/optimize-description.js +1 -1
  102. package/dist/commands/evals/optimize.js +1 -1
  103. package/dist/commands/evals/refine-cases.js +1 -1
  104. package/dist/commands/evals/run.js +1 -1
  105. package/dist/commands/evals/validate-judge.js +1 -1
  106. package/dist/commands/experiments/list.js +1 -1
  107. package/dist/commands/gateway/ensure.js +1 -1
  108. package/dist/commands/hooks/emit-instructions.js +1 -1
  109. package/dist/commands/hooks/install.js +1 -1
  110. package/dist/commands/hooks/run.js +1 -1
  111. package/dist/commands/hooks/uninstall.js +1 -1
  112. package/dist/commands/instructions/create.js +1 -1
  113. package/dist/commands/instructions/dedupe.js +1 -1
  114. package/dist/commands/instructions/delete.js +1 -1
  115. package/dist/commands/instructions/fork.js +1 -1
  116. package/dist/commands/instructions/get.js +1 -1
  117. package/dist/commands/instructions/list.js +1 -1
  118. package/dist/commands/instructions/promote.js +1 -1
  119. package/dist/commands/instructions/pull.js +1 -1
  120. package/dist/commands/instructions/restore.js +1 -1
  121. package/dist/commands/instructions/retract.js +1 -1
  122. package/dist/commands/instructions/upstream.js +1 -1
  123. package/dist/commands/instructions/versions.js +1 -1
  124. package/dist/commands/launcher.js +1 -1
  125. package/dist/commands/local/down.js +1 -1
  126. package/dist/commands/local/up.js +1 -1
  127. package/dist/commands/org/current.js +1 -1
  128. package/dist/commands/org/list.js +1 -1
  129. package/dist/commands/org/switch.js +1 -1
  130. package/dist/commands/packs/add-instruction.js +1 -1
  131. package/dist/commands/packs/apply.js +1 -1
  132. package/dist/commands/packs/create.js +1 -1
  133. package/dist/commands/packs/fork.js +1 -1
  134. package/dist/commands/packs/get.js +1 -1
  135. package/dist/commands/packs/list.js +1 -1
  136. package/dist/commands/packs/remove-instruction.js +1 -1
  137. package/dist/commands/proxy/env.js +1 -1
  138. package/dist/commands/proxy/logs.js +1 -1
  139. package/dist/commands/proxy/restart.js +1 -1
  140. package/dist/commands/proxy/setup.js +1 -1
  141. package/dist/commands/proxy/start.js +1 -1
  142. package/dist/commands/proxy/status.js +1 -1
  143. package/dist/commands/proxy/stop.js +1 -1
  144. package/dist/commands/research/backfill.js +1 -1
  145. package/dist/commands/research/tail-transcript.js +1 -1
  146. package/dist/commands/service/install.js +1 -1
  147. package/dist/commands/service/status.js +1 -1
  148. package/dist/commands/service/uninstall.js +1 -1
  149. package/dist/commands/sessions/analyze.js +1 -1
  150. package/dist/commands/sessions/delete.js +1 -1
  151. package/dist/commands/sessions/end.js +1 -1
  152. package/dist/commands/sessions/import.js +1 -1
  153. package/dist/commands/sessions/list.js +1 -1
  154. package/dist/commands/sessions/start.js +1 -1
  155. package/dist/commands/setup.js +1 -1
  156. package/dist/commands/skills/export-approved.js +1 -1
  157. package/dist/commands/skills/install.js +1 -1
  158. package/dist/commands/skills/list.js +1 -1
  159. package/dist/commands/skills/publish.js +1 -1
  160. package/dist/commands/skills/search.js +1 -1
  161. package/dist/commands/skills/update.js +1 -1
  162. package/dist/commands/suggestions/accept.js +1 -1
  163. package/dist/commands/suggestions/auto.js +1 -1
  164. package/dist/commands/suggestions/dismiss.js +1 -1
  165. package/dist/commands/suggestions/list.js +1 -1
  166. package/dist/commands/suggestions/refresh.js +1 -1
  167. package/dist/commands/suggestions/undo.js +1 -1
  168. package/dist/dashboard/Dashboard.js +1 -1
  169. package/dist/dashboard/data.js +1 -1
  170. package/dist/dashboard/launcher/LauncherOverlay.js +1 -1
  171. package/dist/dashboard/launcher/api.js +1 -1
  172. package/dist/dashboard/launcher/useLaunchJobs.js +1 -1
  173. package/dist/{dist-XEWF3R3N.js → dist-45KJH5M7.js} +1 -1
  174. package/dist/lib/active-org-refresh.js +1 -1
  175. package/dist/lib/agent-loop.js +1 -1
  176. package/dist/lib/antigravity-transcript.js +1 -1
  177. package/dist/lib/api-client.js +1 -1
  178. package/dist/lib/codex-exec.js +1 -1
  179. package/dist/lib/ensure-api-key.js +1 -1
  180. package/dist/lib/ensure-fresh-token.js +1 -1
  181. package/dist/lib/eval-analyzer.js +1 -1
  182. package/dist/lib/eval-benchmark.js +1 -1
  183. package/dist/lib/eval-candidate-run.js +1 -1
  184. package/dist/lib/eval-case-generator.js +1 -1
  185. package/dist/lib/eval-conversation-handler.js +1 -1
  186. package/dist/lib/eval-executor.js +1 -1
  187. package/dist/lib/eval-grader.js +1 -1
  188. package/dist/lib/eval-meta-judge.js +1 -1
  189. package/dist/lib/eval-resume.js +1 -1
  190. package/dist/lib/eval-run-batch.js +1 -1
  191. package/dist/lib/eval-trigger-tester.js +1 -1
  192. package/dist/lib/evolution-enrolment.js +1 -1
  193. package/dist/lib/gateway-entry.js +1 -1
  194. package/dist/lib/gateway.js +1 -1
  195. package/dist/lib/harbor-readiness.js +1 -0
  196. package/dist/lib/insights/generation/installed-asks.js +1 -1
  197. package/dist/lib/insights/nomination/nominate.js +1 -1
  198. package/dist/lib/instruction-proposer.js +1 -1
  199. package/dist/lib/instruction-snapshot.js +1 -1
  200. package/dist/lib/instructions/acceptance/accept-events.js +1 -1
  201. package/dist/lib/instructions/acceptance/accept-hook.js +1 -1
  202. package/dist/lib/instructions/acceptance/agent-instruction-files.js +1 -0
  203. package/dist/lib/instructions/acceptance/hook-install.js +1 -1
  204. package/dist/lib/instructions/acceptance/reverse-applications.js +1 -1
  205. package/dist/lib/instructions/acceptance/suggestion-accept.js +1 -1
  206. package/dist/lib/jobs/handlers/cron-auto-accept-suggestions.js +1 -1
  207. package/dist/lib/jobs/handlers/cron-eval-autorun.js +1 -1
  208. package/dist/lib/jobs/handlers/cron-instruction-evolution.js +1 -1
  209. package/dist/lib/jobs/handlers/cron-instruction-training.js +1 -1
  210. package/dist/lib/jobs/handlers/cron-reconcile-attribution.js +1 -1
  211. package/dist/lib/jobs/handlers/cron-refine-cases.js +1 -1
  212. package/dist/lib/jobs/handlers/cron-refresh-pricing.js +1 -1
  213. package/dist/lib/jobs/handlers/cron-retire-unused-skills.js +1 -1
  214. package/dist/lib/jobs/handlers/cron-suggest-instructions.js +1 -1
  215. package/dist/lib/jobs/handlers/distill-memories.js +1 -1
  216. package/dist/lib/jobs/handlers/harbor-ab-verdict.js +1 -0
  217. package/dist/lib/jobs/handlers/harbor-ab.js +1 -0
  218. package/dist/lib/jobs/handlers/process-changelog.js +1 -1
  219. package/dist/lib/jobs/handlers/process-conversation.js +1 -1
  220. package/dist/lib/jobs/handlers/process-eval.js +1 -1
  221. package/dist/lib/jobs/handlers/process-insights.js +1 -1
  222. package/dist/lib/jobs/handlers/process-judge-review.js +1 -1
  223. package/dist/lib/jobs/handlers/process-launch.js +1 -1
  224. package/dist/lib/jobs/handlers/process-memory-ab.js +1 -1
  225. package/dist/lib/jobs/handlers/process-run-cleanup.js +1 -1
  226. package/dist/lib/jobs/handlers/process-session-goal.js +1 -1
  227. package/dist/lib/jobs/shed-retry.js +1 -0
  228. package/dist/lib/judge-review-runner.js +1 -1
  229. package/dist/lib/llm-client.js +1 -1
  230. package/dist/lib/llm-json.js +1 -0
  231. package/dist/lib/machine-pause-detector.js +1 -1
  232. package/dist/lib/manual-tasks-meta.js +1 -1
  233. package/dist/lib/manual-tasks.js +1 -1
  234. package/dist/lib/projects/workspace/worktree.js +1 -1
  235. package/dist/lib/refine-cases.js +1 -1
  236. package/dist/lib/research-client.js +1 -1
  237. package/dist/lib/retraction.js +1 -1
  238. package/dist/lib/reviewer-detect.js +1 -1
  239. package/dist/lib/setup-steps.js +1 -1
  240. package/dist/lib/telemetry.js +1 -1
  241. package/dist/lib/terminal-target-heartbeat.js +1 -1
  242. package/dist/lib/tool-bin.js +1 -0
  243. package/dist/lib/transcript-instruction-linking.js +1 -0
  244. package/dist/lib/transcript-sync.js +1 -1
  245. package/dist/lib/work-report.js +1 -0
  246. package/oclif.manifest.json +336 -329
  247. package/package.json +8 -7
  248. package/dist/chunk-3DZD322E.js +0 -1
  249. package/dist/chunk-47YDQYTD.js +0 -14
  250. package/dist/chunk-5OX6YKTR.js +0 -5
  251. package/dist/chunk-APXQLQZY.js +0 -1
  252. package/dist/chunk-C6GLNE6X.js +0 -1
  253. package/dist/chunk-CNQ5DTNC.js +0 -1
  254. package/dist/chunk-EVD5A3VI.js +0 -1
  255. package/dist/chunk-GWDZNGUP.js +0 -2
  256. package/dist/chunk-LUCVMLHV.js +0 -1
  257. package/dist/chunk-QBNLZJIR.js +0 -6
  258. package/dist/chunk-RIVEBBZC.js +0 -3
  259. package/dist/chunk-RLEMDKQ4.js +0 -12
  260. package/dist/chunk-TZA4HAVF.js +0 -1
  261. package/dist/chunk-UUFCTEBT.js +0 -1
  262. package/dist/chunk-UXB6DRR7.js +0 -3
@@ -1 +1 @@
1
- import{a}from"./chunk-DSJNZWCZ.js";import"./chunk-IZTIYR5Q.js";import"./chunk-OOFGV7EX.js";import"./chunk-VYZKKSX4.js";import"./chunk-YSLKV4XC.js";import"./chunk-3AV3GTMP.js";import"./chunk-UGACB66X.js";import"./chunk-WMIUFMDI.js";import"./chunk-PZNWH4VQ.js";import"./chunk-ZLLER3HP.js";export{a as BaseCommand};
1
+ import{a}from"./chunk-ZGW3N3A6.js";import"./chunk-IZTIYR5Q.js";import"./chunk-5XK6LB2T.js";import"./chunk-P2WSDHIA.js";import"./chunk-25RDT32M.js";import"./chunk-3AV3GTMP.js";import"./chunk-APDRR6FS.js";import"./chunk-J5HW45PZ.js";import"./chunk-PZNWH4VQ.js";import"./chunk-ZLLER3HP.js";export{a as BaseCommand};
@@ -1 +1 @@
1
- import{b as u,c as d}from"./chunk-UKOI2Q4J.js";import{b as g}from"./chunk-KJRMGTAO.js";import{e as m,f as p,h as l}from"./chunk-UGACB66X.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-YI2OWO6R.js";import{b as g}from"./chunk-RK663O4M.js";import{e as m,f as p,h as l}from"./chunk-APDRR6FS.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{a as s,b as n,c as a,d as g}from"./chunk-3AV3GTMP.js";import{e as o}from"./chunk-UGACB66X.js";import{a as e}from"./chunk-ZLLER3HP.js";var i=!1;async function c(){if(process.env.RULEMETRIC_ORG_ID)return;let r=s();if(!(r&&!g(r)))try{let t=await o("/api/profile");if(!t.activeOrgId){a();return}if(r&&t.activeOrgId===r.orgId){n({orgId:r.orgId,orgSlug:r.orgSlug,syncedAt:Date.now()});return}let d=(await o("/api/orgs")).find(l=>l.id===t.activeOrgId);n({orgId:t.activeOrgId,orgSlug:d?.slug,syncedAt:Date.now()})}catch{}}e(c,"syncActiveOrgFromServer");async function p(){i||(i=!0,await c())}e(p,"maybeRefreshActiveOrg");async function v(){i=!0,await c()}e(v,"bootstrapActiveOrg");function O(){i=!1}e(O,"_resetRefreshAttempt");export{p as a,v as b,O as c};
1
+ import{a as s,b as n,c as a,d as g}from"./chunk-3AV3GTMP.js";import{e as o}from"./chunk-APDRR6FS.js";import{a as e}from"./chunk-ZLLER3HP.js";var i=!1;async function c(){if(process.env.RULEMETRIC_ORG_ID)return;let r=s();if(!(r&&!g(r)))try{let t=await o("/api/profile");if(!t.activeOrgId){a();return}if(r&&t.activeOrgId===r.orgId){n({orgId:r.orgId,orgSlug:r.orgSlug,syncedAt:Date.now()});return}let d=(await o("/api/orgs")).find(l=>l.id===t.activeOrgId);n({orgId:t.activeOrgId,orgSlug:d?.slug,syncedAt:Date.now()})}catch{}}e(c,"syncActiveOrgFromServer");async function p(){i||(i=!0,await c())}e(p,"maybeRefreshActiveOrg");async function v(){i=!0,await c()}e(v,"bootstrapActiveOrg");function O(){i=!1}e(O,"_resetRefreshAttempt");export{p as a,v as b,O as c};
@@ -1 +1 @@
1
- import{f as u}from"./chunk-UGACB66X.js";import{a as m}from"./chunk-ZLLER3HP.js";async function p(n,a,s){if(a)try{let t=Array.isArray(n.recommendation_candidates)?n.recommendation_candidates.filter(e=>typeof e.title=="string"&&typeof e.artifact=="string"&&typeof e.canonicalBody=="string"&&e.canonicalBody.trim().length>=12).map(e=>({title:String(e.title).trim(),artifact:String(e.artifact),canonicalBody:String(e.canonicalBody).trim(),rationale:String(e.rationale??""),evidence:Array.isArray(e.evidence)?e.evidence:[],outcomeMetric:String(e.outcomeMetric??"session_outcome"),renderings:Array.isArray(e.renderings)?e.renderings:[]})):[],i=n.suggestions,l=Array.isArray(i?.claude_md_additions)?i.claude_md_additions.filter(e=>typeof e?.addition=="string"&&e.addition.trim().length>=12).map(e=>({addition:String(e.addition).trim(),why:String(e.why??"")})):[],d=Array.isArray(n.recommended_skills)?n.recommended_skills.filter(e=>typeof e?.skillId=="string"&&e.skillId.length>0).map(e=>({skillId:String(e.skillId),reason:String(e.reason??"")})):[],g=Array.isArray(i?.features_to_try)?i.features_to_try.filter(e=>typeof e?.feature=="string"&&e.feature.trim().length>=2).map(e=>({feature:String(e.feature).trim(),one_liner:String(e.one_liner??""),why_for_you:String(e.why_for_you??""),example_code:String(e.example_code??"")})):[],c=[...Array.isArray(i?.usage_patterns)?i.usage_patterns.map(e=>({title:String(e.title??"").trim(),lead:String(e.suggestion??""),detail:String(e.detail??""),copyable_prompt:String(e.copyable_prompt??""),origin:"usage_pattern"})):[],...Array.isArray(n.on_the_horizon?.opportunities)?n.on_the_horizon.opportunities.map(e=>({title:String(e.title??"").trim(),lead:String(e.whats_possible??""),detail:String(e.how_to_try??""),copyable_prompt:String(e.copyable_prompt??""),origin:"opportunity"})):[]].filter(e=>e.title.length>=2);if(t.length===0&&l.length===0&&d.length===0&&g.length===0&&c.length===0)return;let r=await u("/api/insights/recommendations/nominate",{projectPath:a,candidates:t.slice(0,40),additions:l.slice(0,20),skills:d.slice(0,20),features:g.slice(0,20),advice:c.slice(0,40)}),o=r.additionsRejected??[];s(` ${r.nominated} recommendation(s) nominated into the suggestion feed (${r.additionsCreated} new instruction(s)`+((r.featuresCreated??0)>0?`, ${r.featuresCreated} feature proposal(s)`:"")+((r.adviceCreated??0)>0?`, ${r.adviceCreated} pattern/opportunity`:"")+(r.skillsUnresolved>0?`, ${r.skillsUnresolved} skill slug(s) unresolved`:"")+(o.length>0?`, ${o.length} rejected as unfilled templates`:"")+")");for(let e of o)s(` rejected "${e.name}" \u2014 unfilled placeholder(s): ${e.placeholders.join(", ")}`);for(let e of r.itemsFailed??[])s(` failed "${e.name}" \u2014 ${e.error}`)}catch(t){s(` nomination skipped (whole batch): ${t instanceof Error?t.message:String(t)}`)}}m(p,"nominateRecommendations");export{p as a};
1
+ import{f as u}from"./chunk-APDRR6FS.js";import{a as m}from"./chunk-ZLLER3HP.js";async function p(n,a,s){if(a)try{let t=Array.isArray(n.recommendation_candidates)?n.recommendation_candidates.filter(e=>typeof e.title=="string"&&typeof e.artifact=="string"&&typeof e.canonicalBody=="string"&&e.canonicalBody.trim().length>=12).map(e=>({title:String(e.title).trim(),artifact:String(e.artifact),canonicalBody:String(e.canonicalBody).trim(),rationale:String(e.rationale??""),evidence:Array.isArray(e.evidence)?e.evidence:[],outcomeMetric:String(e.outcomeMetric??"session_outcome"),renderings:Array.isArray(e.renderings)?e.renderings:[]})):[],i=n.suggestions,l=Array.isArray(i?.claude_md_additions)?i.claude_md_additions.filter(e=>typeof e?.addition=="string"&&e.addition.trim().length>=12).map(e=>({addition:String(e.addition).trim(),why:String(e.why??"")})):[],d=Array.isArray(n.recommended_skills)?n.recommended_skills.filter(e=>typeof e?.skillId=="string"&&e.skillId.length>0).map(e=>({skillId:String(e.skillId),reason:String(e.reason??"")})):[],g=Array.isArray(i?.features_to_try)?i.features_to_try.filter(e=>typeof e?.feature=="string"&&e.feature.trim().length>=2).map(e=>({feature:String(e.feature).trim(),one_liner:String(e.one_liner??""),why_for_you:String(e.why_for_you??""),example_code:String(e.example_code??"")})):[],c=[...Array.isArray(i?.usage_patterns)?i.usage_patterns.map(e=>({title:String(e.title??"").trim(),lead:String(e.suggestion??""),detail:String(e.detail??""),copyable_prompt:String(e.copyable_prompt??""),origin:"usage_pattern"})):[],...Array.isArray(n.on_the_horizon?.opportunities)?n.on_the_horizon.opportunities.map(e=>({title:String(e.title??"").trim(),lead:String(e.whats_possible??""),detail:String(e.how_to_try??""),copyable_prompt:String(e.copyable_prompt??""),origin:"opportunity"})):[]].filter(e=>e.title.length>=2);if(t.length===0&&l.length===0&&d.length===0&&g.length===0&&c.length===0)return;let r=await u("/api/insights/recommendations/nominate",{projectPath:a,candidates:t.slice(0,40),additions:l.slice(0,20),skills:d.slice(0,20),features:g.slice(0,20),advice:c.slice(0,40)}),o=r.additionsRejected??[];s(` ${r.nominated} recommendation(s) nominated into the suggestion feed (${r.additionsCreated} new instruction(s)`+((r.featuresCreated??0)>0?`, ${r.featuresCreated} feature proposal(s)`:"")+((r.adviceCreated??0)>0?`, ${r.adviceCreated} pattern/opportunity`:"")+(r.skillsUnresolved>0?`, ${r.skillsUnresolved} skill slug(s) unresolved`:"")+(o.length>0?`, ${o.length} rejected as unfilled templates`:"")+")");for(let e of o)s(` rejected "${e.name}" \u2014 unfilled placeholder(s): ${e.placeholders.join(", ")}`);for(let e of r.itemsFailed??[])s(` failed "${e.name}" \u2014 ${e.error}`)}catch(t){s(` nomination skipped (whole batch): ${t instanceof Error?t.message:String(t)}`)}}m(p,"nominateRecommendations");export{p as a};
@@ -1 +1 @@
1
- import{a as i}from"./chunk-5PM4E27L.js";import{h as s}from"./chunk-UGACB66X.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-PVGUDJD7.js";import{h as s}from"./chunk-APDRR6FS.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,2 +1,2 @@
1
- import{c as E,m}from"./chunk-E7XOYGL5.js";import{a as d}from"./chunk-UGACB66X.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,m}from"./chunk-F6DAHCJC.js";import{a as d}from"./chunk-APDRR6FS.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};
@@ -1,3 +1,3 @@
1
- import{e as p}from"./chunk-LJRE3LZ2.js";import{y as f}from"./chunk-WMIUFMDI.js";import{a as r}from"./chunk-ZLLER3HP.js";var g=80,h=/\b(must|never|always|do not|don'?t|avoid|prefer|require[sd]?|before|after|only|instead of|use|run|add|keep|stop|refuse|check|verify|ask|write|read)\b/i,m=200,k=r(()=>({asks:[],omitted:0}),"empty");function A(s){return s.replace(/\s+/g," ").trim().toLowerCase()}r(A,"key");function I(s){let t=[];for(let o of s.split(`
1
+ import{e as p}from"./chunk-LJRE3LZ2.js";import{A as f}from"./chunk-J5HW45PZ.js";import{a as r}from"./chunk-ZLLER3HP.js";var g=80,h=/\b(must|never|always|do not|don'?t|avoid|prefer|require[sd]?|before|after|only|instead of|use|run|add|keep|stop|refuse|check|verify|ask|write|read)\b/i,m=200,k=r(()=>({asks:[],omitted:0}),"empty");function A(s){return s.replace(/\s+/g," ").trim().toLowerCase()}r(A,"key");function I(s){let t=[];for(let o of s.split(`
2
2
  `)){let e=o.trim(),n=t.length>0?t[t.length-1]:"",i=e===""||/^(?:[-*+]|\d+[.)]|#|```|>|\||!)/.test(e);if(n!==""&&!/[.!?:;]$/.test(n)&&!/^(?:#|```)/.test(n)&&!i){t[t.length-1]=`${n} ${e}`;continue}t.push(e)}return t.join(`
3
3
  `)}r(I,"unwrap");function y(s,t=p){if(!s)return k();try{let o=new Set,e=[],n=[];for(let l of t(s))for(let d of f(I(l.content))){let c=A(d);if(c===""||o.has(c))continue;o.add(c);let a=d.replace(/\s+/g," ").trim(),u=a.length>m?`${a.slice(0,m)}\u2026`:a;(h.test(u)?e:n).push(u)}let i=[...e,...n];return{asks:i.slice(0,g),omitted:Math.max(0,i.length-g)}}catch{return k()}}r(y,"readInstalledAsks");export{g as a,m as b,y as c};
@@ -0,0 +1,12 @@
1
+ import{a as R,b as F}from"./chunk-VH2EAP4J.js";import{a as h,b as I}from"./chunk-UYPBIXF2.js";import{d as k}from"./chunk-OZNKMJ5B.js";import{a as $,b as w,e as U}from"./chunk-LJRE3LZ2.js";import{g as j,i as D,j as P}from"./chunk-UPFH72PF.js";import{e as v,f as x,i as C}from"./chunk-APDRR6FS.js";import{B as S,D as b,E as T,o as A}from"./chunk-J5HW45PZ.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 L(m.join(e,"CLAUDE.md"),t,n)}l(ie,"appendToCLAUDEmd");function L(e,t,n){let i=$(t),s=w(t),a=u.existsSync(e)?u.readFileSync(e,"utf8"):"";if(a.includes(i))return!1;let p=`${a.length>0&&!a.endsWith(`
2
+ `)?`
3
+
4
+ `:a.length>0?`
5
+ `:""}
6
+ ${i}
7
+ ${n}
8
+ ${s}
9
+ `;return u.mkdirSync(m.dirname(e),{recursive:!0}),u.writeFileSync(e,a+p,"utf8"),!0}l(L,"appendBlockToFile");function N(e,t,n,i={}){return k(e,i).filter(s=>L(s.path,t,n))}l(N,"appendToAgentInstructionFiles");function _(e,t,n={}){return k(e,n).filter(i=>E(i.path,t))}l(_,"removeFromAgentInstructionFiles");function re(e,t){return E(m.join(e,"CLAUDE.md"),t)}l(re,"removeFromCLAUDEmd");function E(e,t){if(!u.existsSync(e))return!1;let n=$(t),i=w(t),s=u.readFileSync(e,"utf8"),a=s.indexOf(n);if(a===-1)return!1;let c=s.indexOf(i,a);if(c===-1)return!1;let p=s.slice(0,a),d=s.slice(c+i.length),o=(p.replace(/\n+$/,"")+`
10
+ `+d.replace(/^\n+/,"")).replace(/^\n+/,"");return u.writeFileSync(e,o,"utf8"),!0}l(E,"removeBlockFromFile");function g(e,t=90){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}l(g,"truncate");function q(e){return v(`/api/instruction-suggestions/${encodeURIComponent(e)}`)}l(q,"fetchSuggestion");async function ae(e){let t=e.suggestion??await q(e.suggestionId);if(t.kind==="remove")return B(e,t);if(t.kind==="trim")return K(e,t);let n=t.instructionId;t.instructionScope==="public"&&(n=(await x(`/api/instructions/${encodeURIComponent(t.instructionId)}/promote-from-public`,{targetScope:"personal"})).instructionId);let i=await v(`/api/instructions/${encodeURIComponent(n)}`),a=i.type!=="skill"&&i.type!=="hook"&&!O.has(i.type??"")?T(i.content,r=>u.existsSync(m.join(e.dir,r))):[];if(a.length>0)return await I(e.suggestionId,e.projectPath,n,e.actor,"unresolvable_reference"),{action:"unresolvable-reference",instructionId:n,name:i.name,fileModified:!1,unresolvable:a,messages:[`Refused: ${i.name} tells the agent to run something this project does not have.`,...a.map(r=>` ${r.path} \u2014 no such file under ${e.dir}`),"Nothing was written. A confident instruction pointing at a file that is not there costs every future session the time it takes to discover that."]};let c;if(!e.force){let r=S(i.content,U(e.dir)),M=e.actor==="auto"?r.matches.length>0:r.redundant;if(!r.redundant&&r.matches.length>0&&(c=r),M){let y=r.redundant;return await I(e.suggestionId,e.projectPath,n,e.actor,y?"redundant":"partial_overlap"),{action:"redundant",instructionId:n,name:i.name,fileModified:!1,redundancy:r,partialOverlap:y?void 0:r,messages:[y?`Skipped: ${i.name} already applies here in different words \u2014 adding it would spend context to say the same thing twice.`:`Refused: ${r.matches.length} of ${r.matches.length+r.novel.length} asks in ${i.name} are already covered here, so adopting it would restate the file back at itself.`,...r.matches.map(f=>` "${g(f.directive)}"
11
+ already covered by ${f.matchedSource??f.matchedId} (${(f.similarity*100).toFixed(0)}% match): "${g(f.matchedDirective)}"`),...y?[]:["Still wanted, and not adopted:",...r.novel.map(f=>` "${g(f)}"`),"Propose those on their own and they can be adopted, tracked and undone individually."],"Add it anyway with `--force` if the overlap is not real."]}}}if(i.type==="skill")return H(e,{...i,id:n});if(i.type==="hook")return F(e,{...i,id:n});if(O.has(i.type??""))return{action:"manual-required",instructionId:n,name:i.name,fileModified:!1,messages:[`Not installed: ${i.name} is a ${i.type} artifact, and installing one runs code or edits tool configuration \u2014 that always requires a human.`,` Review it: rulemetric instructions get ${n}`,"Nothing was written. This proposal will keep appearing until you act on it or dismiss it."]};let d=N(e.dir,n,i.content).length>0;await h(e.suggestionId,e.projectPath,n,e.actor);let o=d&&c?[` Note: ${c.matches.length} of ${c.matches.length+c.novel.length} asks in this rule already appear elsewhere in context; it was added for the rest.`,...c.matches.map(r=>` "${g(r.directive)}"
12
+ repeats ${r.matchedSource??r.matchedId} (${(r.similarity*100).toFixed(0)}%): "${g(r.matchedDirective)}"`)]:[];return{action:d?"added":"already-present",instructionId:n,name:i.name,fileModified:d,partialOverlap:d?c:void 0,messages:d?[`Accepted: added ${i.name} to CLAUDE.md. It will be active starting in your next session.`,...o]:[`Already present: ${i.name} is already in CLAUDE.md (block id: ${n}).`]}}l(ae,"acceptSuggestion");async function H(e,t){if(!e.force){let o=b({name:t.name,content:t.content},D(e.dir));if(o)return await I(e.suggestionId,e.projectPath,t.id,e.actor),{action:"redundant",instructionId:t.id,name:t.name,fileModified:!1,duplicateOf:o,messages:[`Skipped: ${t.name} is already installed here as ${o.name}`+(o.reason==="name-stem"?" (same skill, different content-hash suffix).":` (${(o.similarity*100).toFixed(0)}% identical body).`),` Installed: ${P(e.dir,o.name)}`,"A second copy is not more available \u2014 it is one more thing to keep in sync."]}}let n=j({dir:e.dir,name:t.name,content:t.content,description:t.description}),i=[...n.warnings],s=[m.relative(e.dir,n.skillFile)];n.linkKind!=="none"&&s.push(m.relative(e.dir,n.linkPath));let a={boundaryClass:"inside",targets:s,requires:[],provides:[`skill:${n.dirName}`]},c={kind:"delete-paths",paths:s},p=A(a,c);if(p.length===0)try{await R({instructionId:t.id,projectPath:e.projectPath,targetPath:n.skillFile,beforeHash:"",appliedHash:"",boundaryClass:a.boundaryClass,targets:a.targets,inverse:c,requires:a.requires,provides:a.provides,applyMode:e.actor==="auto"?"auto":"human"})}catch(o){i.push(`the effect ledger did not record this install (${o instanceof Error?o.message:String(o)}) \u2014 \`suggestions undo\` will not remove it; delete ${s.join(" and ")} by hand.`)}else i.push(`no reversible inverse could be recorded (${p.map(o=>o.message).join("; ")}).`);await h(e.suggestionId,e.projectPath,t.id,e.actor);let d=[`Accepted: installed skill ${n.dirName} to ${m.relative(e.dir,n.skillFile)}.`];n.linkKind==="none"&&d.push("Claude Code will NOT see it yet \u2014 its path is taken by a directory this command did not create."),d.push("It loads on demand, so it costs no context until a task matches its description."),d.push(`Undo with: rulemetric suggestions undo ${t.id}`);for(let o of i)d.push(` Warning: ${o}`);return{action:"added",instructionId:t.id,name:t.name,fileModified:!0,messages:d}}l(H,"acceptSkill");async function K(e,t){let n=t.estimatedTokens?` It currently costs roughly ${t.estimatedTokens} tokens per session (estimated).`:"";return await h(e.suggestionId,e.projectPath,t.instructionId,e.actor),{action:"acknowledged",instructionId:t.instructionId,name:t.name,fileModified:!1,messages:[`Noted: ${t.name} is measured neutral, not harmful.${n}`,"Nothing was changed \u2014 trimming is a judgement call about which parts carry the value,","and the measurement only found the absence of a detectable effect, not which half to cut.",` View it: rulemetric instructions get ${t.instructionId}`," Then edit CLAUDE.md (or the instruction) and let the next measurement cycle re-check it.","This suggestion will stop re-surfacing."]}}l(K,"acknowledgeTrim");async function B(e,t){let n=_(e.dir,t.instructionId).length>0;await C(`/api/instructions/${encodeURIComponent(t.instructionId)}`);let i=t.estimatedTokens?` Frees roughly ${t.estimatedTokens} tokens of context per session (estimated).`:"",s=n?[`Retired: removed ${t.name} from CLAUDE.md and archived it.${i}`]:[`Archived ${t.name}.${i}`,"CLAUDE.md was not modified \u2014 no rulemetric-managed block for this instruction was found in this directory. If you added it by hand, remove it yourself."];return s.push("Undo with: rulemetric instructions restore "+t.instructionId),await h(e.suggestionId,e.projectPath,t.instructionId,e.actor),{action:n?"retired":"archived-only",instructionId:t.instructionId,name:t.name,fileModified:n,messages:s}}l(B,"acceptRemoval");export{ie as a,L as b,N as c,_ as d,re as e,E as f,q as g,ae as h};
@@ -1 +1 @@
1
- import{b as g,c as m}from"./chunk-N7ODX6PO.js";import{e as s,h as c}from"./chunk-UGACB66X.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-APDRR6FS.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
+ var e=[{name:"cron_check_changelog",description:"Parse CHANGELOG.md and create draft announcement rows for new versions.",scheduledBy:"manual only \u2014 announcement drafts are reminder-driven, never scheduled"},{name:"cron_suggest_instructions",description:"Precompute per-project instruction suggestions for the SessionStart hook.",scheduledBy:"Supabase pg_cron daily 04:30 UTC \u2192 agent_jobs \u2192 agent loop (migration 00083)"},{name:"cron_reconcile_attribution",description:"Re-attribute captured sessions that never resolved to a project (project_id NULL), using git anchors read from the checkouts on this machine.",scheduledBy:"Supabase pg_cron hourly :20 \u2192 agent_jobs \u2192 agent loop (migration 00206)"},{name:"harbor_ab",description:"Run the external Harbor A/B over the PROVEN tasks (rm-batch-task, rm-locality-task) at n=25/arm on this machine: Docker + harbor + your own agent CLI, ~$5 of subscription quota and ~35 min. Same handler the schedule runs.",scheduledBy:"API harbor producer, hourly tick \u2192 agent_jobs \u2192 agent loop, per profiles.harbor_ab_cadence (migration 00217; default off; PATCH /api/settings/harbor)"},{name:"cron_refresh_skills",description:"Refresh the skills registry from GitHub sources (disk JSON + public instructions sync). Requires GITHUB_TOKEN.",scheduledBy:"Supabase pg_cron daily 03:30 UTC \u2192 agent_jobs \u2192 agent loop (migration 00086)"}];export{e as a};
@@ -0,0 +1,2 @@
1
+ import{a as i}from"./chunk-ZLLER3HP.js";function c(n){let e="",o=!1,r=!1;for(let s=0;s<n.length;s++){let t=n[s];if(!o){t==='"'&&(o=!0),e+=t;continue}if(r){e+=t,r=!1;continue}if(t==="\\"){e+=t,r=!0;continue}if(t==='"'){e+=t,o=!1;continue}if(n.charCodeAt(s)<=31){t===`
2
+ `?e+="\\n":t==="\r"?e+="\\r":t===" "&&(e+="\\t");continue}e+=t}return e}i(c,"sanitizeJsonControlChars");function a(n){let e;try{return{ok:!0,value:JSON.parse(n),sanitized:!1}}catch(r){e=r instanceof Error?r.message:String(r)}let o=c(n);if(o!==n)try{return{ok:!0,value:JSON.parse(o),sanitized:!0}}catch{}return{ok:!1,error:e}}i(a,"parseJsonObjectLoose");function l(n){let e=n.match(/\{[\s\S]*\}/);return e?e[0]:null}i(l,"extractJsonObject");export{c as a,a as b,l as c};
@@ -1 +1 @@
1
- import{a as d,d as m}from"./chunk-UGACB66X.js";import{a as c,l as a}from"./chunk-PZNWH4VQ.js";import{a as o}from"./chunk-ZLLER3HP.js";import{createHash as g,randomUUID as v}from"node:crypto";import{hostname as y,platform as p}from"node:os";import{existsSync as P,mkdirSync as _,readFileSync as h,writeFileSync as R}from"node:fs";import{join as E}from"node:path";var O="device-id";function u(){let e=o(t=>t==="1"||t==="true","off");return e(process.env.RULEMETRIC_NO_TELEMETRY)||e(process.env.DO_NOT_TRACK)}o(u,"telemetryDisabled");function l(){let e=a(),t=E(e,O);try{if(P(t)){let r=h(t,"utf-8").trim();if(r)return r}}catch{}let n=g("sha256").update(`${v()}:${y()}`).digest("hex").slice(0,32);try{_(e,{recursive:!0}),R(t,n,{mode:384})}catch{}return n}o(l,"getDeviceId");async function U(e,t={},n){if(!u())try{await m("/api/telemetry/cli-events",{method:"POST",body:{event:e,deviceId:l(),cliVersion:n,os:p(),props:t},timeoutMs:5e3})}catch{}}o(U,"emitSetupEvent");async function w(e){if(u())return;let n=`${process.env.RULEMETRIC_API_URL??c().apiUrl??d}/api/telemetry/cli-error`,r=process.env.HTTPS_PROXY,s=process.env.HTTP_PROXY,T=r!==void 0||s!==void 0;delete process.env.HTTPS_PROXY,delete process.env.HTTP_PROXY;let i=new AbortController,f=setTimeout(()=>i.abort(),4e3);try{await globalThis.fetch(n,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":`rulemetric-cli/${e.cliVersion??"unknown"}`},body:JSON.stringify({event:e.event??"onboarding_error",deviceId:l(),command:e.command,statusCode:e.statusCode,message:e.message?e.message.slice(0,500):void 0,cliVersion:e.cliVersion,os:p(),nodeVersion:process.version,proxied:T,props:e.props}),signal:i.signal})}catch{}finally{clearTimeout(f),r!==void 0&&(process.env.HTTPS_PROXY=r),s!==void 0&&(process.env.HTTP_PROXY=s)}}o(w,"emitErrorBeacon");export{u as a,l as b,U as c,w as d};
1
+ import{a as d,d as m}from"./chunk-APDRR6FS.js";import{a as c,l as a}from"./chunk-PZNWH4VQ.js";import{a as o}from"./chunk-ZLLER3HP.js";import{createHash as g,randomUUID as v}from"node:crypto";import{hostname as y,platform as p}from"node:os";import{existsSync as P,mkdirSync as _,readFileSync as h,writeFileSync as R}from"node:fs";import{join as E}from"node:path";var O="device-id";function u(){let e=o(t=>t==="1"||t==="true","off");return e(process.env.RULEMETRIC_NO_TELEMETRY)||e(process.env.DO_NOT_TRACK)}o(u,"telemetryDisabled");function l(){let e=a(),t=E(e,O);try{if(P(t)){let r=h(t,"utf-8").trim();if(r)return r}}catch{}let n=g("sha256").update(`${v()}:${y()}`).digest("hex").slice(0,32);try{_(e,{recursive:!0}),R(t,n,{mode:384})}catch{}return n}o(l,"getDeviceId");async function U(e,t={},n){if(!u())try{await m("/api/telemetry/cli-events",{method:"POST",body:{event:e,deviceId:l(),cliVersion:n,os:p(),props:t},timeoutMs:5e3})}catch{}}o(U,"emitSetupEvent");async function w(e){if(u())return;let n=`${process.env.RULEMETRIC_API_URL??c().apiUrl??d}/api/telemetry/cli-error`,r=process.env.HTTPS_PROXY,s=process.env.HTTP_PROXY,T=r!==void 0||s!==void 0;delete process.env.HTTPS_PROXY,delete process.env.HTTP_PROXY;let i=new AbortController,f=setTimeout(()=>i.abort(),4e3);try{await globalThis.fetch(n,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":`rulemetric-cli/${e.cliVersion??"unknown"}`},body:JSON.stringify({event:e.event??"onboarding_error",deviceId:l(),command:e.command,statusCode:e.statusCode,message:e.message?e.message.slice(0,500):void 0,cliVersion:e.cliVersion,os:p(),nodeVersion:process.version,proxied:T,props:e.props}),signal:i.signal})}catch{}finally{clearTimeout(f),r!==void 0&&(process.env.HTTPS_PROXY=r),s!==void 0&&(process.env.HTTP_PROXY=s)}}o(w,"emitErrorBeacon");export{u as a,l as b,U as c,w as d};
@@ -1 +1 @@
1
- import{b as D,c as j}from"./chunk-6UEFCMR2.js";import{b as B,c as R,d as N,e as z}from"./chunk-NF2BIEAF.js";import{a as G}from"./chunk-BJSVATVJ.js";import{c as J}from"./chunk-RIVEBBZC.js";import{e as f,g as T}from"./chunk-UGACB66X.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-WH3IPXXQ.js";import{d as J}from"./chunk-BZS5QRWB.js";import{b as B,c as R,d as N,e as z}from"./chunk-SBGXIPRN.js";import{e as f,g as T}from"./chunk-APDRR6FS.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};
@@ -0,0 +1 @@
1
+ import{c as g}from"./chunk-J6QMBMC2.js";import{e as h,f}from"./chunk-APDRR6FS.js";import{q as u,r as m}from"./chunk-J5HW45PZ.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(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{e as c,f as d}from"./chunk-UGACB66X.js";import{a as m}from"./chunk-ZLLER3HP.js";async function f(g,p){let r=m(e=>p?.logger?.info?.(e)??console.log(e),"log"),{projectPath:s}=g,i=`[cron_instruction_training] ${s}`;if(!s)return{skipped:"no-project-path"};let n=await d("/api/instruction-experiments/settle",{projectPath:s}),o=n.settled.map(e=>e.outcome),a=o.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 (${a} graduated), ${n.stillRunning} still gathering`);let t=await c(`/api/instruction-suggestions/trialable?projectPath=${encodeURIComponent(s)}`);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:a,nominated:0,running:t.running,outcomes:o};let u=0;for(let e of t.candidates)try{await d("/api/instruction-experiments",{instructionId:e.instructionId,projectPath:s,source:"trial"}),u+=1,r(`${i}: now measuring "${e.name}" (score ${e.score.toFixed(2)})`)}catch(l){r(`${i}: could not measure "${e.name}" \u2014 ${l instanceof Error?l.message:String(l)}`)}return{examined:n.examined,settled:n.settled.length,graduated:a,nominated:u,running:t.running+u,outcomes:o}}m(f,"cronInstructionTraining");export{f as a};
1
+ import{e as c,f as d}from"./chunk-APDRR6FS.js";import{a as m}from"./chunk-ZLLER3HP.js";async function f(g,p){let r=m(e=>p?.logger?.info?.(e)??console.log(e),"log"),{projectPath:s}=g,i=`[cron_instruction_training] ${s}`;if(!s)return{skipped:"no-project-path"};let n=await d("/api/instruction-experiments/settle",{projectPath:s}),o=n.settled.map(e=>e.outcome),a=o.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 (${a} graduated), ${n.stillRunning} still gathering`);let t=await c(`/api/instruction-suggestions/trialable?projectPath=${encodeURIComponent(s)}`);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:a,nominated:0,running:t.running,outcomes:o};let u=0;for(let e of t.candidates)try{await d("/api/instruction-experiments",{instructionId:e.instructionId,projectPath:s,source:"trial"}),u+=1,r(`${i}: now measuring "${e.name}" (score ${e.score.toFixed(2)})`)}catch(l){r(`${i}: could not measure "${e.name}" \u2014 ${l instanceof Error?l.message:String(l)}`)}return{examined:n.examined,settled:n.settled.length,graduated:a,nominated:u,running:t.running+u,outcomes:o}}m(f,"cronInstructionTraining");export{f as a};
@@ -1 +1 @@
1
- import{c}from"./chunk-PWTTCSQA.js";import{e as p,g as u}from"./chunk-UGACB66X.js";import{a as o}from"./chunk-ZLLER3HP.js";var l="openCandidate";function g(n,i){let t=(n??{})[l];if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t;return typeof e.content!="string"||!e.content||typeof e.hash!="string"||!e.hash||typeof e.priorHash!="string"||e.priorHash!==i?null:{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(g,"resolveOpenCandidate");function m(n){let{plannedPairs:i,carriedPairs:t,liveCases:e}=n;if(e<=0)return 0;let a=i-t;return a<=0?0:Math.ceil(a/e)}o(m,"owedPasses");var d=100;async function b(n){let{evalTargetId:i,candidateContentHash:t}=n,e=[];for(let a=0;;a+=d){let r=await p(`/api/eval-targets/${i}/runs?candidateContentHash=${encodeURIComponent(t)}&limit=${d}&offset=${a}`);if(!Array.isArray(r)||r.length===0||(e.push(...r),r.length<d))break}return c(e)}o(b,"fetchCarriedPairs");async function P(n){let{evalTargetId:i,meta:t,blob:e,log:a,tag:r}=n;try{let s={...t};e?s[l]=e:delete s[l],await u(`/api/eval-targets/${i}`,{metadata:s}),a(e?`${r}: banked candidate ${e.hash.slice(0,8)} \u2014 the next run resumes instead of restarting`:`${r}: cleared the banked candidate (this cycle reached a decision)`)}catch(s){a(`${r}: could not update the candidate bank (${s instanceof Error?s.message:String(s)})`)}}o(P,"bankOpenCandidate");function C(n){return{content:n.content,hash:n.hash,priorHash:n.priorHash,plannedPairs:n.plannedPairs,updatedAt:n.now.toISOString()}}o(C,"buildOpenCandidate");export{l as a,g as b,m as c,b as d,P as e,C as f};
1
+ import{c}from"./chunk-NRYLYMDM.js";import{e as p,g as u}from"./chunk-APDRR6FS.js";import{a as o}from"./chunk-ZLLER3HP.js";var l="openCandidate";function g(n,i){let t=(n??{})[l];if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t;return typeof e.content!="string"||!e.content||typeof e.hash!="string"||!e.hash||typeof e.priorHash!="string"||e.priorHash!==i?null:{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(g,"resolveOpenCandidate");function m(n){let{plannedPairs:i,carriedPairs:t,liveCases:e}=n;if(e<=0)return 0;let a=i-t;return a<=0?0:Math.ceil(a/e)}o(m,"owedPasses");var d=100;async function b(n){let{evalTargetId:i,candidateContentHash:t}=n,e=[];for(let a=0;;a+=d){let r=await p(`/api/eval-targets/${i}/runs?candidateContentHash=${encodeURIComponent(t)}&limit=${d}&offset=${a}`);if(!Array.isArray(r)||r.length===0||(e.push(...r),r.length<d))break}return c(e)}o(b,"fetchCarriedPairs");async function P(n){let{evalTargetId:i,meta:t,blob:e,log:a,tag:r}=n;try{let s={...t};e?s[l]=e:delete s[l],await u(`/api/eval-targets/${i}`,{metadata:s}),a(e?`${r}: banked candidate ${e.hash.slice(0,8)} \u2014 the next run resumes instead of restarting`:`${r}: cleared the banked candidate (this cycle reached a decision)`)}catch(s){a(`${r}: could not update the candidate bank (${s instanceof Error?s.message:String(s)})`)}}o(P,"bankOpenCandidate");function C(n){return{content:n.content,hash:n.hash,priorHash:n.priorHash,plannedPairs:n.plannedPairs,updatedAt:n.now.toISOString()}}o(C,"buildOpenCandidate");export{l as a,g as b,m as c,b as d,P as e,C as f};
@@ -0,0 +1 @@
1
+ import{a as i}from"./chunk-PJ3WHQ67.js";import{a as e}from"./chunk-ZLLER3HP.js";import{dirname as c}from"node:path";var o=new Map;function f(n){let r=o.get(n);if(r!==void 0)return r;let s=[process.env.PATH??"",c(process.execPath)].filter(Boolean).join(":"),t=i(n,{pathEnv:s});return o.set(n,t),t}e(f,"resolveToolBin");function d(){o.clear()}e(d,"resetToolBinCache");export{f as a,d as b};
@@ -1 +1 @@
1
- import{b as l}from"./chunk-RFISMWRW.js";import{a as p}from"./chunk-5RBLIVBF.js";import{h}from"./chunk-UGACB66X.js";import{a as c}from"./chunk-ZLLER3HP.js";async function g(t){if(!t.worktree?.create)return t;let{branch:e,baseRef:s}=t.worktree,n=await l({repoRoot:t.projectPath,branch:e,baseRef:s});return{...t,projectPath:n.path,gitBranch:n.branch}}c(g,"resolveWorktreeForLaunch");async function L(t,e){let{mirrorId:s,tool:n}=t,{config:r}=t,a=c(o=>e.logger.info(o),"log");if(e.job.attempts>1)throw new p(`process_launch is not safe to retry (attempt ${e.job.attempts}). Re-launch manually.`);r=await g(r),r.worktree?.create&&a(`Worktree resolved: ${r.projectPath} (branch ${r.gitBranch})`),a(`Launching ${n}...`);let{getLauncher:f}=await import("./dist-XEWF3R3N.js"),i=await f(n).launch(r);a(`Launch completed: sessionId=${i.sessionId}`);let u={...i,worktreePath:r.worktree?.create?r.projectPath:void 0,runId:r.runId};return await h(`/api/launch-jobs/${s}/state`,{result:u}).catch(o=>{a(`result persist failed: ${o instanceof Error?o.message:String(o)}`)}),u}c(L,"processLaunch");export{g as a,L as b};
1
+ import{b as l}from"./chunk-KV5A77XW.js";import{a as p}from"./chunk-5RBLIVBF.js";import{h}from"./chunk-APDRR6FS.js";import{a as c}from"./chunk-ZLLER3HP.js";async function g(t){if(!t.worktree?.create)return t;let{branch:e,baseRef:s}=t.worktree,n=await l({repoRoot:t.projectPath,branch:e,baseRef:s});return{...t,projectPath:n.path,gitBranch:n.branch}}c(g,"resolveWorktreeForLaunch");async function L(t,e){let{mirrorId:s,tool:n}=t,{config:r}=t,a=c(o=>e.logger.info(o),"log");if(e.job.attempts>1)throw new p(`process_launch is not safe to retry (attempt ${e.job.attempts}). Re-launch manually.`);r=await g(r),r.worktree?.create&&a(`Worktree resolved: ${r.projectPath} (branch ${r.gitBranch})`),a(`Launching ${n}...`);let{getLauncher:f}=await import("./dist-45KJH5M7.js"),i=await f(n).launch(r);a(`Launch completed: sessionId=${i.sessionId}`);let u={...i,worktreePath:r.worktree?.create?r.projectPath:void 0,runId:r.runId};return await h(`/api/launch-jobs/${s}/state`,{result:u}).catch(o=>{a(`result persist failed: ${o instanceof Error?o.message:String(o)}`)}),u}c(L,"processLaunch");export{g as a,L as b};
@@ -1 +1 @@
1
- import{a as i}from"./chunk-A2LHEUNW.js";import{a as f}from"./chunk-ZLLER3HP.js";import{useEffect as J,useState as u,useCallback as m,useRef as s}from"react";var y=5e3;function T(a=20){let[d,b]=u([]),[g,l]=u(null),[h,p]=u(!0),r=s(!1),e=s(null),c=s(0),t=m(async()=>{let o=++c.current;try{let n=await i({limit:a});if(r.current||o!==c.current)return;b(n),l(null)}catch(n){if(r.current||o!==c.current)return;l(n instanceof Error?n.message:String(n))}finally{if(r.current||o!==c.current)return;p(!1),e.current=setTimeout(()=>{t()},y)}},[a]),L=m(()=>{e.current&&clearTimeout(e.current),t()},[t]);return J(()=>(r.current=!1,t(),()=>{r.current=!0,e.current&&clearTimeout(e.current)}),[t]),{jobs:d,error:g,loading:h,refetch:L}}f(T,"useLaunchJobs");export{T as a};
1
+ import{a as i}from"./chunk-CYYDQFRY.js";import{a as f}from"./chunk-ZLLER3HP.js";import{useEffect as J,useState as u,useCallback as m,useRef as s}from"react";var y=5e3;function T(a=20){let[d,b]=u([]),[g,l]=u(null),[h,p]=u(!0),r=s(!1),e=s(null),c=s(0),t=m(async()=>{let o=++c.current;try{let n=await i({limit:a});if(r.current||o!==c.current)return;b(n),l(null)}catch(n){if(r.current||o!==c.current)return;l(n instanceof Error?n.message:String(n))}finally{if(r.current||o!==c.current)return;p(!1),e.current=setTimeout(()=>{t()},y)}},[a]),L=m(()=>{e.current&&clearTimeout(e.current),t()},[t]);return J(()=>(r.current=!1,t(),()=>{r.current=!0,e.current&&clearTimeout(e.current)}),[t]),{jobs:d,error:g,loading:h,refetch:L}}f(T,"useLaunchJobs");export{T as a};
@@ -1 +1 @@
1
- import{l as E}from"./chunk-WMIUFMDI.js";import{a as p,e as w}from"./chunk-PZNWH4VQ.js";import{a as o}from"./chunk-ZLLER3HP.js";import{fileURLToPath as v}from"node:url";import{existsSync as A,readFileSync as b}from"node:fs";import{dirname as L,join as x}from"node:path";function C(){let t=L(v(import.meta.url));for(let e=0;e<8;e++){let s=x(t,"package.json");if(A(s))try{let i=JSON.parse(b(s,"utf8"));if(i.name==="@rulemetric/cli"&&i.version)return i.version}catch{}let n=L(t);if(n===t)break;t=n}return"0.0.0"}o(C,"readCliVersion");var O=C(),I="https://rulemetric.com",l=class extends Error{constructor(s,n){super(n);this.statusCode=s;this.name="ApiError"}static{o(this,"ApiError")}};function S(){let t=p(),e=process.env.RULEMETRIC_API_URL??t.apiUrl;if(!e){if(process.env.RULEMETRIC_STRICT_LOCAL==="1"||t.strictLocal==="1")throw new Error("RULEMETRIC_STRICT_LOCAL is set but no RULEMETRIC_API_URL is configured \u2014 refusing the cloud default. Set RULEMETRIC_API_URL in the environment or ~/.config/rulemetric/env.");e=I}let s=new URL(e);if(s.protocol==="http:"&&s.hostname!=="localhost"&&s.hostname!=="127.0.0.1")throw new Error(`API URL must use HTTPS for non-localhost hosts: ${e}`);return e}o(S,"getBaseUrl");async function a(t,e={}){let n=`${S()}${t}`,i={"Content-Type":"application/json","User-Agent":`rulemetric-cli/${O}`,...e.headers},m=p(),d=process.env.RULEMETRIC_API_KEY||m.apiKey||w()?.accessToken||m.accessToken;d&&(i.Authorization=`Bearer ${d}`);let h=new URL(n),f=h.hostname==="localhost"||h.hostname==="127.0.0.1",P=process.env.HTTPS_PROXY,R=process.env.HTTP_PROXY;f&&(delete process.env.HTTPS_PROXY,delete process.env.HTTP_PROXY);let u=e.timeoutMs?new AbortController:void 0,g=!1,y=u?setTimeout(()=>{g=!0,u.abort()},e.timeoutMs):void 0,r;try{r=await fetch(n,{method:e.method??"GET",headers:i,body:e.body?JSON.stringify(e.body):void 0,signal:u?.signal})}catch(T){if(g){let U=new URL(n).host,_=Math.round(e.timeoutMs/1e3);throw new l(408,`Request to ${U} timed out after ${_}s. This is usually transient or a local proxy/gateway issue \u2014 retry, and if it persists check HTTPS_PROXY / the RuleMetric gateway (:8787).`)}throw T}finally{y&&clearTimeout(y),f&&(P!==void 0&&(process.env.HTTPS_PROXY=P),R!==void 0&&(process.env.HTTP_PROXY=R))}let c;if(r.headers.get("content-type")?.includes("application/json")?c=await r.json():c=await r.text(),!r.ok){let{message:T}=E(r.status,c);throw new l(r.status,T)}return c}o(a,"api");var j=o(t=>a(t),"apiGet"),F=o((t,e)=>a(t,{method:"POST",body:e}),"apiPost"),B=o((t,e)=>a(t,{method:"PUT",body:e}),"apiPut"),D=o((t,e)=>a(t,{method:"PATCH",body:e}),"apiPatch"),G=o(t=>a(t,{method:"DELETE"}),"apiDelete");export{I as a,l as b,S as c,a as d,j as e,F as f,B as g,D as h,G as i};
1
+ import{l as E}from"./chunk-J5HW45PZ.js";import{a as p,e as w}from"./chunk-PZNWH4VQ.js";import{a as o}from"./chunk-ZLLER3HP.js";import{fileURLToPath as v}from"node:url";import{existsSync as A,readFileSync as b}from"node:fs";import{dirname as L,join as x}from"node:path";function C(){let t=L(v(import.meta.url));for(let e=0;e<8;e++){let s=x(t,"package.json");if(A(s))try{let i=JSON.parse(b(s,"utf8"));if(i.name==="@rulemetric/cli"&&i.version)return i.version}catch{}let n=L(t);if(n===t)break;t=n}return"0.0.0"}o(C,"readCliVersion");var O=C(),I="https://rulemetric.com",l=class extends Error{constructor(s,n){super(n);this.statusCode=s;this.name="ApiError"}static{o(this,"ApiError")}};function S(){let t=p(),e=process.env.RULEMETRIC_API_URL??t.apiUrl;if(!e){if(process.env.RULEMETRIC_STRICT_LOCAL==="1"||t.strictLocal==="1")throw new Error("RULEMETRIC_STRICT_LOCAL is set but no RULEMETRIC_API_URL is configured \u2014 refusing the cloud default. Set RULEMETRIC_API_URL in the environment or ~/.config/rulemetric/env.");e=I}let s=new URL(e);if(s.protocol==="http:"&&s.hostname!=="localhost"&&s.hostname!=="127.0.0.1")throw new Error(`API URL must use HTTPS for non-localhost hosts: ${e}`);return e}o(S,"getBaseUrl");async function a(t,e={}){let n=`${S()}${t}`,i={"Content-Type":"application/json","User-Agent":`rulemetric-cli/${O}`,...e.headers},m=p(),d=process.env.RULEMETRIC_API_KEY||m.apiKey||w()?.accessToken||m.accessToken;d&&(i.Authorization=`Bearer ${d}`);let h=new URL(n),f=h.hostname==="localhost"||h.hostname==="127.0.0.1",P=process.env.HTTPS_PROXY,R=process.env.HTTP_PROXY;f&&(delete process.env.HTTPS_PROXY,delete process.env.HTTP_PROXY);let u=e.timeoutMs?new AbortController:void 0,g=!1,y=u?setTimeout(()=>{g=!0,u.abort()},e.timeoutMs):void 0,r;try{r=await fetch(n,{method:e.method??"GET",headers:i,body:e.body?JSON.stringify(e.body):void 0,signal:u?.signal})}catch(T){if(g){let U=new URL(n).host,_=Math.round(e.timeoutMs/1e3);throw new l(408,`Request to ${U} timed out after ${_}s. This is usually transient or a local proxy/gateway issue \u2014 retry, and if it persists check HTTPS_PROXY / the RuleMetric gateway (:8787).`)}throw T}finally{y&&clearTimeout(y),f&&(P!==void 0&&(process.env.HTTPS_PROXY=P),R!==void 0&&(process.env.HTTP_PROXY=R))}let c;if(r.headers.get("content-type")?.includes("application/json")?c=await r.json():c=await r.text(),!r.ok){let{message:T}=E(r.status,c);throw new l(r.status,T)}return c}o(a,"api");var j=o(t=>a(t),"apiGet"),F=o((t,e)=>a(t,{method:"POST",body:e}),"apiPost"),B=o((t,e)=>a(t,{method:"PUT",body:e}),"apiPut"),D=o((t,e)=>a(t,{method:"PATCH",body:e}),"apiPatch"),G=o(t=>a(t,{method:"DELETE"}),"apiDelete");export{I as a,l as b,S as c,a as d,j as e,F as f,B as g,D as h,G as i};
@@ -1,4 +1,4 @@
1
- import{d as p}from"./chunk-TZA4HAVF.js";import{a as c}from"./chunk-ZLLER3HP.js";var y=`You are an expert at improving AI coding instructions, skills, and prompts. You receive eval results showing how well the current content performs, and your job is to propose specific improvements.
1
+ import{f as p}from"./chunk-HLNHBZLI.js";import{a as c}from"./chunk-ZLLER3HP.js";var y=`You are an expert at improving AI coding instructions, skills, and prompts. You receive eval results showing how well the current content performs, and your job is to propose specific improvements.
2
2
 
3
3
  You will receive:
4
4
  1. The current content of the eval target
@@ -0,0 +1,4 @@
1
+ import{a as y}from"./chunk-6XTLP2G7.js";import{a as s}from"./chunk-ZLLER3HP.js";import{spawn as v}from"node:child_process";import{mkdtempSync as O,readFileSync as D,rmSync as I}from"node:fs";import{tmpdir as M}from"node:os";import{join as E}from"node:path";var R=s(t=>`codex:${t}`,"codexModelId");function $(t,o){return["exec","--json","--sandbox","read-only","--skip-git-repo-check","--ephemeral","--model",t,"--output-last-message",o,"-"]}s($,"buildCodexArgs");function A(t){let o;for(let m of t.split(`
2
+ `)){let u=m.trim();if(!u.startsWith("{"))continue;let n;try{n=JSON.parse(u)}catch{continue}if(typeof n!="object"||n===null)continue;let c=n.usage;if(typeof c!="object"||c===null)continue;let i=s(x=>{let a=c[x];return typeof a=="number"&&Number.isFinite(a)?a:0},"num"),d=i("input_tokens"),l=i("output_tokens");o={inputTokens:d,cachedInputTokens:i("cached_input_tokens"),outputTokens:l,reasoningOutputTokens:i("reasoning_output_tokens"),totalTokens:d+l}}return o}s(A,"parseCodexUsage");async function L(t){let{prompt:o,systemPrompt:m,model:u,timeout:n=12e4,workDir:c=process.cwd()}=t,i=m?`${m}
3
+
4
+ ${o}`:o,d=y("codex");if(!d)return{output:"",exitCode:null,durationMs:0,error:"Codex CLI not found on PATH, well-known install dirs, or the node bin dir \u2014 is it installed?"};let l=O(E(M(),"rulemetric-codex-")),x=E(l,"last-message.txt"),a=Date.now();return new Promise(S=>{let f={...process.env};delete f.HTTPS_PROXY;let _=["/opt/homebrew/bin","/usr/local/bin"],k=(f.PATH??"").split(":").filter(Boolean),C=_.filter(e=>!k.includes(e));C.length&&(f.PATH=[...k,...C].join(":"));let r=v(d,$(u,x),{cwd:c,env:f,stdio:["pipe","pipe","pipe"]}),b="",p="",w=256*1024;r.stdout.on("data",e=>{p+=e.toString(),p.length>w&&(p=p.slice(-w))}),r.stderr.on("data",e=>{b+=e.toString()});let g=s(e=>{I(l,{recursive:!0,force:!0}),S({...e,durationMs:Date.now()-a})},"finish"),h=setTimeout(()=>{r.kill("SIGTERM"),g({output:"",exitCode:null,error:`codex exec timed out after ${n}ms`})},n);r.on("error",e=>{clearTimeout(h),g({output:"",exitCode:null,error:`failed to spawn codex: ${e.message} (is the Codex CLI installed?)`})}),r.on("close",e=>{clearTimeout(h);let T="";try{T=D(x,"utf8").trim()}catch{}let P=A(p);if(e!==0||T===""){g({output:T,exitCode:e,usage:P,error:`codex exec failed (exit ${e}): ${b.trim().slice(-500)||"no last message produced"}`});return}g({output:T,exitCode:e,model:R(u),usage:P})}),r.stdin.write(i),r.stdin.end()})}s(L,"executeCodexEval");export{R as a,$ as b,A as c,L as d};
@@ -0,0 +1,3 @@
1
+ import{a}from"./chunk-ZLLER3HP.js";import{createHash as p}from"node:crypto";import{existsSync as _,readdirSync as g,readFileSync as f}from"node:fs";import{join as m,relative as x}from"node:path";var I={claude_code:"claude_md",codex:"agents_md",copilot:"copilot_instructions"},h={claude_code:{basename:"CLAUDE.md",nested:!0},codex:{basename:"AGENTS.md",nested:!0},copilot:{basename:"copilot-instructions.md",nested:!1,relPath:".github/copilot-instructions.md"}},b=new Set(["node_modules",".git","dist","build","out",".next","coverage",".turbo","vendor",".venv"]),l=50,y=8,d=a(c=>p("sha256").update(c).digest("hex"),"sha256");function S(c,s){let t=h[s];if(!t.nested){let r=m(c,t.relPath??t.basename);return _(r)?[r]:[]}let o=[],u=a((r,i)=>{if(o.length>=l||i>y)return;let n;try{n=g(r,{withFileTypes:!0})}catch{return}for(let e of n){if(o.length>=l)return;if(e.isDirectory()){if(b.has(e.name)||e.name.startsWith("."))continue;u(m(r,e.name),i+1)}else e.isFile()&&e.name===t.basename&&o.push(m(r,e.name))}},"walk");return u(c,0),o.sort()}a(S,"findInstructionFiles");function k(c,s="claude_code"){let t=[],o=[],u=I[s],r=h[s].relPath??h[s].basename;for(let i of S(c,s)){let n;try{n=f(i,"utf-8")}catch{continue}if(!n.trim())continue;let e=o.length;o.push(n),t.push({type:u,name:x(c,i)||r,content_hash:d(n),char_count:n.length,estimated_tokens:Math.ceil(n.length/4),instruction_index:e})}return t.length===0?null:{provider:s,request_hash:d(`${s}
2
+ ${t.map(i=>`${i.name}:${i.content_hash}`).join(`
3
+ `)}`),model:"unknown",system_prompt:"",system_hash:d(""),injected_instructions:o,context_items:t,metadata:{source:"hook_instruction_snapshot"}}}a(k,"buildInstructionSnapshot");export{I as a,S as b,k as c};
@@ -1 +1 @@
1
- import{a}from"./chunk-UGACB66X.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-APDRR6FS.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,4 +1,4 @@
1
- import{f as E}from"./chunk-QBNLZJIR.js";import{b,e as y,f as k,h as M}from"./chunk-UGACB66X.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{f as E}from"./chunk-U3XKXJ3A.js";import{b,e as y,f as k,h as M}from"./chunk-APDRR6FS.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,15 +1,15 @@
1
- import{a as i,b as Ce}from"./chunk-ZLLER3HP.js";var qt=["claude_code","cursor","vscode_copilot","copilot_agent","rulemetric_mcp","codex","pi","opencode","antigravity"],Et=["user_message","assistant_message","tool_call","tool_result","thinking","error"];var O=class{static{i(this,"ClaudeCodeAdapter")}tool="claude_code";parse(e){let t=e.split(`
2
- `).filter(c=>c.trim()),o=[];for(let c of t)try{o.push(JSON.parse(c))}catch{}let s=o.filter(c=>c.type==="user"||c.type==="assistant"),a=null,l=null,p={},r=o.find(c=>c.type==="user");r&&(a=r.cwd??null,l=r.gitBranch??null,r.version&&(p.claudeCodeVersion=r.version),r.sessionId&&(p.sessionId=r.sessionId));let u=o.find(c=>c.type==="assistant");u?.message?.model&&(p.model=u.message.model);let m=[],f=0;for(let c of s){let g=c.timestamp??new Date().toISOString();if(c.type==="user"){let _=c.message?.content;if(typeof _=="string")m.push({sequence:f++,eventType:"user_message",content:_,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:g,metadata:{}});else if(Array.isArray(_))for(let h of _)h.type==="tool_result"&&m.push({sequence:f++,eventType:"tool_result",content:typeof h.content=="string"?h.content:JSON.stringify(h.content),toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:g,metadata:{toolUseId:h.tool_use_id}})}else if(c.type==="assistant"){let _=Array.isArray(c.message?.content)?c.message.content:[],h=c.message?.usage,T=h?{input:h.input_tokens??0,output:h.output_tokens??0,cacheRead:h.cache_read_input_tokens??0,cacheWrite:h.cache_creation_input_tokens??0}:null,S={};c.message?.model&&(S.model=c.message.model),c.message?.stop_reason&&(S.stopReason=c.message.stop_reason),c.requestId&&(S.requestId=c.requestId),h?.service_tier&&(S.serviceTier=h.service_tier),h?.speed&&(S.speed=h.speed),h?.cache_creation&&(S.cacheCreationDetail=h.cache_creation),h?.server_tool_use&&(S.serverToolUse=h.server_tool_use);for(let w of _)w.type==="text"?m.push({sequence:f++,eventType:"assistant_message",content:w.text??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:T,timestamp:g,metadata:S}):w.type==="thinking"?m.push({sequence:f++,eventType:"thinking",content:w.thinking??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:T,timestamp:g,metadata:S}):w.type==="tool_use"&&m.push({sequence:f++,eventType:"tool_call",content:null,toolName:w.name??"unknown",toolInput:w.input??null,toolOutput:null,tokenUsage:T,timestamp:g,metadata:{...S,toolUseId:w.id}})}}let d=m.map(c=>c.timestamp).sort(),y=new Date().toISOString();return{tool:"claude_code",projectPath:a,gitBranch:l,startedAt:d[0]??y,endedAt:d[d.length-1]??null,events:m,metadata:p}}};var P=class{static{i(this,"CursorAdapter")}tool="cursor";parse(e){let t=Ce("better-sqlite3"),o=new t(e,{readonly:!0});try{let s=o.prepare("SELECT value FROM ItemTable WHERE key = 'composer.composerData'").get();return s?this.parseComposerJson(s.value):this.emptySession()}finally{o.close()}}parseComposerJson(e){let t;try{t=JSON.parse(e)}catch{return this.emptySession()}let o=Object.values(t.allComposers??{});if(o.length===0)return this.emptySession();let s=o.sort((u,m)=>{let f=u.createdAt?new Date(u.createdAt).getTime():0;return(m.createdAt?new Date(m.createdAt).getTime():0)-f})[0],a=s.conversation??[],l=[];for(let u=0;u<a.length;u++){let m=a[u],f=m.createdAt??new Date().toISOString();l.push({sequence:u,eventType:m.type===1?"user_message":"assistant_message",content:m.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:f,metadata:{}})}let p=l.map(u=>u.timestamp).sort(),r=new Date().toISOString();return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:p[0]??r,endedAt:p[p.length-1]??null,events:l,metadata:{composerId:s.composerId}}}emptySession(){return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};var N=class{static{i(this,"VSCodeCopilotAdapter")}tool="vscode_copilot";parse(e){let t;try{t=JSON.parse(e)}catch{return this.emptySession()}let o=t.requests??[],s=[],a=0;for(let r of o){let u=r.timestamp?new Date(r.timestamp).toISOString():new Date().toISOString();if(s.push({sequence:a++,eventType:"user_message",content:r.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:u,metadata:{}}),r.response){let m=r.response.timestamp?new Date(r.response.timestamp).toISOString():u;s.push({sequence:a++,eventType:"assistant_message",content:r.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}}let l=s.map(r=>r.timestamp).sort(),p=new Date().toISOString();return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:l[0]??p,endedAt:l[l.length-1]??null,events:s,metadata:{...t.requesterUsername&&{username:t.requesterUsername},...t.customTitle&&{title:t.customTitle}}}}emptySession(){return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};var D=class{static{i(this,"CopilotAgentAdapter")}tool="copilot_agent";parse(e){let t;try{t=JSON.parse(e)}catch{return this.emptySession()}let o=t.requests??[],s=[],a=0;for(let r of o){let u=r.timestamp?new Date(r.timestamp).toISOString():new Date().toISOString();if(s.push({sequence:a++,eventType:"user_message",content:r.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:u,metadata:{}}),r.toolCalls)for(let m of r.toolCalls){let f=m.timestamp?new Date(m.timestamp).toISOString():u;s.push({sequence:a++,eventType:"tool_call",content:null,toolName:m.name??"unknown",toolInput:m.input??null,toolOutput:m.output??null,tokenUsage:null,timestamp:f,metadata:{}})}if(r.response){let m=r.response.timestamp?new Date(r.response.timestamp).toISOString():u;s.push({sequence:a++,eventType:"assistant_message",content:r.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}}let l=s.map(r=>r.timestamp).sort(),p=new Date().toISOString();return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:l[0]??p,endedAt:l[l.length-1]??null,events:s,metadata:{...t.requesterUsername&&{username:t.requesterUsername},...t.customTitle&&{title:t.customTitle},...t.agentMode!=null&&{agentMode:t.agentMode}}}}emptySession(){return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};var b=class{static{i(this,"RuleMetricMcpAdapter")}tool="rulemetric_mcp";parse(e){let t;try{t=JSON.parse(e)}catch{return this.emptySession()}let s=(t.events??[]).map((l,p)=>({sequence:l.sequence??p,eventType:this.normalizeEventType(l.eventType),content:l.content??null,toolName:l.toolName??null,toolInput:l.toolInput??null,toolOutput:l.toolOutput??null,tokenUsage:l.tokenUsage??null,timestamp:l.timestamp??new Date().toISOString(),metadata:l.metadata??{}})),a=new Date().toISOString();return{tool:"rulemetric_mcp",projectPath:t.projectPath??null,gitBranch:t.gitBranch??null,startedAt:t.startedAt??s[0]?.timestamp??a,endedAt:t.endedAt??s[s.length-1]?.timestamp??null,events:s,metadata:t.metadata??{}}}normalizeEventType(e){return e&&["user_message","assistant_message","tool_call","tool_result","thinking","error"].includes(e)?e:"assistant_message"}emptySession(){return{tool:"rulemetric_mcp",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};function $e(n){try{return JSON.parse(n)}catch{return n}}i($e,"safeJsonParse");function Y(n,e){return Array.isArray(n)?n.filter(t=>t.type&&e.includes(t.type)).map(t=>t.text??"").filter(Boolean).join(`
1
+ import{a as i,b as Ce}from"./chunk-ZLLER3HP.js";var qt=["claude_code","cursor","vscode_copilot","copilot_agent","rulemetric_mcp","codex","pi","opencode","antigravity"],Et=["user_message","assistant_message","assistant_response","tool_call","tool_result","thinking","error"];var O=class{static{i(this,"ClaudeCodeAdapter")}tool="claude_code";parse(e){let t=e.split(`
2
+ `).filter(c=>c.trim()),o=[];for(let c of t)try{o.push(JSON.parse(c))}catch{}let s=o.filter(c=>c.type==="user"||c.type==="assistant"),a=null,l=null,p={},r=o.find(c=>c.type==="user");r&&(a=r.cwd??null,l=r.gitBranch??null,r.version&&(p.claudeCodeVersion=r.version),r.sessionId&&(p.sessionId=r.sessionId));let u=o.find(c=>c.type==="assistant");u?.message?.model&&(p.model=u.message.model);let m=[],f=0;for(let c of s){let g=c.timestamp??new Date().toISOString();if(c.type==="user"){let y=c.message?.content;if(typeof y=="string")m.push({sequence:f++,eventType:"user_message",content:y,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:g,metadata:{}});else if(Array.isArray(y))for(let h of y)h.type==="tool_result"&&m.push({sequence:f++,eventType:"tool_result",content:typeof h.content=="string"?h.content:JSON.stringify(h.content),toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:g,metadata:{toolUseId:h.tool_use_id}})}else if(c.type==="assistant"){let y=Array.isArray(c.message?.content)?c.message.content:[],h=c.message?.usage,T=h?{input:h.input_tokens??0,output:h.output_tokens??0,cacheRead:h.cache_read_input_tokens??0,cacheWrite:h.cache_creation_input_tokens??0}:null,S={};c.message?.model&&(S.model=c.message.model),c.message?.stop_reason&&(S.stopReason=c.message.stop_reason),c.requestId&&(S.requestId=c.requestId),h?.service_tier&&(S.serviceTier=h.service_tier),h?.speed&&(S.speed=h.speed),h?.cache_creation&&(S.cacheCreationDetail=h.cache_creation),h?.server_tool_use&&(S.serverToolUse=h.server_tool_use);for(let w of y)w.type==="text"?m.push({sequence:f++,eventType:"assistant_message",content:w.text??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:T,timestamp:g,metadata:S}):w.type==="thinking"?m.push({sequence:f++,eventType:"thinking",content:w.thinking??"",toolName:null,toolInput:null,toolOutput:null,tokenUsage:T,timestamp:g,metadata:S}):w.type==="tool_use"&&m.push({sequence:f++,eventType:"tool_call",content:null,toolName:w.name??"unknown",toolInput:w.input??null,toolOutput:null,tokenUsage:T,timestamp:g,metadata:{...S,toolUseId:w.id}})}}let d=m.map(c=>c.timestamp).sort(),_=new Date().toISOString();return{tool:"claude_code",projectPath:a,gitBranch:l,startedAt:d[0]??_,endedAt:d[d.length-1]??null,events:m,metadata:p}}};var P=class{static{i(this,"CursorAdapter")}tool="cursor";parse(e){let t=Ce("better-sqlite3"),o=new t(e,{readonly:!0});try{let s=o.prepare("SELECT value FROM ItemTable WHERE key = 'composer.composerData'").get();return s?this.parseComposerJson(s.value):this.emptySession()}finally{o.close()}}parseComposerJson(e){let t;try{t=JSON.parse(e)}catch{return this.emptySession()}let o=Object.values(t.allComposers??{});if(o.length===0)return this.emptySession();let s=o.sort((u,m)=>{let f=u.createdAt?new Date(u.createdAt).getTime():0;return(m.createdAt?new Date(m.createdAt).getTime():0)-f})[0],a=s.conversation??[],l=[];for(let u=0;u<a.length;u++){let m=a[u],f=m.createdAt??new Date().toISOString();l.push({sequence:u,eventType:m.type===1?"user_message":"assistant_message",content:m.text,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:f,metadata:{}})}let p=l.map(u=>u.timestamp).sort(),r=new Date().toISOString();return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:p[0]??r,endedAt:p[p.length-1]??null,events:l,metadata:{composerId:s.composerId}}}emptySession(){return{tool:"cursor",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};var N=class{static{i(this,"VSCodeCopilotAdapter")}tool="vscode_copilot";parse(e){let t;try{t=JSON.parse(e)}catch{return this.emptySession()}let o=t.requests??[],s=[],a=0;for(let r of o){let u=r.timestamp?new Date(r.timestamp).toISOString():new Date().toISOString();if(s.push({sequence:a++,eventType:"user_message",content:r.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:u,metadata:{}}),r.response){let m=r.response.timestamp?new Date(r.response.timestamp).toISOString():u;s.push({sequence:a++,eventType:"assistant_message",content:r.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}}let l=s.map(r=>r.timestamp).sort(),p=new Date().toISOString();return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:l[0]??p,endedAt:l[l.length-1]??null,events:s,metadata:{...t.requesterUsername&&{username:t.requesterUsername},...t.customTitle&&{title:t.customTitle}}}}emptySession(){return{tool:"vscode_copilot",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};var D=class{static{i(this,"CopilotAgentAdapter")}tool="copilot_agent";parse(e){let t;try{t=JSON.parse(e)}catch{return this.emptySession()}let o=t.requests??[],s=[],a=0;for(let r of o){let u=r.timestamp?new Date(r.timestamp).toISOString():new Date().toISOString();if(s.push({sequence:a++,eventType:"user_message",content:r.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:u,metadata:{}}),r.toolCalls)for(let m of r.toolCalls){let f=m.timestamp?new Date(m.timestamp).toISOString():u;s.push({sequence:a++,eventType:"tool_call",content:null,toolName:m.name??"unknown",toolInput:m.input??null,toolOutput:m.output??null,tokenUsage:null,timestamp:f,metadata:{}})}if(r.response){let m=r.response.timestamp?new Date(r.response.timestamp).toISOString():u;s.push({sequence:a++,eventType:"assistant_message",content:r.response.message,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:m,metadata:{}})}}let l=s.map(r=>r.timestamp).sort(),p=new Date().toISOString();return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:l[0]??p,endedAt:l[l.length-1]??null,events:s,metadata:{...t.requesterUsername&&{username:t.requesterUsername},...t.customTitle&&{title:t.customTitle},...t.agentMode!=null&&{agentMode:t.agentMode}}}}emptySession(){return{tool:"copilot_agent",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};var b=class{static{i(this,"RuleMetricMcpAdapter")}tool="rulemetric_mcp";parse(e){let t;try{t=JSON.parse(e)}catch{return this.emptySession()}let s=(t.events??[]).map((l,p)=>({sequence:l.sequence??p,eventType:this.normalizeEventType(l.eventType),content:l.content??null,toolName:l.toolName??null,toolInput:l.toolInput??null,toolOutput:l.toolOutput??null,tokenUsage:l.tokenUsage??null,timestamp:l.timestamp??new Date().toISOString(),metadata:l.metadata??{}})),a=new Date().toISOString();return{tool:"rulemetric_mcp",projectPath:t.projectPath??null,gitBranch:t.gitBranch??null,startedAt:t.startedAt??s[0]?.timestamp??a,endedAt:t.endedAt??s[s.length-1]?.timestamp??null,events:s,metadata:t.metadata??{}}}normalizeEventType(e){return e&&["user_message","assistant_message","tool_call","tool_result","thinking","error"].includes(e)?e:"assistant_message"}emptySession(){return{tool:"rulemetric_mcp",projectPath:null,gitBranch:null,startedAt:new Date().toISOString(),endedAt:null,events:[],metadata:{}}}};function $e(n){try{return JSON.parse(n)}catch{return n}}i($e,"safeJsonParse");function Y(n,e){return Array.isArray(n)?n.filter(t=>t.type&&e.includes(t.type)).map(t=>t.text??"").filter(Boolean).join(`
3
3
 
4
4
  `):""}i(Y,"textFromBlocks");function je(n){if(!n)return null;let e=n.cached_input_tokens??0,t=Math.max(0,(n.input_tokens??0)-e),o=(n.output_tokens??0)+(n.reasoning_output_tokens??0);return t===0&&o===0&&e===0?null:{input:t,output:o,cacheRead:e,cacheWrite:0}}i(je,"tokenUsageFromCodex");function Ue(n){if(!n)return new Date().toISOString();let e=new Date(n);return Number.isFinite(e.getTime())?e.toISOString():new Date().toISOString()}i(Ue,"normalizeTimestamp");function Z(){return{sequence:0,model:null,prevCumulativeTotal:0,callNames:{}}}i(Z,"freshCodexState");var C=class{static{i(this,"CodexAdapter")}tool="codex";parse(e){let t=Z(),{events:o,projectPath:s,gitBranch:a,metadata:l}=this.parseLines(e,t),p=o.map(u=>u.timestamp).sort(),r=new Date().toISOString();return{tool:"codex",projectPath:s,gitBranch:a,startedAt:p[0]??r,endedAt:p[p.length-1]??null,events:o,metadata:l}}parseAppend(e,t){let o={...t,callNames:{...t.callNames}},{events:s}=this.parseLines(e,o);return{events:s,state:o}}parseLines(e,t){let o=e.split(`
5
- `).filter(m=>m.trim()),s=[],a={},l=t.callNames,p=null,r=null,u=null;for(let m of o){let f;try{f=JSON.parse(m)}catch{continue}let d=f.payload;if(!d)continue;let y=Ue(f.timestamp);if(f.type==="session_meta"){u=d.session_id??d.id??u,p=d.cwd??p,d.git_branch&&(r=d.git_branch),d.model&&(t.model=d.model),a.sessionId=u,a.codexSessionId=u,a.originator=d.originator,a.source=d.source,a.modelProvider=d.model_provider,a.codexCliVersion=d.cli_version;continue}if(f.type==="turn_context"){p=d.cwd??p,d.model&&(t.model=d.model,a.model=d.model);continue}if(f.type==="response_item"&&d.type==="message"){if(d.role==="user"){let c=Y(d.content,["input_text"]);if(!c)continue;s.push({sequence:t.sequence++,eventType:"user_message",content:c,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:y,metadata:{}})}else if(d.role==="assistant"){let c=Y(d.content,["output_text"]);if(!c)continue;s.push({sequence:t.sequence++,eventType:"assistant_message",content:c,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:t.model,timestamp:y,metadata:t.model?{model:t.model}:{}})}continue}if(f.type==="response_item"&&d.type==="function_call"){let c=d.name??"unknown";d.call_id&&(l[d.call_id]=c);let g=typeof d.arguments=="string"?$e(d.arguments):{};s.push({sequence:t.sequence++,eventType:"tool_call",content:null,toolName:c,toolInput:g&&typeof g=="object"&&!Array.isArray(g)?g:{arguments:g},toolOutput:null,tokenUsage:null,model:t.model,timestamp:y,metadata:{callId:d.call_id}});continue}if(f.type==="response_item"&&d.type==="function_call_output"){let c=d.call_id?l[d.call_id]??null:null;s.push({sequence:t.sequence++,eventType:"tool_result",content:d.output??null,toolName:c,toolInput:null,toolOutput:d.output==null?null:{output:d.output},tokenUsage:null,model:t.model,timestamp:y,metadata:{callId:d.call_id}});continue}if(f.type==="event_msg"&&d.type==="token_count"){let c=d.info,g=c?.total_token_usage?.total_tokens??0;if(g>0&&g===t.prevCumulativeTotal)continue;g>0&&(t.prevCumulativeTotal=g);let _=je(c?.last_token_usage??c?.total_token_usage);if(!_)continue;let h=c?.model??c?.model_name??t.model;s.push({sequence:t.sequence++,eventType:"assistant_message",content:null,toolName:null,toolInput:null,toolOutput:null,tokenUsage:_,model:h??null,timestamp:y,metadata:{codexEventType:"token_count",...h?{model:h}:{},reasoningOutputTokens:c?.last_token_usage?.reasoning_output_tokens??0}})}}return{events:s,projectPath:p,gitBranch:r,sessionId:u,metadata:a}}};var qe={claude_code:i(()=>new O,"claude_code"),cursor:i(()=>new P,"cursor"),vscode_copilot:i(()=>new N,"vscode_copilot"),copilot_agent:i(()=>new D,"copilot_agent"),rulemetric_mcp:i(()=>new b,"rulemetric_mcp"),codex:i(()=>new C,"codex")};function Ee(n){let e=qe[n];if(!e)throw new Error(`Unknown session tool: ${n}`);return e()}i(Ee,"getAdapter");function Re(n){let e=n.trim();if(e.startsWith("{")){let t=e.split(`
5
+ `).filter(m=>m.trim()),s=[],a={},l=t.callNames,p=null,r=null,u=null;for(let m of o){let f;try{f=JSON.parse(m)}catch{continue}let d=f.payload;if(!d)continue;let _=Ue(f.timestamp);if(f.type==="session_meta"){u=d.session_id??d.id??u,p=d.cwd??p,d.git_branch&&(r=d.git_branch),d.model&&(t.model=d.model),a.sessionId=u,a.codexSessionId=u,a.originator=d.originator,a.source=d.source,a.modelProvider=d.model_provider,a.codexCliVersion=d.cli_version;continue}if(f.type==="turn_context"){p=d.cwd??p,d.model&&(t.model=d.model,a.model=d.model);continue}if(f.type==="response_item"&&d.type==="message"){if(d.role==="user"){let c=Y(d.content,["input_text"]);if(!c)continue;s.push({sequence:t.sequence++,eventType:"user_message",content:c,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,timestamp:_,metadata:{}})}else if(d.role==="assistant"){let c=Y(d.content,["output_text"]);if(!c)continue;s.push({sequence:t.sequence++,eventType:"assistant_message",content:c,toolName:null,toolInput:null,toolOutput:null,tokenUsage:null,model:t.model,timestamp:_,metadata:t.model?{model:t.model}:{}})}continue}if(f.type==="response_item"&&d.type==="function_call"){let c=d.name??"unknown";d.call_id&&(l[d.call_id]=c);let g=typeof d.arguments=="string"?$e(d.arguments):{};s.push({sequence:t.sequence++,eventType:"tool_call",content:null,toolName:c,toolInput:g&&typeof g=="object"&&!Array.isArray(g)?g:{arguments:g},toolOutput:null,tokenUsage:null,model:t.model,timestamp:_,metadata:{callId:d.call_id}});continue}if(f.type==="response_item"&&d.type==="function_call_output"){let c=d.call_id?l[d.call_id]??null:null;s.push({sequence:t.sequence++,eventType:"tool_result",content:d.output??null,toolName:c,toolInput:null,toolOutput:d.output==null?null:{output:d.output},tokenUsage:null,model:t.model,timestamp:_,metadata:{callId:d.call_id}});continue}if(f.type==="event_msg"&&d.type==="token_count"){let c=d.info,g=c?.total_token_usage?.total_tokens??0;if(g>0&&g===t.prevCumulativeTotal)continue;g>0&&(t.prevCumulativeTotal=g);let y=je(c?.last_token_usage??c?.total_token_usage);if(!y)continue;let h=c?.model??c?.model_name??t.model;s.push({sequence:t.sequence++,eventType:"assistant_response",content:null,toolName:null,toolInput:null,toolOutput:null,tokenUsage:y,model:h??null,timestamp:_,metadata:{codexEventType:"token_count",...h?{model:h}:{},reasoningOutputTokens:c?.last_token_usage?.reasoning_output_tokens??0,usage:{input_tokens:y.input,output_tokens:y.output,cache_read_input_tokens:y.cacheRead??0,cache_creation_input_tokens:y.cacheWrite??0}}})}}return{events:s,projectPath:p,gitBranch:r,sessionId:u,metadata:a}}};var qe={claude_code:i(()=>new O,"claude_code"),cursor:i(()=>new P,"cursor"),vscode_copilot:i(()=>new N,"vscode_copilot"),copilot_agent:i(()=>new D,"copilot_agent"),rulemetric_mcp:i(()=>new b,"rulemetric_mcp"),codex:i(()=>new C,"codex")};function Ee(n){let e=qe[n];if(!e)throw new Error(`Unknown session tool: ${n}`);return e()}i(Ee,"getAdapter");function Re(n){let e=n.trim();if(e.startsWith("{")){let t=e.split(`
6
6
  `)[0],o=null;try{o=JSON.parse(t)}catch{try{o=JSON.parse(e)}catch{}}if(o){if(o.type==="user"||o.type==="assistant")return"claude_code";if(Array.isArray(o.events)&&!o.requests&&!o.allComposers)return"rulemetric_mcp";if(Array.isArray(o.requests))return o.requests.some(a=>Array.isArray(a.toolCalls))||o.agentMode?"copilot_agent":"vscode_copilot";if(o.allComposers)return"cursor"}if(!o)try{let s=e.split(`
7
7
  `).filter(a=>a.trim());if(s.length>1){let a=JSON.parse(s[0]);if(a.type==="user"||a.type==="assistant")return"claude_code"}}catch{}}return null}i(Re,"detectTool");import{readdir as G,stat as L}from"fs/promises";import{basename as Me,join as I}from"path";import{homedir as $}from"os";var Je={"claude-opus-4-7":"Opus 4.7","claude-opus-4-6":"Opus 4.6","claude-opus-4-5":"Opus 4.5","claude-opus-4-1":"Opus 4.1","claude-opus-4":"Opus 4","claude-sonnet-4-6":"Sonnet 4.6","claude-sonnet-4-5":"Sonnet 4.5","claude-sonnet-4":"Sonnet 4","claude-3-7-sonnet":"Sonnet 3.7","claude-3-5-sonnet":"Sonnet 3.5","claude-haiku-4-5":"Haiku 4.5","claude-3-5-haiku":"Haiku 3.5"};function Be(){return process.env.CLAUDE_CONFIG_DIR||I($(),".claude")}i(Be,"getClaudeDir");function Ge(){return I(Be(),"projects")}i(Ge,"getProjectsDir");function Le(){return process.platform==="darwin"?I($(),"Library","Application Support","Claude","local-agent-mode-sessions"):process.platform==="win32"?I($(),"AppData","Roaming","Claude","local-agent-mode-sessions"):I($(),".config","Claude","local-agent-mode-sessions")}i(Le,"getDesktopSessionsDir");async function Fe(n){let e=[];async function t(o,s){if(s>8)return;let a=await G(o).catch(()=>[]);for(let l of a){if(l==="node_modules"||l===".git")continue;let p=I(o,l);if((await L(p).catch(()=>null))?.isDirectory())if(l==="projects"){let u=await G(p).catch(()=>[]);for(let m of u){let f=I(p,m);(await L(f).catch(()=>null))?.isDirectory()&&e.push(f)}}else await t(p,s+1)}}return i(t,"walk"),await t(n,0),e}i(Fe,"findDesktopProjectDirs");var Q={name:"claude",displayName:"Claude Code",modelDisplayName(n){let e=n.replace(/@.*$/,"").replace(/-\d{8}$/,"");for(let[t,o]of Object.entries(Je))if(e.startsWith(t))return o;return e},toolDisplayName(n){return n},async discoverSessions(){let n=[],e=Ge();try{let o=await G(e);for(let s of o){let a=I(e,s);(await L(a).catch(()=>null))?.isDirectory()&&n.push({path:a,project:s,provider:"claude"})}}catch{}let t=await Fe(Le());for(let o of t)n.push({path:o,project:Me(o),provider:"claude"});return n},createSessionParser(){return{async*parse(){}}}};import{readdir as j,readFile as ee,stat as We}from"fs/promises";import{basename as He,join as A}from"path";import{homedir as ze}from"os";var Ke={"gpt-5.3-codex":"GPT-5.3 Codex","gpt-5.4-mini":"GPT-5.4 Mini","gpt-5.4":"GPT-5.4","gpt-5":"GPT-5","gpt-4o-mini":"GPT-4o Mini","gpt-4o":"GPT-4o"},te={exec_command:"Bash",read_file:"Read",write_file:"Edit",apply_diff:"Edit",apply_patch:"Edit",spawn_agent:"Agent",close_agent:"Agent",wait_agent:"Agent",read_dir:"Glob"};function Ve(){return process.env.CODEX_HOME??A(ze(),".codex")}i(Ve,"getCodexDir");function Xe(n){return n.replace(/^\//,"").replace(/\//g,"-")}i(Xe,"sanitizeProject");async function Ye(n){try{let t=(await ee(n,"utf-8")).split(`
8
- `)[0];return t?.trim()?JSON.parse(t):null}catch{return null}}i(Ye,"readFirstLine");async function Ze(n){let e=await Ye(n);if(!e)return{valid:!1};let t=e.type==="session_meta"&&typeof e.payload?.originator=="string"&&e.payload.originator.toLowerCase().startsWith("codex");return{valid:t,meta:t?e:void 0}}i(Ze,"isValidCodexSession");async function Qe(n){let e=A(n,"sessions"),t=[],o;try{o=await j(e)}catch{return t}for(let s of o){if(!/^\d{4}$/.test(s))continue;let a=A(e,s),l=await j(a).catch(()=>[]);for(let p of l){if(!/^\d{2}$/.test(p))continue;let r=A(a,p),u=await j(r).catch(()=>[]);for(let m of u){if(!/^\d{2}$/.test(m))continue;let f=A(r,m),d=await j(f).catch(()=>[]);for(let y of d){if(!y.startsWith("rollout-")||!y.endsWith(".jsonl"))continue;let c=A(f,y);if(!(await We(c).catch(()=>null))?.isFile())continue;let{valid:_,meta:h}=await Ze(c);if(!_||!h)continue;let T=h.payload?.cwd??"unknown";t.push({path:c,project:Xe(T),provider:"codex"})}}}}return t}i(Qe,"discoverSessionsInDir");function et(n,e){return n?.info?.model??n?.info?.model_name??e??"gpt-5"}i(et,"resolveModel");function tt(n,e){return{async*parse(){let t;try{t=await ee(n.path,"utf-8")}catch{return}let o=t.split(`
9
- `).filter(y=>y.trim()),s,a="",l=0,p=0,r=0,u=0,m=0,f=[],d="";for(let y of o){let c;try{c=JSON.parse(y)}catch{continue}if(c.type==="session_meta"){a=c.payload?.session_id??He(n.path,".jsonl"),s=c.payload?.model;continue}if(c.type==="response_item"&&c.payload?.type==="function_call"){let g=c.payload.name??"";f.push(te[g]??g);continue}if(c.type==="response_item"&&c.payload?.type==="message"&&c.payload?.role==="user"){let g=(c.payload.content??[]).filter(_=>_.type==="input_text").map(_=>_.text??"").filter(Boolean);g.length>0&&(d=g.join(" "));continue}if(c.type==="event_msg"&&c.payload?.type==="token_count"){let g=c.payload.info;if(!g)continue;let _=g.total_token_usage?.total_tokens??0;if(_>0&&_===l)continue;l=_;let h=g.last_token_usage,T=0,S=0,w=0,v=0;if(h)T=h.input_tokens??0,S=h.cached_input_tokens??0,w=h.output_tokens??0,v=h.reasoning_output_tokens??0;else if(_>0){let x=g.total_token_usage;if(!x)continue;T=(x.input_tokens??0)-p,S=(x.cached_input_tokens??0)-r,w=(x.output_tokens??0)-u,v=(x.reasoning_output_tokens??0)-m}if(!h){let x=g.total_token_usage;x&&(p=x.input_tokens??0,r=x.cached_input_tokens??0,u=x.output_tokens??0,m=x.reasoning_output_tokens??0)}if(T+S+w+v===0)continue;let De=Math.max(0,T-S),be=et(c.payload,s),X=c.timestamp??"",B=`codex:${n.path}:${X}:${_}`;if(e.has(B))continue;e.add(B),yield{provider:"codex",model:be,inputTokens:De,outputTokens:w,cacheCreationInputTokens:0,cacheReadInputTokens:S,cachedInputTokens:S,reasoningTokens:v,costUSD:0,tools:f,bashCommands:[],timestamp:X,speed:"standard",deduplicationKey:B,userMessage:d,sessionId:a},f=[],d=""}}}}}i(tt,"createParser");var ne={name:"codex",displayName:"Codex",modelDisplayName(n){for(let[e,t]of Object.entries(Ke))if(n.startsWith(e))return t;return n},toolDisplayName(n){return te[n]??n},async discoverSessions(){return Qe(Ve())},createSessionParser(n,e){return tt(n,e)}};import{readdir as nt,readFile as oe,stat as ot}from"fs/promises";import{basename as se,dirname as st,join as F}from"path";import{homedir as rt}from"os";var at={"gpt-4.1-nano":"GPT-4.1 Nano","gpt-4.1-mini":"GPT-4.1 Mini","gpt-4.1":"GPT-4.1","gpt-4o-mini":"GPT-4o Mini","gpt-4o":"GPT-4o","gpt-5-mini":"GPT-5 Mini","gpt-5":"GPT-5","claude-sonnet-4-5":"Sonnet 4.5","claude-sonnet-4":"Sonnet 4","claude-3-7-sonnet":"Sonnet 3.7","claude-3-5-sonnet":"Sonnet 3.5","o4-mini":"o4-mini",o3:"o3"},re={bash:"Bash",read_file:"Read",write_file:"Edit",edit_file:"Edit",create_file:"Write",delete_file:"Delete",search_files:"Grep",find_files:"Glob",list_directory:"LS",web_search:"WebSearch",fetch_webpage:"WebFetch",github_repo:"GitHub"},it=Object.entries(at).sort((n,e)=>e[0].length-n[0].length);function lt(){return F(rt(),".copilot","session-state")}i(lt,"getCopilotSessionStateDir");function ct(n){let e=n.match(/^cwd:\s*(.+)$/m);return e?.[1]&&e[1].replace(/\s*#.*$/,"").replace(/^['"]|['"]$/g,"").trim()||null}i(ct,"parseCwd");function ut(n,e){return{async*parse(){let t;try{t=await oe(n.path,"utf-8")}catch{return}let o=se(st(n.path)),s=t.split(`
10
- `).filter(p=>p.trim()),a="",l="";for(let p of s){let r;try{r=JSON.parse(p)}catch{continue}if(r.type==="session.model_change"){a=r.data.newModel??a;continue}if(r.type==="user.message"){l=r.data.content??"";continue}if(r.type==="assistant.message"){let{messageId:u,outputTokens:m,toolRequests:f=[]}=r.data;if(m===0||!a)continue;let d=`copilot:${o}:${u}`;if(e.has(d))continue;e.add(d);let y=f.map(c=>c.name??"").filter(Boolean).map(c=>re[c]??c);yield{provider:"copilot",model:a,inputTokens:0,outputTokens:m,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:y,bashCommands:[],timestamp:r.timestamp??"",speed:"standard",deduplicationKey:d,userMessage:l,sessionId:o},l=""}}}}}i(ut,"createParser");async function pt(n){let e=[],t;try{t=await nt(n)}catch{return e}for(let o of t){let s=F(n,o,"events.jsonl");if(!(await ot(s).catch(()=>null))?.isFile())continue;let l=o;try{let p=await oe(F(n,o,"workspace.yaml"),"utf-8"),r=ct(p);r&&(l=se(r))}catch{}e.push({path:s,project:l,provider:"copilot"})}return e}i(pt,"discoverSessionsInDir");var ae={name:"copilot",displayName:"GitHub Copilot",modelDisplayName(n){for(let[e,t]of it)if(n===e||n.startsWith(e+"-"))return t;return n},toolDisplayName(n){return re[n]??n},async discoverSessions(){return pt(lt())},createSessionParser(n,e){return ut(n,e)}};import{readdir as ie,readFile as ce,stat as le}from"fs/promises";import{basename as ue,join as W}from"path";import{homedir as dt}from"os";var mt={"gpt-5.4":"GPT-5.4","gpt-5.4-mini":"GPT-5.4 Mini","gpt-5":"GPT-5","gpt-4o":"GPT-4o","gpt-4o-mini":"GPT-4o Mini"},pe={bash:"Bash",read:"Read",edit:"Edit",write:"Write",glob:"Glob",grep:"Grep",task:"Agent",dispatch_agent:"Agent",fetch:"WebFetch",search:"WebSearch",todo:"TodoWrite",patch:"Patch"},ft=Object.entries(mt).sort((n,e)=>e[0].length-n[0].length);function ht(){return W(dt(),".pi","agent","sessions")}i(ht,"getPiSessionsDir");async function gt(n){try{let t=(await ce(n,"utf-8")).split(`
8
+ `)[0];return t?.trim()?JSON.parse(t):null}catch{return null}}i(Ye,"readFirstLine");async function Ze(n){let e=await Ye(n);if(!e)return{valid:!1};let t=e.type==="session_meta"&&typeof e.payload?.originator=="string"&&e.payload.originator.toLowerCase().startsWith("codex");return{valid:t,meta:t?e:void 0}}i(Ze,"isValidCodexSession");async function Qe(n){let e=A(n,"sessions"),t=[],o;try{o=await j(e)}catch{return t}for(let s of o){if(!/^\d{4}$/.test(s))continue;let a=A(e,s),l=await j(a).catch(()=>[]);for(let p of l){if(!/^\d{2}$/.test(p))continue;let r=A(a,p),u=await j(r).catch(()=>[]);for(let m of u){if(!/^\d{2}$/.test(m))continue;let f=A(r,m),d=await j(f).catch(()=>[]);for(let _ of d){if(!_.startsWith("rollout-")||!_.endsWith(".jsonl"))continue;let c=A(f,_);if(!(await We(c).catch(()=>null))?.isFile())continue;let{valid:y,meta:h}=await Ze(c);if(!y||!h)continue;let T=h.payload?.cwd??"unknown";t.push({path:c,project:Xe(T),provider:"codex"})}}}}return t}i(Qe,"discoverSessionsInDir");function et(n,e){return n?.info?.model??n?.info?.model_name??e??"gpt-5"}i(et,"resolveModel");function tt(n,e){return{async*parse(){let t;try{t=await ee(n.path,"utf-8")}catch{return}let o=t.split(`
9
+ `).filter(_=>_.trim()),s,a="",l=0,p=0,r=0,u=0,m=0,f=[],d="";for(let _ of o){let c;try{c=JSON.parse(_)}catch{continue}if(c.type==="session_meta"){a=c.payload?.session_id??He(n.path,".jsonl"),s=c.payload?.model;continue}if(c.type==="response_item"&&c.payload?.type==="function_call"){let g=c.payload.name??"";f.push(te[g]??g);continue}if(c.type==="response_item"&&c.payload?.type==="message"&&c.payload?.role==="user"){let g=(c.payload.content??[]).filter(y=>y.type==="input_text").map(y=>y.text??"").filter(Boolean);g.length>0&&(d=g.join(" "));continue}if(c.type==="event_msg"&&c.payload?.type==="token_count"){let g=c.payload.info;if(!g)continue;let y=g.total_token_usage?.total_tokens??0;if(y>0&&y===l)continue;l=y;let h=g.last_token_usage,T=0,S=0,w=0,v=0;if(h)T=h.input_tokens??0,S=h.cached_input_tokens??0,w=h.output_tokens??0,v=h.reasoning_output_tokens??0;else if(y>0){let x=g.total_token_usage;if(!x)continue;T=(x.input_tokens??0)-p,S=(x.cached_input_tokens??0)-r,w=(x.output_tokens??0)-u,v=(x.reasoning_output_tokens??0)-m}if(!h){let x=g.total_token_usage;x&&(p=x.input_tokens??0,r=x.cached_input_tokens??0,u=x.output_tokens??0,m=x.reasoning_output_tokens??0)}if(T+S+w+v===0)continue;let De=Math.max(0,T-S),be=et(c.payload,s),X=c.timestamp??"",B=`codex:${n.path}:${X}:${y}`;if(e.has(B))continue;e.add(B),yield{provider:"codex",model:be,inputTokens:De,outputTokens:w,cacheCreationInputTokens:0,cacheReadInputTokens:S,cachedInputTokens:S,reasoningTokens:v,costUSD:0,tools:f,bashCommands:[],timestamp:X,speed:"standard",deduplicationKey:B,userMessage:d,sessionId:a},f=[],d=""}}}}}i(tt,"createParser");var ne={name:"codex",displayName:"Codex",modelDisplayName(n){for(let[e,t]of Object.entries(Ke))if(n.startsWith(e))return t;return n},toolDisplayName(n){return te[n]??n},async discoverSessions(){return Qe(Ve())},createSessionParser(n,e){return tt(n,e)}};import{readdir as nt,readFile as oe,stat as ot}from"fs/promises";import{basename as se,dirname as st,join as F}from"path";import{homedir as rt}from"os";var at={"gpt-4.1-nano":"GPT-4.1 Nano","gpt-4.1-mini":"GPT-4.1 Mini","gpt-4.1":"GPT-4.1","gpt-4o-mini":"GPT-4o Mini","gpt-4o":"GPT-4o","gpt-5-mini":"GPT-5 Mini","gpt-5":"GPT-5","claude-sonnet-4-5":"Sonnet 4.5","claude-sonnet-4":"Sonnet 4","claude-3-7-sonnet":"Sonnet 3.7","claude-3-5-sonnet":"Sonnet 3.5","o4-mini":"o4-mini",o3:"o3"},re={bash:"Bash",read_file:"Read",write_file:"Edit",edit_file:"Edit",create_file:"Write",delete_file:"Delete",search_files:"Grep",find_files:"Glob",list_directory:"LS",web_search:"WebSearch",fetch_webpage:"WebFetch",github_repo:"GitHub"},it=Object.entries(at).sort((n,e)=>e[0].length-n[0].length);function lt(){return F(rt(),".copilot","session-state")}i(lt,"getCopilotSessionStateDir");function ct(n){let e=n.match(/^cwd:\s*(.+)$/m);return e?.[1]&&e[1].replace(/\s*#.*$/,"").replace(/^['"]|['"]$/g,"").trim()||null}i(ct,"parseCwd");function ut(n,e){return{async*parse(){let t;try{t=await oe(n.path,"utf-8")}catch{return}let o=se(st(n.path)),s=t.split(`
10
+ `).filter(p=>p.trim()),a="",l="";for(let p of s){let r;try{r=JSON.parse(p)}catch{continue}if(r.type==="session.model_change"){a=r.data.newModel??a;continue}if(r.type==="user.message"){l=r.data.content??"";continue}if(r.type==="assistant.message"){let{messageId:u,outputTokens:m,toolRequests:f=[]}=r.data;if(m===0||!a)continue;let d=`copilot:${o}:${u}`;if(e.has(d))continue;e.add(d);let _=f.map(c=>c.name??"").filter(Boolean).map(c=>re[c]??c);yield{provider:"copilot",model:a,inputTokens:0,outputTokens:m,cacheCreationInputTokens:0,cacheReadInputTokens:0,cachedInputTokens:0,reasoningTokens:0,costUSD:0,tools:_,bashCommands:[],timestamp:r.timestamp??"",speed:"standard",deduplicationKey:d,userMessage:l,sessionId:o},l=""}}}}}i(ut,"createParser");async function pt(n){let e=[],t;try{t=await nt(n)}catch{return e}for(let o of t){let s=F(n,o,"events.jsonl");if(!(await ot(s).catch(()=>null))?.isFile())continue;let l=o;try{let p=await oe(F(n,o,"workspace.yaml"),"utf-8"),r=ct(p);r&&(l=se(r))}catch{}e.push({path:s,project:l,provider:"copilot"})}return e}i(pt,"discoverSessionsInDir");var ae={name:"copilot",displayName:"GitHub Copilot",modelDisplayName(n){for(let[e,t]of it)if(n===e||n.startsWith(e+"-"))return t;return n},toolDisplayName(n){return re[n]??n},async discoverSessions(){return pt(lt())},createSessionParser(n,e){return ut(n,e)}};import{readdir as ie,readFile as ce,stat as le}from"fs/promises";import{basename as ue,join as W}from"path";import{homedir as dt}from"os";var mt={"gpt-5.4":"GPT-5.4","gpt-5.4-mini":"GPT-5.4 Mini","gpt-5":"GPT-5","gpt-4o":"GPT-4o","gpt-4o-mini":"GPT-4o Mini"},pe={bash:"Bash",read:"Read",edit:"Edit",write:"Write",glob:"Glob",grep:"Grep",task:"Agent",dispatch_agent:"Agent",fetch:"WebFetch",search:"WebSearch",todo:"TodoWrite",patch:"Patch"},ft=Object.entries(mt).sort((n,e)=>e[0].length-n[0].length);function ht(){return W(dt(),".pi","agent","sessions")}i(ht,"getPiSessionsDir");async function gt(n){try{let t=(await ce(n,"utf-8")).split(`
11
11
  `)[0];return t?.trim()?JSON.parse(t):null}catch{return null}}i(gt,"readFirstEntry");function yt(n){return n.split(/[;&|]+/).map(e=>e.trim().split(/\s+/)[0]).filter(Boolean)}i(yt,"extractBashCommands");async function _t(n){let e=[],t;try{t=await ie(n)}catch{return e}for(let o of t){let s=W(n,o);if(!(await le(s).catch(()=>null))?.isDirectory())continue;let l;try{l=await ie(s)}catch{continue}for(let p of l){if(!p.endsWith(".jsonl"))continue;let r=W(s,p);if(!(await le(r).catch(()=>null))?.isFile())continue;let m=await gt(r);if(!m||m.type!=="session")continue;let f=m.cwd??o;e.push({path:r,project:ue(f),provider:"pi"})}}return e}i(_t,"discoverSessionsInDir");function St(n,e){return{async*parse(){let t;try{t=await ce(n.path,"utf-8")}catch{return}let o=t.split(`
12
- `).filter(l=>l.trim()),s=ue(n.path,".jsonl"),a="";for(let[l,p]of o.entries()){let r;try{r=JSON.parse(p)}catch{continue}if(r.type==="session"){s=r.id??s;continue}if(r.type!=="message")continue;let u=r.message;if(!u)continue;if(u.role==="user"){let v=(u.content??[]).filter(k=>k.type==="text").map(k=>k.text??"").filter(Boolean);v.length>0&&(a=v.join(" "));continue}if(u.role!=="assistant"||!u.usage)continue;let{input:m,output:f,cacheRead:d,cacheWrite:y}=u.usage;if(m===0&&f===0)continue;let c=u.model??"gpt-5",g=u.responseId??"",_=`pi:${n.path}:${g||r.id||r.timestamp||String(l)}`;if(e.has(_))continue;e.add(_);let h=(u.content??[]).filter(v=>v.type==="toolCall"&&v.name),T=h.map(v=>pe[v.name]??v.name),S=h.filter(v=>v.name==="bash").flatMap(v=>{let k=v.arguments?.command;return typeof k=="string"?yt(k):[]}),w=r.timestamp??"";yield{provider:"pi",model:c,inputTokens:m,outputTokens:f,cacheCreationInputTokens:y,cacheReadInputTokens:d,cachedInputTokens:d,reasoningTokens:0,costUSD:0,tools:T,bashCommands:S,timestamp:w,speed:"standard",deduplicationKey:_,userMessage:a,sessionId:s},a=""}}}}i(St,"createParser");var de={name:"pi",displayName:"Pi",modelDisplayName(n){for(let[e,t]of ft)if(n.startsWith(e))return t;return n},toolDisplayName(n){return pe[n]??n},async discoverSessions(){return _t(ht())},createSessionParser(n,e){return St(n,e)}};var ye=[Q,ne,ae,de],me=null,fe=!1;async function _e(){if(fe)return me;fe=!0;try{let{cursor:n}=await import("./cursor-T7AMCMKS.js");return me=n,n}catch{return null}}i(_e,"loadCursor");var he=null,ge=!1;async function Se(){if(ge)return he;ge=!0;try{let{opencode:n}=await import("./opencode-QRJ3BH23.js");return he=n,n}catch{return null}}i(Se,"loadOpenCode");async function ve(){let[n,e]=await Promise.all([_e(),Se()]),t=[...ye];return n&&t.push(n),e&&t.push(e),t}i(ve,"getAllProviders");async function vt(n){let e=await ve(),t=n&&n!=="all"?e.filter(s=>s.name===n):e,o=[];for(let s of t){let a=await s.discoverSessions();o.push(...a)}return o}i(vt,"discoverAllSessions");async function wt(n){return n==="cursor"?await _e()??void 0:n==="opencode"?await Se()??void 0:ye.find(e=>e.name===n)}i(wt,"getProvider");import{spawn as V}from"node:child_process";import{randomUUID as kt}from"node:crypto";import{writeFile as Te}from"node:fs/promises";import{tmpdir as xe}from"node:os";import{join as Ie}from"node:path";import{spawn as Tt}from"node:child_process";function H(n){return`rm-${n.trim().replace(/[^A-Za-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"session"}`}i(H,"sanitizeTmuxName");function z(n){let e=n.runId?["env",`RULEMETRIC_RUN_ID=${n.runId}`,"claude"]:["claude"];return n.resumeSessionId&&e.push("--resume",n.resumeSessionId),n.model&&e.push("--model",n.model),["new-session","-d","-s",n.sessionName,"-c",n.projectPath,"--",...e]}i(z,"buildTmuxLaunchArgs");function U(n,e,t={}){return t.literal===!1?["send-keys","-t",n,e]:["send-keys","-t",n,"-l","--",e]}i(U,"buildTmuxSendKeysArgs");function xt(n){return["has-session","-t",n]}i(xt,"buildTmuxHasSessionArgs");function q(n){return`tmux attach -t ${n}`}i(q,"buildTmuxAttachCommand");function It(){let n=["/opt/homebrew/bin","/usr/local/bin"],e=(process.env.PATH??"").split(":").filter(Boolean),t=n.filter(o=>!e.includes(o));return t.length===0?process.env:{...process.env,PATH:[...e,...t].join(":")}}i(It,"tmuxSpawnEnv");function K(n){return new Promise(e=>{let t=Tt("tmux",n,{stdio:["ignore","ignore","pipe"],env:It()}),o="";t.stderr.on("data",s=>{o+=s.toString()}),t.on("close",s=>e({code:s,stderr:o})),t.on("error",s=>e({code:null,stderr:s.message}))})}i(K,"runTmux");async function we(){return(await K(["-V"])).code===0}i(we,"isTmuxAvailable");var At=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function Ot(n){if(n!==void 0){if(At.test(n))return n;console.warn(`[claude-code-launcher] dropping non-uuid runId (RULEMETRIC_RUN_ID not injected): ${JSON.stringify(n)}`)}}i(Ot,"validateRunId");function Pt(n){return`'${n.replace(/'/g,"'\\''")}'`}i(Pt,"shellSingleQuote");var E=class{static{i(this,"ClaudeCodeLauncher")}options;tool="claude_code";constructor(e={}){this.options=e}capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(e){let t=kt(),o={...e,runId:Ot(e.runId)};return o.mode==="headless"?this.launchHeadless(o,t):this.launchInteractive(o,t)}async launchHeadless(e,t){let o=["-p",e.prompt??"","--output-format","json"];e.systemPrompt&&o.push("--system-prompt",e.systemPrompt),e.model&&o.push("--model",e.model);let s={...process.env};return delete s.CLAUDECODE,delete s.HTTPS_PROXY,e.runId&&(s.RULEMETRIC_RUN_ID=e.runId),new Promise(a=>{let l=V("claude",o,{cwd:e.projectPath,env:s,stdio:["ignore","pipe","pipe"]}),p="",r="";l.stdout.on("data",m=>{p+=m.toString()}),l.stderr.on("data",m=>{r+=m.toString()});let u=e.timeout?setTimeout(()=>{l.kill("SIGTERM")},e.timeout):null;l.on("close",m=>{u&&clearTimeout(u);let f=p;try{let d=JSON.parse(p);f=d.result??d.content??p}catch{}a({sessionId:t,pid:l.pid,exitCode:m,output:f,error:m!==0?r:void 0})}),l.on("error",m=>{u&&clearTimeout(u),a({sessionId:t,error:`Failed to spawn claude: ${m.message}`})})})}async launchInteractive(e,t){return await(this.options.tmuxAvailable??we)().catch(()=>!1)?this.launchInteractiveTmux(e,t):this.launchInteractiveTerminal(e,t,"tmux_not_found")}async launchInteractiveTmux(e,t){let o=this.options.runTmux??K,s=H(`claude-${e.resumeSessionId??t}`),a=await o(z({sessionName:s,projectPath:e.projectPath,resumeSessionId:e.resumeSessionId,model:e.model,runId:e.runId}));if(a.code!==0)return this.launchInteractiveTerminal(e,t,"tmux_launch_failed",`tmux new-session exited ${a.code}: ${a.stderr.trim()||"no stderr"}`);let l=await this.openTerminalAttach(s,t);if(e.prompt){let p=await o(U(s,e.prompt));if(p.code!==0)return{sessionId:t,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send-keys exited ${p.code}: ${p.stderr.trim()||"no stderr"}`};let r=await o(U(s,"Enter",{literal:!1}));if(r.code!==0)return{sessionId:t,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send Enter exited ${r.code}: ${r.stderr.trim()||"no stderr"}`}}return{sessionId:t,pid:l.pid,liveSendAvailable:!0,...l.error?{error:l.error}:{},terminalTarget:{kind:"tmux",target:s,attachCommand:q(s),live:!0}}}async openTerminalAttach(e,t){let o=Ie(xe(),`rulemetric-attach-${t}.command`),s=`#!/bin/zsh
12
+ `).filter(l=>l.trim()),s=ue(n.path,".jsonl"),a="";for(let[l,p]of o.entries()){let r;try{r=JSON.parse(p)}catch{continue}if(r.type==="session"){s=r.id??s;continue}if(r.type!=="message")continue;let u=r.message;if(!u)continue;if(u.role==="user"){let v=(u.content??[]).filter(k=>k.type==="text").map(k=>k.text??"").filter(Boolean);v.length>0&&(a=v.join(" "));continue}if(u.role!=="assistant"||!u.usage)continue;let{input:m,output:f,cacheRead:d,cacheWrite:_}=u.usage;if(m===0&&f===0)continue;let c=u.model??"gpt-5",g=u.responseId??"",y=`pi:${n.path}:${g||r.id||r.timestamp||String(l)}`;if(e.has(y))continue;e.add(y);let h=(u.content??[]).filter(v=>v.type==="toolCall"&&v.name),T=h.map(v=>pe[v.name]??v.name),S=h.filter(v=>v.name==="bash").flatMap(v=>{let k=v.arguments?.command;return typeof k=="string"?yt(k):[]}),w=r.timestamp??"";yield{provider:"pi",model:c,inputTokens:m,outputTokens:f,cacheCreationInputTokens:_,cacheReadInputTokens:d,cachedInputTokens:d,reasoningTokens:0,costUSD:0,tools:T,bashCommands:S,timestamp:w,speed:"standard",deduplicationKey:y,userMessage:a,sessionId:s},a=""}}}}i(St,"createParser");var de={name:"pi",displayName:"Pi",modelDisplayName(n){for(let[e,t]of ft)if(n.startsWith(e))return t;return n},toolDisplayName(n){return pe[n]??n},async discoverSessions(){return _t(ht())},createSessionParser(n,e){return St(n,e)}};var ye=[Q,ne,ae,de],me=null,fe=!1;async function _e(){if(fe)return me;fe=!0;try{let{cursor:n}=await import("./cursor-T7AMCMKS.js");return me=n,n}catch{return null}}i(_e,"loadCursor");var he=null,ge=!1;async function Se(){if(ge)return he;ge=!0;try{let{opencode:n}=await import("./opencode-QRJ3BH23.js");return he=n,n}catch{return null}}i(Se,"loadOpenCode");async function ve(){let[n,e]=await Promise.all([_e(),Se()]),t=[...ye];return n&&t.push(n),e&&t.push(e),t}i(ve,"getAllProviders");async function vt(n){let e=await ve(),t=n&&n!=="all"?e.filter(s=>s.name===n):e,o=[];for(let s of t){let a=await s.discoverSessions();o.push(...a)}return o}i(vt,"discoverAllSessions");async function wt(n){return n==="cursor"?await _e()??void 0:n==="opencode"?await Se()??void 0:ye.find(e=>e.name===n)}i(wt,"getProvider");import{spawn as V}from"node:child_process";import{randomUUID as kt}from"node:crypto";import{writeFile as Te}from"node:fs/promises";import{tmpdir as xe}from"node:os";import{join as Ie}from"node:path";import{spawn as Tt}from"node:child_process";function H(n){return`rm-${n.trim().replace(/[^A-Za-z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"session"}`}i(H,"sanitizeTmuxName");function z(n){let e=n.runId?["env",`RULEMETRIC_RUN_ID=${n.runId}`,"claude"]:["claude"];return n.resumeSessionId&&e.push("--resume",n.resumeSessionId),n.model&&e.push("--model",n.model),["new-session","-d","-s",n.sessionName,"-c",n.projectPath,"--",...e]}i(z,"buildTmuxLaunchArgs");function U(n,e,t={}){return t.literal===!1?["send-keys","-t",n,e]:["send-keys","-t",n,"-l","--",e]}i(U,"buildTmuxSendKeysArgs");function xt(n){return["has-session","-t",n]}i(xt,"buildTmuxHasSessionArgs");function q(n){return`tmux attach -t ${n}`}i(q,"buildTmuxAttachCommand");function It(){let n=["/opt/homebrew/bin","/usr/local/bin"],e=(process.env.PATH??"").split(":").filter(Boolean),t=n.filter(o=>!e.includes(o));return t.length===0?process.env:{...process.env,PATH:[...e,...t].join(":")}}i(It,"tmuxSpawnEnv");function K(n){return new Promise(e=>{let t=Tt("tmux",n,{stdio:["ignore","ignore","pipe"],env:It()}),o="";t.stderr.on("data",s=>{o+=s.toString()}),t.on("close",s=>e({code:s,stderr:o})),t.on("error",s=>e({code:null,stderr:s.message}))})}i(K,"runTmux");async function we(){return(await K(["-V"])).code===0}i(we,"isTmuxAvailable");var At=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function Ot(n){if(n!==void 0){if(At.test(n))return n;console.warn(`[claude-code-launcher] dropping non-uuid runId (RULEMETRIC_RUN_ID not injected): ${JSON.stringify(n)}`)}}i(Ot,"validateRunId");function Pt(n){return`'${n.replace(/'/g,"'\\''")}'`}i(Pt,"shellSingleQuote");var E=class{static{i(this,"ClaudeCodeLauncher")}options;tool="claude_code";constructor(e={}){this.options=e}capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(e){let t=kt(),o={...e,runId:Ot(e.runId)};return o.mode==="headless"?this.launchHeadless(o,t):this.launchInteractive(o,t)}async launchHeadless(e,t){let o=["-p",e.prompt??"","--output-format","json"];e.systemPrompt&&o.push("--system-prompt",e.systemPrompt),e.model&&o.push("--model",e.model);let s={...process.env};return delete s.CLAUDECODE,delete s.HTTPS_PROXY,e.runId&&(s.RULEMETRIC_RUN_ID=e.runId),new Promise(a=>{let l=V("claude",o,{cwd:e.projectPath,env:s,stdio:["ignore","pipe","pipe"]}),p="",r="";l.stdout.on("data",m=>{p+=m.toString()}),l.stderr.on("data",m=>{r+=m.toString()});let u=e.timeout?setTimeout(()=>{l.kill("SIGTERM")},e.timeout):null;l.on("close",m=>{u&&clearTimeout(u);let f=p;try{let d=JSON.parse(p);f=d.result??d.content??p}catch{}a({sessionId:t,pid:l.pid,exitCode:m,output:f,error:m!==0?r:void 0})}),l.on("error",m=>{u&&clearTimeout(u),a({sessionId:t,error:`Failed to spawn claude: ${m.message}`})})})}async launchInteractive(e,t){return await(this.options.tmuxAvailable??we)().catch(()=>!1)?this.launchInteractiveTmux(e,t):this.launchInteractiveTerminal(e,t,"tmux_not_found")}async launchInteractiveTmux(e,t){let o=this.options.runTmux??K,s=H(`claude-${e.resumeSessionId??t}`),a=await o(z({sessionName:s,projectPath:e.projectPath,resumeSessionId:e.resumeSessionId,model:e.model,runId:e.runId}));if(a.code!==0)return this.launchInteractiveTerminal(e,t,"tmux_launch_failed",`tmux new-session exited ${a.code}: ${a.stderr.trim()||"no stderr"}`);let l=await this.openTerminalAttach(s,t);if(e.prompt){let p=await o(U(s,e.prompt));if(p.code!==0)return{sessionId:t,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send-keys exited ${p.code}: ${p.stderr.trim()||"no stderr"}`};let r=await o(U(s,"Enter",{literal:!1}));if(r.code!==0)return{sessionId:t,liveSendAvailable:!1,fallbackReason:"tmux_launch_failed",error:`tmux send Enter exited ${r.code}: ${r.stderr.trim()||"no stderr"}`}}return{sessionId:t,pid:l.pid,liveSendAvailable:!0,...l.error?{error:l.error}:{},terminalTarget:{kind:"tmux",target:s,attachCommand:q(s),live:!0}}}async openTerminalAttach(e,t){let o=Ie(xe(),`rulemetric-attach-${t}.command`),s=`#!/bin/zsh
13
13
  rm -- "$0"
14
14
  ${q(e)}
15
15
  `;return await Te(o,s,{mode:493}),new Promise(a=>{let l=V("open",["-a","Terminal",o],{stdio:["ignore","pipe","pipe"]}),p="";l.stderr.on("data",r=>{p+=r.toString()}),l.on("close",r=>{a(r===0?{pid:l.pid}:{pid:l.pid,error:`open attach exited ${r}: ${p.trim()||"no stderr"}`})}),l.on("error",r=>{a({error:`Failed to spawn open attach: ${r.message}`})})})}async launchInteractiveTerminal(e,t,o,s){let a=["claude"];e.resumeSessionId?a.push("--resume",e.resumeSessionId):e.prompt&&a.push("-p",JSON.stringify(e.prompt)),e.model&&a.push("--model",e.model);let l=a.join(" "),p=Ie(xe(),`rulemetric-launch-${t}.command`),r=e.runId?`export RULEMETRIC_RUN_ID=${Pt(e.runId)}
@@ -17,4 +17,4 @@ ${q(e)}
17
17
  rm -- "$0"
18
18
  cd ${JSON.stringify(e.projectPath)} || exit
19
19
  `+r+`${l}
20
- `;return await Te(p,u,{mode:493}),new Promise(m=>{let f=V("open",["-a","Terminal",p],{stdio:["ignore","pipe","pipe"]}),d="";f.stderr.on("data",y=>{d+=y.toString()}),f.on("close",y=>{if(y===0)m({sessionId:t,pid:f.pid,liveSendAvailable:!1,fallbackReason:o,...s?{error:s}:{}});else{let c=d.trim()||"no stderr";m({sessionId:t,pid:f.pid,liveSendAvailable:!1,fallbackReason:o,error:s?`${s}; open exited ${y}: ${c}`:`open exited ${y}: ${c}`})}}),f.on("error",y=>{m({sessionId:t,liveSendAvailable:!1,fallbackReason:o,error:`Failed to spawn open: ${y.message}`})})})}};import{spawn as ke}from"node:child_process";import{randomUUID as Nt}from"node:crypto";var R=class{static{i(this,"CodexLauncher")}tool="codex";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(e){let t=Nt();return e.mode==="headless"?this.launchHeadless(e,t):this.launchInteractive(e,t)}launchHeadless(e,t){let o=["-q",e.prompt??""];return e.model&&o.push("--model",e.model),new Promise(s=>{let a=ke("codex",o,{cwd:e.projectPath,stdio:["ignore","pipe","pipe"]}),l="",p="";a.stdout.on("data",u=>{l+=u.toString()}),a.stderr.on("data",u=>{p+=u.toString()});let r=e.timeout?setTimeout(()=>{a.kill("SIGTERM")},e.timeout):null;a.on("close",u=>{r&&clearTimeout(r),s({sessionId:t,pid:a.pid,exitCode:u,output:l,error:u!==0?p:void 0})}),a.on("error",u=>{r&&clearTimeout(r),s({sessionId:t,error:`Failed to spawn codex: ${u.message}`})})})}launchInteractive(e,t){let o=["codex"];e.prompt&&o.push(JSON.stringify(e.prompt));let s=`cd ${JSON.stringify(e.projectPath)} && ${o.join(" ")}`,a=ke("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(s)}`],{stdio:"ignore",detached:!0});return a.unref(),Promise.resolve({sessionId:t,pid:a.pid})}};import{spawn as Ae}from"node:child_process";import{randomUUID as Dt}from"node:crypto";var M=class{static{i(this,"AiderLauncher")}tool="aider";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(e){let t=Dt();return e.mode==="headless"?this.launchHeadless(e,t):this.launchInteractive(e,t)}launchHeadless(e,t){let o=["--message",e.prompt??"","--yes"];return e.model&&o.push("--model",e.model),new Promise(s=>{let a=Ae("aider",o,{cwd:e.projectPath,stdio:["ignore","pipe","pipe"]}),l="",p="";a.stdout.on("data",u=>{l+=u.toString()}),a.stderr.on("data",u=>{p+=u.toString()});let r=e.timeout?setTimeout(()=>{a.kill("SIGTERM")},e.timeout):null;a.on("close",u=>{r&&clearTimeout(r),s({sessionId:t,pid:a.pid,exitCode:u,output:l,error:u!==0?p:void 0})}),a.on("error",u=>{r&&clearTimeout(r),s({sessionId:t,error:`Failed to spawn aider: ${u.message}`})})})}launchInteractive(e,t){let o=["aider"];e.model&&o.push("--model",e.model);let s=`cd ${JSON.stringify(e.projectPath)} && ${o.join(" ")}`,a=Ae("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(s)}`],{stdio:"ignore",detached:!0});return a.unref(),Promise.resolve({sessionId:t,pid:a.pid})}};import{spawn as bt}from"node:child_process";import{randomUUID as Ct}from"node:crypto";var J=class{static{i(this,"GenericLauncher")}tool;constructor(e){this.tool=e}capabilities={headless:!1,interactive:!0,remoteSpawn:!1};async launch(e){let t=Ct();if(e.mode==="headless")return{sessionId:t,error:`${this.tool} does not support headless mode`};let o=`cd ${JSON.stringify(e.projectPath)} && echo "Session ${t} \u2014 tool: ${this.tool}" && exec $SHELL`,s=bt("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(o)}`],{stdio:"ignore",detached:!0});return s.unref(),{sessionId:t,pid:s.pid}}};var Oe={claude_code:i(()=>new E,"claude_code"),codex:i(()=>new R,"codex"),aider:i(()=>new M,"aider")};function $t(n){let e=Oe[n];return e?e():new J(n)}i($t,"getLauncher");function jt(){return Object.entries(Oe).map(([n,e])=>({tool:n,capabilities:e().capabilities}))}i(jt,"getAvailableLaunchers");import Pe from"node:path";function Ne(n){return n.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"")||"worktree"}i(Ne,"sanitizeBranch");function Ut(n){return Pe.resolve(n.basePath??Pe.join(n.repoRoot,"..",".rulemetric-worktrees",Ne(n.branch)))}i(Ut,"worktreePathFor");export{qt as a,Et as b,O as c,P as d,N as e,D as f,b as g,Z as h,C as i,Ee as j,Re as k,ve as l,vt as m,wt as n,H as o,z as p,U as q,xt as r,q as s,$t as t,jt as u,Ne as v,Ut as w};
20
+ `;return await Te(p,u,{mode:493}),new Promise(m=>{let f=V("open",["-a","Terminal",p],{stdio:["ignore","pipe","pipe"]}),d="";f.stderr.on("data",_=>{d+=_.toString()}),f.on("close",_=>{if(_===0)m({sessionId:t,pid:f.pid,liveSendAvailable:!1,fallbackReason:o,...s?{error:s}:{}});else{let c=d.trim()||"no stderr";m({sessionId:t,pid:f.pid,liveSendAvailable:!1,fallbackReason:o,error:s?`${s}; open exited ${_}: ${c}`:`open exited ${_}: ${c}`})}}),f.on("error",_=>{m({sessionId:t,liveSendAvailable:!1,fallbackReason:o,error:`Failed to spawn open: ${_.message}`})})})}};import{spawn as ke}from"node:child_process";import{randomUUID as Nt}from"node:crypto";var R=class{static{i(this,"CodexLauncher")}tool="codex";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(e){let t=Nt();return e.mode==="headless"?this.launchHeadless(e,t):this.launchInteractive(e,t)}launchHeadless(e,t){let o=["-q",e.prompt??""];return e.model&&o.push("--model",e.model),new Promise(s=>{let a=ke("codex",o,{cwd:e.projectPath,stdio:["ignore","pipe","pipe"]}),l="",p="";a.stdout.on("data",u=>{l+=u.toString()}),a.stderr.on("data",u=>{p+=u.toString()});let r=e.timeout?setTimeout(()=>{a.kill("SIGTERM")},e.timeout):null;a.on("close",u=>{r&&clearTimeout(r),s({sessionId:t,pid:a.pid,exitCode:u,output:l,error:u!==0?p:void 0})}),a.on("error",u=>{r&&clearTimeout(r),s({sessionId:t,error:`Failed to spawn codex: ${u.message}`})})})}launchInteractive(e,t){let o=["codex"];e.prompt&&o.push(JSON.stringify(e.prompt));let s=`cd ${JSON.stringify(e.projectPath)} && ${o.join(" ")}`,a=ke("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(s)}`],{stdio:"ignore",detached:!0});return a.unref(),Promise.resolve({sessionId:t,pid:a.pid})}};import{spawn as Ae}from"node:child_process";import{randomUUID as Dt}from"node:crypto";var M=class{static{i(this,"AiderLauncher")}tool="aider";capabilities={headless:!0,interactive:!0,remoteSpawn:!0};async launch(e){let t=Dt();return e.mode==="headless"?this.launchHeadless(e,t):this.launchInteractive(e,t)}launchHeadless(e,t){let o=["--message",e.prompt??"","--yes"];return e.model&&o.push("--model",e.model),new Promise(s=>{let a=Ae("aider",o,{cwd:e.projectPath,stdio:["ignore","pipe","pipe"]}),l="",p="";a.stdout.on("data",u=>{l+=u.toString()}),a.stderr.on("data",u=>{p+=u.toString()});let r=e.timeout?setTimeout(()=>{a.kill("SIGTERM")},e.timeout):null;a.on("close",u=>{r&&clearTimeout(r),s({sessionId:t,pid:a.pid,exitCode:u,output:l,error:u!==0?p:void 0})}),a.on("error",u=>{r&&clearTimeout(r),s({sessionId:t,error:`Failed to spawn aider: ${u.message}`})})})}launchInteractive(e,t){let o=["aider"];e.model&&o.push("--model",e.model);let s=`cd ${JSON.stringify(e.projectPath)} && ${o.join(" ")}`,a=Ae("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(s)}`],{stdio:"ignore",detached:!0});return a.unref(),Promise.resolve({sessionId:t,pid:a.pid})}};import{spawn as bt}from"node:child_process";import{randomUUID as Ct}from"node:crypto";var J=class{static{i(this,"GenericLauncher")}tool;constructor(e){this.tool=e}capabilities={headless:!1,interactive:!0,remoteSpawn:!1};async launch(e){let t=Ct();if(e.mode==="headless")return{sessionId:t,error:`${this.tool} does not support headless mode`};let o=`cd ${JSON.stringify(e.projectPath)} && echo "Session ${t} \u2014 tool: ${this.tool}" && exec $SHELL`,s=bt("osascript",["-e",`tell application "Terminal" to do script ${JSON.stringify(o)}`],{stdio:"ignore",detached:!0});return s.unref(),{sessionId:t,pid:s.pid}}};var Oe={claude_code:i(()=>new E,"claude_code"),codex:i(()=>new R,"codex"),aider:i(()=>new M,"aider")};function $t(n){let e=Oe[n];return e?e():new J(n)}i($t,"getLauncher");function jt(){return Object.entries(Oe).map(([n,e])=>({tool:n,capabilities:e().capabilities}))}i(jt,"getAvailableLaunchers");import Pe from"node:path";function Ne(n){return n.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^[-.]+|[-.]+$/g,"")||"worktree"}i(Ne,"sanitizeBranch");function Ut(n){return Pe.resolve(n.basePath??Pe.join(n.repoRoot,"..",".rulemetric-worktrees",Ne(n.branch)))}i(Ut,"worktreePathFor");export{qt as a,Et as b,O as c,P as d,N as e,D as f,b as g,Z as h,C as i,Ee as j,Re as k,ve as l,vt as m,wt as n,H as o,z as p,U as q,xt as r,q as s,$t as t,jt as u,Ne as v,Ut as w};
@@ -1,4 +1,4 @@
1
- import{a as g,c as w}from"./chunk-UPFH72PF.js";import{g as p,h as m,i as k,j as h,k as y}from"./chunk-WMIUFMDI.js";import{a as s}from"./chunk-ZLLER3HP.js";import{existsSync as u,readFileSync as f,writeFileSync as v,copyFileSync as R,rmSync as P,statSync as x,readdirSync as $,mkdirSync as j}from"node:fs";import{join as i,dirname as L}from"node:path";import{homedir as c}from"node:os";var I=["/plugins/cache/","/plugins/marketplaces/","/node_modules/","/.git/"];function _(e){return I.some(t=>e.includes(t))}s(_,"isUnownedPath");function K(e,t){let n=i(c(),".config","rulemetric","retraction-backups",t),r=e.replace(/^\/+/,"").replace(/\//g,"__");return i(n,r)}s(K,"backupPathFor");function b(e){return e.split(`
1
+ import{a as g,c as w}from"./chunk-UPFH72PF.js";import{g as p,h as m,i as k,j as h,k as y}from"./chunk-J5HW45PZ.js";import{a as s}from"./chunk-ZLLER3HP.js";import{existsSync as u,readFileSync as f,writeFileSync as v,copyFileSync as R,rmSync as P,statSync as x,readdirSync as $,mkdirSync as j}from"node:fs";import{join as i,dirname as L}from"node:path";import{homedir as c}from"node:os";var I=["/plugins/cache/","/plugins/marketplaces/","/node_modules/","/.git/"];function _(e){return I.some(t=>e.includes(t))}s(_,"isUnownedPath");function K(e,t){let n=i(c(),".config","rulemetric","retraction-backups",t),r=e.replace(/^\/+/,"").replace(/\//g,"__");return i(n,r)}s(K,"backupPathFor");function b(e){return e.split(`
2
2
  `).slice(0,40).map(t=>`- ${t}`).join(`
3
3
  `)}s(b,"shortDiff");function d(e,t,n){return{kind:e,path:t,ok:!1,refusal:n,preview:"",warnings:[]}}s(d,"refuse");function B(e){let[t,...n]=e.split("::"),r=n.join("::");if(!r)return null;switch(t){case"claude_md":return{kind:"claude_md_section",target:r};case"memory":return{kind:"memory_section",target:r};case"skill":return{kind:"skill_file",target:r};default:return null}}s(B,"pathFromContextIdentity");function D(e,t){let n=e.replace(/^skills--/,""),r=w(e);return[...(r===n?[n]:[r,n]).flatMap(a=>[i(t,...g.split("/"),a,"SKILL.md"),i(t,".claude","skills",a,"SKILL.md"),i(t,".claude","skills",`${a}.md`),i(c(),...g.split("/"),a,"SKILL.md"),i(c(),".claude","skills",a,"SKILL.md"),i(c(),".claude","skills",`${a}.md`)]),...F(n)]}s(D,"candidateSkillPaths");function F(e){let t=i(c(),".claude","plugins","marketplaces");if(!u(t))return[];let n=[];try{for(let r of $(t))n.push(i(t,r,"skills",e,"SKILL.md"),i(t,r,"plugins",e,"SKILL.md"),i(t,r,"skills",`${e}.md`))}catch{}return n}s(F,"pluginSkillPaths");function H(e){switch(e.kind){case"claude_md_section":case"memory_section":case"claude_md_block":return C(e);case"skill_file":return E(e);case"settings_hook":case"mcp_server":return N(e)}}s(H,"planRetraction");function C(e){let t=e.target;if(!u(t))return d(e.kind,t,`File does not exist: ${t}`);if(_(t))return d(e.kind,t,`Refusing to edit a path this tool does not own: ${t}`);let n=f(t,"utf-8"),r=e.body?m(n,e.body):p(n,e.heading??"");if(!r.removed){let l={"not-found":"The content is not present in this file (already removed, or edited since).",ambiguous:"The content appears more than once \u2014 refusing to guess which copy the verdict was about.","would-empty-file":"Removing it would empty the file. Delete the file by hand if that is really the intent."}[r.reason??"not-found"];return d(e.kind,t,l)}let o=[];return S(t,e.cwd)||o.push("This file is not tracked by git in this repo \u2014 the timestamped backup is your only undo."),{kind:e.kind,path:t,ok:!0,preview:b(r.removedText??""),nextContent:r.content,warnings:o}}s(C,"planFileEdit");function E(e){let t=e.target.startsWith("/")?[e.target]:D(e.target,e.cwd),n=t.find(l=>u(l));if(!n)return d("skill_file",t[0]??e.target,`No local skill file found for "${e.target}". Searched:
4
4
  ${t.join(`
@@ -1 +1 @@
1
- import{b as o,f as a}from"./chunk-UGACB66X.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-APDRR6FS.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};