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/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/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();
|