@dylanpiercey/work 0.2.20 → 0.2.22

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 (504) hide show
  1. package/README.md +1 -1
  2. package/bin/cli/session.mjs +26 -24
  3. package/bin/cli/topic.mjs +10 -0
  4. package/dist/{_Hb3LeA5Q.js → _BdBBZphI.js} +43 -3
  5. package/dist/_Bu1xx1j4.js +2 -0
  6. package/dist/_C9UcJEf9.js +2 -0
  7. package/dist/{_BHlbSSAl.js → _DdVpb0NT.js} +73 -73
  8. package/dist/{_C9c_BxRk.js → _Dqcw6PJn.js} +29 -71
  9. package/dist/index.mjs +1509 -1608
  10. package/dist/public/assets/_1ILmLLBG.js +1 -0
  11. package/dist/public/assets/{_BFD3zDfn.js → _1sZQ0eRv.js} +1 -1
  12. package/dist/public/assets/_1sZQ0eRv.js.br +0 -0
  13. package/dist/public/assets/{_CHwp4prQ.js → _23Uz-owF.js} +1 -1
  14. package/dist/public/assets/_23Uz-owF.js.br +0 -0
  15. package/dist/public/assets/_34CbiDVl.js +2 -0
  16. package/dist/public/assets/_34CbiDVl.js.br +0 -0
  17. package/dist/public/assets/_3I2tROZb.js +1 -0
  18. package/dist/public/assets/{_BHxaJLxf.js → _4cEqdNvh.js} +1 -1
  19. package/dist/public/assets/_4cEqdNvh.js.br +0 -0
  20. package/dist/public/assets/{_BQMwlV-0.js → _64GOyyOB.js} +1 -1
  21. package/dist/public/assets/_64GOyyOB.js.br +0 -0
  22. package/dist/public/assets/{_2M3NjHcy.js → _6QZtRBus.js} +1 -1
  23. package/dist/public/assets/{_BeQUut65.js → _8RDpbidN.js} +1 -1
  24. package/dist/public/assets/_8RDpbidN.js.br +0 -0
  25. package/dist/public/assets/_9CjR6hLh.js +1 -0
  26. package/dist/public/assets/{_D_AjKzkm.js → _AG96qq5c.js} +1 -1
  27. package/dist/public/assets/_AG96qq5c.js.br +0 -0
  28. package/dist/public/assets/_B-LC6V8J.js +1 -0
  29. package/dist/public/assets/_B-n1N1R6.js +1 -0
  30. package/dist/public/assets/_B-n1N1R6.js.br +0 -0
  31. package/dist/public/assets/_B0t2Y-hr.js +1 -0
  32. package/dist/public/assets/{_D-wwbDX7.js → _B4ktpJPW.js} +1 -1
  33. package/dist/public/assets/_B4ktpJPW.js.br +0 -0
  34. package/dist/public/assets/_B58i39eE.js +1 -0
  35. package/dist/public/assets/_B5DZ-CwH.js +1 -0
  36. package/dist/public/assets/_B69YLvAs.js +1 -0
  37. package/dist/public/assets/{_CCmHKlXX.js → _B6T9l5dc.js} +1 -1
  38. package/dist/public/assets/_B6T9l5dc.js.br +0 -0
  39. package/dist/public/assets/{_Dow17jzJ.js → _B8IaRv-R.js} +1 -1
  40. package/dist/public/assets/_B8IaRv-R.js.br +0 -0
  41. package/dist/public/assets/{_CGH2Busx.js → _B8QgPZ90.js} +1 -1
  42. package/dist/public/assets/_B8QgPZ90.js.br +0 -0
  43. package/dist/public/assets/_B9ig3GQ6.js +1 -0
  44. package/dist/public/assets/{_UBgRR4E9.js → _BBNVjYRZ.js} +1 -1
  45. package/dist/public/assets/_BBNVjYRZ.js.br +0 -0
  46. package/dist/public/assets/_BCF-crck.js +1 -0
  47. package/dist/public/assets/_BF_s6XCW.js +1 -0
  48. package/dist/public/assets/_BFvCCmWn.js +1 -0
  49. package/dist/public/assets/_BHEO7RLD.js +1 -0
  50. package/dist/public/assets/{_Dg6OsRrR.js → _BHSyE7UM.js} +1 -1
  51. package/dist/public/assets/_BHSyE7UM.js.br +0 -0
  52. package/dist/public/assets/_BLpd8N-w.js +1 -0
  53. package/dist/public/assets/{_DxSnjCPi.js → _BQNJzR93.js} +1 -1
  54. package/dist/public/assets/_BQNJzR93.js.br +0 -0
  55. package/dist/public/assets/{_Bfuu6mAX.js → _BQgXAmMb.js} +1 -1
  56. package/dist/public/assets/_BQgXAmMb.js.br +0 -0
  57. package/dist/public/assets/{_Bf7EsJwj.js → _BSvw1UG1.js} +1 -1
  58. package/dist/public/assets/_BSvw1UG1.js.br +0 -0
  59. package/dist/public/assets/{_DpSZYTyI.js → _BUCCv9Hi.js} +1 -1
  60. package/dist/public/assets/_BUCCv9Hi.js.br +0 -0
  61. package/dist/public/assets/{_C5Wk6L8u.js → _BVLdrpoX.js} +1 -1
  62. package/dist/public/assets/_BVLdrpoX.js.br +0 -0
  63. package/dist/public/assets/{_T0Ktx7Km.js → _BbsW8us6.js} +1 -1
  64. package/dist/public/assets/_BbsW8us6.js.br +0 -0
  65. package/dist/public/assets/_BcIlugCw.js +1 -0
  66. package/dist/public/assets/{_L-b7Vsug.js → _BckU3AOP.js} +1 -1
  67. package/dist/public/assets/_BckU3AOP.js.br +0 -0
  68. package/dist/public/assets/{_HGP7qpI4.js → _Bcxjmiob.js} +1 -1
  69. package/dist/public/assets/_Bcxjmiob.js.br +0 -0
  70. package/dist/public/assets/_Bevd9dK7.js +1 -0
  71. package/dist/public/assets/_Bj_HkP9h.js +1 -0
  72. package/dist/public/assets/_BjvYGQBe.js +1 -0
  73. package/dist/public/assets/_BkqHlxO2.js +1 -0
  74. package/dist/public/assets/{_ChTMXnIu.js → _BkrUEbVS.js} +1 -1
  75. package/dist/public/assets/_BkrUEbVS.js.br +0 -0
  76. package/dist/public/assets/_Bl5uJkXr.js +1 -0
  77. package/dist/public/assets/_BlG8w-GK.js +1 -0
  78. package/dist/public/assets/_BlG8w-GK.js.br +0 -0
  79. package/dist/public/assets/{_CAhkFk0k.js → _Boy8zitV.js} +1 -1
  80. package/dist/public/assets/_Boy8zitV.js.br +0 -0
  81. package/dist/public/assets/{_BgBUZElB.js → _Bp0eGxZI.js} +1 -1
  82. package/dist/public/assets/_Bp0eGxZI.js.br +0 -0
  83. package/dist/public/assets/_BpxhQa77.js +1 -0
  84. package/dist/public/assets/_Bpza2t1g.js +1 -0
  85. package/dist/public/assets/{_CEY_n10t.js → _BsNcNflU.js} +1 -1
  86. package/dist/public/assets/_BsNcNflU.js.br +0 -0
  87. package/dist/public/assets/{_B7u83Fqc.js → _BsS0f5pl.js} +1 -1
  88. package/dist/public/assets/{_csFWQzWs.js → _Bx1yzJ7J.js} +1 -1
  89. package/dist/public/assets/_Bx1yzJ7J.js.br +0 -0
  90. package/dist/public/assets/_By7JhS_H.js +1 -0
  91. package/dist/public/assets/_By7mDOGe.js +1 -0
  92. package/dist/public/assets/_By7mDOGe.js.br +0 -0
  93. package/dist/public/assets/{_CN7Wz2eA.js → _ByNsS0Bo.js} +1 -1
  94. package/dist/public/assets/_ByNsS0Bo.js.br +0 -0
  95. package/dist/public/assets/{_BpGvpggY.js → _C-Yjwvb7.js} +1 -1
  96. package/dist/public/assets/_C-Yjwvb7.js.br +0 -0
  97. package/dist/public/assets/_C0XDDquE.js +1 -0
  98. package/dist/public/assets/_C0kbjmme.js +1 -0
  99. package/dist/public/assets/{_D0gWUr-E.js → _C1TFPaLw.js} +1 -1
  100. package/dist/public/assets/_C1TFPaLw.js.br +0 -0
  101. package/dist/public/assets/{_DLCgfhNS.js → _C1hChloH.js} +1 -1
  102. package/dist/public/assets/_C1hChloH.js.br +0 -0
  103. package/dist/public/assets/_C5_F6Lkp.js +1 -0
  104. package/dist/public/assets/_C5m17sK1.js +86 -0
  105. package/dist/public/assets/_C5m17sK1.js.br +0 -0
  106. package/dist/public/assets/{_Coroy2lI.js → _C6aIqGTH.js} +1 -1
  107. package/dist/public/assets/_C6aIqGTH.js.br +0 -0
  108. package/dist/public/assets/{__1UtPhZb.js → _C8FYvxEo.js} +1 -1
  109. package/dist/public/assets/_C8FYvxEo.js.br +0 -0
  110. package/dist/public/assets/_C9PQMYui.js +1 -0
  111. package/dist/public/assets/{_hC5RUmrf.js → _CAAXB063.js} +1 -1
  112. package/dist/public/assets/_CAAXB063.js.br +0 -0
  113. package/dist/public/assets/_CAF5BaCM.js +1 -0
  114. package/dist/public/assets/{_CtC83UyG.js → _CAg9DmBU.js} +1 -1
  115. package/dist/public/assets/_CAg9DmBU.js.br +0 -0
  116. package/dist/public/assets/_CArxykYQ.js +1 -0
  117. package/dist/public/assets/{_DG1LpTGX.js → _CCDXrv8_.js} +1 -1
  118. package/dist/public/assets/_CCDXrv8_.js.br +0 -0
  119. package/dist/public/assets/_CCLoAy9K.js +1 -0
  120. package/dist/public/assets/{_BJpqJK9r.js → _CCzklqPj.js} +1 -1
  121. package/dist/public/assets/_CCzklqPj.js.br +0 -0
  122. package/dist/public/assets/{_lA6BOkV1.js → _CDAx5pmr.js} +1 -1
  123. package/dist/public/assets/_CDAx5pmr.js.br +0 -0
  124. package/dist/public/assets/_CELecOKQ.js +6 -0
  125. package/dist/public/assets/_CELecOKQ.js.br +0 -0
  126. package/dist/public/assets/_CErwzInA.js +1 -0
  127. package/dist/public/assets/_CG1u18ih.js +1 -0
  128. package/dist/public/assets/_CIJ6oAG_.js +1 -0
  129. package/dist/public/assets/_CJ0qFlds.js +1 -0
  130. package/dist/public/assets/{_sjeWoc5X.js → _CJL270Sa.js} +1 -1
  131. package/dist/public/assets/_CJL270Sa.js.br +0 -0
  132. package/dist/public/assets/_CJX55Ay-.js +1 -0
  133. package/dist/public/assets/{_D6YVA8vA.js → _CKYRaQgb.js} +1 -1
  134. package/dist/public/assets/_CKYRaQgb.js.br +0 -0
  135. package/dist/public/assets/_CO2ElP37.js +1 -0
  136. package/dist/public/assets/_CPGSt-5v.js +1 -0
  137. package/dist/public/assets/_CPwsu9mG.js +1 -0
  138. package/dist/public/assets/_CQ3Qetvc.js +1 -0
  139. package/dist/public/assets/_CQ3Qetvc.js.br +0 -0
  140. package/dist/public/assets/{_BCYHTWZd.js → _CQZwCaRa.js} +1 -1
  141. package/dist/public/assets/_CQZwCaRa.js.br +0 -0
  142. package/dist/public/assets/_CSaFk-iZ.js +1 -0
  143. package/dist/public/assets/_CUUKuB9B.js +1 -0
  144. package/dist/public/assets/{_6fcPfRKt.js → _CZAa6k8r.js} +1 -1
  145. package/dist/public/assets/_CZAa6k8r.js.br +0 -0
  146. package/dist/public/assets/{_DyFcXAXE.js → _Ca09Co2_.js} +1 -1
  147. package/dist/public/assets/_Ca09Co2_.js.br +0 -0
  148. package/dist/public/assets/{__cyNMcUU.js → _CaMYkF4Y.js} +1 -1
  149. package/dist/public/assets/{_B2zs9J9f.js → _CbPA-khl.js} +1 -1
  150. package/dist/public/assets/_CbPA-khl.js.br +0 -0
  151. package/dist/public/assets/_Cd-QCXVO.js +1 -0
  152. package/dist/public/assets/_Cd-QCXVO.js.br +0 -0
  153. package/dist/public/assets/{_Cabq459u.js → _CdQ4fvS9.js} +1 -1
  154. package/dist/public/assets/{_CeZa36O-.js → _CfCAvlpN.js} +1 -1
  155. package/dist/public/assets/_CfCAvlpN.js.br +0 -0
  156. package/dist/public/assets/{_De_msLFQ.js → _CfDFnjIA.js} +1 -1
  157. package/dist/public/assets/_CfDFnjIA.js.br +0 -0
  158. package/dist/public/assets/{_MwkLbzHQ.js → _CguuUE5Z.js} +1 -1
  159. package/dist/public/assets/_CguuUE5Z.js.br +0 -0
  160. package/dist/public/assets/{_DfNM5GDo.js → _CheGsco8.js} +1 -1
  161. package/dist/public/assets/_CheGsco8.js.br +0 -0
  162. package/dist/public/assets/_CiNXWd7k.js +1 -0
  163. package/dist/public/assets/_Cixej1RI.js +1 -0
  164. package/dist/public/assets/_CkqDVBQ2.js +1 -0
  165. package/dist/public/assets/_CkzEaTeL.js +1 -0
  166. package/dist/public/assets/{_LWpc-K1g.js → _ClvEtigR.js} +1 -1
  167. package/dist/public/assets/_ClvEtigR.js.br +0 -0
  168. package/dist/public/assets/{_DW92UwGh.js → _CmptminH.js} +1 -1
  169. package/dist/public/assets/_CmptminH.js.br +0 -0
  170. package/dist/public/assets/_CqX-X1xx.js +1 -0
  171. package/dist/public/assets/{_B_LxZatx.js → _CrWx2tiL.js} +1 -1
  172. package/dist/public/assets/_CrWx2tiL.js.br +0 -0
  173. package/dist/public/assets/_CrlWRKRt.js +1 -0
  174. package/dist/public/assets/_Ct6Y6bBB.js +1 -0
  175. package/dist/public/assets/_Ct6Y6bBB.js.br +0 -0
  176. package/dist/public/assets/{_CZNztOn6.js → _CtCy1f-U.js} +1 -1
  177. package/dist/public/assets/_CtCy1f-U.js.br +0 -0
  178. package/dist/public/assets/_CtvKW08N.js +1 -0
  179. package/dist/public/assets/_CvmNpKTH.js +1 -0
  180. package/dist/public/assets/_Cvn7uBC2.js +1 -0
  181. package/dist/public/assets/_Cvn7uBC2.js.br +0 -0
  182. package/dist/public/assets/_Cx7UUMvh.js +1 -0
  183. package/dist/public/assets/_D0_g6mca.js +1 -0
  184. package/dist/public/assets/_D5JzFugM.js +1 -0
  185. package/dist/public/assets/{_Bqgtb-fc.js → _D5Zr3Ieu.js} +1 -1
  186. package/dist/public/assets/_D5Zr3Ieu.js.br +0 -0
  187. package/dist/public/assets/{_BKcc-iTi.js → _D9Iv3ydL.js} +1 -1
  188. package/dist/public/assets/_D9Iv3ydL.js.br +0 -0
  189. package/dist/public/assets/_DAsQt0f1.js +1 -0
  190. package/dist/public/assets/_DAsQt0f1.js.br +0 -0
  191. package/dist/public/assets/{_BhrCWDl2.js → _DCS2QSLg.js} +1 -1
  192. package/dist/public/assets/_DCS2QSLg.js.br +0 -0
  193. package/dist/public/assets/{_Bgbj7Vl5.js → _DDaCDBJL.js} +1 -1
  194. package/dist/public/assets/_DDaCDBJL.js.br +0 -0
  195. package/dist/public/assets/_DEWulNhA.js +1 -0
  196. package/dist/public/assets/{_BpunB-I_.js → _DFGEQ2lP.js} +1 -1
  197. package/dist/public/assets/_DFGEQ2lP.js.br +0 -0
  198. package/dist/public/assets/_DG4itPwq.js +1 -0
  199. package/dist/public/assets/_DGIU-7Wg.js +1 -0
  200. package/dist/public/assets/{_DqiBcDpF.js → _DIdlinjd.js} +1 -1
  201. package/dist/public/assets/_DIdlinjd.js.br +0 -0
  202. package/dist/public/assets/_DJyoX7Fs.js +1 -0
  203. package/dist/public/assets/{_DDBuDrkA.js → _DLFBMV-d.js} +1 -1
  204. package/dist/public/assets/_DLFBMV-d.js.br +0 -0
  205. package/dist/public/assets/{_DdVG8Rbg.js → _DNgHcXLH.js} +115 -115
  206. package/dist/public/assets/_DNgHcXLH.js.br +0 -0
  207. package/dist/public/assets/{_tFVcmmKI.js → _DP1ORnUN.js} +1 -1
  208. package/dist/public/assets/_DP1ORnUN.js.br +0 -0
  209. package/dist/public/assets/_DPdbyqi7.js +1 -0
  210. package/dist/public/assets/_DS4JUkck.js +1 -0
  211. package/dist/public/assets/_DSft5FYa.js +1 -0
  212. package/dist/public/assets/{_DSoJ6ck3.js → _DVizKx9R.js} +1 -1
  213. package/dist/public/assets/_DVizKx9R.js.br +0 -0
  214. package/dist/public/assets/{_CY0xLX0Y.js → _DXSpITKr.js} +1 -1
  215. package/dist/public/assets/_DXSpITKr.js.br +0 -0
  216. package/dist/public/assets/{_sLUOjXIk.js → _DXl_K_Qo.js} +1 -1
  217. package/dist/public/assets/{_BMXIDoUj.js → _DYEXlK8E.js} +1 -1
  218. package/dist/public/assets/_DYEXlK8E.js.br +0 -0
  219. package/dist/public/assets/{_BH5TfgM7.js → _DYctpXxy.js} +1 -1
  220. package/dist/public/assets/_DYctpXxy.js.br +0 -0
  221. package/dist/public/assets/{_CvKDzuxc.js → _DZg23aWr.js} +1 -1
  222. package/dist/public/assets/_DZg23aWr.js.br +0 -0
  223. package/dist/public/assets/_DcJnsCIZ.js +1 -0
  224. package/dist/public/assets/{_w8hTnp0H.js → _DddSmP6c.js} +1 -1
  225. package/dist/public/assets/_DddSmP6c.js.br +0 -0
  226. package/dist/public/assets/{_CVEabnQh.js → _DgXa8uL0.js} +1 -1
  227. package/dist/public/assets/_DgXa8uL0.js.br +0 -0
  228. package/dist/public/assets/_DjR-TsBN.js +1 -0
  229. package/dist/public/assets/_Dk6txOT4.js +1 -0
  230. package/dist/public/assets/{_B1AH7m_8.js → _Dkmur8bW.js} +1 -1
  231. package/dist/public/assets/_Dkmur8bW.js.br +0 -0
  232. package/dist/public/assets/_DotAJq8w.js +1 -0
  233. package/dist/public/assets/{_DyEhTpVE.js → _Dr3Cn_7L.js} +1 -1
  234. package/dist/public/assets/_Dr3Cn_7L.js.br +0 -0
  235. package/dist/public/assets/_Ds-yc5Hu.js +1 -0
  236. package/dist/public/assets/{_txvO7pXr.js → _DtH6GwBF.js} +1 -1
  237. package/dist/public/assets/_DtH6GwBF.js.br +0 -0
  238. package/dist/public/assets/_DtnXfycX.js +1 -0
  239. package/dist/public/assets/_DuAH8M0Q.js +1 -0
  240. package/dist/public/assets/{_BvEJgNLp.js → _DwuvHD28.js} +1 -1
  241. package/dist/public/assets/_DwuvHD28.js.br +0 -0
  242. package/dist/public/assets/_Fuuv8lzd.js +1 -0
  243. package/dist/public/assets/_HQOmlxwh.js +1 -0
  244. package/dist/public/assets/_HdTcnTrz.js +1 -0
  245. package/dist/public/assets/{_DdcPtDZz.js → _KlvXaypq.js} +1 -1
  246. package/dist/public/assets/_KlvXaypq.js.br +0 -0
  247. package/dist/public/assets/_Ncoq83TJ.js +1 -0
  248. package/dist/public/assets/_Q9HEP0lA.js +1 -0
  249. package/dist/public/assets/_Qddqtdvo.js +1 -0
  250. package/dist/public/assets/{_DAcmaIgY.js → _ROLDku11.js} +1 -1
  251. package/dist/public/assets/_ROLDku11.js.br +0 -0
  252. package/dist/public/assets/_Xy7h-bZy.js +1 -0
  253. package/dist/public/assets/{_Draa__tn.js → _ahCaQNeo.js} +1 -1
  254. package/dist/public/assets/_ahCaQNeo.js.br +0 -0
  255. package/dist/public/assets/{_BJc28pt5.js → _cZGRGdtZ.js} +1 -1
  256. package/dist/public/assets/_cZGRGdtZ.js.br +0 -0
  257. package/dist/public/assets/{_DDfwtidv.js → _dzckEiIO.js} +1 -1
  258. package/dist/public/assets/_dzckEiIO.js.br +0 -0
  259. package/dist/public/assets/_eRu_Vt-4.js +1 -0
  260. package/dist/public/assets/_eRu_Vt-4.js.br +0 -0
  261. package/dist/public/assets/_i7yVYPBz.js +1 -0
  262. package/dist/public/assets/_idH4jHfv.js +1 -0
  263. package/dist/public/assets/_jzdrGeR8.js +1 -0
  264. package/dist/public/assets/_ljmEi4Be.js +1 -0
  265. package/dist/public/assets/_mSReELZF.js +2 -0
  266. package/dist/public/assets/_mSReELZF.js.br +0 -0
  267. package/dist/public/assets/_mdQquljU.js +1 -0
  268. package/dist/public/assets/{_k1uZxEJ-.js → _op0vQN0h.js} +1 -1
  269. package/dist/public/assets/_op0vQN0h.js.br +0 -0
  270. package/dist/public/assets/_pqEowNNk.js +1 -0
  271. package/dist/public/assets/_qyReqH1J.js +1 -0
  272. package/dist/public/assets/_qyReqH1J.js.br +0 -0
  273. package/dist/public/assets/_s3G4WS5u.js +1 -0
  274. package/dist/public/assets/{_DYIjiPYY.js → _s3skvHRb.js} +1 -1
  275. package/dist/public/assets/_s3skvHRb.js.br +0 -0
  276. package/dist/public/assets/{_CWTelCGM.js → _sNzqJEFd.js} +1 -1
  277. package/dist/public/assets/_sNzqJEFd.js.br +0 -0
  278. package/dist/public/assets/_vM7qrN-T.js +1 -0
  279. package/dist/public/assets/{_CSMoDPwM.js → _xhUJdynX.js} +7 -7
  280. package/dist/public/assets/_xhUJdynX.js.br +0 -0
  281. package/dist/public/assets/_xonpFVfx.js +1 -0
  282. package/dist/public/assets/_xonpFVfx.js.br +0 -0
  283. package/dist/public/assets/{_DZzucnmx.js → _zs2sw7ou.js} +1 -1
  284. package/dist/public/assets/_zs2sw7ou.js.br +0 -0
  285. package/dist/public/assets/files-view-rGkk6M-X.js +2 -0
  286. package/dist/public/assets/manage-workspace-DxRg-pD7.js +2 -0
  287. package/dist/public/assets/new-C3NRJbz3.js +1 -0
  288. package/dist/public/assets/new-workspace-Hntl8FTA.js +2 -0
  289. package/dist/public/assets/review-view-D799zeTK.js +2 -0
  290. package/dist/public/assets/settings-C3NRJbz3.js +1 -0
  291. package/dist/public/assets/settings-page-0ZnVy_Ch.js +2 -0
  292. package/dist/public/assets/styles-CDnuxBl_.css +1 -0
  293. package/dist/public/assets/styles-CDnuxBl_.css.br +0 -0
  294. package/dist/public/assets/w-C3NRJbz3.js +1 -0
  295. package/dist/public/assets/w._-BQD2y7wD.js +1 -0
  296. package/dist/public/assets/w._-C3NRJbz3.js +1 -0
  297. package/dist/public/assets/w._-CAaQHelK.js +1 -0
  298. package/package.json +1 -1
  299. package/bin/cli/plan.mjs +0 -85
  300. package/dist/_DrEeyoLF.js +0 -2
  301. package/dist/_E0fWorAK.js +0 -2
  302. package/dist/public/assets/_-TUXzZ5j.js +0 -1
  303. package/dist/public/assets/_-TUXzZ5j.js.br +0 -0
  304. package/dist/public/assets/_0BO-2AH8.js +0 -1
  305. package/dist/public/assets/_1MkpPhCv.js +0 -1
  306. package/dist/public/assets/_2Czzn44S.js +0 -2
  307. package/dist/public/assets/_2Czzn44S.js.br +0 -0
  308. package/dist/public/assets/_3J3NCTfA.js +0 -1
  309. package/dist/public/assets/_3yfaou9w.js +0 -1
  310. package/dist/public/assets/_6fcPfRKt.js.br +0 -0
  311. package/dist/public/assets/_9kzNcuvf.js +0 -1
  312. package/dist/public/assets/_AbxeWvtk.js +0 -1
  313. package/dist/public/assets/_B1AH7m_8.js.br +0 -0
  314. package/dist/public/assets/_B2zs9J9f.js.br +0 -0
  315. package/dist/public/assets/_B4Tl4g-I.js +0 -1
  316. package/dist/public/assets/_B6GPBTnX.js +0 -1
  317. package/dist/public/assets/_B89z0EK7.js +0 -1
  318. package/dist/public/assets/_BCYHTWZd.js.br +0 -0
  319. package/dist/public/assets/_BD01_px3.js +0 -1
  320. package/dist/public/assets/_BDt0PKxz.js +0 -1
  321. package/dist/public/assets/_BFD3zDfn.js.br +0 -0
  322. package/dist/public/assets/_BH5TfgM7.js.br +0 -0
  323. package/dist/public/assets/_BHEzkZBl.js +0 -1
  324. package/dist/public/assets/_BHxaJLxf.js.br +0 -0
  325. package/dist/public/assets/_BJc28pt5.js.br +0 -0
  326. package/dist/public/assets/_BJpqJK9r.js.br +0 -0
  327. package/dist/public/assets/_BKSNShOz.js +0 -1
  328. package/dist/public/assets/_BKcc-iTi.js.br +0 -0
  329. package/dist/public/assets/_BMXIDoUj.js.br +0 -0
  330. package/dist/public/assets/_BQMwlV-0.js.br +0 -0
  331. package/dist/public/assets/_BUjgl28E.js +0 -1
  332. package/dist/public/assets/_BYUg95ML.js +0 -1
  333. package/dist/public/assets/_B_LxZatx.js.br +0 -0
  334. package/dist/public/assets/_BeQUut65.js.br +0 -0
  335. package/dist/public/assets/_Bf7EsJwj.js.br +0 -0
  336. package/dist/public/assets/_BfVmvTXe.js +0 -1
  337. package/dist/public/assets/_BfqDnPV7.js +0 -1
  338. package/dist/public/assets/_Bfuu6mAX.js.br +0 -0
  339. package/dist/public/assets/_BgBUZElB.js.br +0 -0
  340. package/dist/public/assets/_Bgbj7Vl5.js.br +0 -0
  341. package/dist/public/assets/_BhrCWDl2.js.br +0 -0
  342. package/dist/public/assets/_Bjsevhjr.js +0 -1
  343. package/dist/public/assets/_BjzBYn47.js +0 -1
  344. package/dist/public/assets/_BmyB1F-C.js +0 -1
  345. package/dist/public/assets/_BpGvpggY.js.br +0 -0
  346. package/dist/public/assets/_BpjknrsF.js +0 -1
  347. package/dist/public/assets/_BpunB-I_.js.br +0 -0
  348. package/dist/public/assets/_Bqgtb-fc.js.br +0 -0
  349. package/dist/public/assets/_BtkDWVh9.js +0 -1
  350. package/dist/public/assets/_BvEJgNLp.js.br +0 -0
  351. package/dist/public/assets/_BvYgAZl3.js +0 -1
  352. package/dist/public/assets/_C0Bfz_Is.js +0 -1
  353. package/dist/public/assets/_C1Aa6bJ9.js +0 -1
  354. package/dist/public/assets/_C3i3LRNx.js +0 -1
  355. package/dist/public/assets/_C4RHKQLq.js +0 -1
  356. package/dist/public/assets/_C5Wk6L8u.js.br +0 -0
  357. package/dist/public/assets/_C7N1s7w_.js +0 -1
  358. package/dist/public/assets/_C7N1s7w_.js.br +0 -0
  359. package/dist/public/assets/_C96lrIeU.js +0 -1
  360. package/dist/public/assets/_CAhkFk0k.js.br +0 -0
  361. package/dist/public/assets/_CCmHKlXX.js.br +0 -0
  362. package/dist/public/assets/_CEY_n10t.js.br +0 -0
  363. package/dist/public/assets/_CEejNMib.js +0 -1
  364. package/dist/public/assets/_CFo4GZR9.js +0 -1
  365. package/dist/public/assets/_CGH2Busx.js.br +0 -0
  366. package/dist/public/assets/_CHwp4prQ.js.br +0 -0
  367. package/dist/public/assets/_CN7Wz2eA.js.br +0 -0
  368. package/dist/public/assets/_CP58TjsV.js +0 -1
  369. package/dist/public/assets/_CP58TjsV.js.br +0 -0
  370. package/dist/public/assets/_CPruMiA4.js +0 -1
  371. package/dist/public/assets/_CQEZuOE_.js +0 -1
  372. package/dist/public/assets/_CSMoDPwM.js.br +0 -0
  373. package/dist/public/assets/_CVEabnQh.js.br +0 -0
  374. package/dist/public/assets/_CWTelCGM.js.br +0 -0
  375. package/dist/public/assets/_CXpplsaj.js +0 -1
  376. package/dist/public/assets/_CY0xLX0Y.js.br +0 -0
  377. package/dist/public/assets/_CZNztOn6.js.br +0 -0
  378. package/dist/public/assets/_Cb593OOX.js +0 -1
  379. package/dist/public/assets/_Cbis2WSl.js +0 -1
  380. package/dist/public/assets/_CeZa36O-.js.br +0 -0
  381. package/dist/public/assets/_ChTMXnIu.js.br +0 -0
  382. package/dist/public/assets/_Cig63HLr.js +0 -1
  383. package/dist/public/assets/_CjkPh72t.js +0 -1
  384. package/dist/public/assets/_Cm6nigjK.js +0 -1
  385. package/dist/public/assets/_CnAEQUMb.js +0 -1
  386. package/dist/public/assets/_Coroy2lI.js.br +0 -0
  387. package/dist/public/assets/_CpAeLnqO.js +0 -1
  388. package/dist/public/assets/_CpAeLnqO.js.br +0 -0
  389. package/dist/public/assets/_Cpkby1iI.js +0 -1
  390. package/dist/public/assets/_Cs0Q8LaN.js +0 -1
  391. package/dist/public/assets/_Ct2pbvTU.js +0 -1
  392. package/dist/public/assets/_CtC83UyG.js.br +0 -0
  393. package/dist/public/assets/_CtVSUTWd.js +0 -1
  394. package/dist/public/assets/_Ctf0pL3c.js +0 -1
  395. package/dist/public/assets/_CtvMc-Fn.js +0 -1
  396. package/dist/public/assets/_Cv7TctYK.js +0 -1
  397. package/dist/public/assets/_Cv7TctYK.js.br +0 -0
  398. package/dist/public/assets/_CvKDzuxc.js.br +0 -0
  399. package/dist/public/assets/_CvxhsaLv.js +0 -1
  400. package/dist/public/assets/_CwxTh04m.js +0 -1
  401. package/dist/public/assets/_CyMRBJfa.js +0 -1
  402. package/dist/public/assets/_D-wwbDX7.js.br +0 -0
  403. package/dist/public/assets/_D02jmNge.js +0 -1
  404. package/dist/public/assets/_D0gWUr-E.js.br +0 -0
  405. package/dist/public/assets/_D2wtQpHN.js +0 -1
  406. package/dist/public/assets/_D2wtQpHN.js.br +0 -0
  407. package/dist/public/assets/_D3uCXh8z.js +0 -2
  408. package/dist/public/assets/_D3uCXh8z.js.br +0 -0
  409. package/dist/public/assets/_D5GW0gg0.js +0 -1
  410. package/dist/public/assets/_D5GW0gg0.js.br +0 -0
  411. package/dist/public/assets/_D6YVA8vA.js.br +0 -0
  412. package/dist/public/assets/_D85prZ-z.js +0 -1
  413. package/dist/public/assets/_D8QlsPTv.js +0 -1
  414. package/dist/public/assets/_D8QlsPTv.js.br +0 -0
  415. package/dist/public/assets/_D8rDqOqJ.js +0 -1
  416. package/dist/public/assets/_DAcmaIgY.js.br +0 -0
  417. package/dist/public/assets/_DBlahxfT.js +0 -1
  418. package/dist/public/assets/_DCPGqAo6.js +0 -1
  419. package/dist/public/assets/_DDBuDrkA.js.br +0 -0
  420. package/dist/public/assets/_DDfwtidv.js.br +0 -0
  421. package/dist/public/assets/_DEqzNO7a.js +0 -1
  422. package/dist/public/assets/_DEyhBnnd.js +0 -1
  423. package/dist/public/assets/_DG1LpTGX.js.br +0 -0
  424. package/dist/public/assets/_DJK-MioE.js +0 -1
  425. package/dist/public/assets/_DLCgfhNS.js.br +0 -0
  426. package/dist/public/assets/_DLYvRpNz.js +0 -6
  427. package/dist/public/assets/_DLYvRpNz.js.br +0 -0
  428. package/dist/public/assets/_DPzjUc1B.js +0 -1
  429. package/dist/public/assets/_DRDW7RgT.js +0 -1
  430. package/dist/public/assets/_DSoJ6ck3.js.br +0 -0
  431. package/dist/public/assets/_DW92UwGh.js.br +0 -0
  432. package/dist/public/assets/_DYIjiPYY.js.br +0 -0
  433. package/dist/public/assets/_DZeeRtLs.js +0 -1
  434. package/dist/public/assets/_DZzucnmx.js.br +0 -0
  435. package/dist/public/assets/_D_AjKzkm.js.br +0 -0
  436. package/dist/public/assets/_DdVG8Rbg.js.br +0 -0
  437. package/dist/public/assets/_DdcPtDZz.js.br +0 -0
  438. package/dist/public/assets/_De_msLFQ.js.br +0 -0
  439. package/dist/public/assets/_DeiCZJcm.js +0 -1
  440. package/dist/public/assets/_DeiCZJcm.js.br +0 -0
  441. package/dist/public/assets/_DfNM5GDo.js.br +0 -0
  442. package/dist/public/assets/_Dg6OsRrR.js.br +0 -0
  443. package/dist/public/assets/_DgrmX7cI.js +0 -1
  444. package/dist/public/assets/_DiPK_ps-.js +0 -1
  445. package/dist/public/assets/_Dow17jzJ.js.br +0 -0
  446. package/dist/public/assets/_DpSZYTyI.js.br +0 -0
  447. package/dist/public/assets/_DpXO9fPK.js +0 -1
  448. package/dist/public/assets/_DpXO9fPK.js.br +0 -0
  449. package/dist/public/assets/_DqiBcDpF.js.br +0 -0
  450. package/dist/public/assets/_DqkJjiCU.js +0 -1
  451. package/dist/public/assets/_Draa__tn.js.br +0 -0
  452. package/dist/public/assets/_Drs3T7dh.js +0 -1
  453. package/dist/public/assets/_Drs3T7dh.js.br +0 -0
  454. package/dist/public/assets/_DtBGe4AJ.js +0 -1
  455. package/dist/public/assets/_DxSnjCPi.js.br +0 -0
  456. package/dist/public/assets/_DyEhTpVE.js.br +0 -0
  457. package/dist/public/assets/_DyFcXAXE.js.br +0 -0
  458. package/dist/public/assets/_FPItrlZz.js +0 -1
  459. package/dist/public/assets/_HGP7qpI4.js.br +0 -0
  460. package/dist/public/assets/_L-b7Vsug.js.br +0 -0
  461. package/dist/public/assets/_LWpc-K1g.js.br +0 -0
  462. package/dist/public/assets/_MwkLbzHQ.js.br +0 -0
  463. package/dist/public/assets/_O4DIriLZ.js +0 -1
  464. package/dist/public/assets/_T0Ktx7Km.js.br +0 -0
  465. package/dist/public/assets/_T6O8KX0b.js +0 -1
  466. package/dist/public/assets/_TWZgGi12.js +0 -1
  467. package/dist/public/assets/_UBgRR4E9.js.br +0 -0
  468. package/dist/public/assets/_X3T0JcUM.js +0 -87
  469. package/dist/public/assets/_X3T0JcUM.js.br +0 -0
  470. package/dist/public/assets/_YtP2gTmD.js +0 -1
  471. package/dist/public/assets/__1UtPhZb.js.br +0 -0
  472. package/dist/public/assets/__WDcLOp3.js +0 -1
  473. package/dist/public/assets/_csFWQzWs.js.br +0 -0
  474. package/dist/public/assets/_eURsGF_D.js +0 -1
  475. package/dist/public/assets/_fEPizk9T.js +0 -1
  476. package/dist/public/assets/_hC5RUmrf.js.br +0 -0
  477. package/dist/public/assets/_hfgYVPfe.js +0 -1
  478. package/dist/public/assets/_i51v5tw8.js +0 -1
  479. package/dist/public/assets/_k1uZxEJ-.js.br +0 -0
  480. package/dist/public/assets/_l4nNKr9o.js +0 -1
  481. package/dist/public/assets/_lA6BOkV1.js.br +0 -0
  482. package/dist/public/assets/_qyrPXpIj.js +0 -1
  483. package/dist/public/assets/_sjeWoc5X.js.br +0 -0
  484. package/dist/public/assets/_tByKwKUc.js +0 -1
  485. package/dist/public/assets/_tFVcmmKI.js.br +0 -0
  486. package/dist/public/assets/_txvO7pXr.js.br +0 -0
  487. package/dist/public/assets/_um7Vy7NX.js +0 -1
  488. package/dist/public/assets/_veNUvOqP.js +0 -1
  489. package/dist/public/assets/_w8hTnp0H.js.br +0 -0
  490. package/dist/public/assets/_wGWNa6Sp.js +0 -1
  491. package/dist/public/assets/_wxbEv1JK.js +0 -1
  492. package/dist/public/assets/files-view-BOE5HTrF.js +0 -2
  493. package/dist/public/assets/manage-workspace-ClwsrQ4a.js +0 -2
  494. package/dist/public/assets/new-CJ6ZElay.js +0 -1
  495. package/dist/public/assets/new-workspace-DWSBO4Vx.js +0 -2
  496. package/dist/public/assets/review-view-DffAZHOz.js +0 -2
  497. package/dist/public/assets/settings-CJ6ZElay.js +0 -1
  498. package/dist/public/assets/settings-page-CYL_T3Vf.js +0 -2
  499. package/dist/public/assets/styles-taHUfRpm.css +0 -1
  500. package/dist/public/assets/styles-taHUfRpm.css.br +0 -0
  501. package/dist/public/assets/w-CJ6ZElay.js +0 -1
  502. package/dist/public/assets/w._-CJ6ZElay.js +0 -1
  503. package/dist/public/assets/w._-ChCIRlhY.js +0 -1
  504. package/dist/public/assets/w._-WsR2-skZ.js +0 -1
package/README.md CHANGED
@@ -63,7 +63,7 @@ Inside a workspace, `work branches`, `work session`, `work topic`,
63
63
  other with `work session new|send|wait` — any vendor's, each in a tab of its
64
64
  own the user watches, its last message as a turn ends coming back to the
65
65
  one that asked as a prompt — and run groups of them with
66
- `work session fanout` and `work plan`, which the session list shows as a
66
+ `work session fanout`, which the session list shows as a
67
67
  lead's team; to change things,
68
68
  `work workspace create`, `work repo add`, `work config get|set` (checked
69
69
  against what each setting takes; `work config schema` lists them),
@@ -20,6 +20,13 @@ function sessionId(ctx) {
20
20
  return id;
21
21
  }
22
22
 
23
+ /** The agent asking, for the routes that hold one to its own workspace:
24
+ * `?by=<WORK_SESSION_ID>`, nothing from a terminal outside work. */
25
+ function by(sep = "?") {
26
+ const me = process.env.WORK_SESSION_ID;
27
+ return me ? `${sep}by=${encodeURIComponent(me)}` : "";
28
+ }
29
+
23
30
  /** How long `wait` waits by default: inside an agent's own tool limit
24
31
  * (ten minutes for most), so it ends saying who is still working rather
25
32
  * than being killed. */
@@ -148,7 +155,7 @@ function printGroup(ctx, g) {
148
155
  c.closed && `${c.closed} closed`,
149
156
  ].filter(Boolean);
150
157
  console.log(
151
- `${g.phase ? `[${g.phase}] ` : ""}${g.id} "${g.title}" ${parts.join(" · ")} (${g.parallel} at a time, ${g.fanIn ? (left ? "replies held until all answer" : "replies sent as one") : "replies as each comes"})`,
158
+ `${g.id} "${g.title}" ${parts.join(" · ")} (${g.parallel} at a time, ${g.fanIn ? (left ? "replies held until all answer" : "replies sent as one") : "replies as each comes"})`,
152
159
  );
153
160
  for (const m of g.members)
154
161
  console.log(
@@ -179,7 +186,7 @@ work session new [--agent <id>] [--title "<name>"] [--prompt "<text>"|-] [--no-r
179
186
  answered and is done with — when your job finishes, or after ten idle
180
187
  minutes — unless --keep, it is on the user's screen, or they have typed
181
188
  into it. Past ${SESSION_CAP} running sessions in the workspace it wants --force.
182
- work session fanout --agent <id> [--agent <id>…] [--count <n>] --prompt "<text>"|- [<item>…] [--title "<name>"] [--phase "<phase>"] [--parallel <n>] [--stream] [--close-done|--keep] [--topic <name> [--repo <repo>…] [--install]]
189
+ work session fanout --agent <id> [--agent <id>…] [--count <n>] --prompt "<text>"|- [<item>…] [--title "<name>"] [--parallel <n>] [--stream] [--close-done|--keep] [--topic <name> [--repo <repo>…] [--install]]
183
190
  Start a group of sessions from this one: each --agent once (or --count
184
191
  times), or once for each <item> with {} in the prompt replaced by it
185
192
  ({i} is the member's number). They queue and start --parallel at a time
@@ -189,12 +196,11 @@ work session fanout --agent <id> [--agent <id>…] [--count <n>] --prompt "<text
189
196
  closes once done with, as \`new\`'s does (its result is kept);
190
197
  --close-done closes it as soon as it answers, --keep never;
191
198
  --topic gives each member a topic branch of its own (<name>-1, -2, …),
192
- side by side in Review; --phase files the group under that phase of your
193
- plan (\`work plan\`). For a quick sweep inside your own CLI, its own
199
+ side by side in Review. For a quick sweep inside your own CLI, its own
194
200
  subagents are cheaper: this is for other vendors, long work, or work the
195
201
  user may want to watch.
196
202
  work session team [--json]
197
- This session's plan and groups: each member (its id, then its
203
+ This session's groups: each member (its id, then its
198
204
  session's), its state and its last line (what it is doing, or its
199
205
  result).
200
206
  work session retry <member>
@@ -208,7 +214,10 @@ work session send <id> "<text>"|- [--no-reply]
208
214
  or a draft someone is typing. From an agent's session it wants a reply
209
215
  unless --no-reply: the recipient's last message as that turn ends,
210
216
  typed into this session as a prompt of its own. End your turn to wait
211
- for it. A file's path says more than its text pasted in.
217
+ for it. A file's path says more than its text pasted in. An agent in
218
+ another workspace (\`work session list <workspace>\`) can be messaged
219
+ when the user asks, and only while it runs; everything else here an
220
+ agent does in its own workspace only.
212
221
  work session wait [<id>|<group>...] [--any] [--timeout <seconds>]
213
222
  Wait for the replies owed to this session (by those sessions or groups,
214
223
  else by any), printing each as it comes; a reply printed here is not
@@ -234,7 +243,6 @@ work session kill --done
234
243
  "--repo",
235
244
  "--count",
236
245
  "--parallel",
237
- "--phase",
238
246
  ]);
239
247
  switch (verb) {
240
248
  case undefined: {
@@ -272,7 +280,7 @@ work session kill --done
272
280
  case "title": {
273
281
  const id = sessionId(ctx);
274
282
  const title = rest.join(" ");
275
- await ctx.api.patch(`/api/sessions/${id}`, { title });
283
+ await ctx.api.patch(`/api/sessions/${id}${by()}`, { title });
276
284
  return ctx.out({ id, title: title || null }, () =>
277
285
  console.log(
278
286
  title ? `named ${id} "${title}"` : `cleared ${id}'s name`,
@@ -366,13 +374,12 @@ work session kill --done
366
374
  const total = new Set(agents).size * (items.length || count);
367
375
  const topic = ctx.flag("--topic");
368
376
  const at = topic ? await topicDirs(ctx, topic, total) : null;
369
- const g = await ctx.api.post(`/api/sessions/${me}/groups`, {
377
+ const g = await ctx.api.post(`/api/sessions/${me}/groups${by()}`, {
370
378
  title: ctx.flag("--title") ?? "",
371
379
  prompt,
372
380
  agents,
373
381
  ...(items.length ? { items } : { count }),
374
382
  ...(parallel ? { parallel } : {}),
375
- ...(ctx.has("--phase") ? { phase: ctx.flag("--phase") } : {}),
376
383
  fanIn: !ctx.has("--stream"),
377
384
  closeDone: ctx.has("--close-done"),
378
385
  keep: ctx.has("--keep"),
@@ -398,16 +405,8 @@ work session kill --done
398
405
  const me = sessionId(ctx);
399
406
  const t = await ctx.api.get(`/api/sessions/${me}/team`);
400
407
  return ctx.out(t, (t) => {
401
- if (!t.plan && !t.groups.length)
402
- return console.log(
403
- "no plan or groups: `work session fanout` starts one",
404
- );
405
- if (t.plan) {
406
- console.log(
407
- `plan "${t.plan.name}"${t.plan.done ? " (done)" : ""}: ${t.plan.phases.map((p) => p.title).join(" → ") || "no phases"}`,
408
- );
409
- for (const l of t.plan.log) console.log(` · ${l.text}`);
410
- }
408
+ if (!t.groups.length)
409
+ return console.log("no groups: `work session fanout` starts one");
411
410
  for (const g of t.groups) printGroup(ctx, g);
412
411
  });
413
412
  }
@@ -415,7 +414,7 @@ work session kill --done
415
414
  case "skip": {
416
415
  const [member] = rest;
417
416
  if (!member) ctx.die(`usage: work session ${verb} <member>`);
418
- await ctx.api.post(`/api/members/${member}/${verb}`);
417
+ await ctx.api.post(`/api/members/${member}/${verb}${by()}`);
419
418
  return ctx.out(
420
419
  { member, [verb === "retry" ? "retried" : "skipped"]: true },
421
420
  () =>
@@ -451,7 +450,10 @@ work session kill --done
451
450
  const replies = [];
452
451
  let owing = [];
453
452
  for (;;) {
454
- const r = await ctx.api.post(`/api/sessions/${me}/replies`, body);
453
+ const r = await ctx.api.post(
454
+ `/api/sessions/${me}/replies${by()}`,
455
+ body,
456
+ );
455
457
  replies.push(...r.replies);
456
458
  if (!ctx.json) r.replies.forEach(printReply);
457
459
  owing = r.owing;
@@ -482,7 +484,7 @@ work session kill --done
482
484
  if (ctx.has("--done")) {
483
485
  const me = sessionId(ctx);
484
486
  const { closed } = await ctx.api.post(
485
- `/api/sessions/${me}/close-done`,
487
+ `/api/sessions/${me}/close-done${by()}`,
486
488
  );
487
489
  return ctx.out({ closed }, () =>
488
490
  console.log(
@@ -513,7 +515,7 @@ work session kill --done
513
515
  );
514
516
  }
515
517
  const r = await ctx.api.del(
516
- `/api/sessions/${id}${keep ? "?children=keep" : ""}`,
518
+ `/api/sessions/${id}${keep ? `?children=keep${by("&")}` : by()}`,
517
519
  );
518
520
  const closed = r?.closed ?? [id];
519
521
  return ctx.out({ id, killed: true, closed }, () =>
package/bin/cli/topic.mjs CHANGED
@@ -220,6 +220,16 @@ export function makeTopics(
220
220
  // origin, never to the base it was cut from.
221
221
  git(repo.dir, ["worktree", "add", "--no-track", "-b", branch, dest, start]);
222
222
  const stacked = from && from !== `origin/${repo.base_branch}` ? from : null;
223
+ // Its PR's base, said as gh reads it (branch.<b>.gh-merge-base): the
224
+ // branch it stacks on, else the base it was cut from.
225
+ const prBase = (stacked ?? repo.base_branch).replace(/^origin\//, "");
226
+ if (
227
+ has(repo.dir, `refs/heads/${prBase}`) ||
228
+ has(repo.dir, `refs/remotes/origin/${prBase}`)
229
+ )
230
+ git(repo.dir, ["config", `branch.${branch}.gh-merge-base`, prBase], {
231
+ allowFail: true,
232
+ });
223
233
  made.push({
224
234
  topic: name,
225
235
  repo: repo.worktree,
@@ -569,6 +569,32 @@ var STEPS = [
569
569
  CREATE INDEX group_members_session ON group_members(session_id);
570
570
 
571
571
  ALTER TABLE session_messages ADD COLUMN group_id TEXT REFERENCES session_groups(id) ON DELETE SET NULL;
572
+ `);
573
+ }
574
+ },
575
+ {
576
+ version: 6,
577
+ name: "drop work plan",
578
+ up(db) {
579
+ db.exec(`
580
+ CREATE TABLE session_groups_new (
581
+ id TEXT PRIMARY KEY,
582
+ workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
583
+ owner TEXT NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
584
+ title TEXT NOT NULL,
585
+ parallel INTEGER NOT NULL DEFAULT 4,
586
+ fan_in INTEGER NOT NULL DEFAULT 1,
587
+ close_done INTEGER NOT NULL DEFAULT 0,
588
+ keep INTEGER NOT NULL DEFAULT 0,
589
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
590
+ );
591
+ INSERT INTO session_groups_new (id, workspace_id, owner, title, parallel, fan_in, close_done, keep, created_at)
592
+ SELECT id, workspace_id, owner, title, parallel, fan_in, close_done, keep, created_at FROM session_groups;
593
+ DROP TABLE session_groups;
594
+ ALTER TABLE session_groups_new RENAME TO session_groups;
595
+
596
+ DROP TABLE plan_log;
597
+ DROP TABLE plans;
572
598
  `);
573
599
  }
574
600
  }
@@ -8598,7 +8624,7 @@ function publishChange(sessionId) {
8598
8624
  const row = get("SELECT workspace_id FROM sessions WHERE id = ?", sessionId);
8599
8625
  if (row?.workspace_id) {
8600
8626
  const workspaceId = row.workspace_id;
8601
- import("./_DrEeyoLF.js").then((m) => m.notifySessionsChanged(workspaceId));
8627
+ import("./_C9UcJEf9.js").then((m) => m.notifySessionsChanged(workspaceId));
8602
8628
  return;
8603
8629
  }
8604
8630
  publish("sessions.changed");
@@ -10619,6 +10645,20 @@ function listSessions(workspaceId) {
10619
10645
  function getSession(id) {
10620
10646
  return get("SELECT * FROM sessions WHERE id = ?", id);
10621
10647
  }
10648
+ /** The agent a request is made for (the `WORK_SESSION_ID` the CLI sends
10649
+ * as `by`, `parent` or `from`), when it is one: a shell's is the user's. */
10650
+ function agentCaller(id) {
10651
+ const s = id ? getSession(id) : void 0;
10652
+ return s && s.agent !== "shell" ? s : void 0;
10653
+ }
10654
+ /** An agent runs sessions only in its own workspace — starts them, fans
10655
+ * out, closes, skips, retries, renames, takes their replies; another
10656
+ * workspace's it may only message, while running (\`sendMessage\`). The
10657
+ * user (the app, their own shell) is held to none of it. */
10658
+ function ownWorkspaceOnly(caller, workspaceId, what) {
10659
+ const agent = agentCaller(caller);
10660
+ if (agent && workspaceId && agent.workspace_id !== workspaceId) throw httpError(403, `an agent ${what} only in its own workspace: to reach one in another (when the user asks), message an agent running there with \`work session send\``);
10661
+ }
10622
10662
  /** `ifEmpty` is a first open's auto-create: two pages mounting one empty
10623
10663
  * workspace at once (restored tabs, a phone and a desktop) both list no
10624
10664
  * sessions before either POST lands. The check and the insert run in one
@@ -10749,7 +10789,7 @@ function notifySessionsChanged(workspaceId) {
10749
10789
  async function emitSessionsChanged(workspaceId) {
10750
10790
  try {
10751
10791
  const states = await sessionStates();
10752
- const { teamsOf } = await import("./_E0fWorAK.js");
10792
+ const { teamsOf } = await import("./_Bu1xx1j4.js");
10753
10793
  publish("sessions.changed", {
10754
10794
  workspaceId,
10755
10795
  sessions: listSessions(workspaceId).map((s) => ({
@@ -11210,4 +11250,4 @@ function sleep(ms) {
11210
11250
  return new Promise((resolve) => setTimeout(resolve, ms));
11211
11251
  }
11212
11252
  //#endregion
11213
- export { setAgentPhase as $, DEFAULT_GITHUB_HOST as $t, blankRow as A, withLock as An, disabledAgents as At, interruptedSinceReport as B, ghKnownHosts as Bt, sendToSession as C, git as Cn, PREF_MAX as Ct, AGENTS as D, config as Dn, changePref as Dt, tmuxWasStarted as E, tmux as En, allPrefs as Et, activityOf as F, setDisabledAgents as Ft, notePermissionMode as G, tilde as Gt, noteActivity as H, miseVersions as Ht, agentPhase as I, setPref as It, notifyEventOn as J, unreachableText as Jt, noteTyped as K, which as Kt, clearAgentPhase as L, setSetting as Lt, inside as M, getSetting as Mt, realInside as N, isKnownAgent as Nt, readHookPayload as O, shared as On, deleteSetting as Ot, realInsideSync as P, preferredAgent as Pt, sessionWatched as Q, firewallProbe as Qt, hookPhase as R, discoverAgents as Rt, renameSession as S, gh as Sn, validSubscription as St, tmuxName as T, run$2 as Tn, agentChoices as Tt, noteBackground as U, setupPath as Ut, lastTypedAt as V, miseInstalls as Vt, noteInterrupt as W, stableGh as Wt, onPhaseChange as X, unsetCaches as Xt, onFinished as Y, enableUntrackedCache as Yt, onTurnEnd as Z, untrackedCacheAllowed as Zt, markTmuxStarted as _, all as _n, setInstance as _t, creationOf as a, parseAgentId as an, turnPhase as at, onSessionDispose as b, workspacePath as bn, saveSubscription as bt, ensureTmuxServer as c, FRAME_ANCESTORS as cn, agentFamily as ct, killSession as d, httpError as dn, agentMeta as dt, PROJECT_TOOLS as en, setExpecting as et, killWorkspaceSessions as f, readBody as fn, ACCENT_RE as ft, listSessions as g, subscriberCount as gn, normalizeAccent as gt, listPanesWithin as h, subscribe as hn, manifest as ht, createSession as i, catalogPin as in, summaryOf as it, cleanSummary as j, enabledAgents as jt, reportsWorking as k, swr as kn, deleteWorkspacePrefs as kt, forgetPanes as l, FRAME_HEADERS as ln, agentFromCommand as lt, listPanes as m, publishJson as mn, iconSvg as mt, cleanEnv as n, agentById as nn, setSessionViewers as nt, descendantsOf as o, toolById as on, turnSettling as ot, launchDir as p, publish as pn, getInstance as pt, noteUserAnswered as q, hostReach as qt, clearTmuxStarted as r, agentLabel$1 as rn, settleQuietWorking as rt, disposeSessions as s, applyPrefChange as sn, agentBadge as st, beginCreation as t, TOOLS as tn, setScrapedPhase as tt, getSession as u, checked as un, agentLabel as ut, newSessionArgs as v, db as vn, deleteSubscription as vt, sessionStates as w, gitEnv as wn, WORKSPACE_PREFS as wt, panePids as x, TMUX_SOCKET as xn, sendPush as xt, notifySessionsChanged as y, get as yn, pushPublicKey as yt, hookReportedAt as z, doctor as zt };
11253
+ export { onTurnEnd as $, untrackedCacheAllowed as $t, readHookPayload as A, shared as An, deleteSetting as At, hookPhase as B, discoverAgents as Bt, panePids as C, TMUX_SOCKET as Cn, sendPush as Ct, tmuxName as D, run$2 as Dn, agentChoices as Dt, sessionStates as E, gitEnv as En, WORKSPACE_PREFS as Et, realInside as F, isKnownAgent as Ft, noteBackground as G, setupPath as Gt, interruptedSinceReport as H, ghKnownHosts as Ht, realInsideSync as I, preferredAgent as It, noteTyped as J, which as Jt, noteInterrupt as K, stableGh as Kt, activityOf as L, setDisabledAgents as Lt, blankRow as M, withLock as Mn, disabledAgents as Mt, cleanSummary as N, enabledAgents as Nt, tmuxWasStarted as O, tmux as On, allPrefs as Ot, inside as P, getSetting as Pt, onPhaseChange as Q, unsetCaches as Qt, agentPhase as R, setPref as Rt, ownWorkspaceOnly as S, workspacePath as Sn, saveSubscription as St, sendToSession as T, git as Tn, PREF_MAX as Tt, lastTypedAt as U, miseInstalls as Ut, hookReportedAt as V, doctor as Vt, noteActivity as W, miseVersions as Wt, notifyEventOn as X, unreachableText as Xt, noteUserAnswered as Y, hostReach as Yt, onFinished as Z, enableUntrackedCache as Zt, listSessions as _, subscribe as _n, manifest as _t, createSession as a, agentLabel$1 as an, settleQuietWorking as at, notifySessionsChanged as b, db as bn, deleteSubscription as bt, disposeSessions as c, toolById as cn, turnSettling as ct, getSession as d, FRAME_HEADERS as dn, agentFromCommand as dt, firewallProbe as en, sessionWatched as et, killSession as f, checked as fn, agentLabel as ft, listPanesWithin as g, publishJson as gn, iconSvg as gt, listPanes as h, publish as hn, getInstance as ht, clearTmuxStarted as i, agentById as in, setSessionViewers as it, reportsWorking as j, swr as jn, deleteWorkspacePrefs as jt, AGENTS as k, config as kn, changePref as kt, ensureTmuxServer as l, applyPrefChange as ln, agentBadge as lt, launchDir as m, readBody as mn, ACCENT_RE as mt, beginCreation as n, PROJECT_TOOLS as nn, setExpecting as nt, creationOf as o, catalogPin as on, summaryOf as ot, killWorkspaceSessions as p, httpError as pn, agentMeta as pt, notePermissionMode as q, tilde as qt, cleanEnv as r, TOOLS as rn, setScrapedPhase as rt, descendantsOf as s, parseAgentId as sn, turnPhase as st, agentCaller as t, DEFAULT_GITHUB_HOST as tn, setAgentPhase as tt, forgetPanes as u, FRAME_ANCESTORS as un, agentFamily as ut, markTmuxStarted as v, subscriberCount as vn, normalizeAccent as vt, renameSession as w, gh as wn, validSubscription as wt, onSessionDispose as x, get as xn, pushPublicKey as xt, newSessionArgs as y, all as yn, setInstance as yt, clearAgentPhase as z, setSetting as zt };
@@ -0,0 +1,2 @@
1
+ import { d as teamsOf } from "./_Dqcw6PJn.js";
2
+ export { teamsOf };
@@ -0,0 +1,2 @@
1
+ import { b as notifySessionsChanged } from "./_BdBBZphI.js";
2
+ export { notifySessionsChanged };
@@ -85,98 +85,98 @@ var iconSize = {
85
85
  };
86
86
  //#endregion
87
87
  //#region src/tags/settings-agents.css.ts
88
- var agentRow = "_fj _ef";
89
- var list$3 = "_ej _dJ _ee _eh";
90
- var metaChip = "_ex _bz _by";
88
+ var agentRow = "_fG _dX";
89
+ var list$3 = "_d1 _dJ _dW _dZ";
90
+ var metaChip = "_ee _bz _by";
91
91
  var sectionCount = "_dG _bp _bq";
92
- var usageNote = "_kc _by";
93
- var pop$2 = "_hf _bN";
94
- var spinner = "_hi _bD _bi";
95
- var toolLead = "_g1 _es";
96
- var name$4 = "_gT _es";
97
- var desc$1 = "_gU _et";
92
+ var usageNote = "_j4 _by";
93
+ var pop$2 = "_g0 _bN";
94
+ var spinner = "_g3 _bD _bi";
95
+ var toolLead = "_gg _d_";
96
+ var name$4 = "_gq _d_";
97
+ var desc$1 = "_gr _ea";
98
98
  //#endregion
99
99
  //#region src/tags/lsp-add-dialog.css.ts
100
- var addDlg = "_lK _bV";
101
- var key$1 = "_me _mc";
102
- var addTile = "_mg _mc";
103
- var field$3 = "_mr _bA";
104
- var keyField = "_ms _mr _bA";
105
- var labelField = "_mt _mr _bA";
106
- var detailsToggle = "_gA _6";
107
- var themeSeg = "_fR _bR";
108
- var checkList = "_hJ _dH";
100
+ var addDlg = "_ly _bX";
101
+ var key$1 = "_lH _lF";
102
+ var addTile = "_lJ _lF";
103
+ var field$2 = "_lU _bA";
104
+ var keyField = "_lV _lU _bA";
105
+ var labelField = "_lW _lU _bA";
106
+ var detailsToggle = "_gI _6";
107
+ var themeSeg = "_fW _bR";
108
+ var checkList = "_h7 _dH";
109
109
  //#endregion
110
110
  //#region src/tags/prompt-dialog.css.ts
111
- var promptDlg = "_bZ _bV";
111
+ var promptDlg = "_b1 _bX";
112
112
  var item$1 = "_b6 _D";
113
113
  var glance = "_dT _D";
114
114
  //#endregion
115
115
  //#region src/tags/side-nav.css.ts
116
- var iconBtn = "_cr _D";
117
- var settingsDot = "_cs _bQ";
118
- var notifyBtn = "_cx _D";
116
+ var iconBtn = "_ca _D";
117
+ var settingsDot = "_cb _bQ";
118
+ var notifyBtn = "_cg _D";
119
119
  //#endregion
120
120
  //#region src/styles/session-pop.css.ts
121
- var sessionPop = "_cz _bN";
122
- var sessionPopBtn = "_cA _bk";
123
- var wsBtn = "_fz _bk";
124
- var rowIcon = "_fB _bF _D";
125
- var prChip = "_lp _M _lj";
121
+ var sessionPop = "_b9 _bN";
122
+ var sessionPopBtn = "_b_ _bk";
123
+ var wsBtn = "_e5 _bk";
124
+ var rowIcon = "_e7 _bF _D";
125
+ var prChip = "_l7 _M _l1";
126
126
  //#endregion
127
127
  //#region src/tags/port-chip.css.ts
128
- var port = "_o1 _M _lj";
128
+ var port = "_oP _M _l1";
129
129
  var depth = {
130
- "1": "_ku",
131
- "2": "_kv",
132
- "3": "_kw"
130
+ "1": "_kT",
131
+ "2": "_kU",
132
+ "3": "_kV"
133
133
  };
134
- var open = "_kC _bk";
135
- var action = "_kH _bI _D";
136
- var toggle = "_eC _6";
137
- var fold = "_eD _eg";
138
- var item = "_ko _bk";
134
+ var open = "_k1 _bk";
135
+ var action = "_k6 _bI _D";
136
+ var toggle = "_ej _6";
137
+ var fold = "_ek _dY";
138
+ var item = "_kA _bk";
139
139
  var statusOf = {
140
- queued: "_nB",
141
- starting: "_nC",
142
- working: "_nD",
143
- waiting: "_nE",
144
- idle: "_nF",
145
- done: "_nG",
146
- closed: "_nH"
140
+ queued: "_m0",
141
+ starting: "_m1",
142
+ working: "_m2",
143
+ waiting: "_m3",
144
+ idle: "_m4",
145
+ done: "_m5",
146
+ closed: "_m6"
147
147
  };
148
- var menu = "_m5 _cz _bN";
149
- var menuItem = "_m7 _bk";
150
- var findBtn$1 = "_jp _hS _bG _D";
151
- var tool = "_hS _bG _D";
152
- var heldRefresh = "_h0 _M";
153
- var pop$1 = "_l_ _cz _bN";
154
- var fileFilter = "_o5 _F";
155
- var findInput = "_d5 _F";
156
- var keybarIconBtn = "_ed _bI _D";
157
- var input = "_c1 _F";
158
- var group = "_c4 _6";
159
- var hint$1 = "_mI _bp _3";
160
- var sheetDir = "_oj _bP";
161
- var upBtn = "_iJ _bG _D";
162
- var findBtn = "_iN _hS _bG _D";
163
- var goBtn = "_iO _hS _bG _D";
164
- var note = "_lZ _by";
148
+ var menu = "_nH _b9 _bN";
149
+ var menuItem = "_nJ _bk";
150
+ var findBtn$1 = "_jp _if _bG _D";
151
+ var tool = "_if _bG _D";
152
+ var heldRefresh = "_in _M";
153
+ var pop$1 = "_mr _b9 _bN";
154
+ var fileFilter = "_oO _F";
155
+ var findInput = "_eR _F";
156
+ var keybarIconBtn = "_e0 _bI _D";
157
+ var input = "_cI _F";
158
+ var group = "_cL _6";
159
+ var hint$1 = "_nk _bp _3";
160
+ var sheetDir = "_n6 _bP";
161
+ var upBtn = "_iz _bG _D";
162
+ var findBtn = "_iD _if _bG _D";
163
+ var goBtn = "_iE _if _bG _D";
164
+ var note = "_mn _by";
165
165
  //#endregion
166
166
  //#region src/tags/manage-workspace.css.ts
167
- var procCmd = "_hn _es";
168
- var factCopy = "_hu _bI _D";
169
- var resultRow = "_k5 _bk";
170
- var resultBranch = "_k6 _ex _bz _by _bF _D";
171
- var urlAction = "_k7 _ex _bz _by _ey";
172
- var curRow = "_gP _em";
167
+ var procCmd = "_hd _d_";
168
+ var factCopy = "_hk _bI _D";
169
+ var resultRow = "_lh _bk";
170
+ var resultBranch = "_li _ee _bz _by _bF _D";
171
+ var urlAction = "_lj _ee _bz _by _ef";
172
+ var curRow = "_hb _d4";
173
173
  //#endregion
174
174
  //#region src/tags/join-dialog.css.ts
175
- var dlg = "_lP _bV";
176
- var hint = "_lQ _by";
177
- var kbtn = "_cj _bH _D";
178
- var repeat = "_cm _cl";
179
- var dpadUser = "_cp _cl";
180
- var dpadEsc = "_cq _cl";
175
+ var dlg = "_kH _bX";
176
+ var hint = "_kI _by";
177
+ var kbtn = "_c4 _bH _D";
178
+ var repeat = "_c7 _c6";
179
+ var dpadUser = "_c_ _c6";
180
+ var dpadEsc = "_da _c6";
181
181
  //#endregion
182
- export { field$3 as $, statusOf as A, prTone as At, wsBtn as B, fileFilter as C, chipBtn as Ct, findBtn$1 as D, iconBtnXs as Dt, tool as E, iconBtnRow as Et, depth as F, settingsDot as G, sessionPopBtn as H, open as I, promptDlg as J, glance as K, port as L, fold as M, usageFill as Mt, toggle as N, usageInk as Nt, menu as O, inputLg as Ot, action as P, addTile as Q, prChip as R, keybarIconBtn as S, btnSm as St, heldRefresh as T, iconBtnLg as Tt, iconBtn as U, sessionPop as V, notifyBtn as W, themeSeg as X, checkList as Y, detailsToggle as Z, sheetDir as _, tocDot as _t, dlg as a, name$4 as at, input as b, toastTitle as bt, resultBranch as c, spinner as ct, factCopy as d, list$3 as dt, key$1 as et, procCmd as f, metaChip as ft, upBtn as g, sans as gt, goBtn as h, iconSize as ht, repeat as i, desc$1 as it, item as j, tone as jt, menuItem as k, phaseIcon as kt, resultRow as l, usageNote as lt, findBtn as m, color as mt, dpadUser as n, labelField as nt, hint as o, toolLead as ot, note as p, agentRow as pt, item$1 as q, kbtn as r, addDlg as rt, curRow as s, pop$2 as st, dpadEsc as t, keyField as tt, urlAction as u, sectionCount as ut, hint$1 as v, toastKind as vt, pop$1 as w, glyphBadgeNum as wt, findInput as x, btnLg as xt, group as y, toastStack as yt, rowIcon as z };
182
+ export { field$2 as $, statusOf as A, prTone as At, wsBtn as B, fileFilter as C, chipBtn as Ct, findBtn$1 as D, iconBtnXs as Dt, tool as E, iconBtnRow as Et, depth as F, settingsDot as G, sessionPopBtn as H, open as I, promptDlg as J, glance as K, port as L, fold as M, usageFill as Mt, toggle as N, usageInk as Nt, menu as O, inputLg as Ot, action as P, addTile as Q, prChip as R, keybarIconBtn as S, btnSm as St, heldRefresh as T, iconBtnLg as Tt, iconBtn as U, sessionPop as V, notifyBtn as W, themeSeg as X, checkList as Y, detailsToggle as Z, sheetDir as _, tocDot as _t, dlg as a, name$4 as at, input as b, toastTitle as bt, resultBranch as c, spinner as ct, factCopy as d, list$3 as dt, key$1 as et, procCmd as f, metaChip as ft, upBtn as g, sans as gt, goBtn as h, iconSize as ht, repeat as i, desc$1 as it, item as j, tone as jt, menuItem as k, phaseIcon as kt, resultRow as l, usageNote as lt, findBtn as m, color as mt, dpadUser as n, labelField as nt, hint as o, toolLead as ot, note as p, agentRow as pt, item$1 as q, kbtn as r, addDlg as rt, curRow as s, pop$2 as st, dpadEsc as t, keyField as tt, urlAction as u, sectionCount as ut, hint$1 as v, toastKind as vt, pop$1 as w, glyphBadgeNum as wt, findInput as x, btnLg as xt, group as y, toastStack as yt, rowIcon as z };
@@ -1,4 +1,4 @@
1
- import { C as sendToSession, F as activityOf, I as agentPhase, Mt as getSetting, Nt as isKnownAgent, Q as sessionWatched, S as renameSession, V as lastTypedAt, X as onPhaseChange, Y as onFinished, Z as onTurnEnd, _n as all, at as turnPhase, b as onSessionDispose, d as killSession, dn as httpError, et as setExpecting, h as listPanesWithin, i as createSession, it as summaryOf, j as cleanSummary, ot as turnSettling, u as getSession, ut as agentLabel, vn as db, y as notifySessionsChanged, yn as get, z as hookReportedAt } from "./_Hb3LeA5Q.js";
1
+ import { $ as onTurnEnd, Ft as isKnownAgent, L as activityOf, N as cleanSummary, Pt as getSetting, Q as onPhaseChange, R as agentPhase, T as sendToSession, U as lastTypedAt, V as hookReportedAt, Z as onFinished, a as createSession, b as notifySessionsChanged, bn as db, ct as turnSettling, d as getSession, et as sessionWatched, f as killSession, ft as agentLabel, g as listPanesWithin, nt as setExpecting, ot as summaryOf, pn as httpError, st as turnPhase, w as renameSession, x as onSessionDispose, xn as get, yn as all } from "./_BdBBZphI.js";
2
2
  //#region src/server/messages.ts
3
3
  var team = {
4
4
  memberGroup: () => null,
@@ -83,9 +83,17 @@ function replyBody(session, message) {
83
83
  if (message.length <= MAX_REPLY) return message;
84
84
  return `${message.slice(0, MAX_REPLY)}\n\n[cut at ${MAX_REPLY} characters: the rest is in its tab, ${tab}]`;
85
85
  }
86
+ /** How a sender is named where its message lands: with its workspace,
87
+ * when that is another. */
88
+ function senderLabel(from, to) {
89
+ const target = getSession(to);
90
+ if (!from.workspace_id || from.workspace_id === target?.workspace_id) return labelOf(from);
91
+ const ws = get("SELECT name FROM workspaces WHERE id = ?", from.workspace_id);
92
+ return `${labelOf(from)} in workspace ${ws?.name ?? from.workspace_id}`;
93
+ }
86
94
  function insert(to, from, kind, body, wantsReply = false, groupId = null) {
87
95
  return Number(db.prepare(`INSERT INTO session_messages (to_session, from_session, from_label, kind, body, wants_reply, group_id)
88
- VALUES (?, ?, ?, ?, ?, ?, ?)`).run(to, from?.id ?? null, from ? labelOf(from) : null, kind, body, wantsReply ? 1 : 0, groupId).lastInsertRowid);
96
+ VALUES (?, ?, ?, ?, ?, ?, ?)`).run(to, from?.id ?? null, from ? senderLabel(from, to) : null, kind, body, wantsReply ? 1 : 0, groupId).lastInsertRowid);
89
97
  }
90
98
  function deleteIds(ids) {
91
99
  if (!ids.length) return;
@@ -190,6 +198,9 @@ async function sendMessage(to, text, opts = {}) {
190
198
  if (text.length > MAX_BODY) throw httpError(413, `a message is at most ${MAX_BODY} characters: write the rest to a file and send its path`);
191
199
  const sender = opts.from ? getSession(opts.from) : void 0;
192
200
  const from = sender && sender.agent !== "shell" ? sender : null;
201
+ if (!!from && from.workspace_id !== target.workspace_id) {
202
+ if (!(await listPanesWithin(2e3))?.some((p) => p.id === to)) throw httpError(409, `${to} is not running: a message to another workspace goes only to an agent running there`);
203
+ }
193
204
  if (from && !opts.member) admit(from.id);
194
205
  if (!from && target.parent_id) db.prepare("UPDATE sessions SET keep = 1 WHERE id = ?").run(to);
195
206
  const wantsReply = !!from && opts.reply !== false;
@@ -338,8 +349,6 @@ var MAX_BOOTING = 2;
338
349
  /** A pool with queued members looks again this often, for a slot that a
339
350
  * session freed without a hook to say so. */
340
351
  var POOL_RETRY_MS = 5e3;
341
- /** Lines a plan keeps of its log. */
342
- var MAX_LOG = 200;
343
352
  /** A finished group older than this goes as the server starts. */
344
353
  var PRUNE_AFTER = "-1 day";
345
354
  var now = () => (/* @__PURE__ */ new Date()).toISOString();
@@ -394,18 +403,19 @@ function createGroup(owner, input) {
394
403
  const dirs = input.dirs ?? [];
395
404
  if (dirs.length && dirs.length !== slots.length) throw httpError(400, `${dirs.length} folders for ${slots.length} members`);
396
405
  const title = input.title.trim() || "fan-out";
406
+ const groupTitle = title.replace(/\s*[:·\-–]?\s*\{i?\}\s*/g, " ").trim() || "fan-out";
397
407
  const parallel = Math.min(MAX_PARALLEL, Math.max(1, Math.floor(input.parallel ?? DEFAULT_PARALLEL)));
398
- const current = openPlan(owner);
399
408
  const id = newId("g");
400
- db.prepare(`INSERT INTO session_groups (id, workspace_id, owner, plan_id, phase, title, parallel, fan_in, close_done, keep)
401
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, lead.workspace_id, owner, current?.id ?? null, input.phase?.trim() || null, title, parallel, input.fanIn === false ? 0 : 1, input.closeDone ? 1 : 0, input.keep ? 1 : 0);
409
+ db.prepare(`INSERT INTO session_groups (id, workspace_id, owner, title, parallel, fan_in, close_done, keep)
410
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(id, lead.workspace_id, owner, groupTitle, parallel, input.fanIn === false ? 0 : 1, input.closeDone ? 1 : 0, input.keep ? 1 : 0);
402
411
  const several = new Set(slots.map((p) => p.agent)).size > 1;
403
412
  const insert = db.prepare(`INSERT INTO group_members (id, group_id, ord, agent, title, prompt, launch_dir)
404
413
  VALUES (?, ?, ?, ?, ?, ?, ?)`);
405
414
  slots.forEach((p, i) => {
406
415
  const name = p.item ?? (slots.length > agents.length ? `#${p.n}` : "");
407
416
  const who = several ? p.agent : "";
408
- const memberTitle = [title, [name, who].filter(Boolean).join(" ")].filter(Boolean).join(" · ").slice(0, 60);
417
+ const templated = /\{i?\}/.test(title);
418
+ const memberTitle = (templated ? [title.replaceAll("{}", p.item ?? name).replaceAll("{i}", String(i + 1)), who] : [title, [name, who].filter(Boolean).join(" ")]).filter(Boolean).join(templated ? " " : " · ").slice(0, 60);
409
419
  const prompt = input.prompt.replaceAll("{}", p.item ?? "").replaceAll("{i}", String(i + 1));
410
420
  insert.run(newId("m"), id, i + 1, p.agent, memberTitle, prompt, dirs[i] ?? null);
411
421
  });
@@ -414,6 +424,10 @@ function createGroup(owner, input) {
414
424
  kickPool();
415
425
  return groupView(groupOf(id));
416
426
  }
427
+ /** The workspace a member's group runs in. */
428
+ function memberWorkspace(memberId) {
429
+ return get("SELECT g.workspace_id FROM group_members m JOIN session_groups g ON g.id = m.group_id WHERE m.id = ?", memberId)?.workspace_id;
430
+ }
417
431
  /** Rerun a member that closed: a fresh session with the same prompt. Its
418
432
  * lead's word that it closed is taken back, so the group waits for it. */
419
433
  function retryMember(memberId) {
@@ -587,40 +601,6 @@ setTeamHooks({
587
601
  changed(g.workspace_id);
588
602
  }
589
603
  });
590
- function openPlan(owner) {
591
- return get("SELECT * FROM plans WHERE owner = ? AND done_at IS NULL ORDER BY created_at DESC LIMIT 1", owner);
592
- }
593
- /** A lead's plan: the phases its groups fall under, in order. A new one
594
- * ends the lead's last. */
595
- function createPlan(owner, name, phases) {
596
- const lead = getSession(owner);
597
- if (!lead?.workspace_id) throw httpError(404, `no session ${owner}`);
598
- if (!name.trim()) throw httpError(400, "a plan needs a name");
599
- db.prepare("UPDATE plans SET done_at = ? WHERE owner = ? AND done_at IS NULL").run(now(), owner);
600
- const id = newId("p");
601
- const clean = phases.map((p) => ({
602
- title: p.title.trim(),
603
- detail: p.detail?.trim() || void 0
604
- })).filter((p) => p.title);
605
- db.prepare("INSERT INTO plans (id, workspace_id, owner, name, phases) VALUES (?, ?, ?, ?, ?)").run(id, lead.workspace_id, owner, name.trim(), JSON.stringify(clean));
606
- changed(lead.workspace_id);
607
- return planView(get("SELECT * FROM plans WHERE id = ?", id));
608
- }
609
- /** A line of what the lead is doing, over its plan's phases. */
610
- function logPlan(owner, text) {
611
- const plan = openPlan(owner);
612
- if (!plan) throw httpError(409, "no plan to log to: start one with `work plan new \"<name>\"`");
613
- db.prepare("INSERT INTO plan_log (plan_id, text) VALUES (?, ?)").run(plan.id, text.trim().slice(0, 300));
614
- db.prepare(`DELETE FROM plan_log WHERE plan_id = ? AND id NOT IN
615
- (SELECT id FROM plan_log WHERE plan_id = ? ORDER BY id DESC LIMIT ${MAX_LOG})`).run(plan.id, plan.id);
616
- changed(plan.workspace_id);
617
- }
618
- function finishPlan(owner) {
619
- const plan = openPlan(owner);
620
- if (!plan) throw httpError(409, "no plan under way");
621
- db.prepare("UPDATE plans SET done_at = ? WHERE id = ?").run(now(), plan.id);
622
- changed(plan.workspace_id);
623
- }
624
604
  function memberStatus(m, alive) {
625
605
  if (m.state !== "running") return m.state;
626
606
  if (booting.has(m.id) || !m.session_id) return "starting";
@@ -664,7 +644,6 @@ function groupView(g, alive = null) {
664
644
  return {
665
645
  id: g.id,
666
646
  title: g.title,
667
- phase: g.phase,
668
647
  parallel: g.parallel,
669
648
  fanIn: !!g.fan_in,
670
649
  closeDone: !!g.close_done,
@@ -674,36 +653,16 @@ function groupView(g, alive = null) {
674
653
  members
675
654
  };
676
655
  }
677
- function planView(p) {
678
- let phases = [];
679
- try {
680
- phases = JSON.parse(p.phases);
681
- } catch {}
682
- return {
683
- id: p.id,
684
- name: p.name,
685
- phases,
686
- log: all("SELECT text, at FROM plan_log WHERE plan_id = ? ORDER BY id DESC LIMIT 5", p.id).reverse(),
687
- done: !!p.done_at,
688
- createdAt: p.created_at
689
- };
690
- }
691
- /** Every lead's team in a workspace: its plan (the open one, else its
692
- * last) and its groups. */
656
+ /** Every lead's team in a workspace: its groups. (Its plan is its own
657
+ * todo list, on its session row.) */
693
658
  async function teamsOf(workspaceId) {
694
659
  const panes = await listPanesWithin(2e3);
695
660
  const alive = panes ? new Set(panes.flatMap((p) => p.id ? [p.id] : [])) : null;
696
661
  const groups = all("SELECT * FROM session_groups WHERE workspace_id = ? ORDER BY created_at", workspaceId);
697
- const plans = all(`SELECT * FROM plans p WHERE workspace_id = ? AND created_at =
698
- (SELECT MAX(created_at) FROM plans WHERE owner = p.owner)`, workspaceId);
699
- return [.../* @__PURE__ */ new Set([...groups.map((g) => g.owner), ...plans.map((p) => p.owner)])].map((owner) => {
700
- const plan = plans.find((p) => p.owner === owner);
701
- return {
702
- owner,
703
- plan: plan ? planView(plan) : null,
704
- groups: groups.filter((g) => g.owner === owner).map((g) => groupView(g, alive))
705
- };
706
- });
662
+ return [...new Set(groups.map((g) => g.owner))].map((owner) => ({
663
+ owner,
664
+ groups: groups.filter((g) => g.owner === owner).map((g) => groupView(g, alive))
665
+ }));
707
666
  }
708
667
  /** The groups `owner` runs, for `work session team`. */
709
668
  async function teamOf(owner) {
@@ -711,7 +670,6 @@ async function teamOf(owner) {
711
670
  if (!s?.workspace_id) throw httpError(404, `no session ${owner}`);
712
671
  return (await teamsOf(s.workspace_id)).find((t) => t.owner === owner) ?? {
713
672
  owner,
714
- plan: null,
715
673
  groups: []
716
674
  };
717
675
  }
@@ -784,4 +742,4 @@ function startTeam() {
784
742
  kickPool();
785
743
  }
786
744
  //#endregion
787
- export { startMessages as _, createPlan as a, logPlan as c, startTeam as d, teamOf as f, sessionGone as g, sendMessage as h, createGroup as i, retryMember as l, messageStates as m, closeDone as n, finishPlan as o, teamsOf as p, closeFinished as r, kickPool as s, clearGroup as t, skipMember as u, takeReplies as v };
745
+ export { kickPool as a, skipMember as c, teamsOf as d, messageStates as f, takeReplies as g, startMessages as h, createGroup as i, startTeam as l, sessionGone as m, closeDone as n, memberWorkspace as o, sendMessage as p, closeFinished as r, retryMember as s, clearGroup as t, teamOf as u };