@orcha-ai/runtime-bridge 0.1.27 → 0.1.28
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.
- package/bin/orcha-runtime-bridge.js +14 -14
- package/package.json +1 -1
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{spawn as
|
|
3
|
-
`):""}var
|
|
2
|
+
import{spawn as vs}from"node:child_process";import{closeSync as Bs,existsSync as mn,mkdirSync as Ks,openSync as zs,readFileSync as Wt,rmSync as js,statSync as an,writeFileSync as hn}from"node:fs";import{dirname as Gs,resolve as Yt}from"node:path";import{fileURLToPath as qs}from"node:url";import{randomUUID as mt}from"node:crypto";var K="0.1.28";function W(){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 En(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 In(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 xn(e,t){let n=In(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 On(e=new Date){let t=a(process.env.ORCHA_RUNTIME_LOG_TIMEZONE||process.env.TZ||"Asia/Shanghai");try{return xn(e,t)}catch{return En(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 I(e){return Array.isArray(e)?e.map(String):[]}var Cn="[redacted]",se=/(authorization|api[_-]?key|credential|password|secret|token)/i;function J(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]=J(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=>J(i,t));return t.delete(e),s}let n={},r=se.test(a(e.name||e.key));for(let[s,i]of Object.entries(e))n[s]=se.test(s)||r&&s.toLowerCase()==="value"?Cn:J(i,t);return t.delete(e),n}function oe(e,t=4e3){let n=JSON.stringify(J(e))??String(e);return!Number.isFinite(t)||n.length<=t?n:`${n.slice(0,t)}...`}function p(e,t,n,r={}){let s={ts:On(),level:e,module:t,msg:n,...c(r)?J(r):{}};console.error(JSON.stringify(s))}function nt(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 rt=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=nt(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 An}from"node:child_process";var V="2.0",Nn=3e4;function Mn(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 Un(e){if(!c(e))return new Error(String(e||"runtime error"));let t=a(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 bn(e){return c(e)&&"id"in e&&!("method"in e)}function kn(e){return c(e)&&typeof e.method=="string"&&"id"in e}function Ln(e){return c(e)&&typeof e.method=="string"&&!("id"in e)}var st=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=An(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(
|
|
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(bn(t)){this.resolveResponse(t);return}if(kn(t)){this.handleRequest(t);return}Ln(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(Un(t.error))):r.resolve(t.result))}async handleRequest(t){let n=this.requestHandlers.get(t.method);if(!n){this.writeFrame({jsonrpc:V,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:V,id:t.id,result:r??{}})}catch(r){this.writeFrame({jsonrpc:V,id:t.id,error:Mn(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=Nn){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:V,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:V,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 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=a(t);if(n)return n;let r=de(a(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(a).filter(Boolean);let t=a(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=a(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=a(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=a(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(!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=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=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 jn(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=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=c(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={...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 Et(e,t,n={}){for(let r of zn(e))st(t,jn(r,n))}function It(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 ce(e,t,n){if(!c(e))return e;let r=c(e.event)?e.event:null;return r?(st(t,xt(r,n)),{...e,event:It(r)}):e}function he(e,t,n={}){if(!c(e))return e;Et(e,t,n);let r=ce(e,t,n),s=c(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=c(e)?{...e}:{};Et(r,t,n),Et(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 nt({command:t,args:x(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:K},...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(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=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),...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=c(e.metadata)?e.metadata:{};return a(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=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",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(!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 Ie(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 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(!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"?V.has(s):!1}function _e(e){return c(e)?a(e.phase||e.status||e.stage).toLowerCase():""}function cr(e){if(!c(e)||Mt(e))return!1;let t=c(e.payload)?e.payload:{},n=a(e.type),r=a(t.type),s=_e(t);if(n==="event_msg"&&r==="agent_message"||n==="response_item"&&r==="message"&&a(t.role)==="assistant")return!!(s&&!V.has(s));let i=c(e.item)?e.item:{},o=_e(i);return a(i.role)==="assistant"||a(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=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 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=c(e.env)?e.env:{},r=a(e.artifactRoot||e.artifactDir||e.runtimeArtifactRoot||n.ORCHA_RUNTIME_ARTIFACT_DIR)||M(Ee(),"orcha-runtime-artifacts"),s=a(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 a(c(e)?e.root:e)}function Te(e){let t=be(e),n=a(c(e)?e.sessionRoot:tr(t)),r=a(c(e)?e.realSessionRoot:"");if(n)try{if(r&&ut(n)!==r)return;Vn(n)}catch{}}function yr(e,t={}){let n=be(e),r=a(c(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=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)||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(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&&Ct(e[r],t,n+1)}}function Le(e){return a(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=>c(t)&&a(t.type)==="session_meta"&&c(t.payload))||null}function Cr(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 Ar(e){let t=a(e.originator),n=a(e.source);if(t!=="codex_exec"&&n!=="exec"||a(e.parent_thread_id))return!1;let r=a(e.thread_source);if(r&&r!=="user")return!1;let s=a(e.session_id),i=a(e.id);return!(s&&i&&s!==i)}function Mr(e,t,n){if(!Ir(e,t.promptText))return!1;let r=Or(e);if(!r)return!1;let s=r.payload;if(!Ar(s))return!1;let i=Cr(r);if(!Number.isFinite(i)||i<t.startedAtMs-5e3||i>n+5e3)return!1;let o=a(t.target.cwd),u=a(s.cwd);return!(o&&u&&ge(o)!==ge(u))}function ye(e){try{return Ur(we(e,"utf8"))}catch{return null}}function Nr(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||!Mr(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 Ur(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 br(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 kr(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?`
|
|
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 Pn,readFileSync as Dn,realpathSync as ae,statSync as Fn}from"node:fs";import{basename as le,extname as de,isAbsolute as $n,relative as Hn}from"node:path";var vn=25*1024*1024;function fe(e,t=""){let n=a(t);if(n)return n;let r=de(a(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 it(e){if(Array.isArray(e))return e.map(a).filter(Boolean);let t=a(e);return t?[t]:[]}function Bn(e,t){let n=Hn(t,e);return n===""||!!n&&!n.startsWith("..")&&!$n(n)}function Kn(e,t){let n=a(e);if(!n||!Pn(n))return"";try{let r=ae(n);for(let s of t)try{let i=ae(s);if(Bn(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:zn(r,t,n)}function zn(e,t,n={}){let r=[...it(n.trustedFileRoots),...it(n.trustedFileRoot),...it(n.artifactRoots),...it(n.artifactRoot)],s=Kn(e,r);if(!s)return"";try{let i=Fn(s);return!i.isFile()||i.size<=0||i.size>vn?"":`data:${t};base64,${Dn(s).toString("base64")}`}catch{return""}}function S(...e){for(let t of e){let n=a(t);if(n)return n}return""}function jn(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(!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=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)||Et(u,d,t);if(!f)return null;let m=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:m||void 0,imageUrl:f,previewUrl:f,fileUrl:f,mimeType:d},dataUrl:m||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 Gn(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 qn(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=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=jn(r,s,l,o),f=d?fe(o,u):u;if(d){let x=S(r.dataUrl,s.dataUrl),A=x.startsWith("data:")?x:"",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||Et(o,f,t)||Et(b,f,t);_&&(_.startsWith("data:")&&(s.dataUrl||=_),s.imageUrl||=_,s.previewUrl||=_,s.fileUrl||=_,f&&(s.mimeType||=f))}for(let[x,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[x];b!=null&&b!==""&&!(A in s)&&(s[A]=b)}let m=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),h=S(r.dataUrl,s.dataUrl,m.startsWith("data:")?m:"",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:h||void 0,fileUrl:m||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 ot(e,t){if(!t||!e)return;let n=c(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={...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 It(e,t,n={}){for(let r of Gn(e))ot(t,qn(r,n))}function Ot(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 ce(e,t,n){if(!c(e))return e;let r=c(e.event)?e.event:null;return r?(ot(t,xt(r,n)),{...e,event:Ot(r)}):e}function me(e,t,n={}){if(!c(e))return e;It(e,t,n);let r=ce(e,t,n),s=c(r.update)?ce(r.update,t,n):null;return s&&s!==r.update&&(r={...r,update:s}),r}function he(e,t,n={}){let r=c(e)?{...e}:{};It(r,t,n),It(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 st({command:t,args:I(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:K},...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(me(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 he(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),...I(this.target.trustedArtifactRoots),...I(this.target.trustedFileRoots),...I(this.target.artifactRoots),...I(this.target.artifactFileRoots)].filter(Boolean)}}async stop(t){await this.proc?.stop(t)}};function Jn(e){let t=c(e.metadata)?e.metadata:{};return a(t.agentCode)}function Wn(e,t){let n=Jn(e);return n?`agent:${n}:${t}`:`orcha-${t}`}var at=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",Wn(t,o)];super(t,{...n,command:u,args:d},s,i)}sessionNewParams(t={}){return{...t,mcpServers:[]}}};import{spawn as Vn}from"node:child_process";import{randomUUID as X}from"node:crypto";import{existsSync as Se,mkdirSync as Xn,readdirSync as Re,readFileSync as we,realpathSync as dt,rmSync as Yn,rmdirSync as Zn,statSync as Qn,unlinkSync as tr}from"node:fs";import{homedir as er,tmpdir as Ee}from"node:os";import{basename as Ie,dirname as nr,join as N,resolve as ge}from"node:path";var rr=36e5,sr=5e3,ir=2*60*1e3,or=2*60*1e3,ar=12,cr=1e3,ur=1500,ct=24*60*60*1e3,Y=new Set(["final_answer","final","complete","completed","done"]),lr=new Set(["function_call","function_call_output","custom_tool_call","custom_tool_call_output","local_shell_call","local_shell_call_output","mcp_tool_call","mcp_tool_call_output","web_search_call","image_generation_call","image_generation_end"]);function ut(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 xe(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 Oe(e,t={}){return xt(e,{source:"codex_cli_image_generation",...t})}function Ce(e,t){ot(e.artifacts,t)}function Ae(e){let t=Ot(e);if(!De(e))return t;let n=c(e.payload)?e.payload:{};return{type:e.type,...e.timestamp?{timestamp:e.timestamp}:{},payload:Object.fromEntries(["type","name","namespace","title","call_id","callId","id","status","phase","stage"].filter(r=>n[r]!==void 0&&n[r]!==null&&n[r]!=="").map(r=>[r,n[r]]))}}function Mt(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"?Y.has(s):!1}function _e(e){return c(e)?a(e.phase||e.status||e.stage).toLowerCase():""}function dr(e){if(!c(e)||Mt(e))return!1;let t=c(e.payload)?e.payload:{},n=a(e.type),r=a(t.type),s=_e(t);if(n==="event_msg"&&r==="agent_message"||n==="response_item"&&r==="message"&&a(t.role)==="assistant")return!!(s&&!Y.has(s));let i=c(e.item)?e.item:{},o=_e(i);return a(i.role)==="assistant"||a(i.type)==="message"?!!(o&&!Y.has(o)):!1}function fr(e,t,n){return n.captureLastMessage===!1||t.includes("--output-last-message")||t.includes("-o")?!1:n.captureLastMessage===!0?!0:Ie(e)==="codex"}function pr(e,t){return t.collectCodexTranscriptArtifacts===!1?!1:t.collectCodexTranscriptArtifacts===!0?!0:Ie(e)==="codex"}function Ne(e){return Math.max(20,T(e.codexTranscriptPollMs||e.transcriptPollMs,cr))}function mr(e){return Math.max(0,T(e.codexFinalOutputWaitMs||e.finalOutputWaitMs,ur))}function ft(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 Ut(e){let t=c(e?.metadata)?e.metadata:{};return c(t._runtimeBridge)?t._runtimeBridge:{}}function Ct(e){return a(Ut(e).promptKind).toLowerCase()}function hr(e,t){for(let n of[e.codexTranscriptStreaming,e.streamCodexTranscript]){let r=ft(n);if(r!=null)return r}return Ct(t)==="chat"}function gr(e,t){let n=Ut(e);for(let s of[n.emitThoughtChunks,n.streamThoughts]){let i=ft(s);if(i!=null)return i}let r=Ct(e);if(r&&r!=="chat")return!1;for(let s of[t.emitThoughtChunks,t.streamThoughts]){let i=ft(s);if(i!=null)return i}return Ct(e)==="chat"}function _r(e){let t=Ut(e);for(let n of[t.finalTextOnly,t.finalOutputOnly]){let r=ft(n);if(r!=null)return r}return null}function Tr(e,t){let n=_r(e);return n??(t.finalTextOnly===!0||t.finalOutputOnly===!0?!0:(t.finalTextOnly===!1||t.finalOutputOnly===!1,!1))}function yr(e,t){return!e.finalTextOnly||t}function Me(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 Sr(e,t,n,r=new Set){return{target:e,promptText:t,startedAtMs:n,baselinePaths:r,matchedPath:"",disabled:!1,processedLines:new Map}}function Rr(e,t){let n=c(e.env)?e.env:{},r=a(e.artifactRoot||e.artifactDir||e.runtimeArtifactRoot||n.ORCHA_RUNTIME_ARTIFACT_DIR)||N(Ee(),"orcha-runtime-artifacts"),s=a(t).replace(/[^A-Za-z0-9._-]+/g,"-").slice(0,80)||X(),i=N(r,s),o=N(i,X());return Xn(o,{recursive:!0}),{root:o,realRoot:dt(o),sessionRoot:i,realSessionRoot:dt(i)}}function be(e){return a(c(e)?e.root:e)}function Te(e){let t=be(e),n=a(c(e)?e.sessionRoot:nr(t)),r=a(c(e)?e.realSessionRoot:"");if(n)try{if(r&&dt(n)!==r)return;Zn(n)}catch{}}function wr(e,t={}){let n=be(e),r=a(c(e)?e.realRoot:"");if(n){try{if(r&&dt(n)!==r){p("warn","runtime.cli","runtime artifact directory cleanup skipped; path changed",{...t,artifactRoot:n});return}}catch{Te(e);return}try{Yn(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 Er(e,t){return{trustedFileRoots:[t,...I(e.trustedArtifactRoots),...I(e.trustedFileRoots),...I(e.artifactRoots),...I(e.artifactFileRoots)].filter(Boolean)}}function ke(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)||N(er(),".codex");return N(r,"sessions")}function Ir(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 N(e,r,s,i)}function Le(e,t,n){let r=new Set;for(let s of[t-ct,t,t+ct,n-ct,n,n+ct])r.add(Ir(e,s));return[...r].filter(s=>Se(s))}function xr(e,t,n){let r=ke(e),s=t-ir,i=n+or,o=[];for(let u of Le(r,t,n)){let l=[];try{l=Re(u)}catch{continue}for(let d of l){if(!d.endsWith(".jsonl"))continue;let f=N(u,d);try{let m=Qn(f);if(!m.isFile()||m.mtimeMs<s||m.mtimeMs>i)continue;o.push({path:f,mtimeMs:m.mtimeMs})}catch{}}}return o.sort((u,l)=>l.mtimeMs-u.mtimeMs).slice(0,ar)}function Or(e,t,n=t){let r=ke(e),s=new Set;for(let i of Le(r,t,n)){let o=[];try{o=Re(i)}catch{continue}for(let u of o)u.endsWith(".jsonl")&&s.add(N(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 Pe(e){return a(e).replace(/\s+/g," ")}function Cr(e){let t=Pe(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 Ar(e,t){let n=Cr(t);if(!n.length)return!1;let r=[];for(let i of e)At(i,r);let s=Pe(r.join(" "));return n.every(i=>s.includes(i))}function Nr(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 Ur(e){let t=a(e.originator),n=a(e.source);if(t!=="codex_exec"&&n!=="exec"||a(e.parent_thread_id))return!1;let r=a(e.thread_source);if(r&&r!=="user")return!1;let s=a(e.session_id),i=a(e.id);return!(s&&i&&s!==i)}function br(e,t,n){if(!Ar(e,t.promptText))return!1;let r=Nr(e);if(!r)return!1;let s=r.payload;if(!Ur(s))return!1;let i=Mr(r);if(!Number.isFinite(i)||i<t.startedAtMs-5e3||i>n+5e3)return!1;let o=a(t.target.cwd),u=a(s.cwd);return!(o&&u&&ge(o)!==ge(u))}function ye(e){try{return Lr(we(e,"utf8"))}catch{return null}}function kr(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 xr(e.target,e.startedAtMs,n)){if(e.baselinePaths.has(s.path))continue;let i=ye(s.path);!i||!br(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 Lr(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 Pr(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 De(e){if(!c(e))return!1;let t=c(e.payload)?e.payload:{};return a(e.type)==="response_item"&&lr.has(a(t.type))}function Dr(e,t,n,r){let s=xe(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;
|
|
11
|
-
`,
|
|
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}),
|
|
13
|
-
... [truncated ${r} characters]`}function
|
|
14
|
-
`:"";t+=`${s}${r}`}}}return t.trim()}function
|
|
15
|
-
`?1:0)).trim()}function Ge(e){let t=String(e||"").trim();if(!t)return null;try{let n=JSON.parse(t);if(c(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 ms(e){let t=ls(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(!c(e))return!1;if(E(e.output))return!0;for(let t of["content","text","message","summary"])if(a(e[t]))return!0;return!!(We(e.status)||a(e.error)||a(e.errorMessage))}function N(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 gs(e){return c(e)?typeof(c(e._decision)?e._decision:c(e.decision)?e.decision:e).passed=="boolean":!1}function _s(e){return c(e)?c(e._decision)&&typeof e._decision.passed=="boolean"?!0:gs(e.output):!1}function vt(e,t,n){let r=c(e)?{...e}:{};if(!E(r.output)){for(let s of["summary","message","content","text"])if(a(r[s])){r.output=a(r[s]);break}}return!E(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)}}}var Ts=["dataUrl","dataURL","contentDataUrl","contentDataURL","contentBase64","base64","data"];function Je(e){if(!c(e))return"";let t=c(e.content)?e.content:{},n=c(e.metadata)?e.metadata:{};return a(e.fieldKey||e.field_key||t.fieldKey||n.fieldKey)}function ys(e,t){let n=c(e.content)?e.content:{},r=c(t.content)?t.content:{},s={...e,...t,content:{...n,...r},metadata:{...c(e.metadata)?e.metadata:{},...c(t.metadata)?t.metadata:{}}};for(let i of Ts)E(e[i])&&(s[i]=e[i]),E(n[i])&&(s.content[i]=n[i]);return s}function Ss(e,t){let n=Array.isArray(e)?e.filter(c):[],r=Array.isArray(t)?t.filter(c):[];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]=ys(s[f],u)}return s}function L(e,t,n){let r={...e,...t,_meta:{...c(e._meta)?e._meta:{},...c(t._meta)?t._meta:{},runtimeOutputSource:n}};return(Array.isArray(e._artifacts)||Array.isArray(t._artifacts))&&(r._artifacts=Ss(e._artifacts,t._artifacts)),r}function Rs(e,t,n={}){let r=a(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=ps(t),d=l?qe(l):null,f=i?ms(t):null;if(Ye(o))return We(o.status)||a(o.error)||a(o.errorMessage)?o:r==="dispatch"&&d?L(o,N(d),"final_event"):r==="dispatch"&&f?L(o,N(f),"updates"):!s||_s(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:{...c(o._meta)?o._meta:{},runtimeOutputSource:"final_event"}};let h=hs(us(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:{...c(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=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=D(t)==="openclaw"?$(this.config.openClawSessionIdleTtlMs,Jr):$(this.config.sessionIdleTtlMs,jr);return $(t?.sessionIdleTtlMs??t?.idleTtlMs,r)}targetMaxSessions(t,n=null){let s=D(t)==="openclaw"?$(this.config.openClawMaxSessions,Wr):$(this.config.maxSessionsPerTarget,qr),i=$(t?.maxSessions,s),o=Bt(n);return o?Math.max(i,o):i}targetReleaseAfterPrompt(t,n={}){let r=D(t),s=c(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=c(n?._runtimeBridge)?n._runtimeBridge:{},s=Kt(r);return s!==void 0?Y(s,t.releaseAfterPrompt):t.releaseAfterPrompt}startSessionCleanup(){let t=$(this.config.sessionCleanupIntervalMs,Gr);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=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=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: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=a(t.agentId),s=a(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=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: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:c(t.metadata)?t.metadata:{}}),I=Date.now();d={agentId:r,sessionId:s,runtime:y,targetCode:g,runtimeKind:D(m),runtimeSessionId:a(c(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=Yr(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:c(t.metadata)?t.metadata:{}},h),m=c(t.metadata)?t.metadata:{},y=c(m._runtimeBridge)?m._runtimeBridge:{},U=Rs(g,f,y);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=as(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  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:os(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: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: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 ws from"node:http";import Es from"node:https";import{randomBytes as Ze}from"node:crypto";var j=1,H=3,xs=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=Is(n.connectTimeoutMs,xs),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:"?Es:ws,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 Is(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 Os(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 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=Os(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: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!==j?!1:(n.send(JSON.stringify(t)),!0)}};import{existsSync as As,readFileSync as Ms}from"node:fs";import{resolve as Qe}from"node:path";var Ns=/^[A-Za-z_][A-Za-z0-9_]*$/;function tn(e=process.env,t=process.cwd()){let n=a(e.ORCHA_RUNTIME_ENV_FILE),r=n?Qe(t,n):Qe(t,".env");if(!As(r))return n&&p("warn","config","runtime env file not found",{path:r}),{loaded:!1,path:r,keys:[]};let s=[],i=Ms(r,"utf8");for(let o of i.split(/\r?\n/)){let u=bs(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: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:Us(e.ORCHA_RUNTIME_TARGETS_JSON||"")}}function Us(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 bs(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(!Ns.test(s))return null;let i=ks(n.slice(r+1).trim());return[s,i]}function ks(e){if(!e)return"";let t=e[0];if((t==='"'||t==="'")&&e.endsWith(t)){let n=e.slice(1,-1);return t==='"'?Ps(n):n}return Ls(e).trim()}function Ps(e){return e.replaceAll("\\n",`
|
|
17
|
-
`).replaceAll("\\r","\r").replaceAll("\\t"," ").replaceAll('\\"','"').replaceAll("\\\\","\\")}function
|
|
18
|
-
`),console.log(JSON.stringify({status:"started",pid:i.pid,pidFile:e,logFile:t}))}async function
|
|
10
|
+
${s}`:s;Me(t,n,r,d,s)&&(o=1,u=1)}return s&&i&&(t.finalTextSeen=!0),Ce(t,Oe(e,t.artifactOptions)),(Pr(e)||De(e)||i)&&r({sessionId:n,update:{sessionUpdate:"runtime_event",event:Ae(e)}}),{textCount:o,finalTextCount:u,thoughtCount:l}}function Nt(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=kr(t,n,s);if(f){let m=Math.min(t.processedLines.get(f.path)||0,f.events.length),g=e.artifacts.size;for(let h of f.events.slice(m)){let y=Dr(h,e,n,r);u+=y.textCount,l+=y.finalTextCount,d+=y.thoughtCount}t.processedLines.set(f.path,f.events.length),(f.events.length>m||e.artifacts.size>g)&&(o=1)}return{artifactCount:e.artifacts.size-i,transcriptCount:o,textCount:u,finalTextCount:l,thoughtCount:d}}function Fr(e,{remove:t=!0}={}){if(!e||!Se(e))return"";try{return we(e,"utf8").trim()}catch{return""}finally{t&<(e)}}function lt(e){if(e)try{tr(e)}catch{}}function $r(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 Hr(e){return new Promise(t=>setTimeout(t,e))}function vr(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 Br(e,t,n,r,s,i){let o=Nt(e,t,n,r,Date.now()),u=()=>vr(e,n,r,Fr(s,{remove:!1}));if(u()||e.finalTextSeen)return lt(s),o;let l=mr(i);if(l<=0||!t&&!s)return lt(s),o;let d=Date.now()+l,f=Math.min(Ne(i),100);for(;!e.finalTextSeen&&Date.now()<d&&(await Hr(Math.min(f,Math.max(0,d-Date.now()))),o=$r(o,Nt(e,t,n,r,Date.now())),!u()););return lt(s),o}var pt=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=a(this.target.command);if(!s)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);let i=a(t.sessionId)||X(),o=nt(t.prompt),u=a(this.target.promptMode||"stdin"),l=this.buildArgs(u,o),d=a(this.target.cwd)||this.agent.workspace||process.cwd(),f=Rr(this.target,i),m=f.root,g=Er(this.target,m),h=pr(s,this.target),y={...this.target,targetCode:this.agent.targetCode,cwd:d},U=h?Or(y,r):new Set,x=fr(s,l,this.target)?N(Ee(),`orcha-runtime-last-message-${X()}.txt`):"";x&&l.push("--output-last-message",x);let A=T(this.target.timeoutMs||this.target.sessionPromptTimeoutMs,T(this.options.sessionPromptTimeoutMs,rr)),b={...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:m},_=Vn(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 te="",St=a(this.target.outputMode||"text"),k={artifacts:new Map,emittedTexts:new Set,emittedThoughtTexts:new Set,value:"",artifactOptions:g,finalTextSeen:!1,finalTextOnly:Tr(t,this.target),emitThoughtChunks:gr(t,this.target)},Rt=h?Sr(y,o,r,U):null;return _.stdout.setEncoding("utf8"),_.stdout.on("data",B=>this.handleStdout(B,St,k,i,n)),_.stderr.setEncoding("utf8"),_.stderr.on("data",B=>{te+=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,Sn)=>{let Q=!1,ee=!1,F=null,wt=Rt&&hr(this.target,t)?setInterval(()=>{try{Nt(k,Rt,i,n)}catch(R){p("warn","runtime.cli","codex transcript stream poll failed",{target:this.agent.targetCode,sessionId:i,error:String(R?.message||R)})}},Ne(this.target)):null;wt?.unref?.();let ne=setTimeout(()=>{ee=!0,p("warn","runtime.cli","runtime prompt timed out; terminating child",{target:this.agent.targetCode,sessionId:i,pid:_.pid,timeoutMs:A}),ut(_,"SIGTERM"),F=setTimeout(()=>{p("warn","runtime.cli","runtime prompt force killing child",{target:this.agent.targetCode,sessionId:i,pid:_.pid}),ut(_,"SIGKILL")},sr),F.unref?.(),tt(Object.assign(new Error(`runtime CLI timed out after ${A}ms`),{code:"RUNTIME_CLI_TIMEOUT"}))},A);ne.unref?.();let re=()=>{clearTimeout(ne),wt&&clearInterval(wt),F&&!ee&&clearTimeout(F),wr(f,{target:this.agent.targetCode,sessionId:i}),this.active.delete(i)},Rn=R=>{Q||(Q=!0,re(),B(R))},tt=R=>{Q||(Q=!0,re(),Sn(R))};_.on("error",R=>{p("warn","runtime.cli","runtime child error",{target:this.agent.targetCode,sessionId:i,pid:_.pid,error:String(R?.message||R)}),tt(R)}),_.on("exit",(R,q)=>{(async()=>{F&&(clearTimeout(F),F=null),St==="json-lines"&&k.value.trim()&&this.handleStdout(`
|
|
11
|
+
`,St,k,i,n);let L=await Br(k,Rt,i,n,x,this.target);(L.artifactCount>0||L.textCount>0||L.thoughtCount>0)&&p("info","runtime.cli","codex transcript updates collected",{target:this.agent.targetCode,sessionId:i,artifactCount:L.artifactCount,textCount:L.textCount,finalTextCount:L.finalTextCount,thoughtCount:L.thoughtCount,transcriptCount:L.transcriptCount});let et=te.trim();if(et&&p("debug","runtime.cli","runtime stderr",{target:this.agent.targetCode,sessionId:i,stderr:et}),p("info","runtime.cli","runtime prompt finished",{target:this.agent.targetCode,sessionId:i,pid:_.pid,exitCode:R,signal:q,artifactCount:k.artifacts.size,finalTextSeen:k.finalTextSeen}),R!==0){let wn=Object.assign(new Error(`runtime CLI exited with code ${R??"unknown"}${q?` (${q})`:""}`),{code:"RUNTIME_CLI_EXIT_NONZERO",exitCode:R,signal:q});tt(wn);return}Rn({stopReason:"end_turn",exitCode:R,signal:q,_artifacts:[...k.artifacts.values()],...et?{stderr:et}:{}})})().catch(tt)})})}buildArgs(t,n){let r=I(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=xe(d),m=Mt(d);f&&r.emitThoughtChunks&&!m&&dr(d)?Ue(r,s,i,f):f&&yr(r,m)&&Me(r,s,i,f),f&&m&&(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}),ut(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}),ut(r,"SIGTERM");this.active.clear()}};var bt="ORCHA_RUNTIME_OUTPUT_START",kt="ORCHA_RUNTIME_OUTPUT_END",Lt="ORCHA_RUNTIME_CONTROL_START",Pt="ORCHA_RUNTIME_CONTROL_END",$e=bt,He=kt,ve=Lt,Be=Pt,Dt=[bt,kt,Lt,Pt],Kr=new Set(["_artifacts","_decision","_meta"]),zr=new RegExp(`(?:^|(?<=[\\r\\n]))[ \\t]*(?<marker>${Dt.join("|")})[ \\t]*(?=\\r\\n?|\\n|$)`,"g"),O=class extends Error{constructor(t,n){super(n),this.name="RuntimeResultProtocolError",this.code=t}};function Ke(e){let t=typeof e=="string"?e.trimStart():"";return Dt.some(n=>t.startsWith(n))}function ze(e){if(typeof e!="string")return null;let t=e,n=jr(t);if(![...n.values()].some(h=>h.length>0))return null;let r=[],s=[];for(let[h,y]of n)y.length===0?r.push(h):y.length>1&&s.push(h);if(r.length>0||s.length>0){let h=[];throw r.length>0&&h.push(`\u7F3A\u5C11 ${r.join(", ")}`),s.length>0&&h.push(`\u91CD\u590D ${s.join(", ")}`),new O("invalid_markers",`Runtime Result \u534F\u8BAE\u6807\u8BB0\u4E0D\u5B8C\u6574\uFF1A${h.join("\uFF1B")}`)}let i=n.get(bt)[0],o=n.get(kt)[0],u=n.get(Lt)[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=Gr(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 m;try{m=JSON.parse(f)}catch(h){throw new O("invalid_control_json",`Runtime Result CONTROL \u5757\u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${String(h?.message||h)}`)}if(!Fe(m))throw new O("invalid_control_type","Runtime Result CONTROL \u5757\u5FC5\u987B\u662F JSON \u5BF9\u8C61");let g=Object.keys(m).filter(h=>!Kr.has(h)).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 m&&!Array.isArray(m._artifacts))throw new O("invalid_control_field_type","Runtime Result CONTROL \u5757\u7684 _artifacts \u5FC5\u987B\u662F JSON \u6570\u7EC4");for(let h of["_decision","_meta"])if(h in m&&!Fe(m[h]))throw new O("invalid_control_field_type",`Runtime Result CONTROL \u5757\u7684 ${h} \u5FC5\u987B\u662F JSON \u5BF9\u8C61`);return{output:d,...m}}function jr(e){let t=new Map(Dt.map(n=>[n,[]]));for(let n of e.matchAll(zr))t.get(n.groups.marker).push({start:n.index,end:n.index+n[0].length});return t}function Gr(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 Fe(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}var Ft=24e3,$t=8,Ht=50,vt=6e3,qr=new Set(["fail","failed","failure","error","errored","timeout","timed_out","cancelled","canceled","aborted"]),Jr=10*60*1e3,Wr=60*1e3,Vr=8,Xr=60*1e3,Yr=1,Zr=new Set(["agentId","taskId","executionId","sessionId","nodeId","targetCode","framework","workspace","instructions","runtimeMaxSessions"]),Qr=/(^|[_-])(token|secret|password|authorization|api[-_]?key|private[-_]?key|credential|cookie|jwt|access[-_]?token|refresh[-_]?token|service[-_]?token|execution[-_]?token)([_-]|$)/i;function ts(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:mt()}}}function E(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 Ve(e){let t=a(e).toLowerCase().replace(/[.。!!]+$/g,"").replace(/[\s-]+/g,"_");return qr.has(t)}function $(e,t){let n=T(e,t);return Number.isFinite(n)&&n>0?n:t}function Kt(e){let t=T(e,null);return Number.isFinite(t)&&t>0?t:null}function Z(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 D(e){return a(e?.type||"echo")}function es(e){let t=D(e);return t==="acp"||t==="stdio-acp"||t==="openclaw"}function zt(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 ns(e){let t=String(e||"");if(Qr.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 jt(e,t=0){if(e==null||typeof e=="number"||typeof e=="boolean")return e;if(typeof e=="string"){if(e.length<=vt)return e;let n=e.length-vt;return`${e.slice(0,vt)}... [truncated ${n} characters]`}if(t>=$t)return Array.isArray(e)?`[array truncated at depth ${$t}, items=${e.length}]`:c(e)?`[object truncated at depth ${$t}, keys=${Object.keys(e).length}]`:String(e);if(Array.isArray(e)){let n=e.slice(0,Ht).map(r=>jt(r,t+1));return e.length>Ht&&n.push(`[truncated ${e.length-Ht} items]`),n}if(c(e)){let n={};for(let[r,s]of Object.entries(e))n[r]=ns(r)?"[REDACTED]":jt(s,t+1);return n}return String(e)}var rs=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 ss(e){if(!c(e))return e;let t={};for(let n of rs)E(e[n])&&(t[n]=e[n]);return t}function is(e){if(!c(e))return e;let t={...e};return c(t.renderedPayload)&&(t.renderedPayload=ss(t.renderedPayload)),t}function os(e){let t=c(e)?e:{},n={};E(t.metadata)&&(n.metadata=is(t.metadata));for(let[r,s]of Object.entries(t))Zr.has(r)||r==="metadata"||E(s)&&(n[r]=s);return n}function as(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 Xe(e){return a(as(e).kind).toLowerCase()==="decision"}function je(e){let t=c(e)?e:{},n=c(t.metadata)?t.metadata:{};return Kt(t.runtimeMaxSessions??n.runtimeMaxSessions)}function cs(e){return e?.dispatchFinalTextOnly===!0||e?.dispatchFinalOutputOnly===!0?!0:e?.dispatchFinalTextOnly===!1||e?.dispatchFinalOutputOnly===!1?!1:D(e)==="cli"}function Ge(e){let t=e?.dispatchReleaseAfterPrompt??e?.dispatchDisposeAfterPrompt;return Z(t,es(e))}function us(e,t){let n=c(e?.metadata)?{...e.metadata}:{},r=c(n._runtimeBridge)?{...n._runtimeBridge}:{},s=zt(r);return n._runtimeBridge={...r,promptKind:"dispatch",finalTextOnly:cs(t),releaseAfterPrompt:s===void 0?Ge(t):Z(s,Ge(t)),requiresRuntimeResult:Xe(e)},n}function ls(e){let t=os(e);if(!E(t))return"";let n=JSON.stringify(jt(t),null,2);if(n.length<=Ft)return n;let r=n.length-Ft;return`${n.slice(0,Ft)}
|
|
13
|
+
... [truncated ${r} characters]`}function Ye(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 ds(e){if(!c(e))return"";let t=c(e.update)?e.update:e;return a(t.sessionUpdate)}function fs(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=ds(u),d=Ye(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 Gt(s);let o=r[r.length-1]||[];return Gt(o)}function ps(e){return Array.isArray(e)?e.map(Ye).filter(t=>a(t)):[]}function ms(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 hs(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 gs(e){if(!Array.isArray(e))return"";for(let t=e.length-1;t>=0;t-=1){let n=hs(ms(e[t]));if(n)return n}return""}function Gt(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=Ke(r)&&!/[\r\n]$/.test(t)?`
|
|
14
|
+
`:"";t+=`${s}${r}`}}}return t.trim()}function _s(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 qe(e){let t=String(e||"").trim();if(!t)return null;try{let n=JSON.parse(t);if(c(n)&&(Ze(n)||E(n._artifacts)||E(n.artifacts)||E(n._decision)||E(n._meta)))return n}catch{}return null}function ht(e){try{return ze(e)}catch{return null}}function Je(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=qe(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=qe(t.slice(s));if(i)return i}return null}function Ts(e){let t=ps(e);for(let n=t.length-1;n>=0;n-=1){let r=ht(t[n]);if(r)return r}return ht(Gt(t))}function Ze(e){if(!c(e))return!1;if(E(e.output))return!0;for(let t of["content","text","message","summary"])if(a(e[t]))return!0;return!!(Ve(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 ys(e){return c(e)?typeof(c(e._decision)?e._decision:c(e.decision)?e.decision:e).passed=="boolean":!1}function Ss(e){return c(e)?c(e._decision)&&typeof e._decision.passed=="boolean"?!0:ys(e.output):!1}function Bt(e,t,n){let r=c(e)?{...e}:{};if(!E(r.output)){for(let s of["summary","message","content","text"])if(a(r[s])){r.output=a(r[s]);break}}return!E(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)}}}var Rs=["dataUrl","dataURL","contentDataUrl","contentDataURL","contentBase64","base64","data"];function We(e){if(!c(e))return"";let t=c(e.content)?e.content:{},n=c(e.metadata)?e.metadata:{};return a(e.fieldKey||e.field_key||t.fieldKey||n.fieldKey)}function ws(e,t){let n=c(e.content)?e.content:{},r=c(t.content)?t.content:{},s={...e,...t,content:{...n,...r},metadata:{...c(e.metadata)?e.metadata:{},...c(t.metadata)?t.metadata:{}}};for(let i of Rs)E(e[i])&&(s[i]=e[i]),E(n[i])&&(s.content[i]=n[i]);return s}function Es(e,t){let n=Array.isArray(e)?e.filter(c):[],r=Array.isArray(t)?t.filter(c):[];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=We(n[u]),d=i.get(l)||[];d.push(u),i.set(l,d)}let o=new Map;for(let u of r){let l=We(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]=ws(s[f],u)}return s}function P(e,t,n){let r={...e,...t,_meta:{...c(e._meta)?e._meta:{},...c(t._meta)?t._meta:{},runtimeOutputSource:n}};return(Array.isArray(e._artifacts)||Array.isArray(t._artifacts))&&(r._artifacts=Es(e._artifacts,t._artifacts)),r}function Is(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=gs(t),d=l?Je(l):null,f=i?Ts(t):null;if(Ze(o))return Ve(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||Ss(o)?o:d?P(o,M(d),"final_event"):f?P(o,M(f),"updates"):Bt(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?Bt(o,"final_event",l):{...o,output:l,_meta:{...c(o._meta)?o._meta:{},runtimeOutputSource:"final_event"}};let m=_s(fs(t));if(!m)return o;let g=Je(m);return g?P(o,M(g),"updates"):s?Bt(o,"updates",m):{...o,output:m,_meta:{...c(o._meta)?o._meta:{},runtimeOutputSource:"updates"}}}var gt=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=W(),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=D(t)==="openclaw"?$(this.config.openClawSessionIdleTtlMs,Xr):$(this.config.sessionIdleTtlMs,Jr);return $(t?.sessionIdleTtlMs??t?.idleTtlMs,r)}targetMaxSessions(t,n=null){let s=D(t)==="openclaw"?$(this.config.openClawMaxSessions,Yr):$(this.config.maxSessionsPerTarget,Vr),i=$(t?.maxSessions,s),o=Kt(n);return o?Math.max(i,o):i}targetReleaseAfterPrompt(t,n={}){let r=D(t),s=c(n?._runtimeBridge)?n._runtimeBridge:{},i=zt(s);return i!==void 0?Z(i,!1):Z(t?.releaseAfterPrompt??t?.disposeAfterPrompt,r==="openclaw")}promptReleaseAfterPrompt(t,n={}){let r=c(n?._runtimeBridge)?n._runtimeBridge:{},s=zt(r);return s!==void 0?Z(s,t.releaseAfterPrompt):t.releaseAfterPrompt}startSessionCleanup(){let t=$(this.config.sessionCleanupIntervalMs,Wr);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=Kt(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:W(),runtimeKind:D(s),runtimeMaxSessions:je(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 at(t,r,n,i,o):s==="cli"?new pt(t,r,o):new rt(t)}async prompt(t,n={}){let r=a(t.agentId),s=a(t.sessionId)||mt();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=je(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:g,target:h}=this.targetFor(i.targetCode);await this.reserveTargetSlot(g,h,{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:c(t.metadata)?t.metadata:{}}),x=Date.now();d={agentId:r,sessionId:s,runtime:y,targetCode:g,runtimeKind:D(h),runtimeSessionId:a(c(U)?U.sessionId:"")||s,idleTtlMs:this.targetIdleTtlMs(h),releaseAfterPrompt:this.targetReleaseAfterPrompt(h,t.metadata),createdAtMs:x,lastUsedAtMs:x,busy:!1,createdAt:W()},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=[],m=g=>{let h=ts(g,s,d);f.push(h),n.onUpdate?.(h)};try{let g=await d.runtime.sessionPrompt({sessionId:d.runtimeSessionId,prompt:Array.isArray(t.prompt)?t.prompt:[],metadata:c(t.metadata)?t.metadata:{}},m),h=c(t.metadata)?t.metadata:{},y=c(h._runtimeBridge)?h._runtimeBridge:{},U=Is(g,f,y);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=ls(t),d=Xe(t),{target:f}=this.targetFor(t.targetCode||t.framework),m=[{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  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 ${$e} and ${He}.`:"",d?`Then put a JSON object containing _decision between ${ve} and ${Be}.`:"",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:m,metadata:us(t,f)},n)}async requestPermission({agent:t,runtimeSessionId:n,request:r,emitUpdate:s}){let i=mt(),u=this.runtimeSessionIndex.get(`${t.agentId}:${n}`)?.sessionId||n||mt(),l={permissionId:i,agentId:t.agentId,sessionId:u,runtimeSessionId:n,request:c(r)?r:{},status:"pending",createdAt:W()};return s?.({sessionId:n,update:{sessionUpdate:"permission_request",permission:l}}),await new Promise(d=>{let f=T(r?.timeoutMs,this.config.permissionRequestTimeoutMs),m=setTimeout(()=>{this.pendingPermissions.delete(i),d({permissionId:i,outcome:"denied",response:{reason:"permission request timed out"}})},f);this.pendingPermissions.set(i,{timer:m,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: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 xs from"node:http";import Os from"node:https";import{randomBytes as Qe}from"node:crypto";var j=1,H=3,Cs=1e4,_t=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=As(n.connectTimeoutMs,Cs),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:"?Os:xs,r=Qe(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(qt(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(qt(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),m=this.buffer.readUInt32BE(u+4);o=f*2**32+m,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((m,g)=>m^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(qt(10,d))}}};function As(e,t){let n=Number.parseInt(String(e??""),10);return Number.isFinite(n)&&n>=0?n:t}function qt(e,t){let n=t.length,r=2;n>=126&&n<=65535?r+=2:n>65535&&(r+=8);let s=Qe(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 Ns(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 Ms(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=Ns(this.config.orchaUrl),n=new _t(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:Ms(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!==j?!1:(n.send(JSON.stringify(t)),!0)}};import{existsSync as Us,readFileSync as bs}from"node:fs";import{resolve as tn}from"node:path";var ks=/^[A-Za-z_][A-Za-z0-9_]*$/;function en(e=process.env,t=process.cwd()){let n=a(e.ORCHA_RUNTIME_ENV_FILE),r=n?tn(t,n):tn(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=bs(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 nn(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:Ls(e.ORCHA_RUNTIME_TARGETS_JSON||"")}}function Ls(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(!ks.test(s))return null;let i=Ds(n.slice(r+1).trim());return[s,i]}function Ds(e){if(!e)return"";let t=e[0];if((t==='"'||t==="'")&&e.endsWith(t)){let n=e.slice(1,-1);return t==='"'?Fs(n):n}return $s(e).trim()}function Fs(e){return e.replaceAll("\\n",`
|
|
17
|
+
`).replaceAll("\\r","\r").replaceAll("\\t"," ").replaceAll('\\"','"').replaceAll("\\\\","\\")}function $s(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 Hs}from"node:http";function yt(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 Jt(e,t,n){return{ok:!1,error:{code:e,message:t,...n===void 0?{}:{detail:n}}}}async function rn(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 sn(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 on(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 Hs(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){yt(s,404,Jt("NOT_FOUND",`No route for ${o}`));return}try{sn(r,e.token);let l=r.method==="GET"?{}:await rn(r,e.requestLimitBytes);yt(s,200,await u(l))}catch(l){let d=l.status||500,f=l.code||"BRIDGE_INTERNAL";yt(s,d,Jt(f,l.message||String(l)))}})}var Js=qs(import.meta.url),Ws=".orcha-runtime-bridge.pid",Vs=".orcha-runtime-bridge.log",Xs=3,Ys=36e5,{command:Zs,options:gn}=ni(process.argv.slice(2));ri(gn);en();var Qs=nn();await ti(Zs,Qs,gn);async function ti(e,t,n){switch(e){case"run":case"foreground":cn(t);return;case"start":if(n.foreground){cn(t);return}ln();return;case"reload":case"restart":await dn({quiet:!0}),ln();return;case"stop":await dn();return;case"status":ei();return;case"help":case"--help":case"-h":ai();return;default:throw new Error(`Unknown command: ${e}`)}}function cn(e){si();let t=new gt(e);if(e.mode==="server"){let r=on(e,t);un({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);un({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 un({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 ln(){let e=Zt(),t=_n(),n=Qt(e);if(n&&G(n)){console.log(JSON.stringify({status:"already_running",pid:n,pidFile:e,logFile:t}));return}n&&Xt(e),pn(e),pn(t),Vt(t);let r=zs(t,"a"),s={...process.env,ORCHA_RUNTIME_PID_FILE:e,ORCHA_RUNTIME_LOG_FILE:t},i=vs(process.execPath,[Js,"run"],{cwd:process.cwd(),detached:!0,env:s,stdio:["ignore",r,r]});i.unref(),Bs(r),hn(e,`${i.pid}
|
|
18
|
+
`),console.log(JSON.stringify({status:"started",pid:i.pid,pidFile:e,logFile:t}))}async function dn({quiet:e=!1}={}){let t=Zt(),n=Qt(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 fn(n,1e4)&&G(n)&&(process.kill(n,"SIGKILL"),await fn(n,3e3)),Xt(t),e||console.log(JSON.stringify({status:"stopped",pid:n,pidFile:t}))}function ei(){let e=Zt(),t=_n(),n=Qt(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 ni(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 ri(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 Zt(){return Yt(process.cwd(),process.env.ORCHA_RUNTIME_PID_FILE||Ws)}function _n(){return Yt(process.cwd(),process.env.ORCHA_RUNTIME_LOG_FILE||Vs)}function si(){let e=process.env.ORCHA_RUNTIME_LOG_FILE;if(!e)return;let t=Tn();if(t<=0)return;let n=Yt(process.cwd(),e);Vt(n,t);let r=oi();r<=0||setInterval(()=>Vt(n,t),r).unref()}function Vt(e,t=Tn()){if(t<=0||!mn(e))return;let n=0,r="";try{if(n=an(e).size,n<=0)return;r=Wt(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&&(ii(d,s)?o.push(d):u+=1);if(u===0)return;let l="";try{an(e).size>n&&(l=Wt(e,"utf8").slice(r.length));let f=[...o,...l.split(/\r?\n/).filter(Boolean)].join(`
|
|
19
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
|
|
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 ii(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 Tn(){return yn(process.env.ORCHA_RUNTIME_LOG_RETENTION_DAYS,Xs)}function oi(){return yn(process.env.ORCHA_RUNTIME_LOG_CLEANUP_INTERVAL_MS,Ys)}function yn(e,t){let n=Number.parseInt(String(e??""),10);return Number.isFinite(n)&&n>=0?n:t}function Qt(e){if(!mn(e))return null;let t=Number.parseInt(Wt(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 fn(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 pn(e){Ks(Gs(e),{recursive:!0})}function Xt(e){try{js(e,{force:!0})}catch{}}function ai(){console.log(`Usage: orcha-runtime-bridge [command] [options]
|
|
21
21
|
|
|
22
22
|
Commands:
|
|
23
23
|
run, foreground Run in the foreground. This is the default.
|