grix-connector
Version:
Connect local AI coding agents (Claude, Codex, Gemini, Qwen, DeepSeek, Cursor, OpenCode, Pi, OpenHuman, Reasonix) to the Grix scheduling platform. Also serves as an OpenClaw plugin for Grix channel transport.
4 lines (3 loc) • 2.17 kB
JavaScript
import{accessSync as m,constants as l}from"node:fs";import{spawn as d,execSync as w}from"node:child_process";import{isAbsolute as h,join as u}from"node:path";const S=process.platform==="win32"?";":":";function P(t){try{return m(t,l.X_OK),!0}catch{return!1}}function b(t,i){const s=String(t??"").trim();if(!s||h(s))return s;const a=process.platform==="win32",c=String(i??process.env.PATH??""),e=[],n=new Set;for(const o of c.split(S)){const r=o.trim();if(!r)continue;if(a){const f=u(r,s+".cmd");n.has(f)||(n.add(f),e.push(f))}const p=u(r,s);n.has(p)||(n.add(p),e.push(p))}for(const o of e)if(P(o))return o;return console.warn(`[spawn:resolve] command="${s}" not found in PATH. candidates tried: [${e.join(", ")}] PATH=${c.substring(0,500)}${c.length>500?"...(truncated)":""}`),s}function k(t,i,s={}){const{cwd:a,env:c,...e}=s,n={stdio:e.stdio??["pipe","pipe","pipe"],env:c??{...process.env},cwd:a,windowsHide:!0,...e};if(process.platform==="win32"&&/\.(cmd|bat)$/i.test(t)){const r=process.env.ComSpec||"cmd.exe",p=`""${t}" ${i.join(" ")}"`;return{process:d(r,["/d","/s","/c",p],{...n,windowsVerbatimArguments:!0}),isCmdSpawn:!0}}return{process:d(t,i,{...n,detached:n.detached??!0}),isCmdSpawn:!1}}async function x(t,i=[]){return!t||t<=0?!1:new Promise(s=>{if(process.platform==="win32"){const e=d("wmic",["process","where",`(ParentProcessId=${t})`,"get","ProcessId"],{stdio:"pipe",timeout:3e3});let n="";e.stdout?.on("data",o=>{n+=o.toString()}),e.on("close",()=>{const o=n.split(`
`).map(r=>parseInt(r.trim(),10)).filter(r=>!isNaN(r)&&r>0&&!i.includes(r));s(o.length>0)}),e.on("error",()=>s(!1));return}const a=d("pgrep",["-g",String(t)],{stdio:"pipe",timeout:3e3}),c=[];a.stdout?.on("data",e=>{e.toString().split(`
`).forEach(n=>{const o=parseInt(n.trim(),10);!isNaN(o)&&o>0&&c.push(o)})}),a.on("close",()=>s(c.filter(e=>!i.includes(e)).length>0)),a.on("error",()=>s(!1))})}function y(t,i="SIGTERM"){if(t.pid){if(process.platform==="win32"){try{w(`taskkill /pid ${t.pid} /T /F`,{stdio:"pipe",timeout:5e3})}catch{t.kill(i)}return}try{process.kill(-t.pid,i)}catch{t.kill(i)}}}export{x as hasChildProcesses,y as killProcessGroup,b as resolveCommandPath,k as spawnCommand};