@orcha-ai/runtime-bridge 0.1.23 → 0.1.24
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/README.md +4 -3
- package/bin/orcha-runtime-bridge.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -168,9 +168,10 @@ target lifecycle. Set `"dispatchReleaseAfterPrompt": false` on a target only
|
|
|
168
168
|
when task dispatch should intentionally reuse the same ACP process.
|
|
169
169
|
|
|
170
170
|
Generic ACP-compatible targets receive `mcpServers` in `session/new`. When
|
|
171
|
-
omitted in target config, the bridge sends an empty array. OpenClaw targets
|
|
172
|
-
|
|
173
|
-
|
|
171
|
+
omitted in target config, the bridge sends an empty array. OpenClaw targets
|
|
172
|
+
always receive an empty `mcpServers` array, because the field is required by the
|
|
173
|
+
ACP schema while OpenClaw bridge mode requires actual MCP servers to be
|
|
174
|
+
configured on the OpenClaw gateway or agent instead.
|
|
174
175
|
|
|
175
176
|
OpenClaw targets use request metadata `agentCode` as the local OpenClaw agent
|
|
176
177
|
id, producing sessions like `agent:<agentCode>:<sessionId>`. When `agentCode`
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{spawn as _s}from"node:child_process";import{closeSync as ys,existsSync as tn,mkdirSync as Ss,openSync as ws,readFileSync as Gt,rmSync as Rs,statSync as We,writeFileSync as en}from"node:fs";import{dirname as Es,resolve as jt}from"node:path";import{fileURLToPath as xs}from"node:url";import{randomUUID as dt}from"node:crypto";var B="0.1.
|
|
2
|
+
import{spawn as _s}from"node:child_process";import{closeSync as ys,existsSync as tn,mkdirSync as Ss,openSync as ws,readFileSync as Gt,rmSync as Rs,statSync as We,writeFileSync as en}from"node:fs";import{dirname as Es,resolve as jt}from"node:path";import{fileURLToPath as xs}from"node:url";import{randomUUID as dt}from"node:crypto";var B="0.1.24";function j(){return new Date().toISOString()}function R(e,t=2){return String(e).padStart(t,"0")}function ee(e){let t=e>=0?"+":"-",n=Math.abs(e);return`${t}${R(Math.floor(n/60))}:${R(n%60)}`}function un(e){let t=-e.getTimezoneOffset();return[`${e.getFullYear()}-${R(e.getMonth()+1)}-${R(e.getDate())}`,`T${R(e.getHours())}:${R(e.getMinutes())}:${R(e.getSeconds())}.${R(e.getMilliseconds(),3)}`,ee(t)].join("")}function ln(e,t){let n=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}),r={};for(let s of n.formatToParts(e))s.type!=="literal"&&(r[s.type]=Number(s.value));return r}function dn(e,t){let n=ln(e,t),r=Date.UTC(n.year,n.month-1,n.day,n.hour,n.minute,n.second,e.getMilliseconds()),s=Math.round((r-e.getTime())/6e4);return[`${n.year}-${R(n.month)}-${R(n.day)}`,`T${R(n.hour)}:${R(n.minute)}:${R(n.second)}.${R(e.getMilliseconds(),3)}`,ee(s)].join("")}function fn(e=new Date){let t=a(process.env.ORCHA_RUNTIME_LOG_TIMEZONE||process.env.TZ||"Asia/Shanghai");try{return dn(e,t)}catch{return un(e)}}function c(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function a(e){return String(e??"").trim()}function T(e,t){let n=Number.parseInt(String(e??""),10);return Number.isFinite(n)?n:t}function E(e){return Array.isArray(e)?e.map(String):[]}var pn="[redacted]",te=/(authorization|api[_-]?key|credential|password|secret|token)/i;function K(e,t=new WeakSet){if(e==null)return e;if(typeof e=="bigint")return e.toString();if(typeof e!="object")return e;if(e instanceof Date)return e.toISOString();if(e instanceof Error){if(t.has(e))return"[circular]";t.add(e);let s={name:e.name,message:e.message};e.stack&&(s.stack=e.stack);for(let i of Object.keys(e))s[i]=K(e[i],t);return t.delete(e),s}if(t.has(e))return"[circular]";if(t.add(e),Array.isArray(e)){let s=e.map(i=>K(i,t));return t.delete(e),s}let n={},r=te.test(a(e.name||e.key));for(let[s,i]of Object.entries(e))n[s]=te.test(s)||r&&s.toLowerCase()==="value"?pn:K(i,t);return t.delete(e),n}function ne(e,t=4e3){let n=JSON.stringify(K(e))??String(e);return!Number.isFinite(t)||n.length<=t?n:`${n.slice(0,t)}...`}function p(e,t,n,r={}){let s={ts:fn(),level:e,module:t,msg:n,...c(r)?K(r):{}};console.error(JSON.stringify(s))}function Q(e){return Array.isArray(e)?e.map(t=>c(t)?t.type==="text"?a(t.text):t.type==="file"?a(t.uri):t.type==="image"?a(t.uri):"":"").filter(Boolean).join(`
|
|
3
3
|
`):""}var tt=class{constructor(t){this.agent=t,this.sessionCounter=0}async sessionNew(){return this.sessionCounter+=1,{sessionId:`echo-${this.agent.agentId}-${this.sessionCounter}`}}async sessionPrompt(t,n){let r=Q(t.prompt);return n({sessionId:t.sessionId,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:r?`Echo runtime received: ${r}`:"Echo runtime received an empty prompt."}}}),{stopReason:"end_turn"}}async sessionCancel(){return{ok:!0}}};import{spawn as hn}from"node:child_process";var W="2.0",mn=3e4;function gn(e){return{code:Number.isInteger(e?.code)?e.code:-32e3,message:a(e?.message)||String(e),data:c(e?.data)?e.data:void 0}}function Tn(e){if(!c(e))return new Error(String(e||"runtime error"));let t=a(e.message)||"runtime error",n="data"in e?ne(e.data,4e3):"",r=new Error(n?`${t}; data=${n}`:t);return r.rpcCode=e.code,r.data=e.data,r}function _n(e){return c(e)&&"id"in e&&!("method"in e)}function yn(e){return c(e)&&typeof e.method=="string"&&"id"in e}function Sn(e){return c(e)&&typeof e.method=="string"&&!("id"in e)}var et=class{constructor({command:t,args:n=[],cwd:r,env:s,label:i,framing:o="line",detached:u=!0}){this.command=t,this.args=Array.isArray(n)?n.map(String):[],this.cwd=r||process.cwd(),this.env={...process.env,...c(s)?s:{}},this.label=i||t,this.framing=o==="content-length"?"content-length":"line",this.detached=u!==!1,this.child=null,this.exited=!1,this.exitCode=null,this.exitSignal=null,this.stopPromise=null,this.lineBuffer="",this.headerBuffer=Buffer.alloc(0),this.seq=0,this.pending=new Map,this.notificationHandlers=new Map,this.requestHandlers=new Map,this.exitHandlers=new Set}async start({initialize:t=!0,initializeParams:n={}}={}){this.child&&!this.exited||(this.exited=!1,this.exitCode=null,this.exitSignal=null,this.child=hn(this.command,this.args,{cwd:this.cwd,env:this.env,stdio:["pipe","pipe","pipe"],detached:this.detached}),this.child.stdout.on("data",r=>this.onStdout(r)),this.child.stderr.setEncoding("utf8"),this.child.stderr.on("data",r=>{let s=r.trimEnd();s&&p("debug","runtime.stderr","runtime stderr",{target:this.label,text:s})}),this.child.on("exit",(r,s)=>this.handleExit(r,s)),this.child.on("error",r=>this.rejectAll(r)),t&&await this.call("initialize",{protocolVersion:1,clientCapabilities:{},...n}).catch(r=>{throw Object.assign(new Error(`runtime initialize failed: ${r.message}`),{code:"RUNTIME_INITIALIZE_FAILED"})}))}onStdout(t){if(this.framing==="content-length"){this.onContentLengthData(Buffer.isBuffer(t)?t:Buffer.from(t));return}this.onLineData(t.toString("utf8"))}onLineData(t){this.lineBuffer+=t;let n=this.lineBuffer.split(/\r?\n/);this.lineBuffer=n.pop()||"";for(let r of n){let s=r.trim();s&&this.dispatchRaw(s)}}onContentLengthData(t){for(this.headerBuffer=Buffer.concat([this.headerBuffer,t]);this.headerBuffer.length>0;){let n=this.headerBuffer.indexOf(`\r
|
|
4
4
|
\r
|
|
5
5
|
`);if(n<0)return;let s=this.headerBuffer.subarray(0,n).toString("utf8").match(/content-length:\s*(\d+)/i);if(!s){p("warn","runtime.protocol","missing Content-Length header",{target:this.label}),this.headerBuffer=Buffer.alloc(0);return}let i=Number.parseInt(s[1],10),o=n+4,u=o+i;if(this.headerBuffer.length<u)return;let l=this.headerBuffer.subarray(o,u).toString("utf8");this.headerBuffer=this.headerBuffer.subarray(u),this.dispatchRaw(l)}}dispatchRaw(t){let n;try{n=JSON.parse(t)}catch(r){p("warn","runtime.protocol","invalid JSON frame",{target:this.label,error:String(r)});return}this.dispatch(n)}dispatch(t){if(_n(t)){this.resolveResponse(t);return}if(yn(t)){this.handleRequest(t);return}Sn(t)&&this.handleNotification(t)}resolveResponse(t){let n=String(t.id),r=this.pending.get(n);r&&(clearTimeout(r.timer),this.pending.delete(n),t.error?(p("warn","runtime.protocol","runtime rpc error",{target:this.label,method:r.method,requestId:n,error:t.error}),r.reject(Tn(t.error))):r.resolve(t.result))}async handleRequest(t){let n=this.requestHandlers.get(t.method);if(!n){this.writeFrame({jsonrpc:W,id:t.id,error:{code:-32601,message:`method not found: ${t.method}`}});return}try{let r=await n(c(t.params)?t.params:{},t);this.writeFrame({jsonrpc:W,id:t.id,result:r??{}})}catch(r){this.writeFrame({jsonrpc:W,id:t.id,error:gn(r)})}}handleNotification(t){let n=this.notificationHandlers.get(t.method);if(n)for(let r of n)r(c(t.params)?t.params:{},t)}call(t,n={},r=mn){if(!this.child||!this.child.stdin||this.exited)return Promise.reject(new Error("runtime process is not running"));let s=`${t}_${++this.seq}`,i={jsonrpc:W,id:s,method:t,params:n};return new Promise((o,u)=>{let l=setTimeout(()=>{this.pending.delete(s),u(new Error(`${t} timed out after ${r}ms`))},r);this.pending.set(s,{resolve:o,reject:u,timer:l,method:t}),this.writeFrame(i,d=>{d&&(clearTimeout(l),this.pending.delete(s),u(d))})})}notify(t,n={}){this.writeFrame({jsonrpc:W,method:t,params:n})}writeFrame(t,n){if(!this.child?.stdin||this.exited){n?.(new Error("runtime process is not running"));return}let r=JSON.stringify(t),s=this.framing==="content-length"?`Content-Length: ${Buffer.byteLength(r,"utf8")}\r
|
|
6
6
|
\r
|
|
7
7
|
${r}`:`${r}
|
|
8
|
-
`;this.child.stdin.write(s,n)}onNotification(t,n){let r=this.notificationHandlers.get(t)||new Set;return r.add(n),this.notificationHandlers.set(t,r),()=>{r.delete(n),r.size===0&&this.notificationHandlers.delete(t)}}onRequest(t,n){return this.requestHandlers.set(t,n),()=>this.requestHandlers.delete(t)}onExit(t){return this.exitHandlers.add(t),()=>this.exitHandlers.delete(t)}rejectAll(t){for(let n of this.pending.values())clearTimeout(n.timer),n.reject(t);this.pending.clear()}handleExit(t,n){this.exited=!0,this.exitCode=t,this.exitSignal=n,this.rejectAll(new Error(`runtime exited before response (${t}/${n})`));for(let r of this.exitHandlers)r(t,n)}async waitForExit(t=5e3){return!this.child||this.exited?!0:await new Promise(n=>{let r=setTimeout(()=>{s(),n(!1)},t);r.unref?.();let s=()=>{clearTimeout(r),this.exitHandlers.delete(i)},i=()=>{s(),n(!0)};this.exitHandlers.add(i),this.exited&&i()})}signal(t){if(!this.child||this.exited)return!1;let n=this.child.pid;if(!n)return!1;try{return this.detached&&process.platform!=="win32"?process.kill(-n,t):this.child.kill(t),!0}catch(r){if(r?.code==="ESRCH")return this.exited=!0,!1;try{return this.child.kill(t),!0}catch(s){return s?.code!=="ESRCH"&&p("warn","runtime","runtime signal failed",{target:this.label,pid:n,signal:t,error:String(s)}),!1}}}async stop(t="stop",{termTimeoutMs:n=5e3,killTimeoutMs:r=2e3}={}){if(!(!this.child||this.exited)){if(this.stopPromise)return await this.stopPromise;this.stopPromise=(async()=>{if(!this.child||this.exited)return;let s=this.child.pid;p("info","runtime","stopping runtime",{target:this.label,reason:t,pid:s}),this.rejectAll(new Error(`runtime stopped: ${t}`)),this.signal("SIGTERM"),!await this.waitForExit(n)&&this.child&&!this.exited&&(p("warn","runtime","runtime did not exit after SIGTERM; force killing",{target:this.label,reason:t,pid:s}),this.signal("SIGKILL"),await this.waitForExit(r))})();try{await this.stopPromise}finally{this.stopPromise=null}}}};import{randomUUID as ie}from"node:crypto";import{existsSync as wn,readFileSync as Rn,realpathSync as re,statSync as En}from"node:fs";import{basename as oe,extname as ae,isAbsolute as xn,relative as In}from"node:path";var Cn=25*1024*1024;function ce(e,t=""){let n=a(t);if(n)return n;let r=ae(a(e)).toLowerCase();return r===".jpg"||r===".jpeg"?"image/jpeg":r===".webp"?"image/webp":r===".gif"?"image/gif":"image/png"}function ue(e,t){let n=typeof e=="string"?e.trim():"";return!n||n==="<omitted>"?"":n.startsWith("data:")?n:`data:${t};base64,${n.replace(/\s+/g,"")}`}function nt(e){if(Array.isArray(e))return e.map(a).filter(Boolean);let t=a(e);return t?[t]:[]}function On(e,t){let n=In(t,e);return n===""||!!n&&!n.startsWith("..")&&!xn(n)}function An(e,t){let n=a(e);if(!n||!wn(n))return"";try{let r=re(n);for(let s of t)try{let i=re(s);if(On(r,i))return r}catch{}}catch{return""}return""}function Et(e,t,n={}){let r=a(e);return!r||r.startsWith("data:")||/^https?:\/\//i.test(r)?r:Mn(r,t,n)}function Mn(e,t,n={}){let r=[...nt(n.trustedFileRoots),...nt(n.trustedFileRoot),...nt(n.artifactRoots),...nt(n.artifactRoot)],s=An(e,r);if(!s)return"";try{let i=En(s);return!i.isFile()||i.size<=0||i.size>Cn?"":`data:${t};base64,${Rn(s).toString("base64")}`}catch{return""}}function _(...e){for(let t of e){let n=a(t);if(n)return n}return""}function Un(e,t,n,r){let s=n.toLowerCase();if(s==="image"||s==="picture")return!0;let i=_(r,e.previewUrl,e.fileUrl,e.imageUrl,e.dataUrl,e.url,e.uri,t.previewUrl,t.fileUrl,t.imageUrl,t.dataUrl,t.url,t.uri),o=ae(i.split("?",1)[0].split("#",1)[0]).toLowerCase();return[".png",".jpg",".jpeg",".webp",".gif"].includes(o)}function It(e,t={}){let{source:n="runtime_image_generation_event"}=t;if(!c(e))return null;let r=c(e.payload)?e.payload:{},s=a(e.type),i=a(r.type);if(!(s==="event_msg"&&i==="image_generation_end"||s==="response_item"&&i==="image_generation_call"))return null;let o=_(r.call_id,r.id),u=_(r.saved_path,r.savedPath),l=_(r.revised_prompt,r.revisedPrompt),d=ce(u,r.mimeType||r.mime_type),f=ue(r.result,d)||Et(u,d,t);if(!f)return null;let h=f.startsWith("data:")?f:"",m=u?oe(u):`${o||ie()}.png`;return{artifactType:"image",type:"image",fieldKey:"image",title:m||"Generated image",summary:l||"Generated image",content:{prompt:l||void 0,dataUrl:h||void 0,imageUrl:f,previewUrl:f,fileUrl:f,mimeType:d},dataUrl:h||void 0,previewUrl:f,fileUrl:f,metadata:{source:n,eventType:i,callId:o||void 0,savedPath:u||void 0,filename:m,mimeType:d,revisedPrompt:l||void 0}}}function Nn(e){let t=c(e)?e:{},n=[];for(let r of["_artifacts","artifacts"]){let s=t[r];Array.isArray(s)&&n.push(...s)}for(let r of["_artifact","artifact"]){let s=t[r];c(s)&&n.push(s)}return n}function bn(e,t={}){let{source:n="runtime_artifact"}=t,r=c(e)?e:{};if(!Object.keys(r).length)return null;let s=c(r.content)?{...r.content}:{},i=c(r.metadata)?{...r.metadata}:{},o=_(r.saved_path,r.savedPath,s.saved_path,s.savedPath,i.savedPath),u=_(r.mimeType,r.mime_type,s.mimeType,s.mime_type,i.mimeType),l=_(r.artifactType,r.artifact_type,r.type,r.kind,s.type,o?"image":"file"),d=Un(r,s,l,o),f=d?ce(o,u):u;if(d){let x=_(r.dataUrl,s.dataUrl),O=x.startsWith("data:")?x:"",N=_(r.imageUrl,r.previewUrl,r.fileUrl,r.downloadUrl,r.url,r.uri,s.imageUrl,s.previewUrl,s.fileUrl,s.downloadUrl,s.url,s.uri),g=ue(r.result??s.result,f)||O||Et(o,f,t)||Et(N,f,t);g&&(g.startsWith("data:")&&(s.dataUrl||=g),s.imageUrl||=g,s.previewUrl||=g,s.fileUrl||=g,f&&(s.mimeType||=f))}for(let[x,O]of[["prompt","prompt"],["previewUrl","previewUrl"],["fileUrl","fileUrl"],["downloadUrl","downloadUrl"],["imageUrl","imageUrl"],["dataUrl","dataUrl"],["url","url"],["uri","uri"],["mimeType","mimeType"],["mime_type","mimeType"]]){let N=r[x];N!=null&&N!==""&&!(O in s)&&(s[O]=N)}let h=_(r.fileUrl,r.downloadUrl,r.imageUrl,r.dataUrl,r.url,r.uri,s.fileUrl,s.downloadUrl,s.imageUrl,s.dataUrl,s.url,s.uri),m=_(r.previewUrl,r.imageUrl,r.dataUrl,r.url,r.fileUrl,r.uri,s.previewUrl,s.imageUrl,s.dataUrl,s.url,s.fileUrl,s.uri),y=_(r.dataUrl,s.dataUrl,h.startsWith("data:")?h:"",m.startsWith("data:")?m:""),S=_(r.filename,i.filename,o?oe(o):""),U=_(r.fieldKey,r.field_key,s.fieldKey,i.fieldKey,d?"image":"artifact");return{...r,artifactType:l,type:r.type||l,fieldKey:U,title:_(r.title,S,"Runtime artifact"),summary:_(r.summary,s.prompt,r.title,S,"Runtime artifact"),content:s,dataUrl:y||void 0,fileUrl:h||void 0,previewUrl:m||void 0,metadata:{...i,source:_(i.source,n),savedPath:o||i.savedPath,filename:S||i.filename,mimeType:f||i.mimeType}}}function rt(e,t){if(!t||!e)return;let n=c(t.metadata)?t.metadata:{},r=_(n.savedPath,n.callId,t.previewUrl,t.fileUrl)||ie(),s=e.get(r);if(!s){e.set(r,t);return}s.content={...c(s.content)?s.content:{},...c(t.content)?t.content:{}},s.metadata={...c(s.metadata)?s.metadata:{},...n},s.previewUrl=t.previewUrl||s.previewUrl,s.fileUrl=t.fileUrl||s.fileUrl,s.summary=t.summary||s.summary,s.title=t.title||s.title}function xt(e,t,n={}){for(let r of Nn(e))rt(t,bn(r,n))}function Ct(e){if(!c(e)||!c(e.payload))return c(e)?e:{value:e};let t=a(e.payload.type);if(t!=="image_generation_end"&&t!=="image_generation_call")return e;let n={...e.payload};return typeof n.result=="string"&&n.result&&(n.result="<omitted>",n.resultLength=e.payload.result.length),{...e,payload:n}}function se(e,t,n){if(!c(e))return e;let r=c(e.event)?e.event:null;return r?(rt(t,It(r,n)),{...e,event:Ct(r)}):e}function le(e,t,n={}){if(!c(e))return e;xt(e,t,n);let r=se(e,t,n),s=c(r.update)?se(r.update,t,n):null;return s&&s!==r.update&&(r={...r,update:s}),r}function de(e,t,n={}){let r=c(e)?{...e}:{};xt(r,t,n),xt(c(r.output)?r.output:{},t,n);let s=[...t?.values?.()||[]];return s.length&&(r._artifacts=s),delete r.artifacts,r}var z=class{constructor(t,n,r={},s={}){this.agent=t,this.target=n,this.callbacks=r,this.options=s,this.proc=null,this.permissionHandlers=new Map}async ensureStarted(){if(this.proc)return;let t=a(this.target.command);if(!t)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);this.proc=new et({command:t,args:E(this.target.args),cwd:a(this.target.cwd)||this.agent.workspace||process.cwd(),env:c(this.target.env)?this.target.env:{},label:`${this.agent.agentId}:${this.agent.targetCode}`,framing:a(this.target.framing||"line")}),this.proc.onRequest("session/request_permission",n=>this.handlePermissionRequest(n)),this.proc.onRequest("session/requestPermission",n=>this.handlePermissionRequest(n)),await this.proc.start({initialize:this.target.initialize!==!1,initializeParams:{clientInfo:{name:"orcha-runtime-bridge",version:B},...c(this.target.initializeParams)?this.target.initializeParams:{}}})}async sessionNew(t={}){return await this.ensureStarted(),this.proc.call("session/new",this.sessionNewParams(t))}sessionNewParams(t={}){let n=Array.isArray(t.mcpServers)?t.mcpServers:Array.isArray(this.target.mcpServers)?this.target.mcpServers:[];return{...t,mcpServers:n}}async sessionPrompt(t,n){await this.ensureStarted();let r=a(t.sessionId),s=new Map,i=this.artifactOptions(),o=this.proc.onNotification("session/update",l=>{let d=a(l.sessionId);(!d||d===r)&&n(le(l,s,i))}),u=async l=>this.callbacks.onPermissionRequest?.({agent:this.agent,runtimeSessionId:r,request:l,emitUpdate:n})||{outcome:"denied",reason:"permission handler is not configured"};r&&this.permissionHandlers.set(r,u),this.permissionHandlers.set("*",u);try{let l=await this.proc.call("session/prompt",t,this.options.sessionPromptTimeoutMs);return de(l,s,i)}finally{o(),r&&this.permissionHandlers.delete(r),this.permissionHandlers.delete("*")}}async sessionCancel(t){return await this.ensureStarted(),this.proc.call("session/cancel",t,5e3).catch(()=>({ok:!0}))}async handlePermissionRequest(t){let n=a(t.sessionId),r=this.permissionHandlers.get(n)||this.permissionHandlers.get("*");return r?r(t):{outcome:"denied",reason:"no active Orcha permission handler"}}artifactSource(){return a(this.target.type||"acp")==="openclaw"?"openclaw_image_generation":"acp_runtime_image_generation"}artifactOptions(){let t=c(this.target.env)?this.target.env:{};return{source:this.artifactSource(),trustedFileRoots:[a(this.target.artifactRoot),a(this.target.artifactDir),a(this.target.runtimeArtifactRoot),a(t.ORCHA_RUNTIME_ARTIFACT_DIR),...E(this.target.trustedArtifactRoots),...E(this.target.trustedFileRoots),...E(this.target.artifactRoots),...E(this.target.artifactFileRoots)].filter(Boolean)}}async stop(t){await this.proc?.stop(t)}};function kn(e){let t=c(e.metadata)?e.metadata:{};return a(t.agentCode)}function Pn(e,t){let n=kn(e);return n?`agent:${n}:${t}`:`orcha-${t}`}var st=class extends z{constructor(t,n,r,s={},i={}){let o=a(r).replace(/[^A-Za-z0-9._-]+/g,"-")||"default",u=a(n.command)||"openclaw",l=Array.isArray(n.args)?n.args.map(String):[],d=l.length>0?l:["acp","--session",Pn(t,o)];super(t,{...n,command:u,args:d},s,i)}sessionNewParams(t={}){let n={...t};return delete n.mcpServers,n}};import{spawn as Ln}from"node:child_process";import{randomUUID as J}from"node:crypto";import{existsSync as ge,mkdirSync as Fn,readdirSync as Te,readFileSync as _e,realpathSync as ct,rmSync as Dn,rmdirSync as $n,statSync as Hn,unlinkSync as vn}from"node:fs";import{homedir as Bn,tmpdir as ye}from"node:os";import{basename as Se,dirname as zn,join as A,resolve as fe}from"node:path";var Gn=36e5,qn=5e3,Kn=2*60*1e3,jn=2*60*1e3,Wn=12,Jn=1e3,Xn=1500,it=24*60*60*1e3,X=new Set(["final_answer","final","complete","completed","done"]);function ot(e,t){try{e.kill(t)}catch{}}function C(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(t=>C(t)).join("");if(!c(e))return"";for(let t of["text","delta","output_text","content","message","output"]){let n=C(e[t]);if(n)return n}return""}function we(e){if(!c(e))return"";let t=c(e.payload)?e.payload:{};if(a(e.type)==="event_msg"){if(a(t.type)==="agent_message")return a(t.message);if(a(t.type)==="task_complete")return a(t.last_agent_message)}if(a(e.type)==="response_item"&&a(t.type)==="message"&&a(t.role)==="assistant")return C(t.content)||C(t.message);let n=C(e.delta)||C(e.text)||C(e.content);if(n)return n;let r=c(e.item)?e.item:{};return a(r.role)==="assistant"||a(r.type)==="message"?C(r.content)||C(r.text)||C(r.message):""}function Re(e,t={}){return It(e,{source:"codex_cli_image_generation",...t})}function Ee(e,t){rt(e.artifacts,t)}function xe(e){return Ct(e)}function Ut(e){if(!c(e))return!1;let t=c(e.payload)?e.payload:{},n=a(e.type),r=a(t.type);if(n==="event_msg"&&r==="task_complete")return!0;let s=a(t.phase||t.status||t.stage).toLowerCase();return n==="event_msg"&&r==="agent_message"||n==="response_item"&&r==="message"&&a(t.role)==="assistant"?X.has(s):!1}function pe(e){return c(e)?a(e.phase||e.status||e.stage).toLowerCase():""}function Vn(e){if(!c(e)||Ut(e))return!1;let t=c(e.payload)?e.payload:{},n=a(e.type),r=a(t.type),s=pe(t);if(n==="event_msg"&&r==="agent_message"||n==="response_item"&&r==="message"&&a(t.role)==="assistant")return!!(s&&!X.has(s));let i=c(e.item)?e.item:{},o=pe(i);return a(i.role)==="assistant"||a(i.type)==="message"?!!(o&&!X.has(o)):!1}function Yn(e,t,n){return n.captureLastMessage===!1||t.includes("--output-last-message")||t.includes("-o")?!1:n.captureLastMessage===!0?!0:Se(e)==="codex"}function Zn(e,t){return t.collectCodexTranscriptArtifacts===!1?!1:t.collectCodexTranscriptArtifacts===!0?!0:Se(e)==="codex"}function Ie(e){return Math.max(20,T(e.codexTranscriptPollMs||e.transcriptPollMs,Jn))}function Qn(e){return Math.max(0,T(e.codexFinalOutputWaitMs||e.finalOutputWaitMs,Xn))}function ut(e){if(typeof e=="boolean")return e;let t=a(e).toLowerCase();return["true","1","yes","y","on"].includes(t)?!0:["false","0","no","n","off"].includes(t)?!1:null}function Nt(e){let t=c(e?.metadata)?e.metadata:{};return c(t._runtimeBridge)?t._runtimeBridge:{}}function Ot(e){return a(Nt(e).promptKind).toLowerCase()}function tr(e,t){for(let n of[e.codexTranscriptStreaming,e.streamCodexTranscript]){let r=ut(n);if(r!=null)return r}return Ot(t)==="chat"}function er(e,t){let n=Nt(e);for(let s of[n.emitThoughtChunks,n.streamThoughts]){let i=ut(s);if(i!=null)return i}let r=Ot(e);if(r&&r!=="chat")return!1;for(let s of[t.emitThoughtChunks,t.streamThoughts]){let i=ut(s);if(i!=null)return i}return Ot(e)==="chat"}function nr(e){let t=Nt(e);for(let n of[t.finalTextOnly,t.finalOutputOnly]){let r=ut(n);if(r!=null)return r}return null}function rr(e,t){let n=nr(e);return n??(t.finalTextOnly===!0||t.finalOutputOnly===!0?!0:(t.finalTextOnly===!1||t.finalOutputOnly===!1,!1))}function sr(e,t){return!e.finalTextOnly||t}function Ce(e,t,n,r,s=r){return!r||e.emittedTexts.has(s)?!1:(e.emittedTexts.add(s),n({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:r}}}),!0)}function Oe(e,t,n,r){return!r||e.emittedThoughtTexts.has(r)?!1:(e.emittedThoughtTexts.add(r),n({sessionId:t,update:{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:r}}}),!0)}function ir(e,t,n,r=new Set){return{target:e,promptText:t,startedAtMs:n,baselinePaths:r,matchedPath:"",disabled:!1,processedLines:new Map}}function or(e,t){let n=c(e.env)?e.env:{},r=a(e.artifactRoot||e.artifactDir||e.runtimeArtifactRoot||n.ORCHA_RUNTIME_ARTIFACT_DIR)||A(ye(),"orcha-runtime-artifacts"),s=a(t).replace(/[^A-Za-z0-9._-]+/g,"-").slice(0,80)||J(),i=A(r,s),o=A(i,J());return Fn(o,{recursive:!0}),{root:o,realRoot:ct(o),sessionRoot:i,realSessionRoot:ct(i)}}function Ae(e){return a(c(e)?e.root:e)}function he(e){let t=Ae(e),n=a(c(e)?e.sessionRoot:zn(t)),r=a(c(e)?e.realSessionRoot:"");if(n)try{if(r&&ct(n)!==r)return;$n(n)}catch{}}function ar(e,t={}){let n=Ae(e),r=a(c(e)?e.realRoot:"");if(n){try{if(r&&ct(n)!==r){p("warn","runtime.cli","runtime artifact directory cleanup skipped; path changed",{...t,artifactRoot:n});return}}catch{he(e);return}try{Dn(n,{recursive:!0,force:!0})}catch(s){p("warn","runtime.cli","runtime artifact directory cleanup failed",{...t,artifactRoot:n,error:String(s?.message||s)});return}he(e)}}function cr(e,t){return{trustedFileRoots:[t,...E(e.trustedArtifactRoots),...E(e.trustedFileRoots),...E(e.artifactRoots),...E(e.artifactFileRoots)].filter(Boolean)}}function Me(e){let t=a(e.codexSessionsRoot||e.codexSessionRoot);if(t)return t;let n=c(e.env)?e.env:{},r=a(e.codexHome||n.CODEX_HOME||process.env.CODEX_HOME)||A(Bn(),".codex");return A(r,"sessions")}function ur(e,t){let n=new Date(t),r=String(n.getFullYear()),s=String(n.getMonth()+1).padStart(2,"0"),i=String(n.getDate()).padStart(2,"0");return A(e,r,s,i)}function Ue(e,t,n){let r=new Set;for(let s of[t-it,t,t+it,n-it,n,n+it])r.add(ur(e,s));return[...r].filter(s=>ge(s))}function lr(e,t,n){let r=Me(e),s=t-Kn,i=n+jn,o=[];for(let u of Ue(r,t,n)){let l=[];try{l=Te(u)}catch{continue}for(let d of l){if(!d.endsWith(".jsonl"))continue;let f=A(u,d);try{let h=Hn(f);if(!h.isFile()||h.mtimeMs<s||h.mtimeMs>i)continue;o.push({path:f,mtimeMs:h.mtimeMs})}catch{}}}return o.sort((u,l)=>l.mtimeMs-u.mtimeMs).slice(0,Wn)}function dr(e,t,n=t){let r=Me(e),s=new Set;for(let i of Ue(r,t,n)){let o=[];try{o=Te(i)}catch{continue}for(let u of o)u.endsWith(".jsonl")&&s.add(A(i,u))}return s}function At(e,t,n=0){if(!(n>8||e===null||e===void 0)){if(typeof e=="string"){e&&t.push(e);return}if(Array.isArray(e)){for(let r of e)At(r,t,n+1);return}if(c(e))for(let r of["payload","item","text","delta","output_text","content","message","output","input","prompt","last_agent_message","revised_prompt"])r in e&&At(e[r],t,n+1)}}function Ne(e){return a(e).replace(/\s+/g," ")}function fr(e){let t=Ne(e);if(!t)return[];if(t.length<=200)return[t];let n=160,r=[0,Math.floor((t.length-n)/2),t.length-n],s=new Set,i=[];for(let o of r){let u=t.slice(Math.max(0,o),Math.max(0,o)+n).trim();u.length>=40&&!s.has(u)&&(s.add(u),i.push(u))}return i}function pr(e,t){let n=fr(t);if(!n.length)return!1;let r=[];for(let i of e)At(i,r);let s=Ne(r.join(" "));return n.every(i=>s.includes(i))}function hr(e){return e.find(t=>c(t)&&a(t.type)==="session_meta"&&c(t.payload))||null}function mr(e){let t=c(e?.payload)?e.payload:{},n=a(e?.timestamp||t.timestamp),r=Date.parse(n);return Number.isFinite(r)?r:Number.NaN}function gr(e,t,n){if(!pr(e,t.promptText))return!1;let r=hr(e);if(!r)return!1;let s=r.payload,i=a(s.originator),o=a(s.source);if(i!=="codex_exec"&&o!=="exec")return!1;let u=mr(r);if(!Number.isFinite(u)||u<t.startedAtMs-5e3||u>n+5e3)return!1;let l=a(t.target.cwd),d=a(s.cwd);return!(l&&d&&fe(l)!==fe(d))}function me(e){try{return _r(_e(e,"utf8"))}catch{return null}}function Tr(e,t,n){if(!e||e.disabled)return null;if(e.matchedPath){let s=me(e.matchedPath);return s?{path:e.matchedPath,events:s}:null}let r=[];for(let s of lr(e.target,e.startedAtMs,n)){if(e.baselinePaths.has(s.path))continue;let i=me(s.path);!i||!gr(i,e,n)||r.push({path:s.path,events:i})}return r.length!==1?(r.length>1&&(e.disabled=!0,p("warn","runtime.cli","codex transcript fallback disabled; multiple matching transcripts",{target:e.target.targetCode,sessionId:t,transcriptCount:r.length})),null):(e.matchedPath=r[0].path,p("info","runtime.cli","codex transcript stream attached",{target:e.target.targetCode,sessionId:t}),r[0])}function _r(e){let t=[];for(let n of e.split(/\r?\n/)){let r=n.trim();if(r)try{t.push(JSON.parse(r))}catch{}}return t}function yr(e){if(!c(e))return!1;let t=c(e.payload)?e.payload:{},n=a(e.type),r=a(t.type);return n==="event_msg"&&r==="image_generation_end"||n==="response_item"&&r==="image_generation_call"}function Sr(e,t,n,r){let s=we(e),i=Ut(e),o=0,u=0,l=0;if(s&&!i&&t.emitThoughtChunks&&Oe(t,n,r,s)&&(l=1),s&&i){let d=t.emittedTexts.size?`
|
|
8
|
+
`;this.child.stdin.write(s,n)}onNotification(t,n){let r=this.notificationHandlers.get(t)||new Set;return r.add(n),this.notificationHandlers.set(t,r),()=>{r.delete(n),r.size===0&&this.notificationHandlers.delete(t)}}onRequest(t,n){return this.requestHandlers.set(t,n),()=>this.requestHandlers.delete(t)}onExit(t){return this.exitHandlers.add(t),()=>this.exitHandlers.delete(t)}rejectAll(t){for(let n of this.pending.values())clearTimeout(n.timer),n.reject(t);this.pending.clear()}handleExit(t,n){this.exited=!0,this.exitCode=t,this.exitSignal=n,this.rejectAll(new Error(`runtime exited before response (${t}/${n})`));for(let r of this.exitHandlers)r(t,n)}async waitForExit(t=5e3){return!this.child||this.exited?!0:await new Promise(n=>{let r=setTimeout(()=>{s(),n(!1)},t);r.unref?.();let s=()=>{clearTimeout(r),this.exitHandlers.delete(i)},i=()=>{s(),n(!0)};this.exitHandlers.add(i),this.exited&&i()})}signal(t){if(!this.child||this.exited)return!1;let n=this.child.pid;if(!n)return!1;try{return this.detached&&process.platform!=="win32"?process.kill(-n,t):this.child.kill(t),!0}catch(r){if(r?.code==="ESRCH")return this.exited=!0,!1;try{return this.child.kill(t),!0}catch(s){return s?.code!=="ESRCH"&&p("warn","runtime","runtime signal failed",{target:this.label,pid:n,signal:t,error:String(s)}),!1}}}async stop(t="stop",{termTimeoutMs:n=5e3,killTimeoutMs:r=2e3}={}){if(!(!this.child||this.exited)){if(this.stopPromise)return await this.stopPromise;this.stopPromise=(async()=>{if(!this.child||this.exited)return;let s=this.child.pid;p("info","runtime","stopping runtime",{target:this.label,reason:t,pid:s}),this.rejectAll(new Error(`runtime stopped: ${t}`)),this.signal("SIGTERM"),!await this.waitForExit(n)&&this.child&&!this.exited&&(p("warn","runtime","runtime did not exit after SIGTERM; force killing",{target:this.label,reason:t,pid:s}),this.signal("SIGKILL"),await this.waitForExit(r))})();try{await this.stopPromise}finally{this.stopPromise=null}}}};import{randomUUID as ie}from"node:crypto";import{existsSync as wn,readFileSync as Rn,realpathSync as re,statSync as En}from"node:fs";import{basename as oe,extname as ae,isAbsolute as xn,relative as In}from"node:path";var Cn=25*1024*1024;function ce(e,t=""){let n=a(t);if(n)return n;let r=ae(a(e)).toLowerCase();return r===".jpg"||r===".jpeg"?"image/jpeg":r===".webp"?"image/webp":r===".gif"?"image/gif":"image/png"}function ue(e,t){let n=typeof e=="string"?e.trim():"";return!n||n==="<omitted>"?"":n.startsWith("data:")?n:`data:${t};base64,${n.replace(/\s+/g,"")}`}function nt(e){if(Array.isArray(e))return e.map(a).filter(Boolean);let t=a(e);return t?[t]:[]}function On(e,t){let n=In(t,e);return n===""||!!n&&!n.startsWith("..")&&!xn(n)}function An(e,t){let n=a(e);if(!n||!wn(n))return"";try{let r=re(n);for(let s of t)try{let i=re(s);if(On(r,i))return r}catch{}}catch{return""}return""}function Et(e,t,n={}){let r=a(e);return!r||r.startsWith("data:")||/^https?:\/\//i.test(r)?r:Mn(r,t,n)}function Mn(e,t,n={}){let r=[...nt(n.trustedFileRoots),...nt(n.trustedFileRoot),...nt(n.artifactRoots),...nt(n.artifactRoot)],s=An(e,r);if(!s)return"";try{let i=En(s);return!i.isFile()||i.size<=0||i.size>Cn?"":`data:${t};base64,${Rn(s).toString("base64")}`}catch{return""}}function _(...e){for(let t of e){let n=a(t);if(n)return n}return""}function Un(e,t,n,r){let s=n.toLowerCase();if(s==="image"||s==="picture")return!0;let i=_(r,e.previewUrl,e.fileUrl,e.imageUrl,e.dataUrl,e.url,e.uri,t.previewUrl,t.fileUrl,t.imageUrl,t.dataUrl,t.url,t.uri),o=ae(i.split("?",1)[0].split("#",1)[0]).toLowerCase();return[".png",".jpg",".jpeg",".webp",".gif"].includes(o)}function It(e,t={}){let{source:n="runtime_image_generation_event"}=t;if(!c(e))return null;let r=c(e.payload)?e.payload:{},s=a(e.type),i=a(r.type);if(!(s==="event_msg"&&i==="image_generation_end"||s==="response_item"&&i==="image_generation_call"))return null;let o=_(r.call_id,r.id),u=_(r.saved_path,r.savedPath),l=_(r.revised_prompt,r.revisedPrompt),d=ce(u,r.mimeType||r.mime_type),f=ue(r.result,d)||Et(u,d,t);if(!f)return null;let h=f.startsWith("data:")?f:"",m=u?oe(u):`${o||ie()}.png`;return{artifactType:"image",type:"image",fieldKey:"image",title:m||"Generated image",summary:l||"Generated image",content:{prompt:l||void 0,dataUrl:h||void 0,imageUrl:f,previewUrl:f,fileUrl:f,mimeType:d},dataUrl:h||void 0,previewUrl:f,fileUrl:f,metadata:{source:n,eventType:i,callId:o||void 0,savedPath:u||void 0,filename:m,mimeType:d,revisedPrompt:l||void 0}}}function Nn(e){let t=c(e)?e:{},n=[];for(let r of["_artifacts","artifacts"]){let s=t[r];Array.isArray(s)&&n.push(...s)}for(let r of["_artifact","artifact"]){let s=t[r];c(s)&&n.push(s)}return n}function bn(e,t={}){let{source:n="runtime_artifact"}=t,r=c(e)?e:{};if(!Object.keys(r).length)return null;let s=c(r.content)?{...r.content}:{},i=c(r.metadata)?{...r.metadata}:{},o=_(r.saved_path,r.savedPath,s.saved_path,s.savedPath,i.savedPath),u=_(r.mimeType,r.mime_type,s.mimeType,s.mime_type,i.mimeType),l=_(r.artifactType,r.artifact_type,r.type,r.kind,s.type,o?"image":"file"),d=Un(r,s,l,o),f=d?ce(o,u):u;if(d){let x=_(r.dataUrl,s.dataUrl),O=x.startsWith("data:")?x:"",N=_(r.imageUrl,r.previewUrl,r.fileUrl,r.downloadUrl,r.url,r.uri,s.imageUrl,s.previewUrl,s.fileUrl,s.downloadUrl,s.url,s.uri),g=ue(r.result??s.result,f)||O||Et(o,f,t)||Et(N,f,t);g&&(g.startsWith("data:")&&(s.dataUrl||=g),s.imageUrl||=g,s.previewUrl||=g,s.fileUrl||=g,f&&(s.mimeType||=f))}for(let[x,O]of[["prompt","prompt"],["previewUrl","previewUrl"],["fileUrl","fileUrl"],["downloadUrl","downloadUrl"],["imageUrl","imageUrl"],["dataUrl","dataUrl"],["url","url"],["uri","uri"],["mimeType","mimeType"],["mime_type","mimeType"]]){let N=r[x];N!=null&&N!==""&&!(O in s)&&(s[O]=N)}let h=_(r.fileUrl,r.downloadUrl,r.imageUrl,r.dataUrl,r.url,r.uri,s.fileUrl,s.downloadUrl,s.imageUrl,s.dataUrl,s.url,s.uri),m=_(r.previewUrl,r.imageUrl,r.dataUrl,r.url,r.fileUrl,r.uri,s.previewUrl,s.imageUrl,s.dataUrl,s.url,s.fileUrl,s.uri),y=_(r.dataUrl,s.dataUrl,h.startsWith("data:")?h:"",m.startsWith("data:")?m:""),S=_(r.filename,i.filename,o?oe(o):""),U=_(r.fieldKey,r.field_key,s.fieldKey,i.fieldKey,d?"image":"artifact");return{...r,artifactType:l,type:r.type||l,fieldKey:U,title:_(r.title,S,"Runtime artifact"),summary:_(r.summary,s.prompt,r.title,S,"Runtime artifact"),content:s,dataUrl:y||void 0,fileUrl:h||void 0,previewUrl:m||void 0,metadata:{...i,source:_(i.source,n),savedPath:o||i.savedPath,filename:S||i.filename,mimeType:f||i.mimeType}}}function rt(e,t){if(!t||!e)return;let n=c(t.metadata)?t.metadata:{},r=_(n.savedPath,n.callId,t.previewUrl,t.fileUrl)||ie(),s=e.get(r);if(!s){e.set(r,t);return}s.content={...c(s.content)?s.content:{},...c(t.content)?t.content:{}},s.metadata={...c(s.metadata)?s.metadata:{},...n},s.previewUrl=t.previewUrl||s.previewUrl,s.fileUrl=t.fileUrl||s.fileUrl,s.summary=t.summary||s.summary,s.title=t.title||s.title}function xt(e,t,n={}){for(let r of Nn(e))rt(t,bn(r,n))}function Ct(e){if(!c(e)||!c(e.payload))return c(e)?e:{value:e};let t=a(e.payload.type);if(t!=="image_generation_end"&&t!=="image_generation_call")return e;let n={...e.payload};return typeof n.result=="string"&&n.result&&(n.result="<omitted>",n.resultLength=e.payload.result.length),{...e,payload:n}}function se(e,t,n){if(!c(e))return e;let r=c(e.event)?e.event:null;return r?(rt(t,It(r,n)),{...e,event:Ct(r)}):e}function le(e,t,n={}){if(!c(e))return e;xt(e,t,n);let r=se(e,t,n),s=c(r.update)?se(r.update,t,n):null;return s&&s!==r.update&&(r={...r,update:s}),r}function de(e,t,n={}){let r=c(e)?{...e}:{};xt(r,t,n),xt(c(r.output)?r.output:{},t,n);let s=[...t?.values?.()||[]];return s.length&&(r._artifacts=s),delete r.artifacts,r}var z=class{constructor(t,n,r={},s={}){this.agent=t,this.target=n,this.callbacks=r,this.options=s,this.proc=null,this.permissionHandlers=new Map}async ensureStarted(){if(this.proc)return;let t=a(this.target.command);if(!t)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);this.proc=new et({command:t,args:E(this.target.args),cwd:a(this.target.cwd)||this.agent.workspace||process.cwd(),env:c(this.target.env)?this.target.env:{},label:`${this.agent.agentId}:${this.agent.targetCode}`,framing:a(this.target.framing||"line")}),this.proc.onRequest("session/request_permission",n=>this.handlePermissionRequest(n)),this.proc.onRequest("session/requestPermission",n=>this.handlePermissionRequest(n)),await this.proc.start({initialize:this.target.initialize!==!1,initializeParams:{clientInfo:{name:"orcha-runtime-bridge",version:B},...c(this.target.initializeParams)?this.target.initializeParams:{}}})}async sessionNew(t={}){return await this.ensureStarted(),this.proc.call("session/new",this.sessionNewParams(t))}sessionNewParams(t={}){let n=Array.isArray(t.mcpServers)?t.mcpServers:Array.isArray(this.target.mcpServers)?this.target.mcpServers:[];return{...t,mcpServers:n}}async sessionPrompt(t,n){await this.ensureStarted();let r=a(t.sessionId),s=new Map,i=this.artifactOptions(),o=this.proc.onNotification("session/update",l=>{let d=a(l.sessionId);(!d||d===r)&&n(le(l,s,i))}),u=async l=>this.callbacks.onPermissionRequest?.({agent:this.agent,runtimeSessionId:r,request:l,emitUpdate:n})||{outcome:"denied",reason:"permission handler is not configured"};r&&this.permissionHandlers.set(r,u),this.permissionHandlers.set("*",u);try{let l=await this.proc.call("session/prompt",t,this.options.sessionPromptTimeoutMs);return de(l,s,i)}finally{o(),r&&this.permissionHandlers.delete(r),this.permissionHandlers.delete("*")}}async sessionCancel(t){return await this.ensureStarted(),this.proc.call("session/cancel",t,5e3).catch(()=>({ok:!0}))}async handlePermissionRequest(t){let n=a(t.sessionId),r=this.permissionHandlers.get(n)||this.permissionHandlers.get("*");return r?r(t):{outcome:"denied",reason:"no active Orcha permission handler"}}artifactSource(){return a(this.target.type||"acp")==="openclaw"?"openclaw_image_generation":"acp_runtime_image_generation"}artifactOptions(){let t=c(this.target.env)?this.target.env:{};return{source:this.artifactSource(),trustedFileRoots:[a(this.target.artifactRoot),a(this.target.artifactDir),a(this.target.runtimeArtifactRoot),a(t.ORCHA_RUNTIME_ARTIFACT_DIR),...E(this.target.trustedArtifactRoots),...E(this.target.trustedFileRoots),...E(this.target.artifactRoots),...E(this.target.artifactFileRoots)].filter(Boolean)}}async stop(t){await this.proc?.stop(t)}};function kn(e){let t=c(e.metadata)?e.metadata:{};return a(t.agentCode)}function Pn(e,t){let n=kn(e);return n?`agent:${n}:${t}`:`orcha-${t}`}var st=class extends z{constructor(t,n,r,s={},i={}){let o=a(r).replace(/[^A-Za-z0-9._-]+/g,"-")||"default",u=a(n.command)||"openclaw",l=Array.isArray(n.args)?n.args.map(String):[],d=l.length>0?l:["acp","--session",Pn(t,o)];super(t,{...n,command:u,args:d},s,i)}sessionNewParams(t={}){return{...t,mcpServers:[]}}};import{spawn as Ln}from"node:child_process";import{randomUUID as J}from"node:crypto";import{existsSync as ge,mkdirSync as Fn,readdirSync as Te,readFileSync as _e,realpathSync as ct,rmSync as Dn,rmdirSync as $n,statSync as Hn,unlinkSync as vn}from"node:fs";import{homedir as Bn,tmpdir as ye}from"node:os";import{basename as Se,dirname as zn,join as A,resolve as fe}from"node:path";var Gn=36e5,qn=5e3,Kn=2*60*1e3,jn=2*60*1e3,Wn=12,Jn=1e3,Xn=1500,it=24*60*60*1e3,X=new Set(["final_answer","final","complete","completed","done"]);function ot(e,t){try{e.kill(t)}catch{}}function C(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(t=>C(t)).join("");if(!c(e))return"";for(let t of["text","delta","output_text","content","message","output"]){let n=C(e[t]);if(n)return n}return""}function we(e){if(!c(e))return"";let t=c(e.payload)?e.payload:{};if(a(e.type)==="event_msg"){if(a(t.type)==="agent_message")return a(t.message);if(a(t.type)==="task_complete")return a(t.last_agent_message)}if(a(e.type)==="response_item"&&a(t.type)==="message"&&a(t.role)==="assistant")return C(t.content)||C(t.message);let n=C(e.delta)||C(e.text)||C(e.content);if(n)return n;let r=c(e.item)?e.item:{};return a(r.role)==="assistant"||a(r.type)==="message"?C(r.content)||C(r.text)||C(r.message):""}function Re(e,t={}){return It(e,{source:"codex_cli_image_generation",...t})}function Ee(e,t){rt(e.artifacts,t)}function xe(e){return Ct(e)}function Ut(e){if(!c(e))return!1;let t=c(e.payload)?e.payload:{},n=a(e.type),r=a(t.type);if(n==="event_msg"&&r==="task_complete")return!0;let s=a(t.phase||t.status||t.stage).toLowerCase();return n==="event_msg"&&r==="agent_message"||n==="response_item"&&r==="message"&&a(t.role)==="assistant"?X.has(s):!1}function pe(e){return c(e)?a(e.phase||e.status||e.stage).toLowerCase():""}function Vn(e){if(!c(e)||Ut(e))return!1;let t=c(e.payload)?e.payload:{},n=a(e.type),r=a(t.type),s=pe(t);if(n==="event_msg"&&r==="agent_message"||n==="response_item"&&r==="message"&&a(t.role)==="assistant")return!!(s&&!X.has(s));let i=c(e.item)?e.item:{},o=pe(i);return a(i.role)==="assistant"||a(i.type)==="message"?!!(o&&!X.has(o)):!1}function Yn(e,t,n){return n.captureLastMessage===!1||t.includes("--output-last-message")||t.includes("-o")?!1:n.captureLastMessage===!0?!0:Se(e)==="codex"}function Zn(e,t){return t.collectCodexTranscriptArtifacts===!1?!1:t.collectCodexTranscriptArtifacts===!0?!0:Se(e)==="codex"}function Ie(e){return Math.max(20,T(e.codexTranscriptPollMs||e.transcriptPollMs,Jn))}function Qn(e){return Math.max(0,T(e.codexFinalOutputWaitMs||e.finalOutputWaitMs,Xn))}function ut(e){if(typeof e=="boolean")return e;let t=a(e).toLowerCase();return["true","1","yes","y","on"].includes(t)?!0:["false","0","no","n","off"].includes(t)?!1:null}function Nt(e){let t=c(e?.metadata)?e.metadata:{};return c(t._runtimeBridge)?t._runtimeBridge:{}}function Ot(e){return a(Nt(e).promptKind).toLowerCase()}function tr(e,t){for(let n of[e.codexTranscriptStreaming,e.streamCodexTranscript]){let r=ut(n);if(r!=null)return r}return Ot(t)==="chat"}function er(e,t){let n=Nt(e);for(let s of[n.emitThoughtChunks,n.streamThoughts]){let i=ut(s);if(i!=null)return i}let r=Ot(e);if(r&&r!=="chat")return!1;for(let s of[t.emitThoughtChunks,t.streamThoughts]){let i=ut(s);if(i!=null)return i}return Ot(e)==="chat"}function nr(e){let t=Nt(e);for(let n of[t.finalTextOnly,t.finalOutputOnly]){let r=ut(n);if(r!=null)return r}return null}function rr(e,t){let n=nr(e);return n??(t.finalTextOnly===!0||t.finalOutputOnly===!0?!0:(t.finalTextOnly===!1||t.finalOutputOnly===!1,!1))}function sr(e,t){return!e.finalTextOnly||t}function Ce(e,t,n,r,s=r){return!r||e.emittedTexts.has(s)?!1:(e.emittedTexts.add(s),n({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:r}}}),!0)}function Oe(e,t,n,r){return!r||e.emittedThoughtTexts.has(r)?!1:(e.emittedThoughtTexts.add(r),n({sessionId:t,update:{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:r}}}),!0)}function ir(e,t,n,r=new Set){return{target:e,promptText:t,startedAtMs:n,baselinePaths:r,matchedPath:"",disabled:!1,processedLines:new Map}}function or(e,t){let n=c(e.env)?e.env:{},r=a(e.artifactRoot||e.artifactDir||e.runtimeArtifactRoot||n.ORCHA_RUNTIME_ARTIFACT_DIR)||A(ye(),"orcha-runtime-artifacts"),s=a(t).replace(/[^A-Za-z0-9._-]+/g,"-").slice(0,80)||J(),i=A(r,s),o=A(i,J());return Fn(o,{recursive:!0}),{root:o,realRoot:ct(o),sessionRoot:i,realSessionRoot:ct(i)}}function Ae(e){return a(c(e)?e.root:e)}function he(e){let t=Ae(e),n=a(c(e)?e.sessionRoot:zn(t)),r=a(c(e)?e.realSessionRoot:"");if(n)try{if(r&&ct(n)!==r)return;$n(n)}catch{}}function ar(e,t={}){let n=Ae(e),r=a(c(e)?e.realRoot:"");if(n){try{if(r&&ct(n)!==r){p("warn","runtime.cli","runtime artifact directory cleanup skipped; path changed",{...t,artifactRoot:n});return}}catch{he(e);return}try{Dn(n,{recursive:!0,force:!0})}catch(s){p("warn","runtime.cli","runtime artifact directory cleanup failed",{...t,artifactRoot:n,error:String(s?.message||s)});return}he(e)}}function cr(e,t){return{trustedFileRoots:[t,...E(e.trustedArtifactRoots),...E(e.trustedFileRoots),...E(e.artifactRoots),...E(e.artifactFileRoots)].filter(Boolean)}}function Me(e){let t=a(e.codexSessionsRoot||e.codexSessionRoot);if(t)return t;let n=c(e.env)?e.env:{},r=a(e.codexHome||n.CODEX_HOME||process.env.CODEX_HOME)||A(Bn(),".codex");return A(r,"sessions")}function ur(e,t){let n=new Date(t),r=String(n.getFullYear()),s=String(n.getMonth()+1).padStart(2,"0"),i=String(n.getDate()).padStart(2,"0");return A(e,r,s,i)}function Ue(e,t,n){let r=new Set;for(let s of[t-it,t,t+it,n-it,n,n+it])r.add(ur(e,s));return[...r].filter(s=>ge(s))}function lr(e,t,n){let r=Me(e),s=t-Kn,i=n+jn,o=[];for(let u of Ue(r,t,n)){let l=[];try{l=Te(u)}catch{continue}for(let d of l){if(!d.endsWith(".jsonl"))continue;let f=A(u,d);try{let h=Hn(f);if(!h.isFile()||h.mtimeMs<s||h.mtimeMs>i)continue;o.push({path:f,mtimeMs:h.mtimeMs})}catch{}}}return o.sort((u,l)=>l.mtimeMs-u.mtimeMs).slice(0,Wn)}function dr(e,t,n=t){let r=Me(e),s=new Set;for(let i of Ue(r,t,n)){let o=[];try{o=Te(i)}catch{continue}for(let u of o)u.endsWith(".jsonl")&&s.add(A(i,u))}return s}function At(e,t,n=0){if(!(n>8||e===null||e===void 0)){if(typeof e=="string"){e&&t.push(e);return}if(Array.isArray(e)){for(let r of e)At(r,t,n+1);return}if(c(e))for(let r of["payload","item","text","delta","output_text","content","message","output","input","prompt","last_agent_message","revised_prompt"])r in e&&At(e[r],t,n+1)}}function Ne(e){return a(e).replace(/\s+/g," ")}function fr(e){let t=Ne(e);if(!t)return[];if(t.length<=200)return[t];let n=160,r=[0,Math.floor((t.length-n)/2),t.length-n],s=new Set,i=[];for(let o of r){let u=t.slice(Math.max(0,o),Math.max(0,o)+n).trim();u.length>=40&&!s.has(u)&&(s.add(u),i.push(u))}return i}function pr(e,t){let n=fr(t);if(!n.length)return!1;let r=[];for(let i of e)At(i,r);let s=Ne(r.join(" "));return n.every(i=>s.includes(i))}function hr(e){return e.find(t=>c(t)&&a(t.type)==="session_meta"&&c(t.payload))||null}function mr(e){let t=c(e?.payload)?e.payload:{},n=a(e?.timestamp||t.timestamp),r=Date.parse(n);return Number.isFinite(r)?r:Number.NaN}function gr(e,t,n){if(!pr(e,t.promptText))return!1;let r=hr(e);if(!r)return!1;let s=r.payload,i=a(s.originator),o=a(s.source);if(i!=="codex_exec"&&o!=="exec")return!1;let u=mr(r);if(!Number.isFinite(u)||u<t.startedAtMs-5e3||u>n+5e3)return!1;let l=a(t.target.cwd),d=a(s.cwd);return!(l&&d&&fe(l)!==fe(d))}function me(e){try{return _r(_e(e,"utf8"))}catch{return null}}function Tr(e,t,n){if(!e||e.disabled)return null;if(e.matchedPath){let s=me(e.matchedPath);return s?{path:e.matchedPath,events:s}:null}let r=[];for(let s of lr(e.target,e.startedAtMs,n)){if(e.baselinePaths.has(s.path))continue;let i=me(s.path);!i||!gr(i,e,n)||r.push({path:s.path,events:i})}return r.length!==1?(r.length>1&&(e.disabled=!0,p("warn","runtime.cli","codex transcript fallback disabled; multiple matching transcripts",{target:e.target.targetCode,sessionId:t,transcriptCount:r.length})),null):(e.matchedPath=r[0].path,p("info","runtime.cli","codex transcript stream attached",{target:e.target.targetCode,sessionId:t}),r[0])}function _r(e){let t=[];for(let n of e.split(/\r?\n/)){let r=n.trim();if(r)try{t.push(JSON.parse(r))}catch{}}return t}function yr(e){if(!c(e))return!1;let t=c(e.payload)?e.payload:{},n=a(e.type),r=a(t.type);return n==="event_msg"&&r==="image_generation_end"||n==="response_item"&&r==="image_generation_call"}function Sr(e,t,n,r){let s=we(e),i=Ut(e),o=0,u=0,l=0;if(s&&!i&&t.emitThoughtChunks&&Oe(t,n,r,s)&&(l=1),s&&i){let d=t.emittedTexts.size?`
|
|
9
9
|
|
|
10
10
|
${s}`:s;Ce(t,n,r,d,s)&&(o=1,u=1)}return s&&i&&(t.finalTextSeen=!0),Ee(t,Re(e,t.artifactOptions)),(yr(e)||i)&&r({sessionId:n,update:{sessionUpdate:"runtime_event",event:xe(e)}}),{textCount:o,finalTextCount:u,thoughtCount:l}}function Mt(e,t,n,r,s=Date.now()){if(!t)return{artifactCount:0,transcriptCount:0,textCount:0,finalTextCount:0,thoughtCount:0};let i=e.artifacts.size,o=0,u=0,l=0,d=0,f=Tr(t,n,s);if(f){let h=Math.min(t.processedLines.get(f.path)||0,f.events.length),m=e.artifacts.size;for(let y of f.events.slice(h)){let S=Sr(y,e,n,r);u+=S.textCount,l+=S.finalTextCount,d+=S.thoughtCount}t.processedLines.set(f.path,f.events.length),(f.events.length>h||e.artifacts.size>m)&&(o=1)}return{artifactCount:e.artifacts.size-i,transcriptCount:o,textCount:u,finalTextCount:l,thoughtCount:d}}function wr(e,{remove:t=!0}={}){if(!e||!ge(e))return"";try{return _e(e,"utf8").trim()}catch{return""}finally{t&&at(e)}}function at(e){if(e)try{vn(e)}catch{}}function Rr(e,t){return{artifactCount:(e?.artifactCount||0)+(t?.artifactCount||0),transcriptCount:(e?.transcriptCount||0)+(t?.transcriptCount||0),textCount:(e?.textCount||0)+(t?.textCount||0),finalTextCount:(e?.finalTextCount||0)+(t?.finalTextCount||0),thoughtCount:(e?.thoughtCount||0)+(t?.thoughtCount||0)}}function Er(e){return new Promise(t=>setTimeout(t,e))}function xr(e,t,n,r){return r?(e.finalTextSeen=!0,e.emittedTexts.has(r)||(e.emittedTexts.add(r),n({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:r}}})),!0):!1}async function Ir(e,t,n,r,s,i){let o=Mt(e,t,n,r,Date.now()),u=()=>xr(e,n,r,wr(s,{remove:!1}));if(u()||e.finalTextSeen)return at(s),o;let l=Qn(i);if(l<=0||!t&&!s)return at(s),o;let d=Date.now()+l,f=Math.min(Ie(i),100);for(;!e.finalTextSeen&&Date.now()<d&&(await Er(Math.min(f,Math.max(0,d-Date.now()))),o=Rr(o,Mt(e,t,n,r,Date.now())),!u()););return at(s),o}var lt=class{constructor(t,n,r={}){this.agent=t,this.target=n,this.options=r,this.active=new Map}async sessionNew(){return{sessionId:`cli-${this.agent.agentId}-${J()}`}}async sessionPrompt(t,n){let r=Date.now(),s=a(this.target.command);if(!s)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);let i=a(t.sessionId)||J(),o=Q(t.prompt),u=a(this.target.promptMode||"stdin"),l=this.buildArgs(u,o),d=a(this.target.cwd)||this.agent.workspace||process.cwd(),f=or(this.target,i),h=f.root,m=cr(this.target,h),y=Zn(s,this.target),S={...this.target,targetCode:this.agent.targetCode,cwd:d},U=y?dr(S,r):new Set,x=Yn(s,l,this.target)?A(ye(),`orcha-runtime-last-message-${J()}.txt`):"";x&&l.push("--output-last-message",x);let O=T(this.target.timeoutMs||this.target.sessionPromptTimeoutMs,T(this.options.sessionPromptTimeoutMs,Gn)),N={...process.env,...c(this.target.env)?this.target.env:{},...u==="env"?{ORCHA_RUNTIME_PROMPT:o}:{},ORCHA_AGENT_ID:this.agent.agentId,ORCHA_SESSION_ID:i,ORCHA_RUNTIME_ARTIFACT_DIR:h},g=Ln(s,l,{cwd:d,env:N,stdio:["pipe","pipe","pipe"]});this.active.set(i,g),p("info","runtime.cli","runtime prompt started",{target:this.agent.targetCode,sessionId:i,pid:g.pid,timeoutMs:O});let Xt="",yt=a(this.target.outputMode||"text"),b={artifacts:new Map,emittedTexts:new Set,emittedThoughtTexts:new Set,value:"",artifactOptions:m,finalTextSeen:!1,finalTextOnly:rr(t,this.target),emitThoughtChunks:er(t,this.target)},St=y?ir(S,o,r,U):null;return g.stdout.setEncoding("utf8"),g.stdout.on("data",v=>this.handleStdout(v,yt,b,i,n)),g.stderr.setEncoding("utf8"),g.stderr.on("data",v=>{Xt+=v,this.target.emitStderr===!0&&n({sessionId:i,update:{sessionUpdate:"runtime_stderr_chunk",content:{type:"text",text:v}}})}),u==="stdin"?g.stdin.end(o):g.stdin.end(),await new Promise((v,an)=>{let Y=!1,Vt=!1,F=null,wt=St&&tr(this.target,t)?setInterval(()=>{try{Mt(b,St,i,n)}catch(w){p("warn","runtime.cli","codex transcript stream poll failed",{target:this.agent.targetCode,sessionId:i,error:String(w?.message||w)})}},Ie(this.target)):null;wt?.unref?.();let Yt=setTimeout(()=>{Vt=!0,p("warn","runtime.cli","runtime prompt timed out; terminating child",{target:this.agent.targetCode,sessionId:i,pid:g.pid,timeoutMs:O}),ot(g,"SIGTERM"),F=setTimeout(()=>{p("warn","runtime.cli","runtime prompt force killing child",{target:this.agent.targetCode,sessionId:i,pid:g.pid}),ot(g,"SIGKILL")},qn),F.unref?.(),Rt(Object.assign(new Error(`runtime CLI timed out after ${O}ms`),{code:"RUNTIME_CLI_TIMEOUT"}))},O);Yt.unref?.();let Zt=()=>{clearTimeout(Yt),wt&&clearInterval(wt),F&&!Vt&&clearTimeout(F),ar(f,{target:this.agent.targetCode,sessionId:i}),this.active.delete(i)},cn=w=>{Y||(Y=!0,Zt(),v(w))},Rt=w=>{Y||(Y=!0,Zt(),an(w))};g.on("error",w=>{p("warn","runtime.cli","runtime child error",{target:this.agent.targetCode,sessionId:i,pid:g.pid,error:String(w?.message||w)}),Rt(w)}),g.on("exit",(w,Qt)=>{(async()=>{F&&(clearTimeout(F),F=null),yt==="json-lines"&&b.value.trim()&&this.handleStdout(`
|
|
11
11
|
`,yt,b,i,n);let k=await Ir(b,St,i,n,x,this.target);(k.artifactCount>0||k.textCount>0||k.thoughtCount>0)&&p("info","runtime.cli","codex transcript updates collected",{target:this.agent.targetCode,sessionId:i,artifactCount:k.artifactCount,textCount:k.textCount,finalTextCount:k.finalTextCount,thoughtCount:k.thoughtCount,transcriptCount:k.transcriptCount});let Z=Xt.trim();Z&&p("debug","runtime.cli","runtime stderr",{target:this.agent.targetCode,sessionId:i,stderr:Z}),p("info","runtime.cli","runtime prompt finished",{target:this.agent.targetCode,sessionId:i,pid:g.pid,exitCode:w,signal:Qt,artifactCount:b.artifacts.size,finalTextSeen:b.finalTextSeen}),cn({stopReason:w===0?"end_turn":"error",exitCode:w,signal:Qt,_artifacts:[...b.artifacts.values()],...Z?{stderr:Z}:{}})})().catch(Rt)})})}buildArgs(t,n){let r=E(this.target.args);return t==="args"?[...r,n]:r}handleStdout(t,n,r,s,i){if(n!=="json-lines"){i({sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:t}}});return}r.value+=t;let o=r.value.split(/\r?\n/);r.value=o.pop()||"";for(let u of o){let l=u.trim();if(l)try{let d=JSON.parse(l);Ee(r,Re(d,r.artifactOptions)),i({sessionId:s,update:{sessionUpdate:"runtime_event",event:xe(d)}});let f=we(d),h=Ut(d);f&&r.emitThoughtChunks&&!h&&Vn(d)?Oe(r,s,i,f):f&&sr(r,h)&&Ce(r,s,i,f),f&&h&&(r.finalTextSeen=!0)}catch{i({sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`${u}
|