@push.rocks/smartshell 3.2.3 → 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.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.shelllog.d.ts +1 -1
- package/dist_ts/classes.smartshell.d.ts +70 -2
- package/dist_ts/classes.smartshell.js +595 -24
- package/package.json +5 -6
- package/readme.md +552 -71
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.smartshell.ts +695 -25
|
@@ -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
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
360
|
+
exitCode,
|
|
73
361
|
stdout: shellLogInstance.logStore.toString(),
|
|
362
|
+
signal: signal || undefined,
|
|
363
|
+
stderr: stderrBuffer,
|
|
74
364
|
};
|
|
75
|
-
if (options.strict &&
|
|
76
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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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
|