@rulemetric/cli 0.7.2 → 0.7.4

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 (547) hide show
  1. package/dist/base-command.js +1 -14
  2. package/dist/chunk-2TC6WCUT.js +34 -0
  3. package/dist/chunk-2UC3ULIG.js +1 -0
  4. package/dist/chunk-3AV3GTMP.js +1 -0
  5. package/dist/chunk-4Z5ECCJE.js +1 -0
  6. package/dist/chunk-5RBLIVBF.js +1 -0
  7. package/dist/chunk-67QCYUJU.js +1 -0
  8. package/dist/chunk-6QKI756T.js +2 -0
  9. package/dist/chunk-6V4WM73L.js +1 -0
  10. package/dist/chunk-6XEC6474.js +1 -0
  11. package/dist/chunk-72XLQE3X.js +2 -0
  12. package/dist/chunk-7DFNBRLY.js +61 -0
  13. package/dist/chunk-7XQ4VPLC.js +2 -0
  14. package/dist/chunk-AHRHCERJ.js +1 -0
  15. package/dist/chunk-ARNZQBMX.js +1 -0
  16. package/dist/chunk-CADKBP3D.js +58 -0
  17. package/dist/chunk-CDI5CCHU.js +1 -0
  18. package/dist/chunk-CNQ5DTNC.js +1 -0
  19. package/dist/chunk-CRAKDQ4H.js +1 -0
  20. package/dist/chunk-DNF4HDI6.js +14 -0
  21. package/dist/chunk-DSO2U4Y6.js +56 -0
  22. package/dist/chunk-DT4GKEP5.js +5 -0
  23. package/dist/chunk-DVN7GFJG.js +1 -0
  24. package/dist/chunk-E4SFUPYR.js +15 -0
  25. package/dist/chunk-EUHNCVJQ.js +33 -0
  26. package/dist/chunk-F2VP4B4J.js +1 -0
  27. package/dist/chunk-FEHM5OKW.js +1 -0
  28. package/dist/chunk-FHVBTDBM.js +69 -0
  29. package/dist/chunk-GBMF3TP6.js +1 -0
  30. package/dist/chunk-GY5IJ4RS.js +1 -0
  31. package/dist/chunk-HOHD5HY2.js +5 -0
  32. package/dist/chunk-HP2BUPGS.js +24 -0
  33. package/dist/{chunk-OQBBVTDG.js → chunk-I2DZGJRR.js} +6 -71
  34. package/dist/chunk-I4YJ7NTX.js +1 -0
  35. package/dist/chunk-IY5NXR3N.js +1 -0
  36. package/dist/chunk-IZTIYR5Q.js +2 -0
  37. package/dist/chunk-KKDHD4XA.js +2 -0
  38. package/dist/chunk-LQRYQE6Q.js +4 -0
  39. package/dist/chunk-M6AJDVCL.js +5 -0
  40. package/dist/chunk-MGHFDHHM.js +1 -0
  41. package/dist/chunk-ML36XQW7.js +1 -0
  42. package/dist/chunk-MODXEGCU.js +1 -0
  43. package/dist/chunk-MVM6OGAF.js +4 -0
  44. package/dist/chunk-N7ODX6PO.js +1 -0
  45. package/dist/chunk-NBTC5FNV.js +1 -0
  46. package/dist/chunk-NJ5UED3H.js +1 -0
  47. package/dist/chunk-NVKX36YN.js +3 -0
  48. package/dist/chunk-NVOTOQBA.js +1 -0
  49. package/dist/chunk-O7ZMHCMG.js +31 -0
  50. package/dist/chunk-OMXUK4M6.js +1 -0
  51. package/dist/chunk-PZS2KOU7.js +1 -0
  52. package/dist/chunk-RSKQRVPJ.js +1 -0
  53. package/dist/chunk-RTEATXTP.js +1 -0
  54. package/dist/chunk-RTWRHIKY.js +7 -0
  55. package/dist/chunk-RVO4HV3M.js +1 -0
  56. package/dist/chunk-SBILN45P.js +1 -0
  57. package/dist/chunk-SZ62CP55.js +1 -0
  58. package/dist/chunk-T3W5N3BP.js +2 -0
  59. package/dist/chunk-TDD7IOV2.js +1 -0
  60. package/dist/chunk-TIQ7DQ3M.js +1 -0
  61. package/dist/chunk-TU2AR6XO.js +1 -0
  62. package/dist/chunk-UF6US7VU.js +1 -0
  63. package/dist/chunk-V5QFOF4F.js +9 -0
  64. package/dist/chunk-V5U3E4BZ.js +1 -0
  65. package/dist/chunk-VAFAH6QL.js +1 -0
  66. package/dist/chunk-VMWY7KHH.js +1 -0
  67. package/dist/chunk-VUGRXM7R.js +1 -0
  68. package/dist/{chunk-XZXS2W24.js → chunk-VWEXKDWG.js} +10 -56
  69. package/dist/chunk-W2MV25SB.js +1 -0
  70. package/dist/chunk-WJ3H73G6.js +1 -0
  71. package/dist/chunk-WJUQBMTF.js +9 -0
  72. package/dist/chunk-WLVQJH4E.js +1 -0
  73. package/dist/chunk-WPJ2BND4.js +1 -0
  74. package/dist/chunk-WSCK4WNK.js +1 -0
  75. package/dist/chunk-Y65CSJFF.js +3 -0
  76. package/dist/chunk-ZL4MZMUK.js +34 -0
  77. package/dist/chunk-ZLLER3HP.js +1 -0
  78. package/dist/chunk-ZXF5NE54.js +1 -0
  79. package/dist/commands/antigravity/backfill.js +2 -136
  80. package/dist/commands/auth/create-key.js +1 -52
  81. package/dist/commands/auth/login.js +1 -85
  82. package/dist/commands/auth/logout.js +1 -29
  83. package/dist/commands/auth/revoke-key.js +1 -33
  84. package/dist/commands/auth/signup.js +1 -89
  85. package/dist/commands/auth/status.js +1 -42
  86. package/dist/commands/catalog/index.js +2 -52
  87. package/dist/commands/catalog/recommend.js +3 -43
  88. package/dist/commands/convert.js +1 -75
  89. package/dist/commands/converters.js +1 -54
  90. package/dist/commands/crons/list.js +1 -41
  91. package/dist/commands/crons/run.js +2 -76
  92. package/dist/commands/dashboard.js +1 -46
  93. package/dist/commands/diagnostics.js +1 -117
  94. package/dist/commands/eval-targets/create.js +1 -53
  95. package/dist/commands/eval-targets/list.js +1 -54
  96. package/dist/commands/evals/agent.js +3 -309
  97. package/dist/commands/evals/benchmark.js +6 -73
  98. package/dist/commands/evals/compare.js +13 -96
  99. package/dist/commands/evals/create.js +1 -67
  100. package/dist/commands/evals/optimize-description.js +25 -239
  101. package/dist/commands/evals/optimize.js +5 -211
  102. package/dist/commands/evals/run.js +3 -183
  103. package/dist/commands/gateway/ensure.js +1 -104
  104. package/dist/commands/hooks/emit-instructions.js +1 -25
  105. package/dist/commands/hooks/install.js +1 -442
  106. package/dist/commands/hooks/run.js +3 -81
  107. package/dist/commands/hooks/uninstall.js +2 -156
  108. package/dist/commands/import.js +1 -66
  109. package/dist/commands/instructions/create.js +1 -74
  110. package/dist/commands/instructions/delete.js +1 -55
  111. package/dist/commands/instructions/fork.js +1 -34
  112. package/dist/commands/instructions/get.js +1 -68
  113. package/dist/commands/instructions/list.js +1 -65
  114. package/dist/commands/instructions/promote.js +1 -42
  115. package/dist/commands/instructions/pull.js +1 -39
  116. package/dist/commands/instructions/upstream.js +1 -38
  117. package/dist/commands/instructions/versions.js +1 -53
  118. package/dist/commands/launcher.js +1 -40
  119. package/dist/commands/org/current.js +1 -77
  120. package/dist/commands/org/list.js +1 -52
  121. package/dist/commands/org/switch.js +1 -71
  122. package/dist/commands/packs/add-instruction.js +1 -37
  123. package/dist/commands/packs/apply.js +1 -39
  124. package/dist/commands/packs/create.js +1 -50
  125. package/dist/commands/packs/fork.js +1 -34
  126. package/dist/commands/packs/get.js +3 -56
  127. package/dist/commands/packs/list.js +1 -66
  128. package/dist/commands/packs/remove-instruction.js +1 -35
  129. package/dist/commands/proxy/env.js +3 -131
  130. package/dist/commands/proxy/logs.js +3 -85
  131. package/dist/commands/proxy/restart.js +1 -35
  132. package/dist/commands/proxy/setup.js +15 -454
  133. package/dist/commands/proxy/start.js +10 -333
  134. package/dist/commands/proxy/status.js +1 -78
  135. package/dist/commands/proxy/stop.js +1 -94
  136. package/dist/commands/research/backfill.js +1 -59
  137. package/dist/commands/research/tail-transcript.js +1 -70
  138. package/dist/commands/service/install.js +57 -781
  139. package/dist/commands/service/status.js +1 -180
  140. package/dist/commands/service/uninstall.js +1 -119
  141. package/dist/commands/sessions/analyze.js +3 -48
  142. package/dist/commands/sessions/end.js +2 -85
  143. package/dist/commands/sessions/import.js +1 -46
  144. package/dist/commands/sessions/list.js +1 -48
  145. package/dist/commands/sessions/start.js +3 -90
  146. package/dist/commands/setup.js +3 -150
  147. package/dist/commands/skills/export-approved.js +1 -46
  148. package/dist/commands/skills/install.js +4 -107
  149. package/dist/commands/skills/list.js +4 -65
  150. package/dist/commands/skills/publish.js +2 -98
  151. package/dist/commands/skills/search.js +3 -72
  152. package/dist/commands/skills/update.js +3 -55
  153. package/dist/commands/suggestions/accept.js +8 -84
  154. package/dist/commands/suggestions/dismiss.js +1 -45
  155. package/dist/commands/suggestions/list.js +1 -61
  156. package/dist/commands/suggestions/refresh.js +1 -27
  157. package/dist/cursor-T7AMCMKS.js +13 -0
  158. package/dist/dashboard/Dashboard.js +1 -243
  159. package/dist/dashboard/data.js +1 -15
  160. package/dist/dashboard/launcher/ActiveJobsList.js +1 -10
  161. package/dist/dashboard/launcher/LauncherOverlay.js +1 -16
  162. package/dist/dashboard/launcher/NewLaunchForm.js +1 -10
  163. package/dist/dashboard/launcher/api.js +1 -16
  164. package/dist/dashboard/launcher/tool-labels.js +1 -10
  165. package/dist/dashboard/launcher/types.js +0 -1
  166. package/dist/dashboard/launcher/useLaunchJobs.js +1 -11
  167. package/dist/dashboard/panels/friction.js +1 -10
  168. package/dist/dashboard/panels/insights.js +1 -10
  169. package/dist/dashboard/panels/instructions.js +1 -10
  170. package/dist/dashboard/panels/outcomes.js +1 -10
  171. package/dist/dashboard/panels/overview.js +1 -10
  172. package/dist/dashboard/panels/shared.js +1 -19
  173. package/dist/dashboard/types.js +1 -24
  174. package/dist/dist-FAVALJ5C.js +1 -0
  175. package/dist/index.js +1 -8
  176. package/dist/lib/active-org-refresh.js +1 -15
  177. package/dist/lib/active-org.js +1 -16
  178. package/dist/lib/agent-loop.js +1 -46
  179. package/dist/lib/antigravity-transcript.js +1 -22
  180. package/dist/lib/api-client.js +1 -23
  181. package/dist/lib/auth.js +1 -30
  182. package/dist/lib/capture-hosts.js +1 -8
  183. package/dist/lib/detect-languages.js +1 -8
  184. package/dist/lib/detect-tmux.js +1 -9
  185. package/dist/lib/diagnostics.js +1 -12
  186. package/dist/lib/editor-proxy-pins.js +1 -14
  187. package/dist/lib/ensure-api-key.js +1 -11
  188. package/dist/lib/eval-analyzer.js +1 -9
  189. package/dist/lib/eval-benchmark.js +1 -12
  190. package/dist/lib/eval-conversation-handler.js +1 -13
  191. package/dist/lib/eval-executor.js +1 -8
  192. package/dist/lib/eval-grader.js +1 -9
  193. package/dist/lib/eval-meta-judge.js +1 -9
  194. package/dist/lib/eval-trigger-tester.js +1 -11
  195. package/dist/lib/eval-worktree.js +1 -8
  196. package/dist/lib/gateway-entry.js +1 -61
  197. package/dist/lib/gateway-identity.js +1 -16
  198. package/dist/lib/gateway-lifecycle.js +1 -32
  199. package/dist/lib/gateway.js +1 -14
  200. package/dist/lib/handlers/cron-refresh-pricing.js +1 -0
  201. package/dist/lib/handlers/cron-refresh-skills.js +1 -8
  202. package/dist/lib/handlers/cron-suggest-instructions.js +1 -15
  203. package/dist/lib/handlers/process-announcement.js +1 -11
  204. package/dist/lib/handlers/process-changelog.js +1 -11
  205. package/dist/lib/handlers/process-conversation.js +1 -14
  206. package/dist/lib/handlers/process-eval.js +1 -15
  207. package/dist/lib/handlers/process-insights.js +1 -14
  208. package/dist/lib/handlers/process-launch.js +1 -16
  209. package/dist/lib/handlers/process-run-cleanup.js +1 -13
  210. package/dist/lib/handlers/process-send-message.js +1 -10
  211. package/dist/lib/handlers/process-session-goal.js +1 -11
  212. package/dist/lib/hooks-config.js +1 -81
  213. package/dist/lib/insights-prompts.js +1 -12
  214. package/dist/lib/instruction-snapshot.js +1 -8
  215. package/dist/lib/job-helpers.js +0 -1
  216. package/dist/lib/llm-client.js +1 -17
  217. package/dist/lib/manual-tasks-meta.js +1 -8
  218. package/dist/lib/manual-tasks.js +1 -79
  219. package/dist/lib/output.js +1 -12
  220. package/dist/lib/permanent-job-error.js +1 -10
  221. package/dist/lib/pid-identity.js +1 -14
  222. package/dist/lib/proxy-respawn.js +1 -12
  223. package/dist/lib/research-client.js +1 -12
  224. package/dist/lib/setup-steps.js +1 -33
  225. package/dist/lib/skills-loader.js +1 -8
  226. package/dist/lib/statusline-shim.js +1 -20
  227. package/dist/lib/telemetry.js +1 -16
  228. package/dist/lib/terminal-target-heartbeat.js +1 -15
  229. package/dist/lib/tmux.js +1 -16
  230. package/dist/lib/transcript-rate-limit-watcher.js +1 -22
  231. package/dist/lib/types.js +1 -8
  232. package/dist/lib/version-check.js +1 -12
  233. package/dist/lib/which.js +1 -8
  234. package/dist/lib/worktree.js +1 -17
  235. package/dist/opencode-QRJ3BH23.js +1 -0
  236. package/oclif.manifest.json +135 -135
  237. package/package.json +8 -7
  238. package/dist/base-command.js.map +0 -7
  239. package/dist/chunk-2HK7RGZB.js +0 -82
  240. package/dist/chunk-2HK7RGZB.js.map +0 -7
  241. package/dist/chunk-2ORJWTNZ.js +0 -307
  242. package/dist/chunk-2ORJWTNZ.js.map +0 -7
  243. package/dist/chunk-37LN5O7M.js +0 -59
  244. package/dist/chunk-37LN5O7M.js.map +0 -7
  245. package/dist/chunk-3S7223UR.js +0 -81
  246. package/dist/chunk-3S7223UR.js.map +0 -7
  247. package/dist/chunk-3TIMQ3O6.js +0 -96
  248. package/dist/chunk-3TIMQ3O6.js.map +0 -7
  249. package/dist/chunk-42GFSAJP.js +0 -32
  250. package/dist/chunk-42GFSAJP.js.map +0 -7
  251. package/dist/chunk-4BHDHHKL.js +0 -48
  252. package/dist/chunk-4BHDHHKL.js.map +0 -7
  253. package/dist/chunk-4D537GXE.js +0 -99
  254. package/dist/chunk-4D537GXE.js.map +0 -7
  255. package/dist/chunk-4LYCDS2N.js +0 -139
  256. package/dist/chunk-4LYCDS2N.js.map +0 -7
  257. package/dist/chunk-4SCZK7AL.js +0 -129
  258. package/dist/chunk-4SCZK7AL.js.map +0 -7
  259. package/dist/chunk-4XAWK6S2.js +0 -161
  260. package/dist/chunk-4XAWK6S2.js.map +0 -7
  261. package/dist/chunk-52WIYRZH.js +0 -73
  262. package/dist/chunk-52WIYRZH.js.map +0 -7
  263. package/dist/chunk-5BAOGNUH.js +0 -79
  264. package/dist/chunk-5BAOGNUH.js.map +0 -7
  265. package/dist/chunk-5EDMGK3W.js +0 -39
  266. package/dist/chunk-5EDMGK3W.js.map +0 -7
  267. package/dist/chunk-6NBS5XFS.js +0 -99
  268. package/dist/chunk-6NBS5XFS.js.map +0 -7
  269. package/dist/chunk-7DULPSFU.js +0 -299
  270. package/dist/chunk-7DULPSFU.js.map +0 -7
  271. package/dist/chunk-7LVVKQMZ.js +0 -98
  272. package/dist/chunk-7LVVKQMZ.js.map +0 -7
  273. package/dist/chunk-7NNFYWKK.js +0 -243
  274. package/dist/chunk-7NNFYWKK.js.map +0 -7
  275. package/dist/chunk-7NYKWN7U.js +0 -12
  276. package/dist/chunk-7NYKWN7U.js.map +0 -7
  277. package/dist/chunk-BO76WKJR.js +0 -42
  278. package/dist/chunk-BO76WKJR.js.map +0 -7
  279. package/dist/chunk-BRD5RUGM.js +0 -53
  280. package/dist/chunk-BRD5RUGM.js.map +0 -7
  281. package/dist/chunk-BT6Z6545.js +0 -43
  282. package/dist/chunk-BT6Z6545.js.map +0 -7
  283. package/dist/chunk-BZDKEQKU.js +0 -39
  284. package/dist/chunk-BZDKEQKU.js.map +0 -7
  285. package/dist/chunk-DGHWRQXL.js +0 -17
  286. package/dist/chunk-DGHWRQXL.js.map +0 -7
  287. package/dist/chunk-DNKSVWMD.js +0 -108
  288. package/dist/chunk-DNKSVWMD.js.map +0 -7
  289. package/dist/chunk-DQ3KELXD.js +0 -74
  290. package/dist/chunk-DQ3KELXD.js.map +0 -7
  291. package/dist/chunk-DUJSRBLP.js +0 -122
  292. package/dist/chunk-DUJSRBLP.js.map +0 -7
  293. package/dist/chunk-E3BIT53W.js +0 -154
  294. package/dist/chunk-E3BIT53W.js.map +0 -7
  295. package/dist/chunk-EARWG4EV.js +0 -22
  296. package/dist/chunk-EARWG4EV.js.map +0 -7
  297. package/dist/chunk-EI5BHWXA.js +0 -1662
  298. package/dist/chunk-EI5BHWXA.js.map +0 -7
  299. package/dist/chunk-EJ3YAFDP.js +0 -37
  300. package/dist/chunk-EJ3YAFDP.js.map +0 -7
  301. package/dist/chunk-EKJ2CABV.js +0 -76
  302. package/dist/chunk-EKJ2CABV.js.map +0 -7
  303. package/dist/chunk-EKP32DLN.js +0 -16
  304. package/dist/chunk-EKP32DLN.js.map +0 -7
  305. package/dist/chunk-EYPAAGN5.js +0 -51
  306. package/dist/chunk-EYPAAGN5.js.map +0 -7
  307. package/dist/chunk-F5N6CLJJ.js +0 -1995
  308. package/dist/chunk-F5N6CLJJ.js.map +0 -7
  309. package/dist/chunk-FZKLLNDS.js +0 -228
  310. package/dist/chunk-FZKLLNDS.js.map +0 -7
  311. package/dist/chunk-GIUBARWS.js +0 -99
  312. package/dist/chunk-GIUBARWS.js.map +0 -7
  313. package/dist/chunk-GQNJO2P2.js +0 -102
  314. package/dist/chunk-GQNJO2P2.js.map +0 -7
  315. package/dist/chunk-IJGF2ETG.js +0 -68
  316. package/dist/chunk-IJGF2ETG.js.map +0 -7
  317. package/dist/chunk-ILYDELUE.js +0 -46
  318. package/dist/chunk-ILYDELUE.js.map +0 -7
  319. package/dist/chunk-J6QFW4LD.js +0 -55
  320. package/dist/chunk-J6QFW4LD.js.map +0 -7
  321. package/dist/chunk-J7N3DLH6.js +0 -117
  322. package/dist/chunk-J7N3DLH6.js.map +0 -7
  323. package/dist/chunk-JFDWKLQC.js +0 -23
  324. package/dist/chunk-JFDWKLQC.js.map +0 -7
  325. package/dist/chunk-JULOLTZS.js +0 -61
  326. package/dist/chunk-JULOLTZS.js.map +0 -7
  327. package/dist/chunk-KJKBDQ4D.js +0 -220
  328. package/dist/chunk-KJKBDQ4D.js.map +0 -7
  329. package/dist/chunk-KRBQLMOP.js +0 -41
  330. package/dist/chunk-KRBQLMOP.js.map +0 -7
  331. package/dist/chunk-LXKPNATC.js +0 -624
  332. package/dist/chunk-LXKPNATC.js.map +0 -7
  333. package/dist/chunk-NSBPE2FW.js +0 -17
  334. package/dist/chunk-NSBPE2FW.js.map +0 -7
  335. package/dist/chunk-OK3I555A.js +0 -243
  336. package/dist/chunk-OK3I555A.js.map +0 -7
  337. package/dist/chunk-OKWCKCPE.js +0 -414
  338. package/dist/chunk-OKWCKCPE.js.map +0 -7
  339. package/dist/chunk-OO7JDFS4.js +0 -157
  340. package/dist/chunk-OO7JDFS4.js.map +0 -7
  341. package/dist/chunk-OQBBVTDG.js.map +0 -7
  342. package/dist/chunk-OQSQC7VB.js +0 -77
  343. package/dist/chunk-OQSQC7VB.js.map +0 -7
  344. package/dist/chunk-PED7L5GX.js +0 -92
  345. package/dist/chunk-PED7L5GX.js.map +0 -7
  346. package/dist/chunk-PMI56ED5.js +0 -167
  347. package/dist/chunk-PMI56ED5.js.map +0 -7
  348. package/dist/chunk-QJQS6TUN.js +0 -44
  349. package/dist/chunk-QJQS6TUN.js.map +0 -7
  350. package/dist/chunk-QN34TGD3.js +0 -83
  351. package/dist/chunk-QN34TGD3.js.map +0 -7
  352. package/dist/chunk-QSN77T7C.js +0 -250
  353. package/dist/chunk-QSN77T7C.js.map +0 -7
  354. package/dist/chunk-R56PH7YE.js +0 -78
  355. package/dist/chunk-R56PH7YE.js.map +0 -7
  356. package/dist/chunk-RH7NHVSK.js +0 -16
  357. package/dist/chunk-RH7NHVSK.js.map +0 -7
  358. package/dist/chunk-RMTT4KDY.js +0 -191
  359. package/dist/chunk-RMTT4KDY.js.map +0 -7
  360. package/dist/chunk-RQ2TMLKG.js +0 -142
  361. package/dist/chunk-RQ2TMLKG.js.map +0 -7
  362. package/dist/chunk-SO3T35U7.js +0 -80
  363. package/dist/chunk-SO3T35U7.js.map +0 -7
  364. package/dist/chunk-UKMLICWS.js +0 -51
  365. package/dist/chunk-UKMLICWS.js.map +0 -7
  366. package/dist/chunk-W2YERO7E.js +0 -170
  367. package/dist/chunk-W2YERO7E.js.map +0 -7
  368. package/dist/chunk-W53GKIZQ.js +0 -50
  369. package/dist/chunk-W53GKIZQ.js.map +0 -7
  370. package/dist/chunk-WA4MWYRW.js +0 -254
  371. package/dist/chunk-WA4MWYRW.js.map +0 -7
  372. package/dist/chunk-XC6M4CSW.js +0 -44
  373. package/dist/chunk-XC6M4CSW.js.map +0 -7
  374. package/dist/chunk-XK42ZBDE.js +0 -23
  375. package/dist/chunk-XK42ZBDE.js.map +0 -7
  376. package/dist/chunk-XUV6DDBF.js +0 -124
  377. package/dist/chunk-XUV6DDBF.js.map +0 -7
  378. package/dist/chunk-XZXS2W24.js.map +0 -7
  379. package/dist/chunk-Y3WD5CSW.js +0 -49
  380. package/dist/chunk-Y3WD5CSW.js.map +0 -7
  381. package/dist/chunk-Y4BJXXYV.js +0 -148
  382. package/dist/chunk-Y4BJXXYV.js.map +0 -7
  383. package/dist/chunk-YNIH3KMU.js +0 -121
  384. package/dist/chunk-YNIH3KMU.js.map +0 -7
  385. package/dist/chunk-YOBA3NAM.js +0 -55
  386. package/dist/chunk-YOBA3NAM.js.map +0 -7
  387. package/dist/chunk-ZUJBM6HE.js +0 -125
  388. package/dist/chunk-ZUJBM6HE.js.map +0 -7
  389. package/dist/commands/antigravity/backfill.js.map +0 -7
  390. package/dist/commands/auth/create-key.js.map +0 -7
  391. package/dist/commands/auth/login.js.map +0 -7
  392. package/dist/commands/auth/logout.js.map +0 -7
  393. package/dist/commands/auth/revoke-key.js.map +0 -7
  394. package/dist/commands/auth/signup.js.map +0 -7
  395. package/dist/commands/auth/status.js.map +0 -7
  396. package/dist/commands/catalog/index.js.map +0 -7
  397. package/dist/commands/catalog/recommend.js.map +0 -7
  398. package/dist/commands/convert.js.map +0 -7
  399. package/dist/commands/converters.js.map +0 -7
  400. package/dist/commands/crons/list.js.map +0 -7
  401. package/dist/commands/crons/run.js.map +0 -7
  402. package/dist/commands/dashboard.js.map +0 -7
  403. package/dist/commands/diagnostics.js.map +0 -7
  404. package/dist/commands/eval-targets/create.js.map +0 -7
  405. package/dist/commands/eval-targets/list.js.map +0 -7
  406. package/dist/commands/evals/agent.js.map +0 -7
  407. package/dist/commands/evals/benchmark.js.map +0 -7
  408. package/dist/commands/evals/compare.js.map +0 -7
  409. package/dist/commands/evals/create.js.map +0 -7
  410. package/dist/commands/evals/optimize-description.js.map +0 -7
  411. package/dist/commands/evals/optimize.js.map +0 -7
  412. package/dist/commands/evals/run.js.map +0 -7
  413. package/dist/commands/gateway/ensure.js.map +0 -7
  414. package/dist/commands/hooks/emit-instructions.js.map +0 -7
  415. package/dist/commands/hooks/install.js.map +0 -7
  416. package/dist/commands/hooks/run.js.map +0 -7
  417. package/dist/commands/hooks/uninstall.js.map +0 -7
  418. package/dist/commands/import.js.map +0 -7
  419. package/dist/commands/instructions/create.js.map +0 -7
  420. package/dist/commands/instructions/delete.js.map +0 -7
  421. package/dist/commands/instructions/fork.js.map +0 -7
  422. package/dist/commands/instructions/get.js.map +0 -7
  423. package/dist/commands/instructions/list.js.map +0 -7
  424. package/dist/commands/instructions/promote.js.map +0 -7
  425. package/dist/commands/instructions/pull.js.map +0 -7
  426. package/dist/commands/instructions/upstream.js.map +0 -7
  427. package/dist/commands/instructions/versions.js.map +0 -7
  428. package/dist/commands/launcher.js.map +0 -7
  429. package/dist/commands/org/current.js.map +0 -7
  430. package/dist/commands/org/list.js.map +0 -7
  431. package/dist/commands/org/switch.js.map +0 -7
  432. package/dist/commands/packs/add-instruction.js.map +0 -7
  433. package/dist/commands/packs/apply.js.map +0 -7
  434. package/dist/commands/packs/create.js.map +0 -7
  435. package/dist/commands/packs/fork.js.map +0 -7
  436. package/dist/commands/packs/get.js.map +0 -7
  437. package/dist/commands/packs/list.js.map +0 -7
  438. package/dist/commands/packs/remove-instruction.js.map +0 -7
  439. package/dist/commands/proxy/env.js.map +0 -7
  440. package/dist/commands/proxy/logs.js.map +0 -7
  441. package/dist/commands/proxy/restart.js.map +0 -7
  442. package/dist/commands/proxy/setup.js.map +0 -7
  443. package/dist/commands/proxy/start.js.map +0 -7
  444. package/dist/commands/proxy/status.js.map +0 -7
  445. package/dist/commands/proxy/stop.js.map +0 -7
  446. package/dist/commands/research/backfill.js.map +0 -7
  447. package/dist/commands/research/tail-transcript.js.map +0 -7
  448. package/dist/commands/service/install.js.map +0 -7
  449. package/dist/commands/service/status.js.map +0 -7
  450. package/dist/commands/service/uninstall.js.map +0 -7
  451. package/dist/commands/sessions/analyze.js.map +0 -7
  452. package/dist/commands/sessions/end.js.map +0 -7
  453. package/dist/commands/sessions/import.js.map +0 -7
  454. package/dist/commands/sessions/list.js.map +0 -7
  455. package/dist/commands/sessions/start.js.map +0 -7
  456. package/dist/commands/setup.js.map +0 -7
  457. package/dist/commands/skills/export-approved.js.map +0 -7
  458. package/dist/commands/skills/install.js.map +0 -7
  459. package/dist/commands/skills/list.js.map +0 -7
  460. package/dist/commands/skills/publish.js.map +0 -7
  461. package/dist/commands/skills/search.js.map +0 -7
  462. package/dist/commands/skills/update.js.map +0 -7
  463. package/dist/commands/suggestions/accept.js.map +0 -7
  464. package/dist/commands/suggestions/dismiss.js.map +0 -7
  465. package/dist/commands/suggestions/list.js.map +0 -7
  466. package/dist/commands/suggestions/refresh.js.map +0 -7
  467. package/dist/cursor-BGQJ4CWI.js +0 -134
  468. package/dist/cursor-BGQJ4CWI.js.map +0 -7
  469. package/dist/dashboard/Dashboard.js.map +0 -7
  470. package/dist/dashboard/data.js.map +0 -7
  471. package/dist/dashboard/launcher/ActiveJobsList.js.map +0 -7
  472. package/dist/dashboard/launcher/LauncherOverlay.js.map +0 -7
  473. package/dist/dashboard/launcher/NewLaunchForm.js.map +0 -7
  474. package/dist/dashboard/launcher/api.js.map +0 -7
  475. package/dist/dashboard/launcher/tool-labels.js.map +0 -7
  476. package/dist/dashboard/launcher/types.js.map +0 -7
  477. package/dist/dashboard/launcher/useLaunchJobs.js.map +0 -7
  478. package/dist/dashboard/panels/friction.js.map +0 -7
  479. package/dist/dashboard/panels/insights.js.map +0 -7
  480. package/dist/dashboard/panels/instructions.js.map +0 -7
  481. package/dist/dashboard/panels/outcomes.js.map +0 -7
  482. package/dist/dashboard/panels/overview.js.map +0 -7
  483. package/dist/dashboard/panels/shared.js.map +0 -7
  484. package/dist/dashboard/types.js.map +0 -7
  485. package/dist/dist-UNYP5PJR.js +0 -56
  486. package/dist/dist-UNYP5PJR.js.map +0 -7
  487. package/dist/index.js.map +0 -7
  488. package/dist/lib/active-org-refresh.js.map +0 -7
  489. package/dist/lib/active-org.js.map +0 -7
  490. package/dist/lib/agent-loop.js.map +0 -7
  491. package/dist/lib/antigravity-transcript.js.map +0 -7
  492. package/dist/lib/api-client.js.map +0 -7
  493. package/dist/lib/auth.js.map +0 -7
  494. package/dist/lib/capture-hosts.js.map +0 -7
  495. package/dist/lib/detect-languages.js.map +0 -7
  496. package/dist/lib/detect-tmux.js.map +0 -7
  497. package/dist/lib/diagnostics.js.map +0 -7
  498. package/dist/lib/editor-proxy-pins.js.map +0 -7
  499. package/dist/lib/ensure-api-key.js.map +0 -7
  500. package/dist/lib/eval-analyzer.js.map +0 -7
  501. package/dist/lib/eval-benchmark.js.map +0 -7
  502. package/dist/lib/eval-conversation-handler.js.map +0 -7
  503. package/dist/lib/eval-executor.js.map +0 -7
  504. package/dist/lib/eval-grader.js.map +0 -7
  505. package/dist/lib/eval-meta-judge.js.map +0 -7
  506. package/dist/lib/eval-trigger-tester.js.map +0 -7
  507. package/dist/lib/eval-worktree.js.map +0 -7
  508. package/dist/lib/gateway-entry.js.map +0 -7
  509. package/dist/lib/gateway-identity.js.map +0 -7
  510. package/dist/lib/gateway-lifecycle.js.map +0 -7
  511. package/dist/lib/gateway.js.map +0 -7
  512. package/dist/lib/handlers/cron-refresh-skills.js.map +0 -7
  513. package/dist/lib/handlers/cron-suggest-instructions.js.map +0 -7
  514. package/dist/lib/handlers/process-announcement.js.map +0 -7
  515. package/dist/lib/handlers/process-changelog.js.map +0 -7
  516. package/dist/lib/handlers/process-conversation.js.map +0 -7
  517. package/dist/lib/handlers/process-eval.js.map +0 -7
  518. package/dist/lib/handlers/process-insights.js.map +0 -7
  519. package/dist/lib/handlers/process-launch.js.map +0 -7
  520. package/dist/lib/handlers/process-run-cleanup.js.map +0 -7
  521. package/dist/lib/handlers/process-send-message.js.map +0 -7
  522. package/dist/lib/handlers/process-session-goal.js.map +0 -7
  523. package/dist/lib/hooks-config.js.map +0 -7
  524. package/dist/lib/insights-prompts.js.map +0 -7
  525. package/dist/lib/instruction-snapshot.js.map +0 -7
  526. package/dist/lib/job-helpers.js.map +0 -7
  527. package/dist/lib/llm-client.js.map +0 -7
  528. package/dist/lib/manual-tasks-meta.js.map +0 -7
  529. package/dist/lib/manual-tasks.js.map +0 -7
  530. package/dist/lib/output.js.map +0 -7
  531. package/dist/lib/permanent-job-error.js.map +0 -7
  532. package/dist/lib/pid-identity.js.map +0 -7
  533. package/dist/lib/proxy-respawn.js.map +0 -7
  534. package/dist/lib/research-client.js.map +0 -7
  535. package/dist/lib/setup-steps.js.map +0 -7
  536. package/dist/lib/skills-loader.js.map +0 -7
  537. package/dist/lib/statusline-shim.js.map +0 -7
  538. package/dist/lib/telemetry.js.map +0 -7
  539. package/dist/lib/terminal-target-heartbeat.js.map +0 -7
  540. package/dist/lib/tmux.js.map +0 -7
  541. package/dist/lib/transcript-rate-limit-watcher.js.map +0 -7
  542. package/dist/lib/types.js.map +0 -7
  543. package/dist/lib/version-check.js.map +0 -7
  544. package/dist/lib/which.js.map +0 -7
  545. package/dist/lib/worktree.js.map +0 -7
  546. package/dist/opencode-IQ7X5YMJ.js +0 -190
  547. package/dist/opencode-IQ7X5YMJ.js.map +0 -7
@@ -1,243 +0,0 @@
1
- import {
2
- MitmproxyRespawnMonitor
3
- } from "./chunk-ILYDELUE.js";
4
- import {
5
- GATEWAY_IDENTITY_PATH,
6
- GATEWAY_IDENTITY_SERVICE
7
- } from "./chunk-7LVVKQMZ.js";
8
-
9
- // src/lib/gateway.ts
10
- import { spawn } from "node:child_process";
11
- import * as fs from "node:fs";
12
- import * as http from "node:http";
13
- import * as net from "node:net";
14
- import * as os from "node:os";
15
- import * as path from "node:path";
16
- var GATEWAY_PORT = 8787;
17
- var MITMPROXY_PORT = 8788;
18
- var HEALTH_INTERVAL = 3e3;
19
- var HEALTH_TIMEOUT = 500;
20
- var RESTART_COOLDOWN_MS = 6e4;
21
- var VERSION_FILE = path.join(os.homedir(), ".config", "rulemetric", "proxy-addon.version");
22
- var PROXY_PID_FILE = path.join(os.homedir(), ".config", "rulemetric", "proxy.pid");
23
- var isProxyAlive = false;
24
- var lastSeenAddonVersion = null;
25
- var lastRestartAt = 0;
26
- var identityVersion = "unknown";
27
- var respawnMonitor = null;
28
- function log(msg) {
29
- const ts = (/* @__PURE__ */ new Date()).toISOString();
30
- console.log(`[${ts}] ${msg}`);
31
- }
32
- function readAddonVersion() {
33
- try {
34
- return fs.readFileSync(VERSION_FILE, "utf-8").trim() || null;
35
- } catch {
36
- return null;
37
- }
38
- }
39
- function maybeRestartOnDrift(gatewayCliVersion, cliEntry) {
40
- if (gatewayCliVersion === "unknown" || !cliEntry) return;
41
- const addonVersion = readAddonVersion();
42
- if (!addonVersion || addonVersion === "unknown") return;
43
- if (addonVersion === lastSeenAddonVersion) return;
44
- lastSeenAddonVersion = addonVersion;
45
- if (addonVersion === gatewayCliVersion) {
46
- log(`addon version matches gateway (${gatewayCliVersion})`);
47
- return;
48
- }
49
- const sinceLast = Date.now() - lastRestartAt;
50
- if (sinceLast < RESTART_COOLDOWN_MS) {
51
- log(
52
- `addon version drift (gateway=${gatewayCliVersion}, addon=${addonVersion}); restart cooldown active (${Math.round((RESTART_COOLDOWN_MS - sinceLast) / 1e3)}s left)`
53
- );
54
- return;
55
- }
56
- log(
57
- `addon version drift detected (gateway=${gatewayCliVersion}, addon=${addonVersion}). Restarting proxy to pick up latest code.`
58
- );
59
- lastRestartAt = Date.now();
60
- spawnProxyRestart(cliEntry);
61
- }
62
- function spawnProxyRestart(cliEntry) {
63
- if (!cliEntry) {
64
- log("cannot restart proxy: no CLI entry recorded (RULEMETRIC_CLI_ENTRY unset)");
65
- return false;
66
- }
67
- try {
68
- const child = spawn(process.execPath, [cliEntry, "proxy", "restart"], {
69
- detached: true,
70
- stdio: "ignore"
71
- });
72
- child.unref();
73
- return true;
74
- } catch (err) {
75
- log(`restart spawn failed: ${err.message}`);
76
- return false;
77
- }
78
- }
79
- function proxyCrashEvidence() {
80
- try {
81
- const content = fs.readFileSync(PROXY_PID_FILE, "utf-8").trim();
82
- return /^\d+$/.test(content);
83
- } catch {
84
- return false;
85
- }
86
- }
87
- function checkProxyHealth(mitmproxyPort) {
88
- const sock = net.connect({ port: mitmproxyPort, timeout: HEALTH_TIMEOUT });
89
- sock.on("connect", () => {
90
- sock.destroy();
91
- if (!isProxyAlive) {
92
- isProxyAlive = true;
93
- log(`mitmproxy up on :${mitmproxyPort}, routing through proxy`);
94
- }
95
- respawnMonitor?.onHealthCheck(true);
96
- });
97
- sock.on("error", () => {
98
- if (isProxyAlive) {
99
- isProxyAlive = false;
100
- log(`mitmproxy down on :${mitmproxyPort}, routing direct`);
101
- }
102
- respawnMonitor?.onHealthCheck(false);
103
- });
104
- sock.on("timeout", () => {
105
- sock.destroy();
106
- if (isProxyAlive) {
107
- isProxyAlive = false;
108
- log(`mitmproxy timeout on :${mitmproxyPort}, routing direct`);
109
- }
110
- respawnMonitor?.onHealthCheck(false);
111
- });
112
- }
113
- function handleConnect(req, clientSocket, head, mitmproxyPort) {
114
- const [targetHost, targetPortStr] = (req.url ?? "").split(":");
115
- const targetPort = parseInt(targetPortStr, 10) || 443;
116
- if (isProxyAlive) {
117
- const proxySocket = net.connect({ port: mitmproxyPort, host: "127.0.0.1" });
118
- proxySocket.on("connect", () => {
119
- proxySocket.write(
120
- `CONNECT ${req.url} HTTP/1.1\r
121
- Host: ${req.url}\r
122
- \r
123
- `
124
- );
125
- });
126
- let responseBuffer = Buffer.alloc(0);
127
- const onData = (chunk) => {
128
- responseBuffer = Buffer.concat([responseBuffer, chunk]);
129
- const responseStr = responseBuffer.toString();
130
- if (responseStr.includes("\r\n\r\n")) {
131
- proxySocket.removeListener("data", onData);
132
- clientSocket.write("HTTP/1.1 200 Connection Established\r\n\r\n");
133
- if (head.length > 0) proxySocket.write(head);
134
- clientSocket.pipe(proxySocket);
135
- proxySocket.pipe(clientSocket);
136
- }
137
- };
138
- proxySocket.on("data", onData);
139
- proxySocket.on("error", (err) => {
140
- log(`proxy socket error for ${req.url}: ${err.message}, falling back to direct`);
141
- connectDirect(req, clientSocket, head, targetHost, targetPort);
142
- });
143
- clientSocket.on("error", () => {
144
- proxySocket.destroy();
145
- });
146
- } else {
147
- connectDirect(req, clientSocket, head, targetHost, targetPort);
148
- }
149
- }
150
- function connectDirect(req, clientSocket, head, targetHost, targetPort) {
151
- const upstream = net.connect({ port: targetPort, host: targetHost });
152
- upstream.on("connect", () => {
153
- clientSocket.write("HTTP/1.1 200 Connection Established\r\n\r\n");
154
- if (head.length > 0) upstream.write(head);
155
- clientSocket.pipe(upstream);
156
- upstream.pipe(clientSocket);
157
- });
158
- upstream.on("error", (err) => {
159
- log(`upstream error for ${req.url}: ${err.message}`);
160
- clientSocket.end("HTTP/1.1 502 Bad Gateway\r\n\r\n");
161
- });
162
- clientSocket.on("error", () => {
163
- upstream.destroy();
164
- });
165
- }
166
- function handleRequest(req, res, mitmproxyPort) {
167
- if (req.url === GATEWAY_IDENTITY_PATH) {
168
- res.writeHead(200, { "content-type": "application/json" });
169
- res.end(JSON.stringify({
170
- service: GATEWAY_IDENTITY_SERVICE,
171
- version: identityVersion,
172
- pid: process.pid,
173
- mitmproxyAlive: isProxyAlive
174
- }));
175
- return;
176
- }
177
- const targetUrl = req.url ?? "";
178
- let parsedUrl;
179
- try {
180
- parsedUrl = new URL(targetUrl);
181
- } catch {
182
- res.writeHead(400);
183
- res.end("Bad Request");
184
- return;
185
- }
186
- const options = {
187
- hostname: isProxyAlive ? "127.0.0.1" : parsedUrl.hostname,
188
- port: isProxyAlive ? mitmproxyPort : parseInt(parsedUrl.port, 10) || 80,
189
- path: isProxyAlive ? targetUrl : parsedUrl.pathname + parsedUrl.search,
190
- method: req.method,
191
- headers: req.headers
192
- };
193
- const proxyReq = http.request(options, (proxyRes) => {
194
- res.writeHead(proxyRes.statusCode ?? 502, proxyRes.headers);
195
- proxyRes.pipe(res);
196
- });
197
- proxyReq.on("error", (err) => {
198
- log(`HTTP proxy error for ${targetUrl}: ${err.message}`);
199
- res.writeHead(502);
200
- res.end("Bad Gateway");
201
- });
202
- req.pipe(proxyReq);
203
- }
204
- function startGateway(port = GATEWAY_PORT, mitmproxyPort = MITMPROXY_PORT, options = {}) {
205
- const cliVersion = options.cliVersion ?? process.env.RULEMETRIC_CLI_VERSION ?? "unknown";
206
- const cliEntry = options.cliEntry ?? process.env.RULEMETRIC_CLI_ENTRY ?? null;
207
- identityVersion = cliVersion;
208
- respawnMonitor = new MitmproxyRespawnMonitor({
209
- hasCrashEvidence: proxyCrashEvidence,
210
- respawn: () => spawnProxyRestart(cliEntry),
211
- log
212
- });
213
- const server = http.createServer((req, res) => {
214
- handleRequest(req, res, mitmproxyPort);
215
- });
216
- server.on("connect", (req, clientSocket, head) => {
217
- handleConnect(req, clientSocket, head, mitmproxyPort);
218
- });
219
- server.on("clientError", (_err, socket) => {
220
- if (socket.writable) {
221
- socket.end("HTTP/1.1 400 Bad Request\r\n\r\n");
222
- }
223
- });
224
- const healthInterval = setInterval(() => {
225
- checkProxyHealth(mitmproxyPort);
226
- maybeRestartOnDrift(cliVersion, cliEntry);
227
- }, HEALTH_INTERVAL);
228
- checkProxyHealth(mitmproxyPort);
229
- maybeRestartOnDrift(cliVersion, cliEntry);
230
- server.listen(port, "127.0.0.1", () => {
231
- log(
232
- `gateway listening on 127.0.0.1:${port} (mitmproxy target: :${mitmproxyPort}, cli version: ${cliVersion})`
233
- );
234
- });
235
- return { server, healthInterval };
236
- }
237
-
238
- export {
239
- GATEWAY_PORT,
240
- MITMPROXY_PORT,
241
- startGateway
242
- };
243
- //# sourceMappingURL=chunk-7NNFYWKK.js.map
@@ -1,7 +0,0 @@
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';\nimport { GATEWAY_IDENTITY_PATH, GATEWAY_IDENTITY_SERVICE } from './gateway-identity.js';\nimport { MitmproxyRespawnMonitor } from './proxy-respawn.js';\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// Crash evidence for the mitmproxy auto-restart: `proxy stop` removes this\n// file, a crash leaves it behind.\nconst PROXY_PID_FILE = path.join(os.homedir(), '.config', 'rulemetric', 'proxy.pid');\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// Set by startGateway; served on the identity endpoint so callers can verify\n// the thing on :8787 is actually us (and which build).\nlet identityVersion = 'unknown';\n// Mid-session mitmproxy crash recovery \u2014 constructed in startGateway.\nlet respawnMonitor: MitmproxyRespawnMonitor | null = null;\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 spawnProxyRestart(cliEntry);\n}\n\n/**\n * Fire one detached `rulemetric proxy restart` via the CLI entry the spawning\n * process recorded. Shared by the version-drift restart and the mid-session\n * crash auto-restart. Output goes to /dev/null; the proxy.log captures the\n * restart events from mitmproxy itself.\n */\nfunction spawnProxyRestart(cliEntry: string | null): boolean {\n if (!cliEntry) {\n log('cannot restart proxy: no CLI entry recorded (RULEMETRIC_CLI_ENTRY unset)');\n return false;\n }\n try {\n const child = spawn(process.execPath, [cliEntry, 'proxy', 'restart'], {\n detached: true,\n stdio: 'ignore',\n });\n child.unref();\n return true;\n } catch (err) {\n log(`restart spawn failed: ${(err as Error).message}`);\n return false;\n }\n}\n\n/**\n * True when the local proxy.pid file says a local-mode mitmproxy SHOULD be\n * running (numeric PID). `proxy stop` deletes the file, so its absence means\n * a deliberate stop \u2014 never auto-restart over that. A `docker:` marker means\n * Docker owns the lifecycle.\n */\nfunction proxyCrashEvidence(): boolean {\n try {\n const content = fs.readFileSync(PROXY_PID_FILE, 'utf-8').trim();\n return /^\\d+$/.test(content);\n } catch {\n return false;\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 respawnMonitor?.onHealthCheck(true);\n });\n sock.on('error', () => {\n if (isProxyAlive) {\n isProxyAlive = false;\n log(`mitmproxy down on :${mitmproxyPort}, routing direct`);\n }\n respawnMonitor?.onHealthCheck(false);\n });\n sock.on('timeout', () => {\n sock.destroy();\n if (isProxyAlive) {\n isProxyAlive = false;\n log(`mitmproxy timeout on :${mitmproxyPort}, routing direct`);\n }\n respawnMonitor?.onHealthCheck(false);\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 // Identity handshake (origin-form GET, not a proxy request): lets callers\n // distinguish OUR gateway from a foreign process squatting on the port \u2014\n // the gate for pinning HTTPS_PROXY and for idempotent double-spawns.\n if (req.url === GATEWAY_IDENTITY_PATH) {\n res.writeHead(200, { 'content-type': 'application/json' });\n res.end(JSON.stringify({\n service: GATEWAY_IDENTITY_SERVICE,\n version: identityVersion,\n pid: process.pid,\n mitmproxyAlive: isProxyAlive,\n }));\n return;\n }\n\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 identityVersion = cliVersion;\n // Mid-session crash recovery: when the health check sees mitmproxy stay\n // dead, attempt a bounded, crash-evidence-gated `proxy restart` (see\n // proxy-respawn.ts for the guard rails).\n respawnMonitor = new MitmproxyRespawnMonitor({\n hasCrashEvidence: proxyCrashEvidence,\n respawn: () => spawnProxyRestart(cliEntry),\n log,\n });\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": ";;;;;;;;;AAIA,SAAS,aAAa;AACtB,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,SAAS;AACrB,YAAY,QAAQ;AACpB,YAAY,UAAU;AAIf,IAAM,eAAe;AACrB,IAAM,iBAAiB;AAC9B,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AAGvB,IAAM,sBAAsB;AAC5B,IAAM,eAAoB,UAAQ,WAAQ,GAAG,WAAW,cAAc,qBAAqB;AAG3F,IAAM,iBAAsB,UAAQ,WAAQ,GAAG,WAAW,cAAc,WAAW;AAEnF,IAAI,eAAe;AAInB,IAAI,uBAAsC;AAC1C,IAAI,gBAAgB;AAGpB,IAAI,kBAAkB;AAEtB,IAAI,iBAAiD;AAErD,SAAS,IAAI,KAAmB;AAC9B,QAAM,MAAK,oBAAI,KAAK,GAAE,YAAY;AAClC,UAAQ,IAAI,IAAI,EAAE,KAAK,GAAG,EAAE;AAC9B;AAEA,SAAS,mBAAkC;AACzC,MAAI;AACF,WAAU,gBAAa,cAAc,OAAO,EAAE,KAAK,KAAK;AAAA,EAC1D,QAAQ;AAGN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAAoB,mBAA2B,UAA+B;AAErF,MAAI,sBAAsB,aAAa,CAAC,SAAU;AAClD,QAAM,eAAe,iBAAiB;AACtC,MAAI,CAAC,gBAAgB,iBAAiB,UAAW;AAEjD,MAAI,iBAAiB,qBAAsB;AAC3C,yBAAuB;AAEvB,MAAI,iBAAiB,mBAAmB;AAEtC,QAAI,kCAAkC,iBAAiB,GAAG;AAC1D;AAAA,EACF;AAEA,QAAM,YAAY,KAAK,IAAI,IAAI;AAC/B,MAAI,YAAY,qBAAqB;AACnC;AAAA,MACE,gCAAgC,iBAAiB,WAAW,YAAY,+BAC5C,KAAK,OAAO,sBAAsB,aAAa,GAAI,CAAC;AAAA,IAClF;AACA;AAAA,EACF;AAEA;AAAA,IACE,yCAAyC,iBAAiB,WAAW,YAAY;AAAA,EAEnF;AACA,kBAAgB,KAAK,IAAI;AACzB,oBAAkB,QAAQ;AAC5B;AAQA,SAAS,kBAAkB,UAAkC;AAC3D,MAAI,CAAC,UAAU;AACb,QAAI,0EAA0E;AAC9E,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,QAAQ,MAAM,QAAQ,UAAU,CAAC,UAAU,SAAS,SAAS,GAAG;AAAA,MACpE,UAAU;AAAA,MACV,OAAO;AAAA,IACT,CAAC;AACD,UAAM,MAAM;AACZ,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,QAAI,yBAA0B,IAAc,OAAO,EAAE;AACrD,WAAO;AAAA,EACT;AACF;AAQA,SAAS,qBAA8B;AACrC,MAAI;AACF,UAAM,UAAa,gBAAa,gBAAgB,OAAO,EAAE,KAAK;AAC9D,WAAO,QAAQ,KAAK,OAAO;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,eAA6B;AACrD,QAAM,OAAW,YAAQ,EAAE,MAAM,eAAe,SAAS,eAAe,CAAC;AACzE,OAAK,GAAG,WAAW,MAAM;AACvB,SAAK,QAAQ;AACb,QAAI,CAAC,cAAc;AACjB,qBAAe;AACf,UAAI,oBAAoB,aAAa,yBAAyB;AAAA,IAChE;AACA,oBAAgB,cAAc,IAAI;AAAA,EACpC,CAAC;AACD,OAAK,GAAG,SAAS,MAAM;AACrB,QAAI,cAAc;AAChB,qBAAe;AACf,UAAI,sBAAsB,aAAa,kBAAkB;AAAA,IAC3D;AACA,oBAAgB,cAAc,KAAK;AAAA,EACrC,CAAC;AACD,OAAK,GAAG,WAAW,MAAM;AACvB,SAAK,QAAQ;AACb,QAAI,cAAc;AAChB,qBAAe;AACf,UAAI,yBAAyB,aAAa,kBAAkB;AAAA,IAC9D;AACA,oBAAgB,cAAc,KAAK;AAAA,EACrC,CAAC;AACH;AAEA,SAAS,cACP,KACA,cACA,MACA,eACM;AACN,QAAM,CAAC,YAAY,aAAa,KAAK,IAAI,OAAO,IAAI,MAAM,GAAG;AAC7D,QAAM,aAAa,SAAS,eAAe,EAAE,KAAK;AAElD,MAAI,cAAc;AAEhB,UAAM,cAAkB,YAAQ,EAAE,MAAM,eAAe,MAAM,YAAY,CAAC;AAE1E,gBAAY,GAAG,WAAW,MAAM;AAE9B,kBAAY;AAAA,QACV,WAAW,IAAI,GAAG;AAAA,QAAsB,IAAI,GAAG;AAAA;AAAA;AAAA,MACjD;AAAA,IACF,CAAC;AAGD,QAAI,iBAAiB,OAAO,MAAM,CAAC;AACnC,UAAM,SAAS,CAAC,UAAkB;AAChC,uBAAiB,OAAO,OAAO,CAAC,gBAAgB,KAAK,CAAC;AACtD,YAAM,cAAc,eAAe,SAAS;AAC5C,UAAI,YAAY,SAAS,UAAU,GAAG;AACpC,oBAAY,eAAe,QAAQ,MAAM;AAEzC,qBAAa,MAAM,6CAA6C;AAEhE,YAAI,KAAK,SAAS,EAAG,aAAY,MAAM,IAAI;AAC3C,qBAAa,KAAK,WAAW;AAC7B,oBAAY,KAAK,YAAY;AAAA,MAC/B;AAAA,IACF;AACA,gBAAY,GAAG,QAAQ,MAAM;AAE7B,gBAAY,GAAG,SAAS,CAAC,QAAQ;AAC/B,UAAI,0BAA0B,IAAI,GAAG,KAAK,IAAI,OAAO,0BAA0B;AAE/E,oBAAc,KAAK,cAAc,MAAM,YAAY,UAAU;AAAA,IAC/D,CAAC;AAED,iBAAa,GAAG,SAAS,MAAM;AAC7B,kBAAY,QAAQ;AAAA,IACtB,CAAC;AAAA,EACH,OAAO;AACL,kBAAc,KAAK,cAAc,MAAM,YAAY,UAAU;AAAA,EAC/D;AACF;AAEA,SAAS,cACP,KACA,cACA,MACA,YACA,YACM;AACN,QAAM,WAAe,YAAQ,EAAE,MAAM,YAAY,MAAM,WAAW,CAAC;AAEnE,WAAS,GAAG,WAAW,MAAM;AAC3B,iBAAa,MAAM,6CAA6C;AAChE,QAAI,KAAK,SAAS,EAAG,UAAS,MAAM,IAAI;AACxC,iBAAa,KAAK,QAAQ;AAC1B,aAAS,KAAK,YAAY;AAAA,EAC5B,CAAC;AAED,WAAS,GAAG,SAAS,CAAC,QAAQ;AAC5B,QAAI,sBAAsB,IAAI,GAAG,KAAK,IAAI,OAAO,EAAE;AACnD,iBAAa,IAAI,kCAAkC;AAAA,EACrD,CAAC;AAED,eAAa,GAAG,SAAS,MAAM;AAC7B,aAAS,QAAQ;AAAA,EACnB,CAAC;AACH;AAEA,SAAS,cACP,KACA,KACA,eACM;AAIN,MAAI,IAAI,QAAQ,uBAAuB;AACrC,QAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,QAAI,IAAI,KAAK,UAAU;AAAA,MACrB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,KAAK,QAAQ;AAAA,MACb,gBAAgB;AAAA,IAClB,CAAC,CAAC;AACF;AAAA,EACF;AAGA,QAAM,YAAY,IAAI,OAAO;AAC7B,MAAI;AACJ,MAAI;AACF,gBAAY,IAAI,IAAI,SAAS;AAAA,EAC/B,QAAQ;AACN,QAAI,UAAU,GAAG;AACjB,QAAI,IAAI,aAAa;AACrB;AAAA,EACF;AAEA,QAAM,UAA+B;AAAA,IACnC,UAAU,eAAe,cAAc,UAAU;AAAA,IACjD,MAAM,eAAe,gBAAiB,SAAS,UAAU,MAAM,EAAE,KAAK;AAAA,IACtE,MAAM,eAAe,YAAY,UAAU,WAAW,UAAU;AAAA,IAChE,QAAQ,IAAI;AAAA,IACZ,SAAS,IAAI;AAAA,EACf;AAEA,QAAM,WAAgB,aAAQ,SAAS,CAAC,aAAa;AACnD,QAAI,UAAU,SAAS,cAAc,KAAK,SAAS,OAAO;AAC1D,aAAS,KAAK,GAAG;AAAA,EACnB,CAAC;AAED,WAAS,GAAG,SAAS,CAAC,QAAQ;AAC5B,QAAI,wBAAwB,SAAS,KAAK,IAAI,OAAO,EAAE;AACvD,QAAI,UAAU,GAAG;AACjB,QAAI,IAAI,aAAa;AAAA,EACvB,CAAC;AAED,MAAI,KAAK,QAAQ;AACnB;AAEO,SAAS,aACd,OAAe,cACf,gBAAwB,gBACxB,UAAsD,CAAC,GACE;AACzD,QAAM,aAAa,QAAQ,cAAc,QAAQ,IAAI,0BAA0B;AAC/E,QAAM,WAAW,QAAQ,YAAY,QAAQ,IAAI,wBAAwB;AACzE,oBAAkB;AAIlB,mBAAiB,IAAI,wBAAwB;AAAA,IAC3C,kBAAkB;AAAA,IAClB,SAAS,MAAM,kBAAkB,QAAQ;AAAA,IACzC;AAAA,EACF,CAAC;AACD,QAAM,SAAc,kBAAa,CAAC,KAAK,QAAQ;AAC7C,kBAAc,KAAK,KAAK,aAAa;AAAA,EACvC,CAAC;AAED,SAAO,GAAG,WAAW,CAAC,KAAK,cAAc,SAAS;AAChD,kBAAc,KAAK,cAA4B,MAAgB,aAAa;AAAA,EAC9E,CAAC;AAGD,SAAO,GAAG,eAAe,CAAC,MAAM,WAAW;AACzC,QAAI,OAAO,UAAU;AACnB,aAAO,IAAI,kCAAkC;AAAA,IAC/C;AAAA,EACF,CAAC;AAED,QAAM,iBAAiB,YAAY,MAAM;AACvC,qBAAiB,aAAa;AAC9B,wBAAoB,YAAY,QAAQ;AAAA,EAC1C,GAAG,eAAe;AAGlB,mBAAiB,aAAa;AAC9B,sBAAoB,YAAY,QAAQ;AAExC,SAAO,OAAO,MAAM,aAAa,MAAM;AACrC;AAAA,MACE,kCAAkC,IAAI,wBAAwB,aAAa,kBAC3D,UAAU;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,SAAO,EAAE,QAAQ,eAAe;AAClC;",
6
- "names": []
7
- }
@@ -1,12 +0,0 @@
1
- // src/lib/types.ts
2
- var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
3
- function validateUuid(value, label = "ID") {
4
- if (!UUID_RE.test(value)) {
5
- throw new Error(`Invalid ${label}: "${value}" is not a valid UUID`);
6
- }
7
- }
8
-
9
- export {
10
- validateUuid
11
- };
12
- //# sourceMappingURL=chunk-7NYKWN7U.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/types.ts"],
4
- "sourcesContent": ["const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport function validateUuid(value: string, label = 'ID'): void {\n if (!UUID_RE.test(value)) {\n throw new Error(`Invalid ${label}: \"${value}\" is not a valid UUID`);\n }\n}\n\n/** API response type for an instruction */\nexport interface Instruction {\n id: string;\n name: string;\n description: string;\n scope: string;\n version: string;\n tags: string[];\n content: string;\n createdAt: string;\n updatedAt: string;\n}\n\n/** Subset for list views where not all fields are needed */\nexport type InstructionSummary = Pick<Instruction, 'id' | 'name' | 'scope' | 'version' | 'tags' | 'updatedAt'>;\n\nexport interface InstructionVersion {\n id: string;\n versionNumber: number;\n changeSummary: string | null;\n createdAt: string;\n}\n\nexport interface ConvertResult {\n output: string;\n format: string;\n outputPath: string;\n warnings: string[];\n score?: { overall: number; details: Record<string, number> };\n}\n\nexport interface ConverterEntry {\n id: string;\n name: string;\n description: string;\n tier: number;\n outputPath: string;\n toolUrl: string;\n}\n\nexport interface ImportResult {\n instruction: { id: string; name: string };\n sourceFormat: string;\n parseWarnings: string[];\n}\n"],
5
- "mappings": ";AAAA,IAAM,UAAU;AAET,SAAS,aAAa,OAAe,QAAQ,MAAY;AAC9D,MAAI,CAAC,QAAQ,KAAK,KAAK,GAAG;AACxB,UAAM,IAAI,MAAM,WAAW,KAAK,MAAM,KAAK,uBAAuB;AAAA,EACpE;AACF;",
6
- "names": []
7
- }
@@ -1,42 +0,0 @@
1
- import {
2
- tmuxSpawnEnv
3
- } from "./chunk-KRBQLMOP.js";
4
-
5
- // src/lib/detect-tmux.ts
6
- import { spawn } from "node:child_process";
7
- function detectTmux() {
8
- return new Promise((resolve) => {
9
- let child;
10
- try {
11
- child = spawn("tmux", ["-V"], { stdio: ["ignore", "pipe", "pipe"], env: tmuxSpawnEnv() });
12
- } catch {
13
- resolve({ available: false });
14
- return;
15
- }
16
- let stdout = "";
17
- child.stdout?.on("data", (chunk) => {
18
- stdout += chunk.toString();
19
- });
20
- child.stderr?.on("data", () => {
21
- });
22
- child.on("error", () => {
23
- resolve({ available: false });
24
- });
25
- child.on("close", (code) => {
26
- if (code !== 0) {
27
- resolve({ available: false });
28
- return;
29
- }
30
- const match = stdout.trim().match(/^tmux\s+(\S+)/);
31
- resolve({
32
- available: true,
33
- version: match ? match[1] : void 0
34
- });
35
- });
36
- });
37
- }
38
-
39
- export {
40
- detectTmux
41
- };
42
- //# sourceMappingURL=chunk-BO76WKJR.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/detect-tmux.ts"],
4
- "sourcesContent": ["import { spawn } from 'node:child_process';\nimport { tmuxSpawnEnv } from './tmux.js';\n\nexport interface TmuxDetection {\n available: boolean;\n version?: string;\n path?: string;\n}\n\n/**\n * Detect whether `tmux` is installed and runnable.\n *\n * Uses `tmux -V` with stdout/stderr captured so we never block waiting on a\n * TTY. ENOENT (binary missing) and any non-zero exit code both resolve as\n * `{ available: false }`. We never reject \u2014 callers print a one-line user\n * hint and continue; tmux is a soft dependency for live-send.\n */\nexport function detectTmux(): Promise<TmuxDetection> {\n return new Promise((resolve) => {\n let child: ReturnType<typeof spawn>;\n try {\n child = spawn('tmux', ['-V'], { stdio: ['ignore', 'pipe', 'pipe'], env: tmuxSpawnEnv() });\n } catch {\n resolve({ available: false });\n return;\n }\n\n let stdout = '';\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr?.on('data', () => {\n // discard\n });\n child.on('error', () => {\n resolve({ available: false });\n });\n child.on('close', (code) => {\n if (code !== 0) {\n resolve({ available: false });\n return;\n }\n // `tmux -V` prints e.g. \"tmux 3.4\\n\"\n const match = stdout.trim().match(/^tmux\\s+(\\S+)/);\n resolve({\n available: true,\n version: match ? match[1] : undefined,\n });\n });\n });\n}\n"],
5
- "mappings": ";;;;;AAAA,SAAS,aAAa;AAiBf,SAAS,aAAqC;AACnD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI;AACJ,QAAI;AACF,cAAQ,MAAM,QAAQ,CAAC,IAAI,GAAG,EAAE,OAAO,CAAC,UAAU,QAAQ,MAAM,GAAG,KAAK,aAAa,EAAE,CAAC;AAAA,IAC1F,QAAQ;AACN,cAAQ,EAAE,WAAW,MAAM,CAAC;AAC5B;AAAA,IACF;AAEA,QAAI,SAAS;AACb,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC1C,gBAAU,MAAM,SAAS;AAAA,IAC3B,CAAC;AACD,UAAM,QAAQ,GAAG,QAAQ,MAAM;AAAA,IAE/B,CAAC;AACD,UAAM,GAAG,SAAS,MAAM;AACtB,cAAQ,EAAE,WAAW,MAAM,CAAC;AAAA,IAC9B,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACd,gBAAQ,EAAE,WAAW,MAAM,CAAC;AAC5B;AAAA,MACF;AAEA,YAAM,QAAQ,OAAO,KAAK,EAAE,MAAM,eAAe;AACjD,cAAQ;AAAA,QACN,WAAW;AAAA,QACX,SAAS,QAAQ,MAAM,CAAC,IAAI;AAAA,MAC9B,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;",
6
- "names": []
7
- }
@@ -1,53 +0,0 @@
1
- import {
2
- HBar,
3
- Panel,
4
- fit,
5
- friendlyLabel
6
- } from "./chunk-DQ3KELXD.js";
7
- import {
8
- DIM,
9
- GOLD,
10
- GREEN,
11
- RED
12
- } from "./chunk-QJQS6TUN.js";
13
-
14
- // src/dashboard/panels/outcomes.tsx
15
- import { Text } from "ink";
16
- import { jsx, jsxs } from "react/jsx-runtime";
17
- var OUTCOME_COLORS = {
18
- fully_achieved: GREEN,
19
- mostly_achieved: "#5BF5E0",
20
- partially_achieved: GOLD,
21
- not_achieved: RED,
22
- unclear_from_transcript: DIM
23
- };
24
- function OutcomesPanel({ api, width, barWidth }) {
25
- if (!api) {
26
- return /* @__PURE__ */ jsx(Panel, { title: "Outcomes", color: GREEN, width, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "API offline \u2014 no outcome data" }) });
27
- }
28
- const outcomes = api.outcomes ?? {};
29
- const sorted = Object.entries(outcomes).sort(([, a], [, b]) => b - a);
30
- if (sorted.length === 0) {
31
- return /* @__PURE__ */ jsx(Panel, { title: "Outcomes", color: GREEN, width, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "No analyzed sessions yet" }) });
32
- }
33
- const max = sorted[0][1];
34
- const total = sorted.reduce((s, [, v]) => s + v, 0);
35
- const nw = Math.max(8, width - barWidth - 20);
36
- return /* @__PURE__ */ jsx(Panel, { title: `Outcomes (${total} sessions)`, color: GREEN, width, children: sorted.map(([key, value]) => {
37
- const pct = total > 0 ? Math.round(value / total * 100) : 0;
38
- return /* @__PURE__ */ jsxs(Text, { wrap: "truncate-end", children: [
39
- /* @__PURE__ */ jsx(HBar, { value, max, width: barWidth }),
40
- /* @__PURE__ */ jsxs(Text, { color: OUTCOME_COLORS[key] ?? DIM, children: [
41
- " ",
42
- fit(friendlyLabel(key), nw)
43
- ] }),
44
- /* @__PURE__ */ jsx(Text, { children: String(value).padStart(5) }),
45
- /* @__PURE__ */ jsx(Text, { dimColor: true, children: String(pct + "%").padStart(5) })
46
- ] }, key);
47
- }) });
48
- }
49
-
50
- export {
51
- OutcomesPanel
52
- };
53
- //# sourceMappingURL=chunk-BRD5RUGM.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/dashboard/panels/outcomes.tsx"],
4
- "sourcesContent": ["import React from 'react';\nimport { Text } from 'ink';\nimport { GREEN, RED, GOLD, DIM } from '../types.js';\nimport type { ApiInsights } from '../types.js';\nimport { Panel, HBar, fit, friendlyLabel } from './shared.js';\n\nconst OUTCOME_COLORS: Record<string, string> = {\n fully_achieved: GREEN,\n mostly_achieved: '#5BF5E0',\n partially_achieved: GOLD,\n not_achieved: RED,\n unclear_from_transcript: DIM,\n};\n\nexport function OutcomesPanel({ api, width, barWidth }: {\n api: ApiInsights | null; width: number; barWidth: number;\n}) {\n if (!api) {\n return (\n <Panel title=\"Outcomes\" color={GREEN} width={width}>\n <Text dimColor>API offline \u2014 no outcome data</Text>\n </Panel>\n );\n }\n\n const outcomes = api.outcomes ?? {};\n const sorted = Object.entries(outcomes).sort(([, a], [, b]) => b - a);\n if (sorted.length === 0) {\n return (\n <Panel title=\"Outcomes\" color={GREEN} width={width}>\n <Text dimColor>No analyzed sessions yet</Text>\n </Panel>\n );\n }\n\n const max = sorted[0][1];\n const total = sorted.reduce((s, [, v]) => s + v, 0);\n const nw = Math.max(8, width - barWidth - 20);\n\n return (\n <Panel title={`Outcomes (${total} sessions)`} color={GREEN} width={width}>\n {sorted.map(([key, value]) => {\n const pct = total > 0 ? Math.round((value / total) * 100) : 0;\n return (\n <Text key={key} wrap=\"truncate-end\">\n <HBar value={value} max={max} width={barWidth} />\n <Text color={OUTCOME_COLORS[key] ?? DIM}> {fit(friendlyLabel(key), nw)}</Text>\n <Text>{String(value).padStart(5)}</Text>\n <Text dimColor>{String(pct + '%').padStart(5)}</Text>\n </Text>\n );\n })}\n </Panel>\n );\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;AACA,SAAS,YAAY;AAmBb,cA0BI,YA1BJ;AAdR,IAAM,iBAAyC;AAAA,EAC7C,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,yBAAyB;AAC3B;AAEO,SAAS,cAAc,EAAE,KAAK,OAAO,SAAS,GAElD;AACD,MAAI,CAAC,KAAK;AACR,WACE,oBAAC,SAAM,OAAM,YAAW,OAAO,OAAO,OACpC,8BAAC,QAAK,UAAQ,MAAC,gDAA6B,GAC9C;AAAA,EAEJ;AAEA,QAAM,WAAW,IAAI,YAAY,CAAC;AAClC,QAAM,SAAS,OAAO,QAAQ,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC;AACpE,MAAI,OAAO,WAAW,GAAG;AACvB,WACE,oBAAC,SAAM,OAAM,YAAW,OAAO,OAAO,OACpC,8BAAC,QAAK,UAAQ,MAAC,sCAAwB,GACzC;AAAA,EAEJ;AAEA,QAAM,MAAM,OAAO,CAAC,EAAE,CAAC;AACvB,QAAM,QAAQ,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,GAAG,CAAC;AAClD,QAAM,KAAK,KAAK,IAAI,GAAG,QAAQ,WAAW,EAAE;AAE5C,SACE,oBAAC,SAAM,OAAO,aAAa,KAAK,cAAc,OAAO,OAAO,OACzD,iBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC5B,UAAM,MAAM,QAAQ,IAAI,KAAK,MAAO,QAAQ,QAAS,GAAG,IAAI;AAC5D,WACE,qBAAC,QAAe,MAAK,gBACnB;AAAA,0BAAC,QAAK,OAAc,KAAU,OAAO,UAAU;AAAA,MAC/C,qBAAC,QAAK,OAAO,eAAe,GAAG,KAAK,KAAK;AAAA;AAAA,QAAE,IAAI,cAAc,GAAG,GAAG,EAAE;AAAA,SAAE;AAAA,MACvE,oBAAC,QAAM,iBAAO,KAAK,EAAE,SAAS,CAAC,GAAE;AAAA,MACjC,oBAAC,QAAK,UAAQ,MAAE,iBAAO,MAAM,GAAG,EAAE,SAAS,CAAC,GAAE;AAAA,SAJrC,GAKX;AAAA,EAEJ,CAAC,GACH;AAEJ;",
6
- "names": []
7
- }
@@ -1,43 +0,0 @@
1
- import {
2
- HBar,
3
- Panel,
4
- fit
5
- } from "./chunk-DQ3KELXD.js";
6
- import {
7
- BLUE,
8
- DIM
9
- } from "./chunk-QJQS6TUN.js";
10
-
11
- // src/dashboard/panels/instructions.tsx
12
- import { Text } from "ink";
13
- import { jsx, jsxs } from "react/jsx-runtime";
14
- function InstructionsPanel({ instructions, width, barWidth }) {
15
- if (!instructions) {
16
- return /* @__PURE__ */ jsx(Panel, { title: "Active Instructions", color: BLUE, width, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "API offline \u2014 no instruction data" }) });
17
- }
18
- if (instructions.length === 0) {
19
- return /* @__PURE__ */ jsx(Panel, { title: "Active Instructions", color: BLUE, width, children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: "No instructions linked to sessions yet" }) });
20
- }
21
- const sorted = [...instructions].sort((a, b) => b.linkedSessions - a.linkedSessions).slice(0, 10);
22
- const max = sorted[0].linkedSessions;
23
- const nw = Math.max(8, width - barWidth - 15);
24
- return /* @__PURE__ */ jsxs(Panel, { title: `Active Instructions (${instructions.length})`, color: BLUE, width, children: [
25
- /* @__PURE__ */ jsxs(Text, { dimColor: true, wrap: "truncate-end", children: [
26
- "".padEnd(barWidth + 1 + nw),
27
- "sessions".padStart(9)
28
- ] }),
29
- sorted.map((inst) => /* @__PURE__ */ jsxs(Text, { wrap: "truncate-end", children: [
30
- /* @__PURE__ */ jsx(HBar, { value: inst.linkedSessions, max, width: barWidth }),
31
- /* @__PURE__ */ jsxs(Text, { color: DIM, children: [
32
- " ",
33
- fit(inst.name, nw)
34
- ] }),
35
- /* @__PURE__ */ jsx(Text, { children: String(inst.linkedSessions).padStart(9) })
36
- ] }, inst.name))
37
- ] });
38
- }
39
-
40
- export {
41
- InstructionsPanel
42
- };
43
- //# sourceMappingURL=chunk-BT6Z6545.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/dashboard/panels/instructions.tsx"],
4
- "sourcesContent": ["import React from 'react';\nimport { Text } from 'ink';\nimport { BLUE, DIM } from '../types.js';\nimport { Panel, HBar, fit } from './shared.js';\n\nexport function InstructionsPanel({ instructions, width, barWidth }: {\n instructions: Array<{ name: string; linkedSessions: number }> | null;\n width: number;\n barWidth: number;\n}) {\n if (!instructions) {\n return (\n <Panel title=\"Active Instructions\" color={BLUE} width={width}>\n <Text dimColor>API offline \u2014 no instruction data</Text>\n </Panel>\n );\n }\n\n if (instructions.length === 0) {\n return (\n <Panel title=\"Active Instructions\" color={BLUE} width={width}>\n <Text dimColor>No instructions linked to sessions yet</Text>\n </Panel>\n );\n }\n\n const sorted = [...instructions].sort((a, b) => b.linkedSessions - a.linkedSessions).slice(0, 10);\n const max = sorted[0].linkedSessions;\n const nw = Math.max(8, width - barWidth - 15);\n\n return (\n <Panel title={`Active Instructions (${instructions.length})`} color={BLUE} width={width}>\n <Text dimColor wrap=\"truncate-end\">{''.padEnd(barWidth + 1 + nw)}{'sessions'.padStart(9)}</Text>\n {sorted.map(inst => (\n <Text key={inst.name} wrap=\"truncate-end\">\n <HBar value={inst.linkedSessions} max={max} width={barWidth} />\n <Text color={DIM}> {fit(inst.name, nw)}</Text>\n <Text>{String(inst.linkedSessions).padStart(9)}</Text>\n </Text>\n ))}\n </Panel>\n );\n}\n"],
5
- "mappings": ";;;;;;;;;;;AACA,SAAS,YAAY;AAYb,cAmBF,YAnBE;AARD,SAAS,kBAAkB,EAAE,cAAc,OAAO,SAAS,GAI/D;AACD,MAAI,CAAC,cAAc;AACjB,WACE,oBAAC,SAAM,OAAM,uBAAsB,OAAO,MAAM,OAC9C,8BAAC,QAAK,UAAQ,MAAC,oDAAiC,GAClD;AAAA,EAEJ;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,WACE,oBAAC,SAAM,OAAM,uBAAsB,OAAO,MAAM,OAC9C,8BAAC,QAAK,UAAQ,MAAC,oDAAsC,GACvD;AAAA,EAEJ;AAEA,QAAM,SAAS,CAAC,GAAG,YAAY,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,GAAG,EAAE;AAChG,QAAM,MAAM,OAAO,CAAC,EAAE;AACtB,QAAM,KAAK,KAAK,IAAI,GAAG,QAAQ,WAAW,EAAE;AAE5C,SACE,qBAAC,SAAM,OAAO,wBAAwB,aAAa,MAAM,KAAK,OAAO,MAAM,OACzE;AAAA,yBAAC,QAAK,UAAQ,MAAC,MAAK,gBAAgB;AAAA,SAAG,OAAO,WAAW,IAAI,EAAE;AAAA,MAAG,WAAW,SAAS,CAAC;AAAA,OAAE;AAAA,IACxF,OAAO,IAAI,UACV,qBAAC,QAAqB,MAAK,gBACzB;AAAA,0BAAC,QAAK,OAAO,KAAK,gBAAgB,KAAU,OAAO,UAAU;AAAA,MAC7D,qBAAC,QAAK,OAAO,KAAK;AAAA;AAAA,QAAE,IAAI,KAAK,MAAM,EAAE;AAAA,SAAE;AAAA,MACvC,oBAAC,QAAM,iBAAO,KAAK,cAAc,EAAE,SAAS,CAAC,GAAE;AAAA,SAHtC,KAAK,IAIhB,CACD;AAAA,KACH;AAEJ;",
6
- "names": []
7
- }
@@ -1,39 +0,0 @@
1
- // src/lib/output.ts
2
- function formatDate(date) {
3
- const d = new Date(date);
4
- return d.toLocaleDateString("en-US", {
5
- year: "numeric",
6
- month: "short",
7
- day: "numeric",
8
- hour: "2-digit",
9
- minute: "2-digit"
10
- });
11
- }
12
- function truncate(str, max) {
13
- if (max < 2 || str.length <= max) return str;
14
- return str.slice(0, max - 1) + "\u2026";
15
- }
16
- function supportsColor() {
17
- if ("NO_COLOR" in process.env) return false;
18
- if (process.env.FORCE_COLOR) return true;
19
- return process.stdout.isTTY === true;
20
- }
21
- function formatScope(scope) {
22
- if (!supportsColor()) return scope;
23
- const colors = {
24
- org: "\x1B[35m",
25
- team: "\x1B[36m",
26
- project: "\x1B[33m",
27
- personal: "\x1B[32m"
28
- };
29
- const reset = "\x1B[0m";
30
- const color = colors[scope] ?? "";
31
- return `${color}${scope}${reset}`;
32
- }
33
-
34
- export {
35
- formatDate,
36
- truncate,
37
- formatScope
38
- };
39
- //# sourceMappingURL=chunk-BZDKEQKU.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/output.ts"],
4
- "sourcesContent": ["export function formatDate(date: string): string {\n const d = new Date(date);\n return d.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport function truncate(str: string, max: number): string {\n if (max < 2 || str.length <= max) return str;\n return str.slice(0, max - 1) + '\\u2026';\n}\n\nfunction supportsColor(): boolean {\n if ('NO_COLOR' in process.env) return false;\n if (process.env.FORCE_COLOR) return true;\n return process.stdout.isTTY === true;\n}\n\nexport function formatScope(scope: string): string {\n if (!supportsColor()) return scope;\n\n const colors: Record<string, string> = {\n org: '\\x1b[35m',\n team: '\\x1b[36m',\n project: '\\x1b[33m',\n personal: '\\x1b[32m',\n };\n const reset = '\\x1b[0m';\n const color = colors[scope] ?? '';\n return `${color}${scope}${reset}`;\n}\n"],
5
- "mappings": ";AAAO,SAAS,WAAW,MAAsB;AAC/C,QAAM,IAAI,IAAI,KAAK,IAAI;AACvB,SAAO,EAAE,mBAAmB,SAAS;AAAA,IACnC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACH;AAEO,SAAS,SAAS,KAAa,KAAqB;AACzD,MAAI,MAAM,KAAK,IAAI,UAAU,IAAK,QAAO;AACzC,SAAO,IAAI,MAAM,GAAG,MAAM,CAAC,IAAI;AACjC;AAEA,SAAS,gBAAyB;AAChC,MAAI,cAAc,QAAQ,IAAK,QAAO;AACtC,MAAI,QAAQ,IAAI,YAAa,QAAO;AACpC,SAAO,QAAQ,OAAO,UAAU;AAClC;AAEO,SAAS,YAAY,OAAuB;AACjD,MAAI,CAAC,cAAc,EAAG,QAAO;AAE7B,QAAM,SAAiC;AAAA,IACrC,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACA,QAAM,QAAQ;AACd,QAAM,QAAQ,OAAO,KAAK,KAAK;AAC/B,SAAO,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK;AACjC;",
6
- "names": []
7
- }
@@ -1,17 +0,0 @@
1
- // src/lib/permanent-job-error.ts
2
- var PermanentJobError = class extends Error {
3
- __isPermanentJobError = true;
4
- constructor(message) {
5
- super(message);
6
- this.name = "PermanentJobError";
7
- }
8
- };
9
- function isPermanentJobError(err) {
10
- return err instanceof Error && err.__isPermanentJobError === true;
11
- }
12
-
13
- export {
14
- PermanentJobError,
15
- isPermanentJobError
16
- };
17
- //# sourceMappingURL=chunk-DGHWRQXL.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/permanent-job-error.ts"],
4
- "sourcesContent": ["/**\n * Sentinel error class for handler outcomes that retry is guaranteed not to\n * help with \u2014 e.g. \"no eval cases defined for target\", \"session has too few\n * events to analyze\". The agent loop intercepts these (see agent-loop.ts)\n * and tells Graphile to skip remaining attempts (via `permanently_fail_jobs`)\n * instead of running the same handler N more times against the same data.\n *\n * Use ONLY for genuinely deterministic failures. Transient errors (LLM\n * timeout, network, tool-CLI flakiness) should remain plain Error so Graphile\n * retries them.\n */\nexport class PermanentJobError extends Error {\n readonly __isPermanentJobError = true;\n\n constructor(message: string) {\n super(message);\n this.name = 'PermanentJobError';\n }\n}\n\nexport function isPermanentJobError(err: unknown): err is PermanentJobError {\n return (\n err instanceof Error &&\n (err as { __isPermanentJobError?: boolean }).__isPermanentJobError === true\n );\n}\n"],
5
- "mappings": ";AAWO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAClC,wBAAwB;AAAA,EAEjC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,oBAAoB,KAAwC;AAC1E,SACE,eAAe,SACd,IAA4C,0BAA0B;AAE3E;",
6
- "names": []
7
- }