very-happy-cli 0.2.206 → 0.2.208

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 (195) hide show
  1. package/dist/{AcpBackend-dO5GAvaj.cjs → AcpBackend-Bi1lwlYT.cjs} +3 -3
  2. package/dist/{AcpBackend-CfTTWCK_.mjs → AcpBackend-DzhaCmBY.mjs} +3 -3
  3. package/dist/{AcpSessionManager-DpT9znny.cjs → AcpSessionManager-CMVLdPbj.cjs} +1 -1
  4. package/dist/{AcpSessionManager-a-A4YDP7.mjs → AcpSessionManager-DkaQ_APH.mjs} +1 -1
  5. package/dist/{BasePermissionHandler-C917oi-W.cjs → BasePermissionHandler-CvLAw0Oc.cjs} +1 -1
  6. package/dist/{BasePermissionHandler-Cg2py7Mi.mjs → BasePermissionHandler-pWG2_iEy.mjs} +1 -1
  7. package/dist/{account-BpEOGAi-.cjs → account-CPqnFWmL.cjs} +5 -5
  8. package/dist/{account-CY_3dfMO.mjs → account-CdqfSY_p.mjs} +5 -5
  9. package/dist/{acpSessionResume-D1v1ZqjL.mjs → acpSessionResume-BhITqLyG.mjs} +1 -1
  10. package/dist/{acpSessionResume-BTchDv4R.cjs → acpSessionResume-CJkt6Lb3.cjs} +1 -1
  11. package/dist/{agentHome-B8Fp21kp.cjs → agentHome-DNBlAPo7.cjs} +4 -4
  12. package/dist/{agentHome-Bb0sGzgt.mjs → agentHome-s35ZR8h2.mjs} +4 -4
  13. package/dist/{api-DGJVcaIF.mjs → api-CSqHDB2c.mjs} +9 -9
  14. package/dist/{api-B-u-Mk6V.cjs → api-DD2Kb6PC.cjs} +9 -9
  15. package/dist/{apiMachine-Bi15f6YB.cjs → apiMachine-B120yCAC.cjs} +111 -18
  16. package/dist/{apiMachine-B-GyYD22.mjs → apiMachine-glpowPBP.mjs} +112 -19
  17. package/dist/{attachmentContent-BvGKA5QH.cjs → attachmentContent-DaAXfnD3.cjs} +2 -2
  18. package/dist/{attachmentContent-C-qFMirp.mjs → attachmentContent-Dz1Klp7p.mjs} +2 -2
  19. package/dist/{auth-CT2084Ag.cjs → auth-CsFFmyP7.cjs} +8 -8
  20. package/dist/{auth-CP7a7YqH.mjs → auth-D20iF90G.mjs} +5 -5
  21. package/dist/{auth-FRjFFR7K.mjs → auth-DGORGC8x.mjs} +8 -8
  22. package/dist/{auth-Bnj_x4XN.cjs → auth-r1hltcyI.cjs} +5 -5
  23. package/dist/{auto-DaADkeaT.cjs → auto-Ciz46Iqn.cjs} +14 -14
  24. package/dist/{auto-CxItjek7.mjs → auto-DbrbFKf9.mjs} +15 -15
  25. package/dist/{bootstrap-BCuF4Kla.mjs → bootstrap-BNtlEESB.mjs} +2 -2
  26. package/dist/{bootstrap-Cq_W1C3z.cjs → bootstrap-W09l0EHC.cjs} +2 -2
  27. package/dist/{browser-C-PWxfCE.mjs → browser-C9mNP2Jk.mjs} +1 -1
  28. package/dist/{browser-CHC75A5J.cjs → browser-dRvYvuKK.cjs} +1 -1
  29. package/dist/{claudeLocal-XsMte9X2.mjs → claudeLocal-DReeJSNX.mjs} +5 -5
  30. package/dist/{claudeLocal-TVtTBsHi.cjs → claudeLocal-pk26w0aA.cjs} +4 -4
  31. package/dist/{claudeLocalLauncher-DDU1kyxO.mjs → claudeLocalLauncher-BXg1eVkk.mjs} +10 -10
  32. package/dist/{claudeLocalLauncher-D5XU298r.cjs → claudeLocalLauncher-ENxo2qLu.cjs} +9 -9
  33. package/dist/{claudeSessionFork-CZpugNK3.mjs → claudeSessionFork-BJgKcXCZ.mjs} +1 -1
  34. package/dist/{claudeSessionFork-CzzRjCFN.cjs → claudeSessionFork-Dkza0l7k.cjs} +1 -1
  35. package/dist/{client-Cdax95Aw.cjs → client-B-1f7vJk.cjs} +2 -2
  36. package/dist/{client-Bqyfl2t0.mjs → client-BcJGDe88.mjs} +4 -4
  37. package/dist/{client-DizbJlbC.mjs → client-CHusuUpK.mjs} +2 -2
  38. package/dist/{client-C2F0G1gB.cjs → client-CiMpU3hu.cjs} +4 -4
  39. package/dist/{client-jlIx75iG.cjs → client-CikaTA8m.cjs} +2 -2
  40. package/dist/{client-D9viv5fT.cjs → client-CqswQ5dm.cjs} +2 -2
  41. package/dist/{client-5ekzs8hv.mjs → client-D79GAZdH.mjs} +2 -2
  42. package/dist/{client-ztj20uaj.mjs → client-DM4LAJtu.mjs} +2 -2
  43. package/dist/codex/happyMcpStdioBridge.cjs +18 -18
  44. package/dist/codex/happyMcpStdioBridge.mjs +18 -18
  45. package/dist/{codexAppServerClient-oSG91fFK.cjs → codexAppServerClient-1UQzZZVz.cjs} +107 -5
  46. package/dist/{codexAppServerClient-DFRZ__3w.mjs → codexAppServerClient-4OO0KZot.mjs} +105 -7
  47. package/dist/{codexCommand-BE__EfSf.mjs → codexCommand-DXD9hMjf.mjs} +119 -106
  48. package/dist/{codexCommand-BNjxG3C_.cjs → codexCommand-NEGUEjNu.cjs} +122 -109
  49. package/dist/{codexTermination-DuGPgcGv.mjs → codexTermination-CVq2OFB8.mjs} +1 -1
  50. package/dist/{codexTermination-_YHZVugN.cjs → codexTermination-PerhM3_A.cjs} +1 -1
  51. package/dist/{config-BH7N9kZX.cjs → config-BWInnJrU.cjs} +3 -3
  52. package/dist/{config-DXO9RUqb.mjs → config-ut95-JvJ.mjs} +3 -3
  53. package/dist/{configuration-Da2jFKHx.cjs → configuration-DjajVIcC.cjs} +1 -1
  54. package/dist/{configuration-BreL0beF.mjs → configuration-DyUL3r3_.mjs} +1 -1
  55. package/dist/{connect-B_UrNMnp.mjs → connect-BUjKAnlC.mjs} +12 -12
  56. package/dist/{connect-BIIxh5a9.cjs → connect-CsdM0x3Z.cjs} +12 -12
  57. package/dist/{context-n1LlNbjT.cjs → context-Cr3K4S2w.cjs} +1 -1
  58. package/dist/{context-DFudPCad.mjs → context-D2H9Axdp.mjs} +1 -1
  59. package/dist/{controlClient-Dlait4BW.cjs → controlClient-BpIuQ1Ns.cjs} +3 -3
  60. package/dist/{controlClient-DwiujrH8.mjs → controlClient-HuyeDWsu.mjs} +3 -3
  61. package/dist/{createSessionMetadata-83WjQzAt.cjs → createSessionMetadata-B18g5IaB.cjs} +2 -2
  62. package/dist/{createSessionMetadata-B0wB4nIY.mjs → createSessionMetadata-ysHgFXAk.mjs} +2 -2
  63. package/dist/{deterministicJson-BUtDwjAU.mjs → deterministicJson-9MtfxFkH.mjs} +14 -14
  64. package/dist/{deterministicJson-Dppskedb.cjs → deterministicJson-CjoGQVig.cjs} +14 -14
  65. package/dist/{doctor-QQS5dGqG.mjs → doctor-3F1VRGNQ.mjs} +7 -7
  66. package/dist/{doctor-BtVympkn.cjs → doctor-B5X_WgW5.cjs} +7 -7
  67. package/dist/{downloadTarget-CVm8ey3W.mjs → downloadTarget-Bphxqzlj.mjs} +6 -6
  68. package/dist/{downloadTarget-CxGQUh-7.cjs → downloadTarget-Da5r5bmz.cjs} +6 -6
  69. package/dist/{ensureDaemonRunning-CjD9jtqp.cjs → ensureDaemonRunning-B5KACtnt.cjs} +5 -5
  70. package/dist/{ensureDaemonRunning-m6Kd3BM7.mjs → ensureDaemonRunning-CfWwG5sk.mjs} +5 -5
  71. package/dist/{exitNotice-HOwYf-97.mjs → exitNotice-BhE9UKcS.mjs} +2 -2
  72. package/dist/{exitNotice-bUdz2C4L.cjs → exitNotice-DZXhuGy_.cjs} +2 -2
  73. package/dist/{format-2GqpXiRX.mjs → format-CNxQ0daG.mjs} +1 -1
  74. package/dist/{format-BXxqj69f.cjs → format-VdzxFoPn.cjs} +1 -1
  75. package/dist/{handleResumeCommand-D_NUSPvz.cjs → handleResumeCommand-CqCDmme6.cjs} +5 -5
  76. package/dist/{handleResumeCommand-CTT8lfhV.mjs → handleResumeCommand-D7_cvcc9.mjs} +5 -5
  77. package/dist/{index-TDGlRjkn.cjs → index-Bw7x7m6a.cjs} +4 -4
  78. package/dist/{index-CIWLX_eM.mjs → index-BzsL5LN5.mjs} +4 -4
  79. package/dist/{index-B2xEPLkK.cjs → index-CFCunVeQ.cjs} +40 -40
  80. package/dist/{index-BLL_KBUA.mjs → index-CNW2-T1Y.mjs} +3 -3
  81. package/dist/{index-CDO9rljT.mjs → index-CPRRUQzg.mjs} +41 -41
  82. package/dist/{index-C2PX_W49.mjs → index-CdEG8IE-.mjs} +4 -4
  83. package/dist/{index-BrvS8Bor.cjs → index-DJ8lYOQz.cjs} +4 -4
  84. package/dist/{index-CJXPB8kU.cjs → index-DY6iQHV4.cjs} +3 -3
  85. package/dist/index.cjs +2 -2
  86. package/dist/index.mjs +2 -2
  87. package/dist/{install-BaUw2G6E.cjs → install-C3VX-lFh.cjs} +3 -3
  88. package/dist/{install-DDfCEbu9.mjs → install-DXc3VEgr.mjs} +3 -3
  89. package/dist/{issue-BrxmnVRr.cjs → issue-16qqmyzu.cjs} +7 -7
  90. package/dist/{issue-Mh6p_OMm.mjs → issue-Du98oR1Q.mjs} +7 -7
  91. package/dist/lib.cjs +11 -11
  92. package/dist/lib.d.cts +8 -0
  93. package/dist/lib.d.mts +8 -0
  94. package/dist/lib.mjs +11 -11
  95. package/dist/{localHappyAgentAuth-B2bOV9RF.mjs → localHappyAgentAuth-3xKBQJOa.mjs} +1 -1
  96. package/dist/{localHappyAgentAuth-BtDypYZb.cjs → localHappyAgentAuth-B_P4c1Gm.cjs} +1 -1
  97. package/dist/{logger-DOp6YYAW.mjs → logger-B3uJyacO.mjs} +2 -2
  98. package/dist/{logger-B_GiBdoD.cjs → logger-el0cE85h.cjs} +2 -2
  99. package/dist/{machineMetadata-8PjdzhIk.mjs → machineMetadata-CO2nMt0D.mjs} +3 -3
  100. package/dist/{machineMetadata-rjOkg7or.cjs → machineMetadata-HmfiZ6TU.cjs} +3 -3
  101. package/dist/{main-Dxj1sGm3.cjs → main-Czhmne4w.cjs} +48 -48
  102. package/dist/{main-BfSuibka.mjs → main-NKVfJrjR.mjs} +48 -48
  103. package/dist/{manager-BEsI4qt3.mjs → manager-2Il8XJVq.mjs} +1 -1
  104. package/dist/{mcp-C_G7MsCo.mjs → mcp-6E6MzmHX.mjs} +15 -15
  105. package/dist/{mcp-DmRG6Yyk.cjs → mcp-Dt7Xv0aE.cjs} +15 -15
  106. package/dist/{mirrorProtocol-N8M4o7UD.mjs → mirrorProtocol-BqPADAVi.mjs} +2 -2
  107. package/dist/{mirrorProtocol-C8ZsCJzM.cjs → mirrorProtocol-D02HTC80.cjs} +2 -2
  108. package/dist/{package-CJeweE1o.mjs → package-BObPhT96.mjs} +7 -7
  109. package/dist/{package-DTEEvw5V.cjs → package-COEvA5iY.cjs} +7 -7
  110. package/dist/{panels-D9DTAY7b.cjs → panels-8gxstFem.cjs} +5 -5
  111. package/dist/{panels-BJGEusTH.mjs → panels-B8SzSCYI.mjs} +5 -5
  112. package/dist/{peerTools-Cs7_fbtQ.cjs → peerTools-BsHkjxPt.cjs} +5 -5
  113. package/dist/{peerTools-D66WcwUZ.mjs → peerTools-D0rxyRcF.mjs} +5 -5
  114. package/dist/{persistence-DURvN3Hm.mjs → persistence-Bqjt2vfj.mjs} +2 -2
  115. package/dist/{persistence-_HpJ8Xqx.cjs → persistence-Cuh7Fmqq.cjs} +2 -2
  116. package/dist/{piRunnerArgs-BqqnRbD2.cjs → piRunnerArgs-BM4IL7-Q.cjs} +1 -1
  117. package/dist/{piRunnerArgs-Q9_OZpgB.mjs → piRunnerArgs-CrRB06Q-.mjs} +1 -1
  118. package/dist/{piRuntime-DVfBZwGV.mjs → piRuntime-C5J-NcI-.mjs} +1 -1
  119. package/dist/{piRuntime-CfymNU4r.cjs → piRuntime-Cxax5MJ9.cjs} +1 -1
  120. package/dist/{piTerminal-SWzeud-Y.cjs → piTerminal-B6FmRG-j.cjs} +17 -17
  121. package/dist/{piTerminal-BmVTobWw.mjs → piTerminal-CDNQVXeX.mjs} +17 -17
  122. package/dist/{pushNotifications-DzWubbyC.cjs → pushNotifications-B-NnyAOy.cjs} +2 -2
  123. package/dist/{pushNotifications-CrN3Ja_a.mjs → pushNotifications-C4KS8SZe.mjs} +2 -2
  124. package/dist/{query-CcFiFfJ8.mjs → query-B9_vGm55.mjs} +1 -1
  125. package/dist/{query-DXKQY4gV.cjs → query-O39pVPly.cjs} +1 -1
  126. package/dist/{rateLimitWindows-BmZ6gZY8.cjs → rateLimitWindows-CnmV6sQI.cjs} +1 -1
  127. package/dist/{rateLimitWindows-BrCPAQCV.mjs → rateLimitWindows-CrWlGKPl.mjs} +1 -1
  128. package/dist/{reconnectGate-BbxwTsar.mjs → reconnectGate-4HRVraOQ.mjs} +1 -1
  129. package/dist/{reconnectGate-DBf3oDWw.cjs → reconnectGate-CetSTiP3.cjs} +1 -1
  130. package/dist/{registerCommonHandlers-DJcGS4eV.cjs → registerCommonHandlers-BQQSEBbH.cjs} +2 -2
  131. package/dist/{registerCommonHandlers-Dd5Ld0CL.mjs → registerCommonHandlers-CZJBrvGH.mjs} +2 -2
  132. package/dist/{registerKillSessionHandler-CCpSkYc2.cjs → registerKillSessionHandler-CRt4C583.cjs} +5 -5
  133. package/dist/{registerKillSessionHandler-DNLUoqKq.mjs → registerKillSessionHandler-UkuPaLm6.mjs} +5 -5
  134. package/dist/{registerSideQuestionHandler-D7zu0Z-I.cjs → registerSideQuestionHandler-ChnSNcv4.cjs} +4 -4
  135. package/dist/{registerSideQuestionHandler-_YMnEk1L.mjs → registerSideQuestionHandler-zuvmCRN8.mjs} +4 -4
  136. package/dist/{remoteSessionClient-Don4DO6r.cjs → remoteSessionClient-CLzIiMIY.cjs} +5 -5
  137. package/dist/{remoteSessionClient-iIWEgwCP.mjs → remoteSessionClient-DHuh-nj5.mjs} +5 -5
  138. package/dist/{reportProgressTool-B9DJTgdO.mjs → reportProgressTool-dSJwAO7H.mjs} +4 -4
  139. package/dist/{reportProgressTool-DwHrvFHn.cjs → reportProgressTool-ikM2aqgu.cjs} +4 -4
  140. package/dist/{run-CbsSCESl.cjs → run-9AiIc6rL.cjs} +34 -34
  141. package/dist/{run-RKaV1s5m.mjs → run-BO0aCF9F.mjs} +34 -34
  142. package/dist/{runClaude-B4hSm06m.cjs → runClaude-D6TktbLM.cjs} +20 -20
  143. package/dist/{runClaude-BnMkhjUP.mjs → runClaude-DF4b_nnj.mjs} +20 -20
  144. package/dist/{runClaudeDeps-BrS568YD.cjs → runClaudeDeps-B5_HGZVN.cjs} +38 -38
  145. package/dist/{runClaudeDeps-jlxTi74f.mjs → runClaudeDeps-CljBZRuq.mjs} +44 -44
  146. package/dist/{runGemini-D34l_LpW.mjs → runGemini-B4R_gBKP.mjs} +35 -35
  147. package/dist/{runGemini-DMLMq-y1.cjs → runGemini-CtuKMFr2.cjs} +35 -35
  148. package/dist/{runOpenClaw-BGKlUFHd.cjs → runOpenClaw-9AXOnCW3.cjs} +17 -17
  149. package/dist/{runOpenClaw-Dezk2LNe.mjs → runOpenClaw-Dvu4yTbZ.mjs} +17 -17
  150. package/dist/{sandbox-Db7g31zm.mjs → sandbox-B3YL-SmJ.mjs} +4 -4
  151. package/dist/{sandbox-C70ODcxh.cjs → sandbox-C0Aresqc.cjs} +4 -4
  152. package/dist/{selfCheck-UKA82vpj.cjs → selfCheck-CsteE3NU.cjs} +39 -39
  153. package/dist/selfCheck-ZpXxm1nH.mjs +89 -0
  154. package/dist/{send-BD8y_Dvq.cjs → send-CTi1xuRM.cjs} +8 -8
  155. package/dist/{send-8-CnqJTX.mjs → send-hCtrYHjk.mjs} +8 -8
  156. package/dist/{server-B-0TJW4B.cjs → server-BC1WoqwX.cjs} +6 -6
  157. package/dist/{server-CxmH3n3Y.mjs → server-C73IJReH.mjs} +4 -4
  158. package/dist/{sessionLock-BRaWaYhl.cjs → sessionLock-B78eUsZn.cjs} +3 -3
  159. package/dist/{sessionLock-Cg33c_Um.mjs → sessionLock-D5Mt-kl0.mjs} +3 -3
  160. package/dist/{sessionOps-1_wWgsXG.mjs → sessionOps-IQlrlpXx.mjs} +4 -4
  161. package/dist/{sessionOps-C-ms5bYE.cjs → sessionOps-Z0t9Sy6x.cjs} +4 -4
  162. package/dist/{sessionProvider-BKJ7EW-9.mjs → sessionProvider-8T4aF-U7.mjs} +5 -5
  163. package/dist/{sessionProvider-nbK5DYvh.cjs → sessionProvider-C0oC0cQ0.cjs} +5 -5
  164. package/dist/{sessionScanner-S7FsjWqu.cjs → sessionScanner-BHdRInLC.cjs} +3 -3
  165. package/dist/{sessionScanner-CGP1nnOy.mjs → sessionScanner-DW1TZj2O.mjs} +3 -3
  166. package/dist/{sessions-7B68T5D2.mjs → sessions-COgEytKt.mjs} +10 -10
  167. package/dist/{sessions-CwC-s7iA.cjs → sessions-iFR3MR2E.cjs} +10 -10
  168. package/dist/{setupOfflineReconnection-DSlXZLP9.mjs → setupOfflineReconnection-DXZKHKXk.mjs} +2 -2
  169. package/dist/{setupOfflineReconnection-D9BD_Cha.cjs → setupOfflineReconnection-YFeqV96O.cjs} +2 -2
  170. package/dist/{spawn-D4gyZP6A.cjs → spawn-8_ucIJAi.cjs} +12 -12
  171. package/dist/{spawn-CJ6ow1Et.mjs → spawn-Diu7Dy6k.mjs} +13 -13
  172. package/dist/{spawnHappyCLI-CKgAt8NU.cjs → spawnHappyCLI-BuzhxaUb.cjs} +1 -1
  173. package/dist/{spawnHappyCLI-BRcxn8Ui.mjs → spawnHappyCLI-CKOV5SN4.mjs} +1 -1
  174. package/dist/{startFileWatcher-DJ_IPi0y.mjs → startFileWatcher-BEiKblzC.mjs} +1 -1
  175. package/dist/{startFileWatcher-Baw_dgs_.cjs → startFileWatcher-YhoX-sbf.cjs} +1 -1
  176. package/dist/{startupSessionCreate-DeJNxWtb.mjs → startupSessionCreate-DZOZ_d4O.mjs} +3 -3
  177. package/dist/{startupSessionCreate-Cjl3wk3-.cjs → startupSessionCreate-mjEPEPs_.cjs} +3 -3
  178. package/dist/{sync-COxP1DF-.mjs → sync-BHsEZG8-.mjs} +1 -1
  179. package/dist/{sync-BqlAL8Iu.cjs → sync-BkxVNbmG.cjs} +1 -1
  180. package/dist/{systemPrompt-Ch052UGr.cjs → systemPrompt-CF39MlXL.cjs} +1 -1
  181. package/dist/{systemPrompt-bX3lhFwJ.mjs → systemPrompt-DVKEL0KU.mjs} +1 -1
  182. package/dist/{teams-B15InkZ8.cjs → teams-hkfoYZYl.cjs} +8 -8
  183. package/dist/{teams-DCCFeNBI.mjs → teams-zF_HSHny.mjs} +8 -8
  184. package/dist/{time-COyPPTSV.cjs → time-C1eHsyYl.cjs} +1 -1
  185. package/dist/{time-BHGz6WMO.mjs → time-PLmNnNT8.mjs} +1 -1
  186. package/dist/{titleGenerator-J99R5x-_.mjs → titleGenerator-B_9QYPm2.mjs} +1 -1
  187. package/dist/{titleGenerator-D4FFE3Mo.cjs → titleGenerator-DhB7M-Go.cjs} +2 -2
  188. package/dist/{todo-BZAJpKe1.mjs → todo-OkokZjAB.mjs} +7 -7
  189. package/dist/{todo-BHGF7oHm.cjs → todo-RDZfI_KT.cjs} +7 -7
  190. package/dist/{tools-Ck6hDYQh.mjs → tools-BrtfEQhr.mjs} +1 -1
  191. package/dist/{tools-DswZApdy.cjs → tools-bCceLykM.cjs} +1 -1
  192. package/dist/{uninstall-DUBwOYXT.cjs → uninstall-Cz7mXpuS.cjs} +3 -3
  193. package/dist/{uninstall-33r_D-SV.mjs → uninstall-pLwbtTh8.mjs} +3 -3
  194. package/package.json +7 -7
  195. package/dist/selfCheck-CUVp2nQo.mjs +0 -89
@@ -1,37 +1,37 @@
1
- import { a as authAndSetupMachineIfNeeded } from './auth-CP7a7YqH.mjs';
1
+ import { a as authAndSetupMachineIfNeeded } from './auth-D20iF90G.mjs';
2
2
  import { t as createEnvelope, M as BUILTIN_TODO_DISCOVERY, I as ISSUE_SESSION_CAPABILITY, r as restoredEffort, x as readEffortIntent, Y as EFFORT_INTENT_AUTO, P as PROMPT_QUEUE_CAPABILITY, ai as CODEX_STEER_CAPABILITY, a as PROJECT_SESSION_CAPABILITY, aj as CODEX_COMPACT_CAPABILITY, R as RUN_INTENT_CAPABILITY, A as AGENT_PROFILE_SESSION_CAPABILITY, ak as CODEX_BTW_CAPABILITY, al as CODEX_LIVE_PERMISSION_CAPABILITY } from './index-DWk-WTU-.mjs';
3
3
  import { i as issueSessionMetadata } from './sessionMetadata-C1eoAi89.mjs';
4
4
  import { a as recordRunIntents, w as withoutEffort, r as registerRunIntentRpc, b as DEFAULT_CODEX_PERMISSION_MODE } from './defaultPermissionMode-CYQi7vqJ.mjs';
5
- import { h as hashObject, s as startHappyServer, c as createProjectInjector } from './deterministicJson-BUtDwjAU.mjs';
6
- import { s as sharedProjectsClient } from './client-DizbJlbC.mjs';
5
+ import { h as hashObject, s as startHappyServer, c as createProjectInjector } from './deterministicJson-9MtfxFkH.mjs';
6
+ import { s as sharedProjectsClient } from './client-CHusuUpK.mjs';
7
7
  import { unlink } from 'node:fs/promises';
8
8
  import { a as announceForkBackfill, p as publishForkBackfillWhenCommitted, F as FORK_BACKFILL_CAPABILITY } from './forkBackfill-C9EfJ64O.mjs';
9
9
  import { randomUUID } from 'node:crypto';
10
10
  import { createId } from '@paralleldrive/cuid2';
11
- import { t as textResultPayload, d as toolResultContentText, c as connectionState, A as ApiClient } from './api-DGJVcaIF.mjs';
11
+ import { t as textResultPayload, d as toolResultContentText, c as connectionState, A as ApiClient } from './api-CSqHDB2c.mjs';
12
12
  import { r as registerAgentAttachmentDownloads, H as HeldInput } from './heldInput-C69lA2dH.mjs';
13
- import { C as CLAUDE_ATTACHMENT_KINDS, a as stageClaudeAttachments, b as appendStagedAttachmentsToPrompt } from './attachmentContent-C-qFMirp.mjs';
13
+ import { C as CLAUDE_ATTACHMENT_KINDS, a as stageClaudeAttachments, b as appendStagedAttachmentsToPrompt } from './attachmentContent-Dz1Klp7p.mjs';
14
14
  import { useStdout, useInput, Box, Text, render } from 'ink';
15
- import { c as claimSessionOrExit, a as applyServerSnapshot, b as applyReconnectReplay, w as withoutServerSnapshot, m as mergeReconnectMetadata, t as takeAutoRestartedEvent, A as AUTO_RESTART_CAPABILITY, e as exitCursorStamp } from './sessionLock-Cg33c_Um.mjs';
15
+ import { c as claimSessionOrExit, a as applyServerSnapshot, b as applyReconnectReplay, w as withoutServerSnapshot, m as mergeReconnectMetadata, t as takeAutoRestartedEvent, A as AUTO_RESTART_CAPABILITY, e as exitCursorStamp } from './sessionLock-D5Mt-kl0.mjs';
16
16
  import React, { useState, useRef, useEffect, useCallback } from 'react';
17
- import { C as CodexAppServerClient } from './codexAppServerClient-DFRZ__3w.mjs';
18
- import { S as SIDE_QUESTION_SYSTEM_PROMPT, b as buildSideQuestionPrompt, t as toolAttemptNotice, r as registerSideQuestionHandler, d as describePendingApprovals, w as wrapperRateLimitReporter } from './registerSideQuestionHandler-_YMnEk1L.mjs';
19
- import { l as logger } from './logger-DOp6YYAW.mjs';
20
- import { B as BasePermissionHandler } from './BasePermissionHandler-Cg2py7Mi.mjs';
21
- import { B as BaseReasoningProcessor, s as settleCodexSession } from './codexTermination-DuGPgcGv.mjs';
17
+ import { C as CodexAppServerClient, d as describeCodexFailure, a as describeCodexRetry, b as describeThrownTurnError, p as processLossMessage } from './codexAppServerClient-4OO0KZot.mjs';
18
+ import { S as SIDE_QUESTION_SYSTEM_PROMPT, b as buildSideQuestionPrompt, t as toolAttemptNotice, r as registerSideQuestionHandler, d as describePendingApprovals, w as wrapperRateLimitReporter } from './registerSideQuestionHandler-zuvmCRN8.mjs';
19
+ import { l as logger } from './logger-B3uJyacO.mjs';
20
+ import { B as BasePermissionHandler } from './BasePermissionHandler-pWG2_iEy.mjs';
21
+ import { B as BaseReasoningProcessor, s as settleCodexSession } from './codexTermination-CVq2OFB8.mjs';
22
22
  import { execSync } from 'node:child_process';
23
- import { r as readSettings, l as latchKeepAwake, e as evaluateWrapperIdle, a as resolveCheckMs, H as HIBERNATION_CAPABILITY } from './persistence-DURvN3Hm.mjs';
24
- import { g as getInitialMachineMetadata } from './machineMetadata-8PjdzhIk.mjs';
25
- import { c as configuration } from './configuration-BreL0beF.mjs';
26
- import { M as MessageQueue2, r as registerKillSessionHandler } from './registerKillSessionHandler-DNLUoqKq.mjs';
23
+ import { r as readSettings, l as latchKeepAwake, e as evaluateWrapperIdle, a as resolveCheckMs, H as HIBERNATION_CAPABILITY } from './persistence-Bqjt2vfj.mjs';
24
+ import { g as getInitialMachineMetadata } from './machineMetadata-CO2nMt0D.mjs';
25
+ import { c as configuration } from './configuration-DyUL3r3_.mjs';
26
+ import { M as MessageQueue2, r as registerKillSessionHandler } from './registerKillSessionHandler-UkuPaLm6.mjs';
27
27
  import { p as projectPath } from './projectPath-BTBIMB57.mjs';
28
28
  import { dirname, join } from 'node:path';
29
- import { c as createSessionMetadata } from './createSessionMetadata-B0wB4nIY.mjs';
29
+ import { c as createSessionMetadata } from './createSessionMetadata-ysHgFXAk.mjs';
30
30
  import { M as MessageBuffer } from './sessionExitLifecycle-iAtZN9sa.mjs';
31
- import { n as notifyDaemonSessionStarted, q as reportSessionEditToDaemon, c as checkDaemonHibernation } from './controlClient-DwiujrH8.mjs';
32
- import { c as createSessionForStartup, b as HibernationExitLatch, H as HibernationProbe, a as commitHibernation } from './startupSessionCreate-DeJNxWtb.mjs';
31
+ import { n as notifyDaemonSessionStarted, q as reportSessionEditToDaemon, c as checkDaemonHibernation } from './controlClient-HuyeDWsu.mjs';
32
+ import { c as createSessionForStartup, b as HibernationExitLatch, H as HibernationProbe, a as commitHibernation } from './startupSessionCreate-DZOZ_d4O.mjs';
33
33
  import { d as decodeBase64, e as encodeBase64 } from './authRelay-DhQhkBvX.mjs';
34
- import { s as setupOfflineReconnection } from './setupOfflineReconnection-DSlXZLP9.mjs';
34
+ import { s as setupOfflineReconnection } from './setupOfflineReconnection-DXZKHKXk.mjs';
35
35
  import { t as trimIdent } from './trimIdent-BAjmv_TG.mjs';
36
36
  import { a as parseSpecialCommand, c as compactCommandText, b as parseCompact } from './specialCommands-MXUN0wfI.mjs';
37
37
  import { C as CHANGE_TITLE_INSTRUCTION } from './constants-BC4St0xd.mjs';
@@ -41,77 +41,77 @@ import { r as readSessionBindings, w as writeSessionBinding, d as defaultSecretP
41
41
  import { mkdirSync, writeFileSync, chmodSync, rmSync } from 'node:fs';
42
42
  import { a as resolveCodexAccount, r as readCodexProviders, s as syncCodexOverlay, b as baseCodexHome, c as codexAccountSwitched, d as readCodexDefaultProvider, e as codexAccountDefaultModel, f as accountModelsAsCatalog, i as isHistoryRejectedError, g as isCodexAuthRejection } from './codexAccount-BPQ-lPhH.mjs';
43
43
  import { s as shouldRecordSpawnAccount, u as unavailableNotice } from './wrapperAccount-CwaA-n1S.mjs';
44
- import { a as extractNoSandboxFlag, e as ensureDaemonRunning } from './ensureDaemonRunning-m6Kd3BM7.mjs';
44
+ import { a as extractNoSandboxFlag, e as ensureDaemonRunning } from './ensureDaemonRunning-CfWwG5sk.mjs';
45
45
  import 'tweetnacl';
46
46
  import 'axios';
47
- import './time-BHGz6WMO.mjs';
48
- import './browser-C-PWxfCE.mjs';
47
+ import './time-PLmNnNT8.mjs';
48
+ import './browser-C9mNP2Jk.mjs';
49
49
  import 'open';
50
50
  import 'zod';
51
51
  import './prompt-QHuFx9j6.mjs';
52
- import './client-5ekzs8hv.mjs';
53
- import './exitNotice-HOwYf-97.mjs';
54
- import './reportProgressTool-B9DJTgdO.mjs';
55
- import './client-ztj20uaj.mjs';
52
+ import './client-D79GAZdH.mjs';
53
+ import './exitNotice-BhE9UKcS.mjs';
54
+ import './reportProgressTool-dSJwAO7H.mjs';
55
+ import './client-DM4LAJtu.mjs';
56
56
  import './precheckCompat-DeEbilbr.mjs';
57
- import './format-2GqpXiRX.mjs';
57
+ import './format-CNxQ0daG.mjs';
58
58
  import './agentGuidance-BDYt2Qy2.mjs';
59
59
  import 'node:os';
60
60
  import './pi-CqyoZMjI.mjs';
61
61
  import './fileStore-5qpetZS0.mjs';
62
- import './client-Bqyfl2t0.mjs';
62
+ import './client-BcJGDe88.mjs';
63
63
  import 'node:util';
64
- import './context-DFudPCad.mjs';
65
- import './sessionOps-1_wWgsXG.mjs';
64
+ import './context-D2H9Axdp.mjs';
65
+ import './sessionOps-IQlrlpXx.mjs';
66
66
  import 'socket.io-client';
67
67
  import './backgroundTaskActivity-8PdPxrvy.mjs';
68
68
  import './resources-CLP_MpK4.mjs';
69
- import './tools-Ck6hDYQh.mjs';
70
- import './peerTools-D66WcwUZ.mjs';
69
+ import './tools-BrtfEQhr.mjs';
70
+ import './peerTools-D0rxyRcF.mjs';
71
71
  import './ids-DU6sLx4C.mjs';
72
- import './remoteSessionClient-iIWEgwCP.mjs';
72
+ import './remoteSessionClient-DHuh-nj5.mjs';
73
73
  import '@modelcontextprotocol/sdk/server/mcp.js';
74
74
  import 'node:http';
75
75
  import '@modelcontextprotocol/sdk/server/streamableHttp.js';
76
76
  import './limits-DIo7rEBR.mjs';
77
- import './downloadTarget-CVm8ey3W.mjs';
77
+ import './downloadTarget-Bphxqzlj.mjs';
78
78
  import './terminals-Dc38XmZv.mjs';
79
79
  import './terminalTitleSuggest-CeKsX_V6.mjs';
80
80
  import './tmuxSocket-BmZyixRM.mjs';
81
- import './bootstrap-BCuF4Kla.mjs';
82
- import './package-CJeweE1o.mjs';
81
+ import './bootstrap-BNtlEESB.mjs';
82
+ import './package-BObPhT96.mjs';
83
83
  import './webPanels-B2_C2-3g.mjs';
84
- import './pushNotifications-CrN3Ja_a.mjs';
84
+ import './pushNotifications-C4KS8SZe.mjs';
85
85
  import './contentLogMetadata-BlWI0egu.mjs';
86
86
  import './previewPath-CXN4Vag0.mjs';
87
87
  import 'crypto';
88
- import './reconnectGate-BbxwTsar.mjs';
88
+ import './reconnectGate-4HRVraOQ.mjs';
89
89
  import 'os';
90
90
  import 'child_process';
91
91
  import 'node:events';
92
- import './registerCommonHandlers-Dd5Ld0CL.mjs';
92
+ import './registerCommonHandlers-CZJBrvGH.mjs';
93
93
  import 'util';
94
94
  import 'fs/promises';
95
95
  import 'path';
96
96
  import 'cross-spawn';
97
- import './sync-COxP1DF-.mjs';
97
+ import './sync-BHsEZG8-.mjs';
98
98
  import 'chalk';
99
99
  import './cliUpdate-Y34VGe9Y.mjs';
100
100
  import './processTermination-ChJG5SLW.mjs';
101
101
  import './processTreeSnapshot-fuwxC0fr.mjs';
102
102
  import 'node:readline';
103
- import './manager-BEsI4qt3.mjs';
103
+ import './manager-2Il8XJVq.mjs';
104
104
  import '@anthropic-ai/sandbox-runtime';
105
- import './rateLimitWindows-BrCPAQCV.mjs';
105
+ import './rateLimitWindows-CrWlGKPl.mjs';
106
106
  import './processTree-CP5IvQ2Z.mjs';
107
107
  import './detectCLI-CSGMlV51.mjs';
108
108
  import 'fs';
109
- import './localHappyAgentAuth-B2bOV9RF.mjs';
109
+ import './localHappyAgentAuth-3xKBQJOa.mjs';
110
110
  import './fsMkdir-DumgLTzR.mjs';
111
111
  import './types-CkqAACXx.mjs';
112
112
  import 'url';
113
113
  import './claudeAccountEnv-C6Wl-ZbT.mjs';
114
- import './spawnHappyCLI-BRcxn8Ui.mjs';
114
+ import './spawnHappyCLI-CKOV5SN4.mjs';
115
115
  import './doctorReadiness-C208SMN9.mjs';
116
116
 
117
117
  function getStartedSubagents(state) {
@@ -1126,66 +1126,39 @@ function codexModelFacts(input) {
1126
1126
  };
1127
1127
  }
1128
1128
 
1129
- const UNEXPECTED_STATUS = /^unexpected status (\d{3}) ([^:]*?):\s*([\s\S]*?)(?:,\s*url:\s*(\S+))?$/;
1130
- function readableCodexErrorText(text) {
1131
- const trimmed = text.trim();
1132
- const status = UNEXPECTED_STATUS.exec(trimmed);
1133
- if (status) {
1134
- const [, code, reason, rawBody, url] = status;
1135
- const head = `HTTP ${code} ${reason.trim()} from the model API`;
1136
- const detail = readableHttpBody(rawBody, `${code} ${reason}`);
1137
- return `${head}${detail ? `: ${detail}` : ""}${url ? ` (${url})` : ""}`;
1138
- }
1139
- return unwrapJsonMessage(trimmed) ?? trimmed;
1140
- }
1141
- function unwrapJsonMessage(text) {
1142
- if (!text.startsWith("{")) return null;
1143
- try {
1144
- const body = JSON.parse(text);
1145
- const inner = typeof body.error === "object" && body.error ? body.error.message : void 0;
1146
- const message = typeof inner === "string" && inner.trim() ? inner : typeof body.error === "string" && body.error.trim() ? body.error : typeof body.message === "string" && body.message.trim() ? body.message : null;
1147
- return message ? message.trim() : null;
1148
- } catch {
1149
- return null;
1150
- }
1129
+ const CRASH_LOOP_LIMIT = 2;
1130
+ const STREAK_WINDOW_MS = 6 * 60 * 60 * 1e3;
1131
+ const CODEX_CRASH_LOOP_PREFIX = "Codex thread crash loop:";
1132
+ function readCodexResumeCrash(value) {
1133
+ const v = value;
1134
+ if (!v || typeof v !== "object" || typeof v.threadId !== "string" || !v.threadId) return null;
1135
+ if (typeof v.count !== "number" || !Number.isFinite(v.count) || v.count < 1) return null;
1136
+ if (typeof v.at !== "number" || !Number.isFinite(v.at)) return null;
1137
+ return {
1138
+ threadId: v.threadId,
1139
+ count: Math.floor(v.count),
1140
+ at: v.at,
1141
+ ...typeof v.signal === "string" ? { signal: v.signal } : {},
1142
+ ...typeof v.code === "number" ? { code: v.code } : {}
1143
+ };
1144
+ }
1145
+ function recordCodexCrash(previous, exit, now) {
1146
+ if (!exit.threadId || exit.servedTurn) return null;
1147
+ const continues = previous && previous.threadId === exit.threadId && now - previous.at < STREAK_WINDOW_MS;
1148
+ return {
1149
+ threadId: exit.threadId,
1150
+ count: continues ? previous.count + 1 : 1,
1151
+ at: now,
1152
+ signal: exit.signal,
1153
+ code: exit.code
1154
+ };
1151
1155
  }
1152
- function readableHttpBody(raw, statusLine) {
1153
- let body = unwrapJsonMessage(raw.trim()) ?? raw.trim();
1154
- if (/<[a-z!/][^>]*>/i.test(body)) {
1155
- const title = /<title[^>]*>([\s\S]*?)<\/title>/i.exec(body);
1156
- body = title ? title[1] : body.replace(/<[^>]+>/g, " ");
1157
- }
1158
- body = body.replace(/\s+/g, " ").trim();
1159
- if (!body) return null;
1160
- const normalize = (value) => value.toLowerCase().replace(/[^a-z0-9]/g, "");
1161
- if (normalize(body) === normalize(statusLine)) return null;
1162
- return body.length > 240 ? `${body.slice(0, 240)}\u2026` : body;
1163
- }
1164
- function describeCodexFailure(msg) {
1165
- const hasFailure = msg?.status === "failed" || msg?.error !== void 0 && msg?.error !== null;
1166
- if (!hasFailure) return null;
1167
- const err = msg.error;
1168
- if (typeof err === "string" && err.length > 0) return readableCodexErrorText(err);
1169
- if (err && typeof err === "object" && typeof err.message === "string" && err.message.length > 0) {
1170
- return readableCodexErrorText(err.message);
1171
- }
1172
- return "Unknown error";
1173
- }
1174
- function describeCodexRetry(msg) {
1175
- const message = typeof msg?.message === "string" ? msg.message.trim() : "";
1176
- const status = typeof msg?.http_status === "number" ? msg.http_status : null;
1177
- const cause = status ? `HTTP ${status} from the model API` : "a model API error";
1178
- return message ? `Codex is retrying after ${cause} (${message})` : `Codex is retrying after ${cause}`;
1179
- }
1180
- function codexStderrTailOf(error) {
1181
- const tail = error?.codexStderrTail;
1182
- return typeof tail === "string" && tail.trim() ? tail.trim() : null;
1183
- }
1184
- const TRANSPORT_LOSS = /^Codex process (exited|disconnected)\b|stdin not writable| timed out after \d+ms/;
1185
- function describeThrownTurnError(error) {
1186
- const message = error instanceof Error ? error.message : typeof error === "string" ? error : "";
1187
- if (!message.trim() || TRANSPORT_LOSS.test(message)) return null;
1188
- return readableCodexErrorText(message);
1156
+ function isCrashLoopBlocked(streak, threadId, now) {
1157
+ return !!streak && !!threadId && streak.threadId === threadId && streak.count >= CRASH_LOOP_LIMIT && now - streak.at < STREAK_WINDOW_MS;
1158
+ }
1159
+ function crashLoopNotice(streak) {
1160
+ const how = streak.signal === "SIGKILL" ? "it was killed (SIGKILL), most likely out of memory" : streak.signal ? `it exited (signal=${streak.signal})` : `it exited (code=${streak.code ?? "null"})`;
1161
+ return `${CODEX_CRASH_LOOP_PREFIX} Codex died ${streak.count} times in a row while loading this thread \u2014 ${how}. Very Happy stopped restarting it. Start a new Codex session with a summary of this one to continue.`;
1189
1162
  }
1190
1163
 
1191
1164
  async function resumeExistingThread(opts) {
@@ -2221,6 +2194,32 @@ async function runCodex(opts) {
2221
2194
  });
2222
2195
  const editThrottle = new EditReportThrottle();
2223
2196
  client.setRateLimitHandler((snapshot) => wrapperRateLimitReporter().observeCodex(snapshot));
2197
+ let crashStreakNow = readCodexResumeCrash(session.getMetadata()?.codexResumeCrash);
2198
+ const crashStreak = () => crashStreakNow;
2199
+ let blockedResumeThreadId = null;
2200
+ const crashLoopBlocked = () => isCrashLoopBlocked(crashStreak(), client.threadId ?? blockedResumeThreadId, Date.now());
2201
+ const sendCrashLoopNotice = () => {
2202
+ const streak = crashStreak();
2203
+ if (!streak) return;
2204
+ messageBuffer.addMessage("Codex keeps dying while loading this thread; not restarting it", "status");
2205
+ session.sendSessionEvent({ type: "message", message: crashLoopNotice(streak) });
2206
+ };
2207
+ client.setUnexpectedExitHandler((exit) => {
2208
+ const next = recordCodexCrash(crashStreak(), exit, Date.now());
2209
+ logger.debug(`[Codex] App-server died: code=${exit.code} signal=${exit.signal} servedTurn=${exit.servedTurn} streak=${next?.count ?? 0}`);
2210
+ if (!next) return;
2211
+ crashStreakNow = next;
2212
+ session.updateMetadata((currentMetadata) => ({ ...currentMetadata, codexResumeCrash: next }));
2213
+ });
2214
+ const clearCrashStreak = () => {
2215
+ if (!crashStreakNow) return;
2216
+ crashStreakNow = null;
2217
+ session.updateMetadata((currentMetadata) => {
2218
+ const nextMetadata = { ...currentMetadata };
2219
+ delete nextMetadata.codexResumeCrash;
2220
+ return nextMetadata;
2221
+ });
2222
+ };
2224
2223
  client.setEventHandler((msg) => {
2225
2224
  if (msg.type === "token_count") {
2226
2225
  session.sendAgentUsageSnapshot("codex", msg);
@@ -2386,7 +2385,13 @@ async function runCodex(opts) {
2386
2385
  } catch (error) {
2387
2386
  logger.debug("[Codex] Model discovery unavailable; using compatibility fallback", safeCodexErrorMetadata(error));
2388
2387
  }
2389
- if (opts.resumeThreadId && !codexAccount.unavailable) {
2388
+ if (opts.resumeThreadId && !codexAccount.unavailable && isCrashLoopBlocked(crashStreak(), opts.resumeThreadId, Date.now())) {
2389
+ blockedResumeThreadId = opts.resumeThreadId;
2390
+ logger.debug("[Codex] Not resuming a thread in a crash loop");
2391
+ sendCrashLoopNotice();
2392
+ first = false;
2393
+ appendSystemPromptInjected = true;
2394
+ } else if (opts.resumeThreadId && !codexAccount.unavailable) {
2390
2395
  try {
2391
2396
  await resumeExistingThread({
2392
2397
  client,
@@ -2528,6 +2533,7 @@ async function runCodex(opts) {
2528
2533
  logger.debug("[Codex] Handling /clear command - resetting Codex thread state");
2529
2534
  heldInput.delivered();
2530
2535
  client.clearThreadState();
2536
+ blockedResumeThreadId = null;
2531
2537
  currentTurnId = null;
2532
2538
  codexStartedSubagents = /* @__PURE__ */ new Set();
2533
2539
  codexActiveSubagents = /* @__PURE__ */ new Set();
@@ -2561,6 +2567,11 @@ async function runCodex(opts) {
2561
2567
  messageBuffer.addMessage(message.message, "user");
2562
2568
  const compactCommand = codexCompactCommand(message.message);
2563
2569
  try {
2570
+ if (crashLoopBlocked()) {
2571
+ heldInput.drop("failed");
2572
+ sendCrashLoopNotice();
2573
+ continue;
2574
+ }
2564
2575
  if (compactCommand !== null) {
2565
2576
  await client.ensureConnected();
2566
2577
  heldInput.delivered();
@@ -2646,6 +2657,7 @@ async function runCodex(opts) {
2646
2657
  });
2647
2658
  reportModeFacts();
2648
2659
  first = false;
2660
+ if (!result.aborted) clearCrashStreak();
2649
2661
  if (includeAppendSystemPrompt) {
2650
2662
  appendSystemPromptInjected = true;
2651
2663
  }
@@ -2661,9 +2673,10 @@ async function runCodex(opts) {
2661
2673
  session.sendSessionEvent({ type: "message", message: `Codex error: ${reason}` });
2662
2674
  noteAccountFailure(reason);
2663
2675
  } else {
2664
- const tail = codexStderrTailOf(error);
2665
2676
  messageBuffer.addMessage("Process exited unexpectedly", "status");
2666
- session.sendSessionEvent({ type: "message", message: tail ? `Process exited unexpectedly: ${tail}` : "Process exited unexpectedly" });
2677
+ session.sendSessionEvent({ type: "message", message: processLossMessage(error) });
2678
+ logger.debug(`[Codex] Crash-loop check: streak=${crashStreak()?.count ?? 0} thread=${client.threadId ?? blockedResumeThreadId ?? "none"} blocked=${crashLoopBlocked()}`);
2679
+ if (crashLoopBlocked()) sendCrashLoopNotice();
2667
2680
  }
2668
2681
  } finally {
2669
2682
  permissionHandler.reset();