@rulemetric/cli 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/bin/dev.js +3 -0
  2. package/bin/run.js +3 -0
  3. package/dist/base-command.d.ts +12 -0
  4. package/dist/base-command.d.ts.map +1 -0
  5. package/dist/base-command.js +37 -0
  6. package/dist/base-command.js.map +1 -0
  7. package/dist/commands/auth/create-key.d.ts +11 -0
  8. package/dist/commands/auth/create-key.d.ts.map +1 -0
  9. package/dist/commands/auth/create-key.js +34 -0
  10. package/dist/commands/auth/create-key.js.map +1 -0
  11. package/dist/commands/auth/login.d.ts +11 -0
  12. package/dist/commands/auth/login.d.ts.map +1 -0
  13. package/dist/commands/auth/login.js +40 -0
  14. package/dist/commands/auth/login.js.map +1 -0
  15. package/dist/commands/auth/logout.d.ts +7 -0
  16. package/dist/commands/auth/logout.d.ts.map +1 -0
  17. package/dist/commands/auth/logout.js +13 -0
  18. package/dist/commands/auth/logout.js.map +1 -0
  19. package/dist/commands/auth/revoke-key.d.ts +10 -0
  20. package/dist/commands/auth/revoke-key.d.ts.map +1 -0
  21. package/dist/commands/auth/revoke-key.js +18 -0
  22. package/dist/commands/auth/revoke-key.js.map +1 -0
  23. package/dist/commands/auth/status.d.ts +7 -0
  24. package/dist/commands/auth/status.d.ts.map +1 -0
  25. package/dist/commands/auth/status.js +23 -0
  26. package/dist/commands/auth/status.js.map +1 -0
  27. package/dist/commands/catalog/index.d.ts +11 -0
  28. package/dist/commands/catalog/index.d.ts.map +1 -0
  29. package/dist/commands/catalog/index.js +35 -0
  30. package/dist/commands/catalog/index.js.map +1 -0
  31. package/dist/commands/catalog/recommend.d.ts +9 -0
  32. package/dist/commands/catalog/recommend.d.ts.map +1 -0
  33. package/dist/commands/catalog/recommend.js +27 -0
  34. package/dist/commands/catalog/recommend.js.map +1 -0
  35. package/dist/commands/convert.d.ts +15 -0
  36. package/dist/commands/convert.d.ts.map +1 -0
  37. package/dist/commands/convert.js +55 -0
  38. package/dist/commands/convert.js.map +1 -0
  39. package/dist/commands/converters.d.ts +12 -0
  40. package/dist/commands/converters.d.ts.map +1 -0
  41. package/dist/commands/converters.js +39 -0
  42. package/dist/commands/converters.js.map +1 -0
  43. package/dist/commands/dashboard.d.ts +10 -0
  44. package/dist/commands/dashboard.d.ts.map +1 -0
  45. package/dist/commands/dashboard.js +24 -0
  46. package/dist/commands/dashboard.js.map +1 -0
  47. package/dist/commands/eval-targets/create.d.ts +14 -0
  48. package/dist/commands/eval-targets/create.d.ts.map +1 -0
  49. package/dist/commands/eval-targets/create.js +40 -0
  50. package/dist/commands/eval-targets/create.js.map +1 -0
  51. package/dist/commands/eval-targets/list.d.ts +10 -0
  52. package/dist/commands/eval-targets/list.d.ts.map +1 -0
  53. package/dist/commands/eval-targets/list.js +36 -0
  54. package/dist/commands/eval-targets/list.js.map +1 -0
  55. package/dist/commands/evals/benchmark.d.ts +13 -0
  56. package/dist/commands/evals/benchmark.d.ts.map +1 -0
  57. package/dist/commands/evals/benchmark.js +53 -0
  58. package/dist/commands/evals/benchmark.js.map +1 -0
  59. package/dist/commands/evals/compare.d.ts +15 -0
  60. package/dist/commands/evals/compare.d.ts.map +1 -0
  61. package/dist/commands/evals/compare.js +101 -0
  62. package/dist/commands/evals/compare.js.map +1 -0
  63. package/dist/commands/evals/create.d.ts +17 -0
  64. package/dist/commands/evals/create.d.ts.map +1 -0
  65. package/dist/commands/evals/create.js +52 -0
  66. package/dist/commands/evals/create.js.map +1 -0
  67. package/dist/commands/evals/listen.d.ts +11 -0
  68. package/dist/commands/evals/listen.d.ts.map +1 -0
  69. package/dist/commands/evals/listen.js +54 -0
  70. package/dist/commands/evals/listen.js.map +1 -0
  71. package/dist/commands/evals/optimize-description.d.ts +22 -0
  72. package/dist/commands/evals/optimize-description.d.ts.map +1 -0
  73. package/dist/commands/evals/optimize-description.js +269 -0
  74. package/dist/commands/evals/optimize-description.js.map +1 -0
  75. package/dist/commands/evals/optimize.d.ts +22 -0
  76. package/dist/commands/evals/optimize.d.ts.map +1 -0
  77. package/dist/commands/evals/optimize.js +200 -0
  78. package/dist/commands/evals/optimize.js.map +1 -0
  79. package/dist/commands/evals/run.d.ts +21 -0
  80. package/dist/commands/evals/run.d.ts.map +1 -0
  81. package/dist/commands/evals/run.js +168 -0
  82. package/dist/commands/evals/run.js.map +1 -0
  83. package/dist/commands/gateway/ensure.d.ts +7 -0
  84. package/dist/commands/gateway/ensure.d.ts.map +1 -0
  85. package/dist/commands/gateway/ensure.js +20 -0
  86. package/dist/commands/gateway/ensure.js.map +1 -0
  87. package/dist/commands/hooks/install.d.ts +16 -0
  88. package/dist/commands/hooks/install.d.ts.map +1 -0
  89. package/dist/commands/hooks/install.js +248 -0
  90. package/dist/commands/hooks/install.js.map +1 -0
  91. package/dist/commands/hooks/run.d.ts +11 -0
  92. package/dist/commands/hooks/run.d.ts.map +1 -0
  93. package/dist/commands/hooks/run.js +56 -0
  94. package/dist/commands/hooks/run.js.map +1 -0
  95. package/dist/commands/hooks/uninstall.d.ts +7 -0
  96. package/dist/commands/hooks/uninstall.d.ts.map +1 -0
  97. package/dist/commands/hooks/uninstall.js +88 -0
  98. package/dist/commands/hooks/uninstall.js.map +1 -0
  99. package/dist/commands/import.d.ts +17 -0
  100. package/dist/commands/import.d.ts.map +1 -0
  101. package/dist/commands/import.js +55 -0
  102. package/dist/commands/import.js.map +1 -0
  103. package/dist/commands/insights/sync.d.ts +17 -0
  104. package/dist/commands/insights/sync.d.ts.map +1 -0
  105. package/dist/commands/insights/sync.js +477 -0
  106. package/dist/commands/insights/sync.js.map +1 -0
  107. package/dist/commands/instructions/create.d.ts +17 -0
  108. package/dist/commands/instructions/create.d.ts.map +1 -0
  109. package/dist/commands/instructions/create.js +60 -0
  110. package/dist/commands/instructions/create.js.map +1 -0
  111. package/dist/commands/instructions/delete.d.ts +13 -0
  112. package/dist/commands/instructions/delete.d.ts.map +1 -0
  113. package/dist/commands/instructions/delete.js +37 -0
  114. package/dist/commands/instructions/delete.js.map +1 -0
  115. package/dist/commands/instructions/fork.d.ts +10 -0
  116. package/dist/commands/instructions/fork.d.ts.map +1 -0
  117. package/dist/commands/instructions/fork.js +19 -0
  118. package/dist/commands/instructions/fork.js.map +1 -0
  119. package/dist/commands/instructions/get.d.ts +15 -0
  120. package/dist/commands/instructions/get.d.ts.map +1 -0
  121. package/dist/commands/instructions/get.js +50 -0
  122. package/dist/commands/instructions/get.js.map +1 -0
  123. package/dist/commands/instructions/list.d.ts +12 -0
  124. package/dist/commands/instructions/list.d.ts.map +1 -0
  125. package/dist/commands/instructions/list.js +47 -0
  126. package/dist/commands/instructions/list.js.map +1 -0
  127. package/dist/commands/instructions/promote.d.ts +14 -0
  128. package/dist/commands/instructions/promote.d.ts.map +1 -0
  129. package/dist/commands/instructions/promote.js +27 -0
  130. package/dist/commands/instructions/promote.js.map +1 -0
  131. package/dist/commands/instructions/pull.d.ts +9 -0
  132. package/dist/commands/instructions/pull.d.ts.map +1 -0
  133. package/dist/commands/instructions/pull.js +22 -0
  134. package/dist/commands/instructions/pull.js.map +1 -0
  135. package/dist/commands/instructions/upstream.d.ts +9 -0
  136. package/dist/commands/instructions/upstream.d.ts.map +1 -0
  137. package/dist/commands/instructions/upstream.js +22 -0
  138. package/dist/commands/instructions/upstream.js.map +1 -0
  139. package/dist/commands/instructions/versions.d.ts +12 -0
  140. package/dist/commands/instructions/versions.d.ts.map +1 -0
  141. package/dist/commands/instructions/versions.js +34 -0
  142. package/dist/commands/instructions/versions.js.map +1 -0
  143. package/dist/commands/packs/add-instruction.d.ts +11 -0
  144. package/dist/commands/packs/add-instruction.d.ts.map +1 -0
  145. package/dist/commands/packs/add-instruction.js +22 -0
  146. package/dist/commands/packs/add-instruction.js.map +1 -0
  147. package/dist/commands/packs/apply.d.ts +13 -0
  148. package/dist/commands/packs/apply.d.ts.map +1 -0
  149. package/dist/commands/packs/apply.js +24 -0
  150. package/dist/commands/packs/apply.js.map +1 -0
  151. package/dist/commands/packs/create.d.ts +13 -0
  152. package/dist/commands/packs/create.d.ts.map +1 -0
  153. package/dist/commands/packs/create.js +35 -0
  154. package/dist/commands/packs/create.js.map +1 -0
  155. package/dist/commands/packs/fork.d.ts +10 -0
  156. package/dist/commands/packs/fork.d.ts.map +1 -0
  157. package/dist/commands/packs/fork.js +19 -0
  158. package/dist/commands/packs/fork.js.map +1 -0
  159. package/dist/commands/packs/get.d.ts +10 -0
  160. package/dist/commands/packs/get.d.ts.map +1 -0
  161. package/dist/commands/packs/get.js +36 -0
  162. package/dist/commands/packs/get.js.map +1 -0
  163. package/dist/commands/packs/list.d.ts +22 -0
  164. package/dist/commands/packs/list.d.ts.map +1 -0
  165. package/dist/commands/packs/list.js +48 -0
  166. package/dist/commands/packs/list.js.map +1 -0
  167. package/dist/commands/packs/remove-instruction.d.ts +11 -0
  168. package/dist/commands/packs/remove-instruction.d.ts.map +1 -0
  169. package/dist/commands/packs/remove-instruction.js +20 -0
  170. package/dist/commands/packs/remove-instruction.js.map +1 -0
  171. package/dist/commands/proxy/env.d.ts +14 -0
  172. package/dist/commands/proxy/env.d.ts.map +1 -0
  173. package/dist/commands/proxy/env.js +118 -0
  174. package/dist/commands/proxy/env.js.map +1 -0
  175. package/dist/commands/proxy/logs.d.ts +11 -0
  176. package/dist/commands/proxy/logs.d.ts.map +1 -0
  177. package/dist/commands/proxy/logs.js +75 -0
  178. package/dist/commands/proxy/logs.js.map +1 -0
  179. package/dist/commands/proxy/setup.d.ts +23 -0
  180. package/dist/commands/proxy/setup.d.ts.map +1 -0
  181. package/dist/commands/proxy/setup.js +391 -0
  182. package/dist/commands/proxy/setup.js.map +1 -0
  183. package/dist/commands/proxy/start.d.ts +17 -0
  184. package/dist/commands/proxy/start.d.ts.map +1 -0
  185. package/dist/commands/proxy/start.js +306 -0
  186. package/dist/commands/proxy/start.js.map +1 -0
  187. package/dist/commands/proxy/status.d.ts +7 -0
  188. package/dist/commands/proxy/status.d.ts.map +1 -0
  189. package/dist/commands/proxy/status.js +65 -0
  190. package/dist/commands/proxy/status.js.map +1 -0
  191. package/dist/commands/proxy/stop.d.ts +8 -0
  192. package/dist/commands/proxy/stop.d.ts.map +1 -0
  193. package/dist/commands/proxy/stop.js +77 -0
  194. package/dist/commands/proxy/stop.js.map +1 -0
  195. package/dist/commands/service/install.d.ts +17 -0
  196. package/dist/commands/service/install.d.ts.map +1 -0
  197. package/dist/commands/service/install.js +383 -0
  198. package/dist/commands/service/install.js.map +1 -0
  199. package/dist/commands/service/install.test.d.ts +2 -0
  200. package/dist/commands/service/install.test.d.ts.map +1 -0
  201. package/dist/commands/service/install.test.js +345 -0
  202. package/dist/commands/service/install.test.js.map +1 -0
  203. package/dist/commands/service/status.d.ts +6 -0
  204. package/dist/commands/service/status.d.ts.map +1 -0
  205. package/dist/commands/service/status.js +112 -0
  206. package/dist/commands/service/status.js.map +1 -0
  207. package/dist/commands/service/uninstall.d.ts +6 -0
  208. package/dist/commands/service/uninstall.d.ts.map +1 -0
  209. package/dist/commands/service/uninstall.js +84 -0
  210. package/dist/commands/service/uninstall.js.map +1 -0
  211. package/dist/commands/sessions/analyze.d.ts +10 -0
  212. package/dist/commands/sessions/analyze.d.ts.map +1 -0
  213. package/dist/commands/sessions/analyze.js +26 -0
  214. package/dist/commands/sessions/analyze.js.map +1 -0
  215. package/dist/commands/sessions/end.d.ts +9 -0
  216. package/dist/commands/sessions/end.d.ts.map +1 -0
  217. package/dist/commands/sessions/end.js +82 -0
  218. package/dist/commands/sessions/end.js.map +1 -0
  219. package/dist/commands/sessions/import.d.ts +13 -0
  220. package/dist/commands/sessions/import.d.ts.map +1 -0
  221. package/dist/commands/sessions/import.js +28 -0
  222. package/dist/commands/sessions/import.js.map +1 -0
  223. package/dist/commands/sessions/list.d.ts +11 -0
  224. package/dist/commands/sessions/list.d.ts.map +1 -0
  225. package/dist/commands/sessions/list.js +34 -0
  226. package/dist/commands/sessions/list.js.map +1 -0
  227. package/dist/commands/sessions/start.d.ts +11 -0
  228. package/dist/commands/sessions/start.d.ts.map +1 -0
  229. package/dist/commands/sessions/start.js +83 -0
  230. package/dist/commands/sessions/start.js.map +1 -0
  231. package/dist/commands/skills/install.d.ts +15 -0
  232. package/dist/commands/skills/install.d.ts.map +1 -0
  233. package/dist/commands/skills/install.js +91 -0
  234. package/dist/commands/skills/install.js.map +1 -0
  235. package/dist/commands/skills/list.d.ts +11 -0
  236. package/dist/commands/skills/list.d.ts.map +1 -0
  237. package/dist/commands/skills/list.js +47 -0
  238. package/dist/commands/skills/list.js.map +1 -0
  239. package/dist/commands/skills/search.d.ts +17 -0
  240. package/dist/commands/skills/search.d.ts.map +1 -0
  241. package/dist/commands/skills/search.js +56 -0
  242. package/dist/commands/skills/search.js.map +1 -0
  243. package/dist/commands/skills/update.d.ts +7 -0
  244. package/dist/commands/skills/update.d.ts.map +1 -0
  245. package/dist/commands/skills/update.js +30 -0
  246. package/dist/commands/skills/update.js.map +1 -0
  247. package/dist/dashboard/Dashboard.d.ts +3 -0
  248. package/dist/dashboard/Dashboard.d.ts.map +1 -0
  249. package/dist/dashboard/Dashboard.js +132 -0
  250. package/dist/dashboard/Dashboard.js.map +1 -0
  251. package/dist/dashboard/data.d.ts +11 -0
  252. package/dist/dashboard/data.d.ts.map +1 -0
  253. package/dist/dashboard/data.js +137 -0
  254. package/dist/dashboard/data.js.map +1 -0
  255. package/dist/dashboard/panels/friction.d.ts +7 -0
  256. package/dist/dashboard/panels/friction.d.ts.map +1 -0
  257. package/dist/dashboard/panels/friction.js +22 -0
  258. package/dist/dashboard/panels/friction.js.map +1 -0
  259. package/dist/dashboard/panels/insights.d.ts +8 -0
  260. package/dist/dashboard/panels/insights.d.ts.map +1 -0
  261. package/dist/dashboard/panels/insights.js +109 -0
  262. package/dist/dashboard/panels/insights.js.map +1 -0
  263. package/dist/dashboard/panels/instructions.d.ts +9 -0
  264. package/dist/dashboard/panels/instructions.d.ts.map +1 -0
  265. package/dist/dashboard/panels/instructions.js +17 -0
  266. package/dist/dashboard/panels/instructions.js.map +1 -0
  267. package/dist/dashboard/panels/outcomes.d.ts +7 -0
  268. package/dist/dashboard/panels/outcomes.d.ts.map +1 -0
  269. package/dist/dashboard/panels/outcomes.js +29 -0
  270. package/dist/dashboard/panels/outcomes.js.map +1 -0
  271. package/dist/dashboard/panels/overview.d.ts +8 -0
  272. package/dist/dashboard/panels/overview.d.ts.map +1 -0
  273. package/dist/dashboard/panels/overview.js +20 -0
  274. package/dist/dashboard/panels/overview.js.map +1 -0
  275. package/dist/dashboard/panels/shared.d.ts +17 -0
  276. package/dist/dashboard/panels/shared.d.ts.map +1 -0
  277. package/dist/dashboard/panels/shared.js +62 -0
  278. package/dist/dashboard/panels/shared.js.map +1 -0
  279. package/dist/dashboard/types.d.ts +80 -0
  280. package/dist/dashboard/types.d.ts.map +1 -0
  281. package/dist/dashboard/types.js +27 -0
  282. package/dist/dashboard/types.js.map +1 -0
  283. package/dist/index.d.ts +2 -0
  284. package/dist/index.d.ts.map +1 -0
  285. package/dist/index.js +2 -0
  286. package/dist/index.js.map +1 -0
  287. package/dist/lib/api-client.d.ts +17 -0
  288. package/dist/lib/api-client.d.ts.map +1 -0
  289. package/dist/lib/api-client.js +92 -0
  290. package/dist/lib/api-client.js.map +1 -0
  291. package/dist/lib/api-client.test.d.ts +2 -0
  292. package/dist/lib/api-client.test.d.ts.map +1 -0
  293. package/dist/lib/api-client.test.js +161 -0
  294. package/dist/lib/api-client.test.js.map +1 -0
  295. package/dist/lib/auth.d.ts +27 -0
  296. package/dist/lib/auth.d.ts.map +1 -0
  297. package/dist/lib/auth.js +137 -0
  298. package/dist/lib/auth.js.map +1 -0
  299. package/dist/lib/auth.test.d.ts +2 -0
  300. package/dist/lib/auth.test.d.ts.map +1 -0
  301. package/dist/lib/auth.test.js +110 -0
  302. package/dist/lib/auth.test.js.map +1 -0
  303. package/dist/lib/eval-analyzer.d.ts +23 -0
  304. package/dist/lib/eval-analyzer.d.ts.map +1 -0
  305. package/dist/lib/eval-analyzer.js +89 -0
  306. package/dist/lib/eval-analyzer.js.map +1 -0
  307. package/dist/lib/eval-benchmark.d.ts +17 -0
  308. package/dist/lib/eval-benchmark.d.ts.map +1 -0
  309. package/dist/lib/eval-benchmark.js +92 -0
  310. package/dist/lib/eval-benchmark.js.map +1 -0
  311. package/dist/lib/eval-conversation-handler.d.ts +9 -0
  312. package/dist/lib/eval-conversation-handler.d.ts.map +1 -0
  313. package/dist/lib/eval-conversation-handler.js +200 -0
  314. package/dist/lib/eval-conversation-handler.js.map +1 -0
  315. package/dist/lib/eval-executor.d.ts +21 -0
  316. package/dist/lib/eval-executor.d.ts.map +1 -0
  317. package/dist/lib/eval-executor.js +80 -0
  318. package/dist/lib/eval-executor.js.map +1 -0
  319. package/dist/lib/eval-executor.test.d.ts +2 -0
  320. package/dist/lib/eval-executor.test.d.ts.map +1 -0
  321. package/dist/lib/eval-executor.test.js +8 -0
  322. package/dist/lib/eval-executor.test.js.map +1 -0
  323. package/dist/lib/eval-grader.d.ts +38 -0
  324. package/dist/lib/eval-grader.d.ts.map +1 -0
  325. package/dist/lib/eval-grader.js +123 -0
  326. package/dist/lib/eval-grader.js.map +1 -0
  327. package/dist/lib/eval-grader.test.d.ts +2 -0
  328. package/dist/lib/eval-grader.test.d.ts.map +1 -0
  329. package/dist/lib/eval-grader.test.js +8 -0
  330. package/dist/lib/eval-grader.test.js.map +1 -0
  331. package/dist/lib/eval-meta-judge.d.ts +28 -0
  332. package/dist/lib/eval-meta-judge.d.ts.map +1 -0
  333. package/dist/lib/eval-meta-judge.js +116 -0
  334. package/dist/lib/eval-meta-judge.js.map +1 -0
  335. package/dist/lib/eval-trigger-tester.d.ts +19 -0
  336. package/dist/lib/eval-trigger-tester.d.ts.map +1 -0
  337. package/dist/lib/eval-trigger-tester.js +96 -0
  338. package/dist/lib/eval-trigger-tester.js.map +1 -0
  339. package/dist/lib/eval-worker.d.ts +12 -0
  340. package/dist/lib/eval-worker.d.ts.map +1 -0
  341. package/dist/lib/eval-worker.js +395 -0
  342. package/dist/lib/eval-worker.js.map +1 -0
  343. package/dist/lib/eval-worktree.d.ts +11 -0
  344. package/dist/lib/eval-worktree.d.ts.map +1 -0
  345. package/dist/lib/eval-worktree.js +87 -0
  346. package/dist/lib/eval-worktree.js.map +1 -0
  347. package/dist/lib/eval-worktree.test.d.ts +2 -0
  348. package/dist/lib/eval-worktree.test.d.ts.map +1 -0
  349. package/dist/lib/eval-worktree.test.js +68 -0
  350. package/dist/lib/eval-worktree.test.js.map +1 -0
  351. package/dist/lib/gateway-entry.d.ts +3 -0
  352. package/dist/lib/gateway-entry.d.ts.map +1 -0
  353. package/dist/lib/gateway-entry.js +19 -0
  354. package/dist/lib/gateway-entry.js.map +1 -0
  355. package/dist/lib/gateway-lifecycle.d.ts +9 -0
  356. package/dist/lib/gateway-lifecycle.d.ts.map +1 -0
  357. package/dist/lib/gateway-lifecycle.js +86 -0
  358. package/dist/lib/gateway-lifecycle.js.map +1 -0
  359. package/dist/lib/gateway.d.ts +12 -0
  360. package/dist/lib/gateway.d.ts.map +1 -0
  361. package/dist/lib/gateway.js +150 -0
  362. package/dist/lib/gateway.js.map +1 -0
  363. package/dist/lib/hooks-config.d.ts +95 -0
  364. package/dist/lib/hooks-config.d.ts.map +1 -0
  365. package/dist/lib/hooks-config.js +416 -0
  366. package/dist/lib/hooks-config.js.map +1 -0
  367. package/dist/lib/hooks-config.test.d.ts +2 -0
  368. package/dist/lib/hooks-config.test.d.ts.map +1 -0
  369. package/dist/lib/hooks-config.test.js +231 -0
  370. package/dist/lib/hooks-config.test.js.map +1 -0
  371. package/dist/lib/insights-prompts.d.ts +13 -0
  372. package/dist/lib/insights-prompts.d.ts.map +1 -0
  373. package/dist/lib/insights-prompts.js +145 -0
  374. package/dist/lib/insights-prompts.js.map +1 -0
  375. package/dist/lib/insights-worker.d.ts +10 -0
  376. package/dist/lib/insights-worker.d.ts.map +1 -0
  377. package/dist/lib/insights-worker.js +329 -0
  378. package/dist/lib/insights-worker.js.map +1 -0
  379. package/dist/lib/llm-client.d.ts +26 -0
  380. package/dist/lib/llm-client.d.ts.map +1 -0
  381. package/dist/lib/llm-client.js +142 -0
  382. package/dist/lib/llm-client.js.map +1 -0
  383. package/dist/lib/llm-client.test.d.ts +2 -0
  384. package/dist/lib/llm-client.test.d.ts.map +1 -0
  385. package/dist/lib/llm-client.test.js +62 -0
  386. package/dist/lib/llm-client.test.js.map +1 -0
  387. package/dist/lib/output.d.ts +4 -0
  388. package/dist/lib/output.d.ts.map +1 -0
  389. package/dist/lib/output.js +36 -0
  390. package/dist/lib/output.js.map +1 -0
  391. package/dist/lib/output.test.d.ts +2 -0
  392. package/dist/lib/output.test.d.ts.map +1 -0
  393. package/dist/lib/output.test.js +71 -0
  394. package/dist/lib/output.test.js.map +1 -0
  395. package/dist/lib/provider-aggregator.d.ts +24 -0
  396. package/dist/lib/provider-aggregator.d.ts.map +1 -0
  397. package/dist/lib/provider-aggregator.js +57 -0
  398. package/dist/lib/provider-aggregator.js.map +1 -0
  399. package/dist/lib/provider-aggregator.test.d.ts +2 -0
  400. package/dist/lib/provider-aggregator.test.d.ts.map +1 -0
  401. package/dist/lib/provider-aggregator.test.js +103 -0
  402. package/dist/lib/provider-aggregator.test.js.map +1 -0
  403. package/dist/lib/skills-loader.d.ts +6 -0
  404. package/dist/lib/skills-loader.d.ts.map +1 -0
  405. package/dist/lib/skills-loader.js +51 -0
  406. package/dist/lib/skills-loader.js.map +1 -0
  407. package/dist/lib/types.d.ts +48 -0
  408. package/dist/lib/types.d.ts.map +1 -0
  409. package/dist/lib/types.js +7 -0
  410. package/dist/lib/types.js.map +1 -0
  411. package/dist/test-helpers.d.ts +58 -0
  412. package/dist/test-helpers.d.ts.map +1 -0
  413. package/dist/test-helpers.js +58 -0
  414. package/dist/test-helpers.js.map +1 -0
  415. package/oclif.manifest.json +3197 -0
  416. package/package.json +76 -0
@@ -0,0 +1,116 @@
1
+ import { executeEval } from './eval-executor.js';
2
+ const META_JUDGE_SYSTEM_PROMPT = `You are a meta-judge evaluating the quality of an eval run — not the code output, but whether the test cases and grading themselves are rigorous and meaningful.
3
+
4
+ You will receive a summary of eval cases, their expectations, and grading results.
5
+
6
+ Analyze for these quality issues:
7
+
8
+ 1. **Weak expectations** — Expectations that are vague ("should follow conventions") or trivially satisfiable. Good expectations are specific and falsifiable.
9
+
10
+ 2. **Inconsistent grading** — Cases where similar expectations get different pass/fail results, or where evidence doesn't match the verdict.
11
+
12
+ 3. **Trivial tests** — Cases where the prompt doesn't actually challenge the rule. E.g., testing "NEVER use mocks" with a prompt that doesn't involve testing at all.
13
+
14
+ 4. **Untestable expectations** — Expectations that can't be verified from the output alone (e.g., "the developer should feel confident").
15
+
16
+ 5. **Suspicious 100% pass** — If every expectation passes, consider whether the tests were actually challenging enough.
17
+
18
+ Respond in JSON:
19
+ {
20
+ "quality_score": <1-5>,
21
+ "issues": [
22
+ {
23
+ "type": "weak_expectation | inconsistent_grading | trivial_test | untestable_expectation | all_pass_suspicious",
24
+ "severity": "low | medium | high",
25
+ "description": "<specific issue>",
26
+ "affected_eval": "<eval name if applicable>"
27
+ }
28
+ ],
29
+ "recommendations": ["<specific improvement suggestion>", ...],
30
+ "summary": "<1-2 sentence overall assessment>"
31
+ }
32
+
33
+ Be constructive but honest. A quality_score of 3 means acceptable, 4 means good, 5 means rigorous. Most real-world eval runs score 2-4.`;
34
+ export async function judgeEvalQuality(input) {
35
+ // Build a summary of the eval run for the meta-judge
36
+ const evalSummary = input.evalResults.map((r) => {
37
+ const gradingInfo = r.grading
38
+ ? {
39
+ pass_rate: r.grading.summary.pass_rate,
40
+ expectations: r.grading.expectations.map((e) => ({
41
+ text: e.text,
42
+ passed: e.passed,
43
+ evidence: e.evidence.slice(0, 200),
44
+ })),
45
+ feedback: r.grading.eval_feedback?.overall ?? '',
46
+ }
47
+ : null;
48
+ return {
49
+ eval_name: r.evalName,
50
+ prompt: r.prompt.slice(0, 500),
51
+ expectations: r.expectations,
52
+ grading: gradingInfo,
53
+ output_preview: r.output?.slice(0, 300) ?? '(not available)',
54
+ };
55
+ });
56
+ const prompt = `Evaluate the quality of this eval run for target "${input.targetName}":
57
+
58
+ ${JSON.stringify(evalSummary, null, 2)}`;
59
+ const result = await executeEval({
60
+ prompt,
61
+ systemPrompt: META_JUDGE_SYSTEM_PROMPT,
62
+ timeout: input.timeout ?? 60000,
63
+ model: input.model,
64
+ });
65
+ if (result.error || !result.output) {
66
+ return {
67
+ quality_score: 0,
68
+ issues: [{
69
+ type: 'inconsistent_grading',
70
+ severity: 'high',
71
+ description: `Meta-judge failed: ${result.error ?? 'no output'}`,
72
+ }],
73
+ recommendations: ['Meta-judge could not complete — check model availability'],
74
+ summary: 'Meta-judge execution failed.',
75
+ };
76
+ }
77
+ try {
78
+ const parsed = parseJsonFromOutput(result.output);
79
+ const issues = Array.isArray(parsed.issues) ? parsed.issues : [];
80
+ const recs = Array.isArray(parsed.recommendations) ? parsed.recommendations : [];
81
+ return {
82
+ quality_score: Math.max(1, Math.min(5, Number(parsed.quality_score) || 3)),
83
+ issues: issues.map((i) => ({
84
+ type: (i.type ?? 'weak_expectation'),
85
+ severity: (i.severity ?? 'medium'),
86
+ description: String(i.description ?? ''),
87
+ affected_eval: i.affected_eval ? String(i.affected_eval) : undefined,
88
+ })),
89
+ recommendations: recs,
90
+ summary: String(parsed.summary ?? 'No summary provided.'),
91
+ };
92
+ }
93
+ catch {
94
+ return {
95
+ quality_score: 3,
96
+ issues: [],
97
+ recommendations: [],
98
+ summary: 'Meta-judge returned unparseable output — defaulting to neutral score.',
99
+ };
100
+ }
101
+ }
102
+ function parseJsonFromOutput(output) {
103
+ // Try direct JSON parse
104
+ try {
105
+ return JSON.parse(output);
106
+ }
107
+ catch {
108
+ // Try extracting from markdown code block
109
+ const match = output.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
110
+ if (match) {
111
+ return JSON.parse(match[1]);
112
+ }
113
+ throw new Error('No JSON found in output');
114
+ }
115
+ }
116
+ //# sourceMappingURL=eval-meta-judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-meta-judge.js","sourceRoot":"","sources":["../../src/lib/eval-meta-judge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface TriggerTestResult {
2
+ query: string;
3
+ shouldTrigger: boolean;
4
+ didTrigger: boolean;
5
+ correct: boolean;
6
+ confidence: number;
7
+ evidence: string;
8
+ }
9
+ export declare function testTrigger(options: {
10
+ query: string;
11
+ shouldTrigger: boolean;
12
+ skillName: string;
13
+ skillDescription: string;
14
+ skillContent: string;
15
+ model?: string;
16
+ timeout?: number;
17
+ }): Promise<TriggerTestResult>;
18
+ export declare function computeTriggerScore(results: TriggerTestResult[]): number;
19
+ //# sourceMappingURL=eval-trigger-tester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-trigger-tester.d.ts","sourceRoot":"","sources":["../../src/lib/eval-trigger-tester.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAuBD,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwE7B;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAIxE"}
@@ -0,0 +1,96 @@
1
+ import { executeEval } from './eval-executor.js';
2
+ const TRIGGER_DETECTOR_PROMPT = `You are determining whether an AI assistant's response shows evidence of using a specific skill/instruction.
3
+
4
+ You will receive:
5
+ 1. The skill name and description
6
+ 2. Key content from the skill (to know what it teaches)
7
+ 3. The user's query
8
+ 4. The AI's response
9
+
10
+ Determine if the response shows clear signs of the skill being used:
11
+ - Does the response follow patterns/approaches described in the skill?
12
+ - Does it use terminology or structures specific to the skill?
13
+ - Would the response be noticeably different without the skill?
14
+
15
+ Respond with ONLY a valid JSON object:
16
+
17
+ {
18
+ "triggered": true,
19
+ "confidence": 0.85,
20
+ "evidence": "The response follows the X pattern described in the skill..."
21
+ }`;
22
+ export async function testTrigger(options) {
23
+ const { query, shouldTrigger, skillName, skillDescription, skillContent, model, timeout = 120_000 } = options;
24
+ // Run the query with the skill as system prompt
25
+ const execResult = await executeEval({
26
+ prompt: query,
27
+ targetContent: skillContent,
28
+ timeout,
29
+ model,
30
+ });
31
+ if (execResult.error) {
32
+ return {
33
+ query,
34
+ shouldTrigger,
35
+ didTrigger: false,
36
+ correct: !shouldTrigger,
37
+ confidence: 0,
38
+ evidence: `Execution failed: ${execResult.error}`,
39
+ };
40
+ }
41
+ // Use LLM to detect if the skill influenced the response
42
+ const detectorPrompt = `## Skill
43
+ Name: ${skillName}
44
+ Description: ${skillDescription}
45
+
46
+ ## Key Skill Content (first 500 chars)
47
+ ${skillContent.slice(0, 500)}
48
+
49
+ ## User Query
50
+ ${query}
51
+
52
+ ## AI Response
53
+ ${execResult.output}
54
+
55
+ Did the AI's response show evidence of using this skill? Respond with ONLY valid JSON.`;
56
+ const detectorResult = await executeEval({
57
+ prompt: detectorPrompt,
58
+ targetContent: TRIGGER_DETECTOR_PROMPT,
59
+ timeout: 60_000,
60
+ model,
61
+ });
62
+ let didTrigger = false;
63
+ let confidence = 0;
64
+ let evidence = '';
65
+ try {
66
+ let jsonStr = detectorResult.output.trim();
67
+ const jsonMatch = jsonStr.match(/```(?:json)?\s*([\s\S]*?)```/);
68
+ if (jsonMatch)
69
+ jsonStr = jsonMatch[1].trim();
70
+ const objMatch = jsonStr.match(/\{[\s\S]*\}/);
71
+ if (objMatch)
72
+ jsonStr = objMatch[0];
73
+ const parsed = JSON.parse(jsonStr);
74
+ didTrigger = parsed.triggered === true;
75
+ confidence = parsed.confidence ?? 0;
76
+ evidence = parsed.evidence ?? '';
77
+ }
78
+ catch {
79
+ evidence = `Detector returned unparseable output: ${detectorResult.output.slice(0, 200)}`;
80
+ }
81
+ return {
82
+ query,
83
+ shouldTrigger,
84
+ didTrigger,
85
+ correct: didTrigger === shouldTrigger,
86
+ confidence,
87
+ evidence,
88
+ };
89
+ }
90
+ export function computeTriggerScore(results) {
91
+ if (results.length === 0)
92
+ return 0;
93
+ const correct = results.filter((r) => r.correct).length;
94
+ return correct / results.length;
95
+ }
96
+ //# sourceMappingURL=eval-trigger-tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-trigger-tester.js","sourceRoot":"","sources":["../../src/lib/eval-trigger-tester.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAWjD,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;EAmB9B,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAQjC;IACC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC;IAE9G,gDAAgD;IAChD,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC;QACnC,MAAM,EAAE,KAAK;QACb,aAAa,EAAE,YAAY;QAC3B,OAAO;QACP,KAAK;KACN,CAAC,CAAC;IAEH,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO;YACL,KAAK;YACL,aAAa;YACb,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,CAAC,aAAa;YACvB,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,qBAAqB,UAAU,CAAC,KAAK,EAAE;SAClD,CAAC;IACJ,CAAC;IAED,yDAAyD;IACzD,MAAM,cAAc,GAAG;QACjB,SAAS;eACF,gBAAgB;;;EAG7B,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;;;EAG1B,KAAK;;;EAGL,UAAU,CAAC,MAAM;;uFAEoE,CAAC;IAEtF,MAAM,cAAc,GAAG,MAAM,WAAW,CAAC;QACvC,MAAM,EAAE,cAAc;QACtB,aAAa,EAAE,uBAAuB;QACtC,OAAO,EAAE,MAAM;QACf,KAAK;KACN,CAAC,CAAC;IAEH,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,IAAI,CAAC;QACH,IAAI,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAChE,IAAI,SAAS;YAAE,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC9C,IAAI,QAAQ;YAAE,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,UAAU,GAAG,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC;QACvC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;QACpC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ,GAAG,yCAAyC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IAC5F,CAAC;IAED,OAAO;QACL,KAAK;QACL,aAAa;QACb,UAAU;QACV,OAAO,EAAE,UAAU,KAAK,aAAa;QACrC,UAAU;QACV,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAA4B;IAC9D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACxD,OAAO,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;AAClC,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface WorkerOptions {
2
+ supabaseUrl: string;
3
+ supabaseAnonKey: string;
4
+ accessToken: string;
5
+ userId: string;
6
+ log: (msg: string) => void;
7
+ }
8
+ export declare function createWorkerId(): string;
9
+ /** Decode the `sub` claim from a JWT without a library. */
10
+ export declare function getUserIdFromJwt(jwt: string): string | null;
11
+ export declare function startWorker(options: WorkerOptions): Promise<() => void>;
12
+ //# sourceMappingURL=eval-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-worker.d.ts","sourceRoot":"","sources":["../../src/lib/eval-worker.ts"],"names":[],"mappings":"AA6CA,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO3D;AAeD,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CA+X7E"}
@@ -0,0 +1,395 @@
1
+ import { createClient } from '@supabase/supabase-js';
2
+ import { apiGet, apiPost, apiPatch } from './api-client.js';
3
+ import { executeEval } from './eval-executor.js';
4
+ import { gradeEvalOutput } from './eval-grader.js';
5
+ import { judgeEvalQuality } from './eval-meta-judge.js';
6
+ import { createEvalWorktree } from './eval-worktree.js';
7
+ import { processInsightsJob } from './insights-worker.js';
8
+ import { processConversationJob } from './eval-conversation-handler.js';
9
+ import os from 'node:os';
10
+ import path from 'node:path';
11
+ import { writeFile, mkdir } from 'node:fs/promises';
12
+ export function createWorkerId() {
13
+ return `${os.hostname()}-${process.pid}`;
14
+ }
15
+ /** Decode the `sub` claim from a JWT without a library. */
16
+ export function getUserIdFromJwt(jwt) {
17
+ try {
18
+ const payload = JSON.parse(Buffer.from(jwt.split('.')[1], 'base64url').toString());
19
+ return payload.sub ?? null;
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ /** Best-effort refresh of the local skills registry cache (~24h cycle). */
26
+ async function refreshSkillsRegistry(log) {
27
+ const { fetchAllSources, TIER_1_SOURCES } = await import('@rulemetric/skills-registry');
28
+ const skills = await fetchAllSources(TIER_1_SOURCES, (source, count) => {
29
+ log(`Skills registry: fetched ${count} from ${source}`);
30
+ });
31
+ const configDir = path.join(os.homedir(), '.config', 'rulemetric');
32
+ await mkdir(configDir, { recursive: true });
33
+ const outPath = path.join(configDir, 'skills-registry.json');
34
+ await writeFile(outPath, JSON.stringify({ generatedAt: new Date().toISOString(), skills }, null, 2));
35
+ log(`Skills registry refreshed: ${skills.length} skills written to ${outPath}`);
36
+ }
37
+ export async function startWorker(options) {
38
+ const { supabaseUrl, supabaseAnonKey, accessToken, userId, log } = options;
39
+ const workerId = createWorkerId();
40
+ const supabase = createClient(supabaseUrl, supabaseAnonKey, {
41
+ global: { headers: { Authorization: `Bearer ${accessToken}` } },
42
+ });
43
+ let processing = false;
44
+ // Recover stale jobs (stuck in claimed/running for >5 min) on startup
45
+ async function recoverStaleJobs() {
46
+ try {
47
+ const evalRecovery = await apiPost('/api/eval-jobs/recover-stale', {});
48
+ const insightsRecovery = await apiPost('/api/insights-jobs/recover-stale', {});
49
+ const total = evalRecovery.recovered + insightsRecovery.recovered;
50
+ if (total > 0) {
51
+ log(`Recovered ${total} stale jobs (${evalRecovery.recovered} eval, ${insightsRecovery.recovered} insights)`);
52
+ }
53
+ }
54
+ catch {
55
+ // Non-fatal — older API versions may not have this endpoint
56
+ }
57
+ }
58
+ await recoverStaleJobs();
59
+ // Pick up any pending eval jobs created while we were offline
60
+ const pendingJobs = await apiGet('/api/eval-jobs/pending');
61
+ for (const job of pendingJobs) {
62
+ await processJob(job, workerId, log);
63
+ }
64
+ // Pick up any pending insights jobs
65
+ const pendingInsightsJobs = await apiGet('/api/insights-jobs/pending');
66
+ for (const job of pendingInsightsJobs) {
67
+ await processInsightsJob(job, workerId, log);
68
+ }
69
+ // Subscribe to new jobs via Realtime
70
+ const channel = supabase
71
+ .channel('eval-jobs-worker')
72
+ .on('postgres_changes', {
73
+ event: 'INSERT',
74
+ schema: 'public',
75
+ table: 'eval_jobs',
76
+ filter: `user_id=eq.${userId}`,
77
+ }, async (payload) => {
78
+ if (processing)
79
+ return;
80
+ const job = payload.new;
81
+ if (job.status === 'pending') {
82
+ await processJob(job, workerId, log);
83
+ }
84
+ })
85
+ .subscribe((status) => {
86
+ if (status === 'SUBSCRIBED') {
87
+ log(`Worker ${workerId} listening for eval jobs...`);
88
+ }
89
+ });
90
+ // Subscribe to insights jobs via Realtime
91
+ const insightsChannel = supabase
92
+ .channel('insights-jobs-worker')
93
+ .on('postgres_changes', {
94
+ event: 'INSERT',
95
+ schema: 'public',
96
+ table: 'insights_jobs',
97
+ filter: `user_id=eq.${userId}`,
98
+ }, async (payload) => {
99
+ if (processing)
100
+ return;
101
+ const job = payload.new;
102
+ if (job.status === 'pending') {
103
+ processing = true;
104
+ try {
105
+ await processInsightsJob(job, workerId, log);
106
+ }
107
+ finally {
108
+ processing = false;
109
+ }
110
+ }
111
+ })
112
+ .subscribe((status) => {
113
+ if (status === 'SUBSCRIBED') {
114
+ log(`Worker ${workerId} listening for insights jobs...`);
115
+ }
116
+ });
117
+ // Poll for pending jobs as a fallback — Realtime postgres_changes may not
118
+ // fire reliably depending on RLS/auth context. Polling every 5s is cheap.
119
+ let pollCount = 0;
120
+ const pollInterval = setInterval(async () => {
121
+ if (processing)
122
+ return;
123
+ try {
124
+ // Recover stale jobs every ~60s (every 12th poll)
125
+ if (++pollCount % 12 === 0) {
126
+ await recoverStaleJobs();
127
+ }
128
+ // Auto-generate insights for stale projects every ~6 hours (4320 polls)
129
+ if (pollCount % 4320 === 1) {
130
+ try {
131
+ await apiPost('/api/insights-jobs/regenerate-all', {});
132
+ log('Auto-triggered insights regeneration for stale projects');
133
+ }
134
+ catch {
135
+ // Best-effort — silently ignore
136
+ }
137
+ }
138
+ // Refresh skills registry every ~24 hours (17280 polls at 5s each)
139
+ if (pollCount % 17280 === 100) {
140
+ try {
141
+ await refreshSkillsRegistry(log);
142
+ }
143
+ catch {
144
+ // Best-effort — don't fail the worker
145
+ }
146
+ }
147
+ const evalJobs = await apiGet('/api/eval-jobs/pending');
148
+ for (const job of evalJobs) {
149
+ if (!processing) {
150
+ await processJob(job, workerId, log);
151
+ }
152
+ }
153
+ const insightsJobs = await apiGet('/api/insights-jobs/pending');
154
+ for (const job of insightsJobs) {
155
+ if (!processing) {
156
+ processing = true;
157
+ try {
158
+ await processInsightsJob(job, workerId, log);
159
+ }
160
+ finally {
161
+ processing = false;
162
+ }
163
+ }
164
+ }
165
+ }
166
+ catch {
167
+ // Silently ignore poll errors (network blip, etc.)
168
+ }
169
+ }, 5_000);
170
+ // Heartbeat via broadcast (web UI listens for this)
171
+ const heartbeatChannel = supabase
172
+ .channel(`worker-heartbeat-${userId}`)
173
+ .subscribe((status) => {
174
+ if (status === 'SUBSCRIBED') {
175
+ heartbeatChannel.send({
176
+ type: 'broadcast',
177
+ event: 'heartbeat',
178
+ payload: { workerId, timestamp: Date.now() },
179
+ });
180
+ }
181
+ });
182
+ const heartbeatInterval = setInterval(() => {
183
+ heartbeatChannel.send({
184
+ type: 'broadcast',
185
+ event: 'heartbeat',
186
+ payload: { workerId, timestamp: Date.now() },
187
+ });
188
+ }, 5_000); // 5s heartbeat — fast enough for UI to detect worker within one interval
189
+ async function processJob(job, wId, logger) {
190
+ processing = true;
191
+ try {
192
+ // Claim the job (returns 409 if already claimed by another worker)
193
+ const claimed = await apiPost(`/api/eval-jobs/${job.id}/claim`, { workerId: wId }).catch((err) => {
194
+ if (err?.statusCode === 409)
195
+ return null;
196
+ throw err;
197
+ });
198
+ if (!claimed) {
199
+ logger(`Job ${job.id} already claimed, skipping`);
200
+ processing = false;
201
+ return;
202
+ }
203
+ logger(`Claimed job ${job.id} for target ${job.evalTargetId}`);
204
+ // Check if this is a conversation job
205
+ if (job.config && job.config.type === 'conversation') {
206
+ await processConversationJob(job.config, job.evalTargetId, logger);
207
+ await apiPost(`/api/eval-jobs/${job.id}/complete`, { result: { type: 'conversation' } });
208
+ processing = false;
209
+ return;
210
+ }
211
+ const target = await apiGet(`/api/eval-targets/${job.evalTargetId}`);
212
+ const evalCases = await apiGet(`/api/eval-targets/${job.evalTargetId}/evals`);
213
+ if (evalCases.length === 0) {
214
+ await apiPost(`/api/eval-jobs/${job.id}/complete`, { error: 'No evals defined for target' });
215
+ processing = false;
216
+ return;
217
+ }
218
+ const config = job.config;
219
+ const runsPerEval = config.runsPerEval ?? 1;
220
+ const timeout = config.timeout ?? 120_000;
221
+ const iteration = config.iteration ?? 1;
222
+ const configurations = [
223
+ { name: 'with_target', content: target.content },
224
+ ];
225
+ if (!config.skipBaseline) {
226
+ configurations.push({ name: 'without_target' });
227
+ }
228
+ // Build work queue
229
+ const workQueue = [];
230
+ for (const eval_ of evalCases) {
231
+ for (const cfg of configurations) {
232
+ for (let run = 1; run <= runsPerEval; run++) {
233
+ workQueue.push({ eval_: eval_, configuration: cfg.name, targetContent: cfg.content, runNumber: run });
234
+ }
235
+ }
236
+ }
237
+ const total = workQueue.length;
238
+ let completed = 0;
239
+ const concurrency = Math.min(config.parallel ?? 1, 4); // cap at 4 parallel
240
+ await apiPatch(`/api/eval-jobs/${job.id}/progress`, {
241
+ status: 'running',
242
+ progress: { total, completed: 0, current: null, message: `Starting ${total} eval runs (concurrency: ${concurrency})...` },
243
+ });
244
+ const results = [];
245
+ // Process work items — sequential if concurrency=1, parallel otherwise
246
+ async function processItem(item) {
247
+ const label = `${item.configuration} · ${item.eval_.name} · run#${item.runNumber}`;
248
+ logger(`[${completed + 1}/${total}] ${label}`);
249
+ // Create isolated worktree for parallel execution
250
+ const worktree = concurrency > 1 ? createEvalWorktree() : null;
251
+ try {
252
+ const execResult = await executeEval({
253
+ prompt: item.eval_.prompt,
254
+ targetContent: item.targetContent,
255
+ workDir: worktree?.workDir,
256
+ timeout,
257
+ model: config.model,
258
+ });
259
+ let grading = {};
260
+ if (!config.skipGrading && item.eval_.expectations.length > 0 && !execResult.error) {
261
+ const gradingResult = await gradeEvalOutput({
262
+ prompt: item.eval_.prompt,
263
+ output: execResult.output,
264
+ expectations: item.eval_.expectations,
265
+ model: config.graderModel ?? config.model,
266
+ timeout,
267
+ });
268
+ grading = gradingResult;
269
+ }
270
+ return {
271
+ evalId: item.eval_.id,
272
+ evalTargetId: target.id,
273
+ evalTargetVersion: target.version,
274
+ configuration: item.configuration,
275
+ runNumber: item.runNumber,
276
+ iteration,
277
+ status: execResult.error ? 'failed' : 'completed',
278
+ outputs: execResult.error ? { error: execResult.error } : { transcript: execResult.output },
279
+ timing: { duration_ms: execResult.durationMs, total_tokens: execResult.totalTokens },
280
+ grading,
281
+ worktree: worktree?.isWorktree ? true : undefined,
282
+ };
283
+ }
284
+ finally {
285
+ worktree?.cleanup();
286
+ }
287
+ }
288
+ if (concurrency <= 1) {
289
+ // Sequential execution (existing behavior)
290
+ for (const item of workQueue) {
291
+ const label = `${item.configuration} · ${item.eval_.name} · run#${item.runNumber}`;
292
+ await apiPatch(`/api/eval-jobs/${job.id}/progress`, {
293
+ status: 'running',
294
+ progress: { total, completed, current: label, message: `Executing ${label}...` },
295
+ });
296
+ const runResult = await processItem(item);
297
+ await apiPost('/api/eval-runs', runResult);
298
+ results.push(runResult);
299
+ completed++;
300
+ await apiPatch(`/api/eval-jobs/${job.id}/progress`, {
301
+ status: 'running',
302
+ progress: { total, completed, current: label, message: `Completed ${label}` },
303
+ });
304
+ }
305
+ }
306
+ else {
307
+ // Parallel execution with worktree isolation
308
+ logger(`Running ${total} evals with concurrency=${concurrency} (worktree isolation)`);
309
+ for (let i = 0; i < workQueue.length; i += concurrency) {
310
+ const batch = workQueue.slice(i, i + concurrency);
311
+ const batchLabel = `batch ${Math.floor(i / concurrency) + 1}/${Math.ceil(workQueue.length / concurrency)}`;
312
+ await apiPatch(`/api/eval-jobs/${job.id}/progress`, {
313
+ status: 'running',
314
+ progress: { total, completed, current: batchLabel, message: `Executing ${batchLabel} (${batch.length} parallel)...` },
315
+ });
316
+ const batchResults = await Promise.all(batch.map(processItem));
317
+ for (const runResult of batchResults) {
318
+ await apiPost('/api/eval-runs', runResult);
319
+ results.push(runResult);
320
+ completed++;
321
+ }
322
+ await apiPatch(`/api/eval-jobs/${job.id}/progress`, {
323
+ status: 'running',
324
+ progress: { total, completed, current: batchLabel, message: `Completed ${batchLabel}` },
325
+ });
326
+ }
327
+ }
328
+ const summary = buildSummary(results);
329
+ // Meta-judge: assess eval quality if we have grading results
330
+ let metaJudgement;
331
+ if (!config.skipGrading && results.some(r => r.grading && Object.keys(r.grading).length > 0)) {
332
+ try {
333
+ logger(`Running meta-judge for job ${job.id}...`);
334
+ const evalInputs = evalCases.map(e => {
335
+ const matchingResults = results.filter(r => r.evalId === e.id && r.configuration === 'with_target');
336
+ const firstResult = matchingResults[0];
337
+ return {
338
+ evalName: e.name,
339
+ prompt: e.prompt,
340
+ expectations: e.expectations,
341
+ grading: firstResult?.grading ? firstResult.grading : null,
342
+ output: firstResult?.outputs?.transcript?.slice(0, 500),
343
+ };
344
+ });
345
+ metaJudgement = await judgeEvalQuality({
346
+ targetName: target.name,
347
+ evalResults: evalInputs,
348
+ model: config.graderModel ?? config.model,
349
+ timeout: 60000,
350
+ });
351
+ logger(`Meta-judge: quality=${metaJudgement.quality_score}/5, issues=${metaJudgement.issues.length}`);
352
+ }
353
+ catch (err) {
354
+ logger(`Meta-judge failed (non-fatal): ${err instanceof Error ? err.message : String(err)}`);
355
+ }
356
+ }
357
+ const result = metaJudgement
358
+ ? { ...summary, meta_judgement: metaJudgement }
359
+ : summary;
360
+ await apiPost(`/api/eval-jobs/${job.id}/complete`, { result });
361
+ logger(`Job ${job.id} completed: ${completed}/${total} runs`);
362
+ }
363
+ catch (err) {
364
+ const errorMsg = err instanceof Error ? err.message : String(err);
365
+ logger(`Job ${job.id} failed: ${errorMsg}`);
366
+ await apiPost(`/api/eval-jobs/${job.id}/complete`, { error: errorMsg }).catch(() => { });
367
+ }
368
+ processing = false;
369
+ }
370
+ return () => {
371
+ clearInterval(pollInterval);
372
+ clearInterval(heartbeatInterval);
373
+ supabase.removeChannel(channel);
374
+ supabase.removeChannel(insightsChannel);
375
+ supabase.removeChannel(heartbeatChannel);
376
+ };
377
+ }
378
+ function buildSummary(results) {
379
+ const completed = results.filter((r) => r.status === 'completed');
380
+ const failed = results.filter((r) => r.status === 'failed');
381
+ const gradedRuns = completed.filter((r) => {
382
+ const grading = r.grading;
383
+ return grading && Object.keys(grading).length > 0;
384
+ });
385
+ const avgPassRate = gradedRuns.length > 0
386
+ ? gradedRuns.reduce((sum, r) => sum + (r.grading?.summary?.pass_rate ?? 0), 0) / gradedRuns.length
387
+ : null;
388
+ return {
389
+ total: results.length,
390
+ completed: completed.length,
391
+ failed: failed.length,
392
+ avgPassRate,
393
+ };
394
+ }
395
+ //# sourceMappingURL=eval-worker.js.map