cli-remote-agent 1.0.10 → 1.0.12

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/index.js CHANGED
@@ -59,6 +59,7 @@ var TMUX_LIST = "tmux:list";
59
59
  var TMUX_LIST_RESULT = "tmux:list:result";
60
60
  var TMUX_KILL = "tmux:kill";
61
61
  var TMUX_KILL_RESULT = "tmux:kill:result";
62
+ var TMUX_SCROLL = "tmux:scroll";
62
63
 
63
64
  // ../shared/src/constants.ts
64
65
  var HEARTBEAT_INTERVAL = 15e3;
@@ -469,6 +470,41 @@ async function killTmuxSession(name) {
469
470
  return { ok: false, error: msg };
470
471
  }
471
472
  }
473
+ async function scrollTmux(name, direction) {
474
+ const bin = resolveTmuxPath();
475
+ if (!bin) return { inCopyMode: false };
476
+ const target = name;
477
+ const run = (args) => execFileAsync2(bin, args, { timeout: 4e3 }).catch(() => {
478
+ });
479
+ const inMode = async () => {
480
+ try {
481
+ const { stdout } = await execFileAsync2(bin, ["display-message", "-t", target, "-p", "#{pane_in_mode}"], { timeout: 3e3 });
482
+ return stdout.trim() === "1";
483
+ } catch {
484
+ return false;
485
+ }
486
+ };
487
+ if (direction === "exit") {
488
+ if (await inMode()) await run(["send-keys", "-t", target, "-X", "cancel"]);
489
+ return { inCopyMode: false };
490
+ }
491
+ if (direction === "up") {
492
+ if (!await inMode()) await run(["copy-mode", "-t", target]);
493
+ await run(["send-keys", "-t", target, "-X", "halfpage-up"]);
494
+ return { inCopyMode: true };
495
+ }
496
+ if (!await inMode()) return { inCopyMode: false };
497
+ await run(["send-keys", "-t", target, "-X", "halfpage-down"]);
498
+ try {
499
+ const { stdout } = await execFileAsync2(bin, ["display-message", "-t", target, "-p", "#{scroll_position}"], { timeout: 3e3 });
500
+ if ((parseInt(stdout.trim(), 10) || 0) === 0) {
501
+ await run(["send-keys", "-t", target, "-X", "cancel"]);
502
+ return { inCopyMode: false };
503
+ }
504
+ } catch {
505
+ }
506
+ return { inCopyMode: true };
507
+ }
472
508
  async function enrichWithPanesAndClaude(sessions2) {
473
509
  if (IS_WIN || sessions2.length === 0) return;
474
510
  try {
@@ -1630,9 +1666,12 @@ startLocalControl(LOCAL_CONTROL_PORT, (raw) => {
1630
1666
  socket.emit(CLAUDE_HOOK, payload);
1631
1667
  }
1632
1668
  });
1669
+ var sessionTmuxName = /* @__PURE__ */ new Map();
1670
+ var sessionInCopyMode = /* @__PURE__ */ new Map();
1633
1671
  socket.on(TERMINAL_OPEN, (payload) => {
1634
1672
  const { sessionId, cols, rows, tmux, launch } = payload;
1635
1673
  if (!sessionId) return;
1674
+ if (tmux) sessionTmuxName.set(sessionId, tmux);
1636
1675
  let launchSpec;
1637
1676
  if (tmux) {
1638
1677
  const spec = buildTmuxLaunch(tmux, launch);
@@ -1656,6 +1695,8 @@ socket.on(TERMINAL_OPEN, (payload) => {
1656
1695
  },
1657
1696
  (sid, exitCode) => {
1658
1697
  socket.emit(TERMINAL_EXIT, { sessionId: sid, exitCode });
1698
+ sessionTmuxName.delete(sid);
1699
+ sessionInCopyMode.delete(sid);
1659
1700
  },
1660
1701
  launchSpec
1661
1702
  );
@@ -1677,7 +1718,20 @@ socket.on(TMUX_KILL, async (payload) => {
1677
1718
  logger.info({ name, ok: result.ok, error: result.error }, "tmux kill requested");
1678
1719
  socket.emit(TMUX_KILL_RESULT, { requestId, name, ok: result.ok, error: result.error });
1679
1720
  });
1721
+ socket.on(TMUX_SCROLL, async (payload) => {
1722
+ const { sessionId, direction } = payload;
1723
+ const name = sessionId && sessionTmuxName.get(sessionId);
1724
+ if (!name) return;
1725
+ const { inCopyMode } = await scrollTmux(name, direction);
1726
+ sessionInCopyMode.set(sessionId, inCopyMode);
1727
+ });
1680
1728
  socket.on(TERMINAL_INPUT, (payload) => {
1729
+ const name = sessionTmuxName.get(payload.sessionId);
1730
+ if (name && sessionInCopyMode.get(payload.sessionId)) {
1731
+ sessionInCopyMode.set(payload.sessionId, false);
1732
+ scrollTmux(name, "exit").catch(() => {
1733
+ });
1734
+ }
1681
1735
  writeToSession(payload.sessionId, payload.data);
1682
1736
  });
1683
1737
  socket.on(TERMINAL_RESIZE, (payload) => {
@@ -1685,6 +1739,8 @@ socket.on(TERMINAL_RESIZE, (payload) => {
1685
1739
  });
1686
1740
  socket.on(TERMINAL_CLOSE, (payload) => {
1687
1741
  closeSession(payload.sessionId);
1742
+ sessionTmuxName.delete(payload.sessionId);
1743
+ sessionInCopyMode.delete(payload.sessionId);
1688
1744
  });
1689
1745
  socket.on(SESSION_SYNC, () => {
1690
1746
  const aliveIds = getAliveSessionIds();