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
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var path = require('node:path');
|
|
4
|
+
var node_child_process = require('node:child_process');
|
|
5
|
+
|
|
6
|
+
const CLAUDE_CONFIG_DIR_ENV = "CLAUDE_CONFIG_DIR";
|
|
7
|
+
const CODEX_HOME_ENV = "CODEX_HOME";
|
|
8
|
+
const AGENT_HOME_ENV_NAMES = [CLAUDE_CONFIG_DIR_ENV, CODEX_HOME_ENV];
|
|
9
|
+
function expandHomePath(value, homeDir) {
|
|
10
|
+
const trimmed = value.trim();
|
|
11
|
+
if (trimmed === "~") return homeDir;
|
|
12
|
+
if (trimmed.startsWith("~/")) return path.join(homeDir, trimmed.slice(2));
|
|
13
|
+
return path.isAbsolute(trimmed) ? trimmed : path.resolve(homeDir, trimmed);
|
|
14
|
+
}
|
|
15
|
+
function nonEmpty(value) {
|
|
16
|
+
const trimmed = value?.trim();
|
|
17
|
+
return trimmed ? trimmed : null;
|
|
18
|
+
}
|
|
19
|
+
function pick(envName, settingValue, input, defaultRelative) {
|
|
20
|
+
const fromSettings = nonEmpty(settingValue);
|
|
21
|
+
if (fromSettings) return { path: expandHomePath(fromSettings, input.homeDir), source: "settings" };
|
|
22
|
+
const fromShell = nonEmpty(input.loginShellEnv?.[envName]);
|
|
23
|
+
if (fromShell) return { path: expandHomePath(fromShell, input.homeDir), source: "login-shell" };
|
|
24
|
+
const fromDaemon = nonEmpty(input.daemonEnv[envName]);
|
|
25
|
+
if (fromDaemon) return { path: expandHomePath(fromDaemon, input.homeDir), source: "daemon-env" };
|
|
26
|
+
return { path: path.join(input.homeDir, defaultRelative), source: "default" };
|
|
27
|
+
}
|
|
28
|
+
function resolveAgentHomes(input) {
|
|
29
|
+
return {
|
|
30
|
+
claudeConfigDir: pick(CLAUDE_CONFIG_DIR_ENV, input.settings.claudeConfigDir, input, ".claude"),
|
|
31
|
+
codexHome: pick(CODEX_HOME_ENV, input.settings.codexHome, input, ".codex")
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function agentHomeEnv(homes) {
|
|
35
|
+
const env = {};
|
|
36
|
+
if (homes.claudeConfigDir.source !== "default") env[CLAUDE_CONFIG_DIR_ENV] = homes.claudeConfigDir.path;
|
|
37
|
+
if (homes.codexHome.source !== "default") env[CODEX_HOME_ENV] = homes.codexHome.path;
|
|
38
|
+
return env;
|
|
39
|
+
}
|
|
40
|
+
function claudeProjectDirName(workingDirectory) {
|
|
41
|
+
return path.resolve(workingDirectory).replace(/[^a-zA-Z0-9-]/g, "-");
|
|
42
|
+
}
|
|
43
|
+
function claudeConversationPath(configDir, workingDirectory, claudeSessionId) {
|
|
44
|
+
return path.join(configDir, "projects", claudeProjectDirName(workingDirectory), `${claudeSessionId}.jsonl`);
|
|
45
|
+
}
|
|
46
|
+
function agentHomeCandidates(kind, input, homes = resolveAgentHomes(input)) {
|
|
47
|
+
const envName = kind === "claude" ? CLAUDE_CONFIG_DIR_ENV : CODEX_HOME_ENV;
|
|
48
|
+
const resolved = kind === "claude" ? homes.claudeConfigDir : homes.codexHome;
|
|
49
|
+
const raw = [
|
|
50
|
+
resolved.path,
|
|
51
|
+
nonEmpty(kind === "claude" ? input.settings.claudeConfigDir : input.settings.codexHome),
|
|
52
|
+
nonEmpty(input.loginShellEnv?.[envName]),
|
|
53
|
+
nonEmpty(input.daemonEnv[envName]),
|
|
54
|
+
path.join(input.homeDir, kind === "claude" ? ".claude" : ".codex")
|
|
55
|
+
];
|
|
56
|
+
const out = [];
|
|
57
|
+
for (const value of raw) {
|
|
58
|
+
if (!value) continue;
|
|
59
|
+
const expanded = expandHomePath(value, input.homeDir);
|
|
60
|
+
if (!out.includes(expanded)) out.push(expanded);
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
function findClaudeConversation(claudeSessionId, workingDirectory, candidates, fileSize) {
|
|
65
|
+
let best = null;
|
|
66
|
+
let bestSize = -1;
|
|
67
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
68
|
+
const file = claudeConversationPath(candidates[i], workingDirectory, claudeSessionId);
|
|
69
|
+
const size = fileSize(file);
|
|
70
|
+
if (size === null || size <= bestSize) continue;
|
|
71
|
+
best = { home: candidates[i], file, resolved: i === 0 };
|
|
72
|
+
bestSize = size;
|
|
73
|
+
}
|
|
74
|
+
return best;
|
|
75
|
+
}
|
|
76
|
+
function codexRolloutFileMatches(fileName, threadId) {
|
|
77
|
+
return fileName.startsWith("rollout-") && fileName.endsWith(`-${threadId}.jsonl`);
|
|
78
|
+
}
|
|
79
|
+
function findCodexThread(threadId, candidates, listDir) {
|
|
80
|
+
const digits = /^\d+$/;
|
|
81
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
82
|
+
const sessions = path.join(candidates[i], "sessions");
|
|
83
|
+
for (const year of listDir(sessions).filter((name) => digits.test(name)).sort().reverse()) {
|
|
84
|
+
for (const month of listDir(path.join(sessions, year)).filter((name) => digits.test(name)).sort().reverse()) {
|
|
85
|
+
for (const day of listDir(path.join(sessions, year, month)).filter((name) => digits.test(name)).sort().reverse()) {
|
|
86
|
+
const dayDir = path.join(sessions, year, month, day);
|
|
87
|
+
const hit = listDir(dayDir).find((name) => codexRolloutFileMatches(name, threadId));
|
|
88
|
+
if (hit) return { home: candidates[i], file: path.join(dayDir, hit), resolved: i === 0 };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
function describeAgentHome(choice) {
|
|
96
|
+
const source = {
|
|
97
|
+
settings: "settings.json",
|
|
98
|
+
"login-shell": "login shell",
|
|
99
|
+
"daemon-env": "daemon environment",
|
|
100
|
+
default: "default"
|
|
101
|
+
};
|
|
102
|
+
return `${choice.path} (${source[choice.source]})`;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const LOGIN_SHELL_ENV_MARKER = "__VH_ENV__";
|
|
106
|
+
const LOGIN_SHELL_PROBE_TIMEOUT_MS = 3e3;
|
|
107
|
+
function loginShellProbeScript(names) {
|
|
108
|
+
const pairs = names.map((name) => `${name} "$${name}"`).join(" ");
|
|
109
|
+
return `printf '${LOGIN_SHELL_ENV_MARKER}%s=%s\\n' ${pairs}`;
|
|
110
|
+
}
|
|
111
|
+
function parseLoginShellEnv(output, names) {
|
|
112
|
+
const wanted = new Set(names);
|
|
113
|
+
const env = {};
|
|
114
|
+
for (const rawLine of output.split(/\r?\n/)) {
|
|
115
|
+
const at = rawLine.indexOf(LOGIN_SHELL_ENV_MARKER);
|
|
116
|
+
if (at < 0) continue;
|
|
117
|
+
const line = rawLine.slice(at + LOGIN_SHELL_ENV_MARKER.length);
|
|
118
|
+
const eq = line.indexOf("=");
|
|
119
|
+
if (eq <= 0) continue;
|
|
120
|
+
const name = line.slice(0, eq);
|
|
121
|
+
if (!wanted.has(name)) continue;
|
|
122
|
+
const value = line.slice(eq + 1).trim();
|
|
123
|
+
env[name] = value ? value : void 0;
|
|
124
|
+
}
|
|
125
|
+
return env;
|
|
126
|
+
}
|
|
127
|
+
function probeLoginShellEnv(names, options = {}) {
|
|
128
|
+
const platform = options.platform ?? process.platform;
|
|
129
|
+
if (platform === "win32") return Promise.resolve(null);
|
|
130
|
+
const shell = (options.shell ?? process.env.SHELL ?? "").trim() || "/bin/sh";
|
|
131
|
+
const timeoutMs = options.timeoutMs ?? LOGIN_SHELL_PROBE_TIMEOUT_MS;
|
|
132
|
+
return new Promise((resolve) => {
|
|
133
|
+
let stdout = "";
|
|
134
|
+
let settled = false;
|
|
135
|
+
const finish = (value) => {
|
|
136
|
+
if (settled) return;
|
|
137
|
+
settled = true;
|
|
138
|
+
clearTimeout(timer);
|
|
139
|
+
resolve(value);
|
|
140
|
+
};
|
|
141
|
+
let child;
|
|
142
|
+
try {
|
|
143
|
+
child = node_child_process.spawn(shell, ["-l", "-i", "-c", loginShellProbeScript(names)], {
|
|
144
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
145
|
+
env: options.env ?? process.env,
|
|
146
|
+
windowsHide: true
|
|
147
|
+
});
|
|
148
|
+
} catch {
|
|
149
|
+
resolve(null);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const timer = setTimeout(() => {
|
|
153
|
+
try {
|
|
154
|
+
child.kill("SIGKILL");
|
|
155
|
+
} catch {
|
|
156
|
+
}
|
|
157
|
+
finish(null);
|
|
158
|
+
}, timeoutMs);
|
|
159
|
+
child.stdout?.on("data", (chunk) => {
|
|
160
|
+
stdout += chunk.toString("utf8");
|
|
161
|
+
});
|
|
162
|
+
child.on("error", () => finish(null));
|
|
163
|
+
child.on("close", () => {
|
|
164
|
+
finish(stdout.includes(LOGIN_SHELL_ENV_MARKER) ? parseLoginShellEnv(stdout, names) : null);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
exports.AGENT_HOME_ENV_NAMES = AGENT_HOME_ENV_NAMES;
|
|
170
|
+
exports.CLAUDE_CONFIG_DIR_ENV = CLAUDE_CONFIG_DIR_ENV;
|
|
171
|
+
exports.CODEX_HOME_ENV = CODEX_HOME_ENV;
|
|
172
|
+
exports.agentHomeCandidates = agentHomeCandidates;
|
|
173
|
+
exports.agentHomeEnv = agentHomeEnv;
|
|
174
|
+
exports.claudeConversationPath = claudeConversationPath;
|
|
175
|
+
exports.claudeProjectDirName = claudeProjectDirName;
|
|
176
|
+
exports.codexRolloutFileMatches = codexRolloutFileMatches;
|
|
177
|
+
exports.describeAgentHome = describeAgentHome;
|
|
178
|
+
exports.expandHomePath = expandHomePath;
|
|
179
|
+
exports.findClaudeConversation = findClaudeConversation;
|
|
180
|
+
exports.findCodexThread = findCodexThread;
|
|
181
|
+
exports.probeLoginShellEnv = probeLoginShellEnv;
|
|
182
|
+
exports.resolveAgentHomes = resolveAgentHomes;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { join, resolve, isAbsolute } from 'node:path';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
|
|
4
|
+
const CLAUDE_CONFIG_DIR_ENV = "CLAUDE_CONFIG_DIR";
|
|
5
|
+
const CODEX_HOME_ENV = "CODEX_HOME";
|
|
6
|
+
const AGENT_HOME_ENV_NAMES = [CLAUDE_CONFIG_DIR_ENV, CODEX_HOME_ENV];
|
|
7
|
+
function expandHomePath(value, homeDir) {
|
|
8
|
+
const trimmed = value.trim();
|
|
9
|
+
if (trimmed === "~") return homeDir;
|
|
10
|
+
if (trimmed.startsWith("~/")) return join(homeDir, trimmed.slice(2));
|
|
11
|
+
return isAbsolute(trimmed) ? trimmed : resolve(homeDir, trimmed);
|
|
12
|
+
}
|
|
13
|
+
function nonEmpty(value) {
|
|
14
|
+
const trimmed = value?.trim();
|
|
15
|
+
return trimmed ? trimmed : null;
|
|
16
|
+
}
|
|
17
|
+
function pick(envName, settingValue, input, defaultRelative) {
|
|
18
|
+
const fromSettings = nonEmpty(settingValue);
|
|
19
|
+
if (fromSettings) return { path: expandHomePath(fromSettings, input.homeDir), source: "settings" };
|
|
20
|
+
const fromShell = nonEmpty(input.loginShellEnv?.[envName]);
|
|
21
|
+
if (fromShell) return { path: expandHomePath(fromShell, input.homeDir), source: "login-shell" };
|
|
22
|
+
const fromDaemon = nonEmpty(input.daemonEnv[envName]);
|
|
23
|
+
if (fromDaemon) return { path: expandHomePath(fromDaemon, input.homeDir), source: "daemon-env" };
|
|
24
|
+
return { path: join(input.homeDir, defaultRelative), source: "default" };
|
|
25
|
+
}
|
|
26
|
+
function resolveAgentHomes(input) {
|
|
27
|
+
return {
|
|
28
|
+
claudeConfigDir: pick(CLAUDE_CONFIG_DIR_ENV, input.settings.claudeConfigDir, input, ".claude"),
|
|
29
|
+
codexHome: pick(CODEX_HOME_ENV, input.settings.codexHome, input, ".codex")
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function agentHomeEnv(homes) {
|
|
33
|
+
const env = {};
|
|
34
|
+
if (homes.claudeConfigDir.source !== "default") env[CLAUDE_CONFIG_DIR_ENV] = homes.claudeConfigDir.path;
|
|
35
|
+
if (homes.codexHome.source !== "default") env[CODEX_HOME_ENV] = homes.codexHome.path;
|
|
36
|
+
return env;
|
|
37
|
+
}
|
|
38
|
+
function claudeProjectDirName(workingDirectory) {
|
|
39
|
+
return resolve(workingDirectory).replace(/[^a-zA-Z0-9-]/g, "-");
|
|
40
|
+
}
|
|
41
|
+
function claudeConversationPath(configDir, workingDirectory, claudeSessionId) {
|
|
42
|
+
return join(configDir, "projects", claudeProjectDirName(workingDirectory), `${claudeSessionId}.jsonl`);
|
|
43
|
+
}
|
|
44
|
+
function agentHomeCandidates(kind, input, homes = resolveAgentHomes(input)) {
|
|
45
|
+
const envName = kind === "claude" ? CLAUDE_CONFIG_DIR_ENV : CODEX_HOME_ENV;
|
|
46
|
+
const resolved = kind === "claude" ? homes.claudeConfigDir : homes.codexHome;
|
|
47
|
+
const raw = [
|
|
48
|
+
resolved.path,
|
|
49
|
+
nonEmpty(kind === "claude" ? input.settings.claudeConfigDir : input.settings.codexHome),
|
|
50
|
+
nonEmpty(input.loginShellEnv?.[envName]),
|
|
51
|
+
nonEmpty(input.daemonEnv[envName]),
|
|
52
|
+
join(input.homeDir, kind === "claude" ? ".claude" : ".codex")
|
|
53
|
+
];
|
|
54
|
+
const out = [];
|
|
55
|
+
for (const value of raw) {
|
|
56
|
+
if (!value) continue;
|
|
57
|
+
const expanded = expandHomePath(value, input.homeDir);
|
|
58
|
+
if (!out.includes(expanded)) out.push(expanded);
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
function findClaudeConversation(claudeSessionId, workingDirectory, candidates, fileSize) {
|
|
63
|
+
let best = null;
|
|
64
|
+
let bestSize = -1;
|
|
65
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
66
|
+
const file = claudeConversationPath(candidates[i], workingDirectory, claudeSessionId);
|
|
67
|
+
const size = fileSize(file);
|
|
68
|
+
if (size === null || size <= bestSize) continue;
|
|
69
|
+
best = { home: candidates[i], file, resolved: i === 0 };
|
|
70
|
+
bestSize = size;
|
|
71
|
+
}
|
|
72
|
+
return best;
|
|
73
|
+
}
|
|
74
|
+
function codexRolloutFileMatches(fileName, threadId) {
|
|
75
|
+
return fileName.startsWith("rollout-") && fileName.endsWith(`-${threadId}.jsonl`);
|
|
76
|
+
}
|
|
77
|
+
function findCodexThread(threadId, candidates, listDir) {
|
|
78
|
+
const digits = /^\d+$/;
|
|
79
|
+
for (let i = 0; i < candidates.length; i++) {
|
|
80
|
+
const sessions = join(candidates[i], "sessions");
|
|
81
|
+
for (const year of listDir(sessions).filter((name) => digits.test(name)).sort().reverse()) {
|
|
82
|
+
for (const month of listDir(join(sessions, year)).filter((name) => digits.test(name)).sort().reverse()) {
|
|
83
|
+
for (const day of listDir(join(sessions, year, month)).filter((name) => digits.test(name)).sort().reverse()) {
|
|
84
|
+
const dayDir = join(sessions, year, month, day);
|
|
85
|
+
const hit = listDir(dayDir).find((name) => codexRolloutFileMatches(name, threadId));
|
|
86
|
+
if (hit) return { home: candidates[i], file: join(dayDir, hit), resolved: i === 0 };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
function describeAgentHome(choice) {
|
|
94
|
+
const source = {
|
|
95
|
+
settings: "settings.json",
|
|
96
|
+
"login-shell": "login shell",
|
|
97
|
+
"daemon-env": "daemon environment",
|
|
98
|
+
default: "default"
|
|
99
|
+
};
|
|
100
|
+
return `${choice.path} (${source[choice.source]})`;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const LOGIN_SHELL_ENV_MARKER = "__VH_ENV__";
|
|
104
|
+
const LOGIN_SHELL_PROBE_TIMEOUT_MS = 3e3;
|
|
105
|
+
function loginShellProbeScript(names) {
|
|
106
|
+
const pairs = names.map((name) => `${name} "$${name}"`).join(" ");
|
|
107
|
+
return `printf '${LOGIN_SHELL_ENV_MARKER}%s=%s\\n' ${pairs}`;
|
|
108
|
+
}
|
|
109
|
+
function parseLoginShellEnv(output, names) {
|
|
110
|
+
const wanted = new Set(names);
|
|
111
|
+
const env = {};
|
|
112
|
+
for (const rawLine of output.split(/\r?\n/)) {
|
|
113
|
+
const at = rawLine.indexOf(LOGIN_SHELL_ENV_MARKER);
|
|
114
|
+
if (at < 0) continue;
|
|
115
|
+
const line = rawLine.slice(at + LOGIN_SHELL_ENV_MARKER.length);
|
|
116
|
+
const eq = line.indexOf("=");
|
|
117
|
+
if (eq <= 0) continue;
|
|
118
|
+
const name = line.slice(0, eq);
|
|
119
|
+
if (!wanted.has(name)) continue;
|
|
120
|
+
const value = line.slice(eq + 1).trim();
|
|
121
|
+
env[name] = value ? value : void 0;
|
|
122
|
+
}
|
|
123
|
+
return env;
|
|
124
|
+
}
|
|
125
|
+
function probeLoginShellEnv(names, options = {}) {
|
|
126
|
+
const platform = options.platform ?? process.platform;
|
|
127
|
+
if (platform === "win32") return Promise.resolve(null);
|
|
128
|
+
const shell = (options.shell ?? process.env.SHELL ?? "").trim() || "/bin/sh";
|
|
129
|
+
const timeoutMs = options.timeoutMs ?? LOGIN_SHELL_PROBE_TIMEOUT_MS;
|
|
130
|
+
return new Promise((resolve) => {
|
|
131
|
+
let stdout = "";
|
|
132
|
+
let settled = false;
|
|
133
|
+
const finish = (value) => {
|
|
134
|
+
if (settled) return;
|
|
135
|
+
settled = true;
|
|
136
|
+
clearTimeout(timer);
|
|
137
|
+
resolve(value);
|
|
138
|
+
};
|
|
139
|
+
let child;
|
|
140
|
+
try {
|
|
141
|
+
child = spawn(shell, ["-l", "-i", "-c", loginShellProbeScript(names)], {
|
|
142
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
143
|
+
env: options.env ?? process.env,
|
|
144
|
+
windowsHide: true
|
|
145
|
+
});
|
|
146
|
+
} catch {
|
|
147
|
+
resolve(null);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const timer = setTimeout(() => {
|
|
151
|
+
try {
|
|
152
|
+
child.kill("SIGKILL");
|
|
153
|
+
} catch {
|
|
154
|
+
}
|
|
155
|
+
finish(null);
|
|
156
|
+
}, timeoutMs);
|
|
157
|
+
child.stdout?.on("data", (chunk) => {
|
|
158
|
+
stdout += chunk.toString("utf8");
|
|
159
|
+
});
|
|
160
|
+
child.on("error", () => finish(null));
|
|
161
|
+
child.on("close", () => {
|
|
162
|
+
finish(stdout.includes(LOGIN_SHELL_ENV_MARKER) ? parseLoginShellEnv(stdout, names) : null);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export { AGENT_HOME_ENV_NAMES as A, CLAUDE_CONFIG_DIR_ENV as C, CODEX_HOME_ENV as a, agentHomeCandidates as b, findCodexThread as c, describeAgentHome as d, expandHomePath as e, findClaudeConversation as f, agentHomeEnv as g, claudeConversationPath as h, claudeProjectDirName as i, codexRolloutFileMatches as j, probeLoginShellEnv as p, resolveAgentHomes as r };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import os from 'node:os';
|
|
2
|
+
import { p as packageJson } from './package-uOg9SCKi.mjs';
|
|
3
|
+
import { c as configuration } from './configuration-DoWFJUPm.mjs';
|
|
4
|
+
import { p as projectPath } from './projectPath-BTBIMB57.mjs';
|
|
5
|
+
import { d as detectCLIAvailability } from './detectCLI-CSGMlV51.mjs';
|
|
6
|
+
import { d as detectResumeSupport } from './localHappyAgentAuth-DCsetiyG.mjs';
|
|
7
|
+
|
|
8
|
+
function buildInitialMachineMetadata(cliAvailability) {
|
|
9
|
+
const hostSuffix = process.env.HAPPY_VARIANT === "dev" ? "-dev" : "";
|
|
10
|
+
return {
|
|
11
|
+
teamsVersion: 1,
|
|
12
|
+
teamLaunchVersion: 1,
|
|
13
|
+
host: os.hostname() + hostSuffix,
|
|
14
|
+
platform: os.platform(),
|
|
15
|
+
happyCliVersion: packageJson.version,
|
|
16
|
+
homeDir: os.homedir(),
|
|
17
|
+
happyHomeDir: configuration.happyHomeDir,
|
|
18
|
+
happyLibDir: projectPath(),
|
|
19
|
+
cliAvailability,
|
|
20
|
+
resumeSupport: { ...detectResumeSupport(), rpcAvailable: true }
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
let memo = null;
|
|
24
|
+
function compute() {
|
|
25
|
+
if (!memo) {
|
|
26
|
+
const cliAvailability = detectCLIAvailability();
|
|
27
|
+
memo = { metadata: buildInitialMachineMetadata(cliAvailability), cliAvailability };
|
|
28
|
+
}
|
|
29
|
+
return memo;
|
|
30
|
+
}
|
|
31
|
+
function getInitialMachineMetadata() {
|
|
32
|
+
return compute().metadata;
|
|
33
|
+
}
|
|
34
|
+
function getStartupCliAvailability() {
|
|
35
|
+
return compute().cliAvailability;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export { getStartupCliAvailability as a, getInitialMachineMetadata as g };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var os = require('node:os');
|
|
4
|
+
var _package = require('./package-Cl5BEP5x.cjs');
|
|
5
|
+
var configuration = require('./configuration-v9f8LM9T.cjs');
|
|
6
|
+
var projectPath = require('./projectPath-ChLhdOyt.cjs');
|
|
7
|
+
var detectCLI = require('./detectCLI-DR9ZaN6B.cjs');
|
|
8
|
+
var localHappyAgentAuth = require('./localHappyAgentAuth-BXiHPXdC.cjs');
|
|
9
|
+
|
|
10
|
+
function buildInitialMachineMetadata(cliAvailability) {
|
|
11
|
+
const hostSuffix = process.env.HAPPY_VARIANT === "dev" ? "-dev" : "";
|
|
12
|
+
return {
|
|
13
|
+
teamsVersion: 1,
|
|
14
|
+
teamLaunchVersion: 1,
|
|
15
|
+
host: os.hostname() + hostSuffix,
|
|
16
|
+
platform: os.platform(),
|
|
17
|
+
happyCliVersion: _package.packageJson.version,
|
|
18
|
+
homeDir: os.homedir(),
|
|
19
|
+
happyHomeDir: configuration.configuration.happyHomeDir,
|
|
20
|
+
happyLibDir: projectPath.projectPath(),
|
|
21
|
+
cliAvailability,
|
|
22
|
+
resumeSupport: { ...localHappyAgentAuth.detectResumeSupport(), rpcAvailable: true }
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
let memo = null;
|
|
26
|
+
function compute() {
|
|
27
|
+
if (!memo) {
|
|
28
|
+
const cliAvailability = detectCLI.detectCLIAvailability();
|
|
29
|
+
memo = { metadata: buildInitialMachineMetadata(cliAvailability), cliAvailability };
|
|
30
|
+
}
|
|
31
|
+
return memo;
|
|
32
|
+
}
|
|
33
|
+
function getInitialMachineMetadata() {
|
|
34
|
+
return compute().metadata;
|
|
35
|
+
}
|
|
36
|
+
function getStartupCliAvailability() {
|
|
37
|
+
return compute().cliAvailability;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
exports.getInitialMachineMetadata = getInitialMachineMetadata;
|
|
41
|
+
exports.getStartupCliAvailability = getStartupCliAvailability;
|