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.
5 lines (4 loc) • 1.75 kB
JavaScript
import{EventEmitter as a}from"node:events";import{log as s}from"../../core/log/index.js";const c=3e4;class u extends a{stdin=null;nextId=1;pending=new Map;buf="";closed=!1;bind(i,e){this.stdin=i,e.setEncoding("utf8"),e.on("data",t=>{this.buf+=t,this.drain()}),e.on("error",t=>{s.error("pi-transport",`stdout error: ${t.message}`)}),i.on("error",t=>{s.error("pi-transport",`stdin error: ${t.message}`)})}send(i,e){return new Promise((t,n)=>{if(this.closed||!this.stdin){n(new Error("transport closed"));return}const r=this.nextId++,p={id:r,type:i,...e},l=JSON.stringify(p)+`
`,o=setTimeout(()=>{this.pending.delete(r),n(new Error(`command timeout: ${i} (id=${r})`))},c);this.pending.set(r,{resolve:t,reject:n,timer:o}),this.stdin.write(l,d=>{d&&(clearTimeout(o),this.pending.delete(r),n(d))})})}sendNoWait(i){if(this.closed||!this.stdin)return;const e=JSON.stringify(i)+`
`;this.stdin.write(e,t=>{t&&s.error("pi-transport",`sendNoWait write error: ${t.message}`)})}close(){this.closed=!0;for(const[i,e]of this.pending)clearTimeout(e.timer),e.reject(new Error("transport closed"));this.pending.clear(),this.removeAllListeners()}drain(){let i;for(;(i=this.buf.indexOf(`
`))!==-1;){const e=this.buf.substring(0,i);this.buf=this.buf.substring(i+1),e.length!==0&&this.handleLine(e)}}handleLine(i){let e;try{e=JSON.parse(i)}catch{s.error("pi-transport",`invalid JSON: ${i.slice(0,200)}`);return}if("type"in e&&e.type==="response"&&"id"in e&&typeof e.id=="number"){const t=e,n=this.pending.get(t.id);n?(clearTimeout(n.timer),this.pending.delete(t.id),n.resolve(t)):s.info("pi-transport",`[WARN] response for unknown id=${t.id} cmd=${t.command}`)}else{const t=e;s.info("pi-transport",`event: type=${t.type}`),this.emit("event",t)}}}export{u as PiTransport};