@dylanpiercey/work 0.2.18 → 0.2.19

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 (495) hide show
  1. package/README.md +4 -1
  2. package/bin/cli/session.mjs +157 -28
  3. package/bin/work.mjs +10 -1
  4. package/dist/{_BlLEM8du.js → _CsokArOR.js} +109 -15
  5. package/dist/_L2HNAA_8.js +2 -0
  6. package/dist/__TCdgPY5.js +173 -0
  7. package/dist/index.mjs +1597 -1220
  8. package/dist/public/assets/{_DKlB-yMq.js → _-7Amnss4.js} +1 -1
  9. package/dist/public/assets/_-7Amnss4.js.br +0 -0
  10. package/dist/public/assets/_0XXNUttq.js +1 -0
  11. package/dist/public/assets/{_RudCGuBM.js → _0sTkxfPx.js} +1 -1
  12. package/dist/public/assets/_0sTkxfPx.js.br +0 -0
  13. package/dist/public/assets/_0zzYbK0A.js +1 -0
  14. package/dist/public/assets/{_B0FhzjB2.js → _1M3oZPSf.js} +1 -1
  15. package/dist/public/assets/_1M3oZPSf.js.br +0 -0
  16. package/dist/public/assets/_2O5HnHht.js +1 -0
  17. package/dist/public/assets/_7WlUaJPH.js +1 -0
  18. package/dist/public/assets/_8Tr7ByPg.js +1 -0
  19. package/dist/public/assets/_9AXMmQSO.js +1 -0
  20. package/dist/public/assets/_B1VqbV-X.js +1 -0
  21. package/dist/public/assets/{_DGRgLaG-.js → _B9I2AEux.js} +1 -1
  22. package/dist/public/assets/_B9I2AEux.js.br +0 -0
  23. package/dist/public/assets/{_Dh9434oc.js → _B9qGqvit.js} +1 -1
  24. package/dist/public/assets/{_DB7_Yora.js → _B9xuaMHt.js} +1 -1
  25. package/dist/public/assets/_B9xuaMHt.js.br +0 -0
  26. package/dist/public/assets/{_HpxvfbM2.js → _BAWjkhA8.js} +1 -1
  27. package/dist/public/assets/_BAWjkhA8.js.br +0 -0
  28. package/dist/public/assets/{_CpVeIwQ4.js → _BBCzcNZY.js} +1 -1
  29. package/dist/public/assets/_BBCzcNZY.js.br +0 -0
  30. package/dist/public/assets/_BBW2szHh.js +1 -0
  31. package/dist/public/assets/_BCP2Njnu.js +1 -0
  32. package/dist/public/assets/{_WOU8TCkO.js → _BClUYs-k.js} +1 -1
  33. package/dist/public/assets/_BClUYs-k.js.br +0 -0
  34. package/dist/public/assets/{_DwTaEsY5.js → _BDdZkZRc.js} +1 -1
  35. package/dist/public/assets/_BDdZkZRc.js.br +0 -0
  36. package/dist/public/assets/_BEDmGSgS.js +1 -0
  37. package/dist/public/assets/_BEDmGSgS.js.br +0 -0
  38. package/dist/public/assets/{_tJgkkxOD.js → _BH9BIky6.js} +1 -1
  39. package/dist/public/assets/_BH9BIky6.js.br +0 -0
  40. package/dist/public/assets/_BLdi8Ee5.js +1 -0
  41. package/dist/public/assets/{_rv9KtZHz.js → _BPDSQUbl.js} +1 -1
  42. package/dist/public/assets/_BPDSQUbl.js.br +0 -0
  43. package/dist/public/assets/{_sSKEak2x.js → _BQW1kIop.js} +1 -1
  44. package/dist/public/assets/_BQW1kIop.js.br +0 -0
  45. package/dist/public/assets/_BQeoUfFw.js +1 -0
  46. package/dist/public/assets/_BRzroLbh.js +1 -0
  47. package/dist/public/assets/_BSXsTYSe.js +1 -0
  48. package/dist/public/assets/_BTXDT3Na.js +1 -0
  49. package/dist/public/assets/_BXm4xeFI.js +1 -0
  50. package/dist/public/assets/_BY8UeogK.js +1 -0
  51. package/dist/public/assets/_BYpyhp64.js +1 -0
  52. package/dist/public/assets/_BYpyhp64.js.br +0 -0
  53. package/dist/public/assets/_B_Kz7LnY.js +1 -0
  54. package/dist/public/assets/{_DYxQeog7.js → _Bcc0Xs64.js} +1 -1
  55. package/dist/public/assets/_Bcc0Xs64.js.br +0 -0
  56. package/dist/public/assets/{_CUxBk_RE.js → _BdSsUhCi.js} +1 -1
  57. package/dist/public/assets/_BdSsUhCi.js.br +0 -0
  58. package/dist/public/assets/_BdaWssEH.js +1 -0
  59. package/dist/public/assets/{_C46o3wQ8.js → _BhecGD7y.js} +1 -1
  60. package/dist/public/assets/_BhecGD7y.js.br +0 -0
  61. package/dist/public/assets/_Bj9dpPhN.js +1 -0
  62. package/dist/public/assets/{_Cwdn40Q2.js → _BjZqS7za.js} +1 -1
  63. package/dist/public/assets/_BjZqS7za.js.br +0 -0
  64. package/dist/public/assets/_BkSUiyHK.js +1 -0
  65. package/dist/public/assets/_BlshXH2Y.js +16 -0
  66. package/dist/public/assets/_BlshXH2Y.js.br +0 -0
  67. package/dist/public/assets/_BmX-VP7w.js +1 -0
  68. package/dist/public/assets/{_ClHeQc6g.js → _BmpOmFbo.js} +1 -1
  69. package/dist/public/assets/_BmpOmFbo.js.br +0 -0
  70. package/dist/public/assets/_Bo6YntUl.js +1 -0
  71. package/dist/public/assets/{_9KUM3Nch.js → _BprZx4vg.js} +2 -2
  72. package/dist/public/assets/_BprZx4vg.js.br +0 -0
  73. package/dist/public/assets/_Bqm7OnIV.js +1 -0
  74. package/dist/public/assets/_BquBGUNK.js +1 -0
  75. package/dist/public/assets/_BquBGUNK.js.br +0 -0
  76. package/dist/public/assets/_BrB66aRZ.js +1 -0
  77. package/dist/public/assets/{_B2DHvTZR.js → _Bt03HU8S.js} +1 -1
  78. package/dist/public/assets/{_vHqiFYsh.js → _BtedGrGs.js} +1 -1
  79. package/dist/public/assets/_BtedGrGs.js.br +0 -0
  80. package/dist/public/assets/{_BxKDE6Ct.js → _C-BYkx5h.js} +1 -1
  81. package/dist/public/assets/_C-BYkx5h.js.br +0 -0
  82. package/dist/public/assets/{_hbXd8Ogo.js → _C-DhXiEm.js} +1 -1
  83. package/dist/public/assets/_C-DhXiEm.js.br +0 -0
  84. package/dist/public/assets/_C-NBFnST.js +1 -0
  85. package/dist/public/assets/{_DJwY_zBh.js → _C1RigMYD.js} +1 -1
  86. package/dist/public/assets/_C1RigMYD.js.br +0 -0
  87. package/dist/public/assets/_C2vRS-ES.js +1 -0
  88. package/dist/public/assets/{_i6YkSowH.js → _C3fslTAD.js} +1 -1
  89. package/dist/public/assets/_C3fslTAD.js.br +0 -0
  90. package/dist/public/assets/_C4EYjWGn.js +1 -0
  91. package/dist/public/assets/_C4EYjWGn.js.br +0 -0
  92. package/dist/public/assets/{_Df-N1G_n.js → _C6Yt6h_R.js} +1 -1
  93. package/dist/public/assets/_C6Yt6h_R.js.br +0 -0
  94. package/dist/public/assets/{_Dku55Ypt.js → _C7Y4xApK.js} +1 -1
  95. package/dist/public/assets/_C7Y4xApK.js.br +0 -0
  96. package/dist/public/assets/{_CPqT91JX.js → _CB52LkYt.js} +1 -1
  97. package/dist/public/assets/_CB52LkYt.js.br +0 -0
  98. package/dist/public/assets/{_9JG-F3GR.js → _CBEKHwUV.js} +1 -1
  99. package/dist/public/assets/_CBEKHwUV.js.br +0 -0
  100. package/dist/public/assets/_CBSLBYQF.js +1 -0
  101. package/dist/public/assets/{_Ba9OQzPV.js → _CBgzBB_k.js} +1 -1
  102. package/dist/public/assets/_CBgzBB_k.js.br +0 -0
  103. package/dist/public/assets/{_DZqoQxTm.js → _CCoTlnvb.js} +1 -1
  104. package/dist/public/assets/_CCoTlnvb.js.br +0 -0
  105. package/dist/public/assets/_CD26To-f.js +1 -0
  106. package/dist/public/assets/_CDyWgQ0v.js +6 -0
  107. package/dist/public/assets/_CDyWgQ0v.js.br +0 -0
  108. package/dist/public/assets/{_B3Z1kRpD.js → _CEC5O89D.js} +1 -1
  109. package/dist/public/assets/_CEC5O89D.js.br +0 -0
  110. package/dist/public/assets/_CF2kEAU7.js +1 -0
  111. package/dist/public/assets/_CFURqbmO.js +1 -0
  112. package/dist/public/assets/{_DG3L8-RO.js → _CG383oZY.js} +1 -1
  113. package/dist/public/assets/_CG383oZY.js.br +0 -0
  114. package/dist/public/assets/_CHNJosg3.js +1 -0
  115. package/dist/public/assets/{_Cq4DpL3R.js → _CHmEM8Sm.js} +1 -1
  116. package/dist/public/assets/_CHmEM8Sm.js.br +0 -0
  117. package/dist/public/assets/{_DnUBW0Qq.js → _CIfCdAzS.js} +1 -1
  118. package/dist/public/assets/_CKyzH0fl.js +1 -0
  119. package/dist/public/assets/{_YDyNvOET.js → _CL8DzBla.js} +1 -1
  120. package/dist/public/assets/_CL8DzBla.js.br +0 -0
  121. package/dist/public/assets/_CNYS94C5.js +1 -0
  122. package/dist/public/assets/_CNhypHJN.js +1 -0
  123. package/dist/public/assets/_CO-FkxlA.js +1 -0
  124. package/dist/public/assets/_COiGBSpO.js +1 -0
  125. package/dist/public/assets/_COvolvRQ.js +1 -0
  126. package/dist/public/assets/{_DNrRZhO7.js → _CPaMvBMG.js} +1 -1
  127. package/dist/public/assets/_CPaMvBMG.js.br +0 -0
  128. package/dist/public/assets/{_B6VtVybz.js → _CPj_VL66.js} +1 -1
  129. package/dist/public/assets/_CPj_VL66.js.br +0 -0
  130. package/dist/public/assets/_CQJC8Vx4.js +1 -0
  131. package/dist/public/assets/_CRHNlzBC.js +1 -0
  132. package/dist/public/assets/{_B26gPL08.js → _CToqok6Q.js} +1 -1
  133. package/dist/public/assets/_CToqok6Q.js.br +0 -0
  134. package/dist/public/assets/_CUFKkl0B.js +1 -0
  135. package/dist/public/assets/_CZsOUa-q.js +1 -0
  136. package/dist/public/assets/{_BXPUZfKX.js → _C_D5TPb7.js} +1 -1
  137. package/dist/public/assets/_C_D5TPb7.js.br +0 -0
  138. package/dist/public/assets/_CdHI48v6.js +1 -0
  139. package/dist/public/assets/{_B3sH8Usv.js → _CdpmkkzR.js} +1 -1
  140. package/dist/public/assets/_CdpmkkzR.js.br +0 -0
  141. package/dist/public/assets/{_DDWIDZyP.js → _CdtjIoUd.js} +1 -1
  142. package/dist/public/assets/_CdtjIoUd.js.br +0 -0
  143. package/dist/public/assets/_Ce9Tv01m.js +1 -0
  144. package/dist/public/assets/_CeC7Lv10.js +1 -0
  145. package/dist/public/assets/{_Bs_MPTBZ.js → _CfP0f0PU.js} +1 -1
  146. package/dist/public/assets/_CfP0f0PU.js.br +0 -0
  147. package/dist/public/assets/_Cg7DH3xk.js +1 -0
  148. package/dist/public/assets/_Cg7DH3xk.js.br +0 -0
  149. package/dist/public/assets/_CikNq0z8.js +1 -0
  150. package/dist/public/assets/{_B5NleRC6.js → _Cl7LTITm.js} +1 -1
  151. package/dist/public/assets/_Cl7LTITm.js.br +0 -0
  152. package/dist/public/assets/{_vG7bXn-C.js → _Cmtl59QM.js} +1 -1
  153. package/dist/public/assets/_Cmtl59QM.js.br +0 -0
  154. package/dist/public/assets/_CshYq_Dp.js +1 -0
  155. package/dist/public/assets/{_BIUaA4Nl.js → _CspPbDoP.js} +1 -1
  156. package/dist/public/assets/_CspPbDoP.js.br +0 -0
  157. package/dist/public/assets/{_oVsjszGq.js → _Ctjz3BD9.js} +1 -1
  158. package/dist/public/assets/_Ctjz3BD9.js.br +0 -0
  159. package/dist/public/assets/{_CYcgwayF.js → _CuglAToi.js} +1 -1
  160. package/dist/public/assets/_CuglAToi.js.br +0 -0
  161. package/dist/public/assets/_CwSoAVRN.js +1 -0
  162. package/dist/public/assets/_D0XQV-Hm.js +1 -0
  163. package/dist/public/assets/{_Bn6y2_ex.js → _D36PnqCD.js} +1 -1
  164. package/dist/public/assets/_D36PnqCD.js.br +0 -0
  165. package/dist/public/assets/{_DMCVOg7x.js → _D3IviZbJ.js} +1 -1
  166. package/dist/public/assets/_D3IviZbJ.js.br +0 -0
  167. package/dist/public/assets/_D6rgUB9O.js +1 -0
  168. package/dist/public/assets/{_l9xpLTP_.js → _D7qWWxdI.js} +1 -1
  169. package/dist/public/assets/_D7qWWxdI.js.br +0 -0
  170. package/dist/public/assets/{_DXvsvUmJ.js → _D8ac72_O.js} +1 -1
  171. package/dist/public/assets/_D8ac72_O.js.br +0 -0
  172. package/dist/public/assets/_D9WWxrQR.js +1 -0
  173. package/dist/public/assets/_D9hI5dSA.js +1 -0
  174. package/dist/public/assets/{_f8D86HXZ.js → _DCrPsldZ.js} +1 -1
  175. package/dist/public/assets/_DCrPsldZ.js.br +0 -0
  176. package/dist/public/assets/{_BSRsPQTe.js → _DDcVFyaQ.js} +1 -1
  177. package/dist/public/assets/_DDcVFyaQ.js.br +0 -0
  178. package/dist/public/assets/_DDhkKo8Q.js +1 -0
  179. package/dist/public/assets/{_B4hn3NNW.js → _DJBR8Qwq.js} +1 -1
  180. package/dist/public/assets/_DJBR8Qwq.js.br +0 -0
  181. package/dist/public/assets/_DLpa6VYT.js +1 -0
  182. package/dist/public/assets/_DMqe6rR-.js +1 -0
  183. package/dist/public/assets/{_Cfts4mFJ.js → _DN7pTn2g.js} +1 -1
  184. package/dist/public/assets/_DN7pTn2g.js.br +0 -0
  185. package/dist/public/assets/_DP8UuFuJ.js +1 -0
  186. package/dist/public/assets/_DQedUaqM.js +1 -0
  187. package/dist/public/assets/{_BkGAUdMd.js → _DSCqWPO0.js} +1 -1
  188. package/dist/public/assets/_DSCqWPO0.js.br +0 -0
  189. package/dist/public/assets/{_B-H6ABVZ.js → _DSeQngGR.js} +1 -1
  190. package/dist/public/assets/_DSeQngGR.js.br +0 -0
  191. package/dist/public/assets/{_B-iOtMg6.js → _DTNiWZFr.js} +1 -1
  192. package/dist/public/assets/_DTNiWZFr.js.br +0 -0
  193. package/dist/public/assets/_DThlusXY.js +1 -0
  194. package/dist/public/assets/_DUK16H19.js +1 -0
  195. package/dist/public/assets/_DUZ13t3U.js +1 -0
  196. package/dist/public/assets/{_DUH5o_iN.js → _DWb03VKf.js} +1 -1
  197. package/dist/public/assets/_DWb03VKf.js.br +0 -0
  198. package/dist/public/assets/_DWsyhfgn.js +1 -0
  199. package/dist/public/assets/_DXuzYhW6.js +1 -0
  200. package/dist/public/assets/_DXyOzA2b.js +1 -0
  201. package/dist/public/assets/{_CZsqsL_m.js → _DYUFCi44.js} +1 -1
  202. package/dist/public/assets/_DYUFCi44.js.br +0 -0
  203. package/dist/public/assets/{_DHYIZWev.js → _DYhs8iJg.js} +12 -12
  204. package/dist/public/assets/_DYhs8iJg.js.br +0 -0
  205. package/dist/public/assets/{_DjYscMjF.js → _D__ojGam.js} +1 -1
  206. package/dist/public/assets/_D__ojGam.js.br +0 -0
  207. package/dist/public/assets/_DaFI_W5D.js +1 -0
  208. package/dist/public/assets/{_BI45WgW9.js → _DbT6uo7W.js} +1 -1
  209. package/dist/public/assets/_DbT6uo7W.js.br +0 -0
  210. package/dist/public/assets/_DhnT0cCE.js +1 -0
  211. package/dist/public/assets/_Dm9OGn2q.js +1 -0
  212. package/dist/public/assets/_DmkeGFoM.js +1 -0
  213. package/dist/public/assets/{_CIDjLk1A.js → _DmoI4cIl.js} +1 -1
  214. package/dist/public/assets/_DmoI4cIl.js.br +0 -0
  215. package/dist/public/assets/{_C9k00otG.js → _DpbHp8yR.js} +1 -1
  216. package/dist/public/assets/_DpbHp8yR.js.br +0 -0
  217. package/dist/public/assets/_Dqz_HBE1.js +1 -0
  218. package/dist/public/assets/{_CcINcTUt.js → _DsehEuMD.js} +1 -1
  219. package/dist/public/assets/_DsehEuMD.js.br +0 -0
  220. package/dist/public/assets/{_Bt4cxzaP.js → _Dtx52FYB.js} +1 -1
  221. package/dist/public/assets/_DuEyirL6.js +1 -0
  222. package/dist/public/assets/_DuuloSIi.js +1 -0
  223. package/dist/public/assets/{_BJpBnuvv.js → _DuyCZnNC.js} +1 -1
  224. package/dist/public/assets/_DuyCZnNC.js.br +0 -0
  225. package/dist/public/assets/{_B8joFpf1.js → _Dw1P6xZJ.js} +1 -1
  226. package/dist/public/assets/_Dw1P6xZJ.js.br +0 -0
  227. package/dist/public/assets/{_XWw1j8vS.js → _DzNFlI0M.js} +1 -1
  228. package/dist/public/assets/_DzNFlI0M.js.br +0 -0
  229. package/dist/public/assets/{_8_DzkMgB.js → _EcMqP1xI.js} +1 -1
  230. package/dist/public/assets/_EcMqP1xI.js.br +0 -0
  231. package/dist/public/assets/{_BLeLpnYL.js → _G1BLeMns.js} +1 -1
  232. package/dist/public/assets/_G1BLeMns.js.br +0 -0
  233. package/dist/public/assets/{_BkHLXMjq.js → _G8KNSVdM.js} +1 -1
  234. package/dist/public/assets/_G8KNSVdM.js.br +0 -0
  235. package/dist/public/assets/{_CLV83hY7.js → _J1v2clxU.js} +1 -1
  236. package/dist/public/assets/_J1v2clxU.js.br +0 -0
  237. package/dist/public/assets/{_DRpsUHP5.js → _J3wdy6bJ.js} +1 -1
  238. package/dist/public/assets/_J3wdy6bJ.js.br +0 -0
  239. package/dist/public/assets/{_DUmYv8Kf.js → _MHZgY1AQ.js} +1 -1
  240. package/dist/public/assets/_MHZgY1AQ.js.br +0 -0
  241. package/dist/public/assets/_NHTZitq1.js +2 -0
  242. package/dist/public/assets/_NHTZitq1.js.br +0 -0
  243. package/dist/public/assets/_PsuNqRL9.js +86 -0
  244. package/dist/public/assets/_PsuNqRL9.js.br +0 -0
  245. package/dist/public/assets/{_10dZ1R0m.js → _T5HFHZgl.js} +1 -1
  246. package/dist/public/assets/_T5HFHZgl.js.br +0 -0
  247. package/dist/public/assets/{_o8mJsMHw.js → _UZAFx6D8.js} +1 -1
  248. package/dist/public/assets/_UZAFx6D8.js.br +0 -0
  249. package/dist/public/assets/_XA8_RQXF.js +1 -0
  250. package/dist/public/assets/{_CcflXOTj.js → _XsB9KmcW.js} +1 -1
  251. package/dist/public/assets/_XsB9KmcW.js.br +0 -0
  252. package/dist/public/assets/{_C-z8Ntse.js → _YoXk_8Bl.js} +1 -1
  253. package/dist/public/assets/_YoXk_8Bl.js.br +0 -0
  254. package/dist/public/assets/_YubCdy3Z.js +1 -0
  255. package/dist/public/assets/{_BXHggM8M.js → _bDI-pCZR.js} +1 -1
  256. package/dist/public/assets/_bDI-pCZR.js.br +0 -0
  257. package/dist/public/assets/{_BD1SQU0V.js → _bHL-NcWS.js} +1 -1
  258. package/dist/public/assets/_bHL-NcWS.js.br +0 -0
  259. package/dist/public/assets/_bqRzDYc8.js +1 -0
  260. package/dist/public/assets/{_GK8r-gEu.js → _briyaWgK.js} +1 -1
  261. package/dist/public/assets/_briyaWgK.js.br +0 -0
  262. package/dist/public/assets/{_DG_QOtsx.js → _dVHSDgPC.js} +1 -1
  263. package/dist/public/assets/_dVHSDgPC.js.br +0 -0
  264. package/dist/public/assets/_gkZjZ9I4.js +1 -0
  265. package/dist/public/assets/_plyCYAnN.js +1 -0
  266. package/dist/public/assets/_q0Z44mWJ.js +1 -0
  267. package/dist/public/assets/_q0Z44mWJ.js.br +0 -0
  268. package/dist/public/assets/{_CFKwHn62.js → _qAsGEOt5.js} +1 -1
  269. package/dist/public/assets/_qAsGEOt5.js.br +0 -0
  270. package/dist/public/assets/{_w-MAJku6.js → _qxffRpjc.js} +1 -1
  271. package/dist/public/assets/{_CX5VOdNU.js → _uCKs5N6Q.js} +1 -1
  272. package/dist/public/assets/_uCKs5N6Q.js.br +0 -0
  273. package/dist/public/assets/_utWnC80Q.js +1 -0
  274. package/dist/public/assets/_utvzcBHT.js +1 -0
  275. package/dist/public/assets/_v8WbCPI8.js +1 -0
  276. package/dist/public/assets/_yK4b_Bl5.js +1 -0
  277. package/dist/public/assets/_yoQW4BY5.js +1 -0
  278. package/dist/public/assets/_zB6USXHX.js +1 -0
  279. package/dist/public/assets/{_5tN48iuJ.js → _zN8SypHW.js} +1 -1
  280. package/dist/public/assets/_zN8SypHW.js.br +0 -0
  281. package/dist/public/assets/files-view-Fl0rU3Ns.js +2 -0
  282. package/dist/public/assets/manage-workspace-DggRcsXf.js +2 -0
  283. package/dist/public/assets/new-C7NxTJAT.js +1 -0
  284. package/dist/public/assets/new-workspace-C0pw5Iz1.js +2 -0
  285. package/dist/public/assets/review-view-C4YQ0J-X.js +2 -0
  286. package/dist/public/assets/settings-C7NxTJAT.js +1 -0
  287. package/dist/public/assets/settings-page-Cl_1tWCv.js +2 -0
  288. package/dist/public/assets/styles-Vcsj4CA7.css +1 -0
  289. package/dist/public/assets/styles-Vcsj4CA7.css.br +0 -0
  290. package/dist/public/assets/w-C7NxTJAT.js +1 -0
  291. package/dist/public/assets/w._-BbFH2lR-.js +1 -0
  292. package/dist/public/assets/w._-C7NxTJAT.js +1 -0
  293. package/dist/public/assets/w._-YIzLOiyZ.js +1 -0
  294. package/lib/preview/media.d.mts +1 -1
  295. package/lib/preview/media.mjs +15 -2
  296. package/package.json +1 -1
  297. package/dist/_BAJGOEa1.js +0 -168
  298. package/dist/_t9VsALwo.js +0 -2
  299. package/dist/public/assets/_10dZ1R0m.js.br +0 -0
  300. package/dist/public/assets/_1EPD0XJG.js +0 -1
  301. package/dist/public/assets/_1jA3fFvQ.js +0 -1
  302. package/dist/public/assets/_4Sj6a8Ya.js +0 -1
  303. package/dist/public/assets/_4Sj6a8Ya.js.br +0 -0
  304. package/dist/public/assets/_5tN48iuJ.js.br +0 -0
  305. package/dist/public/assets/_8_DzkMgB.js.br +0 -0
  306. package/dist/public/assets/_9JG-F3GR.js.br +0 -0
  307. package/dist/public/assets/_9KUM3Nch.js.br +0 -0
  308. package/dist/public/assets/_B-H6ABVZ.js.br +0 -0
  309. package/dist/public/assets/_B-iOtMg6.js.br +0 -0
  310. package/dist/public/assets/_B0FhzjB2.js.br +0 -0
  311. package/dist/public/assets/_B26gPL08.js.br +0 -0
  312. package/dist/public/assets/_B3Z1kRpD.js.br +0 -0
  313. package/dist/public/assets/_B3sH8Usv.js.br +0 -0
  314. package/dist/public/assets/_B42hLH2K.js +0 -1
  315. package/dist/public/assets/_B4hn3NNW.js.br +0 -0
  316. package/dist/public/assets/_B5NleRC6.js.br +0 -0
  317. package/dist/public/assets/_B5fRGxPQ.js +0 -1
  318. package/dist/public/assets/_B5fRGxPQ.js.br +0 -0
  319. package/dist/public/assets/_B65yR5Ej.js +0 -1
  320. package/dist/public/assets/_B6Sh9WEH.js +0 -1
  321. package/dist/public/assets/_B6VtVybz.js.br +0 -0
  322. package/dist/public/assets/_B7rJ4n9b.js +0 -1
  323. package/dist/public/assets/_B8M-AD29.js +0 -1
  324. package/dist/public/assets/_B8joFpf1.js.br +0 -0
  325. package/dist/public/assets/_B9nA-Uh1.js +0 -1
  326. package/dist/public/assets/_B9nA-Uh1.js.br +0 -0
  327. package/dist/public/assets/_BA6X_Aj6.js +0 -1
  328. package/dist/public/assets/_BBFJV2Bx.js +0 -1
  329. package/dist/public/assets/_BCW5GFMW.js +0 -1
  330. package/dist/public/assets/_BD1SQU0V.js.br +0 -0
  331. package/dist/public/assets/_BEpd9Y1R.js +0 -1
  332. package/dist/public/assets/_BEy7R4W_.js +0 -1
  333. package/dist/public/assets/_BFGJOHQb.js +0 -1
  334. package/dist/public/assets/_BI45WgW9.js.br +0 -0
  335. package/dist/public/assets/_BIKvQKWe.js +0 -1
  336. package/dist/public/assets/_BIPnL2aI.js +0 -1
  337. package/dist/public/assets/_BIUaA4Nl.js.br +0 -0
  338. package/dist/public/assets/_BJpBnuvv.js.br +0 -0
  339. package/dist/public/assets/_BLeLpnYL.js.br +0 -0
  340. package/dist/public/assets/_BMb5ANTv.js +0 -1
  341. package/dist/public/assets/_BSRsPQTe.js.br +0 -0
  342. package/dist/public/assets/_BVuerXin.js +0 -6
  343. package/dist/public/assets/_BVuerXin.js.br +0 -0
  344. package/dist/public/assets/_BWV8aSlZ.js +0 -1
  345. package/dist/public/assets/_BXHggM8M.js.br +0 -0
  346. package/dist/public/assets/_BXPUZfKX.js.br +0 -0
  347. package/dist/public/assets/_BYebhygn.js +0 -1
  348. package/dist/public/assets/_BZgCxd-U.js +0 -1
  349. package/dist/public/assets/_BZgCxd-U.js.br +0 -0
  350. package/dist/public/assets/_B_W51WxU.js +0 -1
  351. package/dist/public/assets/_B_jFFNyT.js +0 -1
  352. package/dist/public/assets/_Ba9OQzPV.js.br +0 -0
  353. package/dist/public/assets/_BayiY7GU.js +0 -1
  354. package/dist/public/assets/_BcDMeS82.js +0 -1
  355. package/dist/public/assets/_BdD1sZp_.js +0 -1
  356. package/dist/public/assets/_Bg_WwlL2.js +0 -1
  357. package/dist/public/assets/_BhHzv4g0.js +0 -1
  358. package/dist/public/assets/_BjEinMEe.js +0 -1
  359. package/dist/public/assets/_BjEinMEe.js.br +0 -0
  360. package/dist/public/assets/_BkGAUdMd.js.br +0 -0
  361. package/dist/public/assets/_BkHLXMjq.js.br +0 -0
  362. package/dist/public/assets/_BmSWsZvV.js +0 -1
  363. package/dist/public/assets/_Bn6y2_ex.js.br +0 -0
  364. package/dist/public/assets/_Bp2gqUaf.js +0 -1
  365. package/dist/public/assets/_Bs6oYKkD.js +0 -1
  366. package/dist/public/assets/_Bs_MPTBZ.js.br +0 -0
  367. package/dist/public/assets/_Bt13j1ev.js +0 -1
  368. package/dist/public/assets/_BwlnYt-t.js +0 -1
  369. package/dist/public/assets/_Bx9aUXTG.js +0 -1
  370. package/dist/public/assets/_BxKDE6Ct.js.br +0 -0
  371. package/dist/public/assets/_BymFDqKj.js +0 -1
  372. package/dist/public/assets/_C-z8Ntse.js.br +0 -0
  373. package/dist/public/assets/_C0XUbqWe.js +0 -1
  374. package/dist/public/assets/_C1upDwBv.js +0 -1
  375. package/dist/public/assets/_C3f4huqn.js +0 -1
  376. package/dist/public/assets/_C46o3wQ8.js.br +0 -0
  377. package/dist/public/assets/_C4_3qKLX.js +0 -1
  378. package/dist/public/assets/_C7tG4xwv.js +0 -1
  379. package/dist/public/assets/_C8LciIOa.js +0 -1
  380. package/dist/public/assets/_C9k00otG.js.br +0 -0
  381. package/dist/public/assets/_CBG92pZO.js +0 -1
  382. package/dist/public/assets/_CBfI2lSr.js +0 -1
  383. package/dist/public/assets/_CFKwHn62.js.br +0 -0
  384. package/dist/public/assets/_CHDvRNgn.js +0 -1
  385. package/dist/public/assets/_CIDjLk1A.js.br +0 -0
  386. package/dist/public/assets/_CLV83hY7.js.br +0 -0
  387. package/dist/public/assets/_CO8ZosDU.js +0 -1
  388. package/dist/public/assets/_CPqT91JX.js.br +0 -0
  389. package/dist/public/assets/_CRZ03hrO.js +0 -1
  390. package/dist/public/assets/_CUKvJRmi.js +0 -1
  391. package/dist/public/assets/_CU_FKEsy.js +0 -1
  392. package/dist/public/assets/_CUxBk_RE.js.br +0 -0
  393. package/dist/public/assets/_CW_vyZfo.js +0 -1
  394. package/dist/public/assets/_CX5VOdNU.js.br +0 -0
  395. package/dist/public/assets/_CYcgwayF.js.br +0 -0
  396. package/dist/public/assets/_CZsqsL_m.js.br +0 -0
  397. package/dist/public/assets/_C_a8QggH.js +0 -1
  398. package/dist/public/assets/_C_ymFHNL.js +0 -1
  399. package/dist/public/assets/_CaU4irFc.js +0 -1
  400. package/dist/public/assets/_Cb3fSi2R.js +0 -1
  401. package/dist/public/assets/_CcINcTUt.js.br +0 -0
  402. package/dist/public/assets/_CcflXOTj.js.br +0 -0
  403. package/dist/public/assets/_Cfts4mFJ.js.br +0 -0
  404. package/dist/public/assets/_ClHeQc6g.js.br +0 -0
  405. package/dist/public/assets/_CnSlVcEh.js +0 -1
  406. package/dist/public/assets/_Co71-HWR.js +0 -1
  407. package/dist/public/assets/_CpEeHKyF.js +0 -1
  408. package/dist/public/assets/_CpVeIwQ4.js.br +0 -0
  409. package/dist/public/assets/_Cq4DpL3R.js.br +0 -0
  410. package/dist/public/assets/_CvxsvMFa.js +0 -1
  411. package/dist/public/assets/_Cwdn40Q2.js.br +0 -0
  412. package/dist/public/assets/_CzN0wC_5.js +0 -16
  413. package/dist/public/assets/_CzN0wC_5.js.br +0 -0
  414. package/dist/public/assets/_D3ieGLoq.js +0 -1
  415. package/dist/public/assets/_D4wF26fk.js +0 -1
  416. package/dist/public/assets/_D9a9nY1Q.js +0 -1
  417. package/dist/public/assets/_DB7_Yora.js.br +0 -0
  418. package/dist/public/assets/_DDWIDZyP.js.br +0 -0
  419. package/dist/public/assets/_DG3L8-RO.js.br +0 -0
  420. package/dist/public/assets/_DGRgLaG-.js.br +0 -0
  421. package/dist/public/assets/_DG_QOtsx.js.br +0 -0
  422. package/dist/public/assets/_DHYIZWev.js.br +0 -0
  423. package/dist/public/assets/_DJwY_zBh.js.br +0 -0
  424. package/dist/public/assets/_DKlB-yMq.js.br +0 -0
  425. package/dist/public/assets/_DMCVOg7x.js.br +0 -0
  426. package/dist/public/assets/_DMXnrdYy.js +0 -1
  427. package/dist/public/assets/_DMXnrdYy.js.br +0 -0
  428. package/dist/public/assets/_DNrRZhO7.js.br +0 -0
  429. package/dist/public/assets/_DPdb5l-Z.js +0 -1
  430. package/dist/public/assets/_DRpsUHP5.js.br +0 -0
  431. package/dist/public/assets/_DUH5o_iN.js.br +0 -0
  432. package/dist/public/assets/_DUmYv8Kf.js.br +0 -0
  433. package/dist/public/assets/_DXvsvUmJ.js.br +0 -0
  434. package/dist/public/assets/_DYxQeog7.js.br +0 -0
  435. package/dist/public/assets/_DZIDdpeW.js +0 -1
  436. package/dist/public/assets/_DZqoQxTm.js.br +0 -0
  437. package/dist/public/assets/_D_4RJnk0.js +0 -2
  438. package/dist/public/assets/_D_4RJnk0.js.br +0 -0
  439. package/dist/public/assets/_DclJXqwW.js +0 -1
  440. package/dist/public/assets/_Debmjz1c.js +0 -1
  441. package/dist/public/assets/_DeiCZCO_.js +0 -1
  442. package/dist/public/assets/_Df-N1G_n.js.br +0 -0
  443. package/dist/public/assets/_Df_3rEok.js +0 -86
  444. package/dist/public/assets/_Df_3rEok.js.br +0 -0
  445. package/dist/public/assets/_DjYscMjF.js.br +0 -0
  446. package/dist/public/assets/_Dku55Ypt.js.br +0 -0
  447. package/dist/public/assets/_Dm8TVkBX.js +0 -1
  448. package/dist/public/assets/_DoOPrRIy.js +0 -1
  449. package/dist/public/assets/_DqJvxlYV.js +0 -1
  450. package/dist/public/assets/_Drle66GA.js +0 -1
  451. package/dist/public/assets/_DtrvrAfl.js +0 -1
  452. package/dist/public/assets/_DwTaEsY5.js.br +0 -0
  453. package/dist/public/assets/_Dypj9l-z.js +0 -1
  454. package/dist/public/assets/_DyvwMfCp.js +0 -1
  455. package/dist/public/assets/_GK8r-gEu.js.br +0 -0
  456. package/dist/public/assets/_HpxvfbM2.js.br +0 -0
  457. package/dist/public/assets/_RudCGuBM.js.br +0 -0
  458. package/dist/public/assets/_UbfI3k4y.js +0 -1
  459. package/dist/public/assets/_WOU8TCkO.js.br +0 -0
  460. package/dist/public/assets/_XWw1j8vS.js.br +0 -0
  461. package/dist/public/assets/_YDyNvOET.js.br +0 -0
  462. package/dist/public/assets/_f8D86HXZ.js.br +0 -0
  463. package/dist/public/assets/_hbXd8Ogo.js.br +0 -0
  464. package/dist/public/assets/_i6YkSowH.js.br +0 -0
  465. package/dist/public/assets/_k1ciacDf.js +0 -1
  466. package/dist/public/assets/_k6nXIP-i.js +0 -1
  467. package/dist/public/assets/_keX09TNx.js +0 -1
  468. package/dist/public/assets/_l9xpLTP_.js.br +0 -0
  469. package/dist/public/assets/_n9Rb26YX.js +0 -1
  470. package/dist/public/assets/_o8mJsMHw.js.br +0 -0
  471. package/dist/public/assets/_oVsjszGq.js.br +0 -0
  472. package/dist/public/assets/_pM8W420Q.js +0 -1
  473. package/dist/public/assets/_rv9KtZHz.js.br +0 -0
  474. package/dist/public/assets/_sSKEak2x.js.br +0 -0
  475. package/dist/public/assets/_tJgkkxOD.js.br +0 -0
  476. package/dist/public/assets/_uP3LGOtV.js +0 -1
  477. package/dist/public/assets/_vG7bXn-C.js.br +0 -0
  478. package/dist/public/assets/_vHqiFYsh.js.br +0 -0
  479. package/dist/public/assets/_vXJ7nP0d.js +0 -1
  480. package/dist/public/assets/_wvhU__5f.js +0 -1
  481. package/dist/public/assets/_xFMpRp_e.js +0 -1
  482. package/dist/public/assets/_yXimF5vw.js +0 -1
  483. package/dist/public/assets/files-view-BennlUmP.js +0 -2
  484. package/dist/public/assets/manage-workspace-CaESLJdc.js +0 -2
  485. package/dist/public/assets/new-BNH4m99d.js +0 -1
  486. package/dist/public/assets/new-workspace-CwiZjHNn.js +0 -2
  487. package/dist/public/assets/review-view-BdbMyVt7.js +0 -2
  488. package/dist/public/assets/settings-BNH4m99d.js +0 -1
  489. package/dist/public/assets/settings-page-CU3aC70Q.js +0 -2
  490. package/dist/public/assets/styles-ctr-Sxsj.css +0 -1
  491. package/dist/public/assets/styles-ctr-Sxsj.css.br +0 -0
  492. package/dist/public/assets/w-BNH4m99d.js +0 -1
  493. package/dist/public/assets/w._-BNH4m99d.js +0 -1
  494. package/dist/public/assets/w._-CLYxMMR4.js +0 -1
  495. package/dist/public/assets/w._-_w8eUYMy.js +0 -1
package/README.md CHANGED
@@ -59,7 +59,10 @@ work-source # status
59
59
  Everything the app's pages do has a `work` command too, so an agent — or a
60
60
  script — can use and set up work from a terminal: `work help` lists them.
61
61
  Inside a workspace, `work branches`, `work session`, `work topic`,
62
- `work review`, `work notify` and `work open`; to change things,
62
+ `work review`, `work notify` and `work open`; agents start and message each
63
+ other with `work session new|send|wait` — any vendor's, each in a tab of its
64
+ own the user watches, its last message as a turn ends coming back to the
65
+ one that asked as a prompt; to change things,
63
66
  `work workspace create`, `work repo add`, `work config get|set` (checked
64
67
  against what each setting takes; `work config schema` lists them),
65
68
  `work agent|skill|lsp|host` and `work gh login`; `work status` sums the
@@ -1,6 +1,7 @@
1
1
  // `work session`: which session this is (an agent's own pane, by
2
2
  // WORK_SESSION_ID), its name in the session list, and the workspace's
3
- // other sessions — starting one, sending it a prompt, closing it.
3
+ // other sessions — starting one, messaging it and waiting on its reply,
4
+ // closing it (server/messages.ts).
4
5
 
5
6
  /** More sessions than this in one workspace is an agent starting them in
6
7
  * a loop, not a plan: past it, `new` wants --force. */
@@ -16,21 +17,84 @@ function sessionId(ctx) {
16
17
  return id;
17
18
  }
18
19
 
19
- /** The workspace's sessions with their state, this pane's marked. */
20
+ /** How long `wait` waits by default: inside an agent's own tool limit
21
+ * (ten minutes for most), so it ends saying who is still working rather
22
+ * than being killed. */
23
+ const WAIT_S = 540;
24
+ const POLL_MS = 1500;
25
+
26
+ /** The workspace's sessions with their state, this pane's marked, each
27
+ * after the session that started it (as the sidebar lists them). */
20
28
  async function sessionsOf(ctx, wsId) {
21
29
  const me = process.env.WORK_SESSION_ID;
22
30
  const list = await ctx.api.get(`/api/workspaces/${wsId}/sessions`);
23
- return list.map((s) => ({
31
+ const rows = list.map((s) => ({
24
32
  id: s.id,
25
33
  agent: s.agent,
26
34
  title: s.title || null,
27
35
  phase: s.state?.phase || (s.state?.alive ? "idle" : "off"),
36
+ parent: s.parent_id || null,
37
+ waitingOn: s.messages?.waitingOn ?? [],
38
+ queued: s.messages?.queued ?? 0,
28
39
  self: s.id === me,
29
40
  }));
41
+ const ids = new Set(rows.map((s) => s.id));
42
+ const out = [];
43
+ const walk = (s, depth) => {
44
+ if (out.some((o) => o.id === s.id)) return;
45
+ out.push({ ...s, depth });
46
+ for (const c of rows) if (c.parent === s.id) walk(c, depth + 1);
47
+ };
48
+ for (const s of rows) if (!s.parent || !ids.has(s.parent)) walk(s, 0);
49
+ for (const s of rows) walk(s, 0);
50
+ return out;
30
51
  }
31
52
 
32
53
  function sessionLine(ctx, s) {
33
- return `${ctx.pad(s.id, 9)} ${ctx.pad(s.agent, 10)} ${ctx.pad(s.phase, 8)} ${s.title || ""}${s.self ? " (this session)" : ""}`;
54
+ const notes = [
55
+ s.waitingOn.length && `waiting on ${s.waitingOn.join(", ")}`,
56
+ s.queued && `${s.queued} queued for it`,
57
+ s.self && "this session",
58
+ ].filter(Boolean);
59
+ return `${" ".repeat(s.depth ?? 0)}${ctx.pad(s.id, 9)} ${ctx.pad(s.agent, 10)} ${ctx.pad(s.phase, 8)} ${s.title || ""}${notes.length ? ` (${notes.join("; ")})` : ""}`;
60
+ }
61
+
62
+ /** A flag's value, "-" (stdin) included, which ctx.flag takes for a
63
+ * flag of its own. */
64
+ function valueOf(ctx, flag) {
65
+ const i = ctx.args.indexOf(flag);
66
+ if (i >= 0 && ctx.args[i + 1] === "-") return "-";
67
+ return ctx.flag(flag);
68
+ }
69
+
70
+ /** The text itself, or stdin's for "-": a heredoc carries a long prompt
71
+ * with quotes in it, which an argument mangles. */
72
+ async function textOf(value) {
73
+ if (value !== "-") return value;
74
+ const chunks = [];
75
+ for await (const chunk of process.stdin) chunks.push(chunk);
76
+ return Buffer.concat(chunks).toString("utf8").replace(/\n$/, "");
77
+ }
78
+
79
+ /** What became of a message, for the sender. */
80
+ function sentText(id, r) {
81
+ const lines = [
82
+ r.delivered
83
+ ? `sent to ${id}`
84
+ : `queued for ${id} (${r.queued}): typed in once it is at its prompt`,
85
+ ];
86
+ if (r.wantsReply)
87
+ lines.push(
88
+ `Its last message, as that turn ends, comes back to you as a prompt: end your turn to wait for it, or run \`work session wait ${id}\`.`,
89
+ );
90
+ return lines.join("\n");
91
+ }
92
+
93
+ function printReply(r) {
94
+ const head =
95
+ r.kind === "reply" ? `${r.label} replied:` : `${r.label}: ${r.text}`;
96
+ console.log(head);
97
+ if (r.kind === "reply") console.log(`${r.text}\n`);
34
98
  }
35
99
 
36
100
  export const commands = [
@@ -44,14 +108,26 @@ work session list [id|name] [--json]
44
108
  The workspace's sessions, this one marked.
45
109
  work session title "<name>" [--session <id>]
46
110
  Name a session in the session list (empty clears it).
47
- work session new [--agent <id>] [--title "<name>"] [--prompt "<text>"] [--workspace <id|name>] [--force]
48
- Start a session (the default agent unless --agent; "shell" for a
49
- terminal), name it, and hand it a first prompt. Past ${SESSION_CAP} sessions
50
- in the workspace it wants --force.
51
- work session send <id> "<text>"
52
- Type text into a session and press Enter, as the review's Send does.
111
+ work session new [--agent <id>] [--title "<name>"] [--prompt "<text>"|-] [--no-reply] [--workspace <id|name>] [--force]
112
+ Start a session (the default agent unless --agent, any vendor's; "shell"
113
+ for a terminal) in a tab of its own, where the user watches it, name it,
114
+ and hand it a first prompt ("-": read it from stdin). Started from
115
+ another session it is listed under that one, and the prompt is a
116
+ message from it (below). Past ${SESSION_CAP} sessions in the workspace it wants --force.
117
+ work session send <id> "<text>"|- [--no-reply]
118
+ Message an agent session: typed in, headed with who it is from, once
119
+ it is at its prompt — never into a turn under way, a question it asks,
120
+ or a draft someone is typing. From an agent's session it wants a reply
121
+ unless --no-reply: the recipient's last message as that turn ends,
122
+ typed into this session as a prompt of its own. End your turn to wait
123
+ for it. A file's path says more than its text pasted in.
124
+ work session wait [<id>...] [--timeout <seconds>]
125
+ Wait for the replies owed to this session (by those sessions, else by
126
+ any), printing each as it comes; a reply printed here is not typed in
127
+ too. Exits 124 if some are still working after --timeout (${WAIT_S} s).
53
128
  work session kill <id> --yes
54
- Close a session and the process in it.`,
129
+ Close a session and the process in it (whoever waits on its reply is
130
+ told).`,
55
131
  async run(ctx) {
56
132
  const [verb, ...rest] = ctx.parse([
57
133
  "--agent",
@@ -59,6 +135,7 @@ work session kill <id> --yes
59
135
  "--prompt",
60
136
  "--workspace",
61
137
  "--session",
138
+ "--timeout",
62
139
  ]);
63
140
  switch (verb) {
64
141
  case undefined: {
@@ -68,6 +145,7 @@ work session kill <id> --yes
68
145
  if (!me) ctx.die(`no session ${id} in ${ws.name}`);
69
146
  const out = {
70
147
  ...me,
148
+ depth: undefined,
71
149
  workspace: {
72
150
  id: ws.id,
73
151
  name: ws.name,
@@ -77,7 +155,7 @@ work session kill <id> --yes
77
155
  };
78
156
  return ctx.out(out, (s) => {
79
157
  console.log(
80
- `${s.id} ${s.agent} ${s.phase}${s.title ? ` "${s.title}"` : ""}`,
158
+ `${s.id} ${s.agent} ${s.phase}${s.title ? ` "${s.title}"` : ""}${s.waitingOn.length ? ` (waiting on ${s.waitingOn.join(", ")})` : ""}`,
81
159
  );
82
160
  console.log(
83
161
  `workspace ${s.workspace.name} (${s.workspace.id}) ${s.workspace.path}`,
@@ -110,42 +188,93 @@ work session kill <id> --yes
110
188
  `${ws.name} already has ${existing.length} sessions: pass --force to start another`,
111
189
  );
112
190
  const agent = ctx.flag("--agent");
191
+ const me = process.env.WORK_SESSION_ID;
192
+ const prompt = await textOf(valueOf(ctx, "--prompt"));
113
193
  const created = await ctx.api.post(
114
194
  `/api/workspaces/${ws.id}/sessions`,
115
- agent ? { agent } : {},
195
+ { ...(agent ? { agent } : {}), ...(me ? { parent: me } : {}) },
116
196
  );
117
197
  const title = ctx.flag("--title");
118
198
  if (title)
119
199
  await ctx.api.patch(`/api/sessions/${created.id}`, { title });
120
- const prompt = ctx.flag("--prompt");
121
200
  // Sent, the session starts (detached) with it as its first
122
201
  // prompt; otherwise it starts when someone opens it.
123
- if (prompt)
124
- await ctx.api.post(`/api/sessions/${created.id}/send`, {
125
- text: prompt,
126
- });
202
+ const sent = prompt
203
+ ? await ctx.api.post(`/api/sessions/${created.id}/messages`, {
204
+ text: prompt,
205
+ ...(me ? { from: me } : {}),
206
+ reply: !ctx.has("--no-reply"),
207
+ })
208
+ : null;
127
209
  const out = {
128
210
  id: created.id,
129
211
  agent: created.agent,
130
212
  title: title || null,
131
213
  workspace: ws.id,
132
- prompted: !!prompt,
214
+ parent: created.parent_id ?? null,
215
+ prompted: !!sent?.delivered,
216
+ queued: sent?.queued ?? null,
217
+ wantsReply: !!sent?.wantsReply,
133
218
  href: `/w/${ws.id}?s=${created.id}`,
134
219
  };
135
- return ctx.out(out, (s) =>
220
+ return ctx.out(out, (s) => {
136
221
  console.log(
137
222
  `started ${s.id} (${s.agent})${s.prompted ? " with its prompt" : ""}: [${s.title || s.agent}](${s.href})`,
138
- ),
139
- );
223
+ );
224
+ if (s.queued)
225
+ console.log(`its prompt waits to be typed in: ${s.queued}`);
226
+ if (s.wantsReply)
227
+ console.log(
228
+ `Its last message, as that turn ends, comes back to you as a prompt: end your turn to wait for it, or run \`work session wait ${s.id}\`.`,
229
+ );
230
+ });
140
231
  }
141
232
  case "send": {
142
233
  const [id, ...words] = rest;
143
- const text = words.join(" ");
144
- if (!id || !text) ctx.die('usage: work session send <id> "<text>"');
145
- await ctx.api.post(`/api/sessions/${id}/send`, { text });
146
- return ctx.out({ id, sent: true }, () =>
147
- console.log(`sent to ${id}`),
148
- );
234
+ const text = await textOf(words.join(" "));
235
+ if (!id || !text)
236
+ ctx.die('usage: work session send <id> "<text>"|- [--no-reply]');
237
+ const me = process.env.WORK_SESSION_ID;
238
+ const r = await ctx.api.post(`/api/sessions/${id}/messages`, {
239
+ text,
240
+ ...(me ? { from: me } : {}),
241
+ reply: !ctx.has("--no-reply"),
242
+ });
243
+ return ctx.out({ id, ...r }, (r) => console.log(sentText(id, r)));
244
+ }
245
+ case "wait": {
246
+ const me = sessionId(ctx);
247
+ const raw = ctx.flag("--timeout");
248
+ const seconds = raw === undefined ? WAIT_S : Number(raw);
249
+ if (!Number.isFinite(seconds) || seconds < 0)
250
+ ctx.die("--timeout is a number of seconds");
251
+ const until = Date.now() + seconds * 1000;
252
+ const body = rest.length ? { from: rest } : {};
253
+ const replies = [];
254
+ let owing = [];
255
+ for (;;) {
256
+ const r = await ctx.api.post(`/api/sessions/${me}/replies`, body);
257
+ replies.push(...r.replies);
258
+ if (!ctx.json) r.replies.forEach(printReply);
259
+ owing = r.owing;
260
+ if (!owing.length || Date.now() >= until) break;
261
+ await new Promise((res) => setTimeout(res, POLL_MS));
262
+ }
263
+ if (ctx.json)
264
+ console.log(JSON.stringify({ replies, owing }, null, 2));
265
+ else if (!replies.length && !owing.length)
266
+ console.log(
267
+ rest.length
268
+ ? `nothing owed by ${rest.join(", ")}: a reply already typed in is in your prompt`
269
+ : "no session owes this one a reply",
270
+ );
271
+ if (owing.length) {
272
+ ctx.warn(
273
+ `still working: ${owing.map((o) => o.label).join(", ")} (wait again, or end your turn: the reply comes as a prompt)`,
274
+ );
275
+ process.exitCode = 124;
276
+ }
277
+ return;
149
278
  }
150
279
  case "kill": {
151
280
  const [id] = rest;
package/bin/work.mjs CHANGED
@@ -133,7 +133,9 @@ const cli = await cliCommand(command, positional[0]);
133
133
 
134
134
  switch (cli ? "" : command) {
135
135
  case "":
136
- await cli.cmd.run(cliContext(cli.words));
136
+ // `work session --help` is what an agent tries before `work help`.
137
+ if (args.includes("--help") || args.includes("-h")) await helpCmd(command);
138
+ else await cli.cmd.run(cliContext(cli.words));
137
139
  break;
138
140
  case "help":
139
141
  case "--help":
@@ -285,6 +287,13 @@ async function apiCall(method, path, body, timeoutMs = 30_000) {
285
287
  signal: AbortSignal.timeout(timeoutMs),
286
288
  });
287
289
  } catch {
290
+ // Codex runs commands in a sandbox with no network, a local socket
291
+ // included: the server is up, the command has to run outside it,
292
+ // which the agent asks the user for.
293
+ if (process.env.CODEX_SANDBOX_NETWORK_DISABLED)
294
+ die(
295
+ "work cannot reach its server from inside Codex's sandbox (no network there): run this command outside the sandbox, with escalated permissions",
296
+ );
288
297
  die(`no work server on port ${port}. Start one with: work start`);
289
298
  }
290
299
  const text = await res.text();
@@ -478,6 +478,30 @@ var STEPS = [
478
478
  up(db) {
479
479
  db.exec("DELETE FROM settings WHERE key = 'ui.term-predict'");
480
480
  }
481
+ },
482
+ {
483
+ version: 4,
484
+ name: "session messages",
485
+ up(db) {
486
+ db.exec(`
487
+ ALTER TABLE sessions ADD COLUMN parent_id TEXT REFERENCES sessions(id) ON DELETE SET NULL;
488
+
489
+ CREATE TABLE session_messages (
490
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
491
+ to_session TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
492
+ from_session TEXT,
493
+ from_label TEXT,
494
+ kind TEXT NOT NULL CHECK (kind IN ('message', 'reply', 'closed')),
495
+ body TEXT NOT NULL,
496
+ wants_reply INTEGER NOT NULL DEFAULT 0,
497
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')),
498
+ delivered_at TEXT
499
+ );
500
+
501
+ CREATE INDEX session_messages_to ON session_messages(to_session);
502
+ CREATE INDEX session_messages_from ON session_messages(from_session);
503
+ `);
504
+ }
481
505
  }
482
506
  ];
483
507
  var LATEST = STEPS.at(-1).version;
@@ -8215,6 +8239,18 @@ var interruptedAt = /* @__PURE__ */ new Map();
8215
8239
  * finished: the session is working until a turn ends with none left, and
8216
8240
  * that end is the one pushed. */
8217
8241
  var background = /* @__PURE__ */ new Map();
8242
+ /** Each session's last finished turn's message, whole: what a session
8243
+ * that messaged it gets back (server/messages). */
8244
+ var lastMessages = /* @__PURE__ */ new Map();
8245
+ /** Sessions a message is still to wake (server/messages keeps the set):
8246
+ * each asked another something not yet answered, or has one waiting to
8247
+ * be typed in. Like background work, that makes the session working, and
8248
+ * a turn of it that ends meanwhile has handed off rather than finished. */
8249
+ var expecting = /* @__PURE__ */ new Set();
8250
+ /** When someone last typed into each session's pane from a page. */
8251
+ var typedAt = /* @__PURE__ */ new Map();
8252
+ /** Told of each turn's end that stayed the end (`onTurnEnd`). */
8253
+ var turnEndListeners = /* @__PURE__ */ new Set();
8218
8254
  /** A turn's end is pushed once it has stayed ended this long. Stop fires
8219
8255
  * again each time something sends the agent back to work (a stop hook
8220
8256
  * that continues it, a goal loop, background subagents reporting in), and
@@ -8225,7 +8261,7 @@ var listeners = /* @__PURE__ */ new Set();
8225
8261
  function onPhaseChange(fn) {
8226
8262
  listeners.add(fn);
8227
8263
  }
8228
- function setAgentPhase(sessionId, phase, reason, summary) {
8264
+ function setAgentPhase(sessionId, phase, reason, summary, message) {
8229
8265
  reportedAt.set(sessionId, Date.now());
8230
8266
  cancelDone(sessionId);
8231
8267
  if (phase === "idle") {
@@ -8235,10 +8271,13 @@ function setAgentPhase(sessionId, phase, reason, summary) {
8235
8271
  if (phase === "waiting" && reason === "done") {
8236
8272
  const failed = phases.get(sessionId) === "waiting" && reasons.get(sessionId) === "attention";
8237
8273
  if (summary) summaries.set(sessionId, summary);
8274
+ if (message) lastMessages.set(sessionId, message);
8275
+ else lastMessages.delete(sessionId);
8238
8276
  if (phases.has(sessionId)) applyChange(sessionId, () => dropHook(sessionId));
8239
- if (!failed && !background.has(sessionId)) pendingDone.set(sessionId, setTimeout(() => {
8277
+ if (!background.has(sessionId)) pendingDone.set(sessionId, setTimeout(() => {
8240
8278
  pendingDone.delete(sessionId);
8241
- notify(sessionId, "done");
8279
+ const answered = endTurn(sessionId);
8280
+ if (!failed && !answered && !expecting.has(sessionId)) notify(sessionId, "done");
8242
8281
  }, DONE_SETTLE_MS));
8243
8282
  return;
8244
8283
  }
@@ -8273,6 +8312,39 @@ function noteBackground(sessionId, work) {
8273
8312
  else background.delete(sessionId);
8274
8313
  });
8275
8314
  }
8315
+ /** A turn's end once it has stayed the end (`DONE_SETTLE_MS`), with its
8316
+ * last message (undefined: the CLI reports none). A listener returns
8317
+ * whether it passed the end on to another session. */
8318
+ function onTurnEnd(fn) {
8319
+ turnEndListeners.add(fn);
8320
+ }
8321
+ function endTurn(sessionId) {
8322
+ let told = false;
8323
+ for (const fn of turnEndListeners) told = fn(sessionId, lastMessages.get(sessionId)) || told;
8324
+ return told;
8325
+ }
8326
+ /** A turn's end still waiting out `DONE_SETTLE_MS`: it may yet carry on. */
8327
+ function turnSettling(sessionId) {
8328
+ return pendingDone.has(sessionId);
8329
+ }
8330
+ /** The sessions a message is still to wake (server/messages). */
8331
+ function setExpecting(ids) {
8332
+ for (const id of /* @__PURE__ */ new Set([...expecting, ...ids])) {
8333
+ if (expecting.has(id) === ids.has(id)) continue;
8334
+ applyChange(id, () => {
8335
+ if (ids.has(id)) expecting.add(id);
8336
+ else expecting.delete(id);
8337
+ });
8338
+ }
8339
+ }
8340
+ /** Someone typed into the session's pane from a page. */
8341
+ function noteTyped(sessionId) {
8342
+ typedAt.set(sessionId, Date.now());
8343
+ }
8344
+ /** When someone last typed into the session's pane (0: not this run). */
8345
+ function lastTypedAt(sessionId) {
8346
+ return typedAt.get(sessionId) ?? 0;
8347
+ }
8276
8348
  function cancelDone(sessionId) {
8277
8349
  const timer = pendingDone.get(sessionId);
8278
8350
  if (!timer) return;
@@ -8377,6 +8449,8 @@ async function notify(sessionId, reason) {
8377
8449
  function clearAgentPhase(sessionId) {
8378
8450
  cancelDone(sessionId);
8379
8451
  summaries.delete(sessionId);
8452
+ lastMessages.delete(sessionId);
8453
+ typedAt.delete(sessionId);
8380
8454
  reportedAt.delete(sessionId);
8381
8455
  interruptedAt.delete(sessionId);
8382
8456
  if (!phases.has(sessionId) && !scraped.has(sessionId) && !background.has(sessionId)) return;
@@ -8387,11 +8461,17 @@ function clearAgentPhase(sessionId) {
8387
8461
  background.delete(sessionId);
8388
8462
  });
8389
8463
  }
8390
- /** What a session is doing. The hook wins where there is one: it reports
8391
- * the turn itself, where tmux only sees the pane still moving after it. */
8392
- function agentPhase(sessionId) {
8464
+ /** What a session's own turn is doing. The hook wins where there is one:
8465
+ * it reports the turn itself, where tmux only sees the pane still moving
8466
+ * after it. Undefined: at its prompt, where a message can be typed in. */
8467
+ function turnPhase(sessionId) {
8393
8468
  return hookPhase(sessionId) ?? scraped.get(sessionId);
8394
8469
  }
8470
+ /** What a session is doing: its turn, else working while a message is
8471
+ * still to wake it — a session that handed work to another is not done. */
8472
+ function agentPhase(sessionId) {
8473
+ return turnPhase(sessionId) ?? (expecting.has(sessionId) ? "working" : void 0);
8474
+ }
8395
8475
  /** Apply a mutation and broadcast when it moved the session's phase (or,
8396
8476
  * `force`, its reason: finished and blocked draw differently). Only a
8397
8477
  * hook ever reports "waiting", so a transition into it is a push. */
@@ -8408,7 +8488,7 @@ function publishChange(sessionId) {
8408
8488
  const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
8409
8489
  if (row?.workspace_id) {
8410
8490
  const workspaceId = row.workspace_id;
8411
- import("./_t9VsALwo.js").then((m) => m.notifySessionsChanged(workspaceId));
8491
+ import("./_L2HNAA_8.js").then((m) => m.notifySessionsChanged(workspaceId));
8412
8492
  return;
8413
8493
  }
8414
8494
  publish("sessions.changed");
@@ -8472,7 +8552,8 @@ function readClaudeStyle(p, reported) {
8472
8552
  const text = str$1(p.last_assistant_message) || str$1(p["last-assistant-message"]) || str$1(p.lastAssistantMessage);
8473
8553
  if (text) return {
8474
8554
  reason,
8475
- summary: cleanSummary(text)
8555
+ summary: cleanSummary(text),
8556
+ message: text
8476
8557
  };
8477
8558
  if (kind) return {
8478
8559
  reason,
@@ -9503,7 +9584,10 @@ function readHook$4(p, reported, _state) {
9503
9584
  };
9504
9585
  }
9505
9586
  const read = readClaudeStyle(p, reported);
9506
- if (!read.summary && reported === "done") read.summary = lastMessageFromTranscript(p);
9587
+ if (!read.summary && reported === "done") {
9588
+ read.message = lastMessageFromTranscript(p);
9589
+ if (read.message) read.summary = cleanSummary(read.message);
9590
+ }
9507
9591
  return read;
9508
9592
  }
9509
9593
  /** The last non-empty `assistant.message` of the turn that just ended in
@@ -9527,7 +9611,7 @@ function lastMessageFromTranscript(p) {
9527
9611
  try {
9528
9612
  const ev = JSON.parse(lines[i]);
9529
9613
  const content = ev.type === "assistant.message" ? ev.data?.content : void 0;
9530
- if (typeof content === "string" && content.trim()) return cleanSummary(content);
9614
+ if (typeof content === "string" && content.trim()) return content.trim();
9531
9615
  } catch {}
9532
9616
  }
9533
9617
  } finally {
@@ -10215,7 +10299,8 @@ function readHook$1(p, reported) {
10215
10299
  const summary = str$1(p.summary);
10216
10300
  return {
10217
10301
  reason: reported,
10218
- summary: summary ? cleanSummary(summary) : void 0
10302
+ summary: summary ? cleanSummary(summary) : void 0,
10303
+ message: summary || void 0
10219
10304
  };
10220
10305
  }
10221
10306
  var opencode = {
@@ -10323,7 +10408,8 @@ function readHook(p, reported) {
10323
10408
  const summary = str$1(p.summary);
10324
10409
  return {
10325
10410
  reason: reported,
10326
- summary: summary ? cleanSummary(summary) : void 0
10411
+ summary: summary ? cleanSummary(summary) : void 0,
10412
+ message: summary || void 0
10327
10413
  };
10328
10414
  }
10329
10415
  //#endregion
@@ -10410,14 +10496,15 @@ function getSession(id) {
10410
10496
  * workspace at once (restored tabs, a phone and a desktop) both list no
10411
10497
  * sessions before either POST lands. The check and the insert run in one
10412
10498
  * synchronous step, so the second gets the first one's session. */
10413
- function createSession(workspaceId, agent, ifEmpty = false) {
10499
+ function createSession(workspaceId, agent, ifEmpty = false, parent) {
10414
10500
  if (!isKnownAgent(agent)) throw new Error(`unknown session kind: ${agent}`);
10415
10501
  if (ifEmpty) {
10416
10502
  const first = listSessions(workspaceId)[0];
10417
10503
  if (first) return first;
10418
10504
  }
10505
+ const parentId = parent && getSession(parent)?.workspace_id === workspaceId ? parent : null;
10419
10506
  const id = Math.random().toString(36).slice(2, 10);
10420
- db.prepare("INSERT INTO sessions (id, workspace_id, agent) VALUES (?, ?, ?)").run(id, workspaceId, agent);
10507
+ db.prepare("INSERT INTO sessions (id, workspace_id, agent, parent_id) VALUES (?, ?, ?, ?)").run(id, workspaceId, agent, parentId);
10421
10508
  notifySessionsChanged(workspaceId);
10422
10509
  return getSession(id);
10423
10510
  }
@@ -10438,7 +10525,14 @@ async function killSession(id) {
10438
10525
  async function disposeSessions(sessions) {
10439
10526
  for (const session of sessions) await disposeSession(session.id);
10440
10527
  }
10528
+ /** Told of a session about to go, while its row is still there (its
10529
+ * messages go with it: server/messages answers what it owed first). */
10530
+ var disposeListeners = /* @__PURE__ */ new Set();
10531
+ function onSessionDispose(fn) {
10532
+ disposeListeners.add(fn);
10533
+ }
10441
10534
  async function disposeSession(id) {
10535
+ for (const fn of disposeListeners) fn(id);
10442
10536
  await tmux([
10443
10537
  "kill-session",
10444
10538
  "-t",
@@ -10956,4 +11050,4 @@ function sleep(ms) {
10956
11050
  return new Promise((resolve) => setTimeout(resolve, ms));
10957
11051
  }
10958
11052
  //#endregion
10959
- export { iconSvg as $, subscribe as $t, blankRow as A, which as At, onPhaseChange as B, agentById as Bt, tmuxWasStarted as C, doctor as Ct, inside as D, setupPath as Dt, reportsWorking as E, miseVersions as Et, interruptedSinceReport as F, untrackedCacheAllowed as Ft, settleQuietWorking as G, applyPrefChange as Gt, setAgentPhase as H, catalogPin as Ht, noteBackground as I, firewallProbe as It, agentFromCommand as J, checked as Jt, agentBadge as K, FRAME_ANCESTORS as Kt, noteInterrupt as L, DEFAULT_GITHUB_HOST as Lt, clearAgentPhase as M, unreachableText as Mt, hookPhase as N, enableUntrackedCache as Nt, realInside as O, stableGh as Ot, hookReportedAt as P, unsetCaches as Pt, getInstance as Q, publishJson as Qt, noteUserAnswered as R, PROJECT_TOOLS as Rt, tmuxName as S, discoverAgents as St, readHookPayload as T, miseInstalls as Tt, setScrapedPhase as U, parseAgentId as Ut, sessionWatched as V, agentLabel$1 as Vt, setSessionViewers as W, toolById as Wt, agentMeta as X, readBody as Xt, agentLabel as Y, httpError as Yt, ACCENT_RE as Z, publish as Zt, notifySessionsChanged as _, getSetting as _t, creationOf as a, TMUX_SOCKET as an, saveSubscription as at, sendToSession as b, setPref as bt, forgetPanes as c, gitEnv as cn, PREF_MAX as ct, killWorkspaceSessions as d, config as dn, allPrefs as dt, subscriberCount as en, manifest as et, listPanes as f, shared as fn, changePref as ft, newSessionArgs as g, enabledAgents as gt, markTmuxStarted as h, disabledAgents as ht, createSession as i, workspacePath as in, pushPublicKey as it, agentPhase as j, hostReach as jt, realInsideSync as k, tilde as kt, getSession as l, run$2 as ln, WORKSPACE_PREFS as lt, listSessions as m, withLock as mn, deleteWorkspacePrefs as mt, cleanEnv as n, db as nn, setInstance as nt, disposeSessions as o, gh as on, sendPush as ot, listPanesWithin as p, swr as pn, deleteSetting as pt, agentFamily as q, FRAME_HEADERS as qt, clearTmuxStarted as r, get as rn, deleteSubscription as rt, ensureTmuxServer as s, git as sn, validSubscription as st, beginCreation as t, all as tn, normalizeAccent as tt, killSession as u, tmux as un, agentChoices as ut, panePids as v, preferredAgent as vt, AGENTS as w, ghKnownHosts as wt, sessionStates as x, setSetting as xt, renameSession as y, setDisabledAgents as yt, notifyEventOn as z, TOOLS as zt };
11053
+ export { agentBadge as $, FRAME_ANCESTORS as $t, realInsideSync as A, doctor as At, noteTyped as B, enableUntrackedCache as Bt, tmuxName as C, enabledAgents as Ct, reportsWorking as D, setPref as Dt, readHookPayload as E, setDisabledAgents as Et, hookReportedAt as F, stableGh as Ft, sessionWatched as G, PROJECT_TOOLS as Gt, notifyEventOn as H, untrackedCacheAllowed as Ht, interruptedSinceReport as I, tilde as It, setScrapedPhase as J, agentLabel$1 as Jt, setAgentPhase as K, TOOLS as Kt, lastTypedAt as L, which as Lt, agentPhase as M, miseInstalls as Mt, clearAgentPhase as N, miseVersions as Nt, inside as O, setSetting as Ot, hookPhase as P, setupPath as Pt, turnSettling as Q, applyPrefChange as Qt, noteBackground as R, hostReach as Rt, sessionStates as S, disabledAgents as St, AGENTS as T, preferredAgent as Tt, onPhaseChange as U, firewallProbe as Ut, noteUserAnswered as V, unsetCaches as Vt, onTurnEnd as W, DEFAULT_GITHUB_HOST as Wt, settleQuietWorking as X, parseAgentId as Xt, setSessionViewers as Y, catalogPin as Yt, turnPhase as Z, toolById as Zt, notifySessionsChanged as _, tmux as _n, agentChoices as _t, creationOf as a, publishJson as an, getInstance as at, renameSession as b, swr as bn, deleteSetting as bt, forgetPanes as c, all as cn, normalizeAccent as ct, killWorkspaceSessions as d, workspacePath as dn, pushPublicKey as dt, FRAME_HEADERS as en, agentFamily as et, listPanes as f, TMUX_SOCKET as fn, saveSubscription as ft, newSessionArgs as g, run$2 as gn, WORKSPACE_PREFS as gt, markTmuxStarted as h, gitEnv as hn, PREF_MAX as ht, createSession as i, publish as in, ACCENT_RE as it, blankRow as j, ghKnownHosts as jt, realInside as k, discoverAgents as kt, getSession as l, db as ln, setInstance as lt, listSessions as m, git as mn, validSubscription as mt, cleanEnv as n, httpError as nn, agentLabel as nt, disposeSessions as o, subscribe as on, iconSvg as ot, listPanesWithin as p, gh as pn, sendPush as pt, setExpecting as q, agentById as qt, clearTmuxStarted as r, readBody as rn, agentMeta as rt, ensureTmuxServer as s, subscriberCount as sn, manifest as st, beginCreation as t, checked as tn, agentFromCommand as tt, killSession as u, get as un, deleteSubscription as ut, onSessionDispose as v, config as vn, allPrefs as vt, tmuxWasStarted as w, getSetting as wt, sendToSession as x, withLock as xn, deleteWorkspacePrefs as xt, panePids as y, shared as yn, changePref as yt, noteInterrupt as z, unreachableText as zt };
@@ -0,0 +1,2 @@
1
+ import { _ as notifySessionsChanged } from "./_CsokArOR.js";
2
+ export { notifySessionsChanged };