very-happy-cli 0.2.160 → 0.2.161

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 (162) hide show
  1. package/dist/{AcpBackend-mzv8Dhba.mjs → AcpBackend-6U6pQgx1.mjs} +3 -3
  2. package/dist/{AcpBackend-Bm2rdke8.cjs → AcpBackend-Ba98QDif.cjs} +3 -3
  3. package/dist/{BasePermissionHandler-CFHAxumV.cjs → BasePermissionHandler-2R0uH2CI.cjs} +1 -1
  4. package/dist/{BasePermissionHandler-m3WVholL.mjs → BasePermissionHandler-BvvhBTja.mjs} +1 -1
  5. package/dist/{BaseReasoningProcessor-CYrKBXGm.mjs → BaseReasoningProcessor-DyhO1uoU.mjs} +1 -1
  6. package/dist/{BaseReasoningProcessor-BFa9_rZA.cjs → BaseReasoningProcessor-fsVNmCEF.cjs} +1 -1
  7. package/dist/{agentHome-Dj1C43aJ.mjs → agentHome-Ck1i1TQB.mjs} +4 -4
  8. package/dist/{agentHome-CboCeKWq.cjs → agentHome-DvNnGphb.cjs} +4 -4
  9. package/dist/{api-CgundNNX.cjs → api-B2vLMS-z.cjs} +8 -8
  10. package/dist/{api-CLMUr-SX.mjs → api-SffjRQ1b.mjs} +8 -8
  11. package/dist/{apiMachine-B9dLW_p5.mjs → apiMachine-BpW9t8MO.mjs} +11 -11
  12. package/dist/{apiMachine-Bn8482VM.cjs → apiMachine-gFA54X7y.cjs} +11 -11
  13. package/dist/{assistantTools-BTqPnlFl.cjs → assistantTools-BfA0R3_m.cjs} +6 -6
  14. package/dist/{assistantTools-D6tuc6o4.mjs → assistantTools-CgiTbnWb.mjs} +6 -6
  15. package/dist/{attachmentContent-_kxRznNf.mjs → attachmentContent-CSGxr71v.mjs} +1 -1
  16. package/dist/{attachmentContent-DpiTJZb4.cjs → attachmentContent-DMMZzevR.cjs} +1 -1
  17. package/dist/{auth-ba4WMYrN.cjs → auth-Bt4ceBBy.cjs} +5 -5
  18. package/dist/{auth-Cwutmdsa.mjs → auth-CYHjQ8oQ.mjs} +5 -5
  19. package/dist/{auth-PYHZQNPp.mjs → auth-DdyVZSo6.mjs} +8 -8
  20. package/dist/{auth-BDOVh5h5.cjs → auth-x4CEoysH.cjs} +8 -8
  21. package/dist/{auto-BOX_fgmR.cjs → auto-BDXDUnjB.cjs} +12 -12
  22. package/dist/{auto-BXu14yP_.mjs → auto-CXLlRi3a.mjs} +12 -12
  23. package/dist/{bootstrap-hxXPCFMx.mjs → bootstrap-BNQq05jR.mjs} +2 -2
  24. package/dist/{bootstrap-B5G1TijC.cjs → bootstrap-CkgIq8N3.cjs} +2 -2
  25. package/dist/{browser-jh2P0UVZ.mjs → browser-9pyhQr1R.mjs} +1 -1
  26. package/dist/{browser-Y6Bl8L_O.cjs → browser-BDOlKWYe.cjs} +1 -1
  27. package/dist/{claudeLocal-CRGG4Pea.cjs → claudeLocal-BDuGFnjJ.cjs} +4 -4
  28. package/dist/{claudeLocal-BaY4fZKi.mjs → claudeLocal-CQa8qnwq.mjs} +4 -4
  29. package/dist/{claudeLocalLauncher-DyEbVzUN.cjs → claudeLocalLauncher-Bd5I2-j6.cjs} +9 -9
  30. package/dist/{claudeLocalLauncher-D4T7MTqd.mjs → claudeLocalLauncher-CDqQI9ak.mjs} +9 -9
  31. package/dist/{client-CeGKqqcJ.mjs → client-Brn-UwVk.mjs} +3 -3
  32. package/dist/{client-ClR0K8zX.mjs → client-CXb1VJui.mjs} +2 -2
  33. package/dist/{client-3Ac-O4pw.cjs → client-C_axwRry.cjs} +3 -3
  34. package/dist/{client-BPNbmtvO.cjs → client-DOBWJL3u.cjs} +2 -2
  35. package/dist/codex/happyMcpStdioBridge.cjs +14 -14
  36. package/dist/codex/happyMcpStdioBridge.mjs +14 -14
  37. package/dist/{codexAppServerClient-q2FjnRcK.cjs → codexAppServerClient-ZzhUTWPo.cjs} +2 -2
  38. package/dist/{codexAppServerClient-I3teiV-N.mjs → codexAppServerClient-oeQKD6Qf.mjs} +2 -2
  39. package/dist/{codexCommand-4zcccIoq.cjs → codexCommand-C7H0NpBe.cjs} +35 -35
  40. package/dist/{codexCommand-Cc9gcbdX.mjs → codexCommand-CJ82bl3l.mjs} +35 -35
  41. package/dist/{codexThreadFork-slzAseLx.mjs → codexThreadFork-BCaEMBiM.mjs} +1 -1
  42. package/dist/{codexThreadFork-BH9IZPqD.cjs → codexThreadFork-BZqF-9bX.cjs} +1 -1
  43. package/dist/{config-CTx_jb-C.mjs → config-BglnktIo.mjs} +3 -3
  44. package/dist/{config-Ci9Kpgwa.cjs → config-CYpL1Ahd.cjs} +3 -3
  45. package/dist/{configuration-RfeNjFmd.mjs → configuration-DoWFJUPm.mjs} +1 -1
  46. package/dist/{configuration-BSYpcPwE.cjs → configuration-v9f8LM9T.cjs} +1 -1
  47. package/dist/{connect-BpOdzNbE.mjs → connect-hgcNjyAB.mjs} +11 -11
  48. package/dist/{connect-C2CiOUFs.cjs → connect-yEvjdRvx.cjs} +11 -11
  49. package/dist/{context-DsDr6E2t.cjs → context-B45vMtSZ.cjs} +1 -1
  50. package/dist/{context-H0Bcb9S_.mjs → context-C9GHPLEm.mjs} +1 -1
  51. package/dist/{controlClient-BGbDcgWS.mjs → controlClient-DjoKTtgK.mjs} +3 -3
  52. package/dist/{controlClient-Bcwv3D21.cjs → controlClient-fEHE85bH.cjs} +3 -3
  53. package/dist/{createSessionMetadata-BJxEnM-o.cjs → createSessionMetadata-BRLB9CNO.cjs} +2 -2
  54. package/dist/{createSessionMetadata-CVVkGjxV.mjs → createSessionMetadata-mIeehclp.mjs} +2 -2
  55. package/dist/{deterministicJson-C5CYTVpm.cjs → deterministicJson-DKDP_mM-.cjs} +8 -8
  56. package/dist/{deterministicJson-CzkFJWw1.mjs → deterministicJson-p835AdAU.mjs} +8 -8
  57. package/dist/{doctor-DOvByjbk.mjs → doctor-BeUuQXFs.mjs} +6 -6
  58. package/dist/{doctor-D2YJ-Yn2.cjs → doctor-hVNnSZJn.cjs} +6 -6
  59. package/dist/{ensureDaemonRunning-Dqa2pOjY.mjs → ensureDaemonRunning-CO7d1gOC.mjs} +5 -5
  60. package/dist/{ensureDaemonRunning-BCwNrMyv.cjs → ensureDaemonRunning-Dg9aZfjs.cjs} +5 -5
  61. package/dist/{handleResumeCommand-BvXYf5El.mjs → handleResumeCommand-BiTPK0qd.mjs} +5 -5
  62. package/dist/{handleResumeCommand-C2cKchpX.cjs → handleResumeCommand-DnVmy7a3.cjs} +5 -5
  63. package/dist/{index-DMZqWwsP.mjs → index-CAFwetLk.mjs} +33 -33
  64. package/dist/{index-DVkMGPyS.mjs → index-Cqx-Raq6.mjs} +3 -3
  65. package/dist/{index-B6pAdvJx.cjs → index-LIn6nCcq.cjs} +32 -32
  66. package/dist/{index-Bu5Zi_a9.cjs → index-Pf2cV9cn.cjs} +4 -4
  67. package/dist/{index-DKLU_fD0.mjs → index-SPGPenK5.mjs} +4 -4
  68. package/dist/{index-DDeHXrIX.cjs → index-gNTWtSKN.cjs} +3 -3
  69. package/dist/index.cjs +2 -2
  70. package/dist/index.mjs +2 -2
  71. package/dist/{install-BgoC2e_2.cjs → install-Bu85vlHD.cjs} +3 -3
  72. package/dist/{install-CFY3tYtJ.mjs → install-ClUUl3yp.mjs} +3 -3
  73. package/dist/lib.cjs +10 -10
  74. package/dist/lib.mjs +10 -10
  75. package/dist/{lidState-CeEt442o.mjs → lidState-C2dI0FAN.mjs} +1 -1
  76. package/dist/{lidState-BeDfxxEX.cjs → lidState-KHHu1015.cjs} +1 -1
  77. package/dist/{localHappyAgentAuth-D6rFhaoc.cjs → localHappyAgentAuth-BXiHPXdC.cjs} +1 -1
  78. package/dist/{localHappyAgentAuth-C-HQyiv6.mjs → localHappyAgentAuth-DCsetiyG.mjs} +1 -1
  79. package/dist/{logger-CS0mw3fa.cjs → logger-Bc8-u1w0.cjs} +2 -2
  80. package/dist/{logger-6HYUEXNk.mjs → logger-fXoNzNuB.mjs} +2 -2
  81. package/dist/{machineMetadata-oOzBfDfs.mjs → machineMetadata-BHjehxJY.mjs} +3 -3
  82. package/dist/{machineMetadata-DyDbODYd.cjs → machineMetadata-BibDMFVx.cjs} +3 -3
  83. package/dist/{main-BwNIAI1A.mjs → main-BktM4A1K.mjs} +44 -44
  84. package/dist/{main-BkxJP6JQ.cjs → main-CLaX-t-b.cjs} +44 -44
  85. package/dist/{mcp-B1A4I3TK.mjs → mcp-CeUd9KDr.mjs} +14 -14
  86. package/dist/{mcp-Hszd7qpS.cjs → mcp-GBfE70nk.cjs} +14 -14
  87. package/dist/{package-BwMrPwqH.cjs → package-Cl5BEP5x.cjs} +7 -7
  88. package/dist/{package-BhaKlnxz.mjs → package-uOg9SCKi.mjs} +7 -7
  89. package/dist/{peerTools-BvKtHXj8.cjs → peerTools-CIeiy9wn.cjs} +4 -4
  90. package/dist/{peerTools-BTqw97Gb.mjs → peerTools-Dz3_7Bkk.mjs} +4 -4
  91. package/dist/{permissionMode-Cr5JCbB7.mjs → permissionMode-CH4FoZfU.mjs} +1 -1
  92. package/dist/{persistence-yKTH3-5X.cjs → persistence-CBNMzSa8.cjs} +3 -3
  93. package/dist/{persistence-HGW_ZVs9.mjs → persistence-oET5n61f.mjs} +3 -3
  94. package/dist/{piRunnerArgs-BNloJCCg.cjs → piRunnerArgs-Bf7RUF__.cjs} +1 -1
  95. package/dist/{piRunnerArgs-BuX1UFWy.mjs → piRunnerArgs-Dk1ncwHF.mjs} +1 -1
  96. package/dist/{piRuntime-C_H7MJCM.cjs → piRuntime-B_6TE9Eb.cjs} +1 -1
  97. package/dist/{piRuntime-CSGkwCKQ.mjs → piRuntime-BwRdhK_N.mjs} +1 -1
  98. package/dist/{piTerminal-C8a1OrNQ.mjs → piTerminal-Bap3R8Re.mjs} +16 -16
  99. package/dist/{piTerminal-DNCZ6yTM.cjs → piTerminal-CagmEoez.cjs} +16 -16
  100. package/dist/{registerCommonHandlers-DskirN-_.cjs → registerCommonHandlers-BjSV2Skz.cjs} +2 -2
  101. package/dist/{registerCommonHandlers-Ccvsz7Ou.mjs → registerCommonHandlers-CrgvJsOy.mjs} +2 -2
  102. package/dist/{registerKillSessionHandler-DZeLXWcB.cjs → registerKillSessionHandler-6TC2S3lf.cjs} +13 -8
  103. package/dist/{registerKillSessionHandler-GYvHdipX.mjs → registerKillSessionHandler-Cbc8Rgtd.mjs} +13 -8
  104. package/dist/{remoteSessionClient-B0LraSB9.cjs → remoteSessionClient-BNx78NLb.cjs} +5 -5
  105. package/dist/{remoteSessionClient-CYnXRynE.mjs → remoteSessionClient-CO7qOjR0.mjs} +5 -5
  106. package/dist/{run-D3ifupU3.mjs → run-2l5vSt2h.mjs} +32 -28
  107. package/dist/{run-CJzxoHVh.cjs → run-D5xAEWSB.cjs} +33 -29
  108. package/dist/{runClaude-Da3RirzE.cjs → runClaude-BX6ixjtW.cjs} +182 -138
  109. package/dist/{runClaude-Ba01qT-u.mjs → runClaude-BgN6xo05.mjs} +183 -139
  110. package/dist/{runClaudeDeps-DOzEBMls.cjs → runClaudeDeps-Bp20MScE.cjs} +638 -119
  111. package/dist/{runClaudeDeps-DOt79DjU.mjs → runClaudeDeps-COBBhD9o.mjs} +628 -123
  112. package/dist/{runGemini-DSr9LIxL.cjs → runGemini-CSMPkt0p.cjs} +30 -30
  113. package/dist/{runGemini-BGeTz57m.mjs → runGemini-Cc2jq-uh.mjs} +30 -30
  114. package/dist/{runOpenClaw-CogSedIc.mjs → runOpenClaw-CIlCwdW2.mjs} +15 -15
  115. package/dist/{runOpenClaw-B1mTxN35.cjs → runOpenClaw-YBwua4Rf.cjs} +15 -15
  116. package/dist/{sandbox-CG7IyDTU.cjs → sandbox-C4gXLP1p.cjs} +4 -4
  117. package/dist/{sandbox-DTe6d54R.mjs → sandbox-CNkwOtHI.mjs} +4 -4
  118. package/dist/{selfCheck-Dc-mNSLb.cjs → selfCheck-CU8xSDsl.cjs} +34 -34
  119. package/dist/selfCheck-hJ6PCh7v.mjs +84 -0
  120. package/dist/{send-CBXJKc6O.mjs → send-CGHcKZ-w.mjs} +8 -8
  121. package/dist/{send-B7J_eaG3.cjs → send-DY9Nr-x4.cjs} +8 -8
  122. package/dist/{server-CZTP_iOn.cjs → server-II51Mimf.cjs} +6 -6
  123. package/dist/{server-DcVBv04l.mjs → server-m2b5pamZ.mjs} +4 -4
  124. package/dist/{sessionLock-Bys1PNSo.cjs → sessionLock-7ePAYDOg.cjs} +2 -2
  125. package/dist/{sessionLock-D-EG2CfG.mjs → sessionLock-Cw6FmbMv.mjs} +2 -2
  126. package/dist/{sessionModeFile-RSm0NQkH.cjs → sessionModeFile-BVCV5f7E.cjs} +1 -1
  127. package/dist/{sessionModeFile-DMl3dw3r.mjs → sessionModeFile-CDmDyRkD.mjs} +1 -1
  128. package/dist/{sessionOps-SuHW8Dfe.mjs → sessionOps-C_f1wKOr.mjs} +4 -4
  129. package/dist/{sessionOps-Dn8z85h_.cjs → sessionOps-DJdExmBy.cjs} +4 -4
  130. package/dist/{sessionScanner-CX3onqXh.mjs → sessionScanner-CaAHLyNV.mjs} +3 -3
  131. package/dist/{sessionScanner-BOrGjMXL.cjs → sessionScanner-D1goKdd3.cjs} +3 -3
  132. package/dist/{sessions-D74aJbhL.cjs → sessions-DGs6ALNo.cjs} +9 -9
  133. package/dist/{sessions-BEG_HTSi.mjs → sessions-DnvmWUel.mjs} +9 -9
  134. package/dist/{setupOfflineReconnection-DpvWTt69.mjs → setupOfflineReconnection-CVViqZft.mjs} +2 -2
  135. package/dist/{setupOfflineReconnection-ByElY60m.cjs → setupOfflineReconnection-R7XuR_sj.cjs} +2 -2
  136. package/dist/{spawn-DgR0RKRs.cjs → spawn-CXTH7qg1.cjs} +19 -11
  137. package/dist/{spawn-B7yro0b2.mjs → spawn-DNYSvFtC.mjs} +19 -12
  138. package/dist/{spawnHappyCLI-DBhwZT7O.cjs → spawnHappyCLI-BhYj84rv.cjs} +1 -1
  139. package/dist/{spawnHappyCLI-B2H5s4B_.mjs → spawnHappyCLI-cqWQbwsb.mjs} +1 -1
  140. package/dist/{startFileWatcher-B4VsLgjD.cjs → startFileWatcher-CKKx-8ZO.cjs} +1 -1
  141. package/dist/{startFileWatcher-DErVWZE4.mjs → startFileWatcher-CdegMbJj.mjs} +1 -1
  142. package/dist/{sync-DccIKZ5_.cjs → sync-CVk4QERO.cjs} +1 -1
  143. package/dist/{sync-C8gyQFMc.mjs → sync-CxD-w_40.mjs} +1 -1
  144. package/dist/{systemPrompt-BwTPWfMu.cjs → systemPrompt-BygJcmbi.cjs} +1 -1
  145. package/dist/{systemPrompt-DX521JJz.mjs → systemPrompt-DmtypUc7.mjs} +1 -1
  146. package/dist/{teams-C32F1hqd.mjs → teams-BOC6nIPL.mjs} +6 -6
  147. package/dist/{teams-Dl8g8kTI.cjs → teams-BsvpOBfn.cjs} +6 -6
  148. package/dist/{time-D0XyHOid.mjs → time-BZNdNiIV.mjs} +1 -1
  149. package/dist/{time-DCuTyook.cjs → time-CNRE4ChD.cjs} +1 -1
  150. package/dist/{titleGenerator-ChzMJsyg.cjs → titleGenerator-CFRhU-xq.cjs} +2 -2
  151. package/dist/{titleGenerator-CQ8CoGhg.mjs → titleGenerator-ox6ptCsp.mjs} +1 -1
  152. package/dist/{todo-BvUOTa8G.cjs → todo-B-KB7oAB.cjs} +5 -5
  153. package/dist/{todo-CZ6cFrrn.mjs → todo-C5KBVbUw.mjs} +5 -5
  154. package/dist/{tools-BZtHF_qQ.mjs → tools-BZabNIid.mjs} +1 -1
  155. package/dist/{tools-DkluDcG4.mjs → tools-BmQQUATY.mjs} +1 -1
  156. package/dist/{tools-DQj0AeLk.cjs → tools-CsSovyNp.cjs} +1 -1
  157. package/dist/{tools-Be3AoAwu.cjs → tools-lMDra4Pv.cjs} +1 -1
  158. package/dist/{uninstall-BkLzaJ6I.mjs → uninstall-B1WLtC1d.mjs} +3 -3
  159. package/dist/{uninstall-x-TUtf5H.cjs → uninstall-fvA5aWpU.cjs} +3 -3
  160. package/package.json +7 -7
  161. package/scripts/session_hook_forwarder.cjs +9 -2
  162. package/dist/selfCheck-C9mVrQwf.mjs +0 -84
@@ -1,22 +1,22 @@
1
1
  import os from 'node:os';
2
- import { c as claimSessionOrExit, a as applyServerSnapshot, w as withoutServerSnapshot, m as mergeReconnectMetadata } from './sessionLock-D-EG2CfG.mjs';
2
+ import { c as claimSessionOrExit, a as applyServerSnapshot, w as withoutServerSnapshot, m as mergeReconnectMetadata } from './sessionLock-Cw6FmbMv.mjs';
3
3
  import { randomUUID } from 'node:crypto';
4
- import { c as connectionState, A as ApiClient, s as startOfflineReconnection } from './api-CLMUr-SX.mjs';
5
- import { l as logger } from './logger-6HYUEXNk.mjs';
6
- import { p as packageJson } from './package-BhaKlnxz.mjs';
7
- import { readSettings } from './persistence-HGW_ZVs9.mjs';
8
- import { s as spawnOriginTags } from './createSessionMetadata-CVVkGjxV.mjs';
4
+ import { c as connectionState, A as ApiClient, s as startOfflineReconnection } from './api-SffjRQ1b.mjs';
5
+ import { l as logger } from './logger-fXoNzNuB.mjs';
6
+ import { p as packageJson } from './package-uOg9SCKi.mjs';
7
+ import { readSettings } from './persistence-oET5n61f.mjs';
8
+ import { s as spawnOriginTags } from './createSessionMetadata-mIeehclp.mjs';
9
9
  import { P as PROMPT_QUEUE_CAPABILITY } from './index-qdS1friN.mjs';
10
- import { c as configuration } from './configuration-RfeNjFmd.mjs';
11
- import { n as notifyDaemonSessionStarted } from './controlClient-BGbDcgWS.mjs';
12
- import { g as getInitialMachineMetadata } from './machineMetadata-oOzBfDfs.mjs';
10
+ import { c as configuration } from './configuration-DoWFJUPm.mjs';
11
+ import { n as notifyDaemonSessionStarted } from './controlClient-DjoKTtgK.mjs';
12
+ import { g as getInitialMachineMetadata } from './machineMetadata-BHjehxJY.mjs';
13
13
  import { p as projectPath } from './projectPath-BTBIMB57.mjs';
14
14
  import { resolve, join } from 'node:path';
15
- import { a as applySandboxPermissionPolicy, r as resolveInitialClaudePermissionMode, m as mapToClaudeMode, b as resolveRemoteClaudePermissionMode, c as reconcilePublishedPermissionMode } from './permissionMode-Cr5JCbB7.mjs';
15
+ import { a as applySandboxPermissionPolicy, r as resolveInitialClaudePermissionMode, m as mapToClaudeMode, b as reconcilePublishedPermissionMode } from './permissionMode-CH4FoZfU.mjs';
16
16
  import { d as decodeBase64, e as encodeBase64 } from './authRelay-DSAvg1uv.mjs';
17
17
  import { readFile } from 'node:fs/promises';
18
18
  import { D as DEFAULT_CLAUDE_PERMISSION_MODE } from './defaultPermissionMode-BnxJPVHT.mjs';
19
- import { C as CLAUDE_ATTACHMENT_KINDS, s as stripAttachmentManifest } from './attachmentContent-_kxRznNf.mjs';
19
+ import { C as CLAUDE_ATTACHMENT_KINDS, s as stripAttachmentManifest } from './attachmentContent-CSGxr71v.mjs';
20
20
  import { p as planClaudeStartup } from './startupPlan-DFMyNgAs.mjs';
21
21
  import 'node:fs';
22
22
  import 'axios';
@@ -25,39 +25,45 @@ import 'socket.io-client';
25
25
  import './attachmentLimits-yba1uHFO.mjs';
26
26
  import 'zod';
27
27
  import './limits-DIo7rEBR.mjs';
28
- import './time-D0XyHOid.mjs';
29
- import './lidState-CeEt442o.mjs';
28
+ import './time-BZNdNiIV.mjs';
29
+ import './lidState-C2dI0FAN.mjs';
30
30
  import 'os';
31
31
  import 'child_process';
32
- import './registerCommonHandlers-Ccvsz7Ou.mjs';
32
+ import './registerCommonHandlers-CrgvJsOy.mjs';
33
33
  import 'util';
34
34
  import 'fs/promises';
35
35
  import 'crypto';
36
36
  import 'path';
37
37
  import 'cross-spawn';
38
38
  import '@paralleldrive/cuid2';
39
- import './sync-C8gyQFMc.mjs';
39
+ import './sync-CxD-w_40.mjs';
40
40
  import './backgroundTaskActivity-8PdPxrvy.mjs';
41
41
  import './contentLogMetadata-BlWI0egu.mjs';
42
42
  import 'chalk';
43
43
  import 'node:util';
44
44
  import './detectCLI-CSGMlV51.mjs';
45
45
  import 'fs';
46
- import './localHappyAgentAuth-C-HQyiv6.mjs';
46
+ import './localHappyAgentAuth-DCsetiyG.mjs';
47
47
  import 'tweetnacl';
48
48
  import 'url';
49
49
 
50
50
  const DEFAULT_CLAUDE_MODEL = void 0;
51
51
  const DEFAULT_CLAUDE_EFFORT = void 0;
52
+ const importRunClaudeDeps = () => import('./runClaudeDeps-COBBhD9o.mjs');
52
53
  async function runClaude(credentials, options = {}) {
53
54
  logger.debug(`[CLAUDE] ===== CLAUDE MODE STARTING =====`);
54
55
  logger.debug(`[CLAUDE] This is the Claude agent, NOT Gemini`);
55
56
  options = { ...options, claudeEnvVars: { ...options.claudeEnvVars, HAPPY_MANAGED: "1" } };
57
+ const prewarmSpawnEnv = {};
58
+ for (const key of ["HAPPY_CLAUDE_AUTH_STATUS", "HAPPY_FIRST_MESSAGE_FROM_CLI"]) {
59
+ prewarmSpawnEnv[key] = process.env[key];
60
+ delete process.env[key];
61
+ }
56
62
  const workingDirectory = process.cwd();
57
63
  const isAssistantVariant = process.env.HAPPY_SESSION_VARIANT === "assistant";
58
64
  if (isAssistantVariant) {
59
65
  try {
60
- const { bootstrapAssistantHome } = await import('./bootstrap-hxXPCFMx.mjs');
66
+ const { bootstrapAssistantHome } = await import('./bootstrap-BNQq05jR.mjs');
61
67
  await bootstrapAssistantHome();
62
68
  } catch (error) {
63
69
  logger.debug("[START] Assistant home bootstrap failed:", error);
@@ -68,9 +74,15 @@ async function runClaude(credentials, options = {}) {
68
74
  if (options.startedBy === "daemon" && options.startingMode === "local") {
69
75
  throw new Error("Daemon-spawned sessions cannot use local/interactive mode. Use --happy-starting-mode remote or spawn sessions directly from terminal.");
70
76
  }
71
- const depsLoad = import('./runClaudeDeps-DOt79DjU.mjs');
72
- depsLoad.catch(() => {
73
- });
77
+ let depsLoadPromise = null;
78
+ const loadDeps = () => {
79
+ if (!depsLoadPromise) {
80
+ depsLoadPromise = importRunClaudeDeps();
81
+ depsLoadPromise.catch(() => {
82
+ });
83
+ }
84
+ return depsLoadPromise;
85
+ };
74
86
  const reconnectRequested = Boolean(
75
87
  process.env.HAPPY_RECONNECT_SESSION_ID && process.env.HAPPY_RECONNECT_ENCRYPTION_KEY && process.env.HAPPY_RECONNECT_ENCRYPTION_VARIANT
76
88
  );
@@ -169,8 +181,8 @@ async function runClaude(credentials, options = {}) {
169
181
  }
170
182
  if (!response) {
171
183
  let offlineSessionId = null;
172
- const { claudeLocal } = await import('./claudeLocal-BaY4fZKi.mjs');
173
- const { createSessionScanner: createSessionScanner2 } = await depsLoad;
184
+ const { claudeLocal } = await import('./claudeLocal-CQa8qnwq.mjs');
185
+ const { createSessionScanner: createSessionScanner2 } = await loadDeps();
174
186
  const reconnection = startOfflineReconnection({
175
187
  serverUrl: configuration.serverUrl,
176
188
  onReconnected: async () => {
@@ -245,12 +257,13 @@ async function runClaude(credentials, options = {}) {
245
257
  } catch (error) {
246
258
  logger.debug("[START] Failed to report to daemon (may not be running):", error);
247
259
  }
260
+ loadDeps();
248
261
  if (!startupPlan.registerMachine) {
249
262
  void Promise.resolve().then(() => api.getOrCreateMachine({ machineId, metadata: getInitialMachineMetadata() })).catch((error) => logger.debug("[START] Background machine registration failed:", error));
250
263
  }
251
264
  let deps;
252
265
  try {
253
- deps = await depsLoad;
266
+ deps = await loadDeps();
254
267
  } catch (error) {
255
268
  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)}`);
256
269
  try {
@@ -291,7 +304,21 @@ async function runClaude(credentials, options = {}) {
291
304
  FileRateLimiter,
292
305
  createSelfReportState,
293
306
  withAssistantDenylist,
294
- contentLogMetadata
307
+ contentLogMetadata,
308
+ resolveMessageMode,
309
+ claudePrewarmEligibility,
310
+ claudePrewarmSessionEligibility,
311
+ prewarmCacheFile,
312
+ readPrewarmCache,
313
+ writePrewarmCache,
314
+ prewarmPredictionMeta,
315
+ evaluatePrewarmPrediction,
316
+ acquirePrewarmSlot,
317
+ prewarmSlotDir,
318
+ PrewarmHookGate,
319
+ createClaudePrewarmLease,
320
+ disposeAllClaudePrewarms,
321
+ formatPrewarmLine
295
322
  } = deps;
296
323
  logger.debugLargeJson("[START] Happy process started", getEnvironmentInfo());
297
324
  const session = earlySession ?? api.sessionSyncClient(response, reconnectSeeded ? { initialSeq: response.seq } : void 0);
@@ -410,10 +437,21 @@ async function runClaude(credentials, options = {}) {
410
437
  const happyServer = await startHappyServer(session, { assistant: isAssistantVariant, selfReportState: boardSelfReport });
411
438
  logger.debug(`[START] Happy MCP server started at ${happyServer.url}`);
412
439
  let currentSession = null;
440
+ const prewarmHookGate = new PrewarmHookGate();
441
+ let scannerAnnouncedSessionId = null;
442
+ const announceSessionToScanner = (sessionId) => {
443
+ if (sessionId === scannerAnnouncedSessionId) return;
444
+ scannerAnnouncedSessionId = sessionId;
445
+ void Promise.resolve(remoteScanner.onNewSession(sessionId, { treatExistingAsProcessed: true })).catch((error) => logger.debug("[START] remote scanner onNewSession failed:", error));
446
+ };
413
447
  const hookServer = await startHookServer({
414
- onSessionHook: (sessionId, data) => {
448
+ onSessionHook: (sessionId, data, hookMeta) => {
449
+ if (!prewarmHookGate.accepts(hookMeta?.source)) {
450
+ logger.debug(`[START] Session hook from an unadopted warm Claude process ignored (${hookMeta?.source})`);
451
+ return;
452
+ }
415
453
  logger.debug(`[START] Session hook received: ${sessionId}`, contentLogMetadata(data));
416
- remoteScanner.onNewSession(sessionId, { treatExistingAsProcessed: true });
454
+ announceSessionToScanner(sessionId);
417
455
  if (currentSession) {
418
456
  const previousSessionId = currentSession.sessionId;
419
457
  if (previousSessionId !== sessionId) {
@@ -509,6 +547,94 @@ async function runClaude(credentials, options = {}) {
509
547
  currentEffort = DEFAULT_CLAUDE_EFFORT;
510
548
  logger.debug("[loop] Reset current mode defaults after abort");
511
549
  };
550
+ const currentModeState = () => ({
551
+ permissionMode: currentPermissionMode,
552
+ model: currentModel,
553
+ fallbackModel: currentFallbackModel,
554
+ customSystemPrompt: currentCustomSystemPrompt,
555
+ appendSystemPrompt: currentAppendSystemPrompt,
556
+ allowedTools: currentAllowedTools,
557
+ disallowedTools: currentDisallowedTools,
558
+ effort: currentEffort
559
+ });
560
+ const prewarmCachePath = prewarmCacheFile(configuration.happyHomeDir);
561
+ let prewarmCache = readPrewarmCache(prewarmCachePath);
562
+ const prewarmSessionInput = {
563
+ env: { ...process.env, ...prewarmSpawnEnv },
564
+ startedBy: options.startedBy,
565
+ startingMode: options.startingMode,
566
+ claudeArgs: options.claudeArgs,
567
+ setting: settings?.claudePrewarm
568
+ };
569
+ const prewarmCtx = () => ({ sandboxEnabled, isAssistantVariant, staleModeSnapshot: false });
570
+ const predictFirstMessageMode = () => prewarmCache ? resolveMessageMode(currentModeState(), prewarmPredictionMeta(prewarmCache), prewarmCtx()).mode : null;
571
+ let firstMessageScored = false;
572
+ const scoreFirstMessage = (meta, predicted, actual) => {
573
+ if (firstMessageScored) return;
574
+ firstMessageScored = true;
575
+ if (meta?.sentFrom !== "web") return;
576
+ if (!claudePrewarmSessionEligibility({ ...prewarmSessionInput, env: { ...process.env, ...prewarmSpawnEnv } }).eligible) return;
577
+ const { outcome, next } = evaluatePrewarmPrediction({ predicted, actual, meta, previous: prewarmCache });
578
+ logger.debug(`[CLAUDE PREWARM] prediction ${outcome}${next ? ` consecutiveMisses=${next.consecutiveMisses}` : ""}`);
579
+ if (next && writePrewarmCache(prewarmCachePath, next)) prewarmCache = next;
580
+ };
581
+ let userMessageSeen = false;
582
+ const prewarmTagFiles = /* @__PURE__ */ new Set();
583
+ const createPrewarm = () => {
584
+ const eligibility = claudePrewarmEligibility({
585
+ ...prewarmSessionInput,
586
+ env: { ...process.env, ...prewarmSpawnEnv },
587
+ cache: prewarmCache
588
+ });
589
+ if (!eligibility.eligible) {
590
+ logger.debug(formatPrewarmLine("skipped", eligibility.reason));
591
+ return null;
592
+ }
593
+ if (userMessageSeen) {
594
+ logger.debug(formatPrewarmLine("skipped", "message-already-received"));
595
+ return null;
596
+ }
597
+ const slot = acquirePrewarmSlot(prewarmSlotDir(configuration.happyHomeDir));
598
+ if (!slot) {
599
+ logger.debug(formatPrewarmLine("skipped", "concurrency-limit"));
600
+ return null;
601
+ }
602
+ const predicted = predictFirstMessageMode();
603
+ if (!predicted) {
604
+ slot.release();
605
+ return null;
606
+ }
607
+ const tag = prewarmHookGate.newTag();
608
+ let tagHookSettingsPath;
609
+ try {
610
+ tagHookSettingsPath = generateHookSettingsFile(hookServer.port, tag);
611
+ } catch (error) {
612
+ slot.release();
613
+ logger.debug(formatPrewarmLine("skipped", "hook-settings"));
614
+ return null;
615
+ }
616
+ prewarmTagFiles.add(tagHookSettingsPath);
617
+ return createClaudePrewarmLease({
618
+ mode: predicted,
619
+ hookSettingsPath: tagHookSettingsPath,
620
+ tag,
621
+ gate: prewarmHookGate,
622
+ slot,
623
+ // Only removed on discard: an adopted process keeps reading its
624
+ // settings file (later SessionStart events, e.g. /compact); it goes
625
+ // with the other hook files at exit.
626
+ cleanupHookSettings: () => {
627
+ cleanupHookSettingsFile(tagHookSettingsPath);
628
+ prewarmTagFiles.delete(tagHookSettingsPath);
629
+ },
630
+ log: (line) => logger.debug(line)
631
+ });
632
+ };
633
+ const cleanupPrewarm = () => {
634
+ disposeAllClaudePrewarms("shutdown");
635
+ for (const file of prewarmTagFiles) cleanupHookSettingsFile(file);
636
+ prewarmTagFiles.clear();
637
+ };
512
638
  session.onFileEvent((fileEvent) => {
513
639
  const ev = fileEvent.content.data.ev;
514
640
  logger.debug(`[loop] File event received: ${ev.name} (${ev.size} bytes, ref: ${ev.ref})`);
@@ -529,112 +655,42 @@ async function runClaude(credentials, options = {}) {
529
655
  session.trackAttachmentDownload(downloadPromise);
530
656
  });
531
657
  session.onUserMessage(async (message) => {
658
+ userMessageSeen = true;
532
659
  if (message?.content?.text) {
533
660
  titleGenerator.maybeGenerate(message.content.text);
534
661
  boardAnalyzer.noteUserMessage(message.content.text);
535
662
  }
536
663
  const attachmentsForThisMessage = await session.drainAttachmentsForUserMessage();
537
- let messagePermissionMode = currentPermissionMode;
538
664
  const messageCreatedAt = message.createdAt;
539
665
  const staleModeSnapshot = message.meta?.permissionMode !== void 0 && typeof messageCreatedAt === "number" && messageCreatedAt < lastExplicitModeSwitchAt;
540
666
  if (staleModeSnapshot) {
541
667
  logger.debug(`[loop] Ignoring stale meta.permissionMode=${message.meta?.permissionMode} (message ${messageCreatedAt} predates explicit switch ${lastExplicitModeSwitchAt}); keeping ${currentPermissionMode}`);
542
- } else if (message.meta?.permissionMode) {
543
- const previousPermissionMode = currentPermissionMode;
544
- messagePermissionMode = resolveRemoteClaudePermissionMode(
545
- currentPermissionMode,
546
- message.meta.permissionMode,
547
- sandboxEnabled
548
- );
549
- publishPermissionMode(messagePermissionMode);
550
- const ignoredDefaultDowngrade = (previousPermissionMode === "bypassPermissions" || previousPermissionMode === "yolo") && message.meta.permissionMode === "default" && currentPermissionMode === previousPermissionMode;
551
- if (ignoredDefaultDowngrade) {
552
- logger.debug(`[loop] Ignoring permission mode downgrade from ${previousPermissionMode} to default`);
553
- } else {
554
- logger.debug(`[loop] Permission mode updated from user message to: ${currentPermissionMode}`);
555
- }
556
- } else {
557
- logger.debug(`[loop] User message received with no permission mode override, using current: ${currentPermissionMode}`);
558
- }
559
- let messageModel = currentModel;
560
- if (message.meta?.hasOwnProperty("model")) {
561
- messageModel = message.meta.model || void 0;
562
- currentModel = messageModel;
563
- logger.debug(`[loop] Model updated from user message: ${messageModel || "reset to default"}`);
564
- } else {
565
- logger.debug(`[loop] User message received with no model override, using current: ${currentModel || "default"}`);
566
- }
567
- let messageCustomSystemPrompt = currentCustomSystemPrompt;
568
- if (message.meta?.hasOwnProperty("customSystemPrompt")) {
569
- messageCustomSystemPrompt = message.meta.customSystemPrompt || void 0;
570
- currentCustomSystemPrompt = messageCustomSystemPrompt;
571
- logger.debug(`[loop] Custom system prompt updated from user message: ${messageCustomSystemPrompt ? "set" : "reset to none"}`);
572
- } else {
573
- logger.debug(`[loop] User message received with no custom system prompt override, using current: ${currentCustomSystemPrompt ? "set" : "none"}`);
574
- }
575
- let messageFallbackModel = currentFallbackModel;
576
- if (message.meta?.hasOwnProperty("fallbackModel")) {
577
- messageFallbackModel = message.meta.fallbackModel || void 0;
578
- currentFallbackModel = messageFallbackModel;
579
- logger.debug(`[loop] Fallback model updated from user message: ${messageFallbackModel || "reset to none"}`);
580
- } else {
581
- logger.debug(`[loop] User message received with no fallback model override, using current: ${currentFallbackModel || "none"}`);
582
- }
583
- let messageAppendSystemPrompt = currentAppendSystemPrompt;
584
- if (message.meta?.hasOwnProperty("appendSystemPrompt")) {
585
- messageAppendSystemPrompt = message.meta.appendSystemPrompt || void 0;
586
- currentAppendSystemPrompt = messageAppendSystemPrompt;
587
- logger.debug(`[loop] Append system prompt updated from user message: ${messageAppendSystemPrompt ? "set" : "reset to none"}`);
588
- } else {
589
- logger.debug(`[loop] User message received with no append system prompt override, using current: ${currentAppendSystemPrompt ? "set" : "none"}`);
590
- }
591
- let messageAllowedTools = currentAllowedTools;
592
- if (message.meta?.hasOwnProperty("allowedTools")) {
593
- messageAllowedTools = message.meta.allowedTools || void 0;
594
- currentAllowedTools = messageAllowedTools;
595
- logger.debug(`[loop] Allowed tools updated from user message: ${messageAllowedTools ? messageAllowedTools.join(", ") : "reset to none"}`);
596
- } else {
597
- logger.debug(`[loop] User message received with no allowed tools override, using current: ${currentAllowedTools ? currentAllowedTools.join(", ") : "none"}`);
598
- }
599
- let messageDisallowedTools = currentDisallowedTools;
600
- if (message.meta?.hasOwnProperty("disallowedTools")) {
601
- messageDisallowedTools = withAssistantDenylist(message.meta.disallowedTools || void 0, isAssistantVariant);
602
- currentDisallowedTools = messageDisallowedTools;
603
- logger.debug(`[loop] Disallowed tools updated from user message: ${messageDisallowedTools ? messageDisallowedTools.join(", ") : "reset to none"}`);
604
- } else {
605
- logger.debug(`[loop] User message received with no disallowed tools override, using current: ${currentDisallowedTools ? currentDisallowedTools.join(", ") : "none"}`);
606
- }
607
- let messageEffort = currentEffort;
608
- const VALID_EFFORTS = /* @__PURE__ */ new Set(["low", "medium", "high", "xhigh", "max"]);
609
- if (message.meta?.hasOwnProperty("effort")) {
610
- const incoming = message.meta.effort;
611
- if (incoming === null || incoming === void 0) {
612
- messageEffort = void 0;
613
- currentEffort = void 0;
614
- logger.debug(`[loop] Effort reset to default`);
615
- } else if (typeof incoming === "string" && VALID_EFFORTS.has(incoming)) {
616
- messageEffort = incoming;
617
- currentEffort = messageEffort;
618
- logger.debug(`[loop] Effort updated from user message: ${messageEffort}`);
619
- } else {
620
- logger.debug(`[loop] Ignoring invalid effort from user message: ${String(incoming)}`);
621
- }
622
- } else {
623
- logger.debug(`[loop] User message received with no effort override, using current: ${currentEffort ?? "default"}`);
624
668
  }
669
+ const previousPermissionMode = currentPermissionMode;
670
+ const predictedFirstMode = firstMessageScored ? null : predictFirstMessageMode();
671
+ const resolved = resolveMessageMode(currentModeState(), message.meta, { sandboxEnabled, isAssistantVariant, staleModeSnapshot });
672
+ if ("publishPermissionMode" in resolved) {
673
+ publishPermissionMode(resolved.publishPermissionMode);
674
+ const ignoredDefaultDowngrade = (previousPermissionMode === "bypassPermissions" || previousPermissionMode === "yolo") && message.meta?.permissionMode === "default" && currentPermissionMode === previousPermissionMode;
675
+ logger.debug(ignoredDefaultDowngrade ? `[loop] Ignoring permission mode downgrade from ${previousPermissionMode} to default` : `[loop] Permission mode updated from user message to: ${currentPermissionMode}`);
676
+ }
677
+ currentModel = resolved.next.model;
678
+ currentFallbackModel = resolved.next.fallbackModel;
679
+ currentCustomSystemPrompt = resolved.next.customSystemPrompt;
680
+ currentAppendSystemPrompt = resolved.next.appendSystemPrompt;
681
+ currentAllowedTools = resolved.next.allowedTools;
682
+ currentDisallowedTools = resolved.next.disallowedTools;
683
+ currentEffort = resolved.next.effort;
684
+ if (resolved.ignoredEffort !== void 0) {
685
+ logger.debug(`[loop] Ignoring invalid effort from user message: ${resolved.ignoredEffort}`);
686
+ }
687
+ 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"}`);
688
+ scoreFirstMessage(message.meta, predictedFirstMode, resolved.mode);
689
+ const resolvedMode = resolved.mode;
625
690
  const specialCommand = parseSpecialCommand(message.content.text);
626
691
  if (specialCommand.type === "compact") {
627
692
  logger.debug("[start] Detected /compact command");
628
- const enhancedMode2 = {
629
- permissionMode: messagePermissionMode || "default",
630
- model: messageModel,
631
- fallbackModel: messageFallbackModel,
632
- customSystemPrompt: messageCustomSystemPrompt,
633
- appendSystemPrompt: messageAppendSystemPrompt,
634
- allowedTools: messageAllowedTools,
635
- disallowedTools: messageDisallowedTools,
636
- effort: messageEffort
637
- };
693
+ const enhancedMode2 = resolvedMode;
638
694
  messageQueue.pushIsolateAndClear(specialCommand.originalMessage || message.content.text, enhancedMode2, attachmentsForThisMessage, message.localKey);
639
695
  logger.debug("[start] /compact command pushed to queue:", {
640
696
  ...contentLogMetadata(message.content.text),
@@ -645,16 +701,7 @@ async function runClaude(credentials, options = {}) {
645
701
  }
646
702
  if (specialCommand.type === "clear") {
647
703
  logger.debug("[start] Detected /clear command");
648
- const enhancedMode2 = {
649
- permissionMode: messagePermissionMode || "default",
650
- model: messageModel,
651
- fallbackModel: messageFallbackModel,
652
- customSystemPrompt: messageCustomSystemPrompt,
653
- appendSystemPrompt: messageAppendSystemPrompt,
654
- allowedTools: messageAllowedTools,
655
- disallowedTools: messageDisallowedTools,
656
- effort: messageEffort
657
- };
704
+ const enhancedMode2 = resolvedMode;
658
705
  messageQueue.pushIsolateAndClear(specialCommand.originalMessage || message.content.text, enhancedMode2, attachmentsForThisMessage, message.localKey);
659
706
  logger.debug("[start] /clear command pushed to queue:", {
660
707
  ...contentLogMetadata(message.content.text),
@@ -701,16 +748,7 @@ async function runClaude(credentials, options = {}) {
701
748
  return;
702
749
  }
703
750
  }
704
- const enhancedMode = {
705
- permissionMode: messagePermissionMode || "default",
706
- model: messageModel,
707
- fallbackModel: messageFallbackModel,
708
- customSystemPrompt: messageCustomSystemPrompt,
709
- appendSystemPrompt: messageAppendSystemPrompt,
710
- allowedTools: messageAllowedTools,
711
- disallowedTools: messageDisallowedTools,
712
- effort: messageEffort
713
- };
751
+ const enhancedMode = resolvedMode;
714
752
  if (message.meta?.delivery === "steer" && currentRunMode === "remote") {
715
753
  const accepted = await currentSession?.trySteer({
716
754
  message: message.content.text,
@@ -742,6 +780,7 @@ async function runClaude(credentials, options = {}) {
742
780
  }
743
781
  logger.debug(`[START] Received termination signal, cleaning up (archive=${intent === "archive"})...`);
744
782
  promptQueueDrain.close();
783
+ cleanupPrewarm();
745
784
  try {
746
785
  if (session) {
747
786
  currentSession?.cleanup();
@@ -807,7 +846,11 @@ async function runClaude(credentials, options = {}) {
807
846
  },
808
847
  onSessionReady: (sessionInstance) => {
809
848
  currentSession = sessionInstance;
849
+ sessionInstance.addSessionFoundCallback?.(announceSessionToScanner);
810
850
  },
851
+ // B-515: lease for a warm Claude process, taken once by the first
852
+ // remote launch (null when not eligible).
853
+ claudePrewarm: createPrewarm,
811
854
  // B-355: remember exactly what the SDK is about to write to the Claude
812
855
  // transcript, so the JSONL scanner below recognises it as ours.
813
856
  onPromptFinalized: recordAppPrompt,
@@ -832,6 +875,7 @@ async function runClaude(credentials, options = {}) {
832
875
  jsRuntime: options.jsRuntime
833
876
  });
834
877
  currentSession?.cleanup();
878
+ cleanupPrewarm();
835
879
  session.sendSessionDeath();
836
880
  logger.debug("Waiting for socket to flush...");
837
881
  await session.flush();