@cotal-ai/manager 0.9.0 → 0.10.0
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/commands.d.ts +0 -25
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +24 -282
- package/dist/commands.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/manager.d.ts +79 -2
- package/dist/manager.d.ts.map +1 -1
- package/dist/manager.js +260 -17
- package/dist/manager.js.map +1 -1
- package/package.json +7 -5
- package/dist/attach-client.d.ts +0 -7
- package/dist/attach-client.d.ts.map +0 -1
- package/dist/attach-client.js +0 -172
- package/dist/attach-client.js.map +0 -1
package/dist/attach-client.js
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import WebSocket from "ws";
|
|
2
|
-
/** Detach key — Ctrl-] (0x1d), as in telnet/ssh escape conventions. */
|
|
3
|
-
const DETACH = 0x1d;
|
|
4
|
-
/**
|
|
5
|
-
* Terminal modes a full-screen child (e.g. Claude's TUI) commonly turns on but that we must undo
|
|
6
|
-
* locally on detach/exit: the agent keeps running after Ctrl-], so it never restores OUR terminal.
|
|
7
|
-
* Without this, detaching from a mouse-tracking TUI leaves the terminal reporting every cursor move
|
|
8
|
-
* as input (a stream of `ESC[<…M` escape codes), or its focus in/out as `ESC[I`/`ESC[O`. Disables
|
|
9
|
-
* all mouse-report modes + focus reporting + bracketed paste, resets the keypad/cursor-key modes,
|
|
10
|
-
* shows the cursor, and resets attributes. Deliberately does NOT toggle the alternate screen.
|
|
11
|
-
*/
|
|
12
|
-
const MOUSE_OFF = "\x1b[?1000l\x1b[?1002l\x1b[?1003l\x1b[?1005l\x1b[?1006l\x1b[?1015l"; // all mouse tracking off
|
|
13
|
-
const RESTORE = MOUSE_OFF +
|
|
14
|
-
"\x1b[?1004l" + // focus reporting off
|
|
15
|
-
"\x1b[?2004l" + // bracketed paste off
|
|
16
|
-
"\x1b[?1l" + // application cursor keys off (DECCKM): a full-screen TUI enables it; left on, arrows emit ESC O A not ESC [ A
|
|
17
|
-
"\x1b>" + // keypad → numeric (DECKPNM)
|
|
18
|
-
"\x1b[?25h" + // show cursor
|
|
19
|
-
"\x1b[0m"; // reset attributes
|
|
20
|
-
// Wheel-scroll for full-screen children. A full-screen TUI (e.g. OpenCode) runs in the alternate
|
|
21
|
-
// screen — where the terminal's native scrollback is dead — and scrolls its content itself off mouse
|
|
22
|
-
// reports. But it enables that mouse capture on ITS pty, and the enable doesn't reliably survive the
|
|
23
|
-
// attach hop (backlog eviction / nested pty), so our terminal never reports the wheel and scrolling
|
|
24
|
-
// dies. So while the child is in the alternate screen we enable SGR mouse reporting on OUR terminal
|
|
25
|
-
// and translate each wheel tick into PageUp/PageDown — the keystrokes every full-screen TUI treats
|
|
26
|
-
// as "scroll the view" (OpenCode: `messages_page_up`/`_down`). Inline children (Claude) never enter
|
|
27
|
-
// the alt-screen, so this stays off and their native terminal-scrollback wheel is untouched.
|
|
28
|
-
const MOUSE_ON = "\x1b[?1002h\x1b[?1006h"; // button+drag tracking, SGR encoding
|
|
29
|
-
const PAGE_UP = "\x1b[5~";
|
|
30
|
-
const PAGE_DOWN = "\x1b[6~";
|
|
31
|
-
// Enter/leave the alternate screen: xterm `?1049`, plus the older `?1047`/`?47`.
|
|
32
|
-
const ALT_ENTER = /\x1b\[\?(?:1049|1047|47)h/g;
|
|
33
|
-
const ALT_LEAVE = /\x1b\[\?(?:1049|1047|47)l/g;
|
|
34
|
-
// A complete SGR mouse report: `ESC [ < btn ; col ; row (M|m)`.
|
|
35
|
-
const SGR_MOUSE = /^\x1b\[<(\d+);\d+;\d+[Mm]/;
|
|
36
|
-
const lastIndexOfRe = (re, s) => {
|
|
37
|
-
re.lastIndex = 0;
|
|
38
|
-
let last = -1;
|
|
39
|
-
for (let m = re.exec(s); m; m = re.exec(s))
|
|
40
|
-
last = m.index;
|
|
41
|
-
return last;
|
|
42
|
-
};
|
|
43
|
-
/**
|
|
44
|
-
* Drive a manager's attach endpoint from the terminal: raw-mode stdin streams to
|
|
45
|
-
* the PTY, PTY output streams to stdout, and SIGWINCH-style resizes are forwarded.
|
|
46
|
-
* Ctrl-] detaches without killing the agent.
|
|
47
|
-
*/
|
|
48
|
-
export function attachClient(url) {
|
|
49
|
-
return new Promise((resolve, reject) => {
|
|
50
|
-
const ws = new WebSocket(url);
|
|
51
|
-
const stdin = process.stdin;
|
|
52
|
-
const wasRaw = stdin.isRaw ?? false;
|
|
53
|
-
// A broken local pipe (terminal closed / SIGHUP) makes stdout writes async-error on a later
|
|
54
|
-
// tick; with no listener that EPIPE/EIO becomes an uncaughtException — crashing on the per-frame
|
|
55
|
-
// PTY write or the on-detach restore write. Register a no-op listener once here (not in cleanup,
|
|
56
|
-
// so it outlives the async error tick) to turn it into a handled no-op.
|
|
57
|
-
process.stdout.on("error", () => { });
|
|
58
|
-
// Wheel-scroll state (see MOUSE_ON above): whether the child is in the alternate screen, and a
|
|
59
|
-
// buffer for an SGR mouse report split across stdin reads.
|
|
60
|
-
let altScreen = false;
|
|
61
|
-
let mouseBuf = "";
|
|
62
|
-
// Carry the tail of the previous output frame so an alt-screen escape split across ws frames
|
|
63
|
-
// (e.g. `ESC[?10` then `49h`) is still detected; 16 bytes covers these private-mode sequences.
|
|
64
|
-
// Acting only on state *change* below makes re-scanning the carried bytes idempotent.
|
|
65
|
-
let scanTail = "";
|
|
66
|
-
// Track the child's alt-screen transitions in its output so we can arm/disarm wheel translation.
|
|
67
|
-
const trackAltScreen = (data) => {
|
|
68
|
-
const s = scanTail + data.toString("latin1");
|
|
69
|
-
scanTail = s.slice(-16);
|
|
70
|
-
const enter = lastIndexOfRe(ALT_ENTER, s);
|
|
71
|
-
const leave = lastIndexOfRe(ALT_LEAVE, s);
|
|
72
|
-
if (enter === -1 && leave === -1)
|
|
73
|
-
return;
|
|
74
|
-
const nowAlt = enter > leave;
|
|
75
|
-
if (nowAlt === altScreen)
|
|
76
|
-
return;
|
|
77
|
-
altScreen = nowAlt;
|
|
78
|
-
if (altScreen) {
|
|
79
|
-
if (process.stdout.isTTY)
|
|
80
|
-
process.stdout.write(MOUSE_ON);
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
// Leaving alt-screen mid-session: undo the mouse modes WE enabled so the terminal stops
|
|
84
|
-
// reporting the wheel/clicks and native scrollback works again — don't wait for detach.
|
|
85
|
-
mouseBuf = "";
|
|
86
|
-
if (process.stdout.isTTY)
|
|
87
|
-
process.stdout.write(MOUSE_OFF);
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
const sendResize = () => ws.send(`r:${process.stdout.columns ?? 80},${process.stdout.rows ?? 24}`);
|
|
91
|
-
const onInput = (d) => {
|
|
92
|
-
if (d.length === 1 && d[0] === DETACH) {
|
|
93
|
-
ws.close();
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
// Inline child: forward keystrokes raw (its wheel scrolls the local terminal, not the app).
|
|
97
|
-
if (!altScreen) {
|
|
98
|
-
ws.send(d);
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
// Full-screen child: rewrite wheel reports to PageUp/PageDown, pass everything else through.
|
|
102
|
-
mouseBuf += d.toString("latin1");
|
|
103
|
-
let out = "";
|
|
104
|
-
for (;;) {
|
|
105
|
-
const i = mouseBuf.indexOf("\x1b[<");
|
|
106
|
-
if (i === -1) {
|
|
107
|
-
// A report split right before `<` (`ESC[` now, `<…M` next) would slip through untranslated:
|
|
108
|
-
// hold a trailing `ESC[` for the next read. Never hold a bare trailing `ESC` — that's the
|
|
109
|
-
// Escape key and must forward at once (e.g. OpenCode's interrupt); the rarer `ESC`|`[<…`
|
|
110
|
-
// split stays raw by design.
|
|
111
|
-
const keep = mouseBuf.endsWith("\x1b[") ? 2 : 0;
|
|
112
|
-
out += mouseBuf.slice(0, mouseBuf.length - keep);
|
|
113
|
-
mouseBuf = mouseBuf.slice(mouseBuf.length - keep);
|
|
114
|
-
break;
|
|
115
|
-
}
|
|
116
|
-
out += mouseBuf.slice(0, i);
|
|
117
|
-
const rest = mouseBuf.slice(i);
|
|
118
|
-
const m = SGR_MOUSE.exec(rest);
|
|
119
|
-
if (!m) {
|
|
120
|
-
// Hold only a still-valid partial report (`ESC[<` + digits/semicolons) for the next read;
|
|
121
|
-
// anything else can't become an SGR mouse report, so pass it straight through.
|
|
122
|
-
if (/^\x1b\[<[\d;]*$/.test(rest))
|
|
123
|
-
mouseBuf = rest;
|
|
124
|
-
else {
|
|
125
|
-
out += rest;
|
|
126
|
-
mouseBuf = "";
|
|
127
|
-
}
|
|
128
|
-
break;
|
|
129
|
-
}
|
|
130
|
-
const btn = Number(m[1]);
|
|
131
|
-
if (btn & 0x40)
|
|
132
|
-
out += btn & 1 ? PAGE_DOWN : PAGE_UP; // wheel: 64=up, 65=down
|
|
133
|
-
else
|
|
134
|
-
out += m[0]; // other mouse (click/drag): forward raw so the TUI still gets it
|
|
135
|
-
mouseBuf = rest.slice(m[0].length);
|
|
136
|
-
}
|
|
137
|
-
if (out)
|
|
138
|
-
ws.send(Buffer.from(out, "latin1"));
|
|
139
|
-
};
|
|
140
|
-
const cleanup = () => {
|
|
141
|
-
stdin.off("data", onInput);
|
|
142
|
-
process.stdout.off("resize", sendResize);
|
|
143
|
-
// Undo terminal modes the (still-running) agent's TUI enabled — it won't restore us on detach.
|
|
144
|
-
if (process.stdout.isTTY)
|
|
145
|
-
process.stdout.write(RESTORE);
|
|
146
|
-
if (stdin.isTTY)
|
|
147
|
-
stdin.setRawMode(wasRaw);
|
|
148
|
-
stdin.pause();
|
|
149
|
-
};
|
|
150
|
-
ws.on("open", () => {
|
|
151
|
-
if (stdin.isTTY)
|
|
152
|
-
stdin.setRawMode(true);
|
|
153
|
-
stdin.resume();
|
|
154
|
-
sendResize();
|
|
155
|
-
process.stdout.on("resize", sendResize);
|
|
156
|
-
stdin.on("data", onInput);
|
|
157
|
-
});
|
|
158
|
-
ws.on("message", (data) => {
|
|
159
|
-
trackAltScreen(data);
|
|
160
|
-
process.stdout.write(data);
|
|
161
|
-
});
|
|
162
|
-
ws.on("close", () => {
|
|
163
|
-
cleanup();
|
|
164
|
-
resolve();
|
|
165
|
-
});
|
|
166
|
-
ws.on("error", (e) => {
|
|
167
|
-
cleanup();
|
|
168
|
-
reject(e);
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
//# sourceMappingURL=attach-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"attach-client.js","sourceRoot":"","sources":["../src/attach-client.ts"],"names":[],"mappings":"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"}
|