@orcha-ai/runtime-bridge 0.1.24 → 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,22 +1,23 @@
1
1
  #!/usr/bin/env node
2
- import{spawn as _s}from"node:child_process";import{closeSync as ys,existsSync as tn,mkdirSync as Ss,openSync as ws,readFileSync as Gt,rmSync as Rs,statSync as We,writeFileSync as en}from"node:fs";import{dirname as Es,resolve as jt}from"node:path";import{fileURLToPath as xs}from"node:url";import{randomUUID as dt}from"node:crypto";var B="0.1.24";function j(){return new Date().toISOString()}function R(e,t=2){return String(e).padStart(t,"0")}function ee(e){let t=e>=0?"+":"-",n=Math.abs(e);return`${t}${R(Math.floor(n/60))}:${R(n%60)}`}function un(e){let t=-e.getTimezoneOffset();return[`${e.getFullYear()}-${R(e.getMonth()+1)}-${R(e.getDate())}`,`T${R(e.getHours())}:${R(e.getMinutes())}:${R(e.getSeconds())}.${R(e.getMilliseconds(),3)}`,ee(t)].join("")}function ln(e,t){let n=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}),r={};for(let s of n.formatToParts(e))s.type!=="literal"&&(r[s.type]=Number(s.value));return r}function dn(e,t){let n=ln(e,t),r=Date.UTC(n.year,n.month-1,n.day,n.hour,n.minute,n.second,e.getMilliseconds()),s=Math.round((r-e.getTime())/6e4);return[`${n.year}-${R(n.month)}-${R(n.day)}`,`T${R(n.hour)}:${R(n.minute)}:${R(n.second)}.${R(e.getMilliseconds(),3)}`,ee(s)].join("")}function fn(e=new Date){let t=a(process.env.ORCHA_RUNTIME_LOG_TIMEZONE||process.env.TZ||"Asia/Shanghai");try{return dn(e,t)}catch{return un(e)}}function c(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function a(e){return String(e??"").trim()}function T(e,t){let n=Number.parseInt(String(e??""),10);return Number.isFinite(n)?n:t}function E(e){return Array.isArray(e)?e.map(String):[]}var pn="[redacted]",te=/(authorization|api[_-]?key|credential|password|secret|token)/i;function K(e,t=new WeakSet){if(e==null)return e;if(typeof e=="bigint")return e.toString();if(typeof e!="object")return e;if(e instanceof Date)return e.toISOString();if(e instanceof Error){if(t.has(e))return"[circular]";t.add(e);let s={name:e.name,message:e.message};e.stack&&(s.stack=e.stack);for(let i of Object.keys(e))s[i]=K(e[i],t);return t.delete(e),s}if(t.has(e))return"[circular]";if(t.add(e),Array.isArray(e)){let s=e.map(i=>K(i,t));return t.delete(e),s}let n={},r=te.test(a(e.name||e.key));for(let[s,i]of Object.entries(e))n[s]=te.test(s)||r&&s.toLowerCase()==="value"?pn:K(i,t);return t.delete(e),n}function ne(e,t=4e3){let n=JSON.stringify(K(e))??String(e);return!Number.isFinite(t)||n.length<=t?n:`${n.slice(0,t)}...`}function p(e,t,n,r={}){let s={ts:fn(),level:e,module:t,msg:n,...c(r)?K(r):{}};console.error(JSON.stringify(s))}function Q(e){return Array.isArray(e)?e.map(t=>c(t)?t.type==="text"?a(t.text):t.type==="file"?a(t.uri):t.type==="image"?a(t.uri):"":"").filter(Boolean).join(`
3
- `):""}var tt=class{constructor(t){this.agent=t,this.sessionCounter=0}async sessionNew(){return this.sessionCounter+=1,{sessionId:`echo-${this.agent.agentId}-${this.sessionCounter}`}}async sessionPrompt(t,n){let r=Q(t.prompt);return n({sessionId:t.sessionId,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:r?`Echo runtime received: ${r}`:"Echo runtime received an empty prompt."}}}),{stopReason:"end_turn"}}async sessionCancel(){return{ok:!0}}};import{spawn as hn}from"node:child_process";var W="2.0",mn=3e4;function gn(e){return{code:Number.isInteger(e?.code)?e.code:-32e3,message:a(e?.message)||String(e),data:c(e?.data)?e.data:void 0}}function Tn(e){if(!c(e))return new Error(String(e||"runtime error"));let t=a(e.message)||"runtime error",n="data"in e?ne(e.data,4e3):"",r=new Error(n?`${t}; data=${n}`:t);return r.rpcCode=e.code,r.data=e.data,r}function _n(e){return c(e)&&"id"in e&&!("method"in e)}function yn(e){return c(e)&&typeof e.method=="string"&&"id"in e}function Sn(e){return c(e)&&typeof e.method=="string"&&!("id"in e)}var et=class{constructor({command:t,args:n=[],cwd:r,env:s,label:i,framing:o="line",detached:u=!0}){this.command=t,this.args=Array.isArray(n)?n.map(String):[],this.cwd=r||process.cwd(),this.env={...process.env,...c(s)?s:{}},this.label=i||t,this.framing=o==="content-length"?"content-length":"line",this.detached=u!==!1,this.child=null,this.exited=!1,this.exitCode=null,this.exitSignal=null,this.stopPromise=null,this.lineBuffer="",this.headerBuffer=Buffer.alloc(0),this.seq=0,this.pending=new Map,this.notificationHandlers=new Map,this.requestHandlers=new Map,this.exitHandlers=new Set}async start({initialize:t=!0,initializeParams:n={}}={}){this.child&&!this.exited||(this.exited=!1,this.exitCode=null,this.exitSignal=null,this.child=hn(this.command,this.args,{cwd:this.cwd,env:this.env,stdio:["pipe","pipe","pipe"],detached:this.detached}),this.child.stdout.on("data",r=>this.onStdout(r)),this.child.stderr.setEncoding("utf8"),this.child.stderr.on("data",r=>{let s=r.trimEnd();s&&p("debug","runtime.stderr","runtime stderr",{target:this.label,text:s})}),this.child.on("exit",(r,s)=>this.handleExit(r,s)),this.child.on("error",r=>this.rejectAll(r)),t&&await this.call("initialize",{protocolVersion:1,clientCapabilities:{},...n}).catch(r=>{throw Object.assign(new Error(`runtime initialize failed: ${r.message}`),{code:"RUNTIME_INITIALIZE_FAILED"})}))}onStdout(t){if(this.framing==="content-length"){this.onContentLengthData(Buffer.isBuffer(t)?t:Buffer.from(t));return}this.onLineData(t.toString("utf8"))}onLineData(t){this.lineBuffer+=t;let n=this.lineBuffer.split(/\r?\n/);this.lineBuffer=n.pop()||"";for(let r of n){let s=r.trim();s&&this.dispatchRaw(s)}}onContentLengthData(t){for(this.headerBuffer=Buffer.concat([this.headerBuffer,t]);this.headerBuffer.length>0;){let n=this.headerBuffer.indexOf(`\r
2
+ import{spawn as Ds}from"node:child_process";import{closeSync as Fs,existsSync as pn,mkdirSync as $s,openSync as Hs,readFileSync as Jt,rmSync as vs,statSync as on,writeFileSync as hn}from"node:fs";import{dirname as Bs,resolve as Vt}from"node:path";import{fileURLToPath as Ks}from"node:url";import{randomUUID as ft}from"node:crypto";var K="0.1.26";function J(){return new Date().toISOString()}function w(e,t=2){return String(e).padStart(t,"0")}function ie(e){let t=e>=0?"+":"-",n=Math.abs(e);return`${t}${w(Math.floor(n/60))}:${w(n%60)}`}function Rn(e){let t=-e.getTimezoneOffset();return[`${e.getFullYear()}-${w(e.getMonth()+1)}-${w(e.getDate())}`,`T${w(e.getHours())}:${w(e.getMinutes())}:${w(e.getSeconds())}.${w(e.getMilliseconds(),3)}`,ie(t)].join("")}function wn(e,t){let n=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}),r={};for(let s of n.formatToParts(e))s.type!=="literal"&&(r[s.type]=Number(s.value));return r}function En(e,t){let n=wn(e,t),r=Date.UTC(n.year,n.month-1,n.day,n.hour,n.minute,n.second,e.getMilliseconds()),s=Math.round((r-e.getTime())/6e4);return[`${n.year}-${w(n.month)}-${w(n.day)}`,`T${w(n.hour)}:${w(n.minute)}:${w(n.second)}.${w(e.getMilliseconds(),3)}`,ie(s)].join("")}function xn(e=new Date){let t=c(process.env.ORCHA_RUNTIME_LOG_TIMEZONE||process.env.TZ||"Asia/Shanghai");try{return En(e,t)}catch{return Rn(e)}}function a(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function c(e){return String(e??"").trim()}function T(e,t){let n=Number.parseInt(String(e??""),10);return Number.isFinite(n)?n:t}function x(e){return Array.isArray(e)?e.map(String):[]}var In="[redacted]",se=/(authorization|api[_-]?key|credential|password|secret|token)/i;function q(e,t=new WeakSet){if(e==null)return e;if(typeof e=="bigint")return e.toString();if(typeof e!="object")return e;if(e instanceof Date)return e.toISOString();if(e instanceof Error){if(t.has(e))return"[circular]";t.add(e);let s={name:e.name,message:e.message};e.stack&&(s.stack=e.stack);for(let i of Object.keys(e))s[i]=q(e[i],t);return t.delete(e),s}if(t.has(e))return"[circular]";if(t.add(e),Array.isArray(e)){let s=e.map(i=>q(i,t));return t.delete(e),s}let n={},r=se.test(c(e.name||e.key));for(let[s,i]of Object.entries(e))n[s]=se.test(s)||r&&s.toLowerCase()==="value"?In:q(i,t);return t.delete(e),n}function oe(e,t=4e3){let n=JSON.stringify(q(e))??String(e);return!Number.isFinite(t)||n.length<=t?n:`${n.slice(0,t)}...`}function p(e,t,n,r={}){let s={ts:xn(),level:e,module:t,msg:n,...a(r)?q(r):{}};console.error(JSON.stringify(s))}function tt(e){return Array.isArray(e)?e.map(t=>a(t)?t.type==="text"?c(t.text):t.type==="file"?c(t.uri):t.type==="image"?c(t.uri):"":"").filter(Boolean).join(`
3
+ `):""}var et=class{constructor(t){this.agent=t,this.sessionCounter=0}async sessionNew(){return this.sessionCounter+=1,{sessionId:`echo-${this.agent.agentId}-${this.sessionCounter}`}}async sessionPrompt(t,n){let r=tt(t.prompt);return n({sessionId:t.sessionId,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:r?`Echo runtime received: ${r}`:"Echo runtime received an empty prompt."}}}),{stopReason:"end_turn"}}async sessionCancel(){return{ok:!0}}};import{spawn as On}from"node:child_process";var W="2.0",Cn=3e4;function An(e){return{code:Number.isInteger(e?.code)?e.code:-32e3,message:c(e?.message)||String(e),data:a(e?.data)?e.data:void 0}}function Mn(e){if(!a(e))return new Error(String(e||"runtime error"));let t=c(e.message)||"runtime error",n="data"in e?oe(e.data,4e3):"",r=new Error(n?`${t}; data=${n}`:t);return r.rpcCode=e.code,r.data=e.data,r}function Nn(e){return a(e)&&"id"in e&&!("method"in e)}function Un(e){return a(e)&&typeof e.method=="string"&&"id"in e}function bn(e){return a(e)&&typeof e.method=="string"&&!("id"in e)}var nt=class{constructor({command:t,args:n=[],cwd:r,env:s,label:i,framing:o="line",detached:u=!0}){this.command=t,this.args=Array.isArray(n)?n.map(String):[],this.cwd=r||process.cwd(),this.env={...process.env,...a(s)?s:{}},this.label=i||t,this.framing=o==="content-length"?"content-length":"line",this.detached=u!==!1,this.child=null,this.exited=!1,this.exitCode=null,this.exitSignal=null,this.stopPromise=null,this.lineBuffer="",this.headerBuffer=Buffer.alloc(0),this.seq=0,this.pending=new Map,this.notificationHandlers=new Map,this.requestHandlers=new Map,this.exitHandlers=new Set}async start({initialize:t=!0,initializeParams:n={}}={}){this.child&&!this.exited||(this.exited=!1,this.exitCode=null,this.exitSignal=null,this.child=On(this.command,this.args,{cwd:this.cwd,env:this.env,stdio:["pipe","pipe","pipe"],detached:this.detached}),this.child.stdout.on("data",r=>this.onStdout(r)),this.child.stderr.setEncoding("utf8"),this.child.stderr.on("data",r=>{let s=r.trimEnd();s&&p("debug","runtime.stderr","runtime stderr",{target:this.label,text:s})}),this.child.on("exit",(r,s)=>this.handleExit(r,s)),this.child.on("error",r=>this.rejectAll(r)),t&&await this.call("initialize",{protocolVersion:1,clientCapabilities:{},...n}).catch(r=>{throw Object.assign(new Error(`runtime initialize failed: ${r.message}`),{code:"RUNTIME_INITIALIZE_FAILED"})}))}onStdout(t){if(this.framing==="content-length"){this.onContentLengthData(Buffer.isBuffer(t)?t:Buffer.from(t));return}this.onLineData(t.toString("utf8"))}onLineData(t){this.lineBuffer+=t;let n=this.lineBuffer.split(/\r?\n/);this.lineBuffer=n.pop()||"";for(let r of n){let s=r.trim();s&&this.dispatchRaw(s)}}onContentLengthData(t){for(this.headerBuffer=Buffer.concat([this.headerBuffer,t]);this.headerBuffer.length>0;){let n=this.headerBuffer.indexOf(`\r
4
4
  \r
5
- `);if(n<0)return;let s=this.headerBuffer.subarray(0,n).toString("utf8").match(/content-length:\s*(\d+)/i);if(!s){p("warn","runtime.protocol","missing Content-Length header",{target:this.label}),this.headerBuffer=Buffer.alloc(0);return}let i=Number.parseInt(s[1],10),o=n+4,u=o+i;if(this.headerBuffer.length<u)return;let l=this.headerBuffer.subarray(o,u).toString("utf8");this.headerBuffer=this.headerBuffer.subarray(u),this.dispatchRaw(l)}}dispatchRaw(t){let n;try{n=JSON.parse(t)}catch(r){p("warn","runtime.protocol","invalid JSON frame",{target:this.label,error:String(r)});return}this.dispatch(n)}dispatch(t){if(_n(t)){this.resolveResponse(t);return}if(yn(t)){this.handleRequest(t);return}Sn(t)&&this.handleNotification(t)}resolveResponse(t){let n=String(t.id),r=this.pending.get(n);r&&(clearTimeout(r.timer),this.pending.delete(n),t.error?(p("warn","runtime.protocol","runtime rpc error",{target:this.label,method:r.method,requestId:n,error:t.error}),r.reject(Tn(t.error))):r.resolve(t.result))}async handleRequest(t){let n=this.requestHandlers.get(t.method);if(!n){this.writeFrame({jsonrpc:W,id:t.id,error:{code:-32601,message:`method not found: ${t.method}`}});return}try{let r=await n(c(t.params)?t.params:{},t);this.writeFrame({jsonrpc:W,id:t.id,result:r??{}})}catch(r){this.writeFrame({jsonrpc:W,id:t.id,error:gn(r)})}}handleNotification(t){let n=this.notificationHandlers.get(t.method);if(n)for(let r of n)r(c(t.params)?t.params:{},t)}call(t,n={},r=mn){if(!this.child||!this.child.stdin||this.exited)return Promise.reject(new Error("runtime process is not running"));let s=`${t}_${++this.seq}`,i={jsonrpc:W,id:s,method:t,params:n};return new Promise((o,u)=>{let l=setTimeout(()=>{this.pending.delete(s),u(new Error(`${t} timed out after ${r}ms`))},r);this.pending.set(s,{resolve:o,reject:u,timer:l,method:t}),this.writeFrame(i,d=>{d&&(clearTimeout(l),this.pending.delete(s),u(d))})})}notify(t,n={}){this.writeFrame({jsonrpc:W,method:t,params:n})}writeFrame(t,n){if(!this.child?.stdin||this.exited){n?.(new Error("runtime process is not running"));return}let r=JSON.stringify(t),s=this.framing==="content-length"?`Content-Length: ${Buffer.byteLength(r,"utf8")}\r
5
+ `);if(n<0)return;let s=this.headerBuffer.subarray(0,n).toString("utf8").match(/content-length:\s*(\d+)/i);if(!s){p("warn","runtime.protocol","missing Content-Length header",{target:this.label}),this.headerBuffer=Buffer.alloc(0);return}let i=Number.parseInt(s[1],10),o=n+4,u=o+i;if(this.headerBuffer.length<u)return;let l=this.headerBuffer.subarray(o,u).toString("utf8");this.headerBuffer=this.headerBuffer.subarray(u),this.dispatchRaw(l)}}dispatchRaw(t){let n;try{n=JSON.parse(t)}catch(r){p("warn","runtime.protocol","invalid JSON frame",{target:this.label,error:String(r)});return}this.dispatch(n)}dispatch(t){if(Nn(t)){this.resolveResponse(t);return}if(Un(t)){this.handleRequest(t);return}bn(t)&&this.handleNotification(t)}resolveResponse(t){let n=String(t.id),r=this.pending.get(n);r&&(clearTimeout(r.timer),this.pending.delete(n),t.error?(p("warn","runtime.protocol","runtime rpc error",{target:this.label,method:r.method,requestId:n,error:t.error}),r.reject(Mn(t.error))):r.resolve(t.result))}async handleRequest(t){let n=this.requestHandlers.get(t.method);if(!n){this.writeFrame({jsonrpc:W,id:t.id,error:{code:-32601,message:`method not found: ${t.method}`}});return}try{let r=await n(a(t.params)?t.params:{},t);this.writeFrame({jsonrpc:W,id:t.id,result:r??{}})}catch(r){this.writeFrame({jsonrpc:W,id:t.id,error:An(r)})}}handleNotification(t){let n=this.notificationHandlers.get(t.method);if(n)for(let r of n)r(a(t.params)?t.params:{},t)}call(t,n={},r=Cn){if(!this.child||!this.child.stdin||this.exited)return Promise.reject(new Error("runtime process is not running"));let s=`${t}_${++this.seq}`,i={jsonrpc:W,id:s,method:t,params:n};return new Promise((o,u)=>{let l=setTimeout(()=>{this.pending.delete(s),u(new Error(`${t} timed out after ${r}ms`))},r);this.pending.set(s,{resolve:o,reject:u,timer:l,method:t}),this.writeFrame(i,d=>{d&&(clearTimeout(l),this.pending.delete(s),u(d))})})}notify(t,n={}){this.writeFrame({jsonrpc:W,method:t,params:n})}writeFrame(t,n){if(!this.child?.stdin||this.exited){n?.(new Error("runtime process is not running"));return}let r=JSON.stringify(t),s=this.framing==="content-length"?`Content-Length: ${Buffer.byteLength(r,"utf8")}\r
6
6
  \r
7
7
  ${r}`:`${r}
8
- `;this.child.stdin.write(s,n)}onNotification(t,n){let r=this.notificationHandlers.get(t)||new Set;return r.add(n),this.notificationHandlers.set(t,r),()=>{r.delete(n),r.size===0&&this.notificationHandlers.delete(t)}}onRequest(t,n){return this.requestHandlers.set(t,n),()=>this.requestHandlers.delete(t)}onExit(t){return this.exitHandlers.add(t),()=>this.exitHandlers.delete(t)}rejectAll(t){for(let n of this.pending.values())clearTimeout(n.timer),n.reject(t);this.pending.clear()}handleExit(t,n){this.exited=!0,this.exitCode=t,this.exitSignal=n,this.rejectAll(new Error(`runtime exited before response (${t}/${n})`));for(let r of this.exitHandlers)r(t,n)}async waitForExit(t=5e3){return!this.child||this.exited?!0:await new Promise(n=>{let r=setTimeout(()=>{s(),n(!1)},t);r.unref?.();let s=()=>{clearTimeout(r),this.exitHandlers.delete(i)},i=()=>{s(),n(!0)};this.exitHandlers.add(i),this.exited&&i()})}signal(t){if(!this.child||this.exited)return!1;let n=this.child.pid;if(!n)return!1;try{return this.detached&&process.platform!=="win32"?process.kill(-n,t):this.child.kill(t),!0}catch(r){if(r?.code==="ESRCH")return this.exited=!0,!1;try{return this.child.kill(t),!0}catch(s){return s?.code!=="ESRCH"&&p("warn","runtime","runtime signal failed",{target:this.label,pid:n,signal:t,error:String(s)}),!1}}}async stop(t="stop",{termTimeoutMs:n=5e3,killTimeoutMs:r=2e3}={}){if(!(!this.child||this.exited)){if(this.stopPromise)return await this.stopPromise;this.stopPromise=(async()=>{if(!this.child||this.exited)return;let s=this.child.pid;p("info","runtime","stopping runtime",{target:this.label,reason:t,pid:s}),this.rejectAll(new Error(`runtime stopped: ${t}`)),this.signal("SIGTERM"),!await this.waitForExit(n)&&this.child&&!this.exited&&(p("warn","runtime","runtime did not exit after SIGTERM; force killing",{target:this.label,reason:t,pid:s}),this.signal("SIGKILL"),await this.waitForExit(r))})();try{await this.stopPromise}finally{this.stopPromise=null}}}};import{randomUUID as ie}from"node:crypto";import{existsSync as wn,readFileSync as Rn,realpathSync as re,statSync as En}from"node:fs";import{basename as oe,extname as ae,isAbsolute as xn,relative as In}from"node:path";var Cn=25*1024*1024;function ce(e,t=""){let n=a(t);if(n)return n;let r=ae(a(e)).toLowerCase();return r===".jpg"||r===".jpeg"?"image/jpeg":r===".webp"?"image/webp":r===".gif"?"image/gif":"image/png"}function ue(e,t){let n=typeof e=="string"?e.trim():"";return!n||n==="<omitted>"?"":n.startsWith("data:")?n:`data:${t};base64,${n.replace(/\s+/g,"")}`}function nt(e){if(Array.isArray(e))return e.map(a).filter(Boolean);let t=a(e);return t?[t]:[]}function On(e,t){let n=In(t,e);return n===""||!!n&&!n.startsWith("..")&&!xn(n)}function An(e,t){let n=a(e);if(!n||!wn(n))return"";try{let r=re(n);for(let s of t)try{let i=re(s);if(On(r,i))return r}catch{}}catch{return""}return""}function Et(e,t,n={}){let r=a(e);return!r||r.startsWith("data:")||/^https?:\/\//i.test(r)?r:Mn(r,t,n)}function Mn(e,t,n={}){let r=[...nt(n.trustedFileRoots),...nt(n.trustedFileRoot),...nt(n.artifactRoots),...nt(n.artifactRoot)],s=An(e,r);if(!s)return"";try{let i=En(s);return!i.isFile()||i.size<=0||i.size>Cn?"":`data:${t};base64,${Rn(s).toString("base64")}`}catch{return""}}function _(...e){for(let t of e){let n=a(t);if(n)return n}return""}function Un(e,t,n,r){let s=n.toLowerCase();if(s==="image"||s==="picture")return!0;let i=_(r,e.previewUrl,e.fileUrl,e.imageUrl,e.dataUrl,e.url,e.uri,t.previewUrl,t.fileUrl,t.imageUrl,t.dataUrl,t.url,t.uri),o=ae(i.split("?",1)[0].split("#",1)[0]).toLowerCase();return[".png",".jpg",".jpeg",".webp",".gif"].includes(o)}function It(e,t={}){let{source:n="runtime_image_generation_event"}=t;if(!c(e))return null;let r=c(e.payload)?e.payload:{},s=a(e.type),i=a(r.type);if(!(s==="event_msg"&&i==="image_generation_end"||s==="response_item"&&i==="image_generation_call"))return null;let o=_(r.call_id,r.id),u=_(r.saved_path,r.savedPath),l=_(r.revised_prompt,r.revisedPrompt),d=ce(u,r.mimeType||r.mime_type),f=ue(r.result,d)||Et(u,d,t);if(!f)return null;let h=f.startsWith("data:")?f:"",m=u?oe(u):`${o||ie()}.png`;return{artifactType:"image",type:"image",fieldKey:"image",title:m||"Generated image",summary:l||"Generated image",content:{prompt:l||void 0,dataUrl:h||void 0,imageUrl:f,previewUrl:f,fileUrl:f,mimeType:d},dataUrl:h||void 0,previewUrl:f,fileUrl:f,metadata:{source:n,eventType:i,callId:o||void 0,savedPath:u||void 0,filename:m,mimeType:d,revisedPrompt:l||void 0}}}function Nn(e){let t=c(e)?e:{},n=[];for(let r of["_artifacts","artifacts"]){let s=t[r];Array.isArray(s)&&n.push(...s)}for(let r of["_artifact","artifact"]){let s=t[r];c(s)&&n.push(s)}return n}function bn(e,t={}){let{source:n="runtime_artifact"}=t,r=c(e)?e:{};if(!Object.keys(r).length)return null;let s=c(r.content)?{...r.content}:{},i=c(r.metadata)?{...r.metadata}:{},o=_(r.saved_path,r.savedPath,s.saved_path,s.savedPath,i.savedPath),u=_(r.mimeType,r.mime_type,s.mimeType,s.mime_type,i.mimeType),l=_(r.artifactType,r.artifact_type,r.type,r.kind,s.type,o?"image":"file"),d=Un(r,s,l,o),f=d?ce(o,u):u;if(d){let x=_(r.dataUrl,s.dataUrl),O=x.startsWith("data:")?x:"",N=_(r.imageUrl,r.previewUrl,r.fileUrl,r.downloadUrl,r.url,r.uri,s.imageUrl,s.previewUrl,s.fileUrl,s.downloadUrl,s.url,s.uri),g=ue(r.result??s.result,f)||O||Et(o,f,t)||Et(N,f,t);g&&(g.startsWith("data:")&&(s.dataUrl||=g),s.imageUrl||=g,s.previewUrl||=g,s.fileUrl||=g,f&&(s.mimeType||=f))}for(let[x,O]of[["prompt","prompt"],["previewUrl","previewUrl"],["fileUrl","fileUrl"],["downloadUrl","downloadUrl"],["imageUrl","imageUrl"],["dataUrl","dataUrl"],["url","url"],["uri","uri"],["mimeType","mimeType"],["mime_type","mimeType"]]){let N=r[x];N!=null&&N!==""&&!(O in s)&&(s[O]=N)}let h=_(r.fileUrl,r.downloadUrl,r.imageUrl,r.dataUrl,r.url,r.uri,s.fileUrl,s.downloadUrl,s.imageUrl,s.dataUrl,s.url,s.uri),m=_(r.previewUrl,r.imageUrl,r.dataUrl,r.url,r.fileUrl,r.uri,s.previewUrl,s.imageUrl,s.dataUrl,s.url,s.fileUrl,s.uri),y=_(r.dataUrl,s.dataUrl,h.startsWith("data:")?h:"",m.startsWith("data:")?m:""),S=_(r.filename,i.filename,o?oe(o):""),U=_(r.fieldKey,r.field_key,s.fieldKey,i.fieldKey,d?"image":"artifact");return{...r,artifactType:l,type:r.type||l,fieldKey:U,title:_(r.title,S,"Runtime artifact"),summary:_(r.summary,s.prompt,r.title,S,"Runtime artifact"),content:s,dataUrl:y||void 0,fileUrl:h||void 0,previewUrl:m||void 0,metadata:{...i,source:_(i.source,n),savedPath:o||i.savedPath,filename:S||i.filename,mimeType:f||i.mimeType}}}function rt(e,t){if(!t||!e)return;let n=c(t.metadata)?t.metadata:{},r=_(n.savedPath,n.callId,t.previewUrl,t.fileUrl)||ie(),s=e.get(r);if(!s){e.set(r,t);return}s.content={...c(s.content)?s.content:{},...c(t.content)?t.content:{}},s.metadata={...c(s.metadata)?s.metadata:{},...n},s.previewUrl=t.previewUrl||s.previewUrl,s.fileUrl=t.fileUrl||s.fileUrl,s.summary=t.summary||s.summary,s.title=t.title||s.title}function xt(e,t,n={}){for(let r of Nn(e))rt(t,bn(r,n))}function Ct(e){if(!c(e)||!c(e.payload))return c(e)?e:{value:e};let t=a(e.payload.type);if(t!=="image_generation_end"&&t!=="image_generation_call")return e;let n={...e.payload};return typeof n.result=="string"&&n.result&&(n.result="<omitted>",n.resultLength=e.payload.result.length),{...e,payload:n}}function se(e,t,n){if(!c(e))return e;let r=c(e.event)?e.event:null;return r?(rt(t,It(r,n)),{...e,event:Ct(r)}):e}function le(e,t,n={}){if(!c(e))return e;xt(e,t,n);let r=se(e,t,n),s=c(r.update)?se(r.update,t,n):null;return s&&s!==r.update&&(r={...r,update:s}),r}function de(e,t,n={}){let r=c(e)?{...e}:{};xt(r,t,n),xt(c(r.output)?r.output:{},t,n);let s=[...t?.values?.()||[]];return s.length&&(r._artifacts=s),delete r.artifacts,r}var z=class{constructor(t,n,r={},s={}){this.agent=t,this.target=n,this.callbacks=r,this.options=s,this.proc=null,this.permissionHandlers=new Map}async ensureStarted(){if(this.proc)return;let t=a(this.target.command);if(!t)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);this.proc=new et({command:t,args:E(this.target.args),cwd:a(this.target.cwd)||this.agent.workspace||process.cwd(),env:c(this.target.env)?this.target.env:{},label:`${this.agent.agentId}:${this.agent.targetCode}`,framing:a(this.target.framing||"line")}),this.proc.onRequest("session/request_permission",n=>this.handlePermissionRequest(n)),this.proc.onRequest("session/requestPermission",n=>this.handlePermissionRequest(n)),await this.proc.start({initialize:this.target.initialize!==!1,initializeParams:{clientInfo:{name:"orcha-runtime-bridge",version:B},...c(this.target.initializeParams)?this.target.initializeParams:{}}})}async sessionNew(t={}){return await this.ensureStarted(),this.proc.call("session/new",this.sessionNewParams(t))}sessionNewParams(t={}){let n=Array.isArray(t.mcpServers)?t.mcpServers:Array.isArray(this.target.mcpServers)?this.target.mcpServers:[];return{...t,mcpServers:n}}async sessionPrompt(t,n){await this.ensureStarted();let r=a(t.sessionId),s=new Map,i=this.artifactOptions(),o=this.proc.onNotification("session/update",l=>{let d=a(l.sessionId);(!d||d===r)&&n(le(l,s,i))}),u=async l=>this.callbacks.onPermissionRequest?.({agent:this.agent,runtimeSessionId:r,request:l,emitUpdate:n})||{outcome:"denied",reason:"permission handler is not configured"};r&&this.permissionHandlers.set(r,u),this.permissionHandlers.set("*",u);try{let l=await this.proc.call("session/prompt",t,this.options.sessionPromptTimeoutMs);return de(l,s,i)}finally{o(),r&&this.permissionHandlers.delete(r),this.permissionHandlers.delete("*")}}async sessionCancel(t){return await this.ensureStarted(),this.proc.call("session/cancel",t,5e3).catch(()=>({ok:!0}))}async handlePermissionRequest(t){let n=a(t.sessionId),r=this.permissionHandlers.get(n)||this.permissionHandlers.get("*");return r?r(t):{outcome:"denied",reason:"no active Orcha permission handler"}}artifactSource(){return a(this.target.type||"acp")==="openclaw"?"openclaw_image_generation":"acp_runtime_image_generation"}artifactOptions(){let t=c(this.target.env)?this.target.env:{};return{source:this.artifactSource(),trustedFileRoots:[a(this.target.artifactRoot),a(this.target.artifactDir),a(this.target.runtimeArtifactRoot),a(t.ORCHA_RUNTIME_ARTIFACT_DIR),...E(this.target.trustedArtifactRoots),...E(this.target.trustedFileRoots),...E(this.target.artifactRoots),...E(this.target.artifactFileRoots)].filter(Boolean)}}async stop(t){await this.proc?.stop(t)}};function kn(e){let t=c(e.metadata)?e.metadata:{};return a(t.agentCode)}function Pn(e,t){let n=kn(e);return n?`agent:${n}:${t}`:`orcha-${t}`}var st=class extends z{constructor(t,n,r,s={},i={}){let o=a(r).replace(/[^A-Za-z0-9._-]+/g,"-")||"default",u=a(n.command)||"openclaw",l=Array.isArray(n.args)?n.args.map(String):[],d=l.length>0?l:["acp","--session",Pn(t,o)];super(t,{...n,command:u,args:d},s,i)}sessionNewParams(t={}){return{...t,mcpServers:[]}}};import{spawn as Ln}from"node:child_process";import{randomUUID as J}from"node:crypto";import{existsSync as ge,mkdirSync as Fn,readdirSync as Te,readFileSync as _e,realpathSync as ct,rmSync as Dn,rmdirSync as $n,statSync as Hn,unlinkSync as vn}from"node:fs";import{homedir as Bn,tmpdir as ye}from"node:os";import{basename as Se,dirname as zn,join as A,resolve as fe}from"node:path";var Gn=36e5,qn=5e3,Kn=2*60*1e3,jn=2*60*1e3,Wn=12,Jn=1e3,Xn=1500,it=24*60*60*1e3,X=new Set(["final_answer","final","complete","completed","done"]);function ot(e,t){try{e.kill(t)}catch{}}function C(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(t=>C(t)).join("");if(!c(e))return"";for(let t of["text","delta","output_text","content","message","output"]){let n=C(e[t]);if(n)return n}return""}function we(e){if(!c(e))return"";let t=c(e.payload)?e.payload:{};if(a(e.type)==="event_msg"){if(a(t.type)==="agent_message")return a(t.message);if(a(t.type)==="task_complete")return a(t.last_agent_message)}if(a(e.type)==="response_item"&&a(t.type)==="message"&&a(t.role)==="assistant")return C(t.content)||C(t.message);let n=C(e.delta)||C(e.text)||C(e.content);if(n)return n;let r=c(e.item)?e.item:{};return a(r.role)==="assistant"||a(r.type)==="message"?C(r.content)||C(r.text)||C(r.message):""}function Re(e,t={}){return It(e,{source:"codex_cli_image_generation",...t})}function Ee(e,t){rt(e.artifacts,t)}function xe(e){return Ct(e)}function Ut(e){if(!c(e))return!1;let t=c(e.payload)?e.payload:{},n=a(e.type),r=a(t.type);if(n==="event_msg"&&r==="task_complete")return!0;let s=a(t.phase||t.status||t.stage).toLowerCase();return n==="event_msg"&&r==="agent_message"||n==="response_item"&&r==="message"&&a(t.role)==="assistant"?X.has(s):!1}function pe(e){return c(e)?a(e.phase||e.status||e.stage).toLowerCase():""}function Vn(e){if(!c(e)||Ut(e))return!1;let t=c(e.payload)?e.payload:{},n=a(e.type),r=a(t.type),s=pe(t);if(n==="event_msg"&&r==="agent_message"||n==="response_item"&&r==="message"&&a(t.role)==="assistant")return!!(s&&!X.has(s));let i=c(e.item)?e.item:{},o=pe(i);return a(i.role)==="assistant"||a(i.type)==="message"?!!(o&&!X.has(o)):!1}function Yn(e,t,n){return n.captureLastMessage===!1||t.includes("--output-last-message")||t.includes("-o")?!1:n.captureLastMessage===!0?!0:Se(e)==="codex"}function Zn(e,t){return t.collectCodexTranscriptArtifacts===!1?!1:t.collectCodexTranscriptArtifacts===!0?!0:Se(e)==="codex"}function Ie(e){return Math.max(20,T(e.codexTranscriptPollMs||e.transcriptPollMs,Jn))}function Qn(e){return Math.max(0,T(e.codexFinalOutputWaitMs||e.finalOutputWaitMs,Xn))}function ut(e){if(typeof e=="boolean")return e;let t=a(e).toLowerCase();return["true","1","yes","y","on"].includes(t)?!0:["false","0","no","n","off"].includes(t)?!1:null}function Nt(e){let t=c(e?.metadata)?e.metadata:{};return c(t._runtimeBridge)?t._runtimeBridge:{}}function Ot(e){return a(Nt(e).promptKind).toLowerCase()}function tr(e,t){for(let n of[e.codexTranscriptStreaming,e.streamCodexTranscript]){let r=ut(n);if(r!=null)return r}return Ot(t)==="chat"}function er(e,t){let n=Nt(e);for(let s of[n.emitThoughtChunks,n.streamThoughts]){let i=ut(s);if(i!=null)return i}let r=Ot(e);if(r&&r!=="chat")return!1;for(let s of[t.emitThoughtChunks,t.streamThoughts]){let i=ut(s);if(i!=null)return i}return Ot(e)==="chat"}function nr(e){let t=Nt(e);for(let n of[t.finalTextOnly,t.finalOutputOnly]){let r=ut(n);if(r!=null)return r}return null}function rr(e,t){let n=nr(e);return n??(t.finalTextOnly===!0||t.finalOutputOnly===!0?!0:(t.finalTextOnly===!1||t.finalOutputOnly===!1,!1))}function sr(e,t){return!e.finalTextOnly||t}function Ce(e,t,n,r,s=r){return!r||e.emittedTexts.has(s)?!1:(e.emittedTexts.add(s),n({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:r}}}),!0)}function Oe(e,t,n,r){return!r||e.emittedThoughtTexts.has(r)?!1:(e.emittedThoughtTexts.add(r),n({sessionId:t,update:{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:r}}}),!0)}function ir(e,t,n,r=new Set){return{target:e,promptText:t,startedAtMs:n,baselinePaths:r,matchedPath:"",disabled:!1,processedLines:new Map}}function or(e,t){let n=c(e.env)?e.env:{},r=a(e.artifactRoot||e.artifactDir||e.runtimeArtifactRoot||n.ORCHA_RUNTIME_ARTIFACT_DIR)||A(ye(),"orcha-runtime-artifacts"),s=a(t).replace(/[^A-Za-z0-9._-]+/g,"-").slice(0,80)||J(),i=A(r,s),o=A(i,J());return Fn(o,{recursive:!0}),{root:o,realRoot:ct(o),sessionRoot:i,realSessionRoot:ct(i)}}function Ae(e){return a(c(e)?e.root:e)}function he(e){let t=Ae(e),n=a(c(e)?e.sessionRoot:zn(t)),r=a(c(e)?e.realSessionRoot:"");if(n)try{if(r&&ct(n)!==r)return;$n(n)}catch{}}function ar(e,t={}){let n=Ae(e),r=a(c(e)?e.realRoot:"");if(n){try{if(r&&ct(n)!==r){p("warn","runtime.cli","runtime artifact directory cleanup skipped; path changed",{...t,artifactRoot:n});return}}catch{he(e);return}try{Dn(n,{recursive:!0,force:!0})}catch(s){p("warn","runtime.cli","runtime artifact directory cleanup failed",{...t,artifactRoot:n,error:String(s?.message||s)});return}he(e)}}function cr(e,t){return{trustedFileRoots:[t,...E(e.trustedArtifactRoots),...E(e.trustedFileRoots),...E(e.artifactRoots),...E(e.artifactFileRoots)].filter(Boolean)}}function Me(e){let t=a(e.codexSessionsRoot||e.codexSessionRoot);if(t)return t;let n=c(e.env)?e.env:{},r=a(e.codexHome||n.CODEX_HOME||process.env.CODEX_HOME)||A(Bn(),".codex");return A(r,"sessions")}function ur(e,t){let n=new Date(t),r=String(n.getFullYear()),s=String(n.getMonth()+1).padStart(2,"0"),i=String(n.getDate()).padStart(2,"0");return A(e,r,s,i)}function Ue(e,t,n){let r=new Set;for(let s of[t-it,t,t+it,n-it,n,n+it])r.add(ur(e,s));return[...r].filter(s=>ge(s))}function lr(e,t,n){let r=Me(e),s=t-Kn,i=n+jn,o=[];for(let u of Ue(r,t,n)){let l=[];try{l=Te(u)}catch{continue}for(let d of l){if(!d.endsWith(".jsonl"))continue;let f=A(u,d);try{let h=Hn(f);if(!h.isFile()||h.mtimeMs<s||h.mtimeMs>i)continue;o.push({path:f,mtimeMs:h.mtimeMs})}catch{}}}return o.sort((u,l)=>l.mtimeMs-u.mtimeMs).slice(0,Wn)}function dr(e,t,n=t){let r=Me(e),s=new Set;for(let i of Ue(r,t,n)){let o=[];try{o=Te(i)}catch{continue}for(let u of o)u.endsWith(".jsonl")&&s.add(A(i,u))}return s}function At(e,t,n=0){if(!(n>8||e===null||e===void 0)){if(typeof e=="string"){e&&t.push(e);return}if(Array.isArray(e)){for(let r of e)At(r,t,n+1);return}if(c(e))for(let r of["payload","item","text","delta","output_text","content","message","output","input","prompt","last_agent_message","revised_prompt"])r in e&&At(e[r],t,n+1)}}function Ne(e){return a(e).replace(/\s+/g," ")}function fr(e){let t=Ne(e);if(!t)return[];if(t.length<=200)return[t];let n=160,r=[0,Math.floor((t.length-n)/2),t.length-n],s=new Set,i=[];for(let o of r){let u=t.slice(Math.max(0,o),Math.max(0,o)+n).trim();u.length>=40&&!s.has(u)&&(s.add(u),i.push(u))}return i}function pr(e,t){let n=fr(t);if(!n.length)return!1;let r=[];for(let i of e)At(i,r);let s=Ne(r.join(" "));return n.every(i=>s.includes(i))}function hr(e){return e.find(t=>c(t)&&a(t.type)==="session_meta"&&c(t.payload))||null}function mr(e){let t=c(e?.payload)?e.payload:{},n=a(e?.timestamp||t.timestamp),r=Date.parse(n);return Number.isFinite(r)?r:Number.NaN}function gr(e,t,n){if(!pr(e,t.promptText))return!1;let r=hr(e);if(!r)return!1;let s=r.payload,i=a(s.originator),o=a(s.source);if(i!=="codex_exec"&&o!=="exec")return!1;let u=mr(r);if(!Number.isFinite(u)||u<t.startedAtMs-5e3||u>n+5e3)return!1;let l=a(t.target.cwd),d=a(s.cwd);return!(l&&d&&fe(l)!==fe(d))}function me(e){try{return _r(_e(e,"utf8"))}catch{return null}}function Tr(e,t,n){if(!e||e.disabled)return null;if(e.matchedPath){let s=me(e.matchedPath);return s?{path:e.matchedPath,events:s}:null}let r=[];for(let s of lr(e.target,e.startedAtMs,n)){if(e.baselinePaths.has(s.path))continue;let i=me(s.path);!i||!gr(i,e,n)||r.push({path:s.path,events:i})}return r.length!==1?(r.length>1&&(e.disabled=!0,p("warn","runtime.cli","codex transcript fallback disabled; multiple matching transcripts",{target:e.target.targetCode,sessionId:t,transcriptCount:r.length})),null):(e.matchedPath=r[0].path,p("info","runtime.cli","codex transcript stream attached",{target:e.target.targetCode,sessionId:t}),r[0])}function _r(e){let t=[];for(let n of e.split(/\r?\n/)){let r=n.trim();if(r)try{t.push(JSON.parse(r))}catch{}}return t}function yr(e){if(!c(e))return!1;let t=c(e.payload)?e.payload:{},n=a(e.type),r=a(t.type);return n==="event_msg"&&r==="image_generation_end"||n==="response_item"&&r==="image_generation_call"}function Sr(e,t,n,r){let s=we(e),i=Ut(e),o=0,u=0,l=0;if(s&&!i&&t.emitThoughtChunks&&Oe(t,n,r,s)&&(l=1),s&&i){let d=t.emittedTexts.size?`
8
+ `;this.child.stdin.write(s,n)}onNotification(t,n){let r=this.notificationHandlers.get(t)||new Set;return r.add(n),this.notificationHandlers.set(t,r),()=>{r.delete(n),r.size===0&&this.notificationHandlers.delete(t)}}onRequest(t,n){return this.requestHandlers.set(t,n),()=>this.requestHandlers.delete(t)}onExit(t){return this.exitHandlers.add(t),()=>this.exitHandlers.delete(t)}rejectAll(t){for(let n of this.pending.values())clearTimeout(n.timer),n.reject(t);this.pending.clear()}handleExit(t,n){this.exited=!0,this.exitCode=t,this.exitSignal=n,this.rejectAll(new Error(`runtime exited before response (${t}/${n})`));for(let r of this.exitHandlers)r(t,n)}async waitForExit(t=5e3){return!this.child||this.exited?!0:await new Promise(n=>{let r=setTimeout(()=>{s(),n(!1)},t);r.unref?.();let s=()=>{clearTimeout(r),this.exitHandlers.delete(i)},i=()=>{s(),n(!0)};this.exitHandlers.add(i),this.exited&&i()})}signal(t){if(!this.child||this.exited)return!1;let n=this.child.pid;if(!n)return!1;try{return this.detached&&process.platform!=="win32"?process.kill(-n,t):this.child.kill(t),!0}catch(r){if(r?.code==="ESRCH")return this.exited=!0,!1;try{return this.child.kill(t),!0}catch(s){return s?.code!=="ESRCH"&&p("warn","runtime","runtime signal failed",{target:this.label,pid:n,signal:t,error:String(s)}),!1}}}async stop(t="stop",{termTimeoutMs:n=5e3,killTimeoutMs:r=2e3}={}){if(!(!this.child||this.exited)){if(this.stopPromise)return await this.stopPromise;this.stopPromise=(async()=>{if(!this.child||this.exited)return;let s=this.child.pid;p("info","runtime","stopping runtime",{target:this.label,reason:t,pid:s}),this.rejectAll(new Error(`runtime stopped: ${t}`)),this.signal("SIGTERM"),!await this.waitForExit(n)&&this.child&&!this.exited&&(p("warn","runtime","runtime did not exit after SIGTERM; force killing",{target:this.label,reason:t,pid:s}),this.signal("SIGKILL"),await this.waitForExit(r))})();try{await this.stopPromise}finally{this.stopPromise=null}}}};import{randomUUID as ue}from"node:crypto";import{existsSync as kn,readFileSync as Pn,realpathSync as ae,statSync as Ln}from"node:fs";import{basename as le,extname as de,isAbsolute as Dn,relative as Fn}from"node:path";var $n=25*1024*1024;function fe(e,t=""){let n=c(t);if(n)return n;let r=de(c(e)).toLowerCase();return r===".jpg"||r===".jpeg"?"image/jpeg":r===".webp"?"image/webp":r===".gif"?"image/gif":"image/png"}function pe(e,t){let n=typeof e=="string"?e.trim():"";return!n||n==="<omitted>"?"":n.startsWith("data:")?n:`data:${t};base64,${n.replace(/\s+/g,"")}`}function rt(e){if(Array.isArray(e))return e.map(c).filter(Boolean);let t=c(e);return t?[t]:[]}function Hn(e,t){let n=Fn(t,e);return n===""||!!n&&!n.startsWith("..")&&!Dn(n)}function vn(e,t){let n=c(e);if(!n||!kn(n))return"";try{let r=ae(n);for(let s of t)try{let i=ae(s);if(Hn(r,i))return r}catch{}}catch{return""}return""}function wt(e,t,n={}){let r=c(e);return!r||r.startsWith("data:")||/^https?:\/\//i.test(r)?r:Bn(r,t,n)}function Bn(e,t,n={}){let r=[...rt(n.trustedFileRoots),...rt(n.trustedFileRoot),...rt(n.artifactRoots),...rt(n.artifactRoot)],s=vn(e,r);if(!s)return"";try{let i=Ln(s);return!i.isFile()||i.size<=0||i.size>$n?"":`data:${t};base64,${Pn(s).toString("base64")}`}catch{return""}}function S(...e){for(let t of e){let n=c(t);if(n)return n}return""}function Kn(e,t,n,r){let s=n.toLowerCase();if(s==="image"||s==="picture")return!0;let i=S(r,e.previewUrl,e.fileUrl,e.imageUrl,e.dataUrl,e.url,e.uri,t.previewUrl,t.fileUrl,t.imageUrl,t.dataUrl,t.url,t.uri),o=de(i.split("?",1)[0].split("#",1)[0]).toLowerCase();return[".png",".jpg",".jpeg",".webp",".gif"].includes(o)}function xt(e,t={}){let{source:n="runtime_image_generation_event"}=t;if(!a(e))return null;let r=a(e.payload)?e.payload:{},s=c(e.type),i=c(r.type);if(!(s==="event_msg"&&i==="image_generation_end"||s==="response_item"&&i==="image_generation_call"))return null;let o=S(r.call_id,r.id),u=S(r.saved_path,r.savedPath),l=S(r.revised_prompt,r.revisedPrompt),d=fe(u,r.mimeType||r.mime_type),f=pe(r.result,d)||wt(u,d,t);if(!f)return null;let h=f.startsWith("data:")?f:"",g=u?le(u):`${o||ue()}.png`;return{artifactType:"image",type:"image",fieldKey:"image",title:g||"Generated image",summary:l||"Generated image",content:{prompt:l||void 0,dataUrl:h||void 0,imageUrl:f,previewUrl:f,fileUrl:f,mimeType:d},dataUrl:h||void 0,previewUrl:f,fileUrl:f,metadata:{source:n,eventType:i,callId:o||void 0,savedPath:u||void 0,filename:g,mimeType:d,revisedPrompt:l||void 0}}}function zn(e){let t=a(e)?e:{},n=[];for(let r of["_artifacts","artifacts"]){let s=t[r];Array.isArray(s)&&n.push(...s)}for(let r of["_artifact","artifact"]){let s=t[r];a(s)&&n.push(s)}return n}function jn(e,t={}){let{source:n="runtime_artifact"}=t,r=a(e)?e:{};if(!Object.keys(r).length)return null;let s=a(r.content)?{...r.content}:{},i=a(r.metadata)?{...r.metadata}:{},o=S(r.saved_path,r.savedPath,s.saved_path,s.savedPath,i.savedPath),u=S(r.mimeType,r.mime_type,s.mimeType,s.mime_type,i.mimeType),l=S(r.artifactType,r.artifact_type,r.type,r.kind,s.type,o?"image":"file"),d=Kn(r,s,l,o),f=d?fe(o,u):u;if(d){let I=S(r.dataUrl,s.dataUrl),A=I.startsWith("data:")?I:"",b=S(r.imageUrl,r.previewUrl,r.fileUrl,r.downloadUrl,r.url,r.uri,s.imageUrl,s.previewUrl,s.fileUrl,s.downloadUrl,s.url,s.uri),_=pe(r.result??s.result,f)||A||wt(o,f,t)||wt(b,f,t);_&&(_.startsWith("data:")&&(s.dataUrl||=_),s.imageUrl||=_,s.previewUrl||=_,s.fileUrl||=_,f&&(s.mimeType||=f))}for(let[I,A]of[["prompt","prompt"],["previewUrl","previewUrl"],["fileUrl","fileUrl"],["downloadUrl","downloadUrl"],["imageUrl","imageUrl"],["dataUrl","dataUrl"],["url","url"],["uri","uri"],["mimeType","mimeType"],["mime_type","mimeType"]]){let b=r[I];b!=null&&b!==""&&!(A in s)&&(s[A]=b)}let h=S(r.fileUrl,r.downloadUrl,r.imageUrl,r.dataUrl,r.url,r.uri,s.fileUrl,s.downloadUrl,s.imageUrl,s.dataUrl,s.url,s.uri),g=S(r.previewUrl,r.imageUrl,r.dataUrl,r.url,r.fileUrl,r.uri,s.previewUrl,s.imageUrl,s.dataUrl,s.url,s.fileUrl,s.uri),m=S(r.dataUrl,s.dataUrl,h.startsWith("data:")?h:"",g.startsWith("data:")?g:""),y=S(r.filename,i.filename,o?le(o):""),U=S(r.fieldKey,r.field_key,s.fieldKey,i.fieldKey,d?"image":"artifact");return{...r,artifactType:l,type:r.type||l,fieldKey:U,title:S(r.title,y,"Runtime artifact"),summary:S(r.summary,s.prompt,r.title,y,"Runtime artifact"),content:s,dataUrl:m||void 0,fileUrl:h||void 0,previewUrl:g||void 0,metadata:{...i,source:S(i.source,n),savedPath:o||i.savedPath,filename:y||i.filename,mimeType:f||i.mimeType}}}function st(e,t){if(!t||!e)return;let n=a(t.metadata)?t.metadata:{},r=S(n.savedPath,n.callId,t.previewUrl,t.fileUrl)||ue(),s=e.get(r);if(!s){e.set(r,t);return}s.content={...a(s.content)?s.content:{},...a(t.content)?t.content:{}},s.metadata={...a(s.metadata)?s.metadata:{},...n},s.previewUrl=t.previewUrl||s.previewUrl,s.fileUrl=t.fileUrl||s.fileUrl,s.summary=t.summary||s.summary,s.title=t.title||s.title}function Et(e,t,n={}){for(let r of zn(e))st(t,jn(r,n))}function It(e){if(!a(e)||!a(e.payload))return a(e)?e:{value:e};let t=c(e.payload.type);if(t!=="image_generation_end"&&t!=="image_generation_call")return e;let n={...e.payload};return typeof n.result=="string"&&n.result&&(n.result="<omitted>",n.resultLength=e.payload.result.length),{...e,payload:n}}function ce(e,t,n){if(!a(e))return e;let r=a(e.event)?e.event:null;return r?(st(t,xt(r,n)),{...e,event:It(r)}):e}function he(e,t,n={}){if(!a(e))return e;Et(e,t,n);let r=ce(e,t,n),s=a(r.update)?ce(r.update,t,n):null;return s&&s!==r.update&&(r={...r,update:s}),r}function me(e,t,n={}){let r=a(e)?{...e}:{};Et(r,t,n),Et(a(r.output)?r.output:{},t,n);let s=[...t?.values?.()||[]];return s.length&&(r._artifacts=s),delete r.artifacts,r}var z=class{constructor(t,n,r={},s={}){this.agent=t,this.target=n,this.callbacks=r,this.options=s,this.proc=null,this.permissionHandlers=new Map}async ensureStarted(){if(this.proc)return;let t=c(this.target.command);if(!t)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);this.proc=new nt({command:t,args:x(this.target.args),cwd:c(this.target.cwd)||this.agent.workspace||process.cwd(),env:a(this.target.env)?this.target.env:{},label:`${this.agent.agentId}:${this.agent.targetCode}`,framing:c(this.target.framing||"line")}),this.proc.onRequest("session/request_permission",n=>this.handlePermissionRequest(n)),this.proc.onRequest("session/requestPermission",n=>this.handlePermissionRequest(n)),await this.proc.start({initialize:this.target.initialize!==!1,initializeParams:{clientInfo:{name:"orcha-runtime-bridge",version:K},...a(this.target.initializeParams)?this.target.initializeParams:{}}})}async sessionNew(t={}){return await this.ensureStarted(),this.proc.call("session/new",this.sessionNewParams(t))}sessionNewParams(t={}){let n=Array.isArray(t.mcpServers)?t.mcpServers:Array.isArray(this.target.mcpServers)?this.target.mcpServers:[];return{...t,mcpServers:n}}async sessionPrompt(t,n){await this.ensureStarted();let r=c(t.sessionId),s=new Map,i=this.artifactOptions(),o=this.proc.onNotification("session/update",l=>{let d=c(l.sessionId);(!d||d===r)&&n(he(l,s,i))}),u=async l=>this.callbacks.onPermissionRequest?.({agent:this.agent,runtimeSessionId:r,request:l,emitUpdate:n})||{outcome:"denied",reason:"permission handler is not configured"};r&&this.permissionHandlers.set(r,u),this.permissionHandlers.set("*",u);try{let l=await this.proc.call("session/prompt",t,this.options.sessionPromptTimeoutMs);return me(l,s,i)}finally{o(),r&&this.permissionHandlers.delete(r),this.permissionHandlers.delete("*")}}async sessionCancel(t){return await this.ensureStarted(),this.proc.call("session/cancel",t,5e3).catch(()=>({ok:!0}))}async handlePermissionRequest(t){let n=c(t.sessionId),r=this.permissionHandlers.get(n)||this.permissionHandlers.get("*");return r?r(t):{outcome:"denied",reason:"no active Orcha permission handler"}}artifactSource(){return c(this.target.type||"acp")==="openclaw"?"openclaw_image_generation":"acp_runtime_image_generation"}artifactOptions(){let t=a(this.target.env)?this.target.env:{};return{source:this.artifactSource(),trustedFileRoots:[c(this.target.artifactRoot),c(this.target.artifactDir),c(this.target.runtimeArtifactRoot),c(t.ORCHA_RUNTIME_ARTIFACT_DIR),...x(this.target.trustedArtifactRoots),...x(this.target.trustedFileRoots),...x(this.target.artifactRoots),...x(this.target.artifactFileRoots)].filter(Boolean)}}async stop(t){await this.proc?.stop(t)}};function Gn(e){let t=a(e.metadata)?e.metadata:{};return c(t.agentCode)}function qn(e,t){let n=Gn(e);return n?`agent:${n}:${t}`:`orcha-${t}`}var it=class extends z{constructor(t,n,r,s={},i={}){let o=c(r).replace(/[^A-Za-z0-9._-]+/g,"-")||"default",u=c(n.command)||"openclaw",l=Array.isArray(n.args)?n.args.map(String):[],d=l.length>0?l:["acp","--session",qn(t,o)];super(t,{...n,command:u,args:d},s,i)}sessionNewParams(t={}){return{...t,mcpServers:[]}}};import{spawn as Jn}from"node:child_process";import{randomUUID as X}from"node:crypto";import{existsSync as Se,mkdirSync as Wn,readdirSync as Re,readFileSync as we,realpathSync as ut,rmSync as Xn,rmdirSync as Vn,statSync as Yn,unlinkSync as Zn}from"node:fs";import{homedir as Qn,tmpdir as Ee}from"node:os";import{basename as xe,dirname as tr,join as M,resolve as ge}from"node:path";var er=36e5,nr=5e3,rr=2*60*1e3,sr=2*60*1e3,ir=12,or=1e3,ar=1500,ot=24*60*60*1e3,V=new Set(["final_answer","final","complete","completed","done"]);function at(e,t){try{e.kill(t)}catch{}}function C(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(t=>C(t)).join("");if(!a(e))return"";for(let t of["text","delta","output_text","content","message","output"]){let n=C(e[t]);if(n)return n}return""}function Ie(e){if(!a(e))return"";let t=a(e.payload)?e.payload:{};if(c(e.type)==="event_msg"){if(c(t.type)==="agent_message")return c(t.message);if(c(t.type)==="task_complete")return c(t.last_agent_message)}if(c(e.type)==="response_item"&&c(t.type)==="message"&&c(t.role)==="assistant")return C(t.content)||C(t.message);let n=C(e.delta)||C(e.text)||C(e.content);if(n)return n;let r=a(e.item)?e.item:{};return c(r.role)==="assistant"||c(r.type)==="message"?C(r.content)||C(r.text)||C(r.message):""}function Oe(e,t={}){return xt(e,{source:"codex_cli_image_generation",...t})}function Ce(e,t){st(e.artifacts,t)}function Ae(e){return It(e)}function Mt(e){if(!a(e))return!1;let t=a(e.payload)?e.payload:{},n=c(e.type),r=c(t.type);if(n==="event_msg"&&r==="task_complete")return!0;let s=c(t.phase||t.status||t.stage).toLowerCase();return n==="event_msg"&&r==="agent_message"||n==="response_item"&&r==="message"&&c(t.role)==="assistant"?V.has(s):!1}function _e(e){return a(e)?c(e.phase||e.status||e.stage).toLowerCase():""}function cr(e){if(!a(e)||Mt(e))return!1;let t=a(e.payload)?e.payload:{},n=c(e.type),r=c(t.type),s=_e(t);if(n==="event_msg"&&r==="agent_message"||n==="response_item"&&r==="message"&&c(t.role)==="assistant")return!!(s&&!V.has(s));let i=a(e.item)?e.item:{},o=_e(i);return c(i.role)==="assistant"||c(i.type)==="message"?!!(o&&!V.has(o)):!1}function ur(e,t,n){return n.captureLastMessage===!1||t.includes("--output-last-message")||t.includes("-o")?!1:n.captureLastMessage===!0?!0:xe(e)==="codex"}function lr(e,t){return t.collectCodexTranscriptArtifacts===!1?!1:t.collectCodexTranscriptArtifacts===!0?!0:xe(e)==="codex"}function Me(e){return Math.max(20,T(e.codexTranscriptPollMs||e.transcriptPollMs,or))}function dr(e){return Math.max(0,T(e.codexFinalOutputWaitMs||e.finalOutputWaitMs,ar))}function lt(e){if(typeof e=="boolean")return e;let t=c(e).toLowerCase();return["true","1","yes","y","on"].includes(t)?!0:["false","0","no","n","off"].includes(t)?!1:null}function Nt(e){let t=a(e?.metadata)?e.metadata:{};return a(t._runtimeBridge)?t._runtimeBridge:{}}function Ot(e){return c(Nt(e).promptKind).toLowerCase()}function fr(e,t){for(let n of[e.codexTranscriptStreaming,e.streamCodexTranscript]){let r=lt(n);if(r!=null)return r}return Ot(t)==="chat"}function pr(e,t){let n=Nt(e);for(let s of[n.emitThoughtChunks,n.streamThoughts]){let i=lt(s);if(i!=null)return i}let r=Ot(e);if(r&&r!=="chat")return!1;for(let s of[t.emitThoughtChunks,t.streamThoughts]){let i=lt(s);if(i!=null)return i}return Ot(e)==="chat"}function hr(e){let t=Nt(e);for(let n of[t.finalTextOnly,t.finalOutputOnly]){let r=lt(n);if(r!=null)return r}return null}function mr(e,t){let n=hr(e);return n??(t.finalTextOnly===!0||t.finalOutputOnly===!0?!0:(t.finalTextOnly===!1||t.finalOutputOnly===!1,!1))}function gr(e,t){return!e.finalTextOnly||t}function Ne(e,t,n,r,s=r){return!r||e.emittedTexts.has(s)?!1:(e.emittedTexts.add(s),n({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:r}}}),!0)}function Ue(e,t,n,r){return!r||e.emittedThoughtTexts.has(r)?!1:(e.emittedThoughtTexts.add(r),n({sessionId:t,update:{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:r}}}),!0)}function _r(e,t,n,r=new Set){return{target:e,promptText:t,startedAtMs:n,baselinePaths:r,matchedPath:"",disabled:!1,processedLines:new Map}}function Tr(e,t){let n=a(e.env)?e.env:{},r=c(e.artifactRoot||e.artifactDir||e.runtimeArtifactRoot||n.ORCHA_RUNTIME_ARTIFACT_DIR)||M(Ee(),"orcha-runtime-artifacts"),s=c(t).replace(/[^A-Za-z0-9._-]+/g,"-").slice(0,80)||X(),i=M(r,s),o=M(i,X());return Wn(o,{recursive:!0}),{root:o,realRoot:ut(o),sessionRoot:i,realSessionRoot:ut(i)}}function be(e){return c(a(e)?e.root:e)}function Te(e){let t=be(e),n=c(a(e)?e.sessionRoot:tr(t)),r=c(a(e)?e.realSessionRoot:"");if(n)try{if(r&&ut(n)!==r)return;Vn(n)}catch{}}function yr(e,t={}){let n=be(e),r=c(a(e)?e.realRoot:"");if(n){try{if(r&&ut(n)!==r){p("warn","runtime.cli","runtime artifact directory cleanup skipped; path changed",{...t,artifactRoot:n});return}}catch{Te(e);return}try{Xn(n,{recursive:!0,force:!0})}catch(s){p("warn","runtime.cli","runtime artifact directory cleanup failed",{...t,artifactRoot:n,error:String(s?.message||s)});return}Te(e)}}function Sr(e,t){return{trustedFileRoots:[t,...x(e.trustedArtifactRoots),...x(e.trustedFileRoots),...x(e.artifactRoots),...x(e.artifactFileRoots)].filter(Boolean)}}function ke(e){let t=c(e.codexSessionsRoot||e.codexSessionRoot);if(t)return t;let n=a(e.env)?e.env:{},r=c(e.codexHome||n.CODEX_HOME||process.env.CODEX_HOME)||M(Qn(),".codex");return M(r,"sessions")}function Rr(e,t){let n=new Date(t),r=String(n.getFullYear()),s=String(n.getMonth()+1).padStart(2,"0"),i=String(n.getDate()).padStart(2,"0");return M(e,r,s,i)}function Pe(e,t,n){let r=new Set;for(let s of[t-ot,t,t+ot,n-ot,n,n+ot])r.add(Rr(e,s));return[...r].filter(s=>Se(s))}function wr(e,t,n){let r=ke(e),s=t-rr,i=n+sr,o=[];for(let u of Pe(r,t,n)){let l=[];try{l=Re(u)}catch{continue}for(let d of l){if(!d.endsWith(".jsonl"))continue;let f=M(u,d);try{let h=Yn(f);if(!h.isFile()||h.mtimeMs<s||h.mtimeMs>i)continue;o.push({path:f,mtimeMs:h.mtimeMs})}catch{}}}return o.sort((u,l)=>l.mtimeMs-u.mtimeMs).slice(0,ir)}function Er(e,t,n=t){let r=ke(e),s=new Set;for(let i of Pe(r,t,n)){let o=[];try{o=Re(i)}catch{continue}for(let u of o)u.endsWith(".jsonl")&&s.add(M(i,u))}return s}function Ct(e,t,n=0){if(!(n>8||e===null||e===void 0)){if(typeof e=="string"){e&&t.push(e);return}if(Array.isArray(e)){for(let r of e)Ct(r,t,n+1);return}if(a(e))for(let r of["payload","item","text","delta","output_text","content","message","output","input","prompt","last_agent_message","revised_prompt"])r in e&&Ct(e[r],t,n+1)}}function Le(e){return c(e).replace(/\s+/g," ")}function xr(e){let t=Le(e);if(!t)return[];if(t.length<=200)return[t];let n=160,r=[0,Math.floor((t.length-n)/2),t.length-n],s=new Set,i=[];for(let o of r){let u=t.slice(Math.max(0,o),Math.max(0,o)+n).trim();u.length>=40&&!s.has(u)&&(s.add(u),i.push(u))}return i}function Ir(e,t){let n=xr(t);if(!n.length)return!1;let r=[];for(let i of e)Ct(i,r);let s=Le(r.join(" "));return n.every(i=>s.includes(i))}function Or(e){return e.find(t=>a(t)&&c(t.type)==="session_meta"&&a(t.payload))||null}function Cr(e){let t=a(e?.payload)?e.payload:{},n=c(e?.timestamp||t.timestamp),r=Date.parse(n);return Number.isFinite(r)?r:Number.NaN}function Ar(e,t,n){if(!Ir(e,t.promptText))return!1;let r=Or(e);if(!r)return!1;let s=r.payload,i=c(s.originator),o=c(s.source);if(i!=="codex_exec"&&o!=="exec")return!1;let u=Cr(r);if(!Number.isFinite(u)||u<t.startedAtMs-5e3||u>n+5e3)return!1;let l=c(t.target.cwd),d=c(s.cwd);return!(l&&d&&ge(l)!==ge(d))}function ye(e){try{return Nr(we(e,"utf8"))}catch{return null}}function Mr(e,t,n){if(!e||e.disabled)return null;if(e.matchedPath){let s=ye(e.matchedPath);return s?{path:e.matchedPath,events:s}:null}let r=[];for(let s of wr(e.target,e.startedAtMs,n)){if(e.baselinePaths.has(s.path))continue;let i=ye(s.path);!i||!Ar(i,e,n)||r.push({path:s.path,events:i})}return r.length!==1?(r.length>1&&(e.disabled=!0,p("warn","runtime.cli","codex transcript fallback disabled; multiple matching transcripts",{target:e.target.targetCode,sessionId:t,transcriptCount:r.length})),null):(e.matchedPath=r[0].path,p("info","runtime.cli","codex transcript stream attached",{target:e.target.targetCode,sessionId:t}),r[0])}function Nr(e){let t=[];for(let n of e.split(/\r?\n/)){let r=n.trim();if(r)try{t.push(JSON.parse(r))}catch{}}return t}function Ur(e){if(!a(e))return!1;let t=a(e.payload)?e.payload:{},n=c(e.type),r=c(t.type);return n==="event_msg"&&r==="image_generation_end"||n==="response_item"&&r==="image_generation_call"}function br(e,t,n,r){let s=Ie(e),i=Mt(e),o=0,u=0,l=0;if(s&&!i&&t.emitThoughtChunks&&Ue(t,n,r,s)&&(l=1),s&&i){let d=t.emittedTexts.size?`
9
9
 
10
- ${s}`:s;Ce(t,n,r,d,s)&&(o=1,u=1)}return s&&i&&(t.finalTextSeen=!0),Ee(t,Re(e,t.artifactOptions)),(yr(e)||i)&&r({sessionId:n,update:{sessionUpdate:"runtime_event",event:xe(e)}}),{textCount:o,finalTextCount:u,thoughtCount:l}}function Mt(e,t,n,r,s=Date.now()){if(!t)return{artifactCount:0,transcriptCount:0,textCount:0,finalTextCount:0,thoughtCount:0};let i=e.artifacts.size,o=0,u=0,l=0,d=0,f=Tr(t,n,s);if(f){let h=Math.min(t.processedLines.get(f.path)||0,f.events.length),m=e.artifacts.size;for(let y of f.events.slice(h)){let S=Sr(y,e,n,r);u+=S.textCount,l+=S.finalTextCount,d+=S.thoughtCount}t.processedLines.set(f.path,f.events.length),(f.events.length>h||e.artifacts.size>m)&&(o=1)}return{artifactCount:e.artifacts.size-i,transcriptCount:o,textCount:u,finalTextCount:l,thoughtCount:d}}function wr(e,{remove:t=!0}={}){if(!e||!ge(e))return"";try{return _e(e,"utf8").trim()}catch{return""}finally{t&&at(e)}}function at(e){if(e)try{vn(e)}catch{}}function Rr(e,t){return{artifactCount:(e?.artifactCount||0)+(t?.artifactCount||0),transcriptCount:(e?.transcriptCount||0)+(t?.transcriptCount||0),textCount:(e?.textCount||0)+(t?.textCount||0),finalTextCount:(e?.finalTextCount||0)+(t?.finalTextCount||0),thoughtCount:(e?.thoughtCount||0)+(t?.thoughtCount||0)}}function Er(e){return new Promise(t=>setTimeout(t,e))}function xr(e,t,n,r){return r?(e.finalTextSeen=!0,e.emittedTexts.has(r)||(e.emittedTexts.add(r),n({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:r}}})),!0):!1}async function Ir(e,t,n,r,s,i){let o=Mt(e,t,n,r,Date.now()),u=()=>xr(e,n,r,wr(s,{remove:!1}));if(u()||e.finalTextSeen)return at(s),o;let l=Qn(i);if(l<=0||!t&&!s)return at(s),o;let d=Date.now()+l,f=Math.min(Ie(i),100);for(;!e.finalTextSeen&&Date.now()<d&&(await Er(Math.min(f,Math.max(0,d-Date.now()))),o=Rr(o,Mt(e,t,n,r,Date.now())),!u()););return at(s),o}var lt=class{constructor(t,n,r={}){this.agent=t,this.target=n,this.options=r,this.active=new Map}async sessionNew(){return{sessionId:`cli-${this.agent.agentId}-${J()}`}}async sessionPrompt(t,n){let r=Date.now(),s=a(this.target.command);if(!s)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);let i=a(t.sessionId)||J(),o=Q(t.prompt),u=a(this.target.promptMode||"stdin"),l=this.buildArgs(u,o),d=a(this.target.cwd)||this.agent.workspace||process.cwd(),f=or(this.target,i),h=f.root,m=cr(this.target,h),y=Zn(s,this.target),S={...this.target,targetCode:this.agent.targetCode,cwd:d},U=y?dr(S,r):new Set,x=Yn(s,l,this.target)?A(ye(),`orcha-runtime-last-message-${J()}.txt`):"";x&&l.push("--output-last-message",x);let O=T(this.target.timeoutMs||this.target.sessionPromptTimeoutMs,T(this.options.sessionPromptTimeoutMs,Gn)),N={...process.env,...c(this.target.env)?this.target.env:{},...u==="env"?{ORCHA_RUNTIME_PROMPT:o}:{},ORCHA_AGENT_ID:this.agent.agentId,ORCHA_SESSION_ID:i,ORCHA_RUNTIME_ARTIFACT_DIR:h},g=Ln(s,l,{cwd:d,env:N,stdio:["pipe","pipe","pipe"]});this.active.set(i,g),p("info","runtime.cli","runtime prompt started",{target:this.agent.targetCode,sessionId:i,pid:g.pid,timeoutMs:O});let Xt="",yt=a(this.target.outputMode||"text"),b={artifacts:new Map,emittedTexts:new Set,emittedThoughtTexts:new Set,value:"",artifactOptions:m,finalTextSeen:!1,finalTextOnly:rr(t,this.target),emitThoughtChunks:er(t,this.target)},St=y?ir(S,o,r,U):null;return g.stdout.setEncoding("utf8"),g.stdout.on("data",v=>this.handleStdout(v,yt,b,i,n)),g.stderr.setEncoding("utf8"),g.stderr.on("data",v=>{Xt+=v,this.target.emitStderr===!0&&n({sessionId:i,update:{sessionUpdate:"runtime_stderr_chunk",content:{type:"text",text:v}}})}),u==="stdin"?g.stdin.end(o):g.stdin.end(),await new Promise((v,an)=>{let Y=!1,Vt=!1,F=null,wt=St&&tr(this.target,t)?setInterval(()=>{try{Mt(b,St,i,n)}catch(w){p("warn","runtime.cli","codex transcript stream poll failed",{target:this.agent.targetCode,sessionId:i,error:String(w?.message||w)})}},Ie(this.target)):null;wt?.unref?.();let Yt=setTimeout(()=>{Vt=!0,p("warn","runtime.cli","runtime prompt timed out; terminating child",{target:this.agent.targetCode,sessionId:i,pid:g.pid,timeoutMs:O}),ot(g,"SIGTERM"),F=setTimeout(()=>{p("warn","runtime.cli","runtime prompt force killing child",{target:this.agent.targetCode,sessionId:i,pid:g.pid}),ot(g,"SIGKILL")},qn),F.unref?.(),Rt(Object.assign(new Error(`runtime CLI timed out after ${O}ms`),{code:"RUNTIME_CLI_TIMEOUT"}))},O);Yt.unref?.();let Zt=()=>{clearTimeout(Yt),wt&&clearInterval(wt),F&&!Vt&&clearTimeout(F),ar(f,{target:this.agent.targetCode,sessionId:i}),this.active.delete(i)},cn=w=>{Y||(Y=!0,Zt(),v(w))},Rt=w=>{Y||(Y=!0,Zt(),an(w))};g.on("error",w=>{p("warn","runtime.cli","runtime child error",{target:this.agent.targetCode,sessionId:i,pid:g.pid,error:String(w?.message||w)}),Rt(w)}),g.on("exit",(w,Qt)=>{(async()=>{F&&(clearTimeout(F),F=null),yt==="json-lines"&&b.value.trim()&&this.handleStdout(`
11
- `,yt,b,i,n);let k=await Ir(b,St,i,n,x,this.target);(k.artifactCount>0||k.textCount>0||k.thoughtCount>0)&&p("info","runtime.cli","codex transcript updates collected",{target:this.agent.targetCode,sessionId:i,artifactCount:k.artifactCount,textCount:k.textCount,finalTextCount:k.finalTextCount,thoughtCount:k.thoughtCount,transcriptCount:k.transcriptCount});let Z=Xt.trim();Z&&p("debug","runtime.cli","runtime stderr",{target:this.agent.targetCode,sessionId:i,stderr:Z}),p("info","runtime.cli","runtime prompt finished",{target:this.agent.targetCode,sessionId:i,pid:g.pid,exitCode:w,signal:Qt,artifactCount:b.artifacts.size,finalTextSeen:b.finalTextSeen}),cn({stopReason:w===0?"end_turn":"error",exitCode:w,signal:Qt,_artifacts:[...b.artifacts.values()],...Z?{stderr:Z}:{}})})().catch(Rt)})})}buildArgs(t,n){let r=E(this.target.args);return t==="args"?[...r,n]:r}handleStdout(t,n,r,s,i){if(n!=="json-lines"){i({sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:t}}});return}r.value+=t;let o=r.value.split(/\r?\n/);r.value=o.pop()||"";for(let u of o){let l=u.trim();if(l)try{let d=JSON.parse(l);Ee(r,Re(d,r.artifactOptions)),i({sessionId:s,update:{sessionUpdate:"runtime_event",event:xe(d)}});let f=we(d),h=Ut(d);f&&r.emitThoughtChunks&&!h&&Vn(d)?Oe(r,s,i,f):f&&sr(r,h)&&Ce(r,s,i,f),f&&h&&(r.finalTextSeen=!0)}catch{i({sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`${u}
12
- `}}})}}}async sessionCancel(t){let n=a(t.sessionId),r=this.active.get(n);return r?(p("info","runtime.cli","cancelling runtime child",{target:this.agent.targetCode,sessionId:n,pid:r.pid}),ot(r,"SIGTERM"),this.active.delete(n),{ok:!0,cancelled:!0}):{ok:!0,cancelled:!1}}stop(t="stop"){for(let[n,r]of this.active.entries())p("info","runtime.cli","stopping runtime child",{target:this.agent.targetCode,sessionId:n,pid:r.pid,reason:t}),ot(r,"SIGTERM");this.active.clear()}};var bt=24e3,kt=8,Pt=50,Lt=6e3,Cr=new Set(["fail","failed","failure","error","errored","timeout","timed_out","cancelled","canceled","aborted"]),Or=10*60*1e3,Ar=60*1e3,Mr=8,Ur=60*1e3,Nr=1,ft="ORCHA_RUNTIME_RESULT_START",Le="ORCHA_RUNTIME_RESULT_END",br=new Set(["agentId","taskId","executionId","sessionId","nodeId","targetCode","framework","workspace","instructions","runtimeMaxSessions"]),kr=/(^|[_-])(token|secret|password|authorization|api[-_]?key|private[-_]?key|credential|cookie|jwt|access[-_]?token|refresh[-_]?token|service[-_]?token|execution[-_]?token)([_-]|$)/i;function Pr(e,t,n){let r=c(e?._meta)?e._meta:{};return{...c(e)?e:{},sessionId:t,update:c(e?.update)?e.update:{},_meta:{...r,orchaAgentId:n.agentId,runtimeSessionId:n.runtimeSessionId,bridgeUpdateId:dt()}}}function I(e){return e==null||e===""?!1:typeof e=="string"?a(e)!=="":Array.isArray(e)?e.length>0:c(e)?Object.keys(e).length>0:!0}function Fe(e){let t=a(e).toLowerCase().replace(/[.。!!]+$/g,"").replace(/[\s-]+/g,"_");return Cr.has(t)}function D(e,t){let n=T(e,t);return Number.isFinite(n)&&n>0?n:t}function Dt(e){let t=T(e,null);return Number.isFinite(t)&&t>0?t:null}function V(e,t=!1){if(typeof e=="boolean")return e;let n=a(e).toLowerCase();return["true","1","yes","y","on"].includes(n)?!0:["false","0","no","n","off"].includes(n)?!1:t}function L(e){return a(e?.type||"echo")}function Lr(e){let t=L(e);return t==="acp"||t==="stdio-acp"||t==="openclaw"}function $t(e){if(c(e)){if(Object.prototype.hasOwnProperty.call(e,"releaseAfterPrompt"))return e.releaseAfterPrompt;if(Object.prototype.hasOwnProperty.call(e,"disposeAfterPrompt"))return e.disposeAfterPrompt}}function Fr(e){let t=String(e||"");if(kr.test(t))return!0;let n=t.replace(/[^a-z0-9]/gi,"").toLowerCase();return n.endsWith("token")||n.endsWith("secret")||n.endsWith("password")||n.endsWith("apikey")||n.endsWith("privatekey")||n==="authorization"||n==="cookie"||n==="jwt"||n.includes("credential")}function Ht(e,t=0){if(e==null||typeof e=="number"||typeof e=="boolean")return e;if(typeof e=="string"){if(e.length<=Lt)return e;let n=e.length-Lt;return`${e.slice(0,Lt)}... [truncated ${n} characters]`}if(t>=kt)return Array.isArray(e)?`[array truncated at depth ${kt}, items=${e.length}]`:c(e)?`[object truncated at depth ${kt}, keys=${Object.keys(e).length}]`:String(e);if(Array.isArray(e)){let n=e.slice(0,Pt).map(r=>Ht(r,t+1));return e.length>Pt&&n.push(`[truncated ${e.length-Pt} items]`),n}if(c(e)){let n={};for(let[r,s]of Object.entries(e))n[r]=Fr(r)?"[REDACTED]":Ht(s,t+1);return n}return String(e)}var Dr=new Set(["type","executionId","taskId","task","traceId","requestId","agentCode","stage","phase","nodeId","nodeType","capabilityCode","operationCode","outputType","artifactType","input","inputs","rejection","previous","artifactRefs","outputSchema","executionPolicy","resultContract"]);function $r(e){if(!c(e))return e;let t={};for(let n of Dr)I(e[n])&&(t[n]=e[n]);return t}function Hr(e){if(!c(e))return e;let t={...e};return c(t.renderedPayload)&&(t.renderedPayload=$r(t.renderedPayload)),t}function vr(e){let t=c(e)?e:{},n={};I(t.metadata)&&(n.metadata=Hr(t.metadata));for(let[r,s]of Object.entries(t))br.has(r)||r==="metadata"||I(s)&&(n[r]=s);return n}function Br(e){let t=c(e)?e:{},n=c(t.metadata)?t.metadata:{},r=c(n.renderedPayload)?n.renderedPayload:{};return c(t.resultContract)?t.resultContract:c(r.resultContract)?r.resultContract:{}}function De(e){return a(Br(e).kind).toLowerCase()==="decision"}function be(e){let t=c(e)?e:{},n=c(t.metadata)?t.metadata:{};return Dt(t.runtimeMaxSessions??n.runtimeMaxSessions)}function zr(e){return e?.dispatchFinalTextOnly===!0||e?.dispatchFinalOutputOnly===!0?!0:e?.dispatchFinalTextOnly===!1||e?.dispatchFinalOutputOnly===!1?!1:L(e)==="cli"}function ke(e){let t=e?.dispatchReleaseAfterPrompt??e?.dispatchDisposeAfterPrompt;return V(t,Lr(e))}function Gr(e,t){let n=c(e?.metadata)?{...e.metadata}:{},r=c(n._runtimeBridge)?{...n._runtimeBridge}:{},s=$t(r);return n._runtimeBridge={...r,promptKind:"dispatch",finalTextOnly:zr(t),releaseAfterPrompt:s===void 0?ke(t):V(s,ke(t)),requiresRuntimeResult:De(e)},n}function qr(e){let t=vr(e);if(!I(t))return"";let n=JSON.stringify(Ht(t),null,2);if(n.length<=bt)return n;let r=n.length-bt;return`${n.slice(0,bt)}
13
- ... [truncated ${r} characters]`}function $e(e){if(!c(e))return"";let t=c(e.update)?e.update:e,r=(c(t.content)?t.content:{}).text??t.text;return r==null?"":String(r)}function Kr(e){if(!c(e))return"";let t=c(e.update)?e.update:e;return a(t.sessionUpdate)}function jr(e){if(!Array.isArray(e))return"";let t=!1,n=[],r=[],s=[],i=()=>{n.length>0&&(r.push(n),n=[])};for(let u of e){let l=Kr(u),d=$e(u);if(!l){d&&s.push(d);continue}if(t=!0,l==="agent_message_chunk"){d&&n.push(d);continue}(l==="agent_thought_chunk"||l==="user_message_chunk"||l==="tool_call"||l==="tool_call_update"||l==="plan")&&i()}if(i(),!t)return vt(s);let o=r[r.length-1]||[];return vt(o)}function Wr(e){return Array.isArray(e)?e.map($e).filter(t=>a(t)):[]}function Jr(e){if(!c(e))return null;let t=c(e.update)?e.update:e;return a(t.sessionUpdate)!=="runtime_event"?null:c(t.event)?t.event:null}function Xr(e){if(!c(e))return"";let t=c(e.payload)?e.payload:{},n=a(e.type),r=a(t.type);if(n==="event_msg"){if(r==="task_complete")return a(t.last_agent_message||t.message||t.output);if(r==="agent_message"){let s=a(t.phase||t.status||t.stage).toLowerCase();if(["final_answer","final","complete","completed","done"].includes(s))return a(t.message||t.text||t.content)}}return""}function Vr(e){if(!Array.isArray(e))return"";for(let t=e.length-1;t>=0;t-=1){let n=Xr(Jr(e[t]));if(n)return n}return""}function vt(e){let t="";for(let n of e){let r=String(n||"");r&&(t?r.startsWith(t)?t=r:t.endsWith(r)||(t+=r):t=r)}return t.trim()}function Yr(e){let t=String(e||"").trim();if(!t)return"";let n=t.match(/(?:^|\n)#{1,3}\s+\S/);return!n||n.index===0?t:t.slice(n.index+(t[n.index]===`
14
- `?1:0)).trim()}function pt(e){let t=String(e||"").trim();if(!t)return null;try{let n=JSON.parse(t);if(c(n)&&(He(n)||I(n._artifacts)||I(n.artifacts)||I(n._decision)||I(n._meta)))return n}catch{}return null}function Zr(e){let t=String(e||"");if(!t)return"";let n=t.lastIndexOf(Le);if(n<0)return"";for(let r=t.lastIndexOf(ft,n);r>=0;r=t.lastIndexOf(ft,r-1)){let s=t.slice(r+ft.length,n).trim();if(pt(s))return s}return""}function ht(e){let t=Zr(e);return t?pt(t):null}function Pe(e){let t=String(e||"").trim();if(!t)return null;let n=ht(t);if(n)return n;let r=[...t.matchAll(/```(?:json)?\s*([\s\S]*?)```/gi)];for(let s=r.length-1;s>=0;s-=1){let i=pt(r[s][1]);if(i)return i}if(!t.endsWith("}"))return null;for(let s=t.lastIndexOf("{");s>=0;s=t.lastIndexOf("{",s-1)){let i=pt(t.slice(s));if(i)return i}return null}function Qr(e){let t=Wr(e);for(let n=t.length-1;n>=0;n-=1){let r=ht(t[n]);if(r)return r}return ht(vt(t))}function He(e){if(!c(e))return!1;if(I(e.output))return!0;for(let t of["content","text","message","summary"])if(a(e[t]))return!0;return!!(Fe(e.status)||a(e.error)||a(e.errorMessage))}function M(e){let t=c(e)?{...e}:{};return(!Array.isArray(t._artifacts)||t._artifacts.length===0)&&Array.isArray(t.artifacts)&&t.artifacts.length>0&&(t._artifacts=t.artifacts),delete t.artifacts,t}function ts(e){return c(e)?typeof(c(e._decision)?e._decision:c(e.decision)?e.decision:e).passed=="boolean":!1}function es(e){return c(e)?c(e._decision)&&typeof e._decision.passed=="boolean"?!0:ts(e.output):!1}function Ft(e,t,n){let r=c(e)?{...e}:{};if(!I(r.output)){for(let s of["summary","message","content","text"])if(a(r[s])){r.output=a(r[s]);break}}return!I(r.output)&&a(n)&&(r.output=a(n)),{...r,_meta:{...c(r._meta)?r._meta:{},runtimeOutputSource:t,requiredRuntimeResult:!0,finalMessagePreview:a(n).slice(0,1e3)}}}function P(e,t,n){return{...e,...t,_meta:{...c(e._meta)?e._meta:{},...c(t._meta)?t._meta:{},runtimeOutputSource:n}}}function ns(e,t,n={}){let r=a(n.promptKind),s=n.requiresRuntimeResult===!0,i=s||r==="dispatch",o=M(e),u=typeof o.output=="string"?ht(o.output):null;if(u)return P(o,M(u),"result_block");let l=Vr(t),d=l?Pe(l):null,f=i?Qr(t):null;if(He(o))return Fe(o.status)||a(o.error)||a(o.errorMessage)?o:r==="dispatch"&&d?P(o,M(d),"final_event"):r==="dispatch"&&f?P(o,M(f),"updates"):!s||es(o)?o:d?P(o,M(d),"final_event"):f?P(o,M(f),"updates"):Ft(o,"result",o.output);if(d)return P(o,M(d),"final_event");if(f)return P(o,M(f),"updates");if(l)return s?Ft(o,"final_event",l):{...o,output:l,_meta:{...c(o._meta)?o._meta:{},runtimeOutputSource:"final_event"}};let h=Yr(jr(t));if(!h)return o;let m=Pe(h);return m?P(o,M(m),"updates"):s?Ft(o,"updates",h):{...o,output:h,_meta:{...c(o._meta)?o._meta:{},runtimeOutputSource:"updates"}}}var mt=class{constructor(t){this.config=t,this.targets=t.targets||{},this.agents=new Map,this.sessions=new Map,this.runtimeSessionIndex=new Map,this.pendingPermissions=new Map,this.startedAt=j(),this.cleanupTimer=null,this.startSessionCleanup()}targetFor(t){let n=a(t)||this.config.defaultTargetCode,r=this.targets[n];if(!n||!c(r)){let s=new Error(`runtime target is not configured: ${n||"<empty>"}`);throw s.code="RUNTIME_TARGET_NOT_FOUND",s}return{code:n,target:r}}targetIdleTtlMs(t){let r=L(t)==="openclaw"?D(this.config.openClawSessionIdleTtlMs,Ur):D(this.config.sessionIdleTtlMs,Or);return D(t?.sessionIdleTtlMs??t?.idleTtlMs,r)}targetMaxSessions(t,n=null){let s=L(t)==="openclaw"?D(this.config.openClawMaxSessions,Nr):D(this.config.maxSessionsPerTarget,Mr),i=D(t?.maxSessions,s),o=Dt(n);return o?Math.max(i,o):i}targetReleaseAfterPrompt(t,n={}){let r=L(t),s=c(n?._runtimeBridge)?n._runtimeBridge:{},i=$t(s);return i!==void 0?V(i,!1):V(t?.releaseAfterPrompt??t?.disposeAfterPrompt,r==="openclaw")}promptReleaseAfterPrompt(t,n={}){let r=c(n?._runtimeBridge)?n._runtimeBridge:{},s=$t(r);return s!==void 0?V(s,t.releaseAfterPrompt):t.releaseAfterPrompt}startSessionCleanup(){let t=D(this.config.sessionCleanupIntervalMs,Ar);t<=0||(this.cleanupTimer=setInterval(()=>{this.cleanupExpiredSessions().catch(n=>{p("warn","runtime-bridge","runtime session cleanup failed",{error:String(n)})})},t),this.cleanupTimer.unref?.())}sessionCountForTarget(t){let n=0;for(let r of this.sessions.values())r.targetCode===t&&(n+=1);return n}sessionCountForAgentTarget(t,n){let r=0;for(let s of this.sessions.values())s.agentId===t&&s.targetCode===n&&(r+=1);return r}idleTargetSessions(t){return[...this.sessions.entries()].filter(([,n])=>n.targetCode===t&&!n.busy).sort((n,r)=>(n[1].lastUsedAtMs||0)-(r[1].lastUsedAtMs||0))}idleAgentTargetSessions(t,n){return[...this.sessions.entries()].filter(([,r])=>r.agentId===t&&r.targetCode===n&&!r.busy).sort((r,s)=>(r[1].lastUsedAtMs||0)-(s[1].lastUsedAtMs||0))}async closeSession(t,n="session_closed"){let r=this.sessions.get(t);if(!r)return!1;try{await r.runtime?.stop?.(n)}catch(s){p("warn","runtime-bridge","runtime session stop failed",{sessionId:r.sessionId,runtimeSessionId:r.runtimeSessionId,targetCode:r.targetCode,runtimeKind:r.runtimeKind,error:String(s)})}return this.sessions.delete(t),this.runtimeSessionIndex.delete(`${r.agentId}:${r.runtimeSessionId}`),p("info","runtime-bridge","runtime session closed",{sessionId:r.sessionId,runtimeSessionId:r.runtimeSessionId,targetCode:r.targetCode,runtimeKind:r.runtimeKind,reason:n}),!0}async closeAllSessions(t="bridge_shutdown"){for(let n of[...this.sessions.keys()])await this.closeSession(n,t)}async stop(t="bridge_stop"){this.cleanupTimer&&clearInterval(this.cleanupTimer),this.cleanupTimer=null,await this.closeAllSessions(t)}async cleanupExpiredSessions(t=Date.now()){for(let[n,r]of[...this.sessions.entries()])r.busy||t-(r.lastUsedAtMs||r.createdAtMs||t)>r.idleTtlMs&&await this.closeSession(n,"idle_timeout")}async reserveTargetSlot(t,n,r={}){let s=a(r.agentId),i=Dt(r.runtimeMaxSessions);if(s&&i)for(;this.sessionCountForAgentTarget(s,t)>=i;){let u=this.idleAgentTargetSessions(s,t);if(!u.length){let l=new Error(`runtime agent session limit reached: ${s}`);throw l.code="RUNTIME_AGENT_SESSION_LIMIT",l}await this.closeSession(u[0][0],"agent_session_limit")}let o=this.targetMaxSessions(n,i);for(;this.sessionCountForTarget(t)>=o;){let u=this.idleTargetSessions(t);if(!u.length){let l=new Error(`runtime target session limit reached: ${t}`);throw l.code="RUNTIME_TARGET_SESSION_LIMIT",l}await this.closeSession(u[0][0],"target_session_limit")}}async createAgent(t){let n=a(t.agentId);if(!n)throw Object.assign(new Error("agentId is required"),{status:400,code:"BAD_REQUEST"});let{code:r,target:s}=this.targetFor(t.targetCode||t.framework),i={agentId:n,targetCode:r,framework:a(t.framework||r),workspace:a(t.workspace),metadata:c(t.metadata)?t.metadata:{},createdAt:j(),runtimeKind:L(s),runtimeMaxSessions:be(t)};return this.agents.set(n,i),{agent:i}}runtimeFor(t,n){let{target:r}=this.targetFor(t.targetCode),s=L(r),i={onPermissionRequest:u=>this.requestPermission(u)},o={sessionPromptTimeoutMs:this.config.sessionPromptTimeoutMs};return s==="stdio-acp"||s==="acp"?new z(t,r,i,o):s==="openclaw"?new st(t,r,n,i,o):s==="cli"?new lt(t,r,o):new tt(t)}async prompt(t,n={}){let r=a(t.agentId),s=a(t.sessionId)||dt();if(!r)throw Object.assign(new Error("agentId is required"),{status:400,code:"BAD_REQUEST"});let i=this.agents.get(r)||(await this.createAgent({agentId:r,targetCode:t.targetCode,framework:t.framework,workspace:t.workspace,runtimeMaxSessions:t.runtimeMaxSessions,metadata:t.metadata})).agent,o=be(t);o&&(i.runtimeMaxSessions=o);let u=a(t.workspace);u&&u!==i.workspace&&(i.workspace=u);let l=`${r}:${s}`;await this.cleanupExpiredSessions();let d=this.sessions.get(l);if(!d){let{code:m,target:y}=this.targetFor(i.targetCode);await this.reserveTargetSlot(m,y,{agentId:r,runtimeMaxSessions:i.runtimeMaxSessions});let S=this.runtimeFor(i,s),U=await S.sessionNew({cwd:i.workspace||process.cwd(),mcpServers:Array.isArray(t.mcpServers)?t.mcpServers:[],metadata:c(t.metadata)?t.metadata:{}}),x=Date.now();d={agentId:r,sessionId:s,runtime:S,targetCode:m,runtimeKind:L(y),runtimeSessionId:a(c(U)?U.sessionId:"")||s,idleTtlMs:this.targetIdleTtlMs(y),releaseAfterPrompt:this.targetReleaseAfterPrompt(y,t.metadata),createdAtMs:x,lastUsedAtMs:x,busy:!1,createdAt:j()},this.sessions.set(l,d),this.runtimeSessionIndex.set(`${r}:${d.runtimeSessionId}`,d)}if(d.busy){let m=new Error(`runtime session is already running: ${s}`);throw m.code="RUNTIME_SESSION_BUSY",m}d.busy=!0,d.lastUsedAtMs=Date.now();let f=[],h=m=>{let y=Pr(m,s,d);f.push(y),n.onUpdate?.(y)};try{let m=await d.runtime.sessionPrompt({sessionId:d.runtimeSessionId,prompt:Array.isArray(t.prompt)?t.prompt:[],metadata:c(t.metadata)?t.metadata:{}},h),y=c(t.metadata)?t.metadata:{},S=c(y._runtimeBridge)?y._runtimeBridge:{},U=ns(m,f,S);return{sessionId:s,runtimeSessionId:d.runtimeSessionId,result:U,updates:f}}finally{d.busy=!1,d.lastUsedAtMs=Date.now(),this.promptReleaseAfterPrompt(d,c(t.metadata)?t.metadata:{})&&await this.closeSession(l,"release_after_prompt")}}async cancel(t){let n=a(t.agentId),r=a(t.sessionId),s=`${n}:${r}`,i=this.sessions.get(s);return i?(await i.runtime.sessionCancel({sessionId:i.runtimeSessionId}),await this.closeSession(s,"cancelled"),{cancelled:!0}):{cancelled:!1}}async dispatch(t,n={}){let r=a(t.agentId),s=a(t.taskId),i=a(t.executionId);if(!r||!s)throw Object.assign(new Error("agentId and taskId are required"),{status:400,code:"BAD_REQUEST"});let o=a(t.sessionId)||`dispatch-${i||s}`,u=a(t.instructions),l=qr(t),d=De(t),{target:f}=this.targetFor(t.targetCode||t.framework),h=[{type:"text",text:["Task dispatch received.",`taskId: ${s}`,i?`executionId: ${i}`:"",u?`instructions: ${u}`:"",l?"orchaContext:":"",l,l?"Use orchaContext as the source of truth for upstream outputs, review reports, artifacts, and workflow metadata.":"","Follow the execution protocol in instructions exactly.","When embedding a generated artifact in final Markdown, use the Orcha artifact placeholder as the link target: orcha-artifact://<fieldKey>/<index>.","Example: use ![illustration](orcha-artifact://image/0) for the first generated image artifact.","Do not use local filesystem paths, file:// URLs, or data: URLs in final Markdown; Orcha replaces artifact placeholders after ingestion.",d?`For decision results, wrap the final Orcha Runtime Result JSON between ${ft} and ${Le}.`:"",d?"The result block must contain exactly one valid JSON object with output and _decision; escape Markdown newlines inside JSON strings as \\n.":"",d?"Do not put process notes inside the result block; text outside the block is ignored by Orcha.":"","Return only the final answer required by that protocol.","Do not include process notes, logs, or explanations."].filter(Boolean).join(`
15
- `)}];return this.prompt({...t,agentId:r,sessionId:o,prompt:h,metadata:Gr(t,f)},n)}async requestPermission({agent:t,runtimeSessionId:n,request:r,emitUpdate:s}){let i=dt(),u=this.runtimeSessionIndex.get(`${t.agentId}:${n}`)?.sessionId||n||dt(),l={permissionId:i,agentId:t.agentId,sessionId:u,runtimeSessionId:n,request:c(r)?r:{},status:"pending",createdAt:j()};return s?.({sessionId:n,update:{sessionUpdate:"permission_request",permission:l}}),await new Promise(d=>{let f=T(r?.timeoutMs,this.config.permissionRequestTimeoutMs),h=setTimeout(()=>{this.pendingPermissions.delete(i),d({permissionId:i,outcome:"denied",response:{reason:"permission request timed out"}})},f);this.pendingPermissions.set(i,{timer:h,resolve:d,permission:l})})}async respondPermission(t){let n=a(t.permissionId),r=this.pendingPermissions.get(n),s=a(t.outcome||"approved")||"approved";return r?(clearTimeout(r.timer),this.pendingPermissions.delete(n),r.resolve({permissionId:n,outcome:s,response:c(t.response)?t.response:{},userId:a(t.userId),metadata:c(t.metadata)?t.metadata:{}}),{accepted:!0,permissionId:n,outcome:s}):{accepted:!1,permissionId:n,outcome:s}}health(){return{status:"ok",bridgeVersion:B,startedAt:this.startedAt,agents:[...this.agents.values()].map(t=>({agentId:t.agentId,targetCode:t.targetCode,framework:t.framework,runtimeKind:t.runtimeKind})),sessions:this.sessions.size,pendingPermissions:this.pendingPermissions.size,targets:Object.keys(this.targets)}}};import rs from"node:http";import ss from"node:https";import{randomBytes as ve}from"node:crypto";var G=1,$=3,is=1e4,gt=class{constructor(t,n={}){this.url=t,this.readyState=0,this.socket=null,this.request=null,this.buffer=Buffer.alloc(0),this.listeners=new Map,this.connectTimeoutMs=os(n.connectTimeoutMs,is),this.connectTimer=null,this.connect()}addEventListener(t,n){let r=this.listeners.get(t)||new Set;r.add(n),this.listeners.set(t,r)}emit(t,n={}){let r=this.listeners.get(t);if(r)for(let s of r)s(n)}connect(){let t=new URL(this.url),n=t.protocol==="wss:"?ss:rs,r=ve(16).toString("base64"),s=n.request({protocol:t.protocol==="wss:"?"https:":"http:",hostname:t.hostname,port:t.port||(t.protocol==="wss:"?443:80),path:`${t.pathname}${t.search}`,method:"GET",headers:{Connection:"Upgrade",Upgrade:"websocket","Sec-WebSocket-Key":r,"Sec-WebSocket-Version":"13"}});this.request=s,this.startConnectTimer(s),s.on("upgrade",(i,o,u)=>{if(this.clearConnectTimer(),this.readyState===$){o.destroy();return}this.socket=o,this.readyState=G,o.on("data",l=>this.onData(l)),o.on("close",()=>this.onClose()),o.on("error",l=>{this.readyState!==$&&this.emit("error",{error:l,message:l.message,type:"error"}),this.onClose()}),u?.length&&this.onData(u),this.emit("open")}),s.on("response",i=>{this.clearConnectTimer(),this.emit("error",{message:`websocket upgrade failed: HTTP ${i.statusCode}`,type:"error"}),i.resume(),this.onClose()}),s.on("error",i=>{this.clearConnectTimer(),this.readyState!==$&&this.emit("error",{error:i,message:i.message,type:"error"}),this.onClose()}),s.end()}startConnectTimer(t){this.connectTimeoutMs<=0||(this.connectTimer=setTimeout(()=>{if(this.readyState===G||this.readyState===$)return;let n=`websocket connect timeout after ${this.connectTimeoutMs}ms`;this.emit("error",{message:n,type:"timeout"}),this.onClose(),t.destroy(new Error(n))},this.connectTimeoutMs),this.connectTimer.unref?.())}clearConnectTimer(){this.connectTimer&&(clearTimeout(this.connectTimer),this.connectTimer=null)}send(t){!this.socket||this.readyState!==G||this.socket.write(Bt(1,Buffer.from(String(t),"utf8")))}close(){if(this.readyState!==$){if(this.clearConnectTimer(),!this.socket){this.request?.destroy(),this.onClose();return}try{this.readyState===G&&this.socket.write(Bt(8,Buffer.alloc(0))),this.socket.end()}catch{this.socket.destroy()}this.onClose()}}onClose(){this.readyState!==$&&(this.clearConnectTimer(),this.readyState=$,this.request=null,this.emit("close"))}onData(t){for(this.buffer=Buffer.concat([this.buffer,t]);this.buffer.length>=2;){let n=this.buffer[0],r=this.buffer[1],s=n&15,i=(r&128)!==0,o=r&127,u=2;if(o===126){if(this.buffer.length<u+2)return;o=this.buffer.readUInt16BE(u),u+=2}else if(o===127){if(this.buffer.length<u+8)return;let f=this.buffer.readUInt32BE(u),h=this.buffer.readUInt32BE(u+4);o=f*2**32+h,u+=8}let l=u;if(i&&(u+=4),this.buffer.length<u+o)return;let d=this.buffer.subarray(u,u+o);if(i){let f=this.buffer.subarray(l,l+4);d=Buffer.from(d.map((h,m)=>h^f[m%4]))}this.buffer=this.buffer.subarray(u+o),s===1?this.emit("message",{data:d.toString("utf8")}):s===8?this.close():s===9&&this.socket?.write(Bt(10,d))}}};function os(e,t){let n=Number.parseInt(String(e??""),10);return Number.isFinite(n)&&n>=0?n:t}function Bt(e,t){let n=t.length,r=2;n>=126&&n<=65535?r+=2:n>65535&&(r+=8);let s=ve(4),i=Buffer.alloc(r+4+n);i[0]=128|e;let o=2;n<126?i[1]=128|n:n<=65535?(i[1]=254,i.writeUInt16BE(n,o),o+=2):(i[1]=255,i.writeUInt32BE(Math.floor(n/2**32),o),i.writeUInt32BE(n>>>0,o+4),o+=8),s.copy(i,o),o+=4;for(let u=0;u<n;u+=1)i[o+u]=t[u]^s[u%4];return i}function as(e){let t=new URL(e);if(t.protocol==="http:")t.protocol="ws:";else if(t.protocol==="https:")t.protocol="wss:";else if(t.protocol!=="ws:"&&t.protocol!=="wss:")throw new Error(`unsupported ORCHA_RUNTIME_ORCHA_URL protocol: ${t.protocol}`);return t.pathname=`${t.pathname.replace(/\/+$/,"")}/api/agent-runtime-bridge/ws`,t.search="",t.toString()}function cs(e){return Object.entries(e||{}).map(([t,n])=>({targetCode:t,targetName:a(n?.name||n?.targetName||t),targetType:a(n?.type||"echo"),status:"available",metadata:c(n)?n:{}}))}var Tt=class{constructor(t,n){this.config=t,this.bridge=n,this.ws=null,this.stopped=!1,this.connected=!1,this.reconnectTimer=null}start(){this.connect()}stop(){this.stopped=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.ws?.close()}connect(){if(this.stopped)return;let t=as(this.config.orchaUrl),n=new gt(t,{connectTimeoutMs:this.config.connectTimeoutMs});this.ws=n,n.addEventListener("open",()=>{if(this.ws!==n||this.stopped){n.close();return}this.authenticate(n)}),n.addEventListener("message",r=>this.handleMessage(r.data,n)),n.addEventListener("close",()=>this.scheduleReconnect("close",n)),n.addEventListener("error",r=>{p("warn","orcha-client","runtime node websocket error",{error:String(r?.message||r?.type||r)})})}authenticate(t=this.ws){this.send({type:"runtime_node.authenticate",token:this.config.nodeToken,nodeId:this.config.nodeId,nodeName:this.config.nodeName,version:B,protocolVersion:"orcha-runtime-node.v1",defaultTargetCode:this.config.defaultTargetCode,targets:cs(this.config.targets)},t)}scheduleReconnect(t,n=this.ws){n&&this.ws!==n||(this.connected=!1,n&&this.ws===n&&(this.ws=null),!this.stopped&&(this.reconnectTimer||(p("info","orcha-client","runtime node disconnected; reconnect scheduled",{reason:t,reconnectMs:this.config.reconnectMs}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},this.config.reconnectMs))))}async handleMessage(t,n=this.ws){if(n&&this.ws!==n)return;let r;try{r=JSON.parse(String(t))}catch(s){p("warn","orcha-client","invalid Orcha websocket frame",{error:String(s)});return}if(c(r)){if(r.type==="runtime_node.authenticated"){if(n&&this.ws!==n)return;this.connected=!0,p("info","orcha-client","runtime node authenticated",{nodeId:this.config.nodeId,connectionId:r.connectionId});return}if(r.type==="orcha.runtime.request"){await this.handleRequest(r);return}r.type==="runtime_node.ping"&&this.send({type:"runtime_node.pong",ts:new Date().toISOString()})}}async handleRequest(t){let n=a(t.id),r=a(t.method),s=c(t.params)?t.params:{};try{let i=await this.invoke(r,s,n);this.send({type:"orcha.runtime.response",id:n,ok:!0,result:i})}catch(i){this.send({type:"orcha.runtime.response",id:n,ok:!1,error:{code:i.code||"RUNTIME_NODE_ERROR",message:i.message||String(i)}})}}async invoke(t,n,r){if(t==="health")return this.bridge.health();if(t==="agents/create")return this.bridge.createAgent(n);if(t==="agents/dispatch")return this.bridge.dispatch(n,{onUpdate:s=>this.sendUpdate(r,s)});if(t==="sessions/prompt")return this.bridge.prompt(n,{onUpdate:s=>this.sendUpdate(r,s)});if(t==="sessions/cancel")return this.bridge.cancel(n);if(t==="permissions/respond")return this.bridge.respondPermission(n);throw Object.assign(new Error(`unsupported Orcha runtime method: ${t}`),{code:"METHOD_NOT_FOUND"})}sendUpdate(t,n){this.send({type:"orcha.runtime.event",requestId:t,eventType:"runtime.update",payload:n})}send(t,n=this.ws){return!n||n!==this.ws||n.readyState!==G?!1:(n.send(JSON.stringify(t)),!0)}};import{existsSync as us,readFileSync as ls}from"node:fs";import{resolve as Be}from"node:path";var ds=/^[A-Za-z_][A-Za-z0-9_]*$/;function ze(e=process.env,t=process.cwd()){let n=a(e.ORCHA_RUNTIME_ENV_FILE),r=n?Be(t,n):Be(t,".env");if(!us(r))return n&&p("warn","config","runtime env file not found",{path:r}),{loaded:!1,path:r,keys:[]};let s=[],i=ls(r,"utf8");for(let o of i.split(/\r?\n/)){let u=ps(o);if(!u)continue;let[l,d]=u;Object.prototype.hasOwnProperty.call(e,l)||(e[l]=d,s.push(l))}return p("info","config","runtime env file loaded",{path:r,keyCount:s.length}),{loaded:!0,path:r,keys:s}}function Ge(e=process.env){return{mode:a(e.ORCHA_RUNTIME_MODE||(e.ORCHA_RUNTIME_ORCHA_URL?"node":"server")),host:e.ORCHA_RUNTIME_BRIDGE_HOST||"127.0.0.1",port:T(e.ORCHA_RUNTIME_BRIDGE_PORT,5588),token:e.ORCHA_RUNTIME_BRIDGE_TOKEN||"",orchaUrl:a(e.ORCHA_RUNTIME_ORCHA_URL),nodeToken:e.ORCHA_RUNTIME_NODE_TOKEN||e.ORCHA_RUNTIME_BRIDGE_TOKEN||"",nodeId:a(e.ORCHA_RUNTIME_NODE_ID||e.HOSTNAME||"local-runtime-node"),nodeName:a(e.ORCHA_RUNTIME_NODE_NAME||e.ORCHA_RUNTIME_NODE_ID||e.HOSTNAME||"Local Runtime Node"),reconnectMs:T(e.ORCHA_RUNTIME_RECONNECT_MS,3e3),connectTimeoutMs:T(e.ORCHA_RUNTIME_CONNECT_TIMEOUT_MS||e.ORCHA_RUNTIME_WS_CONNECT_TIMEOUT_MS,1e4),defaultTargetCode:e.ORCHA_RUNTIME_DEFAULT_TARGET||"echo",requestLimitBytes:T(e.ORCHA_RUNTIME_REQUEST_LIMIT_BYTES,1048576),sessionPromptTimeoutMs:T(e.ORCHA_RUNTIME_SESSION_PROMPT_TIMEOUT_MS,36e5),permissionRequestTimeoutMs:T(e.ORCHA_RUNTIME_PERMISSION_TIMEOUT_MS,3e5),sessionIdleTtlMs:T(e.ORCHA_RUNTIME_SESSION_IDLE_TTL_MS,6e5),sessionCleanupIntervalMs:T(e.ORCHA_RUNTIME_SESSION_CLEANUP_INTERVAL_MS,6e4),maxSessionsPerTarget:T(e.ORCHA_RUNTIME_MAX_SESSIONS_PER_TARGET,8),openClawSessionIdleTtlMs:T(e.ORCHA_RUNTIME_OPENCLAW_SESSION_IDLE_TTL_MS,6e4),openClawMaxSessions:T(e.ORCHA_RUNTIME_OPENCLAW_MAX_SESSIONS,1),targets:fs(e.ORCHA_RUNTIME_TARGETS_JSON||"")}}function fs(e){if(!a(e))return{};try{let t=JSON.parse(e);if(c(t))return t}catch(t){p("warn","config","invalid ORCHA_RUNTIME_TARGETS_JSON",{error:String(t)})}return{}}function ps(e){let t=e.trim();if(!t||t.startsWith("#"))return null;let n=t.startsWith("export ")?t.slice(7).trimStart():t,r=n.indexOf("=");if(r<=0)return null;let s=n.slice(0,r).trim();if(!ds.test(s))return null;let i=hs(n.slice(r+1).trim());return[s,i]}function hs(e){if(!e)return"";let t=e[0];if((t==='"'||t==="'")&&e.endsWith(t)){let n=e.slice(1,-1);return t==='"'?ms(n):n}return gs(e).trim()}function ms(e){return e.replaceAll("\\n",`
16
- `).replaceAll("\\r","\r").replaceAll("\\t"," ").replaceAll('\\"','"').replaceAll("\\\\","\\")}function gs(e){let t=!1,n=!1;for(let r=0;r<e.length;r+=1){let s=e[r],i=e[r-1];if(s==="'"&&!n)t=!t;else if(s==='"'&&!t&&i!=="\\")n=!n;else if(s==="#"&&!t&&!n&&/\s/.test(i||""))return e.slice(0,r)}return e}import{createServer as Ts}from"node:http";function _t(e,t,n){let r=JSON.stringify(n);e.writeHead(t,{"content-type":"application/json; charset=utf-8","content-length":Buffer.byteLength(r)}),e.end(r)}function H(e={}){return{ok:!0,...e}}function zt(e,t,n){return{ok:!1,error:{code:e,message:t,...n===void 0?{}:{detail:n}}}}async function qe(e,t){let n=[],r=0;for await(let i of e){if(r+=i.length,r>t)throw Object.assign(new Error("request body too large"),{status:413,code:"REQUEST_TOO_LARGE"});n.push(i)}if(n.length===0)return{};let s=Buffer.concat(n).toString("utf8");if(!s.trim())return{};try{let i=JSON.parse(s);if(!c(i))throw Object.assign(new Error("JSON body must be an object"),{status:400,code:"BAD_JSON"});return i}catch(i){throw i.status?i:Object.assign(new Error(`invalid JSON body: ${i.message}`),{status:400,code:"BAD_JSON"})}}function Ke(e,t){if(!t)return;if((e.headers.authorization||"")!==`Bearer ${t}`)throw Object.assign(new Error("runtime bridge token is invalid"),{status:401,code:"UNAUTHORIZED"})}function je(e,t){let n={"GET /health":async()=>H(t.health()),"POST /agents/create":async r=>H(await t.createAgent(r)),"POST /agents/dispatch":async r=>H(await t.dispatch(r)),"POST /sessions/prompt":async r=>H(await t.prompt(r)),"POST /sessions/cancel":async r=>H(await t.cancel(r)),"POST /permissions/respond":async r=>H(await t.respondPermission(r))};return Ts(async(r,s)=>{let i=new URL(r.url||"/",`http://${r.headers.host||`${e.host}:${e.port}`}`),o=`${r.method||"GET"} ${i.pathname}`,u=n[o];if(!u){_t(s,404,zt("NOT_FOUND",`No route for ${o}`));return}try{Ke(r,e.token);let l=r.method==="GET"?{}:await qe(r,e.requestLimitBytes);_t(s,200,await u(l))}catch(l){let d=l.status||500,f=l.code||"BRIDGE_INTERNAL";_t(s,d,zt(f,l.message||String(l)))}})}var Is=xs(import.meta.url),Cs=".orcha-runtime-bridge.pid",Os=".orcha-runtime-bridge.log",As=3,Ms=36e5,{command:Us,options:nn}=Ps(process.argv.slice(2));Ls(nn);ze();var Ns=Ge();await bs(Us,Ns,nn);async function bs(e,t,n){switch(e){case"run":case"foreground":Je(t);return;case"start":if(n.foreground){Je(t);return}Ve();return;case"reload":case"restart":await Ye({quiet:!0}),Ve();return;case"stop":await Ye();return;case"status":ks();return;case"help":case"--help":case"-h":Hs();return;default:throw new Error(`Unknown command: ${e}`)}}function Je(e){Fs();let t=new mt(e);if(e.mode==="server"){let r=je(e,t);Xe({bridge:t,server:r}),r.listen(e.port,e.host,()=>{p("info","runtime-bridge","Orcha runtime bridge HTTP server started",{host:e.host,port:e.port,targets:Object.keys(t.targets)})});return}if(!e.orchaUrl)throw new Error("ORCHA_RUNTIME_ORCHA_URL is required in runtime node mode");let n=new Tt(e,t);Xe({bridge:t,client:n}),n.start(),p("info","runtime-bridge","Orcha runtime node started",{nodeId:e.nodeId,nodeName:e.nodeName,orchaUrl:e.orchaUrl,targets:Object.keys(t.targets)})}function Xe({bridge:e,client:t,server:n}){let r=!1,s=i=>{if(r)return;r=!0;let o=Number(e?.sessions?.size||0)>0;p("info","runtime-bridge","runtime bridge shutting down",{signal:i});try{t?.stop?.()}catch(u){p("warn","runtime-bridge","runtime client stop failed",{error:String(u)})}Promise.resolve(e?.stop?.(`process_${String(i||"shutdown").toLowerCase()}`)).catch(u=>{p("warn","runtime-bridge","runtime bridge stop failed",{error:String(u)})}).finally(()=>{try{n?.close?.()}catch(u){p("warn","runtime-bridge","runtime server close failed",{error:String(u)})}}),setTimeout(()=>process.exit(0),o?8500:200)};process.once("SIGTERM",()=>s("SIGTERM")),process.once("SIGINT",()=>s("SIGINT"))}function Ve(){let e=Wt(),t=rn(),n=Jt(e);if(n&&q(n)){console.log(JSON.stringify({status:"already_running",pid:n,pidFile:e,logFile:t}));return}n&&Kt(e),Qe(e),Qe(t),qt(t);let r=ws(t,"a"),s={...process.env,ORCHA_RUNTIME_PID_FILE:e,ORCHA_RUNTIME_LOG_FILE:t},i=_s(process.execPath,[Is,"run"],{cwd:process.cwd(),detached:!0,env:s,stdio:["ignore",r,r]});i.unref(),ys(r),en(e,`${i.pid}
17
- `),console.log(JSON.stringify({status:"started",pid:i.pid,pidFile:e,logFile:t}))}async function Ye({quiet:e=!1}={}){let t=Wt(),n=Jt(t);if(!n){e||console.log(JSON.stringify({status:"not_running",pidFile:t}));return}if(!q(n)){Kt(t),e||console.log(JSON.stringify({status:"not_running",pid:n,pidFile:t}));return}process.kill(n,"SIGTERM"),!await Ze(n,1e4)&&q(n)&&(process.kill(n,"SIGKILL"),await Ze(n,3e3)),Kt(t),e||console.log(JSON.stringify({status:"stopped",pid:n,pidFile:t}))}function ks(){let e=Wt(),t=rn(),n=Jt(e),r=!!(n&&q(n));console.log(JSON.stringify({status:r?"running":"not_running",running:r,pid:r?n:null,pidFile:e,logFile:t}))}function Ps(e){let t=[],n={};for(let s=0;s<e.length;s+=1){let i=e[s];i==="--daemon"?n.daemon=!0:i==="--foreground"?n.foreground=!0:i==="--env-file"?n.envFile=e[++s]:i==="--pid-file"?n.pidFile=e[++s]:i==="--log-file"?n.logFile=e[++s]:t.push(i)}return{command:t[0]||"run",options:n}}function Ls(e){e.envFile&&(process.env.ORCHA_RUNTIME_ENV_FILE=e.envFile),e.pidFile&&(process.env.ORCHA_RUNTIME_PID_FILE=e.pidFile),e.logFile&&(process.env.ORCHA_RUNTIME_LOG_FILE=e.logFile)}function Wt(){return jt(process.cwd(),process.env.ORCHA_RUNTIME_PID_FILE||Cs)}function rn(){return jt(process.cwd(),process.env.ORCHA_RUNTIME_LOG_FILE||Os)}function Fs(){let e=process.env.ORCHA_RUNTIME_LOG_FILE;if(!e)return;let t=sn();if(t<=0)return;let n=jt(process.cwd(),e);qt(n,t);let r=$s();r<=0||setInterval(()=>qt(n,t),r).unref()}function qt(e,t=sn()){if(t<=0||!tn(e))return;let n=0,r="";try{if(n=We(e).size,n<=0)return;r=Gt(e,"utf8")}catch(d){p("warn","runtime-bridge","runtime log cleanup skipped",{logFile:e,error:String(d)});return}let s=Date.now()-t*24*60*60*1e3,i=r.split(/\r?\n/),o=[],u=0;for(let d of i)d&&(Ds(d,s)?o.push(d):u+=1);if(u===0)return;let l="";try{We(e).size>n&&(l=Gt(e,"utf8").slice(r.length));let f=[...o,...l.split(/\r?\n/).filter(Boolean)].join(`
18
- `);en(e,f?`${f}
19
- `:""),p("info","runtime-bridge","runtime log cleanup completed",{logFile:e,retentionDays:t,removed:u})}catch(d){p("warn","runtime-bridge","runtime log cleanup failed",{logFile:e,error:String(d)})}}function Ds(e,t){try{let n=JSON.parse(e);if(!n||typeof n!="object")return!0;let r=typeof n.ts=="string"?Date.parse(n.ts):Number.NaN;return!Number.isFinite(r)||r>=t}catch{return!0}}function sn(){return on(process.env.ORCHA_RUNTIME_LOG_RETENTION_DAYS,As)}function $s(){return on(process.env.ORCHA_RUNTIME_LOG_CLEANUP_INTERVAL_MS,Ms)}function on(e,t){let n=Number.parseInt(String(e??""),10);return Number.isFinite(n)&&n>=0?n:t}function Jt(e){if(!tn(e))return null;let t=Number.parseInt(Gt(e,"utf8").trim(),10);return Number.isInteger(t)&&t>0?t:null}function q(e){try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}async function Ze(e,t){let n=Date.now();for(;Date.now()-n<t;){if(!q(e))return!0;await new Promise(r=>setTimeout(r,100))}return!q(e)}function Qe(e){Ss(Es(e),{recursive:!0})}function Kt(e){try{Rs(e,{force:!0})}catch{}}function Hs(){console.log(`Usage: orcha-runtime-bridge [command] [options]
10
+ ${s}`:s;Ne(t,n,r,d,s)&&(o=1,u=1)}return s&&i&&(t.finalTextSeen=!0),Ce(t,Oe(e,t.artifactOptions)),(Ur(e)||i)&&r({sessionId:n,update:{sessionUpdate:"runtime_event",event:Ae(e)}}),{textCount:o,finalTextCount:u,thoughtCount:l}}function At(e,t,n,r,s=Date.now()){if(!t)return{artifactCount:0,transcriptCount:0,textCount:0,finalTextCount:0,thoughtCount:0};let i=e.artifacts.size,o=0,u=0,l=0,d=0,f=Mr(t,n,s);if(f){let h=Math.min(t.processedLines.get(f.path)||0,f.events.length),g=e.artifacts.size;for(let m of f.events.slice(h)){let y=br(m,e,n,r);u+=y.textCount,l+=y.finalTextCount,d+=y.thoughtCount}t.processedLines.set(f.path,f.events.length),(f.events.length>h||e.artifacts.size>g)&&(o=1)}return{artifactCount:e.artifacts.size-i,transcriptCount:o,textCount:u,finalTextCount:l,thoughtCount:d}}function kr(e,{remove:t=!0}={}){if(!e||!Se(e))return"";try{return we(e,"utf8").trim()}catch{return""}finally{t&&ct(e)}}function ct(e){if(e)try{Zn(e)}catch{}}function Pr(e,t){return{artifactCount:(e?.artifactCount||0)+(t?.artifactCount||0),transcriptCount:(e?.transcriptCount||0)+(t?.transcriptCount||0),textCount:(e?.textCount||0)+(t?.textCount||0),finalTextCount:(e?.finalTextCount||0)+(t?.finalTextCount||0),thoughtCount:(e?.thoughtCount||0)+(t?.thoughtCount||0)}}function Lr(e){return new Promise(t=>setTimeout(t,e))}function Dr(e,t,n,r){return r?(e.finalTextSeen=!0,e.emittedTexts.has(r)||(e.emittedTexts.add(r),n({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:r}}})),!0):!1}async function Fr(e,t,n,r,s,i){let o=At(e,t,n,r,Date.now()),u=()=>Dr(e,n,r,kr(s,{remove:!1}));if(u()||e.finalTextSeen)return ct(s),o;let l=dr(i);if(l<=0||!t&&!s)return ct(s),o;let d=Date.now()+l,f=Math.min(Me(i),100);for(;!e.finalTextSeen&&Date.now()<d&&(await Lr(Math.min(f,Math.max(0,d-Date.now()))),o=Pr(o,At(e,t,n,r,Date.now())),!u()););return ct(s),o}var dt=class{constructor(t,n,r={}){this.agent=t,this.target=n,this.options=r,this.active=new Map}async sessionNew(){return{sessionId:`cli-${this.agent.agentId}-${X()}`}}async sessionPrompt(t,n){let r=Date.now(),s=c(this.target.command);if(!s)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);let i=c(t.sessionId)||X(),o=tt(t.prompt),u=c(this.target.promptMode||"stdin"),l=this.buildArgs(u,o),d=c(this.target.cwd)||this.agent.workspace||process.cwd(),f=Tr(this.target,i),h=f.root,g=Sr(this.target,h),m=lr(s,this.target),y={...this.target,targetCode:this.agent.targetCode,cwd:d},U=m?Er(y,r):new Set,I=ur(s,l,this.target)?M(Ee(),`orcha-runtime-last-message-${X()}.txt`):"";I&&l.push("--output-last-message",I);let A=T(this.target.timeoutMs||this.target.sessionPromptTimeoutMs,T(this.options.sessionPromptTimeoutMs,er)),b={...process.env,...a(this.target.env)?this.target.env:{},...u==="env"?{ORCHA_RUNTIME_PROMPT:o}:{},ORCHA_AGENT_ID:this.agent.agentId,ORCHA_SESSION_ID:i,ORCHA_RUNTIME_ARTIFACT_DIR:h},_=Jn(s,l,{cwd:d,env:b,stdio:["pipe","pipe","pipe"]});this.active.set(i,_),p("info","runtime.cli","runtime prompt started",{target:this.agent.targetCode,sessionId:i,pid:_.pid,timeoutMs:A});let Qt="",Tt=c(this.target.outputMode||"text"),k={artifacts:new Map,emittedTexts:new Set,emittedThoughtTexts:new Set,value:"",artifactOptions:g,finalTextSeen:!1,finalTextOnly:mr(t,this.target),emitThoughtChunks:pr(t,this.target)},yt=m?_r(y,o,r,U):null;return _.stdout.setEncoding("utf8"),_.stdout.on("data",B=>this.handleStdout(B,Tt,k,i,n)),_.stderr.setEncoding("utf8"),_.stderr.on("data",B=>{Qt+=B,this.target.emitStderr===!0&&n({sessionId:i,update:{sessionUpdate:"runtime_stderr_chunk",content:{type:"text",text:B}}})}),u==="stdin"?_.stdin.end(o):_.stdin.end(),await new Promise((B,yn)=>{let Z=!1,te=!1,F=null,St=yt&&fr(this.target,t)?setInterval(()=>{try{At(k,yt,i,n)}catch(R){p("warn","runtime.cli","codex transcript stream poll failed",{target:this.agent.targetCode,sessionId:i,error:String(R?.message||R)})}},Me(this.target)):null;St?.unref?.();let ee=setTimeout(()=>{te=!0,p("warn","runtime.cli","runtime prompt timed out; terminating child",{target:this.agent.targetCode,sessionId:i,pid:_.pid,timeoutMs:A}),at(_,"SIGTERM"),F=setTimeout(()=>{p("warn","runtime.cli","runtime prompt force killing child",{target:this.agent.targetCode,sessionId:i,pid:_.pid}),at(_,"SIGKILL")},nr),F.unref?.(),Rt(Object.assign(new Error(`runtime CLI timed out after ${A}ms`),{code:"RUNTIME_CLI_TIMEOUT"}))},A);ee.unref?.();let ne=()=>{clearTimeout(ee),St&&clearInterval(St),F&&!te&&clearTimeout(F),yr(f,{target:this.agent.targetCode,sessionId:i}),this.active.delete(i)},Sn=R=>{Z||(Z=!0,ne(),B(R))},Rt=R=>{Z||(Z=!0,ne(),yn(R))};_.on("error",R=>{p("warn","runtime.cli","runtime child error",{target:this.agent.targetCode,sessionId:i,pid:_.pid,error:String(R?.message||R)}),Rt(R)}),_.on("exit",(R,re)=>{(async()=>{F&&(clearTimeout(F),F=null),Tt==="json-lines"&&k.value.trim()&&this.handleStdout(`
11
+ `,Tt,k,i,n);let P=await Fr(k,yt,i,n,I,this.target);(P.artifactCount>0||P.textCount>0||P.thoughtCount>0)&&p("info","runtime.cli","codex transcript updates collected",{target:this.agent.targetCode,sessionId:i,artifactCount:P.artifactCount,textCount:P.textCount,finalTextCount:P.finalTextCount,thoughtCount:P.thoughtCount,transcriptCount:P.transcriptCount});let Q=Qt.trim();Q&&p("debug","runtime.cli","runtime stderr",{target:this.agent.targetCode,sessionId:i,stderr:Q}),p("info","runtime.cli","runtime prompt finished",{target:this.agent.targetCode,sessionId:i,pid:_.pid,exitCode:R,signal:re,artifactCount:k.artifacts.size,finalTextSeen:k.finalTextSeen}),Sn({stopReason:R===0?"end_turn":"error",exitCode:R,signal:re,_artifacts:[...k.artifacts.values()],...Q?{stderr:Q}:{}})})().catch(Rt)})})}buildArgs(t,n){let r=x(this.target.args);return t==="args"?[...r,n]:r}handleStdout(t,n,r,s,i){if(n!=="json-lines"){i({sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:t}}});return}r.value+=t;let o=r.value.split(/\r?\n/);r.value=o.pop()||"";for(let u of o){let l=u.trim();if(l)try{let d=JSON.parse(l);Ce(r,Oe(d,r.artifactOptions)),i({sessionId:s,update:{sessionUpdate:"runtime_event",event:Ae(d)}});let f=Ie(d),h=Mt(d);f&&r.emitThoughtChunks&&!h&&cr(d)?Ue(r,s,i,f):f&&gr(r,h)&&Ne(r,s,i,f),f&&h&&(r.finalTextSeen=!0)}catch{i({sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`${u}
12
+ `}}})}}}async sessionCancel(t){let n=c(t.sessionId),r=this.active.get(n);return r?(p("info","runtime.cli","cancelling runtime child",{target:this.agent.targetCode,sessionId:n,pid:r.pid}),at(r,"SIGTERM"),this.active.delete(n),{ok:!0,cancelled:!0}):{ok:!0,cancelled:!1}}stop(t="stop"){for(let[n,r]of this.active.entries())p("info","runtime.cli","stopping runtime child",{target:this.agent.targetCode,sessionId:n,pid:r.pid,reason:t}),at(r,"SIGTERM");this.active.clear()}};var Ut="ORCHA_RUNTIME_OUTPUT_START",bt="ORCHA_RUNTIME_OUTPUT_END",kt="ORCHA_RUNTIME_CONTROL_START",Pt="ORCHA_RUNTIME_CONTROL_END",Fe=Ut,$e=bt,He=kt,ve=Pt,Lt=[Ut,bt,kt,Pt],$r=new Set(["_artifacts","_decision","_meta"]),Hr=new RegExp(`(?:^|(?<=[\\r\\n]))[ \\t]*(?<marker>${Lt.join("|")})[ \\t]*(?=\\r\\n?|\\n|$)`,"g"),O=class extends Error{constructor(t,n){super(n),this.name="RuntimeResultProtocolError",this.code=t}};function Be(e){let t=typeof e=="string"?e.trimStart():"";return Lt.some(n=>t.startsWith(n))}function Ke(e){if(typeof e!="string")return null;let t=e,n=vr(t);if(![...n.values()].some(m=>m.length>0))return null;let r=[],s=[];for(let[m,y]of n)y.length===0?r.push(m):y.length>1&&s.push(m);if(r.length>0||s.length>0){let m=[];throw r.length>0&&m.push(`\u7F3A\u5C11 ${r.join(", ")}`),s.length>0&&m.push(`\u91CD\u590D ${s.join(", ")}`),new O("invalid_markers",`Runtime Result \u534F\u8BAE\u6807\u8BB0\u4E0D\u5B8C\u6574\uFF1A${m.join("\uFF1B")}`)}let i=n.get(Ut)[0],o=n.get(bt)[0],u=n.get(kt)[0],l=n.get(Pt)[0];if(!(i.end<=o.start&&o.end<=u.start&&u.end<=l.start))throw new O("invalid_marker_order","Runtime Result \u534F\u8BAE\u6807\u8BB0\u987A\u5E8F\u9519\u8BEF\uFF1A\u5FC5\u987B\u5148\u8F93\u51FA OUTPUT \u5757\uFF0C\u518D\u8F93\u51FA CONTROL \u5757");let d=Br(t.slice(i.end,o.start));if(!d.trim())throw new O("empty_output","Runtime Result OUTPUT \u5757\u4E0D\u80FD\u4E3A\u7A7A");let f=t.slice(u.end,l.start).trim();if(!f)throw new O("empty_control","Runtime Result CONTROL \u5757\u4E0D\u80FD\u4E3A\u7A7A");let h;try{h=JSON.parse(f)}catch(m){throw new O("invalid_control_json",`Runtime Result CONTROL \u5757\u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${String(m?.message||m)}`)}if(!De(h))throw new O("invalid_control_type","Runtime Result CONTROL \u5757\u5FC5\u987B\u662F JSON \u5BF9\u8C61");let g=Object.keys(h).filter(m=>!$r.has(m)).sort();if(g.length>0)throw new O("invalid_control_keys",`Runtime Result CONTROL \u5757\u5305\u542B\u975E\u6807\u51C6\u5B57\u6BB5\uFF1A${g.join(", ")}`);if("_artifacts"in h&&!Array.isArray(h._artifacts))throw new O("invalid_control_field_type","Runtime Result CONTROL \u5757\u7684 _artifacts \u5FC5\u987B\u662F JSON \u6570\u7EC4");for(let m of["_decision","_meta"])if(m in h&&!De(h[m]))throw new O("invalid_control_field_type",`Runtime Result CONTROL \u5757\u7684 ${m} \u5FC5\u987B\u662F JSON \u5BF9\u8C61`);return{output:d,...h}}function vr(e){let t=new Map(Lt.map(n=>[n,[]]));for(let n of e.matchAll(Hr))t.get(n.groups.marker).push({start:n.index,end:n.index+n[0].length});return t}function Br(e){let t=e.match(/^(?:\r\n|\r|\n)/)?.[0]||"",n=t?e.slice(t.length):e;return t&&n.endsWith(t)?n.slice(0,-t.length):n}function De(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}var Dt=24e3,Ft=8,$t=50,Ht=6e3,Kr=new Set(["fail","failed","failure","error","errored","timeout","timed_out","cancelled","canceled","aborted"]),zr=10*60*1e3,jr=60*1e3,Gr=8,qr=60*1e3,Jr=1,Wr=new Set(["agentId","taskId","executionId","sessionId","nodeId","targetCode","framework","workspace","instructions","runtimeMaxSessions"]),Xr=/(^|[_-])(token|secret|password|authorization|api[-_]?key|private[-_]?key|credential|cookie|jwt|access[-_]?token|refresh[-_]?token|service[-_]?token|execution[-_]?token)([_-]|$)/i;function Vr(e,t,n){let r=a(e?._meta)?e._meta:{};return{...a(e)?e:{},sessionId:t,update:a(e?.update)?e.update:{},_meta:{...r,orchaAgentId:n.agentId,runtimeSessionId:n.runtimeSessionId,bridgeUpdateId:ft()}}}function E(e){return e==null||e===""?!1:typeof e=="string"?c(e)!=="":Array.isArray(e)?e.length>0:a(e)?Object.keys(e).length>0:!0}function We(e){let t=c(e).toLowerCase().replace(/[.。!!]+$/g,"").replace(/[\s-]+/g,"_");return Kr.has(t)}function $(e,t){let n=T(e,t);return Number.isFinite(n)&&n>0?n:t}function Bt(e){let t=T(e,null);return Number.isFinite(t)&&t>0?t:null}function Y(e,t=!1){if(typeof e=="boolean")return e;let n=c(e).toLowerCase();return["true","1","yes","y","on"].includes(n)?!0:["false","0","no","n","off"].includes(n)?!1:t}function D(e){return c(e?.type||"echo")}function Yr(e){let t=D(e);return t==="acp"||t==="stdio-acp"||t==="openclaw"}function Kt(e){if(a(e)){if(Object.prototype.hasOwnProperty.call(e,"releaseAfterPrompt"))return e.releaseAfterPrompt;if(Object.prototype.hasOwnProperty.call(e,"disposeAfterPrompt"))return e.disposeAfterPrompt}}function Zr(e){let t=String(e||"");if(Xr.test(t))return!0;let n=t.replace(/[^a-z0-9]/gi,"").toLowerCase();return n.endsWith("token")||n.endsWith("secret")||n.endsWith("password")||n.endsWith("apikey")||n.endsWith("privatekey")||n==="authorization"||n==="cookie"||n==="jwt"||n.includes("credential")}function zt(e,t=0){if(e==null||typeof e=="number"||typeof e=="boolean")return e;if(typeof e=="string"){if(e.length<=Ht)return e;let n=e.length-Ht;return`${e.slice(0,Ht)}... [truncated ${n} characters]`}if(t>=Ft)return Array.isArray(e)?`[array truncated at depth ${Ft}, items=${e.length}]`:a(e)?`[object truncated at depth ${Ft}, keys=${Object.keys(e).length}]`:String(e);if(Array.isArray(e)){let n=e.slice(0,$t).map(r=>zt(r,t+1));return e.length>$t&&n.push(`[truncated ${e.length-$t} items]`),n}if(a(e)){let n={};for(let[r,s]of Object.entries(e))n[r]=Zr(r)?"[REDACTED]":zt(s,t+1);return n}return String(e)}var Qr=new Set(["type","executionId","taskId","task","traceId","requestId","agentCode","stage","phase","nodeId","nodeType","capabilityCode","operationCode","outputType","artifactType","input","inputs","rejection","previous","artifactRefs","outputSchema","executionPolicy","resultContract"]);function ts(e){if(!a(e))return e;let t={};for(let n of Qr)E(e[n])&&(t[n]=e[n]);return t}function es(e){if(!a(e))return e;let t={...e};return a(t.renderedPayload)&&(t.renderedPayload=ts(t.renderedPayload)),t}function ns(e){let t=a(e)?e:{},n={};E(t.metadata)&&(n.metadata=es(t.metadata));for(let[r,s]of Object.entries(t))Wr.has(r)||r==="metadata"||E(s)&&(n[r]=s);return n}function rs(e){let t=a(e)?e:{},n=a(t.metadata)?t.metadata:{},r=a(n.renderedPayload)?n.renderedPayload:{};return a(t.resultContract)?t.resultContract:a(r.resultContract)?r.resultContract:{}}function Xe(e){return c(rs(e).kind).toLowerCase()==="decision"}function ze(e){let t=a(e)?e:{},n=a(t.metadata)?t.metadata:{};return Bt(t.runtimeMaxSessions??n.runtimeMaxSessions)}function ss(e){return e?.dispatchFinalTextOnly===!0||e?.dispatchFinalOutputOnly===!0?!0:e?.dispatchFinalTextOnly===!1||e?.dispatchFinalOutputOnly===!1?!1:D(e)==="cli"}function je(e){let t=e?.dispatchReleaseAfterPrompt??e?.dispatchDisposeAfterPrompt;return Y(t,Yr(e))}function is(e,t){let n=a(e?.metadata)?{...e.metadata}:{},r=a(n._runtimeBridge)?{...n._runtimeBridge}:{},s=Kt(r);return n._runtimeBridge={...r,promptKind:"dispatch",finalTextOnly:ss(t),releaseAfterPrompt:s===void 0?je(t):Y(s,je(t)),requiresRuntimeResult:Xe(e)},n}function os(e){let t=ns(e);if(!E(t))return"";let n=JSON.stringify(zt(t),null,2);if(n.length<=Dt)return n;let r=n.length-Dt;return`${n.slice(0,Dt)}
13
+ ... [truncated ${r} characters]`}function Ve(e){if(!a(e))return"";let t=a(e.update)?e.update:e,r=(a(t.content)?t.content:{}).text??t.text;return r==null?"":String(r)}function as(e){if(!a(e))return"";let t=a(e.update)?e.update:e;return c(t.sessionUpdate)}function cs(e){if(!Array.isArray(e))return"";let t=!1,n=[],r=[],s=[],i=()=>{n.length>0&&(r.push(n),n=[])};for(let u of e){let l=as(u),d=Ve(u);if(!l){d&&s.push(d);continue}if(t=!0,l==="agent_message_chunk"){d&&n.push(d);continue}(l==="agent_thought_chunk"||l==="user_message_chunk"||l==="tool_call"||l==="tool_call_update"||l==="plan")&&i()}if(i(),!t)return jt(s);let o=r[r.length-1]||[];return jt(o)}function us(e){return Array.isArray(e)?e.map(Ve).filter(t=>c(t)):[]}function ls(e){if(!a(e))return null;let t=a(e.update)?e.update:e;return c(t.sessionUpdate)!=="runtime_event"?null:a(t.event)?t.event:null}function ds(e){if(!a(e))return"";let t=a(e.payload)?e.payload:{},n=c(e.type),r=c(t.type);if(n==="event_msg"){if(r==="task_complete")return c(t.last_agent_message||t.message||t.output);if(r==="agent_message"){let s=c(t.phase||t.status||t.stage).toLowerCase();if(["final_answer","final","complete","completed","done"].includes(s))return c(t.message||t.text||t.content)}}return""}function fs(e){if(!Array.isArray(e))return"";for(let t=e.length-1;t>=0;t-=1){let n=ds(ls(e[t]));if(n)return n}return""}function jt(e){let t="";for(let n of e){let r=String(n||"");if(r){if(!t)t=r;else if(r.startsWith(t))t=r;else if(!t.endsWith(r)){let s=Be(r)&&!/[\r\n]$/.test(t)?`
14
+ `:"";t+=`${s}${r}`}}}return t.trim()}function ps(e){let t=String(e||"").trim();if(!t)return"";let n=t.match(/(?:^|\n)#{1,3}\s+\S/);return!n||n.index===0?t:t.slice(n.index+(t[n.index]===`
15
+ `?1:0)).trim()}function Ge(e){let t=String(e||"").trim();if(!t)return null;try{let n=JSON.parse(t);if(a(n)&&(Ye(n)||E(n._artifacts)||E(n.artifacts)||E(n._decision)||E(n._meta)))return n}catch{}return null}function pt(e){try{return Ke(e)}catch{return null}}function qe(e){let t=String(e||"").trim();if(!t)return null;let n=pt(t);if(n)return n;let r=[...t.matchAll(/```(?:json)?\s*([\s\S]*?)```/gi)];for(let s=r.length-1;s>=0;s-=1){let i=Ge(r[s][1]);if(i)return i}if(!t.endsWith("}"))return null;for(let s=t.lastIndexOf("{");s>=0;s=t.lastIndexOf("{",s-1)){let i=Ge(t.slice(s));if(i)return i}return null}function hs(e){let t=us(e);for(let n=t.length-1;n>=0;n-=1){let r=pt(t[n]);if(r)return r}return pt(jt(t))}function Ye(e){if(!a(e))return!1;if(E(e.output))return!0;for(let t of["content","text","message","summary"])if(c(e[t]))return!0;return!!(We(e.status)||c(e.error)||c(e.errorMessage))}function N(e){let t=a(e)?{...e}:{};return(!Array.isArray(t._artifacts)||t._artifacts.length===0)&&Array.isArray(t.artifacts)&&t.artifacts.length>0&&(t._artifacts=t.artifacts),delete t.artifacts,t}function ms(e){return a(e)?typeof(a(e._decision)?e._decision:a(e.decision)?e.decision:e).passed=="boolean":!1}function gs(e){return a(e)?a(e._decision)&&typeof e._decision.passed=="boolean"?!0:ms(e.output):!1}function vt(e,t,n){let r=a(e)?{...e}:{};if(!E(r.output)){for(let s of["summary","message","content","text"])if(c(r[s])){r.output=c(r[s]);break}}return!E(r.output)&&c(n)&&(r.output=c(n)),{...r,_meta:{...a(r._meta)?r._meta:{},runtimeOutputSource:t,requiredRuntimeResult:!0,finalMessagePreview:c(n).slice(0,1e3)}}}var _s=["dataUrl","dataURL","contentDataUrl","contentDataURL","contentBase64","base64","data"];function Je(e){if(!a(e))return"";let t=a(e.content)?e.content:{},n=a(e.metadata)?e.metadata:{};return c(e.fieldKey||e.field_key||t.fieldKey||n.fieldKey)}function Ts(e,t){let n=a(e.content)?e.content:{},r=a(t.content)?t.content:{},s={...e,...t,content:{...n,...r},metadata:{...a(e.metadata)?e.metadata:{},...a(t.metadata)?t.metadata:{}}};for(let i of _s)E(e[i])&&(s[i]=e[i]),E(n[i])&&(s.content[i]=n[i]);return s}function ys(e,t){let n=Array.isArray(e)?e.filter(a):[],r=Array.isArray(t)?t.filter(a):[];if(!n.length)return r;if(!r.length)return n;let s=[...n],i=new Map;for(let u=0;u<n.length;u+=1){let l=Je(n[u]),d=i.get(l)||[];d.push(u),i.set(l,d)}let o=new Map;for(let u of r){let l=Je(u),d=o.get(l)||0;o.set(l,d+1);let f=i.get(l)?.[d];f===void 0?s.push(u):s[f]=Ts(s[f],u)}return s}function L(e,t,n){let r={...e,...t,_meta:{...a(e._meta)?e._meta:{},...a(t._meta)?t._meta:{},runtimeOutputSource:n}};return(Array.isArray(e._artifacts)||Array.isArray(t._artifacts))&&(r._artifacts=ys(e._artifacts,t._artifacts)),r}function Ss(e,t,n={}){let r=c(n.promptKind),s=n.requiresRuntimeResult===!0,i=s||r==="dispatch",o=N(e),u=typeof o.output=="string"?pt(o.output):null;if(u)return L(o,N(u),"result_block");let l=fs(t),d=l?qe(l):null,f=i?hs(t):null;if(Ye(o))return We(o.status)||c(o.error)||c(o.errorMessage)?o:r==="dispatch"&&d?L(o,N(d),"final_event"):r==="dispatch"&&f?L(o,N(f),"updates"):!s||gs(o)?o:d?L(o,N(d),"final_event"):f?L(o,N(f),"updates"):vt(o,"result",o.output);if(d)return L(o,N(d),"final_event");if(f)return L(o,N(f),"updates");if(l)return s?vt(o,"final_event",l):{...o,output:l,_meta:{...a(o._meta)?o._meta:{},runtimeOutputSource:"final_event"}};let h=ps(cs(t));if(!h)return o;let g=qe(h);return g?L(o,N(g),"updates"):s?vt(o,"updates",h):{...o,output:h,_meta:{...a(o._meta)?o._meta:{},runtimeOutputSource:"updates"}}}var ht=class{constructor(t){this.config=t,this.targets=t.targets||{},this.agents=new Map,this.sessions=new Map,this.runtimeSessionIndex=new Map,this.pendingPermissions=new Map,this.startedAt=J(),this.cleanupTimer=null,this.startSessionCleanup()}targetFor(t){let n=c(t)||this.config.defaultTargetCode,r=this.targets[n];if(!n||!a(r)){let s=new Error(`runtime target is not configured: ${n||"<empty>"}`);throw s.code="RUNTIME_TARGET_NOT_FOUND",s}return{code:n,target:r}}targetIdleTtlMs(t){let r=D(t)==="openclaw"?$(this.config.openClawSessionIdleTtlMs,qr):$(this.config.sessionIdleTtlMs,zr);return $(t?.sessionIdleTtlMs??t?.idleTtlMs,r)}targetMaxSessions(t,n=null){let s=D(t)==="openclaw"?$(this.config.openClawMaxSessions,Jr):$(this.config.maxSessionsPerTarget,Gr),i=$(t?.maxSessions,s),o=Bt(n);return o?Math.max(i,o):i}targetReleaseAfterPrompt(t,n={}){let r=D(t),s=a(n?._runtimeBridge)?n._runtimeBridge:{},i=Kt(s);return i!==void 0?Y(i,!1):Y(t?.releaseAfterPrompt??t?.disposeAfterPrompt,r==="openclaw")}promptReleaseAfterPrompt(t,n={}){let r=a(n?._runtimeBridge)?n._runtimeBridge:{},s=Kt(r);return s!==void 0?Y(s,t.releaseAfterPrompt):t.releaseAfterPrompt}startSessionCleanup(){let t=$(this.config.sessionCleanupIntervalMs,jr);t<=0||(this.cleanupTimer=setInterval(()=>{this.cleanupExpiredSessions().catch(n=>{p("warn","runtime-bridge","runtime session cleanup failed",{error:String(n)})})},t),this.cleanupTimer.unref?.())}sessionCountForTarget(t){let n=0;for(let r of this.sessions.values())r.targetCode===t&&(n+=1);return n}sessionCountForAgentTarget(t,n){let r=0;for(let s of this.sessions.values())s.agentId===t&&s.targetCode===n&&(r+=1);return r}idleTargetSessions(t){return[...this.sessions.entries()].filter(([,n])=>n.targetCode===t&&!n.busy).sort((n,r)=>(n[1].lastUsedAtMs||0)-(r[1].lastUsedAtMs||0))}idleAgentTargetSessions(t,n){return[...this.sessions.entries()].filter(([,r])=>r.agentId===t&&r.targetCode===n&&!r.busy).sort((r,s)=>(r[1].lastUsedAtMs||0)-(s[1].lastUsedAtMs||0))}async closeSession(t,n="session_closed"){let r=this.sessions.get(t);if(!r)return!1;try{await r.runtime?.stop?.(n)}catch(s){p("warn","runtime-bridge","runtime session stop failed",{sessionId:r.sessionId,runtimeSessionId:r.runtimeSessionId,targetCode:r.targetCode,runtimeKind:r.runtimeKind,error:String(s)})}return this.sessions.delete(t),this.runtimeSessionIndex.delete(`${r.agentId}:${r.runtimeSessionId}`),p("info","runtime-bridge","runtime session closed",{sessionId:r.sessionId,runtimeSessionId:r.runtimeSessionId,targetCode:r.targetCode,runtimeKind:r.runtimeKind,reason:n}),!0}async closeAllSessions(t="bridge_shutdown"){for(let n of[...this.sessions.keys()])await this.closeSession(n,t)}async stop(t="bridge_stop"){this.cleanupTimer&&clearInterval(this.cleanupTimer),this.cleanupTimer=null,await this.closeAllSessions(t)}async cleanupExpiredSessions(t=Date.now()){for(let[n,r]of[...this.sessions.entries()])r.busy||t-(r.lastUsedAtMs||r.createdAtMs||t)>r.idleTtlMs&&await this.closeSession(n,"idle_timeout")}async reserveTargetSlot(t,n,r={}){let s=c(r.agentId),i=Bt(r.runtimeMaxSessions);if(s&&i)for(;this.sessionCountForAgentTarget(s,t)>=i;){let u=this.idleAgentTargetSessions(s,t);if(!u.length){let l=new Error(`runtime agent session limit reached: ${s}`);throw l.code="RUNTIME_AGENT_SESSION_LIMIT",l}await this.closeSession(u[0][0],"agent_session_limit")}let o=this.targetMaxSessions(n,i);for(;this.sessionCountForTarget(t)>=o;){let u=this.idleTargetSessions(t);if(!u.length){let l=new Error(`runtime target session limit reached: ${t}`);throw l.code="RUNTIME_TARGET_SESSION_LIMIT",l}await this.closeSession(u[0][0],"target_session_limit")}}async createAgent(t){let n=c(t.agentId);if(!n)throw Object.assign(new Error("agentId is required"),{status:400,code:"BAD_REQUEST"});let{code:r,target:s}=this.targetFor(t.targetCode||t.framework),i={agentId:n,targetCode:r,framework:c(t.framework||r),workspace:c(t.workspace),metadata:a(t.metadata)?t.metadata:{},createdAt:J(),runtimeKind:D(s),runtimeMaxSessions:ze(t)};return this.agents.set(n,i),{agent:i}}runtimeFor(t,n){let{target:r}=this.targetFor(t.targetCode),s=D(r),i={onPermissionRequest:u=>this.requestPermission(u)},o={sessionPromptTimeoutMs:this.config.sessionPromptTimeoutMs};return s==="stdio-acp"||s==="acp"?new z(t,r,i,o):s==="openclaw"?new it(t,r,n,i,o):s==="cli"?new dt(t,r,o):new et(t)}async prompt(t,n={}){let r=c(t.agentId),s=c(t.sessionId)||ft();if(!r)throw Object.assign(new Error("agentId is required"),{status:400,code:"BAD_REQUEST"});let i=this.agents.get(r)||(await this.createAgent({agentId:r,targetCode:t.targetCode,framework:t.framework,workspace:t.workspace,runtimeMaxSessions:t.runtimeMaxSessions,metadata:t.metadata})).agent,o=ze(t);o&&(i.runtimeMaxSessions=o);let u=c(t.workspace);u&&u!==i.workspace&&(i.workspace=u);let l=`${r}:${s}`;await this.cleanupExpiredSessions();let d=this.sessions.get(l);if(!d){let{code:g,target:m}=this.targetFor(i.targetCode);await this.reserveTargetSlot(g,m,{agentId:r,runtimeMaxSessions:i.runtimeMaxSessions});let y=this.runtimeFor(i,s),U=await y.sessionNew({cwd:i.workspace||process.cwd(),mcpServers:Array.isArray(t.mcpServers)?t.mcpServers:[],metadata:a(t.metadata)?t.metadata:{}}),I=Date.now();d={agentId:r,sessionId:s,runtime:y,targetCode:g,runtimeKind:D(m),runtimeSessionId:c(a(U)?U.sessionId:"")||s,idleTtlMs:this.targetIdleTtlMs(m),releaseAfterPrompt:this.targetReleaseAfterPrompt(m,t.metadata),createdAtMs:I,lastUsedAtMs:I,busy:!1,createdAt:J()},this.sessions.set(l,d),this.runtimeSessionIndex.set(`${r}:${d.runtimeSessionId}`,d)}if(d.busy){let g=new Error(`runtime session is already running: ${s}`);throw g.code="RUNTIME_SESSION_BUSY",g}d.busy=!0,d.lastUsedAtMs=Date.now();let f=[],h=g=>{let m=Vr(g,s,d);f.push(m),n.onUpdate?.(m)};try{let g=await d.runtime.sessionPrompt({sessionId:d.runtimeSessionId,prompt:Array.isArray(t.prompt)?t.prompt:[],metadata:a(t.metadata)?t.metadata:{}},h),m=a(t.metadata)?t.metadata:{},y=a(m._runtimeBridge)?m._runtimeBridge:{},U=Ss(g,f,y);return{sessionId:s,runtimeSessionId:d.runtimeSessionId,result:U,updates:f}}finally{d.busy=!1,d.lastUsedAtMs=Date.now(),this.promptReleaseAfterPrompt(d,a(t.metadata)?t.metadata:{})&&await this.closeSession(l,"release_after_prompt")}}async cancel(t){let n=c(t.agentId),r=c(t.sessionId),s=`${n}:${r}`,i=this.sessions.get(s);return i?(await i.runtime.sessionCancel({sessionId:i.runtimeSessionId}),await this.closeSession(s,"cancelled"),{cancelled:!0}):{cancelled:!1}}async dispatch(t,n={}){let r=c(t.agentId),s=c(t.taskId),i=c(t.executionId);if(!r||!s)throw Object.assign(new Error("agentId and taskId are required"),{status:400,code:"BAD_REQUEST"});let o=c(t.sessionId)||`dispatch-${i||s}`,u=c(t.instructions),l=os(t),d=Xe(t),{target:f}=this.targetFor(t.targetCode||t.framework),h=[{type:"text",text:["Task dispatch received.",`taskId: ${s}`,i?`executionId: ${i}`:"",u?`instructions: ${u}`:"",l?"orchaContext:":"",l,l?"Use orchaContext as the source of truth for upstream outputs, review reports, artifacts, and workflow metadata.":"","Follow the execution protocol in instructions exactly.","When embedding a generated artifact in final Markdown, use the Orcha artifact placeholder as the link target: orcha-artifact://<fieldKey>/<index>.","Example: use ![illustration](orcha-artifact://image/0) for the first generated image artifact.","Do not use local filesystem paths, file:// URLs, or data: URLs in final Markdown; Orcha replaces artifact placeholders after ingestion.",d?`For decision results, put the raw report between ${Fe} and ${$e}.`:"",d?`Then put a JSON object containing _decision between ${He} and ${ve}.`:"",d?"Do not JSON-escape the report. Keep output out of the CONTROL JSON, and put every protocol marker on its own line.":"","Return only the final answer required by that protocol.","Do not include process notes, logs, or explanations."].filter(Boolean).join(`
16
+ `)}];return this.prompt({...t,agentId:r,sessionId:o,prompt:h,metadata:is(t,f)},n)}async requestPermission({agent:t,runtimeSessionId:n,request:r,emitUpdate:s}){let i=ft(),u=this.runtimeSessionIndex.get(`${t.agentId}:${n}`)?.sessionId||n||ft(),l={permissionId:i,agentId:t.agentId,sessionId:u,runtimeSessionId:n,request:a(r)?r:{},status:"pending",createdAt:J()};return s?.({sessionId:n,update:{sessionUpdate:"permission_request",permission:l}}),await new Promise(d=>{let f=T(r?.timeoutMs,this.config.permissionRequestTimeoutMs),h=setTimeout(()=>{this.pendingPermissions.delete(i),d({permissionId:i,outcome:"denied",response:{reason:"permission request timed out"}})},f);this.pendingPermissions.set(i,{timer:h,resolve:d,permission:l})})}async respondPermission(t){let n=c(t.permissionId),r=this.pendingPermissions.get(n),s=c(t.outcome||"approved")||"approved";return r?(clearTimeout(r.timer),this.pendingPermissions.delete(n),r.resolve({permissionId:n,outcome:s,response:a(t.response)?t.response:{},userId:c(t.userId),metadata:a(t.metadata)?t.metadata:{}}),{accepted:!0,permissionId:n,outcome:s}):{accepted:!1,permissionId:n,outcome:s}}health(){return{status:"ok",bridgeVersion:K,startedAt:this.startedAt,agents:[...this.agents.values()].map(t=>({agentId:t.agentId,targetCode:t.targetCode,framework:t.framework,runtimeKind:t.runtimeKind})),sessions:this.sessions.size,pendingPermissions:this.pendingPermissions.size,targets:Object.keys(this.targets)}}};import Rs from"node:http";import ws from"node:https";import{randomBytes as Ze}from"node:crypto";var j=1,H=3,Es=1e4,mt=class{constructor(t,n={}){this.url=t,this.readyState=0,this.socket=null,this.request=null,this.buffer=Buffer.alloc(0),this.listeners=new Map,this.connectTimeoutMs=xs(n.connectTimeoutMs,Es),this.connectTimer=null,this.connect()}addEventListener(t,n){let r=this.listeners.get(t)||new Set;r.add(n),this.listeners.set(t,r)}emit(t,n={}){let r=this.listeners.get(t);if(r)for(let s of r)s(n)}connect(){let t=new URL(this.url),n=t.protocol==="wss:"?ws:Rs,r=Ze(16).toString("base64"),s=n.request({protocol:t.protocol==="wss:"?"https:":"http:",hostname:t.hostname,port:t.port||(t.protocol==="wss:"?443:80),path:`${t.pathname}${t.search}`,method:"GET",headers:{Connection:"Upgrade",Upgrade:"websocket","Sec-WebSocket-Key":r,"Sec-WebSocket-Version":"13"}});this.request=s,this.startConnectTimer(s),s.on("upgrade",(i,o,u)=>{if(this.clearConnectTimer(),this.readyState===H){o.destroy();return}this.socket=o,this.readyState=j,o.on("data",l=>this.onData(l)),o.on("close",()=>this.onClose()),o.on("error",l=>{this.readyState!==H&&this.emit("error",{error:l,message:l.message,type:"error"}),this.onClose()}),u?.length&&this.onData(u),this.emit("open")}),s.on("response",i=>{this.clearConnectTimer(),this.emit("error",{message:`websocket upgrade failed: HTTP ${i.statusCode}`,type:"error"}),i.resume(),this.onClose()}),s.on("error",i=>{this.clearConnectTimer(),this.readyState!==H&&this.emit("error",{error:i,message:i.message,type:"error"}),this.onClose()}),s.end()}startConnectTimer(t){this.connectTimeoutMs<=0||(this.connectTimer=setTimeout(()=>{if(this.readyState===j||this.readyState===H)return;let n=`websocket connect timeout after ${this.connectTimeoutMs}ms`;this.emit("error",{message:n,type:"timeout"}),this.onClose(),t.destroy(new Error(n))},this.connectTimeoutMs),this.connectTimer.unref?.())}clearConnectTimer(){this.connectTimer&&(clearTimeout(this.connectTimer),this.connectTimer=null)}send(t){!this.socket||this.readyState!==j||this.socket.write(Gt(1,Buffer.from(String(t),"utf8")))}close(){if(this.readyState!==H){if(this.clearConnectTimer(),!this.socket){this.request?.destroy(),this.onClose();return}try{this.readyState===j&&this.socket.write(Gt(8,Buffer.alloc(0))),this.socket.end()}catch{this.socket.destroy()}this.onClose()}}onClose(){this.readyState!==H&&(this.clearConnectTimer(),this.readyState=H,this.request=null,this.emit("close"))}onData(t){for(this.buffer=Buffer.concat([this.buffer,t]);this.buffer.length>=2;){let n=this.buffer[0],r=this.buffer[1],s=n&15,i=(r&128)!==0,o=r&127,u=2;if(o===126){if(this.buffer.length<u+2)return;o=this.buffer.readUInt16BE(u),u+=2}else if(o===127){if(this.buffer.length<u+8)return;let f=this.buffer.readUInt32BE(u),h=this.buffer.readUInt32BE(u+4);o=f*2**32+h,u+=8}let l=u;if(i&&(u+=4),this.buffer.length<u+o)return;let d=this.buffer.subarray(u,u+o);if(i){let f=this.buffer.subarray(l,l+4);d=Buffer.from(d.map((h,g)=>h^f[g%4]))}this.buffer=this.buffer.subarray(u+o),s===1?this.emit("message",{data:d.toString("utf8")}):s===8?this.close():s===9&&this.socket?.write(Gt(10,d))}}};function xs(e,t){let n=Number.parseInt(String(e??""),10);return Number.isFinite(n)&&n>=0?n:t}function Gt(e,t){let n=t.length,r=2;n>=126&&n<=65535?r+=2:n>65535&&(r+=8);let s=Ze(4),i=Buffer.alloc(r+4+n);i[0]=128|e;let o=2;n<126?i[1]=128|n:n<=65535?(i[1]=254,i.writeUInt16BE(n,o),o+=2):(i[1]=255,i.writeUInt32BE(Math.floor(n/2**32),o),i.writeUInt32BE(n>>>0,o+4),o+=8),s.copy(i,o),o+=4;for(let u=0;u<n;u+=1)i[o+u]=t[u]^s[u%4];return i}function Is(e){let t=new URL(e);if(t.protocol==="http:")t.protocol="ws:";else if(t.protocol==="https:")t.protocol="wss:";else if(t.protocol!=="ws:"&&t.protocol!=="wss:")throw new Error(`unsupported ORCHA_RUNTIME_ORCHA_URL protocol: ${t.protocol}`);return t.pathname=`${t.pathname.replace(/\/+$/,"")}/api/agent-runtime-bridge/ws`,t.search="",t.toString()}function Os(e){return Object.entries(e||{}).map(([t,n])=>({targetCode:t,targetName:c(n?.name||n?.targetName||t),targetType:c(n?.type||"echo"),status:"available",metadata:a(n)?n:{}}))}var gt=class{constructor(t,n){this.config=t,this.bridge=n,this.ws=null,this.stopped=!1,this.connected=!1,this.reconnectTimer=null}start(){this.connect()}stop(){this.stopped=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.ws?.close()}connect(){if(this.stopped)return;let t=Is(this.config.orchaUrl),n=new mt(t,{connectTimeoutMs:this.config.connectTimeoutMs});this.ws=n,n.addEventListener("open",()=>{if(this.ws!==n||this.stopped){n.close();return}this.authenticate(n)}),n.addEventListener("message",r=>this.handleMessage(r.data,n)),n.addEventListener("close",()=>this.scheduleReconnect("close",n)),n.addEventListener("error",r=>{p("warn","orcha-client","runtime node websocket error",{error:String(r?.message||r?.type||r)})})}authenticate(t=this.ws){this.send({type:"runtime_node.authenticate",token:this.config.nodeToken,nodeId:this.config.nodeId,nodeName:this.config.nodeName,version:K,protocolVersion:"orcha-runtime-node.v1",defaultTargetCode:this.config.defaultTargetCode,targets:Os(this.config.targets)},t)}scheduleReconnect(t,n=this.ws){n&&this.ws!==n||(this.connected=!1,n&&this.ws===n&&(this.ws=null),!this.stopped&&(this.reconnectTimer||(p("info","orcha-client","runtime node disconnected; reconnect scheduled",{reason:t,reconnectMs:this.config.reconnectMs}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},this.config.reconnectMs))))}async handleMessage(t,n=this.ws){if(n&&this.ws!==n)return;let r;try{r=JSON.parse(String(t))}catch(s){p("warn","orcha-client","invalid Orcha websocket frame",{error:String(s)});return}if(a(r)){if(r.type==="runtime_node.authenticated"){if(n&&this.ws!==n)return;this.connected=!0,p("info","orcha-client","runtime node authenticated",{nodeId:this.config.nodeId,connectionId:r.connectionId});return}if(r.type==="orcha.runtime.request"){await this.handleRequest(r);return}r.type==="runtime_node.ping"&&this.send({type:"runtime_node.pong",ts:new Date().toISOString()})}}async handleRequest(t){let n=c(t.id),r=c(t.method),s=a(t.params)?t.params:{};try{let i=await this.invoke(r,s,n);this.send({type:"orcha.runtime.response",id:n,ok:!0,result:i})}catch(i){this.send({type:"orcha.runtime.response",id:n,ok:!1,error:{code:i.code||"RUNTIME_NODE_ERROR",message:i.message||String(i)}})}}async invoke(t,n,r){if(t==="health")return this.bridge.health();if(t==="agents/create")return this.bridge.createAgent(n);if(t==="agents/dispatch")return this.bridge.dispatch(n,{onUpdate:s=>this.sendUpdate(r,s)});if(t==="sessions/prompt")return this.bridge.prompt(n,{onUpdate:s=>this.sendUpdate(r,s)});if(t==="sessions/cancel")return this.bridge.cancel(n);if(t==="permissions/respond")return this.bridge.respondPermission(n);throw Object.assign(new Error(`unsupported Orcha runtime method: ${t}`),{code:"METHOD_NOT_FOUND"})}sendUpdate(t,n){this.send({type:"orcha.runtime.event",requestId:t,eventType:"runtime.update",payload:n})}send(t,n=this.ws){return!n||n!==this.ws||n.readyState!==j?!1:(n.send(JSON.stringify(t)),!0)}};import{existsSync as Cs,readFileSync as As}from"node:fs";import{resolve as Qe}from"node:path";var Ms=/^[A-Za-z_][A-Za-z0-9_]*$/;function tn(e=process.env,t=process.cwd()){let n=c(e.ORCHA_RUNTIME_ENV_FILE),r=n?Qe(t,n):Qe(t,".env");if(!Cs(r))return n&&p("warn","config","runtime env file not found",{path:r}),{loaded:!1,path:r,keys:[]};let s=[],i=As(r,"utf8");for(let o of i.split(/\r?\n/)){let u=Us(o);if(!u)continue;let[l,d]=u;Object.prototype.hasOwnProperty.call(e,l)||(e[l]=d,s.push(l))}return p("info","config","runtime env file loaded",{path:r,keyCount:s.length}),{loaded:!0,path:r,keys:s}}function en(e=process.env){return{mode:c(e.ORCHA_RUNTIME_MODE||(e.ORCHA_RUNTIME_ORCHA_URL?"node":"server")),host:e.ORCHA_RUNTIME_BRIDGE_HOST||"127.0.0.1",port:T(e.ORCHA_RUNTIME_BRIDGE_PORT,5588),token:e.ORCHA_RUNTIME_BRIDGE_TOKEN||"",orchaUrl:c(e.ORCHA_RUNTIME_ORCHA_URL),nodeToken:e.ORCHA_RUNTIME_NODE_TOKEN||e.ORCHA_RUNTIME_BRIDGE_TOKEN||"",nodeId:c(e.ORCHA_RUNTIME_NODE_ID||e.HOSTNAME||"local-runtime-node"),nodeName:c(e.ORCHA_RUNTIME_NODE_NAME||e.ORCHA_RUNTIME_NODE_ID||e.HOSTNAME||"Local Runtime Node"),reconnectMs:T(e.ORCHA_RUNTIME_RECONNECT_MS,3e3),connectTimeoutMs:T(e.ORCHA_RUNTIME_CONNECT_TIMEOUT_MS||e.ORCHA_RUNTIME_WS_CONNECT_TIMEOUT_MS,1e4),defaultTargetCode:e.ORCHA_RUNTIME_DEFAULT_TARGET||"echo",requestLimitBytes:T(e.ORCHA_RUNTIME_REQUEST_LIMIT_BYTES,1048576),sessionPromptTimeoutMs:T(e.ORCHA_RUNTIME_SESSION_PROMPT_TIMEOUT_MS,36e5),permissionRequestTimeoutMs:T(e.ORCHA_RUNTIME_PERMISSION_TIMEOUT_MS,3e5),sessionIdleTtlMs:T(e.ORCHA_RUNTIME_SESSION_IDLE_TTL_MS,6e5),sessionCleanupIntervalMs:T(e.ORCHA_RUNTIME_SESSION_CLEANUP_INTERVAL_MS,6e4),maxSessionsPerTarget:T(e.ORCHA_RUNTIME_MAX_SESSIONS_PER_TARGET,8),openClawSessionIdleTtlMs:T(e.ORCHA_RUNTIME_OPENCLAW_SESSION_IDLE_TTL_MS,6e4),openClawMaxSessions:T(e.ORCHA_RUNTIME_OPENCLAW_MAX_SESSIONS,1),targets:Ns(e.ORCHA_RUNTIME_TARGETS_JSON||"")}}function Ns(e){if(!c(e))return{};try{let t=JSON.parse(e);if(a(t))return t}catch(t){p("warn","config","invalid ORCHA_RUNTIME_TARGETS_JSON",{error:String(t)})}return{}}function Us(e){let t=e.trim();if(!t||t.startsWith("#"))return null;let n=t.startsWith("export ")?t.slice(7).trimStart():t,r=n.indexOf("=");if(r<=0)return null;let s=n.slice(0,r).trim();if(!Ms.test(s))return null;let i=bs(n.slice(r+1).trim());return[s,i]}function bs(e){if(!e)return"";let t=e[0];if((t==='"'||t==="'")&&e.endsWith(t)){let n=e.slice(1,-1);return t==='"'?ks(n):n}return Ps(e).trim()}function ks(e){return e.replaceAll("\\n",`
17
+ `).replaceAll("\\r","\r").replaceAll("\\t"," ").replaceAll('\\"','"').replaceAll("\\\\","\\")}function Ps(e){let t=!1,n=!1;for(let r=0;r<e.length;r+=1){let s=e[r],i=e[r-1];if(s==="'"&&!n)t=!t;else if(s==='"'&&!t&&i!=="\\")n=!n;else if(s==="#"&&!t&&!n&&/\s/.test(i||""))return e.slice(0,r)}return e}import{createServer as Ls}from"node:http";function _t(e,t,n){let r=JSON.stringify(n);e.writeHead(t,{"content-type":"application/json; charset=utf-8","content-length":Buffer.byteLength(r)}),e.end(r)}function v(e={}){return{ok:!0,...e}}function qt(e,t,n){return{ok:!1,error:{code:e,message:t,...n===void 0?{}:{detail:n}}}}async function nn(e,t){let n=[],r=0;for await(let i of e){if(r+=i.length,r>t)throw Object.assign(new Error("request body too large"),{status:413,code:"REQUEST_TOO_LARGE"});n.push(i)}if(n.length===0)return{};let s=Buffer.concat(n).toString("utf8");if(!s.trim())return{};try{let i=JSON.parse(s);if(!a(i))throw Object.assign(new Error("JSON body must be an object"),{status:400,code:"BAD_JSON"});return i}catch(i){throw i.status?i:Object.assign(new Error(`invalid JSON body: ${i.message}`),{status:400,code:"BAD_JSON"})}}function rn(e,t){if(!t)return;if((e.headers.authorization||"")!==`Bearer ${t}`)throw Object.assign(new Error("runtime bridge token is invalid"),{status:401,code:"UNAUTHORIZED"})}function sn(e,t){let n={"GET /health":async()=>v(t.health()),"POST /agents/create":async r=>v(await t.createAgent(r)),"POST /agents/dispatch":async r=>v(await t.dispatch(r)),"POST /sessions/prompt":async r=>v(await t.prompt(r)),"POST /sessions/cancel":async r=>v(await t.cancel(r)),"POST /permissions/respond":async r=>v(await t.respondPermission(r))};return Ls(async(r,s)=>{let i=new URL(r.url||"/",`http://${r.headers.host||`${e.host}:${e.port}`}`),o=`${r.method||"GET"} ${i.pathname}`,u=n[o];if(!u){_t(s,404,qt("NOT_FOUND",`No route for ${o}`));return}try{rn(r,e.token);let l=r.method==="GET"?{}:await nn(r,e.requestLimitBytes);_t(s,200,await u(l))}catch(l){let d=l.status||500,f=l.code||"BRIDGE_INTERNAL";_t(s,d,qt(f,l.message||String(l)))}})}var zs=Ks(import.meta.url),js=".orcha-runtime-bridge.pid",Gs=".orcha-runtime-bridge.log",qs=3,Js=36e5,{command:Ws,options:mn}=Zs(process.argv.slice(2));Qs(mn);tn();var Xs=en();await Vs(Ws,Xs,mn);async function Vs(e,t,n){switch(e){case"run":case"foreground":an(t);return;case"start":if(n.foreground){an(t);return}un();return;case"reload":case"restart":await ln({quiet:!0}),un();return;case"stop":await ln();return;case"status":Ys();return;case"help":case"--help":case"-h":ri();return;default:throw new Error(`Unknown command: ${e}`)}}function an(e){ti();let t=new ht(e);if(e.mode==="server"){let r=sn(e,t);cn({bridge:t,server:r}),r.listen(e.port,e.host,()=>{p("info","runtime-bridge","Orcha runtime bridge HTTP server started",{host:e.host,port:e.port,targets:Object.keys(t.targets)})});return}if(!e.orchaUrl)throw new Error("ORCHA_RUNTIME_ORCHA_URL is required in runtime node mode");let n=new gt(e,t);cn({bridge:t,client:n}),n.start(),p("info","runtime-bridge","Orcha runtime node started",{nodeId:e.nodeId,nodeName:e.nodeName,orchaUrl:e.orchaUrl,targets:Object.keys(t.targets)})}function cn({bridge:e,client:t,server:n}){let r=!1,s=i=>{if(r)return;r=!0;let o=Number(e?.sessions?.size||0)>0;p("info","runtime-bridge","runtime bridge shutting down",{signal:i});try{t?.stop?.()}catch(u){p("warn","runtime-bridge","runtime client stop failed",{error:String(u)})}Promise.resolve(e?.stop?.(`process_${String(i||"shutdown").toLowerCase()}`)).catch(u=>{p("warn","runtime-bridge","runtime bridge stop failed",{error:String(u)})}).finally(()=>{try{n?.close?.()}catch(u){p("warn","runtime-bridge","runtime server close failed",{error:String(u)})}}),setTimeout(()=>process.exit(0),o?8500:200)};process.once("SIGTERM",()=>s("SIGTERM")),process.once("SIGINT",()=>s("SIGINT"))}function un(){let e=Yt(),t=gn(),n=Zt(e);if(n&&G(n)){console.log(JSON.stringify({status:"already_running",pid:n,pidFile:e,logFile:t}));return}n&&Xt(e),fn(e),fn(t),Wt(t);let r=Hs(t,"a"),s={...process.env,ORCHA_RUNTIME_PID_FILE:e,ORCHA_RUNTIME_LOG_FILE:t},i=Ds(process.execPath,[zs,"run"],{cwd:process.cwd(),detached:!0,env:s,stdio:["ignore",r,r]});i.unref(),Fs(r),hn(e,`${i.pid}
18
+ `),console.log(JSON.stringify({status:"started",pid:i.pid,pidFile:e,logFile:t}))}async function ln({quiet:e=!1}={}){let t=Yt(),n=Zt(t);if(!n){e||console.log(JSON.stringify({status:"not_running",pidFile:t}));return}if(!G(n)){Xt(t),e||console.log(JSON.stringify({status:"not_running",pid:n,pidFile:t}));return}process.kill(n,"SIGTERM"),!await dn(n,1e4)&&G(n)&&(process.kill(n,"SIGKILL"),await dn(n,3e3)),Xt(t),e||console.log(JSON.stringify({status:"stopped",pid:n,pidFile:t}))}function Ys(){let e=Yt(),t=gn(),n=Zt(e),r=!!(n&&G(n));console.log(JSON.stringify({status:r?"running":"not_running",running:r,pid:r?n:null,pidFile:e,logFile:t}))}function Zs(e){let t=[],n={};for(let s=0;s<e.length;s+=1){let i=e[s];i==="--daemon"?n.daemon=!0:i==="--foreground"?n.foreground=!0:i==="--env-file"?n.envFile=e[++s]:i==="--pid-file"?n.pidFile=e[++s]:i==="--log-file"?n.logFile=e[++s]:t.push(i)}return{command:t[0]||"run",options:n}}function Qs(e){e.envFile&&(process.env.ORCHA_RUNTIME_ENV_FILE=e.envFile),e.pidFile&&(process.env.ORCHA_RUNTIME_PID_FILE=e.pidFile),e.logFile&&(process.env.ORCHA_RUNTIME_LOG_FILE=e.logFile)}function Yt(){return Vt(process.cwd(),process.env.ORCHA_RUNTIME_PID_FILE||js)}function gn(){return Vt(process.cwd(),process.env.ORCHA_RUNTIME_LOG_FILE||Gs)}function ti(){let e=process.env.ORCHA_RUNTIME_LOG_FILE;if(!e)return;let t=_n();if(t<=0)return;let n=Vt(process.cwd(),e);Wt(n,t);let r=ni();r<=0||setInterval(()=>Wt(n,t),r).unref()}function Wt(e,t=_n()){if(t<=0||!pn(e))return;let n=0,r="";try{if(n=on(e).size,n<=0)return;r=Jt(e,"utf8")}catch(d){p("warn","runtime-bridge","runtime log cleanup skipped",{logFile:e,error:String(d)});return}let s=Date.now()-t*24*60*60*1e3,i=r.split(/\r?\n/),o=[],u=0;for(let d of i)d&&(ei(d,s)?o.push(d):u+=1);if(u===0)return;let l="";try{on(e).size>n&&(l=Jt(e,"utf8").slice(r.length));let f=[...o,...l.split(/\r?\n/).filter(Boolean)].join(`
19
+ `);hn(e,f?`${f}
20
+ `:""),p("info","runtime-bridge","runtime log cleanup completed",{logFile:e,retentionDays:t,removed:u})}catch(d){p("warn","runtime-bridge","runtime log cleanup failed",{logFile:e,error:String(d)})}}function ei(e,t){try{let n=JSON.parse(e);if(!n||typeof n!="object")return!0;let r=typeof n.ts=="string"?Date.parse(n.ts):Number.NaN;return!Number.isFinite(r)||r>=t}catch{return!0}}function _n(){return Tn(process.env.ORCHA_RUNTIME_LOG_RETENTION_DAYS,qs)}function ni(){return Tn(process.env.ORCHA_RUNTIME_LOG_CLEANUP_INTERVAL_MS,Js)}function Tn(e,t){let n=Number.parseInt(String(e??""),10);return Number.isFinite(n)&&n>=0?n:t}function Zt(e){if(!pn(e))return null;let t=Number.parseInt(Jt(e,"utf8").trim(),10);return Number.isInteger(t)&&t>0?t:null}function G(e){try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}async function dn(e,t){let n=Date.now();for(;Date.now()-n<t;){if(!G(e))return!0;await new Promise(r=>setTimeout(r,100))}return!G(e)}function fn(e){$s(Bs(e),{recursive:!0})}function Xt(e){try{vs(e,{force:!0})}catch{}}function ri(){console.log(`Usage: orcha-runtime-bridge [command] [options]
20
21
 
21
22
  Commands:
22
23
  run, foreground Run in the foreground. This is the default.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orcha-ai/runtime-bridge",
3
- "version": "0.1.24",
3
+ "version": "0.1.26",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Local Orcha runtime bridge for ACP-compatible agent runtimes.",