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.
Files changed (31) hide show
  1. package/dist/{AcpBackend-DuxcHPyn.mjs → AcpBackend-BV4wSnJ3.mjs} +1 -1
  2. package/dist/{AcpBackend-ClEvE-A-.cjs → AcpBackend-CnYZFdd0.cjs} +1 -1
  3. package/dist/{AcpSessionManager-DgbEf8FX.cjs → AcpSessionManager-BPBdrrME.cjs} +1 -1
  4. package/dist/{AcpSessionManager-CGrA8bTm.mjs → AcpSessionManager-Cyne6Rmg.mjs} +1 -1
  5. package/dist/{config-CdoGLla8.mjs → config-BEdyyciP.mjs} +2 -2
  6. package/dist/{config-BZNnPK1L.cjs → config-CgXitj0f.cjs} +2 -2
  7. package/dist/{index-DYDAFqAN.cjs → index-4YmVbx7j.cjs} +70 -24
  8. package/dist/{index-Bx-UTV3I.cjs → index-B1wTVXjt.cjs} +4 -4
  9. package/dist/{index-BP2wylez.mjs → index-Dfu5uvjk.mjs} +5 -5
  10. package/dist/{index-vCgb7QnZ.mjs → index-an09rejO.mjs} +67 -21
  11. package/dist/index.cjs +2 -2
  12. package/dist/index.mjs +2 -2
  13. package/dist/{installTerminalHooks-C7JS6CBM.mjs → installTerminalHooks-C-OgZr5k.mjs} +2 -2
  14. package/dist/{installTerminalHooks-T4NE5fmC.cjs → installTerminalHooks-DDpVxk8-.cjs} +2 -2
  15. package/dist/lib.cjs +1 -1
  16. package/dist/lib.d.cts +8 -0
  17. package/dist/lib.d.mts +8 -0
  18. package/dist/lib.mjs +1 -1
  19. package/dist/{mcp-DgPg5mKa.cjs → mcp-B6Nq-RUL.cjs} +2 -2
  20. package/dist/{mcp-B3EgenZh.mjs → mcp-Du-N0qlK.mjs} +2 -2
  21. package/dist/{runGemini-xZnGj7jx.cjs → runGemini-ChG7cGMC.cjs} +4 -4
  22. package/dist/{runGemini-B3iv1QRL.mjs → runGemini-DBr_TiTL.mjs} +4 -4
  23. package/dist/{runOpenClaw-CmM4ZLYi.mjs → runOpenClaw-Cbde8t92.mjs} +3 -3
  24. package/dist/{runOpenClaw-6ZLPeYYZ.cjs → runOpenClaw-D2jtVgpC.cjs} +3 -3
  25. package/dist/{send-M2ax7UGy.mjs → send-BHliX59m.mjs} +2 -2
  26. package/dist/{send-S9ibMiAt.cjs → send-Bjen1TUE.cjs} +2 -2
  27. package/dist/{spawn-ie_kfwQe.cjs → spawn-CH1Rq-LW.cjs} +2 -2
  28. package/dist/{spawn-Dx_xnLlg.mjs → spawn-JxaPHAoP.mjs} +2 -2
  29. package/dist/{types-DLI6sss2.cjs → types-BNGeiP1C.cjs} +62 -44
  30. package/dist/{types-d_104eQF.mjs → types-DS3i_5LV.mjs} +60 -44
  31. 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.89";
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.89",
146
- "very-happy-tools-x64-darwin": "0.2.89",
147
- "very-happy-tools-arm64-linux": "0.2.89",
148
- "very-happy-tools-x64-linux": "0.2.89",
149
- "very-happy-tools-arm64-win32": "0.2.89",
150
- "very-happy-tools-x64-win32": "0.2.89"
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 { summarizeSpawnSessionForLog 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, decideMirrorBinding as T, persistSession as U, MIRROR_BACKFILL_LINES_DEFAULT as V, mirrorLineKey as W, mirrorLocalId as X, detectResumeSupport as Y, detectCLIAvailability as Z, acquireDaemonLock as _, ApiSessionClient as a, deletePersistedSessions as a0, decrypt as a1, writeDaemonState as a2, fetchCliUpdateState as a3, resolveCliUpdateCheckInterval as a4, DEFAULT_CLI_UPDATE_CHECK_INTERVAL_MS as a5, releaseDaemonLock as a6, isValidSessionId as a7, listVhTerminals as a8, isValidTerminalId as a9, readVhTerminal as aa, sendToVhTerminal as ab, startOfflineReconnection as ac, clearCredentials as ad, clearMachineId as ae, SandboxConfigSchema as af, CodexAppServerClient as ag, getLatestDaemonLog as ah, persistence as ai, api as aj, 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 };
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.89",
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.89",
117
- "very-happy-tools-x64-darwin": "0.2.89",
118
- "very-happy-tools-arm64-linux": "0.2.89",
119
- "very-happy-tools-x64-linux": "0.2.89",
120
- "very-happy-tools-arm64-win32": "0.2.89",
121
- "very-happy-tools-x64-win32": "0.2.89"
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:*",