mirror of
https://github.com/deepseek-ai/deepseek-harness.git
synced 2026-08-30 04:40:37 +00:00
42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
/**
|
|
* Shared no-shell `execFile` runner for host-native OS integrations.
|
|
* @module @deepseek-ai/dsh-native-command/runner
|
|
*/
|
|
|
|
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 })
|
|
},
|
|
)
|
|
})
|