@rulemetric/cli 0.2.1 → 0.2.2

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 (780) hide show
  1. package/dist/base-command.js +13 -52
  2. package/dist/base-command.js.map +7 -1
  3. package/dist/chunk-2AM54TUK.js +59 -0
  4. package/dist/chunk-2AM54TUK.js.map +7 -0
  5. package/dist/chunk-3TIMQ3O6.js +96 -0
  6. package/dist/chunk-3TIMQ3O6.js.map +7 -0
  7. package/dist/chunk-4BHDHHKL.js +48 -0
  8. package/dist/chunk-4BHDHHKL.js.map +7 -0
  9. package/dist/chunk-4D537GXE.js +99 -0
  10. package/dist/chunk-4D537GXE.js.map +7 -0
  11. package/dist/chunk-4SCZK7AL.js +129 -0
  12. package/dist/chunk-4SCZK7AL.js.map +7 -0
  13. package/dist/chunk-4WFE4PFP.js +61 -0
  14. package/dist/chunk-4WFE4PFP.js.map +7 -0
  15. package/dist/chunk-52WIYRZH.js +73 -0
  16. package/dist/chunk-52WIYRZH.js.map +7 -0
  17. package/dist/chunk-7FAA3YNB.js +1549 -0
  18. package/dist/chunk-7FAA3YNB.js.map +7 -0
  19. package/dist/chunk-7NYKWN7U.js +12 -0
  20. package/dist/chunk-7NYKWN7U.js.map +7 -0
  21. package/dist/chunk-AULP2OWH.js +99 -0
  22. package/dist/chunk-AULP2OWH.js.map +7 -0
  23. package/dist/chunk-B5KNTGMJ.js +1788 -0
  24. package/dist/chunk-B5KNTGMJ.js.map +7 -0
  25. package/dist/chunk-BD7CY42U.js +23 -0
  26. package/dist/chunk-BD7CY42U.js.map +7 -0
  27. package/dist/chunk-BO76WKJR.js +42 -0
  28. package/dist/chunk-BO76WKJR.js.map +7 -0
  29. package/dist/chunk-BRD5RUGM.js +53 -0
  30. package/dist/chunk-BRD5RUGM.js.map +7 -0
  31. package/dist/chunk-BT6Z6545.js +43 -0
  32. package/dist/chunk-BT6Z6545.js.map +7 -0
  33. package/dist/chunk-BZDKEQKU.js +39 -0
  34. package/dist/chunk-BZDKEQKU.js.map +7 -0
  35. package/dist/chunk-CROYS75W.js +161 -0
  36. package/dist/chunk-CROYS75W.js.map +7 -0
  37. package/dist/chunk-DGHWRQXL.js +17 -0
  38. package/dist/chunk-DGHWRQXL.js.map +7 -0
  39. package/dist/chunk-DQ3KELXD.js +74 -0
  40. package/dist/chunk-DQ3KELXD.js.map +7 -0
  41. package/dist/chunk-DTFXCHHI.js +108 -0
  42. package/dist/chunk-DTFXCHHI.js.map +7 -0
  43. package/dist/chunk-DU73QUS3.js +75 -0
  44. package/dist/chunk-DU73QUS3.js.map +7 -0
  45. package/dist/chunk-EHZJ6OXD.js +307 -0
  46. package/dist/chunk-EHZJ6OXD.js.map +7 -0
  47. package/dist/chunk-EJOI2ZGU.js +109 -0
  48. package/dist/chunk-EJOI2ZGU.js.map +7 -0
  49. package/dist/chunk-EKJ2CABV.js +76 -0
  50. package/dist/chunk-EKJ2CABV.js.map +7 -0
  51. package/dist/chunk-EKP32DLN.js +16 -0
  52. package/dist/chunk-EKP32DLN.js.map +7 -0
  53. package/dist/chunk-EOOP6WTC.js +148 -0
  54. package/dist/chunk-EOOP6WTC.js.map +7 -0
  55. package/dist/chunk-ERPMDAO3.js +20 -0
  56. package/dist/chunk-ERPMDAO3.js.map +7 -0
  57. package/dist/chunk-FTJRMUID.js +96 -0
  58. package/dist/chunk-FTJRMUID.js.map +7 -0
  59. package/dist/chunk-FZKLLNDS.js +228 -0
  60. package/dist/chunk-FZKLLNDS.js.map +7 -0
  61. package/dist/chunk-GQCISMAH.js +157 -0
  62. package/dist/chunk-GQCISMAH.js.map +7 -0
  63. package/dist/chunk-IGXX624H.js +55 -0
  64. package/dist/chunk-IGXX624H.js.map +7 -0
  65. package/dist/chunk-IJGF2ETG.js +68 -0
  66. package/dist/chunk-IJGF2ETG.js.map +7 -0
  67. package/dist/chunk-IWYCRLEK.js +220 -0
  68. package/dist/chunk-IWYCRLEK.js.map +7 -0
  69. package/dist/chunk-J7N3DLH6.js +117 -0
  70. package/dist/chunk-J7N3DLH6.js.map +7 -0
  71. package/dist/chunk-JX5UI6RW.js +99 -0
  72. package/dist/chunk-JX5UI6RW.js.map +7 -0
  73. package/dist/chunk-K3BFZ7KG.js +154 -0
  74. package/dist/chunk-K3BFZ7KG.js.map +7 -0
  75. package/dist/chunk-KHJUQFIK.js +51 -0
  76. package/dist/chunk-KHJUQFIK.js.map +7 -0
  77. package/dist/chunk-KRBQLMOP.js +41 -0
  78. package/dist/chunk-KRBQLMOP.js.map +7 -0
  79. package/dist/chunk-KZRFUXGF.js +145 -0
  80. package/dist/chunk-KZRFUXGF.js.map +7 -0
  81. package/dist/chunk-L674RNKQ.js +492 -0
  82. package/dist/chunk-L674RNKQ.js.map +7 -0
  83. package/dist/chunk-N52AHNBH.js +47 -0
  84. package/dist/chunk-N52AHNBH.js.map +7 -0
  85. package/dist/chunk-NIDLJO6F.js +228 -0
  86. package/dist/chunk-NIDLJO6F.js.map +7 -0
  87. package/dist/chunk-NSBPE2FW.js +17 -0
  88. package/dist/chunk-NSBPE2FW.js.map +7 -0
  89. package/dist/chunk-OGVORIFM.js +70 -0
  90. package/dist/chunk-OGVORIFM.js.map +7 -0
  91. package/dist/chunk-OQSQC7VB.js +77 -0
  92. package/dist/chunk-OQSQC7VB.js.map +7 -0
  93. package/dist/chunk-PHLMIZKM.js +153 -0
  94. package/dist/chunk-PHLMIZKM.js.map +7 -0
  95. package/dist/chunk-PQU7GZ7A.js +92 -0
  96. package/dist/chunk-PQU7GZ7A.js.map +7 -0
  97. package/dist/chunk-PXVQLD7S.js +196 -0
  98. package/dist/chunk-PXVQLD7S.js.map +7 -0
  99. package/dist/chunk-QD6X4L4L.js +79 -0
  100. package/dist/chunk-QD6X4L4L.js.map +7 -0
  101. package/dist/chunk-QJQS6TUN.js +44 -0
  102. package/dist/chunk-QJQS6TUN.js.map +7 -0
  103. package/dist/chunk-QJXAULRC.js +191 -0
  104. package/dist/chunk-QJXAULRC.js.map +7 -0
  105. package/dist/chunk-QN34TGD3.js +83 -0
  106. package/dist/chunk-QN34TGD3.js.map +7 -0
  107. package/dist/chunk-R5MFHGHR.js +122 -0
  108. package/dist/chunk-R5MFHGHR.js.map +7 -0
  109. package/dist/chunk-RH7NHVSK.js +16 -0
  110. package/dist/chunk-RH7NHVSK.js.map +7 -0
  111. package/dist/chunk-RJ7BHDLM.js +121 -0
  112. package/dist/chunk-RJ7BHDLM.js.map +7 -0
  113. package/dist/chunk-RQ2TMLKG.js +142 -0
  114. package/dist/chunk-RQ2TMLKG.js.map +7 -0
  115. package/dist/chunk-S56LOTGQ.js +63 -0
  116. package/dist/chunk-S56LOTGQ.js.map +7 -0
  117. package/dist/chunk-UF73WX2J.js +49 -0
  118. package/dist/chunk-UF73WX2J.js.map +7 -0
  119. package/dist/chunk-W53GKIZQ.js +50 -0
  120. package/dist/chunk-W53GKIZQ.js.map +7 -0
  121. package/dist/chunk-WA4MWYRW.js +254 -0
  122. package/dist/chunk-WA4MWYRW.js.map +7 -0
  123. package/dist/chunk-WFULKPEQ.js +269 -0
  124. package/dist/chunk-WFULKPEQ.js.map +7 -0
  125. package/dist/chunk-XC6M4CSW.js +44 -0
  126. package/dist/chunk-XC6M4CSW.js.map +7 -0
  127. package/dist/chunk-XPUEGHXN.js +243 -0
  128. package/dist/chunk-XPUEGHXN.js.map +7 -0
  129. package/dist/chunk-XZXS2W24.js +148 -0
  130. package/dist/chunk-XZXS2W24.js.map +7 -0
  131. package/dist/chunk-YBNW7ARH.js +167 -0
  132. package/dist/chunk-YBNW7ARH.js.map +7 -0
  133. package/dist/chunk-YNIH3KMU.js +121 -0
  134. package/dist/chunk-YNIH3KMU.js.map +7 -0
  135. package/dist/commands/antigravity/backfill.js +135 -0
  136. package/dist/commands/antigravity/backfill.js.map +7 -0
  137. package/dist/commands/auth/create-key.js +48 -33
  138. package/dist/commands/auth/create-key.js.map +7 -1
  139. package/dist/commands/auth/login.js +58 -46
  140. package/dist/commands/auth/login.js.map +7 -1
  141. package/dist/commands/auth/logout.js +28 -13
  142. package/dist/commands/auth/logout.js.map +7 -1
  143. package/dist/commands/auth/revoke-key.js +32 -18
  144. package/dist/commands/auth/revoke-key.js.map +7 -1
  145. package/dist/commands/auth/status.js +40 -22
  146. package/dist/commands/auth/status.js.map +7 -1
  147. package/dist/commands/catalog/index.js +50 -34
  148. package/dist/commands/catalog/index.js.map +7 -1
  149. package/dist/commands/catalog/recommend.js +41 -26
  150. package/dist/commands/catalog/recommend.js.map +7 -1
  151. package/dist/commands/convert.js +72 -54
  152. package/dist/commands/convert.js.map +7 -1
  153. package/dist/commands/converters.js +52 -38
  154. package/dist/commands/converters.js.map +7 -1
  155. package/dist/commands/crons/list.js +50 -24
  156. package/dist/commands/crons/list.js.map +7 -1
  157. package/dist/commands/crons/run.js +72 -47
  158. package/dist/commands/crons/run.js.map +7 -1
  159. package/dist/commands/dashboard.js +45 -24
  160. package/dist/commands/dashboard.js.map +7 -1
  161. package/dist/commands/eval-targets/create.js +51 -39
  162. package/dist/commands/eval-targets/create.js.map +7 -1
  163. package/dist/commands/eval-targets/list.js +52 -35
  164. package/dist/commands/eval-targets/list.js.map +7 -1
  165. package/dist/commands/evals/agent.js +292 -0
  166. package/dist/commands/evals/agent.js.map +7 -0
  167. package/dist/commands/evals/benchmark.js +70 -51
  168. package/dist/commands/evals/benchmark.js.map +7 -1
  169. package/dist/commands/evals/compare.js +90 -78
  170. package/dist/commands/evals/compare.js.map +7 -1
  171. package/dist/commands/evals/create.js +64 -50
  172. package/dist/commands/evals/create.js.map +7 -1
  173. package/dist/commands/evals/optimize-description.js +225 -222
  174. package/dist/commands/evals/optimize-description.js.map +7 -1
  175. package/dist/commands/evals/optimize.js +206 -196
  176. package/dist/commands/evals/optimize.js.map +7 -1
  177. package/dist/commands/evals/run.js +178 -164
  178. package/dist/commands/evals/run.js.map +7 -1
  179. package/dist/commands/gateway/ensure.js +33 -19
  180. package/dist/commands/gateway/ensure.js.map +7 -1
  181. package/dist/commands/hooks/install.js +335 -275
  182. package/dist/commands/hooks/install.js.map +7 -1
  183. package/dist/commands/hooks/run.js +72 -53
  184. package/dist/commands/hooks/run.js.map +7 -1
  185. package/dist/commands/hooks/uninstall.js +117 -94
  186. package/dist/commands/hooks/uninstall.js.map +7 -1
  187. package/dist/commands/import.js +63 -53
  188. package/dist/commands/import.js.map +7 -1
  189. package/dist/commands/instructions/create.js +71 -58
  190. package/dist/commands/instructions/create.js.map +7 -1
  191. package/dist/commands/instructions/delete.js +53 -36
  192. package/dist/commands/instructions/delete.js.map +7 -1
  193. package/dist/commands/instructions/fork.js +33 -19
  194. package/dist/commands/instructions/fork.js.map +7 -1
  195. package/dist/commands/instructions/get.js +66 -49
  196. package/dist/commands/instructions/get.js.map +7 -1
  197. package/dist/commands/instructions/list.js +63 -46
  198. package/dist/commands/instructions/list.js.map +7 -1
  199. package/dist/commands/instructions/promote.js +41 -27
  200. package/dist/commands/instructions/promote.js.map +7 -1
  201. package/dist/commands/instructions/pull.js +37 -21
  202. package/dist/commands/instructions/pull.js.map +7 -1
  203. package/dist/commands/instructions/upstream.js +36 -21
  204. package/dist/commands/instructions/upstream.js.map +7 -1
  205. package/dist/commands/instructions/versions.js +51 -33
  206. package/dist/commands/instructions/versions.js.map +7 -1
  207. package/dist/commands/launcher.js +39 -0
  208. package/dist/commands/launcher.js.map +7 -0
  209. package/dist/commands/org/current.js +74 -68
  210. package/dist/commands/org/current.js.map +7 -1
  211. package/dist/commands/org/list.js +50 -36
  212. package/dist/commands/org/list.js.map +7 -1
  213. package/dist/commands/org/switch.js +69 -51
  214. package/dist/commands/org/switch.js.map +7 -1
  215. package/dist/commands/packs/add-instruction.js +36 -22
  216. package/dist/commands/packs/add-instruction.js.map +7 -1
  217. package/dist/commands/packs/apply.js +38 -24
  218. package/dist/commands/packs/apply.js.map +7 -1
  219. package/dist/commands/packs/create.js +47 -33
  220. package/dist/commands/packs/create.js.map +7 -1
  221. package/dist/commands/packs/fork.js +33 -19
  222. package/dist/commands/packs/fork.js.map +7 -1
  223. package/dist/commands/packs/get.js +54 -35
  224. package/dist/commands/packs/get.js.map +7 -1
  225. package/dist/commands/packs/list.js +64 -47
  226. package/dist/commands/packs/list.js.map +7 -1
  227. package/dist/commands/packs/remove-instruction.js +34 -20
  228. package/dist/commands/packs/remove-instruction.js.map +7 -1
  229. package/dist/commands/proxy/env.js +126 -116
  230. package/dist/commands/proxy/env.js.map +7 -1
  231. package/dist/commands/proxy/logs.js +83 -74
  232. package/dist/commands/proxy/logs.js.map +7 -1
  233. package/dist/commands/proxy/restart.js +34 -36
  234. package/dist/commands/proxy/restart.js.map +7 -1
  235. package/dist/commands/proxy/setup.js +432 -375
  236. package/dist/commands/proxy/setup.js.map +7 -1
  237. package/dist/commands/proxy/start.js +289 -289
  238. package/dist/commands/proxy/start.js.map +7 -1
  239. package/dist/commands/proxy/status.js +74 -64
  240. package/dist/commands/proxy/status.js.map +7 -1
  241. package/dist/commands/proxy/stop.js +81 -75
  242. package/dist/commands/proxy/stop.js.map +7 -1
  243. package/dist/commands/research/backfill.js +58 -0
  244. package/dist/commands/research/backfill.js.map +7 -0
  245. package/dist/commands/research/tail-transcript.js +69 -0
  246. package/dist/commands/research/tail-transcript.js.map +7 -0
  247. package/dist/commands/service/install.js +639 -405
  248. package/dist/commands/service/install.js.map +7 -1
  249. package/dist/commands/service/status.js +178 -111
  250. package/dist/commands/service/status.js.map +7 -1
  251. package/dist/commands/service/uninstall.js +85 -110
  252. package/dist/commands/service/uninstall.js.map +7 -1
  253. package/dist/commands/sessions/analyze.js +46 -25
  254. package/dist/commands/sessions/analyze.js.map +7 -1
  255. package/dist/commands/sessions/end.js +81 -79
  256. package/dist/commands/sessions/end.js.map +7 -1
  257. package/dist/commands/sessions/import.js +44 -27
  258. package/dist/commands/sessions/import.js.map +7 -1
  259. package/dist/commands/sessions/list.js +46 -33
  260. package/dist/commands/sessions/list.js.map +7 -1
  261. package/dist/commands/sessions/start.js +88 -87
  262. package/dist/commands/sessions/start.js.map +7 -1
  263. package/dist/commands/signals/report.js +42 -34
  264. package/dist/commands/signals/report.js.map +7 -1
  265. package/dist/commands/skills/export-approved.js +44 -30
  266. package/dist/commands/skills/export-approved.js.map +7 -1
  267. package/dist/commands/skills/install.js +99 -84
  268. package/dist/commands/skills/install.js.map +7 -1
  269. package/dist/commands/skills/list.js +59 -42
  270. package/dist/commands/skills/list.js.map +7 -1
  271. package/dist/commands/skills/publish.js +95 -78
  272. package/dist/commands/skills/publish.js.map +7 -1
  273. package/dist/commands/skills/search.js +68 -53
  274. package/dist/commands/skills/search.js.map +7 -1
  275. package/dist/commands/skills/update.js +52 -39
  276. package/dist/commands/skills/update.js.map +7 -1
  277. package/dist/commands/suggestions/accept.js +82 -59
  278. package/dist/commands/suggestions/accept.js.map +7 -1
  279. package/dist/commands/suggestions/dismiss.js +44 -26
  280. package/dist/commands/suggestions/dismiss.js.map +7 -1
  281. package/dist/commands/suggestions/list.js +59 -39
  282. package/dist/commands/suggestions/list.js.map +7 -1
  283. package/dist/commands/suggestions/refresh.js +26 -11
  284. package/dist/commands/suggestions/refresh.js.map +7 -1
  285. package/dist/cursor-BGQJ4CWI.js +134 -0
  286. package/dist/cursor-BGQJ4CWI.js.map +7 -0
  287. package/dist/dashboard/Dashboard.js +229 -126
  288. package/dist/dashboard/Dashboard.js.map +7 -1
  289. package/dist/dashboard/data.js +13 -137
  290. package/dist/dashboard/data.js.map +7 -1
  291. package/dist/dashboard/launcher/ActiveJobsList.js +10 -0
  292. package/dist/dashboard/launcher/ActiveJobsList.js.map +7 -0
  293. package/dist/dashboard/launcher/LauncherOverlay.js +14 -0
  294. package/dist/dashboard/launcher/LauncherOverlay.js.map +7 -0
  295. package/dist/dashboard/launcher/NewLaunchForm.js +10 -0
  296. package/dist/dashboard/launcher/NewLaunchForm.js.map +7 -0
  297. package/dist/dashboard/launcher/api.js +14 -0
  298. package/dist/dashboard/launcher/api.js.map +7 -0
  299. package/dist/dashboard/launcher/tool-labels.js +10 -0
  300. package/dist/dashboard/launcher/tool-labels.js.map +7 -0
  301. package/dist/dashboard/launcher/types.js +1 -0
  302. package/dist/dashboard/launcher/types.js.map +7 -0
  303. package/dist/dashboard/launcher/useLaunchJobs.js +9 -0
  304. package/dist/dashboard/launcher/useLaunchJobs.js.map +7 -0
  305. package/dist/dashboard/panels/friction.js +10 -22
  306. package/dist/dashboard/panels/friction.js.map +7 -1
  307. package/dist/dashboard/panels/insights.js +10 -109
  308. package/dist/dashboard/panels/insights.js.map +7 -1
  309. package/dist/dashboard/panels/instructions.js +10 -17
  310. package/dist/dashboard/panels/instructions.js.map +7 -1
  311. package/dist/dashboard/panels/outcomes.js +9 -28
  312. package/dist/dashboard/panels/outcomes.js.map +7 -1
  313. package/dist/dashboard/panels/overview.js +10 -20
  314. package/dist/dashboard/panels/overview.js.map +7 -1
  315. package/dist/dashboard/panels/shared.js +18 -61
  316. package/dist/dashboard/panels/shared.js.map +7 -1
  317. package/dist/dashboard/types.js +23 -26
  318. package/dist/dashboard/types.js.map +7 -1
  319. package/dist/dist-CSUYFYKI.js +52 -0
  320. package/dist/dist-CSUYFYKI.js.map +7 -0
  321. package/dist/index.js +8 -2
  322. package/dist/index.js.map +7 -1
  323. package/dist/lib/active-org-refresh.js +15 -108
  324. package/dist/lib/active-org-refresh.js.map +7 -1
  325. package/dist/lib/active-org.js +15 -95
  326. package/dist/lib/active-org.js.map +7 -1
  327. package/dist/lib/agent-loop.js +44 -0
  328. package/dist/lib/agent-loop.js.map +7 -0
  329. package/dist/lib/antigravity-transcript.js +22 -0
  330. package/dist/lib/antigravity-transcript.js.map +7 -0
  331. package/dist/lib/api-client.js +21 -92
  332. package/dist/lib/api-client.js.map +7 -1
  333. package/dist/lib/auth.js +26 -137
  334. package/dist/lib/auth.js.map +7 -1
  335. package/dist/lib/detect-languages.js +8 -113
  336. package/dist/lib/detect-languages.js.map +7 -1
  337. package/dist/lib/detect-tmux.js +9 -0
  338. package/dist/lib/detect-tmux.js.map +7 -0
  339. package/dist/lib/eval-analyzer.js +9 -89
  340. package/dist/lib/eval-analyzer.js.map +7 -1
  341. package/dist/lib/eval-benchmark.js +12 -92
  342. package/dist/lib/eval-benchmark.js.map +7 -1
  343. package/dist/lib/eval-conversation-handler.js +13 -200
  344. package/dist/lib/eval-conversation-handler.js.map +7 -1
  345. package/dist/lib/eval-executor.js +8 -83
  346. package/dist/lib/eval-executor.js.map +7 -1
  347. package/dist/lib/eval-grader.js +9 -123
  348. package/dist/lib/eval-grader.js.map +7 -1
  349. package/dist/lib/eval-meta-judge.js +9 -116
  350. package/dist/lib/eval-meta-judge.js.map +7 -1
  351. package/dist/lib/eval-trigger-tester.js +11 -96
  352. package/dist/lib/eval-trigger-tester.js.map +7 -1
  353. package/dist/lib/eval-worktree.js +8 -87
  354. package/dist/lib/eval-worktree.js.map +7 -1
  355. package/dist/lib/gateway-entry.js +20 -18
  356. package/dist/lib/gateway-entry.js.map +7 -1
  357. package/dist/lib/gateway-lifecycle.js +22 -97
  358. package/dist/lib/gateway-lifecycle.js.map +7 -1
  359. package/dist/lib/gateway.js +12 -216
  360. package/dist/lib/gateway.js.map +7 -1
  361. package/dist/lib/handlers/cron-close-stale-sessions.js +18 -7
  362. package/dist/lib/handlers/cron-close-stale-sessions.js.map +7 -1
  363. package/dist/lib/handlers/cron-data-integrity-audit.js +21 -15
  364. package/dist/lib/handlers/cron-data-integrity-audit.js.map +7 -1
  365. package/dist/lib/handlers/cron-refresh-skills.js +7 -90
  366. package/dist/lib/handlers/cron-refresh-skills.js.map +7 -1
  367. package/dist/lib/handlers/cron-suggest-instructions.js +14 -158
  368. package/dist/lib/handlers/cron-suggest-instructions.js.map +7 -1
  369. package/dist/lib/handlers/process-announcement.js +11 -0
  370. package/dist/lib/handlers/process-announcement.js.map +7 -0
  371. package/dist/lib/handlers/process-changelog.js +11 -0
  372. package/dist/lib/handlers/process-changelog.js.map +7 -0
  373. package/dist/lib/handlers/process-conversation.js +14 -35
  374. package/dist/lib/handlers/process-conversation.js.map +7 -1
  375. package/dist/lib/handlers/process-eval.js +15 -207
  376. package/dist/lib/handlers/process-eval.js.map +7 -1
  377. package/dist/lib/handlers/process-insights.js +14 -300
  378. package/dist/lib/handlers/process-insights.js.map +7 -1
  379. package/dist/lib/handlers/process-launch.js +16 -41
  380. package/dist/lib/handlers/process-launch.js.map +7 -1
  381. package/dist/lib/handlers/process-run-cleanup.js +13 -0
  382. package/dist/lib/handlers/process-run-cleanup.js.map +7 -0
  383. package/dist/lib/handlers/process-send-message.js +10 -0
  384. package/dist/lib/handlers/process-send-message.js.map +7 -0
  385. package/dist/lib/handlers/process-session-goal.js +11 -74
  386. package/dist/lib/handlers/process-session-goal.js.map +7 -1
  387. package/dist/lib/hooks-config.js +52 -544
  388. package/dist/lib/hooks-config.js.map +7 -1
  389. package/dist/lib/insights-prompts.js +12 -145
  390. package/dist/lib/insights-prompts.js.map +7 -1
  391. package/dist/lib/job-helpers.js +1 -0
  392. package/dist/lib/job-helpers.js.map +7 -0
  393. package/dist/lib/llm-client.js +16 -274
  394. package/dist/lib/llm-client.js.map +7 -1
  395. package/dist/lib/manual-tasks.js +22 -0
  396. package/dist/lib/manual-tasks.js.map +7 -0
  397. package/dist/lib/output.js +12 -36
  398. package/dist/lib/output.js.map +7 -1
  399. package/dist/lib/permanent-job-error.js +10 -23
  400. package/dist/lib/permanent-job-error.js.map +7 -1
  401. package/dist/lib/provider-aggregator.js +57 -55
  402. package/dist/lib/provider-aggregator.js.map +7 -1
  403. package/dist/lib/research-client.js +12 -0
  404. package/dist/lib/research-client.js.map +7 -0
  405. package/dist/lib/skills-loader.js +8 -51
  406. package/dist/lib/skills-loader.js.map +7 -1
  407. package/dist/lib/statusline-shim.js +16 -0
  408. package/dist/lib/statusline-shim.js.map +7 -0
  409. package/dist/lib/terminal-target-heartbeat.js +15 -0
  410. package/dist/lib/terminal-target-heartbeat.js.map +7 -0
  411. package/dist/lib/tmux.js +16 -0
  412. package/dist/lib/tmux.js.map +7 -0
  413. package/dist/lib/transcript-rate-limit-watcher.js +22 -0
  414. package/dist/lib/transcript-rate-limit-watcher.js.map +7 -0
  415. package/dist/lib/types.js +8 -7
  416. package/dist/lib/types.js.map +7 -1
  417. package/dist/lib/version-check.js +10 -106
  418. package/dist/lib/version-check.js.map +7 -1
  419. package/dist/lib/which.js +8 -0
  420. package/dist/lib/which.js.map +7 -0
  421. package/dist/lib/worktree.js +17 -0
  422. package/dist/lib/worktree.js.map +7 -0
  423. package/dist/opencode-IQ7X5YMJ.js +190 -0
  424. package/dist/opencode-IQ7X5YMJ.js.map +7 -0
  425. package/oclif.manifest.json +299 -66
  426. package/package.json +27 -11
  427. package/dist/base-command.d.ts +0 -12
  428. package/dist/base-command.d.ts.map +0 -1
  429. package/dist/commands/auth/create-key.d.ts +0 -11
  430. package/dist/commands/auth/create-key.d.ts.map +0 -1
  431. package/dist/commands/auth/login.d.ts +0 -11
  432. package/dist/commands/auth/login.d.ts.map +0 -1
  433. package/dist/commands/auth/logout.d.ts +0 -7
  434. package/dist/commands/auth/logout.d.ts.map +0 -1
  435. package/dist/commands/auth/revoke-key.d.ts +0 -10
  436. package/dist/commands/auth/revoke-key.d.ts.map +0 -1
  437. package/dist/commands/auth/status.d.ts +0 -7
  438. package/dist/commands/auth/status.d.ts.map +0 -1
  439. package/dist/commands/catalog/index.d.ts +0 -11
  440. package/dist/commands/catalog/index.d.ts.map +0 -1
  441. package/dist/commands/catalog/recommend.d.ts +0 -9
  442. package/dist/commands/catalog/recommend.d.ts.map +0 -1
  443. package/dist/commands/convert.d.ts +0 -15
  444. package/dist/commands/convert.d.ts.map +0 -1
  445. package/dist/commands/converters.d.ts +0 -12
  446. package/dist/commands/converters.d.ts.map +0 -1
  447. package/dist/commands/crons/list.d.ts +0 -7
  448. package/dist/commands/crons/list.d.ts.map +0 -1
  449. package/dist/commands/crons/run.d.ts +0 -13
  450. package/dist/commands/crons/run.d.ts.map +0 -1
  451. package/dist/commands/dashboard.d.ts +0 -10
  452. package/dist/commands/dashboard.d.ts.map +0 -1
  453. package/dist/commands/eval-targets/create.d.ts +0 -14
  454. package/dist/commands/eval-targets/create.d.ts.map +0 -1
  455. package/dist/commands/eval-targets/list.d.ts +0 -10
  456. package/dist/commands/eval-targets/list.d.ts.map +0 -1
  457. package/dist/commands/evals/benchmark.d.ts +0 -13
  458. package/dist/commands/evals/benchmark.d.ts.map +0 -1
  459. package/dist/commands/evals/compare.d.ts +0 -15
  460. package/dist/commands/evals/compare.d.ts.map +0 -1
  461. package/dist/commands/evals/create.d.ts +0 -17
  462. package/dist/commands/evals/create.d.ts.map +0 -1
  463. package/dist/commands/evals/listen.d.ts +0 -37
  464. package/dist/commands/evals/listen.d.ts.map +0 -1
  465. package/dist/commands/evals/listen.js +0 -188
  466. package/dist/commands/evals/listen.js.map +0 -1
  467. package/dist/commands/evals/listen.test.d.ts +0 -2
  468. package/dist/commands/evals/listen.test.d.ts.map +0 -1
  469. package/dist/commands/evals/listen.test.js +0 -48
  470. package/dist/commands/evals/listen.test.js.map +0 -1
  471. package/dist/commands/evals/optimize-description.d.ts +0 -22
  472. package/dist/commands/evals/optimize-description.d.ts.map +0 -1
  473. package/dist/commands/evals/optimize.d.ts +0 -22
  474. package/dist/commands/evals/optimize.d.ts.map +0 -1
  475. package/dist/commands/evals/run.d.ts +0 -21
  476. package/dist/commands/evals/run.d.ts.map +0 -1
  477. package/dist/commands/gateway/ensure.d.ts +0 -7
  478. package/dist/commands/gateway/ensure.d.ts.map +0 -1
  479. package/dist/commands/hooks/install.d.ts +0 -16
  480. package/dist/commands/hooks/install.d.ts.map +0 -1
  481. package/dist/commands/hooks/run.d.ts +0 -11
  482. package/dist/commands/hooks/run.d.ts.map +0 -1
  483. package/dist/commands/hooks/uninstall.d.ts +0 -7
  484. package/dist/commands/hooks/uninstall.d.ts.map +0 -1
  485. package/dist/commands/import.d.ts +0 -17
  486. package/dist/commands/import.d.ts.map +0 -1
  487. package/dist/commands/instructions/create.d.ts +0 -17
  488. package/dist/commands/instructions/create.d.ts.map +0 -1
  489. package/dist/commands/instructions/delete.d.ts +0 -13
  490. package/dist/commands/instructions/delete.d.ts.map +0 -1
  491. package/dist/commands/instructions/fork.d.ts +0 -10
  492. package/dist/commands/instructions/fork.d.ts.map +0 -1
  493. package/dist/commands/instructions/get.d.ts +0 -15
  494. package/dist/commands/instructions/get.d.ts.map +0 -1
  495. package/dist/commands/instructions/list.d.ts +0 -12
  496. package/dist/commands/instructions/list.d.ts.map +0 -1
  497. package/dist/commands/instructions/promote.d.ts +0 -14
  498. package/dist/commands/instructions/promote.d.ts.map +0 -1
  499. package/dist/commands/instructions/pull.d.ts +0 -9
  500. package/dist/commands/instructions/pull.d.ts.map +0 -1
  501. package/dist/commands/instructions/upstream.d.ts +0 -9
  502. package/dist/commands/instructions/upstream.d.ts.map +0 -1
  503. package/dist/commands/instructions/versions.d.ts +0 -12
  504. package/dist/commands/instructions/versions.d.ts.map +0 -1
  505. package/dist/commands/org/current.d.ts +0 -7
  506. package/dist/commands/org/current.d.ts.map +0 -1
  507. package/dist/commands/org/list.d.ts +0 -7
  508. package/dist/commands/org/list.d.ts.map +0 -1
  509. package/dist/commands/org/switch.d.ts +0 -13
  510. package/dist/commands/org/switch.d.ts.map +0 -1
  511. package/dist/commands/packs/add-instruction.d.ts +0 -11
  512. package/dist/commands/packs/add-instruction.d.ts.map +0 -1
  513. package/dist/commands/packs/apply.d.ts +0 -13
  514. package/dist/commands/packs/apply.d.ts.map +0 -1
  515. package/dist/commands/packs/create.d.ts +0 -13
  516. package/dist/commands/packs/create.d.ts.map +0 -1
  517. package/dist/commands/packs/fork.d.ts +0 -10
  518. package/dist/commands/packs/fork.d.ts.map +0 -1
  519. package/dist/commands/packs/get.d.ts +0 -10
  520. package/dist/commands/packs/get.d.ts.map +0 -1
  521. package/dist/commands/packs/list.d.ts +0 -22
  522. package/dist/commands/packs/list.d.ts.map +0 -1
  523. package/dist/commands/packs/remove-instruction.d.ts +0 -11
  524. package/dist/commands/packs/remove-instruction.d.ts.map +0 -1
  525. package/dist/commands/proxy/env.d.ts +0 -14
  526. package/dist/commands/proxy/env.d.ts.map +0 -1
  527. package/dist/commands/proxy/logs.d.ts +0 -11
  528. package/dist/commands/proxy/logs.d.ts.map +0 -1
  529. package/dist/commands/proxy/restart.d.ts +0 -11
  530. package/dist/commands/proxy/restart.d.ts.map +0 -1
  531. package/dist/commands/proxy/setup.d.ts +0 -23
  532. package/dist/commands/proxy/setup.d.ts.map +0 -1
  533. package/dist/commands/proxy/start.d.ts +0 -17
  534. package/dist/commands/proxy/start.d.ts.map +0 -1
  535. package/dist/commands/proxy/status.d.ts +0 -7
  536. package/dist/commands/proxy/status.d.ts.map +0 -1
  537. package/dist/commands/proxy/stop.d.ts +0 -8
  538. package/dist/commands/proxy/stop.d.ts.map +0 -1
  539. package/dist/commands/service/install.d.ts +0 -33
  540. package/dist/commands/service/install.d.ts.map +0 -1
  541. package/dist/commands/service/install.test.d.ts +0 -2
  542. package/dist/commands/service/install.test.d.ts.map +0 -1
  543. package/dist/commands/service/install.test.js +0 -345
  544. package/dist/commands/service/install.test.js.map +0 -1
  545. package/dist/commands/service/status.d.ts +0 -6
  546. package/dist/commands/service/status.d.ts.map +0 -1
  547. package/dist/commands/service/uninstall.d.ts +0 -6
  548. package/dist/commands/service/uninstall.d.ts.map +0 -1
  549. package/dist/commands/sessions/analyze.d.ts +0 -10
  550. package/dist/commands/sessions/analyze.d.ts.map +0 -1
  551. package/dist/commands/sessions/end.d.ts +0 -9
  552. package/dist/commands/sessions/end.d.ts.map +0 -1
  553. package/dist/commands/sessions/import.d.ts +0 -13
  554. package/dist/commands/sessions/import.d.ts.map +0 -1
  555. package/dist/commands/sessions/list.d.ts +0 -11
  556. package/dist/commands/sessions/list.d.ts.map +0 -1
  557. package/dist/commands/sessions/start.d.ts +0 -11
  558. package/dist/commands/sessions/start.d.ts.map +0 -1
  559. package/dist/commands/signals/report.d.ts +0 -10
  560. package/dist/commands/signals/report.d.ts.map +0 -1
  561. package/dist/commands/signals/report.test.d.ts +0 -2
  562. package/dist/commands/signals/report.test.d.ts.map +0 -1
  563. package/dist/commands/signals/report.test.js +0 -65
  564. package/dist/commands/signals/report.test.js.map +0 -1
  565. package/dist/commands/skills/export-approved.d.ts +0 -10
  566. package/dist/commands/skills/export-approved.d.ts.map +0 -1
  567. package/dist/commands/skills/install.d.ts +0 -15
  568. package/dist/commands/skills/install.d.ts.map +0 -1
  569. package/dist/commands/skills/list.d.ts +0 -11
  570. package/dist/commands/skills/list.d.ts.map +0 -1
  571. package/dist/commands/skills/publish.d.ts +0 -17
  572. package/dist/commands/skills/publish.d.ts.map +0 -1
  573. package/dist/commands/skills/search.d.ts +0 -17
  574. package/dist/commands/skills/search.d.ts.map +0 -1
  575. package/dist/commands/skills/update.d.ts +0 -10
  576. package/dist/commands/skills/update.d.ts.map +0 -1
  577. package/dist/commands/suggestions/accept.d.ts +0 -16
  578. package/dist/commands/suggestions/accept.d.ts.map +0 -1
  579. package/dist/commands/suggestions/accept.test.d.ts +0 -2
  580. package/dist/commands/suggestions/accept.test.d.ts.map +0 -1
  581. package/dist/commands/suggestions/accept.test.js +0 -52
  582. package/dist/commands/suggestions/accept.test.js.map +0 -1
  583. package/dist/commands/suggestions/dismiss.d.ts +0 -10
  584. package/dist/commands/suggestions/dismiss.d.ts.map +0 -1
  585. package/dist/commands/suggestions/list.d.ts +0 -10
  586. package/dist/commands/suggestions/list.d.ts.map +0 -1
  587. package/dist/commands/suggestions/refresh.d.ts +0 -7
  588. package/dist/commands/suggestions/refresh.d.ts.map +0 -1
  589. package/dist/dashboard/Dashboard.d.ts +0 -3
  590. package/dist/dashboard/Dashboard.d.ts.map +0 -1
  591. package/dist/dashboard/data.d.ts +0 -11
  592. package/dist/dashboard/data.d.ts.map +0 -1
  593. package/dist/dashboard/panels/friction.d.ts +0 -7
  594. package/dist/dashboard/panels/friction.d.ts.map +0 -1
  595. package/dist/dashboard/panels/insights.d.ts +0 -8
  596. package/dist/dashboard/panels/insights.d.ts.map +0 -1
  597. package/dist/dashboard/panels/instructions.d.ts +0 -9
  598. package/dist/dashboard/panels/instructions.d.ts.map +0 -1
  599. package/dist/dashboard/panels/outcomes.d.ts +0 -7
  600. package/dist/dashboard/panels/outcomes.d.ts.map +0 -1
  601. package/dist/dashboard/panels/overview.d.ts +0 -8
  602. package/dist/dashboard/panels/overview.d.ts.map +0 -1
  603. package/dist/dashboard/panels/shared.d.ts +0 -17
  604. package/dist/dashboard/panels/shared.d.ts.map +0 -1
  605. package/dist/dashboard/types.d.ts +0 -80
  606. package/dist/dashboard/types.d.ts.map +0 -1
  607. package/dist/index.d.ts +0 -2
  608. package/dist/index.d.ts.map +0 -1
  609. package/dist/lib/active-org-refresh.d.ts +0 -22
  610. package/dist/lib/active-org-refresh.d.ts.map +0 -1
  611. package/dist/lib/active-org-refresh.test.d.ts +0 -2
  612. package/dist/lib/active-org-refresh.test.d.ts.map +0 -1
  613. package/dist/lib/active-org-refresh.test.js +0 -190
  614. package/dist/lib/active-org-refresh.test.js.map +0 -1
  615. package/dist/lib/active-org.d.ts +0 -43
  616. package/dist/lib/active-org.d.ts.map +0 -1
  617. package/dist/lib/active-org.test.d.ts +0 -2
  618. package/dist/lib/active-org.test.d.ts.map +0 -1
  619. package/dist/lib/active-org.test.js +0 -147
  620. package/dist/lib/active-org.test.js.map +0 -1
  621. package/dist/lib/api-client.d.ts +0 -17
  622. package/dist/lib/api-client.d.ts.map +0 -1
  623. package/dist/lib/api-client.test.d.ts +0 -2
  624. package/dist/lib/api-client.test.d.ts.map +0 -1
  625. package/dist/lib/api-client.test.js +0 -161
  626. package/dist/lib/api-client.test.js.map +0 -1
  627. package/dist/lib/auth.d.ts +0 -27
  628. package/dist/lib/auth.d.ts.map +0 -1
  629. package/dist/lib/auth.test.d.ts +0 -2
  630. package/dist/lib/auth.test.d.ts.map +0 -1
  631. package/dist/lib/auth.test.js +0 -110
  632. package/dist/lib/auth.test.js.map +0 -1
  633. package/dist/lib/cron-registry.d.ts +0 -47
  634. package/dist/lib/cron-registry.d.ts.map +0 -1
  635. package/dist/lib/cron-registry.js +0 -102
  636. package/dist/lib/cron-registry.js.map +0 -1
  637. package/dist/lib/cron-registry.test.d.ts +0 -2
  638. package/dist/lib/cron-registry.test.d.ts.map +0 -1
  639. package/dist/lib/cron-registry.test.js +0 -136
  640. package/dist/lib/cron-registry.test.js.map +0 -1
  641. package/dist/lib/cron-runner.d.ts +0 -16
  642. package/dist/lib/cron-runner.d.ts.map +0 -1
  643. package/dist/lib/cron-runner.js +0 -68
  644. package/dist/lib/cron-runner.js.map +0 -1
  645. package/dist/lib/detect-languages.d.ts +0 -7
  646. package/dist/lib/detect-languages.d.ts.map +0 -1
  647. package/dist/lib/detect-languages.test.d.ts +0 -2
  648. package/dist/lib/detect-languages.test.d.ts.map +0 -1
  649. package/dist/lib/detect-languages.test.js +0 -29
  650. package/dist/lib/detect-languages.test.js.map +0 -1
  651. package/dist/lib/eval-analyzer.d.ts +0 -23
  652. package/dist/lib/eval-analyzer.d.ts.map +0 -1
  653. package/dist/lib/eval-benchmark.d.ts +0 -17
  654. package/dist/lib/eval-benchmark.d.ts.map +0 -1
  655. package/dist/lib/eval-conversation-handler.d.ts +0 -9
  656. package/dist/lib/eval-conversation-handler.d.ts.map +0 -1
  657. package/dist/lib/eval-executor.d.ts +0 -21
  658. package/dist/lib/eval-executor.d.ts.map +0 -1
  659. package/dist/lib/eval-executor.test.d.ts +0 -2
  660. package/dist/lib/eval-executor.test.d.ts.map +0 -1
  661. package/dist/lib/eval-executor.test.js +0 -8
  662. package/dist/lib/eval-executor.test.js.map +0 -1
  663. package/dist/lib/eval-grader.d.ts +0 -38
  664. package/dist/lib/eval-grader.d.ts.map +0 -1
  665. package/dist/lib/eval-grader.test.d.ts +0 -2
  666. package/dist/lib/eval-grader.test.d.ts.map +0 -1
  667. package/dist/lib/eval-grader.test.js +0 -8
  668. package/dist/lib/eval-grader.test.js.map +0 -1
  669. package/dist/lib/eval-meta-judge.d.ts +0 -28
  670. package/dist/lib/eval-meta-judge.d.ts.map +0 -1
  671. package/dist/lib/eval-trigger-tester.d.ts +0 -19
  672. package/dist/lib/eval-trigger-tester.d.ts.map +0 -1
  673. package/dist/lib/eval-worktree.d.ts +0 -11
  674. package/dist/lib/eval-worktree.d.ts.map +0 -1
  675. package/dist/lib/eval-worktree.test.d.ts +0 -2
  676. package/dist/lib/eval-worktree.test.d.ts.map +0 -1
  677. package/dist/lib/eval-worktree.test.js +0 -68
  678. package/dist/lib/eval-worktree.test.js.map +0 -1
  679. package/dist/lib/gateway-entry.d.ts +0 -3
  680. package/dist/lib/gateway-entry.d.ts.map +0 -1
  681. package/dist/lib/gateway-lifecycle.d.ts +0 -9
  682. package/dist/lib/gateway-lifecycle.d.ts.map +0 -1
  683. package/dist/lib/gateway.d.ts +0 -11
  684. package/dist/lib/gateway.d.ts.map +0 -1
  685. package/dist/lib/graphile-worker-runner.d.ts +0 -124
  686. package/dist/lib/graphile-worker-runner.d.ts.map +0 -1
  687. package/dist/lib/graphile-worker-runner.js +0 -530
  688. package/dist/lib/graphile-worker-runner.js.map +0 -1
  689. package/dist/lib/graphile-worker-runner.test.d.ts +0 -2
  690. package/dist/lib/graphile-worker-runner.test.d.ts.map +0 -1
  691. package/dist/lib/graphile-worker-runner.test.js +0 -153
  692. package/dist/lib/graphile-worker-runner.test.js.map +0 -1
  693. package/dist/lib/handlers/cron-close-stale-sessions.d.ts +0 -3
  694. package/dist/lib/handlers/cron-close-stale-sessions.d.ts.map +0 -1
  695. package/dist/lib/handlers/cron-data-integrity-audit.d.ts +0 -3
  696. package/dist/lib/handlers/cron-data-integrity-audit.d.ts.map +0 -1
  697. package/dist/lib/handlers/cron-refresh-skills.d.ts +0 -3
  698. package/dist/lib/handlers/cron-refresh-skills.d.ts.map +0 -1
  699. package/dist/lib/handlers/cron-refresh-skills.test.d.ts +0 -2
  700. package/dist/lib/handlers/cron-refresh-skills.test.d.ts.map +0 -1
  701. package/dist/lib/handlers/cron-refresh-skills.test.js +0 -114
  702. package/dist/lib/handlers/cron-refresh-skills.test.js.map +0 -1
  703. package/dist/lib/handlers/cron-regenerate-insights.d.ts +0 -3
  704. package/dist/lib/handlers/cron-regenerate-insights.d.ts.map +0 -1
  705. package/dist/lib/handlers/cron-regenerate-insights.js +0 -6
  706. package/dist/lib/handlers/cron-regenerate-insights.js.map +0 -1
  707. package/dist/lib/handlers/cron-suggest-instructions.d.ts +0 -3
  708. package/dist/lib/handlers/cron-suggest-instructions.d.ts.map +0 -1
  709. package/dist/lib/handlers/cron-suggest-instructions.test.d.ts +0 -2
  710. package/dist/lib/handlers/cron-suggest-instructions.test.d.ts.map +0 -1
  711. package/dist/lib/handlers/cron-suggest-instructions.test.js +0 -80
  712. package/dist/lib/handlers/cron-suggest-instructions.test.js.map +0 -1
  713. package/dist/lib/handlers/process-conversation.d.ts +0 -35
  714. package/dist/lib/handlers/process-conversation.d.ts.map +0 -1
  715. package/dist/lib/handlers/process-eval.d.ts +0 -32
  716. package/dist/lib/handlers/process-eval.d.ts.map +0 -1
  717. package/dist/lib/handlers/process-insights.d.ts +0 -39
  718. package/dist/lib/handlers/process-insights.d.ts.map +0 -1
  719. package/dist/lib/handlers/process-launch.d.ts +0 -29
  720. package/dist/lib/handlers/process-launch.d.ts.map +0 -1
  721. package/dist/lib/handlers/process-session-goal.d.ts +0 -29
  722. package/dist/lib/handlers/process-session-goal.d.ts.map +0 -1
  723. package/dist/lib/handlers/process-session-goal.test.d.ts +0 -2
  724. package/dist/lib/handlers/process-session-goal.test.d.ts.map +0 -1
  725. package/dist/lib/handlers/process-session-goal.test.js +0 -134
  726. package/dist/lib/handlers/process-session-goal.test.js.map +0 -1
  727. package/dist/lib/hooks-config.d.ts +0 -119
  728. package/dist/lib/hooks-config.d.ts.map +0 -1
  729. package/dist/lib/hooks-config.test.d.ts +0 -2
  730. package/dist/lib/hooks-config.test.d.ts.map +0 -1
  731. package/dist/lib/hooks-config.test.js +0 -231
  732. package/dist/lib/hooks-config.test.js.map +0 -1
  733. package/dist/lib/insights-prompts.d.ts +0 -13
  734. package/dist/lib/insights-prompts.d.ts.map +0 -1
  735. package/dist/lib/llm-client.d.ts +0 -26
  736. package/dist/lib/llm-client.d.ts.map +0 -1
  737. package/dist/lib/llm-client.test.d.ts +0 -2
  738. package/dist/lib/llm-client.test.d.ts.map +0 -1
  739. package/dist/lib/llm-client.test.js +0 -62
  740. package/dist/lib/llm-client.test.js.map +0 -1
  741. package/dist/lib/mirror-writer-db.d.ts +0 -12
  742. package/dist/lib/mirror-writer-db.d.ts.map +0 -1
  743. package/dist/lib/mirror-writer-db.js +0 -51
  744. package/dist/lib/mirror-writer-db.js.map +0 -1
  745. package/dist/lib/mirror-writer.d.ts +0 -35
  746. package/dist/lib/mirror-writer.d.ts.map +0 -1
  747. package/dist/lib/mirror-writer.js +0 -27
  748. package/dist/lib/mirror-writer.js.map +0 -1
  749. package/dist/lib/mirror-writer.test.d.ts +0 -2
  750. package/dist/lib/mirror-writer.test.d.ts.map +0 -1
  751. package/dist/lib/mirror-writer.test.js +0 -47
  752. package/dist/lib/mirror-writer.test.js.map +0 -1
  753. package/dist/lib/output.d.ts +0 -4
  754. package/dist/lib/output.d.ts.map +0 -1
  755. package/dist/lib/output.test.d.ts +0 -2
  756. package/dist/lib/output.test.d.ts.map +0 -1
  757. package/dist/lib/output.test.js +0 -71
  758. package/dist/lib/output.test.js.map +0 -1
  759. package/dist/lib/permanent-job-error.d.ts +0 -17
  760. package/dist/lib/permanent-job-error.d.ts.map +0 -1
  761. package/dist/lib/permanent-job-error.test.d.ts +0 -2
  762. package/dist/lib/permanent-job-error.test.d.ts.map +0 -1
  763. package/dist/lib/permanent-job-error.test.js +0 -29
  764. package/dist/lib/permanent-job-error.test.js.map +0 -1
  765. package/dist/lib/provider-aggregator.d.ts +0 -24
  766. package/dist/lib/provider-aggregator.d.ts.map +0 -1
  767. package/dist/lib/provider-aggregator.test.d.ts +0 -2
  768. package/dist/lib/provider-aggregator.test.d.ts.map +0 -1
  769. package/dist/lib/provider-aggregator.test.js +0 -103
  770. package/dist/lib/provider-aggregator.test.js.map +0 -1
  771. package/dist/lib/skills-loader.d.ts +0 -6
  772. package/dist/lib/skills-loader.d.ts.map +0 -1
  773. package/dist/lib/types.d.ts +0 -48
  774. package/dist/lib/types.d.ts.map +0 -1
  775. package/dist/lib/version-check.d.ts +0 -11
  776. package/dist/lib/version-check.d.ts.map +0 -1
  777. package/dist/test-helpers.d.ts +0 -58
  778. package/dist/test-helpers.d.ts.map +0 -1
  779. package/dist/test-helpers.js +0 -58
  780. package/dist/test-helpers.js.map +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/detect-languages.ts"],
4
+ "sourcesContent": ["import { existsSync, statSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\n\nconst EXCLUDE_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', '.next', '.turbo',\n '.worktrees', 'target', 'venv', '__pycache__', '.cache',\n]);\nconst MAX_DEPTH = 3;\n\n/**\n * Walk a directory up to MAX_DEPTH levels and collect filesystem signals.\n * Returns a deduplicated array of language names. Requires \u22652 distinct\n * signals before the caller scores; one signal is treated as insufficient.\n */\nexport function detectLanguages(projectPath: string): string[] {\n if (!existsSync(projectPath)) return [];\n const signals = new Set<string>();\n\n const walk = (dir: string, depth: number) => {\n if (depth > MAX_DEPTH) return;\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n\n // Inspect file markers at this level. Each marker contributes a *distinct*\n // signal so two files for the same language (e.g. pyproject.toml +\n // requirements.txt) clear the \u22652-signals minimum on their own.\n for (const name of entries) {\n if (name === 'package.json') signals.add('JavaScript/TypeScript');\n if (name === 'tsconfig.json') signals.add('TypeScript-config');\n if (name === 'pyproject.toml') signals.add('Python-pyproject');\n if (name === 'setup.py') signals.add('Python-setup');\n if (name === 'requirements.txt') signals.add('Python-requirements');\n if (name === 'Pipfile') signals.add('Python-pipfile');\n if (name === 'Cargo.toml') signals.add('Rust-cargo');\n if (name === 'go.mod') signals.add('Go-mod');\n if (name === 'pom.xml') signals.add('Java-pom');\n if (name === 'build.gradle' || name === 'build.gradle.kts') signals.add('Java-gradle');\n if (name === 'Gemfile') signals.add('Ruby-gemfile');\n if (name === 'composer.json') signals.add('PHP-composer');\n if (name.endsWith('.ts') || name.endsWith('.tsx')) signals.add('TypeScript-source');\n if (name.endsWith('.py')) signals.add('Python-source');\n if (name.endsWith('.rs')) signals.add('Rust-source');\n if (name.endsWith('.go')) signals.add('Go-source');\n }\n\n if (depth >= MAX_DEPTH) return;\n\n // Recurse into non-excluded subdirectories\n for (const name of entries) {\n if (EXCLUDE_DIRS.has(name)) continue;\n const full = path.join(dir, name);\n try {\n if (statSync(full).isDirectory()) walk(full, depth + 1);\n } catch {\n // skip unreadable\n }\n }\n };\n\n walk(projectPath, 0);\n\n // Collapse the raw signals into language names for the LLM prompt\n const result = new Set<string>();\n if (signals.has('TypeScript-source') || signals.has('TypeScript-config')) {\n result.add('TypeScript');\n } else if (signals.has('JavaScript/TypeScript')) {\n result.add('JavaScript');\n }\n if (\n signals.has('Python-pyproject') ||\n signals.has('Python-setup') ||\n signals.has('Python-requirements') ||\n signals.has('Python-pipfile') ||\n signals.has('Python-source')\n ) result.add('Python');\n if (signals.has('Rust-cargo') || signals.has('Rust-source')) result.add('Rust');\n if (signals.has('Go-mod') || signals.has('Go-source')) result.add('Go');\n if (signals.has('Java-pom') || signals.has('Java-gradle')) result.add('Java');\n if (signals.has('Ruby-gemfile')) result.add('Ruby');\n if (signals.has('PHP-composer')) result.add('PHP');\n\n // The minimum-2-signals gate counts the raw signals, not the\n // normalized language list. A package.json + tsconfig.json + .ts source\n // is three signals \u2192 strong evidence even though the language collapses\n // to one entry. A bare package.json with no .ts/.js source is one signal.\n if (signals.size < 2) return [];\n return [...result];\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,153 @@
1
+ // src/lib/statusline-shim.ts
2
+ import { writeFileSync, chmodSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { join } from "node:path";
5
+ var STATUSLINE_SHIM_PATH = join(homedir(), ".claude", "statusline-rulemetric.sh");
6
+ function writeStatuslineShim(prevCommand) {
7
+ const chainBlock = prevCommand ? `
8
+ # Chain to the original statusLine command so the user's prompt is preserved.
9
+ echo "$STDIN_PAYLOAD" | ${prevCommand}` : "";
10
+ const script = `#!/usr/bin/env bash
11
+ # RuleMetric statusline shim \u2014 auto-generated by \`rulemetric hooks install --statusline-usage\`
12
+ # Captures Claude Code rate_limits from statusline stdin and forwards to the research pipeline.
13
+ # DO NOT EDIT \u2014 re-run \`rulemetric hooks install --statusline-usage\` to regenerate.
14
+
15
+ set -euo pipefail
16
+
17
+ # Read stdin once (Claude Code closes the pipe after the payload).
18
+ STDIN_PAYLOAD="$(cat)"
19
+
20
+ # \u2500\u2500 Auth \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
21
+ CONFIG_ENV="$HOME/.config/rulemetric/env"
22
+ if [ -f "$CONFIG_ENV" ]; then
23
+ # shellcheck source=/dev/null
24
+ source "$CONFIG_ENV"
25
+ fi
26
+
27
+ API_URL="\${RULEMETRIC_API_URL:-https://rulemetric.com}"
28
+ AUTH_TOKEN="\${RULEMETRIC_ACCESS_TOKEN:-\${RULEMETRIC_API_KEY:-}}"
29
+
30
+ if [ -z "$AUTH_TOKEN" ]; then
31
+ # No auth \u2014 still chain so the user's statusline works.
32
+ ${chainBlock}
33
+ exit 0
34
+ fi
35
+
36
+ # \u2500\u2500 Extract + POST rate_limit windows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
37
+ if ! command -v jq &>/dev/null; then
38
+ # jq missing \u2014 chain and bail; don't break the user's statusline.
39
+ ${chainBlock}
40
+ exit 0
41
+ fi
42
+
43
+ OBSERVED_AT="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
44
+
45
+ for WIRE_KEY in five_hour seven_day seven_day_opus; do
46
+ # Map wire key \u2192 limit_type (case statement avoids bash 4 associative arrays).
47
+ case "$WIRE_KEY" in
48
+ five_hour) LIMIT_TYPE="five_hour_percent" ;;
49
+ seven_day) LIMIT_TYPE="seven_day_percent" ;;
50
+ seven_day_opus) LIMIT_TYPE="seven_day_opus_percent" ;;
51
+ *) continue ;;
52
+ esac
53
+
54
+ # Try both wire shapes:
55
+ # Legacy: { "rate_limits": { "five_hour": { "used_percentage": ..., "resets_at": ... } } }
56
+ # Current: { "five_hour": { "used_percentage": ..., "resets_at": ... } }
57
+ WINDOW="$(echo "$STDIN_PAYLOAD" | jq -c ".rate_limits.\${WIRE_KEY} // .\${WIRE_KEY} // empty" 2>/dev/null || true)"
58
+
59
+ if [ -z "$WINDOW" ] || [ "$WINDOW" = "null" ]; then
60
+ continue
61
+ fi
62
+
63
+ USED_PCT="$(echo "$WINDOW" | jq '.used_percentage // empty' 2>/dev/null || true)"
64
+ RESETS_AT_EPOCH="$(echo "$WINDOW" | jq '.resets_at // empty' 2>/dev/null || true)"
65
+
66
+ if [ -z "$USED_PCT" ] || [ "$USED_PCT" = "null" ]; then
67
+ continue
68
+ fi
69
+
70
+ # Convert unix epoch to ISO-8601 if present.
71
+ if [ -n "$RESETS_AT_EPOCH" ] && [ "$RESETS_AT_EPOCH" != "null" ]; then
72
+ RESETS_AT_ISO="$(date -u -r "$RESETS_AT_EPOCH" +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || date -u -d "@$RESETS_AT_EPOCH" +%Y-%m-%dT%H:%M:%SZ 2>/dev/null || echo "")"
73
+ else
74
+ RESETS_AT_ISO=""
75
+ fi
76
+
77
+ PAYLOAD="$(jq -nc \\
78
+ --arg provider "anthropic" \\
79
+ --arg plan "unknown" \\
80
+ --argjson value "$USED_PCT" \\
81
+ --arg limitType "$LIMIT_TYPE" \\
82
+ --arg observedAt "$OBSERVED_AT" \\
83
+ --arg resetsAt "$RESETS_AT_ISO" \\
84
+ '{
85
+ provider: $provider,
86
+ plan: $plan,
87
+ limitType: $limitType,
88
+ value: $value,
89
+ unit: "percentage",
90
+ comparator: "=",
91
+ sourceType: "oauth_usage",
92
+ sourceUrl: null,
93
+ confidence: 1.0,
94
+ observedAt: $observedAt,
95
+ resetsAt: (if $resetsAt == "" then null else $resetsAt end)
96
+ }')"
97
+
98
+ curl -sf -o /dev/null \\
99
+ -X POST "$API_URL/api/internal/research/observe" \\
100
+ -H "Content-Type: application/json" \\
101
+ -H "Authorization: Bearer $AUTH_TOKEN" \\
102
+ --max-time 3 \\
103
+ --data "$PAYLOAD" &
104
+ done
105
+
106
+ # Wait for background curls (non-blocking from Claude Code's perspective \u2014
107
+ # the shim itself exits promptly; curl jobs are fire-and-forget).
108
+ wait
109
+ ${chainBlock}
110
+ exit 0
111
+ `;
112
+ writeFileSync(STATUSLINE_SHIM_PATH, script, { encoding: "utf-8" });
113
+ chmodSync(STATUSLINE_SHIM_PATH, 493);
114
+ return STATUSLINE_SHIM_PATH;
115
+ }
116
+ var STATUSLINE_SETTINGS_VALUE = {
117
+ type: "command",
118
+ command: STATUSLINE_SHIM_PATH,
119
+ refreshInterval: 30
120
+ };
121
+ function readCurrentStatusLine(settings) {
122
+ const current = settings.statusLine;
123
+ if (!current) return void 0;
124
+ if (typeof current === "string") {
125
+ if (current === STATUSLINE_SHIM_PATH) return void 0;
126
+ return current;
127
+ }
128
+ if (typeof current === "object" && current !== null) {
129
+ const cmd = current.command;
130
+ if (typeof cmd !== "string") return void 0;
131
+ if (cmd === STATUSLINE_SHIM_PATH) return void 0;
132
+ return cmd;
133
+ }
134
+ return void 0;
135
+ }
136
+ function isStatuslineShimInstalled(settings) {
137
+ const current = settings.statusLine;
138
+ if (!current) return false;
139
+ if (typeof current === "string") return current === STATUSLINE_SHIM_PATH;
140
+ if (typeof current === "object" && current !== null) {
141
+ return current.command === STATUSLINE_SHIM_PATH;
142
+ }
143
+ return false;
144
+ }
145
+
146
+ export {
147
+ STATUSLINE_SHIM_PATH,
148
+ writeStatuslineShim,
149
+ STATUSLINE_SETTINGS_VALUE,
150
+ readCurrentStatusLine,
151
+ isStatuslineShimInstalled
152
+ };
153
+ //# sourceMappingURL=chunk-PHLMIZKM.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/statusline-shim.ts"],
4
+ "sourcesContent": ["import { existsSync, readFileSync, writeFileSync, chmodSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n// Path where the shim script lives \u2014 readable by the `statusLine` config key.\nexport const STATUSLINE_SHIM_PATH = join(homedir(), '.claude', 'statusline-rulemetric.sh');\n\n/**\n * Write ~/.claude/statusline-rulemetric.sh.\n *\n * The script is invoked by Claude Code on every statusline refresh cycle.\n * Claude Code feeds a JSON payload on stdin that includes `rate_limits`\n * (same shape as GET /api/oauth/usage) using its own in-memory token \u2014\n * so freshness is tied to the statusline cadence, not the proxy capturing\n * a stale keychain token.\n *\n * The script:\n * 1. Reads stdin once (Claude Code closes it after the payload).\n * 2. If jq is available, extracts each rate_limit window and POSTs it to\n * POST /api/internal/research/observe as an oauth_usage observation.\n * 3. If a `prevCommand` is supplied (the user's original statusLine value),\n * it is executed with the same stdin forwarded so the user's prompt text\n * is still displayed \u2014 we must chain, not replace.\n * 4. Exits 0 regardless so Claude Code always gets a clean statusline.\n *\n * Auth is read from the same priority chain as the hook scripts:\n * ~/.config/rulemetric/env (RULEMETRIC_ACCESS_TOKEN / RULEMETRIC_API_KEY)\n * RULEMETRIC_API_KEY / RULEMETRIC_ACCESS_TOKEN env vars\n *\n * Returns the path written.\n */\nexport function writeStatuslineShim(prevCommand?: string): string {\n const chainBlock = prevCommand\n ? `\n# Chain to the original statusLine command so the user's prompt is preserved.\necho \"$STDIN_PAYLOAD\" | ${prevCommand}`\n : '';\n\n const script = `#!/usr/bin/env bash\n# RuleMetric statusline shim \u2014 auto-generated by \\`rulemetric hooks install --statusline-usage\\`\n# Captures Claude Code rate_limits from statusline stdin and forwards to the research pipeline.\n# DO NOT EDIT \u2014 re-run \\`rulemetric hooks install --statusline-usage\\` to regenerate.\n\nset -euo pipefail\n\n# Read stdin once (Claude Code closes the pipe after the payload).\nSTDIN_PAYLOAD=\"$(cat)\"\n\n# \u2500\u2500 Auth \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCONFIG_ENV=\"$HOME/.config/rulemetric/env\"\nif [ -f \"$CONFIG_ENV\" ]; then\n # shellcheck source=/dev/null\n source \"$CONFIG_ENV\"\nfi\n\nAPI_URL=\"\\${RULEMETRIC_API_URL:-https://rulemetric.com}\"\nAUTH_TOKEN=\"\\${RULEMETRIC_ACCESS_TOKEN:-\\${RULEMETRIC_API_KEY:-}}\"\n\nif [ -z \"$AUTH_TOKEN\" ]; then\n # No auth \u2014 still chain so the user's statusline works.\n${chainBlock}\n exit 0\nfi\n\n# \u2500\u2500 Extract + POST rate_limit windows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nif ! command -v jq &>/dev/null; then\n # jq missing \u2014 chain and bail; don't break the user's statusline.\n${chainBlock}\n exit 0\nfi\n\nOBSERVED_AT=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"\n\nfor WIRE_KEY in five_hour seven_day seven_day_opus; do\n # Map wire key \u2192 limit_type (case statement avoids bash 4 associative arrays).\n case \"$WIRE_KEY\" in\n five_hour) LIMIT_TYPE=\"five_hour_percent\" ;;\n seven_day) LIMIT_TYPE=\"seven_day_percent\" ;;\n seven_day_opus) LIMIT_TYPE=\"seven_day_opus_percent\" ;;\n *) continue ;;\n esac\n\n # Try both wire shapes:\n # Legacy: { \"rate_limits\": { \"five_hour\": { \"used_percentage\": ..., \"resets_at\": ... } } }\n # Current: { \"five_hour\": { \"used_percentage\": ..., \"resets_at\": ... } }\n WINDOW=\"$(echo \"$STDIN_PAYLOAD\" | jq -c \".rate_limits.\\${WIRE_KEY} // .\\${WIRE_KEY} // empty\" 2>/dev/null || true)\"\n\n if [ -z \"$WINDOW\" ] || [ \"$WINDOW\" = \"null\" ]; then\n continue\n fi\n\n USED_PCT=\"$(echo \"$WINDOW\" | jq '.used_percentage // empty' 2>/dev/null || true)\"\n RESETS_AT_EPOCH=\"$(echo \"$WINDOW\" | jq '.resets_at // empty' 2>/dev/null || true)\"\n\n if [ -z \"$USED_PCT\" ] || [ \"$USED_PCT\" = \"null\" ]; then\n continue\n fi\n\n # Convert unix epoch to ISO-8601 if present.\n if [ -n \"$RESETS_AT_EPOCH\" ] && [ \"$RESETS_AT_EPOCH\" != \"null\" ]; then\n RESETS_AT_ISO=\"$(date -u -r \"$RESETS_AT_EPOCH\" +%Y-%m-%dT%H:%M:%SZ 2>/dev/null \\\n || date -u -d \"@$RESETS_AT_EPOCH\" +%Y-%m-%dT%H:%M:%SZ 2>/dev/null \\\n || echo \"\")\"\n else\n RESETS_AT_ISO=\"\"\n fi\n\n PAYLOAD=\"$(jq -nc \\\\\n --arg provider \"anthropic\" \\\\\n --arg plan \"unknown\" \\\\\n --argjson value \"$USED_PCT\" \\\\\n --arg limitType \"$LIMIT_TYPE\" \\\\\n --arg observedAt \"$OBSERVED_AT\" \\\\\n --arg resetsAt \"$RESETS_AT_ISO\" \\\\\n '{\n provider: $provider,\n plan: $plan,\n limitType: $limitType,\n value: $value,\n unit: \"percentage\",\n comparator: \"=\",\n sourceType: \"oauth_usage\",\n sourceUrl: null,\n confidence: 1.0,\n observedAt: $observedAt,\n resetsAt: (if $resetsAt == \"\" then null else $resetsAt end)\n }')\"\n\n curl -sf -o /dev/null \\\\\n -X POST \"$API_URL/api/internal/research/observe\" \\\\\n -H \"Content-Type: application/json\" \\\\\n -H \"Authorization: Bearer $AUTH_TOKEN\" \\\\\n --max-time 3 \\\\\n --data \"$PAYLOAD\" &\ndone\n\n# Wait for background curls (non-blocking from Claude Code's perspective \u2014\n# the shim itself exits promptly; curl jobs are fire-and-forget).\nwait\n${chainBlock}\nexit 0\n`;\n\n writeFileSync(STATUSLINE_SHIM_PATH, script, { encoding: 'utf-8' });\n chmodSync(STATUSLINE_SHIM_PATH, 0o755);\n return STATUSLINE_SHIM_PATH;\n}\n\n// The settings object shape for statusLine (Claude Code v1.x+).\nexport const STATUSLINE_SETTINGS_VALUE = {\n type: 'command' as const,\n command: STATUSLINE_SHIM_PATH,\n refreshInterval: 30,\n};\n\n/**\n * Read the current statusLine command from a settings object, if any.\n * Returns undefined if not set or already points to the shim (idempotent).\n * Handles both the legacy string form and the current object form.\n */\nexport function readCurrentStatusLine(\n settings: Record<string, unknown>,\n): string | undefined {\n const current = settings.statusLine;\n if (!current) return undefined;\n if (typeof current === 'string') {\n if (current === STATUSLINE_SHIM_PATH) return undefined;\n return current;\n }\n if (typeof current === 'object' && current !== null) {\n const cmd = (current as Record<string, unknown>).command;\n if (typeof cmd !== 'string') return undefined;\n if (cmd === STATUSLINE_SHIM_PATH) return undefined; // already installed\n return cmd;\n }\n return undefined;\n}\n\n/**\n * Returns true if the settings object already points to the shim.\n */\nexport function isStatuslineShimInstalled(settings: Record<string, unknown>): boolean {\n const current = settings.statusLine;\n if (!current) return false;\n if (typeof current === 'string') return current === STATUSLINE_SHIM_PATH;\n if (typeof current === 'object' && current !== null) {\n return (current as Record<string, unknown>).command === STATUSLINE_SHIM_PATH;\n }\n return false;\n}\n"],
5
+ "mappings": ";AAAA,SAAmC,eAAe,iBAAiB;AACnE,SAAS,eAAe;AACxB,SAAS,YAAY;AAGd,IAAM,uBAAuB,KAAK,QAAQ,GAAG,WAAW,0BAA0B;AA0BlF,SAAS,oBAAoB,aAA8B;AAChE,QAAM,aAAa,cACf;AAAA;AAAA,0BAEoB,WAAW,KAC/B;AAEJ,QAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBf,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwEV,UAAU;AAAA;AAAA;AAIV,gBAAc,sBAAsB,QAAQ,EAAE,UAAU,QAAQ,CAAC;AACjE,YAAU,sBAAsB,GAAK;AACrC,SAAO;AACT;AAGO,IAAM,4BAA4B;AAAA,EACvC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,iBAAiB;AACnB;AAOO,SAAS,sBACd,UACoB;AACpB,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,OAAO,YAAY,UAAU;AAC/B,QAAI,YAAY,qBAAsB,QAAO;AAC7C,WAAO;AAAA,EACT;AACA,MAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACnD,UAAM,MAAO,QAAoC;AACjD,QAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,QAAI,QAAQ,qBAAsB,QAAO;AACzC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKO,SAAS,0BAA0B,UAA4C;AACpF,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,OAAO,YAAY,SAAU,QAAO,YAAY;AACpD,MAAI,OAAO,YAAY,YAAY,YAAY,MAAM;AACnD,WAAQ,QAAoC,YAAY;AAAA,EAC1D;AACA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,92 @@
1
+ import {
2
+ apiGet,
3
+ apiPost
4
+ } from "./chunk-EJOI2ZGU.js";
5
+
6
+ // src/lib/eval-benchmark.ts
7
+ function computeStats(values) {
8
+ if (values.length === 0) return { mean: 0, stddev: 0, min: 0, max: 0 };
9
+ const mean = values.reduce((a, b) => a + b, 0) / values.length;
10
+ const variance = values.reduce((sum, v) => sum + (v - mean) ** 2, 0) / values.length;
11
+ return {
12
+ mean: Math.round(mean * 1e3) / 1e3,
13
+ stddev: Math.round(Math.sqrt(variance) * 1e3) / 1e3,
14
+ min: Math.min(...values),
15
+ max: Math.max(...values)
16
+ };
17
+ }
18
+ async function aggregateBenchmark(targetId, iteration) {
19
+ const iterQuery = iteration ? `&iteration=${iteration}` : "";
20
+ const PAGE = 100;
21
+ const runs = [];
22
+ for (let offset = 0; offset < 1e5; offset += PAGE) {
23
+ const page = await apiGet(
24
+ `/api/eval-targets/${targetId}/runs?limit=${PAGE}&offset=${offset}${iterQuery}`
25
+ );
26
+ runs.push(...page);
27
+ if (page.length < PAGE) break;
28
+ }
29
+ const completedRuns = runs.filter((r) => r.status === "completed");
30
+ if (completedRuns.length === 0) {
31
+ return { runSummary: {}, notes: ["No completed runs found"], totalRuns: 0 };
32
+ }
33
+ const byConfig = {};
34
+ for (const run of completedRuns) {
35
+ if (!byConfig[run.configuration]) byConfig[run.configuration] = [];
36
+ byConfig[run.configuration].push(run);
37
+ }
38
+ const runSummary = {};
39
+ const notes = [];
40
+ for (const [config, configRuns] of Object.entries(byConfig)) {
41
+ const passRates = configRuns.filter((r) => Object.keys(r.grading).length > 0).map((r) => r.grading.summary?.pass_rate ?? 0);
42
+ const durations = configRuns.map((r) => r.timing.duration_ms / 1e3).filter((v) => !isNaN(v));
43
+ const tokens = configRuns.map((r) => r.timing.total_tokens ?? 0).filter((v) => v > 0);
44
+ runSummary[config] = {};
45
+ if (passRates.length > 0) runSummary[config].pass_rate = computeStats(passRates);
46
+ if (durations.length > 0) runSummary[config].time_seconds = computeStats(durations);
47
+ if (tokens.length > 0) runSummary[config].tokens = computeStats(tokens);
48
+ }
49
+ if (runSummary.with_target && runSummary.without_target) {
50
+ const delta = {};
51
+ for (const metric of ["pass_rate", "time_seconds", "tokens"]) {
52
+ const withVal = runSummary.with_target[metric]?.mean ?? 0;
53
+ const withoutVal = runSummary.without_target[metric]?.mean ?? 0;
54
+ const diff = withVal - withoutVal;
55
+ delta[metric] = `${diff >= 0 ? "+" : ""}${Math.round(diff * 1e3) / 1e3}`;
56
+ }
57
+ runSummary.delta = delta;
58
+ const passRateDelta = (runSummary.with_target.pass_rate?.mean ?? 0) - (runSummary.without_target.pass_rate?.mean ?? 0);
59
+ if (passRateDelta > 0.1) {
60
+ notes.push(`Target improves pass rate by ${(passRateDelta * 100).toFixed(0)}%`);
61
+ } else if (passRateDelta < -0.1) {
62
+ notes.push(`Target decreases pass rate by ${(Math.abs(passRateDelta) * 100).toFixed(0)}%`);
63
+ } else {
64
+ notes.push("Target has minimal impact on pass rate");
65
+ }
66
+ const timeDelta = (runSummary.with_target.time_seconds?.mean ?? 0) - (runSummary.without_target.time_seconds?.mean ?? 0);
67
+ if (Math.abs(timeDelta) > 5) {
68
+ notes.push(`Target ${timeDelta > 0 ? "adds" : "saves"} ${Math.abs(timeDelta).toFixed(1)}s average execution time`);
69
+ }
70
+ }
71
+ for (const [config, stats] of Object.entries(runSummary)) {
72
+ if (config === "delta") continue;
73
+ const passRate = stats.pass_rate;
74
+ if (passRate && passRate.stddev > 0.2) {
75
+ notes.push(`${config} shows high pass rate variance (stddev=${passRate.stddev.toFixed(2)}) \u2014 results may be unreliable`);
76
+ }
77
+ }
78
+ return { runSummary, notes, totalRuns: completedRuns.length };
79
+ }
80
+ async function postBenchmark(targetId, iteration, result) {
81
+ return apiPost(`/api/eval-targets/${targetId}/benchmarks`, {
82
+ iteration,
83
+ runSummary: result.runSummary,
84
+ notes: result.notes
85
+ });
86
+ }
87
+
88
+ export {
89
+ aggregateBenchmark,
90
+ postBenchmark
91
+ };
92
+ //# sourceMappingURL=chunk-PQU7GZ7A.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/eval-benchmark.ts"],
4
+ "sourcesContent": ["import { apiGet, apiPost } from './api-client.js';\n\ninterface EvalRun {\n id: string;\n evalId: string;\n evalTargetId: string;\n evalTargetVersion: number;\n configuration: string;\n runNumber: number;\n iteration: number;\n status: string;\n outputs: Record<string, unknown>;\n timing: Record<string, unknown>;\n grading: Record<string, unknown>;\n createdAt: string;\n}\n\ninterface Stats {\n mean: number;\n stddev: number;\n min: number;\n max: number;\n}\n\nfunction computeStats(values: number[]): Stats {\n if (values.length === 0) return { mean: 0, stddev: 0, min: 0, max: 0 };\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n const variance = values.reduce((sum, v) => sum + (v - mean) ** 2, 0) / values.length;\n return {\n mean: Math.round(mean * 1000) / 1000,\n stddev: Math.round(Math.sqrt(variance) * 1000) / 1000,\n min: Math.min(...values),\n max: Math.max(...values),\n };\n}\n\nexport interface BenchmarkResult {\n runSummary: Record<string, Record<string, Stats>>;\n notes: string[];\n totalRuns: number;\n}\n\nexport async function aggregateBenchmark(\n targetId: string,\n iteration?: number,\n): Promise<BenchmarkResult> {\n // Page through ALL runs. The list endpoint caps each page at 100; aggregating\n // over a single truncated page would skew the with/without delta (regression\n // guard \u2014 the 50-row default cap was added 2026-06-22).\n const iterQuery = iteration ? `&iteration=${iteration}` : '';\n const PAGE = 100;\n const runs: EvalRun[] = [];\n for (let offset = 0; offset < 100_000; offset += PAGE) {\n const page = await apiGet<EvalRun[]>(\n `/api/eval-targets/${targetId}/runs?limit=${PAGE}&offset=${offset}${iterQuery}`,\n );\n runs.push(...page);\n if (page.length < PAGE) break;\n }\n\n const completedRuns = runs.filter((r) => r.status === 'completed');\n\n if (completedRuns.length === 0) {\n return { runSummary: {}, notes: ['No completed runs found'], totalRuns: 0 };\n }\n\n // Group by configuration\n const byConfig: Record<string, EvalRun[]> = {};\n for (const run of completedRuns) {\n if (!byConfig[run.configuration]) byConfig[run.configuration] = [];\n byConfig[run.configuration].push(run);\n }\n\n const runSummary: Record<string, Record<string, Stats>> = {};\n const notes: string[] = [];\n\n for (const [config, configRuns] of Object.entries(byConfig)) {\n const passRates = configRuns\n .filter((r) => Object.keys(r.grading).length > 0)\n .map((r) => (r.grading as any).summary?.pass_rate ?? 0);\n const durations = configRuns\n .map((r) => (r.timing as any).duration_ms / 1000)\n .filter((v) => !isNaN(v));\n const tokens = configRuns\n .map((r) => (r.timing as any).total_tokens ?? 0)\n .filter((v) => v > 0);\n\n runSummary[config] = {};\n if (passRates.length > 0) runSummary[config].pass_rate = computeStats(passRates);\n if (durations.length > 0) runSummary[config].time_seconds = computeStats(durations);\n if (tokens.length > 0) runSummary[config].tokens = computeStats(tokens);\n }\n\n // Compute delta if both configurations exist\n if (runSummary.with_target && runSummary.without_target) {\n const delta: Record<string, string> = {};\n for (const metric of ['pass_rate', 'time_seconds', 'tokens']) {\n const withVal = runSummary.with_target[metric]?.mean ?? 0;\n const withoutVal = runSummary.without_target[metric]?.mean ?? 0;\n const diff = withVal - withoutVal;\n delta[metric] = `${diff >= 0 ? '+' : ''}${Math.round(diff * 1000) / 1000}`;\n }\n (runSummary as any).delta = delta;\n\n // Generate analysis notes\n const passRateDelta = (runSummary.with_target.pass_rate?.mean ?? 0) - (runSummary.without_target.pass_rate?.mean ?? 0);\n if (passRateDelta > 0.1) {\n notes.push(`Target improves pass rate by ${(passRateDelta * 100).toFixed(0)}%`);\n } else if (passRateDelta < -0.1) {\n notes.push(`Target decreases pass rate by ${(Math.abs(passRateDelta) * 100).toFixed(0)}%`);\n } else {\n notes.push('Target has minimal impact on pass rate');\n }\n\n const timeDelta = (runSummary.with_target.time_seconds?.mean ?? 0) - (runSummary.without_target.time_seconds?.mean ?? 0);\n if (Math.abs(timeDelta) > 5) {\n notes.push(`Target ${timeDelta > 0 ? 'adds' : 'saves'} ${Math.abs(timeDelta).toFixed(1)}s average execution time`);\n }\n }\n\n // Check for high variance\n for (const [config, stats] of Object.entries(runSummary)) {\n if (config === 'delta') continue;\n const passRate = stats.pass_rate;\n if (passRate && passRate.stddev > 0.2) {\n notes.push(`${config} shows high pass rate variance (stddev=${passRate.stddev.toFixed(2)}) \u2014 results may be unreliable`);\n }\n }\n\n return { runSummary, notes, totalRuns: completedRuns.length };\n}\n\nexport async function postBenchmark(\n targetId: string,\n iteration: number,\n result: BenchmarkResult,\n): Promise<{ id: string }> {\n return apiPost<{ id: string }>(`/api/eval-targets/${targetId}/benchmarks`, {\n iteration,\n runSummary: result.runSummary,\n notes: result.notes,\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,196 @@
1
+ // src/lib/gateway.ts
2
+ import { spawn } from "node:child_process";
3
+ import * as fs from "node:fs";
4
+ import * as http from "node:http";
5
+ import * as net from "node:net";
6
+ import * as os from "node:os";
7
+ import * as path from "node:path";
8
+ var GATEWAY_PORT = 8787;
9
+ var MITMPROXY_PORT = 8788;
10
+ var HEALTH_INTERVAL = 3e3;
11
+ var HEALTH_TIMEOUT = 500;
12
+ var RESTART_COOLDOWN_MS = 6e4;
13
+ var VERSION_FILE = path.join(os.homedir(), ".config", "rulemetric", "proxy-addon.version");
14
+ var isProxyAlive = false;
15
+ var lastSeenAddonVersion = null;
16
+ var lastRestartAt = 0;
17
+ function log(msg) {
18
+ const ts = (/* @__PURE__ */ new Date()).toISOString();
19
+ console.log(`[${ts}] ${msg}`);
20
+ }
21
+ function readAddonVersion() {
22
+ try {
23
+ return fs.readFileSync(VERSION_FILE, "utf-8").trim() || null;
24
+ } catch {
25
+ return null;
26
+ }
27
+ }
28
+ function maybeRestartOnDrift(gatewayCliVersion, cliEntry) {
29
+ if (gatewayCliVersion === "unknown" || !cliEntry) return;
30
+ const addonVersion = readAddonVersion();
31
+ if (!addonVersion || addonVersion === "unknown") return;
32
+ if (addonVersion === lastSeenAddonVersion) return;
33
+ lastSeenAddonVersion = addonVersion;
34
+ if (addonVersion === gatewayCliVersion) {
35
+ log(`addon version matches gateway (${gatewayCliVersion})`);
36
+ return;
37
+ }
38
+ const sinceLast = Date.now() - lastRestartAt;
39
+ if (sinceLast < RESTART_COOLDOWN_MS) {
40
+ log(
41
+ `addon version drift (gateway=${gatewayCliVersion}, addon=${addonVersion}); restart cooldown active (${Math.round((RESTART_COOLDOWN_MS - sinceLast) / 1e3)}s left)`
42
+ );
43
+ return;
44
+ }
45
+ log(
46
+ `addon version drift detected (gateway=${gatewayCliVersion}, addon=${addonVersion}). Restarting proxy to pick up latest code.`
47
+ );
48
+ lastRestartAt = Date.now();
49
+ try {
50
+ const child = spawn(process.execPath, [cliEntry, "proxy", "restart"], {
51
+ detached: true,
52
+ stdio: "ignore"
53
+ });
54
+ child.unref();
55
+ } catch (err) {
56
+ log(`restart spawn failed: ${err.message}`);
57
+ }
58
+ }
59
+ function checkProxyHealth(mitmproxyPort) {
60
+ const sock = net.connect({ port: mitmproxyPort, timeout: HEALTH_TIMEOUT });
61
+ sock.on("connect", () => {
62
+ sock.destroy();
63
+ if (!isProxyAlive) {
64
+ isProxyAlive = true;
65
+ log(`mitmproxy up on :${mitmproxyPort}, routing through proxy`);
66
+ }
67
+ });
68
+ sock.on("error", () => {
69
+ if (isProxyAlive) {
70
+ isProxyAlive = false;
71
+ log(`mitmproxy down on :${mitmproxyPort}, routing direct`);
72
+ }
73
+ });
74
+ sock.on("timeout", () => {
75
+ sock.destroy();
76
+ if (isProxyAlive) {
77
+ isProxyAlive = false;
78
+ log(`mitmproxy timeout on :${mitmproxyPort}, routing direct`);
79
+ }
80
+ });
81
+ }
82
+ function handleConnect(req, clientSocket, head, mitmproxyPort) {
83
+ const [targetHost, targetPortStr] = (req.url ?? "").split(":");
84
+ const targetPort = parseInt(targetPortStr, 10) || 443;
85
+ if (isProxyAlive) {
86
+ const proxySocket = net.connect({ port: mitmproxyPort, host: "127.0.0.1" });
87
+ proxySocket.on("connect", () => {
88
+ proxySocket.write(
89
+ `CONNECT ${req.url} HTTP/1.1\r
90
+ Host: ${req.url}\r
91
+ \r
92
+ `
93
+ );
94
+ });
95
+ let responseBuffer = Buffer.alloc(0);
96
+ const onData = (chunk) => {
97
+ responseBuffer = Buffer.concat([responseBuffer, chunk]);
98
+ const responseStr = responseBuffer.toString();
99
+ if (responseStr.includes("\r\n\r\n")) {
100
+ proxySocket.removeListener("data", onData);
101
+ clientSocket.write("HTTP/1.1 200 Connection Established\r\n\r\n");
102
+ if (head.length > 0) proxySocket.write(head);
103
+ clientSocket.pipe(proxySocket);
104
+ proxySocket.pipe(clientSocket);
105
+ }
106
+ };
107
+ proxySocket.on("data", onData);
108
+ proxySocket.on("error", (err) => {
109
+ log(`proxy socket error for ${req.url}: ${err.message}, falling back to direct`);
110
+ connectDirect(req, clientSocket, head, targetHost, targetPort);
111
+ });
112
+ clientSocket.on("error", () => {
113
+ proxySocket.destroy();
114
+ });
115
+ } else {
116
+ connectDirect(req, clientSocket, head, targetHost, targetPort);
117
+ }
118
+ }
119
+ function connectDirect(req, clientSocket, head, targetHost, targetPort) {
120
+ const upstream = net.connect({ port: targetPort, host: targetHost });
121
+ upstream.on("connect", () => {
122
+ clientSocket.write("HTTP/1.1 200 Connection Established\r\n\r\n");
123
+ if (head.length > 0) upstream.write(head);
124
+ clientSocket.pipe(upstream);
125
+ upstream.pipe(clientSocket);
126
+ });
127
+ upstream.on("error", (err) => {
128
+ log(`upstream error for ${req.url}: ${err.message}`);
129
+ clientSocket.end("HTTP/1.1 502 Bad Gateway\r\n\r\n");
130
+ });
131
+ clientSocket.on("error", () => {
132
+ upstream.destroy();
133
+ });
134
+ }
135
+ function handleRequest(req, res, mitmproxyPort) {
136
+ const targetUrl = req.url ?? "";
137
+ let parsedUrl;
138
+ try {
139
+ parsedUrl = new URL(targetUrl);
140
+ } catch {
141
+ res.writeHead(400);
142
+ res.end("Bad Request");
143
+ return;
144
+ }
145
+ const options = {
146
+ hostname: isProxyAlive ? "127.0.0.1" : parsedUrl.hostname,
147
+ port: isProxyAlive ? mitmproxyPort : parseInt(parsedUrl.port, 10) || 80,
148
+ path: isProxyAlive ? targetUrl : parsedUrl.pathname + parsedUrl.search,
149
+ method: req.method,
150
+ headers: req.headers
151
+ };
152
+ const proxyReq = http.request(options, (proxyRes) => {
153
+ res.writeHead(proxyRes.statusCode ?? 502, proxyRes.headers);
154
+ proxyRes.pipe(res);
155
+ });
156
+ proxyReq.on("error", (err) => {
157
+ log(`HTTP proxy error for ${targetUrl}: ${err.message}`);
158
+ res.writeHead(502);
159
+ res.end("Bad Gateway");
160
+ });
161
+ req.pipe(proxyReq);
162
+ }
163
+ function startGateway(port = GATEWAY_PORT, mitmproxyPort = MITMPROXY_PORT, options = {}) {
164
+ const cliVersion = options.cliVersion ?? process.env.RULEMETRIC_CLI_VERSION ?? "unknown";
165
+ const cliEntry = options.cliEntry ?? process.env.RULEMETRIC_CLI_ENTRY ?? null;
166
+ const server = http.createServer((req, res) => {
167
+ handleRequest(req, res, mitmproxyPort);
168
+ });
169
+ server.on("connect", (req, clientSocket, head) => {
170
+ handleConnect(req, clientSocket, head, mitmproxyPort);
171
+ });
172
+ server.on("clientError", (_err, socket) => {
173
+ if (socket.writable) {
174
+ socket.end("HTTP/1.1 400 Bad Request\r\n\r\n");
175
+ }
176
+ });
177
+ const healthInterval = setInterval(() => {
178
+ checkProxyHealth(mitmproxyPort);
179
+ maybeRestartOnDrift(cliVersion, cliEntry);
180
+ }, HEALTH_INTERVAL);
181
+ checkProxyHealth(mitmproxyPort);
182
+ maybeRestartOnDrift(cliVersion, cliEntry);
183
+ server.listen(port, "127.0.0.1", () => {
184
+ log(
185
+ `gateway listening on 127.0.0.1:${port} (mitmproxy target: :${mitmproxyPort}, cli version: ${cliVersion})`
186
+ );
187
+ });
188
+ return { server, healthInterval };
189
+ }
190
+
191
+ export {
192
+ GATEWAY_PORT,
193
+ MITMPROXY_PORT,
194
+ startGateway
195
+ };
196
+ //# sourceMappingURL=chunk-PXVQLD7S.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/gateway.ts"],
4
+ "sourcesContent": ["/**\n * Resilient HTTP proxy gateway that always accepts connections on GATEWAY_PORT.\n * Routes through mitmproxy when it's alive, direct to upstream when it's not.\n */\nimport { spawn } from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as http from 'node:http';\nimport * as net from 'node:net';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nexport const GATEWAY_PORT = 8787;\nexport const MITMPROXY_PORT = 8788;\nconst HEALTH_INTERVAL = 3000;\nconst HEALTH_TIMEOUT = 500;\n// Floor on auto-restarts so a misconfigured drift can't trigger a restart\n// loop. Plenty long for the user to fix any underlying problem manually.\nconst RESTART_COOLDOWN_MS = 60_000;\nconst VERSION_FILE = path.join(os.homedir(), '.config', 'rulemetric', 'proxy-addon.version');\n\nlet isProxyAlive = false;\nlet lastState: boolean | null = null;\n// Drift state \u2014 tracked across health-check ticks. lastSeenAddonVersion is\n// what the file said last time we read it; lastRestartAt prevents loops.\nlet lastSeenAddonVersion: string | null = null;\nlet lastRestartAt = 0;\n\nfunction log(msg: string): void {\n const ts = new Date().toISOString();\n console.log(`[${ts}] ${msg}`);\n}\n\nfunction readAddonVersion(): string | null {\n try {\n return fs.readFileSync(VERSION_FILE, 'utf-8').trim() || null;\n } catch {\n // File may not exist yet (proxy not started, or older addon that doesn't\n // write the file). Returning null disables drift checks for this tick.\n return null;\n }\n}\n\nfunction maybeRestartOnDrift(gatewayCliVersion: string, cliEntry: string | null): void {\n // No reference version means we can't compare \u2014 skip.\n if (gatewayCliVersion === 'unknown' || !cliEntry) return;\n const addonVersion = readAddonVersion();\n if (!addonVersion || addonVersion === 'unknown') return;\n // Same as last tick \u2014 nothing changed, no need to log or act.\n if (addonVersion === lastSeenAddonVersion) return;\n lastSeenAddonVersion = addonVersion;\n\n if (addonVersion === gatewayCliVersion) {\n // Drift cleared (e.g. proxy was just restarted). Quiet log, no action.\n log(`addon version matches gateway (${gatewayCliVersion})`);\n return;\n }\n\n const sinceLast = Date.now() - lastRestartAt;\n if (sinceLast < RESTART_COOLDOWN_MS) {\n log(\n `addon version drift (gateway=${gatewayCliVersion}, addon=${addonVersion}); ` +\n `restart cooldown active (${Math.round((RESTART_COOLDOWN_MS - sinceLast) / 1000)}s left)`,\n );\n return;\n }\n\n log(\n `addon version drift detected (gateway=${gatewayCliVersion}, addon=${addonVersion}). ` +\n `Restarting proxy to pick up latest code.`,\n );\n lastRestartAt = Date.now();\n // Detached spawn \u2014 we don't want the gateway to block on the restart\n // completing. Output goes to /dev/null; the proxy.log captures the\n // restart events from mitmproxy itself.\n try {\n const child = spawn(process.execPath, [cliEntry, 'proxy', 'restart'], {\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n } catch (err) {\n log(`restart spawn failed: ${(err as Error).message}`);\n }\n}\n\nfunction checkProxyHealth(mitmproxyPort: number): void {\n const sock = net.connect({ port: mitmproxyPort, timeout: HEALTH_TIMEOUT });\n sock.on('connect', () => {\n sock.destroy();\n if (!isProxyAlive) {\n isProxyAlive = true;\n log(`mitmproxy up on :${mitmproxyPort}, routing through proxy`);\n }\n });\n sock.on('error', () => {\n if (isProxyAlive) {\n isProxyAlive = false;\n log(`mitmproxy down on :${mitmproxyPort}, routing direct`);\n }\n });\n sock.on('timeout', () => {\n sock.destroy();\n if (isProxyAlive) {\n isProxyAlive = false;\n log(`mitmproxy timeout on :${mitmproxyPort}, routing direct`);\n }\n });\n}\n\nfunction handleConnect(\n req: http.IncomingMessage,\n clientSocket: net.Socket,\n head: Buffer,\n mitmproxyPort: number,\n): void {\n const [targetHost, targetPortStr] = (req.url ?? '').split(':');\n const targetPort = parseInt(targetPortStr, 10) || 443;\n\n if (isProxyAlive) {\n // Forward CONNECT to mitmproxy\n const proxySocket = net.connect({ port: mitmproxyPort, host: '127.0.0.1' });\n\n proxySocket.on('connect', () => {\n // Send the CONNECT request to mitmproxy\n proxySocket.write(\n `CONNECT ${req.url} HTTP/1.1\\r\\nHost: ${req.url}\\r\\n\\r\\n`,\n );\n });\n\n // Wait for mitmproxy's 200 response before piping\n let responseBuffer = Buffer.alloc(0);\n const onData = (chunk: Buffer) => {\n responseBuffer = Buffer.concat([responseBuffer, chunk]);\n const responseStr = responseBuffer.toString();\n if (responseStr.includes('\\r\\n\\r\\n')) {\n proxySocket.removeListener('data', onData);\n // Forward the 200 to client\n clientSocket.write('HTTP/1.1 200 Connection Established\\r\\n\\r\\n');\n // Pipe remaining data and head\n if (head.length > 0) proxySocket.write(head);\n clientSocket.pipe(proxySocket);\n proxySocket.pipe(clientSocket);\n }\n };\n proxySocket.on('data', onData);\n\n proxySocket.on('error', (err) => {\n log(`proxy socket error for ${req.url}: ${err.message}, falling back to direct`);\n // Mitmproxy failed mid-connect, fall back to direct\n connectDirect(req, clientSocket, head, targetHost, targetPort);\n });\n\n clientSocket.on('error', () => {\n proxySocket.destroy();\n });\n } else {\n connectDirect(req, clientSocket, head, targetHost, targetPort);\n }\n}\n\nfunction connectDirect(\n req: http.IncomingMessage,\n clientSocket: net.Socket,\n head: Buffer,\n targetHost: string,\n targetPort: number,\n): void {\n const upstream = net.connect({ port: targetPort, host: targetHost });\n\n upstream.on('connect', () => {\n clientSocket.write('HTTP/1.1 200 Connection Established\\r\\n\\r\\n');\n if (head.length > 0) upstream.write(head);\n clientSocket.pipe(upstream);\n upstream.pipe(clientSocket);\n });\n\n upstream.on('error', (err) => {\n log(`upstream error for ${req.url}: ${err.message}`);\n clientSocket.end('HTTP/1.1 502 Bad Gateway\\r\\n\\r\\n');\n });\n\n clientSocket.on('error', () => {\n upstream.destroy();\n });\n}\n\nfunction handleRequest(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n mitmproxyPort: number,\n): void {\n // Plain HTTP proxy (non-CONNECT)\n const targetUrl = req.url ?? '';\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(targetUrl);\n } catch {\n res.writeHead(400);\n res.end('Bad Request');\n return;\n }\n\n const options: http.RequestOptions = {\n hostname: isProxyAlive ? '127.0.0.1' : parsedUrl.hostname,\n port: isProxyAlive ? mitmproxyPort : (parseInt(parsedUrl.port, 10) || 80),\n path: isProxyAlive ? targetUrl : parsedUrl.pathname + parsedUrl.search,\n method: req.method,\n headers: req.headers,\n };\n\n const proxyReq = http.request(options, (proxyRes) => {\n res.writeHead(proxyRes.statusCode ?? 502, proxyRes.headers);\n proxyRes.pipe(res);\n });\n\n proxyReq.on('error', (err) => {\n log(`HTTP proxy error for ${targetUrl}: ${err.message}`);\n res.writeHead(502);\n res.end('Bad Gateway');\n });\n\n req.pipe(proxyReq);\n}\n\nexport function startGateway(\n port: number = GATEWAY_PORT,\n mitmproxyPort: number = MITMPROXY_PORT,\n options: { cliVersion?: string; cliEntry?: string } = {},\n): { server: http.Server; healthInterval: NodeJS.Timeout } {\n const cliVersion = options.cliVersion ?? process.env.RULEMETRIC_CLI_VERSION ?? 'unknown';\n const cliEntry = options.cliEntry ?? process.env.RULEMETRIC_CLI_ENTRY ?? null;\n const server = http.createServer((req, res) => {\n handleRequest(req, res, mitmproxyPort);\n });\n\n server.on('connect', (req, clientSocket, head) => {\n handleConnect(req, clientSocket as net.Socket, head as Buffer, mitmproxyPort);\n });\n\n // Don't crash on client socket errors\n server.on('clientError', (_err, socket) => {\n if (socket.writable) {\n socket.end('HTTP/1.1 400 Bad Request\\r\\n\\r\\n');\n }\n });\n\n const healthInterval = setInterval(() => {\n checkProxyHealth(mitmproxyPort);\n maybeRestartOnDrift(cliVersion, cliEntry);\n }, HEALTH_INTERVAL);\n\n // Do an immediate check\n checkProxyHealth(mitmproxyPort);\n maybeRestartOnDrift(cliVersion, cliEntry);\n\n server.listen(port, '127.0.0.1', () => {\n log(\n `gateway listening on 127.0.0.1:${port} (mitmproxy target: :${mitmproxyPort}, ` +\n `cli version: ${cliVersion})`,\n );\n });\n\n return { server, healthInterval };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,79 @@
1
+ import {
2
+ toolLabel
3
+ } from "./chunk-RH7NHVSK.js";
4
+ import {
5
+ DIM,
6
+ GREEN,
7
+ ORANGE,
8
+ RED
9
+ } from "./chunk-QJQS6TUN.js";
10
+
11
+ // src/dashboard/launcher/ActiveJobsList.tsx
12
+ import { Box, Text } from "ink";
13
+ import { jsx, jsxs } from "react/jsx-runtime";
14
+ var STATUS_GLYPH = {
15
+ pending: { glyph: "\u25CC", color: DIM },
16
+ queued: { glyph: "\u25CC", color: DIM },
17
+ running: { glyph: "\u25CF", color: ORANGE },
18
+ completed: { glyph: "\u2713", color: GREEN },
19
+ failed: { glyph: "\u2717", color: RED },
20
+ cancelled: { glyph: "\u2298", color: DIM }
21
+ };
22
+ function ago(iso) {
23
+ const ms = Date.now() - new Date(iso).getTime();
24
+ const m = Math.floor(ms / 6e4);
25
+ if (m < 1) return "now";
26
+ if (m < 60) return `${m}m`;
27
+ const h = Math.floor(m / 60);
28
+ if (h < 24) return `${h}h`;
29
+ return `${Math.floor(h / 24)}d`;
30
+ }
31
+ function ActiveJobsList({
32
+ jobs,
33
+ selectedIndex,
34
+ focused
35
+ }) {
36
+ if (jobs.length === 0) {
37
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 1, children: [
38
+ /* @__PURE__ */ jsx(Text, { bold: true, color: ORANGE, children: "\u25BC Active jobs" }),
39
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: " (no jobs yet \u2014 press tab to focus the form below)" })
40
+ ] });
41
+ }
42
+ return /* @__PURE__ */ jsxs(Box, { flexDirection: "column", paddingX: 1, children: [
43
+ /* @__PURE__ */ jsxs(Text, { bold: true, color: ORANGE, children: [
44
+ "\u25BC Active jobs (last ",
45
+ jobs.length,
46
+ ")"
47
+ ] }),
48
+ jobs.map((j, i) => {
49
+ const sel = focused && i === selectedIndex;
50
+ const sg = STATUS_GLYPH[j.status] ?? { glyph: "?", color: DIM };
51
+ const project = j.config?.projectPath ?? "";
52
+ const prompt = (j.config?.prompt ?? "").slice(0, 30);
53
+ return /* @__PURE__ */ jsxs(Text, { wrap: "truncate-end", children: [
54
+ /* @__PURE__ */ jsx(Text, { color: sel ? ORANGE : DIM, children: sel ? "\u25B6 " : " " }),
55
+ /* @__PURE__ */ jsxs(Text, { color: sg.color, children: [
56
+ sg.glyph,
57
+ " "
58
+ ] }),
59
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: j.status.padEnd(10) }),
60
+ /* @__PURE__ */ jsx(Text, { children: toolLabel(j.tool).padEnd(14) }),
61
+ /* @__PURE__ */ jsx(Text, { dimColor: true, children: project.padEnd(28) }),
62
+ /* @__PURE__ */ jsxs(Text, { children: [
63
+ '"',
64
+ prompt,
65
+ '"'
66
+ ] }),
67
+ /* @__PURE__ */ jsxs(Text, { dimColor: true, children: [
68
+ " ",
69
+ ago(j.createdAt)
70
+ ] })
71
+ ] }, j.id);
72
+ })
73
+ ] });
74
+ }
75
+
76
+ export {
77
+ ActiveJobsList
78
+ };
79
+ //# sourceMappingURL=chunk-QD6X4L4L.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/dashboard/launcher/ActiveJobsList.tsx"],
4
+ "sourcesContent": ["import React from 'react';\nimport { Box, Text } from 'ink';\nimport { ORANGE, DIM, GREEN, RED } from '../types.js';\nimport { toolLabel } from './tool-labels.js';\nimport type { LaunchJob } from './types.js';\n\nconst STATUS_GLYPH: Record<string, { glyph: string; color: string }> = {\n pending: { glyph: '\u25CC', color: DIM },\n queued: { glyph: '\u25CC', color: DIM },\n running: { glyph: '\u25CF', color: ORANGE },\n completed: { glyph: '\u2713', color: GREEN },\n failed: { glyph: '\u2717', color: RED },\n cancelled: { glyph: '\u2298', color: DIM },\n};\n\nfunction ago(iso: string): string {\n const ms = Date.now() - new Date(iso).getTime();\n const m = Math.floor(ms / 60_000);\n if (m < 1) return 'now';\n if (m < 60) return `${m}m`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h`;\n return `${Math.floor(h / 24)}d`;\n}\n\nexport function ActiveJobsList({\n jobs,\n selectedIndex,\n focused,\n}: {\n jobs: LaunchJob[];\n selectedIndex: number;\n focused: boolean;\n}) {\n if (jobs.length === 0) {\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold color={ORANGE}>\u25BC Active jobs</Text>\n <Text dimColor> (no jobs yet \u2014 press tab to focus the form below)</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Text bold color={ORANGE}>\u25BC Active jobs (last {jobs.length})</Text>\n {jobs.map((j, i) => {\n const sel = focused && i === selectedIndex;\n const sg = STATUS_GLYPH[j.status] ?? { glyph: '?', color: DIM };\n const project = j.config?.projectPath ?? '';\n const prompt = (j.config?.prompt ?? '').slice(0, 30);\n return (\n <Text key={j.id} wrap=\"truncate-end\">\n <Text color={sel ? ORANGE : DIM}>{sel ? '\u25B6 ' : ' '}</Text>\n <Text color={sg.color}>{sg.glyph} </Text>\n <Text dimColor>{j.status.padEnd(10)}</Text>\n <Text>{toolLabel(j.tool).padEnd(14)}</Text>\n <Text dimColor>{project.padEnd(28)}</Text>\n <Text>\"{prompt}\"</Text>\n <Text dimColor> {ago(j.createdAt)}</Text>\n </Text>\n );\n })}\n </Box>\n );\n}\n"],
5
+ "mappings": ";;;;;;;;;;;AACA,SAAS,KAAK,YAAY;AAmCpB,SACE,KADF;AA9BN,IAAM,eAAiE;AAAA,EACrE,SAAS,EAAE,OAAO,UAAK,OAAO,IAAI;AAAA,EAClC,QAAQ,EAAE,OAAO,UAAK,OAAO,IAAI;AAAA,EACjC,SAAS,EAAE,OAAO,UAAK,OAAO,OAAO;AAAA,EACrC,WAAW,EAAE,OAAO,UAAK,OAAO,MAAM;AAAA,EACtC,QAAQ,EAAE,OAAO,UAAK,OAAO,IAAI;AAAA,EACjC,WAAW,EAAE,OAAO,UAAK,OAAO,IAAI;AACtC;AAEA,SAAS,IAAI,KAAqB;AAChC,QAAM,KAAK,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,QAAQ;AAC9C,QAAM,IAAI,KAAK,MAAM,KAAK,GAAM;AAChC,MAAI,IAAI,EAAG,QAAO;AAClB,MAAI,IAAI,GAAI,QAAO,GAAG,CAAC;AACvB,QAAM,IAAI,KAAK,MAAM,IAAI,EAAE;AAC3B,MAAI,IAAI,GAAI,QAAO,GAAG,CAAC;AACvB,SAAO,GAAG,KAAK,MAAM,IAAI,EAAE,CAAC;AAC9B;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,MAAI,KAAK,WAAW,GAAG;AACrB,WACE,qBAAC,OAAI,eAAc,UAAS,UAAU,GACpC;AAAA,0BAAC,QAAK,MAAI,MAAC,OAAO,QAAQ,gCAAa;AAAA,MACvC,oBAAC,QAAK,UAAQ,MAAC,sEAAmD;AAAA,OACpE;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAI,eAAc,UAAS,UAAU,GACpC;AAAA,yBAAC,QAAK,MAAI,MAAC,OAAO,QAAQ;AAAA;AAAA,MAAqB,KAAK;AAAA,MAAO;AAAA,OAAC;AAAA,IAC3D,KAAK,IAAI,CAAC,GAAG,MAAM;AAClB,YAAM,MAAM,WAAW,MAAM;AAC7B,YAAM,KAAK,aAAa,EAAE,MAAM,KAAK,EAAE,OAAO,KAAK,OAAO,IAAI;AAC9D,YAAM,UAAU,EAAE,QAAQ,eAAe;AACzC,YAAM,UAAU,EAAE,QAAQ,UAAU,IAAI,MAAM,GAAG,EAAE;AACnD,aACE,qBAAC,QAAgB,MAAK,gBACpB;AAAA,4BAAC,QAAK,OAAO,MAAM,SAAS,KAAM,gBAAM,YAAO,MAAK;AAAA,QACpD,qBAAC,QAAK,OAAO,GAAG,OAAQ;AAAA,aAAG;AAAA,UAAM;AAAA,WAAC;AAAA,QAClC,oBAAC,QAAK,UAAQ,MAAE,YAAE,OAAO,OAAO,EAAE,GAAE;AAAA,QACpC,oBAAC,QAAM,oBAAU,EAAE,IAAI,EAAE,OAAO,EAAE,GAAE;AAAA,QACpC,oBAAC,QAAK,UAAQ,MAAE,kBAAQ,OAAO,EAAE,GAAE;AAAA,QACnC,qBAAC,QAAK;AAAA;AAAA,UAAE;AAAA,UAAO;AAAA,WAAC;AAAA,QAChB,qBAAC,QAAK,UAAQ,MAAC;AAAA;AAAA,UAAG,IAAI,EAAE,SAAS;AAAA,WAAE;AAAA,WAP1B,EAAE,EAQb;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;",
6
+ "names": []
7
+ }