@orcha-ai/runtime-bridge 0.1.6 → 0.1.8
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,22 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{spawn as
|
|
3
|
-
`):""}var
|
|
2
|
+
import{spawn as Mr}from"node:child_process";import{closeSync as Nr,existsSync as Ce,mkdirSync as br,openSync as kr,readFileSync as At,rmSync as Pr,statSync as Ee,writeFileSync as Me}from"node:fs";import{dirname as Lr,resolve as Ct}from"node:path";import{fileURLToPath as Dr}from"node:url";import{randomUUID as rt}from"node:crypto";var D="0.1.8";function B(){return new Date().toISOString()}function S(e,t=2){return String(e).padStart(t,"0")}function $t(e){let t=e>=0?"+":"-",n=Math.abs(e);return`${t}${S(Math.floor(n/60))}:${S(n%60)}`}function Fe(e){let t=-e.getTimezoneOffset();return[`${e.getFullYear()}-${S(e.getMonth()+1)}-${S(e.getDate())}`,`T${S(e.getHours())}:${S(e.getMinutes())}:${S(e.getSeconds())}.${S(e.getMilliseconds(),3)}`,$t(t)].join("")}function $e(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 He(e,t){let n=$e(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}-${S(n.month)}-${S(n.day)}`,`T${S(n.hour)}:${S(n.minute)}:${S(n.second)}.${S(e.getMilliseconds(),3)}`,$t(s)].join("")}function ve(e=new Date){let t=o(process.env.ORCHA_RUNTIME_LOG_TIMEZONE||process.env.TZ||"Asia/Shanghai");try{return He(e,t)}catch{return Fe(e)}}function c(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function o(e){return String(e??"").trim()}function _(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 Be="[redacted]",ze=/(authorization|api[_-]?key|credential|password|secret|token)/i;function v(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 r={name:e.name,message:e.message};e.stack&&(r.stack=e.stack);for(let s of Object.keys(e))r[s]=v(e[s],t);return t.delete(e),r}if(t.has(e))return"[circular]";if(t.add(e),Array.isArray(e)){let r=e.map(s=>v(s,t));return t.delete(e),r}let n={};for(let[r,s]of Object.entries(e))n[r]=ze.test(r)?Be:v(s,t);return t.delete(e),n}function Ht(e,t=4e3){let n=JSON.stringify(v(e))??String(e);return!Number.isFinite(t)||n.length<=t?n:`${n.slice(0,t)}...`}function f(e,t,n,r={}){let s={ts:ve(),level:e,module:t,msg:n,...c(r)?v(r):{}};console.error(JSON.stringify(s))}function J(e){return Array.isArray(e)?e.map(t=>c(t)?t.type==="text"?o(t.text):t.type==="file"?o(t.uri):t.type==="image"?o(t.uri):"":"").filter(Boolean).join(`
|
|
3
|
+
`):""}var W=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=J(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 je}from"node:child_process";var z="2.0",Ge=3e4;function Ke(e){return{code:Number.isInteger(e?.code)?e.code:-32e3,message:o(e?.message)||String(e),data:c(e?.data)?e.data:void 0}}function qe(e){if(!c(e))return new Error(String(e||"runtime error"));let t=o(e.message)||"runtime error",n="data"in e?Ht(e.data,4e3):"",r=new Error(n?`${t}; data=${n}`:t);return r.rpcCode=e.code,r.data=e.data,r}function Je(e){return c(e)&&"id"in e&&!("method"in e)}function We(e){return c(e)&&typeof e.method=="string"&&"id"in e}function Xe(e){return c(e)&&typeof e.method=="string"&&!("id"in e)}var X=class{constructor({command:t,args:n=[],cwd:r,env:s,label:i,framing:u="line"}){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=u==="content-length"?"content-length":"line",this.child=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.child.killed||(this.child=je(this.command,this.args,{cwd:this.cwd,env:this.env,stdio:["pipe","pipe","pipe"]}),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&&f("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){f("warn","runtime.protocol","missing Content-Length header",{target:this.label}),this.headerBuffer=Buffer.alloc(0);return}let i=Number.parseInt(s[1],10),u=n+4,a=u+i;if(this.headerBuffer.length<a)return;let
|
|
5
|
+
`);if(n<0)return;let s=this.headerBuffer.subarray(0,n).toString("utf8").match(/content-length:\s*(\d+)/i);if(!s){f("warn","runtime.protocol","missing Content-Length header",{target:this.label}),this.headerBuffer=Buffer.alloc(0);return}let i=Number.parseInt(s[1],10),u=n+4,a=u+i;if(this.headerBuffer.length<a)return;let d=this.headerBuffer.subarray(u,a).toString("utf8");this.headerBuffer=this.headerBuffer.subarray(a),this.dispatchRaw(d)}}dispatchRaw(t){let n;try{n=JSON.parse(t)}catch(r){f("warn","runtime.protocol","invalid JSON frame",{target:this.label,error:String(r)});return}this.dispatch(n)}dispatch(t){if(Je(t)){this.resolveResponse(t);return}if(We(t)){this.handleRequest(t);return}Xe(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?(f("warn","runtime.protocol","runtime rpc error",{target:this.label,method:r.method,requestId:n,error:t.error}),r.reject(qe(t.error))):r.resolve(t.result))}async handleRequest(t){let n=this.requestHandlers.get(t.method);if(!n){this.writeFrame({jsonrpc:z,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:z,id:t.id,result:r??{}})}catch(r){this.writeFrame({jsonrpc:z,id:t.id,error:Ke(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=Ge){if(!this.child||!this.child.stdin||this.child.killed)return Promise.reject(new Error("runtime process is not running"));let s=`${t}_${++this.seq}`,i={jsonrpc:z,id:s,method:t,params:n};return new Promise((u,a)=>{let d=setTimeout(()=>{this.pending.delete(s),a(new Error(`${t} timed out after ${r}ms`))},r);this.pending.set(s,{resolve:u,reject:a,timer:d,method:t}),this.writeFrame(i,l=>{l&&(clearTimeout(d),this.pending.delete(s),a(l))})})}notify(t,n={}){this.writeFrame({jsonrpc:z,method:t,params:n})}writeFrame(t,n){if(!this.child?.stdin||this.child.killed){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.rejectAll(new Error(`runtime exited before response (${t}/${n})`));for(let r of this.exitHandlers)r(t,n)}stop(t="stop"){!this.child||this.child.killed||(f("info","runtime","stopping runtime",{target:this.label,reason:t}),this.child.kill("SIGTERM"),setTimeout(()=>{this.child&&!this.child.killed&&this.child.kill("SIGKILL")},5e3).unref())}};import{randomUUID as Bt}from"node:crypto";import{existsSync as Xe,readFileSync as Ve,realpathSync as Ht,statSync as Ye}from"node:fs";import{basename as zt,extname as jt,isAbsolute as Ze,relative as Qe}from"node:path";var tn=25*1024*1024;function Gt(e,t=""){let n=o(t);if(n)return n;let r=jt(o(e)).toLowerCase();return r===".jpg"||r===".jpeg"?"image/jpeg":r===".webp"?"image/webp":r===".gif"?"image/gif":"image/png"}function Jt(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 X(e){if(Array.isArray(e))return e.map(o).filter(Boolean);let t=o(e);return t?[t]:[]}function en(e,t){let n=Qe(t,e);return n===""||!!n&&!n.startsWith("..")&&!Ze(n)}function nn(e,t){let n=o(e);if(!n||!Xe(n))return"";try{let r=Ht(n);for(let s of t)try{let i=Ht(s);if(en(r,i))return r}catch{}}catch{return""}return""}function ft(e,t,n={}){let r=o(e);return!r||r.startsWith("data:")||/^https?:\/\//i.test(r)?r:rn(r,t,n)}function rn(e,t,n={}){let r=[...X(n.trustedFileRoots),...X(n.trustedFileRoot),...X(n.artifactRoots),...X(n.artifactRoot)],s=nn(e,r);if(!s)return"";try{let i=Ye(s);return!i.isFile()||i.size<=0||i.size>tn?"":`data:${t};base64,${Ve(s).toString("base64")}`}catch{return""}}function _(...e){for(let t of e){let n=o(t);if(n)return n}return""}function sn(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),u=jt(i.split("?",1)[0].split("#",1)[0]).toLowerCase();return[".png",".jpg",".jpeg",".webp",".gif"].includes(u)}function mt(e,t={}){let{source:n="runtime_image_generation_event"}=t;if(!c(e))return null;let r=c(e.payload)?e.payload:{},s=o(e.type),i=o(r.type);if(!(s==="event_msg"&&i==="image_generation_end"||s==="response_item"&&i==="image_generation_call"))return null;let u=_(r.call_id,r.id),a=_(r.saved_path,r.savedPath),l=_(r.revised_prompt,r.revisedPrompt),d=Gt(a,r.mimeType||r.mime_type),p=Jt(r.result,d)||ft(a,d,t);if(!p)return null;let m=a?zt(a):`${u||Bt()}.png`;return{artifactType:"image",type:"image",title:m||"Generated image",summary:l||"Generated image",content:{prompt:l||void 0,imageUrl:p,previewUrl:p,fileUrl:p,mimeType:d},previewUrl:p,fileUrl:p,metadata:{source:n,eventType:i,callId:u||void 0,savedPath:a||void 0,filename:m,mimeType:d,revisedPrompt:l||void 0}}}function on(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 an(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}:{},u=_(r.saved_path,r.savedPath,s.saved_path,s.savedPath,i.savedPath),a=_(r.mimeType,r.mime_type,s.mimeType,s.mime_type,i.mimeType),l=_(r.artifactType,r.artifact_type,r.type,r.kind,s.type,u?"image":"file"),d=sn(r,s,l,u),p=d?Gt(u,a):a;if(d){let E=_(r.dataUrl,s.dataUrl),A=E.startsWith("data:")?E:"",w=_(r.imageUrl,r.previewUrl,r.fileUrl,r.downloadUrl,r.url,r.uri,s.imageUrl,s.previewUrl,s.fileUrl,s.downloadUrl,s.url,s.uri),O=Jt(r.result??s.result,p)||A||ft(u,p,t)||ft(w,p,t);O&&(s.imageUrl||=O,s.previewUrl||=O,s.fileUrl||=O,p&&(s.mimeType||=p))}for(let[E,A]of[["prompt","prompt"],["previewUrl","previewUrl"],["fileUrl","fileUrl"],["downloadUrl","downloadUrl"],["imageUrl","imageUrl"],["dataUrl","dataUrl"],["url","url"],["uri","uri"],["mimeType","mimeType"],["mime_type","mimeType"]]){let w=r[E];w!=null&&w!==""&&!(A in s)&&(s[A]=w)}let m=_(r.fileUrl,r.downloadUrl,r.imageUrl,r.dataUrl,r.url,r.uri,s.fileUrl,s.downloadUrl,s.imageUrl,s.dataUrl,s.url,s.uri),T=_(r.previewUrl,r.imageUrl,r.dataUrl,r.url,r.fileUrl,r.uri,s.previewUrl,s.imageUrl,s.dataUrl,s.url,s.fileUrl,s.uri),x=_(r.filename,i.filename,u?zt(u):"");return{...r,artifactType:l,type:r.type||l,title:_(r.title,x,"Runtime artifact"),summary:_(r.summary,s.prompt,r.title,x,"Runtime artifact"),content:s,fileUrl:m||void 0,previewUrl:T||void 0,metadata:{...i,source:_(i.source,n),savedPath:u||i.savedPath,filename:x||i.filename,mimeType:p||i.mimeType}}}function V(e,t){if(!t||!e)return;let n=c(t.metadata)?t.metadata:{},r=_(n.savedPath,n.callId,t.previewUrl,t.fileUrl)||Bt(),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 pt(e,t,n={}){for(let r of on(e))V(t,an(r,n))}function ht(e){if(!c(e)||!c(e.payload))return c(e)?e:{value:e};let t=o(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 vt(e,t,n){if(!c(e))return e;let r=c(e.event)?e.event:null;return r?(V(t,mt(r,n)),{...e,event:ht(r)}):e}function qt(e,t,n={}){if(!c(e))return e;pt(e,t,n);let r=vt(e,t,n),s=c(r.update)?vt(r.update,t,n):null;return s&&s!==r.update&&(r={...r,update:s}),r}function Kt(e,t,n={}){let r=c(e)?{...e}:{};pt(r,t,n),pt(c(r.output)?r.output:{},t,n);let s=[...t?.values?.()||[]];return s.length&&(r.artifacts=s),r}var D=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=o(this.target.command);if(!t)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);this.proc=new W({command:t,args:I(this.target.args),cwd:o(this.target.cwd)||this.agent.workspace||process.cwd(),env:c(this.target.env)?this.target.env:{},label:`${this.agent.agentId}:${this.agent.targetCode}`,framing:o(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:P},...c(this.target.initializeParams)?this.target.initializeParams:{}}})}async sessionNew(t={}){await this.ensureStarted();let n=Array.isArray(t.mcpServers)?t.mcpServers:Array.isArray(this.target.mcpServers)?this.target.mcpServers:[];return this.proc.call("session/new",{...t,mcpServers:n})}async sessionPrompt(t,n){await this.ensureStarted();let r=o(t.sessionId),s=new Map,i=this.artifactOptions(),u=this.proc.onNotification("session/update",l=>{let d=o(l.sessionId);(!d||d===r)&&n(qt(l,s,i))}),a=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,a),this.permissionHandlers.set("*",a);try{let l=await this.proc.call("session/prompt",t,this.options.sessionPromptTimeoutMs);return Kt(l,s,i)}finally{u(),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=o(t.sessionId),r=this.permissionHandlers.get(n)||this.permissionHandlers.get("*");return r?r(t):{outcome:"denied",reason:"no active Orcha permission handler"}}artifactSource(){return o(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:[o(this.target.artifactRoot),o(this.target.artifactDir),o(this.target.runtimeArtifactRoot),o(t.ORCHA_RUNTIME_ARTIFACT_DIR),...I(this.target.trustedArtifactRoots),...I(this.target.trustedFileRoots),...I(this.target.artifactRoots),...I(this.target.artifactFileRoots)].filter(Boolean)}}stop(t){this.proc?.stop(t)}};function cn(e){let t=c(e.metadata)?e.metadata:{};return o(t.agentCode)}function un(e,t){let n=cn(e);return n?`agent:${n}:${t}`:`orcha-${t}`}var Y=class extends D{constructor(t,n,r,s={},i={}){let u=o(r).replace(/[^A-Za-z0-9._-]+/g,"-")||"default",a=o(n.command)||"openclaw",l=Array.isArray(n.args)?n.args.map(String):[],d=l.length>0?l:["acp","--session",un(t,u)];super(t,{...n,command:a,args:d},s,i)}};import{spawn as ln}from"node:child_process";import{randomUUID as z}from"node:crypto";import{existsSync as Zt,mkdirSync as dn,readdirSync as Qt,readFileSync as te,realpathSync as tt,rmSync as fn,rmdirSync as pn,statSync as mn,unlinkSync as hn}from"node:fs";import{homedir as gn,tmpdir as ee}from"node:os";import{basename as ne,dirname as _n,join as C,resolve as Wt}from"node:path";var Tn=36e5,yn=5e3,Sn=2*60*1e3,In=2*60*1e3,En=12,wn=1e3,Z=24*60*60*1e3;function Q(e,t){try{e.kill(t)}catch{}}function R(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(t=>R(t)).join("");if(!c(e))return"";for(let t of["text","delta","output_text","content","message","output"]){let n=R(e[t]);if(n)return n}return""}function re(e){if(!c(e))return"";let t=c(e.payload)?e.payload:{};if(o(e.type)==="event_msg"){if(o(t.type)==="agent_message")return o(t.message);if(o(t.type)==="task_complete")return o(t.last_agent_message)}if(o(e.type)==="response_item"&&o(t.type)==="message"&&o(t.role)==="assistant")return R(t.content)||R(t.message);let n=R(e.delta)||R(e.text)||R(e.content);if(n)return n;let r=c(e.item)?e.item:{};return o(r.role)==="assistant"||o(r.type)==="message"?R(r.content)||R(r.text)||R(r.message):""}function se(e,t={}){return mt(e,{source:"codex_cli_image_generation",...t})}function ie(e,t){V(e.artifacts,t)}function oe(e){return ht(e)}function Rn(e,t,n){return n.captureLastMessage===!1||t.includes("--output-last-message")||t.includes("-o")?!1:n.captureLastMessage===!0?!0:ne(e)==="codex"}function xn(e,t){return t.collectCodexTranscriptArtifacts===!1?!1:t.collectCodexTranscriptArtifacts===!0?!0:ne(e)==="codex"}function An(e){return Math.max(20,h(e.codexTranscriptPollMs||e.transcriptPollMs,wn))}function On(e){return e.codexTranscriptStreaming===!0||e.streamCodexTranscript===!0}function Un(e,t,n,r=new Set){return{target:e,promptText:t,startedAtMs:n,baselinePaths:r,matchedPath:"",disabled:!1,processedLines:new Map}}function Cn(e,t){let n=c(e.env)?e.env:{},r=o(e.artifactRoot||e.artifactDir||e.runtimeArtifactRoot||n.ORCHA_RUNTIME_ARTIFACT_DIR)||C(ee(),"orcha-runtime-artifacts"),s=o(t).replace(/[^A-Za-z0-9._-]+/g,"-").slice(0,80)||z(),i=C(r,s),u=C(i,z());return dn(u,{recursive:!0}),{root:u,realRoot:tt(u),sessionRoot:i,realSessionRoot:tt(i)}}function ae(e){return o(c(e)?e.root:e)}function Xt(e){let t=ae(e),n=o(c(e)?e.sessionRoot:_n(t)),r=o(c(e)?e.realSessionRoot:"");if(n)try{if(r&&tt(n)!==r)return;pn(n)}catch{}}function Mn(e,t={}){let n=ae(e),r=o(c(e)?e.realRoot:"");if(n){try{if(r&&tt(n)!==r){f("warn","runtime.cli","runtime artifact directory cleanup skipped; path changed",{...t,artifactRoot:n});return}}catch{Xt(e);return}try{fn(n,{recursive:!0,force:!0})}catch(s){f("warn","runtime.cli","runtime artifact directory cleanup failed",{...t,artifactRoot:n,error:String(s?.message||s)});return}Xt(e)}}function Nn(e,t){return{trustedFileRoots:[t,...I(e.trustedArtifactRoots),...I(e.trustedFileRoots),...I(e.artifactRoots),...I(e.artifactFileRoots)].filter(Boolean)}}function ce(e){let t=o(e.codexSessionsRoot||e.codexSessionRoot);if(t)return t;let n=c(e.env)?e.env:{},r=o(e.codexHome||n.CODEX_HOME||process.env.CODEX_HOME)||C(gn(),".codex");return C(r,"sessions")}function bn(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 C(e,r,s,i)}function ue(e,t,n){let r=new Set;for(let s of[t-Z,t,t+Z,n-Z,n,n+Z])r.add(bn(e,s));return[...r].filter(s=>Zt(s))}function kn(e,t,n){let r=ce(e),s=t-Sn,i=n+In,u=[];for(let a of ue(r,t,n)){let l=[];try{l=Qt(a)}catch{continue}for(let d of l){if(!d.endsWith(".jsonl"))continue;let p=C(a,d);try{let m=mn(p);if(!m.isFile()||m.mtimeMs<s||m.mtimeMs>i)continue;u.push({path:p,mtimeMs:m.mtimeMs})}catch{}}}return u.sort((a,l)=>l.mtimeMs-a.mtimeMs).slice(0,En)}function Ln(e,t,n=t){let r=ce(e),s=new Set;for(let i of ue(r,t,n)){let u=[];try{u=Qt(i)}catch{continue}for(let a of u)a.endsWith(".jsonl")&&s.add(C(i,a))}return s}function gt(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)gt(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&>(e[r],t,n+1)}}function le(e){return o(e).replace(/\s+/g," ")}function Pn(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 u of r){let a=t.slice(Math.max(0,u),Math.max(0,u)+n).trim();a.length>=40&&!s.has(a)&&(s.add(a),i.push(a))}return i}function Dn(e,t){let n=Pn(t);if(!n.length)return!1;let r=[];for(let i of e)gt(i,r);let s=le(r.join(" "));return n.every(i=>s.includes(i))}function Fn(e){return e.find(t=>c(t)&&o(t.type)==="session_meta"&&c(t.payload))||null}function $n(e){let t=c(e?.payload)?e.payload:{},n=o(e?.timestamp||t.timestamp),r=Date.parse(n);return Number.isFinite(r)?r:Number.NaN}function Hn(e,t,n){if(!Dn(e,t.promptText))return!1;let r=Fn(e);if(!r)return!1;let s=r.payload,i=o(s.originator),u=o(s.source);if(i!=="codex_exec"&&u!=="exec")return!1;let a=$n(r);if(!Number.isFinite(a)||a<t.startedAtMs-5e3||a>n+5e3)return!1;let l=o(t.target.cwd),d=o(s.cwd);return!(l&&d&&Wt(l)!==Wt(d))}function Vt(e){try{return Bn(te(e,"utf8"))}catch{return null}}function vn(e,t,n){if(!e||e.disabled)return null;if(e.matchedPath){let s=Vt(e.matchedPath);return s?{path:e.matchedPath,events:s}:null}let r=[];for(let s of kn(e.target,e.startedAtMs,n)){if(e.baselinePaths.has(s.path))continue;let i=Vt(s.path);!i||!Hn(i,e,n)||r.push({path:s.path,events:i})}return r.length!==1?(r.length>1&&(e.disabled=!0,f("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,f("info","runtime.cli","codex transcript stream attached",{target:e.target.targetCode,sessionId:t}),r[0])}function Bn(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 zn(e){if(!c(e))return!1;let t=c(e.payload)?e.payload:{},n=o(e.type),r=o(t.type);return n==="event_msg"&&r==="image_generation_end"||n==="response_item"&&r==="image_generation_call"}function jn(e,t,n,r){let s=re(e);if(s&&!t.emittedTexts.has(s)){let i=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.rejectAll(new Error(`runtime exited before response (${t}/${n})`));for(let r of this.exitHandlers)r(t,n)}stop(t="stop"){!this.child||this.child.killed||(f("info","runtime","stopping runtime",{target:this.label,reason:t}),this.child.kill("SIGTERM"),setTimeout(()=>{this.child&&!this.child.killed&&this.child.kill("SIGKILL")},5e3).unref())}};import{randomUUID as zt}from"node:crypto";import{existsSync as Ve,readFileSync as Ye,realpathSync as vt,statSync as Ze}from"node:fs";import{basename as jt,extname as Gt,isAbsolute as Qe,relative as tn}from"node:path";var en=25*1024*1024;function Kt(e,t=""){let n=o(t);if(n)return n;let r=Gt(o(e)).toLowerCase();return r===".jpg"||r===".jpeg"?"image/jpeg":r===".webp"?"image/webp":r===".gif"?"image/gif":"image/png"}function qt(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 V(e){if(Array.isArray(e))return e.map(o).filter(Boolean);let t=o(e);return t?[t]:[]}function nn(e,t){let n=tn(t,e);return n===""||!!n&&!n.startsWith("..")&&!Qe(n)}function rn(e,t){let n=o(e);if(!n||!Ve(n))return"";try{let r=vt(n);for(let s of t)try{let i=vt(s);if(nn(r,i))return r}catch{}}catch{return""}return""}function pt(e,t,n={}){let r=o(e);return!r||r.startsWith("data:")||/^https?:\/\//i.test(r)?r:sn(r,t,n)}function sn(e,t,n={}){let r=[...V(n.trustedFileRoots),...V(n.trustedFileRoot),...V(n.artifactRoots),...V(n.artifactRoot)],s=rn(e,r);if(!s)return"";try{let i=Ze(s);return!i.isFile()||i.size<=0||i.size>en?"":`data:${t};base64,${Ye(s).toString("base64")}`}catch{return""}}function y(...e){for(let t of e){let n=o(t);if(n)return n}return""}function on(e,t,n,r){let s=n.toLowerCase();if(s==="image"||s==="picture")return!0;let i=y(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),u=Gt(i.split("?",1)[0].split("#",1)[0]).toLowerCase();return[".png",".jpg",".jpeg",".webp",".gif"].includes(u)}function ht(e,t={}){let{source:n="runtime_image_generation_event"}=t;if(!c(e))return null;let r=c(e.payload)?e.payload:{},s=o(e.type),i=o(r.type);if(!(s==="event_msg"&&i==="image_generation_end"||s==="response_item"&&i==="image_generation_call"))return null;let u=y(r.call_id,r.id),a=y(r.saved_path,r.savedPath),d=y(r.revised_prompt,r.revisedPrompt),l=Kt(a,r.mimeType||r.mime_type),p=qt(r.result,l)||pt(a,l,t);if(!p)return null;let m=p.startsWith("data:")?p:"",g=a?jt(a):`${u||zt()}.png`;return{artifactType:"image",type:"image",fieldKey:"image",title:g||"Generated image",summary:d||"Generated image",content:{prompt:d||void 0,dataUrl:m||void 0,imageUrl:p,previewUrl:p,fileUrl:p,mimeType:l},dataUrl:m||void 0,previewUrl:p,fileUrl:p,metadata:{source:n,eventType:i,callId:u||void 0,savedPath:a||void 0,filename:g,mimeType:l,revisedPrompt:d||void 0}}}function an(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 cn(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}:{},u=y(r.saved_path,r.savedPath,s.saved_path,s.savedPath,i.savedPath),a=y(r.mimeType,r.mime_type,s.mimeType,s.mime_type,i.mimeType),d=y(r.artifactType,r.artifact_type,r.type,r.kind,s.type,u?"image":"file"),l=on(r,s,d,u),p=l?Kt(u,a):a;if(l){let U=y(r.dataUrl,s.dataUrl),w=U.startsWith("data:")?U:"",C=y(r.imageUrl,r.previewUrl,r.fileUrl,r.downloadUrl,r.url,r.uri,s.imageUrl,s.previewUrl,s.fileUrl,s.downloadUrl,s.url,s.uri),h=qt(r.result??s.result,p)||w||pt(u,p,t)||pt(C,p,t);h&&(h.startsWith("data:")&&(s.dataUrl||=h),s.imageUrl||=h,s.previewUrl||=h,s.fileUrl||=h,p&&(s.mimeType||=p))}for(let[U,w]of[["prompt","prompt"],["previewUrl","previewUrl"],["fileUrl","fileUrl"],["downloadUrl","downloadUrl"],["imageUrl","imageUrl"],["dataUrl","dataUrl"],["url","url"],["uri","uri"],["mimeType","mimeType"],["mime_type","mimeType"]]){let C=r[U];C!=null&&C!==""&&!(w in s)&&(s[w]=C)}let m=y(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=y(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=y(r.dataUrl,s.dataUrl,m.startsWith("data:")?m:"",g.startsWith("data:")?g:""),R=y(r.filename,i.filename,u?jt(u):""),P=y(r.fieldKey,r.field_key,s.fieldKey,i.fieldKey,l?"image":"artifact");return{...r,artifactType:d,type:r.type||d,fieldKey:P,title:y(r.title,R,"Runtime artifact"),summary:y(r.summary,s.prompt,r.title,R,"Runtime artifact"),content:s,dataUrl:M||void 0,fileUrl:m||void 0,previewUrl:g||void 0,metadata:{...i,source:y(i.source,n),savedPath:u||i.savedPath,filename:R||i.filename,mimeType:p||i.mimeType}}}function Y(e,t){if(!t||!e)return;let n=c(t.metadata)?t.metadata:{},r=y(n.savedPath,n.callId,t.previewUrl,t.fileUrl)||zt(),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 mt(e,t,n={}){for(let r of an(e))Y(t,cn(r,n))}function gt(e){if(!c(e)||!c(e.payload))return c(e)?e:{value:e};let t=o(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 Bt(e,t,n){if(!c(e))return e;let r=c(e.event)?e.event:null;return r?(Y(t,ht(r,n)),{...e,event:gt(r)}):e}function Jt(e,t,n={}){if(!c(e))return e;mt(e,t,n);let r=Bt(e,t,n),s=c(r.update)?Bt(r.update,t,n):null;return s&&s!==r.update&&(r={...r,update:s}),r}function Wt(e,t,n={}){let r=c(e)?{...e}:{};mt(r,t,n),mt(c(r.output)?r.output:{},t,n);let s=[...t?.values?.()||[]];return s.length&&(r._artifacts=s),delete r.artifacts,r}var F=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=o(this.target.command);if(!t)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);this.proc=new X({command:t,args:I(this.target.args),cwd:o(this.target.cwd)||this.agent.workspace||process.cwd(),env:c(this.target.env)?this.target.env:{},label:`${this.agent.agentId}:${this.agent.targetCode}`,framing:o(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:D},...c(this.target.initializeParams)?this.target.initializeParams:{}}})}async sessionNew(t={}){await this.ensureStarted();let n=Array.isArray(t.mcpServers)?t.mcpServers:Array.isArray(this.target.mcpServers)?this.target.mcpServers:[];return this.proc.call("session/new",{...t,mcpServers:n})}async sessionPrompt(t,n){await this.ensureStarted();let r=o(t.sessionId),s=new Map,i=this.artifactOptions(),u=this.proc.onNotification("session/update",d=>{let l=o(d.sessionId);(!l||l===r)&&n(Jt(d,s,i))}),a=async d=>this.callbacks.onPermissionRequest?.({agent:this.agent,runtimeSessionId:r,request:d,emitUpdate:n})||{outcome:"denied",reason:"permission handler is not configured"};r&&this.permissionHandlers.set(r,a),this.permissionHandlers.set("*",a);try{let d=await this.proc.call("session/prompt",t,this.options.sessionPromptTimeoutMs);return Wt(d,s,i)}finally{u(),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=o(t.sessionId),r=this.permissionHandlers.get(n)||this.permissionHandlers.get("*");return r?r(t):{outcome:"denied",reason:"no active Orcha permission handler"}}artifactSource(){return o(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:[o(this.target.artifactRoot),o(this.target.artifactDir),o(this.target.runtimeArtifactRoot),o(t.ORCHA_RUNTIME_ARTIFACT_DIR),...I(this.target.trustedArtifactRoots),...I(this.target.trustedFileRoots),...I(this.target.artifactRoots),...I(this.target.artifactFileRoots)].filter(Boolean)}}stop(t){this.proc?.stop(t)}};function un(e){let t=c(e.metadata)?e.metadata:{};return o(t.agentCode)}function dn(e,t){let n=un(e);return n?`agent:${n}:${t}`:`orcha-${t}`}var Z=class extends F{constructor(t,n,r,s={},i={}){let u=o(r).replace(/[^A-Za-z0-9._-]+/g,"-")||"default",a=o(n.command)||"openclaw",d=Array.isArray(n.args)?n.args.map(String):[],l=d.length>0?d:["acp","--session",dn(t,u)];super(t,{...n,command:a,args:l},s,i)}};import{spawn as ln}from"node:child_process";import{randomUUID as j}from"node:crypto";import{existsSync as Qt,mkdirSync as fn,readdirSync as te,readFileSync as ee,realpathSync as et,rmSync as pn,rmdirSync as mn,statSync as hn,unlinkSync as gn}from"node:fs";import{homedir as _n,tmpdir as ne}from"node:os";import{basename as re,dirname as yn,join as A,resolve as Xt}from"node:path";var Tn=36e5,Sn=5e3,In=2*60*1e3,En=2*60*1e3,Rn=12,wn=1e3,Q=24*60*60*1e3;function tt(e,t){try{e.kill(t)}catch{}}function E(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(t=>E(t)).join("");if(!c(e))return"";for(let t of["text","delta","output_text","content","message","output"]){let n=E(e[t]);if(n)return n}return""}function se(e){if(!c(e))return"";let t=c(e.payload)?e.payload:{};if(o(e.type)==="event_msg"){if(o(t.type)==="agent_message")return o(t.message);if(o(t.type)==="task_complete")return o(t.last_agent_message)}if(o(e.type)==="response_item"&&o(t.type)==="message"&&o(t.role)==="assistant")return E(t.content)||E(t.message);let n=E(e.delta)||E(e.text)||E(e.content);if(n)return n;let r=c(e.item)?e.item:{};return o(r.role)==="assistant"||o(r.type)==="message"?E(r.content)||E(r.text)||E(r.message):""}function ie(e,t={}){return ht(e,{source:"codex_cli_image_generation",...t})}function oe(e,t){Y(e.artifacts,t)}function ae(e){return gt(e)}function xn(e,t,n){return n.captureLastMessage===!1||t.includes("--output-last-message")||t.includes("-o")?!1:n.captureLastMessage===!0?!0:re(e)==="codex"}function An(e,t){return t.collectCodexTranscriptArtifacts===!1?!1:t.collectCodexTranscriptArtifacts===!0?!0:re(e)==="codex"}function On(e){return Math.max(20,_(e.codexTranscriptPollMs||e.transcriptPollMs,wn))}function Un(e){return e.codexTranscriptStreaming===!0||e.streamCodexTranscript===!0}function Cn(e,t,n,r=new Set){return{target:e,promptText:t,startedAtMs:n,baselinePaths:r,matchedPath:"",disabled:!1,processedLines:new Map}}function Mn(e,t){let n=c(e.env)?e.env:{},r=o(e.artifactRoot||e.artifactDir||e.runtimeArtifactRoot||n.ORCHA_RUNTIME_ARTIFACT_DIR)||A(ne(),"orcha-runtime-artifacts"),s=o(t).replace(/[^A-Za-z0-9._-]+/g,"-").slice(0,80)||j(),i=A(r,s),u=A(i,j());return fn(u,{recursive:!0}),{root:u,realRoot:et(u),sessionRoot:i,realSessionRoot:et(i)}}function ce(e){return o(c(e)?e.root:e)}function Vt(e){let t=ce(e),n=o(c(e)?e.sessionRoot:yn(t)),r=o(c(e)?e.realSessionRoot:"");if(n)try{if(r&&et(n)!==r)return;mn(n)}catch{}}function Nn(e,t={}){let n=ce(e),r=o(c(e)?e.realRoot:"");if(n){try{if(r&&et(n)!==r){f("warn","runtime.cli","runtime artifact directory cleanup skipped; path changed",{...t,artifactRoot:n});return}}catch{Vt(e);return}try{pn(n,{recursive:!0,force:!0})}catch(s){f("warn","runtime.cli","runtime artifact directory cleanup failed",{...t,artifactRoot:n,error:String(s?.message||s)});return}Vt(e)}}function bn(e,t){return{trustedFileRoots:[t,...I(e.trustedArtifactRoots),...I(e.trustedFileRoots),...I(e.artifactRoots),...I(e.artifactFileRoots)].filter(Boolean)}}function ue(e){let t=o(e.codexSessionsRoot||e.codexSessionRoot);if(t)return t;let n=c(e.env)?e.env:{},r=o(e.codexHome||n.CODEX_HOME||process.env.CODEX_HOME)||A(_n(),".codex");return A(r,"sessions")}function kn(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 de(e,t,n){let r=new Set;for(let s of[t-Q,t,t+Q,n-Q,n,n+Q])r.add(kn(e,s));return[...r].filter(s=>Qt(s))}function Pn(e,t,n){let r=ue(e),s=t-In,i=n+En,u=[];for(let a of de(r,t,n)){let d=[];try{d=te(a)}catch{continue}for(let l of d){if(!l.endsWith(".jsonl"))continue;let p=A(a,l);try{let m=hn(p);if(!m.isFile()||m.mtimeMs<s||m.mtimeMs>i)continue;u.push({path:p,mtimeMs:m.mtimeMs})}catch{}}}return u.sort((a,d)=>d.mtimeMs-a.mtimeMs).slice(0,Rn)}function Ln(e,t,n=t){let r=ue(e),s=new Set;for(let i of de(r,t,n)){let u=[];try{u=te(i)}catch{continue}for(let a of u)a.endsWith(".jsonl")&&s.add(A(i,a))}return s}function _t(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)_t(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&&_t(e[r],t,n+1)}}function le(e){return o(e).replace(/\s+/g," ")}function Dn(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 u of r){let a=t.slice(Math.max(0,u),Math.max(0,u)+n).trim();a.length>=40&&!s.has(a)&&(s.add(a),i.push(a))}return i}function Fn(e,t){let n=Dn(t);if(!n.length)return!1;let r=[];for(let i of e)_t(i,r);let s=le(r.join(" "));return n.every(i=>s.includes(i))}function $n(e){return e.find(t=>c(t)&&o(t.type)==="session_meta"&&c(t.payload))||null}function Hn(e){let t=c(e?.payload)?e.payload:{},n=o(e?.timestamp||t.timestamp),r=Date.parse(n);return Number.isFinite(r)?r:Number.NaN}function vn(e,t,n){if(!Fn(e,t.promptText))return!1;let r=$n(e);if(!r)return!1;let s=r.payload,i=o(s.originator),u=o(s.source);if(i!=="codex_exec"&&u!=="exec")return!1;let a=Hn(r);if(!Number.isFinite(a)||a<t.startedAtMs-5e3||a>n+5e3)return!1;let d=o(t.target.cwd),l=o(s.cwd);return!(d&&l&&Xt(d)!==Xt(l))}function Yt(e){try{return zn(ee(e,"utf8"))}catch{return null}}function Bn(e,t,n){if(!e||e.disabled)return null;if(e.matchedPath){let s=Yt(e.matchedPath);return s?{path:e.matchedPath,events:s}:null}let r=[];for(let s of Pn(e.target,e.startedAtMs,n)){if(e.baselinePaths.has(s.path))continue;let i=Yt(s.path);!i||!vn(i,e,n)||r.push({path:s.path,events:i})}return r.length!==1?(r.length>1&&(e.disabled=!0,f("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,f("info","runtime.cli","codex transcript stream attached",{target:e.target.targetCode,sessionId:t}),r[0])}function zn(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 jn(e){if(!c(e))return!1;let t=c(e.payload)?e.payload:{},n=o(e.type),r=o(t.type);return n==="event_msg"&&r==="image_generation_end"||n==="response_item"&&r==="image_generation_call"}function Gn(e,t,n,r){let s=se(e);if(s&&!t.emittedTexts.has(s)){let i=t.emittedTexts.size?`
|
|
9
9
|
|
|
10
|
-
${s}`:s;t.emittedTexts.add(s),r({sessionId:n,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:i}}})}
|
|
11
|
-
`,
|
|
12
|
-
`}}})}}}async sessionCancel(t){let n=o(t.sessionId),r=this.active.get(n);return r?(f("info","runtime.cli","cancelling runtime child",{target:this.agent.targetCode,sessionId:n,pid:r.pid}),
|
|
13
|
-
... [truncated ${r} characters]`}function
|
|
14
|
-
`?1:0)).trim()}function
|
|
15
|
-
`)}];return this.prompt({...t,agentId:r,sessionId:u,prompt:
|
|
16
|
-
`).replaceAll("\\r","\r").replaceAll("\\t"," ").replaceAll('\\"','"').replaceAll("\\\\","\\")}function
|
|
17
|
-
`),console.log(JSON.stringify({status:"started",pid:i.pid,pidFile:e,logFile:t}))}async function
|
|
18
|
-
`);
|
|
19
|
-
`:""),f("info","runtime-bridge","runtime log cleanup completed",{logFile:e,retentionDays:t,removed:a})}catch(
|
|
10
|
+
${s}`:s;t.emittedTexts.add(s),r({sessionId:n,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:i}}})}oe(t,ie(e,t.artifactOptions)),jn(e)&&r({sessionId:n,update:{sessionUpdate:"runtime_event",event:ae(e)}})}function Zt(e,t,n,r,s=Date.now()){if(!t)return{artifactCount:0,transcriptCount:0};let i=e.artifacts.size,u=0,a=Bn(t,n,s);if(a){let d=Math.min(t.processedLines.get(a.path)||0,a.events.length),l=e.artifacts.size;for(let p of a.events.slice(d))Gn(p,e,n,r);t.processedLines.set(a.path,a.events.length),(a.events.length>d||e.artifacts.size>l)&&(u=1)}return{artifactCount:e.artifacts.size-i,transcriptCount:u}}function Kn(e){if(!e||!Qt(e))return"";try{return ee(e,"utf8").trim()}catch{return""}finally{try{gn(e)}catch{}}}var nt=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=o(this.target.command);if(!s)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);let i=o(t.sessionId)||j(),u=J(t.prompt),a=o(this.target.promptMode||"stdin"),d=this.buildArgs(a,u),l=o(this.target.cwd)||this.agent.workspace||process.cwd(),p=Mn(this.target,i),m=p.root,g=bn(this.target,m),M=An(s,this.target),R={...this.target,targetCode:this.agent.targetCode,cwd:l},P=M?Ln(R,r):new Set,U=xn(s,d,this.target)?A(ne(),`orcha-runtime-last-message-${j()}.txt`):"";U&&d.push("--output-last-message",U);let w=_(this.target.timeoutMs||this.target.sessionPromptTimeoutMs,_(this.options.sessionPromptTimeoutMs,Tn)),C={...process.env,...c(this.target.env)?this.target.env:{},...a==="env"?{ORCHA_RUNTIME_PROMPT:u}:{},ORCHA_AGENT_ID:this.agent.agentId,ORCHA_SESSION_ID:i,ORCHA_RUNTIME_ARTIFACT_DIR:m},h=ln(s,d,{cwd:l,env:C,stdio:["pipe","pipe","pipe"]});this.active.set(i,h),f("info","runtime.cli","runtime prompt started",{target:this.agent.targetCode,sessionId:i,pid:h.pid,timeoutMs:w});let bt="",ut=o(this.target.outputMode||"text"),x={artifacts:new Map,emittedTexts:new Set,value:"",artifactOptions:g},dt=M?Cn(R,u,r,P):null;return h.stdout.setEncoding("utf8"),h.stdout.on("data",L=>this.handleStdout(L,ut,x,i,n)),h.stderr.setEncoding("utf8"),h.stderr.on("data",L=>{bt+=L,this.target.emitStderr===!0&&n({sessionId:i,update:{sessionUpdate:"runtime_stderr_chunk",content:{type:"text",text:L}}})}),a==="stdin"?h.stdin.end(u):h.stdin.end(),await new Promise((L,Le)=>{let G=!1,kt=!1,N=null,lt=dt&&Un(this.target)?setInterval(()=>{try{Zt(x,dt,i,n)}catch(T){f("warn","runtime.cli","codex transcript stream poll failed",{target:this.agent.targetCode,sessionId:i,error:String(T?.message||T)})}},On(this.target)):null;lt?.unref?.();let Pt=setTimeout(()=>{kt=!0,f("warn","runtime.cli","runtime prompt timed out; terminating child",{target:this.agent.targetCode,sessionId:i,pid:h.pid,timeoutMs:w}),tt(h,"SIGTERM"),N=setTimeout(()=>{f("warn","runtime.cli","runtime prompt force killing child",{target:this.agent.targetCode,sessionId:i,pid:h.pid}),tt(h,"SIGKILL")},Sn),N.unref?.(),Dt(Object.assign(new Error(`runtime CLI timed out after ${w}ms`),{code:"RUNTIME_CLI_TIMEOUT"}))},w);Pt.unref?.();let Lt=()=>{clearTimeout(Pt),lt&&clearInterval(lt),N&&!kt&&clearTimeout(N),Nn(p,{target:this.agent.targetCode,sessionId:i}),this.active.delete(i)},De=T=>{G||(G=!0,Lt(),L(T))},Dt=T=>{G||(G=!0,Lt(),Le(T))};h.on("error",T=>{f("warn","runtime.cli","runtime child error",{target:this.agent.targetCode,sessionId:i,pid:h.pid,error:String(T?.message||T)}),Dt(T)}),h.on("exit",(T,Ft)=>{N&&(clearTimeout(N),N=null),ut==="json-lines"&&x.value.trim()&&this.handleStdout(`
|
|
11
|
+
`,ut,x,i,n);let ft=Zt(x,dt,i,n,Date.now());ft.artifactCount>0&&f("info","runtime.cli","codex transcript artifacts collected",{target:this.agent.targetCode,sessionId:i,artifactCount:ft.artifactCount,transcriptCount:ft.transcriptCount});let K=Kn(U);K&&!x.emittedTexts.has(K)&&(x.emittedTexts.add(K),n({sessionId:i,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:K}}}));let q=bt.trim();q&&f("debug","runtime.cli","runtime stderr",{target:this.agent.targetCode,sessionId:i,stderr:q}),f("info","runtime.cli","runtime prompt finished",{target:this.agent.targetCode,sessionId:i,pid:h.pid,exitCode:T,signal:Ft,artifactCount:x.artifacts.size}),De({stopReason:T===0?"end_turn":"error",exitCode:T,signal:Ft,_artifacts:[...x.artifacts.values()],...q?{stderr:q}:{}})})})}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 u=r.value.split(/\r?\n/);r.value=u.pop()||"";for(let a of u){let d=a.trim();if(d)try{let l=JSON.parse(d);oe(r,ie(l,r.artifactOptions)),i({sessionId:s,update:{sessionUpdate:"runtime_event",event:ae(l)}});let p=se(l);p&&!r.emittedTexts.has(p)&&(r.emittedTexts.add(p),i({sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:p}}}))}catch{i({sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`${a}
|
|
12
|
+
`}}})}}}async sessionCancel(t){let n=o(t.sessionId),r=this.active.get(n);return r?(f("info","runtime.cli","cancelling runtime child",{target:this.agent.targetCode,sessionId:n,pid:r.pid}),tt(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())f("info","runtime.cli","stopping runtime child",{target:this.agent.targetCode,sessionId:n,pid:r.pid,reason:t}),tt(r,"SIGTERM");this.active.clear()}};var yt=24e3,Tt=8,St=50,It=6e3,qn=new Set(["fail","failed","failure","error","errored","timeout","timed_out","cancelled","canceled","aborted"]),Jn=10*60*1e3,Wn=60*1e3,Xn=8,Vn=60*1e3,Yn=1,Zn=new Set(["agentId","taskId","executionId","sessionId","nodeId","targetCode","framework","workspace","instructions"]),Qn=/(^|[_-])(token|secret|password|authorization|api[-_]?key|private[-_]?key|credential|cookie|jwt|access[-_]?token|refresh[-_]?token|service[-_]?token|execution[-_]?token)([_-]|$)/i;function tr(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:rt()}}}function O(e){return e==null||e===""?!1:typeof e=="string"?o(e)!=="":Array.isArray(e)?e.length>0:c(e)?Object.keys(e).length>0:!0}function er(e){let t=o(e).toLowerCase().replace(/[.。!!]+$/g,"").replace(/[\s-]+/g,"_");return qn.has(t)}function b(e,t){let n=_(e,t);return Number.isFinite(n)&&n>0?n:t}function nr(e,t=!1){if(typeof e=="boolean")return e;let n=o(e).toLowerCase();return["true","1","yes","y","on"].includes(n)?!0:["false","0","no","n","off"].includes(n)?!1:t}function $(e){return o(e?.type||"echo")}function rr(e){let t=String(e||"");if(Qn.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 Et(e,t=0){if(e==null||typeof e=="number"||typeof e=="boolean")return e;if(typeof e=="string"){if(e.length<=It)return e;let n=e.length-It;return`${e.slice(0,It)}... [truncated ${n} characters]`}if(t>=Tt)return Array.isArray(e)?`[array truncated at depth ${Tt}, items=${e.length}]`:c(e)?`[object truncated at depth ${Tt}, keys=${Object.keys(e).length}]`:String(e);if(Array.isArray(e)){let n=e.slice(0,St).map(r=>Et(r,t+1));return e.length>St&&n.push(`[truncated ${e.length-St} items]`),n}if(c(e)){let n={};for(let[r,s]of Object.entries(e))n[r]=rr(r)?"[REDACTED]":Et(s,t+1);return n}return String(e)}var sr=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 ir(e){if(!c(e))return e;let t={};for(let n of sr)O(e[n])&&(t[n]=e[n]);return t}function or(e){if(!c(e))return e;let t={...e};return c(t.renderedPayload)&&(t.renderedPayload=ir(t.renderedPayload)),t}function ar(e){let t=c(e)?e:{},n={};O(t.metadata)&&(n.metadata=or(t.metadata));for(let[r,s]of Object.entries(t))Zn.has(r)||r==="metadata"||O(s)&&(n[r]=s);return n}function cr(e){let t=ar(e);if(!O(t))return"";let n=JSON.stringify(Et(t),null,2);if(n.length<=yt)return n;let r=n.length-yt;return`${n.slice(0,yt)}
|
|
13
|
+
... [truncated ${r} characters]`}function ur(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 dr(e){if(!c(e))return null;let t=c(e.update)?e.update:e;return o(t.sessionUpdate)!=="runtime_event"?null:c(t.event)?t.event:null}function lr(e){if(!c(e))return"";let t=c(e.payload)?e.payload:{},n=o(e.type),r=o(t.type);if(n==="event_msg"){if(r==="task_complete")return o(t.last_agent_message||t.message||t.output);if(r==="agent_message"){let s=o(t.phase||t.status||t.stage).toLowerCase();if(["final_answer","final","complete","completed","done"].includes(s))return o(t.message||t.text||t.content)}}return""}function fr(e){if(!Array.isArray(e))return"";for(let t=e.length-1;t>=0;t-=1){let n=lr(dr(e[t]));if(n)return n}return""}function pr(e){let t="";for(let n of e){let r=String(n||"");r&&(t?r.startsWith(t)?t=r:t.endsWith(r)||(t+=r):t=r)}return t.trim()}function mr(e){let t=String(e||"").trim();if(!t)return"";let n=t.match(/(?:^|\n)#{1,3}\s+\S/);return!n||n.index===0?t:t.slice(n.index+(t[n.index]===`
|
|
14
|
+
`?1:0)).trim()}function fe(e){let t=String(e||"").trim();if(!t)return null;try{let n=JSON.parse(t);if(c(n)&&(me(n)||O(n._artifacts)||O(n.artifacts)||O(n._decision)||O(n._meta)))return n}catch{}return null}function hr(e){let t=String(e||"").trim();if(!t)return null;let n=[...t.matchAll(/```(?:json)?\s*([\s\S]*?)```/gi)];for(let r=n.length-1;r>=0;r-=1){let s=fe(n[r][1]);if(s)return s}if(!t.endsWith("}"))return null;for(let r=t.lastIndexOf("{");r>=0;r=t.lastIndexOf("{",r-1)){let s=fe(t.slice(r));if(s)return s}return null}function me(e){if(!c(e))return!1;if(O(e.output))return!0;for(let t of["content","text","message","summary"])if(o(e[t]))return!0;return!!(er(e.status)||o(e.error)||o(e.errorMessage))}function pe(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 gr(e,t){let n=pe(e);if(me(n))return n;let r=fr(t);if(r){let i=hr(r);if(i){let u=pe(i);return{...n,...u,_meta:{...c(n._meta)?n._meta:{},...c(u._meta)?u._meta:{},runtimeOutputSource:"final_event"}}}return{...n,output:r,_meta:{...c(n._meta)?n._meta:{},runtimeOutputSource:"final_event"}}}let s=mr(pr((Array.isArray(t)?t:[]).map(ur)));return s?{...n,output:s,_meta:{...c(n._meta)?n._meta:{},runtimeOutputSource:"updates"}}:n}var st=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=B(),this.cleanupTimer=null,this.startSessionCleanup()}targetFor(t){let n=o(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=$(t)==="openclaw"?b(this.config.openClawSessionIdleTtlMs,Vn):b(this.config.sessionIdleTtlMs,Jn);return b(t?.sessionIdleTtlMs??t?.idleTtlMs,r)}targetMaxSessions(t){let r=$(t)==="openclaw"?b(this.config.openClawMaxSessions,Yn):b(this.config.maxSessionsPerTarget,Xn);return b(t?.maxSessions,r)}targetReleaseAfterPrompt(t){let n=$(t);return nr(t?.releaseAfterPrompt??t?.disposeAfterPrompt,n==="openclaw")}startSessionCleanup(){let t=b(this.config.sessionCleanupIntervalMs,Wn);t<=0||(this.cleanupTimer=setInterval(()=>this.cleanupExpiredSessions(),t),this.cleanupTimer.unref?.())}sessionCountForTarget(t){let n=0;for(let r of this.sessions.values())r.targetCode===t&&(n+=1);return n}idleTargetSessions(t){return[...this.sessions.entries()].filter(([,n])=>n.targetCode===t&&!n.busy).sort((n,r)=>(n[1].lastUsedAtMs||0)-(r[1].lastUsedAtMs||0))}closeSession(t,n="session_closed"){let r=this.sessions.get(t);if(!r)return!1;try{r.runtime?.stop?.(n)}catch(s){f("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}`),f("info","runtime-bridge","runtime session closed",{sessionId:r.sessionId,runtimeSessionId:r.runtimeSessionId,targetCode:r.targetCode,runtimeKind:r.runtimeKind,reason:n}),!0}closeAllSessions(t="bridge_shutdown"){for(let n of[...this.sessions.keys()])this.closeSession(n,t)}stop(t="bridge_stop"){this.cleanupTimer&&clearInterval(this.cleanupTimer),this.cleanupTimer=null,this.closeAllSessions(t)}cleanupExpiredSessions(t=Date.now()){for(let[n,r]of[...this.sessions.entries()])r.busy||t-(r.lastUsedAtMs||r.createdAtMs||t)>r.idleTtlMs&&this.closeSession(n,"idle_timeout")}reserveTargetSlot(t,n){let r=this.targetMaxSessions(n);for(;this.sessionCountForTarget(t)>=r;){let s=this.idleTargetSessions(t);if(!s.length){let i=new Error(`runtime target session limit reached: ${t}`);throw i.code="RUNTIME_TARGET_SESSION_LIMIT",i}this.closeSession(s[0][0],"target_session_limit")}}async createAgent(t){let n=o(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:o(t.framework||r),workspace:o(t.workspace),metadata:c(t.metadata)?t.metadata:{},createdAt:B(),runtimeKind:$(s)};return this.agents.set(n,i),{agent:i}}runtimeFor(t,n){let{target:r}=this.targetFor(t.targetCode),s=$(r),i={onPermissionRequest:a=>this.requestPermission(a)},u={sessionPromptTimeoutMs:this.config.sessionPromptTimeoutMs};return s==="stdio-acp"||s==="acp"?new F(t,r,i,u):s==="openclaw"?new Z(t,r,n,i,u):s==="cli"?new nt(t,r,u):new W(t)}async prompt(t,n={}){let r=o(t.agentId),s=o(t.sessionId)||rt();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,metadata:t.metadata})).agent,u=o(t.workspace);u&&u!==i.workspace&&(i.workspace=u);let a=`${r}:${s}`;this.cleanupExpiredSessions();let d=this.sessions.get(a);if(!d){let{code:m,target:g}=this.targetFor(i.targetCode);this.reserveTargetSlot(m,g);let M=this.runtimeFor(i,s),R=await M.sessionNew({cwd:i.workspace||process.cwd(),metadata:c(t.metadata)?t.metadata:{}}),P=Date.now();d={agentId:r,sessionId:s,runtime:M,targetCode:m,runtimeKind:$(g),runtimeSessionId:o(c(R)?R.sessionId:"")||s,idleTtlMs:this.targetIdleTtlMs(g),releaseAfterPrompt:this.targetReleaseAfterPrompt(g),createdAtMs:P,lastUsedAtMs:P,busy:!1,createdAt:B()},this.sessions.set(a,d),this.runtimeSessionIndex.set(`${r}:${d.runtimeSessionId}`,d)}if(d.busy){let m=new Error(`runtime session is already running: ${s}`);throw m.code="RUNTIME_SESSION_BUSY",m}d.busy=!0,d.lastUsedAtMs=Date.now();let l=[],p=m=>{let g=tr(m,s,d);l.push(g),n.onUpdate?.(g)};try{let m=await d.runtime.sessionPrompt({sessionId:d.runtimeSessionId,prompt:Array.isArray(t.prompt)?t.prompt:[],metadata:c(t.metadata)?t.metadata:{}},p),g=gr(m,l);return{sessionId:s,runtimeSessionId:d.runtimeSessionId,result:g,updates:l}}finally{d.busy=!1,d.lastUsedAtMs=Date.now(),d.releaseAfterPrompt&&this.closeSession(a,"release_after_prompt")}}async cancel(t){let n=o(t.agentId),r=o(t.sessionId),s=`${n}:${r}`,i=this.sessions.get(s);return i?(await i.runtime.sessionCancel({sessionId:i.runtimeSessionId}),this.closeSession(s,"cancelled"),{cancelled:!0}):{cancelled:!1}}async dispatch(t,n={}){let r=o(t.agentId),s=o(t.taskId),i=o(t.executionId);if(!r||!s)throw Object.assign(new Error("agentId and taskId are required"),{status:400,code:"BAD_REQUEST"});let u=o(t.sessionId)||`dispatch-${i||s}`,a=o(t.instructions),d=cr(t),l=[{type:"text",text:["Task dispatch received.",`taskId: ${s}`,i?`executionId: ${i}`:"",a?`instructions: ${a}`:"",d?"orchaContext:":"",d,d?"Use orchaContext as the source of truth for upstream outputs, review reports, artifacts, and workflow metadata.":"","Follow the execution protocol in instructions exactly.","Return only the final answer required by that protocol.","Do not include process notes, logs, or explanations."].filter(Boolean).join(`
|
|
15
|
+
`)}];return this.prompt({...t,agentId:r,sessionId:u,prompt:l},n)}async requestPermission({agent:t,runtimeSessionId:n,request:r,emitUpdate:s}){let i=rt(),a=this.runtimeSessionIndex.get(`${t.agentId}:${n}`)?.sessionId||n||rt(),d={permissionId:i,agentId:t.agentId,sessionId:a,runtimeSessionId:n,request:c(r)?r:{},status:"pending",createdAt:B()};return s?.({sessionId:n,update:{sessionUpdate:"permission_request",permission:d}}),await new Promise(l=>{let p=_(r?.timeoutMs,this.config.permissionRequestTimeoutMs),m=setTimeout(()=>{this.pendingPermissions.delete(i),l({permissionId:i,outcome:"denied",response:{reason:"permission request timed out"}})},p);this.pendingPermissions.set(i,{timer:m,resolve:l,permission:d})})}async respondPermission(t){let n=o(t.permissionId),r=this.pendingPermissions.get(n),s=o(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:o(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:D,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 _r from"node:http";import yr from"node:https";import{randomBytes as he}from"node:crypto";var it=1,Rt=3,ot=class{constructor(t){this.url=t,this.readyState=0,this.socket=null,this.buffer=Buffer.alloc(0),this.listeners=new Map,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:"?yr:_r,r=he(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"}});s.on("upgrade",(i,u,a)=>{this.socket=u,this.readyState=it,u.on("data",d=>this.onData(d)),u.on("close",()=>this.onClose()),u.on("error",d=>{this.emit("error",{error:d,message:d.message,type:"error"}),this.onClose()}),a?.length&&this.onData(a),this.emit("open")}),s.on("response",i=>{this.emit("error",{message:`websocket upgrade failed: HTTP ${i.statusCode}`,type:"error"}),i.resume(),this.onClose()}),s.on("error",i=>{this.emit("error",{error:i,message:i.message,type:"error"}),this.onClose()}),s.end()}send(t){!this.socket||this.readyState!==it||this.socket.write(wt(1,Buffer.from(String(t),"utf8")))}close(){!this.socket||this.readyState===Rt||(this.socket.write(wt(8,Buffer.alloc(0))),this.socket.end(),this.onClose())}onClose(){this.readyState!==Rt&&(this.readyState=Rt,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,u=r&127,a=2;if(u===126){if(this.buffer.length<a+2)return;u=this.buffer.readUInt16BE(a),a+=2}else if(u===127){if(this.buffer.length<a+8)return;let p=this.buffer.readUInt32BE(a),m=this.buffer.readUInt32BE(a+4);u=p*2**32+m,a+=8}let d=a;if(i&&(a+=4),this.buffer.length<a+u)return;let l=this.buffer.subarray(a,a+u);if(i){let p=this.buffer.subarray(d,d+4);l=Buffer.from(l.map((m,g)=>m^p[g%4]))}this.buffer=this.buffer.subarray(a+u),s===1?this.emit("message",{data:l.toString("utf8")}):s===8?this.close():s===9&&this.socket?.write(wt(10,l))}}};function wt(e,t){let n=t.length,r=2;n>=126&&n<=65535?r+=2:n>65535&&(r+=8);let s=he(4),i=Buffer.alloc(r+4+n);i[0]=128|e;let u=2;n<126?i[1]=128|n:n<=65535?(i[1]=254,i.writeUInt16BE(n,u),u+=2):(i[1]=255,i.writeUInt32BE(Math.floor(n/2**32),u),i.writeUInt32BE(n>>>0,u+4),u+=8),s.copy(i,u),u+=4;for(let a=0;a<n;a+=1)i[u+a]=t[a]^s[a%4];return i}function Tr(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 Sr(e){return Object.entries(e||{}).map(([t,n])=>({targetCode:t,targetName:o(n?.name||n?.targetName||t),targetType:o(n?.type||"echo"),status:"available",metadata:c(n)?n:{}}))}var at=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(){let t=Tr(this.config.orchaUrl),n=new ot(t);this.ws=n,n.addEventListener("open",()=>this.authenticate()),n.addEventListener("message",r=>this.handleMessage(r.data)),n.addEventListener("close",()=>this.scheduleReconnect("close")),n.addEventListener("error",r=>{f("warn","orcha-client","runtime node websocket error",{error:String(r?.message||r?.type||r)})})}authenticate(){this.send({type:"runtime_node.authenticate",token:this.config.nodeToken,nodeId:this.config.nodeId,nodeName:this.config.nodeName,version:D,protocolVersion:"orcha-runtime-node.v1",defaultTargetCode:this.config.defaultTargetCode,targets:Sr(this.config.targets)})}scheduleReconnect(t){this.connected=!1,!this.stopped&&(this.reconnectTimer||(f("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){let n;try{n=JSON.parse(String(t))}catch(r){f("warn","orcha-client","invalid Orcha websocket frame",{error:String(r)});return}if(c(n)){if(n.type==="runtime_node.authenticated"){this.connected=!0,f("info","orcha-client","runtime node authenticated",{nodeId:this.config.nodeId,connectionId:n.connectionId});return}if(n.type==="orcha.runtime.request"){await this.handleRequest(n);return}n.type==="runtime_node.ping"&&this.send({type:"runtime_node.pong",ts:new Date().toISOString()})}}async handleRequest(t){let n=o(t.id),r=o(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){return!this.ws||this.ws.readyState!==it?!1:(this.ws.send(JSON.stringify(t)),!0)}};import{existsSync as Ir,readFileSync as Er}from"node:fs";import{resolve as ge}from"node:path";var Rr=/^[A-Za-z_][A-Za-z0-9_]*$/;function _e(e=process.env,t=process.cwd()){let n=o(e.ORCHA_RUNTIME_ENV_FILE),r=n?ge(t,n):ge(t,".env");if(!Ir(r))return n&&f("warn","config","runtime env file not found",{path:r}),{loaded:!1,path:r,keys:[]};let s=[],i=Er(r,"utf8");for(let u of i.split(/\r?\n/)){let a=xr(u);if(!a)continue;let[d,l]=a;Object.prototype.hasOwnProperty.call(e,d)||(e[d]=l,s.push(d))}return f("info","config","runtime env file loaded",{path:r,keyCount:s.length}),{loaded:!0,path:r,keys:s}}function ye(e=process.env){return{mode:o(e.ORCHA_RUNTIME_MODE||(e.ORCHA_RUNTIME_ORCHA_URL?"node":"server")),host:e.ORCHA_RUNTIME_BRIDGE_HOST||"127.0.0.1",port:_(e.ORCHA_RUNTIME_BRIDGE_PORT,5588),token:e.ORCHA_RUNTIME_BRIDGE_TOKEN||"",orchaUrl:o(e.ORCHA_RUNTIME_ORCHA_URL),nodeToken:e.ORCHA_RUNTIME_NODE_TOKEN||e.ORCHA_RUNTIME_BRIDGE_TOKEN||"",nodeId:o(e.ORCHA_RUNTIME_NODE_ID||e.HOSTNAME||"local-runtime-node"),nodeName:o(e.ORCHA_RUNTIME_NODE_NAME||e.ORCHA_RUNTIME_NODE_ID||e.HOSTNAME||"Local Runtime Node"),reconnectMs:_(e.ORCHA_RUNTIME_RECONNECT_MS,3e3),defaultTargetCode:e.ORCHA_RUNTIME_DEFAULT_TARGET||"echo",requestLimitBytes:_(e.ORCHA_RUNTIME_REQUEST_LIMIT_BYTES,1048576),sessionPromptTimeoutMs:_(e.ORCHA_RUNTIME_SESSION_PROMPT_TIMEOUT_MS,36e5),permissionRequestTimeoutMs:_(e.ORCHA_RUNTIME_PERMISSION_TIMEOUT_MS,3e5),sessionIdleTtlMs:_(e.ORCHA_RUNTIME_SESSION_IDLE_TTL_MS,6e5),sessionCleanupIntervalMs:_(e.ORCHA_RUNTIME_SESSION_CLEANUP_INTERVAL_MS,6e4),maxSessionsPerTarget:_(e.ORCHA_RUNTIME_MAX_SESSIONS_PER_TARGET,8),openClawSessionIdleTtlMs:_(e.ORCHA_RUNTIME_OPENCLAW_SESSION_IDLE_TTL_MS,6e4),openClawMaxSessions:_(e.ORCHA_RUNTIME_OPENCLAW_MAX_SESSIONS,1),targets:wr(e.ORCHA_RUNTIME_TARGETS_JSON||"")}}function wr(e){if(!o(e))return{};try{let t=JSON.parse(e);if(c(t))return t}catch(t){f("warn","config","invalid ORCHA_RUNTIME_TARGETS_JSON",{error:String(t)})}return{}}function xr(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(!Rr.test(s))return null;let i=Ar(n.slice(r+1).trim());return[s,i]}function Ar(e){if(!e)return"";let t=e[0];if((t==='"'||t==="'")&&e.endsWith(t)){let n=e.slice(1,-1);return t==='"'?Or(n):n}return Ur(e).trim()}function Or(e){return e.replaceAll("\\n",`
|
|
16
|
+
`).replaceAll("\\r","\r").replaceAll("\\t"," ").replaceAll('\\"','"').replaceAll("\\\\","\\")}function Ur(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 Cr}from"node:http";function ct(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 k(e={}){return{ok:!0,...e}}function xt(e,t,n){return{ok:!1,error:{code:e,message:t,...n===void 0?{}:{detail:n}}}}async function Te(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 Se(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 Ie(e,t){let n={"GET /health":async()=>k(t.health()),"POST /agents/create":async r=>k(await t.createAgent(r)),"POST /agents/dispatch":async r=>k(await t.dispatch(r)),"POST /sessions/prompt":async r=>k(await t.prompt(r)),"POST /sessions/cancel":async r=>k(await t.cancel(r)),"POST /permissions/respond":async r=>k(await t.respondPermission(r))};return Cr(async(r,s)=>{let i=new URL(r.url||"/",`http://${r.headers.host||`${e.host}:${e.port}`}`),u=`${r.method||"GET"} ${i.pathname}`,a=n[u];if(!a){ct(s,404,xt("NOT_FOUND",`No route for ${u}`));return}try{Se(r,e.token);let d=r.method==="GET"?{}:await Te(r,e.requestLimitBytes);ct(s,200,await a(d))}catch(d){let l=d.status||500,p=d.code||"BRIDGE_INTERNAL";ct(s,l,xt(p,d.message||String(d)))}})}var Fr=Dr(import.meta.url),$r=".orcha-runtime-bridge.pid",Hr=".orcha-runtime-bridge.log",vr=3,Br=36e5,{command:zr,options:Ne}=qr(process.argv.slice(2));Jr(Ne);_e();var jr=ye();await Gr(zr,jr,Ne);async function Gr(e,t,n){switch(e){case"run":case"foreground":Re(t);return;case"start":if(n.foreground){Re(t);return}xe();return;case"reload":case"restart":await Ae({quiet:!0}),xe();return;case"stop":await Ae();return;case"status":Kr();return;case"help":case"--help":case"-h":Yr();return;default:throw new Error(`Unknown command: ${e}`)}}function Re(e){Wr();let t=new st(e);if(e.mode==="server"){let r=Ie(e,t);we({bridge:t,server:r}),r.listen(e.port,e.host,()=>{f("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 at(e,t);we({bridge:t,client:n}),n.start(),f("info","runtime-bridge","Orcha runtime node started",{nodeId:e.nodeId,nodeName:e.nodeName,orchaUrl:e.orchaUrl,targets:Object.keys(t.targets)})}function we({bridge:e,client:t,server:n}){let r=!1,s=i=>{if(r)return;r=!0;let u=Number(e?.sessions?.size||0)>0;f("info","runtime-bridge","runtime bridge shutting down",{signal:i});try{t?.stop?.()}catch(a){f("warn","runtime-bridge","runtime client stop failed",{error:String(a)})}try{e?.stop?.(`process_${String(i||"shutdown").toLowerCase()}`)}catch(a){f("warn","runtime-bridge","runtime bridge stop failed",{error:String(a)})}try{n?.close?.()}catch(a){f("warn","runtime-bridge","runtime server close failed",{error:String(a)})}setTimeout(()=>process.exit(0),u?5500:200)};process.once("SIGTERM",()=>s("SIGTERM")),process.once("SIGINT",()=>s("SIGINT"))}function xe(){let e=Mt(),t=be(),n=Nt(e);if(n&&H(n)){console.log(JSON.stringify({status:"already_running",pid:n,pidFile:e,logFile:t}));return}n&&Ut(e),Ue(e),Ue(t),Ot(t);let r=kr(t,"a"),s={...process.env,ORCHA_RUNTIME_PID_FILE:e,ORCHA_RUNTIME_LOG_FILE:t},i=Mr(process.execPath,[Fr,"run"],{cwd:process.cwd(),detached:!0,env:s,stdio:["ignore",r,r]});i.unref(),Nr(r),Me(e,`${i.pid}
|
|
17
|
+
`),console.log(JSON.stringify({status:"started",pid:i.pid,pidFile:e,logFile:t}))}async function Ae({quiet:e=!1}={}){let t=Mt(),n=Nt(t);if(!n){e||console.log(JSON.stringify({status:"not_running",pidFile:t}));return}if(!H(n)){Ut(t),e||console.log(JSON.stringify({status:"not_running",pid:n,pidFile:t}));return}process.kill(n,"SIGTERM"),!await Oe(n,1e4)&&H(n)&&(process.kill(n,"SIGKILL"),await Oe(n,3e3)),Ut(t),e||console.log(JSON.stringify({status:"stopped",pid:n,pidFile:t}))}function Kr(){let e=Mt(),t=be(),n=Nt(e),r=!!(n&&H(n));console.log(JSON.stringify({status:r?"running":"not_running",running:r,pid:r?n:null,pidFile:e,logFile:t}))}function qr(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 Jr(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 Mt(){return Ct(process.cwd(),process.env.ORCHA_RUNTIME_PID_FILE||$r)}function be(){return Ct(process.cwd(),process.env.ORCHA_RUNTIME_LOG_FILE||Hr)}function Wr(){let e=process.env.ORCHA_RUNTIME_LOG_FILE;if(!e)return;let t=ke();if(t<=0)return;let n=Ct(process.cwd(),e);Ot(n,t);let r=Vr();r<=0||setInterval(()=>Ot(n,t),r).unref()}function Ot(e,t=ke()){if(t<=0||!Ce(e))return;let n=0,r="";try{if(n=Ee(e).size,n<=0)return;r=At(e,"utf8")}catch(l){f("warn","runtime-bridge","runtime log cleanup skipped",{logFile:e,error:String(l)});return}let s=Date.now()-t*24*60*60*1e3,i=r.split(/\r?\n/),u=[],a=0;for(let l of i)l&&(Xr(l,s)?u.push(l):a+=1);if(a===0)return;let d="";try{Ee(e).size>n&&(d=At(e,"utf8").slice(r.length));let p=[...u,...d.split(/\r?\n/).filter(Boolean)].join(`
|
|
18
|
+
`);Me(e,p?`${p}
|
|
19
|
+
`:""),f("info","runtime-bridge","runtime log cleanup completed",{logFile:e,retentionDays:t,removed:a})}catch(l){f("warn","runtime-bridge","runtime log cleanup failed",{logFile:e,error:String(l)})}}function Xr(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 ke(){return Pe(process.env.ORCHA_RUNTIME_LOG_RETENTION_DAYS,vr)}function Vr(){return Pe(process.env.ORCHA_RUNTIME_LOG_CLEANUP_INTERVAL_MS,Br)}function Pe(e,t){let n=Number.parseInt(String(e??""),10);return Number.isFinite(n)&&n>=0?n:t}function Nt(e){if(!Ce(e))return null;let t=Number.parseInt(At(e,"utf8").trim(),10);return Number.isInteger(t)&&t>0?t:null}function H(e){try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}async function Oe(e,t){let n=Date.now();for(;Date.now()-n<t;){if(!H(e))return!0;await new Promise(r=>setTimeout(r,100))}return!H(e)}function Ue(e){br(Lr(e),{recursive:!0})}function Ut(e){try{Pr(e,{force:!0})}catch{}}function Yr(){console.log(`Usage: orcha-runtime-bridge [command] [options]
|
|
20
20
|
|
|
21
21
|
Commands:
|
|
22
22
|
run, foreground Run in the foreground. This is the default.
|