very-happy-cli 0.2.175 → 0.2.177

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 (185) hide show
  1. package/dist/{AcpBackend-Sb6N_HcB.cjs → AcpBackend-B-ny68XM.cjs} +188 -37
  2. package/dist/{AcpBackend-BZrLVcHb.mjs → AcpBackend-B0K0WrtW.mjs} +187 -38
  3. package/dist/{AcpSessionManager-C2MqOirs.cjs → AcpSessionManager-CjdJLofq.cjs} +1 -1
  4. package/dist/{AcpSessionManager-y1Iy1mzc.mjs → AcpSessionManager-DykjzBM4.mjs} +1 -1
  5. package/dist/{BasePermissionHandler-BbLYwd13.cjs → BasePermissionHandler-DR6nxuEn.cjs} +1 -1
  6. package/dist/{BasePermissionHandler-DriZLITp.mjs → BasePermissionHandler-hdY7kTqX.mjs} +1 -1
  7. package/dist/{agentHome-BoYfpemd.cjs → agentHome-BdTXEUPe.cjs} +4 -4
  8. package/dist/{agentHome-BtuRubHG.mjs → agentHome-GRN2VfHv.mjs} +4 -4
  9. package/dist/{api-KZmVqSKO.cjs → api-BWX10o97.cjs} +17 -10
  10. package/dist/{api-D08IEaWa.mjs → api-CKBViqI3.mjs} +18 -11
  11. package/dist/{apiMachine-Dct2GDAq.cjs → apiMachine-BYYFGgFs.cjs} +15 -14
  12. package/dist/{apiMachine-Cx9Zn-78.mjs → apiMachine-DttO4UFj.mjs} +15 -14
  13. package/dist/{attachmentContent-PrNJg8gG.mjs → attachmentContent-cPVF463_.mjs} +2 -2
  14. package/dist/{attachmentContent-4L9dO8E3.cjs → attachmentContent-kJKXpkMX.cjs} +2 -2
  15. package/dist/{attachmentLimits-BLbji11b.mjs → attachmentLimits-Di1Z93lN.mjs} +1 -1
  16. package/dist/{attachmentLimits-D6bT2jU1.cjs → attachmentLimits-DtFqqiwR.cjs} +1 -1
  17. package/dist/{auth-D1qHU-i_.mjs → auth-BmESeKuM.mjs} +5 -5
  18. package/dist/{auth-PY_HGlzz.mjs → auth-CKdXb9zp.mjs} +8 -8
  19. package/dist/{auth-BGmM3Vlm.cjs → auth-CTECt2Oz.cjs} +5 -5
  20. package/dist/{auth-BI0CsMcy.cjs → auth-DNxVmVbn.cjs} +8 -8
  21. package/dist/{auto-COMphIfD.mjs → auto-Ch3203qd.mjs} +17 -16
  22. package/dist/{auto-DM4_FeKb.cjs → auto-D1ypjjfx.cjs} +16 -15
  23. package/dist/{backgroundTaskActivity-8PdPxrvy.mjs → backgroundTaskActivity-BVwJBl02.mjs} +1 -1
  24. package/dist/{bootstrap-DTJ6-vYT.cjs → bootstrap-6OI698q9.cjs} +2 -2
  25. package/dist/{bootstrap-CWjpC5-J.mjs → bootstrap-C0s2bPFQ.mjs} +2 -2
  26. package/dist/{browser-xuW4fiHo.mjs → browser-BlLWZUMx.mjs} +1 -1
  27. package/dist/{browser-DmgVoopB.cjs → browser-DG6Uof5O.cjs} +1 -1
  28. package/dist/{claudeLocal-B0P-wVJJ.mjs → claudeLocal-CcWcKnoo.mjs} +5 -5
  29. package/dist/{claudeLocal-CtZVz3ee.cjs → claudeLocal-CemsIArT.cjs} +5 -5
  30. package/dist/{claudeLocalLauncher-D4vmjI3c.mjs → claudeLocalLauncher-7p6y88nj.mjs} +15 -18
  31. package/dist/{claudeLocalLauncher-Dnv4CH8r.cjs → claudeLocalLauncher-A4VuevIi.cjs} +15 -18
  32. package/dist/{claudeSessionFork-CxjOBoBh.mjs → claudeSessionFork-BtROOjqf.mjs} +1 -1
  33. package/dist/{claudeSessionFork-DQk5-dzR.cjs → claudeSessionFork-CbDfm8Fz.cjs} +1 -1
  34. package/dist/{client-eQjOvC55.mjs → client-BPMWutfs.mjs} +3 -3
  35. package/dist/{client-BhLhjj_x.cjs → client-COmgDDy0.cjs} +2 -2
  36. package/dist/{client-C4ddTzrD.mjs → client-DG5ndWLw.mjs} +2 -2
  37. package/dist/{client-BHZVyQwi.cjs → client-DyvBTYee.cjs} +3 -3
  38. package/dist/codex/happyMcpStdioBridge.cjs +15 -15
  39. package/dist/codex/happyMcpStdioBridge.mjs +16 -16
  40. package/dist/{codexAppServerClient-CppPl_R6.mjs → codexAppServerClient-D-Z8qSfI.mjs} +233 -24
  41. package/dist/{codexAppServerClient-D-9z-lWP.cjs → codexAppServerClient-R24WZZfg.cjs} +233 -24
  42. package/dist/{codexCommand-AgVJYnFU.cjs → codexCommand-6hW19gsq.cjs} +159 -84
  43. package/dist/{codexCommand-BdrBNbZu.mjs → codexCommand-CVTkZJ1o.mjs} +158 -83
  44. package/dist/{BaseReasoningProcessor-_S1PbSvH.cjs → codexTermination-BBU7e92y.cjs} +25 -1
  45. package/dist/{BaseReasoningProcessor-DnykPlPo.mjs → codexTermination-CCIfwzcx.mjs} +25 -2
  46. package/dist/{config-Cr3VUzbE.mjs → config-CvsNChKX.mjs} +3 -3
  47. package/dist/{config-D89sE3wK.cjs → config-DhdrvOLV.cjs} +3 -3
  48. package/dist/{configuration-BNGPXg07.mjs → configuration-D55F0t16.mjs} +1 -1
  49. package/dist/{configuration-UV4EE5ui.cjs → configuration-DZPy0T9Z.cjs} +1 -1
  50. package/dist/{connect-C0iLkCiY.mjs → connect-CwCXMRmD.mjs} +14 -14
  51. package/dist/{connect-B35YXbdZ.cjs → connect-Wz-XZYXW.cjs} +13 -13
  52. package/dist/{context-BmH2BKip.cjs → context-BKbrZ55r.cjs} +1 -1
  53. package/dist/{context-Ptdnlcv6.mjs → context-CCRpVXFo.mjs} +1 -1
  54. package/dist/{controlClient-DqtC0pq1.mjs → controlClient-C4xB5J6O.mjs} +4 -4
  55. package/dist/{controlClient-CtsQMw--.cjs → controlClient-SX8gSza2.cjs} +3 -3
  56. package/dist/{createSessionMetadata-2IuH5nlA.cjs → createSessionMetadata-BCFmYlBo.cjs} +2 -2
  57. package/dist/{createSessionMetadata-CtNMvfth.mjs → createSessionMetadata-Bi-m0Y_O.mjs} +2 -2
  58. package/dist/{defaultPermissionMode-Bn4HcU8S.cjs → defaultPermissionMode-DMBEnXll.cjs} +2 -2
  59. package/dist/{defaultPermissionMode-DYihjV2g.mjs → defaultPermissionMode-wBcbBezm.mjs} +2 -2
  60. package/dist/{deterministicJson-DF4xv6MH.mjs → deterministicJson-BkQETt8_.mjs} +9 -9
  61. package/dist/{deterministicJson-je21npNx.cjs → deterministicJson-ChGfQEF6.cjs} +9 -9
  62. package/dist/{doctor-Ba92L7-b.mjs → doctor-B9c2C9dF.mjs} +8 -8
  63. package/dist/{doctor-BXKcYVGU.cjs → doctor-BsN3JZJn.cjs} +7 -7
  64. package/dist/{downloadTarget-CUJg8iJV.mjs → downloadTarget-ByXzbDK4.mjs} +6 -6
  65. package/dist/{downloadTarget-JC7FZl7W.cjs → downloadTarget-Dj3WoVJa.cjs} +6 -6
  66. package/dist/{ensureDaemonRunning-JPA9tHNE.mjs → ensureDaemonRunning--HYzs5Ce.mjs} +5 -5
  67. package/dist/{ensureDaemonRunning-bIp6-vgi.cjs → ensureDaemonRunning-7Wb8M7Lv.cjs} +5 -5
  68. package/dist/{handleResumeCommand-B6lE5DtU.mjs → handleResumeCommand-DHddBkNJ.mjs} +5 -5
  69. package/dist/{handleResumeCommand-B6b9kIYf.cjs → handleResumeCommand-OmuUGYjQ.cjs} +5 -5
  70. package/dist/{index-B2KL0aPc.cjs → index-BRJzH4sc.cjs} +141 -87
  71. package/dist/{index-CjE4kBKx.mjs → index-BzJNDsJq.mjs} +143 -89
  72. package/dist/{index-B6UGRQ7h.mjs → index-CEjJnq05.mjs} +3 -0
  73. package/dist/{index-CZLwo1FS.mjs → index-CEm0MYiS.mjs} +3 -3
  74. package/dist/{index-B1ABQRrB.cjs → index-CrR4JISa.cjs} +4 -4
  75. package/dist/{index-D759ViMU.cjs → index-D9NoYc5I.cjs} +3 -3
  76. package/dist/{index-D3kI0hDR.cjs → index-DFPT4HOO.cjs} +3 -0
  77. package/dist/{index-boE-d8CM.mjs → index-DMy3OCBe.mjs} +8 -1
  78. package/dist/{index-BZdhwBKa.cjs → index-De8L5lFK.cjs} +8 -0
  79. package/dist/{index-DW1ONaGc.mjs → index-Dhl6_bw7.mjs} +4 -4
  80. package/dist/index.cjs +2 -2
  81. package/dist/index.mjs +2 -2
  82. package/dist/{install-KjIsK_EA.cjs → install-1qn-D9FS.cjs} +3 -3
  83. package/dist/{install-CmojqnLK.mjs → install-BDIUtPXi.mjs} +3 -3
  84. package/dist/lib.cjs +12 -12
  85. package/dist/lib.d.cts +7 -1
  86. package/dist/lib.d.mts +7 -1
  87. package/dist/lib.mjs +13 -13
  88. package/dist/{lidState-CL1NdKfQ.mjs → lidState-BqVsw7H1.mjs} +1 -1
  89. package/dist/{lidState-BmJp2pLt.cjs → lidState-DxbK0qfu.cjs} +1 -1
  90. package/dist/{localHappyAgentAuth-B7f4Ysn0.mjs → localHappyAgentAuth-Ce8kO2yc.mjs} +1 -1
  91. package/dist/{localHappyAgentAuth-9SP7hdiw.cjs → localHappyAgentAuth-D5tANdRD.cjs} +1 -1
  92. package/dist/{logger-D5EzMy30.mjs → logger-13cBr_ew.mjs} +2 -2
  93. package/dist/{logger-C7dRaCkE.cjs → logger-LvwVeATU.cjs} +2 -2
  94. package/dist/{machineMetadata-DYYuK_0c.cjs → machineMetadata-29h7vgf4.cjs} +3 -3
  95. package/dist/{machineMetadata-DqplCWue.mjs → machineMetadata-dMida2qq.mjs} +3 -3
  96. package/dist/{main-kgCQgknK.cjs → main-DpM5jaFH.cjs} +44 -44
  97. package/dist/{main-CnV62agu.mjs → main-x4nAhdH5.mjs} +44 -44
  98. package/dist/{mcp-bDPaj-tM.mjs → mcp-DMiFGYMT.mjs} +15 -15
  99. package/dist/{mcp-BV0vxHtz.cjs → mcp-DQv3caXs.cjs} +14 -14
  100. package/dist/{mirrorProtocol-BSHVZ8Nf.cjs → mirrorProtocol-BfrERW7Z.cjs} +3 -3
  101. package/dist/{mirrorProtocol-ClKhNXYe.mjs → mirrorProtocol-Bz8tEabR.mjs} +3 -3
  102. package/dist/{package-VqWv7EI5.cjs → package-Ch9WGDV_.cjs} +7 -7
  103. package/dist/{package-D0dxZ-W8.mjs → package-CjlsAaRe.mjs} +7 -7
  104. package/dist/{peerTools-B_eiNB3P.mjs → peerTools-CxmrKnfV.mjs} +4 -4
  105. package/dist/{peerTools-BktGmlpd.cjs → peerTools-DtGKWli5.cjs} +4 -4
  106. package/dist/{persistence-CIIhP0Uw.mjs → persistence-C_tYtOqK.mjs} +2 -2
  107. package/dist/{persistence-DweHi8xa.cjs → persistence-DXbKOHxl.cjs} +2 -2
  108. package/dist/{piRunnerArgs-BNzWTNRV.cjs → piRunnerArgs-BVRZe2AR.cjs} +1 -1
  109. package/dist/{piRunnerArgs-cQafsadv.mjs → piRunnerArgs-BpHc-JZl.mjs} +1 -1
  110. package/dist/{piRuntime-VZLSwW-4.cjs → piRuntime-D7eio8Ix.cjs} +1 -1
  111. package/dist/{piRuntime-Bel5lOLb.mjs → piRuntime-DOdGF395.mjs} +1 -1
  112. package/dist/{piTerminal-CS5SDi_H.mjs → piTerminal-dpxz4Q8D.mjs} +17 -17
  113. package/dist/{piTerminal-DkR8sPv-.cjs → piTerminal-y_PRo2NY.cjs} +16 -16
  114. package/dist/processTree-CMHWlVse.cjs +66 -0
  115. package/dist/processTree-CP5IvQ2Z.mjs +61 -0
  116. package/dist/{rateLimitWindows-Bp4T21RI.cjs → rateLimitWindows-DFnMU2Vt.cjs} +1 -1
  117. package/dist/{rateLimitWindows-Bo6XVnie.mjs → rateLimitWindows-DYHDGuzQ.mjs} +1 -1
  118. package/dist/{registerCommonHandlers-B7QZxkCL.cjs → registerCommonHandlers-60VuTkdg.cjs} +2 -2
  119. package/dist/{registerCommonHandlers-CR5jpiSx.mjs → registerCommonHandlers-D8OMpBbQ.mjs} +2 -2
  120. package/dist/{registerKillSessionHandler-DLiu24CQ.mjs → registerKillSessionHandler-Drhf7-Vz.mjs} +6 -6
  121. package/dist/{registerKillSessionHandler-CcX84g-T.cjs → registerKillSessionHandler-pqChBKwO.cjs} +6 -6
  122. package/dist/{remoteSessionClient-CL3akj0K.cjs → remoteSessionClient-B7NvjHD3.cjs} +5 -5
  123. package/dist/{remoteSessionClient-CUjw1COc.mjs → remoteSessionClient-D01Hso2-.mjs} +5 -5
  124. package/dist/{reportProgressTool-BLLwMQrN.mjs → reportProgressTool-B203EZCR.mjs} +2 -2
  125. package/dist/{reportProgressTool-DzMi4mvH.cjs → reportProgressTool-Du_zAK4h.cjs} +2 -2
  126. package/dist/{run-DGokR_6q.mjs → run-DX4Zs3Ug.mjs} +34 -34
  127. package/dist/{run-5pmOElaW.cjs → run-DZ5jU53c.cjs} +34 -34
  128. package/dist/{runClaude-BFlpZQds.mjs → runClaude-CgPHXP0L.mjs} +27 -23
  129. package/dist/{runClaude-EnYNvkV0.cjs → runClaude-ClRhHpwR.cjs} +26 -22
  130. package/dist/{runClaudeDeps-CUDebE9e.cjs → runClaudeDeps-D2v_WDSL.cjs} +387 -89
  131. package/dist/{runClaudeDeps-D1M1dzlZ.mjs → runClaudeDeps-Dz2iydq4.mjs} +393 -95
  132. package/dist/{runGemini-Bu69Zu1u.cjs → runGemini-BtZqGFkp.cjs} +208 -193
  133. package/dist/{runGemini-Bub8T5cM.mjs → runGemini-DBXxpoY8.mjs} +208 -193
  134. package/dist/{runOpenClaw-DVu73F_i.mjs → runOpenClaw-BOHpzCEU.mjs} +19 -19
  135. package/dist/{runOpenClaw-Cob5F3FC.cjs → runOpenClaw-D8q8G57u.cjs} +18 -18
  136. package/dist/{sandbox-9EKOFyQF.mjs → sandbox-C452Vrsc.mjs} +4 -4
  137. package/dist/{sandbox-GDqMagSF.cjs → sandbox-Cu9mMzjx.cjs} +4 -4
  138. package/dist/selfCheck-BAvqBwBR.mjs +84 -0
  139. package/dist/{selfCheck-DiNo34da.cjs → selfCheck-gKa3uVr1.cjs} +35 -35
  140. package/dist/{send-ThC80164.cjs → send-2Vb5eppI.cjs} +8 -8
  141. package/dist/{send-wgtHphq8.mjs → send-B8HARi7x.mjs} +9 -9
  142. package/dist/{server-Bb8v2fOj.mjs → server-BBWCIZyS.mjs} +4 -4
  143. package/dist/{server-bidHnstE.cjs → server-Db9Wuam3.cjs} +6 -6
  144. package/dist/{sessionLock-BWBcBZKh.cjs → sessionLock-6qL_N6Rn.cjs} +3 -3
  145. package/dist/{sessionLock-gb32sVPR.mjs → sessionLock-ZfvFVdUi.mjs} +3 -3
  146. package/dist/{sessionModeFile-C-fr1M1h.mjs → sessionModeFile-CWVq8AT9.mjs} +1 -1
  147. package/dist/{sessionModeFile-DhuTNcJr.cjs → sessionModeFile-CsLtn_PL.cjs} +1 -1
  148. package/dist/{sessionOps-ByZJbkMq.mjs → sessionOps-CdgbEJgf.mjs} +5 -5
  149. package/dist/{sessionOps-9MChM9Op.cjs → sessionOps-Dmt7WUUs.cjs} +4 -4
  150. package/dist/{sessionScanner-CxXPAVyS.mjs → sessionScanner-CNVaSNOn.mjs} +34 -4
  151. package/dist/{sessionScanner-BpegdnXK.cjs → sessionScanner-CQL_WSaC.cjs} +34 -3
  152. package/dist/{sessions-C1X4z_Lm.cjs → sessions-BJblG_Hx.cjs} +9 -9
  153. package/dist/{sessions-l-UgJGjV.mjs → sessions-DTomHfFg.mjs} +10 -10
  154. package/dist/{setupOfflineReconnection-CgtXlV74.mjs → setupOfflineReconnection-C5trsV-j.mjs} +2 -2
  155. package/dist/{setupOfflineReconnection-CS_8Da8R.cjs → setupOfflineReconnection-DVA0VpQL.cjs} +2 -2
  156. package/dist/{spawn-FyoHqYWo.mjs → spawn-CQJFgoOq.mjs} +15 -14
  157. package/dist/{spawn-D2BlNdZu.cjs → spawn-DRyNAqD8.cjs} +14 -13
  158. package/dist/{spawnAgents-BhsbJ253.mjs → spawnAgents-BjtmjBvP.mjs} +1 -1
  159. package/dist/{spawnAgents-CgMKuOhZ.cjs → spawnAgents-CCjJifAW.cjs} +1 -1
  160. package/dist/{spawnHappyCLI-DsC256j_.mjs → spawnHappyCLI-B_0RWxD4.mjs} +1 -1
  161. package/dist/{spawnHappyCLI-DByQcqEN.cjs → spawnHappyCLI-ChniczJ5.cjs} +1 -1
  162. package/dist/{specialCommands-DGUeZqdm.cjs → specialCommands-DbntVs0d.cjs} +3 -3
  163. package/dist/{specialCommands-DUUBqzvd.mjs → specialCommands-DkdFJi4N.mjs} +3 -3
  164. package/dist/{startFileWatcher-BtBaahTn.cjs → startFileWatcher-C292fhra.cjs} +1 -1
  165. package/dist/{startFileWatcher-CaYRObJu.mjs → startFileWatcher-UQyTSRAP.mjs} +1 -1
  166. package/dist/{streamRelay-DqPFsCgx.cjs → streamRelay-Cx01enfe.cjs} +1 -1
  167. package/dist/{streamRelay-C8zI7OnR.mjs → streamRelay-_qCd873P.mjs} +1 -1
  168. package/dist/{sync-D5YqUVjS.mjs → sync-C3p7-KLn.mjs} +1 -1
  169. package/dist/{sync-BK-IBkuB.cjs → sync-C7sxoUYG.cjs} +1 -1
  170. package/dist/{systemPrompt-e-qeag_h.mjs → systemPrompt-CdHOlyVW.mjs} +2 -2
  171. package/dist/{systemPrompt-DaTKLEb-.cjs → systemPrompt-DtibzbRU.cjs} +2 -2
  172. package/dist/{teams-D9xwa_d3.cjs → teams-D7O7TpVU.cjs} +6 -6
  173. package/dist/{teams-ClrppvKu.mjs → teams-ujXr3AFn.mjs} +6 -6
  174. package/dist/{time-0szhiPo4.cjs → time-Dg5tVB8S.cjs} +1 -1
  175. package/dist/{time-CvrpeD3S.mjs → time-yEL6wHUF.mjs} +1 -1
  176. package/dist/{titleGenerator-Dz5P7sE1.cjs → titleGenerator-BMEaDTwU.cjs} +2 -2
  177. package/dist/{titleGenerator-BZ5770wq.mjs → titleGenerator-Dr-BtjzO.mjs} +1 -1
  178. package/dist/{todo-CkmNJQey.cjs → todo-CUcFamGs.cjs} +6 -6
  179. package/dist/{todo-o-miKcN2.mjs → todo-CvJe4M2C.mjs} +6 -6
  180. package/dist/{tools-Cp0qJeBq.mjs → tools-BrM3bZW5.mjs} +1 -1
  181. package/dist/{tools-C77-Ssan.cjs → tools-DDKTB5aQ.cjs} +1 -1
  182. package/dist/{uninstall-DGUPERDX.cjs → uninstall-7oLuhYIu.cjs} +3 -3
  183. package/dist/{uninstall-jNJDCLD_.mjs → uninstall-CEcMMQGz.mjs} +3 -3
  184. package/package.json +7 -7
  185. package/dist/selfCheck-CNo4uzGB.mjs +0 -84
@@ -4,81 +4,82 @@ var ink = require('ink');
4
4
  var React = require('react');
5
5
  var node_crypto = require('node:crypto');
6
6
  var path = require('node:path');
7
- var api = require('./api-KZmVqSKO.cjs');
8
- var logger = require('./logger-C7dRaCkE.cjs');
9
- var persistence = require('./persistence-DweHi8xa.cjs');
10
- var createSessionMetadata = require('./createSessionMetadata-2IuH5nlA.cjs');
7
+ var api = require('./api-BWX10o97.cjs');
8
+ var logger = require('./logger-LvwVeATU.cjs');
9
+ var persistence = require('./persistence-DXbKOHxl.cjs');
10
+ var createSessionMetadata = require('./createSessionMetadata-BCFmYlBo.cjs');
11
11
  var contentLogMetadata = require('./contentLogMetadata-ZSFk_NjQ.cjs');
12
- var machineMetadata = require('./machineMetadata-DYYuK_0c.cjs');
13
- var registerKillSessionHandler = require('./registerKillSessionHandler-CcX84g-T.cjs');
14
- var deterministicJson = require('./deterministicJson-je21npNx.cjs');
12
+ var machineMetadata = require('./machineMetadata-29h7vgf4.cjs');
13
+ var registerKillSessionHandler = require('./registerKillSessionHandler-pqChBKwO.cjs');
14
+ var deterministicJson = require('./deterministicJson-ChGfQEF6.cjs');
15
15
  var projectPath = require('./projectPath-ChLhdOyt.cjs');
16
16
  var messageBuffer = require('./messageBuffer-fJMH6uY8.cjs');
17
- var controlClient = require('./controlClient-CtsQMw--.cjs');
17
+ var controlClient = require('./controlClient-SX8gSza2.cjs');
18
18
  var authRelay = require('./authRelay-BdYkC1Po.cjs');
19
- var setupOfflineReconnection = require('./setupOfflineReconnection-CS_8Da8R.cjs');
20
- var AcpBackend = require('./AcpBackend-Sb6N_HcB.cjs');
19
+ var setupOfflineReconnection = require('./setupOfflineReconnection-DVA0VpQL.cjs');
20
+ var AcpBackend = require('./AcpBackend-B-ny68XM.cjs');
21
21
  var constants = require('./constants-VJ0N6WuG.cjs');
22
- var config = require('./config-D89sE3wK.cjs');
23
- var BasePermissionHandler = require('./BasePermissionHandler-BbLYwd13.cjs');
24
- var BaseReasoningProcessor = require('./BaseReasoningProcessor-_S1PbSvH.cjs');
22
+ var config = require('./config-DhdrvOLV.cjs');
23
+ var BasePermissionHandler = require('./BasePermissionHandler-DR6nxuEn.cjs');
24
+ var codexTermination = require('./codexTermination-BBU7e92y.cjs');
25
25
  require('axios');
26
- require('./lidState-BmJp2pLt.cjs');
26
+ require('./lidState-DxbK0qfu.cjs');
27
27
  require('os');
28
28
  require('child_process');
29
29
  require('node:events');
30
30
  require('socket.io-client');
31
- require('./attachmentLimits-D6bT2jU1.cjs');
31
+ require('./attachmentLimits-DtFqqiwR.cjs');
32
32
  require('zod');
33
- require('./index-BZdhwBKa.cjs');
33
+ require('./index-De8L5lFK.cjs');
34
34
  require('@paralleldrive/cuid2');
35
35
  require('./limits-C-a7gr04.cjs');
36
- require('./time-0szhiPo4.cjs');
37
- require('./configuration-UV4EE5ui.cjs');
36
+ require('./time-Dg5tVB8S.cjs');
37
+ require('./configuration-DZPy0T9Z.cjs');
38
38
  require('node:fs');
39
39
  require('node:os');
40
- require('./package-VqWv7EI5.cjs');
40
+ require('./package-Ch9WGDV_.cjs');
41
41
  require('node:fs/promises');
42
- require('./registerCommonHandlers-B7QZxkCL.cjs');
42
+ require('./registerCommonHandlers-60VuTkdg.cjs');
43
43
  require('util');
44
44
  require('fs/promises');
45
45
  require('crypto');
46
46
  require('path');
47
47
  require('cross-spawn');
48
- require('./sync-BK-IBkuB.cjs');
48
+ require('./sync-C7sxoUYG.cjs');
49
49
  require('./backgroundTaskActivity-CBvUdj39.cjs');
50
50
  require('chalk');
51
51
  require('node:util');
52
52
  require('./detectCLI-DR9ZaN6B.cjs');
53
53
  require('fs');
54
- require('./localHappyAgentAuth-9SP7hdiw.cjs');
54
+ require('./localHappyAgentAuth-D5tANdRD.cjs');
55
55
  require('tweetnacl');
56
56
  require('./types-CRS-srZK.cjs');
57
- require('./client-BHZVyQwi.cjs');
58
- require('./context-BmH2BKip.cjs');
59
- require('./sessionOps-9MChM9Op.cjs');
57
+ require('./client-DyvBTYee.cjs');
58
+ require('./context-BKbrZ55r.cjs');
59
+ require('./sessionOps-Dmt7WUUs.cjs');
60
60
  require('./resources-JDPugcDq.cjs');
61
- require('./tools-C77-Ssan.cjs');
62
- require('./reportProgressTool-DzMi4mvH.cjs');
63
- require('./client-BhLhjj_x.cjs');
61
+ require('./tools-DDKTB5aQ.cjs');
62
+ require('./reportProgressTool-Du_zAK4h.cjs');
63
+ require('./client-COmgDDy0.cjs');
64
64
  require('./precheckCompat-CWOi5c9L.cjs');
65
65
  require('./agentGuidance-BtBx2xxE.cjs');
66
66
  require('./trimIdent-4gvk9Wk6.cjs');
67
- require('./peerTools-BktGmlpd.cjs');
67
+ require('./peerTools-DtGKWli5.cjs');
68
68
  require('./ids-B6ZC0HGt.cjs');
69
- require('./remoteSessionClient-CL3akj0K.cjs');
69
+ require('./remoteSessionClient-B7NvjHD3.cjs');
70
70
  require('@modelcontextprotocol/sdk/server/mcp.js');
71
71
  require('node:http');
72
72
  require('@modelcontextprotocol/sdk/server/streamableHttp.js');
73
- require('./downloadTarget-JC7FZl7W.cjs');
73
+ require('./downloadTarget-Dj3WoVJa.cjs');
74
74
  require('./terminals-B_bfC9c2.cjs');
75
75
  require('node:child_process');
76
76
  require('./terminalTitleSuggest-DhvRFX3H.cjs');
77
77
  require('./tmuxSocket-D-Xt6Vn-.cjs');
78
- require('./bootstrap-DTJ6-vYT.cjs');
78
+ require('./bootstrap-6OI698q9.cjs');
79
79
  require('./previewPath-B0rBdhy1.cjs');
80
80
  require('url');
81
81
  require('@agentclientprotocol/sdk');
82
+ require('./processTree-CMHWlVse.cjs');
82
83
 
83
84
  const GEMINI_TIMEOUTS = {
84
85
  /** Gemini CLI can be slow on first start (downloading models, etc.) */
@@ -602,7 +603,7 @@ class GeminiPermissionHandler extends BasePermissionHandler.BasePermissionHandle
602
603
  }
603
604
  }
604
605
 
605
- class GeminiReasoningProcessor extends BaseReasoningProcessor.BaseReasoningProcessor {
606
+ class GeminiReasoningProcessor extends codexTermination.BaseReasoningProcessor {
606
607
  getToolName() {
607
608
  return "GeminiReasoning";
608
609
  }
@@ -893,6 +894,74 @@ ${formattedMessages}
893
894
  }
894
895
  }
895
896
 
897
+ function factsOf(error) {
898
+ if (error instanceof Error) {
899
+ const record = error;
900
+ const details = typeof record.data?.details === "string" ? record.data.details : typeof record.details === "string" ? record.details : "";
901
+ return { code: record.code, details, message: error.message, whole: `${details} ${error.message}`, empty: false };
902
+ }
903
+ if (error && typeof error === "object") {
904
+ const record = error;
905
+ const details = typeof record.data?.details === "string" ? record.data.details : typeof record.details === "string" ? record.details : "";
906
+ const message = typeof record.message === "string" ? record.message : typeof record.error?.message === "string" ? record.error.message : "";
907
+ let whole = `${details} ${message}`;
908
+ try {
909
+ whole += ` ${JSON.stringify(error)}`;
910
+ } catch {
911
+ }
912
+ return { code: record.code ?? record.status ?? record.response?.status, details, message, whole, empty: Object.keys(error).length === 0 };
913
+ }
914
+ return { code: void 0, details: "", message: String(error), whole: String(error), empty: false };
915
+ }
916
+ function quotaResetSuffix(text) {
917
+ const match = text.match(/reset after (\d+h)?(\d+m)?(\d+s)?/i);
918
+ if (!match) return "";
919
+ const parts = match.slice(1).filter(Boolean).join("");
920
+ return parts ? ` Quota resets in ${parts}.` : "";
921
+ }
922
+ const EMPTY_RESPONSE = /empty response|Model stream ended/i;
923
+ const TRANSIENT = /overloaded|UNAVAILABLE|\b503\b|ECONNRESET|socket hang up|ETIMEDOUT/i;
924
+ function isRetryableGeminiError(error) {
925
+ if (AcpBackend.isAgentExitError(error)) return false;
926
+ const facts = factsOf(error);
927
+ if (/exhausted|quota|capacity/i.test(facts.whole)) return false;
928
+ return EMPTY_RESPONSE.test(facts.whole) || TRANSIENT.test(facts.whole);
929
+ }
930
+ function describeGeminiFailure(error, ctx) {
931
+ if (AcpBackend.isAgentExitError(error)) {
932
+ return { kind: "exited", message: `Process exited unexpectedly: ${error.message}` };
933
+ }
934
+ const f = factsOf(error);
935
+ if (f.code === 404 || /notFound|\b404\b/.test(f.details) || /not found|\b404\b/.test(f.message)) {
936
+ return { kind: "not-found", message: `Gemini error: model "${ctx.model}" not found. Available models: gemini-2.5-pro, gemini-2.5-flash, gemini-2.5-flash-lite` };
937
+ }
938
+ if (EMPTY_RESPONSE.test(f.whole)) {
939
+ return { kind: "empty", message: "Gemini error: the API returned an empty response after retries. This is usually temporary \u2014 please try again." };
940
+ }
941
+ if (f.code === 429 || /\b429\b|rateLimitExceeded|RESOURCE_EXHAUSTED|Rate limit exceeded|Resource exhausted/i.test(f.whole)) {
942
+ return { kind: "rate-limit", message: "Gemini error: API rate limit exceeded. Please wait a moment and try again." };
943
+ }
944
+ if (/quota|exhausted|capacity/i.test(f.whole)) {
945
+ return { kind: "quota", message: `Gemini error: quota exceeded.${quotaResetSuffix(f.whole)} Try another model (gemini-2.5-flash-lite) or wait for the quota to reset.` };
946
+ }
947
+ if (f.code === -32e3 || /Authentication required/i.test(f.whole)) {
948
+ return {
949
+ kind: "auth",
950
+ message: "Gemini error: authentication required. For Google Workspace accounts set a Google Cloud project: `very-happy gemini project set <your-project-id>`; or use another Google account: `very-happy connect gemini`. Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca"
951
+ };
952
+ }
953
+ if (f.empty) {
954
+ return { kind: "not-installed", message: 'Gemini error: failed to start Gemini. Is the "gemini" CLI installed? Run: npm install -g @google/gemini-cli' };
955
+ }
956
+ const text = (f.details || f.message || "process error occurred").replace(/\s+/g, " ").trim();
957
+ return { kind: "other", message: `Gemini error: ${text.length > 400 ? `${text.slice(0, 399)}\u2026` : text}` };
958
+ }
959
+ function describeGeminiRetry(attempt, maxAttempts, error) {
960
+ const f = factsOf(error);
961
+ const why = EMPTY_RESPONSE.test(f.whole) ? "an empty response" : "a transient API error";
962
+ return `Gemini is retrying after ${why} (attempt ${attempt}/${maxAttempts})`;
963
+ }
964
+
896
965
  async function runGemini(opts) {
897
966
  const sessionTag = node_crypto.randomUUID();
898
967
  api.connectionState.setBackend("Gemini");
@@ -1097,8 +1166,12 @@ async function runGemini(opts) {
1097
1166
  let geminiBackend = null;
1098
1167
  let acpSessionId = null;
1099
1168
  let wasSessionCreated = false;
1169
+ let turnEnding = "completed";
1170
+ const turnAborted = () => turnEnding === "aborted";
1171
+ let backendGone = null;
1100
1172
  async function handleAbort() {
1101
1173
  logger.logger.debug("[Gemini] Abort requested - stopping current task");
1174
+ turnEnding = "aborted";
1102
1175
  session.sendAgentMessage("gemini", {
1103
1176
  type: "turn_aborted",
1104
1177
  id: node_crypto.randomUUID()
@@ -1106,6 +1179,7 @@ async function runGemini(opts) {
1106
1179
  reasoningProcessor.abort();
1107
1180
  diffProcessor.reset();
1108
1181
  try {
1182
+ permissionHandler.abortAll();
1109
1183
  abortController.abort();
1110
1184
  messageQueue.reset();
1111
1185
  if (geminiBackend && acpSessionId) {
@@ -1118,22 +1192,13 @@ async function runGemini(opts) {
1118
1192
  abortController = new AbortController();
1119
1193
  }
1120
1194
  }
1121
- const handleKillSession = async () => {
1122
- logger.logger.debug("[Gemini] Kill session requested - terminating process");
1195
+ const handleKillSession = async (intent = "archive") => {
1196
+ logger.logger.debug(`[Gemini] Kill session requested (${intent}) - terminating process`);
1123
1197
  await handleAbort();
1124
1198
  logger.logger.debug("[Gemini] Abort completed, proceeding with termination");
1125
1199
  try {
1126
1200
  if (session) {
1127
- session.updateMetadata((currentMetadata) => ({
1128
- ...currentMetadata,
1129
- lifecycleState: "archived",
1130
- lifecycleStateSince: Date.now(),
1131
- archivedBy: "cli",
1132
- archiveReason: "User terminated"
1133
- }));
1134
- session.sendSessionDeath();
1135
- await session.flush();
1136
- await session.close();
1201
+ await codexTermination.settleCodexSession(session, intent, (id) => api$1.deactivateSession(id), (m, e) => logger.logger.debug(m, e));
1137
1202
  }
1138
1203
  happyServer.stop();
1139
1204
  if (geminiBackend) {
@@ -1147,7 +1212,7 @@ async function runGemini(opts) {
1147
1212
  }
1148
1213
  };
1149
1214
  session.rpcHandlerManager.registerHandler("abort", handleAbort);
1150
- registerKillSessionHandler.registerKillSessionHandler(session.rpcHandlerManager, handleKillSession, session);
1215
+ registerKillSessionHandler.registerKillSessionHandler(session.rpcHandlerManager, () => handleKillSession("archive"), session, { processSignals: true, onSignal: () => handleKillSession("offline") });
1151
1216
  const messageBuffer$1 = new messageBuffer.MessageBuffer();
1152
1217
  const hasTTY = process.stdout.isTTY && process.stdin.isTTY;
1153
1218
  let inkInstance = null;
@@ -1250,10 +1315,9 @@ async function runGemini(opts) {
1250
1315
  });
1251
1316
  if (msg.status === "error") {
1252
1317
  logger.logger.debug("[gemini] Error status received:", contentLogMetadata.contentLogMetadata(statusDetail));
1253
- session.sendAgentMessage("gemini", {
1254
- type: "turn_aborted",
1255
- id: node_crypto.randomUUID()
1256
- });
1318
+ }
1319
+ if (msg.status === "stopped") {
1320
+ backendGone = new Error(statusDetail || "gemini process exited");
1257
1321
  }
1258
1322
  if (msg.status === "running") {
1259
1323
  thinking = true;
@@ -1268,31 +1332,6 @@ async function runGemini(opts) {
1268
1332
  messageBuffer$1.addMessage("Thinking...", "system");
1269
1333
  } else if (msg.status === "idle" || msg.status === "stopped") {
1270
1334
  reasoningProcessor.complete();
1271
- } else if (msg.status === "error") {
1272
- thinking = false;
1273
- session.keepAlive(thinking, "remote");
1274
- accumulatedResponse = "";
1275
- isResponseInProgress = false;
1276
- let errorMessage = "Unknown error";
1277
- if (msg.detail) {
1278
- if (typeof msg.detail === "object") {
1279
- const detailObj = msg.detail;
1280
- errorMessage = detailObj.message || detailObj.details || JSON.stringify(detailObj);
1281
- } else {
1282
- errorMessage = String(msg.detail);
1283
- }
1284
- }
1285
- if (errorMessage.includes("Authentication required")) {
1286
- errorMessage = `Authentication required.
1287
- For Google Workspace accounts, run: very-happy gemini project set <project-id>
1288
- Or use a different Google account: very-happy connect gemini
1289
- Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1290
- }
1291
- messageBuffer$1.addMessage(`Error: ${errorMessage}`, "status");
1292
- session.sendAgentMessage("gemini", {
1293
- type: "message",
1294
- message: `Error: ${errorMessage}`
1295
- });
1296
1335
  }
1297
1336
  break;
1298
1337
  case "tool-call":
@@ -1485,55 +1524,68 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1485
1524
  if (!message) {
1486
1525
  break;
1487
1526
  }
1488
- let injectHistoryContext = false;
1489
- if (wasSessionCreated && currentModeHash && message.hash !== currentModeHash) {
1490
- logger.logger.debug("[Gemini] Mode changed \u2013 restarting Gemini session");
1491
- messageBuffer$1.addMessage("\u2550".repeat(40), "status");
1492
- if (conversationHistory.hasHistory()) {
1493
- messageBuffer$1.addMessage(`Switching model (preserving ${conversationHistory.size()} messages of context)...`, "status");
1494
- injectHistoryContext = true;
1495
- logger.logger.debug("[Gemini] Will inject conversation history");
1496
- } else {
1497
- messageBuffer$1.addMessage("Starting new Gemini session (mode changed)...", "status");
1498
- }
1499
- permissionHandler.reset();
1500
- reasoningProcessor.abort();
1501
- if (geminiBackend) {
1502
- await geminiBackend.dispose();
1503
- geminiBackend = null;
1504
- }
1505
- const modelToUse = message.mode?.model === void 0 ? void 0 : message.mode.model || null;
1506
- const backendResult = createGeminiBackend({
1507
- cwd: process.cwd(),
1508
- mcpServers,
1509
- permissionHandler,
1510
- cloudToken,
1511
- currentUserEmail,
1512
- // Pass model from message - if undefined, will use local config/env/default
1513
- // If explicitly null, will skip local config and use env/default
1514
- model: modelToUse
1515
- });
1516
- geminiBackend = backendResult.backend;
1517
- setupGeminiMessageHandler(geminiBackend);
1518
- const actualModel = backendResult.model;
1519
- logger.logger.debug(`[gemini] Model change - modelToUse=${modelToUse}, actualModel=${actualModel} (from ${backendResult.modelSource})`);
1520
- conversationHistory.setCurrentModel(actualModel);
1521
- logger.logger.debug("[gemini] Starting new ACP session with model:", actualModel);
1522
- const { sessionId } = await geminiBackend.startSession();
1523
- acpSessionId = sessionId;
1524
- logger.logger.debug(`[gemini] New ACP session started: ${acpSessionId}`);
1525
- logger.logger.debug(`[gemini] Calling updateDisplayedModel with: ${actualModel}`);
1526
- updateDisplayedModel(actualModel, false);
1527
- updatePermissionMode(message.mode.permissionMode);
1528
- wasSessionCreated = true;
1529
- currentModeHash = message.hash;
1530
- first = false;
1527
+ if (!thinking) {
1528
+ thinking = true;
1529
+ session.keepAlive(thinking, "remote");
1531
1530
  }
1531
+ turnEnding = "completed";
1532
+ let injectHistoryContext = false;
1533
+ let restartAfterExit = false;
1532
1534
  currentModeHash = message.hash;
1533
1535
  const userMessageToShow = message.mode?.originalUserMessage || message.message;
1534
1536
  messageBuffer$1.addMessage(userMessageToShow, "user");
1535
1537
  isProcessingMessage = true;
1536
1538
  try {
1539
+ restartAfterExit = backendGone !== null;
1540
+ if (restartAfterExit) {
1541
+ logger.logger.debug(`[Gemini] Restarting Gemini after it exited: ${backendGone?.message ?? "unknown"}`);
1542
+ backendGone = null;
1543
+ session.sendSessionEvent({ type: "message", message: `Gemini was restarted after its process exited; the conversation so far is re-sent to it as context.` });
1544
+ }
1545
+ if (restartAfterExit || wasSessionCreated && currentModeHash && message.hash !== currentModeHash) {
1546
+ logger.logger.debug("[Gemini] Mode changed or process gone \u2013 restarting Gemini session");
1547
+ messageBuffer$1.addMessage("\u2550".repeat(40), "status");
1548
+ if (conversationHistory.hasHistory()) {
1549
+ messageBuffer$1.addMessage(`${restartAfterExit ? "Restarting Gemini" : "Switching model"} (preserving ${conversationHistory.size()} messages of context)...`, "status");
1550
+ injectHistoryContext = true;
1551
+ logger.logger.debug("[Gemini] Will inject conversation history");
1552
+ } else {
1553
+ messageBuffer$1.addMessage(restartAfterExit ? "Restarting Gemini..." : "Starting new Gemini session (mode changed)...", "status");
1554
+ }
1555
+ permissionHandler.reset();
1556
+ reasoningProcessor.abort();
1557
+ if (geminiBackend) {
1558
+ await geminiBackend.dispose();
1559
+ geminiBackend = null;
1560
+ }
1561
+ acpSessionId = null;
1562
+ const modelToUse = message.mode?.model === void 0 ? void 0 : message.mode.model || null;
1563
+ const backendResult = createGeminiBackend({
1564
+ cwd: process.cwd(),
1565
+ mcpServers,
1566
+ permissionHandler,
1567
+ cloudToken,
1568
+ currentUserEmail,
1569
+ // Pass model from message - if undefined, will use local config/env/default
1570
+ // If explicitly null, will skip local config and use env/default
1571
+ model: modelToUse
1572
+ });
1573
+ geminiBackend = backendResult.backend;
1574
+ setupGeminiMessageHandler(geminiBackend);
1575
+ const actualModel = backendResult.model;
1576
+ logger.logger.debug(`[gemini] Model change - modelToUse=${modelToUse}, actualModel=${actualModel} (from ${backendResult.modelSource})`);
1577
+ conversationHistory.setCurrentModel(actualModel);
1578
+ logger.logger.debug("[gemini] Starting new ACP session with model:", actualModel);
1579
+ const { sessionId } = await geminiBackend.startSession();
1580
+ acpSessionId = sessionId;
1581
+ logger.logger.debug(`[gemini] New ACP session started: ${acpSessionId}`);
1582
+ logger.logger.debug(`[gemini] Calling updateDisplayedModel with: ${actualModel}`);
1583
+ updateDisplayedModel(actualModel, false);
1584
+ updatePermissionMode(message.mode.permissionMode);
1585
+ wasSessionCreated = true;
1586
+ currentModeHash = message.hash;
1587
+ first = false;
1588
+ }
1537
1589
  if (first || !wasSessionCreated) {
1538
1590
  if (!geminiBackend) {
1539
1591
  const modelToUse = message.mode?.model === void 0 ? void 0 : message.mode.model || null;
@@ -1587,49 +1639,37 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1587
1639
  logger.logger.debug("[gemini] Sending prompt to Gemini:", contentLogMetadata.contentLogMetadata(promptToSend));
1588
1640
  const MAX_RETRIES = 3;
1589
1641
  const RETRY_DELAY_MS = 2e3;
1590
- let lastError = null;
1591
1642
  for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
1592
1643
  try {
1593
- await geminiBackend.sendPrompt(acpSessionId, promptToSend);
1594
- logger.logger.debug("[gemini] Prompt sent successfully");
1595
- if (geminiBackend.waitForResponseComplete) {
1596
- await geminiBackend.waitForResponseComplete(12e4);
1597
- logger.logger.debug("[gemini] Response complete");
1644
+ accumulatedResponse = "";
1645
+ isResponseInProgress = false;
1646
+ const outcome = await geminiBackend.sendPrompt(acpSessionId, promptToSend);
1647
+ const stopReason = outcome && typeof outcome === "object" ? outcome.stopReason : void 0;
1648
+ logger.logger.debug(`[gemini] Prompt answered (stopReason=${stopReason ?? "none"})`);
1649
+ if (stopReason === "cancelled") {
1650
+ if (!turnAborted()) {
1651
+ turnEnding = "aborted";
1652
+ session.sendAgentMessage("gemini", { type: "turn_aborted", id: node_crypto.randomUUID() });
1653
+ }
1654
+ } else if (stopReason === "error") {
1655
+ throw new Error("the turn ended with an error reported by the agent");
1656
+ } else if (stopReason && stopReason !== "end_turn") {
1657
+ session.sendSessionEvent({ type: "message", message: `Gemini stopped the turn: ${stopReason}` });
1598
1658
  }
1599
1659
  break;
1600
1660
  } catch (promptError) {
1601
- lastError = promptError;
1602
- const errObj = promptError;
1603
- const errorDetails = errObj?.data?.details || errObj?.details || errObj?.message || "";
1604
- const errorCode = errObj?.code;
1605
- const isQuotaError = errorDetails.includes("exhausted") || errorDetails.includes("quota") || errorDetails.includes("capacity");
1606
- if (isQuotaError) {
1607
- const resetTimeMatch = errorDetails.match(/reset after (\d+h)?(\d+m)?(\d+s)?/i);
1608
- let resetTimeMsg = "";
1609
- if (resetTimeMatch) {
1610
- const parts = resetTimeMatch.slice(1).filter(Boolean).join("");
1611
- resetTimeMsg = ` Quota resets in ${parts}.`;
1612
- }
1613
- const quotaMsg = `Gemini quota exceeded.${resetTimeMsg} Try using a different model (gemini-2.5-flash-lite) or wait for quota reset.`;
1614
- messageBuffer$1.addMessage(quotaMsg, "status");
1615
- session.sendAgentMessage("gemini", { type: "message", message: quotaMsg });
1616
- throw promptError;
1617
- }
1618
- const isEmptyResponseError = errorDetails.includes("empty response") || errorDetails.includes("Model stream ended");
1619
- const isInternalError = errorCode === -32603;
1620
- const isRetryable = isEmptyResponseError || isInternalError;
1621
- if (isRetryable && attempt < MAX_RETRIES) {
1622
- logger.logger.debug(`[gemini] Retryable error on attempt ${attempt}/${MAX_RETRIES}:`, contentLogMetadata.contentLogMetadata(errorDetails));
1623
- messageBuffer$1.addMessage(`Gemini returned empty response, retrying (${attempt}/${MAX_RETRIES})...`, "status");
1661
+ if (isRetryableGeminiError(promptError) && attempt < MAX_RETRIES) {
1662
+ const notice = describeGeminiRetry(attempt, MAX_RETRIES, promptError);
1663
+ logger.logger.debug(`[gemini] Retryable error on attempt ${attempt}/${MAX_RETRIES}:`, contentLogMetadata.errorLogMetadata(promptError));
1664
+ messageBuffer$1.addMessage(notice, "status");
1665
+ session.sendSessionEvent({ type: "message", message: notice });
1624
1666
  await new Promise((resolve2) => setTimeout(resolve2, RETRY_DELAY_MS * attempt));
1667
+ if (turnAborted()) throw promptError;
1625
1668
  continue;
1626
1669
  }
1627
1670
  throw promptError;
1628
1671
  }
1629
1672
  }
1630
- if (lastError && MAX_RETRIES > 1) {
1631
- logger.logger.debug("[gemini] Prompt succeeded after retries");
1632
- }
1633
1673
  if (first) {
1634
1674
  first = false;
1635
1675
  }
@@ -1637,49 +1677,22 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1637
1677
  logger.logger.debug("[gemini] Error in gemini session:", contentLogMetadata.errorLogMetadata(error));
1638
1678
  const isAbortError = error instanceof Error && error.name === "AbortError";
1639
1679
  if (isAbortError) {
1680
+ turnEnding = "aborted";
1640
1681
  messageBuffer$1.addMessage("Aborted by user", "status");
1641
1682
  session.sendSessionEvent({ type: "message", message: "Aborted by user" });
1642
1683
  } else {
1643
- let errorMsg = "Process error occurred";
1644
- if (typeof error === "object" && error !== null) {
1645
- const errObj = error;
1646
- const errorDetails = errObj.data?.details || errObj.details || "";
1647
- const errorCode = errObj.code || errObj.status || errObj.response?.status;
1648
- const errorMessage = errObj.message || errObj.error?.message || "";
1649
- const errorString = String(error);
1650
- if (errorCode === 404 || errorDetails.includes("notFound") || errorDetails.includes("404") || errorMessage.includes("not found") || errorMessage.includes("404")) {
1651
- const currentModel2 = displayedModel || "gemini-2.5-pro";
1652
- errorMsg = `Model "${currentModel2}" not found. Available models: gemini-2.5-pro, gemini-2.5-flash, gemini-2.5-flash-lite`;
1653
- } else if (errorCode === -32603 || errorDetails.includes("empty response") || errorDetails.includes("Model stream ended")) {
1654
- errorMsg = "Gemini API returned empty response after retries. This is a temporary issue - please try again.";
1655
- } else if (errorCode === 429 || errorDetails.includes("429") || errorMessage.includes("429") || errorString.includes("429") || errorDetails.includes("rateLimitExceeded") || errorDetails.includes("RESOURCE_EXHAUSTED") || errorMessage.includes("Rate limit exceeded") || errorMessage.includes("Resource exhausted") || errorString.includes("rateLimitExceeded") || errorString.includes("RESOURCE_EXHAUSTED")) {
1656
- errorMsg = "Gemini API rate limit exceeded. Please wait a moment and try again. The API will retry automatically.";
1657
- } else if (errorDetails.includes("quota") || errorMessage.includes("quota") || errorString.includes("quota") || errorDetails.includes("exhausted") || errorDetails.includes("capacity")) {
1658
- const resetTimeMatch = (errorDetails + errorMessage + errorString).match(/reset after (\d+h)?(\d+m)?(\d+s)?/i);
1659
- let resetTimeMsg = "";
1660
- if (resetTimeMatch) {
1661
- const parts = resetTimeMatch.slice(1).filter(Boolean).join("");
1662
- resetTimeMsg = ` Quota resets in ${parts}.`;
1663
- }
1664
- errorMsg = `Gemini quota exceeded.${resetTimeMsg} Try using a different model (gemini-2.5-flash-lite) or wait for quota reset.`;
1665
- } else if (errorMessage.includes("Authentication required") || errorDetails.includes("Authentication required") || errorCode === -32e3) {
1666
- errorMsg = `Authentication required. For Google Workspace accounts, you need to set a Google Cloud Project:
1667
- very-happy gemini project set <your-project-id>
1668
- Or use a different Google account: very-happy connect gemini
1669
- Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1670
- } else if (Object.keys(error).length === 0) {
1671
- errorMsg = 'Failed to start Gemini. Is "gemini" CLI installed? Run: npm install -g @google/gemini-cli';
1672
- } else if (errObj.message || errorMessage) {
1673
- errorMsg = errorDetails || errorMessage || errObj.message;
1674
- }
1675
- } else if (error instanceof Error) {
1676
- errorMsg = error.message;
1684
+ const failure = describeGeminiFailure(error, { model: displayedModel || "gemini-2.5-pro" });
1685
+ if (failure.kind === "exited" && error instanceof Error) {
1686
+ backendGone = error;
1687
+ } else if (restartAfterExit && !acpSessionId && error instanceof Error) {
1688
+ backendGone = error;
1689
+ }
1690
+ messageBuffer$1.addMessage(failure.message, "status");
1691
+ session.sendSessionEvent({ type: "message", message: failure.message });
1692
+ if (!turnAborted()) {
1693
+ turnEnding = "failed";
1694
+ session.sendAgentMessage("gemini", { type: "turn_aborted", id: node_crypto.randomUUID() });
1677
1695
  }
1678
- messageBuffer$1.addMessage(errorMsg, "status");
1679
- session.sendAgentMessage("gemini", {
1680
- type: "message",
1681
- message: errorMsg
1682
- });
1683
1696
  }
1684
1697
  } finally {
1685
1698
  permissionHandler.reset();
@@ -1707,10 +1720,12 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1707
1720
  accumulatedResponse = "";
1708
1721
  isResponseInProgress = false;
1709
1722
  }
1710
- session.sendAgentMessage("gemini", {
1711
- type: "task_complete",
1712
- id: node_crypto.randomUUID()
1713
- });
1723
+ if (turnEnding === "completed") {
1724
+ session.sendAgentMessage("gemini", {
1725
+ type: "task_complete",
1726
+ id: node_crypto.randomUUID()
1727
+ });
1728
+ }
1714
1729
  hadToolCallInTurn = false;
1715
1730
  pendingChangeTitle = false;
1716
1731
  changeTitleCompleted = false;