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
@@ -1,83 +1,83 @@
1
1
  'use strict';
2
2
 
3
- var logger = require('./logger-C7dRaCkE.cjs');
4
- var controlClient = require('./controlClient-CtsQMw--.cjs');
3
+ var logger = require('./logger-LvwVeATU.cjs');
4
+ var controlClient = require('./controlClient-SX8gSza2.cjs');
5
5
  var backgroundTaskActivity = require('./backgroundTaskActivity-CBvUdj39.cjs');
6
6
  var node_crypto = require('node:crypto');
7
7
  var messageBuffer = require('./messageBuffer-fJMH6uY8.cjs');
8
- var index = require('./index-D3kI0hDR.cjs');
8
+ var index = require('./index-DFPT4HOO.cjs');
9
9
  var claudeAgentSdk = require('@anthropic-ai/claude-agent-sdk');
10
10
  var permissionMode = require('./permissionMode-CrV-XuMs.cjs');
11
- var systemPrompt = require('./systemPrompt-DaTKLEb-.cjs');
11
+ var systemPrompt = require('./systemPrompt-DtibzbRU.cjs');
12
12
  var path$1 = require('node:path');
13
- var specialCommands = require('./specialCommands-DGUeZqdm.cjs');
13
+ var specialCommands = require('./specialCommands-DbntVs0d.cjs');
14
14
  require('axios');
15
15
  require('node:events');
16
16
  require('socket.io-client');
17
- var attachmentLimits = require('./attachmentLimits-D6bT2jU1.cjs');
17
+ var attachmentLimits = require('./attachmentLimits-DtFqqiwR.cjs');
18
18
  require('tweetnacl');
19
- var configuration = require('./configuration-UV4EE5ui.cjs');
20
- require('./index-BZdhwBKa.cjs');
21
- require('./registerCommonHandlers-B7QZxkCL.cjs');
19
+ var configuration = require('./configuration-DZPy0T9Z.cjs');
20
+ require('./index-De8L5lFK.cjs');
21
+ require('./registerCommonHandlers-60VuTkdg.cjs');
22
22
  require('os');
23
23
  require('child_process');
24
24
  require('@paralleldrive/cuid2');
25
- require('./persistence-DweHi8xa.cjs');
25
+ require('./persistence-DXbKOHxl.cjs');
26
26
  var contentLogMetadata = require('./contentLogMetadata-ZSFk_NjQ.cjs');
27
27
  require('chalk');
28
28
  var types = require('./types-CRS-srZK.cjs');
29
29
  var path = require('./path-B7zW-WwE.cjs');
30
30
  var fs = require('fs/promises');
31
- var time = require('./time-0szhiPo4.cjs');
31
+ var time = require('./time-Dg5tVB8S.cjs');
32
32
  var node_fs = require('node:fs');
33
- var deterministicJson = require('./deterministicJson-je21npNx.cjs');
34
- var sessionScanner = require('./sessionScanner-BpegdnXK.cjs');
33
+ var deterministicJson = require('./deterministicJson-ChGfQEF6.cjs');
34
+ var sessionScanner = require('./sessionScanner-CQL_WSaC.cjs');
35
35
  var node_child_process = require('node:child_process');
36
- var streamRelay = require('./streamRelay-DqPFsCgx.cjs');
37
- var attachmentContent = require('./attachmentContent-4L9dO8E3.cjs');
36
+ var streamRelay = require('./streamRelay-Cx01enfe.cjs');
37
+ var attachmentContent = require('./attachmentContent-kJKXpkMX.cjs');
38
38
  var promises = require('node:fs/promises');
39
- var claudeSessionFork = require('./claudeSessionFork-DQk5-dzR.cjs');
40
- var registerKillSessionHandler = require('./registerKillSessionHandler-CcX84g-T.cjs');
41
- var doctor = require('./doctor-BXKcYVGU.cjs');
39
+ var claudeSessionFork = require('./claudeSessionFork-CbDfm8Fz.cjs');
40
+ var registerKillSessionHandler = require('./registerKillSessionHandler-pqChBKwO.cjs');
41
+ var doctor = require('./doctor-BsN3JZJn.cjs');
42
42
  var node_http = require('node:http');
43
43
  var editPaths = require('./editPaths-Bqp4OFPw.cjs');
44
44
  var projectPath = require('./projectPath-ChLhdOyt.cjs');
45
- var titleGenerator = require('./titleGenerator-Dz5P7sE1.cjs');
45
+ var titleGenerator = require('./titleGenerator-BMEaDTwU.cjs');
46
46
  var oneShotPrompts = require('./oneShotPrompts-CL0dip9C.cjs');
47
- var reportProgressTool = require('./reportProgressTool-DzMi4mvH.cjs');
47
+ var reportProgressTool = require('./reportProgressTool-Du_zAK4h.cjs');
48
48
  require('node:util');
49
49
  require('./smallFastModel-D_uxGMo3.cjs');
50
50
  require('./trimIdent-4gvk9Wk6.cjs');
51
51
  require('node:os');
52
52
  require('./agentGuidance-BtBx2xxE.cjs');
53
- require('./rateLimitWindows-Bp4T21RI.cjs');
53
+ require('./rateLimitWindows-DFnMU2Vt.cjs');
54
54
  require('zod');
55
- require('./package-VqWv7EI5.cjs');
55
+ require('./package-Ch9WGDV_.cjs');
56
56
  require('util');
57
57
  require('crypto');
58
58
  require('path');
59
59
  require('cross-spawn');
60
60
  require('./authRelay-BdYkC1Po.cjs');
61
- require('./client-BHZVyQwi.cjs');
62
- require('./context-BmH2BKip.cjs');
63
- require('./sessionOps-9MChM9Op.cjs');
61
+ require('./client-DyvBTYee.cjs');
62
+ require('./context-BKbrZ55r.cjs');
63
+ require('./sessionOps-Dmt7WUUs.cjs');
64
64
  require('./resources-JDPugcDq.cjs');
65
- require('./tools-C77-Ssan.cjs');
66
- require('./peerTools-BktGmlpd.cjs');
65
+ require('./tools-DDKTB5aQ.cjs');
66
+ require('./peerTools-DtGKWli5.cjs');
67
67
  require('./ids-B6ZC0HGt.cjs');
68
- require('./remoteSessionClient-CL3akj0K.cjs');
68
+ require('./remoteSessionClient-B7NvjHD3.cjs');
69
69
  require('@modelcontextprotocol/sdk/server/mcp.js');
70
70
  require('@modelcontextprotocol/sdk/server/streamableHttp.js');
71
71
  require('./limits-C-a7gr04.cjs');
72
- require('./downloadTarget-JC7FZl7W.cjs');
72
+ require('./downloadTarget-Dj3WoVJa.cjs');
73
73
  require('./terminals-B_bfC9c2.cjs');
74
74
  require('./terminalTitleSuggest-DhvRFX3H.cjs');
75
75
  require('./tmuxSocket-D-Xt6Vn-.cjs');
76
- require('./bootstrap-DTJ6-vYT.cjs');
76
+ require('./bootstrap-6OI698q9.cjs');
77
77
  require('./previewPath-B0rBdhy1.cjs');
78
- require('./sync-BK-IBkuB.cjs');
78
+ require('./sync-C7sxoUYG.cjs');
79
79
  require('./transcriptCursor-DcXGLeSc.cjs');
80
- require('./startFileWatcher-BtBaahTn.cjs');
80
+ require('./startFileWatcher-C292fhra.cjs');
81
81
  require('node:readline');
82
82
  require('./doctor-u46qYYKX.cjs');
83
83
  require('ps-list');
@@ -85,11 +85,11 @@ require('./doctorReadiness-BCZGcN0a.cjs');
85
85
  require('./detectCLI-DR9ZaN6B.cjs');
86
86
  require('fs');
87
87
  require('./cliUpdate-DsKXPFYp.cjs');
88
- require('./piRunnerArgs-BNzWTNRV.cjs');
89
- require('./sessionModeFile-DhuTNcJr.cjs');
88
+ require('./piRunnerArgs-BVRZe2AR.cjs');
89
+ require('./sessionModeFile-CsLtn_PL.cjs');
90
90
  require('url');
91
91
  require('node:module');
92
- require('./client-BhLhjj_x.cjs');
92
+ require('./client-COmgDDy0.cjs');
93
93
  require('./precheckCompat-CWOi5c9L.cjs');
94
94
 
95
95
  const SCHEDULE_WAKEUP_GRACE_MS = 6e4;
@@ -1023,17 +1023,159 @@ function createClaudePrewarmLease(input) {
1023
1023
  return lease;
1024
1024
  }
1025
1025
 
1026
- function withTimeout(promise, ms) {
1026
+ class TimeoutError extends Error {
1027
+ constructor(message) {
1028
+ super(message);
1029
+ this.name = "TimeoutError";
1030
+ }
1031
+ }
1032
+ function withTimeout(promise, ms, label) {
1027
1033
  promise.catch(() => {
1028
1034
  });
1029
1035
  let timer;
1030
1036
  const timeout = new Promise((_, reject) => {
1031
- timer = setTimeout(() => reject(new Error(`timed out after ${ms}ms`)), ms);
1037
+ timer = setTimeout(() => reject(new TimeoutError(`${label ? `${label} ` : ""}timed out after ${ms}ms`)), ms);
1032
1038
  });
1033
1039
  return Promise.race([promise, timeout]).finally(() => {
1034
1040
  if (timer) clearTimeout(timer);
1035
1041
  });
1036
1042
  }
1043
+
1044
+ function readClaudeSessionState(message) {
1045
+ const m = message;
1046
+ if (!m || m.type !== "system" || m.subtype !== "session_state_changed") return null;
1047
+ return m.state === "idle" || m.state === "running" || m.state === "requires_action" ? m.state : null;
1048
+ }
1049
+ function createClaudeTurnTracker() {
1050
+ let pending = false;
1051
+ let open = false;
1052
+ let idleOwed = 0;
1053
+ return {
1054
+ get isOpen() {
1055
+ return open;
1056
+ },
1057
+ get isPending() {
1058
+ return pending;
1059
+ },
1060
+ /** A prompt was pushed into the Query. Not a turn yet: the CLI has to pick it up. */
1061
+ pushed() {
1062
+ pending = true;
1063
+ },
1064
+ /** The CLI reported `init` for a turn: it is running. Idempotent. */
1065
+ announced() {
1066
+ open = true;
1067
+ pending = false;
1068
+ },
1069
+ /** A `result` frame: true when it ends the turn (the caller runs its turn-end), false when the turn already ended. */
1070
+ onResult() {
1071
+ if (!open && !pending) return false;
1072
+ open = false;
1073
+ pending = false;
1074
+ idleOwed += 1;
1075
+ return true;
1076
+ },
1077
+ onSessionState(state) {
1078
+ if (state === "running") {
1079
+ idleOwed = 0;
1080
+ open = true;
1081
+ pending = false;
1082
+ return "ignore";
1083
+ }
1084
+ if (state !== "idle") return "ignore";
1085
+ if (idleOwed > 0) {
1086
+ idleOwed -= 1;
1087
+ return "duplicate";
1088
+ }
1089
+ if (!open) return "ignore";
1090
+ open = false;
1091
+ return "end";
1092
+ }
1093
+ };
1094
+ }
1095
+
1096
+ const CLAUDE_COMMAND_LIFECYCLE_STATES = ["queued", "started", "completed", "cancelled", "discarded", "refused"];
1097
+ function readClaudeCommandLifecycle(frame) {
1098
+ const m = frame;
1099
+ if (!m) return null;
1100
+ const isLifecycle = m.type === "command_lifecycle" || m.type === "system" && m.subtype === "command_lifecycle";
1101
+ if (!isLifecycle || typeof m.command_uuid !== "string" || m.command_uuid.length === 0) return null;
1102
+ const state = CLAUDE_COMMAND_LIFECYCLE_STATES.find((candidate) => candidate === m.state);
1103
+ return state ? { uuid: m.command_uuid, state } : null;
1104
+ }
1105
+ const uuidList = (value) => Array.isArray(value) ? value.filter((item) => typeof item === "string" && item.length > 0) : [];
1106
+ const INTERRUPT_CANCEL_QUEUED_CAPABILITY = "interrupt_cancel_queued_v1";
1107
+ const PENDING_MAX = 256;
1108
+ const REPORTED_MAX = 512;
1109
+ function createClaudeCommandTracker() {
1110
+ const pending = /* @__PURE__ */ new Map();
1111
+ const reported = /* @__PURE__ */ new Set();
1112
+ const drop = (uuid) => {
1113
+ pending.delete(uuid);
1114
+ if (reported.has(uuid)) return null;
1115
+ reported.add(uuid);
1116
+ if (reported.size > REPORTED_MAX) reported.delete(reported.values().next().value);
1117
+ return uuid;
1118
+ };
1119
+ return {
1120
+ /** A uuid-stamped user message (prompt or steer) was handed to the Query. */
1121
+ track(uuid) {
1122
+ if (!pending.has(uuid) && pending.size >= PENDING_MAX) pending.delete(pending.keys().next().value);
1123
+ pending.set(uuid, { started: false });
1124
+ },
1125
+ isTracked(uuid) {
1126
+ return pending.has(uuid);
1127
+ },
1128
+ /** A lifecycle frame; returns the uuids now known to have never run. */
1129
+ observe(lifecycle) {
1130
+ const entry = pending.get(lifecycle.uuid);
1131
+ if (!entry) return [];
1132
+ switch (lifecycle.state) {
1133
+ case "queued":
1134
+ return [];
1135
+ case "started":
1136
+ entry.started = true;
1137
+ return [];
1138
+ case "completed":
1139
+ pending.delete(lifecycle.uuid);
1140
+ return [];
1141
+ default: {
1142
+ if (entry.started) {
1143
+ pending.delete(lifecycle.uuid);
1144
+ return [];
1145
+ }
1146
+ const dropped = drop(lifecycle.uuid);
1147
+ return dropped ? [dropped] : [];
1148
+ }
1149
+ }
1150
+ },
1151
+ /**
1152
+ * An interrupt's receipt: `cancelled` members we track never ran;
1153
+ * `still_queued` members we track are returned for the per-uuid
1154
+ * follow-up (`cancel_async_message`) a CLI without cancel_queued needs.
1155
+ */
1156
+ onInterruptReceipt(receipt) {
1157
+ const dropped = [];
1158
+ for (const uuid of uuidList(receipt?.cancelled)) {
1159
+ if (!pending.has(uuid)) continue;
1160
+ const result = drop(uuid);
1161
+ if (result) dropped.push(result);
1162
+ }
1163
+ const stillQueued = uuidList(receipt?.still_queued).filter((uuid) => pending.has(uuid));
1164
+ return { dropped, stillQueued };
1165
+ },
1166
+ /** The answer to `cancel_async_message`: true = withdrawn before it ran; false = already dequeued, its lifecycle frames follow. */
1167
+ onCancelResponse(uuid, cancelled) {
1168
+ if (!cancelled || !pending.has(uuid)) return [];
1169
+ const dropped = drop(uuid);
1170
+ return dropped ? [dropped] : [];
1171
+ },
1172
+ clear() {
1173
+ pending.clear();
1174
+ }
1175
+ };
1176
+ }
1177
+
1178
+ const SET_MODEL_TIMEOUT_MS = 3e4;
1037
1179
  const PROMPT_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
1038
1180
  function promptUuid(uuid) {
1039
1181
  return uuid && PROMPT_UUID_RE.test(uuid) ? { uuid } : {};
@@ -1078,6 +1220,14 @@ async function claudeRemote(opts) {
1078
1220
  }
1079
1221
  }
1080
1222
  };
1223
+ const turn = createClaudeTurnTracker();
1224
+ const commandTracker = createClaudeCommandTracker();
1225
+ let cliCapabilities = /* @__PURE__ */ new Set();
1226
+ const reportDroppedCommands = (uuids) => {
1227
+ if (uuids.length === 0) return;
1228
+ logger.logger.debug(`[claudeRemote] ${uuids.length} user message(s) were never read by Claude Code: ${uuids.join(", ")}`);
1229
+ opts.onCommandsDropped?.(uuids);
1230
+ };
1081
1231
  let callbackDepth = 0;
1082
1232
  const guardCallback = (callback) => (async (...args) => {
1083
1233
  callbackDepth++;
@@ -1335,7 +1485,19 @@ async function claudeRemote(opts) {
1335
1485
  setPermissionMode: (mode2) => response.setPermissionMode(mode2),
1336
1486
  setModel: (model) => response.setModel(modelTarget(model)),
1337
1487
  interrupt: async () => {
1338
- await response.interrupt();
1488
+ const cancelQueued = cliCapabilities.has(INTERRUPT_CANCEL_QUEUED_CAPABILITY);
1489
+ const receipt = await response.interrupt(cancelQueued ? { cancelQueued: true } : void 0);
1490
+ const { dropped, stillQueued } = commandTracker.onInterruptReceipt(receipt);
1491
+ if (!cancelQueued && stillQueued.length > 0) {
1492
+ const cancelAsyncMessage = response.cancelAsyncMessage;
1493
+ if (typeof cancelAsyncMessage === "function") {
1494
+ for (const uuid of stillQueued) {
1495
+ const cancelled = await cancelAsyncMessage.call(response, uuid).then((value) => value === true, () => false);
1496
+ dropped.push(...commandTracker.onCancelResponse(uuid, cancelled));
1497
+ }
1498
+ }
1499
+ }
1500
+ reportDroppedCommands(dropped);
1339
1501
  },
1340
1502
  // `request` is the SDK's generic control-request sender (every typed
1341
1503
  // method wraps it); the public types omit `side_question`, the CLI
@@ -1345,19 +1507,90 @@ async function claudeRemote(opts) {
1345
1507
  const body = raw?.response;
1346
1508
  return body && typeof body === "object" ? body : { response: null };
1347
1509
  },
1348
- steer: (message, nextMode) => {
1510
+ steer: (message, nextMode, localKey) => {
1349
1511
  mode = { ...nextMode, model: mode.model };
1512
+ const uuid = promptUuid(localKey);
1513
+ if (uuid.uuid) commandTracker.track(uuid.uuid);
1350
1514
  messages.push({
1351
1515
  type: "user",
1352
1516
  parent_tool_use_id: null,
1353
1517
  priority: "now",
1354
1518
  origin: { kind: "human" },
1519
+ ...uuid,
1355
1520
  message: { role: "user", content: message }
1356
1521
  });
1357
1522
  }
1358
1523
  });
1359
1524
  }
1360
1525
  let lastAssistantError;
1526
+ turn.pushed();
1527
+ if (initialUserMessage.uuid) commandTracker.track(initialUserMessage.uuid);
1528
+ let modelUnconfirmed = false;
1529
+ let pullingNext = false;
1530
+ const pullNextMessage = () => {
1531
+ if (pullingNext) {
1532
+ logger.logger.debug("[claudeRemote] Already waiting for the next message");
1533
+ return;
1534
+ }
1535
+ pullingNext = true;
1536
+ opts.nextMessage().then(async (next) => {
1537
+ if (!next) {
1538
+ messages.end();
1539
+ return;
1540
+ }
1541
+ if (modelUnconfirmed || needsModelSwitch(mode.model, next.mode.model)) {
1542
+ try {
1543
+ await withTimeout(response.setModel(modelTarget(next.mode.model)), SET_MODEL_TIMEOUT_MS, "set_model");
1544
+ modelUnconfirmed = false;
1545
+ logger.logger.debug(`[claudeRemote] Model switched to ${modelTarget(next.mode.model) ?? "default"}`);
1546
+ } catch (e) {
1547
+ logger.logger.debug(`[claudeRemote] setModel failed: ${e instanceof Error ? e.message : String(e)}`);
1548
+ opts.onCompletionEvent?.(modelSwitchFailureNotice(next.mode.model, e));
1549
+ if (e instanceof TimeoutError) modelUnconfirmed = true;
1550
+ next = { ...next, mode: { ...next.mode, model: mode.model } };
1551
+ }
1552
+ }
1553
+ mode = next.mode;
1554
+ updateThinking(true);
1555
+ turn.pushed();
1556
+ const uuid = promptUuid(next.uuid);
1557
+ if (uuid.uuid) commandTracker.track(uuid.uuid);
1558
+ timingMarks = { pushedAt: next.enqueuedAt ?? Date.now() };
1559
+ messages.push({
1560
+ type: "user",
1561
+ parent_tool_use_id: null,
1562
+ origin: { kind: "human" },
1563
+ ...uuid,
1564
+ message: { role: "user", content: next.message }
1565
+ });
1566
+ }).catch(() => {
1567
+ messages.end();
1568
+ }).finally(() => {
1569
+ pullingNext = false;
1570
+ });
1571
+ };
1572
+ const recycleIfPoisoned = (result) => {
1573
+ const recycleReason = queryRecycleReason(result ?? { }, lastAssistantError);
1574
+ lastAssistantError = void 0;
1575
+ if (!recycleReason) return false;
1576
+ logger.logger.warn(`[claudeRemote] Ending SDK query after ${recycleReason}; the next message starts a fresh Claude Code process`);
1577
+ opts.onCompletionEvent?.(QUERY_RECYCLE_NOTICE[recycleReason]);
1578
+ opts.onAuthFailure?.(recycleReason);
1579
+ messages.end();
1580
+ return true;
1581
+ };
1582
+ const endTurnWithoutResult = () => {
1583
+ updateThinking(false);
1584
+ logger.logger.debug(`[claudeRemote] Turn ${timingTurn} ended by session_state_changed idle without a result frame`);
1585
+ timingTurn++;
1586
+ timingMarks = {};
1587
+ if (isCompactCommand) {
1588
+ logger.logger.debug("[claudeRemote] /compact ended without a result; outcome unknown");
1589
+ isCompactCommand = false;
1590
+ }
1591
+ opts.onReady(void 0);
1592
+ if (!recycleIfPoisoned()) pullNextMessage();
1593
+ };
1361
1594
  updateThinking(true);
1362
1595
  try {
1363
1596
  logger.logger.debug(`[claudeRemote] Starting to iterate over response`);
@@ -1389,9 +1622,22 @@ async function claudeRemote(opts) {
1389
1622
  }
1390
1623
  const outboundMessage = isCompactCommand && message.type === "assistant" ? { ...message, isCompactSummary: true } : message;
1391
1624
  opts.onMessage(outboundMessage);
1625
+ const lifecycle = readClaudeCommandLifecycle(message);
1626
+ if (lifecycle) reportDroppedCommands(commandTracker.observe(lifecycle));
1627
+ const sessionState = readClaudeSessionState(message);
1628
+ if (sessionState) {
1629
+ const verdict = turn.onSessionState(sessionState);
1630
+ if (verdict === "end") {
1631
+ endTurnWithoutResult();
1632
+ } else {
1633
+ logger.logger.debug(`[claudeRemote] session_state_changed ${sessionState}: ${verdict}`);
1634
+ }
1635
+ }
1392
1636
  if (message.type === "system" && message.subtype === "init") {
1393
1637
  updateThinking(true);
1638
+ turn.announced();
1394
1639
  const systemInit = message;
1640
+ cliCapabilities = new Set(Array.isArray(systemInit.capabilities) ? systemInit.capabilities : []);
1395
1641
  if (opts.onSDKMetadata) {
1396
1642
  opts.onSDKMetadata({
1397
1643
  models,
@@ -1424,8 +1670,9 @@ async function claudeRemote(opts) {
1424
1670
  }
1425
1671
  }
1426
1672
  if (message.type === "result") {
1673
+ const endsTurn = turn.onResult();
1427
1674
  updateThinking(false);
1428
- logger.logger.debug("[claudeRemote] Result received");
1675
+ logger.logger.debug(endsTurn ? "[claudeRemote] Result received" : "[claudeRemote] Result received for a turn already ended by idle");
1429
1676
  logger.logger.debug(formatClaudeTimingLine({
1430
1677
  turn: timingTurn,
1431
1678
  firstTurnOfProcess: timingTurn === 1,
@@ -1447,44 +1694,9 @@ async function claudeRemote(opts) {
1447
1694
  }
1448
1695
  isCompactCommand = false;
1449
1696
  }
1450
- opts.onReady(message);
1451
- const recycleReason = queryRecycleReason(message, lastAssistantError);
1452
- lastAssistantError = void 0;
1453
- if (recycleReason) {
1454
- logger.logger.warn(`[claudeRemote] Ending SDK query after ${recycleReason}; the next message starts a fresh Claude Code process`);
1455
- opts.onCompletionEvent?.(QUERY_RECYCLE_NOTICE[recycleReason]);
1456
- opts.onAuthFailure?.(recycleReason);
1457
- messages.end();
1458
- continue;
1459
- }
1460
- opts.nextMessage().then(async (next) => {
1461
- if (!next) {
1462
- messages.end();
1463
- return;
1464
- }
1465
- if (needsModelSwitch(mode.model, next.mode.model)) {
1466
- try {
1467
- await response.setModel(modelTarget(next.mode.model));
1468
- logger.logger.debug(`[claudeRemote] Model switched to ${modelTarget(next.mode.model) ?? "default"}`);
1469
- } catch (e) {
1470
- logger.logger.debug(`[claudeRemote] setModel failed: ${e instanceof Error ? e.message : String(e)}`);
1471
- opts.onCompletionEvent?.(modelSwitchFailureNotice(next.mode.model, e));
1472
- next = { ...next, mode: { ...next.mode, model: mode.model } };
1473
- }
1474
- }
1475
- mode = next.mode;
1476
- updateThinking(true);
1477
- timingMarks = { pushedAt: next.enqueuedAt ?? Date.now() };
1478
- messages.push({
1479
- type: "user",
1480
- parent_tool_use_id: null,
1481
- origin: { kind: "human" },
1482
- ...promptUuid(next.uuid),
1483
- message: { role: "user", content: next.message }
1484
- });
1485
- }).catch(() => {
1486
- messages.end();
1487
- });
1697
+ if (endsTurn) opts.onReady(message);
1698
+ if (recycleIfPoisoned(message)) continue;
1699
+ if (endsTurn) pullNextMessage();
1488
1700
  }
1489
1701
  if (message.type === "user") {
1490
1702
  const msg = message;
@@ -1522,6 +1734,7 @@ function getToolDescriptor(toolName) {
1522
1734
  return { edit: false, exitPlan: false, dangerous: false };
1523
1735
  }
1524
1736
 
1737
+ const LIVE_PERMISSION_MODE_TIMEOUT_MS = 15e3;
1525
1738
  function elicitationContent(input) {
1526
1739
  if (!input) return void 0;
1527
1740
  const content = {};
@@ -1618,10 +1831,16 @@ class PermissionHandler {
1618
1831
  return;
1619
1832
  }
1620
1833
  await new Promise((resolve) => setImmediate(resolve));
1621
- await this.setPermissionModeCallback(mode);
1834
+ await withTimeout(this.setPermissionModeCallback(mode), LIVE_PERMISSION_MODE_TIMEOUT_MS, "set_permission_mode");
1622
1835
  } catch (error) {
1623
1836
  this.permissionMode = previousMode;
1624
1837
  if (this.deferredPermissionMode === mode) this.deferredPermissionMode = void 0;
1838
+ if (error instanceof TimeoutError && this.setPermissionModeCallback) {
1839
+ this.setPermissionModeCallback(previousMode).then(
1840
+ () => logger.logger.debug(`[PermissionHandler] Re-asserted ${previousMode} after the switch to ${mode} timed out`),
1841
+ (reassertError) => logger.logger.debug("[PermissionHandler] Re-asserting the previous permission mode failed", reassertError)
1842
+ );
1843
+ }
1625
1844
  throw error;
1626
1845
  }
1627
1846
  }
@@ -1632,7 +1851,7 @@ class PermissionHandler {
1632
1851
  setImmediate(() => {
1633
1852
  const task = this.modeChangeQueue.then(async () => {
1634
1853
  if (!this.setPermissionModeCallback || this.permissionMode !== mode) return;
1635
- await this.setPermissionModeCallback(mode);
1854
+ await withTimeout(this.setPermissionModeCallback(mode), LIVE_PERMISSION_MODE_TIMEOUT_MS, "set_permission_mode");
1636
1855
  });
1637
1856
  this.modeChangeQueue = task.catch((error) => {
1638
1857
  logger.logger.debug("[PermissionHandler] Deferred SDK permission mode update failed", error);
@@ -2265,6 +2484,7 @@ class SDKToLogConverter {
2265
2484
  timestamp
2266
2485
  };
2267
2486
  let logMessage = null;
2487
+ if (sdkMessage.type === "command_lifecycle") return null;
2268
2488
  switch (sdkMessage.type) {
2269
2489
  case "user": {
2270
2490
  const userMsg = sdkMessage;
@@ -2704,10 +2924,13 @@ function applyClaudeSdkMetadata(current, update) {
2704
2924
  };
2705
2925
  }
2706
2926
 
2707
- function createTurnSteeringController() {
2927
+ const INTERRUPT_TIMEOUT_MS = 8e3;
2928
+ function createTurnSteeringController(opts = {}) {
2929
+ const interruptTimeoutMs = opts.interruptTimeoutMs ?? INTERRUPT_TIMEOUT_MS;
2708
2930
  let interrupt = null;
2709
2931
  let steering = false;
2710
2932
  let interrupting = false;
2933
+ const boundedInterrupt = (run) => withTimeout(run(), interruptTimeoutMs, "interrupt");
2711
2934
  return {
2712
2935
  setInterrupt(next) {
2713
2936
  interrupt = next;
@@ -2716,7 +2939,7 @@ function createTurnSteeringController() {
2716
2939
  if (!interrupt) return false;
2717
2940
  steering = true;
2718
2941
  try {
2719
- await interrupt();
2942
+ await boundedInterrupt(interrupt);
2720
2943
  return true;
2721
2944
  } catch (error) {
2722
2945
  steering = false;
@@ -2734,7 +2957,7 @@ function createTurnSteeringController() {
2734
2957
  if (!interrupt) return false;
2735
2958
  interrupting = true;
2736
2959
  try {
2737
- await interrupt();
2960
+ await boundedInterrupt(interrupt);
2738
2961
  return true;
2739
2962
  } catch (error) {
2740
2963
  interrupting = false;
@@ -3357,6 +3580,56 @@ async function persistRewindRecord(client, record, opts = {}) {
3357
3580
  }
3358
3581
  }
3359
3582
 
3583
+ const int = (value) => typeof value === "number" && Number.isFinite(value) ? Math.trunc(value) : null;
3584
+ function delayText(ms) {
3585
+ if (ms < 1e3) return `${ms}ms`;
3586
+ const seconds = ms / 1e3;
3587
+ return `${Number.isInteger(seconds) ? seconds : seconds.toFixed(1)}s`;
3588
+ }
3589
+ function describeClaudeApiRetry(frame) {
3590
+ const status = int(frame.error_status);
3591
+ const kind = typeof frame.error === "string" && frame.error && frame.error !== "unknown" ? frame.error.replace(/_/g, " ") : "";
3592
+ const cause = status !== null ? `HTTP ${status}${kind ? ` ${kind}` : ""}` : "a connection error";
3593
+ const attempt = int(frame.attempt);
3594
+ const max = int(frame.max_retries);
3595
+ const delay = int(frame.retry_delay_ms);
3596
+ const details = [];
3597
+ if (attempt !== null) details.push(`attempt ${attempt}${max !== null ? `/${max}` : ""}`);
3598
+ if (delay !== null && delay >= 0) details.push(`next retry in ${delayText(delay)}`);
3599
+ return `Claude is retrying after ${cause}${details.length ? ` (${details.join(", ")})` : ""}`;
3600
+ }
3601
+ const API_RETRY_NOTICE_MIN_INTERVAL_MS = 6e4;
3602
+ function createClaudeApiRetryGate(opts = {}) {
3603
+ const minIntervalMs = opts.minIntervalMs ?? API_RETRY_NOTICE_MIN_INTERVAL_MS;
3604
+ let lastAttempt = null;
3605
+ let lastPersistedAt = null;
3606
+ return {
3607
+ /** True when this frame should be persisted. */
3608
+ observe(frame, now) {
3609
+ const attempt = int(frame.attempt);
3610
+ const newRun = attempt !== null && (lastAttempt === null || attempt <= lastAttempt);
3611
+ if (attempt !== null) lastAttempt = attempt;
3612
+ if (newRun || lastPersistedAt === null || now - lastPersistedAt >= minIntervalMs) {
3613
+ lastPersistedAt = now;
3614
+ return true;
3615
+ }
3616
+ return false;
3617
+ },
3618
+ /** The turn ended: the next retry is a new run. */
3619
+ reset() {
3620
+ lastAttempt = null;
3621
+ lastPersistedAt = null;
3622
+ }
3623
+ };
3624
+ }
3625
+ const INFORMATIONAL_MAX_CHARS = 500;
3626
+ function describeClaudeInformational(frame) {
3627
+ if (frame.level !== "warning" || typeof frame.content !== "string") return null;
3628
+ const text = frame.content.replace(/\s+/g, " ").trim();
3629
+ if (!text) return null;
3630
+ return text.length > INFORMATIONAL_MAX_CHARS ? `${text.slice(0, INFORMATIONAL_MAX_CHARS - 1)}\u2026` : text;
3631
+ }
3632
+
3360
3633
  const ABORT_INTERRUPT_GRACE_MS = 4e3;
3361
3634
  const REWIND_LOG_WINDOW = 500;
3362
3635
  const REWIND_STARTUP_BUDGET_MS = 15e3;
@@ -3524,6 +3797,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
3524
3797
  const streamRelay$1 = new streamRelay.StreamRelay({
3525
3798
  send: (frame) => session.client.sendStreamFrame(frame)
3526
3799
  });
3800
+ const apiRetryGate = createClaudeApiRetryGate();
3527
3801
  const messageQueue = new OutgoingMessageQueue(
3528
3802
  (logMessage) => session.client.sendClaudeSessionMessage(logMessage)
3529
3803
  );
@@ -3545,6 +3819,21 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
3545
3819
  backgroundTasks.observe(message);
3546
3820
  session.setBackgroundTasks(backgroundTasks.list());
3547
3821
  session.scheduledWakeups.observe(message);
3822
+ if (message.type === "system" && message.subtype === "api_retry") {
3823
+ const notice = describeClaudeApiRetry(message);
3824
+ messageBuffer$1.addMessage(notice, "status");
3825
+ if (apiRetryGate.observe(message, Date.now())) {
3826
+ session.client.sendSessionEvent({ type: "message", message: notice, kind: "claude-api-retry" });
3827
+ }
3828
+ } else if (message.type === "system" && message.subtype === "informational") {
3829
+ const warning = describeClaudeInformational(message);
3830
+ if (warning) {
3831
+ messageBuffer$1.addMessage(warning, "status");
3832
+ session.client.sendSessionEvent({ type: "message", message: warning, kind: "claude-warning" });
3833
+ }
3834
+ } else if (message.type === "result") {
3835
+ apiRetryGate.reset();
3836
+ }
3548
3837
  if (isRuntimeCheckpointReplay(message)) return;
3549
3838
  if (message.type === "user" && isClaudeInterruptSentinelContent(message.message.content)) {
3550
3839
  sdkToLogConverter.convert(message);
@@ -3798,7 +4087,7 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
3798
4087
  }
3799
4088
  if (!session.thinking || !modeGate.matches(input.mode)) return false;
3800
4089
  if (typeof message === "string") onPromptFinalized?.(message);
3801
- q.steer(message, input.mode);
4090
+ q.steer(message, input.mode, input.localKey);
3802
4091
  return true;
3803
4092
  });
3804
4093
  permissionHandler.setPermissionModeUpdater(async (mode) => {
@@ -3828,6 +4117,14 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
3828
4117
  logger.logger.debug("[remote]: Session reset");
3829
4118
  session.clearSessionId();
3830
4119
  },
4120
+ // B-631: a Stop swept these user messages (steers, or prompts
4121
+ // queued behind a pre-empting steer's turn) before the model
4122
+ // read them — the same tombstone a destroyed queue item gets
4123
+ // (B-332), so the web shows them as not delivered, not answered.
4124
+ onCommandsDropped: (uuids) => {
4125
+ logger.logger.debug(`[remote]: ${uuids.length} user message(s) never read before the turn ended`);
4126
+ session.client.sendQueueCancelReason(uuids, "aborted");
4127
+ },
3831
4128
  onReady: (result) => {
3832
4129
  if (turnSteering.consumeReady()) {
3833
4130
  session.client.closeClaudeSessionTurn("cancelled");
@@ -3873,9 +4170,10 @@ async function claudeRemoteLauncher(session, onPermissionModeChange, onEffective
3873
4170
  session.client.closeClaudeSessionTurn("cancelled");
3874
4171
  continue;
3875
4172
  }
3876
- session.client.closeClaudeSessionTurn("failed");
3877
- session.client.sendSessionEvent({ type: "message", message: "Process exited unexpectedly" });
3878
- session.onSessionError(e instanceof Error ? e.message : "Process exited unexpectedly");
4173
+ const exit = sessionScanner.describeClaudeProcessExit(e);
4174
+ const closed = session.client.closeClaudeSessionTurn("failed", { error: exit });
4175
+ if (!closed) session.client.sendSessionEvent({ type: "message", message: exit, kind: "claude-process-exit" });
4176
+ session.onSessionError(exit);
3879
4177
  continue;
3880
4178
  }
3881
4179
  } finally {
@@ -3965,7 +4263,7 @@ async function loop(opts) {
3965
4263
  logger.logger.debug(`[loop] Iteration with mode: ${mode}`);
3966
4264
  switch (mode) {
3967
4265
  case "local": {
3968
- const { claudeLocalLauncher } = await Promise.resolve().then(function () { return require('./claudeLocalLauncher-Dnv4CH8r.cjs'); });
4266
+ const { claudeLocalLauncher } = await Promise.resolve().then(function () { return require('./claudeLocalLauncher-A4VuevIi.cjs'); });
3969
4267
  const result = await claudeLocalLauncher(session);
3970
4268
  switch (result.type) {
3971
4269
  case "switch":
@@ -4371,7 +4669,7 @@ function registerSideQuestionHandler(rpc, deps) {
4371
4669
  const retainMs = deps.retainMs ?? SIDE_QUESTION_RETAIN_MS;
4372
4670
  const maxRunMs = deps.maxRunMs ?? SIDE_QUESTION_MAX_RUN_MS;
4373
4671
  const fork = deps.run ?? (async (input) => {
4374
- const { query } = await Promise.resolve().then(function () { return require('./index-D3kI0hDR.cjs'); });
4672
+ const { query } = await Promise.resolve().then(function () { return require('./index-DFPT4HOO.cjs'); });
4375
4673
  return runSideQuestion(query, input);
4376
4674
  });
4377
4675
  const run = async (input, live) => {