@rulemetric/cli 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (774) hide show
  1. package/dist/base-command.js +13 -52
  2. package/dist/base-command.js.map +7 -1
  3. package/dist/chunk-2AM54TUK.js +59 -0
  4. package/dist/chunk-2AM54TUK.js.map +7 -0
  5. package/dist/chunk-3TIMQ3O6.js +96 -0
  6. package/dist/chunk-3TIMQ3O6.js.map +7 -0
  7. package/dist/chunk-4BHDHHKL.js +48 -0
  8. package/dist/chunk-4BHDHHKL.js.map +7 -0
  9. package/dist/chunk-4D537GXE.js +99 -0
  10. package/dist/chunk-4D537GXE.js.map +7 -0
  11. package/dist/chunk-4SCZK7AL.js +129 -0
  12. package/dist/chunk-4SCZK7AL.js.map +7 -0
  13. package/dist/chunk-4WFE4PFP.js +61 -0
  14. package/dist/chunk-4WFE4PFP.js.map +7 -0
  15. package/dist/chunk-52WIYRZH.js +73 -0
  16. package/dist/chunk-52WIYRZH.js.map +7 -0
  17. package/dist/chunk-7FAA3YNB.js +1549 -0
  18. package/dist/chunk-7FAA3YNB.js.map +7 -0
  19. package/dist/chunk-7NYKWN7U.js +12 -0
  20. package/dist/chunk-7NYKWN7U.js.map +7 -0
  21. package/dist/chunk-AULP2OWH.js +99 -0
  22. package/dist/chunk-AULP2OWH.js.map +7 -0
  23. package/dist/chunk-B5KNTGMJ.js +1788 -0
  24. package/dist/chunk-B5KNTGMJ.js.map +7 -0
  25. package/dist/chunk-BD7CY42U.js +23 -0
  26. package/dist/chunk-BD7CY42U.js.map +7 -0
  27. package/dist/chunk-BO76WKJR.js +42 -0
  28. package/dist/chunk-BO76WKJR.js.map +7 -0
  29. package/dist/chunk-BRD5RUGM.js +53 -0
  30. package/dist/chunk-BRD5RUGM.js.map +7 -0
  31. package/dist/chunk-BT6Z6545.js +43 -0
  32. package/dist/chunk-BT6Z6545.js.map +7 -0
  33. package/dist/chunk-BZDKEQKU.js +39 -0
  34. package/dist/chunk-BZDKEQKU.js.map +7 -0
  35. package/dist/chunk-CROYS75W.js +161 -0
  36. package/dist/chunk-CROYS75W.js.map +7 -0
  37. package/dist/chunk-DGHWRQXL.js +17 -0
  38. package/dist/chunk-DGHWRQXL.js.map +7 -0
  39. package/dist/chunk-DQ3KELXD.js +74 -0
  40. package/dist/chunk-DQ3KELXD.js.map +7 -0
  41. package/dist/chunk-DTFXCHHI.js +108 -0
  42. package/dist/chunk-DTFXCHHI.js.map +7 -0
  43. package/dist/chunk-DU73QUS3.js +75 -0
  44. package/dist/chunk-DU73QUS3.js.map +7 -0
  45. package/dist/chunk-EHZJ6OXD.js +307 -0
  46. package/dist/chunk-EHZJ6OXD.js.map +7 -0
  47. package/dist/chunk-EJOI2ZGU.js +109 -0
  48. package/dist/chunk-EJOI2ZGU.js.map +7 -0
  49. package/dist/chunk-EKJ2CABV.js +76 -0
  50. package/dist/chunk-EKJ2CABV.js.map +7 -0
  51. package/dist/chunk-EKP32DLN.js +16 -0
  52. package/dist/chunk-EKP32DLN.js.map +7 -0
  53. package/dist/chunk-EOOP6WTC.js +148 -0
  54. package/dist/chunk-EOOP6WTC.js.map +7 -0
  55. package/dist/chunk-ERPMDAO3.js +20 -0
  56. package/dist/chunk-ERPMDAO3.js.map +7 -0
  57. package/dist/chunk-FTJRMUID.js +96 -0
  58. package/dist/chunk-FTJRMUID.js.map +7 -0
  59. package/dist/chunk-FZKLLNDS.js +228 -0
  60. package/dist/chunk-FZKLLNDS.js.map +7 -0
  61. package/dist/chunk-GQCISMAH.js +157 -0
  62. package/dist/chunk-GQCISMAH.js.map +7 -0
  63. package/dist/chunk-IGXX624H.js +55 -0
  64. package/dist/chunk-IGXX624H.js.map +7 -0
  65. package/dist/chunk-IJGF2ETG.js +68 -0
  66. package/dist/chunk-IJGF2ETG.js.map +7 -0
  67. package/dist/chunk-IWYCRLEK.js +220 -0
  68. package/dist/chunk-IWYCRLEK.js.map +7 -0
  69. package/dist/chunk-J7N3DLH6.js +117 -0
  70. package/dist/chunk-J7N3DLH6.js.map +7 -0
  71. package/dist/chunk-JX5UI6RW.js +99 -0
  72. package/dist/chunk-JX5UI6RW.js.map +7 -0
  73. package/dist/chunk-K3BFZ7KG.js +154 -0
  74. package/dist/chunk-K3BFZ7KG.js.map +7 -0
  75. package/dist/chunk-KHJUQFIK.js +51 -0
  76. package/dist/chunk-KHJUQFIK.js.map +7 -0
  77. package/dist/chunk-KRBQLMOP.js +41 -0
  78. package/dist/chunk-KRBQLMOP.js.map +7 -0
  79. package/dist/chunk-KZRFUXGF.js +145 -0
  80. package/dist/chunk-KZRFUXGF.js.map +7 -0
  81. package/dist/chunk-L674RNKQ.js +492 -0
  82. package/dist/chunk-L674RNKQ.js.map +7 -0
  83. package/dist/chunk-N52AHNBH.js +47 -0
  84. package/dist/chunk-N52AHNBH.js.map +7 -0
  85. package/dist/chunk-NIDLJO6F.js +228 -0
  86. package/dist/chunk-NIDLJO6F.js.map +7 -0
  87. package/dist/chunk-NSBPE2FW.js +17 -0
  88. package/dist/chunk-NSBPE2FW.js.map +7 -0
  89. package/dist/chunk-OGVORIFM.js +70 -0
  90. package/dist/chunk-OGVORIFM.js.map +7 -0
  91. package/dist/chunk-OQSQC7VB.js +77 -0
  92. package/dist/chunk-OQSQC7VB.js.map +7 -0
  93. package/dist/chunk-PHLMIZKM.js +153 -0
  94. package/dist/chunk-PHLMIZKM.js.map +7 -0
  95. package/dist/chunk-PQU7GZ7A.js +92 -0
  96. package/dist/chunk-PQU7GZ7A.js.map +7 -0
  97. package/dist/chunk-PXVQLD7S.js +196 -0
  98. package/dist/chunk-PXVQLD7S.js.map +7 -0
  99. package/dist/chunk-QD6X4L4L.js +79 -0
  100. package/dist/chunk-QD6X4L4L.js.map +7 -0
  101. package/dist/chunk-QJQS6TUN.js +44 -0
  102. package/dist/chunk-QJQS6TUN.js.map +7 -0
  103. package/dist/chunk-QJXAULRC.js +191 -0
  104. package/dist/chunk-QJXAULRC.js.map +7 -0
  105. package/dist/chunk-QN34TGD3.js +83 -0
  106. package/dist/chunk-QN34TGD3.js.map +7 -0
  107. package/dist/chunk-R5MFHGHR.js +122 -0
  108. package/dist/chunk-R5MFHGHR.js.map +7 -0
  109. package/dist/chunk-RH7NHVSK.js +16 -0
  110. package/dist/chunk-RH7NHVSK.js.map +7 -0
  111. package/dist/chunk-RJ7BHDLM.js +121 -0
  112. package/dist/chunk-RJ7BHDLM.js.map +7 -0
  113. package/dist/chunk-RQ2TMLKG.js +142 -0
  114. package/dist/chunk-RQ2TMLKG.js.map +7 -0
  115. package/dist/chunk-S56LOTGQ.js +63 -0
  116. package/dist/chunk-S56LOTGQ.js.map +7 -0
  117. package/dist/chunk-UF73WX2J.js +49 -0
  118. package/dist/chunk-UF73WX2J.js.map +7 -0
  119. package/dist/chunk-W53GKIZQ.js +50 -0
  120. package/dist/chunk-W53GKIZQ.js.map +7 -0
  121. package/dist/chunk-WA4MWYRW.js +254 -0
  122. package/dist/chunk-WA4MWYRW.js.map +7 -0
  123. package/dist/chunk-WFULKPEQ.js +269 -0
  124. package/dist/chunk-WFULKPEQ.js.map +7 -0
  125. package/dist/chunk-XC6M4CSW.js +44 -0
  126. package/dist/chunk-XC6M4CSW.js.map +7 -0
  127. package/dist/chunk-XPUEGHXN.js +243 -0
  128. package/dist/chunk-XPUEGHXN.js.map +7 -0
  129. package/dist/chunk-XZXS2W24.js +148 -0
  130. package/dist/chunk-XZXS2W24.js.map +7 -0
  131. package/dist/chunk-YBNW7ARH.js +167 -0
  132. package/dist/chunk-YBNW7ARH.js.map +7 -0
  133. package/dist/chunk-YNIH3KMU.js +121 -0
  134. package/dist/chunk-YNIH3KMU.js.map +7 -0
  135. package/dist/commands/antigravity/backfill.js +135 -0
  136. package/dist/commands/antigravity/backfill.js.map +7 -0
  137. package/dist/commands/auth/create-key.js +48 -33
  138. package/dist/commands/auth/create-key.js.map +7 -1
  139. package/dist/commands/auth/login.js +58 -46
  140. package/dist/commands/auth/login.js.map +7 -1
  141. package/dist/commands/auth/logout.js +28 -13
  142. package/dist/commands/auth/logout.js.map +7 -1
  143. package/dist/commands/auth/revoke-key.js +32 -18
  144. package/dist/commands/auth/revoke-key.js.map +7 -1
  145. package/dist/commands/auth/status.js +40 -22
  146. package/dist/commands/auth/status.js.map +7 -1
  147. package/dist/commands/catalog/index.js +50 -34
  148. package/dist/commands/catalog/index.js.map +7 -1
  149. package/dist/commands/catalog/recommend.js +41 -26
  150. package/dist/commands/catalog/recommend.js.map +7 -1
  151. package/dist/commands/convert.js +72 -54
  152. package/dist/commands/convert.js.map +7 -1
  153. package/dist/commands/converters.js +52 -38
  154. package/dist/commands/converters.js.map +7 -1
  155. package/dist/commands/crons/list.js +50 -24
  156. package/dist/commands/crons/list.js.map +7 -1
  157. package/dist/commands/crons/run.js +72 -47
  158. package/dist/commands/crons/run.js.map +7 -1
  159. package/dist/commands/dashboard.js +45 -24
  160. package/dist/commands/dashboard.js.map +7 -1
  161. package/dist/commands/eval-targets/create.js +51 -39
  162. package/dist/commands/eval-targets/create.js.map +7 -1
  163. package/dist/commands/eval-targets/list.js +52 -35
  164. package/dist/commands/eval-targets/list.js.map +7 -1
  165. package/dist/commands/evals/agent.js +292 -0
  166. package/dist/commands/evals/agent.js.map +7 -0
  167. package/dist/commands/evals/benchmark.js +70 -51
  168. package/dist/commands/evals/benchmark.js.map +7 -1
  169. package/dist/commands/evals/compare.js +90 -78
  170. package/dist/commands/evals/compare.js.map +7 -1
  171. package/dist/commands/evals/create.js +64 -50
  172. package/dist/commands/evals/create.js.map +7 -1
  173. package/dist/commands/evals/optimize-description.js +225 -222
  174. package/dist/commands/evals/optimize-description.js.map +7 -1
  175. package/dist/commands/evals/optimize.js +206 -196
  176. package/dist/commands/evals/optimize.js.map +7 -1
  177. package/dist/commands/evals/run.js +178 -164
  178. package/dist/commands/evals/run.js.map +7 -1
  179. package/dist/commands/gateway/ensure.js +33 -19
  180. package/dist/commands/gateway/ensure.js.map +7 -1
  181. package/dist/commands/hooks/install.js +335 -275
  182. package/dist/commands/hooks/install.js.map +7 -1
  183. package/dist/commands/hooks/run.js +72 -53
  184. package/dist/commands/hooks/run.js.map +7 -1
  185. package/dist/commands/hooks/uninstall.js +117 -94
  186. package/dist/commands/hooks/uninstall.js.map +7 -1
  187. package/dist/commands/import.js +63 -53
  188. package/dist/commands/import.js.map +7 -1
  189. package/dist/commands/instructions/create.js +71 -58
  190. package/dist/commands/instructions/create.js.map +7 -1
  191. package/dist/commands/instructions/delete.js +53 -36
  192. package/dist/commands/instructions/delete.js.map +7 -1
  193. package/dist/commands/instructions/fork.js +33 -19
  194. package/dist/commands/instructions/fork.js.map +7 -1
  195. package/dist/commands/instructions/get.js +66 -49
  196. package/dist/commands/instructions/get.js.map +7 -1
  197. package/dist/commands/instructions/list.js +63 -46
  198. package/dist/commands/instructions/list.js.map +7 -1
  199. package/dist/commands/instructions/promote.js +41 -27
  200. package/dist/commands/instructions/promote.js.map +7 -1
  201. package/dist/commands/instructions/pull.js +37 -21
  202. package/dist/commands/instructions/pull.js.map +7 -1
  203. package/dist/commands/instructions/upstream.js +36 -21
  204. package/dist/commands/instructions/upstream.js.map +7 -1
  205. package/dist/commands/instructions/versions.js +51 -33
  206. package/dist/commands/instructions/versions.js.map +7 -1
  207. package/dist/commands/launcher.js +39 -0
  208. package/dist/commands/launcher.js.map +7 -0
  209. package/dist/commands/org/current.js +74 -68
  210. package/dist/commands/org/current.js.map +7 -1
  211. package/dist/commands/org/list.js +50 -36
  212. package/dist/commands/org/list.js.map +7 -1
  213. package/dist/commands/org/switch.js +69 -51
  214. package/dist/commands/org/switch.js.map +7 -1
  215. package/dist/commands/packs/add-instruction.js +36 -22
  216. package/dist/commands/packs/add-instruction.js.map +7 -1
  217. package/dist/commands/packs/apply.js +38 -24
  218. package/dist/commands/packs/apply.js.map +7 -1
  219. package/dist/commands/packs/create.js +47 -33
  220. package/dist/commands/packs/create.js.map +7 -1
  221. package/dist/commands/packs/fork.js +33 -19
  222. package/dist/commands/packs/fork.js.map +7 -1
  223. package/dist/commands/packs/get.js +54 -35
  224. package/dist/commands/packs/get.js.map +7 -1
  225. package/dist/commands/packs/list.js +64 -47
  226. package/dist/commands/packs/list.js.map +7 -1
  227. package/dist/commands/packs/remove-instruction.js +34 -20
  228. package/dist/commands/packs/remove-instruction.js.map +7 -1
  229. package/dist/commands/proxy/env.js +126 -116
  230. package/dist/commands/proxy/env.js.map +7 -1
  231. package/dist/commands/proxy/logs.js +83 -74
  232. package/dist/commands/proxy/logs.js.map +7 -1
  233. package/dist/commands/proxy/restart.js +34 -36
  234. package/dist/commands/proxy/restart.js.map +7 -1
  235. package/dist/commands/proxy/setup.js +432 -375
  236. package/dist/commands/proxy/setup.js.map +7 -1
  237. package/dist/commands/proxy/start.js +289 -289
  238. package/dist/commands/proxy/start.js.map +7 -1
  239. package/dist/commands/proxy/status.js +74 -64
  240. package/dist/commands/proxy/status.js.map +7 -1
  241. package/dist/commands/proxy/stop.js +81 -75
  242. package/dist/commands/proxy/stop.js.map +7 -1
  243. package/dist/commands/research/backfill.js +58 -0
  244. package/dist/commands/research/backfill.js.map +7 -0
  245. package/dist/commands/research/tail-transcript.js +69 -0
  246. package/dist/commands/research/tail-transcript.js.map +7 -0
  247. package/dist/commands/service/install.js +639 -405
  248. package/dist/commands/service/install.js.map +7 -1
  249. package/dist/commands/service/status.js +178 -111
  250. package/dist/commands/service/status.js.map +7 -1
  251. package/dist/commands/service/uninstall.js +85 -110
  252. package/dist/commands/service/uninstall.js.map +7 -1
  253. package/dist/commands/sessions/analyze.js +46 -25
  254. package/dist/commands/sessions/analyze.js.map +7 -1
  255. package/dist/commands/sessions/end.js +81 -79
  256. package/dist/commands/sessions/end.js.map +7 -1
  257. package/dist/commands/sessions/import.js +44 -27
  258. package/dist/commands/sessions/import.js.map +7 -1
  259. package/dist/commands/sessions/list.js +46 -33
  260. package/dist/commands/sessions/list.js.map +7 -1
  261. package/dist/commands/sessions/start.js +88 -87
  262. package/dist/commands/sessions/start.js.map +7 -1
  263. package/dist/commands/signals/report.js +42 -34
  264. package/dist/commands/signals/report.js.map +7 -1
  265. package/dist/commands/skills/export-approved.js +44 -30
  266. package/dist/commands/skills/export-approved.js.map +7 -1
  267. package/dist/commands/skills/install.js +99 -84
  268. package/dist/commands/skills/install.js.map +7 -1
  269. package/dist/commands/skills/list.js +59 -42
  270. package/dist/commands/skills/list.js.map +7 -1
  271. package/dist/commands/skills/publish.js +95 -78
  272. package/dist/commands/skills/publish.js.map +7 -1
  273. package/dist/commands/skills/search.js +68 -53
  274. package/dist/commands/skills/search.js.map +7 -1
  275. package/dist/commands/skills/update.js +52 -39
  276. package/dist/commands/skills/update.js.map +7 -1
  277. package/dist/commands/suggestions/accept.js +82 -59
  278. package/dist/commands/suggestions/accept.js.map +7 -1
  279. package/dist/commands/suggestions/dismiss.js +44 -26
  280. package/dist/commands/suggestions/dismiss.js.map +7 -1
  281. package/dist/commands/suggestions/list.js +59 -39
  282. package/dist/commands/suggestions/list.js.map +7 -1
  283. package/dist/commands/suggestions/refresh.js +26 -11
  284. package/dist/commands/suggestions/refresh.js.map +7 -1
  285. package/dist/cursor-BGQJ4CWI.js +134 -0
  286. package/dist/cursor-BGQJ4CWI.js.map +7 -0
  287. package/dist/dashboard/Dashboard.js +229 -126
  288. package/dist/dashboard/Dashboard.js.map +7 -1
  289. package/dist/dashboard/data.js +13 -137
  290. package/dist/dashboard/data.js.map +7 -1
  291. package/dist/dashboard/launcher/ActiveJobsList.js +10 -0
  292. package/dist/dashboard/launcher/ActiveJobsList.js.map +7 -0
  293. package/dist/dashboard/launcher/LauncherOverlay.js +14 -0
  294. package/dist/dashboard/launcher/LauncherOverlay.js.map +7 -0
  295. package/dist/dashboard/launcher/NewLaunchForm.js +10 -0
  296. package/dist/dashboard/launcher/NewLaunchForm.js.map +7 -0
  297. package/dist/dashboard/launcher/api.js +14 -0
  298. package/dist/dashboard/launcher/api.js.map +7 -0
  299. package/dist/dashboard/launcher/tool-labels.js +10 -0
  300. package/dist/dashboard/launcher/tool-labels.js.map +7 -0
  301. package/dist/dashboard/launcher/types.js +1 -0
  302. package/dist/dashboard/launcher/types.js.map +7 -0
  303. package/dist/dashboard/launcher/useLaunchJobs.js +9 -0
  304. package/dist/dashboard/launcher/useLaunchJobs.js.map +7 -0
  305. package/dist/dashboard/panels/friction.js +10 -22
  306. package/dist/dashboard/panels/friction.js.map +7 -1
  307. package/dist/dashboard/panels/insights.js +10 -109
  308. package/dist/dashboard/panels/insights.js.map +7 -1
  309. package/dist/dashboard/panels/instructions.js +10 -17
  310. package/dist/dashboard/panels/instructions.js.map +7 -1
  311. package/dist/dashboard/panels/outcomes.js +9 -28
  312. package/dist/dashboard/panels/outcomes.js.map +7 -1
  313. package/dist/dashboard/panels/overview.js +10 -20
  314. package/dist/dashboard/panels/overview.js.map +7 -1
  315. package/dist/dashboard/panels/shared.js +18 -61
  316. package/dist/dashboard/panels/shared.js.map +7 -1
  317. package/dist/dashboard/types.js +23 -26
  318. package/dist/dashboard/types.js.map +7 -1
  319. package/dist/dist-CSUYFYKI.js +52 -0
  320. package/dist/dist-CSUYFYKI.js.map +7 -0
  321. package/dist/index.js +8 -2
  322. package/dist/index.js.map +7 -1
  323. package/dist/lib/active-org-refresh.js +15 -108
  324. package/dist/lib/active-org-refresh.js.map +7 -1
  325. package/dist/lib/active-org.js +15 -95
  326. package/dist/lib/active-org.js.map +7 -1
  327. package/dist/lib/agent-loop.js +44 -0
  328. package/dist/lib/agent-loop.js.map +7 -0
  329. package/dist/lib/antigravity-transcript.js +22 -0
  330. package/dist/lib/antigravity-transcript.js.map +7 -0
  331. package/dist/lib/api-client.js +21 -92
  332. package/dist/lib/api-client.js.map +7 -1
  333. package/dist/lib/auth.js +26 -137
  334. package/dist/lib/auth.js.map +7 -1
  335. package/dist/lib/detect-languages.js +8 -113
  336. package/dist/lib/detect-languages.js.map +7 -1
  337. package/dist/lib/detect-tmux.js +9 -0
  338. package/dist/lib/detect-tmux.js.map +7 -0
  339. package/dist/lib/eval-analyzer.js +9 -89
  340. package/dist/lib/eval-analyzer.js.map +7 -1
  341. package/dist/lib/eval-benchmark.js +12 -92
  342. package/dist/lib/eval-benchmark.js.map +7 -1
  343. package/dist/lib/eval-conversation-handler.js +13 -200
  344. package/dist/lib/eval-conversation-handler.js.map +7 -1
  345. package/dist/lib/eval-executor.js +8 -83
  346. package/dist/lib/eval-executor.js.map +7 -1
  347. package/dist/lib/eval-grader.js +9 -123
  348. package/dist/lib/eval-grader.js.map +7 -1
  349. package/dist/lib/eval-meta-judge.js +9 -116
  350. package/dist/lib/eval-meta-judge.js.map +7 -1
  351. package/dist/lib/eval-trigger-tester.js +11 -96
  352. package/dist/lib/eval-trigger-tester.js.map +7 -1
  353. package/dist/lib/eval-worktree.js +8 -87
  354. package/dist/lib/eval-worktree.js.map +7 -1
  355. package/dist/lib/gateway-entry.js +20 -18
  356. package/dist/lib/gateway-entry.js.map +7 -1
  357. package/dist/lib/gateway-lifecycle.js +22 -97
  358. package/dist/lib/gateway-lifecycle.js.map +7 -1
  359. package/dist/lib/gateway.js +12 -216
  360. package/dist/lib/gateway.js.map +7 -1
  361. package/dist/lib/handlers/cron-close-stale-sessions.js +18 -7
  362. package/dist/lib/handlers/cron-close-stale-sessions.js.map +7 -1
  363. package/dist/lib/handlers/cron-data-integrity-audit.js +21 -15
  364. package/dist/lib/handlers/cron-data-integrity-audit.js.map +7 -1
  365. package/dist/lib/handlers/cron-refresh-skills.js +7 -90
  366. package/dist/lib/handlers/cron-refresh-skills.js.map +7 -1
  367. package/dist/lib/handlers/cron-suggest-instructions.js +14 -158
  368. package/dist/lib/handlers/cron-suggest-instructions.js.map +7 -1
  369. package/dist/lib/handlers/process-announcement.js +11 -0
  370. package/dist/lib/handlers/process-announcement.js.map +7 -0
  371. package/dist/lib/handlers/process-changelog.js +11 -0
  372. package/dist/lib/handlers/process-changelog.js.map +7 -0
  373. package/dist/lib/handlers/process-conversation.js +14 -35
  374. package/dist/lib/handlers/process-conversation.js.map +7 -1
  375. package/dist/lib/handlers/process-eval.js +15 -207
  376. package/dist/lib/handlers/process-eval.js.map +7 -1
  377. package/dist/lib/handlers/process-insights.js +14 -300
  378. package/dist/lib/handlers/process-insights.js.map +7 -1
  379. package/dist/lib/handlers/process-launch.js +16 -41
  380. package/dist/lib/handlers/process-launch.js.map +7 -1
  381. package/dist/lib/handlers/process-run-cleanup.js +13 -0
  382. package/dist/lib/handlers/process-run-cleanup.js.map +7 -0
  383. package/dist/lib/handlers/process-send-message.js +10 -0
  384. package/dist/lib/handlers/process-send-message.js.map +7 -0
  385. package/dist/lib/handlers/process-session-goal.js +11 -0
  386. package/dist/lib/handlers/process-session-goal.js.map +7 -0
  387. package/dist/lib/hooks-config.js +52 -544
  388. package/dist/lib/hooks-config.js.map +7 -1
  389. package/dist/lib/insights-prompts.js +12 -145
  390. package/dist/lib/insights-prompts.js.map +7 -1
  391. package/dist/lib/job-helpers.js +1 -0
  392. package/dist/lib/job-helpers.js.map +7 -0
  393. package/dist/lib/llm-client.js +16 -274
  394. package/dist/lib/llm-client.js.map +7 -1
  395. package/dist/lib/manual-tasks.js +22 -0
  396. package/dist/lib/manual-tasks.js.map +7 -0
  397. package/dist/lib/output.js +12 -36
  398. package/dist/lib/output.js.map +7 -1
  399. package/dist/lib/permanent-job-error.js +10 -23
  400. package/dist/lib/permanent-job-error.js.map +7 -1
  401. package/dist/lib/provider-aggregator.js +57 -55
  402. package/dist/lib/provider-aggregator.js.map +7 -1
  403. package/dist/lib/research-client.js +12 -0
  404. package/dist/lib/research-client.js.map +7 -0
  405. package/dist/lib/skills-loader.js +8 -51
  406. package/dist/lib/skills-loader.js.map +7 -1
  407. package/dist/lib/statusline-shim.js +16 -0
  408. package/dist/lib/statusline-shim.js.map +7 -0
  409. package/dist/lib/terminal-target-heartbeat.js +15 -0
  410. package/dist/lib/terminal-target-heartbeat.js.map +7 -0
  411. package/dist/lib/tmux.js +16 -0
  412. package/dist/lib/tmux.js.map +7 -0
  413. package/dist/lib/transcript-rate-limit-watcher.js +22 -0
  414. package/dist/lib/transcript-rate-limit-watcher.js.map +7 -0
  415. package/dist/lib/types.js +8 -7
  416. package/dist/lib/types.js.map +7 -1
  417. package/dist/lib/version-check.js +10 -106
  418. package/dist/lib/version-check.js.map +7 -1
  419. package/dist/lib/which.js +8 -0
  420. package/dist/lib/which.js.map +7 -0
  421. package/dist/lib/worktree.js +17 -0
  422. package/dist/lib/worktree.js.map +7 -0
  423. package/dist/opencode-IQ7X5YMJ.js +190 -0
  424. package/dist/opencode-IQ7X5YMJ.js.map +7 -0
  425. package/oclif.manifest.json +299 -66
  426. package/package.json +28 -10
  427. package/dist/base-command.d.ts +0 -12
  428. package/dist/base-command.d.ts.map +0 -1
  429. package/dist/commands/auth/create-key.d.ts +0 -11
  430. package/dist/commands/auth/create-key.d.ts.map +0 -1
  431. package/dist/commands/auth/login.d.ts +0 -11
  432. package/dist/commands/auth/login.d.ts.map +0 -1
  433. package/dist/commands/auth/logout.d.ts +0 -7
  434. package/dist/commands/auth/logout.d.ts.map +0 -1
  435. package/dist/commands/auth/revoke-key.d.ts +0 -10
  436. package/dist/commands/auth/revoke-key.d.ts.map +0 -1
  437. package/dist/commands/auth/status.d.ts +0 -7
  438. package/dist/commands/auth/status.d.ts.map +0 -1
  439. package/dist/commands/catalog/index.d.ts +0 -11
  440. package/dist/commands/catalog/index.d.ts.map +0 -1
  441. package/dist/commands/catalog/recommend.d.ts +0 -9
  442. package/dist/commands/catalog/recommend.d.ts.map +0 -1
  443. package/dist/commands/convert.d.ts +0 -15
  444. package/dist/commands/convert.d.ts.map +0 -1
  445. package/dist/commands/converters.d.ts +0 -12
  446. package/dist/commands/converters.d.ts.map +0 -1
  447. package/dist/commands/crons/list.d.ts +0 -7
  448. package/dist/commands/crons/list.d.ts.map +0 -1
  449. package/dist/commands/crons/run.d.ts +0 -13
  450. package/dist/commands/crons/run.d.ts.map +0 -1
  451. package/dist/commands/dashboard.d.ts +0 -10
  452. package/dist/commands/dashboard.d.ts.map +0 -1
  453. package/dist/commands/eval-targets/create.d.ts +0 -14
  454. package/dist/commands/eval-targets/create.d.ts.map +0 -1
  455. package/dist/commands/eval-targets/list.d.ts +0 -10
  456. package/dist/commands/eval-targets/list.d.ts.map +0 -1
  457. package/dist/commands/evals/benchmark.d.ts +0 -13
  458. package/dist/commands/evals/benchmark.d.ts.map +0 -1
  459. package/dist/commands/evals/compare.d.ts +0 -15
  460. package/dist/commands/evals/compare.d.ts.map +0 -1
  461. package/dist/commands/evals/create.d.ts +0 -17
  462. package/dist/commands/evals/create.d.ts.map +0 -1
  463. package/dist/commands/evals/listen.d.ts +0 -37
  464. package/dist/commands/evals/listen.d.ts.map +0 -1
  465. package/dist/commands/evals/listen.js +0 -188
  466. package/dist/commands/evals/listen.js.map +0 -1
  467. package/dist/commands/evals/listen.test.d.ts +0 -2
  468. package/dist/commands/evals/listen.test.d.ts.map +0 -1
  469. package/dist/commands/evals/listen.test.js +0 -48
  470. package/dist/commands/evals/listen.test.js.map +0 -1
  471. package/dist/commands/evals/optimize-description.d.ts +0 -22
  472. package/dist/commands/evals/optimize-description.d.ts.map +0 -1
  473. package/dist/commands/evals/optimize.d.ts +0 -22
  474. package/dist/commands/evals/optimize.d.ts.map +0 -1
  475. package/dist/commands/evals/run.d.ts +0 -21
  476. package/dist/commands/evals/run.d.ts.map +0 -1
  477. package/dist/commands/gateway/ensure.d.ts +0 -7
  478. package/dist/commands/gateway/ensure.d.ts.map +0 -1
  479. package/dist/commands/hooks/install.d.ts +0 -16
  480. package/dist/commands/hooks/install.d.ts.map +0 -1
  481. package/dist/commands/hooks/run.d.ts +0 -11
  482. package/dist/commands/hooks/run.d.ts.map +0 -1
  483. package/dist/commands/hooks/uninstall.d.ts +0 -7
  484. package/dist/commands/hooks/uninstall.d.ts.map +0 -1
  485. package/dist/commands/import.d.ts +0 -17
  486. package/dist/commands/import.d.ts.map +0 -1
  487. package/dist/commands/instructions/create.d.ts +0 -17
  488. package/dist/commands/instructions/create.d.ts.map +0 -1
  489. package/dist/commands/instructions/delete.d.ts +0 -13
  490. package/dist/commands/instructions/delete.d.ts.map +0 -1
  491. package/dist/commands/instructions/fork.d.ts +0 -10
  492. package/dist/commands/instructions/fork.d.ts.map +0 -1
  493. package/dist/commands/instructions/get.d.ts +0 -15
  494. package/dist/commands/instructions/get.d.ts.map +0 -1
  495. package/dist/commands/instructions/list.d.ts +0 -12
  496. package/dist/commands/instructions/list.d.ts.map +0 -1
  497. package/dist/commands/instructions/promote.d.ts +0 -14
  498. package/dist/commands/instructions/promote.d.ts.map +0 -1
  499. package/dist/commands/instructions/pull.d.ts +0 -9
  500. package/dist/commands/instructions/pull.d.ts.map +0 -1
  501. package/dist/commands/instructions/upstream.d.ts +0 -9
  502. package/dist/commands/instructions/upstream.d.ts.map +0 -1
  503. package/dist/commands/instructions/versions.d.ts +0 -12
  504. package/dist/commands/instructions/versions.d.ts.map +0 -1
  505. package/dist/commands/org/current.d.ts +0 -7
  506. package/dist/commands/org/current.d.ts.map +0 -1
  507. package/dist/commands/org/list.d.ts +0 -7
  508. package/dist/commands/org/list.d.ts.map +0 -1
  509. package/dist/commands/org/switch.d.ts +0 -13
  510. package/dist/commands/org/switch.d.ts.map +0 -1
  511. package/dist/commands/packs/add-instruction.d.ts +0 -11
  512. package/dist/commands/packs/add-instruction.d.ts.map +0 -1
  513. package/dist/commands/packs/apply.d.ts +0 -13
  514. package/dist/commands/packs/apply.d.ts.map +0 -1
  515. package/dist/commands/packs/create.d.ts +0 -13
  516. package/dist/commands/packs/create.d.ts.map +0 -1
  517. package/dist/commands/packs/fork.d.ts +0 -10
  518. package/dist/commands/packs/fork.d.ts.map +0 -1
  519. package/dist/commands/packs/get.d.ts +0 -10
  520. package/dist/commands/packs/get.d.ts.map +0 -1
  521. package/dist/commands/packs/list.d.ts +0 -22
  522. package/dist/commands/packs/list.d.ts.map +0 -1
  523. package/dist/commands/packs/remove-instruction.d.ts +0 -11
  524. package/dist/commands/packs/remove-instruction.d.ts.map +0 -1
  525. package/dist/commands/proxy/env.d.ts +0 -14
  526. package/dist/commands/proxy/env.d.ts.map +0 -1
  527. package/dist/commands/proxy/logs.d.ts +0 -11
  528. package/dist/commands/proxy/logs.d.ts.map +0 -1
  529. package/dist/commands/proxy/restart.d.ts +0 -11
  530. package/dist/commands/proxy/restart.d.ts.map +0 -1
  531. package/dist/commands/proxy/setup.d.ts +0 -23
  532. package/dist/commands/proxy/setup.d.ts.map +0 -1
  533. package/dist/commands/proxy/start.d.ts +0 -17
  534. package/dist/commands/proxy/start.d.ts.map +0 -1
  535. package/dist/commands/proxy/status.d.ts +0 -7
  536. package/dist/commands/proxy/status.d.ts.map +0 -1
  537. package/dist/commands/proxy/stop.d.ts +0 -8
  538. package/dist/commands/proxy/stop.d.ts.map +0 -1
  539. package/dist/commands/service/install.d.ts +0 -33
  540. package/dist/commands/service/install.d.ts.map +0 -1
  541. package/dist/commands/service/install.test.d.ts +0 -2
  542. package/dist/commands/service/install.test.d.ts.map +0 -1
  543. package/dist/commands/service/install.test.js +0 -345
  544. package/dist/commands/service/install.test.js.map +0 -1
  545. package/dist/commands/service/status.d.ts +0 -6
  546. package/dist/commands/service/status.d.ts.map +0 -1
  547. package/dist/commands/service/uninstall.d.ts +0 -6
  548. package/dist/commands/service/uninstall.d.ts.map +0 -1
  549. package/dist/commands/sessions/analyze.d.ts +0 -10
  550. package/dist/commands/sessions/analyze.d.ts.map +0 -1
  551. package/dist/commands/sessions/end.d.ts +0 -9
  552. package/dist/commands/sessions/end.d.ts.map +0 -1
  553. package/dist/commands/sessions/import.d.ts +0 -13
  554. package/dist/commands/sessions/import.d.ts.map +0 -1
  555. package/dist/commands/sessions/list.d.ts +0 -11
  556. package/dist/commands/sessions/list.d.ts.map +0 -1
  557. package/dist/commands/sessions/start.d.ts +0 -11
  558. package/dist/commands/sessions/start.d.ts.map +0 -1
  559. package/dist/commands/signals/report.d.ts +0 -10
  560. package/dist/commands/signals/report.d.ts.map +0 -1
  561. package/dist/commands/signals/report.test.d.ts +0 -2
  562. package/dist/commands/signals/report.test.d.ts.map +0 -1
  563. package/dist/commands/signals/report.test.js +0 -65
  564. package/dist/commands/signals/report.test.js.map +0 -1
  565. package/dist/commands/skills/export-approved.d.ts +0 -10
  566. package/dist/commands/skills/export-approved.d.ts.map +0 -1
  567. package/dist/commands/skills/install.d.ts +0 -15
  568. package/dist/commands/skills/install.d.ts.map +0 -1
  569. package/dist/commands/skills/list.d.ts +0 -11
  570. package/dist/commands/skills/list.d.ts.map +0 -1
  571. package/dist/commands/skills/publish.d.ts +0 -17
  572. package/dist/commands/skills/publish.d.ts.map +0 -1
  573. package/dist/commands/skills/search.d.ts +0 -17
  574. package/dist/commands/skills/search.d.ts.map +0 -1
  575. package/dist/commands/skills/update.d.ts +0 -10
  576. package/dist/commands/skills/update.d.ts.map +0 -1
  577. package/dist/commands/suggestions/accept.d.ts +0 -16
  578. package/dist/commands/suggestions/accept.d.ts.map +0 -1
  579. package/dist/commands/suggestions/accept.test.d.ts +0 -2
  580. package/dist/commands/suggestions/accept.test.d.ts.map +0 -1
  581. package/dist/commands/suggestions/accept.test.js +0 -52
  582. package/dist/commands/suggestions/accept.test.js.map +0 -1
  583. package/dist/commands/suggestions/dismiss.d.ts +0 -10
  584. package/dist/commands/suggestions/dismiss.d.ts.map +0 -1
  585. package/dist/commands/suggestions/list.d.ts +0 -10
  586. package/dist/commands/suggestions/list.d.ts.map +0 -1
  587. package/dist/commands/suggestions/refresh.d.ts +0 -7
  588. package/dist/commands/suggestions/refresh.d.ts.map +0 -1
  589. package/dist/dashboard/Dashboard.d.ts +0 -3
  590. package/dist/dashboard/Dashboard.d.ts.map +0 -1
  591. package/dist/dashboard/data.d.ts +0 -11
  592. package/dist/dashboard/data.d.ts.map +0 -1
  593. package/dist/dashboard/panels/friction.d.ts +0 -7
  594. package/dist/dashboard/panels/friction.d.ts.map +0 -1
  595. package/dist/dashboard/panels/insights.d.ts +0 -8
  596. package/dist/dashboard/panels/insights.d.ts.map +0 -1
  597. package/dist/dashboard/panels/instructions.d.ts +0 -9
  598. package/dist/dashboard/panels/instructions.d.ts.map +0 -1
  599. package/dist/dashboard/panels/outcomes.d.ts +0 -7
  600. package/dist/dashboard/panels/outcomes.d.ts.map +0 -1
  601. package/dist/dashboard/panels/overview.d.ts +0 -8
  602. package/dist/dashboard/panels/overview.d.ts.map +0 -1
  603. package/dist/dashboard/panels/shared.d.ts +0 -17
  604. package/dist/dashboard/panels/shared.d.ts.map +0 -1
  605. package/dist/dashboard/types.d.ts +0 -80
  606. package/dist/dashboard/types.d.ts.map +0 -1
  607. package/dist/index.d.ts +0 -2
  608. package/dist/index.d.ts.map +0 -1
  609. package/dist/lib/active-org-refresh.d.ts +0 -22
  610. package/dist/lib/active-org-refresh.d.ts.map +0 -1
  611. package/dist/lib/active-org-refresh.test.d.ts +0 -2
  612. package/dist/lib/active-org-refresh.test.d.ts.map +0 -1
  613. package/dist/lib/active-org-refresh.test.js +0 -190
  614. package/dist/lib/active-org-refresh.test.js.map +0 -1
  615. package/dist/lib/active-org.d.ts +0 -43
  616. package/dist/lib/active-org.d.ts.map +0 -1
  617. package/dist/lib/active-org.test.d.ts +0 -2
  618. package/dist/lib/active-org.test.d.ts.map +0 -1
  619. package/dist/lib/active-org.test.js +0 -147
  620. package/dist/lib/active-org.test.js.map +0 -1
  621. package/dist/lib/api-client.d.ts +0 -17
  622. package/dist/lib/api-client.d.ts.map +0 -1
  623. package/dist/lib/api-client.test.d.ts +0 -2
  624. package/dist/lib/api-client.test.d.ts.map +0 -1
  625. package/dist/lib/api-client.test.js +0 -161
  626. package/dist/lib/api-client.test.js.map +0 -1
  627. package/dist/lib/auth.d.ts +0 -27
  628. package/dist/lib/auth.d.ts.map +0 -1
  629. package/dist/lib/auth.test.d.ts +0 -2
  630. package/dist/lib/auth.test.d.ts.map +0 -1
  631. package/dist/lib/auth.test.js +0 -110
  632. package/dist/lib/auth.test.js.map +0 -1
  633. package/dist/lib/cron-registry.d.ts +0 -47
  634. package/dist/lib/cron-registry.d.ts.map +0 -1
  635. package/dist/lib/cron-registry.js +0 -102
  636. package/dist/lib/cron-registry.js.map +0 -1
  637. package/dist/lib/cron-registry.test.d.ts +0 -2
  638. package/dist/lib/cron-registry.test.d.ts.map +0 -1
  639. package/dist/lib/cron-registry.test.js +0 -136
  640. package/dist/lib/cron-registry.test.js.map +0 -1
  641. package/dist/lib/cron-runner.d.ts +0 -16
  642. package/dist/lib/cron-runner.d.ts.map +0 -1
  643. package/dist/lib/cron-runner.js +0 -68
  644. package/dist/lib/cron-runner.js.map +0 -1
  645. package/dist/lib/detect-languages.d.ts +0 -7
  646. package/dist/lib/detect-languages.d.ts.map +0 -1
  647. package/dist/lib/detect-languages.test.d.ts +0 -2
  648. package/dist/lib/detect-languages.test.d.ts.map +0 -1
  649. package/dist/lib/detect-languages.test.js +0 -29
  650. package/dist/lib/detect-languages.test.js.map +0 -1
  651. package/dist/lib/eval-analyzer.d.ts +0 -23
  652. package/dist/lib/eval-analyzer.d.ts.map +0 -1
  653. package/dist/lib/eval-benchmark.d.ts +0 -17
  654. package/dist/lib/eval-benchmark.d.ts.map +0 -1
  655. package/dist/lib/eval-conversation-handler.d.ts +0 -9
  656. package/dist/lib/eval-conversation-handler.d.ts.map +0 -1
  657. package/dist/lib/eval-executor.d.ts +0 -21
  658. package/dist/lib/eval-executor.d.ts.map +0 -1
  659. package/dist/lib/eval-executor.test.d.ts +0 -2
  660. package/dist/lib/eval-executor.test.d.ts.map +0 -1
  661. package/dist/lib/eval-executor.test.js +0 -8
  662. package/dist/lib/eval-executor.test.js.map +0 -1
  663. package/dist/lib/eval-grader.d.ts +0 -38
  664. package/dist/lib/eval-grader.d.ts.map +0 -1
  665. package/dist/lib/eval-grader.test.d.ts +0 -2
  666. package/dist/lib/eval-grader.test.d.ts.map +0 -1
  667. package/dist/lib/eval-grader.test.js +0 -8
  668. package/dist/lib/eval-grader.test.js.map +0 -1
  669. package/dist/lib/eval-meta-judge.d.ts +0 -28
  670. package/dist/lib/eval-meta-judge.d.ts.map +0 -1
  671. package/dist/lib/eval-trigger-tester.d.ts +0 -19
  672. package/dist/lib/eval-trigger-tester.d.ts.map +0 -1
  673. package/dist/lib/eval-worktree.d.ts +0 -11
  674. package/dist/lib/eval-worktree.d.ts.map +0 -1
  675. package/dist/lib/eval-worktree.test.d.ts +0 -2
  676. package/dist/lib/eval-worktree.test.d.ts.map +0 -1
  677. package/dist/lib/eval-worktree.test.js +0 -68
  678. package/dist/lib/eval-worktree.test.js.map +0 -1
  679. package/dist/lib/gateway-entry.d.ts +0 -3
  680. package/dist/lib/gateway-entry.d.ts.map +0 -1
  681. package/dist/lib/gateway-lifecycle.d.ts +0 -9
  682. package/dist/lib/gateway-lifecycle.d.ts.map +0 -1
  683. package/dist/lib/gateway.d.ts +0 -11
  684. package/dist/lib/gateway.d.ts.map +0 -1
  685. package/dist/lib/graphile-worker-runner.d.ts +0 -124
  686. package/dist/lib/graphile-worker-runner.d.ts.map +0 -1
  687. package/dist/lib/graphile-worker-runner.js +0 -526
  688. package/dist/lib/graphile-worker-runner.js.map +0 -1
  689. package/dist/lib/graphile-worker-runner.test.d.ts +0 -2
  690. package/dist/lib/graphile-worker-runner.test.d.ts.map +0 -1
  691. package/dist/lib/graphile-worker-runner.test.js +0 -153
  692. package/dist/lib/graphile-worker-runner.test.js.map +0 -1
  693. package/dist/lib/handlers/cron-close-stale-sessions.d.ts +0 -3
  694. package/dist/lib/handlers/cron-close-stale-sessions.d.ts.map +0 -1
  695. package/dist/lib/handlers/cron-data-integrity-audit.d.ts +0 -3
  696. package/dist/lib/handlers/cron-data-integrity-audit.d.ts.map +0 -1
  697. package/dist/lib/handlers/cron-refresh-skills.d.ts +0 -3
  698. package/dist/lib/handlers/cron-refresh-skills.d.ts.map +0 -1
  699. package/dist/lib/handlers/cron-refresh-skills.test.d.ts +0 -2
  700. package/dist/lib/handlers/cron-refresh-skills.test.d.ts.map +0 -1
  701. package/dist/lib/handlers/cron-refresh-skills.test.js +0 -114
  702. package/dist/lib/handlers/cron-refresh-skills.test.js.map +0 -1
  703. package/dist/lib/handlers/cron-regenerate-insights.d.ts +0 -3
  704. package/dist/lib/handlers/cron-regenerate-insights.d.ts.map +0 -1
  705. package/dist/lib/handlers/cron-regenerate-insights.js +0 -6
  706. package/dist/lib/handlers/cron-regenerate-insights.js.map +0 -1
  707. package/dist/lib/handlers/cron-suggest-instructions.d.ts +0 -3
  708. package/dist/lib/handlers/cron-suggest-instructions.d.ts.map +0 -1
  709. package/dist/lib/handlers/cron-suggest-instructions.test.d.ts +0 -2
  710. package/dist/lib/handlers/cron-suggest-instructions.test.d.ts.map +0 -1
  711. package/dist/lib/handlers/cron-suggest-instructions.test.js +0 -80
  712. package/dist/lib/handlers/cron-suggest-instructions.test.js.map +0 -1
  713. package/dist/lib/handlers/process-conversation.d.ts +0 -35
  714. package/dist/lib/handlers/process-conversation.d.ts.map +0 -1
  715. package/dist/lib/handlers/process-eval.d.ts +0 -32
  716. package/dist/lib/handlers/process-eval.d.ts.map +0 -1
  717. package/dist/lib/handlers/process-insights.d.ts +0 -39
  718. package/dist/lib/handlers/process-insights.d.ts.map +0 -1
  719. package/dist/lib/handlers/process-launch.d.ts +0 -29
  720. package/dist/lib/handlers/process-launch.d.ts.map +0 -1
  721. package/dist/lib/hooks-config.d.ts +0 -119
  722. package/dist/lib/hooks-config.d.ts.map +0 -1
  723. package/dist/lib/hooks-config.test.d.ts +0 -2
  724. package/dist/lib/hooks-config.test.d.ts.map +0 -1
  725. package/dist/lib/hooks-config.test.js +0 -231
  726. package/dist/lib/hooks-config.test.js.map +0 -1
  727. package/dist/lib/insights-prompts.d.ts +0 -13
  728. package/dist/lib/insights-prompts.d.ts.map +0 -1
  729. package/dist/lib/llm-client.d.ts +0 -26
  730. package/dist/lib/llm-client.d.ts.map +0 -1
  731. package/dist/lib/llm-client.test.d.ts +0 -2
  732. package/dist/lib/llm-client.test.d.ts.map +0 -1
  733. package/dist/lib/llm-client.test.js +0 -62
  734. package/dist/lib/llm-client.test.js.map +0 -1
  735. package/dist/lib/mirror-writer-db.d.ts +0 -12
  736. package/dist/lib/mirror-writer-db.d.ts.map +0 -1
  737. package/dist/lib/mirror-writer-db.js +0 -51
  738. package/dist/lib/mirror-writer-db.js.map +0 -1
  739. package/dist/lib/mirror-writer.d.ts +0 -35
  740. package/dist/lib/mirror-writer.d.ts.map +0 -1
  741. package/dist/lib/mirror-writer.js +0 -27
  742. package/dist/lib/mirror-writer.js.map +0 -1
  743. package/dist/lib/mirror-writer.test.d.ts +0 -2
  744. package/dist/lib/mirror-writer.test.d.ts.map +0 -1
  745. package/dist/lib/mirror-writer.test.js +0 -47
  746. package/dist/lib/mirror-writer.test.js.map +0 -1
  747. package/dist/lib/output.d.ts +0 -4
  748. package/dist/lib/output.d.ts.map +0 -1
  749. package/dist/lib/output.test.d.ts +0 -2
  750. package/dist/lib/output.test.d.ts.map +0 -1
  751. package/dist/lib/output.test.js +0 -71
  752. package/dist/lib/output.test.js.map +0 -1
  753. package/dist/lib/permanent-job-error.d.ts +0 -17
  754. package/dist/lib/permanent-job-error.d.ts.map +0 -1
  755. package/dist/lib/permanent-job-error.test.d.ts +0 -2
  756. package/dist/lib/permanent-job-error.test.d.ts.map +0 -1
  757. package/dist/lib/permanent-job-error.test.js +0 -29
  758. package/dist/lib/permanent-job-error.test.js.map +0 -1
  759. package/dist/lib/provider-aggregator.d.ts +0 -24
  760. package/dist/lib/provider-aggregator.d.ts.map +0 -1
  761. package/dist/lib/provider-aggregator.test.d.ts +0 -2
  762. package/dist/lib/provider-aggregator.test.d.ts.map +0 -1
  763. package/dist/lib/provider-aggregator.test.js +0 -103
  764. package/dist/lib/provider-aggregator.test.js.map +0 -1
  765. package/dist/lib/skills-loader.d.ts +0 -6
  766. package/dist/lib/skills-loader.d.ts.map +0 -1
  767. package/dist/lib/types.d.ts +0 -48
  768. package/dist/lib/types.d.ts.map +0 -1
  769. package/dist/lib/version-check.d.ts +0 -11
  770. package/dist/lib/version-check.d.ts.map +0 -1
  771. package/dist/test-helpers.d.ts +0 -58
  772. package/dist/test-helpers.d.ts.map +0 -1
  773. package/dist/test-helpers.js +0 -58
  774. package/dist/test-helpers.js.map +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/dashboard/panels/friction.tsx"],
4
+ "sourcesContent": ["import React from 'react';\nimport { Text } from 'ink';\nimport { ORANGE, RED, DIM } from '../types.js';\nimport type { ApiInsights } from '../types.js';\nimport { Panel, HBar, fit, friendlyLabel } from './shared.js';\n\nexport function FrictionPanel({ api, width, barWidth }: {\n api: ApiInsights | null; width: number; barWidth: number;\n}) {\n if (!api) {\n return (\n <Panel title=\"Friction Points\" color={RED} width={width}>\n <Text dimColor>API offline \u2014 no friction data</Text>\n </Panel>\n );\n }\n\n const friction = api.friction ?? {};\n const sorted = Object.entries(friction).sort(([, a], [, b]) => b - a);\n if (sorted.length === 0) {\n return (\n <Panel title=\"Friction Points\" color={ORANGE} width={width}>\n <Text dimColor>No friction detected \u2014 nice!</Text>\n </Panel>\n );\n }\n\n const max = sorted[0][1];\n const total = sorted.reduce((s, [, v]) => s + v, 0);\n const nw = Math.max(8, width - barWidth - 20);\n\n return (\n <Panel title={`Friction Points (${total} incidents)`} color={RED} width={width}>\n {sorted.map(([key, value]) => {\n const pct = total > 0 ? Math.round((value / total) * 100) : 0;\n return (\n <Text key={key} wrap=\"truncate-end\">\n <HBar value={value} max={max} width={barWidth} />\n <Text color={ORANGE}> {fit(friendlyLabel(key), nw)}</Text>\n <Text>{String(value).padStart(5)}</Text>\n <Text dimColor>{String(pct + '%').padStart(5)}</Text>\n </Text>\n );\n })}\n </Panel>\n );\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;AACA,SAAS,YAAY;AAWb,cA0BI,YA1BJ;AAND,SAAS,cAAc,EAAE,KAAK,OAAO,SAAS,GAElD;AACD,MAAI,CAAC,KAAK;AACR,WACE,oBAAC,SAAM,OAAM,mBAAkB,OAAO,KAAK,OACzC,8BAAC,QAAK,UAAQ,MAAC,iDAA8B,GAC/C;AAAA,EAEJ;AAEA,QAAM,WAAW,IAAI,YAAY,CAAC;AAClC,QAAM,SAAS,OAAO,QAAQ,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC;AACpE,MAAI,OAAO,WAAW,GAAG;AACvB,WACE,oBAAC,SAAM,OAAM,mBAAkB,OAAO,QAAQ,OAC5C,8BAAC,QAAK,UAAQ,MAAC,+CAA4B,GAC7C;AAAA,EAEJ;AAEA,QAAM,MAAM,OAAO,CAAC,EAAE,CAAC;AACvB,QAAM,QAAQ,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,GAAG,CAAC;AAClD,QAAM,KAAK,KAAK,IAAI,GAAG,QAAQ,WAAW,EAAE;AAE5C,SACE,oBAAC,SAAM,OAAO,oBAAoB,KAAK,eAAe,OAAO,KAAK,OAC/D,iBAAO,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC5B,UAAM,MAAM,QAAQ,IAAI,KAAK,MAAO,QAAQ,QAAS,GAAG,IAAI;AAC5D,WACE,qBAAC,QAAe,MAAK,gBACnB;AAAA,0BAAC,QAAK,OAAc,KAAU,OAAO,UAAU;AAAA,MAC/C,qBAAC,QAAK,OAAO,QAAQ;AAAA;AAAA,QAAE,IAAI,cAAc,GAAG,GAAG,EAAE;AAAA,SAAE;AAAA,MACnD,oBAAC,QAAM,iBAAO,KAAK,EAAE,SAAS,CAAC,GAAE;AAAA,MACjC,oBAAC,QAAK,UAAQ,MAAE,iBAAO,MAAM,GAAG,EAAE,SAAS,CAAC,GAAE;AAAA,SAJrC,GAKX;AAAA,EAEJ,CAAC,GACH;AAEJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,243 @@
1
+ import {
2
+ AT_A_GLANCE_PROMPT,
3
+ FACET_GENERATION_PROMPT,
4
+ RECOMMENDATION_PROMPTS
5
+ } from "./chunk-XZXS2W24.js";
6
+ import {
7
+ PermanentJobError
8
+ } from "./chunk-DGHWRQXL.js";
9
+ import {
10
+ detectLlmBackend,
11
+ runLlmPrompt,
12
+ runToolPrompt
13
+ } from "./chunk-FZKLLNDS.js";
14
+ import {
15
+ apiGet,
16
+ apiPatch,
17
+ apiPost
18
+ } from "./chunk-EJOI2ZGU.js";
19
+
20
+ // src/lib/handlers/process-insights.ts
21
+ async function processInsights(payload, helpers) {
22
+ const { mirrorId, projectPath, projectId, config } = payload;
23
+ const log = (msg) => helpers.logger.info(msg);
24
+ if (config?.sessionId) {
25
+ return processSessionAnalysisInline({ mirrorId, sessionId: config.sessionId }, log);
26
+ }
27
+ log(`Processing insights job ${mirrorId}...`);
28
+ await apiPatch(`/api/insights-jobs/${mirrorId}/progress`, {
29
+ status: "running",
30
+ progress: { step: "reading_data" }
31
+ });
32
+ try {
33
+ const { repaired } = await apiPost(
34
+ "/api/sessions/repair-analyzed-at",
35
+ {}
36
+ );
37
+ if (repaired > 0) {
38
+ log(` Repaired analyzed_at on ${repaired} orphan session(s).`);
39
+ }
40
+ } catch (repairErr) {
41
+ log(` Warning: analyzed_at repair failed: ${repairErr instanceof Error ? repairErr.message : String(repairErr)}`);
42
+ }
43
+ const data = await buildDataSummaryFromApi(projectPath, projectId);
44
+ if (!data) {
45
+ throw new PermanentJobError(
46
+ "No session data found \u2014 ensure sessions are captured and enriched."
47
+ );
48
+ }
49
+ log(` Found ${data.stats.sessions} sessions, generating recommendations...`);
50
+ const FACET_BATCH_SIZE = 20;
51
+ const FACET_HARD_CAP = 200;
52
+ if (detectLlmBackend() !== "none") {
53
+ let totalFaceted = 0;
54
+ try {
55
+ while (totalFaceted < FACET_HARD_CAP) {
56
+ const unfaceted = await apiGet(
57
+ `/api/sessions?hasAnalysis=false&limit=${FACET_BATCH_SIZE}`
58
+ );
59
+ if (unfaceted.length === 0) break;
60
+ log(` Generating facets for ${unfaceted.length} un-analyzed sessions (drained ${totalFaceted} so far)...`);
61
+ for (const session of unfaceted) {
62
+ if (totalFaceted >= FACET_HARD_CAP) break;
63
+ try {
64
+ const events = await apiGet(
65
+ `/api/sessions/${session.id}/events?limit=100`
66
+ );
67
+ if (events.length < 2) {
68
+ totalFaceted++;
69
+ continue;
70
+ }
71
+ const eventSummary = events.filter((e) => e.eventType === "user_message" || e.eventType === "human").map((e) => e.content?.slice(0, 200) ?? "").filter(Boolean).join("\n---\n");
72
+ if (!eventSummary) {
73
+ totalFaceted++;
74
+ continue;
75
+ }
76
+ const facets = await runLlmPrompt(FACET_GENERATION_PROMPT, eventSummary, 4096);
77
+ if (facets) {
78
+ const userMessageCount = events.filter(
79
+ (e) => e.eventType === "user_message" || e.eventType === "human"
80
+ ).length;
81
+ await apiPatch(`/api/sessions/${session.id}/enrich`, {
82
+ analysis: { source: "generated_facets", ...facets },
83
+ analyzedEventCount: events.length,
84
+ analyzedTurnCount: userMessageCount
85
+ });
86
+ log(` Generated facets for session ${session.id} (${session.tool})`);
87
+ }
88
+ totalFaceted++;
89
+ } catch (sessionErr) {
90
+ log(` Failed to generate facets for session ${session.id}: ${sessionErr instanceof Error ? sessionErr.message : String(sessionErr)}`);
91
+ totalFaceted++;
92
+ }
93
+ }
94
+ if (unfaceted.length < FACET_BATCH_SIZE) break;
95
+ }
96
+ } catch (facetErr) {
97
+ log(` Warning: facet generation failed after ${totalFaceted} sessions: ${facetErr instanceof Error ? facetErr.message : String(facetErr)}`);
98
+ }
99
+ }
100
+ const recommendations = {};
101
+ const totalPrompts = RECOMMENDATION_PROMPTS.length + 1;
102
+ for (let i = 0; i < RECOMMENDATION_PROMPTS.length; i++) {
103
+ const spec = RECOMMENDATION_PROMPTS[i];
104
+ log(` [${i + 1}/${totalPrompts}] Generating ${spec.name}...`);
105
+ try {
106
+ await apiPatch(`/api/insights-jobs/${mirrorId}/progress`, {
107
+ status: "running",
108
+ progress: {
109
+ step: spec.name,
110
+ current: i + 1,
111
+ total: totalPrompts,
112
+ partial: { ...recommendations }
113
+ }
114
+ });
115
+ } catch (patchErr) {
116
+ log(` Warning: progress update failed for ${spec.name}: ${patchErr instanceof Error ? patchErr.message : String(patchErr)}`);
117
+ }
118
+ log(` Running LLM prompt for ${spec.name}...`);
119
+ const result2 = await runLlmPrompt(spec.prompt, data.summary, spec.maxTokens);
120
+ if (result2) {
121
+ recommendations[spec.name] = result2;
122
+ log(` Got result for ${spec.name}`);
123
+ } else {
124
+ log(` No result for ${spec.name} (LLM returned null)`);
125
+ }
126
+ }
127
+ log(` [${totalPrompts}/${totalPrompts}] Generating at_a_glance...`);
128
+ await apiPatch(`/api/insights-jobs/${mirrorId}/progress`, {
129
+ status: "running",
130
+ progress: {
131
+ step: "at_a_glance",
132
+ current: totalPrompts,
133
+ total: totalPrompts,
134
+ partial: { ...recommendations }
135
+ }
136
+ });
137
+ const glanceData = [
138
+ data.summary,
139
+ recommendations.what_works ? `
140
+ ## What Works
141
+ ${JSON.stringify(recommendations.what_works)}` : "",
142
+ recommendations.friction_analysis ? `
143
+ ## Friction
144
+ ${JSON.stringify(recommendations.friction_analysis)}` : "",
145
+ recommendations.suggestions ? `
146
+ ## Suggestions
147
+ ${JSON.stringify(recommendations.suggestions)}` : "",
148
+ recommendations.on_the_horizon ? `
149
+ ## On the Horizon
150
+ ${JSON.stringify(recommendations.on_the_horizon)}` : ""
151
+ ].join("\n");
152
+ const glance = await runLlmPrompt(AT_A_GLANCE_PROMPT, glanceData, 8192);
153
+ if (glance) {
154
+ recommendations.at_a_glance = glance;
155
+ }
156
+ log(" Uploading results...");
157
+ log(` Done! Recommendations generated for job ${mirrorId}`);
158
+ const result = { recommendations };
159
+ await apiPatch(`/api/insights-jobs/${mirrorId}/state`, { result }).catch((err) => {
160
+ log(`result persist failed: ${err instanceof Error ? err.message : String(err)}`);
161
+ });
162
+ return result;
163
+ }
164
+ async function processSessionAnalysisInline(args, log) {
165
+ const { mirrorId, sessionId } = args;
166
+ log(`Analyzing session ${sessionId} via tool CLI...`);
167
+ await apiPatch(`/api/insights-jobs/${mirrorId}/progress`, {
168
+ status: "running",
169
+ progress: { step: "fetching_session" }
170
+ });
171
+ const session = await apiGet(`/api/sessions/${sessionId}`);
172
+ if (session.analysis && session.analysis.source === "session_analysis") {
173
+ log(` Session ${sessionId} already analyzed \u2014 skipping (idempotency guard)`);
174
+ return { sessionId, skipped: true, reason: "already_analyzed" };
175
+ }
176
+ const events = await apiGet(
177
+ `/api/sessions/${sessionId}/events?limit=100`
178
+ );
179
+ if (events.length < 2) {
180
+ throw new PermanentJobError("Session has too few events to analyze");
181
+ }
182
+ const eventSummary = events.filter((e) => e.eventType === "user_message" || e.eventType === "human").map((e) => e.content?.slice(0, 200) ?? "").filter(Boolean).join("\n---\n");
183
+ if (!eventSummary) {
184
+ throw new PermanentJobError("No user messages found in session");
185
+ }
186
+ await apiPatch(`/api/insights-jobs/${mirrorId}/progress`, {
187
+ status: "running",
188
+ progress: { step: "running_analysis", tool: session.tool }
189
+ });
190
+ const facets = runToolPrompt(session.tool, FACET_GENERATION_PROMPT, eventSummary);
191
+ if (!facets) {
192
+ throw new Error(`Analysis failed \u2014 ${session.tool} CLI returned no result`);
193
+ }
194
+ const userMessageCount = events.filter(
195
+ (e) => e.eventType === "user_message" || e.eventType === "human"
196
+ ).length;
197
+ await apiPatch(`/api/sessions/${sessionId}/enrich`, {
198
+ analysis: { source: "session_analysis", tool: session.tool, ...facets },
199
+ analyzedEventCount: events.length,
200
+ analyzedTurnCount: userMessageCount
201
+ });
202
+ log(` Session ${sessionId} analyzed via ${session.tool}`);
203
+ return { sessionId, tool: session.tool, facets };
204
+ }
205
+ async function buildDataSummaryFromApi(projectPath, projectId) {
206
+ try {
207
+ const params = new URLSearchParams();
208
+ if (projectId) {
209
+ params.set("projectId", projectId);
210
+ } else if (projectPath) {
211
+ params.set("projectPath", projectPath);
212
+ }
213
+ const computed = await apiGet(`/api/insights/compute?${params}`);
214
+ if (!computed || computed.total_sessions === 0) return null;
215
+ const topTools = Object.entries(computed.tool_counts ?? {}).sort((a, b) => b[1] - a[1]).slice(0, 10).map(([t, c]) => `${t}: ${c}`).join(", ");
216
+ const summary = [
217
+ `Sessions: ${computed.total_sessions}, Messages: ${computed.total_messages}, Hours: ${Math.round(computed.total_duration_hours)}`,
218
+ `Top tools: ${topTools}`,
219
+ computed.goal_categories && Object.keys(computed.goal_categories).length > 0 ? `Goals: ${JSON.stringify(computed.goal_categories)}` : "",
220
+ computed.friction && Object.keys(computed.friction).length > 0 ? `Friction: ${JSON.stringify(computed.friction)}` : "",
221
+ computed.outcomes && Object.keys(computed.outcomes).length > 0 ? `Outcomes: ${JSON.stringify(computed.outcomes)}` : "",
222
+ computed.projects && Object.keys(computed.projects).length > 0 ? `Projects: ${JSON.stringify(computed.projects)}` : ""
223
+ ].filter(Boolean).join("\n");
224
+ return {
225
+ summary,
226
+ stats: {
227
+ sessions: computed.total_sessions,
228
+ totalMessages: computed.total_messages,
229
+ totalHours: computed.total_duration_hours,
230
+ toolCounts: computed.tool_counts,
231
+ goalCounts: computed.goal_categories,
232
+ frictionCounts: computed.friction
233
+ }
234
+ };
235
+ } catch {
236
+ return null;
237
+ }
238
+ }
239
+
240
+ export {
241
+ processInsights
242
+ };
243
+ //# sourceMappingURL=chunk-XPUEGHXN.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/handlers/process-insights.ts"],
4
+ "sourcesContent": ["import type { JobHelpers } from '../job-helpers.js';\nimport { apiGet, apiPost, apiPatch } from '../api-client.js';\nimport { RECOMMENDATION_PROMPTS, AT_A_GLANCE_PROMPT, FACET_GENERATION_PROMPT } from '../insights-prompts.js';\nimport { runLlmPrompt, detectLlmBackend, runToolPrompt } from '../llm-client.js';\nimport { PermanentJobError } from '../permanent-job-error.js';\n\ninterface InsightsPayload {\n mirrorId: string;\n projectPath: string | null;\n // Canonical project identity resolved at enqueue time (best-effort; null when\n // unresolved). When present, the worker scopes its compute call to the\n // cross-path cohort via ?projectId; otherwise it falls back to ?projectPath.\n projectId?: string | null;\n config?: {\n sessionId?: string;\n [key: string]: unknown;\n };\n}\n\n/**\n * Graphile-shaped handler for the `process_insights` task.\n *\n * Lifted from the legacy `insights-worker.ts:processInsightsJob` and\n * `processSessionAnalysisJob`, with the 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 \"could not claim\" early-return branches\n *\n * Mid-job progress patches still hit the existing\n * `PATCH /api/insights-jobs/:id/progress` endpoint, just keyed by the\n * mirror row's id.\n *\n * The session-analysis branch (selected when `payload.config.sessionId`\n * is set) lives inline below \u2014 it's a different code path but cheap to\n * keep co-located.\n *\n * The `buildDataSummary*` helpers are duplicated here as private locals;\n * Task 21 will hoist them into a shared `insights-data.ts` once\n * `insights-worker.ts` is deleted.\n *\n * User-facing notifications go through the API's `notifyUser()` path\n * (insert into `notifications` \u2192 Supabase Realtime \u2192 service-worker\n * `showNotification` with a deep-link). The worker no longer fires native\n * `osascript` banners \u2014 those duplicated the browser path, weren't\n * clickable to a URL, and stacked one-per-project on macOS.\n */\nexport async function processInsights(\n payload: InsightsPayload,\n helpers: JobHelpers,\n): Promise<Record<string, unknown>> {\n const { mirrorId, projectPath, projectId, config } = payload;\n const log = (msg: string) => helpers.logger.info(msg);\n\n // Session-analysis branch \u2014 single-session deep analysis through tool CLI\n if (config?.sessionId) {\n return processSessionAnalysisInline({ mirrorId, sessionId: config.sessionId }, log);\n }\n\n log(`Processing insights job ${mirrorId}...`);\n\n // Update status to running\n await apiPatch(`/api/insights-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { step: 'reading_data' },\n });\n\n // Self-heal orphan analyses missing `analyzed_at`. Without this, the\n // freshness banner on the dashboard nags forever \u2014 the worker's\n // facet-drain query (`hasAnalysis=false`) skips already-analyzed rows,\n // so pre-instrumentation orphans never get touched. Stamps a conservative\n // lower bound (`analyzed_at = started_at`); idempotent on subsequent runs.\n // Best-effort: a failure here must not block the recommendation pass.\n try {\n const { repaired } = await apiPost<{ repaired: number }>(\n '/api/sessions/repair-analyzed-at',\n {},\n );\n if (repaired > 0) {\n log(` Repaired analyzed_at on ${repaired} orphan session(s).`);\n }\n } catch (repairErr) {\n log(` Warning: analyzed_at repair failed: ${repairErr instanceof Error ? repairErr.message : String(repairErr)}`);\n }\n\n // API-based summary is the only source. The previous file-based fallback\n // (`buildDataSummary` reading ~/.claude/usage-data/) was deleted on\n // 2026-05-05 \u2014 it required `rulemetric insights sync` to populate JSON\n // files locally, which nobody ever ran. The DB-derived summary is\n // tool-agnostic and authoritative.\n const data = await buildDataSummaryFromApi(projectPath, projectId);\n if (!data) {\n throw new PermanentJobError(\n 'No session data found \u2014 ensure sessions are captured and enriched.',\n );\n }\n\n log(` Found ${data.stats.sessions} sessions, generating recommendations...`);\n\n // Drain un-analyzed sessions in batches until empty (or until we hit the\n // hard cap, to keep the per-job runtime bounded). Previously this took at\n // most 20 sessions per run, which meant catch-up after a backlog could\n // span days. Batching keeps memory bounded while letting one job clear\n // the entire queue when needed.\n const FACET_BATCH_SIZE = 20;\n const FACET_HARD_CAP = 200; // protect against runaway runtime\n if (detectLlmBackend() !== 'none') {\n let totalFaceted = 0;\n try {\n while (totalFaceted < FACET_HARD_CAP) {\n const unfaceted = await apiGet<Array<{ id: string; tool: string }>>(\n `/api/sessions?hasAnalysis=false&limit=${FACET_BATCH_SIZE}`,\n );\n if (unfaceted.length === 0) break;\n log(` Generating facets for ${unfaceted.length} un-analyzed sessions (drained ${totalFaceted} so far)...`);\n for (const session of unfaceted) {\n if (totalFaceted >= FACET_HARD_CAP) break;\n try {\n const events = await apiGet<Array<{ eventType: string; content: string | null }>>(\n `/api/sessions/${session.id}/events?limit=100`,\n );\n if (events.length < 2) {\n totalFaceted++;\n continue;\n }\n\n const eventSummary = events\n .filter(e => e.eventType === 'user_message' || e.eventType === 'human')\n .map(e => e.content?.slice(0, 200) ?? '')\n .filter(Boolean)\n .join('\\n---\\n');\n\n if (!eventSummary) {\n totalFaceted++;\n continue;\n }\n\n const facets = await runLlmPrompt(FACET_GENERATION_PROMPT, eventSummary, 4096);\n if (facets) {\n const userMessageCount = events.filter(\n e => e.eventType === 'user_message' || e.eventType === 'human',\n ).length;\n await apiPatch(`/api/sessions/${session.id}/enrich`, {\n analysis: { source: 'generated_facets', ...facets },\n analyzedEventCount: events.length,\n analyzedTurnCount: userMessageCount,\n });\n log(` Generated facets for session ${session.id} (${session.tool})`);\n }\n totalFaceted++;\n } catch (sessionErr) {\n log(` Failed to generate facets for session ${session.id}: ${sessionErr instanceof Error ? sessionErr.message : String(sessionErr)}`);\n totalFaceted++; // count it so we don't infinite-loop on a poison row\n }\n }\n // If the batch returned fewer than the requested size, the queue is\n // empty \u2014 break before another fetch.\n if (unfaceted.length < FACET_BATCH_SIZE) break;\n }\n } catch (facetErr) {\n log(` Warning: facet generation failed after ${totalFaceted} sessions: ${facetErr instanceof Error ? facetErr.message : String(facetErr)}`);\n }\n }\n\n // Run recommendation prompts sequentially\n const recommendations: Record<string, unknown> = {};\n const totalPrompts = RECOMMENDATION_PROMPTS.length + 1; // +1 for at_a_glance\n\n // Persist sections-so-far on every progress PATCH so the web UI can render\n // them incrementally \u2014 each prompt takes 30-60s and shipping a label-only\n // progress update for that whole window leaves the page looking dead. The\n // detail page reads `progress.partial` and renders each section card as it\n // arrives.\n for (let i = 0; i < RECOMMENDATION_PROMPTS.length; i++) {\n const spec = RECOMMENDATION_PROMPTS[i];\n log(` [${i + 1}/${totalPrompts}] Generating ${spec.name}...`);\n\n try {\n await apiPatch(`/api/insights-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: {\n step: spec.name,\n current: i + 1,\n total: totalPrompts,\n partial: { ...recommendations },\n },\n });\n } catch (patchErr) {\n log(` Warning: progress update failed for ${spec.name}: ${patchErr instanceof Error ? patchErr.message : String(patchErr)}`);\n }\n\n log(` Running LLM prompt for ${spec.name}...`);\n const result = await runLlmPrompt(spec.prompt, data.summary, spec.maxTokens);\n if (result) {\n recommendations[spec.name] = result;\n log(` Got result for ${spec.name}`);\n } else {\n log(` No result for ${spec.name} (LLM returned null)`);\n }\n }\n\n // At a glance (uses outputs from previous prompts)\n log(` [${totalPrompts}/${totalPrompts}] Generating at_a_glance...`);\n await apiPatch(`/api/insights-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: {\n step: 'at_a_glance',\n current: totalPrompts,\n total: totalPrompts,\n partial: { ...recommendations },\n },\n });\n\n const glanceData = [\n data.summary,\n recommendations.what_works ? `\\n## What Works\\n${JSON.stringify(recommendations.what_works)}` : '',\n recommendations.friction_analysis ? `\\n## Friction\\n${JSON.stringify(recommendations.friction_analysis)}` : '',\n recommendations.suggestions ? `\\n## Suggestions\\n${JSON.stringify(recommendations.suggestions)}` : '',\n recommendations.on_the_horizon ? `\\n## On the Horizon\\n${JSON.stringify(recommendations.on_the_horizon)}` : '',\n ].join('\\n');\n\n const glance = await runLlmPrompt(AT_A_GLANCE_PROMPT, glanceData, 8192);\n if (glance) {\n recommendations.at_a_glance = glance;\n }\n\n log(' Uploading results...');\n log(` Done! Recommendations generated for job ${mirrorId}`);\n\n const result = { recommendations };\n\n // Graphile discards task return values, so persist `{ recommendations }`\n // onto the mirror row here so the dashboard can read it. Best-effort.\n await apiPatch(`/api/insights-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\n/**\n * Single-session deep analysis branch. Runs the session's own tool CLI\n * against the captured event stream to produce facets, then enriches the\n * session row.\n *\n * Idempotency guard: if the session already has analysis from a prior\n * `session_analysis` run, we short-circuit. This is independent of the\n * Graphile-side `job_key` dedup added in Task 9 \u2014 that prevents duplicate\n * enqueues; this prevents redoing work even if a different mirrorId\n * targets the same session.\n */\nasync function processSessionAnalysisInline(\n args: { mirrorId: string; sessionId: string },\n log: (msg: string) => void,\n): Promise<Record<string, unknown>> {\n const { mirrorId, sessionId } = args;\n\n log(`Analyzing session ${sessionId} via tool CLI...`);\n\n await apiPatch(`/api/insights-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { step: 'fetching_session' },\n });\n\n const session = await apiGet<{ id: string; tool: string; analysis: Record<string, unknown> | null }>(`/api/sessions/${sessionId}`);\n\n // Idempotency: skip if session already has analysis from a prior run\n if (session.analysis && (session.analysis as Record<string, unknown>).source === 'session_analysis') {\n log(` Session ${sessionId} already analyzed \u2014 skipping (idempotency guard)`);\n return { sessionId, skipped: true, reason: 'already_analyzed' };\n }\n\n const events = await apiGet<Array<{ eventType: string; content: string | null }>>(\n `/api/sessions/${sessionId}/events?limit=100`,\n );\n\n if (events.length < 2) {\n throw new PermanentJobError('Session has too few events to analyze');\n }\n\n const eventSummary = events\n .filter(e => e.eventType === 'user_message' || e.eventType === 'human')\n .map(e => e.content?.slice(0, 200) ?? '')\n .filter(Boolean)\n .join('\\n---\\n');\n\n if (!eventSummary) {\n throw new PermanentJobError('No user messages found in session');\n }\n\n await apiPatch(`/api/insights-jobs/${mirrorId}/progress`, {\n status: 'running',\n progress: { step: 'running_analysis', tool: session.tool },\n });\n\n // Run through the session's tool CLI\n const facets = runToolPrompt(session.tool, FACET_GENERATION_PROMPT, eventSummary);\n\n if (!facets) {\n throw new Error(`Analysis failed \u2014 ${session.tool} CLI returned no result`);\n }\n\n const userMessageCount = events.filter(\n e => e.eventType === 'user_message' || e.eventType === 'human',\n ).length;\n await apiPatch(`/api/sessions/${sessionId}/enrich`, {\n analysis: { source: 'session_analysis', tool: session.tool, ...facets },\n analyzedEventCount: events.length,\n analyzedTurnCount: userMessageCount,\n });\n\n log(` Session ${sessionId} analyzed via ${session.tool}`);\n\n return { sessionId, tool: session.tool, facets };\n}\n\n// ---------------------------------------------------------------------------\n// Local helpers (copied from `insights-worker.ts`; Task 21 hoists to shared)\n// ---------------------------------------------------------------------------\n\nasync function buildDataSummaryFromApi(projectPath: string | null, projectId?: string | null): Promise<{ summary: string; stats: Record<string, unknown> } | null> {\n try {\n const params = new URLSearchParams();\n // Prefer the canonical project_id \u2014 /api/insights/compute aggregates the\n // project's sessions across every path variant (repo root, /src, worktrees,\n // home-dir captures). Fall back to project_path when no id was resolved.\n if (projectId) {\n params.set('projectId', projectId);\n } else if (projectPath) {\n params.set('projectPath', projectPath);\n }\n\n const computed = await apiGet<{\n total_sessions: number;\n sessions_with_meta: number;\n total_messages: number;\n total_duration_hours: number;\n tool_counts: Record<string, number>;\n goal_categories: Record<string, number>;\n friction: Record<string, number>;\n outcomes: Record<string, number>;\n git_commits: number;\n total_lines_added: number;\n total_lines_removed: number;\n projects: Record<string, number>;\n }>(`/api/insights/compute?${params}`);\n\n if (!computed || computed.total_sessions === 0) return null;\n\n // Build the same text summary format the prompts expect\n const topTools = Object.entries(computed.tool_counts ?? {})\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([t, c]) => `${t}: ${c}`)\n .join(', ');\n\n const summary = [\n `Sessions: ${computed.total_sessions}, Messages: ${computed.total_messages}, Hours: ${Math.round(computed.total_duration_hours)}`,\n `Top tools: ${topTools}`,\n computed.goal_categories && Object.keys(computed.goal_categories).length > 0\n ? `Goals: ${JSON.stringify(computed.goal_categories)}`\n : '',\n computed.friction && Object.keys(computed.friction).length > 0\n ? `Friction: ${JSON.stringify(computed.friction)}`\n : '',\n computed.outcomes && Object.keys(computed.outcomes).length > 0\n ? `Outcomes: ${JSON.stringify(computed.outcomes)}`\n : '',\n computed.projects && Object.keys(computed.projects).length > 0\n ? `Projects: ${JSON.stringify(computed.projects)}`\n : '',\n ].filter(Boolean).join('\\n');\n\n return {\n summary,\n stats: {\n sessions: computed.total_sessions,\n totalMessages: computed.total_messages,\n totalHours: computed.total_duration_hours,\n toolCounts: computed.tool_counts,\n goalCounts: computed.goal_categories,\n frictionCounts: computed.friction,\n },\n };\n } catch {\n return null;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["result"]
7
+ }
@@ -0,0 +1,148 @@
1
+ // src/lib/insights-prompts.ts
2
+ var RECOMMENDATION_PROMPTS = [
3
+ {
4
+ name: "project_areas",
5
+ prompt: `Analyze this Claude Code usage data and identify project areas.
6
+ RESPOND WITH ONLY A VALID JSON OBJECT:
7
+ {
8
+ "areas": [
9
+ {"name": "Area name", "session_count": N, "description": "2-3 sentences about what was worked on and how Claude Code was used."}
10
+ ]
11
+ }
12
+ Include 4-5 areas. Skip internal CC operations.`,
13
+ maxTokens: 8192
14
+ },
15
+ {
16
+ name: "interaction_style",
17
+ prompt: `Analyze this Claude Code usage data and describe the user's interaction style.
18
+ RESPOND WITH ONLY A VALID JSON OBJECT:
19
+ {
20
+ "narrative": "2-3 paragraphs analyzing HOW the user interacts with Claude Code. Use second person 'you'. Describe patterns: iterate quickly vs detailed upfront specs? Interrupt often or let Claude run? Include specific examples. Use **bold** for key insights.",
21
+ "key_pattern": "One sentence summary of most distinctive interaction style"
22
+ }`,
23
+ maxTokens: 8192
24
+ },
25
+ {
26
+ name: "what_works",
27
+ prompt: `Analyze this Claude Code usage data and identify what's working well for this user. Use second person ("you").
28
+ RESPOND WITH ONLY A VALID JSON OBJECT:
29
+ {
30
+ "intro": "1 sentence of context",
31
+ "impressive_workflows": [
32
+ {"title": "Short title (3-6 words)", "description": "2-3 sentences describing the impressive workflow or approach. Use 'you' not 'the user'."}
33
+ ]
34
+ }
35
+ Include 3 impressive workflows.`,
36
+ maxTokens: 8192
37
+ },
38
+ {
39
+ name: "friction_analysis",
40
+ prompt: `Analyze this Claude Code usage data and identify friction points for this user. Use second person ("you").
41
+ RESPOND WITH ONLY A VALID JSON OBJECT:
42
+ {
43
+ "intro": "1 sentence summarizing friction patterns",
44
+ "categories": [
45
+ {"category": "Concrete category name", "description": "1-2 sentences explaining this category and what could be done differently. Use 'you' not 'the user'.", "examples": ["Specific example with consequence", "Another example"]}
46
+ ]
47
+ }
48
+ Include 3 friction categories with 2 examples each.`,
49
+ maxTokens: 8192
50
+ },
51
+ {
52
+ name: "suggestions",
53
+ prompt: `Analyze this Claude Code usage data and suggest improvements.
54
+ ## CC FEATURES REFERENCE (pick from these for features_to_try):
55
+ 1. **MCP Servers**: Connect Claude to external tools, databases, and APIs via Model Context Protocol.
56
+ - How to use: Run \`claude mcp add <server-name> -- <command>\`
57
+ 2. **Custom Skills**: Reusable prompts you define as markdown files that run with a single /command.
58
+ - How to use: Create \`.claude/skills/commit/SKILL.md\` with instructions. Then type \`/commit\` to run it.
59
+ 3. **Hooks**: Shell commands that auto-run at specific lifecycle events.
60
+ - How to use: Add to \`.claude/settings.json\` under "hooks" key.
61
+ 4. **Headless Mode**: Run Claude non-interactively from scripts and CI/CD.
62
+ - How to use: \`claude -p "fix lint errors" --allowedTools "Edit,Read,Bash"\`
63
+ 5. **Task Agents**: Claude spawns focused sub-agents for complex exploration or parallel work.
64
+ - How to use: Claude auto-invokes when helpful, or ask "use an agent to explore X"
65
+ RESPOND WITH ONLY A VALID JSON OBJECT:
66
+ {
67
+ "claude_md_additions": [
68
+ {"addition": "A specific line or block to add to CLAUDE.md", "why": "1 sentence explaining why", "prompt_scaffold": "Instructions for where to add this"}
69
+ ],
70
+ "features_to_try": [
71
+ {"feature": "Feature name from above", "one_liner": "What it does", "why_for_you": "Why this would help YOU", "example_code": "Actual command or config to copy"}
72
+ ],
73
+ "usage_patterns": [
74
+ {"title": "Short title", "suggestion": "1-2 sentence summary", "detail": "3-4 sentences explaining how this applies", "copyable_prompt": "A specific prompt to copy and try"}
75
+ ]
76
+ }
77
+ Include 2-3 items for each category.`,
78
+ maxTokens: 8192
79
+ },
80
+ {
81
+ name: "on_the_horizon",
82
+ prompt: `Analyze this Claude Code usage data and identify future opportunities.
83
+ RESPOND WITH ONLY A VALID JSON OBJECT:
84
+ {
85
+ "intro": "1 sentence about evolving AI-assisted development",
86
+ "opportunities": [
87
+ {"title": "Short title (4-8 words)", "whats_possible": "2-3 ambitious sentences about autonomous workflows", "how_to_try": "1-2 sentences mentioning relevant tooling", "copyable_prompt": "Detailed prompt to try"}
88
+ ]
89
+ }
90
+ Include 3 opportunities. Think BIG - autonomous workflows, parallel agents, iterating against tests.`,
91
+ maxTokens: 8192
92
+ },
93
+ {
94
+ name: "fun_ending",
95
+ prompt: `Analyze this Claude Code usage data and find a memorable moment.
96
+ RESPOND WITH ONLY A VALID JSON OBJECT:
97
+ {
98
+ "headline": "A memorable QUALITATIVE moment from the transcripts - not a statistic. Something human, funny, or surprising.",
99
+ "detail": "Brief context about when/where this happened"
100
+ }
101
+ Find something genuinely interesting or amusing from the session summaries.`,
102
+ maxTokens: 8192
103
+ }
104
+ ];
105
+ var AT_A_GLANCE_PROMPT = `You're writing an "At a Glance" summary for a Claude Code usage insights report.
106
+ Use this 4-part structure:
107
+ 1. **What's working** - What is the user's unique style and what impactful things have they done? Don't be fluffy.
108
+ 2. **What's hindering you** - Split into (a) Claude's fault and (b) user-side friction. Be honest but constructive.
109
+ 3. **Quick wins to try** - Specific Claude Code features they could try, or a compelling workflow technique.
110
+ 4. **Ambitious workflows for better models** - As models improve, what workflows should they prepare for?
111
+ Keep each section to 2-3 sentences. Use a coaching tone.
112
+ RESPOND WITH ONLY A VALID JSON OBJECT:
113
+ {
114
+ "whats_working": "(refer to instructions above)",
115
+ "whats_hindering": "(refer to instructions above)",
116
+ "quick_wins": "(refer to instructions above)",
117
+ "ambitious_workflows": "(refer to instructions above)"
118
+ }`;
119
+ var FACET_GENERATION_PROMPT = `Analyze this coding session and produce a structured analysis.
120
+ The session is from a non-Claude-Code tool, so analyze the conversation and tool usage patterns.
121
+
122
+ RESPOND WITH ONLY A VALID JSON OBJECT:
123
+ {
124
+ "underlying_goal": "1-2 sentence description of what the user was trying to accomplish",
125
+ "goal_categories": {"category": count},
126
+ "outcome": "achieved|mostly_achieved|partially_achieved|not_achieved|abandoned",
127
+ "session_type": "quick_task|iterative_refinement|exploration|debugging|greenfield",
128
+ "friction_counts": {"wrong_approach": 0, "tool_failure": 0, "excessive_changes": 0, "misunderstanding": 0},
129
+ "friction_detail": "Brief description of any friction encountered, or empty string",
130
+ "primary_success": "Brief description of main achievement, or empty string",
131
+ "brief_summary": "2-3 sentence summary of the session"
132
+ }
133
+
134
+ Goal categories to use: debugging, feature_development, refactoring, testing, documentation, investigation, exploration, code_review, deployment, configuration, end_to_end_testing, logging_documentation, ui_testing.
135
+
136
+ Outcome guide:
137
+ - achieved: Task completed successfully
138
+ - mostly_achieved: Main goal done but minor items remain
139
+ - partially_achieved: Some progress but significant work left
140
+ - not_achieved: Attempted but failed
141
+ - abandoned: User gave up or switched tasks`;
142
+
143
+ export {
144
+ RECOMMENDATION_PROMPTS,
145
+ AT_A_GLANCE_PROMPT,
146
+ FACET_GENERATION_PROMPT
147
+ };
148
+ //# sourceMappingURL=chunk-XZXS2W24.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/insights-prompts.ts"],
4
+ "sourcesContent": ["/**\n * Recommendation prompts matching Claude Code's /insights structure.\n * Each prompt is sent to `claude -p` with the aggregated stats data.\n */\n\nexport interface PromptSpec {\n name: string;\n prompt: string;\n maxTokens: number;\n}\n\nexport const RECOMMENDATION_PROMPTS: PromptSpec[] = [\n {\n name: 'project_areas',\n prompt: `Analyze this Claude Code usage data and identify project areas.\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"areas\": [\n {\"name\": \"Area name\", \"session_count\": N, \"description\": \"2-3 sentences about what was worked on and how Claude Code was used.\"}\n ]\n}\nInclude 4-5 areas. Skip internal CC operations.`,\n maxTokens: 8192,\n },\n {\n name: 'interaction_style',\n prompt: `Analyze this Claude Code usage data and describe the user's interaction style.\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"narrative\": \"2-3 paragraphs analyzing HOW the user interacts with Claude Code. Use second person 'you'. Describe patterns: iterate quickly vs detailed upfront specs? Interrupt often or let Claude run? Include specific examples. Use **bold** for key insights.\",\n \"key_pattern\": \"One sentence summary of most distinctive interaction style\"\n}`,\n maxTokens: 8192,\n },\n {\n name: 'what_works',\n prompt: `Analyze this Claude Code usage data and identify what's working well for this user. Use second person (\"you\").\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"intro\": \"1 sentence of context\",\n \"impressive_workflows\": [\n {\"title\": \"Short title (3-6 words)\", \"description\": \"2-3 sentences describing the impressive workflow or approach. Use 'you' not 'the user'.\"}\n ]\n}\nInclude 3 impressive workflows.`,\n maxTokens: 8192,\n },\n {\n name: 'friction_analysis',\n prompt: `Analyze this Claude Code usage data and identify friction points for this user. Use second person (\"you\").\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"intro\": \"1 sentence summarizing friction patterns\",\n \"categories\": [\n {\"category\": \"Concrete category name\", \"description\": \"1-2 sentences explaining this category and what could be done differently. Use 'you' not 'the user'.\", \"examples\": [\"Specific example with consequence\", \"Another example\"]}\n ]\n}\nInclude 3 friction categories with 2 examples each.`,\n maxTokens: 8192,\n },\n {\n name: 'suggestions',\n prompt: `Analyze this Claude Code usage data and suggest improvements.\n## CC FEATURES REFERENCE (pick from these for features_to_try):\n1. **MCP Servers**: Connect Claude to external tools, databases, and APIs via Model Context Protocol.\n - How to use: Run \\`claude mcp add <server-name> -- <command>\\`\n2. **Custom Skills**: Reusable prompts you define as markdown files that run with a single /command.\n - How to use: Create \\`.claude/skills/commit/SKILL.md\\` with instructions. Then type \\`/commit\\` to run it.\n3. **Hooks**: Shell commands that auto-run at specific lifecycle events.\n - How to use: Add to \\`.claude/settings.json\\` under \"hooks\" key.\n4. **Headless Mode**: Run Claude non-interactively from scripts and CI/CD.\n - How to use: \\`claude -p \"fix lint errors\" --allowedTools \"Edit,Read,Bash\"\\`\n5. **Task Agents**: Claude spawns focused sub-agents for complex exploration or parallel work.\n - How to use: Claude auto-invokes when helpful, or ask \"use an agent to explore X\"\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"claude_md_additions\": [\n {\"addition\": \"A specific line or block to add to CLAUDE.md\", \"why\": \"1 sentence explaining why\", \"prompt_scaffold\": \"Instructions for where to add this\"}\n ],\n \"features_to_try\": [\n {\"feature\": \"Feature name from above\", \"one_liner\": \"What it does\", \"why_for_you\": \"Why this would help YOU\", \"example_code\": \"Actual command or config to copy\"}\n ],\n \"usage_patterns\": [\n {\"title\": \"Short title\", \"suggestion\": \"1-2 sentence summary\", \"detail\": \"3-4 sentences explaining how this applies\", \"copyable_prompt\": \"A specific prompt to copy and try\"}\n ]\n}\nInclude 2-3 items for each category.`,\n maxTokens: 8192,\n },\n {\n name: 'on_the_horizon',\n prompt: `Analyze this Claude Code usage data and identify future opportunities.\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"intro\": \"1 sentence about evolving AI-assisted development\",\n \"opportunities\": [\n {\"title\": \"Short title (4-8 words)\", \"whats_possible\": \"2-3 ambitious sentences about autonomous workflows\", \"how_to_try\": \"1-2 sentences mentioning relevant tooling\", \"copyable_prompt\": \"Detailed prompt to try\"}\n ]\n}\nInclude 3 opportunities. Think BIG - autonomous workflows, parallel agents, iterating against tests.`,\n maxTokens: 8192,\n },\n {\n name: 'fun_ending',\n prompt: `Analyze this Claude Code usage data and find a memorable moment.\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"headline\": \"A memorable QUALITATIVE moment from the transcripts - not a statistic. Something human, funny, or surprising.\",\n \"detail\": \"Brief context about when/where this happened\"\n}\nFind something genuinely interesting or amusing from the session summaries.`,\n maxTokens: 8192,\n },\n];\n\nexport const AT_A_GLANCE_PROMPT = `You're writing an \"At a Glance\" summary for a Claude Code usage insights report.\nUse this 4-part structure:\n1. **What's working** - What is the user's unique style and what impactful things have they done? Don't be fluffy.\n2. **What's hindering you** - Split into (a) Claude's fault and (b) user-side friction. Be honest but constructive.\n3. **Quick wins to try** - Specific Claude Code features they could try, or a compelling workflow technique.\n4. **Ambitious workflows for better models** - As models improve, what workflows should they prepare for?\nKeep each section to 2-3 sentences. Use a coaching tone.\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"whats_working\": \"(refer to instructions above)\",\n \"whats_hindering\": \"(refer to instructions above)\",\n \"quick_wins\": \"(refer to instructions above)\",\n \"ambitious_workflows\": \"(refer to instructions above)\"\n}`;\n\nexport const FACET_GENERATION_PROMPT = `Analyze this coding session and produce a structured analysis.\nThe session is from a non-Claude-Code tool, so analyze the conversation and tool usage patterns.\n\nRESPOND WITH ONLY A VALID JSON OBJECT:\n{\n \"underlying_goal\": \"1-2 sentence description of what the user was trying to accomplish\",\n \"goal_categories\": {\"category\": count},\n \"outcome\": \"achieved|mostly_achieved|partially_achieved|not_achieved|abandoned\",\n \"session_type\": \"quick_task|iterative_refinement|exploration|debugging|greenfield\",\n \"friction_counts\": {\"wrong_approach\": 0, \"tool_failure\": 0, \"excessive_changes\": 0, \"misunderstanding\": 0},\n \"friction_detail\": \"Brief description of any friction encountered, or empty string\",\n \"primary_success\": \"Brief description of main achievement, or empty string\",\n \"brief_summary\": \"2-3 sentence summary of the session\"\n}\n\nGoal categories to use: debugging, feature_development, refactoring, testing, documentation, investigation, exploration, code_review, deployment, configuration, end_to_end_testing, logging_documentation, ui_testing.\n\nOutcome guide:\n- achieved: Task completed successfully\n- mostly_achieved: Main goal done but minor items remain\n- partially_achieved: Some progress but significant work left\n- not_achieved: Attempted but failed\n- abandoned: User gave up or switched tasks`;\n"],
5
+ "mappings": ";AAWO,IAAM,yBAAuC;AAAA,EAClD;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQR,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMR,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASR,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASR,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAyBR,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASR,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOR,WAAW;AAAA,EACb;AACF;AAEO,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAe3B,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
+ "names": []
7
+ }
@@ -0,0 +1,167 @@
1
+ import {
2
+ detectLlmBackend,
3
+ runLlmPrompt
4
+ } from "./chunk-FZKLLNDS.js";
5
+ import {
6
+ buildRecommendationPrompt
7
+ } from "./chunk-K3BFZ7KG.js";
8
+ import {
9
+ normalizeProjectPath
10
+ } from "./chunk-EKP32DLN.js";
11
+ import {
12
+ detectLanguages
13
+ } from "./chunk-OQSQC7VB.js";
14
+ import {
15
+ apiGet,
16
+ apiPost
17
+ } from "./chunk-EJOI2ZGU.js";
18
+
19
+ // src/lib/handlers/cron-suggest-instructions.ts
20
+ import { readFileSync } from "node:fs";
21
+ import path from "node:path";
22
+ import os from "node:os";
23
+ var MAX_SUGGESTIONS_PER_PROJECT = 5;
24
+ var MAX_PROJECTS_PER_RUN = Number(process.env.RULEMETRIC_MAX_SUGGESTION_PROJECTS ?? 10);
25
+ var STALE_THRESHOLD_HOURS = 48;
26
+ var MIN_SCORE = 0.5;
27
+ var CONTENT_PREVIEW_CHARS = 400;
28
+ async function checkSkillsRegistryStale() {
29
+ const registryPath = path.join(os.homedir(), ".config", "rulemetric", "skills-registry.json");
30
+ try {
31
+ const raw = readFileSync(registryPath, "utf-8");
32
+ const registry = JSON.parse(raw);
33
+ const ageMs = Date.now() - new Date(registry.generatedAt).getTime();
34
+ return ageMs > STALE_THRESHOLD_HOURS * 60 * 60 * 1e3;
35
+ } catch {
36
+ return true;
37
+ }
38
+ }
39
+ var cronSuggestInstructions = async (_payload, helpers) => {
40
+ const backend = detectLlmBackend();
41
+ if (backend === "none") {
42
+ helpers.logger.warn("No LLM backend available (claude CLI missing and ANTHROPIC_API_KEY unset); skipping suggestion compute");
43
+ return;
44
+ }
45
+ helpers.logger.info(`Scoring backend: ${backend}`);
46
+ let projectPaths;
47
+ try {
48
+ const res = await apiGet("/api/sessions/project-paths?limit=" + MAX_PROJECTS_PER_RUN);
49
+ projectPaths = res.projectPaths;
50
+ } catch (err) {
51
+ helpers.logger.warn(`Failed to fetch project paths: ${err instanceof Error ? err.message : String(err)}`);
52
+ return;
53
+ }
54
+ if (projectPaths.length === 0) {
55
+ helpers.logger.info("No recent project paths; nothing to score");
56
+ return;
57
+ }
58
+ const projectIdByPath = /* @__PURE__ */ new Map();
59
+ try {
60
+ const projRes = await apiGet("/api/projects?limit=200");
61
+ for (const p of projRes.projects ?? []) {
62
+ if (p.primaryCheckoutPath) {
63
+ projectIdByPath.set(normalizeProjectPath(p.primaryCheckoutPath), p.id);
64
+ }
65
+ }
66
+ } catch (err) {
67
+ helpers.logger.warn(`Failed to fetch projects for id resolution: ${err instanceof Error ? err.message : String(err)}`);
68
+ }
69
+ const candidates = /* @__PURE__ */ new Map();
70
+ try {
71
+ const catalogRows = await apiGet("/api/catalog?limit=200");
72
+ for (const row of catalogRows) {
73
+ candidates.set(row.id, {
74
+ id: row.id,
75
+ name: row.name,
76
+ description: row.description ?? "",
77
+ tags: row.tags ?? [],
78
+ contentPreview: (row.content ?? "").slice(0, CONTENT_PREVIEW_CHARS)
79
+ });
80
+ }
81
+ } catch (err) {
82
+ helpers.logger.warn(`Failed to fetch catalog: ${err instanceof Error ? err.message : String(err)}`);
83
+ }
84
+ try {
85
+ const personalRes = await apiGet("/api/instructions?limit=100");
86
+ for (const row of personalRes.instructions ?? []) {
87
+ if (!candidates.has(row.id)) {
88
+ candidates.set(row.id, {
89
+ id: row.id,
90
+ name: row.name,
91
+ description: row.description ?? "",
92
+ tags: row.tags ?? [],
93
+ contentPreview: (row.content ?? "").slice(0, CONTENT_PREVIEW_CHARS)
94
+ });
95
+ }
96
+ }
97
+ } catch (err) {
98
+ helpers.logger.warn(`Failed to fetch personal instructions: ${err instanceof Error ? err.message : String(err)}`);
99
+ }
100
+ const candidateList = [...candidates.values()];
101
+ if (candidateList.length === 0) {
102
+ helpers.logger.info("No candidate instructions; nothing to score");
103
+ return;
104
+ }
105
+ helpers.logger.info(`Scoring ${candidateList.length} candidates across ${projectPaths.length} project(s)`);
106
+ let scored = 0;
107
+ for (const rawPath of projectPaths) {
108
+ try {
109
+ const projectPath = normalizeProjectPath(rawPath);
110
+ const languages = detectLanguages(projectPath);
111
+ if (languages.length === 0) {
112
+ helpers.logger.info(`Skipping ${projectPath}: insufficient language signals`);
113
+ continue;
114
+ }
115
+ const context = {
116
+ name: path.basename(projectPath),
117
+ description: null,
118
+ languages,
119
+ topics: [],
120
+ dependencies: []
121
+ };
122
+ const prompt = buildRecommendationPrompt(context, candidateList);
123
+ const parsed = await runLlmPrompt(prompt, "", 4096);
124
+ if (!parsed) {
125
+ helpers.logger.warn(`LLM returned null for ${projectPath} (backend ${backend})`);
126
+ continue;
127
+ }
128
+ const raw = parsed.recommendations ?? [];
129
+ const recommendations = raw.filter((r) => typeof r.instructionId === "string" && typeof r.score === "number" && typeof r.reason === "string").map((r) => ({
130
+ instructionId: r.instructionId,
131
+ score: r.score,
132
+ reason: r.reason
133
+ }));
134
+ const top = recommendations.filter((r) => r.score >= MIN_SCORE).sort((a, b) => b.score - a.score).slice(0, MAX_SUGGESTIONS_PER_PROJECT);
135
+ if (top.length === 0) {
136
+ helpers.logger.info(`No suggestions over threshold for ${projectPath}`);
137
+ continue;
138
+ }
139
+ const projectId = projectIdByPath.get(projectPath);
140
+ await apiPost("/api/instruction-suggestions/batch-upsert", {
141
+ projectPath,
142
+ ...projectId ? { projectId } : {},
143
+ suggestions: top.map((r) => ({
144
+ instructionId: r.instructionId,
145
+ score: r.score,
146
+ reason: r.reason
147
+ }))
148
+ });
149
+ scored++;
150
+ } catch (err) {
151
+ helpers.logger.warn(`Failed to score ${rawPath}: ${err instanceof Error ? err.message : String(err)}`);
152
+ }
153
+ }
154
+ if (await checkSkillsRegistryStale()) {
155
+ try {
156
+ await apiPost("/api/instruction-suggestions/mark-stale", {});
157
+ helpers.logger.warn("Skills registry is stale (>48h); marked all suggestions stale");
158
+ } catch {
159
+ }
160
+ }
161
+ helpers.logger.info(`Done: scored ${scored}/${projectPaths.length} projects`);
162
+ };
163
+
164
+ export {
165
+ cronSuggestInstructions
166
+ };
167
+ //# sourceMappingURL=chunk-YBNW7ARH.js.map