very-happy-cli 0.2.189 → 0.2.190

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 (199) hide show
  1. package/dist/{AcpBackend-fj16v_cf.mjs → AcpBackend-Dd1h-Rgt.mjs} +3 -3
  2. package/dist/{AcpBackend-DRPJ2g9G.cjs → AcpBackend-dkRv9QHm.cjs} +3 -3
  3. package/dist/{AcpSessionManager-DM-KKg6v.cjs → AcpSessionManager-AqWAqahm.cjs} +1 -1
  4. package/dist/{AcpSessionManager-BZPmUDL5.mjs → AcpSessionManager-QBZ-CIf7.mjs} +2 -2
  5. package/dist/{BasePermissionHandler-CVtH-snr.mjs → BasePermissionHandler-CLp1ge-4.mjs} +1 -1
  6. package/dist/{BasePermissionHandler-DjM16uJz.cjs → BasePermissionHandler-CpSugp7Z.cjs} +1 -1
  7. package/dist/{acpSessionResume-2BTMsB7_.cjs → acpSessionResume-CZao6QEd.cjs} +1 -1
  8. package/dist/{acpSessionResume-Dxl1LRAT.mjs → acpSessionResume-CcpDuIO5.mjs} +1 -1
  9. package/dist/{agentHome-CHctmMzZ.mjs → agentHome-BJGRA2Kx.mjs} +4 -4
  10. package/dist/{agentHome-W17n1gnH.cjs → agentHome-fIUqT-pn.cjs} +4 -4
  11. package/dist/{api-BDuuyys8.cjs → api-CXL6jp-p.cjs} +18 -9
  12. package/dist/{api-B0yN68XH.mjs → api-Dw8gFsQi.mjs} +19 -10
  13. package/dist/{apiMachine-mc9CsKuS.mjs → apiMachine-BBNEtjf7.mjs} +56 -15
  14. package/dist/{apiMachine-iddD-F19.cjs → apiMachine-C6UqHoPF.cjs} +55 -14
  15. package/dist/{attachmentContent-CcIdMfAx.mjs → attachmentContent-CC4yIrSm.mjs} +2 -2
  16. package/dist/{attachmentContent-Cc5b7TPr.cjs → attachmentContent-NmVfKp-B.cjs} +2 -2
  17. package/dist/{auth-DQKSpaEf.cjs → auth-Bb_SL2os.cjs} +5 -5
  18. package/dist/{auth-DNAgkUkB.mjs → auth-Bh6SUoGi.mjs} +8 -8
  19. package/dist/{auth-CyrVvWHF.mjs → auth-Bj0psrD2.mjs} +5 -5
  20. package/dist/{auth-B7tVmyfX.cjs → auth-DKa4MsAi.cjs} +8 -8
  21. package/dist/{auto-CetlumDo.cjs → auto-C9Qohh0P.cjs} +15 -15
  22. package/dist/{auto-BklCipw1.mjs → auto-DK7pbCnV.mjs} +18 -18
  23. package/dist/{bootstrap-DfXwkUQb.mjs → bootstrap-Ct9Nb4sv.mjs} +2 -2
  24. package/dist/{bootstrap-CDY-Vz8q.cjs → bootstrap-DBJB0y-H.cjs} +2 -2
  25. package/dist/{browser-vb0k1zfI.mjs → browser-BGxDRhHy.mjs} +1 -1
  26. package/dist/{browser-D1yzC0Tu.cjs → browser-CLJWcodR.cjs} +1 -1
  27. package/dist/{claudeLocal-2dJIiTIq.cjs → claudeLocal-B6YDYlnY.cjs} +4 -4
  28. package/dist/{claudeLocal-Bid_rC_v.mjs → claudeLocal-Ux31hZyC.mjs} +5 -5
  29. package/dist/{claudeLocalLauncher-5pzpETxd.mjs → claudeLocalLauncher-D06QijMw.mjs} +10 -10
  30. package/dist/{claudeLocalLauncher-Jm5oQX5Z.cjs → claudeLocalLauncher-DFvmF8rC.cjs} +9 -9
  31. package/dist/{claudeSessionFork-DzecSBO4.mjs → claudeSessionFork-D2GI7P59.mjs} +1 -1
  32. package/dist/{claudeSessionFork-DsbcuDEJ.cjs → claudeSessionFork-DTLZ2rek.cjs} +1 -1
  33. package/dist/{client-D0aYWt53.cjs → client-Bffkrs5p.cjs} +2 -2
  34. package/dist/{client-BNmFaRXZ.cjs → client-CARZ_lNS.cjs} +3 -3
  35. package/dist/{client-DIfxYk7B.cjs → client-CMKGrnmT.cjs} +2 -2
  36. package/dist/{client-B161HwAk.mjs → client-CnGNYidN.mjs} +2 -2
  37. package/dist/{client-C9Ecbtko.mjs → client-CtL0Vtww.mjs} +4 -4
  38. package/dist/{client-CvjjadIE.mjs → client-DZkBUoh9.mjs} +2 -2
  39. package/dist/codex/happyMcpStdioBridge.cjs +15 -15
  40. package/dist/codex/happyMcpStdioBridge.mjs +16 -16
  41. package/dist/{codexAppServerClient-BlVmpjR-.mjs → codexAppServerClient-CLc5nhLT.mjs} +13 -6
  42. package/dist/{codexAppServerClient-CO9f4Jr8.cjs → codexAppServerClient-CpT9F6EM.cjs} +13 -6
  43. package/dist/{codexCommand-BfoRP6E9.cjs → codexCommand-39kH99SJ.cjs} +72 -48
  44. package/dist/{codexCommand-CAMR4g5o.mjs → codexCommand-Dliq3EBv.mjs} +69 -45
  45. package/dist/{codexTermination-IrLZQzKC.cjs → codexTermination-ByW7tRjr.cjs} +1 -1
  46. package/dist/{codexTermination-BvGlN02_.mjs → codexTermination-ORIw0gpU.mjs} +1 -1
  47. package/dist/{codexThreadFork-DNekT4nQ.cjs → codexThreadFork-5kwoKjMu.cjs} +11 -17
  48. package/dist/{codexThreadFork-R76RU5H0.mjs → codexThreadFork-DobPd19R.mjs} +11 -17
  49. package/dist/{config-BGFqQGvh.cjs → config-CeIzCsfj.cjs} +3 -3
  50. package/dist/{config-CtMgGPvf.mjs → config-CxSsGO1Z.mjs} +3 -3
  51. package/dist/{configuration-1FabKklB.mjs → configuration-Dechcvd-.mjs} +1 -1
  52. package/dist/{configuration-C0ctLGW2.cjs → configuration-Dt5lKW3P.cjs} +1 -1
  53. package/dist/{connect-DSw-2f52.cjs → connect-NPDzIVC6.cjs} +12 -12
  54. package/dist/{connect-0lSugpjf.mjs → connect-UwQHvCpR.mjs} +13 -13
  55. package/dist/{context-D-hEk5pC.cjs → context-BdZssgF0.cjs} +1 -1
  56. package/dist/{context-BgxbXWKS.mjs → context-C9JbJoNe.mjs} +1 -1
  57. package/dist/{controlClient-F7hAEEy2.cjs → controlClient-BRk65BRO.cjs} +3 -3
  58. package/dist/{controlClient-DwNnNAUx.mjs → controlClient-D7NGfmtq.mjs} +3 -3
  59. package/dist/{createSessionMetadata-DezS33OM.cjs → createSessionMetadata-B_HZCDj_.cjs} +2 -2
  60. package/dist/{createSessionMetadata-CG6Klinp.mjs → createSessionMetadata-DyhFKAby.mjs} +2 -2
  61. package/dist/defaultPermissionMode-BnxJPVHT.mjs +4 -0
  62. package/dist/defaultPermissionMode-CxmTXUQR.cjs +7 -0
  63. package/dist/{deterministicJson-D0LU_XbO.cjs → deterministicJson-BEygolBQ.cjs} +12 -12
  64. package/dist/{deterministicJson-BMwgK21e.mjs → deterministicJson-DNmMVhFu.mjs} +13 -13
  65. package/dist/{doctor-wVNvRarN.cjs → doctor-B9lW1WlG.cjs} +7 -7
  66. package/dist/{doctor-D16hySse.mjs → doctor-BdBi7TFZ.mjs} +7 -7
  67. package/dist/{downloadTarget-C6tqaXGm.mjs → downloadTarget-CGojGjaN.mjs} +6 -6
  68. package/dist/{downloadTarget-aNcCxVRL.cjs → downloadTarget-DS0zT2AU.cjs} +6 -6
  69. package/dist/{ensureDaemonRunning-DZq8bvsp.mjs → ensureDaemonRunning-BOdbryDM.mjs} +5 -5
  70. package/dist/{ensureDaemonRunning-CIghxgDR.cjs → ensureDaemonRunning-Bibp6vhe.cjs} +5 -5
  71. package/dist/exitAfterFlush-AbKNZM0N.mjs +23 -0
  72. package/dist/exitAfterFlush-DIT_sIxR.cjs +25 -0
  73. package/dist/{handleResumeCommand-BNnD7EuD.mjs → handleResumeCommand-CgLzBYne.mjs} +5 -5
  74. package/dist/{handleResumeCommand-CMUTygsm.cjs → handleResumeCommand-DXOuWr4p.cjs} +5 -5
  75. package/dist/{agentAttachments-Dbw8iMCZ.cjs → heldInput-BOtqFO2r.cjs} +27 -0
  76. package/dist/heldInput-C69lA2dH.mjs +44 -0
  77. package/dist/{index-De02DNu5.cjs → index-Bs5FD8JF.cjs} +4 -4
  78. package/dist/{index-BuiG8hmg.mjs → index-CBHfkQNY.mjs} +133 -54
  79. package/dist/{index-4TpmBb2Q.cjs → index-CwRW11hT.cjs} +3 -3
  80. package/dist/{index-Df0bc_et.mjs → index-DUByZsKe.mjs} +4 -4
  81. package/dist/{index-B81qV_F_.cjs → index-DXSIi6j_.cjs} +4 -4
  82. package/dist/{index-BCQr-5Ei.mjs → index-Db0HIC-k.mjs} +4 -4
  83. package/dist/{index-WKyN-bNy.mjs → index-DmqsRnV7.mjs} +1 -1
  84. package/dist/{index-CnzsOD19.cjs → index-f8oDidjV.cjs} +131 -52
  85. package/dist/{index-CKd20r1W.mjs → index-rNTX33in.mjs} +3 -3
  86. package/dist/index.cjs +2 -2
  87. package/dist/index.mjs +2 -2
  88. package/dist/{install-DNbIEJUk.cjs → install-CXIL_FYx.cjs} +3 -3
  89. package/dist/{install-23ehAdTD.mjs → install-DfPrEWGG.mjs} +3 -3
  90. package/dist/lib.cjs +11 -11
  91. package/dist/lib.d.cts +53 -1
  92. package/dist/lib.d.mts +53 -1
  93. package/dist/lib.mjs +12 -12
  94. package/dist/{lidState-q5Its2Hm.mjs → lidState-D0DF20oG.mjs} +1 -1
  95. package/dist/{lidState-B4dHJCeS.cjs → lidState-q_XFYg33.cjs} +1 -1
  96. package/dist/{localHappyAgentAuth-C_G5u5lY.mjs → localHappyAgentAuth-BBhM4Qk1.mjs} +1 -1
  97. package/dist/{localHappyAgentAuth-CG2nPD_H.cjs → localHappyAgentAuth-CKNW-MXw.cjs} +1 -1
  98. package/dist/{logger-BP1SW7Cs.cjs → logger-BBRTTVsQ.cjs} +2 -2
  99. package/dist/{logger-DOKH3Zbh.mjs → logger-CL7pin9b.mjs} +2 -2
  100. package/dist/{machineMetadata-D-5qeIqd.mjs → machineMetadata-DP06qdBk.mjs} +3 -3
  101. package/dist/{machineMetadata-BKX3ov9g.cjs → machineMetadata-DnFNlrVK.cjs} +3 -3
  102. package/dist/{main-ndpVIaSG.cjs → main-DLOXykOR.cjs} +49 -48
  103. package/dist/{main-DODz8DQE.mjs → main-DO7nRvhf.mjs} +49 -48
  104. package/dist/{mcp-BBwbSODp.mjs → mcp-C-4sPTae.mjs} +15 -15
  105. package/dist/{mcp-Bc4U4exu.cjs → mcp-Du0MgR7e.cjs} +14 -14
  106. package/dist/{mirrorProtocol-CiA3hO2y.cjs → mirrorProtocol-GuWMxLkh.cjs} +2 -2
  107. package/dist/{mirrorProtocol-D2vTWteS.mjs → mirrorProtocol-dkq2ZENA.mjs} +3 -3
  108. package/dist/{package-DTcaIhjW.mjs → package-C6uiXULx.mjs} +7 -7
  109. package/dist/{package-CYDdLA6R.cjs → package-DrY090nZ.cjs} +7 -7
  110. package/dist/{panels-C2xZ8rqU.cjs → panels-4DRBKHZP.cjs} +5 -5
  111. package/dist/{panels-DCaLxlSL.mjs → panels-DXYdJA6n.mjs} +5 -5
  112. package/dist/{peerTools-B4315xjX.cjs → peerTools-5ZM4spcZ.cjs} +5 -5
  113. package/dist/{peerTools-BtrUnSwz.mjs → peerTools-dY1aJez4.mjs} +5 -5
  114. package/dist/{persistence-CrzC7yr_.cjs → persistence-Bl5S3TLB.cjs} +6 -2
  115. package/dist/{persistence-0INrP3aB.mjs → persistence-Dogj7JIp.mjs} +6 -3
  116. package/dist/{piRunnerArgs-BtzW_kfh.cjs → piRunnerArgs-C3jZ1M6b.cjs} +1 -1
  117. package/dist/{piRunnerArgs-DRuxMlX1.mjs → piRunnerArgs-D8nN_Iit.mjs} +1 -1
  118. package/dist/{piRuntime-DEbPE_kW.cjs → piRuntime-Bd9-eq6M.cjs} +1 -1
  119. package/dist/{piRuntime-BMAFpIBV.mjs → piRuntime-BoeMsAXK.mjs} +1 -1
  120. package/dist/{piTerminal-MtxDtBE2.cjs → piTerminal-C3j1ca3x.cjs} +16 -16
  121. package/dist/{piTerminal-DQXV8_we.mjs → piTerminal-GEPkIGD4.mjs} +17 -17
  122. package/dist/{pushNotifications-CalIS9sq.cjs → pushNotifications-CfspRcl-.cjs} +20 -2
  123. package/dist/{pushNotifications-Cq1s8YVK.mjs → pushNotifications-dUceOIni.mjs} +21 -3
  124. package/dist/{query-CE2XDhhw.cjs → query-DjsVgG3E.cjs} +1 -1
  125. package/dist/{query-BYiPBHPC.mjs → query-iYH-tm7L.mjs} +1 -1
  126. package/dist/{rateLimitReporter-BKmoOZQi.cjs → rateLimitReporter-DUu2KydZ.cjs} +3 -3
  127. package/dist/{rateLimitReporter-DR5LXuiQ.mjs → rateLimitReporter-jeVi-fym.mjs} +3 -3
  128. package/dist/{rateLimitWindows-Cs56YJCH.cjs → rateLimitWindows-Bx3ROBP5.cjs} +1 -1
  129. package/dist/{rateLimitWindows-5vIuNjko.mjs → rateLimitWindows-CEn0DXaX.mjs} +1 -1
  130. package/dist/{registerCommonHandlers-DZPozYxc.cjs → registerCommonHandlers-Beun-cQv.cjs} +2 -2
  131. package/dist/{registerCommonHandlers-DWkTysjD.mjs → registerCommonHandlers-DWZ7mfdt.mjs} +2 -2
  132. package/dist/{registerKillSessionHandler-DhCjrs44.cjs → registerKillSessionHandler-CA1FFr_F.cjs} +15 -5
  133. package/dist/{registerKillSessionHandler-CSCTRIbI.mjs → registerKillSessionHandler-CzgklwLG.mjs} +16 -6
  134. package/dist/{remoteSessionClient-Vfj_5g2-.mjs → remoteSessionClient-BiC2KDew.mjs} +5 -5
  135. package/dist/{remoteSessionClient-Dq8XTLQP.cjs → remoteSessionClient-DGFI__5Z.cjs} +5 -5
  136. package/dist/{reportProgressTool-B7zmX7NJ.mjs → reportProgressTool-CgPy6n_7.mjs} +3 -3
  137. package/dist/{reportProgressTool-DznxPKES.cjs → reportProgressTool-CvPGov1F.cjs} +2 -2
  138. package/dist/{run-DSfNcR62.mjs → run-B_gFgJVB.mjs} +392 -42
  139. package/dist/{run-Ca8BiNCp.cjs → run-rPqQwDi_.cjs} +389 -39
  140. package/dist/{runClaude-hoepv-0X.mjs → runClaude-CykqeXK7.mjs} +26 -23
  141. package/dist/{runClaude-ClQQcgoO.cjs → runClaude-DM8gm8iu.cjs} +27 -24
  142. package/dist/{runClaudeDeps-D_v8t2SK.mjs → runClaudeDeps-D2phXGut.mjs} +101 -44
  143. package/dist/{runClaudeDeps-ck5_GYlP.cjs → runClaudeDeps-DGAomimZ.cjs} +94 -37
  144. package/dist/{runGemini-Cj0XsMiM.cjs → runGemini-CXTeSOZp.cjs} +32 -32
  145. package/dist/{runGemini-CTr2-cYG.mjs → runGemini-CtWCVkj5.mjs} +33 -33
  146. package/dist/{runOpenClaw-CdDMntiV.mjs → runOpenClaw-BBdjlViJ.mjs} +18 -18
  147. package/dist/{runOpenClaw-BoN1e3lP.cjs → runOpenClaw-CH_9_RyZ.cjs} +17 -17
  148. package/dist/{sandbox-BY2h19gc.cjs → sandbox-Bb5IMun3.cjs} +4 -4
  149. package/dist/{sandbox-DcaWB-Ou.mjs → sandbox-DGmXZ6Zz.mjs} +4 -4
  150. package/dist/selfCheck-BfK945YQ.mjs +86 -0
  151. package/dist/{selfCheck-DFS_GUaQ.cjs → selfCheck-CccwNTTK.cjs} +37 -37
  152. package/dist/{send-UBTHHNvZ.mjs → send-B6rHg8GT.mjs} +8 -8
  153. package/dist/{send-BMsUYU6g.cjs → send-BpiXPkDo.cjs} +8 -8
  154. package/dist/{server-Dt3mCtfQ.mjs → server-BkdAyHhC.mjs} +4 -4
  155. package/dist/{server-YrHMHNz1.cjs → server-DHUzjApC.cjs} +6 -6
  156. package/dist/{sessionLock-DSqiP2lH.cjs → sessionLock-BFBReiKq.cjs} +134 -3
  157. package/dist/{sessionLock-tEFvFXLD.mjs → sessionLock-Ca_bIo50.mjs} +121 -4
  158. package/dist/{sessionOps-CljctDs5.mjs → sessionOps-CA2kpm66.mjs} +13 -5
  159. package/dist/{sessionOps-BzeOKIEF.cjs → sessionOps-DeWVqpe4.cjs} +13 -4
  160. package/dist/{sessionProvider-ORgzmkXy.cjs → sessionProvider-VFbtUmMR.cjs} +5 -5
  161. package/dist/{sessionProvider-BnUFSJXM.mjs → sessionProvider-g18IiK74.mjs} +5 -5
  162. package/dist/{sessionScanner-Cr6PJ3PT.cjs → sessionScanner-CGzsN8V6.cjs} +3 -3
  163. package/dist/{sessionScanner-DZUlkdF6.mjs → sessionScanner-DDDud5re.mjs} +3 -3
  164. package/dist/{sessions-15cag-su.mjs → sessions-B4d50sCI.mjs} +35 -26
  165. package/dist/{sessions-aIo_HjmY.cjs → sessions-CKJPWFgu.cjs} +36 -25
  166. package/dist/{setupOfflineReconnection-B7I8R2Ex.mjs → setupOfflineReconnection-CyPNgyCe.mjs} +2 -2
  167. package/dist/{setupOfflineReconnection-tV0Q1dgR.cjs → setupOfflineReconnection-DPXRo_zf.cjs} +2 -2
  168. package/dist/{spawn-VG-HjJiR.cjs → spawn-CgSJzzWS.cjs} +13 -13
  169. package/dist/{spawn-ByrQgruJ.mjs → spawn-CrYN_OOT.mjs} +15 -15
  170. package/dist/{spawnAgents-Bh1RPShN.mjs → spawnAgents-DWCDYCQ1.mjs} +1 -1
  171. package/dist/{spawnHappyCLI-CxiR2Qoy.cjs → spawnHappyCLI-CTy3p6V_.cjs} +1 -1
  172. package/dist/{spawnHappyCLI-CEsXwz5V.mjs → spawnHappyCLI-DjbkiSH1.mjs} +1 -1
  173. package/dist/{startFileWatcher-C-XCZ5t2.cjs → startFileWatcher-BQs0cJA-.cjs} +1 -1
  174. package/dist/{startFileWatcher-DkEeeAtL.mjs → startFileWatcher-Dedtu1vq.mjs} +1 -1
  175. package/dist/{defaultPermissionMode-e2bIIJG4.mjs → startupSessionCreate-BKFU4v_h.mjs} +25 -6
  176. package/dist/{defaultPermissionMode-5EvgRq38.cjs → startupSessionCreate-Dxy3X4DG.cjs} +25 -7
  177. package/dist/{streamRelay-CqBynIon.mjs → streamRelay-P9e7Sohm.mjs} +1 -1
  178. package/dist/{sync-CoChLEIg.cjs → sync-DtWB7RzA.cjs} +1 -1
  179. package/dist/{sync-BvDMkKAN.mjs → sync-eZkXnsW_.mjs} +1 -1
  180. package/dist/{systemPrompt-Dy_Rf-0Z.cjs → systemPrompt-2XOpZ1j6.cjs} +1 -1
  181. package/dist/{systemPrompt-CgDaPigN.mjs → systemPrompt-Bn6g6aCH.mjs} +2 -2
  182. package/dist/{teams-DPvfLAk8.cjs → teams-ecFay4Gn.cjs} +6 -6
  183. package/dist/{teams-BC4_e5hR.mjs → teams-nadkqrbW.mjs} +7 -7
  184. package/dist/{template-CEK8MEjo.mjs → template-BiTD-jI9.mjs} +1 -1
  185. package/dist/{time-CUK37wiV.mjs → time-CN3TuSVG.mjs} +1 -1
  186. package/dist/{time-XwEZxKGc.cjs → time-gPD_EmA-.cjs} +1 -1
  187. package/dist/{titleGenerator-DWRVdqMU.mjs → titleGenerator-DgzTQdn2.mjs} +1 -1
  188. package/dist/{titleGenerator-DVX0NZUn.cjs → titleGenerator-lT5ldPuN.cjs} +2 -2
  189. package/dist/{todo-CKGrSrRE.cjs → todo-B1VeMk5A.cjs} +5 -5
  190. package/dist/{todo-BNMGXneA.mjs → todo-BIxd7l2Q.mjs} +6 -6
  191. package/dist/{tools-CjMafO_D.cjs → tools-DvqbLsCF.cjs} +1 -1
  192. package/dist/{tools-CCIEAVbB.mjs → tools-zXJpxiG_.mjs} +1 -1
  193. package/dist/{uninstall-CJvJ7gjr.mjs → uninstall-9htK6mb7.mjs} +3 -3
  194. package/dist/{uninstall-BdFbTXnL.cjs → uninstall-CvIOpwB5.cjs} +3 -3
  195. package/package.json +7 -7
  196. package/dist/agentAttachments-M_B5qEF2.mjs +0 -18
  197. package/dist/selfCheck-BQ_H2Sns.mjs +0 -86
  198. package/dist/startupSessionCreate-CYc8mra-.cjs +0 -26
  199. package/dist/startupSessionCreate-npXe2TdN.mjs +0 -24
@@ -1,27 +1,27 @@
1
1
  'use strict';
2
2
 
3
- var mirrorProtocol = require('./mirrorProtocol-CiA3hO2y.cjs');
3
+ var mirrorProtocol = require('./mirrorProtocol-GuWMxLkh.cjs');
4
4
  var fsMkdir = require('./fsMkdir-0K3yENml.cjs');
5
- var piRunnerArgs = require('./piRunnerArgs-BtzW_kfh.cjs');
5
+ var piRunnerArgs = require('./piRunnerArgs-C3jZ1M6b.cjs');
6
6
  var fs = require('fs/promises');
7
7
  var os$1 = require('os');
8
8
  var tmp = require('tmp');
9
9
  var axios = require('axios');
10
10
  var node_fs = require('node:fs');
11
11
  var path = require('node:path');
12
- var configuration = require('./configuration-C0ctLGW2.cjs');
13
- var api = require('./api-BDuuyys8.cjs');
12
+ var configuration = require('./configuration-Dt5lKW3P.cjs');
13
+ var api = require('./api-CXL6jp-p.cjs');
14
14
  var spawnAgents = require('./spawnAgents-C1-4m7aN.cjs');
15
- var logger = require('./logger-BP1SW7Cs.cjs');
16
- var index$2 = require('./index-4TpmBb2Q.cjs');
17
- var auth = require('./auth-DQKSpaEf.cjs');
15
+ var logger = require('./logger-BBRTTVsQ.cjs');
16
+ var index$2 = require('./index-CwRW11hT.cjs');
17
+ var auth = require('./auth-Bb_SL2os.cjs');
18
18
  var child_process = require('child_process');
19
- var _package = require('./package-CYDdLA6R.cjs');
20
- var doctor = require('./doctor-wVNvRarN.cjs');
21
- var spawnHappyCLI = require('./spawnHappyCLI-CxiR2Qoy.cjs');
22
- var persistence = require('./persistence-CrzC7yr_.cjs');
23
- var controlClient = require('./controlClient-F7hAEEy2.cjs');
24
- var sessionOps = require('./sessionOps-BzeOKIEF.cjs');
19
+ var _package = require('./package-DrY090nZ.cjs');
20
+ var doctor = require('./doctor-B9lW1WlG.cjs');
21
+ var spawnHappyCLI = require('./spawnHappyCLI-CTy3p6V_.cjs');
22
+ var persistence = require('./persistence-Bl5S3TLB.cjs');
23
+ var controlClient = require('./controlClient-BRk65BRO.cjs');
24
+ var sessionOps = require('./sessionOps-DeWVqpe4.cjs');
25
25
  var fastify = require('fastify');
26
26
  var z = require('zod');
27
27
  var fastifyTypeProviderZod = require('fastify-type-provider-zod');
@@ -29,63 +29,63 @@ var authRelay = require('./authRelay-Dy1qU9td.cjs');
29
29
  var node_crypto = require('node:crypto');
30
30
  var previewPath = require('./previewPath-B0rBdhy1.cjs');
31
31
  var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
32
- var rateLimitWindows = require('./rateLimitWindows-Cs56YJCH.cjs');
33
- var peerTools = require('./peerTools-B4315xjX.cjs');
32
+ var rateLimitWindows = require('./rateLimitWindows-Bx3ROBP5.cjs');
33
+ var peerTools = require('./peerTools-5ZM4spcZ.cjs');
34
34
  var os = require('node:os');
35
- var remoteSessionClient = require('./remoteSessionClient-Dq8XTLQP.cjs');
36
- var bootstrap = require('./bootstrap-CDY-Vz8q.cjs');
37
- var index$1 = require('./index-De02DNu5.cjs');
35
+ var remoteSessionClient = require('./remoteSessionClient-DGFI__5Z.cjs');
36
+ var bootstrap = require('./bootstrap-DBJB0y-H.cjs');
37
+ var index$1 = require('./index-Bs5FD8JF.cjs');
38
38
  var require$$0 = require('fs');
39
39
  var require$$1 = require('path');
40
40
  var node_child_process = require('node:child_process');
41
41
  var projectPath = require('./projectPath-C3ioB4Bu.cjs');
42
42
  var doctorReadiness = require('./doctorReadiness-Dl6yRQCy.cjs');
43
- var machineMetadata = require('./machineMetadata-BKX3ov9g.cjs');
43
+ var machineMetadata = require('./machineMetadata-DnFNlrVK.cjs');
44
44
  var fileStore = require('./fileStore-7qhnbs6N.cjs');
45
45
  var pi = require('./pi-DlsrPCTa.cjs');
46
46
  var require$$3 = require('crypto');
47
47
  var detectCLI = require('./detectCLI-BuYR_Qxe.cjs');
48
- var handleResumeCommand = require('./handleResumeCommand-CMUTygsm.cjs');
48
+ var handleResumeCommand = require('./handleResumeCommand-DXOuWr4p.cjs');
49
49
  var webPanels = require('./webPanels-FCgFKvVe.cjs');
50
50
  var index = require('./index-BOe6dKnL.cjs');
51
51
  var promises = require('node:fs/promises');
52
52
  var cliUpdate = require('./cliUpdate-DsKXPFYp.cjs');
53
- var client = require('./client-DIfxYk7B.cjs');
54
- var client$1 = require('./client-D0aYWt53.cjs');
53
+ var client = require('./client-CMKGrnmT.cjs');
54
+ var sessionLock = require('./sessionLock-BFBReiKq.cjs');
55
+ var client$1 = require('./client-Bffkrs5p.cjs');
55
56
  var daemonSupervisor = require('./daemonSupervisor-alqGPANc.cjs');
56
57
  var path$1 = require('./path-B7zW-WwE.cjs');
57
58
  var editPaths = require('./editPaths-Bqp4OFPw.cjs');
58
- var startFileWatcher = require('./startFileWatcher-C-XCZ5t2.cjs');
59
- var sync = require('./sync-CoChLEIg.cjs');
59
+ var startFileWatcher = require('./startFileWatcher-BQs0cJA-.cjs');
60
+ var sync = require('./sync-DtWB7RzA.cjs');
60
61
  var types = require('./types-CRS-srZK.cjs');
61
62
  var tmuxSocket = require('./tmuxSocket-D-Xt6Vn-.cjs');
62
- var sessionLock = require('./sessionLock-DSqiP2lH.cjs');
63
63
  var doctor$1 = require('./doctor-u46qYYKX.cjs');
64
64
  var resources = require('./resources-BZ_Be0qM.cjs');
65
65
  var node_util = require('node:util');
66
66
  var template = require('./template-17HATY_Y.cjs');
67
67
  var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
68
- require('./acpSessionResume-2BTMsB7_.cjs');
69
- require('./lidState-B4dHJCeS.cjs');
68
+ require('./acpSessionResume-CZao6QEd.cjs');
69
+ require('./lidState-q_XFYg33.cjs');
70
70
  require('node:events');
71
71
  require('socket.io-client');
72
- require('./pushNotifications-CalIS9sq.cjs');
72
+ require('./pushNotifications-CfspRcl-.cjs');
73
73
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
74
74
  require('./limits-C-a7gr04.cjs');
75
- require('./time-XwEZxKGc.cjs');
76
- require('./registerCommonHandlers-DZPozYxc.cjs');
75
+ require('./time-gPD_EmA-.cjs');
76
+ require('./registerCommonHandlers-Beun-cQv.cjs');
77
77
  require('util');
78
78
  require('cross-spawn');
79
79
  require('@paralleldrive/cuid2');
80
80
  require('chalk');
81
81
  require('node:module');
82
82
  require('tweetnacl');
83
- require('./browser-D1yzC0Tu.cjs');
83
+ require('./browser-CLJWcodR.cjs');
84
84
  require('open');
85
85
  require('./specialCommands-J3JFOq0J.cjs');
86
86
  require('./ids-B6ZC0HGt.cjs');
87
87
  require('url');
88
- require('./localHappyAgentAuth-CG2nPD_H.cjs');
88
+ require('./localHappyAgentAuth-CKNW-MXw.cjs');
89
89
  require('./processTreeSnapshot-mDbnuojn.cjs');
90
90
  require('ps-list');
91
91
 
@@ -569,7 +569,8 @@ const WrapperIdleSnapshotSchema = z.z.object({
569
569
  backgroundTasks: z.z.number().int().nonnegative(),
570
570
  scheduledWakeups: z.z.number().int().nonnegative().optional(),
571
571
  lastActivityAt: z.z.number(),
572
- exiting: z.z.boolean().optional()
572
+ exiting: z.z.boolean().optional(),
573
+ agentVersion: z.z.string().max(64).optional()
573
574
  }).passthrough();
574
575
  const HibernateCheckBodySchema = z.z.object({
575
576
  sessionId: z.z.string().min(1).max(200),
@@ -1537,6 +1538,7 @@ function summaryFromPersisted(id, persisted) {
1537
1538
  ...meta?.flavor ? { flavor: meta.flavor } : {},
1538
1539
  ...meta?.tags?.length ? { tags: [...meta.tags] } : {},
1539
1540
  ...meta?.variant ? { variant: meta.variant } : {},
1541
+ ...sessionOps.lineageOf(meta),
1540
1542
  ...persisted?.savedAt !== void 0 ? { savedAt: persisted.savedAt } : {},
1541
1543
  url: sessionOps.sessionWebUrl(id)
1542
1544
  };
@@ -5295,6 +5297,253 @@ async function waitForSessionLive(sessionId, live, timeoutMs = AUTOMATION_WAKE_T
5295
5297
  return true;
5296
5298
  }
5297
5299
 
5300
+ function createAutoRestart(deps) {
5301
+ const now = () => (deps.now ?? Date.now)();
5302
+ const random = deps.random ?? Math.random;
5303
+ const statuses = /* @__PURE__ */ new Map();
5304
+ const attempts = /* @__PURE__ */ new Map();
5305
+ const agentVersions = /* @__PURE__ */ new Map();
5306
+ const behindSince = /* @__PURE__ */ new Map();
5307
+ const offline = /* @__PURE__ */ new Map();
5308
+ const schedule = deps.schedule ?? ((fn, ms) => {
5309
+ setTimeout(fn, ms).unref?.();
5310
+ });
5311
+ let inFlight = 0;
5312
+ let lastStartedAt = null;
5313
+ let publishedSignature = "";
5314
+ function publish() {
5315
+ const snapshot = Object.fromEntries([...statuses.entries()].sort(([a], [b]) => a.localeCompare(b)));
5316
+ const signature = JSON.stringify(snapshot);
5317
+ if (signature === publishedSignature) return;
5318
+ publishedSignature = signature;
5319
+ deps.publish(snapshot);
5320
+ }
5321
+ function setStatus(sessionId, status) {
5322
+ if (!status) {
5323
+ statuses.delete(sessionId);
5324
+ return;
5325
+ }
5326
+ const clock = behindSince.get(sessionId);
5327
+ const since = clock && clock.target === status.target ? clock.since : status.since;
5328
+ behindSince.set(sessionId, { target: status.target, since });
5329
+ statuses.set(sessionId, { ...status, since });
5330
+ }
5331
+ function clearSession(sessionId) {
5332
+ statuses.delete(sessionId);
5333
+ behindSince.delete(sessionId);
5334
+ offline.delete(sessionId);
5335
+ }
5336
+ function isLive(sessionId) {
5337
+ return deps.liveSessions().some((session) => session.sessionId === sessionId);
5338
+ }
5339
+ function stalenessFor(tracked, agentVersion) {
5340
+ return sessionLock.wrapperStaleness({
5341
+ wrapperVersion: tracked.wrapperVersion,
5342
+ daemonVersion: deps.daemonVersion,
5343
+ agentVersion,
5344
+ installedAgentVersion: tracked.flavor ? deps.installedAgentVersion(tracked.flavor) : null
5345
+ });
5346
+ }
5347
+ async function run(sessionId, staleness) {
5348
+ const since = statuses.get(sessionId)?.since ?? now();
5349
+ setStatus(sessionId, { state: "restarting", since, target: staleness.target });
5350
+ publish();
5351
+ deps.log?.(`[auto-restart] restarting ${sessionId}: ${staleness.kind} ${staleness.from} \u2192 ${staleness.target}`);
5352
+ try {
5353
+ if (deps.turnActive(sessionId) || deps.backgroundTasks(sessionId) > 0 || deps.automationRunning(sessionId)) {
5354
+ deps.log?.(`[auto-restart] ${sessionId} became busy before the stop; waiting`);
5355
+ setStatus(sessionId, { state: "waiting", reason: "turn-active", since, target: staleness.target });
5356
+ return;
5357
+ }
5358
+ let result;
5359
+ try {
5360
+ result = await deps.restart(sessionId, staleness);
5361
+ } catch (error) {
5362
+ result = { ok: false, error: error instanceof Error ? error.message : String(error) };
5363
+ }
5364
+ const record = sessionLock.recordAttempt(attempts.get(sessionId) ?? null, staleness.target, result.ok, now(), result.ok ? void 0 : result.error);
5365
+ if (record) attempts.set(sessionId, record);
5366
+ else attempts.delete(sessionId);
5367
+ if (result.ok) {
5368
+ deps.log?.(`[auto-restart] ${sessionId} restarted on ${staleness.target}`);
5369
+ clearSession(sessionId);
5370
+ agentVersions.delete(sessionId);
5371
+ } else {
5372
+ deps.log?.(`[auto-restart] ${sessionId} restart failed (attempt ${record?.attempts}): ${result.error}`);
5373
+ const gaveUp = (record?.attempts ?? 0) >= sessionLock.AUTO_RESTART_MAX_ATTEMPTS;
5374
+ if (!isLive(sessionId)) {
5375
+ offline.set(sessionId, staleness);
5376
+ const retryAt = gaveUp || !record ? void 0 : record.notBefore;
5377
+ setStatus(sessionId, { state: "failed", reason: result.error, since, target: staleness.target, offline: true, ...retryAt ? { retryAt } : {} });
5378
+ if (retryAt) schedule(() => {
5379
+ void retryOffline(sessionId);
5380
+ }, Math.max(0, retryAt - now()));
5381
+ } else {
5382
+ setStatus(sessionId, gaveUp ? { state: "failed", reason: result.error, since, target: staleness.target } : { state: "waiting", reason: "backoff", since, target: staleness.target });
5383
+ }
5384
+ }
5385
+ } finally {
5386
+ inFlight -= 1;
5387
+ publish();
5388
+ }
5389
+ }
5390
+ async function retryOffline(sessionId) {
5391
+ const staleness = offline.get(sessionId);
5392
+ if (!staleness || statuses.get(sessionId)?.state !== "failed" || statuses.get(sessionId)?.retryAt === void 0) return;
5393
+ const status = statuses.get(sessionId);
5394
+ const handOver = (why) => {
5395
+ deps.log?.(`[auto-restart] ${sessionId} offline retry skipped: ${why}`);
5396
+ setStatus(sessionId, { state: "failed", reason: status.reason, since: status.since, target: status.target, offline: true });
5397
+ publish();
5398
+ };
5399
+ if (!deps.enabled()) return handOver("switch off");
5400
+ if (isLive(sessionId)) {
5401
+ offline.delete(sessionId);
5402
+ return;
5403
+ }
5404
+ const server = deps.serverSession ? await deps.serverSession(sessionId).catch(() => null) : null;
5405
+ if (!server) return handOver("server state unknown");
5406
+ if (server.archived || server.active) return handOver(server.archived ? "archived" : "active elsewhere");
5407
+ if (isLive(sessionId) || offline.get(sessionId) !== staleness) return;
5408
+ const t = now();
5409
+ if (inFlight > 0 || lastStartedAt !== null && t - lastStartedAt < sessionLock.AUTO_RESTART_MIN_GAP_MS) {
5410
+ schedule(() => {
5411
+ void retryOffline(sessionId);
5412
+ }, sessionLock.AUTO_RESTART_MIN_GAP_MS + Math.round(random() * sessionLock.AUTO_RESTART_MIN_GAP_MS));
5413
+ return;
5414
+ }
5415
+ inFlight += 1;
5416
+ lastStartedAt = t;
5417
+ setStatus(sessionId, { state: "restarting", since: status.since, target: staleness.target });
5418
+ await run(sessionId, staleness);
5419
+ }
5420
+ async function onCheckIn(request) {
5421
+ let t = now();
5422
+ const tracked = deps.tracked(request.sessionId, request.pid);
5423
+ if (request.report.agentVersion) agentVersions.set(request.sessionId, request.report.agentVersion);
5424
+ const staleness = tracked ? stalenessFor(tracked, request.report.agentVersion) : null;
5425
+ if (!staleness) {
5426
+ const had = statuses.has(request.sessionId);
5427
+ clearSession(request.sessionId);
5428
+ if (had) publish();
5429
+ return { nextCheckMs: null, restarting: false };
5430
+ }
5431
+ offline.delete(request.sessionId);
5432
+ const previous = statuses.get(request.sessionId);
5433
+ if (previous?.state === "restarting") return { nextCheckMs: null, restarting: false };
5434
+ const attempt = attempts.get(request.sessionId) ?? null;
5435
+ let input = {
5436
+ enabled: deps.enabled(),
5437
+ now: t,
5438
+ ...deps.quietMs !== void 0 ? { quietMs: deps.quietMs } : {},
5439
+ staleness,
5440
+ trackedLive: !!tracked?.live,
5441
+ report: request.report,
5442
+ turnActive: deps.turnActive(request.sessionId),
5443
+ backgroundTasks: deps.backgroundTasks(request.sessionId),
5444
+ automationRunning: deps.automationRunning(request.sessionId),
5445
+ resumable: false,
5446
+ attempt,
5447
+ inFlight,
5448
+ lastStartedAt
5449
+ };
5450
+ let verdict = sessionLock.decideAutoRestart({ ...input, resumable: true });
5451
+ if (verdict.ok) {
5452
+ const resumable = await deps.resumable(request.sessionId).catch(() => false);
5453
+ t = now();
5454
+ input = {
5455
+ ...input,
5456
+ now: t,
5457
+ trackedLive: !!deps.tracked(request.sessionId, request.pid)?.live,
5458
+ turnActive: deps.turnActive(request.sessionId),
5459
+ backgroundTasks: deps.backgroundTasks(request.sessionId),
5460
+ automationRunning: deps.automationRunning(request.sessionId),
5461
+ resumable,
5462
+ attempt: attempts.get(request.sessionId) ?? null,
5463
+ inFlight,
5464
+ lastStartedAt
5465
+ };
5466
+ verdict = statuses.get(request.sessionId)?.state === "restarting" ? { ok: false, reason: "machine-busy" } : sessionLock.decideAutoRestart(input);
5467
+ }
5468
+ if (verdict.ok) {
5469
+ inFlight += 1;
5470
+ lastStartedAt = t;
5471
+ setStatus(request.sessionId, { state: "restarting", since: previous?.since ?? t, target: staleness.target });
5472
+ setImmediate(() => {
5473
+ void run(request.sessionId, staleness);
5474
+ });
5475
+ return { nextCheckMs: null, restarting: true };
5476
+ }
5477
+ if (input.enabled) setStatus(request.sessionId, sessionLock.statusFromVerdict(verdict, previous, staleness, t, attempt));
5478
+ else {
5479
+ statuses.delete(request.sessionId);
5480
+ if (behindSince.get(request.sessionId)?.target !== staleness.target) behindSince.set(request.sessionId, { target: staleness.target, since: t });
5481
+ }
5482
+ publish();
5483
+ return { nextCheckMs: sessionLock.autoRestartNextCheck(verdict, input, random()), restarting: false };
5484
+ }
5485
+ function sweep() {
5486
+ const t = now();
5487
+ const enabled = deps.enabled();
5488
+ const seen = /* @__PURE__ */ new Set();
5489
+ for (const session of deps.liveSessions()) {
5490
+ seen.add(session.sessionId);
5491
+ const staleness = stalenessFor(session, agentVersions.get(session.sessionId));
5492
+ if (!staleness) {
5493
+ clearSession(session.sessionId);
5494
+ continue;
5495
+ }
5496
+ if (statuses.get(session.sessionId)?.state === "restarting") continue;
5497
+ if (offline.delete(session.sessionId)) statuses.delete(session.sessionId);
5498
+ if (!enabled) {
5499
+ statuses.delete(session.sessionId);
5500
+ if (behindSince.get(session.sessionId)?.target !== staleness.target) behindSince.set(session.sessionId, { target: staleness.target, since: t });
5501
+ continue;
5502
+ }
5503
+ const previous = statuses.get(session.sessionId);
5504
+ if (session.startedBy === "terminal") {
5505
+ if (previous?.state !== "manual" || previous.reason !== "local-terminal" || previous.target !== staleness.target) {
5506
+ setStatus(session.sessionId, { state: "manual", reason: "local-terminal", since: t, target: staleness.target });
5507
+ }
5508
+ continue;
5509
+ }
5510
+ if (previous && previous.target === staleness.target) continue;
5511
+ const reports = sessionLock.wrapperReportsIdle({
5512
+ flavor: session.flavor,
5513
+ capabilities: session.capabilities,
5514
+ spawnedBy: session.spawnedBy,
5515
+ tags: session.tags,
5516
+ variant: session.variant
5517
+ });
5518
+ 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 });
5519
+ }
5520
+ for (const id of /* @__PURE__ */ new Set([...statuses.keys(), ...behindSince.keys()])) {
5521
+ if (seen.has(id) || statuses.get(id)?.state === "restarting") continue;
5522
+ if (offline.has(id)) continue;
5523
+ clearSession(id);
5524
+ }
5525
+ publish();
5526
+ }
5527
+ return {
5528
+ onCheckIn,
5529
+ sweep,
5530
+ forget(sessionId) {
5531
+ agentVersions.delete(sessionId);
5532
+ const state = statuses.get(sessionId)?.state;
5533
+ if (state === "restarting" || offline.has(sessionId)) return;
5534
+ behindSince.delete(sessionId);
5535
+ if (statuses.delete(sessionId)) publish();
5536
+ },
5537
+ statuses() {
5538
+ return Object.fromEntries(statuses);
5539
+ },
5540
+ /** For tests / diagnostics. */
5541
+ inFlight() {
5542
+ return inFlight;
5543
+ }
5544
+ };
5545
+ }
5546
+
5298
5547
  const CLAUDE_AUTH_PROBE_INTERVAL_MS = 10 * 60 * 1e3;
5299
5548
  const CLAUDE_AUTH_REFRESH_INTERVAL_MS = 30 * 60 * 1e3;
5300
5549
  const PROBE_TIMEOUT_MS = 8e3;
@@ -7429,6 +7678,7 @@ async function startDaemon() {
7429
7678
  let lastHandoverHold = null;
7430
7679
  let claudeCredentialStoreSetting = (await persistence.readSettings()).claudeCredentialStore === "file" ? "file" : "auto";
7431
7680
  let agentHibernationSetting = (await persistence.readSettings()).agentHibernationIdleMs;
7681
+ let autoRestartSetting = (await persistence.readSettings()).autoRestartSessions !== false;
7432
7682
  try {
7433
7683
  const homes = await index$1.refreshAgentHomes();
7434
7684
  logger.logger.debug(`[DAEMON RUN] Claude config dir: ${loginShellEnv.describeAgentHome(homes.claudeConfigDir)}; Codex home: ${loginShellEnv.describeAgentHome(homes.codexHome)}`);
@@ -7551,6 +7801,7 @@ async function startDaemon() {
7551
7801
  });
7552
7802
  const sessionIdToFinishedSession = /* @__PURE__ */ new Map();
7553
7803
  let teamWorker;
7804
+ let autoRestart;
7554
7805
  let automationRunner;
7555
7806
  let projectPresence;
7556
7807
  const persisted = persistence.readPersistedSessions();
@@ -8291,6 +8542,7 @@ async function startDaemon() {
8291
8542
  }
8292
8543
  };
8293
8544
  const restartCounts = /* @__PURE__ */ new Map();
8545
+ const autoRestartExits = /* @__PURE__ */ new Set();
8294
8546
  const stopSessionAndWait = async (happySessionId, timeoutMs = 8e3) => {
8295
8547
  const targets = /* @__PURE__ */ new Set();
8296
8548
  for (const [pid, s] of pidToTrackedSession.entries()) {
@@ -8340,7 +8592,7 @@ async function startDaemon() {
8340
8592
  const restartSessionImpl = async (happySessionId, options) => {
8341
8593
  try {
8342
8594
  const prior = restartCounts.get(happySessionId) ?? 0;
8343
- const decision = decideRestart(prior, DEFAULT_MAX_RESTARTS);
8595
+ const decision = options?.auto ? { allowed: true } : decideRestart(prior, DEFAULT_MAX_RESTARTS);
8344
8596
  if (!decision.allowed) {
8345
8597
  return { type: "error", errorMessage: `restart:${decision.reason}` };
8346
8598
  }
@@ -8391,7 +8643,7 @@ async function startDaemon() {
8391
8643
  if (model) args.push("--model", model);
8392
8644
  const permissionMode = spawnAgents.sanitizeSpawnPermissionMode(options?.permissionMode ?? (options?.keepPublishedPermissionMode ? publishedRelaunchPermissionMode(metadata) : void 0));
8393
8645
  if (permissionMode) args.push("--permission-mode", permissionMode);
8394
- restartCounts.set(happySessionId, recordRestartAttempt(prior));
8646
+ if (!options?.auto) restartCounts.set(happySessionId, recordRestartAttempt(prior));
8395
8647
  const teamEnv = await teamRelaunchEnvFor(happySessionId, metadata);
8396
8648
  const result = await spawnTrackedHappyProcess({
8397
8649
  args,
@@ -8412,7 +8664,8 @@ async function startDaemon() {
8412
8664
  HAPPY_RECONNECT_SEQ: String(tracked.encryption.seq),
8413
8665
  HAPPY_RECONNECT_METADATA_VERSION: String(tracked.encryption.metadataVersion),
8414
8666
  HAPPY_RECONNECT_AGENT_STATE_VERSION: String(tracked.encryption.agentStateVersion),
8415
- ...teamEnv
8667
+ ...teamEnv,
8668
+ ...options?.auto ? { [sessionLock.AUTO_RESTARTED_ENV]: sessionLock.encodeAutoRestarted(options.auto.kind, options.auto.target) } : {}
8416
8669
  }
8417
8670
  });
8418
8671
  if (result.type === "success") {
@@ -8455,10 +8708,11 @@ async function startDaemon() {
8455
8708
  };
8456
8709
  const onChildExited = (pid) => {
8457
8710
  const session = pidToTrackedSession.get(pid);
8458
- if (session?.happySessionId && (session.spawnedBy === "teams" || teamWorker?.hasSession(session.happySessionId))) teamWorker?.report(session.happySessionId, "exited");
8711
+ if (session?.happySessionId && !autoRestartExits.has(session.happySessionId) && (session.spawnedBy === "teams" || teamWorker?.hasSession(session.happySessionId))) teamWorker?.report(session.happySessionId, "exited");
8459
8712
  if (session?.happySessionId && automationRunner?.hasSession(session.happySessionId)) automationRunner.report(session.happySessionId, "exited");
8460
8713
  if (session?.happySessionId) turnActivity.forget(session.happySessionId);
8461
8714
  if (session?.happySessionId) backgroundTasks.forget(session.happySessionId);
8715
+ if (session?.happySessionId) autoRestart?.forget(session.happySessionId);
8462
8716
  if (session?.happySessionId) peerCoordinator.forget(session.happySessionId);
8463
8717
  if (session?.happySessionId && daemonHibernation.consumeExit(session.happySessionId)) {
8464
8718
  const persisted2 = persistence.readPersistedSessions()[session.happySessionId];
@@ -8539,6 +8793,84 @@ async function startDaemon() {
8539
8793
  })();
8540
8794
  };
8541
8795
  let apiMachineRef = null;
8796
+ let latestAgentVersions = null;
8797
+ const trackedFacts = (tracked) => {
8798
+ const metadata = tracked.happySessionMetadataFromLocalWebhook;
8799
+ return {
8800
+ live: isPidAlive(tracked.pid),
8801
+ wrapperVersion: metadata?.version ?? null,
8802
+ flavor: metadata?.flavor ?? "claude",
8803
+ capabilities: metadata?.capabilities ?? null,
8804
+ spawnedBy: tracked.spawnedBy ?? null,
8805
+ tags: metadata?.tags ?? null,
8806
+ variant: tracked.variant ?? metadata?.variant ?? null,
8807
+ // The wrapper's own word: tracked.startedBy turns into "persisted" /
8808
+ // "recovered" across the very daemon restart an upgrade does.
8809
+ startedBy: metadata?.startedBy ?? null
8810
+ };
8811
+ };
8812
+ const autoRestartScheduler = createAutoRestart({
8813
+ enabled: () => autoRestartSetting,
8814
+ quietMs: sessionLock.resolveQuietMs(),
8815
+ daemonVersion: _package.packageJson.version,
8816
+ installedAgentVersion: (flavor) => flavor === "codex" ? latestAgentVersions?.agents.find((agent) => agent.id === "codex")?.installed ?? null : null,
8817
+ tracked: (sessionId, pid) => {
8818
+ const tracked = pidToTrackedSession.get(pid);
8819
+ if (!tracked || tracked.happySessionId !== sessionId) return null;
8820
+ return trackedFacts(tracked);
8821
+ },
8822
+ liveSessions: () => [...pidToTrackedSession.values()].filter((tracked) => tracked.happySessionId && tracked.happySessionMetadataFromLocalWebhook && isPidAlive(tracked.pid)).map((tracked) => ({ sessionId: tracked.happySessionId, ...trackedFacts(tracked) })),
8823
+ turnActive: (sessionId) => turnActivity.activeSessions().includes(sessionId),
8824
+ backgroundTasks: (sessionId) => backgroundTasks.count(sessionId),
8825
+ automationRunning: (sessionId) => automationRunner?.hasSession(sessionId) === true,
8826
+ // The local copy may predate the agent's conversation id (it is the spawn
8827
+ // webhook's); judge the server copy, exactly as restartSessionImpl will.
8828
+ resumable: async (sessionId) => {
8829
+ const tracked = findTrackedSessionById(sessionId);
8830
+ const local = tracked?.happySessionMetadataFromLocalWebhook;
8831
+ const encryption = tracked?.encryption;
8832
+ if (!local || !encryption) return false;
8833
+ const { metadata } = await resolveRelaunchMetadata(
8834
+ local,
8835
+ () => fetchServerSessionMetadata(sessionId, encryption.encryptionKey, encryption.encryptionVariant)
8836
+ );
8837
+ return resumePrecheck(metadata, {
8838
+ cwdExists: (p) => require$$0.existsSync(p),
8839
+ conversationExists: (cwd, claudeSessionId) => index$1.locateClaudeConversation(cwd, claudeSessionId) !== null
8840
+ }).ok;
8841
+ },
8842
+ restart: async (sessionId, staleness) => {
8843
+ autoRestartExits.add(sessionId);
8844
+ try {
8845
+ const result = await restartSession(sessionId, { keepPublishedPermissionMode: true, auto: { kind: staleness.kind, target: staleness.target } });
8846
+ if (result.type !== "success") return { ok: false, error: result.type === "error" ? result.errorMessage : result.type };
8847
+ const after = findTrackedSessionById(sessionId)?.happySessionMetadataFromLocalWebhook?.version;
8848
+ if (staleness.kind === "cli" && after && (cliUpdate.compareExactVersions(after, staleness.target) ?? 0) < 0) {
8849
+ return { ok: false, error: `still-behind: ${after}` };
8850
+ }
8851
+ return { ok: true };
8852
+ } finally {
8853
+ autoRestartExits.delete(sessionId);
8854
+ }
8855
+ },
8856
+ // Offline-failure retry guard: nobody restored, archived or resumed it meanwhile.
8857
+ serverSession: async (sessionId) => {
8858
+ const response = await axios.get(`${configuration.configuration.serverUrl}/v1/sessions/${encodeURIComponent(sessionId)}`, {
8859
+ headers: { Authorization: `Bearer ${credentials.token}` },
8860
+ timeout: 1e4
8861
+ });
8862
+ const row = response.data.session;
8863
+ if (!row || typeof row.active !== "boolean") return null;
8864
+ return { active: row.active, archived: row.archivedAt != null };
8865
+ },
8866
+ publish: (sessions) => {
8867
+ void apiMachineRef?.setAutoRestartSessions(sessions);
8868
+ },
8869
+ log: (message) => logger.logger.debug(`[DAEMON RUN] ${message}`)
8870
+ });
8871
+ autoRestart = autoRestartScheduler;
8872
+ const autoRestartSweep = setInterval(() => autoRestartScheduler.sweep(), 6e4);
8873
+ autoRestartSweep.unref?.();
8542
8874
  let mirrorManagerRef = null;
8543
8875
  const controlToken = createDaemonControlToken();
8544
8876
  const { port: controlPort, stop: stopControlServer } = await startDaemonControlServer({
@@ -8565,7 +8897,14 @@ async function startDaemon() {
8565
8897
  onRateLimits: (report) => {
8566
8898
  apiMachineRef?.reportRateLimits(report);
8567
8899
  },
8568
- onHibernateCheck: (body) => daemonHibernation.check(body),
8900
+ // B-852: the same idle check-in also decides an automatic restart of a
8901
+ // stale wrapper; hibernation (exit) wins when both say yes.
8902
+ onHibernateCheck: async (body) => {
8903
+ const reply = await daemonHibernation.check(body);
8904
+ if (reply.hibernate) return reply;
8905
+ const auto = await autoRestartScheduler.onCheckIn(body);
8906
+ return { ...reply, nextCheckMs: Math.min(reply.nextCheckMs ?? sessionLock.AUTO_RESTART_RECHECK_CAP_MS, sessionLock.AUTO_RESTART_RECHECK_CAP_MS, auto.nextCheckMs ?? Infinity) };
8907
+ },
8569
8908
  listPeers: () => peerCoordinator.list(),
8570
8909
  // B-505: `daemon list` shows which sessions have a turn in flight, so an
8571
8910
  // operator can check the WHOLE machine before a supervised restart.
@@ -8717,6 +9056,13 @@ async function startDaemon() {
8717
9056
  daemonHibernation.invalidateBindings();
8718
9057
  return persistence.resolveIdleMs(agentHibernationSetting);
8719
9058
  });
9059
+ apiMachine.setAutoRestartHandlers(autoRestartSetting, async (enabled) => {
9060
+ await persistence.updateSettings((current) => ({ ...current, autoRestartSessions: enabled }));
9061
+ autoRestartSetting = enabled;
9062
+ autoRestartScheduler.sweep();
9063
+ return autoRestartSetting;
9064
+ });
9065
+ setTimeout(() => autoRestartScheduler.sweep(), 5e3).unref?.();
8720
9066
  const webPanelsSync = startWebPanelsSync({
8721
9067
  statMtime: async () => (await fs.stat(configuration.configuration.settingsFile).catch(() => null))?.mtimeMs ?? null,
8722
9068
  readRaw: async () => (await persistence.readSettings()).webPanels,
@@ -8807,7 +9153,10 @@ async function startDaemon() {
8807
9153
  if (delay !== null) logger.logger.warn(`[DAEMON RUN] CLI update policy announced; re-checking in ${Math.round(delay / 1e3)}s`);
8808
9154
  });
8809
9155
  const stopAgentVersionChecks = mirrorProtocol.startAgentVersionChecks(
8810
- (snapshot) => apiMachine.updateDaemonState((state) => ({ ...state, status: state?.status ?? "running", agentVersions: snapshot })),
9156
+ (snapshot) => {
9157
+ latestAgentVersions = snapshot;
9158
+ return apiMachine.updateDaemonState((state) => ({ ...state, status: state?.status ?? "running", agentVersions: snapshot }));
9159
+ },
8811
9160
  (error) => logger.logger.debug("[DAEMON RUN] Agent version check failed", error)
8812
9161
  );
8813
9162
  harnessInstaller = createHarnessInstaller({
@@ -8989,6 +9338,7 @@ async function startDaemon() {
8989
9338
  logger.logger.debug("[DAEMON RUN] Health check interval cleared");
8990
9339
  }
8991
9340
  clearInterval(cliUpdateInterval);
9341
+ clearInterval(autoRestartSweep);
8992
9342
  policyAnnouncements.stop();
8993
9343
  stopAgentVersionChecks();
8994
9344
  await apiMachine.updateDaemonState((state) => ({