@dylanpiercey/work 0.2.17 → 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 (517) hide show
  1. package/README.md +16 -0
  2. package/bin/cli/README.md +34 -0
  3. package/bin/cli/_progress.mjs +68 -0
  4. package/bin/cli/_repo.mjs +32 -0
  5. package/bin/cli/_target.mjs +49 -0
  6. package/bin/cli/agent.mjs +153 -0
  7. package/bin/cli/branches.mjs +79 -0
  8. package/bin/cli/config.mjs +175 -0
  9. package/bin/cli/host.mjs +142 -0
  10. package/bin/cli/lsp.mjs +117 -0
  11. package/bin/cli/notify.mjs +53 -0
  12. package/bin/cli/open.mjs +37 -0
  13. package/bin/cli/repo.mjs +98 -0
  14. package/bin/cli/session.mjs +296 -0
  15. package/bin/cli/skill.mjs +99 -0
  16. package/bin/cli/stack.mjs +51 -0
  17. package/bin/cli/status.mjs +86 -0
  18. package/bin/cli/topic.mjs +585 -0
  19. package/bin/cli/workspace.mjs +184 -0
  20. package/bin/work.mjs +411 -80
  21. package/dist/{_Bj-WwfnW.js → _CsokArOR.js} +183 -59
  22. package/dist/_L2HNAA_8.js +2 -0
  23. package/dist/__TCdgPY5.js +173 -0
  24. package/dist/index.mjs +3917 -2606
  25. package/dist/public/assets/{_C9jR1P3s.js → _-7Amnss4.js} +1 -1
  26. package/dist/public/assets/_-7Amnss4.js.br +0 -0
  27. package/dist/public/assets/_0XXNUttq.js +1 -0
  28. package/dist/public/assets/{_CIrZGxEf.js → _0sTkxfPx.js} +1 -1
  29. package/dist/public/assets/_0sTkxfPx.js.br +0 -0
  30. package/dist/public/assets/_0zzYbK0A.js +1 -0
  31. package/dist/public/assets/{_CJgqLdsx.js → _1M3oZPSf.js} +1 -1
  32. package/dist/public/assets/_1M3oZPSf.js.br +0 -0
  33. package/dist/public/assets/_2O5HnHht.js +1 -0
  34. package/dist/public/assets/_7WlUaJPH.js +1 -0
  35. package/dist/public/assets/_8Tr7ByPg.js +1 -0
  36. package/dist/public/assets/_9AXMmQSO.js +1 -0
  37. package/dist/public/assets/_B1VqbV-X.js +1 -0
  38. package/dist/public/assets/{_BxS3xvmE.js → _B9I2AEux.js} +1 -1
  39. package/dist/public/assets/_B9I2AEux.js.br +0 -0
  40. package/dist/public/assets/{_DO_4_u2Q.js → _B9qGqvit.js} +1 -1
  41. package/dist/public/assets/{_CIWiehYG.js → _B9xuaMHt.js} +1 -1
  42. package/dist/public/assets/_B9xuaMHt.js.br +0 -0
  43. package/dist/public/assets/{_BqWlTTxo.js → _BAWjkhA8.js} +1 -1
  44. package/dist/public/assets/_BAWjkhA8.js.br +0 -0
  45. package/dist/public/assets/{_CNUs2Gqk.js → _BBCzcNZY.js} +1 -1
  46. package/dist/public/assets/_BBCzcNZY.js.br +0 -0
  47. package/dist/public/assets/_BBW2szHh.js +1 -0
  48. package/dist/public/assets/_BCP2Njnu.js +1 -0
  49. package/dist/public/assets/{_A-jpjc8j.js → _BClUYs-k.js} +1 -1
  50. package/dist/public/assets/_BClUYs-k.js.br +0 -0
  51. package/dist/public/assets/{_B5JxE4Sx.js → _BDdZkZRc.js} +1 -1
  52. package/dist/public/assets/_BDdZkZRc.js.br +0 -0
  53. package/dist/public/assets/_BEDmGSgS.js +1 -0
  54. package/dist/public/assets/_BEDmGSgS.js.br +0 -0
  55. package/dist/public/assets/_BH9BIky6.js +1 -0
  56. package/dist/public/assets/_BH9BIky6.js.br +0 -0
  57. package/dist/public/assets/_BLdi8Ee5.js +1 -0
  58. package/dist/public/assets/{_C449plW0.js → _BPDSQUbl.js} +1 -1
  59. package/dist/public/assets/_BPDSQUbl.js.br +0 -0
  60. package/dist/public/assets/{_B19mS3yM.js → _BQW1kIop.js} +1 -1
  61. package/dist/public/assets/_BQW1kIop.js.br +0 -0
  62. package/dist/public/assets/_BQeoUfFw.js +1 -0
  63. package/dist/public/assets/_BRzroLbh.js +1 -0
  64. package/dist/public/assets/_BSXsTYSe.js +1 -0
  65. package/dist/public/assets/_BTXDT3Na.js +1 -0
  66. package/dist/public/assets/_BXm4xeFI.js +1 -0
  67. package/dist/public/assets/_BY8UeogK.js +1 -0
  68. package/dist/public/assets/_BYpyhp64.js +1 -0
  69. package/dist/public/assets/_BYpyhp64.js.br +0 -0
  70. package/dist/public/assets/_B_Kz7LnY.js +1 -0
  71. package/dist/public/assets/{_DqGOYRpi.js → _Bcc0Xs64.js} +1 -1
  72. package/dist/public/assets/_Bcc0Xs64.js.br +0 -0
  73. package/dist/public/assets/{_Do6b-nfX.js → _BdSsUhCi.js} +1 -1
  74. package/dist/public/assets/_BdSsUhCi.js.br +0 -0
  75. package/dist/public/assets/_BdaWssEH.js +1 -0
  76. package/dist/public/assets/{_BHyWcuOR.js → _BhecGD7y.js} +1 -1
  77. package/dist/public/assets/_BhecGD7y.js.br +0 -0
  78. package/dist/public/assets/_Bj9dpPhN.js +1 -0
  79. package/dist/public/assets/{_DorQTaAa.js → _BjZqS7za.js} +1 -1
  80. package/dist/public/assets/_BjZqS7za.js.br +0 -0
  81. package/dist/public/assets/_BkSUiyHK.js +1 -0
  82. package/dist/public/assets/_BlshXH2Y.js +16 -0
  83. package/dist/public/assets/_BlshXH2Y.js.br +0 -0
  84. package/dist/public/assets/_BmX-VP7w.js +1 -0
  85. package/dist/public/assets/{_v3HPnNBs.js → _BmpOmFbo.js} +1 -1
  86. package/dist/public/assets/_BmpOmFbo.js.br +0 -0
  87. package/dist/public/assets/_Bo6YntUl.js +1 -0
  88. package/dist/public/assets/_BprZx4vg.js +2 -0
  89. package/dist/public/assets/_BprZx4vg.js.br +0 -0
  90. package/dist/public/assets/_Bqm7OnIV.js +1 -0
  91. package/dist/public/assets/_BquBGUNK.js +1 -0
  92. package/dist/public/assets/_BquBGUNK.js.br +0 -0
  93. package/dist/public/assets/_BrB66aRZ.js +1 -0
  94. package/dist/public/assets/{_BA-MNdjL.js → _Bt03HU8S.js} +1 -1
  95. package/dist/public/assets/{_BTWfPOi-.js → _BtedGrGs.js} +1 -1
  96. package/dist/public/assets/_BtedGrGs.js.br +0 -0
  97. package/dist/public/assets/{_DUdEYxV0.js → _C-BYkx5h.js} +1 -1
  98. package/dist/public/assets/_C-BYkx5h.js.br +0 -0
  99. package/dist/public/assets/{_BUW_V5kN.js → _C-DhXiEm.js} +1 -1
  100. package/dist/public/assets/_C-DhXiEm.js.br +0 -0
  101. package/dist/public/assets/_C-NBFnST.js +1 -0
  102. package/dist/public/assets/{_BoTzWlXR.js → _C1RigMYD.js} +1 -1
  103. package/dist/public/assets/_C1RigMYD.js.br +0 -0
  104. package/dist/public/assets/_C2vRS-ES.js +1 -0
  105. package/dist/public/assets/{_CrlNjDih.js → _C3fslTAD.js} +1 -1
  106. package/dist/public/assets/_C3fslTAD.js.br +0 -0
  107. package/dist/public/assets/{_BuMTHEPk.js → _C4EYjWGn.js} +1 -1
  108. package/dist/public/assets/_C4EYjWGn.js.br +0 -0
  109. package/dist/public/assets/{_yp48NYOW.js → _C6Yt6h_R.js} +1 -1
  110. package/dist/public/assets/_C6Yt6h_R.js.br +0 -0
  111. package/dist/public/assets/{_cyorvuL1.js → _C7Y4xApK.js} +1 -1
  112. package/dist/public/assets/_C7Y4xApK.js.br +0 -0
  113. package/dist/public/assets/{_D4CkNo0r.js → _CB52LkYt.js} +1 -1
  114. package/dist/public/assets/_CB52LkYt.js.br +0 -0
  115. package/dist/public/assets/{_CxgPm_xy.js → _CBEKHwUV.js} +1 -1
  116. package/dist/public/assets/_CBEKHwUV.js.br +0 -0
  117. package/dist/public/assets/_CBSLBYQF.js +1 -0
  118. package/dist/public/assets/_CBgzBB_k.js +1 -0
  119. package/dist/public/assets/_CBgzBB_k.js.br +0 -0
  120. package/dist/public/assets/{_CCONYsJT.js → _CCoTlnvb.js} +1 -1
  121. package/dist/public/assets/_CCoTlnvb.js.br +0 -0
  122. package/dist/public/assets/_CD26To-f.js +1 -0
  123. package/dist/public/assets/_CDyWgQ0v.js +6 -0
  124. package/dist/public/assets/_CDyWgQ0v.js.br +0 -0
  125. package/dist/public/assets/{_vX9d6g5Y.js → _CEC5O89D.js} +1 -1
  126. package/dist/public/assets/_CEC5O89D.js.br +0 -0
  127. package/dist/public/assets/_CF2kEAU7.js +1 -0
  128. package/dist/public/assets/_CFURqbmO.js +1 -0
  129. package/dist/public/assets/{_Cwtn28hL.js → _CG383oZY.js} +1 -1
  130. package/dist/public/assets/_CG383oZY.js.br +0 -0
  131. package/dist/public/assets/_CHNJosg3.js +1 -0
  132. package/dist/public/assets/{_Cc_GUPR4.js → _CHmEM8Sm.js} +1 -1
  133. package/dist/public/assets/_CHmEM8Sm.js.br +0 -0
  134. package/dist/public/assets/_CIfCdAzS.js +1 -0
  135. package/dist/public/assets/_CKyzH0fl.js +1 -0
  136. package/dist/public/assets/{_BCB8LQS3.js → _CL8DzBla.js} +1 -1
  137. package/dist/public/assets/_CL8DzBla.js.br +0 -0
  138. package/dist/public/assets/_CNYS94C5.js +1 -0
  139. package/dist/public/assets/_CNhypHJN.js +1 -0
  140. package/dist/public/assets/_CO-FkxlA.js +1 -0
  141. package/dist/public/assets/_COiGBSpO.js +1 -0
  142. package/dist/public/assets/_COvolvRQ.js +1 -0
  143. package/dist/public/assets/{_Di78jTI-.js → _CPaMvBMG.js} +1 -1
  144. package/dist/public/assets/_CPaMvBMG.js.br +0 -0
  145. package/dist/public/assets/{_C7bHTlG1.js → _CPj_VL66.js} +1 -1
  146. package/dist/public/assets/_CPj_VL66.js.br +0 -0
  147. package/dist/public/assets/_CQJC8Vx4.js +1 -0
  148. package/dist/public/assets/_CRHNlzBC.js +1 -0
  149. package/dist/public/assets/{_C1-Nli75.js → _CToqok6Q.js} +1 -1
  150. package/dist/public/assets/_CToqok6Q.js.br +0 -0
  151. package/dist/public/assets/_CUFKkl0B.js +1 -0
  152. package/dist/public/assets/_CZsOUa-q.js +1 -0
  153. package/dist/public/assets/{_D8uBvHXU.js → _C_D5TPb7.js} +1 -1
  154. package/dist/public/assets/_C_D5TPb7.js.br +0 -0
  155. package/dist/public/assets/_CdHI48v6.js +1 -0
  156. package/dist/public/assets/{_BfQeZPXW.js → _CdpmkkzR.js} +1 -1
  157. package/dist/public/assets/_CdpmkkzR.js.br +0 -0
  158. package/dist/public/assets/{_6klEiBhY.js → _CdtjIoUd.js} +1 -1
  159. package/dist/public/assets/_CdtjIoUd.js.br +0 -0
  160. package/dist/public/assets/_Ce9Tv01m.js +1 -0
  161. package/dist/public/assets/_CeC7Lv10.js +1 -0
  162. package/dist/public/assets/{_CYhJ6ae-.js → _CfP0f0PU.js} +1 -1
  163. package/dist/public/assets/_CfP0f0PU.js.br +0 -0
  164. package/dist/public/assets/_Cg7DH3xk.js +1 -0
  165. package/dist/public/assets/_Cg7DH3xk.js.br +0 -0
  166. package/dist/public/assets/_CikNq0z8.js +1 -0
  167. package/dist/public/assets/{_DK-MOyi_.js → _Cl7LTITm.js} +1 -1
  168. package/dist/public/assets/_Cl7LTITm.js.br +0 -0
  169. package/dist/public/assets/{_BT7DMail.js → _Cmtl59QM.js} +1 -1
  170. package/dist/public/assets/_Cmtl59QM.js.br +0 -0
  171. package/dist/public/assets/_CshYq_Dp.js +1 -0
  172. package/dist/public/assets/{_Dj5RDA5P.js → _CspPbDoP.js} +1 -1
  173. package/dist/public/assets/_CspPbDoP.js.br +0 -0
  174. package/dist/public/assets/{_Ca2DTddL.js → _Ctjz3BD9.js} +1 -1
  175. package/dist/public/assets/_Ctjz3BD9.js.br +0 -0
  176. package/dist/public/assets/{_C5c3o9N3.js → _CuglAToi.js} +1 -1
  177. package/dist/public/assets/_CuglAToi.js.br +0 -0
  178. package/dist/public/assets/_CwSoAVRN.js +1 -0
  179. package/dist/public/assets/_D0XQV-Hm.js +1 -0
  180. package/dist/public/assets/{_D_GeNCls.js → _D36PnqCD.js} +1 -1
  181. package/dist/public/assets/_D36PnqCD.js.br +0 -0
  182. package/dist/public/assets/{_DYqx8g78.js → _D3IviZbJ.js} +1 -1
  183. package/dist/public/assets/_D3IviZbJ.js.br +0 -0
  184. package/dist/public/assets/_D6rgUB9O.js +1 -0
  185. package/dist/public/assets/{_Dwe1TUjY.js → _D7qWWxdI.js} +1 -1
  186. package/dist/public/assets/_D7qWWxdI.js.br +0 -0
  187. package/dist/public/assets/{_CPbClwhX.js → _D8ac72_O.js} +1 -1
  188. package/dist/public/assets/_D8ac72_O.js.br +0 -0
  189. package/dist/public/assets/_D9WWxrQR.js +1 -0
  190. package/dist/public/assets/_D9hI5dSA.js +1 -0
  191. package/dist/public/assets/{_DzlXwaiG.js → _DCrPsldZ.js} +1 -1
  192. package/dist/public/assets/_DCrPsldZ.js.br +0 -0
  193. package/dist/public/assets/{_ChPy2IX4.js → _DDcVFyaQ.js} +1 -1
  194. package/dist/public/assets/_DDcVFyaQ.js.br +0 -0
  195. package/dist/public/assets/_DDhkKo8Q.js +1 -0
  196. package/dist/public/assets/{_CY_Z-kV5.js → _DJBR8Qwq.js} +1 -1
  197. package/dist/public/assets/_DJBR8Qwq.js.br +0 -0
  198. package/dist/public/assets/{_CxHuLHdz.js → _DLpa6VYT.js} +1 -1
  199. package/dist/public/assets/_DMqe6rR-.js +1 -0
  200. package/dist/public/assets/{_DbLQjG4R.js → _DN7pTn2g.js} +1 -1
  201. package/dist/public/assets/_DN7pTn2g.js.br +0 -0
  202. package/dist/public/assets/_DP8UuFuJ.js +1 -0
  203. package/dist/public/assets/_DQedUaqM.js +1 -0
  204. package/dist/public/assets/{_DPiemRX1.js → _DSCqWPO0.js} +1 -1
  205. package/dist/public/assets/_DSCqWPO0.js.br +0 -0
  206. package/dist/public/assets/{_BoEcMQmX.js → _DSeQngGR.js} +1 -1
  207. package/dist/public/assets/_DSeQngGR.js.br +0 -0
  208. package/dist/public/assets/{_D-0pUYXq.js → _DTNiWZFr.js} +1 -1
  209. package/dist/public/assets/_DTNiWZFr.js.br +0 -0
  210. package/dist/public/assets/_DThlusXY.js +1 -0
  211. package/dist/public/assets/_DUK16H19.js +1 -0
  212. package/dist/public/assets/_DUZ13t3U.js +1 -0
  213. package/dist/public/assets/{_BHgwN0LC.js → _DWb03VKf.js} +1 -1
  214. package/dist/public/assets/_DWb03VKf.js.br +0 -0
  215. package/dist/public/assets/_DWsyhfgn.js +1 -0
  216. package/dist/public/assets/_DXuzYhW6.js +1 -0
  217. package/dist/public/assets/_DXyOzA2b.js +1 -0
  218. package/dist/public/assets/{_BXcMBVCY.js → _DYUFCi44.js} +1 -1
  219. package/dist/public/assets/_DYUFCi44.js.br +0 -0
  220. package/dist/public/assets/{_BwSXxzqy.js → _DYhs8iJg.js} +12 -12
  221. package/dist/public/assets/_DYhs8iJg.js.br +0 -0
  222. package/dist/public/assets/{_Dhn3A3KJ.js → _D__ojGam.js} +1 -1
  223. package/dist/public/assets/_D__ojGam.js.br +0 -0
  224. package/dist/public/assets/_DaFI_W5D.js +1 -0
  225. package/dist/public/assets/{_BiY8chB-.js → _DbT6uo7W.js} +1 -1
  226. package/dist/public/assets/_DbT6uo7W.js.br +0 -0
  227. package/dist/public/assets/_DhnT0cCE.js +1 -0
  228. package/dist/public/assets/_Dm9OGn2q.js +1 -0
  229. package/dist/public/assets/_DmkeGFoM.js +1 -0
  230. package/dist/public/assets/{_DVLNzEkW.js → _DmoI4cIl.js} +1 -1
  231. package/dist/public/assets/_DmoI4cIl.js.br +0 -0
  232. package/dist/public/assets/{_zcAaK79d.js → _DpbHp8yR.js} +1 -1
  233. package/dist/public/assets/_DpbHp8yR.js.br +0 -0
  234. package/dist/public/assets/_Dqz_HBE1.js +1 -0
  235. package/dist/public/assets/{_DOKecL0e.js → _DsehEuMD.js} +1 -1
  236. package/dist/public/assets/_DsehEuMD.js.br +0 -0
  237. package/dist/public/assets/{_D-pUpBL1.js → _Dtx52FYB.js} +1 -1
  238. package/dist/public/assets/_DuEyirL6.js +1 -0
  239. package/dist/public/assets/_DuuloSIi.js +1 -0
  240. package/dist/public/assets/{_Ch-UiovX.js → _DuyCZnNC.js} +1 -1
  241. package/dist/public/assets/_DuyCZnNC.js.br +0 -0
  242. package/dist/public/assets/{_BQEpu56f.js → _Dw1P6xZJ.js} +1 -1
  243. package/dist/public/assets/_Dw1P6xZJ.js.br +0 -0
  244. package/dist/public/assets/{_C-lB_p3U.js → _DzNFlI0M.js} +1 -1
  245. package/dist/public/assets/_DzNFlI0M.js.br +0 -0
  246. package/dist/public/assets/{_CYQ4srZb.js → _EcMqP1xI.js} +1 -1
  247. package/dist/public/assets/_EcMqP1xI.js.br +0 -0
  248. package/dist/public/assets/{_0KruTMn9.js → _G1BLeMns.js} +1 -1
  249. package/dist/public/assets/_G1BLeMns.js.br +0 -0
  250. package/dist/public/assets/{_FwFz43m8.js → _G8KNSVdM.js} +1 -1
  251. package/dist/public/assets/_G8KNSVdM.js.br +0 -0
  252. package/dist/public/assets/{_3fvr5bU1.js → _J1v2clxU.js} +1 -1
  253. package/dist/public/assets/_J1v2clxU.js.br +0 -0
  254. package/dist/public/assets/{_Depr5Jps.js → _J3wdy6bJ.js} +1 -1
  255. package/dist/public/assets/_J3wdy6bJ.js.br +0 -0
  256. package/dist/public/assets/{_-ycNE92Z.js → _MHZgY1AQ.js} +1 -1
  257. package/dist/public/assets/_MHZgY1AQ.js.br +0 -0
  258. package/dist/public/assets/_NHTZitq1.js +2 -0
  259. package/dist/public/assets/_NHTZitq1.js.br +0 -0
  260. package/dist/public/assets/{_Cw-dmwPJ.js → _PsuNqRL9.js} +20 -20
  261. package/dist/public/assets/_PsuNqRL9.js.br +0 -0
  262. package/dist/public/assets/{_CXVkXsw1.js → _T5HFHZgl.js} +1 -1
  263. package/dist/public/assets/_T5HFHZgl.js.br +0 -0
  264. package/dist/public/assets/{_4_sKOYsy.js → _UZAFx6D8.js} +1 -1
  265. package/dist/public/assets/_UZAFx6D8.js.br +0 -0
  266. package/dist/public/assets/_XA8_RQXF.js +1 -0
  267. package/dist/public/assets/{_BTh4v5Tr.js → _XsB9KmcW.js} +1 -1
  268. package/dist/public/assets/_XsB9KmcW.js.br +0 -0
  269. package/dist/public/assets/{_i4iteLF8.js → _YoXk_8Bl.js} +1 -1
  270. package/dist/public/assets/_YoXk_8Bl.js.br +0 -0
  271. package/dist/public/assets/_YubCdy3Z.js +1 -0
  272. package/dist/public/assets/{_Q5s6o5H4.js → _bDI-pCZR.js} +1 -1
  273. package/dist/public/assets/_bDI-pCZR.js.br +0 -0
  274. package/dist/public/assets/{_TynjiShF.js → _bHL-NcWS.js} +1 -1
  275. package/dist/public/assets/_bHL-NcWS.js.br +0 -0
  276. package/dist/public/assets/_bqRzDYc8.js +1 -0
  277. package/dist/public/assets/{_OpbuiQ7h.js → _briyaWgK.js} +1 -1
  278. package/dist/public/assets/_briyaWgK.js.br +0 -0
  279. package/dist/public/assets/{_pEUCjhqm.js → _dVHSDgPC.js} +1 -1
  280. package/dist/public/assets/_dVHSDgPC.js.br +0 -0
  281. package/dist/public/assets/_gkZjZ9I4.js +1 -0
  282. package/dist/public/assets/_plyCYAnN.js +1 -0
  283. package/dist/public/assets/_q0Z44mWJ.js +1 -0
  284. package/dist/public/assets/_q0Z44mWJ.js.br +0 -0
  285. package/dist/public/assets/{_BPNSknLT.js → _qAsGEOt5.js} +1 -1
  286. package/dist/public/assets/_qAsGEOt5.js.br +0 -0
  287. package/dist/public/assets/{_Dks8YY2K.js → _qxffRpjc.js} +1 -1
  288. package/dist/public/assets/{_BOBYB-cj.js → _uCKs5N6Q.js} +1 -1
  289. package/dist/public/assets/_uCKs5N6Q.js.br +0 -0
  290. package/dist/public/assets/_utWnC80Q.js +1 -0
  291. package/dist/public/assets/_utvzcBHT.js +1 -0
  292. package/dist/public/assets/_v8WbCPI8.js +1 -0
  293. package/dist/public/assets/_yK4b_Bl5.js +1 -0
  294. package/dist/public/assets/_yoQW4BY5.js +1 -0
  295. package/dist/public/assets/_zB6USXHX.js +1 -0
  296. package/dist/public/assets/{_Quh6tl1u.js → _zN8SypHW.js} +1 -1
  297. package/dist/public/assets/_zN8SypHW.js.br +0 -0
  298. package/dist/public/assets/files-view-Fl0rU3Ns.js +2 -0
  299. package/dist/public/assets/manage-workspace-DggRcsXf.js +2 -0
  300. package/dist/public/assets/new-C7NxTJAT.js +1 -0
  301. package/dist/public/assets/new-workspace-C0pw5Iz1.js +2 -0
  302. package/dist/public/assets/review-view-C4YQ0J-X.js +2 -0
  303. package/dist/public/assets/settings-C7NxTJAT.js +1 -0
  304. package/dist/public/assets/settings-page-Cl_1tWCv.js +2 -0
  305. package/dist/public/assets/styles-Vcsj4CA7.css +1 -0
  306. package/dist/public/assets/styles-Vcsj4CA7.css.br +0 -0
  307. package/dist/public/assets/w-C7NxTJAT.js +1 -0
  308. package/dist/public/assets/w._-BbFH2lR-.js +1 -0
  309. package/dist/public/assets/w._-C7NxTJAT.js +1 -0
  310. package/dist/public/assets/w._-YIzLOiyZ.js +1 -0
  311. package/dist/public/sw.js +11 -4
  312. package/dist/public/sw.js.br +0 -0
  313. package/lib/ports/url.d.mts +20 -0
  314. package/lib/ports/url.mjs +80 -0
  315. package/lib/preview/media.d.mts +1 -1
  316. package/lib/preview/media.mjs +15 -2
  317. package/package.json +1 -1
  318. package/dist/_CLoLdV87.js +0 -2
  319. package/dist/_DPpY3UqO.js +0 -167
  320. package/dist/public/assets/_-ycNE92Z.js.br +0 -0
  321. package/dist/public/assets/_0KruTMn9.js.br +0 -0
  322. package/dist/public/assets/_0NH5yJMx.js +0 -1
  323. package/dist/public/assets/_1CAp-NbR.js +0 -1
  324. package/dist/public/assets/_3fvr5bU1.js.br +0 -0
  325. package/dist/public/assets/_4Dkmi0BI.js +0 -1
  326. package/dist/public/assets/_4_sKOYsy.js.br +0 -0
  327. package/dist/public/assets/_6klEiBhY.js.br +0 -0
  328. package/dist/public/assets/_7_64OpLh.js +0 -1
  329. package/dist/public/assets/_7p-zxUs0.js +0 -1
  330. package/dist/public/assets/_8RAv3gFP.js +0 -1
  331. package/dist/public/assets/_9PDxaMA9.js +0 -1
  332. package/dist/public/assets/_9PDxaMA9.js.br +0 -0
  333. package/dist/public/assets/_9mbDrbe7.js +0 -1
  334. package/dist/public/assets/_A-jpjc8j.js.br +0 -0
  335. package/dist/public/assets/_B0JwTeu6.js +0 -1
  336. package/dist/public/assets/_B19mS3yM.js.br +0 -0
  337. package/dist/public/assets/_B1Sfrnda.js +0 -1
  338. package/dist/public/assets/_B3i0wS_I.js +0 -1
  339. package/dist/public/assets/_B5JxE4Sx.js.br +0 -0
  340. package/dist/public/assets/_B9RLcC8I.js +0 -1
  341. package/dist/public/assets/_BCB8LQS3.js.br +0 -0
  342. package/dist/public/assets/_BE7UYyYb.js +0 -1
  343. package/dist/public/assets/_BHgwN0LC.js.br +0 -0
  344. package/dist/public/assets/_BHyWcuOR.js.br +0 -0
  345. package/dist/public/assets/_BIpUDgQH.js +0 -16
  346. package/dist/public/assets/_BIpUDgQH.js.br +0 -0
  347. package/dist/public/assets/_BMlgaRlM.js +0 -1
  348. package/dist/public/assets/_BOBYB-cj.js.br +0 -0
  349. package/dist/public/assets/_BPNSknLT.js.br +0 -0
  350. package/dist/public/assets/_BQEpu56f.js.br +0 -0
  351. package/dist/public/assets/_BT7DMail.js.br +0 -0
  352. package/dist/public/assets/_BTJHQNIz.js +0 -1
  353. package/dist/public/assets/_BTWfPOi-.js.br +0 -0
  354. package/dist/public/assets/_BTh4v5Tr.js.br +0 -0
  355. package/dist/public/assets/_BUW_V5kN.js.br +0 -0
  356. package/dist/public/assets/_BXcMBVCY.js.br +0 -0
  357. package/dist/public/assets/_B_MtJKnj.js +0 -1
  358. package/dist/public/assets/_Bay3D1io.js +0 -1
  359. package/dist/public/assets/_BfQeZPXW.js.br +0 -0
  360. package/dist/public/assets/_BgKjJWz_.js +0 -1
  361. package/dist/public/assets/_BiY8chB-.js.br +0 -0
  362. package/dist/public/assets/_Bk5THQZb.js +0 -1
  363. package/dist/public/assets/_BmeQRnXS.js +0 -1
  364. package/dist/public/assets/_BoEcMQmX.js.br +0 -0
  365. package/dist/public/assets/_BoTzWlXR.js.br +0 -0
  366. package/dist/public/assets/_BqWlTTxo.js.br +0 -0
  367. package/dist/public/assets/_BuMTHEPk.js.br +0 -0
  368. package/dist/public/assets/_BubhcEjq.js +0 -1
  369. package/dist/public/assets/_BwSXxzqy.js.br +0 -0
  370. package/dist/public/assets/_BxS3xvmE.js.br +0 -0
  371. package/dist/public/assets/_ByvA6zJz.js +0 -1
  372. package/dist/public/assets/_Bz2Sejcy.js +0 -1
  373. package/dist/public/assets/_C-lB_p3U.js.br +0 -0
  374. package/dist/public/assets/_C1-Nli75.js.br +0 -0
  375. package/dist/public/assets/_C3mw4T_r.js +0 -1
  376. package/dist/public/assets/_C449plW0.js.br +0 -0
  377. package/dist/public/assets/_C5c3o9N3.js.br +0 -0
  378. package/dist/public/assets/_C7bHTlG1.js.br +0 -0
  379. package/dist/public/assets/_C8mt6nRC.js +0 -1
  380. package/dist/public/assets/_C9jR1P3s.js.br +0 -0
  381. package/dist/public/assets/_CCONYsJT.js.br +0 -0
  382. package/dist/public/assets/_CCZAROAW.js +0 -1
  383. package/dist/public/assets/_CCZAROAW.js.br +0 -0
  384. package/dist/public/assets/_CG3s9pE5.js +0 -1
  385. package/dist/public/assets/_CIWiehYG.js.br +0 -0
  386. package/dist/public/assets/_CIrZGxEf.js.br +0 -0
  387. package/dist/public/assets/_CIurl9jC.js +0 -1
  388. package/dist/public/assets/_CJgqLdsx.js.br +0 -0
  389. package/dist/public/assets/_CMbVHIgP.js +0 -1
  390. package/dist/public/assets/_CNUs2Gqk.js.br +0 -0
  391. package/dist/public/assets/_CPbClwhX.js.br +0 -0
  392. package/dist/public/assets/_CQUlxerJ.js +0 -1
  393. package/dist/public/assets/_CTDYlYHi.js +0 -1
  394. package/dist/public/assets/_CXVkXsw1.js.br +0 -0
  395. package/dist/public/assets/_CY5EBxZ6.js +0 -1
  396. package/dist/public/assets/_CYQ4srZb.js.br +0 -0
  397. package/dist/public/assets/_CY_Z-kV5.js.br +0 -0
  398. package/dist/public/assets/_CYhJ6ae-.js.br +0 -0
  399. package/dist/public/assets/_CZbVK94d.js +0 -1
  400. package/dist/public/assets/_C_A97h_2.js +0 -1
  401. package/dist/public/assets/_C_A97h_2.js.br +0 -0
  402. package/dist/public/assets/_C_Y5Dwzy.js +0 -1
  403. package/dist/public/assets/_Ca2DTddL.js.br +0 -0
  404. package/dist/public/assets/_Cc2nu3_5.js +0 -1
  405. package/dist/public/assets/_Cc_GUPR4.js.br +0 -0
  406. package/dist/public/assets/_CgFUs0bE.js +0 -1
  407. package/dist/public/assets/_Ch-UiovX.js.br +0 -0
  408. package/dist/public/assets/_ChDp0-FJ.js +0 -1
  409. package/dist/public/assets/_ChPy2IX4.js.br +0 -0
  410. package/dist/public/assets/_Chsgo2e1.js +0 -1
  411. package/dist/public/assets/_CjECwrWB.js +0 -1
  412. package/dist/public/assets/_CmW74dH7.js +0 -1
  413. package/dist/public/assets/_CmhAUlqu.js +0 -1
  414. package/dist/public/assets/_CrlNjDih.js.br +0 -0
  415. package/dist/public/assets/_CvzTEaQq.js +0 -1
  416. package/dist/public/assets/_Cw-dmwPJ.js.br +0 -0
  417. package/dist/public/assets/_Cwtn28hL.js.br +0 -0
  418. package/dist/public/assets/_CxgPm_xy.js.br +0 -0
  419. package/dist/public/assets/_D-0pUYXq.js.br +0 -0
  420. package/dist/public/assets/_D-rV-z_T.js +0 -1
  421. package/dist/public/assets/_D4CkNo0r.js.br +0 -0
  422. package/dist/public/assets/_D4fP_viq.js +0 -1
  423. package/dist/public/assets/_D570Sd6p.js +0 -1
  424. package/dist/public/assets/_D6Gudpw8.js +0 -1
  425. package/dist/public/assets/_D8ZTP1ck.js +0 -1
  426. package/dist/public/assets/_D8uBvHXU.js.br +0 -0
  427. package/dist/public/assets/_D8xGEGlm.js +0 -1
  428. package/dist/public/assets/_D9GZHKow.js +0 -1
  429. package/dist/public/assets/_DE0eZjad.js +0 -1
  430. package/dist/public/assets/_DElIEG9n.js +0 -1
  431. package/dist/public/assets/_DF0n9xzn.js +0 -2
  432. package/dist/public/assets/_DF0n9xzn.js.br +0 -0
  433. package/dist/public/assets/_DFX_tXcw.js +0 -1
  434. package/dist/public/assets/_DJ2gfhU_.js +0 -1
  435. package/dist/public/assets/_DK-MOyi_.js.br +0 -0
  436. package/dist/public/assets/_DOKecL0e.js.br +0 -0
  437. package/dist/public/assets/_DPXXIOLX.js +0 -1
  438. package/dist/public/assets/_DPb3t58B.js +0 -1
  439. package/dist/public/assets/_DPiemRX1.js.br +0 -0
  440. package/dist/public/assets/_DPpbgqBC.js +0 -1
  441. package/dist/public/assets/_DRVSLjxA.js +0 -1
  442. package/dist/public/assets/_DTHWnu6M.js +0 -1
  443. package/dist/public/assets/_DUdEYxV0.js.br +0 -0
  444. package/dist/public/assets/_DVLNzEkW.js.br +0 -0
  445. package/dist/public/assets/_DWpx2Uof.js +0 -1
  446. package/dist/public/assets/_DXYEUAmC.js +0 -1
  447. package/dist/public/assets/_DYTVambU.js +0 -1
  448. package/dist/public/assets/_DYqx8g78.js.br +0 -0
  449. package/dist/public/assets/_DZanHI_X.js +0 -1
  450. package/dist/public/assets/_DZanHI_X.js.br +0 -0
  451. package/dist/public/assets/_D_GeNCls.js.br +0 -0
  452. package/dist/public/assets/_DbLQjG4R.js.br +0 -0
  453. package/dist/public/assets/_DbmusecK.js +0 -1
  454. package/dist/public/assets/_DbmusecK.js.br +0 -0
  455. package/dist/public/assets/_DemN-D5U.js +0 -1
  456. package/dist/public/assets/_Depr5Jps.js.br +0 -0
  457. package/dist/public/assets/_DhJfHI4f.js +0 -1
  458. package/dist/public/assets/_Dhn3A3KJ.js.br +0 -0
  459. package/dist/public/assets/_Di78jTI-.js.br +0 -0
  460. package/dist/public/assets/_DiBTtPlu.js +0 -1
  461. package/dist/public/assets/_Dj5RDA5P.js.br +0 -0
  462. package/dist/public/assets/_DkjKARSS.js +0 -1
  463. package/dist/public/assets/_Do6b-nfX.js.br +0 -0
  464. package/dist/public/assets/_DorQTaAa.js.br +0 -0
  465. package/dist/public/assets/_DpxVmwni.js +0 -1
  466. package/dist/public/assets/_DqGOYRpi.js.br +0 -0
  467. package/dist/public/assets/_DsbxQ1i8.js +0 -1
  468. package/dist/public/assets/_Dt_P7K1V.js +0 -6
  469. package/dist/public/assets/_Dt_P7K1V.js.br +0 -0
  470. package/dist/public/assets/_Dwe1TUjY.js.br +0 -0
  471. package/dist/public/assets/_DyROQKS8.js +0 -1
  472. package/dist/public/assets/_DzEUPsq0.js +0 -1
  473. package/dist/public/assets/_DzlXwaiG.js.br +0 -0
  474. package/dist/public/assets/_FwFz43m8.js.br +0 -0
  475. package/dist/public/assets/_OpbuiQ7h.js.br +0 -0
  476. package/dist/public/assets/_Q5s6o5H4.js.br +0 -0
  477. package/dist/public/assets/_Quh6tl1u.js.br +0 -0
  478. package/dist/public/assets/_Rh99sjDe.js +0 -1
  479. package/dist/public/assets/_SEE1XtID.js +0 -1
  480. package/dist/public/assets/_SZjr1kid.js +0 -1
  481. package/dist/public/assets/_T7rMqM5P.js +0 -1
  482. package/dist/public/assets/_TynjiShF.js.br +0 -0
  483. package/dist/public/assets/_UENAEFcY.js +0 -1
  484. package/dist/public/assets/_UwTOb1gP.js +0 -1
  485. package/dist/public/assets/_WrxtT1Ok.js +0 -1
  486. package/dist/public/assets/_WrxtT1Ok.js.br +0 -0
  487. package/dist/public/assets/_bcvRRCkB.js +0 -1
  488. package/dist/public/assets/_cyorvuL1.js.br +0 -0
  489. package/dist/public/assets/_gi--JOq8.js +0 -1
  490. package/dist/public/assets/_i4iteLF8.js.br +0 -0
  491. package/dist/public/assets/_i7vMugBN.js +0 -1
  492. package/dist/public/assets/_j7jPRUEQ.js +0 -2
  493. package/dist/public/assets/_j7jPRUEQ.js.br +0 -0
  494. package/dist/public/assets/_pEUCjhqm.js.br +0 -0
  495. package/dist/public/assets/_qkJuNTl-.js +0 -1
  496. package/dist/public/assets/_uuZJDLIV.js +0 -1
  497. package/dist/public/assets/_v3HPnNBs.js.br +0 -0
  498. package/dist/public/assets/_vX9d6g5Y.js.br +0 -0
  499. package/dist/public/assets/_vhysM7gk.js +0 -1
  500. package/dist/public/assets/_vjwPQHk_.js +0 -1
  501. package/dist/public/assets/_yp48NYOW.js.br +0 -0
  502. package/dist/public/assets/_zcAaK79d.js.br +0 -0
  503. package/dist/public/assets/_zwPrEKxN.js +0 -1
  504. package/dist/public/assets/_zwPrEKxN.js.br +0 -0
  505. package/dist/public/assets/files-view-CzRAql9-.js +0 -2
  506. package/dist/public/assets/manage-workspace-C-c1R4pP.js +0 -2
  507. package/dist/public/assets/new-DWfNwssk.js +0 -1
  508. package/dist/public/assets/new-workspace-B8XAfkIH.js +0 -2
  509. package/dist/public/assets/review-view-DivHZNBf.js +0 -2
  510. package/dist/public/assets/settings-DWfNwssk.js +0 -1
  511. package/dist/public/assets/settings-page-BN9Hj1ui.js +0 -2
  512. package/dist/public/assets/styles-NmwxQh5L.css +0 -1
  513. package/dist/public/assets/styles-NmwxQh5L.css.br +0 -0
  514. package/dist/public/assets/w-DWfNwssk.js +0 -1
  515. package/dist/public/assets/w._-C9dj1aZ0.js +0 -1
  516. package/dist/public/assets/w._-D7_D4HlM.js +0 -1
  517. package/dist/public/assets/w._-DWfNwssk.js +0 -1
@@ -0,0 +1,296 @@
1
+ // `work session`: which session this is (an agent's own pane, by
2
+ // WORK_SESSION_ID), its name in the session list, and the workspace's
3
+ // other sessions — starting one, messaging it and waiting on its reply,
4
+ // closing it (server/messages.ts).
5
+
6
+ /** More sessions than this in one workspace is an agent starting them in
7
+ * a loop, not a plan: past it, `new` wants --force. */
8
+ const SESSION_CAP = 8;
9
+
10
+ /** The session a command means: --session's, else this pane's own. */
11
+ function sessionId(ctx) {
12
+ const id = ctx.flag("--session") || process.env.WORK_SESSION_ID;
13
+ if (!id)
14
+ ctx.die(
15
+ "not in a work session (WORK_SESSION_ID is unset): pass --session <id>",
16
+ );
17
+ return id;
18
+ }
19
+
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). */
28
+ async function sessionsOf(ctx, wsId) {
29
+ const me = process.env.WORK_SESSION_ID;
30
+ const list = await ctx.api.get(`/api/workspaces/${wsId}/sessions`);
31
+ const rows = list.map((s) => ({
32
+ id: s.id,
33
+ agent: s.agent,
34
+ title: s.title || null,
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,
39
+ self: s.id === me,
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;
51
+ }
52
+
53
+ function sessionLine(ctx, s) {
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`);
98
+ }
99
+
100
+ export const commands = [
101
+ {
102
+ name: "session",
103
+ summary: "this session and the workspace's others: title, new, send, kill",
104
+ help: `work session [--json]
105
+ This session (WORK_SESSION_ID): its id, agent, name, state, and the
106
+ workspace it is in (id, name, path) — what a link names (/w/<id>/…).
107
+ work session list [id|name] [--json]
108
+ The workspace's sessions, this one marked.
109
+ work session title "<name>" [--session <id>]
110
+ Name a session in the session list (empty clears it).
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).
128
+ work session kill <id> --yes
129
+ Close a session and the process in it (whoever waits on its reply is
130
+ told).`,
131
+ async run(ctx) {
132
+ const [verb, ...rest] = ctx.parse([
133
+ "--agent",
134
+ "--title",
135
+ "--prompt",
136
+ "--workspace",
137
+ "--session",
138
+ "--timeout",
139
+ ]);
140
+ switch (verb) {
141
+ case undefined: {
142
+ const id = sessionId(ctx);
143
+ const { ws } = await ctx.resolveWorkspace();
144
+ const me = (await sessionsOf(ctx, ws.id)).find((s) => s.id === id);
145
+ if (!me) ctx.die(`no session ${id} in ${ws.name}`);
146
+ const out = {
147
+ ...me,
148
+ depth: undefined,
149
+ workspace: {
150
+ id: ws.id,
151
+ name: ws.name,
152
+ path: ws.path,
153
+ branch: ws.branch,
154
+ },
155
+ };
156
+ return ctx.out(out, (s) => {
157
+ console.log(
158
+ `${s.id} ${s.agent} ${s.phase}${s.title ? ` "${s.title}"` : ""}${s.waitingOn.length ? ` (waiting on ${s.waitingOn.join(", ")})` : ""}`,
159
+ );
160
+ console.log(
161
+ `workspace ${s.workspace.name} (${s.workspace.id}) ${s.workspace.path}`,
162
+ );
163
+ });
164
+ }
165
+ case "list": {
166
+ const { ws } = await ctx.resolveWorkspace(rest[0]);
167
+ const list = await sessionsOf(ctx, ws.id);
168
+ return ctx.out(list, (l) => {
169
+ if (!l.length) return console.log("no sessions");
170
+ for (const s of l) console.log(sessionLine(ctx, s));
171
+ });
172
+ }
173
+ case "title": {
174
+ const id = sessionId(ctx);
175
+ const title = rest.join(" ");
176
+ await ctx.api.patch(`/api/sessions/${id}`, { title });
177
+ return ctx.out({ id, title: title || null }, () =>
178
+ console.log(
179
+ title ? `named ${id} "${title}"` : `cleared ${id}'s name`,
180
+ ),
181
+ );
182
+ }
183
+ case "new": {
184
+ const { ws } = await ctx.resolveWorkspace(ctx.flag("--workspace"));
185
+ const existing = await sessionsOf(ctx, ws.id);
186
+ if (existing.length >= SESSION_CAP && !ctx.has("--force"))
187
+ ctx.die(
188
+ `${ws.name} already has ${existing.length} sessions: pass --force to start another`,
189
+ );
190
+ const agent = ctx.flag("--agent");
191
+ const me = process.env.WORK_SESSION_ID;
192
+ const prompt = await textOf(valueOf(ctx, "--prompt"));
193
+ const created = await ctx.api.post(
194
+ `/api/workspaces/${ws.id}/sessions`,
195
+ { ...(agent ? { agent } : {}), ...(me ? { parent: me } : {}) },
196
+ );
197
+ const title = ctx.flag("--title");
198
+ if (title)
199
+ await ctx.api.patch(`/api/sessions/${created.id}`, { title });
200
+ // Sent, the session starts (detached) with it as its first
201
+ // prompt; otherwise it starts when someone opens it.
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;
209
+ const out = {
210
+ id: created.id,
211
+ agent: created.agent,
212
+ title: title || null,
213
+ workspace: ws.id,
214
+ parent: created.parent_id ?? null,
215
+ prompted: !!sent?.delivered,
216
+ queued: sent?.queued ?? null,
217
+ wantsReply: !!sent?.wantsReply,
218
+ href: `/w/${ws.id}?s=${created.id}`,
219
+ };
220
+ return ctx.out(out, (s) => {
221
+ console.log(
222
+ `started ${s.id} (${s.agent})${s.prompted ? " with its prompt" : ""}: [${s.title || s.agent}](${s.href})`,
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
+ });
231
+ }
232
+ case "send": {
233
+ const [id, ...words] = rest;
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;
278
+ }
279
+ case "kill": {
280
+ const [id] = rest;
281
+ if (!id) ctx.die("usage: work session kill <id> --yes");
282
+ if (!ctx.yes)
283
+ ctx.die(
284
+ `closing ${id} ends the process in it${id === process.env.WORK_SESSION_ID ? " — this session, the one running this command" : ""}: pass --yes`,
285
+ );
286
+ await ctx.api.del(`/api/sessions/${id}`);
287
+ return ctx.out({ id, killed: true }, () =>
288
+ console.log(`closed ${id}`),
289
+ );
290
+ }
291
+ default:
292
+ ctx.die(`no \`work session ${verb}\` (see: work help session)`);
293
+ }
294
+ },
295
+ },
296
+ ];
@@ -0,0 +1,99 @@
1
+ // `work skill`: the machine's skills — what every agent CLI here can see —
2
+ // as Settings → Skills lists, adds, updates and removes them.
3
+ import { follow } from "./_progress.mjs";
4
+
5
+ function printList(snap) {
6
+ const rows = snap.global || [];
7
+ if (!snap.available)
8
+ console.log(
9
+ "the skills CLI is not installed, so skills can be listed but not added (work setup installs it)",
10
+ );
11
+ if (!rows.length) return console.log("no skills installed");
12
+ const w = Math.max(4, ...rows.map((s) => s.id.length));
13
+ for (const s of rows) {
14
+ const from = s.source ? ` ${s.source}` : "";
15
+ const broken = s.broken ? " (broken link)" : "";
16
+ console.log(`${s.id.padEnd(w)}${from}${broken}`);
17
+ if (s.description) console.log(`${"".padEnd(w)} ${s.description}`);
18
+ }
19
+ }
20
+
21
+ /** One skill action through the route Settings uses, its progress (the
22
+ * skills CLI's own output) on stderr; the machine's skills after it. */
23
+ function act(ctx, body, op) {
24
+ return follow(ctx, op, () => ctx.api.post("/api/skills", body));
25
+ }
26
+
27
+ /** @type {Array<{name: string, summary: string, help: string, run: (ctx: any) => Promise<void>}>} */
28
+ export const commands = [
29
+ {
30
+ name: "skill",
31
+ summary: "machine skills: list | add | rm | update",
32
+ help: `work skill [list]
33
+ The skills every agent CLI on this machine can see (Settings → Skills):
34
+ each one's id, where it came from, and what it does.
35
+ work skill add <source> [--skill <name>]
36
+ Add skills from a source the skills CLI understands (owner/repo, a git
37
+ URL, a path): every skill it ships, or the one --skill names.
38
+ work skill rm <id>
39
+ Remove an installed skill.
40
+ work skill update [<id>]
41
+ Update one skill from its source, or every skill that has one.`,
42
+ async run(ctx) {
43
+ const [verb = "list", arg] = ctx.parse(["--skill"]);
44
+ if (verb === "list") {
45
+ const snap = await ctx.api.get("/api/skills");
46
+ return ctx.out(snap.global || [], () => printList(snap));
47
+ }
48
+ if (verb === "add") {
49
+ if (!arg) ctx.die("name the source: work skill add <owner/repo|url>");
50
+ const skill = ctx.args.includes("--skill")
51
+ ? ctx.flag("--skill")
52
+ : undefined;
53
+ const snap = await act(
54
+ ctx,
55
+ { action: "add", source: arg, skill },
56
+ `skills:${skill ? `${arg}#${skill}` : arg}`,
57
+ );
58
+ return ctx.out(snap.global || [], () =>
59
+ console.log(
60
+ `added ${skill ?? "the skills of"} ${skill ? "from " : ""}${arg}`,
61
+ ),
62
+ );
63
+ }
64
+ if (verb === "rm" || verb === "remove") {
65
+ if (!arg) ctx.die("name the skill: work skill rm <id>");
66
+ const snap = await act(
67
+ ctx,
68
+ { action: "remove", id: arg },
69
+ `skills:${arg}`,
70
+ );
71
+ return ctx.out(snap.global || [], () => console.log(`removed ${arg}`));
72
+ }
73
+ if (verb === "update") {
74
+ let ids = arg ? [arg] : [];
75
+ if (!arg) {
76
+ const snap = await ctx.api.get("/api/skills");
77
+ ids = (snap.global || [])
78
+ .filter((s) => s.source && s.source !== "local")
79
+ .map((s) => s.id);
80
+ if (!ids.length) {
81
+ ctx.out([], () =>
82
+ console.log("no skill has a source to update from"),
83
+ );
84
+ return;
85
+ }
86
+ }
87
+ let snap = null;
88
+ for (const id of ids) {
89
+ process.stderr.write(` updating ${id}\n`);
90
+ snap = await act(ctx, { action: "update", id }, `skills:${id}`);
91
+ }
92
+ return ctx.out(snap?.global || [], () =>
93
+ console.log(`updated ${ids.join(", ")}`),
94
+ );
95
+ }
96
+ ctx.die(`no skill verb ${verb} (list, add, rm, update)`);
97
+ },
98
+ },
99
+ ];
@@ -0,0 +1,51 @@
1
+ // `work stack`: how to stack branches here, with this workspace's branch
2
+ // in place. Kept out of the workspace AGENTS.md, which every session reads
3
+ // whole: stacking is for when the user asks, and the recipe was a quarter
4
+ // of that file.
5
+
6
+ function recipe(branch) {
7
+ return `Stacking ${branch}
8
+
9
+ Stack only when the user asks, or when a change of several hundred lines
10
+ splits into parts each worth merging alone; never a layer per commit.
11
+
12
+ - The working branch (${branch}) stays the top; cut layers below it, bottom
13
+ first, as ${branch}-<layer>:
14
+ gh stack init --base <base> <layers…> ${branch}
15
+ (after \`gh stack unstack --local\` if a stack exists).
16
+ - Never check a layer out. Edit one by \`git commit --fixup <sha>\` on the
17
+ top, then:
18
+ GIT_SEQUENCE_EDITOR=: git rebase -i --autosquash --update-refs origin/<base>
19
+ - \`gh stack sync\` / \`gh stack rebase\` switch branches: run them in topic
20
+ worktrees only. Leave the local <base> gh-stack keeps as trunk.
21
+ - Merge a layer with \`gh stack merge <pr> --squash\` or on the web
22
+ (\`gh pr merge\` refuses it), then, on the top:
23
+ old=$(git rev-parse origin/${branch})
24
+ git fetch
25
+ git branch -f <layer> origin/<layer> # for each remaining layer
26
+ git branch -D <merged-layer>
27
+ git rebase --onto origin/${branch} $old
28
+ - Once the top merges: \`gh stack unstack --local\`.
29
+ - Link a layer for review as [<layer>](/w/<id>/review?section=<repo>@<layer>);
30
+ \`work branches\` lists every layer with its link.`;
31
+ }
32
+
33
+ export const commands = [
34
+ {
35
+ name: "stack",
36
+ summary: "how to stack branches in this workspace (prints the recipe)",
37
+ help: `work stack [id|name]
38
+ Prints how to stack branches with gh-stack here, with the workspace's
39
+ branch filled in: when to, cutting layers, editing one without checking
40
+ it out, merging a layer and rebasing the rest.`,
41
+ async run(ctx) {
42
+ let branch = "<workspace-branch>";
43
+ try {
44
+ if (ctx.positional[0] || process.env.WORK_SESSION_ID) {
45
+ branch = (await ctx.resolveWorkspace(ctx.positional[0])).ws.branch;
46
+ }
47
+ } catch {}
48
+ ctx.out({ branch, recipe: recipe(branch) }, (d) => console.log(d.recipe));
49
+ },
50
+ },
51
+ ];
@@ -0,0 +1,86 @@
1
+ // `work status`: the machine and the service in one look — how the server
2
+ // runs (its own config, not the unit file's), the agents, language servers
3
+ // and skills, what `work doctor` would say is missing, and the settings
4
+ // changed from their defaults. One request each, side by side.
5
+ import { shown } from "./config.mjs";
6
+
7
+ export const commands = [
8
+ {
9
+ name: "status",
10
+ summary: "the service, agents, languages, skills and changed settings",
11
+ help: `work status [--json]
12
+ one snapshot of this machine's work: version, address and names it
13
+ answers to, direct connections, data and work root, agents (installed,
14
+ switched off, the default), language servers, skills, what is missing
15
+ (work doctor), and the settings changed from their defaults`,
16
+ async run(ctx) {
17
+ const [server, settings, agents, lsp, skills, setup] = await Promise.all([
18
+ ctx.api.get("/api/config"),
19
+ ctx.api.get("/api/settings/values"),
20
+ ctx.api.get("/api/settings"),
21
+ ctx.api.get("/api/lsp"),
22
+ ctx.api.get("/api/skills"),
23
+ ctx.api.get("/api/setup"),
24
+ ]);
25
+ const snapshot = {
26
+ version: server.version,
27
+ server,
28
+ agents: {
29
+ default: agents.preferredAgent,
30
+ enabled: agents.agents,
31
+ disabled: agents.disabledAgents,
32
+ installable: (setup.agents || [])
33
+ .filter((a) => !a.installed)
34
+ .map((a) => a.id),
35
+ },
36
+ languages: {
37
+ on: lsp.on,
38
+ installed: lsp.servers.filter((s) => s.installed).map((s) => s.id),
39
+ off: lsp.servers.filter((s) => !s.enabled).map((s) => s.id),
40
+ },
41
+ skills: [...(skills.global || [])].map((s) => s.id ?? s.name ?? s),
42
+ doctor: { ready: setup.ready, missing: setup.missing },
43
+ settings: settings.filter((e) => !e.isDefault),
44
+ };
45
+ ctx.out(snapshot, (s) => {
46
+ const sv = s.server;
47
+ const list = (xs) => (xs.length ? xs.join(", ") : "none");
48
+ const rows = [
49
+ ["work", `${s.version} on ${sv.listen}:${sv.port}`],
50
+ [
51
+ "names",
52
+ sv.allowedHosts.length
53
+ ? `${sv.allowedHosts.join(", ")} (ports as ${sv.portHosts === "dash" ? "<port>-<name>" : "<port>.<name>"})`
54
+ : "this machine's own",
55
+ ],
56
+ ["proxies", list(sv.trustedProxies)],
57
+ ["direct", sv.rtc.on ? `on, UDP ${sv.rtc.port}` : "off"],
58
+ ["root", sv.workRoot],
59
+ ["data", sv.dataDir],
60
+ [
61
+ "agents",
62
+ `${list(s.agents.enabled)}; default ${s.agents.default}${s.agents.disabled.length ? `; off: ${s.agents.disabled.join(", ")}` : ""}`,
63
+ ],
64
+ [
65
+ "languages",
66
+ `${s.languages.on ? "on" : "off"}; installed: ${list(s.languages.installed)}${s.languages.off.length ? `; off: ${s.languages.off.join(", ")}` : ""}`,
67
+ ],
68
+ ["skills", list(s.skills)],
69
+ [
70
+ "machine",
71
+ s.doctor.ready
72
+ ? "ready"
73
+ : `not ready: ${list(s.doctor.missing)} (work doctor)`,
74
+ ],
75
+ [
76
+ "settings",
77
+ s.settings.length
78
+ ? s.settings.map((e) => `${e.key}=${shown(e.value)}`).join(", ")
79
+ : "all at their defaults (work config list)",
80
+ ],
81
+ ];
82
+ for (const [k, v] of rows) console.log(`${ctx.pad(k, 10)} ${v}`);
83
+ });
84
+ },
85
+ },
86
+ ];