@orcha-ai/runtime-bridge 0.1.4 → 0.1.7
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/.env.example +6 -1
- package/README.md +24 -2
- package/bin/orcha-runtime-bridge.js +15 -15
- package/package.json +1 -1
package/.env.example
CHANGED
|
@@ -10,10 +10,15 @@ ORCHA_RUNTIME_DEFAULT_TARGET=codex
|
|
|
10
10
|
ORCHA_RUNTIME_RECONNECT_MS=3000
|
|
11
11
|
ORCHA_RUNTIME_SESSION_PROMPT_TIMEOUT_MS=3600000
|
|
12
12
|
ORCHA_RUNTIME_PERMISSION_TIMEOUT_MS=300000
|
|
13
|
+
ORCHA_RUNTIME_SESSION_IDLE_TTL_MS=600000
|
|
14
|
+
ORCHA_RUNTIME_SESSION_CLEANUP_INTERVAL_MS=60000
|
|
15
|
+
ORCHA_RUNTIME_MAX_SESSIONS_PER_TARGET=8
|
|
16
|
+
ORCHA_RUNTIME_OPENCLAW_SESSION_IDLE_TTL_MS=60000
|
|
17
|
+
ORCHA_RUNTIME_OPENCLAW_MAX_SESSIONS=1
|
|
13
18
|
ORCHA_RUNTIME_PID_FILE=.orcha-runtime-bridge.pid
|
|
14
19
|
ORCHA_RUNTIME_LOG_FILE=.orcha-runtime-bridge.log
|
|
15
20
|
ORCHA_RUNTIME_LOG_RETENTION_DAYS=3
|
|
16
21
|
ORCHA_RUNTIME_LOG_CLEANUP_INTERVAL_MS=3600000
|
|
17
22
|
|
|
18
23
|
# Target examples. Keep this JSON on one line.
|
|
19
|
-
ORCHA_RUNTIME_TARGETS_JSON='{"codex":{"type":"cli","command":"codex","args":["exec","--json"],"promptMode":"stdin","outputMode":"json-lines","captureLastMessage":true},"openclaw":{"type":"openclaw","command":"openclaw"},"claude":{"type":"cli","command":"claude","args":["-p","--output-format","json","--no-session-persistence"],"promptMode":"args","outputMode":"json-lines"}}'
|
|
24
|
+
ORCHA_RUNTIME_TARGETS_JSON='{"codex":{"type":"cli","command":"codex","args":["exec","--json"],"promptMode":"stdin","outputMode":"json-lines","captureLastMessage":true},"openclaw":{"type":"openclaw","command":"openclaw","maxSessions":1,"releaseAfterPrompt":true,"sessionIdleTtlMs":60000},"claude":{"type":"cli","command":"claude","args":["-p","--output-format","json","--no-session-persistence"],"promptMode":"args","outputMode":"json-lines"}}'
|
package/README.md
CHANGED
|
@@ -125,6 +125,9 @@ Runtime targets are configured with `ORCHA_RUNTIME_TARGETS_JSON`.
|
|
|
125
125
|
"openclaw": {
|
|
126
126
|
"type": "openclaw",
|
|
127
127
|
"command": "openclaw",
|
|
128
|
+
"maxSessions": 1,
|
|
129
|
+
"releaseAfterPrompt": true,
|
|
130
|
+
"sessionIdleTtlMs": 60000,
|
|
128
131
|
"mcpServers": []
|
|
129
132
|
},
|
|
130
133
|
"custom-acp": {
|
|
@@ -136,8 +139,9 @@ Runtime targets are configured with `ORCHA_RUNTIME_TARGETS_JSON`.
|
|
|
136
139
|
}
|
|
137
140
|
```
|
|
138
141
|
|
|
139
|
-
If a
|
|
140
|
-
|
|
142
|
+
If a request references a missing target, the bridge returns
|
|
143
|
+
`RUNTIME_TARGET_NOT_FOUND`. The built-in `echo` adapter is available only when
|
|
144
|
+
you explicitly configure a target with `"type": "echo"`.
|
|
141
145
|
|
|
142
146
|
Target types:
|
|
143
147
|
|
|
@@ -153,6 +157,24 @@ OpenClaw targets use request metadata `agentCode` as the local OpenClaw agent
|
|
|
153
157
|
id, producing sessions like `agent:<agentCode>:<sessionId>`. When `agentCode`
|
|
154
158
|
is missing, the bridge falls back to a plain `orcha-<sessionId>` session.
|
|
155
159
|
|
|
160
|
+
OpenClaw may start browser processes under the hood, so the bridge applies
|
|
161
|
+
stricter defaults for this target type:
|
|
162
|
+
|
|
163
|
+
- `maxSessions`: defaults to `1` for OpenClaw.
|
|
164
|
+
- `releaseAfterPrompt`: defaults to `true` for OpenClaw, stopping the runtime
|
|
165
|
+
process after each prompt.
|
|
166
|
+
- `sessionIdleTtlMs`: defaults to `60000` for OpenClaw.
|
|
167
|
+
|
|
168
|
+
Global lifecycle knobs:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
ORCHA_RUNTIME_SESSION_IDLE_TTL_MS=600000
|
|
172
|
+
ORCHA_RUNTIME_SESSION_CLEANUP_INTERVAL_MS=60000
|
|
173
|
+
ORCHA_RUNTIME_MAX_SESSIONS_PER_TARGET=8
|
|
174
|
+
ORCHA_RUNTIME_OPENCLAW_SESSION_IDLE_TTL_MS=60000
|
|
175
|
+
ORCHA_RUNTIME_OPENCLAW_MAX_SESSIONS=1
|
|
176
|
+
```
|
|
177
|
+
|
|
156
178
|
Supported stdio framing:
|
|
157
179
|
|
|
158
180
|
- `line`: one JSON-RPC frame per line.
|
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{spawn as
|
|
3
|
-
`):""}var
|
|
2
|
+
import{spawn as Or}from"node:child_process";import{closeSync as Ur,existsSync as Ce,mkdirSync as Cr,openSync as Mr,readFileSync as At,rmSync as Nr,statSync as Ee,writeFileSync as Me}from"node:fs";import{dirname as br,resolve as Ct}from"node:path";import{fileURLToPath as kr}from"node:url";import{randomUUID as rt}from"node:crypto";var D="0.1.7";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 u(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,...u(r)?v(r):{}};console.error(JSON.stringify(s))}function q(e){return Array.isArray(e)?e.map(t=>u(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=q(t.prompt);return n({sessionId:t.sessionId,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:r?`Echo runtime received: ${r}`:"Echo runtime received an empty prompt."}}}),{stopReason:"end_turn"}}async sessionCancel(){return{ok:!0}}};import{spawn as 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:u(e?.data)?e.data:void 0}}function Je(e){if(!u(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 qe(e){return u(e)&&"id"in e&&!("method"in e)}function We(e){return u(e)&&typeof e.method=="string"&&"id"in e}function Xe(e){return u(e)&&typeof e.method=="string"&&!("id"in e)}var X=class{constructor({command:t,args:n=[],cwd:r,env:s,label:i,framing:c="line"}){this.command=t,this.args=Array.isArray(n)?n.map(String):[],this.cwd=r||process.cwd(),this.env={...process.env,...u(s)?s:{}},this.label=i||t,this.framing=c==="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(
|
|
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),c=n+4,a=c+i;if(this.headerBuffer.length<a)return;let l=this.headerBuffer.subarray(c,a).toString("utf8");this.headerBuffer=this.headerBuffer.subarray(a),this.dispatchRaw(l)}}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(qe(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(Je(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(u(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(u(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((c,a)=>{let l=setTimeout(()=>{this.pending.delete(s),a(new Error(`${t} timed out after ${r}ms`))},r);this.pending.set(s,{resolve:c,reject:a,timer:l,method:t}),this.writeFrame(i,d=>{d&&(clearTimeout(l),this.pending.delete(s),a(d))})})}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
|
-
${
|
|
8
|
-
`;this.child.stdin.write(s,r)}onNotification(t,r){let n=this.notificationHandlers.get(t)||new Set;return n.add(r),this.notificationHandlers.set(t,n),()=>{n.delete(r),n.size===0&&this.notificationHandlers.delete(t)}}onRequest(t,r){return this.requestHandlers.set(t,r),()=>this.requestHandlers.delete(t)}onExit(t){return this.exitHandlers.add(t),()=>this.exitHandlers.delete(t)}rejectAll(t){for(let r of this.pending.values())clearTimeout(r.timer),r.reject(t);this.pending.clear()}handleExit(t,r){this.rejectAll(new Error(`runtime exited before response (${t}/${r})`));for(let n of this.exitHandlers)n(t,r)}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 $t}from"node:crypto";import{existsSync as He,readFileSync as Be,realpathSync as Lt,statSync as ze}from"node:fs";import{basename as vt,extname as Ht,isAbsolute as je,relative as Ge}from"node:path";var Je=25*1024*1024;function Bt(e,t=""){let r=o(t);if(r)return r;let n=Ht(o(e)).toLowerCase();return n===".jpg"||n===".jpeg"?"image/jpeg":n===".webp"?"image/webp":n===".gif"?"image/gif":"image/png"}function zt(e,t){let r=typeof e=="string"?e.trim():"";return!r||r==="<omitted>"?"":r.startsWith("data:")?r:`data:${t};base64,${r.replace(/\s+/g,"")}`}function q(e){if(Array.isArray(e))return e.map(o).filter(Boolean);let t=o(e);return t?[t]:[]}function qe(e,t){let r=Ge(t,e);return r===""||!!r&&!r.startsWith("..")&&!je(r)}function Ke(e,t){let r=o(e);if(!r||!He(r))return"";try{let n=Lt(r);for(let s of t)try{let i=Lt(s);if(qe(n,i))return n}catch{}}catch{return""}return""}function ut(e,t,r={}){let n=o(e);return!n||n.startsWith("data:")||/^https?:\/\//i.test(n)?n:We(n,t,r)}function We(e,t,r={}){let n=[...q(r.trustedFileRoots),...q(r.trustedFileRoot),...q(r.artifactRoots),...q(r.artifactRoot)],s=Ke(e,n);if(!s)return"";try{let i=ze(s);return!i.isFile()||i.size<=0||i.size>Je?"":`data:${t};base64,${Be(s).toString("base64")}`}catch{return""}}function g(...e){for(let t of e){let r=o(t);if(r)return r}return""}function Ve(e,t,r,n){let s=r.toLowerCase();if(s==="image"||s==="picture")return!0;let i=g(n,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=Ht(i.split("?",1)[0].split("#",1)[0]).toLowerCase();return[".png",".jpg",".jpeg",".webp",".gif"].includes(c)}function lt(e,t={}){let{source:r="runtime_image_generation_event"}=t;if(!u(e))return null;let n=u(e.payload)?e.payload:{},s=o(e.type),i=o(n.type);if(!(s==="event_msg"&&i==="image_generation_end"||s==="response_item"&&i==="image_generation_call"))return null;let c=g(n.call_id,n.id),a=g(n.saved_path,n.savedPath),d=g(n.revised_prompt,n.revisedPrompt),l=Bt(a,n.mimeType||n.mime_type),f=zt(n.result,l)||ut(a,l,t);if(!f)return null;let h=a?vt(a):`${c||$t()}.png`;return{artifactType:"image",type:"image",title:h||"Generated image",summary:d||"Generated image",content:{prompt:d||void 0,imageUrl:f,previewUrl:f,fileUrl:f,mimeType:l},previewUrl:f,fileUrl:f,metadata:{source:r,eventType:i,callId:c||void 0,savedPath:a||void 0,filename:h,mimeType:l,revisedPrompt:d||void 0}}}function Xe(e){let t=u(e)?e:{},r=[];for(let n of["_artifacts","artifacts"]){let s=t[n];Array.isArray(s)&&r.push(...s)}for(let n of["_artifact","artifact"]){let s=t[n];u(s)&&r.push(s)}return r}function Ye(e,t={}){let{source:r="runtime_artifact"}=t,n=u(e)?e:{};if(!Object.keys(n).length)return null;let s=u(n.content)?{...n.content}:{},i=u(n.metadata)?{...n.metadata}:{},c=g(n.saved_path,n.savedPath,s.saved_path,s.savedPath,i.savedPath),a=g(n.mimeType,n.mime_type,s.mimeType,s.mime_type,i.mimeType),d=g(n.artifactType,n.artifact_type,n.type,n.kind,s.type,c?"image":"file"),l=Ve(n,s,d,c),f=l?Bt(c,a):a;if(l){let T=g(n.dataUrl,s.dataUrl),A=T.startsWith("data:")?T:"",E=g(n.imageUrl,n.previewUrl,n.fileUrl,n.downloadUrl,n.url,n.uri,s.imageUrl,s.previewUrl,s.fileUrl,s.downloadUrl,s.url,s.uri),M=zt(n.result??s.result,f)||A||ut(c,f,t)||ut(E,f,t);M&&(s.imageUrl||=M,s.previewUrl||=M,s.fileUrl||=M,f&&(s.mimeType||=f))}for(let[T,A]of[["prompt","prompt"],["previewUrl","previewUrl"],["fileUrl","fileUrl"],["downloadUrl","downloadUrl"],["imageUrl","imageUrl"],["dataUrl","dataUrl"],["url","url"],["uri","uri"],["mimeType","mimeType"],["mime_type","mimeType"]]){let E=n[T];E!=null&&E!==""&&!(A in s)&&(s[A]=E)}let h=g(n.fileUrl,n.downloadUrl,n.imageUrl,n.dataUrl,n.url,n.uri,s.fileUrl,s.downloadUrl,s.imageUrl,s.dataUrl,s.url,s.uri),O=g(n.previewUrl,n.imageUrl,n.dataUrl,n.url,n.fileUrl,n.uri,s.previewUrl,s.imageUrl,s.dataUrl,s.url,s.fileUrl,s.uri),R=g(n.filename,i.filename,c?vt(c):"");return{...n,artifactType:d,type:n.type||d,title:g(n.title,R,"Runtime artifact"),summary:g(n.summary,s.prompt,n.title,R,"Runtime artifact"),content:s,fileUrl:h||void 0,previewUrl:O||void 0,metadata:{...i,source:g(i.source,r),savedPath:c||i.savedPath,filename:R||i.filename,mimeType:f||i.mimeType}}}function K(e,t){if(!t||!e)return;let r=u(t.metadata)?t.metadata:{},n=g(r.savedPath,r.callId,t.previewUrl,t.fileUrl)||$t(),s=e.get(n);if(!s){e.set(n,t);return}s.content={...u(s.content)?s.content:{},...u(t.content)?t.content:{}},s.metadata={...u(s.metadata)?s.metadata:{},...r},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 dt(e,t,r={}){for(let n of Xe(e))K(t,Ye(n,r))}function ft(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 r={...e.payload};return typeof r.result=="string"&&r.result&&(r.result="<omitted>",r.resultLength=e.payload.result.length),{...e,payload:r}}function Ft(e,t,r){if(!u(e))return e;let n=u(e.event)?e.event:null;return n?(K(t,lt(n,r)),{...e,event:ft(n)}):e}function jt(e,t,r={}){if(!u(e))return e;dt(e,t,r);let n=Ft(e,t,r),s=u(n.update)?Ft(n.update,t,r):null;return s&&s!==n.update&&(n={...n,update:s}),n}function Gt(e,t,r={}){let n=u(e)?{...e}:{};dt(n,t,r),dt(u(n.output)?n.output:{},t,r);let s=[...t?.values?.()||[]];return s.length&&(n.artifacts=s),n}var P=class{constructor(t,r,n={},s={}){this.agent=t,this.target=r,this.callbacks=n,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 J({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",r=>this.handlePermissionRequest(r)),this.proc.onRequest("session/requestPermission",r=>this.handlePermissionRequest(r)),await this.proc.start({initialize:this.target.initialize!==!1,initializeParams:{clientInfo:{name:"orcha-runtime-bridge",version:k},...u(this.target.initializeParams)?this.target.initializeParams:{}}})}async sessionNew(t={}){await this.ensureStarted();let r=Array.isArray(t.mcpServers)?t.mcpServers:Array.isArray(this.target.mcpServers)?this.target.mcpServers:[];return this.proc.call("session/new",{...t,mcpServers:r})}async sessionPrompt(t,r){await this.ensureStarted();let n=o(t.sessionId),s=new Map,i=this.artifactOptions(),c=this.proc.onNotification("session/update",d=>{let l=o(d.sessionId);(!l||l===n)&&r(jt(d,s,i))}),a=async d=>this.callbacks.onPermissionRequest?.({agent:this.agent,runtimeSessionId:n,request:d,emitUpdate:r})||{outcome:"denied",reason:"permission handler is not configured"};n&&this.permissionHandlers.set(n,a),this.permissionHandlers.set("*",a);try{let d=await this.proc.call("session/prompt",t,this.options.sessionPromptTimeoutMs);return Gt(d,s,i)}finally{c(),n&&this.permissionHandlers.delete(n),this.permissionHandlers.delete("*")}}async sessionCancel(t){return await this.ensureStarted(),this.proc.call("session/cancel",t,5e3).catch(()=>({ok:!0}))}async handlePermissionRequest(t){let r=o(t.sessionId),n=this.permissionHandlers.get(r)||this.permissionHandlers.get("*");return n?n(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 Ze(e){let t=u(e.metadata)?e.metadata:{};return o(t.agentCode)}function Qe(e,t){let r=Ze(e);return r?`agent:${r}:${t}`:`orcha-${t}`}var W=class extends P{constructor(t,r,n,s={},i={}){let c=o(n).replace(/[^A-Za-z0-9._-]+/g,"-")||"default",a=o(r.command)||"openclaw",d=Array.isArray(r.args)?r.args.map(String):[],l=d.length>0?d:["acp","--session",Qe(t,c)];super(t,{...r,command:a,args:l},s,i)}};import{spawn as tr}from"node:child_process";import{randomUUID as v}from"node:crypto";import{existsSync as Wt,mkdirSync as er,readdirSync as Vt,readFileSync as Xt,statSync as rr,unlinkSync as nr}from"node:fs";import{homedir as sr,tmpdir as Yt}from"node:os";import{basename as Zt,join as U,resolve as Jt}from"node:path";var ir=36e5,or=5e3,ar=2*60*1e3,cr=2*60*1e3,ur=12,dr=1e3,V=24*60*60*1e3;function X(e,t){try{e.kill(t)}catch{}}function S(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(t=>S(t)).join("");if(!u(e))return"";for(let t of["text","delta","output_text","content","message","output"]){let r=S(e[t]);if(r)return r}return""}function Qt(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 S(t.content)||S(t.message);let r=S(e.delta)||S(e.text)||S(e.content);if(r)return r;let n=u(e.item)?e.item:{};return o(n.role)==="assistant"||o(n.type)==="message"?S(n.content)||S(n.text)||S(n.message):""}function te(e,t={}){return lt(e,{source:"codex_cli_image_generation",...t})}function ee(e,t){K(e.artifacts,t)}function re(e){return ft(e)}function lr(e,t,r){return r.captureLastMessage===!1||t.includes("--output-last-message")||t.includes("-o")?!1:r.captureLastMessage===!0?!0:Zt(e)==="codex"}function fr(e,t){return t.collectCodexTranscriptArtifacts===!1?!1:t.collectCodexTranscriptArtifacts===!0?!0:Zt(e)==="codex"}function pr(e){return Math.max(20,w(e.codexTranscriptPollMs||e.transcriptPollMs,dr))}function hr(e){return e.codexTranscriptStreaming===!0||e.streamCodexTranscript===!0}function mr(e,t,r,n=new Set){return{target:e,promptText:t,startedAtMs:r,baselinePaths:n,matchedPath:"",disabled:!1,processedLines:new Map}}function gr(e,t){let r=u(e.env)?e.env:{},n=o(e.artifactRoot||e.artifactDir||e.runtimeArtifactRoot||r.ORCHA_RUNTIME_ARTIFACT_DIR)||U(Yt(),"orcha-runtime-artifacts"),s=o(t).replace(/[^A-Za-z0-9._-]+/g,"-").slice(0,80)||v(),i=U(n,s,v());return er(i,{recursive:!0}),i}function yr(e,t){return{trustedFileRoots:[t,...I(e.trustedArtifactRoots),...I(e.trustedFileRoots),...I(e.artifactRoots),...I(e.artifactFileRoots)].filter(Boolean)}}function ne(e){let t=o(e.codexSessionsRoot||e.codexSessionRoot);if(t)return t;let r=u(e.env)?e.env:{},n=o(e.codexHome||r.CODEX_HOME||process.env.CODEX_HOME)||U(sr(),".codex");return U(n,"sessions")}function _r(e,t){let r=new Date(t),n=String(r.getFullYear()),s=String(r.getMonth()+1).padStart(2,"0"),i=String(r.getDate()).padStart(2,"0");return U(e,n,s,i)}function se(e,t,r){let n=new Set;for(let s of[t-V,t,t+V,r-V,r,r+V])n.add(_r(e,s));return[...n].filter(s=>Wt(s))}function Tr(e,t,r){let n=ne(e),s=t-ar,i=r+cr,c=[];for(let a of se(n,t,r)){let d=[];try{d=Vt(a)}catch{continue}for(let l of d){if(!l.endsWith(".jsonl"))continue;let f=U(a,l);try{let h=rr(f);if(!h.isFile()||h.mtimeMs<s||h.mtimeMs>i)continue;c.push({path:f,mtimeMs:h.mtimeMs})}catch{}}}return c.sort((a,d)=>d.mtimeMs-a.mtimeMs).slice(0,ur)}function wr(e,t,r=t){let n=ne(e),s=new Set;for(let i of se(n,t,r)){let c=[];try{c=Vt(i)}catch{continue}for(let a of c)a.endsWith(".jsonl")&&s.add(U(i,a))}return s}function pt(e,t,r=0){if(!(r>8||e===null||e===void 0)){if(typeof e=="string"){e&&t.push(e);return}if(Array.isArray(e)){for(let n of e)pt(n,t,r+1);return}if(u(e))for(let n of["payload","item","text","delta","output_text","content","message","output","input","prompt","last_agent_message","revised_prompt"])n in e&&pt(e[n],t,r+1)}}function ie(e){return o(e).replace(/\s+/g," ")}function Ir(e){let t=ie(e);if(!t)return[];if(t.length<=200)return[t];let r=160,n=[0,Math.floor((t.length-r)/2),t.length-r],s=new Set,i=[];for(let c of n){let a=t.slice(Math.max(0,c),Math.max(0,c)+r).trim();a.length>=40&&!s.has(a)&&(s.add(a),i.push(a))}return i}function Rr(e,t){let r=Ir(t);if(!r.length)return!1;let n=[];for(let i of e)pt(i,n);let s=ie(n.join(" "));return r.every(i=>s.includes(i))}function Er(e){return e.find(t=>u(t)&&o(t.type)==="session_meta"&&u(t.payload))||null}function Sr(e){let t=u(e?.payload)?e.payload:{},r=o(e?.timestamp||t.timestamp),n=Date.parse(r);return Number.isFinite(n)?n:Number.NaN}function xr(e,t,r){if(!Rr(e,t.promptText))return!1;let n=Er(e);if(!n)return!1;let s=n.payload,i=o(s.originator),c=o(s.source);if(i!=="codex_exec"&&c!=="exec")return!1;let a=Sr(n);if(!Number.isFinite(a)||a<t.startedAtMs-5e3||a>r+5e3)return!1;let d=o(t.target.cwd),l=o(s.cwd);return!(d&&l&&Jt(d)!==Jt(l))}function qt(e){try{return Ar(Xt(e,"utf8"))}catch{return null}}function Or(e,t,r){if(!e||e.disabled)return null;if(e.matchedPath){let s=qt(e.matchedPath);return s?{path:e.matchedPath,events:s}:null}let n=[];for(let s of Tr(e.target,e.startedAtMs,r)){if(e.baselinePaths.has(s.path))continue;let i=qt(s.path);!i||!xr(i,e,r)||n.push({path:s.path,events:i})}return n.length!==1?(n.length>1&&(e.disabled=!0,p("warn","runtime.cli","codex transcript fallback disabled; multiple matching transcripts",{target:e.target.targetCode,sessionId:t,transcriptCount:n.length})),null):(e.matchedPath=n[0].path,p("info","runtime.cli","codex transcript stream attached",{target:e.target.targetCode,sessionId:t}),n[0])}function Ar(e){let t=[];for(let r of e.split(/\r?\n/)){let n=r.trim();if(n)try{t.push(JSON.parse(n))}catch{}}return t}function Ur(e){if(!u(e))return!1;let t=u(e.payload)?e.payload:{},r=o(e.type),n=o(t.type);return r==="event_msg"&&n==="image_generation_end"||r==="response_item"&&n==="image_generation_call"}function Cr(e,t,r,n){let s=Qt(e);if(s&&!t.emittedTexts.has(s)){let i=t.emittedTexts.size?`
|
|
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?`
|
|
9
9
|
|
|
10
|
-
${s}`:s;t.emittedTexts.add(s),
|
|
11
|
-
`,
|
|
12
|
-
`}}})}}}async sessionCancel(t){let
|
|
13
|
-
... [truncated ${
|
|
14
|
-
`?1:0)).trim()}function
|
|
15
|
-
`)}];return this.prompt({...t,agentId:
|
|
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}}})}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,c=0,a=Bn(t,n,s);if(a){let l=Math.min(t.processedLines.get(a.path)||0,a.events.length),d=e.artifacts.size;for(let p of a.events.slice(l))Gn(p,e,n,r);t.processedLines.set(a.path,a.events.length),(a.events.length>l||e.artifacts.size>d)&&(c=1)}return{artifactCount:e.artifacts.size-i,transcriptCount:c}}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(),c=q(t.prompt),a=o(this.target.promptMode||"stdin"),l=this.buildArgs(a,c),d=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),w={...this.target,targetCode:this.agent.targetCode,cwd:d},P=M?Ln(w,r):new Set,O=xn(s,l,this.target)?A(ne(),`orcha-runtime-last-message-${j()}.txt`):"";O&&l.push("--output-last-message",O);let R=_(this.target.timeoutMs||this.target.sessionPromptTimeoutMs,_(this.options.sessionPromptTimeoutMs,Tn)),U={...process.env,...u(this.target.env)?this.target.env:{},...a==="env"?{ORCHA_RUNTIME_PROMPT:c}:{},ORCHA_AGENT_ID:this.agent.agentId,ORCHA_SESSION_ID:i,ORCHA_RUNTIME_ARTIFACT_DIR:m},h=dn(s,l,{cwd:d,env:U,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:R});let bt="",ut=o(this.target.outputMode||"text"),x={artifacts:new Map,emittedTexts:new Set,value:"",artifactOptions:g},lt=M?Cn(w,c,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(c):h.stdin.end(),await new Promise((L,Le)=>{let G=!1,kt=!1,N=null,dt=lt&&Un(this.target)?setInterval(()=>{try{Zt(x,lt,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;dt?.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:R}),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 ${R}ms`),{code:"RUNTIME_CLI_TIMEOUT"}))},R);Pt.unref?.();let Lt=()=>{clearTimeout(Pt),dt&&clearInterval(dt),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,lt,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(O);K&&!x.emittedTexts.has(K)&&(x.emittedTexts.add(K),n({sessionId:i,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:K}}}));let J=bt.trim();J&&f("debug","runtime.cli","runtime stderr",{target:this.agent.targetCode,sessionId:i,stderr:J}),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()],...J?{stderr:J}:{}})})})}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 c=r.value.split(/\r?\n/);r.value=c.pop()||"";for(let a of c){let l=a.trim();if(l)try{let d=JSON.parse(l);oe(r,ie(d,r.artifactOptions)),i({sessionId:s,update:{sessionUpdate:"runtime_event",event:ae(d)}});let p=se(d);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,Jn=new Set(["fail","failed","failure","error","errored","timeout","timed_out","cancelled","canceled","aborted"]),qn=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=u(e?._meta)?e._meta:{};return{...u(e)?e:{},sessionId:t,update:u(e?.update)?e.update:{},_meta:{...r,orchaAgentId:n.agentId,runtimeSessionId:n.runtimeSessionId,bridgeUpdateId:rt()}}}function C(e){return e==null||e===""?!1:typeof e=="string"?o(e)!=="":Array.isArray(e)?e.length>0:u(e)?Object.keys(e).length>0:!0}function er(e){let t=o(e).toLowerCase().replace(/[.。!!]+$/g,"").replace(/[\s-]+/g,"_");return Jn.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}]`:u(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(u(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)}function sr(e){let t=u(e)?e:{},n={};C(t.metadata)&&(n.metadata=t.metadata);for(let[r,s]of Object.entries(t))Zn.has(r)||r==="metadata"||C(s)&&(n[r]=s);return n}function ir(e){let t=sr(e);if(!C(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 or(e){if(!u(e))return"";let t=u(e.update)?e.update:e,r=(u(t.content)?t.content:{}).text??t.text;return r==null?"":String(r)}function ar(e){if(!u(e))return null;let t=u(e.update)?e.update:e;return o(t.sessionUpdate)!=="runtime_event"?null:u(t.event)?t.event:null}function cr(e){if(!u(e))return"";let t=u(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 ur(e){if(!Array.isArray(e))return"";for(let t=e.length-1;t>=0;t-=1){let n=cr(ar(e[t]));if(n)return n}return""}function lr(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 dr(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(u(n)&&(me(n)||C(n._artifacts)||C(n.artifacts)||C(n._decision)||C(n._meta)))return n}catch{}return null}function fr(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(!u(e))return!1;if(C(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=u(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 pr(e,t){let n=pe(e);if(me(n))return n;let r=ur(t);if(r){let i=fr(r);if(i){let c=pe(i);return{...n,...c,_meta:{...u(n._meta)?n._meta:{},...u(c._meta)?c._meta:{},runtimeOutputSource:"final_event"}}}return{...n,output:r,_meta:{...u(n._meta)?n._meta:{},runtimeOutputSource:"final_event"}}}let s=dr(lr((Array.isArray(t)?t:[]).map(or)));return s?{...n,output:s,_meta:{...u(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||!u(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,qn);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:u(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)},c={sessionPromptTimeoutMs:this.config.sessionPromptTimeoutMs};return s==="stdio-acp"||s==="acp"?new F(t,r,i,c):s==="openclaw"?new Z(t,r,n,i,c):s==="cli"?new nt(t,r,c):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,c=o(t.workspace);c&&c!==i.workspace&&(i.workspace=c);let a=`${r}:${s}`;this.cleanupExpiredSessions();let l=this.sessions.get(a);if(!l){let{code:m,target:g}=this.targetFor(i.targetCode);this.reserveTargetSlot(m,g);let M=this.runtimeFor(i,s),w=await M.sessionNew({cwd:i.workspace||process.cwd(),metadata:u(t.metadata)?t.metadata:{}}),P=Date.now();l={agentId:r,sessionId:s,runtime:M,targetCode:m,runtimeKind:$(g),runtimeSessionId:o(u(w)?w.sessionId:"")||s,idleTtlMs:this.targetIdleTtlMs(g),releaseAfterPrompt:this.targetReleaseAfterPrompt(g),createdAtMs:P,lastUsedAtMs:P,busy:!1,createdAt:B()},this.sessions.set(a,l),this.runtimeSessionIndex.set(`${r}:${l.runtimeSessionId}`,l)}if(l.busy){let m=new Error(`runtime session is already running: ${s}`);throw m.code="RUNTIME_SESSION_BUSY",m}l.busy=!0,l.lastUsedAtMs=Date.now();let d=[],p=m=>{let g=tr(m,s,l);d.push(g),n.onUpdate?.(g)};try{let m=await l.runtime.sessionPrompt({sessionId:l.runtimeSessionId,prompt:Array.isArray(t.prompt)?t.prompt:[],metadata:u(t.metadata)?t.metadata:{}},p),g=pr(m,d);return{sessionId:s,runtimeSessionId:l.runtimeSessionId,result:g,updates:d}}finally{l.busy=!1,l.lastUsedAtMs=Date.now(),l.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 c=o(t.sessionId)||`dispatch-${i||s}`,a=o(t.instructions),l=ir(t),d=[{type:"text",text:["Task dispatch received.",`taskId: ${s}`,i?`executionId: ${i}`:"",a?`instructions: ${a}`:"",l?"orchaContext:":"",l,l?"Use orchaContext as the source of truth for upstream outputs, review reports, artifacts, and workflow metadata.":"","Return only the final task result. Do not include process notes, logs, or explanations. Orcha will wrap the result into its runtime protocol."].filter(Boolean).join(`
|
|
15
|
+
`)}];return this.prompt({...t,agentId:r,sessionId:c,prompt:d},n)}async requestPermission({agent:t,runtimeSessionId:n,request:r,emitUpdate:s}){let i=rt(),a=this.runtimeSessionIndex.get(`${t.agentId}:${n}`)?.sessionId||n||rt(),l={permissionId:i,agentId:t.agentId,sessionId:a,runtimeSessionId:n,request:u(r)?r:{},status:"pending",createdAt:B()};return s?.({sessionId:n,update:{sessionUpdate:"permission_request",permission:l}}),await new Promise(d=>{let p=_(r?.timeoutMs,this.config.permissionRequestTimeoutMs),m=setTimeout(()=>{this.pendingPermissions.delete(i),d({permissionId:i,outcome:"denied",response:{reason:"permission request timed out"}})},p);this.pendingPermissions.set(i,{timer:m,resolve:d,permission:l})})}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:u(t.response)?t.response:{},userId:o(t.userId),metadata:u(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 mr from"node:http";import hr from"node:https";import{randomBytes as he}from"node:crypto";var it=1,wt=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:"?hr:mr,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,c,a)=>{this.socket=c,this.readyState=it,c.on("data",l=>this.onData(l)),c.on("close",()=>this.onClose()),c.on("error",l=>{this.emit("error",{error:l,message:l.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(Rt(1,Buffer.from(String(t),"utf8")))}close(){!this.socket||this.readyState===wt||(this.socket.write(Rt(8,Buffer.alloc(0))),this.socket.end(),this.onClose())}onClose(){this.readyState!==wt&&(this.readyState=wt,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,c=r&127,a=2;if(c===126){if(this.buffer.length<a+2)return;c=this.buffer.readUInt16BE(a),a+=2}else if(c===127){if(this.buffer.length<a+8)return;let p=this.buffer.readUInt32BE(a),m=this.buffer.readUInt32BE(a+4);c=p*2**32+m,a+=8}let l=a;if(i&&(a+=4),this.buffer.length<a+c)return;let d=this.buffer.subarray(a,a+c);if(i){let p=this.buffer.subarray(l,l+4);d=Buffer.from(d.map((m,g)=>m^p[g%4]))}this.buffer=this.buffer.subarray(a+c),s===1?this.emit("message",{data:d.toString("utf8")}):s===8?this.close():s===9&&this.socket?.write(Rt(10,d))}}};function Rt(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 c=2;n<126?i[1]=128|n:n<=65535?(i[1]=254,i.writeUInt16BE(n,c),c+=2):(i[1]=255,i.writeUInt32BE(Math.floor(n/2**32),c),i.writeUInt32BE(n>>>0,c+4),c+=8),s.copy(i,c),c+=4;for(let a=0;a<n;a+=1)i[c+a]=t[a]^s[a%4];return i}function gr(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 _r(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:u(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=gr(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:_r(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(u(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=u(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 yr,readFileSync as Tr}from"node:fs";import{resolve as ge}from"node:path";var Sr=/^[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(!yr(r))return n&&f("warn","config","runtime env file not found",{path:r}),{loaded:!1,path:r,keys:[]};let s=[],i=Tr(r,"utf8");for(let c of i.split(/\r?\n/)){let a=Er(c);if(!a)continue;let[l,d]=a;Object.prototype.hasOwnProperty.call(e,l)||(e[l]=d,s.push(l))}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:Ir(e.ORCHA_RUNTIME_TARGETS_JSON||"")}}function Ir(e){if(!o(e))return{};try{let t=JSON.parse(e);if(u(t))return t}catch(t){f("warn","config","invalid ORCHA_RUNTIME_TARGETS_JSON",{error:String(t)})}return{}}function Er(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(!Sr.test(s))return null;let i=wr(n.slice(r+1).trim());return[s,i]}function wr(e){if(!e)return"";let t=e[0];if((t==='"'||t==="'")&&e.endsWith(t)){let n=e.slice(1,-1);return t==='"'?Rr(n):n}return xr(e).trim()}function Rr(e){return e.replaceAll("\\n",`
|
|
16
|
+
`).replaceAll("\\r","\r").replaceAll("\\t"," ").replaceAll('\\"','"').replaceAll("\\\\","\\")}function xr(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 Ar}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(!u(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 Ar(async(r,s)=>{let i=new URL(r.url||"/",`http://${r.headers.host||`${e.host}:${e.port}`}`),c=`${r.method||"GET"} ${i.pathname}`,a=n[c];if(!a){ct(s,404,xt("NOT_FOUND",`No route for ${c}`));return}try{Se(r,e.token);let l=r.method==="GET"?{}:await Te(r,e.requestLimitBytes);ct(s,200,await a(l))}catch(l){let d=l.status||500,p=l.code||"BRIDGE_INTERNAL";ct(s,d,xt(p,l.message||String(l)))}})}var Pr=kr(import.meta.url),Lr=".orcha-runtime-bridge.pid",Dr=".orcha-runtime-bridge.log",Fr=3,$r=36e5,{command:Hr,options:Ne}=jr(process.argv.slice(2));Gr(Ne);_e();var vr=ye();await Br(Hr,vr,Ne);async function Br(e,t,n){switch(e){case"run":case"foreground":we(t);return;case"start":if(n.foreground){we(t);return}xe();return;case"reload":case"restart":await Ae({quiet:!0}),xe();return;case"stop":await Ae();return;case"status":zr();return;case"help":case"--help":case"-h":Wr();return;default:throw new Error(`Unknown command: ${e}`)}}function we(e){Kr();let t=new st(e);if(e.mode==="server"){let r=Ie(e,t);Re({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);Re({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 Re({bridge:e,client:t,server:n}){let r=!1,s=i=>{if(r)return;r=!0;let c=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),c?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=Mr(t,"a"),s={...process.env,ORCHA_RUNTIME_PID_FILE:e,ORCHA_RUNTIME_LOG_FILE:t},i=Or(process.execPath,[Pr,"run"],{cwd:process.cwd(),detached:!0,env:s,stdio:["ignore",r,r]});i.unref(),Ur(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 zr(){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 jr(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 Gr(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||Lr)}function be(){return Ct(process.cwd(),process.env.ORCHA_RUNTIME_LOG_FILE||Dr)}function Kr(){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=qr();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(d){f("warn","runtime-bridge","runtime log cleanup skipped",{logFile:e,error:String(d)});return}let s=Date.now()-t*24*60*60*1e3,i=r.split(/\r?\n/),c=[],a=0;for(let d of i)d&&(Jr(d,s)?c.push(d):a+=1);if(a===0)return;let l="";try{Ee(e).size>n&&(l=At(e,"utf8").slice(r.length));let p=[...c,...l.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(d){f("warn","runtime-bridge","runtime log cleanup failed",{logFile:e,error:String(d)})}}function Jr(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,Fr)}function qr(){return Pe(process.env.ORCHA_RUNTIME_LOG_CLEANUP_INTERVAL_MS,$r)}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){Cr(br(e),{recursive:!0})}function Ut(e){try{Nr(e,{force:!0})}catch{}}function Wr(){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.
|