cli-remote-agent 1.0.10 → 1.0.11

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/cli.js CHANGED
@@ -215,7 +215,7 @@ var init_types = __esm({
215
215
  });
216
216
 
217
217
  // ../shared/src/protocol.ts
218
- var AGENT_HEARTBEAT, TERMINAL_OUTPUT, TERMINAL_EXIT, TERMINAL_OPEN, TERMINAL_INPUT, TERMINAL_RESIZE, TERMINAL_CLOSE, SESSION_ATTACH, SESSION_DETACH, SESSION_BUFFER, SESSION_SYNC, SESSION_SYNC_RESULT, VPN_LIST, VPN_CONNECT, VPN_DISCONNECT, VPN_UPDATE, FILES_LIST, FILES_DOWNLOAD, FILES_LIST_RESULT, FILES_DOWNLOAD_READY, FILES_DOWNLOAD_ERROR, AGENT_EXEC, AGENT_EXEC_RESULT, CLAUDE_CONV_READ, CLAUDE_CONV_DATA, CLAUDE_SESSIONS_LIST, CLAUDE_SESSIONS_RESULT, CLAUDE_HOOK, TMUX_LIST, TMUX_LIST_RESULT, TMUX_KILL, TMUX_KILL_RESULT;
218
+ var AGENT_HEARTBEAT, TERMINAL_OUTPUT, TERMINAL_EXIT, TERMINAL_OPEN, TERMINAL_INPUT, TERMINAL_RESIZE, TERMINAL_CLOSE, SESSION_ATTACH, SESSION_DETACH, SESSION_BUFFER, SESSION_SYNC, SESSION_SYNC_RESULT, VPN_LIST, VPN_CONNECT, VPN_DISCONNECT, VPN_UPDATE, FILES_LIST, FILES_DOWNLOAD, FILES_LIST_RESULT, FILES_DOWNLOAD_READY, FILES_DOWNLOAD_ERROR, AGENT_EXEC, AGENT_EXEC_RESULT, CLAUDE_CONV_READ, CLAUDE_CONV_DATA, CLAUDE_SESSIONS_LIST, CLAUDE_SESSIONS_RESULT, CLAUDE_HOOK, TMUX_LIST, TMUX_LIST_RESULT, TMUX_KILL, TMUX_KILL_RESULT, TMUX_SCROLL;
219
219
  var init_protocol = __esm({
220
220
  "../shared/src/protocol.ts"() {
221
221
  "use strict";
@@ -251,6 +251,7 @@ var init_protocol = __esm({
251
251
  TMUX_LIST_RESULT = "tmux:list:result";
252
252
  TMUX_KILL = "tmux:kill";
253
253
  TMUX_KILL_RESULT = "tmux:kill:result";
254
+ TMUX_SCROLL = "tmux:scroll";
254
255
  }
255
256
  });
256
257
 
@@ -657,6 +658,41 @@ async function killTmuxSession(name) {
657
658
  return { ok: false, error: msg };
658
659
  }
659
660
  }
661
+ async function scrollTmux(name, direction) {
662
+ const bin = resolveTmuxPath();
663
+ if (!bin) return { inCopyMode: false };
664
+ const target = `=${name}`;
665
+ const run = (args) => execFileAsync2(bin, args, { timeout: 4e3 }).catch(() => {
666
+ });
667
+ const inMode = async () => {
668
+ try {
669
+ const { stdout } = await execFileAsync2(bin, ["display-message", "-t", target, "-p", "#{pane_in_mode}"], { timeout: 3e3 });
670
+ return stdout.trim() === "1";
671
+ } catch {
672
+ return false;
673
+ }
674
+ };
675
+ if (direction === "exit") {
676
+ if (await inMode()) await run(["send-keys", "-t", target, "-X", "cancel"]);
677
+ return { inCopyMode: false };
678
+ }
679
+ if (direction === "up") {
680
+ await run(["copy-mode", "-t", target]);
681
+ await run(["send-keys", "-t", target, "-X", "halfpage-up"]);
682
+ return { inCopyMode: true };
683
+ }
684
+ if (!await inMode()) return { inCopyMode: false };
685
+ await run(["send-keys", "-t", target, "-X", "halfpage-down"]);
686
+ try {
687
+ const { stdout } = await execFileAsync2(bin, ["display-message", "-t", target, "-p", "#{scroll_position}"], { timeout: 3e3 });
688
+ if ((parseInt(stdout.trim(), 10) || 0) === 0) {
689
+ await run(["send-keys", "-t", target, "-X", "cancel"]);
690
+ return { inCopyMode: false };
691
+ }
692
+ } catch {
693
+ }
694
+ return { inCopyMode: true };
695
+ }
660
696
  async function enrichWithPanesAndClaude(sessions2) {
661
697
  if (IS_WIN || sessions2.length === 0) return;
662
698
  try {
@@ -1821,7 +1857,7 @@ var init_claude_conversation = __esm({
1821
1857
 
1822
1858
  // src/index.ts
1823
1859
  var index_exports = {};
1824
- var import_socket, config, lock, socket, SESSION_MAX_IDLE_MS, reaperInterval, vpnProfiles;
1860
+ var import_socket, config, lock, socket, SESSION_MAX_IDLE_MS, reaperInterval, sessionTmuxName, sessionInCopyMode, vpnProfiles;
1825
1861
  var init_index = __esm({
1826
1862
  "src/index.ts"() {
1827
1863
  "use strict";
@@ -1911,9 +1947,12 @@ var init_index = __esm({
1911
1947
  socket.emit(CLAUDE_HOOK, payload);
1912
1948
  }
1913
1949
  });
1950
+ sessionTmuxName = /* @__PURE__ */ new Map();
1951
+ sessionInCopyMode = /* @__PURE__ */ new Map();
1914
1952
  socket.on(TERMINAL_OPEN, (payload) => {
1915
1953
  const { sessionId, cols, rows, tmux, launch } = payload;
1916
1954
  if (!sessionId) return;
1955
+ if (tmux) sessionTmuxName.set(sessionId, tmux);
1917
1956
  let launchSpec;
1918
1957
  if (tmux) {
1919
1958
  const spec = buildTmuxLaunch(tmux, launch);
@@ -1937,6 +1976,8 @@ var init_index = __esm({
1937
1976
  },
1938
1977
  (sid, exitCode) => {
1939
1978
  socket.emit(TERMINAL_EXIT, { sessionId: sid, exitCode });
1979
+ sessionTmuxName.delete(sid);
1980
+ sessionInCopyMode.delete(sid);
1940
1981
  },
1941
1982
  launchSpec
1942
1983
  );
@@ -1958,7 +1999,20 @@ var init_index = __esm({
1958
1999
  logger.info({ name, ok: result.ok, error: result.error }, "tmux kill requested");
1959
2000
  socket.emit(TMUX_KILL_RESULT, { requestId, name, ok: result.ok, error: result.error });
1960
2001
  });
2002
+ socket.on(TMUX_SCROLL, async (payload) => {
2003
+ const { sessionId, direction } = payload;
2004
+ const name = sessionId && sessionTmuxName.get(sessionId);
2005
+ if (!name) return;
2006
+ const { inCopyMode } = await scrollTmux(name, direction);
2007
+ sessionInCopyMode.set(sessionId, inCopyMode);
2008
+ });
1961
2009
  socket.on(TERMINAL_INPUT, (payload) => {
2010
+ const name = sessionTmuxName.get(payload.sessionId);
2011
+ if (name && sessionInCopyMode.get(payload.sessionId)) {
2012
+ sessionInCopyMode.set(payload.sessionId, false);
2013
+ scrollTmux(name, "exit").catch(() => {
2014
+ });
2015
+ }
1962
2016
  writeToSession(payload.sessionId, payload.data);
1963
2017
  });
1964
2018
  socket.on(TERMINAL_RESIZE, (payload) => {
@@ -1966,6 +2020,8 @@ var init_index = __esm({
1966
2020
  });
1967
2021
  socket.on(TERMINAL_CLOSE, (payload) => {
1968
2022
  closeSession(payload.sessionId);
2023
+ sessionTmuxName.delete(payload.sessionId);
2024
+ sessionInCopyMode.delete(payload.sessionId);
1969
2025
  });
1970
2026
  socket.on(SESSION_SYNC, () => {
1971
2027
  const aliveIds = getAliveSessionIds();