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 +58 -2
- package/dist/cli.js.map +1 -1
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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();
|