UNPKG

eve

Version:

Filesystem-first framework for durable backend AI agents that run anywhere.

1 lines 4.8 kB
import{withoutCodingAgentMarkers}from"./coding-agent-env.js";import{createProcessOutputBuffer}from"./process-output.js";import{armProcessAbort}from"./process-abort.js";import{dirname,join,resolve}from"node:path";import{accessSync,constants,existsSync,statSync}from"node:fs";import{spawn}from"node:child_process";const CONNECT_FEATURE_FLAG_ENV={FF_CONNECT_ENABLED:`1`};function buildSpawnEnv(e){return{...withoutCodingAgentMarkers(process.env),...CONNECT_FEATURE_FLAG_ENV,...e}}function commandArgs(e,t){return!t||e.includes(`--non-interactive`)?e:[...e,`--non-interactive`]}function existingDir(e){let t=resolve(e);for(;!existsSync(t);){let e=dirname(t);if(e===t)break;t=e}return t}function armDeadline(e,t,n){if(t===void 0)return()=>{};let r=setTimeout(()=>{n(),e.kill(`SIGTERM`);let t=setTimeout(()=>e.kill(`SIGKILL`),5e3);t.unref(),e.once(`close`,()=>clearTimeout(t))},t);return r.unref(),()=>clearTimeout(r)}function timeoutMessage(e,t){return`vercel ${e.join(` `)} timed out after ${Math.round(t/1e3)}s and was aborted.`}function abortMessage(e){return`vercel ${e.join(` `)} was aborted.`}function isAbortError(e,t){return t?.aborted===!0||e.name===`AbortError`||e.code===`ABORT_ERR`}function ancestorDirectories(e){let t=[],n=resolve(e);for(;;){t.push(n);let e=dirname(n);if(e===n)return t;n=e}}function findExecutable(e){try{if(accessSync(e,constants.F_OK|constants.X_OK),statSync(e).isFile())return e}catch{return}}function vercelExecutableNames(e){return e===`win32`?[`vercel.cmd`,`vercel.exe`]:[`vercel`]}function findLocalVercel(e,t){for(let n of ancestorDirectories(e))for(let e of vercelExecutableNames(t)){let t=findExecutable(join(n,`node_modules`,`.bin`,e));if(t!==void 0)return t}}function resolveVercelInvocation(e,t=[],n=process.platform){let r=findLocalVercel(e,n);return n===`win32`?{command:r??`vercel`,commandArgs:t,shell:!0}:r===void 0?{command:`vercel`,commandArgs:t}:{command:r,commandArgs:t}}function stdinMode(e){return e.stdin===void 0?e.nonInteractive?`ignore`:`inherit`:`pipe`}function writeStdin(e,t,n){t!==void 0&&e.stdin!==null&&(e.stdin.once(`error`,n),e.stdin.end(t,`utf8`))}function stdioForRun(e){return e.onOutput||e.stdin!==void 0?[stdinMode(e),`pipe`,`pipe`]:e.nonInteractive?[`ignore`,`pipe`,`pipe`]:`inherit`}function runVercelProcess(e,t,n){return t.signal?.aborted===!0?Promise.resolve(n.result({ok:!1,stdout:``,stderr:``,errno:`ABORT_ERR`,message:abortMessage(e)})):new Promise(r=>{let i=existingDir(t.cwd),a=resolveVercelInvocation(i,commandArgs(e,t.nonInteractive)),o=t.onOutput&&createProcessOutputBuffer(t.onOutput),s=spawn(a.command,a.commandArgs,{cwd:i,stdio:n.stdio,env:buildSpawnEnv(t.extraEnv??{}),shell:a.shell,signal:t.signal}),c=armProcessAbort(s,t.signal),l=[],u=[];s.stdout?.on(`data`,e=>{n.capture?l.push(e.toString(`utf8`)):o?.write(`stdout`,e)}),s.stderr?.on(`data`,e=>{n.capture&&u.push(e.toString(`utf8`)),o?.write(`stderr`,e)});let d=!1;function settle(e,i){d||(d=!0,o?.flush(),i&&!e.ok&&(t.onOutput===void 0?n.reportWithoutRenderer&&process.stderr.write(`\n${e.message}\n`):t.onOutput({stream:`stderr`,text:e.message})),r(n.result(e)))}function captured(){return{stdout:l.join(``),stderr:u.join(``)}}function fail(e,t=!0){settle({ok:!1,...captured(),...e},t)}let f=armDeadline(s,t.timeoutMs,()=>{fail({code:null,message:timeoutMessage(e,t.timeoutMs??0)})});writeStdin(s,t.stdin,t=>{fail({errno:t.code,message:`vercel ${e.join(` `)} stdin failed: ${t.message}`})}),s.on(`error`,n=>{isAbortError(n,t.signal)||(c(),f(),fail({errno:n.code,message:n.code===`ENOENT`?`Vercel CLI not found. Install with: npm i -g vercel@latest`:`vercel ${e.join(` `)} failed: ${n.message}`}))}),s.on(`close`,n=>{if(c(),f(),t.signal?.aborted===!0){fail({code:n,errno:`ABORT_ERR`,message:abortMessage(e)},!1);return}if(n===0){settle({ok:!0,...captured()},!1);return}fail(n===null?{code:n,message:abortMessage(e)}:{code:n,message:`vercel ${e.join(` `)} exited with code ${n}.`},n!==null)})})}async function runVercel(e,t){return runVercelProcess(e,t,{stdio:stdioForRun(t),capture:!1,reportWithoutRenderer:!0,result:e=>e.ok})}async function runVercelCaptureStdout(e,t){return runVercelProcess(e,t,{stdio:[stdinMode(t),`pipe`,t.onOutput?`pipe`:`inherit`],capture:!0,reportWithoutRenderer:!0,result:({ok:e,stdout:t,stderr:n})=>n.length===0?{ok:e,stdout:t}:{ok:e,stdout:t,stderr:n}})}function toCaptureFailure(e){let t={stdout:e.stdout,stderr:e.stderr,message:e.message};return e.code!==void 0&&(t.code=e.code),e.errno!==void 0&&(t.errno=e.errno),t}async function captureVercel(e,t){return runVercelProcess(e,t,{stdio:[t.stdin===void 0?`ignore`:`pipe`,`pipe`,`pipe`],capture:!0,reportWithoutRenderer:!1,result:e=>e.ok?{ok:!0,stdout:e.stdout}:{ok:!1,failure:toCaptureFailure(e)}})}export{captureVercel,resolveVercelInvocation,runVercel,runVercelCaptureStdout};