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,150 @@
1
+ import React, { useState, useRef, useEffect, useCallback } from 'react';
2
+ import { useStdout, useInput, Box, Text } from 'ink';
3
+
4
+ function interpretRemoteModeKeypress(state, input, key = {}) {
5
+ if (state.actionInProgress) return { action: "none" };
6
+ if (key.ctrl && input === "c") {
7
+ return { action: state.confirmationMode === "exit" ? "exit" : "confirm-exit" };
8
+ }
9
+ if (key.ctrl && input === "t") {
10
+ return { action: "switch" };
11
+ }
12
+ if (input === " ") {
13
+ return { action: state.confirmationMode === "switch" ? "switch" : "confirm-switch" };
14
+ }
15
+ if (state.confirmationMode) {
16
+ return { action: "reset" };
17
+ }
18
+ return { action: "none" };
19
+ }
20
+ const RemoteModeDisplay = ({ messageBuffer, logPath, onExit, onSwitchToLocal }) => {
21
+ const [messages, setMessages] = useState([]);
22
+ const [confirmationMode, setConfirmationMode] = useState(null);
23
+ const [actionInProgress, setActionInProgress] = useState(null);
24
+ const confirmationTimeoutRef = useRef(null);
25
+ const { stdout } = useStdout();
26
+ const terminalWidth = stdout.columns || 80;
27
+ const terminalHeight = stdout.rows || 24;
28
+ useEffect(() => {
29
+ setMessages(messageBuffer.getMessages());
30
+ const unsubscribe = messageBuffer.onUpdate((newMessages) => {
31
+ setMessages(newMessages);
32
+ });
33
+ return () => {
34
+ unsubscribe();
35
+ if (confirmationTimeoutRef.current) {
36
+ clearTimeout(confirmationTimeoutRef.current);
37
+ }
38
+ };
39
+ }, [messageBuffer]);
40
+ const resetConfirmation = useCallback(() => {
41
+ setConfirmationMode(null);
42
+ if (confirmationTimeoutRef.current) {
43
+ clearTimeout(confirmationTimeoutRef.current);
44
+ confirmationTimeoutRef.current = null;
45
+ }
46
+ }, []);
47
+ const setConfirmationWithTimeout = useCallback((mode) => {
48
+ setConfirmationMode(mode);
49
+ if (confirmationTimeoutRef.current) {
50
+ clearTimeout(confirmationTimeoutRef.current);
51
+ }
52
+ confirmationTimeoutRef.current = setTimeout(() => {
53
+ resetConfirmation();
54
+ }, 15e3);
55
+ }, [resetConfirmation]);
56
+ useInput(useCallback(async (input, key) => {
57
+ const { action } = interpretRemoteModeKeypress(
58
+ { confirmationMode, actionInProgress },
59
+ input,
60
+ key
61
+ );
62
+ if (action === "none") return;
63
+ if (action === "reset") {
64
+ resetConfirmation();
65
+ return;
66
+ }
67
+ if (action === "confirm-exit") {
68
+ setConfirmationWithTimeout("exit");
69
+ return;
70
+ }
71
+ if (action === "confirm-switch") {
72
+ setConfirmationWithTimeout("switch");
73
+ return;
74
+ }
75
+ if (action === "exit") {
76
+ resetConfirmation();
77
+ setActionInProgress("exiting");
78
+ await new Promise((resolve) => setTimeout(resolve, 100));
79
+ onExit?.();
80
+ return;
81
+ }
82
+ if (action === "switch") {
83
+ resetConfirmation();
84
+ setActionInProgress("switching");
85
+ await new Promise((resolve) => setTimeout(resolve, 100));
86
+ onSwitchToLocal?.();
87
+ }
88
+ }, [confirmationMode, actionInProgress, onExit, onSwitchToLocal, setConfirmationWithTimeout, resetConfirmation]));
89
+ const getMessageColor = (type) => {
90
+ switch (type) {
91
+ case "user":
92
+ return "magenta";
93
+ case "assistant":
94
+ return "cyan";
95
+ case "system":
96
+ return "blue";
97
+ case "tool":
98
+ return "yellow";
99
+ case "result":
100
+ return "green";
101
+ case "status":
102
+ return "gray";
103
+ default:
104
+ return "white";
105
+ }
106
+ };
107
+ const formatMessage = (msg) => {
108
+ const lines = msg.content.split("\n");
109
+ const maxLineLength = terminalWidth - 10;
110
+ return lines.map((line) => {
111
+ if (line.length <= maxLineLength) return line;
112
+ const chunks = [];
113
+ for (let i = 0; i < line.length; i += maxLineLength) {
114
+ chunks.push(line.slice(i, i + maxLineLength));
115
+ }
116
+ return chunks.join("\n");
117
+ }).join("\n");
118
+ };
119
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: terminalWidth, height: terminalHeight }, /* @__PURE__ */ React.createElement(
120
+ Box,
121
+ {
122
+ flexDirection: "column",
123
+ width: terminalWidth,
124
+ height: terminalHeight - 4,
125
+ borderStyle: "round",
126
+ borderColor: "gray",
127
+ paddingX: 1,
128
+ overflow: "hidden"
129
+ },
130
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: "gray", bold: true }, "\u{1F4E1} Remote Mode - Claude Messages"), /* @__PURE__ */ React.createElement(Text, { color: "gray", dimColor: true }, "\u2500".repeat(Math.min(terminalWidth - 4, 60)))),
131
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", height: terminalHeight - 10, overflow: "hidden" }, messages.length === 0 ? /* @__PURE__ */ React.createElement(Text, { color: "gray", dimColor: true }, "Waiting for messages...") : (
132
+ // Show only the last messages that fit in the available space
133
+ messages.slice(-Math.max(1, terminalHeight - 10)).map((msg) => /* @__PURE__ */ React.createElement(Box, { key: msg.id, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { color: getMessageColor(msg.type), dimColor: true }, formatMessage(msg))))
134
+ ))
135
+ ), /* @__PURE__ */ React.createElement(
136
+ Box,
137
+ {
138
+ width: terminalWidth,
139
+ borderStyle: "round",
140
+ borderColor: actionInProgress ? "gray" : confirmationMode === "exit" ? "red" : confirmationMode === "switch" ? "yellow" : "green",
141
+ paddingX: 2,
142
+ justifyContent: "center",
143
+ alignItems: "center",
144
+ flexDirection: "column"
145
+ },
146
+ /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", alignItems: "center" }, actionInProgress === "exiting" ? /* @__PURE__ */ React.createElement(Text, { color: "gray", bold: true }, "Exiting...") : actionInProgress === "switching" ? /* @__PURE__ */ React.createElement(Text, { color: "gray", bold: true }, "Switching to local mode...") : confirmationMode === "exit" ? /* @__PURE__ */ React.createElement(Text, { color: "red", bold: true }, "\u26A0\uFE0F Press Ctrl-C again to exit completely") : confirmationMode === "switch" ? /* @__PURE__ */ React.createElement(Text, { color: "yellow", bold: true }, "\u23F8\uFE0F Press space again (or Ctrl-T) to switch to local mode") : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { color: "green", bold: true }, "\u{1F4F1} Press space (or Ctrl-T) to switch to local mode \u2022 Ctrl-C to exit")), process.env.DEBUG && logPath && /* @__PURE__ */ React.createElement(Text, { color: "gray", dimColor: true }, "Debug logs: ", logPath))
147
+ ));
148
+ };
149
+
150
+ export { RemoteModeDisplay, interpretRemoteModeKeypress };
@@ -0,0 +1,153 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var ink = require('ink');
5
+
6
+ function interpretRemoteModeKeypress(state, input, key = {}) {
7
+ if (state.actionInProgress) return { action: "none" };
8
+ if (key.ctrl && input === "c") {
9
+ return { action: state.confirmationMode === "exit" ? "exit" : "confirm-exit" };
10
+ }
11
+ if (key.ctrl && input === "t") {
12
+ return { action: "switch" };
13
+ }
14
+ if (input === " ") {
15
+ return { action: state.confirmationMode === "switch" ? "switch" : "confirm-switch" };
16
+ }
17
+ if (state.confirmationMode) {
18
+ return { action: "reset" };
19
+ }
20
+ return { action: "none" };
21
+ }
22
+ const RemoteModeDisplay = ({ messageBuffer, logPath, onExit, onSwitchToLocal }) => {
23
+ const [messages, setMessages] = React.useState([]);
24
+ const [confirmationMode, setConfirmationMode] = React.useState(null);
25
+ const [actionInProgress, setActionInProgress] = React.useState(null);
26
+ const confirmationTimeoutRef = React.useRef(null);
27
+ const { stdout } = ink.useStdout();
28
+ const terminalWidth = stdout.columns || 80;
29
+ const terminalHeight = stdout.rows || 24;
30
+ React.useEffect(() => {
31
+ setMessages(messageBuffer.getMessages());
32
+ const unsubscribe = messageBuffer.onUpdate((newMessages) => {
33
+ setMessages(newMessages);
34
+ });
35
+ return () => {
36
+ unsubscribe();
37
+ if (confirmationTimeoutRef.current) {
38
+ clearTimeout(confirmationTimeoutRef.current);
39
+ }
40
+ };
41
+ }, [messageBuffer]);
42
+ const resetConfirmation = React.useCallback(() => {
43
+ setConfirmationMode(null);
44
+ if (confirmationTimeoutRef.current) {
45
+ clearTimeout(confirmationTimeoutRef.current);
46
+ confirmationTimeoutRef.current = null;
47
+ }
48
+ }, []);
49
+ const setConfirmationWithTimeout = React.useCallback((mode) => {
50
+ setConfirmationMode(mode);
51
+ if (confirmationTimeoutRef.current) {
52
+ clearTimeout(confirmationTimeoutRef.current);
53
+ }
54
+ confirmationTimeoutRef.current = setTimeout(() => {
55
+ resetConfirmation();
56
+ }, 15e3);
57
+ }, [resetConfirmation]);
58
+ ink.useInput(React.useCallback(async (input, key) => {
59
+ const { action } = interpretRemoteModeKeypress(
60
+ { confirmationMode, actionInProgress },
61
+ input,
62
+ key
63
+ );
64
+ if (action === "none") return;
65
+ if (action === "reset") {
66
+ resetConfirmation();
67
+ return;
68
+ }
69
+ if (action === "confirm-exit") {
70
+ setConfirmationWithTimeout("exit");
71
+ return;
72
+ }
73
+ if (action === "confirm-switch") {
74
+ setConfirmationWithTimeout("switch");
75
+ return;
76
+ }
77
+ if (action === "exit") {
78
+ resetConfirmation();
79
+ setActionInProgress("exiting");
80
+ await new Promise((resolve) => setTimeout(resolve, 100));
81
+ onExit?.();
82
+ return;
83
+ }
84
+ if (action === "switch") {
85
+ resetConfirmation();
86
+ setActionInProgress("switching");
87
+ await new Promise((resolve) => setTimeout(resolve, 100));
88
+ onSwitchToLocal?.();
89
+ }
90
+ }, [confirmationMode, actionInProgress, onExit, onSwitchToLocal, setConfirmationWithTimeout, resetConfirmation]));
91
+ const getMessageColor = (type) => {
92
+ switch (type) {
93
+ case "user":
94
+ return "magenta";
95
+ case "assistant":
96
+ return "cyan";
97
+ case "system":
98
+ return "blue";
99
+ case "tool":
100
+ return "yellow";
101
+ case "result":
102
+ return "green";
103
+ case "status":
104
+ return "gray";
105
+ default:
106
+ return "white";
107
+ }
108
+ };
109
+ const formatMessage = (msg) => {
110
+ const lines = msg.content.split("\n");
111
+ const maxLineLength = terminalWidth - 10;
112
+ return lines.map((line) => {
113
+ if (line.length <= maxLineLength) return line;
114
+ const chunks = [];
115
+ for (let i = 0; i < line.length; i += maxLineLength) {
116
+ chunks.push(line.slice(i, i + maxLineLength));
117
+ }
118
+ return chunks.join("\n");
119
+ }).join("\n");
120
+ };
121
+ return /* @__PURE__ */ React.createElement(ink.Box, { flexDirection: "column", width: terminalWidth, height: terminalHeight }, /* @__PURE__ */ React.createElement(
122
+ ink.Box,
123
+ {
124
+ flexDirection: "column",
125
+ width: terminalWidth,
126
+ height: terminalHeight - 4,
127
+ borderStyle: "round",
128
+ borderColor: "gray",
129
+ paddingX: 1,
130
+ overflow: "hidden"
131
+ },
132
+ /* @__PURE__ */ React.createElement(ink.Box, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(ink.Text, { color: "gray", bold: true }, "\u{1F4E1} Remote Mode - Claude Messages"), /* @__PURE__ */ React.createElement(ink.Text, { color: "gray", dimColor: true }, "\u2500".repeat(Math.min(terminalWidth - 4, 60)))),
133
+ /* @__PURE__ */ React.createElement(ink.Box, { flexDirection: "column", height: terminalHeight - 10, overflow: "hidden" }, messages.length === 0 ? /* @__PURE__ */ React.createElement(ink.Text, { color: "gray", dimColor: true }, "Waiting for messages...") : (
134
+ // Show only the last messages that fit in the available space
135
+ messages.slice(-Math.max(1, terminalHeight - 10)).map((msg) => /* @__PURE__ */ React.createElement(ink.Box, { key: msg.id, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(ink.Text, { color: getMessageColor(msg.type), dimColor: true }, formatMessage(msg))))
136
+ ))
137
+ ), /* @__PURE__ */ React.createElement(
138
+ ink.Box,
139
+ {
140
+ width: terminalWidth,
141
+ borderStyle: "round",
142
+ borderColor: actionInProgress ? "gray" : confirmationMode === "exit" ? "red" : confirmationMode === "switch" ? "yellow" : "green",
143
+ paddingX: 2,
144
+ justifyContent: "center",
145
+ alignItems: "center",
146
+ flexDirection: "column"
147
+ },
148
+ /* @__PURE__ */ React.createElement(ink.Box, { flexDirection: "column", alignItems: "center" }, actionInProgress === "exiting" ? /* @__PURE__ */ React.createElement(ink.Text, { color: "gray", bold: true }, "Exiting...") : actionInProgress === "switching" ? /* @__PURE__ */ React.createElement(ink.Text, { color: "gray", bold: true }, "Switching to local mode...") : confirmationMode === "exit" ? /* @__PURE__ */ React.createElement(ink.Text, { color: "red", bold: true }, "\u26A0\uFE0F Press Ctrl-C again to exit completely") : confirmationMode === "switch" ? /* @__PURE__ */ React.createElement(ink.Text, { color: "yellow", bold: true }, "\u23F8\uFE0F Press space again (or Ctrl-T) to switch to local mode") : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ink.Text, { color: "green", bold: true }, "\u{1F4F1} Press space (or Ctrl-T) to switch to local mode \u2022 Ctrl-C to exit")), process.env.DEBUG && logPath && /* @__PURE__ */ React.createElement(ink.Text, { color: "gray", dimColor: true }, "Debug logs: ", logPath))
149
+ ));
150
+ };
151
+
152
+ exports.RemoteModeDisplay = RemoteModeDisplay;
153
+ exports.interpretRemoteModeKeypress = interpretRemoteModeKeypress;
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ function registerAgentAttachmentDownloads(session) {
4
+ session.onFileEvent((fileEvent) => {
5
+ const attachment = fileEvent.content.data.ev;
6
+ const download = (async () => {
7
+ try {
8
+ const data = await session.downloadAndDecryptAttachment(attachment.ref);
9
+ if (!data) throw new Error("Attachment decryption failed");
10
+ return { data, mimeType: attachment.mimeType ?? "image/jpeg", name: attachment.name };
11
+ } catch {
12
+ session.sendSessionEvent({ type: "message", message: `Could not download attachment: ${attachment.name}. Please attach it again.` });
13
+ return null;
14
+ }
15
+ })();
16
+ session.trackAttachmentDownload(download);
17
+ });
18
+ }
19
+
20
+ exports.registerAgentAttachmentDownloads = registerAgentAttachmentDownloads;
@@ -0,0 +1,18 @@
1
+ function registerAgentAttachmentDownloads(session) {
2
+ session.onFileEvent((fileEvent) => {
3
+ const attachment = fileEvent.content.data.ev;
4
+ const download = (async () => {
5
+ try {
6
+ const data = await session.downloadAndDecryptAttachment(attachment.ref);
7
+ if (!data) throw new Error("Attachment decryption failed");
8
+ return { data, mimeType: attachment.mimeType ?? "image/jpeg", name: attachment.name };
9
+ } catch {
10
+ session.sendSessionEvent({ type: "message", message: `Could not download attachment: ${attachment.name}. Please attach it again.` });
11
+ return null;
12
+ }
13
+ })();
14
+ session.trackAttachmentDownload(download);
15
+ });
16
+ }
17
+
18
+ export { registerAgentAttachmentDownloads as r };
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+
3
+ var trimIdent = require('./trimIdent-4gvk9Wk6.cjs');
4
+
5
+ const AGENT_GUIDANCE = (() => trimIdent.trimIdent(`
6
+ You are running inside Happy: the user is reading this session in a web client (often a phone), NOT in the terminal where you run. Two consequences:
7
+
8
+ - Terminal output is not a good delivery channel. When the user asks for a piece of text ("copy that", "give me X", "\u590D\u5236\u7ED9\u6211", "\u53D1\u6211"), hand it over with mcp__happy__copy_to_clipboard instead of printing it for them to select by hand.
9
+ - When you produce or want to show a FILE (a document you wrote, a report, an image, a PDF, a diff), call mcp__happy__open_preview with its path instead of cat-ing it. Their client opens the rendered file.
10
+
11
+ Judgement, not reflex: use these when the user's goal is to RECEIVE something. If they are asking a question you can just answer, answer it. Do not preview a file you only read for your own reasoning, and do not preview the same file repeatedly within a turn.
12
+
13
+ If you are working on a task the user is tracking, call mcp__happy__report_progress at meaningful milestones (started / blocked / needs review / done) so their board reflects reality. Do not report every tool call.
14
+ `))();
15
+ const PREVIEW_TOOL_NAME = "open_preview";
16
+ const PREVIEW_TOOL_TITLE = "Open File Preview for the User";
17
+ const PREVIEW_TOOL_DESCRIPTION = 'Open a file in the preview panel of every web client the user currently has open. Use this whenever you produce or want to show the user a file: a document or report you just wrote, a generated image or diagram, a PDF, a data file, or a source file you want them to look at. Trigger phrases include: "write me a doc", "show me that file", "let me see it", "\u5199\u4E2A\u6587\u6863", "\u7ED9\u6211\u770B\u770B\u8FD9\u4E2A\u6587\u4EF6", "\u6253\u5F00\u770B\u4E0B". Pass an absolute path (or one starting with ~). The file is read on this machine and rendered in their browser \u2014 markdown is rendered, images and PDFs are displayed, other text is syntax-highlighted. Prefer this over printing file contents to the terminal, which the user is probably not looking at. NOTE: this only requests that their client open the file; it cannot confirm the user actually looked at it, so do not assume they have seen it.';
18
+ const REPORT_PROGRESS_TOOL_NAME = "report_progress";
19
+ const REPORT_PROGRESS_TOOL_TITLE = "Report Progress to the Task Board";
20
+ const REPORT_PROGRESS_TOOL_DESCRIPTION = `Report what you are doing to the user's task board, so they can see the state of this session at a glance without reading the transcript. Call it at meaningful milestones only: when you start substantive work, when you get blocked and need the user, when something is ready for their review, and when you are done. Do NOT call it after every tool call or every file edit \u2014 it is a status line, not a log. Set attention to "blocked" when you cannot proceed without the user, "review" when you want them to look at something, and "none" for ordinary progress. Keep progress to one short line describing the current state (the user reads it on a card).`;
21
+
22
+ exports.AGENT_GUIDANCE = AGENT_GUIDANCE;
23
+ exports.PREVIEW_TOOL_DESCRIPTION = PREVIEW_TOOL_DESCRIPTION;
24
+ exports.PREVIEW_TOOL_NAME = PREVIEW_TOOL_NAME;
25
+ exports.PREVIEW_TOOL_TITLE = PREVIEW_TOOL_TITLE;
26
+ exports.REPORT_PROGRESS_TOOL_DESCRIPTION = REPORT_PROGRESS_TOOL_DESCRIPTION;
27
+ exports.REPORT_PROGRESS_TOOL_NAME = REPORT_PROGRESS_TOOL_NAME;
28
+ exports.REPORT_PROGRESS_TOOL_TITLE = REPORT_PROGRESS_TOOL_TITLE;
@@ -0,0 +1,20 @@
1
+ import { t as trimIdent } from './trimIdent-BAjmv_TG.mjs';
2
+
3
+ const AGENT_GUIDANCE = (() => trimIdent(`
4
+ You are running inside Happy: the user is reading this session in a web client (often a phone), NOT in the terminal where you run. Two consequences:
5
+
6
+ - Terminal output is not a good delivery channel. When the user asks for a piece of text ("copy that", "give me X", "\u590D\u5236\u7ED9\u6211", "\u53D1\u6211"), hand it over with mcp__happy__copy_to_clipboard instead of printing it for them to select by hand.
7
+ - When you produce or want to show a FILE (a document you wrote, a report, an image, a PDF, a diff), call mcp__happy__open_preview with its path instead of cat-ing it. Their client opens the rendered file.
8
+
9
+ Judgement, not reflex: use these when the user's goal is to RECEIVE something. If they are asking a question you can just answer, answer it. Do not preview a file you only read for your own reasoning, and do not preview the same file repeatedly within a turn.
10
+
11
+ If you are working on a task the user is tracking, call mcp__happy__report_progress at meaningful milestones (started / blocked / needs review / done) so their board reflects reality. Do not report every tool call.
12
+ `))();
13
+ const PREVIEW_TOOL_NAME = "open_preview";
14
+ const PREVIEW_TOOL_TITLE = "Open File Preview for the User";
15
+ const PREVIEW_TOOL_DESCRIPTION = 'Open a file in the preview panel of every web client the user currently has open. Use this whenever you produce or want to show the user a file: a document or report you just wrote, a generated image or diagram, a PDF, a data file, or a source file you want them to look at. Trigger phrases include: "write me a doc", "show me that file", "let me see it", "\u5199\u4E2A\u6587\u6863", "\u7ED9\u6211\u770B\u770B\u8FD9\u4E2A\u6587\u4EF6", "\u6253\u5F00\u770B\u4E0B". Pass an absolute path (or one starting with ~). The file is read on this machine and rendered in their browser \u2014 markdown is rendered, images and PDFs are displayed, other text is syntax-highlighted. Prefer this over printing file contents to the terminal, which the user is probably not looking at. NOTE: this only requests that their client open the file; it cannot confirm the user actually looked at it, so do not assume they have seen it.';
16
+ const REPORT_PROGRESS_TOOL_NAME = "report_progress";
17
+ const REPORT_PROGRESS_TOOL_TITLE = "Report Progress to the Task Board";
18
+ const REPORT_PROGRESS_TOOL_DESCRIPTION = `Report what you are doing to the user's task board, so they can see the state of this session at a glance without reading the transcript. Call it at meaningful milestones only: when you start substantive work, when you get blocked and need the user, when something is ready for their review, and when you are done. Do NOT call it after every tool call or every file edit \u2014 it is a status line, not a log. Set attention to "blocked" when you cannot proceed without the user, "review" when you want them to look at something, and "none" for ordinary progress. Keep progress to one short line describing the current state (the user reads it on a card).`;
19
+
20
+ export { AGENT_GUIDANCE as A, PREVIEW_TOOL_NAME as P, REPORT_PROGRESS_TOOL_NAME as R, PREVIEW_TOOL_TITLE as a, PREVIEW_TOOL_DESCRIPTION as b, REPORT_PROGRESS_TOOL_TITLE as c, REPORT_PROGRESS_TOOL_DESCRIPTION as d };
@@ -2,34 +2,20 @@
2
2
 
3
3
  var chalk = require('chalk');
4
4
  var os = require('node:os');
5
- var persistence = require('./limits-kqFqhfsh.cjs');
5
+ var persistence = require('./persistence-yKTH3-5X.cjs');
6
6
  require('node:fs');
7
- var index = require('./types-DnrPeN80.cjs');
8
- require('zod');
9
- require('@paralleldrive/cuid2');
7
+ require('./logger-CS0mw3fa.cjs');
8
+ var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
10
9
  require('node:fs/promises');
10
+ require('./configuration-BSYpcPwE.cjs');
11
+ require('node:path');
12
+ require('./package-BwMrPwqH.cjs');
13
+ require('zod');
14
+ require('./authRelay-BdYkC1Po.cjs');
11
15
  require('node:crypto');
12
16
  require('tweetnacl');
13
17
  require('node:util');
14
- require('node:path');
15
- require('axios');
16
- require('node:events');
17
- require('socket.io-client');
18
- require('child_process');
19
- require('util');
20
- require('fs/promises');
21
- require('crypto');
22
- require('path');
23
- require('cross-spawn');
24
- require('./terminalTitleSuggest-Dji8I0Jy.cjs');
25
- require('url');
26
- require('os');
27
18
  require('node:child_process');
28
- require('node-pty');
29
- require('fs');
30
- require('node:readline');
31
- require('@anthropic-ai/sandbox-runtime');
32
- require('expo-server-sdk');
33
19
 
34
20
  const AGENT_HOME_HELP = `very-happy agent-home \u2014 where Claude Code / Codex keep their conversations
35
21
 
@@ -68,18 +54,18 @@ function parseAgentHomeArgs(args) {
68
54
  }
69
55
  async function resolveAgentHomesForCli() {
70
56
  const settings = await persistence.readSettings();
71
- const loginShellEnv = await index.probeLoginShellEnv(index.AGENT_HOME_ENV_NAMES);
72
- return index.resolveAgentHomes({
57
+ const loginShellEnv$1 = await loginShellEnv.probeLoginShellEnv(loginShellEnv.AGENT_HOME_ENV_NAMES);
58
+ return loginShellEnv.resolveAgentHomes({
73
59
  settings: { claudeConfigDir: settings.claudeConfigDir, codexHome: settings.codexHome },
74
60
  daemonEnv: process.env,
75
- loginShellEnv,
61
+ loginShellEnv: loginShellEnv$1,
76
62
  homeDir: os.homedir()
77
63
  });
78
64
  }
79
65
  function formatAgentHomes(homes) {
80
66
  return [
81
- `Claude config dir: ${index.describeAgentHome(homes.claudeConfigDir)}`,
82
- `Codex home: ${index.describeAgentHome(homes.codexHome)}`
67
+ `Claude config dir: ${loginShellEnv.describeAgentHome(homes.claudeConfigDir)}`,
68
+ `Codex home: ${loginShellEnv.describeAgentHome(homes.codexHome)}`
83
69
  ].join("\n");
84
70
  }
85
71
  async function runAgentHomeCommand(command) {
@@ -88,7 +74,7 @@ async function runAgentHomeCommand(command) {
88
74
  return;
89
75
  }
90
76
  if (command.action === "set") {
91
- const dir = index.expandHomePath(command.dir, os.homedir());
77
+ const dir = loginShellEnv.expandHomePath(command.dir, os.homedir());
92
78
  await persistence.updateSettings((current) => command.kind === "claude" ? { ...current, claudeConfigDir: dir } : { ...current, codexHome: dir });
93
79
  console.log(chalk.green(`\u2713 ${command.kind === "claude" ? "Claude config dir" : "Codex home"} pinned to ${dir}`));
94
80
  } else if (command.action === "clear") {
@@ -1,33 +1,19 @@
1
1
  import chalk from 'chalk';
2
2
  import { homedir } from 'node:os';
3
- import { r as readSettings, u as updateSettings } from './limits-D2uN090G.mjs';
3
+ import { readSettings, updateSettings } from './persistence-HGW_ZVs9.mjs';
4
4
  import 'node:fs';
5
- import { d as describeAgentHome, p as probeLoginShellEnv, r as resolveAgentHomes, e as expandHomePath, b as AGENT_HOME_ENV_NAMES } from './types-DIBF4U0Y.mjs';
6
- import 'zod';
7
- import '@paralleldrive/cuid2';
5
+ import './logger-6HYUEXNk.mjs';
6
+ import { d as describeAgentHome, p as probeLoginShellEnv, r as resolveAgentHomes, e as expandHomePath, A as AGENT_HOME_ENV_NAMES } from './loginShellEnv-Dw8M7tkI.mjs';
8
7
  import 'node:fs/promises';
8
+ import './configuration-RfeNjFmd.mjs';
9
+ import 'node:path';
10
+ import './package-BhaKlnxz.mjs';
11
+ import 'zod';
12
+ import './authRelay-DSAvg1uv.mjs';
9
13
  import 'node:crypto';
10
14
  import 'tweetnacl';
11
15
  import 'node:util';
12
- import 'node:path';
13
- import 'axios';
14
- import 'node:events';
15
- import 'socket.io-client';
16
- import 'child_process';
17
- import 'util';
18
- import 'fs/promises';
19
- import 'crypto';
20
- import 'path';
21
- import 'cross-spawn';
22
- import './terminalTitleSuggest-DKgX3osW.mjs';
23
- import 'url';
24
- import 'os';
25
16
  import 'node:child_process';
26
- import 'node-pty';
27
- import 'fs';
28
- import 'node:readline';
29
- import '@anthropic-ai/sandbox-runtime';
30
- import 'expo-server-sdk';
31
17
 
32
18
  const AGENT_HOME_HELP = `very-happy agent-home \u2014 where Claude Code / Codex keep their conversations
33
19