very-happy-cli 0.2.160 → 0.2.162

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 (176) hide show
  1. package/dist/{AcpBackend-mzv8Dhba.mjs → AcpBackend--TmFHgRH.mjs} +3 -3
  2. package/dist/{AcpBackend-Bm2rdke8.cjs → AcpBackend-9asD_DL7.cjs} +3 -3
  3. package/dist/{AcpSessionManager-CoMWFVw3.mjs → AcpSessionManager-BSIBnWUb.mjs} +1 -1
  4. package/dist/{AcpSessionManager-BAY1Pggx.cjs → AcpSessionManager-BvIuBzoO.cjs} +1 -1
  5. package/dist/{BasePermissionHandler-CFHAxumV.cjs → BasePermissionHandler-D4B-NNu2.cjs} +1 -1
  6. package/dist/{BasePermissionHandler-m3WVholL.mjs → BasePermissionHandler-DUBySe0f.mjs} +1 -1
  7. package/dist/{BaseReasoningProcessor-CYrKBXGm.mjs → BaseReasoningProcessor-9TybUGTq.mjs} +1 -1
  8. package/dist/{BaseReasoningProcessor-BFa9_rZA.cjs → BaseReasoningProcessor-CqLl-ikP.cjs} +1 -1
  9. package/dist/{agentHome-CboCeKWq.cjs → agentHome-BohNUYnE.cjs} +4 -4
  10. package/dist/{agentHome-Dj1C43aJ.mjs → agentHome-DQrq_FG1.mjs} +4 -4
  11. package/dist/{api-CgundNNX.cjs → api-CQnLOqRS.cjs} +10 -10
  12. package/dist/{api-CLMUr-SX.mjs → api-D57dsd6_.mjs} +10 -10
  13. package/dist/{apiMachine-B9dLW_p5.mjs → apiMachine-78Aqzg--.mjs} +21 -14
  14. package/dist/{apiMachine-Bn8482VM.cjs → apiMachine-fFFaWxYy.cjs} +33 -26
  15. package/dist/{assistantTools-BTqPnlFl.cjs → assistantTools-CwESq24n.cjs} +6 -6
  16. package/dist/{assistantTools-D6tuc6o4.mjs → assistantTools-mEz6uNqL.mjs} +6 -6
  17. package/dist/{attachmentContent-DpiTJZb4.cjs → attachmentContent-GHOk6Muq.cjs} +2 -2
  18. package/dist/{attachmentContent-_kxRznNf.mjs → attachmentContent-s1xPha4Q.mjs} +2 -2
  19. package/dist/{attachmentLimits-yba1uHFO.mjs → attachmentLimits-D5pgmASK.mjs} +1 -1
  20. package/dist/{attachmentLimits-CzVrqgLR.cjs → attachmentLimits-DzlBPyJP.cjs} +1 -1
  21. package/dist/{auth-BDOVh5h5.cjs → auth-B8EagV6G.cjs} +8 -8
  22. package/dist/{auth-PYHZQNPp.mjs → auth-BOaHWquu.mjs} +8 -8
  23. package/dist/{auth-ba4WMYrN.cjs → auth-BbSdXMQ_.cjs} +5 -5
  24. package/dist/{auth-Cwutmdsa.mjs → auth-C8V7-oUT.mjs} +5 -5
  25. package/dist/{auto-BOX_fgmR.cjs → auto-Bw_h0yVc.cjs} +15 -14
  26. package/dist/{auto-BXu14yP_.mjs → auto-CWDOX35m.mjs} +15 -14
  27. package/dist/{bootstrap-hxXPCFMx.mjs → bootstrap-BKmsYSwh.mjs} +2 -2
  28. package/dist/{bootstrap-B5G1TijC.cjs → bootstrap-DvZjEa9_.cjs} +2 -2
  29. package/dist/{browser-Y6Bl8L_O.cjs → browser-CBZj-1Wx.cjs} +1 -1
  30. package/dist/{browser-jh2P0UVZ.mjs → browser-CrMAr5fI.mjs} +1 -1
  31. package/dist/{claudeLocal-CRGG4Pea.cjs → claudeLocal-Bpw-u9et.cjs} +5 -5
  32. package/dist/{claudeLocal-BaY4fZKi.mjs → claudeLocal-dhdlcQ6F.mjs} +5 -5
  33. package/dist/{claudeLocalLauncher-D4T7MTqd.mjs → claudeLocalLauncher-BFfGT4eY.mjs} +10 -10
  34. package/dist/{claudeLocalLauncher-DyEbVzUN.cjs → claudeLocalLauncher-DWFWuLhY.cjs} +10 -10
  35. package/dist/{codexThreadFork-BH9IZPqD.cjs → claudeSessionFork-D9-mANmu.cjs} +1 -137
  36. package/dist/{codexThreadFork-slzAseLx.mjs → claudeSessionFork-_DUrXaqd.mjs} +2 -134
  37. package/dist/{client-BPNbmtvO.cjs → client-CVQJWqjx.cjs} +2 -2
  38. package/dist/{client-3Ac-O4pw.cjs → client-DiBTHWNU.cjs} +3 -3
  39. package/dist/{client-CeGKqqcJ.mjs → client-Dk7x-s-O.mjs} +3 -3
  40. package/dist/{client-ClR0K8zX.mjs → client-DwqHDsLb.mjs} +2 -2
  41. package/dist/codex/happyMcpStdioBridge.cjs +15 -15
  42. package/dist/codex/happyMcpStdioBridge.mjs +15 -15
  43. package/dist/{codexAppServerClient-I3teiV-N.mjs → codexAppServerClient-C2ybs2mZ.mjs} +2 -2
  44. package/dist/{codexAppServerClient-q2FjnRcK.cjs → codexAppServerClient-DlKv5TjG.cjs} +2 -2
  45. package/dist/{codexCommand-4zcccIoq.cjs → codexCommand-4vLE31fj.cjs} +45 -40
  46. package/dist/{codexCommand-Cc9gcbdX.mjs → codexCommand-DnmFr9Qx.mjs} +45 -40
  47. package/dist/codexThreadFork-DNekT4nQ.cjs +138 -0
  48. package/dist/codexThreadFork-R76RU5H0.mjs +133 -0
  49. package/dist/{config-Ci9Kpgwa.cjs → config-Btd4B05_.cjs} +3 -3
  50. package/dist/{config-CTx_jb-C.mjs → config-CSOG_ZcP.mjs} +3 -3
  51. package/dist/{configuration-RfeNjFmd.mjs → configuration-A5gW_0GE.mjs} +1 -1
  52. package/dist/{configuration-BSYpcPwE.cjs → configuration-UsI0sxEv.cjs} +1 -1
  53. package/dist/{connect-C2CiOUFs.cjs → connect-C9yxp8Om.cjs} +13 -13
  54. package/dist/{connect-BpOdzNbE.mjs → connect-DWYj8LP_.mjs} +13 -13
  55. package/dist/{context-DsDr6E2t.cjs → context-0FjjA4vJ.cjs} +1 -1
  56. package/dist/{context-H0Bcb9S_.mjs → context-BXnxalWW.mjs} +1 -1
  57. package/dist/{controlClient-Bcwv3D21.cjs → controlClient-BXktrQ4z.cjs} +3 -3
  58. package/dist/{controlClient-BGbDcgWS.mjs → controlClient-CYzHrh3e.mjs} +3 -3
  59. package/dist/{createSessionMetadata-CVVkGjxV.mjs → createSessionMetadata-Dyg33ZlU.mjs} +2 -2
  60. package/dist/{createSessionMetadata-BJxEnM-o.cjs → createSessionMetadata-EX1eAlHx.cjs} +2 -2
  61. package/dist/{deterministicJson-CzkFJWw1.mjs → deterministicJson-DiR7EOMO.mjs} +9 -9
  62. package/dist/{deterministicJson-C5CYTVpm.cjs → deterministicJson-eha_oMZ2.cjs} +9 -9
  63. package/dist/{doctor-D2YJ-Yn2.cjs → doctor-DunLBgVi.cjs} +6 -6
  64. package/dist/{doctor-DOvByjbk.mjs → doctor-FuCvKdRa.mjs} +6 -6
  65. package/dist/{ensureDaemonRunning-BCwNrMyv.cjs → ensureDaemonRunning-B4dZFmUy.cjs} +5 -5
  66. package/dist/{ensureDaemonRunning-Dqa2pOjY.mjs → ensureDaemonRunning-EZkb-CAF.mjs} +5 -5
  67. package/dist/{handleResumeCommand-C2cKchpX.cjs → handleResumeCommand-CKMIw4pE.cjs} +5 -5
  68. package/dist/{handleResumeCommand-BvXYf5El.mjs → handleResumeCommand-CsXendKb.mjs} +5 -5
  69. package/dist/{index-DMZqWwsP.mjs → index-9L39wqYR.mjs} +37 -37
  70. package/dist/{index-qdS1friN.mjs → index-BBg9j0XK.mjs} +8 -1
  71. package/dist/{index-B6pAdvJx.cjs → index-BOhgL3rh.cjs} +36 -36
  72. package/dist/{index-Bu5Zi_a9.cjs → index-CZWAiydF.cjs} +4 -4
  73. package/dist/{index-DVkMGPyS.mjs → index-CvXcVQ06.mjs} +3 -3
  74. package/dist/{index-DA7yINuk.cjs → index-DJ-oV52i.cjs} +8 -1
  75. package/dist/{index-DKLU_fD0.mjs → index-DK2JpTJf.mjs} +4 -4
  76. package/dist/{index-DDeHXrIX.cjs → index-DRhWHEuW.cjs} +3 -3
  77. package/dist/index.cjs +2 -2
  78. package/dist/index.mjs +2 -2
  79. package/dist/{install-CFY3tYtJ.mjs → install-B2duVo9a.mjs} +3 -3
  80. package/dist/{install-BgoC2e_2.cjs → install-C8WyZI9K.cjs} +3 -3
  81. package/dist/lib.cjs +12 -12
  82. package/dist/lib.d.cts +5 -0
  83. package/dist/lib.d.mts +5 -0
  84. package/dist/lib.mjs +12 -12
  85. package/dist/{lidState-CeEt442o.mjs → lidState-CigXWxhe.mjs} +1 -1
  86. package/dist/{lidState-BeDfxxEX.cjs → lidState-Ds-6ytZV.cjs} +1 -1
  87. package/dist/{localHappyAgentAuth-C-HQyiv6.mjs → localHappyAgentAuth-CaCyKzYp.mjs} +1 -1
  88. package/dist/{localHappyAgentAuth-D6rFhaoc.cjs → localHappyAgentAuth-l0Na-5Ys.cjs} +1 -1
  89. package/dist/{logger-CS0mw3fa.cjs → logger-7ucWm9wp.cjs} +2 -2
  90. package/dist/{logger-6HYUEXNk.mjs → logger-CGE4C8ho.mjs} +2 -2
  91. package/dist/{machineMetadata-DyDbODYd.cjs → machineMetadata-lMPtpF16.cjs} +3 -3
  92. package/dist/{machineMetadata-oOzBfDfs.mjs → machineMetadata-ue1nkowa.mjs} +3 -3
  93. package/dist/{main-BwNIAI1A.mjs → main-3fIFXD-t.mjs} +44 -44
  94. package/dist/{main-BkxJP6JQ.cjs → main-CFI0datL.cjs} +44 -44
  95. package/dist/{mcp-B1A4I3TK.mjs → mcp-DARQBZ7l.mjs} +14 -14
  96. package/dist/{mcp-Hszd7qpS.cjs → mcp-DfxLAc1G.cjs} +14 -14
  97. package/dist/{package-BwMrPwqH.cjs → package-D1A-8ZJy.cjs} +7 -7
  98. package/dist/{package-BhaKlnxz.mjs → package-DQsvY1XN.mjs} +7 -7
  99. package/dist/{peerTools-BTqw97Gb.mjs → peerTools-D19hhSQF.mjs} +4 -4
  100. package/dist/{peerTools-BvKtHXj8.cjs → peerTools-DLwNaEEV.cjs} +4 -4
  101. package/dist/{permissionMode-Cr5JCbB7.mjs → permissionMode-CH4FoZfU.mjs} +1 -1
  102. package/dist/{persistence-HGW_ZVs9.mjs → persistence-Cw8aLoyL.mjs} +3 -3
  103. package/dist/{persistence-yKTH3-5X.cjs → persistence-i0nQMLlk.cjs} +3 -3
  104. package/dist/{piRunnerArgs-BuX1UFWy.mjs → piRunnerArgs-58t454gw.mjs} +1 -1
  105. package/dist/{piRunnerArgs-BNloJCCg.cjs → piRunnerArgs-BUyxPxjZ.cjs} +1 -1
  106. package/dist/{piRuntime-CSGkwCKQ.mjs → piRuntime-DVPixFjl.mjs} +1 -1
  107. package/dist/{piRuntime-C_H7MJCM.cjs → piRuntime-Dff73XCb.cjs} +1 -1
  108. package/dist/{piTerminal-DNCZ6yTM.cjs → piTerminal-Dz1RrO70.cjs} +16 -16
  109. package/dist/{piTerminal-C8a1OrNQ.mjs → piTerminal-gHWFAyzq.mjs} +16 -16
  110. package/dist/{registerCommonHandlers-DskirN-_.cjs → registerCommonHandlers-CMROPdJz.cjs} +2 -2
  111. package/dist/{registerCommonHandlers-Ccvsz7Ou.mjs → registerCommonHandlers-Ckv5boQI.mjs} +2 -2
  112. package/dist/{registerKillSessionHandler-DZeLXWcB.cjs → registerKillSessionHandler-CA9-oelM.cjs} +19 -10
  113. package/dist/{registerKillSessionHandler-GYvHdipX.mjs → registerKillSessionHandler-Cll4-o8Y.mjs} +19 -10
  114. package/dist/{remoteSessionClient-CYnXRynE.mjs → remoteSessionClient-BMjsbuBh.mjs} +5 -5
  115. package/dist/{remoteSessionClient-B0LraSB9.cjs → remoteSessionClient-DX9jHLeW.cjs} +5 -5
  116. package/dist/{run-CJzxoHVh.cjs → run-CjbGo2wb.cjs} +36 -32
  117. package/dist/{run-D3ifupU3.mjs → run-CrunzDlt.mjs} +35 -31
  118. package/dist/{runClaude-Da3RirzE.cjs → runClaude-KN-4Y4LH.cjs} +184 -140
  119. package/dist/{runClaude-Ba01qT-u.mjs → runClaude-WDBWRtnF.mjs} +185 -141
  120. package/dist/{runClaudeDeps-DOzEBMls.cjs → runClaudeDeps-DW-8lnHv.cjs} +821 -125
  121. package/dist/{runClaudeDeps-DOt79DjU.mjs → runClaudeDeps-QaEx8y5r.mjs} +811 -129
  122. package/dist/{runGemini-DSr9LIxL.cjs → runGemini-Djmwjdv1.cjs} +32 -32
  123. package/dist/{runGemini-BGeTz57m.mjs → runGemini-Nf6SKBpw.mjs} +32 -32
  124. package/dist/{runOpenClaw-CogSedIc.mjs → runOpenClaw-9nHtmYbN.mjs} +18 -18
  125. package/dist/{runOpenClaw-B1mTxN35.cjs → runOpenClaw-CAqP5KFH.cjs} +18 -18
  126. package/dist/{sandbox-CG7IyDTU.cjs → sandbox-C8Dd8GPM.cjs} +4 -4
  127. package/dist/{sandbox-DTe6d54R.mjs → sandbox-SP0THMt0.mjs} +4 -4
  128. package/dist/selfCheck-7FaZtVu2.mjs +84 -0
  129. package/dist/{selfCheck-Dc-mNSLb.cjs → selfCheck-D9ZXrK7h.cjs} +34 -34
  130. package/dist/{send-CBXJKc6O.mjs → send-DOx9aQsx.mjs} +8 -8
  131. package/dist/{send-B7J_eaG3.cjs → send-LPk6Q5HI.cjs} +8 -8
  132. package/dist/{server-DcVBv04l.mjs → server-BZNi8Hq_.mjs} +4 -4
  133. package/dist/{server-CZTP_iOn.cjs → server-CxT8jNyn.cjs} +6 -6
  134. package/dist/{sessionLock-D-EG2CfG.mjs → sessionLock-CfLqJfeI.mjs} +2 -2
  135. package/dist/{sessionLock-Bys1PNSo.cjs → sessionLock-y9rnA4LK.cjs} +2 -2
  136. package/dist/{sessionModeFile-RSm0NQkH.cjs → sessionModeFile-B5YeoQJh.cjs} +1 -1
  137. package/dist/{sessionModeFile-DMl3dw3r.mjs → sessionModeFile-BKxgNH3P.mjs} +1 -1
  138. package/dist/{sessionOps-SuHW8Dfe.mjs → sessionOps-CdwVPSZz.mjs} +4 -4
  139. package/dist/{sessionOps-Dn8z85h_.cjs → sessionOps-GsELm2PZ.cjs} +4 -4
  140. package/dist/{sessionScanner-CX3onqXh.mjs → sessionScanner-Cdukzo70.mjs} +3 -3
  141. package/dist/{sessionScanner-BOrGjMXL.cjs → sessionScanner-aLEv7mD3.cjs} +3 -3
  142. package/dist/{sessions-D74aJbhL.cjs → sessions-CfG4WGN0.cjs} +9 -9
  143. package/dist/{sessions-BEG_HTSi.mjs → sessions-Dne-OiRL.mjs} +9 -9
  144. package/dist/{setupOfflineReconnection-ByElY60m.cjs → setupOfflineReconnection-CFwltTcP.cjs} +2 -2
  145. package/dist/{setupOfflineReconnection-DpvWTt69.mjs → setupOfflineReconnection-DiQma2Cc.mjs} +2 -2
  146. package/dist/{spawn-DgR0RKRs.cjs → spawn-BI_sdgWs.cjs} +24 -15
  147. package/dist/{spawn-B7yro0b2.mjs → spawn-DkgP2BGF.mjs} +22 -14
  148. package/dist/{spawnAgents-DZzZ9jMI.mjs → spawnAgents-Y1LjnCt9.mjs} +1 -1
  149. package/dist/{spawnAgents-BGQiEF-w.cjs → spawnAgents-iSu1Xzs5.cjs} +1 -1
  150. package/dist/{spawnHappyCLI-B2H5s4B_.mjs → spawnHappyCLI-9mx4lPxh.mjs} +1 -1
  151. package/dist/{spawnHappyCLI-DBhwZT7O.cjs → spawnHappyCLI-BRdx0sAX.cjs} +1 -1
  152. package/dist/{startFileWatcher-B4VsLgjD.cjs → startFileWatcher-C2HC2_Dg.cjs} +1 -1
  153. package/dist/{startFileWatcher-DErVWZE4.mjs → startFileWatcher-COD5UKNs.mjs} +1 -1
  154. package/dist/{streamRelay-FPVbHpbM.mjs → streamRelay-BLgU9X3R.mjs} +1 -1
  155. package/dist/{streamRelay-BiKw59Cc.cjs → streamRelay-DnObXZZj.cjs} +1 -1
  156. package/dist/{sync-C8gyQFMc.mjs → sync-BpLasLu2.mjs} +1 -1
  157. package/dist/{sync-DccIKZ5_.cjs → sync-Dj92ZJ8Y.cjs} +1 -1
  158. package/dist/{systemPrompt-BwTPWfMu.cjs → systemPrompt-CyEz_IfR.cjs} +2 -2
  159. package/dist/{systemPrompt-DX521JJz.mjs → systemPrompt-DsQoUgQw.mjs} +2 -2
  160. package/dist/{teams-C32F1hqd.mjs → teams-BETNMjpZ.mjs} +6 -6
  161. package/dist/{teams-Dl8g8kTI.cjs → teams-Ctx9zXn4.cjs} +6 -6
  162. package/dist/{time-DCuTyook.cjs → time-CLwVAz6s.cjs} +1 -1
  163. package/dist/{time-D0XyHOid.mjs → time-CVvxdEDh.mjs} +1 -1
  164. package/dist/{titleGenerator-CQ8CoGhg.mjs → titleGenerator-B4AW3dLr.mjs} +12 -2
  165. package/dist/{titleGenerator-ChzMJsyg.cjs → titleGenerator-FDpdizn7.cjs} +13 -3
  166. package/dist/{todo-BvUOTa8G.cjs → todo-C3tyFeq1.cjs} +6 -6
  167. package/dist/{todo-CZ6cFrrn.mjs → todo-Jk4Vs7hP.mjs} +6 -6
  168. package/dist/{tools-BZtHF_qQ.mjs → tools-BA1qkiV1.mjs} +2 -2
  169. package/dist/{tools-DQj0AeLk.cjs → tools-CGxq3I52.cjs} +2 -2
  170. package/dist/{tools-Be3AoAwu.cjs → tools-O5beDK-s.cjs} +1 -1
  171. package/dist/{tools-DkluDcG4.mjs → tools-_kFe4m_l.mjs} +1 -1
  172. package/dist/{uninstall-BkLzaJ6I.mjs → uninstall-C_mdAZlm.mjs} +3 -3
  173. package/dist/{uninstall-x-TUtf5H.cjs → uninstall-DHKF90lo.cjs} +3 -3
  174. package/package.json +7 -7
  175. package/scripts/session_hook_forwarder.cjs +9 -2
  176. package/dist/selfCheck-C9mVrQwf.mjs +0 -84
@@ -1,65 +1,71 @@
1
1
  'use strict';
2
2
 
3
3
  var os = require('node:os');
4
- var sessionLock = require('./sessionLock-Bys1PNSo.cjs');
4
+ var sessionLock = require('./sessionLock-y9rnA4LK.cjs');
5
5
  var node_crypto = require('node:crypto');
6
- var api = require('./api-CgundNNX.cjs');
7
- var logger = require('./logger-CS0mw3fa.cjs');
8
- var _package = require('./package-BwMrPwqH.cjs');
9
- var persistence = require('./persistence-yKTH3-5X.cjs');
10
- var createSessionMetadata = require('./createSessionMetadata-BJxEnM-o.cjs');
11
- var index = require('./index-DA7yINuk.cjs');
12
- var configuration = require('./configuration-BSYpcPwE.cjs');
13
- var controlClient = require('./controlClient-Bcwv3D21.cjs');
14
- var machineMetadata = require('./machineMetadata-DyDbODYd.cjs');
6
+ var api = require('./api-CQnLOqRS.cjs');
7
+ var logger = require('./logger-7ucWm9wp.cjs');
8
+ var _package = require('./package-D1A-8ZJy.cjs');
9
+ var persistence = require('./persistence-i0nQMLlk.cjs');
10
+ var createSessionMetadata = require('./createSessionMetadata-EX1eAlHx.cjs');
11
+ var index = require('./index-DJ-oV52i.cjs');
12
+ var configuration = require('./configuration-UsI0sxEv.cjs');
13
+ var controlClient = require('./controlClient-BXktrQ4z.cjs');
14
+ var machineMetadata = require('./machineMetadata-lMPtpF16.cjs');
15
15
  var projectPath = require('./projectPath-ChLhdOyt.cjs');
16
16
  var path = require('node:path');
17
17
  var permissionMode = require('./permissionMode-CrV-XuMs.cjs');
18
18
  var authRelay = require('./authRelay-BdYkC1Po.cjs');
19
19
  var promises = require('node:fs/promises');
20
20
  var defaultPermissionMode = require('./defaultPermissionMode-CxmTXUQR.cjs');
21
- var attachmentContent = require('./attachmentContent-DpiTJZb4.cjs');
21
+ var attachmentContent = require('./attachmentContent-GHOk6Muq.cjs');
22
22
  var startupPlan = require('./startupPlan-BLMbfQIH.cjs');
23
23
  require('node:fs');
24
24
  require('axios');
25
25
  require('node:events');
26
26
  require('socket.io-client');
27
- require('./attachmentLimits-CzVrqgLR.cjs');
27
+ require('./attachmentLimits-DzlBPyJP.cjs');
28
28
  require('zod');
29
29
  require('./limits-C-a7gr04.cjs');
30
- require('./time-DCuTyook.cjs');
31
- require('./lidState-BeDfxxEX.cjs');
30
+ require('./time-CLwVAz6s.cjs');
31
+ require('./lidState-Ds-6ytZV.cjs');
32
32
  require('os');
33
33
  require('child_process');
34
- require('./registerCommonHandlers-DskirN-_.cjs');
34
+ require('./registerCommonHandlers-CMROPdJz.cjs');
35
35
  require('util');
36
36
  require('fs/promises');
37
37
  require('crypto');
38
38
  require('path');
39
39
  require('cross-spawn');
40
40
  require('@paralleldrive/cuid2');
41
- require('./sync-DccIKZ5_.cjs');
41
+ require('./sync-Dj92ZJ8Y.cjs');
42
42
  require('./backgroundTaskActivity-CBvUdj39.cjs');
43
43
  require('./contentLogMetadata-ZSFk_NjQ.cjs');
44
44
  require('chalk');
45
45
  require('node:util');
46
46
  require('./detectCLI-DR9ZaN6B.cjs');
47
47
  require('fs');
48
- require('./localHappyAgentAuth-D6rFhaoc.cjs');
48
+ require('./localHappyAgentAuth-l0Na-5Ys.cjs');
49
49
  require('tweetnacl');
50
50
  require('url');
51
51
 
52
52
  const DEFAULT_CLAUDE_MODEL = void 0;
53
53
  const DEFAULT_CLAUDE_EFFORT = void 0;
54
+ const importRunClaudeDeps = () => Promise.resolve().then(function () { return require('./runClaudeDeps-DW-8lnHv.cjs'); });
54
55
  async function runClaude(credentials, options = {}) {
55
56
  logger.logger.debug(`[CLAUDE] ===== CLAUDE MODE STARTING =====`);
56
57
  logger.logger.debug(`[CLAUDE] This is the Claude agent, NOT Gemini`);
57
58
  options = { ...options, claudeEnvVars: { ...options.claudeEnvVars, HAPPY_MANAGED: "1" } };
59
+ const prewarmSpawnEnv = {};
60
+ for (const key of ["HAPPY_CLAUDE_AUTH_STATUS", "HAPPY_FIRST_MESSAGE_FROM_CLI"]) {
61
+ prewarmSpawnEnv[key] = process.env[key];
62
+ delete process.env[key];
63
+ }
58
64
  const workingDirectory = process.cwd();
59
65
  const isAssistantVariant = process.env.HAPPY_SESSION_VARIANT === "assistant";
60
66
  if (isAssistantVariant) {
61
67
  try {
62
- const { bootstrapAssistantHome } = await Promise.resolve().then(function () { return require('./bootstrap-B5G1TijC.cjs'); });
68
+ const { bootstrapAssistantHome } = await Promise.resolve().then(function () { return require('./bootstrap-DvZjEa9_.cjs'); });
63
69
  await bootstrapAssistantHome();
64
70
  } catch (error) {
65
71
  logger.logger.debug("[START] Assistant home bootstrap failed:", error);
@@ -70,9 +76,15 @@ async function runClaude(credentials, options = {}) {
70
76
  if (options.startedBy === "daemon" && options.startingMode === "local") {
71
77
  throw new Error("Daemon-spawned sessions cannot use local/interactive mode. Use --happy-starting-mode remote or spawn sessions directly from terminal.");
72
78
  }
73
- const depsLoad = Promise.resolve().then(function () { return require('./runClaudeDeps-DOzEBMls.cjs'); });
74
- depsLoad.catch(() => {
75
- });
79
+ let depsLoadPromise = null;
80
+ const loadDeps = () => {
81
+ if (!depsLoadPromise) {
82
+ depsLoadPromise = importRunClaudeDeps();
83
+ depsLoadPromise.catch(() => {
84
+ });
85
+ }
86
+ return depsLoadPromise;
87
+ };
76
88
  const reconnectRequested = Boolean(
77
89
  process.env.HAPPY_RECONNECT_SESSION_ID && process.env.HAPPY_RECONNECT_ENCRYPTION_KEY && process.env.HAPPY_RECONNECT_ENCRYPTION_VARIANT
78
90
  );
@@ -171,8 +183,8 @@ async function runClaude(credentials, options = {}) {
171
183
  }
172
184
  if (!response) {
173
185
  let offlineSessionId = null;
174
- const { claudeLocal } = await Promise.resolve().then(function () { return require('./claudeLocal-CRGG4Pea.cjs'); });
175
- const { createSessionScanner: createSessionScanner2 } = await depsLoad;
186
+ const { claudeLocal } = await Promise.resolve().then(function () { return require('./claudeLocal-Bpw-u9et.cjs'); });
187
+ const { createSessionScanner: createSessionScanner2 } = await loadDeps();
176
188
  const reconnection = api.startOfflineReconnection({
177
189
  serverUrl: configuration.configuration.serverUrl,
178
190
  onReconnected: async () => {
@@ -247,12 +259,13 @@ async function runClaude(credentials, options = {}) {
247
259
  } catch (error) {
248
260
  logger.logger.debug("[START] Failed to report to daemon (may not be running):", error);
249
261
  }
262
+ loadDeps();
250
263
  if (!startupPlan$1.registerMachine) {
251
264
  void Promise.resolve().then(() => api$1.getOrCreateMachine({ machineId, metadata: machineMetadata.getInitialMachineMetadata() })).catch((error) => logger.logger.debug("[START] Background machine registration failed:", error));
252
265
  }
253
266
  let deps;
254
267
  try {
255
- deps = await depsLoad;
268
+ deps = await loadDeps();
256
269
  } catch (error) {
257
270
  logger.logger.warn(`[START] Failed to load the Claude runner modules for session ${response.id}; marking it offline and exiting: ${error instanceof Error ? error.message : String(error)}`);
258
271
  try {
@@ -293,7 +306,21 @@ async function runClaude(credentials, options = {}) {
293
306
  FileRateLimiter,
294
307
  createSelfReportState,
295
308
  withAssistantDenylist,
296
- contentLogMetadata
309
+ contentLogMetadata,
310
+ resolveMessageMode,
311
+ claudePrewarmEligibility,
312
+ claudePrewarmSessionEligibility,
313
+ prewarmCacheFile,
314
+ readPrewarmCache,
315
+ writePrewarmCache,
316
+ prewarmPredictionMeta,
317
+ evaluatePrewarmPrediction,
318
+ acquirePrewarmSlot,
319
+ prewarmSlotDir,
320
+ PrewarmHookGate,
321
+ createClaudePrewarmLease,
322
+ disposeAllClaudePrewarms,
323
+ formatPrewarmLine
297
324
  } = deps;
298
325
  logger.logger.debugLargeJson("[START] Happy process started", getEnvironmentInfo());
299
326
  const session = earlySession ?? api$1.sessionSyncClient(response, reconnectSeeded ? { initialSeq: response.seq } : void 0);
@@ -412,10 +439,21 @@ async function runClaude(credentials, options = {}) {
412
439
  const happyServer = await startHappyServer(session, { assistant: isAssistantVariant, selfReportState: boardSelfReport });
413
440
  logger.logger.debug(`[START] Happy MCP server started at ${happyServer.url}`);
414
441
  let currentSession = null;
442
+ const prewarmHookGate = new PrewarmHookGate();
443
+ let scannerAnnouncedSessionId = null;
444
+ const announceSessionToScanner = (sessionId) => {
445
+ if (sessionId === scannerAnnouncedSessionId) return;
446
+ scannerAnnouncedSessionId = sessionId;
447
+ void Promise.resolve(remoteScanner.onNewSession(sessionId, { treatExistingAsProcessed: true })).catch((error) => logger.logger.debug("[START] remote scanner onNewSession failed:", error));
448
+ };
415
449
  const hookServer = await startHookServer({
416
- onSessionHook: (sessionId, data) => {
450
+ onSessionHook: (sessionId, data, hookMeta) => {
451
+ if (!prewarmHookGate.accepts(hookMeta?.source)) {
452
+ logger.logger.debug(`[START] Session hook from an unadopted warm Claude process ignored (${hookMeta?.source})`);
453
+ return;
454
+ }
417
455
  logger.logger.debug(`[START] Session hook received: ${sessionId}`, contentLogMetadata(data));
418
- remoteScanner.onNewSession(sessionId, { treatExistingAsProcessed: true });
456
+ announceSessionToScanner(sessionId);
419
457
  if (currentSession) {
420
458
  const previousSessionId = currentSession.sessionId;
421
459
  if (previousSessionId !== sessionId) {
@@ -511,6 +549,94 @@ async function runClaude(credentials, options = {}) {
511
549
  currentEffort = DEFAULT_CLAUDE_EFFORT;
512
550
  logger.logger.debug("[loop] Reset current mode defaults after abort");
513
551
  };
552
+ const currentModeState = () => ({
553
+ permissionMode: currentPermissionMode,
554
+ model: currentModel,
555
+ fallbackModel: currentFallbackModel,
556
+ customSystemPrompt: currentCustomSystemPrompt,
557
+ appendSystemPrompt: currentAppendSystemPrompt,
558
+ allowedTools: currentAllowedTools,
559
+ disallowedTools: currentDisallowedTools,
560
+ effort: currentEffort
561
+ });
562
+ const prewarmCachePath = prewarmCacheFile(configuration.configuration.happyHomeDir);
563
+ let prewarmCache = readPrewarmCache(prewarmCachePath);
564
+ const prewarmSessionInput = {
565
+ env: { ...process.env, ...prewarmSpawnEnv },
566
+ startedBy: options.startedBy,
567
+ startingMode: options.startingMode,
568
+ claudeArgs: options.claudeArgs,
569
+ setting: settings?.claudePrewarm
570
+ };
571
+ const prewarmCtx = () => ({ sandboxEnabled, isAssistantVariant, staleModeSnapshot: false });
572
+ const predictFirstMessageMode = () => prewarmCache ? resolveMessageMode(currentModeState(), prewarmPredictionMeta(prewarmCache), prewarmCtx()).mode : null;
573
+ let firstMessageScored = false;
574
+ const scoreFirstMessage = (meta, predicted, actual) => {
575
+ if (firstMessageScored) return;
576
+ firstMessageScored = true;
577
+ if (meta?.sentFrom !== "web") return;
578
+ if (!claudePrewarmSessionEligibility({ ...prewarmSessionInput, env: { ...process.env, ...prewarmSpawnEnv } }).eligible) return;
579
+ const { outcome, next } = evaluatePrewarmPrediction({ predicted, actual, meta, previous: prewarmCache });
580
+ logger.logger.debug(`[CLAUDE PREWARM] prediction ${outcome}${next ? ` consecutiveMisses=${next.consecutiveMisses}` : ""}`);
581
+ if (next && writePrewarmCache(prewarmCachePath, next)) prewarmCache = next;
582
+ };
583
+ let userMessageSeen = false;
584
+ const prewarmTagFiles = /* @__PURE__ */ new Set();
585
+ const createPrewarm = () => {
586
+ const eligibility = claudePrewarmEligibility({
587
+ ...prewarmSessionInput,
588
+ env: { ...process.env, ...prewarmSpawnEnv },
589
+ cache: prewarmCache
590
+ });
591
+ if (!eligibility.eligible) {
592
+ logger.logger.debug(formatPrewarmLine("skipped", eligibility.reason));
593
+ return null;
594
+ }
595
+ if (userMessageSeen) {
596
+ logger.logger.debug(formatPrewarmLine("skipped", "message-already-received"));
597
+ return null;
598
+ }
599
+ const slot = acquirePrewarmSlot(prewarmSlotDir(configuration.configuration.happyHomeDir));
600
+ if (!slot) {
601
+ logger.logger.debug(formatPrewarmLine("skipped", "concurrency-limit"));
602
+ return null;
603
+ }
604
+ const predicted = predictFirstMessageMode();
605
+ if (!predicted) {
606
+ slot.release();
607
+ return null;
608
+ }
609
+ const tag = prewarmHookGate.newTag();
610
+ let tagHookSettingsPath;
611
+ try {
612
+ tagHookSettingsPath = generateHookSettingsFile(hookServer.port, tag);
613
+ } catch (error) {
614
+ slot.release();
615
+ logger.logger.debug(formatPrewarmLine("skipped", "hook-settings"));
616
+ return null;
617
+ }
618
+ prewarmTagFiles.add(tagHookSettingsPath);
619
+ return createClaudePrewarmLease({
620
+ mode: predicted,
621
+ hookSettingsPath: tagHookSettingsPath,
622
+ tag,
623
+ gate: prewarmHookGate,
624
+ slot,
625
+ // Only removed on discard: an adopted process keeps reading its
626
+ // settings file (later SessionStart events, e.g. /compact); it goes
627
+ // with the other hook files at exit.
628
+ cleanupHookSettings: () => {
629
+ cleanupHookSettingsFile(tagHookSettingsPath);
630
+ prewarmTagFiles.delete(tagHookSettingsPath);
631
+ },
632
+ log: (line) => logger.logger.debug(line)
633
+ });
634
+ };
635
+ const cleanupPrewarm = () => {
636
+ disposeAllClaudePrewarms("shutdown");
637
+ for (const file of prewarmTagFiles) cleanupHookSettingsFile(file);
638
+ prewarmTagFiles.clear();
639
+ };
514
640
  session.onFileEvent((fileEvent) => {
515
641
  const ev = fileEvent.content.data.ev;
516
642
  logger.logger.debug(`[loop] File event received: ${ev.name} (${ev.size} bytes, ref: ${ev.ref})`);
@@ -531,112 +657,42 @@ async function runClaude(credentials, options = {}) {
531
657
  session.trackAttachmentDownload(downloadPromise);
532
658
  });
533
659
  session.onUserMessage(async (message) => {
660
+ userMessageSeen = true;
534
661
  if (message?.content?.text) {
535
662
  titleGenerator.maybeGenerate(message.content.text);
536
663
  boardAnalyzer.noteUserMessage(message.content.text);
537
664
  }
538
665
  const attachmentsForThisMessage = await session.drainAttachmentsForUserMessage();
539
- let messagePermissionMode = currentPermissionMode;
540
666
  const messageCreatedAt = message.createdAt;
541
667
  const staleModeSnapshot = message.meta?.permissionMode !== void 0 && typeof messageCreatedAt === "number" && messageCreatedAt < lastExplicitModeSwitchAt;
542
668
  if (staleModeSnapshot) {
543
669
  logger.logger.debug(`[loop] Ignoring stale meta.permissionMode=${message.meta?.permissionMode} (message ${messageCreatedAt} predates explicit switch ${lastExplicitModeSwitchAt}); keeping ${currentPermissionMode}`);
544
- } else if (message.meta?.permissionMode) {
545
- const previousPermissionMode = currentPermissionMode;
546
- messagePermissionMode = permissionMode.resolveRemoteClaudePermissionMode(
547
- currentPermissionMode,
548
- message.meta.permissionMode,
549
- sandboxEnabled
550
- );
551
- publishPermissionMode(messagePermissionMode);
552
- const ignoredDefaultDowngrade = (previousPermissionMode === "bypassPermissions" || previousPermissionMode === "yolo") && message.meta.permissionMode === "default" && currentPermissionMode === previousPermissionMode;
553
- if (ignoredDefaultDowngrade) {
554
- logger.logger.debug(`[loop] Ignoring permission mode downgrade from ${previousPermissionMode} to default`);
555
- } else {
556
- logger.logger.debug(`[loop] Permission mode updated from user message to: ${currentPermissionMode}`);
557
- }
558
- } else {
559
- logger.logger.debug(`[loop] User message received with no permission mode override, using current: ${currentPermissionMode}`);
560
- }
561
- let messageModel = currentModel;
562
- if (message.meta?.hasOwnProperty("model")) {
563
- messageModel = message.meta.model || void 0;
564
- currentModel = messageModel;
565
- logger.logger.debug(`[loop] Model updated from user message: ${messageModel || "reset to default"}`);
566
- } else {
567
- logger.logger.debug(`[loop] User message received with no model override, using current: ${currentModel || "default"}`);
568
- }
569
- let messageCustomSystemPrompt = currentCustomSystemPrompt;
570
- if (message.meta?.hasOwnProperty("customSystemPrompt")) {
571
- messageCustomSystemPrompt = message.meta.customSystemPrompt || void 0;
572
- currentCustomSystemPrompt = messageCustomSystemPrompt;
573
- logger.logger.debug(`[loop] Custom system prompt updated from user message: ${messageCustomSystemPrompt ? "set" : "reset to none"}`);
574
- } else {
575
- logger.logger.debug(`[loop] User message received with no custom system prompt override, using current: ${currentCustomSystemPrompt ? "set" : "none"}`);
576
- }
577
- let messageFallbackModel = currentFallbackModel;
578
- if (message.meta?.hasOwnProperty("fallbackModel")) {
579
- messageFallbackModel = message.meta.fallbackModel || void 0;
580
- currentFallbackModel = messageFallbackModel;
581
- logger.logger.debug(`[loop] Fallback model updated from user message: ${messageFallbackModel || "reset to none"}`);
582
- } else {
583
- logger.logger.debug(`[loop] User message received with no fallback model override, using current: ${currentFallbackModel || "none"}`);
584
- }
585
- let messageAppendSystemPrompt = currentAppendSystemPrompt;
586
- if (message.meta?.hasOwnProperty("appendSystemPrompt")) {
587
- messageAppendSystemPrompt = message.meta.appendSystemPrompt || void 0;
588
- currentAppendSystemPrompt = messageAppendSystemPrompt;
589
- logger.logger.debug(`[loop] Append system prompt updated from user message: ${messageAppendSystemPrompt ? "set" : "reset to none"}`);
590
- } else {
591
- logger.logger.debug(`[loop] User message received with no append system prompt override, using current: ${currentAppendSystemPrompt ? "set" : "none"}`);
592
- }
593
- let messageAllowedTools = currentAllowedTools;
594
- if (message.meta?.hasOwnProperty("allowedTools")) {
595
- messageAllowedTools = message.meta.allowedTools || void 0;
596
- currentAllowedTools = messageAllowedTools;
597
- logger.logger.debug(`[loop] Allowed tools updated from user message: ${messageAllowedTools ? messageAllowedTools.join(", ") : "reset to none"}`);
598
- } else {
599
- logger.logger.debug(`[loop] User message received with no allowed tools override, using current: ${currentAllowedTools ? currentAllowedTools.join(", ") : "none"}`);
600
- }
601
- let messageDisallowedTools = currentDisallowedTools;
602
- if (message.meta?.hasOwnProperty("disallowedTools")) {
603
- messageDisallowedTools = withAssistantDenylist(message.meta.disallowedTools || void 0, isAssistantVariant);
604
- currentDisallowedTools = messageDisallowedTools;
605
- logger.logger.debug(`[loop] Disallowed tools updated from user message: ${messageDisallowedTools ? messageDisallowedTools.join(", ") : "reset to none"}`);
606
- } else {
607
- logger.logger.debug(`[loop] User message received with no disallowed tools override, using current: ${currentDisallowedTools ? currentDisallowedTools.join(", ") : "none"}`);
608
- }
609
- let messageEffort = currentEffort;
610
- const VALID_EFFORTS = /* @__PURE__ */ new Set(["low", "medium", "high", "xhigh", "max"]);
611
- if (message.meta?.hasOwnProperty("effort")) {
612
- const incoming = message.meta.effort;
613
- if (incoming === null || incoming === void 0) {
614
- messageEffort = void 0;
615
- currentEffort = void 0;
616
- logger.logger.debug(`[loop] Effort reset to default`);
617
- } else if (typeof incoming === "string" && VALID_EFFORTS.has(incoming)) {
618
- messageEffort = incoming;
619
- currentEffort = messageEffort;
620
- logger.logger.debug(`[loop] Effort updated from user message: ${messageEffort}`);
621
- } else {
622
- logger.logger.debug(`[loop] Ignoring invalid effort from user message: ${String(incoming)}`);
623
- }
624
- } else {
625
- logger.logger.debug(`[loop] User message received with no effort override, using current: ${currentEffort ?? "default"}`);
626
670
  }
671
+ const previousPermissionMode = currentPermissionMode;
672
+ const predictedFirstMode = firstMessageScored ? null : predictFirstMessageMode();
673
+ const resolved = resolveMessageMode(currentModeState(), message.meta, { sandboxEnabled, isAssistantVariant, staleModeSnapshot });
674
+ if ("publishPermissionMode" in resolved) {
675
+ publishPermissionMode(resolved.publishPermissionMode);
676
+ const ignoredDefaultDowngrade = (previousPermissionMode === "bypassPermissions" || previousPermissionMode === "yolo") && message.meta?.permissionMode === "default" && currentPermissionMode === previousPermissionMode;
677
+ logger.logger.debug(ignoredDefaultDowngrade ? `[loop] Ignoring permission mode downgrade from ${previousPermissionMode} to default` : `[loop] Permission mode updated from user message to: ${currentPermissionMode}`);
678
+ }
679
+ currentModel = resolved.next.model;
680
+ currentFallbackModel = resolved.next.fallbackModel;
681
+ currentCustomSystemPrompt = resolved.next.customSystemPrompt;
682
+ currentAppendSystemPrompt = resolved.next.appendSystemPrompt;
683
+ currentAllowedTools = resolved.next.allowedTools;
684
+ currentDisallowedTools = resolved.next.disallowedTools;
685
+ currentEffort = resolved.next.effort;
686
+ if (resolved.ignoredEffort !== void 0) {
687
+ logger.logger.debug(`[loop] Ignoring invalid effort from user message: ${resolved.ignoredEffort}`);
688
+ }
689
+ logger.logger.debug(`[loop] Message mode: permission=${resolved.mode.permissionMode} model=${resolved.mode.model || "default"} effort=${resolved.mode.effort ?? "default"} appendSystemPrompt=${resolved.mode.appendSystemPrompt ? "set" : "none"} customSystemPrompt=${resolved.mode.customSystemPrompt ? "set" : "none"}`);
690
+ scoreFirstMessage(message.meta, predictedFirstMode, resolved.mode);
691
+ const resolvedMode = resolved.mode;
627
692
  const specialCommand = parseSpecialCommand(message.content.text);
628
693
  if (specialCommand.type === "compact") {
629
694
  logger.logger.debug("[start] Detected /compact command");
630
- const enhancedMode2 = {
631
- permissionMode: messagePermissionMode || "default",
632
- model: messageModel,
633
- fallbackModel: messageFallbackModel,
634
- customSystemPrompt: messageCustomSystemPrompt,
635
- appendSystemPrompt: messageAppendSystemPrompt,
636
- allowedTools: messageAllowedTools,
637
- disallowedTools: messageDisallowedTools,
638
- effort: messageEffort
639
- };
695
+ const enhancedMode2 = resolvedMode;
640
696
  messageQueue.pushIsolateAndClear(specialCommand.originalMessage || message.content.text, enhancedMode2, attachmentsForThisMessage, message.localKey);
641
697
  logger.logger.debug("[start] /compact command pushed to queue:", {
642
698
  ...contentLogMetadata(message.content.text),
@@ -647,16 +703,7 @@ async function runClaude(credentials, options = {}) {
647
703
  }
648
704
  if (specialCommand.type === "clear") {
649
705
  logger.logger.debug("[start] Detected /clear command");
650
- const enhancedMode2 = {
651
- permissionMode: messagePermissionMode || "default",
652
- model: messageModel,
653
- fallbackModel: messageFallbackModel,
654
- customSystemPrompt: messageCustomSystemPrompt,
655
- appendSystemPrompt: messageAppendSystemPrompt,
656
- allowedTools: messageAllowedTools,
657
- disallowedTools: messageDisallowedTools,
658
- effort: messageEffort
659
- };
706
+ const enhancedMode2 = resolvedMode;
660
707
  messageQueue.pushIsolateAndClear(specialCommand.originalMessage || message.content.text, enhancedMode2, attachmentsForThisMessage, message.localKey);
661
708
  logger.logger.debug("[start] /clear command pushed to queue:", {
662
709
  ...contentLogMetadata(message.content.text),
@@ -703,16 +750,7 @@ async function runClaude(credentials, options = {}) {
703
750
  return;
704
751
  }
705
752
  }
706
- const enhancedMode = {
707
- permissionMode: messagePermissionMode || "default",
708
- model: messageModel,
709
- fallbackModel: messageFallbackModel,
710
- customSystemPrompt: messageCustomSystemPrompt,
711
- appendSystemPrompt: messageAppendSystemPrompt,
712
- allowedTools: messageAllowedTools,
713
- disallowedTools: messageDisallowedTools,
714
- effort: messageEffort
715
- };
753
+ const enhancedMode = resolvedMode;
716
754
  if (message.meta?.delivery === "steer" && currentRunMode === "remote") {
717
755
  const accepted = await currentSession?.trySteer({
718
756
  message: message.content.text,
@@ -744,6 +782,7 @@ async function runClaude(credentials, options = {}) {
744
782
  }
745
783
  logger.logger.debug(`[START] Received termination signal, cleaning up (archive=${intent === "archive"})...`);
746
784
  promptQueueDrain.close();
785
+ cleanupPrewarm();
747
786
  try {
748
787
  if (session) {
749
788
  currentSession?.cleanup();
@@ -809,7 +848,11 @@ async function runClaude(credentials, options = {}) {
809
848
  },
810
849
  onSessionReady: (sessionInstance) => {
811
850
  currentSession = sessionInstance;
851
+ sessionInstance.addSessionFoundCallback?.(announceSessionToScanner);
812
852
  },
853
+ // B-515: lease for a warm Claude process, taken once by the first
854
+ // remote launch (null when not eligible).
855
+ claudePrewarm: createPrewarm,
813
856
  // B-355: remember exactly what the SDK is about to write to the Claude
814
857
  // transcript, so the JSONL scanner below recognises it as ours.
815
858
  onPromptFinalized: recordAppPrompt,
@@ -834,6 +877,7 @@ async function runClaude(credentials, options = {}) {
834
877
  jsRuntime: options.jsRuntime
835
878
  });
836
879
  currentSession?.cleanup();
880
+ cleanupPrewarm();
837
881
  session.sendSessionDeath();
838
882
  logger.logger.debug("Waiting for socket to flush...");
839
883
  await session.flush();