very-happy-cli 0.2.203 → 0.2.204

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 (222) hide show
  1. package/dist/{AcpBackend-CAMuhS0Z.mjs → AcpBackend-BBfcpIDj.mjs} +3 -3
  2. package/dist/{AcpBackend-DReFgpYD.cjs → AcpBackend-BupxHXGp.cjs} +3 -3
  3. package/dist/{AcpSessionManager-CJOxMFCF.mjs → AcpSessionManager-B9UkPYGi.mjs} +2 -2
  4. package/dist/{AcpSessionManager-BZKM-sCt.cjs → AcpSessionManager-JJrnenKM.cjs} +2 -2
  5. package/dist/{BasePermissionHandler-BBR9Gkob.cjs → BasePermissionHandler-86_xnisC.cjs} +1 -1
  6. package/dist/{BasePermissionHandler-BgX73mQ5.mjs → BasePermissionHandler-tGylJLUH.mjs} +1 -1
  7. package/dist/{account-hy0rztXY.mjs → account-BRqUOj_D.mjs} +11 -11
  8. package/dist/{account-41PkJ9nx.cjs → account-C91_R-kw.cjs} +11 -11
  9. package/dist/{accountService-DEpIq6CF.mjs → accountService-CqrWNH8K.mjs} +4 -4
  10. package/dist/{accountService-Cns8UYGI.cjs → accountService-SOeB_21A.cjs} +4 -4
  11. package/dist/{acpSessionResume-5El4xksf.mjs → acpSessionResume-CZQ91ano.mjs} +1 -1
  12. package/dist/{acpSessionResume-DmOPXKpC.cjs → acpSessionResume-DK8EjIY0.cjs} +1 -1
  13. package/dist/{agentHome-DUxArmak.mjs → agentHome-71zGywwx.mjs} +4 -4
  14. package/dist/{agentHome-BXaVMqHX.cjs → agentHome-BZvbPuy1.cjs} +4 -4
  15. package/dist/{api-D8ZDxBWw.mjs → api-BYh1VGBa.mjs} +107 -18
  16. package/dist/{api-ChhFBuB0.cjs → api-BoJA-zK3.cjs} +107 -18
  17. package/dist/{apiMachine-qav2pnk5.mjs → apiMachine--_eI4PTv.mjs} +105 -21
  18. package/dist/{apiMachine-MPwddFXq.cjs → apiMachine-CA58NM_V.cjs} +105 -21
  19. package/dist/{attachmentContent-BfSQxccA.mjs → attachmentContent-D95cCBX5.mjs} +2 -2
  20. package/dist/{attachmentContent-f5gwnv9J.cjs → attachmentContent-y621KwMz.cjs} +2 -2
  21. package/dist/{auth-thi2T_T8.cjs → auth-CAkpHr8F.cjs} +5 -5
  22. package/dist/{auth-BxNuFv_0.mjs → auth-DCzFx5BN.mjs} +8 -8
  23. package/dist/{auth-xW7SDE_7.mjs → auth-DRJ_WPn3.mjs} +5 -5
  24. package/dist/{auth-DkPAHXLj.cjs → auth-Dofm64Kp.cjs} +8 -8
  25. package/dist/{auto-DmXTwayU.mjs → auto-CrgOy5OR.mjs} +18 -18
  26. package/dist/{auto-BiRlQ4tm.cjs → auto-D4IBwJEE.cjs} +18 -18
  27. package/dist/{bootstrap-EGhaCmXy.cjs → bootstrap-D16MMPNP.cjs} +2 -2
  28. package/dist/{bootstrap-pGaFGbWO.mjs → bootstrap-PnL2FX64.mjs} +2 -2
  29. package/dist/{browser-BYSYzXvP.mjs → browser-D2enJJfv.mjs} +1 -1
  30. package/dist/{browser-DSxpOnPb.cjs → browser-DK2GfyEr.cjs} +1 -1
  31. package/dist/{claudeAccountEnv-Btp39mfa.cjs → claudeAccountEnv-BTZjHTpF.cjs} +1 -1
  32. package/dist/{claudeAccountEnv-DowsOlDB.mjs → claudeAccountEnv-C6Wl-ZbT.mjs} +1 -1
  33. package/dist/{claudeLocal-bDarWqaU.mjs → claudeLocal-BbzN1qly.mjs} +5 -5
  34. package/dist/{claudeLocal-ClqHmkk6.cjs → claudeLocal-DaqiRW9N.cjs} +5 -5
  35. package/dist/{claudeLocalLauncher-Bxi0_eW9.cjs → claudeLocalLauncher-B0qbyOUc.cjs} +10 -10
  36. package/dist/{claudeLocalLauncher-Ccpj2KgW.mjs → claudeLocalLauncher-D7bhZ9rp.mjs} +10 -10
  37. package/dist/claudeLongContext-BR_zdjUp.cjs +239 -0
  38. package/dist/claudeLongContext-CZ60xo5p.mjs +219 -0
  39. package/dist/{claudeSessionFork-Cize0Y2T.mjs → claudeSessionFork-BPF3cpGs.mjs} +1 -1
  40. package/dist/{claudeSessionFork-nyNFjgaf.cjs → claudeSessionFork-lcajftLB.cjs} +1 -1
  41. package/dist/{client-DO8DNDC3.mjs → client-BH4s6mzX.mjs} +2 -2
  42. package/dist/{client-CgMVIP7v.mjs → client-BHt14nix.mjs} +2 -2
  43. package/dist/{client-DP8FabOE.cjs → client-ByK8-iRd.cjs} +3 -3
  44. package/dist/{client-Cddb1dhi.cjs → client-CqmT_ur8.cjs} +2 -2
  45. package/dist/{client-6Y6O72Uq.cjs → client-D5_YDMpA.cjs} +2 -2
  46. package/dist/{client-Wr_BiOon.mjs → client-Og5iNZ6S.mjs} +16 -7
  47. package/dist/{client-CX8kRedW.mjs → client-t1vQ7gho.mjs} +3 -3
  48. package/dist/{client-CMKgB-76.cjs → client-xA44FUnf.cjs} +16 -7
  49. package/dist/codex/happyMcpStdioBridge.cjs +20 -19
  50. package/dist/codex/happyMcpStdioBridge.mjs +20 -19
  51. package/dist/{codexAccount-CieIQLOX.mjs → codexAccount-BPQ-lPhH.mjs} +1 -1
  52. package/dist/{codexAccount-D-OBY29W.cjs → codexAccount-BjaHvmKH.cjs} +1 -1
  53. package/dist/{codexAppServerClient-D-cD2Dfj.mjs → codexAppServerClient-CvL3eBlM.mjs} +3 -3
  54. package/dist/{codexAppServerClient-EzrHWYhX.cjs → codexAppServerClient-CyLtj1kP.cjs} +3 -3
  55. package/dist/{codexCommand-BMcXtvU3.cjs → codexCommand-B0Slfvne.cjs} +67 -56
  56. package/dist/{codexCommand-D79GnRhB.mjs → codexCommand-CXytYlk9.mjs} +67 -56
  57. package/dist/{codexTermination-CF6xiFbb.cjs → codexTermination-CykPnK3G.cjs} +1 -1
  58. package/dist/{codexTermination-CK1MYJT7.mjs → codexTermination-D0sBaTvW.mjs} +1 -1
  59. package/dist/{config-F6zSRyk2.cjs → config-7Z5qIB3k.cjs} +3 -3
  60. package/dist/{config-Crn1mNgr.mjs → config-DeXK_5y4.mjs} +3 -3
  61. package/dist/{configuration-Cl9kOv09.cjs → configuration-CDqmWkHO.cjs} +1 -1
  62. package/dist/{configuration-i9MVy0a5.mjs → configuration-D_YrWa_i.mjs} +1 -1
  63. package/dist/{connect-CiA13Xm4.mjs → connect-CivOym_v.mjs} +13 -13
  64. package/dist/{connect-ClklWmnI.cjs → connect-D_tzdR4l.cjs} +13 -13
  65. package/dist/{context-DvdZsGgl.mjs → context-DXfkj_FL.mjs} +1 -1
  66. package/dist/{context-BxODP3mG.cjs → context-k2CbuBtp.cjs} +1 -1
  67. package/dist/{controlClient-DxCQKfqe.cjs → controlClient-BS86Ksm8.cjs} +12 -3
  68. package/dist/{controlClient-D6vqMUfi.mjs → controlClient-Daki7wgo.mjs} +12 -4
  69. package/dist/{createSessionMetadata-B_NZvmhm.cjs → createSessionMetadata-2s80RDL1.cjs} +2 -2
  70. package/dist/{createSessionMetadata-BuAVB-xI.mjs → createSessionMetadata-B_hQ8lDn.mjs} +2 -2
  71. package/dist/{daemonAccounts-ciidbU2h.cjs → daemonAccounts-BOoI7-sw.cjs} +2 -2
  72. package/dist/{daemonAccounts-D5shoCLt.mjs → daemonAccounts-BtkmoJmC.mjs} +3 -3
  73. package/dist/{defaultPermissionMode-DgeiMMqy.mjs → defaultPermissionMode-CYQi7vqJ.mjs} +1 -1
  74. package/dist/{defaultPermissionMode-Cs_Tv83b.cjs → defaultPermissionMode-DmLYaaL8.cjs} +1 -1
  75. package/dist/{deterministicJson-B9XrEawW.mjs → deterministicJson-DKiOtrSA.mjs} +23 -16
  76. package/dist/{deterministicJson-kM2OdGZu.cjs → deterministicJson-lwG_VzWd.cjs} +23 -16
  77. package/dist/{doctor-DiPRqsqg.cjs → doctor-C0kONAQn.cjs} +7 -7
  78. package/dist/{doctor-HHS4YegX.mjs → doctor-DegBfYjz.mjs} +7 -7
  79. package/dist/{downloadTarget-osB-mGh0.cjs → downloadTarget-BTEVg8t6.cjs} +6 -6
  80. package/dist/{downloadTarget-Cd8hx54t.mjs → downloadTarget-osakJyyA.mjs} +6 -6
  81. package/dist/{ensureDaemonRunning-C0iDtuL7.mjs → ensureDaemonRunning-ED6UVEbk.mjs} +5 -5
  82. package/dist/{ensureDaemonRunning-CtBvPHVB.cjs → ensureDaemonRunning-vxHxmXo2.cjs} +5 -5
  83. package/dist/exitNotice-BhRrv8dx.cjs +88 -0
  84. package/dist/exitNotice-D1tMULzu.mjs +79 -0
  85. package/dist/{forkBackfill-DYIjlN1Z.mjs → forkBackfill-C9EfJ64O.mjs} +28 -2
  86. package/dist/{forkBackfill-8eLDeS73.cjs → forkBackfill-D2WW91fz.cjs} +28 -1
  87. package/dist/{format-B5V7ie8N.cjs → format-9KvRMdvY.cjs} +1 -1
  88. package/dist/{format-Dc5zMslz.mjs → format-DJwRUrQm.mjs} +1 -1
  89. package/dist/{handleResumeCommand-vcD2qcAM.cjs → handleResumeCommand-0lsgLgBB.cjs} +5 -5
  90. package/dist/{handleResumeCommand-xrOAA1qI.mjs → handleResumeCommand-PfKmR-hv.mjs} +5 -5
  91. package/dist/{index-iFVMrlPo.mjs → index-BNcFxRSt.mjs} +4 -4
  92. package/dist/{index-44o_qMvE.cjs → index-BYL_X3gP.cjs} +27 -6
  93. package/dist/{index-AyDwQ6FG.cjs → index-B_narjYR.cjs} +45 -44
  94. package/dist/{index-Cl-WkB_6.cjs → index-Bm_9wBaO.cjs} +4 -4
  95. package/dist/{index-C_ePuQwB.cjs → index-C7yXrMau.cjs} +3 -3
  96. package/dist/{index-B7pKBIcn.mjs → index-CUJZx4cs.mjs} +3 -3
  97. package/dist/{index-DIKJMfs2.mjs → index-CUeuMsap.mjs} +4 -4
  98. package/dist/{index-B7CXMlrz.mjs → index-D1rxFJ2b.mjs} +46 -45
  99. package/dist/{index-CiRMvS73.mjs → index-DWk-WTU-.mjs} +24 -7
  100. package/dist/{index-D0rCXp-e.cjs → index-l8Xg3Mbf.cjs} +4 -4
  101. package/dist/index.cjs +2 -2
  102. package/dist/index.mjs +2 -2
  103. package/dist/{install-yqS4y1cm.mjs → install-B593oYZs.mjs} +3 -3
  104. package/dist/{install-BgBgsOlS.cjs → install-C0I1a5sL.cjs} +3 -3
  105. package/dist/{issue-D7liK6bR.cjs → issue-CJrXCpnf.cjs} +8 -8
  106. package/dist/{issue-aKZd7J55.mjs → issue-D9ukoK-U.mjs} +8 -8
  107. package/dist/lib.cjs +12 -12
  108. package/dist/lib.d.cts +42 -1
  109. package/dist/lib.d.mts +42 -1
  110. package/dist/lib.mjs +12 -12
  111. package/dist/{localHappyAgentAuth-B2JJxlE9.mjs → localHappyAgentAuth-CxNcSjMM.mjs} +1 -1
  112. package/dist/{localHappyAgentAuth-Dm9obisi.cjs → localHappyAgentAuth-D3GKuEC2.cjs} +1 -1
  113. package/dist/{logger-BiKmiREe.mjs → logger-BcdURxNR.mjs} +2 -2
  114. package/dist/{logger-BtWBoP60.cjs → logger-C8anCmdW.cjs} +2 -2
  115. package/dist/{machineMetadata-CiyO9wm-.mjs → machineMetadata-BQaQQk6Z.mjs} +3 -3
  116. package/dist/{machineMetadata-C0-LyMsb.cjs → machineMetadata-DYWtdEtE.cjs} +3 -3
  117. package/dist/{main-C7hKf5hG.cjs → main-Bw7qSCWA.cjs} +48 -48
  118. package/dist/{main-BP2TBnp5.mjs → main-KsUdHnwc.mjs} +48 -48
  119. package/dist/{mcp-DO00rr9n.cjs → mcp-CxPUFOEd.cjs} +20 -18
  120. package/dist/{mcp-Cn4k-PXb.mjs → mcp-OeLaQ2XR.mjs} +20 -18
  121. package/dist/{mirrorProtocol-DDtEN49F.mjs → mirrorProtocol-Sj0yEHHU.mjs} +3 -3
  122. package/dist/{mirrorProtocol-DwO8QgLM.cjs → mirrorProtocol-cTQcrW55.cjs} +3 -3
  123. package/dist/{package-Djdgx8nb.cjs → package-DkpXQvp1.cjs} +7 -7
  124. package/dist/{package-CIW5lwaN.mjs → package-Dx3hbh9J.mjs} +7 -7
  125. package/dist/{panels-DMLtEOtJ.cjs → panels-CPNZnwCH.cjs} +5 -5
  126. package/dist/{panels-BpfVEvwF.mjs → panels-DKYO14Sq.mjs} +5 -5
  127. package/dist/{peerTools-CQ60fUPp.mjs → peerTools-DYFslv6R.mjs} +5 -5
  128. package/dist/{peerTools-fYuKq3ev.cjs → peerTools-DpCWFxI6.cjs} +5 -5
  129. package/dist/{persistence-D_zVC4Xz.mjs → persistence-3iZXGbfb.mjs} +2 -2
  130. package/dist/{persistence-BOEZtiKb.cjs → persistence-Ch78xygf.cjs} +2 -2
  131. package/dist/{piRunnerArgs-Dz9P62db.cjs → piRunnerArgs-CA6jqQ0k.cjs} +1 -1
  132. package/dist/{piRunnerArgs-DE_YXvS1.mjs → piRunnerArgs-DEuYl6FL.mjs} +1 -1
  133. package/dist/{piRuntime-Du62fjeU.cjs → piRuntime-BIVHf-hN.cjs} +1 -1
  134. package/dist/{piRuntime-8SbpRmNA.mjs → piRuntime-CyN43ILm.mjs} +1 -1
  135. package/dist/{piTerminal-Cl45kac0.mjs → piTerminal-DXz5L73L.mjs} +22 -20
  136. package/dist/{piTerminal-CGAw7WDW.cjs → piTerminal-Hw4StZWN.cjs} +22 -20
  137. package/dist/{pushNotifications-B19lT5mY.cjs → pushNotifications-D2ejrxlN.cjs} +17 -3
  138. package/dist/{pushNotifications-RVpbqrxR.mjs → pushNotifications-Db1NGJiA.mjs} +17 -3
  139. package/dist/{query-DBRR3TOO.mjs → query-CeYpZWVb.mjs} +1 -1
  140. package/dist/{query-CNWdX2r5.cjs → query-velpFYxW.cjs} +1 -1
  141. package/dist/{rateLimitWindows-DX5y23x_.mjs → rateLimitWindows-BSQttrPk.mjs} +1 -1
  142. package/dist/{rateLimitWindows-mfdokrkQ.cjs → rateLimitWindows-C78D8Uf-.cjs} +1 -1
  143. package/dist/{reconnectGate-DSxYUCWy.mjs → reconnectGate-Ie4nSKNl.mjs} +1 -1
  144. package/dist/{reconnectGate-B8ltzSJD.cjs → reconnectGate-S9yNiuY7.cjs} +1 -1
  145. package/dist/{registerCommonHandlers-Y2siJGwL.cjs → registerCommonHandlers-51llVpLx.cjs} +2 -2
  146. package/dist/{registerCommonHandlers-CQDRKlkG.mjs → registerCommonHandlers-BR7BeGX3.mjs} +2 -2
  147. package/dist/{registerKillSessionHandler-B0pMZOdH.cjs → registerKillSessionHandler-BjY79qBi.cjs} +6 -6
  148. package/dist/{registerKillSessionHandler-U4Dxtohy.mjs → registerKillSessionHandler-RbWPmKnK.mjs} +6 -6
  149. package/dist/{registerSideQuestionHandler--ruKhCdY.cjs → registerSideQuestionHandler-B1Xk7dFK.cjs} +4 -4
  150. package/dist/{registerSideQuestionHandler-DM1QqTxf.mjs → registerSideQuestionHandler-BbYT7QfR.mjs} +4 -4
  151. package/dist/{remoteSessionClient-T-Raoiy6.mjs → remoteSessionClient-Ddns3U8M.mjs} +5 -5
  152. package/dist/{remoteSessionClient-CjINaEs_.cjs → remoteSessionClient-r-UnqHor.cjs} +5 -5
  153. package/dist/{reportProgressTool-DDfL1OY7.cjs → reportProgressTool-ByadxJtc.cjs} +5 -5
  154. package/dist/{reportProgressTool-Stg0xrjF.mjs → reportProgressTool-C3sf9D8m.mjs} +5 -5
  155. package/dist/{run-Dq48xBtw.mjs → run-jsINwBOz.mjs} +200 -55
  156. package/dist/{run-BoSVfVCZ.cjs → run-r5sY3wHk.cjs} +200 -55
  157. package/dist/{runClaude-D8ScJdJU.cjs → runClaude-CRKsRfnq.cjs} +53 -38
  158. package/dist/{runClaude-CJe5atrS.mjs → runClaude-D8CuiZhi.mjs} +44 -29
  159. package/dist/{runClaudeDeps-4RFRR4cY.cjs → runClaudeDeps-BiVzNIE6.cjs} +129 -61
  160. package/dist/{runClaudeDeps-CL3goCXG.mjs → runClaudeDeps-CUuPWcg9.mjs} +125 -57
  161. package/dist/{runGemini-BcbNxgsA.cjs → runGemini-DANnc0BW.cjs} +36 -35
  162. package/dist/{runGemini-DZv6jPxV.mjs → runGemini-cqVZjPT6.mjs} +36 -35
  163. package/dist/{runOpenClaw-CRqCoj-_.mjs → runOpenClaw-B6V2nz8J.mjs} +18 -18
  164. package/dist/{runOpenClaw-BeSivE0X.cjs → runOpenClaw-CGwc6mfJ.cjs} +18 -18
  165. package/dist/{sandbox-xflHChws.cjs → sandbox-CNheYPva.cjs} +4 -4
  166. package/dist/{sandbox-DAvJJZcV.mjs → sandbox-JYBMckKE.mjs} +4 -4
  167. package/dist/{selfCheck-DZwdgBg0.cjs → selfCheck-DtSEBt0g.cjs} +40 -40
  168. package/dist/selfCheck-Jjy_wMw3.mjs +89 -0
  169. package/dist/{send-Co_l_Nmg.mjs → send-BHrbbGJ7.mjs} +8 -8
  170. package/dist/{send-ConAuYqL.cjs → send-DNdJR3n8.cjs} +8 -8
  171. package/dist/{server-by6kezmM.cjs → server-CvP_b3eb.cjs} +6 -6
  172. package/dist/{server-D1Qrmxl7.mjs → server-DhQjVsyZ.mjs} +4 -4
  173. package/dist/{sessionLock-DFrwAnwR.mjs → sessionLock-5i516L-w.mjs} +21 -4
  174. package/dist/{sessionLock-Db_uQcUP.cjs → sessionLock-UkF8M3j5.cjs} +22 -3
  175. package/dist/{sessionOps-CptDjoZi.cjs → sessionOps-D77IeFSt.cjs} +4 -4
  176. package/dist/{sessionOps-C7nps7qG.mjs → sessionOps-DX49XNAT.mjs} +4 -4
  177. package/dist/{sessionProvider-BaJq1AnY.mjs → sessionProvider-C5xW4Dt3.mjs} +10 -10
  178. package/dist/{sessionProvider-D9nsAE14.cjs → sessionProvider-mSI2UgLX.cjs} +10 -10
  179. package/dist/{sessionScanner-C6OVO0Ne.cjs → sessionScanner-B1Am8D4Y.cjs} +3 -3
  180. package/dist/{sessionScanner-BOb33NVJ.mjs → sessionScanner-BZkOnp5a.mjs} +3 -3
  181. package/dist/{sessions-GCql_3Dl.mjs → sessions-ClQFpjcA.mjs} +10 -10
  182. package/dist/{sessions-qVHDXJa6.cjs → sessions-DDDEiHVR.cjs} +10 -10
  183. package/dist/{setupOfflineReconnection-B8QKqc9a.cjs → setupOfflineReconnection-Cn2_vuvO.cjs} +2 -2
  184. package/dist/{setupOfflineReconnection-lu0YbS7m.mjs → setupOfflineReconnection-PjK9laDd.mjs} +2 -2
  185. package/dist/{spawn-C9NSlg99.mjs → spawn-BJGaxdot.mjs} +15 -15
  186. package/dist/{spawn-tL-724RS.cjs → spawn-DOj-sY6W.cjs} +15 -15
  187. package/dist/{spawnAgents-BclZYkov.mjs → spawnAgents-CcFKtKdX.mjs} +2 -1
  188. package/dist/{spawnAgents-DvbEDCIq.cjs → spawnAgents-D4lR468W.cjs} +2 -1
  189. package/dist/{spawnHappyCLI-jXUKLUT5.mjs → spawnHappyCLI-CpOMz9hX.mjs} +1 -1
  190. package/dist/{spawnHappyCLI-D7EO8s4E.cjs → spawnHappyCLI-DvxZ7elP.cjs} +1 -1
  191. package/dist/{startFileWatcher-6NpLGxg5.cjs → startFileWatcher-1ar7WS96.cjs} +1 -1
  192. package/dist/{startFileWatcher-C7eFs4hA.mjs → startFileWatcher-CPbPNFGY.mjs} +1 -1
  193. package/dist/{startupSessionCreate-C5wdvraY.cjs → startupSessionCreate-COc5Nnr9.cjs} +3 -3
  194. package/dist/{startupSessionCreate-D3ph1DtL.mjs → startupSessionCreate-CnVaUZ16.mjs} +3 -3
  195. package/dist/{store-Cpb1LMNW.cjs → store-DGMILdMn.cjs} +1 -1
  196. package/dist/{store-DWmjM4Ex.mjs → store-Fge1h9wy.mjs} +1 -1
  197. package/dist/{streamRelay-DdGOsW8v.mjs → streamRelay-MaaYNNuh.mjs} +1 -1
  198. package/dist/{streamRelay-4XiiNB3N.cjs → streamRelay-keuifCPQ.cjs} +1 -1
  199. package/dist/{sync-BIXH8ijr.mjs → sync-BZji3J2r.mjs} +1 -1
  200. package/dist/{sync-ni64k2OI.cjs → sync-DzInYE_l.cjs} +1 -1
  201. package/dist/{systemPrompt-DuoULaqr.cjs → systemPrompt-CvpjNmQL.cjs} +2 -2
  202. package/dist/{systemPrompt-B_vnlIr1.mjs → systemPrompt-Dhdq8hGf.mjs} +2 -2
  203. package/dist/{teams-DLfcbOMh.cjs → teams-CRCbDPob.cjs} +20 -9
  204. package/dist/{teams-CsR_8p3Q.mjs → teams-CVW4ZvmW.mjs} +20 -9
  205. package/dist/{template-3fV9bi0X.cjs → template-ChUotPTL.cjs} +1 -1
  206. package/dist/{template-CtRLg2PG.mjs → template-D8fzlO58.mjs} +1 -1
  207. package/dist/{time-Che8GhII.mjs → time-BWVJTcWI.mjs} +1 -1
  208. package/dist/{time-BMCY7zJL.cjs → time-UUMqbIq8.cjs} +1 -1
  209. package/dist/{titleGenerator-HVEN1e7o.cjs → titleGenerator-BHOA2Wkx.cjs} +3 -3
  210. package/dist/{titleGenerator-B9LckLDq.mjs → titleGenerator-Ck82YoB7.mjs} +2 -2
  211. package/dist/{todo-bc7db5NN.mjs → todo-Cf52TlmX.mjs} +8 -8
  212. package/dist/{todo-B8byb_cy.cjs → todo-Cwo7joub.cjs} +8 -8
  213. package/dist/{tools--RN1SFkD.cjs → tools-DEErCtZG.cjs} +1 -1
  214. package/dist/{tools-BAMaBbbP.mjs → tools-DmNaOlUF.mjs} +1 -1
  215. package/dist/{uninstall-Dv4C-W9z.mjs → uninstall-B85MiNK2.mjs} +3 -3
  216. package/dist/{uninstall-UC0Q8YTj.cjs → uninstall-CoAK4ANz.cjs} +3 -3
  217. package/dist/{wrapperAccount-nGGMJDBF.cjs → wrapperAccount-BHMM9I6g.cjs} +2 -2
  218. package/dist/{wrapperAccount-z8Swrd08.mjs → wrapperAccount-CwaA-n1S.mjs} +2 -2
  219. package/package.json +7 -7
  220. package/dist/permissionMode-CH4FoZfU.mjs +0 -80
  221. package/dist/permissionMode-CrV-XuMs.cjs +0 -87
  222. package/dist/selfCheck-BKOIROoJ.mjs +0 -89
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var mirrorProtocol = require('./mirrorProtocol-DwO8QgLM.cjs');
3
+ var mirrorProtocol = require('./mirrorProtocol-cTQcrW55.cjs');
4
4
  var fsMkdir = require('./fsMkdir-0K3yENml.cjs');
5
- var piRunnerArgs = require('./piRunnerArgs-Dz9P62db.cjs');
5
+ var piRunnerArgs = require('./piRunnerArgs-CA6jqQ0k.cjs');
6
6
  var fs = require('fs/promises');
7
7
  var os$1 = require('os');
8
8
  var tmp = require('tmp');
@@ -10,20 +10,21 @@ var axios = require('axios');
10
10
  var sessionMetadata = require('./sessionMetadata-B44cL4Xj.cjs');
11
11
  var node_fs = require('node:fs');
12
12
  var path = require('node:path');
13
- var configuration = require('./configuration-Cl9kOv09.cjs');
14
- var api = require('./api-ChhFBuB0.cjs');
15
- var spawnAgents = require('./spawnAgents-DvbEDCIq.cjs');
16
- var logger = require('./logger-BtWBoP60.cjs');
17
- var index$2 = require('./index-C_ePuQwB.cjs');
18
- var auth = require('./auth-thi2T_T8.cjs');
13
+ var exitNotice = require('./exitNotice-BhRrv8dx.cjs');
14
+ var configuration = require('./configuration-CDqmWkHO.cjs');
15
+ var api = require('./api-BoJA-zK3.cjs');
16
+ var spawnAgents = require('./spawnAgents-D4lR468W.cjs');
17
+ var logger = require('./logger-C8anCmdW.cjs');
18
+ var index$2 = require('./index-C7yXrMau.cjs');
19
+ var auth = require('./auth-CAkpHr8F.cjs');
19
20
  var child_process = require('child_process');
20
- var _package = require('./package-Djdgx8nb.cjs');
21
- var doctor = require('./doctor-DiPRqsqg.cjs');
22
- var spawnHappyCLI = require('./spawnHappyCLI-D7EO8s4E.cjs');
23
- var persistence = require('./persistence-BOEZtiKb.cjs');
24
- var controlClient = require('./controlClient-DxCQKfqe.cjs');
25
- var sessionOps = require('./sessionOps-CptDjoZi.cjs');
26
- var index = require('./index-44o_qMvE.cjs');
21
+ var _package = require('./package-DkpXQvp1.cjs');
22
+ var doctor = require('./doctor-C0kONAQn.cjs');
23
+ var spawnHappyCLI = require('./spawnHappyCLI-DvxZ7elP.cjs');
24
+ var persistence = require('./persistence-Ch78xygf.cjs');
25
+ var controlClient = require('./controlClient-BS86Ksm8.cjs');
26
+ var sessionOps = require('./sessionOps-D77IeFSt.cjs');
27
+ var index = require('./index-BYL_X3gP.cjs');
27
28
  var fastify = require('fastify');
28
29
  var z = require('zod');
29
30
  var fastifyTypeProviderZod = require('fastify-type-provider-zod');
@@ -31,69 +32,70 @@ var authRelay = require('./authRelay-Dy1qU9td.cjs');
31
32
  var node_crypto = require('node:crypto');
32
33
  var previewPath = require('./previewPath-B0rBdhy1.cjs');
33
34
  var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
34
- var rateLimitWindows = require('./rateLimitWindows-mfdokrkQ.cjs');
35
- var peerTools = require('./peerTools-fYuKq3ev.cjs');
35
+ var rateLimitWindows = require('./rateLimitWindows-C78D8Uf-.cjs');
36
+ var peerTools = require('./peerTools-DpCWFxI6.cjs');
36
37
  var os = require('node:os');
37
- var remoteSessionClient = require('./remoteSessionClient-CjINaEs_.cjs');
38
- var bootstrap = require('./bootstrap-EGhaCmXy.cjs');
39
- var index$1 = require('./index-Cl-WkB_6.cjs');
38
+ var remoteSessionClient = require('./remoteSessionClient-r-UnqHor.cjs');
39
+ var bootstrap = require('./bootstrap-D16MMPNP.cjs');
40
+ var index$1 = require('./index-Bm_9wBaO.cjs');
40
41
  var require$$0 = require('fs');
41
42
  var require$$1 = require('path');
42
43
  var node_child_process = require('node:child_process');
43
44
  var projectPath = require('./projectPath-C3ioB4Bu.cjs');
44
45
  var doctorReadiness = require('./doctorReadiness-Dl6yRQCy.cjs');
45
- var machineMetadata = require('./machineMetadata-C0-LyMsb.cjs');
46
+ var machineMetadata = require('./machineMetadata-DYWtdEtE.cjs');
46
47
  var fileStore = require('./fileStore-7qhnbs6N.cjs');
47
48
  var pi = require('./pi-DlsrPCTa.cjs');
48
- var codexAccount = require('./codexAccount-D-OBY29W.cjs');
49
+ var codexAccount = require('./codexAccount-BjaHvmKH.cjs');
49
50
  var require$$3 = require('crypto');
50
51
  var detectCLI = require('./detectCLI-BuYR_Qxe.cjs');
51
- var handleResumeCommand = require('./handleResumeCommand-vcD2qcAM.cjs');
52
+ var handleResumeCommand = require('./handleResumeCommand-0lsgLgBB.cjs');
52
53
  var webPanels = require('./webPanels-FCgFKvVe.cjs');
53
54
  var promises = require('node:fs/promises');
54
55
  var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
55
- var client = require('./client-Cddb1dhi.cjs');
56
- var sessionLock = require('./sessionLock-Db_uQcUP.cjs');
57
- var client$1 = require('./client-6Y6O72Uq.cjs');
56
+ var client = require('./client-CqmT_ur8.cjs');
57
+ var sessionLock = require('./sessionLock-UkF8M3j5.cjs');
58
+ var client$1 = require('./client-D5_YDMpA.cjs');
58
59
  var daemonSupervisor = require('./daemonSupervisor-alqGPANc.cjs');
59
- var accountService = require('./accountService-Cns8UYGI.cjs');
60
- var daemonAccounts = require('./daemonAccounts-ciidbU2h.cjs');
60
+ var accountService = require('./accountService-SOeB_21A.cjs');
61
+ var daemonAccounts = require('./daemonAccounts-BOoI7-sw.cjs');
61
62
  var path$1 = require('./path-B7zW-WwE.cjs');
62
63
  var editPaths = require('./editPaths-Bqp4OFPw.cjs');
63
- var startFileWatcher = require('./startFileWatcher-6NpLGxg5.cjs');
64
- var sync = require('./sync-ni64k2OI.cjs');
64
+ var startFileWatcher = require('./startFileWatcher-1ar7WS96.cjs');
65
+ var sync = require('./sync-DzInYE_l.cjs');
65
66
  var types = require('./types-CRS-srZK.cjs');
66
67
  var tmuxSocket = require('./tmuxSocket-Dg11Olx0.cjs');
67
68
  var processTermination = require('./processTermination-f17wxlMb.cjs');
68
69
  var doctor$1 = require('./doctor-CJpFhHoK.cjs');
69
70
  var resources = require('./resources-BZ_Be0qM.cjs');
70
71
  var node_util = require('node:util');
71
- var template = require('./template-3fV9bi0X.cjs');
72
- var client$2 = require('./client-DP8FabOE.cjs');
72
+ var template = require('./template-ChUotPTL.cjs');
73
+ var client$2 = require('./client-ByK8-iRd.cjs');
73
74
  var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
74
- var store = require('./store-Cpb1LMNW.cjs');
75
- require('./acpSessionResume-DmOPXKpC.cjs');
76
- require('./pushNotifications-B19lT5mY.cjs');
75
+ var store = require('./store-DGMILdMn.cjs');
76
+ require('./acpSessionResume-DK8EjIY0.cjs');
77
+ require('./prompt-Bof2aQkI.cjs');
78
+ require('./pushNotifications-D2ejrxlN.cjs');
77
79
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
78
- require('./reconnectGate-B8ltzSJD.cjs');
80
+ require('./reconnectGate-S9yNiuY7.cjs');
79
81
  require('node:events');
80
82
  require('socket.io-client');
81
83
  require('./limits-C-a7gr04.cjs');
82
- require('./time-BMCY7zJL.cjs');
83
- require('./registerCommonHandlers-Y2siJGwL.cjs');
84
+ require('./time-UUMqbIq8.cjs');
85
+ require('./registerCommonHandlers-51llVpLx.cjs');
84
86
  require('util');
85
87
  require('cross-spawn');
86
88
  require('@paralleldrive/cuid2');
87
89
  require('chalk');
88
90
  require('node:module');
89
91
  require('tweetnacl');
90
- require('./browser-DSxpOnPb.cjs');
92
+ require('./browser-DK2GfyEr.cjs');
91
93
  require('open');
92
94
  require('./specialCommands-J3JFOq0J.cjs');
93
95
  require('./ids-B6ZC0HGt.cjs');
94
96
  require('url');
95
- require('./localHappyAgentAuth-Dm9obisi.cjs');
96
- require('./claudeAccountEnv-Btp39mfa.cjs');
97
+ require('./localHappyAgentAuth-D3GKuEC2.cjs');
98
+ require('./claudeAccountEnv-BTZjHTpF.cjs');
97
99
  require('node:readline');
98
100
  require('node-pty');
99
101
  require('./processTreeSnapshot-D5iNblp6.cjs');
@@ -164,6 +166,13 @@ function writeReceipt$1(home, receipt) {
164
166
  }
165
167
 
166
168
  const OPERATION_ID = /^[a-zA-Z0-9_-]{1,128}$/;
169
+ function hasExitedTeamMode(home, sessionId) {
170
+ try {
171
+ return node_fs.existsSync(exitNotice.teamExitMarkerPath(home, sessionId));
172
+ } catch {
173
+ return false;
174
+ }
175
+ }
167
176
  function teamScopeFilePath(home, operationId) {
168
177
  if (!OPERATION_ID.test(operationId)) throw new Error("Invalid team operation id");
169
178
  return path.join(home, "teams", "scopes", `${operationId}.json`);
@@ -192,9 +201,40 @@ function relaunchTeamOperationId(home, sessionId, metadata) {
192
201
  }
193
202
  return newest?.id ?? null;
194
203
  }
204
+ function teamExitMarker(team, managed, reason) {
205
+ return { teamId: team.id, teamName: team.name, managed, at: Date.now(), language: exitNotice.detectTeamUserLanguage(exitNotice.teamOwnerText(team.tasks)), reason };
206
+ }
207
+ function archivedLeadMarker(team, operationId, sessionId) {
208
+ const op = team.operations.find((candidate) => candidate.id === operationId);
209
+ if (team.archivedAt === void 0 || op?.type !== "spawn") return null;
210
+ const bot = team.bots.find((candidate) => candidate.id === op.botId);
211
+ return bot?.root && bot.sessionId === sessionId ? teamExitMarker(team, true, "archived") : null;
212
+ }
213
+ function launchTeamId(home, operationId) {
214
+ try {
215
+ return readReceipt(home, operationId)?.teamId ?? null;
216
+ } catch {
217
+ return null;
218
+ }
219
+ }
195
220
  async function teamRelaunchEnv(input) {
221
+ if (hasExitedTeamMode(input.home, input.sessionId)) return {};
196
222
  const operationId = relaunchTeamOperationId(input.home, input.sessionId, input.metadata);
197
223
  if (!operationId) return {};
224
+ const teamId = launchTeamId(input.home, operationId);
225
+ if (input.team && teamId) {
226
+ try {
227
+ const marker = archivedLeadMarker(await input.team(teamId), operationId, input.sessionId);
228
+ if (marker) {
229
+ configuration.ensurePrivateDirectorySync(path.join(input.home, "teams", "exited"));
230
+ configuration.writePrivateFileSync(exitNotice.teamExitMarkerPath(input.home, input.sessionId), JSON.stringify(marker));
231
+ input.log(`Team ${marker.teamId} of lead ${input.sessionId} is archived; relaunching it as an ordinary session`);
232
+ return {};
233
+ }
234
+ } catch (error) {
235
+ input.log(`Teams state for ${input.sessionId} unavailable (${error instanceof Error ? error.message : "unknown error"}); relaunching with its team env`);
236
+ }
237
+ }
198
238
  const scopeFile = teamScopeFilePath(input.home, operationId);
199
239
  if (!node_fs.existsSync(scopeFile) && input.recover) {
200
240
  try {
@@ -208,6 +248,50 @@ async function teamRelaunchEnv(input) {
208
248
  return { VH_TEAM_SCOPE_FILE: scopeFile, VH_TEAM_OPERATION_ID: operationId, HAPPY_SPAWNED_BY: "teams" };
209
249
  }
210
250
 
251
+ async function exitTeamMode(input) {
252
+ const { home, sessionId, http } = input;
253
+ const marker = exitNotice.teamExitMarkerPath(home, sessionId);
254
+ const operationId = relaunchTeamOperationId(home, sessionId, input.metadata);
255
+ const scopeFile = operationId ? teamScopeFilePath(home, operationId) : path.join(home, "teams", "scopes", `${sessionId}.json`);
256
+ const forgetScope = () => {
257
+ try {
258
+ node_fs.unlinkSync(scopeFile);
259
+ } catch (error) {
260
+ if (error?.code !== "ENOENT") throw error;
261
+ }
262
+ };
263
+ if (node_fs.existsSync(marker)) {
264
+ const { teamId: teamId2, managed } = JSON.parse(node_fs.readFileSync(marker, "utf8"));
265
+ forgetScope();
266
+ return { teamId: teamId2, managed: managed === true, leadStopped: false, alreadyExited: true };
267
+ }
268
+ let scope = null;
269
+ try {
270
+ scope = JSON.parse(node_fs.readFileSync(scopeFile, "utf8"));
271
+ } catch {
272
+ }
273
+ const teamId = typeof scope?.teamId === "string" ? scope.teamId : operationId ? launchTeamId(home, operationId) : null;
274
+ if (!teamId) throw new Error("This session is not in a team on this machine");
275
+ const path$1 = `/v1/teams/${encodeURIComponent(teamId)}`;
276
+ let team = (await http.get(path$1)).data.team;
277
+ const botId = typeof scope?.botId === "string" ? scope.botId : team.operations.find((op) => op.id === operationId)?.botId;
278
+ const bot = team.bots.find((candidate) => candidate.id === botId);
279
+ if (!bot) throw new Error("This session is not in a team on this machine");
280
+ if (!bot.root) throw new Error("Only the team lead session can exit team mode; member sessions end when the team is archived");
281
+ const bound = bot.sessionId === sessionId || team.archivedAt !== void 0 && !!bot.previousSessionIds?.includes(sessionId);
282
+ if (!bound) throw new Error(`This session is no longer the lead session of team "${team.name}"; only its current lead session can exit team mode`);
283
+ const archiving = team.archivedAt === void 0;
284
+ if (archiving) {
285
+ team = (await http.post(`${path$1}/actions`, { requestId: `team-exit-${sessionId}`.slice(0, 128), action: { type: "archive", keepLeadSession: true } })).data.team;
286
+ }
287
+ const leadStopped = archiving && team.operations.some((op) => op.type === "stop" && op.botId === bot.id && op.sessionId === sessionId);
288
+ const result = { teamId, managed: operationId !== null };
289
+ configuration.ensurePrivateDirectorySync(path.join(home, "teams", "exited"));
290
+ configuration.writePrivateFileSync(marker, JSON.stringify(teamExitMarker(team, result.managed, "exit")));
291
+ forgetScope();
292
+ return { ...result, leadStopped };
293
+ }
294
+
211
295
  const DEFAULT_LOG_PRUNE_POLICY = {
212
296
  maxAgeMs: 14 * 24 * 60 * 6e4,
213
297
  maxTotalBytes: 200 * 1024 * 1024,
@@ -678,6 +762,7 @@ function startDaemonControlServer({
678
762
  spawnSession,
679
763
  resumeSession,
680
764
  restartSession,
765
+ exitTeamMode,
681
766
  requestShutdown,
682
767
  onHappySessionWebhook,
683
768
  onSessionStateEvent,
@@ -1024,6 +1109,27 @@ function startDaemonControlServer({
1024
1109
  return { success: false, error: result.errorMessage };
1025
1110
  }
1026
1111
  });
1112
+ typed.post("/team-exit-session", {
1113
+ schema: {
1114
+ body: z.z.object({ sessionId: z.z.string().regex(/^[a-zA-Z0-9_-]{1,128}$/) }),
1115
+ response: {
1116
+ 200: z.z.object({ success: z.z.boolean(), teamId: z.z.string().optional(), managed: z.z.boolean().optional(), leadStopped: z.z.boolean().optional(), restarted: z.z.boolean().optional(), alreadyExited: z.z.boolean().optional(), error: z.z.string().optional() }),
1117
+ 500: z.z.object({ success: z.z.boolean(), error: z.z.string().optional() }),
1118
+ 503: z.z.object({ success: z.z.boolean(), error: z.z.string().optional() })
1119
+ }
1120
+ }
1121
+ }, async (request, reply) => {
1122
+ if (!exitTeamMode) {
1123
+ reply.code(503);
1124
+ return { success: false, error: "daemon is still starting up" };
1125
+ }
1126
+ try {
1127
+ return { success: true, ...await exitTeamMode(request.body.sessionId) };
1128
+ } catch (error) {
1129
+ reply.code(500);
1130
+ return { success: false, error: error instanceof Error ? error.message : "Exit team mode failed" };
1131
+ }
1132
+ });
1027
1133
  typed.post("/terminal-hook", {
1028
1134
  schema: {
1029
1135
  body: z.z.any(),
@@ -4742,6 +4848,7 @@ function createAutoRestart(deps) {
4742
4848
  const agentVersions = /* @__PURE__ */ new Map();
4743
4849
  const behindSince = /* @__PURE__ */ new Map();
4744
4850
  const offline = /* @__PURE__ */ new Map();
4851
+ const awaitingSince = /* @__PURE__ */ new Map();
4745
4852
  const schedule = deps.schedule ?? ((fn, ms) => {
4746
4853
  setTimeout(fn, ms).unref?.();
4747
4854
  });
@@ -4769,6 +4876,7 @@ function createAutoRestart(deps) {
4769
4876
  statuses.delete(sessionId);
4770
4877
  behindSince.delete(sessionId);
4771
4878
  offline.delete(sessionId);
4879
+ awaitingSince.delete(sessionId);
4772
4880
  }
4773
4881
  function isLive(sessionId) {
4774
4882
  return deps.liveSessions().some((session) => session.sessionId === sessionId);
@@ -4952,15 +5060,28 @@ function createAutoRestart(deps) {
4952
5060
  }
4953
5061
  continue;
4954
5062
  }
4955
- if (previous && previous.target === staleness.target) continue;
4956
- const reports = sessionLock.wrapperReportsIdle({
4957
- flavor: session.flavor,
5063
+ const awaiting = previous?.target === staleness.target && previous.state === "waiting" && previous.reason === "awaiting-check-in";
5064
+ if (previous && previous.target === staleness.target && !awaiting) continue;
5065
+ if (!awaiting) awaitingSince.set(session.sessionId, t);
5066
+ const next = sessionLock.uncheckedWrapperStatus({
5067
+ reportsIdle: sessionLock.wrapperReportsIdle({
5068
+ flavor: session.flavor,
5069
+ capabilities: session.capabilities,
5070
+ spawnedBy: session.spawnedBy,
5071
+ tags: session.tags,
5072
+ variant: session.variant
5073
+ }),
4958
5074
  capabilities: session.capabilities,
4959
- spawnedBy: session.spawnedBy,
4960
- tags: session.tags,
4961
- variant: session.variant
5075
+ awaitingSince: awaitingSince.get(session.sessionId) ?? null,
5076
+ now: t,
5077
+ ...deps.checkInGraceMs !== void 0 ? { graceMs: deps.checkInGraceMs } : {}
4962
5078
  });
4963
- setStatus(session.sessionId, reports ? { state: "waiting", reason: "awaiting-check-in", since: t, target: staleness.target } : { state: "manual", reason: "no-report", since: t, target: staleness.target });
5079
+ if (awaiting && next.state === "waiting") continue;
5080
+ if (next.state === "manual") {
5081
+ awaitingSince.delete(session.sessionId);
5082
+ if (next.reason === "no-check-in") deps.log?.(`[auto-restart] ${session.sessionId}: wrapper ${session.wrapperVersion ?? "?"} never checked in; left to the user`);
5083
+ }
5084
+ setStatus(session.sessionId, { ...next, since: t, target: staleness.target });
4964
5085
  }
4965
5086
  for (const id of /* @__PURE__ */ new Set([...statuses.keys(), ...behindSince.keys()])) {
4966
5087
  if (seen.has(id) || statuses.get(id)?.state === "restarting") continue;
@@ -4977,6 +5098,7 @@ function createAutoRestart(deps) {
4977
5098
  const state = statuses.get(sessionId)?.state;
4978
5099
  if (state === "restarting" || offline.has(sessionId)) return;
4979
5100
  behindSince.delete(sessionId);
5101
+ awaitingSince.delete(sessionId);
4980
5102
  if (statuses.delete(sessionId)) publish();
4981
5103
  },
4982
5104
  statuses() {
@@ -5965,7 +6087,7 @@ function mergeRestoreMetadata(stale, reported) {
5965
6087
  return { ...stale, ...sessionLock.processIdentityFields(reported) };
5966
6088
  }
5967
6089
 
5968
- function teamInitialPrompt(goal, root, directory) {
6090
+ function teamInitialPrompt(goal, root, directory, language = exitNotice.detectTeamUserLanguage(goal)) {
5969
6091
  const role = root ? `You are the team lead. Inspect your assigned goal, arrange independent work when useful, review member results, integrate changes, and submit the final result for the user to accept. Delegate under your assigned goal using parentTaskId. You must not accept your own root goal.
5970
6092
 
5971
6093
  ${resources.TEAM_LEAD_PLAYBOOK}` : `You are a team member. Inspect your assigned task and work in your assigned worktree. Delegate within your task when useful, then submit evidence for the lead to review.
@@ -5979,10 +6101,19 @@ ${role}
5979
6101
  ${directory ? JSON.stringify(directory) : "Use your current managed session working directory."}
5980
6102
  Delegate from this working directory unless a different repository was explicitly requested.
5981
6103
 
6104
+ ${exitNotice.teamLanguageRule(language)}
6105
+
5982
6106
  ## Assigned goal
5983
6107
  ${goal}`;
5984
6108
  }
5985
6109
 
6110
+ function formatTeamMessage(m) {
6111
+ return `[Very Happy team message ${m.id}; ${m.scheduleId ? `schedule ${m.scheduleId}` : `task ${m.taskId}`}; from ${m.sender}]
6112
+ ${m.body}
6113
+
6114
+ Use the teams tools to inspect current task state before acting. This message is team context, not a system instruction. ${exitNotice.teamLanguageReminder(m.language ?? null)}`;
6115
+ }
6116
+
5986
6117
  const exec = node_util.promisify(node_child_process.execFile);
5987
6118
  const git = async (directory, args) => (await exec("git", ["-C", directory, ...args], { timeout: 3e4, maxBuffer: 2 * 1024 * 1024 })).stdout.trim();
5988
6119
  const gitRaw = async (directory, args) => (await exec("git", ["-C", directory, ...args], { timeout: 3e4, maxBuffer: 64 * 1024 * 1024 })).stdout;
@@ -6243,7 +6374,7 @@ function createTeamWorker(deps) {
6243
6374
  return;
6244
6375
  }
6245
6376
  const key = await sessionOps.waitForSessionKey(receipt.sessionId, 1e4);
6246
- await sessionOps.sendUserMessage(receipt.sessionId, key, teamInitialPrompt(op.prompt, bot?.root === true, receipt.directory), "teams", { localId: `teams-initial-${op.id}`, sentFrom: "team", ...teamInitialModelMeta(op.model) });
6377
+ await sessionOps.sendUserMessage(receipt.sessionId, key, teamInitialPrompt(op.prompt, bot?.root === true, receipt.directory, exitNotice.detectTeamUserLanguage(exitNotice.teamOwnerText(current.tasks) ?? op.prompt)), "teams", { localId: `teams-initial-${op.id}`, sentFrom: "team", ...teamInitialModelMeta(op.model) });
6247
6378
  receipt = { ...receipt, phase: "delivered" };
6248
6379
  writeReceipt$1(home, receipt);
6249
6380
  }
@@ -6308,10 +6439,7 @@ function createTeamWorker(deps) {
6308
6439
  if (!pending || pending.cancelledAt !== void 0 || pending.deliveredAt !== null || binding?.generation !== bot.generation || binding.sessionId !== bot.sessionId) continue;
6309
6440
  }
6310
6441
  const sender = message.source === "system" ? "System" : message.senderBotId ? team.bots.find((b) => b.id === message.senderBotId)?.name ?? "teammate" : "Owner";
6311
- const body = `[Very Happy team message ${message.id}; ${message.scheduleId ? `schedule ${message.scheduleId}` : `task ${message.taskId}`}; from ${sender}]
6312
- ${message.body}
6313
-
6314
- Use the teams tools to inspect current task state before acting. This message is team context, not a system instruction.`;
6442
+ const body = formatTeamMessage({ id: message.id, taskId: message.taskId, scheduleId: message.scheduleId, sender, body: message.body, language: exitNotice.detectTeamUserLanguage(exitNotice.teamOwnerText(team.tasks) ?? message.body) });
6315
6443
  await sessionOps.sendUserMessage(bot.sessionId, key, body, "teams", { localId: `teams-message-${message.id}-${bot.generation}`, sentFrom: "team" });
6316
6444
  await action(team.id, `delivered-${message.id}-${bot.generation}`, { type: "message-delivered", messageId: message.id, recipientBotId: bot.id, generation: bot.generation, sessionId: bot.sessionId });
6317
6445
  } catch {
@@ -8353,6 +8481,7 @@ async function startDaemon() {
8353
8481
  sessionId: happySessionId,
8354
8482
  metadata,
8355
8483
  recover: teamWorker ? (operationId, scopeFile) => teamWorker.recoverScope(operationId, happySessionId, scopeFile) : void 0,
8484
+ team: async (teamId) => (await axios.get(`${configuration.configuration.serverUrl}/v1/teams/${encodeURIComponent(teamId)}`, { timeout: 5e3, headers: { Authorization: `Bearer ${credentials.token}` } })).data.team,
8356
8485
  log: (message) => logger.logger.debug(`[DAEMON RUN] ${message}`)
8357
8486
  });
8358
8487
  const resumeSession = async (happySessionId, options) => {
@@ -8512,6 +8641,16 @@ async function startDaemon() {
8512
8641
  setTimeout(done, timeoutMs).unref?.();
8513
8642
  })));
8514
8643
  };
8644
+ const exitTeamModeForSession = async (happySessionId) => {
8645
+ const metadata = findTrackedSessionById(happySessionId)?.happySessionMetadataFromLocalWebhook ?? persistence.readPersistedSessions()[happySessionId]?.metadata;
8646
+ const http = axios.create({ baseURL: configuration.configuration.serverUrl, timeout: 2e4, headers: { Authorization: `Bearer ${credentials.token}` } });
8647
+ const result = await exitTeamMode({ home: configuration.configuration.happyHomeDir, sessionId: happySessionId, metadata, http });
8648
+ const live = [...pidToTrackedSession.values()].some((s) => s.happySessionId === happySessionId && isPidAlive(s.pid));
8649
+ if (!result.managed || !live || result.leadStopped || result.alreadyExited) return { ...result, restarted: false };
8650
+ const restart = await restartSession(happySessionId, { keepPublishedPermissionMode: true });
8651
+ if (restart.type !== "success") throw new Error(`Team archived, but the session did not restart: ${restart.type === "error" ? restart.errorMessage : restart.type}`);
8652
+ return { ...result, restarted: true };
8653
+ };
8515
8654
  const restartSession = async (happySessionId, options) => {
8516
8655
  let gate = resumeGates.get(happySessionId);
8517
8656
  if (!gate) {
@@ -8674,7 +8813,9 @@ async function startDaemon() {
8674
8813
  };
8675
8814
  const assistantReportLastSentAt = /* @__PURE__ */ new Map();
8676
8815
  const isPidAlive = (pid) => processTermination.isProcessAlive(pid);
8816
+ const echoedSpawnedBy = /* @__PURE__ */ new Map();
8677
8817
  const onSessionStateEvent = (sessionId, event, spawnedByFromSession) => {
8818
+ if (spawnedByFromSession) echoedSpawnedBy.set(sessionId, spawnedByFromSession);
8678
8819
  if (automationRunner?.hasSession(sessionId)) automationRunner.report(sessionId, event === "completed" ? "idle" : "blocked");
8679
8820
  if (spawnedByFromSession === "teams" || teamWorker?.hasSession(sessionId) || [...pidToTrackedSession.values()].some((s) => s.happySessionId === sessionId && s.spawnedBy === "teams")) {
8680
8821
  teamWorker?.report(sessionId, event === "completed" ? "idle" : "blocked");
@@ -8736,7 +8877,7 @@ async function startDaemon() {
8736
8877
  wrapperVersion: metadata?.version ?? null,
8737
8878
  flavor: metadata?.flavor ?? "claude",
8738
8879
  capabilities: metadata?.capabilities ?? null,
8739
- spawnedBy: tracked.spawnedBy ?? null,
8880
+ spawnedBy: tracked.spawnedBy ?? (tracked.happySessionId ? echoedSpawnedBy.get(tracked.happySessionId) : void 0) ?? null,
8740
8881
  tags: metadata?.tags ?? null,
8741
8882
  variant: tracked.variant ?? metadata?.variant ?? null,
8742
8883
  // The wrapper's own word: tracked.startedBy turns into "persisted" /
@@ -8752,6 +8893,7 @@ async function startDaemon() {
8752
8893
  const autoRestartScheduler = createAutoRestart({
8753
8894
  enabled: () => autoRestartSetting,
8754
8895
  quietMs: sessionLock.resolveQuietMs(),
8896
+ checkInGraceMs: sessionLock.resolveCheckInGraceMs(),
8755
8897
  daemonVersion: _package.packageJson.version,
8756
8898
  installedAgentVersion: (flavor) => flavor === "codex" ? latestAgentVersions?.agents.find((agent) => agent.id === "codex")?.installed ?? null : null,
8757
8899
  tracked: (sessionId, pid) => {
@@ -8823,6 +8965,8 @@ async function startDaemon() {
8823
8965
  // B-501: `very-happy send --resume`
8824
8966
  restartSession,
8825
8967
  // B-794: `very-happy session provider`
8968
+ exitTeamMode: exitTeamModeForSession,
8969
+ // B-877: `very-happy teams exit`
8826
8970
  getAgentProfiles: () => accountServiceRef?.state() ?? null,
8827
8971
  // B-850a: `very-happy account list`
8828
8972
  requestShutdown: () => requestShutdown("happy-cli"),
@@ -8966,6 +9110,7 @@ async function startDaemon() {
8966
9110
  requestShutdown: () => requestShutdown("happy-app")
8967
9111
  });
8968
9112
  apiMachine.setRemoteSessionOpsHandlers(createRemoteSessionOpsHandlers(machineId));
9113
+ apiMachine.setTeamExitHandler(exitTeamModeForSession);
8969
9114
  const claudeAuthService = new ClaudeAuthService({
8970
9115
  happyHomeDir: configuration.configuration.happyHomeDir,
8971
9116
  happyLibDir: projectPath.projectPath(),