/** * @file spawn-util.ts — 最底层进程执行原语 * @description 统一收敛所有子进程调用(spawn)的刚需关注点: * - 超时(到点 SIGTERM 终止,回填超时原因到 stderr) * - stdout/stderr 字节收集(utf-8 解码)+ 可选按行/按块回调 * - 退出码归一化(区分 killed / process error.code / close code) * * 本模块是「进程原语层」,不感知任何业务语义(沙箱安全 / 信任模型 / * 交互缓冲 / prelude 注入 / 产物扫描均不属于此层职责)。 * 上层装饰层(SandboxShellExecutor 的安全拦截)与编排层 * (LocalSandbox / ProcessCodeSandbox / BaseRuntimeRunner)应复用本函数, * 而非各自重复手写 spawn + 定时器 + buffer 累加。 */ /** 进程执行选项 */ export interface RunProcessOptions { /** 解释器 / 命令(不含参数) */ command: string; /** 命令参数 */ args?: string[]; /** 工作目录(默认当前进程 cwd) */ cwd?: string; /** 子进程环境变量(默认空对象,调用方需自行合并 process.env 或沙箱 env) */ env?: Record; /** 超时(ms),到点发送 SIGTERM;默认 30000 */ timeout?: number; /** stdout 每收到一行(以 \n 切分)回调一次(含结尾不带 \n 的剩余缓冲在 close 时补发) */ onStdoutLine?: (line: string) => void; /** stderr 每收到一块回调一次 */ onStderrChunk?: (chunk: string) => void; /** 超时后发送的信号,默认 SIGTERM */ killSignal?: NodeJS.Signals; } /** 进程执行结果(已归一化) */ export interface RunProcessResult { stdout: string; stderr: string; /** 归一化退出码:正常 close 取 code;超时/信号置 1;spawn error 置 1 */ exitCode: number; /** 是否因超时被终止 */ killed: boolean; /** * spawn 阶段错误(如 ENOENT)的错误消息;进程正常启动则为 undefined。 * 需要区分「命令不存在」与「运行失败」的调用方(如解释器探测)可据此分流。 */ spawnError?: string; } /** * 执行一个子进程并归一化结果。 * * 行为约定(对齐历史 LocalSandbox / ProcessCodeSandbox 的 spawn 实现,并修复其一处理 stdout 重复 bug): * - 超时到点:kill(killSignal),stderr 前缀追加 `[Sandbox] 执行超时({timeout}ms),进程被终止`, * exitCode 置 1,killed=true。 * - spawn error(如 ENOENT):stderr 追加 error.message,exitCode=1。 * - close code 为 null(被信号杀死且未超时):exitCode=1。 * - stdout 按行回调:保留 lineBuf,close 时若有剩余未换行内容补发一次回调; * 该剩余内容已在 data 回调中计入 stdout,close 不再重复累加(历史实现会重复计入,属 bug,此处修正)。 */ export declare function runProcess(opts: RunProcessOptions): Promise; //# sourceMappingURL=spawn-util.d.ts.map