@orcha-ai/runtime-bridge 0.1.7 → 0.1.9
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 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=
|
|
2
|
+
import{spawn as Fr}from"node:child_process";import{closeSync as $r,existsSync as ke,mkdirSync as Hr,openSync as vr,readFileSync as Ct,rmSync as Br,statSync as Ae,writeFileSync as Le}from"node:fs";import{dirname as zr,resolve as bt}from"node:path";import{fileURLToPath as jr}from"node:url";import{randomUUID as rt}from"node:crypto";var D="0.1.9";function B(){return new Date().toISOString()}function S(e,t=2){return String(e).padStart(t,"0")}function Bt(e){let t=e>=0?"+":"-",n=Math.abs(e);return`${t}${S(Math.floor(n/60))}:${S(n%60)}`}function Be(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)}`,Bt(t)].join("")}function ze(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 je(e,t){let n=ze(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)}`,Bt(s)].join("")}function Ge(e=new Date){let t=o(process.env.ORCHA_RUNTIME_LOG_TIMEZONE||process.env.TZ||"Asia/Shanghai");try{return je(e,t)}catch{return Be(e)}}function a(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 Ke="[redacted]",qe=/(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]=qe.test(r)?Ke:v(s,t);return t.delete(e),n}function zt(e,t=4e3){let n=JSON.stringify(v(e))??String(e);return!Number.isFinite(t)||n.length<=t?n:`${n.slice(0,t)}...`}function p(e,t,n,r={}){let s={ts:Ge(),level:e,module:t,msg:n,...a(r)?v(r):{}};console.error(JSON.stringify(s))}function J(e){return Array.isArray(e)?e.map(t=>a(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",We=3e4;function Xe(e){return{code:Number.isInteger(e?.code)?e.code:-32e3,message:o(e?.message)||String(e),data:a(e?.data)?e.data:void 0}}function Ve(e){if(!a(e))return new Error(String(e||"runtime error"));let t=o(e.message)||"runtime error",n="data"in e?zt(e.data,4e3):"",r=new Error(n?`${t}; data=${n}`:t);return r.rpcCode=e.code,r.data=e.data,r}function Ye(e){return a(e)&&"id"in e&&!("method"in e)}function Ze(e){return a(e)&&typeof e.method=="string"&&"id"in e}function Qe(e){return a(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,...a(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&&p("debug","runtime.stderr","runtime stderr",{target:this.label,text:s})}),this.child.on("exit",(r,s)=>this.handleExit(r,s)),this.child.on("error",r=>this.rejectAll(r)),t&&await this.call("initialize",{protocolVersion:1,clientCapabilities:{},...n}).catch(r=>{throw Object.assign(new Error(`runtime initialize failed: ${r.message}`),{code:"RUNTIME_INITIALIZE_FAILED"})}))}onStdout(t){if(this.framing==="content-length"){this.onContentLengthData(Buffer.isBuffer(t)?t:Buffer.from(t));return}this.onLineData(t.toString("utf8"))}onLineData(t){this.lineBuffer+=t;let n=this.lineBuffer.split(/\r?\n/);this.lineBuffer=n.pop()||"";for(let r of n){let s=r.trim();s&&this.dispatchRaw(s)}}onContentLengthData(t){for(this.headerBuffer=Buffer.concat([this.headerBuffer,t]);this.headerBuffer.length>0;){let n=this.headerBuffer.indexOf(`\r
|
|
4
4
|
\r
|
|
5
|
-
`);if(n<0)return;let s=this.headerBuffer.subarray(0,n).toString("utf8").match(/content-length:\s*(\d+)/i);if(!s){
|
|
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),u=n+4,c=u+i;if(this.headerBuffer.length<c)return;let d=this.headerBuffer.subarray(u,c).toString("utf8");this.headerBuffer=this.headerBuffer.subarray(c),this.dispatchRaw(d)}}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(Ye(t)){this.resolveResponse(t);return}if(Ze(t)){this.handleRequest(t);return}Qe(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(Ve(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(a(t.params)?t.params:{},t);this.writeFrame({jsonrpc:z,id:t.id,result:r??{}})}catch(r){this.writeFrame({jsonrpc:z,id:t.id,error:Xe(r)})}}handleNotification(t){let n=this.notificationHandlers.get(t.method);if(n)for(let r of n)r(a(t.params)?t.params:{},t)}call(t,n={},r=We){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,c)=>{let d=setTimeout(()=>{this.pending.delete(s),c(new Error(`${t} timed out after ${r}ms`))},r);this.pending.set(s,{resolve:u,reject:c,timer:d,method:t}),this.writeFrame(i,l=>{l&&(clearTimeout(d),this.pending.delete(s),c(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 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 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 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),c=Gt(i.split("?",1)[0].split("#",1)[0]).toLowerCase();return[".png",".jpg",".jpeg",".webp",".gif"].includes(c)}function ht(e,t={}){let{source:n="runtime_image_generation_event"}=t;if(!u(e))return null;let r=u(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 c=y(r.call_id,r.id),a=y(r.saved_path,r.savedPath),l=y(r.revised_prompt,r.revisedPrompt),d=Kt(a,r.mimeType||r.mime_type),p=Jt(r.result,d)||pt(a,d,t);if(!p)return null;let m=p.startsWith("data:")?p:"",g=a?jt(a):`${c||zt()}.png`;return{artifactType:"image",type:"image",fieldKey:"image",title:g||"Generated image",summary:l||"Generated image",content:{prompt:l||void 0,dataUrl:m||void 0,imageUrl:p,previewUrl:p,fileUrl:p,mimeType:d},dataUrl:m||void 0,previewUrl:p,fileUrl:p,metadata:{source:n,eventType:i,callId:c||void 0,savedPath:a||void 0,filename:g,mimeType:d,revisedPrompt:l||void 0}}}function an(e){let t=u(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];u(s)&&n.push(s)}return n}function cn(e,t={}){let{source:n="runtime_artifact"}=t,r=u(e)?e:{};if(!Object.keys(r).length)return null;let s=u(r.content)?{...r.content}:{},i=u(r.metadata)?{...r.metadata}:{},c=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),l=y(r.artifactType,r.artifact_type,r.type,r.kind,s.type,c?"image":"file"),d=on(r,s,l,c),p=d?Kt(c,a):a;if(d){let O=y(r.dataUrl,s.dataUrl),R=O.startsWith("data:")?O:"",U=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=Jt(r.result??s.result,p)||R||pt(c,p,t)||pt(U,p,t);h&&(h.startsWith("data:")&&(s.dataUrl||=h),s.imageUrl||=h,s.previewUrl||=h,s.fileUrl||=h,p&&(s.mimeType||=p))}for(let[O,R]of[["prompt","prompt"],["previewUrl","previewUrl"],["fileUrl","fileUrl"],["downloadUrl","downloadUrl"],["imageUrl","imageUrl"],["dataUrl","dataUrl"],["url","url"],["uri","uri"],["mimeType","mimeType"],["mime_type","mimeType"]]){let U=r[O];U!=null&&U!==""&&!(R in s)&&(s[R]=U)}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:""),w=y(r.filename,i.filename,c?jt(c):""),P=y(r.fieldKey,r.field_key,s.fieldKey,i.fieldKey,d?"image":"artifact");return{...r,artifactType:l,type:r.type||l,fieldKey:P,title:y(r.title,w,"Runtime artifact"),summary:y(r.summary,s.prompt,r.title,w,"Runtime artifact"),content:s,dataUrl:M||void 0,fileUrl:m||void 0,previewUrl:g||void 0,metadata:{...i,source:y(i.source,n),savedPath:c||i.savedPath,filename:w||i.filename,mimeType:p||i.mimeType}}}function Y(e,t){if(!t||!e)return;let n=u(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={...u(s.content)?s.content:{},...u(t.content)?t.content:{}},s.metadata={...u(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(!u(e)||!u(e.payload))return u(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(!u(e))return e;let r=u(e.event)?e.event:null;return r?(Y(t,ht(r,n)),{...e,event:gt(r)}):e}function qt(e,t,n={}){if(!u(e))return e;mt(e,t,n);let r=Bt(e,t,n),s=u(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=u(e)?{...e}:{};mt(r,t,n),mt(u(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:u(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},...u(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(),c=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 Wt(l,s,i)}finally{c(),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=u(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=u(e.metadata)?e.metadata:{};return o(t.agentCode)}function ln(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 c=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",ln(t,c)];super(t,{...n,command:a,args:d},s,i)}};import{spawn as dn}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,wn=12,Rn=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(!u(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(!u(e))return"";let t=u(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=u(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,Rn))}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=u(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),c=A(i,j());return fn(c,{recursive:!0}),{root:c,realRoot:et(c),sessionRoot:i,realSessionRoot:et(i)}}function ce(e){return o(u(e)?e.root:e)}function Vt(e){let t=ce(e),n=o(u(e)?e.sessionRoot:yn(t)),r=o(u(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(u(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=u(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 le(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,c=[];for(let a of le(r,t,n)){let l=[];try{l=te(a)}catch{continue}for(let d of l){if(!d.endsWith(".jsonl"))continue;let p=A(a,d);try{let m=hn(p);if(!m.isFile()||m.mtimeMs<s||m.mtimeMs>i)continue;c.push({path:p,mtimeMs:m.mtimeMs})}catch{}}}return c.sort((a,l)=>l.mtimeMs-a.mtimeMs).slice(0,wn)}function Ln(e,t,n=t){let r=ue(e),s=new Set;for(let i of le(r,t,n)){let c=[];try{c=te(i)}catch{continue}for(let a of c)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(u(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 de(e){return o(e).replace(/\s+/g," ")}function Dn(e){let t=de(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 c of r){let a=t.slice(Math.max(0,c),Math.max(0,c)+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=de(r.join(" "));return n.every(i=>s.includes(i))}function $n(e){return e.find(t=>u(t)&&o(t.type)==="session_meta"&&u(t.payload))||null}function Hn(e){let t=u(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),c=o(s.source);if(i!=="codex_exec"&&c!=="exec")return!1;let a=Hn(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&&Xt(l)!==Xt(d))}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(!u(e))return!1;let t=u(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?`
|
|
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||(p("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 Kt}from"node:crypto";import{existsSync as tn,readFileSync as en,realpathSync as jt,statSync as nn}from"node:fs";import{basename as qt,extname as Jt,isAbsolute as rn,relative as sn}from"node:path";var on=25*1024*1024;function Wt(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 Xt(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 an(e,t){let n=sn(t,e);return n===""||!!n&&!n.startsWith("..")&&!rn(n)}function cn(e,t){let n=o(e);if(!n||!tn(n))return"";try{let r=jt(n);for(let s of t)try{let i=jt(s);if(an(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:un(r,t,n)}function un(e,t,n={}){let r=[...V(n.trustedFileRoots),...V(n.trustedFileRoot),...V(n.artifactRoots),...V(n.artifactRoot)],s=cn(e,r);if(!s)return"";try{let i=nn(s);return!i.isFile()||i.size<=0||i.size>on?"":`data:${t};base64,${en(s).toString("base64")}`}catch{return""}}function y(...e){for(let t of e){let n=o(t);if(n)return n}return""}function dn(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=Jt(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(!a(e))return null;let r=a(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),c=y(r.saved_path,r.savedPath),d=y(r.revised_prompt,r.revisedPrompt),l=Wt(c,r.mimeType||r.mime_type),f=Xt(r.result,l)||pt(c,l,t);if(!f)return null;let m=f.startsWith("data:")?f:"",g=c?qt(c):`${u||Kt()}.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:f,previewUrl:f,fileUrl:f,mimeType:l},dataUrl:m||void 0,previewUrl:f,fileUrl:f,metadata:{source:n,eventType:i,callId:u||void 0,savedPath:c||void 0,filename:g,mimeType:l,revisedPrompt:d||void 0}}}function ln(e){let t=a(e)?e:{},n=[];for(let r of["_artifacts","artifacts"]){let s=t[r];Array.isArray(s)&&n.push(...s)}for(let r of["_artifact","artifact"]){let s=t[r];a(s)&&n.push(s)}return n}function fn(e,t={}){let{source:n="runtime_artifact"}=t,r=a(e)?e:{};if(!Object.keys(r).length)return null;let s=a(r.content)?{...r.content}:{},i=a(r.metadata)?{...r.metadata}:{},u=y(r.saved_path,r.savedPath,s.saved_path,s.savedPath,i.savedPath),c=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=dn(r,s,d,u),f=l?Wt(u,c):c;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=Xt(r.result??s.result,f)||w||pt(u,f,t)||pt(C,f,t);h&&(h.startsWith("data:")&&(s.dataUrl||=h),s.imageUrl||=h,s.previewUrl||=h,s.fileUrl||=h,f&&(s.mimeType||=f))}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),N=y(r.dataUrl,s.dataUrl,m.startsWith("data:")?m:"",g.startsWith("data:")?g:""),E=y(r.filename,i.filename,u?qt(u):""),L=y(r.fieldKey,r.field_key,s.fieldKey,i.fieldKey,l?"image":"artifact");return{...r,artifactType:d,type:r.type||d,fieldKey:L,title:y(r.title,E,"Runtime artifact"),summary:y(r.summary,s.prompt,r.title,E,"Runtime artifact"),content:s,dataUrl:N||void 0,fileUrl:m||void 0,previewUrl:g||void 0,metadata:{...i,source:y(i.source,n),savedPath:u||i.savedPath,filename:E||i.filename,mimeType:f||i.mimeType}}}function Y(e,t){if(!t||!e)return;let n=a(t.metadata)?t.metadata:{},r=y(n.savedPath,n.callId,t.previewUrl,t.fileUrl)||Kt(),s=e.get(r);if(!s){e.set(r,t);return}s.content={...a(s.content)?s.content:{},...a(t.content)?t.content:{}},s.metadata={...a(s.metadata)?s.metadata:{},...n},s.previewUrl=t.previewUrl||s.previewUrl,s.fileUrl=t.fileUrl||s.fileUrl,s.summary=t.summary||s.summary,s.title=t.title||s.title}function mt(e,t,n={}){for(let r of ln(e))Y(t,fn(r,n))}function gt(e){if(!a(e)||!a(e.payload))return a(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 Gt(e,t,n){if(!a(e))return e;let r=a(e.event)?e.event:null;return r?(Y(t,ht(r,n)),{...e,event:gt(r)}):e}function Vt(e,t,n={}){if(!a(e))return e;mt(e,t,n);let r=Gt(e,t,n),s=a(r.update)?Gt(r.update,t,n):null;return s&&s!==r.update&&(r={...r,update:s}),r}function Yt(e,t,n={}){let r=a(e)?{...e}:{};mt(r,t,n),mt(a(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:a(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},...a(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(Vt(d,s,i))}),c=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,c),this.permissionHandlers.set("*",c);try{let d=await this.proc.call("session/prompt",t,this.options.sessionPromptTimeoutMs);return Yt(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=a(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 pn(e){let t=a(e.metadata)?e.metadata:{};return o(t.agentCode)}function mn(e,t){let n=pn(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",c=o(n.command)||"openclaw",d=Array.isArray(n.args)?n.args.map(String):[],l=d.length>0?d:["acp","--session",mn(t,u)];super(t,{...n,command:c,args:l},s,i)}};import{spawn as hn}from"node:child_process";import{randomUUID as j}from"node:crypto";import{existsSync as ne,mkdirSync as gn,readdirSync as re,readFileSync as se,realpathSync as et,rmSync as _n,rmdirSync as yn,statSync as Tn,unlinkSync as Sn}from"node:fs";import{homedir as In,tmpdir as ie}from"node:os";import{basename as oe,dirname as Rn,join as A,resolve as Zt}from"node:path";var En=36e5,wn=5e3,xn=2*60*1e3,An=2*60*1e3,On=12,Un=1e3,Q=24*60*60*1e3;function tt(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(!a(e))return"";for(let t of["text","delta","output_text","content","message","output"]){let n=R(e[t]);if(n)return n}return""}function ae(e){if(!a(e))return"";let t=a(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=a(e.item)?e.item:{};return o(r.role)==="assistant"||o(r.type)==="message"?R(r.content)||R(r.text)||R(r.message):""}function ce(e,t={}){return ht(e,{source:"codex_cli_image_generation",...t})}function ue(e,t){Y(e.artifacts,t)}function de(e){return gt(e)}function Cn(e,t,n){return n.captureLastMessage===!1||t.includes("--output-last-message")||t.includes("-o")?!1:n.captureLastMessage===!0?!0:oe(e)==="codex"}function Nn(e,t){return t.collectCodexTranscriptArtifacts===!1?!1:t.collectCodexTranscriptArtifacts===!0?!0:oe(e)==="codex"}function Mn(e){return Math.max(20,_(e.codexTranscriptPollMs||e.transcriptPollMs,Un))}function bn(e){return e.codexTranscriptStreaming===!0||e.streamCodexTranscript===!0}function kn(e,t,n,r=new Set){return{target:e,promptText:t,startedAtMs:n,baselinePaths:r,matchedPath:"",disabled:!1,processedLines:new Map}}function Ln(e,t){let n=a(e.env)?e.env:{},r=o(e.artifactRoot||e.artifactDir||e.runtimeArtifactRoot||n.ORCHA_RUNTIME_ARTIFACT_DIR)||A(ie(),"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 gn(u,{recursive:!0}),{root:u,realRoot:et(u),sessionRoot:i,realSessionRoot:et(i)}}function le(e){return o(a(e)?e.root:e)}function Qt(e){let t=le(e),n=o(a(e)?e.sessionRoot:Rn(t)),r=o(a(e)?e.realSessionRoot:"");if(n)try{if(r&&et(n)!==r)return;yn(n)}catch{}}function Pn(e,t={}){let n=le(e),r=o(a(e)?e.realRoot:"");if(n){try{if(r&&et(n)!==r){p("warn","runtime.cli","runtime artifact directory cleanup skipped; path changed",{...t,artifactRoot:n});return}}catch{Qt(e);return}try{_n(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}Qt(e)}}function Dn(e,t){return{trustedFileRoots:[t,...I(e.trustedArtifactRoots),...I(e.trustedFileRoots),...I(e.artifactRoots),...I(e.artifactFileRoots)].filter(Boolean)}}function fe(e){let t=o(e.codexSessionsRoot||e.codexSessionRoot);if(t)return t;let n=a(e.env)?e.env:{},r=o(e.codexHome||n.CODEX_HOME||process.env.CODEX_HOME)||A(In(),".codex");return A(r,"sessions")}function Fn(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 pe(e,t,n){let r=new Set;for(let s of[t-Q,t,t+Q,n-Q,n,n+Q])r.add(Fn(e,s));return[...r].filter(s=>ne(s))}function $n(e,t,n){let r=fe(e),s=t-xn,i=n+An,u=[];for(let c of pe(r,t,n)){let d=[];try{d=re(c)}catch{continue}for(let l of d){if(!l.endsWith(".jsonl"))continue;let f=A(c,l);try{let m=Tn(f);if(!m.isFile()||m.mtimeMs<s||m.mtimeMs>i)continue;u.push({path:f,mtimeMs:m.mtimeMs})}catch{}}}return u.sort((c,d)=>d.mtimeMs-c.mtimeMs).slice(0,On)}function Hn(e,t,n=t){let r=fe(e),s=new Set;for(let i of pe(r,t,n)){let u=[];try{u=re(i)}catch{continue}for(let c of u)c.endsWith(".jsonl")&&s.add(A(i,c))}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(a(e))for(let r of["payload","item","text","delta","output_text","content","message","output","input","prompt","last_agent_message","revised_prompt"])r in e&&_t(e[r],t,n+1)}}function me(e){return o(e).replace(/\s+/g," ")}function vn(e){let t=me(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 c=t.slice(Math.max(0,u),Math.max(0,u)+n).trim();c.length>=40&&!s.has(c)&&(s.add(c),i.push(c))}return i}function Bn(e,t){let n=vn(t);if(!n.length)return!1;let r=[];for(let i of e)_t(i,r);let s=me(r.join(" "));return n.every(i=>s.includes(i))}function zn(e){return e.find(t=>a(t)&&o(t.type)==="session_meta"&&a(t.payload))||null}function jn(e){let t=a(e?.payload)?e.payload:{},n=o(e?.timestamp||t.timestamp),r=Date.parse(n);return Number.isFinite(r)?r:Number.NaN}function Gn(e,t,n){if(!Bn(e,t.promptText))return!1;let r=zn(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 c=jn(r);if(!Number.isFinite(c)||c<t.startedAtMs-5e3||c>n+5e3)return!1;let d=o(t.target.cwd),l=o(s.cwd);return!(d&&l&&Zt(d)!==Zt(l))}function te(e){try{return qn(se(e,"utf8"))}catch{return null}}function Kn(e,t,n){if(!e||e.disabled)return null;if(e.matchedPath){let s=te(e.matchedPath);return s?{path:e.matchedPath,events:s}:null}let r=[];for(let s of $n(e.target,e.startedAtMs,n)){if(e.baselinePaths.has(s.path))continue;let i=te(s.path);!i||!Gn(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 qn(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(!a(e))return!1;let t=a(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 Wn(e,t,n,r){let s=ae(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
|
-
`,ut,x,i,n);let ft=
|
|
12
|
-
`}}})}}}async sessionCancel(t){let n=o(t.sessionId),r=this.active.get(n);return r?(
|
|
13
|
-
... [truncated ${r} characters]`}function
|
|
14
|
-
`?1:0)).trim()}function
|
|
15
|
-
`)}];return this.prompt({...t,agentId:r,sessionId:
|
|
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
|
-
`:""),
|
|
10
|
+
${s}`:s;t.emittedTexts.add(s),r({sessionId:n,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:i}}})}ue(t,ce(e,t.artifactOptions)),Jn(e)&&r({sessionId:n,update:{sessionUpdate:"runtime_event",event:de(e)}})}function ee(e,t,n,r,s=Date.now()){if(!t)return{artifactCount:0,transcriptCount:0};let i=e.artifacts.size,u=0,c=Kn(t,n,s);if(c){let d=Math.min(t.processedLines.get(c.path)||0,c.events.length),l=e.artifacts.size;for(let f of c.events.slice(d))Wn(f,e,n,r);t.processedLines.set(c.path,c.events.length),(c.events.length>d||e.artifacts.size>l)&&(u=1)}return{artifactCount:e.artifacts.size-i,transcriptCount:u}}function Xn(e){if(!e||!ne(e))return"";try{return se(e,"utf8").trim()}catch{return""}finally{try{Sn(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),c=o(this.target.promptMode||"stdin"),d=this.buildArgs(c,u),l=o(this.target.cwd)||this.agent.workspace||process.cwd(),f=Ln(this.target,i),m=f.root,g=Dn(this.target,m),N=Nn(s,this.target),E={...this.target,targetCode:this.agent.targetCode,cwd:l},L=N?Hn(E,r):new Set,U=Cn(s,d,this.target)?A(ie(),`orcha-runtime-last-message-${j()}.txt`):"";U&&d.push("--output-last-message",U);let w=_(this.target.timeoutMs||this.target.sessionPromptTimeoutMs,_(this.options.sessionPromptTimeoutMs,En)),C={...process.env,...a(this.target.env)?this.target.env:{},...c==="env"?{ORCHA_RUNTIME_PROMPT:u}:{},ORCHA_AGENT_ID:this.agent.agentId,ORCHA_SESSION_ID:i,ORCHA_RUNTIME_ARTIFACT_DIR:m},h=hn(s,d,{cwd:l,env:C,stdio:["pipe","pipe","pipe"]});this.active.set(i,h),p("info","runtime.cli","runtime prompt started",{target:this.agent.targetCode,sessionId:i,pid:h.pid,timeoutMs:w});let Pt="",ut=o(this.target.outputMode||"text"),x={artifacts:new Map,emittedTexts:new Set,value:"",artifactOptions:g},dt=N?kn(E,u,r,L):null;return h.stdout.setEncoding("utf8"),h.stdout.on("data",P=>this.handleStdout(P,ut,x,i,n)),h.stderr.setEncoding("utf8"),h.stderr.on("data",P=>{Pt+=P,this.target.emitStderr===!0&&n({sessionId:i,update:{sessionUpdate:"runtime_stderr_chunk",content:{type:"text",text:P}}})}),c==="stdin"?h.stdin.end(u):h.stdin.end(),await new Promise((P,He)=>{let G=!1,Dt=!1,M=null,lt=dt&&bn(this.target)?setInterval(()=>{try{ee(x,dt,i,n)}catch(T){p("warn","runtime.cli","codex transcript stream poll failed",{target:this.agent.targetCode,sessionId:i,error:String(T?.message||T)})}},Mn(this.target)):null;lt?.unref?.();let Ft=setTimeout(()=>{Dt=!0,p("warn","runtime.cli","runtime prompt timed out; terminating child",{target:this.agent.targetCode,sessionId:i,pid:h.pid,timeoutMs:w}),tt(h,"SIGTERM"),M=setTimeout(()=>{p("warn","runtime.cli","runtime prompt force killing child",{target:this.agent.targetCode,sessionId:i,pid:h.pid}),tt(h,"SIGKILL")},wn),M.unref?.(),Ht(Object.assign(new Error(`runtime CLI timed out after ${w}ms`),{code:"RUNTIME_CLI_TIMEOUT"}))},w);Ft.unref?.();let $t=()=>{clearTimeout(Ft),lt&&clearInterval(lt),M&&!Dt&&clearTimeout(M),Pn(f,{target:this.agent.targetCode,sessionId:i}),this.active.delete(i)},ve=T=>{G||(G=!0,$t(),P(T))},Ht=T=>{G||(G=!0,$t(),He(T))};h.on("error",T=>{p("warn","runtime.cli","runtime child error",{target:this.agent.targetCode,sessionId:i,pid:h.pid,error:String(T?.message||T)}),Ht(T)}),h.on("exit",(T,vt)=>{M&&(clearTimeout(M),M=null),ut==="json-lines"&&x.value.trim()&&this.handleStdout(`
|
|
11
|
+
`,ut,x,i,n);let ft=ee(x,dt,i,n,Date.now());ft.artifactCount>0&&p("info","runtime.cli","codex transcript artifacts collected",{target:this.agent.targetCode,sessionId:i,artifactCount:ft.artifactCount,transcriptCount:ft.transcriptCount});let K=Xn(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=Pt.trim();q&&p("debug","runtime.cli","runtime stderr",{target:this.agent.targetCode,sessionId:i,stderr:q}),p("info","runtime.cli","runtime prompt finished",{target:this.agent.targetCode,sessionId:i,pid:h.pid,exitCode:T,signal:vt,artifactCount:x.artifacts.size}),ve({stopReason:T===0?"end_turn":"error",exitCode:T,signal:vt,_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 c of u){let d=c.trim();if(d)try{let l=JSON.parse(d);ue(r,ce(l,r.artifactOptions)),i({sessionId:s,update:{sessionUpdate:"runtime_event",event:de(l)}});let f=ae(l);f&&!r.emittedTexts.has(f)&&(r.emittedTexts.add(f),i({sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:f}}}))}catch{i({sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`${c}
|
|
12
|
+
`}}})}}}async sessionCancel(t){let n=o(t.sessionId),r=this.active.get(n);return r?(p("info","runtime.cli","cancelling runtime child",{target:this.agent.targetCode,sessionId:n,pid:r.pid}),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())p("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,Vn=new Set(["fail","failed","failure","error","errored","timeout","timed_out","cancelled","canceled","aborted"]),Yn=10*60*1e3,Zn=60*1e3,Qn=8,tr=60*1e3,er=1,Et="ORCHA_RUNTIME_RESULT_START",ge="ORCHA_RUNTIME_RESULT_END",nr=new Set(["agentId","taskId","executionId","sessionId","nodeId","targetCode","framework","workspace","instructions"]),rr=/(^|[_-])(token|secret|password|authorization|api[-_]?key|private[-_]?key|credential|cookie|jwt|access[-_]?token|refresh[-_]?token|service[-_]?token|execution[-_]?token)([_-]|$)/i;function sr(e,t,n){let r=a(e?._meta)?e._meta:{};return{...a(e)?e:{},sessionId:t,update:a(e?.update)?e.update:{},_meta:{...r,orchaAgentId:n.agentId,runtimeSessionId:n.runtimeSessionId,bridgeUpdateId:rt()}}}function O(e){return e==null||e===""?!1:typeof e=="string"?o(e)!=="":Array.isArray(e)?e.length>0:a(e)?Object.keys(e).length>0:!0}function ir(e){let t=o(e).toLowerCase().replace(/[.。!!]+$/g,"").replace(/[\s-]+/g,"_");return Vn.has(t)}function b(e,t){let n=_(e,t);return Number.isFinite(n)&&n>0?n:t}function or(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 ar(e){let t=String(e||"");if(rr.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 wt(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}]`:a(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=>wt(r,t+1));return e.length>St&&n.push(`[truncated ${e.length-St} items]`),n}if(a(e)){let n={};for(let[r,s]of Object.entries(e))n[r]=ar(r)?"[REDACTED]":wt(s,t+1);return n}return String(e)}var cr=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 ur(e){if(!a(e))return e;let t={};for(let n of cr)O(e[n])&&(t[n]=e[n]);return t}function dr(e){if(!a(e))return e;let t={...e};return a(t.renderedPayload)&&(t.renderedPayload=ur(t.renderedPayload)),t}function lr(e){let t=a(e)?e:{},n={};O(t.metadata)&&(n.metadata=dr(t.metadata));for(let[r,s]of Object.entries(t))nr.has(r)||r==="metadata"||O(s)&&(n[r]=s);return n}function fr(e){let t=a(e)?e:{},n=a(t.metadata)?t.metadata:{},r=a(n.renderedPayload)?n.renderedPayload:{};return a(t.resultContract)?t.resultContract:a(r.resultContract)?r.resultContract:{}}function pr(e){return o(fr(e).kind).toLowerCase()==="decision"}function mr(e){let t=lr(e);if(!O(t))return"";let n=JSON.stringify(wt(t),null,2);if(n.length<=yt)return n;let r=n.length-yt;return`${n.slice(0,yt)}
|
|
13
|
+
... [truncated ${r} characters]`}function hr(e){if(!a(e))return"";let t=a(e.update)?e.update:e,r=(a(t.content)?t.content:{}).text??t.text;return r==null?"":String(r)}function gr(e){if(!a(e))return null;let t=a(e.update)?e.update:e;return o(t.sessionUpdate)!=="runtime_event"?null:a(t.event)?t.event:null}function _r(e){if(!a(e))return"";let t=a(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 yr(e){if(!Array.isArray(e))return"";for(let t=e.length-1;t>=0;t-=1){let n=_r(gr(e[t]));if(n)return n}return""}function Tr(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 Sr(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 xt(e){let t=String(e||"").trim();if(!t)return null;try{let n=JSON.parse(t);if(a(n)&&(ye(n)||O(n._artifacts)||O(n.artifacts)||O(n._decision)||O(n._meta)))return n}catch{}return null}function Ir(e){let t=String(e||"");if(!t)return"";let n=t.lastIndexOf(ge);if(n<0)return"";let r=t.lastIndexOf(Et,n);return r<0?"":t.slice(r+Et.length,n).trim()}function _e(e){let t=Ir(e);return t?xt(t):null}function Rr(e){let t=String(e||"").trim();if(!t)return null;let n=_e(t);if(n)return n;let r=[...t.matchAll(/```(?:json)?\s*([\s\S]*?)```/gi)];for(let s=r.length-1;s>=0;s-=1){let i=xt(r[s][1]);if(i)return i}if(!t.endsWith("}"))return null;for(let s=t.lastIndexOf("{");s>=0;s=t.lastIndexOf("{",s-1)){let i=xt(t.slice(s));if(i)return i}return null}function ye(e){if(!a(e))return!1;if(O(e.output))return!0;for(let t of["content","text","message","summary"])if(o(e[t]))return!0;return!!(ir(e.status)||o(e.error)||o(e.errorMessage))}function Rt(e){let t=a(e)?{...e}:{};return(!Array.isArray(t._artifacts)||t._artifacts.length===0)&&Array.isArray(t.artifacts)&&t.artifacts.length>0&&(t._artifacts=t.artifacts),delete t.artifacts,t}function he(e,t,n){return{...e,...t,_meta:{...a(e._meta)?e._meta:{},...a(t._meta)?t._meta:{},runtimeOutputSource:n}}}function Er(e,t){let n=Rt(e),r=typeof n.output=="string"?_e(n.output):null;if(r)return he(n,Rt(r),"result_block");if(ye(n))return n;let s=yr(t);if(s){let u=Rr(s);return u?he(n,Rt(u),"final_event"):{...n,output:s,_meta:{...a(n._meta)?n._meta:{},runtimeOutputSource:"final_event"}}}let i=Sr(Tr((Array.isArray(t)?t:[]).map(hr)));return i?{...n,output:i,_meta:{...a(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||!a(r)){let s=new Error(`runtime target is not configured: ${n||"<empty>"}`);throw s.code="RUNTIME_TARGET_NOT_FOUND",s}return{code:n,target:r}}targetIdleTtlMs(t){let r=$(t)==="openclaw"?b(this.config.openClawSessionIdleTtlMs,tr):b(this.config.sessionIdleTtlMs,Yn);return b(t?.sessionIdleTtlMs??t?.idleTtlMs,r)}targetMaxSessions(t){let r=$(t)==="openclaw"?b(this.config.openClawMaxSessions,er):b(this.config.maxSessionsPerTarget,Qn);return b(t?.maxSessions,r)}targetReleaseAfterPrompt(t){let n=$(t);return or(t?.releaseAfterPrompt??t?.disposeAfterPrompt,n==="openclaw")}startSessionCleanup(){let t=b(this.config.sessionCleanupIntervalMs,Zn);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){p("warn","runtime-bridge","runtime session stop failed",{sessionId:r.sessionId,runtimeSessionId:r.runtimeSessionId,targetCode:r.targetCode,runtimeKind:r.runtimeKind,error:String(s)})}return this.sessions.delete(t),this.runtimeSessionIndex.delete(`${r.agentId}:${r.runtimeSessionId}`),p("info","runtime-bridge","runtime session closed",{sessionId:r.sessionId,runtimeSessionId:r.runtimeSessionId,targetCode:r.targetCode,runtimeKind:r.runtimeKind,reason:n}),!0}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:a(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:c=>this.requestPermission(c)},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 c=`${r}:${s}`;this.cleanupExpiredSessions();let d=this.sessions.get(c);if(!d){let{code:m,target:g}=this.targetFor(i.targetCode);this.reserveTargetSlot(m,g);let N=this.runtimeFor(i,s),E=await N.sessionNew({cwd:i.workspace||process.cwd(),metadata:a(t.metadata)?t.metadata:{}}),L=Date.now();d={agentId:r,sessionId:s,runtime:N,targetCode:m,runtimeKind:$(g),runtimeSessionId:o(a(E)?E.sessionId:"")||s,idleTtlMs:this.targetIdleTtlMs(g),releaseAfterPrompt:this.targetReleaseAfterPrompt(g),createdAtMs:L,lastUsedAtMs:L,busy:!1,createdAt:B()},this.sessions.set(c,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=[],f=m=>{let g=sr(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:a(t.metadata)?t.metadata:{}},f),g=Er(m,l);return{sessionId:s,runtimeSessionId:d.runtimeSessionId,result:g,updates:l}}finally{d.busy=!1,d.lastUsedAtMs=Date.now(),d.releaseAfterPrompt&&this.closeSession(c,"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}`,c=o(t.instructions),d=mr(t),l=pr(t),f=[{type:"text",text:["Task dispatch received.",`taskId: ${s}`,i?`executionId: ${i}`:"",c?`instructions: ${c}`:"",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.",l?`For decision results, wrap the final Orcha Runtime Result JSON between ${Et} and ${ge}.`:"",l?"The result block must contain exactly one valid JSON object with output and _decision; escape Markdown newlines inside JSON strings as \\n.":"",l?"Do not put process notes inside the result block; text outside the block is ignored by Orcha.":"","Return only the final answer required by that protocol.","Do not include process notes, logs, or explanations."].filter(Boolean).join(`
|
|
15
|
+
`)}];return this.prompt({...t,agentId:r,sessionId:u,prompt:f},n)}async requestPermission({agent:t,runtimeSessionId:n,request:r,emitUpdate:s}){let i=rt(),c=this.runtimeSessionIndex.get(`${t.agentId}:${n}`)?.sessionId||n||rt(),d={permissionId:i,agentId:t.agentId,sessionId:c,runtimeSessionId:n,request:a(r)?r:{},status:"pending",createdAt:B()};return s?.({sessionId:n,update:{sessionUpdate:"permission_request",permission:d}}),await new Promise(l=>{let f=_(r?.timeoutMs,this.config.permissionRequestTimeoutMs),m=setTimeout(()=>{this.pendingPermissions.delete(i),l({permissionId:i,outcome:"denied",response:{reason:"permission request timed out"}})},f);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:a(t.response)?t.response:{},userId:o(t.userId),metadata:a(t.metadata)?t.metadata:{}}),{accepted:!0,permissionId:n,outcome:s}):{accepted:!1,permissionId:n,outcome:s}}health(){return{status:"ok",bridgeVersion: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 wr from"node:http";import xr from"node:https";import{randomBytes as Te}from"node:crypto";var it=1,At=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:"?xr:wr,r=Te(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,c)=>{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()}),c?.length&&this.onData(c),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(Ot(1,Buffer.from(String(t),"utf8")))}close(){!this.socket||this.readyState===At||(this.socket.write(Ot(8,Buffer.alloc(0))),this.socket.end(),this.onClose())}onClose(){this.readyState!==At&&(this.readyState=At,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,c=2;if(u===126){if(this.buffer.length<c+2)return;u=this.buffer.readUInt16BE(c),c+=2}else if(u===127){if(this.buffer.length<c+8)return;let f=this.buffer.readUInt32BE(c),m=this.buffer.readUInt32BE(c+4);u=f*2**32+m,c+=8}let d=c;if(i&&(c+=4),this.buffer.length<c+u)return;let l=this.buffer.subarray(c,c+u);if(i){let f=this.buffer.subarray(d,d+4);l=Buffer.from(l.map((m,g)=>m^f[g%4]))}this.buffer=this.buffer.subarray(c+u),s===1?this.emit("message",{data:l.toString("utf8")}):s===8?this.close():s===9&&this.socket?.write(Ot(10,l))}}};function Ot(e,t){let n=t.length,r=2;n>=126&&n<=65535?r+=2:n>65535&&(r+=8);let s=Te(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 c=0;c<n;c+=1)i[u+c]=t[c]^s[c%4];return i}function Ar(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 Or(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:a(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=Ar(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=>{p("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:Or(this.config.targets)})}scheduleReconnect(t){this.connected=!1,!this.stopped&&(this.reconnectTimer||(p("info","orcha-client","runtime node disconnected; reconnect scheduled",{reason:t,reconnectMs:this.config.reconnectMs}),this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},this.config.reconnectMs)))}async handleMessage(t){let n;try{n=JSON.parse(String(t))}catch(r){p("warn","orcha-client","invalid Orcha websocket frame",{error:String(r)});return}if(a(n)){if(n.type==="runtime_node.authenticated"){this.connected=!0,p("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=a(t.params)?t.params:{};try{let i=await this.invoke(r,s,n);this.send({type:"orcha.runtime.response",id:n,ok:!0,result:i})}catch(i){this.send({type:"orcha.runtime.response",id:n,ok:!1,error:{code:i.code||"RUNTIME_NODE_ERROR",message:i.message||String(i)}})}}async invoke(t,n,r){if(t==="health")return this.bridge.health();if(t==="agents/create")return this.bridge.createAgent(n);if(t==="agents/dispatch")return this.bridge.dispatch(n,{onUpdate:s=>this.sendUpdate(r,s)});if(t==="sessions/prompt")return this.bridge.prompt(n,{onUpdate:s=>this.sendUpdate(r,s)});if(t==="sessions/cancel")return this.bridge.cancel(n);if(t==="permissions/respond")return this.bridge.respondPermission(n);throw Object.assign(new Error(`unsupported Orcha runtime method: ${t}`),{code:"METHOD_NOT_FOUND"})}sendUpdate(t,n){this.send({type:"orcha.runtime.event",requestId:t,eventType:"runtime.update",payload:n})}send(t){return!this.ws||this.ws.readyState!==it?!1:(this.ws.send(JSON.stringify(t)),!0)}};import{existsSync as Ur,readFileSync as Cr}from"node:fs";import{resolve as Se}from"node:path";var Nr=/^[A-Za-z_][A-Za-z0-9_]*$/;function Ie(e=process.env,t=process.cwd()){let n=o(e.ORCHA_RUNTIME_ENV_FILE),r=n?Se(t,n):Se(t,".env");if(!Ur(r))return n&&p("warn","config","runtime env file not found",{path:r}),{loaded:!1,path:r,keys:[]};let s=[],i=Cr(r,"utf8");for(let u of i.split(/\r?\n/)){let c=br(u);if(!c)continue;let[d,l]=c;Object.prototype.hasOwnProperty.call(e,d)||(e[d]=l,s.push(d))}return p("info","config","runtime env file loaded",{path:r,keyCount:s.length}),{loaded:!0,path:r,keys:s}}function Re(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:Mr(e.ORCHA_RUNTIME_TARGETS_JSON||"")}}function Mr(e){if(!o(e))return{};try{let t=JSON.parse(e);if(a(t))return t}catch(t){p("warn","config","invalid ORCHA_RUNTIME_TARGETS_JSON",{error:String(t)})}return{}}function br(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(!Nr.test(s))return null;let i=kr(n.slice(r+1).trim());return[s,i]}function kr(e){if(!e)return"";let t=e[0];if((t==='"'||t==="'")&&e.endsWith(t)){let n=e.slice(1,-1);return t==='"'?Lr(n):n}return Pr(e).trim()}function Lr(e){return e.replaceAll("\\n",`
|
|
16
|
+
`).replaceAll("\\r","\r").replaceAll("\\t"," ").replaceAll('\\"','"').replaceAll("\\\\","\\")}function Pr(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 Dr}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 Ut(e,t,n){return{ok:!1,error:{code:e,message:t,...n===void 0?{}:{detail:n}}}}async function Ee(e,t){let n=[],r=0;for await(let i of e){if(r+=i.length,r>t)throw Object.assign(new Error("request body too large"),{status:413,code:"REQUEST_TOO_LARGE"});n.push(i)}if(n.length===0)return{};let s=Buffer.concat(n).toString("utf8");if(!s.trim())return{};try{let i=JSON.parse(s);if(!a(i))throw Object.assign(new Error("JSON body must be an object"),{status:400,code:"BAD_JSON"});return i}catch(i){throw i.status?i:Object.assign(new Error(`invalid JSON body: ${i.message}`),{status:400,code:"BAD_JSON"})}}function we(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 xe(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 Dr(async(r,s)=>{let i=new URL(r.url||"/",`http://${r.headers.host||`${e.host}:${e.port}`}`),u=`${r.method||"GET"} ${i.pathname}`,c=n[u];if(!c){ct(s,404,Ut("NOT_FOUND",`No route for ${u}`));return}try{we(r,e.token);let d=r.method==="GET"?{}:await Ee(r,e.requestLimitBytes);ct(s,200,await c(d))}catch(d){let l=d.status||500,f=d.code||"BRIDGE_INTERNAL";ct(s,l,Ut(f,d.message||String(d)))}})}var Gr=jr(import.meta.url),Kr=".orcha-runtime-bridge.pid",qr=".orcha-runtime-bridge.log",Jr=3,Wr=36e5,{command:Xr,options:Pe}=Qr(process.argv.slice(2));ts(Pe);Ie();var Vr=Re();await Yr(Xr,Vr,Pe);async function Yr(e,t,n){switch(e){case"run":case"foreground":Oe(t);return;case"start":if(n.foreground){Oe(t);return}Ce();return;case"reload":case"restart":await Ne({quiet:!0}),Ce();return;case"stop":await Ne();return;case"status":Zr();return;case"help":case"--help":case"-h":ss();return;default:throw new Error(`Unknown command: ${e}`)}}function Oe(e){es();let t=new st(e);if(e.mode==="server"){let r=xe(e,t);Ue({bridge:t,server:r}),r.listen(e.port,e.host,()=>{p("info","runtime-bridge","Orcha runtime bridge HTTP server started",{host:e.host,port:e.port,targets:Object.keys(t.targets)})});return}if(!e.orchaUrl)throw new Error("ORCHA_RUNTIME_ORCHA_URL is required in runtime node mode");let n=new at(e,t);Ue({bridge:t,client:n}),n.start(),p("info","runtime-bridge","Orcha runtime node started",{nodeId:e.nodeId,nodeName:e.nodeName,orchaUrl:e.orchaUrl,targets:Object.keys(t.targets)})}function Ue({bridge:e,client:t,server:n}){let r=!1,s=i=>{if(r)return;r=!0;let u=Number(e?.sessions?.size||0)>0;p("info","runtime-bridge","runtime bridge shutting down",{signal:i});try{t?.stop?.()}catch(c){p("warn","runtime-bridge","runtime client stop failed",{error:String(c)})}try{e?.stop?.(`process_${String(i||"shutdown").toLowerCase()}`)}catch(c){p("warn","runtime-bridge","runtime bridge stop failed",{error:String(c)})}try{n?.close?.()}catch(c){p("warn","runtime-bridge","runtime server close failed",{error:String(c)})}setTimeout(()=>process.exit(0),u?5500:200)};process.once("SIGTERM",()=>s("SIGTERM")),process.once("SIGINT",()=>s("SIGINT"))}function Ce(){let e=kt(),t=De(),n=Lt(e);if(n&&H(n)){console.log(JSON.stringify({status:"already_running",pid:n,pidFile:e,logFile:t}));return}n&&Mt(e),be(e),be(t),Nt(t);let r=vr(t,"a"),s={...process.env,ORCHA_RUNTIME_PID_FILE:e,ORCHA_RUNTIME_LOG_FILE:t},i=Fr(process.execPath,[Gr,"run"],{cwd:process.cwd(),detached:!0,env:s,stdio:["ignore",r,r]});i.unref(),$r(r),Le(e,`${i.pid}
|
|
17
|
+
`),console.log(JSON.stringify({status:"started",pid:i.pid,pidFile:e,logFile:t}))}async function Ne({quiet:e=!1}={}){let t=kt(),n=Lt(t);if(!n){e||console.log(JSON.stringify({status:"not_running",pidFile:t}));return}if(!H(n)){Mt(t),e||console.log(JSON.stringify({status:"not_running",pid:n,pidFile:t}));return}process.kill(n,"SIGTERM"),!await Me(n,1e4)&&H(n)&&(process.kill(n,"SIGKILL"),await Me(n,3e3)),Mt(t),e||console.log(JSON.stringify({status:"stopped",pid:n,pidFile:t}))}function Zr(){let e=kt(),t=De(),n=Lt(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 ts(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 kt(){return bt(process.cwd(),process.env.ORCHA_RUNTIME_PID_FILE||Kr)}function De(){return bt(process.cwd(),process.env.ORCHA_RUNTIME_LOG_FILE||qr)}function es(){let e=process.env.ORCHA_RUNTIME_LOG_FILE;if(!e)return;let t=Fe();if(t<=0)return;let n=bt(process.cwd(),e);Nt(n,t);let r=rs();r<=0||setInterval(()=>Nt(n,t),r).unref()}function Nt(e,t=Fe()){if(t<=0||!ke(e))return;let n=0,r="";try{if(n=Ae(e).size,n<=0)return;r=Ct(e,"utf8")}catch(l){p("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=[],c=0;for(let l of i)l&&(ns(l,s)?u.push(l):c+=1);if(c===0)return;let d="";try{Ae(e).size>n&&(d=Ct(e,"utf8").slice(r.length));let f=[...u,...d.split(/\r?\n/).filter(Boolean)].join(`
|
|
18
|
+
`);Le(e,f?`${f}
|
|
19
|
+
`:""),p("info","runtime-bridge","runtime log cleanup completed",{logFile:e,retentionDays:t,removed:c})}catch(l){p("warn","runtime-bridge","runtime log cleanup failed",{logFile:e,error:String(l)})}}function ns(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 Fe(){return $e(process.env.ORCHA_RUNTIME_LOG_RETENTION_DAYS,Jr)}function rs(){return $e(process.env.ORCHA_RUNTIME_LOG_CLEANUP_INTERVAL_MS,Wr)}function $e(e,t){let n=Number.parseInt(String(e??""),10);return Number.isFinite(n)&&n>=0?n:t}function Lt(e){if(!ke(e))return null;let t=Number.parseInt(Ct(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 Me(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 be(e){Hr(zr(e),{recursive:!0})}function Mt(e){try{Br(e,{force:!0})}catch{}}function ss(){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.
|