@ellery/terminal-mcp 0.2.1 → 0.3.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 +301 -9
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +2 -61
- package/dist/client.js.map +1 -1
- package/dist/index.js +286 -14
- package/dist/index.js.map +1 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +8 -0
- package/dist/prompts/index.js.map +1 -1
- package/dist/recording/index.d.ts +4 -0
- package/dist/recording/index.d.ts.map +1 -0
- package/dist/recording/index.js +3 -0
- package/dist/recording/index.js.map +1 -0
- package/dist/recording/manager.d.ts +62 -0
- package/dist/recording/manager.d.ts.map +1 -0
- package/dist/recording/manager.js +123 -0
- package/dist/recording/manager.js.map +1 -0
- package/dist/recording/recorder.d.ts +95 -0
- package/dist/recording/recorder.d.ts.map +1 -0
- package/dist/recording/recorder.js +296 -0
- package/dist/recording/recorder.js.map +1 -0
- package/dist/recording/types.d.ts +65 -0
- package/dist/recording/types.d.ts.map +1 -0
- package/dist/recording/types.js +2 -0
- package/dist/recording/types.js.map +1 -0
- package/dist/sandbox/config.d.ts +46 -0
- package/dist/sandbox/config.d.ts.map +1 -0
- package/dist/sandbox/config.js +144 -0
- package/dist/sandbox/config.js.map +1 -0
- package/dist/sandbox/controller.d.ts +72 -0
- package/dist/sandbox/controller.d.ts.map +1 -0
- package/dist/sandbox/controller.js +208 -0
- package/dist/sandbox/controller.js.map +1 -0
- package/dist/sandbox/index.d.ts +6 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +4 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/prompt.d.ts +10 -0
- package/dist/sandbox/prompt.d.ts.map +1 -0
- package/dist/sandbox/prompt.js +434 -0
- package/dist/sandbox/prompt.js.map +1 -0
- package/dist/server.d.ts +2 -3
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +21 -0
- package/dist/server.js.map +1 -1
- package/dist/terminal/index.d.ts +1 -0
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/manager.d.ts +89 -31
- package/dist/terminal/manager.d.ts.map +1 -1
- package/dist/terminal/manager.js +313 -44
- package/dist/terminal/manager.js.map +1 -1
- package/dist/terminal/session.d.ts +34 -1
- package/dist/terminal/session.d.ts.map +1 -1
- package/dist/terminal/session.js +160 -3
- package/dist/terminal/session.js.map +1 -1
- package/dist/tools/createSession.d.ts +44 -0
- package/dist/tools/createSession.d.ts.map +1 -0
- package/dist/tools/createSession.js +41 -0
- package/dist/tools/createSession.js.map +1 -0
- package/dist/tools/definitions.d.ts +18 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +116 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/destroySession.d.ts +31 -0
- package/dist/tools/destroySession.d.ts.map +1 -0
- package/dist/tools/destroySession.js +32 -0
- package/dist/tools/destroySession.js.map +1 -0
- package/dist/tools/getContent.d.ts +7 -0
- package/dist/tools/getContent.d.ts.map +1 -1
- package/dist/tools/getContent.js +8 -3
- package/dist/tools/getContent.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +26 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/listSessions.d.ts +19 -0
- package/dist/tools/listSessions.d.ts.map +1 -0
- package/dist/tools/listSessions.js +23 -0
- package/dist/tools/listSessions.js.map +1 -0
- package/dist/tools/screenshot.d.ts +26 -3
- package/dist/tools/screenshot.d.ts.map +1 -1
- package/dist/tools/screenshot.js +55 -5
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/sendKey.d.ts +7 -0
- package/dist/tools/sendKey.d.ts.map +1 -1
- package/dist/tools/sendKey.js +7 -2
- package/dist/tools/sendKey.js.map +1 -1
- package/dist/tools/startRecording.d.ts +68 -0
- package/dist/tools/startRecording.d.ts.map +1 -0
- package/dist/tools/startRecording.js +111 -0
- package/dist/tools/startRecording.js.map +1 -0
- package/dist/tools/stopRecording.d.ts +31 -0
- package/dist/tools/stopRecording.d.ts.map +1 -0
- package/dist/tools/stopRecording.js +76 -0
- package/dist/tools/stopRecording.js.map +1 -0
- package/dist/tools/type.d.ts +7 -0
- package/dist/tools/type.d.ts.map +1 -1
- package/dist/tools/type.js +7 -2
- package/dist/tools/type.js.map +1 -1
- package/dist/transport/socket.d.ts.map +1 -1
- package/dist/transport/socket.js +10 -0
- package/dist/transport/socket.js.map +1 -1
- package/dist/ui/index.d.ts +1 -0
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +17 -1
- package/dist/ui/index.js.map +1 -1
- package/dist/utils/platform.d.ts +6 -0
- package/dist/utils/platform.d.ts.map +1 -1
- package/dist/utils/platform.js +15 -0
- package/dist/utils/platform.js.map +1 -1
- package/dist/utils/render.d.ts +21 -0
- package/dist/utils/render.d.ts.map +1 -0
- package/dist/utils/render.js +162 -0
- package/dist/utils/render.js.map +1 -0
- package/package.json +6 -2
- package/sandbox-permissions.png +0 -0
package/dist/index.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import * as fs from "fs";
|
|
3
|
+
import { createRequire } from "module";
|
|
4
|
+
import { startServer } from "./server.js";
|
|
3
5
|
import { startMcpClientMode } from "./client.js";
|
|
4
6
|
import { TerminalManager } from "./terminal/index.js";
|
|
5
7
|
import { createToolProxyServer } from "./transport/index.js";
|
|
6
8
|
import { getBanner } from "./ui/index.js";
|
|
7
9
|
import { getDefaultSocketPath, getDefaultShell } from "./utils/platform.js";
|
|
10
|
+
import { SandboxController, loadConfigFromFile, promptForPermissions, } from "./sandbox/index.js";
|
|
11
|
+
const require = createRequire(import.meta.url);
|
|
12
|
+
const { version } = require("../package.json");
|
|
8
13
|
// Default socket path
|
|
9
14
|
const DEFAULT_SOCKET_PATH = getDefaultSocketPath();
|
|
10
15
|
// Parse command line arguments
|
|
@@ -38,29 +43,171 @@ for (let i = 0; i < args.length; i++) {
|
|
|
38
43
|
i++;
|
|
39
44
|
}
|
|
40
45
|
break;
|
|
46
|
+
case "--headless":
|
|
47
|
+
options.headless = true;
|
|
48
|
+
break;
|
|
49
|
+
case "--sandbox":
|
|
50
|
+
options.sandbox = true;
|
|
51
|
+
break;
|
|
52
|
+
case "--sandbox-config":
|
|
53
|
+
if (next) {
|
|
54
|
+
options.sandboxConfig = next;
|
|
55
|
+
options.sandbox = true; // Implicitly enable sandbox
|
|
56
|
+
i++;
|
|
57
|
+
}
|
|
58
|
+
break;
|
|
59
|
+
case "--record":
|
|
60
|
+
// Support bare --record (defaults to 'always')
|
|
61
|
+
if (!next || next.startsWith('-')) {
|
|
62
|
+
options.record = 'always';
|
|
63
|
+
}
|
|
64
|
+
else if (['always', 'on-failure', 'off'].includes(next)) {
|
|
65
|
+
options.record = next;
|
|
66
|
+
i++;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// Unknown value, treat as bare --record
|
|
70
|
+
options.record = 'always';
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
case "--record-dir":
|
|
74
|
+
if (next) {
|
|
75
|
+
options.recordDir = next;
|
|
76
|
+
i++;
|
|
77
|
+
}
|
|
78
|
+
break;
|
|
79
|
+
case "--record-format":
|
|
80
|
+
if (next) {
|
|
81
|
+
options.recordFormat = next;
|
|
82
|
+
i++;
|
|
83
|
+
}
|
|
84
|
+
break;
|
|
85
|
+
case "--idle-time-limit":
|
|
86
|
+
if (next) {
|
|
87
|
+
options.idleTimeLimit = parseFloat(next);
|
|
88
|
+
i++;
|
|
89
|
+
}
|
|
90
|
+
break;
|
|
91
|
+
case "--max-duration":
|
|
92
|
+
if (next) {
|
|
93
|
+
options.maxDuration = parseFloat(next);
|
|
94
|
+
i++;
|
|
95
|
+
}
|
|
96
|
+
break;
|
|
97
|
+
case "--inactivity-timeout":
|
|
98
|
+
if (next) {
|
|
99
|
+
options.inactivityTimeout = parseFloat(next);
|
|
100
|
+
i++;
|
|
101
|
+
}
|
|
102
|
+
break;
|
|
103
|
+
case "--max-sessions":
|
|
104
|
+
if (next) {
|
|
105
|
+
options.maxSessions = parseInt(next, 10);
|
|
106
|
+
i++;
|
|
107
|
+
}
|
|
108
|
+
break;
|
|
109
|
+
case "--session-idle-timeout":
|
|
110
|
+
if (next) {
|
|
111
|
+
options.sessionIdleTimeout = parseFloat(next);
|
|
112
|
+
i++;
|
|
113
|
+
}
|
|
114
|
+
break;
|
|
115
|
+
case "--version":
|
|
116
|
+
case "-v":
|
|
117
|
+
console.log(`terminal-mcp v${version}`);
|
|
118
|
+
process.exit(0);
|
|
41
119
|
case "--help":
|
|
42
120
|
case "-h":
|
|
43
121
|
console.log(`
|
|
44
|
-
terminal-mcp - A headless terminal emulator exposed via MCP
|
|
122
|
+
terminal-mcp v${version} - A headless terminal emulator exposed via MCP
|
|
45
123
|
|
|
46
124
|
Usage: terminal-mcp [options]
|
|
47
125
|
|
|
48
126
|
Options:
|
|
49
|
-
--cols <number>
|
|
50
|
-
--rows <number>
|
|
51
|
-
--shell <path>
|
|
52
|
-
--socket <path>
|
|
53
|
-
--
|
|
127
|
+
--cols <number> Terminal width in columns (default: auto or 120)
|
|
128
|
+
--rows <number> Terminal height in rows (default: auto or 40)
|
|
129
|
+
--shell <path> Shell to use (default: $SHELL or bash)
|
|
130
|
+
--socket <path> Unix socket path for MCP (default: ${DEFAULT_SOCKET_PATH})
|
|
131
|
+
--headless Run in headless mode (MCP server with embedded terminal, no TTY needed)
|
|
132
|
+
--sandbox Enable sandbox mode (restricts filesystem/network access)
|
|
133
|
+
--sandbox-config <path> Load sandbox config from JSON file
|
|
134
|
+
--max-sessions <n> Max concurrent terminal sessions (default: 5)
|
|
135
|
+
--session-idle-timeout <sec> Idle non-default sessions auto-destroy after this (default: 600)
|
|
136
|
+
--version, -v Show version number
|
|
137
|
+
--help, -h Show this help message
|
|
138
|
+
|
|
139
|
+
Recording Options:
|
|
140
|
+
--record [mode] Enable recording (default mode: always)
|
|
141
|
+
Modes: always, on-failure, off
|
|
142
|
+
- always: Save all recordings
|
|
143
|
+
- on-failure: Only save recordings on non-zero exit
|
|
144
|
+
- off: Disable recording
|
|
145
|
+
--record-dir <dir> Recording output directory
|
|
146
|
+
Default: ~/.local/state/terminal-mcp/recordings
|
|
147
|
+
Override: TERMINAL_MCP_RECORD_DIR env var
|
|
148
|
+
--record-format <f> Recording format: v2 (default: v2, asciicast v2 format)
|
|
149
|
+
--idle-time-limit <sec> Max idle time between events (default: 2s)
|
|
150
|
+
Caps idle time in recordings to prevent long pauses
|
|
151
|
+
--max-duration <sec> Max recording duration (default: 3600 = 60 min)
|
|
152
|
+
Recording auto-stops when this limit is reached
|
|
153
|
+
--inactivity-timeout <sec> Stop after no output (default: 600 = 10 min)
|
|
154
|
+
Resets on each terminal output event
|
|
155
|
+
|
|
156
|
+
Environment Variables:
|
|
157
|
+
TERMINAL_MCP_RECORD_DIR Default recording output directory
|
|
54
158
|
|
|
55
159
|
Mode Detection:
|
|
160
|
+
- If --headless: Headless mode (embedded PTY + MCP server over stdio)
|
|
56
161
|
- If stdin is a TTY: Interactive mode (gives you a shell, exposes socket)
|
|
57
162
|
- If stdin is not a TTY: MCP client mode (connects to socket, serves MCP)
|
|
58
163
|
|
|
59
164
|
Interactive Mode (run in your terminal):
|
|
60
|
-
terminal-mcp
|
|
165
|
+
terminal-mcp # Normal mode
|
|
166
|
+
terminal-mcp --sandbox # With sandbox (interactive permission prompt)
|
|
61
167
|
|
|
62
168
|
This gives you an interactive shell. AI can observe/interact via MCP.
|
|
63
169
|
|
|
170
|
+
With recording:
|
|
171
|
+
terminal-mcp --record
|
|
172
|
+
terminal-mcp --record --record-dir=./project-recordings
|
|
173
|
+
terminal-mcp --record=on-failure --idle-time-limit=5
|
|
174
|
+
|
|
175
|
+
Sandbox Mode:
|
|
176
|
+
When --sandbox is enabled, the terminal runs with restricted access:
|
|
177
|
+
- Filesystem: Configurable read/write, read-only, and blocked paths
|
|
178
|
+
- Network: Allow all, block all, or custom domain allowlist
|
|
179
|
+
|
|
180
|
+
Without --sandbox-config, an interactive prompt lets you configure permissions.
|
|
181
|
+
|
|
182
|
+
Example config file (~/.terminal-mcp-sandbox.json):
|
|
183
|
+
{
|
|
184
|
+
"filesystem": {
|
|
185
|
+
"readWrite": [".", "/tmp"],
|
|
186
|
+
"readOnly": ["~"],
|
|
187
|
+
"blocked": ["~/.ssh", "~/.aws"]
|
|
188
|
+
},
|
|
189
|
+
"network": {
|
|
190
|
+
"mode": "all"
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
Headless Mode (no TTY required, for CI/containers/MCP servers):
|
|
195
|
+
terminal-mcp --headless
|
|
196
|
+
terminal-mcp --headless --cols 120 --rows 40
|
|
197
|
+
|
|
198
|
+
Spawns a PTY shell internally and serves MCP directly over stdio.
|
|
199
|
+
No separate interactive session or socket needed.
|
|
200
|
+
|
|
201
|
+
MCP client config for headless:
|
|
202
|
+
{
|
|
203
|
+
"mcpServers": {
|
|
204
|
+
"terminal": {
|
|
205
|
+
"command": "terminal-mcp",
|
|
206
|
+
"args": ["--headless", "--cols", "120", "--rows", "40"]
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
64
211
|
MCP Client Mode (add to your MCP client config):
|
|
65
212
|
{
|
|
66
213
|
"mcpServers": {
|
|
@@ -76,7 +223,25 @@ MCP Client Mode (add to your MCP client config):
|
|
|
76
223
|
async function main() {
|
|
77
224
|
const socketPath = options.socket || DEFAULT_SOCKET_PATH;
|
|
78
225
|
const isInteractive = process.stdin.isTTY;
|
|
79
|
-
|
|
226
|
+
// Prevent recursive invocation
|
|
227
|
+
if (process.env.TERMINAL_MCP === '1') {
|
|
228
|
+
console.error('Error: terminal-mcp cannot be run from within itself.\n' +
|
|
229
|
+
'You are already inside a terminal-mcp session.\n\n' +
|
|
230
|
+
'To use MCP tools, configure your MCP client to connect to this session.');
|
|
231
|
+
process.exit(1);
|
|
232
|
+
}
|
|
233
|
+
if (options.headless) {
|
|
234
|
+
// Headless mode: Spawn PTY internally, serve MCP directly over stdio
|
|
235
|
+
// No TTY or socket needed
|
|
236
|
+
await startServer({
|
|
237
|
+
cols: options.cols,
|
|
238
|
+
rows: options.rows,
|
|
239
|
+
shell: options.shell,
|
|
240
|
+
maxSessions: options.maxSessions,
|
|
241
|
+
sessionIdleTimeout: options.sessionIdleTimeout,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
else if (isInteractive) {
|
|
80
245
|
// Interactive mode: Shell on stdin/stdout, tool proxy on Unix socket
|
|
81
246
|
await startInteractiveMode(socketPath);
|
|
82
247
|
}
|
|
@@ -90,17 +255,102 @@ async function startInteractiveMode(socketPath) {
|
|
|
90
255
|
const cols = options.cols ?? (process.stdout.columns || 120);
|
|
91
256
|
const rows = options.rows ?? (process.stdout.rows || 40);
|
|
92
257
|
const shell = options.shell || getDefaultShell();
|
|
258
|
+
// Initialize sandbox if enabled
|
|
259
|
+
let sandboxController;
|
|
260
|
+
let sandboxEnabled = false;
|
|
261
|
+
if (options.sandbox) {
|
|
262
|
+
sandboxController = new SandboxController();
|
|
263
|
+
// Check platform support and dependencies BEFORE showing the modal
|
|
264
|
+
if (!sandboxController.isSupported()) {
|
|
265
|
+
const platform = sandboxController.getPlatform();
|
|
266
|
+
if (platform === "win32") {
|
|
267
|
+
console.error("[terminal-mcp] Error: Sandbox mode is not supported on Windows.");
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
console.error(`[terminal-mcp] Error: Sandbox mode is not supported on platform '${platform}'.`);
|
|
271
|
+
}
|
|
272
|
+
console.error("[terminal-mcp] Please run without the --sandbox flag.");
|
|
273
|
+
process.exit(1);
|
|
274
|
+
}
|
|
275
|
+
// Check Linux-specific dependencies
|
|
276
|
+
const depCheck = sandboxController.checkLinuxDependencies();
|
|
277
|
+
if (!depCheck.supported) {
|
|
278
|
+
console.error(`[terminal-mcp] Error: Sandbox dependencies not available.`);
|
|
279
|
+
console.error(`[terminal-mcp] Missing: ${depCheck.message}`);
|
|
280
|
+
console.error("");
|
|
281
|
+
console.error("To install on Arch Linux:");
|
|
282
|
+
console.error(" sudo pacman -S bubblewrap socat");
|
|
283
|
+
console.error("");
|
|
284
|
+
console.error("To install on Debian/Ubuntu:");
|
|
285
|
+
console.error(" sudo apt install bubblewrap socat");
|
|
286
|
+
console.error("");
|
|
287
|
+
console.error("Or run without the --sandbox flag.");
|
|
288
|
+
process.exit(1);
|
|
289
|
+
}
|
|
290
|
+
// Determine permissions
|
|
291
|
+
let permissions;
|
|
292
|
+
if (options.sandboxConfig) {
|
|
293
|
+
try {
|
|
294
|
+
permissions = loadConfigFromFile(options.sandboxConfig);
|
|
295
|
+
console.log(`[terminal-mcp] Loaded sandbox config from ${options.sandboxConfig}`);
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
console.error(`[terminal-mcp] Failed to load sandbox config: ${error}`);
|
|
299
|
+
process.exit(1);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
// Interactive permission prompt
|
|
304
|
+
try {
|
|
305
|
+
permissions = await promptForPermissions();
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
if (error instanceof Error && error.message === "cancelled") {
|
|
309
|
+
console.log("[terminal-mcp] Cancelled.");
|
|
310
|
+
process.exit(0);
|
|
311
|
+
}
|
|
312
|
+
throw error;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// Initialize sandbox
|
|
316
|
+
const status = await sandboxController.initialize(permissions);
|
|
317
|
+
sandboxEnabled = status.enabled;
|
|
318
|
+
if (status.enabled) {
|
|
319
|
+
console.log(`[terminal-mcp] Sandbox enabled (${status.platform})`);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
// If we get here, something unexpected failed during initialization
|
|
323
|
+
console.error(`[terminal-mcp] Error: Failed to initialize sandbox: ${status.reason}`);
|
|
324
|
+
console.error("[terminal-mcp] Please run without the --sandbox flag or fix the issue above.");
|
|
325
|
+
process.exit(1);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
93
328
|
// Generate startup banner
|
|
94
|
-
const startupBanner = getBanner({
|
|
329
|
+
const startupBanner = getBanner({
|
|
330
|
+
socketPath,
|
|
331
|
+
cols,
|
|
332
|
+
rows,
|
|
333
|
+
shell,
|
|
334
|
+
sandboxEnabled,
|
|
335
|
+
});
|
|
95
336
|
// Create terminal manager (prompt customization handled in session.ts)
|
|
96
337
|
const manager = new TerminalManager({
|
|
97
338
|
cols,
|
|
98
339
|
rows,
|
|
99
340
|
shell: options.shell,
|
|
100
341
|
startupBanner,
|
|
342
|
+
sandboxController,
|
|
343
|
+
record: options.record,
|
|
344
|
+
recordDir: options.recordDir,
|
|
345
|
+
recordFormat: options.recordFormat,
|
|
346
|
+
idleTimeLimit: options.idleTimeLimit,
|
|
347
|
+
maxDuration: options.maxDuration,
|
|
348
|
+
inactivityTimeout: options.inactivityTimeout,
|
|
349
|
+
maxSessions: options.maxSessions,
|
|
350
|
+
sessionIdleTimeout: options.sessionIdleTimeout,
|
|
101
351
|
});
|
|
102
352
|
// Get the session and set up interactive I/O
|
|
103
|
-
const session = manager.
|
|
353
|
+
const session = await manager.initSession();
|
|
104
354
|
// Track if we've shown the banner (for Windows, show after shell init)
|
|
105
355
|
let bannerShown = false;
|
|
106
356
|
const isWindows = process.platform === "win32";
|
|
@@ -120,8 +370,20 @@ async function startInteractiveMode(socketPath) {
|
|
|
120
370
|
bannerShown = true;
|
|
121
371
|
}
|
|
122
372
|
// Handle PTY exit
|
|
123
|
-
session.onExit((code) => {
|
|
373
|
+
session.onExit(async (code) => {
|
|
374
|
+
// Finalize recordings and get results
|
|
375
|
+
const recordings = await manager.finalizeRecordings(code);
|
|
124
376
|
console.log(`\n[terminal-mcp] Shell exited with code ${code}`);
|
|
377
|
+
// Show recording info if any were saved
|
|
378
|
+
const savedRecordings = recordings.filter(r => r.saved);
|
|
379
|
+
if (savedRecordings.length > 0) {
|
|
380
|
+
console.log('\nRecordings saved:');
|
|
381
|
+
for (const rec of savedRecordings) {
|
|
382
|
+
console.log(` ${rec.path}`);
|
|
383
|
+
}
|
|
384
|
+
console.log('\nPlay with: asciinema play <file>');
|
|
385
|
+
console.log('Install: pip install asciinema or brew install asciinema');
|
|
386
|
+
}
|
|
125
387
|
cleanup();
|
|
126
388
|
process.exit(code);
|
|
127
389
|
});
|
|
@@ -142,7 +404,7 @@ async function startInteractiveMode(socketPath) {
|
|
|
142
404
|
});
|
|
143
405
|
// Start tool proxy socket server
|
|
144
406
|
const socketServer = createToolProxyServer(socketPath, manager);
|
|
145
|
-
// Cleanup function
|
|
407
|
+
// Cleanup function (sync version for exit handler)
|
|
146
408
|
function cleanup() {
|
|
147
409
|
manager.dispose();
|
|
148
410
|
socketServer.close();
|
|
@@ -153,14 +415,24 @@ async function startInteractiveMode(socketPath) {
|
|
|
153
415
|
// Ignore
|
|
154
416
|
}
|
|
155
417
|
}
|
|
418
|
+
// Async cleanup that also cleans up sandbox resources
|
|
419
|
+
async function cleanupAsync() {
|
|
420
|
+
await manager.disposeAsync();
|
|
421
|
+
socketServer.close();
|
|
422
|
+
try {
|
|
423
|
+
fs.unlinkSync(socketPath);
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
// Ignore
|
|
427
|
+
}
|
|
428
|
+
}
|
|
156
429
|
// Handle signals
|
|
157
430
|
process.on("SIGINT", () => {
|
|
158
431
|
// Pass Ctrl+C to the shell instead of exiting
|
|
159
432
|
session.write("\x03");
|
|
160
433
|
});
|
|
161
434
|
process.on("SIGTERM", () => {
|
|
162
|
-
|
|
163
|
-
process.exit(0);
|
|
435
|
+
cleanupAsync().then(() => process.exit(0));
|
|
164
436
|
});
|
|
165
437
|
process.on("exit", () => {
|
|
166
438
|
cleanup();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAuEnE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAwBpD"}
|
package/dist/prompts/index.js
CHANGED
|
@@ -4,6 +4,14 @@ const TOOL_USAGE_PROMPT = `# Terminal MCP Tool Usage Guide
|
|
|
4
4
|
## Overview
|
|
5
5
|
This MCP server provides tools to interact with a terminal emulator. Use these tools to execute commands and read output.
|
|
6
6
|
|
|
7
|
+
## When to prefer this server
|
|
8
|
+
Prefer terminal-mcp over plain non-interactive shell tools whenever the command:
|
|
9
|
+
- needs sudo or otherwise prompts for a password (the human can type it interactively into this PTY)
|
|
10
|
+
- prompts the user for input during execution (ssh login, git push over HTTPS, npm login, etc.)
|
|
11
|
+
- runs a TUI (vim, nano, less, more, htop, top, man, kubectl edit, gh pr create)
|
|
12
|
+
- needs line-buffered TTY behavior (colors, progress bars, fzf, watch)
|
|
13
|
+
- must be observed while still running (long-running build, server, REPL)
|
|
14
|
+
|
|
7
15
|
## Tools
|
|
8
16
|
|
|
9
17
|
### type
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,MAAM,iBAAiB,GAAG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwDzB,CAAC;AAEF,MAAM,OAAO,GAAG;IACd;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,uDAAuD;KACrE;CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,CAAC,iBAAiB,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC9D,OAAO;KACR,CAAC,CAAC,CAAC;IAEJ,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACjE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;QAEhC,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1B,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAe;wBACrB,OAAO,EAAE;4BACP,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,iBAAiB;yBACxB;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { Recorder } from "./recorder.js";
|
|
2
|
+
export { RecordingManager } from "./manager.js";
|
|
3
|
+
export type { RecordingMode, RecordingFormat, RecordingOptions, AsciicastHeader, AsciicastEvent, AsciicastOutputEvent, AsciicastResizeEvent, RecordingMetadata, StopReason, } from "./types.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/recording/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EACV,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,UAAU,GACX,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/recording/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Recorder } from "./recorder.js";
|
|
2
|
+
import { RecordingMode, RecordingOptions, RecordingMetadata, StopReason } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* RecordingManager tracks and manages multiple recordings
|
|
5
|
+
*/
|
|
6
|
+
export declare class RecordingManager {
|
|
7
|
+
private recordings;
|
|
8
|
+
private defaultOptions;
|
|
9
|
+
constructor(options?: Partial<RecordingOptions>);
|
|
10
|
+
/**
|
|
11
|
+
* Create a new recording
|
|
12
|
+
* Returns the recorder instance
|
|
13
|
+
*/
|
|
14
|
+
createRecording(options?: Partial<RecordingOptions>): Recorder;
|
|
15
|
+
/**
|
|
16
|
+
* Get a recording by ID
|
|
17
|
+
*/
|
|
18
|
+
getRecording(id: string): Recorder | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Check if a recording exists
|
|
21
|
+
*/
|
|
22
|
+
hasRecording(id: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Get all active recordings
|
|
25
|
+
*/
|
|
26
|
+
getActiveRecordings(): Recorder[];
|
|
27
|
+
/**
|
|
28
|
+
* Get the count of active recordings
|
|
29
|
+
*/
|
|
30
|
+
getActiveCount(): number;
|
|
31
|
+
/**
|
|
32
|
+
* Record output to all active recordings
|
|
33
|
+
*/
|
|
34
|
+
recordOutputToAll(data: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Record resize to all active recordings
|
|
37
|
+
*/
|
|
38
|
+
recordResizeToAll(cols: number, rows: number): void;
|
|
39
|
+
/**
|
|
40
|
+
* Finalize a specific recording
|
|
41
|
+
*/
|
|
42
|
+
finalizeRecording(id: string, exitCode: number | null, stopReason?: StopReason): Promise<RecordingMetadata | undefined>;
|
|
43
|
+
/**
|
|
44
|
+
* Finalize all active recordings
|
|
45
|
+
* Returns array of metadata for all finalized recordings
|
|
46
|
+
*/
|
|
47
|
+
finalizeAll(exitCode: number | null, stopReason?: StopReason): Promise<RecordingMetadata[]>;
|
|
48
|
+
/**
|
|
49
|
+
* Get default recording mode
|
|
50
|
+
*/
|
|
51
|
+
getDefaultMode(): RecordingMode;
|
|
52
|
+
/**
|
|
53
|
+
* Get default output directory
|
|
54
|
+
*/
|
|
55
|
+
getDefaultOutputDir(): string;
|
|
56
|
+
/**
|
|
57
|
+
* Check if auto-recording is enabled (mode !== 'off')
|
|
58
|
+
*/
|
|
59
|
+
isAutoRecordingEnabled(): boolean;
|
|
60
|
+
private generateId;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/recording/manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EACL,aAAa,EAEb,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACX,MAAM,YAAY,CAAC;AAGpB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,cAAc,CAAmB;gBAE7B,OAAO,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAW/C;;;OAGG;IACH,eAAe,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,QAAQ;IAqB9D;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAI9C;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIjC;;OAEG;IACH,mBAAmB,IAAI,QAAQ,EAAE;IAIjC;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMrC;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAMnD;;OAEG;IACG,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAW7H;;;OAGG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,GAAE,UAA2B,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAcjH;;OAEG;IACH,cAAc,IAAI,aAAa;IAI/B;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAI7B;;OAEG;IACH,sBAAsB,IAAI,OAAO;IAIjC,OAAO,CAAC,UAAU;CAGnB"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import * as crypto from "crypto";
|
|
2
|
+
import { Recorder } from "./recorder.js";
|
|
3
|
+
import { getDefaultRecordDir } from "../utils/platform.js";
|
|
4
|
+
/**
|
|
5
|
+
* RecordingManager tracks and manages multiple recordings
|
|
6
|
+
*/
|
|
7
|
+
export class RecordingManager {
|
|
8
|
+
recordings = new Map();
|
|
9
|
+
defaultOptions;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.defaultOptions = {
|
|
12
|
+
mode: options?.mode ?? 'off',
|
|
13
|
+
format: options?.format ?? 'v2',
|
|
14
|
+
outputDir: options?.outputDir ?? getDefaultRecordDir(),
|
|
15
|
+
idleTimeLimit: options?.idleTimeLimit ?? 2,
|
|
16
|
+
maxDuration: options?.maxDuration ?? 3600, // 60 minutes default
|
|
17
|
+
inactivityTimeout: options?.inactivityTimeout ?? 600, // 10 minutes default
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create a new recording
|
|
22
|
+
* Returns the recorder instance
|
|
23
|
+
*/
|
|
24
|
+
createRecording(options) {
|
|
25
|
+
const id = this.generateId();
|
|
26
|
+
const mergedOptions = {
|
|
27
|
+
...this.defaultOptions,
|
|
28
|
+
...options,
|
|
29
|
+
};
|
|
30
|
+
const recorder = new Recorder(id, mergedOptions.mode, mergedOptions.outputDir, mergedOptions.format, mergedOptions.idleTimeLimit, mergedOptions.maxDuration, mergedOptions.inactivityTimeout);
|
|
31
|
+
this.recordings.set(id, recorder);
|
|
32
|
+
return recorder;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get a recording by ID
|
|
36
|
+
*/
|
|
37
|
+
getRecording(id) {
|
|
38
|
+
return this.recordings.get(id);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if a recording exists
|
|
42
|
+
*/
|
|
43
|
+
hasRecording(id) {
|
|
44
|
+
return this.recordings.has(id);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get all active recordings
|
|
48
|
+
*/
|
|
49
|
+
getActiveRecordings() {
|
|
50
|
+
return Array.from(this.recordings.values()).filter(r => r.isActive());
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get the count of active recordings
|
|
54
|
+
*/
|
|
55
|
+
getActiveCount() {
|
|
56
|
+
return this.getActiveRecordings().length;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Record output to all active recordings
|
|
60
|
+
*/
|
|
61
|
+
recordOutputToAll(data) {
|
|
62
|
+
for (const recorder of this.getActiveRecordings()) {
|
|
63
|
+
recorder.recordOutput(data);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Record resize to all active recordings
|
|
68
|
+
*/
|
|
69
|
+
recordResizeToAll(cols, rows) {
|
|
70
|
+
for (const recorder of this.getActiveRecordings()) {
|
|
71
|
+
recorder.recordResize(cols, rows);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Finalize a specific recording
|
|
76
|
+
*/
|
|
77
|
+
async finalizeRecording(id, exitCode, stopReason) {
|
|
78
|
+
const recorder = this.recordings.get(id);
|
|
79
|
+
if (!recorder) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
const metadata = await recorder.finalize(exitCode, stopReason);
|
|
83
|
+
this.recordings.delete(id);
|
|
84
|
+
return metadata;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Finalize all active recordings
|
|
88
|
+
* Returns array of metadata for all finalized recordings
|
|
89
|
+
*/
|
|
90
|
+
async finalizeAll(exitCode, stopReason = 'session_exit') {
|
|
91
|
+
const results = [];
|
|
92
|
+
for (const [id, recorder] of this.recordings) {
|
|
93
|
+
if (recorder.isActive()) {
|
|
94
|
+
const metadata = await recorder.finalize(exitCode, stopReason);
|
|
95
|
+
results.push(metadata);
|
|
96
|
+
}
|
|
97
|
+
this.recordings.delete(id);
|
|
98
|
+
}
|
|
99
|
+
return results;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get default recording mode
|
|
103
|
+
*/
|
|
104
|
+
getDefaultMode() {
|
|
105
|
+
return this.defaultOptions.mode;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Get default output directory
|
|
109
|
+
*/
|
|
110
|
+
getDefaultOutputDir() {
|
|
111
|
+
return this.defaultOptions.outputDir;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Check if auto-recording is enabled (mode !== 'off')
|
|
115
|
+
*/
|
|
116
|
+
isAutoRecordingEnabled() {
|
|
117
|
+
return this.defaultOptions.mode !== 'off';
|
|
118
|
+
}
|
|
119
|
+
generateId() {
|
|
120
|
+
return crypto.randomBytes(8).toString('hex');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/recording/manager.ts"],"names":[],"mappings":"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"}
|