very-happy-cli 0.2.205 → 0.2.207

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 (194) hide show
  1. package/dist/{AcpBackend-BqkDMgcN.mjs → AcpBackend-Bl-oWkHt.mjs} +3 -3
  2. package/dist/{AcpBackend-Do37yiZg.cjs → AcpBackend-C4SaE4IN.cjs} +3 -3
  3. package/dist/{AcpSessionManager-BpQKu2_m.cjs → AcpSessionManager-CKSM-N3a.cjs} +1 -1
  4. package/dist/{AcpSessionManager-CvEO7Yex.mjs → AcpSessionManager-DqNWNKVy.mjs} +1 -1
  5. package/dist/{BasePermissionHandler-BpaIn9ko.mjs → BasePermissionHandler-BAfjjqWG.mjs} +1 -1
  6. package/dist/{BasePermissionHandler-CUXi-tq4.cjs → BasePermissionHandler-DffP0tjT.cjs} +1 -1
  7. package/dist/{account-C1nsl3ij.mjs → account-CneNvaLv.mjs} +5 -5
  8. package/dist/{account-SwG5Yefp.cjs → account-pH6JQJbQ.cjs} +5 -5
  9. package/dist/{acpSessionResume-DvDKsJTV.mjs → acpSessionResume-C6KuYvK8.mjs} +1 -1
  10. package/dist/{acpSessionResume-BCEol11N.cjs → acpSessionResume-Cp2majJ5.cjs} +1 -1
  11. package/dist/{agentHome-BuFxooEg.mjs → agentHome-BkiHrQwj.mjs} +4 -4
  12. package/dist/{agentHome-8wzmbm0H.cjs → agentHome-ZGpu5XKy.cjs} +4 -4
  13. package/dist/{api-20GbdpxY.mjs → api-D7EAwOT2.mjs} +9 -9
  14. package/dist/{api-BnTF8fkj.cjs → api-eXuwG3LS.cjs} +9 -9
  15. package/dist/{apiMachine-C8NGJHHd.mjs → apiMachine-B5c9zCjB.mjs} +56 -16
  16. package/dist/{apiMachine-cyDRM_S-.cjs → apiMachine-B8ZxgTx1.cjs} +56 -16
  17. package/dist/{attachmentContent-Coo9lUxK.mjs → attachmentContent-DV7W3vw7.mjs} +2 -2
  18. package/dist/{attachmentContent-B7zz_LPF.cjs → attachmentContent-DhTreh-W.cjs} +2 -2
  19. package/dist/{auth-By6u_iKB.cjs → auth-CFUuiMdV.cjs} +5 -5
  20. package/dist/{auth-75rP3vc0.mjs → auth-DX3_VbOL.mjs} +8 -8
  21. package/dist/{auth-w4UTRbIf.cjs → auth-DhZkCYgz.cjs} +8 -8
  22. package/dist/{auth-BX6xrdHv.mjs → auth-hEcrRFkt.mjs} +5 -5
  23. package/dist/{auto-BhmWtRvv.mjs → auto-BI4y9q_F.mjs} +14 -14
  24. package/dist/{auto-xr_gqUoy.cjs → auto-C4fniaPr.cjs} +14 -14
  25. package/dist/{bootstrap-Dn_VvHSt.mjs → bootstrap-CBoerZOm.mjs} +2 -2
  26. package/dist/{bootstrap-3ti7LXMz.cjs → bootstrap-DPbGC_1B.cjs} +2 -2
  27. package/dist/{browser-C4PVyjGe.cjs → browser-BRH_1Tgz.cjs} +1 -1
  28. package/dist/{browser-C4wWGXH7.mjs → browser-ilsUkzwR.mjs} +1 -1
  29. package/dist/{claudeLocal-B8rOA-EB.mjs → claudeLocal-CmRDtqcj.mjs} +4 -4
  30. package/dist/{claudeLocal-DZALKVVc.cjs → claudeLocal-D6-w4R7R.cjs} +4 -4
  31. package/dist/{claudeLocalLauncher-CJPRSv3z.mjs → claudeLocalLauncher-B9gzCvDn.mjs} +9 -9
  32. package/dist/{claudeLocalLauncher-Bf5uj0EA.cjs → claudeLocalLauncher-D93IuVcy.cjs} +9 -9
  33. package/dist/{claudeSessionFork-unEBLW0t.cjs → claudeSessionFork-Bo-LD1DH.cjs} +1 -1
  34. package/dist/{claudeSessionFork-BK4U655i.mjs → claudeSessionFork-ghL7gnlU.mjs} +1 -1
  35. package/dist/{client-Bh-y6cVc.cjs → client-5SAqN0dw.cjs} +4 -4
  36. package/dist/{client-BbYds4AV.mjs → client-BGLgYzYC.mjs} +4 -4
  37. package/dist/{client-DGsdLx8L.cjs → client-BcUWsWK-.cjs} +2 -2
  38. package/dist/{client-wMlUPnrV.cjs → client-CTsx4zlq.cjs} +2 -2
  39. package/dist/{client-BxtaglBR.mjs → client-DCFPJD00.mjs} +2 -2
  40. package/dist/{client-m-K1b6Qa.mjs → client-DTwpdW59.mjs} +2 -2
  41. package/dist/{client-CvLm25Wq.mjs → client-DhnaMxKS.mjs} +2 -2
  42. package/dist/{client-BKjBr6pc.cjs → client-N9svGBOP.cjs} +2 -2
  43. package/dist/codex/happyMcpStdioBridge.cjs +18 -18
  44. package/dist/codex/happyMcpStdioBridge.mjs +18 -18
  45. package/dist/{codexAppServerClient-6aQelpRl.cjs → codexAppServerClient-3mdddlO9.cjs} +3 -3
  46. package/dist/{codexAppServerClient-BeRimnu9.mjs → codexAppServerClient-CBVlr7hu.mjs} +3 -3
  47. package/dist/{codexCommand-CmGNDs45.mjs → codexCommand-BP88QTCU.mjs} +43 -43
  48. package/dist/{codexCommand-CYVaGmhh.cjs → codexCommand-Bps4LkvI.cjs} +43 -43
  49. package/dist/{codexTermination-B09HyYIB.cjs → codexTermination-C9CVmb9Q.cjs} +1 -1
  50. package/dist/{codexTermination-Z18pGkkl.mjs → codexTermination-CUPmLwbF.mjs} +1 -1
  51. package/dist/{config-Dq_N615Z.cjs → config-O4t1U8Bi.cjs} +3 -3
  52. package/dist/{config-4b-sF37g.mjs → config-eTAvnx-a.mjs} +3 -3
  53. package/dist/{configuration-Fx61b4MJ.cjs → configuration-B-smHMf7.cjs} +1 -1
  54. package/dist/{configuration-H8q1sMwk.mjs → configuration-C4w7_yT9.mjs} +1 -1
  55. package/dist/{connect-D54AnDIT.cjs → connect-BGZmkECR.cjs} +12 -12
  56. package/dist/{connect-BwSwKPzI.mjs → connect-BJT1vGf-.mjs} +12 -12
  57. package/dist/{context-CM1Xd_HO.mjs → context-Cy2pdGOi.mjs} +1 -1
  58. package/dist/{context-D-QOcYuX.cjs → context-Dfj4Pjqz.cjs} +1 -1
  59. package/dist/{controlClient-D9DYqW02.mjs → controlClient-CtBRHlbJ.mjs} +3 -3
  60. package/dist/{controlClient-D04wXKoQ.cjs → controlClient-Dlm7wz-k.cjs} +3 -3
  61. package/dist/{createSessionMetadata-Ce539QXK.cjs → createSessionMetadata-B1NbiqH5.cjs} +2 -2
  62. package/dist/{createSessionMetadata-CHa4pufa.mjs → createSessionMetadata-DqBHMEgs.mjs} +2 -2
  63. package/dist/{deterministicJson-BEeXnWCF.mjs → deterministicJson-B94VfD9g.mjs} +14 -14
  64. package/dist/{deterministicJson-D34CnNHO.cjs → deterministicJson-DGheByZm.cjs} +14 -14
  65. package/dist/{doctor-BX8oWKZq.cjs → doctor-CdXBxTms.cjs} +7 -7
  66. package/dist/{doctor-BI0Iywt_.mjs → doctor-D3Ph5EzU.mjs} +7 -7
  67. package/dist/{downloadTarget-TzXJEh6W.cjs → downloadTarget-BpToCct7.cjs} +6 -6
  68. package/dist/{downloadTarget-DX3m00OE.mjs → downloadTarget-DBDqU17k.mjs} +6 -6
  69. package/dist/{ensureDaemonRunning-BBBqZ6vQ.mjs → ensureDaemonRunning-7J9kb-Sj.mjs} +5 -5
  70. package/dist/{ensureDaemonRunning-Bvu-yyFn.cjs → ensureDaemonRunning-Balq1x5B.cjs} +5 -5
  71. package/dist/{exitNotice-M4UjtWkr.cjs → exitNotice-CTcWpCmg.cjs} +2 -2
  72. package/dist/{exitNotice-gOAdDcL3.mjs → exitNotice-DkJaD0I0.mjs} +2 -2
  73. package/dist/{format-BPAREVhi.mjs → format-0c3qb7FE.mjs} +1 -1
  74. package/dist/{format-BEktLc45.cjs → format-DoTTSy8C.cjs} +1 -1
  75. package/dist/{handleResumeCommand-DziiqogX.mjs → handleResumeCommand-BUIHxf87.mjs} +5 -5
  76. package/dist/{handleResumeCommand-6dYW_WOi.cjs → handleResumeCommand-Dp-rTs9Q.cjs} +5 -5
  77. package/dist/{index-UuWDafdi.mjs → index-B-hkUPYN.mjs} +41 -41
  78. package/dist/{index-CzBvl9py.mjs → index-BlUhrNAx.mjs} +3 -3
  79. package/dist/{index-Cawt-fgZ.cjs → index-CP6WBAk_.cjs} +4 -4
  80. package/dist/{index-BRq5iitn.mjs → index-D47YHzru.mjs} +4 -4
  81. package/dist/{index-DCvq8Cfw.mjs → index-DE5JMca_.mjs} +4 -4
  82. package/dist/{index-bVMcFi7v.cjs → index-DMhMr4cb.cjs} +4 -4
  83. package/dist/{index-BmacwzcK.cjs → index-DWtaNZd1.cjs} +40 -40
  84. package/dist/{index-CoW4RNEb.cjs → index-Du6DD3Re.cjs} +3 -3
  85. package/dist/index.cjs +2 -2
  86. package/dist/index.mjs +2 -2
  87. package/dist/{install-B4OVUIw5.mjs → install-CwQRBYJL.mjs} +3 -3
  88. package/dist/{install-BQc4Hwuo.cjs → install-Sr04Bhi-.cjs} +3 -3
  89. package/dist/{issue-h_BIrzLs.mjs → issue-D9rmZ2Im.mjs} +7 -7
  90. package/dist/{issue-WpLZYxUQ.cjs → issue-pnYFBO-F.cjs} +7 -7
  91. package/dist/lib.cjs +11 -11
  92. package/dist/lib.d.cts +65 -0
  93. package/dist/lib.d.mts +65 -0
  94. package/dist/lib.mjs +11 -11
  95. package/dist/{localHappyAgentAuth-DgLh3xzW.mjs → localHappyAgentAuth-Bc3bo0fI.mjs} +1 -1
  96. package/dist/{localHappyAgentAuth-DQRWBUxQ.cjs → localHappyAgentAuth-BpBQ_aFo.cjs} +1 -1
  97. package/dist/{logger-BKAKIZdy.mjs → logger-8f-WNgus.mjs} +2 -2
  98. package/dist/{logger-DP35yx-C.cjs → logger-HxTu5uFs.cjs} +2 -2
  99. package/dist/{machineMetadata-CZj0XwM_.cjs → machineMetadata-C7DEm41X.cjs} +3 -3
  100. package/dist/{machineMetadata-DTlMMhj_.mjs → machineMetadata-EyybyGYp.mjs} +3 -3
  101. package/dist/{main-l_nP9IQq.cjs → main-CW8xXpXM.cjs} +48 -48
  102. package/dist/{main-BIE1zeaH.mjs → main-Dmb6KKtB.mjs} +48 -48
  103. package/dist/{mcp-KQHODyR3.cjs → mcp-BHKpSJPk.cjs} +15 -15
  104. package/dist/{mcp-B5F6-_7o.mjs → mcp-DAuW3X2i.mjs} +15 -15
  105. package/dist/{mirrorProtocol-duXHJeBW.cjs → mirrorProtocol-Cmxr0YBU.cjs} +2 -2
  106. package/dist/{mirrorProtocol-DDOUSWqL.mjs → mirrorProtocol-kXv1EaAI.mjs} +2 -2
  107. package/dist/{package-BCJfNMlt.cjs → package-ChmhpzsE.cjs} +8 -8
  108. package/dist/{package-CMmhJwSf.mjs → package-Cp8RjVmm.mjs} +8 -8
  109. package/dist/{panels-CBlIJIu8.cjs → panels-iylFFXPZ.cjs} +5 -5
  110. package/dist/{panels-BWxZMb_x.mjs → panels-x99J6c1O.mjs} +5 -5
  111. package/dist/{peerTools-C6Y28jqG.cjs → peerTools-ZUDz2PCs.cjs} +5 -5
  112. package/dist/{peerTools-ZJzoM48N.mjs → peerTools-jWghbgAH.mjs} +5 -5
  113. package/dist/{persistence-dLgWDclq.mjs → persistence-D1E7jiV4.mjs} +2 -2
  114. package/dist/{persistence-iiVFxhbt.cjs → persistence-DxboRqwb.cjs} +2 -2
  115. package/dist/{piRunnerArgs-DuWYye4f.mjs → piRunnerArgs-BM9b8W_4.mjs} +1 -1
  116. package/dist/{piRunnerArgs-DxWxgOSZ.cjs → piRunnerArgs-gNYQH48T.cjs} +1 -1
  117. package/dist/{piRuntime-Cbwk6bN0.mjs → piRuntime-B6X6ax5K.mjs} +1 -1
  118. package/dist/{piRuntime-6UnkPaS1.cjs → piRuntime-mqdaYw91.cjs} +1 -1
  119. package/dist/{piTerminal-BaoUqlM0.cjs → piTerminal-D-bOYy3E.cjs} +17 -17
  120. package/dist/{piTerminal-Dn0qN9nb.mjs → piTerminal-DaoQF1Rn.mjs} +17 -17
  121. package/dist/{pushNotifications-gcQv61e6.cjs → pushNotifications-EJWZAYed.cjs} +19 -2
  122. package/dist/{pushNotifications-DD9Z0CoN.mjs → pushNotifications-WgO2p0eT.mjs} +19 -2
  123. package/dist/{query-CFdlRD7b.mjs → query-BGtAkN33.mjs} +1 -1
  124. package/dist/{query-12momZSq.cjs → query-ykhx5AZx.cjs} +1 -1
  125. package/dist/{rateLimitWindows-CVS-btq-.mjs → rateLimitWindows-BRImToc6.mjs} +1 -1
  126. package/dist/{rateLimitWindows-D2Gmg7jU.cjs → rateLimitWindows-Cfdnt4On.cjs} +1 -1
  127. package/dist/{reconnectGate-m81ySKhh.mjs → reconnectGate-B9iXSyiI.mjs} +1 -1
  128. package/dist/{reconnectGate-BkSaZdIx.cjs → reconnectGate-DY97bPDg.cjs} +1 -1
  129. package/dist/{registerCommonHandlers-CqLHkmG2.mjs → registerCommonHandlers-YbBzC20u.mjs} +2 -2
  130. package/dist/{registerCommonHandlers-B5p3ZZmp.cjs → registerCommonHandlers-YsrcwRo3.cjs} +2 -2
  131. package/dist/{registerKillSessionHandler-Bf_Q9yii.cjs → registerKillSessionHandler-ClPpvQnu.cjs} +5 -5
  132. package/dist/{registerKillSessionHandler-jYSuGIP1.mjs → registerKillSessionHandler-d3rziH37.mjs} +5 -5
  133. package/dist/{registerSideQuestionHandler-CPR29B9d.mjs → registerSideQuestionHandler-C3K33AGg.mjs} +4 -4
  134. package/dist/{registerSideQuestionHandler-DSIw3xPW.cjs → registerSideQuestionHandler-CMvcaD2A.cjs} +4 -4
  135. package/dist/{remoteSessionClient-CLuxs0_y.mjs → remoteSessionClient-B1C7gwqX.mjs} +5 -5
  136. package/dist/{remoteSessionClient-DX-60nto.cjs → remoteSessionClient-e9jDdGyc.cjs} +5 -5
  137. package/dist/{reportProgressTool-k3g3D6cX.mjs → reportProgressTool-67vB9Y7g.mjs} +4 -4
  138. package/dist/{reportProgressTool-D1XAxeY1.cjs → reportProgressTool-B3yNkD_S.cjs} +4 -4
  139. package/dist/{run-BBJqaIoY.mjs → run-BjpvcAAW.mjs} +269 -37
  140. package/dist/{run-DOb_agpA.cjs → run-c4votzBI.cjs} +269 -37
  141. package/dist/{runClaude-NTvReMNp.mjs → runClaude-B1NEkS3e.mjs} +20 -20
  142. package/dist/{runClaude-BU3Lrd5o.cjs → runClaude-DkaZHsDR.cjs} +20 -20
  143. package/dist/{runClaudeDeps-DQV-QdDi.cjs → runClaudeDeps-C8s0t81_.cjs} +38 -38
  144. package/dist/{runClaudeDeps-Dh2LVY2w.mjs → runClaudeDeps-JYJCSgT2.mjs} +44 -44
  145. package/dist/{runGemini-CGD4bqQ3.mjs → runGemini-Bgmlv2sP.mjs} +35 -35
  146. package/dist/{runGemini-dk877ztP.cjs → runGemini-m1e3OwXi.cjs} +35 -35
  147. package/dist/{runOpenClaw-CQakHPPq.cjs → runOpenClaw-B5iSbZvU.cjs} +17 -17
  148. package/dist/{runOpenClaw-6MAJ_tHi.mjs → runOpenClaw-BTry3E0Y.mjs} +17 -17
  149. package/dist/{sandbox-B3YMD9I6.mjs → sandbox-BPZsegqb.mjs} +4 -4
  150. package/dist/{sandbox-8DeDre0R.cjs → sandbox-D-irSe8t.cjs} +4 -4
  151. package/dist/{selfCheck-BpvUNBmv.cjs → selfCheck-08_EII_I.cjs} +39 -39
  152. package/dist/selfCheck-BPzN6ip2.mjs +89 -0
  153. package/dist/{send-DgrbVZzC.mjs → send-4esWxXzr.mjs} +8 -8
  154. package/dist/{send-Bym_IU4n.cjs → send-DUNnoCVK.cjs} +8 -8
  155. package/dist/{server-CmAgeEhS.mjs → server-Bn1QXAY4.mjs} +4 -4
  156. package/dist/{server-BY-FubRe.cjs → server-NG8ODDc_.cjs} +6 -6
  157. package/dist/{sessionLock-BMtAQ4bW.mjs → sessionLock-BKnXIWnQ.mjs} +9 -4
  158. package/dist/{sessionLock-WXtjQC9q.cjs → sessionLock-CW-P7VU9.cjs} +9 -3
  159. package/dist/{sessionOps-BEVzE38e.cjs → sessionOps-Cei-Q7OB.cjs} +4 -4
  160. package/dist/{sessionOps-BxLhHEhM.mjs → sessionOps-Ct7ayY1X.mjs} +4 -4
  161. package/dist/{sessionProvider-B1tL5K5f.mjs → sessionProvider-D8bZBiAX.mjs} +5 -5
  162. package/dist/{sessionProvider-DCnZFxwe.cjs → sessionProvider-DoXNlG4E.cjs} +5 -5
  163. package/dist/{sessionScanner-eX2f-j0u.cjs → sessionScanner-CGs_Lbq7.cjs} +3 -3
  164. package/dist/{sessionScanner-Ctm9w-AJ.mjs → sessionScanner-DivfvOis.mjs} +3 -3
  165. package/dist/{sessions-BuxOqRcc.mjs → sessions-DN47YSMs.mjs} +10 -10
  166. package/dist/{sessions-BG8r7uht.cjs → sessions-VYh46wvf.cjs} +10 -10
  167. package/dist/{setupOfflineReconnection-65k1yEFn.cjs → setupOfflineReconnection-DHBmg5_6.cjs} +2 -2
  168. package/dist/{setupOfflineReconnection-Dd4NCN9i.mjs → setupOfflineReconnection-DqeCU4SM.mjs} +2 -2
  169. package/dist/{spawn-wys_MPgK.mjs → spawn-ChyfhZlN.mjs} +12 -12
  170. package/dist/{spawn-0YaC-DQg.cjs → spawn-DQLUI6h9.cjs} +12 -12
  171. package/dist/{spawnHappyCLI-EvPb0jB3.mjs → spawnHappyCLI-D6R-aIkL.mjs} +1 -1
  172. package/dist/{spawnHappyCLI-Bf_N42fi.cjs → spawnHappyCLI-DIR-U_rK.cjs} +1 -1
  173. package/dist/{startFileWatcher-GF4BNFA1.mjs → startFileWatcher-CQCQrB3d.mjs} +1 -1
  174. package/dist/{startFileWatcher-ikipjpDk.cjs → startFileWatcher-Qy7f8U4k.cjs} +1 -1
  175. package/dist/{startupSessionCreate-Dp3_kvi_.mjs → startupSessionCreate-BgoNJdcx.mjs} +3 -3
  176. package/dist/{startupSessionCreate-CHU23k6u.cjs → startupSessionCreate-cInaqBEd.cjs} +3 -3
  177. package/dist/{sync-Dm6GaS8P.cjs → sync-DS_emV3g.cjs} +1 -1
  178. package/dist/{sync-Co0wRhGu.mjs → sync-DzKT0Ova.mjs} +1 -1
  179. package/dist/{systemPrompt-Ds7HcfDZ.cjs → systemPrompt-DVy690s2.cjs} +1 -1
  180. package/dist/{systemPrompt-5cZbY0sf.mjs → systemPrompt-rpf-Xff-.mjs} +1 -1
  181. package/dist/{teams-DBWFUOC3.mjs → teams-CbqS5j_2.mjs} +8 -8
  182. package/dist/{teams-nrcZL-1X.cjs → teams-DwBVRsbw.cjs} +8 -8
  183. package/dist/{time-NSglRbyr.cjs → time-i8fiLSHv.cjs} +1 -1
  184. package/dist/{time-Cn0mV-di.mjs → time-o_AW-82H.mjs} +1 -1
  185. package/dist/{titleGenerator-CMIUB04_.cjs → titleGenerator-EGdbOCLR.cjs} +2 -2
  186. package/dist/{titleGenerator-hmxUR3rU.mjs → titleGenerator-rKTQTQN7.mjs} +1 -1
  187. package/dist/{todo-CDdBityL.mjs → todo-CWyVxUyT.mjs} +7 -7
  188. package/dist/{todo-D5BoNMb7.cjs → todo-d8aPaBq_.cjs} +7 -7
  189. package/dist/{tools-BmQbzAfY.mjs → tools--22wuNI5.mjs} +1 -1
  190. package/dist/{tools-CLkNfafW.cjs → tools-DtSHBOmt.cjs} +1 -1
  191. package/dist/{uninstall-DCx_qNMZ.cjs → uninstall-BAaq0c10.cjs} +3 -3
  192. package/dist/{uninstall-DE0SH2qs.mjs → uninstall-CJqFoKZO.mjs} +3 -3
  193. package/package.json +8 -8
  194. package/dist/selfCheck-BCKIF6ST.mjs +0 -89
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var mirrorProtocol = require('./mirrorProtocol-duXHJeBW.cjs');
3
+ var mirrorProtocol = require('./mirrorProtocol-Cmxr0YBU.cjs');
4
4
  var fsMkdir = require('./fsMkdir-0K3yENml.cjs');
5
- var piRunnerArgs = require('./piRunnerArgs-DxWxgOSZ.cjs');
5
+ var piRunnerArgs = require('./piRunnerArgs-gNYQH48T.cjs');
6
6
  var fs = require('fs/promises');
7
7
  var os$1 = require('os');
8
8
  var tmp = require('tmp');
@@ -10,20 +10,20 @@ 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 exitNotice = require('./exitNotice-M4UjtWkr.cjs');
14
- var configuration = require('./configuration-Fx61b4MJ.cjs');
15
- var api = require('./api-BnTF8fkj.cjs');
13
+ var exitNotice = require('./exitNotice-CTcWpCmg.cjs');
14
+ var configuration = require('./configuration-B-smHMf7.cjs');
15
+ var api = require('./api-eXuwG3LS.cjs');
16
16
  var spawnAgents = require('./spawnAgents-D4lR468W.cjs');
17
- var logger = require('./logger-DP35yx-C.cjs');
18
- var index$2 = require('./index-CoW4RNEb.cjs');
19
- var auth = require('./auth-By6u_iKB.cjs');
17
+ var logger = require('./logger-HxTu5uFs.cjs');
18
+ var index$2 = require('./index-Du6DD3Re.cjs');
19
+ var auth = require('./auth-CFUuiMdV.cjs');
20
20
  var child_process = require('child_process');
21
- var _package = require('./package-BCJfNMlt.cjs');
22
- var doctor = require('./doctor-BX8oWKZq.cjs');
23
- var spawnHappyCLI = require('./spawnHappyCLI-Bf_N42fi.cjs');
24
- var persistence = require('./persistence-iiVFxhbt.cjs');
25
- var controlClient = require('./controlClient-D04wXKoQ.cjs');
26
- var sessionOps = require('./sessionOps-BEVzE38e.cjs');
21
+ var _package = require('./package-ChmhpzsE.cjs');
22
+ var doctor = require('./doctor-CdXBxTms.cjs');
23
+ var spawnHappyCLI = require('./spawnHappyCLI-DIR-U_rK.cjs');
24
+ var persistence = require('./persistence-DxboRqwb.cjs');
25
+ var controlClient = require('./controlClient-Dlm7wz-k.cjs');
26
+ var sessionOps = require('./sessionOps-Cei-Q7OB.cjs');
27
27
  var index = require('./index-BYL_X3gP.cjs');
28
28
  var fastify = require('fastify');
29
29
  var z = require('zod');
@@ -32,37 +32,37 @@ var authRelay = require('./authRelay-Dy1qU9td.cjs');
32
32
  var node_crypto = require('node:crypto');
33
33
  var previewPath = require('./previewPath-B0rBdhy1.cjs');
34
34
  var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
35
- var rateLimitWindows = require('./rateLimitWindows-D2Gmg7jU.cjs');
36
- var peerTools = require('./peerTools-C6Y28jqG.cjs');
35
+ var rateLimitWindows = require('./rateLimitWindows-Cfdnt4On.cjs');
36
+ var peerTools = require('./peerTools-ZUDz2PCs.cjs');
37
37
  var os = require('node:os');
38
- var remoteSessionClient = require('./remoteSessionClient-DX-60nto.cjs');
39
- var bootstrap = require('./bootstrap-3ti7LXMz.cjs');
40
- var index$1 = require('./index-bVMcFi7v.cjs');
38
+ var remoteSessionClient = require('./remoteSessionClient-e9jDdGyc.cjs');
39
+ var bootstrap = require('./bootstrap-DPbGC_1B.cjs');
40
+ var index$1 = require('./index-DMhMr4cb.cjs');
41
41
  var require$$0 = require('fs');
42
42
  var require$$1 = require('path');
43
43
  var node_child_process = require('node:child_process');
44
44
  var projectPath = require('./projectPath-C3ioB4Bu.cjs');
45
45
  var doctorReadiness = require('./doctorReadiness-Dl6yRQCy.cjs');
46
- var machineMetadata = require('./machineMetadata-CZj0XwM_.cjs');
46
+ var machineMetadata = require('./machineMetadata-C7DEm41X.cjs');
47
47
  var fileStore = require('./fileStore-7qhnbs6N.cjs');
48
48
  var pi = require('./pi-DlsrPCTa.cjs');
49
49
  var codexAccount = require('./codexAccount-BjaHvmKH.cjs');
50
50
  var require$$3 = require('crypto');
51
51
  var detectCLI = require('./detectCLI-BuYR_Qxe.cjs');
52
- var handleResumeCommand = require('./handleResumeCommand-6dYW_WOi.cjs');
52
+ var handleResumeCommand = require('./handleResumeCommand-Dp-rTs9Q.cjs');
53
53
  var webPanels = require('./webPanels-FCgFKvVe.cjs');
54
54
  var promises = require('node:fs/promises');
55
55
  var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
56
- var client = require('./client-BKjBr6pc.cjs');
57
- var sessionLock = require('./sessionLock-WXtjQC9q.cjs');
58
- var client$1 = require('./client-DGsdLx8L.cjs');
56
+ var client = require('./client-N9svGBOP.cjs');
57
+ var sessionLock = require('./sessionLock-CW-P7VU9.cjs');
58
+ var client$1 = require('./client-BcUWsWK-.cjs');
59
59
  var daemonSupervisor = require('./daemonSupervisor-alqGPANc.cjs');
60
60
  var accountService = require('./accountService-SOeB_21A.cjs');
61
61
  var daemonAccounts = require('./daemonAccounts-BOoI7-sw.cjs');
62
62
  var path$1 = require('./path-B7zW-WwE.cjs');
63
63
  var editPaths = require('./editPaths-Bqp4OFPw.cjs');
64
- var startFileWatcher = require('./startFileWatcher-ikipjpDk.cjs');
65
- var sync = require('./sync-Dm6GaS8P.cjs');
64
+ var startFileWatcher = require('./startFileWatcher-Qy7f8U4k.cjs');
65
+ var sync = require('./sync-DS_emV3g.cjs');
66
66
  var types = require('./types-CRS-srZK.cjs');
67
67
  var tmuxSocket = require('./tmuxSocket-Dg11Olx0.cjs');
68
68
  var processTermination = require('./processTermination-f17wxlMb.cjs');
@@ -70,31 +70,31 @@ var doctor$1 = require('./doctor-CJpFhHoK.cjs');
70
70
  var resources = require('./resources-BZ_Be0qM.cjs');
71
71
  var node_util = require('node:util');
72
72
  var template = require('./template-ChUotPTL.cjs');
73
- var client$2 = require('./client-wMlUPnrV.cjs');
73
+ var client$2 = require('./client-CTsx4zlq.cjs');
74
74
  var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
75
75
  var store = require('./store-DGMILdMn.cjs');
76
- require('./acpSessionResume-BCEol11N.cjs');
76
+ require('./acpSessionResume-Cp2majJ5.cjs');
77
77
  require('./prompt-Bof2aQkI.cjs');
78
- require('./pushNotifications-gcQv61e6.cjs');
78
+ require('./pushNotifications-EJWZAYed.cjs');
79
79
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
80
- require('./reconnectGate-BkSaZdIx.cjs');
80
+ require('./reconnectGate-DY97bPDg.cjs');
81
81
  require('node:events');
82
82
  require('socket.io-client');
83
83
  require('./limits-C-a7gr04.cjs');
84
- require('./time-NSglRbyr.cjs');
85
- require('./registerCommonHandlers-B5p3ZZmp.cjs');
84
+ require('./time-i8fiLSHv.cjs');
85
+ require('./registerCommonHandlers-YsrcwRo3.cjs');
86
86
  require('util');
87
87
  require('cross-spawn');
88
88
  require('@paralleldrive/cuid2');
89
89
  require('chalk');
90
90
  require('node:module');
91
91
  require('tweetnacl');
92
- require('./browser-C4PVyjGe.cjs');
92
+ require('./browser-BRH_1Tgz.cjs');
93
93
  require('open');
94
94
  require('./specialCommands-J3JFOq0J.cjs');
95
95
  require('./ids-B6ZC0HGt.cjs');
96
96
  require('url');
97
- require('./localHappyAgentAuth-DQRWBUxQ.cjs');
97
+ require('./localHappyAgentAuth-BpBQ_aFo.cjs');
98
98
  require('./claudeAccountEnv-BTZjHTpF.cjs');
99
99
  require('node:readline');
100
100
  require('node-pty');
@@ -4645,7 +4645,8 @@ function createHarnessInstaller(deps) {
4645
4645
  return {
4646
4646
  /** True while npm may be writing the prefix — including after an unconfirmed kill. */
4647
4647
  isRunning: () => running !== null || blocked,
4648
- async request(params) {
4648
+ /** `requester` is only for the log: the machine page (owner) or B-894's agent auto-update. */
4649
+ async request(params, requester = "owner") {
4649
4650
  const harness = params && typeof params === "object" ? params.harness : void 0;
4650
4651
  if (!index.isHarnessInstallId(harness)) {
4651
4652
  deps.log(`[HARNESS] refused install request for an unknown harness`);
@@ -4667,7 +4668,7 @@ function createHarnessInstaller(deps) {
4667
4668
  return location;
4668
4669
  }
4669
4670
  const startedAt = now();
4670
- deps.log(`[HARNESS] owner requested ${harness} install`);
4671
+ deps.log(`[HARNESS] ${requester === "auto-update" ? "agent auto-update" : "owner"} requested ${harness} install`);
4671
4672
  deps.publish({ harness, state: "installing", startedAt, at: startedAt });
4672
4673
  void run(harness, location.prefix, startedAt);
4673
4674
  return { accepted: true, harness };
@@ -4675,6 +4676,197 @@ function createHarnessInstaller(deps) {
4675
4676
  };
4676
4677
  }
4677
4678
 
4679
+ const AGENT_AUTO_UPDATE_HARNESSES = ["codex"];
4680
+ const AGENT_AUTO_UPDATE_MAX_ATTEMPTS = 2;
4681
+ const AGENT_AUTO_UPDATE_BACKOFF_MS = 30 * 60 * 1e3;
4682
+ const AGENT_AUTO_UPDATE_SNAPSHOT_MAX_AGE_MS = 12 * 60 * 60 * 1e3;
4683
+ const TRANSIENT_REFUSALS = /* @__PURE__ */ new Set(["install_in_progress", "cli_update_in_progress"]);
4684
+ function decideAgentAutoUpdate(input) {
4685
+ const { harness } = input;
4686
+ if (!input.enabled) return { action: "skip", harness, reason: "disabled" };
4687
+ const versions = input.versions;
4688
+ if (!versions || input.now - versions.checkedAt > AGENT_AUTO_UPDATE_SNAPSHOT_MAX_AGE_MS) return { action: "skip", harness, reason: "no-versions" };
4689
+ const agent = versions.agents.find((a) => a.id === harness);
4690
+ if (!agent || agent.status !== "update-available" || !agent.latest) return { action: "skip", harness, reason: "current" };
4691
+ const target = agent.latest;
4692
+ const attempt = input.attempt?.target === target ? input.attempt : void 0;
4693
+ if (attempt?.succeeded) return { action: "skip", harness, reason: "still-outdated", target };
4694
+ if (attempt && attempt.attempts >= AGENT_AUTO_UPDATE_MAX_ATTEMPTS) return { action: "skip", harness, reason: "gave-up", target };
4695
+ if (attempt && input.now - attempt.lastAt < AGENT_AUTO_UPDATE_BACKOFF_MS) return { action: "skip", harness, reason: "backoff", target };
4696
+ if (input.turnActive) return { action: "skip", harness, reason: "turn-active", target };
4697
+ if (input.installerBusy) return { action: "skip", harness, reason: "installer-busy", target };
4698
+ return { action: "install", harness, from: agent.installed, target };
4699
+ }
4700
+ function createAgentAutoUpdater(deps) {
4701
+ const now = deps.now ?? Date.now;
4702
+ const loaded = deps.store?.read() ?? { attempts: {}, statuses: {} };
4703
+ const attempts = new Map(
4704
+ Object.entries(loaded.attempts).map(([harness, attempt]) => [harness, attempt])
4705
+ );
4706
+ const statuses = { ...loaded.statuses };
4707
+ const save = () => {
4708
+ try {
4709
+ deps.store?.write({ attempts: Object.fromEntries(attempts), statuses: { ...statuses } });
4710
+ } catch (error) {
4711
+ deps.log(`[AGENT AUTO-UPDATE] could not save state: ${String(error)}`);
4712
+ }
4713
+ };
4714
+ for (const status of Object.values(statuses)) {
4715
+ if (status.state !== "installing") continue;
4716
+ const attempt = attempts.get(status.harness);
4717
+ if (attempt?.target === status.target) attempt.detail = "interrupted_by_daemon_restart";
4718
+ statuses[status.harness] = {
4719
+ ...status,
4720
+ state: status.attempts >= AGENT_AUTO_UPDATE_MAX_ATTEMPTS ? "gave-up" : "failed",
4721
+ detail: "interrupted_by_daemon_restart"
4722
+ };
4723
+ }
4724
+ if (Object.keys(statuses).length > 0) {
4725
+ save();
4726
+ deps.publish({ ...statuses });
4727
+ }
4728
+ let pending = null;
4729
+ let ticking = false;
4730
+ const setStatus = (status) => {
4731
+ statuses[status.harness] = status;
4732
+ save();
4733
+ deps.publish({ ...statuses });
4734
+ };
4735
+ const fail = (harness, target, detail) => {
4736
+ const attempt = attempts.get(harness);
4737
+ attempt.detail = detail;
4738
+ const gaveUp = attempt.attempts >= AGENT_AUTO_UPDATE_MAX_ATTEMPTS;
4739
+ deps.log(`[AGENT AUTO-UPDATE] ${harness} \u2192 ${target} failed (attempt ${attempt.attempts}): ${detail}${gaveUp ? "; giving up on this version" : ""}`);
4740
+ setStatus({ harness, target, state: gaveUp ? "gave-up" : "failed", detail, attempts: attempt.attempts, at: now() });
4741
+ };
4742
+ async function tick() {
4743
+ if (ticking || pending) return;
4744
+ ticking = true;
4745
+ try {
4746
+ for (const harness of AGENT_AUTO_UPDATE_HARNESSES) {
4747
+ const decision = decideAgentAutoUpdate({
4748
+ harness,
4749
+ enabled: deps.enabled(),
4750
+ versions: deps.versions(),
4751
+ turnActive: deps.turnActive(harness),
4752
+ installerBusy: deps.installerBusy(),
4753
+ attempt: attempts.get(harness),
4754
+ now: now()
4755
+ });
4756
+ if (decision.action !== "install") {
4757
+ const status = statuses[harness];
4758
+ if (decision.reason === "still-outdated" && status?.state === "installed" && status.target === decision.target) {
4759
+ const attempt2 = attempts.get(harness);
4760
+ attempt2.attempts = AGENT_AUTO_UPDATE_MAX_ATTEMPTS;
4761
+ fail(harness, decision.target, "still_outdated_after_install");
4762
+ }
4763
+ continue;
4764
+ }
4765
+ const prior = attempts.get(harness);
4766
+ const attempt = prior?.target === decision.target ? { ...prior, attempts: prior.attempts + 1, lastAt: now() } : { target: decision.target, attempts: 1, lastAt: now() };
4767
+ attempts.set(harness, attempt);
4768
+ deps.log(`[AGENT AUTO-UPDATE] ${harness} ${decision.from ?? "?"} \u2192 ${decision.target} (attempt ${attempt.attempts})`);
4769
+ pending = { harness, target: decision.target };
4770
+ setStatus({ harness, target: decision.target, state: "installing", attempts: attempt.attempts, at: now() });
4771
+ const result = await deps.request(harness).catch((error) => ({ error: `request_failed: ${String(error)}` }));
4772
+ if ("accepted" in result) return;
4773
+ pending = null;
4774
+ if (TRANSIENT_REFUSALS.has(result.error)) {
4775
+ if (prior?.target === decision.target) attempts.set(harness, prior);
4776
+ else attempts.delete(harness);
4777
+ const before = statuses[harness];
4778
+ delete statuses[harness];
4779
+ save();
4780
+ if (before) deps.publish({ ...statuses });
4781
+ continue;
4782
+ }
4783
+ fail(harness, decision.target, result.error);
4784
+ }
4785
+ } finally {
4786
+ ticking = false;
4787
+ }
4788
+ }
4789
+ function onInstallState(state) {
4790
+ if (!pending || state.harness !== pending.harness || state.state === "installing") return;
4791
+ const { harness, target } = pending;
4792
+ pending = null;
4793
+ const attempt = attempts.get(harness);
4794
+ if (!attempt) return;
4795
+ if (state.state === "installed") {
4796
+ attempt.succeeded = true;
4797
+ deps.log(`[AGENT AUTO-UPDATE] ${harness} \u2192 ${target} installed`);
4798
+ setStatus({ harness, target, state: "installed", attempts: attempt.attempts, at: now() });
4799
+ } else {
4800
+ fail(harness, target, state.detail ?? "unknown");
4801
+ }
4802
+ }
4803
+ return { tick, onInstallState, statuses: () => ({ ...statuses }) };
4804
+ }
4805
+ const AGENT_AUTO_UPDATE_TICK_MS = 5 * 60 * 1e3;
4806
+ function resolveAgentAutoUpdateTickMs(raw) {
4807
+ const value = raw === void 0 ? NaN : Number(raw);
4808
+ return Number.isFinite(value) && value >= 1e3 ? value : AGENT_AUTO_UPDATE_TICK_MS;
4809
+ }
4810
+
4811
+ const STATES = /* @__PURE__ */ new Set(["installing", "installed", "failed", "gave-up"]);
4812
+ const isCount = (v) => typeof v === "number" && Number.isFinite(v) && v >= 0;
4813
+ function parseAttempt(raw) {
4814
+ if (!raw || typeof raw !== "object") return null;
4815
+ const { target, attempts, lastAt, succeeded, detail } = raw;
4816
+ if (typeof target !== "string" || !target || !isCount(attempts) || !isCount(lastAt)) return null;
4817
+ return {
4818
+ target,
4819
+ attempts,
4820
+ lastAt,
4821
+ ...succeeded === true ? { succeeded: true } : {},
4822
+ ...typeof detail === "string" ? { detail } : {}
4823
+ };
4824
+ }
4825
+ function parseStatus(harness, raw) {
4826
+ if (!raw || typeof raw !== "object") return null;
4827
+ const { target, state, detail, attempts, at } = raw;
4828
+ if (typeof target !== "string" || !target || typeof state !== "string" || !STATES.has(state) || !isCount(attempts) || !isCount(at)) return null;
4829
+ return {
4830
+ harness,
4831
+ target,
4832
+ state,
4833
+ attempts,
4834
+ at,
4835
+ ...typeof detail === "string" ? { detail } : {}
4836
+ };
4837
+ }
4838
+ function parseAgentAutoUpdatePersisted(raw) {
4839
+ const out = { attempts: {}, statuses: {} };
4840
+ if (!raw || typeof raw !== "object") return out;
4841
+ const { attempts, statuses } = raw;
4842
+ for (const [harness, value] of Object.entries(attempts && typeof attempts === "object" ? attempts : {})) {
4843
+ const attempt = parseAttempt(value);
4844
+ if (attempt) out.attempts[harness] = attempt;
4845
+ }
4846
+ for (const [harness, value] of Object.entries(statuses && typeof statuses === "object" ? statuses : {})) {
4847
+ const status = parseStatus(harness, value);
4848
+ if (status) out.statuses[harness] = status;
4849
+ }
4850
+ return out;
4851
+ }
4852
+ function agentAutoUpdateStore(homeDir) {
4853
+ const file = path.join(homeDir, "agent-auto-update.json");
4854
+ return {
4855
+ read() {
4856
+ try {
4857
+ return parseAgentAutoUpdatePersisted(JSON.parse(node_fs.readFileSync(file, "utf8")));
4858
+ } catch {
4859
+ return { attempts: {}, statuses: {} };
4860
+ }
4861
+ },
4862
+ write(state) {
4863
+ const tmp = `${file}.${process.pid}.tmp`;
4864
+ node_fs.writeFileSync(tmp, JSON.stringify(state), { mode: 384 });
4865
+ node_fs.renameSync(tmp, file);
4866
+ }
4867
+ };
4868
+ }
4869
+
4678
4870
  function buildPresenceBatch(live, previous) {
4679
4871
  const current = new Set(live.map((s) => s.sessionId));
4680
4872
  const sessions = live.slice(0, 200).map((s) => ({
@@ -7731,6 +7923,7 @@ async function startDaemon() {
7731
7923
  let claudeCredentialStoreSetting = (await persistence.readSettings()).claudeCredentialStore === "file" ? "file" : "auto";
7732
7924
  let agentHibernationSetting = (await persistence.readSettings()).agentHibernationIdleMs;
7733
7925
  let autoRestartSetting = (await persistence.readSettings()).autoRestartSessions !== false;
7926
+ let agentAutoUpdateSetting = (await persistence.readSettings()).agentAutoUpdate === true;
7734
7927
  try {
7735
7928
  const homes = await index$1.refreshAgentHomes();
7736
7929
  logger.logger.debug(`[DAEMON RUN] Claude config dir: ${loginShellEnv.describeAgentHome(homes.claudeConfigDir)}; Codex home: ${loginShellEnv.describeAgentHome(homes.codexHome)}`);
@@ -8431,6 +8624,7 @@ async function startDaemon() {
8431
8624
  }
8432
8625
  return sessionIdToFinishedSession.get(happySessionId);
8433
8626
  };
8627
+ const trackedSessionFlavor = (happySessionId) => findTrackedSessionById(happySessionId)?.happySessionMetadataFromLocalWebhook?.flavor ?? "claude";
8434
8628
  const persistRestoreRecord = (happySessionId, fallback, metadata) => {
8435
8629
  const candidates = [...pidToTrackedSession.values()].filter((s) => s.happySessionId === happySessionId && isPidAlive(s.pid));
8436
8630
  const live = candidates.find((s) => s.childProcess) ?? candidates[0];
@@ -8666,6 +8860,16 @@ async function startDaemon() {
8666
8860
  };
8667
8861
  const restartSessionImpl = async (happySessionId, options) => {
8668
8862
  try {
8863
+ if (options?.ifIdle) {
8864
+ const busy = sessionLock.restartIdleRefusal({
8865
+ turnActive: turnActivity.activeSessions().includes(happySessionId),
8866
+ backgroundTasks: backgroundTasks.count(happySessionId)
8867
+ });
8868
+ if (busy) {
8869
+ logger.logger.debug(`[DAEMON RUN] restart-session ${happySessionId} refused (ifIdle): ${busy}`);
8870
+ return { type: "error", errorMessage: `busy:${busy}` };
8871
+ }
8872
+ }
8669
8873
  const counts = options?.account ? accountRestartCounts : restartCounts;
8670
8874
  const prior = counts.get(happySessionId) ?? 0;
8671
8875
  const decision = options?.auto ? { allowed: true } : decideRestart(prior, options?.account ? DEFAULT_MAX_ACCOUNT_RESTARTS : DEFAULT_MAX_RESTARTS);
@@ -9154,6 +9358,13 @@ async function startDaemon() {
9154
9358
  return autoRestartSetting;
9155
9359
  });
9156
9360
  setTimeout(() => autoRestartScheduler.sweep(), 5e3).unref?.();
9361
+ let agentAutoUpdater = null;
9362
+ apiMachine.setAgentAutoUpdateHandlers(agentAutoUpdateSetting, async (enabled) => {
9363
+ await persistence.updateSettings((current) => ({ ...current, agentAutoUpdate: enabled }));
9364
+ agentAutoUpdateSetting = enabled;
9365
+ void agentAutoUpdater?.tick();
9366
+ return agentAutoUpdateSetting;
9367
+ });
9157
9368
  const accountService$1 = new accountService.AccountService({
9158
9369
  home: configuration.configuration.happyHomeDir,
9159
9370
  env: process.env,
@@ -9293,7 +9504,9 @@ async function startDaemon() {
9293
9504
  const stopAgentVersionChecks = mirrorProtocol.startAgentVersionChecks(
9294
9505
  (snapshot) => {
9295
9506
  latestAgentVersions = snapshot;
9296
- return apiMachine.updateDaemonState((state) => ({ ...state, status: state?.status ?? "running", agentVersions: snapshot }));
9507
+ return apiMachine.updateDaemonState((state) => ({ ...state, status: state?.status ?? "running", agentVersions: snapshot })).finally(() => {
9508
+ void agentAutoUpdater?.tick();
9509
+ });
9297
9510
  },
9298
9511
  (error) => logger.logger.debug("[DAEMON RUN] Agent version check failed", error)
9299
9512
  );
@@ -9303,6 +9516,7 @@ async function startDaemon() {
9303
9516
  commandOnPath: detectCLI.commandOnPath,
9304
9517
  cliUpdateBusy: () => updateController.isRunning() || handoverInFlight,
9305
9518
  publish: (state) => {
9519
+ agentAutoUpdater?.onInstallState(state);
9306
9520
  void apiMachine.updateDaemonState((current) => ({ ...current, status: current?.status ?? "running", harnessInstall: state })).catch((error) => logger.logger.debug("[DAEMON RUN] harness install state publish failed", error));
9307
9521
  },
9308
9522
  afterInstall: async () => {
@@ -9312,6 +9526,22 @@ async function startDaemon() {
9312
9526
  log: (message) => logger.logger.warn(`[DAEMON RUN] ${message}`)
9313
9527
  });
9314
9528
  apiMachine.setHarnessInstallHandler((params) => harnessInstaller.request(params));
9529
+ agentAutoUpdater = createAgentAutoUpdater({
9530
+ enabled: () => agentAutoUpdateSetting,
9531
+ versions: () => latestAgentVersions,
9532
+ turnActive: (harness) => turnActivity.activeSessions().some((id) => trackedSessionFlavor(id) === harness),
9533
+ installerBusy: () => !!harnessInstaller?.isRunning() || updateController.isRunning() || handoverInFlight,
9534
+ request: (harness) => harnessInstaller.request({ harness }, "auto-update"),
9535
+ publish: (status) => {
9536
+ void apiMachine.setAgentAutoUpdateStatus(status);
9537
+ },
9538
+ log: (message) => logger.logger.warn(`[DAEMON RUN] ${message}`),
9539
+ store: agentAutoUpdateStore(configuration.configuration.happyHomeDir)
9540
+ });
9541
+ const agentAutoUpdateInterval = setInterval(() => {
9542
+ void agentAutoUpdater?.tick();
9543
+ }, resolveAgentAutoUpdateTickMs(process.env.HAPPY_AGENT_AUTO_UPDATE_TICK_MS));
9544
+ agentAutoUpdateInterval.unref?.();
9315
9545
  const heartbeatIntervalMs = parseInt(process.env.HAPPY_DAEMON_HEARTBEAT_INTERVAL || "60000");
9316
9546
  const wakeDetector = createWakeDetector(heartbeatIntervalMs);
9317
9547
  const restartOnStaleVersionAndHeartbeat = setInterval(serialTask(async () => {
@@ -9361,6 +9591,7 @@ async function startDaemon() {
9361
9591
  projectPresence?.stop();
9362
9592
  clearInterval(restartOnStaleVersionAndHeartbeat);
9363
9593
  clearInterval(cliUpdateInterval);
9594
+ clearInterval(agentAutoUpdateInterval);
9364
9595
  policyAnnouncements.stop();
9365
9596
  policyRefresh.stop();
9366
9597
  stopAgentVersionChecks();
@@ -9502,6 +9733,7 @@ async function startDaemon() {
9502
9733
  logger.logger.debug("[DAEMON RUN] Health check interval cleared");
9503
9734
  }
9504
9735
  clearInterval(cliUpdateInterval);
9736
+ clearInterval(agentAutoUpdateInterval);
9505
9737
  clearInterval(autoRestartSweep);
9506
9738
  policyAnnouncements.stop();
9507
9739
  policyRefresh.stop();
@@ -1,26 +1,26 @@
1
1
  import os from 'node:os';
2
- import { A as AUTO_RESTART_CAPABILITY, c as claimSessionOrExit, a as applyServerSnapshot, b as applyReconnectReplay, w as withoutServerSnapshot, m as mergeReconnectMetadata, t as takeAutoRestartedEvent, e as exitCursorStamp } from './sessionLock-BMtAQ4bW.mjs';
3
- import { r as readSettings, H as HIBERNATION_CAPABILITY, a as resolveCheckMs, l as latchKeepAwake, e as evaluateWrapperIdle } from './persistence-dLgWDclq.mjs';
4
- import { c as createSessionForStartup, H as HibernationProbe, a as commitHibernation } from './startupSessionCreate-Dp3_kvi_.mjs';
2
+ import { A as AUTO_RESTART_CAPABILITY, c as claimSessionOrExit, a as applyServerSnapshot, b as applyReconnectReplay, w as withoutServerSnapshot, m as mergeReconnectMetadata, t as takeAutoRestartedEvent, e as exitCursorStamp } from './sessionLock-BKnXIWnQ.mjs';
3
+ import { r as readSettings, H as HIBERNATION_CAPABILITY, a as resolveCheckMs, l as latchKeepAwake, e as evaluateWrapperIdle } from './persistence-D1E7jiV4.mjs';
4
+ import { c as createSessionForStartup, H as HibernationProbe, a as commitHibernation } from './startupSessionCreate-BgoNJdcx.mjs';
5
5
  import { randomUUID } from 'node:crypto';
6
- import { c as connectionState, A as ApiClient, s as startOfflineReconnection } from './api-20GbdpxY.mjs';
7
- import { l as logger } from './logger-BKAKIZdy.mjs';
8
- import { s as spawnOriginTags, a as sessionWorktreeMetadata } from './createSessionMetadata-CHa4pufa.mjs';
9
- import { p as packageJson } from './package-CMmhJwSf.mjs';
6
+ import { c as connectionState, A as ApiClient, s as startOfflineReconnection } from './api-D7EAwOT2.mjs';
7
+ import { l as logger } from './logger-8f-WNgus.mjs';
8
+ import { s as spawnOriginTags, a as sessionWorktreeMetadata } from './createSessionMetadata-DqBHMEgs.mjs';
9
+ import { p as packageJson } from './package-Cp8RjVmm.mjs';
10
10
  import { P as PROMPT_QUEUE_CAPABILITY, a as PROJECT_SESSION_CAPABILITY, R as RUN_INTENT_CAPABILITY, C as CLAUDE_CONFIG_MODEL_CAPABILITY, A as AGENT_PROFILE_SESSION_CAPABILITY, I as ISSUE_SESSION_CAPABILITY, r as restoredEffort, b as restoredModel } from './index-DWk-WTU-.mjs';
11
11
  import { D as DEFAULT_CLAUDE_PERMISSION_MODE, r as registerRunIntentRpc, a as recordRunIntents, w as withoutEffort } from './defaultPermissionMode-CYQi7vqJ.mjs';
12
12
  import { F as FORK_BACKFILL_CAPABILITY, a as announceForkBackfill, p as publishForkBackfillWhenCommitted } from './forkBackfill-C9EfJ64O.mjs';
13
- import { c as configuration } from './configuration-H8q1sMwk.mjs';
13
+ import { c as configuration } from './configuration-C4w7_yT9.mjs';
14
14
  import { l as loadWrapperAccount } from './wrapperAccount-CwaA-n1S.mjs';
15
15
  import { S as SPAWN_ACCOUNT_ENV } from './store-Fge1h9wy.mjs';
16
- import { n as notifyDaemonSessionStarted, c as checkDaemonHibernation } from './controlClient-D9DYqW02.mjs';
17
- import { g as getInitialMachineMetadata } from './machineMetadata-DTlMMhj_.mjs';
16
+ import { n as notifyDaemonSessionStarted, c as checkDaemonHibernation } from './controlClient-CtBRHlbJ.mjs';
17
+ import { g as getInitialMachineMetadata } from './machineMetadata-EyybyGYp.mjs';
18
18
  import { p as projectPath } from './projectPath-BTBIMB57.mjs';
19
19
  import { resolve, join } from 'node:path';
20
20
  import { a as applySandboxPermissionPolicy, r as resolveInitialClaudePermissionMode, l as longContextStorePath, b as longContextKey, c as readClaudeMergedSettings, d as readClaudeConfiguredModel, m as mapToClaudeMode, w as withoutRefusedLongContext, e as messageModelIntent, f as createLongContextPolicy, g as readLongContextVerdict, h as reconcilePublishedPermissionMode } from './claudeLongContext-CZ60xo5p.mjs';
21
21
  import { d as decodeBase64, e as encodeBase64 } from './authRelay-DhQhkBvX.mjs';
22
22
  import { readFile } from 'node:fs/promises';
23
- import { C as CLAUDE_ATTACHMENT_KINDS, s as stripAttachmentManifest } from './attachmentContent-Coo9lUxK.mjs';
23
+ import { C as CLAUDE_ATTACHMENT_KINDS, s as stripAttachmentManifest } from './attachmentContent-DV7W3vw7.mjs';
24
24
  import { T as TranscriptPathHints } from './transcriptCursor-B7T_gkQ0.mjs';
25
25
  import { p as planClaudeStartup } from './startupPlan-DFMyNgAs.mjs';
26
26
  import { t as takeReconnectEnv } from './reconnectEnv-DeSvHl3q.mjs';
@@ -32,30 +32,30 @@ import 'node:child_process';
32
32
  import './processTreeSnapshot-fuwxC0fr.mjs';
33
33
  import 'zod';
34
34
  import 'axios';
35
- import './pushNotifications-DD9Z0CoN.mjs';
35
+ import './pushNotifications-WgO2p0eT.mjs';
36
36
  import './contentLogMetadata-BlWI0egu.mjs';
37
- import './reconnectGate-m81ySKhh.mjs';
37
+ import './reconnectGate-B9iXSyiI.mjs';
38
38
  import 'os';
39
39
  import 'child_process';
40
40
  import 'node:events';
41
41
  import 'socket.io-client';
42
42
  import './limits-DIo7rEBR.mjs';
43
- import './time-Cn0mV-di.mjs';
44
- import './registerCommonHandlers-CqLHkmG2.mjs';
43
+ import './time-o_AW-82H.mjs';
44
+ import './registerCommonHandlers-YbBzC20u.mjs';
45
45
  import 'util';
46
46
  import 'fs/promises';
47
47
  import 'crypto';
48
48
  import 'path';
49
49
  import 'cross-spawn';
50
50
  import '@paralleldrive/cuid2';
51
- import './sync-Co0wRhGu.mjs';
51
+ import './sync-DzKT0Ova.mjs';
52
52
  import './backgroundTaskActivity-8PdPxrvy.mjs';
53
53
  import 'chalk';
54
54
  import 'node:util';
55
55
  import './claudeAccountEnv-C6Wl-ZbT.mjs';
56
56
  import './detectCLI-CSGMlV51.mjs';
57
57
  import 'fs';
58
- import './localHappyAgentAuth-DgLh3xzW.mjs';
58
+ import './localHappyAgentAuth-Bc3bo0fI.mjs';
59
59
  import 'tweetnacl';
60
60
  import './fsMkdir-DumgLTzR.mjs';
61
61
  import 'url';
@@ -66,7 +66,7 @@ const CLAUDE_EFFORTS = ["low", "medium", "high", "xhigh", "max"];
66
66
  function restoredClaudeEffort(effort) {
67
67
  return CLAUDE_EFFORTS.includes(effort ?? "") ? effort : void 0;
68
68
  }
69
- const importRunClaudeDeps = () => import('./runClaudeDeps-Dh2LVY2w.mjs');
69
+ const importRunClaudeDeps = () => import('./runClaudeDeps-JYJCSgT2.mjs');
70
70
  async function runClaude(credentials, options = {}) {
71
71
  logger.debug(`[CLAUDE] ===== CLAUDE MODE STARTING =====`);
72
72
  logger.debug(`[CLAUDE] This is the Claude agent, NOT Gemini`);
@@ -82,7 +82,7 @@ async function runClaude(credentials, options = {}) {
82
82
  const isAssistantVariant = process.env.HAPPY_SESSION_VARIANT === "assistant";
83
83
  if (isAssistantVariant) {
84
84
  try {
85
- const { bootstrapAssistantHome } = await import('./bootstrap-Dn_VvHSt.mjs');
85
+ const { bootstrapAssistantHome } = await import('./bootstrap-CBoerZOm.mjs');
86
86
  await bootstrapAssistantHome();
87
87
  } catch (error) {
88
88
  logger.debug("[START] Assistant home bootstrap failed:", error);
@@ -217,7 +217,7 @@ async function runClaude(credentials, options = {}) {
217
217
  }
218
218
  if (!response) {
219
219
  let offlineSessionId = null;
220
- const { claudeLocal } = await import('./claudeLocal-B8rOA-EB.mjs');
220
+ const { claudeLocal } = await import('./claudeLocal-CmRDtqcj.mjs');
221
221
  const { createSessionScanner: createSessionScanner2 } = await loadDeps();
222
222
  const reconnection = startOfflineReconnection({
223
223
  serverUrl: configuration.serverUrl,
@@ -1,28 +1,28 @@
1
1
  'use strict';
2
2
 
3
3
  var os = require('node:os');
4
- var sessionLock = require('./sessionLock-WXtjQC9q.cjs');
5
- var persistence = require('./persistence-iiVFxhbt.cjs');
6
- var startupSessionCreate = require('./startupSessionCreate-CHU23k6u.cjs');
4
+ var sessionLock = require('./sessionLock-CW-P7VU9.cjs');
5
+ var persistence = require('./persistence-DxboRqwb.cjs');
6
+ var startupSessionCreate = require('./startupSessionCreate-cInaqBEd.cjs');
7
7
  var node_crypto = require('node:crypto');
8
- var api = require('./api-BnTF8fkj.cjs');
9
- var logger = require('./logger-DP35yx-C.cjs');
10
- var createSessionMetadata = require('./createSessionMetadata-Ce539QXK.cjs');
11
- var _package = require('./package-BCJfNMlt.cjs');
8
+ var api = require('./api-eXuwG3LS.cjs');
9
+ var logger = require('./logger-HxTu5uFs.cjs');
10
+ var createSessionMetadata = require('./createSessionMetadata-B1NbiqH5.cjs');
11
+ var _package = require('./package-ChmhpzsE.cjs');
12
12
  var index = require('./index-BYL_X3gP.cjs');
13
13
  var defaultPermissionMode = require('./defaultPermissionMode-DmLYaaL8.cjs');
14
14
  var forkBackfill = require('./forkBackfill-D2WW91fz.cjs');
15
- var configuration = require('./configuration-Fx61b4MJ.cjs');
15
+ var configuration = require('./configuration-B-smHMf7.cjs');
16
16
  var wrapperAccount = require('./wrapperAccount-BHMM9I6g.cjs');
17
17
  var store = require('./store-DGMILdMn.cjs');
18
- var controlClient = require('./controlClient-D04wXKoQ.cjs');
19
- var machineMetadata = require('./machineMetadata-CZj0XwM_.cjs');
18
+ var controlClient = require('./controlClient-Dlm7wz-k.cjs');
19
+ var machineMetadata = require('./machineMetadata-C7DEm41X.cjs');
20
20
  var projectPath = require('./projectPath-C3ioB4Bu.cjs');
21
21
  var path = require('node:path');
22
22
  var claudeLongContext = require('./claudeLongContext-BR_zdjUp.cjs');
23
23
  var authRelay = require('./authRelay-Dy1qU9td.cjs');
24
24
  var promises = require('node:fs/promises');
25
- var attachmentContent = require('./attachmentContent-B7zz_LPF.cjs');
25
+ var attachmentContent = require('./attachmentContent-DhTreh-W.cjs');
26
26
  var transcriptCursor = require('./transcriptCursor-DcXGLeSc.cjs');
27
27
  var startupPlan = require('./startupPlan-BLMbfQIH.cjs');
28
28
  var reconnectEnv = require('./reconnectEnv-B31lY4nR.cjs');
@@ -34,30 +34,30 @@ require('node:child_process');
34
34
  require('./processTreeSnapshot-D5iNblp6.cjs');
35
35
  require('zod');
36
36
  require('axios');
37
- require('./pushNotifications-gcQv61e6.cjs');
37
+ require('./pushNotifications-EJWZAYed.cjs');
38
38
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
39
- require('./reconnectGate-BkSaZdIx.cjs');
39
+ require('./reconnectGate-DY97bPDg.cjs');
40
40
  require('os');
41
41
  require('child_process');
42
42
  require('node:events');
43
43
  require('socket.io-client');
44
44
  require('./limits-C-a7gr04.cjs');
45
- require('./time-NSglRbyr.cjs');
46
- require('./registerCommonHandlers-B5p3ZZmp.cjs');
45
+ require('./time-i8fiLSHv.cjs');
46
+ require('./registerCommonHandlers-YsrcwRo3.cjs');
47
47
  require('util');
48
48
  require('fs/promises');
49
49
  require('crypto');
50
50
  require('path');
51
51
  require('cross-spawn');
52
52
  require('@paralleldrive/cuid2');
53
- require('./sync-Dm6GaS8P.cjs');
53
+ require('./sync-DS_emV3g.cjs');
54
54
  require('./backgroundTaskActivity-CBvUdj39.cjs');
55
55
  require('chalk');
56
56
  require('node:util');
57
57
  require('./claudeAccountEnv-BTZjHTpF.cjs');
58
58
  require('./detectCLI-BuYR_Qxe.cjs');
59
59
  require('fs');
60
- require('./localHappyAgentAuth-DQRWBUxQ.cjs');
60
+ require('./localHappyAgentAuth-BpBQ_aFo.cjs');
61
61
  require('tweetnacl');
62
62
  require('./fsMkdir-0K3yENml.cjs');
63
63
  require('url');
@@ -68,7 +68,7 @@ const CLAUDE_EFFORTS = ["low", "medium", "high", "xhigh", "max"];
68
68
  function restoredClaudeEffort(effort) {
69
69
  return CLAUDE_EFFORTS.includes(effort ?? "") ? effort : void 0;
70
70
  }
71
- const importRunClaudeDeps = () => Promise.resolve().then(function () { return require('./runClaudeDeps-DQV-QdDi.cjs'); });
71
+ const importRunClaudeDeps = () => Promise.resolve().then(function () { return require('./runClaudeDeps-C8s0t81_.cjs'); });
72
72
  async function runClaude(credentials, options = {}) {
73
73
  logger.logger.debug(`[CLAUDE] ===== CLAUDE MODE STARTING =====`);
74
74
  logger.logger.debug(`[CLAUDE] This is the Claude agent, NOT Gemini`);
@@ -84,7 +84,7 @@ async function runClaude(credentials, options = {}) {
84
84
  const isAssistantVariant = process.env.HAPPY_SESSION_VARIANT === "assistant";
85
85
  if (isAssistantVariant) {
86
86
  try {
87
- const { bootstrapAssistantHome } = await Promise.resolve().then(function () { return require('./bootstrap-3ti7LXMz.cjs'); });
87
+ const { bootstrapAssistantHome } = await Promise.resolve().then(function () { return require('./bootstrap-DPbGC_1B.cjs'); });
88
88
  await bootstrapAssistantHome();
89
89
  } catch (error) {
90
90
  logger.logger.debug("[START] Assistant home bootstrap failed:", error);
@@ -219,7 +219,7 @@ async function runClaude(credentials, options = {}) {
219
219
  }
220
220
  if (!response) {
221
221
  let offlineSessionId = null;
222
- const { claudeLocal } = await Promise.resolve().then(function () { return require('./claudeLocal-DZALKVVc.cjs'); });
222
+ const { claudeLocal } = await Promise.resolve().then(function () { return require('./claudeLocal-D6-w4R7R.cjs'); });
223
223
  const { createSessionScanner: createSessionScanner2 } = await loadDeps();
224
224
  const reconnection = api.startOfflineReconnection({
225
225
  serverUrl: configuration.configuration.serverUrl,