@towry/mcp 0.1.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/README.md +233 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +427 -0
- package/dist/index.js.map +1 -0
- package/dist/tmux.d.ts +97 -0
- package/dist/tmux.d.ts.map +1 -0
- package/dist/tmux.js +595 -0
- package/dist/tmux.js.map +1 -0
- package/package.json +52 -0
package/dist/tmux.js
ADDED
|
@@ -0,0 +1,595 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tmux CLI Controller - TypeScript port
|
|
3
|
+
*
|
|
4
|
+
* Provides tmux pane management without external Python dependency.
|
|
5
|
+
* Auto-detects whether running inside tmux or not.
|
|
6
|
+
*
|
|
7
|
+
* Keywords: tmux, pane-management, terminal-multiplexer
|
|
8
|
+
*/
|
|
9
|
+
import { spawn } from "node:child_process";
|
|
10
|
+
import * as crypto from "node:crypto";
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Tmux Command Runner
|
|
13
|
+
// ============================================================================
|
|
14
|
+
async function runTmux(args) {
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
const proc = spawn("tmux", args, {
|
|
17
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
18
|
+
shell: false,
|
|
19
|
+
});
|
|
20
|
+
let stdout = "";
|
|
21
|
+
proc.stdout.on("data", (d) => (stdout += d.toString()));
|
|
22
|
+
proc.on("close", (code) => resolve({ stdout: stdout.trim(), exitCode: code ?? 0 }));
|
|
23
|
+
proc.on("error", () => resolve({ stdout: "", exitCode: 1 }));
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// TmuxCLIController - For use inside tmux
|
|
28
|
+
// ============================================================================
|
|
29
|
+
export class TmuxCLIController {
|
|
30
|
+
targetPane = null;
|
|
31
|
+
async getCurrentSession() {
|
|
32
|
+
const { stdout, exitCode } = await runTmux(["display-message", "-p", "#{session_name}"]);
|
|
33
|
+
return exitCode === 0 ? stdout : null;
|
|
34
|
+
}
|
|
35
|
+
async getCurrentWindow() {
|
|
36
|
+
const { stdout, exitCode } = await runTmux(["display-message", "-p", "#{window_name}"]);
|
|
37
|
+
return exitCode === 0 ? stdout : null;
|
|
38
|
+
}
|
|
39
|
+
async getCurrentPane() {
|
|
40
|
+
const { stdout, exitCode } = await runTmux(["display-message", "-p", "#{pane_id}"]);
|
|
41
|
+
return exitCode === 0 ? stdout : null;
|
|
42
|
+
}
|
|
43
|
+
async getCurrentPaneIndex() {
|
|
44
|
+
const { stdout, exitCode } = await runTmux(["display-message", "-p", "#{pane_index}"]);
|
|
45
|
+
return exitCode === 0 ? stdout : null;
|
|
46
|
+
}
|
|
47
|
+
async formatPaneIdentifier(paneId) {
|
|
48
|
+
if (!paneId)
|
|
49
|
+
return paneId;
|
|
50
|
+
try {
|
|
51
|
+
const [session, window, pane] = await Promise.all([
|
|
52
|
+
runTmux(["display-message", "-t", paneId, "-p", "#{session_name}"]),
|
|
53
|
+
runTmux(["display-message", "-t", paneId, "-p", "#{window_index}"]),
|
|
54
|
+
runTmux(["display-message", "-t", paneId, "-p", "#{pane_index}"]),
|
|
55
|
+
]);
|
|
56
|
+
if (session.exitCode === 0 &&
|
|
57
|
+
window.exitCode === 0 &&
|
|
58
|
+
pane.exitCode === 0 &&
|
|
59
|
+
session.stdout &&
|
|
60
|
+
window.stdout &&
|
|
61
|
+
pane.stdout) {
|
|
62
|
+
return `${session.stdout}:${window.stdout}.${pane.stdout}`;
|
|
63
|
+
}
|
|
64
|
+
return paneId;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return paneId;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async resolvePaneIdentifier(identifier) {
|
|
71
|
+
if (!identifier)
|
|
72
|
+
return null;
|
|
73
|
+
identifier = String(identifier);
|
|
74
|
+
// Already a pane ID
|
|
75
|
+
if (identifier.startsWith("%"))
|
|
76
|
+
return identifier;
|
|
77
|
+
// Numeric index
|
|
78
|
+
if (/^\d+$/.test(identifier)) {
|
|
79
|
+
const panes = await this.listPanes();
|
|
80
|
+
const pane = panes.find((p) => p.index === identifier);
|
|
81
|
+
return pane?.id ?? null;
|
|
82
|
+
}
|
|
83
|
+
// session:window.pane format
|
|
84
|
+
if (identifier.includes(":") && identifier.includes(".")) {
|
|
85
|
+
try {
|
|
86
|
+
const { stdout, exitCode } = await runTmux([
|
|
87
|
+
"display-message",
|
|
88
|
+
"-t",
|
|
89
|
+
identifier,
|
|
90
|
+
"-p",
|
|
91
|
+
"#{pane_id}",
|
|
92
|
+
]);
|
|
93
|
+
return exitCode === 0 ? stdout : null;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
async getCurrentWindowId() {
|
|
102
|
+
const currentPane = process.env.TMUX_PANE;
|
|
103
|
+
if (currentPane) {
|
|
104
|
+
const { stdout, exitCode } = await runTmux([
|
|
105
|
+
"display-message",
|
|
106
|
+
"-t",
|
|
107
|
+
currentPane,
|
|
108
|
+
"-p",
|
|
109
|
+
"#{window_id}",
|
|
110
|
+
]);
|
|
111
|
+
return exitCode === 0 ? stdout : null;
|
|
112
|
+
}
|
|
113
|
+
const { stdout, exitCode } = await runTmux(["display-message", "-p", "#{window_id}"]);
|
|
114
|
+
return exitCode === 0 ? stdout : null;
|
|
115
|
+
}
|
|
116
|
+
async listPanes() {
|
|
117
|
+
const target = await this.getCurrentWindowId();
|
|
118
|
+
const format = "#{pane_id}|#{pane_index}|#{pane_title}|#{pane_active}|#{pane_width}x#{pane_height}|#{pane_current_command}";
|
|
119
|
+
const args = target
|
|
120
|
+
? ["list-panes", "-t", target, "-F", format]
|
|
121
|
+
: ["list-panes", "-F", format];
|
|
122
|
+
const { stdout, exitCode } = await runTmux(args);
|
|
123
|
+
if (exitCode !== 0)
|
|
124
|
+
return [];
|
|
125
|
+
const panes = [];
|
|
126
|
+
for (const line of stdout.split("\n")) {
|
|
127
|
+
if (!line)
|
|
128
|
+
continue;
|
|
129
|
+
const parts = line.split("|");
|
|
130
|
+
const paneId = parts[0];
|
|
131
|
+
panes.push({
|
|
132
|
+
id: paneId,
|
|
133
|
+
index: parts[1],
|
|
134
|
+
title: parts[2],
|
|
135
|
+
active: parts[3] === "1",
|
|
136
|
+
size: parts[4],
|
|
137
|
+
command: parts[5] || "",
|
|
138
|
+
formatted_id: await this.formatPaneIdentifier(paneId),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return panes;
|
|
142
|
+
}
|
|
143
|
+
async createPane(vertical = true, size, startCommand) {
|
|
144
|
+
const currentWindowId = await this.getCurrentWindowId();
|
|
145
|
+
const baseCmd = ["split-window"];
|
|
146
|
+
if (currentWindowId)
|
|
147
|
+
baseCmd.push("-t", currentWindowId);
|
|
148
|
+
baseCmd.push(vertical ? "-h" : "-v");
|
|
149
|
+
const sizeFlags = size ? [["-l", `${size}%`], ["-p", String(size)]] : [[]];
|
|
150
|
+
for (const sizeFlag of sizeFlags) {
|
|
151
|
+
const cmd = [...baseCmd];
|
|
152
|
+
if (sizeFlag.length)
|
|
153
|
+
cmd.push(...sizeFlag);
|
|
154
|
+
cmd.push("-P", "-F", "#{pane_id}");
|
|
155
|
+
if (startCommand)
|
|
156
|
+
cmd.push(startCommand);
|
|
157
|
+
const { stdout, exitCode } = await runTmux(cmd);
|
|
158
|
+
if (exitCode === 0 && stdout && stdout.startsWith("%")) {
|
|
159
|
+
this.targetPane = stdout;
|
|
160
|
+
return stdout;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
selectPane(paneId, paneIndex) {
|
|
166
|
+
if (paneId) {
|
|
167
|
+
this.targetPane = paneId;
|
|
168
|
+
}
|
|
169
|
+
else if (paneIndex !== undefined) {
|
|
170
|
+
// Will be resolved later
|
|
171
|
+
this.targetPane = String(paneIndex);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async sendKeys(text, paneId, enter = true, delayEnter = true) {
|
|
175
|
+
const target = paneId || this.targetPane;
|
|
176
|
+
if (!target)
|
|
177
|
+
throw new Error("No target pane specified");
|
|
178
|
+
if (enter && delayEnter) {
|
|
179
|
+
await runTmux(["send-keys", "-l", "-t", target, text]);
|
|
180
|
+
const delay = typeof delayEnter === "number" ? delayEnter : 0.1;
|
|
181
|
+
await new Promise((r) => setTimeout(r, delay * 1000));
|
|
182
|
+
await runTmux(["send-keys", "-t", target, "Enter"]);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
const cmd = ["send-keys", "-l", "-t", target, text];
|
|
186
|
+
if (enter)
|
|
187
|
+
cmd.push("Enter");
|
|
188
|
+
await runTmux(cmd);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async capturePane(paneId, lines) {
|
|
192
|
+
const target = paneId || this.targetPane;
|
|
193
|
+
if (!target)
|
|
194
|
+
throw new Error("No target pane specified");
|
|
195
|
+
const cmd = ["capture-pane", "-t", target, "-p"];
|
|
196
|
+
if (lines)
|
|
197
|
+
cmd.push("-S", `-${lines}`);
|
|
198
|
+
const { stdout } = await runTmux(cmd);
|
|
199
|
+
return stdout;
|
|
200
|
+
}
|
|
201
|
+
async waitForIdle(paneId, idleTime = 2.0, checkInterval = 0.5, timeout) {
|
|
202
|
+
const target = paneId || this.targetPane;
|
|
203
|
+
if (!target)
|
|
204
|
+
throw new Error("No target pane specified");
|
|
205
|
+
const startTime = Date.now();
|
|
206
|
+
let lastChangeTime = Date.now();
|
|
207
|
+
let lastHash = "";
|
|
208
|
+
while (true) {
|
|
209
|
+
if (timeout && Date.now() - startTime > timeout * 1000)
|
|
210
|
+
return false;
|
|
211
|
+
const content = await this.capturePane(target);
|
|
212
|
+
const contentHash = crypto.createHash("md5").update(content).digest("hex");
|
|
213
|
+
if (contentHash !== lastHash) {
|
|
214
|
+
lastHash = contentHash;
|
|
215
|
+
lastChangeTime = Date.now();
|
|
216
|
+
}
|
|
217
|
+
else if (Date.now() - lastChangeTime >= idleTime * 1000) {
|
|
218
|
+
return true;
|
|
219
|
+
}
|
|
220
|
+
await new Promise((r) => setTimeout(r, checkInterval * 1000));
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async killPane(paneId) {
|
|
224
|
+
const target = paneId || this.targetPane;
|
|
225
|
+
if (!target)
|
|
226
|
+
throw new Error("No target pane specified");
|
|
227
|
+
if (paneId) {
|
|
228
|
+
const currentPane = await this.getCurrentPane();
|
|
229
|
+
if (currentPane && target === currentPane) {
|
|
230
|
+
throw new Error("Cannot kill own pane!");
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
await runTmux(["kill-pane", "-t", target]);
|
|
234
|
+
if (target === this.targetPane) {
|
|
235
|
+
this.targetPane = null;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
async sendInterrupt(paneId) {
|
|
239
|
+
const target = paneId || this.targetPane;
|
|
240
|
+
if (!target)
|
|
241
|
+
throw new Error("No target pane specified");
|
|
242
|
+
await runTmux(["send-keys", "-t", target, "C-c"]);
|
|
243
|
+
}
|
|
244
|
+
async sendEscape(paneId) {
|
|
245
|
+
const target = paneId || this.targetPane;
|
|
246
|
+
if (!target)
|
|
247
|
+
throw new Error("No target pane specified");
|
|
248
|
+
await runTmux(["send-keys", "-t", target, "Escape"]);
|
|
249
|
+
}
|
|
250
|
+
async launchCli(command, vertical = true, size = 50) {
|
|
251
|
+
const paneId = await this.createPane(vertical, size, command);
|
|
252
|
+
if (paneId) {
|
|
253
|
+
const formattedId = await this.formatPaneIdentifier(paneId);
|
|
254
|
+
return { paneId, formattedId };
|
|
255
|
+
}
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// ============================================================================
|
|
260
|
+
// RemoteTmuxController - For use outside tmux
|
|
261
|
+
// ============================================================================
|
|
262
|
+
export class RemoteTmuxController {
|
|
263
|
+
sessionName;
|
|
264
|
+
targetWindow = null;
|
|
265
|
+
constructor(sessionName = "remote-cli-session") {
|
|
266
|
+
this.sessionName = sessionName;
|
|
267
|
+
}
|
|
268
|
+
async ensureSession() {
|
|
269
|
+
const { exitCode } = await runTmux(["has-session", "-t", this.sessionName]);
|
|
270
|
+
if (exitCode !== 0) {
|
|
271
|
+
await runTmux([
|
|
272
|
+
"new-session",
|
|
273
|
+
"-d",
|
|
274
|
+
"-s",
|
|
275
|
+
this.sessionName,
|
|
276
|
+
"-P",
|
|
277
|
+
"-F",
|
|
278
|
+
"#{session_name}",
|
|
279
|
+
]);
|
|
280
|
+
this.targetWindow = `${this.sessionName}:0`;
|
|
281
|
+
}
|
|
282
|
+
else if (!this.targetWindow) {
|
|
283
|
+
const { stdout, exitCode: code2 } = await runTmux([
|
|
284
|
+
"display-message",
|
|
285
|
+
"-p",
|
|
286
|
+
"-t",
|
|
287
|
+
this.sessionName,
|
|
288
|
+
"#{session_name}:#{window_index}",
|
|
289
|
+
]);
|
|
290
|
+
if (code2 === 0 && stdout) {
|
|
291
|
+
this.targetWindow = stdout;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
async windowTarget(pane) {
|
|
296
|
+
await this.ensureSession();
|
|
297
|
+
if (!pane) {
|
|
298
|
+
if (this.targetWindow)
|
|
299
|
+
return this.targetWindow;
|
|
300
|
+
const { stdout, exitCode } = await runTmux([
|
|
301
|
+
"display-message",
|
|
302
|
+
"-p",
|
|
303
|
+
"-t",
|
|
304
|
+
this.sessionName,
|
|
305
|
+
"#{session_name}:#{window_index}",
|
|
306
|
+
]);
|
|
307
|
+
if (exitCode === 0 && stdout) {
|
|
308
|
+
this.targetWindow = stdout;
|
|
309
|
+
return stdout;
|
|
310
|
+
}
|
|
311
|
+
return `${this.sessionName}:0`;
|
|
312
|
+
}
|
|
313
|
+
if (/^\d+$/.test(pane)) {
|
|
314
|
+
return `${this.sessionName}:${pane}`;
|
|
315
|
+
}
|
|
316
|
+
return pane;
|
|
317
|
+
}
|
|
318
|
+
async listPanes() {
|
|
319
|
+
await this.ensureSession();
|
|
320
|
+
const { stdout, exitCode } = await runTmux([
|
|
321
|
+
"list-windows",
|
|
322
|
+
"-t",
|
|
323
|
+
this.sessionName,
|
|
324
|
+
"-F",
|
|
325
|
+
"#{window_index}|#{window_name}|#{window_active}|#{window_width}x#{window_height}",
|
|
326
|
+
]);
|
|
327
|
+
if (exitCode !== 0 || !stdout)
|
|
328
|
+
return [];
|
|
329
|
+
const windows = [];
|
|
330
|
+
for (const line of stdout.split("\n")) {
|
|
331
|
+
if (!line)
|
|
332
|
+
continue;
|
|
333
|
+
const [idx, name, active, size] = line.split("|");
|
|
334
|
+
windows.push({
|
|
335
|
+
id: `${this.sessionName}:${idx}`,
|
|
336
|
+
index: idx,
|
|
337
|
+
title: name,
|
|
338
|
+
active: active === "1",
|
|
339
|
+
size,
|
|
340
|
+
command: "",
|
|
341
|
+
formatted_id: `${this.sessionName}:${idx}`,
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
return windows;
|
|
345
|
+
}
|
|
346
|
+
async launchCli(command, name) {
|
|
347
|
+
await this.ensureSession();
|
|
348
|
+
const args = [
|
|
349
|
+
"new-window",
|
|
350
|
+
"-t",
|
|
351
|
+
this.sessionName,
|
|
352
|
+
"-P",
|
|
353
|
+
"-F",
|
|
354
|
+
"#{session_name}:#{window_index}",
|
|
355
|
+
];
|
|
356
|
+
if (name)
|
|
357
|
+
args.push("-n", name);
|
|
358
|
+
if (command)
|
|
359
|
+
args.push(command);
|
|
360
|
+
const { stdout, exitCode } = await runTmux(args);
|
|
361
|
+
if (exitCode === 0 && stdout) {
|
|
362
|
+
this.targetWindow = stdout;
|
|
363
|
+
return stdout;
|
|
364
|
+
}
|
|
365
|
+
return null;
|
|
366
|
+
}
|
|
367
|
+
async sendKeys(text, paneId, enter = true, delayEnter = true) {
|
|
368
|
+
if (!text)
|
|
369
|
+
return;
|
|
370
|
+
const target = await this.windowTarget(paneId);
|
|
371
|
+
if (enter && delayEnter) {
|
|
372
|
+
await runTmux(["send-keys", "-l", "-t", target, text]);
|
|
373
|
+
const delay = typeof delayEnter === "number" ? delayEnter : 0.1;
|
|
374
|
+
await new Promise((r) => setTimeout(r, delay * 1000));
|
|
375
|
+
await runTmux(["send-keys", "-t", target, "Enter"]);
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
const args = ["send-keys", "-l", "-t", target, text];
|
|
379
|
+
if (enter)
|
|
380
|
+
args.push("Enter");
|
|
381
|
+
await runTmux(args);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
async capturePane(paneId, lines) {
|
|
385
|
+
const target = await this.windowTarget(paneId);
|
|
386
|
+
const args = ["capture-pane", "-t", target, "-p"];
|
|
387
|
+
if (lines)
|
|
388
|
+
args.push("-S", `-${lines}`);
|
|
389
|
+
const { stdout } = await runTmux(args);
|
|
390
|
+
return stdout;
|
|
391
|
+
}
|
|
392
|
+
async waitForIdle(paneId, idleTime = 2.0, checkInterval = 0.5, timeout) {
|
|
393
|
+
const target = await this.windowTarget(paneId);
|
|
394
|
+
const startTime = Date.now();
|
|
395
|
+
let lastChange = Date.now();
|
|
396
|
+
let lastHash = "";
|
|
397
|
+
while (true) {
|
|
398
|
+
if (timeout && Date.now() - startTime > timeout * 1000)
|
|
399
|
+
return false;
|
|
400
|
+
const { stdout } = await runTmux(["capture-pane", "-t", target, "-p"]);
|
|
401
|
+
const h = crypto.createHash("md5").update(stdout).digest("hex");
|
|
402
|
+
if (h !== lastHash) {
|
|
403
|
+
lastHash = h;
|
|
404
|
+
lastChange = Date.now();
|
|
405
|
+
}
|
|
406
|
+
else if (Date.now() - lastChange >= idleTime * 1000) {
|
|
407
|
+
return true;
|
|
408
|
+
}
|
|
409
|
+
await new Promise((r) => setTimeout(r, checkInterval * 1000));
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
async sendInterrupt(paneId) {
|
|
413
|
+
const target = await this.windowTarget(paneId);
|
|
414
|
+
await runTmux(["send-keys", "-t", target, "C-c"]);
|
|
415
|
+
}
|
|
416
|
+
async sendEscape(paneId) {
|
|
417
|
+
const target = await this.windowTarget(paneId);
|
|
418
|
+
await runTmux(["send-keys", "-t", target, "Escape"]);
|
|
419
|
+
}
|
|
420
|
+
async killWindow(windowId) {
|
|
421
|
+
const target = await this.windowTarget(windowId);
|
|
422
|
+
await runTmux(["kill-window", "-t", target]);
|
|
423
|
+
if (this.targetWindow === target) {
|
|
424
|
+
this.targetWindow = null;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
async attachSession() {
|
|
428
|
+
await this.ensureSession();
|
|
429
|
+
spawn("tmux", ["attach-session", "-t", this.sessionName], {
|
|
430
|
+
stdio: "inherit",
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
async cleanupSession() {
|
|
434
|
+
await runTmux(["kill-session", "-t", this.sessionName]);
|
|
435
|
+
this.targetWindow = null;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
// ============================================================================
|
|
439
|
+
// Unified CLI Interface
|
|
440
|
+
// ============================================================================
|
|
441
|
+
export class TmuxCLI {
|
|
442
|
+
controller;
|
|
443
|
+
mode;
|
|
444
|
+
inTmux;
|
|
445
|
+
constructor(session) {
|
|
446
|
+
this.inTmux = Boolean(process.env.TMUX);
|
|
447
|
+
if (this.inTmux) {
|
|
448
|
+
this.controller = new TmuxCLIController();
|
|
449
|
+
this.mode = "local";
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
this.controller = new RemoteTmuxController(session || "remote-cli-session");
|
|
453
|
+
this.mode = "remote";
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
async listTmuxPanes() {
|
|
457
|
+
return this.controller.listPanes();
|
|
458
|
+
}
|
|
459
|
+
async launchTmuxPane(command, options = {}) {
|
|
460
|
+
const { vertical = true, size = 50, name } = options;
|
|
461
|
+
if (this.mode === "local") {
|
|
462
|
+
const ctrl = this.controller;
|
|
463
|
+
const result = await ctrl.launchCli(command, vertical, size);
|
|
464
|
+
return result?.paneId ?? null;
|
|
465
|
+
}
|
|
466
|
+
else {
|
|
467
|
+
const ctrl = this.controller;
|
|
468
|
+
return ctrl.launchCli(command, name);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
async sendTmuxKeys(text, options = {}) {
|
|
472
|
+
const { pane, enter = true, delayEnter = true } = options;
|
|
473
|
+
if (this.mode === "local") {
|
|
474
|
+
const ctrl = this.controller;
|
|
475
|
+
if (pane) {
|
|
476
|
+
const resolved = await ctrl.resolvePaneIdentifier(pane);
|
|
477
|
+
if (!resolved)
|
|
478
|
+
throw new Error(`Could not resolve pane identifier: ${pane}`);
|
|
479
|
+
ctrl.selectPane(resolved);
|
|
480
|
+
}
|
|
481
|
+
await ctrl.sendKeys(text, undefined, enter, delayEnter);
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
const ctrl = this.controller;
|
|
485
|
+
await ctrl.sendKeys(text, pane, enter, delayEnter);
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
async captureTmuxPane(options = {}) {
|
|
489
|
+
const { pane, lines } = options;
|
|
490
|
+
if (this.mode === "local") {
|
|
491
|
+
const ctrl = this.controller;
|
|
492
|
+
if (pane) {
|
|
493
|
+
const resolved = await ctrl.resolvePaneIdentifier(pane);
|
|
494
|
+
if (!resolved)
|
|
495
|
+
throw new Error(`Could not resolve pane identifier: ${pane}`);
|
|
496
|
+
ctrl.selectPane(resolved);
|
|
497
|
+
}
|
|
498
|
+
return ctrl.capturePane(undefined, lines);
|
|
499
|
+
}
|
|
500
|
+
else {
|
|
501
|
+
const ctrl = this.controller;
|
|
502
|
+
return ctrl.capturePane(pane, lines);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
async interruptTmuxPane(pane) {
|
|
506
|
+
if (this.mode === "local") {
|
|
507
|
+
const ctrl = this.controller;
|
|
508
|
+
if (pane) {
|
|
509
|
+
const resolved = await ctrl.resolvePaneIdentifier(pane);
|
|
510
|
+
if (!resolved)
|
|
511
|
+
throw new Error(`Could not resolve pane identifier: ${pane}`);
|
|
512
|
+
ctrl.selectPane(resolved);
|
|
513
|
+
}
|
|
514
|
+
await ctrl.sendInterrupt();
|
|
515
|
+
}
|
|
516
|
+
else {
|
|
517
|
+
const ctrl = this.controller;
|
|
518
|
+
await ctrl.sendInterrupt(pane);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
async escapeTmuxPane(pane) {
|
|
522
|
+
if (this.mode === "local") {
|
|
523
|
+
const ctrl = this.controller;
|
|
524
|
+
if (pane) {
|
|
525
|
+
const resolved = await ctrl.resolvePaneIdentifier(pane);
|
|
526
|
+
if (!resolved)
|
|
527
|
+
throw new Error(`Could not resolve pane identifier: ${pane}`);
|
|
528
|
+
ctrl.selectPane(resolved);
|
|
529
|
+
}
|
|
530
|
+
await ctrl.sendEscape();
|
|
531
|
+
}
|
|
532
|
+
else {
|
|
533
|
+
const ctrl = this.controller;
|
|
534
|
+
await ctrl.sendEscape(pane);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
async killTmuxPane(pane) {
|
|
538
|
+
if (this.mode === "local") {
|
|
539
|
+
const ctrl = this.controller;
|
|
540
|
+
if (pane) {
|
|
541
|
+
const resolved = await ctrl.resolvePaneIdentifier(pane);
|
|
542
|
+
if (!resolved)
|
|
543
|
+
throw new Error(`Could not resolve pane identifier: ${pane}`);
|
|
544
|
+
ctrl.selectPane(resolved);
|
|
545
|
+
}
|
|
546
|
+
await ctrl.killPane();
|
|
547
|
+
}
|
|
548
|
+
else {
|
|
549
|
+
const ctrl = this.controller;
|
|
550
|
+
await ctrl.killWindow(pane);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
async waitTmuxPaneIdle(options = {}) {
|
|
554
|
+
const { pane, idleTime = 2.0, timeout } = options;
|
|
555
|
+
if (this.mode === "local") {
|
|
556
|
+
const ctrl = this.controller;
|
|
557
|
+
if (pane) {
|
|
558
|
+
const resolved = await ctrl.resolvePaneIdentifier(pane);
|
|
559
|
+
if (!resolved)
|
|
560
|
+
throw new Error(`Could not resolve pane identifier: ${pane}`);
|
|
561
|
+
ctrl.selectPane(resolved);
|
|
562
|
+
}
|
|
563
|
+
return ctrl.waitForIdle(undefined, idleTime, 0.5, timeout);
|
|
564
|
+
}
|
|
565
|
+
else {
|
|
566
|
+
const ctrl = this.controller;
|
|
567
|
+
return ctrl.waitForIdle(pane, idleTime, 0.5, timeout);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
// ============================================================================
|
|
572
|
+
// Helper Functions (for MCP tools)
|
|
573
|
+
// ============================================================================
|
|
574
|
+
export async function getCurrentPaneInfo() {
|
|
575
|
+
const paneId = process.env.TMUX_PANE;
|
|
576
|
+
if (!paneId)
|
|
577
|
+
return { id: "", title: "" };
|
|
578
|
+
const { stdout } = await runTmux(["display-message", "-p", "-t", paneId, "#{pane_title}"]);
|
|
579
|
+
return { id: paneId, title: stdout };
|
|
580
|
+
}
|
|
581
|
+
export function shellQuote(s) {
|
|
582
|
+
return `'${s.replace(/'/g, `"'"'"'`)}'`;
|
|
583
|
+
}
|
|
584
|
+
export function parseLaunchPaneIds(stdout) {
|
|
585
|
+
const newFormatMatch = stdout.match(/in pane\s+(%\d+)\s+\(([^)]+)\)/);
|
|
586
|
+
if (newFormatMatch) {
|
|
587
|
+
return { paneId: newFormatMatch[1], paneFormattedId: newFormatMatch[2] };
|
|
588
|
+
}
|
|
589
|
+
const rawIdMatch = stdout.match(/in pane\s+(%\d+)/);
|
|
590
|
+
const paneId = rawIdMatch?.[1];
|
|
591
|
+
const formattedPaneMatch = stdout.match(/in pane\s+([^\s]+)$/);
|
|
592
|
+
const paneFormattedId = formattedPaneMatch?.[1];
|
|
593
|
+
return { paneId, paneFormattedId };
|
|
594
|
+
}
|
|
595
|
+
//# sourceMappingURL=tmux.js.map
|
package/dist/tmux.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../src/tmux.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@towry/mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP server implementation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"towry-mcp": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"keywords": [
|
|
21
|
+
"mcp",
|
|
22
|
+
"model-context-protocol",
|
|
23
|
+
"ai",
|
|
24
|
+
"llm"
|
|
25
|
+
],
|
|
26
|
+
"author": "towry",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+https://github.com/towry/dots.git",
|
|
31
|
+
"directory": "packages/mcp"
|
|
32
|
+
},
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=18"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
38
|
+
"zod": "^4.3.6"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/node": "^25.0.10",
|
|
42
|
+
"oxlint": "^1.41.0",
|
|
43
|
+
"typescript": "^5.9.3"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsc",
|
|
47
|
+
"dev": "tsc --watch",
|
|
48
|
+
"lint": "oxlint src/",
|
|
49
|
+
"typecheck": "tsc --noEmit",
|
|
50
|
+
"inspect": "pnpm dlx @modelcontextprotocol/inspector node dist/index.js"
|
|
51
|
+
}
|
|
52
|
+
}
|