x-shell.js 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.
Files changed (38) hide show
  1. package/README.md +304 -0
  2. package/dist/client/browser-bundle.js +314 -0
  3. package/dist/client/browser-bundle.js.map +7 -0
  4. package/dist/client/index.d.ts +7 -0
  5. package/dist/client/index.d.ts.map +1 -0
  6. package/dist/client/index.js +5 -0
  7. package/dist/client/index.js.map +1 -0
  8. package/dist/client/terminal-client.d.ts +122 -0
  9. package/dist/client/terminal-client.d.ts.map +1 -0
  10. package/dist/client/terminal-client.js +328 -0
  11. package/dist/client/terminal-client.js.map +1 -0
  12. package/dist/server/index.d.ts +7 -0
  13. package/dist/server/index.d.ts.map +1 -0
  14. package/dist/server/index.js +5 -0
  15. package/dist/server/index.js.map +1 -0
  16. package/dist/server/terminal-server.d.ts +107 -0
  17. package/dist/server/terminal-server.d.ts.map +1 -0
  18. package/dist/server/terminal-server.js +392 -0
  19. package/dist/server/terminal-server.js.map +1 -0
  20. package/dist/shared/types.d.ts +133 -0
  21. package/dist/shared/types.d.ts.map +1 -0
  22. package/dist/shared/types.js +5 -0
  23. package/dist/shared/types.js.map +1 -0
  24. package/dist/ui/browser-bundle.js +1654 -0
  25. package/dist/ui/browser-bundle.js.map +7 -0
  26. package/dist/ui/index.d.ts +6 -0
  27. package/dist/ui/index.d.ts.map +1 -0
  28. package/dist/ui/index.js +6 -0
  29. package/dist/ui/index.js.map +1 -0
  30. package/dist/ui/styles.d.ts +16 -0
  31. package/dist/ui/styles.d.ts.map +1 -0
  32. package/dist/ui/styles.js +125 -0
  33. package/dist/ui/styles.js.map +1 -0
  34. package/dist/ui/x-shell-terminal.d.ts +100 -0
  35. package/dist/ui/x-shell-terminal.d.ts.map +1 -0
  36. package/dist/ui/x-shell-terminal.js +540 -0
  37. package/dist/ui/x-shell-terminal.js.map +1 -0
  38. package/package.json +94 -0
@@ -0,0 +1,392 @@
1
+ /**
2
+ * Server-side terminal handler using node-pty
3
+ *
4
+ * Manages PTY sessions and WebSocket connections for web-based terminals.
5
+ */
6
+ import { WebSocketServer } from 'ws';
7
+ import * as path from 'path';
8
+ import * as os from 'os';
9
+ /**
10
+ * Get platform default shell
11
+ */
12
+ function getDefaultShell() {
13
+ if (process.platform === 'win32') {
14
+ return process.env.COMSPEC || 'cmd.exe';
15
+ }
16
+ return process.env.SHELL || '/bin/bash';
17
+ }
18
+ /**
19
+ * Terminal server class
20
+ */
21
+ export class TerminalServer {
22
+ constructor(options = {}) {
23
+ this.sessions = new Map();
24
+ this.wss = null;
25
+ this.pty = null;
26
+ this.cleanupInterval = null;
27
+ this.config = {
28
+ allowedShells: options.allowedShells || [getDefaultShell()],
29
+ allowedPaths: options.allowedPaths || [os.homedir()],
30
+ defaultShell: options.defaultShell || getDefaultShell(),
31
+ defaultCwd: options.defaultCwd || os.homedir(),
32
+ maxSessionsPerClient: options.maxSessionsPerClient || 5,
33
+ idleTimeout: options.idleTimeout || 30 * 60 * 1000, // 30 minutes
34
+ path: options.path || '/terminal',
35
+ verbose: options.verbose || false,
36
+ };
37
+ // Start cleanup interval
38
+ this.cleanupInterval = setInterval(() => this.cleanupSessions(), 60000);
39
+ }
40
+ /**
41
+ * Initialize node-pty (lazy load)
42
+ */
43
+ async initPty() {
44
+ if (this.pty)
45
+ return;
46
+ try {
47
+ // @ts-ignore - node-pty is a peer dependency
48
+ this.pty = await import('node-pty');
49
+ }
50
+ catch (error) {
51
+ throw new Error('node-pty is required for x-shell. Install it with: npm install node-pty');
52
+ }
53
+ }
54
+ /**
55
+ * Attach to an existing HTTP server
56
+ */
57
+ attach(server) {
58
+ this.wss = new WebSocketServer({
59
+ server,
60
+ path: this.config.path,
61
+ });
62
+ this.setupWebSocketServer();
63
+ this.log(`Terminal WebSocket server listening on ${this.config.path}`);
64
+ }
65
+ /**
66
+ * Start standalone WebSocket server
67
+ */
68
+ listen(port) {
69
+ this.wss = new WebSocketServer({ port });
70
+ this.setupWebSocketServer();
71
+ this.log(`Terminal WebSocket server listening on port ${port}`);
72
+ }
73
+ /**
74
+ * Setup WebSocket server event handlers
75
+ */
76
+ setupWebSocketServer() {
77
+ if (!this.wss)
78
+ return;
79
+ this.wss.on('connection', async (ws, req) => {
80
+ this.log(`Client connected from ${req.socket.remoteAddress}`);
81
+ await this.handleConnection(ws, req);
82
+ });
83
+ }
84
+ /**
85
+ * Handle WebSocket connection
86
+ */
87
+ async handleConnection(ws, req) {
88
+ // Load node-pty
89
+ try {
90
+ await this.initPty();
91
+ }
92
+ catch (error) {
93
+ this.sendError(ws, error.message);
94
+ ws.close();
95
+ return;
96
+ }
97
+ // Handle messages
98
+ ws.on('message', (data) => {
99
+ try {
100
+ const message = JSON.parse(data.toString());
101
+ this.handleMessage(ws, message);
102
+ }
103
+ catch (error) {
104
+ this.log(`Invalid message: ${error}`, 'error');
105
+ }
106
+ });
107
+ ws.on('close', () => {
108
+ this.log('Client disconnected');
109
+ // Clean up sessions for this WebSocket
110
+ for (const [sessionId, session] of this.sessions.entries()) {
111
+ if (session.ws === ws) {
112
+ this.closeSession(sessionId);
113
+ }
114
+ }
115
+ });
116
+ ws.on('error', (error) => {
117
+ this.log(`WebSocket error: ${error.message}`, 'error');
118
+ });
119
+ }
120
+ /**
121
+ * Handle message from client
122
+ */
123
+ handleMessage(ws, message) {
124
+ switch (message.type) {
125
+ case 'spawn':
126
+ this.spawnSession(ws, message.options || {});
127
+ break;
128
+ case 'data':
129
+ if (message.sessionId) {
130
+ this.writeToSession(message.sessionId, message.data);
131
+ }
132
+ break;
133
+ case 'resize':
134
+ if (message.sessionId) {
135
+ this.resizeSession(message.sessionId, message.cols, message.rows);
136
+ }
137
+ break;
138
+ case 'close':
139
+ if (message.sessionId) {
140
+ this.closeSession(message.sessionId);
141
+ }
142
+ break;
143
+ default:
144
+ this.log(`Unknown message type: ${message.type}`, 'warn');
145
+ }
146
+ }
147
+ /**
148
+ * Validate shell path
149
+ */
150
+ isShellAllowed(shell) {
151
+ if (this.config.allowedShells.length === 0)
152
+ return true;
153
+ const normalizedShell = path.normalize(shell);
154
+ const shellBasename = path.basename(normalizedShell).toLowerCase();
155
+ return this.config.allowedShells.some((allowedShell) => {
156
+ const normalizedAllowed = path.normalize(allowedShell);
157
+ const allowedBasename = path.basename(normalizedAllowed).toLowerCase();
158
+ return (normalizedShell === normalizedAllowed ||
159
+ shellBasename === allowedBasename);
160
+ });
161
+ }
162
+ /**
163
+ * Validate working directory
164
+ */
165
+ isCwdAllowed(cwd) {
166
+ if (this.config.allowedPaths.length === 0)
167
+ return true;
168
+ const normalizedCwd = path.normalize(path.resolve(cwd));
169
+ return this.config.allowedPaths.some((allowedPath) => normalizedCwd.startsWith(path.normalize(path.resolve(allowedPath))));
170
+ }
171
+ /**
172
+ * Spawn a new terminal session
173
+ */
174
+ spawnSession(ws, options) {
175
+ const shell = options.shell || this.config.defaultShell;
176
+ const cwd = options.cwd || this.config.defaultCwd;
177
+ const cols = options.cols || 80;
178
+ const rows = options.rows || 24;
179
+ const env = options.env || {};
180
+ // Count sessions for this client
181
+ let clientSessions = 0;
182
+ for (const session of this.sessions.values()) {
183
+ if (session.ws === ws)
184
+ clientSessions++;
185
+ }
186
+ if (clientSessions >= this.config.maxSessionsPerClient) {
187
+ this.sendError(ws, `Maximum sessions (${this.config.maxSessionsPerClient}) reached`);
188
+ return;
189
+ }
190
+ // Validate shell
191
+ if (!this.isShellAllowed(shell)) {
192
+ this.sendError(ws, `Shell not allowed: ${shell}. Allowed: ${this.config.allowedShells.join(', ')}`);
193
+ return;
194
+ }
195
+ // Validate cwd
196
+ if (!this.isCwdAllowed(cwd)) {
197
+ this.sendError(ws, `Working directory not allowed: ${cwd}`);
198
+ return;
199
+ }
200
+ try {
201
+ // Spawn PTY
202
+ const ptyProcess = this.pty.spawn(shell, [], {
203
+ name: 'xterm-256color',
204
+ cols,
205
+ rows,
206
+ cwd,
207
+ env: { ...process.env, ...env },
208
+ });
209
+ const sessionId = `term-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
210
+ const now = new Date();
211
+ // Store session
212
+ const session = {
213
+ id: sessionId,
214
+ pty: ptyProcess,
215
+ ws,
216
+ shell,
217
+ cwd,
218
+ cols,
219
+ rows,
220
+ createdAt: now,
221
+ lastActivity: now,
222
+ };
223
+ this.sessions.set(sessionId, session);
224
+ // Handle PTY output
225
+ ptyProcess.onData((data) => {
226
+ session.lastActivity = new Date();
227
+ ws.send(JSON.stringify({
228
+ type: 'data',
229
+ sessionId,
230
+ data,
231
+ }));
232
+ });
233
+ // Handle PTY exit
234
+ ptyProcess.onExit(({ exitCode }) => {
235
+ ws.send(JSON.stringify({
236
+ type: 'exit',
237
+ sessionId,
238
+ exitCode,
239
+ }));
240
+ this.sessions.delete(sessionId);
241
+ this.log(`Session exited: ${sessionId} (code: ${exitCode})`);
242
+ });
243
+ // Notify client
244
+ ws.send(JSON.stringify({
245
+ type: 'spawned',
246
+ sessionId,
247
+ shell,
248
+ cwd,
249
+ cols,
250
+ rows,
251
+ }));
252
+ this.log(`Session spawned: ${sessionId} (shell: ${shell}, cwd: ${cwd})`);
253
+ }
254
+ catch (error) {
255
+ this.log(`Failed to spawn session: ${error}`, 'error');
256
+ this.sendError(ws, error.message);
257
+ }
258
+ }
259
+ /**
260
+ * Write data to session
261
+ */
262
+ writeToSession(sessionId, data) {
263
+ const session = this.sessions.get(sessionId);
264
+ if (!session) {
265
+ this.log(`Session not found: ${sessionId}`, 'warn');
266
+ return;
267
+ }
268
+ session.lastActivity = new Date();
269
+ session.pty.write(data);
270
+ }
271
+ /**
272
+ * Resize session
273
+ */
274
+ resizeSession(sessionId, cols, rows) {
275
+ const session = this.sessions.get(sessionId);
276
+ if (!session) {
277
+ this.log(`Session not found: ${sessionId}`, 'warn');
278
+ return;
279
+ }
280
+ session.cols = cols;
281
+ session.rows = rows;
282
+ session.pty.resize(cols, rows);
283
+ }
284
+ /**
285
+ * Close session
286
+ */
287
+ closeSession(sessionId) {
288
+ const session = this.sessions.get(sessionId);
289
+ if (!session)
290
+ return;
291
+ try {
292
+ session.pty.kill();
293
+ }
294
+ catch (error) {
295
+ this.log(`Error killing PTY: ${error}`, 'error');
296
+ }
297
+ this.sessions.delete(sessionId);
298
+ this.log(`Session closed: ${sessionId}`);
299
+ }
300
+ /**
301
+ * Clean up inactive sessions
302
+ */
303
+ cleanupSessions() {
304
+ if (this.config.idleTimeout === 0)
305
+ return;
306
+ const now = Date.now();
307
+ for (const [sessionId, session] of this.sessions.entries()) {
308
+ const idleTime = now - session.lastActivity.getTime();
309
+ if (idleTime > this.config.idleTimeout) {
310
+ this.log(`Closing inactive session: ${sessionId}`);
311
+ session.ws.send(JSON.stringify({
312
+ type: 'exit',
313
+ sessionId,
314
+ exitCode: -1,
315
+ }));
316
+ this.closeSession(sessionId);
317
+ }
318
+ }
319
+ }
320
+ /**
321
+ * Send error message to client
322
+ */
323
+ sendError(ws, error, sessionId) {
324
+ ws.send(JSON.stringify({
325
+ type: 'error',
326
+ sessionId,
327
+ error,
328
+ }));
329
+ }
330
+ /**
331
+ * Log message
332
+ */
333
+ log(message, level = 'info') {
334
+ if (!this.config.verbose && level === 'info')
335
+ return;
336
+ const prefix = '[x-shell]';
337
+ switch (level) {
338
+ case 'error':
339
+ console.error(`${prefix} ${message}`);
340
+ break;
341
+ case 'warn':
342
+ console.warn(`${prefix} ${message}`);
343
+ break;
344
+ default:
345
+ console.log(`${prefix} ${message}`);
346
+ }
347
+ }
348
+ /**
349
+ * Get all active sessions
350
+ */
351
+ getSessions() {
352
+ return Array.from(this.sessions.values()).map((session) => ({
353
+ sessionId: session.id,
354
+ shell: session.shell,
355
+ cwd: session.cwd,
356
+ cols: session.cols,
357
+ rows: session.rows,
358
+ createdAt: session.createdAt,
359
+ }));
360
+ }
361
+ /**
362
+ * Close all sessions and stop server
363
+ */
364
+ close() {
365
+ // Clear cleanup interval
366
+ if (this.cleanupInterval) {
367
+ clearInterval(this.cleanupInterval);
368
+ this.cleanupInterval = null;
369
+ }
370
+ // Close all sessions
371
+ for (const sessionId of this.sessions.keys()) {
372
+ this.closeSession(sessionId);
373
+ }
374
+ // Close WebSocket server
375
+ if (this.wss) {
376
+ this.wss.close();
377
+ this.wss = null;
378
+ }
379
+ this.log('Terminal server closed');
380
+ }
381
+ }
382
+ /**
383
+ * Express middleware to attach terminal server
384
+ */
385
+ export function createTerminalMiddleware(options = {}) {
386
+ const server = new TerminalServer(options);
387
+ return {
388
+ server,
389
+ attach: (httpServer) => server.attach(httpServer),
390
+ };
391
+ }
392
+ //# sourceMappingURL=terminal-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-server.js","sourceRoot":"","sources":["../../src/server/terminal-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Shared types for x-shell.js
3
+ */
4
+ /**
5
+ * Terminal spawn options
6
+ */
7
+ export interface TerminalOptions {
8
+ /** Shell to use (e.g., 'bash', 'zsh', 'cmd.exe', 'powershell.exe') */
9
+ shell?: string;
10
+ /** Working directory */
11
+ cwd?: string;
12
+ /** Environment variables */
13
+ env?: Record<string, string>;
14
+ /** Initial columns (default: 80) */
15
+ cols?: number;
16
+ /** Initial rows (default: 24) */
17
+ rows?: number;
18
+ }
19
+ /**
20
+ * Server configuration
21
+ */
22
+ export interface ServerConfig {
23
+ /** Allowed shells (empty = all allowed) */
24
+ allowedShells?: string[];
25
+ /** Allowed working directories (empty = all allowed) */
26
+ allowedPaths?: string[];
27
+ /** Default shell if not specified by client */
28
+ defaultShell?: string;
29
+ /** Default working directory */
30
+ defaultCwd?: string;
31
+ /** Maximum concurrent sessions per client */
32
+ maxSessionsPerClient?: number;
33
+ /** Session idle timeout in ms (0 = no timeout) */
34
+ idleTimeout?: number;
35
+ }
36
+ /**
37
+ * WebSocket message types
38
+ */
39
+ export type MessageType = 'spawn' | 'data' | 'resize' | 'close' | 'error' | 'exit' | 'spawned';
40
+ /**
41
+ * Base message structure
42
+ */
43
+ export interface BaseMessage {
44
+ type: MessageType;
45
+ sessionId?: string;
46
+ }
47
+ /**
48
+ * Spawn request from client
49
+ */
50
+ export interface SpawnMessage extends BaseMessage {
51
+ type: 'spawn';
52
+ options?: TerminalOptions;
53
+ }
54
+ /**
55
+ * Spawned response from server
56
+ */
57
+ export interface SpawnedMessage extends BaseMessage {
58
+ type: 'spawned';
59
+ sessionId: string;
60
+ shell: string;
61
+ cwd: string;
62
+ cols: number;
63
+ rows: number;
64
+ }
65
+ /**
66
+ * Data message (bidirectional)
67
+ */
68
+ export interface DataMessage extends BaseMessage {
69
+ type: 'data';
70
+ sessionId: string;
71
+ data: string;
72
+ }
73
+ /**
74
+ * Resize request from client
75
+ */
76
+ export interface ResizeMessage extends BaseMessage {
77
+ type: 'resize';
78
+ sessionId: string;
79
+ cols: number;
80
+ rows: number;
81
+ }
82
+ /**
83
+ * Close request from client
84
+ */
85
+ export interface CloseMessage extends BaseMessage {
86
+ type: 'close';
87
+ sessionId: string;
88
+ }
89
+ /**
90
+ * Error message from server
91
+ */
92
+ export interface ErrorMessage extends BaseMessage {
93
+ type: 'error';
94
+ sessionId?: string;
95
+ error: string;
96
+ }
97
+ /**
98
+ * Exit message from server
99
+ */
100
+ export interface ExitMessage extends BaseMessage {
101
+ type: 'exit';
102
+ sessionId: string;
103
+ exitCode: number;
104
+ }
105
+ /**
106
+ * Union of all message types
107
+ */
108
+ export type TerminalMessage = SpawnMessage | SpawnedMessage | DataMessage | ResizeMessage | CloseMessage | ErrorMessage | ExitMessage;
109
+ /**
110
+ * Client configuration
111
+ */
112
+ export interface ClientConfig {
113
+ /** WebSocket URL */
114
+ url: string;
115
+ /** Reconnect on disconnect (default: true) */
116
+ reconnect?: boolean;
117
+ /** Maximum reconnection attempts (default: 10) */
118
+ maxReconnectAttempts?: number;
119
+ /** Initial reconnection delay in ms (default: 1000) */
120
+ reconnectDelay?: number;
121
+ }
122
+ /**
123
+ * Terminal session info
124
+ */
125
+ export interface SessionInfo {
126
+ sessionId: string;
127
+ shell: string;
128
+ cwd: string;
129
+ cols: number;
130
+ rows: number;
131
+ createdAt: Date;
132
+ }
133
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared types for x-shell.js
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}