very-happy-cli 0.2.178 → 0.2.180

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 (217) hide show
  1. package/dist/{AcpBackend-DCQXHRzT.mjs → AcpBackend-B8Zi30Zh.mjs} +135 -16
  2. package/dist/{AcpBackend-CDkAQXYf.cjs → AcpBackend-DfRDtMcG.cjs} +135 -16
  3. package/dist/{AcpSessionManager-DckmUZza.cjs → AcpSessionManager-CASKOnOj.cjs} +38 -4
  4. package/dist/{AcpSessionManager-BXrQcqwC.mjs → AcpSessionManager-i8Rab0xT.mjs} +38 -4
  5. package/dist/{BasePermissionHandler-BVlrEhIi.mjs → BasePermissionHandler-26fKbRCm.mjs} +5 -2
  6. package/dist/{BasePermissionHandler-DyLmKKtO.cjs → BasePermissionHandler-BlM_tfej.cjs} +5 -2
  7. package/dist/acpSessionResume-B9l54P-X.mjs +67 -0
  8. package/dist/acpSessionResume-CR5pmgVo.cjs +74 -0
  9. package/dist/{agentHome-CEp9RMyK.cjs → agentHome-C7Sb7-Tz.cjs} +4 -4
  10. package/dist/{agentHome-C1xi37as.mjs → agentHome-CmGy0NWv.mjs} +4 -4
  11. package/dist/{api-JANhFdZV.cjs → api-DM7b1OKj.cjs} +38 -262
  12. package/dist/{api-Dib0dmqC.mjs → api-Hov8p7CA.mjs} +32 -256
  13. package/dist/{apiMachine-DNTJidYH.mjs → apiMachine-CwGEhQDT.mjs} +62 -15
  14. package/dist/{apiMachine-QhK-sKcr.cjs → apiMachine-DkGRj-Ai.cjs} +64 -17
  15. package/dist/{attachmentContent-bpQTBJ0y.cjs → attachmentContent-CEm13_gF.cjs} +4 -4
  16. package/dist/{attachmentContent-DkkdpSSJ.mjs → attachmentContent-CIn4iPEk.mjs} +2 -2
  17. package/dist/{auth-BRjd2esb.mjs → auth-BG1DY0gj.mjs} +5 -5
  18. package/dist/{auth-DgIV0Cvt.cjs → auth-CBXnm-Mj.cjs} +5 -5
  19. package/dist/{auth-omWDtgR8.cjs → auth-Dawj7pP5.cjs} +8 -8
  20. package/dist/{auth-DNct7VUi.mjs → auth-rggxMpEE.mjs} +8 -8
  21. package/dist/{auto-DKGFOJBo.mjs → auto-CXXLXGeL.mjs} +19 -18
  22. package/dist/{auto-CI16FZmX.cjs → auto-CbYOfoPS.cjs} +19 -18
  23. package/dist/{backgroundTaskActivity-BVwJBl02.mjs → backgroundTaskActivity-8PdPxrvy.mjs} +1 -1
  24. package/dist/{bootstrap-DCQ87Aan.cjs → bootstrap-DoA7okld.cjs} +2 -2
  25. package/dist/{bootstrap-BUagGC_-.mjs → bootstrap-Dt5I1SOl.mjs} +2 -2
  26. package/dist/{browser-Dj_DYQEh.mjs → browser-DUNetFT4.mjs} +1 -1
  27. package/dist/{browser-CSKhc0Bl.cjs → browser-DZ6qRtfH.cjs} +1 -1
  28. package/dist/{claudeCliPath-U4HHmV4r.cjs → claudeCliPath-GaP3UUz1.cjs} +1 -1
  29. package/dist/{claudeLocal-CdIVnOZp.cjs → claudeLocal--DNyMOSv.cjs} +8 -7
  30. package/dist/{claudeLocal-CCCvAeMd.mjs → claudeLocal-OHWQigCl.mjs} +6 -5
  31. package/dist/{claudeLocalLauncher-BmrpaRYJ.mjs → claudeLocalLauncher-BStvfa7M.mjs} +11 -10
  32. package/dist/{claudeLocalLauncher-21-xh5gc.cjs → claudeLocalLauncher-BhvPbcyH.cjs} +13 -12
  33. package/dist/{claudeSessionFork-kYCP1IJB.cjs → claudeSessionFork-Be16vzGc.cjs} +1 -1
  34. package/dist/{claudeSessionFork-DvxMKAmY.mjs → claudeSessionFork-GAVWhiKG.mjs} +1 -1
  35. package/dist/{client-C4zKGjiJ.cjs → client-BWjaHKtj.cjs} +2 -2
  36. package/dist/client-Ca5Pcgy_.mjs +71 -0
  37. package/dist/{client-CnlkkrZO.mjs → client-CnB7kRCT.mjs} +2 -2
  38. package/dist/{client-BTX9hsbr.mjs → client-D4uPb1uu.mjs} +3 -3
  39. package/dist/client-DJplzPjD.cjs +76 -0
  40. package/dist/{client-Dnza1hgN.cjs → client-D_loZ9IK.cjs} +3 -3
  41. package/dist/codex/happyMcpStdioBridge.cjs +24 -15
  42. package/dist/codex/happyMcpStdioBridge.mjs +25 -16
  43. package/dist/{codexAppServerClient-DvkpQgyv.mjs → codexAppServerClient-CO4G6OS4.mjs} +3 -3
  44. package/dist/{codexAppServerClient-CRlBWGn3.cjs → codexAppServerClient-PE-12AsW.cjs} +3 -3
  45. package/dist/{codexCommand-DzxIWXIT.cjs → codexCommand-BNoD1t1C.cjs} +127 -116
  46. package/dist/{codexCommand-BxjogBzU.mjs → codexCommand-B_xUH79E.mjs} +77 -66
  47. package/dist/{codexTermination-C28FzlLb.cjs → codexTermination-BmBbizFK.cjs} +7 -2
  48. package/dist/{codexTermination-ySDNMEhd.mjs → codexTermination-Dx48ma6e.mjs} +7 -2
  49. package/dist/{config-BFB5uJ4t.cjs → config-CtwEUxUP.cjs} +26 -26
  50. package/dist/{config-DwfEpFr3.mjs → config-DSu0Blos.mjs} +3 -3
  51. package/dist/{configuration-4TGMrjul.cjs → configuration-CYO-kPOS.cjs} +1 -1
  52. package/dist/{configuration-DVrb61aY.mjs → configuration-PxzEJumr.mjs} +1 -1
  53. package/dist/{connect-C7FPY0PI.mjs → connect-BQrg3TB6.mjs} +15 -15
  54. package/dist/{connect-QH2VJGBG.cjs → connect-Dq7wndzR.cjs} +28 -28
  55. package/dist/{context-JoKu0V54.cjs → context-6TP-iz_c.cjs} +1 -1
  56. package/dist/{context-B3XPVJlj.mjs → context-CJGRRGWW.mjs} +1 -1
  57. package/dist/{controlClient-BTaZlbC6.cjs → controlClient-Bqv5v5OM.cjs} +3 -3
  58. package/dist/{controlClient-BYKyGyxj.mjs → controlClient-DoeYovwP.mjs} +4 -4
  59. package/dist/{createSessionMetadata-8Fuj2-IV.mjs → createSessionMetadata-DDIChCx8.mjs} +2 -2
  60. package/dist/{createSessionMetadata-B2NynaWZ.cjs → createSessionMetadata-xz767pcG.cjs} +3 -3
  61. package/dist/{defaultPermissionMode-BEWCqJU-.cjs → defaultPermissionMode-PkZGsQDk.cjs} +2 -2
  62. package/dist/{defaultPermissionMode-B8kJG9uI.mjs → defaultPermissionMode-i5KzdK09.mjs} +2 -2
  63. package/dist/{detectCLI-DR9ZaN6B.cjs → detectCLI-BuYR_Qxe.cjs} +4 -4
  64. package/dist/{deterministicJson-C5ZwZ7hu.mjs → deterministicJson-CTEJDqtS.mjs} +217 -12
  65. package/dist/{deterministicJson-BjNQsAjO.cjs → deterministicJson-xqA6DaOm.cjs} +222 -16
  66. package/dist/{doctor-BshRnjLi.cjs → doctor-BrgSlfXn.cjs} +9 -9
  67. package/dist/{doctor-0BiGwJXk.mjs → doctor-IctjVh9T.mjs} +8 -8
  68. package/dist/{doctorReadiness-BCZGcN0a.cjs → doctorReadiness-Dl6yRQCy.cjs} +1 -1
  69. package/dist/{downloadTarget-BN5vZt3K.cjs → downloadTarget-CEb9che-.cjs} +6 -6
  70. package/dist/{downloadTarget-DJPwAZlu.mjs → downloadTarget-jbOz1egC.mjs} +6 -6
  71. package/dist/{ensureDaemonRunning-C5QfToCe.cjs → ensureDaemonRunning-D-HyjGIX.cjs} +6 -6
  72. package/dist/{ensureDaemonRunning-CSmb_mqt.mjs → ensureDaemonRunning-b1e8LCSM.mjs} +5 -5
  73. package/dist/{handleResumeCommand-BwnUZmbo.cjs → handleResumeCommand-BvWVuRwH.cjs} +23 -7
  74. package/dist/{handleResumeCommand-CgjpsdDe.mjs → handleResumeCommand-DpaZvm2c.mjs} +22 -6
  75. package/dist/{index-piJPsTsm.cjs → index-B2p2Mut7.cjs} +259 -53
  76. package/dist/{index-BehVbAsA.mjs → index-BUNnpGFF.mjs} +256 -50
  77. package/dist/{index-Bvldtdny.mjs → index-Bsvbgh9e.mjs} +4 -4
  78. package/dist/{index-BYOZ_8WZ.cjs → index-C64Ufj4D.cjs} +4 -4
  79. package/dist/{index-Clqlu17M.mjs → index-C6Vn5Eac.mjs} +155 -34
  80. package/dist/index-CMf5VbzG.mjs +18 -0
  81. package/dist/index-DmTlDRSL.cjs +24 -0
  82. package/dist/{index-_l1Sdmbi.cjs → index-Dv0Q48P3.cjs} +156 -33
  83. package/dist/{index-BRClDe07.cjs → index-F2UejqYs.cjs} +3 -3
  84. package/dist/{index-BYgfern_.mjs → index-wCbtF4BK.mjs} +3 -3
  85. package/dist/index.cjs +2 -2
  86. package/dist/index.mjs +2 -2
  87. package/dist/{install-BdvKiOQw.mjs → install-BX3lv3NO.mjs} +1 -1
  88. package/dist/{install-Cf6AFSWC.cjs → install-BXvf2E3o.cjs} +1 -1
  89. package/dist/{install-TO4taKW7.cjs → install-C0ANcEAW.cjs} +7 -7
  90. package/dist/{install-fYWHrPcC.mjs → install-CdzSV7qO.mjs} +3 -3
  91. package/dist/{installPiTools-BKnXjrVu.cjs → installPiTools-CL_axh_6.cjs} +1 -1
  92. package/dist/{installTerminalHooks-BQZbvxsZ.cjs → installTerminalHooks-BETLKAtd.cjs} +3 -3
  93. package/dist/lib.cjs +14 -14
  94. package/dist/lib.d.cts +239 -2
  95. package/dist/lib.d.mts +239 -2
  96. package/dist/lib.mjs +14 -14
  97. package/dist/{lidState-BeOwj6eW.cjs → lidState-DWGnm2H4.cjs} +1 -1
  98. package/dist/{lidState-DNMlIhX0.mjs → lidState-bBrmaQd2.mjs} +1 -1
  99. package/dist/{localHappyAgentAuth-Br-mgogg.cjs → localHappyAgentAuth-DZHQnIW9.cjs} +1 -1
  100. package/dist/{localHappyAgentAuth-BezKSFDi.mjs → localHappyAgentAuth-Dn1jYDpt.mjs} +1 -1
  101. package/dist/{logger--vAVtXB_.mjs → logger-BUngm5Xg.mjs} +2 -2
  102. package/dist/{logger-DXTWlPzP.cjs → logger-CphW5nUE.cjs} +2 -2
  103. package/dist/machineMetadata-BQm9YTcI.cjs +79 -0
  104. package/dist/machineMetadata-BXN_bKU3.mjs +68 -0
  105. package/dist/{main-DoMFJ2Cl.cjs → main-B2UV51nK.cjs} +112 -132
  106. package/dist/{main-CshDb5-1.mjs → main-DGkdYfEq.mjs} +106 -126
  107. package/dist/{mcp-pNc1EbQf.cjs → mcp-BFvAEIRz.cjs} +15 -15
  108. package/dist/{mcp-DKT_lrvQ.mjs → mcp-CbTtbs0f.mjs} +15 -15
  109. package/dist/{mirrorProtocol-6IFGPpjJ.mjs → mirrorProtocol-BR4luBC0.mjs} +148 -7
  110. package/dist/{mirrorProtocol-qKflWTX_.cjs → mirrorProtocol-HKPivs5o.cjs} +150 -4
  111. package/dist/{package-B7B03ejW.mjs → package-7Ld1YMhh.mjs} +8 -7
  112. package/dist/{package-DY4zTbKS.cjs → package-KhLqBDX9.cjs} +8 -7
  113. package/dist/panels-C7IVqpJk.mjs +137 -0
  114. package/dist/panels-Njf6GelF.cjs +142 -0
  115. package/dist/{peerTools-3R9RUARX.mjs → peerTools-BOlDRyhi.mjs} +60 -10
  116. package/dist/{peerTools-iy3_6Yc5.cjs → peerTools-DQNlrcqM.cjs} +60 -9
  117. package/dist/{persistence-BfX72dne.cjs → persistence-9BMYspxG.cjs} +2 -2
  118. package/dist/{persistence-DTk4sNpd.mjs → persistence-BFUOHW5h.mjs} +3 -3
  119. package/dist/{piRunnerArgs-CRQVR9o-.cjs → piRunnerArgs-DGaq6VYM.cjs} +8 -2
  120. package/dist/{piRunnerArgs-AT8QJY7x.mjs → piRunnerArgs-H2pgpA5z.mjs} +7 -1
  121. package/dist/{piRuntime-BHRT5MKO.cjs → piRuntime-CT5xv_3h.cjs} +2 -2
  122. package/dist/{piRuntime-E44qTVQ4.mjs → piRuntime-CdN0JAsa.mjs} +2 -2
  123. package/dist/{piTerminal-hI4WFdWm.cjs → piTerminal-0FBtXTHK.cjs} +18 -18
  124. package/dist/{piTerminal-De8nbciM.mjs → piTerminal-C4m9YXAV.mjs} +18 -18
  125. package/dist/processTreeSnapshot-CuLJDNC-.mjs +101 -0
  126. package/dist/processTreeSnapshot-mDbnuojn.cjs +105 -0
  127. package/dist/projectPath-C3ioB4Bu.cjs +13 -0
  128. package/dist/prompt-BOouDaTM.mjs +99 -0
  129. package/dist/prompt-lgF9IE82.cjs +105 -0
  130. package/dist/{attachmentLimits-UyFn8fkQ.mjs → pushNotifications-DCiBEVeC.mjs} +307 -3
  131. package/dist/{attachmentLimits-SqeAHrVC.cjs → pushNotifications-DI92havG.cjs} +308 -2
  132. package/dist/{index-DFPT4HOO.cjs → query-BETKBrnz.cjs} +25 -5
  133. package/dist/{index-CEjJnq05.mjs → query-ywZbQUzR.mjs} +26 -3
  134. package/dist/{rateLimitWindows-XrJiiBpU.mjs → rateLimitWindows-BkfuUB1a.mjs} +1 -1
  135. package/dist/{rateLimitWindows-Czb7_7cK.cjs → rateLimitWindows-YRIYVdo4.cjs} +1 -1
  136. package/dist/{registerCommonHandlers-C0_fyBQ0.cjs → registerCommonHandlers-C7a_dUWs.cjs} +30 -30
  137. package/dist/{registerCommonHandlers-CvIedVRf.mjs → registerCommonHandlers-CTkCvjxt.mjs} +2 -2
  138. package/dist/{registerKillSessionHandler-DYl7l4Ts.cjs → registerKillSessionHandler-CIsvBrVe.cjs} +6 -6
  139. package/dist/{registerKillSessionHandler-gwJ5lTf0.mjs → registerKillSessionHandler-CaqqRYq6.mjs} +6 -6
  140. package/dist/{remoteSessionClient-BRTIOX5b.cjs → remoteSessionClient-D843fkzL.cjs} +5 -5
  141. package/dist/{remoteSessionClient-DRb2Jr5s.mjs → remoteSessionClient-PP-mOKmw.mjs} +5 -5
  142. package/dist/{reportProgressTool-B9nCzbkL.cjs → reportProgressTool-14AXr959.cjs} +84 -2
  143. package/dist/{reportProgressTool-D5tEoXMW.mjs → reportProgressTool-ZOCNjWHr.mjs} +82 -3
  144. package/dist/{resources-JDPugcDq.cjs → resources-CvIlkzpP.cjs} +30 -0
  145. package/dist/{resources-BdFBQi8r.mjs → resources-y9jfyO-_.mjs} +30 -0
  146. package/dist/{run-CKe_WeLW.cjs → run-CAOCYYfT.cjs} +2806 -110
  147. package/dist/{run-BQ_FGaOL.mjs → run-Dajw2E5j.mjs} +2787 -91
  148. package/dist/{runClaude-zrrNcQC_.mjs → runClaude-C6oxWYbp.mjs} +49 -47
  149. package/dist/{runClaude-MHI5IKM-.cjs → runClaude-CRRKt-tm.cjs} +50 -48
  150. package/dist/{runClaudeDeps-RRw-Nusc.cjs → runClaudeDeps-B1ysqTvx.cjs} +310 -237
  151. package/dist/{runClaudeDeps-CVBCokOS.mjs → runClaudeDeps-BcZ68cX3.mjs} +297 -226
  152. package/dist/{runGemini-kipag2ag.mjs → runGemini-D7yKc4wD.mjs} +61 -55
  153. package/dist/{runGemini-D7Lg9yCr.cjs → runGemini-DtKFXqf-.cjs} +89 -83
  154. package/dist/{runOpenClaw-C_lRY3Do.mjs → runOpenClaw-C8ilyLP9.mjs} +19 -19
  155. package/dist/{runOpenClaw-DCcQ0L2N.cjs → runOpenClaw-Cq29mryb.cjs} +20 -20
  156. package/dist/{sandbox-BSyXFVFp.mjs → sandbox-CbCutma4.mjs} +4 -4
  157. package/dist/{sandbox-dMwPTmjm.cjs → sandbox-gIj-EuF4.cjs} +4 -4
  158. package/dist/{selfCheck-DkzDDUsE.cjs → selfCheck-BTGBVthv.cjs} +39 -38
  159. package/dist/selfCheck-Smt-5Xiq.mjs +85 -0
  160. package/dist/{send-dxC0miIA.cjs → send-CZf5lLw_.cjs} +8 -8
  161. package/dist/{send-C-k9nsd3.mjs → send-YZRMQvMJ.mjs} +9 -9
  162. package/dist/{server-DxoTYNlw.mjs → server-BqwXRzFZ.mjs} +4 -4
  163. package/dist/{server-B-W6P7Qr.cjs → server-CknFq6xG.cjs} +6 -6
  164. package/dist/sessionExitLifecycle-CzkLIgNZ.mjs +142 -0
  165. package/dist/sessionExitLifecycle-DFltxXU8.cjs +148 -0
  166. package/dist/{sessionLock-DWX6BbiU.cjs → sessionLock-DRZUcKHT.cjs} +38 -5
  167. package/dist/{sessionLock-DBdtZGOL.mjs → sessionLock-nBXdJxJm.mjs} +36 -5
  168. package/dist/{sessionOps-BAnr7n8t.cjs → sessionOps-BrGiU9-s.cjs} +10 -5
  169. package/dist/{sessionOps-BVoXe12O.mjs → sessionOps-C58iDeD5.mjs} +11 -6
  170. package/dist/{sessionScanner-BtxoeluY.mjs → sessionScanner-Bm57LEXe.mjs} +3 -3
  171. package/dist/{sessionScanner-CDOYsEUD.cjs → sessionScanner-CaO8bLaG.cjs} +3 -3
  172. package/dist/{sessions-C3sZJkzI.mjs → sessions-BXyBHo8n.mjs} +40 -18
  173. package/dist/{sessions-hAitoN-m.cjs → sessions-uzqPCc37.cjs} +39 -16
  174. package/dist/{setupOfflineReconnection-_eD4cuUT.mjs → setupOfflineReconnection-1Qlek3wl.mjs} +2 -2
  175. package/dist/{setupOfflineReconnection-C2EeYTFH.cjs → setupOfflineReconnection-DvvVX3TB.cjs} +2 -2
  176. package/dist/{spawn-Bc9v7pIf.cjs → spawn-DBkodJEO.cjs} +49 -18
  177. package/dist/{spawn-qNrB2CD_.mjs → spawn-vn93PhYL.mjs} +49 -18
  178. package/dist/spawnAgents-CgPMWexP.mjs +79 -0
  179. package/dist/{spawnAgents-BVEaz35W.cjs → spawnAgents-DLNMlhWJ.cjs} +37 -1
  180. package/dist/{spawnHappyCLI-C2stUioM.mjs → spawnHappyCLI-BjFZc_7V.mjs} +1 -1
  181. package/dist/{spawnHappyCLI-fzUagkKV.cjs → spawnHappyCLI-DnUZv0X2.cjs} +2 -2
  182. package/dist/{specialCommands-BJ-nqY4s.cjs → specialCommands-BRufxlqe.cjs} +3 -3
  183. package/dist/{specialCommands-C6W-rVyh.mjs → specialCommands-D3ND9bdg.mjs} +3 -3
  184. package/dist/{startFileWatcher-Bqlqjt93.cjs → startFileWatcher-D9cYzZOq.cjs} +1 -1
  185. package/dist/{startFileWatcher-CR09Snmz.mjs → startFileWatcher-DXJ7yB5v.mjs} +1 -1
  186. package/dist/startupSessionCreate-kdr3m1uX.cjs +26 -0
  187. package/dist/startupSessionCreate-uZ6BM0ty.mjs +24 -0
  188. package/dist/{streamRelay-CJoMk_d2.mjs → streamRelay-DnMCMMfV.mjs} +1 -1
  189. package/dist/{streamRelay-9kBPpbvU.cjs → streamRelay-Dy6amlzx.cjs} +1 -1
  190. package/dist/{sync-Dhmtk66S.cjs → sync-Bn-idAoy.cjs} +1 -1
  191. package/dist/{sync-DbW07iQS.mjs → sync-BvVhDO40.mjs} +1 -1
  192. package/dist/{systemPrompt-CQcuUmVp.mjs → systemPrompt-CIZcJuJF.mjs} +4 -3
  193. package/dist/{systemPrompt-3PYi3EUY.cjs → systemPrompt-DlyEk35T.cjs} +4 -3
  194. package/dist/{teams-DpxLcUU_.cjs → teams-BLeRpDxv.cjs} +8 -8
  195. package/dist/{teams-CwF4Z2fA.mjs → teams-DLY3B5yi.mjs} +8 -8
  196. package/dist/{time-A6zR3Iy6.cjs → time-Cjv0zxQO.cjs} +1 -1
  197. package/dist/{time-BuGWTVP6.mjs → time-D3ETL7Jb.mjs} +1 -1
  198. package/dist/{titleGenerator-D26gvNaS.cjs → titleGenerator-Cgp5ihFb.cjs} +10 -9
  199. package/dist/{titleGenerator-BGEzNWC9.mjs → titleGenerator-Uzbd4utr.mjs} +9 -8
  200. package/dist/{todo-DrZc76H5.mjs → todo-C9Ga-oEM.mjs} +6 -6
  201. package/dist/{todo-73g3NCIO.cjs → todo-pOMcEECE.cjs} +6 -6
  202. package/dist/{tools-CxJp4T1T.cjs → tools-BL7Byl_x.cjs} +1 -1
  203. package/dist/{tools-BtsrQnNS.mjs → tools-Cho7iIWf.mjs} +1 -1
  204. package/dist/{uninstall-DWNYvewQ.cjs → uninstall-CbayEVoV.cjs} +6 -6
  205. package/dist/{uninstall-DOb2mTwV.mjs → uninstall-CvZHVY9C.mjs} +3 -3
  206. package/dist/webPanels-B2_C2-3g.mjs +49 -0
  207. package/dist/webPanels-FCgFKvVe.cjs +53 -0
  208. package/package.json +8 -7
  209. package/dist/machineMetadata-B1H9gNbN.mjs +0 -39
  210. package/dist/machineMetadata-DcUupMje.cjs +0 -42
  211. package/dist/messageBuffer-BWlGgR3A.mjs +0 -71
  212. package/dist/messageBuffer-fJMH6uY8.cjs +0 -73
  213. package/dist/projectPath-ChLhdOyt.cjs +0 -13
  214. package/dist/selfCheck-CF7XGJPb.mjs +0 -84
  215. package/dist/sessionModeFile-ByLbXTbg.mjs +0 -32
  216. package/dist/sessionModeFile-CLLdidiJ.cjs +0 -36
  217. package/dist/spawnAgents-Bw6j4tqz.mjs +0 -45
@@ -1,28 +1,29 @@
1
1
  'use strict';
2
2
 
3
3
  var chalk = require('chalk');
4
- var sessionOps = require('./sessionOps-BAnr7n8t.cjs');
4
+ var sessionOps = require('./sessionOps-BrGiU9-s.cjs');
5
5
  var ids = require('./ids-B6ZC0HGt.cjs');
6
- var peerTools = require('./peerTools-iy3_6Yc5.cjs');
7
- var persistence = require('./persistence-BfX72dne.cjs');
6
+ var peerTools = require('./peerTools-DQNlrcqM.cjs');
7
+ var persistence = require('./persistence-9BMYspxG.cjs');
8
8
  var path = require('node:path');
9
- var remoteSessionClient = require('./remoteSessionClient-BRTIOX5b.cjs');
9
+ var remoteSessionClient = require('./remoteSessionClient-D843fkzL.cjs');
10
10
  require('axios');
11
- require('./configuration-4TGMrjul.cjs');
11
+ require('./configuration-CYO-kPOS.cjs');
12
12
  require('node:fs');
13
13
  require('node:os');
14
- require('./package-DY4zTbKS.cjs');
14
+ require('./package-KhLqBDX9.cjs');
15
15
  require('node:fs/promises');
16
16
  require('./authRelay-Dy1qU9td.cjs');
17
17
  require('node:crypto');
18
18
  require('tweetnacl');
19
- require('./controlClient-BTaZlbC6.cjs');
20
- require('./logger-DXTWlPzP.cjs');
19
+ require('./controlClient-Bqv5v5OM.cjs');
20
+ require('./logger-CphW5nUE.cjs');
21
21
  require('node:util');
22
- require('./time-A6zR3Iy6.cjs');
22
+ require('./time-Cjv0zxQO.cjs');
23
23
  require('socket.io-client');
24
24
  require('./backgroundTaskActivity-CBvUdj39.cjs');
25
25
  require('zod');
26
+ require('./client-DJplzPjD.cjs');
26
27
 
27
28
  const MACHINE_ID_RE = /^[a-zA-Z0-9_-]{1,128}$/;
28
29
  const ACTIONS = ["list", "read", "stop", "archive", "approve", "deny", "peers", "message"];
@@ -67,7 +68,7 @@ function parseSessionsArgs(args) {
67
68
  } else if (arg === "--scope") {
68
69
  const value = args[++i];
69
70
  if (value === void 0) throw new Error("--scope requires a value");
70
- if (!peerTools.PEER_SCOPES.includes(value)) throw new Error(`--scope must be one of ${peerTools.PEER_SCOPES.join(", ")}`);
71
+ if (value !== "project" && !peerTools.PEER_SCOPES.includes(value)) throw new Error(`--scope must be one of ${[...peerTools.PEER_SCOPES, "project"].join(", ")}`);
71
72
  options.scope = value;
72
73
  } else if (arg === "--cwd") {
73
74
  const value = args[++i];
@@ -164,7 +165,7 @@ ${chalk.bold("Usage:")}
164
165
  very-happy sessions archive <id> [--json]
165
166
  very-happy sessions approve <id> <requestId> [--for-session] [--json]
166
167
  very-happy sessions deny <id> <requestId> [--reason <text>] [--json]
167
- very-happy sessions peers [--scope repo|cwd|machine] [--cwd <dir>] [--machine <id>] [--json]
168
+ very-happy sessions peers [--scope repo|cwd|machine|project] [--cwd <dir>] [--machine <id>] [--json]
168
169
  very-happy sessions message <id> <text> [--reply-to <msgId>] [--machine <id>] [--json]
169
170
 
170
171
  ${chalk.bold("Actions:")}
@@ -202,7 +203,10 @@ ${chalk.bold("Actions:")}
202
203
  managed session's shell, else this CLI) and tells the peer how to
203
204
  reply. A session another machine spawned is delivered through
204
205
  that machine's daemon, with this host named in the header.
205
- Refused for sessions that are not running, or terminal mirrors.
206
+ Refused for sessions that are not running, or terminal mirrors \u2014
207
+ except a session in the same project as the sender: there the
208
+ message is kept server-side and read on its next turn
209
+ (\`status: offline-stored\`, exit 0).
206
210
  \`delivered\` follows \`very-happy send\`: true only when a
207
211
  wrapper was attached before and after the POST (\`stored\` = it
208
212
  is on the server anyway).
@@ -227,7 +231,9 @@ ${chalk.bold("Options:")}
227
231
  --timeout <s> read --wait only: give up after <s> seconds (default 600).
228
232
  --for-session approve only: approved_for_session instead of approved.
229
233
  --reason <text> deny only: reason forwarded to the wrapper.
230
- --scope <s> peers only: repo (default) | cwd | machine.
234
+ --scope <s> peers only: repo (default) | cwd | machine | project
235
+ (project = the other sessions of the calling session's
236
+ Very Happy project on any machine).
231
237
  --cwd <dir> peers only: directory the scope is computed from
232
238
  (default: the process cwd, or HAPPY_SESSION_ID's cwd).
233
239
  --reply-to <id> message only: the peer message id being answered.
@@ -251,7 +257,8 @@ ${chalk.bold("Exit codes:")}
251
257
  2 read --wait: the turn had not ended when --timeout ran out (the
252
258
  partial state is still printed)
253
259
  0 success (approve/deny: the wrapper acknowledged the verdict; check
254
- \`settled\` in --json to see whether the request has left the pending set)
260
+ \`settled\` in --json to see whether the request has left the pending set;
261
+ message: delivered, or kept for a same-project session's next turn)
255
262
  1 bad arguments, unknown session, no machine of the account holds it (or
256
263
  its machine is offline / too old), request not pending, session not
257
264
  online, or the operation failed (including \`stop\` on a session the
@@ -284,6 +291,9 @@ function formatAccountSummaryLine(summary) {
284
291
  parts.push(summary.url);
285
292
  return parts.join(" ");
286
293
  }
294
+ function peerMessageExitCode(result) {
295
+ return result.delivered || result.status === "offline-stored" ? 0 : 1;
296
+ }
287
297
  function permissionFailureRecord(sessionId, requestId, error) {
288
298
  return { sessionId, requestId, error: error instanceof Error ? error.message : String(error) };
289
299
  }
@@ -375,8 +385,18 @@ async function handleSessionsCommand(args) {
375
385
  const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();
376
386
  const persisted = persistence.readPersistedSessions();
377
387
  const context = { self: () => peerTools.cliPeerSelf(process.env, cwd, persisted), readPersisted: () => persisted };
388
+ if (options.action === "peers" && options.scope === "project") {
389
+ const self = peerTools.cliPeerSelf(process.env, cwd, persisted);
390
+ const listing = await peerTools.executeSessionPeerTool("session_peers", { scope: "project" }, context);
391
+ if (options.json) console.log(JSON.stringify(listing));
392
+ else if (!listing.project) console.log(`Not in a project (${self.sessionId}).`);
393
+ else if (listing.peers.length === 0) console.log(`No other sessions in project "${listing.project.name}".`);
394
+ else for (const peer of listing.peers) console.log([peer.sessionId, `[${peer.state ?? "?"}]`, peer.title ? `title="${peer.title}"` : "", peer.agent ? `agent=${peer.agent}` : "", peer.machine ? `machine=${peer.machine}` : "", peer.doing ? `doing="${peer.doing}"` : "", peer.url].filter(Boolean).join(" "));
395
+ process.exit(0);
396
+ }
378
397
  if (options.action === "peers") {
379
- const listing = options.machine ? await remoteSessionClient.listRemotePeers(options.machine, { ...options.scope ? { scope: options.scope } : {}, ...options.cwd ? { cwd: options.cwd } : {} }) : await peerTools.listPeerSessions(context, options.scope ?? "repo");
398
+ const scope = options.scope === "project" ? void 0 : options.scope;
399
+ const listing = options.machine ? await remoteSessionClient.listRemotePeers(options.machine, { ...scope ? { scope } : {}, ...options.cwd ? { cwd: options.cwd } : {} }) : await peerTools.listPeerSessions(context, scope ?? "repo");
380
400
  if (options.json) {
381
401
  console.log(JSON.stringify(listing));
382
402
  } else if (listing.peers.length === 0) {
@@ -400,9 +420,11 @@ async function handleSessionsCommand(args) {
400
420
  const result = await peerTools.sendPeerMessage(context, { to: target, body: options.text, replyTo: options.replyTo, ...options.machine ? { machineId: options.machine } : {} });
401
421
  if (options.json) console.log(JSON.stringify(result));
402
422
  else if (result.delivered) console.log(`Message ${result.messageId} delivered to ${target}${result.machine ? ` on ${result.machine.host}` : ""}
423
+ ${result.url}`);
424
+ else if (result.status === "offline-stored") console.log(`Message ${result.messageId} ${result.note ?? "stored"} (${target} is not running; same project)
403
425
  ${result.url}`);
404
426
  else console.error(chalk.yellow("Not delivered:"), result.error ?? `session is ${result.status}`, result.stored ? "(stored server-side, unread)" : "");
405
- process.exit(result.delivered ? 0 : 1);
427
+ process.exit(peerMessageExitCode(result));
406
428
  } catch (error) {
407
429
  if (options.json) console.log(JSON.stringify({ delivered: false, to: target, error: error instanceof Error ? error.message : String(error) }));
408
430
  throw error;
@@ -509,4 +531,5 @@ ${result.url}`);
509
531
  exports.SESSIONS_HELP = SESSIONS_HELP;
510
532
  exports.handleSessionsCommand = handleSessionsCommand;
511
533
  exports.parseSessionsArgs = parseSessionsArgs;
534
+ exports.peerMessageExitCode = peerMessageExitCode;
512
535
  exports.permissionFailureRecord = permissionFailureRecord;
@@ -1,5 +1,5 @@
1
- import { c as configuration } from './configuration-DVrb61aY.mjs';
2
- import { s as startOfflineReconnection } from './api-Dib0dmqC.mjs';
1
+ import { c as configuration } from './configuration-PxzEJumr.mjs';
2
+ import { s as startOfflineReconnection } from './api-Hov8p7CA.mjs';
3
3
 
4
4
  function createOfflineSessionStub(sessionTag) {
5
5
  return {
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var configuration = require('./configuration-4TGMrjul.cjs');
4
- var api = require('./api-JANhFdZV.cjs');
3
+ var configuration = require('./configuration-CYO-kPOS.cjs');
4
+ var api = require('./api-DM7b1OKj.cjs');
5
5
 
6
6
  function createOfflineSessionStub(sessionTag) {
7
7
  return {
@@ -1,42 +1,43 @@
1
1
  'use strict';
2
2
 
3
+ var spawnAgents = require('./spawnAgents-DLNMlhWJ.cjs');
4
+ var client = require('./client-DJplzPjD.cjs');
3
5
  var chalk = require('chalk');
4
6
  var node_fs = require('node:fs');
5
7
  var path$1 = require('node:path');
6
- var controlClient = require('./controlClient-BTaZlbC6.cjs');
7
- var persistence = require('./persistence-BfX72dne.cjs');
8
- var spawnAgents = require('./spawnAgents-BVEaz35W.cjs');
8
+ var controlClient = require('./controlClient-Bqv5v5OM.cjs');
9
+ var persistence = require('./persistence-9BMYspxG.cjs');
9
10
  var path = require('./path-B7zW-WwE.cjs');
10
- var claudeSessionFork = require('./claudeSessionFork-kYCP1IJB.cjs');
11
- var codexAppServerClient = require('./codexAppServerClient-CRlBWGn3.cjs');
11
+ var claudeSessionFork = require('./claudeSessionFork-Be16vzGc.cjs');
12
+ var codexAppServerClient = require('./codexAppServerClient-PE-12AsW.cjs');
12
13
  var codexThreadFork = require('./codexThreadFork-DNekT4nQ.cjs');
13
- var sessionOps = require('./sessionOps-BAnr7n8t.cjs');
14
- var createSessionMetadata = require('./createSessionMetadata-B2NynaWZ.cjs');
15
- var logger = require('./logger-DXTWlPzP.cjs');
14
+ var sessionOps = require('./sessionOps-BrGiU9-s.cjs');
15
+ var createSessionMetadata = require('./createSessionMetadata-xz767pcG.cjs');
16
+ var logger = require('./logger-CphW5nUE.cjs');
16
17
  var forkBackfill = require('./forkBackfill-8eLDeS73.cjs');
17
- require('./configuration-4TGMrjul.cjs');
18
+ require('./index-Dv0Q48P3.cjs');
19
+ require('zod');
20
+ require('@paralleldrive/cuid2');
21
+ require('./configuration-CYO-kPOS.cjs');
18
22
  require('node:os');
19
- require('./package-DY4zTbKS.cjs');
23
+ require('./package-KhLqBDX9.cjs');
20
24
  require('node:fs/promises');
21
- require('zod');
22
25
  require('./authRelay-Dy1qU9td.cjs');
23
26
  require('node:crypto');
24
27
  require('tweetnacl');
25
- require('./index-_l1Sdmbi.cjs');
26
- require('@paralleldrive/cuid2');
27
28
  require('node:readline');
28
29
  require('node:child_process');
29
30
  require('cross-spawn');
30
31
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
31
32
  require('./manager-HrEj442o.cjs');
32
33
  require('@anthropic-ai/sandbox-runtime');
33
- require('./rateLimitWindows-Czb7_7cK.cjs');
34
+ require('./rateLimitWindows-YRIYVdo4.cjs');
34
35
  require('./processTree-CMHWlVse.cjs');
35
36
  require('axios');
36
- require('./time-A6zR3Iy6.cjs');
37
+ require('./time-Cjv0zxQO.cjs');
37
38
  require('socket.io-client');
38
39
  require('./backgroundTaskActivity-CBvUdj39.cjs');
39
- require('./projectPath-ChLhdOyt.cjs');
40
+ require('./projectPath-C3ioB4Bu.cjs');
40
41
  require('path');
41
42
  require('url');
42
43
  require('node:util');
@@ -142,6 +143,13 @@ function parseSpawnArgs(args) {
142
143
  if (value === void 0) throw new Error("--fork requires a session id");
143
144
  if (!/^[a-zA-Z0-9_-]{1,128}$/.test(value)) throw new Error(`Invalid session id for --fork: ${value}`);
144
145
  options.fork = value;
146
+ } else if (arg === "--project") {
147
+ const value = args[++i];
148
+ if (value === void 0) throw new Error("--project requires a project id");
149
+ if (!/^[a-zA-Z0-9_-]{1,128}$/.test(value)) throw new Error(`Invalid project id for --project: ${value}`);
150
+ options.project = value;
151
+ } else if (arg === "--no-project") {
152
+ options.noProject = true;
145
153
  } else if (arg === "--json") {
146
154
  options.json = true;
147
155
  } else if (arg === "--help" || arg === "-h") {
@@ -153,6 +161,9 @@ function parseSpawnArgs(args) {
153
161
  if (options.prompt !== void 0 && options.promptFile !== void 0) {
154
162
  throw new Error("--prompt and --prompt-file are mutually exclusive");
155
163
  }
164
+ if (options.project !== void 0 && options.noProject) {
165
+ throw new Error("--project and --no-project are mutually exclusive");
166
+ }
156
167
  return options;
157
168
  }
158
169
  function printHelp() {
@@ -162,9 +173,11 @@ ${chalk.bold("very-happy spawn")} - Spawn a remote session via the local daemon
162
173
  ${chalk.bold("Usage:")}
163
174
  very-happy spawn --dir <path> [--prompt <text> | --prompt-file <file>]
164
175
  [--spawned-by <name>] [--permission-mode <mode>]
165
- [--agent <name>] [--model <id>] [--env KEY=VALUE]... [--json]
176
+ [--agent <name>] [--model <id>] [--env KEY=VALUE]...
177
+ [--project <id> | --no-project] [--json]
166
178
  very-happy spawn --fork <sessionId> [--prompt \u2026] [--permission-mode <mode>]
167
- [--model <id>] [--spawned-by <name>] [--json]
179
+ [--model <id>] [--spawned-by <name>] [--project <id>]
180
+ [--json]
168
181
 
169
182
  ${chalk.bold("Options:")}
170
183
  --dir, -d <path> Working directory for the new session (required)
@@ -194,6 +207,12 @@ ${chalk.bold("Options:")}
194
207
  --env KEY=VALUE Extra environment for the session process. Repeatable.
195
208
  \${VAR} is expanded against the daemon's environment;
196
209
  an unresolved reference fails the spawn.
210
+ --project <id> Put the new session in this Very Happy project before
211
+ its first message (it then starts with the project's
212
+ instructions and decisions).
213
+ --no-project Do not inherit the project of the session that runs
214
+ this command (by default a session spawned from
215
+ inside a project session joins the same project).
197
216
  --json Machine-readable output: {"sessionId", "url",
198
217
  "permissionMode", \u2026}
199
218
  -h, --help Show this help
@@ -339,6 +358,15 @@ async function handleSpawnCommand(args) {
339
358
  console.error(chalk.red("Error:"), "The running daemon is too old to fork from the CLI (it spawned a fresh session, now stopped). Restart the daemon on this CLI version and retry.");
340
359
  process.exit(1);
341
360
  }
361
+ const projectChoice = spawnAgents.chooseProject({
362
+ project: options.project,
363
+ noProject: options.noProject,
364
+ parentSessionId: forkSource ? null : process.env.VH_PEER_SESSION_ID ?? null
365
+ });
366
+ const projectOutcome = await spawnAgents.joinProject(client.sharedProjectsClient(), sessionId, projectChoice);
367
+ if (options.project && !projectOutcome.joined) {
368
+ console.error(chalk.yellow("Warning:"), `Could not add the session to project ${options.project}: ${projectOutcome.reason}`);
369
+ }
342
370
  let promptError = null;
343
371
  let sentMeta = null;
344
372
  if (prompt !== void 0) {
@@ -364,6 +392,9 @@ async function handleSpawnCommand(args) {
364
392
  if (forkSource) {
365
393
  payload.forkedFrom = forkSource.parentSessionId;
366
394
  }
395
+ if (projectOutcome.joined) {
396
+ payload.project = { id: projectOutcome.projectId, via: projectOutcome.via };
397
+ }
367
398
  if (sentMeta && sentMeta.model !== void 0) {
368
399
  payload.model = sentMeta.model;
369
400
  }
@@ -1,39 +1,40 @@
1
+ import { r as resolveSpawnPermissionMode, c as chooseProject, j as joinProject, a as resolveFirstMessageMeta, s as sanitizeSpawnPermissionMode, A as ALLOWED_SPAWN_PERMISSION_MODES, S as SPAWN_AGENTS } from './spawnAgents-CgPMWexP.mjs';
2
+ import { s as sharedProjectsClient } from './client-Ca5Pcgy_.mjs';
1
3
  import chalk from 'chalk';
2
4
  import { readFileSync, statSync } from 'node:fs';
3
5
  import { resolve } from 'node:path';
4
- import { a as checkIfDaemonRunningAndCleanupStaleState, f as spawnDaemonSession, s as stopDaemonSession } from './controlClient-BYKyGyxj.mjs';
5
- import { b as readPersistedSessions } from './persistence-DTk4sNpd.mjs';
6
- import { r as resolveSpawnPermissionMode, a as resolveFirstMessageMeta, s as sanitizeSpawnPermissionMode, A as ALLOWED_SPAWN_PERMISSION_MODES, S as SPAWN_AGENTS } from './spawnAgents-Bw6j4tqz.mjs';
6
+ import { a as checkIfDaemonRunningAndCleanupStaleState, e as spawnDaemonSession, f as stopDaemonSession } from './controlClient-DoeYovwP.mjs';
7
+ import { c as readPersistedSessions } from './persistence-BFUOHW5h.mjs';
7
8
  import { g as getProjectPath } from './path-D2wdaNSk.mjs';
8
- import { f as forkSession, F as ForkSourceMissingError } from './claudeSessionFork-DvxMKAmY.mjs';
9
- import { C as CodexAppServerClient } from './codexAppServerClient-DvkpQgyv.mjs';
9
+ import { f as forkSession, F as ForkSourceMissingError } from './claudeSessionFork-GAVWhiKG.mjs';
10
+ import { C as CodexAppServerClient } from './codexAppServerClient-CO4G6OS4.mjs';
10
11
  import { f as forkCodexThread } from './codexThreadFork-R76RU5H0.mjs';
11
- import { e as sendUserMessage, f as readSessionMetadata, g as waitForSessionKey, s as sessionWebUrl } from './sessionOps-BVoXe12O.mjs';
12
- import { i as isValidSpawnOrigin } from './createSessionMetadata-8Fuj2-IV.mjs';
13
- import { l as logger } from './logger--vAVtXB_.mjs';
12
+ import { e as sendUserMessage, f as readSessionMetadata, g as waitForSessionKey, s as sessionWebUrl } from './sessionOps-C58iDeD5.mjs';
13
+ import { i as isValidSpawnOrigin } from './createSessionMetadata-DDIChCx8.mjs';
14
+ import { l as logger } from './logger-BUngm5Xg.mjs';
14
15
  import { w as waitForForkBackfill } from './forkBackfill-DYIjlN1Z.mjs';
15
- import './configuration-DVrb61aY.mjs';
16
+ import './index-C6Vn5Eac.mjs';
17
+ import 'zod';
18
+ import '@paralleldrive/cuid2';
19
+ import './configuration-PxzEJumr.mjs';
16
20
  import 'node:os';
17
- import './package-B7B03ejW.mjs';
21
+ import './package-7Ld1YMhh.mjs';
18
22
  import 'node:fs/promises';
19
- import 'zod';
20
23
  import './authRelay-DhQhkBvX.mjs';
21
24
  import 'node:crypto';
22
25
  import 'tweetnacl';
23
- import './index-Clqlu17M.mjs';
24
- import '@paralleldrive/cuid2';
25
26
  import 'node:readline';
26
27
  import 'node:child_process';
27
28
  import 'cross-spawn';
28
29
  import './contentLogMetadata-BlWI0egu.mjs';
29
30
  import './manager-BEsI4qt3.mjs';
30
31
  import '@anthropic-ai/sandbox-runtime';
31
- import './rateLimitWindows-XrJiiBpU.mjs';
32
+ import './rateLimitWindows-BkfuUB1a.mjs';
32
33
  import './processTree-CP5IvQ2Z.mjs';
33
34
  import 'axios';
34
- import './time-BuGWTVP6.mjs';
35
+ import './time-D3ETL7Jb.mjs';
35
36
  import 'socket.io-client';
36
- import './backgroundTaskActivity-BVwJBl02.mjs';
37
+ import './backgroundTaskActivity-8PdPxrvy.mjs';
37
38
  import './projectPath-BTBIMB57.mjs';
38
39
  import 'path';
39
40
  import 'url';
@@ -140,6 +141,13 @@ function parseSpawnArgs(args) {
140
141
  if (value === void 0) throw new Error("--fork requires a session id");
141
142
  if (!/^[a-zA-Z0-9_-]{1,128}$/.test(value)) throw new Error(`Invalid session id for --fork: ${value}`);
142
143
  options.fork = value;
144
+ } else if (arg === "--project") {
145
+ const value = args[++i];
146
+ if (value === void 0) throw new Error("--project requires a project id");
147
+ if (!/^[a-zA-Z0-9_-]{1,128}$/.test(value)) throw new Error(`Invalid project id for --project: ${value}`);
148
+ options.project = value;
149
+ } else if (arg === "--no-project") {
150
+ options.noProject = true;
143
151
  } else if (arg === "--json") {
144
152
  options.json = true;
145
153
  } else if (arg === "--help" || arg === "-h") {
@@ -151,6 +159,9 @@ function parseSpawnArgs(args) {
151
159
  if (options.prompt !== void 0 && options.promptFile !== void 0) {
152
160
  throw new Error("--prompt and --prompt-file are mutually exclusive");
153
161
  }
162
+ if (options.project !== void 0 && options.noProject) {
163
+ throw new Error("--project and --no-project are mutually exclusive");
164
+ }
154
165
  return options;
155
166
  }
156
167
  function printHelp() {
@@ -160,9 +171,11 @@ ${chalk.bold("very-happy spawn")} - Spawn a remote session via the local daemon
160
171
  ${chalk.bold("Usage:")}
161
172
  very-happy spawn --dir <path> [--prompt <text> | --prompt-file <file>]
162
173
  [--spawned-by <name>] [--permission-mode <mode>]
163
- [--agent <name>] [--model <id>] [--env KEY=VALUE]... [--json]
174
+ [--agent <name>] [--model <id>] [--env KEY=VALUE]...
175
+ [--project <id> | --no-project] [--json]
164
176
  very-happy spawn --fork <sessionId> [--prompt \u2026] [--permission-mode <mode>]
165
- [--model <id>] [--spawned-by <name>] [--json]
177
+ [--model <id>] [--spawned-by <name>] [--project <id>]
178
+ [--json]
166
179
 
167
180
  ${chalk.bold("Options:")}
168
181
  --dir, -d <path> Working directory for the new session (required)
@@ -192,6 +205,12 @@ ${chalk.bold("Options:")}
192
205
  --env KEY=VALUE Extra environment for the session process. Repeatable.
193
206
  \${VAR} is expanded against the daemon's environment;
194
207
  an unresolved reference fails the spawn.
208
+ --project <id> Put the new session in this Very Happy project before
209
+ its first message (it then starts with the project's
210
+ instructions and decisions).
211
+ --no-project Do not inherit the project of the session that runs
212
+ this command (by default a session spawned from
213
+ inside a project session joins the same project).
195
214
  --json Machine-readable output: {"sessionId", "url",
196
215
  "permissionMode", \u2026}
197
216
  -h, --help Show this help
@@ -337,6 +356,15 @@ async function handleSpawnCommand(args) {
337
356
  console.error(chalk.red("Error:"), "The running daemon is too old to fork from the CLI (it spawned a fresh session, now stopped). Restart the daemon on this CLI version and retry.");
338
357
  process.exit(1);
339
358
  }
359
+ const projectChoice = chooseProject({
360
+ project: options.project,
361
+ noProject: options.noProject,
362
+ parentSessionId: forkSource ? null : process.env.VH_PEER_SESSION_ID ?? null
363
+ });
364
+ const projectOutcome = await joinProject(sharedProjectsClient(), sessionId, projectChoice);
365
+ if (options.project && !projectOutcome.joined) {
366
+ console.error(chalk.yellow("Warning:"), `Could not add the session to project ${options.project}: ${projectOutcome.reason}`);
367
+ }
340
368
  let promptError = null;
341
369
  let sentMeta = null;
342
370
  if (prompt !== void 0) {
@@ -362,6 +390,9 @@ async function handleSpawnCommand(args) {
362
390
  if (forkSource) {
363
391
  payload.forkedFrom = forkSource.parentSessionId;
364
392
  }
393
+ if (projectOutcome.joined) {
394
+ payload.project = { id: projectOutcome.projectId, via: projectOutcome.via };
395
+ }
365
396
  if (sentMeta && sentMeta.model !== void 0) {
366
397
  payload.model = sentMeta.model;
367
398
  }
@@ -0,0 +1,79 @@
1
+ import { g as getAgentCodeDefaults, n as normalizeAgentKey, h as isClaudeOpus55Model, j as supportsClaudeOpus55 } from './index-C6Vn5Eac.mjs';
2
+
3
+ function chooseProject(opts) {
4
+ if (opts.project) return { kind: "explicit", projectId: opts.project };
5
+ if (opts.noProject) return { kind: "none" };
6
+ if (opts.parentSessionId) return { kind: "lineage", parentSessionId: opts.parentSessionId };
7
+ return { kind: "none" };
8
+ }
9
+ async function joinProject(client, sessionId, choice, opts = {}) {
10
+ if (choice.kind === "none") return { joined: false, reason: "no project" };
11
+ const timeoutMs = opts.timeoutMs ?? 3e3;
12
+ const work = async () => {
13
+ let projectId;
14
+ let via;
15
+ if (choice.kind === "explicit") {
16
+ projectId = choice.projectId;
17
+ via = opts.via ?? "explicit";
18
+ } else {
19
+ const parent = await client.membership(choice.parentSessionId);
20
+ if (!parent.projectId) return { joined: false, reason: "parent has no project" };
21
+ projectId = parent.projectId;
22
+ via = "lineage";
23
+ }
24
+ await client.addMembers(projectId, [sessionId], via);
25
+ return { joined: true, projectId, via };
26
+ };
27
+ try {
28
+ return await Promise.race([
29
+ work(),
30
+ new Promise((resolve) => setTimeout(() => resolve({ joined: false, reason: "timeout" }), timeoutMs).unref?.())
31
+ ]);
32
+ } catch (error) {
33
+ return { joined: false, reason: error instanceof Error ? error.message : String(error) };
34
+ }
35
+ }
36
+
37
+ function resolveSpawnPermissionMode(agent, explicit) {
38
+ return explicit ?? getAgentCodeDefaults(agent ?? "claude").permissionMode;
39
+ }
40
+ function outboundPermissionMode(agent, mode) {
41
+ const key = normalizeAgentKey(agent ?? "claude");
42
+ if ((key === "claude" || key === "pi") && mode === "yolo") return "bypassPermissions";
43
+ return mode;
44
+ }
45
+ function resolveFirstMessageMeta(input) {
46
+ const meta = {
47
+ permissionMode: outboundPermissionMode(input.agent, input.permissionMode)
48
+ };
49
+ if (input.explicitModel !== void 0) {
50
+ meta.model = input.explicitModel === "default" ? null : input.explicitModel;
51
+ }
52
+ if (normalizeAgentKey(input.agent ?? "claude") !== "claude") return meta;
53
+ if (meta.model === void 0) {
54
+ const model = getAgentCodeDefaults("claude").modelMode;
55
+ const runnable = !isClaudeOpus55Model(model) || supportsClaudeOpus55({ capabilities: input.capabilities ?? null });
56
+ meta.model = runnable && model !== "default" ? model : null;
57
+ }
58
+ meta.effort = null;
59
+ return meta;
60
+ }
61
+
62
+ const ALLOWED_SPAWN_PERMISSION_MODES = [
63
+ "default",
64
+ "acceptEdits",
65
+ "plan",
66
+ "yolo",
67
+ "bypassPermissions"
68
+ ];
69
+ function sanitizeSpawnPermissionMode(value) {
70
+ if (typeof value !== "string") return null;
71
+ return ALLOWED_SPAWN_PERMISSION_MODES.includes(value) ? value : null;
72
+ }
73
+
74
+ const SPAWN_AGENTS = ["claude", "codex", "gemini", "openclaw", "pi"];
75
+ function isSpawnAgent(value) {
76
+ return typeof value === "string" && SPAWN_AGENTS.includes(value);
77
+ }
78
+
79
+ export { ALLOWED_SPAWN_PERMISSION_MODES as A, SPAWN_AGENTS as S, resolveFirstMessageMeta as a, chooseProject as c, isSpawnAgent as i, joinProject as j, resolveSpawnPermissionMode as r, sanitizeSpawnPermissionMode as s };
@@ -1,6 +1,40 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-_l1Sdmbi.cjs');
3
+ var index = require('./index-Dv0Q48P3.cjs');
4
+
5
+ function chooseProject(opts) {
6
+ if (opts.project) return { kind: "explicit", projectId: opts.project };
7
+ if (opts.noProject) return { kind: "none" };
8
+ if (opts.parentSessionId) return { kind: "lineage", parentSessionId: opts.parentSessionId };
9
+ return { kind: "none" };
10
+ }
11
+ async function joinProject(client, sessionId, choice, opts = {}) {
12
+ if (choice.kind === "none") return { joined: false, reason: "no project" };
13
+ const timeoutMs = opts.timeoutMs ?? 3e3;
14
+ const work = async () => {
15
+ let projectId;
16
+ let via;
17
+ if (choice.kind === "explicit") {
18
+ projectId = choice.projectId;
19
+ via = opts.via ?? "explicit";
20
+ } else {
21
+ const parent = await client.membership(choice.parentSessionId);
22
+ if (!parent.projectId) return { joined: false, reason: "parent has no project" };
23
+ projectId = parent.projectId;
24
+ via = "lineage";
25
+ }
26
+ await client.addMembers(projectId, [sessionId], via);
27
+ return { joined: true, projectId, via };
28
+ };
29
+ try {
30
+ return await Promise.race([
31
+ work(),
32
+ new Promise((resolve) => setTimeout(() => resolve({ joined: false, reason: "timeout" }), timeoutMs).unref?.())
33
+ ]);
34
+ } catch (error) {
35
+ return { joined: false, reason: error instanceof Error ? error.message : String(error) };
36
+ }
37
+ }
4
38
 
5
39
  function resolveSpawnPermissionMode(agent, explicit) {
6
40
  return explicit ?? index.getAgentCodeDefaults(agent ?? "claude").permissionMode;
@@ -46,7 +80,9 @@ function isSpawnAgent(value) {
46
80
 
47
81
  exports.ALLOWED_SPAWN_PERMISSION_MODES = ALLOWED_SPAWN_PERMISSION_MODES;
48
82
  exports.SPAWN_AGENTS = SPAWN_AGENTS;
83
+ exports.chooseProject = chooseProject;
49
84
  exports.isSpawnAgent = isSpawnAgent;
85
+ exports.joinProject = joinProject;
50
86
  exports.resolveFirstMessageMeta = resolveFirstMessageMeta;
51
87
  exports.resolveSpawnPermissionMode = resolveSpawnPermissionMode;
52
88
  exports.sanitizeSpawnPermissionMode = sanitizeSpawnPermissionMode;
@@ -1,7 +1,7 @@
1
1
  import { spawn } from 'cross-spawn';
2
2
  import { join } from 'node:path';
3
3
  import { p as projectPath } from './projectPath-BTBIMB57.mjs';
4
- import { l as logger } from './logger--vAVtXB_.mjs';
4
+ import { l as logger } from './logger-BUngm5Xg.mjs';
5
5
  import { existsSync } from 'node:fs';
6
6
 
7
7
  let cachedRuntime = null;
@@ -2,8 +2,8 @@
2
2
 
3
3
  var spawn = require('cross-spawn');
4
4
  var path = require('node:path');
5
- var projectPath = require('./projectPath-ChLhdOyt.cjs');
6
- var logger = require('./logger-DXTWlPzP.cjs');
5
+ var projectPath = require('./projectPath-C3ioB4Bu.cjs');
6
+ var logger = require('./logger-CphW5nUE.cjs');
7
7
  var node_fs = require('node:fs');
8
8
 
9
9
  let cachedRuntime = null;
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var logger = require('./logger-DXTWlPzP.cjs');
4
- var controlClient = require('./controlClient-BTaZlbC6.cjs');
5
- var rateLimitWindows = require('./rateLimitWindows-Czb7_7cK.cjs');
3
+ var logger = require('./logger-CphW5nUE.cjs');
4
+ var controlClient = require('./controlClient-Bqv5v5OM.cjs');
5
+ var rateLimitWindows = require('./rateLimitWindows-YRIYVdo4.cjs');
6
6
 
7
7
  function createRateLimitReporter(send, now = Date.now) {
8
8
  const last = /* @__PURE__ */ new Map();
@@ -1,6 +1,6 @@
1
- import { l as logger } from './logger--vAVtXB_.mjs';
2
- import { r as reportRateLimitsToDaemon } from './controlClient-BYKyGyxj.mjs';
3
- import { f as fromCodexRateLimits, a as fromClaudeRateLimitInfo, r as rateLimitReportSignature, R as RATE_LIMIT_OBSERVED_REFRESH_MS } from './rateLimitWindows-XrJiiBpU.mjs';
1
+ import { l as logger } from './logger-BUngm5Xg.mjs';
2
+ import { r as reportRateLimitsToDaemon } from './controlClient-DoeYovwP.mjs';
3
+ import { f as fromCodexRateLimits, a as fromClaudeRateLimitInfo, r as rateLimitReportSignature, R as RATE_LIMIT_OBSERVED_REFRESH_MS } from './rateLimitWindows-BkfuUB1a.mjs';
4
4
 
5
5
  function createRateLimitReporter(send, now = Date.now) {
6
6
  const last = /* @__PURE__ */ new Map();
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var logger = require('./logger-DXTWlPzP.cjs');
3
+ var logger = require('./logger-CphW5nUE.cjs');
4
4
  var fs = require('fs/promises');
5
5
 
6
6
  function startFileWatcher(file, onFileChange, options = {}) {
@@ -1,4 +1,4 @@
1
- import { l as logger } from './logger--vAVtXB_.mjs';
1
+ import { l as logger } from './logger-BUngm5Xg.mjs';
2
2
  import { watch } from 'fs/promises';
3
3
 
4
4
  function startFileWatcher(file, onFileChange, options = {}) {
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ var api = require('./api-DM7b1OKj.cjs');
4
+
5
+ const DAEMON_SESSION_CREATE_RETRY_DELAYS_MS = [500, 1e3, 2e3, 3e3];
6
+ class SessionStartupError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "SessionStartupError";
10
+ }
11
+ }
12
+ async function createSessionForStartup(create, opts) {
13
+ if (opts.startedBy !== "daemon") return create();
14
+ const delays = opts.delaysMs ?? DAEMON_SESSION_CREATE_RETRY_DELAYS_MS;
15
+ const sleep = opts.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
16
+ for (let attempt = 0; ; attempt++) {
17
+ const session = await create();
18
+ if (session) return session;
19
+ if (attempt >= delays.length) break;
20
+ opts.log?.(`[START] Session create attempt ${attempt + 1} failed (${api.connectionState.describe("Session creation") ?? "server unavailable"}); retrying in ${delays[attempt]}ms`);
21
+ await sleep(delays[attempt]);
22
+ }
23
+ throw new SessionStartupError(`Could not create the session on the server after ${delays.length + 1} attempts: ${api.connectionState.describe("Session creation") ?? "server unavailable"}`);
24
+ }
25
+
26
+ exports.createSessionForStartup = createSessionForStartup;