@dylanpiercey/work 0.0.203 → 0.0.205

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 (557) hide show
  1. package/bin/work.mjs +220 -63
  2. package/dist/_CWyeRc54.js +2 -0
  3. package/dist/{_B9FeLAO5.js → _C_-lYJlp.js} +394 -114
  4. package/dist/index.mjs +15157 -13688
  5. package/dist/public/assets/_-OlchSkR.js +1 -0
  6. package/dist/public/assets/_2V7v-g6H.js +1 -0
  7. package/dist/public/assets/_5FuvVnQD.js +1 -0
  8. package/dist/public/assets/_5izm_sOI.js +1 -0
  9. package/dist/public/assets/_5izm_sOI.js.br +0 -0
  10. package/dist/public/assets/_6AplNi7Z.js +1 -0
  11. package/dist/public/assets/_6AplNi7Z.js.br +0 -0
  12. package/dist/public/assets/_8YGIApOo.js +1 -0
  13. package/dist/public/assets/{_DITz3wmu.js → _AHFaCvQU.js} +1 -1
  14. package/dist/public/assets/_AHFaCvQU.js.br +0 -0
  15. package/dist/public/assets/_B0mn17Dk.js +1 -0
  16. package/dist/public/assets/_B0roVhqi.js +1 -0
  17. package/dist/public/assets/{_Brbaz_V-.js → _B16QFqgy.js} +1 -1
  18. package/dist/public/assets/_B16QFqgy.js.br +0 -0
  19. package/dist/public/assets/{_D8WMh6gu.js → _B2f-LxUk.js} +1 -1
  20. package/dist/public/assets/_B2f-LxUk.js.br +0 -0
  21. package/dist/public/assets/_B7rzA4Vo.js +1 -0
  22. package/dist/public/assets/_B7rzA4Vo.js.br +0 -0
  23. package/dist/public/assets/_B9EmUOCA.js +1 -0
  24. package/dist/public/assets/_B9EmUOCA.js.br +0 -0
  25. package/dist/public/assets/_BD9gP_kw.js +1 -0
  26. package/dist/public/assets/_BD9gP_kw.js.br +0 -0
  27. package/dist/public/assets/_BDHG8Nmi.js +9 -0
  28. package/dist/public/assets/_BDHG8Nmi.js.br +0 -0
  29. package/dist/public/assets/{_Cl7KlO12.js → _BDWKc_9X.js} +1 -1
  30. package/dist/public/assets/_BDWKc_9X.js.br +0 -0
  31. package/dist/public/assets/{_BeVk3dbG.js → _BE8KQ5PW.js} +1 -1
  32. package/dist/public/assets/_BE8KQ5PW.js.br +0 -0
  33. package/dist/public/assets/{_DCg8UEc3.js → _BFgV8m7c.js} +1 -1
  34. package/dist/public/assets/_BFgV8m7c.js.br +0 -0
  35. package/dist/public/assets/_BHZ-Cv2U.js +1 -0
  36. package/dist/public/assets/{_Do95KzEK.js → _BHcaNOzL.js} +1 -1
  37. package/dist/public/assets/_BHcaNOzL.js.br +0 -0
  38. package/dist/public/assets/_BKM2-z0e.js +1 -0
  39. package/dist/public/assets/_BN0AE2HC.js +1 -0
  40. package/dist/public/assets/_BNORURCQ.js +1 -0
  41. package/dist/public/assets/_BNORURCQ.js.br +0 -0
  42. package/dist/public/assets/_BNm4Ae9_.js +1 -0
  43. package/dist/public/assets/_BNm4Ae9_.js.br +0 -0
  44. package/dist/public/assets/_BOm1SpkD.js +1 -0
  45. package/dist/public/assets/{_C3M50_zF.js → _BPhE-idg.js} +1 -1
  46. package/dist/public/assets/_BPhE-idg.js.br +0 -0
  47. package/dist/public/assets/{_Bx5kmADX.js → _BPtQ2PEh.js} +1 -1
  48. package/dist/public/assets/_BPtQ2PEh.js.br +0 -0
  49. package/dist/public/assets/_BRGmqkNr.js +1 -0
  50. package/dist/public/assets/_BRnslEKE.js +1 -0
  51. package/dist/public/assets/{_B9kU6sMh.js → _BSSQw7B1.js} +1 -1
  52. package/dist/public/assets/_BSSQw7B1.js.br +0 -0
  53. package/dist/public/assets/{_CPH47jXm.js → _BUfLoUyd.js} +56 -56
  54. package/dist/public/assets/_BUfLoUyd.js.br +0 -0
  55. package/dist/public/assets/{_CRZGR7so.js → _BVLWii1t.js} +1 -1
  56. package/dist/public/assets/_BVLWii1t.js.br +0 -0
  57. package/dist/public/assets/{_DEf8mUHj.js → _BWAs5afd.js} +1 -1
  58. package/dist/public/assets/_BWAs5afd.js.br +0 -0
  59. package/dist/public/assets/_BYdCKt3O.js +1 -0
  60. package/dist/public/assets/_B_JOtc1M.js +1 -0
  61. package/dist/public/assets/_BcXiRBkz.js +1 -0
  62. package/dist/public/assets/_BgKdTCD6.js +1 -0
  63. package/dist/public/assets/{_TcqYUNNo.js → _BixjwCO8.js} +1 -1
  64. package/dist/public/assets/_BixjwCO8.js.br +0 -0
  65. package/dist/public/assets/_BkQF1UOD.js +1 -0
  66. package/dist/public/assets/_BkQF1UOD.js.br +0 -0
  67. package/dist/public/assets/_BpGTzAYy.js +1 -0
  68. package/dist/public/assets/{_DqAamLSj.js → _Bpf0k8uS.js} +1 -1
  69. package/dist/public/assets/_Bpf0k8uS.js.br +0 -0
  70. package/dist/public/assets/{_CljaR6t8.js → _BqizK7cx.js} +1 -1
  71. package/dist/public/assets/_BqizK7cx.js.br +0 -0
  72. package/dist/public/assets/{_CArazMIS.js → _BrWsQx9M.js} +1 -1
  73. package/dist/public/assets/_BrWsQx9M.js.br +0 -0
  74. package/dist/public/assets/_BrbA4biE.js +1 -0
  75. package/dist/public/assets/{_CoZYY0F5.js → _Bs2HUAxm.js} +1 -1
  76. package/dist/public/assets/_Bs2HUAxm.js.br +0 -0
  77. package/dist/public/assets/_BsWogZkr.js +1 -0
  78. package/dist/public/assets/_BthptJ6a.js +1 -0
  79. package/dist/public/assets/_BthptJ6a.js.br +0 -0
  80. package/dist/public/assets/_BuxlUghc.js +1 -0
  81. package/dist/public/assets/{_BaiQtGR9.js → _Bv-wpAaO.js} +1 -1
  82. package/dist/public/assets/_Bv-wpAaO.js.br +0 -0
  83. package/dist/public/assets/_BvK6PQ1z.js +1 -0
  84. package/dist/public/assets/{_-K2pkpBq.js → _BytWZ6R5.js} +1 -1
  85. package/dist/public/assets/_BytWZ6R5.js.br +0 -0
  86. package/dist/public/assets/_C-OUSTHo.js +1 -0
  87. package/dist/public/assets/{_C_Lr0eFb.js → _C0Hfu_Ho.js} +1 -1
  88. package/dist/public/assets/_C0Hfu_Ho.js.br +0 -0
  89. package/dist/public/assets/_C0ztthm_.js +1 -0
  90. package/dist/public/assets/{_Dq-Jad5X.js → _C2DkGqn5.js} +1 -1
  91. package/dist/public/assets/_C2DkGqn5.js.br +0 -0
  92. package/dist/public/assets/{_DFjp3R_E.js → _C33cmCxX.js} +1 -1
  93. package/dist/public/assets/_C33cmCxX.js.br +0 -0
  94. package/dist/public/assets/{_B80CP8fn.js → _C3ShTfoQ.js} +1 -1
  95. package/dist/public/assets/_C3ShTfoQ.js.br +0 -0
  96. package/dist/public/assets/_C3tVbCBH.js +1 -0
  97. package/dist/public/assets/_C6M1hDWV.js +1 -0
  98. package/dist/public/assets/_C6P-6sWK.js +1 -0
  99. package/dist/public/assets/_C78RESm0.js +1 -0
  100. package/dist/public/assets/_C7z3JBX0.js +1 -0
  101. package/dist/public/assets/_C8-cikmx.js +1 -0
  102. package/dist/public/assets/_C9thRVyr.js +1 -0
  103. package/dist/public/assets/{_GnLkrWZM.js → _CBBTd56s.js} +1 -1
  104. package/dist/public/assets/_CBBTd56s.js.br +0 -0
  105. package/dist/public/assets/_CEGHO2aQ.js +1 -0
  106. package/dist/public/assets/{_BZ3C3l3R.js → _CFF1bIG3.js} +1 -1
  107. package/dist/public/assets/_CFF1bIG3.js.br +0 -0
  108. package/dist/public/assets/{_vunrMsGK.js → _CGmOePAM.js} +1 -1
  109. package/dist/public/assets/_CGmOePAM.js.br +0 -0
  110. package/dist/public/assets/_CHOAR75o.js +1 -0
  111. package/dist/public/assets/_CIK0aYGO.js +1422 -0
  112. package/dist/public/assets/_CIK0aYGO.js.br +0 -0
  113. package/dist/public/assets/_CIM_QKij.js +1 -0
  114. package/dist/public/assets/_CJzM23DW.js +2 -0
  115. package/dist/public/assets/_CJzM23DW.js.br +0 -0
  116. package/dist/public/assets/_CK5CtA9f.js +1 -0
  117. package/dist/public/assets/_CLVYQ-74.js +1 -0
  118. package/dist/public/assets/_CLVYQ-74.js.br +0 -0
  119. package/dist/public/assets/{_up7lLRgA.js → _CLeF1FF3.js} +1 -1
  120. package/dist/public/assets/_CPm0qMfS.js +1 -0
  121. package/dist/public/assets/_CQWTMS1P.js +1 -0
  122. package/dist/public/assets/_CQWTMS1P.js.br +0 -0
  123. package/dist/public/assets/_CQgVf_hl.js +1 -0
  124. package/dist/public/assets/_CRzep8vQ.js +1 -0
  125. package/dist/public/assets/_CVY_H9pO.js +1 -0
  126. package/dist/public/assets/_CVlglWWP.js +1 -0
  127. package/dist/public/assets/_CYtOhTGb.js +1 -0
  128. package/dist/public/assets/_CZP-vnK2.js +1 -0
  129. package/dist/public/assets/_CZP-vnK2.js.br +0 -0
  130. package/dist/public/assets/_C_aWNVgg.js +1 -0
  131. package/dist/public/assets/_C_fU39wg.js +1 -0
  132. package/dist/public/assets/{_CSmKiIv8.js → _CaWlTbQM.js} +1 -1
  133. package/dist/public/assets/_Ca_UkEY3.js +1 -0
  134. package/dist/public/assets/_Ca_UkEY3.js.br +8 -0
  135. package/dist/public/assets/_CbKQ4tM7.js +1 -0
  136. package/dist/public/assets/_CbndvCa9.js +1 -0
  137. package/dist/public/assets/_CdgFbcw6.js +1 -0
  138. package/dist/public/assets/_Cf0kh0ya.js +1 -0
  139. package/dist/public/assets/_Cf0kh0ya.js.br +0 -0
  140. package/dist/public/assets/_CffIUDL_.js +1 -0
  141. package/dist/public/assets/_CffIUDL_.js.br +0 -0
  142. package/dist/public/assets/_CfrSfMqj.js +1 -0
  143. package/dist/public/assets/_CfrSfMqj.js.br +0 -0
  144. package/dist/public/assets/_CoHLhCNH.js +1 -0
  145. package/dist/public/assets/{_D07_FXWo.js → _CpK94htG.js} +1 -1
  146. package/dist/public/assets/_CqrXDSP9.js +1 -0
  147. package/dist/public/assets/_Csdgg-p8.js +1 -0
  148. package/dist/public/assets/_Csdgg-p8.js.br +0 -0
  149. package/dist/public/assets/{_C0K-WRJD.js → _Csvc0jmZ.js} +1 -1
  150. package/dist/public/assets/_Csvc0jmZ.js.br +0 -0
  151. package/dist/public/assets/_CtdLytfI.js +1 -0
  152. package/dist/public/assets/{_S99TppFt.js → _CtxNwohv.js} +1 -1
  153. package/dist/public/assets/_CtxNwohv.js.br +0 -0
  154. package/dist/public/assets/_CuApWap_.js +86 -0
  155. package/dist/public/assets/_CuApWap_.js.br +0 -0
  156. package/dist/public/assets/_CvBjVI0v.js +1 -0
  157. package/dist/public/assets/_CwZRDJQ2.js +1 -0
  158. package/dist/public/assets/_CwZRDJQ2.js.br +0 -0
  159. package/dist/public/assets/_CxyFAuJT.js +1 -0
  160. package/dist/public/assets/_CxyFAuJT.js.br +0 -0
  161. package/dist/public/assets/_D00q6XFi.js +1 -0
  162. package/dist/public/assets/_D00q6XFi.js.br +0 -0
  163. package/dist/public/assets/{_8Q9P2uHp.js → _D0rv_4FK.js} +1 -1
  164. package/dist/public/assets/_D0rv_4FK.js.br +0 -0
  165. package/dist/public/assets/{_CJoG6S3-.js → _D478nKDM.js} +1 -1
  166. package/dist/public/assets/_D478nKDM.js.br +0 -0
  167. package/dist/public/assets/{_CXBw8HMs.js → _D5W5ntHo.js} +1 -1
  168. package/dist/public/assets/_D5W5ntHo.js.br +0 -0
  169. package/dist/public/assets/_D5guyfCP.js +1 -0
  170. package/dist/public/assets/{_3ewKhZLc.js → _D7FiuTy-.js} +1 -1
  171. package/dist/public/assets/_D7FiuTy-.js.br +0 -0
  172. package/dist/public/assets/_DA1hU7GY.js +1 -0
  173. package/dist/public/assets/_DAGUL1Vl.js +6 -0
  174. package/dist/public/assets/_DAGUL1Vl.js.br +0 -0
  175. package/dist/public/assets/{_gkUCl--6.js → _DCaVKBqt.js} +1 -1
  176. package/dist/public/assets/_DCaVKBqt.js.br +0 -0
  177. package/dist/public/assets/_DFRZGT2q.js +1 -0
  178. package/dist/public/assets/_DFRZGT2q.js.br +0 -0
  179. package/dist/public/assets/_DGDoR_gX.js +1 -0
  180. package/dist/public/assets/_DGDoR_gX.js.br +0 -0
  181. package/dist/public/assets/_DJl1sf70.js +1 -0
  182. package/dist/public/assets/_DMGdwfSr.js +1 -0
  183. package/dist/public/assets/_DMGdwfSr.js.br +0 -0
  184. package/dist/public/assets/{_CrONT8um.js → _DMdBg_GK.js} +1 -1
  185. package/dist/public/assets/_DMdBg_GK.js.br +0 -0
  186. package/dist/public/assets/{_DVs9_2EC.js → _DPOlYZjX.js} +1 -1
  187. package/dist/public/assets/_DPOlYZjX.js.br +0 -0
  188. package/dist/public/assets/{_DH7j4yfd.js → _DSCUag9O.js} +1 -1
  189. package/dist/public/assets/_DSCUag9O.js.br +0 -0
  190. package/dist/public/assets/_DUzx5eZR.js +1 -0
  191. package/dist/public/assets/_DUzx5eZR.js.br +0 -0
  192. package/dist/public/assets/{_BDdtj9Cq.js → _DV0W2yTo.js} +1 -1
  193. package/dist/public/assets/_DV0W2yTo.js.br +0 -0
  194. package/dist/public/assets/_DW6rnS22.js +1 -0
  195. package/dist/public/assets/_DW6rnS22.js.br +0 -0
  196. package/dist/public/assets/_DY6s_kAl.js +1 -0
  197. package/dist/public/assets/{_rHKeW7zh.js → _Da0Zcyhl.js} +1 -1
  198. package/dist/public/assets/_Dbyzv-e6.js +1 -0
  199. package/dist/public/assets/_Dbyzv-e6.js.br +0 -0
  200. package/dist/public/assets/{_B66w2fqU.js → _DcFRlTYB.js} +1 -1
  201. package/dist/public/assets/_DcFRlTYB.js.br +0 -0
  202. package/dist/public/assets/_DiThv-ws.js +1 -0
  203. package/dist/public/assets/_Djho-FAH.js +1 -0
  204. package/dist/public/assets/_Djho-FAH.js.br +0 -0
  205. package/dist/public/assets/_DkfyvJLz.js +1 -0
  206. package/dist/public/assets/_DmdewGjf.js +1 -0
  207. package/dist/public/assets/{_DY6PUWO1.js → _DnhVTHg1.js} +1 -1
  208. package/dist/public/assets/_DnhVTHg1.js.br +0 -0
  209. package/dist/public/assets/_Dq4Lv0Cs.js +1 -0
  210. package/dist/public/assets/_Dq4Lv0Cs.js.br +0 -0
  211. package/dist/public/assets/_DqxOu378.js +1 -0
  212. package/dist/public/assets/{_BmZVM8Ww.js → _DrpXP57c.js} +1 -1
  213. package/dist/public/assets/_DrpXP57c.js.br +0 -0
  214. package/dist/public/assets/{_DmGawoV0.js → _DsAV3t8S.js} +1 -1
  215. package/dist/public/assets/_DsAV3t8S.js.br +0 -0
  216. package/dist/public/assets/{_q4Q8wf1-.js → _DvNEiAgs.js} +1 -1
  217. package/dist/public/assets/_DvNEiAgs.js.br +0 -0
  218. package/dist/public/assets/{_e-EoIF14.js → _Dvu8aO9d.js} +1 -1
  219. package/dist/public/assets/_Dvu8aO9d.js.br +0 -0
  220. package/dist/public/assets/_DyUJCQsE.js +1 -0
  221. package/dist/public/assets/_DyUJCQsE.js.br +0 -0
  222. package/dist/public/assets/_DzJPXetd.js +1 -0
  223. package/dist/public/assets/_DzJPXetd.js.br +0 -0
  224. package/dist/public/assets/{_CkwMzG0u.js → _DzOgre70.js} +1 -1
  225. package/dist/public/assets/_DzOgre70.js.br +0 -0
  226. package/dist/public/assets/_FXPfeF9Q.js +1 -0
  227. package/dist/public/assets/{_CKO6VeWe.js → _G6zi9_6i.js} +1 -1
  228. package/dist/public/assets/_G6zi9_6i.js.br +0 -0
  229. package/dist/public/assets/_I2leMoLk.js +1 -0
  230. package/dist/public/assets/_IWsH3JbM.js +1 -0
  231. package/dist/public/assets/{_DhHO6Tuz.js → _Jsehj7rl.js} +1 -1
  232. package/dist/public/assets/_Jsehj7rl.js.br +0 -0
  233. package/dist/public/assets/_NGMwjBBG.js +1 -0
  234. package/dist/public/assets/{_Bwo88m9W.js → _QljbgS5l.js} +1 -1
  235. package/dist/public/assets/_QljbgS5l.js.br +0 -0
  236. package/dist/public/assets/{_CgLkQJNG.js → _Z8l8zhFZ.js} +1 -1
  237. package/dist/public/assets/_Z8l8zhFZ.js.br +0 -0
  238. package/dist/public/assets/__GnUfSxE.js +1 -0
  239. package/dist/public/assets/__GnUfSxE.js.br +0 -0
  240. package/dist/public/assets/_cD7JRpZk.js +1 -0
  241. package/dist/public/assets/_dP2ZLG1O.js +1 -0
  242. package/dist/public/assets/_dP2ZLG1O.js.br +0 -0
  243. package/dist/public/assets/_fQTAXQ2A.js +1 -0
  244. package/dist/public/assets/_fQTAXQ2A.js.br +0 -0
  245. package/dist/public/assets/_gIJHrFck.js +1 -0
  246. package/dist/public/assets/_gIJHrFck.js.br +0 -0
  247. package/dist/public/assets/{_BERyw-_I.js → _iqlUPvpu.js} +1 -1
  248. package/dist/public/assets/_iqlUPvpu.js.br +0 -0
  249. package/dist/public/assets/_m2OvafhN.js +1 -0
  250. package/dist/public/assets/_mNtBBYrx.js +1 -0
  251. package/dist/public/assets/_o4vB6uaf.js +1 -0
  252. package/dist/public/assets/{_DSn_einI.js → _pTRVL6_Z.js} +1 -1
  253. package/dist/public/assets/_pTRVL6_Z.js.br +0 -0
  254. package/dist/public/assets/_sayhcKVq.js +1 -0
  255. package/dist/public/assets/_sdf2KG0s.js +1 -0
  256. package/dist/public/assets/_sdf2KG0s.js.br +0 -0
  257. package/dist/public/assets/_tsg5j2Lv.js +1 -0
  258. package/dist/public/assets/_uTzPJzX0.js +1 -0
  259. package/dist/public/assets/_vIGuFBIb.js +1 -0
  260. package/dist/public/assets/_vIGuFBIb.js.br +0 -0
  261. package/dist/public/assets/_yJE0vu9j.js +1 -0
  262. package/dist/public/assets/_yJE0vu9j.js.br +0 -0
  263. package/dist/public/assets/_z9XIIgTI.js +1 -0
  264. package/dist/public/assets/{app-page-a-M15PMY.css → app-shell-8Pd1rc7u.css} +1 -1
  265. package/dist/public/assets/app-shell-8Pd1rc7u.css.br +0 -0
  266. package/dist/public/assets/command-palette-B4o6jF8Z.css +1 -0
  267. package/dist/public/assets/command-palette-B4o6jF8Z.css.br +0 -0
  268. package/dist/public/assets/files-view-BnN1VOCi.css +1 -0
  269. package/dist/public/assets/files-view-BnN1VOCi.css.br +0 -0
  270. package/dist/public/assets/files-view-cAPnyoQZ.js +2 -0
  271. package/dist/public/assets/group.css.ts-CXNej9ok.css +1 -0
  272. package/dist/public/assets/group.css.ts-CXNej9ok.css.br +0 -0
  273. package/dist/public/assets/{icon-search-CiIAr7NA.css → icon-search-DcAn99Uv.css} +1 -1
  274. package/dist/public/assets/icon-search-DcAn99Uv.css.br +0 -0
  275. package/dist/public/assets/manage-workspace-BMzLgYX3.css +1 -0
  276. package/dist/public/assets/manage-workspace-DhLNff0-.js +2 -0
  277. package/dist/public/assets/new-BqXHbQlu.js +1 -0
  278. package/dist/public/assets/new-workspace-B3ylje_g.css +1 -0
  279. package/dist/public/assets/new-workspace-B3ylje_g.css.br +0 -0
  280. package/dist/public/assets/new-workspace-RR8h-qIh.js +2 -0
  281. package/dist/public/assets/port-chip-Bt0w2MzG.css +1 -0
  282. package/dist/public/assets/port-chip-Bt0w2MzG.css.br +0 -0
  283. package/dist/public/assets/prompt-dialog-B_qzbXMZ.css +1 -0
  284. package/dist/public/assets/prompt-dialog-B_qzbXMZ.css.br +0 -0
  285. package/dist/public/assets/quick-open-CXyrWkbA.css +1 -0
  286. package/dist/public/assets/quick-open-CXyrWkbA.css.br +0 -0
  287. package/dist/public/assets/repo-picker-CpKpWL1n.css +1 -0
  288. package/dist/public/assets/repo-picker-CpKpWL1n.css.br +0 -0
  289. package/dist/public/assets/review-view-CTtdvipj.js +2 -0
  290. package/dist/public/assets/review-view-tq2OyY98.css +1 -0
  291. package/dist/public/assets/review-view-tq2OyY98.css.br +0 -0
  292. package/dist/public/assets/section-D7RUq5Cz.css +1 -0
  293. package/dist/public/assets/section-D7RUq5Cz.css.br +0 -0
  294. package/dist/public/assets/settings-BqXHbQlu.js +1 -0
  295. package/dist/public/assets/settings-page-Btvx32iZ.js +2 -0
  296. package/dist/public/assets/settings-page-Cnmgnr_0.css +1 -0
  297. package/dist/public/assets/settings-page-Cnmgnr_0.css.br +0 -0
  298. package/dist/public/assets/skill-row-CyviHufk.css +1 -0
  299. package/dist/public/assets/sso-auth-BRNOE7tU.css +1 -0
  300. package/dist/public/assets/sso-auth-BRNOE7tU.css.br +0 -0
  301. package/dist/public/assets/w-BqXHbQlu.js +1 -0
  302. package/dist/public/assets/w._-BqXHbQlu.js +1 -0
  303. package/dist/public/assets/w._-Nf-ixmkH.js +1 -0
  304. package/dist/public/assets/w._-cjUl7ond.js +1 -0
  305. package/dist/public/assets/worker-hkE5tvP8.js +164 -0
  306. package/dist/public/assets/worker-hkE5tvP8.js.br +0 -0
  307. package/lib/review/markdown.mjs +23 -11
  308. package/lib/setup/doctor.d.mts +5 -0
  309. package/lib/setup/doctor.mjs +31 -1
  310. package/lib/setup/install.mjs +68 -9
  311. package/lib/setup/listen.d.mts +5 -0
  312. package/lib/setup/listen.mjs +23 -0
  313. package/lib/share/manifest.mjs +8 -3
  314. package/package.json +7 -7
  315. package/scripts/migrate.mjs +169 -89
  316. package/dist/_7W8iLTql.js +0 -2
  317. package/dist/public/assets/_-K2pkpBq.js.br +0 -0
  318. package/dist/public/assets/_-O6dm4G6.js +0 -1
  319. package/dist/public/assets/_-tNsWCRW.js +0 -1
  320. package/dist/public/assets/_3aic_W0y.js +0 -1
  321. package/dist/public/assets/_3ewKhZLc.js.br +0 -0
  322. package/dist/public/assets/_3xHfzmVK.js +0 -1
  323. package/dist/public/assets/_3xHfzmVK.js.br +0 -0
  324. package/dist/public/assets/_772AjyQx.js +0 -1
  325. package/dist/public/assets/_772AjyQx.js.br +0 -0
  326. package/dist/public/assets/_8Q9P2uHp.js.br +0 -0
  327. package/dist/public/assets/_AoYqPW6v.js +0 -1
  328. package/dist/public/assets/_AoYqPW6v.js.br +0 -0
  329. package/dist/public/assets/_B1q5pQla.js +0 -1
  330. package/dist/public/assets/_B1q5pQla.js.br +0 -0
  331. package/dist/public/assets/_B66w2fqU.js.br +0 -0
  332. package/dist/public/assets/_B80CP8fn.js.br +0 -0
  333. package/dist/public/assets/_B9FnTf4h.js +0 -1
  334. package/dist/public/assets/_B9kU6sMh.js.br +0 -0
  335. package/dist/public/assets/_BADK8qnN.js +0 -1
  336. package/dist/public/assets/_BADK8qnN.js.br +0 -0
  337. package/dist/public/assets/_BD2qsrlz.js +0 -1
  338. package/dist/public/assets/_BDdtj9Cq.js.br +0 -0
  339. package/dist/public/assets/_BERyw-_I.js.br +0 -0
  340. package/dist/public/assets/_BH5mQvfn.js +0 -1
  341. package/dist/public/assets/_BK0E9Er2.js +0 -1
  342. package/dist/public/assets/_BK0E9Er2.js.br +0 -0
  343. package/dist/public/assets/_BKkFTJtI.js +0 -1
  344. package/dist/public/assets/_BKkFTJtI.js.br +0 -0
  345. package/dist/public/assets/_BOBHk1-a.js +0 -1
  346. package/dist/public/assets/_BOk1AEgN.js +0 -1
  347. package/dist/public/assets/_BZ3C3l3R.js.br +0 -0
  348. package/dist/public/assets/_BaiQtGR9.js.br +0 -0
  349. package/dist/public/assets/_BdUIic1U.js +0 -1
  350. package/dist/public/assets/_BdUIic1U.js.br +0 -0
  351. package/dist/public/assets/_BeVk3dbG.js.br +0 -0
  352. package/dist/public/assets/_Bedi1JZC.js +0 -1
  353. package/dist/public/assets/_BgCpq5St.js +0 -1
  354. package/dist/public/assets/_BjXiH2oW.js +0 -1
  355. package/dist/public/assets/_BjXiH2oW.js.br +0 -0
  356. package/dist/public/assets/_Bk31AYSk.js +0 -1
  357. package/dist/public/assets/_Bk31AYSk.js.br +0 -0
  358. package/dist/public/assets/_BmZVM8Ww.js.br +0 -0
  359. package/dist/public/assets/_BqgMkZ3f.js +0 -1
  360. package/dist/public/assets/_Brbaz_V-.js.br +0 -0
  361. package/dist/public/assets/_Bs9HVA9T.js +0 -1
  362. package/dist/public/assets/_Bwo88m9W.js.br +0 -0
  363. package/dist/public/assets/_Bx5kmADX.js.br +0 -0
  364. package/dist/public/assets/_BzU-RPev.js +0 -1
  365. package/dist/public/assets/_BzVRtEsz.js +0 -1
  366. package/dist/public/assets/_C0K-WRJD.js.br +0 -0
  367. package/dist/public/assets/_C3M50_zF.js.br +0 -0
  368. package/dist/public/assets/_C5l9z0N5.js +0 -1
  369. package/dist/public/assets/_CArazMIS.js.br +0 -0
  370. package/dist/public/assets/_CBZB5Yxv.js +0 -1
  371. package/dist/public/assets/_CBZB5Yxv.js.br +0 -0
  372. package/dist/public/assets/_CCDOu5-k.js +0 -1
  373. package/dist/public/assets/_CCDOu5-k.js.br +0 -0
  374. package/dist/public/assets/_CCnHpcK_.js +0 -1
  375. package/dist/public/assets/_CDMh_Czk.js +0 -1
  376. package/dist/public/assets/_CE_CwnMm.js +0 -1
  377. package/dist/public/assets/_CG4M2EXP.js +0 -1
  378. package/dist/public/assets/_CHEpaVmI.js +0 -1
  379. package/dist/public/assets/_CHEpaVmI.js.br +0 -0
  380. package/dist/public/assets/_CHxSYsqp.js +0 -1
  381. package/dist/public/assets/_CJMlU8h-.js +0 -1
  382. package/dist/public/assets/_CJoG6S3-.js.br +0 -0
  383. package/dist/public/assets/_CKO6VeWe.js.br +0 -0
  384. package/dist/public/assets/_COzp254y.js +0 -1
  385. package/dist/public/assets/_CPH47jXm.js.br +0 -0
  386. package/dist/public/assets/_CRZGR7so.js.br +0 -0
  387. package/dist/public/assets/_CTPBS0LC.js +0 -1
  388. package/dist/public/assets/_CTPBS0LC.js.br +0 -0
  389. package/dist/public/assets/_CThA4lbu.js +0 -1
  390. package/dist/public/assets/_CThA4lbu.js.br +0 -0
  391. package/dist/public/assets/_CXBw8HMs.js.br +0 -0
  392. package/dist/public/assets/_CXzJ6bil.js +0 -1
  393. package/dist/public/assets/_CYUNskmo.js +0 -1
  394. package/dist/public/assets/_CYUNskmo.js.br +0 -0
  395. package/dist/public/assets/_C_Lr0eFb.js.br +0 -0
  396. package/dist/public/assets/_CbnW4odW.js +0 -1
  397. package/dist/public/assets/_Cfuem2T_.js +0 -1
  398. package/dist/public/assets/_Cg-uvNvy.js +0 -1
  399. package/dist/public/assets/_Cg-uvNvy.js.br +0 -0
  400. package/dist/public/assets/_CgLkQJNG.js.br +0 -0
  401. package/dist/public/assets/_CkwMzG0u.js.br +0 -0
  402. package/dist/public/assets/_Cl7KlO12.js.br +0 -0
  403. package/dist/public/assets/_ClSzF1-k.js +0 -1
  404. package/dist/public/assets/_CljaR6t8.js.br +0 -0
  405. package/dist/public/assets/_CoZYY0F5.js.br +0 -0
  406. package/dist/public/assets/_CpposQLo.js +0 -1
  407. package/dist/public/assets/_CpposQLo.js.br +0 -0
  408. package/dist/public/assets/_CrONT8um.js.br +0 -0
  409. package/dist/public/assets/_Cu1guAvn.js +0 -1
  410. package/dist/public/assets/_CygSeSG1.js +0 -1
  411. package/dist/public/assets/_CygSeSG1.js.br +0 -0
  412. package/dist/public/assets/_Czf21qbL.js +0 -1
  413. package/dist/public/assets/_D-2kyUyG.js +0 -9
  414. package/dist/public/assets/_D-2kyUyG.js.br +0 -0
  415. package/dist/public/assets/_D3Je7YVw.js +0 -1
  416. package/dist/public/assets/_D4xPo0HZ.js +0 -1
  417. package/dist/public/assets/_D605QHvK.js +0 -1
  418. package/dist/public/assets/_D8WMh6gu.js.br +0 -0
  419. package/dist/public/assets/_D8ve50C6.js +0 -1
  420. package/dist/public/assets/_D8ve50C6.js.br +0 -0
  421. package/dist/public/assets/_D9b8PlSh.js +0 -2640
  422. package/dist/public/assets/_D9b8PlSh.js.br +0 -0
  423. package/dist/public/assets/_D9cUlE3a.js +0 -1
  424. package/dist/public/assets/_D9cUlE3a.js.br +0 -0
  425. package/dist/public/assets/_DCg8UEc3.js.br +0 -0
  426. package/dist/public/assets/_DEf8mUHj.js.br +0 -0
  427. package/dist/public/assets/_DFjp3R_E.js.br +0 -0
  428. package/dist/public/assets/_DGLS_XIM.js +0 -1
  429. package/dist/public/assets/_DH7j4yfd.js.br +0 -0
  430. package/dist/public/assets/_DITz3wmu.js.br +0 -0
  431. package/dist/public/assets/_DIbtkkt7.js +0 -1
  432. package/dist/public/assets/_DIhhsT9E.js +0 -1
  433. package/dist/public/assets/_DJ16po4M.js +0 -1
  434. package/dist/public/assets/_DKPOXVYN.js +0 -1
  435. package/dist/public/assets/_DKPOXVYN.js.br +0 -0
  436. package/dist/public/assets/_DMVwpwke.js +0 -1
  437. package/dist/public/assets/_DMVwpwke.js.br +0 -0
  438. package/dist/public/assets/_DMWaKaIG.js +0 -1
  439. package/dist/public/assets/_DOXCLF1P.js +0 -1
  440. package/dist/public/assets/_DQYtsGep.js +0 -1
  441. package/dist/public/assets/_DRNYHvLK.js +0 -86
  442. package/dist/public/assets/_DRNYHvLK.js.br +0 -0
  443. package/dist/public/assets/_DSn_einI.js.br +0 -0
  444. package/dist/public/assets/_DVs9_2EC.js.br +0 -0
  445. package/dist/public/assets/_DY6PUWO1.js.br +0 -0
  446. package/dist/public/assets/_DYq5I1a_.js +0 -1
  447. package/dist/public/assets/_DZaWjeov.js +0 -1
  448. package/dist/public/assets/_DZaWjeov.js.br +0 -0
  449. package/dist/public/assets/_D_zYO-l8.js +0 -1
  450. package/dist/public/assets/_D_zYO-l8.js.br +0 -0
  451. package/dist/public/assets/_Db15f2uj.js +0 -1
  452. package/dist/public/assets/_DcyKrmeq.js +0 -1
  453. package/dist/public/assets/_DdfXpdn_.js +0 -1
  454. package/dist/public/assets/_DdfXpdn_.js.br +0 -0
  455. package/dist/public/assets/_DevPwgsp.js +0 -1
  456. package/dist/public/assets/_DgwVeEsD.js +0 -6
  457. package/dist/public/assets/_DgwVeEsD.js.br +0 -0
  458. package/dist/public/assets/_DhHO6Tuz.js.br +0 -0
  459. package/dist/public/assets/_DkSuDAhs.js +0 -1
  460. package/dist/public/assets/_DmGawoV0.js.br +0 -0
  461. package/dist/public/assets/_DnlCrUDV.js +0 -2
  462. package/dist/public/assets/_DnlCrUDV.js.br +0 -0
  463. package/dist/public/assets/_Do95KzEK.js.br +0 -0
  464. package/dist/public/assets/_Dob_Fmbm.js +0 -1
  465. package/dist/public/assets/_Dq-Jad5X.js.br +0 -0
  466. package/dist/public/assets/_DqAamLSj.js.br +0 -0
  467. package/dist/public/assets/_DsT0GWgJ.js +0 -1
  468. package/dist/public/assets/_Ds_ya4mr.js +0 -1
  469. package/dist/public/assets/_Dsv1qAjm.js +0 -1
  470. package/dist/public/assets/_Dsv1qAjm.js.br +0 -0
  471. package/dist/public/assets/_DuR6ueoD.js +0 -1
  472. package/dist/public/assets/_Dy4QBSz2.js +0 -1
  473. package/dist/public/assets/_GHV_3jJp.js +0 -1
  474. package/dist/public/assets/_GN2ORfhz.js +0 -1
  475. package/dist/public/assets/_GnLkrWZM.js.br +0 -0
  476. package/dist/public/assets/_IsgXwMDs.js +0 -1
  477. package/dist/public/assets/_ItxI9nk3.js +0 -1
  478. package/dist/public/assets/_ItxI9nk3.js.br +0 -0
  479. package/dist/public/assets/_IzVuLVN1.js +0 -1
  480. package/dist/public/assets/_JekmkJTS.js +0 -1
  481. package/dist/public/assets/_JekmkJTS.js.br +0 -0
  482. package/dist/public/assets/_KiUN85cI.js +0 -1
  483. package/dist/public/assets/_NeT1bfJI.js +0 -1
  484. package/dist/public/assets/_QWPZ0V06.js +0 -1
  485. package/dist/public/assets/_Qs4Lwkwv.js +0 -1
  486. package/dist/public/assets/_Qs4Lwkwv.js.br +0 -0
  487. package/dist/public/assets/_RNDgNS1c.js +0 -1
  488. package/dist/public/assets/_RVKQdbGj.js +0 -1
  489. package/dist/public/assets/_RwgpF7LC.js +0 -1
  490. package/dist/public/assets/_RwgpF7LC.js.br +0 -0
  491. package/dist/public/assets/_S99TppFt.js.br +0 -0
  492. package/dist/public/assets/_S_seG_by.js +0 -1
  493. package/dist/public/assets/_TcqYUNNo.js.br +0 -0
  494. package/dist/public/assets/_WkU7AijT.js +0 -1
  495. package/dist/public/assets/__bV-79mJ.js +0 -1
  496. package/dist/public/assets/_e-EoIF14.js.br +0 -0
  497. package/dist/public/assets/_eutX35zw.js +0 -1
  498. package/dist/public/assets/_eutX35zw.js.br +0 -0
  499. package/dist/public/assets/_gkUCl--6.js.br +0 -0
  500. package/dist/public/assets/_kmXANkGr.js +0 -1
  501. package/dist/public/assets/_kmXANkGr.js.br +0 -0
  502. package/dist/public/assets/_kqic6B_q.js +0 -1
  503. package/dist/public/assets/_kqic6B_q.js.br +0 -0
  504. package/dist/public/assets/_oXuFhEmo.js +0 -1
  505. package/dist/public/assets/_q4Q8wf1-.js.br +0 -0
  506. package/dist/public/assets/_ryYtmLmM.js +0 -1
  507. package/dist/public/assets/_tHa-ZHkQ.js +0 -1
  508. package/dist/public/assets/_vunrMsGK.js.br +0 -0
  509. package/dist/public/assets/_wjT9tLjb.js +0 -1
  510. package/dist/public/assets/_wjT9tLjb.js.br +0 -0
  511. package/dist/public/assets/_xw7rRdJa.js +0 -1
  512. package/dist/public/assets/_y1uwlPvR.js +0 -1
  513. package/dist/public/assets/_z3bkSqoV.js +0 -1
  514. package/dist/public/assets/_z3bkSqoV.js.br +0 -0
  515. package/dist/public/assets/app-page-a-M15PMY.css.br +0 -0
  516. package/dist/public/assets/command-palette-DnTWF_r2.css +0 -1
  517. package/dist/public/assets/command-palette-DnTWF_r2.css.br +0 -0
  518. package/dist/public/assets/files-view-C_Ak1o_u.css +0 -1
  519. package/dist/public/assets/files-view-C_Ak1o_u.css.br +0 -0
  520. package/dist/public/assets/files-view-D29gwNTU.js +0 -2
  521. package/dist/public/assets/group.css.ts-bSDNRl7w.css +0 -1
  522. package/dist/public/assets/group.css.ts-bSDNRl7w.css.br +0 -0
  523. package/dist/public/assets/icon-search-CiIAr7NA.css.br +0 -0
  524. package/dist/public/assets/key-bar.css.ts-Bku3uER9.css +0 -1
  525. package/dist/public/assets/key-bar.css.ts-Bku3uER9.css.br +0 -0
  526. package/dist/public/assets/manage-workspace-FNt9673q.css +0 -1
  527. package/dist/public/assets/manage-workspace-LPUu3-Rp.js +0 -2
  528. package/dist/public/assets/new-pJJ6ZABY.js +0 -1
  529. package/dist/public/assets/new-workspace-Bj3jwBnp.css +0 -1
  530. package/dist/public/assets/new-workspace-Bj3jwBnp.css.br +0 -0
  531. package/dist/public/assets/new-workspace-Cukm9rzJ.js +0 -2
  532. package/dist/public/assets/port-chip-B2VAUY_i.css +0 -1
  533. package/dist/public/assets/port-chip-B2VAUY_i.css.br +0 -0
  534. package/dist/public/assets/prompt-dialog-CtmcwmFw.css +0 -1
  535. package/dist/public/assets/prompt-dialog-CtmcwmFw.css.br +0 -0
  536. package/dist/public/assets/quick-open-CuR4WzpL.css +0 -1
  537. package/dist/public/assets/quick-open-CuR4WzpL.css.br +0 -0
  538. package/dist/public/assets/repo-picker-DFTPYkNQ.css +0 -1
  539. package/dist/public/assets/repo-picker-DFTPYkNQ.css.br +0 -2
  540. package/dist/public/assets/review-view-B6bsrcls.css +0 -1
  541. package/dist/public/assets/review-view-B6bsrcls.css.br +0 -0
  542. package/dist/public/assets/review-view-BNyQ646Y.js +0 -2
  543. package/dist/public/assets/section-aiv_79hg.css +0 -1
  544. package/dist/public/assets/section-aiv_79hg.css.br +0 -0
  545. package/dist/public/assets/settings-pJJ6ZABY.js +0 -1
  546. package/dist/public/assets/settings-page-DAwtsEQ9.css +0 -1
  547. package/dist/public/assets/settings-page-DAwtsEQ9.css.br +0 -0
  548. package/dist/public/assets/settings-page-DsbRNeSq.js +0 -2
  549. package/dist/public/assets/skill-row-bJ0ycL8_.css +0 -1
  550. package/dist/public/assets/sso-auth-JILClN0h.css +0 -1
  551. package/dist/public/assets/sso-auth-JILClN0h.css.br +0 -0
  552. package/dist/public/assets/w-pJJ6ZABY.js +0 -1
  553. package/dist/public/assets/w._-C4FeaeOO.js +0 -1
  554. package/dist/public/assets/w._-DChqn_ll.js +0 -1
  555. package/dist/public/assets/w._-pJJ6ZABY.js +0 -1
  556. package/dist/public/assets/worker-BK3lyuKh.js +0 -164
  557. package/dist/public/assets/worker-BK3lyuKh.js.br +0 -0
@@ -3,11 +3,44 @@ import { r as require_inherits, t as require_src$1 } from "./_xlrdOUsL.js";
3
3
  import { t as require_safe_buffer } from "./_BmSjjJ2E.js";
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
- import os from "node:os";
7
6
  import { execFile, execFileSync } from "node:child_process";
7
+ import os from "node:os";
8
8
  import { promisify } from "node:util";
9
9
  import { DatabaseSync } from "node:sqlite";
10
10
  import { createHash } from "node:crypto";
11
+ //#region src/server/http.ts
12
+ /** Error whose `status` the API error-boundary middleware uses for the response. */
13
+ function httpError(status, message) {
14
+ return Object.assign(new Error(message), { status });
15
+ }
16
+ /** The value of a Standard Schema `[value, issues]` pair, or a thrown 400
17
+ * built from the issues. */
18
+ function checked(result, what = "request") {
19
+ const [value, issues] = result;
20
+ if (issues) throw httpError(400, `invalid ${what}: ${issues.map((issue) => issue.message).join("; ")}`);
21
+ return value;
22
+ }
23
+ /** Validated request body, or a thrown 400 built from the valibot issues. */
24
+ async function readBody(ctx) {
25
+ return checked(await ctx.body, "request body");
26
+ }
27
+ //#endregion
28
+ //#region lib/setup/listen.mjs
29
+ /** Addresses that mean every interface. */
30
+ var EVERY = /* @__PURE__ */ new Set([
31
+ "0.0.0.0",
32
+ "::",
33
+ "*"
34
+ ]);
35
+ /** The host to dial the server at, for WORK_LISTEN: loopback when it
36
+ * listens on every interface or is unset, else the one address it listens
37
+ * on (a server bound to `::1` or a LAN address refuses 127.0.0.1), bracketed
38
+ * when IPv6 so it can go in a URL. */
39
+ function dialHost(listen) {
40
+ if (!listen || EVERY.has(listen)) return "127.0.0.1";
41
+ return listen.includes(":") ? `[${listen}]` : listen;
42
+ }
43
+ //#endregion
11
44
  //#region src/server/config.ts
12
45
  var rawHome = os.homedir();
13
46
  var home$1 = rawHome && rawHome !== "undefined" && rawHome !== "null" ? rawHome : "";
@@ -42,6 +75,12 @@ var config = {
42
75
  * from elsewhere is an auth wrapper's job (server/access.ts). Under
43
76
  * systemd the socket unit binds, and `work setup` writes this into it. */
44
77
  listen: process.env.WORK_LISTEN || "127.0.0.1",
78
+ /** The host this machine dials the server at, for what calls back into
79
+ * it (agent hooks, the push hook): loopback unless it listens on one
80
+ * address only. */
81
+ get dialHost() {
82
+ return dialHost(this.listen);
83
+ },
45
84
  /** The auth wrapper's addresses when it runs on another machine (IPs or
46
85
  * CIDRs, or `*`): the only peers besides this machine work answers. */
47
86
  trustedProxies: list(process.env.WORK_TRUSTED_PROXIES),
@@ -72,7 +111,10 @@ async function run$1(cmd, args, cwd, env, opts = {}) {
72
111
  killSignal: "SIGKILL"
73
112
  }
74
113
  });
75
- if (opts.stdin !== void 0) child.child.stdin?.end(opts.stdin);
114
+ if (opts.stdin !== void 0) {
115
+ child.child.stdin?.on("error", () => {});
116
+ child.child.stdin?.end(opts.stdin);
117
+ }
76
118
  const { stdout } = await child;
77
119
  return stdout.trim();
78
120
  }
@@ -90,25 +132,46 @@ var GIT_NETWORK_MS = {
90
132
  "ls-remote": 6e4
91
133
  };
92
134
  /** Never let git wait on a terminal it doesn't have — a missing credential
93
- * fails with a message instead of hanging the clone forever. */
135
+ * fails with a message instead of hanging the clone forever. Optional
136
+ * locks are off because most of what runs here is a background probe (the
137
+ * review's stamp poll, Files, the language servers' change feed): a
138
+ * `git status` refreshing the index holds `index.lock`, and an agent's
139
+ * `git commit` or rebase step landing in that moment fails on it. */
94
140
  var git = async (args, cwd) => {
95
141
  const verb = args.find((a) => !a.startsWith("-")) ?? "";
96
142
  const timeoutMs = GIT_NETWORK_MS[verb];
97
143
  try {
98
144
  return await run$1("git", args, cwd, {
99
145
  ...process.env,
100
- GIT_TERMINAL_PROMPT: "0"
146
+ GIT_TERMINAL_PROMPT: "0",
147
+ GIT_OPTIONAL_LOCKS: "0"
101
148
  }, timeoutMs ? { timeoutMs } : void 0);
102
149
  } catch (err) {
103
150
  if (timeoutMs && err.killed) throw new Error(`git ${verb} timed out after ${Math.round(timeoutMs / 1e3)}s`);
104
151
  throw err;
105
152
  }
106
153
  };
154
+ /** Ceilings for `gh`, for the reason git's network verbs have them: a
155
+ * stalled call never settles, and the cached loaders behind it (the repo
156
+ * catalog, repo metadata) hand that one promise to every later caller.
157
+ * `repo list` pages through up to 500 repos; everything else is one API
158
+ * call. */
159
+ var GH_MS = { repo: 18e4 };
160
+ var GH_DEFAULT_MS = 6e4;
107
161
  /** `gh` against one GitHub host — `GH_HOST` picks the stored credential. */
108
- var gh = (args, host) => run$1("gh", args, void 0, host ? {
109
- ...process.env,
110
- GH_HOST: host
111
- } : void 0);
162
+ var gh = async (args, host) => {
163
+ const verb = args[0] ?? "";
164
+ const timeoutMs = GH_MS[verb] ?? GH_DEFAULT_MS;
165
+ try {
166
+ return await run$1("gh", args, void 0, host ? {
167
+ ...process.env,
168
+ GH_HOST: host
169
+ } : void 0, { timeoutMs });
170
+ } catch (err) {
171
+ if (err.killed) throw new Error(`gh ${verb} timed out after ${Math.round(timeoutMs / 1e3)}s`);
172
+ throw err;
173
+ }
174
+ };
112
175
  var tmux = (args, env, opts) => run$1("tmux", [
113
176
  "-L",
114
177
  TMUX_SOCKET,
@@ -166,6 +229,7 @@ function get(sql, ...params) {
166
229
  function workspacePath(id) {
167
230
  return get("SELECT path FROM workspaces WHERE id = ?", id)?.path;
168
231
  }
232
+ var freshReview = !db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'review_comments'").get();
169
233
  db.exec(`
170
234
  PRAGMA journal_mode = WAL;
171
235
  PRAGMA foreign_keys = ON;
@@ -231,6 +295,7 @@ db.exec(`
231
295
  PRIMARY KEY (workspace_id, key)
232
296
  );
233
297
  `);
298
+ if (freshReview) db.prepare("INSERT OR IGNORE INTO settings (key, value) VALUES ('review-cleared-diff-v2', '1')").run();
234
299
  /** Additive schema changes: `CREATE TABLE IF NOT EXISTS` never revisits a
235
300
  * table that already exists, so a column added after a release has to be
236
301
  * bolted on here for databases created before it. */
@@ -243,6 +308,83 @@ ensureColumn("workspaces", "materialized", "INTEGER NOT NULL DEFAULT 1");
243
308
  ensureColumn("workspaces", "origin_branch", "TEXT");
244
309
  ensureColumn("workspaces", "imported_at", "TEXT");
245
310
  //#endregion
311
+ //#region src/client/pref-change.ts
312
+ /** The stored text after `change`, or null when nothing is left. A value
313
+ * of another shape (unreadable, or another build's) counts as empty, as
314
+ * client/prefs' readers treat it. */
315
+ function applyPrefChange(raw, change) {
316
+ let value;
317
+ try {
318
+ value = raw == null ? void 0 : JSON.parse(raw);
319
+ } catch {}
320
+ const kept = compact(change.op === "set" ? within(value, change.at, () => change.value ?? void 0) : within(value, change.at ?? [], (list) => listChange(asList(list), change)));
321
+ return kept === void 0 ? null : JSON.stringify(kept);
322
+ }
323
+ function listChange(list, change) {
324
+ const { item } = change;
325
+ const other = (x) => !same(x, item);
326
+ if (change.op === "remove") return list.filter(other);
327
+ if (change.op === "push") return [item, ...list.filter(other)].slice(0, change.cap);
328
+ const at = change.over === void 0 ? -1 : list.findIndex((x) => same(x, change.over));
329
+ if (at >= 0) return list.map((x, i) => i === at ? item : x).filter((x, i) => i === at || other(x));
330
+ if (!list.every(other)) return list;
331
+ return change.cap != null && list.length >= change.cap ? list : [...list, item];
332
+ }
333
+ /** `node` with `fn` applied at `path`, copied along the way. Undefined
334
+ * from `fn` drops an object field, or clears a list slot. Objects have no
335
+ * prototype, so a field named `__proto__` is only a field. */
336
+ function within(node, path, fn) {
337
+ if (!path.length) return fn(node);
338
+ const [step, ...rest] = path;
339
+ if (typeof step === "number") {
340
+ const list = asList(node).slice();
341
+ while (list.length < step) list.push(null);
342
+ list[step] = within(list[step], rest, fn) ?? null;
343
+ return list;
344
+ }
345
+ const obj = asObj(node);
346
+ const v = within(obj[step], rest, fn);
347
+ if (v === void 0) delete obj[step];
348
+ else obj[step] = v;
349
+ return obj;
350
+ }
351
+ function asList(node) {
352
+ return Array.isArray(node) ? node : [];
353
+ }
354
+ function asObj(node) {
355
+ const obj = Object.create(null);
356
+ if (node && typeof node === "object" && !Array.isArray(node)) Object.assign(obj, node);
357
+ return obj;
358
+ }
359
+ /** Null, `[]` and `{}` read as nothing, so none is stored: a list's
360
+ * trailing empty slots go, and a value left empty removes the row. */
361
+ function compact(v) {
362
+ if (Array.isArray(v)) {
363
+ const list = v.map((x) => compact(x) ?? null);
364
+ while (list.length && list[list.length - 1] === null) list.pop();
365
+ return list.length ? list : void 0;
366
+ }
367
+ if (v && typeof v === "object") {
368
+ const obj = Object.create(null);
369
+ for (const [k, x] of Object.entries(v)) {
370
+ const c = compact(x);
371
+ if (c !== void 0) obj[k] = c;
372
+ }
373
+ return Object.keys(obj).length ? obj : void 0;
374
+ }
375
+ return v ?? void 0;
376
+ }
377
+ /** Equal as JSON: a field holding undefined is no field (a page's own
378
+ * copy has those; what the server parsed never does). */
379
+ function same(a, b) {
380
+ if (a === b) return true;
381
+ if (!a || !b || typeof a !== "object" || typeof b !== "object") return false;
382
+ if (Array.isArray(a) !== Array.isArray(b)) return false;
383
+ const keys = (o) => Object.keys(o).filter((k) => o[k] !== void 0);
384
+ const ka = keys(a);
385
+ return ka.length === keys(b).length && ka.every((k) => same(a[k], b[k]));
386
+ }
387
+ //#endregion
246
388
  //#region lib/setup/agents.json
247
389
  var agents_default = [
248
390
  {
@@ -700,6 +842,22 @@ async function githubHostStatus(host) {
700
842
  error: /not logged in/i.test(text) ? void 0 : text.trim().split("\n").pop()
701
843
  };
702
844
  }
845
+ /** Whether the server can keep this Linux host awake (src/server/awake.ts
846
+ * holds the lock itself). Its last resort, an `idle` lock, is one polkit
847
+ * grants anyone, so failing that means nothing holds the host while work
848
+ * runs, and a suspend looks like the network dropping. Null off Linux, where
849
+ * caffeinate asks no one. */
850
+ async function canStayAwake() {
851
+ if (process.platform !== "linux") return null;
852
+ const { ok } = await run("systemd-inhibit", [
853
+ "--what=idle",
854
+ "--mode=block",
855
+ "--who=work",
856
+ "--why=work doctor probe",
857
+ "true"
858
+ ], { timeout: 5e3 });
859
+ return ok;
860
+ }
703
861
  /**
704
862
  * Full readiness snapshot.
705
863
  *
@@ -712,7 +870,11 @@ async function doctor(opts = {}) {
712
870
  ...opts.hosts || [],
713
871
  ...ghKnownHosts()
714
872
  ]);
715
- const [versions, github] = await Promise.all([miseVersions(), Promise.all([...hostSet].map(githubHostStatus))]);
873
+ const [versions, github, awake] = await Promise.all([
874
+ miseVersions(),
875
+ Promise.all([...hostSet].map(githubHostStatus)),
876
+ canStayAwake()
877
+ ]);
716
878
  const tools = TOOLS.map((t) => {
717
879
  const found = which(t.bin);
718
880
  return {
@@ -740,7 +902,8 @@ async function doctor(opts = {}) {
740
902
  },
741
903
  tools,
742
904
  agents,
743
- github
905
+ github,
906
+ awake
744
907
  };
745
908
  }
746
909
  //#endregion
@@ -758,10 +921,44 @@ function allPrefs() {
758
921
  const rows = db.prepare("SELECT key, value FROM settings WHERE key LIKE 'ui.%'").all();
759
922
  return Object.fromEntries(rows.map((r) => [r.key.slice(3), r.value]));
760
923
  }
924
+ /** The most a pref may hold: every one rides each page's HTML. */
925
+ var PREF_MAX = 4096;
926
+ /** The prefs kept per workspace, keyed `<name>:<workspace id>`. They ride
927
+ * every page's HTML, so they go with the workspace (`deleteWorkspacePrefs`)
928
+ * and /api/prefs refuses them for one that is gone; one missing here
929
+ * outlives its workspace for good. `scripts/migrate.mjs` prunes orphans of
930
+ * the same list. */
931
+ var WORKSPACE_PREFS = [
932
+ "tab",
933
+ "diff-filter",
934
+ "diff-folded",
935
+ "diff-focus",
936
+ "diff-pos",
937
+ "files-recent"
938
+ ];
939
+ function deleteWorkspacePrefs(id) {
940
+ const keys = WORKSPACE_PREFS.map((name) => `ui.${name}:${id}`);
941
+ db.prepare(`DELETE FROM settings WHERE key IN (${keys.map(() => "?").join(", ")})`).run(...keys);
942
+ }
761
943
  function setPref(key, value) {
762
944
  if (value === null) db.prepare("DELETE FROM settings WHERE key = ?").run(`ui.${key}`);
763
945
  else setSetting(`ui.${key}`, value);
764
946
  }
947
+ /** Apply one change to a list or object pref as it is stored now — not
948
+ * as the page that sent it last read it — and return the result. */
949
+ function changePref(key, change) {
950
+ db.exec("BEGIN IMMEDIATE");
951
+ try {
952
+ const next = applyPrefChange(getSetting(`ui.${key}`) ?? null, change);
953
+ if (next !== null && next.length > 4096) throw httpError(413, `pref ${key} would be over ${PREF_MAX} characters`);
954
+ setPref(key, next);
955
+ db.exec("COMMIT");
956
+ return next;
957
+ } catch (err) {
958
+ db.exec("ROLLBACK");
959
+ throw err;
960
+ }
961
+ }
765
962
  /** Instance ids the user switched off in Settings (still installed). */
766
963
  function disabledAgents() {
767
964
  try {
@@ -6867,6 +7064,7 @@ function agentFromCommand(command) {
6867
7064
  }
6868
7065
  //#endregion
6869
7066
  //#region src/server/agent-state.ts
7067
+ /** What the turn is doing, as its hooks said. */
6870
7068
  var phases = /* @__PURE__ */ new Map();
6871
7069
  var scraped = /* @__PURE__ */ new Map();
6872
7070
  var reasons = /* @__PURE__ */ new Map();
@@ -6878,6 +7076,12 @@ var pendingDone = /* @__PURE__ */ new Map();
6878
7076
  * a session whose hooks never report (not loaded, not trusted, turned
6879
7077
  * off) is left to the pane scraper rather than to silence. */
6880
7078
  var reportedAt = /* @__PURE__ */ new Map();
7079
+ /** Work each session runs apart from its turn and wakes up for as it
7080
+ * ends (Claude's background subagents and workflows), by id; only
7081
+ * sessions with some. A turn that ends while any runs has handed off, not
7082
+ * finished: the session is working until a turn ends with none left, and
7083
+ * that end is the one pushed. */
7084
+ var background = /* @__PURE__ */ new Map();
6881
7085
  /** A turn's end is pushed once it has stayed ended this long. Stop fires
6882
7086
  * again each time something sends the agent back to work (a stop hook
6883
7087
  * that continues it, a goal loop, background subagents reporting in), and
@@ -6899,7 +7103,7 @@ function setAgentPhase(sessionId, phase, reason, summary) {
6899
7103
  const failed = phases.get(sessionId) === "waiting" && reasons.get(sessionId) === "attention";
6900
7104
  if (summary) summaries.set(sessionId, summary);
6901
7105
  if (phases.has(sessionId)) applyChange(sessionId, () => dropHook(sessionId));
6902
- if (!failed) pendingDone.set(sessionId, setTimeout(() => {
7106
+ if (!failed && !background.has(sessionId)) pendingDone.set(sessionId, setTimeout(() => {
6903
7107
  pendingDone.delete(sessionId);
6904
7108
  notify(sessionId, "done");
6905
7109
  }, DONE_SETTLE_MS));
@@ -6921,15 +7125,31 @@ function dropHook(sessionId) {
6921
7125
  phases.delete(sessionId);
6922
7126
  reasons.delete(sessionId);
6923
7127
  }
7128
+ /** A hook's word on the session's background work: the CLI's own list of
7129
+ * what runs, or one piece starting or ending. It says nothing of the turn,
7130
+ * whose phase is left as it was (a subagent starting beside a question on
7131
+ * screen leaves the question). */
7132
+ function noteBackground(sessionId, work) {
7133
+ reportedAt.set(sessionId, Date.now());
7134
+ const ids = new Set(work.running ?? background.get(sessionId));
7135
+ if (work.started) ids.add(work.started);
7136
+ if (work.stopped) ids.delete(work.stopped);
7137
+ if (ids.size) cancelDone(sessionId);
7138
+ applyChange(sessionId, () => {
7139
+ if (ids.size) background.set(sessionId, ids);
7140
+ else background.delete(sessionId);
7141
+ });
7142
+ }
6924
7143
  function cancelDone(sessionId) {
6925
7144
  const timer = pendingDone.get(sessionId);
6926
7145
  if (!timer) return;
6927
7146
  clearTimeout(timer);
6928
7147
  pendingDone.delete(sessionId);
6929
7148
  }
6930
- /** What the session's hooks last said, apart from the scraper. */
7149
+ /** What the session's hooks last said, apart from the scraper: the
7150
+ * turn's phase, else working while its background work runs. */
6931
7151
  function hookPhase(sessionId) {
6932
- return phases.get(sessionId);
7152
+ return phases.get(sessionId) ?? (background.has(sessionId) ? "working" : void 0);
6933
7153
  }
6934
7154
  /** When the session's hooks last reported (undefined: never, this run). */
6935
7155
  function hookReportedAt(sessionId) {
@@ -6937,10 +7157,16 @@ function hookReportedAt(sessionId) {
6937
7157
  }
6938
7158
  /** A hook's "working" whose pane has gone still: the turn ended without
6939
7159
  * a hook saying so (an interrupt, a failure the CLI reports no hook for),
6940
- * since every agent's screen animates while it works. Idle, no push. */
7160
+ * or its background work did (an end whose hook was lost, a turn it should
7161
+ * have woken that never came), since every agent's screen animates while
7162
+ * it works — Claude's ticks a line for background work every second.
7163
+ * Idle, no push. */
6941
7164
  function settleQuietWorking(sessionId) {
6942
- if (phases.get(sessionId) !== "working") return;
6943
- applyChange(sessionId, () => dropHook(sessionId));
7165
+ if (hookPhase(sessionId) !== "working") return;
7166
+ applyChange(sessionId, () => {
7167
+ dropHook(sessionId);
7168
+ background.delete(sessionId);
7169
+ });
6944
7170
  }
6945
7171
  /** The user answered at the terminal while the session was stopped on
6946
7172
  * them (approved, denied, picked, interrupted): no longer waiting on
@@ -7003,17 +7229,18 @@ function clearAgentPhase(sessionId) {
7003
7229
  cancelDone(sessionId);
7004
7230
  summaries.delete(sessionId);
7005
7231
  reportedAt.delete(sessionId);
7006
- if (!phases.has(sessionId) && !scraped.has(sessionId)) return;
7232
+ if (!phases.has(sessionId) && !scraped.has(sessionId) && !background.has(sessionId)) return;
7007
7233
  applyChange(sessionId, () => {
7008
7234
  phases.delete(sessionId);
7009
7235
  scraped.delete(sessionId);
7010
7236
  reasons.delete(sessionId);
7237
+ background.delete(sessionId);
7011
7238
  });
7012
7239
  }
7013
7240
  /** What a session is doing. The hook wins where there is one: it reports
7014
7241
  * the turn itself, where tmux only sees the pane still moving after it. */
7015
7242
  function agentPhase(sessionId) {
7016
- return phases.get(sessionId) ?? scraped.get(sessionId);
7243
+ return hookPhase(sessionId) ?? scraped.get(sessionId);
7017
7244
  }
7018
7245
  /** Apply a mutation and broadcast when it moved the session's phase (or,
7019
7246
  * `force`, its reason: finished and blocked draw differently). Only a
@@ -7031,7 +7258,7 @@ function publishChange(sessionId) {
7031
7258
  const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
7032
7259
  if (row?.workspace_id) {
7033
7260
  const workspaceId = row.workspace_id;
7034
- import("./_7W8iLTql.js").then((m) => m.notifySessionsChanged(workspaceId));
7261
+ import("./_CWyeRc54.js").then((m) => m.notifySessionsChanged(workspaceId));
7035
7262
  return;
7036
7263
  }
7037
7264
  publish("sessions.changed");
@@ -7046,7 +7273,7 @@ function publishChange(sessionId) {
7046
7273
  * does not report as that session's agent. */
7047
7274
  function stateCurl(family, state, reason) {
7048
7275
  const qs = `session=$WORK_SESSION_ID&agent=${family}&state=${state}` + (reason ? `&reason=${reason}` : "");
7049
- return `[ -n "$WORK_SESSION_ID" ] && curl -sf --connect-timeout 1 -m 2 -X POST "http://127.0.0.1:\${WORK_APP_PORT:-${config.appPort}}/api/agent-state?${qs}" -H 'content-type: application/json' --data-binary @- >/dev/null 2>&1; exit 0`;
7276
+ return `[ -n "$WORK_SESSION_ID" ] && curl -sf --connect-timeout 1 -m 2 -X POST "http://${config.dialHost}:\${WORK_APP_PORT:-${config.appPort}}/api/agent-state?${qs}" -H 'content-type: application/json' --data-binary @- >/dev/null 2>&1; exit 0`;
7050
7277
  }
7051
7278
  /** Claude-format hook groups (`{matcher?, hooks:[{type:"command",command}]}`)
7052
7279
  * for a hook map — the JSON shape Claude, Copilot plugins and Grok all read. */
@@ -7351,29 +7578,40 @@ function numberedDirs() {
7351
7578
  }
7352
7579
  }
7353
7580
  /** OAuth credentials: `.credentials.json` in the config dir on Linux; on
7354
- * macOS Claude Code keeps them in the login keychain instead (service
7355
- * "Claude Code-credentials"), which `security` reads back as the same JSON.
7356
- * The keychain read is cached per process tick of the usage refresh — it
7357
- * forks a process — and only tried for the primary account. Read once per
7358
- * account per refresh: a row asks for them half a dozen times, and every
7359
- * refresh lists the accounts afresh. */
7581
+ * macOS Claude Code keeps them in the login keychain instead, which
7582
+ * `security` reads back as the same JSON. The keychain read is cached for
7583
+ * 30 s per account — it forks a process. Read once per account per
7584
+ * refresh: a row asks for them half a dozen times, and every refresh lists
7585
+ * the accounts afresh. */
7360
7586
  var credentialsRead = /* @__PURE__ */ new WeakMap();
7361
7587
  var credentials = (account) => {
7362
7588
  if (credentialsRead.has(account)) return credentialsRead.get(account);
7363
7589
  let cred = readJson(path.join(account.dir, ".credentials.json"));
7364
- if (!cred && process.platform === "darwin" && !account.suffix) cred = keychainCredentials();
7590
+ if (!cred && process.platform === "darwin") cred = keychainCredentials(keychainService(account));
7365
7591
  credentialsRead.set(account, cred);
7366
7592
  return cred;
7367
7593
  };
7368
- var keychain = null;
7369
- function keychainCredentials() {
7370
- if (keychain && Date.now() - keychain.at < 3e4) return keychain.value;
7594
+ /** The keychain item Claude Code keeps an account under: "Claude
7595
+ * Code-credentials" for the stock install, and for one run with
7596
+ * `CLAUDE_CONFIG_DIR` that name plus the first 8 hex digits of the
7597
+ * SHA-256 of the dir as the variable gives it (NFC). A numbered account's
7598
+ * dir is `$HOME/.claude-<n>`, which is what `CLAUDE_CONFIG_DIR` holds. */
7599
+ function keychainService(account) {
7600
+ const base = "Claude Code-credentials";
7601
+ if (!account.suffix) return base;
7602
+ const dir = account.dir.normalize("NFC");
7603
+ return `${base}-${createHash("sha256").update(dir).digest("hex").slice(0, 8)}`;
7604
+ }
7605
+ var keychain = /* @__PURE__ */ new Map();
7606
+ function keychainCredentials(service) {
7607
+ const cached = keychain.get(service);
7608
+ if (cached && Date.now() - cached.at < 3e4) return cached.value;
7371
7609
  let value = null;
7372
7610
  try {
7373
7611
  const raw = execFileSync("security", [
7374
7612
  "find-generic-password",
7375
7613
  "-s",
7376
- "Claude Code-credentials",
7614
+ service,
7377
7615
  "-w"
7378
7616
  ], {
7379
7617
  encoding: "utf8",
@@ -7387,10 +7625,10 @@ function keychainCredentials() {
7387
7625
  const parsed = JSON.parse(raw.trim());
7388
7626
  value = parsed && typeof parsed === "object" ? parsed : null;
7389
7627
  } catch {}
7390
- keychain = {
7628
+ keychain.set(service, {
7391
7629
  at: Date.now(),
7392
7630
  value
7393
- };
7631
+ });
7394
7632
  return value;
7395
7633
  }
7396
7634
  /** Why an account has no live data — an expired token is the common case
@@ -7567,14 +7805,33 @@ var FAILURES = {
7567
7805
  max_output_tokens: "Hit the output limit",
7568
7806
  cloud_credential_error: "Cloud credentials failed"
7569
7807
  };
7570
- /** Claude's dialect: subagents' tool calls left out, the question tool's
7571
- * prompt, the command awaiting approval and a failed turn's error as the
7572
- * summary, and a Stop that hands off to background subagents not counted
7573
- * as the turn's end. */
7808
+ /** Claude's dialect: subagents' tool calls left out, their starts and
7809
+ * stops and a Stop's list of what still runs read as background work (a
7810
+ * Stop with some running has handed off, not finished: agent-state), the
7811
+ * question tool's prompt, the command awaiting approval and a failed
7812
+ * turn's error as the summary. */
7574
7813
  function readHook$6(p, reported, _state) {
7575
7814
  const event = p.hook_event_name;
7815
+ if (event === "SubagentStart") {
7816
+ const id = str$1(p.agent_id);
7817
+ return id ? {
7818
+ ignore: true,
7819
+ background: { started: id }
7820
+ } : { ignore: true };
7821
+ }
7822
+ if (event === "SubagentStop") {
7823
+ const running = backgroundWork(p);
7824
+ const id = str$1(p.agent_id);
7825
+ if (running) return {
7826
+ ignore: true,
7827
+ background: { running }
7828
+ };
7829
+ return id ? {
7830
+ ignore: true,
7831
+ background: { stopped: id }
7832
+ } : { ignore: true };
7833
+ }
7576
7834
  if ((event === "PreToolUse" || event === "PostToolUse" || event === "PostToolUseFailure") && str$1(p.agent_id)) return { ignore: true };
7577
- if (event === "Stop" && runningSubagents(p)) return { ignore: true };
7578
7835
  if (event === "PostToolUseFailure" && p.is_interrupt === true) return { state: "idle" };
7579
7836
  if (notificationType(p) === WORKER_PERMISSION) return {
7580
7837
  reason: "attention",
@@ -7598,15 +7855,28 @@ function readHook$6(p, reported, _state) {
7598
7855
  const input = p.tool_input;
7599
7856
  const what = str$1(input?.description) || str$1(input?.command) || str$1(p.tool_name);
7600
7857
  read.summary = what ? cleanSummary(`Approve: ${what}`) : "Waiting for permission";
7858
+ } else if (event === "Stop") {
7859
+ const running = backgroundWork(p);
7860
+ if (running) read.background = { running };
7601
7861
  }
7602
7862
  return read;
7603
7863
  }
7604
- /** Stop's `background_tasks` (in-flight work that will wake the session)
7605
- * holding a subagent. A background shell (a dev server) is left out: it
7606
- * may never finish, and the turn really has ended. */
7607
- function runningSubagents(p) {
7864
+ /** The kinds of `background_tasks` entry Claude wakes up for as they end
7865
+ * and waits on itself: subagents and workflows. A background shell (a dev
7866
+ * server) may never end, a monitor fires for as long as it runs and a
7867
+ * teammate idles between tasks, so none of those is work in progress. */
7868
+ var WAKES = /* @__PURE__ */ new Set(["subagent", "workflow"]);
7869
+ /** The ids of the work that wakes the session among a Stop's or
7870
+ * SubagentStop's `background_tasks` (running or pending), or undefined
7871
+ * for a payload without the list. */
7872
+ function backgroundWork(p) {
7608
7873
  const tasks = p.background_tasks;
7609
- return Array.isArray(tasks) && tasks.some((t) => !!t && typeof t === "object" && t.type === "subagent");
7874
+ if (!Array.isArray(tasks)) return void 0;
7875
+ return tasks.flatMap((t) => {
7876
+ const task = t ?? {};
7877
+ const id = str$1(task.id);
7878
+ return id && WAKES.has(str$1(task.type)) ? [id] : [];
7879
+ });
7610
7880
  }
7611
7881
  /** Claude Code takes its settings inline (`--settings` accepts a JSON
7612
7882
  * string), so the hooks travel in argv and nothing is written anywhere.
@@ -7615,7 +7885,12 @@ function runningSubagents(p) {
7615
7885
  * while (each keystroke defers it), but it is the one that covers a
7616
7886
  * sandbox's network prompt. A turn that fails (rate limit, signed out)
7617
7887
  * ends with StopFailure rather than Stop; an interrupt ends with no hook
7618
- * at all, which the pane going still catches (scraper.ts). */
7888
+ * at all, which the pane going still catches (scraper.ts). Subagents
7889
+ * report starting and stopping (SubagentStart / SubagentStop, with their
7890
+ * `agent_id`), a background one and a workflow's among them, and Stop and
7891
+ * SubagentStop carry `background_tasks`, Claude's own list of what still
7892
+ * runs: together, what keeps a session working past a turn that handed
7893
+ * its work to them. */
7619
7894
  var claude = {
7620
7895
  meta: meta$6,
7621
7896
  launchFlags: () => ["--settings", JSON.stringify({ hooks: claudeStyleHooks("claude", [
@@ -7649,6 +7924,8 @@ var claude = {
7649
7924
  "waiting",
7650
7925
  "attention"
7651
7926
  ],
7927
+ ["SubagentStart", "background"],
7928
+ ["SubagentStop", "background"],
7652
7929
  [
7653
7930
  "Notification",
7654
7931
  "waiting",
@@ -7658,7 +7935,10 @@ var claude = {
7658
7935
  ]) })],
7659
7936
  reportsWorking: () => true,
7660
7937
  envPrefixes: ["CLAUDE", "AI_AGENT"],
7661
- startupPrompt: (screen) => /Is this a project you created or one you trust/.test(screen) ? ["Enter"] : void 0,
7938
+ startupQuestions: [{
7939
+ screen: /Is this a project you created or one you trust/,
7940
+ asks: "whether to trust this folder"
7941
+ }],
7662
7942
  readHook: readHook$6,
7663
7943
  usage: () => Promise.all(claudeAccounts().map((account) => claudeRow(account)))
7664
7944
  };
@@ -8105,19 +8385,16 @@ function lastMessageFromTranscript(p) {
8105
8385
  }
8106
8386
  } catch {}
8107
8387
  }
8108
- /** Two menus Copilot can draw before its input box, both of which would
8109
- * swallow a pasted first prompt. A session work ends is killed with its
8110
- * tmux pane, so Copilot's own registry still lists it as open and every
8111
- * later launch offers to restore it (Esc starts fresh). A workspace it has
8112
- * not seen gets the folder-trust prompt, with Yes preselected. */
8113
- function startupPrompt(screen) {
8114
- if (/Restore interrupted sessions/.test(screen)) return ["Escape"];
8115
- if (/remember this folder for future sessions/.test(screen)) return ["Enter"];
8116
- }
8117
8388
  var copilot = {
8118
8389
  meta: meta$4,
8119
8390
  launchFlags: () => ["--plugin-dir", pluginDir$1()],
8120
- startupPrompt,
8391
+ startupQuestions: [{
8392
+ screen: /remember this folder for future sessions/,
8393
+ asks: "whether to trust this folder"
8394
+ }, {
8395
+ screen: /Restore interrupted sessions/,
8396
+ asks: "which sessions to restore"
8397
+ }],
8121
8398
  reportsWorking: () => true,
8122
8399
  envPrefixes: ["COPILOT_"],
8123
8400
  readHook: readHook$4,
@@ -8593,7 +8870,7 @@ var meta$1 = meta_default$1;
8593
8870
  * subscribed to the same event bus its TUI renders from. The plugin posts
8594
8871
  * the reports itself rather than shelling out to curl, so this is the one
8595
8872
  * family whose payload work wrote — `readHook` only has to unwrap it. */
8596
- var PLUGIN = (appPort) => `// Generated by work. Reports this
8873
+ var PLUGIN = (host, appPort) => `// Generated by work. Reports this
8597
8874
  // session's working / needs-input / done state to the app; edits are
8598
8875
  // overwritten. Port and session id come from the env tmux gave the pane.
8599
8876
  const post = async (state, reason, summary) => {
@@ -8604,7 +8881,7 @@ const post = async (state, reason, summary) => {
8604
8881
  \`session=\${encodeURIComponent(session)}&agent=opencode&state=\${state}\` +
8605
8882
  (reason ? \`&reason=\${reason}\` : "");
8606
8883
  try {
8607
- await fetch(\`http://127.0.0.1:\${port}/api/agent-state?\${qs}\`, {
8884
+ await fetch(\`http://${host}:\${port}/api/agent-state?\${qs}\`, {
8608
8885
  method: "POST",
8609
8886
  headers: { "content-type": "application/json" },
8610
8887
  body: JSON.stringify({ summary }),
@@ -8739,7 +9016,7 @@ function installed$1() {
8739
9016
  function pluginConfig() {
8740
9017
  const file = PLUGIN_FILE();
8741
9018
  try {
8742
- writeIfChanged(file, PLUGIN(config.appPort));
9019
+ writeIfChanged(file, PLUGIN(config.dialHost, config.appPort));
8743
9020
  } catch {}
8744
9021
  return JSON.stringify({ plugin: [file] });
8745
9022
  }
@@ -8770,7 +9047,7 @@ var meta = meta_default;
8770
9047
  * `agent_settled` (0.80.4) never sends it, so a run's end waits a moment
8771
9048
  * for one and reports itself when none comes. The extension posts its own
8772
9049
  * reports, as opencode's plugin does; `readHook` only unwraps them. */
8773
- var EXTENSION = (appPort) => `// Generated by work. Reports this
9050
+ var EXTENSION = (host, appPort) => `// Generated by work. Reports this
8774
9051
  // session's working / needs-input / done state to the app; edits are
8775
9052
  // overwritten. Port and session id come from the env tmux gave the pane.
8776
9053
  const post = async (state, reason, summary) => {
@@ -8781,7 +9058,7 @@ const post = async (state, reason, summary) => {
8781
9058
  \`session=\${encodeURIComponent(session)}&agent=pi&state=\${state}\` +
8782
9059
  (reason ? \`&reason=\${reason}\` : "");
8783
9060
  try {
8784
- await fetch(\`http://127.0.0.1:\${port}/api/agent-state?\${qs}\`, {
9061
+ await fetch(\`http://${host}:\${port}/api/agent-state?\${qs}\`, {
8785
9062
  method: "POST",
8786
9063
  headers: { "content-type": "application/json" },
8787
9064
  body: JSON.stringify({ summary }),
@@ -8847,7 +9124,7 @@ function installed() {
8847
9124
  function extensionFile() {
8848
9125
  const file = EXTENSION_FILE();
8849
9126
  try {
8850
- writeIfChanged(file, EXTENSION(config.appPort));
9127
+ writeIfChanged(file, EXTENSION(config.dialHost, config.appPort));
8851
9128
  } catch {}
8852
9129
  return file;
8853
9130
  }
@@ -8898,17 +9175,12 @@ function agentLaunchEnv(id, ctx) {
8898
9175
  function reportsWorking(id) {
8899
9176
  return agentFor(id)?.reportsWorking?.() ?? false;
8900
9177
  }
8901
- /** The pane title a CLI shows at its prompt, if it sets one. */
8902
- function idleTitle(id) {
8903
- return agentFor(id)?.idleTitle;
8904
- }
8905
- /** The CLI draws menus before its input box that work answers. */
8906
- function hasStartupPrompt(id) {
8907
- return !!agentFor(id)?.startupPrompt;
8908
- }
8909
- /** Keys that answer whatever startup prompt the CLI is showing, if any. */
8910
- function startupPromptKeys(id, screen) {
8911
- return agentFor(id)?.startupPrompt?.(screen);
9178
+ /** What the CLI is asking the user on this screen before its input box
9179
+ * ("Claude is asking whether to trust this folder"), if anything. */
9180
+ function startupQuestion(id, screen) {
9181
+ const agent = agentFor(id);
9182
+ const question = agent?.startupQuestions?.find((q) => q.screen.test(screen));
9183
+ return agent && question ? `${agent.meta.label} is asking ${question.asks}` : void 0;
8912
9184
  }
8913
9185
  /** The input-box marker for CLIs whose splash looks settled early. */
8914
9186
  function readyScreen(id) {
@@ -8943,8 +9215,16 @@ function listSessions(workspaceId) {
8943
9215
  function getSession(id) {
8944
9216
  return get("SELECT * FROM sessions WHERE id = ?", id);
8945
9217
  }
8946
- function createSession(workspaceId, agent) {
9218
+ /** `ifEmpty` is a first open's auto-create: two pages mounting one empty
9219
+ * workspace at once (restored tabs, a phone and a desktop) both list no
9220
+ * sessions before either POST lands. The check and the insert run in one
9221
+ * synchronous step, so the second gets the first one's session. */
9222
+ function createSession(workspaceId, agent, ifEmpty = false) {
8947
9223
  if (!isKnownAgent(agent)) throw new Error(`unknown session kind: ${agent}`);
9224
+ if (ifEmpty) {
9225
+ const first = listSessions(workspaceId)[0];
9226
+ if (first) return first;
9227
+ }
8948
9228
  const id = Math.random().toString(36).slice(2, 10);
8949
9229
  db.prepare("INSERT INTO sessions (id, workspace_id, agent) VALUES (?, ?, ?)").run(id, workspaceId, agent);
8950
9230
  notifySessionsChanged(workspaceId);
@@ -9030,14 +9310,29 @@ async function sendToSession(id, text, size) {
9030
9310
  if (!wsPath) throw new Error("unknown workspace");
9031
9311
  const name = tmuxName(id);
9032
9312
  const env = cleanEnv();
9033
- if (!await tmux([
9313
+ const alive = await tmux([
9034
9314
  "has-session",
9035
9315
  "-t",
9036
9316
  name
9037
- ], env).then(() => true, () => false)) {
9317
+ ], env).then(() => true, () => false);
9318
+ if (!alive) {
9038
9319
  await ensureTmuxServer();
9320
+ clearAgentPhase(id);
9039
9321
  if (promptAsArgv(session.agent)) {
9040
- await tmux(newSessionArgs(session, wsPath, "-d", text, size), env);
9322
+ const file = path.join(os.tmpdir(), `work-prompt-${id}-${Math.random().toString(36).slice(2, 10)}`);
9323
+ fs.writeFileSync(file, text, {
9324
+ mode: 384,
9325
+ flag: "wx"
9326
+ });
9327
+ try {
9328
+ await tmux(newSessionArgs(session, wsPath, "-d", {
9329
+ file,
9330
+ text
9331
+ }, size), env);
9332
+ } catch (err) {
9333
+ fs.rmSync(file, { force: true });
9334
+ throw err;
9335
+ }
9041
9336
  markTmuxStarted(id);
9042
9337
  return;
9043
9338
  }
@@ -9045,6 +9340,16 @@ async function sendToSession(id, text, size) {
9045
9340
  markTmuxStarted(id);
9046
9341
  await waitForAgent(name, env, session.agent);
9047
9342
  }
9343
+ if (!alive || hookReportedAt(id) === void 0) {
9344
+ const screen = await tmux([
9345
+ "capture-pane",
9346
+ "-p",
9347
+ "-t",
9348
+ name
9349
+ ], env).catch(() => "");
9350
+ const asking = startupQuestion(session.agent, screen);
9351
+ if (asking) throw httpError(409, `${asking}: answer it in the terminal, then send again`);
9352
+ }
9048
9353
  const buffer = `work-send-${Math.random().toString(36).slice(2, 8)}`;
9049
9354
  await tmux([
9050
9355
  "load-buffer",
@@ -9117,19 +9422,18 @@ async function listPanesNow() {
9117
9422
  "list-panes",
9118
9423
  "-a",
9119
9424
  "-F",
9120
- "#{session_name} #{pane_current_command} #{pane_pid} #{window_activity} #{pane_title}"
9425
+ "#{session_name} #{pane_current_command} #{pane_pid} #{window_activity}"
9121
9426
  ]).catch(() => null);
9122
9427
  if (out === null) return null;
9123
9428
  const panes = [];
9124
9429
  for (const line of out.split("\n")) {
9125
9430
  if (!line) continue;
9126
- const [name, command, pid, stamp, ...title] = line.split(" ");
9431
+ const [name, command, pid, stamp] = line.split(" ");
9127
9432
  panes.push({
9128
9433
  id: name?.startsWith("wk-") ? name.slice(3) : void 0,
9129
9434
  command: command || "",
9130
9435
  pid: Number(pid),
9131
- activityAt: Number(stamp) * 1e3,
9132
- title: title.join(" ")
9436
+ activityAt: Number(stamp) * 1e3
9133
9437
  });
9134
9438
  }
9135
9439
  lastPanes = {
@@ -9162,7 +9466,7 @@ async function ensureTmuxServer() {
9162
9466
  portCleared = true;
9163
9467
  await run$1("systemd-run", [
9164
9468
  "--user",
9165
- "--unit=work-tmux",
9469
+ `--unit=${TMUX_SOCKET === "work" ? "work-tmux" : `work-tmux-${TMUX_SOCKET.replace(/[^\w.:-]/g, "_")}`}`,
9166
9470
  "--service-type=forking",
9167
9471
  "--collect",
9168
9472
  "tmux",
@@ -9296,15 +9600,16 @@ function newSessionArgs(session, wsPath, mode, initialPrompt, size) {
9296
9600
  function loginShellCommand(agent, cwd, initialPrompt) {
9297
9601
  const words = sessionCommand(agent);
9298
9602
  if (!words.length) return [];
9299
- const line = [
9300
- ...words,
9301
- ...agentLaunchFlags(agent, { cwd }),
9302
- ...initialPrompt ? initialPrompt.startsWith("-") ? ["--", initialPrompt] : [initialPrompt] : []
9303
- ].map(shellQuote).join(" ");
9603
+ const line = [...words, ...agentLaunchFlags(agent, { cwd })].map(shellQuote);
9604
+ if (initialPrompt) {
9605
+ const file = shellQuote(initialPrompt.file);
9606
+ if (initialPrompt.text.startsWith("-")) line.push("--");
9607
+ line.push(`"$(cat ${file}; rm -f ${file})"`);
9608
+ }
9304
9609
  return [
9305
9610
  process.env.SHELL || "bash",
9306
9611
  "-lc",
9307
- `exec ${line}`
9612
+ `exec ${line.join(" ")}`
9308
9613
  ];
9309
9614
  }
9310
9615
  function shellQuote(word) {
@@ -9328,14 +9633,6 @@ function cleanEnv() {
9328
9633
  env.PATH = [...parts, ...bins.filter((bin) => !parts.includes(bin))].join(":");
9329
9634
  return forceUtf8Locale(env);
9330
9635
  }
9331
- /** Answer the menus a CLI draws before its input box (a folder-trust
9332
- * question) on a pane an attach just created, as sending a first prompt
9333
- * does — so a session opened with nothing to send is not left on one. */
9334
- async function settleStartup(id) {
9335
- const session = getSession(id);
9336
- if (!session || !hasStartupPrompt(session.agent)) return;
9337
- await waitForAgent(tmuxName(id), cleanEnv(), session.agent).catch(() => {});
9338
- }
9339
9636
  /** Upper bound on waiting for an agent to be ready for input; past it
9340
9637
  * the paste goes in regardless (a TUI with a boot animation never settles). */
9341
9638
  var AGENT_BOOT_MS = 8e3;
@@ -9357,24 +9654,7 @@ async function waitForAgent(name, env, agent) {
9357
9654
  if (c && !/^(bash|zsh|sh|fish|login|-?\w*sh)$/.test(c)) break;
9358
9655
  await sleep(150);
9359
9656
  }
9360
- const ready = readyScreen(agent);
9361
- for (let i = 0; i < 3; i++) {
9362
- await waitStill(name, env, until - Date.now(), ready);
9363
- const keys = startupPromptKeys(agent, await tmux([
9364
- "capture-pane",
9365
- "-p",
9366
- "-t",
9367
- name
9368
- ], env).catch(() => ""));
9369
- if (!keys?.length) return;
9370
- await tmux([
9371
- "send-keys",
9372
- "-t",
9373
- name,
9374
- ...keys
9375
- ], env);
9376
- await sleep(300);
9377
- }
9657
+ await waitStill(name, env, until - Date.now(), readyScreen(agent));
9378
9658
  }
9379
9659
  /** Resolve once the pane has drawn something and then held still for
9380
9660
  * SCREEN_STILL_MS, or after `maxMs` (a TUI with an animation never
@@ -9441,4 +9721,4 @@ function sleep(ms) {
9441
9721
  return new Promise((resolve) => setTimeout(resolve, ms));
9442
9722
  }
9443
9723
  //#endregion
9444
- export { validSubscription as $, hookPhase as A, get as At, agentFromCommand as B, AGENTS as C, DEFAULT_GITHUB_HOST as Ct, blankRow as D, toolById as Dt, reportsWorking as E, agentLabel$1 as Et, setScrapedPhase as F, run$1 as Ft, iconSvg as G, agentMeta as H, setSessionViewers as I, tmux as It, setInstance as J, manifest as K, settleQuietWorking as L, config as Lt, noteUserAnswered as M, TMUX_SOCKET as Mt, onPhaseChange as N, gh as Nt, agentPhase as O, all as Ot, setAgentPhase as P, git as Pt, sendPush as Q, agentBadge as R, tmuxWasStarted as S, which as St, readHookPayload as T, agentById as Tt, ACCENT_RE as U, agentLabel as V, getInstance as W, pushPublicKey as X, deleteSubscription as Y, saveSubscription as Z, renameSession as _, doctor as _t, ensureTmuxServer as a, swr as at, settleStartup as b, miseVersions as bt, killSession as c, allPrefs as ct, listPanesWithin as d, getSetting as dt, publish as et, listSessions as f, preferredAgent as ft, panePids as g, discoverAgents as gt, notifySessionsChanged as h, setSetting as ht, disposeSessions as i, shared as it, hookReportedAt as j, workspacePath as jt, clearAgentPhase as k, db as kt, killWorkspaceSessions as l, disabledAgents as lt, newSessionArgs as m, setPref as mt, clearTmuxStarted as n, subscribe as nt, forgetPanes as o, withLock as ot, markTmuxStarted as p, setDisabledAgents as pt, normalizeAccent as q, createSession as r, subscriberCount as rt, getSession as s, agentChoices as st, cleanEnv as t, publishJson as tt, listPanes as u, enabledAgents as ut, sendToSession as v, ghKnownHosts as vt, idleTitle as w, TOOLS as wt, tmuxName as x, setupPath as xt, sessionStates as y, miseInstalls as yt, agentFamily as z };
9724
+ export { publish as $, noteBackground as A, toolById as At, agentLabel as B, tmux as Bt, readHookPayload as C, miseVersions as Ct, clearAgentPhase as D, TOOLS as Dt, agentPhase as E, DEFAULT_GITHUB_HOST as Et, setSessionViewers as F, workspacePath as Ft, manifest as G, ACCENT_RE as H, checked as Ht, settleQuietWorking as I, TMUX_SOCKET as It, deleteSubscription as J, normalizeAccent as K, agentBadge as L, gh as Lt, onPhaseChange as M, all as Mt, setAgentPhase as N, db as Nt, hookPhase as O, agentById as Ot, setScrapedPhase as P, get as Pt, validSubscription as Q, agentFamily as R, git as Rt, AGENTS as S, miseInstalls as St, blankRow as T, which as Tt, getInstance as U, httpError as Ut, agentMeta as V, config as Vt, iconSvg as W, readBody as Wt, saveSubscription as X, pushPublicKey as Y, sendPush as Z, renameSession as _, setPref as _t, ensureTmuxServer as a, withLock as at, tmuxName as b, doctor as bt, killSession as c, agentChoices as ct, listPanesWithin as d, deleteWorkspacePrefs as dt, publishJson as et, listSessions as f, disabledAgents as ft, panePids as g, setDisabledAgents as gt, notifySessionsChanged as h, preferredAgent as ht, disposeSessions as i, swr as it, noteUserAnswered as j, applyPrefChange as jt, hookReportedAt as k, agentLabel$1 as kt, killWorkspaceSessions as l, allPrefs as lt, newSessionArgs as m, getSetting as mt, clearTmuxStarted as n, subscriberCount as nt, forgetPanes as o, PREF_MAX as ot, markTmuxStarted as p, enabledAgents as pt, setInstance as q, createSession as r, shared as rt, getSession as s, WORKSPACE_PREFS as st, cleanEnv as t, subscribe as tt, listPanes as u, changePref as ut, sendToSession as v, setSetting as vt, reportsWorking as w, setupPath as wt, tmuxWasStarted as x, ghKnownHosts as xt, sessionStates as y, discoverAgents as yt, agentFromCommand as z, run$1 as zt };