very-happy-cli 0.2.159 → 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-DUYFlyfN.cjs → AcpBackend-Bm2rdke8.cjs} +78 -76
  2. package/dist/{AcpBackend-VsfkZiVF.mjs → AcpBackend-mzv8Dhba.mjs} +4 -2
  3. package/dist/{AcpSessionManager-Bdv8LWXh.cjs → AcpSessionManager-BAY1Pggx.cjs} +9 -9
  4. package/dist/{AcpSessionManager-rYtVb0kN.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-CHh4lmjM.cjs → agentHome-CboCeKWq.cjs} +14 -28
  16. package/dist/{agentHome-CvsJyeQB.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-Dh-s4Lqs.mjs → apiMachine-B9dLW_p5.mjs} +9116 -16205
  20. package/dist/{types-BbvK1Tr_.cjs → apiMachine-Bn8482VM.cjs} +9104 -16247
  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-DKmEls8Z.cjs → auto-BOX_fgmR.cjs} +70 -79
  34. package/dist/{auto-nb8GhRRy.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-ClLtM6F3.mjs → config-CTx_jb-C.mjs} +7 -40
  62. package/dist/{config-DLx-vW3I.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-BEOMECtE.cjs → index-B6pAdvJx.cjs} +121 -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-2mCaeKyf.mjs → index-DMZqWwsP.mjs} +68 -38
  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-BPhJppvd.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-BOHrUaFM.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-Cou3WUf3.cjs → installTerminalHooks-BQZbvxsZ.cjs} +5 -40
  116. package/dist/{installTerminalHooks-WeznjkuC.mjs → installTerminalHooks-By7gBMEF.mjs} +3 -38
  117. package/dist/lib.cjs +28 -19
  118. package/dist/lib.d.cts +12 -2
  119. package/dist/lib.d.mts +12 -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-Dy3f_K0h.mjs → mcp-B1A4I3TK.mjs} +27 -33
  138. package/dist/{mcp-CPYbtsYG.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-kLZNpAAl.mjs → piRuntime-CSGkwCKQ.mjs} +2 -2
  159. package/dist/{piRuntime-NtF0YqjH.cjs → piRuntime-C_H7MJCM.cjs} +4 -4
  160. package/dist/{piTerminal-B0fEOV_2.mjs → piTerminal-C8a1OrNQ.mjs} +32 -35
  161. package/dist/{piTerminal-9J0GAKzb.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-DV6Ouadt.mjs → runGemini-BGeTz57m.mjs} +58 -31
  181. package/dist/{runGemini-F-mqx3_K.cjs → runGemini-DSr9LIxL.cjs} +202 -175
  182. package/dist/{runOpenClaw-Qqo9j63M.cjs → runOpenClaw-B1mTxN35.cjs} +64 -65
  183. package/dist/{runOpenClaw-D7MlPS5n.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-4qJTCAYW.cjs → send-B7J_eaG3.cjs} +16 -9
  189. package/dist/{send-CLhYXNgy.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-CzIH2rGp.mjs → sessions-BEG_HTSi.mjs} +17 -8
  201. package/dist/{sessions-Bh1pyddi.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-CPIWlPOM.mjs → spawn-B7yro0b2.mjs} +26 -38
  207. package/dist/{spawn-CmFOSVdW.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-CEahj4cm.mjs → teams-C32F1hqd.mjs} +9 -40
  225. package/dist/{teams-CB1R9-Z9.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-DqyRI4wP.cjs → todo-BvUOTa8G.cjs} +15 -12
  239. package/dist/{todo-Cknp5D4U.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-BRDN1NoZ.cjs +0 -2217
  252. package/dist/agentGuidance-KgvYuF3R.mjs +0 -2145
  253. package/dist/index-BF6WfgV5.mjs +0 -19624
  254. package/dist/index-C-JazrMB.mjs +0 -52
  255. package/dist/index-blDSadUR.cjs +0 -58
  256. package/dist/index-rH3DrQ5B.cjs +0 -19688
  257. package/dist/limits-BH5CV5vR.cjs +0 -2683
  258. package/dist/limits-CjRj8IX5.mjs +0 -2558
@@ -5,53 +5,52 @@ var node_child_process = require('node:child_process');
5
5
  var os = require('node:os');
6
6
  var node_fs = require('node:fs');
7
7
  var path = require('node:path');
8
- var index = require('./types-BbvK1Tr_.cjs');
9
- var AcpSessionManager = require('./AcpSessionManager-Bdv8LWXh.cjs');
10
- var persistence = require('./limits-BH5CV5vR.cjs');
11
- var index$1 = require('./index-rH3DrQ5B.cjs');
8
+ var api = require('./api-CgundNNX.cjs');
9
+ var AcpSessionManager = require('./AcpSessionManager-BAY1Pggx.cjs');
10
+ var logger = require('./logger-CS0mw3fa.cjs');
11
+ var registerKillSessionHandler = require('./registerKillSessionHandler-DZeLXWcB.cjs');
12
+ var persistence = require('./persistence-yKTH3-5X.cjs');
13
+ var machineMetadata = require('./machineMetadata-DyDbODYd.cjs');
14
+ var createSessionMetadata = require('./createSessionMetadata-BJxEnM-o.cjs');
15
+ var setupOfflineReconnection = require('./setupOfflineReconnection-ByElY60m.cjs');
16
+ var controlClient = require('./controlClient-Bcwv3D21.cjs');
17
+ var authRelay = require('./authRelay-BdYkC1Po.cjs');
12
18
  var WebSocket = require('ws');
13
19
  var ed = require('@noble/ed25519');
14
20
  var sha2_js = require('@noble/hashes/sha2.js');
21
+ var configuration = require('./configuration-BSYpcPwE.cjs');
22
+ var contentLogMetadata = require('./contentLogMetadata-ZSFk_NjQ.cjs');
15
23
  require('axios');
16
24
  require('node:events');
17
25
  require('socket.io-client');
26
+ require('./attachmentLimits-CzVrqgLR.cjs');
18
27
  require('zod');
28
+ require('./index-DA7yINuk.cjs');
29
+ require('@paralleldrive/cuid2');
30
+ require('./limits-C-a7gr04.cjs');
31
+ require('./time-DCuTyook.cjs');
32
+ require('./lidState-BeDfxxEX.cjs');
33
+ require('os');
19
34
  require('child_process');
35
+ require('./registerCommonHandlers-DskirN-_.cjs');
20
36
  require('util');
21
37
  require('fs/promises');
22
38
  require('crypto');
23
39
  require('path');
24
40
  require('cross-spawn');
25
- require('./terminalTitleSuggest-Dji8I0Jy.cjs');
41
+ require('./projectPath-ChLhdOyt.cjs');
26
42
  require('url');
27
- require('os');
28
- require('@paralleldrive/cuid2');
29
- require('node:fs/promises');
30
- require('node-pty');
31
- require('fs');
32
- require('tweetnacl');
33
- require('node:readline');
34
- require('@anthropic-ai/sandbox-runtime');
35
- require('expo-server-sdk');
43
+ require('./sync-DccIKZ5_.cjs');
44
+ require('./backgroundTaskActivity-CBvUdj39.cjs');
36
45
  require('chalk');
37
46
  require('node:util');
38
- require('./agentGuidance-BRDN1NoZ.cjs');
39
- require('ink');
40
- require('react');
41
- require('@anthropic-ai/claude-agent-sdk');
42
- require('ps-list');
43
- require('tmp');
44
- require('open');
45
- require('fastify');
46
- require('fastify-type-provider-zod');
47
- require('node:module');
48
- require('@modelcontextprotocol/sdk/server/mcp.js');
49
- require('node:http');
50
- require('@modelcontextprotocol/sdk/server/streamableHttp.js');
51
- require('http');
52
- require('inquirer');
53
- require('node:url');
54
- require('node:readline/promises');
47
+ require('tweetnacl');
48
+ require('./types-CRS-srZK.cjs');
49
+ require('node:fs/promises');
50
+ require('./package-BwMrPwqH.cjs');
51
+ require('./detectCLI-DR9ZaN6B.cjs');
52
+ require('fs');
53
+ require('./localHappyAgentAuth-D6rFhaoc.cjs');
55
54
 
56
55
  function _interopNamespaceDefault(e) {
57
56
  var n = Object.create(null);
@@ -99,11 +98,11 @@ function getOpenClawDir(homeDir) {
99
98
  return path.join(homeDir, OPENCLAW_DIR_NAME);
100
99
  }
101
100
  function ensureDir(dir) {
102
- persistence.ensurePrivateDirectorySync(dir);
101
+ configuration.ensurePrivateDirectorySync(dir);
103
102
  }
104
103
  function readJsonFile(filePath) {
105
104
  try {
106
- persistence.hardenPrivateFileSync(filePath);
105
+ configuration.hardenPrivateFileSync(filePath);
107
106
  return JSON.parse(node_fs.readFileSync(filePath, "utf-8"));
108
107
  } catch {
109
108
  return null;
@@ -112,21 +111,21 @@ function readJsonFile(filePath) {
112
111
  function writeJsonFile(filePath, data) {
113
112
  const dir = path.join(filePath, "..");
114
113
  ensureDir(dir);
115
- persistence.writePrivateFileSync(filePath, JSON.stringify(data, null, 2));
114
+ configuration.writePrivateFileSync(filePath, JSON.stringify(data, null, 2));
116
115
  }
117
116
  function migrateLegacyOpenClawAuth(legacyHomeDir, happyHomeDir) {
118
117
  if (legacyHomeDir === happyHomeDir) return;
119
118
  const legacyDir = getOpenClawDir(legacyHomeDir);
120
119
  if (!node_fs.existsSync(legacyDir)) return;
121
- persistence.ensurePrivateDirectorySync(legacyDir);
122
- persistence.ensurePrivateDirectorySync(getOpenClawDir(happyHomeDir));
120
+ configuration.ensurePrivateDirectorySync(legacyDir);
121
+ configuration.ensurePrivateDirectorySync(getOpenClawDir(happyHomeDir));
123
122
  for (const fileName of [DEVICE_IDENTITY_FILE, DEVICE_AUTH_TOKEN_FILE]) {
124
123
  const legacyPath = path.join(legacyDir, fileName);
125
124
  if (!node_fs.existsSync(legacyPath)) continue;
126
- persistence.hardenPrivateFileSync(legacyPath);
125
+ configuration.hardenPrivateFileSync(legacyPath);
127
126
  const nextPath = path.join(getOpenClawDir(happyHomeDir), fileName);
128
127
  if (node_fs.existsSync(nextPath)) {
129
- persistence.hardenPrivateFileSync(nextPath);
128
+ configuration.hardenPrivateFileSync(nextPath);
130
129
  continue;
131
130
  }
132
131
  try {
@@ -368,7 +367,7 @@ class OpenClawSocket {
368
367
  try {
369
368
  this.ws = new WebSocket(url);
370
369
  } catch (err) {
371
- this.options.log(`Failed to create WebSocket: ${JSON.stringify(index.errorLogMetadata(err))}`);
370
+ this.options.log(`Failed to create WebSocket: ${JSON.stringify(contentLogMetadata.errorLogMetadata(err))}`);
372
371
  this.updateStatus("error", "Failed to create connection");
373
372
  this.scheduleReconnect();
374
373
  return;
@@ -380,7 +379,7 @@ class OpenClawSocket {
380
379
  this.handleMessage(data.toString());
381
380
  });
382
381
  this.ws.on("error", (err) => {
383
- this.options.log(`WebSocket error: ${JSON.stringify(index.errorLogMetadata(err))}`);
382
+ this.options.log(`WebSocket error: ${JSON.stringify(contentLogMetadata.errorLogMetadata(err))}`);
384
383
  if (this.status === "connecting") {
385
384
  this.updateStatus("error", "Connection failed");
386
385
  }
@@ -473,7 +472,7 @@ class OpenClawSocket {
473
472
  this.options.log(`Connected: ${JSON.stringify({ hasServerHost: Boolean(this.serverHost), hasMainSession: Boolean(this.mainSessionKey) })}`);
474
473
  } catch (error) {
475
474
  const errorMsg = error instanceof Error ? error.message : "";
476
- this.options.log(`Connect failed: ${JSON.stringify(index.errorLogMetadata(error))}`);
475
+ this.options.log(`Connect failed: ${JSON.stringify(contentLogMetadata.errorLogMetadata(error))}`);
477
476
  if (errorMsg.includes("NOT_PAIRED")) {
478
477
  const match = errorMsg.match(/requestId['":\s]+([a-f0-9-]+)/i);
479
478
  this.pairingRequestId = match?.[1] ?? null;
@@ -493,7 +492,7 @@ class OpenClawSocket {
493
492
  try {
494
493
  frame = JSON.parse(data);
495
494
  } catch {
496
- this.options.log(`Invalid JSON: ${JSON.stringify(index.contentLogMetadata(data))}`);
495
+ this.options.log(`Invalid JSON: ${JSON.stringify(contentLogMetadata.contentLogMetadata(data))}`);
497
496
  return;
498
497
  }
499
498
  if (frame.type === "res") {
@@ -824,36 +823,36 @@ function resolveGatewayConfig(opts) {
824
823
  async function runOpenClaw(opts) {
825
824
  const verbose = opts.verbose === true;
826
825
  const sessionTag = node_crypto.randomUUID();
827
- index.connectionState.setBackend("openclaw");
826
+ api.connectionState.setBackend("openclaw");
828
827
  const gatewayConfig = resolveGatewayConfig(opts);
829
828
  const log = (msg) => {
830
- persistence.logger.debug(`[openclaw] ${msg}`);
829
+ logger.logger.debug(`[openclaw] ${msg}`);
831
830
  if (verbose) {
832
831
  console.log(`[openclaw] ${msg}`);
833
832
  }
834
833
  };
835
834
  log("Resolved configured gateway");
836
- const api = await index.ApiClient.create(opts.credentials);
835
+ const api$1 = await api.ApiClient.create(opts.credentials);
837
836
  const settings = await persistence.readSettings();
838
837
  if (!settings?.machineId) {
839
838
  throw new Error("No machine ID found in settings");
840
839
  }
841
- await api.getOrCreateMachine({
840
+ await api$1.getOrCreateMachine({
842
841
  machineId: settings.machineId,
843
- metadata: index$1.initialMachineMetadata
842
+ metadata: machineMetadata.getInitialMachineMetadata()
844
843
  });
845
- const { state, metadata } = index$1.createSessionMetadata({
844
+ const { state, metadata } = createSessionMetadata.createSessionMetadata({
846
845
  flavor: "openclaw",
847
846
  machineId: settings.machineId,
848
847
  startedBy: opts.startedBy
849
848
  });
850
- const response = await api.getOrCreateSession({ tag: sessionTag, metadata, state });
849
+ const response = await api$1.getOrCreateSession({ tag: sessionTag, metadata, state });
851
850
  if (response) {
852
851
  log(`Happy Session ID: ${response.id}`);
853
852
  }
854
853
  let session;
855
- const { session: initialSession, reconnectionHandle } = index$1.setupOfflineReconnection({
856
- api,
854
+ const { session: initialSession, reconnectionHandle } = setupOfflineReconnection.setupOfflineReconnection({
855
+ api: api$1,
857
856
  sessionTag,
858
857
  metadata,
859
858
  state,
@@ -865,19 +864,19 @@ async function runOpenClaw(opts) {
865
864
  session = initialSession;
866
865
  if (response) {
867
866
  try {
868
- await persistence.notifyDaemonSessionStarted(response.id, metadata, {
869
- encryptionKey: persistence.encodeBase64(response.encryptionKey),
867
+ await controlClient.notifyDaemonSessionStarted(response.id, metadata, {
868
+ encryptionKey: authRelay.encodeBase64(response.encryptionKey),
870
869
  encryptionVariant: response.encryptionVariant,
871
870
  seq: response.seq,
872
871
  metadataVersion: response.metadataVersion,
873
872
  agentStateVersion: response.agentStateVersion
874
873
  });
875
874
  } catch (error) {
876
- persistence.logger.debug("[openclaw] Failed to report session to daemon:", error);
875
+ logger.logger.debug("[openclaw] Failed to report session to daemon:", error);
877
876
  }
878
877
  }
879
878
  const sessionManager = new AcpSessionManager.AcpSessionManager();
880
- const messageQueue = new index$1.MessageQueue2(() => "");
879
+ const messageQueue = new registerKillSessionHandler.MessageQueue2(() => "");
881
880
  let shouldExit = false;
882
881
  let abortController = new AbortController();
883
882
  let pendingTurn = null;
@@ -906,15 +905,15 @@ async function runOpenClaw(opts) {
906
905
  session.sendSessionProtocolMessage(envelope);
907
906
  }
908
907
  };
909
- migrateLegacyOpenClawAuth(os.homedir(), persistence.configuration.happyHomeDir);
908
+ migrateLegacyOpenClawAuth(os.homedir(), configuration.configuration.happyHomeDir);
910
909
  const backend = new OpenClawBackend({
911
- homeDir: persistence.configuration.happyHomeDir,
910
+ homeDir: configuration.configuration.happyHomeDir,
912
911
  gatewayConfig,
913
912
  log
914
913
  });
915
914
  const onBackendMessage = (msg) => {
916
915
  if (verbose) {
917
- log(`Backend message: ${JSON.stringify(index.contentLogMetadata(msg))}`);
916
+ log(`Backend message: ${JSON.stringify(contentLogMetadata.contentLogMetadata(msg))}`);
918
917
  }
919
918
  if (msg.type === "status" && inTurn) {
920
919
  const nextThinking = msg.status === "running";
@@ -927,7 +926,7 @@ async function runOpenClaw(opts) {
927
926
  }
928
927
  }
929
928
  if (msg.type === "status" && (msg.status === "error" || msg.status === "stopped")) {
930
- log(`Backend ${msg.status}: ${JSON.stringify(index.contentLogMetadata(msg.detail))}`);
929
+ log(`Backend ${msg.status}: ${JSON.stringify(contentLogMetadata.contentLogMetadata(msg.detail))}`);
931
930
  shouldExit = true;
932
931
  messageQueue.close();
933
932
  clearPendingTurn(new Error(`OpenClaw backend ${msg.status}`));
@@ -954,7 +953,7 @@ async function runOpenClaw(opts) {
954
953
  await backend.cancel(sessionKey);
955
954
  }
956
955
  } catch (error) {
957
- persistence.logger.debug("[openclaw] Abort failed:", index.errorLogMetadata(error));
956
+ logger.logger.debug("[openclaw] Abort failed:", contentLogMetadata.errorLogMetadata(error));
958
957
  }
959
958
  inTurn = false;
960
959
  thinking = false;
@@ -967,7 +966,7 @@ async function runOpenClaw(opts) {
967
966
  session.rpcHandlerManager.registerHandler("openclaw-retry-pairing", async () => {
968
967
  backend.retryConnect();
969
968
  });
970
- index$1.registerKillSessionHandler(session.rpcHandlerManager, async () => {
969
+ registerKillSessionHandler.registerKillSessionHandler(session.rpcHandlerManager, async () => {
971
970
  shouldExit = true;
972
971
  messageQueue.close();
973
972
  clearPendingTurn(new Error("Session terminated"));
@@ -984,7 +983,7 @@ async function runOpenClaw(opts) {
984
983
  if (waitSignal.aborted) continue;
985
984
  break;
986
985
  }
987
- log(`Incoming prompt: ${JSON.stringify(index.contentLogMetadata(batch.message))}`);
986
+ log(`Incoming prompt: ${JSON.stringify(contentLogMetadata.contentLogMetadata(batch.message))}`);
988
987
  inTurn = true;
989
988
  sendEnvelopes(sessionManager.startTurn());
990
989
  const turnEnded = waitForTurnEnd();
@@ -993,14 +992,14 @@ async function runOpenClaw(opts) {
993
992
  await turnEnded;
994
993
  sendEnvelopes(sessionManager.endTurn("completed"));
995
994
  } catch (error) {
996
- log(`Turn ended: ${JSON.stringify(index.errorLogMetadata(error))}`);
995
+ log(`Turn ended: ${JSON.stringify(contentLogMetadata.errorLogMetadata(error))}`);
997
996
  sendEnvelopes(sessionManager.endTurn("failed"));
998
997
  }
999
998
  try {
1000
999
  const usage = await backend.getUsageSnapshot();
1001
1000
  if (usage) session.sendAgentUsageSnapshot("openclaw", usage);
1002
1001
  } catch (error) {
1003
- persistence.logger.debug("[openclaw] Failed to report usage:", index.errorLogMetadata(error));
1002
+ logger.logger.debug("[openclaw] Failed to report usage:", contentLogMetadata.errorLogMetadata(error));
1004
1003
  }
1005
1004
  inTurn = false;
1006
1005
  thinking = false;
@@ -1025,7 +1024,7 @@ async function runOpenClaw(opts) {
1025
1024
  await session.flush();
1026
1025
  await session.close();
1027
1026
  } catch (error) {
1028
- persistence.logger.debug("[openclaw] Session close failed:", error);
1027
+ logger.logger.debug("[openclaw] Session close failed:", error);
1029
1028
  }
1030
1029
  }
1031
1030
  }
@@ -3,53 +3,52 @@ import { execFileSync } from 'node:child_process';
3
3
  import os from 'node:os';
4
4
  import { existsSync, readFileSync } from 'node:fs';
5
5
  import { join } from 'node:path';
6
- import { i as errorLogMetadata, j as contentLogMetadata, h as connectionState, A as ApiClient } from './types-Dh-s4Lqs.mjs';
7
- import { A as AcpSessionManager } from './AcpSessionManager-rYtVb0kN.mjs';
8
- import { z as ensurePrivateDirectorySync, D as hardenPrivateFileSync, E as writePrivateFileSync, r as readSettings, v as notifyDaemonSessionStarted, w as encodeBase64, l as logger, c as configuration } from './limits-CjRj8IX5.mjs';
9
- import { h as initialMachineMetadata, j as createSessionMetadata, k as setupOfflineReconnection, M as MessageQueue2, v as registerKillSessionHandler } from './index-BF6WfgV5.mjs';
6
+ import { c as connectionState, A as ApiClient } from './api-CLMUr-SX.mjs';
7
+ import { A as AcpSessionManager } from './AcpSessionManager-CoMWFVw3.mjs';
8
+ import { l as logger } from './logger-6HYUEXNk.mjs';
9
+ import { M as MessageQueue2, r as registerKillSessionHandler } from './registerKillSessionHandler-GYvHdipX.mjs';
10
+ import { readSettings } from './persistence-HGW_ZVs9.mjs';
11
+ import { g as getInitialMachineMetadata } from './machineMetadata-oOzBfDfs.mjs';
12
+ import { c as createSessionMetadata } from './createSessionMetadata-CVVkGjxV.mjs';
13
+ import { s as setupOfflineReconnection } from './setupOfflineReconnection-DpvWTt69.mjs';
14
+ import { n as notifyDaemonSessionStarted } from './controlClient-BGbDcgWS.mjs';
15
+ import { e as encodeBase64 } from './authRelay-DSAvg1uv.mjs';
10
16
  import WebSocket from 'ws';
11
17
  import * as ed from '@noble/ed25519';
12
18
  import { sha512 } from '@noble/hashes/sha2.js';
19
+ import { f as ensurePrivateDirectorySync, h as hardenPrivateFileSync, w as writePrivateFileSync, c as configuration } from './configuration-RfeNjFmd.mjs';
20
+ import { e as errorLogMetadata, c as contentLogMetadata } from './contentLogMetadata-BlWI0egu.mjs';
13
21
  import 'axios';
14
22
  import 'node:events';
15
23
  import 'socket.io-client';
24
+ import './attachmentLimits-yba1uHFO.mjs';
16
25
  import 'zod';
26
+ import './index-qdS1friN.mjs';
27
+ import '@paralleldrive/cuid2';
28
+ import './limits-DIo7rEBR.mjs';
29
+ import './time-D0XyHOid.mjs';
30
+ import './lidState-CeEt442o.mjs';
31
+ import 'os';
17
32
  import 'child_process';
33
+ import './registerCommonHandlers-Ccvsz7Ou.mjs';
18
34
  import 'util';
19
35
  import 'fs/promises';
20
36
  import 'crypto';
21
37
  import 'path';
22
38
  import 'cross-spawn';
23
- import './terminalTitleSuggest-DKgX3osW.mjs';
39
+ import './projectPath-BTBIMB57.mjs';
24
40
  import 'url';
25
- import 'os';
26
- import '@paralleldrive/cuid2';
27
- import 'node:fs/promises';
28
- import 'node-pty';
29
- import 'fs';
30
- import 'tweetnacl';
31
- import 'node:readline';
32
- import '@anthropic-ai/sandbox-runtime';
33
- import 'expo-server-sdk';
41
+ import './sync-C8gyQFMc.mjs';
42
+ import './backgroundTaskActivity-8PdPxrvy.mjs';
34
43
  import 'chalk';
35
44
  import 'node:util';
36
- import './agentGuidance-KgvYuF3R.mjs';
37
- import 'ink';
38
- import 'react';
39
- import '@anthropic-ai/claude-agent-sdk';
40
- import 'ps-list';
41
- import 'tmp';
42
- import 'open';
43
- import 'fastify';
44
- import 'fastify-type-provider-zod';
45
- import 'node:module';
46
- import '@modelcontextprotocol/sdk/server/mcp.js';
47
- import 'node:http';
48
- import '@modelcontextprotocol/sdk/server/streamableHttp.js';
49
- import 'http';
50
- import 'inquirer';
51
- import 'node:url';
52
- import 'node:readline/promises';
45
+ import 'tweetnacl';
46
+ import './types-CkqAACXx.mjs';
47
+ import 'node:fs/promises';
48
+ import './package-BhaKlnxz.mjs';
49
+ import './detectCLI-CSGMlV51.mjs';
50
+ import 'fs';
51
+ import './localHappyAgentAuth-C-HQyiv6.mjs';
53
52
 
54
53
  ed.hashes.sha512 = (message) => sha512(message);
55
54
  const { getPublicKeyAsync, signAsync, utils } = ed;
@@ -819,7 +818,7 @@ async function runOpenClaw(opts) {
819
818
  }
820
819
  await api.getOrCreateMachine({
821
820
  machineId: settings.machineId,
822
- metadata: initialMachineMetadata
821
+ metadata: getInitialMachineMetadata()
823
822
  });
824
823
  const { state, metadata } = createSessionMetadata({
825
824
  flavor: "openclaw",
@@ -0,0 +1,187 @@
1
+ 'use strict';
2
+
3
+ var chalk = require('chalk');
4
+ var inquirer = require('inquirer');
5
+ var node_fs = require('node:fs');
6
+ var os = require('node:os');
7
+ var persistence = require('./persistence-yKTH3-5X.cjs');
8
+ require('node:fs/promises');
9
+ require('./configuration-BSYpcPwE.cjs');
10
+ require('node:path');
11
+ require('./package-BwMrPwqH.cjs');
12
+ require('zod');
13
+ require('./authRelay-BdYkC1Po.cjs');
14
+ require('node:crypto');
15
+ require('tweetnacl');
16
+ require('./logger-CS0mw3fa.cjs');
17
+ require('node:util');
18
+
19
+ const DEFAULT_WORKSPACE_ROOT = "~/Workspace";
20
+ const DEFAULT_DENY_READ_PATHS = ["~/.ssh", "~/.aws", "~/.gnupg"];
21
+ function workspaceCandidatesForPlatform(platform) {
22
+ if (platform === "darwin") {
23
+ return ["~/Developer", "~/Develop", "~/Workspace"];
24
+ }
25
+ if (platform === "linux") {
26
+ return ["~/Workspace", "~/Developer", "~/Develop"];
27
+ }
28
+ return ["~/Developer", "~/Develop", "~/Workspace"];
29
+ }
30
+ function detectWorkspaceRootSuggestions(options) {
31
+ const platform = options?.platform ?? process.platform;
32
+ const home = options?.home ?? os.homedir();
33
+ const pathExists = options?.pathExists ?? node_fs.existsSync;
34
+ const candidates = workspaceCandidatesForPlatform(platform);
35
+ const existing = candidates.filter((candidate) => {
36
+ const absolutePath = candidate.replace(/^~(?=\/|$)/, home);
37
+ return pathExists(absolutePath);
38
+ });
39
+ if (existing.length > 0) {
40
+ return existing;
41
+ }
42
+ return [candidates[0] ?? DEFAULT_WORKSPACE_ROOT];
43
+ }
44
+ async function handleSandboxCommand(args) {
45
+ const subcommand = args[0];
46
+ if (!subcommand || subcommand === "help" || subcommand === "--help" || subcommand === "-h") {
47
+ handleSandboxHelp();
48
+ return;
49
+ }
50
+ switch (subcommand) {
51
+ case "configure":
52
+ await handleSandboxConfigure();
53
+ break;
54
+ case "status":
55
+ await handleSandboxStatus();
56
+ break;
57
+ case "disable":
58
+ await handleSandboxDisable();
59
+ break;
60
+ default:
61
+ console.error(chalk.red(`Unknown sandbox subcommand: ${subcommand}`));
62
+ handleSandboxHelp();
63
+ process.exit(1);
64
+ }
65
+ }
66
+ async function handleSandboxConfigure() {
67
+ const workspaceRootSuggestions = detectWorkspaceRootSuggestions();
68
+ const workspaceRootDefault = workspaceRootSuggestions[0] ?? DEFAULT_WORKSPACE_ROOT;
69
+ const answers = await inquirer.prompt([
70
+ {
71
+ type: "list",
72
+ name: "scopeMode",
73
+ message: "How should file access be scoped?",
74
+ default: "workspace",
75
+ choices: [
76
+ { name: "workspace - Full workspace root directory", value: "workspace" },
77
+ { name: "per-project - Only current project directory", value: "project" }
78
+ ]
79
+ },
80
+ {
81
+ type: "list",
82
+ name: "workspaceRoot",
83
+ message: "Pick your workspace root directory",
84
+ when: (currentAnswers) => currentAnswers.scopeMode === "workspace",
85
+ default: workspaceRootDefault,
86
+ choices: workspaceRootSuggestions.map((pathValue) => ({
87
+ name: `${pathValue}${node_fs.existsSync(pathValue.replace(/^~(?=\/|$)/, os.homedir())) ? "" : " (suggested)"}`,
88
+ value: pathValue
89
+ }))
90
+ },
91
+ {
92
+ type: "list",
93
+ name: "networkMode",
94
+ message: "How should network access be handled?",
95
+ default: "allowed",
96
+ choices: [
97
+ { name: "allowed - Allow all network access (default)", value: "allowed" },
98
+ { name: "blocked - Block all network access (most secure)", value: "blocked" }
99
+ ]
100
+ },
101
+ {
102
+ type: "confirm",
103
+ name: "allowLocalBinding",
104
+ message: "Allow binding to localhost ports? (for dev servers)",
105
+ default: true
106
+ }
107
+ ]);
108
+ const scopeMode = answers.scopeMode;
109
+ const sandboxConfig = persistence.SandboxConfigSchema.parse({
110
+ enabled: true,
111
+ workspaceRoot: scopeMode === "workspace" ? answers.workspaceRoot || workspaceRootDefault : void 0,
112
+ sessionIsolation: scopeMode === "workspace" ? "workspace" : "strict",
113
+ customWritePaths: [],
114
+ denyReadPaths: DEFAULT_DENY_READ_PATHS,
115
+ extraWritePaths: ["/tmp"],
116
+ denyWritePaths: [".env"],
117
+ networkMode: answers.networkMode,
118
+ allowedDomains: [],
119
+ deniedDomains: [],
120
+ allowLocalBinding: Boolean(answers.allowLocalBinding)
121
+ });
122
+ console.log(chalk.bold("\nSandbox configuration summary:"));
123
+ console.log(JSON.stringify(sandboxConfig, null, 2));
124
+ const { confirmSave } = await inquirer.prompt([
125
+ {
126
+ type: "confirm",
127
+ name: "confirmSave",
128
+ message: "Save and enable this sandbox configuration?",
129
+ default: true
130
+ }
131
+ ]);
132
+ if (!confirmSave) {
133
+ console.log(chalk.yellow("Sandbox configuration cancelled."));
134
+ return;
135
+ }
136
+ await persistence.updateSettings((settings) => ({
137
+ ...settings,
138
+ sandboxConfig
139
+ }));
140
+ console.log(chalk.green("Sandbox configuration saved and enabled."));
141
+ console.log(chalk.gray("Use --no-sandbox to bypass sandboxing for a single session."));
142
+ }
143
+ async function handleSandboxStatus() {
144
+ const settings = await persistence.readSettings();
145
+ const config = settings.sandboxConfig;
146
+ if (!config) {
147
+ console.log("Sandbox is not configured. Run `very-happy sandbox configure`.");
148
+ return;
149
+ }
150
+ console.log(chalk.bold("Sandbox status"));
151
+ console.log(`Enabled: ${config.enabled ? "yes" : "no"}`);
152
+ const scope = config.sessionIsolation === "workspace" ? "workspace" : "per-project";
153
+ console.log(`Scope: ${scope}`);
154
+ if (scope === "workspace") {
155
+ console.log(`Workspace root: ${config.workspaceRoot ?? DEFAULT_WORKSPACE_ROOT}`);
156
+ }
157
+ console.log(`Network mode: ${config.networkMode}`);
158
+ console.log(`Allow localhost binding: ${config.allowLocalBinding ? "yes" : "no"}`);
159
+ }
160
+ async function handleSandboxDisable() {
161
+ await persistence.updateSettings((settings) => ({
162
+ ...settings,
163
+ sandboxConfig: persistence.SandboxConfigSchema.parse({
164
+ ...settings.sandboxConfig ?? {},
165
+ enabled: false
166
+ })
167
+ }));
168
+ console.log(chalk.green("Sandbox disabled."));
169
+ }
170
+ function handleSandboxHelp() {
171
+ console.log(`
172
+ ${chalk.bold("very-happy sandbox")} - Sandbox management
173
+
174
+ ${chalk.bold("Usage:")}
175
+ very-happy sandbox configure Configure sandbox settings interactively
176
+ very-happy sandbox status Show current sandbox configuration
177
+ very-happy sandbox disable Disable sandboxing
178
+ very-happy sandbox help Show this help
179
+ `);
180
+ }
181
+
182
+ exports.detectWorkspaceRootSuggestions = detectWorkspaceRootSuggestions;
183
+ exports.handleSandboxCommand = handleSandboxCommand;
184
+ exports.handleSandboxConfigure = handleSandboxConfigure;
185
+ exports.handleSandboxDisable = handleSandboxDisable;
186
+ exports.handleSandboxHelp = handleSandboxHelp;
187
+ exports.handleSandboxStatus = handleSandboxStatus;