@dylanpiercey/work 0.0.138 → 0.0.140

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 (275) hide show
  1. package/README.md +24 -0
  2. package/bin/work.mjs +4 -0
  3. package/dist/{_NJRrlQSH.js → _BVHQZ1Ks.js} +4 -4
  4. package/dist/{_BJg54Xa1.js → _BXzfMZ_J.js} +11 -4
  5. package/dist/{_BU4viilP.js → _CZd0I4nH.js} +56 -56
  6. package/dist/_D2thrkJX.js +2 -0
  7. package/dist/index.mjs +480 -356
  8. package/dist/public/assets/_8J7bPMB9.js +1 -0
  9. package/dist/public/assets/_8J7bPMB9.js.br +0 -0
  10. package/dist/public/assets/{_Dhua8ybj2.js → _AXvUJPqu2.js} +1 -1
  11. package/dist/public/assets/_AXvUJPqu2.js.br +0 -0
  12. package/dist/public/assets/{_DnuQIvTk.js → _B-G2jcQS.js} +1 -1
  13. package/dist/public/assets/_B-G2jcQS.js.br +0 -0
  14. package/dist/public/assets/_B3yGzEa9.js +1 -0
  15. package/dist/public/assets/_B3yGzEa9.js.br +0 -0
  16. package/dist/public/assets/{_3OKw54FH.js → _B9ZAbzhF.js} +1 -1
  17. package/dist/public/assets/_B9ZAbzhF.js.br +0 -0
  18. package/dist/public/assets/{_DmgOfIwN.js → _BAC2OLTW.js} +1 -1
  19. package/dist/public/assets/_BAC2OLTW.js.br +0 -0
  20. package/dist/public/assets/{_CPTI4WQL2.js → _BAQCbH2P2.js} +1 -1
  21. package/dist/public/assets/_BAQCbH2P2.js.br +0 -0
  22. package/dist/public/assets/{_Z4atEQ98.js → _BC1i3jO8.js} +1 -1
  23. package/dist/public/assets/_BC1i3jO8.js.br +0 -0
  24. package/dist/public/assets/{_C5TRZT17.js → _BCaOQTDy.js} +1 -1
  25. package/dist/public/assets/{_DwNwW4jm.js → _BEIP10I4.js} +46 -46
  26. package/dist/public/assets/_BEIP10I4.js.br +0 -0
  27. package/dist/public/assets/{_OIJzbHVo.js → _BKuREDTF.js} +1 -1
  28. package/dist/public/assets/_BKuREDTF.js.br +0 -0
  29. package/dist/public/assets/{_BcpUdCHG.js → _BMpT9JnR.js} +1 -1
  30. package/dist/public/assets/_BMpT9JnR.js.br +0 -0
  31. package/dist/public/assets/{_BEzGQSOa.js → _BbYPTPnv.js} +1 -1
  32. package/dist/public/assets/_BbYPTPnv.js.br +0 -0
  33. package/dist/public/assets/{_AiXBpuzB.js → _BcNyP4hq.js} +1 -1
  34. package/dist/public/assets/_BcNyP4hq.js.br +0 -0
  35. package/dist/public/assets/{_BysVGK9V2.js → _BfitEsfk2.js} +1 -1
  36. package/dist/public/assets/_BfitEsfk2.js.br +0 -0
  37. package/dist/public/assets/{_PcBwrdGV2.js → _Bg6nm0G42.js} +1 -1
  38. package/dist/public/assets/_Bg6nm0G42.js.br +0 -0
  39. package/dist/public/assets/{_BSISAs7U2.js → _BgRQhjCQ2.js} +1 -1
  40. package/dist/public/assets/_BgRQhjCQ2.js.br +0 -0
  41. package/dist/public/assets/_Bg_QV64o.js +1 -0
  42. package/dist/public/assets/_Bg_QV64o.js.br +0 -0
  43. package/dist/public/assets/{_CvFrnNxs.js → _BhFgAjkS.js} +1 -1
  44. package/dist/public/assets/_BhFgAjkS.js.br +0 -0
  45. package/dist/public/assets/{_CPQ8yLEU.js → _Bhm39j0U.js} +1 -1
  46. package/dist/public/assets/_Bhm39j0U.js.br +0 -0
  47. package/dist/public/assets/_Bmj60xc8.js +1 -0
  48. package/dist/public/assets/_Bmj60xc8.js.br +0 -0
  49. package/dist/public/assets/{_kDA0ZntT.js → _BoPD9t5q.js} +1 -1
  50. package/dist/public/assets/_BoPD9t5q.js.br +0 -0
  51. package/dist/public/assets/{_C4-Fa9cE2.js → _BufLBhD52.js} +1 -1
  52. package/dist/public/assets/_BufLBhD52.js.br +0 -0
  53. package/dist/public/assets/_BuwtIM5I.js +1 -0
  54. package/dist/public/assets/_BuwtIM5I.js.br +0 -0
  55. package/dist/public/assets/{_CU93C2BH2.js → _C3Zk3OTU2.js} +1 -1
  56. package/dist/public/assets/_C3Zk3OTU2.js.br +0 -0
  57. package/dist/public/assets/_C4Z5tewe.js +1 -0
  58. package/dist/public/assets/_C4Z5tewe.js.br +0 -0
  59. package/dist/public/assets/{_BIwmkApM.js → _C7fBne76.js} +1 -1
  60. package/dist/public/assets/_C7fBne76.js.br +0 -0
  61. package/dist/public/assets/{_BEQN3C3b2.js → _CHRR_tdf2.js} +1 -1
  62. package/dist/public/assets/_CHRR_tdf2.js.br +0 -0
  63. package/dist/public/assets/{_Dml9mocl.js → _CHkTCCZL.js} +1 -1
  64. package/dist/public/assets/_CHkTCCZL.js.br +0 -0
  65. package/dist/public/assets/{_CUiuEswY2.js → _CJ9NIpKB2.js} +1 -1
  66. package/dist/public/assets/_CQ3jYFa7.js +1 -0
  67. package/dist/public/assets/_CQ3jYFa7.js.br +0 -0
  68. package/dist/public/assets/_CQtiXk-1.js +1 -0
  69. package/dist/public/assets/_CQtiXk-1.js.br +0 -0
  70. package/dist/public/assets/{_B9-bF7w4.js → _CTE7ghx3.js} +1 -1
  71. package/dist/public/assets/_CTE7ghx3.js.br +0 -0
  72. package/dist/public/assets/_CTM65Tgs2.js +1 -0
  73. package/dist/public/assets/_CTM65Tgs2.js.br +0 -0
  74. package/dist/public/assets/{_cvUAeKFs2.js → _CWfLljks2.js} +1 -1
  75. package/dist/public/assets/_CWfLljks2.js.br +0 -0
  76. package/dist/public/assets/{_B9xv7qS42.js → _CXkMfc5M2.js} +1 -1
  77. package/dist/public/assets/_CXkMfc5M2.js.br +0 -0
  78. package/dist/public/assets/{_BrvuWmpM2.js → _CZQJ7BmY2.js} +1 -1
  79. package/dist/public/assets/_CZQJ7BmY2.js.br +0 -0
  80. package/dist/public/assets/_CcOLUAUB.js +1 -0
  81. package/dist/public/assets/_CcOLUAUB.js.br +0 -0
  82. package/dist/public/assets/{_Bpbf18vi.js → _CgAhtyGH.js} +1 -1
  83. package/dist/public/assets/_CgAhtyGH.js.br +0 -0
  84. package/dist/public/assets/{_jOkJ6aek2.js → _CmFZdEqe2.js} +1 -1
  85. package/dist/public/assets/_CmFZdEqe2.js.br +0 -0
  86. package/dist/public/assets/{_B6Kqixfk2.js → _CmHQ_mnt2.js} +1 -1
  87. package/dist/public/assets/_Cp2jGFuU.js +1 -0
  88. package/dist/public/assets/_Cp2jGFuU.js.br +0 -0
  89. package/dist/public/assets/{_Dd1-18Hp.js → _CpSY65dR.js} +1 -1
  90. package/dist/public/assets/_CpSY65dR.js.br +0 -0
  91. package/dist/public/assets/_D2D61dAJ2.js +1 -0
  92. package/dist/public/assets/_D2D61dAJ2.js.br +0 -0
  93. package/dist/public/assets/_D4OqQzgl.js +1 -0
  94. package/dist/public/assets/_D4OqQzgl.js.br +0 -0
  95. package/dist/public/assets/_D6-73p3r.js +1 -0
  96. package/dist/public/assets/_D6-73p3r.js.br +0 -0
  97. package/dist/public/assets/{_DaXvCDxA.js → _DB76xuHC.js} +1 -1
  98. package/dist/public/assets/_DB76xuHC.js.br +0 -0
  99. package/dist/public/assets/{_Cl4_PEdC2.js → _DFMDH4tV2.js} +1 -1
  100. package/dist/public/assets/_DFMDH4tV2.js.br +0 -0
  101. package/dist/public/assets/{_DXu4guU2.js → _DJ2tTUOp.js} +1 -1
  102. package/dist/public/assets/_DJ2tTUOp.js.br +0 -0
  103. package/dist/public/assets/_DKY8j24h.js +1 -0
  104. package/dist/public/assets/_DKY8j24h.js.br +0 -0
  105. package/dist/public/assets/{_Dt9ju-f-.js → _DMmYo41H.js} +1 -1
  106. package/dist/public/assets/_DMmYo41H.js.br +0 -0
  107. package/dist/public/assets/{_vbrsGoKV.js → _DPI9uiRH.js} +1 -1
  108. package/dist/public/assets/_DPI9uiRH.js.br +0 -0
  109. package/dist/public/assets/{_T8YOpcQj2.js → _DTBjw9eZ2.js} +1 -1
  110. package/dist/public/assets/_DTBjw9eZ2.js.br +0 -0
  111. package/dist/public/assets/_DUP19um8.js +1 -0
  112. package/dist/public/assets/_DUP19um8.js.br +0 -0
  113. package/dist/public/assets/_Dbx8VtKF.js +1 -0
  114. package/dist/public/assets/_Dbx8VtKF.js.br +0 -0
  115. package/dist/public/assets/_DmqG9yJU.js +1 -0
  116. package/dist/public/assets/_DmqG9yJU.js.br +0 -0
  117. package/dist/public/assets/{_BnB3kxXv2.js → _DnGbQ0u92.js} +1 -1
  118. package/dist/public/assets/_DnGbQ0u92.js.br +0 -0
  119. package/dist/public/assets/{_DSR5YMpz.js → _DsmPrDz6.js} +1 -1
  120. package/dist/public/assets/_DsmPrDz6.js.br +0 -0
  121. package/dist/public/assets/_DxmtmcQJ.js +1 -0
  122. package/dist/public/assets/_DxmtmcQJ.js.br +0 -0
  123. package/dist/public/assets/{_D0T5xgdm.js → _IHwiKLGt.js} +1 -1
  124. package/dist/public/assets/_IHwiKLGt.js.br +0 -0
  125. package/dist/public/assets/{_DReNRAce2.js → _NBVVn24L2.js} +1 -1
  126. package/dist/public/assets/_NBVVn24L2.js.br +0 -0
  127. package/dist/public/assets/{_n5HhfX_m2.js → _Vg-VYt882.js} +1 -1
  128. package/dist/public/assets/_Vg-VYt882.js.br +0 -0
  129. package/dist/public/assets/_VnhmzZ9q.js +89 -0
  130. package/dist/public/assets/_VnhmzZ9q.js.br +0 -0
  131. package/dist/public/assets/{_Bd-KABgY.js → _W3k8p4Ek.js} +1 -1
  132. package/dist/public/assets/_W3k8p4Ek.js.br +0 -0
  133. package/dist/public/assets/{_BTXpXWX_.js → _YCkwa36v.js} +1 -1
  134. package/dist/public/assets/_YCkwa36v.js.br +0 -0
  135. package/dist/public/assets/{_CaX7kwGj.js → _YjXp8Fa7.js} +1 -1
  136. package/dist/public/assets/_YjXp8Fa7.js.br +0 -0
  137. package/dist/public/assets/{_DaiUj3cu2.js → _a2HWPwTI2.js} +1 -1
  138. package/dist/public/assets/_a2HWPwTI2.js.br +0 -0
  139. package/dist/public/assets/{_B3XWXwYh.js → _aNDhwIJ9.js} +1 -1
  140. package/dist/public/assets/_aNDhwIJ9.js.br +0 -0
  141. package/dist/public/assets/{_xEbKAoEJ.js → _bjzjp9qV.js} +1 -1
  142. package/dist/public/assets/_bjzjp9qV.js.br +0 -0
  143. package/dist/public/assets/_cJ8FGCbf.js +1 -0
  144. package/dist/public/assets/_cJ8FGCbf.js.br +0 -0
  145. package/dist/public/assets/_gGP1uofp.js +1 -0
  146. package/dist/public/assets/_gGP1uofp.js.br +0 -0
  147. package/dist/public/assets/_jDIdu88k2.js +1 -0
  148. package/dist/public/assets/_jDIdu88k2.js.br +0 -0
  149. package/dist/public/assets/{_pq7cZIB5.js → _pTrFhub3.js} +1 -1
  150. package/dist/public/assets/_pTrFhub3.js.br +0 -0
  151. package/dist/public/assets/{_C8z0AqL9.js → _wtrNcQUN.js} +1 -1
  152. package/dist/public/assets/_wtrNcQUN.js.br +0 -0
  153. package/dist/public/assets/{_CtoSA4u9.js → _xrYLiFvZ.js} +1 -1
  154. package/dist/public/assets/_xrYLiFvZ.js.br +0 -0
  155. package/dist/public/assets/_yDHOPHcI2.js +1 -0
  156. package/dist/public/assets/_yDHOPHcI2.js.br +0 -0
  157. package/dist/public/assets/app-page-DD8AAZI2.css +1 -0
  158. package/dist/public/assets/app-page-DD8AAZI2.css.br +0 -0
  159. package/dist/public/assets/diff-view-CigyjzyU.css +1 -0
  160. package/dist/public/assets/diff-view-CigyjzyU.css.br +0 -0
  161. package/dist/public/assets/new-CeNxYCDk.js +1 -0
  162. package/dist/public/assets/settings-CeNxYCDk.js +1 -0
  163. package/dist/public/assets/w-CeNxYCDk.js +1 -0
  164. package/dist/public/assets/w._-CY06s2qp.js +1 -0
  165. package/dist/public/assets/w._-CeNxYCDk.js +1 -0
  166. package/lib/setup/catalog.mjs +3 -2
  167. package/lib/share/manifest.mjs +3 -3
  168. package/package.json +1 -1
  169. package/dist/_B3qThpAM.js +0 -2
  170. package/dist/public/assets/_3OKw54FH.js.br +0 -0
  171. package/dist/public/assets/_AiXBpuzB.js.br +0 -0
  172. package/dist/public/assets/_B3XWXwYh.js.br +0 -0
  173. package/dist/public/assets/_B7PLqair2.js +0 -1
  174. package/dist/public/assets/_B7PLqair2.js.br +0 -0
  175. package/dist/public/assets/_B9-bF7w4.js.br +0 -0
  176. package/dist/public/assets/_B9xv7qS42.js.br +0 -0
  177. package/dist/public/assets/_BEQN3C3b2.js.br +0 -0
  178. package/dist/public/assets/_BEzGQSOa.js.br +0 -0
  179. package/dist/public/assets/_BIwmkApM.js.br +0 -0
  180. package/dist/public/assets/_BSISAs7U2.js.br +0 -0
  181. package/dist/public/assets/_BTXpXWX_.js.br +0 -0
  182. package/dist/public/assets/_BWxRtsYe.js +0 -1
  183. package/dist/public/assets/_BWxRtsYe.js.br +0 -0
  184. package/dist/public/assets/_Ba_fRTxl.js +0 -1
  185. package/dist/public/assets/_Ba_fRTxl.js.br +0 -0
  186. package/dist/public/assets/_BcpUdCHG.js.br +0 -0
  187. package/dist/public/assets/_Bd-KABgY.js.br +0 -0
  188. package/dist/public/assets/_BmbR7-Sm.js +0 -1
  189. package/dist/public/assets/_BmbR7-Sm.js.br +0 -0
  190. package/dist/public/assets/_BnB3kxXv2.js.br +0 -0
  191. package/dist/public/assets/_Bo25KMr2.js +0 -1
  192. package/dist/public/assets/_Bo25KMr2.js.br +0 -0
  193. package/dist/public/assets/_Bpbf18vi.js.br +0 -0
  194. package/dist/public/assets/_BpidOAFS.js +0 -1
  195. package/dist/public/assets/_BpidOAFS.js.br +0 -0
  196. package/dist/public/assets/_BrvuWmpM2.js.br +0 -0
  197. package/dist/public/assets/_BvJf61W8.js +0 -1
  198. package/dist/public/assets/_BvJf61W8.js.br +0 -0
  199. package/dist/public/assets/_BysVGK9V2.js.br +0 -0
  200. package/dist/public/assets/_C4-Fa9cE2.js.br +0 -0
  201. package/dist/public/assets/_C8z0AqL9.js.br +0 -0
  202. package/dist/public/assets/_CDd7pldP.js +0 -1
  203. package/dist/public/assets/_CDd7pldP.js.br +0 -0
  204. package/dist/public/assets/_CIL_tvto.js +0 -1
  205. package/dist/public/assets/_CIL_tvto.js.br +0 -0
  206. package/dist/public/assets/_CMWNil0b.js +0 -1
  207. package/dist/public/assets/_CMWNil0b.js.br +0 -0
  208. package/dist/public/assets/_CPQ8yLEU.js.br +0 -0
  209. package/dist/public/assets/_CPTI4WQL2.js.br +0 -0
  210. package/dist/public/assets/_CU93C2BH2.js.br +0 -0
  211. package/dist/public/assets/_CUgh4Geb.js +0 -1
  212. package/dist/public/assets/_CUgh4Geb.js.br +0 -0
  213. package/dist/public/assets/_CYNQgKbT.js +0 -89
  214. package/dist/public/assets/_CYNQgKbT.js.br +0 -0
  215. package/dist/public/assets/_CaX7kwGj.js.br +0 -0
  216. package/dist/public/assets/_CanSxUih.js +0 -1
  217. package/dist/public/assets/_CanSxUih.js.br +0 -0
  218. package/dist/public/assets/_Cl4_PEdC2.js.br +0 -0
  219. package/dist/public/assets/_CtoSA4u9.js.br +0 -0
  220. package/dist/public/assets/_Cv1rmZqs.js +0 -1
  221. package/dist/public/assets/_Cv1rmZqs.js.br +0 -0
  222. package/dist/public/assets/_CvFrnNxs.js.br +0 -0
  223. package/dist/public/assets/_CxuGj9Kh.js +0 -1
  224. package/dist/public/assets/_CxuGj9Kh.js.br +0 -0
  225. package/dist/public/assets/_CyUsS-Ew.js +0 -1
  226. package/dist/public/assets/_CyUsS-Ew.js.br +0 -0
  227. package/dist/public/assets/_D0T5xgdm.js.br +0 -0
  228. package/dist/public/assets/_D8uW-24S.js +0 -1
  229. package/dist/public/assets/_D8uW-24S.js.br +0 -0
  230. package/dist/public/assets/_DClX-kzp2.js +0 -1
  231. package/dist/public/assets/_DClX-kzp2.js.br +0 -0
  232. package/dist/public/assets/_DE6OIuaj.js +0 -1
  233. package/dist/public/assets/_DE6OIuaj.js.br +0 -0
  234. package/dist/public/assets/_DReNRAce2.js.br +0 -0
  235. package/dist/public/assets/_DSR5YMpz.js.br +0 -0
  236. package/dist/public/assets/_DXu4guU2.js.br +0 -0
  237. package/dist/public/assets/_DaXvCDxA.js.br +0 -0
  238. package/dist/public/assets/_DaiUj3cu2.js.br +0 -0
  239. package/dist/public/assets/_Dd1-18Hp.js.br +0 -0
  240. package/dist/public/assets/_DffLVIPj2.js +0 -1
  241. package/dist/public/assets/_DffLVIPj2.js.br +0 -0
  242. package/dist/public/assets/_Dhua8ybj2.js.br +0 -0
  243. package/dist/public/assets/_DmgOfIwN.js.br +0 -0
  244. package/dist/public/assets/_Dml9mocl.js.br +0 -0
  245. package/dist/public/assets/_DnuQIvTk.js.br +0 -0
  246. package/dist/public/assets/_Dt9ju-f-.js.br +0 -0
  247. package/dist/public/assets/_Dtcj4Vdb2.js +0 -1
  248. package/dist/public/assets/_Dtcj4Vdb2.js.br +0 -0
  249. package/dist/public/assets/_DwNwW4jm.js.br +0 -0
  250. package/dist/public/assets/_DwsYmrLF.js +0 -1
  251. package/dist/public/assets/_DwsYmrLF.js.br +0 -0
  252. package/dist/public/assets/_OIJzbHVo.js.br +0 -0
  253. package/dist/public/assets/_PcBwrdGV2.js.br +0 -0
  254. package/dist/public/assets/_SSrroa0Z.js +0 -1
  255. package/dist/public/assets/_SSrroa0Z.js.br +0 -0
  256. package/dist/public/assets/_T8YOpcQj2.js.br +0 -0
  257. package/dist/public/assets/_Z4atEQ98.js.br +0 -0
  258. package/dist/public/assets/_cvUAeKFs2.js.br +0 -0
  259. package/dist/public/assets/_jOkJ6aek2.js.br +0 -0
  260. package/dist/public/assets/_kDA0ZntT.js.br +0 -0
  261. package/dist/public/assets/_n5HhfX_m2.js.br +0 -0
  262. package/dist/public/assets/_pq7cZIB5.js.br +0 -0
  263. package/dist/public/assets/_quIdZaH6.js +0 -1
  264. package/dist/public/assets/_quIdZaH6.js.br +0 -0
  265. package/dist/public/assets/_vbrsGoKV.js.br +0 -0
  266. package/dist/public/assets/_xEbKAoEJ.js.br +0 -0
  267. package/dist/public/assets/app-page-D0e78Fao.css +0 -1
  268. package/dist/public/assets/app-page-D0e78Fao.css.br +0 -0
  269. package/dist/public/assets/diff-view-Csph_Zzt.css +0 -1
  270. package/dist/public/assets/diff-view-Csph_Zzt.css.br +0 -0
  271. package/dist/public/assets/new-5LeFVg_7.js +0 -1
  272. package/dist/public/assets/settings-5LeFVg_7.js +0 -1
  273. package/dist/public/assets/w-5LeFVg_7.js +0 -1
  274. package/dist/public/assets/w._-5LeFVg_7.js +0 -1
  275. package/dist/public/assets/w._-CYXtcUyN.js +0 -1
package/README.md CHANGED
@@ -68,6 +68,29 @@ Everything (pages, API, and the `/term` websockets) serves from the single
68
68
  app port, so route the whole hostname to it. Set
69
69
  `WORK_ALLOWED_HOSTS=your.domain` so the dev server accepts the hostname.
70
70
 
71
+ **Opening workspace ports remotely.** The port chips in the sidebar link to
72
+ `http://<host>:<port>`, which only works where the machine is reachable
73
+ directly. Through a tunnel, route a wildcard hostname to the app port as
74
+ well and work proxies it — HTTP and websockets, so HMR works — to
75
+ `localhost:<port>`. Two hostname shapes are accepted; `WORK_PORT_HOSTS`
76
+ picks which one the chips link to:
77
+
78
+ - `sub` (default): `https://3000.work.example.com`. Needs a wildcard
79
+ `*.work.example.com` route and a certificate that covers it (your own
80
+ reverse proxy with a DNS-01 wildcard; Cloudflare only with Advanced
81
+ Certificate Manager, since Universal SSL covers one label).
82
+ - `dash`: `https://3000-work.example.com`. One label under the zone, so a
83
+ Cloudflare Tunnel works on the free plan. DNS wildcards match a whole
84
+ label, so the tunnel's public hostname is `*.example.com` pointing at
85
+ the app port, with an Access application on the same wildcard so the
86
+ ports sit behind the same login as the app. Work ignores hostnames that
87
+ do not start with a port, so other names under the zone are unaffected.
88
+
89
+ Only loopback ports on the work machine are reachable, behind the same
90
+ auth as the app. API writes and the terminal websockets refuse a foreign
91
+ `Origin`, so a page a workspace serves cannot drive work with the shared
92
+ login cookie.
93
+
71
94
  > **Upgrading from the two-port layout:** older setups routed `/term/*` to a
72
95
  > separate terminal port (7172). That port no longer exists — remove the
73
96
  > `/term` rule from your tunnel/proxy config and send all traffic to the app
@@ -109,6 +132,7 @@ targeting that branch.
109
132
  | `WORK_DATA_DIR` | `~/.local/share/work` | sqlite db and server state |
110
133
  | `WORK_APP_PORT` | `7171` | HTTP server (app, assets, and `/term` websockets) |
111
134
  | `WORK_ALLOWED_HOSTS` | — | Extra dev-server hostnames (comma-separated) |
135
+ | `WORK_PORT_HOSTS` | `sub` | Port-chip hostname shape: `sub` / `dash` (see above) |
112
136
  | `WORK_USER` / `WORK_HOST` | current user/host | Branch-name prefix parts |
113
137
  | `WORK_BRANCH_PREFIX` | `<user>-<host>` | Whole branch-name prefix, overriding the parts |
114
138
 
package/bin/work.mjs CHANGED
@@ -612,9 +612,13 @@ function allowScriptsArgs() {
612
612
 
613
613
  async function update() {
614
614
  log("updating @dylanpiercey/work");
615
+ // `--prefer-online`: npm serves `latest` from a cached packument for a
616
+ // few minutes after a publish, so an update right behind a release
617
+ // reinstalled the version already running.
615
618
  sh("npm", [
616
619
  "install",
617
620
  "-g",
621
+ "--prefer-online",
618
622
  ...allowScriptsArgs(),
619
623
  "@dylanpiercey/work@latest",
620
624
  ]);
@@ -2182,8 +2182,8 @@ function theme() {
2182
2182
  function setTheme(mode) {
2183
2183
  set("theme", mode === "system" ? null : mode);
2184
2184
  }
2185
- var sectionCount = "_by _L _M";
2186
- var row = "_bJ _bB";
2185
+ var sectionCount = "_bH _L _M";
2186
+ var row = "_bS _bK";
2187
2187
  var iconBtn = "_3 _j";
2188
2188
  //#endregion
2189
2189
  //#region src/tags/icons/icon-refresh.marko
@@ -2329,8 +2329,8 @@ var icon_sidebar_default = _template("mb", (input) => {
2329
2329
  });
2330
2330
  _serialize_if($scope0_reason, 0) && writeScope($scope0_id, { a: _existing_scope($childScope) });
2331
2331
  });
2332
- var findInput = "_gE _l";
2333
- var findIconBtn = "_gH _j";
2332
+ var findInput = "_gI _l";
2333
+ var findIconBtn = "_gL _j";
2334
2334
  //#endregion
2335
2335
  //#region src/tags/icons/icon-arrow-down.marko
2336
2336
  var icon_arrow_down_default = _template("K", (input) => {
@@ -30,7 +30,13 @@ var config = {
30
30
  },
31
31
  /** HTTP server port — the app, static assets, and /term websockets all
32
32
  * serve from this single port (src/entry.ts). */
33
- appPort: Number(process.env.WORK_APP_PORT || 7171)
33
+ appPort: Number(process.env.WORK_APP_PORT || 7171),
34
+ /** How a workspace port is named in a hostname the app proxies
35
+ * (server/port-proxy.ts): `sub` is `3000.work.example.com`, `dash` is
36
+ * `3000-work.example.com`. The server accepts both; this only picks
37
+ * which one the port chips link to. `dash` stays one label under the
38
+ * zone, which is what a free Cloudflare certificate covers. */
39
+ portHosts: process.env.WORK_PORT_HOSTS === "dash" ? "dash" : "sub"
34
40
  };
35
41
  fs.mkdirSync(config.dataDir, { recursive: true });
36
42
  //#endregion
@@ -260,8 +266,9 @@ var agents_default = [
260
266
  //#endregion
261
267
  //#region lib/setup/catalog.mjs
262
268
  /** Machine tools. `required` ones gate readiness; the rest are the utilities
263
- * agents reach for constantly (mirrors DylanPiercey/start). Static binaries via
264
- * mise, except the system packages the installer provides (git, tmux). */
269
+ * agents reach for constantly (search, JSON, HTTP, process tools). Static
270
+ * binaries via mise, except the system packages the installer provides
271
+ * (git, tmux). */
265
272
  var TOOLS = [
266
273
  {
267
274
  id: "git",
@@ -6573,7 +6580,7 @@ function publishChange(sessionId) {
6573
6580
  const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
6574
6581
  if (row?.workspace_id) {
6575
6582
  const workspaceId = row.workspace_id;
6576
- import("./_B3qThpAM.js").then((m) => m.notifySessionsChanged(workspaceId));
6583
+ import("./_D2thrkJX.js").then((m) => m.notifySessionsChanged(workspaceId));
6577
6584
  return;
6578
6585
  }
6579
6586
  publish("sessions.changed");
@@ -1,4 +1,4 @@
1
- import { At as _serialize_if, B as iconBtnXs, Bt as writeScope, Ct as _resume_branch, D as toast_default, Dt as _script, Et as _scope_with_id, J as _attr_details_or_dialog_open, K as _attr, M as repoLabel, Mt as _subscribe, Nt as _template, O as icon_xmark_default, Ot as _sep, Q as _attr_option_value, R as iconBtnLg, St as _resume, Tt as _scope_reason, W as tone, X as _attr_input_value, _ as diffScope, a as fuzzy, b as setDiffPos, bt as _if, c as icon_search_default, ct as _el, d as icon_refresh_default, dt as _escape, et as _attr_select_value, g as diffPos, h as diffFilter, ht as _for_of, i as icon_sidebar_default, jt as _set_serialize_reason, k as icon_base_default, kt as _serialize_guard, l as icon_chevron_right_default, lt as _el_read_error, n as findIconBtn, ot as _content_resume, pt as _existing_scope, q as _attr_class, r as findInput, s as icon_arrow_up_default, t as icon_arrow_down_default, tt as _attr_style, u as icon_back_default, ut as _el_resume, v as diffTreeOpen, vt as _html, wt as _scope_id, x as setDiffScope, xt as _peek_scope_id, z as iconBtnRow } from "./_NJRrlQSH.js";
1
+ import { At as _serialize_if, B as iconBtnXs, Bt as writeScope, Ct as _resume_branch, D as toast_default, Dt as _script, Et as _scope_with_id, J as _attr_details_or_dialog_open, K as _attr, M as repoLabel, Mt as _subscribe, Nt as _template, O as icon_xmark_default, Ot as _sep, Q as _attr_option_value, R as iconBtnLg, St as _resume, Tt as _scope_reason, W as tone, X as _attr_input_value, _ as diffScope, a as fuzzy, b as setDiffPos, bt as _if, c as icon_search_default, ct as _el, d as icon_refresh_default, dt as _escape, et as _attr_select_value, g as diffPos, h as diffFilter, ht as _for_of, i as icon_sidebar_default, jt as _set_serialize_reason, k as icon_base_default, kt as _serialize_guard, l as icon_chevron_right_default, lt as _el_read_error, n as findIconBtn, ot as _content_resume, pt as _existing_scope, q as _attr_class, r as findInput, s as icon_arrow_up_default, t as icon_arrow_down_default, tt as _attr_style, u as icon_back_default, ut as _el_resume, v as diffTreeOpen, vt as _html, wt as _scope_id, x as setDiffScope, xt as _peek_scope_id, z as iconBtnRow } from "./_BVHQZ1Ks.js";
2
2
  //#region src/client/router.ts
3
3
  function urlFor(r) {
4
4
  if (r.view === "settings") return "/settings";
@@ -242,8 +242,8 @@ function treeDirs(files) {
242
242
  };
243
243
  return build(root, "", "", -1);
244
244
  }
245
- var treeToggle = "_f_ _3 _j";
246
- var pageTitle = "_gg _bQ";
245
+ var treeToggle = "_fA _3 _j";
246
+ var pageTitle = "_fH _bA";
247
247
  //#endregion
248
248
  //#region src/tags/diff-send.marko
249
249
  var diff_send_default = _template("j", (input) => {
@@ -253,7 +253,7 @@ var diff_send_default = _template("j", (input) => {
253
253
  let sendTarget = null;
254
254
  const sessions = input.sessions || [];
255
255
  const sendPick = sessions.some((s) => s.id === sendTarget) ? sendTarget : sessions[0]?.id ?? null;
256
- _html(`<span${_attr_class("_gP")}><button type=button${_attr_class("_o")} title="Copy comments as markdown">Copy${_el_resume($scope0_id, "c")}</button>${_el_resume($scope0_id, "b")}`);
256
+ _html(`<span${_attr_class("_gC")}><button type=button${_attr_class("_o")} title="Copy comments as markdown">Copy${_el_resume($scope0_id, "c")}</button>${_el_resume($scope0_id, "b")}`);
257
257
  _if(() => {
258
258
  if (sessions.length === 1) {
259
259
  const $scope1_id = _scope_id();
@@ -263,11 +263,11 @@ var diff_send_default = _template("j", (input) => {
263
263
  return 0;
264
264
  } else if (sessions.length) {
265
265
  const $scope2_id = _scope_id();
266
- _html(`<span${_attr_class("_gQ")}><button type=button${_attr_class(["_p", "_gR"])}${_attr("disabled", sending)}>Send to${_el_resume($scope2_id, "c")}</button>${_el_resume($scope2_id, "b")}`);
266
+ _html(`<span${_attr_class("_gD")}><button type=button${_attr_class(["_p", "_gE"])}${_attr("disabled", sending)}>Send to${_el_resume($scope2_id, "c")}</button>${_el_resume($scope2_id, "b")}`);
267
267
  _attr_select_value($scope2_id, "d", sendTarget, _resume((_new_sendTarget) => {
268
268
  sendTarget = _new_sendTarget;
269
269
  }, "j0", $scope2_id), () => {
270
- _html(`<select${_attr_class("_gS")} aria-label="Send comments to session"${_attr("disabled", sending)}>`);
270
+ _html(`<select${_attr_class("_gF")} aria-label="Send comments to session"${_attr("disabled", sending)}>`);
271
271
  _for_of(sessions, (s) => {
272
272
  const $scope3_id = _scope_id();
273
273
  _html(`<option${_attr_option_value(s.id)}>${_escape(s.title || s.agent)}${_el_resume($scope3_id, "b", $sg__input_sessions)}</option>${_el_resume($scope3_id, "a", $sg__input_sessions)}`);
@@ -1849,9 +1849,9 @@ var diff_find_default = _template("i", (input) => {
1849
1849
  el.select();
1850
1850
  }, 0);
1851
1851
  }, "i5", $scope0_id);
1852
- _html(`<div${_attr_class(["_gD", !open && "_gC"])} aria-hidden=${open ? "false" : "true"}><input${_attr_input_value($scope0_id, "b", query || "", _resume(function(v) {
1852
+ _html(`<div${_attr_class(["_gH", !open && "_gG"])} aria-hidden=${open ? "false" : "true"}><input${_attr_input_value($scope0_id, "b", query || "", _resume(function(v) {
1853
1853
  type(v);
1854
- }, "i0", $scope0_id))}${_attr_class(findInput)} type=search enterkeyhint=search autocomplete=off tabindex=${open ? "0" : "-1"} placeholder="Find in review" aria-label="Find in review">${_el_resume($scope0_id, "b")}<span${_attr_class("_gG")}>${open && (query || "").trim() ? hits.length ? `${_escape(`${at + 1}`)}/${_escape(`${hits.length}`)}` : "0/0" : ""}${_el_resume($scope0_id, "d")}</span><button type=button${_attr_class(findIconBtn)} title="Previous match"${_attr("disabled", !hits.length || !open)} tabindex=${open ? "0" : "-1"}>`);
1854
+ }, "i0", $scope0_id))}${_attr_class(findInput)} type=search enterkeyhint=search autocomplete=off tabindex=${open ? "0" : "-1"} placeholder="Find in review" aria-label="Find in review">${_el_resume($scope0_id, "b")}<span${_attr_class("_gK")}>${open && (query || "").trim() ? hits.length ? `${_escape(`${at + 1}`)}/${_escape(`${hits.length}`)}` : "0/0" : ""}${_el_resume($scope0_id, "d")}</span><button type=button${_attr_class(findIconBtn)} title="Previous match"${_attr("disabled", !hits.length || !open)} tabindex=${open ? "0" : "-1"}>`);
1855
1855
  icon_arrow_up_default({ size: 14 });
1856
1856
  _html(`</button>${_el_resume($scope0_id, "e")}<button type=button${_attr_class(findIconBtn)} title="Next match"${_attr("disabled", !hits.length || !open)} tabindex=${open ? "0" : "-1"}>`);
1857
1857
  icon_arrow_down_default({ size: 14 });
@@ -1894,7 +1894,7 @@ var diff_find_default = _template("i", (input) => {
1894
1894
  //#endregion
1895
1895
  //#region src/client/branch-label.ts
1896
1896
  /** Fallback label for a workspace branch when the workspace name is not to
1897
- * hand: `dpiercey-ws-work-4f1hei` → `dpiercey-ws-work`.
1897
+ * hand: `alice-laptop-checkout-4f1hei` → `alice-laptop-checkout`.
1898
1898
  *
1899
1899
  * Deliberately only drops the trailing id. The branch is
1900
1900
  * `{user}-{host}-{slug}-{id}` (server/config.ts `branchPrefix`), and both
@@ -1952,9 +1952,9 @@ function shortBranch(name, wsBranch = "", wsName = "") {
1952
1952
  }
1953
1953
  return shortHeadFallback(head);
1954
1954
  }
1955
- var repoWorktree = "_hy _w";
1956
- var repoTitle = "_hE _v";
1957
- var path = "_hV __";
1955
+ var repoWorktree = "_h3 _w";
1956
+ var repoTitle = "_h9 _v";
1957
+ var path = "_ip __";
1958
1958
  //#endregion
1959
1959
  //#region src/tags/icons/icon-chevron-down.marko
1960
1960
  var icon_chevron_down_default = _template("T", (input) => {
@@ -2090,14 +2090,14 @@ var review_section_default = _template("w", (input) => {
2090
2090
  const newCount = input.files.filter((f) => f.changedSince).length;
2091
2091
  const compare$1 = reviewCompareLabel(repo.pr?.baseRefName || repo.base, repo.pr?.headRefName || repo.branch, input.workspaceBranch, input.workspaceName);
2092
2092
  const prTitle = repo.pr ? `${repo.pr.title}: ${repo.pr.headRefName} ${repo.head} vs ${repo.base} ${repo.baseSha}` : "";
2093
- _html(`<section${_attr_class("_hu")}${repo.pr ? _attr("data-pr", `${repo.worktree}/${repo.pr.number}`) : ""}${_attr("hidden", !shownCount && !repo.pr && input.findHit?.repo !== repo.id)}><div${_attr_class(["_hv", { ["_hw"]: input.collapsible && input.collapsed }])}>`);
2093
+ _html(`<section${_attr_class("_hZ")}${repo.pr ? _attr("data-pr", `${repo.worktree}/${repo.pr.number}`) : ""}${_attr("hidden", !shownCount && !repo.pr && input.findHit?.repo !== repo.id)}><div${_attr_class(["_h0", { ["_h1"]: input.collapsible && input.collapsed }])}>`);
2094
2094
  _if(() => {
2095
2095
  if (input.collapsible) {
2096
2096
  const $scope1_id = _scope_id();
2097
- _html(`<button type=button${_attr_class("_hx")} aria-expanded=${!input.collapsed ? "true" : "false"} aria-busy=${input.expanding ? "true" : "false"}${input.collapsed ? _attr("title", `Show ${countLabel} files`) : " title=\"Hide files\""}><span${_attr_class([
2098
- "_hS",
2099
- !input.collapsed && "_hT",
2100
- input.expanding && "_hU"
2097
+ _html(`<button type=button${_attr_class("_h2")} aria-expanded=${!input.collapsed ? "true" : "false"} aria-busy=${input.expanding ? "true" : "false"}${input.collapsed ? _attr("title", `Show ${countLabel} files`) : " title=\"Hide files\""}><span${_attr_class([
2098
+ "_im",
2099
+ !input.collapsed && "_in",
2100
+ input.expanding && "_io"
2101
2101
  ])} aria-hidden=true>`);
2102
2102
  _if(() => {
2103
2103
  if (input.collapsed) {
@@ -2136,14 +2136,14 @@ var review_section_default = _template("w", (input) => {
2136
2136
  return 1;
2137
2137
  }
2138
2138
  }, $scope0_id, "d", $sg__input_repo, $sg__input_repo, $sg__input_repo__OR__input_files__OR__input_shownKeys__OR__input_workspaceBranch__OR__input_workspaceName__OR__input_collapsible__OR__input_collapsed__OR__input_localDiffers__OR__input_onlyNew__OR__input_opened);
2139
- _html(`<span${_attr_class("_hF")}${_attr("title", `${compare$1.title} · ${repo.head.slice(0, 7)}…${repo.baseSha.slice(0, 7)}`)}><span${_attr_class(["_L", "_hG"])}>${_escape(compare$1.base)}${_el_resume($scope0_id, "g", $sg__input_repo__OR__input_workspaceBranch__OR__input_workspaceName)}</span><span${_attr_class(["_N", "_hI"])} aria-hidden=true>vs</span><span${_attr_class(["_L", "_hH"])}>${_escape(compare$1.head)}${_el_resume($scope0_id, "j", $sg__input_repo__OR__input_workspaceBranch__OR__input_workspaceName)}</span>`);
2139
+ _html(`<span${_attr_class("_h_")}${_attr("title", `${compare$1.title} · ${repo.head.slice(0, 7)}…${repo.baseSha.slice(0, 7)}`)}><span${_attr_class(["_L", "_ia"])}>${_escape(compare$1.base)}${_el_resume($scope0_id, "g", $sg__input_repo__OR__input_workspaceBranch__OR__input_workspaceName)}</span><span${_attr_class(["_N", "_ic"])} aria-hidden=true>vs</span><span${_attr_class(["_L", "_ib"])}>${_escape(compare$1.head)}${_el_resume($scope0_id, "j", $sg__input_repo__OR__input_workspaceBranch__OR__input_workspaceName)}</span>`);
2140
2140
  _if(() => {
2141
2141
  if (compare$1.topic) {
2142
2142
  const $scope16_id = _scope_id();
2143
2143
  _html(`<span${_attr_class([
2144
2144
  "_L",
2145
2145
  tone.accent,
2146
- "_hJ"
2146
+ "_id"
2147
2147
  ])}>${_escape(compare$1.topic)}${_el_resume($scope16_id, "b", $sg__input_repo__OR__input_workspaceBranch__OR__input_workspaceName)}</span>`);
2148
2148
  $si__input_repo__OR__input_workspaceBranch__OR__input_workspaceName && writeScope($scope16_id, { _: _scope_with_id($scope0_id) });
2149
2149
  return 0;
@@ -2156,7 +2156,7 @@ var review_section_default = _template("w", (input) => {
2156
2156
  _html(`<button type=button${_attr_class([
2157
2157
  "_L",
2158
2158
  tone.warn,
2159
- "_hK"
2159
+ "_ie"
2160
2160
  ])}${_attr("title", `origin/${repo.pr.headRefName} ${repo.head} · GitHub ${repo.pr.headRefOid}. Reload to re-ask GitHub`)}${_attr("disabled", input.loading)}>behind GitHub ${_sep($sg__input_repo)}${_escape(shortSha(repo.head, 7))}${_el_resume($scope2_id, "b", $sg__input_repo)} → ${_sep($sg__input_repo)}${_escape(shortSha(repo.pr.headRefOid, 7))}${_el_resume($scope2_id, "c", $sg__input_repo)}</button>${_el_resume($scope2_id, "a")}`);
2161
2161
  _script($scope2_id, "w10");
2162
2162
  writeScope($scope2_id, { _: _scope_with_id($scope0_id) });
@@ -2166,7 +2166,7 @@ var review_section_default = _template("w", (input) => {
2166
2166
  _if(() => {
2167
2167
  if (repo.contained && input.files.length) {
2168
2168
  const $scope13_id = _scope_id();
2169
- _html(`<span${_attr_class(["_L", "_hK"])}${_attr("title", `${repo.pr ? `#${repo.pr.number}` : repo.branch} is already in ${repo.base}; showing the working tree only`)}>already in ${_sep($sg__input_repo)}${_escape(repo.base)}${_el_resume($scope13_id, "b", $sg__input_repo)}</span>${_el_resume($scope13_id, "a", $sg__input_repo)}`);
2169
+ _html(`<span${_attr_class(["_L", "_ie"])}${_attr("title", `${repo.pr ? `#${repo.pr.number}` : repo.branch} is already in ${repo.base}; showing the working tree only`)}>already in ${_sep($sg__input_repo)}${_escape(repo.base)}${_el_resume($scope13_id, "b", $sg__input_repo)}</span>${_el_resume($scope13_id, "a", $sg__input_repo)}`);
2170
2170
  _serialize_if($scope0_reason, 0) && writeScope($scope13_id, { _: $si__input_repo && _scope_with_id($scope0_id) });
2171
2171
  return 0;
2172
2172
  }
@@ -2174,16 +2174,16 @@ var review_section_default = _template("w", (input) => {
2174
2174
  _if(() => {
2175
2175
  if (input.localDiffers) {
2176
2176
  const $scope3_id = _scope_id();
2177
- _html(`<span${_attr_class(["_L", "_hK"])}${_attr("title", `This view is ${shortSha(repo.head)} (${repo.pr.headRefName}); checked out is ${shortSha(repo.localHead)} (${repo.branch})`)}>local ${_sep($sg__input_repo__OR__input_workspaceBranch__OR__input_workspaceName)}${_escape(shortBranch(repo.branch, input.workspaceBranch, input.workspaceName))}${_el_resume($scope3_id, "b", $sg__input_repo__OR__input_workspaceBranch__OR__input_workspaceName)}${_sep($sg__input_repo)}${_escape(shortSha(repo.localHead, 7))}${_el_resume($scope3_id, "c", $sg__input_repo)}</span>${_el_resume($scope3_id, "a", $sg__input_repo)}`);
2177
+ _html(`<span${_attr_class(["_L", "_ie"])}${_attr("title", `This view is ${shortSha(repo.head)} (${repo.pr.headRefName}); checked out is ${shortSha(repo.localHead)} (${repo.branch})`)}>local ${_sep($sg__input_repo__OR__input_workspaceBranch__OR__input_workspaceName)}${_escape(shortBranch(repo.branch, input.workspaceBranch, input.workspaceName))}${_el_resume($scope3_id, "b", $sg__input_repo__OR__input_workspaceBranch__OR__input_workspaceName)}${_sep($sg__input_repo)}${_escape(shortSha(repo.localHead, 7))}${_el_resume($scope3_id, "c", $sg__input_repo)}</span>${_el_resume($scope3_id, "a", $sg__input_repo)}`);
2178
2178
  $si__input_repo__OR__input_workspaceBranch__OR__input_workspaceName__OR__input_localDiffers && writeScope($scope3_id, { _: $si__input_repo__OR__input_workspaceBranch__OR__input_workspaceName && _scope_with_id($scope0_id) });
2179
2179
  return 0;
2180
2180
  }
2181
2181
  }, $scope0_id, "n", _serialize_guard($scope0_reason, 23), _serialize_guard($scope0_reason, 38), $sg__input_repo__OR__input_files__OR__input_shownKeys__OR__input_workspaceBranch__OR__input_workspaceName__OR__input_collapsible__OR__input_collapsed__OR__input_localDiffers__OR__input_onlyNew__OR__input_opened, 0, 1);
2182
- _html(`<span${_attr_class("_hz")}><span>${_escape(countLabel)}${_el_resume($scope0_id, "p", $sg__input_files__OR__input_shownKeys)} file${_sep($sg__input_files__OR__input_shownKeys)}${countLabel === 1 ? "" : "s"}${_el_resume($scope0_id, "q", $sg__input_files__OR__input_shownKeys)}</span>`);
2182
+ _html(`<span${_attr_class("_h4")}><span>${_escape(countLabel)}${_el_resume($scope0_id, "p", $sg__input_files__OR__input_shownKeys)} file${_sep($sg__input_files__OR__input_shownKeys)}${countLabel === 1 ? "" : "s"}${_el_resume($scope0_id, "q", $sg__input_files__OR__input_shownKeys)}</span>`);
2183
2183
  _if(() => {
2184
2184
  if (stats.additions || stats.deletions) {
2185
2185
  const $scope15_id = _scope_id();
2186
- _html(`<span${_attr_class("_hA")}>+${_sep($sg__input_files__OR__input_shownKeys)}${_escape(stats.additions)}${_el_resume($scope15_id, "b", $sg__input_files__OR__input_shownKeys)}</span><span${_attr_class("_hB")}>−${_sep($sg__input_files__OR__input_shownKeys)}${_escape(stats.deletions)}${_el_resume($scope15_id, "d", $sg__input_files__OR__input_shownKeys)}</span>`);
2186
+ _html(`<span${_attr_class("_h5")}>+${_sep($sg__input_files__OR__input_shownKeys)}${_escape(stats.additions)}${_el_resume($scope15_id, "b", $sg__input_files__OR__input_shownKeys)}</span><span${_attr_class("_h6")}>−${_sep($sg__input_files__OR__input_shownKeys)}${_escape(stats.deletions)}${_el_resume($scope15_id, "d", $sg__input_files__OR__input_shownKeys)}</span>`);
2187
2187
  $si__input_files__OR__input_shownKeys && writeScope($scope15_id, { _: _scope_with_id($scope0_id) });
2188
2188
  return 0;
2189
2189
  }
@@ -2191,7 +2191,7 @@ var review_section_default = _template("w", (input) => {
2191
2191
  _if(() => {
2192
2192
  if (newCount || input.onlyNew) {
2193
2193
  const $scope4_id = _scope_id();
2194
- _html(`<button type=button${_attr_class(["_hD", { ["_hC"]: input.onlyNew }])} aria-pressed=${input.onlyNew ? "true" : "false"} title=${input.onlyNew ? "\"Show every file\"" : "\"Show only files changed since your last visit\""}>${_escape(newCount)}${_el_resume($scope4_id, "b", $sg__input_files)} new</button>${_el_resume($scope4_id, "a")}`);
2194
+ _html(`<button type=button${_attr_class(["_h8", { ["_h7"]: input.onlyNew }])} aria-pressed=${input.onlyNew ? "true" : "false"} title=${input.onlyNew ? "\"Show every file\"" : "\"Show only files changed since your last visit\""}>${_escape(newCount)}${_el_resume($scope4_id, "b", $sg__input_files)} new</button>${_el_resume($scope4_id, "a")}`);
2195
2195
  _script($scope4_id, "w11");
2196
2196
  writeScope($scope4_id, { _: _scope_with_id($scope0_id) });
2197
2197
  return 0;
@@ -2201,7 +2201,7 @@ var review_section_default = _template("w", (input) => {
2201
2201
  _if(() => {
2202
2202
  if (!input.collapsible || !input.collapsed || input.opened) {
2203
2203
  const $scope5_id = _scope_id();
2204
- _html(`<div${_attr_class("_hM")}${_attr("hidden", input.collapsible && input.collapsed)}>`);
2204
+ _html(`<div${_attr_class("_ig")}${_attr("hidden", input.collapsible && input.collapsed)}>`);
2205
2205
  _for_of(input.files, (file$1) => {
2206
2206
  const $scope6_id = _scope_id();
2207
2207
  const $for_content__file__closures = /* @__PURE__ */ new Set();
@@ -2214,14 +2214,14 @@ var review_section_default = _template("w", (input) => {
2214
2214
  _html(`<details${_attr_details_or_dialog_open($scope6_id, "a", expanded, _resume(function(open) {
2215
2215
  input.onFileToggle(file$1.key, open);
2216
2216
  }, "w0", $scope6_id))}${_attr_class([
2217
- "_hN",
2218
- forceNear && "_hO",
2219
- input.findHit?.key === file$1.key && "_hs"
2220
- ])}${_attr("data-key", file$1.key)}${_attr("hidden", !input.shownKeys.has(file$1.key))}><summary${_attr_class("_hQ")}><span${_attr_class("_9")}${_attr("data-status", file$1.status)}>${_escape(file$1.status)}${_el_resume($scope6_id, "d", $sg__input_files)}</span>${_el_resume($scope6_id, "c", $sg__input_files)}<span${_attr_class([path, input.findHit?.key === file$1.key && input.findHit.line < 1 && "_ht"])}${_attr("title", file$1.path)}><bdi>${_escape(file$1.path)}${_el_resume($scope6_id, "f", $sg__input_files)}</bdi></span>${_el_resume($scope6_id, "e", _serialize_guard($scope0_reason, 19))}`);
2217
+ "_ih",
2218
+ forceNear && "_ii",
2219
+ input.findHit?.key === file$1.key && "_hX"
2220
+ ])}${_attr("data-key", file$1.key)}${_attr("hidden", !input.shownKeys.has(file$1.key))}><summary${_attr_class("_ik")}><span${_attr_class("_9")}${_attr("data-status", file$1.status)}>${_escape(file$1.status)}${_el_resume($scope6_id, "d", $sg__input_files)}</span>${_el_resume($scope6_id, "c", $sg__input_files)}<span${_attr_class([path, input.findHit?.key === file$1.key && input.findHit.line < 1 && "_hY"])}${_attr("title", file$1.path)}><bdi>${_escape(file$1.path)}${_el_resume($scope6_id, "f", $sg__input_files)}</bdi></span>${_el_resume($scope6_id, "e", _serialize_guard($scope0_reason, 19))}`);
2221
2221
  _if(() => {
2222
2222
  if (file$1.changedSince) {
2223
2223
  const $scope20_id = _scope_id();
2224
- _html(`<span${_attr_class(["_y", "_hL"])} title="Changed since your last visit"></span>`);
2224
+ _html(`<span${_attr_class(["_y", "_if"])} title="Changed since your last visit"></span>`);
2225
2225
  $si__input_files && writeScope($scope20_id, {});
2226
2226
  return 0;
2227
2227
  }
@@ -2241,8 +2241,8 @@ var review_section_default = _template("w", (input) => {
2241
2241
  const $scope14_id = _scope_id();
2242
2242
  _html(`<button type=button${_attr_class([
2243
2243
  iconBtnXs,
2244
- "_hX",
2245
- { ["_hY"]: wholeFiles.has(file$1.key) }
2244
+ "_ir",
2245
+ { ["_is"]: wholeFiles.has(file$1.key) }
2246
2246
  ])} title=${wholeFiles.has(file$1.key) ? "\"Show changes only\"" : "\"Show whole file\""} aria-label=${wholeFiles.has(file$1.key) ? "\"Show changes only\"" : "\"Show whole file\""} aria-pressed=${wholeFiles.has(file$1.key) ? "true" : "false"}>`);
2247
2247
  _if(() => {
2248
2248
  if (wholeFiles.has(file$1.key)) {
@@ -2269,17 +2269,17 @@ var review_section_default = _template("w", (input) => {
2269
2269
  _if(() => {
2270
2270
  if (file$1.binary) {
2271
2271
  const $scope23_id = _scope_id();
2272
- _html(`<p${_attr_class(["_hW", "_hP"])}>binary file</p>`);
2272
+ _html(`<p${_attr_class(["_iq", "_ij"])}>binary file</p>`);
2273
2273
  $si__input_files__OR__input_collapsedFiles && writeScope($scope23_id, {});
2274
2274
  return 0;
2275
2275
  } else if (file$1.tooLarge) {
2276
2276
  const $scope24_id = _scope_id();
2277
- _html(`<p${_attr_class(["_hW", "_hP"])}>file too large to display</p>`);
2277
+ _html(`<p${_attr_class(["_iq", "_ij"])}>file too large to display</p>`);
2278
2278
  $si__input_files__OR__input_collapsedFiles && writeScope($scope24_id, {});
2279
2279
  return 1;
2280
2280
  } else if (file$1.old == null && file$1.new == null) {
2281
2281
  const $scope25_id = _scope_id();
2282
- _html(`<p${_attr_class(["_hW", "_hP"])}>file could not be read</p>`);
2282
+ _html(`<p${_attr_class(["_iq", "_ij"])}>file could not be read</p>`);
2283
2283
  $si__input_files__OR__input_collapsedFiles && writeScope($scope25_id, {});
2284
2284
  return 2;
2285
2285
  } else if (expanded) {
@@ -2287,7 +2287,7 @@ var review_section_default = _template("w", (input) => {
2287
2287
  _if(() => {
2288
2288
  if (!forceNear) {
2289
2289
  const $scope8_id = _scope_id();
2290
- _html(`<div${_attr_class("_hR")}></div>${_el_resume($scope8_id, "a")}`);
2290
+ _html(`<div${_attr_class("_il")}></div>${_el_resume($scope8_id, "a")}`);
2291
2291
  _script($scope8_id, "w13");
2292
2292
  _subscribe($si__input && $input__closures, writeScope($scope8_id, {}));
2293
2293
  return 0;
@@ -2295,7 +2295,7 @@ var review_section_default = _template("w", (input) => {
2295
2295
  const $scope9_id = _scope_id();
2296
2296
  const $childScope = _peek_scope_id();
2297
2297
  diff_file_default({
2298
- class: "_hP",
2298
+ class: "_ij",
2299
2299
  file: file$1,
2300
2300
  comments: fileComments,
2301
2301
  draft: input.draft && input.draft.key === file$1.key ? input.draft : null,
@@ -3402,11 +3402,11 @@ var diff_view_default = _template("m", (input) => {
3402
3402
  collapsedRepos = /* @__PURE__ */ new Set([...collapsedRepos, id]);
3403
3403
  }
3404
3404
  }, "m35", $scope0_id);
3405
- _html(`<div${_attr_class("_f7")}><div${_attr_class("_gb")}><div${_attr_class("_gc")}><div${_attr_class(["_gm", { ["_gl"]: !comments.length }])}>`);
3405
+ _html(`<div${_attr_class("_fx")}><div${_attr_class("_fC")}><div${_attr_class("_fD")}><div${_attr_class(["_fN", { ["_fM"]: !comments.length }])}>`);
3406
3406
  _if(() => {
3407
3407
  if (input.onExit) {
3408
3408
  const $scope1_id = _scope_id();
3409
- _html(`<a${_attr("href", `/w/${input.workspaceId}`)}${_attr_class([iconBtnRow, "_gd"])} title="Back to terminal (Esc)">`);
3409
+ _html(`<a${_attr("href", `/w/${input.workspaceId}`)}${_attr_class([iconBtnRow, "_fE"])} title="Back to terminal (Esc)">`);
3410
3410
  icon_back_default({ size: 14 });
3411
3411
  _html(`</a>${_el_resume($scope1_id, "a", _serialize_guard($scope0_reason, 1))}`);
3412
3412
  _serialize_if($scope0_reason, 0) && writeScope($scope1_id, { _: _serialize_if($scope0_reason, 1) && _scope_with_id($scope0_id) });
@@ -3417,7 +3417,7 @@ var diff_view_default = _template("m", (input) => {
3417
3417
  _if(() => {
3418
3418
  if (comments.length) {
3419
3419
  const $scope5_id = _scope_id();
3420
- _html(`<span${_attr_class("_gf")}>${_escape(comments.length)}${_el_resume($scope5_id, "b")} comment<!>${comments.length === 1 ? "" : "s"}${_el_resume($scope5_id, "c")}</span>`);
3420
+ _html(`<span${_attr_class("_fG")}>${_escape(comments.length)}${_el_resume($scope5_id, "b")} comment<!>${comments.length === 1 ? "" : "s"}${_el_resume($scope5_id, "c")}</span>`);
3421
3421
  writeScope($scope5_id, {});
3422
3422
  return 0;
3423
3423
  }
@@ -3425,7 +3425,7 @@ var diff_view_default = _template("m", (input) => {
3425
3425
  _if(() => {
3426
3426
  if (comments.length) {
3427
3427
  const $scope2_id = _scope_id();
3428
- _html(`<span${_attr_class("_ge")}>`);
3428
+ _html(`<span${_attr_class("_fF")}>`);
3429
3429
  _set_serialize_reason(_serialize_guard($scope0_reason, 5));
3430
3430
  const $childScope = _peek_scope_id();
3431
3431
  diff_send_default({
@@ -3438,14 +3438,14 @@ var diff_view_default = _template("m", (input) => {
3438
3438
  return 0;
3439
3439
  }
3440
3440
  }, $scope0_id, "h", 1, 1, 1, 0, 1);
3441
- _html(`</div>${_el_resume($scope0_id, "d")}<div${_attr_class("_ga")}>`);
3441
+ _html(`</div>${_el_resume($scope0_id, "d")}<div${_attr_class("_fB")}>`);
3442
3442
  _if(() => {
3443
3443
  if (hasFiles) {
3444
3444
  const $scope12_id = _scope_id();
3445
3445
  _html(`<button${_attr_class([
3446
3446
  treeToggle,
3447
- "_f9",
3448
- { ["_f8"]: treeOpen }
3447
+ "_fz",
3448
+ { ["_fy"]: treeOpen }
3449
3449
  ])} title=${treeOpen ? "\"Hide file tree\"" : "\"Show file tree\""}>`);
3450
3450
  icon_sidebar_default({ size: 14 });
3451
3451
  _html(`</button>${_el_resume($scope12_id, "a")}`);
@@ -3454,7 +3454,7 @@ var diff_view_default = _template("m", (input) => {
3454
3454
  return 0;
3455
3455
  }
3456
3456
  }, $scope0_id, "j", 1, 1, 1, 0, 1);
3457
- _html(`<button${_attr_class([iconBtnRow, "_f9"])} title="Refresh diff"${_attr("disabled", loading)}>`);
3457
+ _html(`<button${_attr_class([iconBtnRow, "_fz"])} title="Refresh diff"${_attr("disabled", loading)}>`);
3458
3458
  _set_serialize_reason(1);
3459
3459
  const $childScope2 = _peek_scope_id();
3460
3460
  icon_refresh_default({
@@ -3465,19 +3465,19 @@ var diff_view_default = _template("m", (input) => {
3465
3465
  _if(() => {
3466
3466
  if (hasFiles) {
3467
3467
  const $scope13_id = _scope_id();
3468
- _html(`<button${_attr_class(["_o", "_gv"])} title="Jump to file">Files (<!>${_escape(shownFiles.length)}${_el_resume($scope13_id, "b")})</button>${_el_resume($scope13_id, "a")}`);
3468
+ _html(`<button${_attr_class(["_o", "_fW"])} title="Jump to file">Files (<!>${_escape(shownFiles.length)}${_el_resume($scope13_id, "b")})</button>${_el_resume($scope13_id, "a")}`);
3469
3469
  _script($scope13_id, "m55");
3470
3470
  writeScope($scope13_id, {});
3471
3471
  return 0;
3472
3472
  }
3473
3473
  }, $scope0_id, "m", 1, 1, 1, 0, 1);
3474
- _html(`<span${_attr_class(["_m", "_gn"])}>`);
3474
+ _html(`<span${_attr_class(["_m", "_fO"])}>`);
3475
3475
  _attr_select_value($scope0_id, "o", scope, _resume(function(v) {
3476
3476
  setScope(v);
3477
3477
  }, "m0", $scope0_id), () => {
3478
- _html(`<select${_attr_class(["_n", "_go"])} aria-label="Review scope"${_attr("disabled", loading)}><option${_attr_option_value("committed")}>Committed</option><option${_attr_option_value("working")}>Working tree</option><option${_attr_option_value("dirty")}>Uncommitted</option></select>`);
3478
+ _html(`<select${_attr_class(["_n", "_fP"])} aria-label="Review scope"${_attr("disabled", loading)}><option${_attr_option_value("committed")}>Committed</option><option${_attr_option_value("working")}>Working tree</option><option${_attr_option_value("dirty")}>Uncommitted</option></select>`);
3479
3479
  });
3480
- _html(`${_el_resume($scope0_id, "o")}</span><div${_attr_class(["_gj", { ["_gi"]: !findOpen }])}>`);
3480
+ _html(`${_el_resume($scope0_id, "o")}</span><div${_attr_class(["_fK", { ["_fJ"]: !findOpen }])}>`);
3481
3481
  _set_serialize_reason(2);
3482
3482
  const $childScope3 = _peek_scope_id();
3483
3483
  diff_find_default({
@@ -3498,8 +3498,8 @@ var diff_view_default = _template("m", (input) => {
3498
3498
  const $scope14_id = _scope_id();
3499
3499
  _html(`<button${_attr_class([
3500
3500
  iconBtnRow,
3501
- "_gh",
3502
- "_f9"
3501
+ "_fI",
3502
+ "_fz"
3503
3503
  ])} title="Find in review (⌘/Ctrl+F)" aria-label="Find in review"${_attr("hidden", findOpen)}>`);
3504
3504
  icon_search_default({ size: 14 });
3505
3505
  _html(`</button>${_el_resume($scope14_id, "a")}`);
@@ -3508,7 +3508,7 @@ var diff_view_default = _template("m", (input) => {
3508
3508
  return 0;
3509
3509
  }
3510
3510
  }, $scope0_id, "r", 1, 1, 1, 0, 1);
3511
- _html(`</div></div><div${_attr_class("_gk")} data-diff-main>`);
3511
+ _html(`</div></div><div${_attr_class("_fL")} data-diff-main>`);
3512
3512
  _if(() => {
3513
3513
  if (error) {
3514
3514
  const $scope6_id = _scope_id();
@@ -3531,7 +3531,7 @@ var diff_view_default = _template("m", (input) => {
3531
3531
  _if(() => {
3532
3532
  if (!repos && loading) {
3533
3533
  const $scope15_id = _scope_id();
3534
- _html(`<div${_attr_class("_gq")} aria-hidden=true><div${_attr_class(["_gr", "_gs"])}></div><div${_attr_class(["_gr", "_gt"])}></div><div${_attr_class(["_gr", "_gu"])}></div><div${_attr_class(["_gr", "_gt"])}></div><div${_attr_class(["_gr", "_gu"])}></div></div>`);
3534
+ _html(`<div${_attr_class("_fR")} aria-hidden=true><div${_attr_class(["_fS", "_fT"])}></div><div${_attr_class(["_fS", "_fU"])}></div><div${_attr_class(["_fS", "_fV"])}></div><div${_attr_class(["_fS", "_fU"])}></div><div${_attr_class(["_fS", "_fV"])}></div></div>`);
3535
3535
  writeScope($scope15_id, {});
3536
3536
  return 0;
3537
3537
  }
@@ -3562,12 +3562,12 @@ var diff_view_default = _template("m", (input) => {
3562
3562
  _if(() => {
3563
3563
  if (repos && !allFiles.length) {
3564
3564
  const $scope11_id = _scope_id();
3565
- _html(`<p${_attr_class("_bI")}>${repoList.some((r) => r.unborn) ? "No commits yet." : scope === "dirty" ? "Nothing uncommitted." : repoList.some((r) => r.pr) ? "No file changes on these PRs." : "No changes vs base."}${_el_resume($scope11_id, "b")}</p>`);
3565
+ _html(`<p${_attr_class("_bR")}>${repoList.some((r) => r.unborn) ? "No commits yet." : scope === "dirty" ? "Nothing uncommitted." : repoList.some((r) => r.pr) ? "No file changes on these PRs." : "No changes vs base."}${_el_resume($scope11_id, "b")}</p>`);
3566
3566
  writeScope($scope11_id, {});
3567
3567
  return 0;
3568
3568
  } else if (repos && !shownFiles.length && !findState.hit) {
3569
3569
  const $scope8_id = _scope_id();
3570
- _html(`<p${_attr_class("_bI")}>${findState.query.trim() ? "No matches in review." : onlyNew && !fileFilter ? "Nothing changed since your last visit." : `No files match "${_escape(`${fileFilter}`)}".`}${_el_resume($scope8_id, "b")}</p>`);
3570
+ _html(`<p${_attr_class("_bR")}>${findState.query.trim() ? "No matches in review." : onlyNew && !fileFilter ? "Nothing changed since your last visit." : `No files match "${_escape(`${fileFilter}`)}".`}${_el_resume($scope8_id, "b")}</p>`);
3571
3571
  writeScope($scope8_id, {});
3572
3572
  return 1;
3573
3573
  }
@@ -0,0 +1,2 @@
1
+ import { f as notifySessionsChanged } from "./_BXzfMZ_J.js";
2
+ export { notifySessionsChanged };