very-happy-cli 0.2.159 → 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.
- package/dist/{AcpBackend-VsfkZiVF.mjs → AcpBackend-6U6pQgx1.mjs} +4 -2
- package/dist/{AcpBackend-DUYFlyfN.cjs → AcpBackend-Ba98QDif.cjs} +78 -76
- package/dist/{AcpSessionManager-Bdv8LWXh.cjs → AcpSessionManager-BAY1Pggx.cjs} +9 -9
- package/dist/{AcpSessionManager-rYtVb0kN.mjs → AcpSessionManager-CoMWFVw3.mjs} +1 -1
- package/dist/BasePermissionHandler-2R0uH2CI.cjs +157 -0
- package/dist/BasePermissionHandler-BvvhBTja.mjs +155 -0
- package/dist/BaseReasoningProcessor-DyhO1uoU.mjs +198 -0
- package/dist/BaseReasoningProcessor-fsVNmCEF.cjs +200 -0
- package/dist/RemoteModeDisplay-D-HewyXg.mjs +150 -0
- package/dist/RemoteModeDisplay-NC1gPHtj.cjs +153 -0
- package/dist/agentAttachments-Dbw8iMCZ.cjs +20 -0
- package/dist/agentAttachments-M_B5qEF2.mjs +18 -0
- package/dist/agentGuidance-B5NATuFa.cjs +28 -0
- package/dist/agentGuidance-CQuNlNx8.mjs +20 -0
- package/dist/{agentHome-CvsJyeQB.mjs → agentHome-Ck1i1TQB.mjs} +8 -22
- package/dist/{agentHome-CHh4lmjM.cjs → agentHome-DvNnGphb.cjs} +14 -28
- package/dist/api-B2vLMS-z.cjs +3346 -0
- package/dist/api-SffjRQ1b.mjs +3339 -0
- package/dist/{types-Dh-s4Lqs.mjs → apiMachine-BpW9t8MO.mjs} +9116 -16205
- package/dist/{types-BbvK1Tr_.cjs → apiMachine-gFA54X7y.cjs} +9104 -16247
- package/dist/assistantTools-BfA0R3_m.cjs +380 -0
- package/dist/assistantTools-CgiTbnWb.mjs +376 -0
- package/dist/attachmentContent-CSGxr71v.mjs +82 -0
- package/dist/attachmentContent-DMMZzevR.cjs +88 -0
- package/dist/attachmentLimits-CzVrqgLR.cjs +354 -0
- package/dist/attachmentLimits-yba1uHFO.mjs +348 -0
- package/dist/auth-Bt4ceBBy.cjs +227 -0
- package/dist/auth-CYHjQ8oQ.mjs +225 -0
- package/dist/auth-DdyVZSo6.mjs +218 -0
- package/dist/auth-x4CEoysH.cjs +220 -0
- package/dist/authRelay-BdYkC1Po.cjs +156 -0
- package/dist/authRelay-DSAvg1uv.mjs +143 -0
- package/dist/{auto-DKmEls8Z.cjs → auto-BDXDUnjB.cjs} +70 -79
- package/dist/{auto-nb8GhRRy.mjs → auto-CXLlRi3a.mjs} +27 -36
- package/dist/backgroundTaskActivity-8PdPxrvy.mjs +149 -0
- package/dist/backgroundTaskActivity-CBvUdj39.cjs +157 -0
- package/dist/bootstrap-BNQq05jR.mjs +112 -0
- package/dist/bootstrap-CkgIq8N3.cjs +116 -0
- package/dist/browser-9pyhQr1R.mjs +20 -0
- package/dist/browser-BDOlKWYe.cjs +22 -0
- package/dist/claudeCliPath-BqkaH2oR.mjs +8 -0
- package/dist/claudeCliPath-U4HHmV4r.cjs +10 -0
- package/dist/claudeLocal-BDuGFnjJ.cjs +343 -0
- package/dist/claudeLocal-CQa8qnwq.mjs +339 -0
- package/dist/claudeLocalLauncher-Bd5I2-j6.cjs +154 -0
- package/dist/claudeLocalLauncher-CDqQI9ak.mjs +152 -0
- package/dist/cliUpdate-DsKXPFYp.cjs +120 -0
- package/dist/cliUpdate-Y34VGe9Y.mjs +112 -0
- package/dist/client-Brn-UwVk.mjs +100 -0
- package/dist/client-CXb1VJui.mjs +112 -0
- package/dist/client-C_axwRry.cjs +104 -0
- package/dist/client-DOBWJL3u.cjs +119 -0
- package/dist/codex/happyMcpStdioBridge.cjs +33 -14
- package/dist/codex/happyMcpStdioBridge.mjs +26 -7
- package/dist/codexAppServerClient-ZzhUTWPo.cjs +1090 -0
- package/dist/codexAppServerClient-oeQKD6Qf.mjs +1088 -0
- package/dist/codexCommand-C7H0NpBe.cjs +2088 -0
- package/dist/codexCommand-CJ82bl3l.mjs +2086 -0
- package/dist/codexThreadFork-BCaEMBiM.mjs +338 -0
- package/dist/codexThreadFork-BZqF-9bX.cjs +350 -0
- package/dist/{config-ClLtM6F3.mjs → config-BglnktIo.mjs} +7 -40
- package/dist/{config-DLx-vW3I.cjs → config-CYpL1Ahd.cjs} +26 -59
- package/dist/configuration-DoWFJUPm.mjs +170 -0
- package/dist/configuration-v9f8LM9T.cjs +181 -0
- package/dist/connect-hgcNjyAB.mjs +682 -0
- package/dist/connect-yEvjdRvx.cjs +684 -0
- package/dist/constants-BC4St0xd.mjs +11 -0
- package/dist/constants-VJ0N6WuG.cjs +17 -0
- package/dist/contentLogMetadata-BlWI0egu.mjs +51 -0
- package/dist/contentLogMetadata-ZSFk_NjQ.cjs +54 -0
- package/dist/context-B45vMtSZ.cjs +69 -0
- package/dist/context-C9GHPLEm.mjs +65 -0
- package/dist/controlClient-DjoKTtgK.mjs +260 -0
- package/dist/controlClient-fEHE85bH.cjs +279 -0
- package/dist/createSessionMetadata-BRLB9CNO.cjs +58 -0
- package/dist/createSessionMetadata-mIeehclp.mjs +54 -0
- package/dist/defaultPermissionMode-BnxJPVHT.mjs +4 -0
- package/dist/defaultPermissionMode-CxmTXUQR.cjs +7 -0
- package/dist/detectCLI-CSGMlV51.mjs +58 -0
- package/dist/detectCLI-DR9ZaN6B.cjs +61 -0
- package/dist/deterministicJson-DKDP_mM-.cjs +507 -0
- package/dist/deterministicJson-p835AdAU.mjs +502 -0
- package/dist/doctor-BPkYWSuq.mjs +75 -0
- package/dist/doctor-BeUuQXFs.mjs +391 -0
- package/dist/doctor-hVNnSZJn.cjs +395 -0
- package/dist/doctor-u46qYYKX.cjs +79 -0
- package/dist/doctorReadiness-BCZGcN0a.cjs +151 -0
- package/dist/doctorReadiness-C208SMN9.mjs +142 -0
- package/dist/editPaths-BVfS_FFL.mjs +68 -0
- package/dist/editPaths-Bqp4OFPw.cjs +73 -0
- package/dist/ensureDaemonRunning-CO7d1gOC.mjs +61 -0
- package/dist/ensureDaemonRunning-Dg9aZfjs.cjs +64 -0
- package/dist/handleResumeCommand-BiTPK0qd.mjs +240 -0
- package/dist/handleResumeCommand-DnVmy7a3.cjs +245 -0
- package/dist/ids-B6ZC0HGt.cjs +13 -0
- package/dist/ids-DU6sLx4C.mjs +10 -0
- package/dist/index-B6UGRQ7h.mjs +102 -0
- package/dist/{index-2mCaeKyf.mjs → index-CAFwetLk.mjs} +68 -38
- package/dist/index-Cqx-Raq6.mjs +68 -0
- package/dist/index-D3kI0hDR.cjs +107 -0
- package/dist/index-DA7yINuk.cjs +994 -0
- package/dist/{index-BEOMECtE.cjs → index-LIn6nCcq.cjs} +121 -91
- package/dist/index-Pf2cV9cn.cjs +182 -0
- package/dist/index-SPGPenK5.mjs +158 -0
- package/dist/index-gNTWtSKN.cjs +71 -0
- package/dist/index-qdS1friN.mjs +949 -0
- package/dist/index.cjs +5 -46
- package/dist/index.mjs +5 -46
- package/dist/{install-BPhJppvd.mjs → install-BO_W7VhL.mjs} +37 -37
- package/dist/install-Bu85vlHD.cjs +88 -0
- package/dist/install-ClUUl3yp.mjs +86 -0
- package/dist/{install-BOHrUaFM.cjs → install-Cs5qAPrB.cjs} +38 -38
- package/dist/{installPiTools-DuZ6jZvX.cjs → installPiTools-BKnXjrVu.cjs} +2 -3
- package/dist/{installPiTools-Cj7yU9Fc.mjs → installPiTools-B_CdM5_2.mjs} +1 -2
- package/dist/{installTerminalHooks-Cou3WUf3.cjs → installTerminalHooks-BQZbvxsZ.cjs} +5 -40
- package/dist/{installTerminalHooks-WeznjkuC.mjs → installTerminalHooks-By7gBMEF.mjs} +3 -38
- package/dist/lib.cjs +28 -19
- package/dist/lib.d.cts +12 -2
- package/dist/lib.d.mts +12 -2
- package/dist/lib.mjs +23 -14
- package/dist/lidState-C2dI0FAN.mjs +297 -0
- package/dist/lidState-KHHu1015.cjs +305 -0
- package/dist/limits-C-a7gr04.cjs +43 -0
- package/dist/limits-DIo7rEBR.mjs +36 -0
- package/dist/localHappyAgentAuth-BXiHPXdC.cjs +86 -0
- package/dist/localHappyAgentAuth-DCsetiyG.mjs +82 -0
- package/dist/logger-Bc8-u1w0.cjs +275 -0
- package/dist/logger-fXoNzNuB.mjs +271 -0
- package/dist/loginShellEnv-BkuYtExZ.cjs +182 -0
- package/dist/loginShellEnv-Dw8M7tkI.mjs +167 -0
- package/dist/machineMetadata-BHjehxJY.mjs +38 -0
- package/dist/machineMetadata-BibDMFVx.cjs +41 -0
- package/dist/main-BktM4A1K.mjs +939 -0
- package/dist/main-CLaX-t-b.cjs +941 -0
- package/dist/manager-BQ4flvQZ.mjs +101 -0
- package/dist/manager-Cly8xVIR.cjs +105 -0
- package/dist/{mcp-Dy3f_K0h.mjs → mcp-CeUd9KDr.mjs} +27 -33
- package/dist/{mcp-CPYbtsYG.cjs → mcp-GBfE70nk.cjs} +42 -48
- package/dist/messageBuffer-BWlGgR3A.mjs +71 -0
- package/dist/messageBuffer-fJMH6uY8.cjs +73 -0
- package/dist/mirrorProtocol-BNLtoWjO.mjs +170 -0
- package/dist/mirrorProtocol-BUtmg1ws.cjs +186 -0
- package/dist/oneShotPrompts-CL0dip9C.cjs +16 -0
- package/dist/oneShotPrompts-DT4p6RNd.mjs +12 -0
- package/dist/package-Cl5BEP5x.cjs +173 -0
- package/dist/package-uOg9SCKi.mjs +171 -0
- package/dist/path-B7zW-WwE.cjs +18 -0
- package/dist/path-D2wdaNSk.mjs +15 -0
- package/dist/peerTools-CIeiy9wn.cjs +283 -0
- package/dist/peerTools-Dz3_7Bkk.mjs +272 -0
- package/dist/permissionMode-CH4FoZfU.mjs +80 -0
- package/dist/permissionMode-CrV-XuMs.cjs +87 -0
- package/dist/persistence-CBNMzSa8.cjs +414 -0
- package/dist/persistence-oET5n61f.mjs +372 -0
- package/dist/piExtension.mjs +2 -1
- package/dist/piRunnerArgs-Bf7RUF__.cjs +66 -0
- package/dist/piRunnerArgs-Dk1ncwHF.mjs +59 -0
- package/dist/{piRuntime-NtF0YqjH.cjs → piRuntime-B_6TE9Eb.cjs} +4 -4
- package/dist/{piRuntime-kLZNpAAl.mjs → piRuntime-BwRdhK_N.mjs} +2 -2
- package/dist/{piTerminal-B0fEOV_2.mjs → piTerminal-Bap3R8Re.mjs} +32 -35
- package/dist/{piTerminal-9J0GAKzb.cjs → piTerminal-CagmEoez.cjs} +32 -35
- package/dist/previewPath-B0rBdhy1.cjs +83 -0
- package/dist/previewPath-CXN4Vag0.mjs +81 -0
- package/dist/projectPath-BTBIMB57.mjs +10 -0
- package/dist/projectPath-ChLhdOyt.cjs +13 -0
- package/dist/registerCommonHandlers-BjSV2Skz.cjs +538 -0
- package/dist/registerCommonHandlers-CrgvJsOy.mjs +536 -0
- package/dist/registerKillSessionHandler-6TC2S3lf.cjs +366 -0
- package/dist/registerKillSessionHandler-Cbc8Rgtd.mjs +363 -0
- package/dist/remoteSessionClient-BNx78NLb.cjs +634 -0
- package/dist/remoteSessionClient-CO7qOjR0.mjs +612 -0
- package/dist/resources-BdFBQi8r.mjs +117 -0
- package/dist/resources-JDPugcDq.cjs +120 -0
- package/dist/run-2l5vSt2h.mjs +5743 -0
- package/dist/run-D5xAEWSB.cjs +5766 -0
- package/dist/runClaude-BX6ixjtW.cjs +894 -0
- package/dist/runClaude-BgN6xo05.mjs +892 -0
- package/dist/runClaudeDeps-Bp20MScE.cjs +4168 -0
- package/dist/runClaudeDeps-COBBhD9o.mjs +4129 -0
- package/dist/{runGemini-F-mqx3_K.cjs → runGemini-CSMPkt0p.cjs} +202 -175
- package/dist/{runGemini-DV6Ouadt.mjs → runGemini-Cc2jq-uh.mjs} +58 -31
- package/dist/{runOpenClaw-D7MlPS5n.mjs → runOpenClaw-CIlCwdW2.mjs} +31 -32
- package/dist/{runOpenClaw-Qqo9j63M.cjs → runOpenClaw-YBwua4Rf.cjs} +64 -65
- package/dist/sandbox-C4gXLP1p.cjs +187 -0
- package/dist/sandbox-CNkwOtHI.mjs +180 -0
- package/dist/selfCheck-CU8xSDsl.cjs +87 -0
- package/dist/selfCheck-hJ6PCh7v.mjs +84 -0
- package/dist/{send-CLhYXNgy.mjs → send-CGHcKZ-w.mjs} +12 -5
- package/dist/{send-4qJTCAYW.cjs → send-DY9Nr-x4.cjs} +16 -9
- package/dist/server-II51Mimf.cjs +407 -0
- package/dist/server-m2b5pamZ.mjs +404 -0
- package/dist/sessionLock-7ePAYDOg.cjs +205 -0
- package/dist/sessionLock-Cw6FmbMv.mjs +197 -0
- package/dist/sessionModeFile-BVCV5f7E.cjs +36 -0
- package/dist/sessionModeFile-CDmDyRkD.mjs +32 -0
- package/dist/sessionOps-C_f1wKOr.mjs +760 -0
- package/dist/sessionOps-DJdExmBy.cjs +783 -0
- package/dist/sessionScanner-CaAHLyNV.mjs +206 -0
- package/dist/sessionScanner-D1goKdd3.cjs +209 -0
- package/dist/{sessions-Bh1pyddi.cjs → sessions-DGs6ALNo.cjs} +37 -28
- package/dist/{sessions-CzIH2rGp.mjs → sessions-DnvmWUel.mjs} +17 -8
- package/dist/setupOfflineReconnection-CVViqZft.mjs +72 -0
- package/dist/setupOfflineReconnection-R7XuR_sj.cjs +74 -0
- package/dist/smallFastModel-BLNgMrwR.mjs +18 -0
- package/dist/smallFastModel-D_uxGMo3.cjs +21 -0
- package/dist/{spawn-CmFOSVdW.cjs → spawn-CXTH7qg1.cjs} +61 -65
- package/dist/{spawn-CPIWlPOM.mjs → spawn-DNYSvFtC.mjs} +35 -40
- package/dist/spawnAgents-BGQiEF-w.cjs +52 -0
- package/dist/spawnAgents-DZzZ9jMI.mjs +45 -0
- package/dist/spawnHappyCLI-BhYj84rv.cjs +66 -0
- package/dist/spawnHappyCLI-cqWQbwsb.mjs +64 -0
- package/dist/specialCommands-BSqhYg5X.mjs +52 -0
- package/dist/specialCommands-DSsTeRej.cjs +54 -0
- package/dist/startFileWatcher-CKKx-8ZO.cjs +71 -0
- package/dist/startFileWatcher-CdegMbJj.mjs +69 -0
- package/dist/startupPlan-BLMbfQIH.cjs +12 -0
- package/dist/startupPlan-DFMyNgAs.mjs +10 -0
- package/dist/streamRelay-BiKw59Cc.cjs +233 -0
- package/dist/streamRelay-FPVbHpbM.mjs +231 -0
- package/dist/sync-CVk4QERO.cjs +71 -0
- package/dist/sync-CxD-w_40.mjs +69 -0
- package/dist/systemPrompt-BygJcmbi.cjs +97 -0
- package/dist/systemPrompt-DmtypUc7.mjs +94 -0
- package/dist/{teams-CEahj4cm.mjs → teams-BOC6nIPL.mjs} +9 -40
- package/dist/{teams-CB1R9-Z9.cjs → teams-BsvpOBfn.cjs} +14 -45
- package/dist/template-BaHAmH2K.cjs +129 -0
- package/dist/template-CiOPa2rd.mjs +121 -0
- package/dist/{terminalTitleSuggest-DKgX3osW.mjs → terminalTitleSuggest-CeKsX_V6.mjs} +1 -9
- package/dist/{terminalTitleSuggest-Dji8I0Jy.cjs → terminalTitleSuggest-DhvRFX3H.cjs} +0 -10
- package/dist/terminals-B_bfC9c2.cjs +250 -0
- package/dist/terminals-Dlg0x3nY.mjs +235 -0
- package/dist/time-BZNdNiIV.mjs +38 -0
- package/dist/time-CNRE4ChD.cjs +42 -0
- package/dist/titleGenerator-CFRhU-xq.cjs +172 -0
- package/dist/titleGenerator-ox6ptCsp.mjs +166 -0
- package/dist/tmuxSocket-B8Yx20sT.mjs +19 -0
- package/dist/tmuxSocket-D-Xt6Vn-.cjs +24 -0
- package/dist/{todo-DqyRI4wP.cjs → todo-B-KB7oAB.cjs} +15 -12
- package/dist/{todo-Cknp5D4U.mjs → todo-C5KBVbUw.mjs} +11 -8
- package/dist/tools-BZabNIid.mjs +177 -0
- package/dist/tools-BmQQUATY.mjs +60 -0
- package/dist/tools-CsSovyNp.cjs +180 -0
- package/dist/tools-lMDra4Pv.cjs +63 -0
- package/dist/trimIdent-4gvk9Wk6.cjs +22 -0
- package/dist/trimIdent-BAjmv_TG.mjs +20 -0
- package/dist/types-CRS-srZK.cjs +66 -0
- package/dist/types-CkqAACXx.mjs +64 -0
- package/dist/uninstall-B1WLtC1d.mjs +47 -0
- package/dist/uninstall-fvA5aWpU.cjs +49 -0
- package/package.json +7 -7
- package/scripts/session_hook_forwarder.cjs +9 -2
- package/dist/agentGuidance-BRDN1NoZ.cjs +0 -2217
- package/dist/agentGuidance-KgvYuF3R.mjs +0 -2145
- package/dist/index-BF6WfgV5.mjs +0 -19624
- package/dist/index-C-JazrMB.mjs +0 -52
- package/dist/index-blDSadUR.cjs +0 -58
- package/dist/index-rH3DrQ5B.cjs +0 -19688
- package/dist/limits-BH5CV5vR.cjs +0 -2683
- package/dist/limits-CjRj8IX5.mjs +0 -2558
|
@@ -1,57 +1,87 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var AcpBackend = require('./AcpBackend-
|
|
4
|
-
var
|
|
5
|
-
var AcpSessionManager = require('./AcpSessionManager-
|
|
6
|
-
var index
|
|
7
|
-
var
|
|
3
|
+
var AcpBackend = require('./AcpBackend-Ba98QDif.cjs');
|
|
4
|
+
var logger = require('./logger-Bc8-u1w0.cjs');
|
|
5
|
+
var AcpSessionManager = require('./AcpSessionManager-BAY1Pggx.cjs');
|
|
6
|
+
var index = require('./index-DA7yINuk.cjs');
|
|
7
|
+
var agentAttachments = require('./agentAttachments-Dbw8iMCZ.cjs');
|
|
8
|
+
var configuration = require('./configuration-v9f8LM9T.cjs');
|
|
9
|
+
var attachmentContent = require('./attachmentContent-DMMZzevR.cjs');
|
|
10
|
+
var piRuntime = require('./piRuntime-B_6TE9Eb.cjs');
|
|
8
11
|
var node_crypto = require('node:crypto');
|
|
9
12
|
var path = require('node:path');
|
|
10
|
-
var
|
|
11
|
-
var
|
|
13
|
+
var api = require('./api-B2vLMS-z.cjs');
|
|
14
|
+
var registerKillSessionHandler = require('./registerKillSessionHandler-6TC2S3lf.cjs');
|
|
15
|
+
var deterministicJson = require('./deterministicJson-DKDP_mM-.cjs');
|
|
16
|
+
var persistence = require('./persistence-CBNMzSa8.cjs');
|
|
17
|
+
var machineMetadata = require('./machineMetadata-BibDMFVx.cjs');
|
|
18
|
+
var createSessionMetadata = require('./createSessionMetadata-BRLB9CNO.cjs');
|
|
19
|
+
var setupOfflineReconnection = require('./setupOfflineReconnection-R7XuR_sj.cjs');
|
|
20
|
+
var controlClient = require('./controlClient-fEHE85bH.cjs');
|
|
21
|
+
var authRelay = require('./authRelay-BdYkC1Po.cjs');
|
|
22
|
+
var streamRelay = require('./streamRelay-BiKw59Cc.cjs');
|
|
23
|
+
var projectPath = require('./projectPath-ChLhdOyt.cjs');
|
|
24
|
+
var BasePermissionHandler = require('./BasePermissionHandler-2R0uH2CI.cjs');
|
|
25
|
+
var titleGenerator = require('./titleGenerator-CFRhU-xq.cjs');
|
|
26
|
+
var sessionModeFile = require('./sessionModeFile-BVCV5f7E.cjs');
|
|
27
|
+
var editPaths = require('./editPaths-Bqp4OFPw.cjs');
|
|
12
28
|
require('node:child_process');
|
|
13
29
|
require('@agentclientprotocol/sdk');
|
|
14
|
-
require('
|
|
15
|
-
require('
|
|
16
|
-
require('
|
|
17
|
-
require('node:fs');
|
|
18
|
-
require('tweetnacl');
|
|
30
|
+
require('./time-CNRE4ChD.cjs');
|
|
31
|
+
require('./contentLogMetadata-ZSFk_NjQ.cjs');
|
|
32
|
+
require('./package-Cl5BEP5x.cjs');
|
|
19
33
|
require('chalk');
|
|
20
34
|
require('node:util');
|
|
35
|
+
require('node:fs');
|
|
36
|
+
require('@paralleldrive/cuid2');
|
|
37
|
+
require('zod');
|
|
21
38
|
require('node:os');
|
|
22
|
-
require('
|
|
23
|
-
require('
|
|
24
|
-
require('./
|
|
39
|
+
require('node:fs/promises');
|
|
40
|
+
require('./attachmentLimits-CzVrqgLR.cjs');
|
|
41
|
+
require('./resources-JDPugcDq.cjs');
|
|
25
42
|
require('axios');
|
|
26
|
-
require('socket.io-client');
|
|
27
|
-
require('fs/promises');
|
|
28
|
-
require('ink');
|
|
29
|
-
require('react');
|
|
30
|
-
require('@anthropic-ai/claude-agent-sdk');
|
|
31
43
|
require('node:events');
|
|
44
|
+
require('socket.io-client');
|
|
45
|
+
require('./limits-C-a7gr04.cjs');
|
|
46
|
+
require('./lidState-KHHu1015.cjs');
|
|
32
47
|
require('os');
|
|
33
48
|
require('child_process');
|
|
34
|
-
require('
|
|
35
|
-
require('
|
|
36
|
-
require('
|
|
37
|
-
require('expo-server-sdk');
|
|
49
|
+
require('./registerCommonHandlers-BjSV2Skz.cjs');
|
|
50
|
+
require('util');
|
|
51
|
+
require('fs/promises');
|
|
38
52
|
require('crypto');
|
|
39
|
-
require('
|
|
40
|
-
require('
|
|
41
|
-
require('
|
|
42
|
-
require('
|
|
43
|
-
require('
|
|
44
|
-
require('
|
|
53
|
+
require('path');
|
|
54
|
+
require('cross-spawn');
|
|
55
|
+
require('./sync-CVk4QERO.cjs');
|
|
56
|
+
require('./backgroundTaskActivity-CBvUdj39.cjs');
|
|
57
|
+
require('tweetnacl');
|
|
58
|
+
require('./types-CRS-srZK.cjs');
|
|
59
|
+
require('./client-C_axwRry.cjs');
|
|
60
|
+
require('./context-B45vMtSZ.cjs');
|
|
61
|
+
require('./sessionOps-DJdExmBy.cjs');
|
|
62
|
+
require('./tools-lMDra4Pv.cjs');
|
|
63
|
+
require('./tools-CsSovyNp.cjs');
|
|
64
|
+
require('./client-DOBWJL3u.cjs');
|
|
65
|
+
require('./peerTools-CIeiy9wn.cjs');
|
|
66
|
+
require('./ids-B6ZC0HGt.cjs');
|
|
67
|
+
require('./remoteSessionClient-BNx78NLb.cjs');
|
|
45
68
|
require('@modelcontextprotocol/sdk/server/mcp.js');
|
|
46
69
|
require('node:http');
|
|
47
70
|
require('@modelcontextprotocol/sdk/server/streamableHttp.js');
|
|
48
|
-
require('
|
|
49
|
-
require('
|
|
50
|
-
require('
|
|
51
|
-
require('
|
|
52
|
-
require('
|
|
53
|
-
require('
|
|
71
|
+
require('./assistantTools-BfA0R3_m.cjs');
|
|
72
|
+
require('./terminals-B_bfC9c2.cjs');
|
|
73
|
+
require('./terminalTitleSuggest-DhvRFX3H.cjs');
|
|
74
|
+
require('./tmuxSocket-D-Xt6Vn-.cjs');
|
|
75
|
+
require('./bootstrap-CkgIq8N3.cjs');
|
|
76
|
+
require('./agentGuidance-B5NATuFa.cjs');
|
|
77
|
+
require('./trimIdent-4gvk9Wk6.cjs');
|
|
78
|
+
require('./previewPath-B0rBdhy1.cjs');
|
|
79
|
+
require('./detectCLI-DR9ZaN6B.cjs');
|
|
80
|
+
require('fs');
|
|
81
|
+
require('./localHappyAgentAuth-BXiHPXdC.cjs');
|
|
54
82
|
require('url');
|
|
83
|
+
require('node:module');
|
|
84
|
+
require('./oneShotPrompts-CL0dip9C.cjs');
|
|
55
85
|
|
|
56
86
|
function createAcpBackend(options) {
|
|
57
87
|
const backendOptions = {
|
|
@@ -555,7 +585,7 @@ function resolveRequestedLegacyModelCode(models, requested) {
|
|
|
555
585
|
}
|
|
556
586
|
return null;
|
|
557
587
|
}
|
|
558
|
-
class GenericAcpPermissionHandler extends
|
|
588
|
+
class GenericAcpPermissionHandler extends BasePermissionHandler.BasePermissionHandler {
|
|
559
589
|
logPrefix;
|
|
560
590
|
constructor(session, agentName) {
|
|
561
591
|
super(session);
|
|
@@ -573,7 +603,7 @@ class GenericAcpPermissionHandler extends index$1.BasePermissionHandler {
|
|
|
573
603
|
input
|
|
574
604
|
});
|
|
575
605
|
this.addPendingRequestToState(toolCallId, toolName, input);
|
|
576
|
-
|
|
606
|
+
logger.logger.debug(`${this.logPrefix} Permission request sent for tool: ${toolName} (${toolCallId})`);
|
|
577
607
|
});
|
|
578
608
|
}
|
|
579
609
|
}
|
|
@@ -589,33 +619,33 @@ function resolveSessionFlavor(agentName) {
|
|
|
589
619
|
async function runAcp(opts) {
|
|
590
620
|
const verbose = opts.verbose === true;
|
|
591
621
|
const sessionTag = node_crypto.randomUUID();
|
|
592
|
-
|
|
593
|
-
const api = await
|
|
622
|
+
api.connectionState.setBackend(opts.agentName);
|
|
623
|
+
const api$1 = await api.ApiClient.create(opts.credentials);
|
|
594
624
|
const settings = await persistence.readSettings();
|
|
595
625
|
if (!settings?.machineId) {
|
|
596
626
|
throw new Error("No machine ID found in settings");
|
|
597
627
|
}
|
|
598
|
-
await api.getOrCreateMachine({
|
|
628
|
+
await api$1.getOrCreateMachine({
|
|
599
629
|
machineId: settings.machineId,
|
|
600
|
-
metadata:
|
|
630
|
+
metadata: machineMetadata.getInitialMachineMetadata()
|
|
601
631
|
});
|
|
602
|
-
const { state, metadata } =
|
|
632
|
+
const { state, metadata } = createSessionMetadata.createSessionMetadata({
|
|
603
633
|
flavor: resolveSessionFlavor(opts.agentName),
|
|
604
634
|
...process.env.VH_TEAM_OPERATION_ID ? { teamOperationId: process.env.VH_TEAM_OPERATION_ID } : {},
|
|
605
635
|
machineId: settings.machineId,
|
|
606
636
|
startedBy: opts.startedBy,
|
|
607
637
|
sandbox: settings.sandboxConfig,
|
|
608
|
-
capabilities: [
|
|
638
|
+
capabilities: [index.PROMPT_QUEUE_CAPABILITY]
|
|
609
639
|
});
|
|
610
640
|
metadata.attachmentKinds = [];
|
|
611
|
-
const response = await api.getOrCreateSession({ tag: sessionTag, metadata, state });
|
|
641
|
+
const response = await api$1.getOrCreateSession({ tag: sessionTag, metadata, state });
|
|
612
642
|
if (response) {
|
|
613
643
|
logAcp("muted", `Happy Session ID: ${response.id}`);
|
|
614
644
|
}
|
|
615
645
|
let session;
|
|
616
646
|
let permissionHandler;
|
|
617
|
-
const { session: initialSession, reconnectionHandle } =
|
|
618
|
-
api,
|
|
647
|
+
const { session: initialSession, reconnectionHandle } = setupOfflineReconnection.setupOfflineReconnection({
|
|
648
|
+
api: api$1,
|
|
619
649
|
sessionTag,
|
|
620
650
|
metadata,
|
|
621
651
|
state,
|
|
@@ -631,25 +661,25 @@ async function runAcp(opts) {
|
|
|
631
661
|
session = initialSession;
|
|
632
662
|
if (response) {
|
|
633
663
|
try {
|
|
634
|
-
await
|
|
635
|
-
encryptionKey:
|
|
664
|
+
await controlClient.notifyDaemonSessionStarted(response.id, metadata, {
|
|
665
|
+
encryptionKey: authRelay.encodeBase64(response.encryptionKey),
|
|
636
666
|
encryptionVariant: response.encryptionVariant,
|
|
637
667
|
seq: response.seq,
|
|
638
668
|
metadataVersion: response.metadataVersion,
|
|
639
669
|
agentStateVersion: response.agentStateVersion
|
|
640
670
|
});
|
|
641
671
|
} catch (error) {
|
|
642
|
-
|
|
672
|
+
logger.logger.debug("[acp] Failed to report session to daemon:", error);
|
|
643
673
|
}
|
|
644
674
|
}
|
|
645
675
|
permissionHandler = new GenericAcpPermissionHandler(session, opts.agentName);
|
|
646
676
|
permissionHandler.reset("Previous CLI process exited before responding");
|
|
647
677
|
const streamingEnabled = process.env.HAPPY_SESSION_STREAM_DISABLED !== "1";
|
|
648
|
-
const streamRelay = new
|
|
678
|
+
const streamRelay$1 = new streamRelay.StreamRelay({
|
|
649
679
|
send: (frame) => session.sendStreamFrame(frame)
|
|
650
680
|
});
|
|
651
|
-
const sessionManager = new AcpSessionManager.AcpSessionManager(streamingEnabled ? { stream: streamRelay } : {});
|
|
652
|
-
const messageQueue = new
|
|
681
|
+
const sessionManager = new AcpSessionManager.AcpSessionManager(streamingEnabled ? { stream: streamRelay$1 } : {});
|
|
682
|
+
const messageQueue = new registerKillSessionHandler.MessageQueue2((mode) => deterministicJson.hashObject(mode));
|
|
653
683
|
function attachPromptQueueDrain(client) {
|
|
654
684
|
const drain = client.attachPromptQueueDrain({
|
|
655
685
|
isIdle: () => messageQueue.size() === 0 && messageQueue.isWaiting()
|
|
@@ -677,18 +707,18 @@ async function runAcp(opts) {
|
|
|
677
707
|
return true;
|
|
678
708
|
}
|
|
679
709
|
try {
|
|
680
|
-
|
|
710
|
+
sessionModeFile.writeSessionModeFile(session.sessionId, mode);
|
|
681
711
|
} catch (error) {
|
|
682
|
-
|
|
712
|
+
logger.logger.debug(`[${opts.agentName}] Failed to write session mode file:`, error);
|
|
683
713
|
return false;
|
|
684
714
|
}
|
|
685
715
|
fileBackedPermissionMode = mode;
|
|
686
716
|
session.updateMetadata((currentMetadata) => ({ ...currentMetadata, permissionMode: mode }));
|
|
687
|
-
|
|
717
|
+
logger.logger.debug(`[${opts.agentName}] Published file-backed permission mode: ${mode}`);
|
|
688
718
|
return true;
|
|
689
719
|
};
|
|
690
720
|
const isAssistantVariant = process.env.HAPPY_SESSION_VARIANT === "assistant";
|
|
691
|
-
const happyServer = await
|
|
721
|
+
const happyServer = await deterministicJson.startHappyServer(session, {
|
|
692
722
|
assistant: isAssistantVariant,
|
|
693
723
|
...opts.agentName === "pi" ? { onContextUsage: (contextUsage) => {
|
|
694
724
|
session.updateAgentState((state2) => ({ ...state2, contextUsage }));
|
|
@@ -697,7 +727,7 @@ async function runAcp(opts) {
|
|
|
697
727
|
if (opts.agentName === "pi") session.updateAgentState((state2) => ({ ...state2, contextUsage: null }));
|
|
698
728
|
const mcpServers = {
|
|
699
729
|
happy: {
|
|
700
|
-
command: path.join(
|
|
730
|
+
command: path.join(projectPath.projectPath(), "bin", "very-happy-mcp.mjs"),
|
|
701
731
|
args: ["--url", happyServer.url]
|
|
702
732
|
}
|
|
703
733
|
};
|
|
@@ -756,7 +786,7 @@ async function runAcp(opts) {
|
|
|
756
786
|
});
|
|
757
787
|
const stopRunnerFromBackendStatus = (status, detail) => {
|
|
758
788
|
const reason = detail ? `${opts.agentName} backend ${status}: ${detail}` : `${opts.agentName} backend ${status}`;
|
|
759
|
-
|
|
789
|
+
logger.logger.debug(`[${opts.agentName}] ${reason}; stopping ACP runner`);
|
|
760
790
|
shouldExit = true;
|
|
761
791
|
messageQueue.close();
|
|
762
792
|
clearPendingTurn(new Error(reason));
|
|
@@ -778,9 +808,9 @@ async function runAcp(opts) {
|
|
|
778
808
|
return;
|
|
779
809
|
}
|
|
780
810
|
if (permissionModeIsFileBacked()) {
|
|
781
|
-
const mode =
|
|
811
|
+
const mode = sessionModeFile.normalizeAcpPermissionMode(requestedMode);
|
|
782
812
|
if (!mode) {
|
|
783
|
-
|
|
813
|
+
logger.logger.debug(`[${opts.agentName}] Ignoring unknown file-backed permission mode request: ${requestedMode}`);
|
|
784
814
|
return;
|
|
785
815
|
}
|
|
786
816
|
publishFileBackedPermissionMode(mode);
|
|
@@ -789,7 +819,7 @@ async function runAcp(opts) {
|
|
|
789
819
|
if (modeSelector) {
|
|
790
820
|
const resolved = resolveRequestedCode(modeSelector.options, requestedMode);
|
|
791
821
|
if (!resolved) {
|
|
792
|
-
|
|
822
|
+
logger.logger.debug(`[${opts.agentName}] Ignoring unknown ACP permission mode request: ${requestedMode}`);
|
|
793
823
|
return;
|
|
794
824
|
}
|
|
795
825
|
if (resolved === modeSelector.currentCode) {
|
|
@@ -806,7 +836,7 @@ async function runAcp(opts) {
|
|
|
806
836
|
}
|
|
807
837
|
const resolvedLegacyMode = resolveRequestedLegacyModeCode(legacyModes, requestedMode);
|
|
808
838
|
if (!resolvedLegacyMode) {
|
|
809
|
-
|
|
839
|
+
logger.logger.debug(`[${opts.agentName}] Ignoring unknown ACP legacy mode request: ${requestedMode}`);
|
|
810
840
|
return;
|
|
811
841
|
}
|
|
812
842
|
if (resolvedLegacyMode === legacyModes.currentModeId) {
|
|
@@ -870,7 +900,7 @@ async function runAcp(opts) {
|
|
|
870
900
|
if (modelSelector) {
|
|
871
901
|
const resolved = resolveRequestedCode(modelSelector.options, requestedModel);
|
|
872
902
|
if (!resolved) {
|
|
873
|
-
|
|
903
|
+
logger.logger.debug(`[${opts.agentName}] Ignoring unknown ACP model request: ${requestedModel}`);
|
|
874
904
|
return false;
|
|
875
905
|
}
|
|
876
906
|
if (resolved === modelSelector.currentCode) {
|
|
@@ -887,7 +917,7 @@ async function runAcp(opts) {
|
|
|
887
917
|
}
|
|
888
918
|
const resolvedLegacyModel = resolveRequestedLegacyModelCode(legacyModels, requestedModel);
|
|
889
919
|
if (!resolvedLegacyModel) {
|
|
890
|
-
|
|
920
|
+
logger.logger.debug(`[${opts.agentName}] Ignoring unknown ACP legacy model request: ${requestedModel}`);
|
|
891
921
|
return false;
|
|
892
922
|
}
|
|
893
923
|
if (resolvedLegacyModel === legacyModels.currentModelId) {
|
|
@@ -907,7 +937,7 @@ async function runAcp(opts) {
|
|
|
907
937
|
if (modelSelector) return resolveRequestedCode(modelSelector.options, requested) === modelSelector.currentCode;
|
|
908
938
|
return !!legacyModels && resolveRequestedLegacyModelCode(legacyModels, requested) === legacyModels.currentModelId;
|
|
909
939
|
};
|
|
910
|
-
const editThrottle = new
|
|
940
|
+
const editThrottle = new editPaths.EditReportThrottle();
|
|
911
941
|
const onBackendMessage = (msg) => {
|
|
912
942
|
if (verbose) {
|
|
913
943
|
logAcp("muted", `Outgoing raw backend message from ${opts.agentName}: ${formatUnknownForConsole(msg, ACP_RAW_PREVIEW_CHARS)}`);
|
|
@@ -1041,15 +1071,15 @@ async function runAcp(opts) {
|
|
|
1041
1071
|
session.sendAgentUsageSnapshot(resolveSessionFlavor(opts.agentName), msg);
|
|
1042
1072
|
}
|
|
1043
1073
|
if (msg.type === "tool-call") {
|
|
1044
|
-
for (const edit of editThrottle.take(
|
|
1045
|
-
|
|
1074
|
+
for (const edit of editThrottle.take(editPaths.extractAcpEditPaths(msg.toolName, msg.args))) {
|
|
1075
|
+
controlClient.reportSessionEditToDaemon({ sessionId: session.sessionId, path: edit.path, tool: edit.tool, cwd: process.cwd() });
|
|
1046
1076
|
}
|
|
1047
1077
|
}
|
|
1048
1078
|
sendEnvelopes(sessionManager.mapMessage(msg));
|
|
1049
1079
|
};
|
|
1050
1080
|
backend.onMessage(onBackendMessage);
|
|
1051
|
-
const titleGenerator = new
|
|
1052
|
-
|
|
1081
|
+
const titleGenerator$1 = new titleGenerator.TitleGenerator(session);
|
|
1082
|
+
agentAttachments.registerAgentAttachmentDownloads(session);
|
|
1053
1083
|
let userMessageDelivery = Promise.resolve();
|
|
1054
1084
|
session.onUserMessage((message) => {
|
|
1055
1085
|
const downloads = session.drainAttachmentsForUserMessage();
|
|
@@ -1058,14 +1088,14 @@ async function runAcp(opts) {
|
|
|
1058
1088
|
if (!message.content.text && !attachments?.length) {
|
|
1059
1089
|
return;
|
|
1060
1090
|
}
|
|
1061
|
-
titleGenerator.maybeGenerate(message.content.text);
|
|
1091
|
+
titleGenerator$1.maybeGenerate(message.content.text);
|
|
1062
1092
|
if (typeof message.meta?.permissionMode === "string") {
|
|
1063
1093
|
currentPermissionMode = message.meta.permissionMode;
|
|
1064
|
-
|
|
1094
|
+
logger.logger.debug(`[${opts.agentName}] Requested ACP permission mode: ${currentPermissionMode}`);
|
|
1065
1095
|
}
|
|
1066
1096
|
if (message.meta && Object.prototype.hasOwnProperty.call(message.meta, "model")) {
|
|
1067
1097
|
currentModel = message.meta.model ?? null;
|
|
1068
|
-
|
|
1098
|
+
logger.logger.debug(`[${opts.agentName}] Requested ACP model: ${currentModel ?? "null"}`);
|
|
1069
1099
|
}
|
|
1070
1100
|
if (message.meta && Object.prototype.hasOwnProperty.call(message.meta, "effort")) {
|
|
1071
1101
|
currentEffort = message.meta.effort ?? null;
|
|
@@ -1076,7 +1106,7 @@ async function runAcp(opts) {
|
|
|
1076
1106
|
effort: currentEffort
|
|
1077
1107
|
}, attachments, message.localKey);
|
|
1078
1108
|
}).catch(() => {
|
|
1079
|
-
|
|
1109
|
+
logger.logger.warn("[ACP] Failed to prepare user attachments");
|
|
1080
1110
|
session.sendSessionEvent({ type: "message", message: "Could not prepare this message. Please send it again." });
|
|
1081
1111
|
});
|
|
1082
1112
|
});
|
|
@@ -1093,7 +1123,7 @@ async function runAcp(opts) {
|
|
|
1093
1123
|
permissionHandler.reset();
|
|
1094
1124
|
abortController.abort();
|
|
1095
1125
|
} catch (error) {
|
|
1096
|
-
|
|
1126
|
+
logger.logger.debug(`[${opts.agentName}] Abort failed:`, error);
|
|
1097
1127
|
} finally {
|
|
1098
1128
|
abortController = new AbortController();
|
|
1099
1129
|
}
|
|
@@ -1105,7 +1135,7 @@ async function runAcp(opts) {
|
|
|
1105
1135
|
if (!fileBackedModeActive) {
|
|
1106
1136
|
throw new Error(`${opts.agentName} does not support live permission mode changes`);
|
|
1107
1137
|
}
|
|
1108
|
-
const mode = typeof request?.mode === "string" ?
|
|
1138
|
+
const mode = typeof request?.mode === "string" ? sessionModeFile.normalizeAcpPermissionMode(request.mode) : null;
|
|
1109
1139
|
if (!mode) {
|
|
1110
1140
|
throw new Error("Invalid permission mode");
|
|
1111
1141
|
}
|
|
@@ -1115,7 +1145,7 @@ async function runAcp(opts) {
|
|
|
1115
1145
|
return { mode };
|
|
1116
1146
|
}
|
|
1117
1147
|
);
|
|
1118
|
-
const disposeTermination =
|
|
1148
|
+
const disposeTermination = registerKillSessionHandler.registerKillSessionHandler(session.rpcHandlerManager, async () => {
|
|
1119
1149
|
shouldExit = true;
|
|
1120
1150
|
messageQueue.close();
|
|
1121
1151
|
clearPendingTurn(new Error("Session terminated"));
|
|
@@ -1131,7 +1161,7 @@ async function runAcp(opts) {
|
|
|
1131
1161
|
}
|
|
1132
1162
|
session.updateMetadata((current) => ({
|
|
1133
1163
|
...current,
|
|
1134
|
-
attachmentKinds: opts.agentName === "pi" && backend.supportsImageAttachments ? [...
|
|
1164
|
+
attachmentKinds: opts.agentName === "pi" && backend.supportsImageAttachments ? [...attachmentContent.CLAUDE_ATTACHMENT_KINDS] : []
|
|
1135
1165
|
}));
|
|
1136
1166
|
if (permissionModeIsFileBacked()) {
|
|
1137
1167
|
fileBackedModeActive = true;
|
|
@@ -1181,17 +1211,17 @@ async function runAcp(opts) {
|
|
|
1181
1211
|
}
|
|
1182
1212
|
const prompt = todoDiscoverySent ? batch.message : `${batch.message}
|
|
1183
1213
|
|
|
1184
|
-
${
|
|
1214
|
+
${index.BUILTIN_TODO_DISCOVERY}`;
|
|
1185
1215
|
const attachments = batch.attachments ?? [];
|
|
1186
|
-
const staged = attachments.length ? await
|
|
1187
|
-
happyHomeDir:
|
|
1216
|
+
const staged = attachments.length ? await attachmentContent.stageClaudeAttachments(attachments, {
|
|
1217
|
+
happyHomeDir: configuration.configuration.happyHomeDir,
|
|
1188
1218
|
sessionId: session.sessionId
|
|
1189
1219
|
}) : [];
|
|
1190
|
-
await backend.sendPrompt(acpSessionId,
|
|
1220
|
+
await backend.sendPrompt(acpSessionId, attachmentContent.appendStagedAttachmentsToPrompt(prompt, staged), attachments);
|
|
1191
1221
|
todoDiscoverySent = true;
|
|
1192
1222
|
await turnEnded;
|
|
1193
1223
|
sendEnvelopes(sessionManager.endTurn(turnCancelled ? "cancelled" : "completed"));
|
|
1194
|
-
streamRelay.endTurn();
|
|
1224
|
+
streamRelay$1.endTurn();
|
|
1195
1225
|
setThinking(false);
|
|
1196
1226
|
session.sendSessionEvent({ type: "ready" });
|
|
1197
1227
|
if (verbose) {
|
|
@@ -1200,7 +1230,7 @@ ${persistence.BUILTIN_TODO_DISCOVERY}`;
|
|
|
1200
1230
|
} catch (error) {
|
|
1201
1231
|
session.sendSessionEvent({ type: "message", message: "The agent could not process this message or its attachments. Please check the agent and try again." });
|
|
1202
1232
|
sendEnvelopes(sessionManager.endTurn("failed"));
|
|
1203
|
-
streamRelay.endTurn();
|
|
1233
|
+
streamRelay$1.endTurn();
|
|
1204
1234
|
setThinking(false);
|
|
1205
1235
|
session.sendSessionEvent({ type: "ready" });
|
|
1206
1236
|
logAcp("error", `Prompt error from ${opts.agentName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
@@ -1212,28 +1242,28 @@ ${persistence.BUILTIN_TODO_DISCOVERY}`;
|
|
|
1212
1242
|
disposeTermination?.();
|
|
1213
1243
|
setThinking(false);
|
|
1214
1244
|
clearInterval(keepAliveInterval);
|
|
1215
|
-
streamRelay.endTurn();
|
|
1216
|
-
streamRelay.dispose();
|
|
1245
|
+
streamRelay$1.endTurn();
|
|
1246
|
+
streamRelay$1.dispose();
|
|
1217
1247
|
reconnectionHandle?.cancel();
|
|
1218
1248
|
clearPendingTurn(new Error("ACP runner shutting down"));
|
|
1219
1249
|
try {
|
|
1220
1250
|
permissionHandler.reset();
|
|
1221
1251
|
} catch (error) {
|
|
1222
|
-
|
|
1252
|
+
logger.logger.debug(`[${opts.agentName}] Failed to reset permission handler:`, error);
|
|
1223
1253
|
}
|
|
1224
1254
|
backend.offMessage?.(onBackendMessage);
|
|
1225
1255
|
await backend.dispose();
|
|
1226
1256
|
if (fileBackedPermissionMode) {
|
|
1227
1257
|
try {
|
|
1228
|
-
|
|
1258
|
+
sessionModeFile.removeSessionModeFile(session.sessionId);
|
|
1229
1259
|
} catch (error) {
|
|
1230
|
-
|
|
1260
|
+
logger.logger.debug(`[${opts.agentName}] Failed to remove session mode file:`, error);
|
|
1231
1261
|
}
|
|
1232
1262
|
}
|
|
1233
1263
|
try {
|
|
1234
1264
|
happyServer.stop();
|
|
1235
1265
|
} catch (error) {
|
|
1236
|
-
|
|
1266
|
+
logger.logger.debug(`[${opts.agentName}] Failed to stop Happy MCP server:`, error);
|
|
1237
1267
|
}
|
|
1238
1268
|
try {
|
|
1239
1269
|
session.closePromptQueueDrain();
|
|
@@ -1248,7 +1278,7 @@ ${persistence.BUILTIN_TODO_DISCOVERY}`;
|
|
|
1248
1278
|
await session.flush();
|
|
1249
1279
|
await session.close();
|
|
1250
1280
|
} catch (error) {
|
|
1251
|
-
|
|
1281
|
+
logger.logger.debug(`[${opts.agentName}] Session close failed:`, error);
|
|
1252
1282
|
}
|
|
1253
1283
|
}
|
|
1254
1284
|
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var node_fs = require('node:fs');
|
|
4
|
+
var os = require('node:os');
|
|
5
|
+
var logger = require('./logger-Bc8-u1w0.cjs');
|
|
6
|
+
var persistence = require('./persistence-CBNMzSa8.cjs');
|
|
7
|
+
var loginShellEnv = require('./loginShellEnv-BkuYtExZ.cjs');
|
|
8
|
+
require('chalk');
|
|
9
|
+
require('node:util');
|
|
10
|
+
require('./configuration-v9f8LM9T.cjs');
|
|
11
|
+
require('node:path');
|
|
12
|
+
require('./package-Cl5BEP5x.cjs');
|
|
13
|
+
require('node:fs/promises');
|
|
14
|
+
require('zod');
|
|
15
|
+
require('./authRelay-BdYkC1Po.cjs');
|
|
16
|
+
require('node:crypto');
|
|
17
|
+
require('tweetnacl');
|
|
18
|
+
require('node:child_process');
|
|
19
|
+
|
|
20
|
+
const AGENT_HOME_CACHE_MS = 6e4;
|
|
21
|
+
const AGENT_HOME_FAILURE_CACHE_MS = 5 * 6e4;
|
|
22
|
+
const AGENT_HOME_MAX_STALE_MS = 10 * 6e4;
|
|
23
|
+
function decideShellProbe(entry, now, allowStale) {
|
|
24
|
+
if (!entry) return "await-probe";
|
|
25
|
+
const age = now - entry.probedAt;
|
|
26
|
+
if (age < entry.ttlMs) return "use-cached";
|
|
27
|
+
if (allowStale && age < AGENT_HOME_MAX_STALE_MS) return "use-stale-and-revalidate";
|
|
28
|
+
return "await-probe";
|
|
29
|
+
}
|
|
30
|
+
let shellProbe = null;
|
|
31
|
+
let shellProbeInFlight = null;
|
|
32
|
+
let last = null;
|
|
33
|
+
let originalDaemonEnv = null;
|
|
34
|
+
function snapshotDaemonEnv() {
|
|
35
|
+
if (!originalDaemonEnv) {
|
|
36
|
+
originalDaemonEnv = {};
|
|
37
|
+
for (const name of loginShellEnv.AGENT_HOME_ENV_NAMES) originalDaemonEnv[name] = process.env[name];
|
|
38
|
+
}
|
|
39
|
+
return originalDaemonEnv;
|
|
40
|
+
}
|
|
41
|
+
function probeShell(now) {
|
|
42
|
+
if (!shellProbeInFlight) {
|
|
43
|
+
const run = loginShellEnv.probeLoginShellEnv(loginShellEnv.AGENT_HOME_ENV_NAMES).then((env) => {
|
|
44
|
+
const entry = { env, probedAt: now, ttlMs: env ? AGENT_HOME_CACHE_MS : AGENT_HOME_FAILURE_CACHE_MS };
|
|
45
|
+
shellProbe = entry;
|
|
46
|
+
return entry;
|
|
47
|
+
});
|
|
48
|
+
shellProbeInFlight = run;
|
|
49
|
+
void run.finally(() => {
|
|
50
|
+
if (shellProbeInFlight === run) shellProbeInFlight = null;
|
|
51
|
+
}).catch(() => {
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return shellProbeInFlight;
|
|
55
|
+
}
|
|
56
|
+
async function loginShellEnvFor(now, allowStale) {
|
|
57
|
+
const decision = decideShellProbe(shellProbe, now, allowStale);
|
|
58
|
+
if (decision === "await-probe") return (await probeShell(now)).env;
|
|
59
|
+
if (decision === "use-stale-and-revalidate") {
|
|
60
|
+
probeShell(now).catch((error) => logger.logger.debug("[AGENT HOME] background login-shell probe failed", error));
|
|
61
|
+
}
|
|
62
|
+
return shellProbe.env;
|
|
63
|
+
}
|
|
64
|
+
async function refreshAgentHomes(now = Date.now(), opts = {}) {
|
|
65
|
+
let input;
|
|
66
|
+
let homes;
|
|
67
|
+
try {
|
|
68
|
+
const loginShellEnv$1 = await loginShellEnvFor(now, opts.allowStale === true);
|
|
69
|
+
const settings = await persistence.readSettings();
|
|
70
|
+
input = {
|
|
71
|
+
settings: { claudeConfigDir: settings.claudeConfigDir, codexHome: settings.codexHome },
|
|
72
|
+
daemonEnv: snapshotDaemonEnv(),
|
|
73
|
+
loginShellEnv: loginShellEnv$1,
|
|
74
|
+
homeDir: os.homedir()
|
|
75
|
+
};
|
|
76
|
+
homes = loginShellEnv.resolveAgentHomes(input);
|
|
77
|
+
} catch (error) {
|
|
78
|
+
logger.logger.debug("[AGENT HOME] resolve failed, falling back", error);
|
|
79
|
+
if (last) return last.homes;
|
|
80
|
+
return loginShellEnv.resolveAgentHomes({ settings: {}, daemonEnv: snapshotDaemonEnv(), loginShellEnv: null, homeDir: os.homedir() });
|
|
81
|
+
}
|
|
82
|
+
const previous = last?.homes;
|
|
83
|
+
last = { input, homes };
|
|
84
|
+
applyAgentHomesToProcessEnv(homes);
|
|
85
|
+
if (!previous || previous.claudeConfigDir.path !== homes.claudeConfigDir.path || previous.codexHome.path !== homes.codexHome.path) {
|
|
86
|
+
logger.logger.debug(`[AGENT HOME] Claude config dir: ${loginShellEnv.describeAgentHome(homes.claudeConfigDir)}; Codex home: ${loginShellEnv.describeAgentHome(homes.codexHome)}`);
|
|
87
|
+
}
|
|
88
|
+
return homes;
|
|
89
|
+
}
|
|
90
|
+
function currentAgentHomes() {
|
|
91
|
+
return last?.homes ?? null;
|
|
92
|
+
}
|
|
93
|
+
function resetAgentHomesCache() {
|
|
94
|
+
shellProbe = null;
|
|
95
|
+
shellProbeInFlight = null;
|
|
96
|
+
last = null;
|
|
97
|
+
originalDaemonEnv = null;
|
|
98
|
+
}
|
|
99
|
+
function applyAgentHomesToProcessEnv(homes) {
|
|
100
|
+
const overlay = loginShellEnv.agentHomeEnv(homes);
|
|
101
|
+
for (const name of loginShellEnv.AGENT_HOME_ENV_NAMES) {
|
|
102
|
+
const next = overlay[name];
|
|
103
|
+
if (next === void 0) {
|
|
104
|
+
const original = snapshotDaemonEnv()[name];
|
|
105
|
+
if (original === void 0) delete process.env[name];
|
|
106
|
+
else process.env[name] = original;
|
|
107
|
+
} else if (process.env[name] !== next) {
|
|
108
|
+
process.env[name] = next;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function listDirSafe(path) {
|
|
113
|
+
try {
|
|
114
|
+
return node_fs.readdirSync(path);
|
|
115
|
+
} catch {
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function fileSizeSafe(path) {
|
|
120
|
+
try {
|
|
121
|
+
const st = node_fs.statSync(path);
|
|
122
|
+
return st.isFile() ? st.size : null;
|
|
123
|
+
} catch {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function locateClaudeConversation(workingDirectory, claudeSessionId) {
|
|
128
|
+
const entry = last;
|
|
129
|
+
if (!entry) {
|
|
130
|
+
const input = { settings: {}, daemonEnv: process.env, loginShellEnv: null, homeDir: os.homedir() };
|
|
131
|
+
return loginShellEnv.findClaudeConversation(claudeSessionId, workingDirectory, loginShellEnv.agentHomeCandidates("claude", input), fileSizeSafe);
|
|
132
|
+
}
|
|
133
|
+
return loginShellEnv.findClaudeConversation(claudeSessionId, workingDirectory, loginShellEnv.agentHomeCandidates("claude", entry.input, entry.homes), fileSizeSafe);
|
|
134
|
+
}
|
|
135
|
+
function locateCodexThread(codexThreadId) {
|
|
136
|
+
const entry = last;
|
|
137
|
+
const input = entry?.input ?? { settings: {}, daemonEnv: process.env, loginShellEnv: null, homeDir: os.homedir() };
|
|
138
|
+
return loginShellEnv.findCodexThread(codexThreadId, loginShellEnv.agentHomeCandidates("codex", input, entry?.homes), listDirSafe);
|
|
139
|
+
}
|
|
140
|
+
function agentHomeSpawnEnv(input) {
|
|
141
|
+
const env = {};
|
|
142
|
+
if (input.claudeSessionId) {
|
|
143
|
+
const hit = locateClaudeConversation(input.workingDirectory, input.claudeSessionId);
|
|
144
|
+
if (hit && !hit.resolved) {
|
|
145
|
+
env[loginShellEnv.CLAUDE_CONFIG_DIR_ENV] = hit.home;
|
|
146
|
+
logger.logger.debug(`[AGENT HOME] Claude conversation ${input.claudeSessionId} found under ${hit.home}; overriding ${loginShellEnv.CLAUDE_CONFIG_DIR_ENV} for this spawn`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (input.codexThreadId) {
|
|
150
|
+
const hit = locateCodexThread(input.codexThreadId);
|
|
151
|
+
if (hit && !hit.resolved) {
|
|
152
|
+
env[loginShellEnv.CODEX_HOME_ENV] = hit.home;
|
|
153
|
+
logger.logger.debug(`[AGENT HOME] Codex thread ${input.codexThreadId} found under ${hit.home}; overriding ${loginShellEnv.CODEX_HOME_ENV} for this spawn`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return env;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
exports.AGENT_HOME_ENV_NAMES = loginShellEnv.AGENT_HOME_ENV_NAMES;
|
|
160
|
+
exports.CLAUDE_CONFIG_DIR_ENV = loginShellEnv.CLAUDE_CONFIG_DIR_ENV;
|
|
161
|
+
exports.CODEX_HOME_ENV = loginShellEnv.CODEX_HOME_ENV;
|
|
162
|
+
exports.agentHomeCandidates = loginShellEnv.agentHomeCandidates;
|
|
163
|
+
exports.agentHomeEnv = loginShellEnv.agentHomeEnv;
|
|
164
|
+
exports.claudeConversationPath = loginShellEnv.claudeConversationPath;
|
|
165
|
+
exports.claudeProjectDirName = loginShellEnv.claudeProjectDirName;
|
|
166
|
+
exports.codexRolloutFileMatches = loginShellEnv.codexRolloutFileMatches;
|
|
167
|
+
exports.describeAgentHome = loginShellEnv.describeAgentHome;
|
|
168
|
+
exports.expandHomePath = loginShellEnv.expandHomePath;
|
|
169
|
+
exports.findClaudeConversation = loginShellEnv.findClaudeConversation;
|
|
170
|
+
exports.findCodexThread = loginShellEnv.findCodexThread;
|
|
171
|
+
exports.probeLoginShellEnv = loginShellEnv.probeLoginShellEnv;
|
|
172
|
+
exports.resolveAgentHomes = loginShellEnv.resolveAgentHomes;
|
|
173
|
+
exports.AGENT_HOME_CACHE_MS = AGENT_HOME_CACHE_MS;
|
|
174
|
+
exports.AGENT_HOME_FAILURE_CACHE_MS = AGENT_HOME_FAILURE_CACHE_MS;
|
|
175
|
+
exports.AGENT_HOME_MAX_STALE_MS = AGENT_HOME_MAX_STALE_MS;
|
|
176
|
+
exports.agentHomeSpawnEnv = agentHomeSpawnEnv;
|
|
177
|
+
exports.currentAgentHomes = currentAgentHomes;
|
|
178
|
+
exports.decideShellProbe = decideShellProbe;
|
|
179
|
+
exports.locateClaudeConversation = locateClaudeConversation;
|
|
180
|
+
exports.locateCodexThread = locateCodexThread;
|
|
181
|
+
exports.refreshAgentHomes = refreshAgentHomes;
|
|
182
|
+
exports.resetAgentHomesCache = resetAgentHomesCache;
|