@rulemetric/cli 0.13.0 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/dist/base-command.js +1 -1
  2. package/dist/chunk-2UK4DZFW.js +12 -0
  3. package/dist/{chunk-3UPHCQWI.js → chunk-35YVHBLL.js} +1 -1
  4. package/dist/{chunk-VH2EAP4J.js → chunk-3FNTV2TW.js} +1 -1
  5. package/dist/{chunk-WQX4RRBQ.js → chunk-3IMRLHJJ.js} +1 -1
  6. package/dist/chunk-42A4PUW7.js +48 -0
  7. package/dist/chunk-43VKTVM3.js +1 -0
  8. package/dist/{chunk-CYYDQFRY.js → chunk-44TYRMIS.js} +1 -1
  9. package/dist/{chunk-25RDT32M.js → chunk-4FJYVYCU.js} +1 -1
  10. package/dist/{chunk-I3M5VBLT.js → chunk-5BT375C7.js} +1 -1
  11. package/dist/{chunk-7AWFSFR7.js → chunk-5Z3H5JHK.js} +1 -1
  12. package/dist/{chunk-25Q3Y7TC.js → chunk-6ANODRDT.js} +1 -1
  13. package/dist/{chunk-APDRR6FS.js → chunk-76UKAFNM.js} +1 -1
  14. package/dist/{chunk-VXUKXGRX.js → chunk-7MTYUTUN.js} +2 -2
  15. package/dist/{chunk-JWFRI32Y.js → chunk-AGEZAKCC.js} +1 -1
  16. package/dist/chunk-AHLVY52I.js +1 -0
  17. package/dist/{chunk-MNQPCNGQ.js → chunk-AIYFT4P6.js} +1 -1
  18. package/dist/{chunk-UYPBIXF2.js → chunk-B5X6HCBK.js} +1 -1
  19. package/dist/chunk-BAITMD76.js +1 -0
  20. package/dist/{chunk-GJBS6QYC.js → chunk-BFQVAU6N.js} +1 -1
  21. package/dist/{chunk-UE76F2NQ.js → chunk-BMT5WMEV.js} +20 -20
  22. package/dist/chunk-CT6GJQIR.js +1 -0
  23. package/dist/chunk-CT7FWSIU.js +3 -0
  24. package/dist/chunk-DHX4U6EC.js +13 -0
  25. package/dist/chunk-DQYYHX6K.js +1 -0
  26. package/dist/{chunk-WH3IPXXQ.js → chunk-DVU5PHPM.js} +5 -5
  27. package/dist/chunk-E7GQJML3.js +1 -0
  28. package/dist/{chunk-4N43IBXH.js → chunk-EMLLGASZ.js} +1 -1
  29. package/dist/{chunk-Y7QIOPN5.js → chunk-EUHRTEVJ.js} +1 -1
  30. package/dist/chunk-FBSZ6KCM.js +1 -0
  31. package/dist/{chunk-5XK6LB2T.js → chunk-FKTT7A4H.js} +1 -1
  32. package/dist/{chunk-V2USQH27.js → chunk-FYZ6HHCV.js} +1 -1
  33. package/dist/chunk-GH4EZK2O.js +1 -0
  34. package/dist/{chunk-DUBBL57L.js → chunk-GKVHFXUQ.js} +1 -1
  35. package/dist/chunk-GPBN4ROE.js +2 -0
  36. package/dist/chunk-GYNZ3OZF.js +1 -0
  37. package/dist/chunk-H6FVXVGG.js +1 -0
  38. package/dist/{chunk-6GAIYJ6K.js → chunk-HNYHZO2J.js} +1 -1
  39. package/dist/{chunk-RJX75Y7J.js → chunk-I6ZQOMZS.js} +1 -1
  40. package/dist/{chunk-O2HCD6XL.js → chunk-IO46ICZY.js} +1 -1
  41. package/dist/chunk-IQEZ3T5A.js +1 -0
  42. package/dist/{chunk-KV5A77XW.js → chunk-ISFPPDDB.js} +1 -1
  43. package/dist/chunk-J4W6GNCF.js +2 -0
  44. package/dist/chunk-JP6ULOEX.js +2 -0
  45. package/dist/{chunk-J6QMBMC2.js → chunk-JTYVBR5H.js} +1 -1
  46. package/dist/{chunk-BG55WDDX.js → chunk-KOYHJFB3.js} +1 -1
  47. package/dist/chunk-LJRJ2RAC.js +4 -0
  48. package/dist/chunk-MHVHGKDK.js +3 -0
  49. package/dist/{chunk-PVGUDJD7.js → chunk-MMLRWCBW.js} +1 -1
  50. package/dist/chunk-MMM4B3KH.js +1 -0
  51. package/dist/{chunk-ZGW3N3A6.js → chunk-MU7KKU3O.js} +1 -1
  52. package/dist/{chunk-YI2OWO6R.js → chunk-MXHAXY66.js} +1 -1
  53. package/dist/chunk-N4YPDZJF.js +9 -0
  54. package/dist/{chunk-VIQ25ORK.js → chunk-NYNHX7OX.js} +1 -1
  55. package/dist/{chunk-RK663O4M.js → chunk-OP4U3XBZ.js} +6 -6
  56. package/dist/{chunk-6W2GSV4O.js → chunk-OVS7ZDJ4.js} +1 -1
  57. package/dist/chunk-PIVEJTNF.js +1 -0
  58. package/dist/chunk-POEMCITL.js +1 -0
  59. package/dist/chunk-PPAHIVG5.js +1 -0
  60. package/dist/{chunk-NBEZ5FAU.js → chunk-Q36QSFSB.js} +1 -1
  61. package/dist/chunk-Q776YUBD.js +1 -0
  62. package/dist/chunk-QAMHZY2P.js +1 -0
  63. package/dist/chunk-QI3FJKGK.js +1 -0
  64. package/dist/{chunk-WOJ733IB.js → chunk-QRIJ3AHP.js} +1 -1
  65. package/dist/chunk-RAQLVO2X.js +1 -0
  66. package/dist/{chunk-M2VVRQKA.js → chunk-RG3R4EAB.js} +1 -1
  67. package/dist/{chunk-WY3VVX3R.js → chunk-RMRVUI7B.js} +1 -1
  68. package/dist/{chunk-GBWQENAH.js → chunk-RXZLBSDO.js} +1 -1
  69. package/dist/chunk-SCQK52SL.js +1 -0
  70. package/dist/{chunk-BZS5QRWB.js → chunk-SG4UDDHB.js} +1 -1
  71. package/dist/chunk-SWSOEYC7.js +1 -0
  72. package/dist/chunk-T75KAEJO.js +25 -0
  73. package/dist/{chunk-U7TBEC3I.js → chunk-V55ROUNP.js} +1 -1
  74. package/dist/{chunk-SHYP27B7.js → chunk-VALRPZXH.js} +1 -1
  75. package/dist/{chunk-P2WSDHIA.js → chunk-VIFOLTZT.js} +1 -1
  76. package/dist/{chunk-6QLZT7EP.js → chunk-VU24IH5S.js} +1 -1
  77. package/dist/{chunk-6ZPSVZNH.js → chunk-VXL5H3VZ.js} +1 -1
  78. package/dist/{chunk-QFKUSNUB.js → chunk-W23OYQXI.js} +1 -1
  79. package/dist/{chunk-QTCWOIT4.js → chunk-WWQWHC4K.js} +1 -1
  80. package/dist/{chunk-LTQ5BJYL.js → chunk-XGMOVQ5G.js} +1 -1
  81. package/dist/{chunk-4COLIGD7.js → chunk-XJ25HFIT.js} +1 -1
  82. package/dist/{chunk-3MDEGOUG.js → chunk-XMA6SWOT.js} +1 -1
  83. package/dist/{chunk-WJZY5Y22.js → chunk-XMTKP74H.js} +1 -1
  84. package/dist/chunk-XQYAVSUQ.js +1 -0
  85. package/dist/{chunk-2EX27VJ3.js → chunk-YK2IEHLB.js} +1 -1
  86. package/dist/chunk-ZK3ACE4T.js +1 -0
  87. package/dist/commands/antigravity/backfill.js +1 -1
  88. package/dist/commands/auth/create-key.js +1 -1
  89. package/dist/commands/auth/login.js +1 -1
  90. package/dist/commands/auth/logout.js +1 -1
  91. package/dist/commands/auth/revoke-key.js +1 -1
  92. package/dist/commands/auth/signup.js +1 -1
  93. package/dist/commands/auth/status.js +1 -1
  94. package/dist/commands/capture/scope.js +1 -1
  95. package/dist/commands/catalog/index.js +1 -1
  96. package/dist/commands/catalog/recommend.js +1 -1
  97. package/dist/commands/crons/list.js +1 -1
  98. package/dist/commands/crons/run.js +2 -2
  99. package/dist/commands/dashboard.js +1 -1
  100. package/dist/commands/diagnostics.js +1 -1
  101. package/dist/commands/eval-targets/create.js +1 -1
  102. package/dist/commands/eval-targets/list.js +1 -1
  103. package/dist/commands/evals/agent.js +3 -3
  104. package/dist/commands/evals/auto-run.js +1 -1
  105. package/dist/commands/evals/benchmark.js +1 -1
  106. package/dist/commands/evals/compare.js +1 -1
  107. package/dist/commands/evals/create.js +1 -1
  108. package/dist/commands/evals/optimize-description.js +1 -1
  109. package/dist/commands/evals/optimize.js +1 -1
  110. package/dist/commands/evals/refine-cases.js +1 -1
  111. package/dist/commands/evals/run.js +1 -1
  112. package/dist/commands/evals/validate-judge.js +1 -1
  113. package/dist/commands/experiments/list.js +1 -1
  114. package/dist/commands/gateway/ensure.js +1 -1
  115. package/dist/commands/hooks/emit-instructions.js +1 -1
  116. package/dist/commands/hooks/install.js +1 -1
  117. package/dist/commands/hooks/run.js +1 -1
  118. package/dist/commands/hooks/uninstall.js +1 -1
  119. package/dist/commands/instructions/create.js +1 -1
  120. package/dist/commands/instructions/dedupe.js +1 -1
  121. package/dist/commands/instructions/delete.js +1 -1
  122. package/dist/commands/instructions/fork.js +1 -1
  123. package/dist/commands/instructions/get.js +1 -1
  124. package/dist/commands/instructions/list.js +1 -1
  125. package/dist/commands/instructions/promote.js +1 -1
  126. package/dist/commands/instructions/pull.js +1 -1
  127. package/dist/commands/instructions/restore.js +1 -1
  128. package/dist/commands/instructions/retract.js +1 -1
  129. package/dist/commands/instructions/upstream.js +1 -1
  130. package/dist/commands/instructions/versions.js +1 -1
  131. package/dist/commands/launcher.js +1 -1
  132. package/dist/commands/local/down.js +1 -1
  133. package/dist/commands/local/up.js +1 -1
  134. package/dist/commands/org/current.js +1 -1
  135. package/dist/commands/org/list.js +1 -1
  136. package/dist/commands/org/switch.js +1 -1
  137. package/dist/commands/packs/add-instruction.js +1 -1
  138. package/dist/commands/packs/apply.js +1 -1
  139. package/dist/commands/packs/create.js +1 -1
  140. package/dist/commands/packs/fork.js +1 -1
  141. package/dist/commands/packs/get.js +1 -1
  142. package/dist/commands/packs/list.js +1 -1
  143. package/dist/commands/packs/remove-instruction.js +1 -1
  144. package/dist/commands/proxy/env.js +1 -1
  145. package/dist/commands/proxy/logs.js +1 -1
  146. package/dist/commands/proxy/restart.js +1 -1
  147. package/dist/commands/proxy/setup.js +1 -1
  148. package/dist/commands/proxy/start.js +1 -1
  149. package/dist/commands/proxy/status.js +1 -1
  150. package/dist/commands/proxy/stop.js +1 -1
  151. package/dist/commands/research/backfill.js +1 -1
  152. package/dist/commands/research/tail-transcript.js +1 -1
  153. package/dist/commands/service/install.js +18 -18
  154. package/dist/commands/service/status.js +1 -1
  155. package/dist/commands/service/uninstall.js +1 -1
  156. package/dist/commands/sessions/analyze.js +1 -1
  157. package/dist/commands/sessions/delete.js +1 -1
  158. package/dist/commands/sessions/end.js +1 -1
  159. package/dist/commands/sessions/import.js +1 -1
  160. package/dist/commands/sessions/list.js +1 -1
  161. package/dist/commands/sessions/start.js +1 -1
  162. package/dist/commands/setup.js +1 -1
  163. package/dist/commands/skills/export-approved.js +1 -1
  164. package/dist/commands/skills/install.js +1 -1
  165. package/dist/commands/skills/list.js +1 -1
  166. package/dist/commands/skills/publish.js +1 -1
  167. package/dist/commands/skills/search.js +1 -1
  168. package/dist/commands/skills/update.js +1 -1
  169. package/dist/commands/suggestions/accept.js +1 -1
  170. package/dist/commands/suggestions/auto.js +1 -1
  171. package/dist/commands/suggestions/dismiss.js +1 -1
  172. package/dist/commands/suggestions/list.js +1 -1
  173. package/dist/commands/suggestions/refresh.js +1 -1
  174. package/dist/commands/suggestions/undo.js +1 -1
  175. package/dist/dashboard/Dashboard.js +1 -1
  176. package/dist/dashboard/data.js +1 -1
  177. package/dist/dashboard/launcher/LauncherOverlay.js +1 -1
  178. package/dist/dashboard/launcher/api.js +1 -1
  179. package/dist/dashboard/launcher/useLaunchJobs.js +1 -1
  180. package/dist/dashboard/panels/measurement.js +1 -0
  181. package/dist/dist-GSHUC7UU.js +1 -0
  182. package/dist/harbor/cost_delta.py +377 -0
  183. package/dist/harbor/mcp_container_shell.py +156 -0
  184. package/dist/harbor/provenance.py +361 -0
  185. package/dist/harbor/rm-batch-task/environment/Dockerfile +6 -0
  186. package/dist/harbor/rm-batch-task/environment/items.jsonl +60 -0
  187. package/dist/harbor/rm-batch-task/inject.md +8 -0
  188. package/dist/harbor/rm-batch-task/instruction.md +8 -0
  189. package/dist/harbor/rm-batch-task/solution/solve.sh +68 -0
  190. package/dist/harbor/rm-batch-task/task.toml +30 -0
  191. package/dist/harbor/rm-batch-task/tests/test.sh +23 -0
  192. package/dist/harbor/rm-batch-task/tests/test_outputs.py +32 -0
  193. package/dist/harbor/rm-locality-task/environment/Dockerfile +8 -0
  194. package/dist/harbor/rm-locality-task/environment/workspace/deploy/prod/ingest.yaml +3 -0
  195. package/dist/harbor/rm-locality-task/environment/workspace/deploy/staging/ingest.yaml +3 -0
  196. package/dist/harbor/rm-locality-task/environment/workspace/docs/architecture/ingest.md +6 -0
  197. package/dist/harbor/rm-locality-task/environment/workspace/legacy/ingest_v1/config.yaml +2 -0
  198. package/dist/harbor/rm-locality-task/environment/workspace/packages/shared/defaults.py +4 -0
  199. package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/config/limits.defaults.yaml +4 -0
  200. package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/config/limits.yaml +3 -0
  201. package/dist/harbor/rm-locality-task/environment/workspace/services/ingest/loader.py +15 -0
  202. package/dist/harbor/rm-locality-task/environment/workspace/tests/fixtures/ingest_config.yaml +3 -0
  203. package/dist/harbor/rm-locality-task/inject.md +12 -0
  204. package/dist/harbor/rm-locality-task/instruction.md +4 -0
  205. package/dist/harbor/rm-locality-task/solution/solve.sh +14 -0
  206. package/dist/harbor/rm-locality-task/task.toml +30 -0
  207. package/dist/harbor/rm-locality-task/tests/test.sh +23 -0
  208. package/dist/harbor/rm-locality-task/tests/test_outputs.py +19 -0
  209. package/dist/harbor/rm-migrations-task/environment/Dockerfile +7 -0
  210. package/dist/harbor/rm-migrations-task/environment/applied.txt +2 -0
  211. package/dist/harbor/rm-migrations-task/environment/migrations/00001_init.sql +1 -0
  212. package/dist/harbor/rm-migrations-task/environment/migrations/00002_add_email.sql +1 -0
  213. package/dist/harbor/rm-migrations-task/inject.md +7 -0
  214. package/dist/harbor/rm-migrations-task/instruction.md +8 -0
  215. package/dist/harbor/rm-migrations-task/solution/solve.sh +8 -0
  216. package/dist/harbor/rm-migrations-task/task.toml +30 -0
  217. package/dist/harbor/rm-migrations-task/tests/test.sh +23 -0
  218. package/dist/harbor/rm-migrations-task/tests/test_outputs.py +36 -0
  219. package/dist/harbor/rm-pagination-task/environment/Dockerfile +6 -0
  220. package/dist/harbor/rm-pagination-task/environment/store.py +29 -0
  221. package/dist/harbor/rm-pagination-task/inject.md +8 -0
  222. package/dist/harbor/rm-pagination-task/instruction.md +5 -0
  223. package/dist/harbor/rm-pagination-task/solution/solve.sh +7 -0
  224. package/dist/harbor/rm-pagination-task/task.toml +30 -0
  225. package/dist/harbor/rm-pagination-task/tests/test.sh +23 -0
  226. package/dist/harbor/rm-pagination-task/tests/test_outputs.py +14 -0
  227. package/dist/harbor/rm_host_claude.py +264 -0
  228. package/dist/harbor/rm_host_codex.py +208 -0
  229. package/dist/harbor/run.sh +268 -0
  230. package/dist/harbor/summarize.py +248 -0
  231. package/dist/lib/active-org-refresh.js +1 -1
  232. package/dist/lib/agent-loop.js +1 -1
  233. package/dist/lib/antigravity-transcript.js +1 -1
  234. package/dist/lib/api-client.js +1 -1
  235. package/dist/lib/autorun-batch.js +1 -0
  236. package/dist/lib/capture-scope-config.js +1 -1
  237. package/dist/lib/codex-capture-scope.js +1 -1
  238. package/dist/lib/codex-exec.js +1 -1
  239. package/dist/lib/ensure-api-key.js +1 -1
  240. package/dist/lib/ensure-fresh-token.js +1 -1
  241. package/dist/lib/eval-accumulation.js +1 -0
  242. package/dist/lib/eval-analyzer.js +1 -1
  243. package/dist/lib/eval-benchmark.js +1 -1
  244. package/dist/lib/eval-candidate-run.js +1 -1
  245. package/dist/lib/eval-case-generator.js +1 -1
  246. package/dist/lib/eval-conversation-handler.js +1 -1
  247. package/dist/lib/eval-executor.js +1 -1
  248. package/dist/lib/eval-grader.js +1 -1
  249. package/dist/lib/eval-meta-judge.js +1 -1
  250. package/dist/lib/eval-resume.js +1 -1
  251. package/dist/lib/eval-run-batch.js +1 -1
  252. package/dist/lib/eval-trigger-tester.js +1 -1
  253. package/dist/lib/evolution-enrolment.js +1 -1
  254. package/dist/lib/harbor-readiness.js +1 -1
  255. package/dist/lib/hooks-capture-gate.js +1 -1
  256. package/dist/lib/insights/generation/installed-asks.js +1 -1
  257. package/dist/lib/insights/nomination/nominate.js +1 -1
  258. package/dist/lib/instruction-proposer.js +1 -1
  259. package/dist/lib/instruction-snapshot.js +1 -1
  260. package/dist/lib/instructions/acceptance/accept-events.js +1 -1
  261. package/dist/lib/instructions/acceptance/accept-hook.js +1 -1
  262. package/dist/lib/instructions/acceptance/agent-instruction-files.js +1 -1
  263. package/dist/lib/instructions/acceptance/hook-install.js +1 -1
  264. package/dist/lib/instructions/acceptance/reverse-applications.js +1 -1
  265. package/dist/lib/instructions/acceptance/suggestion-accept.js +1 -1
  266. package/dist/lib/jobs/handlers/cron-auto-accept-suggestions.js +1 -1
  267. package/dist/lib/jobs/handlers/cron-eval-autorun.js +1 -1
  268. package/dist/lib/jobs/handlers/cron-instruction-evolution.js +1 -1
  269. package/dist/lib/jobs/handlers/cron-instruction-training.js +1 -1
  270. package/dist/lib/jobs/handlers/cron-reconcile-attribution.js +1 -1
  271. package/dist/lib/jobs/handlers/cron-refine-cases.js +1 -1
  272. package/dist/lib/jobs/handlers/cron-refresh-pricing.js +1 -1
  273. package/dist/lib/jobs/handlers/cron-retire-unused-skills.js +1 -1
  274. package/dist/lib/jobs/handlers/cron-suggest-instructions.js +1 -1
  275. package/dist/lib/jobs/handlers/distill-memories.js +1 -1
  276. package/dist/lib/jobs/handlers/harbor-ab-verdict.js +1 -1
  277. package/dist/lib/jobs/handlers/harbor-ab.js +1 -1
  278. package/dist/lib/jobs/handlers/process-changelog.js +1 -1
  279. package/dist/lib/jobs/handlers/process-conversation.js +1 -1
  280. package/dist/lib/jobs/handlers/process-eval.js +1 -1
  281. package/dist/lib/jobs/handlers/process-insights.js +1 -1
  282. package/dist/lib/jobs/handlers/process-judge-review.js +1 -1
  283. package/dist/lib/jobs/handlers/process-launch.js +1 -1
  284. package/dist/lib/jobs/handlers/process-memory-ab.js +1 -1
  285. package/dist/lib/jobs/handlers/process-run-cleanup.js +1 -1
  286. package/dist/lib/jobs/handlers/process-session-goal.js +1 -1
  287. package/dist/lib/jobs/shed-retry.js +1 -1
  288. package/dist/lib/judge-review-runner.js +1 -1
  289. package/dist/lib/llm-client.js +1 -1
  290. package/dist/lib/llm-reply-parsers.js +1 -0
  291. package/dist/lib/manual-tasks.js +1 -1
  292. package/dist/lib/measurement-llm.js +1 -0
  293. package/dist/lib/pi-exec.js +1 -0
  294. package/dist/lib/projects/workspace/eval-workspace.js +1 -1
  295. package/dist/lib/projects/workspace/worktree.js +1 -1
  296. package/dist/lib/refine-cases.js +1 -1
  297. package/dist/lib/research-client.js +1 -1
  298. package/dist/lib/retraction.js +1 -1
  299. package/dist/lib/reviewer-detect.js +1 -1
  300. package/dist/lib/service-environment.js +1 -0
  301. package/dist/lib/setup-steps.js +1 -1
  302. package/dist/lib/telemetry.js +1 -1
  303. package/dist/lib/terminal-target-heartbeat.js +1 -1
  304. package/dist/lib/tool-cli-map.js +1 -0
  305. package/dist/lib/transcript-instruction-linking.js +1 -1
  306. package/dist/lib/transcript-sync.js +1 -1
  307. package/dist/lib/work-report.js +1 -1
  308. package/oclif.manifest.json +7 -1
  309. package/package.json +5 -4
  310. package/dist/chunk-4FSQSETR.js +0 -12
  311. package/dist/chunk-6WQG6C7F.js +0 -1
  312. package/dist/chunk-C42NTI2V.js +0 -3
  313. package/dist/chunk-F6DAHCJC.js +0 -20
  314. package/dist/chunk-GN3ZHQ46.js +0 -1
  315. package/dist/chunk-H3BCWSYO.js +0 -1
  316. package/dist/chunk-HLNHBZLI.js +0 -1
  317. package/dist/chunk-HLQZR4XJ.js +0 -13
  318. package/dist/chunk-J5HW45PZ.js +0 -48
  319. package/dist/chunk-JNFB22FD.js +0 -1
  320. package/dist/chunk-KCOJLTVX.js +0 -1
  321. package/dist/chunk-MLV2RHRE.js +0 -1
  322. package/dist/chunk-N7GK33PU.js +0 -1
  323. package/dist/chunk-NRYLYMDM.js +0 -1
  324. package/dist/chunk-OZNKMJ5B.js +0 -1
  325. package/dist/chunk-PPXOC7IV.js +0 -1
  326. package/dist/chunk-QXPYGN7I.js +0 -1
  327. package/dist/chunk-R4QIPG4V.js +0 -2
  328. package/dist/chunk-RGUCR7T6.js +0 -1
  329. package/dist/chunk-RO3ZZVCG.js +0 -1
  330. package/dist/chunk-SBGXIPRN.js +0 -2
  331. package/dist/chunk-SN3CHV66.js +0 -1
  332. package/dist/chunk-U3XKXJ3A.js +0 -5
  333. package/dist/chunk-UM4CBCXI.js +0 -1
  334. package/dist/chunk-WHQ4BDSM.js +0 -4
  335. package/dist/dist-45KJH5M7.js +0 -1
@@ -1,20 +0,0 @@
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
-
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 _=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
- `)[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
- `).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 _ 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
- `)[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:_}=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
- rm -- "$0"
14
- ${q(e)}
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)}
16
- `:"",u=`#!/bin/zsh
17
- rm -- "$0"
18
- cd ${JSON.stringify(e.projectPath)} || exit
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",_=>{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 +0,0 @@
1
- import{a as m}from"./chunk-U2NT5OSQ.js";import{c as g,e as k}from"./chunk-UPFH72PF.js";import{a as l}from"./chunk-ZLLER3HP.js";import{mkdirSync as E,readdirSync as w,rmSync as S,writeFileSync as h}from"node:fs";import{join as p,relative as b,sep as x}from"node:path";var A="v2-neutral-workspace",I=["CLAUDE.md","CLAUDE.local.md","AGENTS.md"],W=new Set(["node_modules",".git","dist","build",".next","coverage"]);function y(e){let i=[],n=new Set(I),t=l(a=>{let r;try{r=w(a,{withFileTypes:!0})}catch{return}for(let s of r){let o=p(a,s.name);if(s.isDirectory()){if(W.has(s.name)||s.name.startsWith(".")&&s.name!==".claude")continue;t(o)}else n.has(s.name)&&i.push(b(e,o))}},"walk");return t(e),i}l(y,"findAmbientInstructionFiles");function C(e){let i=[];for(let n of y(e))try{S(p(e,n),{force:!0}),i.push(n)}catch{}return i}l(C,"stripAmbientInstructions");function F(e){return/[a-z0-9]/i.test(e??"")?g(e??""):"eval-target-skill"}l(F,"skillSlug");function O(e={}){let{baseDir:i,targetType:n,targetContent:t,targetName:a}=e,r=m(i),s=C(r.workDir),o="none",d,u=[];if(t)switch(n){case"prompt":d=t,o="system_prompt";break;case"skill":{let c=F(a),v=k({dirName:c,content:t});f(r.workDir,p(".claude","skills",c,"SKILL.md"),v.text),o="skill";break}default:f(r.workDir,"CLAUDE.md",t),u.push("CLAUDE.md"),o="claude_md";break}let D=y(r.workDir).filter(c=>!u.includes(c));return{workDir:r.workDir,systemPrompt:d,delivery:o,methodology:A,isWorktree:r.isWorktree,strippedFiles:s,leakedFiles:D,cleanup:r.cleanup}}l(O,"createEvalWorkspace");function f(e,i,n){let t=p(e,i),a=t.slice(0,t.lastIndexOf(x));E(a,{recursive:!0}),h(t,n,"utf8")}l(f,"writeFileInWorkspace");export{A as a,I as b,y as c,F as d,O as e};
@@ -1 +0,0 @@
1
- import{a as Re}from"./chunk-M7QSC64D.js";import{i as Ae}from"./chunk-LTQ5BJYL.js";import{c as we}from"./chunk-G7V4ZZZ3.js";import{a as Pe,b as ye,c as ve,d as ke,e as ee,f as Ce}from"./chunk-6WQG6C7F.js";import{b as ce,i as ue,j as pe,k as de,l as ge,m as me,n as fe}from"./chunk-LB24UKHZ.js";import{d as he,e as be,g as $e}from"./chunk-NRYLYMDM.js";import{d as se,e as Z,f as le}from"./chunk-VBXL7XO7.js";import{e as P,f as K}from"./chunk-APDRR6FS.js";import{a as u}from"./chunk-ZLLER3HP.js";import{createHash as We}from"node:crypto";import{existsSync as Ee,readFileSync as Se,writeFileSync as Ne}from"node:fs";var W=u(a=>We("sha256").update(a).digest("hex"),"sha256"),Ie=1.3,te=4,Le=20;function Fe(a,i){if(!a.configured||i<=0)return te;let t=Math.ceil(a.minPairs*Ie/i);return Math.min(Le,Math.max(te,t))}u(Fe,"passCapFor");function je(a,i=10,t=te){if(a<=0)return{passes:0,expectedPairs:0,feasible:!1,reason:"no live cases"};let l=Math.ceil(i*Ie),e=Math.min(t,Math.ceil(l/a)),r=e*a;return r<i?{passes:e,expectedPairs:r,feasible:!1,reason:`${a} live case(s) x ${t} passes = ${a*t} pairs at best, below the ${i} a controlled verdict requires \u2014 add cases rather than replaying these`}:{passes:e,expectedPairs:r,feasible:!0}}u(je,"planPasses");var Ue=60,qe=u(a=>typeof a=="object"&&a!==null&&typeof a.withScore=="number"&&typeof a.withoutScore=="number","isPair");function Ge(a,i,t){let l=[...a].sort((e,r)=>Date.parse(r.createdAt)-Date.parse(e.createdAt));for(let e of l){if(e.applied)continue;let r=e.gates?.accumulation;if(!r||typeof r!="object"||r.priorContentHash!==i||r.targetPairs!==t||typeof r.candidateContentHash!="string"||!Array.isArray(r.pairs))continue;let o=r.pairs.filter(qe);if(o.length===r.pairs.length&&!(o.length>=t))return{promotionId:e.id,candidateContentHash:r.candidateContentHash,pairs:o,runs:typeof r.runs=="number"?r.runs:1}}return null}u(Ge,"findOpenAccumulation");var Be=5,xe=u(a=>Array.isArray(a)?a.filter(i=>typeof i=="string"):[],"stringList"),j=u(a=>typeof a=="number"&&Number.isFinite(a)?a:null,"finite");function Xe(a,i,t=Be){let l=[...a].filter(o=>o.fromContentHash===i).sort((o,g)=>Date.parse(g.createdAt)-Date.parse(o.createdAt)),e=[],r=new Set;for(let o of l){let g=o.toContentHash??o.id;if(r.has(g))continue;r.add(g);let y=o.verdict??null,S=j(y?.delta),x=j(y?.ci?.lower),H=j(y?.ci?.upper),C=j(y?.nWith),ne=y?.sufficient===!0&&S!=null&&x!=null&&H!=null&&C!=null?{delta:S,ciLower:x,ciUpper:H,nPairs:C}:null;if(e.push({decision:typeof o.decision=="string"?o.decision:"unknown",applied:o.applied===!0,at:typeof o.createdAt=="string"?o.createdAt:"",rationale:typeof o.proposalRationale=="string"?o.proposalRationale:"",touched:xe(o.touchedSections),refusals:xe(o.refusals),measured:ne}),e.length>=t)break}return e}u(Xe,"summarisePriorDecisions");function ze(a,i){let t=i.accumulate??(a.autoEvolveAccumulate===!0||a.autoEvolveAccumulate==="true"),l=i.accumulateTargetPairs??a.autoEvolveAccumulateTarget,e=typeof l=="string"?Number.parseInt(l,10):l,r=typeof e=="number"&&Number.isInteger(e)&&e>0?e:Ue;return{enabled:t,targetPairs:r}}u(ze,"readAccumulateConfig");function Qe(a){let i=a.accumulateEnabled&&a.pairCount<a.targetPairs;return{apply:a.consented&&!i,peeking:i}}u(Qe,"resolveApply");async function it(a,i){let t=u(n=>i?.logger?.info?.(n)??console.log(n),"log"),{evalTargetId:l}=a,e=`[cron_instruction_evolution] ${l}`,r=await P(`/api/eval-targets/${l}`),o=r.metadata??{},g=null,y=!1;if(r.name.startsWith("/")&&Ee(r.name))try{if(g=Se(r.name,"utf8"),g!==r.content){let n=await K(`/api/eval-targets/${l}/sync-content`,{content:g});y=n.synced,t(`${e}: target content drifted from disk by ${Math.abs(g.length-r.content.length)} chars \u2014 synced to disk truth (v${n.version}). Prior verdicts against the old text dissolve via content-hash keying.`),r={...r,content:g,version:n.version}}}catch(n){t(`${e}: disk sync failed (${n instanceof Error?n.message:String(n)}) \u2014 measuring the stored snapshot`)}let S=!1;try{S=(await P("/api/settings/evolution-account")).paused}catch(n){t(`${e}: could not read the account switch (${n instanceof Error?n.message:String(n)}) \u2014 pausing to be safe`),S=!0}if(S)return t(`${e}: PAUSED for the whole account (profiles.evolution_paused) \u2014 no model budget spent.`),{skipped:"paused-account"};if(pe(o))return t(`${e}: PAUSED (metadata.autoEvolvePaused) \u2014 no model budget spent. Opt-in is intact.`),{skipped:"paused"};let x=Re(r);if(x)return t(`${e}: ${x.reason}`),x;let H=a.apply??(o.autoEvolveApply===!0||o.autoEvolveApply==="true"),C=Ve(o);if(C==null){if(H)return t(`${e}: refusing \u2014 metadata.immutableSections is unset. Set it (use [] to explicitly protect nothing) before letting the loop edit this target unattended.`),{skipped:"immutable-sections-unset"};t(`${e}: metadata.immutableSections unset \u2014 measure-only cycle proceeds with [] (nothing protected). Writing still requires setting it explicitly.`),C=[]}let $=(await P(`/api/eval-targets/${l}/evals`)).filter(n=>!n.retiredAt);if($.length===0)return{skipped:"no-live-cases"};let N=ue(o);N.note&&t(`${e}: ${N.note}`);let v=je($.length,N.minPairs,Fe(N,$.length));if(!v.feasible)return t(`${e}: cannot reach a sufficient verdict \u2014 ${v.reason}`),{skipped:"cannot-reach-min-n",reason:v.reason};let He=de({liveCases:$.length,passes:v.passes});t(`${e}: budget for this run \u2014 ${fe(He)}`);let U=await P(`/api/eval-targets/${l}/judge-calibration`);if(!U.powerCheck.adequate){let n=(U.powerCheck.reasons??[]).join("; ");return t(`${e}: not adequately powered, skipping before spending budget \u2014 ${n}`),{skipped:"not-adequate",reason:n}}let re=le,_e=Date.now()-re*24*60*60*1e3,q=await P(`/api/eval-targets/${l}/promotions?limit=200`),ae=q.promotions.filter(n=>n.applied&&Date.parse(n.createdAt)>=_e).length;if(ae>=Z)return t(`${e}: change budget looks exhausted (${ae}/${Z} applied in ${re}d), skipping before spending budget`),{skipped:"budget-exhausted"};try{let n=await P("/api/usage/current-limits"),c=we({limits:n,now:new Date});if(!c.ok)return t(`${e}: deferring before spending budget \u2014 ${c.reason}`),{skipped:"quota-exhausted",reason:c.reason}}catch(n){t(`${e}: quota unknown (${n instanceof Error?n.message:String(n)}) \u2014 proceeding`)}let L=se();if(!L.green)return t(`${e}: A/A canary is RED \u2014 halting. ${L.failures.join(" | ")}`),{skipped:"canary-red",reason:L.failures.join(" | ")};let G=r.content,D=W(G),p=ze(o,a),k=p.enabled?Ge(q.promotions,D,p.targetPairs):null,m,F,w=[],_=0,B=ce,f=k?null:ye(o,D);if(f){m=f.content,F="",B=0;try{w=await ke({evalTargetId:l,candidateContentHash:f.hash})}catch(n){return t(`${e}: could not rebuild banked pairs (${n instanceof Error?n.message:String(n)})`),{skipped:"resume-read-failed",reason:f.hash}}t(`${e}: resuming interrupted cycle \u2014 ${w.length}/${f.plannedPairs} pair(s) rebuilt from eval_runs, no proposal call spent`)}else if(k){let n=await P(`/api/promotions/${k.promotionId}`);if(W(n.toContent)!==k.candidateContentHash)return t(`${e}: stored candidate does not match its recorded hash \u2014 refusing to continue`),{skipped:"accumulation-hash-mismatch",reason:k.promotionId};m=n.toContent,F=n.proposalRationale??"",w=k.pairs,_=k.runs,B=0,t(`${e}: continuing accumulation ${k.promotionId} \u2014 ${w.length}/${p.targetPairs} pair(s) carried from ${_} prior run(s)`)}else{let n=U.caseDiscrimination?.cases??[],c=[];if(r.name.startsWith("/")){let s=r.name.slice(0,r.name.lastIndexOf("/"));try{let b=await P(`/api/insights/evidence?projectPath=${encodeURIComponent(s)}`);b.analyzedAt&&(c=[...b.friction.map(Y=>`Real-session friction (insights, ${b.analyzedAt.slice(0,10)}): ${Y}`),...b.whatWorks.map(Y=>`Working well in real sessions \u2014 do not break: ${Y}`)],c.length>0&&t(`${e}: proposer sees ${b.friction.length} friction + ${b.whatWorks.length} what-works item(s) from insights`))}catch(b){t(`${e}: insights evidence unavailable (${b instanceof Error?b.message:String(b)}) \u2014 proposing without it`)}}let T=[];try{T=Xe(q.promotions,D)}catch(s){t(`${e}: could not summarise prior decisions (${s instanceof Error?s.message:String(s)}) \u2014 proposing without them`)}T.length>0&&t(`${e}: proposer sees ${T.length} prior decision(s) against this exact body (${T.map(s=>`${s.decision}${s.measured?"/measured":""}`).join(", ")})`);let M=await Ae({currentContent:r.content,targetType:r.type,targetName:r.name,immutableSections:C,evidence:{nonDiscriminating:n.filter(s=>!s.discriminating).map(s=>`${s.name??s.assertion??"unnamed"} \u2014 ${s.note}`),weakest:n.filter(s=>s.discriminating&&s.withPassRate<s.withoutPassRate).map(s=>({name:s.name??s.assertion??"unnamed",withPassRate:s.withPassRate,withoutPassRate:s.withoutPassRate})),priorDecisions:T,notes:c}});if(!M.ok)return t(`${e}: no usable proposal \u2014 ${M.reason}`),{skipped:"no-proposal",reason:M.reason};m=M.proposal.candidateContent,F=M.proposal.rationale}let I=f?ve({plannedPairs:f.plannedPairs||v.expectedPairs,carriedPairs:w.length,liveCases:$.length}):v.passes;t(`${e}: measuring ${$.length} case(s) x ${I} pass(es) = up to ${$.length*I} pairs, candidate vs prior version`+(f?` (resumed; ${w.length} pair(s) already banked)`:""));let A=[],X=[],Oe=Date.now(),oe=0,z=0;for(let n=1;n<=I;n++){let c=await $e({cases:$,candidateContent:m,priorVersionContent:G,concurrency:a.concurrency??2,runNumber:n,opts:{targetId:l,targetVersion:r.version??1,iteration:1,timeout:a.timeout??24e4,model:a.model,graderModel:a.graderModel,skipGrading:!1,targetType:r.type,targetName:r.name,candidateContentHash:W(m)},onLog:t});if(A.push(...c.pairs),X.push(...c.results),oe+=c.completed,z+=c.failed,t(`${e}: pass ${n}/${I} \u2014 ${c.pairs.length} pair(s), running total ${A.length}`),c.abortedForQuota){t(`${e}: stopping after pass ${n}/${I} \u2014 ${c.abortedForQuota}. Remaining passes would spend against an exhausted account.`);break}}let R=[...w,...A],O=he(X),Q=A.length>0,d=ge({runs:X,plannedPairs:v.expectedPairs,usablePairs:A.length,verdictPairs:Q?R.length:A.length,proposalCalls:B,passes:I,liveCases:$.length,wallMs:Date.now()-Oe});if(t(`${e}: ${oe} completed, ${z} failed, ${A.length} usable pair(s) \u2014 spent ~${d.modelCalls} model calls (${d.proposalCalls} proposal + ${d.executorCalls} executor + >=${d.graderCalls} grader) in ${(d.wallMs/6e4).toFixed(1)} min`+(Q?`; the ${d.verdictPairs} pair(s) behind this verdict resolve +/-${me(d.mde)} at 80% power`:"")),!Q)return{skipped:O.infrastructureFailed?"infrastructure-failure":"no-pairs",reason:O.infrastructureFailed?`${O.infrastructureFailed} run(s) never executed (${O.summary.describe()}) \u2014 the environment failed, not the target`:`${z} run(s) failed or were ungradeable`,cost:d};let V=be({pairs:R.length,minPairs:10,accounting:O});if(V.kind==="infrastructure-incomplete")return t(`${e}: not posting a verdict \u2014 ${V.reason}`),await ee({evalTargetId:l,meta:o,blob:Ce({content:m,hash:W(m),priorHash:D,plannedPairs:f?.plannedPairs||v.expectedPairs,now:new Date}),log:t,tag:e}),{skipped:"infrastructure-incomplete",reason:V.reason,cost:d};p.enabled&&t(`${e}: accumulated ${R.length}/${p.targetPairs} pair(s) over ${_+1} run(s) on one candidate`);let ie=H,{apply:Te,peeking:Me}=Qe({consented:ie,accumulateEnabled:p.enabled,pairCount:R.length,targetPairs:p.targetPairs});ie&&Me&&t(`${e}: interim readout at ${R.length}/${p.targetPairs} pairs \u2014 recording the decision but not acting until the target is reached`);let h=await K(`/api/eval-targets/${l}/promotions`,{candidateContent:m,proposalSource:"llm",proposalRationale:F,pairs:R,canaryGreen:L.green,measuredAgainstContentHash:D,immutableSections:C,apply:Te,measurementCost:d,...p.enabled?{accumulation:{candidateContentHash:W(m),priorContentHash:D,targetPairs:p.targetPairs,carriedPairs:w.length,runs:_+1}}:{}});t(`${e}: ${h.decision}${h.applied?" (APPLIED)":""} \u2014 ${h.rationale}`+(h.refusals.length>0?` | refusals: ${h.refusals.join("; ")}`:"")),(f||o[Pe])&&await ee({evalTargetId:l,meta:o,blob:null,log:t,tag:e});let J=!1,E;if(h.applied&&r.name.startsWith("/"))try{Ee(r.name)?Se(r.name,"utf8")!==G?E="file changed since measurement started \u2014 refusing to clobber; next cycle re-syncs":(Ne(r.name,m,"utf8"),J=!0):E="file no longer exists on disk",t(J?`${e}: measured improvement written to ${r.name} (undo: git checkout -- ${r.name})`:`${e}: NOT written to disk \u2014 ${E}`)}catch(n){E=n instanceof Error?n.message:String(n),t(`${e}: disk write-back failed \u2014 ${E}. The eval target is updated; the file is not.`)}return{decision:h.decision,applied:h.applied,nPairs:R.length,promotionId:h.id,cost:d,diskSynced:y,...h.applied?{fileWritten:J,...E?{fileWriteSkipped:E}:{}}:{},...p.enabled?{carriedPairs:w.length,accumulationRuns:_+1}:{}}}u(it,"cronInstructionEvolution");function Ve(a){let i=a.immutableSections;return i==null||!Array.isArray(i)?null:i.filter(t=>typeof t=="string")}u(Ve,"readImmutableSections");export{Ie as a,te as b,Le as c,Fe as d,je as e,Ue as f,Ge as g,Be as h,Xe as i,ze as j,Qe as k,it as l,Ve as m};
@@ -1 +0,0 @@
1
- import{d as P}from"./chunk-BZS5QRWB.js";import{c as T,d as k}from"./chunk-SBGXIPRN.js";import{a}from"./chunk-ZLLER3HP.js";import{spawn as M}from"node:child_process";var w=["claude","codex"];function R(t,e=process.env){if(t)return t;let o=e.RULEMETRIC_EVAL_ENGINE?.trim().toLowerCase();if(!o)return"claude";if(w.includes(o))return o;throw new Error(`RULEMETRIC_EVAL_ENGINE="${e.RULEMETRIC_EVAL_ENGINE}" is not a known engine (expected one of: ${w.join(", ")})`)}a(R,"resolveEvalEngine");function L(t,e=process.env){return t?.trim()||e.RULEMETRIC_CODEX_MODEL?.trim()||k().codexConfiguredModel||T}a(L,"resolveCodexEvalModel");function N(t){try{let e=JSON.parse(t),o=e.result??e.content??t,u=e.usage?.total_tokens??(e.usage?.input_tokens??0)+(e.usage?.output_tokens??0),r;if(e.modelUsage&&typeof e.modelUsage=="object"){let s=-1;for(let[l,d]of Object.entries(e.modelUsage)){let n=typeof d?.outputTokens=="number"?d.outputTokens:0;n>s&&(s=n,r=l)}}return{output:o,totalTokens:u,model:r}}catch{return{output:t,totalTokens:0}}}a(N,"parseClaudeJsonOutput");function A(t){let{prompt:e,targetContent:o,systemPrompt:u,model:r}=t,s=["-p",e,"--output-format","json","--settings",JSON.stringify({disableAllHooks:!0})],l=o??u;return l&&s.push("--system-prompt",l),r&&s.push("--model",r),s}a(A,"buildClaudeArgs");function h(t,e,o,u){let r=e.trim()||o.trim()||u.trim()||"(no output on stderr or stdout)";return`Exit code ${t}: ${r.slice(0,1e3)}`}a(h,"describeExitFailure");async function S(t){let{prompt:e,targetContent:o,systemPrompt:u,workDir:r,timeout:s,model:l}=t,d=o??u,n=await P({prompt:e,systemPrompt:d,model:L(l),timeout:s,workDir:r});return{output:n.output,exitCode:n.exitCode,durationMs:n.durationMs,totalTokens:n.usage?.totalTokens??0,model:n.model,engine:"codex",delivery:d?"prompt_prefix":"none",error:n.error}}a(S,"executeCodexArm");async function $(t){let{prompt:e,targetContent:o,systemPrompt:u,workDir:r=process.cwd(),timeout:s=12e4,model:l}=t;if(R(t.engine)==="codex")return S({...t,workDir:r,timeout:s});let d=A({prompt:e,targetContent:o,systemPrompt:u,model:l}),n=o??u?"system_prompt":"none",E=Date.now();return new Promise(g=>{let p={...process.env};delete p.CLAUDECODE,delete p.HTTPS_PROXY;let _=["/opt/homebrew/bin","/usr/local/bin"],f=(p.PATH??"").split(":").filter(Boolean),x=_.filter(i=>!f.includes(i));x.length&&(p.PATH=[...f,...x].join(":"));let c=M("claude",d,{cwd:r,env:p,stdio:["ignore","pipe","pipe"]}),m="",v="";c.stdout.on("data",i=>{m+=i.toString()}),c.stderr.on("data",i=>{v+=i.toString()});let C=setTimeout(()=>{c.kill("SIGTERM"),g({output:m,exitCode:null,durationMs:Date.now()-E,totalTokens:0,engine:"claude",delivery:n,error:`Timed out after ${s}ms`})},s);c.on("close",i=>{clearTimeout(C);let D=Date.now()-E,{output:y,totalTokens:b,model:O}=N(m);g({output:y,exitCode:i,durationMs:D,totalTokens:b,model:O,engine:"claude",delivery:n,error:i!==0?h(i,v,y,m):void 0})}),c.on("error",i=>{clearTimeout(C),g({output:"",exitCode:null,durationMs:Date.now()-E,totalTokens:0,engine:"claude",delivery:n,error:`Failed to spawn claude: ${i.message}`})})})}a($,"executeEval");export{R as a,L as b,N as c,A as d,h as e,$ as f};
@@ -1,13 +0,0 @@
1
- import{a as I}from"./chunk-5RBLIVBF.js";import{a as T,b as P,c as H,d as A}from"./chunk-SJKS3PYX.js";import{a as W}from"./chunk-2EX27VJ3.js";import{a as j,d as O}from"./chunk-3UKZJAFS.js";import{c as U}from"./chunk-4COLIGD7.js";import{b as x,d as L,f as S}from"./chunk-U3XKXJ3A.js";import{e as _,f as J,h as d}from"./chunk-APDRR6FS.js";import{a as z,b as F}from"./chunk-J5HW45PZ.js";import{a as f}from"./chunk-ZLLER3HP.js";var B=f((l,{limit:a,sort:n,eventTypes:s})=>_(`/api/sessions/${l}/events?limit=${a}&sort=${n}&eventType=${encodeURIComponent(s.join(","))}&hasContent=true`),"fetchTranscriptTurns");async function is(l,a){let{mirrorId:n,projectPath:s,projectId:r,config:g}=l,t=f(e=>a.logger.info(e),"log");if(g?.sessionId)return Y({mirrorId:n,sessionId:g.sessionId},t);t(`Processing insights job ${n}...`),await d(`/api/insights-jobs/${n}/progress`,{status:"running",progress:{step:"reading_data"}});try{let{repaired:e}=await J("/api/sessions/repair-analyzed-at",{});e>0&&t(` Repaired analyzed_at on ${e} orphan session(s).`)}catch(e){t(` Warning: analyzed_at repair failed: ${e instanceof Error?e.message:String(e)}`)}let p=20,w=200,v=15*6e4,D=3,C=Date.now()+v;if(L()!=="none"){let e=0,o=0;try{for(;e<w&&Date.now()<C;){let c=await _(`/api/sessions?needsFacets=true&graderVersion=${2}&limit=${p}&offset=${o}`);if(c.length===0)break;t(` Generating facets for ${c.length} un-analyzed sessions (drained ${e} so far)...`);for(let $=0;$<c.length&&!(e>=w||Date.now()>=C);$+=D){let R=c.slice($,$+D);await Promise.all(R.map(async m=>{if(!(e>=w||Date.now()>=C))try{let u=await O(q=>B(m.id,q));if(u.turnCount<2){e++,o++;return}let k=await S(A,u.text,4096);k&&typeof k.outcome=="string"?(await d(`/api/sessions/${m.id}/enrich`,{analysis:{source:"generated_facets",...k,graderVersion:2},...m.eventCount!=null?{analyzedEventCount:m.eventCount}:{},analyzedTurnCount:u.turnCount}),t(` Generated facets for session ${m.id} (${m.tool}, ${u.turnCount} turns)`)):o++,e++}catch(u){t(` Failed to generate facets for session ${m.id}: ${u instanceof Error?u.message:String(u)}`),e++,o++}}))}if(c.length<p)break}}catch(c){t(` Warning: facet generation failed after ${e} sessions: ${c instanceof Error?c.message:String(c)}`)}if(e>0){let c=Date.now()>=C?`time budget (${Math.round(v/6e4)}m)`:e>=w?`hard cap (${w})`:"queue empty";t(` Facet drain stopped on ${c} after ${e} session(s); the rest resume next run.`)}}let b=await K(s,r);if(!b)throw new I("No session data found \u2014 ensure sessions are captured and enriched.");t(` Found ${b.stats.sessions} sessions, generating recommendations...`);let E=await Z(s,t);E&&t(` Generator memory: ${E.split(`
2
- `).length} lines of prior-advice context`);let i={},y=[],h=P.length+1;for(let e=0;e<P.length;e++){let o=P[e];t(` [${e+1}/${h}] Generating ${o.name}...`);try{await d(`/api/insights-jobs/${n}/progress`,{status:"running",progress:{step:o.name,current:e+1,total:h,partial:{...i}}})}catch(u){t(` Warning: progress update failed for ${o.name}: ${u instanceof Error?u.message:String(u)}`)}t(` Running LLM prompt for ${o.name}...`);let c=o.usesGeneratorMemory&&E?`${b.summary}
3
- ${E}`:b.summary,$=Date.now(),R=await S(o.prompt,c,o.maxTokens,{timeoutMs:o.timeoutMs}),m=Date.now()-$;R?(i[o.name]=R,t(` Got result for ${o.name} (${Math.round(m/1e3)}s)`)):(y.push(o.name),t(` No result for ${o.name} after ${Math.round(m/1e3)}s (budget ${Math.round((o.timeoutMs??12e4)/1e3)}s) \u2014 section DROPPED`))}t(` [${h}/${h}] Generating at_a_glance...`),await d(`/api/insights-jobs/${n}/progress`,{status:"running",progress:{step:"at_a_glance",current:h,total:h,partial:{...i}}});let V=[b.summary,i.what_works?`
4
- ## What Works
5
- ${JSON.stringify(i.what_works)}`:"",i.friction_analysis?`
6
- ## Friction
7
- ${JSON.stringify(i.friction_analysis)}`:"",i.suggestions?`
8
- ## Suggestions
9
- ${JSON.stringify(i.suggestions)}`:"",i.on_the_horizon?`
10
- ## On the Horizon
11
- ${JSON.stringify(i.on_the_horizon)}`:""].join(`
12
- `),G=await S(H,V,8192);G&&(i.at_a_glance=G),t(" Uploading results..."),t(` Done! Recommendations generated for job ${n}`),F(i),z(i);let N={recommendations:i,...y.length>0?{sectionsFailed:y}:{}};return y.length>0&&t(` \u26A0 ${y.length} section(s) produced nothing: ${y.join(", ")}`),await d(`/api/insights-jobs/${n}/state`,{result:N}).catch(e=>{t(`result persist failed: ${e instanceof Error?e.message:String(e)}`)}),await W(i,s,t),N}f(is,"processInsights");async function Y(l,a){let{mirrorId:n,sessionId:s}=l;a(`Analyzing session ${s} via tool CLI...`),await d(`/api/insights-jobs/${n}/progress`,{status:"running",progress:{step:"fetching_session"}});let r=await _(`/api/sessions/${s}`);if(r.analysis&&r.analysis.source==="session_analysis")return a(` Session ${s} already analyzed \u2014 skipping (idempotency guard)`),{sessionId:s,skipped:!0,reason:"already_analyzed"};let g=await O(p=>B(s,p));if(g.turnCount<2)throw new I("Session has too few conversation turns to analyze");await d(`/api/insights-jobs/${n}/progress`,{status:"running",progress:{step:"running_analysis",tool:r.tool}});let t=await x(r.tool,A,g.text);if(!t)throw new Error(`Analysis failed \u2014 ${r.tool} CLI returned no result`);return await d(`/api/sessions/${s}/enrich`,{analysis:{source:"session_analysis",tool:r.tool,...t,graderVersion:2},...r.eventCount!=null?{analyzedEventCount:r.eventCount}:{},analyzedTurnCount:g.turnCount}),a(` Session ${s} analyzed via ${r.tool}`),{sessionId:s,tool:r.tool,facets:t}}f(Y,"processSessionAnalysisInline");async function Z(l,a,n=_,s=U){let{asks:r,omitted:g}=s(l);try{let t=await n(`/api/insights/recommendations/history?projectPath=${encodeURIComponent(l??"")}`);return!t||!Array.isArray(t.dismissed)||!Array.isArray(t.repeated)?T({dismissed:[],repeated:[],installed:r,installedOmitted:g}):T({...t,installed:r,installedOmitted:g})}catch(t){return a(` Warning: generator memory unavailable (${t instanceof Error?t.message:String(t)}) \u2014 generating without it`),T({dismissed:[],repeated:[],installed:r,installedOmitted:g})}}f(Z,"fetchGeneratorMemory");async function K(l,a){try{let n=new URLSearchParams;a?n.set("projectId",a):l&&n.set("projectPath",l);let s=await _(`/api/insights/compute?${n}`);if(!s||s.total_sessions===0)return null;let r=Object.entries(s.tool_counts??{}).sort((t,p)=>p[1]-t[1]).slice(0,10).map(([t,p])=>`${t}: ${p}`).join(", ");return{summary:[`Sessions: ${s.total_sessions}, Messages: ${s.total_messages}, Session-hours: ${Math.round(s.total_duration_hours)} (sum of per-session spans across ${s.sessions_with_meta} measured sessions; concurrent sessions counted separately, so this exceeds elapsed time)`,`Top tools: ${r}`,s.goal_categories&&Object.keys(s.goal_categories).length>0?`Goals: ${JSON.stringify(s.goal_categories)}`:"",s.friction&&Object.keys(s.friction).length>0?`Friction: ${JSON.stringify(s.friction)}`:"",s.outcomes&&Object.keys(s.outcomes).length>0?`Outcomes: ${JSON.stringify(s.outcomes)}`:"",s.projects&&Object.keys(s.projects).length>0?`Projects: ${JSON.stringify(s.projects)}`:""].filter(Boolean).join(`
13
- `),stats:{sessions:s.total_sessions,totalMessages:s.total_messages,totalSessionHours:s.total_duration_hours,measuredSessions:s.sessions_with_meta,toolCounts:s.tool_counts,goalCounts:s.goal_categories,frictionCounts:s.friction}}}catch(n){throw new M(n instanceof Error?n.message:String(n))}}f(K,"buildDataSummaryFromApi");var M=class extends Error{static{f(this,"InsightsSummaryUnavailableError")}constructor(a){super(`Could not read session summary (retryable): ${a}`),this.name="InsightsSummaryUnavailableError"}};export{is as a,Z as b};
@@ -1,48 +0,0 @@
1
- import{a as i}from"./chunk-ZLLER3HP.js";function Z(e){return(e.trim().split(`
2
- `)[0]?.replace(/^#+\s*/,"").trim()||"Suggested instruction").slice(0,120)}i(Z,"recommendationTitle");function Q(e){if(!e||typeof e!="object")return e;let t=e;if(Array.isArray(t.recommendation_candidates))return e;let n=t.suggestions;if(!n||typeof n!="object")return e;let o=n.claude_md_additions;return Array.isArray(o)&&(t.recommendation_candidates=o.flatMap(r=>{if(!r||typeof r!="object")return[];let s=r;if(typeof s.addition!="string"||s.addition.trim()==="")return[];let a=s.addition.trim();return[{title:Z(a),artifact:"instruction",canonicalBody:a,rationale:typeof s.why=="string"?s.why:"",evidence:[],outcomeMetric:"session_outcome",renderings:[{harness:"claude_code",target:"CLAUDE.md",body:a},{harness:"codex",target:"AGENTS.md",body:a}]}]})),e}i(Q,"normalizeRecommendationCandidates");var ee=new Set(["instruction"]);function te(e){if(!e||typeof e!="object")return e;let t=e,n=t.recommendation_candidates;if(!Array.isArray(n)||n.length===0)return e;let o=n.filter(s=>!!s&&typeof s=="object"&&typeof s.canonicalBody=="string"&&s.canonicalBody.trim().length>0);for(let s of o){if(Array.isArray(s.renderings)&&s.renderings.length>0)continue;let a=s.canonicalBody.trim(),c=ee.has(String(s.artifact));s.renderings=c?[{harness:"claude_code",target:"CLAUDE.md",body:a},{harness:"codex",target:"AGENTS.md",body:a}]:[{harness:"claude_code",target:"manual",body:a},{harness:"codex",target:"manual",body:a}]}let r=t.suggestions&&typeof t.suggestions=="object"?t.suggestions:{};return(!Array.isArray(r.claude_md_additions)||r.claude_md_additions.length===0)&&(r.claude_md_additions=o.filter(s=>s.artifact==="instruction").map(s=>({addition:s.canonicalBody.trim(),why:typeof s.rationale=="string"?s.rationale:"",prompt_scaffold:"Add to CLAUDE.md (and AGENTS.md for Codex)."}))),(!Array.isArray(r.features_to_try)||r.features_to_try.length===0)&&(r.features_to_try=o.filter(s=>s.artifact!=="instruction").map(s=>({feature:typeof s.title=="string"?s.title:"Proposed change",one_liner:typeof s.rationale=="string"?s.rationale:"",why_for_you:typeof s.outcomeMetric=="string"?`Aimed at ${s.outcomeMetric}.`:"",example_code:s.canonicalBody.trim()}))),Array.isArray(r.usage_patterns)||(r.usage_patterns=[]),t.suggestions=r,e}i(te,"deriveLegacyPresentation");function ne(e){if(!e||typeof e!="object")return e;let t=e,n=t.project_areas;if(n!==void 0&&!Array.isArray(n)){let o=n&&typeof n=="object"?n.areas:void 0;t.project_areas=Array.isArray(o)?o:void 0}return oe(e),Q(e),e}i(ne,"normalizeRecommendations");function oe(e){if(!e||typeof e!="object")return;let t=e;if(Array.isArray(t.recommendation_candidates)&&t.recommendation_candidates.length>0)return;let n=t.suggestions;if(!n||typeof n!="object")return;let o=n.recommendation_candidates;!Array.isArray(o)||o.length===0||(t.recommendation_candidates=o)}i(oe,"liftNestedCandidates");import{z as d}from"zod";var L=["org","team","project","personal"],I=d.object({name:d.string().min(1),description:d.string().min(1),type:d.literal("instruction").default("instruction"),scope:d.enum(L),version:d.string().min(1),tags:d.array(d.string()).optional(),compatibility:d.array(d.string()).optional(),slots:d.record(d.string(),d.string()).optional(),metadata:d.record(d.string(),d.unknown()).optional()});import{z as p}from"zod";var N=p.object({name:p.string().min(1),description:p.string().min(1),type:p.literal("prompt"),version:p.string().min(1),tags:p.array(p.string()).optional(),variables:p.array(p.string()).optional(),metadata:p.record(p.string(),p.unknown()).optional()});function _(e,t){let n=t.map(o=>`- ID: ${o.id}
3
- Name: ${o.name}
4
- Description: ${o.description}
5
- Tags: ${o.tags.join(", ")}
6
- Preview: ${o.contentPreview}`).join(`
7
-
8
- `);return`You are an expert at matching AI coding instructions to software projects.
9
-
10
- ## Project
11
- - Name: ${e.name}
12
- - Description: ${e.description??"No description"}
13
- - Languages: ${e.languages.join(", ")||"Unknown"}
14
- - Topics: ${e.topics.join(", ")||"None"}
15
- - Dependencies: ${e.dependencies.join(", ")||"None"}
16
-
17
- ## Available Instructions
18
-
19
- ${n}
20
-
21
- ## Task
22
-
23
- Analyze the project and recommend which instructions would be most useful. Consider:
24
- 1. Language and framework alignment
25
- 2. Project purpose and what standards/practices would help
26
- 3. Security, testing, and quality needs based on the project type
27
-
28
- Return your response as JSON in this exact format:
29
- {
30
- "recommendations": [
31
- { "instructionId": "<id>", "score": <0.0-1.0>, "reason": "<one sentence explanation>" }
32
- ]
33
- }
34
-
35
- Only include instructions with a relevance score >= ${.5}. Order by score descending. Return valid JSON only, no markdown fences.`}i(_,"buildRecommendationPrompt");var P=32e3,re={name:"x".repeat(64),description:"x".repeat(256),languages:["TypeScript","Python","Go"],topics:["x".repeat(32)],dependencies:["x".repeat(32)]};function D(e,t={}){if(e.length===0)return[];let n=t.charBudget??P,o=_(re,[]).length,r=[],s=[],a=0;for(let c of e){let l=se(c);s.length>0&&o+a+l>n&&(r.push(s),s=[],a=0),s.push(c),a+=l}return s.length>0&&r.push(s),r}i(D,"batchCandidatesForPrompt");function se(e){return`- ID: ${e.id}
36
- Name: ${e.name}
37
- Description: ${e.description}
38
- Tags: ${e.tags.join(", ")}
39
- Preview: ${e.contentPreview}`.length+2}i(se,"renderedSize");var j=["Added","Changed","Fixed","Removed","Deprecated","Security"],ie=/^##\s+\[([^\]]+)\](?:\s*[-–]\s*(\d{4}-\d{2}-\d{2}))?\s*$/,ae=/^###\s+(.+?)\s*$/,ce=/^[-*]\s+(.*\S)\s*$/,le=/^ {2,}(\S.*)$/;function ue(e){let t=e.split(/\r?\n/),n=[],o=null,r=null,s=null;for(let a of t){let c=a.match(ie);if(c){o&&n.push(o);let m=c[1].trim();o={version:m,date:c[2]??null,unreleased:m.toLowerCase()==="unreleased",sections:{}},r=null,s=null;continue}if(!o)continue;let l=a.match(ae);if(l){let m=l[1].trim();j.includes(m)?(r=m,o.sections[r]||(o.sections[r]=[]),s=o.sections[r]):(r=null,s=null);continue}if(!r||!s)continue;let u=a.match(ce);if(u){s.push(u[1]);continue}let f=a.match(le);if(f&&s.length>0){s[s.length-1]+=" "+f[1].trim();continue}}return o&&n.push(o),{entries:n}}i(ue,"parseChangelog");function me(e){return e.entries.filter(t=>t.unreleased?!1:Object.values(t.sections).some(n=>n&&n.length>0))}i(me,"announceableEntries");function E(e){let t=/^(#{1,6})\s+/.exec(e);return t?t[1].length:0}i(E,"headingLevel");function $(e){return e.replace(/^#{1,6}\s+/,"").replace(/[`*_~]/g,"").trim().toLowerCase()}i($,"normaliseHeading");function de(e,t){let n=$(t);if(n.length===0)return{content:e,removed:!1,removedText:null,reason:"not-found"};let o=e.split(`
40
- `),r=[];for(let m=0;m<o.length;m+=1)E(o[m])>0&&$(o[m])===n&&r.push(m);if(r.length===0)return{content:e,removed:!1,removedText:null,reason:"not-found"};if(r.length>1)return{content:e,removed:!1,removedText:null,reason:"ambiguous"};let s=r[0],a=E(o[s]),c=o.length;for(let m=s+1;m<o.length;m+=1){let S=E(o[m]);if(S>0&&S<=a){c=m;break}}let l=o.slice(s,c).join(`
41
- `),u=[...o.slice(0,s),...o.slice(c)];return u.join("").trim().length===0?{content:e,removed:!1,removedText:null,reason:"would-empty-file"}:{content:u.join(`
42
- `).replace(/\n{3,}/g,`
43
-
44
- `),removed:!0,removedText:l}}i(de,"removeMarkdownSection");function pe(e,t){let n=t.trim();if(n.length===0)return{content:e,removed:!1,removedText:null,reason:"not-found"};let o=e.indexOf(n);if(o===-1)return{content:e,removed:!1,removedText:null,reason:"not-found"};if(e.indexOf(n,o+1)!==-1)return{content:e,removed:!1,removedText:null,reason:"ambiguous"};let r=(e.slice(0,o)+e.slice(o+n.length)).replace(/\n{3,}/g,`
45
-
46
- `);return r.trim().length===0?{content:e,removed:!1,removedText:null,reason:"would-empty-file"}:{content:r,removed:!0,removedText:n}}i(pe,"removeExactBlock");var M=["HTTPS_PROXY","HTTP_PROXY","NODE_EXTRA_CA_CERTS"];function fe(e,t){if(!e||typeof e!="object")return{value:e,removed:!1,removedDescriptions:[],reason:"not-found"};let n=structuredClone(e);if(!n.hooks)return{value:n,removed:!1,removedDescriptions:[],reason:"not-found"};let o=[];for(let[r,s]of Object.entries(n.hooks)){if(!Array.isArray(s))continue;let a=s.filter(c=>{let l=(c.hooks??[]).some(u=>typeof u.command=="string"&&u.command.includes(t));return l&&o.push(`${r}: ${c.matcher??"*"} \u2192 ${(c.hooks??[]).map(u=>u.command).join(", ")}`),!l});a.length===0?delete n.hooks[r]:n.hooks[r]=a}return Object.keys(n.hooks).length===0&&delete n.hooks,{value:n,removed:o.length>0,removedDescriptions:o,...o.length===0?{reason:"not-found"}:{}}}i(fe,"removeHookByCommand");function he(e,t){if(!e||typeof e!="object")return{value:e,removed:!1,removedDescriptions:[],reason:"not-found"};let n=structuredClone(e);return!n.mcpServers||!(t in n.mcpServers)?{value:n,removed:!1,removedDescriptions:[],reason:"not-found"}:(delete n.mcpServers[t],Object.keys(n.mcpServers).length===0&&delete n.mcpServers,{value:n,removed:!0,removedDescriptions:[`mcpServers.${t}`]})}i(he,"removeMcpServer");function v(e){if(!e||typeof e!="object")return[];let t=e.env;return t?M.filter(n=>n in t):[]}i(v,"protectedEnvKeysPresent");function ge(e,t){let n=v(e),o=new Set(v(t));return n.filter(r=>!o.has(r))}i(ge,"lostProtectedEnvKeys");function ye(e,t){let n=`HTTP ${e}`;if(!t||typeof t!="object")return{message:n};let o=t,r=typeof o.error=="string"&&o.error?o.error:o.error?JSON.stringify(o.error):n,s=typeof o.code=="string"&&o.code?o.code:void 0;return s?{message:r,code:s}:{message:r}}i(ye,"parseApiError");var T=["inside","outside"];function y(e){return e.trim().toLowerCase()}i(y,"normalizeDependencyKey");function xe(e){let t=[];if(T.includes(e.boundaryClass)||t.push({field:"boundaryClass",message:`must be one of ${T.join(" | ")}`}),!Array.isArray(e.targets)||e.targets.length===0)t.push({field:"targets",message:"a proposal that cannot name the paths it writes cannot be applied"});else{for(let r of e.targets)if(typeof r!="string"||r.trim().length===0){t.push({field:"targets",message:"target paths must be non-empty"});break}let n=e.targets.filter(r=>typeof r=="string"&&(r.startsWith("/")||/^[A-Za-z]:[\\/]/.test(r)));n.length>0&&t.push({field:"targets",message:`targets must be project-relative (absolute: ${n.join(", ")})`});let o=e.targets.filter(r=>typeof r=="string"&&r.split(/[\\/]/).includes(".."));o.length>0&&t.push({field:"targets",message:`targets must not traverse outside the project (${o.join(", ")})`})}for(let n of["requires","provides"]){let o=e[n];if(!Array.isArray(o)){t.push({field:n,message:"must be an array of dependency keys"});continue}o.some(r=>typeof r!="string"||r.trim().length===0)&&t.push({field:n,message:"dependency keys must be non-empty strings"})}return t}i(xe,"validateArtifactSpec");function _e(e,t){let n=[],o=new Set(e.targets??[]);if(t.kind==="delete-paths"){e.boundaryClass!=="inside"&&n.push({field:"inverse",message:"deleting paths is only an inverse for `inside` artifacts; an `outside` path may hold text we did not write"}),t.paths.length===0&&n.push({field:"inverse.paths",message:"nothing to delete \u2014 this is not an inverse"});let r=t.paths.filter(s=>!o.has(s));return r.length>0&&n.push({field:"inverse.paths",message:`would delete paths the spec never declared: ${r.join(", ")}`}),n}return e.boundaryClass!=="outside"&&n.push({field:"inverse",message:"a compensation is only an inverse for `outside` artifacts; an `inside` path owes an exact undo"}),(!t.backupPath||t.backupPath.trim().length===0)&&n.push({field:"inverse.backupPath",message:"an `outside` write owes a backup"}),(!t.hashAtWrite||t.hashAtWrite.trim().length===0)&&n.push({field:"inverse.hashAtWrite",message:"without the post-write hash the undo cannot tell a drifted file from an untouched one"}),o.has(t.file)||n.push({field:"inverse.file",message:`wrote ${t.file}, which the spec did not declare as a target`}),t.kind==="remove-marked-region"?(!t.startMarker||!t.endMarker)&&n.push({field:"inverse",message:"an `outside` region needs both markers, or the undo cannot tell where our text ends"}):t.command.trim().length===0&&n.push({field:"inverse.command",message:"the exact command written is the identity of the entry; without it the undo is a search"}),n}i(_e,"validateArtifactInverse");var B="artifact";function A(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&t.trim().length>0):[]}i(A,"stringArray");function Se(e){if(!e||typeof e!="object")return null;let t=e[B];if(!t||typeof t!="object")return null;let n=t;return{boundaryClass:n.boundaryClass,targets:A(n.targets),requires:A(n.requires),provides:A(n.provides)}}i(Se,"parseArtifactSpec");var Ee=["applied","measuring","improved","inconclusive","harmful","rollback_ready"];function H(e){return e.appliedAt?e.appliedAt instanceof Date?e.appliedAt.getTime():new Date(e.appliedAt).getTime():0}i(H,"appliedAtMs");function ve(e){return[...e].sort((t,n)=>{let o=H(n)-H(t);return o!==0?o:(n.applySeq??0)-(t.applySeq??0)})}i(ve,"orderForReversal");var z=["SessionStart","SessionEnd","UserPromptSubmit","PreToolUse","PostToolUse","PreCompact","Notification","Stop","SubagentStop"],b=".claude/settings.local.json";function F(e){return`# rm-artifact:${e}`}i(F,"hookTag");function Ae(e,t){return`${e.trim()} ${F(t)}`}i(Ae,"taggedHookCommand");var Te=new Set(["if","then","else","elif","fi","for","while","until","do","done","case","esac","function","return","exit","cd","echo","test","true","false"]);function k(e){let t=e.trim().split(/\s+/)[0]??"";return!/^[a-z][a-z0-9_-]*$/.test(t)||Te.has(t)?null:y(`cmd:${t}`)}i(k,"inferredCommandRequirement");function be(e,t){let n=new Set((t?.requires??[]).map(y).filter(Boolean)),o=k(e.command);return o&&n.add(o),{boundaryClass:"outside",targets:[b],requires:[...n],provides:(t?.provides??[]).map(y).filter(Boolean)}}i(be,"hookArtifactSpec");function x(e){let t=[];z.includes(e.event)||t.push({field:"event",message:`unknown hook event ${JSON.stringify(e.event)} \u2014 a hook on an event that never fires is indistinguishable from one that was never installed`});let n=(e.command??"").trim();return n.length===0?t.push({field:"command",message:"a hook with no command installs nothing"}):(/[\r\n]/.test(n)&&t.push({field:"command",message:"multi-line commands are refused: the identity tag is a trailing shell comment, which would silence only the final line, and a human reviewing an install should read one line"}),n.includes("\0")&&t.push({field:"command",message:"command contains a NUL byte"}),n.includes("rulemetric")&&t.push({field:"command",message:'refused: `rulemetric hooks uninstall` deletes every hook whose command contains "rulemetric", so installing one here would make this hook collateral damage of an unrelated command'}),n.includes("rm-artifact:")&&t.push({field:"command",message:"command already carries an artifact tag \u2014 installing it would produce two identities for one entry"})),e.matcher!==void 0&&(typeof e.matcher!="string"||e.matcher.trim().length===0)&&t.push({field:"matcher",message:"matcher must be a non-empty string when present"}),t}i(x,"validateHookSpec");function ke(e){let t=[`runs on: ${e.event}${e.matcher?` (tools matching ${e.matcher})`:""}`,`spawns: ${e.command.trim()}`,`writes: ${b} (one entry, tagged with this artifact's id)`],n=k(e.command);return n&&t.push(`needs: ${n} on PATH`),t}i(ke,"describeHookCapability");var W="hook";function h(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}i(h,"asRecord");function U(e){let t=e.event,n=e.command;if(typeof t!="string"||typeof n!="string")return null;let o=typeof e.matcher=="string"?e.matcher:void 0;return{event:t,matcher:o,command:n}}i(U,"readBareSpec");function K(e){let t=h(e.hooks)??e,n=[];for(let[o,r]of Object.entries(t))if(Array.isArray(r))for(let s of r){let a=h(s);if(!a)continue;let c=typeof a.matcher=="string"&&a.matcher.length>0?a.matcher:void 0,l=Array.isArray(a.hooks)?a.hooks:[];for(let u of l){let f=h(u)?.command;typeof f=="string"&&n.push({event:o,matcher:c,command:f})}}return n.length===0?{spec:null,problems:[]}:n.length>1?{spec:null,problems:[{field:"hook",message:`proposal describes ${n.length} hook entries; one proposal installs exactly one hook, so its inverse stays exact and its review stays readable`}]}:{spec:n[0],problems:[]}}i(K,"readSettingsFragment");function Ce(e){let t=[],n=/```[a-zA-Z]*\n([\s\S]*?)```/g,o;for(;(o=n.exec(e))!==null;)t.push(o[1]);return t}i(Ce,"fencedBlocks");function Oe(e){let t=h(h(e.frontmatter)?.artifact),n=t?h(t[W]):null;if(n){let o=U(n);if(o)return{spec:o,problems:x(o),source:"envelope"};let r=K(n);if(r.spec)return{spec:r.spec,problems:x(r.spec),source:"envelope"};if(r.problems.length>0)return{spec:null,problems:r.problems,source:"envelope"}}for(let o of Ce(e.content??"")){let r;try{r=JSON.parse(o)}catch{continue}let s=h(r);if(!s)continue;let a=U(s);if(a)return{spec:a,problems:x(a),source:"content-fragment"};let c=K(s);if(c.spec)return{spec:c.spec,problems:x(c.spec),source:"content-fragment"};if(c.problems.length>0)return{spec:null,problems:c.problems,source:"content-fragment"}}return{spec:null,problems:[{field:"hook",message:"no hook spec found \u2014 a hook proposal must carry {event, command} in its artifact envelope or a JSON settings fragment in its body"}],source:"none"}}i(Oe,"parseHookSpec");var Y="claude-haiku-4-5",G=[{task:"rm-batch-task",instructions:"rm-batch-task/inject.md",class:"proven",axis:"reward",measured:"2026-09-02 n=25/arm Haiku 4.5: 0/25 \u2192 25/25, delta +1.000, 95% CI [+0.734, +1.000]"},{task:"rm-locality-task",instructions:"rm-locality-task/inject.md",class:"proven",axis:"cost",measured:"2026-09-02 n=25/arm Haiku 4.5: 25/25 both arms, cost \u221225.6%/trial, 95% CI [\u22120.0171, \u22120.0107]"},{task:"rm-migrations-task",instructions:"rm-migrations-task/inject.md",class:"negative",axis:"reward",measured:"2026-08-31 Haiku 4.5: flat after two reworks \u2014 redundant with the model's priors on this shape"},{task:"rm-pagination-task",instructions:"rm-pagination-task/inject.md",class:"negative",axis:"reward",measured:"2026-09-02 n=25/arm Haiku 4.5: 25/25 baseline under --allowedTools Bash; the rule costs +8.0%/trial and buys nothing"}];function Re(e){return G.filter(t=>t.class===e)}i(Re,"harborTasksOfClass");function we(e,t){return{task:e.task,instructions:e.instructions,class:e.class,axis:e.axis,model:Y,nTrials:25,lane:t}}i(we,"harborPayloadFor");var Le=/[\p{L}\p{N}]+/gu;function C(e){let t=new Set;for(let n of e.toLowerCase().matchAll(Le)){let o=` ${n[0]} `;for(let r=0;r+3<=o.length;r+=1)t.add(o.slice(r,r+3))}return t}i(C,"trigrams");function g(e,t){let n=C(e),o=C(t);if(n.size===0||o.size===0)return 0;let r=0,[s,a]=n.size<=o.size?[n,o]:[o,n];for(let l of s)a.has(l)&&(r+=1);let c=n.size+o.size-r;return c===0?0:r/c}i(g,"trigramSimilarity");var R=.3,Ie=15;function O(e){let n=e.replace(/<!--[\s\S]*?-->/g," ").replace(/```[\s\S]*?```/g," "),o=[];for(let r of n.split(`
47
- `)){let s=r.trim();if(s.length===0||s.startsWith("#"))continue;let a=s.replace(/^(?:[-*+]|\d+[.)])\s+/,"").trim();if(a.length!==0)for(let c of a.split(/(?<=[.!?])\s+(?=[A-Z(`"'*])/)){let l=c.trim();l.length>=Ie&&o.push(l)}}return o}i(O,"splitDirectives");function q(e,t,n=R){let o=O(e);if(o.length===0)return{redundant:!1,coverage:0,matches:[],novel:[]};let r=t.flatMap(c=>O(c.content).map(l=>({text:l,id:c.id,source:c.source}))),s=[],a=[];for(let c of o){let l=null;for(let u of r){let f=g(c,u.text);f<n||(l===null||f>l.similarity)&&(l={directive:c,matchedDirective:u.text,matchedId:u.id,matchedSource:u.source,similarity:f})}l?s.push(l):a.push(c)}return{redundant:a.length===0,coverage:s.length/o.length,matches:s,novel:a}}i(q,"assessRedundancy");function Ne(e,t=R){let n=[];for(let o=0;o<e.length;o+=1){let r=q(e[o].content,e.slice(0,o),t);r.matches.length>0&&n.push({instruction:e[o],verdict:r})}return n}i(Ne,"findInternalRedundancy");var V=.5,Pe=/-(?=[0-9a-f]{6}$)[0-9a-f]*[0-9][0-9a-f]*$/;function w(e){return e.trim().toLowerCase().replace(/^skills--/,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(Pe,"").replace(/-+$/,"")}i(w,"skillNameStem");function De(e,t,n=V){let o=w(e.name);for(let s of t)if(o.length>0&&w(s.name)===o)return{name:s.name,similarity:g(e.content,s.content),reason:"name-stem"};let r=null;for(let s of t){let a=g(e.content,s.content);a<n||(r===null||a>r.similarity)&&(r={name:s.name,similarity:a,reason:"body"})}return r}i(De,"assessSkillDuplication");var je=new Set(["sh","bash","zsh","fish"]),$e=new Set(["mjs","cjs","js","ts","py","rb","pl"]),Me=/(?:^|[\s(`'"])(?:sudo\s+)?(?:node|npx|pnpm|npm|yarn|bun|deno|tsx|ts-node|vitest|jest|python3?|python|ruby|perl|bash|sh|zsh|exec|run|dlx)\s+(?:[-\w=@./]+\s+)*$/,He=/(?:\.\/)?(?:[\w.@-]+\/)+[\w.@-]+\.\w+/g;function Be(e){return e.replace(/```[\w-]*\n?/g," ").replace(/`/g," ")}i(Be,"stripCodeMarkers");function Ue(e){let t=e.trim();return t=t.replace(/[.,;:)\]]+$/,""),t.startsWith("./")&&(t=t.slice(2)),t.length===0||t.startsWith("/")||t.startsWith("~")||t.startsWith("..")||/[<>{}*?]/.test(t)?null:t}i(Ue,"normalise");function X(e){let t=Be(e),n=new Set,o=[];for(let r of t.matchAll(He)){let s=r[0],a=r.index??0,c=t.slice(Math.max(0,a-1),a);if(c.length>0&&!/[\s(['"=]/.test(c))continue;let l=Ue(s);if(!l)continue;let u=l.slice(l.lastIndexOf(".")+1).toLowerCase();(je.has(u)||$e.has(u)&&(s.startsWith("./")||Me.test(t.slice(t.lastIndexOf(`
48
- `,Math.max(0,a-1))+1,a))))&&(n.has(l)||(n.add(l),o.push({reference:s,path:l})))}return o}i(X,"extractCommandReferences");function Ke(e,t){return X(e).filter(n=>!t(n.path))}i(Ke,"findUnresolvableReferences");import Ut from"gray-matter";import{z as J}from"zod";var Wt=J.object({type:J.enum(["instruction","prompt"])});export{te as a,ne as b,_ as c,D as d,ue as e,me as f,de as g,pe as h,fe as i,he as j,ge as k,ye as l,y as m,xe as n,_e as o,Se as p,Ee as q,ve as r,b as s,F as t,Ae as u,be as v,ke as w,Oe as x,Re as y,we as z,O as A,q as B,Ne as C,De as D,Ke as E};
@@ -1 +0,0 @@
1
- import{a as T}from"./chunk-5RBLIVBF.js";import{a as S}from"./chunk-VXUKXGRX.js";import{b as A}from"./chunk-RK663O4M.js";import{e as x}from"./chunk-GN3ZHQ46.js";import{a as C}from"./chunk-WH3IPXXQ.js";import{f as M}from"./chunk-HLNHBZLI.js";import{e as k,f as E,h as p}from"./chunk-APDRR6FS.js";import{a as w}from"./chunk-ZLLER3HP.js";async function W(v,f){let{mirrorId:i,evalTargetId:g,config:o}=v,a=w(e=>f.logger.info(e),"log"),s=await k(`/api/eval-targets/${g}`),$=await k(`/api/eval-targets/${g}/evals`);if($.length===0&&o.generateIfEmpty){a("No eval cases on target \u2014 generating from content via local LLM...");let e=await A({content:s.content,name:s.name});if(e===null)throw new Error("Case generation requires an LLM backend (claude CLI on PATH or ANTHROPIC_API_KEY) \u2014 none available on this worker.");let n=[];for(let t of e)n.push(await E(`/api/eval-targets/${g}/evals`,t));$=n,a(`Generated ${n.length} eval case(s)`)}if($.length===0)throw new T("No evals defined for target");let G=o.runsPerEval??1,R=o.timeout??12e4,j=o.iteration??1,y=new Set;if(f.job.attempts>1)for(let n=0;;n+=100){let t=await k(`/api/eval-targets/${g}/runs?jobId=${i}&limit=100&offset=${n}`);for(let r of t)y.add(`${r.evalId}|${r.configuration}|${r.runNumber}|${r.iteration}`);if(t.length<100)break}let _=[{name:"with_target",content:s.content}];o.skipBaseline||_.push({name:"without_target"});let d=[];for(let e of $)for(let n of _)for(let t=1;t<=G;t++)y.has(`${e.id}|${n.name}|${t}|${j}`)||d.push({eval_:e,configuration:n.name,targetContent:n.content,runNumber:t});y.size>0&&a(`Resuming attempt ${f.job.attempts}: ${y.size} run(s) already persisted, ${d.length} remaining`);let l=d.length,u=0,m=Math.min(o.parallel??1,4);await p(`/api/eval-jobs/${i}/progress`,{status:"running",progress:{total:l,completed:0,current:null,message:`Starting ${l} eval runs (concurrency: ${m})...`}});let b=[];async function I(e){let n=`${e.configuration} \xB7 ${e.eval_.name} \xB7 run#${e.runNumber}`;a(`[${u+1}/${l}] ${n}`);let t=x({targetType:s.type,targetContent:e.targetContent,targetName:s.name});t.leakedFiles.length&&a(`\u26A0 CONTAMINATED ${n}: ${t.leakedFiles.join(", ")} survived the strip`);try{let r=await M({prompt:e.eval_.prompt,targetContent:t.systemPrompt,workDir:t.workDir,timeout:R,model:o.model}),c={};return!o.skipGrading&&e.eval_.expectations.length>0&&!r.error&&(c=await C({prompt:e.eval_.prompt,output:r.output,expectations:e.eval_.expectations,model:o.graderModel??o.model,timeout:R})),{jobId:i,evalId:e.eval_.id,evalTargetId:s.id,evalTargetVersion:s.version,configuration:e.configuration,runNumber:e.runNumber,iteration:j,status:r.error?"failed":"completed",outputs:{...r.error?{error:r.error}:{transcript:r.output,...r.model?{model:r.model}:{}},methodology:t.methodology,delivery:t.delivery,isolated:t.isWorktree,...t.leakedFiles.length?{leakedFiles:t.leakedFiles}:{}},timing:{duration_ms:r.durationMs,total_tokens:r.totalTokens},grading:c,worktree:t.isWorktree?!0:void 0}}finally{t.cleanup()}}if(w(I,"processItem"),m<=1)for(let e of d){let n=`${e.configuration} \xB7 ${e.eval_.name} \xB7 run#${e.runNumber}`;await p(`/api/eval-jobs/${i}/progress`,{status:"running",progress:{total:l,completed:u,current:n,message:`Executing ${n}...`}});let t=await I(e);await E("/api/eval-runs",t),b.push(t),u++,await p(`/api/eval-jobs/${i}/progress`,{status:"running",progress:{total:l,completed:u,current:n,message:`Completed ${n}`}})}else{a(`Running ${l} evals with concurrency=${m} (worktree isolation)`);for(let e=0;e<d.length;e+=m){let n=d.slice(e,e+m),t=`batch ${Math.floor(e/m)+1}/${Math.ceil(d.length/m)}`;await p(`/api/eval-jobs/${i}/progress`,{status:"running",progress:{total:l,completed:u,current:t,message:`Executing ${t} (${n.length} parallel)...`}});let r=await Promise.all(n.map(I));for(let c of r)await E("/api/eval-runs",c),b.push(c),u++;await p(`/api/eval-jobs/${i}/progress`,{status:"running",progress:{total:l,completed:u,current:t,message:`Completed ${t}`}})}}let P=J(b),h;if(!o.skipGrading&&b.some(e=>e.grading&&Object.keys(e.grading).length>0))try{a(`Running meta-judge for job ${i}...`);let e=$.map(n=>{let r=b.filter(c=>c.evalId===n.id&&c.configuration==="with_target")[0];return{evalName:n.name,prompt:n.prompt,expectations:n.expectations,grading:r?.grading?r.grading:null,output:r?.outputs?.transcript?.slice(0,500)}});h=await S({targetName:s.name,evalResults:e,model:o.graderModel??o.model,timeout:6e4}),a(`Meta-judge: quality=${h.quality_score}/5, issues=${h.issues.length}`)}catch(e){a(`Meta-judge failed (non-fatal): ${e instanceof Error?e.message:String(e)}`)}let N=h?{...P,meta_judgement:h}:P;return a(`Job ${i} completed: ${u}/${l} runs`),await p(`/api/eval-jobs/${i}/state`,{result:N}).catch(e=>{a(`result persist failed: ${e instanceof Error?e.message:String(e)}`)}),N}w(W,"processEval");function J(v){let f=v.filter(a=>a.status==="completed"),i=v.filter(a=>a.status==="failed"),g=f.filter(a=>{let s=a.grading;return s&&Object.keys(s).length>0}),o=g.length>0?g.reduce((a,s)=>a+(s.grading?.summary?.pass_rate??0),0)/g.length:null;return{total:v.length,completed:f.length,failed:i.length,avgPassRate:o}}w(J,"buildSummary");export{W as a};
@@ -1 +0,0 @@
1
- import{e as k}from"./chunk-GN3ZHQ46.js";import{a as f}from"./chunk-KGURGIZ2.js";import{a as $}from"./chunk-WH3IPXXQ.js";import{f as v}from"./chunk-HLNHBZLI.js";import{f as p}from"./chunk-APDRR6FS.js";import{a as c}from"./chunk-ZLLER3HP.js";async function x(m,t,s=()=>{}){let{eval_:r,configuration:i,targetContent:g,runNumber:o}=m;s(`[${i}] ${r.name} run#${o} \u2014 executing...`);let a=k({targetType:t.targetType,targetContent:g,targetName:t.targetName}),d={methodology:a.methodology,delivery:a.delivery,isolated:a.isWorktree,...t.candidateContentHash?{candidateContentHash:t.candidateContentHash}:{},...a.leakedFiles.length?{leakedFiles:a.leakedFiles}:{}};a.isWorktree||s(`[${i}] ${r.name} run#${o} \u2014 \u26A0 no git worktree; running without repo context`),a.leakedFiles.length&&s(`[${i}] ${r.name} run#${o} \u2014 \u26A0 CONTAMINATED: ${a.leakedFiles.join(", ")} survived the strip`);try{let n=await v({prompt:r.prompt,targetContent:a.systemPrompt,workDir:a.workDir,timeout:t.timeout,model:t.model});if(n.error){let e=f(n.error);return s(`[${i}] ${r.name} run#${o} \u2014 FAILED (${e.kind}): ${n.error}`),{evalId:r.id,evalTargetId:t.targetId,evalTargetVersion:t.targetVersion,configuration:i,runNumber:o,iteration:t.iteration,status:"failed",outputs:{error:n.error,failureKind:e.kind,failureClass:e.class,...d},timing:{duration_ms:n.durationMs,total_tokens:n.totalTokens},grading:{},failure:e}}s(`[${i}] ${r.name} run#${o} \u2014 completed in ${(n.durationMs/1e3).toFixed(1)}s`);let u={};if(!t.skipGrading&&r.expectations.length>0){s(`[${i}] ${r.name} run#${o} \u2014 grading...`);let e=await $({prompt:r.prompt,output:n.output,expectations:r.expectations,model:t.graderModel??t.model,timeout:t.timeout});u=e,s(`[${i}] ${r.name} run#${o} \u2014 grading done: pass_rate=${e.summary.pass_rate==null?"n/a (all assertions errored)":`${(e.summary.pass_rate*100).toFixed(0)}%`}`)}return{evalId:r.id,evalTargetId:t.targetId,evalTargetVersion:t.targetVersion,configuration:i,runNumber:o,iteration:t.iteration,status:"completed",outputs:{transcript:n.output,...d},timing:{duration_ms:n.durationMs,total_tokens:n.totalTokens,total_duration_seconds:n.durationMs/1e3},grading:u}}finally{a.cleanup()}}c(x,"executeAndGradeCase");async function R(m){let{cases:t,targetContent:s,concurrency:r,runNumber:i,opts:g,skipBaseline:o,onLog:a=c(()=>{},"onLog")}=m,d=o?["with_target"]:["with_target","without_target"],n=[];for(let e of t)for(let l of d)n.push({eval_:e,configuration:l,targetContent:l==="with_target"?s:void 0,runNumber:i});let u=[];for(let e=0;e<n.length;e+=Math.max(1,r)){let l=n.slice(e,e+Math.max(1,r)),h=await Promise.all(l.map(b=>x(b,g,a)));u.push(...h)}for(let e of u)try{await p("/api/eval-runs",e)}catch(l){a(` \u26A0 failed to post a run result: ${l instanceof Error?l.message:String(l)}`)}try{await p(`/api/eval-targets/${g.targetId}/label-state`,{})}catch(e){a(` \u26A0 label-state notification skipped: ${e instanceof Error?e.message:String(e)}`)}return{completed:u.filter(e=>e.status==="completed").length,failed:u.filter(e=>e.status==="failed").length,results:u}}c(R,"runBatchAndPost");export{x as a,R as b};
@@ -1 +0,0 @@
1
- import{b as S,c as B,f as s,g as R,i as b}from"./chunk-QFKUSNUB.js";import{c as ne}from"./chunk-4N43IBXH.js";import{b as re}from"./chunk-IEQDLURA.js";import{d as te,e as oe,f as se}from"./chunk-KINIFUZQ.js";import{a as q}from"./chunk-VIQ25ORK.js";import{b as $}from"./chunk-6ZPSVZNH.js";import{a as K}from"./chunk-RGUCR7T6.js";import{a as Y}from"./chunk-WY3VVX3R.js";import{a as O}from"./chunk-ZYGBABMZ.js";import{a as U}from"./chunk-U7TBEC3I.js";import{e as D}from"./chunk-Y7QIOPN5.js";import{b as G}from"./chunk-DUBBL57L.js";import{c as C}from"./chunk-WHQ4BDSM.js";import{a as F}from"./chunk-3MDEGOUG.js";import{a as W}from"./chunk-JNFB22FD.js";import{a as J}from"./chunk-HLQZR4XJ.js";import{b as V}from"./chunk-5RBLIVBF.js";import{a as X}from"./chunk-SN3CHV66.js";import{a as Z}from"./chunk-6W2GSV4O.js";import{a as x}from"./chunk-JWFRI32Y.js";import{a as j}from"./chunk-25Q3Y7TC.js";import{a as Q}from"./chunk-MNQPCNGQ.js";import{a as P}from"./chunk-PZS55PW2.js";import{a as ee}from"./chunk-WQX4RRBQ.js";import{a as z}from"./chunk-WOJ733IB.js";import{b as N}from"./chunk-UM4CBCXI.js";import{l as L}from"./chunk-H3BCWSYO.js";import{d as T}from"./chunk-SBGXIPRN.js";import{b as H,e as M,f as y}from"./chunk-APDRR6FS.js";import{a as i}from"./chunk-ZLLER3HP.js";var A=null,h=null,ce={process_eval:W,process_insights:J,process_launch:$,process_send_message:O,process_conversation:F,process_session_goal:U,distill_memories:G,memory_ab:K,process_run_cleanup:Y,cron_refine_cases:j,cron_retire_unused_skills:ee,cron_reconcile_attribution:x,cron_suggest_instructions:D,cron_refresh_skills:P,cron_refresh_pricing:Q,cron_eval_autorun:X,cron_auto_accept_suggestions:z,cron_instruction_training:Z,cron_instruction_evolution:L,process_judge_review:q,harbor_ab:C},ae=Object.keys(ce),me=new Set([]);function pe(e=process.env){return e.DATABASE_URL?ae:ae.filter(r=>!me.has(r))}i(pe,"availableCapabilities");var ge=3e4,_e=3e4,fe=3e4,ie=500,le=1e4,ve=`thin-agent-${process.pid}`,I=null;function ke(e,r,t,u){let m;try{let l=T();m={claude:l.claudeBin!=null,codex:l.codexBin!=null,codexModel:l.codexConfiguredModel}}catch{}let p;try{p=N()}catch{}let g=i(l=>y("/api/workers/heartbeat",{workerType:"cli-worker",clientName:ve,clientVersion:u,workerVersion:"0.1.0",currentJobId:null,inFlightCount:0,lastError:null,status:l,metadata:{capabilities:e,mode:"thin-agent",llmEngines:m,harborReady:p,machine:A?.summary()}}).then(d=>{let c=d?.advisory;c&&c.message!==I?(I=c.message,s(t,{event:"worker_advisory",code:c.code,message:c.message})):c||(I=null)}).catch(d=>{s(t,{event:"presence_heartbeat_error",error:d instanceof Error?d.message:String(d)})}),"send");g("alive");let f=setInterval(()=>g("alive"),fe),a=null,n=i(()=>a||(clearInterval(f),a=Promise.race([g("shutting_down"),new Promise(l=>setTimeout(l,2e3).unref())]),a),"sayGoodbye");return r.addEventListener("abort",()=>{n()},{once:!0}),{shutdown:n}}i(ke,"startPresenceHeartbeat");async function we(e,r){let t=`capabilities=${encodeURIComponent(e.join(","))}&waitMs=${r}`,u=await M(`/api/work/next?${t}`);return u==null||typeof u=="string"?null:u}i(we,"pollForWork");function be(e,r){return{logger:{info:i(t=>r(t),"info"),warn:i(t=>r(t),"warn"),error:i(t=>r(t),"error")},job:{attempts:e}}}i(be,"makeHelpers");async function he(e,r,t,u){let m=ce[e.kind],p=Date.now();if(s(t,{event:"claim",jobId:e.id,kind:e.kind,attempts:e.attempts}),!m){let n=`unknown kind: ${e.kind}`;s(t,{event:"fail",jobId:e.id,kind:e.kind,terminal:!0,error:n}),await y(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:n,terminal:!0}).catch(()=>{});return}let g=i(()=>{s(t,{event:"heartbeat",jobId:e.id}),b(`/api/work/${e.id}/heartbeat`,{leaseToken:e.leaseToken},{budgetMs:Math.min(B,Math.max(0,r-1e3)),signal:u,log:t,event:"heartbeat",jobId:e.id}).then(n=>{n.ok||s(t,{event:"heartbeat_error",jobId:e.id,attempts:n.attempts,error:n.error instanceof Error?n.error.message:String(n.error)})})},"beat"),f=setInterval(g,r);h={jobId:e.id,beat:g};let a;try{let n=be(e.attempts,t);a={kind:"complete",result:await m(e.payload,n)??{}}}catch(n){let l=A?.pausesSince(p)??[],d=se(l),c=n instanceof Error?n.message:String(n),v=V(n),o=!v&&oe(l);a={kind:"fail",message:d?`${d}; ${c}`:c,pausedDuringJob:!!d,terminal:v,hostSuspended:o}}try{if(a.kind==="complete"){s(t,{event:"complete",jobId:e.id,kind:e.kind,durationMs:Date.now()-p});let n=await b(`/api/work/${e.id}/complete`,{leaseToken:e.leaseToken,result:a.result},{budgetMs:S,signal:u,log:t,event:"complete_post",jobId:e.id});n.ok||s(t,{event:"complete_post_error",jobId:e.id,kind:e.kind,attempts:n.attempts,error:n.error instanceof Error?n.error.message:String(n.error)})}else{s(t,{event:"fail",jobId:e.id,kind:e.kind,durationMs:Date.now()-p,terminal:a.terminal,error:a.message,...a.pausedDuringJob?{pausedDuringJob:!0}:{},...a.hostSuspended?{hostSuspended:!0}:{}});let n=await b(`/api/work/${e.id}/fail`,{leaseToken:e.leaseToken,error:a.message,terminal:a.terminal,hostSuspended:a.hostSuspended},{budgetMs:S,signal:u,log:t,event:"fail_post",jobId:e.id});n.ok||s(t,{event:"fail_post_error",jobId:e.id,attempts:n.attempts,error:n.error instanceof Error?n.error.message:String(n.error)})}}finally{clearInterval(f),h=null}}i(he,"runOne");var de=new Set(["process_eval","process_conversation","process_insights","process_session_goal","distill_memories","memory_ab","cron_suggest_instructions","cron_eval_autorun","cron_instruction_evolution","process_judge_review","harbor_ab"]);async function Ze(e){let r=e.log??(()=>{}),t=e.pollWaitMs??ge,u=e.heartbeatIntervalMs??_e,m=e.capabilities??pe();s(r,{event:"agent_start",capabilities:m,pollWaitMs:t,heartbeatIntervalMs:u});try{let o=re();o.removed.length>0&&s(r,{event:"eval_worktrees_swept",removed:o.removed.length})}catch(o){s(r,{event:"eval_worktree_sweep_failed",error:o instanceof Error?o.message:String(o)})}A=te({signal:e.signal,onPause:i(o=>{s(r,{event:"machine_pause",...o,jobId:h?.jobId??null}),h?.beat()},"onPause")});let p=ke(m,e.signal,r,e.version);ne({signal:e.signal,log:r}).catch(o=>{s(r,{event:"tt_heartbeat_fatal",error:o instanceof Error?o.message:String(o)})});let g=5*6e4,f=0,a=i(()=>{if(!e.readInstalledVersion||!e.version)return!1;let o=Date.now();if(o-f<g)return!1;f=o;let w=e.readInstalledVersion();return!!(w&&w!==e.version)},"versionDrifted"),n=new AbortController,l=n.signal;e.signal.aborted?n.abort():e.signal.addEventListener("abort",()=>n.abort(),{once:!0});let d=i(async(o,w)=>{let _=ie;for(;!l.aborted;){if(a()){s(r,{event:"agent_version_drift",bootVersion:e.version,installedVersion:e.readInstalledVersion?.()??null}),n.abort(),e.onVersionDrift?.();break}let E=null;try{E=await we([...w],t)}catch(k){let ue=k instanceof H?k.statusCode:void 0;if(s(r,{event:"poll_error",lane:o,status:ue,error:k instanceof Error?k.message:String(k)}),!await R(_,l))break;_=Math.min(_*2,le);continue}if(!E){if(s(r,{event:"poll_204",lane:o}),!await R(_,l))break;_=Math.min(_*2,le);continue}_=ie,await he(E,u,r,l)}},"runLane"),c=m.filter(o=>de.has(o)),v=m.filter(o=>!de.has(o));c.length>0&&v.length>0?(s(r,{event:"agent_lanes",heavy:c.length,fast:v.length}),await Promise.all([d("heavy",c),d("fast",v)])):await d("single",m),await p.shutdown(),s(r,{event:"agent_stop"})}i(Ze,"runAgentLoop");export{ce as a,ae as b,pe as c,we as d,Ze as e};
@@ -1 +0,0 @@
1
- import{c as i}from"./chunk-C42NTI2V.js";import{a as r}from"./chunk-ZLLER3HP.js";var c={codex:"codex"},l=class{constructor(t){this.deps=t}static{r(this,"TranscriptInstructionLinker")}lastPosted=new Map;async emit(t){let o=c[t.tool];if(!o)return"unsupported-tool";if(!t.projectPath)return"no-project-path";let a=this.deps.buildSnapshot??i,s;try{s=a(t.projectPath,o)}catch{return"failed"}if(!s)return"no-instruction-files";if(this.lastPosted.get(t.sessionId)===s.request_hash)return"unchanged";try{await this.deps.postSnapshot(t.sessionId,s),await this.deps.linkInstructions(t.sessionId)}catch(e){return this.deps.log?.(`instruction linking failed for ${t.sessionId}: ${e instanceof Error?e.message:String(e)}`),"failed"}return this.lastPosted.set(t.sessionId,s.request_hash),this.deps.log?.(`linked ${s.context_items.length} ${o} instruction file(s) for ${t.sessionId}`),"linked"}};function d(n){if(typeof n!="object"||n===null)return null;let t=n.id;return typeof t=="string"&&t.length>0?t:null}r(d,"sessionIdFromImportResult");export{c as a,l as b,d as c};
@@ -1 +0,0 @@
1
- import{a as E}from"./chunk-KCOJLTVX.js";import{b as R,c as x}from"./chunk-KGURGIZ2.js";import{f as F}from"./chunk-APDRR6FS.js";import{a as s}from"./chunk-ZLLER3HP.js";var A="with_candidate",$="with_prior_version";function k(n){let t=n.filter(e=>e.configuration===A),r=[];for(let e of t){let u=n.find(o=>o.configuration===$&&o.evalId===e.evalId&&o.runNumber===e.runNumber);if(!u)continue;let l=h(e),f=h(u);l==null||f==null||r.push({withScore:l,withoutScore:f})}return r}s(k,"pairCandidateRuns");function h(n){return n.status!=="completed"?null:n.grading?.summary?.pass_rate??null}s(h,"evidenceOf");function P(n){let t=[],r=0;for(let e of n){if(e.status==="failed"){t.push(e.failure??{kind:"unknown",class:"infrastructure"});continue}h(e)==null&&(r+=1)}return{infrastructureFailed:t.length,ungradeable:r,summary:R(t)}}s(P,"accountForFailures");function Q(n){let{pairs:t,minPairs:r,accounting:e}=n;return t>=r?{kind:"proceed"}:e.infrastructureFailed<=0?{kind:"proceed"}:{kind:"infrastructure-incomplete",reason:`${t}/${r} pair(s) \u2014 ${e.infrastructureFailed} run(s) never executed (${e.summary.describe()}). Retry when the environment recovers; this is not a statement about the target.`}}s(Q,"attributeShortfall");function w(n,t,r,e){let u=[];for(let l of n)u.push({eval_:l,configuration:A,targetContent:t,runNumber:e}),u.push({eval_:l,configuration:$,targetContent:r,runNumber:e});return u}s(w,"buildCandidateQueue");async function N(n){let{cases:t,candidateContent:r,priorVersionContent:e,concurrency:u,runNumber:l,opts:f,onLog:o=s(()=>{},"onLog")}=n,p=w(t,r,e,l),i=[],b=Math.max(1,u),g=null;for(let a=0;a<p.length;a+=b){let d=p.slice(a,a+b);i.push(...await Promise.all(d.map(c=>E(c,f,o))));let y=i.find(c=>c.failure&&x(c.failure.kind));if(y?.failure){g=y.failure.kind;let c=p.length-i.length;o(` \u26D4 aborting batch \u2014 ${g}: the account is out of quota. Skipped ${c} remaining run(s) that would certainly have failed.`);break}}for(let a of i)try{await F("/api/eval-runs",a)}catch(d){o(` \u26A0 failed to post a run result: ${d instanceof Error?d.message:String(d)}`)}let C=k(i),m=P(i),v=t.length-C.length;if(v>0){let a=m.infrastructureFailed?` \u2014 ${m.infrastructureFailed} run(s) never executed (${m.summary.describe()})`:"";o(` \u26A0 ${v}/${t.length} case(s) produced no usable pair (failed or ungradeable arm)${a}`)}return{completed:i.filter(a=>a.status==="completed").length,failed:i.filter(a=>a.status==="failed").length,results:i,pairs:C,accounting:m,abortedForQuota:g}}s(N,"runCandidateBatchAndPost");export{A as a,$ as b,k as c,P as d,Q as e,w as f,N as g};
@@ -1 +0,0 @@
1
- import{a as l}from"./chunk-ZLLER3HP.js";import d from"node:fs";import a from"node:path";var T={claude_code:"CLAUDE.md",codex:"AGENTS.md",copilot:a.join(".github","copilot-instructions.md")},u=["claude_code","codex","copilot"];function p(t){return u.includes(t)}l(p,"isTool");function I(t){if(t===void 0)return null;let n=t.trim();if(!n||n.toLowerCase()==="auto")return null;let e=[];for(let c of n.split(",")){let o=c.trim().toLowerCase().replace(/-/g,"_"),r=o==="claude"||o==="claudecode"?"claude_code":o==="copilot_agent"||o==="vscode_copilot"?"copilot":o;p(r)?e.includes(r)||e.push(r):console.warn(`[instructions] RULEMETRIC_INSTRUCTION_TARGETS: ignoring unknown tool "${c.trim()}" (known: ${u.join(", ")})`)}return e.length>0?e:null}l(I,"parseInstructionTargetsEnv");function _(t,n={}){let e=n.env??process.env,c=n.tools??I(e.RULEMETRIC_INSTRUCTION_TARGETS),o=l(i=>{let s=a.join(t,T[i]);return{tool:i,path:s,existed:d.existsSync(s)}},"target");if(c)return c.map(o);let r=[o("claude_code")];for(let i of u){if(i==="claude_code")continue;let s=o(i);s.existed&&r.push(s)}return r}l(_,"resolveInstructionTargets");export{T as a,u as b,I as c,_ as d};
@@ -1 +0,0 @@
1
- import{a as l}from"./chunk-ZLLER3HP.js";var _=25;function $(e,s,r=1.959964){let n=1+r*r/s,c=(e+r*r/(2*s))/n,d=r*Math.sqrt(e*(1-e)/s+r*r/(4*s*s))/n;return[c-d,c+d]}l($,"wilson");function x(e,s,r,n){let[c,d]=$(e,s),[u,i]=$(r,n);return[u-d,i-c]}l(x,"newcombe");var w=l(e=>`${e>=0?"+":""}${e.toFixed(3)}`,"fmt"),f=l(e=>`${e.passes}/${e.n}`,"counts");function N(e){let s=e.provenance;if(s&&!s.comparable)return{decision:"incomparable",reason:`the two arms were not the same harness, so this is not an A/B of the rule: ${s.reasons.join("; ")}. Nothing here is evidence about the instruction \u2014 re-run both arms on one harness before reading anything into the numbers.`,reward:{delta:null,ci:null}};let r=v(e);return s?.pooled_across.length?{...r,reason:`${r.reason} [pooled across ${s.pooled_across.join(", ")} by explicit --allow-cross]`}:r}l(N,"judgeSweep");function v(e){let s=e.minN??25,{baseline:r,with:n}=e;if(r.passes==null||n.passes==null||r.n===0||n.n===0)return{decision:"unmeasured",reason:`no reward recorded for the ${[r.passes==null||r.n===0?"baseline":null,n.passes==null||n.n===0?"with-arm":null].filter(Boolean).join(" and ")} arm \u2014 nothing to decide on; check the job dir for a harness error before reading this as a result`,reward:{delta:null,ci:null}};let c=r.passes/r.n,d=n.passes/n.n,u=d-c,i=x(c,r.n,d,n.n),b=i[0]>0||i[1]<0,m=r.n<s||n.n<s,a=`baseline ${f(r)} \u2192 with ${f(n)}, delta ${w(u)}, 95% CI [${w(i[0])}, ${w(i[1])}]`,t={delta:u,ci:i},p=m?` (n=${r.n}/${n.n}, below the ${s}/arm floor)`:"";if(e.taskClass==="proven"&&e.axis==="reward")return i[0]>0?{decision:"holds",reason:`still discriminates: ${a}`,reward:t}:m?{decision:"undecided",reason:`interval does not exclude zero${p}: ${a}`,reward:t}:{decision:"regression",reason:`a PROVEN discriminator went flat: ${a}. At this depth a flat result is a real change \u2014 the rule, the model, or the harness (the last observed cause was a harness permission change nobody thought was under test). Do not pool this run with earlier ones.`,reward:t};if(e.taskClass==="proven"&&e.axis==="cost"){let o=e.cost;if(!o)return{decision:"unmeasured",reason:`no per-trial cost measured \u2014 a cost task with no cost telemetry is UNKNOWN, not $0 (${a})`,reward:t};let h=`cost ${o.delta_pct==null?"n/a":`${o.delta_pct>=0?"+":""}${o.delta_pct.toFixed(1)}%`}/trial, 95% CI [${o.ci_usd[0].toFixed(4)}, ${o.ci_usd[1].toFixed(4)}] USD`;return o.decision==="cheaper"&&!o.reward.regressed?{decision:"holds",reason:`still cheaper at equal reward: ${h}; reward ${a}`,reward:t}:o.decision==="undecided"&&m?{decision:"undecided",reason:`cost interval spans zero${p}: ${h}`,reward:t}:o.reward.regressed?{decision:"regression",reason:`the with-arm solved LESS (${a}) \u2014 a cheaper arm that solves less is not a saving; ${h}`,reward:t}:{decision:"regression",reason:`a PROVEN cost saving did not reproduce: ${h} (decision ${o.decision}); reward ${a}`,reward:t}}let g=e.cost?.decision==="cheaper"&&!e.cost.reward.regressed;return b||g?{decision:"now_discriminates",reason:`a task measured as a NEGATIVE started discriminating \u2014 ${b?`reward now discriminates: ${a}`:`cost now discriminates at equal reward: ${e.cost.delta_pct?.toFixed(1)}%/trial`}. Re-measure by hand before moving it to the proven set; the 08-31 scorecard was wrong once already.`,reward:t}:m?{decision:"undecided",reason:`flat, but${p}: ${a}`,reward:t}:{decision:"flat",reason:`still flat, as measured: ${a}`,reward:t}}l(v,"judgeMeasured");export{_ as a,$ as b,x as c,N as d};
@@ -1 +0,0 @@
1
- import{a as r}from"./chunk-ZLLER3HP.js";import{readFile as b,stat as w}from"node:fs/promises";import{homedir as F}from"node:os";import{isAbsolute as y,join as f,resolve as v,sep as S}from"node:path";var u="capture.json",R={codex:{section:"codex",label:"Codex capture",envFlag:"RULEMETRIC_CODEX_CAPTURE",envRoots:"RULEMETRIC_CODEX_ROOTS"},hooks:{section:"hooks",label:"Hook capture",envFlag:"RULEMETRIC_HOOKS_CAPTURE",envRoots:"RULEMETRIC_HOOKS_ROOTS"}};function P(e,o){return e==="~"?o:e.startsWith("~/")?f(o,e.slice(2)):e}r(P,"expandTilde");function x(e,o){return e.map(t=>typeof t=="string"?t.trim():"").filter(Boolean).map(t=>P(t,o)).filter(t=>y(t)).map(t=>v(t))}r(x,"normaliseRoots");function h(e){return{mode:"off",roots:[],source:"config",error:e}}r(h,"failClosed");async function E(e,o){let t=o.env??process.env,s=o.home??F(),n=t[e.envFlag]?.trim().toLowerCase();if(n==="off"||n==="none"||n==="0")return{mode:"off",roots:[],source:"env"};if(n==="all"||n==="1")return{mode:"all",roots:[],source:"env"};let i=t[e.envRoots]?.trim();if(i){let m=x(i.split(","),s);return m.length>0?{mode:"allowlist",roots:m,source:"env"}:{mode:"off",roots:[],source:"env",error:`${e.envRoots} had no absolute paths`}}let l=f(o.configDir,u),c;try{c=await b(l,"utf8")}catch{return{mode:"all",roots:[],source:"default"}}let p;try{p=JSON.parse(c)}catch{return h(`${u} is present but is not valid JSON \u2014 ${e.label} is OFF until it parses.`)}let a=p?.[e.section];if(!a||typeof a!="object")return{mode:"all",roots:[],source:"default"};let d=typeof a.mode=="string"?a.mode.trim().toLowerCase():void 0;if(d==="off")return{mode:"off",roots:[],source:"config"};if(d==="all")return{mode:"all",roots:[],source:"config"};let g=Array.isArray(a.roots)?a.roots:[];if(d===void 0&&g.length===0)return{mode:"all",roots:[],source:"default"};let C=x(g,s);return C.length===0?h(`${u} selects an allowlist but lists no roots (absolute paths required) \u2014 ${e.label} is OFF.`):{mode:"allowlist",roots:C,source:"config"}}r(E,"loadSectionScope");async function $(e){return E(R.codex,e)}r($,"loadCodexCaptureScope");async function N(e){return E(R.hooks,e)}r(N,"loadHooksCaptureScope");function D(e,o){if(e.mode==="off")return!1;if(e.mode==="all")return!0;if(!o)return!1;let t=v(o);return e.roots.some(s=>t===s||t.startsWith(s.endsWith(S)?s:s+S))}r(D,"isPathInScope");function O(e,o){if(e.error)return`OFF \u2014 ${e.error}`;switch(e.mode){case"off":return`off (${e.source}) \u2014 ${o}`;case"allowlist":return`scoped to ${e.roots.length} path${e.roots.length===1?"":"s"} (${e.source})`;default:return"all projects (unscoped)"}}r(O,"describeCaptureScope");function I(e){return O(e,"no Codex transcripts are swept")}r(I,"describeCodexCaptureScope");function M(e){return O(e,"no hook-captured sessions are uploaded")}r(M,"describeHooksCaptureScope");function A(e){let o=null,t=null;return async()=>{let s=f(e.configDir,u),n;try{let c=await w(s);n=`${c.mtimeMs}:${c.size}`}catch{n="absent"}if(o&&t===n)return o;let i=await $(e),l=o===null||o.mode!==i.mode||o.error!==i.error||o.roots.join("\0")!==i.roots.join("\0");return o=i,t=n,l&&e.onChange?.(i),i}}r(A,"createCodexScopeWatcher");export{u as a,$ as b,N as c,D as d,O as e,I as f,M as g,A as h};
@@ -1,2 +0,0 @@
1
- import{c as h}from"./chunk-N7GK33PU.js";import{d as g}from"./chunk-QXPYGN7I.js";import{a}from"./chunk-ZLLER3HP.js";import{createHash as P}from"node:crypto";import{mkdir as x,open as M,readFile as v,readdir as C,rename as b,stat as I,writeFile as _}from"node:fs/promises";import{homedir as $}from"node:os";import{basename as A,dirname as F,join as f}from"node:path";var k=3e4,z=5,E=8*1024*1024;function S(n){return P("sha256").update(`${n.externalSessionId}:${Math.round(n.mtimeMs)}:${n.size}`).digest("hex")}a(S,"fingerprint");async function O(n){try{return{fingerprints:JSON.parse(await v(n,"utf8")).fingerprints??{}}}catch{return{fingerprints:{}}}}a(O,"readState");async function j(n,i){let s=`${n}.${process.pid}.tmp`;await x(F(n),{recursive:!0}),await _(s,JSON.stringify(i)),await b(s,n)}a(j,"persistState");var y=class{constructor(i){this.options=i}static{a(this,"TranscriptSync")}lastSeenSize=new Map;lastSyncAt=new Map;inFlight=!1;async scan(){if(this.inFlight)return{discovered:0,imported:0,skipped:0};this.inFlight=!0;try{let i=await O(this.options.statePath),s=(await Promise.all(this.options.providers.map(t=>t.discover()))).flat().sort((t,p)=>p.mtimeMs-t.mtimeMs),r=Date.now(),e=[],o=0;for(let t of s){let p=S(t),d=this.lastSeenSize.get(t.path);if(this.lastSeenSize.set(t.path,t.size),i.fingerprints[t.path]===p){o++;continue}let m=this.options.minStableAgeMs??3e3;if(m>0&&r-t.mtimeMs<m){o++;continue}let u=d!==void 0&&d===t.size,l=this.lastSyncAt.get(t.path),T=l===void 0||r-l>=(this.options.activeResyncMs??k);if(!u&&!T){o++;continue}if(e.push(t),e.length>=(this.options.maxImportsPerScan??z))break}let c=0;for(let t of e){let p=S(t);if(t.size>(this.options.maxContentBytes??E)){i.fingerprints[t.path]=p,o++,this.options.log?.(`Transcript sync skipped oversized file: ${t.path}`);continue}let d=await v(t.path,"utf8"),m=await this.options.importTranscript({content:d,tool:t.tool});if(i.fingerprints[t.path]=p,this.lastSyncAt.set(t.path,Date.now()),c++,this.options.log?.(`Transcript sync imported ${t.tool} ${A(t.path)} (${t.externalSessionId}).`),this.options.emitInstructions){let u=h(m);if(u)try{await this.options.emitInstructions({sessionId:u,projectPath:t.projectPath,tool:t.tool})}catch(l){this.options.log?.(`Transcript sync instruction linking failed for ${t.externalSessionId}: ${l instanceof Error?l.message:String(l)}`)}}}return e.length>0&&await j(this.options.statePath,i),{discovered:s.length,imported:c,skipped:o}}finally{this.inFlight=!1}}};async function D(n){let i;try{i=await M(n,"r");let s=Buffer.alloc(64*1024),{bytesRead:r}=await i.read(s,0,s.length,0),e=s.subarray(0,r).toString("utf8").split(`
2
- `)[0];return e?JSON.parse(e):null}catch{return null}finally{await i?.close()}}a(D,"readFirstJsonLine");async function w(n,i,s){let r=await C(n,{withFileTypes:!0}).catch(()=>[]);for(let e of r){let o=f(n,e.name);if(e.isDirectory()){await w(o,i,s);continue}if(!e.isFile()||!e.name.startsWith("rollout-")||!e.name.endsWith(".jsonl"))continue;let[c,t]=await Promise.all([I(o).catch(()=>null),D(o)]);if(!c||c.mtimeMs<s||t?.type!=="session_meta")continue;let p=t.payload?.originator,d=t.payload?.id??t.payload?.session_id;!p?.toLowerCase().startsWith("codex")||!d||i.push({path:o,tool:"codex",externalSessionId:d,projectPath:t.payload?.cwd??null,mtimeMs:c.mtimeMs,size:c.size})}}a(w,"walkCodexSessions");function W(n=process.env.CODEX_HOME??f($(),".codex"),i=14,s){return{name:"codex",async discover(){let r=typeof s=="function"?await s():s;if(r.mode==="off")return[];let e=[],o=Date.now()-Math.max(1,i)*24*60*60*1e3;return await w(f(n,"sessions"),e,o),r.mode==="all"?e:e.filter(c=>g(r,c.projectPath))}}}a(W,"createCodexTranscriptProvider");function X(n,i){let s=a(async()=>{try{let e=await n.scan();e.imported>0&&i.log?.(`Transcript sync imported/updated ${e.imported} session${e.imported===1?"":"s"}.`)}catch(e){i.log?.(`Transcript sync failed: ${e instanceof Error?e.message:String(e)}`)}},"run"),r=setInterval(()=>void s(),i.intervalMs??3e4);i.signal.addEventListener("abort",()=>clearInterval(r),{once:!0}),s()}a(X,"startTranscriptSync");export{y as a,W as b,X as c};
@@ -1 +0,0 @@
1
- import{a as h}from"./chunk-WH3IPXXQ.js";import{b as E}from"./chunk-VBXL7XO7.js";import{f as P}from"./chunk-HLNHBZLI.js";import{b as d,e as p,h as w}from"./chunk-APDRR6FS.js";import{a as u}from"./chunk-ZLLER3HP.js";var b=u(n=>(n.summary.pass_rate??0)>=1?1:0,"fullPassScore");async function G(n,i={}){let c=i.executeEval??P,g=i.grade??h,v=i.getExperiment??(async r=>{try{return await p(`/api/memory-experiments/${r}`)}catch(t){if(t instanceof d&&t.statusCode===404)return null;throw t}}),M=i.getMemoryBody??(async r=>{try{return(await p(`/api/memories/${r}`)).body}catch(t){if(t instanceof d&&t.statusCode===404)return null;throw t}}),s=i.updateExperiment??(async(r,t)=>{await w(`/api/memory-experiments/${r}`,t)}),e=await v(n.experimentId);if(!e)return{skipped:"not_found"};if(e.status==="completed"||e.status==="failed")return{skipped:"already_terminal",status:e.status};let y=await M(e.memoryId);if(y==null)return await s(e.id,{status:"failed",error:"memory no longer exists"}),{skipped:"memory_gone",status:"failed"};await s(e.id,{status:"running"});let f=e.expectations??[],o=e.model??void 0,a=[],x=0;try{for(let t=0;t<e.trials;t++){let l=await c({prompt:e.taskPrompt,targetContent:y,model:o}),m=await c({prompt:e.taskPrompt,model:o});if(l.error||m.error){x++;continue}let[k,R]=await Promise.all([g({prompt:e.taskPrompt,output:l.output,expectations:f,model:o}),g({prompt:e.taskPrompt,output:m.output,expectations:f,model:o})]);a.push({withScore:b(k),withoutScore:b(R),withLatency:l.durationMs/1e3,withoutLatency:m.durationMs/1e3})}if(a.length===0){let t=`no trials completed (${x}/${e.trials} runs errored \u2014 is the claude CLI available?)`;return await s(e.id,{status:"failed",error:t}),{status:"failed",requestedTrials:e.trials,completedTrials:0}}let r=E(a);return await s(e.id,{status:"completed",result:{verdict:r,pairs:a,completedTrials:a.length,model:o??null}}),{status:"completed",requestedTrials:e.trials,completedTrials:a.length,significant:r.significant,delta:r.delta}}catch(r){let t=r instanceof Error?r.message:String(r);return await s(e.id,{status:"failed",error:t.slice(0,500)}).catch(()=>{}),{status:"failed",requestedTrials:e.trials,completedTrials:a.length}}}u(G,"processMemoryAb");export{G as a};