@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.
Files changed (115) hide show
  1. package/README.md +301 -9
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +2 -61
  4. package/dist/client.js.map +1 -1
  5. package/dist/index.js +286 -14
  6. package/dist/index.js.map +1 -1
  7. package/dist/prompts/index.d.ts.map +1 -1
  8. package/dist/prompts/index.js +8 -0
  9. package/dist/prompts/index.js.map +1 -1
  10. package/dist/recording/index.d.ts +4 -0
  11. package/dist/recording/index.d.ts.map +1 -0
  12. package/dist/recording/index.js +3 -0
  13. package/dist/recording/index.js.map +1 -0
  14. package/dist/recording/manager.d.ts +62 -0
  15. package/dist/recording/manager.d.ts.map +1 -0
  16. package/dist/recording/manager.js +123 -0
  17. package/dist/recording/manager.js.map +1 -0
  18. package/dist/recording/recorder.d.ts +95 -0
  19. package/dist/recording/recorder.d.ts.map +1 -0
  20. package/dist/recording/recorder.js +296 -0
  21. package/dist/recording/recorder.js.map +1 -0
  22. package/dist/recording/types.d.ts +65 -0
  23. package/dist/recording/types.d.ts.map +1 -0
  24. package/dist/recording/types.js +2 -0
  25. package/dist/recording/types.js.map +1 -0
  26. package/dist/sandbox/config.d.ts +46 -0
  27. package/dist/sandbox/config.d.ts.map +1 -0
  28. package/dist/sandbox/config.js +144 -0
  29. package/dist/sandbox/config.js.map +1 -0
  30. package/dist/sandbox/controller.d.ts +72 -0
  31. package/dist/sandbox/controller.d.ts.map +1 -0
  32. package/dist/sandbox/controller.js +208 -0
  33. package/dist/sandbox/controller.js.map +1 -0
  34. package/dist/sandbox/index.d.ts +6 -0
  35. package/dist/sandbox/index.d.ts.map +1 -0
  36. package/dist/sandbox/index.js +4 -0
  37. package/dist/sandbox/index.js.map +1 -0
  38. package/dist/sandbox/prompt.d.ts +10 -0
  39. package/dist/sandbox/prompt.d.ts.map +1 -0
  40. package/dist/sandbox/prompt.js +434 -0
  41. package/dist/sandbox/prompt.js.map +1 -0
  42. package/dist/server.d.ts +2 -3
  43. package/dist/server.d.ts.map +1 -1
  44. package/dist/server.js +21 -0
  45. package/dist/server.js.map +1 -1
  46. package/dist/terminal/index.d.ts +1 -0
  47. package/dist/terminal/index.d.ts.map +1 -1
  48. package/dist/terminal/manager.d.ts +89 -31
  49. package/dist/terminal/manager.d.ts.map +1 -1
  50. package/dist/terminal/manager.js +313 -44
  51. package/dist/terminal/manager.js.map +1 -1
  52. package/dist/terminal/session.d.ts +34 -1
  53. package/dist/terminal/session.d.ts.map +1 -1
  54. package/dist/terminal/session.js +160 -3
  55. package/dist/terminal/session.js.map +1 -1
  56. package/dist/tools/createSession.d.ts +44 -0
  57. package/dist/tools/createSession.d.ts.map +1 -0
  58. package/dist/tools/createSession.js +41 -0
  59. package/dist/tools/createSession.js.map +1 -0
  60. package/dist/tools/definitions.d.ts +18 -0
  61. package/dist/tools/definitions.d.ts.map +1 -0
  62. package/dist/tools/definitions.js +116 -0
  63. package/dist/tools/definitions.js.map +1 -0
  64. package/dist/tools/destroySession.d.ts +31 -0
  65. package/dist/tools/destroySession.d.ts.map +1 -0
  66. package/dist/tools/destroySession.js +32 -0
  67. package/dist/tools/destroySession.js.map +1 -0
  68. package/dist/tools/getContent.d.ts +7 -0
  69. package/dist/tools/getContent.d.ts.map +1 -1
  70. package/dist/tools/getContent.js +8 -3
  71. package/dist/tools/getContent.js.map +1 -1
  72. package/dist/tools/index.d.ts.map +1 -1
  73. package/dist/tools/index.js +26 -1
  74. package/dist/tools/index.js.map +1 -1
  75. package/dist/tools/listSessions.d.ts +19 -0
  76. package/dist/tools/listSessions.d.ts.map +1 -0
  77. package/dist/tools/listSessions.js +23 -0
  78. package/dist/tools/listSessions.js.map +1 -0
  79. package/dist/tools/screenshot.d.ts +26 -3
  80. package/dist/tools/screenshot.d.ts.map +1 -1
  81. package/dist/tools/screenshot.js +55 -5
  82. package/dist/tools/screenshot.js.map +1 -1
  83. package/dist/tools/sendKey.d.ts +7 -0
  84. package/dist/tools/sendKey.d.ts.map +1 -1
  85. package/dist/tools/sendKey.js +7 -2
  86. package/dist/tools/sendKey.js.map +1 -1
  87. package/dist/tools/startRecording.d.ts +68 -0
  88. package/dist/tools/startRecording.d.ts.map +1 -0
  89. package/dist/tools/startRecording.js +111 -0
  90. package/dist/tools/startRecording.js.map +1 -0
  91. package/dist/tools/stopRecording.d.ts +31 -0
  92. package/dist/tools/stopRecording.d.ts.map +1 -0
  93. package/dist/tools/stopRecording.js +76 -0
  94. package/dist/tools/stopRecording.js.map +1 -0
  95. package/dist/tools/type.d.ts +7 -0
  96. package/dist/tools/type.d.ts.map +1 -1
  97. package/dist/tools/type.js +7 -2
  98. package/dist/tools/type.js.map +1 -1
  99. package/dist/transport/socket.d.ts.map +1 -1
  100. package/dist/transport/socket.js +10 -0
  101. package/dist/transport/socket.js.map +1 -1
  102. package/dist/ui/index.d.ts +1 -0
  103. package/dist/ui/index.d.ts.map +1 -1
  104. package/dist/ui/index.js +17 -1
  105. package/dist/ui/index.js.map +1 -1
  106. package/dist/utils/platform.d.ts +6 -0
  107. package/dist/utils/platform.d.ts.map +1 -1
  108. package/dist/utils/platform.js +15 -0
  109. package/dist/utils/platform.js.map +1 -1
  110. package/dist/utils/render.d.ts +21 -0
  111. package/dist/utils/render.d.ts.map +1 -0
  112. package/dist/utils/render.js +162 -0
  113. package/dist/utils/render.js.map +1 -0
  114. package/package.json +6 -2
  115. 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> Terminal width in columns (default: auto or 120)
50
- --rows <number> Terminal height in rows (default: auto or 40)
51
- --shell <path> Shell to use (default: $SHELL or bash)
52
- --socket <path> Unix socket path for MCP (default: ${DEFAULT_SOCKET_PATH})
53
- --help, -h Show this help message
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
- if (isInteractive) {
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({ socketPath, cols, rows, shell });
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.getSession();
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
- cleanup();
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;AA+DnE,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAwBpD"}
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"}
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDzB,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"}
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,3 @@
1
+ export { Recorder } from "./recorder.js";
2
+ export { RecordingManager } from "./manager.js";
3
+ //# sourceMappingURL=index.js.map
@@ -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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"}