very-happy-cli 0.2.205 → 0.2.206

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-CfTTWCK_.mjs} +3 -3
  2. package/dist/{AcpBackend-Do37yiZg.cjs → AcpBackend-dO5GAvaj.cjs} +3 -3
  3. package/dist/{AcpSessionManager-BpQKu2_m.cjs → AcpSessionManager-DpT9znny.cjs} +1 -1
  4. package/dist/{AcpSessionManager-CvEO7Yex.mjs → AcpSessionManager-a-A4YDP7.mjs} +1 -1
  5. package/dist/{BasePermissionHandler-CUXi-tq4.cjs → BasePermissionHandler-C917oi-W.cjs} +1 -1
  6. package/dist/{BasePermissionHandler-BpaIn9ko.mjs → BasePermissionHandler-Cg2py7Mi.mjs} +1 -1
  7. package/dist/{account-SwG5Yefp.cjs → account-BpEOGAi-.cjs} +5 -5
  8. package/dist/{account-C1nsl3ij.mjs → account-CY_3dfMO.mjs} +5 -5
  9. package/dist/{acpSessionResume-BCEol11N.cjs → acpSessionResume-BTchDv4R.cjs} +1 -1
  10. package/dist/{acpSessionResume-DvDKsJTV.mjs → acpSessionResume-D1v1ZqjL.mjs} +1 -1
  11. package/dist/{agentHome-8wzmbm0H.cjs → agentHome-B8Fp21kp.cjs} +4 -4
  12. package/dist/{agentHome-BuFxooEg.mjs → agentHome-Bb0sGzgt.mjs} +4 -4
  13. package/dist/{api-BnTF8fkj.cjs → api-B-u-Mk6V.cjs} +9 -9
  14. package/dist/{api-20GbdpxY.mjs → api-DGJVcaIF.mjs} +9 -9
  15. package/dist/{apiMachine-C8NGJHHd.mjs → apiMachine-B-GyYD22.mjs} +56 -16
  16. package/dist/{apiMachine-cyDRM_S-.cjs → apiMachine-Bi15f6YB.cjs} +56 -16
  17. package/dist/{attachmentContent-B7zz_LPF.cjs → attachmentContent-BvGKA5QH.cjs} +2 -2
  18. package/dist/{attachmentContent-Coo9lUxK.mjs → attachmentContent-C-qFMirp.mjs} +2 -2
  19. package/dist/{auth-By6u_iKB.cjs → auth-Bnj_x4XN.cjs} +5 -5
  20. package/dist/{auth-BX6xrdHv.mjs → auth-CP7a7YqH.mjs} +5 -5
  21. package/dist/{auth-w4UTRbIf.cjs → auth-CT2084Ag.cjs} +8 -8
  22. package/dist/{auth-75rP3vc0.mjs → auth-FRjFFR7K.mjs} +8 -8
  23. package/dist/{auto-BhmWtRvv.mjs → auto-CxItjek7.mjs} +14 -14
  24. package/dist/{auto-xr_gqUoy.cjs → auto-DaADkeaT.cjs} +14 -14
  25. package/dist/{bootstrap-Dn_VvHSt.mjs → bootstrap-BCuF4Kla.mjs} +2 -2
  26. package/dist/{bootstrap-3ti7LXMz.cjs → bootstrap-Cq_W1C3z.cjs} +2 -2
  27. package/dist/{browser-C4wWGXH7.mjs → browser-C-PWxfCE.mjs} +1 -1
  28. package/dist/{browser-C4PVyjGe.cjs → browser-CHC75A5J.cjs} +1 -1
  29. package/dist/{claudeLocal-DZALKVVc.cjs → claudeLocal-TVtTBsHi.cjs} +4 -4
  30. package/dist/{claudeLocal-B8rOA-EB.mjs → claudeLocal-XsMte9X2.mjs} +4 -4
  31. package/dist/{claudeLocalLauncher-Bf5uj0EA.cjs → claudeLocalLauncher-D5XU298r.cjs} +9 -9
  32. package/dist/{claudeLocalLauncher-CJPRSv3z.mjs → claudeLocalLauncher-DDU1kyxO.mjs} +9 -9
  33. package/dist/{claudeSessionFork-BK4U655i.mjs → claudeSessionFork-CZpugNK3.mjs} +1 -1
  34. package/dist/{claudeSessionFork-unEBLW0t.cjs → claudeSessionFork-CzzRjCFN.cjs} +1 -1
  35. package/dist/{client-m-K1b6Qa.mjs → client-5ekzs8hv.mjs} +2 -2
  36. package/dist/{client-BbYds4AV.mjs → client-Bqyfl2t0.mjs} +4 -4
  37. package/dist/{client-Bh-y6cVc.cjs → client-C2F0G1gB.cjs} +4 -4
  38. package/dist/{client-DGsdLx8L.cjs → client-Cdax95Aw.cjs} +2 -2
  39. package/dist/{client-wMlUPnrV.cjs → client-D9viv5fT.cjs} +2 -2
  40. package/dist/{client-BxtaglBR.mjs → client-DizbJlbC.mjs} +2 -2
  41. package/dist/{client-BKjBr6pc.cjs → client-jlIx75iG.cjs} +2 -2
  42. package/dist/{client-CvLm25Wq.mjs → client-ztj20uaj.mjs} +2 -2
  43. package/dist/codex/happyMcpStdioBridge.cjs +18 -18
  44. package/dist/codex/happyMcpStdioBridge.mjs +18 -18
  45. package/dist/{codexAppServerClient-BeRimnu9.mjs → codexAppServerClient-DFRZ__3w.mjs} +3 -3
  46. package/dist/{codexAppServerClient-6aQelpRl.cjs → codexAppServerClient-oSG91fFK.cjs} +3 -3
  47. package/dist/{codexCommand-CmGNDs45.mjs → codexCommand-BE__EfSf.mjs} +43 -43
  48. package/dist/{codexCommand-CYVaGmhh.cjs → codexCommand-BNjxG3C_.cjs} +43 -43
  49. package/dist/{codexTermination-Z18pGkkl.mjs → codexTermination-DuGPgcGv.mjs} +1 -1
  50. package/dist/{codexTermination-B09HyYIB.cjs → codexTermination-_YHZVugN.cjs} +1 -1
  51. package/dist/{config-Dq_N615Z.cjs → config-BH7N9kZX.cjs} +3 -3
  52. package/dist/{config-4b-sF37g.mjs → config-DXO9RUqb.mjs} +3 -3
  53. package/dist/{configuration-H8q1sMwk.mjs → configuration-BreL0beF.mjs} +1 -1
  54. package/dist/{configuration-Fx61b4MJ.cjs → configuration-Da2jFKHx.cjs} +1 -1
  55. package/dist/{connect-D54AnDIT.cjs → connect-BIIxh5a9.cjs} +12 -12
  56. package/dist/{connect-BwSwKPzI.mjs → connect-B_UrNMnp.mjs} +12 -12
  57. package/dist/{context-CM1Xd_HO.mjs → context-DFudPCad.mjs} +1 -1
  58. package/dist/{context-D-QOcYuX.cjs → context-n1LlNbjT.cjs} +1 -1
  59. package/dist/{controlClient-D04wXKoQ.cjs → controlClient-Dlait4BW.cjs} +3 -3
  60. package/dist/{controlClient-D9DYqW02.mjs → controlClient-DwiujrH8.mjs} +3 -3
  61. package/dist/{createSessionMetadata-Ce539QXK.cjs → createSessionMetadata-83WjQzAt.cjs} +2 -2
  62. package/dist/{createSessionMetadata-CHa4pufa.mjs → createSessionMetadata-B0wB4nIY.mjs} +2 -2
  63. package/dist/{deterministicJson-BEeXnWCF.mjs → deterministicJson-BUtDwjAU.mjs} +14 -14
  64. package/dist/{deterministicJson-D34CnNHO.cjs → deterministicJson-Dppskedb.cjs} +14 -14
  65. package/dist/{doctor-BX8oWKZq.cjs → doctor-BtVympkn.cjs} +7 -7
  66. package/dist/{doctor-BI0Iywt_.mjs → doctor-QQS5dGqG.mjs} +7 -7
  67. package/dist/{downloadTarget-DX3m00OE.mjs → downloadTarget-CVm8ey3W.mjs} +6 -6
  68. package/dist/{downloadTarget-TzXJEh6W.cjs → downloadTarget-CxGQUh-7.cjs} +6 -6
  69. package/dist/{ensureDaemonRunning-Bvu-yyFn.cjs → ensureDaemonRunning-CjD9jtqp.cjs} +5 -5
  70. package/dist/{ensureDaemonRunning-BBBqZ6vQ.mjs → ensureDaemonRunning-m6Kd3BM7.mjs} +5 -5
  71. package/dist/{exitNotice-gOAdDcL3.mjs → exitNotice-HOwYf-97.mjs} +2 -2
  72. package/dist/{exitNotice-M4UjtWkr.cjs → exitNotice-bUdz2C4L.cjs} +2 -2
  73. package/dist/{format-BPAREVhi.mjs → format-2GqpXiRX.mjs} +1 -1
  74. package/dist/{format-BEktLc45.cjs → format-BXxqj69f.cjs} +1 -1
  75. package/dist/{handleResumeCommand-DziiqogX.mjs → handleResumeCommand-CTT8lfhV.mjs} +5 -5
  76. package/dist/{handleResumeCommand-6dYW_WOi.cjs → handleResumeCommand-D_NUSPvz.cjs} +5 -5
  77. package/dist/{index-BmacwzcK.cjs → index-B2xEPLkK.cjs} +40 -40
  78. package/dist/{index-CzBvl9py.mjs → index-BLL_KBUA.mjs} +3 -3
  79. package/dist/{index-bVMcFi7v.cjs → index-BrvS8Bor.cjs} +4 -4
  80. package/dist/{index-DCvq8Cfw.mjs → index-C2PX_W49.mjs} +4 -4
  81. package/dist/{index-UuWDafdi.mjs → index-CDO9rljT.mjs} +41 -41
  82. package/dist/{index-BRq5iitn.mjs → index-CIWLX_eM.mjs} +4 -4
  83. package/dist/{index-CoW4RNEb.cjs → index-CJXPB8kU.cjs} +3 -3
  84. package/dist/{index-Cawt-fgZ.cjs → index-TDGlRjkn.cjs} +4 -4
  85. package/dist/index.cjs +2 -2
  86. package/dist/index.mjs +2 -2
  87. package/dist/{install-BQc4Hwuo.cjs → install-BaUw2G6E.cjs} +3 -3
  88. package/dist/{install-B4OVUIw5.mjs → install-DDfCEbu9.mjs} +3 -3
  89. package/dist/{issue-WpLZYxUQ.cjs → issue-BrxmnVRr.cjs} +7 -7
  90. package/dist/{issue-h_BIrzLs.mjs → issue-Mh6p_OMm.mjs} +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-B2bOV9RF.mjs} +1 -1
  96. package/dist/{localHappyAgentAuth-DQRWBUxQ.cjs → localHappyAgentAuth-BtDypYZb.cjs} +1 -1
  97. package/dist/{logger-DP35yx-C.cjs → logger-B_GiBdoD.cjs} +2 -2
  98. package/dist/{logger-BKAKIZdy.mjs → logger-DOp6YYAW.mjs} +2 -2
  99. package/dist/{machineMetadata-DTlMMhj_.mjs → machineMetadata-8PjdzhIk.mjs} +3 -3
  100. package/dist/{machineMetadata-CZj0XwM_.cjs → machineMetadata-rjOkg7or.cjs} +3 -3
  101. package/dist/{main-BIE1zeaH.mjs → main-BfSuibka.mjs} +48 -48
  102. package/dist/{main-l_nP9IQq.cjs → main-Dxj1sGm3.cjs} +48 -48
  103. package/dist/{mcp-B5F6-_7o.mjs → mcp-C_G7MsCo.mjs} +15 -15
  104. package/dist/{mcp-KQHODyR3.cjs → mcp-DmRG6Yyk.cjs} +15 -15
  105. package/dist/{mirrorProtocol-duXHJeBW.cjs → mirrorProtocol-C8ZsCJzM.cjs} +2 -2
  106. package/dist/{mirrorProtocol-DDOUSWqL.mjs → mirrorProtocol-N8M4o7UD.mjs} +2 -2
  107. package/dist/{package-CMmhJwSf.mjs → package-CJeweE1o.mjs} +8 -8
  108. package/dist/{package-BCJfNMlt.cjs → package-DTEEvw5V.cjs} +8 -8
  109. package/dist/{panels-BWxZMb_x.mjs → panels-BJGEusTH.mjs} +5 -5
  110. package/dist/{panels-CBlIJIu8.cjs → panels-D9DTAY7b.cjs} +5 -5
  111. package/dist/{peerTools-C6Y28jqG.cjs → peerTools-Cs7_fbtQ.cjs} +5 -5
  112. package/dist/{peerTools-ZJzoM48N.mjs → peerTools-D66WcwUZ.mjs} +5 -5
  113. package/dist/{persistence-dLgWDclq.mjs → persistence-DURvN3Hm.mjs} +2 -2
  114. package/dist/{persistence-iiVFxhbt.cjs → persistence-_HpJ8Xqx.cjs} +2 -2
  115. package/dist/{piRunnerArgs-DxWxgOSZ.cjs → piRunnerArgs-BqqnRbD2.cjs} +1 -1
  116. package/dist/{piRunnerArgs-DuWYye4f.mjs → piRunnerArgs-Q9_OZpgB.mjs} +1 -1
  117. package/dist/{piRuntime-6UnkPaS1.cjs → piRuntime-CfymNU4r.cjs} +1 -1
  118. package/dist/{piRuntime-Cbwk6bN0.mjs → piRuntime-DVfBZwGV.mjs} +1 -1
  119. package/dist/{piTerminal-Dn0qN9nb.mjs → piTerminal-BmVTobWw.mjs} +17 -17
  120. package/dist/{piTerminal-BaoUqlM0.cjs → piTerminal-SWzeud-Y.cjs} +17 -17
  121. package/dist/{pushNotifications-DD9Z0CoN.mjs → pushNotifications-CrN3Ja_a.mjs} +19 -2
  122. package/dist/{pushNotifications-gcQv61e6.cjs → pushNotifications-DzWubbyC.cjs} +19 -2
  123. package/dist/{query-CFdlRD7b.mjs → query-CcFiFfJ8.mjs} +1 -1
  124. package/dist/{query-12momZSq.cjs → query-DXKQY4gV.cjs} +1 -1
  125. package/dist/{rateLimitWindows-D2Gmg7jU.cjs → rateLimitWindows-BmZ6gZY8.cjs} +1 -1
  126. package/dist/{rateLimitWindows-CVS-btq-.mjs → rateLimitWindows-BrCPAQCV.mjs} +1 -1
  127. package/dist/{reconnectGate-m81ySKhh.mjs → reconnectGate-BbxwTsar.mjs} +1 -1
  128. package/dist/{reconnectGate-BkSaZdIx.cjs → reconnectGate-DBf3oDWw.cjs} +1 -1
  129. package/dist/{registerCommonHandlers-B5p3ZZmp.cjs → registerCommonHandlers-DJcGS4eV.cjs} +2 -2
  130. package/dist/{registerCommonHandlers-CqLHkmG2.mjs → registerCommonHandlers-Dd5Ld0CL.mjs} +2 -2
  131. package/dist/{registerKillSessionHandler-Bf_Q9yii.cjs → registerKillSessionHandler-CCpSkYc2.cjs} +5 -5
  132. package/dist/{registerKillSessionHandler-jYSuGIP1.mjs → registerKillSessionHandler-DNLUoqKq.mjs} +5 -5
  133. package/dist/{registerSideQuestionHandler-DSIw3xPW.cjs → registerSideQuestionHandler-D7zu0Z-I.cjs} +4 -4
  134. package/dist/{registerSideQuestionHandler-CPR29B9d.mjs → registerSideQuestionHandler-_YMnEk1L.mjs} +4 -4
  135. package/dist/{remoteSessionClient-DX-60nto.cjs → remoteSessionClient-Don4DO6r.cjs} +5 -5
  136. package/dist/{remoteSessionClient-CLuxs0_y.mjs → remoteSessionClient-iIWEgwCP.mjs} +5 -5
  137. package/dist/{reportProgressTool-k3g3D6cX.mjs → reportProgressTool-B9DJTgdO.mjs} +4 -4
  138. package/dist/{reportProgressTool-D1XAxeY1.cjs → reportProgressTool-DwHrvFHn.cjs} +4 -4
  139. package/dist/{run-DOb_agpA.cjs → run-CbsSCESl.cjs} +269 -37
  140. package/dist/{run-BBJqaIoY.mjs → run-RKaV1s5m.mjs} +269 -37
  141. package/dist/{runClaude-BU3Lrd5o.cjs → runClaude-B4hSm06m.cjs} +20 -20
  142. package/dist/{runClaude-NTvReMNp.mjs → runClaude-BnMkhjUP.mjs} +20 -20
  143. package/dist/{runClaudeDeps-DQV-QdDi.cjs → runClaudeDeps-BrS568YD.cjs} +38 -38
  144. package/dist/{runClaudeDeps-Dh2LVY2w.mjs → runClaudeDeps-jlxTi74f.mjs} +44 -44
  145. package/dist/{runGemini-CGD4bqQ3.mjs → runGemini-D34l_LpW.mjs} +35 -35
  146. package/dist/{runGemini-dk877ztP.cjs → runGemini-DMLMq-y1.cjs} +35 -35
  147. package/dist/{runOpenClaw-CQakHPPq.cjs → runOpenClaw-BGKlUFHd.cjs} +17 -17
  148. package/dist/{runOpenClaw-6MAJ_tHi.mjs → runOpenClaw-Dezk2LNe.mjs} +17 -17
  149. package/dist/{sandbox-8DeDre0R.cjs → sandbox-C70ODcxh.cjs} +4 -4
  150. package/dist/{sandbox-B3YMD9I6.mjs → sandbox-Db7g31zm.mjs} +4 -4
  151. package/dist/selfCheck-CUVp2nQo.mjs +89 -0
  152. package/dist/{selfCheck-BpvUNBmv.cjs → selfCheck-UKA82vpj.cjs} +39 -39
  153. package/dist/{send-DgrbVZzC.mjs → send-8-CnqJTX.mjs} +8 -8
  154. package/dist/{send-Bym_IU4n.cjs → send-BD8y_Dvq.cjs} +8 -8
  155. package/dist/{server-BY-FubRe.cjs → server-B-0TJW4B.cjs} +6 -6
  156. package/dist/{server-CmAgeEhS.mjs → server-CxmH3n3Y.mjs} +4 -4
  157. package/dist/{sessionLock-WXtjQC9q.cjs → sessionLock-BRaWaYhl.cjs} +9 -3
  158. package/dist/{sessionLock-BMtAQ4bW.mjs → sessionLock-Cg33c_Um.mjs} +9 -4
  159. package/dist/{sessionOps-BxLhHEhM.mjs → sessionOps-1_wWgsXG.mjs} +4 -4
  160. package/dist/{sessionOps-BEVzE38e.cjs → sessionOps-C-ms5bYE.cjs} +4 -4
  161. package/dist/{sessionProvider-B1tL5K5f.mjs → sessionProvider-BKJ7EW-9.mjs} +5 -5
  162. package/dist/{sessionProvider-DCnZFxwe.cjs → sessionProvider-nbK5DYvh.cjs} +5 -5
  163. package/dist/{sessionScanner-Ctm9w-AJ.mjs → sessionScanner-CGP1nnOy.mjs} +3 -3
  164. package/dist/{sessionScanner-eX2f-j0u.cjs → sessionScanner-S7FsjWqu.cjs} +3 -3
  165. package/dist/{sessions-BuxOqRcc.mjs → sessions-7B68T5D2.mjs} +10 -10
  166. package/dist/{sessions-BG8r7uht.cjs → sessions-CwC-s7iA.cjs} +10 -10
  167. package/dist/{setupOfflineReconnection-65k1yEFn.cjs → setupOfflineReconnection-D9BD_Cha.cjs} +2 -2
  168. package/dist/{setupOfflineReconnection-Dd4NCN9i.mjs → setupOfflineReconnection-DSlXZLP9.mjs} +2 -2
  169. package/dist/{spawn-wys_MPgK.mjs → spawn-CJ6ow1Et.mjs} +12 -12
  170. package/dist/{spawn-0YaC-DQg.cjs → spawn-D4gyZP6A.cjs} +12 -12
  171. package/dist/{spawnHappyCLI-EvPb0jB3.mjs → spawnHappyCLI-BRcxn8Ui.mjs} +1 -1
  172. package/dist/{spawnHappyCLI-Bf_N42fi.cjs → spawnHappyCLI-CKgAt8NU.cjs} +1 -1
  173. package/dist/{startFileWatcher-ikipjpDk.cjs → startFileWatcher-Baw_dgs_.cjs} +1 -1
  174. package/dist/{startFileWatcher-GF4BNFA1.mjs → startFileWatcher-DJ_IPi0y.mjs} +1 -1
  175. package/dist/{startupSessionCreate-CHU23k6u.cjs → startupSessionCreate-Cjl3wk3-.cjs} +3 -3
  176. package/dist/{startupSessionCreate-Dp3_kvi_.mjs → startupSessionCreate-DeJNxWtb.mjs} +3 -3
  177. package/dist/{sync-Dm6GaS8P.cjs → sync-BqlAL8Iu.cjs} +1 -1
  178. package/dist/{sync-Co0wRhGu.mjs → sync-COxP1DF-.mjs} +1 -1
  179. package/dist/{systemPrompt-Ds7HcfDZ.cjs → systemPrompt-Ch052UGr.cjs} +1 -1
  180. package/dist/{systemPrompt-5cZbY0sf.mjs → systemPrompt-bX3lhFwJ.mjs} +1 -1
  181. package/dist/{teams-nrcZL-1X.cjs → teams-B15InkZ8.cjs} +8 -8
  182. package/dist/{teams-DBWFUOC3.mjs → teams-DCCFeNBI.mjs} +8 -8
  183. package/dist/{time-Cn0mV-di.mjs → time-BHGz6WMO.mjs} +1 -1
  184. package/dist/{time-NSglRbyr.cjs → time-COyPPTSV.cjs} +1 -1
  185. package/dist/{titleGenerator-CMIUB04_.cjs → titleGenerator-D4FFE3Mo.cjs} +2 -2
  186. package/dist/{titleGenerator-hmxUR3rU.mjs → titleGenerator-J99R5x-_.mjs} +1 -1
  187. package/dist/{todo-D5BoNMb7.cjs → todo-BHGF7oHm.cjs} +7 -7
  188. package/dist/{todo-CDdBityL.mjs → todo-BZAJpKe1.mjs} +7 -7
  189. package/dist/{tools-BmQbzAfY.mjs → tools-Ck6hDYQh.mjs} +1 -1
  190. package/dist/{tools-CLkNfafW.cjs → tools-DswZApdy.cjs} +1 -1
  191. package/dist/{uninstall-DE0SH2qs.mjs → uninstall-33r_D-SV.mjs} +3 -3
  192. package/dist/{uninstall-DCx_qNMZ.cjs → uninstall-DUBwOYXT.cjs} +3 -3
  193. package/package.json +8 -8
  194. package/dist/selfCheck-BCKIF6ST.mjs +0 -89
@@ -1,6 +1,6 @@
1
- import { i as isClaudeSessionId, h as extractCompleteLines, j as decideBackfill, k as parseTerminalHookPayload, m as decideMirrorBinding, M as MIRROR_BACKFILL_LINES_DEFAULT, n as mirrorLineKey, o as mirrorLocalId, q as initializeOwnedWorktree, f as summarizeSpawnSessionForLog, t as startAgentVersionChecks, W as WORKTREE_CAPABILITY_VERSION, u as currentWorktreeService } from './mirrorProtocol-DDOUSWqL.mjs';
1
+ import { i as isClaudeSessionId, h as extractCompleteLines, j as decideBackfill, k as parseTerminalHookPayload, m as decideMirrorBinding, M as MIRROR_BACKFILL_LINES_DEFAULT, n as mirrorLineKey, o as mirrorLocalId, q as initializeOwnedWorktree, f as summarizeSpawnSessionForLog, t as startAgentVersionChecks, W as WORKTREE_CAPABILITY_VERSION, u as currentWorktreeService } from './mirrorProtocol-N8M4o7UD.mjs';
2
2
  import { F as FS_MKDIR_CAPABILITY_VERSION } from './fsMkdir-DumgLTzR.mjs';
3
- import { P as PI_ADAPTER_INSTALL_HINT, s as sanitizeSpawnModel } from './piRunnerArgs-DuWYye4f.mjs';
3
+ import { P as PI_ADAPTER_INSTALL_HINT, s as sanitizeSpawnModel } from './piRunnerArgs-Q9_OZpgB.mjs';
4
4
  import fs from 'fs/promises';
5
5
  import os from 'os';
6
6
  import * as tmp from 'tmp';
@@ -8,20 +8,20 @@ import axios from 'axios';
8
8
  import { a as issueRelaunchEnv } from './sessionMetadata-C1eoAi89.mjs';
9
9
  import { readFileSync, openSync, fsyncSync, closeSync, renameSync, existsSync, readdirSync, statSync, unlinkSync, readSync, writeSync, ftruncateSync, utimesSync, realpathSync, promises, constants as constants$1, writeFileSync, mkdirSync, accessSync, rmdirSync } from 'node:fs';
10
10
  import { join, isAbsolute, resolve, dirname, sep, basename, relative } from 'node:path';
11
- import { f as teamExitMarkerPath, d as detectTeamUserLanguage, g as teamOwnerText, a as teamLanguageRule, c as teamLanguageReminder } from './exitNotice-gOAdDcL3.mjs';
12
- import { f as ensurePrivateDirectorySync, w as writePrivateFileSync, c as configuration } from './configuration-H8q1sMwk.mjs';
13
- import { T as TurnActivityTracker, A as ApiClient } from './api-20GbdpxY.mjs';
11
+ import { f as teamExitMarkerPath, d as detectTeamUserLanguage, g as teamOwnerText, a as teamLanguageRule, c as teamLanguageReminder } from './exitNotice-HOwYf-97.mjs';
12
+ import { f as ensurePrivateDirectorySync, w as writePrivateFileSync, c as configuration } from './configuration-BreL0beF.mjs';
13
+ import { T as TurnActivityTracker, A as ApiClient } from './api-DGJVcaIF.mjs';
14
14
  import { S as SPAWN_AGENTS, i as isSpawnAgent, s as sanitizeSpawnPermissionMode, r as resolveSpawnPermissionMode, a as resolveFirstMessageMeta, j as joinProject } from './spawnAgents-CcFKtKdX.mjs';
15
- import { l as logger } from './logger-BKAKIZdy.mjs';
16
- import { p as pruneStaleCompileCaches } from './index-CzBvl9py.mjs';
17
- import { a as authAndSetupMachineIfNeeded } from './auth-BX6xrdHv.mjs';
15
+ import { l as logger } from './logger-DOp6YYAW.mjs';
16
+ import { p as pruneStaleCompileCaches } from './index-BLL_KBUA.mjs';
17
+ import { a as authAndSetupMachineIfNeeded } from './auth-CP7a7YqH.mjs';
18
18
  import { spawn, execSync } from 'child_process';
19
- import { p as packageJson } from './package-CMmhJwSf.mjs';
20
- import { a as globalPrefixForPackage, N as NPM_SAFE_ARG, g as getEnvironmentInfo } from './doctor-BI0Iywt_.mjs';
21
- import { s as spawnHappyCLI } from './spawnHappyCLI-EvPb0jB3.mjs';
22
- import { c as readPersistedSessions, r as readSettings, l as latchKeepAwake, s as reportSignature, t as decideDaemonHibernation, v as nextCheckDelay, x as persistSession, d as readDaemonState, y as acquireDaemonLock, a as resolveCheckMs, z as resolveIdleMs, A as deletePersistedSessions, B as writeDaemonState, C as writeSettings, D as settingIdleMs, u as updateSettings, E as readDaemonStatePidSync, F as rewriteCredentialsForRelay, g as readCredentials, G as releaseDaemonLock } from './persistence-dLgWDclq.mjs';
23
- import { i as isDaemonRunningCurrentlyInstalledHappyVersion, s as stopDaemon, x as cleanupDaemonState } from './controlClient-D9DYqW02.mjs';
24
- import { e as sendUserMessage, f as readSessionMetadata, r as readSessionTranscript, l as listAccountSessions, a as listSessions, M as MAX_READ_LIMIT, s as sessionWebUrl, n as lineageOf, g as waitForSessionKey, d as archiveSession, h as analyzeLatestTurn, i as readSessionLog, j as TURN_WINDOW, p as userPromptText } from './sessionOps-BxLhHEhM.mjs';
19
+ import { p as packageJson } from './package-CJeweE1o.mjs';
20
+ import { a as globalPrefixForPackage, N as NPM_SAFE_ARG, g as getEnvironmentInfo } from './doctor-QQS5dGqG.mjs';
21
+ import { s as spawnHappyCLI } from './spawnHappyCLI-BRcxn8Ui.mjs';
22
+ import { c as readPersistedSessions, r as readSettings, l as latchKeepAwake, s as reportSignature, t as decideDaemonHibernation, v as nextCheckDelay, x as persistSession, d as readDaemonState, y as acquireDaemonLock, a as resolveCheckMs, z as resolveIdleMs, A as deletePersistedSessions, B as writeDaemonState, C as writeSettings, D as settingIdleMs, u as updateSettings, E as readDaemonStatePidSync, F as rewriteCredentialsForRelay, g as readCredentials, G as releaseDaemonLock } from './persistence-DURvN3Hm.mjs';
23
+ import { i as isDaemonRunningCurrentlyInstalledHappyVersion, s as stopDaemon, x as cleanupDaemonState } from './controlClient-DwiujrH8.mjs';
24
+ import { e as sendUserMessage, f as readSessionMetadata, r as readSessionTranscript, l as listAccountSessions, a as listSessions, M as MAX_READ_LIMIT, s as sessionWebUrl, n as lineageOf, g as waitForSessionKey, d as archiveSession, h as analyzeLatestTurn, i as readSessionLog, j as TURN_WINDOW, p as userPromptText } from './sessionOps-1_wWgsXG.mjs';
25
25
  import { a3 as AgentProfilesStateSchema, ar as ServerMigrateNoticeSchema, as as isHarnessInstallId, at as agentProfileUnavailableReason, au as MODEL_INTENT_CONFIG, q as AUTOMATION_SUMMARY_MAX_CHARS, av as AUTOMATION_PRECHECK_OUTPUT_MAX_CHARS, aw as AUTOMATION_PRECHECK_DEFAULT_TIMEOUT_MS, d as AUTOMATION_PRECHECK_MAX_TIMEOUT_MS, ax as AUTOMATION_CLAIM_MAX_RUNS, ay as AUTOMATION_DAEMON_CAPABILITY_PRECHECK, az as AUTOMATION_DEFAULT_LEASE_MS, i as isAutomationRunTerminal, D as resolveLaunchAgentProfile, aA as ISSUE_SENT_FROM, aB as ISSUE_DISPATCH_LOCAL_ID_PREFIX, f as ISSUE_ASSIGNABLE_AGENTS, aC as HARNESS_INSTALL_CAPABILITY_VERSION } from './index-DWk-WTU-.mjs';
26
26
  import fastify from 'fastify';
27
27
  import { z } from 'zod';
@@ -30,37 +30,37 @@ import { d as decodeBase64, s as sameRelay, e as encodeBase64, h as decrypt } fr
30
30
  import { randomBytes, createHash, timingSafeEqual, randomUUID } from 'node:crypto';
31
31
  import { c as checkPreviewPath } from './previewPath-CXN4Vag0.mjs';
32
32
  import { a as BACKGROUND_TASKS_MAX, d as BACKGROUND_TASK_DESCRIPTION_MAX, e as BackgroundTaskTracker } from './backgroundTaskActivity-8PdPxrvy.mjs';
33
- import { b as sanitizeRateLimitReport } from './rateLimitWindows-CVS-btq-.mjs';
34
- import { f as formatEditConflictNotice, b as SESSION_PEER_SENT_FROM, s as sendPeerMessage, l as listPeerSessions, C as CLI_PEER_SENDER_ID } from './peerTools-ZJzoM48N.mjs';
33
+ import { b as sanitizeRateLimitReport } from './rateLimitWindows-BrCPAQCV.mjs';
34
+ import { f as formatEditConflictNotice, b as SESSION_PEER_SENT_FROM, s as sendPeerMessage, l as listPeerSessions, C as CLI_PEER_SENDER_ID } from './peerTools-D66WcwUZ.mjs';
35
35
  import os$1, { hostname, homedir, tmpdir } from 'node:os';
36
- import { c as RemoteCallBudget, e as REMOTE_WRITE_CALLS_PER_MINUTE, d as deliverToSession, g as guardRemoteSessionOpsRequest, h as remoteError, i as REMOTE_OP_DEADLINE_MS, j as formatRemoteAuditLine, k as REMOTE_SEND_COMMIT_DEADLINE_MS, m as REMOTE_RESUME_WAIT_MS, n as capRemoteTranscript, o as capRemoteText, p as REMOTE_ANSWER_MAX_BYTES, q as REMOTE_TITLE_MAX_BYTES } from './remoteSessionClient-CLuxs0_y.mjs';
37
- import { assistantHome, bootstrapAssistantHome } from './bootstrap-Dn_VvHSt.mjs';
38
- import { refreshAgentHomes, locateClaudeConversation, agentHomeSpawnEnv } from './index-DCvq8Cfw.mjs';
36
+ import { c as RemoteCallBudget, e as REMOTE_WRITE_CALLS_PER_MINUTE, d as deliverToSession, g as guardRemoteSessionOpsRequest, h as remoteError, i as REMOTE_OP_DEADLINE_MS, j as formatRemoteAuditLine, k as REMOTE_SEND_COMMIT_DEADLINE_MS, m as REMOTE_RESUME_WAIT_MS, n as capRemoteTranscript, o as capRemoteText, p as REMOTE_ANSWER_MAX_BYTES, q as REMOTE_TITLE_MAX_BYTES } from './remoteSessionClient-iIWEgwCP.mjs';
37
+ import { assistantHome, bootstrapAssistantHome } from './bootstrap-BCuF4Kla.mjs';
38
+ import { refreshAgentHomes, locateClaudeConversation, agentHomeSpawnEnv } from './index-C2PX_W49.mjs';
39
39
  import require$$0, { existsSync as existsSync$1, statSync as statSync$1, mkdtempSync, rmSync } from 'fs';
40
40
  import require$$1, { join as join$1 } from 'path';
41
41
  import { spawn as spawn$1, execFile, spawnSync } from 'node:child_process';
42
42
  import { p as projectPath } from './projectPath-BTBIMB57.mjs';
43
43
  import { d as daemonEndpointsMatch, r as resolveClaudeCredentialReadiness } from './doctorReadiness-C208SMN9.mjs';
44
- import { o as ownerRetryPending, c as consumeOwnerRetry, s as spawnGate, a as afterStartupFailure, b as startupFailureMessage, T as TEAM_SPAWN_MAX_ATTEMPTS, d as TEAM_CLEANUP_RETRY_MS, g as getInitialMachineMetadata, e as getStartupCliAvailability, f as TEAM_RETRY_CAPABILITY_VERSION, w as withRunningCliFacts } from './machineMetadata-DTlMMhj_.mjs';
44
+ import { o as ownerRetryPending, c as consumeOwnerRetry, s as spawnGate, a as afterStartupFailure, b as startupFailureMessage, T as TEAM_SPAWN_MAX_ATTEMPTS, d as TEAM_CLEANUP_RETRY_MS, g as getInitialMachineMetadata, e as getStartupCliAvailability, f as TEAM_RETRY_CAPABILITY_VERSION, w as withRunningCliFacts } from './machineMetadata-8PjdzhIk.mjs';
45
45
  import { M as ModelConfigError, B as BackupStore, r as readConfigFile, s as sha256, a as atomicWriteFile } from './fileStore-5qpetZS0.mjs';
46
46
  import { c as collectSecretValues, a as parseJsonObject, b as childObject, s as setOrDelete, d as changedPaths, e as stringifyLike, f as fail, n as normalizeModelList, g as normalizeModelId, h as normalizeSecret, i as normalizeBaseUrl, u as uniq, j as baseUrlWarnings, m as maskSecret, k as getPath$1, l as normalizeProviderId, o as piAdapter, r as redactText } from './pi-CqyoZMjI.mjs';
47
47
  import { p as parse } from './codexAccount-BPQ-lPhH.mjs';
48
48
  import require$$3 from 'crypto';
49
49
  import { c as commandOnPath } from './detectCLI-CSGMlV51.mjs';
50
- import { buildResumeLaunch } from './handleResumeCommand-DziiqogX.mjs';
50
+ import { buildResumeLaunch } from './handleResumeCommand-CTT8lfhV.mjs';
51
51
  import { n as normalizeWebPanels } from './webPanels-B2_C2-3g.mjs';
52
52
  import { access, symlink, readFile, rm, unlink, readlink, lstat, constants, rename, mkdir, copyFile, readdir, stat, open } from 'node:fs/promises';
53
53
  import { p as parseExactVersion, c as compareExactVersions, f as fetchCliUpdateState, r as resolveCliUpdateCheckInterval, D as DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS } from './cliUpdate-Y34VGe9Y.mjs';
54
- import { P as ProjectsUnsupportedError, c as createProjectsClient } from './client-BxtaglBR.mjs';
55
- import { u as uncheckedWrapperStatus, d as wrapperReportsIdle, f as decideAutoRestart, s as statusFromVerdict, g as autoRestartNextCheck, h as wrapperStaleness, r as recordAttempt, i as AUTO_RESTART_MAX_ATTEMPTS, j as AUTO_RESTART_MIN_GAP_MS, p as processIdentityFields, k as readSessionLock, l as AUTO_RESTARTED_ENV, n as encodeAutoRestarted, o as pendingUpgradeVersion, q as resolveCheckInGraceMs, v as resolveQuietMs, x as AUTO_RESTART_RECHECK_CAP_MS } from './sessionLock-BMtAQ4bW.mjs';
56
- import { c as createAutomationsClient, i as isAutomationsUnavailable, d as AutomationsRequestError } from './client-CvLm25Wq.mjs';
54
+ import { P as ProjectsUnsupportedError, c as createProjectsClient } from './client-DizbJlbC.mjs';
55
+ import { u as uncheckedWrapperStatus, d as wrapperReportsIdle, f as decideAutoRestart, s as statusFromVerdict, g as autoRestartNextCheck, h as wrapperStaleness, r as recordAttempt, i as AUTO_RESTART_MAX_ATTEMPTS, j as AUTO_RESTART_MIN_GAP_MS, p as processIdentityFields, k as readSessionLock, l as restartIdleRefusal, n as AUTO_RESTARTED_ENV, o as encodeAutoRestarted, q as pendingUpgradeVersion, v as resolveCheckInGraceMs, x as resolveQuietMs, y as AUTO_RESTART_RECHECK_CAP_MS } from './sessionLock-Cg33c_Um.mjs';
56
+ import { c as createAutomationsClient, i as isAutomationsUnavailable, d as AutomationsRequestError } from './client-ztj20uaj.mjs';
57
57
  import { w as withKeychainOffPath, a as keychainIdentityFor, i as interpretSecurityRead, s as securityReadArgs, b as securityDeleteArgs, c as keychainOffShimDir, d as interpretCredentialsFile, C as CREDENTIALS_REJECTED_DETAIL, e as buildClaudeAuthState, f as claudeAuthStateChanged, r as resolveSdkClaudeBinary, g as classifyAuthStatus, h as diagnoseStores, p as parseLaunchctlPid, H as HAPPY_DAEMON_LAUNCHD_LABEL, j as classifyLineage, l as probeLaunchdJob, m as detectDaemonSupervisor, n as daemonLineage, o as probeSystemdKillMode, q as wrappersSurviveHandover, t as handoverWaitsForSessions } from './daemonSupervisor-BxohggqN.mjs';
58
58
  import { A as AccountService } from './accountService-CqrWNH8K.mjs';
59
59
  import { spawnSetupTokenPty, watchAccountFiles } from './daemonAccounts-BtkmoJmC.mjs';
60
60
  import { g as getProjectPath } from './path-D2wdaNSk.mjs';
61
61
  import { b as extractClaudeEditPaths } from './editPaths-BVfS_FFL.mjs';
62
- import { s as startFileWatcher } from './startFileWatcher-GF4BNFA1.mjs';
63
- import { I as InvalidateSync } from './sync-Co0wRhGu.mjs';
62
+ import { s as startFileWatcher } from './startFileWatcher-DJ_IPi0y.mjs';
63
+ import { I as InvalidateSync } from './sync-COxP1DF-.mjs';
64
64
  import { R as RawJSONLinesSchema } from './types-CkqAACXx.mjs';
65
65
  import { t as tmuxArgs, a as scrubTmuxClientEnv, s as shellescape } from './tmuxSocket-BmZyixRM.mjs';
66
66
  import { i as isProcessAlive, t as terminateProcessTree } from './processTermination-ChJG5SLW.mjs';
@@ -68,31 +68,31 @@ import { findAllHappyProcesses } from './doctor-GN5mPOn5.mjs';
68
68
  import { T as TEAM_SKILL, a as TEAM_LEAD_PLAYBOOK, b as TEAM_MEMBER_RULES } from './resources-CLP_MpK4.mjs';
69
69
  import { promisify } from 'node:util';
70
70
  import { b as clipText, r as renderAction, c as clipAutomationReport, e as renderTemplate } from './template-D8fzlO58.mjs';
71
- import { I as IssuesUnsupportedError, a as IssueRequestError, c as createIssuesClient } from './client-m-K1b6Qa.mjs';
71
+ import { I as IssuesUnsupportedError, a as IssueRequestError, c as createIssuesClient } from './client-5ekzs8hv.mjs';
72
72
  import { d as describeAgentHome } from './loginShellEnv-Dw8M7tkI.mjs';
73
73
  import { S as SPAWN_ACCOUNT_ENV } from './store-Fge1h9wy.mjs';
74
- import './acpSessionResume-DvDKsJTV.mjs';
74
+ import './acpSessionResume-D1v1ZqjL.mjs';
75
75
  import './prompt-QHuFx9j6.mjs';
76
- import './pushNotifications-DD9Z0CoN.mjs';
76
+ import './pushNotifications-CrN3Ja_a.mjs';
77
77
  import './contentLogMetadata-BlWI0egu.mjs';
78
- import './reconnectGate-m81ySKhh.mjs';
78
+ import './reconnectGate-BbxwTsar.mjs';
79
79
  import 'node:events';
80
80
  import 'socket.io-client';
81
81
  import './limits-DIo7rEBR.mjs';
82
- import './time-Cn0mV-di.mjs';
83
- import './registerCommonHandlers-CqLHkmG2.mjs';
82
+ import './time-BHGz6WMO.mjs';
83
+ import './registerCommonHandlers-Dd5Ld0CL.mjs';
84
84
  import 'util';
85
85
  import 'cross-spawn';
86
86
  import '@paralleldrive/cuid2';
87
87
  import 'chalk';
88
88
  import 'node:module';
89
89
  import 'tweetnacl';
90
- import './browser-C4wWGXH7.mjs';
90
+ import './browser-C-PWxfCE.mjs';
91
91
  import 'open';
92
92
  import './specialCommands-MXUN0wfI.mjs';
93
93
  import './ids-DU6sLx4C.mjs';
94
94
  import 'url';
95
- import './localHappyAgentAuth-DgLh3xzW.mjs';
95
+ import './localHappyAgentAuth-B2bOV9RF.mjs';
96
96
  import './claudeAccountEnv-C6Wl-ZbT.mjs';
97
97
  import 'node:readline';
98
98
  import 'node-pty';
@@ -4624,7 +4624,8 @@ function createHarnessInstaller(deps) {
4624
4624
  return {
4625
4625
  /** True while npm may be writing the prefix — including after an unconfirmed kill. */
4626
4626
  isRunning: () => running !== null || blocked,
4627
- async request(params) {
4627
+ /** `requester` is only for the log: the machine page (owner) or B-894's agent auto-update. */
4628
+ async request(params, requester = "owner") {
4628
4629
  const harness = params && typeof params === "object" ? params.harness : void 0;
4629
4630
  if (!isHarnessInstallId(harness)) {
4630
4631
  deps.log(`[HARNESS] refused install request for an unknown harness`);
@@ -4646,7 +4647,7 @@ function createHarnessInstaller(deps) {
4646
4647
  return location;
4647
4648
  }
4648
4649
  const startedAt = now();
4649
- deps.log(`[HARNESS] owner requested ${harness} install`);
4650
+ deps.log(`[HARNESS] ${requester === "auto-update" ? "agent auto-update" : "owner"} requested ${harness} install`);
4650
4651
  deps.publish({ harness, state: "installing", startedAt, at: startedAt });
4651
4652
  void run(harness, location.prefix, startedAt);
4652
4653
  return { accepted: true, harness };
@@ -4654,6 +4655,197 @@ function createHarnessInstaller(deps) {
4654
4655
  };
4655
4656
  }
4656
4657
 
4658
+ const AGENT_AUTO_UPDATE_HARNESSES = ["codex"];
4659
+ const AGENT_AUTO_UPDATE_MAX_ATTEMPTS = 2;
4660
+ const AGENT_AUTO_UPDATE_BACKOFF_MS = 30 * 60 * 1e3;
4661
+ const AGENT_AUTO_UPDATE_SNAPSHOT_MAX_AGE_MS = 12 * 60 * 60 * 1e3;
4662
+ const TRANSIENT_REFUSALS = /* @__PURE__ */ new Set(["install_in_progress", "cli_update_in_progress"]);
4663
+ function decideAgentAutoUpdate(input) {
4664
+ const { harness } = input;
4665
+ if (!input.enabled) return { action: "skip", harness, reason: "disabled" };
4666
+ const versions = input.versions;
4667
+ if (!versions || input.now - versions.checkedAt > AGENT_AUTO_UPDATE_SNAPSHOT_MAX_AGE_MS) return { action: "skip", harness, reason: "no-versions" };
4668
+ const agent = versions.agents.find((a) => a.id === harness);
4669
+ if (!agent || agent.status !== "update-available" || !agent.latest) return { action: "skip", harness, reason: "current" };
4670
+ const target = agent.latest;
4671
+ const attempt = input.attempt?.target === target ? input.attempt : void 0;
4672
+ if (attempt?.succeeded) return { action: "skip", harness, reason: "still-outdated", target };
4673
+ if (attempt && attempt.attempts >= AGENT_AUTO_UPDATE_MAX_ATTEMPTS) return { action: "skip", harness, reason: "gave-up", target };
4674
+ if (attempt && input.now - attempt.lastAt < AGENT_AUTO_UPDATE_BACKOFF_MS) return { action: "skip", harness, reason: "backoff", target };
4675
+ if (input.turnActive) return { action: "skip", harness, reason: "turn-active", target };
4676
+ if (input.installerBusy) return { action: "skip", harness, reason: "installer-busy", target };
4677
+ return { action: "install", harness, from: agent.installed, target };
4678
+ }
4679
+ function createAgentAutoUpdater(deps) {
4680
+ const now = deps.now ?? Date.now;
4681
+ const loaded = deps.store?.read() ?? { attempts: {}, statuses: {} };
4682
+ const attempts = new Map(
4683
+ Object.entries(loaded.attempts).map(([harness, attempt]) => [harness, attempt])
4684
+ );
4685
+ const statuses = { ...loaded.statuses };
4686
+ const save = () => {
4687
+ try {
4688
+ deps.store?.write({ attempts: Object.fromEntries(attempts), statuses: { ...statuses } });
4689
+ } catch (error) {
4690
+ deps.log(`[AGENT AUTO-UPDATE] could not save state: ${String(error)}`);
4691
+ }
4692
+ };
4693
+ for (const status of Object.values(statuses)) {
4694
+ if (status.state !== "installing") continue;
4695
+ const attempt = attempts.get(status.harness);
4696
+ if (attempt?.target === status.target) attempt.detail = "interrupted_by_daemon_restart";
4697
+ statuses[status.harness] = {
4698
+ ...status,
4699
+ state: status.attempts >= AGENT_AUTO_UPDATE_MAX_ATTEMPTS ? "gave-up" : "failed",
4700
+ detail: "interrupted_by_daemon_restart"
4701
+ };
4702
+ }
4703
+ if (Object.keys(statuses).length > 0) {
4704
+ save();
4705
+ deps.publish({ ...statuses });
4706
+ }
4707
+ let pending = null;
4708
+ let ticking = false;
4709
+ const setStatus = (status) => {
4710
+ statuses[status.harness] = status;
4711
+ save();
4712
+ deps.publish({ ...statuses });
4713
+ };
4714
+ const fail = (harness, target, detail) => {
4715
+ const attempt = attempts.get(harness);
4716
+ attempt.detail = detail;
4717
+ const gaveUp = attempt.attempts >= AGENT_AUTO_UPDATE_MAX_ATTEMPTS;
4718
+ deps.log(`[AGENT AUTO-UPDATE] ${harness} \u2192 ${target} failed (attempt ${attempt.attempts}): ${detail}${gaveUp ? "; giving up on this version" : ""}`);
4719
+ setStatus({ harness, target, state: gaveUp ? "gave-up" : "failed", detail, attempts: attempt.attempts, at: now() });
4720
+ };
4721
+ async function tick() {
4722
+ if (ticking || pending) return;
4723
+ ticking = true;
4724
+ try {
4725
+ for (const harness of AGENT_AUTO_UPDATE_HARNESSES) {
4726
+ const decision = decideAgentAutoUpdate({
4727
+ harness,
4728
+ enabled: deps.enabled(),
4729
+ versions: deps.versions(),
4730
+ turnActive: deps.turnActive(harness),
4731
+ installerBusy: deps.installerBusy(),
4732
+ attempt: attempts.get(harness),
4733
+ now: now()
4734
+ });
4735
+ if (decision.action !== "install") {
4736
+ const status = statuses[harness];
4737
+ if (decision.reason === "still-outdated" && status?.state === "installed" && status.target === decision.target) {
4738
+ const attempt2 = attempts.get(harness);
4739
+ attempt2.attempts = AGENT_AUTO_UPDATE_MAX_ATTEMPTS;
4740
+ fail(harness, decision.target, "still_outdated_after_install");
4741
+ }
4742
+ continue;
4743
+ }
4744
+ const prior = attempts.get(harness);
4745
+ const attempt = prior?.target === decision.target ? { ...prior, attempts: prior.attempts + 1, lastAt: now() } : { target: decision.target, attempts: 1, lastAt: now() };
4746
+ attempts.set(harness, attempt);
4747
+ deps.log(`[AGENT AUTO-UPDATE] ${harness} ${decision.from ?? "?"} \u2192 ${decision.target} (attempt ${attempt.attempts})`);
4748
+ pending = { harness, target: decision.target };
4749
+ setStatus({ harness, target: decision.target, state: "installing", attempts: attempt.attempts, at: now() });
4750
+ const result = await deps.request(harness).catch((error) => ({ error: `request_failed: ${String(error)}` }));
4751
+ if ("accepted" in result) return;
4752
+ pending = null;
4753
+ if (TRANSIENT_REFUSALS.has(result.error)) {
4754
+ if (prior?.target === decision.target) attempts.set(harness, prior);
4755
+ else attempts.delete(harness);
4756
+ const before = statuses[harness];
4757
+ delete statuses[harness];
4758
+ save();
4759
+ if (before) deps.publish({ ...statuses });
4760
+ continue;
4761
+ }
4762
+ fail(harness, decision.target, result.error);
4763
+ }
4764
+ } finally {
4765
+ ticking = false;
4766
+ }
4767
+ }
4768
+ function onInstallState(state) {
4769
+ if (!pending || state.harness !== pending.harness || state.state === "installing") return;
4770
+ const { harness, target } = pending;
4771
+ pending = null;
4772
+ const attempt = attempts.get(harness);
4773
+ if (!attempt) return;
4774
+ if (state.state === "installed") {
4775
+ attempt.succeeded = true;
4776
+ deps.log(`[AGENT AUTO-UPDATE] ${harness} \u2192 ${target} installed`);
4777
+ setStatus({ harness, target, state: "installed", attempts: attempt.attempts, at: now() });
4778
+ } else {
4779
+ fail(harness, target, state.detail ?? "unknown");
4780
+ }
4781
+ }
4782
+ return { tick, onInstallState, statuses: () => ({ ...statuses }) };
4783
+ }
4784
+ const AGENT_AUTO_UPDATE_TICK_MS = 5 * 60 * 1e3;
4785
+ function resolveAgentAutoUpdateTickMs(raw) {
4786
+ const value = raw === void 0 ? NaN : Number(raw);
4787
+ return Number.isFinite(value) && value >= 1e3 ? value : AGENT_AUTO_UPDATE_TICK_MS;
4788
+ }
4789
+
4790
+ const STATES = /* @__PURE__ */ new Set(["installing", "installed", "failed", "gave-up"]);
4791
+ const isCount = (v) => typeof v === "number" && Number.isFinite(v) && v >= 0;
4792
+ function parseAttempt(raw) {
4793
+ if (!raw || typeof raw !== "object") return null;
4794
+ const { target, attempts, lastAt, succeeded, detail } = raw;
4795
+ if (typeof target !== "string" || !target || !isCount(attempts) || !isCount(lastAt)) return null;
4796
+ return {
4797
+ target,
4798
+ attempts,
4799
+ lastAt,
4800
+ ...succeeded === true ? { succeeded: true } : {},
4801
+ ...typeof detail === "string" ? { detail } : {}
4802
+ };
4803
+ }
4804
+ function parseStatus(harness, raw) {
4805
+ if (!raw || typeof raw !== "object") return null;
4806
+ const { target, state, detail, attempts, at } = raw;
4807
+ if (typeof target !== "string" || !target || typeof state !== "string" || !STATES.has(state) || !isCount(attempts) || !isCount(at)) return null;
4808
+ return {
4809
+ harness,
4810
+ target,
4811
+ state,
4812
+ attempts,
4813
+ at,
4814
+ ...typeof detail === "string" ? { detail } : {}
4815
+ };
4816
+ }
4817
+ function parseAgentAutoUpdatePersisted(raw) {
4818
+ const out = { attempts: {}, statuses: {} };
4819
+ if (!raw || typeof raw !== "object") return out;
4820
+ const { attempts, statuses } = raw;
4821
+ for (const [harness, value] of Object.entries(attempts && typeof attempts === "object" ? attempts : {})) {
4822
+ const attempt = parseAttempt(value);
4823
+ if (attempt) out.attempts[harness] = attempt;
4824
+ }
4825
+ for (const [harness, value] of Object.entries(statuses && typeof statuses === "object" ? statuses : {})) {
4826
+ const status = parseStatus(harness, value);
4827
+ if (status) out.statuses[harness] = status;
4828
+ }
4829
+ return out;
4830
+ }
4831
+ function agentAutoUpdateStore(homeDir) {
4832
+ const file = join(homeDir, "agent-auto-update.json");
4833
+ return {
4834
+ read() {
4835
+ try {
4836
+ return parseAgentAutoUpdatePersisted(JSON.parse(readFileSync(file, "utf8")));
4837
+ } catch {
4838
+ return { attempts: {}, statuses: {} };
4839
+ }
4840
+ },
4841
+ write(state) {
4842
+ const tmp = `${file}.${process.pid}.tmp`;
4843
+ writeFileSync(tmp, JSON.stringify(state), { mode: 384 });
4844
+ renameSync(tmp, file);
4845
+ }
4846
+ };
4847
+ }
4848
+
4657
4849
  function buildPresenceBatch(live, previous) {
4658
4850
  const current = new Set(live.map((s) => s.sessionId));
4659
4851
  const sessions = live.slice(0, 200).map((s) => ({
@@ -7710,6 +7902,7 @@ async function startDaemon() {
7710
7902
  let claudeCredentialStoreSetting = (await readSettings()).claudeCredentialStore === "file" ? "file" : "auto";
7711
7903
  let agentHibernationSetting = (await readSettings()).agentHibernationIdleMs;
7712
7904
  let autoRestartSetting = (await readSettings()).autoRestartSessions !== false;
7905
+ let agentAutoUpdateSetting = (await readSettings()).agentAutoUpdate === true;
7713
7906
  try {
7714
7907
  const homes = await refreshAgentHomes();
7715
7908
  logger.debug(`[DAEMON RUN] Claude config dir: ${describeAgentHome(homes.claudeConfigDir)}; Codex home: ${describeAgentHome(homes.codexHome)}`);
@@ -8410,6 +8603,7 @@ async function startDaemon() {
8410
8603
  }
8411
8604
  return sessionIdToFinishedSession.get(happySessionId);
8412
8605
  };
8606
+ const trackedSessionFlavor = (happySessionId) => findTrackedSessionById(happySessionId)?.happySessionMetadataFromLocalWebhook?.flavor ?? "claude";
8413
8607
  const persistRestoreRecord = (happySessionId, fallback, metadata) => {
8414
8608
  const candidates = [...pidToTrackedSession.values()].filter((s) => s.happySessionId === happySessionId && isPidAlive(s.pid));
8415
8609
  const live = candidates.find((s) => s.childProcess) ?? candidates[0];
@@ -8645,6 +8839,16 @@ async function startDaemon() {
8645
8839
  };
8646
8840
  const restartSessionImpl = async (happySessionId, options) => {
8647
8841
  try {
8842
+ if (options?.ifIdle) {
8843
+ const busy = restartIdleRefusal({
8844
+ turnActive: turnActivity.activeSessions().includes(happySessionId),
8845
+ backgroundTasks: backgroundTasks.count(happySessionId)
8846
+ });
8847
+ if (busy) {
8848
+ logger.debug(`[DAEMON RUN] restart-session ${happySessionId} refused (ifIdle): ${busy}`);
8849
+ return { type: "error", errorMessage: `busy:${busy}` };
8850
+ }
8851
+ }
8648
8852
  const counts = options?.account ? accountRestartCounts : restartCounts;
8649
8853
  const prior = counts.get(happySessionId) ?? 0;
8650
8854
  const decision = options?.auto ? { allowed: true } : decideRestart(prior, options?.account ? DEFAULT_MAX_ACCOUNT_RESTARTS : DEFAULT_MAX_RESTARTS);
@@ -9133,6 +9337,13 @@ async function startDaemon() {
9133
9337
  return autoRestartSetting;
9134
9338
  });
9135
9339
  setTimeout(() => autoRestartScheduler.sweep(), 5e3).unref?.();
9340
+ let agentAutoUpdater = null;
9341
+ apiMachine.setAgentAutoUpdateHandlers(agentAutoUpdateSetting, async (enabled) => {
9342
+ await updateSettings((current) => ({ ...current, agentAutoUpdate: enabled }));
9343
+ agentAutoUpdateSetting = enabled;
9344
+ void agentAutoUpdater?.tick();
9345
+ return agentAutoUpdateSetting;
9346
+ });
9136
9347
  const accountService = new AccountService({
9137
9348
  home: configuration.happyHomeDir,
9138
9349
  env: process.env,
@@ -9272,7 +9483,9 @@ async function startDaemon() {
9272
9483
  const stopAgentVersionChecks = startAgentVersionChecks(
9273
9484
  (snapshot) => {
9274
9485
  latestAgentVersions = snapshot;
9275
- return apiMachine.updateDaemonState((state) => ({ ...state, status: state?.status ?? "running", agentVersions: snapshot }));
9486
+ return apiMachine.updateDaemonState((state) => ({ ...state, status: state?.status ?? "running", agentVersions: snapshot })).finally(() => {
9487
+ void agentAutoUpdater?.tick();
9488
+ });
9276
9489
  },
9277
9490
  (error) => logger.debug("[DAEMON RUN] Agent version check failed", error)
9278
9491
  );
@@ -9282,6 +9495,7 @@ async function startDaemon() {
9282
9495
  commandOnPath,
9283
9496
  cliUpdateBusy: () => updateController.isRunning() || handoverInFlight,
9284
9497
  publish: (state) => {
9498
+ agentAutoUpdater?.onInstallState(state);
9285
9499
  void apiMachine.updateDaemonState((current) => ({ ...current, status: current?.status ?? "running", harnessInstall: state })).catch((error) => logger.debug("[DAEMON RUN] harness install state publish failed", error));
9286
9500
  },
9287
9501
  afterInstall: async () => {
@@ -9291,6 +9505,22 @@ async function startDaemon() {
9291
9505
  log: (message) => logger.warn(`[DAEMON RUN] ${message}`)
9292
9506
  });
9293
9507
  apiMachine.setHarnessInstallHandler((params) => harnessInstaller.request(params));
9508
+ agentAutoUpdater = createAgentAutoUpdater({
9509
+ enabled: () => agentAutoUpdateSetting,
9510
+ versions: () => latestAgentVersions,
9511
+ turnActive: (harness) => turnActivity.activeSessions().some((id) => trackedSessionFlavor(id) === harness),
9512
+ installerBusy: () => !!harnessInstaller?.isRunning() || updateController.isRunning() || handoverInFlight,
9513
+ request: (harness) => harnessInstaller.request({ harness }, "auto-update"),
9514
+ publish: (status) => {
9515
+ void apiMachine.setAgentAutoUpdateStatus(status);
9516
+ },
9517
+ log: (message) => logger.warn(`[DAEMON RUN] ${message}`),
9518
+ store: agentAutoUpdateStore(configuration.happyHomeDir)
9519
+ });
9520
+ const agentAutoUpdateInterval = setInterval(() => {
9521
+ void agentAutoUpdater?.tick();
9522
+ }, resolveAgentAutoUpdateTickMs(process.env.HAPPY_AGENT_AUTO_UPDATE_TICK_MS));
9523
+ agentAutoUpdateInterval.unref?.();
9294
9524
  const heartbeatIntervalMs = parseInt(process.env.HAPPY_DAEMON_HEARTBEAT_INTERVAL || "60000");
9295
9525
  const wakeDetector = createWakeDetector(heartbeatIntervalMs);
9296
9526
  const restartOnStaleVersionAndHeartbeat = setInterval(serialTask(async () => {
@@ -9340,6 +9570,7 @@ async function startDaemon() {
9340
9570
  projectPresence?.stop();
9341
9571
  clearInterval(restartOnStaleVersionAndHeartbeat);
9342
9572
  clearInterval(cliUpdateInterval);
9573
+ clearInterval(agentAutoUpdateInterval);
9343
9574
  policyAnnouncements.stop();
9344
9575
  policyRefresh.stop();
9345
9576
  stopAgentVersionChecks();
@@ -9481,6 +9712,7 @@ async function startDaemon() {
9481
9712
  logger.debug("[DAEMON RUN] Health check interval cleared");
9482
9713
  }
9483
9714
  clearInterval(cliUpdateInterval);
9715
+ clearInterval(agentAutoUpdateInterval);
9484
9716
  clearInterval(autoRestartSweep);
9485
9717
  policyAnnouncements.stop();
9486
9718
  policyRefresh.stop();
@@ -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-BRaWaYhl.cjs');
5
+ var persistence = require('./persistence-_HpJ8Xqx.cjs');
6
+ var startupSessionCreate = require('./startupSessionCreate-Cjl3wk3-.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-B-u-Mk6V.cjs');
9
+ var logger = require('./logger-B_GiBdoD.cjs');
10
+ var createSessionMetadata = require('./createSessionMetadata-83WjQzAt.cjs');
11
+ var _package = require('./package-DTEEvw5V.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-Da2jFKHx.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-Dlait4BW.cjs');
19
+ var machineMetadata = require('./machineMetadata-rjOkg7or.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-BvGKA5QH.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-DzWubbyC.cjs');
38
38
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
39
- require('./reconnectGate-BkSaZdIx.cjs');
39
+ require('./reconnectGate-DBf3oDWw.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-COyPPTSV.cjs');
46
+ require('./registerCommonHandlers-DJcGS4eV.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-BqlAL8Iu.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-BtDypYZb.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-BrS568YD.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-Cq_W1C3z.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-TVtTBsHi.cjs'); });
223
223
  const { createSessionScanner: createSessionScanner2 } = await loadDeps();
224
224
  const reconnection = api.startOfflineReconnection({
225
225
  serverUrl: configuration.configuration.serverUrl,