svamp-cli 0.1.51 → 0.1.53

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 (319) hide show
  1. package/README.md +193 -0
  2. package/bin/svamp.mjs +16 -7
  3. package/dist/cli.mjs +19 -19
  4. package/dist/{commands-mw8HFkt6.mjs → commands-1tmye7o_.mjs} +3 -2
  5. package/dist/{commands-D1brd9fB.mjs → commands-BJdwoEe6.mjs} +7 -3
  6. package/dist/{commands-DHnFOhQC.mjs → commands-CI_BVphs.mjs} +7 -3
  7. package/dist/{commands-BOYo9cdy.mjs → commands-DcFOU9nW.mjs} +7 -3
  8. package/dist/commands-DwY2B7KW.mjs +562 -0
  9. package/dist/commands-VGt5ofDo.mjs +1755 -0
  10. package/dist/commands-ZuFXrcot.mjs +558 -0
  11. package/dist/index.mjs +1 -1
  12. package/dist/{package-BLDik3NY.mjs → package-D7EUXtnk.mjs} +1 -1
  13. package/dist/{package-BYUO-39f.mjs → package-DbeynOln.mjs} +1 -1
  14. package/dist/{run-6dwQnoBL.mjs → run-BYJX5syg.mjs} +1 -1
  15. package/dist/{run-C0ecvcRP.mjs → run-BnnUavlu.mjs} +131 -44
  16. package/dist/{run-3Et1ISd5.mjs → run-Bw6aGHLA.mjs} +1 -1
  17. package/dist/{run-CE4H8ZiN.mjs → run-CBhm4Jop.mjs} +219 -80
  18. package/dist/{run-BE_AIJ7z.mjs → run-DOwarObi.mjs} +1 -1
  19. package/dist/{run-Bc83CRUn.mjs → run-DxISzP_V.mjs} +38 -7
  20. package/dist/{run-4li60ojK.mjs → run-Y0b60UYS.mjs} +1 -1
  21. package/dist/{run-BdEHYoYE.mjs → run-eYBOEaWw.mjs} +20 -7
  22. package/dist/tunnel-C2_V6y3d.mjs +299 -0
  23. package/dist/tunnel-DhVAOdGd.mjs +299 -0
  24. package/package.json +1 -1
  25. package/dist/commands-4_MiOQVp.mjs +0 -1217
  26. package/dist/commands-8UAWGJrC.mjs +0 -1208
  27. package/dist/commands-8Wmq0uak.mjs +0 -1407
  28. package/dist/commands-8Xn02pQg.mjs +0 -1217
  29. package/dist/commands-9DPsh6ku.mjs +0 -1217
  30. package/dist/commands-9rMB13FP.mjs +0 -1214
  31. package/dist/commands-B-XaqFDB.mjs +0 -1407
  32. package/dist/commands-B53zuBHB.mjs +0 -1217
  33. package/dist/commands-B7yLt11i.mjs +0 -1217
  34. package/dist/commands-BDVAO_N2.mjs +0 -1217
  35. package/dist/commands-BD_NjWJL.mjs +0 -1217
  36. package/dist/commands-BEhSQqTp.mjs +0 -507
  37. package/dist/commands-BIFQZZGw.mjs +0 -1375
  38. package/dist/commands-BImRR1Wr.mjs +0 -1217
  39. package/dist/commands-BLmRIMdf.mjs +0 -1217
  40. package/dist/commands-BQ_347V_.mjs +0 -1374
  41. package/dist/commands-BTEmyf2m.mjs +0 -1407
  42. package/dist/commands-BVjcCbWS.mjs +0 -1375
  43. package/dist/commands-BVsLRttq.mjs +0 -1217
  44. package/dist/commands-BVuE0VQU.mjs +0 -507
  45. package/dist/commands-BY09VTpk.mjs +0 -1375
  46. package/dist/commands-Bcdp0X-o.mjs +0 -1217
  47. package/dist/commands-BdnG1cqQ.mjs +0 -1217
  48. package/dist/commands-BdvvRQIo.mjs +0 -1415
  49. package/dist/commands-Bgg_dvDw.mjs +0 -1683
  50. package/dist/commands-Bi0zYJvj.mjs +0 -1407
  51. package/dist/commands-BmirUCVt.mjs +0 -1208
  52. package/dist/commands-BpSUbvmr.mjs +0 -1217
  53. package/dist/commands-BuJ6xTfc.mjs +0 -1217
  54. package/dist/commands-BzbYPx0f.mjs +0 -1208
  55. package/dist/commands-C-RtFjJl.mjs +0 -1217
  56. package/dist/commands-C20_f6oo.mjs +0 -1217
  57. package/dist/commands-C6KDr9Yp.mjs +0 -1407
  58. package/dist/commands-C9TOoTCv.mjs +0 -1395
  59. package/dist/commands-C9TdN_El.mjs +0 -1683
  60. package/dist/commands-CFv6lO0D.mjs +0 -1217
  61. package/dist/commands-CJ2n5jS2.mjs +0 -1375
  62. package/dist/commands-CKEKQ_5B.mjs +0 -1217
  63. package/dist/commands-CQz67Rm1.mjs +0 -1395
  64. package/dist/commands-CRZbJjqN.mjs +0 -1375
  65. package/dist/commands-CToIvBFX.mjs +0 -1375
  66. package/dist/commands-CWsfciHn.mjs +0 -1217
  67. package/dist/commands-CYMSyqYC.mjs +0 -1395
  68. package/dist/commands-CZ7KPLLJ.mjs +0 -1217
  69. package/dist/commands-Cc73uUnP.mjs +0 -1375
  70. package/dist/commands-CdMsAD1-.mjs +0 -1217
  71. package/dist/commands-CdyCWC3y.mjs +0 -1395
  72. package/dist/commands-ClVCprrK.mjs +0 -1217
  73. package/dist/commands-Cnmf8znA.mjs +0 -1196
  74. package/dist/commands-CorUNLRF.mjs +0 -1375
  75. package/dist/commands-Cq0oj5_v.mjs +0 -1217
  76. package/dist/commands-CrdvbXPI.mjs +0 -1395
  77. package/dist/commands-Cw2Od6mc.mjs +0 -1683
  78. package/dist/commands-CwC2aVzu.mjs +0 -1217
  79. package/dist/commands-CxSCUJCB.mjs +0 -1217
  80. package/dist/commands-D-PTwdZz.mjs +0 -1217
  81. package/dist/commands-D-nIO_Sf.mjs +0 -1741
  82. package/dist/commands-D7-NHH5q.mjs +0 -1407
  83. package/dist/commands-D7kH-7Vn.mjs +0 -1217
  84. package/dist/commands-DBv6A3aJ.mjs +0 -507
  85. package/dist/commands-DD3HXakm.mjs +0 -1217
  86. package/dist/commands-DLoe6FyK.mjs +0 -1375
  87. package/dist/commands-DPbH8KF0.mjs +0 -1217
  88. package/dist/commands-DUAQ9MZM.mjs +0 -1217
  89. package/dist/commands-DVw-P6-0.mjs +0 -1407
  90. package/dist/commands-DVygnMsh.mjs +0 -1217
  91. package/dist/commands-DWira-Cz.mjs +0 -1741
  92. package/dist/commands-DYTdUlul.mjs +0 -1217
  93. package/dist/commands-DZfaDmsk.mjs +0 -1374
  94. package/dist/commands-Dd8cn8mW.mjs +0 -1217
  95. package/dist/commands-DsIoygTL.mjs +0 -1395
  96. package/dist/commands-Du-fdLLu.mjs +0 -969
  97. package/dist/commands-DuJGOq1y.mjs +0 -1217
  98. package/dist/commands-DwBr3sBn.mjs +0 -1217
  99. package/dist/commands-DwveR96q.mjs +0 -1683
  100. package/dist/commands-DypTF36z.mjs +0 -506
  101. package/dist/commands-EUMJqBCs.mjs +0 -1407
  102. package/dist/commands-HLu7P96l.mjs +0 -1214
  103. package/dist/commands-HrBaGV-C.mjs +0 -1683
  104. package/dist/commands-Jk5no-DX.mjs +0 -1407
  105. package/dist/commands-KH5dj9dv.mjs +0 -1214
  106. package/dist/commands-LaNHVHjc.mjs +0 -1217
  107. package/dist/commands-O1Q9g00y.mjs +0 -1395
  108. package/dist/commands-OwMfbBrU.mjs +0 -1395
  109. package/dist/commands-SQ0Wp_kD.mjs +0 -1217
  110. package/dist/commands-S_MFQ9n1.mjs +0 -354
  111. package/dist/commands-T3q8VKCY.mjs +0 -1407
  112. package/dist/commands-Ugz9TtRu.mjs +0 -1420
  113. package/dist/commands-Wng0OuNY.mjs +0 -1683
  114. package/dist/commands-YBW5jFpy.mjs +0 -1217
  115. package/dist/commands-Z-CbuF8E.mjs +0 -1217
  116. package/dist/commands-fSZOP80Z.mjs +0 -1217
  117. package/dist/commands-fqBuJe1b.mjs +0 -1217
  118. package/dist/commands-g-1n3_Rp.mjs +0 -1395
  119. package/dist/commands-mC0oe0lj.mjs +0 -1217
  120. package/dist/commands-od2hOku5.mjs +0 -1217
  121. package/dist/commands-otgzprjb.mjs +0 -1375
  122. package/dist/commands-rhHI6Wb2.mjs +0 -1420
  123. package/dist/commands-zGHnUXh5.mjs +0 -1217
  124. package/dist/package-BMCjXPI9.mjs +0 -58
  125. package/dist/package-BPMWPlS0.mjs +0 -57
  126. package/dist/package-BaGfG8vL.mjs +0 -58
  127. package/dist/package-BkBE6ZdN.mjs +0 -57
  128. package/dist/package-BufekbY1.mjs +0 -57
  129. package/dist/package-C1hpYMj4.mjs +0 -57
  130. package/dist/package-CmIBOZtY.mjs +0 -57
  131. package/dist/package-CmVt1kdw.mjs +0 -58
  132. package/dist/package-Cn6Ya4A0.mjs +0 -57
  133. package/dist/package-Csd530Ym.mjs +0 -57
  134. package/dist/package-D6mNQtUs.mjs +0 -57
  135. package/dist/package-DG0AkZdm.mjs +0 -58
  136. package/dist/package-DRO1LpXW.mjs +0 -58
  137. package/dist/package-Dav8qh6X.mjs +0 -57
  138. package/dist/package-DiA55dzE.mjs +0 -57
  139. package/dist/package-UwLIU765.mjs +0 -58
  140. package/dist/package-k3XsdP9k.mjs +0 -58
  141. package/dist/package-rasGC9_z.mjs +0 -58
  142. package/dist/run-4B1XZQB8.mjs +0 -5426
  143. package/dist/run-4eArMb_9.mjs +0 -1050
  144. package/dist/run-67wfoMuo.mjs +0 -5383
  145. package/dist/run-6N2IdEX7.mjs +0 -5410
  146. package/dist/run-7iQKryzo.mjs +0 -5383
  147. package/dist/run-7s8lOXqB.mjs +0 -1050
  148. package/dist/run-8kKykzTs.mjs +0 -5367
  149. package/dist/run-8mLZV2lg.mjs +0 -1050
  150. package/dist/run-9x7I9Ck-.mjs +0 -5264
  151. package/dist/run-B-PWtXF-.mjs +0 -5894
  152. package/dist/run-B1ivovUl.mjs +0 -5964
  153. package/dist/run-B1l9Ed8k.mjs +0 -5403
  154. package/dist/run-B2zRMxE0.mjs +0 -5508
  155. package/dist/run-B31biy0V.mjs +0 -1050
  156. package/dist/run-B5o5fMMd.mjs +0 -5369
  157. package/dist/run-B7V-xXM7.mjs +0 -5775
  158. package/dist/run-B9ND6srh.mjs +0 -6154
  159. package/dist/run-BG3279Kg.mjs +0 -1051
  160. package/dist/run-BHZNzX1F.mjs +0 -5235
  161. package/dist/run-BKdOv7gX.mjs +0 -1050
  162. package/dist/run-BLySdZ1K.mjs +0 -5251
  163. package/dist/run-BOVkQfM-.mjs +0 -1050
  164. package/dist/run-BQ0lIare.mjs +0 -1050
  165. package/dist/run-BREPr7Yc.mjs +0 -5508
  166. package/dist/run-BTwshVk1.mjs +0 -5728
  167. package/dist/run-BUL3eAqT.mjs +0 -1050
  168. package/dist/run-BVcPemGr.mjs +0 -5947
  169. package/dist/run-BWqEmIiz.mjs +0 -5964
  170. package/dist/run-BWsDPiNe.mjs +0 -1050
  171. package/dist/run-BX4iy6k8.mjs +0 -1050
  172. package/dist/run-BXYfq8mK.mjs +0 -5836
  173. package/dist/run-BY12Ataq.mjs +0 -5732
  174. package/dist/run-BYDOX4yk.mjs +0 -5402
  175. package/dist/run-Bd-t6s63.mjs +0 -5373
  176. package/dist/run-BenYqfwQ.mjs +0 -5273
  177. package/dist/run-BfF4bgA3.mjs +0 -5403
  178. package/dist/run-Bhh05yic.mjs +0 -5369
  179. package/dist/run-BicITYWX.mjs +0 -6138
  180. package/dist/run-BieEN0Pg.mjs +0 -5761
  181. package/dist/run-BjEQi6PN.mjs +0 -1050
  182. package/dist/run-BjZ6SyFy.mjs +0 -1051
  183. package/dist/run-Bl8OkKyC.mjs +0 -5969
  184. package/dist/run-BlEFlhfn.mjs +0 -5510
  185. package/dist/run-BmL1m0Bk.mjs +0 -1050
  186. package/dist/run-Bmx5wEBF.mjs +0 -1051
  187. package/dist/run-BnX5Rw8x.mjs +0 -5403
  188. package/dist/run-BpjmHeht.mjs +0 -1050
  189. package/dist/run-BxTdRjCG.mjs +0 -1051
  190. package/dist/run-ByOVDgvx.mjs +0 -6115
  191. package/dist/run-BzRP6Q5t.mjs +0 -1051
  192. package/dist/run-C0dyMP62.mjs +0 -1051
  193. package/dist/run-C1lS3SwN.mjs +0 -5733
  194. package/dist/run-C3PAp02X.mjs +0 -5252
  195. package/dist/run-C3eaYQub.mjs +0 -1050
  196. package/dist/run-C4pdX4sY.mjs +0 -1051
  197. package/dist/run-C676pHe-.mjs +0 -5423
  198. package/dist/run-C8GkzcfP.mjs +0 -1050
  199. package/dist/run-C9Hrqjy_.mjs +0 -1050
  200. package/dist/run-CC2C8P-U.mjs +0 -6031
  201. package/dist/run-CCcW4asS.mjs +0 -1050
  202. package/dist/run-CDBKhQ1Z.mjs +0 -1051
  203. package/dist/run-CEB6sYzn.mjs +0 -5962
  204. package/dist/run-CF6aXLmA.mjs +0 -5445
  205. package/dist/run-CHyN5U0t.mjs +0 -1050
  206. package/dist/run-CIFezmkC.mjs +0 -5949
  207. package/dist/run-CLA9zw7J.mjs +0 -5907
  208. package/dist/run-COWb9ovq.mjs +0 -1050
  209. package/dist/run-CSUAy5T5.mjs +0 -1051
  210. package/dist/run-CSk7i0Hq.mjs +0 -1050
  211. package/dist/run-CUtqSGWJ.mjs +0 -1050
  212. package/dist/run-CXrEt0TM.mjs +0 -5008
  213. package/dist/run-CY8Y0JPW.mjs +0 -5287
  214. package/dist/run-CZCKBcQ-.mjs +0 -5244
  215. package/dist/run-CZj0sRCs.mjs +0 -1050
  216. package/dist/run-C_1x2cNU.mjs +0 -5381
  217. package/dist/run-C_8iOjO1.mjs +0 -5892
  218. package/dist/run-C_KIew8H.mjs +0 -1051
  219. package/dist/run-CajRcN3C.mjs +0 -1050
  220. package/dist/run-CbzXO7fw.mjs +0 -1050
  221. package/dist/run-CcSr4x2f.mjs +0 -1050
  222. package/dist/run-CcYaXgCy.mjs +0 -6091
  223. package/dist/run-CdihMx0V.mjs +0 -1051
  224. package/dist/run-Cf2Dl_ck.mjs +0 -1051
  225. package/dist/run-CjH1H4vq.mjs +0 -1050
  226. package/dist/run-CkbDK6jA.mjs +0 -1051
  227. package/dist/run-Ckh6JE9F.mjs +0 -1050
  228. package/dist/run-Ckyg9-fm.mjs +0 -6079
  229. package/dist/run-CqL3ZWdr.mjs +0 -5381
  230. package/dist/run-Csj7sJAh.mjs +0 -1050
  231. package/dist/run-Ct--DWF1.mjs +0 -1051
  232. package/dist/run-CtJRxaFC.mjs +0 -1051
  233. package/dist/run-CuIMdkKF.mjs +0 -6099
  234. package/dist/run-CuckJGM-.mjs +0 -1050
  235. package/dist/run-CxGAa9MH.mjs +0 -1050
  236. package/dist/run-CyU4-O-e.mjs +0 -5411
  237. package/dist/run-CymDyu2b.mjs +0 -5389
  238. package/dist/run-CzIY4_RE.mjs +0 -6093
  239. package/dist/run-D0Ha4aWt.mjs +0 -1050
  240. package/dist/run-D0ow-xms.mjs +0 -5905
  241. package/dist/run-D1PFrNZB.mjs +0 -6273
  242. package/dist/run-D2X3jEqg.mjs +0 -1051
  243. package/dist/run-D39C7Ta3.mjs +0 -1050
  244. package/dist/run-D3Lqxasl.mjs +0 -1051
  245. package/dist/run-D3bhRCCb.mjs +0 -1051
  246. package/dist/run-D5N42sVA.mjs +0 -1050
  247. package/dist/run-D691XPXy.mjs +0 -6031
  248. package/dist/run-D7dLDpq3.mjs +0 -5403
  249. package/dist/run-D8mQ_fL5.mjs +0 -1050
  250. package/dist/run-DA-YBjNw.mjs +0 -6018
  251. package/dist/run-DByI8mI0.mjs +0 -1051
  252. package/dist/run-DCINWip4.mjs +0 -1050
  253. package/dist/run-DCrZ3vke.mjs +0 -5406
  254. package/dist/run-DDF-tRbn.mjs +0 -5954
  255. package/dist/run-DGSgljJE.mjs +0 -5421
  256. package/dist/run-DGsXW19O.mjs +0 -5541
  257. package/dist/run-DHrF2xpW.mjs +0 -5776
  258. package/dist/run-DIB0W42M.mjs +0 -1050
  259. package/dist/run-DJ4k0WzZ.mjs +0 -1051
  260. package/dist/run-DMI83W7i.mjs +0 -5434
  261. package/dist/run-DNX3djCI.mjs +0 -1050
  262. package/dist/run-DOPaGRT2.mjs +0 -6027
  263. package/dist/run-DP7KSZqR.mjs +0 -1051
  264. package/dist/run-DQ0yljWr.mjs +0 -1050
  265. package/dist/run-DTkldU6a.mjs +0 -1050
  266. package/dist/run-DU10B3gK.mjs +0 -5728
  267. package/dist/run-DV86VJNG.mjs +0 -5386
  268. package/dist/run-DVZGKdKO.mjs +0 -1050
  269. package/dist/run-DWdtp6VD.mjs +0 -6136
  270. package/dist/run-DWzA1gZ-.mjs +0 -1050
  271. package/dist/run-DXJ2M19k.mjs +0 -1050
  272. package/dist/run-DZOeccNu.mjs +0 -5484
  273. package/dist/run-D_W5YF0D.mjs +0 -6046
  274. package/dist/run-DaReJPf8.mjs +0 -1051
  275. package/dist/run-DaYrEeQ9.mjs +0 -5400
  276. package/dist/run-DbC9-WM4.mjs +0 -1050
  277. package/dist/run-Dd9XkswU.mjs +0 -1051
  278. package/dist/run-De-wkVl3.mjs +0 -5487
  279. package/dist/run-DfU2luyX.mjs +0 -1050
  280. package/dist/run-Dfl3Ze2L.mjs +0 -5541
  281. package/dist/run-DfuHUDIJ.mjs +0 -1051
  282. package/dist/run-DfwfyFqj.mjs +0 -5975
  283. package/dist/run-DgUDGHZy.mjs +0 -1051
  284. package/dist/run-Dge2K7h1.mjs +0 -1050
  285. package/dist/run-Di3I0USw.mjs +0 -1050
  286. package/dist/run-Dm3U4FB5.mjs +0 -6018
  287. package/dist/run-Du0YOs48.mjs +0 -5446
  288. package/dist/run-DuaIQAE4.mjs +0 -5392
  289. package/dist/run-Dwm19YhI.mjs +0 -1050
  290. package/dist/run-DxM7xaBa.mjs +0 -1050
  291. package/dist/run-DysN-cGm.mjs +0 -1050
  292. package/dist/run-DzXohf8-.mjs +0 -1051
  293. package/dist/run-E_MwVOtN.mjs +0 -5272
  294. package/dist/run-FPoL2-FD.mjs +0 -5381
  295. package/dist/run-HU4XjZfs.mjs +0 -6023
  296. package/dist/run-HhiYlJuS.mjs +0 -5414
  297. package/dist/run-JXLlRLFb.mjs +0 -1050
  298. package/dist/run-K-_jahIg.mjs +0 -1051
  299. package/dist/run-K_S7pfZ-.mjs +0 -1050
  300. package/dist/run-LDiT4WF-.mjs +0 -1050
  301. package/dist/run-NToLJWx-.mjs +0 -5442
  302. package/dist/run-RBufRqbs.mjs +0 -1050
  303. package/dist/run-YFYpyThQ.mjs +0 -1051
  304. package/dist/run-YG1Pb9dY.mjs +0 -5385
  305. package/dist/run-ZDa17iLg.mjs +0 -6060
  306. package/dist/run-ZN0qMdS_.mjs +0 -1051
  307. package/dist/run-azpFWM6w.mjs +0 -1050
  308. package/dist/run-coIDvBK_.mjs +0 -6127
  309. package/dist/run-jLp4pbTE.mjs +0 -1050
  310. package/dist/run-m3oAuSg0.mjs +0 -1050
  311. package/dist/run-r9CAcL_U.mjs +0 -5403
  312. package/dist/run-v32uF2bP.mjs +0 -5378
  313. package/dist/run-vTsskoZc.mjs +0 -5340
  314. package/dist/run-vt26p5D7.mjs +0 -1050
  315. package/dist/run-vvQiCHpi.mjs +0 -5427
  316. package/dist/run-w-HVv5py.mjs +0 -5410
  317. package/dist/run-wpUutZ9C.mjs +0 -1051
  318. package/dist/run-yTjJ7noq.mjs +0 -1051
  319. package/dist/run-zo5GSoVC.mjs +0 -1050
package/README.md ADDED
@@ -0,0 +1,193 @@
1
+ # svamp-cli
2
+
3
+ AI workspace daemon and CLI for [Hypha Cloud](https://hypha.aicell.io). Run AI agents locally with cloud sync, manage sessions, share with teammates, and orchestrate tasks.
4
+
5
+ **Svamp** (Swedish for "mushroom") is the interactive layer of Hypha Cloud — where teams and AI agents collaborate in real time.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install -g svamp-cli
11
+ ```
12
+
13
+ Requires **Node.js >= 22** (for native WebSocket support).
14
+
15
+ ## Quick Start
16
+
17
+ ```bash
18
+ # Login to Hypha Cloud
19
+ svamp login
20
+
21
+ # Start interactive Claude session (synced to web app)
22
+ svamp
23
+
24
+ # Or start the daemon for background sessions
25
+ svamp daemon start
26
+
27
+ # Spawn a session
28
+ svamp session spawn claude -d ~/my-project
29
+
30
+ # Send a message
31
+ svamp session send <session-id> "Fix the failing tests"
32
+ ```
33
+
34
+ ## Configuration
35
+
36
+ Credentials are stored in `~/.svamp/.env`:
37
+
38
+ ```
39
+ HYPHA_SERVER_URL=https://hypha.aicell.io
40
+ HYPHA_TOKEN=<your-token>
41
+ HYPHA_WORKSPACE=<your-workspace>
42
+ ```
43
+
44
+ ## Commands
45
+
46
+ ### Interactive Mode
47
+
48
+ ```bash
49
+ svamp # Start Claude in terminal with cloud sync
50
+ svamp start [-d <path>] # Same, with explicit directory
51
+ ```
52
+
53
+ When you run `svamp` with no arguments, Claude starts in your terminal with full interactive access. Your session is synced to Hypha Cloud and visible in the web app. When a message arrives from the web app, svamp switches to remote mode automatically. Press Space-Space to return to local mode.
54
+
55
+ ### Login
56
+
57
+ ```bash
58
+ svamp login [server-url] # Login via browser OAuth
59
+ ```
60
+
61
+ ### Daemon Management
62
+
63
+ ```bash
64
+ svamp daemon start # Start daemon (detached)
65
+ svamp daemon stop # Stop (sessions preserved for auto-restore)
66
+ svamp daemon stop --cleanup # Stop and mark all sessions as stopped
67
+ svamp daemon restart # Restart seamlessly
68
+ svamp daemon status # Show daemon status
69
+ svamp daemon install # Install as system service (launchd/systemd)
70
+ svamp daemon uninstall # Remove system service
71
+ ```
72
+
73
+ ### Session Management
74
+
75
+ All session commands support `--machine <id>` / `-m <id>` to target a specific machine.
76
+
77
+ ```bash
78
+ svamp session list [--active] [--json]
79
+ svamp session machines # List discoverable machines
80
+ svamp session spawn <agent> [-d <path>] [--message <msg>] [--wait]
81
+ svamp session stop <id>
82
+ svamp session info <id> [--json]
83
+ svamp session send <id> <message> [--wait] [--timeout N]
84
+ svamp session wait <id> [--timeout N]
85
+ svamp session messages <id> [--last N] [--json]
86
+ svamp session attach <id> # Interactive terminal attach
87
+ svamp session approve <id> # Approve pending permission
88
+ svamp session deny <id> # Deny pending permission
89
+ ```
90
+
91
+ #### Session Sharing
92
+
93
+ ```bash
94
+ svamp session share <id> --list
95
+ svamp session share <id> --add <email>[:<role>] # Roles: view, interact, admin
96
+ svamp session share <id> --remove <email>
97
+ ```
98
+
99
+ #### Isolation & Security Flags (on spawn)
100
+
101
+ ```bash
102
+ svamp session spawn claude -d <path> --isolate
103
+ svamp session spawn claude -d <path> --share alice@example.com:admin
104
+ svamp session spawn claude -d <path> --security-context ./context.json
105
+ svamp session spawn claude -d <path> --deny-network
106
+ svamp session spawn claude -d <path> --deny-read /etc --allow-write /tmp/work
107
+ svamp session spawn claude -d <path> --allow-domain api.anthropic.com
108
+ ```
109
+
110
+ #### Ralph Loop (Iterative Task Automation)
111
+
112
+ ```bash
113
+ svamp session ralph-start <id> "<task>" [--promise DONE] [--max 10] [--cooldown 1]
114
+ svamp session ralph-cancel <id>
115
+ svamp session ralph-status <id>
116
+ ```
117
+
118
+ The Ralph Loop enables agents to iterate on tasks with verifiable completion. Each iteration the agent works toward a goal and signals completion via `<promise>DONE</promise>`.
119
+
120
+ ### Machine Management
121
+
122
+ ```bash
123
+ svamp machine share --list
124
+ svamp machine share --add <email>[:<role>]
125
+ svamp machine share --remove <email>
126
+ svamp machine share --config <path> # Apply security context config
127
+ svamp machine share --show-config
128
+ ```
129
+
130
+ ### Skills Marketplace
131
+
132
+ ```bash
133
+ svamp skills find <query> [--json] # Search marketplace
134
+ svamp skills install <name> [--force] # Install to ~/.claude/skills/<name>/
135
+ svamp skills list # List installed skills
136
+ svamp skills remove <name> # Remove skill
137
+ svamp skills publish <path> # Publish to marketplace
138
+ ```
139
+
140
+ ### Service Exposure (Cloud HTTP Services)
141
+
142
+ Expose HTTP services from cloud sandboxes or local machines to stable external URLs.
143
+
144
+ ```bash
145
+ svamp service expose <name> --port <port> # Create + join (auto-detect cloud/tunnel)
146
+ svamp service create <name> --port <port>
147
+ svamp service list [--json]
148
+ svamp service info <name> [--json]
149
+ svamp service delete <name>
150
+ svamp service tunnel <name> --port <port> # Tunnel local ports
151
+ ```
152
+
153
+ ### Local Agent Sessions
154
+
155
+ ```bash
156
+ svamp agent list # List known agents (ACP + MCP)
157
+ svamp agent <name> # Start local agent session (gemini, codex)
158
+ svamp agent -- <cmd> [args] # Start custom ACP agent
159
+ ```
160
+
161
+ ## Agent Backends
162
+
163
+ | Agent | Protocol | Transport |
164
+ |-------|----------|-----------|
165
+ | Claude | Native | CLI subprocess |
166
+ | Codex | MCP | STDIO (`codex mcp-server`) |
167
+ | Gemini | ACP | STDIO (`gemini --experimental-acp`) |
168
+
169
+ ## Security & Isolation
170
+
171
+ Sessions can be isolated using OS-level sandboxes:
172
+
173
+ | Method | Platform | Description |
174
+ |--------|----------|-------------|
175
+ | nono | macOS/Linux | Kernel-enforced capability sandbox (preferred) |
176
+ | Docker | Any | Container-based isolation |
177
+ | Podman | Any | Rootless container fallback |
178
+
179
+ Security contexts define per-user filesystem and network rules. See `--security-context` flag.
180
+
181
+ ## Development
182
+
183
+ ```bash
184
+ yarn install
185
+ yarn workspace svamp-cli build
186
+ yarn workspace svamp-cli test # Run unit tests (235+ tests)
187
+ yarn workspace svamp-cli test:e2e # Run E2E session tests
188
+ yarn workspace svamp-cli test:hypha # Run Hypha service integration tests
189
+ ```
190
+
191
+ ## License
192
+
193
+ See LICENSE in the repository root.
package/bin/svamp.mjs CHANGED
@@ -7,12 +7,10 @@ import { existsSync, readFileSync } from 'fs';
7
7
  import { join } from 'path';
8
8
  import { homedir } from 'os';
9
9
 
10
- // Simple .env loader — load from SVAMP_HOME or ~/.svamp/
11
- const envDir = process.env.SVAMP_HOME || join(homedir(), '.svamp');
12
- const envFile = join(envDir, '.env');
13
-
14
- if (existsSync(envFile)) {
15
- const lines = readFileSync(envFile, 'utf-8').split('\n');
10
+ // Simple .env loader — load from SVAMP_HOME or ~/.svamp/, fallback to ~/.hypha/.env
11
+ function loadEnvFile(path) {
12
+ if (!existsSync(path)) return false;
13
+ const lines = readFileSync(path, 'utf-8').split('\n');
16
14
  for (const line of lines) {
17
15
  const trimmed = line.trim();
18
16
  if (!trimmed || trimmed.startsWith('#')) continue;
@@ -20,10 +18,21 @@ if (existsSync(envFile)) {
20
18
  if (eqIdx === -1) continue;
21
19
  const key = trimmed.slice(0, eqIdx).trim();
22
20
  const value = trimmed.slice(eqIdx + 1).trim().replace(/^["']|["']$/g, '');
23
- if (!process.env[key]) {
21
+ // HYPHA_* vars are managed by `svamp login` — .env is source of truth,
22
+ // always apply them even if already in the shell environment.
23
+ // Other vars only set if not already present.
24
+ if (key.startsWith('HYPHA_') || !process.env[key]) {
24
25
  process.env[key] = value;
25
26
  }
26
27
  }
28
+ return true;
29
+ }
30
+
31
+ const svampEnv = join(process.env.SVAMP_HOME || join(homedir(), '.svamp'), '.env');
32
+ if (!loadEnvFile(svampEnv)) {
33
+ // Fallback: load from ~/.hypha/.env (shared with hypha-cli)
34
+ const hyphaEnv = join(process.env.HYPHA_HOME || join(homedir(), '.hypha'), '.env');
35
+ loadEnvFile(hyphaEnv);
27
36
  }
28
37
 
29
38
  // Import and run the CLI
package/dist/cli.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { b as stopDaemon, s as startDaemon, d as daemonStatus } from './run-BdEHYoYE.mjs';
1
+ import { b as stopDaemon, s as startDaemon, d as daemonStatus } from './run-CBhm4Jop.mjs';
2
2
  import 'os';
3
3
  import 'fs/promises';
4
4
  import 'fs';
@@ -106,14 +106,14 @@ async function main() {
106
106
  } else if (subcommand === "skills") {
107
107
  await handleSkillsCommand();
108
108
  } else if (subcommand === "service" || subcommand === "svc") {
109
- const { handleServiceCommand } = await import('./commands-DlPBC5p0.mjs').then(function (n) { return n.c; });
109
+ const { handleServiceCommand } = await import('./commands-ZuFXrcot.mjs').then(function (n) { return n.c; });
110
110
  await handleServiceCommand();
111
111
  } else if (subcommand === "--help" || subcommand === "-h") {
112
112
  printHelp();
113
113
  } else if (!subcommand || subcommand === "start") {
114
114
  await handleInteractiveCommand();
115
115
  } else if (subcommand === "--version" || subcommand === "-v") {
116
- const pkg = await import('./package-BRivSAkK.mjs').catch(() => ({ default: { version: "unknown" } }));
116
+ const pkg = await import('./package-DbeynOln.mjs').catch(() => ({ default: { version: "unknown" } }));
117
117
  console.log(`svamp version: ${pkg.default.version}`);
118
118
  } else {
119
119
  console.error(`Unknown command: ${subcommand}`);
@@ -122,7 +122,7 @@ async function main() {
122
122
  }
123
123
  }
124
124
  async function handleInteractiveCommand() {
125
- const { runInteractive } = await import('./run-3Et1ISd5.mjs');
125
+ const { runInteractive } = await import('./run-Y0b60UYS.mjs');
126
126
  const interactiveArgs = subcommand === "start" ? args.slice(1) : args;
127
127
  let directory = process.cwd();
128
128
  let resumeSessionId;
@@ -167,7 +167,7 @@ async function handleAgentCommand() {
167
167
  return;
168
168
  }
169
169
  if (agentArgs[0] === "list") {
170
- const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-BdEHYoYE.mjs').then(function (n) { return n.i; });
170
+ const { KNOWN_ACP_AGENTS, KNOWN_MCP_AGENTS: KNOWN_MCP_AGENTS2 } = await import('./run-CBhm4Jop.mjs').then(function (n) { return n.i; });
171
171
  console.log("Known agents:");
172
172
  for (const [name, config2] of Object.entries(KNOWN_ACP_AGENTS)) {
173
173
  console.log(` ${name.padEnd(12)} ${config2.command} ${config2.args.join(" ")} (ACP)`);
@@ -179,7 +179,7 @@ async function handleAgentCommand() {
179
179
  console.log('Use "svamp agent -- <command> [args]" for a custom ACP agent.');
180
180
  return;
181
181
  }
182
- const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-BdEHYoYE.mjs').then(function (n) { return n.i; });
182
+ const { resolveAcpAgentConfig, KNOWN_MCP_AGENTS } = await import('./run-CBhm4Jop.mjs').then(function (n) { return n.i; });
183
183
  let cwd = process.cwd();
184
184
  const filteredArgs = [];
185
185
  for (let i = 0; i < agentArgs.length; i++) {
@@ -203,12 +203,12 @@ async function handleAgentCommand() {
203
203
  console.log(`Starting ${config.agentName} agent in ${cwd}...`);
204
204
  let backend;
205
205
  if (KNOWN_MCP_AGENTS[config.agentName]) {
206
- const { CodexMcpBackend } = await import('./run-BdEHYoYE.mjs').then(function (n) { return n.j; });
206
+ const { CodexMcpBackend } = await import('./run-CBhm4Jop.mjs').then(function (n) { return n.j; });
207
207
  backend = new CodexMcpBackend({ cwd, log: logFn });
208
208
  } else {
209
- const { AcpBackend } = await import('./run-BdEHYoYE.mjs').then(function (n) { return n.h; });
210
- const { GeminiTransport } = await import('./run-BdEHYoYE.mjs').then(function (n) { return n.G; });
211
- const { DefaultTransport } = await import('./run-BdEHYoYE.mjs').then(function (n) { return n.D; });
209
+ const { AcpBackend } = await import('./run-CBhm4Jop.mjs').then(function (n) { return n.h; });
210
+ const { GeminiTransport } = await import('./run-CBhm4Jop.mjs').then(function (n) { return n.G; });
211
+ const { DefaultTransport } = await import('./run-CBhm4Jop.mjs').then(function (n) { return n.D; });
212
212
  const transportHandler = config.agentName === "gemini" ? new GeminiTransport() : new DefaultTransport(config.agentName);
213
213
  backend = new AcpBackend({
214
214
  agentName: config.agentName,
@@ -326,7 +326,7 @@ async function handleSessionCommand() {
326
326
  printSessionHelp();
327
327
  return;
328
328
  }
329
- const { sessionList, sessionSpawn, sessionStop, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionRalphStart, sessionRalphCancel, sessionRalphStatus, sessionQueueAdd, sessionQueueList, sessionQueueClear } = await import('./commands-mw8HFkt6.mjs');
329
+ const { sessionList, sessionSpawn, sessionStop, sessionInfo, sessionMessages, sessionAttach, sessionMachines, sessionSend, sessionWait, sessionShare, sessionRalphStart, sessionRalphCancel, sessionRalphStatus, sessionQueueAdd, sessionQueueList, sessionQueueClear } = await import('./commands-VGt5ofDo.mjs');
330
330
  const parseFlagStr = (flag, shortFlag) => {
331
331
  for (let i = 1; i < sessionArgs.length; i++) {
332
332
  if ((sessionArgs[i] === flag || shortFlag) && i + 1 < sessionArgs.length) {
@@ -386,7 +386,7 @@ async function handleSessionCommand() {
386
386
  allowDomain.push(sessionArgs[++i]);
387
387
  }
388
388
  }
389
- const { parseShareArg } = await import('./commands-mw8HFkt6.mjs');
389
+ const { parseShareArg } = await import('./commands-VGt5ofDo.mjs');
390
390
  const shareEntries = share.map((s) => parseShareArg(s));
391
391
  await sessionSpawn(agent, dir, targetMachineId, {
392
392
  message,
@@ -470,7 +470,7 @@ async function handleSessionCommand() {
470
470
  console.error("Usage: svamp session approve <session-id> [request-id] [--json]");
471
471
  process.exit(1);
472
472
  }
473
- const { sessionApprove } = await import('./commands-mw8HFkt6.mjs');
473
+ const { sessionApprove } = await import('./commands-VGt5ofDo.mjs');
474
474
  const approveReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
475
475
  await sessionApprove(sessionArgs[1], approveReqId, targetMachineId, {
476
476
  json: hasFlag("--json")
@@ -480,7 +480,7 @@ async function handleSessionCommand() {
480
480
  console.error("Usage: svamp session deny <session-id> [request-id] [--json]");
481
481
  process.exit(1);
482
482
  }
483
- const { sessionDeny } = await import('./commands-mw8HFkt6.mjs');
483
+ const { sessionDeny } = await import('./commands-VGt5ofDo.mjs');
484
484
  const denyReqId = sessionArgs[2] && !sessionArgs[2].startsWith("--") ? sessionArgs[2] : void 0;
485
485
  await sessionDeny(sessionArgs[1], denyReqId, targetMachineId, {
486
486
  json: hasFlag("--json")
@@ -549,7 +549,7 @@ async function handleMachineCommand() {
549
549
  return;
550
550
  }
551
551
  if (machineSubcommand === "share") {
552
- const { machineShare } = await import('./commands-mw8HFkt6.mjs');
552
+ const { machineShare } = await import('./commands-VGt5ofDo.mjs');
553
553
  let machineId;
554
554
  const shareArgs = [];
555
555
  for (let i = 1; i < machineArgs.length; i++) {
@@ -579,7 +579,7 @@ async function handleMachineCommand() {
579
579
  }
580
580
  await machineShare(machineId, { add, remove, list, configPath, showConfig });
581
581
  } else if (machineSubcommand === "exec") {
582
- const { machineExec } = await import('./commands-mw8HFkt6.mjs');
582
+ const { machineExec } = await import('./commands-VGt5ofDo.mjs');
583
583
  let machineId;
584
584
  let cwd;
585
585
  const cmdParts = [];
@@ -599,7 +599,7 @@ async function handleMachineCommand() {
599
599
  }
600
600
  await machineExec(machineId, command, cwd);
601
601
  } else if (machineSubcommand === "info") {
602
- const { machineInfo } = await import('./commands-mw8HFkt6.mjs');
602
+ const { machineInfo } = await import('./commands-VGt5ofDo.mjs');
603
603
  let machineId;
604
604
  for (let i = 1; i < machineArgs.length; i++) {
605
605
  if ((machineArgs[i] === "--machine" || machineArgs[i] === "-m") && i + 1 < machineArgs.length) {
@@ -608,7 +608,7 @@ async function handleMachineCommand() {
608
608
  }
609
609
  await machineInfo(machineId);
610
610
  } else if (machineSubcommand === "ls") {
611
- const { machineLs } = await import('./commands-mw8HFkt6.mjs');
611
+ const { machineLs } = await import('./commands-VGt5ofDo.mjs');
612
612
  let machineId;
613
613
  let showHidden = false;
614
614
  let path;
@@ -738,7 +738,7 @@ Please open this URL in your browser:
738
738
  }
739
739
  envLines.push(`HYPHA_SERVER_URL=${serverUrl}`);
740
740
  envLines.push(`HYPHA_TOKEN=${longLivedToken}`);
741
- envLines.push(`HYPHA_WORKSPACE=${userId}`);
741
+ envLines.push(`HYPHA_WORKSPACE=${workspace}`);
742
742
  while (envLines.length > 0 && envLines[envLines.length - 1].trim() === "") {
743
743
  envLines.pop();
744
744
  }
@@ -2,7 +2,7 @@ import { existsSync, readFileSync } from 'node:fs';
2
2
  import { execSync } from 'node:child_process';
3
3
  import { resolve, join } from 'node:path';
4
4
  import os from 'node:os';
5
- import { l as loadSecurityContextConfig, e as resolveSecurityContext, f as buildSecurityContextFromFlags, m as mergeSecurityContexts, c as connectToHypha } from './run-BdEHYoYE.mjs';
5
+ import { l as loadSecurityContextConfig, e as resolveSecurityContext, f as buildSecurityContextFromFlags, m as mergeSecurityContexts, c as connectToHypha } from './run-eYBOEaWw.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
8
8
  import 'fs';
@@ -958,7 +958,8 @@ async function sessionInfo(sessionId, machineId, opts) {
958
958
  sessionLink: metadata.sessionLink?.url || void 0,
959
959
  tags: metadata.tags?.length ? metadata.tags : void 0,
960
960
  parentSessionId: metadata.parentSessionId || void 0,
961
- pendingPermissions: pendingPermissions.length > 0 ? pendingPermissions : void 0
961
+ pendingPermissions: pendingPermissions.length > 0 ? pendingPermissions : void 0,
962
+ ralphLoop: metadata.ralphLoop || void 0
962
963
  };
963
964
  if (opts?.json) {
964
965
  console.log(formatJson(statusData));
@@ -2,7 +2,7 @@ import { existsSync, readFileSync } from 'node:fs';
2
2
  import { execSync } from 'node:child_process';
3
3
  import { resolve, join } from 'node:path';
4
4
  import os from 'node:os';
5
- import { l as loadSecurityContextConfig, e as resolveSecurityContext, f as buildSecurityContextFromFlags, m as mergeSecurityContexts, c as connectToHypha } from './run-CE4H8ZiN.mjs';
5
+ import { l as loadSecurityContextConfig, e as resolveSecurityContext, f as buildSecurityContextFromFlags, m as mergeSecurityContexts, c as connectToHypha } from './run-CBhm4Jop.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
8
8
  import 'fs';
@@ -958,7 +958,8 @@ async function sessionInfo(sessionId, machineId, opts) {
958
958
  sessionLink: metadata.sessionLink?.url || void 0,
959
959
  tags: metadata.tags?.length ? metadata.tags : void 0,
960
960
  parentSessionId: metadata.parentSessionId || void 0,
961
- pendingPermissions: pendingPermissions.length > 0 ? pendingPermissions : void 0
961
+ pendingPermissions: pendingPermissions.length > 0 ? pendingPermissions : void 0,
962
+ ralphLoop: metadata.ralphLoop || void 0
962
963
  };
963
964
  if (opts?.json) {
964
965
  console.log(formatJson(statusData));
@@ -1606,18 +1607,21 @@ async function sessionRalphStart(sessionIdPartial, task, machineId, opts) {
1606
1607
  const completionPromise = opts?.completionPromise || "DONE";
1607
1608
  const maxIterations = opts?.maxIterations ?? 0;
1608
1609
  const cooldownSeconds = opts?.cooldownSeconds ?? 1;
1610
+ const contextMode = opts?.contextMode || void 0;
1609
1611
  await svc.updateConfig({
1610
1612
  ralph_loop: {
1611
1613
  task,
1612
1614
  completion_promise: completionPromise,
1613
1615
  max_iterations: maxIterations,
1614
- cooldown_seconds: cooldownSeconds
1616
+ cooldown_seconds: cooldownSeconds,
1617
+ ...contextMode ? { context_mode: contextMode } : {}
1615
1618
  }
1616
1619
  });
1617
1620
  console.log(`Ralph loop started on session ${fullId.slice(0, 8)}`);
1618
1621
  console.log(` Task: ${task.slice(0, 100)}${task.length > 100 ? "..." : ""}`);
1619
1622
  console.log(` Completion promise: ${completionPromise}`);
1620
1623
  console.log(` Max iterations: ${maxIterations > 0 ? maxIterations : "unlimited"}`);
1624
+ if (contextMode) console.log(` Context mode: ${contextMode}`);
1621
1625
  } finally {
1622
1626
  await server.disconnect();
1623
1627
  }
@@ -2,7 +2,7 @@ import { existsSync, readFileSync } from 'node:fs';
2
2
  import { execSync } from 'node:child_process';
3
3
  import { resolve, join } from 'node:path';
4
4
  import os from 'node:os';
5
- import { l as loadSecurityContextConfig, e as resolveSecurityContext, f as buildSecurityContextFromFlags, m as mergeSecurityContexts, c as connectToHypha } from './run-B9ND6srh.mjs';
5
+ import { l as loadSecurityContextConfig, e as resolveSecurityContext, f as buildSecurityContextFromFlags, m as mergeSecurityContexts, c as connectToHypha } from './run-BnnUavlu.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
8
8
  import 'fs';
@@ -958,7 +958,8 @@ async function sessionInfo(sessionId, machineId, opts) {
958
958
  sessionLink: metadata.sessionLink?.url || void 0,
959
959
  tags: metadata.tags?.length ? metadata.tags : void 0,
960
960
  parentSessionId: metadata.parentSessionId || void 0,
961
- pendingPermissions: pendingPermissions.length > 0 ? pendingPermissions : void 0
961
+ pendingPermissions: pendingPermissions.length > 0 ? pendingPermissions : void 0,
962
+ ralphLoop: metadata.ralphLoop || void 0
962
963
  };
963
964
  if (opts?.json) {
964
965
  console.log(formatJson(statusData));
@@ -1606,18 +1607,21 @@ async function sessionRalphStart(sessionIdPartial, task, machineId, opts) {
1606
1607
  const completionPromise = opts?.completionPromise || "DONE";
1607
1608
  const maxIterations = opts?.maxIterations ?? 0;
1608
1609
  const cooldownSeconds = opts?.cooldownSeconds ?? 1;
1610
+ const contextMode = opts?.contextMode || void 0;
1609
1611
  await svc.updateConfig({
1610
1612
  ralph_loop: {
1611
1613
  task,
1612
1614
  completion_promise: completionPromise,
1613
1615
  max_iterations: maxIterations,
1614
- cooldown_seconds: cooldownSeconds
1616
+ cooldown_seconds: cooldownSeconds,
1617
+ ...contextMode ? { context_mode: contextMode } : {}
1615
1618
  }
1616
1619
  });
1617
1620
  console.log(`Ralph loop started on session ${fullId.slice(0, 8)}`);
1618
1621
  console.log(` Task: ${task.slice(0, 100)}${task.length > 100 ? "..." : ""}`);
1619
1622
  console.log(` Completion promise: ${completionPromise}`);
1620
1623
  console.log(` Max iterations: ${maxIterations > 0 ? maxIterations : "unlimited"}`);
1624
+ if (contextMode) console.log(` Context mode: ${contextMode}`);
1621
1625
  } finally {
1622
1626
  await server.disconnect();
1623
1627
  }
@@ -2,7 +2,7 @@ import { existsSync, readFileSync } from 'node:fs';
2
2
  import { execSync } from 'node:child_process';
3
3
  import { resolve, join } from 'node:path';
4
4
  import os from 'node:os';
5
- import { l as loadSecurityContextConfig, e as resolveSecurityContext, f as buildSecurityContextFromFlags, m as mergeSecurityContexts, c as connectToHypha } from './run-C0ecvcRP.mjs';
5
+ import { l as loadSecurityContextConfig, e as resolveSecurityContext, f as buildSecurityContextFromFlags, m as mergeSecurityContexts, c as connectToHypha } from './run-DxISzP_V.mjs';
6
6
  import 'os';
7
7
  import 'fs/promises';
8
8
  import 'fs';
@@ -958,7 +958,8 @@ async function sessionInfo(sessionId, machineId, opts) {
958
958
  sessionLink: metadata.sessionLink?.url || void 0,
959
959
  tags: metadata.tags?.length ? metadata.tags : void 0,
960
960
  parentSessionId: metadata.parentSessionId || void 0,
961
- pendingPermissions: pendingPermissions.length > 0 ? pendingPermissions : void 0
961
+ pendingPermissions: pendingPermissions.length > 0 ? pendingPermissions : void 0,
962
+ ralphLoop: metadata.ralphLoop || void 0
962
963
  };
963
964
  if (opts?.json) {
964
965
  console.log(formatJson(statusData));
@@ -1606,18 +1607,21 @@ async function sessionRalphStart(sessionIdPartial, task, machineId, opts) {
1606
1607
  const completionPromise = opts?.completionPromise || "DONE";
1607
1608
  const maxIterations = opts?.maxIterations ?? 0;
1608
1609
  const cooldownSeconds = opts?.cooldownSeconds ?? 1;
1610
+ const contextMode = opts?.contextMode || void 0;
1609
1611
  await svc.updateConfig({
1610
1612
  ralph_loop: {
1611
1613
  task,
1612
1614
  completion_promise: completionPromise,
1613
1615
  max_iterations: maxIterations,
1614
- cooldown_seconds: cooldownSeconds
1616
+ cooldown_seconds: cooldownSeconds,
1617
+ ...contextMode ? { context_mode: contextMode } : {}
1615
1618
  }
1616
1619
  });
1617
1620
  console.log(`Ralph loop started on session ${fullId.slice(0, 8)}`);
1618
1621
  console.log(` Task: ${task.slice(0, 100)}${task.length > 100 ? "..." : ""}`);
1619
1622
  console.log(` Completion promise: ${completionPromise}`);
1620
1623
  console.log(` Max iterations: ${maxIterations > 0 ? maxIterations : "unlimited"}`);
1624
+ if (contextMode) console.log(` Context mode: ${contextMode}`);
1621
1625
  } finally {
1622
1626
  await server.disconnect();
1623
1627
  }