@rulemetric/cli 0.7.3 → 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 -310
  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 -796
  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 -47
  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 -16
  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 -15
  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 -12
  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 -20
  217. package/dist/lib/manual-tasks-meta.js +1 -8
  218. package/dist/lib/manual-tasks.js +1 -80
  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 +9 -8
  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-7LVVKQMZ.js +0 -98
  270. package/dist/chunk-7LVVKQMZ.js.map +0 -7
  271. package/dist/chunk-7NNFYWKK.js +0 -243
  272. package/dist/chunk-7NNFYWKK.js.map +0 -7
  273. package/dist/chunk-7NYKWN7U.js +0 -12
  274. package/dist/chunk-7NYKWN7U.js.map +0 -7
  275. package/dist/chunk-BO76WKJR.js +0 -42
  276. package/dist/chunk-BO76WKJR.js.map +0 -7
  277. package/dist/chunk-BRD5RUGM.js +0 -53
  278. package/dist/chunk-BRD5RUGM.js.map +0 -7
  279. package/dist/chunk-BT6Z6545.js +0 -43
  280. package/dist/chunk-BT6Z6545.js.map +0 -7
  281. package/dist/chunk-BZDKEQKU.js +0 -39
  282. package/dist/chunk-BZDKEQKU.js.map +0 -7
  283. package/dist/chunk-DGHWRQXL.js +0 -17
  284. package/dist/chunk-DGHWRQXL.js.map +0 -7
  285. package/dist/chunk-DIQUV5FR.js +0 -257
  286. package/dist/chunk-DIQUV5FR.js.map +0 -7
  287. package/dist/chunk-DMX5YOTM.js +0 -167
  288. package/dist/chunk-DMX5YOTM.js.map +0 -7
  289. package/dist/chunk-DNKSVWMD.js +0 -108
  290. package/dist/chunk-DNKSVWMD.js.map +0 -7
  291. package/dist/chunk-DQ3KELXD.js +0 -74
  292. package/dist/chunk-DQ3KELXD.js.map +0 -7
  293. package/dist/chunk-DUJSRBLP.js +0 -122
  294. package/dist/chunk-DUJSRBLP.js.map +0 -7
  295. package/dist/chunk-E3BIT53W.js +0 -154
  296. package/dist/chunk-E3BIT53W.js.map +0 -7
  297. package/dist/chunk-EARWG4EV.js +0 -22
  298. package/dist/chunk-EARWG4EV.js.map +0 -7
  299. package/dist/chunk-EI5BHWXA.js +0 -1662
  300. package/dist/chunk-EI5BHWXA.js.map +0 -7
  301. package/dist/chunk-EJ3YAFDP.js +0 -37
  302. package/dist/chunk-EJ3YAFDP.js.map +0 -7
  303. package/dist/chunk-EKJ2CABV.js +0 -76
  304. package/dist/chunk-EKJ2CABV.js.map +0 -7
  305. package/dist/chunk-EKP32DLN.js +0 -16
  306. package/dist/chunk-EKP32DLN.js.map +0 -7
  307. package/dist/chunk-EYPAAGN5.js +0 -51
  308. package/dist/chunk-EYPAAGN5.js.map +0 -7
  309. package/dist/chunk-F5N6CLJJ.js +0 -1995
  310. package/dist/chunk-F5N6CLJJ.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-OCKHW72U.js +0 -55
  336. package/dist/chunk-OCKHW72U.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-QJQS6TUN.js +0 -44
  347. package/dist/chunk-QJQS6TUN.js.map +0 -7
  348. package/dist/chunk-QN34TGD3.js +0 -83
  349. package/dist/chunk-QN34TGD3.js.map +0 -7
  350. package/dist/chunk-QSN77T7C.js +0 -250
  351. package/dist/chunk-QSN77T7C.js.map +0 -7
  352. package/dist/chunk-R56PH7YE.js +0 -78
  353. package/dist/chunk-R56PH7YE.js.map +0 -7
  354. package/dist/chunk-RAXRZYOB.js +0 -299
  355. package/dist/chunk-RAXRZYOB.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-VA5FFOS7.js +0 -243
  367. package/dist/chunk-VA5FFOS7.js.map +0 -7
  368. package/dist/chunk-W2YERO7E.js +0 -170
  369. package/dist/chunk-W2YERO7E.js.map +0 -7
  370. package/dist/chunk-W53GKIZQ.js +0 -50
  371. package/dist/chunk-W53GKIZQ.js.map +0 -7
  372. package/dist/chunk-WA4MWYRW.js +0 -254
  373. package/dist/chunk-WA4MWYRW.js.map +0 -7
  374. package/dist/chunk-XC6M4CSW.js +0 -44
  375. package/dist/chunk-XC6M4CSW.js.map +0 -7
  376. package/dist/chunk-XK42ZBDE.js +0 -23
  377. package/dist/chunk-XK42ZBDE.js.map +0 -7
  378. package/dist/chunk-XUV6DDBF.js +0 -124
  379. package/dist/chunk-XUV6DDBF.js.map +0 -7
  380. package/dist/chunk-XZXS2W24.js.map +0 -7
  381. package/dist/chunk-Y3WD5CSW.js +0 -49
  382. package/dist/chunk-Y3WD5CSW.js.map +0 -7
  383. package/dist/chunk-Y4BJXXYV.js +0 -148
  384. package/dist/chunk-Y4BJXXYV.js.map +0 -7
  385. package/dist/chunk-YNIH3KMU.js +0 -121
  386. package/dist/chunk-YNIH3KMU.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,299 +0,0 @@
1
- import {
2
- startTerminalTargetHeartbeat
3
- } from "./chunk-GIUBARWS.js";
4
- import {
5
- processRunCleanup
6
- } from "./chunk-6NBS5XFS.js";
7
- import {
8
- processSendMessage
9
- } from "./chunk-W53GKIZQ.js";
10
- import {
11
- processSessionGoal
12
- } from "./chunk-OCKHW72U.js";
13
- import {
14
- cronRefreshSkills
15
- } from "./chunk-RQ2TMLKG.js";
16
- import {
17
- cronSuggestInstructions
18
- } from "./chunk-DMX5YOTM.js";
19
- import {
20
- processAnnouncement
21
- } from "./chunk-OO7JDFS4.js";
22
- import {
23
- processConversation
24
- } from "./chunk-XK42ZBDE.js";
25
- import {
26
- processEval
27
- } from "./chunk-RMTT4KDY.js";
28
- import {
29
- processInsights
30
- } from "./chunk-VA5FFOS7.js";
31
- import {
32
- processLaunch
33
- } from "./chunk-JULOLTZS.js";
34
- import {
35
- isPermanentJobError
36
- } from "./chunk-DGHWRQXL.js";
37
- import {
38
- ApiError,
39
- apiGet,
40
- apiPost
41
- } from "./chunk-ZUJBM6HE.js";
42
-
43
- // src/lib/agent-loop.ts
44
- var HANDLERS = {
45
- process_eval: processEval,
46
- process_insights: processInsights,
47
- process_launch: processLaunch,
48
- process_send_message: processSendMessage,
49
- process_conversation: processConversation,
50
- // agent_jobs kinds (Phase 4c Stage 3b, migration 00083). processSessionGoal
51
- // and processAnnouncement take an optional deps object in the helpers
52
- // position — every key is optional, so JobHelpers passing through is
53
- // harmless and they fall back to their defaults.
54
- process_session_goal: processSessionGoal,
55
- process_announcement: processAnnouncement,
56
- // Multi-session orchestration ("runs") worktree cleanup (Task 5.2). agent_jobs
57
- // kind — no mirror table. Enqueued by POST /api/runs/:id/cleanup; prunes the
58
- // worktrees of a run's ended sessions, guarding against uncommitted work.
59
- process_run_cleanup: processRunCleanup,
60
- cron_suggest_instructions: cronSuggestInstructions,
61
- // Dropped by accident in the Phase 4c graphile→agent_jobs migration: the
62
- // handler survived but lost its registration + schedule, so the skills
63
- // registry froze (last refresh 2026-05-21) and the suggest cron marked
64
- // every suggestion stale on each run. Re-scheduled by migration 00086.
65
- cron_refresh_skills: cronRefreshSkills
66
- };
67
- var CAPABILITIES = Object.keys(HANDLERS);
68
- var DB_REQUIRING_KINDS = /* @__PURE__ */ new Set([
69
- "process_session_goal",
70
- "process_announcement",
71
- "process_run_cleanup"
72
- ]);
73
- function availableCapabilities(env = process.env) {
74
- if (env.DATABASE_URL) return CAPABILITIES;
75
- return CAPABILITIES.filter((kind) => !DB_REQUIRING_KINDS.has(kind));
76
- }
77
- var DEFAULT_POLL_WAIT_MS = 3e4;
78
- var DEFAULT_HEARTBEAT_MS = 3e4;
79
- var PRESENCE_HEARTBEAT_MS = 3e4;
80
- var BACKOFF_INITIAL_MS = 250;
81
- var BACKOFF_MAX_MS = 5e3;
82
- var PRESENCE_CLIENT_NAME = `thin-agent-${process.pid}`;
83
- function startPresenceHeartbeat(capabilities, signal, log, version) {
84
- const send = (status) => {
85
- void apiPost("/api/workers/heartbeat", {
86
- workerType: "cli-worker",
87
- clientName: PRESENCE_CLIENT_NAME,
88
- clientVersion: version,
89
- workerVersion: "0.1.0",
90
- currentJobId: null,
91
- inFlightCount: 0,
92
- lastError: null,
93
- status,
94
- metadata: { capabilities, mode: "thin-agent" }
95
- }).catch((err) => {
96
- structuredLog(log, {
97
- event: "presence_heartbeat_error",
98
- error: err instanceof Error ? err.message : String(err)
99
- });
100
- });
101
- };
102
- send("alive");
103
- const timer = setInterval(() => send("alive"), PRESENCE_HEARTBEAT_MS);
104
- signal.addEventListener("abort", () => {
105
- clearInterval(timer);
106
- send("shutting_down");
107
- }, { once: true });
108
- }
109
- function structuredLog(log, event) {
110
- try {
111
- log(JSON.stringify({ ts: (/* @__PURE__ */ new Date()).toISOString(), ...event }));
112
- } catch {
113
- log(`[agent-loop] log_error event=${event["event"]}`);
114
- }
115
- }
116
- function abortableSleep(ms, signal) {
117
- if (signal.aborted) return Promise.resolve(false);
118
- if (ms <= 0) return Promise.resolve(true);
119
- return new Promise((resolve) => {
120
- const timer = setTimeout(() => {
121
- signal.removeEventListener("abort", onAbort);
122
- resolve(true);
123
- }, ms);
124
- const onAbort = () => {
125
- clearTimeout(timer);
126
- signal.removeEventListener("abort", onAbort);
127
- resolve(false);
128
- };
129
- signal.addEventListener("abort", onAbort, { once: true });
130
- });
131
- }
132
- async function pollForWork(capabilities, waitMs) {
133
- const qs = `capabilities=${encodeURIComponent(capabilities.join(","))}&waitMs=${waitMs}`;
134
- const result = await apiGet(`/api/work/next?${qs}`);
135
- if (result == null || typeof result === "string") return null;
136
- return result;
137
- }
138
- function makeHelpers(attempts, log) {
139
- return {
140
- logger: {
141
- info: (msg) => log(msg),
142
- warn: (msg) => log(msg),
143
- error: (msg) => log(msg)
144
- },
145
- job: { attempts }
146
- };
147
- }
148
- async function runOne(job, heartbeatIntervalMs, log) {
149
- const handler = HANDLERS[job.kind];
150
- const startedAt = Date.now();
151
- structuredLog(log, {
152
- event: "claim",
153
- jobId: job.id,
154
- kind: job.kind,
155
- attempts: job.attempts
156
- });
157
- if (!handler) {
158
- const msg = `unknown kind: ${job.kind}`;
159
- structuredLog(log, {
160
- event: "fail",
161
- jobId: job.id,
162
- kind: job.kind,
163
- terminal: true,
164
- error: msg
165
- });
166
- await apiPost(`/api/work/${job.id}/fail`, {
167
- leaseToken: job.leaseToken,
168
- error: msg,
169
- terminal: true
170
- }).catch(() => {
171
- });
172
- return;
173
- }
174
- const heartbeatTimer = setInterval(() => {
175
- structuredLog(log, { event: "heartbeat", jobId: job.id });
176
- apiPost(`/api/work/${job.id}/heartbeat`, {
177
- leaseToken: job.leaseToken
178
- }).catch((err) => {
179
- structuredLog(log, {
180
- event: "heartbeat_error",
181
- jobId: job.id,
182
- error: err instanceof Error ? err.message : String(err)
183
- });
184
- });
185
- }, heartbeatIntervalMs);
186
- try {
187
- const helpers = makeHelpers(job.attempts, log);
188
- const result = await handler(job.payload, helpers) ?? {};
189
- clearInterval(heartbeatTimer);
190
- structuredLog(log, {
191
- event: "complete",
192
- jobId: job.id,
193
- kind: job.kind,
194
- durationMs: Date.now() - startedAt
195
- });
196
- await apiPost(`/api/work/${job.id}/complete`, {
197
- leaseToken: job.leaseToken,
198
- result
199
- });
200
- } catch (err) {
201
- clearInterval(heartbeatTimer);
202
- const terminal = isPermanentJobError(err);
203
- const message = err instanceof Error ? err.message : String(err);
204
- structuredLog(log, {
205
- event: "fail",
206
- jobId: job.id,
207
- kind: job.kind,
208
- durationMs: Date.now() - startedAt,
209
- terminal,
210
- error: message
211
- });
212
- await apiPost(`/api/work/${job.id}/fail`, {
213
- leaseToken: job.leaseToken,
214
- error: message,
215
- terminal
216
- }).catch((postErr) => {
217
- structuredLog(log, {
218
- event: "fail_post_error",
219
- jobId: job.id,
220
- error: postErr instanceof Error ? postErr.message : String(postErr)
221
- });
222
- });
223
- }
224
- }
225
- async function runAgentLoop(opts) {
226
- const log = opts.log ?? (() => void 0);
227
- const pollWaitMs = opts.pollWaitMs ?? DEFAULT_POLL_WAIT_MS;
228
- const heartbeatIntervalMs = opts.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_MS;
229
- const capabilities = opts.capabilities ?? availableCapabilities();
230
- let backoffMs = BACKOFF_INITIAL_MS;
231
- structuredLog(log, {
232
- event: "agent_start",
233
- capabilities,
234
- pollWaitMs,
235
- heartbeatIntervalMs
236
- });
237
- startPresenceHeartbeat(capabilities, opts.signal, log, opts.version);
238
- void startTerminalTargetHeartbeat({ signal: opts.signal, log }).catch((err) => {
239
- structuredLog(log, {
240
- event: "tt_heartbeat_fatal",
241
- error: err instanceof Error ? err.message : String(err)
242
- });
243
- });
244
- const VERSION_CHECK_INTERVAL_MS = 5 * 6e4;
245
- let lastVersionCheck = 0;
246
- const versionDrifted = () => {
247
- if (!opts.readInstalledVersion || !opts.version) return false;
248
- const now = Date.now();
249
- if (now - lastVersionCheck < VERSION_CHECK_INTERVAL_MS) return false;
250
- lastVersionCheck = now;
251
- const onDisk = opts.readInstalledVersion();
252
- return Boolean(onDisk && onDisk !== opts.version);
253
- };
254
- while (!opts.signal.aborted) {
255
- if (versionDrifted()) {
256
- structuredLog(log, {
257
- event: "agent_version_drift",
258
- bootVersion: opts.version,
259
- installedVersion: opts.readInstalledVersion?.() ?? null
260
- });
261
- opts.onVersionDrift?.();
262
- break;
263
- }
264
- let job = null;
265
- try {
266
- job = await pollForWork(capabilities, pollWaitMs);
267
- } catch (err) {
268
- const status = err instanceof ApiError ? err.statusCode : void 0;
269
- structuredLog(log, {
270
- event: "poll_error",
271
- status,
272
- error: err instanceof Error ? err.message : String(err)
273
- });
274
- const completed = await abortableSleep(backoffMs, opts.signal);
275
- if (!completed) break;
276
- backoffMs = Math.min(backoffMs * 2, BACKOFF_MAX_MS);
277
- continue;
278
- }
279
- if (!job) {
280
- structuredLog(log, { event: "poll_204" });
281
- const completed = await abortableSleep(backoffMs, opts.signal);
282
- if (!completed) break;
283
- backoffMs = Math.min(backoffMs * 2, BACKOFF_MAX_MS);
284
- continue;
285
- }
286
- backoffMs = BACKOFF_INITIAL_MS;
287
- await runOne(job, heartbeatIntervalMs, log);
288
- }
289
- structuredLog(log, { event: "agent_stop" });
290
- }
291
-
292
- export {
293
- HANDLERS,
294
- CAPABILITIES,
295
- availableCapabilities,
296
- pollForWork,
297
- runAgentLoop
298
- };
299
- //# sourceMappingURL=chunk-RAXRZYOB.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/agent-loop.ts"],
4
- "sourcesContent": ["// Phase 4b thin-agent migration: the parallel-run worker loop that replaces\n// graphile-worker's LISTEN/NOTIFY pickup with HTTP long-polling against the\n// Phase 4a /api/work endpoints. See docs/plans/2026-05-25-thin-agent-migration.md.\n//\n// This file is invoked exclusively by `rulemetric evals agent` \u2014 the only\n// worker mode since Phase 4c deleted the graphile path.\n//\n// Lifecycle for one cycle:\n// 1. Long-poll GET /api/work/next?capabilities=...&waitMs=...\n// 2. If 204 (returned as \"\" by api-client because no JSON body), increment\n// a small backoff capped at 5s and re-poll.\n// 3. If 200, dispatch by `kind` to the matching handler from HANDLERS.\n// 4. Start a heartbeat timer that POSTs /api/work/:id/heartbeat at\n// heartbeatIntervalMs while the handler runs.\n// 5. On success: POST /api/work/:id/complete with { result, leaseToken }.\n// On PermanentJobError: POST /fail with terminal=true (server will not\n// requeue regardless of attempts). On any other error: POST /fail with\n// terminal=false (server requeues if attempts < max).\n//\n// Abort behavior: an AbortSignal short-circuits the next long-poll and any\n// backoff sleep. An in-flight handler can't be cancelled (it has already\n// spawned `claude` subprocesses), so we await it to natural completion and\n// then exit. This matches listen.ts's 10s shutdown grace pattern, except we\n// don't need an outer hard-kill timer here \u2014 the caller (the oclif command)\n// owns the process.exit.\n\nimport type { JobHelpers } from './job-helpers.js';\nimport { apiGet, apiPost, ApiError } from './api-client.js';\nimport { isPermanentJobError } from './permanent-job-error.js';\nimport { processEval } from './handlers/process-eval.js';\nimport { processInsights } from './handlers/process-insights.js';\nimport { processLaunch } from './handlers/process-launch.js';\nimport { processConversation } from './handlers/process-conversation.js';\nimport { processSendMessage } from './handlers/process-send-message.js';\nimport { processSessionGoal } from './handlers/process-session-goal.js';\nimport { processAnnouncement } from './handlers/process-announcement.js';\nimport { processRunCleanup } from './handlers/process-run-cleanup.js';\nimport { cronSuggestInstructions } from './handlers/cron-suggest-instructions.js';\nimport { cronRefreshSkills } from './handlers/cron-refresh-skills.js';\nimport { startTerminalTargetHeartbeat } from './terminal-target-heartbeat.js';\n\n// Handler dispatch table. Keys MUST match the API's CAPABILITY_TO_TABLE keys\n// in apps/api/src/routes/work.ts; mismatches would cause the API to silently\n// drop the capability and starve this kind of work.\ntype Handler = (\n payload: Record<string, unknown>,\n helpers: JobHelpers,\n) => Promise<Record<string, unknown> | undefined | void>;\n\nexport const HANDLERS: Record<string, Handler> = {\n process_eval: processEval as unknown as Handler,\n process_insights: processInsights as unknown as Handler,\n process_launch: processLaunch as unknown as Handler,\n process_send_message: processSendMessage as unknown as Handler,\n process_conversation: processConversation as unknown as Handler,\n // agent_jobs kinds (Phase 4c Stage 3b, migration 00083). processSessionGoal\n // and processAnnouncement take an optional deps object in the helpers\n // position \u2014 every key is optional, so JobHelpers passing through is\n // harmless and they fall back to their defaults.\n process_session_goal: processSessionGoal as unknown as Handler,\n process_announcement: processAnnouncement as unknown as Handler,\n // Multi-session orchestration (\"runs\") worktree cleanup (Task 5.2). agent_jobs\n // kind \u2014 no mirror table. Enqueued by POST /api/runs/:id/cleanup; prunes the\n // worktrees of a run's ended sessions, guarding against uncommitted work.\n process_run_cleanup: processRunCleanup as unknown as Handler,\n cron_suggest_instructions: cronSuggestInstructions as unknown as Handler,\n // Dropped by accident in the Phase 4c graphile\u2192agent_jobs migration: the\n // handler survived but lost its registration + schedule, so the skills\n // registry froze (last refresh 2026-05-21) and the suggest cron marked\n // every suggestion stale on each run. Re-scheduled by migration 00086.\n cron_refresh_skills: cronRefreshSkills as unknown as Handler,\n};\n\nexport const CAPABILITIES: readonly string[] = Object.keys(HANDLERS);\n\n// Kinds whose handlers open a DIRECT Postgres connection (getDb \u2192 requires\n// DATABASE_URL): process-session-goal, process-announcement, process-run-cleanup.\n// A worker-only npm install (the onboarding default) has API auth but no DB\n// creds \u2014 if it advertises these kinds it claims jobs it can only throw on, and\n// process_session_goal has MAX_ATTEMPTS=1, so a single claim PERMANENTLY fails\n// the job (goalSummary dead for every npm user). Advertise them only when a\n// direct DB connection is actually configured; otherwise the rows stay pending\n// for a repo-checkout worker instead of being burned.\nconst DB_REQUIRING_KINDS: ReadonlySet<string> = new Set([\n 'process_session_goal',\n 'process_announcement',\n 'process_run_cleanup',\n]);\n\n/** The capability list this process can actually serve (see DB_REQUIRING_KINDS). */\nexport function availableCapabilities(\n env: NodeJS.ProcessEnv = process.env,\n): readonly string[] {\n if (env.DATABASE_URL) return CAPABILITIES;\n return CAPABILITIES.filter((kind) => !DB_REQUIRING_KINDS.has(kind));\n}\n\ninterface NextWorkResponse {\n id: string;\n kind: string;\n payload: Record<string, unknown>;\n attempts: number;\n leaseToken: string;\n leaseDurationSeconds: number;\n table: string;\n}\n\nexport interface RunAgentLoopOptions {\n signal: AbortSignal;\n log?: (msg: string) => void;\n /** Long-poll wait passed to GET /api/work/next?waitMs= */\n pollWaitMs?: number;\n /** How often to POST /api/work/:id/heartbeat while a handler runs */\n heartbeatIntervalMs?: number;\n /** Capability list to advertise. Defaults to all known handlers. */\n capabilities?: readonly string[];\n /** Running CLI version, reported as `clientVersion` in the presence heartbeat\n * so the dashboard can detect an outdated CLI and nudge an upgrade. */\n version?: string;\n /** Reads the CURRENTLY INSTALLED CLI version from disk (vs `version`, which\n * is frozen at boot). When they diverge \u2014 `npm i -g` upgraded the CLI under\n * a running worker \u2014 the loop stops between jobs and calls `onVersionDrift`\n * so the supervisor can respawn onto the new code. */\n readInstalledVersion?: () => string | null;\n /** Invoked (idle, never mid-job) when version drift is detected. */\n onVersionDrift?: () => void;\n}\n\nconst DEFAULT_POLL_WAIT_MS = 30_000;\nconst DEFAULT_HEARTBEAT_MS = 30_000;\nconst PRESENCE_HEARTBEAT_MS = 30_000;\nconst BACKOFF_INITIAL_MS = 250;\nconst BACKOFF_MAX_MS = 5_000;\n\n// Stable per-process identifier so worker_connections groups the same agent\n// across heartbeats (the unique key is (userId, workerType, clientName)).\nconst PRESENCE_CLIENT_NAME = `thin-agent-${process.pid}`;\n\n/**\n * Background presence heartbeat. Posts to /api/workers/heartbeat every 30s so\n * worker_connections has a fresh row \u2014 that's what the dashboard's\n * useWorkerStatus reads to decide \"Worker online\" for live-send gating.\n * Distinct from the per-job heartbeat in runOne, which only extends a\n * specific job's lease. The graphile-worker runner had this since day one;\n * the thin agent was missing it, so the dashboard showed \"Worker offline\"\n * even when the agent was actively processing jobs.\n */\nfunction startPresenceHeartbeat(\n capabilities: readonly string[],\n signal: AbortSignal,\n log: (msg: string) => void,\n version: string | undefined,\n): void {\n const send = (status: 'alive' | 'shutting_down') => {\n void apiPost('/api/workers/heartbeat', {\n workerType: 'cli-worker',\n clientName: PRESENCE_CLIENT_NAME,\n clientVersion: version,\n workerVersion: '0.1.0',\n currentJobId: null,\n inFlightCount: 0,\n lastError: null,\n status,\n metadata: { capabilities, mode: 'thin-agent' },\n }).catch((err) => {\n structuredLog(log, {\n event: 'presence_heartbeat_error',\n error: err instanceof Error ? err.message : String(err),\n });\n });\n };\n send('alive');\n const timer = setInterval(() => send('alive'), PRESENCE_HEARTBEAT_MS);\n signal.addEventListener('abort', () => {\n clearInterval(timer);\n send('shutting_down');\n }, { once: true });\n}\n\nfunction structuredLog(\n log: (msg: string) => void,\n event: Record<string, unknown>,\n): void {\n try {\n log(JSON.stringify({ ts: new Date().toISOString(), ...event }));\n } catch {\n // JSON.stringify can throw on a circular structure; fall back to a\n // best-effort string so a log failure never takes down the loop.\n log(`[agent-loop] log_error event=${event['event']}`);\n }\n}\n\n/** Sleep that resolves early when the abort signal fires. Returns true if\n * the full duration elapsed, false if aborted. */\nfunction abortableSleep(ms: number, signal: AbortSignal): Promise<boolean> {\n if (signal.aborted) return Promise.resolve(false);\n if (ms <= 0) return Promise.resolve(true);\n return new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => {\n signal.removeEventListener('abort', onAbort);\n resolve(true);\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', onAbort);\n resolve(false);\n };\n signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/** Poll once for work. Returns the parsed response or null on 204. api-client\n * returns \"\" for an empty response body (Content-Type is not JSON on 204), so\n * we use that as the 204 sentinel. */\nexport async function pollForWork(\n capabilities: readonly string[],\n waitMs: number,\n): Promise<NextWorkResponse | null> {\n const qs = `capabilities=${encodeURIComponent(capabilities.join(','))}&waitMs=${waitMs}`;\n const result = await apiGet<NextWorkResponse | string>(`/api/work/next?${qs}`);\n if (result == null || typeof result === 'string') return null;\n return result;\n}\n\n/** Construct a minimal JobHelpers shim. Handlers only touch\n * helpers.logger.{info,warn,error}(msg) and helpers.job.attempts \u2014 verified\n * by grep against apps/cli/src/lib/handlers/. We cast through `unknown` so\n * TS accepts the structurally smaller object as the full JobHelpers type;\n * pulling graphile-worker into this hot path would defeat the Phase 4c\n * cleanup that removes the dep entirely. */\nfunction makeHelpers(attempts: number, log: (msg: string) => void): JobHelpers {\n return {\n logger: {\n info: (msg: string) => log(msg),\n warn: (msg: string) => log(msg),\n error: (msg: string) => log(msg),\n },\n job: { attempts },\n };\n}\n\nasync function runOne(\n job: NextWorkResponse,\n heartbeatIntervalMs: number,\n log: (msg: string) => void,\n): Promise<void> {\n const handler = HANDLERS[job.kind];\n const startedAt = Date.now();\n structuredLog(log, {\n event: 'claim',\n jobId: job.id,\n kind: job.kind,\n attempts: job.attempts,\n });\n\n // Defensive: if the API returned a kind the agent doesn't know about\n // (capability filter mismatch, schema drift), fail terminally so the row\n // doesn't bounce forever. The /api/work/next filter should already prevent\n // this, but failing closed at the dispatcher means a single new kind on\n // the API side can't wedge an older agent.\n if (!handler) {\n const msg = `unknown kind: ${job.kind}`;\n structuredLog(log, {\n event: 'fail',\n jobId: job.id,\n kind: job.kind,\n terminal: true,\n error: msg,\n });\n await apiPost(`/api/work/${job.id}/fail`, {\n leaseToken: job.leaseToken,\n error: msg,\n terminal: true,\n }).catch(() => {\n // best-effort: the lease will expire and the reconciler reclaims it\n });\n return;\n }\n\n // Heartbeat timer. Starts after the first heartbeatIntervalMs elapses so\n // we don't spam an extra request for sub-second jobs. Errors are swallowed\n // \u2014 a single failed heartbeat doesn't abort the run; the server's\n // 5-minute lease gives us up to ten chances at 30s intervals before we\n // lose the claim.\n const heartbeatTimer = setInterval(() => {\n structuredLog(log, { event: 'heartbeat', jobId: job.id });\n apiPost(`/api/work/${job.id}/heartbeat`, {\n leaseToken: job.leaseToken,\n }).catch((err) => {\n structuredLog(log, {\n event: 'heartbeat_error',\n jobId: job.id,\n error: err instanceof Error ? err.message : String(err),\n });\n });\n }, heartbeatIntervalMs);\n\n try {\n const helpers = makeHelpers(job.attempts, log);\n const result = (await handler(job.payload, helpers)) ?? {};\n clearInterval(heartbeatTimer);\n structuredLog(log, {\n event: 'complete',\n jobId: job.id,\n kind: job.kind,\n durationMs: Date.now() - startedAt,\n });\n await apiPost(`/api/work/${job.id}/complete`, {\n leaseToken: job.leaseToken,\n result,\n });\n } catch (err) {\n clearInterval(heartbeatTimer);\n const terminal = isPermanentJobError(err);\n const message = err instanceof Error ? err.message : String(err);\n structuredLog(log, {\n event: 'fail',\n jobId: job.id,\n kind: job.kind,\n durationMs: Date.now() - startedAt,\n terminal,\n error: message,\n });\n await apiPost(`/api/work/${job.id}/fail`, {\n leaseToken: job.leaseToken,\n error: message,\n terminal,\n }).catch((postErr) => {\n structuredLog(log, {\n event: 'fail_post_error',\n jobId: job.id,\n error: postErr instanceof Error ? postErr.message : String(postErr),\n });\n });\n }\n}\n\nexport async function runAgentLoop(opts: RunAgentLoopOptions): Promise<void> {\n const log = opts.log ?? (() => undefined);\n const pollWaitMs = opts.pollWaitMs ?? DEFAULT_POLL_WAIT_MS;\n const heartbeatIntervalMs = opts.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_MS;\n const capabilities = opts.capabilities ?? availableCapabilities();\n\n let backoffMs = BACKOFF_INITIAL_MS;\n structuredLog(log, {\n event: 'agent_start',\n capabilities,\n pollWaitMs,\n heartbeatIntervalMs,\n });\n\n // Background presence heartbeat \u2014 writes to worker_connections so the\n // dashboard's \"Worker online\" indicator turns on. Fire-and-forget; failures\n // are logged but don't block the work poll.\n startPresenceHeartbeat(capabilities, opts.signal, log, opts.version);\n\n // Fire-and-forget the terminal-target liveness heartbeat. It runs on its\n // own interval (default 60s) and shuts down on the same abort signal.\n // Errors are caught internally \u2014 we don't await it so a slow tmux probe\n // can't delay the work poll.\n void startTerminalTargetHeartbeat({ signal: opts.signal, log }).catch((err) => {\n structuredLog(log, {\n event: 'tt_heartbeat_fatal',\n error: err instanceof Error ? err.message : String(err),\n });\n });\n\n // Version-drift self-restart: after `npm i -g` upgrades the CLI, this\n // long-lived process keeps executing the OLD code forever \u2014 launchd bounces\n // on dist changes only in the repo-checkout install, and the Linux systemd\n // unit has no WatchPaths equivalent at all. Between jobs (never mid-job),\n // compare the on-disk installed version against the one this process booted\n // with; on drift, hand control to the caller (which exits non-zero so BOTH\n // supervisors respawn onto the new code: systemd is Restart=on-failure,\n // launchd KeepAlive restarts regardless). Throttled \u2014 a disk read per idle\n // poll would be wasteful.\n const VERSION_CHECK_INTERVAL_MS = 5 * 60_000;\n let lastVersionCheck = 0;\n const versionDrifted = (): boolean => {\n if (!opts.readInstalledVersion || !opts.version) return false;\n const now = Date.now();\n if (now - lastVersionCheck < VERSION_CHECK_INTERVAL_MS) return false;\n lastVersionCheck = now;\n const onDisk = opts.readInstalledVersion();\n return Boolean(onDisk && onDisk !== opts.version);\n };\n\n while (!opts.signal.aborted) {\n if (versionDrifted()) {\n structuredLog(log, {\n event: 'agent_version_drift',\n bootVersion: opts.version,\n installedVersion: opts.readInstalledVersion?.() ?? null,\n });\n opts.onVersionDrift?.();\n break;\n }\n let job: NextWorkResponse | null = null;\n try {\n job = await pollForWork(capabilities, pollWaitMs);\n } catch (err) {\n // Network/API errors during poll: log + backoff. The API may be\n // restarting, the laptop may have just woken, etc. Don't crash the\n // loop \u2014 that's the whole point of this migration.\n const status = err instanceof ApiError ? err.statusCode : undefined;\n structuredLog(log, {\n event: 'poll_error',\n status,\n error: err instanceof Error ? err.message : String(err),\n });\n const completed = await abortableSleep(backoffMs, opts.signal);\n if (!completed) break;\n backoffMs = Math.min(backoffMs * 2, BACKOFF_MAX_MS);\n continue;\n }\n\n if (!job) {\n structuredLog(log, { event: 'poll_204' });\n const completed = await abortableSleep(backoffMs, opts.signal);\n if (!completed) break;\n backoffMs = Math.min(backoffMs * 2, BACKOFF_MAX_MS);\n continue;\n }\n\n // Got work \u2014 reset the backoff and run it. An in-flight handler is\n // intentionally not abort-cancellable; we await its natural completion\n // even if the signal fires mid-run.\n backoffMs = BACKOFF_INITIAL_MS;\n await runOne(job, heartbeatIntervalMs, log);\n }\n\n structuredLog(log, { event: 'agent_stop' });\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,16 +0,0 @@
1
- // src/dashboard/launcher/tool-labels.ts
2
- var TOOL_LABELS = {
3
- claude_code: "Claude Code",
4
- codex: "Codex",
5
- aider: "Aider",
6
- generic: "Generic"
7
- };
8
- function toolLabel(tool) {
9
- return TOOL_LABELS[tool] ?? tool;
10
- }
11
-
12
- export {
13
- TOOL_LABELS,
14
- toolLabel
15
- };
16
- //# sourceMappingURL=chunk-RH7NHVSK.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/dashboard/launcher/tool-labels.ts"],
4
- "sourcesContent": ["export const TOOL_LABELS: Record<string, string> = {\n claude_code: 'Claude Code',\n codex: 'Codex',\n aider: 'Aider',\n generic: 'Generic',\n};\n\nexport function toolLabel(tool: string): string {\n return TOOL_LABELS[tool] ?? tool;\n}\n"],
5
- "mappings": ";AAAO,IAAM,cAAsC;AAAA,EACjD,aAAa;AAAA,EACb,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AACX;AAEO,SAAS,UAAU,MAAsB;AAC9C,SAAO,YAAY,IAAI,KAAK;AAC9B;",
6
- "names": []
7
- }
@@ -1,191 +0,0 @@
1
- import {
2
- PermanentJobError
3
- } from "./chunk-DGHWRQXL.js";
4
- import {
5
- judgeEvalQuality
6
- } from "./chunk-J7N3DLH6.js";
7
- import {
8
- createEvalWorktree
9
- } from "./chunk-52WIYRZH.js";
10
- import {
11
- gradeEvalOutput
12
- } from "./chunk-YNIH3KMU.js";
13
- import {
14
- executeEval
15
- } from "./chunk-QN34TGD3.js";
16
- import {
17
- apiGet,
18
- apiPatch,
19
- apiPost
20
- } from "./chunk-ZUJBM6HE.js";
21
-
22
- // src/lib/handlers/process-eval.ts
23
- async function processEval(payload, helpers) {
24
- const { mirrorId, evalTargetId, config } = payload;
25
- const log = (msg) => helpers.logger.info(msg);
26
- if (helpers.job.attempts > 1) {
27
- throw new PermanentJobError(
28
- `process_eval is not safe to retry (attempt ${helpers.job.attempts}). Re-trigger the eval run from the UI.`
29
- );
30
- }
31
- const target = await apiGet(`/api/eval-targets/${evalTargetId}`);
32
- const evalCases = await apiGet(`/api/eval-targets/${evalTargetId}/evals`);
33
- if (evalCases.length === 0) {
34
- throw new PermanentJobError("No evals defined for target");
35
- }
36
- const runsPerEval = config.runsPerEval ?? 1;
37
- const timeout = config.timeout ?? 12e4;
38
- const iteration = config.iteration ?? 1;
39
- const configurations = [
40
- { name: "with_target", content: target.content }
41
- ];
42
- if (!config.skipBaseline) {
43
- configurations.push({ name: "without_target" });
44
- }
45
- const workQueue = [];
46
- for (const eval_ of evalCases) {
47
- for (const cfg of configurations) {
48
- for (let run = 1; run <= runsPerEval; run++) {
49
- workQueue.push({ eval_, configuration: cfg.name, targetContent: cfg.content, runNumber: run });
50
- }
51
- }
52
- }
53
- const total = workQueue.length;
54
- let completed = 0;
55
- const concurrency = Math.min(config.parallel ?? 1, 4);
56
- await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {
57
- status: "running",
58
- progress: { total, completed: 0, current: null, message: `Starting ${total} eval runs (concurrency: ${concurrency})...` }
59
- });
60
- const results = [];
61
- async function processItem(item) {
62
- const label = `${item.configuration} \xB7 ${item.eval_.name} \xB7 run#${item.runNumber}`;
63
- log(`[${completed + 1}/${total}] ${label}`);
64
- const worktree = concurrency > 1 ? createEvalWorktree() : null;
65
- try {
66
- const execResult = await executeEval({
67
- prompt: item.eval_.prompt,
68
- targetContent: item.targetContent,
69
- workDir: worktree?.workDir,
70
- timeout,
71
- model: config.model
72
- });
73
- let grading = {};
74
- if (!config.skipGrading && item.eval_.expectations.length > 0 && !execResult.error) {
75
- const gradingResult = await gradeEvalOutput({
76
- prompt: item.eval_.prompt,
77
- output: execResult.output,
78
- expectations: item.eval_.expectations,
79
- model: config.graderModel ?? config.model,
80
- timeout
81
- });
82
- grading = gradingResult;
83
- }
84
- return {
85
- evalId: item.eval_.id,
86
- evalTargetId: target.id,
87
- evalTargetVersion: target.version,
88
- configuration: item.configuration,
89
- runNumber: item.runNumber,
90
- iteration,
91
- status: execResult.error ? "failed" : "completed",
92
- outputs: execResult.error ? { error: execResult.error } : { transcript: execResult.output },
93
- timing: { duration_ms: execResult.durationMs, total_tokens: execResult.totalTokens },
94
- grading,
95
- worktree: worktree?.isWorktree ? true : void 0
96
- };
97
- } finally {
98
- worktree?.cleanup();
99
- }
100
- }
101
- if (concurrency <= 1) {
102
- for (const item of workQueue) {
103
- const label = `${item.configuration} \xB7 ${item.eval_.name} \xB7 run#${item.runNumber}`;
104
- await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {
105
- status: "running",
106
- progress: { total, completed, current: label, message: `Executing ${label}...` }
107
- });
108
- const runResult = await processItem(item);
109
- await apiPost("/api/eval-runs", runResult);
110
- results.push(runResult);
111
- completed++;
112
- await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {
113
- status: "running",
114
- progress: { total, completed, current: label, message: `Completed ${label}` }
115
- });
116
- }
117
- } else {
118
- log(`Running ${total} evals with concurrency=${concurrency} (worktree isolation)`);
119
- for (let i = 0; i < workQueue.length; i += concurrency) {
120
- const batch = workQueue.slice(i, i + concurrency);
121
- const batchLabel = `batch ${Math.floor(i / concurrency) + 1}/${Math.ceil(workQueue.length / concurrency)}`;
122
- await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {
123
- status: "running",
124
- progress: { total, completed, current: batchLabel, message: `Executing ${batchLabel} (${batch.length} parallel)...` }
125
- });
126
- const batchResults = await Promise.all(batch.map(processItem));
127
- for (const runResult of batchResults) {
128
- await apiPost("/api/eval-runs", runResult);
129
- results.push(runResult);
130
- completed++;
131
- }
132
- await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {
133
- status: "running",
134
- progress: { total, completed, current: batchLabel, message: `Completed ${batchLabel}` }
135
- });
136
- }
137
- }
138
- const summary = buildSummary(results);
139
- let metaJudgement;
140
- if (!config.skipGrading && results.some((r) => r.grading && Object.keys(r.grading).length > 0)) {
141
- try {
142
- log(`Running meta-judge for job ${mirrorId}...`);
143
- const evalInputs = evalCases.map((e) => {
144
- const matchingResults = results.filter((r) => r.evalId === e.id && r.configuration === "with_target");
145
- const firstResult = matchingResults[0];
146
- return {
147
- evalName: e.name,
148
- prompt: e.prompt,
149
- expectations: e.expectations,
150
- grading: firstResult?.grading ? firstResult.grading : null,
151
- output: firstResult?.outputs?.transcript?.slice(0, 500)
152
- };
153
- });
154
- metaJudgement = await judgeEvalQuality({
155
- targetName: target.name,
156
- evalResults: evalInputs,
157
- model: config.graderModel ?? config.model,
158
- timeout: 6e4
159
- });
160
- log(`Meta-judge: quality=${metaJudgement.quality_score}/5, issues=${metaJudgement.issues.length}`);
161
- } catch (err) {
162
- log(`Meta-judge failed (non-fatal): ${err instanceof Error ? err.message : String(err)}`);
163
- }
164
- }
165
- const result = metaJudgement ? { ...summary, meta_judgement: metaJudgement } : summary;
166
- log(`Job ${mirrorId} completed: ${completed}/${total} runs`);
167
- await apiPatch(`/api/eval-jobs/${mirrorId}/state`, { result }).catch((err) => {
168
- log(`result persist failed: ${err instanceof Error ? err.message : String(err)}`);
169
- });
170
- return result;
171
- }
172
- function buildSummary(results) {
173
- const completed = results.filter((r) => r.status === "completed");
174
- const failed = results.filter((r) => r.status === "failed");
175
- const gradedRuns = completed.filter((r) => {
176
- const grading = r.grading;
177
- return grading && Object.keys(grading).length > 0;
178
- });
179
- const avgPassRate = gradedRuns.length > 0 ? gradedRuns.reduce((sum, r) => sum + (r.grading?.summary?.pass_rate ?? 0), 0) / gradedRuns.length : null;
180
- return {
181
- total: results.length,
182
- completed: completed.length,
183
- failed: failed.length,
184
- avgPassRate
185
- };
186
- }
187
-
188
- export {
189
- processEval
190
- };
191
- //# sourceMappingURL=chunk-RMTT4KDY.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/lib/handlers/process-eval.ts"],
4
- "sourcesContent": ["import type { JobHelpers } from '../job-helpers.js';\nimport { apiGet, apiPost, apiPatch } from '../api-client.js';\nimport { executeEval } from '../eval-executor.js';\nimport { gradeEvalOutput, type GradingResult } from '../eval-grader.js';\nimport { judgeEvalQuality, type MetaJudgement } from '../eval-meta-judge.js';\nimport { createEvalWorktree } from '../eval-worktree.js';\nimport { PermanentJobError } from '../permanent-job-error.js';\n\ninterface EvalTarget {\n id: string;\n name: string;\n type: string;\n content: string;\n version: number;\n}\n\ninterface Eval {\n id: string;\n name: string;\n prompt: string;\n expectedOutput: string;\n expectations: string[];\n}\n\ninterface EvalPayload {\n mirrorId: string;\n evalTargetId: string;\n config: {\n parallel?: number;\n runsPerEval?: number;\n iteration?: number;\n skipBaseline?: boolean;\n skipGrading?: boolean;\n model?: string;\n graderModel?: string;\n timeout?: number;\n };\n}\n\n/**\n * Graphile-shaped handler for the `process_eval` task.\n *\n * Lifted verbatim from the legacy `eval-worker.ts:processJob` body, with the\n * queue plumbing stripped out:\n * - no claim \u2014 Graphile already claimed the job before invoking us\n * - no /complete POST \u2014 we return the result object (or throw)\n * - no `processing` flag \u2014 that lived in the polling loop's closure\n * - no conversation branch \u2014 split into its own handler (Task 14)\n *\n * Mid-job progress patches still hit the existing\n * `PATCH /api/eval-jobs/:id/progress` endpoint, just keyed by the mirror row's\n * id instead of the legacy queue id.\n */\nexport async function processEval(\n payload: EvalPayload,\n helpers: JobHelpers,\n): Promise<Record<string, unknown>> {\n const { mirrorId, evalTargetId, config } = payload;\n const log = (msg: string) => helpers.logger.info(msg);\n\n // Fail-fast on retry. Each eval_run is INSERT'd as it completes, but\n // there's no idempotency key tying a row to a specific job \u2014 re-running\n // the whole batch would duplicate every previously-completed row in\n // eval_runs. Until proper resume-from-progress-checkpoint lands, surface\n // the failure to the user instead of silently doubling-up rows. See\n // docs/audits/2026-05-07-worker-audit.md \"Handlers not idempotent\".\n if (helpers.job.attempts > 1) {\n throw new PermanentJobError(\n `process_eval is not safe to retry (attempt ${helpers.job.attempts}). Re-trigger the eval run from the UI.`,\n );\n }\n\n const target = await apiGet<EvalTarget>(`/api/eval-targets/${evalTargetId}`);\n const evalCases = await apiGet<Eval[]>(`/api/eval-targets/${evalTargetId}/evals`);\n\n if (evalCases.length === 0) {\n // No retries \u2014 eval cases don't materialize on their own; the user has\n // to add one via the UI/CLI. Skip Graphile's retry loop.\n throw new PermanentJobError('No evals defined for target');\n }\n\n const runsPerEval = config.runsPerEval ?? 1;\n const timeout = config.timeout ?? 120_000;\n const iteration = config.iteration ?? 1;\n\n const configurations: Array<{ name: string; content?: string }> = [\n { name: 'with_target', content: target.content },\n ];\n if (!config.skipBaseline) {\n configurations.push({ name: 'without_target' });\n }\n\n // Build work queue\n const workQueue: Array<{ eval_: Eval; configuration: string; targetContent?: string; runNumber: number }> = [];\n for (const eval_ of evalCases) {\n for (const cfg of configurations) {\n for (let run = 1; run <= runsPerEval; run++) {\n workQueue.push({ eval_: eval_, configuration: cfg.name, targetContent: cfg.content, runNumber: run });\n }\n }\n }\n\n const total = workQueue.length;\n let completed = 0;\n const concurrency = Math.min(config.parallel ?? 1, 4); // cap at 4 parallel\n\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed: 0, current: null, message: `Starting ${total} eval runs (concurrency: ${concurrency})...` },\n });\n\n const results: Record<string, unknown>[] = [];\n\n // Process work items \u2014 sequential if concurrency=1, parallel otherwise\n async function processItem(item: typeof workQueue[0]): Promise<Record<string, unknown>> {\n const label = `${item.configuration} \u00B7 ${item.eval_.name} \u00B7 run#${item.runNumber}`;\n log(`[${completed + 1}/${total}] ${label}`);\n\n // Create isolated worktree for parallel execution\n const worktree = concurrency > 1 ? createEvalWorktree() : null;\n\n try {\n const execResult = await executeEval({\n prompt: item.eval_.prompt,\n targetContent: item.targetContent,\n workDir: worktree?.workDir,\n timeout,\n model: config.model,\n });\n\n let grading: Record<string, unknown> = {};\n if (!config.skipGrading && item.eval_.expectations.length > 0 && !execResult.error) {\n const gradingResult = await gradeEvalOutput({\n prompt: item.eval_.prompt,\n output: execResult.output,\n expectations: item.eval_.expectations,\n model: config.graderModel ?? config.model,\n timeout,\n });\n grading = gradingResult as unknown as Record<string, unknown>;\n }\n\n return {\n evalId: item.eval_.id,\n evalTargetId: target.id,\n evalTargetVersion: target.version,\n configuration: item.configuration,\n runNumber: item.runNumber,\n iteration,\n status: execResult.error ? 'failed' : 'completed',\n outputs: execResult.error ? { error: execResult.error } : { transcript: execResult.output },\n timing: { duration_ms: execResult.durationMs, total_tokens: execResult.totalTokens },\n grading,\n worktree: worktree?.isWorktree ? true : undefined,\n };\n } finally {\n worktree?.cleanup();\n }\n }\n\n if (concurrency <= 1) {\n // Sequential execution (existing behavior)\n for (const item of workQueue) {\n const label = `${item.configuration} \u00B7 ${item.eval_.name} \u00B7 run#${item.runNumber}`;\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed, current: label, message: `Executing ${label}...` },\n });\n\n const runResult = await processItem(item);\n await apiPost('/api/eval-runs', runResult);\n results.push(runResult);\n completed++;\n\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed, current: label, message: `Completed ${label}` },\n });\n }\n } else {\n // Parallel execution with worktree isolation\n log(`Running ${total} evals with concurrency=${concurrency} (worktree isolation)`);\n for (let i = 0; i < workQueue.length; i += concurrency) {\n const batch = workQueue.slice(i, i + concurrency);\n const batchLabel = `batch ${Math.floor(i / concurrency) + 1}/${Math.ceil(workQueue.length / concurrency)}`;\n\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed, current: batchLabel, message: `Executing ${batchLabel} (${batch.length} parallel)...` },\n });\n\n const batchResults = await Promise.all(batch.map(processItem));\n\n for (const runResult of batchResults) {\n await apiPost('/api/eval-runs', runResult);\n results.push(runResult);\n completed++;\n }\n\n await apiPatch(`/api/eval-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { total, completed, current: batchLabel, message: `Completed ${batchLabel}` },\n });\n }\n }\n\n const summary = buildSummary(results);\n\n // Meta-judge: assess eval quality if we have grading results\n let metaJudgement: MetaJudgement | undefined;\n if (!config.skipGrading && results.some(r => r.grading && Object.keys(r.grading as object).length > 0)) {\n try {\n log(`Running meta-judge for job ${mirrorId}...`);\n const evalInputs = evalCases.map(e => {\n const matchingResults = results.filter(r => r.evalId === e.id && r.configuration === 'with_target');\n const firstResult = matchingResults[0];\n return {\n evalName: e.name,\n prompt: e.prompt,\n expectations: e.expectations,\n grading: firstResult?.grading ? firstResult.grading as unknown as GradingResult : null,\n output: (firstResult?.outputs as Record<string, string>)?.transcript?.slice(0, 500),\n };\n });\n metaJudgement = await judgeEvalQuality({\n targetName: target.name,\n evalResults: evalInputs,\n model: config.graderModel ?? config.model,\n timeout: 60000,\n });\n log(`Meta-judge: quality=${metaJudgement.quality_score}/5, issues=${metaJudgement.issues.length}`);\n } catch (err) {\n log(`Meta-judge failed (non-fatal): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n const result = metaJudgement\n ? { ...summary, meta_judgement: metaJudgement }\n : summary;\n log(`Job ${mirrorId} completed: ${completed}/${total} runs`);\n\n // Graphile discards task return values, so persist the summary onto the\n // mirror row here. Best-effort: a failure to write the result must not\n // mark the job as failed (it succeeded; we just lose the summary blob).\n await apiPatch(`/api/eval-jobs/${mirrorId}/state`, { result }).catch((err: unknown) => {\n log(`result persist failed: ${err instanceof Error ? err.message : String(err)}`);\n });\n\n return result;\n}\n\nfunction buildSummary(results: Record<string, unknown>[]): Record<string, unknown> {\n const completed = results.filter((r) => r.status === 'completed');\n const failed = results.filter((r) => r.status === 'failed');\n\n const gradedRuns = completed.filter((r) => {\n const grading = r.grading as Record<string, any>;\n return grading && Object.keys(grading).length > 0;\n });\n\n const avgPassRate = gradedRuns.length > 0\n ? gradedRuns.reduce((sum, r) => sum + ((r.grading as any)?.summary?.pass_rate ?? 0), 0) / gradedRuns.length\n : null;\n\n return {\n total: results.length,\n completed: completed.length,\n failed: failed.length,\n avgPassRate,\n };\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }