@dylanpiercey/work 0.2.59 → 0.2.61

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 (487) hide show
  1. package/bin/cli/session.mjs +200 -14
  2. package/dist/{_CpS1Baba.js → _B9Ht5uEb.js} +69 -69
  3. package/dist/{_xM2b0RL4.js → _BL9uMFqY.js} +114 -5
  4. package/dist/_BOUuiLtz.js +2 -0
  5. package/dist/_C-c452mk.js +2 -0
  6. package/dist/{_B5_rwv2K.js → _C_xIwbCY.js} +197 -34
  7. package/dist/index.mjs +1334 -1206
  8. package/dist/public/assets/{_CsbRqvms.js → _1M9MHpr1.js} +4 -4
  9. package/dist/public/assets/_1M9MHpr1.js.br +0 -0
  10. package/dist/public/assets/{_Co446-rW.js → _1iHjriqb.js} +1 -1
  11. package/dist/public/assets/_1iHjriqb.js.br +0 -0
  12. package/dist/public/assets/_1qBtkRvx.js +1 -0
  13. package/dist/public/assets/_2nQe3LjC.js +1 -0
  14. package/dist/public/assets/_4ewvphym.js +1 -0
  15. package/dist/public/assets/{_Cg-bWtiG.js → _5He5o5t7.js} +1 -1
  16. package/dist/public/assets/_5He5o5t7.js.br +0 -0
  17. package/dist/public/assets/{_BhgJGAbd.js → _6ewv3mA5.js} +1 -1
  18. package/dist/public/assets/_6ewv3mA5.js.br +0 -0
  19. package/dist/public/assets/{_DSe4_LQN.js → _6rWYgbg6.js} +1 -1
  20. package/dist/public/assets/_6rWYgbg6.js.br +0 -0
  21. package/dist/public/assets/_7t7yKWpa.js +1 -0
  22. package/dist/public/assets/{_DaJbbuzw.js → _B-3-Kwot.js} +1 -1
  23. package/dist/public/assets/_B-3-Kwot.js.br +0 -0
  24. package/dist/public/assets/{_CUMjc4ko.js → _B0HNJv7u.js} +1 -1
  25. package/dist/public/assets/_B0HNJv7u.js.br +0 -0
  26. package/dist/public/assets/{_CFdGaGi4.js → _B6PUN-tp.js} +1 -1
  27. package/dist/public/assets/_B6PUN-tp.js.br +0 -0
  28. package/dist/public/assets/{_BKc6-2k7.js → _B6VYaIpc.js} +1 -1
  29. package/dist/public/assets/_B6VYaIpc.js.br +0 -0
  30. package/dist/public/assets/_B6ceJBbO.js +1 -0
  31. package/dist/public/assets/_B7NviIFq.js +1 -0
  32. package/dist/public/assets/_B8gE8WA6.js +86 -0
  33. package/dist/public/assets/_B8gE8WA6.js.br +0 -0
  34. package/dist/public/assets/_B9ws5F2C.js +1 -0
  35. package/dist/public/assets/{_DPNNKe_X.js → _BDnGUv95.js} +1 -1
  36. package/dist/public/assets/{_3Zk_u3Fa.js → _BEtdOczI.js} +1 -1
  37. package/dist/public/assets/_BEtdOczI.js.br +0 -0
  38. package/dist/public/assets/{_BhJY4B1T.js → _BGRrgyaE.js} +2 -2
  39. package/dist/public/assets/_BGRrgyaE.js.br +0 -0
  40. package/dist/public/assets/{_D7F2Iz4z.js → _BGxqjHZb.js} +1 -1
  41. package/dist/public/assets/_BGxqjHZb.js.br +0 -0
  42. package/dist/public/assets/_BHygu0_A.js +1 -0
  43. package/dist/public/assets/_BHypB4VD.js +1 -0
  44. package/dist/public/assets/{_C7yRAx2N.js → _BIKcay8j.js} +1 -1
  45. package/dist/public/assets/_BIKcay8j.js.br +0 -0
  46. package/dist/public/assets/{_DpH21SZG.js → _BJx3EMC_.js} +1 -1
  47. package/dist/public/assets/_BJx3EMC_.js.br +0 -0
  48. package/dist/public/assets/_BM3KTUUE.js +1 -0
  49. package/dist/public/assets/{_BPq3X_iB.js → _BPWsZBZv.js} +1 -1
  50. package/dist/public/assets/_BPWsZBZv.js.br +0 -0
  51. package/dist/public/assets/_BQbkNtg1.js +1 -0
  52. package/dist/public/assets/_BWcnWDQk.js +1 -0
  53. package/dist/public/assets/{_DcQ3joDA.js → _BY7cv0ys.js} +1 -1
  54. package/dist/public/assets/_BY7cv0ys.js.br +0 -0
  55. package/dist/public/assets/{_8Ta51A9A.js → _BYvxQm8J.js} +1 -1
  56. package/dist/public/assets/_BYvxQm8J.js.br +0 -0
  57. package/dist/public/assets/{_C1_hy9fH.js → _BaD4WyB1.js} +1 -1
  58. package/dist/public/assets/_BaD4WyB1.js.br +0 -0
  59. package/dist/public/assets/_BcG7z1_1.js +1 -0
  60. package/dist/public/assets/{_CZncd8ZW.js → _BdHPe50y.js} +1 -1
  61. package/dist/public/assets/_BdHPe50y.js.br +0 -0
  62. package/dist/public/assets/{_BVK6Eit1.js → _BddCrZGZ.js} +1 -1
  63. package/dist/public/assets/_BddCrZGZ.js.br +0 -0
  64. package/dist/public/assets/_BdeatKVZ.js +1 -0
  65. package/dist/public/assets/{_B8Vf1DG9.js → _BebRyIKd.js} +1 -1
  66. package/dist/public/assets/_BebRyIKd.js.br +0 -0
  67. package/dist/public/assets/{_bKLeCUW7.js → _BhQ7Emig.js} +1 -1
  68. package/dist/public/assets/_BhQ7Emig.js.br +0 -0
  69. package/dist/public/assets/_BhcB0Jvd.js +1 -0
  70. package/dist/public/assets/_Bis2U6ul.js +1 -0
  71. package/dist/public/assets/_BnKs6Y7b.js +1 -0
  72. package/dist/public/assets/{_DqDfHR6G.js → _BtkYehYU.js} +1 -1
  73. package/dist/public/assets/_Btl8aL-I.js +1 -0
  74. package/dist/public/assets/{_7N53s3zu.js → _BtlULsgn.js} +1 -1
  75. package/dist/public/assets/_BtlULsgn.js.br +0 -0
  76. package/dist/public/assets/_BvDuaiKP.js +1 -0
  77. package/dist/public/assets/{_sNh-WAFz.js → _Bxjcg3sg.js} +1 -1
  78. package/dist/public/assets/_Bxjcg3sg.js.br +0 -0
  79. package/dist/public/assets/_Byy6u2e7.js +1 -0
  80. package/dist/public/assets/{_BKMH1b4E.js → _C0HZTgdl.js} +1 -1
  81. package/dist/public/assets/_C0HZTgdl.js.br +0 -0
  82. package/dist/public/assets/_C0Jef_3I.js +1 -0
  83. package/dist/public/assets/_C1mN-2aV.js +1 -0
  84. package/dist/public/assets/{_AcB4kvsj.js → _C7K8numy.js} +1 -1
  85. package/dist/public/assets/_C7afA5Pq.js +1 -0
  86. package/dist/public/assets/_C9ZuXn8H.js +1 -0
  87. package/dist/public/assets/_C9cXYWeE.js +1 -0
  88. package/dist/public/assets/_C9ozBH6U.js +1 -0
  89. package/dist/public/assets/_CAVEnS_f.js +1 -0
  90. package/dist/public/assets/_CBUTWKoU.js +1 -0
  91. package/dist/public/assets/_CC2BARPD.js +1 -0
  92. package/dist/public/assets/{_CG4I1SEi.js → _CC6W1hMq.js} +1 -1
  93. package/dist/public/assets/_CC6W1hMq.js.br +0 -0
  94. package/dist/public/assets/{_iuuyO61h.js → _CCf6C_ZP.js} +1 -1
  95. package/dist/public/assets/_CCf6C_ZP.js.br +0 -0
  96. package/dist/public/assets/_CCfbCJD0.js +1 -0
  97. package/dist/public/assets/{_BOCgwHYT.js → _CGGq6g--.js} +1 -1
  98. package/dist/public/assets/_CGGq6g--.js.br +0 -0
  99. package/dist/public/assets/_CGNUX808.js +1 -0
  100. package/dist/public/assets/{_DaqWCDLm.js → _CGfEXDbf.js} +1 -1
  101. package/dist/public/assets/_CGfEXDbf.js.br +0 -0
  102. package/dist/public/assets/{_BqtdPg8O.js → _CHAVfXDI.js} +1 -1
  103. package/dist/public/assets/_CHAVfXDI.js.br +0 -0
  104. package/dist/public/assets/_CHlWQtx9.js +1 -0
  105. package/dist/public/assets/{_CvZMFHLo.js → _CIgPn4df.js} +1 -1
  106. package/dist/public/assets/_CIgPn4df.js.br +0 -0
  107. package/dist/public/assets/_CImHsBRX.js +1 -0
  108. package/dist/public/assets/{_4SL45jq4.js → _CJ4GrTCz.js} +1 -1
  109. package/dist/public/assets/_CJ4GrTCz.js.br +0 -0
  110. package/dist/public/assets/{_B_ezh_nq.js → _CJC5kn96.js} +1 -1
  111. package/dist/public/assets/_CJC5kn96.js.br +0 -0
  112. package/dist/public/assets/{_Ci12JT5X.js → _CKBJswt8.js} +1 -1
  113. package/dist/public/assets/_CKBJswt8.js.br +0 -0
  114. package/dist/public/assets/{_gLnLncO7.js → _CM4a5-CR.js} +1 -1
  115. package/dist/public/assets/_CM4a5-CR.js.br +0 -0
  116. package/dist/public/assets/{_1X_NNEn-.js → _CN7EjN94.js} +1 -1
  117. package/dist/public/assets/_CN7EjN94.js.br +0 -0
  118. package/dist/public/assets/_CUL-wOvV.js +1 -0
  119. package/dist/public/assets/{_we71RMJp.js → _CVjgxkQ9.js} +1 -1
  120. package/dist/public/assets/_CVjgxkQ9.js.br +0 -0
  121. package/dist/public/assets/{_CNI18VGD.js → _CWUlXPKy.js} +1 -1
  122. package/dist/public/assets/_CWUlXPKy.js.br +0 -0
  123. package/dist/public/assets/_CYckbz_f.js +1 -0
  124. package/dist/public/assets/{_CJtv2_Li.js → _CbsneFgz.js} +1 -1
  125. package/dist/public/assets/_CbsneFgz.js.br +0 -0
  126. package/dist/public/assets/{_pwSQZ5i_.js → _Cc9MzNxF.js} +1 -1
  127. package/dist/public/assets/_Cc9MzNxF.js.br +0 -0
  128. package/dist/public/assets/{_Dn5nTUQ_.js → _Cdni-eWy.js} +1 -1
  129. package/dist/public/assets/{_CBx4k3QK.js → _CeMhDOSt.js} +2 -2
  130. package/dist/public/assets/_CeMhDOSt.js.br +0 -0
  131. package/dist/public/assets/_ChBDbmf7.js +1 -0
  132. package/dist/public/assets/_ChGQj9eR.js +1 -0
  133. package/dist/public/assets/_Chf8ZoVS.js +1 -0
  134. package/dist/public/assets/{_Bl1ScPIR.js → _Ck08fiPA.js} +1 -1
  135. package/dist/public/assets/_Ck08fiPA.js.br +0 -0
  136. package/dist/public/assets/_CkN9E0Xp.js +1 -0
  137. package/dist/public/assets/_Cl_zImN1.js +1 -0
  138. package/dist/public/assets/{_AmVi_0HE.js → _Cn7clqxy.js} +1 -1
  139. package/dist/public/assets/_Cn7clqxy.js.br +0 -0
  140. package/dist/public/assets/_CnIPZvpz.js +1 -0
  141. package/dist/public/assets/_Cp25PjdE.js +1 -0
  142. package/dist/public/assets/{_BY17lrSL.js → _CpuLnwfk.js} +1 -1
  143. package/dist/public/assets/_CpuLnwfk.js.br +0 -0
  144. package/dist/public/assets/{_CP1ZxN3w.js → _CqNUcaPa.js} +1 -1
  145. package/dist/public/assets/_CqNUcaPa.js.br +0 -0
  146. package/dist/public/assets/{_CPwJBHTb.js → _Cs0MriF4.js} +1 -1
  147. package/dist/public/assets/_Cs0MriF4.js.br +0 -0
  148. package/dist/public/assets/_Cu45JMqZ.js +1 -0
  149. package/dist/public/assets/{_DjfA69iQ.js → _CuKWFVdv.js} +1 -1
  150. package/dist/public/assets/_CuKWFVdv.js.br +0 -0
  151. package/dist/public/assets/{_CeG60zam.js → _Cvxy6Mq1.js} +1 -1
  152. package/dist/public/assets/_Cvxy6Mq1.js.br +0 -0
  153. package/dist/public/assets/{_C8FrBpAD.js → _CwrlFqhW.js} +1 -1
  154. package/dist/public/assets/_CwrlFqhW.js.br +0 -0
  155. package/dist/public/assets/_CxI0pSsi.js +1 -0
  156. package/dist/public/assets/_Cz0f9sHm.js +1 -0
  157. package/dist/public/assets/{_D5m_zffE.js → _D-VgQdXB.js} +5 -5
  158. package/dist/public/assets/_D-VgQdXB.js.br +0 -0
  159. package/dist/public/assets/{_Br0_MTJM.js → _D1dV1Q6j.js} +2 -2
  160. package/dist/public/assets/_D1dV1Q6j.js.br +0 -0
  161. package/dist/public/assets/_D1iAtMBs.js +1 -0
  162. package/dist/public/assets/{_DTdDqyr7.js → _D43dLMCh.js} +1 -1
  163. package/dist/public/assets/{_t3SfU__o.js → _D4lINOjT.js} +1 -1
  164. package/dist/public/assets/_D4lINOjT.js.br +0 -0
  165. package/dist/public/assets/_D4ueecmJ.js +1 -0
  166. package/dist/public/assets/_D5h6fRep.js +1 -0
  167. package/dist/public/assets/_D6IvPBfb.js +1 -0
  168. package/dist/public/assets/_D9ScGzNM.js +1 -0
  169. package/dist/public/assets/_D9u0Cq08.js +1 -0
  170. package/dist/public/assets/_DAh9xj4z.js +1 -0
  171. package/dist/public/assets/{_FOAXIW-8.js → _DCeEZcpj.js} +1 -1
  172. package/dist/public/assets/{_x_2XiBZV.js → _DCyBrQiT.js} +1 -1
  173. package/dist/public/assets/_DCyBrQiT.js.br +0 -0
  174. package/dist/public/assets/{_DQodfM-4.js → _DDJ3dt8-.js} +1 -1
  175. package/dist/public/assets/_DDJ3dt8-.js.br +0 -0
  176. package/dist/public/assets/{_C9PNZUds.js → _DEMvMjoa.js} +1 -1
  177. package/dist/public/assets/_DEMvMjoa.js.br +0 -0
  178. package/dist/public/assets/{_CY4z5b13.js → _DFhL3EEm.js} +1 -1
  179. package/dist/public/assets/_DFhL3EEm.js.br +0 -0
  180. package/dist/public/assets/_DGUxMgko.js +1 -0
  181. package/dist/public/assets/{_FBAUfM5a.js → _DHCrm5ed.js} +1 -1
  182. package/dist/public/assets/_DHCrm5ed.js.br +0 -0
  183. package/dist/public/assets/_DHUWNOjf.js +1 -0
  184. package/dist/public/assets/{_BF1mwsnt.js → _DHZP-s4_.js} +1 -1
  185. package/dist/public/assets/_DHZP-s4_.js.br +0 -0
  186. package/dist/public/assets/{_DitNEptQ.js → _DHqkwtr1.js} +1 -1
  187. package/dist/public/assets/_DHqkwtr1.js.br +0 -0
  188. package/dist/public/assets/{_CTHJm-Wd.js → _DIXlAgAo.js} +1 -1
  189. package/dist/public/assets/_DIXlAgAo.js.br +0 -0
  190. package/dist/public/assets/_DMVf4w58.js +1 -0
  191. package/dist/public/assets/{_Dt0Y6Z0q.js → _DMe9PjW_.js} +1 -1
  192. package/dist/public/assets/_DMe9PjW_.js.br +0 -0
  193. package/dist/public/assets/{_BFt0zsUG.js → _DN99neYY.js} +1 -1
  194. package/dist/public/assets/_DN99neYY.js.br +0 -0
  195. package/dist/public/assets/_DNInqNFa.js +1 -0
  196. package/dist/public/assets/_DNbAWwA5.js +1 -0
  197. package/dist/public/assets/{_BDSxe03w.js → _DNe5bCXT.js} +1 -1
  198. package/dist/public/assets/_DNe5bCXT.js.br +0 -0
  199. package/dist/public/assets/{_DmhLMcPt.js → _DNvhs-9s.js} +1 -1
  200. package/dist/public/assets/_DNvhs-9s.js.br +0 -0
  201. package/dist/public/assets/{_B-2HnuWG.js → _DOz8rbsD.js} +1 -1
  202. package/dist/public/assets/_DOz8rbsD.js.br +0 -0
  203. package/dist/public/assets/{_C8DRWUsq.js → _DUt5QxFc.js} +1 -1
  204. package/dist/public/assets/_DUt5QxFc.js.br +0 -0
  205. package/dist/public/assets/_DXMQSCF1.js +1 -0
  206. package/dist/public/assets/_DXNlyOmS.js +1 -0
  207. package/dist/public/assets/{_COwVKOPA.js → _DZAbjGP5.js} +1 -1
  208. package/dist/public/assets/_DZAbjGP5.js.br +0 -0
  209. package/dist/public/assets/{_BKUbZiwz.js → _D_Yn427h.js} +1 -1
  210. package/dist/public/assets/_D_Yn427h.js.br +0 -0
  211. package/dist/public/assets/_D_deUIjY.js +1 -0
  212. package/dist/public/assets/_D_f11l7s.js +1 -0
  213. package/dist/public/assets/_Da0PYXht.js +1 -0
  214. package/dist/public/assets/_DaAdED3q.js +1 -0
  215. package/dist/public/assets/{_CqOC8g8u.js → _DbBSulnh.js} +1 -1
  216. package/dist/public/assets/_DbBSulnh.js.br +0 -0
  217. package/dist/public/assets/{_BqGVhCOR.js → _DdI3WOOu.js} +1 -1
  218. package/dist/public/assets/_DdI3WOOu.js.br +0 -0
  219. package/dist/public/assets/{_dScmp_KZ.js → _DgHYvonX.js} +1 -1
  220. package/dist/public/assets/_DgHYvonX.js.br +0 -0
  221. package/dist/public/assets/_DhN7o6Ne.js +1 -0
  222. package/dist/public/assets/{_BppRZeGP.js → _DmZ5cT_v.js} +1 -1
  223. package/dist/public/assets/_DmZ5cT_v.js.br +0 -0
  224. package/dist/public/assets/{_D_yB_0Mo.js → _DnNiNorU.js} +1 -1
  225. package/dist/public/assets/_DnNiNorU.js.br +0 -0
  226. package/dist/public/assets/_DpN3KO3M.js +1 -0
  227. package/dist/public/assets/{_D9vOt1H4.js → _Dr_Skm22.js} +1 -1
  228. package/dist/public/assets/_Dr_Skm22.js.br +0 -0
  229. package/dist/public/assets/_Ds9CTiBL.js +1 -0
  230. package/dist/public/assets/{_DGGfdFqg.js → _DuYh7Arh.js} +1 -1
  231. package/dist/public/assets/_DuYh7Arh.js.br +0 -0
  232. package/dist/public/assets/{_xMdyrCIZ.js → _DwsU8vHs.js} +1 -1
  233. package/dist/public/assets/_DwsU8vHs.js.br +0 -0
  234. package/dist/public/assets/_HFLU3Kbz.js +1 -0
  235. package/dist/public/assets/{_D1lKffX5.js → _HulXSFpf.js} +1 -1
  236. package/dist/public/assets/_HulXSFpf.js.br +0 -0
  237. package/dist/public/assets/{_BJD3iU1d.js → _J4nOuw2W.js} +1 -1
  238. package/dist/public/assets/_J4nOuw2W.js.br +0 -0
  239. package/dist/public/assets/{_Cl6jtaoF.js → _MRXD6ehk.js} +1 -1
  240. package/dist/public/assets/_MRXD6ehk.js.br +0 -0
  241. package/dist/public/assets/{_DHFuabvA.js → _MUa3gMNv.js} +1 -1
  242. package/dist/public/assets/_MUa3gMNv.js.br +0 -0
  243. package/dist/public/assets/_O-SYF5Nk.js +1 -0
  244. package/dist/public/assets/{_D9ospRE9.js → _RFrpb9Ha.js} +1 -1
  245. package/dist/public/assets/_RFrpb9Ha.js.br +0 -0
  246. package/dist/public/assets/_RMebfppo.js +1 -0
  247. package/dist/public/assets/{_C9Koez8K.js → _Swxzqlit.js} +1 -1
  248. package/dist/public/assets/_Swxzqlit.js.br +0 -0
  249. package/dist/public/assets/{_CCf_LTgx.js → _UDmUoKIC.js} +1 -1
  250. package/dist/public/assets/_UDmUoKIC.js.br +0 -0
  251. package/dist/public/assets/_UxzHQvNT.js +1 -0
  252. package/dist/public/assets/{_Rc4FBDn0.js → _WgfFq_Do.js} +1 -1
  253. package/dist/public/assets/_WgfFq_Do.js.br +0 -0
  254. package/dist/public/assets/_XcAI8-9B.js +1 -0
  255. package/dist/public/assets/_YGydnIyp.js +1 -0
  256. package/dist/public/assets/_b_CH4bu2.js +1 -0
  257. package/dist/public/assets/{_2td5ESsh.js → _c7zRIjHP.js} +1 -1
  258. package/dist/public/assets/_c7zRIjHP.js.br +0 -0
  259. package/dist/public/assets/_fU0PViTg.js +1 -0
  260. package/dist/public/assets/{_DWelMske.js → _hHqgYaxa.js} +1 -1
  261. package/dist/public/assets/_hHqgYaxa.js.br +0 -0
  262. package/dist/public/assets/_itjOM1FD.js +1 -0
  263. package/dist/public/assets/{_C-ZN6eWF.js → _kIYW-eJI.js} +1 -1
  264. package/dist/public/assets/_kIYW-eJI.js.br +0 -0
  265. package/dist/public/assets/{_Dmok0hIE.js → _kehetK1Y.js} +1 -1
  266. package/dist/public/assets/_kehetK1Y.js.br +0 -0
  267. package/dist/public/assets/_n32vwmPP.js +1 -0
  268. package/dist/public/assets/_nu5sxOiC.js +1 -0
  269. package/dist/public/assets/{_ByxDvckW.js → _nx6SRfAG.js} +1 -1
  270. package/dist/public/assets/_nx6SRfAG.js.br +0 -0
  271. package/dist/public/assets/_rzQNPp63.js +1 -0
  272. package/dist/public/assets/{_CI4vlMua.js → _s108OSTO.js} +9 -9
  273. package/dist/public/assets/_s108OSTO.js.br +0 -0
  274. package/dist/public/assets/{_D08DuFAk.js → _s8oTLaz7.js} +1 -1
  275. package/dist/public/assets/_s8oTLaz7.js.br +0 -0
  276. package/dist/public/assets/_sGh2cRNa.js +1 -0
  277. package/dist/public/assets/{_31T7hpCK.js → _tEcZZwlO.js} +1 -1
  278. package/dist/public/assets/_tEcZZwlO.js.br +0 -0
  279. package/dist/public/assets/_tlbar1jD.js +1 -0
  280. package/dist/public/assets/{_k1Mt1mNJ.js → _wxIhRCmz.js} +1 -1
  281. package/dist/public/assets/_wxIhRCmz.js.br +0 -0
  282. package/dist/public/assets/{_Hh5__NtW.js → _zJAnptdJ.js} +1 -1
  283. package/dist/public/assets/_zJAnptdJ.js.br +0 -0
  284. package/dist/public/assets/files-view-Dg57HlHF.js +2 -0
  285. package/dist/public/assets/manage-workspace-BazG09dP.js +2 -0
  286. package/dist/public/assets/new-t0MBwonM.js +1 -0
  287. package/dist/public/assets/new-workspace-DWbeKl9K.js +2 -0
  288. package/dist/public/assets/review-view-DQKlW8dy.js +2 -0
  289. package/dist/public/assets/settings-page-BfuiuiBv.js +2 -0
  290. package/dist/public/assets/settings-t0MBwonM.js +1 -0
  291. package/dist/public/assets/{styles-BGPVvc2l.css → styles-28seHTNr.css} +1 -1
  292. package/dist/public/assets/styles-28seHTNr.css.br +0 -0
  293. package/dist/public/assets/w-t0MBwonM.js +1 -0
  294. package/dist/public/assets/w._-B51oFPgz.js +1 -0
  295. package/dist/public/assets/w._-DaZM3c5u.js +1 -0
  296. package/dist/public/assets/w._-t0MBwonM.js +1 -0
  297. package/package.json +1 -1
  298. package/dist/_BA6kJ94f.js +0 -2
  299. package/dist/_T5K2qs5u.js +0 -2
  300. package/dist/public/assets/_0vlCpvG9.js +0 -1
  301. package/dist/public/assets/_1X_NNEn-.js.br +0 -0
  302. package/dist/public/assets/_2td5ESsh.js.br +0 -0
  303. package/dist/public/assets/_31T7hpCK.js.br +0 -0
  304. package/dist/public/assets/_3Zk_u3Fa.js.br +0 -0
  305. package/dist/public/assets/_4SL45jq4.js.br +0 -0
  306. package/dist/public/assets/_7N53s3zu.js.br +0 -0
  307. package/dist/public/assets/_8Ta51A9A.js.br +0 -0
  308. package/dist/public/assets/_8xyrL6LS.js +0 -86
  309. package/dist/public/assets/_8xyrL6LS.js.br +0 -0
  310. package/dist/public/assets/_9U3Ty1AE.js +0 -1
  311. package/dist/public/assets/_AmVi_0HE.js.br +0 -0
  312. package/dist/public/assets/_B-2HnuWG.js.br +0 -0
  313. package/dist/public/assets/_B-Sop3lT.js +0 -1
  314. package/dist/public/assets/_B0jaVqzU.js +0 -1
  315. package/dist/public/assets/_B0qwMsgT.js +0 -1
  316. package/dist/public/assets/_B3zQ9YU2.js +0 -1
  317. package/dist/public/assets/_B8Vf1DG9.js.br +0 -0
  318. package/dist/public/assets/_BCgm71_Q.js +0 -1
  319. package/dist/public/assets/_BDSxe03w.js.br +0 -0
  320. package/dist/public/assets/_BEsRsgkE.js +0 -1
  321. package/dist/public/assets/_BF1mwsnt.js.br +0 -0
  322. package/dist/public/assets/_BFt0zsUG.js.br +0 -0
  323. package/dist/public/assets/_BHdYVCoA.js +0 -1
  324. package/dist/public/assets/_BJD3iU1d.js.br +0 -0
  325. package/dist/public/assets/_BJk32yNh.js +0 -1
  326. package/dist/public/assets/_BKMH1b4E.js.br +0 -0
  327. package/dist/public/assets/_BKUbZiwz.js.br +0 -0
  328. package/dist/public/assets/_BKc6-2k7.js.br +0 -0
  329. package/dist/public/assets/_BOCgwHYT.js.br +0 -0
  330. package/dist/public/assets/_BPEjQiUx.js +0 -1
  331. package/dist/public/assets/_BPY63BjJ.js +0 -1
  332. package/dist/public/assets/_BPq3X_iB.js.br +0 -0
  333. package/dist/public/assets/_BVK6Eit1.js.br +0 -0
  334. package/dist/public/assets/_BVPKNo-2.js +0 -1
  335. package/dist/public/assets/_BVqX4wys.js +0 -1
  336. package/dist/public/assets/_BY17lrSL.js.br +0 -0
  337. package/dist/public/assets/_BZBYUl64.js +0 -1
  338. package/dist/public/assets/_B_XXfIbq.js +0 -1
  339. package/dist/public/assets/_B_ezh_nq.js.br +0 -0
  340. package/dist/public/assets/_Bb5a4QKe.js +0 -1
  341. package/dist/public/assets/_BdyoI0fl.js +0 -1
  342. package/dist/public/assets/_Bh5C3fUv.js +0 -1
  343. package/dist/public/assets/_BhJY4B1T.js.br +0 -0
  344. package/dist/public/assets/_BhgJGAbd.js.br +0 -0
  345. package/dist/public/assets/_BkRI-Gg0.js +0 -1
  346. package/dist/public/assets/_Bl1ScPIR.js.br +0 -0
  347. package/dist/public/assets/_BlVH60xT.js +0 -1
  348. package/dist/public/assets/_BnHyx07g.js +0 -1
  349. package/dist/public/assets/_BppRZeGP.js.br +0 -0
  350. package/dist/public/assets/_BqGVhCOR.js.br +0 -0
  351. package/dist/public/assets/_BqtdPg8O.js.br +0 -0
  352. package/dist/public/assets/_Br0_MTJM.js.br +0 -0
  353. package/dist/public/assets/_Br7wmLLv.js +0 -1
  354. package/dist/public/assets/_BtRNnp33.js +0 -1
  355. package/dist/public/assets/_Bu4B2Peh.js +0 -1
  356. package/dist/public/assets/_Buq69QZJ.js +0 -1
  357. package/dist/public/assets/_BweR01AF.js +0 -1
  358. package/dist/public/assets/_ByxDvckW.js.br +0 -0
  359. package/dist/public/assets/_C-ZN6eWF.js.br +0 -0
  360. package/dist/public/assets/_C1_hy9fH.js.br +0 -0
  361. package/dist/public/assets/_C2SXA1B0.js +0 -1
  362. package/dist/public/assets/_C2g5--Wg.js +0 -1
  363. package/dist/public/assets/_C7yRAx2N.js.br +0 -0
  364. package/dist/public/assets/_C8DRWUsq.js.br +0 -0
  365. package/dist/public/assets/_C8FrBpAD.js.br +0 -0
  366. package/dist/public/assets/_C9Koez8K.js.br +0 -0
  367. package/dist/public/assets/_C9PNZUds.js.br +0 -0
  368. package/dist/public/assets/_CBx4k3QK.js.br +0 -0
  369. package/dist/public/assets/_CCf_LTgx.js.br +0 -0
  370. package/dist/public/assets/_CFdGaGi4.js.br +0 -0
  371. package/dist/public/assets/_CG4I1SEi.js.br +0 -0
  372. package/dist/public/assets/_CGErQfDH.js +0 -1
  373. package/dist/public/assets/_CH0jIiV8.js +0 -1
  374. package/dist/public/assets/_CH3mH_32.js +0 -1
  375. package/dist/public/assets/_CI4vlMua.js.br +0 -0
  376. package/dist/public/assets/_CIHUWzE1.js +0 -1
  377. package/dist/public/assets/_CJtv2_Li.js.br +0 -0
  378. package/dist/public/assets/_CNI18VGD.js.br +0 -0
  379. package/dist/public/assets/_COwVKOPA.js.br +0 -0
  380. package/dist/public/assets/_CP1ZxN3w.js.br +0 -0
  381. package/dist/public/assets/_CPwJBHTb.js.br +0 -0
  382. package/dist/public/assets/_CSpGAWZH.js +0 -1
  383. package/dist/public/assets/_CTHJm-Wd.js.br +0 -0
  384. package/dist/public/assets/_CUMjc4ko.js.br +0 -0
  385. package/dist/public/assets/_CV1Ajua_.js +0 -1
  386. package/dist/public/assets/_CXnQNhyD.js +0 -1
  387. package/dist/public/assets/_CY4z5b13.js.br +0 -0
  388. package/dist/public/assets/_CZncd8ZW.js.br +0 -0
  389. package/dist/public/assets/_CaXj6aua.js +0 -1
  390. package/dist/public/assets/_Ca_zaEbY.js +0 -1
  391. package/dist/public/assets/_CeG60zam.js.br +0 -0
  392. package/dist/public/assets/_CeP33ATq.js +0 -1
  393. package/dist/public/assets/_Cg-bWtiG.js.br +0 -0
  394. package/dist/public/assets/_CgpGB3zl.js +0 -1
  395. package/dist/public/assets/_Ci12JT5X.js.br +0 -0
  396. package/dist/public/assets/_Ck5QrBxS.js +0 -1
  397. package/dist/public/assets/_CkT9iI_C.js +0 -1
  398. package/dist/public/assets/_Cl6jtaoF.js.br +0 -0
  399. package/dist/public/assets/_Co446-rW.js.br +0 -0
  400. package/dist/public/assets/_Cp-MTxVL.js +0 -1
  401. package/dist/public/assets/_CqOC8g8u.js.br +0 -0
  402. package/dist/public/assets/_CqRJIe9w.js +0 -1
  403. package/dist/public/assets/_CqtehASc.js +0 -1
  404. package/dist/public/assets/_CsbRqvms.js.br +0 -0
  405. package/dist/public/assets/_CuSL_O1G.js +0 -1
  406. package/dist/public/assets/_CuSSAYgs.js +0 -1
  407. package/dist/public/assets/_CvZMFHLo.js.br +0 -0
  408. package/dist/public/assets/_D-3uorMu.js +0 -1
  409. package/dist/public/assets/_D-gZoiNs.js +0 -1
  410. package/dist/public/assets/_D08DuFAk.js.br +0 -0
  411. package/dist/public/assets/_D1lKffX5.js.br +0 -0
  412. package/dist/public/assets/_D2zU6Q8N.js +0 -1
  413. package/dist/public/assets/_D5RRfUJO.js +0 -1
  414. package/dist/public/assets/_D5m_zffE.js.br +0 -0
  415. package/dist/public/assets/_D7F2Iz4z.js.br +0 -0
  416. package/dist/public/assets/_D7R02qnk.js +0 -1
  417. package/dist/public/assets/_D8B-scTG.js +0 -1
  418. package/dist/public/assets/_D9MKgzHA.js +0 -1
  419. package/dist/public/assets/_D9ospRE9.js.br +0 -0
  420. package/dist/public/assets/_D9vOt1H4.js.br +0 -0
  421. package/dist/public/assets/_DGGfdFqg.js.br +0 -0
  422. package/dist/public/assets/_DHFuabvA.js.br +0 -0
  423. package/dist/public/assets/_DKsYBxxg.js +0 -1
  424. package/dist/public/assets/_DMT17SF4.js +0 -1
  425. package/dist/public/assets/_DOccahmz.js +0 -1
  426. package/dist/public/assets/_DQodfM-4.js.br +0 -0
  427. package/dist/public/assets/_DSe4_LQN.js.br +0 -0
  428. package/dist/public/assets/_DTyBqyWB.js +0 -1
  429. package/dist/public/assets/_DUtcZp_a.js +0 -1
  430. package/dist/public/assets/_DWDCquz_.js +0 -1
  431. package/dist/public/assets/_DWelMske.js.br +0 -0
  432. package/dist/public/assets/_D_4Gicha.js +0 -1
  433. package/dist/public/assets/_D_YSrurE.js +0 -1
  434. package/dist/public/assets/_D_yB_0Mo.js.br +0 -0
  435. package/dist/public/assets/_DaJbbuzw.js.br +0 -0
  436. package/dist/public/assets/_DaqWCDLm.js.br +0 -0
  437. package/dist/public/assets/_DcQ3joDA.js.br +0 -0
  438. package/dist/public/assets/_DfKDbL8e.js +0 -1
  439. package/dist/public/assets/_Dicx7z7P.js +0 -1
  440. package/dist/public/assets/_DikV3Rml.js +0 -1
  441. package/dist/public/assets/_DitNEptQ.js.br +0 -0
  442. package/dist/public/assets/_DjfA69iQ.js.br +0 -0
  443. package/dist/public/assets/_Dk_n3GnG.js +0 -1
  444. package/dist/public/assets/_DlpykLgd.js +0 -1
  445. package/dist/public/assets/_DmhLMcPt.js.br +0 -0
  446. package/dist/public/assets/_Dmok0hIE.js.br +0 -0
  447. package/dist/public/assets/_DpH21SZG.js.br +0 -0
  448. package/dist/public/assets/_DriUTG2l.js +0 -1
  449. package/dist/public/assets/_Dt0Y6Z0q.js.br +0 -0
  450. package/dist/public/assets/_DwmK2Yua.js +0 -1
  451. package/dist/public/assets/_DyFHS2Mw.js +0 -1
  452. package/dist/public/assets/_FBAUfM5a.js.br +0 -0
  453. package/dist/public/assets/_Hh5__NtW.js.br +0 -0
  454. package/dist/public/assets/_K_YH9Zjq.js +0 -1
  455. package/dist/public/assets/_Rc4FBDn0.js.br +0 -0
  456. package/dist/public/assets/_SxOlSMIj.js +0 -1
  457. package/dist/public/assets/__pzTXm1W.js +0 -1
  458. package/dist/public/assets/_bKLeCUW7.js.br +0 -0
  459. package/dist/public/assets/_dScmp_KZ.js.br +0 -0
  460. package/dist/public/assets/_dp7DQPjy.js +0 -1
  461. package/dist/public/assets/_gFpLUJd3.js +0 -1
  462. package/dist/public/assets/_gLnLncO7.js.br +0 -0
  463. package/dist/public/assets/_iuuyO61h.js.br +0 -0
  464. package/dist/public/assets/_k1Mt1mNJ.js.br +0 -0
  465. package/dist/public/assets/_kPgoIreG.js +0 -1
  466. package/dist/public/assets/_lpS1YkLl.js +0 -1
  467. package/dist/public/assets/_pwSQZ5i_.js.br +0 -0
  468. package/dist/public/assets/_qKNaiG1o.js +0 -1
  469. package/dist/public/assets/_sNh-WAFz.js.br +0 -0
  470. package/dist/public/assets/_t3SfU__o.js.br +0 -0
  471. package/dist/public/assets/_tUNjv2f9.js +0 -1
  472. package/dist/public/assets/_uz67GvQl.js +0 -1
  473. package/dist/public/assets/_we71RMJp.js.br +0 -0
  474. package/dist/public/assets/_xMdyrCIZ.js.br +0 -0
  475. package/dist/public/assets/_x_2XiBZV.js.br +0 -0
  476. package/dist/public/assets/files-view-nA-utEh9.js +0 -2
  477. package/dist/public/assets/manage-workspace-CGEQU1SO.js +0 -2
  478. package/dist/public/assets/new-crDBPqWk.js +0 -1
  479. package/dist/public/assets/new-workspace-BXczIWrh.js +0 -2
  480. package/dist/public/assets/review-view-BiCS0Lm0.js +0 -2
  481. package/dist/public/assets/settings-crDBPqWk.js +0 -1
  482. package/dist/public/assets/settings-page-59yJfPPH.js +0 -2
  483. package/dist/public/assets/styles-BGPVvc2l.css.br +0 -0
  484. package/dist/public/assets/w-crDBPqWk.js +0 -1
  485. package/dist/public/assets/w._-CHmRhqPp.js +0 -1
  486. package/dist/public/assets/w._-CTkEEJ4e.js +0 -1
  487. package/dist/public/assets/w._-crDBPqWk.js +0 -1
@@ -819,6 +819,16 @@ var STEPS = [
819
819
  CREATE INDEX message_log_to ON message_log(to_session);
820
820
  CREATE INDEX message_log_from ON message_log(from_session);
821
821
  CREATE INDEX message_log_workspace ON message_log(workspace_id, created_at);
822
+ `);
823
+ }
824
+ },
825
+ {
826
+ version: 15,
827
+ name: "retiring sessions, typing kept",
828
+ up(db) {
829
+ db.exec(`
830
+ ALTER TABLE sessions ADD COLUMN retire_at TEXT;
831
+ ALTER TABLE sessions ADD COLUMN typed_at INTEGER;
822
832
  `);
823
833
  }
824
834
  }
@@ -9479,8 +9489,12 @@ function activityOf(sessionId) {
9479
9489
  }
9480
9490
  /** Someone typed into the session's pane from a page. */
9481
9491
  function noteTyped(sessionId) {
9482
- typedAt.set(sessionId, Date.now());
9492
+ const now = Date.now();
9493
+ const last = typedAt.get(sessionId) ?? 0;
9494
+ typedAt.set(sessionId, now);
9495
+ if (now - last >= TYPED_KEEP_MS) db.prepare("UPDATE sessions SET typed_at = ? WHERE id = ?").run(now, sessionId);
9483
9496
  }
9497
+ var TYPED_KEEP_MS = 1e3;
9484
9498
  /** When someone last typed into the session's pane (0: not this run). */
9485
9499
  function lastTypedAt(sessionId) {
9486
9500
  return typedAt.get(sessionId) ?? 0;
@@ -9644,7 +9658,7 @@ function publishChange(sessionId) {
9644
9658
  const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
9645
9659
  if (row?.workspace_id) {
9646
9660
  const workspaceId = row.workspace_id;
9647
- import("./_BA6kJ94f.js").then((m) => m.notifySessionsChanged(workspaceId));
9661
+ import("./_BOUuiLtz.js").then((m) => m.notifySessionsChanged(workspaceId));
9648
9662
  return;
9649
9663
  }
9650
9664
  publish("sessions.changed");
@@ -17378,6 +17392,61 @@ async function foregroundRun(panePid, command) {
17378
17392
  if (!argv?.length) return false;
17379
17393
  return !!await headlessRun(job, argv[0].split("/").pop() || argv[0], argv.slice(1), table?.get(job)?.tty);
17380
17394
  }
17395
+ /** Shells an agent CLI runs its commands in: Claude's Bash tool, Codex's
17396
+ * exec. A CLI's other children (stdio MCP servers, language servers) live
17397
+ * as long as it does and are none of its jobs. */
17398
+ var SHELLS = /* @__PURE__ */ new Set([
17399
+ "bash",
17400
+ "sh",
17401
+ "zsh",
17402
+ "fish",
17403
+ "dash",
17404
+ "ksh"
17405
+ ]);
17406
+ var baseName = (arg) => (arg.split("/").pop() || arg).replace(/^-/, "");
17407
+ /** What a CLI at `panePid` still runs in shells of its own — a background
17408
+ * job, a dev server, a test run left going — each named by what its
17409
+ * shell runs (`pnpm test`), else the shell. Closing or restarting the CLI
17410
+ * ends them all with its tmux session, so a close that loses nothing
17411
+ * waits for none (server/team `closeBlockers`). */
17412
+ async function shellJobs(panePid) {
17413
+ if (darwin) {
17414
+ const table = await processArgs();
17415
+ const kids = (pid) => [...table].filter(([, row]) => row.ppid === pid);
17416
+ return kids(panePid).filter(([, row]) => SHELLS.has(baseName(row.argv[0] ?? ""))).map(([pid, row]) => jobName(kids(pid)[0]?.[1].argv ?? row.argv));
17417
+ }
17418
+ const jobs = [];
17419
+ for (const pid of await childPids(panePid)) {
17420
+ const stat = await procStat(pid);
17421
+ if (!stat.length || stat[0] === "Z") continue;
17422
+ const argv = await procArgs(pid);
17423
+ if (!SHELLS.has(baseName(argv[0] ?? ""))) continue;
17424
+ const [first] = await childPids(pid);
17425
+ jobs.push(jobName(first ? await procArgs(first) : argv));
17426
+ }
17427
+ return jobs;
17428
+ }
17429
+ /** A job as a line: its command and arguments, paths by their names. */
17430
+ function jobName(argv) {
17431
+ const line = argv.map((arg) => arg.startsWith("/") ? baseName(arg) : arg).join(" ");
17432
+ return line.length > 60 ? `${line.slice(0, 59)}…` : line;
17433
+ }
17434
+ /** A process's children on Linux, every thread's (a Node CLI forks from
17435
+ * its worker threads too). */
17436
+ async function childPids(pid) {
17437
+ let tasks;
17438
+ try {
17439
+ tasks = await fs$1.readdir(`/proc/${pid}/task`);
17440
+ } catch {
17441
+ return [];
17442
+ }
17443
+ const kids = /* @__PURE__ */ new Set();
17444
+ for (const task of tasks) try {
17445
+ const list = await fs$1.readFile(`/proc/${pid}/task/${task}/children`, "utf8");
17446
+ for (const kid of list.split(" ")) if (kid.trim()) kids.add(Number(kid));
17447
+ } catch {}
17448
+ return [...kids];
17449
+ }
17381
17450
  /** Whether a process reads a terminal: its stdin on Linux; on macOS,
17382
17451
  * where a look at one pid's descriptors costs a spawn, whether it has a
17383
17452
  * controlling terminal at all (`ps`'s `??`). Unknown counts as one. */
@@ -17789,6 +17858,10 @@ function sessionInfo(id) {
17789
17858
  workspace: s.workspace_id,
17790
17859
  parent: s.parent_id,
17791
17860
  summary: s.summary,
17861
+ /** Never closed for being done (`work session keep`). */
17862
+ kept: !!live?.keep,
17863
+ /** Since when it is to close once nothing is lost by it (`retire`). */
17864
+ retiring: live?.retire_at ?? null,
17792
17865
  /** How and when it closed; null while open. */
17793
17866
  closed: closed ? {
17794
17867
  how: closed.how,
@@ -17805,6 +17878,37 @@ function paneAlive(id, env) {
17805
17878
  tmuxName(id)
17806
17879
  ], env).then(() => true, () => false);
17807
17880
  }
17881
+ /** What the session's CLI still runs in shells of its own (procs
17882
+ * `shellJobs`): its tmux session's close or a restart ends them. */
17883
+ async function paneJobs(id) {
17884
+ const pane = (await listPanes())?.find((p) => p.id === id);
17885
+ return pane ? shellJobs(pane.pid) : [];
17886
+ }
17887
+ /** Put a running session under `parent` (`work session adopt`), or on its
17888
+ * own with null (`release`), as `new` would have started it: nothing
17889
+ * restarts, and what is queued for it or owed keeps how it is answered
17890
+ * (a row's `by_send`). Adopted, it is kept from closing for being done
17891
+ * unless `closeDone`, which counts only answers to come: it may have
17892
+ * answered someone long ago. Moving one from another lead takes `from`
17893
+ * naming that lead. */
17894
+ function moveSession(id, parent, opts = {}) {
17895
+ const s = getSession(id);
17896
+ if (!s) throw httpError(404, `no session ${id}`);
17897
+ if (parent === null) {
17898
+ if (s.parent_id) db.prepare("UPDATE sessions SET parent_id = NULL WHERE id = ?").run(id);
17899
+ } else {
17900
+ const lead = getSession(parent);
17901
+ if (!lead) throw httpError(404, `no session ${parent}`);
17902
+ if (lead.workspace_id !== s.workspace_id) throw httpError(409, `${parent} is in another workspace than ${id}`);
17903
+ if (lead.agent === "shell") throw httpError(409, `${parent} is a shell: only an agent leads`);
17904
+ if (parent === id) throw httpError(409, `${id} cannot be under itself`);
17905
+ if (descendantsOf(id).includes(parent)) throw httpError(409, `${parent} is under ${id} already: ${id} cannot also be under it (\`work session release ${parent}\` first)`);
17906
+ if (s.parent_id && s.parent_id !== parent && opts.from !== s.parent_id) throw httpError(409, `${id} is under ${s.parent_id}: pass --from ${s.parent_id} to move it`);
17907
+ db.prepare(`UPDATE sessions SET parent_id = ?, keep = ?${opts.closeDone ? ", answered_at = NULL" : ""} WHERE id = ?`).run(parent, opts.closeDone ? 0 : 1, id);
17908
+ }
17909
+ notifySessionsChanged(s.workspace_id);
17910
+ return getSession(id);
17911
+ }
17808
17912
  /** Every session `id` started, and theirs, nearest first. */
17809
17913
  function descendantsOf(id) {
17810
17914
  return all(`WITH RECURSIVE kids(id, depth) AS (
@@ -17900,7 +18004,7 @@ function notifySessionsChanged(workspaceId) {
17900
18004
  async function emitSessionsChanged(workspaceId) {
17901
18005
  try {
17902
18006
  const states = await sessionStates();
17903
- const { teamsOf } = await import("./_T5K2qs5u.js");
18007
+ const { teamsOf } = await import("./_C-c452mk.js");
17904
18008
  publish("sessions.changed", {
17905
18009
  workspaceId,
17906
18010
  sessions: listSessions(workspaceId).map((s) => ({
@@ -19627,7 +19731,12 @@ ${repoLines}
19627
19731
  otherwise (with its lead, by the user), or stuck on its account's limit,
19628
19732
  \`work session reopen <id> [--agent <another instance>]\` starts again
19629
19733
  on it, and \`work session log [<id>]\` shows what went to and from
19630
- one and how each message went. For a quick
19734
+ one and how each message went. \`kill\` and \`skip\` end the turn under
19735
+ way and what its pane runs; to lose nothing, \`forget <id>\` stops
19736
+ waiting on a reply, \`unsend <id>\` takes back a message not yet typed
19737
+ in, \`retire <id>\` closes one once it is idle, and \`adopt <id>\` /
19738
+ \`release <id>\` move one under you or off (the user's own only when
19739
+ they ask, with \`--yes\`). For a quick
19631
19740
  sweep in your own CLI, its own subagents are cheaper. All of this is
19632
19741
  this workspace's only; an agent in another can be messaged when the user
19633
19742
  asks, and only while it runs (\`work workspaces\` lists them, \`work session list <workspace>\`
@@ -19645,4 +19754,4 @@ ${repoLines}
19645
19754
  `;
19646
19755
  }
19647
19756
  //#endregion
19648
- export { renameSession as $, agentFromCommand as $n, catalogPin as $r, commentFolder as $t, closedSession as A, noteBackground as An, allPrefs as Ar, serverList as At, killWorkspaceSessions as B, onTurnFailed as Bn, setSetting as Br, runStreaming as Bt, workspaceBranches as C, withLock as Ci, agentPhase as Cn, isValidHost as Cr, forgetCustomServer as Ct, beginCreation as D, interruptedSinceReport as Dn, PREF_MAX as Dr, lspEnabled as Dt, agentCaller as E, hookReportedAt as En, unreachableRepos as Er, installServer as Et, ensureTmuxServer as F, noteUserAnswered as Fn, getSetting as Fr, installMise as Ft, markTmuxStarted as G, setSessionViewers as Gn, miseVersions as Gr, readFileAt as Gt, listPanes as H, setAgentPhase as Hn, doctor as Hr, fileChanges as Ht, forgetPanes as I, notifyEventOn as In, isKnownAgent as Ir, installTool as It, notifySessionsChanged as J, turnPhase as Jn, firewallProbe as Jr, workspaceDiff as Jt, newSessionArgs as K, settleQuietWorking as Kn, which as Kr, reviewWaiting as Kt, getSession as L, onFinished as Ln, preferredAgent as Lr, logoutGithub as Lt, creationOf as M, notePermissionMode as Mn, deleteSetting as Mr, whileInstalling as Mt, descendantsOf as N, noteTurnFailed as Nn, disabledAgents as Nr, authGithub as Nt, cleanEnv as O, lastTypedAt as On, WORKSPACE_PREFS as Or, removeServer as Ot, disposeSessions as P, noteTyped as Pn, enabledAgents as Pr, installAgent as Pt, pasteToSession as Q, agentFamily as Qn, agentLabel$1 as Qr, diffStamp as Qt, interruptSession as R, onPhaseChange as Rn, setDisabledAgents as Rr, refreshGithub as Rt, withProgressOp as S, swr as Si, activityOf as Sn, forgetToken as Sr, allServers as St, hookToken as T, hookPhase as Tn, removeHost as Tr, installKey as Tt, listPanesWithin as U, setExpecting as Un, ghKnownHosts as Ur, patchIn as Ut, launchDir as V, sessionWatched as Vn, discoverAgents as Vr, updateTool as Vt, listSessions as W, setScrapedPhase as Wn, miseInstalls as Wr, readBlobAt as Wt, ownWorkspaceOnly as X, turnSince as Xn, TOOLS as Xr, setPoints as Xt, onSessionDispose as Y, turnSettling as Yn, PROJECT_TOOLS as Yr, workspaceSections as Yt, panePids as Z, agentBadge as Zn, agentById as Zr, startSnapSweep as Zt, retryMaterialize as _, ensureAllCacheConfig as _i, readCache as _n, repoDefaultBranch as _r, lspWarm as _t, ensureUntrackedCache as a, checked as ai, refreshPrsBatch as an, manifest as ar, sessionInfo as at, sweepTrash as b, tmux as bi, inside as bn, configuredHosts as br, stopServers as bt, insertPendingWorkspace as c, publish as ci, noteActivity as cn, deleteSubscription as cr, tmuxWasStarted as ct, progress as d, subscriberCount as di, quotesPastes as dn, sendPush as dr, workspaceProcs as dt, parseAgentId as ei, markBranch as en, agentLabel as er, reopenSession as et, progressSince as f, all as fi, readHookPayload as fn, validSubscription as fr, killServers as ft, resumePendingWorkspaces as g, ownsBranchOf as gi, credentialStamp as gn, repoCatalog as gr, lspUses as gt, removeRepo as h, workspacePath as hi, blankRow as hn, repoBranches as hr, lspQueryOf as ht, deleteWorkspace as i, FRAME_HEADERS as ii, notePushActivity as in, iconSvg as ir, sendToSession as it, createSession as j, noteInterrupt as jn, changePref as jr, sharing as jt, clearTmuxStarted as k, noteActivity$1 as kn, agentChoices as kr, serverById as kt, listWorkspaces as l, publishJson as li, AGENTS as ln, pushPublicKey as lr, killWorkspaceProc as lt, queueMaterialize as m, get as mi, steerKeys as mn, pendingSsoOrgs as mr, lspQuery as mt, barePath as n, applyPrefChange as ni, dismissPr as nn, ACCENT_RE as nr, restartSession as nt, gcBares as o, httpError as oi, withoutDismissed as on, normalizeAccent as or, sessionStates as ot, pruneLaneBranch as p, db as pi, reportsWorking as pn, headOid as pr, lspDiagnostics as pt, noteConversation as q, summaryOf as qn, bornOut as qr, withinBudget as qt, createWorkspace as r, FRAME_ANCESTORS as ri, hotBatchMinMs as rn, getInstance as rr, retireSession as rt, getWorkspace as s, readBody as si, workspacePrs as sn, setInstance as sr, tmuxName as st, addRepo as t, toolById as ti, sectionFor as tn, agentMeta as tr, reopenable as tt, otherWorkspaceBranches as u, subscribe as ui, interruptKeys as un, saveSubscription as ur, portsByWorkspace as ut, revParse as v, TMUX_SOCKET as vi, writeCache as vn, DEFAULT_HOST as vr, runningServers as vt, ensureAllPushHooks as w, clearAgentPhase as wn, normalizeHost as wr, forgetProbes as wt, syncAgentsMd as x, config as xi, realInside as xn, ensureGitCredentials as xr, addCustomServer as xt, setWorkspaceStatus as y, git as yi, cleanSummary as yn, addHost as yr, stopAllServers as yt, killSession as z, onTurnEnd as zn, setPref as zr, removeTool as zt };
19757
+ export { panePids as $, agentBadge as $n, agentById as $r, startSnapSweep as $t, closedSession as A, lastTypedAt as An, WORKSPACE_PREFS as Ar, removeServer as At, killWorkspaceSessions as B, onPhaseChange as Bn, setDisabledAgents as Br, refreshGithub as Bt, workspaceBranches as C, config as Ci, realInside as Cn, ensureGitCredentials as Cr, addCustomServer as Ct, beginCreation as D, hookPhase as Dn, removeHost as Dr, installKey as Dt, agentCaller as E, clearAgentPhase as En, normalizeHost as Er, forgetProbes as Et, ensureTmuxServer as F, noteTurnFailed as Fn, disabledAgents as Fr, authGithub as Ft, markTmuxStarted as G, setExpecting as Gn, ghKnownHosts as Gr, patchIn as Gt, listPanes as H, onTurnFailed as Hn, setSetting as Hr, runStreaming as Ht, forgetPanes as I, noteTyped as In, enabledAgents as Ir, installAgent as It, noteConversation as J, settleQuietWorking as Jn, which as Jr, reviewWaiting as Jt, moveSession as K, setScrapedPhase as Kn, miseInstalls as Kr, readBlobAt as Kt, getSession as L, noteUserAnswered as Ln, getSetting as Lr, installMise as Lt, creationOf as M, noteBackground as Mn, allPrefs as Mr, serverList as Mt, descendantsOf as N, noteInterrupt as Nn, changePref as Nr, sharing as Nt, cleanEnv as O, hookReportedAt as On, unreachableRepos as Or, installServer as Ot, disposeSessions as P, notePermissionMode as Pn, deleteSetting as Pr, whileInstalling as Pt, paneJobs as Q, turnSince as Qn, TOOLS as Qr, setPoints as Qt, interruptSession as R, notifyEventOn as Rn, isKnownAgent as Rr, installTool as Rt, withProgressOp as S, tmux as Si, inside as Sn, configuredHosts as Sr, stopServers as St, hookToken as T, withLock as Ti, agentPhase as Tn, isValidHost as Tr, forgetCustomServer as Tt, listPanesWithin as U, sessionWatched as Un, discoverAgents as Ur, updateTool as Ut, launchDir as V, onTurnEnd as Vn, setPref as Vr, removeTool as Vt, listSessions as W, setAgentPhase as Wn, doctor as Wr, fileChanges as Wt, onSessionDispose as X, turnPhase as Xn, firewallProbe as Xr, workspaceDiff as Xt, notifySessionsChanged as Y, summaryOf as Yn, bornOut as Yr, withinBudget as Yt, ownWorkspaceOnly as Z, turnSettling as Zn, PROJECT_TOOLS as Zr, workspaceSections as Zt, retryMaterialize as _, workspacePath as _i, blankRow as _n, repoBranches as _r, lspQueryOf as _t, ensureUntrackedCache as a, FRAME_ANCESTORS as ai, hotBatchMinMs as an, getInstance as ar, retireSession as at, sweepTrash as b, TMUX_SOCKET as bi, writeCache as bn, DEFAULT_HOST as br, runningServers as bt, insertPendingWorkspace as c, httpError as ci, withoutDismissed as cn, normalizeAccent as cr, sessionStates as ct, progress as d, publishJson as di, AGENTS as dn, pushPublicKey as dr, killWorkspaceProc as dt, agentLabel$1 as ei, diffStamp as en, agentFamily as er, pasteToSession as et, progressSince as f, subscribe as fi, interruptKeys as fn, saveSubscription as fr, portsByWorkspace as ft, resumePendingWorkspaces as g, get as gi, steerKeys as gn, pendingSsoOrgs as gr, lspQuery as gt, removeRepo as h, db as hi, reportsWorking as hn, headOid as hr, lspDiagnostics as ht, deleteWorkspace as i, applyPrefChange as ii, dismissPr as in, ACCENT_RE as ir, restartSession as it, createSession as j, noteActivity$1 as jn, agentChoices as jr, serverById as jt, clearTmuxStarted as k, interruptedSinceReport as kn, PREF_MAX as kr, lspEnabled as kt, listWorkspaces as l, readBody as li, workspacePrs as ln, setInstance as lr, tmuxName as lt, queueMaterialize as m, all as mi, readHookPayload as mn, validSubscription as mr, killServers as mt, barePath as n, parseAgentId as ni, markBranch as nn, agentLabel as nr, reopenSession as nt, gcBares as o, FRAME_HEADERS as oi, notePushActivity as on, iconSvg as or, sendToSession as ot, pruneLaneBranch as p, subscriberCount as pi, quotesPastes as pn, sendPush as pr, workspaceProcs as pt, newSessionArgs as q, setSessionViewers as qn, miseVersions as qr, readFileAt as qt, createWorkspace as r, toolById as ri, sectionFor as rn, agentMeta as rr, reopenable as rt, getWorkspace as s, checked as si, refreshPrsBatch as sn, manifest as sr, sessionInfo as st, addRepo as t, catalogPin as ti, commentFolder as tn, agentFromCommand as tr, renameSession as tt, otherWorkspaceBranches as u, publish as ui, noteActivity as un, deleteSubscription as ur, tmuxWasStarted as ut, revParse as v, ownsBranchOf as vi, credentialStamp as vn, repoCatalog as vr, lspUses as vt, ensureAllPushHooks as w, swr as wi, activityOf as wn, forgetToken as wr, allServers as wt, syncAgentsMd as x, git as xi, cleanSummary as xn, addHost as xr, stopAllServers as xt, setWorkspaceStatus as y, ensureAllCacheConfig as yi, readCache as yn, repoDefaultBranch as yr, lspWarm as yt, killSession as z, onFinished as zn, preferredAgent as zr, logoutGithub as zt };
@@ -0,0 +1,2 @@
1
+ import { Y as notifySessionsChanged } from "./_BL9uMFqY.js";
2
+ export { notifySessionsChanged };
@@ -0,0 +1,2 @@
1
+ import { h as teamsOf } from "./_C_xIwbCY.js";
2
+ export { teamsOf };
@@ -1,4 +1,4 @@
1
- import { $ as renameSession, A as closedSession, Bn as onTurnFailed, Cn as agentPhase, E as agentCaller, En as hookReportedAt, Fr as getSetting, Ir as isKnownAgent, J as notifySessionsChanged, Jn as turnPhase, L as getSession, Ln as onFinished, On as lastTypedAt, Qn as agentFamily, R as interruptSession, Rn as onPhaseChange, Sn as activityOf, U as listPanesWithin, Un as setExpecting, Vn as sessionWatched, Xn as turnSince, Y as onSessionDispose, Yn as turnSettling, dn as quotesPastes, er as agentLabel, et as reopenSession, fi as all, it as sendToSession, j as createSession, kr as agentChoices, mi as get, mn as steerKeys, nt as restartSession, oi as httpError, pi as db, qn as summaryOf, rt as retireSession, tt as reopenable, un as interruptKeys, yn as cleanSummary, z as killSession, zn as onTurnEnd } from "./_xM2b0RL4.js";
1
+ import { A as closedSession, An as lastTypedAt, Bn as onPhaseChange, E as agentCaller, Gn as setExpecting, Hn as onTurnFailed, L as getSession, Lr as getSetting, On as hookReportedAt, Q as paneJobs, Qn as turnSince, R as interruptSession, Rr as isKnownAgent, Tn as agentPhase, U as listPanesWithin, Un as sessionWatched, Vn as onTurnEnd, X as onSessionDispose, Xn as turnPhase, Y as notifySessionsChanged, Yn as summaryOf, Zn as turnSettling, at as retireSession, ci as httpError, er as agentFamily, fn as interruptKeys, gi as get, gn as steerKeys, hi as db, it as restartSession, j as createSession, jr as agentChoices, mi as all, nr as agentLabel, nt as reopenSession, ot as sendToSession, pn as quotesPastes, rt as reopenable, tt as renameSession, wn as activityOf, xn as cleanSummary, z as killSession, zn as onFinished } from "./_BL9uMFqY.js";
2
2
  //#region src/server/messages.ts
3
3
  var team = {
4
4
  memberGroup: () => null,
@@ -518,6 +518,13 @@ async function sendMessage(to, text, opts = {}) {
518
518
  * message starts there to answer. Its row is back before its CLI is: a
519
519
  * send meanwhile queues behind this rather than starting the CLI afresh. */
520
520
  async function reopen(id, opts = {}) {
521
+ if (delivering.has(id)) throw httpError(409, `${id} is being started or typed into: try again`);
522
+ if (getSession(id) && !opts.now) {
523
+ const phase = turnPhase(id);
524
+ const jobs = await paneJobs(id);
525
+ const busy = [phase === "waiting" ? "it waits on the user" : (phase || turnSettling(id)) && "its turn is under way", jobs.length && `its pane still runs ${jobs.join("; ")}`].filter(Boolean);
526
+ if (busy.length) throw httpError(409, `${id} is busy: ${busy.join(", and ")}. Restarting its CLI would end that: reopen it once it is idle, or pass --now to restart it anyway`);
527
+ }
521
528
  if (delivering.has(id)) throw httpError(409, `${id} is being started or typed into: try again`);
522
529
  delivering.add(id);
523
530
  try {
@@ -541,6 +548,41 @@ async function reopen(id, opts = {}) {
541
548
  kick();
542
549
  }
543
550
  }
551
+ /** `asker` no longer wants what `to` owes it (`work session forget`): its
552
+ * messages in `to`'s turn stop wanting a reply, so that turn's end answers
553
+ * nobody, and its messages still queued go in wanting none. A reply `to`
554
+ * sent already still comes; `to` is told nothing and works on. Returns how
555
+ * many it forgot. */
556
+ function forgetReplies(asker, to) {
557
+ const rows = all("SELECT * FROM session_messages WHERE to_session = ? AND from_session = ? AND wants_reply = 1", to, asker);
558
+ if (!rows.length) return 0;
559
+ deleteIds(rows.filter((r) => r.delivered_at).map((r) => r.id), "forgotten by its asker");
560
+ const queued = rows.filter((r) => !r.delivered_at).map((r) => r.id);
561
+ if (queued.length) {
562
+ db.prepare(`UPDATE session_messages SET wants_reply = 0, by_send = 0 WHERE id IN ${inIds(queued)}`).run(...queued);
563
+ db.prepare(`UPDATE message_log SET wants_reply = 0 WHERE id IN ${inIds(queued)}`).run(...queued);
564
+ }
565
+ answered.get(to)?.askers.delete(asker);
566
+ heldTold.get(to)?.delete(asker);
567
+ recompute();
568
+ kick();
569
+ return rows.length;
570
+ }
571
+ /** Take back what `asker` queued for `to` that is not typed in yet (`work
572
+ * session unsend`): what went in stays. Not all a fan-out member was
573
+ * asked, which its group would wait on for nothing: that is a skip or a
574
+ * forget. Returns how many went. */
575
+ function withdraw(asker, to) {
576
+ if (delivering.has(to)) throw httpError(409, `${to} is being typed into: try again`);
577
+ const rows = all("SELECT * FROM session_messages WHERE to_session = ? AND from_session = ? AND kind = 'message' AND delivered_at IS NULL", to, asker);
578
+ if (!rows.length) throw httpError(409, `nothing of this session's is queued for ${to} (one typed in already stays in its turn)`);
579
+ const ids = rows.map((r) => r.id);
580
+ if (team.memberGroup(to) && !get(`SELECT 1 FROM session_messages WHERE to_session = ? AND from_session = ? AND wants_reply = 1 AND id NOT IN ${inIds(ids)}`, to, asker, ...ids)) throw httpError(409, `that is all ${to} was asked as a member of its group, which would then wait on it for nothing: \`work session forget\` or \`skip\` it instead`);
581
+ deleteIds(ids, "withdrawn by its sender");
582
+ recompute();
583
+ kick();
584
+ return ids.length;
585
+ }
544
586
  /** `id`'s turn ended failing (rate limited, signed out) while it owes
545
587
  * replies: it sits at its prompt until someone carries it on, and whoever
546
588
  * waits on it would wait on, unknowing. Each is told why and what it can
@@ -880,6 +922,17 @@ function memberBySession(sessionId) {
880
922
  function changed(workspaceId) {
881
923
  if (workspaceId) notifySessionsChanged(workspaceId);
882
924
  }
925
+ /** The groups of `owner` with members still to answer. */
926
+ function openGroupsOf(owner) {
927
+ return all(`SELECT DISTINCT g.id, g.title FROM session_groups g JOIN group_members m ON m.group_id = g.id
928
+ WHERE g.owner = ? AND m.state IN ('queued', 'running')`, owner);
929
+ }
930
+ /** Whether someone typed into `s` after `at`, as this server saw it or as
931
+ * kept from before it started (`typed_at`). */
932
+ function typedSince(s, at) {
933
+ if (!at) return false;
934
+ return Math.max(lastTypedAt(s.id), s.typed_at ?? 0) > Date.parse(at);
935
+ }
883
936
  /** Whether a group still has members to answer. */
884
937
  function open(groupId) {
885
938
  return !!get("SELECT 1 AS x FROM group_members WHERE group_id = ? AND state IN ('queued', 'running')", groupId);
@@ -965,22 +1018,80 @@ async function skipMember(memberId) {
965
1018
  }
966
1019
  changed(g.workspace_id);
967
1020
  }
1021
+ /** Stop waiting on what `target` owes `asker` without stopping it (`work
1022
+ * session forget`): a session's replies, or a member's — a queued member
1023
+ * never starts, as a skip; a running one's session carries on under its
1024
+ * lead, no longer a member its group waits on. Says what it forgot. */
1025
+ function forget(asker, target) {
1026
+ const m = get("SELECT * FROM group_members WHERE id = ?", target) ?? (() => {
1027
+ const row = memberBySession(target);
1028
+ return row?.state === "running" ? row : void 0;
1029
+ })();
1030
+ const g = m && groupOf(m.group_id);
1031
+ if (!m || !g) {
1032
+ const n = forgetReplies(asker, target);
1033
+ if (!n) throw httpError(409, `${target} owes this session nothing to forget`);
1034
+ return { replies: n };
1035
+ }
1036
+ if (g.owner !== asker) throw httpError(409, `${m.title} is ${g.owner}'s member, not this one's`);
1037
+ if (m.state !== "queued" && m.state !== "running") throw httpError(409, `${m.title} is ${m.state}: its group waits on nothing`);
1038
+ db.prepare("UPDATE group_members SET state = 'closed', note = 'forgotten', done_at = ?, session_id = NULL WHERE id = ?").run(now(), m.id);
1039
+ if (m.session_id) forgetReplies(asker, m.session_id);
1040
+ released(g);
1041
+ changed(g.workspace_id);
1042
+ return {
1043
+ member: m.id,
1044
+ session: m.session_id
1045
+ };
1046
+ }
1047
+ /** What closing `s` now would lose, as reasons to wait (`retire`, the
1048
+ * reaper, Close done), none when nothing: a turn under way, what is
1049
+ * queued for it or owed by or to it, sessions it leads, its pane's jobs
1050
+ * (a background run, a dev server) that its tmux session's close ends,
1051
+ * and — unless the user asked for this close (`watched: false`) — its
1052
+ * being on their screen. */
1053
+ async function closeBlockers(s, opts = {}) {
1054
+ const why = [];
1055
+ const phase = turnPhase(s.id);
1056
+ if (phase === "waiting") why.push("it waits on the user");
1057
+ else if (phase || turnSettling(s.id)) why.push("its turn is under way");
1058
+ const queued = get("SELECT COUNT(*) AS n FROM session_messages WHERE to_session = ? AND delivered_at IS NULL", s.id)?.n ?? 0;
1059
+ if (queued) why.push(`${queued} ${queued === 1 ? "message is" : "messages are"} queued for it`);
1060
+ const owes = all("SELECT DISTINCT from_session AS id FROM session_messages WHERE to_session = ? AND wants_reply = 1 AND delivered_at IS NOT NULL AND from_session IS NOT NULL", s.id).map((r) => r.id);
1061
+ if (owes.length) why.push(`it owes ${owes.join(", ")} a reply`);
1062
+ const waits = [...all("SELECT DISTINCT to_session AS id FROM session_messages WHERE from_session = ? AND wants_reply = 1", s.id).map((r) => r.id), ...openGroupsOf(s.id).map((o) => `group "${o.title}"`)];
1063
+ if (waits.length) why.push(`it waits on replies from ${waits.join(", ")}`);
1064
+ const leads = all("SELECT id FROM sessions WHERE parent_id = ?", s.id).map((r) => r.id);
1065
+ if (leads.length) why.push(`it leads ${leads.join(", ")}, still open`);
1066
+ if (opts.watched !== false && sessionWatched(s.id)) why.push("it is on the user's screen");
1067
+ const jobs = await paneJobs(s.id);
1068
+ if (jobs.length) why.push(`its pane still runs ${jobs.join("; ")}`);
1069
+ return why;
1070
+ }
968
1071
  /** Close the sessions of a group's members that have answered: their
969
1072
  * results are kept, their CLIs no longer hold memory, and a message to
970
- * one reopens it. */
1073
+ * one reopens it. Not one the user kept or took over, nor one closing
1074
+ * would lose something of (`closeBlockers`). */
971
1075
  async function closeDone(groupId) {
972
1076
  const g = groupOf(groupId);
973
1077
  if (!g) throw httpError(404, `no group ${groupId}`);
974
1078
  const done = membersOf(groupId).filter((m) => m.state === "done" && m.session_id);
975
- for (const m of done) await retireSession(m.session_id);
1079
+ let closed = 0;
1080
+ for (const m of done) {
1081
+ const s = getSession(m.session_id);
1082
+ if (!s || s.keep || typedSince(s, s.answered_at)) continue;
1083
+ if ((await closeBlockers(s, { watched: false })).length) continue;
1084
+ await retireSession(s.id);
1085
+ closed++;
1086
+ }
976
1087
  changed(g.workspace_id);
977
- return done.length;
1088
+ return closed;
978
1089
  }
979
1090
  /** Forget a finished group (its members' sessions closed with it). */
980
1091
  async function clearGroup(groupId) {
981
1092
  const g = groupOf(groupId);
982
1093
  if (!g) throw httpError(404, `no group ${groupId}`);
983
- if (open(groupId)) throw httpError(409, `"${g.title}" still has members working: skip them first`);
1094
+ if (open(groupId)) throw httpError(409, `"${g.title}" still has members working: skip or forget them first`);
984
1095
  await closeDone(groupId);
985
1096
  db.prepare("DELETE FROM session_groups WHERE id = ?").run(groupId);
986
1097
  changed(g.workspace_id);
@@ -1089,16 +1200,13 @@ setTeamHooks({
1089
1200
  return all(`SELECT DISTINCT g.owner FROM session_groups g JOIN group_members m ON m.group_id = g.id
1090
1201
  WHERE m.state IN ('queued', 'running')`).map((r) => r.owner);
1091
1202
  },
1092
- openGroups(owner) {
1093
- return all(`SELECT DISTINCT g.id, g.title FROM session_groups g JOIN group_members m ON m.group_id = g.id
1094
- WHERE g.owner = ? AND m.state IN ('queued', 'running')`, owner);
1095
- },
1203
+ openGroups: openGroupsOf,
1096
1204
  memberAnswered(sessionId, message) {
1097
1205
  const m = memberBySession(sessionId);
1098
1206
  if (!m || m.state !== "running") return;
1099
1207
  db.prepare("UPDATE group_members SET state = 'done', summary = ?, note = NULL, done_at = ? WHERE id = ?").run(message ? cleanSummary(message) ?? null : null, now(), m.id);
1100
1208
  const g = groupOf(m.group_id);
1101
- if (g.close_done) setTimeout(() => void retireSession(sessionId), 0);
1209
+ if (g.close_done) setTimeout(() => void closeAnswered(sessionId).catch((err) => console.error(`[work] team: ${err.message}`)), 0);
1102
1210
  released(g);
1103
1211
  changed(g.workspace_id);
1104
1212
  },
@@ -1188,34 +1296,89 @@ async function teamOf(owner) {
1188
1296
  * coming back to it, and each is a whole CLI's memory. */
1189
1297
  var REAP_IDLE_MS = 6e5;
1190
1298
  var REAP_EVERY_MS = 6e4;
1191
- /** Whether a session an agent started is done with: it has answered,
1192
- * nothing is queued or owed to it, it is at its prompt with nothing it
1193
- * waits on (its own children working keep it: it is their lead), and the
1194
- * user neither has it on screen nor has taken it over. */
1195
- function doneWith(s) {
1196
- if (!s.parent_id || s.keep || !s.answered_at) return false;
1197
- if (agentPhase(s.id) !== void 0 || turnSettling(s.id)) return false;
1198
- if (sessionWatched(s.id)) return false;
1199
- if (get("SELECT 1 AS x FROM session_messages WHERE to_session = ?", s.id)) return false;
1200
- if (lastTypedAt(s.id) > Date.parse(s.answered_at)) {
1201
- db.prepare("UPDATE sessions SET keep = 1 WHERE id = ?").run(s.id);
1202
- return false;
1299
+ /** Whether a session is done with: one an agent started that has
1300
+ * answered, and that the user has not taken over (typed into since it
1301
+ * answered, which keeps it for good); or one asked to close once nothing
1302
+ * is lost by it (`retire_at`), not typed into since, which takes the ask
1303
+ * back. Either way only once closing it loses nothing (`closeBlockers`).
1304
+ * Read afresh: a keep, adopt or release can land while another closes. */
1305
+ async function doneWith(id) {
1306
+ const s = getSession(id);
1307
+ if (!s) return null;
1308
+ if (s.retire_at) {
1309
+ if (typedSince(s, s.retire_at)) {
1310
+ db.prepare("UPDATE sessions SET retire_at = NULL WHERE id = ?").run(id);
1311
+ return null;
1312
+ }
1313
+ } else {
1314
+ if (!s.parent_id || s.keep || !s.answered_at) return null;
1315
+ if (typedSince(s, s.answered_at)) {
1316
+ db.prepare("UPDATE sessions SET keep = 1 WHERE id = ?").run(id);
1317
+ return null;
1318
+ }
1203
1319
  }
1204
- return true;
1205
- }
1206
- /** Close the sessions an agent started that are done with: `parent`'s
1207
- * once its job is done (or asked: `work session kill --done`), else any
1208
- * idle past `REAP_IDLE_MS`. A fan-out member's result stays in its group,
1209
- * and a message to one reopens it (sessions.ts `retireSession`). */
1320
+ return closeBlockers(s);
1321
+ }
1322
+ /** Close the sessions that are done with (`doneWith`): `parent`'s once
1323
+ * its job is done (or asked: `work session kill --done`), and it too if
1324
+ * it was asked to retire; else any idle past `REAP_IDLE_MS`, and any
1325
+ * asked to retire. A fan-out member's result stays in its group, and a
1326
+ * message to one reopens it (sessions.ts `retireSession`). Says how many
1327
+ * closed, and why each done with but left open was. */
1210
1328
  async function closeFinished(parent) {
1211
- const rows = parent ? all("SELECT * FROM sessions WHERE parent_id = ?", parent) : all("SELECT * FROM sessions WHERE parent_id IS NOT NULL AND answered_at IS NOT NULL AND answered_at < ?", (/* @__PURE__ */ new Date(Date.now() - REAP_IDLE_MS)).toISOString());
1329
+ const rows = parent ? all("SELECT id FROM sessions WHERE parent_id = ? OR (id = ? AND retire_at IS NOT NULL) ORDER BY id = ?", parent, parent, parent) : all("SELECT id FROM sessions WHERE (parent_id IS NOT NULL AND answered_at IS NOT NULL AND answered_at < ?) OR retire_at IS NOT NULL", (/* @__PURE__ */ new Date(Date.now() - REAP_IDLE_MS)).toISOString());
1212
1330
  let closed = 0;
1213
- for (const s of rows) {
1214
- if (!doneWith(s)) continue;
1215
- await retireSession(s.id);
1331
+ const left = [];
1332
+ for (const { id } of rows) {
1333
+ const why = await doneWith(id);
1334
+ if (!why) continue;
1335
+ if (why.length) {
1336
+ if (id !== parent) left.push({
1337
+ id,
1338
+ why
1339
+ });
1340
+ continue;
1341
+ }
1342
+ await retireSession(id);
1216
1343
  closed++;
1217
1344
  }
1218
- return closed;
1345
+ return {
1346
+ closed,
1347
+ left
1348
+ };
1349
+ }
1350
+ /** A `--close-done` member that answered: closed now, unless the user
1351
+ * has it or closing would lose something (`closeBlockers`), which leaves
1352
+ * it to the reaper. */
1353
+ async function closeAnswered(id) {
1354
+ const s = getSession(id);
1355
+ if (!s || s.keep || typedSince(s, s.answered_at)) return;
1356
+ if ((await closeBlockers(s)).length) return;
1357
+ await retireSession(id);
1358
+ }
1359
+ /** Close `id` once closing it loses nothing (`work session retire`): at
1360
+ * once if that is now, else at the first sweep after — its turn's end, a
1361
+ * job's, its last message answered — unless someone types into it first.
1362
+ * Says whether it closed, or what it waits on. A message reopens it. */
1363
+ async function retire(id) {
1364
+ const s = getSession(id);
1365
+ if (!s) throw closedSession(id) ? httpError(409, `${id} has closed already`) : httpError(404, `no session ${id}`);
1366
+ db.prepare("UPDATE sessions SET retire_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now') WHERE id = ?").run(id);
1367
+ const waits = await closeBlockers(getSession(id));
1368
+ if (!waits.length) {
1369
+ await retireSession(id);
1370
+ const closed = closedSession(id);
1371
+ return {
1372
+ closed: true,
1373
+ reopens: !!closed && reopenable(closed),
1374
+ waits
1375
+ };
1376
+ }
1377
+ notifySessionsChanged(s.workspace_id);
1378
+ return {
1379
+ closed: false,
1380
+ waits
1381
+ };
1219
1382
  }
1220
1383
  /** Never close `id` for being done, as `--keep` would have started it
1221
1384
  * (`work session keep`): its lead has follow-ups for it. */
@@ -1284,4 +1447,4 @@ function startTeam() {
1284
1447
  kickPool();
1285
1448
  }
1286
1449
  //#endregion
1287
- export { sendMessage as _, keepSession as a, takeReplies as b, retryMember as c, teamOf as d, teamsOf as f, reopen as g, messageStates as h, createGroup as i, skipMember as l, messageLog as m, closeDone as n, kickPool as o, holdReply as p, closeFinished as r, memberWorkspace as s, clearGroup as t, startTeam as u, sessionGone as v, startMessages as y };
1450
+ export { takeReplies as C, startMessages as S, messageLog as _, createGroup as a, sendMessage as b, kickPool as c, retryMember as d, skipMember as f, holdReply as g, teamsOf as h, closeFinished as i, memberWorkspace as l, teamOf as m, closeBlockers as n, forget as o, startTeam as p, closeDone as r, keepSession as s, clearGroup as t, retire as u, messageStates as v, withdraw as w, sessionGone as x, reopen as y };