@push.rocks/smartshell 3.2.4 → 3.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.
@@ -5,6 +5,7 @@ import * as cp from 'child_process';
5
5
  export class Smartshell {
6
6
  constructor(optionsArg) {
7
7
  this.smartexit = new plugins.smartexit.SmartExit();
8
+ this.nodePty = null;
8
9
  this.shellEnv = new ShellEnv(optionsArg);
9
10
  }
10
11
  /**
@@ -38,71 +39,402 @@ export class Smartshell {
38
39
  });
39
40
  });
40
41
  }
42
+ /**
43
+ * Executes a command with args array (shell:false) for security
44
+ */
45
+ async _execSpawn(options) {
46
+ const shellLogInstance = new ShellLog();
47
+ let stderrBuffer = '';
48
+ const maxBuffer = options.maxBuffer || 200 * 1024 * 1024; // Default 200MB
49
+ let bufferExceeded = false;
50
+ // Handle PTY mode if requested
51
+ if (options.usePty) {
52
+ throw new Error('PTY mode is not yet supported with execSpawn. Use exec methods with shell:true for PTY.');
53
+ }
54
+ const execChildProcess = cp.spawn(options.command, options.args || [], {
55
+ shell: false, // SECURITY: Never use shell with untrusted input
56
+ cwd: process.cwd(),
57
+ env: options.env || process.env,
58
+ detached: false,
59
+ signal: options.signal,
60
+ });
61
+ this.smartexit.addProcess(execChildProcess);
62
+ // Handle timeout
63
+ let timeoutHandle = null;
64
+ if (options.timeout) {
65
+ timeoutHandle = setTimeout(() => {
66
+ if (options.debug) {
67
+ console.log(`[smartshell] Timeout reached for process ${execChildProcess.pid}, terminating...`);
68
+ }
69
+ execChildProcess.kill('SIGTERM');
70
+ }, options.timeout);
71
+ }
72
+ // Connect stdin if passthrough is enabled (but not for interactive control)
73
+ if (options.passthrough && !options.interactiveControl && execChildProcess.stdin) {
74
+ process.stdin.pipe(execChildProcess.stdin);
75
+ }
76
+ // Create input methods for interactive control
77
+ const sendInput = async (input) => {
78
+ if (!execChildProcess.stdin) {
79
+ throw new Error('stdin is not available for this process');
80
+ }
81
+ if (execChildProcess.stdin.destroyed || !execChildProcess.stdin.writable) {
82
+ throw new Error('stdin has been destroyed or is not writable');
83
+ }
84
+ return new Promise((resolve, reject) => {
85
+ execChildProcess.stdin.write(input, 'utf8', (error) => {
86
+ if (error) {
87
+ reject(error);
88
+ }
89
+ else {
90
+ resolve();
91
+ }
92
+ });
93
+ });
94
+ };
95
+ const sendLine = async (line) => {
96
+ return sendInput(line + '\n');
97
+ };
98
+ const endInput = () => {
99
+ if (execChildProcess.stdin && !execChildProcess.stdin.destroyed) {
100
+ execChildProcess.stdin.end();
101
+ }
102
+ };
103
+ // Capture stdout and stderr output
104
+ execChildProcess.stdout.on('data', (data) => {
105
+ if (!options.silent) {
106
+ shellLogInstance.writeToConsole(data);
107
+ }
108
+ if (options.onData) {
109
+ options.onData(data);
110
+ }
111
+ if (!bufferExceeded) {
112
+ shellLogInstance.addToBuffer(data);
113
+ if (shellLogInstance.logStore.length > maxBuffer) {
114
+ bufferExceeded = true;
115
+ shellLogInstance.logStore = Buffer.from('[Output truncated - exceeded maxBuffer]');
116
+ }
117
+ }
118
+ });
119
+ execChildProcess.stderr.on('data', (data) => {
120
+ if (!options.silent) {
121
+ shellLogInstance.writeToConsole(data);
122
+ }
123
+ const dataStr = data.toString();
124
+ stderrBuffer += dataStr;
125
+ if (options.onData) {
126
+ options.onData(data);
127
+ }
128
+ if (!bufferExceeded) {
129
+ shellLogInstance.addToBuffer(data);
130
+ if (shellLogInstance.logStore.length > maxBuffer) {
131
+ bufferExceeded = true;
132
+ shellLogInstance.logStore = Buffer.from('[Output truncated - exceeded maxBuffer]');
133
+ }
134
+ }
135
+ });
136
+ // Wrap child process termination into a Promise
137
+ const childProcessEnded = new Promise((resolve, reject) => {
138
+ const handleExit = (code, signal) => {
139
+ if (timeoutHandle) {
140
+ clearTimeout(timeoutHandle);
141
+ }
142
+ this.smartexit.removeProcess(execChildProcess);
143
+ // Safely unpipe stdin when process ends if passthrough was enabled
144
+ if (options.passthrough && !options.interactiveControl) {
145
+ try {
146
+ if (execChildProcess.stdin && !execChildProcess.stdin.destroyed) {
147
+ process.stdin.unpipe(execChildProcess.stdin);
148
+ }
149
+ }
150
+ catch (err) {
151
+ if (options.debug) {
152
+ console.log(`[smartshell] Error unpiping stdin: ${err}`);
153
+ }
154
+ }
155
+ }
156
+ const exitCode = typeof code === 'number' ? code : (signal ? 1 : 0);
157
+ const execResult = {
158
+ exitCode,
159
+ stdout: shellLogInstance.logStore.toString(),
160
+ signal: signal || undefined,
161
+ stderr: stderrBuffer,
162
+ };
163
+ if (options.strict && exitCode !== 0) {
164
+ const errorMsg = signal
165
+ ? `Command "${options.command}" terminated by signal ${signal}`
166
+ : `Command "${options.command}" exited with code ${exitCode}`;
167
+ reject(new Error(errorMsg));
168
+ }
169
+ else {
170
+ resolve(execResult);
171
+ }
172
+ };
173
+ execChildProcess.once('exit', handleExit);
174
+ execChildProcess.once('error', (error) => {
175
+ if (timeoutHandle) {
176
+ clearTimeout(timeoutHandle);
177
+ }
178
+ this.smartexit.removeProcess(execChildProcess);
179
+ // Safely unpipe stdin when process errors if passthrough was enabled
180
+ if (options.passthrough && !options.interactiveControl && execChildProcess.stdin) {
181
+ try {
182
+ if (!execChildProcess.stdin.destroyed) {
183
+ process.stdin.unpipe(execChildProcess.stdin);
184
+ }
185
+ }
186
+ catch (err) {
187
+ if (options.debug) {
188
+ console.log(`[smartshell] Error unpiping stdin on error: ${err}`);
189
+ }
190
+ }
191
+ }
192
+ reject(error);
193
+ });
194
+ });
195
+ // If interactive control is enabled but not streaming, return interactive interface
196
+ if (options.interactiveControl && !options.streaming) {
197
+ return {
198
+ exitCode: 0, // Will be updated when process ends
199
+ stdout: '', // Will be updated when process ends
200
+ sendInput,
201
+ sendLine,
202
+ endInput,
203
+ finalPromise: childProcessEnded,
204
+ };
205
+ }
206
+ // If streaming mode is enabled, return a streaming interface
207
+ if (options.streaming) {
208
+ return {
209
+ childProcess: execChildProcess,
210
+ finalPromise: childProcessEnded,
211
+ sendInput,
212
+ sendLine,
213
+ endInput,
214
+ kill: async () => {
215
+ if (options.debug) {
216
+ console.log(`[smartshell] Running tree kill with SIGKILL on process ${execChildProcess.pid}`);
217
+ }
218
+ await plugins.smartexit.SmartExit.killTreeByPid(execChildProcess.pid, 'SIGKILL');
219
+ },
220
+ terminate: async () => {
221
+ if (options.debug) {
222
+ console.log(`[smartshell] Running tree kill with SIGTERM on process ${execChildProcess.pid}`);
223
+ }
224
+ await plugins.smartexit.SmartExit.killTreeByPid(execChildProcess.pid, 'SIGTERM');
225
+ },
226
+ keyboardInterrupt: async () => {
227
+ if (options.debug) {
228
+ console.log(`[smartshell] Running tree kill with SIGINT on process ${execChildProcess.pid}`);
229
+ }
230
+ await plugins.smartexit.SmartExit.killTreeByPid(execChildProcess.pid, 'SIGINT');
231
+ },
232
+ customSignal: async (signal) => {
233
+ if (options.debug) {
234
+ console.log(`[smartshell] Running tree kill with custom signal ${signal} on process ${execChildProcess.pid}`);
235
+ }
236
+ await plugins.smartexit.SmartExit.killTreeByPid(execChildProcess.pid, signal);
237
+ },
238
+ };
239
+ }
240
+ // For non-streaming mode, wait for the process to complete
241
+ return await childProcessEnded;
242
+ }
41
243
  /**
42
244
  * Executes a command and returns either a non-streaming result or a streaming interface.
43
245
  */
44
246
  async _execCommand(options) {
45
247
  const commandToExecute = this.shellEnv.createEnvExecString(options.commandString);
46
248
  const shellLogInstance = new ShellLog();
249
+ let stderrBuffer = '';
250
+ const maxBuffer = options.maxBuffer || 200 * 1024 * 1024; // Default 200MB
251
+ let bufferExceeded = false;
252
+ // Handle PTY mode if requested
253
+ if (options.usePty) {
254
+ return await this._execCommandPty(options, commandToExecute, shellLogInstance);
255
+ }
47
256
  const execChildProcess = cp.spawn(commandToExecute, [], {
48
257
  shell: true,
49
258
  cwd: process.cwd(),
50
- env: process.env,
259
+ env: options.env || process.env,
51
260
  detached: false,
261
+ signal: options.signal,
52
262
  });
53
263
  this.smartexit.addProcess(execChildProcess);
54
- // Capture stdout and stderr output.
264
+ // Handle timeout
265
+ let timeoutHandle = null;
266
+ if (options.timeout) {
267
+ timeoutHandle = setTimeout(() => {
268
+ if (options.debug) {
269
+ console.log(`[smartshell] Timeout reached for process ${execChildProcess.pid}, terminating...`);
270
+ }
271
+ execChildProcess.kill('SIGTERM');
272
+ }, options.timeout);
273
+ }
274
+ // Connect stdin if passthrough is enabled (but not for interactive control)
275
+ if (options.passthrough && !options.interactiveControl && execChildProcess.stdin) {
276
+ process.stdin.pipe(execChildProcess.stdin);
277
+ }
278
+ // Create input methods for interactive control
279
+ const sendInput = async (input) => {
280
+ if (!execChildProcess.stdin) {
281
+ throw new Error('stdin is not available for this process');
282
+ }
283
+ if (execChildProcess.stdin.destroyed || !execChildProcess.stdin.writable) {
284
+ throw new Error('stdin has been destroyed or is not writable');
285
+ }
286
+ return new Promise((resolve, reject) => {
287
+ execChildProcess.stdin.write(input, 'utf8', (error) => {
288
+ if (error) {
289
+ reject(error);
290
+ }
291
+ else {
292
+ resolve();
293
+ }
294
+ });
295
+ });
296
+ };
297
+ const sendLine = async (line) => {
298
+ return sendInput(line + '\n');
299
+ };
300
+ const endInput = () => {
301
+ if (execChildProcess.stdin && !execChildProcess.stdin.destroyed) {
302
+ execChildProcess.stdin.end();
303
+ }
304
+ };
305
+ // Capture stdout and stderr output
55
306
  execChildProcess.stdout.on('data', (data) => {
56
307
  if (!options.silent) {
57
308
  shellLogInstance.writeToConsole(data);
58
309
  }
59
- shellLogInstance.addToBuffer(data);
310
+ if (options.onData) {
311
+ options.onData(data);
312
+ }
313
+ if (!bufferExceeded) {
314
+ shellLogInstance.addToBuffer(data);
315
+ if (shellLogInstance.logStore.length > maxBuffer) {
316
+ bufferExceeded = true;
317
+ shellLogInstance.logStore = Buffer.from('[Output truncated - exceeded maxBuffer]');
318
+ }
319
+ }
60
320
  });
61
321
  execChildProcess.stderr.on('data', (data) => {
62
322
  if (!options.silent) {
63
323
  shellLogInstance.writeToConsole(data);
64
324
  }
65
- shellLogInstance.addToBuffer(data);
325
+ const dataStr = data.toString();
326
+ stderrBuffer += dataStr;
327
+ if (options.onData) {
328
+ options.onData(data);
329
+ }
330
+ if (!bufferExceeded) {
331
+ shellLogInstance.addToBuffer(data);
332
+ if (shellLogInstance.logStore.length > maxBuffer) {
333
+ bufferExceeded = true;
334
+ shellLogInstance.logStore = Buffer.from('[Output truncated - exceeded maxBuffer]');
335
+ }
336
+ }
66
337
  });
67
- // Wrap child process termination into a Promise.
338
+ // Wrap child process termination into a Promise
68
339
  const childProcessEnded = new Promise((resolve, reject) => {
69
- execChildProcess.on('exit', (code, signal) => {
340
+ const handleExit = (code, signal) => {
341
+ if (timeoutHandle) {
342
+ clearTimeout(timeoutHandle);
343
+ }
70
344
  this.smartexit.removeProcess(execChildProcess);
345
+ // Safely unpipe stdin when process ends if passthrough was enabled
346
+ if (options.passthrough && !options.interactiveControl) {
347
+ try {
348
+ if (execChildProcess.stdin && !execChildProcess.stdin.destroyed) {
349
+ process.stdin.unpipe(execChildProcess.stdin);
350
+ }
351
+ }
352
+ catch (err) {
353
+ if (options.debug) {
354
+ console.log(`[smartshell] Error unpiping stdin: ${err}`);
355
+ }
356
+ }
357
+ }
358
+ const exitCode = typeof code === 'number' ? code : (signal ? 1 : 0);
71
359
  const execResult = {
72
- exitCode: typeof code === 'number' ? code : (signal ? 1 : 0),
360
+ exitCode,
73
361
  stdout: shellLogInstance.logStore.toString(),
362
+ signal: signal || undefined,
363
+ stderr: stderrBuffer,
74
364
  };
75
- if (options.strict && code !== 0) {
76
- reject(new Error(`Command "${options.commandString}" exited with code ${code}`));
365
+ if (options.strict && exitCode !== 0) {
366
+ const errorMsg = signal
367
+ ? `Command "${options.commandString}" terminated by signal ${signal}`
368
+ : `Command "${options.commandString}" exited with code ${exitCode}`;
369
+ reject(new Error(errorMsg));
77
370
  }
78
371
  else {
79
372
  resolve(execResult);
80
373
  }
81
- });
82
- execChildProcess.on('error', (error) => {
374
+ };
375
+ execChildProcess.once('exit', handleExit);
376
+ execChildProcess.once('error', (error) => {
377
+ if (timeoutHandle) {
378
+ clearTimeout(timeoutHandle);
379
+ }
83
380
  this.smartexit.removeProcess(execChildProcess);
381
+ // Safely unpipe stdin when process errors if passthrough was enabled
382
+ if (options.passthrough && !options.interactiveControl && execChildProcess.stdin) {
383
+ try {
384
+ if (!execChildProcess.stdin.destroyed) {
385
+ process.stdin.unpipe(execChildProcess.stdin);
386
+ }
387
+ }
388
+ catch (err) {
389
+ if (options.debug) {
390
+ console.log(`[smartshell] Error unpiping stdin on error: ${err}`);
391
+ }
392
+ }
393
+ }
84
394
  reject(error);
85
395
  });
86
396
  });
87
- // If streaming mode is enabled, return a streaming interface immediately.
397
+ // If interactive control is enabled but not streaming, return interactive interface
398
+ if (options.interactiveControl && !options.streaming) {
399
+ return {
400
+ exitCode: 0, // Will be updated when process ends
401
+ stdout: '', // Will be updated when process ends
402
+ sendInput,
403
+ sendLine,
404
+ endInput,
405
+ finalPromise: childProcessEnded,
406
+ };
407
+ }
408
+ // If streaming mode is enabled, return a streaming interface
88
409
  if (options.streaming) {
89
410
  return {
90
411
  childProcess: execChildProcess,
91
412
  finalPromise: childProcessEnded,
413
+ sendInput,
414
+ sendLine,
415
+ endInput,
92
416
  kill: async () => {
93
- console.log(`Running tree kill with SIGKILL on process ${execChildProcess.pid}`);
417
+ if (options.debug) {
418
+ console.log(`[smartshell] Running tree kill with SIGKILL on process ${execChildProcess.pid}`);
419
+ }
94
420
  await plugins.smartexit.SmartExit.killTreeByPid(execChildProcess.pid, 'SIGKILL');
95
421
  },
96
422
  terminate: async () => {
97
- console.log(`Running tree kill with SIGTERM on process ${execChildProcess.pid}`);
423
+ if (options.debug) {
424
+ console.log(`[smartshell] Running tree kill with SIGTERM on process ${execChildProcess.pid}`);
425
+ }
98
426
  await plugins.smartexit.SmartExit.killTreeByPid(execChildProcess.pid, 'SIGTERM');
99
427
  },
100
428
  keyboardInterrupt: async () => {
101
- console.log(`Running tree kill with SIGINT on process ${execChildProcess.pid}`);
429
+ if (options.debug) {
430
+ console.log(`[smartshell] Running tree kill with SIGINT on process ${execChildProcess.pid}`);
431
+ }
102
432
  await plugins.smartexit.SmartExit.killTreeByPid(execChildProcess.pid, 'SIGINT');
103
433
  },
104
434
  customSignal: async (signal) => {
105
- console.log(`Running tree kill with custom signal ${signal} on process ${execChildProcess.pid}`);
435
+ if (options.debug) {
436
+ console.log(`[smartshell] Running tree kill with custom signal ${signal} on process ${execChildProcess.pid}`);
437
+ }
106
438
  await plugins.smartexit.SmartExit.killTreeByPid(execChildProcess.pid, signal);
107
439
  },
108
440
  };
@@ -111,7 +443,9 @@ export class Smartshell {
111
443
  return await childProcessEnded;
112
444
  }
113
445
  async exec(commandString) {
114
- return (await this._exec({ commandString }));
446
+ const result = await this._exec({ commandString });
447
+ // Type assertion is safe here because non-streaming, non-interactive exec always returns IExecResult
448
+ return result;
115
449
  }
116
450
  async execSilent(commandString) {
117
451
  return (await this._exec({ commandString, silent: true }));
@@ -131,19 +465,256 @@ export class Smartshell {
131
465
  async execInteractive(commandString) {
132
466
  await this._exec({ commandString, interactive: true });
133
467
  }
134
- async execAndWaitForLine(commandString, regex, silent = false) {
468
+ async execPassthrough(commandString) {
469
+ return await this._exec({ commandString, passthrough: true });
470
+ }
471
+ async execStreamingPassthrough(commandString) {
472
+ return await this._exec({ commandString, streaming: true, passthrough: true });
473
+ }
474
+ async execInteractiveControl(commandString) {
475
+ return await this._exec({ commandString, interactiveControl: true });
476
+ }
477
+ async execStreamingInteractiveControl(commandString) {
478
+ return await this._exec({ commandString, streaming: true, interactiveControl: true });
479
+ }
480
+ async execInteractiveControlPty(commandString) {
481
+ return await this._exec({ commandString, interactiveControl: true, usePty: true });
482
+ }
483
+ async execStreamingInteractiveControlPty(commandString) {
484
+ return await this._exec({ commandString, streaming: true, interactiveControl: true, usePty: true });
485
+ }
486
+ /**
487
+ * Executes a command with args array (shell:false) for security
488
+ * This is the recommended API for untrusted input
489
+ */
490
+ async execSpawn(command, args = [], options = {}) {
491
+ const result = await this._execSpawn({ command, args, ...options });
492
+ // Type assertion is safe here because non-streaming, non-interactive exec always returns IExecResult
493
+ return result;
494
+ }
495
+ /**
496
+ * Executes a command with args array in streaming mode
497
+ */
498
+ async execSpawnStreaming(command, args = [], options = {}) {
499
+ return await this._execSpawn({ command, args, streaming: true, ...options });
500
+ }
501
+ /**
502
+ * Executes a command with args array with interactive control
503
+ */
504
+ async execSpawnInteractiveControl(command, args = [], options = {}) {
505
+ return await this._execSpawn({ command, args, interactiveControl: true, ...options });
506
+ }
507
+ async execAndWaitForLine(commandString, regex, silent = false, options = {}) {
135
508
  const execStreamingResult = await this.execStreaming(commandString, silent);
136
- return new Promise((resolve) => {
137
- execStreamingResult.childProcess.stdout.on('data', (chunk) => {
509
+ return new Promise((resolve, reject) => {
510
+ let matched = false;
511
+ let timeoutHandle = null;
512
+ // Set up timeout if specified
513
+ if (options.timeout) {
514
+ timeoutHandle = setTimeout(async () => {
515
+ if (!matched) {
516
+ matched = true;
517
+ // Remove listener to prevent memory leak
518
+ execStreamingResult.childProcess.stdout.removeAllListeners('data');
519
+ await execStreamingResult.terminate();
520
+ reject(new Error(`Timeout waiting for pattern after ${options.timeout}ms`));
521
+ }
522
+ }, options.timeout);
523
+ }
524
+ const dataHandler = async (chunk) => {
138
525
  const data = typeof chunk === 'string' ? chunk : chunk.toString();
139
- if (regex.test(data)) {
526
+ if (!matched && regex.test(data)) {
527
+ matched = true;
528
+ // Clear timeout if set
529
+ if (timeoutHandle) {
530
+ clearTimeout(timeoutHandle);
531
+ }
532
+ // Remove listener to prevent memory leak
533
+ execStreamingResult.childProcess.stdout.removeListener('data', dataHandler);
534
+ // Terminate process if requested
535
+ if (options.terminateOnMatch) {
536
+ await execStreamingResult.terminate();
537
+ await execStreamingResult.finalPromise;
538
+ }
140
539
  resolve();
141
540
  }
541
+ };
542
+ execStreamingResult.childProcess.stdout.on('data', dataHandler);
543
+ // Also resolve/reject when process ends
544
+ execStreamingResult.finalPromise.then(() => {
545
+ if (!matched) {
546
+ matched = true;
547
+ if (timeoutHandle) {
548
+ clearTimeout(timeoutHandle);
549
+ }
550
+ reject(new Error('Process ended without matching pattern'));
551
+ }
552
+ }).catch((err) => {
553
+ if (!matched) {
554
+ matched = true;
555
+ if (timeoutHandle) {
556
+ clearTimeout(timeoutHandle);
557
+ }
558
+ reject(err);
559
+ }
142
560
  });
143
561
  });
144
562
  }
145
- async execAndWaitForLineSilent(commandString, regex) {
146
- return this.execAndWaitForLine(commandString, regex, true);
563
+ async execAndWaitForLineSilent(commandString, regex, options) {
564
+ return this.execAndWaitForLine(commandString, regex, true, options);
565
+ }
566
+ async lazyLoadNodePty() {
567
+ if (this.nodePty) {
568
+ return this.nodePty;
569
+ }
570
+ try {
571
+ // Try to load node-pty if available
572
+ // @ts-ignore - node-pty is optional
573
+ this.nodePty = await import('node-pty');
574
+ return this.nodePty;
575
+ }
576
+ catch (error) {
577
+ throw new Error('node-pty is required for PTY support but is not installed.\n' +
578
+ 'Please install it as an optional dependency:\n' +
579
+ ' pnpm add --save-optional node-pty\n' +
580
+ 'Note: node-pty requires compilation and may have platform-specific requirements.');
581
+ }
582
+ }
583
+ async _execCommandPty(options, commandToExecute, shellLogInstance) {
584
+ const pty = await this.lazyLoadNodePty();
585
+ // Platform-aware shell selection
586
+ let shell;
587
+ let shellArgs;
588
+ if (options.ptyShell) {
589
+ // User-provided shell override
590
+ shell = options.ptyShell;
591
+ shellArgs = ['-c', commandToExecute];
592
+ }
593
+ else if (process.platform === 'win32') {
594
+ // Windows: Use PowerShell by default, or cmd as fallback
595
+ const powershell = process.env.PROGRAMFILES
596
+ ? `${process.env.PROGRAMFILES}\\PowerShell\\7\\pwsh.exe`
597
+ : 'powershell.exe';
598
+ // Check if PowerShell Core exists, otherwise use Windows PowerShell
599
+ const fs = await import('fs');
600
+ if (fs.existsSync(powershell)) {
601
+ shell = powershell;
602
+ shellArgs = ['-NoProfile', '-NonInteractive', '-Command', commandToExecute];
603
+ }
604
+ else if (process.env.COMSPEC) {
605
+ shell = process.env.COMSPEC;
606
+ shellArgs = ['/d', '/s', '/c', commandToExecute];
607
+ }
608
+ else {
609
+ shell = 'cmd.exe';
610
+ shellArgs = ['/d', '/s', '/c', commandToExecute];
611
+ }
612
+ }
613
+ else {
614
+ // POSIX: Use SHELL env var or bash as default
615
+ shell = process.env.SHELL || '/bin/bash';
616
+ shellArgs = ['-c', commandToExecute];
617
+ }
618
+ // Create PTY process
619
+ const ptyProcess = pty.spawn(shell, shellArgs, {
620
+ name: options.ptyTerm || 'xterm-256color',
621
+ cols: options.ptyCols || 120,
622
+ rows: options.ptyRows || 30,
623
+ cwd: process.cwd(),
624
+ env: options.env || process.env,
625
+ });
626
+ // Add to smartexit (wrap in a minimal object with pid)
627
+ this.smartexit.addProcess({ pid: ptyProcess.pid });
628
+ // Handle output (stdout and stderr are combined in PTY)
629
+ ptyProcess.onData((data) => {
630
+ if (!options.silent) {
631
+ shellLogInstance.writeToConsole(data);
632
+ }
633
+ shellLogInstance.addToBuffer(data);
634
+ });
635
+ // Wrap PTY termination into a Promise
636
+ const childProcessEnded = new Promise((resolve, reject) => {
637
+ ptyProcess.onExit(({ exitCode, signal }) => {
638
+ this.smartexit.removeProcess({ pid: ptyProcess.pid });
639
+ const execResult = {
640
+ exitCode: exitCode ?? (signal ? 1 : 0),
641
+ stdout: shellLogInstance.logStore.toString(),
642
+ };
643
+ if (options.strict && exitCode !== 0) {
644
+ reject(new Error(`Command "${options.commandString}" exited with code ${exitCode}`));
645
+ }
646
+ else {
647
+ resolve(execResult);
648
+ }
649
+ });
650
+ });
651
+ // Create input methods for PTY
652
+ const sendInput = async (input) => {
653
+ return new Promise((resolve, reject) => {
654
+ try {
655
+ ptyProcess.write(input);
656
+ resolve();
657
+ }
658
+ catch (error) {
659
+ reject(error);
660
+ }
661
+ });
662
+ };
663
+ const sendLine = async (line) => {
664
+ // Use \r for PTY (carriage return is typical for terminal line discipline)
665
+ return sendInput(line + '\r');
666
+ };
667
+ const endInput = () => {
668
+ // Send EOF (Ctrl+D) to PTY
669
+ ptyProcess.write('\x04');
670
+ };
671
+ // If interactive control is enabled but not streaming, return interactive interface
672
+ if (options.interactiveControl && !options.streaming) {
673
+ return {
674
+ exitCode: 0, // Will be updated when process ends
675
+ stdout: '', // Will be updated when process ends
676
+ sendInput,
677
+ sendLine,
678
+ endInput,
679
+ finalPromise: childProcessEnded,
680
+ };
681
+ }
682
+ // If streaming mode is enabled, return a streaming interface
683
+ if (options.streaming) {
684
+ return {
685
+ childProcess: { pid: ptyProcess.pid }, // Minimal compatibility object
686
+ finalPromise: childProcessEnded,
687
+ sendInput,
688
+ sendLine,
689
+ endInput,
690
+ kill: async () => {
691
+ if (options.debug) {
692
+ console.log(`[smartshell] Killing PTY process ${ptyProcess.pid}`);
693
+ }
694
+ ptyProcess.kill();
695
+ },
696
+ terminate: async () => {
697
+ if (options.debug) {
698
+ console.log(`[smartshell] Terminating PTY process ${ptyProcess.pid}`);
699
+ }
700
+ ptyProcess.kill('SIGTERM');
701
+ },
702
+ keyboardInterrupt: async () => {
703
+ if (options.debug) {
704
+ console.log(`[smartshell] Sending SIGINT to PTY process ${ptyProcess.pid}`);
705
+ }
706
+ ptyProcess.kill('SIGINT');
707
+ },
708
+ customSignal: async (signal) => {
709
+ if (options.debug) {
710
+ console.log(`[smartshell] Sending ${signal} to PTY process ${ptyProcess.pid}`);
711
+ }
712
+ ptyProcess.kill(signal);
713
+ },
714
+ };
715
+ }
716
+ // For non-streaming mode, wait for the process to complete
717
+ return await childProcessEnded;
147
718
  }
148
719
  }
149
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydHNoZWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5zbWFydHNoZWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUF5QnBDLE1BQU0sT0FBTyxVQUFVO0lBSXJCLFlBQVksVUFBc0M7UUFGM0MsY0FBUyxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUduRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBcUI7UUFDdkMsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEIsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBQ0QsT0FBTyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQTRDO1FBQ3pFLGlEQUFpRDtRQUNqRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbkIsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFB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
720
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydHNoZWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5zbWFydHNoZWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUF1RHBDLE1BQU0sT0FBTyxVQUFVO0lBSXJCLFlBQVksVUFBc0M7UUFGM0MsY0FBUyxHQUFHLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQWdvQjdDLFlBQU8sR0FBUSxJQUFJLENBQUM7UUE3bkIxQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBcUI7UUFDdkMsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEIsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBQ0QsT0FBTyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQTRDO1FBQ3pFLGlEQUFpRDtRQUNqRCxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbkIsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkMsTUFBTSxLQUFLLEdBQUcsRUFB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