@dylanpiercey/work 0.0.47 → 0.0.48

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 (265) hide show
  1. package/bin/work.mjs +77 -47
  2. package/dist/{_DM_oFS_v.js → _CO83dVER.js} +446 -34
  3. package/dist/_DjrRGy4k.js +2 -0
  4. package/dist/{_o0dwm0Ww.js → _Hz_qlZE1.js} +59 -59
  5. package/dist/{_Dm4BVuln.js → _m3ryV1w6.js} +23 -22
  6. package/dist/index.mjs +2027 -662
  7. package/dist/public/assets/{_9CHuxVRu.js → _1cz-l3Ka.js} +1 -1
  8. package/dist/public/assets/_1cz-l3Ka.js.br +0 -0
  9. package/dist/public/assets/{_By0S6RFm2.js → _1oYv4fmY2.js} +1 -1
  10. package/dist/public/assets/_1oYv4fmY2.js.br +0 -0
  11. package/dist/public/assets/{_CfyASWBT2.js → _3i592Qvz2.js} +1 -1
  12. package/dist/public/assets/_3i592Qvz2.js.br +0 -0
  13. package/dist/public/assets/{_6fdNa05X2.js → _8nx9Raqx2.js} +1 -1
  14. package/dist/public/assets/_8nx9Raqx2.js.br +0 -0
  15. package/dist/public/assets/{_DJYs9cGt2.js → _9yP8iK4t2.js} +1 -1
  16. package/dist/public/assets/_9yP8iK4t2.js.br +0 -0
  17. package/dist/public/assets/{_zkaPdW0C2.js → _B-MMW3nb2.js} +1 -1
  18. package/dist/public/assets/_B-MMW3nb2.js.br +0 -0
  19. package/dist/public/assets/{_D1Ecsx8-2.js → _B2fn4I8S2.js} +1 -1
  20. package/dist/public/assets/_B2fn4I8S2.js.br +0 -0
  21. package/dist/public/assets/{_CrvHv7e4.js → _B49r6O_E.js} +1 -1
  22. package/dist/public/assets/_B49r6O_E.js.br +0 -0
  23. package/dist/public/assets/{_FZ5aDFyS.js → _BBW7mJhZ.js} +1 -1
  24. package/dist/public/assets/_BBW7mJhZ.js.br +0 -0
  25. package/dist/public/assets/{_fkktwOR8.js → _BC2FBUbj.js} +1 -1
  26. package/dist/public/assets/_BC2FBUbj.js.br +0 -0
  27. package/dist/public/assets/{_2_8X99jw.js → _BFt-jSq-.js} +1 -1
  28. package/dist/public/assets/_BFt-jSq-.js.br +0 -0
  29. package/dist/public/assets/{_BmH7JUGb2.js → _BGyMoPGj2.js} +1 -1
  30. package/dist/public/assets/_BGyMoPGj2.js.br +0 -0
  31. package/dist/public/assets/{_B8PQyubX.js → _BLjOZLxk.js} +1 -1
  32. package/dist/public/assets/_BLjOZLxk.js.br +0 -0
  33. package/dist/public/assets/{_BPq9uIVf.js → _BPFJiBiE.js} +1 -1
  34. package/dist/public/assets/_BPFJiBiE.js.br +0 -0
  35. package/dist/public/assets/{_DFC22iAc.js → _BPLnh5S4.js} +1 -1
  36. package/dist/public/assets/_BPLnh5S4.js.br +0 -0
  37. package/dist/public/assets/{_CMIAElmF.js → _BRzL7uNP.js} +1 -1
  38. package/dist/public/assets/_BRzL7uNP.js.br +0 -0
  39. package/dist/public/assets/{_DZExUZ7A.js → _BV-nVD9L2.js} +1 -1
  40. package/dist/public/assets/_BV-nVD9L2.js.br +0 -0
  41. package/dist/public/assets/{_DbkqHev42.js → _BbMkV19p2.js} +1 -1
  42. package/dist/public/assets/_BbMkV19p2.js.br +0 -0
  43. package/dist/public/assets/{_QZ7jIJEp.js → _BbW3-3ve.js} +1 -1
  44. package/dist/public/assets/_BbW3-3ve.js.br +0 -0
  45. package/dist/public/assets/{_BRHBgjBP2.js → _BdbnwCKs2.js} +1 -1
  46. package/dist/public/assets/_BdbnwCKs2.js.br +0 -0
  47. package/dist/public/assets/_BeSgyXoy2.js +1 -0
  48. package/dist/public/assets/_BeSgyXoy2.js.br +0 -0
  49. package/dist/public/assets/{_CRF3psRH.js → _Bg9mkw0u.js} +1 -1
  50. package/dist/public/assets/_Bg9mkw0u.js.br +0 -0
  51. package/dist/public/assets/{_BHjsQD4C.js → _BhUM9ZCP.js} +1 -1
  52. package/dist/public/assets/_BhUM9ZCP.js.br +0 -0
  53. package/dist/public/assets/{_C9YvMapn.js → _Bhnzfac_.js} +1 -1
  54. package/dist/public/assets/_Bhnzfac_.js.br +0 -0
  55. package/dist/public/assets/{_BPiDffSK.js → _BiEWaww7.js} +1 -1
  56. package/dist/public/assets/_BiEWaww7.js.br +0 -0
  57. package/dist/public/assets/{_B3rIZBik.js → _Bm-lmvlM.js} +1 -1
  58. package/dist/public/assets/_Bm-lmvlM.js.br +0 -0
  59. package/dist/public/assets/{_Cu3f85ax2.js → _Bpdzs0h4.js} +1 -1
  60. package/dist/public/assets/_Bpdzs0h4.js.br +0 -0
  61. package/dist/public/assets/{_BzuTzxB9.js → _BqeAAcor.js} +1 -1
  62. package/dist/public/assets/_BqeAAcor.js.br +0 -0
  63. package/dist/public/assets/{_5pEZdV75.js → _Bvwr3uff.js} +1 -1
  64. package/dist/public/assets/_Bvwr3uff.js.br +0 -0
  65. package/dist/public/assets/{_CRpvVy-g.js → _ByiODT9w.js} +1 -1
  66. package/dist/public/assets/_ByiODT9w.js.br +0 -0
  67. package/dist/public/assets/{_nqBpAHq9.js → _C4NK2Cq5.js} +1 -1
  68. package/dist/public/assets/_C4NK2Cq5.js.br +0 -0
  69. package/dist/public/assets/{_B2pxLNBO.js → _CASsRCtt.js} +1 -1
  70. package/dist/public/assets/_CASsRCtt.js.br +0 -0
  71. package/dist/public/assets/{_DPW4NADy2.js → _CH4P29Yf2.js} +1 -1
  72. package/dist/public/assets/_CH4P29Yf2.js.br +0 -0
  73. package/dist/public/assets/{_COmscE442.js → _CHqTBuzz2.js} +1 -1
  74. package/dist/public/assets/_CHqTBuzz2.js.br +0 -0
  75. package/dist/public/assets/{_DvqRc7vA2.js → _CIeZtXbg2.js} +1 -1
  76. package/dist/public/assets/_CIeZtXbg2.js.br +0 -0
  77. package/dist/public/assets/{_DU0F-fSc.js → _CObQoJCq.js} +1 -1
  78. package/dist/public/assets/_CObQoJCq.js.br +0 -0
  79. package/dist/public/assets/{_BxuGlOMJ.js → _CQDBqJkT.js} +1 -1
  80. package/dist/public/assets/_CQDBqJkT.js.br +0 -0
  81. package/dist/public/assets/{_DZyW50O5.js → _CUqlR7rP.js} +1 -1
  82. package/dist/public/assets/_CUqlR7rP.js.br +0 -0
  83. package/dist/public/assets/{_BDIKDRj8.js → _CUwAZxRw.js} +1 -1
  84. package/dist/public/assets/_CUwAZxRw.js.br +0 -0
  85. package/dist/public/assets/{_DeCqhciO.js → _CbMNS899.js} +1 -1
  86. package/dist/public/assets/_CbMNS899.js.br +0 -0
  87. package/dist/public/assets/{_BIP7B1g62.js → _Ced5468N2.js} +1 -1
  88. package/dist/public/assets/{_Cawlufow.js → _Cf0wSsqE.js} +1 -1
  89. package/dist/public/assets/_Cf0wSsqE.js.br +0 -0
  90. package/dist/public/assets/{_BMWhe7UA2.js → _ClEKr0Tm2.js} +1 -1
  91. package/dist/public/assets/_ClEKr0Tm2.js.br +0 -0
  92. package/dist/public/assets/{_ChIGZgCK2.js → _CsNJf4g52.js} +1 -1
  93. package/dist/public/assets/_CsNJf4g52.js.br +0 -0
  94. package/dist/public/assets/{_Dj0FqIsq2.js → _CtErcdf92.js} +1 -1
  95. package/dist/public/assets/_CtErcdf92.js.br +0 -0
  96. package/dist/public/assets/{_Btx74Q-k.js → _DAfu0wMa.js} +1 -1
  97. package/dist/public/assets/_DAfu0wMa.js.br +0 -0
  98. package/dist/public/assets/{_DgucIXC9.js → _DBN8F3s1.js} +1 -1
  99. package/dist/public/assets/_DBN8F3s1.js.br +0 -0
  100. package/dist/public/assets/{_DPc97sYv2.js → _DBn74psf2.js} +1 -1
  101. package/dist/public/assets/{_lTcPBjyz2.js → _DFOnuGNp.js} +1 -1
  102. package/dist/public/assets/_DFOnuGNp.js.br +0 -0
  103. package/dist/public/assets/{_CYb-TtX12.js → _DHvVwuPu2.js} +1 -1
  104. package/dist/public/assets/_DHvVwuPu2.js.br +0 -0
  105. package/dist/public/assets/{_AG00U05V.js → _DKnLFVdw.js} +1 -1
  106. package/dist/public/assets/_DKnLFVdw.js.br +0 -0
  107. package/dist/public/assets/{_D5DIKC5J2.js → _DLFnXIrG2.js} +1 -1
  108. package/dist/public/assets/_DLFnXIrG2.js.br +0 -0
  109. package/dist/public/assets/{_Dvsdxjs1.js → _DLK0WouR.js} +1 -1
  110. package/dist/public/assets/_DLK0WouR.js.br +0 -0
  111. package/dist/public/assets/_DLLEkkcM.js +1531 -0
  112. package/dist/public/assets/_DLLEkkcM.js.br +0 -0
  113. package/dist/public/assets/{_ClduJgR5.js → _DOpT45mO.js} +1 -1
  114. package/dist/public/assets/_DOpT45mO.js.br +0 -0
  115. package/dist/public/assets/{_ByQc1pkS.js → _DT9Qs1il.js} +1 -1
  116. package/dist/public/assets/_DT9Qs1il.js.br +0 -0
  117. package/dist/public/assets/{_C3QGlxhv2.js → _DVPPxo4e2.js} +1 -1
  118. package/dist/public/assets/_DVPPxo4e2.js.br +0 -0
  119. package/dist/public/assets/{_CpxRirGf.js → _De7fhQUT.js} +1 -1
  120. package/dist/public/assets/_De7fhQUT.js.br +0 -0
  121. package/dist/public/assets/{_BmtVFK052.js → _DgmBuYFG2.js} +1 -1
  122. package/dist/public/assets/_DgmBuYFG2.js.br +0 -0
  123. package/dist/public/assets/{_BLvHtG5b.js → _DjLQQUoq.js} +1 -1
  124. package/dist/public/assets/_DjLQQUoq.js.br +0 -0
  125. package/dist/public/assets/{_CBF2sJFl.js → _Dn4wMX5v.js} +1 -1
  126. package/dist/public/assets/_Dn4wMX5v.js.br +0 -0
  127. package/dist/public/assets/{_tKPNE6U52.js → _DsJkMBKU2.js} +1 -1
  128. package/dist/public/assets/_DsJkMBKU2.js.br +0 -0
  129. package/dist/public/assets/{_CYLr_2iE.js → _Ez06j6Qv.js} +1 -1
  130. package/dist/public/assets/_Ez06j6Qv.js.br +0 -0
  131. package/dist/public/assets/{_CyDJr5hJ.js → _FCV34uHN.js} +1 -1
  132. package/dist/public/assets/_FCV34uHN.js.br +0 -0
  133. package/dist/public/assets/{_BgDRYHYE.js → _I6H6F0ME.js} +1 -1
  134. package/dist/public/assets/_I6H6F0ME.js.br +0 -0
  135. package/dist/public/assets/{_ji5qc8J4.js → _K6PNL3j4.js} +1 -1
  136. package/dist/public/assets/_K6PNL3j4.js.br +0 -0
  137. package/dist/public/assets/{_CCXyJU0G.js → _KVpYyL9A.js} +1 -1
  138. package/dist/public/assets/_KVpYyL9A.js.br +0 -0
  139. package/dist/public/assets/{_BEEHMSv_.js → _KjztUkjx.js} +1 -1
  140. package/dist/public/assets/_KjztUkjx.js.br +0 -0
  141. package/dist/public/assets/{_BGFm3dJ4.js → _Q6y5EfU1.js} +1 -1
  142. package/dist/public/assets/_Q6y5EfU1.js.br +0 -0
  143. package/dist/public/assets/{_C7kYFLNM.js → _cRLLpjIg.js} +1 -1
  144. package/dist/public/assets/_cRLLpjIg.js.br +0 -0
  145. package/dist/public/assets/{_CXsVxa93.js → _h8qSl3Me.js} +1 -1
  146. package/dist/public/assets/{_BxlHpe2T.js → _kv39JOeM.js} +1 -1
  147. package/dist/public/assets/_kv39JOeM.js.br +0 -0
  148. package/dist/public/assets/{_DTXvrAdN.js → _o1of2_lP.js} +1 -1
  149. package/dist/public/assets/_o1of2_lP.js.br +0 -0
  150. package/dist/public/assets/{_T_hWiFRO.js → _qoSWRJiT.js} +1 -1
  151. package/dist/public/assets/_qoSWRJiT.js.br +0 -0
  152. package/dist/public/assets/{_BZe4BZ4G.js → _yQJK428k.js} +1 -1
  153. package/dist/public/assets/_yQJK428k.js.br +0 -0
  154. package/dist/public/assets/diff-view-CQX-Ovnt.css +1 -0
  155. package/dist/public/assets/diff-view-CQX-Ovnt.css.br +0 -0
  156. package/dist/public/assets/index-DR0Bvd6u.css +1 -0
  157. package/dist/public/assets/index-DR0Bvd6u.css.br +0 -0
  158. package/dist/public/assets/index-fCEONff1.js +85 -0
  159. package/dist/public/assets/index-fCEONff1.js.br +0 -0
  160. package/lib/setup/catalog.d.mts +22 -0
  161. package/lib/setup/catalog.mjs +72 -0
  162. package/lib/setup/doctor.d.mts +49 -0
  163. package/lib/setup/doctor.mjs +203 -0
  164. package/lib/setup/install.d.mts +14 -0
  165. package/lib/setup/install.mjs +135 -0
  166. package/package.json +2 -1
  167. package/dist/_CV5G1-Sr.js +0 -2
  168. package/dist/public/assets/_2_8X99jw.js.br +0 -0
  169. package/dist/public/assets/_5pEZdV75.js.br +0 -0
  170. package/dist/public/assets/_6fdNa05X2.js.br +0 -0
  171. package/dist/public/assets/_9CHuxVRu.js.br +0 -0
  172. package/dist/public/assets/_AG00U05V.js.br +0 -0
  173. package/dist/public/assets/_B2pxLNBO.js.br +0 -0
  174. package/dist/public/assets/_B3rIZBik.js.br +0 -0
  175. package/dist/public/assets/_B8PQyubX.js.br +0 -0
  176. package/dist/public/assets/_BDIKDRj8.js.br +0 -0
  177. package/dist/public/assets/_BEEHMSv_.js.br +0 -0
  178. package/dist/public/assets/_BGFm3dJ4.js.br +0 -0
  179. package/dist/public/assets/_BHjsQD4C.js.br +0 -0
  180. package/dist/public/assets/_BLibugcj.js +0 -1531
  181. package/dist/public/assets/_BLibugcj.js.br +0 -0
  182. package/dist/public/assets/_BLvHtG5b.js.br +0 -0
  183. package/dist/public/assets/_BMWhe7UA2.js.br +0 -0
  184. package/dist/public/assets/_BPiDffSK.js.br +0 -0
  185. package/dist/public/assets/_BPq9uIVf.js.br +0 -0
  186. package/dist/public/assets/_BRHBgjBP2.js.br +0 -0
  187. package/dist/public/assets/_BZe4BZ4G.js.br +0 -0
  188. package/dist/public/assets/_BgDRYHYE.js.br +0 -0
  189. package/dist/public/assets/_BmH7JUGb2.js.br +0 -0
  190. package/dist/public/assets/_BmtVFK052.js.br +0 -0
  191. package/dist/public/assets/_Btx74Q-k.js.br +0 -0
  192. package/dist/public/assets/_BxlHpe2T.js.br +0 -0
  193. package/dist/public/assets/_BxuGlOMJ.js.br +0 -0
  194. package/dist/public/assets/_By0S6RFm2.js.br +0 -0
  195. package/dist/public/assets/_ByQc1pkS.js.br +0 -0
  196. package/dist/public/assets/_BzuTzxB9.js.br +0 -0
  197. package/dist/public/assets/_C3QGlxhv2.js.br +0 -0
  198. package/dist/public/assets/_C7kYFLNM.js.br +0 -0
  199. package/dist/public/assets/_C9YvMapn.js.br +0 -0
  200. package/dist/public/assets/_CBF2sJFl.js.br +0 -0
  201. package/dist/public/assets/_CCXyJU0G.js.br +0 -0
  202. package/dist/public/assets/_CMIAElmF.js.br +0 -0
  203. package/dist/public/assets/_COmscE442.js.br +0 -0
  204. package/dist/public/assets/_CRF3psRH.js.br +0 -0
  205. package/dist/public/assets/_CRpvVy-g.js.br +0 -0
  206. package/dist/public/assets/_CYLr_2iE.js.br +0 -0
  207. package/dist/public/assets/_CYb-TtX12.js.br +0 -0
  208. package/dist/public/assets/_Cawlufow.js.br +0 -0
  209. package/dist/public/assets/_CfyASWBT2.js.br +0 -0
  210. package/dist/public/assets/_ChIGZgCK2.js.br +0 -0
  211. package/dist/public/assets/_ClduJgR5.js.br +0 -0
  212. package/dist/public/assets/_Cp2bkjzT2.js +0 -1
  213. package/dist/public/assets/_Cp2bkjzT2.js.br +0 -0
  214. package/dist/public/assets/_CpxRirGf.js.br +0 -0
  215. package/dist/public/assets/_CrvHv7e4.js.br +0 -0
  216. package/dist/public/assets/_Cu3f85ax2.js.br +0 -0
  217. package/dist/public/assets/_CyDJr5hJ.js.br +0 -0
  218. package/dist/public/assets/_D1Ecsx8-2.js.br +0 -0
  219. package/dist/public/assets/_D2tmOnaH.js +0 -1
  220. package/dist/public/assets/_D2tmOnaH.js.br +0 -0
  221. package/dist/public/assets/_D5DIKC5J2.js.br +0 -0
  222. package/dist/public/assets/_DFC22iAc.js.br +0 -0
  223. package/dist/public/assets/_DJYs9cGt2.js.br +0 -0
  224. package/dist/public/assets/_DPW4NADy2.js.br +0 -0
  225. package/dist/public/assets/_DTXvrAdN.js.br +0 -0
  226. package/dist/public/assets/_DU0F-fSc.js.br +0 -0
  227. package/dist/public/assets/_DZExUZ7A.js.br +0 -0
  228. package/dist/public/assets/_DZyW50O5.js.br +0 -0
  229. package/dist/public/assets/_DbkqHev42.js.br +0 -0
  230. package/dist/public/assets/_DeCqhciO.js.br +0 -0
  231. package/dist/public/assets/_DgucIXC9.js.br +0 -0
  232. package/dist/public/assets/_Dj0FqIsq2.js.br +0 -0
  233. package/dist/public/assets/_DvqRc7vA2.js.br +0 -0
  234. package/dist/public/assets/_Dvsdxjs1.js.br +0 -0
  235. package/dist/public/assets/_FZ5aDFyS.js.br +0 -0
  236. package/dist/public/assets/_QZ7jIJEp.js.br +0 -0
  237. package/dist/public/assets/_T_hWiFRO.js.br +0 -0
  238. package/dist/public/assets/_fkktwOR8.js.br +0 -0
  239. package/dist/public/assets/_ji5qc8J4.js.br +0 -0
  240. package/dist/public/assets/_lTcPBjyz2.js.br +0 -0
  241. package/dist/public/assets/_nqBpAHq9.js.br +0 -0
  242. package/dist/public/assets/_tKPNE6U52.js.br +0 -0
  243. package/dist/public/assets/_zkaPdW0C2.js.br +0 -0
  244. package/dist/public/assets/diff-view-AJeZtePd.css +0 -1
  245. package/dist/public/assets/diff-view-AJeZtePd.css.br +0 -0
  246. package/dist/public/assets/index-BG3uLJV6.js +0 -85
  247. package/dist/public/assets/index-BG3uLJV6.js.br +0 -0
  248. package/dist/public/assets/index-_5MkiydM.css +0 -1
  249. package/dist/public/assets/index-_5MkiydM.css.br +0 -0
  250. package/dist/public/assets/preload-helper-C1JvlFma.css +0 -1
  251. package/dist/public/assets/preload-helper-C1JvlFma.css.br +0 -0
  252. /package/dist/public/assets/{_B5W6OYN72.js → _B5W6OYN7.js} +0 -0
  253. /package/dist/public/assets/{_B5W6OYN72.js.br → _B5W6OYN7.js.br} +0 -0
  254. /package/dist/public/assets/{_DMoTqEGO2.js → _DMoTqEGO.js} +0 -0
  255. /package/dist/public/assets/{_DMoTqEGO2.js.br → _DMoTqEGO.js.br} +0 -0
  256. /package/dist/public/assets/{_DmIc4jLQ2.js → _DmIc4jLQ.js} +0 -0
  257. /package/dist/public/assets/{_DmIc4jLQ2.js.br → _DmIc4jLQ.js.br} +0 -0
  258. /package/dist/public/assets/{_DsUTQ-LC.js → _DsUTQ-LC2.js} +0 -0
  259. /package/dist/public/assets/{_DsUTQ-LC.js.br → _DsUTQ-LC2.js.br} +0 -0
  260. /package/dist/public/assets/{_VbXTXTou.js → _VbXTXTou2.js} +0 -0
  261. /package/dist/public/assets/{_VbXTXTou.js.br → _VbXTXTou2.js.br} +0 -0
  262. /package/dist/public/assets/{_iXnhIJG7.js → _iXnhIJG72.js} +0 -0
  263. /package/dist/public/assets/{_iXnhIJG7.js.br → _iXnhIJG72.js.br} +0 -0
  264. /package/dist/public/assets/{_vGVdxbeo.js → _vGVdxbeo2.js} +0 -0
  265. /package/dist/public/assets/{_vGVdxbeo.js.br → _vGVdxbeo2.js.br} +0 -0
@@ -8,16 +8,16 @@ import { DatabaseSync } from "node:sqlite";
8
8
  import { execFile } from "node:child_process";
9
9
  import { promisify } from "node:util";
10
10
  //#region src/server/config.ts
11
- var home = os.homedir();
11
+ var home$1 = os.homedir();
12
12
  var config = {
13
13
  /** Root directory containing all workspaces. */
14
- workRoot: process.env.WORK_ROOT || path.join(home, "work"),
14
+ workRoot: process.env.WORK_ROOT || path.join(home$1, "work"),
15
15
  /** Shared bare-repo cache, kept inside the work root. */
16
16
  get cacheDir() {
17
17
  return path.join(this.workRoot, ".cache");
18
18
  },
19
19
  /** Data directory for the sqlite db and other server state. */
20
- dataDir: process.env.WORK_DATA_DIR || path.join(process.env.XDG_DATA_HOME || path.join(home, ".local", "share"), "work"),
20
+ dataDir: process.env.WORK_DATA_DIR || path.join(process.env.XDG_DATA_HOME || path.join(home$1, ".local", "share"), "work"),
21
21
  gitHost: "github.com",
22
22
  user: process.env.WORK_USER || os.userInfo().username,
23
23
  host: process.env.WORK_HOST || os.hostname().split(".")[0],
@@ -148,7 +148,7 @@ function subscriberCount() {
148
148
  * user's default tmux. */
149
149
  var TMUX_SOCKET = "work";
150
150
  var execFileAsync = promisify(execFile);
151
- async function run(cmd, args, cwd, env) {
151
+ async function run$1(cmd, args, cwd, env) {
152
152
  const { stdout } = await execFileAsync(cmd, args, {
153
153
  cwd,
154
154
  env,
@@ -156,22 +156,386 @@ async function run(cmd, args, cwd, env) {
156
156
  });
157
157
  return stdout.trim();
158
158
  }
159
- var git = (args, cwd) => run("git", args, cwd);
160
- var gh = (args) => run("gh", args);
161
- var tmux = (args, env) => run("tmux", [
159
+ var git = (args, cwd) => run$1("git", args, cwd);
160
+ var gh = (args) => run$1("gh", args);
161
+ var tmux = (args, env) => run$1("tmux", [
162
162
  "-L",
163
163
  TMUX_SOCKET,
164
164
  ...args
165
165
  ], void 0, env);
166
166
  //#endregion
167
- //#region src/server/settings.ts
167
+ //#region lib/setup/catalog.mjs
168
+ /** Machine tools. `required` ones gate readiness; the rest are the utilities
169
+ * agents reach for constantly (mirrors DylanPiercey/start). Static binaries via
170
+ * mise, except the system packages the installer provides (git, tmux). */
171
+ var TOOLS = [
172
+ {
173
+ id: "git",
174
+ label: "git",
175
+ bin: "git",
176
+ required: true,
177
+ system: true
178
+ },
179
+ {
180
+ id: "tmux",
181
+ label: "tmux",
182
+ bin: "tmux",
183
+ required: true,
184
+ system: true,
185
+ mise: "tmux"
186
+ },
187
+ {
188
+ id: "node",
189
+ label: "Node.js",
190
+ bin: "node",
191
+ mise: "node",
192
+ required: true
193
+ },
194
+ {
195
+ id: "gh",
196
+ label: "GitHub CLI",
197
+ bin: "gh",
198
+ mise: "gh",
199
+ required: true
200
+ },
201
+ {
202
+ id: "ripgrep",
203
+ label: "ripgrep",
204
+ bin: "rg",
205
+ mise: "ripgrep"
206
+ },
207
+ {
208
+ id: "fd",
209
+ label: "fd",
210
+ bin: "fd",
211
+ mise: "fd"
212
+ },
213
+ {
214
+ id: "jq",
215
+ label: "jq",
216
+ bin: "jq",
217
+ mise: "jq"
218
+ },
219
+ {
220
+ id: "delta",
221
+ label: "delta",
222
+ bin: "delta",
223
+ mise: "delta"
224
+ },
225
+ {
226
+ id: "ast-grep",
227
+ label: "ast-grep",
228
+ bin: "ast-grep",
229
+ mise: "ast-grep"
230
+ },
231
+ {
232
+ id: "hyperfine",
233
+ label: "hyperfine",
234
+ bin: "hyperfine",
235
+ mise: "hyperfine"
236
+ },
237
+ {
238
+ id: "fzf",
239
+ label: "fzf",
240
+ bin: "fzf",
241
+ mise: "fzf"
242
+ },
243
+ {
244
+ id: "bottom",
245
+ label: "bottom",
246
+ bin: "btm",
247
+ mise: "bottom"
248
+ },
249
+ {
250
+ id: "pnpm",
251
+ label: "pnpm",
252
+ bin: "pnpm",
253
+ mise: "pnpm"
254
+ }
255
+ ];
256
+ /** Coding agent CLIs. Installed via each vendor's own installer (not npm) so
257
+ * self-update works. `bins` lists the executable names a family answers to;
258
+ * numeric suffixes (`claude1`) are discovered on top of these. */
168
259
  var AGENTS = [
169
- "claude",
170
- "codex",
171
- "grok",
172
- "copilot",
173
- "cursor"
260
+ {
261
+ id: "claude",
262
+ label: "Claude",
263
+ bins: ["claude"],
264
+ install: {
265
+ url: "https://claude.ai/install.sh",
266
+ shell: "bash"
267
+ }
268
+ },
269
+ {
270
+ id: "codex",
271
+ label: "Codex",
272
+ bins: ["codex"],
273
+ install: {
274
+ url: "https://chatgpt.com/codex/install.sh",
275
+ shell: "sh"
276
+ }
277
+ },
278
+ {
279
+ id: "copilot",
280
+ label: "Copilot",
281
+ bins: ["copilot"],
282
+ install: {
283
+ url: "https://gh.io/copilot-install",
284
+ shell: "bash"
285
+ }
286
+ },
287
+ {
288
+ id: "cursor",
289
+ label: "Cursor",
290
+ bins: ["cursor-agent"],
291
+ install: {
292
+ url: "https://cursor.com/install",
293
+ shell: "bash"
294
+ }
295
+ },
296
+ {
297
+ id: "grok",
298
+ label: "Grok",
299
+ bins: ["grok"],
300
+ install: {
301
+ url: "https://x.ai/cli/install.sh",
302
+ shell: "bash"
303
+ }
304
+ }
174
305
  ];
306
+ var DEFAULT_GITHUB_HOST = "github.com";
307
+ function toolById(id) {
308
+ return TOOLS.find((t) => t.id === id) || null;
309
+ }
310
+ function agentById(id) {
311
+ return AGENTS.find((a) => a.id === id) || null;
312
+ }
313
+ /**
314
+ * Agent *instances* are the family id plus an optional numeric suffix —
315
+ * `claude`, `claude1`, `claude2` — one per binary on PATH (`claude1`,
316
+ * `cursor-agent2`, …). This is the canonical id everywhere: sessions,
317
+ * settings, usage rows (`~/.claude-2` reports as `claude2`), icons.
318
+ */
319
+ function parseAgentId(id) {
320
+ const m = /^([a-z]+?)(\d*)$/.exec(id || "");
321
+ const family = m && agentById(m[1]);
322
+ return family ? {
323
+ family,
324
+ suffix: m[2]
325
+ } : null;
326
+ }
327
+ /** argv0 an instance id launches — the family's binary plus the suffix. */
328
+ function agentCommand(id) {
329
+ const parsed = parseAgentId(id);
330
+ return parsed ? `${parsed.family.bins[0]}${parsed.suffix}` : null;
331
+ }
332
+ /** "Claude" / "Claude 2". */
333
+ function agentLabel(id) {
334
+ const parsed = parseAgentId(id);
335
+ return parsed ? `${parsed.family.label}${parsed.suffix ? ` ${parsed.suffix}` : ""}` : id;
336
+ }
337
+ //#endregion
338
+ //#region lib/setup/doctor.mjs
339
+ var home = os.homedir();
340
+ /** PATH the service runs with (no login shell) plus the current one, so a
341
+ * probe from the server sees the same binaries a probe from a terminal does. */
342
+ function setupPath(base = process.env.PATH || "") {
343
+ const extra = [
344
+ `${home}/.local/share/mise/shims`,
345
+ `${home}/.local/bin`,
346
+ "/opt/homebrew/bin",
347
+ "/usr/local/bin",
348
+ "/usr/bin",
349
+ "/bin"
350
+ ];
351
+ const seen = /* @__PURE__ */ new Set();
352
+ return [...base.split(path.delimiter), ...extra].filter((p) => p && !seen.has(p) && seen.add(p)).join(path.delimiter);
353
+ }
354
+ /** `~/…` for anything under the home directory — every path here is for
355
+ * display (Settings rows, `work doctor`), never re-used to exec. */
356
+ function tilde(p) {
357
+ if (!p) return p;
358
+ return p === home ? "~" : p.startsWith(home + path.sep) ? "~" + p.slice(home.length) : p;
359
+ }
360
+ /** Absolute path of `bin` on setupPath(), or null. */
361
+ function which(bin) {
362
+ for (const dir of setupPath().split(path.delimiter)) {
363
+ const full = path.join(dir, bin);
364
+ try {
365
+ if (fs.statSync(full).isFile()) return full;
366
+ } catch {}
367
+ }
368
+ return null;
369
+ }
370
+ function run(cmd, args, { timeout = 15e3 } = {}) {
371
+ return new Promise((resolve) => {
372
+ execFile(cmd, args, {
373
+ env: {
374
+ ...process.env,
375
+ PATH: setupPath()
376
+ },
377
+ timeout,
378
+ maxBuffer: 8 << 20
379
+ }, (err, stdout, stderr) => resolve({
380
+ ok: !err,
381
+ stdout: String(stdout || ""),
382
+ stderr: String(stderr || "")
383
+ }));
384
+ });
385
+ }
386
+ /** Versions of every mise-managed tool (global + any active config), keyed
387
+ * by short name. Local and fast; `mise outdated` (network) is a separate,
388
+ * on-demand call in the server. */
389
+ async function miseVersions() {
390
+ if (!which("mise")) return null;
391
+ const { ok, stdout } = await run("mise", ["ls", "--json"]);
392
+ if (!ok) return {};
393
+ const out = {};
394
+ try {
395
+ for (const [name, list] of Object.entries(JSON.parse(stdout))) {
396
+ const active = list.find((v) => v.installed && v.active) || list.find((v) => v.installed);
397
+ if (active) out[name] = active.version;
398
+ }
399
+ } catch {}
400
+ return out;
401
+ }
402
+ /** Hosts `gh` knows about (~/.config/gh/hosts.yml top-level keys) — the
403
+ * source of truth for "which GitHub hosts has this machine signed in to",
404
+ * merged with whatever the caller has configured. */
405
+ function ghKnownHosts() {
406
+ const file = path.join(process.env.GH_CONFIG_DIR || path.join(home, ".config", "gh"), "hosts.yml");
407
+ let text = "";
408
+ try {
409
+ text = fs.readFileSync(file, "utf8");
410
+ } catch {
411
+ return [];
412
+ }
413
+ return [...text.matchAll(/^([A-Za-z0-9.-]+):\s*$/gm)].map((m) => m[1]);
414
+ }
415
+ /**
416
+ * Every agent CLI instance on PATH, per family: the plain binary and any
417
+ * numeric-suffixed siblings (`claude1`, `cursor-agent2`). Sync — a PATH
418
+ * scan is cheap and the boot handler needs it without awaiting. First hit
419
+ * on PATH wins per name, like the shell.
420
+ */
421
+ function discoverAgents() {
422
+ const dirs = setupPath().split(path.delimiter);
423
+ const seen = /* @__PURE__ */ new Map();
424
+ for (const dir of dirs) {
425
+ let names;
426
+ try {
427
+ names = fs.readdirSync(dir);
428
+ } catch {
429
+ continue;
430
+ }
431
+ for (const name of names) {
432
+ const hit = AGENTS.find((a) => a.bins.some((b) => name === b || name.startsWith(b) && /^\d+$/.test(name.slice(b.length))));
433
+ if (!hit || seen.has(name)) continue;
434
+ const full = path.join(dir, name);
435
+ try {
436
+ if (!fs.statSync(full).isFile()) continue;
437
+ } catch {
438
+ continue;
439
+ }
440
+ const bin = hit.bins.find((b) => name.startsWith(b));
441
+ seen.set(name, {
442
+ family: hit,
443
+ id: `${hit.id}${name.slice(bin.length)}`,
444
+ command: name,
445
+ path: tilde(full)
446
+ });
447
+ }
448
+ }
449
+ return AGENTS.map((a) => {
450
+ const instances = [...seen.values()].filter((i) => i.family === a).map(({ id, command, path: p }) => ({
451
+ id,
452
+ command,
453
+ path: p,
454
+ suffix: id.slice(a.id.length)
455
+ })).sort((x, y) => x.suffix === "" ? -1 : y.suffix === "" ? 1 : Number(x.suffix) - Number(y.suffix));
456
+ return {
457
+ id: a.id,
458
+ label: a.label,
459
+ installed: instances.length > 0,
460
+ installable: true,
461
+ instances
462
+ };
463
+ });
464
+ }
465
+ /** Auth status for one host via gh (which owns the tokens). */
466
+ async function githubHostStatus(host) {
467
+ const isEnterprise = host !== DEFAULT_GITHUB_HOST;
468
+ if (!which("gh")) return {
469
+ host,
470
+ isEnterprise,
471
+ authed: false,
472
+ error: "gh not installed"
473
+ };
474
+ const { ok, stdout, stderr } = await run("gh", [
475
+ "auth",
476
+ "status",
477
+ "--hostname",
478
+ host
479
+ ]);
480
+ const text = stdout + stderr;
481
+ const user = text.match(/account (\S+)/)?.[1] || text.match(/Logged in to \S+ as (\S+)/)?.[1];
482
+ return ok ? {
483
+ host,
484
+ isEnterprise,
485
+ authed: true,
486
+ user
487
+ } : {
488
+ host,
489
+ isEnterprise,
490
+ authed: false,
491
+ error: /not logged in/i.test(text) ? void 0 : text.trim().split("\n").pop()
492
+ };
493
+ }
494
+ /**
495
+ * Full readiness snapshot.
496
+ *
497
+ * @param {{ hosts?: string[] }} [opts] configured GitHub hosts (settings);
498
+ * github.com and any host gh is already signed in to are always included.
499
+ */
500
+ async function doctor(opts = {}) {
501
+ const hostSet = /* @__PURE__ */ new Set([
502
+ DEFAULT_GITHUB_HOST,
503
+ ...opts.hosts || [],
504
+ ...ghKnownHosts()
505
+ ]);
506
+ const [versions, github] = await Promise.all([miseVersions(), Promise.all([...hostSet].map(githubHostStatus))]);
507
+ const tools = TOOLS.map((t) => {
508
+ const found = which(t.bin);
509
+ return {
510
+ id: t.id,
511
+ label: t.label,
512
+ required: !!t.required,
513
+ installed: !!found,
514
+ path: tilde(found) || void 0,
515
+ version: t.mise && versions && versions[t.mise] || void 0,
516
+ installable: !!(t.mise && versions !== null),
517
+ mise: t.mise
518
+ };
519
+ });
520
+ const agents = discoverAgents();
521
+ const missing = [];
522
+ for (const t of tools) if (t.required && !t.installed) missing.push(t.id);
523
+ if (!github.some((h) => h.authed)) missing.push("github-auth");
524
+ if (!agents.some((a) => a.installed)) missing.push("agent");
525
+ return {
526
+ ready: missing.length === 0,
527
+ missing,
528
+ mise: {
529
+ installed: versions !== null,
530
+ path: tilde(which("mise")) || void 0
531
+ },
532
+ tools,
533
+ agents,
534
+ github
535
+ };
536
+ }
537
+ //#endregion
538
+ //#region src/server/settings.ts
175
539
  function getSetting(key) {
176
540
  return get("SELECT value FROM settings WHERE key = ?", key)?.value;
177
541
  }
@@ -189,9 +553,57 @@ function setPref(key, value) {
189
553
  if (value === null) db.prepare("DELETE FROM settings WHERE key = ?").run(`ui.${key}`);
190
554
  else setSetting(`ui.${key}`, value);
191
555
  }
556
+ /** Instance ids the user switched off in Settings (still installed). */
557
+ function disabledAgents() {
558
+ try {
559
+ return new Set(JSON.parse(getSetting("disabledAgents") || "[]"));
560
+ } catch {
561
+ return /* @__PURE__ */ new Set();
562
+ }
563
+ }
564
+ function setDisabledAgents(ids) {
565
+ setSetting("disabledAgents", JSON.stringify([...new Set(ids)]));
566
+ }
567
+ /** Every agent CLI instance installed on this machine (PATH scan) plus the
568
+ * built-in shell, with the user's enable/disable applied. Cheap and sync so
569
+ * the boot handler and session create can call it directly. */
570
+ function agentChoices() {
571
+ const off = disabledAgents();
572
+ const out = [];
573
+ for (const family of discoverAgents()) for (const inst of family.instances) out.push({
574
+ id: inst.id,
575
+ label: agentLabel(inst.id),
576
+ family: family.id,
577
+ command: inst.command,
578
+ enabled: !off.has(inst.id)
579
+ });
580
+ out.push({
581
+ id: "shell",
582
+ label: "Shell",
583
+ family: "shell",
584
+ command: "",
585
+ enabled: true
586
+ });
587
+ return out;
588
+ }
589
+ /** Ids the pickers offer: installed ∧ enabled. `shell` is not listed —
590
+ * every picker appends it itself as the always-there fallback. */
591
+ function enabledAgents() {
592
+ return agentChoices().filter((a) => a.enabled && a.id !== "shell").map((a) => a.id);
593
+ }
594
+ /** True for any id a session may be created with: a discovered instance,
595
+ * the shell, or a plausible instance id whose binary a login shell can find
596
+ * (PATH here and in the pane can differ). */
597
+ function isKnownAgent(id) {
598
+ return id === "shell" || !!parseAgentId(id);
599
+ }
600
+ /** Default agent for empty-session Start / auto-create. Falls back to the
601
+ * first enabled non-shell instance when the stored choice is gone. */
192
602
  function preferredAgent() {
193
- const value = getSetting("preferredAgent");
194
- return AGENTS.includes(value) ? value : "claude";
603
+ const stored = getSetting("preferredAgent");
604
+ const enabled = enabledAgents();
605
+ if (stored && enabled.includes(stored)) return stored;
606
+ return enabled.find((id) => id !== "shell") || stored || "claude";
195
607
  }
196
608
  //#endregion
197
609
  //#region node_modules/.pnpm/bn.js@4.12.5/node_modules/bn.js/lib/bn.js
@@ -6013,7 +6425,7 @@ function publishChange(sessionId) {
6013
6425
  const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
6014
6426
  if (row?.workspace_id) {
6015
6427
  const workspaceId = row.workspace_id;
6016
- import("./_CV5G1-Sr.js").then((m) => m.notifySessionsChanged(workspaceId));
6428
+ import("./_DjrRGy4k.js").then((m) => m.notifySessionsChanged(workspaceId));
6017
6429
  return;
6018
6430
  }
6019
6431
  publish("sessions.changed");
@@ -6037,11 +6449,17 @@ function stateCurl(state, reason) {
6037
6449
  * believing the screen over that costs it the state its own hook just
6038
6450
  * reported. */
6039
6451
  function reportsWorking(agent) {
6040
- return agent === "claude";
6452
+ return agentFamily(agent) === "claude";
6453
+ }
6454
+ /** Family of an instance id (`claude2` → `claude`); flags and hooks are
6455
+ * per family, every numbered copy behaves the same. */
6456
+ function agentFamily(agent) {
6457
+ return agent ? parseAgentId(agent)?.family.id : void 0;
6041
6458
  }
6042
6459
  /** Extra argv for an agent CLI so it reports working/waiting state. */
6043
6460
  function agentLaunchFlags(agent) {
6044
- if (agent === "claude") {
6461
+ const family = agentFamily(agent);
6462
+ if (family === "claude") {
6045
6463
  const hook = (state, reason) => [{ hooks: [{
6046
6464
  type: "command",
6047
6465
  command: stateCurl(state, reason)
@@ -6053,7 +6471,7 @@ function agentLaunchFlags(agent) {
6053
6471
  Notification: hook("waiting", "attention")
6054
6472
  } })];
6055
6473
  }
6056
- if (agent === "codex") return ["-c", `notify=[${[
6474
+ if (family === "codex") return ["-c", `notify=[${[
6057
6475
  "sh",
6058
6476
  "-c",
6059
6477
  `[ -n "$WORK_SESSION_ID" ] && curl -sf -m 3 -X POST "http://127.0.0.1:\${WORK_APP_PORT:-${config.appPort}}/api/agent-state?session=$WORK_SESSION_ID&state=waiting&reason=done" -H 'content-type: application/json' --data "$1" >/dev/null 2>&1; exit 0`,
@@ -6070,7 +6488,7 @@ function getSession(id) {
6070
6488
  return get("SELECT * FROM sessions WHERE id = ?", id);
6071
6489
  }
6072
6490
  function createSession(workspaceId, agent) {
6073
- if (!(agent in COMMANDS)) throw new Error(`unknown session kind: ${agent}`);
6491
+ if (!isKnownAgent(agent)) throw new Error(`unknown session kind: ${agent}`);
6074
6492
  const id = Math.random().toString(36).slice(2, 10);
6075
6493
  db.prepare("INSERT INTO sessions (id, workspace_id, agent) VALUES (?, ?, ?)").run(id, workspaceId, agent);
6076
6494
  notifySessionsChanged(workspaceId);
@@ -6152,7 +6570,7 @@ async function sendToSession(id, text, size) {
6152
6570
  "-t",
6153
6571
  name
6154
6572
  ], env).then(() => true, () => false)) {
6155
- if (session.agent === "grok") {
6573
+ if (agentFamily(session.agent) === "grok") {
6156
6574
  await tmux(newSessionArgs(session, wsPath, "-d", text, size), env);
6157
6575
  markTmuxStarted(id);
6158
6576
  return;
@@ -6226,7 +6644,7 @@ async function panePids() {
6226
6644
  * (tmux exits when its last session closes). */
6227
6645
  async function ensureTmuxServer() {
6228
6646
  if (await tmux(["has-session"]).then(() => true, () => false)) return;
6229
- await run("systemd-run", [
6647
+ await run$1("systemd-run", [
6230
6648
  "--user",
6231
6649
  "--unit=work-tmux",
6232
6650
  "--service-type=forking",
@@ -6382,20 +6800,14 @@ function cleanEnv() {
6382
6800
  }
6383
6801
  var AGENT_BOOT_MS = 1500;
6384
6802
  var PASTE_SETTLE_MS = 150;
6385
- /** Shell command each session kind runs inside its tmux session. */
6386
- var COMMANDS = {
6387
- shell: [],
6388
- claude: ["claude"],
6389
- codex: ["codex"],
6390
- grok: ["grok"],
6391
- copilot: ["copilot"],
6392
- cursor: ["cursor-agent"]
6393
- };
6394
- /** Command for a session kind; `command.<agent>` in settings overrides (e.g. claude → claude1). */
6803
+ /** Command for a session kind: the instance's binary (`claude2`,
6804
+ * `cursor-agent`), nothing for `shell`; `command.<agent>` in settings still
6805
+ * overrides for one-off wrappers. */
6395
6806
  function sessionCommand(agent) {
6396
6807
  const override = getSetting(`command.${agent}`);
6397
6808
  if (override) return override.split(/\s+/);
6398
- return COMMANDS[agent] ?? [];
6809
+ const command = agentCommand(agent);
6810
+ return command ? [command] : [];
6399
6811
  }
6400
6812
  /** tmux new-session env flags so the agent's hooks can report back which
6401
6813
  * session they belong to. */
@@ -6414,4 +6826,4 @@ function sleep(ms) {
6414
6826
  return new Promise((resolve) => setTimeout(resolve, ms));
6415
6827
  }
6416
6828
  //#endregion
6417
- export { allPrefs as A, subscribe as B, setScrapedPhase as C, pushPublicKey as D, deleteSubscription as E, gh as F, get as G, subscriberJoins as H, git as I, workspacePath as K, run as L, setPref as M, setSetting as N, saveSubscription as O, TMUX_SOCKET as P, tmux as R, setAgentPhase as S, summaryFromHookPayload as T, all as U, subscriberCount as V, db as W, tmuxName as _, ensureTmuxServer as a, clearAgentPhase as b, killWorkspaceSessions as c, newSessionArgs as d, notifySessionsChanged as f, sessionStates as g, sendToSession as h, disposeSessions as i, preferredAgent as j, AGENTS as k, listSessions as l, renameSession as m, clearTmuxStarted as n, getSession as o, panePids as p, config as q, createSession as r, killSession as s, cleanEnv as t, markTmuxStarted as u, tmuxWasStarted as v, setSessionViewers as w, reasonFromHookPayload as x, reportsWorking as y, publish as z };
6829
+ export { all as $, allPrefs as A, which as B, setScrapedPhase as C, pushPublicKey as D, deleteSubscription as E, setPref as F, gh as G, agentById as H, setSetting as I, tmux as J, git as K, doctor as L, enabledAgents as M, preferredAgent as N, saveSubscription as O, setDisabledAgents as P, subscriberJoins as Q, miseVersions as R, setAgentPhase as S, summaryFromHookPayload as T, toolById as U, TOOLS as V, TMUX_SOCKET as W, subscribe as X, publish as Y, subscriberCount as Z, tmuxName as _, ensureTmuxServer as a, clearAgentPhase as b, killWorkspaceSessions as c, newSessionArgs as d, db as et, notifySessionsChanged as f, sessionStates as g, sendToSession as h, disposeSessions as i, disabledAgents as j, agentChoices as k, listSessions as l, renameSession as m, clearTmuxStarted as n, workspacePath as nt, getSession as o, panePids as p, run$1 as q, createSession as r, config as rt, killSession as s, cleanEnv as t, get as tt, markTmuxStarted as u, tmuxWasStarted as v, setSessionViewers as w, reasonFromHookPayload as x, reportsWorking as y, setupPath as z };
@@ -0,0 +1,2 @@
1
+ import { f as notifySessionsChanged } from "./_CO83dVER.js";
2
+ export { notifySessionsChanged };