@rulemetric/cli 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (780) hide show
  1. package/dist/base-command.js +13 -52
  2. package/dist/base-command.js.map +7 -1
  3. package/dist/chunk-2AM54TUK.js +59 -0
  4. package/dist/chunk-2AM54TUK.js.map +7 -0
  5. package/dist/chunk-3TIMQ3O6.js +96 -0
  6. package/dist/chunk-3TIMQ3O6.js.map +7 -0
  7. package/dist/chunk-4BHDHHKL.js +48 -0
  8. package/dist/chunk-4BHDHHKL.js.map +7 -0
  9. package/dist/chunk-4D537GXE.js +99 -0
  10. package/dist/chunk-4D537GXE.js.map +7 -0
  11. package/dist/chunk-4SCZK7AL.js +129 -0
  12. package/dist/chunk-4SCZK7AL.js.map +7 -0
  13. package/dist/chunk-4WFE4PFP.js +61 -0
  14. package/dist/chunk-4WFE4PFP.js.map +7 -0
  15. package/dist/chunk-52WIYRZH.js +73 -0
  16. package/dist/chunk-52WIYRZH.js.map +7 -0
  17. package/dist/chunk-7FAA3YNB.js +1549 -0
  18. package/dist/chunk-7FAA3YNB.js.map +7 -0
  19. package/dist/chunk-7NYKWN7U.js +12 -0
  20. package/dist/chunk-7NYKWN7U.js.map +7 -0
  21. package/dist/chunk-AULP2OWH.js +99 -0
  22. package/dist/chunk-AULP2OWH.js.map +7 -0
  23. package/dist/chunk-B5KNTGMJ.js +1788 -0
  24. package/dist/chunk-B5KNTGMJ.js.map +7 -0
  25. package/dist/chunk-BD7CY42U.js +23 -0
  26. package/dist/chunk-BD7CY42U.js.map +7 -0
  27. package/dist/chunk-BO76WKJR.js +42 -0
  28. package/dist/chunk-BO76WKJR.js.map +7 -0
  29. package/dist/chunk-BRD5RUGM.js +53 -0
  30. package/dist/chunk-BRD5RUGM.js.map +7 -0
  31. package/dist/chunk-BT6Z6545.js +43 -0
  32. package/dist/chunk-BT6Z6545.js.map +7 -0
  33. package/dist/chunk-BZDKEQKU.js +39 -0
  34. package/dist/chunk-BZDKEQKU.js.map +7 -0
  35. package/dist/chunk-CROYS75W.js +161 -0
  36. package/dist/chunk-CROYS75W.js.map +7 -0
  37. package/dist/chunk-DGHWRQXL.js +17 -0
  38. package/dist/chunk-DGHWRQXL.js.map +7 -0
  39. package/dist/chunk-DQ3KELXD.js +74 -0
  40. package/dist/chunk-DQ3KELXD.js.map +7 -0
  41. package/dist/chunk-DTFXCHHI.js +108 -0
  42. package/dist/chunk-DTFXCHHI.js.map +7 -0
  43. package/dist/chunk-DU73QUS3.js +75 -0
  44. package/dist/chunk-DU73QUS3.js.map +7 -0
  45. package/dist/chunk-EHZJ6OXD.js +307 -0
  46. package/dist/chunk-EHZJ6OXD.js.map +7 -0
  47. package/dist/chunk-EJOI2ZGU.js +109 -0
  48. package/dist/chunk-EJOI2ZGU.js.map +7 -0
  49. package/dist/chunk-EKJ2CABV.js +76 -0
  50. package/dist/chunk-EKJ2CABV.js.map +7 -0
  51. package/dist/chunk-EKP32DLN.js +16 -0
  52. package/dist/chunk-EKP32DLN.js.map +7 -0
  53. package/dist/chunk-EOOP6WTC.js +148 -0
  54. package/dist/chunk-EOOP6WTC.js.map +7 -0
  55. package/dist/chunk-ERPMDAO3.js +20 -0
  56. package/dist/chunk-ERPMDAO3.js.map +7 -0
  57. package/dist/chunk-FTJRMUID.js +96 -0
  58. package/dist/chunk-FTJRMUID.js.map +7 -0
  59. package/dist/chunk-FZKLLNDS.js +228 -0
  60. package/dist/chunk-FZKLLNDS.js.map +7 -0
  61. package/dist/chunk-GQCISMAH.js +157 -0
  62. package/dist/chunk-GQCISMAH.js.map +7 -0
  63. package/dist/chunk-IGXX624H.js +55 -0
  64. package/dist/chunk-IGXX624H.js.map +7 -0
  65. package/dist/chunk-IJGF2ETG.js +68 -0
  66. package/dist/chunk-IJGF2ETG.js.map +7 -0
  67. package/dist/chunk-IWYCRLEK.js +220 -0
  68. package/dist/chunk-IWYCRLEK.js.map +7 -0
  69. package/dist/chunk-J7N3DLH6.js +117 -0
  70. package/dist/chunk-J7N3DLH6.js.map +7 -0
  71. package/dist/chunk-JX5UI6RW.js +99 -0
  72. package/dist/chunk-JX5UI6RW.js.map +7 -0
  73. package/dist/chunk-K3BFZ7KG.js +154 -0
  74. package/dist/chunk-K3BFZ7KG.js.map +7 -0
  75. package/dist/chunk-KHJUQFIK.js +51 -0
  76. package/dist/chunk-KHJUQFIK.js.map +7 -0
  77. package/dist/chunk-KRBQLMOP.js +41 -0
  78. package/dist/chunk-KRBQLMOP.js.map +7 -0
  79. package/dist/chunk-KZRFUXGF.js +145 -0
  80. package/dist/chunk-KZRFUXGF.js.map +7 -0
  81. package/dist/chunk-L674RNKQ.js +492 -0
  82. package/dist/chunk-L674RNKQ.js.map +7 -0
  83. package/dist/chunk-N52AHNBH.js +47 -0
  84. package/dist/chunk-N52AHNBH.js.map +7 -0
  85. package/dist/chunk-NIDLJO6F.js +228 -0
  86. package/dist/chunk-NIDLJO6F.js.map +7 -0
  87. package/dist/chunk-NSBPE2FW.js +17 -0
  88. package/dist/chunk-NSBPE2FW.js.map +7 -0
  89. package/dist/chunk-OGVORIFM.js +70 -0
  90. package/dist/chunk-OGVORIFM.js.map +7 -0
  91. package/dist/chunk-OQSQC7VB.js +77 -0
  92. package/dist/chunk-OQSQC7VB.js.map +7 -0
  93. package/dist/chunk-PHLMIZKM.js +153 -0
  94. package/dist/chunk-PHLMIZKM.js.map +7 -0
  95. package/dist/chunk-PQU7GZ7A.js +92 -0
  96. package/dist/chunk-PQU7GZ7A.js.map +7 -0
  97. package/dist/chunk-PXVQLD7S.js +196 -0
  98. package/dist/chunk-PXVQLD7S.js.map +7 -0
  99. package/dist/chunk-QD6X4L4L.js +79 -0
  100. package/dist/chunk-QD6X4L4L.js.map +7 -0
  101. package/dist/chunk-QJQS6TUN.js +44 -0
  102. package/dist/chunk-QJQS6TUN.js.map +7 -0
  103. package/dist/chunk-QJXAULRC.js +191 -0
  104. package/dist/chunk-QJXAULRC.js.map +7 -0
  105. package/dist/chunk-QN34TGD3.js +83 -0
  106. package/dist/chunk-QN34TGD3.js.map +7 -0
  107. package/dist/chunk-R5MFHGHR.js +122 -0
  108. package/dist/chunk-R5MFHGHR.js.map +7 -0
  109. package/dist/chunk-RH7NHVSK.js +16 -0
  110. package/dist/chunk-RH7NHVSK.js.map +7 -0
  111. package/dist/chunk-RJ7BHDLM.js +121 -0
  112. package/dist/chunk-RJ7BHDLM.js.map +7 -0
  113. package/dist/chunk-RQ2TMLKG.js +142 -0
  114. package/dist/chunk-RQ2TMLKG.js.map +7 -0
  115. package/dist/chunk-S56LOTGQ.js +63 -0
  116. package/dist/chunk-S56LOTGQ.js.map +7 -0
  117. package/dist/chunk-UF73WX2J.js +49 -0
  118. package/dist/chunk-UF73WX2J.js.map +7 -0
  119. package/dist/chunk-W53GKIZQ.js +50 -0
  120. package/dist/chunk-W53GKIZQ.js.map +7 -0
  121. package/dist/chunk-WA4MWYRW.js +254 -0
  122. package/dist/chunk-WA4MWYRW.js.map +7 -0
  123. package/dist/chunk-WFULKPEQ.js +269 -0
  124. package/dist/chunk-WFULKPEQ.js.map +7 -0
  125. package/dist/chunk-XC6M4CSW.js +44 -0
  126. package/dist/chunk-XC6M4CSW.js.map +7 -0
  127. package/dist/chunk-XPUEGHXN.js +243 -0
  128. package/dist/chunk-XPUEGHXN.js.map +7 -0
  129. package/dist/chunk-XZXS2W24.js +148 -0
  130. package/dist/chunk-XZXS2W24.js.map +7 -0
  131. package/dist/chunk-YBNW7ARH.js +167 -0
  132. package/dist/chunk-YBNW7ARH.js.map +7 -0
  133. package/dist/chunk-YNIH3KMU.js +121 -0
  134. package/dist/chunk-YNIH3KMU.js.map +7 -0
  135. package/dist/commands/antigravity/backfill.js +135 -0
  136. package/dist/commands/antigravity/backfill.js.map +7 -0
  137. package/dist/commands/auth/create-key.js +48 -33
  138. package/dist/commands/auth/create-key.js.map +7 -1
  139. package/dist/commands/auth/login.js +58 -46
  140. package/dist/commands/auth/login.js.map +7 -1
  141. package/dist/commands/auth/logout.js +28 -13
  142. package/dist/commands/auth/logout.js.map +7 -1
  143. package/dist/commands/auth/revoke-key.js +32 -18
  144. package/dist/commands/auth/revoke-key.js.map +7 -1
  145. package/dist/commands/auth/status.js +40 -22
  146. package/dist/commands/auth/status.js.map +7 -1
  147. package/dist/commands/catalog/index.js +50 -34
  148. package/dist/commands/catalog/index.js.map +7 -1
  149. package/dist/commands/catalog/recommend.js +41 -26
  150. package/dist/commands/catalog/recommend.js.map +7 -1
  151. package/dist/commands/convert.js +72 -54
  152. package/dist/commands/convert.js.map +7 -1
  153. package/dist/commands/converters.js +52 -38
  154. package/dist/commands/converters.js.map +7 -1
  155. package/dist/commands/crons/list.js +50 -24
  156. package/dist/commands/crons/list.js.map +7 -1
  157. package/dist/commands/crons/run.js +72 -47
  158. package/dist/commands/crons/run.js.map +7 -1
  159. package/dist/commands/dashboard.js +45 -24
  160. package/dist/commands/dashboard.js.map +7 -1
  161. package/dist/commands/eval-targets/create.js +51 -39
  162. package/dist/commands/eval-targets/create.js.map +7 -1
  163. package/dist/commands/eval-targets/list.js +52 -35
  164. package/dist/commands/eval-targets/list.js.map +7 -1
  165. package/dist/commands/evals/agent.js +292 -0
  166. package/dist/commands/evals/agent.js.map +7 -0
  167. package/dist/commands/evals/benchmark.js +70 -51
  168. package/dist/commands/evals/benchmark.js.map +7 -1
  169. package/dist/commands/evals/compare.js +90 -78
  170. package/dist/commands/evals/compare.js.map +7 -1
  171. package/dist/commands/evals/create.js +64 -50
  172. package/dist/commands/evals/create.js.map +7 -1
  173. package/dist/commands/evals/optimize-description.js +225 -222
  174. package/dist/commands/evals/optimize-description.js.map +7 -1
  175. package/dist/commands/evals/optimize.js +206 -196
  176. package/dist/commands/evals/optimize.js.map +7 -1
  177. package/dist/commands/evals/run.js +178 -164
  178. package/dist/commands/evals/run.js.map +7 -1
  179. package/dist/commands/gateway/ensure.js +33 -19
  180. package/dist/commands/gateway/ensure.js.map +7 -1
  181. package/dist/commands/hooks/install.js +335 -275
  182. package/dist/commands/hooks/install.js.map +7 -1
  183. package/dist/commands/hooks/run.js +72 -53
  184. package/dist/commands/hooks/run.js.map +7 -1
  185. package/dist/commands/hooks/uninstall.js +117 -94
  186. package/dist/commands/hooks/uninstall.js.map +7 -1
  187. package/dist/commands/import.js +63 -53
  188. package/dist/commands/import.js.map +7 -1
  189. package/dist/commands/instructions/create.js +71 -58
  190. package/dist/commands/instructions/create.js.map +7 -1
  191. package/dist/commands/instructions/delete.js +53 -36
  192. package/dist/commands/instructions/delete.js.map +7 -1
  193. package/dist/commands/instructions/fork.js +33 -19
  194. package/dist/commands/instructions/fork.js.map +7 -1
  195. package/dist/commands/instructions/get.js +66 -49
  196. package/dist/commands/instructions/get.js.map +7 -1
  197. package/dist/commands/instructions/list.js +63 -46
  198. package/dist/commands/instructions/list.js.map +7 -1
  199. package/dist/commands/instructions/promote.js +41 -27
  200. package/dist/commands/instructions/promote.js.map +7 -1
  201. package/dist/commands/instructions/pull.js +37 -21
  202. package/dist/commands/instructions/pull.js.map +7 -1
  203. package/dist/commands/instructions/upstream.js +36 -21
  204. package/dist/commands/instructions/upstream.js.map +7 -1
  205. package/dist/commands/instructions/versions.js +51 -33
  206. package/dist/commands/instructions/versions.js.map +7 -1
  207. package/dist/commands/launcher.js +39 -0
  208. package/dist/commands/launcher.js.map +7 -0
  209. package/dist/commands/org/current.js +74 -68
  210. package/dist/commands/org/current.js.map +7 -1
  211. package/dist/commands/org/list.js +50 -36
  212. package/dist/commands/org/list.js.map +7 -1
  213. package/dist/commands/org/switch.js +69 -51
  214. package/dist/commands/org/switch.js.map +7 -1
  215. package/dist/commands/packs/add-instruction.js +36 -22
  216. package/dist/commands/packs/add-instruction.js.map +7 -1
  217. package/dist/commands/packs/apply.js +38 -24
  218. package/dist/commands/packs/apply.js.map +7 -1
  219. package/dist/commands/packs/create.js +47 -33
  220. package/dist/commands/packs/create.js.map +7 -1
  221. package/dist/commands/packs/fork.js +33 -19
  222. package/dist/commands/packs/fork.js.map +7 -1
  223. package/dist/commands/packs/get.js +54 -35
  224. package/dist/commands/packs/get.js.map +7 -1
  225. package/dist/commands/packs/list.js +64 -47
  226. package/dist/commands/packs/list.js.map +7 -1
  227. package/dist/commands/packs/remove-instruction.js +34 -20
  228. package/dist/commands/packs/remove-instruction.js.map +7 -1
  229. package/dist/commands/proxy/env.js +126 -116
  230. package/dist/commands/proxy/env.js.map +7 -1
  231. package/dist/commands/proxy/logs.js +83 -74
  232. package/dist/commands/proxy/logs.js.map +7 -1
  233. package/dist/commands/proxy/restart.js +34 -36
  234. package/dist/commands/proxy/restart.js.map +7 -1
  235. package/dist/commands/proxy/setup.js +432 -375
  236. package/dist/commands/proxy/setup.js.map +7 -1
  237. package/dist/commands/proxy/start.js +289 -289
  238. package/dist/commands/proxy/start.js.map +7 -1
  239. package/dist/commands/proxy/status.js +74 -64
  240. package/dist/commands/proxy/status.js.map +7 -1
  241. package/dist/commands/proxy/stop.js +81 -75
  242. package/dist/commands/proxy/stop.js.map +7 -1
  243. package/dist/commands/research/backfill.js +58 -0
  244. package/dist/commands/research/backfill.js.map +7 -0
  245. package/dist/commands/research/tail-transcript.js +69 -0
  246. package/dist/commands/research/tail-transcript.js.map +7 -0
  247. package/dist/commands/service/install.js +639 -405
  248. package/dist/commands/service/install.js.map +7 -1
  249. package/dist/commands/service/status.js +178 -111
  250. package/dist/commands/service/status.js.map +7 -1
  251. package/dist/commands/service/uninstall.js +85 -110
  252. package/dist/commands/service/uninstall.js.map +7 -1
  253. package/dist/commands/sessions/analyze.js +46 -25
  254. package/dist/commands/sessions/analyze.js.map +7 -1
  255. package/dist/commands/sessions/end.js +81 -79
  256. package/dist/commands/sessions/end.js.map +7 -1
  257. package/dist/commands/sessions/import.js +44 -27
  258. package/dist/commands/sessions/import.js.map +7 -1
  259. package/dist/commands/sessions/list.js +46 -33
  260. package/dist/commands/sessions/list.js.map +7 -1
  261. package/dist/commands/sessions/start.js +88 -87
  262. package/dist/commands/sessions/start.js.map +7 -1
  263. package/dist/commands/signals/report.js +42 -34
  264. package/dist/commands/signals/report.js.map +7 -1
  265. package/dist/commands/skills/export-approved.js +44 -30
  266. package/dist/commands/skills/export-approved.js.map +7 -1
  267. package/dist/commands/skills/install.js +99 -84
  268. package/dist/commands/skills/install.js.map +7 -1
  269. package/dist/commands/skills/list.js +59 -42
  270. package/dist/commands/skills/list.js.map +7 -1
  271. package/dist/commands/skills/publish.js +95 -78
  272. package/dist/commands/skills/publish.js.map +7 -1
  273. package/dist/commands/skills/search.js +68 -53
  274. package/dist/commands/skills/search.js.map +7 -1
  275. package/dist/commands/skills/update.js +52 -39
  276. package/dist/commands/skills/update.js.map +7 -1
  277. package/dist/commands/suggestions/accept.js +82 -59
  278. package/dist/commands/suggestions/accept.js.map +7 -1
  279. package/dist/commands/suggestions/dismiss.js +44 -26
  280. package/dist/commands/suggestions/dismiss.js.map +7 -1
  281. package/dist/commands/suggestions/list.js +59 -39
  282. package/dist/commands/suggestions/list.js.map +7 -1
  283. package/dist/commands/suggestions/refresh.js +26 -11
  284. package/dist/commands/suggestions/refresh.js.map +7 -1
  285. package/dist/cursor-BGQJ4CWI.js +134 -0
  286. package/dist/cursor-BGQJ4CWI.js.map +7 -0
  287. package/dist/dashboard/Dashboard.js +229 -126
  288. package/dist/dashboard/Dashboard.js.map +7 -1
  289. package/dist/dashboard/data.js +13 -137
  290. package/dist/dashboard/data.js.map +7 -1
  291. package/dist/dashboard/launcher/ActiveJobsList.js +10 -0
  292. package/dist/dashboard/launcher/ActiveJobsList.js.map +7 -0
  293. package/dist/dashboard/launcher/LauncherOverlay.js +14 -0
  294. package/dist/dashboard/launcher/LauncherOverlay.js.map +7 -0
  295. package/dist/dashboard/launcher/NewLaunchForm.js +10 -0
  296. package/dist/dashboard/launcher/NewLaunchForm.js.map +7 -0
  297. package/dist/dashboard/launcher/api.js +14 -0
  298. package/dist/dashboard/launcher/api.js.map +7 -0
  299. package/dist/dashboard/launcher/tool-labels.js +10 -0
  300. package/dist/dashboard/launcher/tool-labels.js.map +7 -0
  301. package/dist/dashboard/launcher/types.js +1 -0
  302. package/dist/dashboard/launcher/types.js.map +7 -0
  303. package/dist/dashboard/launcher/useLaunchJobs.js +9 -0
  304. package/dist/dashboard/launcher/useLaunchJobs.js.map +7 -0
  305. package/dist/dashboard/panels/friction.js +10 -22
  306. package/dist/dashboard/panels/friction.js.map +7 -1
  307. package/dist/dashboard/panels/insights.js +10 -109
  308. package/dist/dashboard/panels/insights.js.map +7 -1
  309. package/dist/dashboard/panels/instructions.js +10 -17
  310. package/dist/dashboard/panels/instructions.js.map +7 -1
  311. package/dist/dashboard/panels/outcomes.js +9 -28
  312. package/dist/dashboard/panels/outcomes.js.map +7 -1
  313. package/dist/dashboard/panels/overview.js +10 -20
  314. package/dist/dashboard/panels/overview.js.map +7 -1
  315. package/dist/dashboard/panels/shared.js +18 -61
  316. package/dist/dashboard/panels/shared.js.map +7 -1
  317. package/dist/dashboard/types.js +23 -26
  318. package/dist/dashboard/types.js.map +7 -1
  319. package/dist/dist-CSUYFYKI.js +52 -0
  320. package/dist/dist-CSUYFYKI.js.map +7 -0
  321. package/dist/index.js +8 -2
  322. package/dist/index.js.map +7 -1
  323. package/dist/lib/active-org-refresh.js +15 -108
  324. package/dist/lib/active-org-refresh.js.map +7 -1
  325. package/dist/lib/active-org.js +15 -95
  326. package/dist/lib/active-org.js.map +7 -1
  327. package/dist/lib/agent-loop.js +44 -0
  328. package/dist/lib/agent-loop.js.map +7 -0
  329. package/dist/lib/antigravity-transcript.js +22 -0
  330. package/dist/lib/antigravity-transcript.js.map +7 -0
  331. package/dist/lib/api-client.js +21 -92
  332. package/dist/lib/api-client.js.map +7 -1
  333. package/dist/lib/auth.js +26 -137
  334. package/dist/lib/auth.js.map +7 -1
  335. package/dist/lib/detect-languages.js +8 -113
  336. package/dist/lib/detect-languages.js.map +7 -1
  337. package/dist/lib/detect-tmux.js +9 -0
  338. package/dist/lib/detect-tmux.js.map +7 -0
  339. package/dist/lib/eval-analyzer.js +9 -89
  340. package/dist/lib/eval-analyzer.js.map +7 -1
  341. package/dist/lib/eval-benchmark.js +12 -92
  342. package/dist/lib/eval-benchmark.js.map +7 -1
  343. package/dist/lib/eval-conversation-handler.js +13 -200
  344. package/dist/lib/eval-conversation-handler.js.map +7 -1
  345. package/dist/lib/eval-executor.js +8 -83
  346. package/dist/lib/eval-executor.js.map +7 -1
  347. package/dist/lib/eval-grader.js +9 -123
  348. package/dist/lib/eval-grader.js.map +7 -1
  349. package/dist/lib/eval-meta-judge.js +9 -116
  350. package/dist/lib/eval-meta-judge.js.map +7 -1
  351. package/dist/lib/eval-trigger-tester.js +11 -96
  352. package/dist/lib/eval-trigger-tester.js.map +7 -1
  353. package/dist/lib/eval-worktree.js +8 -87
  354. package/dist/lib/eval-worktree.js.map +7 -1
  355. package/dist/lib/gateway-entry.js +20 -18
  356. package/dist/lib/gateway-entry.js.map +7 -1
  357. package/dist/lib/gateway-lifecycle.js +22 -97
  358. package/dist/lib/gateway-lifecycle.js.map +7 -1
  359. package/dist/lib/gateway.js +12 -216
  360. package/dist/lib/gateway.js.map +7 -1
  361. package/dist/lib/handlers/cron-close-stale-sessions.js +18 -7
  362. package/dist/lib/handlers/cron-close-stale-sessions.js.map +7 -1
  363. package/dist/lib/handlers/cron-data-integrity-audit.js +21 -15
  364. package/dist/lib/handlers/cron-data-integrity-audit.js.map +7 -1
  365. package/dist/lib/handlers/cron-refresh-skills.js +7 -90
  366. package/dist/lib/handlers/cron-refresh-skills.js.map +7 -1
  367. package/dist/lib/handlers/cron-suggest-instructions.js +14 -158
  368. package/dist/lib/handlers/cron-suggest-instructions.js.map +7 -1
  369. package/dist/lib/handlers/process-announcement.js +11 -0
  370. package/dist/lib/handlers/process-announcement.js.map +7 -0
  371. package/dist/lib/handlers/process-changelog.js +11 -0
  372. package/dist/lib/handlers/process-changelog.js.map +7 -0
  373. package/dist/lib/handlers/process-conversation.js +14 -35
  374. package/dist/lib/handlers/process-conversation.js.map +7 -1
  375. package/dist/lib/handlers/process-eval.js +15 -207
  376. package/dist/lib/handlers/process-eval.js.map +7 -1
  377. package/dist/lib/handlers/process-insights.js +14 -300
  378. package/dist/lib/handlers/process-insights.js.map +7 -1
  379. package/dist/lib/handlers/process-launch.js +16 -41
  380. package/dist/lib/handlers/process-launch.js.map +7 -1
  381. package/dist/lib/handlers/process-run-cleanup.js +13 -0
  382. package/dist/lib/handlers/process-run-cleanup.js.map +7 -0
  383. package/dist/lib/handlers/process-send-message.js +10 -0
  384. package/dist/lib/handlers/process-send-message.js.map +7 -0
  385. package/dist/lib/handlers/process-session-goal.js +11 -74
  386. package/dist/lib/handlers/process-session-goal.js.map +7 -1
  387. package/dist/lib/hooks-config.js +52 -544
  388. package/dist/lib/hooks-config.js.map +7 -1
  389. package/dist/lib/insights-prompts.js +12 -145
  390. package/dist/lib/insights-prompts.js.map +7 -1
  391. package/dist/lib/job-helpers.js +1 -0
  392. package/dist/lib/job-helpers.js.map +7 -0
  393. package/dist/lib/llm-client.js +16 -274
  394. package/dist/lib/llm-client.js.map +7 -1
  395. package/dist/lib/manual-tasks.js +22 -0
  396. package/dist/lib/manual-tasks.js.map +7 -0
  397. package/dist/lib/output.js +12 -36
  398. package/dist/lib/output.js.map +7 -1
  399. package/dist/lib/permanent-job-error.js +10 -23
  400. package/dist/lib/permanent-job-error.js.map +7 -1
  401. package/dist/lib/provider-aggregator.js +57 -55
  402. package/dist/lib/provider-aggregator.js.map +7 -1
  403. package/dist/lib/research-client.js +12 -0
  404. package/dist/lib/research-client.js.map +7 -0
  405. package/dist/lib/skills-loader.js +8 -51
  406. package/dist/lib/skills-loader.js.map +7 -1
  407. package/dist/lib/statusline-shim.js +16 -0
  408. package/dist/lib/statusline-shim.js.map +7 -0
  409. package/dist/lib/terminal-target-heartbeat.js +15 -0
  410. package/dist/lib/terminal-target-heartbeat.js.map +7 -0
  411. package/dist/lib/tmux.js +16 -0
  412. package/dist/lib/tmux.js.map +7 -0
  413. package/dist/lib/transcript-rate-limit-watcher.js +22 -0
  414. package/dist/lib/transcript-rate-limit-watcher.js.map +7 -0
  415. package/dist/lib/types.js +8 -7
  416. package/dist/lib/types.js.map +7 -1
  417. package/dist/lib/version-check.js +10 -106
  418. package/dist/lib/version-check.js.map +7 -1
  419. package/dist/lib/which.js +8 -0
  420. package/dist/lib/which.js.map +7 -0
  421. package/dist/lib/worktree.js +17 -0
  422. package/dist/lib/worktree.js.map +7 -0
  423. package/dist/opencode-IQ7X5YMJ.js +190 -0
  424. package/dist/opencode-IQ7X5YMJ.js.map +7 -0
  425. package/oclif.manifest.json +299 -66
  426. package/package.json +26 -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 -530
  688. package/dist/lib/graphile-worker-runner.js.map +0 -1
  689. package/dist/lib/graphile-worker-runner.test.d.ts +0 -2
  690. package/dist/lib/graphile-worker-runner.test.d.ts.map +0 -1
  691. package/dist/lib/graphile-worker-runner.test.js +0 -153
  692. package/dist/lib/graphile-worker-runner.test.js.map +0 -1
  693. package/dist/lib/handlers/cron-close-stale-sessions.d.ts +0 -3
  694. package/dist/lib/handlers/cron-close-stale-sessions.d.ts.map +0 -1
  695. package/dist/lib/handlers/cron-data-integrity-audit.d.ts +0 -3
  696. package/dist/lib/handlers/cron-data-integrity-audit.d.ts.map +0 -1
  697. package/dist/lib/handlers/cron-refresh-skills.d.ts +0 -3
  698. package/dist/lib/handlers/cron-refresh-skills.d.ts.map +0 -1
  699. package/dist/lib/handlers/cron-refresh-skills.test.d.ts +0 -2
  700. package/dist/lib/handlers/cron-refresh-skills.test.d.ts.map +0 -1
  701. package/dist/lib/handlers/cron-refresh-skills.test.js +0 -114
  702. package/dist/lib/handlers/cron-refresh-skills.test.js.map +0 -1
  703. package/dist/lib/handlers/cron-regenerate-insights.d.ts +0 -3
  704. package/dist/lib/handlers/cron-regenerate-insights.d.ts.map +0 -1
  705. package/dist/lib/handlers/cron-regenerate-insights.js +0 -6
  706. package/dist/lib/handlers/cron-regenerate-insights.js.map +0 -1
  707. package/dist/lib/handlers/cron-suggest-instructions.d.ts +0 -3
  708. package/dist/lib/handlers/cron-suggest-instructions.d.ts.map +0 -1
  709. package/dist/lib/handlers/cron-suggest-instructions.test.d.ts +0 -2
  710. package/dist/lib/handlers/cron-suggest-instructions.test.d.ts.map +0 -1
  711. package/dist/lib/handlers/cron-suggest-instructions.test.js +0 -80
  712. package/dist/lib/handlers/cron-suggest-instructions.test.js.map +0 -1
  713. package/dist/lib/handlers/process-conversation.d.ts +0 -35
  714. package/dist/lib/handlers/process-conversation.d.ts.map +0 -1
  715. package/dist/lib/handlers/process-eval.d.ts +0 -32
  716. package/dist/lib/handlers/process-eval.d.ts.map +0 -1
  717. package/dist/lib/handlers/process-insights.d.ts +0 -39
  718. package/dist/lib/handlers/process-insights.d.ts.map +0 -1
  719. package/dist/lib/handlers/process-launch.d.ts +0 -29
  720. package/dist/lib/handlers/process-launch.d.ts.map +0 -1
  721. package/dist/lib/handlers/process-session-goal.d.ts +0 -29
  722. package/dist/lib/handlers/process-session-goal.d.ts.map +0 -1
  723. package/dist/lib/handlers/process-session-goal.test.d.ts +0 -2
  724. package/dist/lib/handlers/process-session-goal.test.d.ts.map +0 -1
  725. package/dist/lib/handlers/process-session-goal.test.js +0 -134
  726. package/dist/lib/handlers/process-session-goal.test.js.map +0 -1
  727. package/dist/lib/hooks-config.d.ts +0 -119
  728. package/dist/lib/hooks-config.d.ts.map +0 -1
  729. package/dist/lib/hooks-config.test.d.ts +0 -2
  730. package/dist/lib/hooks-config.test.d.ts.map +0 -1
  731. package/dist/lib/hooks-config.test.js +0 -231
  732. package/dist/lib/hooks-config.test.js.map +0 -1
  733. package/dist/lib/insights-prompts.d.ts +0 -13
  734. package/dist/lib/insights-prompts.d.ts.map +0 -1
  735. package/dist/lib/llm-client.d.ts +0 -26
  736. package/dist/lib/llm-client.d.ts.map +0 -1
  737. package/dist/lib/llm-client.test.d.ts +0 -2
  738. package/dist/lib/llm-client.test.d.ts.map +0 -1
  739. package/dist/lib/llm-client.test.js +0 -62
  740. package/dist/lib/llm-client.test.js.map +0 -1
  741. package/dist/lib/mirror-writer-db.d.ts +0 -12
  742. package/dist/lib/mirror-writer-db.d.ts.map +0 -1
  743. package/dist/lib/mirror-writer-db.js +0 -51
  744. package/dist/lib/mirror-writer-db.js.map +0 -1
  745. package/dist/lib/mirror-writer.d.ts +0 -35
  746. package/dist/lib/mirror-writer.d.ts.map +0 -1
  747. package/dist/lib/mirror-writer.js +0 -27
  748. package/dist/lib/mirror-writer.js.map +0 -1
  749. package/dist/lib/mirror-writer.test.d.ts +0 -2
  750. package/dist/lib/mirror-writer.test.d.ts.map +0 -1
  751. package/dist/lib/mirror-writer.test.js +0 -47
  752. package/dist/lib/mirror-writer.test.js.map +0 -1
  753. package/dist/lib/output.d.ts +0 -4
  754. package/dist/lib/output.d.ts.map +0 -1
  755. package/dist/lib/output.test.d.ts +0 -2
  756. package/dist/lib/output.test.d.ts.map +0 -1
  757. package/dist/lib/output.test.js +0 -71
  758. package/dist/lib/output.test.js.map +0 -1
  759. package/dist/lib/permanent-job-error.d.ts +0 -17
  760. package/dist/lib/permanent-job-error.d.ts.map +0 -1
  761. package/dist/lib/permanent-job-error.test.d.ts +0 -2
  762. package/dist/lib/permanent-job-error.test.d.ts.map +0 -1
  763. package/dist/lib/permanent-job-error.test.js +0 -29
  764. package/dist/lib/permanent-job-error.test.js.map +0 -1
  765. package/dist/lib/provider-aggregator.d.ts +0 -24
  766. package/dist/lib/provider-aggregator.d.ts.map +0 -1
  767. package/dist/lib/provider-aggregator.test.d.ts +0 -2
  768. package/dist/lib/provider-aggregator.test.d.ts.map +0 -1
  769. package/dist/lib/provider-aggregator.test.js +0 -103
  770. package/dist/lib/provider-aggregator.test.js.map +0 -1
  771. package/dist/lib/skills-loader.d.ts +0 -6
  772. package/dist/lib/skills-loader.d.ts.map +0 -1
  773. package/dist/lib/types.d.ts +0 -48
  774. package/dist/lib/types.d.ts.map +0 -1
  775. package/dist/lib/version-check.d.ts +0 -11
  776. package/dist/lib/version-check.d.ts.map +0 -1
  777. package/dist/test-helpers.d.ts +0 -58
  778. package/dist/test-helpers.d.ts.map +0 -1
  779. package/dist/test-helpers.js +0 -58
  780. package/dist/test-helpers.js.map +0 -1
@@ -0,0 +1,307 @@
1
+ import {
2
+ ApiError,
3
+ api
4
+ } from "./chunk-EJOI2ZGU.js";
5
+
6
+ // src/lib/antigravity-transcript.ts
7
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmdirSync, writeFileSync } from "node:fs";
8
+ import { homedir, tmpdir } from "node:os";
9
+ import { join } from "node:path";
10
+ var MAX_RECORDS_PER_FIRE = 100;
11
+ var TOOL_CALL_TYPES = /* @__PURE__ */ new Set([
12
+ "RUN_COMMAND",
13
+ "VIEW_FILE",
14
+ "LIST_DIRECTORY",
15
+ "CODE_ACTION",
16
+ "GREP_SEARCH",
17
+ "SEARCH_WEB"
18
+ ]);
19
+ var SKIP_TYPES = /* @__PURE__ */ new Set([
20
+ "CONVERSATION_HISTORY",
21
+ "KNOWLEDGE_ARTIFACTS",
22
+ "CHECKPOINT"
23
+ ]);
24
+ function configDir() {
25
+ return process.env.RULEMETRIC_CONFIG_DIR ?? join(homedir(), ".config", "rulemetric");
26
+ }
27
+ function stateDir() {
28
+ return join(configDir(), "antigravity-state");
29
+ }
30
+ function stateFile(conversationId) {
31
+ return join(stateDir(), `${conversationId}.json`);
32
+ }
33
+ function loadEnvFile() {
34
+ const envPath = join(configDir(), "env");
35
+ if (!existsSync(envPath)) return;
36
+ try {
37
+ const text = readFileSync(envPath, "utf-8");
38
+ for (const line of text.split(/\r?\n/)) {
39
+ const m = line.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/);
40
+ if (!m) continue;
41
+ const key = m[1];
42
+ if (process.env[key] !== void 0) continue;
43
+ let value = m[2];
44
+ if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
45
+ value = value.slice(1, -1);
46
+ }
47
+ process.env[key] = value;
48
+ }
49
+ } catch {
50
+ }
51
+ }
52
+ function loadState(conversationId) {
53
+ try {
54
+ const text = readFileSync(stateFile(conversationId), "utf-8");
55
+ const parsed = JSON.parse(text);
56
+ if (parsed && typeof parsed === "object" && "lastStepIdx" in parsed) {
57
+ const v = parsed.lastStepIdx;
58
+ if (typeof v === "number" && Number.isFinite(v)) {
59
+ return { lastStepIdx: v };
60
+ }
61
+ }
62
+ } catch {
63
+ }
64
+ return null;
65
+ }
66
+ function saveState(conversationId, state) {
67
+ mkdirSync(stateDir(), { recursive: true });
68
+ const target = stateFile(conversationId);
69
+ const tmpPath = `${target}.tmp`;
70
+ writeFileSync(tmpPath, JSON.stringify(state), { mode: 384 });
71
+ try {
72
+ renameSync(tmpPath, target);
73
+ } catch {
74
+ writeFileSync(target, JSON.stringify(state), { mode: 384 });
75
+ }
76
+ }
77
+ function resolveRwSessionId(externalSessionId) {
78
+ const tempDir = process.env.TMPDIR ?? tmpdir();
79
+ const rulemetricTempDir = join(tempDir, "rulemetric");
80
+ const path = join(rulemetricTempDir, externalSessionId);
81
+ try {
82
+ const id = readFileSync(path, "utf-8").trim();
83
+ return id || null;
84
+ } catch {
85
+ return null;
86
+ }
87
+ }
88
+ function nextSequence(externalSessionId) {
89
+ const tempDir = process.env.TMPDIR ?? tmpdir();
90
+ const rulemetricTempDir = join(tempDir, "rulemetric");
91
+ const seqPath = join(rulemetricTempDir, `${externalSessionId}.seq`);
92
+ const lockDir = join(rulemetricTempDir, `${externalSessionId}.seqlock`);
93
+ const deadline = Date.now() + 5e3;
94
+ while (Date.now() < deadline) {
95
+ try {
96
+ mkdirSync(lockDir);
97
+ break;
98
+ } catch {
99
+ }
100
+ }
101
+ let seq = 1;
102
+ try {
103
+ seq = parseInt(readFileSync(seqPath, "utf-8").trim(), 10) + 1;
104
+ if (!Number.isFinite(seq) || seq < 1) seq = 1;
105
+ } catch {
106
+ seq = 1;
107
+ }
108
+ try {
109
+ writeFileSync(seqPath, String(seq));
110
+ } catch {
111
+ }
112
+ try {
113
+ rmdirSync(lockDir);
114
+ } catch {
115
+ }
116
+ return seq;
117
+ }
118
+ function readNewRecords(transcriptPath, afterStepIdx) {
119
+ let text;
120
+ try {
121
+ text = readFileSync(transcriptPath, "utf-8");
122
+ } catch {
123
+ return [];
124
+ }
125
+ const out = [];
126
+ for (const line of text.split(/\r?\n/)) {
127
+ if (!line.trim()) continue;
128
+ try {
129
+ const r = JSON.parse(line);
130
+ if (typeof r.step_index === "number" && r.step_index > afterStepIdx) {
131
+ out.push(r);
132
+ }
133
+ } catch {
134
+ }
135
+ }
136
+ out.sort((a, b) => a.step_index - b.step_index);
137
+ return out;
138
+ }
139
+ function findMaxStepIndex(transcriptPath) {
140
+ let text;
141
+ try {
142
+ text = readFileSync(transcriptPath, "utf-8");
143
+ } catch {
144
+ return -1;
145
+ }
146
+ let max = -1;
147
+ for (const line of text.split(/\r?\n/)) {
148
+ if (!line.trim()) continue;
149
+ try {
150
+ const r = JSON.parse(line);
151
+ if (typeof r.step_index === "number" && r.step_index > max) max = r.step_index;
152
+ } catch {
153
+ }
154
+ }
155
+ return max;
156
+ }
157
+ function extractUserPrompt(raw) {
158
+ const m = raw.match(/<USER_REQUEST>\s*([\s\S]*?)\s*<\/USER_REQUEST>/);
159
+ return m ? m[1].trim() : raw.trim();
160
+ }
161
+ function classifyRecord(record, sequence) {
162
+ const timestamp = record.created_at ?? (/* @__PURE__ */ new Date()).toISOString();
163
+ const metadata = {
164
+ antigravityStepIndex: record.step_index,
165
+ antigravitySource: record.source,
166
+ antigravityType: record.type
167
+ };
168
+ if (SKIP_TYPES.has(record.type)) return null;
169
+ if (TOOL_CALL_TYPES.has(record.type)) return null;
170
+ if (record.source === "USER_EXPLICIT" && record.type === "USER_INPUT") {
171
+ return {
172
+ sequence,
173
+ // The events API accepts `user_message` (Claude Code's convention) but
174
+ // rejects `user_prompt`. Stay aligned with the existing vocabulary so
175
+ // the same downstream readers (insights, dashboard) light up for
176
+ // Antigravity sessions without API changes.
177
+ eventType: "user_message",
178
+ content: extractUserPrompt(record.content ?? ""),
179
+ timestamp,
180
+ metadata
181
+ };
182
+ }
183
+ if (record.source === "MODEL" && record.type === "PLANNER_RESPONSE") {
184
+ const parts = [];
185
+ if (record.thinking && record.thinking.trim()) {
186
+ parts.push(`[thinking]
187
+ ${record.thinking.trim()}`);
188
+ }
189
+ if (record.content && record.content.trim()) {
190
+ parts.push(record.content.trim());
191
+ }
192
+ if (record.tool_calls && record.tool_calls.length > 0) {
193
+ metadata.antigravityToolCalls = record.tool_calls.map((tc) => tc.name).filter(Boolean);
194
+ }
195
+ return {
196
+ sequence,
197
+ eventType: "assistant_response",
198
+ content: parts.join("\n\n") || null,
199
+ timestamp,
200
+ metadata
201
+ };
202
+ }
203
+ if (record.source === "MODEL" && record.type === "GENERIC") {
204
+ return {
205
+ sequence,
206
+ eventType: "tool_result",
207
+ content: record.content ?? null,
208
+ timestamp,
209
+ metadata
210
+ };
211
+ }
212
+ if (record.source === "SYSTEM" && (record.type === "SYSTEM_MESSAGE" || record.type === "ERROR_MESSAGE")) {
213
+ return null;
214
+ }
215
+ return {
216
+ sequence,
217
+ eventType: `antigravity_${record.type.toLowerCase()}`,
218
+ content: record.content ?? null,
219
+ timestamp,
220
+ metadata
221
+ };
222
+ }
223
+ function parseHookPayload(stdin) {
224
+ try {
225
+ const parsed = JSON.parse(stdin);
226
+ return parsed && typeof parsed === "object" ? parsed : null;
227
+ } catch {
228
+ return null;
229
+ }
230
+ }
231
+ async function emitRecordsAsEvents(records, rwSessionId, conversationId, initialHighestStepIdx, options = {}) {
232
+ const sink = options.errorSink ?? ((line) => process.stderr.write(line));
233
+ let attempted = 0;
234
+ let emitted = 0;
235
+ let failed = 0;
236
+ let skipped = 0;
237
+ let highest = initialHighestStepIdx;
238
+ for (const record of records) {
239
+ attempted++;
240
+ options.onProgress?.({ attempted, total: records.length, record });
241
+ const sequence = nextSequence(conversationId);
242
+ const event = classifyRecord(record, sequence);
243
+ if (!event) {
244
+ skipped++;
245
+ } else {
246
+ try {
247
+ await api(`/api/sessions/${rwSessionId}/events`, {
248
+ method: "POST",
249
+ body: event
250
+ });
251
+ emitted++;
252
+ } catch (err) {
253
+ failed++;
254
+ const code = err instanceof ApiError ? err.statusCode : "unknown";
255
+ sink(
256
+ `[antigravity-tailer] failed step=${record.step_index} type=${record.type} status=${code}
257
+ `
258
+ );
259
+ }
260
+ }
261
+ if (record.step_index > highest) highest = record.step_index;
262
+ }
263
+ return { attempted, emitted, failed, skipped, highestStepIdx: highest };
264
+ }
265
+ async function tailAntigravityTranscript(stdin) {
266
+ const payload = parseHookPayload(stdin);
267
+ if (!payload?.conversationId || !payload?.transcriptPath) return;
268
+ loadEnvFile();
269
+ if (!process.env.RULEMETRIC_API_URL) return;
270
+ const rwSessionId = resolveRwSessionId(payload.conversationId);
271
+ if (!rwSessionId) return;
272
+ const existingState = loadState(payload.conversationId);
273
+ if (existingState === null) {
274
+ const primed = findMaxStepIndex(payload.transcriptPath);
275
+ saveState(payload.conversationId, { lastStepIdx: primed });
276
+ return;
277
+ }
278
+ let records = readNewRecords(payload.transcriptPath, existingState.lastStepIdx);
279
+ if (records.length === 0) return;
280
+ if (records.length > MAX_RECORDS_PER_FIRE) {
281
+ records = records.slice(0, MAX_RECORDS_PER_FIRE);
282
+ }
283
+ const result = await emitRecordsAsEvents(
284
+ records,
285
+ rwSessionId,
286
+ payload.conversationId,
287
+ existingState.lastStepIdx
288
+ );
289
+ saveState(payload.conversationId, { lastStepIdx: result.highestStepIdx });
290
+ }
291
+ var stateApi = {
292
+ load: loadState,
293
+ save: saveState,
294
+ resolveRwSessionId,
295
+ loadEnvFile
296
+ };
297
+
298
+ export {
299
+ readNewRecords,
300
+ findMaxStepIndex,
301
+ extractUserPrompt,
302
+ classifyRecord,
303
+ emitRecordsAsEvents,
304
+ tailAntigravityTranscript,
305
+ stateApi
306
+ };
307
+ //# sourceMappingURL=chunk-EHZJ6OXD.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/antigravity-transcript.ts"],
4
+ "sourcesContent": ["// Antigravity transcript tailer.\n//\n// Antigravity fires PreToolUse/PostToolUse hooks but no UserPromptSubmit /\n// Stop hooks, and the Gemini streaming traffic bypasses the proxy entirely\n// (the language_server binary opens direct sockets to\n// generativelanguage.googleapis.com). However, every hook payload includes\n// a `transcriptPath` pointing at a JSONL file that contains the full\n// conversation: user inputs, planner responses (with thinking), tool calls,\n// and tool results \u2014 all step-indexed.\n//\n// On each post-tool-use fire we tail that file forward from the last\n// step_index we processed and emit RuleMetric events for the new records.\n\nimport { existsSync, mkdirSync, readFileSync, renameSync, rmdirSync, writeFileSync } from 'node:fs';\nimport { homedir, tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { api, ApiError } from './api-client.js';\n\ninterface HookPayload {\n conversationId?: string;\n transcriptPath?: string;\n}\n\ninterface TranscriptRecord {\n step_index: number;\n source: 'USER_EXPLICIT' | 'SYSTEM' | 'MODEL' | string;\n type: string;\n status?: string;\n created_at?: string;\n content?: string;\n thinking?: string;\n tool_calls?: Array<{ name?: string; args?: Record<string, unknown> }>;\n error?: string;\n}\n\ninterface State {\n lastStepIdx: number;\n}\n\n// Antigravity caps hook execution at 30s. Each emitted event is one HTTP\n// POST; at ~50ms/POST a fresh session with thousands of records would blow\n// the timeout. On first fire we therefore SKIP the backlog and prime\n// state to the current transcript end \u2014 only forward-going events get\n// captured. Subsequent fires process the new tail. We also hard-cap any\n// single fire to keep the latency bounded after a pause.\nconst MAX_RECORDS_PER_FIRE = 100;\n\ninterface OutgoingEvent {\n sequence: number;\n eventType: string;\n content: string | null;\n toolName?: string | null;\n toolInput?: Record<string, unknown> | null;\n toolOutput?: Record<string, unknown> | null;\n timestamp: string;\n metadata?: Record<string, unknown>;\n}\n\n// Tool call types are already captured by the PostToolUse hook itself.\n// We skip them in the transcript pass to avoid duplicate events.\nconst TOOL_CALL_TYPES = new Set([\n 'RUN_COMMAND',\n 'VIEW_FILE',\n 'LIST_DIRECTORY',\n 'CODE_ACTION',\n 'GREP_SEARCH',\n 'SEARCH_WEB',\n]);\n\n// Housekeeping records with no user-visible content.\nconst SKIP_TYPES = new Set([\n 'CONVERSATION_HISTORY',\n 'KNOWLEDGE_ARTIFACTS',\n 'CHECKPOINT',\n]);\n\nfunction configDir(): string {\n return process.env.RULEMETRIC_CONFIG_DIR ?? join(homedir(), '.config', 'rulemetric');\n}\n\nfunction stateDir(): string {\n return join(configDir(), 'antigravity-state');\n}\n\nfunction stateFile(conversationId: string): string {\n return join(stateDir(), `${conversationId}.json`);\n}\n\nfunction loadEnvFile(): void {\n // Mirror the bash _config.sh fallback: if RULEMETRIC_API_URL / _API_KEY are\n // unset in process.env (because launchd-inherited env didn't carry them),\n // read them from ~/.config/rulemetric/env.\n const envPath = join(configDir(), 'env');\n if (!existsSync(envPath)) return;\n try {\n const text = readFileSync(envPath, 'utf-8');\n for (const line of text.split(/\\r?\\n/)) {\n const m = line.match(/^([A-Z_][A-Z0-9_]*)=(.*)$/);\n if (!m) continue;\n const key = m[1];\n // Don't override an existing value \u2014 env wins over file.\n if (process.env[key] !== undefined) continue;\n let value = m[2];\n // Strip surrounding quotes if present.\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n process.env[key] = value;\n }\n } catch {\n // Best effort.\n }\n}\n\nfunction loadState(conversationId: string): State | null {\n try {\n const text = readFileSync(stateFile(conversationId), 'utf-8');\n const parsed = JSON.parse(text) as unknown;\n if (parsed && typeof parsed === 'object' && 'lastStepIdx' in parsed) {\n const v = (parsed as { lastStepIdx: unknown }).lastStepIdx;\n if (typeof v === 'number' && Number.isFinite(v)) {\n return { lastStepIdx: v };\n }\n }\n } catch {\n // First fire for this conversation \u2014 return null so caller can prime.\n }\n return null;\n}\n\nfunction saveState(conversationId: string, state: State): void {\n mkdirSync(stateDir(), { recursive: true });\n const target = stateFile(conversationId);\n const tmpPath = `${target}.tmp`;\n writeFileSync(tmpPath, JSON.stringify(state), { mode: 0o600 });\n try {\n renameSync(tmpPath, target);\n } catch {\n writeFileSync(target, JSON.stringify(state), { mode: 0o600 });\n }\n}\n\nfunction resolveRwSessionId(externalSessionId: string): string | null {\n // The bash hook writes the RW session UUID to $TMPDIR/rulemetric/<id>.\n const tempDir = process.env.TMPDIR ?? tmpdir();\n const rulemetricTempDir = join(tempDir, 'rulemetric');\n const path = join(rulemetricTempDir, externalSessionId);\n try {\n const id = readFileSync(path, 'utf-8').trim();\n return id || null;\n } catch {\n return null;\n }\n}\n\nfunction nextSequence(externalSessionId: string): number {\n const tempDir = process.env.TMPDIR ?? tmpdir();\n const rulemetricTempDir = join(tempDir, 'rulemetric');\n const seqPath = join(rulemetricTempDir, `${externalSessionId}.seq`);\n const lockDir = join(rulemetricTempDir, `${externalSessionId}.seqlock`);\n\n // Acquire the same mkdir-based lock the bash script uses, so seq numbers\n // remain strictly monotonic when the tailer and bash script interleave.\n const deadline = Date.now() + 5_000;\n while (Date.now() < deadline) {\n try {\n mkdirSync(lockDir);\n break;\n } catch {\n // Spin.\n }\n }\n\n let seq = 1;\n try {\n seq = parseInt(readFileSync(seqPath, 'utf-8').trim(), 10) + 1;\n if (!Number.isFinite(seq) || seq < 1) seq = 1;\n } catch {\n seq = 1;\n }\n try {\n writeFileSync(seqPath, String(seq));\n } catch {\n // ignore\n }\n try {\n rmdirSync(lockDir);\n } catch {\n // ignore\n }\n return seq;\n}\n\n/**\n * Read transcript.jsonl, parse each line as a TranscriptRecord, return only\n * records whose step_index is strictly greater than `afterStepIdx`.\n * Records with malformed JSON are silently dropped.\n */\nexport function readNewRecords(\n transcriptPath: string,\n afterStepIdx: number,\n): TranscriptRecord[] {\n let text: string;\n try {\n text = readFileSync(transcriptPath, 'utf-8');\n } catch {\n return [];\n }\n const out: TranscriptRecord[] = [];\n for (const line of text.split(/\\r?\\n/)) {\n if (!line.trim()) continue;\n try {\n const r = JSON.parse(line) as TranscriptRecord;\n if (typeof r.step_index === 'number' && r.step_index > afterStepIdx) {\n out.push(r);\n }\n } catch {\n // skip malformed lines\n }\n }\n // Defensive: keep monotonic order (transcript already is, but don't trust).\n out.sort((a, b) => a.step_index - b.step_index);\n return out;\n}\n\n/** Highest step_index present in the transcript, or -1 if empty/unreadable. */\nexport function findMaxStepIndex(transcriptPath: string): number {\n let text: string;\n try {\n text = readFileSync(transcriptPath, 'utf-8');\n } catch {\n return -1;\n }\n let max = -1;\n for (const line of text.split(/\\r?\\n/)) {\n if (!line.trim()) continue;\n try {\n const r = JSON.parse(line) as { step_index?: unknown };\n if (typeof r.step_index === 'number' && r.step_index > max) max = r.step_index;\n } catch {\n // skip\n }\n }\n return max;\n}\n\n/**\n * Strip Antigravity's <USER_REQUEST>...</USER_REQUEST> wrapper from a\n * USER_INPUT record's content. Returns the original string if no wrapper\n * is present. Some user inputs have additional non-request fragments after\n * the request block (e.g. <ADDITIONAL_CONTEXT>...) \u2014 we keep only the\n * request body since that's the actual prompt text.\n */\nexport function extractUserPrompt(raw: string): string {\n const m = raw.match(/<USER_REQUEST>\\s*([\\s\\S]*?)\\s*<\\/USER_REQUEST>/);\n return m ? m[1].trim() : raw.trim();\n}\n\n/**\n * Classify a transcript record into an outgoing RuleMetric event, or null\n * if the record should be skipped.\n */\nexport function classifyRecord(\n record: TranscriptRecord,\n sequence: number,\n): OutgoingEvent | null {\n const timestamp = record.created_at ?? new Date().toISOString();\n const metadata: Record<string, unknown> = {\n antigravityStepIndex: record.step_index,\n antigravitySource: record.source,\n antigravityType: record.type,\n };\n\n if (SKIP_TYPES.has(record.type)) return null;\n // Tool-call types are owned by the PostToolUse hook regardless of who\n // initiated them (MODEL agent calls + USER_EXPLICIT file-opens both fall\n // here). Skip in the transcript pass to avoid duplicates and fallback\n // event types the API doesn't accept.\n if (TOOL_CALL_TYPES.has(record.type)) return null;\n\n if (record.source === 'USER_EXPLICIT' && record.type === 'USER_INPUT') {\n return {\n sequence,\n // The events API accepts `user_message` (Claude Code's convention) but\n // rejects `user_prompt`. Stay aligned with the existing vocabulary so\n // the same downstream readers (insights, dashboard) light up for\n // Antigravity sessions without API changes.\n eventType: 'user_message',\n content: extractUserPrompt(record.content ?? ''),\n timestamp,\n metadata,\n };\n }\n\n if (record.source === 'MODEL' && record.type === 'PLANNER_RESPONSE') {\n const parts: string[] = [];\n if (record.thinking && record.thinking.trim()) {\n parts.push(`[thinking]\\n${record.thinking.trim()}`);\n }\n if (record.content && record.content.trim()) {\n parts.push(record.content.trim());\n }\n if (record.tool_calls && record.tool_calls.length > 0) {\n metadata.antigravityToolCalls = record.tool_calls.map((tc) => tc.name).filter(Boolean);\n }\n return {\n sequence,\n eventType: 'assistant_response',\n content: parts.join('\\n\\n') || null,\n timestamp,\n metadata,\n };\n }\n\n if (record.source === 'MODEL' && record.type === 'GENERIC') {\n return {\n sequence,\n eventType: 'tool_result',\n content: record.content ?? null,\n timestamp,\n metadata,\n };\n }\n\n if (record.source === 'SYSTEM' && (record.type === 'SYSTEM_MESSAGE' || record.type === 'ERROR_MESSAGE')) {\n // The events API doesn't currently accept a `system_message` eventType.\n // Skip rather than fabricate \u2014 these are housekeeping/error records and\n // losing them doesn't break the user-facing capture story. Revisit if\n // SYSTEM records ever carry user-relevant content.\n return null;\n }\n\n // Unknown (source, type) \u2014 keep with a generic eventType so we don't\n // lose data and can extend the classifier later from real samples.\n return {\n sequence,\n eventType: `antigravity_${record.type.toLowerCase()}`,\n content: record.content ?? null,\n timestamp,\n metadata,\n };\n}\n\nfunction parseHookPayload(stdin: string): HookPayload | null {\n try {\n const parsed = JSON.parse(stdin) as HookPayload;\n return parsed && typeof parsed === 'object' ? parsed : null;\n } catch {\n return null;\n }\n}\n\ninterface EmitResult {\n attempted: number;\n emitted: number;\n failed: number;\n skipped: number;\n highestStepIdx: number;\n}\n\ninterface EmitOptions {\n /** Called once per record processed; useful for CLI progress. */\n onProgress?: (info: { attempted: number; total: number; record: TranscriptRecord }) => void;\n /** Where to write per-failure diagnostic lines. Defaults to process.stderr. */\n errorSink?: (line: string) => void;\n}\n\n/**\n * POST a sequence of transcript records as RuleMetric events on `rwSessionId`.\n * Returns counters describing what happened. Never throws \u2014 individual POST\n * failures are reported via `errorSink` and counted as `failed`.\n *\n * The sequence number for each event is drawn from the shared per-conversation\n * counter at `$TMPDIR/rulemetric/<conversationId>.seq` (the bash hook reads\n * and writes the same file). The caller is responsible for persisting state\n * after this returns.\n */\nexport async function emitRecordsAsEvents(\n records: TranscriptRecord[],\n rwSessionId: string,\n conversationId: string,\n initialHighestStepIdx: number,\n options: EmitOptions = {},\n): Promise<EmitResult> {\n const sink = options.errorSink ?? ((line) => process.stderr.write(line));\n let attempted = 0;\n let emitted = 0;\n let failed = 0;\n let skipped = 0;\n let highest = initialHighestStepIdx;\n\n for (const record of records) {\n attempted++;\n options.onProgress?.({ attempted, total: records.length, record });\n const sequence = nextSequence(conversationId);\n const event = classifyRecord(record, sequence);\n if (!event) {\n skipped++;\n } else {\n try {\n await api(`/api/sessions/${rwSessionId}/events`, {\n method: 'POST',\n body: event,\n });\n emitted++;\n } catch (err) {\n failed++;\n const code = err instanceof ApiError ? err.statusCode : 'unknown';\n sink(\n `[antigravity-tailer] failed step=${record.step_index} type=${record.type} status=${code}\\n`,\n );\n }\n }\n if (record.step_index > highest) highest = record.step_index;\n }\n\n return { attempted, emitted, failed, skipped, highestStepIdx: highest };\n}\n\n/**\n * Tail the Antigravity transcript described by the hook payload, POSTing\n * any new events to the RuleMetric API. Never throws \u2014 best-effort, errors\n * land on stderr.\n */\nexport async function tailAntigravityTranscript(stdin: string): Promise<void> {\n const payload = parseHookPayload(stdin);\n if (!payload?.conversationId || !payload?.transcriptPath) return;\n\n loadEnvFile();\n if (!process.env.RULEMETRIC_API_URL) return;\n\n const rwSessionId = resolveRwSessionId(payload.conversationId);\n if (!rwSessionId) return;\n\n const existingState = loadState(payload.conversationId);\n if (existingState === null) {\n // First fire for this conversation. Prime state to the current end of\n // the transcript instead of replaying history through 800+ HTTP POSTs \u2014\n // that would blow Antigravity's 30s hook timeout. Capture is\n // forward-only from the moment hooks are installed for a conversation.\n // Use `rulemetric antigravity backfill` to seed historical events.\n const primed = findMaxStepIndex(payload.transcriptPath);\n saveState(payload.conversationId, { lastStepIdx: primed });\n return;\n }\n\n let records = readNewRecords(payload.transcriptPath, existingState.lastStepIdx);\n if (records.length === 0) return;\n if (records.length > MAX_RECORDS_PER_FIRE) {\n records = records.slice(0, MAX_RECORDS_PER_FIRE);\n }\n\n const result = await emitRecordsAsEvents(\n records,\n rwSessionId,\n payload.conversationId,\n existingState.lastStepIdx,\n );\n saveState(payload.conversationId, { lastStepIdx: result.highestStepIdx });\n}\n\n/**\n * Helpers exposed for the backfill command. Re-exporting from one place so\n * the command surface stays decoupled from filesystem layout.\n */\nexport const stateApi = {\n load: loadState,\n save: saveState,\n resolveRwSessionId,\n loadEnvFile,\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,109 @@
1
+ import {
2
+ loadToken
3
+ } from "./chunk-KZRFUXGF.js";
4
+
5
+ // src/lib/api-client.ts
6
+ import { fileURLToPath } from "node:url";
7
+ import { existsSync, readFileSync } from "node:fs";
8
+ import { dirname, join } from "node:path";
9
+ function readCliVersion() {
10
+ let dir = dirname(fileURLToPath(import.meta.url));
11
+ for (let i = 0; i < 8; i++) {
12
+ const pj = join(dir, "package.json");
13
+ if (existsSync(pj)) {
14
+ try {
15
+ const parsed = JSON.parse(readFileSync(pj, "utf8"));
16
+ if (parsed.name === "@rulemetric/cli" && parsed.version) return parsed.version;
17
+ } catch {
18
+ }
19
+ }
20
+ const parent = dirname(dir);
21
+ if (parent === dir) break;
22
+ dir = parent;
23
+ }
24
+ return "0.0.0";
25
+ }
26
+ var version = readCliVersion();
27
+ var ApiError = class extends Error {
28
+ constructor(statusCode, message) {
29
+ super(message);
30
+ this.statusCode = statusCode;
31
+ this.name = "ApiError";
32
+ }
33
+ };
34
+ function getBaseUrl() {
35
+ const url = process.env.RULEMETRIC_API_URL ?? "http://localhost:3000";
36
+ const parsed = new URL(url);
37
+ if (parsed.protocol === "http:" && parsed.hostname !== "localhost" && parsed.hostname !== "127.0.0.1") {
38
+ throw new Error(`API URL must use HTTPS for non-localhost hosts: ${url}`);
39
+ }
40
+ return url;
41
+ }
42
+ async function api(path, options = {}) {
43
+ const baseUrl = getBaseUrl();
44
+ const url = `${baseUrl}${path}`;
45
+ const headers = {
46
+ "Content-Type": "application/json",
47
+ "User-Agent": `rulemetric-cli/${version}`,
48
+ ...options.headers
49
+ };
50
+ const apiKey = process.env.RULEMETRIC_API_KEY;
51
+ if (apiKey) {
52
+ headers["Authorization"] = `Bearer ${apiKey}`;
53
+ }
54
+ if (!apiKey) {
55
+ const token = loadToken();
56
+ if (token) {
57
+ headers["Authorization"] = `Bearer ${token.accessToken}`;
58
+ }
59
+ }
60
+ const parsed = new URL(url);
61
+ const isLocalhost = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1";
62
+ const savedProxy = process.env.HTTPS_PROXY;
63
+ const savedHttpProxy = process.env.HTTP_PROXY;
64
+ if (isLocalhost) {
65
+ delete process.env.HTTPS_PROXY;
66
+ delete process.env.HTTP_PROXY;
67
+ }
68
+ let response;
69
+ try {
70
+ response = await fetch(url, {
71
+ method: options.method ?? "GET",
72
+ headers,
73
+ body: options.body ? JSON.stringify(options.body) : void 0
74
+ });
75
+ } finally {
76
+ if (isLocalhost) {
77
+ if (savedProxy !== void 0) process.env.HTTPS_PROXY = savedProxy;
78
+ if (savedHttpProxy !== void 0) process.env.HTTP_PROXY = savedHttpProxy;
79
+ }
80
+ }
81
+ let responseBody;
82
+ const contentType = response.headers.get("content-type");
83
+ if (contentType?.includes("application/json")) {
84
+ responseBody = await response.json();
85
+ } else {
86
+ responseBody = await response.text();
87
+ }
88
+ if (!response.ok) {
89
+ const message = responseBody && typeof responseBody === "object" && "error" in responseBody ? String(responseBody.error) : `HTTP ${response.status}`;
90
+ throw new ApiError(response.status, message);
91
+ }
92
+ return responseBody;
93
+ }
94
+ var apiGet = (path) => api(path);
95
+ var apiPost = (path, body) => api(path, { method: "POST", body });
96
+ var apiPut = (path, body) => api(path, { method: "PUT", body });
97
+ var apiPatch = (path, body) => api(path, { method: "PATCH", body });
98
+ var apiDelete = (path) => api(path, { method: "DELETE" });
99
+
100
+ export {
101
+ ApiError,
102
+ api,
103
+ apiGet,
104
+ apiPost,
105
+ apiPut,
106
+ apiPatch,
107
+ apiDelete
108
+ };
109
+ //# sourceMappingURL=chunk-EJOI2ZGU.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/api-client.ts"],
4
+ "sourcesContent": ["import { fileURLToPath } from 'node:url';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { loadToken } from './auth.js';\n\n/**\n * Read the CLI's own version. Walks up from this module's location to find\n * `@rulemetric/cli`'s package.json \u2014 robust whether running unbundled from\n * `src/lib/` (dev) or from a bundled chunk at a different `dist/` depth (prod),\n * where a fixed relative `../../package.json` would resolve to the wrong file.\n */\nfunction readCliVersion(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 8; i++) {\n const pj = join(dir, 'package.json');\n if (existsSync(pj)) {\n try {\n const parsed = JSON.parse(readFileSync(pj, 'utf8')) as { name?: string; version?: string };\n if (parsed.name === '@rulemetric/cli' && parsed.version) return parsed.version;\n } catch {\n /* unreadable/parse error \u2014 keep walking up */\n }\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return '0.0.0';\n}\n\nconst version = readCliVersion();\n\nexport class ApiError extends Error {\n constructor(\n public statusCode: number,\n message: string,\n ) {\n super(message);\n this.name = 'ApiError';\n }\n}\n\ninterface ApiOptions {\n method?: string;\n body?: unknown;\n headers?: Record<string, string>;\n}\n\nfunction getBaseUrl(): string {\n const url = process.env.RULEMETRIC_API_URL ?? 'http://localhost:3000';\n\n // Enforce HTTPS for non-localhost URLs\n const parsed = new URL(url);\n if (parsed.protocol === 'http:' && parsed.hostname !== 'localhost' && parsed.hostname !== '127.0.0.1') {\n throw new Error(`API URL must use HTTPS for non-localhost hosts: ${url}`);\n }\n\n return url;\n}\n\nexport async function api<T>(path: string, options: ApiOptions = {}): Promise<T> {\n const baseUrl = getBaseUrl();\n const url = `${baseUrl}${path}`;\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': `rulemetric-cli/${version}`,\n ...options.headers,\n };\n\n // API key (preferred for CLI/hooks/proxy \u2014 long-lived)\n const apiKey = process.env.RULEMETRIC_API_KEY;\n if (apiKey) {\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n // Supabase JWT (fallback \u2014 used right after login before key is created)\n if (!apiKey) {\n const token = loadToken();\n if (token) {\n headers['Authorization'] = `Bearer ${token.accessToken}`;\n }\n }\n\n // Bypass proxy for localhost API calls \u2014 HTTPS_PROXY is for Claude Code \u2192 Anthropic,\n // not for CLI \u2192 local API. Node.js fetch doesn't respect NO_PROXY reliably, so we\n // temporarily unset the proxy env vars for localhost calls.\n const parsed = new URL(url);\n const isLocalhost = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';\n const savedProxy = process.env.HTTPS_PROXY;\n const savedHttpProxy = process.env.HTTP_PROXY;\n if (isLocalhost) {\n delete process.env.HTTPS_PROXY;\n delete process.env.HTTP_PROXY;\n }\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: options.method ?? 'GET',\n headers,\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n } finally {\n // Restore proxy vars so claude -p calls still route through the proxy\n if (isLocalhost) {\n if (savedProxy !== undefined) process.env.HTTPS_PROXY = savedProxy;\n if (savedHttpProxy !== undefined) process.env.HTTP_PROXY = savedHttpProxy;\n }\n }\n\n let responseBody: unknown;\n const contentType = response.headers.get('content-type');\n if (contentType?.includes('application/json')) {\n responseBody = await response.json();\n } else {\n responseBody = await response.text();\n }\n\n if (!response.ok) {\n // Extract only the error message, not the full response body\n const message =\n responseBody && typeof responseBody === 'object' && 'error' in responseBody\n ? String((responseBody as { error: string }).error)\n : `HTTP ${response.status}`;\n throw new ApiError(response.status, message);\n }\n\n return responseBody as T;\n}\n\nexport const apiGet = <T>(path: string): Promise<T> => api<T>(path);\nexport const apiPost = <T>(path: string, body: unknown): Promise<T> => api<T>(path, { method: 'POST', body });\nexport const apiPut = <T>(path: string, body: unknown): Promise<T> => api<T>(path, { method: 'PUT', body });\nexport const apiPatch = <T>(path: string, body: unknown): Promise<T> => api<T>(path, { method: 'PATCH', body });\nexport const apiDelete = <T>(path: string): Promise<T> => api<T>(path, { method: 'DELETE' });\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,76 @@
1
+ // src/lib/active-org.ts
2
+ import * as fs from "node:fs";
3
+ import * as os from "node:os";
4
+ import * as path from "node:path";
5
+ var FIVE_MINUTES_MS = 5 * 60 * 1e3;
6
+ function getConfigDir() {
7
+ return process.env.RULEMETRIC_CONFIG_DIR || path.join(os.homedir(), ".config", "rulemetric");
8
+ }
9
+ function getActiveOrgFile() {
10
+ return path.join(getConfigDir(), "active-org");
11
+ }
12
+ function readActiveOrg() {
13
+ const envOrgId = process.env.RULEMETRIC_ORG_ID;
14
+ if (envOrgId && envOrgId.trim()) {
15
+ return { orgId: envOrgId.trim() };
16
+ }
17
+ const file = getActiveOrgFile();
18
+ let raw;
19
+ try {
20
+ raw = fs.readFileSync(file, "utf-8");
21
+ } catch {
22
+ return null;
23
+ }
24
+ let parsed;
25
+ try {
26
+ parsed = JSON.parse(raw);
27
+ } catch {
28
+ return null;
29
+ }
30
+ if (!parsed || typeof parsed !== "object" || !("orgId" in parsed) || typeof parsed.orgId !== "string") {
31
+ return null;
32
+ }
33
+ const obj = parsed;
34
+ const result = { orgId: obj.orgId };
35
+ if (typeof obj.orgSlug === "string") {
36
+ result.orgSlug = obj.orgSlug;
37
+ }
38
+ if (typeof obj.syncedAt === "number") {
39
+ result.syncedAt = obj.syncedAt;
40
+ }
41
+ return result;
42
+ }
43
+ function writeActiveOrg(active) {
44
+ const dir = getConfigDir();
45
+ fs.mkdirSync(dir, { recursive: true, mode: 448 });
46
+ const file = getActiveOrgFile();
47
+ const tmpFile = `${file}.tmp`;
48
+ fs.writeFileSync(tmpFile, JSON.stringify(active, null, 2), {
49
+ encoding: "utf-8",
50
+ mode: 384
51
+ });
52
+ fs.renameSync(tmpFile, file);
53
+ }
54
+ function clearActiveOrg() {
55
+ try {
56
+ fs.unlinkSync(getActiveOrgFile());
57
+ } catch {
58
+ }
59
+ }
60
+ function isStale(active, maxAgeMs = FIVE_MINUTES_MS) {
61
+ if (typeof active.syncedAt !== "number") return false;
62
+ return Date.now() - active.syncedAt > maxAgeMs;
63
+ }
64
+ var _internals = {
65
+ getActiveOrgFile,
66
+ getConfigDir
67
+ };
68
+
69
+ export {
70
+ readActiveOrg,
71
+ writeActiveOrg,
72
+ clearActiveOrg,
73
+ isStale,
74
+ _internals
75
+ };
76
+ //# sourceMappingURL=chunk-EKJ2CABV.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lib/active-org.ts"],
4
+ "sourcesContent": ["import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\n/**\n * Local cache of the user's currently selected org. Lives at\n * `~/.config/rulemetric/active-org` (overridable via\n * `RULEMETRIC_CONFIG_DIR`). The runtime contract is intentionally small \u2014\n * env beats file, and a missing file means \"no active org\".\n */\nexport interface ActiveOrg {\n orgId: string;\n orgSlug?: string;\n /** Unix milliseconds of last refresh from the API. Absent for env overrides. */\n syncedAt?: number;\n}\n\nconst FIVE_MINUTES_MS = 5 * 60 * 1000;\n\nfunction getConfigDir(): string {\n return (\n process.env.RULEMETRIC_CONFIG_DIR ||\n path.join(os.homedir(), '.config', 'rulemetric')\n );\n}\n\nfunction getActiveOrgFile(): string {\n return path.join(getConfigDir(), 'active-org');\n}\n\n/**\n * Resolve the active org for the current process.\n *\n * Priority: env var (`RULEMETRIC_ORG_ID`) > local file > null. The env path\n * always wins \u2014 it's the \"I know what I want\" override for CI and ad-hoc\n * multi-tenant runs, even if the local file looks fresher.\n */\nexport function readActiveOrg(): ActiveOrg | null {\n const envOrgId = process.env.RULEMETRIC_ORG_ID;\n if (envOrgId && envOrgId.trim()) {\n return { orgId: envOrgId.trim() };\n }\n\n const file = getActiveOrgFile();\n let raw: string;\n try {\n raw = fs.readFileSync(file, 'utf-8');\n } catch {\n return null;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n\n if (\n !parsed ||\n typeof parsed !== 'object' ||\n !('orgId' in parsed) ||\n typeof (parsed as { orgId: unknown }).orgId !== 'string'\n ) {\n return null;\n }\n\n const obj = parsed as Record<string, unknown>;\n const result: ActiveOrg = { orgId: obj.orgId as string };\n if (typeof obj.orgSlug === 'string') {\n result.orgSlug = obj.orgSlug;\n }\n if (typeof obj.syncedAt === 'number') {\n result.syncedAt = obj.syncedAt;\n }\n return result;\n}\n\n/**\n * Persist the active org to the local file. Atomic via tmp+rename so a\n * mid-write crash never leaves a partial JSON file.\n */\nexport function writeActiveOrg(active: ActiveOrg): void {\n const dir = getConfigDir();\n fs.mkdirSync(dir, { recursive: true, mode: 0o700 });\n\n const file = getActiveOrgFile();\n const tmpFile = `${file}.tmp`;\n fs.writeFileSync(tmpFile, JSON.stringify(active, null, 2), {\n encoding: 'utf-8',\n mode: 0o600,\n });\n fs.renameSync(tmpFile, file);\n}\n\n/**\n * Remove the local active-org file. No-op if absent.\n */\nexport function clearActiveOrg(): void {\n try {\n fs.unlinkSync(getActiveOrgFile());\n } catch {\n // file already gone\n }\n}\n\n/**\n * Returns true when the cache is older than `maxAgeMs`. Cache entries\n * without `syncedAt` (e.g. from env overrides) are never considered stale \u2014\n * the caller decided the value, not us.\n */\nexport function isStale(active: ActiveOrg, maxAgeMs = FIVE_MINUTES_MS): boolean {\n if (typeof active.syncedAt !== 'number') return false;\n return Date.now() - active.syncedAt > maxAgeMs;\n}\n\n// Exported for tests that need to know where the file lives.\nexport const _internals = {\n getActiveOrgFile,\n getConfigDir,\n};\n"],
5
+ "mappings": ";AAAA,YAAY,QAAQ;AACpB,YAAY,QAAQ;AACpB,YAAY,UAAU;AAetB,IAAM,kBAAkB,IAAI,KAAK;AAEjC,SAAS,eAAuB;AAC9B,SACE,QAAQ,IAAI,yBACP,UAAQ,WAAQ,GAAG,WAAW,YAAY;AAEnD;AAEA,SAAS,mBAA2B;AAClC,SAAY,UAAK,aAAa,GAAG,YAAY;AAC/C;AASO,SAAS,gBAAkC;AAChD,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,YAAY,SAAS,KAAK,GAAG;AAC/B,WAAO,EAAE,OAAO,SAAS,KAAK,EAAE;AAAA,EAClC;AAEA,QAAM,OAAO,iBAAiB;AAC9B,MAAI;AACJ,MAAI;AACF,UAAS,gBAAa,MAAM,OAAO;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,MACE,CAAC,UACD,OAAO,WAAW,YAClB,EAAE,WAAW,WACb,OAAQ,OAA8B,UAAU,UAChD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,MAAM;AACZ,QAAM,SAAoB,EAAE,OAAO,IAAI,MAAgB;AACvD,MAAI,OAAO,IAAI,YAAY,UAAU;AACnC,WAAO,UAAU,IAAI;AAAA,EACvB;AACA,MAAI,OAAO,IAAI,aAAa,UAAU;AACpC,WAAO,WAAW,IAAI;AAAA,EACxB;AACA,SAAO;AACT;AAMO,SAAS,eAAe,QAAyB;AACtD,QAAM,MAAM,aAAa;AACzB,EAAG,aAAU,KAAK,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAElD,QAAM,OAAO,iBAAiB;AAC9B,QAAM,UAAU,GAAG,IAAI;AACvB,EAAG,iBAAc,SAAS,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG;AAAA,IACzD,UAAU;AAAA,IACV,MAAM;AAAA,EACR,CAAC;AACD,EAAG,cAAW,SAAS,IAAI;AAC7B;AAKO,SAAS,iBAAuB;AACrC,MAAI;AACF,IAAG,cAAW,iBAAiB,CAAC;AAAA,EAClC,QAAQ;AAAA,EAER;AACF;AAOO,SAAS,QAAQ,QAAmB,WAAW,iBAA0B;AAC9E,MAAI,OAAO,OAAO,aAAa,SAAU,QAAO;AAChD,SAAO,KAAK,IAAI,IAAI,OAAO,WAAW;AACxC;AAGO,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,16 @@
1
+ // ../../packages/core/dist/paths.js
2
+ import { realpathSync } from "node:fs";
3
+ import path from "node:path";
4
+ function normalizeProjectPath(input) {
5
+ const absolute = path.resolve(input);
6
+ try {
7
+ return realpathSync(absolute);
8
+ } catch {
9
+ return absolute;
10
+ }
11
+ }
12
+
13
+ export {
14
+ normalizeProjectPath
15
+ };
16
+ //# sourceMappingURL=chunk-EKP32DLN.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/core/src/paths.ts"],
4
+ "sourcesContent": ["import { realpathSync } from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Canonicalize a project path. Resolves symlinks (macOS /var \u2192 /private/var)\n * and normalizes separators. Falls back to path.resolve() if the path doesn't\n * exist on disk yet \u2014 never throws.\n *\n * Must match the behavior of `realpath -m \"$(pwd)\"` in session-start.sh so\n * suggestion rows and hook lookups agree on the same project_path string.\n */\nexport function normalizeProjectPath(input: string): string {\n const absolute = path.resolve(input);\n try {\n return realpathSync(absolute);\n } catch {\n return absolute;\n }\n}\n"],
5
+ "mappings": ";AAAA,SAAS,oBAAoB;AAC7B,OAAO,UAAU;AAUX,SAAU,qBAAqB,OAAa;AAC9C,QAAM,WAAW,KAAK,QAAQ,KAAK;AACnC,MAAI;AACA,WAAO,aAAa,QAAQ;EAChC,QAAQ;AACJ,WAAO;EACX;AACJ;",
6
+ "names": []
7
+ }