very-happy-cli 0.2.158 → 0.2.160

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 (258) hide show
  1. package/dist/{AcpBackend-DIDRig5G.cjs → AcpBackend-Bm2rdke8.cjs} +78 -76
  2. package/dist/{AcpBackend-vDVLHuYJ.mjs → AcpBackend-mzv8Dhba.mjs} +4 -2
  3. package/dist/{AcpSessionManager-C44U99CC.cjs → AcpSessionManager-BAY1Pggx.cjs} +9 -9
  4. package/dist/{AcpSessionManager-CmRjfhn3.mjs → AcpSessionManager-CoMWFVw3.mjs} +1 -1
  5. package/dist/BasePermissionHandler-CFHAxumV.cjs +157 -0
  6. package/dist/BasePermissionHandler-m3WVholL.mjs +155 -0
  7. package/dist/BaseReasoningProcessor-BFa9_rZA.cjs +200 -0
  8. package/dist/BaseReasoningProcessor-CYrKBXGm.mjs +198 -0
  9. package/dist/RemoteModeDisplay-D-HewyXg.mjs +150 -0
  10. package/dist/RemoteModeDisplay-NC1gPHtj.cjs +153 -0
  11. package/dist/agentAttachments-Dbw8iMCZ.cjs +20 -0
  12. package/dist/agentAttachments-M_B5qEF2.mjs +18 -0
  13. package/dist/agentGuidance-B5NATuFa.cjs +28 -0
  14. package/dist/agentGuidance-CQuNlNx8.mjs +20 -0
  15. package/dist/{agentHome-Dw8Jx_CJ.cjs → agentHome-CboCeKWq.cjs} +14 -28
  16. package/dist/{agentHome-CyLmGH5L.mjs → agentHome-Dj1C43aJ.mjs} +8 -22
  17. package/dist/api-CLMUr-SX.mjs +3339 -0
  18. package/dist/api-CgundNNX.cjs +3346 -0
  19. package/dist/{types-DIBF4U0Y.mjs → apiMachine-B9dLW_p5.mjs} +9116 -16015
  20. package/dist/{types-DnrPeN80.cjs → apiMachine-Bn8482VM.cjs} +9104 -16057
  21. package/dist/assistantTools-BTqPnlFl.cjs +380 -0
  22. package/dist/assistantTools-D6tuc6o4.mjs +376 -0
  23. package/dist/attachmentContent-DpiTJZb4.cjs +88 -0
  24. package/dist/attachmentContent-_kxRznNf.mjs +82 -0
  25. package/dist/attachmentLimits-CzVrqgLR.cjs +354 -0
  26. package/dist/attachmentLimits-yba1uHFO.mjs +348 -0
  27. package/dist/auth-BDOVh5h5.cjs +220 -0
  28. package/dist/auth-Cwutmdsa.mjs +225 -0
  29. package/dist/auth-PYHZQNPp.mjs +218 -0
  30. package/dist/auth-ba4WMYrN.cjs +227 -0
  31. package/dist/authRelay-BdYkC1Po.cjs +156 -0
  32. package/dist/authRelay-DSAvg1uv.mjs +143 -0
  33. package/dist/{auto-DZbNcTXx.cjs → auto-BOX_fgmR.cjs} +70 -79
  34. package/dist/{auto-BlMZPwOk.mjs → auto-BXu14yP_.mjs} +27 -36
  35. package/dist/backgroundTaskActivity-8PdPxrvy.mjs +149 -0
  36. package/dist/backgroundTaskActivity-CBvUdj39.cjs +157 -0
  37. package/dist/bootstrap-B5G1TijC.cjs +116 -0
  38. package/dist/bootstrap-hxXPCFMx.mjs +112 -0
  39. package/dist/browser-Y6Bl8L_O.cjs +22 -0
  40. package/dist/browser-jh2P0UVZ.mjs +20 -0
  41. package/dist/claudeCliPath-BqkaH2oR.mjs +8 -0
  42. package/dist/claudeCliPath-U4HHmV4r.cjs +10 -0
  43. package/dist/claudeLocal-BaY4fZKi.mjs +339 -0
  44. package/dist/claudeLocal-CRGG4Pea.cjs +343 -0
  45. package/dist/claudeLocalLauncher-D4T7MTqd.mjs +152 -0
  46. package/dist/claudeLocalLauncher-DyEbVzUN.cjs +154 -0
  47. package/dist/cliUpdate-DsKXPFYp.cjs +120 -0
  48. package/dist/cliUpdate-Y34VGe9Y.mjs +112 -0
  49. package/dist/client-3Ac-O4pw.cjs +104 -0
  50. package/dist/client-BPNbmtvO.cjs +119 -0
  51. package/dist/client-CeGKqqcJ.mjs +100 -0
  52. package/dist/client-ClR0K8zX.mjs +112 -0
  53. package/dist/codex/happyMcpStdioBridge.cjs +33 -14
  54. package/dist/codex/happyMcpStdioBridge.mjs +26 -7
  55. package/dist/codexAppServerClient-I3teiV-N.mjs +1088 -0
  56. package/dist/codexAppServerClient-q2FjnRcK.cjs +1090 -0
  57. package/dist/codexCommand-4zcccIoq.cjs +2088 -0
  58. package/dist/codexCommand-Cc9gcbdX.mjs +2086 -0
  59. package/dist/codexThreadFork-BH9IZPqD.cjs +350 -0
  60. package/dist/codexThreadFork-slzAseLx.mjs +338 -0
  61. package/dist/{config-BtPArqRH.mjs → config-CTx_jb-C.mjs} +7 -40
  62. package/dist/{config-DG84bjwF.cjs → config-Ci9Kpgwa.cjs} +26 -59
  63. package/dist/configuration-BSYpcPwE.cjs +181 -0
  64. package/dist/configuration-RfeNjFmd.mjs +170 -0
  65. package/dist/connect-BpOdzNbE.mjs +682 -0
  66. package/dist/connect-C2CiOUFs.cjs +684 -0
  67. package/dist/constants-BC4St0xd.mjs +11 -0
  68. package/dist/constants-VJ0N6WuG.cjs +17 -0
  69. package/dist/contentLogMetadata-BlWI0egu.mjs +51 -0
  70. package/dist/contentLogMetadata-ZSFk_NjQ.cjs +54 -0
  71. package/dist/context-DsDr6E2t.cjs +69 -0
  72. package/dist/context-H0Bcb9S_.mjs +65 -0
  73. package/dist/controlClient-BGbDcgWS.mjs +260 -0
  74. package/dist/controlClient-Bcwv3D21.cjs +279 -0
  75. package/dist/createSessionMetadata-BJxEnM-o.cjs +58 -0
  76. package/dist/createSessionMetadata-CVVkGjxV.mjs +54 -0
  77. package/dist/defaultPermissionMode-BnxJPVHT.mjs +4 -0
  78. package/dist/defaultPermissionMode-CxmTXUQR.cjs +7 -0
  79. package/dist/detectCLI-CSGMlV51.mjs +58 -0
  80. package/dist/detectCLI-DR9ZaN6B.cjs +61 -0
  81. package/dist/deterministicJson-C5CYTVpm.cjs +507 -0
  82. package/dist/deterministicJson-CzkFJWw1.mjs +502 -0
  83. package/dist/doctor-BPkYWSuq.mjs +75 -0
  84. package/dist/doctor-D2YJ-Yn2.cjs +395 -0
  85. package/dist/doctor-DOvByjbk.mjs +391 -0
  86. package/dist/doctor-u46qYYKX.cjs +79 -0
  87. package/dist/doctorReadiness-BCZGcN0a.cjs +151 -0
  88. package/dist/doctorReadiness-C208SMN9.mjs +142 -0
  89. package/dist/editPaths-BVfS_FFL.mjs +68 -0
  90. package/dist/editPaths-Bqp4OFPw.cjs +73 -0
  91. package/dist/ensureDaemonRunning-BCwNrMyv.cjs +64 -0
  92. package/dist/ensureDaemonRunning-Dqa2pOjY.mjs +61 -0
  93. package/dist/handleResumeCommand-BvXYf5El.mjs +240 -0
  94. package/dist/handleResumeCommand-C2cKchpX.cjs +245 -0
  95. package/dist/ids-B6ZC0HGt.cjs +13 -0
  96. package/dist/ids-DU6sLx4C.mjs +10 -0
  97. package/dist/index-B6UGRQ7h.mjs +102 -0
  98. package/dist/{index-DPCsWlWK.cjs → index-B6pAdvJx.cjs} +131 -91
  99. package/dist/index-Bu5Zi_a9.cjs +182 -0
  100. package/dist/index-D3kI0hDR.cjs +107 -0
  101. package/dist/index-DA7yINuk.cjs +994 -0
  102. package/dist/index-DDeHXrIX.cjs +71 -0
  103. package/dist/index-DKLU_fD0.mjs +158 -0
  104. package/dist/{index-ZChGsuB7.mjs → index-DMZqWwsP.mjs} +79 -39
  105. package/dist/index-DVkMGPyS.mjs +68 -0
  106. package/dist/index-qdS1friN.mjs +949 -0
  107. package/dist/index.cjs +5 -46
  108. package/dist/index.mjs +5 -46
  109. package/dist/{install-DarS_Wco.mjs → install-BO_W7VhL.mjs} +37 -37
  110. package/dist/install-BgoC2e_2.cjs +88 -0
  111. package/dist/install-CFY3tYtJ.mjs +86 -0
  112. package/dist/{install-wKQGgXvN.cjs → install-Cs5qAPrB.cjs} +38 -38
  113. package/dist/{installPiTools-DuZ6jZvX.cjs → installPiTools-BKnXjrVu.cjs} +2 -3
  114. package/dist/{installPiTools-Cj7yU9Fc.mjs → installPiTools-B_CdM5_2.mjs} +1 -2
  115. package/dist/{installTerminalHooks-DcQfee_O.cjs → installTerminalHooks-BQZbvxsZ.cjs} +5 -40
  116. package/dist/{installTerminalHooks-CpNbRFPz.mjs → installTerminalHooks-By7gBMEF.mjs} +3 -38
  117. package/dist/lib.cjs +28 -19
  118. package/dist/lib.d.cts +126 -2
  119. package/dist/lib.d.mts +126 -2
  120. package/dist/lib.mjs +23 -14
  121. package/dist/lidState-BeDfxxEX.cjs +305 -0
  122. package/dist/lidState-CeEt442o.mjs +297 -0
  123. package/dist/limits-C-a7gr04.cjs +43 -0
  124. package/dist/limits-DIo7rEBR.mjs +36 -0
  125. package/dist/localHappyAgentAuth-C-HQyiv6.mjs +82 -0
  126. package/dist/localHappyAgentAuth-D6rFhaoc.cjs +86 -0
  127. package/dist/logger-6HYUEXNk.mjs +271 -0
  128. package/dist/logger-CS0mw3fa.cjs +275 -0
  129. package/dist/loginShellEnv-BkuYtExZ.cjs +182 -0
  130. package/dist/loginShellEnv-Dw8M7tkI.mjs +167 -0
  131. package/dist/machineMetadata-DyDbODYd.cjs +41 -0
  132. package/dist/machineMetadata-oOzBfDfs.mjs +38 -0
  133. package/dist/main-BkxJP6JQ.cjs +941 -0
  134. package/dist/main-BwNIAI1A.mjs +939 -0
  135. package/dist/manager-BQ4flvQZ.mjs +101 -0
  136. package/dist/manager-Cly8xVIR.cjs +105 -0
  137. package/dist/{mcp-BN6bKIGb.mjs → mcp-B1A4I3TK.mjs} +27 -33
  138. package/dist/{mcp-DGdeUUDJ.cjs → mcp-Hszd7qpS.cjs} +42 -48
  139. package/dist/messageBuffer-BWlGgR3A.mjs +71 -0
  140. package/dist/messageBuffer-fJMH6uY8.cjs +73 -0
  141. package/dist/mirrorProtocol-BNLtoWjO.mjs +170 -0
  142. package/dist/mirrorProtocol-BUtmg1ws.cjs +186 -0
  143. package/dist/oneShotPrompts-CL0dip9C.cjs +16 -0
  144. package/dist/oneShotPrompts-DT4p6RNd.mjs +12 -0
  145. package/dist/package-BhaKlnxz.mjs +171 -0
  146. package/dist/package-BwMrPwqH.cjs +173 -0
  147. package/dist/path-B7zW-WwE.cjs +18 -0
  148. package/dist/path-D2wdaNSk.mjs +15 -0
  149. package/dist/peerTools-BTqw97Gb.mjs +272 -0
  150. package/dist/peerTools-BvKtHXj8.cjs +283 -0
  151. package/dist/permissionMode-Cr5JCbB7.mjs +80 -0
  152. package/dist/permissionMode-CrV-XuMs.cjs +87 -0
  153. package/dist/persistence-HGW_ZVs9.mjs +372 -0
  154. package/dist/persistence-yKTH3-5X.cjs +414 -0
  155. package/dist/piExtension.mjs +2 -1
  156. package/dist/piRunnerArgs-BNloJCCg.cjs +66 -0
  157. package/dist/piRunnerArgs-BuX1UFWy.mjs +59 -0
  158. package/dist/{piRuntime-bkw2NAZU.mjs → piRuntime-CSGkwCKQ.mjs} +2 -2
  159. package/dist/{piRuntime-3qtbKujX.cjs → piRuntime-C_H7MJCM.cjs} +4 -4
  160. package/dist/{piTerminal-DilKwM7B.mjs → piTerminal-C8a1OrNQ.mjs} +32 -35
  161. package/dist/{piTerminal-BYxp3LMr.cjs → piTerminal-DNCZ6yTM.cjs} +32 -35
  162. package/dist/previewPath-B0rBdhy1.cjs +83 -0
  163. package/dist/previewPath-CXN4Vag0.mjs +81 -0
  164. package/dist/projectPath-BTBIMB57.mjs +10 -0
  165. package/dist/projectPath-ChLhdOyt.cjs +13 -0
  166. package/dist/registerCommonHandlers-Ccvsz7Ou.mjs +536 -0
  167. package/dist/registerCommonHandlers-DskirN-_.cjs +538 -0
  168. package/dist/registerKillSessionHandler-DZeLXWcB.cjs +361 -0
  169. package/dist/registerKillSessionHandler-GYvHdipX.mjs +358 -0
  170. package/dist/remoteSessionClient-B0LraSB9.cjs +634 -0
  171. package/dist/remoteSessionClient-CYnXRynE.mjs +612 -0
  172. package/dist/resources-BdFBQi8r.mjs +117 -0
  173. package/dist/resources-JDPugcDq.cjs +120 -0
  174. package/dist/run-CJzxoHVh.cjs +5762 -0
  175. package/dist/run-D3ifupU3.mjs +5739 -0
  176. package/dist/runClaude-Ba01qT-u.mjs +848 -0
  177. package/dist/runClaude-Da3RirzE.cjs +850 -0
  178. package/dist/runClaudeDeps-DOt79DjU.mjs +3624 -0
  179. package/dist/runClaudeDeps-DOzEBMls.cjs +3649 -0
  180. package/dist/{runGemini-Cjii069p.mjs → runGemini-BGeTz57m.mjs} +58 -31
  181. package/dist/{runGemini-28O2sqyI.cjs → runGemini-DSr9LIxL.cjs} +202 -175
  182. package/dist/{runOpenClaw-CiMZad-H.cjs → runOpenClaw-B1mTxN35.cjs} +64 -65
  183. package/dist/{runOpenClaw-jaLr7KF1.mjs → runOpenClaw-CogSedIc.mjs} +31 -32
  184. package/dist/sandbox-CG7IyDTU.cjs +187 -0
  185. package/dist/sandbox-DTe6d54R.mjs +180 -0
  186. package/dist/selfCheck-C9mVrQwf.mjs +84 -0
  187. package/dist/selfCheck-Dc-mNSLb.cjs +87 -0
  188. package/dist/{send-D5ejHPXG.cjs → send-B7J_eaG3.cjs} +16 -9
  189. package/dist/{send-C9mOtChi.mjs → send-CBXJKc6O.mjs} +12 -5
  190. package/dist/server-CZTP_iOn.cjs +407 -0
  191. package/dist/server-DcVBv04l.mjs +404 -0
  192. package/dist/sessionLock-Bys1PNSo.cjs +205 -0
  193. package/dist/sessionLock-D-EG2CfG.mjs +197 -0
  194. package/dist/sessionModeFile-DMl3dw3r.mjs +32 -0
  195. package/dist/sessionModeFile-RSm0NQkH.cjs +36 -0
  196. package/dist/sessionOps-Dn8z85h_.cjs +783 -0
  197. package/dist/sessionOps-SuHW8Dfe.mjs +760 -0
  198. package/dist/sessionScanner-BOrGjMXL.cjs +209 -0
  199. package/dist/sessionScanner-CX3onqXh.mjs +206 -0
  200. package/dist/{sessions-W6771g3X.mjs → sessions-BEG_HTSi.mjs} +17 -8
  201. package/dist/{sessions-BNMPQoLE.cjs → sessions-D74aJbhL.cjs} +37 -28
  202. package/dist/setupOfflineReconnection-ByElY60m.cjs +74 -0
  203. package/dist/setupOfflineReconnection-DpvWTt69.mjs +72 -0
  204. package/dist/smallFastModel-BLNgMrwR.mjs +18 -0
  205. package/dist/smallFastModel-D_uxGMo3.cjs +21 -0
  206. package/dist/{spawn-D0QVhzRb.mjs → spawn-B7yro0b2.mjs} +26 -38
  207. package/dist/{spawn-Ddtom1cb.cjs → spawn-DgR0RKRs.cjs} +52 -64
  208. package/dist/spawnAgents-BGQiEF-w.cjs +52 -0
  209. package/dist/spawnAgents-DZzZ9jMI.mjs +45 -0
  210. package/dist/spawnHappyCLI-B2H5s4B_.mjs +64 -0
  211. package/dist/spawnHappyCLI-DBhwZT7O.cjs +66 -0
  212. package/dist/specialCommands-BSqhYg5X.mjs +52 -0
  213. package/dist/specialCommands-DSsTeRej.cjs +54 -0
  214. package/dist/startFileWatcher-B4VsLgjD.cjs +71 -0
  215. package/dist/startFileWatcher-DErVWZE4.mjs +69 -0
  216. package/dist/startupPlan-BLMbfQIH.cjs +12 -0
  217. package/dist/startupPlan-DFMyNgAs.mjs +10 -0
  218. package/dist/streamRelay-BiKw59Cc.cjs +233 -0
  219. package/dist/streamRelay-FPVbHpbM.mjs +231 -0
  220. package/dist/sync-C8gyQFMc.mjs +69 -0
  221. package/dist/sync-DccIKZ5_.cjs +71 -0
  222. package/dist/systemPrompt-BwTPWfMu.cjs +97 -0
  223. package/dist/systemPrompt-DX521JJz.mjs +94 -0
  224. package/dist/{teams-CqSwtw2O.mjs → teams-C32F1hqd.mjs} +9 -40
  225. package/dist/{teams-BZ1tayg_.cjs → teams-Dl8g8kTI.cjs} +14 -45
  226. package/dist/template-BaHAmH2K.cjs +129 -0
  227. package/dist/template-CiOPa2rd.mjs +121 -0
  228. package/dist/{terminalTitleSuggest-DKgX3osW.mjs → terminalTitleSuggest-CeKsX_V6.mjs} +1 -9
  229. package/dist/{terminalTitleSuggest-Dji8I0Jy.cjs → terminalTitleSuggest-DhvRFX3H.cjs} +0 -10
  230. package/dist/terminals-B_bfC9c2.cjs +250 -0
  231. package/dist/terminals-Dlg0x3nY.mjs +235 -0
  232. package/dist/time-D0XyHOid.mjs +38 -0
  233. package/dist/time-DCuTyook.cjs +42 -0
  234. package/dist/titleGenerator-CQ8CoGhg.mjs +166 -0
  235. package/dist/titleGenerator-ChzMJsyg.cjs +172 -0
  236. package/dist/tmuxSocket-B8Yx20sT.mjs +19 -0
  237. package/dist/tmuxSocket-D-Xt6Vn-.cjs +24 -0
  238. package/dist/{todo-BYMg0fR0.cjs → todo-BvUOTa8G.cjs} +15 -12
  239. package/dist/{todo-BbusB1zM.mjs → todo-CZ6cFrrn.mjs} +11 -8
  240. package/dist/tools-BZtHF_qQ.mjs +177 -0
  241. package/dist/tools-Be3AoAwu.cjs +63 -0
  242. package/dist/tools-DQj0AeLk.cjs +180 -0
  243. package/dist/tools-DkluDcG4.mjs +60 -0
  244. package/dist/trimIdent-4gvk9Wk6.cjs +22 -0
  245. package/dist/trimIdent-BAjmv_TG.mjs +20 -0
  246. package/dist/types-CRS-srZK.cjs +66 -0
  247. package/dist/types-CkqAACXx.mjs +64 -0
  248. package/dist/uninstall-BkLzaJ6I.mjs +47 -0
  249. package/dist/uninstall-x-TUtf5H.cjs +49 -0
  250. package/package.json +7 -7
  251. package/dist/agentGuidance-CrR9l62U.mjs +0 -2145
  252. package/dist/agentGuidance-DwOWbX55.cjs +0 -2217
  253. package/dist/index-BG932eCh.cjs +0 -19655
  254. package/dist/index-CVCt3kSt.mjs +0 -19591
  255. package/dist/index-D5ScEErM.cjs +0 -58
  256. package/dist/index-DgO0FHOx.mjs +0 -52
  257. package/dist/limits-D2uN090G.mjs +0 -2528
  258. package/dist/limits-kqFqhfsh.cjs +0 -2652
@@ -0,0 +1,339 @@
1
+ import { spawn } from 'cross-spawn';
2
+ import { createInterface } from 'node:readline';
3
+ import { readdirSync, statSync, mkdirSync, existsSync } from 'node:fs';
4
+ import { randomUUID } from 'node:crypto';
5
+ import { l as logger } from './logger-6HYUEXNk.mjs';
6
+ import { p as pinSmallFastModel, e as ensureLocalProxyBypass } from './smallFastModel-BLNgMrwR.mjs';
7
+ import { join } from 'node:path';
8
+ import { g as getProjectPath } from './path-D2wdaNSk.mjs';
9
+ import { c as claudeCheckSession, s as systemPrompt } from './systemPrompt-DX521JJz.mjs';
10
+ import { i as initializeSandbox, a as wrapCommand } from './manager-BQ4flvQZ.mjs';
11
+ import { c as contentLogMetadata } from './contentLogMetadata-BlWI0egu.mjs';
12
+ import { claudeCliPath } from './claudeCliPath-BqkaH2oR.mjs';
13
+ import 'chalk';
14
+ import 'node:util';
15
+ import './configuration-RfeNjFmd.mjs';
16
+ import 'node:os';
17
+ import './package-BhaKlnxz.mjs';
18
+ import 'node:fs/promises';
19
+ import './index-qdS1friN.mjs';
20
+ import 'zod';
21
+ import '@paralleldrive/cuid2';
22
+ import './trimIdent-BAjmv_TG.mjs';
23
+ import './agentGuidance-CQuNlNx8.mjs';
24
+ import '@anthropic-ai/sandbox-runtime';
25
+ import './projectPath-BTBIMB57.mjs';
26
+ import 'path';
27
+ import 'url';
28
+
29
+ function claudeFindLastSession(workingDirectory) {
30
+ try {
31
+ const projectDir = getProjectPath(workingDirectory);
32
+ const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
33
+ const files = readdirSync(projectDir).filter((f) => f.endsWith(".jsonl")).map((f) => {
34
+ const sessionId = f.replace(".jsonl", "");
35
+ if (!uuidPattern.test(sessionId)) {
36
+ return null;
37
+ }
38
+ if (claudeCheckSession(sessionId, workingDirectory)) {
39
+ return {
40
+ name: f,
41
+ sessionId,
42
+ mtime: statSync(join(projectDir, f)).mtime.getTime()
43
+ };
44
+ }
45
+ return null;
46
+ }).filter((f) => f !== null).sort((a, b) => b.mtime - a.mtime);
47
+ return files.length > 0 ? files[0].sessionId : null;
48
+ } catch (e) {
49
+ logger.debug("[claudeFindLastSession] Error finding sessions:", e);
50
+ return null;
51
+ }
52
+ }
53
+
54
+ class ExitCodeError extends Error {
55
+ exitCode;
56
+ constructor(exitCode) {
57
+ super(`Process exited with code: ${exitCode}`);
58
+ this.name = "ExitCodeError";
59
+ this.exitCode = exitCode;
60
+ }
61
+ }
62
+ function quoteShellArg(value) {
63
+ return `'${value.replace(/'/g, `'\\''`)}'`;
64
+ }
65
+ async function claudeLocal(opts) {
66
+ const projectDir = getProjectPath(opts.path);
67
+ mkdirSync(projectDir, { recursive: true });
68
+ const hasContinueFlag = opts.claudeArgs?.includes("--continue");
69
+ const hasResumeFlag = opts.claudeArgs?.includes("--resume");
70
+ const hasUserSessionControl = hasContinueFlag || hasResumeFlag;
71
+ let startFrom = opts.sessionId;
72
+ const extractFlag = (flags, withValue = false) => {
73
+ if (!opts.claudeArgs) return { found: false };
74
+ for (const flag of flags) {
75
+ const index = opts.claudeArgs.indexOf(flag);
76
+ if (index !== -1) {
77
+ if (withValue && index + 1 < opts.claudeArgs.length) {
78
+ const nextArg = opts.claudeArgs[index + 1];
79
+ if (!nextArg.startsWith("-")) {
80
+ const value = nextArg;
81
+ opts.claudeArgs = opts.claudeArgs.filter((_, i) => i !== index && i !== index + 1);
82
+ return { found: true, value };
83
+ }
84
+ }
85
+ if (!withValue) {
86
+ opts.claudeArgs = opts.claudeArgs.filter((_, i) => i !== index);
87
+ return { found: true };
88
+ }
89
+ return { found: false };
90
+ }
91
+ }
92
+ return { found: false };
93
+ };
94
+ const sessionIdFlag = extractFlag(["--session-id"], true);
95
+ if (sessionIdFlag.found && sessionIdFlag.value) {
96
+ startFrom = null;
97
+ logger.debug(`[ClaudeLocal] Using explicit --session-id: ${sessionIdFlag.value}`);
98
+ }
99
+ if (!startFrom && !sessionIdFlag.value) {
100
+ const resumeFlag = extractFlag(["--resume", "-r"], true);
101
+ if (resumeFlag.found) {
102
+ if (resumeFlag.value) {
103
+ startFrom = resumeFlag.value;
104
+ logger.debug(`[ClaudeLocal] Using provided session ID from --resume: ${startFrom}`);
105
+ } else {
106
+ const lastSession = claudeFindLastSession(opts.path);
107
+ if (lastSession) {
108
+ startFrom = lastSession;
109
+ logger.debug(`[ClaudeLocal] --resume: Found last session: ${lastSession}`);
110
+ }
111
+ }
112
+ }
113
+ }
114
+ if (!startFrom && !sessionIdFlag.value) {
115
+ const continueFlag = extractFlag(["--continue", "-c"], false);
116
+ if (continueFlag.found) {
117
+ const lastSession = claudeFindLastSession(opts.path);
118
+ if (lastSession) {
119
+ startFrom = lastSession;
120
+ logger.debug(`[ClaudeLocal] --continue: Found last session: ${lastSession}`);
121
+ }
122
+ }
123
+ }
124
+ const explicitSessionId = sessionIdFlag.value || null;
125
+ let newSessionId = null;
126
+ let effectiveSessionId = startFrom;
127
+ if (!opts.hookSettingsPath) {
128
+ newSessionId = startFrom ? null : explicitSessionId || randomUUID();
129
+ effectiveSessionId = startFrom || newSessionId;
130
+ if (startFrom) {
131
+ logger.debug(`[ClaudeLocal] Resuming session: ${startFrom}`);
132
+ opts.onSessionFound(startFrom);
133
+ } else if (explicitSessionId) {
134
+ logger.debug(`[ClaudeLocal] Using explicit session ID: ${explicitSessionId}`);
135
+ opts.onSessionFound(explicitSessionId);
136
+ } else {
137
+ logger.debug(`[ClaudeLocal] Generated new session ID: ${newSessionId}`);
138
+ opts.onSessionFound(newSessionId);
139
+ }
140
+ } else {
141
+ if (startFrom) {
142
+ logger.debug(`[ClaudeLocal] Will resume existing session: ${startFrom}`);
143
+ } else if (hasUserSessionControl) {
144
+ logger.debug(`[ClaudeLocal] User passed ${hasContinueFlag ? "--continue" : "--resume"} flag, session ID will be determined by hook`);
145
+ } else {
146
+ logger.debug(`[ClaudeLocal] Fresh start, session ID will be provided by hook`);
147
+ }
148
+ }
149
+ let thinking = false;
150
+ let stopThinkingTimeout = null;
151
+ const updateThinking = (newThinking) => {
152
+ if (thinking !== newThinking) {
153
+ thinking = newThinking;
154
+ logger.debug(`[ClaudeLocal] Thinking state changed to: ${thinking}`);
155
+ if (opts.onThinkingChange) {
156
+ opts.onThinkingChange(thinking);
157
+ }
158
+ }
159
+ };
160
+ try {
161
+ process.stdin.pause();
162
+ const stdinHandle = process.stdin._handle;
163
+ if (stdinHandle && typeof stdinHandle.setBlocking === "function") {
164
+ try {
165
+ stdinHandle.setBlocking(true);
166
+ logger.debug("[ClaudeLocal] forced stdin to blocking mode before spawn");
167
+ } catch (err) {
168
+ logger.debug("[ClaudeLocal] setBlocking(true) failed: " + String(err));
169
+ }
170
+ }
171
+ await new Promise((r, reject) => {
172
+ const args = [];
173
+ if (!opts.hookSettingsPath) {
174
+ const hasResumeFlag2 = opts.claudeArgs?.includes("--resume") || opts.claudeArgs?.includes("-r");
175
+ if (startFrom) {
176
+ args.push("--resume", startFrom);
177
+ } else if (!hasResumeFlag2 && newSessionId) {
178
+ args.push("--session-id", newSessionId);
179
+ }
180
+ } else {
181
+ if (startFrom) {
182
+ args.push("--resume", startFrom);
183
+ }
184
+ }
185
+ args.push("--append-system-prompt", systemPrompt);
186
+ if (opts.mcpServers && Object.keys(opts.mcpServers).length > 0) {
187
+ args.push("--mcp-config", JSON.stringify({ mcpServers: opts.mcpServers }));
188
+ }
189
+ if (opts.allowedTools && opts.allowedTools.length > 0) {
190
+ args.push("--allowedTools", opts.allowedTools.join(","));
191
+ }
192
+ if (opts.claudeArgs) {
193
+ args.push(...opts.claudeArgs);
194
+ }
195
+ if (opts.hookSettingsPath) {
196
+ args.push("--settings", opts.hookSettingsPath);
197
+ logger.debug(`[ClaudeLocal] Using hook settings: ${opts.hookSettingsPath}`);
198
+ }
199
+ if (!claudeCliPath || !existsSync(claudeCliPath)) {
200
+ throw new Error("Claude local launcher not found. Please ensure HAPPY_PROJECT_ROOT is set correctly for development.");
201
+ }
202
+ const env = {
203
+ ...process.env,
204
+ ...opts.claudeEnvVars
205
+ };
206
+ pinSmallFastModel(env);
207
+ if (opts.mcpServers && Object.keys(opts.mcpServers).length > 0) {
208
+ ensureLocalProxyBypass(env);
209
+ }
210
+ logger.debug(`[ClaudeLocal] Spawning launcher: ${claudeCliPath}`);
211
+ logger.debug(`[ClaudeLocal] Args: ${JSON.stringify(args)}`);
212
+ (async () => {
213
+ let cleanupSandbox = null;
214
+ let spawnCommand = null;
215
+ let spawnArgs = [claudeCliPath, ...args];
216
+ let spawnWithShell = false;
217
+ if (opts.sandboxConfig?.enabled) {
218
+ if (process.platform === "win32") {
219
+ logger.warn("[ClaudeLocal] Sandbox is not supported on Windows; continuing without sandbox.");
220
+ } else {
221
+ try {
222
+ cleanupSandbox = await initializeSandbox(opts.sandboxConfig, opts.path);
223
+ if (!spawnArgs.includes("--dangerously-skip-permissions")) {
224
+ spawnArgs = [...spawnArgs, "--dangerously-skip-permissions"];
225
+ }
226
+ const fullCommand = [
227
+ "node",
228
+ ...spawnArgs.map((arg) => quoteShellArg(arg))
229
+ ].join(" ");
230
+ spawnCommand = await wrapCommand(fullCommand);
231
+ spawnWithShell = true;
232
+ logger.info(
233
+ `[ClaudeLocal] Sandbox enabled: workspace=${opts.sandboxConfig.workspaceRoot ?? opts.path}, network=${opts.sandboxConfig.networkMode}`
234
+ );
235
+ } catch (error) {
236
+ logger.warn("[ClaudeLocal] Failed to initialize sandbox; continuing without sandbox.", error);
237
+ cleanupSandbox = null;
238
+ spawnCommand = null;
239
+ spawnWithShell = false;
240
+ spawnArgs = [claudeCliPath, ...args];
241
+ }
242
+ }
243
+ }
244
+ const child = spawn(
245
+ spawnWithShell && spawnCommand ? spawnCommand : "node",
246
+ spawnWithShell ? [] : spawnArgs,
247
+ {
248
+ stdio: ["inherit", "inherit", "inherit", "pipe"],
249
+ signal: opts.abort,
250
+ cwd: opts.path,
251
+ env,
252
+ shell: spawnWithShell,
253
+ windowsHide: true
254
+ }
255
+ );
256
+ if (child.stdio[3]) {
257
+ const rl = createInterface({
258
+ input: child.stdio[3],
259
+ crlfDelay: Infinity
260
+ });
261
+ const activeFetches = /* @__PURE__ */ new Map();
262
+ rl.on("line", (line) => {
263
+ try {
264
+ const message = JSON.parse(line);
265
+ switch (message.type) {
266
+ case "fetch-start":
267
+ activeFetches.set(message.id, {
268
+ hostname: message.hostname,
269
+ path: message.path,
270
+ startTime: message.timestamp
271
+ });
272
+ if (stopThinkingTimeout) {
273
+ clearTimeout(stopThinkingTimeout);
274
+ stopThinkingTimeout = null;
275
+ }
276
+ updateThinking(true);
277
+ break;
278
+ case "fetch-end":
279
+ activeFetches.delete(message.id);
280
+ if (activeFetches.size === 0 && thinking && !stopThinkingTimeout) {
281
+ stopThinkingTimeout = setTimeout(() => {
282
+ if (activeFetches.size === 0) {
283
+ updateThinking(false);
284
+ }
285
+ stopThinkingTimeout = null;
286
+ }, 500);
287
+ }
288
+ break;
289
+ default:
290
+ logger.debug(`[ClaudeLocal] Unknown message type: ${message.type}`);
291
+ }
292
+ } catch (e) {
293
+ logger.debug("[ClaudeLocal] Non-JSON line from fd3:", contentLogMetadata(line));
294
+ }
295
+ });
296
+ rl.on("error", (err) => {
297
+ console.error("Error reading from fd 3:", err);
298
+ });
299
+ child.on("exit", () => {
300
+ if (stopThinkingTimeout) {
301
+ clearTimeout(stopThinkingTimeout);
302
+ }
303
+ updateThinking(false);
304
+ });
305
+ }
306
+ child.on("error", (error) => {
307
+ });
308
+ child.on("exit", async (code, signal) => {
309
+ if (cleanupSandbox) {
310
+ try {
311
+ await cleanupSandbox();
312
+ } catch (error) {
313
+ logger.warn("[ClaudeLocal] Failed to reset sandbox after session exit.", error);
314
+ }
315
+ }
316
+ if (signal === "SIGTERM" && opts.abort.aborted) {
317
+ r();
318
+ } else if (signal) {
319
+ reject(new Error(`Process terminated with signal: ${signal}`));
320
+ } else if (code !== 0 && code !== null) {
321
+ reject(new ExitCodeError(code));
322
+ } else {
323
+ r();
324
+ }
325
+ });
326
+ })().catch(reject);
327
+ });
328
+ } finally {
329
+ process.stdin.resume();
330
+ if (stopThinkingTimeout) {
331
+ clearTimeout(stopThinkingTimeout);
332
+ stopThinkingTimeout = null;
333
+ }
334
+ updateThinking(false);
335
+ }
336
+ return effectiveSessionId;
337
+ }
338
+
339
+ export { ExitCodeError, claudeCliPath, claudeLocal };
@@ -0,0 +1,343 @@
1
+ 'use strict';
2
+
3
+ var spawn = require('cross-spawn');
4
+ var node_readline = require('node:readline');
5
+ var node_fs = require('node:fs');
6
+ var node_crypto = require('node:crypto');
7
+ var logger = require('./logger-CS0mw3fa.cjs');
8
+ var smallFastModel = require('./smallFastModel-D_uxGMo3.cjs');
9
+ var path$1 = require('node:path');
10
+ var path = require('./path-B7zW-WwE.cjs');
11
+ var systemPrompt = require('./systemPrompt-BwTPWfMu.cjs');
12
+ var manager = require('./manager-Cly8xVIR.cjs');
13
+ var contentLogMetadata = require('./contentLogMetadata-ZSFk_NjQ.cjs');
14
+ var claudeCliPath = require('./claudeCliPath-U4HHmV4r.cjs');
15
+ require('chalk');
16
+ require('node:util');
17
+ require('./configuration-BSYpcPwE.cjs');
18
+ require('node:os');
19
+ require('./package-BwMrPwqH.cjs');
20
+ require('node:fs/promises');
21
+ require('./index-DA7yINuk.cjs');
22
+ require('zod');
23
+ require('@paralleldrive/cuid2');
24
+ require('./trimIdent-4gvk9Wk6.cjs');
25
+ require('./agentGuidance-B5NATuFa.cjs');
26
+ require('@anthropic-ai/sandbox-runtime');
27
+ require('./projectPath-ChLhdOyt.cjs');
28
+ require('path');
29
+ require('url');
30
+
31
+ function claudeFindLastSession(workingDirectory) {
32
+ try {
33
+ const projectDir = path.getProjectPath(workingDirectory);
34
+ const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
35
+ const files = node_fs.readdirSync(projectDir).filter((f) => f.endsWith(".jsonl")).map((f) => {
36
+ const sessionId = f.replace(".jsonl", "");
37
+ if (!uuidPattern.test(sessionId)) {
38
+ return null;
39
+ }
40
+ if (systemPrompt.claudeCheckSession(sessionId, workingDirectory)) {
41
+ return {
42
+ name: f,
43
+ sessionId,
44
+ mtime: node_fs.statSync(path$1.join(projectDir, f)).mtime.getTime()
45
+ };
46
+ }
47
+ return null;
48
+ }).filter((f) => f !== null).sort((a, b) => b.mtime - a.mtime);
49
+ return files.length > 0 ? files[0].sessionId : null;
50
+ } catch (e) {
51
+ logger.logger.debug("[claudeFindLastSession] Error finding sessions:", e);
52
+ return null;
53
+ }
54
+ }
55
+
56
+ class ExitCodeError extends Error {
57
+ exitCode;
58
+ constructor(exitCode) {
59
+ super(`Process exited with code: ${exitCode}`);
60
+ this.name = "ExitCodeError";
61
+ this.exitCode = exitCode;
62
+ }
63
+ }
64
+ function quoteShellArg(value) {
65
+ return `'${value.replace(/'/g, `'\\''`)}'`;
66
+ }
67
+ async function claudeLocal(opts) {
68
+ const projectDir = path.getProjectPath(opts.path);
69
+ node_fs.mkdirSync(projectDir, { recursive: true });
70
+ const hasContinueFlag = opts.claudeArgs?.includes("--continue");
71
+ const hasResumeFlag = opts.claudeArgs?.includes("--resume");
72
+ const hasUserSessionControl = hasContinueFlag || hasResumeFlag;
73
+ let startFrom = opts.sessionId;
74
+ const extractFlag = (flags, withValue = false) => {
75
+ if (!opts.claudeArgs) return { found: false };
76
+ for (const flag of flags) {
77
+ const index = opts.claudeArgs.indexOf(flag);
78
+ if (index !== -1) {
79
+ if (withValue && index + 1 < opts.claudeArgs.length) {
80
+ const nextArg = opts.claudeArgs[index + 1];
81
+ if (!nextArg.startsWith("-")) {
82
+ const value = nextArg;
83
+ opts.claudeArgs = opts.claudeArgs.filter((_, i) => i !== index && i !== index + 1);
84
+ return { found: true, value };
85
+ }
86
+ }
87
+ if (!withValue) {
88
+ opts.claudeArgs = opts.claudeArgs.filter((_, i) => i !== index);
89
+ return { found: true };
90
+ }
91
+ return { found: false };
92
+ }
93
+ }
94
+ return { found: false };
95
+ };
96
+ const sessionIdFlag = extractFlag(["--session-id"], true);
97
+ if (sessionIdFlag.found && sessionIdFlag.value) {
98
+ startFrom = null;
99
+ logger.logger.debug(`[ClaudeLocal] Using explicit --session-id: ${sessionIdFlag.value}`);
100
+ }
101
+ if (!startFrom && !sessionIdFlag.value) {
102
+ const resumeFlag = extractFlag(["--resume", "-r"], true);
103
+ if (resumeFlag.found) {
104
+ if (resumeFlag.value) {
105
+ startFrom = resumeFlag.value;
106
+ logger.logger.debug(`[ClaudeLocal] Using provided session ID from --resume: ${startFrom}`);
107
+ } else {
108
+ const lastSession = claudeFindLastSession(opts.path);
109
+ if (lastSession) {
110
+ startFrom = lastSession;
111
+ logger.logger.debug(`[ClaudeLocal] --resume: Found last session: ${lastSession}`);
112
+ }
113
+ }
114
+ }
115
+ }
116
+ if (!startFrom && !sessionIdFlag.value) {
117
+ const continueFlag = extractFlag(["--continue", "-c"], false);
118
+ if (continueFlag.found) {
119
+ const lastSession = claudeFindLastSession(opts.path);
120
+ if (lastSession) {
121
+ startFrom = lastSession;
122
+ logger.logger.debug(`[ClaudeLocal] --continue: Found last session: ${lastSession}`);
123
+ }
124
+ }
125
+ }
126
+ const explicitSessionId = sessionIdFlag.value || null;
127
+ let newSessionId = null;
128
+ let effectiveSessionId = startFrom;
129
+ if (!opts.hookSettingsPath) {
130
+ newSessionId = startFrom ? null : explicitSessionId || node_crypto.randomUUID();
131
+ effectiveSessionId = startFrom || newSessionId;
132
+ if (startFrom) {
133
+ logger.logger.debug(`[ClaudeLocal] Resuming session: ${startFrom}`);
134
+ opts.onSessionFound(startFrom);
135
+ } else if (explicitSessionId) {
136
+ logger.logger.debug(`[ClaudeLocal] Using explicit session ID: ${explicitSessionId}`);
137
+ opts.onSessionFound(explicitSessionId);
138
+ } else {
139
+ logger.logger.debug(`[ClaudeLocal] Generated new session ID: ${newSessionId}`);
140
+ opts.onSessionFound(newSessionId);
141
+ }
142
+ } else {
143
+ if (startFrom) {
144
+ logger.logger.debug(`[ClaudeLocal] Will resume existing session: ${startFrom}`);
145
+ } else if (hasUserSessionControl) {
146
+ logger.logger.debug(`[ClaudeLocal] User passed ${hasContinueFlag ? "--continue" : "--resume"} flag, session ID will be determined by hook`);
147
+ } else {
148
+ logger.logger.debug(`[ClaudeLocal] Fresh start, session ID will be provided by hook`);
149
+ }
150
+ }
151
+ let thinking = false;
152
+ let stopThinkingTimeout = null;
153
+ const updateThinking = (newThinking) => {
154
+ if (thinking !== newThinking) {
155
+ thinking = newThinking;
156
+ logger.logger.debug(`[ClaudeLocal] Thinking state changed to: ${thinking}`);
157
+ if (opts.onThinkingChange) {
158
+ opts.onThinkingChange(thinking);
159
+ }
160
+ }
161
+ };
162
+ try {
163
+ process.stdin.pause();
164
+ const stdinHandle = process.stdin._handle;
165
+ if (stdinHandle && typeof stdinHandle.setBlocking === "function") {
166
+ try {
167
+ stdinHandle.setBlocking(true);
168
+ logger.logger.debug("[ClaudeLocal] forced stdin to blocking mode before spawn");
169
+ } catch (err) {
170
+ logger.logger.debug("[ClaudeLocal] setBlocking(true) failed: " + String(err));
171
+ }
172
+ }
173
+ await new Promise((r, reject) => {
174
+ const args = [];
175
+ if (!opts.hookSettingsPath) {
176
+ const hasResumeFlag2 = opts.claudeArgs?.includes("--resume") || opts.claudeArgs?.includes("-r");
177
+ if (startFrom) {
178
+ args.push("--resume", startFrom);
179
+ } else if (!hasResumeFlag2 && newSessionId) {
180
+ args.push("--session-id", newSessionId);
181
+ }
182
+ } else {
183
+ if (startFrom) {
184
+ args.push("--resume", startFrom);
185
+ }
186
+ }
187
+ args.push("--append-system-prompt", systemPrompt.systemPrompt);
188
+ if (opts.mcpServers && Object.keys(opts.mcpServers).length > 0) {
189
+ args.push("--mcp-config", JSON.stringify({ mcpServers: opts.mcpServers }));
190
+ }
191
+ if (opts.allowedTools && opts.allowedTools.length > 0) {
192
+ args.push("--allowedTools", opts.allowedTools.join(","));
193
+ }
194
+ if (opts.claudeArgs) {
195
+ args.push(...opts.claudeArgs);
196
+ }
197
+ if (opts.hookSettingsPath) {
198
+ args.push("--settings", opts.hookSettingsPath);
199
+ logger.logger.debug(`[ClaudeLocal] Using hook settings: ${opts.hookSettingsPath}`);
200
+ }
201
+ if (!claudeCliPath.claudeCliPath || !node_fs.existsSync(claudeCliPath.claudeCliPath)) {
202
+ throw new Error("Claude local launcher not found. Please ensure HAPPY_PROJECT_ROOT is set correctly for development.");
203
+ }
204
+ const env = {
205
+ ...process.env,
206
+ ...opts.claudeEnvVars
207
+ };
208
+ smallFastModel.pinSmallFastModel(env);
209
+ if (opts.mcpServers && Object.keys(opts.mcpServers).length > 0) {
210
+ smallFastModel.ensureLocalProxyBypass(env);
211
+ }
212
+ logger.logger.debug(`[ClaudeLocal] Spawning launcher: ${claudeCliPath.claudeCliPath}`);
213
+ logger.logger.debug(`[ClaudeLocal] Args: ${JSON.stringify(args)}`);
214
+ (async () => {
215
+ let cleanupSandbox = null;
216
+ let spawnCommand = null;
217
+ let spawnArgs = [claudeCliPath.claudeCliPath, ...args];
218
+ let spawnWithShell = false;
219
+ if (opts.sandboxConfig?.enabled) {
220
+ if (process.platform === "win32") {
221
+ logger.logger.warn("[ClaudeLocal] Sandbox is not supported on Windows; continuing without sandbox.");
222
+ } else {
223
+ try {
224
+ cleanupSandbox = await manager.initializeSandbox(opts.sandboxConfig, opts.path);
225
+ if (!spawnArgs.includes("--dangerously-skip-permissions")) {
226
+ spawnArgs = [...spawnArgs, "--dangerously-skip-permissions"];
227
+ }
228
+ const fullCommand = [
229
+ "node",
230
+ ...spawnArgs.map((arg) => quoteShellArg(arg))
231
+ ].join(" ");
232
+ spawnCommand = await manager.wrapCommand(fullCommand);
233
+ spawnWithShell = true;
234
+ logger.logger.info(
235
+ `[ClaudeLocal] Sandbox enabled: workspace=${opts.sandboxConfig.workspaceRoot ?? opts.path}, network=${opts.sandboxConfig.networkMode}`
236
+ );
237
+ } catch (error) {
238
+ logger.logger.warn("[ClaudeLocal] Failed to initialize sandbox; continuing without sandbox.", error);
239
+ cleanupSandbox = null;
240
+ spawnCommand = null;
241
+ spawnWithShell = false;
242
+ spawnArgs = [claudeCliPath.claudeCliPath, ...args];
243
+ }
244
+ }
245
+ }
246
+ const child = spawn.spawn(
247
+ spawnWithShell && spawnCommand ? spawnCommand : "node",
248
+ spawnWithShell ? [] : spawnArgs,
249
+ {
250
+ stdio: ["inherit", "inherit", "inherit", "pipe"],
251
+ signal: opts.abort,
252
+ cwd: opts.path,
253
+ env,
254
+ shell: spawnWithShell,
255
+ windowsHide: true
256
+ }
257
+ );
258
+ if (child.stdio[3]) {
259
+ const rl = node_readline.createInterface({
260
+ input: child.stdio[3],
261
+ crlfDelay: Infinity
262
+ });
263
+ const activeFetches = /* @__PURE__ */ new Map();
264
+ rl.on("line", (line) => {
265
+ try {
266
+ const message = JSON.parse(line);
267
+ switch (message.type) {
268
+ case "fetch-start":
269
+ activeFetches.set(message.id, {
270
+ hostname: message.hostname,
271
+ path: message.path,
272
+ startTime: message.timestamp
273
+ });
274
+ if (stopThinkingTimeout) {
275
+ clearTimeout(stopThinkingTimeout);
276
+ stopThinkingTimeout = null;
277
+ }
278
+ updateThinking(true);
279
+ break;
280
+ case "fetch-end":
281
+ activeFetches.delete(message.id);
282
+ if (activeFetches.size === 0 && thinking && !stopThinkingTimeout) {
283
+ stopThinkingTimeout = setTimeout(() => {
284
+ if (activeFetches.size === 0) {
285
+ updateThinking(false);
286
+ }
287
+ stopThinkingTimeout = null;
288
+ }, 500);
289
+ }
290
+ break;
291
+ default:
292
+ logger.logger.debug(`[ClaudeLocal] Unknown message type: ${message.type}`);
293
+ }
294
+ } catch (e) {
295
+ logger.logger.debug("[ClaudeLocal] Non-JSON line from fd3:", contentLogMetadata.contentLogMetadata(line));
296
+ }
297
+ });
298
+ rl.on("error", (err) => {
299
+ console.error("Error reading from fd 3:", err);
300
+ });
301
+ child.on("exit", () => {
302
+ if (stopThinkingTimeout) {
303
+ clearTimeout(stopThinkingTimeout);
304
+ }
305
+ updateThinking(false);
306
+ });
307
+ }
308
+ child.on("error", (error) => {
309
+ });
310
+ child.on("exit", async (code, signal) => {
311
+ if (cleanupSandbox) {
312
+ try {
313
+ await cleanupSandbox();
314
+ } catch (error) {
315
+ logger.logger.warn("[ClaudeLocal] Failed to reset sandbox after session exit.", error);
316
+ }
317
+ }
318
+ if (signal === "SIGTERM" && opts.abort.aborted) {
319
+ r();
320
+ } else if (signal) {
321
+ reject(new Error(`Process terminated with signal: ${signal}`));
322
+ } else if (code !== 0 && code !== null) {
323
+ reject(new ExitCodeError(code));
324
+ } else {
325
+ r();
326
+ }
327
+ });
328
+ })().catch(reject);
329
+ });
330
+ } finally {
331
+ process.stdin.resume();
332
+ if (stopThinkingTimeout) {
333
+ clearTimeout(stopThinkingTimeout);
334
+ stopThinkingTimeout = null;
335
+ }
336
+ updateThinking(false);
337
+ }
338
+ return effectiveSessionId;
339
+ }
340
+
341
+ exports.claudeCliPath = claudeCliPath.claudeCliPath;
342
+ exports.ExitCodeError = ExitCodeError;
343
+ exports.claudeLocal = claudeLocal;