| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- /**
- * Shared no-shell `execFile` runner for host-native OS integrations (the
- * native directory chooser, the open-with-default-application hand-off):
- * utf8 stdio capture, abort propagation, Windows console hide. A library,
- * not a plugin — no ctx, no state, no events.
- * @module @deepseek-ai/dsh-native-command
- */
- import { execFile } from 'node:child_process'
- /** Testable command boundary; native implementations never invoke a shell. */
- export type NativeCommandRunner = (
- command: string,
- args: readonly string[],
- signal: AbortSignal,
- ) => Promise<{ stdout: string; stderr: string }>
- /**
- * Run a host command with utf8 stdio, abort propagation, and Windows hide.
- * @param command - executable path or PATH name.
- * @param args - argv (never a shell string).
- * @param signal - caller/connection lifetime; abort terminates the child.
- * @returns captured stdout/stderr on exit 0.
- */
- export const runNativeCommand: NativeCommandRunner = (command, args, signal) =>
- new Promise((resolve, reject) => {
- execFile(
- command,
- [...args],
- { encoding: 'utf8', signal, windowsHide: true },
- (error, stdout, stderr) => {
- if (error !== null) {
- const failure = Object.assign(new Error(error.message, { cause: error }), {
- code: error.code,
- stdout,
- stderr,
- })
- reject(failure)
- return
- }
- resolve({ stdout, stderr })
- },
- )
- })
|