@dylanpiercey/work 0.2.53 → 0.2.55

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 (489) hide show
  1. package/bin/cli/session.mjs +153 -18
  2. package/bin/work.mjs +2 -32
  3. package/dist/{_tAkj84_m.js → _CKxRXoHK.js} +75 -75
  4. package/dist/_CVNGN2QO.js +2 -0
  5. package/dist/{_CWO9RtPZ.js → _CZ4mgOdb.js} +203 -44
  6. package/dist/{_ByxSq8zO.js → _Cb_JPQ7K.js} +371 -59
  7. package/dist/_hjIYs3Gy.js +2 -0
  8. package/dist/index.mjs +1352 -1200
  9. package/dist/public/assets/{_BWhs553r.js → _0YT2d3LY.js} +1 -1
  10. package/dist/public/assets/_0YT2d3LY.js.br +0 -0
  11. package/dist/public/assets/{_DVbq8rez.js → _0rKvhqMi.js} +1 -1
  12. package/dist/public/assets/_0rKvhqMi.js.br +0 -0
  13. package/dist/public/assets/_5PI2fZS8.js +1 -0
  14. package/dist/public/assets/_72zzTyhJ.js +1 -0
  15. package/dist/public/assets/_91-k5tQx.js +1 -0
  16. package/dist/public/assets/{_DjIcKKrW.js → _AIdFuyL9.js} +1 -1
  17. package/dist/public/assets/_AIdFuyL9.js.br +0 -0
  18. package/dist/public/assets/{_D_qMHeyF.js → _AtwdfMkh.js} +1 -1
  19. package/dist/public/assets/_AtwdfMkh.js.br +0 -0
  20. package/dist/public/assets/_B1qplI2K.js +1 -0
  21. package/dist/public/assets/_B29W737t.js +1 -0
  22. package/dist/public/assets/{_UM6RqjfN.js → _B56DMc1H.js} +1 -1
  23. package/dist/public/assets/_B56DMc1H.js.br +0 -0
  24. package/dist/public/assets/_B8Bw484t.js +1 -0
  25. package/dist/public/assets/{_CT3v6Oze.js → _BA2Lowt-.js} +1 -1
  26. package/dist/public/assets/_BA2Lowt-.js.br +0 -0
  27. package/dist/public/assets/_BBF2mdRO.js +1 -0
  28. package/dist/public/assets/{_DFjGajU7.js → _BDCDGYHw.js} +1 -1
  29. package/dist/public/assets/_BDR1eJ6l.js +1 -0
  30. package/dist/public/assets/_BDppKLVj.js +1 -0
  31. package/dist/public/assets/{_Cn8rkyXq.js → _BFAY4fG9.js} +1 -1
  32. package/dist/public/assets/_BFAY4fG9.js.br +0 -0
  33. package/dist/public/assets/{_CeSQyrMz.js → _BGn8HXYq.js} +1 -1
  34. package/dist/public/assets/_BGn8HXYq.js.br +0 -0
  35. package/dist/public/assets/{_CfPha1FH.js → _BJ3_jYoD.js} +1 -1
  36. package/dist/public/assets/_BJ3_jYoD.js.br +0 -0
  37. package/dist/public/assets/_BJqpx-Y1.js +1 -0
  38. package/dist/public/assets/{_CnWm9a_o.js → _BOQ3PwKZ.js} +1 -1
  39. package/dist/public/assets/_BOQ3PwKZ.js.br +0 -0
  40. package/dist/public/assets/{_dZl98lyu.js → _BOXau4gS.js} +1 -1
  41. package/dist/public/assets/_BOXau4gS.js.br +0 -0
  42. package/dist/public/assets/{_Dho8D73M.js → _BPbX8cFz.js} +1 -1
  43. package/dist/public/assets/_BPbX8cFz.js.br +0 -0
  44. package/dist/public/assets/{_YIEXDh5T.js → _BT2Sj_YW.js} +4 -4
  45. package/dist/public/assets/_BT2Sj_YW.js.br +0 -0
  46. package/dist/public/assets/_BUvcY7QT.js +1 -0
  47. package/dist/public/assets/_BVeS3UXr.js +1 -0
  48. package/dist/public/assets/{_Er1jCr0y.js → _BYO4bphw.js} +1 -1
  49. package/dist/public/assets/_BYO4bphw.js.br +0 -0
  50. package/dist/public/assets/_BYYFg9LD.js +1 -0
  51. package/dist/public/assets/{_SNGXdx8T.js → _BZmB54mR.js} +1 -1
  52. package/dist/public/assets/_BZmB54mR.js.br +0 -0
  53. package/dist/public/assets/{_DVuEGjB6.js → _B_WzjbZc.js} +1 -1
  54. package/dist/public/assets/_B_WzjbZc.js.br +0 -0
  55. package/dist/public/assets/{_DahEvrx7.js → _B_mZh-m9.js} +1 -1
  56. package/dist/public/assets/_B_mZh-m9.js.br +0 -0
  57. package/dist/public/assets/_Bawb2dbh.js +1 -0
  58. package/dist/public/assets/{_CZyU6zlW.js → _BcWvsmRe.js} +4 -4
  59. package/dist/public/assets/_BcWvsmRe.js.br +0 -0
  60. package/dist/public/assets/{_D4yHrw0x.js → _BeA1nKaN.js} +1 -1
  61. package/dist/public/assets/_BeA1nKaN.js.br +0 -0
  62. package/dist/public/assets/{_Z8XAsbav.js → _BeZ7pjQV.js} +1 -1
  63. package/dist/public/assets/_BeZ7pjQV.js.br +0 -0
  64. package/dist/public/assets/{_CoVyqWOC.js → _BgV7K2cf.js} +1 -1
  65. package/dist/public/assets/_BgV7K2cf.js.br +0 -0
  66. package/dist/public/assets/{_B23iifIa.js → _BgtzrIGU.js} +1 -1
  67. package/dist/public/assets/_BgtzrIGU.js.br +0 -0
  68. package/dist/public/assets/{_CCuLPWZW.js → _BiNobkT0.js} +1 -1
  69. package/dist/public/assets/_BiNobkT0.js.br +0 -0
  70. package/dist/public/assets/_BihgYQ-n.js +1 -0
  71. package/dist/public/assets/{_53vvCtB9.js → _BjTM0FyT.js} +1 -1
  72. package/dist/public/assets/_BjTM0FyT.js.br +0 -0
  73. package/dist/public/assets/{_DWn9Bk4p.js → _Bjib9M1A.js} +1 -1
  74. package/dist/public/assets/_Bjib9M1A.js.br +0 -0
  75. package/dist/public/assets/_BkhLTI27.js +1 -0
  76. package/dist/public/assets/{_BJxnfQcd.js → _BmaXli3m.js} +1 -1
  77. package/dist/public/assets/_BmaXli3m.js.br +0 -0
  78. package/dist/public/assets/{_Dtj0n4Ea.js → _BmwvMhWC.js} +1 -1
  79. package/dist/public/assets/_BmwvMhWC.js.br +0 -0
  80. package/dist/public/assets/{_I-rWUgTm.js → _Bo0K9EaI.js} +1 -1
  81. package/dist/public/assets/_Bo0K9EaI.js.br +0 -0
  82. package/dist/public/assets/{_BZDlyKDT.js → _BqTF3ARG.js} +1 -1
  83. package/dist/public/assets/_BqTF3ARG.js.br +0 -0
  84. package/dist/public/assets/_BrMbTp16.js +1 -0
  85. package/dist/public/assets/{_BqPqaeUo.js → _BsaOdWyz.js} +1 -1
  86. package/dist/public/assets/_BsaOdWyz.js.br +0 -0
  87. package/dist/public/assets/_Bt-nevYL.js +1 -0
  88. package/dist/public/assets/{_dhxtcjZT.js → _BtCTUxzJ.js} +1 -1
  89. package/dist/public/assets/_BtCTUxzJ.js.br +0 -0
  90. package/dist/public/assets/{_DdpvFyoD.js → _BvtRBlS4.js} +1 -1
  91. package/dist/public/assets/_BvtRBlS4.js.br +0 -0
  92. package/dist/public/assets/_C0OkE91l.js +1 -0
  93. package/dist/public/assets/{_B7RTaeWh.js → _C0Qul9-A.js} +5 -5
  94. package/dist/public/assets/_C0Qul9-A.js.br +0 -0
  95. package/dist/public/assets/_C0rT0pkF.js +1 -0
  96. package/dist/public/assets/_C3CmAkGd.js +1 -0
  97. package/dist/public/assets/{_DgFgoB4_.js → _C3CvDqAU.js} +1 -1
  98. package/dist/public/assets/_C3CvDqAU.js.br +0 -0
  99. package/dist/public/assets/{_BndAJZwW.js → _C3JqzX6h.js} +1 -1
  100. package/dist/public/assets/_C3JqzX6h.js.br +0 -0
  101. package/dist/public/assets/{_3IZOU36R.js → _C4ANqjUO.js} +1 -1
  102. package/dist/public/assets/_C4ANqjUO.js.br +0 -0
  103. package/dist/public/assets/_C5DH9oOf.js +1 -0
  104. package/dist/public/assets/_C5sFdYe9.js +1 -0
  105. package/dist/public/assets/{_ahnzi6Vi.js → _C74hoXSg.js} +1 -1
  106. package/dist/public/assets/_C74hoXSg.js.br +0 -0
  107. package/dist/public/assets/_CCTo-C_5.js +1 -0
  108. package/dist/public/assets/_CDcdmiKC.js +1 -0
  109. package/dist/public/assets/_CDqJPzG_.js +1 -0
  110. package/dist/public/assets/{_I1G0J8iR.js → _CH4FVzly.js} +1 -1
  111. package/dist/public/assets/_CH4FVzly.js.br +0 -0
  112. package/dist/public/assets/_CHRtfQm8.js +1 -0
  113. package/dist/public/assets/_CHnN1OUE.js +1 -0
  114. package/dist/public/assets/_CKLCZ7qS.js +1 -0
  115. package/dist/public/assets/{_ezrIBxd5.js → _CMZsgNPc.js} +1 -1
  116. package/dist/public/assets/_CMZsgNPc.js.br +0 -0
  117. package/dist/public/assets/_CNbdL75e.js +1 -0
  118. package/dist/public/assets/_CQsxBQYp.js +1 -0
  119. package/dist/public/assets/{_BqZMlemw.js → _CSSUf_cF.js} +1 -1
  120. package/dist/public/assets/_CSSUf_cF.js.br +0 -0
  121. package/dist/public/assets/_CV0JELaI.js +1 -0
  122. package/dist/public/assets/_CVcEXbq2.js +1 -0
  123. package/dist/public/assets/_CY7yLV4X.js +1 -0
  124. package/dist/public/assets/{_Bu5hgjmu.js → _CYtI3ZUO.js} +1 -1
  125. package/dist/public/assets/_CYtI3ZUO.js.br +0 -0
  126. package/dist/public/assets/_CZ0oEQzb.js +1 -0
  127. package/dist/public/assets/_CZeCHesq.js +1 -0
  128. package/dist/public/assets/_CZei_-4z.js +1 -0
  129. package/dist/public/assets/{_Dzml7-SO.js → _CcWLzdOn.js} +1 -1
  130. package/dist/public/assets/_CcWLzdOn.js.br +0 -0
  131. package/dist/public/assets/{_Bsdn_9V_.js → _Ccwh6_69.js} +9 -9
  132. package/dist/public/assets/_Ccwh6_69.js.br +0 -0
  133. package/dist/public/assets/{_D-7MOklF.js → _CdmLszaF.js} +1 -1
  134. package/dist/public/assets/_CdmLszaF.js.br +0 -0
  135. package/dist/public/assets/_CdvRIoSW.js +1 -0
  136. package/dist/public/assets/{_CeKaED0O.js → _CeWEms2G.js} +1 -1
  137. package/dist/public/assets/{_Cyqw1SYV.js → _CkYsst7o.js} +1 -1
  138. package/dist/public/assets/_CkYsst7o.js.br +0 -0
  139. package/dist/public/assets/{_bgVS_jjB.js → _ClTXG9so.js} +1 -1
  140. package/dist/public/assets/_ClUpRbMG.js +1 -0
  141. package/dist/public/assets/{_CJBfnXPc.js → _ClapXxZl.js} +1 -1
  142. package/dist/public/assets/_ClapXxZl.js.br +0 -0
  143. package/dist/public/assets/{_B704FqW-.js → _CoaJtMCC.js} +1 -1
  144. package/dist/public/assets/_CoaJtMCC.js.br +0 -0
  145. package/dist/public/assets/_Coqwh06x.js +1 -0
  146. package/dist/public/assets/{_BAcvIhfz.js → _CqCLnBE3.js} +1 -1
  147. package/dist/public/assets/_CqCLnBE3.js.br +0 -0
  148. package/dist/public/assets/{_C_hw80DQ.js → _Crf1JP7F.js} +1 -1
  149. package/dist/public/assets/_Crf1JP7F.js.br +0 -0
  150. package/dist/public/assets/{_CuKCWxtd.js → _CruGUeWu.js} +1 -1
  151. package/dist/public/assets/_CruGUeWu.js.br +0 -0
  152. package/dist/public/assets/_CvBNrX9c.js +1 -0
  153. package/dist/public/assets/{_CnkmJKZH.js → _CvpfgyZE.js} +1 -1
  154. package/dist/public/assets/_CvpfgyZE.js.br +0 -0
  155. package/dist/public/assets/{_Do-dGY2X.js → _CxgPcY1B.js} +1 -1
  156. package/dist/public/assets/_CxgPcY1B.js.br +0 -0
  157. package/dist/public/assets/{_CB811mfH.js → _D-oIq8BZ.js} +1 -1
  158. package/dist/public/assets/_D-oIq8BZ.js.br +0 -0
  159. package/dist/public/assets/_D0H5I5m4.js +1 -0
  160. package/dist/public/assets/{_z-BjZNm3.js → _D0HnI6ug.js} +1 -1
  161. package/dist/public/assets/_D0HnI6ug.js.br +0 -0
  162. package/dist/public/assets/_D3TaXLz8.js +1 -0
  163. package/dist/public/assets/_D3TqQSka.js +1 -0
  164. package/dist/public/assets/_D4ZY_O8p.js +1 -0
  165. package/dist/public/assets/{_DJmXTsXM.js → _D4icZZux.js} +1 -1
  166. package/dist/public/assets/_D4icZZux.js.br +0 -0
  167. package/dist/public/assets/{_CqJdpoBK.js → _D4tgqiIB.js} +1 -1
  168. package/dist/public/assets/_D4tgqiIB.js.br +0 -0
  169. package/dist/public/assets/{_Idah-Wno.js → _D6OAuof8.js} +1 -1
  170. package/dist/public/assets/_D7IayTpp.js +1 -0
  171. package/dist/public/assets/{_CiCC4SAB.js → _D7UV9Wir.js} +1 -1
  172. package/dist/public/assets/_D7UV9Wir.js.br +0 -0
  173. package/dist/public/assets/{_D3dAzn-U.js → _D7siXaWH.js} +1 -1
  174. package/dist/public/assets/_D7siXaWH.js.br +0 -0
  175. package/dist/public/assets/{_DrTiWDUU.js → _D8e-tVLG.js} +1 -1
  176. package/dist/public/assets/_D8e-tVLG.js.br +0 -0
  177. package/dist/public/assets/{_Bxgu50JS.js → _D9zKRLBR.js} +1 -1
  178. package/dist/public/assets/_D9zKRLBR.js.br +0 -0
  179. package/dist/public/assets/{_DvgVDKmX.js → _DBcnZRAl.js} +1 -1
  180. package/dist/public/assets/_DBcnZRAl.js.br +0 -0
  181. package/dist/public/assets/{_C6vrNkj_.js → _DBv6A4ZA.js} +1 -1
  182. package/dist/public/assets/_DBv6A4ZA.js.br +0 -0
  183. package/dist/public/assets/{_BuQ2ay9z.js → _DChdFXSz.js} +1 -1
  184. package/dist/public/assets/_DChdFXSz.js.br +0 -0
  185. package/dist/public/assets/{_DPDpLf-R.js → _DEOJwc9o.js} +1 -1
  186. package/dist/public/assets/_DEOJwc9o.js.br +0 -0
  187. package/dist/public/assets/_DEUO3A77.js +1 -0
  188. package/dist/public/assets/_DEto2yAG.js +1 -0
  189. package/dist/public/assets/_DF4cXNDT.js +1 -0
  190. package/dist/public/assets/{_DChbhtm7.js → _DHhfMQv0.js} +1 -1
  191. package/dist/public/assets/_DHhfMQv0.js.br +0 -0
  192. package/dist/public/assets/{_DtiK3IDe.js → _DJWtiudl.js} +1 -1
  193. package/dist/public/assets/_DJWtiudl.js.br +0 -0
  194. package/dist/public/assets/{_NCVKEfbF.js → _DK7tFAuR.js} +1 -1
  195. package/dist/public/assets/_DK7tFAuR.js.br +0 -0
  196. package/dist/public/assets/_DLLxBxXt.js +1 -0
  197. package/dist/public/assets/_DLw2Ql6h.js +1 -0
  198. package/dist/public/assets/_DMAM82ur.js +1 -0
  199. package/dist/public/assets/_DMRQxpWh.js +1 -0
  200. package/dist/public/assets/{_BwsgtEeq.js → _DN8cYyMA.js} +1 -1
  201. package/dist/public/assets/_DN8cYyMA.js.br +0 -0
  202. package/dist/public/assets/_DPXtZlgx.js +1 -0
  203. package/dist/public/assets/{_mcdXVs94.js → _DRe6yj8o.js} +1 -1
  204. package/dist/public/assets/_DRe6yj8o.js.br +0 -0
  205. package/dist/public/assets/_DTRwgUDz.js +1 -0
  206. package/dist/public/assets/_DXKf95xT.js +1 -0
  207. package/dist/public/assets/{_CpqmQUsa.js → _DXTQvf2X.js} +1 -1
  208. package/dist/public/assets/_DYLeu8Yn.js +1 -0
  209. package/dist/public/assets/{_ByDMN1SH.js → _DYcJRv1v.js} +1 -1
  210. package/dist/public/assets/_DYcJRv1v.js.br +0 -0
  211. package/dist/public/assets/{_BHTNZeRn.js → _D_0P73tR.js} +1 -1
  212. package/dist/public/assets/_D_0P73tR.js.br +0 -0
  213. package/dist/public/assets/{_Cu-SfhdL.js → _Da4ArfnL.js} +1 -1
  214. package/dist/public/assets/_Da4ArfnL.js.br +0 -0
  215. package/dist/public/assets/_Da6uZcpe.js +1 -0
  216. package/dist/public/assets/_Dd0Ly8u1.js +1 -0
  217. package/dist/public/assets/_DdUtrYLB.js +1 -0
  218. package/dist/public/assets/_DeEl87FQ.js +1 -0
  219. package/dist/public/assets/{_BIt6tvPi.js → _DeSxIIXB.js} +1 -1
  220. package/dist/public/assets/_DeSxIIXB.js.br +0 -0
  221. package/dist/public/assets/_DewfgUtc.js +1 -0
  222. package/dist/public/assets/_DexEfCG6.js +1 -0
  223. package/dist/public/assets/{_BChbCwWm.js → _Df2TxuvS.js} +1 -1
  224. package/dist/public/assets/_Df2TxuvS.js.br +0 -0
  225. package/dist/public/assets/{_Luj-nE2Q.js → _DjOV2LK6.js} +2 -2
  226. package/dist/public/assets/_DjOV2LK6.js.br +0 -0
  227. package/dist/public/assets/{_BH15mqpr.js → _DkyXsbiQ.js} +2 -2
  228. package/dist/public/assets/_DkyXsbiQ.js.br +0 -0
  229. package/dist/public/assets/_DlOMVv-w.js +1 -0
  230. package/dist/public/assets/_DmFwT38J.js +1 -0
  231. package/dist/public/assets/{_B9QxmB8p.js → _DmpEhYLB.js} +1 -1
  232. package/dist/public/assets/_DmpEhYLB.js.br +0 -0
  233. package/dist/public/assets/{_DWYNR6FP.js → _Dq3-ZF2Z.js} +1 -1
  234. package/dist/public/assets/_Dq3-ZF2Z.js.br +0 -0
  235. package/dist/public/assets/_DqqEHIEx.js +1 -0
  236. package/dist/public/assets/{_B-VYcrqc.js → _Duitagee.js} +1 -1
  237. package/dist/public/assets/_Duitagee.js.br +0 -0
  238. package/dist/public/assets/_DvYVra8w.js +1 -0
  239. package/dist/public/assets/_DwEFyNc7.js +1 -0
  240. package/dist/public/assets/{_B5w-PFzL.js → _Dwea1Mf0.js} +1 -1
  241. package/dist/public/assets/_Dwea1Mf0.js.br +0 -0
  242. package/dist/public/assets/{_BKuPpEpl.js → _F19-LHbi.js} +1 -1
  243. package/dist/public/assets/_F19-LHbi.js.br +0 -0
  244. package/dist/public/assets/_Fkix9A0t.js +1 -0
  245. package/dist/public/assets/{_BBDxD-rC.js → _I_2m9jez.js} +1 -1
  246. package/dist/public/assets/_I_2m9jez.js.br +0 -0
  247. package/dist/public/assets/{_D3zgkNcZ.js → _JPzuLvxx.js} +1 -1
  248. package/dist/public/assets/_JPzuLvxx.js.br +0 -0
  249. package/dist/public/assets/_MEOVRTxh.js +1 -0
  250. package/dist/public/assets/{_C-iQnfOW.js → _NCyU2X3g.js} +1 -1
  251. package/dist/public/assets/_NCyU2X3g.js.br +0 -0
  252. package/dist/public/assets/_OXZnsLN0.js +1 -0
  253. package/dist/public/assets/_Tjc2w7pG.js +1 -0
  254. package/dist/public/assets/_Un6ZS8VK.js +1 -0
  255. package/dist/public/assets/{_-tIChhHp.js → _VlEKRWlm.js} +1 -1
  256. package/dist/public/assets/_VlEKRWlm.js.br +0 -0
  257. package/dist/public/assets/{_Bm-EJ483.js → _YShYV2y4.js} +1 -1
  258. package/dist/public/assets/_YShYV2y4.js.br +0 -0
  259. package/dist/public/assets/_ZKijEvNU.js +1 -0
  260. package/dist/public/assets/_ZWkymwZ8.js +1 -0
  261. package/dist/public/assets/_bnPm10fX.js +1 -0
  262. package/dist/public/assets/{_C3E0m_xC.js → _cH--Ry2T.js} +1 -1
  263. package/dist/public/assets/_cH--Ry2T.js.br +0 -0
  264. package/dist/public/assets/_dULwd-83.js +1 -0
  265. package/dist/public/assets/{_EFF0RahO.js → _fb-cSkNg.js} +1 -1
  266. package/dist/public/assets/_fb-cSkNg.js.br +0 -0
  267. package/dist/public/assets/{_Bltf0lwj.js → _gjXKiPz2.js} +1 -1
  268. package/dist/public/assets/_gjXKiPz2.js.br +0 -0
  269. package/dist/public/assets/_hZISiIh0.js +1 -0
  270. package/dist/public/assets/_j0MbYrcw.js +1 -0
  271. package/dist/public/assets/{_Bj18Vxoa.js → _mg_8sHU7.js} +1 -1
  272. package/dist/public/assets/_mg_8sHU7.js.br +0 -0
  273. package/dist/public/assets/{_BE3izGMt.js → _nif0UYC1.js} +1 -1
  274. package/dist/public/assets/_nif0UYC1.js.br +0 -0
  275. package/dist/public/assets/{_wRxJgfi3.js → _ocpKhGmH.js} +1 -1
  276. package/dist/public/assets/_ocpKhGmH.js.br +0 -0
  277. package/dist/public/assets/{_CYyCK3gr.js → _qthymfEm.js} +1 -1
  278. package/dist/public/assets/{__1CwTtq-.js → _rlSb3jYt.js} +2 -2
  279. package/dist/public/assets/_rlSb3jYt.js.br +0 -0
  280. package/dist/public/assets/{_C0yBoXDm.js → _thTd3DoV.js} +1 -1
  281. package/dist/public/assets/_thTd3DoV.js.br +0 -0
  282. package/dist/public/assets/_yTQokBA3.js +1 -0
  283. package/dist/public/assets/{_CzDl06G7.js → _yvNxTzJ_.js} +1 -1
  284. package/dist/public/assets/_yvNxTzJ_.js.br +0 -0
  285. package/dist/public/assets/files-view-CWdlTJZL.js +2 -0
  286. package/dist/public/assets/manage-workspace-BvB-DIwQ.js +2 -0
  287. package/dist/public/assets/new-bAfr06Ym.js +1 -0
  288. package/dist/public/assets/new-workspace-BGNyC8BU.js +2 -0
  289. package/dist/public/assets/review-view-Cnv9wu31.js +2 -0
  290. package/dist/public/assets/settings-bAfr06Ym.js +1 -0
  291. package/dist/public/assets/settings-page-DpFc3exI.js +2 -0
  292. package/dist/public/assets/{styles-rsoFYnOm.css → styles-DAX6ERBR.css} +1 -1
  293. package/dist/public/assets/styles-DAX6ERBR.css.br +0 -0
  294. package/dist/public/assets/w-bAfr06Ym.js +1 -0
  295. package/dist/public/assets/w._-B0qk5BkH.js +1 -0
  296. package/dist/public/assets/w._-B2U79M4Z.js +1 -0
  297. package/dist/public/assets/w._-bAfr06Ym.js +1 -0
  298. package/lib/setup/doctor.mjs +19 -2
  299. package/lib/setup/shims.mjs +62 -0
  300. package/package.json +1 -1
  301. package/dist/_DMIGXpem.js +0 -2
  302. package/dist/_Dbtwc-4J.js +0 -2
  303. package/dist/public/assets/_-tIChhHp.js.br +0 -0
  304. package/dist/public/assets/_3IZOU36R.js.br +0 -0
  305. package/dist/public/assets/_3LigOO1r.js +0 -1
  306. package/dist/public/assets/_53vvCtB9.js.br +0 -0
  307. package/dist/public/assets/_8F1hZg30.js +0 -1
  308. package/dist/public/assets/_8GJ-PBB-.js +0 -1
  309. package/dist/public/assets/_AF2pgiJE.js +0 -1
  310. package/dist/public/assets/_B-VYcrqc.js.br +0 -0
  311. package/dist/public/assets/_B-wjov_Z.js +0 -1
  312. package/dist/public/assets/_B23iifIa.js.br +0 -0
  313. package/dist/public/assets/_B2gvN5eE.js +0 -1
  314. package/dist/public/assets/_B31SsJ2H.js +0 -1
  315. package/dist/public/assets/_B3ioypfU.js +0 -1
  316. package/dist/public/assets/_B3zvGVOr.js +0 -1
  317. package/dist/public/assets/_B4KBgFQJ.js +0 -1
  318. package/dist/public/assets/_B4UPSzSe.js +0 -1
  319. package/dist/public/assets/_B5w-PFzL.js.br +0 -0
  320. package/dist/public/assets/_B704FqW-.js.br +0 -0
  321. package/dist/public/assets/_B7RTaeWh.js.br +0 -0
  322. package/dist/public/assets/_B8WsOiDp.js +0 -1
  323. package/dist/public/assets/_B9QxmB8p.js.br +0 -0
  324. package/dist/public/assets/_B9l6-SS5.js +0 -1
  325. package/dist/public/assets/_BAcvIhfz.js.br +0 -0
  326. package/dist/public/assets/_BBDxD-rC.js.br +0 -0
  327. package/dist/public/assets/_BChbCwWm.js.br +0 -0
  328. package/dist/public/assets/_BDnmZTGe.js +0 -1
  329. package/dist/public/assets/_BE3izGMt.js.br +0 -0
  330. package/dist/public/assets/_BH15mqpr.js.br +0 -0
  331. package/dist/public/assets/_BHTNZeRn.js.br +0 -0
  332. package/dist/public/assets/_BIt6tvPi.js.br +0 -0
  333. package/dist/public/assets/_BJxnfQcd.js.br +0 -0
  334. package/dist/public/assets/_BKuPpEpl.js.br +0 -0
  335. package/dist/public/assets/_BN3pboD3.js +0 -1
  336. package/dist/public/assets/_BQ9vuNgN.js +0 -1
  337. package/dist/public/assets/_BWhs553r.js.br +0 -0
  338. package/dist/public/assets/_BY2Fd-ai.js +0 -1
  339. package/dist/public/assets/_BZ5WB2jH.js +0 -1
  340. package/dist/public/assets/_BZDlyKDT.js.br +0 -0
  341. package/dist/public/assets/_B_6D3GJa.js +0 -1
  342. package/dist/public/assets/_BdZ9i3Bd.js +0 -1
  343. package/dist/public/assets/_Bffx--rk.js +0 -1
  344. package/dist/public/assets/_BiA2OZOl.js +0 -1
  345. package/dist/public/assets/_Bj18Vxoa.js.br +0 -0
  346. package/dist/public/assets/_BjrAjvOn.js +0 -1
  347. package/dist/public/assets/_BkQCadEV.js +0 -1
  348. package/dist/public/assets/_Bltf0lwj.js.br +0 -0
  349. package/dist/public/assets/_Bm-EJ483.js.br +0 -0
  350. package/dist/public/assets/_BndAJZwW.js.br +0 -0
  351. package/dist/public/assets/_Bq2kj2t3.js +0 -1
  352. package/dist/public/assets/_BqPqaeUo.js.br +0 -0
  353. package/dist/public/assets/_BqZMlemw.js.br +0 -0
  354. package/dist/public/assets/_Bsdn_9V_.js.br +0 -0
  355. package/dist/public/assets/_Bu5hgjmu.js.br +0 -0
  356. package/dist/public/assets/_BuGkNNaL.js +0 -1
  357. package/dist/public/assets/_BuQ2ay9z.js.br +0 -0
  358. package/dist/public/assets/_BwsgtEeq.js.br +0 -0
  359. package/dist/public/assets/_Bxgu50JS.js.br +0 -0
  360. package/dist/public/assets/_ByANtHYy.js +0 -1
  361. package/dist/public/assets/_ByDMN1SH.js.br +0 -0
  362. package/dist/public/assets/_BzRks6mQ.js +0 -1
  363. package/dist/public/assets/_Bzd4BveK.js +0 -1
  364. package/dist/public/assets/_C-iQnfOW.js.br +0 -0
  365. package/dist/public/assets/_C0yBoXDm.js.br +0 -0
  366. package/dist/public/assets/_C2zk28wV.js +0 -1
  367. package/dist/public/assets/_C3E0m_xC.js.br +0 -0
  368. package/dist/public/assets/_C6vrNkj_.js.br +0 -0
  369. package/dist/public/assets/_C9C-3hXG.js +0 -1
  370. package/dist/public/assets/_CB811mfH.js.br +0 -0
  371. package/dist/public/assets/_CCuLPWZW.js.br +0 -0
  372. package/dist/public/assets/_CGSqFdZV.js +0 -1
  373. package/dist/public/assets/_CGbnwvi6.js +0 -1
  374. package/dist/public/assets/_CJBfnXPc.js.br +0 -0
  375. package/dist/public/assets/_CKFNF1bt.js +0 -1
  376. package/dist/public/assets/_CL7o_nRC.js +0 -1
  377. package/dist/public/assets/_CO7GkttO.js +0 -1
  378. package/dist/public/assets/_CSqMt_yB.js +0 -1
  379. package/dist/public/assets/_CT3v6Oze.js.br +0 -0
  380. package/dist/public/assets/_CV1g9tqF.js +0 -1
  381. package/dist/public/assets/_CYMRiGMt.js +0 -1
  382. package/dist/public/assets/_CZLvdLqX.js +0 -1
  383. package/dist/public/assets/_CZyU6zlW.js.br +0 -0
  384. package/dist/public/assets/_C_hw80DQ.js.br +0 -0
  385. package/dist/public/assets/_CeSQyrMz.js.br +0 -0
  386. package/dist/public/assets/_CfPha1FH.js.br +0 -0
  387. package/dist/public/assets/_CfpvYRrS.js +0 -1
  388. package/dist/public/assets/_Che6-ZVy.js +0 -1
  389. package/dist/public/assets/_CiCC4SAB.js.br +0 -0
  390. package/dist/public/assets/_Cn8rkyXq.js.br +0 -0
  391. package/dist/public/assets/_CnWm9a_o.js.br +0 -0
  392. package/dist/public/assets/_Cnb9K9XY.js +0 -1
  393. package/dist/public/assets/_CnkmJKZH.js.br +0 -0
  394. package/dist/public/assets/_CoVyqWOC.js.br +0 -0
  395. package/dist/public/assets/_CqJdpoBK.js.br +0 -0
  396. package/dist/public/assets/_Cu-SfhdL.js.br +0 -0
  397. package/dist/public/assets/_CuKCWxtd.js.br +0 -0
  398. package/dist/public/assets/_CvbIq7kc.js +0 -1
  399. package/dist/public/assets/_CxPGS3y4.js +0 -1
  400. package/dist/public/assets/_Cyqw1SYV.js.br +0 -0
  401. package/dist/public/assets/_CyyVMlPp.js +0 -1
  402. package/dist/public/assets/_CzDUXeLr.js +0 -1
  403. package/dist/public/assets/_CzDl06G7.js.br +0 -0
  404. package/dist/public/assets/_D-7MOklF.js.br +0 -0
  405. package/dist/public/assets/_D-MrkdQv.js +0 -1
  406. package/dist/public/assets/_D3dAzn-U.js.br +0 -0
  407. package/dist/public/assets/_D3zgkNcZ.js.br +0 -0
  408. package/dist/public/assets/_D4yHrw0x.js.br +0 -0
  409. package/dist/public/assets/_DAGoF4RD.js +0 -1
  410. package/dist/public/assets/_DBUH1PtY.js +0 -1
  411. package/dist/public/assets/_DChbhtm7.js.br +0 -0
  412. package/dist/public/assets/_DDDEt2Cn.js +0 -1
  413. package/dist/public/assets/_DEVUMpy9.js +0 -1
  414. package/dist/public/assets/_DI2YhTfn.js +0 -1
  415. package/dist/public/assets/_DJmXTsXM.js.br +0 -0
  416. package/dist/public/assets/_DLNSQLre.js +0 -1
  417. package/dist/public/assets/_DPDpLf-R.js.br +0 -0
  418. package/dist/public/assets/_DVbq8rez.js.br +0 -0
  419. package/dist/public/assets/_DVuEGjB6.js.br +0 -0
  420. package/dist/public/assets/_DWYNR6FP.js.br +0 -0
  421. package/dist/public/assets/_DWn9Bk4p.js.br +0 -0
  422. package/dist/public/assets/_D_qMHeyF.js.br +0 -0
  423. package/dist/public/assets/_D_vDaILt.js +0 -1
  424. package/dist/public/assets/_DahEvrx7.js.br +0 -0
  425. package/dist/public/assets/_DdpvFyoD.js.br +0 -0
  426. package/dist/public/assets/_DgFgoB4_.js.br +0 -0
  427. package/dist/public/assets/_Dho8D73M.js.br +0 -0
  428. package/dist/public/assets/_DiUYcYna.js +0 -1
  429. package/dist/public/assets/_DjIcKKrW.js.br +0 -0
  430. package/dist/public/assets/_DkZVAXow.js +0 -1
  431. package/dist/public/assets/_Do-dGY2X.js.br +0 -0
  432. package/dist/public/assets/_DrTiWDUU.js.br +0 -0
  433. package/dist/public/assets/_DtBP9JxD.js +0 -1
  434. package/dist/public/assets/_DtiK3IDe.js.br +0 -0
  435. package/dist/public/assets/_Dtj0n4Ea.js.br +0 -0
  436. package/dist/public/assets/_Dv4QXsaq.js +0 -1
  437. package/dist/public/assets/_DvgVDKmX.js.br +0 -0
  438. package/dist/public/assets/_DxArLWxr.js +0 -1
  439. package/dist/public/assets/_DzasBNTs.js +0 -1
  440. package/dist/public/assets/_Dzml7-SO.js.br +0 -0
  441. package/dist/public/assets/_EFF0RahO.js.br +0 -0
  442. package/dist/public/assets/_Er1jCr0y.js.br +0 -0
  443. package/dist/public/assets/_I-rWUgTm.js.br +0 -0
  444. package/dist/public/assets/_I1G0J8iR.js.br +0 -0
  445. package/dist/public/assets/_Luj-nE2Q.js.br +0 -0
  446. package/dist/public/assets/_MTzS-gYR.js +0 -1
  447. package/dist/public/assets/_NCVKEfbF.js.br +0 -0
  448. package/dist/public/assets/_Nt06UfoF.js +0 -1
  449. package/dist/public/assets/_SNGXdx8T.js.br +0 -0
  450. package/dist/public/assets/_U-ItOyuk.js +0 -1
  451. package/dist/public/assets/_UM6RqjfN.js.br +0 -0
  452. package/dist/public/assets/_XM_G2_E8.js +0 -1
  453. package/dist/public/assets/_YIEXDh5T.js.br +0 -0
  454. package/dist/public/assets/_Z8XAsbav.js.br +0 -0
  455. package/dist/public/assets/__1CwTtq-.js.br +0 -0
  456. package/dist/public/assets/__UZfk21C.js +0 -1
  457. package/dist/public/assets/_ahnzi6Vi.js.br +0 -0
  458. package/dist/public/assets/_b8vSuisY.js +0 -1
  459. package/dist/public/assets/_cAFV8cvO.js +0 -1
  460. package/dist/public/assets/_dZl98lyu.js.br +0 -0
  461. package/dist/public/assets/_dbwi0e20.js +0 -1
  462. package/dist/public/assets/_dfb9VWND.js +0 -1
  463. package/dist/public/assets/_dhxtcjZT.js.br +0 -0
  464. package/dist/public/assets/_ezrIBxd5.js.br +0 -0
  465. package/dist/public/assets/_l6WNhzBy.js +0 -1
  466. package/dist/public/assets/_mcdXVs94.js.br +0 -0
  467. package/dist/public/assets/_r3IeTPfk.js +0 -1
  468. package/dist/public/assets/_sctMXY82.js +0 -1
  469. package/dist/public/assets/_ukc-Ezd5.js +0 -1
  470. package/dist/public/assets/_wRxJgfi3.js.br +0 -0
  471. package/dist/public/assets/_wk1rSbkR.js +0 -1
  472. package/dist/public/assets/_xAWxeLFd.js +0 -1
  473. package/dist/public/assets/_xOecD2Ye.js +0 -1
  474. package/dist/public/assets/_xqGqu7PK.js +0 -1
  475. package/dist/public/assets/_z-BjZNm3.js.br +0 -0
  476. package/dist/public/assets/_z2ZJ8cb5.js +0 -1
  477. package/dist/public/assets/_zCVRc38b.js +0 -1
  478. package/dist/public/assets/files-view-DvsrAin-.js +0 -2
  479. package/dist/public/assets/manage-workspace-DpiGdfaH.js +0 -2
  480. package/dist/public/assets/new-B9cFSdMl.js +0 -1
  481. package/dist/public/assets/new-workspace-DOoDlvjo.js +0 -2
  482. package/dist/public/assets/review-view-C4Iv_eUU.js +0 -2
  483. package/dist/public/assets/settings-B9cFSdMl.js +0 -1
  484. package/dist/public/assets/settings-page-CIKTh5Y6.js +0 -2
  485. package/dist/public/assets/styles-rsoFYnOm.css.br +0 -0
  486. package/dist/public/assets/w-B9cFSdMl.js +0 -1
  487. package/dist/public/assets/w._-B9cFSdMl.js +0 -1
  488. package/dist/public/assets/w._-BSzTwkWw.js +0 -1
  489. package/dist/public/assets/w._-BWgHxva-.js +0 -1
@@ -758,6 +758,67 @@ var STEPS = [
758
758
  db.exec(`
759
759
  ALTER TABLE session_messages ADD COLUMN follows TEXT;
760
760
  ALTER TABLE session_messages ADD COLUMN held TEXT;
761
+ `);
762
+ }
763
+ },
764
+ {
765
+ version: 13,
766
+ name: "closes kept, and notices",
767
+ up(db) {
768
+ db.exec(`
769
+ ALTER TABLE closed_sessions ADD COLUMN how TEXT NOT NULL DEFAULT 'done';
770
+
771
+ CREATE TABLE session_messages_new (
772
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
773
+ to_session TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
774
+ from_session TEXT,
775
+ from_label TEXT,
776
+ kind TEXT NOT NULL CHECK (kind IN ('message', 'reply', 'closed', 'notice')),
777
+ body TEXT NOT NULL,
778
+ wants_reply INTEGER NOT NULL DEFAULT 0,
779
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
780
+ delivered_at TEXT,
781
+ group_id TEXT REFERENCES session_groups(id) ON DELETE SET NULL,
782
+ answers TEXT,
783
+ urgent INTEGER NOT NULL DEFAULT 0,
784
+ by_send INTEGER NOT NULL DEFAULT 0,
785
+ follows TEXT,
786
+ held TEXT
787
+ );
788
+ INSERT INTO session_messages_new (id, to_session, from_session, from_label, kind, body, wants_reply, created_at, delivered_at, group_id, answers, urgent, by_send, follows, held)
789
+ SELECT id, to_session, from_session, from_label, kind, body, wants_reply, created_at, delivered_at, group_id, answers, urgent, by_send, follows, held FROM session_messages;
790
+ DROP TABLE session_messages;
791
+ ALTER TABLE session_messages_new RENAME TO session_messages;
792
+ CREATE INDEX session_messages_to ON session_messages(to_session);
793
+ CREATE INDEX session_messages_from ON session_messages(from_session);
794
+ `);
795
+ }
796
+ },
797
+ {
798
+ version: 14,
799
+ name: "message log",
800
+ up(db) {
801
+ db.exec(`
802
+ CREATE TABLE message_log (
803
+ id INTEGER PRIMARY KEY,
804
+ workspace_id TEXT,
805
+ to_session TEXT NOT NULL,
806
+ to_label TEXT,
807
+ from_session TEXT,
808
+ from_label TEXT,
809
+ kind TEXT NOT NULL,
810
+ body TEXT NOT NULL,
811
+ wants_reply INTEGER NOT NULL DEFAULT 0,
812
+ urgent INTEGER NOT NULL DEFAULT 0,
813
+ created_at TEXT NOT NULL,
814
+ delivered_at TEXT,
815
+ delivered TEXT,
816
+ done_at TEXT,
817
+ outcome TEXT
818
+ );
819
+ CREATE INDEX message_log_to ON message_log(to_session);
820
+ CREATE INDEX message_log_from ON message_log(from_session);
821
+ CREATE INDEX message_log_workspace ON message_log(workspace_id, created_at);
761
822
  `);
762
823
  }
763
824
  }
@@ -2027,6 +2088,61 @@ function unreachableText(host, why) {
2027
2088
  return `Can't reach ${host} (${why}): connect to its network or VPN`;
2028
2089
  }
2029
2090
  //#endregion
2091
+ //#region lib/setup/shims.mjs
2092
+ /** Version managers whose shims stand in for a tool. A shim is the
2093
+ * manager's own binary (mise links every shim to itself) or a script that
2094
+ * hands off to it, so neither its path nor its target is the install: the
2095
+ * manager's `which` names that. A tool removed from its manager leaves the
2096
+ * shim until a reshim. `installs` and `reshim` are a node global's, which
2097
+ * is what work's own install is. */
2098
+ function versionManagers() {
2099
+ return [
2100
+ {
2101
+ id: "mise",
2102
+ shim: (file, real) => path.basename(real) === "mise",
2103
+ which: (real, name) => [real, ["which", name]],
2104
+ installs: /\/mise\/installs\/node\//,
2105
+ reshim: "mise reshim"
2106
+ },
2107
+ {
2108
+ id: "asdf",
2109
+ shim: (file) => /\/\.asdf\/shims$/.test(path.dirname(file)),
2110
+ which: (real, name) => ["asdf", ["which", name]],
2111
+ installs: /\/\.asdf\/installs\/nodejs\//,
2112
+ reshim: "asdf reshim nodejs"
2113
+ },
2114
+ {
2115
+ id: "nodenv",
2116
+ shim: (file) => /\/\.nodenv\/shims$/.test(path.dirname(file)),
2117
+ which: (real, name) => ["nodenv", ["which", name]],
2118
+ installs: /\/\.nodenv\/versions\//,
2119
+ reshim: "nodenv rehash"
2120
+ }
2121
+ ];
2122
+ }
2123
+ /** What the shim at `file` runs: the path its manager names; null when it
2124
+ * names none (the tool is gone, or no version of it is set), so the shim
2125
+ * runs nothing; undefined when `file` is no shim, or its manager could not
2126
+ * be asked (missing, hung), since unknown is not gone. Asked from the home
2127
+ * folder: the answer for a folder with no config of its own, wherever this
2128
+ * process was started. */
2129
+ function shimTarget(file, name = path.basename(file)) {
2130
+ let real = file;
2131
+ try {
2132
+ real = fs.realpathSync(file);
2133
+ } catch {}
2134
+ const manager = versionManagers().find((m) => m.shim(file, real));
2135
+ if (!manager) return void 0;
2136
+ const [bin, argv] = manager.which(real, name);
2137
+ const out = spawnSync(bin, argv, {
2138
+ encoding: "utf8",
2139
+ timeout: 2e3,
2140
+ cwd: os.homedir()
2141
+ });
2142
+ if (out.error || out.status === null) return void 0;
2143
+ return out.status === 0 && out.stdout.trim() || null;
2144
+ }
2145
+ //#endregion
2030
2146
  //#region lib/setup/doctor.mjs
2031
2147
  var home$1 = os.homedir();
2032
2148
  /** Agent CLI install dirs from meta (`~` → home). Same list the service and
@@ -2211,14 +2327,29 @@ function discoverAgents(fresh = false) {
2211
2327
  }
2212
2328
  return agentsMemo.value;
2213
2329
  }
2214
- const value = scanAgents();
2330
+ const value = scanAgents(fresh);
2215
2331
  agentsMemo = {
2216
2332
  at: Date.now(),
2217
2333
  value
2218
2334
  };
2219
2335
  return value;
2220
2336
  }
2221
- function scanAgents() {
2337
+ /** Whether each shim found had nothing behind it, by path. Asking its
2338
+ * manager is a process (about 30 ms) inside a synchronous scan, so an
2339
+ * answer serves five minutes of them; a `fresh` scan asks again. */
2340
+ var SHIM_MEMO_MS = 3e5;
2341
+ var shimMemo = /* @__PURE__ */ new Map();
2342
+ function deadShim(file, name, fresh) {
2343
+ const kept = shimMemo.get(file);
2344
+ if (!fresh && kept && Date.now() - kept.at < SHIM_MEMO_MS) return kept.dead;
2345
+ const dead = shimTarget(file, name) === null;
2346
+ shimMemo.set(file, {
2347
+ at: Date.now(),
2348
+ dead
2349
+ });
2350
+ return dead;
2351
+ }
2352
+ function scanAgents(fresh = false) {
2222
2353
  const dirs = setupDirs();
2223
2354
  const seenDirs = /* @__PURE__ */ new Set();
2224
2355
  const seen = /* @__PURE__ */ new Map();
@@ -2246,6 +2377,7 @@ function scanAgents() {
2246
2377
  } catch {
2247
2378
  continue;
2248
2379
  }
2380
+ if (deadShim(full, name, fresh)) continue;
2249
2381
  const bin = hit.bins.find((b) => name.startsWith(b));
2250
2382
  seen.set(name, {
2251
2383
  family: hit,
@@ -9277,6 +9409,17 @@ function noteBackground(sessionId, work) {
9277
9409
  function onTurnEnd(fn) {
9278
9410
  turnEndListeners.add(fn);
9279
9411
  }
9412
+ /** Told of a turn that ended failing (rate limited, signed out), with
9413
+ * why (`onTurnFailed`). */
9414
+ var failedListeners = /* @__PURE__ */ new Set();
9415
+ /** A session's turn ended failing, as its hook said (`HookRead.failed`):
9416
+ * it sits at its prompt until someone carries it on. */
9417
+ function onTurnFailed(fn) {
9418
+ failedListeners.add(fn);
9419
+ }
9420
+ function noteTurnFailed(sessionId, why) {
9421
+ for (const fn of failedListeners) fn(sessionId, why);
9422
+ }
9280
9423
  function endTurn(sessionId) {
9281
9424
  const earlier = foldedMessages.get(sessionId) ?? [];
9282
9425
  foldedMessages.delete(sessionId);
@@ -9488,7 +9631,7 @@ function publishChange(sessionId) {
9488
9631
  const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
9489
9632
  if (row?.workspace_id) {
9490
9633
  const workspaceId = row.workspace_id;
9491
- import("./_DMIGXpem.js").then((m) => m.notifySessionsChanged(workspaceId));
9634
+ import("./_CVNGN2QO.js").then((m) => m.notifySessionsChanged(workspaceId));
9492
9635
  return;
9493
9636
  }
9494
9637
  publish("sessions.changed");
@@ -10219,9 +10362,12 @@ function readHook$6(p, reported, _state) {
10219
10362
  if (event === "StopFailure") {
10220
10363
  const label = FAILURES[str$1(p.error)] ?? "The turn failed";
10221
10364
  const details = str$1(p.error_details);
10365
+ const summary = cleanSummary(details ? `${label}: ${details}` : label);
10222
10366
  return {
10223
10367
  reason: "attention",
10224
- summary: cleanSummary(details ? `${label}: ${details}` : label)
10368
+ summary,
10369
+ failed: str$1(p.agent_id) ? void 0 : summary,
10370
+ conversation: str$1(p.session_id) || void 0
10225
10371
  };
10226
10372
  }
10227
10373
  const read = readClaudeStyle(p, reported);
@@ -10237,8 +10383,8 @@ function readHook$6(p, reported, _state) {
10237
10383
  } else if (event === "Stop") {
10238
10384
  const running = backgroundWork(p);
10239
10385
  if (running) read.background = { running };
10240
- read.conversation = str$1(p.session_id) || void 0;
10241
10386
  }
10387
+ if (event === "Stop" || event === "UserPromptSubmit") read.conversation = str$1(p.session_id) || void 0;
10242
10388
  return read;
10243
10389
  }
10244
10390
  /** The kinds of `background_tasks` entry Claude wakes up for as they end
@@ -10318,6 +10464,8 @@ var claude = {
10318
10464
  headless: (args) => hasArg(args, "-p", "--print"),
10319
10465
  resumeFlags: (id) => ["--resume", id],
10320
10466
  steerKeys: ["Enter"],
10467
+ submitsBehindPaste: true,
10468
+ quotesPastes: true,
10321
10469
  interruptKeys: ["Escape"],
10322
10470
  envPrefixes: ["CLAUDE", "AI_AGENT"],
10323
10471
  startupQuestions: [{
@@ -10545,6 +10693,7 @@ var codex = {
10545
10693
  launchFlags,
10546
10694
  resumeFlags: (id) => ["resume", id],
10547
10695
  steerKeys: ["Enter"],
10696
+ submitsBehindPaste: true,
10548
10697
  interruptKeys: ["Escape"],
10549
10698
  reportsWorking: () => true,
10550
10699
  headless: (args) => hasArg(args, "exec", "e", "review"),
@@ -10812,6 +10961,7 @@ var copilot = {
10812
10961
  }],
10813
10962
  reportsWorking: () => true,
10814
10963
  steerKeys: ["Enter"],
10964
+ submitsBehindPaste: true,
10815
10965
  interruptKeys: ["C-c"],
10816
10966
  headless: (args) => hasArg(args, "-p", "--prompt"),
10817
10967
  envPrefixes: ["COPILOT_"],
@@ -11291,6 +11441,7 @@ var grok = {
11291
11441
  },
11292
11442
  reportsWorking: registered,
11293
11443
  promptAsArgv: true,
11444
+ submitsBehindPaste: true,
11294
11445
  interruptKeys: ["C-c"],
11295
11446
  headless: (args) => hasArg(args, "-p", "--single", "--prompt-file", "--prompt-json", "agent"),
11296
11447
  envPrefixes: ["GROK_"],
@@ -11469,6 +11620,7 @@ var opencode = {
11469
11620
  launchEnv: () => ({ OPENCODE_CONFIG_CONTENT: pluginConfig() }),
11470
11621
  reportsWorking: installed$1,
11471
11622
  steerKeys: ["Enter"],
11623
+ submitsBehindPaste: true,
11472
11624
  interruptKeys: ["Escape", "Escape"],
11473
11625
  headless: (args) => hasArg(args, "run"),
11474
11626
  envPrefixes: ["OPENCODE_"],
@@ -11485,7 +11637,10 @@ var meta = meta_default;
11485
11637
  * prompt, the one way Pi stops on the user. A Pi older than
11486
11638
  * `agent_settled` (0.80.4) never sends it, so a run's end waits a moment
11487
11639
  * for one and reports itself when none comes. The extension posts its own
11488
- * reports, as opencode's plugin does; `readHook` only unwraps them. */
11640
+ * reports, as opencode's plugin does; `readHook` only unwraps them. It
11641
+ * also answers Pi's folder-trust question (`project_trust`, which only a
11642
+ * user's or a command-line extension is asked): a flag would do
11643
+ * (`--approve`), but a Pi from before the question exits on it. */
11489
11644
  var EXTENSION = (host, appPort) => `// Generated by work. Reports this
11490
11645
  // session's working / needs-input / done state to the app; edits are
11491
11646
  // overwritten. Port and session id come from the env tmux gave the pane.
@@ -11544,6 +11699,10 @@ export default function (pi) {
11544
11699
  if (ctx?.isIdle && !ctx.isIdle()) return;
11545
11700
  return settle();
11546
11701
  });
11702
+ // A workspace is the user's own folder, made to run agents in: trusted
11703
+ // for this run, never remembered. Left to ask, Pi opens on a menu that
11704
+ // takes a first prompt's paste, whose Enter then picks its answer.
11705
+ pi.on("project_trust", () => ({ trusted: "yes" }));
11547
11706
  pi.on("ui_prompt_start", (event) =>
11548
11707
  post("waiting", "attention", event?.title || "Waiting for input"),
11549
11708
  );
@@ -11592,6 +11751,7 @@ var AGENTS = [
11592
11751
  launchFlags: () => ["-e", extensionFile()],
11593
11752
  reportsWorking: installed,
11594
11753
  steerKeys: ["Enter"],
11754
+ submitsBehindPaste: true,
11595
11755
  interruptKeys: ["Escape"],
11596
11756
  headless: (args) => hasArg(args, "-p", "--print", "--mode"),
11597
11757
  envPrefixes: ["PI_"],
@@ -11654,6 +11814,14 @@ function interruptKeys(id) {
11654
11814
  function promptAsArgv(id) {
11655
11815
  return agentFor(id)?.promptAsArgv ?? false;
11656
11816
  }
11817
+ /** The keys that send a paste may go with it (`submitsBehindPaste`). */
11818
+ function submitsBehindPaste(id) {
11819
+ return agentFor(id)?.submitsBehindPaste ?? false;
11820
+ }
11821
+ /** A message's head is typed ahead of its paste (`quotesPastes`). */
11822
+ function quotesPastes(id) {
11823
+ return agentFor(id)?.quotesPastes ?? false;
11824
+ }
11657
11825
  /** Whether an instance's CLI, run with these arguments, is a one-shot
11658
11826
  * job rather than a session (`headless`). */
11659
11827
  function runsHeadless(id, args) {
@@ -17423,79 +17591,159 @@ function renameSession(id, title) {
17423
17591
  }
17424
17592
  /** Close a session, and with it every session it started and theirs
17425
17593
  * (`parent_id`), unless `keepChildren`: those then stand on their own.
17426
- * Returns the ids closed. */
17427
- async function killSession(id, keepChildren = false) {
17594
+ * Each that can be resumed is kept as it was (`keepClosed`): the session
17595
+ * itself as `how` says, the ones it started as closed with it, so a lead
17596
+ * the user closes, or one whose account ran out, does not take its
17597
+ * team's conversations with it. Returns the ids closed. */
17598
+ async function killSession(id, keepChildren = false, how = "closed") {
17428
17599
  const session = getSession(id);
17429
17600
  if (!session) return [];
17430
17601
  const family = keepChildren ? [id] : [id, ...descendantsOf(id)];
17431
- for (const member of family) await disposeSession(member);
17602
+ db.prepare(`DELETE FROM closed_sessions WHERE closed_at < strftime('%Y-%m-%dT%H:%M:%fZ', 'now', '${REOPEN_WITHIN}')`).run();
17603
+ for (const member of family) {
17604
+ keepClosed(member, member === id ? how : "closed");
17605
+ await disposeSession(member);
17606
+ }
17432
17607
  notifySessionsChanged(session.workspace_id);
17433
17608
  return family;
17434
17609
  }
17435
- /** How long a session closed for being done can be reopened: a lead's
17436
- * follow-ups come as the user reviews its result, the same day or so. */
17610
+ /** How long a closed session can be started again: a lead's follow-ups
17611
+ * come as the user reviews its result, the same day or so. */
17437
17612
  var REOPEN_WITHIN = "-7 days";
17438
17613
  /** A turn's end reported the conversation it ran in. */
17439
17614
  function noteConversation(id, conversation) {
17440
17615
  db.prepare("UPDATE sessions SET conversation = ? WHERE id = ? AND conversation IS NOT ?").run(conversation, id, conversation);
17441
17616
  }
17442
- /** A session work closed for being done, while a message may reopen it. */
17617
+ /** A closed session that can still be started again (`reopenSession`). */
17443
17618
  function closedSession(id) {
17444
17619
  return get(`SELECT * FROM closed_sessions WHERE id = ?
17445
17620
  AND closed_at >= strftime('%Y-%m-%dT%H:%M:%fZ', 'now', '${REOPEN_WITHIN}')`, id);
17446
17621
  }
17447
- /** Whether a message reopens the session on its conversation once work
17448
- * has closed it: its CLI can resume one, and said which it was in. */
17622
+ /** Whether a session can be started again on its conversation: its CLI
17623
+ * can resume one, and said which it was in. */
17449
17624
  function reopenable(s) {
17450
17625
  return !!s.conversation && canResume(s.agent);
17451
17626
  }
17627
+ /** Keep `id` as it is in closed_sessions, about to close. One closed for
17628
+ * being done is kept whatever it is, so a message to it can say why it
17629
+ * does not reopen; any other only if it can be started again. */
17630
+ function keepClosed(id, how) {
17631
+ const s = getSession(id);
17632
+ if (!s?.workspace_id || how === "closed" && !reopenable(s)) return;
17633
+ db.prepare(`INSERT OR REPLACE INTO closed_sessions (id, workspace_id, agent, title, parent_id, launch_dir, launch_mode, summary, conversation, created_at, how)
17634
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(s.id, s.workspace_id, s.agent, s.title, s.parent_id, s.launch_dir, s.launch_mode, s.summary, s.conversation, s.created_at, how);
17635
+ }
17452
17636
  /** Close a session work is done with (server/team), keeping what starts
17453
17637
  * it again on its own conversation (`reopenSession`): the lead that
17454
17638
  * started it may yet follow up, once the user has read its result. The
17455
17639
  * sessions it started go with it, as with any close. */
17456
- async function retireSession(id) {
17457
- const s = getSession(id);
17458
- if (!s) return [];
17459
- db.prepare(`DELETE FROM closed_sessions WHERE closed_at < strftime('%Y-%m-%dT%H:%M:%fZ', 'now', '${REOPEN_WITHIN}')`).run();
17460
- if (s.workspace_id) db.prepare(`INSERT OR REPLACE INTO closed_sessions (id, workspace_id, agent, title, parent_id, launch_dir, launch_mode, summary, conversation, created_at)
17461
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(s.id, s.workspace_id, s.agent, s.title, s.parent_id, s.launch_dir, s.launch_mode, s.summary, s.conversation, s.created_at);
17462
- return killSession(id);
17463
- }
17464
- /** Start a session work closed for being done again, for a message to
17465
- * it: its row as it was (under its parent, while that is here) and its
17466
- * CLI on the conversation it had (`resumeFlags`), ready for the message
17467
- * before this returns. Refuses, saying what to do instead, one that
17468
- * cannot be: its CLI cannot resume, work never learned its conversation,
17469
- * or the folder it ran in (a topic's worktree) is gone — a conversation
17470
- * is its folder's to Claude. */
17471
- async function reopenSession(id) {
17640
+ function retireSession(id) {
17641
+ return killSession(id, false, "done");
17642
+ }
17643
+ var START_AGAIN = `start a new session (\`work session new\`) and brief it; \`--keep\` keeps one open for follow-ups`;
17644
+ /** The instance a session starts again as: its own, or `agent`, another
17645
+ * instance of the same CLI (claude2 for claude: another account), whose
17646
+ * resume takes the same conversation where that is shared. */
17647
+ function resumeAs(id, current, agent) {
17648
+ if (!agent || agent === current) return current;
17649
+ if (!isKnownAgent(agent) || agentFamily(agent) !== agentFamily(current)) throw httpError(409, `${id} ran ${agentLabel(current)}: it resumes only on another instance of the same CLI (\`work agent\` lists them), not ${agent}`);
17650
+ return agent;
17651
+ }
17652
+ /** Start a closed session again on the conversation it had: its row as it
17653
+ * was, as `agent` if given (`resumeAs`), under the session that started
17654
+ * it while that is here, else under `adopt` (the session reopening it, of
17655
+ * the same workspace), and its CLI on that conversation (`resumeFlags`),
17656
+ * ready for a message before this returns. Refuses, saying what to do
17657
+ * instead, one that cannot be: its CLI cannot resume, work never learned
17658
+ * its conversation, or the folder it ran in (a topic's worktree) is gone
17659
+ * — a conversation is its folder's to Claude. */
17660
+ async function reopenSession(id, opts = {}) {
17472
17661
  const closed = closedSession(id);
17473
17662
  if (!closed) throw httpError(404, `no session ${id}`);
17474
- const instead = `start a new session (\`work session new\`) and brief it; \`--keep\` keeps one open for follow-ups`;
17475
- if (!reopenable(closed)) throw httpError(409, `${id} closed once it was done with, and ${canResume(closed.agent) ? "work never learned its conversation" : `${agentLabel(closed.agent)} cannot be reopened on its conversation`}: ${instead}`);
17663
+ if (!reopenable(closed)) throw httpError(409, `${id} closed once it was done with, and ${canResume(closed.agent) ? "work never learned its conversation" : `${agentLabel(closed.agent)} cannot be reopened on its conversation`}: ${START_AGAIN}`);
17664
+ const agent = resumeAs(id, closed.agent, opts.agent);
17476
17665
  const ws = get("SELECT path, status FROM workspaces WHERE id = ?", closed.workspace_id);
17477
17666
  if (!ws || ws.status !== "active") throw httpError(409, `${id}'s workspace is archived`);
17478
- if (closed.launch_dir && launchDir(closed, ws.path) === ws.path) throw httpError(409, `${id} ran in ${closed.launch_dir}, which is gone, and its conversation with it: ${instead}`);
17479
- const parent = closed.parent_id ? getSession(closed.parent_id) : void 0;
17667
+ if (closed.launch_dir && launchDir(closed, ws.path) === ws.path) throw httpError(409, `${id} ran in ${closed.launch_dir}, which is gone, and its conversation with it: ${START_AGAIN}`);
17668
+ const parent = [closed.parent_id, opts.adopt].map((p) => p && p !== id ? getSession(p) : void 0).find((p) => p?.workspace_id === closed.workspace_id);
17480
17669
  db.prepare(`INSERT INTO sessions (id, workspace_id, agent, title, created_at, parent_id, launch_dir, launch_mode, summary, conversation)
17481
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(closed.id, closed.workspace_id, closed.agent, closed.title, closed.created_at, parent?.workspace_id === closed.workspace_id ? parent.id : null, closed.launch_dir, closed.launch_mode, closed.summary, closed.conversation);
17670
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(closed.id, closed.workspace_id, agent, closed.title, closed.created_at, parent?.id ?? null, closed.launch_dir, closed.launch_mode, closed.summary, closed.conversation);
17482
17671
  const session = getSession(id);
17483
17672
  const env = cleanEnv();
17484
17673
  await ensureTmuxServer();
17485
17674
  clearAgentPhase(id);
17486
17675
  await launchDetached(session, ws.path, env, { resume: closed.conversation });
17487
- if (!await tmux([
17488
- "has-session",
17489
- "-t",
17490
- tmuxName(id)
17491
- ], env).then(() => true, () => false)) {
17492
- await killSession(id);
17493
- throw httpError(409, `${id}'s ${agentLabel(closed.agent)} could not reopen its conversation (${closed.conversation}): ${instead}`);
17676
+ if (!await paneAlive(id, env)) {
17677
+ await disposeSession(id);
17678
+ throw httpError(409, `${id}'s ${agentLabel(agent)} could not reopen its conversation (${closed.conversation})${agent === closed.agent ? "" : `: ${agent} may keep its conversations apart from ${closed.agent}'s`}. ${START_AGAIN.replace(/^./, (c) => c.toUpperCase())}`);
17494
17679
  }
17495
17680
  db.prepare("DELETE FROM closed_sessions WHERE id = ?").run(id);
17496
17681
  notifySessionsChanged(closed.workspace_id);
17497
17682
  return session;
17498
17683
  }
17684
+ /** Start a running session's CLI again on its own conversation, as
17685
+ * `agent` if given (`resumeAs`): one stuck at its prompt because its
17686
+ * account hit a limit goes on as another account's. Its row, what is
17687
+ * queued for it and what it owes stay (server/messages keeps them). */
17688
+ async function restartSession(id, agent) {
17689
+ const s = getSession(id);
17690
+ if (!s) throw httpError(404, `no session ${id}`);
17691
+ if (!reopenable(s)) throw httpError(409, `${id} cannot start again on its conversation: ${canResume(s.agent) ? "work has not learned it yet (it comes with the first prompt's hook)" : `${agentLabel(s.agent)} cannot resume one`}`);
17692
+ const next = resumeAs(id, s.agent, agent);
17693
+ const wsPath = workspacePath(s.workspace_id);
17694
+ if (!wsPath) throw httpError(409, `${id}'s workspace is gone`);
17695
+ if (s.launch_dir && launchDir(s, wsPath) === wsPath) throw httpError(409, `${id} ran in ${s.launch_dir}, which is gone, and its conversation with it: ${START_AGAIN}`);
17696
+ const env = cleanEnv();
17697
+ await tmux([
17698
+ "kill-session",
17699
+ "-t",
17700
+ tmuxName(id)
17701
+ ], env).catch(() => {});
17702
+ forgetPanes();
17703
+ clearTmuxStarted(id);
17704
+ clearAgentPhase(id);
17705
+ db.prepare("UPDATE sessions SET agent = ? WHERE id = ?").run(next, id);
17706
+ const session = getSession(id);
17707
+ await ensureTmuxServer();
17708
+ await launchDetached(session, wsPath, env, { resume: s.conversation });
17709
+ if (!await paneAlive(id, env)) {
17710
+ db.prepare("UPDATE sessions SET agent = ? WHERE id = ?").run(s.agent, id);
17711
+ notifySessionsChanged(s.workspace_id);
17712
+ throw httpError(409, `${id}'s ${agentLabel(next)} could not resume its conversation (${s.conversation})${next === s.agent ? "" : `: ${next} may keep its conversations apart from ${s.agent}'s`}, and its pane has closed: \`work session reopen ${id}\` tries again`);
17713
+ }
17714
+ notifySessionsChanged(s.workspace_id);
17715
+ return session;
17716
+ }
17717
+ /** What a session is, open or closed (`work session list <id>`, `log`):
17718
+ * undefined for one work does not know, or no longer keeps. */
17719
+ function sessionInfo(id) {
17720
+ const live = getSession(id);
17721
+ const closed = live ? void 0 : closedSession(id);
17722
+ const s = live ?? closed;
17723
+ if (!s) return;
17724
+ return {
17725
+ id: s.id,
17726
+ agent: s.agent,
17727
+ title: s.title,
17728
+ workspace: s.workspace_id,
17729
+ parent: s.parent_id,
17730
+ summary: s.summary,
17731
+ /** How and when it closed; null while open. */
17732
+ closed: closed ? {
17733
+ how: closed.how,
17734
+ at: closed.closed_at
17735
+ } : null,
17736
+ /** It can start again on its conversation (`work session reopen`). */
17737
+ reopenable: reopenable(s)
17738
+ };
17739
+ }
17740
+ function paneAlive(id, env) {
17741
+ return tmux([
17742
+ "has-session",
17743
+ "-t",
17744
+ tmuxName(id)
17745
+ ], env).then(() => true, () => false);
17746
+ }
17499
17747
  /** Every session `id` started, and theirs, nearest first. */
17500
17748
  function descendantsOf(id) {
17501
17749
  return all(`WITH RECURSIVE kids(id, depth) AS (
@@ -17591,7 +17839,7 @@ function notifySessionsChanged(workspaceId) {
17591
17839
  async function emitSessionsChanged(workspaceId) {
17592
17840
  try {
17593
17841
  const states = await sessionStates();
17594
- const { teamsOf } = await import("./_Dbtwc-4J.js");
17842
+ const { teamsOf } = await import("./_hjIYs3Gy.js");
17595
17843
  publish("sessions.changed", {
17596
17844
  workspaceId,
17597
17845
  sessions: listSessions(workspaceId).map((s) => ({
@@ -17613,7 +17861,37 @@ async function killWorkspaceSessions(workspaceId) {
17613
17861
  * that passes one through, typing the rest into the pane as keys. */
17614
17862
  var PASTE_UNSAFE = /[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g;
17615
17863
  /** Type text into a session's tmux (bracketed paste + Enter), creating it if needed. */
17616
- async function sendToSession(id, raw, size, submit = ["Enter"]) {
17864
+ async function sendToSession(...args) {
17865
+ const { sent } = await pasteToSession(...args);
17866
+ await sent;
17867
+ }
17868
+ /** Each session's send under way. One at a time: a paste landing ahead of
17869
+ * the last one's keys joins its prompt, and its own keys then press Enter
17870
+ * on whatever that prompt set off. */
17871
+ var sendTail = /* @__PURE__ */ new Map();
17872
+ /** `sendToSession` for a caller that waits only for the text to be in the
17873
+ * pane: `sent` settles once the keys that send it have followed, which
17874
+ * for most CLIs waits out the paste being drawn (`pressSubmit`). */
17875
+ async function pasteToSession(id, raw, size, submit = ["Enter"], lead) {
17876
+ const last = sendTail.get(id);
17877
+ let free = () => {};
17878
+ const mine = new Promise((resolve) => free = resolve);
17879
+ sendTail.set(id, mine);
17880
+ await last;
17881
+ const end = () => {
17882
+ if (sendTail.get(id) === mine) sendTail.delete(id);
17883
+ free();
17884
+ };
17885
+ try {
17886
+ const { sent } = await pasteNow(id, raw, size, submit, lead);
17887
+ return { sent: sent.finally(end) };
17888
+ } catch (err) {
17889
+ end();
17890
+ throw err;
17891
+ }
17892
+ }
17893
+ async function pasteNow(id, raw, size, submit, lead) {
17894
+ const typed = lead?.replace(PASTE_UNSAFE, "").replace(/\s*[\r\n]+\s*/g, " ").trim().replace(/;$/, "; ");
17617
17895
  const text = raw.replace(PASTE_UNSAFE, "");
17618
17896
  const session = getSession(id);
17619
17897
  if (!session) throw new Error("unknown session");
@@ -17630,8 +17908,9 @@ async function sendToSession(id, raw, size, submit = ["Enter"]) {
17630
17908
  await ensureTmuxServer();
17631
17909
  clearAgentPhase(id);
17632
17910
  if (promptAsArgv(session.agent)) {
17911
+ const prompt = typed ? `${typed}\n\n${text}` : text;
17633
17912
  const file = path.join(os.tmpdir(), `work-prompt-${id}-${Math.random().toString(36).slice(2, 10)}`);
17634
- fs.writeFileSync(file, text, {
17913
+ fs.writeFileSync(file, prompt, {
17635
17914
  mode: 384,
17636
17915
  flag: "wx"
17637
17916
  });
@@ -17639,7 +17918,7 @@ async function sendToSession(id, raw, size, submit = ["Enter"]) {
17639
17918
  await tmux(newSessionArgs(session, wsPath, "-d", {
17640
17919
  prompt: {
17641
17920
  file,
17642
- text
17921
+ text: prompt
17643
17922
  },
17644
17923
  size
17645
17924
  }), env);
@@ -17648,7 +17927,7 @@ async function sendToSession(id, raw, size, submit = ["Enter"]) {
17648
17927
  throw err;
17649
17928
  }
17650
17929
  markTmuxStarted(id);
17651
- return;
17930
+ return { sent: Promise.resolve() };
17652
17931
  }
17653
17932
  await launchDetached(session, wsPath, env, { size });
17654
17933
  }
@@ -17663,13 +17942,7 @@ async function sendToSession(id, raw, size, submit = ["Enter"]) {
17663
17942
  if (asking) throw httpError(409, `${asking}: answer it in the terminal, then send again`);
17664
17943
  }
17665
17944
  const buffer = `work-send-${Math.random().toString(36).slice(2, 8)}`;
17666
- await tmux([
17667
- "load-buffer",
17668
- "-b",
17669
- buffer,
17670
- "-"
17671
- ], env, { stdin: text });
17672
- await tmux([
17945
+ const pasted = [
17673
17946
  "paste-buffer",
17674
17947
  "-p",
17675
17948
  "-d",
@@ -17677,9 +17950,42 @@ async function sendToSession(id, raw, size, submit = ["Enter"]) {
17677
17950
  buffer,
17678
17951
  "-t",
17679
17952
  name
17680
- ], env);
17681
- await waitStill(name, env, PASTE_SETTLE_MS);
17953
+ ];
17954
+ const keys = typed ? [
17955
+ "send-keys",
17956
+ "-t",
17957
+ name,
17958
+ "-l",
17959
+ typed
17960
+ ] : [];
17961
+ if (text || !typed) await tmux([
17962
+ "load-buffer",
17963
+ "-b",
17964
+ buffer,
17965
+ "-"
17966
+ ], env, { stdin: text });
17967
+ const paste = !typed ? pasted : text ? [
17968
+ ...keys,
17969
+ ";",
17970
+ ...pasted
17971
+ ] : keys;
17972
+ const behind = submitsBehindPaste(session.agent) && submit.length ? 1 : 0;
17973
+ await tmux(behind ? [
17974
+ ...paste,
17975
+ ";",
17976
+ "send-keys",
17977
+ "-t",
17978
+ name,
17979
+ submit[0]
17980
+ ] : paste, env);
17981
+ return { sent: pressSubmit(name, env, submit, behind) };
17982
+ }
17983
+ /** The keys that send what was just pasted into `name`, past the
17984
+ * `pressed` that went with the paste. */
17985
+ async function pressSubmit(name, env, submit, pressed) {
17986
+ if (!pressed) await waitStill(name, env, PASTE_SETTLE_MS);
17682
17987
  for (const [i, key] of submit.entries()) {
17988
+ if (i < pressed) continue;
17683
17989
  if (i) await sleep(KEY_GAP_MS);
17684
17990
  await tmux([
17685
17991
  "send-keys",
@@ -19247,13 +19553,19 @@ ${repoLines}
19247
19553
  every result since they last wrote, not just the newest, and what is
19248
19554
  still due. A message waits for the turn under way to end,
19249
19555
  which can take hours: a correction or a stop goes with \`--now\` (into
19250
- that turn, at its next step) or \`--interrupt\` (stops it first). \`work session fanout --agent <id>… --prompt "<task {}>" <item>…\`
19556
+ that turn, at its next step) or \`--interrupt\` (stops it first), as
19557
+ one with \`--no-reply\` does by itself; one already queued goes so with
19558
+ \`send <id> --now\` and no text, never sent twice. \`work session fanout --agent <id>… --prompt "<task {}>" <item>…\`
19251
19559
  starts a group, a few at a time, whose replies come back as one prompt
19252
19560
  (\`work session team\` shows how far they are). \`--topic <name>\` gives each a
19253
19561
  topic branch of its own; send paths, not pasted files. They close once
19254
19562
  answered and done with, as each reply says (\`--keep\`, or
19255
19563
  \`work session keep <id>\` later, keeps one), and a message to a closed
19256
- Claude or Codex one reopens it on its own conversation. For a quick
19564
+ Claude or Codex one reopens it on its own conversation; one closed
19565
+ otherwise (with its lead, by the user), or stuck on its account's limit,
19566
+ \`work session reopen <id> [--agent <another instance>]\` starts again
19567
+ on it, and \`work session log [<id>]\` shows what went to and from
19568
+ one and how each message went. For a quick
19257
19569
  sweep in your own CLI, its own subagents are cheaper. All of this is
19258
19570
  this workspace's only; an agent in another can be messaged when the user
19259
19571
  asks, and only while it runs (\`work workspaces\` lists them, \`work session list <workspace>\`
@@ -19271,4 +19583,4 @@ ${repoLines}
19271
19583
  `;
19272
19584
  }
19273
19585
  //#endregion
19274
- export { reopenSession as $, setInstance as $n, readBody as $r, notePushActivity as $t, closedSession as A, onFinished as An, setDisabledAgents as Ar, authGithub as At, killWorkspaceSessions as B, turnPhase as Bn, firewallProbe as Br, readBlobAt as Bt, workspaceBranches as C, noteActivity$1 as Cn, changePref as Cr, installServer as Ct, beginCreation as D, noteTyped as Dn, getSetting as Dr, serverList as Dt, agentCaller as E, notePermissionMode as En, enabledAgents as Er, serverById as Et, ensureTmuxServer as F, setExpecting as Fn, ghKnownHosts as Fr, refreshGithub as Ft, markTmuxStarted as G, agentFromCommand as Gn, catalogPin as Gr, setPoints as Gt, listPanes as H, turnSince as Hn, TOOLS as Hr, reviewWaiting as Ht, forgetPanes as I, setScrapedPhase as In, miseInstalls as Ir, removeTool as It, notifySessionsChanged as J, ACCENT_RE as Jn, applyPrefChange as Jr, commentFolder as Jt, newSessionArgs as K, agentLabel as Kn, parseAgentId as Kr, startSnapSweep as Kt, getSession as L, setSessionViewers as Ln, miseVersions as Lr, runStreaming as Lt, creationOf as M, onTurnEnd as Mn, setSetting as Mr, installMise as Mt, descendantsOf as N, sessionWatched as Nn, discoverAgents as Nr, installTool as Nt, cleanEnv as O, noteUserAnswered as On, isKnownAgent as Or, sharing as Ot, disposeSessions as P, setAgentPhase as Pn, doctor as Pr, logoutGithub as Pt, renameSession as Q, normalizeAccent as Qn, httpError as Qr, hotBatchMinMs as Qt, interruptSession as R, settleQuietWorking as Rn, which as Rr, updateTool as Rt, withProgressOp as S, lastTypedAt as Sn, allPrefs as Sr, installKey as St, hookToken as T, noteInterrupt as Tn, disabledAgents as Tr, removeServer as Tt, listPanesWithin as U, agentBadge as Un, agentById as Ur, workspaceDiff as Ut, launchDir as V, turnSettling as Vn, PROJECT_TOOLS as Vr, readFileAt as Vt, listSessions as W, agentFamily as Wn, agentLabel$1 as Wr, workspaceSections as Wt, ownWorkspaceOnly as X, iconSvg as Xn, FRAME_HEADERS as Xr, sectionFor as Xt, onSessionDispose as Y, getInstance as Yn, FRAME_ANCESTORS as Yr, markBranch as Yt, panePids as Z, manifest as Zn, checked as Zr, dismissPr as Zt, retryMaterialize as _, agentPhase as _n, removeHost as _r, stopServers as _t, ensureUntrackedCache as a, db as ai, interruptKeys as an, headOid as ar, tmuxWasStarted as at, sweepTrash as b, hookReportedAt as bn, WORKSPACE_PREFS as br, forgetCustomServer as bt, insertPendingWorkspace as c, ownsBranchOf as ci, steerKeys as cn, repoCatalog as cr, workspaceProcs as ct, progress as d, git as di, readCache as dn, addHost as dr, lspQuery as dt, publish as ei, refreshPrsBatch as en, deleteSubscription as er, reopenable as et, progressSince as f, tmux as fi, writeCache as fn, configuredHosts as fr, lspQueryOf as ft, resumePendingWorkspaces as g, activityOf as gn, normalizeHost as gr, stopAllServers as gt, removeRepo as h, withLock as hi, realInside as hn, isValidHost as hr, runningServers as ht, deleteWorkspace as i, all as ii, AGENTS as in, validSubscription as ir, tmuxName as it, createSession as j, onPhaseChange as jn, setPref as jr, installAgent as jt, clearTmuxStarted as k, notifyEventOn as kn, preferredAgent as kr, whileInstalling as kt, listWorkspaces as l, ensureAllCacheConfig as li, blankRow as ln, repoDefaultBranch as lr, killServers as lt, queueMaterialize as m, swr as mi, inside as mn, forgetToken as mr, lspWarm as mt, barePath as n, subscribe as ni, workspacePrs as nn, saveSubscription as nr, sendToSession as nt, gcBares as o, get as oi, readHookPayload as on, pendingSsoOrgs as or, killWorkspaceProc as ot, pruneLaneBranch as p, config as pi, cleanSummary as pn, ensureGitCredentials as pr, lspUses as pt, noteConversation as q, agentMeta as qn, toolById as qr, diffStamp as qt, createWorkspace as r, subscriberCount as ri, noteActivity as rn, sendPush as rr, sessionStates as rt, getWorkspace as s, workspacePath as si, reportsWorking as sn, repoBranches as sr, portsByWorkspace as st, addRepo as t, publishJson as ti, withoutDismissed as tn, pushPublicKey as tr, retireSession as tt, otherWorkspaceBranches as u, TMUX_SOCKET as ui, credentialStamp as un, DEFAULT_HOST as ur, lspDiagnostics as ut, revParse as v, clearAgentPhase as vn, unreachableRepos as vr, addCustomServer as vt, ensureAllPushHooks as w, noteBackground as wn, deleteSetting as wr, lspEnabled as wt, syncAgentsMd as x, interruptedSinceReport as xn, agentChoices as xr, forgetProbes as xt, setWorkspaceStatus as y, hookPhase as yn, PREF_MAX as yr, allServers as yt, killSession as z, summaryOf as zn, bornOut as zr, fileChanges as zt };
19586
+ export { renameSession as $, agentMeta as $n, toolById as $r, sectionFor as $t, closedSession as A, notePermissionMode as An, deleteSetting as Ar, serverList as At, killWorkspaceSessions as B, setAgentPhase as Bn, doctor as Br, runStreaming as Bt, workspaceBranches as C, hookPhase as Cn, removeHost as Cr, forgetCustomServer as Ct, beginCreation as D, noteActivity$1 as Dn, agentChoices as Dr, lspEnabled as Dt, agentCaller as E, lastTypedAt as En, WORKSPACE_PREFS as Er, installServer as Et, ensureTmuxServer as F, onFinished as Fn, preferredAgent as Fr, installMise as Ft, markTmuxStarted as G, summaryOf as Gn, bornOut as Gr, reviewWaiting as Gt, listPanes as H, setScrapedPhase as Hn, miseInstalls as Hr, fileChanges as Ht, forgetPanes as I, onPhaseChange as In, setDisabledAgents as Ir, installTool as It, notifySessionsChanged as J, turnSince as Jn, TOOLS as Jr, setPoints as Jt, newSessionArgs as K, turnPhase as Kn, firewallProbe as Kr, workspaceDiff as Kt, getSession as L, onTurnEnd as Ln, setPref as Lr, logoutGithub as Lt, creationOf as M, noteTyped as Mn, enabledAgents as Mr, whileInstalling as Mt, descendantsOf as N, noteUserAnswered as Nn, getSetting as Nr, authGithub as Nt, cleanEnv as O, noteBackground as On, allPrefs as Or, removeServer as Ot, disposeSessions as P, notifyEventOn as Pn, isKnownAgent as Pr, installAgent as Pt, pasteToSession as Q, agentLabel as Qn, parseAgentId as Qr, markBranch as Qt, interruptSession as R, onTurnFailed as Rn, setSetting as Rr, refreshGithub as Rt, withProgressOp as S, clearAgentPhase as Sn, normalizeHost as Sr, allServers as St, hookToken as T, interruptedSinceReport as Tn, PREF_MAX as Tr, installKey as Tt, listPanesWithin as U, setSessionViewers as Un, miseVersions as Ur, readBlobAt as Ut, launchDir as V, setExpecting as Vn, ghKnownHosts as Vr, updateTool as Vt, listSessions as W, settleQuietWorking as Wn, which as Wr, readFileAt as Wt, ownWorkspaceOnly as X, agentFamily as Xn, agentLabel$1 as Xr, diffStamp as Xt, onSessionDispose as Y, agentBadge as Yn, agentById as Yr, startSnapSweep as Yt, panePids as Z, agentFromCommand as Zn, catalogPin as Zr, commentFolder as Zt, retryMaterialize as _, git as _i, cleanSummary as _n, addHost as _r, lspWarm as _t, ensureUntrackedCache as a, readBody as ai, workspacePrs as an, setInstance as ar, sessionInfo as at, sweepTrash as b, swr as bi, activityOf as bn, forgetToken as br, stopServers as bt, insertPendingWorkspace as c, subscribe as ci, interruptKeys as cn, saveSubscription as cr, tmuxWasStarted as ct, progress as d, db as di, reportsWorking as dn, headOid as dr, workspaceProcs as dt, applyPrefChange as ei, dismissPr as en, ACCENT_RE as er, reopenSession as et, progressSince as f, get as fi, steerKeys as fn, pendingSsoOrgs as fr, killServers as ft, resumePendingWorkspaces as g, TMUX_SOCKET as gi, writeCache as gn, DEFAULT_HOST as gr, lspUses as gt, removeRepo as h, ensureAllCacheConfig as hi, readCache as hn, repoDefaultBranch as hr, lspQueryOf as ht, deleteWorkspace as i, httpError as ii, withoutDismissed as in, normalizeAccent as ir, sendToSession as it, createSession as j, noteTurnFailed as jn, disabledAgents as jr, sharing as jt, clearTmuxStarted as k, noteInterrupt as kn, changePref as kr, serverById as kt, listWorkspaces as l, subscriberCount as li, quotesPastes as ln, sendPush as lr, killWorkspaceProc as lt, queueMaterialize as m, ownsBranchOf as mi, credentialStamp as mn, repoCatalog as mr, lspQuery as mt, barePath as n, FRAME_HEADERS as ni, notePushActivity as nn, iconSvg as nr, restartSession as nt, gcBares as o, publish as oi, noteActivity as on, deleteSubscription as or, sessionStates as ot, pruneLaneBranch as p, workspacePath as pi, blankRow as pn, repoBranches as pr, lspDiagnostics as pt, noteConversation as q, turnSettling as qn, PROJECT_TOOLS as qr, workspaceSections as qt, createWorkspace as r, checked as ri, refreshPrsBatch as rn, manifest as rr, retireSession as rt, getWorkspace as s, publishJson as si, AGENTS as sn, pushPublicKey as sr, tmuxName as st, addRepo as t, FRAME_ANCESTORS as ti, hotBatchMinMs as tn, getInstance as tr, reopenable as tt, otherWorkspaceBranches as u, all as ui, readHookPayload as un, validSubscription as ur, portsByWorkspace as ut, revParse as v, tmux as vi, inside as vn, configuredHosts as vr, runningServers as vt, ensureAllPushHooks as w, hookReportedAt as wn, unreachableRepos as wr, forgetProbes as wt, syncAgentsMd as x, withLock as xi, agentPhase as xn, isValidHost as xr, addCustomServer as xt, setWorkspaceStatus as y, config as yi, realInside as yn, ensureGitCredentials as yr, stopAllServers as yt, killSession as z, sessionWatched as zn, discoverAgents as zr, removeTool as zt };