@dylanpiercey/work 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (513) hide show
  1. package/README.md +17 -5
  2. package/bin/work.mjs +208 -9
  3. package/dist/_D1C-XIqT.js +168 -0
  4. package/dist/{_Bq7to522.js → _Dzz52ZtI.js} +188 -49
  5. package/dist/_HbAW5Cbt.js +2 -0
  6. package/dist/index.mjs +1118 -1151
  7. package/dist/public/assets/{_Cz5BPBG8.js → _-5UNb9-C.js} +1 -1
  8. package/dist/public/assets/_-5UNb9-C.js.br +0 -0
  9. package/dist/public/assets/_06rtP_SB.js +1 -0
  10. package/dist/public/assets/_14yhXek7.js +1 -0
  11. package/dist/public/assets/_14yhXek7.js.br +0 -0
  12. package/dist/public/assets/_1JXC9nFp.js +1 -0
  13. package/dist/public/assets/_1JXC9nFp.js.br +0 -0
  14. package/dist/public/assets/_1Yit_Y5R.js +1 -0
  15. package/dist/public/assets/_1ZPfR2B8.js +6 -0
  16. package/dist/public/assets/_1ZPfR2B8.js.br +0 -0
  17. package/dist/public/assets/{_D2un443j.js → _1xOByopP.js} +1 -1
  18. package/dist/public/assets/_1xOByopP.js.br +0 -0
  19. package/dist/public/assets/{_C_37_B6u.js → _3aBl7SEn.js} +1 -1
  20. package/dist/public/assets/_3aBl7SEn.js.br +0 -0
  21. package/dist/public/assets/_5aMLV2Vy.js +1 -0
  22. package/dist/public/assets/{_BwP07uVS.js → _7YrArFMB.js} +1 -1
  23. package/dist/public/assets/_7YrArFMB.js.br +0 -0
  24. package/dist/public/assets/{_ClldMY37.js → _B1-W0Sn2.js} +1 -1
  25. package/dist/public/assets/_B1-W0Sn2.js.br +0 -0
  26. package/dist/public/assets/{_8dvK2NDJ.js → _B1D0PIz3.js} +1 -1
  27. package/dist/public/assets/_B1D0PIz3.js.br +0 -0
  28. package/dist/public/assets/_B1agoKUa.js +1 -0
  29. package/dist/public/assets/_B3NfNm8M.js +1591 -0
  30. package/dist/public/assets/_B3NfNm8M.js.br +0 -0
  31. package/dist/public/assets/{_BDa-iwuj.js → _B7VYILLZ.js} +1 -1
  32. package/dist/public/assets/_B7VYILLZ.js.br +0 -0
  33. package/dist/public/assets/_B7sPBy0J.js +1 -0
  34. package/dist/public/assets/_B81p6DSw.js +1 -0
  35. package/dist/public/assets/_BAkSKCkz.js +1 -0
  36. package/dist/public/assets/{_B582D2rg.js → _BDUjU8Ev.js} +1 -1
  37. package/dist/public/assets/{_Bv3qNE1b.js → _BHU5aikZ.js} +1 -1
  38. package/dist/public/assets/_BHZPTv1U.js +1 -0
  39. package/dist/public/assets/{_DxEm-Gwj.js → _BKHtiW96.js} +1 -1
  40. package/dist/public/assets/_BKHtiW96.js.br +0 -0
  41. package/dist/public/assets/{_C0_s45qg.js → _BKIx7IZP.js} +1 -1
  42. package/dist/public/assets/_BKIx7IZP.js.br +0 -0
  43. package/dist/public/assets/{_Bp8-V8yl.js → _BLfzQY-3.js} +1 -1
  44. package/dist/public/assets/_BLfzQY-3.js.br +0 -0
  45. package/dist/public/assets/{_ch_yXAap.js → _BPSTqkJn.js} +1 -1
  46. package/dist/public/assets/_BPSTqkJn.js.br +0 -0
  47. package/dist/public/assets/_BQZOimBB.js +1 -0
  48. package/dist/public/assets/{_DfI982PI.js → _BRQ6iQ5p.js} +1 -1
  49. package/dist/public/assets/_BRQ6iQ5p.js.br +0 -0
  50. package/dist/public/assets/_BRVURc4u.js +1 -0
  51. package/dist/public/assets/{_CTINBWaG.js → _BSFJEuJX.js} +1 -1
  52. package/dist/public/assets/_BSFJEuJX.js.br +0 -0
  53. package/dist/public/assets/{_CMSBfO6u.js → _BSWN-v3P.js} +1 -1
  54. package/dist/public/assets/_BSWN-v3P.js.br +0 -0
  55. package/dist/public/assets/_BTVAQr2c.js +1 -0
  56. package/dist/public/assets/_BUD1pBC0.js +1 -0
  57. package/dist/public/assets/_BVGzCczb.js +1 -0
  58. package/dist/public/assets/{_j2tDSMvo.js → _BVQosHjY.js} +1 -1
  59. package/dist/public/assets/_BVQosHjY.js.br +0 -0
  60. package/dist/public/assets/{_9kX9D09B.js → _B_0C2_RO.js} +1 -1
  61. package/dist/public/assets/_B_0C2_RO.js.br +0 -0
  62. package/dist/public/assets/_BaA31ms5.js +1 -0
  63. package/dist/public/assets/_BgCHJGlO.js +1 -0
  64. package/dist/public/assets/_BhpRLDbL.js +1 -0
  65. package/dist/public/assets/_BhpRLDbL.js.br +0 -0
  66. package/dist/public/assets/_BkKcjMAC.js +1 -0
  67. package/dist/public/assets/{_xyw_DS5P.js → _BkcPY2j0.js} +1 -1
  68. package/dist/public/assets/_BkcPY2j0.js.br +0 -0
  69. package/dist/public/assets/_BlTVd_3d.js +1 -0
  70. package/dist/public/assets/_BlqlLmEY.js +1 -0
  71. package/dist/public/assets/_BoNfxc9P.js +1 -0
  72. package/dist/public/assets/_BqswW9B9.js +1 -0
  73. package/dist/public/assets/_BricqzsO.js +1 -0
  74. package/dist/public/assets/_BrreckIa.js +1 -0
  75. package/dist/public/assets/{_BpoeUr5j.js → _BsJZPHmz.js} +1 -1
  76. package/dist/public/assets/_BsJZPHmz.js.br +0 -0
  77. package/dist/public/assets/_BtRYwaBb.js +1 -0
  78. package/dist/public/assets/{_B7GwDeKK.js → _BtZ2AatF.js} +1 -1
  79. package/dist/public/assets/_BvPBKjRP.js +1 -0
  80. package/dist/public/assets/_BvPBKjRP.js.br +0 -0
  81. package/dist/public/assets/_ByrrjMU9.js +1 -0
  82. package/dist/public/assets/{_CpjSCB1I.js → _BzGHediB.js} +1 -1
  83. package/dist/public/assets/_BzGHediB.js.br +0 -0
  84. package/dist/public/assets/_BzvTKm92.js +1 -0
  85. package/dist/public/assets/{_D1uRW1qz.js → _C-EkQeP_.js} +1 -1
  86. package/dist/public/assets/_C-EkQeP_.js.br +0 -0
  87. package/dist/public/assets/{_Bv3e3rg8.js → _C0Ib7MZF.js} +1 -1
  88. package/dist/public/assets/_C0Ib7MZF.js.br +0 -0
  89. package/dist/public/assets/_C2p1Z5Lf.js +86 -0
  90. package/dist/public/assets/_C2p1Z5Lf.js.br +0 -0
  91. package/dist/public/assets/_C3iiOlxd.js +1 -0
  92. package/dist/public/assets/{_De7P3jUH.js → _C81nSl09.js} +1 -1
  93. package/dist/public/assets/_C81nSl09.js.br +0 -0
  94. package/dist/public/assets/{_BvXp6HpX.js → _C8bqYk4J.js} +1 -1
  95. package/dist/public/assets/_C8bqYk4J.js.br +0 -0
  96. package/dist/public/assets/_C98JZr09.js +1 -0
  97. package/dist/public/assets/_C98JZr09.js.br +0 -0
  98. package/dist/public/assets/_CB4VkmGZ.js +1 -0
  99. package/dist/public/assets/{_bcsuBP7T.js → _CCVkYcN5.js} +1 -1
  100. package/dist/public/assets/_CCVkYcN5.js.br +0 -0
  101. package/dist/public/assets/{_DC-78WeM.js → _CDY0RpYX.js} +1 -1
  102. package/dist/public/assets/_CDY0RpYX.js.br +0 -0
  103. package/dist/public/assets/_CE2GEqMx.js +1 -0
  104. package/dist/public/assets/_CE2GEqMx.js.br +0 -0
  105. package/dist/public/assets/{_BbbOvNRH.js → _CFUREq1M.js} +1 -1
  106. package/dist/public/assets/_CFUREq1M.js.br +0 -0
  107. package/dist/public/assets/_CHdh6bII.js +1 -0
  108. package/dist/public/assets/{_wcshV0sZ.js → _CHdpLB95.js} +1 -1
  109. package/dist/public/assets/_CHdpLB95.js.br +0 -0
  110. package/dist/public/assets/{_D4q8XSMI.js → _CKLGAGKJ.js} +1 -1
  111. package/dist/public/assets/_CKLGAGKJ.js.br +0 -0
  112. package/dist/public/assets/_CMRt2lyQ.js +1 -0
  113. package/dist/public/assets/_CN1zW1AT.js +1 -0
  114. package/dist/public/assets/_CN1zW1AT.js.br +0 -0
  115. package/dist/public/assets/_CUILmj9R.js +1 -0
  116. package/dist/public/assets/_CUhP8KQ8.js +1 -0
  117. package/dist/public/assets/{_DaMVRI8f.js → _CUsrMpdL.js} +1 -1
  118. package/dist/public/assets/_CUsrMpdL.js.br +0 -0
  119. package/dist/public/assets/_CVG0_w9T.js +1 -0
  120. package/dist/public/assets/{_CamWDaoG.js → _CWG813ur.js} +1 -1
  121. package/dist/public/assets/_CWG813ur.js.br +0 -0
  122. package/dist/public/assets/{_DSVLaMWS.js → _CY87Y7QL.js} +1 -1
  123. package/dist/public/assets/_CY87Y7QL.js.br +0 -0
  124. package/dist/public/assets/_CYAsKva_.js +1 -0
  125. package/dist/public/assets/_CajKYNSY.js +1 -0
  126. package/dist/public/assets/{_D0aoEFRx.js → _Cb_k_JA_.js} +1 -1
  127. package/dist/public/assets/_Cb_k_JA_.js.br +0 -0
  128. package/dist/public/assets/_Ce8PlfMD.js +1 -0
  129. package/dist/public/assets/{_Bm4SHrNp.js → _CfGEGt_k.js} +1 -1
  130. package/dist/public/assets/_CfGEGt_k.js.br +0 -0
  131. package/dist/public/assets/{_DqhphdU4.js → _CfdK8EeQ.js} +1 -1
  132. package/dist/public/assets/_CfdK8EeQ.js.br +0 -0
  133. package/dist/public/assets/_CgOKmAwr.js +1 -0
  134. package/dist/public/assets/{_eoa1EOU-.js → _CiYQhf81.js} +1 -1
  135. package/dist/public/assets/_CiYQhf81.js.br +0 -0
  136. package/dist/public/assets/_Cj9DHPRL.js +1 -0
  137. package/dist/public/assets/{_CxAPL49a.js → _ClHPjF-1.js} +1 -1
  138. package/dist/public/assets/_ClHPjF-1.js.br +0 -0
  139. package/dist/public/assets/{_DDl8KSWJ.js → _Cmmdd2e3.js} +1 -1
  140. package/dist/public/assets/_Cmmdd2e3.js.br +0 -0
  141. package/dist/public/assets/{_BZKB4fhr.js → _Cn9Ia4SS.js} +1 -1
  142. package/dist/public/assets/_Cn9Ia4SS.js.br +0 -0
  143. package/dist/public/assets/_CnTzFbuG.js +1 -0
  144. package/dist/public/assets/{_BE_Jyvqd.js → _CqCenHOp.js} +1 -1
  145. package/dist/public/assets/_CqCenHOp.js.br +0 -0
  146. package/dist/public/assets/{_Dp3IZdH8.js → _CtqGSS84.js} +1 -1
  147. package/dist/public/assets/_CtqGSS84.js.br +0 -0
  148. package/dist/public/assets/_CttfwM-c.js +1 -0
  149. package/dist/public/assets/{_D6kktUFn.js → _CxA3Yab0.js} +1 -1
  150. package/dist/public/assets/_CxA3Yab0.js.br +0 -0
  151. package/dist/public/assets/{_Bx1CW-sF.js → _Cx_aJfDp.js} +1 -1
  152. package/dist/public/assets/_Cx_aJfDp.js.br +0 -0
  153. package/dist/public/assets/_D2L_ILOW.js +1 -0
  154. package/dist/public/assets/_D47lCu0c.js +1 -0
  155. package/dist/public/assets/_D5W-uGIK.js +1 -0
  156. package/dist/public/assets/_D6BbZLrc.js +1 -0
  157. package/dist/public/assets/_D6RVeCAn.js +1 -0
  158. package/dist/public/assets/_D75V4jV-.js +1 -0
  159. package/dist/public/assets/{_CyBCIknf.js → _D9r_Fn0I.js} +1 -1
  160. package/dist/public/assets/_D9r_Fn0I.js.br +0 -0
  161. package/dist/public/assets/{_8G2Mv7jG.js → _DBD57l1T.js} +1 -1
  162. package/dist/public/assets/_DBD57l1T.js.br +0 -0
  163. package/dist/public/assets/_DCWILZgL.js +1 -0
  164. package/dist/public/assets/{_COcePo2y.js → _DEOryr7w.js} +1 -1
  165. package/dist/public/assets/_DEOryr7w.js.br +0 -0
  166. package/dist/public/assets/_DF54Iz7o.js +1 -0
  167. package/dist/public/assets/_DFamU2Uj.js +2 -0
  168. package/dist/public/assets/_DFamU2Uj.js.br +0 -0
  169. package/dist/public/assets/_DHmBuyCO.js +1 -0
  170. package/dist/public/assets/_DHmBuyCO.js.br +0 -0
  171. package/dist/public/assets/{_BywcP-As.js → _DJqEBkNd.js} +1 -1
  172. package/dist/public/assets/_DJqEBkNd.js.br +0 -0
  173. package/dist/public/assets/{_BUvqweu0.js → _DL3w8c_p.js} +1 -1
  174. package/dist/public/assets/_DL3w8c_p.js.br +0 -0
  175. package/dist/public/assets/_DLVL-4MP.js +1 -0
  176. package/dist/public/assets/{_wXDh-Z2N.js → _DM60dKRs.js} +1 -1
  177. package/dist/public/assets/_DM60dKRs.js.br +0 -0
  178. package/dist/public/assets/{_BBWaxDkO.js → _DMJHTH74.js} +1 -1
  179. package/dist/public/assets/_DMJHTH74.js.br +0 -0
  180. package/dist/public/assets/_DMLv6KA6.js +1 -0
  181. package/dist/public/assets/_DQYpgyzr.js +1 -0
  182. package/dist/public/assets/_DQYpgyzr.js.br +0 -0
  183. package/dist/public/assets/{_SGDxiwE1.js → _DQyjuXTi.js} +1 -1
  184. package/dist/public/assets/_DQyjuXTi.js.br +0 -0
  185. package/dist/public/assets/{_DrIgZJzN.js → _DRHCy0UF.js} +1 -1
  186. package/dist/public/assets/_DRHCy0UF.js.br +0 -0
  187. package/dist/public/assets/{_D4rOX-Fa.js → _DSUBv-Bl.js} +1 -1
  188. package/dist/public/assets/_DSUBv-Bl.js.br +0 -0
  189. package/dist/public/assets/{_CYjE__ml.js → _DUFM9qLV.js} +1 -1
  190. package/dist/public/assets/_DUFM9qLV.js.br +0 -0
  191. package/dist/public/assets/{_BNW5Jiec.js → _DUs3ZGbj.js} +1 -1
  192. package/dist/public/assets/_DUs3ZGbj.js.br +0 -0
  193. package/dist/public/assets/{_Dytf99zx.js → _DX5u6Wvm.js} +1 -1
  194. package/dist/public/assets/_DX5u6Wvm.js.br +0 -0
  195. package/dist/public/assets/{_CHuLFr1f.js → _DZvkgS3V.js} +1 -1
  196. package/dist/public/assets/_DZvkgS3V.js.br +0 -0
  197. package/dist/public/assets/{_D9sS4J_w.js → _Dbm6zAQS.js} +1 -1
  198. package/dist/public/assets/_Dbm6zAQS.js.br +0 -0
  199. package/dist/public/assets/{_D4dJ2qEE.js → _DcOkTFth.js} +1 -1
  200. package/dist/public/assets/_Ddf1gumD.js +1 -0
  201. package/dist/public/assets/_De6E9M7R.js +1 -0
  202. package/dist/public/assets/{_DFWOMF-B.js → _DgWKSW-Y.js} +1 -1
  203. package/dist/public/assets/_DgWKSW-Y.js.br +0 -0
  204. package/dist/public/assets/_DhEN6T4v.js +1 -0
  205. package/dist/public/assets/{_D4quFMVQ.js → _Di1ccq_2.js} +1 -1
  206. package/dist/public/assets/_Di1ccq_2.js.br +0 -0
  207. package/dist/public/assets/{_CUXajOKj.js → _DifjKObE.js} +1 -1
  208. package/dist/public/assets/_DifjKObE.js.br +0 -0
  209. package/dist/public/assets/_Dn10ABa-.js +1 -0
  210. package/dist/public/assets/{_MCwIJAuJ.js → _Do1ltY2a.js} +1 -1
  211. package/dist/public/assets/_Do1ltY2a.js.br +0 -0
  212. package/dist/public/assets/{_Ct3RF80L.js → _DomK7Scb.js} +1 -1
  213. package/dist/public/assets/_DomK7Scb.js.br +0 -0
  214. package/dist/public/assets/_DtWggCxt.js +1 -0
  215. package/dist/public/assets/_DtqqybyQ.js +1 -0
  216. package/dist/public/assets/{_CEJUcePr.js → _DvKnakqk.js} +1 -1
  217. package/dist/public/assets/_DvKnakqk.js.br +0 -0
  218. package/dist/public/assets/_DxD_AC3a.js +1 -0
  219. package/dist/public/assets/_DxD_AC3a.js.br +0 -0
  220. package/dist/public/assets/_Dxo7m9cG.js +1 -0
  221. package/dist/public/assets/{_DkCaEf_h.js → _DzKW89Sx.js} +1 -1
  222. package/dist/public/assets/_DzKW89Sx.js.br +0 -0
  223. package/dist/public/assets/_DzTHCioH.js +1 -0
  224. package/dist/public/assets/{_C654p96Z.js → _EefWj858.js} +1 -1
  225. package/dist/public/assets/_EefWj858.js.br +0 -0
  226. package/dist/public/assets/{_zSAfqXcm.js → _FlITqTCo.js} +1 -1
  227. package/dist/public/assets/_FlITqTCo.js.br +0 -0
  228. package/dist/public/assets/_GkEw2S0T.js +1 -0
  229. package/dist/public/assets/{_Dd6X3e7w.js → _HM_QqtJi.js} +1 -1
  230. package/dist/public/assets/_HM_QqtJi.js.br +0 -0
  231. package/dist/public/assets/{_CEXHZd73.js → _HmkI4Rfn.js} +1 -1
  232. package/dist/public/assets/_HmkI4Rfn.js.br +0 -0
  233. package/dist/public/assets/{_d5u7EI97.js → _JEvx8ub4.js} +1 -1
  234. package/dist/public/assets/_JEvx8ub4.js.br +0 -0
  235. package/dist/public/assets/_JOb8B3tz.js +1 -0
  236. package/dist/public/assets/_LEIhjFrO.js +1 -0
  237. package/dist/public/assets/_STJhwy7U.js +1 -0
  238. package/dist/public/assets/_TrcWRD8T.js +15 -0
  239. package/dist/public/assets/_TrcWRD8T.js.br +0 -0
  240. package/dist/public/assets/{_CAkPJLeF.js → _UaKPY71M.js} +1 -1
  241. package/dist/public/assets/_UaKPY71M.js.br +0 -0
  242. package/dist/public/assets/_UhK3lkm0.js +1 -0
  243. package/dist/public/assets/_VPLoEBTS.js +1 -0
  244. package/dist/public/assets/_Zeftz3t1.js +1 -0
  245. package/dist/public/assets/{_Bhx319Hi.js → __cyRVmTO.js} +1 -1
  246. package/dist/public/assets/__cyRVmTO.js.br +0 -0
  247. package/dist/public/assets/_awfYTHit.js +1 -0
  248. package/dist/public/assets/{_DcMIlvz-.js → _dsj7vMTW.js} +1 -1
  249. package/dist/public/assets/_dsj7vMTW.js.br +0 -0
  250. package/dist/public/assets/_eqpiOhSM.js +1 -0
  251. package/dist/public/assets/{_CZ_OWtIT.js → _iutZ4EDe.js} +1 -1
  252. package/dist/public/assets/_iutZ4EDe.js.br +0 -0
  253. package/dist/public/assets/{_BOGkzMx9.js → _kWQ0dtYZ.js} +1 -1
  254. package/dist/public/assets/_kWQ0dtYZ.js.br +0 -0
  255. package/dist/public/assets/_knvMqXQh.js +1 -0
  256. package/dist/public/assets/_lwC7sIgC.js +1 -0
  257. package/dist/public/assets/_m2tRa0jk.js +1 -0
  258. package/dist/public/assets/_m2tRa0jk.js.br +0 -0
  259. package/dist/public/assets/{_CIb7xw_1.js → _pXG8fRON.js} +1 -1
  260. package/dist/public/assets/_pXG8fRON.js.br +0 -0
  261. package/dist/public/assets/_r541ENtr.js +1 -0
  262. package/dist/public/assets/_rrUx1wn3.js +1 -0
  263. package/dist/public/assets/_tJvcu7sD.js +1 -0
  264. package/dist/public/assets/{_Bf8WYPfh.js → _vcLBrU2m.js} +1 -1
  265. package/dist/public/assets/_vcLBrU2m.js.br +0 -0
  266. package/dist/public/assets/_xZC4Vm70.js +1 -0
  267. package/dist/public/assets/_yAr5r-uL.js +1 -0
  268. package/dist/public/assets/{_DbvaGqOl.js → _yUmRJIJ6.js} +1 -1
  269. package/dist/public/assets/_yUmRJIJ6.js.br +0 -0
  270. package/dist/public/assets/app-shell-CVYlktwa.css +1 -0
  271. package/dist/public/assets/app-shell-CVYlktwa.css.br +0 -0
  272. package/dist/public/assets/files-view-CTadakLK.js +2 -0
  273. package/dist/public/assets/manage-workspace-HUAS6qjy.js +2 -0
  274. package/dist/public/assets/new-CirJkJFl.js +1 -0
  275. package/dist/public/assets/new-workspace-C3t1nA6z.js +2 -0
  276. package/dist/public/assets/review-view-DKPNtgmc.js +2 -0
  277. package/dist/public/assets/settings-CirJkJFl.js +1 -0
  278. package/dist/public/assets/settings-page-DH-9cN-8.js +2 -0
  279. package/dist/public/assets/styles-CIeNhVxC.css +1 -0
  280. package/dist/public/assets/styles-CIeNhVxC.css.br +0 -0
  281. package/dist/public/assets/w-CirJkJFl.js +1 -0
  282. package/dist/public/assets/w._-BnShhzdq.js +1 -0
  283. package/dist/public/assets/w._-CirJkJFl.js +1 -0
  284. package/dist/public/assets/w._-aCTYfruH.js +1 -0
  285. package/lib/setup/doctor.d.mts +12 -1
  286. package/lib/setup/doctor.mjs +54 -9
  287. package/lib/setup/tailscale.d.mts +53 -0
  288. package/lib/setup/tailscale.mjs +179 -0
  289. package/package.json +1 -1
  290. package/dist/_CkwTsHKB.js +0 -2
  291. package/dist/public/assets/_1RHVsAcK.js +0 -1
  292. package/dist/public/assets/_4CShjaLP.js +0 -1
  293. package/dist/public/assets/_68JtNDO1.js +0 -1
  294. package/dist/public/assets/_8G2Mv7jG.js.br +0 -0
  295. package/dist/public/assets/_8dvK2NDJ.js.br +0 -0
  296. package/dist/public/assets/_94L2SIJF.js +0 -1
  297. package/dist/public/assets/_9AnDb3YH.js +0 -1
  298. package/dist/public/assets/_9kX9D09B.js.br +0 -0
  299. package/dist/public/assets/_9lErVegn.js +0 -1
  300. package/dist/public/assets/_B0oyGUU5.js +0 -1
  301. package/dist/public/assets/_B0oyGUU5.js.br +0 -0
  302. package/dist/public/assets/_B1mPnLlp.js +0 -1
  303. package/dist/public/assets/_B4fi2SSA.js +0 -1
  304. package/dist/public/assets/_B7Qx25UP.js +0 -1
  305. package/dist/public/assets/_B7b8EVjA.js +0 -1
  306. package/dist/public/assets/_BBWaxDkO.js.br +0 -0
  307. package/dist/public/assets/_BDa-iwuj.js.br +0 -0
  308. package/dist/public/assets/_BEKHKNmM.js +0 -1
  309. package/dist/public/assets/_BE_Jyvqd.js.br +0 -0
  310. package/dist/public/assets/_BFU-kJkk.js +0 -1
  311. package/dist/public/assets/_BIJ2O2oU.js +0 -1
  312. package/dist/public/assets/_BJ59XAZ9.js +0 -1
  313. package/dist/public/assets/_BKqRYfOI.js +0 -15
  314. package/dist/public/assets/_BKqRYfOI.js.br +0 -0
  315. package/dist/public/assets/_BKr9Dzz1.js +0 -1
  316. package/dist/public/assets/_BN7xvxS_.js +0 -1
  317. package/dist/public/assets/_BNQTVBlH.js +0 -1
  318. package/dist/public/assets/_BNW5Jiec.js.br +0 -0
  319. package/dist/public/assets/_BOGkzMx9.js.br +0 -0
  320. package/dist/public/assets/_BUEpqQ_m.js +0 -1
  321. package/dist/public/assets/_BUvqweu0.js.br +0 -0
  322. package/dist/public/assets/_BZKB4fhr.js.br +0 -0
  323. package/dist/public/assets/_BZo9BjDF.js +0 -1
  324. package/dist/public/assets/_BbbOvNRH.js.br +0 -0
  325. package/dist/public/assets/_BdUNnSlC.js +0 -1
  326. package/dist/public/assets/_Bf8WYPfh.js.br +0 -0
  327. package/dist/public/assets/_Bhx319Hi.js.br +0 -0
  328. package/dist/public/assets/_Bm4SHrNp.js.br +0 -0
  329. package/dist/public/assets/_Bmrqq8Ro.js +0 -2
  330. package/dist/public/assets/_Bmrqq8Ro.js.br +0 -0
  331. package/dist/public/assets/_BnHZ6Npj.js +0 -1
  332. package/dist/public/assets/_BoDxRJLS.js +0 -1
  333. package/dist/public/assets/_BoDxRJLS.js.br +0 -0
  334. package/dist/public/assets/_Bo_Ru664.js +0 -1
  335. package/dist/public/assets/_Bp8-V8yl.js.br +0 -0
  336. package/dist/public/assets/_BpoeUr5j.js.br +0 -0
  337. package/dist/public/assets/_Bq2G_Tid.js +0 -1
  338. package/dist/public/assets/_BsyoLB_D.js +0 -1
  339. package/dist/public/assets/_Bv3e3rg8.js.br +0 -0
  340. package/dist/public/assets/_BvXp6HpX.js.br +0 -0
  341. package/dist/public/assets/_BwP07uVS.js.br +0 -0
  342. package/dist/public/assets/_Bx1CW-sF.js.br +0 -0
  343. package/dist/public/assets/_BywcP-As.js.br +0 -0
  344. package/dist/public/assets/_Bzgtwt3G.js +0 -1
  345. package/dist/public/assets/_Bzgtwt3G.js.br +0 -0
  346. package/dist/public/assets/_C0_s45qg.js.br +0 -0
  347. package/dist/public/assets/_C0ePgF6b.js +0 -1
  348. package/dist/public/assets/_C0oVtTqO.js +0 -1
  349. package/dist/public/assets/_C0oVtTqO.js.br +0 -0
  350. package/dist/public/assets/_C654p96Z.js.br +0 -0
  351. package/dist/public/assets/_C8_1Y2-z.js +0 -1
  352. package/dist/public/assets/_C8_1Y2-z.js.br +0 -0
  353. package/dist/public/assets/_C8v1AZFP.js +0 -1
  354. package/dist/public/assets/_CAkPJLeF.js.br +0 -0
  355. package/dist/public/assets/_CB0D5cRH.js +0 -1
  356. package/dist/public/assets/_CD05JUTh.js +0 -1
  357. package/dist/public/assets/_CEJUcePr.js.br +0 -0
  358. package/dist/public/assets/_CEXHZd73.js.br +0 -0
  359. package/dist/public/assets/_CHcUMVR7.js +0 -1
  360. package/dist/public/assets/_CHuLFr1f.js.br +0 -0
  361. package/dist/public/assets/_CIb7xw_1.js.br +0 -0
  362. package/dist/public/assets/_CMSBfO6u.js.br +0 -0
  363. package/dist/public/assets/_CN7GPyBo.js +0 -1
  364. package/dist/public/assets/_COcePo2y.js.br +0 -0
  365. package/dist/public/assets/_CTINBWaG.js.br +0 -0
  366. package/dist/public/assets/_CTWrnAbz.js +0 -1
  367. package/dist/public/assets/_CUXajOKj.js.br +0 -0
  368. package/dist/public/assets/_CVru3vzC.js +0 -1
  369. package/dist/public/assets/_CYjE__ml.js.br +0 -0
  370. package/dist/public/assets/_CZ_OWtIT.js.br +0 -0
  371. package/dist/public/assets/_C_37_B6u.js.br +0 -0
  372. package/dist/public/assets/_C_CIQL7J.js +0 -1
  373. package/dist/public/assets/_C_CIQL7J.js.br +0 -0
  374. package/dist/public/assets/_C_WdpYbK.js +0 -1
  375. package/dist/public/assets/_CaiH3VN9.js +0 -1
  376. package/dist/public/assets/_CamWDaoG.js.br +0 -0
  377. package/dist/public/assets/_CdDElA0V.js +0 -1
  378. package/dist/public/assets/_CfnsClzZ.js +0 -1
  379. package/dist/public/assets/_Cgo1fRhJ.js +0 -1
  380. package/dist/public/assets/_Cgo1fRhJ.js.br +0 -0
  381. package/dist/public/assets/_CjhGrlf3.js +0 -1
  382. package/dist/public/assets/_CjlbL4C_.js +0 -1
  383. package/dist/public/assets/_CjogTUXK.js +0 -1
  384. package/dist/public/assets/_ClldMY37.js.br +0 -0
  385. package/dist/public/assets/_CmFq6Gtp.js +0 -1
  386. package/dist/public/assets/_CoAPOKiP.js +0 -1
  387. package/dist/public/assets/_CoUUgh9P.js +0 -1
  388. package/dist/public/assets/_CpjSCB1I.js.br +0 -0
  389. package/dist/public/assets/_Ct3RF80L.js.br +0 -0
  390. package/dist/public/assets/_CtYy5eZs.js +0 -1
  391. package/dist/public/assets/_CxAPL49a.js.br +0 -0
  392. package/dist/public/assets/_CyBCIknf.js.br +0 -0
  393. package/dist/public/assets/_Cz5BPBG8.js.br +0 -0
  394. package/dist/public/assets/_D-eEFXaI.js +0 -1
  395. package/dist/public/assets/_D0aoEFRx.js.br +0 -0
  396. package/dist/public/assets/_D1uRW1qz.js.br +0 -0
  397. package/dist/public/assets/_D2oIr2T2.js +0 -1
  398. package/dist/public/assets/_D2un443j.js.br +0 -0
  399. package/dist/public/assets/_D3MPx4-f.js +0 -1
  400. package/dist/public/assets/_D4q8XSMI.js.br +0 -0
  401. package/dist/public/assets/_D4quFMVQ.js.br +0 -0
  402. package/dist/public/assets/_D4rOX-Fa.js.br +0 -0
  403. package/dist/public/assets/_D5edrSyA.js +0 -1
  404. package/dist/public/assets/_D6kktUFn.js.br +0 -0
  405. package/dist/public/assets/_D80-qtVY.js +0 -1
  406. package/dist/public/assets/_D9-3EVA4.js +0 -1
  407. package/dist/public/assets/_D9sS4J_w.js.br +0 -0
  408. package/dist/public/assets/_DBLpxTDi.js +0 -1
  409. package/dist/public/assets/_DByHQ7nW.js +0 -1591
  410. package/dist/public/assets/_DByHQ7nW.js.br +0 -0
  411. package/dist/public/assets/_DC-78WeM.js.br +0 -0
  412. package/dist/public/assets/_DDl8KSWJ.js.br +0 -0
  413. package/dist/public/assets/_DFWOMF-B.js.br +0 -0
  414. package/dist/public/assets/_DKb-rt9n.js +0 -1
  415. package/dist/public/assets/_DMnSJCF_.js +0 -1
  416. package/dist/public/assets/_DOOIlrPh.js +0 -1
  417. package/dist/public/assets/_DPW-0yKP.js +0 -1
  418. package/dist/public/assets/_DR3BmvWU.js +0 -1
  419. package/dist/public/assets/_DSVLaMWS.js.br +0 -0
  420. package/dist/public/assets/_DYNGNKLk.js +0 -1
  421. package/dist/public/assets/_DZnEgCbj.js +0 -1
  422. package/dist/public/assets/_DaMVRI8f.js.br +0 -0
  423. package/dist/public/assets/_DbvaGqOl.js.br +0 -0
  424. package/dist/public/assets/_DcMIlvz-.js.br +0 -0
  425. package/dist/public/assets/_Dd6X3e7w.js.br +0 -0
  426. package/dist/public/assets/_De7P3jUH.js.br +0 -0
  427. package/dist/public/assets/_DeiFEAar.js +0 -1
  428. package/dist/public/assets/_DfI982PI.js.br +0 -0
  429. package/dist/public/assets/_DfZ6emcw.js +0 -1
  430. package/dist/public/assets/_Dj1lZ1pa.js +0 -86
  431. package/dist/public/assets/_Dj1lZ1pa.js.br +0 -0
  432. package/dist/public/assets/_DkCaEf_h.js.br +0 -0
  433. package/dist/public/assets/_DonAis0J.js +0 -1
  434. package/dist/public/assets/_Dp3IZdH8.js.br +0 -0
  435. package/dist/public/assets/_DqYih4xk.js +0 -1
  436. package/dist/public/assets/_DqYih4xk.js.br +0 -0
  437. package/dist/public/assets/_DqhphdU4.js.br +0 -0
  438. package/dist/public/assets/_DrIgZJzN.js.br +0 -0
  439. package/dist/public/assets/_Dt4hHR05.js +0 -1
  440. package/dist/public/assets/_DtTbTraA.js +0 -1
  441. package/dist/public/assets/_DwMxAJKP.js +0 -1
  442. package/dist/public/assets/_DxEm-Gwj.js.br +0 -0
  443. package/dist/public/assets/_Dytf99zx.js.br +0 -0
  444. package/dist/public/assets/_EAgv5jR9.js +0 -1
  445. package/dist/public/assets/_Iecpd0kS.js +0 -1
  446. package/dist/public/assets/_Iecpd0kS.js.br +0 -0
  447. package/dist/public/assets/_MCwIJAuJ.js.br +0 -0
  448. package/dist/public/assets/_NM79Lu3L.js +0 -6
  449. package/dist/public/assets/_NM79Lu3L.js.br +0 -0
  450. package/dist/public/assets/_QpNKKuS9.js +0 -1
  451. package/dist/public/assets/_SGDxiwE1.js.br +0 -0
  452. package/dist/public/assets/_TA8pE7z9.js +0 -1
  453. package/dist/public/assets/_bE4sNDeU.js +0 -1
  454. package/dist/public/assets/_bcsuBP7T.js.br +0 -0
  455. package/dist/public/assets/_cdcAU4yY.js +0 -1
  456. package/dist/public/assets/_ch_yXAap.js.br +0 -0
  457. package/dist/public/assets/_d5u7EI97.js.br +0 -0
  458. package/dist/public/assets/_eoa1EOU-.js.br +0 -0
  459. package/dist/public/assets/_j2tDSMvo.js.br +0 -0
  460. package/dist/public/assets/_jNhIFgbc.js +0 -1
  461. package/dist/public/assets/_kDYiTaag.js +0 -1
  462. package/dist/public/assets/_lNMVVbUx.js +0 -1
  463. package/dist/public/assets/_nwJ7Hu3S.js +0 -1
  464. package/dist/public/assets/_tmDtUACa.js +0 -1
  465. package/dist/public/assets/_tmDtUACa.js.br +0 -0
  466. package/dist/public/assets/_wXDh-Z2N.js.br +0 -0
  467. package/dist/public/assets/_wcshV0sZ.js.br +0 -0
  468. package/dist/public/assets/_x-NwqgCn.js +0 -1
  469. package/dist/public/assets/_xyw_DS5P.js.br +0 -0
  470. package/dist/public/assets/_zSAfqXcm.js.br +0 -0
  471. package/dist/public/assets/app-shell-ChQoVC5b.css +0 -1
  472. package/dist/public/assets/app-shell-ChQoVC5b.css.br +0 -0
  473. package/dist/public/assets/files-view-CLtLp_BW.js +0 -2
  474. package/dist/public/assets/files-view-CNHQapdI.css +0 -1
  475. package/dist/public/assets/files-view-CNHQapdI.css.br +0 -0
  476. package/dist/public/assets/group.css.ts-BG82htKb.css +0 -1
  477. package/dist/public/assets/group.css.ts-BG82htKb.css.br +0 -0
  478. package/dist/public/assets/icon-folder-DJOHuEpD.css +0 -1
  479. package/dist/public/assets/icon-folder-DJOHuEpD.css.br +0 -0
  480. package/dist/public/assets/icon-search-DsJuFXUJ.css +0 -1
  481. package/dist/public/assets/icon-search-DsJuFXUJ.css.br +0 -0
  482. package/dist/public/assets/manage-workspace-NBcFDyrB.js +0 -2
  483. package/dist/public/assets/manage-workspace-f_Np32TD.css +0 -1
  484. package/dist/public/assets/modal-view-KVNBpNYi.css +0 -1
  485. package/dist/public/assets/modal-view-KVNBpNYi.css.br +0 -0
  486. package/dist/public/assets/new-DHI77GvL.js +0 -1
  487. package/dist/public/assets/new-workspace-BFE-HpD_.css +0 -1
  488. package/dist/public/assets/new-workspace-BFE-HpD_.css.br +0 -0
  489. package/dist/public/assets/new-workspace-BRzimdd5.js +0 -2
  490. package/dist/public/assets/port-chip-CUUIDOVM.css +0 -1
  491. package/dist/public/assets/port-chip-CUUIDOVM.css.br +0 -0
  492. package/dist/public/assets/prompt-dialog-BGs6RXOV.css +0 -1
  493. package/dist/public/assets/prompt-dialog-BGs6RXOV.css.br +0 -0
  494. package/dist/public/assets/quick-open-Gx4so1bl.css +0 -1
  495. package/dist/public/assets/quick-open-Gx4so1bl.css.br +0 -0
  496. package/dist/public/assets/repo-picker-CUhd0vJN.css +0 -1
  497. package/dist/public/assets/repo-picker-CUhd0vJN.css.br +0 -4
  498. package/dist/public/assets/review-view-DFEK9VBa.js +0 -2
  499. package/dist/public/assets/review-view-deUY3OE5.css +0 -1
  500. package/dist/public/assets/review-view-deUY3OE5.css.br +0 -0
  501. package/dist/public/assets/section-CziSOSBR.css +0 -1
  502. package/dist/public/assets/section-CziSOSBR.css.br +0 -0
  503. package/dist/public/assets/settings-DHI77GvL.js +0 -1
  504. package/dist/public/assets/settings-page-OOtPOzIn.js +0 -2
  505. package/dist/public/assets/settings-page-wZhd7FLi.css +0 -1
  506. package/dist/public/assets/settings-page-wZhd7FLi.css.br +0 -0
  507. package/dist/public/assets/skill-row-BoCyFIXg.css +0 -1
  508. package/dist/public/assets/sso-auth-DV76tTpE.css +0 -1
  509. package/dist/public/assets/sso-auth-DV76tTpE.css.br +0 -0
  510. package/dist/public/assets/w-DHI77GvL.js +0 -1
  511. package/dist/public/assets/w._-DHI77GvL.js +0 -1
  512. package/dist/public/assets/w._-DsTgq3-C.js +0 -1
  513. package/dist/public/assets/w._-igEOSPR-.js +0 -1
package/README.md CHANGED
@@ -80,13 +80,25 @@ from then on. A refused request gets a page saying which setting it needs.
80
80
  Everything (pages, API, and the `/term` websockets) serves from the single
81
81
  app port, so route the whole hostname to it.
82
82
 
83
+ **Tailscale** is the zero-config way. On a machine logged in to Tailscale
84
+ (1.52 or newer), `work setup` offers to run `tailscale serve --bg <port>`,
85
+ which puts work at `https://<machine>.<tailnet>.ts.net/` for your devices on
86
+ the tailnet alone (never Funnel, which would publish it to the internet),
87
+ and adds that name to `WORK_ALLOWED_HOSTS`: open it on a phone signed in to
88
+ the same tailnet. `work setup --tailscale` does it without asking and
89
+ `--no-tailscale` skips the question; `--yes` alone leaves Tailscale's config
90
+ as it is. A serve config already pointing at work only has its name
91
+ allowed, and `work doctor` says which of these holds.
92
+
83
93
  **Opening workspace ports remotely.** The port chips in the sidebar link to
84
94
  `http://<host>:<port>`, which only works where the machine is reachable
85
- directly. Through a tunnel, route a wildcard hostname to the app port as
86
- well and work proxies it — HTTP and websockets, so HMR works — to
87
- `localhost:<port>`. `WORK_PORT_HOSTS` picks the hostname shape the chips
88
- link to; `sub` is always accepted, `dash` only when picked, and only for a
89
- name of three labels or more:
95
+ directly — under a tailnet name too, since `tailscale serve` has no
96
+ wildcard names: there a chip reaches a dev server that listens beyond
97
+ loopback (`--host`), and one on loopback says so. Through a tunnel, route
98
+ a wildcard hostname to the app port as well and work proxies it — HTTP and
99
+ websockets, so HMR works — to `localhost:<port>`. `WORK_PORT_HOSTS` picks
100
+ the hostname shape the chips link to; `sub` is always accepted, `dash` only
101
+ when picked, and only for a name of three labels or more:
90
102
 
91
103
  - `sub` (default): `https://3000.work.example.com`. Needs a wildcard
92
104
  `*.work.example.com` route and a certificate that covers it (your own
package/bin/work.mjs CHANGED
@@ -2,6 +2,8 @@
2
2
  // work CLI — ships with the npm package (no dependencies; plain node).
3
3
  //
4
4
  // work setup install missing tools, sign in, install/refresh the background service
5
+ // (--tailscale serves work on the tailnet with `tailscale serve`, which
6
+ // it otherwise offers when Tailscale is logged in; --no-tailscale skips that)
5
7
  // work doctor report machine readiness (--json, --fix to install what's missing)
6
8
  // work start run the server in the foreground
7
9
  // work update upgrade the npm package and refresh the service
@@ -26,8 +28,17 @@ import { execFileSync, spawnSync } from "node:child_process";
26
28
  import fs from "node:fs";
27
29
  import os from "node:os";
28
30
  import path from "node:path";
31
+ import readline from "node:readline/promises";
32
+ import tty from "node:tty";
29
33
  import { fileURLToPath } from "node:url";
30
- import { doctor, formatDoctor, setupPath } from "../lib/setup/doctor.mjs";
34
+ import {
35
+ doctor,
36
+ formatDoctor,
37
+ setupPath,
38
+ tailscaleProbe,
39
+ which,
40
+ } from "../lib/setup/doctor.mjs";
41
+ import { allowHost, stateText } from "../lib/setup/tailscale.mjs";
31
42
  import { installTool, repairGhHelpers } from "../lib/setup/install.mjs";
32
43
  import { bridgeCommands, bridgeIfNeeded } from "../lib/setup/bridge.mjs";
33
44
  import { dialHost, listenStream } from "../lib/setup/listen.mjs";
@@ -638,17 +649,23 @@ function until(iso) {
638
649
 
639
650
  async function setup() {
640
651
  await bridge();
641
- await fix(await doctor());
652
+ const d = await doctor(doctorOpts());
653
+ await fix(d);
654
+ // Before the service is written: a tailnet name to answer goes into the
655
+ // WORK_ALLOWED_HOSTS it carries.
656
+ const tailnet = await tailscale(d.tailscale);
642
657
 
643
658
  const running = installService();
644
659
  const port = serviceEnv().PORT;
645
- maybeTunnel(port);
660
+ if (!tailnet) maybeTunnel(port);
646
661
  if (running) {
647
662
  if (await waitForServer()) log(`done — http://localhost:${port}`);
648
663
  else
649
664
  warn(
650
665
  `service started but nothing answered on port ${port} within 30s — check the logs`,
651
666
  );
667
+ if (tailnet)
668
+ log(`on your phone and other devices on the tailnet: ${tailnet}`);
652
669
  } else {
653
670
  // A fresh install's shell may not have mise on PATH yet — name the shim.
654
671
  const shim = path.join(
@@ -725,15 +742,19 @@ async function update() {
725
742
  "@dylanpiercey/work@latest",
726
743
  ]);
727
744
  // Re-exec the (possibly new) CLI to finish with fresh code.
728
- sh("work", ["setup", ...(yes ? ["--yes"] : [])]);
745
+ sh("work", [
746
+ "setup",
747
+ ...(yes ? ["--yes"] : []),
748
+ ...args.filter((a) => a === "--tailscale" || a === "--no-tailscale"),
749
+ ]);
729
750
  }
730
751
 
731
752
  /** Machine readiness from lib/setup — the same probe the Settings page runs. */
732
753
  async function doctorCmd() {
733
- let d = await doctor();
754
+ let d = await doctor(doctorOpts());
734
755
  if (args.includes("--fix")) {
735
756
  await fix(d);
736
- d = await doctor();
757
+ d = await doctor(doctorOpts());
737
758
  }
738
759
  if (args.includes("--json")) {
739
760
  console.log(JSON.stringify(d, null, 2));
@@ -747,6 +768,13 @@ async function doctorCmd() {
747
768
  if (!d.ready) process.exitCode = 1;
748
769
  }
749
770
 
771
+ /** What the doctor's Tailscale probe checks against: the port and allowed
772
+ * names the service runs with (or will, after `work setup`). */
773
+ function doctorOpts() {
774
+ const env = serviceEnv();
775
+ return { port: env.PORT, allowedHosts: env.WORK_ALLOWED_HOSTS || "" };
776
+ }
777
+
750
778
  /** Said when the service listens beyond this machine with nothing declared
751
779
  * to answer there: every other machine is refused (server/access.ts), which
752
780
  * is safe, but likely not what the listening was for. */
@@ -1312,8 +1340,179 @@ function maybeTunnel(port = appPort) {
1312
1340
  if (yes || have("cloudflared")) return;
1313
1341
  console.log(`
1314
1342
  To reach work from your phone or other devices, put it behind something
1315
- that terminates TLS and authenticates, e.g. a Cloudflare Tunnel with
1343
+ that terminates TLS and authenticates, e.g. Tailscale (\`work setup
1344
+ --tailscale\` runs \`tailscale serve\` for you) or a Cloudflare Tunnel with
1316
1345
  Access (https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/)
1317
- pointing at http://localhost:${port}, or Tailscale. The server itself has
1318
- no auth of its own.`);
1346
+ pointing at http://localhost:${port}. The server itself has no auth of its
1347
+ own.`);
1348
+ }
1349
+
1350
+ /**
1351
+ * `tailscale serve` in front of work: https://<machine>.<tailnet>.ts.net/,
1352
+ * TLS and the tailnet's own sign-in in the local daemon, proxied to work's
1353
+ * port, so requests arrive from this machine under that name — which goes
1354
+ * into WORK_ALLOWED_HOSTS. Tailnet only, never Funnel: Funnel publishes to
1355
+ * the internet, and work has no login of its own. Tailscale's config is
1356
+ * changed only on an explicit yes, the prompt's or `--tailscale`; `--yes`
1357
+ * is how the installer, `work update` and the app's own update run setup
1358
+ * unattended, and none of them asked for it. A serve config already
1359
+ * pointing at work only has its name allowed. Returns the URL work is
1360
+ * served at, or null.
1361
+ */
1362
+ async function tailscale(ts) {
1363
+ if (args.includes("--no-tailscale")) return null;
1364
+ const asked = args.includes("--tailscale");
1365
+ const port = serviceEnv().PORT;
1366
+ if (!ts?.installed) {
1367
+ if (asked)
1368
+ warn(
1369
+ "Tailscale is not installed: https://tailscale.com/download, then work setup --tailscale",
1370
+ );
1371
+ return null;
1372
+ }
1373
+ if (ts.serve) {
1374
+ if (!allowTailnet(ts.serve)) return null;
1375
+ if (ts.running) return servedAt(ts.serve.url);
1376
+ // A serve config outlives a logout, and serves again once it is up.
1377
+ log(
1378
+ `Tailscale is ${stateText(ts)}: work is at ${ts.serve.url} once it is up`,
1379
+ );
1380
+ return null;
1381
+ }
1382
+ if (!ts.running) {
1383
+ if (asked)
1384
+ warn(
1385
+ `Tailscale is ${stateText(ts)}: ${ts.state === null ? "start tailscaled" : "run `tailscale up`"}, then work setup --tailscale`,
1386
+ );
1387
+ return null;
1388
+ }
1389
+ const input = yes ? null : terminal();
1390
+ try {
1391
+ const refusal = serveRefusal(ts, port);
1392
+ if (refusal) {
1393
+ if (asked || input) warn(refusal);
1394
+ return null;
1395
+ }
1396
+ const target = serveTarget(port);
1397
+ const command = `tailscale serve --bg ${target}`;
1398
+ if (!asked) {
1399
+ if (!input) {
1400
+ log(
1401
+ `Tailscale is logged in: \`work setup --tailscale\` serves work at https://${ts.name}/ on your tailnet`,
1402
+ );
1403
+ return null;
1404
+ }
1405
+ console.log(`
1406
+ Tailscale is logged in here as ${ts.name}.
1407
+ \`${command}\` puts work at https://${ts.name}/
1408
+ for your devices on the tailnet (only them: never Funnel), proxied by the
1409
+ local Tailscale daemon to port ${port}.${ts.https === false ? "\nHTTPS certificates are off on your tailnet: tailscale prints a link that\nturns them on." : ""}`);
1410
+ if (!(await confirm(input, `Run \`${command}\`? [y/N] `))) {
1411
+ log(
1412
+ "left Tailscale as it was (work setup --tailscale serves work later; --no-tailscale skips this question)",
1413
+ );
1414
+ return null;
1415
+ }
1416
+ } else if (ts.https === false && !input) {
1417
+ // tailscale serve would wait, unattended, for someone to follow the
1418
+ // link it prints.
1419
+ warn(
1420
+ "HTTPS certificates are off on your tailnet: turn them on (https://login.tailscale.com/admin/dns), then run work setup --tailscale",
1421
+ );
1422
+ return null;
1423
+ }
1424
+ log(command);
1425
+ spawnSync(which("tailscale"), ["serve", "--bg", target], {
1426
+ stdio: "inherit",
1427
+ });
1428
+ } finally {
1429
+ if (input && input !== process.stdin) input.destroy();
1430
+ }
1431
+ // Its exit status is no proof: it exits 0 having only printed how to
1432
+ // turn HTTPS on, when it does not wait for that.
1433
+ const after = await tailscaleProbe({ port, allowedHosts: "" });
1434
+ if (!after.serve) {
1435
+ warn(
1436
+ "tailscale serve did not serve work (see above); once it does, run work setup again",
1437
+ );
1438
+ return null;
1439
+ }
1440
+ return allowTailnet(after.serve) ? servedAt(after.serve.url) : null;
1441
+ }
1442
+
1443
+ function servedAt(url) {
1444
+ log(`Tailscale serves work at ${url} (tailnet only)`);
1445
+ return url;
1446
+ }
1447
+
1448
+ /** Why `tailscale serve --bg <port>` is not run here, or null. */
1449
+ function serveRefusal(ts, port) {
1450
+ if (!ts.serveCli)
1451
+ return `tailscale ${ts.version || "(unknown version)"} predates \`tailscale serve --bg <port>\` (1.52): update Tailscale, then run work setup --tailscale`;
1452
+ // It would replace whatever serves the name's root now.
1453
+ if (ts.rootTaken)
1454
+ return `https://${ts.name}/ already serves ${ts.rootTaken}, which work leaves alone. To serve work beside it: tailscale serve --bg --https=8443 ${port}, then work setup`;
1455
+ if (!serveTarget(port))
1456
+ return `work listens on ${serviceEnv().WORK_LISTEN} alone, and tailscale serve proxies to loopback: WORK_LISTEN= work setup --tailscale`;
1457
+ return null;
1458
+ }
1459
+
1460
+ /** What `tailscale serve` proxies to: work's port on loopback, where
1461
+ * requests are this machine's (server/access.ts). Null when work listens
1462
+ * on one other address only, which loopback does not reach. */
1463
+ function serveTarget(port) {
1464
+ const listen = serviceEnv().WORK_LISTEN;
1465
+ if (listen === "::1") return `http://[::1]:${port}`;
1466
+ return ["127.0.0.1", "0.0.0.0", "::", "*"].includes(listen)
1467
+ ? String(port)
1468
+ : null;
1469
+ }
1470
+
1471
+ /** Put the name tailscale serve serves work under in WORK_ALLOWED_HOSTS,
1472
+ * for installService() to write — or, when Funnel publishes that name to
1473
+ * the internet, take it out, so work refuses the internet there. False
1474
+ * then. */
1475
+ function allowTailnet(serve) {
1476
+ const current = serviceEnv().WORK_ALLOWED_HOSTS || "";
1477
+ const next = allowHost(current, serve.host, !serve.funnel);
1478
+ if (next !== current) {
1479
+ process.env.WORK_ALLOWED_HOSTS = next;
1480
+ log(
1481
+ `${serve.funnel ? "refusing" : "allowing"} ${serve.host} (WORK_ALLOWED_HOSTS=${next})`,
1482
+ );
1483
+ }
1484
+ if (serve.funnel) {
1485
+ warn(
1486
+ `Tailscale Funnel publishes ${serve.url} to the internet, and work has no login, so work refuses that name. Turn Funnel off (tailscale funnel --https=${new URL(serve.url).port || 443} off), then run work setup again`,
1487
+ );
1488
+ return false;
1489
+ }
1490
+ return true;
1491
+ }
1492
+
1493
+ /** Where to ask the user something: stdin when it is a terminal, else the
1494
+ * controlling terminal, since the curl installer pipes its script into the
1495
+ * shell this runs under. Null with no terminal at all. */
1496
+ function terminal() {
1497
+ if (process.stdin.isTTY) return process.stdin;
1498
+ try {
1499
+ return new tty.ReadStream(fs.openSync("/dev/tty", "r"));
1500
+ } catch {
1501
+ return null;
1502
+ }
1503
+ }
1504
+
1505
+ /** A yes/no question, no unless answered yes. Line-buffered by the
1506
+ * terminal itself, so Ctrl-C stops setup as it would anywhere else. */
1507
+ async function confirm(input, question) {
1508
+ const rl = readline.createInterface({
1509
+ input,
1510
+ output: process.stdout,
1511
+ terminal: false,
1512
+ });
1513
+ try {
1514
+ return /^y(es)?$/i.test((await rl.question(question)).trim());
1515
+ } finally {
1516
+ rl.close();
1517
+ }
1319
1518
  }
@@ -0,0 +1,168 @@
1
+ var glyphBadgeNum = "_y _x";
2
+ var usageInk = {
3
+ ok: "_z",
4
+ mid: "_A",
5
+ warm: "_B",
6
+ hot: "_C"
7
+ };
8
+ var usageFill = {
9
+ ok: "_D",
10
+ mid: "_E",
11
+ warm: "_F",
12
+ hot: "_G"
13
+ };
14
+ var prTone = {
15
+ open: "_H",
16
+ draft: "_I",
17
+ merged: "_J",
18
+ closed: "_K"
19
+ };
20
+ var phaseIcon = {
21
+ working: "_X _W",
22
+ waiting: "_Y _W",
23
+ idle: "_Z _W",
24
+ off: "_0 _W"
25
+ };
26
+ var btnSm = "_7 _r";
27
+ var btnLg = "_8 _r";
28
+ var tone = {
29
+ accent: "_bb",
30
+ ok: "_bc",
31
+ warn: "_bd",
32
+ danger: "_be",
33
+ merged: "_bf",
34
+ closed: "_bg"
35
+ };
36
+ var inputLg = "_bk _bj";
37
+ var iconBtnXs = "_bo _m";
38
+ var iconBtnRow = "_bp _m";
39
+ var iconBtnLg = "_bq _m";
40
+ var chipBtn = "_br _m";
41
+ var tocDot = "_dx _U";
42
+ //#endregion
43
+ //#region src/styles/tokens.css.ts
44
+ var color = {
45
+ ok: "light-dark(#1a7f37, #57d364)",
46
+ okStrong: "light-dark(#116329, #7ee787)",
47
+ warn: "light-dark(#bf8700, #d4a72c)",
48
+ warnStrong: "light-dark(#8a5a00, #f0b84a)",
49
+ merged: "light-dark(#8250df, #a371f7)",
50
+ closed: "light-dark(#cf222e, #f85149)",
51
+ onAccent: "#fff",
52
+ onDanger: "#fff",
53
+ accentDefault: "light-dark(#4f5bd5, #6470e6)",
54
+ bg: "var(--bg)",
55
+ panel: "var(--panel)",
56
+ border: "var(--border)",
57
+ text: "var(--text)",
58
+ dim: "var(--dim)",
59
+ accent: "var(--accent)",
60
+ accentFill: "var(--accent-fill)",
61
+ accentText: "var(--accent-text)",
62
+ danger: "var(--danger)",
63
+ fieldBorder: "var(--field-border)",
64
+ raised: "color-mix(in srgb, var(--panel) 94%, var(--text))",
65
+ raisedHover: "color-mix(in srgb, var(--panel) 90%, var(--text))",
66
+ onScrim: "#fff"
67
+ };
68
+ var sans = "Inter, ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif";
69
+ var iconSize = {
70
+ sm: 12,
71
+ md: 14,
72
+ lg: 16,
73
+ xl: 18
74
+ };
75
+ var toastKind = {
76
+ error: "_bJ",
77
+ warn: "_bK",
78
+ info: "_bL"
79
+ };
80
+ var toastTitle = {
81
+ error: "_bM",
82
+ warn: "_bN",
83
+ info: "_bO"
84
+ };
85
+ //#endregion
86
+ //#region src/tags/settings-agents.css.ts
87
+ var agentRow = "_fD _dI";
88
+ var list$3 = "_dM _c9 _dH _dK";
89
+ var metaChip = "_d0 _bi _bh";
90
+ var sectionCount = "_c6 _9 __";
91
+ var usageNote = "_jn _bh";
92
+ var pop$2 = "_ht _bw";
93
+ var spinner = "_hw _bm _2";
94
+ var toolLead = "_he _dV";
95
+ var name$4 = "_gW _dV";
96
+ var desc$1 = "_gX _dW";
97
+ //#endregion
98
+ //#region src/tags/lsp-add-dialog.css.ts
99
+ var addDlg = "_k1 _b2";
100
+ var key$1 = "_k_ _k8";
101
+ var addTile = "_lb _k8";
102
+ var field$2 = "_lm _bj";
103
+ var keyField = "_ln _lm _bj";
104
+ var labelField = "_lo _lm _bj";
105
+ var themeSeg = "_eI _bA";
106
+ var checkList = "_gM _c7";
107
+ //#endregion
108
+ //#region src/tags/prompt-dialog.css.ts
109
+ var promptDlg = "_b6 _b2";
110
+ var item$1 = "_bY _m";
111
+ var glance = "_dE _m";
112
+ //#endregion
113
+ //#region src/tags/side-nav.css.ts
114
+ var iconBtn = "_b9 _m";
115
+ var settingsDot = "_b_ _bz";
116
+ var notifyBtn = "_ce _m";
117
+ //#endregion
118
+ //#region src/styles/session-pop.css.ts
119
+ var sessionPop = "_b7 _bw";
120
+ var sessionPopBtn = "_b8 _4";
121
+ var wsBtn = "_fe _4";
122
+ var rowIcon = "_fg _bo _m";
123
+ var prChip = "_kM _v _kG";
124
+ var readyChip = "_kN _v";
125
+ var prDot = "_kP _kO";
126
+ //#endregion
127
+ //#region src/tags/port-chip.css.ts
128
+ var port = "_m6 _v _kG";
129
+ var open = "_j7 _4";
130
+ var action = "_ka _br _m";
131
+ var toggle = "_d5 _P";
132
+ var fold = "_d6 _dJ";
133
+ var item = "_jz _4";
134
+ var menu = "_kx _b7 _bw";
135
+ var menuItem = "_kz _4";
136
+ var findBtn$1 = "_ih _fV _bp _m";
137
+ var tool = "_fV _bp _m";
138
+ var pop$1 = "_kg _b7 _bw";
139
+ var fileFilter = "_m4 _o";
140
+ var findInput = "_ei _o";
141
+ var keybarIconBtn = "_er _br _m";
142
+ var repoTitle = "_lU _L";
143
+ var input = "_ct _o";
144
+ var group = "_cw _P";
145
+ var hint$1 = "_l2 _9 _M";
146
+ var sheetDir = "_ml _by";
147
+ var upBtn = "_gc _bp _m";
148
+ var findBtn = "_gg _fV _bp _m";
149
+ var goBtn = "_gh _fV _bp _m";
150
+ var note = "_l5 _bh";
151
+ //#endregion
152
+ //#region src/tags/manage-workspace.css.ts
153
+ var procCmd = "_fs _dV";
154
+ var factCopy = "_fz _br _m";
155
+ var resultRow = "_jO _4";
156
+ var resultBranch = "_jP _d0 _bi _bh _bo _m";
157
+ var urlAction = "_jQ _d0 _bi _bh _d1";
158
+ var curRow = "_eC _dP";
159
+ //#endregion
160
+ //#region src/tags/join-dialog.css.ts
161
+ var dlg = "_jC _b2";
162
+ var hint = "_jD _bh";
163
+ var kbtn = "_cP _bq _m";
164
+ var repeat = "_cS _cR";
165
+ var dpadUser = "_cV _cR";
166
+ var dpadEsc = "_cW _cR";
167
+ //#endregion
168
+ export { key$1 as $, item as A, usageFill as At, wsBtn as B, keybarIconBtn as C, iconBtnLg as Ct, findBtn$1 as D, phaseIcon as Dt, tool as E, inputLg as Et, port as F, settingsDot as G, sessionPopBtn as H, prChip as I, promptDlg as J, glance as K, prDot as L, toggle as M, action as N, menu as O, prTone as Ot, open as P, field$2 as Q, readyChip as R, findInput as S, glyphBadgeNum as St, pop$1 as T, iconBtnXs as Tt, iconBtn as U, sessionPop as V, notifyBtn as W, themeSeg as X, checkList as Y, addTile as Z, sheetDir as _, sans as _t, dlg as a, toolLead as at, input as b, btnSm as bt, resultBranch as c, usageNote as ct, factCopy as d, metaChip as dt, keyField as et, procCmd as f, agentRow as ft, upBtn as g, iconSize as gt, goBtn as h, color as ht, repeat as i, name$4 as it, fold as j, usageInk as jt, menuItem as k, tone as kt, resultRow as l, sectionCount as lt, findBtn as m, toastTitle as mt, dpadUser as n, addDlg as nt, hint as o, pop$2 as ot, note as p, toastKind as pt, item$1 as q, kbtn as r, desc$1 as rt, curRow as s, spinner as st, dpadEsc as t, labelField as tt, urlAction as u, list$3 as ut, hint$1 as v, tocDot as vt, fileFilter as w, iconBtnRow as wt, repoTitle as x, chipBtn as xt, group as y, btnLg as yt, rowIcon as z };