very-happy-cli 0.2.89 → 0.2.90
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-DuxcHPyn.mjs → AcpBackend-BV4wSnJ3.mjs} +1 -1
- package/dist/{AcpBackend-ClEvE-A-.cjs → AcpBackend-CnYZFdd0.cjs} +1 -1
- package/dist/{AcpSessionManager-DgbEf8FX.cjs → AcpSessionManager-BPBdrrME.cjs} +1 -1
- package/dist/{AcpSessionManager-CGrA8bTm.mjs → AcpSessionManager-Cyne6Rmg.mjs} +1 -1
- package/dist/{config-CdoGLla8.mjs → config-BEdyyciP.mjs} +2 -2
- package/dist/{config-BZNnPK1L.cjs → config-CgXitj0f.cjs} +2 -2
- package/dist/{index-DYDAFqAN.cjs → index-4YmVbx7j.cjs} +70 -24
- package/dist/{index-Bx-UTV3I.cjs → index-B1wTVXjt.cjs} +4 -4
- package/dist/{index-BP2wylez.mjs → index-Dfu5uvjk.mjs} +5 -5
- package/dist/{index-vCgb7QnZ.mjs → index-an09rejO.mjs} +67 -21
- package/dist/index.cjs +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{installTerminalHooks-C7JS6CBM.mjs → installTerminalHooks-C-OgZr5k.mjs} +2 -2
- package/dist/{installTerminalHooks-T4NE5fmC.cjs → installTerminalHooks-DDpVxk8-.cjs} +2 -2
- package/dist/lib.cjs +1 -1
- package/dist/lib.d.cts +8 -0
- package/dist/lib.d.mts +8 -0
- package/dist/lib.mjs +1 -1
- package/dist/{mcp-DgPg5mKa.cjs → mcp-B6Nq-RUL.cjs} +2 -2
- package/dist/{mcp-B3EgenZh.mjs → mcp-Du-N0qlK.mjs} +2 -2
- package/dist/{runGemini-xZnGj7jx.cjs → runGemini-ChG7cGMC.cjs} +4 -4
- package/dist/{runGemini-B3iv1QRL.mjs → runGemini-DBr_TiTL.mjs} +4 -4
- package/dist/{runOpenClaw-CmM4ZLYi.mjs → runOpenClaw-Cbde8t92.mjs} +3 -3
- package/dist/{runOpenClaw-6ZLPeYYZ.cjs → runOpenClaw-D2jtVgpC.cjs} +3 -3
- package/dist/{send-M2ax7UGy.mjs → send-BHliX59m.mjs} +2 -2
- package/dist/{send-S9ibMiAt.cjs → send-Bjen1TUE.cjs} +2 -2
- package/dist/{spawn-ie_kfwQe.cjs → spawn-CH1Rq-LW.cjs} +2 -2
- package/dist/{spawn-Dx_xnLlg.mjs → spawn-JxaPHAoP.mjs} +2 -2
- package/dist/{types-DLI6sss2.cjs → types-BNGeiP1C.cjs} +62 -44
- package/dist/{types-d_104eQF.mjs → types-DS3i_5LV.mjs} +60 -44
- package/package.json +7 -7
|
@@ -29,7 +29,7 @@ import { SandboxManager } from '@anthropic-ai/sandbox-runtime';
|
|
|
29
29
|
import { Expo } from 'expo-server-sdk';
|
|
30
30
|
|
|
31
31
|
var name = "very-happy-cli";
|
|
32
|
-
var version = "0.2.
|
|
32
|
+
var version = "0.2.90";
|
|
33
33
|
var description = "Remote multi-agent workspace CLI with deep Claude integration, native terminal streaming, and self-hosting.";
|
|
34
34
|
var author = "Kirill Dubovitskiy";
|
|
35
35
|
var contributors = [
|
|
@@ -142,12 +142,12 @@ var dependencies = {
|
|
|
142
142
|
zod: "^4.0.0"
|
|
143
143
|
};
|
|
144
144
|
var optionalDependencies = {
|
|
145
|
-
"very-happy-tools-arm64-darwin": "0.2.
|
|
146
|
-
"very-happy-tools-x64-darwin": "0.2.
|
|
147
|
-
"very-happy-tools-arm64-linux": "0.2.
|
|
148
|
-
"very-happy-tools-x64-linux": "0.2.
|
|
149
|
-
"very-happy-tools-arm64-win32": "0.2.
|
|
150
|
-
"very-happy-tools-x64-win32": "0.2.
|
|
145
|
+
"very-happy-tools-arm64-darwin": "0.2.90",
|
|
146
|
+
"very-happy-tools-x64-darwin": "0.2.90",
|
|
147
|
+
"very-happy-tools-arm64-linux": "0.2.90",
|
|
148
|
+
"very-happy-tools-x64-linux": "0.2.90",
|
|
149
|
+
"very-happy-tools-arm64-win32": "0.2.90",
|
|
150
|
+
"very-happy-tools-x64-win32": "0.2.90"
|
|
151
151
|
};
|
|
152
152
|
var devDependencies = {
|
|
153
153
|
"@slopus/happy-wire": "workspace:*",
|
|
@@ -8807,6 +8807,20 @@ function previewAscii(line) {
|
|
|
8807
8807
|
return line.length > 80 ? `${out}\u2026` : out;
|
|
8808
8808
|
}
|
|
8809
8809
|
|
|
8810
|
+
const VH_TMUX_SOCKET_ENV = "VH_TMUX_SOCKET";
|
|
8811
|
+
function tmuxSocketFlags(env = process.env) {
|
|
8812
|
+
const socket = env[VH_TMUX_SOCKET_ENV];
|
|
8813
|
+
return socket ? ["-S", socket] : [];
|
|
8814
|
+
}
|
|
8815
|
+
function tmuxArgs(args, env = process.env) {
|
|
8816
|
+
return [...tmuxSocketFlags(env), ...args];
|
|
8817
|
+
}
|
|
8818
|
+
function scrubTmuxClientEnv(env) {
|
|
8819
|
+
delete env.TMUX;
|
|
8820
|
+
delete env.TMUX_PANE;
|
|
8821
|
+
return env;
|
|
8822
|
+
}
|
|
8823
|
+
|
|
8810
8824
|
const CONTROL_CLIENT_KILL_GRACE_MS = 2e3;
|
|
8811
8825
|
const CONTROL_COMMAND_TIMEOUT_MS = 1e4;
|
|
8812
8826
|
function isSafeControlCommand(command) {
|
|
@@ -8816,7 +8830,7 @@ class ControlClient {
|
|
|
8816
8830
|
constructor(tmuxSession, env, handlers) {
|
|
8817
8831
|
this.tmuxSession = tmuxSession;
|
|
8818
8832
|
this.handlers = handlers;
|
|
8819
|
-
this.child = spawn$2("tmux", ["-C", "attach-session", "-t", `=${tmuxSession}:`], {
|
|
8833
|
+
this.child = spawn$2("tmux", tmuxArgs(["-C", "attach-session", "-t", `=${tmuxSession}:`], env), {
|
|
8820
8834
|
stdio: ["pipe", "pipe", "pipe"],
|
|
8821
8835
|
env
|
|
8822
8836
|
});
|
|
@@ -9968,7 +9982,7 @@ let tmuxAvailableCache = null;
|
|
|
9968
9982
|
function isTmuxAvailable() {
|
|
9969
9983
|
if (tmuxAvailableCache !== null) return tmuxAvailableCache;
|
|
9970
9984
|
try {
|
|
9971
|
-
const r = spawnSync("tmux", ["-V"], { stdio: "ignore", env: ptyEnv() });
|
|
9985
|
+
const r = spawnSync("tmux", tmuxArgs(["-V"]), { stdio: "ignore", env: ptyEnv() });
|
|
9972
9986
|
tmuxAvailableCache = r.status === 0;
|
|
9973
9987
|
} catch {
|
|
9974
9988
|
tmuxAvailableCache = false;
|
|
@@ -9979,7 +9993,7 @@ let tmuxEnvFlagCache = null;
|
|
|
9979
9993
|
function tmuxSupportsEnvFlag() {
|
|
9980
9994
|
if (tmuxEnvFlagCache !== null) return tmuxEnvFlagCache;
|
|
9981
9995
|
try {
|
|
9982
|
-
const r = spawnSync("tmux", ["-V"], { encoding: "utf8", env: ptyEnv() });
|
|
9996
|
+
const r = spawnSync("tmux", tmuxArgs(["-V"]), { encoding: "utf8", env: ptyEnv() });
|
|
9983
9997
|
tmuxEnvFlagCache = r.status === 0 && tmuxSupportsNewSessionEnv(r.stdout || "");
|
|
9984
9998
|
} catch {
|
|
9985
9999
|
tmuxEnvFlagCache = false;
|
|
@@ -10023,6 +10037,7 @@ function ptyEnv() {
|
|
|
10023
10037
|
for (const [k, v] of Object.entries(process.env)) {
|
|
10024
10038
|
if (typeof v === "string") env[k] = v;
|
|
10025
10039
|
}
|
|
10040
|
+
scrubTmuxClientEnv(env);
|
|
10026
10041
|
const local = `${os$1.homedir()}/.local/bin`;
|
|
10027
10042
|
if (!(env.PATH || "").split(":").includes(local)) {
|
|
10028
10043
|
env.PATH = `${local}:${env.PATH || ""}`;
|
|
@@ -10678,7 +10693,7 @@ class WebTerminalManager {
|
|
|
10678
10693
|
const name = `vh-${plan.terminalId}`;
|
|
10679
10694
|
const exists = spawnSync(
|
|
10680
10695
|
"tmux",
|
|
10681
|
-
["has-session", "-t", `=${name}:`],
|
|
10696
|
+
tmuxArgs(["has-session", "-t", `=${name}:`]),
|
|
10682
10697
|
{ stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env }
|
|
10683
10698
|
).status === 0;
|
|
10684
10699
|
if (exists) return false;
|
|
@@ -10692,12 +10707,12 @@ class WebTerminalManager {
|
|
|
10692
10707
|
] : [];
|
|
10693
10708
|
const created = spawnSync(
|
|
10694
10709
|
"tmux",
|
|
10695
|
-
tmuxNewSessionArgs(name, 120, 30, plan.cwd, envFlags, defaultShell()),
|
|
10710
|
+
tmuxArgs(tmuxNewSessionArgs(name, 120, 30, plan.cwd, envFlags, defaultShell())),
|
|
10696
10711
|
{ stdio: "ignore", timeout: TMUX_CREATE_TIMEOUT_MS, env }
|
|
10697
10712
|
);
|
|
10698
10713
|
const live = created.status === 0 && spawnSync(
|
|
10699
10714
|
"tmux",
|
|
10700
|
-
["has-session", "-t", `=${name}:`],
|
|
10715
|
+
tmuxArgs(["has-session", "-t", `=${name}:`]),
|
|
10701
10716
|
{ stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env }
|
|
10702
10717
|
).status === 0;
|
|
10703
10718
|
if (!live) {
|
|
@@ -10707,12 +10722,12 @@ class WebTerminalManager {
|
|
|
10707
10722
|
if (plan.title) {
|
|
10708
10723
|
spawnSync(
|
|
10709
10724
|
"tmux",
|
|
10710
|
-
["set-option", "-t", `=${name}:`, "@vh_title", plan.title],
|
|
10725
|
+
tmuxArgs(["set-option", "-t", `=${name}:`, "@vh_title", plan.title]),
|
|
10711
10726
|
{ stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env }
|
|
10712
10727
|
);
|
|
10713
10728
|
}
|
|
10714
10729
|
for (const argv of startupInjectionArgs(name, plan.command)) {
|
|
10715
|
-
spawnSync("tmux", argv, { stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env });
|
|
10730
|
+
spawnSync("tmux", tmuxArgs(argv), { stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env });
|
|
10716
10731
|
}
|
|
10717
10732
|
logger.info(`[WEB TERMINAL] auto-restored ${plan.terminalId} in ${plan.cwd}`);
|
|
10718
10733
|
return true;
|
|
@@ -10844,14 +10859,14 @@ class WebTerminalManager {
|
|
|
10844
10859
|
if (opts.attachOnly || opts.resub) {
|
|
10845
10860
|
const alive = isTmuxAvailable() && spawnSync(
|
|
10846
10861
|
"tmux",
|
|
10847
|
-
["has-session", "-t", `=vh-${id}:`],
|
|
10862
|
+
tmuxArgs(["has-session", "-t", `=vh-${id}:`]),
|
|
10848
10863
|
{ stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() }
|
|
10849
10864
|
).status === 0;
|
|
10850
10865
|
if (!alive) throw new Error("terminal-gone");
|
|
10851
10866
|
} else if (this.tombstones[id]) {
|
|
10852
10867
|
const alive = isTmuxAvailable() && spawnSync(
|
|
10853
10868
|
"tmux",
|
|
10854
|
-
["has-session", "-t", `=vh-${id}:`],
|
|
10869
|
+
tmuxArgs(["has-session", "-t", `=vh-${id}:`]),
|
|
10855
10870
|
{ stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() }
|
|
10856
10871
|
).status === 0;
|
|
10857
10872
|
if (!alive) {
|
|
@@ -10880,7 +10895,7 @@ class WebTerminalManager {
|
|
|
10880
10895
|
try {
|
|
10881
10896
|
const created = spawnSync(
|
|
10882
10897
|
"tmux",
|
|
10883
|
-
tmuxNewSessionArgs(tmuxSession, cols, rows, cwd, envFlags, defaultShell()),
|
|
10898
|
+
tmuxArgs(tmuxNewSessionArgs(tmuxSession, cols, rows, cwd, envFlags, defaultShell())),
|
|
10884
10899
|
{ stdio: "ignore", timeout: TMUX_CREATE_TIMEOUT_MS, env }
|
|
10885
10900
|
);
|
|
10886
10901
|
createdNew = created.status === 0;
|
|
@@ -10912,7 +10927,7 @@ class WebTerminalManager {
|
|
|
10912
10927
|
];
|
|
10913
10928
|
for (const a of optArgs) {
|
|
10914
10929
|
try {
|
|
10915
|
-
spawnSync("tmux", a, { stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env });
|
|
10930
|
+
spawnSync("tmux", tmuxArgs(a), { stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env });
|
|
10916
10931
|
} catch {
|
|
10917
10932
|
}
|
|
10918
10933
|
}
|
|
@@ -10921,7 +10936,7 @@ class WebTerminalManager {
|
|
|
10921
10936
|
if (startup) {
|
|
10922
10937
|
try {
|
|
10923
10938
|
for (const a of startupInjectionArgs(tmuxSession, startup)) {
|
|
10924
|
-
spawnSync("tmux", a, { stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env });
|
|
10939
|
+
spawnSync("tmux", tmuxArgs(a), { stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env });
|
|
10925
10940
|
}
|
|
10926
10941
|
logger.debug(`[WEB TERMINAL] injected startup command into new session ${tmuxSession}`);
|
|
10927
10942
|
} catch {
|
|
@@ -10931,13 +10946,13 @@ class WebTerminalManager {
|
|
|
10931
10946
|
if (!attachOnly && !createdNew) {
|
|
10932
10947
|
const alive = spawnSync(
|
|
10933
10948
|
"tmux",
|
|
10934
|
-
["has-session", "-t", `=${tmuxSession}:`],
|
|
10949
|
+
tmuxArgs(["has-session", "-t", `=${tmuxSession}:`]),
|
|
10935
10950
|
{ stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env }
|
|
10936
10951
|
).status === 0;
|
|
10937
10952
|
if (shouldUseDirectPtyFallback(attachOnly, createdNew, alive)) {
|
|
10938
10953
|
const retry = spawnSync(
|
|
10939
10954
|
"tmux",
|
|
10940
|
-
tmuxNewSessionArgs(tmuxSession, cols, rows, cwd, envFlags, defaultShell()),
|
|
10955
|
+
tmuxArgs(tmuxNewSessionArgs(tmuxSession, cols, rows, cwd, envFlags, defaultShell())),
|
|
10941
10956
|
{ stdio: "ignore", timeout: TMUX_CREATE_TIMEOUT_MS, env }
|
|
10942
10957
|
);
|
|
10943
10958
|
createdNew = retry.status === 0;
|
|
@@ -10946,7 +10961,7 @@ class WebTerminalManager {
|
|
|
10946
10961
|
if (startup) {
|
|
10947
10962
|
for (const a of startupInjectionArgs(tmuxSession, startup)) {
|
|
10948
10963
|
try {
|
|
10949
|
-
spawnSync("tmux", a, { stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env });
|
|
10964
|
+
spawnSync("tmux", tmuxArgs(a), { stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env });
|
|
10950
10965
|
} catch {
|
|
10951
10966
|
}
|
|
10952
10967
|
}
|
|
@@ -10957,7 +10972,7 @@ class WebTerminalManager {
|
|
|
10957
10972
|
if (!attachOnly && !createdNew) {
|
|
10958
10973
|
const alive = spawnSync(
|
|
10959
10974
|
"tmux",
|
|
10960
|
-
["has-session", "-t", `=${tmuxSession}:`],
|
|
10975
|
+
tmuxArgs(["has-session", "-t", `=${tmuxSession}:`]),
|
|
10961
10976
|
{ stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env }
|
|
10962
10977
|
).status === 0;
|
|
10963
10978
|
if (!alive) {
|
|
@@ -11284,8 +11299,8 @@ class WebTerminalManager {
|
|
|
11284
11299
|
killSession(terminalId) {
|
|
11285
11300
|
const info = this.lastSeenInfo.get(terminalId) ?? this.listSessions().find((t) => t.id === terminalId);
|
|
11286
11301
|
const target = `=vh-${terminalId}:`;
|
|
11287
|
-
const killed = spawnSync("tmux", ["kill-session", "-t", target], { stdio: "ignore", env: ptyEnv() });
|
|
11288
|
-
const verified = spawnSync("tmux", ["has-session", "-t", target], { stdio: "ignore", env: ptyEnv() });
|
|
11302
|
+
const killed = spawnSync("tmux", tmuxArgs(["kill-session", "-t", target]), { stdio: "ignore", env: ptyEnv() });
|
|
11303
|
+
const verified = spawnSync("tmux", tmuxArgs(["has-session", "-t", target]), { stdio: "ignore", env: ptyEnv() });
|
|
11289
11304
|
if (!tmuxKillVerified(killed, verified)) {
|
|
11290
11305
|
logger.debug(`[WEB TERMINAL] failed to verify tmux session removal ${target}`);
|
|
11291
11306
|
return false;
|
|
@@ -11346,7 +11361,7 @@ class WebTerminalManager {
|
|
|
11346
11361
|
const env = ptyEnv();
|
|
11347
11362
|
const r = spawnSync(
|
|
11348
11363
|
"tmux",
|
|
11349
|
-
["list-sessions", "-F", LIST_SESSIONS_FORMAT],
|
|
11364
|
+
tmuxArgs(["list-sessions", "-F", LIST_SESSIONS_FORMAT]),
|
|
11350
11365
|
{ encoding: "utf8", env }
|
|
11351
11366
|
);
|
|
11352
11367
|
if (r.status !== 0 || !r.stdout) return [];
|
|
@@ -11362,7 +11377,7 @@ class WebTerminalManager {
|
|
|
11362
11377
|
try {
|
|
11363
11378
|
const w = spawnSync(
|
|
11364
11379
|
"tmux",
|
|
11365
|
-
["set-option", "-t", `=${s.name}:`, "@vh_title", auto],
|
|
11380
|
+
tmuxArgs(["set-option", "-t", `=${s.name}:`, "@vh_title", auto]),
|
|
11366
11381
|
{ stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env }
|
|
11367
11382
|
);
|
|
11368
11383
|
if (w.status === 0) title = auto;
|
|
@@ -11413,13 +11428,13 @@ class WebTerminalManager {
|
|
|
11413
11428
|
try {
|
|
11414
11429
|
const cmd = spawnSync(
|
|
11415
11430
|
"tmux",
|
|
11416
|
-
["display-message", "-p", "-t", sessionName, "#{pane_current_command}"],
|
|
11431
|
+
tmuxArgs(["display-message", "-p", "-t", sessionName, "#{pane_current_command}"]),
|
|
11417
11432
|
{ encoding: "utf8", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() }
|
|
11418
11433
|
);
|
|
11419
11434
|
if (cmd.status !== 0 || typeof cmd.stdout !== "string") return void 0;
|
|
11420
11435
|
const cap = spawnSync(
|
|
11421
11436
|
"tmux",
|
|
11422
|
-
["capture-pane", "-p", "-t", sessionName, "-S", "-40"],
|
|
11437
|
+
tmuxArgs(["capture-pane", "-p", "-t", sessionName, "-S", "-40"]),
|
|
11423
11438
|
{ encoding: "utf8", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() }
|
|
11424
11439
|
);
|
|
11425
11440
|
if (cap.status !== 0 || typeof cap.stdout !== "string") return void 0;
|
|
@@ -11446,7 +11461,7 @@ class WebTerminalManager {
|
|
|
11446
11461
|
try {
|
|
11447
11462
|
const probe = spawnSync(
|
|
11448
11463
|
"tmux",
|
|
11449
|
-
["display-message", "-p", "-t", name, "#{pane_in_mode} #{alternate_on} #{mouse_any_flag} #{pane_width} #{pane_height} #{pane_current_command}"],
|
|
11464
|
+
tmuxArgs(["display-message", "-p", "-t", name, "#{pane_in_mode} #{alternate_on} #{mouse_any_flag} #{pane_width} #{pane_height} #{pane_current_command}"]),
|
|
11450
11465
|
{ encoding: "utf8", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() }
|
|
11451
11466
|
);
|
|
11452
11467
|
if (probe.status !== 0 || typeof probe.stdout !== "string") return;
|
|
@@ -11464,7 +11479,7 @@ class WebTerminalManager {
|
|
|
11464
11479
|
const hex = sgrWheelHexBytes(action.dir, action.count, Number(paneW) || 80, Number(paneH) || 24);
|
|
11465
11480
|
spawnSync(
|
|
11466
11481
|
"tmux",
|
|
11467
|
-
["send-keys", "-t", name, "-H", ...hex],
|
|
11482
|
+
tmuxArgs(["send-keys", "-t", name, "-H", ...hex]),
|
|
11468
11483
|
{ stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() }
|
|
11469
11484
|
);
|
|
11470
11485
|
return;
|
|
@@ -11472,7 +11487,7 @@ class WebTerminalManager {
|
|
|
11472
11487
|
if (action.kind === "page-keys") {
|
|
11473
11488
|
spawnSync(
|
|
11474
11489
|
"tmux",
|
|
11475
|
-
["send-keys", "-t", name, "-N", String(action.count), action.key],
|
|
11490
|
+
tmuxArgs(["send-keys", "-t", name, "-N", String(action.count), action.key]),
|
|
11476
11491
|
{ stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() }
|
|
11477
11492
|
);
|
|
11478
11493
|
return;
|
|
@@ -11480,19 +11495,19 @@ class WebTerminalManager {
|
|
|
11480
11495
|
if (action.kind === "keys") {
|
|
11481
11496
|
spawnSync(
|
|
11482
11497
|
"tmux",
|
|
11483
|
-
["send-keys", "-t", name, "-N", String(action.count), action.key],
|
|
11498
|
+
tmuxArgs(["send-keys", "-t", name, "-N", String(action.count), action.key]),
|
|
11484
11499
|
{ stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() }
|
|
11485
11500
|
);
|
|
11486
11501
|
return;
|
|
11487
11502
|
}
|
|
11488
11503
|
spawnSync(
|
|
11489
11504
|
"tmux",
|
|
11490
|
-
["copy-mode", "-e", "-t", name],
|
|
11505
|
+
tmuxArgs(["copy-mode", "-e", "-t", name]),
|
|
11491
11506
|
{ stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() }
|
|
11492
11507
|
);
|
|
11493
11508
|
spawnSync(
|
|
11494
11509
|
"tmux",
|
|
11495
|
-
[
|
|
11510
|
+
tmuxArgs([
|
|
11496
11511
|
"send-keys",
|
|
11497
11512
|
"-X",
|
|
11498
11513
|
"-t",
|
|
@@ -11500,7 +11515,7 @@ class WebTerminalManager {
|
|
|
11500
11515
|
"-N",
|
|
11501
11516
|
String(action.count),
|
|
11502
11517
|
action.dir === "up" ? "scroll-up" : "scroll-down"
|
|
11503
|
-
],
|
|
11518
|
+
]),
|
|
11504
11519
|
{ stdio: "ignore", timeout: TMUX_PROBE_TIMEOUT_MS, env: ptyEnv() }
|
|
11505
11520
|
);
|
|
11506
11521
|
} catch {
|
|
@@ -11534,14 +11549,14 @@ class WebTerminalManager {
|
|
|
11534
11549
|
const name = `vh-${terminalId}`;
|
|
11535
11550
|
try {
|
|
11536
11551
|
if (ifAbsent) {
|
|
11537
|
-
const cur = spawnSync("tmux", ["show-options", "-t", name, "-v", "@vh_title"], { encoding: "utf8", env: ptyEnv() });
|
|
11552
|
+
const cur = spawnSync("tmux", tmuxArgs(["show-options", "-t", name, "-v", "@vh_title"]), { encoding: "utf8", env: ptyEnv() });
|
|
11538
11553
|
if (cur.status === 0 && cur.stdout && cur.stdout.trim()) return true;
|
|
11539
11554
|
}
|
|
11540
|
-
const r = spawnSync("tmux", ["set-option", "-t", name, "@vh_title", title], { stdio: "ignore", env: ptyEnv() });
|
|
11555
|
+
const r = spawnSync("tmux", tmuxArgs(["set-option", "-t", name, "@vh_title", title]), { stdio: "ignore", env: ptyEnv() });
|
|
11541
11556
|
if (r.status !== 0) return false;
|
|
11542
11557
|
if (!ifAbsent) {
|
|
11543
11558
|
try {
|
|
11544
|
-
spawnSync("tmux", ["set-option", "-t", name, "@vh_title_manual", "1"], { stdio: "ignore", env: ptyEnv() });
|
|
11559
|
+
spawnSync("tmux", tmuxArgs(["set-option", "-t", name, "@vh_title_manual", "1"]), { stdio: "ignore", env: ptyEnv() });
|
|
11545
11560
|
} catch {
|
|
11546
11561
|
}
|
|
11547
11562
|
}
|
|
@@ -11559,7 +11574,7 @@ class WebTerminalManager {
|
|
|
11559
11574
|
if (!valid) return false;
|
|
11560
11575
|
const name = `vh-${terminalId}`;
|
|
11561
11576
|
try {
|
|
11562
|
-
const r = spawnSync("tmux", ["set-option", "-t", name, "@vh_tags", JSON.stringify(valid)], {
|
|
11577
|
+
const r = spawnSync("tmux", tmuxArgs(["set-option", "-t", name, "@vh_tags", JSON.stringify(valid)]), {
|
|
11563
11578
|
stdio: "ignore",
|
|
11564
11579
|
env: ptyEnv()
|
|
11565
11580
|
});
|
|
@@ -11591,10 +11606,11 @@ function parseVhTerminals(stdout, hostname = os$1.hostname()) {
|
|
|
11591
11606
|
}
|
|
11592
11607
|
function runTmux(args, input) {
|
|
11593
11608
|
try {
|
|
11594
|
-
const r = spawnSync("tmux", args, {
|
|
11609
|
+
const r = spawnSync("tmux", tmuxArgs(args), {
|
|
11595
11610
|
encoding: "utf8",
|
|
11596
11611
|
timeout: TMUX_TIMEOUT_MS,
|
|
11597
|
-
input
|
|
11612
|
+
input,
|
|
11613
|
+
env: scrubTmuxClientEnv({ ...process.env })
|
|
11598
11614
|
});
|
|
11599
11615
|
if (r.error) return { ok: false, stdout: "", error: r.error.message };
|
|
11600
11616
|
if (r.status !== 0) return { ok: false, stdout: r.stdout ?? "", error: (r.stderr || `tmux exited with ${r.status}`).trim() };
|
|
@@ -15149,4 +15165,4 @@ const RawJSONLinesSchema = z$1.discriminatedUnion("type", [
|
|
|
15149
15165
|
}).passthrough()
|
|
15150
15166
|
]);
|
|
15151
15167
|
|
|
15152
|
-
export {
|
|
15168
|
+
export { detectCLIAvailability as $, ApiClient as A, deriveLocalCliUpdateSummary as B, updateSettings as C, encodeBase64Url as D, decodeBase64 as E, writeCredentialsLegacy as F, writeCredentialsDataKey as G, readCredentialsForConfiguredRelay as H, InvalidateSync as I, encrypt as J, getLocalHappyAgentCredentialPath as K, readLocalHappyAgentCredentials as L, MAX_CHAT_ATTACHMENT_SOURCE_BYTES as M, decryptWithDataKey as N, decryptLegacy as O, extractCompleteLines as P, decideBackfill as Q, RawJSONLinesSchema as R, parseTerminalHookPayload as S, tmuxArgs as T, scrubTmuxClientEnv as U, decideMirrorBinding as V, persistSession as W, MIRROR_BACKFILL_LINES_DEFAULT as X, mirrorLineKey as Y, mirrorLocalId as Z, detectResumeSupport as _, ApiSessionClient as a, acquireDaemonLock as a0, summarizeSpawnSessionForLog as a1, deletePersistedSessions as a2, decrypt as a3, writeDaemonState as a4, fetchCliUpdateState as a5, resolveCliUpdateCheckInterval as a6, DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS as a7, releaseDaemonLock as a8, isValidSessionId as a9, listVhTerminals as aa, isValidTerminalId as ab, readVhTerminal as ac, sendToVhTerminal as ad, startOfflineReconnection as ae, clearCredentials as af, clearMachineId as ag, SandboxConfigSchema as ah, CodexAppServerClient as ai, getLatestDaemonLog as aj, persistence as ak, api as al, createEnvelope as b, configuration as c, contentLogMetadata as d, errorLogMetadata as e, packageJson as f, delay as g, connectionState as h, readSettings as i, encodeBase64 as j, ensurePrivateDirectorySync as k, logger as l, hardenPrivateFileSync as m, readDaemonState as n, clearDaemonState as o, projectPath as p, getProjectPath as q, readPersistedSessions as r, initializeSandbox as s, wrapCommand as t, AsyncLock as u, ensurePrivateDirectory as v, writePrivateFileSync as w, hardenPrivateFile as x, readCredentials as y, credentialRelayProblem as z };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "very-happy-cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.90",
|
|
4
4
|
"description": "Remote multi-agent workspace CLI with deep Claude integration, native terminal streaming, and self-hosting.",
|
|
5
5
|
"author": "Kirill Dubovitskiy",
|
|
6
6
|
"contributors": [
|
|
@@ -113,12 +113,12 @@
|
|
|
113
113
|
"zod": "^4.0.0"
|
|
114
114
|
},
|
|
115
115
|
"optionalDependencies": {
|
|
116
|
-
"very-happy-tools-arm64-darwin": "0.2.
|
|
117
|
-
"very-happy-tools-x64-darwin": "0.2.
|
|
118
|
-
"very-happy-tools-arm64-linux": "0.2.
|
|
119
|
-
"very-happy-tools-x64-linux": "0.2.
|
|
120
|
-
"very-happy-tools-arm64-win32": "0.2.
|
|
121
|
-
"very-happy-tools-x64-win32": "0.2.
|
|
116
|
+
"very-happy-tools-arm64-darwin": "0.2.90",
|
|
117
|
+
"very-happy-tools-x64-darwin": "0.2.90",
|
|
118
|
+
"very-happy-tools-arm64-linux": "0.2.90",
|
|
119
|
+
"very-happy-tools-x64-linux": "0.2.90",
|
|
120
|
+
"very-happy-tools-arm64-win32": "0.2.90",
|
|
121
|
+
"very-happy-tools-x64-win32": "0.2.90"
|
|
122
122
|
},
|
|
123
123
|
"devDependencies": {
|
|
124
124
|
"@slopus/happy-wire": "workspace:*",
|