@orcha-ai/runtime-bridge 0.1.55 → 0.1.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -82,7 +82,7 @@ Version 0.1.44 routes replies, native `message` tool sends, and background notif
82
82
 
83
83
  ```bash
84
84
  npm run pack:local
85
- npm publish ./dist/orcha-ai-runtime-bridge-0.1.55.tgz --access public --registry=https://registry.npmjs.org
85
+ npm publish ./dist/orcha-ai-runtime-bridge-0.1.56.tgz --access public --registry=https://registry.npmjs.org
86
86
  ```
87
87
 
88
88
  After updating the npm package on a device, run `orcha-runtime-bridge reload --url ...` to switch the existing background process to the installed version. `reload` and `restart` also install/update the bundled plugin for OpenClaw targets saved on that device, using the target's executable and environment. Bridge stops before `openclaw plugins install <bundled-path> --force` and `openclaw gateway restart`; it starts again only after Gateway health succeeds and any configured MCP binding endpoint passes native Channel protocol preflight. Targets sharing an executable and environment update together. Installation/restart/health failures stop the command with an error and leave Bridge stopped; fix the reported problem and rerun `reload`. Package/executable preflight failures leave the existing Bridge running. The earlier manually downloaded foreground process must be stopped before connecting with npm to avoid duplicate connections.
@@ -135,6 +135,20 @@ Device Claude Code now follows the same IM model as device Codex: Core sends onl
135
135
 
136
136
  Rollout requires Core with this change, then the updated and reloaded device Bridge. There is no database migration, protocol-version change or new project environment variable. Old Orcha history is not injected into Claude Code. The fixture tests use a fake Claude CLI over a real HTTP MCP endpoint; a real Claude turn was accepted with 0.1.53 (see [Device approvals](#device-approvals-0153)).
137
137
 
138
+ ### Claude Code approvals over stdio (0.1.56)
139
+
140
+ Claude Code's sandbox asks before it connects to a host that no local rule allows. In print mode it sends that ask only to a stdio host, never to an MCP `--permission-prompt-tool`. Bridge used to close stdin right after writing the prompt, so the ask failed at once and Claude reported `deny network-outbound <host> (user denied)` although nobody had been asked. Group-chat turns that needed GitLab or the Alibaba Cloud API failed this way.
141
+
142
+ Native IM turns now launch Claude Code with `--input-format stream-json --permission-prompt-tool stdio`. The prompt is the first `user` input message, and stdin stays open until the turn's `result` event. Bridge answers each `control_request` itself:
143
+
144
+ - `can_use_tool` carries both tool prompts and the `SandboxNetworkAccess` network ask. Both go to the Orcha user through the existing [approval contract](#device-approvals-0153). A network ask is reported as `kind: "permission"` with `toolName: "SandboxNetworkAccess"`, Claude's own `Allow network connection to <host>?` as `title` and `input: {host}`. Approval answers `{"behavior":"allow","updatedInput":...}` with the original input and never returns Claude's `permission_suggestions`, so the host is allowed only for that Claude process and no local rule is written. Denial, timeout or cancellation answers `{"behavior":"deny","message":...}`.
145
+ - `control_cancel_request` withdraws the matching pending approval (`permission_resolved` with `cancelled`); the request is then left unanswered.
146
+ - Any other control request subtype is answered with an error.
147
+
148
+ This replaces the `mcp__orcha__permission_prompt` tool on the task MCP proxy, so Claude has one approval channel, and its wait follows `ORCHA_RUNTIME_PERMISSION_TIMEOUT_MS` (300 seconds by default) instead of the old 270-second HTTP MCP cap. Delegated group-member turns do not host the channel; Claude denies their prompts locally, so they still never wait. Approval does not relax local configuration: a host that should always be reachable belongs in the device's `sandbox.network.allowedDomains`.
149
+
150
+ Rollout: install and reload Bridge 0.1.56 on devices; Core is unchanged. There is no database migration, protocol-version change or new project environment variable. Acceptance on 2026-10-13: Bridge checks, tests and build pass with a fake Claude CLI covering approve, deny, withdraw and unsupported control requests. In one real run with local Claude Code 2.1.287 (haiku, sandbox enabled), an approved network ask let `curl` reach the host, and a denied ask on the resumed session was blocked; both turns exited cleanly. The live web confirmation and a connected device running 0.1.56 have not been accepted yet.
151
+
138
152
  ### Streamed text batching (0.1.55)
139
153
 
140
154
  Bridge 0.1.54 sent one WebSocket frame per Claude `text_delta`. A reply that arrived in a burst filled the gateway's 128-frame room queue. Frames dropped there are never replayed by Bridge, so the reply could stay "in progress" until the 24-hour request timeout. Bridge now merges consecutive `agent_message_chunk` or `agent_thought_chunk` updates for up to 100 ms before they receive a `bridgeUpdateId`. The live events and the final response therefore carry the same merged updates. Any other update, the end of the runtime turn and terminal events release the pending text first, so ordering is unchanged. Chunks that extend the buffered text (cumulative streams), chunks that start a runtime result marker and updates carrying extra fields are never merged. This applies to every runtime, not only Claude Code.
@@ -151,7 +165,7 @@ Core folds `agent_message_snapshot` into the stored reply with the same replace
151
165
 
152
166
  Device Codex and Claude Code keep deciding locally which actions need confirmation; Bridge only changes who answers. Instead of an automatic denial, a request the device's own settings would prompt for reaches the user who started the Orcha turn, as a confirmation above the chat input. The native process waits in place and continues the same turn as soon as the user approves or denies. Nothing relaxes or rewrites local permission configuration.
153
167
 
154
- - **Claude Code** receives `--permission-prompt-tool mcp__orcha__permission_prompt`, a local tool on the task MCP proxy. It answers `{"behavior":"allow","updatedInput":...}` with the original input, or `{"behavior":"deny","message":...}`. Claude abandons an HTTP MCP call after five idle minutes, so its wait is capped at 270 seconds.
168
+ - **Claude Code** answers its stdio control requests through Bridge since 0.1.56, which also covers sandbox network asks (see [Claude Code approvals over stdio](#claude-code-approvals-over-stdio-0156)). The 0.1.53 `mcp__orcha__permission_prompt` tool and its 270-second cap are gone.
155
169
  - **Codex** runs `codex app-server` over stdio JSON-RPC (one process per turn, like `exec`). `item/commandExecution/requestApproval`, `item/fileChange/requestApproval` and `item/permissions/requestApproval` go to the user and are answered `accept` (or the requested permissions for this turn) or `decline`. MCP approval elicitations from the `orcha` server are accepted because Core already authorized the task tools; elicitations from other servers are declined, and `item/tool/requestUserInput` is not supported yet. The task MCP `-c` override is passed after the subcommand because app-server drops top-level overrides once it receives its own. A failed `orcha` MCP startup ends the turn with `RUNTIME_CODEX_MCP_UNAVAILABLE`.
156
170
  - **Bridge contract**: a `permission_request` update carries `permission.request = {runtime, kind, title, command?, cwd?, paths?, toolName?, input}` with `kind` one of `command`, `file_change`, `permission`, `other`, plus `expiresAt`. Every ending emits `permission_resolved` with `outcome` `approved`, `denied`, `expired` (wait timeout) or `cancelled` (the native turn ended first). `permissions/respond` delivers the user's decision. The wait uses `ORCHA_RUNTIME_PERMISSION_TIMEOUT_MS` (300 seconds by default). Delegated group-member turns never wait and are denied, as before. ACP permission requests keep their existing handling.
157
171
  - **Core** shows only requests whose `runtime` is `claude` or `codex`. It persists each one as a `ChatToolCall` with `tool_code = external_agent_permission` and `external_call_id = permissionId`, and reuses the confirmation Interaction. Only the turn's initiator can answer. A decision never converges or resumes the ChatRun, because the process is still running. Approvals left open when the turn ends are withdrawn, and an answer that arrives after Bridge stopped waiting is recorded as expired.
@@ -1,36 +1,38 @@
1
1
  #!/usr/bin/env node
2
- import{spawn as au}from"node:child_process";import{closeSync as cu,existsSync as Br,mkdirSync as uu,openSync as lu,readFileSync as $r,rmSync as du,statSync as Ls,writeFileSync as Hs}from"node:fs";import{dirname as Fs,resolve as Rt}from"node:path";import{fileURLToPath as pu}from"node:url";import{createHash as Xr}from"node:crypto";import{mkdir as ei,readFile as ri,writeFile as ni,rename as si}from"node:fs/promises";import{join as Wr}from"node:path";import{homedir as ii,hostname as oi}from"node:os";import{execFile as Ws}from"node:child_process";import{access as Xs,realpath as Ys}from"node:fs/promises";import{constants as Qs}from"node:fs";import{delimiter as Zs,join as zr,isAbsolute as Vr}from"node:path";import{homedir as Kr}from"node:os";async function Re(e,t=process.env){let r=process.platform==="win32"?[".exe",".cmd",".bat",""]:[""];for(let n of(t.PATH||"").split(Zs).filter(Vr))for(let s of r){let i=zr(n,`${e}${s}`);try{return await Xs(i,Qs.X_OK),i}catch{}}return null}function ti(e,t){return new Promise(r=>Ws(e,t,{timeout:8e3,maxBuffer:1024*1024,windowsHide:!0},(n,s)=>r({code:n?n.code:0,stdout:String(s||"")})))}async function Oe(e){let t=e==="~"?Kr():e.startsWith("~/")?zr(Kr(),e.slice(2)):e;if(!Vr(t))throw new Error("\u5DE5\u4F5C\u76EE\u5F55\u5FC5\u987B\u662F\u8BBE\u5907\u4E0A\u7684\u7EDD\u5BF9\u8DEF\u5F84\u6216 ~/ \u5F00\u5934\u7684\u8DEF\u5F84");let r=await Ys(t),{stat:n}=await import("node:fs/promises");if(!(await n(r)).isDirectory())throw new Error("\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u662F\u6587\u4EF6\u5939");return r}async function Jr({find:e=Re,run:t=ti,cwd:r=process.cwd()}={}){return(await Promise.all(["codex","claude","openclaw"].map(async s=>{let i=await e(s);if(!i)return[];let o={codex:"Codex",claude:"Claude Code",openclaw:"OpenClaw"}[s],a=await t(i,["--version"]),c=a.code===0&&a.stdout.match(/\d+\.\d+\.\d+[^\s]*/)?.[0]||"",l={id:s,name:o,framework:s,version:c,workspace:r,managed:!1};if(a.code!==0)return[{...l,status:"error",message:"\u7A0B\u5E8F\u65E0\u6CD5\u542F\u52A8\uFF0C\u8BF7\u5728\u672C\u673A\u68C0\u67E5\u5B89\u88C5"}];if(s==="openclaw"){let f=await t(i,["agents","list","--json"]),m;try{m=JSON.parse(f.stdout)}catch{}if(f.code!==0||!Array.isArray(m))return[{...l,status:"error",message:"\u65E0\u6CD5\u8BFB\u53D6 OpenClaw \u667A\u80FD\u4F53\uFF0C\u8BF7\u68C0\u67E5\u672C\u673A\u914D\u7F6E"}];let y=await t(i,["health","--json"]);return m.filter(T=>typeof T.id=="string"&&typeof T.workspace=="string").slice(0,32).map(T=>({...l,id:`openclaw:${T.id}`,name:T.name||T.identityName||T.id,workspace:T.workspace,managed:!0,localAgentId:T.id,command:i,status:y.code===0?"ready":"needs_setup",message:y.code===0?"":"\u8BF7\u5148\u5728\u672C\u673A\u542F\u52A8\u5E76\u914D\u7F6E OpenClaw Gateway"}))}let p=await t(i,s==="codex"?["login","status"]:["auth","status"]),h=p.code===0?"ready":p.code===1?"needs_login":"error";return[{...l,command:i,status:h,message:h==="needs_login"?`\u8BF7\u5728\u672C\u673A\u8FD0\u884C ${s} ${s==="codex"?"login":"auth login"}`:h==="error"?"\u767B\u5F55\u72B6\u6001\u68C0\u6D4B\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 CLI \u7248\u672C":""}]}))).flat()}var Ce={terminalProtocol:"claude",args:["-p","--output-format","stream-json","--verbose","--include-partial-messages"],promptMode:"stdin",outputMode:"json-lines"},Yr={terminalProtocol:"codex",args:["app-server"]},ai=[{protocol:"claude",promptMode:"args",args:JSON.stringify(["-p","--output-format","json","--no-session-persistence"]),launch:Ce},{protocol:"claude",promptMode:"stdin",args:JSON.stringify(["-p","--output-format","stream-json","--verbose"]),launch:Ce},{protocol:"codex",promptMode:"stdin",args:JSON.stringify(["exec","--skip-git-repo-check","--json"]),launch:Yr}];async function Ie(e,t){let r=`${e}.${process.pid}.tmp`;await ni(r,JSON.stringify(t),{mode:384}),await si(r,e)}function Ae(e){let t=new URL(e);if(t.username||t.password||t.search||t.hash||t.protocol!=="https:"&&!(t.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(t.hostname)))throw new Error("\u8FDE\u63A5\u5730\u5740\u5FC5\u987B\u4F7F\u7528 HTTPS\uFF1B\u4EC5\u672C\u673A\u5F00\u53D1\u5141\u8BB8 HTTP");let r=Wr(ii(),".orcha","devices"),n=Wr(r,Xr("sha256").update(t.toString()).digest("hex").slice(0,20));return{address:t,root:r,profile:`${n}.json`,pidFile:`${n}.pid`,logFile:`${n}.log`}}async function Ft(e,{url:t,pairCode:r}){let{address:n,root:s,profile:i}=Ae(t||e.orchaUrl);await ei(s,{recursive:!0,mode:448});let o;if(r){let a=await fetch(new URL("api/agent-devices/pairings/exchange",`${n.toString().replace(/\/+$/,"")}/`),{method:"POST",redirect:"error",headers:{"content-type":"application/json"},signal:AbortSignal.timeout(15e3),body:JSON.stringify({code:r,name:oi()})}),c=await a.json();if(!a.ok||!c.success)throw new Error(c.message||c.detail||"\u8BBE\u5907\u8FDE\u63A5\u5931\u8D25");o={...c.data,targets:{}},await Ie(i,o)}else{try{o=JSON.parse(await ri(i,"utf8"))}catch{throw new Error("\u6CA1\u6709\u5DF2\u8FDE\u63A5\u8BBE\u5907\uFF0C\u8BF7\u4ECE\u667A\u80FD\u4F53\u9875\u9762\u751F\u6210\u8FDE\u63A5\u7801")}let a=!1;for(let[c,l]of Object.entries(o.targets||{})){let p=ai.find(w=>w.protocol===l.terminalProtocol&&w.promptMode===l.promptMode&&w.args===JSON.stringify(l.args));if(!p)continue;let{terminalProtocol:h,args:f,promptMode:m,outputMode:y,captureLastMessage:T,...C}=l;o.targets[c]={...C,...structuredClone(p.launch)},a=!0}a&&await Ie(i,o)}e.orchaUrl=n.toString().replace(/\/+$/,""),e.mode="node",e.nodeId=o.nodeCode,e.nodeName=o.nodeName,e.nodeToken=o.token,e.targets=o.targets,e.defaultTargetCode="",e.deviceConnection=new xe(e,o,async()=>Ie(i,o))}var xe=class{constructor(t,r,n,s=Jr){this.config=t,this.profile=r,this.persist=n,this.discover=s}async candidates(){return{candidates:(await this.discover()).map(({command:r,localAgentId:n,...s})=>s)}}async configure(t,r){if(!Array.isArray(t.selections)||!t.selections.length||t.selections.length>32)throw new Error("\u6DFB\u52A0\u9879\u65E0\u6548");let n=new Map((await this.discover()).map(c=>[c.id,c])),s={...r.targets},i=[],o=new Set;for(let c of t.selections){let l=n.get(c.candidateId);if(!l||l.status!=="ready"||o.has(l.id))throw new Error("\u53D1\u73B0\u7ED3\u679C\u5DF2\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u68C0\u6D4B");o.add(l.id);let p=String(c.name||"").trim();if(!p||p.length>128)throw new Error("\u667A\u80FD\u4F53\u540D\u79F0\u65E0\u6548");let h=await Oe(String(c.workspace||""));if(l.managed&&h!==await Oe(l.workspace))throw new Error("\u5DF2\u6709\u667A\u80FD\u4F53\u5FC5\u987B\u6CBF\u7528\u672C\u673A\u5DE5\u4F5C\u76EE\u5F55");let f=`${this.config.nodeId}:${Xr("sha256").update(l.id).digest("hex").slice(0,20)}`;if([...r.sessions.values()].some(m=>m.targetCode===f))throw new Error("\u6B64\u667A\u80FD\u4F53\u4ECD\u6709\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u7ED3\u675F\u4F1A\u8BDD\u518D\u4FEE\u6539\u63A5\u5165");s[f]={name:p,workspace:h,command:l.command,type:l.managed?"openclaw":"cli",...l.managed?{openclawAgentId:l.localAgentId}:structuredClone(l.framework==="codex"?Yr:Ce)},i.push({candidateId:l.id,name:p,workspace:h,targetCode:f,framework:l.framework})}let a=this.profile.targets;this.profile.targets=s;try{await this.persist()}catch(c){throw this.profile.targets=a,c}return r.targets=s,this.config.targets=s,r.notifyCapacityChanged(),{agents:i}}};import{execFile as Ei}from"node:child_process";import{constants as Si}from"node:fs";import{access as an,readFile as cn,realpath as Ri}from"node:fs/promises";import{join as Ne}from"node:path";import{promisify as Oi}from"node:util";var K="0.1.55";function xt(){return new Date().toISOString()}function $(e,t=2){return String(e).padStart(t,"0")}function Qr(e){let t=e>=0?"+":"-",r=Math.abs(e);return`${t}${$(Math.floor(r/60))}:${$(r%60)}`}function ci(e){let t=-e.getTimezoneOffset();return[`${e.getFullYear()}-${$(e.getMonth()+1)}-${$(e.getDate())}`,`T${$(e.getHours())}:${$(e.getMinutes())}:${$(e.getSeconds())}.${$(e.getMilliseconds(),3)}`,Qr(t)].join("")}function ui(e,t){let r=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"}),n={};for(let s of r.formatToParts(e))s.type!=="literal"&&(n[s.type]=Number(s.value));return n}function li(e,t){let r=ui(e,t),n=Date.UTC(r.year,r.month-1,r.day,r.hour,r.minute,r.second,e.getMilliseconds()),s=Math.round((n-e.getTime())/6e4);return[`${r.year}-${$(r.month)}-${$(r.day)}`,`T${$(r.hour)}:${$(r.minute)}:${$(r.second)}.${$(e.getMilliseconds(),3)}`,Qr(s)].join("")}function di(e=new Date){let t=u(process.env.ORCHA_RUNTIME_LOG_TIMEZONE||process.env.TZ||"Asia/Shanghai");try{return li(e,t)}catch{return ci(e)}}function d(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function u(e){return String(e??"").trim()}function R(e,t){let r=Number.parseInt(String(e??""),10);return Number.isFinite(r)?r:t}function P(e){return Array.isArray(e)?e.map(String):[]}function J(e,t,r=process.cwd()){let n=d(e)?e:{};return u(n.cwd)||u(n.workspace)||u(t)||u(r)||process.cwd()}var Bt="[redacted]",pi=/(authorization|api[_-]?key|credential|password|secret|token)/i;function Z(e){return pi.test(u(e))}function st(e,t=[]){let r=String(e??"");for(let n of t){let s=String(n??"");s.length>=4&&(r=r.split(s).join(Bt))}return r.replace(/((?:authorization|api[_-]?key|credential|password|secret|token)\s*[:=]\s*)(?:"[^"]*"|'[^']*'|[^\s,;]+)/gi,`$1${Bt}`).replace(/([?&](?:api[_-]?key|credential|password|secret|token)=)[^&\s]+/gi,`$1${Bt}`)}function nt(e,t=new WeakSet){if(e==null)return e;if(typeof e=="bigint")return e.toString();if(typeof e!="object")return e;if(e instanceof Date)return e.toISOString();if(e instanceof Error){if(t.has(e))return"[circular]";t.add(e);let s={name:e.name,message:e.message};e.stack&&(s.stack=e.stack);for(let i of Object.keys(e))s[i]=nt(e[i],t);return t.delete(e),s}if(t.has(e))return"[circular]";if(t.add(e),Array.isArray(e)){let s=e.map(i=>nt(i,t));return t.delete(e),s}let r={},n=Z(e.name||e.key);for(let[s,i]of Object.entries(e))r[s]=Z(s)||n&&s.toLowerCase()==="value"?Bt:nt(i,t);return t.delete(e),r}function Zr(e,t=4e3){let r=JSON.stringify(nt(e))??String(e);return!Number.isFinite(t)||r.length<=t?r:`${r.slice(0,t)}...`}function _(e,t,r,n={}){let s={ts:di(),level:e,module:t,msg:r,...d(n)?nt(n):{}};console.error(JSON.stringify(s))}var it="application/x-orcha-channel-events-v2+ndjson";function D(e,t){return Object.assign(new Error(t||(["run_timeout","RUNTIME_NODE_TIMEOUT"].includes(e)?"OpenClaw \u539F\u751F IM \u6267\u884C\u8D85\u65F6\uFF0C\u4EFB\u52A1\u5DF2\u7ED3\u675F\uFF0C\u8BF7\u91CD\u8BD5\u3002":e==="OPENCLAW_CHANNEL_PROTOCOL_MISMATCH"?"OpenClaw \u63D2\u4EF6\u4E0E Bridge \u7684\u539F\u751F IM \u534F\u8BAE\u4E0D\u517C\u5BB9\uFF0C\u8BF7\u914D\u5957\u5347\u7EA7\u3002":`OpenClaw \u539F\u751F IM \u6267\u884C\u5931\u8D25\uFF08${e}\uFF09`)),{code:e})}function tn(e,t){let r=e.cause?.code||e.code;return t?.reason?.name==="TimeoutError"||e.name==="TimeoutError"||["UND_ERR_HEADERS_TIMEOUT","UND_ERR_BODY_TIMEOUT","UND_ERR_CONNECT_TIMEOUT","ETIMEDOUT"].includes(r)?Object.assign(D("RUNTIME_NODE_TIMEOUT","OpenClaw \u8FDE\u63A5\u6216\u7B49\u5F85\u54CD\u5E94\u8D85\u65F6\uFF0C\u4EFB\u52A1\u5DF2\u7ED3\u675F\uFF0C\u8BF7\u91CD\u8BD5\u3002"),{detail:{causeCode:r||"REQUEST_TIMEOUT"}}):e}async function en(e,t){if(e.headers.get("content-type")!==it)throw await e.body?.cancel(),D("OPENCLAW_CHANNEL_PROTOCOL_MISMATCH");let r=Buffer.alloc(0);for await(let n of e.body){r=Buffer.concat([r,n]);let s;for(;(s=r.indexOf(10))>=0;){if(s>2097152)throw D("OPENCLAW_CHANNEL_FRAME_TOO_LARGE");let i=r.subarray(0,s).toString("utf8");r=r.subarray(s+1);let o;try{o=JSON.parse(i)}catch{throw D("OPENCLAW_CHANNEL_INVALID_FRAME")}if(o.type!=="heartbeat")if(o.type==="update"&&o.payload?.update&&o.payload?._meta?.channelUpdateId)await t(o.payload);else{if(o.type==="result"&&o.result?.stopReason)return o.result;throw o.type==="error"&&typeof o.code=="string"?D(o.code):D("OPENCLAW_CHANNEL_INVALID_FRAME")}}if(r.length>2097152)throw D("OPENCLAW_CHANNEL_FRAME_TOO_LARGE")}throw D("OPENCLAW_CHANNEL_STREAM_INTERRUPTED","OpenClaw \u8FC7\u7A0B\u8FDE\u63A5\u4E2D\u65AD\uFF0C\u672A\u6536\u5230\u4EFB\u52A1\u7EC8\u6001\uFF0C\u8BF7\u68C0\u67E5\u8282\u70B9\u8FDE\u63A5\u540E\u91CD\u8BD5\u3002")}import{createServer as hi}from"node:http";import{randomBytes as mi}from"node:crypto";var jt={controlTools:["find_capabilities_and_skills","describe_capability","inspect_result","execute_capability"],residentTools:["search_orcha_docs","knowledge_search"]};var gi=Object.freeze([...jt.controlTools,...jt.residentTools]),_i=new Set(gi),yi=8*1024*1024;function qt(e,t){if(!Array.isArray(e)||e.length!==1)throw new Error("one task-scoped Orcha MCP server is required");let r=e[0],n=new URL(r.url);if(r.name!=="orcha"||r.type!=="http"||!["http:","https:"].includes(n.protocol)||n.username||n.password||n.hash||t&&n.href!==new URL(t).href)throw new Error("Orcha MCP server does not match the trusted binding");let s=Object.fromEntries((r.headers||[]).map(({name:i,value:o})=>[i.toLowerCase(),o]));if(!String(s.authorization||"").startsWith("Bearer "))throw new Error("Orcha MCP task credentials are missing");return{url:n.href,headers:{...s,"content-type":"application/json",accept:"application/json"}}}async function nn(e){let t=0,r=[];for await(let n of e){if(t+=n.length,t>yi)throw new Error("MCP payload exceeds the size limit");r.push(Buffer.from(n))}return JSON.parse(Buffer.concat(r).toString("utf8"))}async function sn(e,t,r){let n=await fetch(e.url,{method:"POST",headers:e.headers,body:JSON.stringify(t),redirect:"error",signal:AbortSignal.any([AbortSignal.timeout(36e5),...r?[r]:[]])});if(!n.ok)throw new Error(`Orcha MCP request failed (${n.status})`);if(n.status===202||n.status===204)return null;let s=await nn(n.body);if(!s||s.jsonrpc!=="2.0"||s.id!==t.id)throw new Error("Orcha MCP response identity mismatch");return s}async function rn(e,t){let r=await sn(e,{jsonrpc:"2.0",id:"orcha-bind-tools",method:"tools/list"},t),n=r?.result?.tools;if(r?.error){let s=Object.entries(e.headers).filter(([a])=>Z(a)).flatMap(([,a])=>[a,String(a).replace(/^Bearer\s+/i,"")]),i=typeof r.error.message=="string"?st(r.error.message,s).slice(0,512):"",o=Number.isInteger(r.error.code)?` (${r.error.code})`:"";throw new Error(`Orcha MCP tool discovery failed${o}${i?`: ${i}`:""}`)}return Ti(n)}function Ti(e){if(!Array.isArray(e)||e.some(t=>!t||!_i.has(t.name)||t.inputSchema?.type!=="object"||typeof t.description!="string")||new Set(e.map(t=>t.name)).size!==e.length||e.length&&jt.controlTools.some(t=>!e.some(r=>r.name===t)))throw new Error("Orcha MCP returned an unsupported or invalid authorized tool catalog");return e}function wi(e,t){let r=s=>Array.isArray(s)?s.map(r):s&&typeof s=="object"?Object.fromEntries(Object.keys(s).sort().map(i=>[i,r(s[i])])):s,n=s=>s.map(({name:i,inputSchema:o})=>({name:i,inputSchema:o})).sort((i,o)=>i.name.localeCompare(o.name));return JSON.stringify(r(n(e)))===JSON.stringify(r(n(t)))}async function on(e,t=[]){let r=qt(e),n=new AbortController,s=await rn(r,n.signal);if(t.some(a=>s.some(c=>c.name===a.name)))throw new Error("Local and remote MCP tools conflict");let i=mi(32).toString("hex"),o=hi(async(a,c)=>{if(a.url!=="/mcp"||a.headers.authorization!==`Bearer ${i}`){c.writeHead(403).end();return}if(a.method!=="POST"){c.writeHead(405).end();return}try{let l=await nn(a);if(!l||l.jsonrpc!=="2.0"||typeof l.method!="string")throw new Error("Invalid MCP request");let p=l.method==="tools/call"&&t.find(f=>f.name===l.params?.name);if(l.method==="tools/call"&&!p&&!s.some(f=>f.name===l.params?.name))throw new Error("Tool is not authorized in this task binding");let h;if(p)try{h={jsonrpc:"2.0",id:l.id,result:await p.call(l.params.arguments,{upstream:r,signal:n.signal})}}catch(f){h={jsonrpc:"2.0",id:l.id,result:{isError:!0,content:[{type:"text",text:st(String(f.message),[r.headers.authorization,i])}]}}}else h=await sn(r,l,n.signal),l.method==="tools/list"&&h?.result?.tools&&h.result.tools.push(...t.map(({call:f,...m})=>m));c.writeHead(h===null?202:200,{"content-type":"application/json"}),c.end(h===null?"":JSON.stringify(h))}catch{c.writeHead(502,{"content-type":"application/json"}).end(JSON.stringify({error:"The task-scoped Orcha MCP connection failed"}))}});return await new Promise((a,c)=>{o.once("error",c),o.listen(0,"127.0.0.1",a)}),{url:`http://127.0.0.1:${o.address().port}/mcp`,token:i,async refresh(a){let c=qt(a,r.url);if(!wi(s,await rn(c,n.signal)))throw new Error("The frozen MCP tool catalog changed; start a new task");r=c},async close(){n.abort(),o.closeAllConnections(),await new Promise(a=>o.close(a))}}}var tt=class{constructor(t,r){this.target=t,this.identity=r,this.bound=!1}async request(t,r,n=!1,s="mcp-bindings",i=3e4,o=null){let a=u(this.target.mcpBridgeUrl),c=u(this.target.mcpBridgeTokenEnv),l=this.target.env?.[c]||process.env[c];if(!a||!c||!l)throw Object.assign(new Error("OpenClaw requires the Orcha tool plugin, mcpBridgeUrl and mcpBridgeTokenEnv"),{code:"OPENCLAW_MCP_NOT_CONFIGURED"});let p=new URL(a);if(!["http:","https:"].includes(p.protocol)||p.username||p.password||p.pathname!=="/plugins/orcha-runtime/mcp-bindings"||p.search||p.hash)throw new Error("OpenClaw MCP binding URL must be the trusted Gateway plugin route");if(!["mcp-bindings","deliveries","background"].includes(s))throw new Error("Unsupported Orcha plugin route");p.pathname=`/plugins/orcha-runtime/${s}`;let h=AbortSignal.timeout(i);try{let f=await fetch(p,{method:t,redirect:"error",signal:h,headers:{authorization:`Bearer ${l}`,"content-type":"application/json",...o?{accept:it}:{},...n?{"if-match":this.identity.runId}:{}},...r!==void 0?{body:JSON.stringify(r)}:{}});if(t==="GET"&&s==="deliveries"&&[404,405].includes(f.status))throw await f.body?.cancel(),D("OPENCLAW_CHANNEL_PROTOCOL_MISMATCH");if(f.ok&&o)return await en(f,o);let m=await f.json();if(!f.ok)throw D(m.error||"OPENCLAW_MCP_BINDING_FAILED");return m}catch(f){throw tn(f,h)}}async bind(t,r=!1){qt(t),await this.request("PUT",{...this.identity,mcpServer:t[0]},r),this.bound=!0}async close(){this.bound&&(await this.request("DELETE",{runId:this.identity.runId,sessionKey:this.identity.sessionKey}),this.bound=!1)}};var Ii=Oi(Ei),Ci=12e4;async function un(e,t){let r=new Map,n=[];for(let s of Object.values(e)){if(s.type!=="openclaw")continue;if(s.mcpBridgeUrl&&(n.push(s),!["localhost","127.0.0.1","[::1]"].includes(new URL(s.mcpBridgeUrl).hostname))){process.stderr.write(`\u8FDC\u7A0B OpenClaw Gateway \u7684\u914D\u5957\u63D2\u4EF6\u9700\u5728\u6240\u5728\u4E3B\u673A\u66F4\u65B0\uFF1Breload \u5C06\u68C0\u67E5\u5176\u534F\u8BAE\u3002
3
- `);continue}let i={...process.env,...s.env},o=u(s.command)||"openclaw",a=o.includes("/")?o:await Re(o,i);if(!a)throw new Error("\u627E\u4E0D\u5230\u5DF2\u63A5\u5165\u7684 OpenClaw\uFF0C\u8BF7\u68C0\u67E5\u672C\u673A\u5B89\u88C5\u540E\u91CD\u8BD5 reload");let c=await Ri(a);await an(c,Si.X_OK);let l=JSON.stringify([c,Object.entries(i).sort(([p],[h])=>p.localeCompare(h))]);r.has(l)||r.set(l,{command:c,env:i})}if(r.size)try{let s=JSON.parse(await cn(Ne(t,"openclaw.plugin.json"),"utf8")),i=JSON.parse(await cn(Ne(t,"package.json"),"utf8"));if(await an(Ne(t,"index.js")),s.id!=="orcha-runtime"||i.version!==K)throw new Error("\u63D2\u4EF6\u6807\u8BC6\u6216\u7248\u672C\u4E0D\u5339\u914D")}catch(s){throw new Error("\u914D\u5957 OpenClaw \u63D2\u4EF6\u7F3A\u5931\u3001\u635F\u574F\u6216\u7248\u672C\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5 Bridge\uFF1B\u6E90\u7801\u8FD0\u884C\u8BF7\u5148 npm run build",{cause:s})}return async()=>{for(let s of r.values()){process.stderr.write(`\u6B63\u5728\u5B89\u88C5\u914D\u5957 OpenClaw \u63D2\u4EF6\u5E76\u91CD\u542F Gateway\u2026
4
- `),await be(s,["plugins","install",t,"--force"]),await be(s,["gateway","restart"]);let i=await be(s,["health","--json"]);if(JSON.parse(i).ok!==!0)throw new Error("OpenClaw Gateway \u5065\u5EB7\u68C0\u67E5\u5931\u8D25\uFF0CBridge \u672A\u542F\u52A8\uFF0C\u8BF7\u4FEE\u590D\u540E\u91CD\u8BD5 reload");process.stderr.write(`OpenClaw \u914D\u5957\u63D2\u4EF6\u5DF2\u66F4\u65B0\uFF0CGateway \u5065\u5EB7\u68C0\u67E5\u901A\u8FC7\u3002
5
- `)}for(let s of n)if((await new tt(s,{}).request("GET",void 0,!1,"deliveries")).streamType!==it)throw D("OPENCLAW_CHANNEL_PROTOCOL_MISMATCH")}}async function be(e,t){try{let{stdout:r}=await Ii(e.command,t,{env:e.env,timeout:Ci,killSignal:"SIGKILL",maxBuffer:1048576,windowsHide:!0});return r}catch(r){let n=Object.entries(e.env).filter(([i])=>Z(i)).map(([,i])=>i),s=st(r.stderr||r.message,n).trim();throw new Error(`OpenClaw ${t.slice(0,2).join(" ")} \u5931\u8D25\uFF0CBridge \u672A\u542F\u52A8\uFF0C\u8BF7\u4FEE\u590D\u540E\u91CD\u8BD5 reload\uFF1A${s}`)}}import{createHash as lc,randomUUID as de}from"node:crypto";function ht(e){return Array.isArray(e)?e.map(t=>d(t)?t.type==="text"?u(t.text):t.type==="file"?u(t.uri):t.type==="image"?u(t.uri):"":"").filter(Boolean).join(`
6
- `):""}var Gt=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,r){let n=ht(t.prompt);return r({sessionId:t.sessionId,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:n?`Echo runtime received: ${n}`:"Echo runtime received an empty prompt."}}}),{stopReason:"end_turn"}}async sessionCancel(){return{ok:!0}}};import{spawn as xi}from"node:child_process";var At="2.0",Me=3e4,Ai=4e3;function Kt(e,t){let r=Object.entries(d(t)?t:{}).filter(([n])=>Z(n)).map(([,n])=>n);return st(e,r)}function Ni(e){return{code:Number.isInteger(e?.code)?e.code:-32e3,message:u(e?.message)||String(e),data:d(e?.data)?e.data:void 0}}function bi(e){if(!d(e))return new Error(String(e||"runtime error"));let t=u(e.message)||"runtime error",r="data"in e?Zr(e.data,4e3):"",n=new Error(r?`${t}; data=${r}`:t);return n.rpcCode=e.code,n.data=e.data,n}function Mi(e){return d(e)&&"id"in e&&!("method"in e)}function Ui(e){return d(e)&&typeof e.method=="string"&&"id"in e}function Pi(e){return d(e)&&typeof e.method=="string"&&!("id"in e)}var zt=class{constructor({command:t,args:r=[],cwd:n,env:s,label:i,framing:o="line",detached:a=!0}){this.command=t,this.args=Array.isArray(r)?r.map(String):[],this.cwd=n||process.cwd(),this.env=d(s)?{...s}:{...process.env},this.label=i||t,this.framing=o==="content-length"?"content-length":"line",this.detached=a!==!1,this.child=null,this.exited=!1,this.exitCode=null,this.exitSignal=null,this.stopPromise=null,this.stderrTail="",this.spawnError=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:r={},initializeTimeoutMs:n=Me}={}){if(!(this.child&&!this.exited)&&(this.exited=!1,this.exitCode=null,this.exitSignal=null,this.stderrTail="",this.spawnError=null,this.child=xi(this.command,this.args,{cwd:this.cwd,env:this.env,stdio:["pipe","pipe","pipe"],detached:this.detached}),this.child.stdout.on("data",s=>this.onStdout(s)),this.child.stderr.setEncoding("utf8"),this.child.stderr.on("data",s=>{this.stderrTail=`${this.stderrTail}${s}`.slice(-Ai);let i=Kt(s.trimEnd(),this.env);i&&_("debug","runtime.stderr","runtime stderr",{target:this.label,text:i})}),this.child.on("exit",(s,i)=>this.handleExit(s,i)),this.child.on("error",s=>{this.spawnError=s,this.rejectAll(s)}),t)){let s=Math.max(1,R(n,Me));try{await this.call("initialize",{protocolVersion:1,clientCapabilities:{},...r},s)}catch(i){let o=this.startupFailureDetail(),a=Kt(i?.message||i,this.env);_("warn","runtime.initialize","runtime initialize failed",{target:this.label,timeoutMs:s,cause:a,...o}),await this.stop("initialize failed",{termTimeoutMs:1e3,killTimeoutMs:1e3});let c=o.stderr?`; stderr: ${o.stderr}`:`; command=${o.command}; cwd=${o.cwd}`;throw Object.assign(new Error(`runtime initialize failed: ${a}${c}`,{cause:i}),{code:"RUNTIME_INITIALIZE_FAILED",detail:o})}}}startupFailureDetail(){return{command:this.command,cwd:this.cwd,exited:this.exited,exitCode:this.exitCode,exitSignal:this.exitSignal,...this.spawnError?{spawnError:Kt(this.spawnError.message,this.env)}:{},...this.stderrTail.trim()?{stderr:Kt(this.stderrTail.trim(),this.env)}:{}}}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 r=this.lineBuffer.split(/\r?\n/);this.lineBuffer=r.pop()||"";for(let n of r){let s=n.trim();s&&this.dispatchRaw(s)}}onContentLengthData(t){for(this.headerBuffer=Buffer.concat([this.headerBuffer,t]);this.headerBuffer.length>0;){let r=this.headerBuffer.indexOf(`\r
2
+ import{spawn as au}from"node:child_process";import{closeSync as cu,existsSync as Fr,mkdirSync as uu,openSync as lu,readFileSync as Dr,rmSync as du,statSync as Ls,writeFileSync as Hs}from"node:fs";import{dirname as Fs,resolve as Ot}from"node:path";import{fileURLToPath as pu}from"node:url";import{createHash as Xr}from"node:crypto";import{mkdir as ei,readFile as ri,writeFile as ni,rename as si}from"node:fs/promises";import{join as Wr}from"node:path";import{homedir as ii,hostname as oi}from"node:os";import{execFile as Ws}from"node:child_process";import{access as Xs,realpath as Ys}from"node:fs/promises";import{constants as Qs}from"node:fs";import{delimiter as Zs,join as zr,isAbsolute as Vr}from"node:path";import{homedir as Kr}from"node:os";async function Re(e,t=process.env){let r=process.platform==="win32"?[".exe",".cmd",".bat",""]:[""];for(let n of(t.PATH||"").split(Zs).filter(Vr))for(let s of r){let i=zr(n,`${e}${s}`);try{return await Xs(i,Qs.X_OK),i}catch{}}return null}function ti(e,t){return new Promise(r=>Ws(e,t,{timeout:8e3,maxBuffer:1024*1024,windowsHide:!0},(n,s)=>r({code:n?n.code:0,stdout:String(s||"")})))}async function Oe(e){let t=e==="~"?Kr():e.startsWith("~/")?zr(Kr(),e.slice(2)):e;if(!Vr(t))throw new Error("\u5DE5\u4F5C\u76EE\u5F55\u5FC5\u987B\u662F\u8BBE\u5907\u4E0A\u7684\u7EDD\u5BF9\u8DEF\u5F84\u6216 ~/ \u5F00\u5934\u7684\u8DEF\u5F84");let r=await Ys(t),{stat:n}=await import("node:fs/promises");if(!(await n(r)).isDirectory())throw new Error("\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u662F\u6587\u4EF6\u5939");return r}async function Jr({find:e=Re,run:t=ti,cwd:r=process.cwd()}={}){return(await Promise.all(["codex","claude","openclaw"].map(async s=>{let i=await e(s);if(!i)return[];let o={codex:"Codex",claude:"Claude Code",openclaw:"OpenClaw"}[s],a=await t(i,["--version"]),c=a.code===0&&a.stdout.match(/\d+\.\d+\.\d+[^\s]*/)?.[0]||"",l={id:s,name:o,framework:s,version:c,workspace:r,managed:!1};if(a.code!==0)return[{...l,status:"error",message:"\u7A0B\u5E8F\u65E0\u6CD5\u542F\u52A8\uFF0C\u8BF7\u5728\u672C\u673A\u68C0\u67E5\u5B89\u88C5"}];if(s==="openclaw"){let f=await t(i,["agents","list","--json"]),m;try{m=JSON.parse(f.stdout)}catch{}if(f.code!==0||!Array.isArray(m))return[{...l,status:"error",message:"\u65E0\u6CD5\u8BFB\u53D6 OpenClaw \u667A\u80FD\u4F53\uFF0C\u8BF7\u68C0\u67E5\u672C\u673A\u914D\u7F6E"}];let g=await t(i,["health","--json"]);return m.filter(T=>typeof T.id=="string"&&typeof T.workspace=="string").slice(0,32).map(T=>({...l,id:`openclaw:${T.id}`,name:T.name||T.identityName||T.id,workspace:T.workspace,managed:!0,localAgentId:T.id,command:i,status:g.code===0?"ready":"needs_setup",message:g.code===0?"":"\u8BF7\u5148\u5728\u672C\u673A\u542F\u52A8\u5E76\u914D\u7F6E OpenClaw Gateway"}))}let p=await t(i,s==="codex"?["login","status"]:["auth","status"]),h=p.code===0?"ready":p.code===1?"needs_login":"error";return[{...l,command:i,status:h,message:h==="needs_login"?`\u8BF7\u5728\u672C\u673A\u8FD0\u884C ${s} ${s==="codex"?"login":"auth login"}`:h==="error"?"\u767B\u5F55\u72B6\u6001\u68C0\u6D4B\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 CLI \u7248\u672C":""}]}))).flat()}var Ce={terminalProtocol:"claude",args:["-p","--output-format","stream-json","--verbose","--include-partial-messages"],promptMode:"stdin",outputMode:"json-lines"},Yr={terminalProtocol:"codex",args:["app-server"]},ai=[{protocol:"claude",promptMode:"args",args:JSON.stringify(["-p","--output-format","json","--no-session-persistence"]),launch:Ce},{protocol:"claude",promptMode:"stdin",args:JSON.stringify(["-p","--output-format","stream-json","--verbose"]),launch:Ce},{protocol:"codex",promptMode:"stdin",args:JSON.stringify(["exec","--skip-git-repo-check","--json"]),launch:Yr}];async function Ie(e,t){let r=`${e}.${process.pid}.tmp`;await ni(r,JSON.stringify(t),{mode:384}),await si(r,e)}function Ae(e){let t=new URL(e);if(t.username||t.password||t.search||t.hash||t.protocol!=="https:"&&!(t.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(t.hostname)))throw new Error("\u8FDE\u63A5\u5730\u5740\u5FC5\u987B\u4F7F\u7528 HTTPS\uFF1B\u4EC5\u672C\u673A\u5F00\u53D1\u5141\u8BB8 HTTP");let r=Wr(ii(),".orcha","devices"),n=Wr(r,Xr("sha256").update(t.toString()).digest("hex").slice(0,20));return{address:t,root:r,profile:`${n}.json`,pidFile:`${n}.pid`,logFile:`${n}.log`}}async function Ft(e,{url:t,pairCode:r}){let{address:n,root:s,profile:i}=Ae(t||e.orchaUrl);await ei(s,{recursive:!0,mode:448});let o;if(r){let a=await fetch(new URL("api/agent-devices/pairings/exchange",`${n.toString().replace(/\/+$/,"")}/`),{method:"POST",redirect:"error",headers:{"content-type":"application/json"},signal:AbortSignal.timeout(15e3),body:JSON.stringify({code:r,name:oi()})}),c=await a.json();if(!a.ok||!c.success)throw new Error(c.message||c.detail||"\u8BBE\u5907\u8FDE\u63A5\u5931\u8D25");o={...c.data,targets:{}},await Ie(i,o)}else{try{o=JSON.parse(await ri(i,"utf8"))}catch{throw new Error("\u6CA1\u6709\u5DF2\u8FDE\u63A5\u8BBE\u5907\uFF0C\u8BF7\u4ECE\u667A\u80FD\u4F53\u9875\u9762\u751F\u6210\u8FDE\u63A5\u7801")}let a=!1;for(let[c,l]of Object.entries(o.targets||{})){let p=ai.find(w=>w.protocol===l.terminalProtocol&&w.promptMode===l.promptMode&&w.args===JSON.stringify(l.args));if(!p)continue;let{terminalProtocol:h,args:f,promptMode:m,outputMode:g,captureLastMessage:T,...x}=l;o.targets[c]={...x,...structuredClone(p.launch)},a=!0}a&&await Ie(i,o)}e.orchaUrl=n.toString().replace(/\/+$/,""),e.mode="node",e.nodeId=o.nodeCode,e.nodeName=o.nodeName,e.nodeToken=o.token,e.targets=o.targets,e.defaultTargetCode="",e.deviceConnection=new xe(e,o,async()=>Ie(i,o))}var xe=class{constructor(t,r,n,s=Jr){this.config=t,this.profile=r,this.persist=n,this.discover=s}async candidates(){return{candidates:(await this.discover()).map(({command:r,localAgentId:n,...s})=>s)}}async configure(t,r){if(!Array.isArray(t.selections)||!t.selections.length||t.selections.length>32)throw new Error("\u6DFB\u52A0\u9879\u65E0\u6548");let n=new Map((await this.discover()).map(c=>[c.id,c])),s={...r.targets},i=[],o=new Set;for(let c of t.selections){let l=n.get(c.candidateId);if(!l||l.status!=="ready"||o.has(l.id))throw new Error("\u53D1\u73B0\u7ED3\u679C\u5DF2\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u68C0\u6D4B");o.add(l.id);let p=String(c.name||"").trim();if(!p||p.length>128)throw new Error("\u667A\u80FD\u4F53\u540D\u79F0\u65E0\u6548");let h=await Oe(String(c.workspace||""));if(l.managed&&h!==await Oe(l.workspace))throw new Error("\u5DF2\u6709\u667A\u80FD\u4F53\u5FC5\u987B\u6CBF\u7528\u672C\u673A\u5DE5\u4F5C\u76EE\u5F55");let f=`${this.config.nodeId}:${Xr("sha256").update(l.id).digest("hex").slice(0,20)}`;if([...r.sessions.values()].some(m=>m.targetCode===f))throw new Error("\u6B64\u667A\u80FD\u4F53\u4ECD\u6709\u4F1A\u8BDD\uFF0C\u8BF7\u5148\u7ED3\u675F\u4F1A\u8BDD\u518D\u4FEE\u6539\u63A5\u5165");s[f]={name:p,workspace:h,command:l.command,type:l.managed?"openclaw":"cli",...l.managed?{openclawAgentId:l.localAgentId}:structuredClone(l.framework==="codex"?Yr:Ce)},i.push({candidateId:l.id,name:p,workspace:h,targetCode:f,framework:l.framework})}let a=this.profile.targets;this.profile.targets=s;try{await this.persist()}catch(c){throw this.profile.targets=a,c}return r.targets=s,this.config.targets=s,r.notifyCapacityChanged(),{agents:i}}};import{execFile as Ei}from"node:child_process";import{constants as Si}from"node:fs";import{access as an,readFile as cn,realpath as Ri}from"node:fs/promises";import{join as be}from"node:path";import{promisify as Oi}from"node:util";var K="0.1.56";function At(){return new Date().toISOString()}function $(e,t=2){return String(e).padStart(t,"0")}function Qr(e){let t=e>=0?"+":"-",r=Math.abs(e);return`${t}${$(Math.floor(r/60))}:${$(r%60)}`}function ci(e){let t=-e.getTimezoneOffset();return[`${e.getFullYear()}-${$(e.getMonth()+1)}-${$(e.getDate())}`,`T${$(e.getHours())}:${$(e.getMinutes())}:${$(e.getSeconds())}.${$(e.getMilliseconds(),3)}`,Qr(t)].join("")}function ui(e,t){let r=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"}),n={};for(let s of r.formatToParts(e))s.type!=="literal"&&(n[s.type]=Number(s.value));return n}function li(e,t){let r=ui(e,t),n=Date.UTC(r.year,r.month-1,r.day,r.hour,r.minute,r.second,e.getMilliseconds()),s=Math.round((n-e.getTime())/6e4);return[`${r.year}-${$(r.month)}-${$(r.day)}`,`T${$(r.hour)}:${$(r.minute)}:${$(r.second)}.${$(e.getMilliseconds(),3)}`,Qr(s)].join("")}function di(e=new Date){let t=u(process.env.ORCHA_RUNTIME_LOG_TIMEZONE||process.env.TZ||"Asia/Shanghai");try{return li(e,t)}catch{return ci(e)}}function d(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function u(e){return String(e??"").trim()}function R(e,t){let r=Number.parseInt(String(e??""),10);return Number.isFinite(r)?r:t}function P(e){return Array.isArray(e)?e.map(String):[]}function W(e,t,r=process.cwd()){let n=d(e)?e:{};return u(n.cwd)||u(n.workspace)||u(t)||u(r)||process.cwd()}var Bt="[redacted]",pi=/(authorization|api[_-]?key|credential|password|secret|token)/i;function tt(e){return pi.test(u(e))}function ot(e,t=[]){let r=String(e??"");for(let n of t){let s=String(n??"");s.length>=4&&(r=r.split(s).join(Bt))}return r.replace(/((?:authorization|api[_-]?key|credential|password|secret|token)\s*[:=]\s*)(?:"[^"]*"|'[^']*'|[^\s,;]+)/gi,`$1${Bt}`).replace(/([?&](?:api[_-]?key|credential|password|secret|token)=)[^&\s]+/gi,`$1${Bt}`)}function it(e,t=new WeakSet){if(e==null)return e;if(typeof e=="bigint")return e.toString();if(typeof e!="object")return e;if(e instanceof Date)return e.toISOString();if(e instanceof Error){if(t.has(e))return"[circular]";t.add(e);let s={name:e.name,message:e.message};e.stack&&(s.stack=e.stack);for(let i of Object.keys(e))s[i]=it(e[i],t);return t.delete(e),s}if(t.has(e))return"[circular]";if(t.add(e),Array.isArray(e)){let s=e.map(i=>it(i,t));return t.delete(e),s}let r={},n=tt(e.name||e.key);for(let[s,i]of Object.entries(e))r[s]=tt(s)||n&&s.toLowerCase()==="value"?Bt:it(i,t);return t.delete(e),r}function Zr(e,t=4e3){let r=JSON.stringify(it(e))??String(e);return!Number.isFinite(t)||r.length<=t?r:`${r.slice(0,t)}...`}function _(e,t,r,n={}){let s={ts:di(),level:e,module:t,msg:r,...d(n)?it(n):{}};console.error(JSON.stringify(s))}var at="application/x-orcha-channel-events-v2+ndjson";function D(e,t){return Object.assign(new Error(t||(["run_timeout","RUNTIME_NODE_TIMEOUT"].includes(e)?"OpenClaw \u539F\u751F IM \u6267\u884C\u8D85\u65F6\uFF0C\u4EFB\u52A1\u5DF2\u7ED3\u675F\uFF0C\u8BF7\u91CD\u8BD5\u3002":e==="OPENCLAW_CHANNEL_PROTOCOL_MISMATCH"?"OpenClaw \u63D2\u4EF6\u4E0E Bridge \u7684\u539F\u751F IM \u534F\u8BAE\u4E0D\u517C\u5BB9\uFF0C\u8BF7\u914D\u5957\u5347\u7EA7\u3002":`OpenClaw \u539F\u751F IM \u6267\u884C\u5931\u8D25\uFF08${e}\uFF09`)),{code:e})}function tn(e,t){let r=e.cause?.code||e.code;return t?.reason?.name==="TimeoutError"||e.name==="TimeoutError"||["UND_ERR_HEADERS_TIMEOUT","UND_ERR_BODY_TIMEOUT","UND_ERR_CONNECT_TIMEOUT","ETIMEDOUT"].includes(r)?Object.assign(D("RUNTIME_NODE_TIMEOUT","OpenClaw \u8FDE\u63A5\u6216\u7B49\u5F85\u54CD\u5E94\u8D85\u65F6\uFF0C\u4EFB\u52A1\u5DF2\u7ED3\u675F\uFF0C\u8BF7\u91CD\u8BD5\u3002"),{detail:{causeCode:r||"REQUEST_TIMEOUT"}}):e}async function en(e,t){if(e.headers.get("content-type")!==at)throw await e.body?.cancel(),D("OPENCLAW_CHANNEL_PROTOCOL_MISMATCH");let r=Buffer.alloc(0);for await(let n of e.body){r=Buffer.concat([r,n]);let s;for(;(s=r.indexOf(10))>=0;){if(s>2097152)throw D("OPENCLAW_CHANNEL_FRAME_TOO_LARGE");let i=r.subarray(0,s).toString("utf8");r=r.subarray(s+1);let o;try{o=JSON.parse(i)}catch{throw D("OPENCLAW_CHANNEL_INVALID_FRAME")}if(o.type!=="heartbeat")if(o.type==="update"&&o.payload?.update&&o.payload?._meta?.channelUpdateId)await t(o.payload);else{if(o.type==="result"&&o.result?.stopReason)return o.result;throw o.type==="error"&&typeof o.code=="string"?D(o.code):D("OPENCLAW_CHANNEL_INVALID_FRAME")}}if(r.length>2097152)throw D("OPENCLAW_CHANNEL_FRAME_TOO_LARGE")}throw D("OPENCLAW_CHANNEL_STREAM_INTERRUPTED","OpenClaw \u8FC7\u7A0B\u8FDE\u63A5\u4E2D\u65AD\uFF0C\u672A\u6536\u5230\u4EFB\u52A1\u7EC8\u6001\uFF0C\u8BF7\u68C0\u67E5\u8282\u70B9\u8FDE\u63A5\u540E\u91CD\u8BD5\u3002")}import{createServer as hi}from"node:http";import{randomBytes as mi}from"node:crypto";var jt={controlTools:["find_capabilities_and_skills","describe_capability","inspect_result","execute_capability"],residentTools:["search_orcha_docs","knowledge_search"]};var gi=Object.freeze([...jt.controlTools,...jt.residentTools]),_i=new Set(gi),yi=8*1024*1024;function qt(e,t){if(!Array.isArray(e)||e.length!==1)throw new Error("one task-scoped Orcha MCP server is required");let r=e[0],n=new URL(r.url);if(r.name!=="orcha"||r.type!=="http"||!["http:","https:"].includes(n.protocol)||n.username||n.password||n.hash||t&&n.href!==new URL(t).href)throw new Error("Orcha MCP server does not match the trusted binding");let s=Object.fromEntries((r.headers||[]).map(({name:i,value:o})=>[i.toLowerCase(),o]));if(!String(s.authorization||"").startsWith("Bearer "))throw new Error("Orcha MCP task credentials are missing");return{url:n.href,headers:{...s,"content-type":"application/json",accept:"application/json"}}}async function nn(e){let t=0,r=[];for await(let n of e){if(t+=n.length,t>yi)throw new Error("MCP payload exceeds the size limit");r.push(Buffer.from(n))}return JSON.parse(Buffer.concat(r).toString("utf8"))}async function sn(e,t,r){let n=await fetch(e.url,{method:"POST",headers:e.headers,body:JSON.stringify(t),redirect:"error",signal:AbortSignal.any([AbortSignal.timeout(36e5),...r?[r]:[]])});if(!n.ok)throw new Error(`Orcha MCP request failed (${n.status})`);if(n.status===202||n.status===204)return null;let s=await nn(n.body);if(!s||s.jsonrpc!=="2.0"||s.id!==t.id)throw new Error("Orcha MCP response identity mismatch");return s}async function rn(e,t){let r=await sn(e,{jsonrpc:"2.0",id:"orcha-bind-tools",method:"tools/list"},t),n=r?.result?.tools;if(r?.error){let s=Object.entries(e.headers).filter(([a])=>tt(a)).flatMap(([,a])=>[a,String(a).replace(/^Bearer\s+/i,"")]),i=typeof r.error.message=="string"?ot(r.error.message,s).slice(0,512):"",o=Number.isInteger(r.error.code)?` (${r.error.code})`:"";throw new Error(`Orcha MCP tool discovery failed${o}${i?`: ${i}`:""}`)}return Ti(n)}function Ti(e){if(!Array.isArray(e)||e.some(t=>!t||!_i.has(t.name)||t.inputSchema?.type!=="object"||typeof t.description!="string")||new Set(e.map(t=>t.name)).size!==e.length||e.length&&jt.controlTools.some(t=>!e.some(r=>r.name===t)))throw new Error("Orcha MCP returned an unsupported or invalid authorized tool catalog");return e}function wi(e,t){let r=s=>Array.isArray(s)?s.map(r):s&&typeof s=="object"?Object.fromEntries(Object.keys(s).sort().map(i=>[i,r(s[i])])):s,n=s=>s.map(({name:i,inputSchema:o})=>({name:i,inputSchema:o})).sort((i,o)=>i.name.localeCompare(o.name));return JSON.stringify(r(n(e)))===JSON.stringify(r(n(t)))}async function on(e,t=[]){let r=qt(e),n=new AbortController,s=await rn(r,n.signal);if(t.some(a=>s.some(c=>c.name===a.name)))throw new Error("Local and remote MCP tools conflict");let i=mi(32).toString("hex"),o=hi(async(a,c)=>{if(a.url!=="/mcp"||a.headers.authorization!==`Bearer ${i}`){c.writeHead(403).end();return}if(a.method!=="POST"){c.writeHead(405).end();return}try{let l=await nn(a);if(!l||l.jsonrpc!=="2.0"||typeof l.method!="string")throw new Error("Invalid MCP request");let p=l.method==="tools/call"&&t.find(f=>f.name===l.params?.name);if(l.method==="tools/call"&&!p&&!s.some(f=>f.name===l.params?.name))throw new Error("Tool is not authorized in this task binding");let h;if(p)try{h={jsonrpc:"2.0",id:l.id,result:await p.call(l.params.arguments,{upstream:r,signal:n.signal})}}catch(f){h={jsonrpc:"2.0",id:l.id,result:{isError:!0,content:[{type:"text",text:ot(String(f.message),[r.headers.authorization,i])}]}}}else h=await sn(r,l,n.signal),l.method==="tools/list"&&h?.result?.tools&&h.result.tools.push(...t.map(({call:f,...m})=>m));c.writeHead(h===null?202:200,{"content-type":"application/json"}),c.end(h===null?"":JSON.stringify(h))}catch{c.writeHead(502,{"content-type":"application/json"}).end(JSON.stringify({error:"The task-scoped Orcha MCP connection failed"}))}});return await new Promise((a,c)=>{o.once("error",c),o.listen(0,"127.0.0.1",a)}),{url:`http://127.0.0.1:${o.address().port}/mcp`,token:i,async refresh(a){let c=qt(a,r.url);if(!wi(s,await rn(c,n.signal)))throw new Error("The frozen MCP tool catalog changed; start a new task");r=c},async close(){n.abort(),o.closeAllConnections(),await new Promise(a=>o.close(a))}}}var et=class{constructor(t,r){this.target=t,this.identity=r,this.bound=!1}async request(t,r,n=!1,s="mcp-bindings",i=3e4,o=null){let a=u(this.target.mcpBridgeUrl),c=u(this.target.mcpBridgeTokenEnv),l=this.target.env?.[c]||process.env[c];if(!a||!c||!l)throw Object.assign(new Error("OpenClaw requires the Orcha tool plugin, mcpBridgeUrl and mcpBridgeTokenEnv"),{code:"OPENCLAW_MCP_NOT_CONFIGURED"});let p=new URL(a);if(!["http:","https:"].includes(p.protocol)||p.username||p.password||p.pathname!=="/plugins/orcha-runtime/mcp-bindings"||p.search||p.hash)throw new Error("OpenClaw MCP binding URL must be the trusted Gateway plugin route");if(!["mcp-bindings","deliveries","background"].includes(s))throw new Error("Unsupported Orcha plugin route");p.pathname=`/plugins/orcha-runtime/${s}`;let h=AbortSignal.timeout(i);try{let f=await fetch(p,{method:t,redirect:"error",signal:h,headers:{authorization:`Bearer ${l}`,"content-type":"application/json",...o?{accept:at}:{},...n?{"if-match":this.identity.runId}:{}},...r!==void 0?{body:JSON.stringify(r)}:{}});if(t==="GET"&&s==="deliveries"&&[404,405].includes(f.status))throw await f.body?.cancel(),D("OPENCLAW_CHANNEL_PROTOCOL_MISMATCH");if(f.ok&&o)return await en(f,o);let m=await f.json();if(!f.ok)throw D(m.error||"OPENCLAW_MCP_BINDING_FAILED");return m}catch(f){throw tn(f,h)}}async bind(t,r=!1){qt(t),await this.request("PUT",{...this.identity,mcpServer:t[0]},r),this.bound=!0}async close(){this.bound&&(await this.request("DELETE",{runId:this.identity.runId,sessionKey:this.identity.sessionKey}),this.bound=!1)}};var Ii=Oi(Ei),Ci=12e4;async function un(e,t){let r=new Map,n=[];for(let s of Object.values(e)){if(s.type!=="openclaw")continue;if(s.mcpBridgeUrl&&(n.push(s),!["localhost","127.0.0.1","[::1]"].includes(new URL(s.mcpBridgeUrl).hostname))){process.stderr.write(`\u8FDC\u7A0B OpenClaw Gateway \u7684\u914D\u5957\u63D2\u4EF6\u9700\u5728\u6240\u5728\u4E3B\u673A\u66F4\u65B0\uFF1Breload \u5C06\u68C0\u67E5\u5176\u534F\u8BAE\u3002
3
+ `);continue}let i={...process.env,...s.env},o=u(s.command)||"openclaw",a=o.includes("/")?o:await Re(o,i);if(!a)throw new Error("\u627E\u4E0D\u5230\u5DF2\u63A5\u5165\u7684 OpenClaw\uFF0C\u8BF7\u68C0\u67E5\u672C\u673A\u5B89\u88C5\u540E\u91CD\u8BD5 reload");let c=await Ri(a);await an(c,Si.X_OK);let l=JSON.stringify([c,Object.entries(i).sort(([p],[h])=>p.localeCompare(h))]);r.has(l)||r.set(l,{command:c,env:i})}if(r.size)try{let s=JSON.parse(await cn(be(t,"openclaw.plugin.json"),"utf8")),i=JSON.parse(await cn(be(t,"package.json"),"utf8"));if(await an(be(t,"index.js")),s.id!=="orcha-runtime"||i.version!==K)throw new Error("\u63D2\u4EF6\u6807\u8BC6\u6216\u7248\u672C\u4E0D\u5339\u914D")}catch(s){throw new Error("\u914D\u5957 OpenClaw \u63D2\u4EF6\u7F3A\u5931\u3001\u635F\u574F\u6216\u7248\u672C\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u91CD\u65B0\u5B89\u88C5 Bridge\uFF1B\u6E90\u7801\u8FD0\u884C\u8BF7\u5148 npm run build",{cause:s})}return async()=>{for(let s of r.values()){process.stderr.write(`\u6B63\u5728\u5B89\u88C5\u914D\u5957 OpenClaw \u63D2\u4EF6\u5E76\u91CD\u542F Gateway\u2026
4
+ `),await Ne(s,["plugins","install",t,"--force"]),await Ne(s,["gateway","restart"]);let i=await Ne(s,["health","--json"]);if(JSON.parse(i).ok!==!0)throw new Error("OpenClaw Gateway \u5065\u5EB7\u68C0\u67E5\u5931\u8D25\uFF0CBridge \u672A\u542F\u52A8\uFF0C\u8BF7\u4FEE\u590D\u540E\u91CD\u8BD5 reload");process.stderr.write(`OpenClaw \u914D\u5957\u63D2\u4EF6\u5DF2\u66F4\u65B0\uFF0CGateway \u5065\u5EB7\u68C0\u67E5\u901A\u8FC7\u3002
5
+ `)}for(let s of n)if((await new et(s,{}).request("GET",void 0,!1,"deliveries")).streamType!==at)throw D("OPENCLAW_CHANNEL_PROTOCOL_MISMATCH")}}async function Ne(e,t){try{let{stdout:r}=await Ii(e.command,t,{env:e.env,timeout:Ci,killSignal:"SIGKILL",maxBuffer:1048576,windowsHide:!0});return r}catch(r){let n=Object.entries(e.env).filter(([i])=>tt(i)).map(([,i])=>i),s=ot(r.stderr||r.message,n).trim();throw new Error(`OpenClaw ${t.slice(0,2).join(" ")} \u5931\u8D25\uFF0CBridge \u672A\u542F\u52A8\uFF0C\u8BF7\u4FEE\u590D\u540E\u91CD\u8BD5 reload\uFF1A${s}`)}}import{createHash as lc,randomUUID as de}from"node:crypto";function mt(e){return Array.isArray(e)?e.map(t=>d(t)?t.type==="text"?u(t.text):t.type==="file"?u(t.uri):t.type==="image"?u(t.uri):"":"").filter(Boolean).join(`
6
+ `):""}var Gt=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,r){let n=mt(t.prompt);return r({sessionId:t.sessionId,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:n?`Echo runtime received: ${n}`:"Echo runtime received an empty prompt."}}}),{stopReason:"end_turn"}}async sessionCancel(){return{ok:!0}}};import{spawn as xi}from"node:child_process";var bt="2.0",Me=3e4,Ai=4e3;function Kt(e,t){let r=Object.entries(d(t)?t:{}).filter(([n])=>tt(n)).map(([,n])=>n);return ot(e,r)}function bi(e){return{code:Number.isInteger(e?.code)?e.code:-32e3,message:u(e?.message)||String(e),data:d(e?.data)?e.data:void 0}}function Ni(e){if(!d(e))return new Error(String(e||"runtime error"));let t=u(e.message)||"runtime error",r="data"in e?Zr(e.data,4e3):"",n=new Error(r?`${t}; data=${r}`:t);return n.rpcCode=e.code,n.data=e.data,n}function Mi(e){return d(e)&&"id"in e&&!("method"in e)}function Ui(e){return d(e)&&typeof e.method=="string"&&"id"in e}function Pi(e){return d(e)&&typeof e.method=="string"&&!("id"in e)}var zt=class{constructor({command:t,args:r=[],cwd:n,env:s,label:i,framing:o="line",detached:a=!0}){this.command=t,this.args=Array.isArray(r)?r.map(String):[],this.cwd=n||process.cwd(),this.env=d(s)?{...s}:{...process.env},this.label=i||t,this.framing=o==="content-length"?"content-length":"line",this.detached=a!==!1,this.child=null,this.exited=!1,this.exitCode=null,this.exitSignal=null,this.stopPromise=null,this.stderrTail="",this.spawnError=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:r={},initializeTimeoutMs:n=Me}={}){if(!(this.child&&!this.exited)&&(this.exited=!1,this.exitCode=null,this.exitSignal=null,this.stderrTail="",this.spawnError=null,this.child=xi(this.command,this.args,{cwd:this.cwd,env:this.env,stdio:["pipe","pipe","pipe"],detached:this.detached}),this.child.stdout.on("data",s=>this.onStdout(s)),this.child.stderr.setEncoding("utf8"),this.child.stderr.on("data",s=>{this.stderrTail=`${this.stderrTail}${s}`.slice(-Ai);let i=Kt(s.trimEnd(),this.env);i&&_("debug","runtime.stderr","runtime stderr",{target:this.label,text:i})}),this.child.on("exit",(s,i)=>this.handleExit(s,i)),this.child.on("error",s=>{this.spawnError=s,this.rejectAll(s)}),t)){let s=Math.max(1,R(n,Me));try{await this.call("initialize",{protocolVersion:1,clientCapabilities:{},...r},s)}catch(i){let o=this.startupFailureDetail(),a=Kt(i?.message||i,this.env);_("warn","runtime.initialize","runtime initialize failed",{target:this.label,timeoutMs:s,cause:a,...o}),await this.stop("initialize failed",{termTimeoutMs:1e3,killTimeoutMs:1e3});let c=o.stderr?`; stderr: ${o.stderr}`:`; command=${o.command}; cwd=${o.cwd}`;throw Object.assign(new Error(`runtime initialize failed: ${a}${c}`,{cause:i}),{code:"RUNTIME_INITIALIZE_FAILED",detail:o})}}}startupFailureDetail(){return{command:this.command,cwd:this.cwd,exited:this.exited,exitCode:this.exitCode,exitSignal:this.exitSignal,...this.spawnError?{spawnError:Kt(this.spawnError.message,this.env)}:{},...this.stderrTail.trim()?{stderr:Kt(this.stderrTail.trim(),this.env)}:{}}}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 r=this.lineBuffer.split(/\r?\n/);this.lineBuffer=r.pop()||"";for(let n of r){let s=n.trim();s&&this.dispatchRaw(s)}}onContentLengthData(t){for(this.headerBuffer=Buffer.concat([this.headerBuffer,t]);this.headerBuffer.length>0;){let r=this.headerBuffer.indexOf(`\r
7
7
  \r
8
- `);if(r<0)return;let s=this.headerBuffer.subarray(0,r).toString("utf8").match(/content-length:\s*(\d+)/i);if(!s){_("warn","runtime.protocol","missing Content-Length header",{target:this.label}),this.headerBuffer=Buffer.alloc(0);return}let i=Number.parseInt(s[1],10),o=r+4,a=o+i;if(this.headerBuffer.length<a)return;let c=this.headerBuffer.subarray(o,a).toString("utf8");this.headerBuffer=this.headerBuffer.subarray(a),this.dispatchRaw(c)}}dispatchRaw(t){let r;try{r=JSON.parse(t)}catch(n){_("warn","runtime.protocol","invalid JSON frame",{target:this.label,error:String(n)});return}this.dispatch(r)}dispatch(t){if(Mi(t)){this.resolveResponse(t);return}if(Ui(t)){this.handleRequest(t);return}Pi(t)&&this.handleNotification(t)}resolveResponse(t){let r=String(t.id),n=this.pending.get(r);n&&(clearTimeout(n.timer),this.pending.delete(r),t.error?(_("warn","runtime.protocol","runtime rpc error",{target:this.label,method:n.method,requestId:r,error:t.error}),n.reject(bi(t.error))):n.resolve(t.result))}async handleRequest(t){let r=this.requestHandlers.get(t.method);if(!r){this.writeFrame({jsonrpc:At,id:t.id,error:{code:-32601,message:`method not found: ${t.method}`}});return}try{let n=await r(d(t.params)?t.params:{},t);this.writeFrame({jsonrpc:At,id:t.id,result:n??{}})}catch(n){this.writeFrame({jsonrpc:At,id:t.id,error:Ni(n)})}}handleNotification(t){let r=this.notificationHandlers.get(t.method);if(r)for(let n of r)n(d(t.params)?t.params:{},t)}call(t,r={},n=Me){if(!this.child||!this.child.stdin||this.exited)return Promise.reject(new Error("runtime process is not running"));let s=`${t}_${++this.seq}`,i={jsonrpc:At,id:s,method:t,params:r};return new Promise((o,a)=>{let c=setTimeout(()=>{this.pending.delete(s),a(new Error(`${t} timed out after ${n}ms`))},n);this.pending.set(s,{resolve:o,reject:a,timer:c,method:t}),this.writeFrame(i,l=>{l&&(clearTimeout(c),this.pending.delete(s),a(l))})})}notify(t,r={}){this.writeFrame({jsonrpc:At,method:t,params:r})}writeFrame(t,r){if(!this.child?.stdin||this.exited){r?.(new Error("runtime process is not running"));return}let n=JSON.stringify(t),s=this.framing==="content-length"?`Content-Length: ${Buffer.byteLength(n,"utf8")}\r
8
+ `);if(r<0)return;let s=this.headerBuffer.subarray(0,r).toString("utf8").match(/content-length:\s*(\d+)/i);if(!s){_("warn","runtime.protocol","missing Content-Length header",{target:this.label}),this.headerBuffer=Buffer.alloc(0);return}let i=Number.parseInt(s[1],10),o=r+4,a=o+i;if(this.headerBuffer.length<a)return;let c=this.headerBuffer.subarray(o,a).toString("utf8");this.headerBuffer=this.headerBuffer.subarray(a),this.dispatchRaw(c)}}dispatchRaw(t){let r;try{r=JSON.parse(t)}catch(n){_("warn","runtime.protocol","invalid JSON frame",{target:this.label,error:String(n)});return}this.dispatch(r)}dispatch(t){if(Mi(t)){this.resolveResponse(t);return}if(Ui(t)){this.handleRequest(t);return}Pi(t)&&this.handleNotification(t)}resolveResponse(t){let r=String(t.id),n=this.pending.get(r);n&&(clearTimeout(n.timer),this.pending.delete(r),t.error?(_("warn","runtime.protocol","runtime rpc error",{target:this.label,method:n.method,requestId:r,error:t.error}),n.reject(Ni(t.error))):n.resolve(t.result))}async handleRequest(t){let r=this.requestHandlers.get(t.method);if(!r){this.writeFrame({jsonrpc:bt,id:t.id,error:{code:-32601,message:`method not found: ${t.method}`}});return}try{let n=await r(d(t.params)?t.params:{},t);this.writeFrame({jsonrpc:bt,id:t.id,result:n??{}})}catch(n){this.writeFrame({jsonrpc:bt,id:t.id,error:bi(n)})}}handleNotification(t){let r=this.notificationHandlers.get(t.method);if(r)for(let n of r)n(d(t.params)?t.params:{},t)}call(t,r={},n=Me){if(!this.child||!this.child.stdin||this.exited)return Promise.reject(new Error("runtime process is not running"));let s=`${t}_${++this.seq}`,i={jsonrpc:bt,id:s,method:t,params:r};return new Promise((o,a)=>{let c=setTimeout(()=>{this.pending.delete(s),a(new Error(`${t} timed out after ${n}ms`))},n);this.pending.set(s,{resolve:o,reject:a,timer:c,method:t}),this.writeFrame(i,l=>{l&&(clearTimeout(c),this.pending.delete(s),a(l))})})}notify(t,r={}){this.writeFrame({jsonrpc:bt,method:t,params:r})}writeFrame(t,r){if(!this.child?.stdin||this.exited){r?.(new Error("runtime process is not running"));return}let n=JSON.stringify(t),s=this.framing==="content-length"?`Content-Length: ${Buffer.byteLength(n,"utf8")}\r
9
9
  \r
10
10
  ${n}`:`${n}
11
- `;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.exited=!0,this.exitCode=t,this.exitSignal=r,this.rejectAll(new Error(`runtime exited before response (${t}/${r})`));for(let n of this.exitHandlers)n(t,r)}async waitForExit(t=5e3){return!this.child||this.exited?!0:await new Promise(r=>{let n=setTimeout(()=>{s(),r(!1)},t);n.unref?.();let s=()=>{clearTimeout(n),this.exitHandlers.delete(i)},i=()=>{s(),r(!0)};this.exitHandlers.add(i),this.exited&&i()})}signal(t){if(!this.child||this.exited)return!1;let r=this.child.pid;if(!r)return!1;try{return this.detached&&process.platform!=="win32"?process.kill(-r,t):this.child.kill(t),!0}catch(n){if(n?.code==="ESRCH")return this.exited=!0,!1;try{return this.child.kill(t),!0}catch(s){return s?.code!=="ESRCH"&&_("warn","runtime","runtime signal failed",{target:this.label,pid:r,signal:t,error:String(s)}),!1}}}async stop(t="stop",{termTimeoutMs:r=5e3,killTimeoutMs:n=2e3}={}){if(!(!this.child||this.exited)){if(this.stopPromise)return await this.stopPromise;this.stopPromise=(async()=>{if(!this.child||this.exited)return;let s=this.child.pid;_("info","runtime","stopping runtime",{target:this.label,reason:t,pid:s}),this.rejectAll(new Error(`runtime stopped: ${t}`)),this.signal("SIGTERM"),!await this.waitForExit(r)&&this.child&&!this.exited&&(_("warn","runtime","runtime did not exit after SIGTERM; force killing",{target:this.label,reason:t,pid:s}),this.signal("SIGKILL"),await this.waitForExit(n))})();try{await this.stopPromise}finally{this.stopPromise=null}}}};import{randomUUID as fn}from"node:crypto";import{existsSync as Li,readFileSync as ki,realpathSync as ln,statSync as vi}from"node:fs";import{basename as hn,extname as mn,isAbsolute as Nt,join as Di,relative as gn,resolve as dn}from"node:path";var $i=25*1024*1024;function _n(e,t=""){let r=u(t);if(r)return r;let n=mn(u(e)).toLowerCase();return n===".jpg"||n===".jpeg"?"image/jpeg":n===".webp"?"image/webp":n===".gif"?"image/gif":"image/png"}function yn(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 Vt(e){if(Array.isArray(e))return e.map(u).filter(Boolean);let t=u(e);return t?[t]:[]}function Hi(e,t){let r=gn(t,e);return r===""||!!r&&!r.startsWith("..")&&!Nt(r)}function Fi(e,t){let r=u(e);if(!r||!Li(r))return"";try{let n=ln(r);for(let s of t)try{let i=ln(s);if(Hi(n,i))return n}catch{}}catch{return""}return""}function Bi(e,t){let r=u(e);if(!r||!Nt(r))return r;for(let n of Array.isArray(t)?t:[]){if(!d(n))continue;let s=u(n.runtimeRoot),i=u(n.hostRoot);if(!s||!i||!Nt(s)||!Nt(i))continue;let o=gn(dn(s),dn(r));if(o===""||!o.startsWith("..")&&!Nt(o))return o?Di(i,o):i}return r}function Ue(e,t,r={}){let n=u(e);return!n||n.startsWith("data:")||/^https?:\/\//i.test(n)?n:ji(n,t,r)}function ji(e,t,r={}){let n=[...Vt(r.trustedFileRoots),...Vt(r.trustedFileRoot),...Vt(r.artifactRoots),...Vt(r.artifactRoot)],s=Fi(Bi(e,r.pathMappings),n);if(!s)return"";try{let i=vi(s);return!i.isFile()||i.size<=0||i.size>$i?"":`data:${t};base64,${ki(s).toString("base64")}`}catch{return""}}function L(...e){for(let t of e){let r=u(t);if(r)return r}return""}function qi(e,t,r,n){let s=r.toLowerCase();if(s==="image"||s==="picture")return!0;let i=L(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),o=mn(i.split("?",1)[0].split("#",1)[0]).toLowerCase();return[".png",".jpg",".jpeg",".webp",".gif"].includes(o)}function Le(e,t={}){let{source:r="runtime_image_generation_event"}=t;if(!d(e))return null;let n=d(e.payload)?e.payload:{},s=u(e.type),i=u(n.type);if(!(s==="event_msg"&&i==="image_generation_end"||s==="response_item"&&i==="image_generation_call"))return null;let o=L(n.call_id,n.id),a=L(n.saved_path,n.savedPath),c=L(n.revised_prompt,n.revisedPrompt),l=_n(a,n.mimeType||n.mime_type),p=yn(n.result,l)||Ue(a,l,t);if(!p)return null;let h=p.startsWith("data:")?p:"",f=a?hn(a):`${o||fn()}.png`;return{artifactType:"image",type:"image",fieldKey:"image",title:f||"Generated image",summary:c||"Generated image",content:{prompt:c||void 0,dataUrl:h||void 0,imageUrl:p,previewUrl:p,fileUrl:p,mimeType:l},dataUrl:h||void 0,previewUrl:p,fileUrl:p,metadata:{source:r,eventType:i,callId:o||void 0,savedPath:a||void 0,filename:f,mimeType:l,revisedPrompt:c||void 0}}}function Gi(e){let t=d(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];d(s)&&r.push(s)}return r}function Ki(e,t={}){let{source:r="runtime_artifact"}=t,n=d(e)?e:{};if(!Object.keys(n).length)return null;let s=d(n.content)?{...n.content}:{},i=d(n.metadata)?{...n.metadata}:{},o=L(n.saved_path,n.savedPath,s.saved_path,s.savedPath,i.savedPath),a=L(n.mimeType,n.mime_type,s.mimeType,s.mime_type,i.mimeType),c=L(n.artifactType,n.artifact_type,n.type,n.kind,s.type,o?"image":"file"),l=qi(n,s,c,o),p=l?_n(o,a):a;if(l){let C=L(n.dataUrl,s.dataUrl),w=C.startsWith("data:")?C:"",x=L(n.imageUrl,n.previewUrl,n.fileUrl,n.downloadUrl,n.url,n.uri,s.imageUrl,s.previewUrl,s.fileUrl,s.downloadUrl,s.url,s.uri),g=yn(n.result??s.result,p)||w||Ue(o,p,t)||Ue(x,p,t);g&&(g.startsWith("data:")&&(s.dataUrl||=g),s.imageUrl||=g,s.previewUrl||=g,s.fileUrl||=g,p&&(s.mimeType||=p))}for(let[C,w]of[["prompt","prompt"],["previewUrl","previewUrl"],["fileUrl","fileUrl"],["downloadUrl","downloadUrl"],["imageUrl","imageUrl"],["dataUrl","dataUrl"],["url","url"],["uri","uri"],["mimeType","mimeType"],["mime_type","mimeType"]]){let x=n[C];x!=null&&x!==""&&!(w in s)&&(s[w]=x)}let h=L(n.fileUrl,n.downloadUrl,n.imageUrl,n.dataUrl,n.url,n.uri,s.fileUrl,s.downloadUrl,s.imageUrl,s.dataUrl,s.url,s.uri),f=L(n.previewUrl,n.imageUrl,n.dataUrl,n.url,n.fileUrl,n.uri,s.previewUrl,s.imageUrl,s.dataUrl,s.url,s.fileUrl,s.uri),m=L(n.dataUrl,s.dataUrl,h.startsWith("data:")?h:"",f.startsWith("data:")?f:""),y=L(n.filename,i.filename,o?hn(o):""),T=L(n.fieldKey,n.field_key,s.fieldKey,i.fieldKey,l?"image":"artifact");return{...n,artifactType:c,type:n.type||c,fieldKey:T,title:L(n.title,y,"Runtime artifact"),summary:L(n.summary,s.prompt,n.title,y,"Runtime artifact"),content:s,dataUrl:m||void 0,fileUrl:h||void 0,previewUrl:f||void 0,metadata:{...i,source:L(i.source,r),savedPath:o||i.savedPath,filename:y||i.filename,mimeType:p||i.mimeType}}}function Jt(e,t){if(!t||!e)return;let r=d(t.metadata)?t.metadata:{},n=L(r.savedPath,r.callId,t.previewUrl,t.fileUrl)||fn(),s=e.get(n);if(!s){e.set(n,t);return}s.content={...d(s.content)?s.content:{},...d(t.content)?t.content:{}},s.metadata={...d(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 Pe(e,t,r={}){for(let n of Gi(e))Jt(t,Ki(n,r))}function ke(e){if(!d(e)||!d(e.payload))return d(e)?e:{value:e};let t=u(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 pn(e,t,r){if(!d(e))return e;let n=d(e.event)?e.event:null;return n?(Jt(t,Le(n,r)),{...e,event:ke(n)}):e}function Tn(e,t,r={}){if(!d(e))return e;Pe(e,t,r);let n=pn(e,t,r),s=d(n.update)?pn(n.update,t,r):null;return s&&s!==n.update&&(n={...n,update:s}),n}function wn(e,t,r={}){let n=d(e)?{...e}:{};Pe(n,t,r),Pe(d(n.output)?n.output:{},t,r);let s=[...t?.values?.()||[]];return s.length&&(n._artifacts=s),delete n.artifacts,n}function En(e,t){let r=R(e,t);return r>0?r:t}var mt=class{constructor(t,r,n={},s={}){this.agent=t,this.target=r,this.callbacks=n,this.options=s,this.proc=null,this.launch=null,this.launchCleanup=null,this.permissionHandlers=new Map}async ensureStarted(){if(this.proc)return;let t=u(this.target.command);if(!t)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);let r={command:t,args:P(this.target.args),cwd:J(this.target,this.agent.workspace),environment:d(this.target.env)?this.target.env:{}},n=this.options.prepareLaunch?await this.options.prepareLaunch(r):{...r,environment:{...process.env,...r.environment},cleanup:async()=>{}};this.launch=n,this.launchCleanup=n.cleanup,this.proc=new zt({command:n.command,args:n.args,cwd:n.cwd,env:n.environment,label:`${this.agent.agentId}:${this.agent.targetCode}`,framing:u(this.target.framing||"line")}),this.proc.onRequest("session/request_permission",s=>this.handlePermissionRequest(s)),this.proc.onRequest("session/requestPermission",s=>this.handlePermissionRequest(s));try{await this.proc.start({initialize:this.target.initialize!==!1,initializeTimeoutMs:En(this.target.initializeTimeoutMs,En(this.options.initializeTimeoutMs,3e4)),initializeParams:{clientInfo:{name:"orcha-runtime-bridge",version:K},...d(this.target.initializeParams)?this.target.initializeParams:{}}})}catch(s){throw await this.proc?.stop("runtime startup failed"),this.proc=null,await this.cleanupLaunch(),s}}async sessionNew(t={}){return await this.ensureStarted(),this.proc.call("session/new",this.sessionNewParams(t))}sessionNewParams(t={}){let r=Array.isArray(t.mcpServers)?t.mcpServers:Array.isArray(this.target.mcpServers)?this.target.mcpServers:[];return{...t,mcpServers:r}}async sessionPrompt(t,r){await this.ensureStarted();let n=u(t.sessionId),s=new Map,i=this.artifactOptions(),o=this.proc.onNotification("session/update",c=>{let l=u(c.sessionId);(!l||l===n)&&r(Tn(c,s,i))}),a=async c=>this.callbacks.onPermissionRequest?.({agent:this.agent,runtimeSessionId:n,request:c,emitUpdate:r})||{outcome:"denied",reason:"permission handler is not configured"};n&&this.permissionHandlers.set(n,a),this.permissionHandlers.set("*",a);try{let c=await this.proc.call("session/prompt",t,this.options.sessionPromptTimeoutMs);return wn(c,s,i)}finally{o(),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=u(t.sessionId),n=this.permissionHandlers.get(r)||this.permissionHandlers.get("*");return n?n(t):{outcome:"denied",reason:"no active Orcha permission handler"}}artifactSource(){return u(this.target.type||"acp")==="openclaw"?"openclaw_image_generation":"acp_runtime_image_generation"}artifactOptions(){let t=d(this.target.env)?this.target.env:{};return{source:this.artifactSource(),trustedFileRoots:[u(this.launch?.artifactDirectory),u(this.launch?.homeDirectory),u(this.target.artifactRoot),u(this.target.artifactDir),u(this.target.runtimeArtifactRoot),u(t.ORCHA_RUNTIME_ARTIFACT_DIR),...P(this.target.trustedArtifactRoots),...P(this.target.trustedFileRoots),...P(this.target.artifactRoots),...P(this.target.artifactFileRoots)].filter(Boolean),pathMappings:Array.isArray(this.launch?.pathMappings)?this.launch.pathMappings:[]}}async stop(t){try{await this.proc?.stop(t)}finally{this.proc=null,await this.cleanupLaunch()}}async cleanupLaunch(){let t=this.launchCleanup;this.launchCleanup=null,this.launch=null,await t?.()}};import{existsSync as Sn,readFileSync as zi}from"node:fs";import{dirname as Vi,resolve as Wt}from"node:path";import{fileURLToPath as Ji}from"node:url";var Wi=/^[A-Za-z_][A-Za-z0-9_]*$/,z=24*60*60*1e3;function Rn(e=process.env,t=process.cwd()){let r=u(e.ORCHA_RUNTIME_ENV_FILE),n=r?Wt(t,r):Wt(t,".env");if(!Sn(n))return r&&_("warn","config","runtime env file not found",{path:n}),{loaded:!1,path:n,keys:[]};let s=[],i=zi(n,"utf8");for(let o of i.split(/\r?\n/)){let a=Qi(o);if(!a)continue;let[c,l]=a;Object.prototype.hasOwnProperty.call(e,c)||(e[c]=l,s.push(c))}return _("info","config","runtime env file loaded",{path:n,keyCount:s.length}),{loaded:!0,path:n,keys:s}}function On(e=process.env){let t=u(e.ORCHA_RUNTIME_MODE||(e.ORCHA_RUNTIME_ORCHA_URL?"node":"server")),r=u(e.ORCHA_RUNTIME_BRIDGE_HOST||"127.0.0.1"),n=!1,s=Vi(Ji(import.meta.url)),i=Wt(s,"sandbox","broker.js"),o=Wt(s,"orcha-runtime-sandbox-broker.js"),a=Sn(i)?i:o,c=u(e.ORCHA_RUNTIME_SANDBOX_BROKER_COMMAND);return{mode:t,host:r,port:R(e.ORCHA_RUNTIME_BRIDGE_PORT,5588),token:e.ORCHA_RUNTIME_BRIDGE_TOKEN||"",orchaUrl:u(e.ORCHA_RUNTIME_ORCHA_URL),nodeToken:e.ORCHA_RUNTIME_NODE_TOKEN||e.ORCHA_RUNTIME_BRIDGE_TOKEN||"",nodeId:u(e.ORCHA_RUNTIME_NODE_ID||e.HOSTNAME||"local-runtime-node"),nodeName:u(e.ORCHA_RUNTIME_NODE_NAME||e.ORCHA_RUNTIME_NODE_ID||e.HOSTNAME||"Local Runtime Node"),reconnectMs:R(e.ORCHA_RUNTIME_RECONNECT_MS,3e3),connectTimeoutMs:R(e.ORCHA_RUNTIME_CONNECT_TIMEOUT_MS||e.ORCHA_RUNTIME_WS_CONNECT_TIMEOUT_MS,1e4),defaultTargetCode:e.ORCHA_RUNTIME_DEFAULT_TARGET||"echo",requestLimitBytes:R(e.ORCHA_RUNTIME_REQUEST_LIMIT_BYTES,1048576),initializeTimeoutMs:R(e.ORCHA_RUNTIME_INITIALIZE_TIMEOUT_MS,3e4),sessionPromptTimeoutMs:R(e.ORCHA_RUNTIME_SESSION_PROMPT_TIMEOUT_MS,z),permissionRequestTimeoutMs:R(e.ORCHA_RUNTIME_PERMISSION_TIMEOUT_MS,3e5),sessionIdleTtlMs:R(e.ORCHA_RUNTIME_SESSION_IDLE_TTL_MS,6e5),sessionCleanupIntervalMs:R(e.ORCHA_RUNTIME_SESSION_CLEANUP_INTERVAL_MS,6e4),maxSessionsPerTarget:R(e.ORCHA_RUNTIME_MAX_SESSIONS_PER_TARGET,8),openClawSessionIdleTtlMs:R(e.ORCHA_RUNTIME_OPENCLAW_SESSION_IDLE_TTL_MS,6e4),openClawMaxSessions:R(e.ORCHA_RUNTIME_OPENCLAW_MAX_SESSIONS,1),heartbeatIntervalMs:R(e.ORCHA_RUNTIME_HEARTBEAT_INTERVAL_MS,15e3),sandboxRequired:n,sandboxBrokerCommand:c||process.execPath,sandboxBrokerArguments:ve(e.ORCHA_RUNTIME_SANDBOX_BROKER_ARGUMENTS,"ORCHA_RUNTIME_SANDBOX_BROKER_ARGUMENTS",c?[]:[a]),sandboxProbeTimeoutMs:R(e.ORCHA_RUNTIME_SANDBOX_PROBE_TIMEOUT_MS,1e4),sandboxTempRoot:u(e.ORCHA_RUNTIME_SANDBOX_TEMP_ROOT),trustedWorkspaceRoots:ve(e.ORCHA_RUNTIME_TRUSTED_WORKSPACE_ROOTS,"ORCHA_RUNTIME_TRUSTED_WORKSPACE_ROOTS"),trustedToolchainRoots:ve(e.ORCHA_RUNTIME_TRUSTED_TOOLCHAIN_ROOTS,"ORCHA_RUNTIME_TRUSTED_TOOLCHAIN_ROOTS"),egressProxyRequired:Yi(e.ORCHA_RUNTIME_EGRESS_PROXY_REQUIRED,t==="node"),egressProxySocket:u(e.ORCHA_RUNTIME_EGRESS_PROXY_SOCKET),egressProxyToken:u(e.ORCHA_RUNTIME_EGRESS_PROXY_TOKEN),egressGrantMaxTtlMs:R(e.ORCHA_RUNTIME_EGRESS_GRANT_MAX_TTL_MS,9e5),targets:Xi(e.ORCHA_RUNTIME_TARGETS_JSON||"")}}function Xi(e){if(!u(e))return{};try{let t=JSON.parse(e);if(d(t))return t}catch(t){_("warn","config","invalid ORCHA_RUNTIME_TARGETS_JSON",{error:String(t)})}return{}}function Yi(e,t){let r=u(e).toLowerCase();if(!r)return t;if(["true","1","yes","on"].includes(r))return!0;if(["false","0","no","off"].includes(r))return!1;throw new Error(`invalid boolean configuration value: ${r}`)}function ve(e,t,r=[]){let n=u(e);if(!n)return[...r];let s;try{s=JSON.parse(n)}catch{throw new Error(`${t} must be a JSON string array`)}if(!Array.isArray(s)||s.some(i=>typeof i!="string"))throw new Error(`${t} must be a JSON string array`);return s.map(i=>i.trim()).filter(Boolean)}function Qi(e){let t=e.trim();if(!t||t.startsWith("#"))return null;let r=t.startsWith("export ")?t.slice(7).trimStart():t,n=r.indexOf("=");if(n<=0)return null;let s=r.slice(0,n).trim();if(!Wi.test(s))return null;let i=Zi(r.slice(n+1).trim());return[s,i]}function Zi(e){if(!e)return"";let t=e[0];if((t==='"'||t==="'")&&e.endsWith(t)){let r=e.slice(1,-1);return t==='"'?to(r):r}return eo(e).trim()}function to(e){return e.replaceAll("\\n",`
12
- `).replaceAll("\\r","\r").replaceAll("\\t"," ").replaceAll('\\"','"').replaceAll("\\\\","\\")}function eo(e){let t=!1,r=!1;for(let n=0;n<e.length;n+=1){let s=e[n],i=e[n-1];if(s==="'"&&!r)t=!t;else if(s==='"'&&!t&&i!=="\\")r=!r;else if(s==="#"&&!t&&!r&&/\s/.test(i||""))return e.slice(0,n)}return e}var Xt=class{constructor(t,r,n,s,i={}){this.agent=t,this.target=r,this.options=i,this.sessionKey=n,this.mcp=null,this.metadata=null,this.finished=!1,this.transport=new tt(r,{runId:i.runId}),this.expiresAt=new Date(Date.now()+Number(i.sandboxPolicy?.maxRuntimeSeconds||i.sessionPromptTimeoutMs/1e3||z/1e3)*1e3).toISOString()}async sessionNew({mcpServers:t,metadata:r}){if(r?.source!=="channel_message"||r.delivery?.dispatchMode!=="bridge")throw new Error("Invalid native Channel dispatch");return this.mcp=t[0],this.metadata=r,{sessionId:this.sessionKey}}async refreshMcpServers(t){this.mcp=t[0],this.promptBody&&await this.transport.request("PATCH",{...this.promptBody,mcpServer:this.mcp,attachOnly:!0},!1,"deliveries")}async sessionPrompt({prompt:t},r){if((await this.transport.request("GET",void 0,!1,"deliveries")).streamType!==it)throw D("OPENCLAW_CHANNEL_PROTOCOL_MISMATCH");this.promptBody={runId:this.options.runId,agentCode:this.target.openclawAgentId||this.metadata.agentCode,delivery:this.metadata.delivery,expiresAt:this.expiresAt,mcpServer:this.mcp,attachOnly:this.options.attachOnly===!0,prompt:t};let s=await this.transport.request("POST",this.promptBody,!1,"deliveries",Number(this.options.sessionPromptTimeoutMs||z),i=>r?.(i));return this.finished=!0,s}async stop(){!this.finished&&this.promptBody&&await this.transport.request("DELETE",{runId:this.options.runId},!1,"deliveries")}};function De(e){let t=d(e.metadata)?e.metadata:{};return u(t.agentCode)}function In(e,t,r){let n=u(r?.openclawAgentId)||De(e);return n?`agent:${n}:${t}`:`orcha-${t}`}var Yt=class extends mt{constructor(t,r,n,s={},i={}){if(i.source==="channel_message")return new Xt(t,r,n,s,i);let o=u(n).replace(/[^A-Za-z0-9._-]+/g,"-")||"default",a=u(r.command)||"openclaw",c=Array.isArray(r.args)?r.args.map(String):[],l=c.length>0?c:["acp","--session",In(t,o,r)];super(t,{...r,command:a,args:l},s,i),this.boundSessionKey=In(t,o,r),this.binding=null}async sessionNew(t={}){if(t.mcpServers?.length){let r=[...this.target.args],n=r.indexOf("--session"),s=r.find(c=>c.startsWith("--session=")),i=s?s.slice(10):n<0?null:r[n+1];if(i&&i!==this.boundSessionKey)throw Object.assign(new Error("OpenClaw --session must match this Orcha task's private session"),{code:"OPENCLAW_SESSION_BINDING_CONFLICT"});i===null&&r.push("--session",this.boundSessionKey),this.target.args=r;let o=u(this.options.runId),a=Number(this.options.sandboxPolicy?.maxRuntimeSeconds||this.options.sessionPromptTimeoutMs/1e3||z/1e3);if(!o||!De(this.agent))throw new Error("OpenClaw MCP requires a trusted task and Agent identity");this.binding=new tt(this.target,{runId:o,sessionKey:this.boundSessionKey,agentCode:u(this.target.openclawAgentId)||De(this.agent),expiresAt:new Date(Date.now()+a*1e3).toISOString()}),await this.binding.bind(t.mcpServers)}try{return await super.sessionNew(t)}catch(r){throw await this.binding?.close(),r}}async refreshMcpServers(t){if(!this.binding)throw Object.assign(new Error("The original OpenClaw task binding is unavailable"),{code:"RUNTIME_OPERATION_NOT_FOUND"});await this.binding.bind(t,!0)}async stop(t){try{await super.stop(t)}finally{await this.binding?.close()}}sessionNewParams(t={}){return{...t,mcpServers:[]}}};import{spawn as Gn}from"node:child_process";import{randomUUID as gt}from"node:crypto";import{existsSync as Kn,mkdirSync as Ro,readdirSync as zn,readFileSync as Vn,realpathSync as Ut,rmSync as Oo,rmdirSync as Io,statSync as Co,unlinkSync as xo}from"node:fs";import{homedir as Ao,tmpdir as Jn}from"node:os";import{basename as Ke,dirname as No,join as j,resolve as Hn}from"node:path";import{createHash as mo,randomUUID as go}from"node:crypto";import{mkdirSync as Ln,readFileSync as _o,renameSync as yo,rmSync as To,writeFileSync as kn}from"node:fs";import{homedir as Fe}from"node:os";import{join as at}from"node:path";import{createHash as Cn}from"node:crypto";import{constants as $e}from"node:fs";import{open as ro,realpath as xn}from"node:fs/promises";import{basename as no,isAbsolute as so,relative as io,resolve as oo}from"node:path";var ao=32*1024*1024,co={name:"send_file",description:"Send one explicitly selected local file to the current OrchaAI conversation. Use this to deliver images, PDFs, documents, spreadsheets or other files to the user; viewing an image or writing a local Markdown link does not send it. path must be in the current workspace, a configured artifact root, or (Codex only) the current thread's generated_images directory. Copy other intended deliverables into the workspace first. Success means the attachment message is saved; do not send it again or embed the local path. Internal previews and intermediate files need not be sent.",inputSchema:{type:"object",additionalProperties:!1,required:["path"],properties:{path:{type:"string",minLength:1,description:"Absolute file path, or a path relative to the current workspace."},message:{type:"string",maxLength:1e4,description:"Optional caption for the attachment message."}}}};function An(e){return{...co,async call(t,{upstream:r,signal:n}){if(!t||typeof t.path!="string"||!t.path.trim()||Object.keys(t).some(g=>!["path","message"].includes(g))||t.message!==void 0&&(typeof t.message!="string"||t.message.length>1e4))throw new Error("send_file requires a file path and an optional caption of at most 10000 characters");let{cwd:s,roots:i}=e();if(!s)throw new Error("The current file delivery workspace is unavailable");let o=await xn(oo(s,t.path)),a=!1;for(let g of i)try{let E=io(await xn(g),o);(!E||E!==".."&&!E.startsWith("../")&&!E.startsWith("..\\")&&!so(E))&&(a=!0)}catch{}if(!a)throw new Error("File is outside the current workspace and authorized artifact roots");let c=await ro(o,$e.O_RDONLY|$e.O_NOFOLLOW|$e.O_NONBLOCK),l;try{let g=await c.stat();if(!g.isFile()||g.size<=0||g.size>ao)throw new Error("Select a non-empty regular file of at most 32 MiB");l=Buffer.alloc(g.size);let E=0;for(;E<l.length;){let{bytesRead:A}=await c.read(l,E,l.length-E,E);if(!A)throw new Error("File changed while preparing delivery; retry after it is saved");E+=A}let b=await c.stat();if(b.size!==g.size||b.mtimeMs!==g.mtimeMs)throw new Error("File changed while preparing delivery; retry after it is saved")}finally{await c.close()}let p=t.message||"",h=no(o),f=Cn("sha256").update(l).digest("hex"),m=Cn("sha256").update(JSON.stringify([o,f,p])).digest("hex"),y=new FormData;y.set("deliveryId",m),y.set("message",p),y.set("file",new Blob([l]),h);let T=new URL(r.url);T.pathname=`${T.pathname.replace(/\/$/,"")}/files`;let C=await fetch(T,{method:"POST",headers:{authorization:r.headers.authorization},body:y,redirect:"error",signal:AbortSignal.any([n,AbortSignal.timeout(12e4)])});if(!C.ok)throw new Error(`File delivery failed (HTTP ${C.status}); no successful receipt was received`);let w=await C.json();if(!w.success)throw new Error(`File delivery failed: ${String(w.message||w.code||"request rejected").slice(0,512)}`);let x=w.data;if(!x?.accepted||typeof x.messageId!="string"||!x.messageId||typeof x.fileId!="string"||!x.fileId)throw new Error("File delivery did not return a saved message and file receipt");return{content:[{type:"text",text:JSON.stringify(x)}],structuredContent:x,isError:!1}}}}var He="permission_prompt",uo=27e4,lo=new Set(["Bash","PowerShell"]),po=new Set(["Edit","Write","MultiEdit","NotebookEdit"]),Nn=2e3,bn=50;function ot(e,t=0){return typeof e=="string"?e.length>Nn?`${e.slice(0,Nn)}\u2026`:e:t>=4&&(Array.isArray(e)||d(e))?"\u2026":Array.isArray(e)?e.slice(0,bn).map(r=>ot(r,t+1)):d(e)?Object.fromEntries(Object.entries(e).slice(0,bn).map(([r,n])=>[r,ot(n,t+1)])):e}function fo(e){let t=String(e.tool_name),r=e.input,n=lo.has(t)?"command":po.has(t)?"file_change":"other",s=r.file_path||r.notebook_path;return{runtime:"claude",kind:n,toolName:t,title:typeof r.description=="string"?r.description:"",...n==="command"&&typeof r.command=="string"?{command:r.command}:{},...n==="file_change"&&typeof s=="string"?{paths:[s]}:{},input:ot(r)}}function Mn(e){return{name:He,description:"Internal OrchaAI approval channel for Claude Code permission prompts. Never call this tool directly.",inputSchema:{type:"object",required:["tool_name","input"],properties:{tool_name:{type:"string"},input:{type:"object"},tool_use_id:{type:"string"}}},async call(t,{signal:r}){if(!t||typeof t.tool_name!="string"||!d(t.input))throw new Error("permission_prompt requires tool_name and input");let n=await e(fo(t),{signal:r,maxTimeoutMs:uo}),s=n?.response?.reason||n?.reason||n?.outcome||"not approved",i=n?.outcome==="approved"?{behavior:"allow",updatedInput:t.input}:{behavior:"deny",message:`OrchaAI did not approve this action (${s}). Do not retry the same action unless the user asks.`};return{content:[{type:"text",text:JSON.stringify(i)}]}}}}var ho=new Set(["threadId","turnId","itemId","approvalId","startedAtMs","environmentId","command","cwd","reason"]);function Un(e,t,r){let n=Object.fromEntries(Object.entries(t).filter(([i,o])=>!ho.has(i)&&o!=null)),s={runtime:"codex",title:typeof t.reason=="string"?t.reason:"",input:ot(n)};if(e==="item/commandExecution/requestApproval")return{...s,kind:"command",toolName:"shell",...typeof t.command=="string"?{command:t.command}:{},...typeof t.cwd=="string"?{cwd:t.cwd}:{}};if(e==="item/fileChange/requestApproval"){let i=Array.isArray(r?.changes)?r.changes.map(o=>o?.path).filter(o=>typeof o=="string"):[];return{...s,kind:"file_change",toolName:"apply_patch",...i.length?{paths:i}:{}}}return{...s,kind:"permission",...typeof t.cwd=="string"?{cwd:t.cwd}:{}}}function Pn(e,t,r){return e==="item/permissions/requestApproval"?{permissions:Object.fromEntries(Object.entries(d(t.permissions)?t.permissions:{}).filter(([,s])=>r&&s!=null)),scope:"turn"}:{decision:r?"accept":"decline"}}var vn=e=>mo("sha256").update(JSON.stringify(e)).digest("hex"),W=(e,t)=>Object.assign(new Error(t),{code:e}),Dn=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Be="ORCHA_TASK_MCP_TOKEN",wo=new Set(["--no-session-persistence","--resume","-r","--continue","-c","--session-id","--fork-session"]);function Eo(e){return typeof e=="string"?e:Array.isArray(e)?e.filter(t=>t?.type==="text").map(t=>t.text).join(`
13
- `):""}var bt=(e,t)=>({sessionUpdate:e,content:{type:"text",text:t}});function So(e,t,{emitThoughts:r,streamText:n}){let s=e?.type;if(s==="result"&&e.is_error!==!0){let c=typeof e.result=="string"?e.result:"",l=t.streamed;return t.text=t.streamed="",c?l?l.trim()===c.trim()?[]:[bt("agent_message_snapshot",c)]:[bt("agent_message_chunk",c)]:[]}if(!["assistant","user","stream_event"].includes(s))return null;let i=[];if(e.parent_tool_use_id)return i;let o=()=>{let c=t.streamed||t.text;t.streamed&&i.push(bt("agent_message_snapshot","")),c&&r&&i.push(bt("agent_thought_chunk",c)),t.text=t.streamed=""},a=c=>{t.streamed=(t.streamed||"")+c,i.push(bt("agent_message_chunk",c))};if(s==="stream_event"){if(!n)return i;t.streaming=!0;let c=e.event,l=c?.content_block?.type;return c?.type==="content_block_start"&&l==="tool_use"?o():c?.type==="content_block_start"&&l==="text"&&t.streamed?a(`
11
+ `;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.exited=!0,this.exitCode=t,this.exitSignal=r,this.rejectAll(new Error(`runtime exited before response (${t}/${r})`));for(let n of this.exitHandlers)n(t,r)}async waitForExit(t=5e3){return!this.child||this.exited?!0:await new Promise(r=>{let n=setTimeout(()=>{s(),r(!1)},t);n.unref?.();let s=()=>{clearTimeout(n),this.exitHandlers.delete(i)},i=()=>{s(),r(!0)};this.exitHandlers.add(i),this.exited&&i()})}signal(t){if(!this.child||this.exited)return!1;let r=this.child.pid;if(!r)return!1;try{return this.detached&&process.platform!=="win32"?process.kill(-r,t):this.child.kill(t),!0}catch(n){if(n?.code==="ESRCH")return this.exited=!0,!1;try{return this.child.kill(t),!0}catch(s){return s?.code!=="ESRCH"&&_("warn","runtime","runtime signal failed",{target:this.label,pid:r,signal:t,error:String(s)}),!1}}}async stop(t="stop",{termTimeoutMs:r=5e3,killTimeoutMs:n=2e3}={}){if(!(!this.child||this.exited)){if(this.stopPromise)return await this.stopPromise;this.stopPromise=(async()=>{if(!this.child||this.exited)return;let s=this.child.pid;_("info","runtime","stopping runtime",{target:this.label,reason:t,pid:s}),this.rejectAll(new Error(`runtime stopped: ${t}`)),this.signal("SIGTERM"),!await this.waitForExit(r)&&this.child&&!this.exited&&(_("warn","runtime","runtime did not exit after SIGTERM; force killing",{target:this.label,reason:t,pid:s}),this.signal("SIGKILL"),await this.waitForExit(n))})();try{await this.stopPromise}finally{this.stopPromise=null}}}};import{randomUUID as fn}from"node:crypto";import{existsSync as Li,readFileSync as ki,realpathSync as ln,statSync as vi}from"node:fs";import{basename as hn,extname as mn,isAbsolute as Nt,join as Di,relative as gn,resolve as dn}from"node:path";var $i=25*1024*1024;function _n(e,t=""){let r=u(t);if(r)return r;let n=mn(u(e)).toLowerCase();return n===".jpg"||n===".jpeg"?"image/jpeg":n===".webp"?"image/webp":n===".gif"?"image/gif":"image/png"}function yn(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 Vt(e){if(Array.isArray(e))return e.map(u).filter(Boolean);let t=u(e);return t?[t]:[]}function Hi(e,t){let r=gn(t,e);return r===""||!!r&&!r.startsWith("..")&&!Nt(r)}function Fi(e,t){let r=u(e);if(!r||!Li(r))return"";try{let n=ln(r);for(let s of t)try{let i=ln(s);if(Hi(n,i))return n}catch{}}catch{return""}return""}function Bi(e,t){let r=u(e);if(!r||!Nt(r))return r;for(let n of Array.isArray(t)?t:[]){if(!d(n))continue;let s=u(n.runtimeRoot),i=u(n.hostRoot);if(!s||!i||!Nt(s)||!Nt(i))continue;let o=gn(dn(s),dn(r));if(o===""||!o.startsWith("..")&&!Nt(o))return o?Di(i,o):i}return r}function Ue(e,t,r={}){let n=u(e);return!n||n.startsWith("data:")||/^https?:\/\//i.test(n)?n:ji(n,t,r)}function ji(e,t,r={}){let n=[...Vt(r.trustedFileRoots),...Vt(r.trustedFileRoot),...Vt(r.artifactRoots),...Vt(r.artifactRoot)],s=Fi(Bi(e,r.pathMappings),n);if(!s)return"";try{let i=vi(s);return!i.isFile()||i.size<=0||i.size>$i?"":`data:${t};base64,${ki(s).toString("base64")}`}catch{return""}}function k(...e){for(let t of e){let r=u(t);if(r)return r}return""}function qi(e,t,r,n){let s=r.toLowerCase();if(s==="image"||s==="picture")return!0;let i=k(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),o=mn(i.split("?",1)[0].split("#",1)[0]).toLowerCase();return[".png",".jpg",".jpeg",".webp",".gif"].includes(o)}function Le(e,t={}){let{source:r="runtime_image_generation_event"}=t;if(!d(e))return null;let n=d(e.payload)?e.payload:{},s=u(e.type),i=u(n.type);if(!(s==="event_msg"&&i==="image_generation_end"||s==="response_item"&&i==="image_generation_call"))return null;let o=k(n.call_id,n.id),a=k(n.saved_path,n.savedPath),c=k(n.revised_prompt,n.revisedPrompt),l=_n(a,n.mimeType||n.mime_type),p=yn(n.result,l)||Ue(a,l,t);if(!p)return null;let h=p.startsWith("data:")?p:"",f=a?hn(a):`${o||fn()}.png`;return{artifactType:"image",type:"image",fieldKey:"image",title:f||"Generated image",summary:c||"Generated image",content:{prompt:c||void 0,dataUrl:h||void 0,imageUrl:p,previewUrl:p,fileUrl:p,mimeType:l},dataUrl:h||void 0,previewUrl:p,fileUrl:p,metadata:{source:r,eventType:i,callId:o||void 0,savedPath:a||void 0,filename:f,mimeType:l,revisedPrompt:c||void 0}}}function Gi(e){let t=d(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];d(s)&&r.push(s)}return r}function Ki(e,t={}){let{source:r="runtime_artifact"}=t,n=d(e)?e:{};if(!Object.keys(n).length)return null;let s=d(n.content)?{...n.content}:{},i=d(n.metadata)?{...n.metadata}:{},o=k(n.saved_path,n.savedPath,s.saved_path,s.savedPath,i.savedPath),a=k(n.mimeType,n.mime_type,s.mimeType,s.mime_type,i.mimeType),c=k(n.artifactType,n.artifact_type,n.type,n.kind,s.type,o?"image":"file"),l=qi(n,s,c,o),p=l?_n(o,a):a;if(l){let x=k(n.dataUrl,s.dataUrl),w=x.startsWith("data:")?x:"",I=k(n.imageUrl,n.previewUrl,n.fileUrl,n.downloadUrl,n.url,n.uri,s.imageUrl,s.previewUrl,s.fileUrl,s.downloadUrl,s.url,s.uri),y=yn(n.result??s.result,p)||w||Ue(o,p,t)||Ue(I,p,t);y&&(y.startsWith("data:")&&(s.dataUrl||=y),s.imageUrl||=y,s.previewUrl||=y,s.fileUrl||=y,p&&(s.mimeType||=p))}for(let[x,w]of[["prompt","prompt"],["previewUrl","previewUrl"],["fileUrl","fileUrl"],["downloadUrl","downloadUrl"],["imageUrl","imageUrl"],["dataUrl","dataUrl"],["url","url"],["uri","uri"],["mimeType","mimeType"],["mime_type","mimeType"]]){let I=n[x];I!=null&&I!==""&&!(w in s)&&(s[w]=I)}let h=k(n.fileUrl,n.downloadUrl,n.imageUrl,n.dataUrl,n.url,n.uri,s.fileUrl,s.downloadUrl,s.imageUrl,s.dataUrl,s.url,s.uri),f=k(n.previewUrl,n.imageUrl,n.dataUrl,n.url,n.fileUrl,n.uri,s.previewUrl,s.imageUrl,s.dataUrl,s.url,s.fileUrl,s.uri),m=k(n.dataUrl,s.dataUrl,h.startsWith("data:")?h:"",f.startsWith("data:")?f:""),g=k(n.filename,i.filename,o?hn(o):""),T=k(n.fieldKey,n.field_key,s.fieldKey,i.fieldKey,l?"image":"artifact");return{...n,artifactType:c,type:n.type||c,fieldKey:T,title:k(n.title,g,"Runtime artifact"),summary:k(n.summary,s.prompt,n.title,g,"Runtime artifact"),content:s,dataUrl:m||void 0,fileUrl:h||void 0,previewUrl:f||void 0,metadata:{...i,source:k(i.source,r),savedPath:o||i.savedPath,filename:g||i.filename,mimeType:p||i.mimeType}}}function Jt(e,t){if(!t||!e)return;let r=d(t.metadata)?t.metadata:{},n=k(r.savedPath,r.callId,t.previewUrl,t.fileUrl)||fn(),s=e.get(n);if(!s){e.set(n,t);return}s.content={...d(s.content)?s.content:{},...d(t.content)?t.content:{}},s.metadata={...d(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 Pe(e,t,r={}){for(let n of Gi(e))Jt(t,Ki(n,r))}function ke(e){if(!d(e)||!d(e.payload))return d(e)?e:{value:e};let t=u(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 pn(e,t,r){if(!d(e))return e;let n=d(e.event)?e.event:null;return n?(Jt(t,Le(n,r)),{...e,event:ke(n)}):e}function Tn(e,t,r={}){if(!d(e))return e;Pe(e,t,r);let n=pn(e,t,r),s=d(n.update)?pn(n.update,t,r):null;return s&&s!==n.update&&(n={...n,update:s}),n}function wn(e,t,r={}){let n=d(e)?{...e}:{};Pe(n,t,r),Pe(d(n.output)?n.output:{},t,r);let s=[...t?.values?.()||[]];return s.length&&(n._artifacts=s),delete n.artifacts,n}function En(e,t){let r=R(e,t);return r>0?r:t}var gt=class{constructor(t,r,n={},s={}){this.agent=t,this.target=r,this.callbacks=n,this.options=s,this.proc=null,this.launch=null,this.launchCleanup=null,this.permissionHandlers=new Map}async ensureStarted(){if(this.proc)return;let t=u(this.target.command);if(!t)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);let r={command:t,args:P(this.target.args),cwd:W(this.target,this.agent.workspace),environment:d(this.target.env)?this.target.env:{}},n=this.options.prepareLaunch?await this.options.prepareLaunch(r):{...r,environment:{...process.env,...r.environment},cleanup:async()=>{}};this.launch=n,this.launchCleanup=n.cleanup,this.proc=new zt({command:n.command,args:n.args,cwd:n.cwd,env:n.environment,label:`${this.agent.agentId}:${this.agent.targetCode}`,framing:u(this.target.framing||"line")}),this.proc.onRequest("session/request_permission",s=>this.handlePermissionRequest(s)),this.proc.onRequest("session/requestPermission",s=>this.handlePermissionRequest(s));try{await this.proc.start({initialize:this.target.initialize!==!1,initializeTimeoutMs:En(this.target.initializeTimeoutMs,En(this.options.initializeTimeoutMs,3e4)),initializeParams:{clientInfo:{name:"orcha-runtime-bridge",version:K},...d(this.target.initializeParams)?this.target.initializeParams:{}}})}catch(s){throw await this.proc?.stop("runtime startup failed"),this.proc=null,await this.cleanupLaunch(),s}}async sessionNew(t={}){return await this.ensureStarted(),this.proc.call("session/new",this.sessionNewParams(t))}sessionNewParams(t={}){let r=Array.isArray(t.mcpServers)?t.mcpServers:Array.isArray(this.target.mcpServers)?this.target.mcpServers:[];return{...t,mcpServers:r}}async sessionPrompt(t,r){await this.ensureStarted();let n=u(t.sessionId),s=new Map,i=this.artifactOptions(),o=this.proc.onNotification("session/update",c=>{let l=u(c.sessionId);(!l||l===n)&&r(Tn(c,s,i))}),a=async c=>this.callbacks.onPermissionRequest?.({agent:this.agent,runtimeSessionId:n,request:c,emitUpdate:r})||{outcome:"denied",reason:"permission handler is not configured"};n&&this.permissionHandlers.set(n,a),this.permissionHandlers.set("*",a);try{let c=await this.proc.call("session/prompt",t,this.options.sessionPromptTimeoutMs);return wn(c,s,i)}finally{o(),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=u(t.sessionId),n=this.permissionHandlers.get(r)||this.permissionHandlers.get("*");return n?n(t):{outcome:"denied",reason:"no active Orcha permission handler"}}artifactSource(){return u(this.target.type||"acp")==="openclaw"?"openclaw_image_generation":"acp_runtime_image_generation"}artifactOptions(){let t=d(this.target.env)?this.target.env:{};return{source:this.artifactSource(),trustedFileRoots:[u(this.launch?.artifactDirectory),u(this.launch?.homeDirectory),u(this.target.artifactRoot),u(this.target.artifactDir),u(this.target.runtimeArtifactRoot),u(t.ORCHA_RUNTIME_ARTIFACT_DIR),...P(this.target.trustedArtifactRoots),...P(this.target.trustedFileRoots),...P(this.target.artifactRoots),...P(this.target.artifactFileRoots)].filter(Boolean),pathMappings:Array.isArray(this.launch?.pathMappings)?this.launch.pathMappings:[]}}async stop(t){try{await this.proc?.stop(t)}finally{this.proc=null,await this.cleanupLaunch()}}async cleanupLaunch(){let t=this.launchCleanup;this.launchCleanup=null,this.launch=null,await t?.()}};import{existsSync as Sn,readFileSync as zi}from"node:fs";import{dirname as Vi,resolve as Wt}from"node:path";import{fileURLToPath as Ji}from"node:url";var Wi=/^[A-Za-z_][A-Za-z0-9_]*$/,z=24*60*60*1e3;function Rn(e=process.env,t=process.cwd()){let r=u(e.ORCHA_RUNTIME_ENV_FILE),n=r?Wt(t,r):Wt(t,".env");if(!Sn(n))return r&&_("warn","config","runtime env file not found",{path:n}),{loaded:!1,path:n,keys:[]};let s=[],i=zi(n,"utf8");for(let o of i.split(/\r?\n/)){let a=Qi(o);if(!a)continue;let[c,l]=a;Object.prototype.hasOwnProperty.call(e,c)||(e[c]=l,s.push(c))}return _("info","config","runtime env file loaded",{path:n,keyCount:s.length}),{loaded:!0,path:n,keys:s}}function On(e=process.env){let t=u(e.ORCHA_RUNTIME_MODE||(e.ORCHA_RUNTIME_ORCHA_URL?"node":"server")),r=u(e.ORCHA_RUNTIME_BRIDGE_HOST||"127.0.0.1"),n=!1,s=Vi(Ji(import.meta.url)),i=Wt(s,"sandbox","broker.js"),o=Wt(s,"orcha-runtime-sandbox-broker.js"),a=Sn(i)?i:o,c=u(e.ORCHA_RUNTIME_SANDBOX_BROKER_COMMAND);return{mode:t,host:r,port:R(e.ORCHA_RUNTIME_BRIDGE_PORT,5588),token:e.ORCHA_RUNTIME_BRIDGE_TOKEN||"",orchaUrl:u(e.ORCHA_RUNTIME_ORCHA_URL),nodeToken:e.ORCHA_RUNTIME_NODE_TOKEN||e.ORCHA_RUNTIME_BRIDGE_TOKEN||"",nodeId:u(e.ORCHA_RUNTIME_NODE_ID||e.HOSTNAME||"local-runtime-node"),nodeName:u(e.ORCHA_RUNTIME_NODE_NAME||e.ORCHA_RUNTIME_NODE_ID||e.HOSTNAME||"Local Runtime Node"),reconnectMs:R(e.ORCHA_RUNTIME_RECONNECT_MS,3e3),connectTimeoutMs:R(e.ORCHA_RUNTIME_CONNECT_TIMEOUT_MS||e.ORCHA_RUNTIME_WS_CONNECT_TIMEOUT_MS,1e4),defaultTargetCode:e.ORCHA_RUNTIME_DEFAULT_TARGET||"echo",requestLimitBytes:R(e.ORCHA_RUNTIME_REQUEST_LIMIT_BYTES,1048576),initializeTimeoutMs:R(e.ORCHA_RUNTIME_INITIALIZE_TIMEOUT_MS,3e4),sessionPromptTimeoutMs:R(e.ORCHA_RUNTIME_SESSION_PROMPT_TIMEOUT_MS,z),permissionRequestTimeoutMs:R(e.ORCHA_RUNTIME_PERMISSION_TIMEOUT_MS,3e5),sessionIdleTtlMs:R(e.ORCHA_RUNTIME_SESSION_IDLE_TTL_MS,6e5),sessionCleanupIntervalMs:R(e.ORCHA_RUNTIME_SESSION_CLEANUP_INTERVAL_MS,6e4),maxSessionsPerTarget:R(e.ORCHA_RUNTIME_MAX_SESSIONS_PER_TARGET,8),openClawSessionIdleTtlMs:R(e.ORCHA_RUNTIME_OPENCLAW_SESSION_IDLE_TTL_MS,6e4),openClawMaxSessions:R(e.ORCHA_RUNTIME_OPENCLAW_MAX_SESSIONS,1),heartbeatIntervalMs:R(e.ORCHA_RUNTIME_HEARTBEAT_INTERVAL_MS,15e3),sandboxRequired:n,sandboxBrokerCommand:c||process.execPath,sandboxBrokerArguments:ve(e.ORCHA_RUNTIME_SANDBOX_BROKER_ARGUMENTS,"ORCHA_RUNTIME_SANDBOX_BROKER_ARGUMENTS",c?[]:[a]),sandboxProbeTimeoutMs:R(e.ORCHA_RUNTIME_SANDBOX_PROBE_TIMEOUT_MS,1e4),sandboxTempRoot:u(e.ORCHA_RUNTIME_SANDBOX_TEMP_ROOT),trustedWorkspaceRoots:ve(e.ORCHA_RUNTIME_TRUSTED_WORKSPACE_ROOTS,"ORCHA_RUNTIME_TRUSTED_WORKSPACE_ROOTS"),trustedToolchainRoots:ve(e.ORCHA_RUNTIME_TRUSTED_TOOLCHAIN_ROOTS,"ORCHA_RUNTIME_TRUSTED_TOOLCHAIN_ROOTS"),egressProxyRequired:Yi(e.ORCHA_RUNTIME_EGRESS_PROXY_REQUIRED,t==="node"),egressProxySocket:u(e.ORCHA_RUNTIME_EGRESS_PROXY_SOCKET),egressProxyToken:u(e.ORCHA_RUNTIME_EGRESS_PROXY_TOKEN),egressGrantMaxTtlMs:R(e.ORCHA_RUNTIME_EGRESS_GRANT_MAX_TTL_MS,9e5),targets:Xi(e.ORCHA_RUNTIME_TARGETS_JSON||"")}}function Xi(e){if(!u(e))return{};try{let t=JSON.parse(e);if(d(t))return t}catch(t){_("warn","config","invalid ORCHA_RUNTIME_TARGETS_JSON",{error:String(t)})}return{}}function Yi(e,t){let r=u(e).toLowerCase();if(!r)return t;if(["true","1","yes","on"].includes(r))return!0;if(["false","0","no","off"].includes(r))return!1;throw new Error(`invalid boolean configuration value: ${r}`)}function ve(e,t,r=[]){let n=u(e);if(!n)return[...r];let s;try{s=JSON.parse(n)}catch{throw new Error(`${t} must be a JSON string array`)}if(!Array.isArray(s)||s.some(i=>typeof i!="string"))throw new Error(`${t} must be a JSON string array`);return s.map(i=>i.trim()).filter(Boolean)}function Qi(e){let t=e.trim();if(!t||t.startsWith("#"))return null;let r=t.startsWith("export ")?t.slice(7).trimStart():t,n=r.indexOf("=");if(n<=0)return null;let s=r.slice(0,n).trim();if(!Wi.test(s))return null;let i=Zi(r.slice(n+1).trim());return[s,i]}function Zi(e){if(!e)return"";let t=e[0];if((t==='"'||t==="'")&&e.endsWith(t)){let r=e.slice(1,-1);return t==='"'?to(r):r}return eo(e).trim()}function to(e){return e.replaceAll("\\n",`
12
+ `).replaceAll("\\r","\r").replaceAll("\\t"," ").replaceAll('\\"','"').replaceAll("\\\\","\\")}function eo(e){let t=!1,r=!1;for(let n=0;n<e.length;n+=1){let s=e[n],i=e[n-1];if(s==="'"&&!r)t=!t;else if(s==='"'&&!t&&i!=="\\")r=!r;else if(s==="#"&&!t&&!r&&/\s/.test(i||""))return e.slice(0,n)}return e}var Xt=class{constructor(t,r,n,s,i={}){this.agent=t,this.target=r,this.options=i,this.sessionKey=n,this.mcp=null,this.metadata=null,this.finished=!1,this.transport=new et(r,{runId:i.runId}),this.expiresAt=new Date(Date.now()+Number(i.sandboxPolicy?.maxRuntimeSeconds||i.sessionPromptTimeoutMs/1e3||z/1e3)*1e3).toISOString()}async sessionNew({mcpServers:t,metadata:r}){if(r?.source!=="channel_message"||r.delivery?.dispatchMode!=="bridge")throw new Error("Invalid native Channel dispatch");return this.mcp=t[0],this.metadata=r,{sessionId:this.sessionKey}}async refreshMcpServers(t){this.mcp=t[0],this.promptBody&&await this.transport.request("PATCH",{...this.promptBody,mcpServer:this.mcp,attachOnly:!0},!1,"deliveries")}async sessionPrompt({prompt:t},r){if((await this.transport.request("GET",void 0,!1,"deliveries")).streamType!==at)throw D("OPENCLAW_CHANNEL_PROTOCOL_MISMATCH");this.promptBody={runId:this.options.runId,agentCode:this.target.openclawAgentId||this.metadata.agentCode,delivery:this.metadata.delivery,expiresAt:this.expiresAt,mcpServer:this.mcp,attachOnly:this.options.attachOnly===!0,prompt:t};let s=await this.transport.request("POST",this.promptBody,!1,"deliveries",Number(this.options.sessionPromptTimeoutMs||z),i=>r?.(i));return this.finished=!0,s}async stop(){!this.finished&&this.promptBody&&await this.transport.request("DELETE",{runId:this.options.runId},!1,"deliveries")}};function De(e){let t=d(e.metadata)?e.metadata:{};return u(t.agentCode)}function In(e,t,r){let n=u(r?.openclawAgentId)||De(e);return n?`agent:${n}:${t}`:`orcha-${t}`}var Yt=class extends gt{constructor(t,r,n,s={},i={}){if(i.source==="channel_message")return new Xt(t,r,n,s,i);let o=u(n).replace(/[^A-Za-z0-9._-]+/g,"-")||"default",a=u(r.command)||"openclaw",c=Array.isArray(r.args)?r.args.map(String):[],l=c.length>0?c:["acp","--session",In(t,o,r)];super(t,{...r,command:a,args:l},s,i),this.boundSessionKey=In(t,o,r),this.binding=null}async sessionNew(t={}){if(t.mcpServers?.length){let r=[...this.target.args],n=r.indexOf("--session"),s=r.find(c=>c.startsWith("--session=")),i=s?s.slice(10):n<0?null:r[n+1];if(i&&i!==this.boundSessionKey)throw Object.assign(new Error("OpenClaw --session must match this Orcha task's private session"),{code:"OPENCLAW_SESSION_BINDING_CONFLICT"});i===null&&r.push("--session",this.boundSessionKey),this.target.args=r;let o=u(this.options.runId),a=Number(this.options.sandboxPolicy?.maxRuntimeSeconds||this.options.sessionPromptTimeoutMs/1e3||z/1e3);if(!o||!De(this.agent))throw new Error("OpenClaw MCP requires a trusted task and Agent identity");this.binding=new et(this.target,{runId:o,sessionKey:this.boundSessionKey,agentCode:u(this.target.openclawAgentId)||De(this.agent),expiresAt:new Date(Date.now()+a*1e3).toISOString()}),await this.binding.bind(t.mcpServers)}try{return await super.sessionNew(t)}catch(r){throw await this.binding?.close(),r}}async refreshMcpServers(t){if(!this.binding)throw Object.assign(new Error("The original OpenClaw task binding is unavailable"),{code:"RUNTIME_OPERATION_NOT_FOUND"});await this.binding.bind(t,!0)}async stop(t){try{await super.stop(t)}finally{await this.binding?.close()}}sessionNewParams(t={}){return{...t,mcpServers:[]}}};import{spawn as Gn}from"node:child_process";import{randomUUID as _t}from"node:crypto";import{existsSync as Kn,mkdirSync as Ro,readdirSync as zn,readFileSync as Vn,realpathSync as Pt,rmSync as Oo,rmdirSync as Io,statSync as Co,unlinkSync as xo}from"node:fs";import{homedir as Ao,tmpdir as Jn}from"node:os";import{basename as Ge,dirname as bo,join as j,resolve as Hn}from"node:path";import{createHash as mo,randomUUID as go}from"node:crypto";import{mkdirSync as Ln,readFileSync as _o,renameSync as yo,rmSync as To,writeFileSync as kn}from"node:fs";import{homedir as He}from"node:os";import{join as ut}from"node:path";import{createHash as Cn}from"node:crypto";import{constants as $e}from"node:fs";import{open as ro,realpath as xn}from"node:fs/promises";import{basename as no,isAbsolute as so,relative as io,resolve as oo}from"node:path";var ao=32*1024*1024,co={name:"send_file",description:"Send one explicitly selected local file to the current OrchaAI conversation. Use this to deliver images, PDFs, documents, spreadsheets or other files to the user; viewing an image or writing a local Markdown link does not send it. path must be in the current workspace, a configured artifact root, or (Codex only) the current thread's generated_images directory. Copy other intended deliverables into the workspace first. Success means the attachment message is saved; do not send it again or embed the local path. Internal previews and intermediate files need not be sent.",inputSchema:{type:"object",additionalProperties:!1,required:["path"],properties:{path:{type:"string",minLength:1,description:"Absolute file path, or a path relative to the current workspace."},message:{type:"string",maxLength:1e4,description:"Optional caption for the attachment message."}}}};function An(e){return{...co,async call(t,{upstream:r,signal:n}){if(!t||typeof t.path!="string"||!t.path.trim()||Object.keys(t).some(y=>!["path","message"].includes(y))||t.message!==void 0&&(typeof t.message!="string"||t.message.length>1e4))throw new Error("send_file requires a file path and an optional caption of at most 10000 characters");let{cwd:s,roots:i}=e();if(!s)throw new Error("The current file delivery workspace is unavailable");let o=await xn(oo(s,t.path)),a=!1;for(let y of i)try{let S=io(await xn(y),o);(!S||S!==".."&&!S.startsWith("../")&&!S.startsWith("..\\")&&!so(S))&&(a=!0)}catch{}if(!a)throw new Error("File is outside the current workspace and authorized artifact roots");let c=await ro(o,$e.O_RDONLY|$e.O_NOFOLLOW|$e.O_NONBLOCK),l;try{let y=await c.stat();if(!y.isFile()||y.size<=0||y.size>ao)throw new Error("Select a non-empty regular file of at most 32 MiB");l=Buffer.alloc(y.size);let S=0;for(;S<l.length;){let{bytesRead:A}=await c.read(l,S,l.length-S,S);if(!A)throw new Error("File changed while preparing delivery; retry after it is saved");S+=A}let N=await c.stat();if(N.size!==y.size||N.mtimeMs!==y.mtimeMs)throw new Error("File changed while preparing delivery; retry after it is saved")}finally{await c.close()}let p=t.message||"",h=no(o),f=Cn("sha256").update(l).digest("hex"),m=Cn("sha256").update(JSON.stringify([o,f,p])).digest("hex"),g=new FormData;g.set("deliveryId",m),g.set("message",p),g.set("file",new Blob([l]),h);let T=new URL(r.url);T.pathname=`${T.pathname.replace(/\/$/,"")}/files`;let x=await fetch(T,{method:"POST",headers:{authorization:r.headers.authorization},body:g,redirect:"error",signal:AbortSignal.any([n,AbortSignal.timeout(12e4)])});if(!x.ok)throw new Error(`File delivery failed (HTTP ${x.status}); no successful receipt was received`);let w=await x.json();if(!w.success)throw new Error(`File delivery failed: ${String(w.message||w.code||"request rejected").slice(0,512)}`);let I=w.data;if(!I?.accepted||typeof I.messageId!="string"||!I.messageId||typeof I.fileId!="string"||!I.fileId)throw new Error("File delivery did not return a saved message and file receipt");return{content:[{type:"text",text:JSON.stringify(I)}],structuredContent:I,isError:!1}}}}var uo=new Set(["Bash","PowerShell"]),lo=new Set(["Edit","Write","MultiEdit","NotebookEdit"]),po="SandboxNetworkAccess",bn=2e3,Nn=50;function ct(e,t=0){return typeof e=="string"?e.length>bn?`${e.slice(0,bn)}\u2026`:e:t>=4&&(Array.isArray(e)||d(e))?"\u2026":Array.isArray(e)?e.slice(0,Nn).map(r=>ct(r,t+1)):d(e)?Object.fromEntries(Object.entries(e).slice(0,Nn).map(([r,n])=>[r,ct(n,t+1)])):e}function fo(e){let t=e.tool_name,r=e.input,n=uo.has(t)?"command":lo.has(t)?"file_change":t===po?"permission":"other",s=r.file_path||r.notebook_path;return{runtime:"claude",kind:n,toolName:t,title:typeof e.description=="string"?e.description:"",...n==="command"&&typeof r.command=="string"?{command:r.command}:{},...n==="file_change"&&typeof s=="string"?{paths:[s]}:{},input:ct(r)}}async function Mn(e,t,r){if(e?.subtype!=="can_use_tool"||typeof e.tool_name!="string"||!d(e.input))return{subtype:"error",error:`OrchaAI does not handle Claude control request ${e?.subtype}`};let n=await t(fo(e),{signal:r}),s=n?.response?.reason||n?.reason||n?.outcome||"not approved";return{subtype:"success",response:n?.outcome==="approved"?{behavior:"allow",updatedInput:e.input}:{behavior:"deny",message:`OrchaAI did not approve this action (${s}). Do not retry the same action unless the user asks.`}}}var ho=new Set(["threadId","turnId","itemId","approvalId","startedAtMs","environmentId","command","cwd","reason"]);function Un(e,t,r){let n=Object.fromEntries(Object.entries(t).filter(([i,o])=>!ho.has(i)&&o!=null)),s={runtime:"codex",title:typeof t.reason=="string"?t.reason:"",input:ct(n)};if(e==="item/commandExecution/requestApproval")return{...s,kind:"command",toolName:"shell",...typeof t.command=="string"?{command:t.command}:{},...typeof t.cwd=="string"?{cwd:t.cwd}:{}};if(e==="item/fileChange/requestApproval"){let i=Array.isArray(r?.changes)?r.changes.map(o=>o?.path).filter(o=>typeof o=="string"):[];return{...s,kind:"file_change",toolName:"apply_patch",...i.length?{paths:i}:{}}}return{...s,kind:"permission",...typeof t.cwd=="string"?{cwd:t.cwd}:{}}}function Pn(e,t,r){return e==="item/permissions/requestApproval"?{permissions:Object.fromEntries(Object.entries(d(t.permissions)?t.permissions:{}).filter(([,s])=>r&&s!=null)),scope:"turn"}:{decision:r?"accept":"decline"}}var vn=e=>mo("sha256").update(JSON.stringify(e)).digest("hex"),X=(e,t)=>Object.assign(new Error(t),{code:e}),Dn=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Fe="ORCHA_TASK_MCP_TOKEN",wo=new Set(["--no-session-persistence","--resume","-r","--continue","-c","--session-id","--fork-session"]);function Eo(e){return typeof e=="string"?e:Array.isArray(e)?e.filter(t=>t?.type==="text").map(t=>t.text).join(`
13
+ `):""}var Mt=(e,t)=>({sessionUpdate:e,content:{type:"text",text:t}});function So(e,t,{emitThoughts:r,streamText:n}){let s=e?.type;if(s==="result"&&e.is_error!==!0){let c=typeof e.result=="string"?e.result:"",l=t.streamed;return t.text=t.streamed="",c?l?l.trim()===c.trim()?[]:[Mt("agent_message_snapshot",c)]:[Mt("agent_message_chunk",c)]:[]}if(!["assistant","user","stream_event"].includes(s))return null;let i=[];if(e.parent_tool_use_id)return i;let o=()=>{let c=t.streamed||t.text;t.streamed&&i.push(Mt("agent_message_snapshot","")),c&&r&&i.push(Mt("agent_thought_chunk",c)),t.text=t.streamed=""},a=c=>{t.streamed=(t.streamed||"")+c,i.push(Mt("agent_message_chunk",c))};if(s==="stream_event"){if(!n)return i;t.streaming=!0;let c=e.event,l=c?.content_block?.type;return c?.type==="content_block_start"&&l==="tool_use"?o():c?.type==="content_block_start"&&l==="text"&&t.streamed?a(`
14
14
 
15
15
  `):c?.type==="content_block_delta"&&c.delta?.type==="text_delta"&&c.delta.text&&a(c.delta.text),i}for(let c of Array.isArray(e.message?.content)?e.message.content:[])s==="user"?c?.type==="tool_result"&&c.tool_use_id&&i.push({sessionUpdate:"tool_call_update",toolCallId:c.tool_use_id,status:c.is_error?"failed":"completed",rawOutput:Eo(c.content)}):c?.type==="text"&&c.text?t.streaming||(t.text=t.text?`${t.text}
16
16
 
17
- ${c.text}`:c.text):c?.type==="tool_use"&&c.id&&(o(),i.push({sessionUpdate:"tool_call",toolCallId:c.id,title:c.name,status:"in_progress",rawInput:c.input}));return i}var ct=Object.freeze({codex:{label:"Codex",code:"CODEX",sessionDirectory:"codex-sessions",home:e=>e.env?.CODEX_HOME||process.env.CODEX_HOME||at(Fe(),".codex"),threadId:e=>e?.type==="thread.started"?e.thread_id:void 0,resumeArgs(e,t){let r=e.indexOf("exec");if(r<0||e.includes("resume")||e.includes("--ephemeral"))throw W("BAD_REQUEST","Codex \u539F\u751F\u4F1A\u8BDD\u9700\u8981\u6807\u51C6 codex exec \u914D\u7F6E");return t?[...e.slice(0,r+1),"resume",t,...e.slice(r+1)]:e},mcpArgs:e=>["-c",`mcp_servers.orcha={url=${JSON.stringify(e)},bearer_token_env_var=${JSON.stringify(Be)},required=true}`]},claude:{label:"Claude Code",code:"CLAUDE",sessionDirectory:"claude-sessions",home:e=>e.env?.CLAUDE_CONFIG_DIR||process.env.CLAUDE_CONFIG_DIR||at(Fe(),".claude"),threadId:e=>e?.type==="system"&&e.subtype==="init"?e.session_id:void 0,resumeArgs(e,t){let r=e.indexOf("--output-format");if(!e.includes("-p")&&!e.includes("--print")||r<0||e[r+1]!=="stream-json"||!e.includes("--verbose")||e.some(n=>wo.has(n)))throw W("BAD_REQUEST","Claude Code \u539F\u751F\u4F1A\u8BDD\u9700\u8981\u6807\u51C6 claude -p --output-format stream-json --verbose \u914D\u7F6E");return t?[...e,"--resume",t]:e},mcpArgs:e=>["--mcp-config",JSON.stringify({mcpServers:{orcha:{type:"http",url:e,headers:{Authorization:`Bearer \${${Be}}`}}}}),"--allowedTools","mcp__orcha","--permission-prompt-tool",`mcp__orcha__${He}`],approvalTool:Mn,taskMcpError(e){if(e?.type!=="system"||e.subtype!=="init")return null;let t=e.mcp_servers?.find(r=>r?.name==="orcha")?.status||"missing";return t==="connected"?null:W("RUNTIME_CLAUDE_MCP_UNAVAILABLE",`Claude Code \u672A\u80FD\u8FDE\u63A5 OrchaAI \u4EFB\u52A1\u5DE5\u5177\uFF08${t}\uFF09\uFF0C\u672C\u8F6E\u672A\u6267\u884C`)},progress:So}});async function $n(e,t,r,n){let s=await on(t,[...r?[An(r)]:[],...e.approvalTool&&n?[e.approvalTool(n)]:[]]);return{args:e.mcpArgs(s.url),environment:{[Be]:s.token},refresh:i=>s.refresh(i),close:()=>s.close()}}var Qt=class{constructor(t,r,n=at(Fe(),".orcha",ct[t].sessionDirectory)){this.adapter=ct[t],this.directory=at(n,vn(r))}async turn(t,r,n,s,i){let{label:o,code:a}=this.adapter;if(!t)throw W("BAD_REQUEST",`${o} native turn requires a run ID`);Ln(this.directory,{recursive:!0,mode:448});let c=at(this.directory,"active");try{Ln(c,{mode:448})}catch(f){throw f.code==="EEXIST"?W("RUNTIME_SESSION_BUSY",`${o} \u4EFB\u52A1\u4ECD\u5728\u8FD0\u884C\u6216\u4E0A\u8F6E\u5F02\u5E38\u4E2D\u65AD\uFF1B\u8BF7\u7B49\u5F85\u5B8C\u6210\uFF0C\u6216\u53D1\u9001 /new \u5F00\u59CB\u65B0\u4EFB\u52A1`):f}let l=at(this.directory,"session.json"),p,h=()=>{let f=`${l}.${go()}.pending`;kn(f,JSON.stringify(p),{mode:384}),yo(f,l)};try{try{p=JSON.parse(_o(l,"utf8"))}catch(T){if(T.code!=="ENOENT")throw T}if(p&&!Dn.test(p.threadId||""))throw W("RUNTIME_OPERATION_NOT_FOUND",`${o} \u4E0A\u8F6E\u672A\u80FD\u4FDD\u5B58\u539F\u751F\u4F1A\u8BDD\u6807\u8BC6\uFF0C\u8BF7\u53D1\u9001 /new`);try{kn(at(this.directory,`${vn(t)}.run`),"",{flag:"wx",mode:384})}catch(T){throw T.code==="EEXIST"?W("RUNTIME_OPERATION_NOT_FOUND",`\u6B64\u8F6E ${o} \u5DF2\u6267\u884C\u6216\u6267\u884C\u7ED3\u679C\u4E0D\u786E\u5B9A\uFF0C\u4E0D\u80FD\u91CD\u590D\u53D1\u9001`):T}p||={threadId:null},h();let f,m=T=>{if(f)return;let C=T.update?.sessionUpdate==="runtime_event"?this.adapter.threadId(T.update.event):void 0;if(C!==void 0)try{if(!Dn.test(C||"")||p.threadId&&p.threadId!==C)throw W(`${a}_SESSION_MISMATCH`,`${o} \u8FD4\u56DE\u4E86\u4E0D\u540C\u7684\u539F\u751F\u4F1A\u8BDD\uFF0C\u8BF7\u53D1\u9001 /new`);p.threadId=C,h()}catch(w){f=w,i();return}n(T)},y=await r(p.threadId,m,T=>{!f&&p.threadId&&s?.(T)});if(f)throw f;if(!p.threadId)throw W(`${a}_SESSION_MISSING`,`${o} \u6CA1\u6709\u8FD4\u56DE\u539F\u751F\u4F1A\u8BDD\u6807\u8BC6\uFF0C\u8BF7\u68C0\u67E5 CLI \u7248\u672C\u5E76\u53D1\u9001 /new`);return y}finally{To(c,{recursive:!0})}}};var Wn=5e3,bo=2*60*1e3,Mo=2*60*1e3,Uo=12,Po=1e3,Lo=1500,ko=1e3,vo=/^(?:task|session)-[1-9]\d*(?::[1-9]\d*){4}(?![\s\S])/,Zt=24*60*60*1e3,Mt=new Set(["final_answer","final","complete","completed","done"]),Do=new Set(["function_call","function_call_output","custom_tool_call","custom_tool_call_output","local_shell_call","local_shell_call_output","mcp_tool_call","mcp_tool_call_output","web_search_call","image_generation_call","image_generation_end"]),$o=new Set(["context_compacted","context_compaction","context_compressed"]);function ee(e,t){if(e?.pid){if(process.platform==="win32"){let r=["/PID",String(e.pid),"/T"];t==="SIGKILL"&&r.push("/F");try{Gn("taskkill",r,{stdio:"ignore",windowsHide:!0}).unref?.()}catch{try{e.kill(t)}catch{}}return}try{process.kill(-e.pid,t)}catch(r){if(r?.code==="ESRCH")return;try{e.kill(t)}catch{}}}}function _t(e){ee(e,"SIGTERM");let t=setTimeout(()=>ee(e,"SIGKILL"),Wn);return t.unref?.(),t}function B(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(t=>B(t)).join("");if(!d(e))return"";for(let t of["text","delta","output_text","content","message","output"]){let r=B(e[t]);if(r)return r}return""}function Xn(e){if(!d(e))return"";let t=d(e.payload)?e.payload:{};if(u(e.type)==="event_msg"){if(u(t.type)==="agent_message")return u(t.message);if(u(t.type)==="task_complete")return u(t.last_agent_message)}if(u(e.type)==="response_item"&&u(t.type)==="message"&&u(t.role)==="assistant")return B(t.content)||B(t.message);if(u(e.type)==="result")return B(e.result);let r=B(e.delta)||B(e.text)||B(e.content);if(r)return r;let n=d(e.item)?e.item:{};return["message","agent_message"].includes(u(n.type))||u(n.role)==="assistant"?B(n.content)||B(n.text)||B(n.message):""}function Yn(e,t){e.explicitFileDelivery||Jt(e.artifacts,Le(t,{source:"codex_cli_image_generation",...e.artifactOptions}))}function Qn(e){return nt(ke(e))}function ze(e){if(!d(e))return!1;let t=d(e.payload)?e.payload:{},r=u(e.type),n=u(t.type);if(r==="event_msg"&&n==="task_complete")return!0;let s=u(t.phase||t.status||t.stage).toLowerCase();if(r==="event_msg"&&n==="agent_message"||r==="response_item"&&n==="message"&&u(t.role)==="assistant")return Mt.has(s);let i=d(e.item)?e.item:{};return r==="item.completed"&&u(i.type)==="agent_message"?!0:r==="result"&&e.is_error!==!0?u(e.result).length>0:!1}function re(e){let t=u(e.terminalProtocol||e.eventProtocol).toLowerCase();if(t)return t;let r=Ke(u(e.command)).replace(/\.exe$/i,"").toLowerCase();return r==="codex"||r==="claude"?r:""}function Fn(e,t,r){let n=d(t.error)?t.error:{},s=u(n.message)||B(t.error)||u(t.result)||u(t.message)||r;return Object.assign(new Error(s),{code:e})}function Ho(e,t){if(!d(e))return null;let r=u(e.type).toLowerCase();if(t==="codex")return r==="turn.completed"?{status:"completed",result:{stopReason:"end_turn"}}:r==="turn.failed"?{status:"failed",error:Fn("RUNTIME_CODEX_TURN_FAILED",e,"Codex turn failed")}:null;if(t==="claude"&&r==="result"){let n=u(e.subtype).toLowerCase();return e.is_error===!0||n.startsWith("error")||["failed","failure"].includes(n)?{status:"failed",error:Fn("RUNTIME_CLAUDE_RESULT_FAILED",e,"Claude result failed")}:{status:"completed",result:{stopReason:"end_turn",...u(e.result)?{output:u(e.result)}:{}}}}return null}function Bn(e){return d(e)?u(e.phase||e.status||e.stage).toLowerCase():""}function Fo(e){if(!d(e)||ze(e))return!1;let t=d(e.payload)?e.payload:{},r=u(e.type),n=u(t.type),s=Bn(t);if(r==="event_msg"&&n==="agent_message"||r==="response_item"&&n==="message"&&u(t.role)==="assistant")return!!(s&&!Mt.has(s));let i=d(e.item)?e.item:{},o=Bn(i);return u(i.role)==="assistant"||u(i.type)==="message"?!!(o&&!Mt.has(o)):!1}function Bo(e,t,r){return r.captureLastMessage===!1||t.includes("--output-last-message")||t.includes("-o")?!1:r.captureLastMessage===!0?!0:Ke(e)==="codex"}function jo(e,t){return t.collectCodexTranscriptArtifacts===!1?!1:t.collectCodexTranscriptArtifacts===!0?!0:Ke(e)==="codex"}function Zn(e){return Math.max(20,R(e.codexTranscriptPollMs||e.transcriptPollMs,Po))}function qo(e){return Math.max(0,R(e.codexFinalOutputWaitMs||e.finalOutputWaitMs,Lo))}function ne(e){if(typeof e=="boolean")return e;let t=u(e).toLowerCase();return["true","1","yes","y","on"].includes(t)?!0:["false","0","no","n","off"].includes(t)?!1:null}function Ve(e){let t=d(e?.metadata)?e.metadata:{};return d(t._runtimeBridge)?t._runtimeBridge:{}}function je(e){return u(Ve(e).promptKind).toLowerCase()}function Go(e,t){for(let r of[e.codexTranscriptStreaming,e.streamCodexTranscript]){let n=ne(r);if(n!=null)return n}return je(t)==="chat"}function Je(e,t){let r=Ve(e);for(let s of[r.emitThoughtChunks,r.streamThoughts]){let i=ne(s);if(i!=null)return i}let n=je(e);if(n&&n!=="chat")return!1;for(let s of[t.emitThoughtChunks,t.streamThoughts]){let i=ne(s);if(i!=null)return i}return je(e)==="chat"}function Ko(e){let t=Ve(e);for(let r of[t.finalTextOnly,t.finalOutputOnly]){let n=ne(r);if(n!=null)return n}return null}function zo(e,t){let r=Ko(e);return r??(t.finalTextOnly===!0||t.finalOutputOnly===!0?!0:(t.finalTextOnly===!1||t.finalOutputOnly===!1,!1))}function Vo(e,t){return!e.finalTextOnly||t}function ts(e,t,r,n,s=n){return!n||e.emittedTexts.has(s)?!1:(e.emittedTexts.add(s),r({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:n}}}),!0)}function es(e,t,r,n){return!n||e.emittedThoughtTexts.has(n)?!1:(e.emittedThoughtTexts.add(n),r({sessionId:t,update:{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:n}}}),!0)}function Jo(e,t,r,n=new Set){return{target:e,promptText:t,startedAtMs:r,baselinePaths:n,matchedPath:"",disabled:!1,processedLines:new Map}}function We(e,t){let r=d(e.env)?e.env:{},n=u(e.artifactRoot||e.artifactDir||e.runtimeArtifactRoot||r.ORCHA_RUNTIME_ARTIFACT_DIR)||j(Jn(),"orcha-runtime-artifacts"),s=u(t).replace(/[^A-Za-z0-9._-]+/g,"-").slice(0,80)||gt(),i=j(n,s),o=j(i,gt());return Ro(o,{recursive:!0}),{root:o,realRoot:Ut(o),sessionRoot:i,realSessionRoot:Ut(i)}}function Wo(e){let t=u(e?.artifactDirectory);if(!t)throw new Error("sandbox launch did not provide an artifact directory");return{root:t,realRoot:Ut(t),sessionRoot:"",realSessionRoot:""}}function rs(e){return u(d(e)?e.root:e)}function jn(e){let t=rs(e),r=u(d(e)?e.sessionRoot:No(t)),n=u(d(e)?e.realSessionRoot:"");if(r)try{if(n&&Ut(r)!==n)return;Io(r)}catch{}}function Xe(e,t={}){let r=rs(e),n=u(d(e)?e.realRoot:"");if(r){try{if(n&&Ut(r)!==n){_("warn","runtime.cli","runtime artifact directory cleanup skipped; path changed",{...t,artifactRoot:r});return}}catch{jn(e);return}try{Oo(r,{recursive:!0,force:!0})}catch(s){_("warn","runtime.cli","runtime artifact directory cleanup failed",{...t,artifactRoot:r,error:String(s?.message||s)});return}jn(e)}}function Ye(e,t,r=null){return{trustedFileRoots:[t,u(r?.artifactDirectory),u(r?.homeDirectory),...P(e.trustedArtifactRoots),...P(e.trustedFileRoots),...P(e.artifactRoots),...P(e.artifactFileRoots)].filter(Boolean),pathMappings:Array.isArray(r?.pathMappings)?r.pathMappings:[]}}function Qe(e){let t=u(e.codexSessionsRoot||e.codexSessionRoot);if(t)return t;let r=d(e.env)?e.env:{},n=u(e.codexHome||r.CODEX_HOME||process.env.CODEX_HOME)||j(Ao(),".codex");return j(n,"sessions")}function Xo(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 j(e,n,s,i)}function ns(e,t,r){let n=new Set;for(let s of[t-Zt,t,t+Zt,r-Zt,r,r+Zt])n.add(Xo(e,s));return[...n].filter(s=>Kn(s))}function Yo(e,t,r){let n=Qe(e),s=t-bo,i=r+Mo,o=[];for(let a of ns(n,t,r)){let c=[];try{c=zn(a)}catch{continue}for(let l of c){if(!l.endsWith(".jsonl"))continue;let p=j(a,l);try{let h=Co(p);if(!h.isFile()||h.mtimeMs<s||h.mtimeMs>i)continue;o.push({path:p,mtimeMs:h.mtimeMs})}catch{}}}return o.sort((a,c)=>c.mtimeMs-a.mtimeMs).slice(0,Uo)}function Qo(e,t,r=t){let n=Qe(e),s=new Set;for(let i of ns(n,t,r)){let o=[];try{o=zn(i)}catch{continue}for(let a of o)a.endsWith(".jsonl")&&s.add(j(i,a))}return s}function qe(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)qe(n,t,r+1);return}if(d(e))for(let n of["payload","item","text","delta","output_text","content","message","output","input","prompt","last_agent_message","revised_prompt"])n in e&&qe(e[n],t,r+1)}}function ss(e){return u(e).replace(/\s+/g," ")}function Zo(e){let t=ss(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 o of n){let a=t.slice(Math.max(0,o),Math.max(0,o)+r).trim();a.length>=40&&!s.has(a)&&(s.add(a),i.push(a))}return i}function ta(e,t){let r=Zo(t);if(!r.length)return!1;let n=[];for(let i of e)qe(i,n);let s=ss(n.join(" "));return r.every(i=>s.includes(i))}function ea(e){return e.find(t=>d(t)&&u(t.type)==="session_meta"&&d(t.payload))||null}function ra(e){let t=d(e?.payload)?e.payload:{},r=u(e?.timestamp||t.timestamp),n=Date.parse(r);return Number.isFinite(n)?n:Number.NaN}function na(e){let t=u(e.originator),r=u(e.source);if(t!=="codex_exec"&&r!=="exec"||u(e.parent_thread_id))return!1;let n=u(e.thread_source);if(n&&n!=="user")return!1;let s=u(e.session_id),i=u(e.id);return!(s&&i&&s!==i)}function sa(e,t,r){if(!ta(e,t.promptText))return!1;let n=ea(e);if(!n)return!1;let s=n.payload;if(!na(s))return!1;let i=ra(n);if(!Number.isFinite(i)||i<t.startedAtMs-5e3||i>r+5e3)return!1;let o=u(t.target.cwd),a=u(s.cwd);return!(o&&a&&Hn(o)!==Hn(a))}function qn(e){try{return oa(Vn(e,"utf8"))}catch{return null}}function ia(e,t,r){if(!e||e.disabled)return null;if(e.matchedPath){let s=qn(e.matchedPath);return s?{path:e.matchedPath,events:s}:null}let n=[];for(let s of Yo(e.target,e.startedAtMs,r)){if(e.baselinePaths.has(s.path))continue;let i=qn(s.path);!i||!sa(i,e,r)||n.push({path:s.path,events:i})}return n.length!==1?(n.length>1&&(e.disabled=!0,_("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,_("info","runtime.cli","codex transcript stream attached",{target:e.target.targetCode,sessionId:t}),n[0])}function oa(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 aa(e){if(!d(e))return!1;let t=d(e.payload)?e.payload:{},r=u(e.type),n=u(t.type);return r==="event_msg"&&n==="image_generation_end"||r==="response_item"&&n==="image_generation_call"}function ca(e){if(!d(e))return!1;let t=d(e.payload)?e.payload:{};return u(e.type)==="response_item"&&Do.has(u(t.type))}function ua(e){if(!d(e))return!1;let t=d(e.payload)?e.payload:{};return $o.has(u(t.type))}function la(e,t,r,n){let s=Xn(e),i=ze(e),o=0,a=0,c=0;if(s&&!i&&t.emitThoughtChunks&&es(t,r,n,s)&&(c=1),s&&i){let l=t.emittedTexts.size?`
17
+ ${c.text}`:c.text):c?.type==="tool_use"&&c.id&&(o(),i.push({sessionUpdate:"tool_call",toolCallId:c.id,title:c.name,status:"in_progress",rawInput:c.input}));return i}var lt=Object.freeze({codex:{label:"Codex",code:"CODEX",sessionDirectory:"codex-sessions",home:e=>e.env?.CODEX_HOME||process.env.CODEX_HOME||ut(He(),".codex"),threadId:e=>e?.type==="thread.started"?e.thread_id:void 0,resumeArgs(e,t){let r=e.indexOf("exec");if(r<0||e.includes("resume")||e.includes("--ephemeral"))throw X("BAD_REQUEST","Codex \u539F\u751F\u4F1A\u8BDD\u9700\u8981\u6807\u51C6 codex exec \u914D\u7F6E");return t?[...e.slice(0,r+1),"resume",t,...e.slice(r+1)]:e},mcpArgs:e=>["-c",`mcp_servers.orcha={url=${JSON.stringify(e)},bearer_token_env_var=${JSON.stringify(Fe)},required=true}`]},claude:{label:"Claude Code",code:"CLAUDE",sessionDirectory:"claude-sessions",home:e=>e.env?.CLAUDE_CONFIG_DIR||process.env.CLAUDE_CONFIG_DIR||ut(He(),".claude"),threadId:e=>e?.type==="system"&&e.subtype==="init"?e.session_id:void 0,resumeArgs(e,t){let r=e.indexOf("--output-format");if(!e.includes("-p")&&!e.includes("--print")||r<0||e[r+1]!=="stream-json"||!e.includes("--verbose")||e.some(n=>wo.has(n)))throw X("BAD_REQUEST","Claude Code \u539F\u751F\u4F1A\u8BDD\u9700\u8981\u6807\u51C6 claude -p --output-format stream-json --verbose \u914D\u7F6E");return t?[...e,"--resume",t]:e},mcpArgs:e=>["--mcp-config",JSON.stringify({mcpServers:{orcha:{type:"http",url:e,headers:{Authorization:`Bearer \${${Fe}}`}}}}),"--allowedTools","mcp__orcha"],control:{args:["--input-format","stream-json","--permission-prompt-tool","stdio"],prompt:e=>JSON.stringify({type:"user",message:{role:"user",content:e},parent_tool_use_id:null,session_id:""}),respond:Mn},taskMcpError(e){if(e?.type!=="system"||e.subtype!=="init")return null;let t=e.mcp_servers?.find(r=>r?.name==="orcha")?.status||"missing";return t==="connected"?null:X("RUNTIME_CLAUDE_MCP_UNAVAILABLE",`Claude Code \u672A\u80FD\u8FDE\u63A5 OrchaAI \u4EFB\u52A1\u5DE5\u5177\uFF08${t}\uFF09\uFF0C\u672C\u8F6E\u672A\u6267\u884C`)},progress:So}});async function $n(e,t,r){let n=await on(t,r?[An(r)]:[]);return{args:e.mcpArgs(n.url),environment:{[Fe]:n.token},refresh:s=>n.refresh(s),close:()=>n.close()}}var Qt=class{constructor(t,r,n=ut(He(),".orcha",lt[t].sessionDirectory)){this.adapter=lt[t],this.directory=ut(n,vn(r))}async turn(t,r,n,s,i){let{label:o,code:a}=this.adapter;if(!t)throw X("BAD_REQUEST",`${o} native turn requires a run ID`);Ln(this.directory,{recursive:!0,mode:448});let c=ut(this.directory,"active");try{Ln(c,{mode:448})}catch(f){throw f.code==="EEXIST"?X("RUNTIME_SESSION_BUSY",`${o} \u4EFB\u52A1\u4ECD\u5728\u8FD0\u884C\u6216\u4E0A\u8F6E\u5F02\u5E38\u4E2D\u65AD\uFF1B\u8BF7\u7B49\u5F85\u5B8C\u6210\uFF0C\u6216\u53D1\u9001 /new \u5F00\u59CB\u65B0\u4EFB\u52A1`):f}let l=ut(this.directory,"session.json"),p,h=()=>{let f=`${l}.${go()}.pending`;kn(f,JSON.stringify(p),{mode:384}),yo(f,l)};try{try{p=JSON.parse(_o(l,"utf8"))}catch(T){if(T.code!=="ENOENT")throw T}if(p&&!Dn.test(p.threadId||""))throw X("RUNTIME_OPERATION_NOT_FOUND",`${o} \u4E0A\u8F6E\u672A\u80FD\u4FDD\u5B58\u539F\u751F\u4F1A\u8BDD\u6807\u8BC6\uFF0C\u8BF7\u53D1\u9001 /new`);try{kn(ut(this.directory,`${vn(t)}.run`),"",{flag:"wx",mode:384})}catch(T){throw T.code==="EEXIST"?X("RUNTIME_OPERATION_NOT_FOUND",`\u6B64\u8F6E ${o} \u5DF2\u6267\u884C\u6216\u6267\u884C\u7ED3\u679C\u4E0D\u786E\u5B9A\uFF0C\u4E0D\u80FD\u91CD\u590D\u53D1\u9001`):T}p||={threadId:null},h();let f,m=T=>{if(f)return;let x=T.update?.sessionUpdate==="runtime_event"?this.adapter.threadId(T.update.event):void 0;if(x!==void 0)try{if(!Dn.test(x||"")||p.threadId&&p.threadId!==x)throw X(`${a}_SESSION_MISMATCH`,`${o} \u8FD4\u56DE\u4E86\u4E0D\u540C\u7684\u539F\u751F\u4F1A\u8BDD\uFF0C\u8BF7\u53D1\u9001 /new`);p.threadId=x,h()}catch(w){f=w,i();return}n(T)},g=await r(p.threadId,m,T=>{!f&&p.threadId&&s?.(T)});if(f)throw f;if(!p.threadId)throw X(`${a}_SESSION_MISSING`,`${o} \u6CA1\u6709\u8FD4\u56DE\u539F\u751F\u4F1A\u8BDD\u6807\u8BC6\uFF0C\u8BF7\u68C0\u67E5 CLI \u7248\u672C\u5E76\u53D1\u9001 /new`);return g}finally{To(c,{recursive:!0})}}};var Wn=5e3,No=2*60*1e3,Mo=2*60*1e3,Uo=12,Po=1e3,Lo=1500,ko=1e3,vo=/^(?:task|session)-[1-9]\d*(?::[1-9]\d*){4}(?![\s\S])/,Zt=24*60*60*1e3,Ut=new Set(["final_answer","final","complete","completed","done"]),Do=new Set(["function_call","function_call_output","custom_tool_call","custom_tool_call_output","local_shell_call","local_shell_call_output","mcp_tool_call","mcp_tool_call_output","web_search_call","image_generation_call","image_generation_end"]),$o=new Set(["context_compacted","context_compaction","context_compressed"]);function ee(e,t){if(e?.pid){if(process.platform==="win32"){let r=["/PID",String(e.pid),"/T"];t==="SIGKILL"&&r.push("/F");try{Gn("taskkill",r,{stdio:"ignore",windowsHide:!0}).unref?.()}catch{try{e.kill(t)}catch{}}return}try{process.kill(-e.pid,t)}catch(r){if(r?.code==="ESRCH")return;try{e.kill(t)}catch{}}}}function yt(e){ee(e,"SIGTERM");let t=setTimeout(()=>ee(e,"SIGKILL"),Wn);return t.unref?.(),t}function B(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(t=>B(t)).join("");if(!d(e))return"";for(let t of["text","delta","output_text","content","message","output"]){let r=B(e[t]);if(r)return r}return""}function Xn(e){if(!d(e))return"";let t=d(e.payload)?e.payload:{};if(u(e.type)==="event_msg"){if(u(t.type)==="agent_message")return u(t.message);if(u(t.type)==="task_complete")return u(t.last_agent_message)}if(u(e.type)==="response_item"&&u(t.type)==="message"&&u(t.role)==="assistant")return B(t.content)||B(t.message);if(u(e.type)==="result")return B(e.result);let r=B(e.delta)||B(e.text)||B(e.content);if(r)return r;let n=d(e.item)?e.item:{};return["message","agent_message"].includes(u(n.type))||u(n.role)==="assistant"?B(n.content)||B(n.text)||B(n.message):""}function Yn(e,t){e.explicitFileDelivery||Jt(e.artifacts,Le(t,{source:"codex_cli_image_generation",...e.artifactOptions}))}function Qn(e){return it(ke(e))}function Ke(e){if(!d(e))return!1;let t=d(e.payload)?e.payload:{},r=u(e.type),n=u(t.type);if(r==="event_msg"&&n==="task_complete")return!0;let s=u(t.phase||t.status||t.stage).toLowerCase();if(r==="event_msg"&&n==="agent_message"||r==="response_item"&&n==="message"&&u(t.role)==="assistant")return Ut.has(s);let i=d(e.item)?e.item:{};return r==="item.completed"&&u(i.type)==="agent_message"?!0:r==="result"&&e.is_error!==!0?u(e.result).length>0:!1}function re(e){let t=u(e.terminalProtocol||e.eventProtocol).toLowerCase();if(t)return t;let r=Ge(u(e.command)).replace(/\.exe$/i,"").toLowerCase();return r==="codex"||r==="claude"?r:""}function Fn(e,t,r){let n=d(t.error)?t.error:{},s=u(n.message)||B(t.error)||u(t.result)||u(t.message)||r;return Object.assign(new Error(s),{code:e})}function Ho(e,t){if(!d(e))return null;let r=u(e.type).toLowerCase();if(t==="codex")return r==="turn.completed"?{status:"completed",result:{stopReason:"end_turn"}}:r==="turn.failed"?{status:"failed",error:Fn("RUNTIME_CODEX_TURN_FAILED",e,"Codex turn failed")}:null;if(t==="claude"&&r==="result"){let n=u(e.subtype).toLowerCase();return e.is_error===!0||n.startsWith("error")||["failed","failure"].includes(n)?{status:"failed",error:Fn("RUNTIME_CLAUDE_RESULT_FAILED",e,"Claude result failed")}:{status:"completed",result:{stopReason:"end_turn",...u(e.result)?{output:u(e.result)}:{}}}}return null}function Bn(e){return d(e)?u(e.phase||e.status||e.stage).toLowerCase():""}function Fo(e){if(!d(e)||Ke(e))return!1;let t=d(e.payload)?e.payload:{},r=u(e.type),n=u(t.type),s=Bn(t);if(r==="event_msg"&&n==="agent_message"||r==="response_item"&&n==="message"&&u(t.role)==="assistant")return!!(s&&!Ut.has(s));let i=d(e.item)?e.item:{},o=Bn(i);return u(i.role)==="assistant"||u(i.type)==="message"?!!(o&&!Ut.has(o)):!1}function Bo(e,t,r){return r.captureLastMessage===!1||t.includes("--output-last-message")||t.includes("-o")?!1:r.captureLastMessage===!0?!0:Ge(e)==="codex"}function jo(e,t){return t.collectCodexTranscriptArtifacts===!1?!1:t.collectCodexTranscriptArtifacts===!0?!0:Ge(e)==="codex"}function Zn(e){return Math.max(20,R(e.codexTranscriptPollMs||e.transcriptPollMs,Po))}function qo(e){return Math.max(0,R(e.codexFinalOutputWaitMs||e.finalOutputWaitMs,Lo))}function ne(e){if(typeof e=="boolean")return e;let t=u(e).toLowerCase();return["true","1","yes","y","on"].includes(t)?!0:["false","0","no","n","off"].includes(t)?!1:null}function ze(e){let t=d(e?.metadata)?e.metadata:{};return d(t._runtimeBridge)?t._runtimeBridge:{}}function Be(e){return u(ze(e).promptKind).toLowerCase()}function Go(e,t){for(let r of[e.codexTranscriptStreaming,e.streamCodexTranscript]){let n=ne(r);if(n!=null)return n}return Be(t)==="chat"}function Ve(e,t){let r=ze(e);for(let s of[r.emitThoughtChunks,r.streamThoughts]){let i=ne(s);if(i!=null)return i}let n=Be(e);if(n&&n!=="chat")return!1;for(let s of[t.emitThoughtChunks,t.streamThoughts]){let i=ne(s);if(i!=null)return i}return Be(e)==="chat"}function Ko(e){let t=ze(e);for(let r of[t.finalTextOnly,t.finalOutputOnly]){let n=ne(r);if(n!=null)return n}return null}function zo(e,t){let r=Ko(e);return r??(t.finalTextOnly===!0||t.finalOutputOnly===!0?!0:(t.finalTextOnly===!1||t.finalOutputOnly===!1,!1))}function Vo(e,t){return!e.finalTextOnly||t}function ts(e,t,r,n,s=n){return!n||e.emittedTexts.has(s)?!1:(e.emittedTexts.add(s),r({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:n}}}),!0)}function es(e,t,r,n){return!n||e.emittedThoughtTexts.has(n)?!1:(e.emittedThoughtTexts.add(n),r({sessionId:t,update:{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:n}}}),!0)}function Jo(e,t,r,n=new Set){return{target:e,promptText:t,startedAtMs:r,baselinePaths:n,matchedPath:"",disabled:!1,processedLines:new Map}}function Je(e,t){let r=d(e.env)?e.env:{},n=u(e.artifactRoot||e.artifactDir||e.runtimeArtifactRoot||r.ORCHA_RUNTIME_ARTIFACT_DIR)||j(Jn(),"orcha-runtime-artifacts"),s=u(t).replace(/[^A-Za-z0-9._-]+/g,"-").slice(0,80)||_t(),i=j(n,s),o=j(i,_t());return Ro(o,{recursive:!0}),{root:o,realRoot:Pt(o),sessionRoot:i,realSessionRoot:Pt(i)}}function Wo(e){let t=u(e?.artifactDirectory);if(!t)throw new Error("sandbox launch did not provide an artifact directory");return{root:t,realRoot:Pt(t),sessionRoot:"",realSessionRoot:""}}function rs(e){return u(d(e)?e.root:e)}function jn(e){let t=rs(e),r=u(d(e)?e.sessionRoot:bo(t)),n=u(d(e)?e.realSessionRoot:"");if(r)try{if(n&&Pt(r)!==n)return;Io(r)}catch{}}function We(e,t={}){let r=rs(e),n=u(d(e)?e.realRoot:"");if(r){try{if(n&&Pt(r)!==n){_("warn","runtime.cli","runtime artifact directory cleanup skipped; path changed",{...t,artifactRoot:r});return}}catch{jn(e);return}try{Oo(r,{recursive:!0,force:!0})}catch(s){_("warn","runtime.cli","runtime artifact directory cleanup failed",{...t,artifactRoot:r,error:String(s?.message||s)});return}jn(e)}}function Xe(e,t,r=null){return{trustedFileRoots:[t,u(r?.artifactDirectory),u(r?.homeDirectory),...P(e.trustedArtifactRoots),...P(e.trustedFileRoots),...P(e.artifactRoots),...P(e.artifactFileRoots)].filter(Boolean),pathMappings:Array.isArray(r?.pathMappings)?r.pathMappings:[]}}function Ye(e){let t=u(e.codexSessionsRoot||e.codexSessionRoot);if(t)return t;let r=d(e.env)?e.env:{},n=u(e.codexHome||r.CODEX_HOME||process.env.CODEX_HOME)||j(Ao(),".codex");return j(n,"sessions")}function Xo(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 j(e,n,s,i)}function ns(e,t,r){let n=new Set;for(let s of[t-Zt,t,t+Zt,r-Zt,r,r+Zt])n.add(Xo(e,s));return[...n].filter(s=>Kn(s))}function Yo(e,t,r){let n=Ye(e),s=t-No,i=r+Mo,o=[];for(let a of ns(n,t,r)){let c=[];try{c=zn(a)}catch{continue}for(let l of c){if(!l.endsWith(".jsonl"))continue;let p=j(a,l);try{let h=Co(p);if(!h.isFile()||h.mtimeMs<s||h.mtimeMs>i)continue;o.push({path:p,mtimeMs:h.mtimeMs})}catch{}}}return o.sort((a,c)=>c.mtimeMs-a.mtimeMs).slice(0,Uo)}function Qo(e,t,r=t){let n=Ye(e),s=new Set;for(let i of ns(n,t,r)){let o=[];try{o=zn(i)}catch{continue}for(let a of o)a.endsWith(".jsonl")&&s.add(j(i,a))}return s}function je(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)je(n,t,r+1);return}if(d(e))for(let n of["payload","item","text","delta","output_text","content","message","output","input","prompt","last_agent_message","revised_prompt"])n in e&&je(e[n],t,r+1)}}function ss(e){return u(e).replace(/\s+/g," ")}function Zo(e){let t=ss(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 o of n){let a=t.slice(Math.max(0,o),Math.max(0,o)+r).trim();a.length>=40&&!s.has(a)&&(s.add(a),i.push(a))}return i}function ta(e,t){let r=Zo(t);if(!r.length)return!1;let n=[];for(let i of e)je(i,n);let s=ss(n.join(" "));return r.every(i=>s.includes(i))}function ea(e){return e.find(t=>d(t)&&u(t.type)==="session_meta"&&d(t.payload))||null}function ra(e){let t=d(e?.payload)?e.payload:{},r=u(e?.timestamp||t.timestamp),n=Date.parse(r);return Number.isFinite(n)?n:Number.NaN}function na(e){let t=u(e.originator),r=u(e.source);if(t!=="codex_exec"&&r!=="exec"||u(e.parent_thread_id))return!1;let n=u(e.thread_source);if(n&&n!=="user")return!1;let s=u(e.session_id),i=u(e.id);return!(s&&i&&s!==i)}function sa(e,t,r){if(!ta(e,t.promptText))return!1;let n=ea(e);if(!n)return!1;let s=n.payload;if(!na(s))return!1;let i=ra(n);if(!Number.isFinite(i)||i<t.startedAtMs-5e3||i>r+5e3)return!1;let o=u(t.target.cwd),a=u(s.cwd);return!(o&&a&&Hn(o)!==Hn(a))}function qn(e){try{return oa(Vn(e,"utf8"))}catch{return null}}function ia(e,t,r){if(!e||e.disabled)return null;if(e.matchedPath){let s=qn(e.matchedPath);return s?{path:e.matchedPath,events:s}:null}let n=[];for(let s of Yo(e.target,e.startedAtMs,r)){if(e.baselinePaths.has(s.path))continue;let i=qn(s.path);!i||!sa(i,e,r)||n.push({path:s.path,events:i})}return n.length!==1?(n.length>1&&(e.disabled=!0,_("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,_("info","runtime.cli","codex transcript stream attached",{target:e.target.targetCode,sessionId:t}),n[0])}function oa(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 aa(e){if(!d(e))return!1;let t=d(e.payload)?e.payload:{},r=u(e.type),n=u(t.type);return r==="event_msg"&&n==="image_generation_end"||r==="response_item"&&n==="image_generation_call"}function ca(e){if(!d(e))return!1;let t=d(e.payload)?e.payload:{};return u(e.type)==="response_item"&&Do.has(u(t.type))}function ua(e){if(!d(e))return!1;let t=d(e.payload)?e.payload:{};return $o.has(u(t.type))}function la(e,t,r,n){let s=Xn(e),i=Ke(e),o=0,a=0,c=0;if(s&&!i&&t.emitThoughtChunks&&es(t,r,n,s)&&(c=1),s&&i){let l=t.emittedTexts.size?`
18
18
 
19
- ${s}`:s;ts(t,r,n,l,s)&&(o=1,a=1)}return s&&i&&(t.finalTextSeen=!0),Yn(t,e),(aa(e)||ca(e)||ua(e)||i)&&n({sessionId:r,update:{sessionUpdate:"runtime_event",event:Qn(e)}}),{textCount:o,finalTextCount:a,thoughtCount:c}}function Ge(e,t,r,n,s=Date.now()){if(!t)return{artifactCount:0,transcriptCount:0,textCount:0,finalTextCount:0,thoughtCount:0};let i=e.artifacts.size,o=0,a=0,c=0,l=0,p=ia(t,r,s);if(p){let h=Math.min(t.processedLines.get(p.path)||0,p.events.length),f=e.artifacts.size;for(let m of p.events.slice(h)){let y=la(m,e,r,n);a+=y.textCount,c+=y.finalTextCount,l+=y.thoughtCount}t.processedLines.set(p.path,p.events.length),(p.events.length>h||e.artifacts.size>f)&&(o=1)}return{artifactCount:e.artifacts.size-i,transcriptCount:o,textCount:a,finalTextCount:c,thoughtCount:l}}function da(e,{remove:t=!0}={}){if(!e||!Kn(e))return"";try{return Vn(e,"utf8").trim()}catch{return""}finally{t&&te(e)}}function te(e){if(e)try{xo(e)}catch{}}function pa(e,t){return{artifactCount:(e?.artifactCount||0)+(t?.artifactCount||0),transcriptCount:(e?.transcriptCount||0)+(t?.transcriptCount||0),textCount:(e?.textCount||0)+(t?.textCount||0),finalTextCount:(e?.finalTextCount||0)+(t?.finalTextCount||0),thoughtCount:(e?.thoughtCount||0)+(t?.thoughtCount||0)}}function fa(e){return new Promise(t=>setTimeout(t,e))}function ha(e,t,r,n){return n?(e.finalTextSeen=!0,e.emittedTexts.has(n)||(e.emittedTexts.add(n),r({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:n}}})),!0):!1}async function ma(e,t,r,n,s,i){let o=Ge(e,t,r,n,Date.now()),a=()=>ha(e,r,n,da(s,{remove:!1}));if(a()||e.finalTextSeen)return te(s),o;let c=qo(i);if(c<=0||!t&&!s)return te(s),o;let l=Date.now()+c,p=Math.min(Zn(i),100);for(;!e.finalTextSeen&&Date.now()<l&&(await fa(Math.min(p,Math.max(0,l-Date.now()))),o=pa(o,Ge(e,t,r,n,Date.now())),!a()););return te(s),o}var yt=class{constructor(t,r,n={},s={}){this.agent=t,this.target=r,this.options=n,this.callbacks=s,this.active=new Map;let i=re(r);if(this.adapter=Object.hasOwn(ct,i)?ct[i]:null,n.source==="ai_chat_runtime_node"&&this.adapter){let{label:o}=this.adapter;if(typeof n.cloudSessionId!="string"||!vo.test(n.cloudSessionId))throw Object.assign(new Error(`${o} \u539F\u751F\u4F1A\u8BDD\u6807\u8BC6\u65E0\u6548\uFF1A\u9700\u8981\u5B8C\u6574\u7684\u4EFB\u52A1\u6216\u4F1A\u8BDD\u9694\u79BB\u6807\u8BC6`),{code:"BAD_REQUEST"});if(!n.orchaUrl)throw Object.assign(new Error(`${o} \u539F\u751F\u4F1A\u8BDD\u7F3A\u5C11 OrchaAI \u670D\u52A1\u5730\u5740\uFF0C\u8BF7\u91CD\u65B0\u8FDE\u63A5\u8BBE\u5907`),{code:"BAD_REQUEST"});if(n.prepareLaunch)throw Object.assign(new Error(`${o} \u539F\u751F\u4F1A\u8BDD\u4E0D\u652F\u6301\u6C99\u7BB1\u542F\u52A8\uFF0C\u8BF7\u4F7F\u7528\u5DF2\u63A5\u5165\u7684\u672C\u673A\u8BBE\u5907`),{code:"BAD_REQUEST"});this.nativeSession=new Qt(i,[n.orchaUrl,t.agentId,t.targetCode,n.cloudSessionId,J(r,t.workspace),r.command,this.adapter.home(r)])}}async sessionNew(t={}){let r=t.mcpServers||[];if(r.length&&(t.metadata?.source==="conversation_delegation"||this.nativeSession)&&this.adapter){if(this.options.prepareLaunch)throw Object.assign(new Error(`${this.adapter.label} task MCP requires a reachable node-local transport; this sandbox launcher does not provide one`),{code:"unsupported_dynamic_mcp"});this.explicitFileDelivery=!0,this.taskMcp=await $n(this.adapter,r,()=>({cwd:this.deliveryCwd,roots:[...this.deliveryRoots||[],...this.deliveryThreadId?[j(Qe(this.target),"..","generated_images",this.deliveryThreadId)]:[]]}),(n,s)=>this.requestApproval(n,s))}else if(r.length&&t.metadata?.source==="conversation_delegation")throw Object.assign(new Error("This CLI adapter does not support task-scoped MCP"),{code:"unsupported_dynamic_mcp"});return{sessionId:`cli-${this.agent.agentId}-${gt()}`}}async requestApproval(t,{signal:r,maxTimeoutMs:n}={}){let s=this.approvalTurn;return!s||!this.callbacks.onPermissionRequest?{outcome:"denied",reason:"no active OrchaAI turn"}:this.callbacks.onPermissionRequest({agent:this.agent,runtimeSessionId:s.sessionId,request:t,emitUpdate:s.emitUpdate,maxTimeoutMs:n,signal:r?AbortSignal.any([s.ended.signal,r]):s.ended.signal})}async refreshMcpServers(t){if(!this.taskMcp)throw Object.assign(new Error("The original Codex MCP binding is unavailable"),{code:"RUNTIME_OPERATION_NOT_FOUND"});await this.taskMcp.refresh(t)}async sessionPrompt(t,r,n){return this.nativeSession?this.nativeSession.turn(this.options.runId,(s,i,o)=>this.runPrompt(t,i,o,s),s=>{let i=s.update?.event;i?.type==="thread.started"&&(this.deliveryThreadId=i.thread_id),r(s)},n,()=>this.sessionCancel(t)):this.runPrompt(t,r,n)}async runPrompt(t,r,n,s){let i=Date.now(),o=u(this.target.command);if(!o)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);let a=u(t.sessionId)||gt(),c=ht(t.prompt),l=u(this.target.promptMode||"stdin"),p=this.buildArgs(l,c),h=[...this.taskMcp?.args||[],...this.nativeSession?this.adapter.resumeArgs(p,s):p],f=J(this.target,this.agent.workspace),m=typeof this.options.prepareLaunch=="function",T=Bo(o,h,this.target)?m?`/tmp/orcha-runtime-last-message-${gt()}.txt`:j(Jn(),`orcha-runtime-last-message-${gt()}.txt`):"";T&&h.push("--output-last-message",T);let C={...d(this.target.env)?this.target.env:{},...this.taskMcp?.environment||{},...l==="env"?{ORCHA_RUNTIME_PROMPT:c}:{},ORCHA_AGENT_ID:this.agent.agentId,ORCHA_SESSION_ID:a},w=m?await this.options.prepareLaunch({command:o,args:h,cwd:f,environment:C}):{command:o,args:h,cwd:f,environment:{...process.env,...C},cleanup:async()=>{}},x=m?Wo(w):We(this.target,a),g=x.root,E=Ye(this.target,g,w);this.deliveryCwd=f,this.deliveryRoots=[f,...E.trustedFileRoots].filter(Boolean),this.deliveryThreadId=s||null;let b=jo(o,this.target),A={...this.target,targetCode:this.agent.targetCode,cwd:f,...m?{codexHome:j(w.homeDirectory,".codex")}:{}},S=b?Qo(A,i):new Set,I=m&&T?j(w.tempDirectory,T.slice(5)):T,O=R(this.target.timeoutMs||this.target.sessionPromptTimeoutMs,R(this.options.sessionPromptTimeoutMs,z));m||(w.environment.ORCHA_RUNTIME_ARTIFACT_DIR=g);let k={sessionId:a,emitUpdate:r,ended:new AbortController};this.approvalTurn=k;let M=Gn(w.command,w.args,{cwd:w.cwd,env:w.environment,stdio:["pipe","pipe","pipe"],detached:process.platform!=="win32",windowsHide:!0});this.active.set(a,M),_("info","runtime.cli","runtime prompt started",{target:this.agent.targetCode,sessionId:a,pid:M.pid,timeoutMs:O,isolation:w.isolation});let $t="",Te=u(this.target.outputMode||"text"),v={explicitFileDelivery:this.explicitFileDelivery,artifacts:new Map,emittedTexts:new Set,emittedThoughtTexts:new Set,value:"",artifactOptions:E,finalTextSeen:!1,finalTextOnly:zo(t,this.target),emitThoughtChunks:Je(t,this.target),terminalOutcome:null,terminalProtocol:re(this.target),emitTerminal:null,progress:{}},we=b?Jo(A,c,i,S):null;return M.stdout.setEncoding("utf8"),M.stdout.on("data",ft=>this.handleStdout(ft,Te,v,a,r)),M.stderr.setEncoding("utf8"),M.stderr.on("data",ft=>{$t+=ft,this.target.emitStderr===!0&&r({sessionId:a,update:{sessionUpdate:"runtime_stderr_chunk",content:{type:"text",text:ft}}})}),l==="stdin"?M.stdin.end(c):M.stdin.end(),await new Promise((ft,Ee)=>{let Ot=!1,jr=!1,Ht=null,It=null,Se=we&&Go(this.target,t)?setInterval(()=>{try{Ge(v,we,a,r)}catch(U){_("warn","runtime.cli","codex transcript stream poll failed",{target:this.agent.targetCode,sessionId:a,error:String(U?.message||U)})}},Zn(this.target)):null;Se?.unref?.();let qr=setTimeout(()=>{jr=!0,_("warn","runtime.cli","runtime prompt timed out; terminating child",{target:this.agent.targetCode,sessionId:a,pid:M.pid,timeoutMs:O}),ee(M,"SIGTERM"),Ht=setTimeout(()=>{_("warn","runtime.cli","runtime prompt force killing child",{target:this.agent.targetCode,sessionId:a,pid:M.pid}),ee(M,"SIGKILL")},Wn),Ht.unref?.(),Ct(Object.assign(new Error(`runtime CLI timed out after ${O}ms`),{code:"RUNTIME_CLI_TIMEOUT"}))},O);qr.unref?.();let Gr=async()=>{clearTimeout(qr),It&&clearTimeout(It),Se&&clearInterval(Se),Ht&&!jr&&clearTimeout(Ht),k.ended.abort(),this.approvalTurn===k&&(this.approvalTurn=null),Xe(x,{target:this.agent.targetCode,sessionId:a}),this.active.delete(a),v.emitTerminal=null,await w.cleanup?.()},Vs=U=>{Ot||(Ot=!0,Gr().then(()=>ft(U),Ee))},Ct=U=>{Ot||(Ot=!0,Gr().then(()=>Ee(U),G=>{_("warn","runtime.cli","sandbox launch cleanup failed",{target:this.agent.targetCode,sessionId:a,error:String(G?.message||G)}),Ee(U)}))};v.emitTerminal=U=>{let G={...d(U.result)?U.result:{},_artifacts:[...v.artifacts.values()]};try{n?.({...U,result:G})}catch(rt){_("warn","runtime.cli","runtime terminal listener failed",{target:this.agent.targetCode,sessionId:a,error:String(rt?.message||rt)})}let q=Math.max(0,R(this.target.terminalExitGraceMs,ko));It=setTimeout(()=>{It=null,!(Ot||this.active.get(a)!==M)&&(_("warn","runtime.cli","runtime stayed alive after terminal event; terminating child",{target:this.agent.targetCode,sessionId:a,pid:M.pid,terminalProtocol:v.terminalProtocol,graceMs:q}),_t(M))},q),It.unref?.()},M.on("error",U=>{_("warn","runtime.cli","runtime child error",{target:this.agent.targetCode,sessionId:a,pid:M.pid,error:String(U?.message||U)}),Ct(U)}),M.on("exit",(U,G)=>{(async()=>{Te==="json-lines"&&v.value.trim()&&this.handleStdout(`
20
- `,Te,v,a,r);let q=await ma(v,we,a,r,I,this.target);(q.artifactCount>0||q.textCount>0||q.thoughtCount>0)&&_("info","runtime.cli","codex transcript updates collected",{target:this.agent.targetCode,sessionId:a,artifactCount:q.artifactCount,textCount:q.textCount,finalTextCount:q.finalTextCount,thoughtCount:q.thoughtCount,transcriptCount:q.transcriptCount});let rt=$t.trim();if(rt&&_("debug","runtime.cli","runtime stderr",{target:this.agent.targetCode,sessionId:a,stderr:rt}),_("info","runtime.cli","runtime prompt finished",{target:this.agent.targetCode,sessionId:a,pid:M.pid,exitCode:U,signal:G,artifactCount:v.artifacts.size,finalTextSeen:v.finalTextSeen}),v.terminalOutcome?.status==="failed"){Ct(v.terminalOutcome.error);return}if(U!==0&&v.terminalOutcome?.status!=="completed"){let Js=Object.assign(new Error(`runtime CLI exited with code ${U??"unknown"}${G?` (${G})`:""}`),{code:"RUNTIME_CLI_EXIT_NONZERO",exitCode:U,signal:G});Ct(Js);return}Vs({stopReason:"end_turn",exitCode:U,signal:G,_artifacts:[...v.artifacts.values()],...rt?{stderr:rt}:{}})})().catch(Ct)})})}buildArgs(t,r){let n=P(this.target.args);return t==="args"?[...n,r]:n}handleStdout(t,r,n,s,i){if(r!=="json-lines"){i({sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:t}}});return}n.value+=t;let o=n.value.split(/\r?\n/);n.value=o.pop()||"";for(let a of o){let c=a.trim();if(c)try{let l=JSON.parse(c);!this.nativeSession&&l.type==="thread.started"&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(l.thread_id||"")&&(this.deliveryThreadId=l.thread_id);let p=this.taskMcp&&this.adapter?.taskMcpError?.(l);if(p){n.terminalOutcome||(n.terminalOutcome={status:"failed",error:p},n.emitTerminal?.(n.terminalOutcome)),_t(this.active.get(s));continue}Yn(n,l);let h=this.adapter?.progress?.(l,n.progress,{emitThoughts:n.emitThoughtChunks,streamText:!n.finalTextOnly});for(let C of h||[{sessionUpdate:"runtime_event",event:Qn(l)}])i({sessionId:s,update:C});let f=Xn(l),m=ze(l),y=h?"":f;y&&n.emitThoughtChunks&&!m&&Fo(l)?es(n,s,i,y):y&&Vo(n,m)&&ts(n,s,i,y),f&&m&&(n.finalTextSeen=!0);let T=Ho(l,n.terminalProtocol);T&&!n.terminalOutcome&&(T.status==="failed"||n.finalTextSeen||n.artifacts.size>0)&&(n.terminalOutcome=T,n.emitTerminal?.(T))}catch{i({sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`${a}
21
- `}}})}}}async sessionCancel(t){let r=u(t.sessionId),n=this.active.get(r);return n?(_("info","runtime.cli","cancelling runtime child",{target:this.agent.targetCode,sessionId:r,pid:n.pid}),_t(n),{ok:!0,cancelled:!0}):{ok:!0,cancelled:!1}}async stop(t="stop"){for(let[r,n]of this.active.entries())_("info","runtime.cli","stopping runtime child",{target:this.agent.targetCode,sessionId:r,pid:n.pid,reason:t}),_t(n);this.active.clear(),await this.taskMcp?.close(),this.taskMcp=null}};import{spawn as ga}from"node:child_process";import{randomUUID as _a}from"node:crypto";import{createInterface as ya}from"node:readline";var Ta=new Set(["item/commandExecution/requestApproval","item/fileChange/requestApproval","item/permissions/requestApproval"]),wa={commandExecution:"shell",fileChange:"apply_patch",webSearch:"web_search",imageGeneration:"image_generation",imageView:"view_image"},Ea=new Set(["failed","declined"]);function as(e){return re(e)==="codex"&&P(e.args)[0]==="app-server"}function Tt(e,t){return Object.assign(new Error(t),{code:e})}function is(e){return e.type==="mcpToolCall"?`mcp__${e.server}__${e.tool}`:e.type==="dynamicToolCall"||e.type==="collabAgentToolCall"?u(e.tool)||e.type:wa[e.type]||""}function Sa(e){if(e.type==="commandExecution")return{command:e.command,cwd:e.cwd};if(e.type==="fileChange")return{paths:(e.changes||[]).map(i=>i?.path).filter(Boolean)};if(e.type==="mcpToolCall"||e.type==="dynamicToolCall")return ot(e.arguments);let{id:t,type:r,status:n,...s}=e;return ot(s)}function os(e){return Array.isArray(e)?e.filter(t=>t?.type==="text").map(t=>t.text).join(`
19
+ ${s}`:s;ts(t,r,n,l,s)&&(o=1,a=1)}return s&&i&&(t.finalTextSeen=!0),Yn(t,e),(aa(e)||ca(e)||ua(e)||i)&&n({sessionId:r,update:{sessionUpdate:"runtime_event",event:Qn(e)}}),{textCount:o,finalTextCount:a,thoughtCount:c}}function qe(e,t,r,n,s=Date.now()){if(!t)return{artifactCount:0,transcriptCount:0,textCount:0,finalTextCount:0,thoughtCount:0};let i=e.artifacts.size,o=0,a=0,c=0,l=0,p=ia(t,r,s);if(p){let h=Math.min(t.processedLines.get(p.path)||0,p.events.length),f=e.artifacts.size;for(let m of p.events.slice(h)){let g=la(m,e,r,n);a+=g.textCount,c+=g.finalTextCount,l+=g.thoughtCount}t.processedLines.set(p.path,p.events.length),(p.events.length>h||e.artifacts.size>f)&&(o=1)}return{artifactCount:e.artifacts.size-i,transcriptCount:o,textCount:a,finalTextCount:c,thoughtCount:l}}function da(e,{remove:t=!0}={}){if(!e||!Kn(e))return"";try{return Vn(e,"utf8").trim()}catch{return""}finally{t&&te(e)}}function te(e){if(e)try{xo(e)}catch{}}function pa(e,t){return{artifactCount:(e?.artifactCount||0)+(t?.artifactCount||0),transcriptCount:(e?.transcriptCount||0)+(t?.transcriptCount||0),textCount:(e?.textCount||0)+(t?.textCount||0),finalTextCount:(e?.finalTextCount||0)+(t?.finalTextCount||0),thoughtCount:(e?.thoughtCount||0)+(t?.thoughtCount||0)}}function fa(e){return new Promise(t=>setTimeout(t,e))}function ha(e,t,r,n){return n?(e.finalTextSeen=!0,e.emittedTexts.has(n)||(e.emittedTexts.add(n),r({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:n}}})),!0):!1}async function ma(e,t,r,n,s,i){let o=qe(e,t,r,n,Date.now()),a=()=>ha(e,r,n,da(s,{remove:!1}));if(a()||e.finalTextSeen)return te(s),o;let c=qo(i);if(c<=0||!t&&!s)return te(s),o;let l=Date.now()+c,p=Math.min(Zn(i),100);for(;!e.finalTextSeen&&Date.now()<l&&(await fa(Math.min(p,Math.max(0,l-Date.now()))),o=pa(o,qe(e,t,r,n,Date.now())),!a()););return te(s),o}var Tt=class{constructor(t,r,n={},s={}){this.agent=t,this.target=r,this.options=n,this.callbacks=s,this.active=new Map;let i=re(r);if(this.adapter=Object.hasOwn(lt,i)?lt[i]:null,n.source==="ai_chat_runtime_node"&&this.adapter){let{label:o}=this.adapter;if(typeof n.cloudSessionId!="string"||!vo.test(n.cloudSessionId))throw Object.assign(new Error(`${o} \u539F\u751F\u4F1A\u8BDD\u6807\u8BC6\u65E0\u6548\uFF1A\u9700\u8981\u5B8C\u6574\u7684\u4EFB\u52A1\u6216\u4F1A\u8BDD\u9694\u79BB\u6807\u8BC6`),{code:"BAD_REQUEST"});if(!n.orchaUrl)throw Object.assign(new Error(`${o} \u539F\u751F\u4F1A\u8BDD\u7F3A\u5C11 OrchaAI \u670D\u52A1\u5730\u5740\uFF0C\u8BF7\u91CD\u65B0\u8FDE\u63A5\u8BBE\u5907`),{code:"BAD_REQUEST"});if(n.prepareLaunch)throw Object.assign(new Error(`${o} \u539F\u751F\u4F1A\u8BDD\u4E0D\u652F\u6301\u6C99\u7BB1\u542F\u52A8\uFF0C\u8BF7\u4F7F\u7528\u5DF2\u63A5\u5165\u7684\u672C\u673A\u8BBE\u5907`),{code:"BAD_REQUEST"});this.nativeSession=new Qt(i,[n.orchaUrl,t.agentId,t.targetCode,n.cloudSessionId,W(r,t.workspace),r.command,this.adapter.home(r)])}}async sessionNew(t={}){let r=t.mcpServers||[];if(r.length&&(t.metadata?.source==="conversation_delegation"||this.nativeSession)&&this.adapter){if(this.options.prepareLaunch)throw Object.assign(new Error(`${this.adapter.label} task MCP requires a reachable node-local transport; this sandbox launcher does not provide one`),{code:"unsupported_dynamic_mcp"});this.explicitFileDelivery=!0,this.taskMcp=await $n(this.adapter,r,()=>({cwd:this.deliveryCwd,roots:[...this.deliveryRoots||[],...this.deliveryThreadId?[j(Ye(this.target),"..","generated_images",this.deliveryThreadId)]:[]]}))}else if(r.length&&t.metadata?.source==="conversation_delegation")throw Object.assign(new Error("This CLI adapter does not support task-scoped MCP"),{code:"unsupported_dynamic_mcp"});return{sessionId:`cli-${this.agent.agentId}-${_t()}`}}async requestApproval(t,{signal:r}={}){let n=this.approvalTurn;return!n||!this.callbacks.onPermissionRequest?{outcome:"denied",reason:"no active OrchaAI turn"}:this.callbacks.onPermissionRequest({agent:this.agent,runtimeSessionId:n.sessionId,request:t,emitUpdate:n.emitUpdate,signal:r?AbortSignal.any([n.ended.signal,r]):n.ended.signal})}async refreshMcpServers(t){if(!this.taskMcp)throw Object.assign(new Error("The original Codex MCP binding is unavailable"),{code:"RUNTIME_OPERATION_NOT_FOUND"});await this.taskMcp.refresh(t)}async sessionPrompt(t,r,n){return this.nativeSession?this.nativeSession.turn(this.options.runId,(s,i,o)=>this.runPrompt(t,i,o,s),s=>{let i=s.update?.event;i?.type==="thread.started"&&(this.deliveryThreadId=i.thread_id),r(s)},n,()=>this.sessionCancel(t)):this.runPrompt(t,r,n)}async runPrompt(t,r,n,s){let i=Date.now(),o=u(this.target.command);if(!o)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);let a=u(t.sessionId)||_t(),c=mt(t.prompt),l=this.nativeSession&&this.adapter.control,p=l?"stdin":u(this.target.promptMode||"stdin"),h=this.buildArgs(p,c),f=[...this.taskMcp?.args||[],...l?.args||[],...this.nativeSession?this.adapter.resumeArgs(h,s):h],m=W(this.target,this.agent.workspace),g=typeof this.options.prepareLaunch=="function",x=Bo(o,f,this.target)?g?`/tmp/orcha-runtime-last-message-${_t()}.txt`:j(Jn(),`orcha-runtime-last-message-${_t()}.txt`):"";x&&f.push("--output-last-message",x);let w={...d(this.target.env)?this.target.env:{},...this.taskMcp?.environment||{},...p==="env"?{ORCHA_RUNTIME_PROMPT:c}:{},ORCHA_AGENT_ID:this.agent.agentId,ORCHA_SESSION_ID:a},I=g?await this.options.prepareLaunch({command:o,args:f,cwd:m,environment:w}):{command:o,args:f,cwd:m,environment:{...process.env,...w},cleanup:async()=>{}},y=g?Wo(I):Je(this.target,a),S=y.root,N=Xe(this.target,S,I);this.deliveryCwd=m,this.deliveryRoots=[m,...N.trustedFileRoots].filter(Boolean),this.deliveryThreadId=s||null;let A=jo(o,this.target),E={...this.target,targetCode:this.agent.targetCode,cwd:m,...g?{codexHome:j(I.homeDirectory,".codex")}:{}},O=A?Qo(E,i):new Set,C=g&&x?j(I.tempDirectory,x.slice(5)):x,L=R(this.target.timeoutMs||this.target.sessionPromptTimeoutMs,R(this.options.sessionPromptTimeoutMs,z));g||(I.environment.ORCHA_RUNTIME_ARTIFACT_DIR=S);let nt={sessionId:a,emitUpdate:r,ended:new AbortController};this.approvalTurn=nt;let M=Gn(I.command,I.args,{cwd:I.cwd,env:I.environment,stdio:["pipe","pipe","pipe"],detached:process.platform!=="win32",windowsHide:!0});this.active.set(a,M),_("info","runtime.cli","runtime prompt started",{target:this.agent.targetCode,sessionId:a,pid:M.pid,timeoutMs:L,isolation:I.isolation});let Br="",Te=u(this.target.outputMode||"text"),v={control:l?{respond:l.respond,stdin:M.stdin,pending:new Map}:null,explicitFileDelivery:this.explicitFileDelivery,artifacts:new Map,emittedTexts:new Set,emittedThoughtTexts:new Set,value:"",artifactOptions:N,finalTextSeen:!1,finalTextOnly:zo(t,this.target),emitThoughtChunks:Ve(t,this.target),terminalOutcome:null,terminalProtocol:re(this.target),emitTerminal:null,progress:{}},we=A?Jo(E,c,i,O):null;return M.stdout.setEncoding("utf8"),M.stdout.on("data",J=>this.handleStdout(J,Te,v,a,r)),M.stderr.setEncoding("utf8"),M.stderr.on("data",J=>{Br+=J,this.target.emitStderr===!0&&r({sessionId:a,update:{sessionUpdate:"runtime_stderr_chunk",content:{type:"text",text:J}}})}),M.stdin.on("error",J=>_("debug","runtime.cli","runtime stdin closed",{target:this.agent.targetCode,sessionId:a,error:String(J?.message||J)})),l?M.stdin.write(`${l.prompt(c)}
20
+ `):p==="stdin"?M.stdin.end(c):M.stdin.end(),await new Promise((J,Ee)=>{let It=!1,jr=!1,Ht=null,Ct=null,Se=we&&Go(this.target,t)?setInterval(()=>{try{qe(v,we,a,r)}catch(U){_("warn","runtime.cli","codex transcript stream poll failed",{target:this.agent.targetCode,sessionId:a,error:String(U?.message||U)})}},Zn(this.target)):null;Se?.unref?.();let qr=setTimeout(()=>{jr=!0,_("warn","runtime.cli","runtime prompt timed out; terminating child",{target:this.agent.targetCode,sessionId:a,pid:M.pid,timeoutMs:L}),ee(M,"SIGTERM"),Ht=setTimeout(()=>{_("warn","runtime.cli","runtime prompt force killing child",{target:this.agent.targetCode,sessionId:a,pid:M.pid}),ee(M,"SIGKILL")},Wn),Ht.unref?.(),xt(Object.assign(new Error(`runtime CLI timed out after ${L}ms`),{code:"RUNTIME_CLI_TIMEOUT"}))},L);qr.unref?.();let Gr=async()=>{clearTimeout(qr),Ct&&clearTimeout(Ct),Se&&clearInterval(Se),Ht&&!jr&&clearTimeout(Ht),nt.ended.abort(),this.approvalTurn===nt&&(this.approvalTurn=null),We(y,{target:this.agent.targetCode,sessionId:a}),this.active.delete(a),v.emitTerminal=null,await I.cleanup?.()},Vs=U=>{It||(It=!0,Gr().then(()=>J(U),Ee))},xt=U=>{It||(It=!0,Gr().then(()=>Ee(U),G=>{_("warn","runtime.cli","sandbox launch cleanup failed",{target:this.agent.targetCode,sessionId:a,error:String(G?.message||G)}),Ee(U)}))};v.emitTerminal=U=>{let G={...d(U.result)?U.result:{},_artifacts:[...v.artifacts.values()]};try{n?.({...U,result:G})}catch(st){_("warn","runtime.cli","runtime terminal listener failed",{target:this.agent.targetCode,sessionId:a,error:String(st?.message||st)})}let q=Math.max(0,R(this.target.terminalExitGraceMs,ko));Ct=setTimeout(()=>{Ct=null,!(It||this.active.get(a)!==M)&&(_("warn","runtime.cli","runtime stayed alive after terminal event; terminating child",{target:this.agent.targetCode,sessionId:a,pid:M.pid,terminalProtocol:v.terminalProtocol,graceMs:q}),yt(M))},q),Ct.unref?.()},M.on("error",U=>{_("warn","runtime.cli","runtime child error",{target:this.agent.targetCode,sessionId:a,pid:M.pid,error:String(U?.message||U)}),xt(U)}),M.on("exit",(U,G)=>{(async()=>{Te==="json-lines"&&v.value.trim()&&this.handleStdout(`
21
+ `,Te,v,a,r);let q=await ma(v,we,a,r,C,this.target);(q.artifactCount>0||q.textCount>0||q.thoughtCount>0)&&_("info","runtime.cli","codex transcript updates collected",{target:this.agent.targetCode,sessionId:a,artifactCount:q.artifactCount,textCount:q.textCount,finalTextCount:q.finalTextCount,thoughtCount:q.thoughtCount,transcriptCount:q.transcriptCount});let st=Br.trim();if(st&&_("debug","runtime.cli","runtime stderr",{target:this.agent.targetCode,sessionId:a,stderr:st}),_("info","runtime.cli","runtime prompt finished",{target:this.agent.targetCode,sessionId:a,pid:M.pid,exitCode:U,signal:G,artifactCount:v.artifacts.size,finalTextSeen:v.finalTextSeen}),v.terminalOutcome?.status==="failed"){xt(v.terminalOutcome.error);return}if(U!==0&&v.terminalOutcome?.status!=="completed"){let Js=Object.assign(new Error(`runtime CLI exited with code ${U??"unknown"}${G?` (${G})`:""}`),{code:"RUNTIME_CLI_EXIT_NONZERO",exitCode:U,signal:G});xt(Js);return}Vs({stopReason:"end_turn",exitCode:U,signal:G,_artifacts:[...v.artifacts.values()],...st?{stderr:st}:{}})})().catch(xt)})})}buildArgs(t,r){let n=P(this.target.args);return t==="args"?[...n,r]:n}handleStdout(t,r,n,s,i){if(r!=="json-lines"){i({sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:t}}});return}n.value+=t;let o=n.value.split(/\r?\n/);n.value=o.pop()||"";for(let a of o){let c=a.trim();if(c)try{let l=JSON.parse(c);if(n.control&&this.hostControl(n.control,l))continue;!this.nativeSession&&l.type==="thread.started"&&/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(l.thread_id||"")&&(this.deliveryThreadId=l.thread_id);let p=this.taskMcp&&this.adapter?.taskMcpError?.(l);if(p){n.terminalOutcome||(n.terminalOutcome={status:"failed",error:p},n.emitTerminal?.(n.terminalOutcome)),yt(this.active.get(s));continue}Yn(n,l);let h=this.adapter?.progress?.(l,n.progress,{emitThoughts:n.emitThoughtChunks,streamText:!n.finalTextOnly});for(let x of h||[{sessionUpdate:"runtime_event",event:Qn(l)}])i({sessionId:s,update:x});let f=Xn(l),m=Ke(l),g=h?"":f;g&&n.emitThoughtChunks&&!m&&Fo(l)?es(n,s,i,g):g&&Vo(n,m)&&ts(n,s,i,g),f&&m&&(n.finalTextSeen=!0);let T=Ho(l,n.terminalProtocol);T&&!n.terminalOutcome&&(T.status==="failed"||n.finalTextSeen||n.artifacts.size>0)&&(n.terminalOutcome=T,n.emitTerminal?.(T))}catch{i({sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`${a}
22
+ `}}})}}}hostControl(t,r){if(r.type==="control_cancel_request")return t.pending.get(r.request_id)?.abort(),!0;if(r.type==="result"&&t.stdin.end(),r.type!=="control_request")return!1;let n=new AbortController;return t.pending.set(r.request_id,n),t.respond(r.request,(s,i)=>this.requestApproval(s,i),n.signal).catch(s=>({subtype:"error",error:String(s?.message||s)})).then(s=>{t.pending.delete(r.request_id),!(n.signal.aborted||!t.stdin.writable)&&t.stdin.write(`${JSON.stringify({type:"control_response",response:{...s,request_id:r.request_id}})}
23
+ `)}),!0}async sessionCancel(t){let r=u(t.sessionId),n=this.active.get(r);return n?(_("info","runtime.cli","cancelling runtime child",{target:this.agent.targetCode,sessionId:r,pid:n.pid}),yt(n),{ok:!0,cancelled:!0}):{ok:!0,cancelled:!1}}async stop(t="stop"){for(let[r,n]of this.active.entries())_("info","runtime.cli","stopping runtime child",{target:this.agent.targetCode,sessionId:r,pid:n.pid,reason:t}),yt(n);this.active.clear(),await this.taskMcp?.close(),this.taskMcp=null}};import{spawn as ga}from"node:child_process";import{randomUUID as _a}from"node:crypto";import{createInterface as ya}from"node:readline";var Ta=new Set(["item/commandExecution/requestApproval","item/fileChange/requestApproval","item/permissions/requestApproval"]),wa={commandExecution:"shell",fileChange:"apply_patch",webSearch:"web_search",imageGeneration:"image_generation",imageView:"view_image"},Ea=new Set(["failed","declined"]);function as(e){return re(e)==="codex"&&P(e.args)[0]==="app-server"}function wt(e,t){return Object.assign(new Error(t),{code:e})}function is(e){return e.type==="mcpToolCall"?`mcp__${e.server}__${e.tool}`:e.type==="dynamicToolCall"||e.type==="collabAgentToolCall"?u(e.tool)||e.type:wa[e.type]||""}function Sa(e){if(e.type==="commandExecution")return{command:e.command,cwd:e.cwd};if(e.type==="fileChange")return{paths:(e.changes||[]).map(i=>i?.path).filter(Boolean)};if(e.type==="mcpToolCall"||e.type==="dynamicToolCall")return ct(e.arguments);let{id:t,type:r,status:n,...s}=e;return ct(s)}function os(e){return Array.isArray(e)?e.filter(t=>t?.type==="text").map(t=>t.text).join(`
22
24
  `):""}function Ra(e){return e.type==="commandExecution"?e.aggregatedOutput||"":e.type==="mcpToolCall"?e.error?.message||os(e.result?.content):e.type==="dynamicToolCall"?os(e.contentItems):e.type==="fileChange"?(e.changes||[]).map(t=>t?.path).filter(Boolean).join(`
23
25
  `):""}function Oa(e,{onNotification:t,onRequest:r}){let n=1,s=new Map,i=o=>e.stdin.write(`${JSON.stringify(o)}
24
- `);return ya({input:e.stdout}).on("line",o=>{if(!o.trim())return;let a;try{a=JSON.parse(o)}catch{_("warn","runtime.codex","ignored non-JSON app-server output",{line:o.slice(0,200)});return}if(typeof a.method=="string"&&a.id!==void 0){Promise.resolve().then(()=>r(a.method,d(a.params)?a.params:{})).then(l=>i({id:a.id,result:l}),l=>i({id:a.id,error:{code:-32603,message:String(l?.message||l)}}));return}if(typeof a.method=="string"){t(a.method,d(a.params)?a.params:{});return}let c=s.get(a.id);c&&(s.delete(a.id),a.error?c.reject(Tt("RUNTIME_CODEX_APP_SERVER_ERROR",u(a.error.message)||"Codex app-server request failed")):c.resolve(a.result))}),{request:(o,a)=>new Promise((c,l)=>{let p=n++;s.set(p,{resolve:c,reject:l}),i({id:p,method:o,params:a})}),notify:o=>i({method:o})}}var se=class extends yt{async runPrompt(t,r,n,s){let i=u(this.target.command);if(!i)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);if(this.options.prepareLaunch)throw Tt("BAD_REQUEST","Codex app-server \u53EA\u652F\u6301\u5DF2\u63A5\u5165\u7684\u672C\u673A\u8BBE\u5907\uFF0C\u4E0D\u652F\u6301\u6C99\u7BB1\u542F\u52A8");let o=u(t.sessionId)||_a(),a=J(this.target,this.agent.workspace),c=We(this.target,o);this.deliveryCwd=a,this.deliveryRoots=[a,...Ye(this.target,c.root).trustedFileRoots],this.deliveryThreadId=s||null;let l=Je(t,this.target),p=R(this.target.timeoutMs||this.target.sessionPromptTimeoutMs,R(this.options.sessionPromptTimeoutMs,z)),h={sessionId:o,emitUpdate:r,ended:new AbortController};this.approvalTurn=h;let f=ga(i,[...P(this.target.args),...this.taskMcp?.args||[]],{cwd:a,env:{...process.env,...d(this.target.env)?this.target.env:{},...this.taskMcp?.environment||{},ORCHA_AGENT_ID:this.agent.agentId,ORCHA_SESSION_ID:o,ORCHA_RUNTIME_ARTIFACT_DIR:c.root},stdio:["pipe","pipe","pipe"],detached:process.platform!=="win32",windowsHide:!0});this.active.set(o,f),_("info","runtime.codex","app-server turn started",{target:this.agent.targetCode,sessionId:o,pid:f.pid,timeoutMs:p});let m=T=>r({sessionId:o,update:T}),y="";return f.stderr.setEncoding("utf8"),f.stderr.on("data",T=>{y=`${y}${T}`.slice(-4e3)}),await new Promise((T,C)=>{let w={threadId:null,turnId:null,items:new Map,pending:"",lastError:""},x=!1,g=(S,I)=>{x||(x=!0,clearTimeout(E),h.ended.abort(),this.approvalTurn===h&&(this.approvalTurn=null),this.active.delete(o),_t(f),Xe(c,{target:this.agent.targetCode,sessionId:o}),_("info","runtime.codex","app-server turn finished",{target:this.agent.targetCode,sessionId:o,status:S?"failed":"completed",...S?{error:String(S.message||S)}:{}}),S?C(S):T(I))},E=setTimeout(()=>g(Tt("RUNTIME_CLI_TIMEOUT",`runtime CLI timed out after ${p}ms`)),p);E.unref?.(),f.on("error",S=>g(S)),f.on("exit",(S,I)=>g(Object.assign(new Error(`Codex app-server exited before the turn completed (${I||S})${y.trim()?`: ${y.trim().slice(-500)}`:""}`),{code:"RUNTIME_CLI_EXIT_NONZERO",exitCode:S,signal:I})));let b=()=>{w.pending&&l&&m({sessionUpdate:"agent_thought_chunk",content:{type:"text",text:w.pending}}),w.pending=""},A=Oa(f,{onRequest:async(S,I)=>{if(Ta.has(S)){let O=await this.requestApproval(Un(S,I,w.items.get(I.itemId)),{});return Pn(S,I,O?.outcome==="approved")}if(S==="mcpServer/elicitation/request")return I.serverName==="orcha"&&I.mode!=="url"?{action:"accept",content:{},_meta:null}:{action:"decline",content:null,_meta:null};throw new Error(`OrchaAI does not handle Codex request ${S}`)},onNotification:(S,I)=>{if(I.threadId&&w.threadId&&I.threadId!==w.threadId)return;let O=d(I.item)?I.item:null;if(S==="item/started"&&O){w.items.set(O.id,O);let k=is(O);if(!k)return;b(),m({sessionUpdate:"tool_call",toolCallId:O.id,title:k,status:"in_progress",rawInput:Sa(O)})}else if(S==="item/completed"&&O)w.items.set(O.id,O),O.type==="agentMessage"&&u(O.text)?(b(),O.phase==="commentary"?l&&m({sessionUpdate:"agent_thought_chunk",content:{type:"text",text:O.text}}):w.pending=O.text):O.type==="contextCompaction"?m({sessionUpdate:"runtime_event",event:{payload:{type:"context_compacted",id:O.id}}}):is(O)&&m({sessionUpdate:"tool_call_update",toolCallId:O.id,status:Ea.has(O.status)||O.success===!1?"failed":"completed",rawOutput:Ra(O)});else if(S==="mcpServer/startupStatus/updated"&&I.name==="orcha"&&I.status==="failed")g(Tt("RUNTIME_CODEX_MCP_UNAVAILABLE",`Codex \u672A\u80FD\u8FDE\u63A5 OrchaAI \u4EFB\u52A1\u5DE5\u5177\uFF1A${u(I.error)||"\u542F\u52A8\u5931\u8D25"}`));else if(S==="error"&&I.willRetry!==!0)w.lastError=u(I.error?.message);else if(S==="turn/completed"&&(!w.turnId||I.turn?.id===w.turnId)){let k=d(I.turn)?I.turn:{};if(k.status!=="completed"){g(Tt(k.status==="interrupted"?"RUNTIME_CODEX_TURN_INTERRUPTED":"RUNTIME_CODEX_TURN_FAILED",u(k.error?.message)||w.lastError||`Codex turn ${k.status||"failed"}`));return}w.pending&&m({sessionUpdate:"agent_message_chunk",content:{type:"text",text:w.pending}}),g(null,{stopReason:"end_turn",_artifacts:[]})}}});(async()=>{await A.request("initialize",{clientInfo:{name:"orcha_runtime_bridge",title:"OrchaAI Runtime Bridge",version:K},capabilities:null}),A.notify("initialized");let S=s?await A.request("thread/resume",{threadId:s,cwd:a,excludeTurns:!0}):await A.request("thread/start",{cwd:a}),I=u(S?.thread?.id);if(!I)throw Tt("RUNTIME_CODEX_APP_SERVER_ERROR","Codex app-server did not return a thread");w.threadId=I,this.deliveryThreadId=I,m({sessionUpdate:"runtime_event",event:{type:"thread.started",thread_id:I}});let O=await A.request("turn/start",{threadId:I,input:[{type:"text",text:ht(t.prompt),text_elements:[]}]});w.turnId=u(O?.turn?.id)||null})().catch(S=>g(S))})}};var Ze="ORCHA_RUNTIME_OUTPUT_START",tr="ORCHA_RUNTIME_OUTPUT_END",er="ORCHA_RUNTIME_CONTROL_START",rr="ORCHA_RUNTIME_CONTROL_END",nr=Ze,sr=tr,ir=er,or=rr,ar=[Ze,tr,er,rr],Ia=new Set(["_artifacts","_decision","_meta"]),Ca=new RegExp(`(?:^|(?<=[\\r\\n]))[ \\t]*(?<marker>${ar.join("|")})[ \\t]*(?=\\r\\n?|\\n|$)`,"g"),H=class extends Error{constructor(t,r,n){super(r),this.name="RuntimeResultProtocolError",this.code=t,this.detail={rawOutput:n}}};function cr(e){let t=typeof e=="string"?e.trimStart():"";return ar.some(r=>t.startsWith(r))}function ur(e){if(typeof e!="string")return null;let t=e,r=xa(t);if(![...r.values()].some(m=>m.length>0))return null;let n=[],s=[];for(let[m,y]of r)y.length===0?n.push(m):y.length>1&&s.push(m);if(n.length>0||s.length>0){let m=[];throw n.length>0&&m.push(`\u7F3A\u5C11 ${n.join(", ")}`),s.length>0&&m.push(`\u91CD\u590D ${s.join(", ")}`),new H("invalid_markers",`Runtime Result \u534F\u8BAE\u6807\u8BB0\u4E0D\u5B8C\u6574\uFF1A${m.join("\uFF1B")}`,t)}let i=r.get(Ze)[0],o=r.get(tr)[0],a=r.get(er)[0],c=r.get(rr)[0];if(!(i.end<=o.start&&o.end<=a.start&&a.end<=c.start))throw new H("invalid_marker_order","Runtime Result \u534F\u8BAE\u6807\u8BB0\u987A\u5E8F\u9519\u8BEF\uFF1A\u5FC5\u987B\u5148\u8F93\u51FA OUTPUT \u5757\uFF0C\u518D\u8F93\u51FA CONTROL \u5757",t);let l=Aa(t.slice(i.end,o.start));if(!l.trim())throw new H("empty_output","Runtime Result OUTPUT \u5757\u4E0D\u80FD\u4E3A\u7A7A",t);let p=t.slice(a.end,c.start).trim();if(!p)throw new H("empty_control","Runtime Result CONTROL \u5757\u4E0D\u80FD\u4E3A\u7A7A",t);let h;try{h=JSON.parse(p)}catch(m){throw new H("invalid_control_json",`Runtime Result CONTROL \u5757\u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${String(m?.message||m)}`,t)}if(!cs(h))throw new H("invalid_control_type","Runtime Result CONTROL \u5757\u5FC5\u987B\u662F JSON \u5BF9\u8C61",t);let f=Object.keys(h).filter(m=>!Ia.has(m)).sort();if(f.length>0)throw new H("invalid_control_keys",`Runtime Result CONTROL \u5757\u5305\u542B\u975E\u6807\u51C6\u5B57\u6BB5\uFF1A${f.join(", ")}`,t);if("_artifacts"in h&&!Array.isArray(h._artifacts))throw new H("invalid_control_field_type","Runtime Result CONTROL \u5757\u7684 _artifacts \u5FC5\u987B\u662F JSON \u6570\u7EC4",t);for(let m of["_decision","_meta"])if(m in h&&!cs(h[m]))throw new H("invalid_control_field_type",`Runtime Result CONTROL \u5757\u7684 ${m} \u5FC5\u987B\u662F JSON \u5BF9\u8C61`,t);return{output:l,...h}}function xa(e){let t=new Map(ar.map(r=>[r,[]]));for(let r of e.matchAll(Ca))t.get(r.groups.marker).push({start:r.index,end:r.index+r[0].length});return t}function Aa(e){let t=e.match(/^(?:\r\n|\r|\n)/)?.[0]||"",r=t?e.slice(t.length):e;return t&&r.endsWith(t)?r.slice(0,-t.length):r}function cs(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}import{createHash as Na}from"node:crypto";var ba="orcha.goal-contract/v1",Ma=new Set(["complete","completed","done","ok","passed","success","succeeded"]),Ua=new Set(["aborted","blocked","cancelled","canceled","denied","error","failed","failure","timeout","timed_out"]),Pa=new Map([["exec_command","run_command"],["local_shell_call","run_command"],["run_command","run_command"],["apply_patch","apply_patch"],["read_file","read_file"],["list_files","list_files"],["plugin_operation","plugin_operation"]]);function fr(e){return Na("sha256").update(X(e)).digest("hex")}function ls(e){if(!ps(e))return"";let t=["The following Orcha goal contract is immutable for this turn. Do not narrow its outcome or constraints.",`<goal_contract>${JSON.stringify(e)}</goal_contract>`];return e.verificationPlan?.required===!0&&t.push("Every verification check must be satisfied by a real successful tool call from one of its toolNames.","Each check requires requiredMatches distinct successful tool call IDs; repeated updates for one call count once.","A final text claim is not verification; missing or failed tool evidence prevents completion."),t.join(`
25
- `)}function ds(e,t,r=""){if(!ps(e))return e==null?null:{required:!0,status:"failed",outcome:u(e?.outcome),goalContractHash:"",checks:[],errorCode:"invalid_goal_contract"};let n=fr(e),s=e.verificationPlan.required===!0;if(u(r)&&u(r)!==n)return{required:s,status:"failed",outcome:e.outcome,goalContractHash:n,checks:[],errorCode:"goal_contract_hash_mismatch"};if(!s)return{required:!1,status:"not_required",outcome:e.outcome,goalContractHash:n,checks:[]};let i=La(t),o=e.verificationPlan.checks.map(c=>Ba(c,i));return{required:!0,status:o.some(c=>c.status==="failed")?"failed":o.some(c=>c.status==="missing")?"missing":"passed",outcome:e.outcome,goalContractHash:n,checks:o}}function ps(e){if(!d(e)||e.schemaVersion!==ba||!u(e.outcome))return!1;let t=e.verificationPlan;if(!d(t)||typeof t.required!="boolean"||!Array.isArray(t.checks)||t.required&&t.checks.length===0)return!1;let r=new Set;for(let n of t.checks)if(!d(n)||!u(n.id)||r.has(u(n.id))||(r.add(u(n.id)),!Array.isArray(n.toolNames)||n.toolNames.length===0||n.toolNames.some(s=>!u(s)))||!Number.isSafeInteger(n.requiredMatches)||n.requiredMatches<1||n.arguments!==void 0&&!d(n.arguments))return!1;return!0}function La(e){let t=new Map,r=[];for(let n of Array.isArray(e)?e:[]){let s=d(n?.update)?n.update:{},i=u(s.sessionUpdate);if(i==="runtime_event"){ka(s.event,t,r);continue}if(i==="tool_call"){let o=oe(s)||`tool-${r.length+1}`,a=ie(t,r,o),c=dr(s,s.name||s.toolName||s.kind);a.toolName=c.toolName,a.arguments=c.arguments,a.status=Pt(s.status),a.evidence=ce(s);continue}if(i==="tool_call_update"){let o=oe(s);if(!o)continue;let a=ie(t,r,o),c=dr(s,s.name||s.toolName||s.kind);a.toolName||=c.toolName,Object.keys(a.arguments).length===0&&(a.arguments=c.arguments),a.status=Pt(s.status),a.evidence.push(...ce(s))}}return r}function ka(e,t,r){let n=d(e)&&d(e.payload)?e.payload:d(e)?e:{},s=u(n.type);if(["function_call","custom_tool_call","local_shell_call","mcp_tool_call"].includes(s)){let a=oe(n)||`runtime-${r.length+1}`,c=ie(t,r,a),l=dr(n,n.name||n.tool||s,s);c.toolName=l.toolName,c.arguments=l.arguments,c.status=Pt(n.status),c.evidence.push(...ce(n));return}if(!["function_call_output","custom_tool_call_output","local_shell_call_output","mcp_tool_call_output"].includes(s))return;let i=oe(n);if(!i)return;let o=ie(t,r,i);o.status=Ha(n,o.toolName),o.evidence.push(...ce(n))}function ie(e,t,r){let n=e.get(r);return n||(n={toolCallId:r,toolName:"",arguments:{},status:"unknown",evidence:[]},e.set(r,n),t.push(n)),n}function va(e){let t=u(e).toLowerCase();return Pa.get(t)||t}function dr(e,t,r=""){let n=Da(e),s=u(r)==="mcp_tool_call"||u(e?.kind).toLowerCase()==="mcp",i=d(e?._meta)?e._meta:{},o=u(e?.server||e?.serverName||e?.server_name||e?.mcpServer||i.server||i.serverName).toLowerCase();if(s&&o==="orcha"){let a=u(e?.tool||e?.toolName||e?.name||t);return{toolName:"plugin_operation",arguments:{...n,...a?{operationCode:a}:{}}}}return{toolName:va(t),arguments:n}}function oe(e){return d(e)?u(e.call_id||e.callId||e.toolCallId||e.id):""}function Da(e){if(!d(e))return{};for(let r of["arguments","args","rawInput","input","params","parameters"]){let n=$a(e[r]);if(n)return n}let t={};for(let r of["cmd","command","cwd","operationCode","path","query","url"])e[r]!==void 0&&(t[r]=e[r]);return t}function $a(e){if(d(e))return structuredClone(e);if(typeof e!="string")return null;try{let t=JSON.parse(e);return d(t)?t:null}catch{return null}}function Ha(e,t){if(!d(e))return"unknown";let r=ae(e,0,{parseCliExitCode:t==="run_command"||t==="apply_patch"});return r.includes("failed")?"failed":r.includes("success")?"success":"unknown"}function ae(e,t=0,r={}){if(t>8||e===null||e===void 0)return[];if(typeof e=="string")return Fa(e,t,r);if(Array.isArray(e))return e.flatMap(o=>ae(o,t+1,r));if(!d(e))return[];let n=[];typeof e.isError=="boolean"&&n.push(e.isError?"failed":"success"),typeof e.ok=="boolean"&&n.push(e.ok?"success":"failed"),typeof e.success=="boolean"&&n.push(e.success?"success":"failed");let s=Pt(e.status);s!=="unknown"&&n.push(s);let i=e.exitCode??e.exit_code;typeof i=="number"&&Number.isFinite(i)&&n.push(i===0?"success":"failed");for(let o of["output","result","structuredContent","content"])e[o]!==void 0&&n.push(...ae(e[o],t+1,r));return n}function Fa(e,t,r){let n=e.trim();if(!n)return[];try{return ae(JSON.parse(n),t+1,r)}catch{}if(r.parseCliExitCode!==!0)return[];let s=[];for(let i of n.matchAll(/(?:process\s+exited\s+with\s+code|exit\s+code\s*:?)\s*(-?\d+)/gi))s.push(Number(i[1])===0?"success":"failed");return s}function Pt(e){let t=u(e).toLowerCase();return Ma.has(t)?"success":Ua.has(t)?"failed":"unknown"}function ce(e){if(!d(e))return[];let t=d(e.output)?e.output:{},r=[e.verificationEvidence,d(e.verification)?e.verification.evidence:null,t.verificationEvidence,d(t.verification)?t.verification.evidence:null],n=[];for(let s of r)for(let i of Array.isArray(s)?s:s?[s]:[])!d(i)||!u(i.id)||n.push({id:u(i.id),status:Pt(i.status??(i.passed===!0?"passed":i.passed===!1?"failed":"")),...u(i.message)?{message:u(i.message)}:{}});return n}function Ba(e,t){let r=t.filter(o=>e.toolNames.includes(o.toolName)&&pr(e.arguments||{},o.arguments)),n=u(e.evidenceId),s=r.filter(o=>o.status==="success"&&(!n||o.evidence.some(a=>a.id===n&&a.status==="success")));if(s.length>=e.requiredMatches)return lr(e,"passed",s,`Runtime tool evidence passed ${s.length} times.`);let i=r.filter(o=>o.status==="failed"||n&&o.evidence.some(a=>a.id===n&&a.status==="failed"));return s.length===0&&i.length?lr(e,"failed",i,"Runtime tool evidence failed."):lr(e,"missing",s,`Only ${s.length}/${e.requiredMatches} required tool executions passed.`)}function lr(e,t,r,n){let s=r.map(i=>i.toolCallId).filter(Boolean);return{id:e.id,status:t,message:n,...u(e.description)?{description:u(e.description)}:{},toolNames:e.toolNames,requiredMatches:e.requiredMatches,observedMatches:s.length,toolCallIds:s,...d(e.arguments)?{arguments:e.arguments}:{},...u(e.evidenceId)?{evidenceId:u(e.evidenceId)}:{}}}function pr(e,t){return Array.isArray(e)?Array.isArray(t)&&e.length===t.length&&e.every((r,n)=>pr(r,t[n])):d(e)?d(t)?Object.entries(e).every(([r,n])=>Object.hasOwn(t,r)&&pr(n,t[r])):!1:Object.is(e,t)}function X(e){if(e===null||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="string")return us(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new Error("invalid_jcs_number");return JSON.stringify(Object.is(e,-0)?0:e)}if(Array.isArray(e))return`[${Array.from({length:e.length},(t,r)=>{if(!Object.hasOwn(e,r))throw new Error("invalid_jcs_json_value");return X(e[r])}).join(",")}]`;if(d(e))return`{${Object.keys(e).sort().map(t=>`${us(t)}:${X(e[t])}`).join(",")}}`;throw new Error("invalid_jcs_json_value")}function us(e){return ja(e),JSON.stringify(e)}function ja(e){for(let t=0;t<e.length;t+=1){let r=e.charCodeAt(t);if(r>=55296&&r<=56319){let n=e.charCodeAt(t+1);if(!(n>=56320&&n<=57343))throw new Error("invalid_jcs_unicode");t+=1}else if(r>=56320&&r<=57343)throw new Error("invalid_jcs_unicode")}}import{spawn as qa}from"node:child_process";import{createHash as Ga,randomUUID as Ka}from"node:crypto";import{constants as za}from"node:fs";import{access as Va,mkdir as hr,readdir as Ja,realpath as Lt,rm as Wa,stat as Xa}from"node:fs/promises";import Ya from"node:http";import{tmpdir as Qa}from"node:os";import{isAbsolute as kt,join as wt,relative as fs,resolve as gr}from"node:path";var _r=1,Za="orcha.process-isolation/v1",yr="orcha.egress-proxy/v1",tc="--disable-wasm-trap-handler",ue={read_only:0,workspace_write:1,workspace_network:2},mr={read_only:["read_only","denied"],workspace_write:["workspace_write","denied"],workspace_network:["workspace_write","restricted"]},ec=new Set([".env",".git-credentials",".netrc",".npmrc",".pypirc","credentials.json","secrets.json","id_rsa","id_ed25519"]);function ut(e){if(!d(e))throw N("RUNTIME_SANDBOX_POLICY_REQUIRED","sandboxPolicy is required");let t=structuredClone(e),r=u(t.accessMode),n=u(t.accessModeCeiling);if(!(r in mr)||!(n in mr))throw N("RUNTIME_SANDBOX_POLICY_INVALID","unsupported runtime access mode");if(ue[r]>ue[n])throw N("RUNTIME_SANDBOX_POLICY_INVALID","access mode exceeds its ceiling");let[s,i]=mr[r];if(t.filesystemMode!==s||t.networkMode!==i)throw N("RUNTIME_SANDBOX_POLICY_INVALID","runtime access profile does not match its mode");if(Number(t.policySchemaVersion)!==_r||!Number.isInteger(Number(t.policyRevision))||Number(t.policyRevision)<1)throw N("RUNTIME_SANDBOX_POLICY_INVALID","unsupported sandbox policy schema or revision");for(let[a,c]of Object.entries({outsideWorkspaceAccess:"denied",hostAccess:"denied",hostEnvironmentAccess:"denied",dockerSocketAccess:"denied",environmentMode:"allowlist"}))if(t[a]!==c)throw N("RUNTIME_SANDBOX_POLICY_INVALID",`${a} cannot be relaxed`);let o=d(t.processIsolation)?t.processIsolation:{};if(o.mode!=="required"||o.backend==="direct")throw N("RUNTIME_SANDBOX_POLICY_INVALID","strong process isolation is required");if(Array.isArray(t.alwaysApprovedApprovalKeys)&&t.alwaysApprovedApprovalKeys.length)throw N("RUNTIME_SANDBOX_POLICY_INVALID","persistent runtime approvals are forbidden");return t}function hs(e,t){let r=ut(e),n=ut(t);return ue[n.accessMode]<ue[r.accessMode]}async function ms(e){if(!e.sandboxRequired)return{dispatchable:!0,enforced:!1,backend:"direct",daemonStatus:"not_required",daemonProtocolVersion:"",policySchemaVersions:[_r],runtimePolicyUpdates:!1,workspaceSync:!1,egressProxy:!1,reason:"external_runtime_sandbox_not_required"};let t=await _s(e.sandboxBrokerCommand,process.env.PATH||"");if(!t)throw N("RUNTIME_SANDBOX_UNAVAILABLE","sandbox broker is not executable");let r=await oc(t,P(e.sandboxBrokerArguments),e.sandboxProbeTimeoutMs);if(r.enforced!==!0||u(r.protocolVersion)!=="orcha.runtime-sandbox-broker/v1"||!["bubblewrap","broker"].includes(u(r.backend)))throw N("RUNTIME_SANDBOX_UNAVAILABLE","sandbox broker did not report enforced isolation");let n=d(r.probes)?r.probes:{};for(let s of["emptyRoot","outsideWorkspaceDenied","hostFilesystemDenied","sensitiveFilesDenied","environmentAllowlist","dockerSocketDenied","networkNamespace","workspaceReadOnly","workspaceWrite","resourceLimits"])if(n[s]!==!0)throw N("RUNTIME_SANDBOX_UNAVAILABLE",`sandbox broker probe failed: ${s}`);return e.egressProxyRequired&&await uc(e),{dispatchable:!0,enforced:!0,backend:u(r.backend),daemonStatus:"ok",daemonProtocolVersion:u(r.protocolVersion||"orcha.runtime-sandbox-broker/v1"),policySchemaVersions:[_r],runtimePolicyUpdates:!0,workspaceSync:!1,egressProxy:e.egressProxyRequired}}async function Tr(e,t,r){let n=u(t.workspace||t.cwd),s=u(r),i=n||(t.allowRequestWorkspace===!0?s:"");if(!i||!kt(i))throw N("RUNTIME_WORKSPACE_NOT_CONFIGURED","runtime target must configure an absolute trusted workspace");let o=await Lt(i);if(!(await Xa(o)).isDirectory())throw N("RUNTIME_WORKSPACE_INVALID","runtime workspace is not a directory");if(!(e.trustedWorkspaceRoots.length?await Promise.all(e.trustedWorkspaceRoots.map(l=>Lt(l))):[o]).some(l=>Er(l,o)))throw N("RUNTIME_WORKSPACE_OUTSIDE_TRUSTED_ROOT","runtime workspace is outside trusted roots");return o}async function gs({config:e,target:t,command:r,args:n,cwd:s,environment:i,runId:o,agentId:a,sessionId:c,sandboxPolicy:l}){if(!e.sandboxRequired)return{command:r,args:[...n],cwd:s,environment:{...process.env,...i},tempDirectory:"",isolation:{enforced:!1,backend:"development_direct"},cleanup:async()=>{}};let p=ut(l),h=await Tr(e,t,s),f=await Lt(s);if(!Er(h,f))throw N("RUNTIME_WORKSPACE_CWD_INVALID","runtime cwd is outside its workspace");let m=await _s(e.sandboxBrokerCommand,process.env.PATH||"");if(!m)throw N("RUNTIME_SANDBOX_UNAVAILABLE","sandbox broker is not executable");let y=`runtime-${Ga("sha256").update(String(o)).digest("hex").slice(0,32)}`,T=gr(e.sandboxTempRoot||wt(Qa(),"orcha-runtime-sandboxes"));await hr(T,{recursive:!0,mode:448});let C=wt(T,`${y}-${Ka()}`),w=wt(C,"home"),x=wt(C,"artifacts");await hr(w,{recursive:!0,mode:448}),await hr(x,{recursive:!0,mode:448});let g=p.networkMode==="restricted"?await ac(e,{runId:String(o),instanceId:y,policyRevision:Number(p.policyRevision),ttlMs:Math.min(R(p.maxRuntimeSeconds,900)*1e3,e.egressGrantMaxTtlMs),maxTransferBytes:R(p.maxNetworkBytes,64*1024*1024)}):null,E={PATH:u(i.PATH||process.env.PATH),LANG:u(i.LANG||process.env.LANG||"C.UTF-8"),HOME:"/tmp/home",TMPDIR:"/tmp",USER:"orcha",LOGNAME:"orcha",SHELL:"/bin/sh",ORCHA_AGENT_ID:String(a),ORCHA_SESSION_ID:String(c),ORCHA_RUN_ID:String(o),ORCHA_RUNTIME_ARTIFACT_DIR:"/tmp/artifacts",...nc(t,i)};E.HOME="/tmp/home",E.TMPDIR="/tmp",E.ORCHA_RUNTIME_ARTIFACT_DIR="/tmp/artifacts",E.NODE_OPTIONS=tc;let b={schemaVersion:Za,runId:String(o),instanceId:y,workspace:h,cwd:f,filesystemMode:p.filesystemMode,networkMode:p.networkMode,environmentMode:"allowlist",deniedRelativePaths:await sc(h),temporaryDirectory:C,egressProxy:g,environment:E,resourceLimits:ic(p),readOnlyToolchainRoots:await rc(e,t)},A=!1,S=async()=>{if(!A){A=!0;try{g&&await cc(e,g,{runId:String(o),instanceId:y})}finally{await Wa(C,{recursive:!0,force:!0})}}};return{command:m,args:[...P(e.sandboxBrokerArguments),"--",r,...n],cwd:f,environment:{PATH:process.env.PATH||"",LANG:process.env.LANG||"C.UTF-8",ORCHA_PROCESS_ISOLATION_REQUEST:JSON.stringify(b)},tempDirectory:C,homeDirectory:w,artifactDirectory:x,pathMappings:[{runtimeRoot:"/tmp/artifacts",hostRoot:x},{runtimeRoot:"/tmp/home",hostRoot:w}],isolation:{enforced:!0,backend:"broker",instanceId:y,policyRevision:p.policyRevision},cleanup:S}}async function rc(e,t){let r=P(t.toolchainRoots||t.sandboxToolchainRoots);if(!r.length)return[];let n=await Promise.all(P(e.trustedToolchainRoots).map(i=>Lt(i)));if(!n.length)throw N("RUNTIME_TOOLCHAIN_ROOT_NOT_TRUSTED","target toolchain roots require ORCHA_RUNTIME_TRUSTED_TOOLCHAIN_ROOTS");let s=[];for(let i of r){if(!kt(i))throw N("RUNTIME_TOOLCHAIN_ROOT_INVALID","toolchain roots must be absolute");let o=await Lt(i);if(!n.some(a=>Er(a,o)))throw N("RUNTIME_TOOLCHAIN_ROOT_NOT_TRUSTED","toolchain root is outside trusted roots");s.push(o)}return[...new Set(s)]}function nc(e,t){let r=d(e.env)?e.env:{},n={};for(let[s,i]of Object.entries(r))/^[A-Za-z_][A-Za-z0-9_]*$/.test(s)&&i!=null&&(n[s]=String(i));for(let s of["ORCHA_RUNTIME_PROMPT","ORCHA_RUNTIME_ARTIFACT_DIR"])t[s]!=null&&(n[s]=String(t[s]));return n}async function sc(e){let t=[],r=0,n=async s=>{let i;try{i=await Ja(s,{withFileTypes:!0})}catch(o){if(s===e)throw o;return}for(let o of i){if(r+=1,r>1e4)throw N("RUNTIME_WORKSPACE_SCAN_LIMIT_EXCEEDED","workspace contains more than 10000 entries");let a=wt(s,o.name),c=fs(e,a),l=o.name.toLowerCase();(ec.has(l)||l.startsWith(".env."))&&t.push(c),o.isDirectory()&&!o.isSymbolicLink()&&await n(a)}};return await n(e),t.sort()}function ic(e){return{maxCpuSeconds:Math.max(1,R(e.maxRuntimeSeconds,900)),maxMemoryBytes:R(e.maxMemoryBytes,2*1024*1024*1024),maxProcesses:R(e.maxProcesses,128),maxOpenFiles:R(e.maxOpenFiles,1024),maxFileBytes:R(e.maxFileBytes,64*1024*1024)}}async function oc(e,t,r){return await new Promise((n,s)=>{let i=qa(e,[...t,"--probe"],{env:{PATH:process.env.PATH||"",LANG:"C.UTF-8"},stdio:["ignore","pipe","pipe"],windowsHide:!0}),o=[],a=[];i.stdout.on("data",l=>o.push(Buffer.from(l))),i.stderr.on("data",l=>a.push(Buffer.from(l)));let c=setTimeout(()=>i.kill("SIGKILL"),Math.max(1e3,r));i.once("error",s),i.once("close",l=>{if(clearTimeout(c),l!==0){s(N("RUNTIME_SANDBOX_UNAVAILABLE",Buffer.concat(a).toString("utf8").trim()||`sandbox probe exited with ${l}`));return}try{n(JSON.parse(Buffer.concat(o).toString("utf8")))}catch{s(N("RUNTIME_SANDBOX_UNAVAILABLE","sandbox probe returned invalid JSON"))}})})}async function _s(e,t){let r=u(e);if(!r)return"";let n=kt(r)?[r]:String(t||"").split(":").filter(Boolean).map(s=>wt(s,r));for(let s of n)try{return await Va(s,za.X_OK),s}catch{}return""}async function ac(e,t){if(!e.egressProxyRequired)throw N("RUNTIME_EGRESS_UNAVAILABLE","restricted network requires the Egress Proxy");let r=await wr(e,"POST","/v1/grants",{protocolVersion:yr,...t}),n={socketPath:e.egressProxySocket,grantId:u(r.grantId),credential:u(r.credential)};if(!n.grantId||!n.credential)throw N("RUNTIME_EGRESS_UNAVAILABLE","Egress Proxy returned an invalid grant");return n}async function cc(e,t,r){await wr(e,"POST",`/v1/grants/${encodeURIComponent(t.grantId)}/revoke`,{protocolVersion:yr,...r}).catch(()=>{})}async function uc(e){let t=await wr(e,"GET","/health");if(t.status!=="ok"||t.proxy!=="orcha-egress-proxy"||t.protocolVersion!==yr)throw N("RUNTIME_EGRESS_UNAVAILABLE","Egress Proxy is unavailable or incompatible")}async function wr(e,t,r,n){if(!kt(e.egressProxySocket)||!e.egressProxyToken)throw N("RUNTIME_EGRESS_UNAVAILABLE","Egress Proxy socket and token are required");return await new Promise((s,i)=>{let o=Ya.request({socketPath:e.egressProxySocket,path:r,method:t,headers:{Authorization:`Bearer ${e.egressProxyToken}`,Accept:"application/json",...n?{"Content-Type":"application/json"}:{}}},a=>{let c=[],l=0;a.on("data",p=>{l+=p.length,l>1048576?o.destroy(new Error("egress response is too large")):c.push(Buffer.from(p))}),a.once("end",()=>{try{let p=JSON.parse(Buffer.concat(c).toString("utf8")||"{}");(a.statusCode||500)>=400?i(N("RUNTIME_EGRESS_UNAVAILABLE",u(p.error)||"Egress Proxy rejected the request")):s(p)}catch(p){i(p)}})});o.once("error",i),o.setTimeout(3e3,()=>o.destroy(new Error("Egress Proxy request timed out"))),n?o.end(JSON.stringify(n)):o.end()})}function Er(e,t){let r=fs(gr(e),gr(t));return r===""||!r.startsWith("..")&&!kt(r)}function N(e,t){return Object.assign(new Error(t),{code:e})}var Sr=24e3,Rr=8,Or=50,Ir=6e3,dc=new Set(["fail","failed","failure","error","errored","timeout","timed_out","cancelled","canceled","aborted"]),pc=10*60*1e3,fc=60*1e3,hc=8,mc=30*60*1e3,gc=100,_c=new Set(["agent_message_chunk","agent_thought_chunk"]),yc=60*1e3,Tc=1,Es=2400,wc=new Set(["max_tokens","max_output_tokens","length"]),Ec=new Set(["agent_message_chunk","tool_call","tool_call_update"]),Sc=new Set(["agentId","taskId","executionId","sessionId","nodeId","targetCode","framework","workspace","instructions"]),Rc=/(^|[_-])(token|secret|password|authorization|api[-_]?key|private[-_]?key|credential|cookie|jwt|access[-_]?token|refresh[-_]?token|service[-_]?token|execution[-_]?token)([_-]|$)/i;function Oc(e){if(!d(e))return{};let t={};for(let r of["name","code","serverName","serverCode","type","transport","url","command","protocolVersion"]){let n=u(e[r]);n&&(t[r]=n)}return t}function Ic(e){return(Array.isArray(e)?e:[]).map(Oc).sort((t,r)=>{let n=X(t),s=X(r);return n<s?-1:n>s?1:0})}function Cc(e){return!d(e)||e.verificationPlan?.required!==!0?!1:(Array.isArray(e.verificationPlan.checks)?e.verificationPlan.checks:[]).some(r=>d(r)&&Array.isArray(r.toolNames)&&r.toolNames.some(n=>u(n)==="plugin_operation"))}function xc(e,t,r){let n=d(e?._meta)?e._meta:{};return{...d(e)?e:{},sessionId:t,update:d(e?.update)?e.update:{},_meta:{...n,orchaAgentId:r.agentId,runtimeSessionId:r.runtimeSessionId,bridgeUpdateId:de()}}}function Ac(e){if(!d(e)||Object.keys(e).some(n=>n!=="sessionId"&&n!=="update"))return"";let t=e.update,r=d(t)?t.content:null;return!_c.has(t?.sessionUpdate)||Object.keys(t).length!==2?"":d(r)&&r.type==="text"&&typeof r.text=="string"&&Object.keys(r).length===2?t.sessionUpdate:""}function Nc(e){let t=null,r=null,n=()=>{r&&clearTimeout(r),r=null;let i=t;t=null,i&&e(i)};return{push:i=>{let o=Ac(i),a=o?i.update.content.text:"",c=t?.update.content.text;if(t&&o===t.update.sessionUpdate&&i.sessionId===t.sessionId&&!a.startsWith(c)&&!cr(a)){t.update.content.text=c+a;return}if(n(),!o){e(i);return}t={...i,update:{...i.update,content:{...i.update.content}}},r=setTimeout(n,gc),r.unref?.()},flush:n}}function F(e){return e==null||e===""?!1:typeof e=="string"?u(e)!=="":Array.isArray(e)?e.length>0:d(e)?Object.keys(e).length>0:!0}function Ss(e){let t=u(e).toLowerCase().replace(/[.。!!]+$/g,"").replace(/[\s-]+/g,"_");return dc.has(t)}function et(e,t){let r=R(e,t);return Number.isFinite(r)&&r>0?r:t}function vt(e,t=!1){if(typeof e=="boolean")return e;let r=u(e).toLowerCase();return["true","1","yes","y","on"].includes(r)?!0:["false","0","no","n","off"].includes(r)?!1:t}function Q(e){return u(e?.type||"echo")}function Rs(e){let t=Q(e);return t==="acp"||t==="stdio-acp"||t==="openclaw"}function Ar(e){if(d(e)){if(Object.prototype.hasOwnProperty.call(e,"releaseAfterPrompt"))return e.releaseAfterPrompt;if(Object.prototype.hasOwnProperty.call(e,"disposeAfterPrompt"))return e.disposeAfterPrompt}}function bc(e){let t=String(e||"");if(Rc.test(t))return!0;let r=t.replace(/[^a-z0-9]/gi,"").toLowerCase();return r.endsWith("token")||r.endsWith("secret")||r.endsWith("password")||r.endsWith("apikey")||r.endsWith("privatekey")||r==="authorization"||r==="cookie"||r==="jwt"||r.includes("credential")}function Nr(e,t=0){if(e==null||typeof e=="number"||typeof e=="boolean")return e;if(typeof e=="string"){if(e.length<=Ir)return e;let r=e.length-Ir;return`${e.slice(0,Ir)}... [truncated ${r} characters]`}if(t>=Rr)return Array.isArray(e)?`[array truncated at depth ${Rr}, items=${e.length}]`:d(e)?`[object truncated at depth ${Rr}, keys=${Object.keys(e).length}]`:String(e);if(Array.isArray(e)){let r=e.slice(0,Or).map(n=>Nr(n,t+1));return e.length>Or&&r.push(`[truncated ${e.length-Or} items]`),r}if(d(e)){let r={};for(let[n,s]of Object.entries(e))r[n]=bc(n)?"[REDACTED]":Nr(s,t+1);return r}return String(e)}var Mc=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 Uc(e){if(!d(e))return e;let t={};for(let r of Mc)F(e[r])&&(t[r]=e[r]);return t}function Pc(e){if(!d(e))return e;let t={...e};return d(t.renderedPayload)&&(t.renderedPayload=Uc(t.renderedPayload)),t}function Lc(e){let t=d(e)?e:{},r={};F(t.metadata)&&(r.metadata=Pc(t.metadata));for(let[n,s]of Object.entries(t))Sc.has(n)||n==="metadata"||F(s)&&(r[n]=s);return r}function kc(e){let t=d(e)?e:{},r=d(t.metadata)?t.metadata:{},n=d(r.renderedPayload)?r.renderedPayload:{};return d(t.resultContract)?t.resultContract:d(n.resultContract)?n.resultContract:{}}function Os(e){return u(kc(e).kind).toLowerCase()==="decision"}function vc(e){return e?.dispatchFinalTextOnly===!0||e?.dispatchFinalOutputOnly===!0?!0:e?.dispatchFinalTextOnly===!1||e?.dispatchFinalOutputOnly===!1?!1:Q(e)==="cli"}function ys(e){let t=e?.dispatchReleaseAfterPrompt??e?.dispatchDisposeAfterPrompt;return vt(t,Rs(e))}function Dc(e,t){let r=d(e?.metadata)?{...e.metadata}:{},n=d(r._runtimeBridge)?{...r._runtimeBridge}:{},s=Ar(n);return r._runtimeBridge={...n,promptKind:"dispatch",finalTextOnly:vc(t),releaseAfterPrompt:s===void 0?ys(t):vt(s,ys(t)),requiresRuntimeResult:Os(e)},r}function $c(e){let t=Lc(e);if(!F(t))return"";let r=JSON.stringify(Nr(t),null,2);if(r.length<=Sr)return r;let n=r.length-Sr;return`${r.slice(0,Sr)}
26
- ... [truncated ${n} characters]`}function Mr(e){if(!d(e))return"";let t=d(e.update)?e.update:e,n=(d(t.content)?t.content:{}).text??t.text;return n==null?"":String(n)}function br(e){if(!d(e))return"";let t=d(e.update)?e.update:e;return u(t.sessionUpdate)}function Ur(e){if(!Array.isArray(e))return"";let t=!1,r=[],n=[],s=[],i=()=>{r.length>0&&(n.push(r),r=[])};for(let a of e){let c=br(a),l=Mr(a);if(!c){l&&s.push(l);continue}if(t=!0,c==="agent_message_chunk"){l&&r.push(l);continue}if(c==="agent_message_snapshot"){n.length=0,r=l?[l]:[];continue}(c==="agent_thought_chunk"||c==="user_message_chunk"||c==="tool_call"||c==="tool_call_update"||c==="plan")&&i()}if(i(),!t)return Et(s);let o=n[n.length-1]||[];return Et(o)}function Hc(e){return Array.isArray(e)?e.map(Mr).filter(t=>t!==""):[]}function pe(e){return Array.isArray(e)?e.some(r=>br(r))?e.filter(r=>Ec.has(br(r))).map(Mr).filter(r=>r!==""):Hc(e):[]}function Fc(e){if(!d(e))return null;let t=d(e.update)?e.update:e;return u(t.sessionUpdate)!=="runtime_event"?null:d(t.event)?t.event:null}function Bc(e){if(!d(e))return"";let t=d(e.payload)?e.payload:{},r=u(e.type),n=u(t.type);if(r==="event_msg"){if(n==="task_complete")return u(t.last_agent_message||t.message||t.output);if(n==="agent_message"){let s=u(t.phase||t.status||t.stage).toLowerCase();if(["final_answer","final","complete","completed","done"].includes(s))return u(t.message||t.text||t.content)}}return""}function jc(e){if(!Array.isArray(e))return"";for(let t=e.length-1;t>=0;t-=1){let r=Bc(Fc(e[t]));if(r)return r}return""}function Et(e){let t="";for(let r of e){let n=String(r||"");if(n)if(!t)t=n;else if(n.length>t.length&&n.startsWith(t))t=n;else{let s=cr(n)&&!/[\r\n]$/.test(t)?`
26
+ `);return ya({input:e.stdout}).on("line",o=>{if(!o.trim())return;let a;try{a=JSON.parse(o)}catch{_("warn","runtime.codex","ignored non-JSON app-server output",{line:o.slice(0,200)});return}if(typeof a.method=="string"&&a.id!==void 0){Promise.resolve().then(()=>r(a.method,d(a.params)?a.params:{})).then(l=>i({id:a.id,result:l}),l=>i({id:a.id,error:{code:-32603,message:String(l?.message||l)}}));return}if(typeof a.method=="string"){t(a.method,d(a.params)?a.params:{});return}let c=s.get(a.id);c&&(s.delete(a.id),a.error?c.reject(wt("RUNTIME_CODEX_APP_SERVER_ERROR",u(a.error.message)||"Codex app-server request failed")):c.resolve(a.result))}),{request:(o,a)=>new Promise((c,l)=>{let p=n++;s.set(p,{resolve:c,reject:l}),i({id:p,method:o,params:a})}),notify:o=>i({method:o})}}var se=class extends Tt{async runPrompt(t,r,n,s){let i=u(this.target.command);if(!i)throw new Error(`runtime target ${this.agent.targetCode} is missing command`);if(this.options.prepareLaunch)throw wt("BAD_REQUEST","Codex app-server \u53EA\u652F\u6301\u5DF2\u63A5\u5165\u7684\u672C\u673A\u8BBE\u5907\uFF0C\u4E0D\u652F\u6301\u6C99\u7BB1\u542F\u52A8");let o=u(t.sessionId)||_a(),a=W(this.target,this.agent.workspace),c=Je(this.target,o);this.deliveryCwd=a,this.deliveryRoots=[a,...Xe(this.target,c.root).trustedFileRoots],this.deliveryThreadId=s||null;let l=Ve(t,this.target),p=R(this.target.timeoutMs||this.target.sessionPromptTimeoutMs,R(this.options.sessionPromptTimeoutMs,z)),h={sessionId:o,emitUpdate:r,ended:new AbortController};this.approvalTurn=h;let f=ga(i,[...P(this.target.args),...this.taskMcp?.args||[]],{cwd:a,env:{...process.env,...d(this.target.env)?this.target.env:{},...this.taskMcp?.environment||{},ORCHA_AGENT_ID:this.agent.agentId,ORCHA_SESSION_ID:o,ORCHA_RUNTIME_ARTIFACT_DIR:c.root},stdio:["pipe","pipe","pipe"],detached:process.platform!=="win32",windowsHide:!0});this.active.set(o,f),_("info","runtime.codex","app-server turn started",{target:this.agent.targetCode,sessionId:o,pid:f.pid,timeoutMs:p});let m=T=>r({sessionId:o,update:T}),g="";return f.stderr.setEncoding("utf8"),f.stderr.on("data",T=>{g=`${g}${T}`.slice(-4e3)}),await new Promise((T,x)=>{let w={threadId:null,turnId:null,items:new Map,pending:"",lastError:""},I=!1,y=(E,O)=>{I||(I=!0,clearTimeout(S),h.ended.abort(),this.approvalTurn===h&&(this.approvalTurn=null),this.active.delete(o),yt(f),We(c,{target:this.agent.targetCode,sessionId:o}),_("info","runtime.codex","app-server turn finished",{target:this.agent.targetCode,sessionId:o,status:E?"failed":"completed",...E?{error:String(E.message||E)}:{}}),E?x(E):T(O))},S=setTimeout(()=>y(wt("RUNTIME_CLI_TIMEOUT",`runtime CLI timed out after ${p}ms`)),p);S.unref?.(),f.on("error",E=>y(E)),f.on("exit",(E,O)=>y(Object.assign(new Error(`Codex app-server exited before the turn completed (${O||E})${g.trim()?`: ${g.trim().slice(-500)}`:""}`),{code:"RUNTIME_CLI_EXIT_NONZERO",exitCode:E,signal:O})));let N=()=>{w.pending&&l&&m({sessionUpdate:"agent_thought_chunk",content:{type:"text",text:w.pending}}),w.pending=""},A=Oa(f,{onRequest:async(E,O)=>{if(Ta.has(E)){let C=await this.requestApproval(Un(E,O,w.items.get(O.itemId)),{});return Pn(E,O,C?.outcome==="approved")}if(E==="mcpServer/elicitation/request")return O.serverName==="orcha"&&O.mode!=="url"?{action:"accept",content:{},_meta:null}:{action:"decline",content:null,_meta:null};throw new Error(`OrchaAI does not handle Codex request ${E}`)},onNotification:(E,O)=>{if(O.threadId&&w.threadId&&O.threadId!==w.threadId)return;let C=d(O.item)?O.item:null;if(E==="item/started"&&C){w.items.set(C.id,C);let L=is(C);if(!L)return;N(),m({sessionUpdate:"tool_call",toolCallId:C.id,title:L,status:"in_progress",rawInput:Sa(C)})}else if(E==="item/completed"&&C)w.items.set(C.id,C),C.type==="agentMessage"&&u(C.text)?(N(),C.phase==="commentary"?l&&m({sessionUpdate:"agent_thought_chunk",content:{type:"text",text:C.text}}):w.pending=C.text):C.type==="contextCompaction"?m({sessionUpdate:"runtime_event",event:{payload:{type:"context_compacted",id:C.id}}}):is(C)&&m({sessionUpdate:"tool_call_update",toolCallId:C.id,status:Ea.has(C.status)||C.success===!1?"failed":"completed",rawOutput:Ra(C)});else if(E==="mcpServer/startupStatus/updated"&&O.name==="orcha"&&O.status==="failed")y(wt("RUNTIME_CODEX_MCP_UNAVAILABLE",`Codex \u672A\u80FD\u8FDE\u63A5 OrchaAI \u4EFB\u52A1\u5DE5\u5177\uFF1A${u(O.error)||"\u542F\u52A8\u5931\u8D25"}`));else if(E==="error"&&O.willRetry!==!0)w.lastError=u(O.error?.message);else if(E==="turn/completed"&&(!w.turnId||O.turn?.id===w.turnId)){let L=d(O.turn)?O.turn:{};if(L.status!=="completed"){y(wt(L.status==="interrupted"?"RUNTIME_CODEX_TURN_INTERRUPTED":"RUNTIME_CODEX_TURN_FAILED",u(L.error?.message)||w.lastError||`Codex turn ${L.status||"failed"}`));return}w.pending&&m({sessionUpdate:"agent_message_chunk",content:{type:"text",text:w.pending}}),y(null,{stopReason:"end_turn",_artifacts:[]})}}});(async()=>{await A.request("initialize",{clientInfo:{name:"orcha_runtime_bridge",title:"OrchaAI Runtime Bridge",version:K},capabilities:null}),A.notify("initialized");let E=s?await A.request("thread/resume",{threadId:s,cwd:a,excludeTurns:!0}):await A.request("thread/start",{cwd:a}),O=u(E?.thread?.id);if(!O)throw wt("RUNTIME_CODEX_APP_SERVER_ERROR","Codex app-server did not return a thread");w.threadId=O,this.deliveryThreadId=O,m({sessionUpdate:"runtime_event",event:{type:"thread.started",thread_id:O}});let C=await A.request("turn/start",{threadId:O,input:[{type:"text",text:mt(t.prompt),text_elements:[]}]});w.turnId=u(C?.turn?.id)||null})().catch(E=>y(E))})}};var Qe="ORCHA_RUNTIME_OUTPUT_START",Ze="ORCHA_RUNTIME_OUTPUT_END",tr="ORCHA_RUNTIME_CONTROL_START",er="ORCHA_RUNTIME_CONTROL_END",rr=Qe,nr=Ze,sr=tr,ir=er,or=[Qe,Ze,tr,er],Ia=new Set(["_artifacts","_decision","_meta"]),Ca=new RegExp(`(?:^|(?<=[\\r\\n]))[ \\t]*(?<marker>${or.join("|")})[ \\t]*(?=\\r\\n?|\\n|$)`,"g"),H=class extends Error{constructor(t,r,n){super(r),this.name="RuntimeResultProtocolError",this.code=t,this.detail={rawOutput:n}}};function ar(e){let t=typeof e=="string"?e.trimStart():"";return or.some(r=>t.startsWith(r))}function cr(e){if(typeof e!="string")return null;let t=e,r=xa(t);if(![...r.values()].some(m=>m.length>0))return null;let n=[],s=[];for(let[m,g]of r)g.length===0?n.push(m):g.length>1&&s.push(m);if(n.length>0||s.length>0){let m=[];throw n.length>0&&m.push(`\u7F3A\u5C11 ${n.join(", ")}`),s.length>0&&m.push(`\u91CD\u590D ${s.join(", ")}`),new H("invalid_markers",`Runtime Result \u534F\u8BAE\u6807\u8BB0\u4E0D\u5B8C\u6574\uFF1A${m.join("\uFF1B")}`,t)}let i=r.get(Qe)[0],o=r.get(Ze)[0],a=r.get(tr)[0],c=r.get(er)[0];if(!(i.end<=o.start&&o.end<=a.start&&a.end<=c.start))throw new H("invalid_marker_order","Runtime Result \u534F\u8BAE\u6807\u8BB0\u987A\u5E8F\u9519\u8BEF\uFF1A\u5FC5\u987B\u5148\u8F93\u51FA OUTPUT \u5757\uFF0C\u518D\u8F93\u51FA CONTROL \u5757",t);let l=Aa(t.slice(i.end,o.start));if(!l.trim())throw new H("empty_output","Runtime Result OUTPUT \u5757\u4E0D\u80FD\u4E3A\u7A7A",t);let p=t.slice(a.end,c.start).trim();if(!p)throw new H("empty_control","Runtime Result CONTROL \u5757\u4E0D\u80FD\u4E3A\u7A7A",t);let h;try{h=JSON.parse(p)}catch(m){throw new H("invalid_control_json",`Runtime Result CONTROL \u5757\u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${String(m?.message||m)}`,t)}if(!cs(h))throw new H("invalid_control_type","Runtime Result CONTROL \u5757\u5FC5\u987B\u662F JSON \u5BF9\u8C61",t);let f=Object.keys(h).filter(m=>!Ia.has(m)).sort();if(f.length>0)throw new H("invalid_control_keys",`Runtime Result CONTROL \u5757\u5305\u542B\u975E\u6807\u51C6\u5B57\u6BB5\uFF1A${f.join(", ")}`,t);if("_artifacts"in h&&!Array.isArray(h._artifacts))throw new H("invalid_control_field_type","Runtime Result CONTROL \u5757\u7684 _artifacts \u5FC5\u987B\u662F JSON \u6570\u7EC4",t);for(let m of["_decision","_meta"])if(m in h&&!cs(h[m]))throw new H("invalid_control_field_type",`Runtime Result CONTROL \u5757\u7684 ${m} \u5FC5\u987B\u662F JSON \u5BF9\u8C61`,t);return{output:l,...h}}function xa(e){let t=new Map(or.map(r=>[r,[]]));for(let r of e.matchAll(Ca))t.get(r.groups.marker).push({start:r.index,end:r.index+r[0].length});return t}function Aa(e){let t=e.match(/^(?:\r\n|\r|\n)/)?.[0]||"",r=t?e.slice(t.length):e;return t&&r.endsWith(t)?r.slice(0,-t.length):r}function cs(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}import{createHash as ba}from"node:crypto";var Na="orcha.goal-contract/v1",Ma=new Set(["complete","completed","done","ok","passed","success","succeeded"]),Ua=new Set(["aborted","blocked","cancelled","canceled","denied","error","failed","failure","timeout","timed_out"]),Pa=new Map([["exec_command","run_command"],["local_shell_call","run_command"],["run_command","run_command"],["apply_patch","apply_patch"],["read_file","read_file"],["list_files","list_files"],["plugin_operation","plugin_operation"]]);function pr(e){return ba("sha256").update(Y(e)).digest("hex")}function ls(e){if(!ps(e))return"";let t=["The following Orcha goal contract is immutable for this turn. Do not narrow its outcome or constraints.",`<goal_contract>${JSON.stringify(e)}</goal_contract>`];return e.verificationPlan?.required===!0&&t.push("Every verification check must be satisfied by a real successful tool call from one of its toolNames.","Each check requires requiredMatches distinct successful tool call IDs; repeated updates for one call count once.","A final text claim is not verification; missing or failed tool evidence prevents completion."),t.join(`
27
+ `)}function ds(e,t,r=""){if(!ps(e))return e==null?null:{required:!0,status:"failed",outcome:u(e?.outcome),goalContractHash:"",checks:[],errorCode:"invalid_goal_contract"};let n=pr(e),s=e.verificationPlan.required===!0;if(u(r)&&u(r)!==n)return{required:s,status:"failed",outcome:e.outcome,goalContractHash:n,checks:[],errorCode:"goal_contract_hash_mismatch"};if(!s)return{required:!1,status:"not_required",outcome:e.outcome,goalContractHash:n,checks:[]};let i=La(t),o=e.verificationPlan.checks.map(c=>Ba(c,i));return{required:!0,status:o.some(c=>c.status==="failed")?"failed":o.some(c=>c.status==="missing")?"missing":"passed",outcome:e.outcome,goalContractHash:n,checks:o}}function ps(e){if(!d(e)||e.schemaVersion!==Na||!u(e.outcome))return!1;let t=e.verificationPlan;if(!d(t)||typeof t.required!="boolean"||!Array.isArray(t.checks)||t.required&&t.checks.length===0)return!1;let r=new Set;for(let n of t.checks)if(!d(n)||!u(n.id)||r.has(u(n.id))||(r.add(u(n.id)),!Array.isArray(n.toolNames)||n.toolNames.length===0||n.toolNames.some(s=>!u(s)))||!Number.isSafeInteger(n.requiredMatches)||n.requiredMatches<1||n.arguments!==void 0&&!d(n.arguments))return!1;return!0}function La(e){let t=new Map,r=[];for(let n of Array.isArray(e)?e:[]){let s=d(n?.update)?n.update:{},i=u(s.sessionUpdate);if(i==="runtime_event"){ka(s.event,t,r);continue}if(i==="tool_call"){let o=oe(s)||`tool-${r.length+1}`,a=ie(t,r,o),c=lr(s,s.name||s.toolName||s.kind);a.toolName=c.toolName,a.arguments=c.arguments,a.status=Lt(s.status),a.evidence=ce(s);continue}if(i==="tool_call_update"){let o=oe(s);if(!o)continue;let a=ie(t,r,o),c=lr(s,s.name||s.toolName||s.kind);a.toolName||=c.toolName,Object.keys(a.arguments).length===0&&(a.arguments=c.arguments),a.status=Lt(s.status),a.evidence.push(...ce(s))}}return r}function ka(e,t,r){let n=d(e)&&d(e.payload)?e.payload:d(e)?e:{},s=u(n.type);if(["function_call","custom_tool_call","local_shell_call","mcp_tool_call"].includes(s)){let a=oe(n)||`runtime-${r.length+1}`,c=ie(t,r,a),l=lr(n,n.name||n.tool||s,s);c.toolName=l.toolName,c.arguments=l.arguments,c.status=Lt(n.status),c.evidence.push(...ce(n));return}if(!["function_call_output","custom_tool_call_output","local_shell_call_output","mcp_tool_call_output"].includes(s))return;let i=oe(n);if(!i)return;let o=ie(t,r,i);o.status=Ha(n,o.toolName),o.evidence.push(...ce(n))}function ie(e,t,r){let n=e.get(r);return n||(n={toolCallId:r,toolName:"",arguments:{},status:"unknown",evidence:[]},e.set(r,n),t.push(n)),n}function va(e){let t=u(e).toLowerCase();return Pa.get(t)||t}function lr(e,t,r=""){let n=Da(e),s=u(r)==="mcp_tool_call"||u(e?.kind).toLowerCase()==="mcp",i=d(e?._meta)?e._meta:{},o=u(e?.server||e?.serverName||e?.server_name||e?.mcpServer||i.server||i.serverName).toLowerCase();if(s&&o==="orcha"){let a=u(e?.tool||e?.toolName||e?.name||t);return{toolName:"plugin_operation",arguments:{...n,...a?{operationCode:a}:{}}}}return{toolName:va(t),arguments:n}}function oe(e){return d(e)?u(e.call_id||e.callId||e.toolCallId||e.id):""}function Da(e){if(!d(e))return{};for(let r of["arguments","args","rawInput","input","params","parameters"]){let n=$a(e[r]);if(n)return n}let t={};for(let r of["cmd","command","cwd","operationCode","path","query","url"])e[r]!==void 0&&(t[r]=e[r]);return t}function $a(e){if(d(e))return structuredClone(e);if(typeof e!="string")return null;try{let t=JSON.parse(e);return d(t)?t:null}catch{return null}}function Ha(e,t){if(!d(e))return"unknown";let r=ae(e,0,{parseCliExitCode:t==="run_command"||t==="apply_patch"});return r.includes("failed")?"failed":r.includes("success")?"success":"unknown"}function ae(e,t=0,r={}){if(t>8||e===null||e===void 0)return[];if(typeof e=="string")return Fa(e,t,r);if(Array.isArray(e))return e.flatMap(o=>ae(o,t+1,r));if(!d(e))return[];let n=[];typeof e.isError=="boolean"&&n.push(e.isError?"failed":"success"),typeof e.ok=="boolean"&&n.push(e.ok?"success":"failed"),typeof e.success=="boolean"&&n.push(e.success?"success":"failed");let s=Lt(e.status);s!=="unknown"&&n.push(s);let i=e.exitCode??e.exit_code;typeof i=="number"&&Number.isFinite(i)&&n.push(i===0?"success":"failed");for(let o of["output","result","structuredContent","content"])e[o]!==void 0&&n.push(...ae(e[o],t+1,r));return n}function Fa(e,t,r){let n=e.trim();if(!n)return[];try{return ae(JSON.parse(n),t+1,r)}catch{}if(r.parseCliExitCode!==!0)return[];let s=[];for(let i of n.matchAll(/(?:process\s+exited\s+with\s+code|exit\s+code\s*:?)\s*(-?\d+)/gi))s.push(Number(i[1])===0?"success":"failed");return s}function Lt(e){let t=u(e).toLowerCase();return Ma.has(t)?"success":Ua.has(t)?"failed":"unknown"}function ce(e){if(!d(e))return[];let t=d(e.output)?e.output:{},r=[e.verificationEvidence,d(e.verification)?e.verification.evidence:null,t.verificationEvidence,d(t.verification)?t.verification.evidence:null],n=[];for(let s of r)for(let i of Array.isArray(s)?s:s?[s]:[])!d(i)||!u(i.id)||n.push({id:u(i.id),status:Lt(i.status??(i.passed===!0?"passed":i.passed===!1?"failed":"")),...u(i.message)?{message:u(i.message)}:{}});return n}function Ba(e,t){let r=t.filter(o=>e.toolNames.includes(o.toolName)&&dr(e.arguments||{},o.arguments)),n=u(e.evidenceId),s=r.filter(o=>o.status==="success"&&(!n||o.evidence.some(a=>a.id===n&&a.status==="success")));if(s.length>=e.requiredMatches)return ur(e,"passed",s,`Runtime tool evidence passed ${s.length} times.`);let i=r.filter(o=>o.status==="failed"||n&&o.evidence.some(a=>a.id===n&&a.status==="failed"));return s.length===0&&i.length?ur(e,"failed",i,"Runtime tool evidence failed."):ur(e,"missing",s,`Only ${s.length}/${e.requiredMatches} required tool executions passed.`)}function ur(e,t,r,n){let s=r.map(i=>i.toolCallId).filter(Boolean);return{id:e.id,status:t,message:n,...u(e.description)?{description:u(e.description)}:{},toolNames:e.toolNames,requiredMatches:e.requiredMatches,observedMatches:s.length,toolCallIds:s,...d(e.arguments)?{arguments:e.arguments}:{},...u(e.evidenceId)?{evidenceId:u(e.evidenceId)}:{}}}function dr(e,t){return Array.isArray(e)?Array.isArray(t)&&e.length===t.length&&e.every((r,n)=>dr(r,t[n])):d(e)?d(t)?Object.entries(e).every(([r,n])=>Object.hasOwn(t,r)&&dr(n,t[r])):!1:Object.is(e,t)}function Y(e){if(e===null||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="string")return us(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new Error("invalid_jcs_number");return JSON.stringify(Object.is(e,-0)?0:e)}if(Array.isArray(e))return`[${Array.from({length:e.length},(t,r)=>{if(!Object.hasOwn(e,r))throw new Error("invalid_jcs_json_value");return Y(e[r])}).join(",")}]`;if(d(e))return`{${Object.keys(e).sort().map(t=>`${us(t)}:${Y(e[t])}`).join(",")}}`;throw new Error("invalid_jcs_json_value")}function us(e){return ja(e),JSON.stringify(e)}function ja(e){for(let t=0;t<e.length;t+=1){let r=e.charCodeAt(t);if(r>=55296&&r<=56319){let n=e.charCodeAt(t+1);if(!(n>=56320&&n<=57343))throw new Error("invalid_jcs_unicode");t+=1}else if(r>=56320&&r<=57343)throw new Error("invalid_jcs_unicode")}}import{spawn as qa}from"node:child_process";import{createHash as Ga,randomUUID as Ka}from"node:crypto";import{constants as za}from"node:fs";import{access as Va,mkdir as fr,readdir as Ja,realpath as kt,rm as Wa,stat as Xa}from"node:fs/promises";import Ya from"node:http";import{tmpdir as Qa}from"node:os";import{isAbsolute as vt,join as Et,relative as fs,resolve as mr}from"node:path";var gr=1,Za="orcha.process-isolation/v1",_r="orcha.egress-proxy/v1",tc="--disable-wasm-trap-handler",ue={read_only:0,workspace_write:1,workspace_network:2},hr={read_only:["read_only","denied"],workspace_write:["workspace_write","denied"],workspace_network:["workspace_write","restricted"]},ec=new Set([".env",".git-credentials",".netrc",".npmrc",".pypirc","credentials.json","secrets.json","id_rsa","id_ed25519"]);function dt(e){if(!d(e))throw b("RUNTIME_SANDBOX_POLICY_REQUIRED","sandboxPolicy is required");let t=structuredClone(e),r=u(t.accessMode),n=u(t.accessModeCeiling);if(!(r in hr)||!(n in hr))throw b("RUNTIME_SANDBOX_POLICY_INVALID","unsupported runtime access mode");if(ue[r]>ue[n])throw b("RUNTIME_SANDBOX_POLICY_INVALID","access mode exceeds its ceiling");let[s,i]=hr[r];if(t.filesystemMode!==s||t.networkMode!==i)throw b("RUNTIME_SANDBOX_POLICY_INVALID","runtime access profile does not match its mode");if(Number(t.policySchemaVersion)!==gr||!Number.isInteger(Number(t.policyRevision))||Number(t.policyRevision)<1)throw b("RUNTIME_SANDBOX_POLICY_INVALID","unsupported sandbox policy schema or revision");for(let[a,c]of Object.entries({outsideWorkspaceAccess:"denied",hostAccess:"denied",hostEnvironmentAccess:"denied",dockerSocketAccess:"denied",environmentMode:"allowlist"}))if(t[a]!==c)throw b("RUNTIME_SANDBOX_POLICY_INVALID",`${a} cannot be relaxed`);let o=d(t.processIsolation)?t.processIsolation:{};if(o.mode!=="required"||o.backend==="direct")throw b("RUNTIME_SANDBOX_POLICY_INVALID","strong process isolation is required");if(Array.isArray(t.alwaysApprovedApprovalKeys)&&t.alwaysApprovedApprovalKeys.length)throw b("RUNTIME_SANDBOX_POLICY_INVALID","persistent runtime approvals are forbidden");return t}function hs(e,t){let r=dt(e),n=dt(t);return ue[n.accessMode]<ue[r.accessMode]}async function ms(e){if(!e.sandboxRequired)return{dispatchable:!0,enforced:!1,backend:"direct",daemonStatus:"not_required",daemonProtocolVersion:"",policySchemaVersions:[gr],runtimePolicyUpdates:!1,workspaceSync:!1,egressProxy:!1,reason:"external_runtime_sandbox_not_required"};let t=await _s(e.sandboxBrokerCommand,process.env.PATH||"");if(!t)throw b("RUNTIME_SANDBOX_UNAVAILABLE","sandbox broker is not executable");let r=await oc(t,P(e.sandboxBrokerArguments),e.sandboxProbeTimeoutMs);if(r.enforced!==!0||u(r.protocolVersion)!=="orcha.runtime-sandbox-broker/v1"||!["bubblewrap","broker"].includes(u(r.backend)))throw b("RUNTIME_SANDBOX_UNAVAILABLE","sandbox broker did not report enforced isolation");let n=d(r.probes)?r.probes:{};for(let s of["emptyRoot","outsideWorkspaceDenied","hostFilesystemDenied","sensitiveFilesDenied","environmentAllowlist","dockerSocketDenied","networkNamespace","workspaceReadOnly","workspaceWrite","resourceLimits"])if(n[s]!==!0)throw b("RUNTIME_SANDBOX_UNAVAILABLE",`sandbox broker probe failed: ${s}`);return e.egressProxyRequired&&await uc(e),{dispatchable:!0,enforced:!0,backend:u(r.backend),daemonStatus:"ok",daemonProtocolVersion:u(r.protocolVersion||"orcha.runtime-sandbox-broker/v1"),policySchemaVersions:[gr],runtimePolicyUpdates:!0,workspaceSync:!1,egressProxy:e.egressProxyRequired}}async function yr(e,t,r){let n=u(t.workspace||t.cwd),s=u(r),i=n||(t.allowRequestWorkspace===!0?s:"");if(!i||!vt(i))throw b("RUNTIME_WORKSPACE_NOT_CONFIGURED","runtime target must configure an absolute trusted workspace");let o=await kt(i);if(!(await Xa(o)).isDirectory())throw b("RUNTIME_WORKSPACE_INVALID","runtime workspace is not a directory");if(!(e.trustedWorkspaceRoots.length?await Promise.all(e.trustedWorkspaceRoots.map(l=>kt(l))):[o]).some(l=>wr(l,o)))throw b("RUNTIME_WORKSPACE_OUTSIDE_TRUSTED_ROOT","runtime workspace is outside trusted roots");return o}async function gs({config:e,target:t,command:r,args:n,cwd:s,environment:i,runId:o,agentId:a,sessionId:c,sandboxPolicy:l}){if(!e.sandboxRequired)return{command:r,args:[...n],cwd:s,environment:{...process.env,...i},tempDirectory:"",isolation:{enforced:!1,backend:"development_direct"},cleanup:async()=>{}};let p=dt(l),h=await yr(e,t,s),f=await kt(s);if(!wr(h,f))throw b("RUNTIME_WORKSPACE_CWD_INVALID","runtime cwd is outside its workspace");let m=await _s(e.sandboxBrokerCommand,process.env.PATH||"");if(!m)throw b("RUNTIME_SANDBOX_UNAVAILABLE","sandbox broker is not executable");let g=`runtime-${Ga("sha256").update(String(o)).digest("hex").slice(0,32)}`,T=mr(e.sandboxTempRoot||Et(Qa(),"orcha-runtime-sandboxes"));await fr(T,{recursive:!0,mode:448});let x=Et(T,`${g}-${Ka()}`),w=Et(x,"home"),I=Et(x,"artifacts");await fr(w,{recursive:!0,mode:448}),await fr(I,{recursive:!0,mode:448});let y=p.networkMode==="restricted"?await ac(e,{runId:String(o),instanceId:g,policyRevision:Number(p.policyRevision),ttlMs:Math.min(R(p.maxRuntimeSeconds,900)*1e3,e.egressGrantMaxTtlMs),maxTransferBytes:R(p.maxNetworkBytes,64*1024*1024)}):null,S={PATH:u(i.PATH||process.env.PATH),LANG:u(i.LANG||process.env.LANG||"C.UTF-8"),HOME:"/tmp/home",TMPDIR:"/tmp",USER:"orcha",LOGNAME:"orcha",SHELL:"/bin/sh",ORCHA_AGENT_ID:String(a),ORCHA_SESSION_ID:String(c),ORCHA_RUN_ID:String(o),ORCHA_RUNTIME_ARTIFACT_DIR:"/tmp/artifacts",...nc(t,i)};S.HOME="/tmp/home",S.TMPDIR="/tmp",S.ORCHA_RUNTIME_ARTIFACT_DIR="/tmp/artifacts",S.NODE_OPTIONS=tc;let N={schemaVersion:Za,runId:String(o),instanceId:g,workspace:h,cwd:f,filesystemMode:p.filesystemMode,networkMode:p.networkMode,environmentMode:"allowlist",deniedRelativePaths:await sc(h),temporaryDirectory:x,egressProxy:y,environment:S,resourceLimits:ic(p),readOnlyToolchainRoots:await rc(e,t)},A=!1,E=async()=>{if(!A){A=!0;try{y&&await cc(e,y,{runId:String(o),instanceId:g})}finally{await Wa(x,{recursive:!0,force:!0})}}};return{command:m,args:[...P(e.sandboxBrokerArguments),"--",r,...n],cwd:f,environment:{PATH:process.env.PATH||"",LANG:process.env.LANG||"C.UTF-8",ORCHA_PROCESS_ISOLATION_REQUEST:JSON.stringify(N)},tempDirectory:x,homeDirectory:w,artifactDirectory:I,pathMappings:[{runtimeRoot:"/tmp/artifacts",hostRoot:I},{runtimeRoot:"/tmp/home",hostRoot:w}],isolation:{enforced:!0,backend:"broker",instanceId:g,policyRevision:p.policyRevision},cleanup:E}}async function rc(e,t){let r=P(t.toolchainRoots||t.sandboxToolchainRoots);if(!r.length)return[];let n=await Promise.all(P(e.trustedToolchainRoots).map(i=>kt(i)));if(!n.length)throw b("RUNTIME_TOOLCHAIN_ROOT_NOT_TRUSTED","target toolchain roots require ORCHA_RUNTIME_TRUSTED_TOOLCHAIN_ROOTS");let s=[];for(let i of r){if(!vt(i))throw b("RUNTIME_TOOLCHAIN_ROOT_INVALID","toolchain roots must be absolute");let o=await kt(i);if(!n.some(a=>wr(a,o)))throw b("RUNTIME_TOOLCHAIN_ROOT_NOT_TRUSTED","toolchain root is outside trusted roots");s.push(o)}return[...new Set(s)]}function nc(e,t){let r=d(e.env)?e.env:{},n={};for(let[s,i]of Object.entries(r))/^[A-Za-z_][A-Za-z0-9_]*$/.test(s)&&i!=null&&(n[s]=String(i));for(let s of["ORCHA_RUNTIME_PROMPT","ORCHA_RUNTIME_ARTIFACT_DIR"])t[s]!=null&&(n[s]=String(t[s]));return n}async function sc(e){let t=[],r=0,n=async s=>{let i;try{i=await Ja(s,{withFileTypes:!0})}catch(o){if(s===e)throw o;return}for(let o of i){if(r+=1,r>1e4)throw b("RUNTIME_WORKSPACE_SCAN_LIMIT_EXCEEDED","workspace contains more than 10000 entries");let a=Et(s,o.name),c=fs(e,a),l=o.name.toLowerCase();(ec.has(l)||l.startsWith(".env."))&&t.push(c),o.isDirectory()&&!o.isSymbolicLink()&&await n(a)}};return await n(e),t.sort()}function ic(e){return{maxCpuSeconds:Math.max(1,R(e.maxRuntimeSeconds,900)),maxMemoryBytes:R(e.maxMemoryBytes,2*1024*1024*1024),maxProcesses:R(e.maxProcesses,128),maxOpenFiles:R(e.maxOpenFiles,1024),maxFileBytes:R(e.maxFileBytes,64*1024*1024)}}async function oc(e,t,r){return await new Promise((n,s)=>{let i=qa(e,[...t,"--probe"],{env:{PATH:process.env.PATH||"",LANG:"C.UTF-8"},stdio:["ignore","pipe","pipe"],windowsHide:!0}),o=[],a=[];i.stdout.on("data",l=>o.push(Buffer.from(l))),i.stderr.on("data",l=>a.push(Buffer.from(l)));let c=setTimeout(()=>i.kill("SIGKILL"),Math.max(1e3,r));i.once("error",s),i.once("close",l=>{if(clearTimeout(c),l!==0){s(b("RUNTIME_SANDBOX_UNAVAILABLE",Buffer.concat(a).toString("utf8").trim()||`sandbox probe exited with ${l}`));return}try{n(JSON.parse(Buffer.concat(o).toString("utf8")))}catch{s(b("RUNTIME_SANDBOX_UNAVAILABLE","sandbox probe returned invalid JSON"))}})})}async function _s(e,t){let r=u(e);if(!r)return"";let n=vt(r)?[r]:String(t||"").split(":").filter(Boolean).map(s=>Et(s,r));for(let s of n)try{return await Va(s,za.X_OK),s}catch{}return""}async function ac(e,t){if(!e.egressProxyRequired)throw b("RUNTIME_EGRESS_UNAVAILABLE","restricted network requires the Egress Proxy");let r=await Tr(e,"POST","/v1/grants",{protocolVersion:_r,...t}),n={socketPath:e.egressProxySocket,grantId:u(r.grantId),credential:u(r.credential)};if(!n.grantId||!n.credential)throw b("RUNTIME_EGRESS_UNAVAILABLE","Egress Proxy returned an invalid grant");return n}async function cc(e,t,r){await Tr(e,"POST",`/v1/grants/${encodeURIComponent(t.grantId)}/revoke`,{protocolVersion:_r,...r}).catch(()=>{})}async function uc(e){let t=await Tr(e,"GET","/health");if(t.status!=="ok"||t.proxy!=="orcha-egress-proxy"||t.protocolVersion!==_r)throw b("RUNTIME_EGRESS_UNAVAILABLE","Egress Proxy is unavailable or incompatible")}async function Tr(e,t,r,n){if(!vt(e.egressProxySocket)||!e.egressProxyToken)throw b("RUNTIME_EGRESS_UNAVAILABLE","Egress Proxy socket and token are required");return await new Promise((s,i)=>{let o=Ya.request({socketPath:e.egressProxySocket,path:r,method:t,headers:{Authorization:`Bearer ${e.egressProxyToken}`,Accept:"application/json",...n?{"Content-Type":"application/json"}:{}}},a=>{let c=[],l=0;a.on("data",p=>{l+=p.length,l>1048576?o.destroy(new Error("egress response is too large")):c.push(Buffer.from(p))}),a.once("end",()=>{try{let p=JSON.parse(Buffer.concat(c).toString("utf8")||"{}");(a.statusCode||500)>=400?i(b("RUNTIME_EGRESS_UNAVAILABLE",u(p.error)||"Egress Proxy rejected the request")):s(p)}catch(p){i(p)}})});o.once("error",i),o.setTimeout(3e3,()=>o.destroy(new Error("Egress Proxy request timed out"))),n?o.end(JSON.stringify(n)):o.end()})}function wr(e,t){let r=fs(mr(e),mr(t));return r===""||!r.startsWith("..")&&!vt(r)}function b(e,t){return Object.assign(new Error(t),{code:e})}var Er=24e3,Sr=8,Rr=50,Or=6e3,dc=new Set(["fail","failed","failure","error","errored","timeout","timed_out","cancelled","canceled","aborted"]),pc=10*60*1e3,fc=60*1e3,hc=8,mc=30*60*1e3,gc=100,_c=new Set(["agent_message_chunk","agent_thought_chunk"]),yc=60*1e3,Tc=1,Es=2400,wc=new Set(["max_tokens","max_output_tokens","length"]),Ec=new Set(["agent_message_chunk","tool_call","tool_call_update"]),Sc=new Set(["agentId","taskId","executionId","sessionId","nodeId","targetCode","framework","workspace","instructions"]),Rc=/(^|[_-])(token|secret|password|authorization|api[-_]?key|private[-_]?key|credential|cookie|jwt|access[-_]?token|refresh[-_]?token|service[-_]?token|execution[-_]?token)([_-]|$)/i;function Oc(e){if(!d(e))return{};let t={};for(let r of["name","code","serverName","serverCode","type","transport","url","command","protocolVersion"]){let n=u(e[r]);n&&(t[r]=n)}return t}function Ic(e){return(Array.isArray(e)?e:[]).map(Oc).sort((t,r)=>{let n=Y(t),s=Y(r);return n<s?-1:n>s?1:0})}function Cc(e){return!d(e)||e.verificationPlan?.required!==!0?!1:(Array.isArray(e.verificationPlan.checks)?e.verificationPlan.checks:[]).some(r=>d(r)&&Array.isArray(r.toolNames)&&r.toolNames.some(n=>u(n)==="plugin_operation"))}function xc(e,t,r){let n=d(e?._meta)?e._meta:{};return{...d(e)?e:{},sessionId:t,update:d(e?.update)?e.update:{},_meta:{...n,orchaAgentId:r.agentId,runtimeSessionId:r.runtimeSessionId,bridgeUpdateId:de()}}}function Ac(e){if(!d(e)||Object.keys(e).some(n=>n!=="sessionId"&&n!=="update"))return"";let t=e.update,r=d(t)?t.content:null;return!_c.has(t?.sessionUpdate)||Object.keys(t).length!==2?"":d(r)&&r.type==="text"&&typeof r.text=="string"&&Object.keys(r).length===2?t.sessionUpdate:""}function bc(e){let t=null,r=null,n=()=>{r&&clearTimeout(r),r=null;let i=t;t=null,i&&e(i)};return{push:i=>{let o=Ac(i),a=o?i.update.content.text:"",c=t?.update.content.text;if(t&&o===t.update.sessionUpdate&&i.sessionId===t.sessionId&&!a.startsWith(c)&&!ar(a)){t.update.content.text=c+a;return}if(n(),!o){e(i);return}t={...i,update:{...i.update,content:{...i.update.content}}},r=setTimeout(n,gc),r.unref?.()},flush:n}}function F(e){return e==null||e===""?!1:typeof e=="string"?u(e)!=="":Array.isArray(e)?e.length>0:d(e)?Object.keys(e).length>0:!0}function Ss(e){let t=u(e).toLowerCase().replace(/[.。!!]+$/g,"").replace(/[\s-]+/g,"_");return dc.has(t)}function rt(e,t){let r=R(e,t);return Number.isFinite(r)&&r>0?r:t}function Dt(e,t=!1){if(typeof e=="boolean")return e;let r=u(e).toLowerCase();return["true","1","yes","y","on"].includes(r)?!0:["false","0","no","n","off"].includes(r)?!1:t}function Z(e){return u(e?.type||"echo")}function Rs(e){let t=Z(e);return t==="acp"||t==="stdio-acp"||t==="openclaw"}function xr(e){if(d(e)){if(Object.prototype.hasOwnProperty.call(e,"releaseAfterPrompt"))return e.releaseAfterPrompt;if(Object.prototype.hasOwnProperty.call(e,"disposeAfterPrompt"))return e.disposeAfterPrompt}}function Nc(e){let t=String(e||"");if(Rc.test(t))return!0;let r=t.replace(/[^a-z0-9]/gi,"").toLowerCase();return r.endsWith("token")||r.endsWith("secret")||r.endsWith("password")||r.endsWith("apikey")||r.endsWith("privatekey")||r==="authorization"||r==="cookie"||r==="jwt"||r.includes("credential")}function Ar(e,t=0){if(e==null||typeof e=="number"||typeof e=="boolean")return e;if(typeof e=="string"){if(e.length<=Or)return e;let r=e.length-Or;return`${e.slice(0,Or)}... [truncated ${r} characters]`}if(t>=Sr)return Array.isArray(e)?`[array truncated at depth ${Sr}, items=${e.length}]`:d(e)?`[object truncated at depth ${Sr}, keys=${Object.keys(e).length}]`:String(e);if(Array.isArray(e)){let r=e.slice(0,Rr).map(n=>Ar(n,t+1));return e.length>Rr&&r.push(`[truncated ${e.length-Rr} items]`),r}if(d(e)){let r={};for(let[n,s]of Object.entries(e))r[n]=Nc(n)?"[REDACTED]":Ar(s,t+1);return r}return String(e)}var Mc=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 Uc(e){if(!d(e))return e;let t={};for(let r of Mc)F(e[r])&&(t[r]=e[r]);return t}function Pc(e){if(!d(e))return e;let t={...e};return d(t.renderedPayload)&&(t.renderedPayload=Uc(t.renderedPayload)),t}function Lc(e){let t=d(e)?e:{},r={};F(t.metadata)&&(r.metadata=Pc(t.metadata));for(let[n,s]of Object.entries(t))Sc.has(n)||n==="metadata"||F(s)&&(r[n]=s);return r}function kc(e){let t=d(e)?e:{},r=d(t.metadata)?t.metadata:{},n=d(r.renderedPayload)?r.renderedPayload:{};return d(t.resultContract)?t.resultContract:d(n.resultContract)?n.resultContract:{}}function Os(e){return u(kc(e).kind).toLowerCase()==="decision"}function vc(e){return e?.dispatchFinalTextOnly===!0||e?.dispatchFinalOutputOnly===!0?!0:e?.dispatchFinalTextOnly===!1||e?.dispatchFinalOutputOnly===!1?!1:Z(e)==="cli"}function ys(e){let t=e?.dispatchReleaseAfterPrompt??e?.dispatchDisposeAfterPrompt;return Dt(t,Rs(e))}function Dc(e,t){let r=d(e?.metadata)?{...e.metadata}:{},n=d(r._runtimeBridge)?{...r._runtimeBridge}:{},s=xr(n);return r._runtimeBridge={...n,promptKind:"dispatch",finalTextOnly:vc(t),releaseAfterPrompt:s===void 0?ys(t):Dt(s,ys(t)),requiresRuntimeResult:Os(e)},r}function $c(e){let t=Lc(e);if(!F(t))return"";let r=JSON.stringify(Ar(t),null,2);if(r.length<=Er)return r;let n=r.length-Er;return`${r.slice(0,Er)}
28
+ ... [truncated ${n} characters]`}function Nr(e){if(!d(e))return"";let t=d(e.update)?e.update:e,n=(d(t.content)?t.content:{}).text??t.text;return n==null?"":String(n)}function br(e){if(!d(e))return"";let t=d(e.update)?e.update:e;return u(t.sessionUpdate)}function Mr(e){if(!Array.isArray(e))return"";let t=!1,r=[],n=[],s=[],i=()=>{r.length>0&&(n.push(r),r=[])};for(let a of e){let c=br(a),l=Nr(a);if(!c){l&&s.push(l);continue}if(t=!0,c==="agent_message_chunk"){l&&r.push(l);continue}if(c==="agent_message_snapshot"){n.length=0,r=l?[l]:[];continue}(c==="agent_thought_chunk"||c==="user_message_chunk"||c==="tool_call"||c==="tool_call_update"||c==="plan")&&i()}if(i(),!t)return St(s);let o=n[n.length-1]||[];return St(o)}function Hc(e){return Array.isArray(e)?e.map(Nr).filter(t=>t!==""):[]}function pe(e){return Array.isArray(e)?e.some(r=>br(r))?e.filter(r=>Ec.has(br(r))).map(Nr).filter(r=>r!==""):Hc(e):[]}function Fc(e){if(!d(e))return null;let t=d(e.update)?e.update:e;return u(t.sessionUpdate)!=="runtime_event"?null:d(t.event)?t.event:null}function Bc(e){if(!d(e))return"";let t=d(e.payload)?e.payload:{},r=u(e.type),n=u(t.type);if(r==="event_msg"){if(n==="task_complete")return u(t.last_agent_message||t.message||t.output);if(n==="agent_message"){let s=u(t.phase||t.status||t.stage).toLowerCase();if(["final_answer","final","complete","completed","done"].includes(s))return u(t.message||t.text||t.content)}}return""}function jc(e){if(!Array.isArray(e))return"";for(let t=e.length-1;t>=0;t-=1){let r=Bc(Fc(e[t]));if(r)return r}return""}function St(e){let t="";for(let r of e){let n=String(r||"");if(n)if(!t)t=n;else if(n.length>t.length&&n.startsWith(t))t=n;else{let s=ar(n)&&!/[\r\n]$/.test(t)?`
27
29
  `:"";t+=`${s}${n}`}}return t.trim()}function qc(e){let t=String(e||"").trim();if(!t)return"";let r=t.match(/(?:^|\n)#{1,3}\s+\S/);return!r||r.index===0?t:t.slice(r.index+(t[r.index]===`
28
- `?1:0)).trim()}function Ts(e){let t=String(e||"").trim();if(!t)return null;try{let r=JSON.parse(t);if(d(r)&&(Is(r)||F(r._artifacts)||F(r.artifacts)||F(r._decision)||F(r._meta)))return r}catch{}return null}function Dt(e){try{return ur(e)}catch{return null}}function le(...e){let t=null;for(let r of e)try{if(ur(r))return}catch(n){t||=n}if(t)throw t}function Cr(e){let t=String(e||"").trim();if(!t)return null;let r=Dt(t);if(r)return r;let n=[...t.matchAll(/```(?:json)?\s*([\s\S]*?)```/gi)];for(let s=n.length-1;s>=0;s-=1){let i=Ts(n[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=Ts(t.slice(s));if(i)return i}return null}function Gc(e){let t=Dt(Ur(e));if(t)return t;let r=pe(e);for(let n=r.length-1;n>=0;n-=1){let s=Dt(r[n]);if(s)return s}return Dt(Et(r))}function Is(e){if(!d(e))return!1;if(F(e.output))return!0;for(let t of["content","text","message","summary"])if(u(e[t]))return!0;return!!(Ss(e.status)||u(e.error)||u(e.errorMessage))}function V(e){let t=d(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 Kc(e){return d(e)?typeof(d(e._decision)?e._decision:d(e.decision)?e.decision:e).passed=="boolean":!1}function Cs(e){return d(e)?d(e._decision)&&typeof e._decision.passed=="boolean"?!0:Kc(e.output):!1}function xr(e,t,r){let n=d(e)?{...e}:{};if(!F(n.output)){for(let s of["summary","message","content","text"])if(u(n[s])){n.output=u(n[s]);break}}return!F(n.output)&&u(r)&&(n.output=u(r)),{...n,_meta:{...d(n._meta)?n._meta:{},runtimeOutputSource:t,requiredRuntimeResult:!0,finalMessagePreview:u(r).slice(0,1e3)}}}var zc=["dataUrl","dataURL","contentDataUrl","contentDataURL","contentBase64","base64","data"];function ws(e){if(!d(e))return"";let t=d(e.content)?e.content:{},r=d(e.metadata)?e.metadata:{};return u(e.fieldKey||e.field_key||t.fieldKey||r.fieldKey)}function Vc(e,t){let r=d(e.content)?e.content:{},n=d(t.content)?t.content:{},s={...e,...t,content:{...r,...n},metadata:{...d(e.metadata)?e.metadata:{},...d(t.metadata)?t.metadata:{}}};for(let i of zc)F(e[i])&&(s[i]=e[i]),F(r[i])&&(s.content[i]=r[i]);return s}function xs(e,t){let r=Array.isArray(e)?e.filter(d):[],n=Array.isArray(t)?t.filter(d):[];if(!r.length)return n;if(!n.length)return r;let s=[...r],i=new Map;for(let a=0;a<r.length;a+=1){let c=ws(r[a]),l=i.get(c)||[];l.push(a),i.set(c,l)}let o=new Map;for(let a of n){let c=ws(a),l=o.get(c)||0;o.set(c,l+1);let p=i.get(c)?.[l];p===void 0?s.push(a):s[p]=Vc(s[p],a)}return s}function Y(e,t,r){let n={...e,...t,_meta:{...d(e._meta)?e._meta:{},...d(t._meta)?t._meta:{},runtimeOutputSource:r}};return(Array.isArray(e._artifacts)||Array.isArray(t._artifacts))&&(n._artifacts=xs(e._artifacts,t._artifacts)),n}function As(e,t,r={}){let n=u(r.promptKind),s=r.requiresRuntimeResult===!0,i=s||n==="dispatch",o=V(e),a=typeof o.output=="string"?Dt(o.output):null;if(a)return Y(o,V(a),"result_block");let c=jc(t),l=c?Cr(c):null,p=i?Gc(t):null;if(Is(o))return Ss(o.status)||u(o.error)||u(o.errorMessage)?o:n==="dispatch"&&l?Y(o,V(l),"final_event"):n==="dispatch"&&p?Y(o,V(p),"updates"):!s||Cs(o)?o:l?Y(o,V(l),"final_event"):p?Y(o,V(p),"updates"):(le(o.output,c,Et(pe(t))),xr(o,"result",o.output));if(l)return Y(o,V(l),"final_event");if(p)return Y(o,V(p),"updates");if(c)return s?(le(c,Et(pe(t))),xr(o,"final_event",c)):{...o,output:c,_meta:{...d(o._meta)?o._meta:{},runtimeOutputSource:"final_event"}};let h=Ur(t),f=Cr(h);if(f)return Y(o,V(f),"updates");let m=qc(h);if(!m)return s&&le(Et(pe(t))),o;let y=Cr(m);return y?Y(o,V(y),"updates"):s?(le(h,m),xr(o,"updates",m)):{...o,output:m,_meta:{...d(o._meta)?o._meta:{},runtimeOutputSource:"updates"}}}function Pr(e){return d(e)?u(e.stopReason||e.stop_reason).toLowerCase():""}function Ns(e){return wc.has(Pr(e))}function Jc(e,t,r){if(r.promptKind!=="dispatch"||r.requiresRuntimeResult!==!0||!Ns(e))return!1;try{return!Cs(As(e,t,r))}catch{return!0}}function Wc(){return["Your previous final response reached the output limit before the Runtime Result protocol was complete.","Re-emit the complete final Runtime Result from scratch using the conclusion you already reached.","Do not repeat analysis, process notes, tool calls, or task work.",`Keep the OUTPUT report within ${Es} Unicode characters.`,`Output ${nr}, ${sr}, ${ir}, and ${or} on their own lines.`,"The CONTROL block must be valid JSON containing _decision and must be fully closed.","Return only the two protocol blocks."].join(`
29
- `)}function Xc(e,t){let r=d(t)?{...t}:{},n=xs(e?._artifacts,t?._artifacts);return n.length>0&&(r._artifacts=n),r}function Yc(e,t){return{...e,_meta:{...d(e?._meta)?e._meta:{},runtimeProtocolRetry:{attempted:!0,recovered:!0,reason:Pr(t)||"max_tokens"}}}}function Qc(e,t){let r=typeof e?.output=="string"?e.output:Ur(t),n=new H("runtime_output_truncated","Runtime Result \u8FBE\u5230\u6700\u5927\u8F93\u51FA\u957F\u5EA6\uFF0C\u7D27\u51D1\u91CD\u8BD5\u540E\u4ECD\u672A\u5B8C\u6574\u8FD4\u56DE",r);return n.detail={...n.detail,stopReason:Pr(e)||"max_tokens",retryAttempted:!0},n}var fe=class{constructor(t){this.config=t,this.targets=t.targets||{},this.agents=new Map,this.sessions=new Map,this.startingSessions=new Set,this.targetReservations=new Map,this.runtimeSessionIndex=new Map,this.pendingPermissions=new Map,this.operations=new Map,this.startedAt=xt(),this.sandboxCapabilities={dispatchable:t.sandboxRequired!==!0,enforced:!1,backend:t.sandboxRequired?"unavailable":"direct",daemonStatus:t.sandboxRequired?"pending":"not_required",policySchemaVersions:[1],runtimePolicyUpdates:t.sandboxRequired===!0,workspaceSync:!1,egressProxy:!1},this.cleanupTimer=null,this.onCapacityChanged=null,this.startSessionCleanup()}async start(){try{this.sandboxCapabilities=await ms(this.config)}catch(t){this.sandboxCapabilities={...this.sandboxCapabilities,dispatchable:!1,enforced:!1,backend:"unavailable",daemonStatus:"unavailable",reason:u(t?.code||t?.message||t)||"sandbox_probe_failed"},_("error","runtime-bridge","runtime node sandbox probe failed; node will not accept work",{reason:this.sandboxCapabilities.reason})}return this.sandboxCapabilities}assertDispatchable(){if(this.config.sandboxRequired&&!(this.sandboxCapabilities.dispatchable===!0&&this.sandboxCapabilities.enforced===!0))throw Object.assign(new Error("runtime node strong sandbox is unavailable"),{code:"RUNTIME_NODE_SANDBOX_UNAVAILABLE"})}operationIdentity(t,r,n){let s=d(t.goalContract)?fr(t.goalContract):u(t.goalContractHash),i=lc("sha256").update(X({prompt:Array.isArray(t.prompt)?t.prompt:[],mcpServers:Ic(t.mcpServers),metadata:d(t.metadata)?t.metadata:{}})).digest("hex");return{agentId:r,runId:u(t.runId),sessionId:n,targetCode:u(t.targetCode||t.framework),workspace:u(t.workspace),goalContractHash:s,requestHash:i}}assertOperationIdentity(t,r,n,s){let i=this.operationIdentity(r,n,s),o=Object.keys(t.identity).find(a=>t.identity[a]!==i[a]);if(o)throw Object.assign(new Error(`runtime operation correlation conflict: ${t.correlationId}`),{code:"RUNTIME_OPERATION_CORRELATION_CONFLICT",field:o})}createOperation(t,r,n,s){let i={correlationId:t,agentId:n,sessionId:s,identity:this.operationIdentity(r,n,s),sandboxPolicy:d(r.sandboxPolicy)?structuredClone(r.sandboxPolicy):null,status:"running",updates:[],listeners:new Set,waiters:[],response:null,error:null,mcpServers:r.mcpServers,createdAtMs:Date.now(),completedAtMs:null};return this.operations.set(t,i),i}async attachOperation(t,r={}){let n=()=>{if(r.onUpdate)for(let s of t.updates)r.onUpdate(s)};if(t.status==="completed")return n(),t.response;if(t.status==="failed")throw n(),t.error;r.onUpdate&&t.listeners.add(r.onUpdate);try{return n(),await new Promise((s,i)=>t.waiters.push({resolve:s,reject:i}))}finally{r.onUpdate&&t.listeners.delete(r.onUpdate)}}completeOperation(t,r){if(t.status==="running"){t.status="completed",t.response=r,t.mcpServers=null,t.completedAtMs=Date.now();for(let n of t.waiters.splice(0))n.resolve(r);t.listeners.clear()}}promptResponse(t,r,n,s,i,o=s){let a=d(t.metadata)?t.metadata:{},c=d(a._runtimeBridge)?a._runtimeBridge:{},l=a.source==="channel_message"?i:As(i,o,c),p=ds(t.goalContract,s,t.goalContractHash);return{sessionId:n,runtimeSessionId:r.runtimeSessionId,result:l,updates:s,...p?{verification:p}:{}}}failOperation(t,r){if(t.status!=="running")return;let n=r instanceof Error?r:Object.assign(new Error(String(r||"runtime operation failed")),{code:"RUNTIME_NODE_ERROR"});t.status="failed",t.error=n,t.mcpServers=null,t.completedAtMs=Date.now();for(let s of t.waiters.splice(0))s.reject(n);t.listeners.clear()}cleanupOperations(t=Date.now()){let r=et(this.config.operationTtlMs,mc);for(let[n,s]of this.operations)s.status!=="running"&&t-(s.completedAtMs||s.createdAtMs)>r&&this.operations.delete(n)}targetFor(t){let r=u(t)||this.config.defaultTargetCode,n=this.targets[r];if(!r||!d(n)){let s=new Error(`runtime target is not configured: ${r||"<empty>"}`);throw s.code="RUNTIME_TARGET_NOT_FOUND",s}return{code:r,target:n}}targetIdleTtlMs(t){let n=Q(t)==="openclaw"?et(this.config.openClawSessionIdleTtlMs,yc):et(this.config.sessionIdleTtlMs,pc);return et(t?.sessionIdleTtlMs??t?.idleTtlMs,n)}targetMaxSessions(t){let n=Q(t)==="openclaw"?et(this.config.openClawMaxSessions,Tc):et(this.config.maxSessionsPerTarget,hc);return et(t?.maxSessions,n)}targetReservationCount(t){return Number(this.targetReservations.get(t)||0)}notifyCapacityChanged(){try{this.onCapacityChanged?.()}catch(t){_("warn","runtime-bridge","capacity heartbeat callback failed",{error:String(t)})}}targetCapacitySnapshot(t=!0){return Object.entries(this.targets).map(([r,n])=>{let s=[...this.sessions.values()].filter(p=>p.targetCode===r),i=s.filter(p=>p.busy).length,o=s.length-i,a=this.targetReservationCount(r),c=this.targetMaxSessions(n),l=t?Math.max(0,c-i-a):0;return{targetCode:r,targetName:u(n?.name||n?.targetName||r),targetType:u(n?.type||"echo"),status:t?l>0?"available":"busy":"unavailable",maxSessions:c,busySessions:i,idleSessions:o,reservedSessions:a,availableSessions:l}})}targetReleaseAfterPrompt(t,r={}){let n=Q(t),s=d(r?._runtimeBridge)?r._runtimeBridge:{},i=Ar(s);return i!==void 0?vt(i,!1):vt(t?.releaseAfterPrompt??t?.disposeAfterPrompt,n==="openclaw")}promptReleaseAfterPrompt(t,r={}){if(this.config.sandboxRequired)return!0;let n=d(r?._runtimeBridge)?r._runtimeBridge:{},s=Ar(n);return s!==void 0?vt(s,t.releaseAfterPrompt):t.releaseAfterPrompt}startSessionCleanup(){let t=et(this.config.sessionCleanupIntervalMs,fc);t<=0||(this.cleanupTimer=setInterval(()=>{this.cleanupExpiredSessions().catch(r=>{_("warn","runtime-bridge","runtime session cleanup failed",{error:String(r)})})},t),this.cleanupTimer.unref?.())}sessionCountForTarget(t){let r=0;for(let n of this.sessions.values())n.targetCode===t&&(r+=1);return r}idleTargetSessions(t){return[...this.sessions.entries()].filter(([,r])=>r.targetCode===t&&!r.busy).sort((r,n)=>(r[1].lastUsedAtMs||0)-(n[1].lastUsedAtMs||0))}async closeSession(t,r="session_closed"){let n=this.sessions.get(t);if(!n)return!1;try{await n.runtime?.stop?.(r)}catch(s){_("warn","runtime-bridge","runtime session stop failed",{sessionId:n.sessionId,runtimeSessionId:n.runtimeSessionId,targetCode:n.targetCode,runtimeKind:n.runtimeKind,error:String(s)})}return this.sessions.delete(t),this.runtimeSessionIndex.delete(`${n.agentId}:${n.runtimeSessionId}`),this.notifyCapacityChanged(),_("info","runtime-bridge","runtime session closed",{sessionId:n.sessionId,runtimeSessionId:n.runtimeSessionId,targetCode:n.targetCode,runtimeKind:n.runtimeKind,reason:r}),!0}async closeAllSessions(t="bridge_shutdown"){for(let r of[...this.sessions.keys()])await this.closeSession(r,t)}async stop(t="bridge_stop"){this.cleanupTimer&&clearInterval(this.cleanupTimer),this.cleanupTimer=null,await this.closeAllSessions(t)}async cleanupExpiredSessions(t=Date.now()){for(let[r,n]of[...this.sessions.entries()])n.busy||t-(n.lastUsedAtMs||n.createdAtMs||t)>n.idleTtlMs&&await this.closeSession(r,"idle_timeout")}async reserveTargetSlot(t,r){let n=this.targetMaxSessions(r);for(;this.sessionCountForTarget(t)+this.targetReservationCount(t)>=n;){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}await this.closeSession(s[0][0],"target_session_limit")}this.targetReservations.set(t,this.targetReservationCount(t)+1),this.notifyCapacityChanged()}releaseTargetSlot(t){let r=Math.max(0,this.targetReservationCount(t)-1);r>0?this.targetReservations.set(t,r):this.targetReservations.delete(t),this.notifyCapacityChanged()}async createAgent(t){let r=u(t.agentId);if(!r)throw Object.assign(new Error("agentId is required"),{status:400,code:"BAD_REQUEST"});let{code:n,target:s}=this.targetFor(t.targetCode||t.framework),i=this.agents.get(r);if(i&&i.targetCode!==n)throw Object.assign(new Error(`runtime agent target conflict: ${r}`),{code:"RUNTIME_AGENT_TARGET_CONFLICT"});let o=this.config.sandboxRequired?await Tr(this.config,s,t.workspace):u(t.workspace),a={agentId:r,targetCode:n,framework:u(t.framework||n),workspace:o,metadata:d(t.metadata)?t.metadata:{},createdAt:xt(),runtimeKind:Q(s)};return this.agents.set(r,a),{agent:a}}runtimeFor(t,r,n={}){let{target:s}=this.targetFor(t.targetCode),i=Q(s),o={onPermissionRequest:c=>n.source==="conversation_delegation"?{outcome:"denied",reason:"External group member permission continuation is not supported"}:this.requestPermission(c)},a={sessionPromptTimeoutMs:this.config.sessionPromptTimeoutMs,initializeTimeoutMs:this.config.initializeTimeoutMs,sandboxRequired:this.config.sandboxRequired,runId:n.runId,source:n.source,cloudSessionId:r,orchaUrl:this.config.orchaUrl,attachOnly:n.attachOnly,sandboxPolicy:n.sandboxPolicy,...this.config.sandboxRequired?{prepareLaunch:c=>gs({config:this.config,target:s,...c,runId:n.runId,agentId:t.agentId,sessionId:r,sandboxPolicy:n.sandboxPolicy})}:{}};return i==="stdio-acp"||i==="acp"?new mt(t,s,o,a):i==="openclaw"?new Yt(t,s,r,o,a):i==="cli"?as(s)?new se(t,s,a,o):new yt(t,s,a,o):new Gt(t)}async prompt(t,r={}){if(this.assertDispatchable(),this.config.sandboxRequired){let a=u(t.runId);if(!a)throw Object.assign(new Error("runId is required"),{code:"BAD_REQUEST"});t={...t,runId:a,sandboxPolicy:ut(t.sandboxPolicy)}}let n=u(t.agentId),s=u(t.sessionId)||de(),i=u(t.correlationId);if(!n)throw Object.assign(new Error("agentId is required"),{status:400,code:"BAD_REQUEST"});if(this.cleanupOperations(),i){let a=this.operations.get(i);if(a){if(this.assertOperationIdentity(a,t,n,s),a.status==="running"&&(["conversation_delegation","channel_message"].includes(t.metadata?.source)||t.metadata?.source==="ai_chat_runtime_node"&&Object.hasOwn(ct,t.framework||""))){a.mcpServers=t.mcpServers;let c=this.sessions.get(`${n}:${s}`);if(c){if(!c.runtime.refreshMcpServers)throw Object.assign(new Error("This runtime cannot refresh task MCP credentials"),{code:"unsupported_dynamic_mcp"});await c.runtime.refreshMcpServers(t.mcpServers)}}return this.attachOperation(a,r)}if(t.attachOnly===!0&&!(t.metadata?.source==="channel_message"&&this.targetFor(t.targetCode||t.framework).target.type==="openclaw"))throw Object.assign(new Error(`runtime operation is no longer available: ${i}`),{code:"RUNTIME_OPERATION_NOT_FOUND"})}else if(t.attachOnly===!0)throw Object.assign(new Error("correlationId is required for attachOnly"),{code:"BAD_REQUEST"});let o=i?this.createOperation(i,t,n,s):null;if(o){let a=this.attachOperation(o,r);return(async()=>{try{await this._promptOwned(t,{},o,n,s)}catch(c){let l=o.status==="completed";this.failOperation(o,c),l&&_("warn","runtime-bridge","runtime cleanup failed after operation completion",{correlationId:o.correlationId,error:String(c)})}})(),await a}return await this._promptOwned(t,r,o,n,s)}async _promptOwned(t,r,n,s,i){let o=u(t.runId),a=this.config.sandboxRequired?ut(n?.sandboxPolicy||t.sandboxPolicy):null,c=this.agents.get(s),l=this.targetFor(t.targetCode||t.framework||c?.targetCode);if(c&&c.targetCode!==l.code)throw Object.assign(new Error(`runtime agent target conflict: ${s}`),{code:"RUNTIME_AGENT_TARGET_CONFLICT"});if(Q(l.target)==="cli"&&Cc(t.goalContract))throw Object.assign(new Error("CLI runtimes do not support per-run dynamic MCP required by plugin_operation"),{code:"unsupported_dynamic_mcp"});let p=c||(await this.createAgent({agentId:s,targetCode:l.code,framework:t.framework,workspace:t.workspace,metadata:t.metadata})).agent;if(!this.config.sandboxRequired){let g=u(t.workspace);g&&g!==p.workspace&&(p.workspace=g)}let h=`${s}:${i}`;await this.cleanupExpiredSessions();let f=this.sessions.get(h),m=null;if(f&&f.targetCode!==l.code)throw Object.assign(new Error(`runtime session target conflict: ${i}`),{code:"RUNTIME_SESSION_TARGET_CONFLICT"});if(f&&this.config.sandboxRequired&&f.runId!==o)throw Object.assign(new Error(`runtime session cannot be shared across runs: ${i}`),{code:"RUNTIME_SESSION_RUN_CONFLICT"});if(!f){if(this.startingSessions.has(h))throw Object.assign(new Error(`runtime session is already starting: ${i}`),{code:"RUNTIME_SESSION_BUSY"});this.startingSessions.add(h);let{code:g,target:E}=l,b;try{await this.reserveTargetSlot(g,E),m=g;let A=this.runtimeFor(p,i,{runId:o,sandboxPolicy:a,source:t.metadata?.source,attachOnly:t.attachOnly});b=A;let S=n?.mcpServers||t.mcpServers||[],I=await A.sessionNew({cwd:J(E,p.workspace),mcpServers:S,metadata:d(t.metadata)?t.metadata:{}});if(n&&n.status!=="running")throw Object.assign(new Error("Runtime operation was cancelled before prompt dispatch"),{code:"RUNTIME_OPERATION_CANCELLED"});let O=Date.now();f={agentId:s,sessionId:i,runtime:A,targetCode:g,runtimeKind:Q(E),runId:o,sandboxPolicy:a?structuredClone(a):null,runtimeSessionId:u(d(I)?I.sessionId:"")||i,idleTtlMs:this.targetIdleTtlMs(E),releaseAfterPrompt:this.config.sandboxRequired?!0:this.targetReleaseAfterPrompt(E,t.metadata),createdAtMs:O,lastUsedAtMs:O,busy:!1,createdAt:xt()},this.sessions.set(h,f),this.runtimeSessionIndex.set(`${s}:${f.runtimeSessionId}`,f),n?.mcpServers!==S&&n?.mcpServers&&A.refreshMcpServers&&await A.refreshMcpServers(n.mcpServers)}catch(A){throw this.sessions.get(h)?.runtime===b?await this.closeSession(h,"session_start_failed"):await b?.stop("session_start_failed"),m&&(this.releaseTargetSlot(m),m=null),A}finally{this.startingSessions.delete(h)}}if(f.busy){let g=new Error(`runtime session is already running: ${i}`);throw g.code="RUNTIME_SESSION_BUSY",g}f.busy=!0,m&&this.releaseTargetSlot(m),this.notifyCapacityChanged(),f.operationCorrelationId=n?.correlationId||null,f.lastUsedAtMs=Date.now();let y=n?.updates||[],T=Nc(g=>{let E=xc(g,i,f);if(y.push(E),n)for(let b of n.listeners)try{b?.(E)}catch(A){_("warn","runtime-bridge","runtime operation update listener failed",{correlationId:n.correlationId,error:String(A)})}else r.onUpdate?.(E)}),C=T.push,w=g=>{if(T.flush(),!(!n||n.status!=="running"||!d(g))){if(g.status==="failed"){let E=g.error;if(E instanceof Error){this.failOperation(n,E);return}let b=d(E)?E:{},A=Object.assign(new Error(u(b.message||g.message)||"runtime terminal failure"),{code:u(b.code||g.code)||"RUNTIME_TERMINAL_FAILED"});this.failOperation(n,A);return}this.completeOperation(n,this.promptResponse(t,f,i,y,d(g.result)?g.result:{stopReason:"end_turn"}))}},x=async g=>{try{return await f.runtime.sessionPrompt(g,C,w)}finally{T.flush()}};try{let g=ls(t.goalContract),E=Array.isArray(t.prompt)?[...t.prompt]:[];g&&E.unshift({type:"text",text:g,metadata:{source:"orcha_goal_contract"}});let b=d(t.metadata)?t.metadata:{},A=d(b._runtimeBridge)?b._runtimeBridge:{},S=await x({sessionId:f.runtimeSessionId,prompt:E,metadata:b}),I=y,O=null;if(Rs({type:f.runtimeKind})&&Jc(S,y,A)){O=S;let M=y.length,$t=await x({sessionId:f.runtimeSessionId,prompt:[{type:"text",text:Wc()}],metadata:b,_meta:{thinking:"off"}});S=Xc(O,$t),I=y.slice(M)}let k;try{k=this.promptResponse(t,f,i,y,S,I)}catch(M){throw O&&Ns(S)?Qc(S,I):M}return O&&(k.result=Yc(k.result,O)),n&&this.completeOperation(n,k),k}finally{f.busy=!1,this.notifyCapacityChanged(),f.operationCorrelationId===n?.correlationId&&(f.operationCorrelationId=null),f.lastUsedAtMs=Date.now(),this.promptReleaseAfterPrompt(f,d(t.metadata)?t.metadata:{})&&await this.closeSession(h,"release_after_prompt"),n&&(n.mcpServers=null)}}async updatePolicy(t){if(this.assertDispatchable(),!this.config.sandboxRequired)throw Object.assign(new Error("runtime sandbox policy updates require an enforced sandbox"),{code:"RUNTIME_NODE_SANDBOX_UNAVAILABLE"});let r=u(t.agentId),n=u(t.runId),s=u(t.sessionId),i=u(t.correlationId);if(!r||!n||!s||!i)throw Object.assign(new Error("agentId, runId, sessionId and correlationId are required"),{code:"BAD_REQUEST"});let o=ut(t.sandboxPolicy),a=this.operations.get(i);if(a&&(a.agentId!==r||a.sessionId!==s||a.identity.runId!==n))throw Object.assign(new Error(`runtime operation policy identity conflict: ${i}`),{code:"RUNTIME_OPERATION_CORRELATION_CONFLICT"});let c=`${r}:${s}`,l=this.sessions.get(c);if(l&&l.runId!==n)throw Object.assign(new Error(`runtime session policy identity conflict: ${s}`),{code:"RUNTIME_SESSION_RUN_CONFLICT"});let p=l?.sandboxPolicy||a?.sandboxPolicy;if(!p)throw Object.assign(new Error(`runtime operation is no longer available: ${i}`),{code:"RUNTIME_OPERATION_NOT_FOUND"});let h=Number(p.policyRevision),f=Number(o.policyRevision);if(f<h)throw Object.assign(new Error("runtime sandbox policy revision is stale"),{code:"RUNTIME_POLICY_REVISION_CONFLICT",currentPolicyRevision:h});if(f===h){if(X(p)!==X(o))throw Object.assign(new Error("runtime sandbox policy revision payload conflicts"),{code:"RUNTIME_POLICY_REVISION_CONFLICT",currentPolicyRevision:h});return{updated:!1,idempotent:!0,policyRevision:h,accessMode:p.accessMode}}let m=hs(p,o);a&&(a.sandboxPolicy=structuredClone(o)),l&&(l.sandboxPolicy=structuredClone(o));let y=!1;return m&&l?.busy===!0&&(await l.runtime.sessionCancel({sessionId:l.runtimeSessionId}),y=await this.closeSession(c,"sandbox_policy_downgrade")),{updated:!0,policyRevision:f,accessMode:o.accessMode,activeCommandCancelled:y,deferredToNextLaunch:!m&&l?.busy===!0}}async cancel(t){let r=u(t.agentId),n=u(t.sessionId),s=u(t.correlationId);if(s){let a=this.operations.get(s);if(!a||a.status!=="running")return{cancelled:!1,correlationId:s,reason:"operation_not_running"};if(a.agentId!==r||a.sessionId!==n)throw Object.assign(new Error(`runtime operation cancellation identity conflict: ${s}`),{code:"RUNTIME_OPERATION_CORRELATION_CONFLICT"});let c=this.sessions.get(`${r}:${n}`);return!c||c.busy!==!0||c.operationCorrelationId!==s?(this.failOperation(a,Object.assign(new Error("Runtime operation cancelled before dispatch"),{code:"RUNTIME_OPERATION_CANCELLED"})),{cancelled:!0,correlationId:s,reason:"cancelled_before_dispatch"}):(await c.runtime.sessionCancel({sessionId:c.runtimeSessionId}),await this.closeSession(`${r}:${n}`,"cancelled"),{cancelled:!0,correlationId:s})}let i=`${r}:${n}`,o=this.sessions.get(i);return o?(await o.runtime.sessionCancel({sessionId:o.runtimeSessionId}),await this.closeSession(i,"cancelled"),{cancelled:!0}):{cancelled:!1}}async dispatch(t,r={}){let n=u(t.agentId),s=u(t.taskId),i=u(t.executionId);if(!n||!s)throw Object.assign(new Error("agentId and taskId are required"),{status:400,code:"BAD_REQUEST"});let o=u(t.sessionId)||`dispatch-${i||s}`,a=u(t.instructions),c=$c(t),l=Os(t),{target:p}=this.targetFor(t.targetCode||t.framework),h=[{type:"text",text:["Task dispatch received.",`taskId: ${s}`,i?`executionId: ${i}`:"",a?`instructions: ${a}`:"",c?"orchaContext:":"",c,c?"Use orchaContext as the source of truth for upstream outputs, review reports, artifacts, and workflow metadata.":"","Follow the execution protocol in instructions exactly.","When embedding a generated artifact in final Markdown, use the Orcha artifact placeholder as the link target: orcha-artifact://<fieldKey>/<index>.","Example: use ![illustration](orcha-artifact://image/0) for the first generated image artifact.","Do not use local filesystem paths, file:// URLs, or data: URLs in final Markdown; Orcha replaces artifact placeholders after ingestion.",l?`For decision results, put the raw report between ${nr} and ${sr}.`:"",l?`Then put a JSON object containing _decision between ${ir} and ${or}.`:"",l?"Do not JSON-escape the report. Keep output out of the CONTROL JSON, and put every protocol marker on its own line.":"",l?`Keep the report within ${Es} Unicode characters so the CONTROL block fits before the output limit.`:"","Return only the final answer required by that protocol.","Do not include process notes, logs, or explanations."].filter(Boolean).join(`
30
- `)}];return this.prompt({...t,agentId:n,sessionId:o,prompt:h,metadata:Dc(t,p)},r)}async requestPermission({agent:t,runtimeSessionId:r,request:n,emitUpdate:s,maxTimeoutMs:i,signal:o}){let a=de(),l=this.runtimeSessionIndex.get(`${t.agentId}:${r}`)?.sessionId||r||de(),p=R(n?.timeoutMs,this.config.permissionRequestTimeoutMs),h=i?Math.min(p,i):p,f={permissionId:a,agentId:t.agentId,sessionId:l,runtimeSessionId:r,request:d(n)?n:{},status:"pending",createdAt:xt(),expiresAt:new Date(Date.now()+h).toISOString()};return o?.aborted?{permissionId:a,outcome:"cancelled",response:{reason:"runtime turn ended"}}:await new Promise(m=>{let y=(w,x)=>{clearTimeout(C),o?.removeEventListener("abort",T),this.pendingPermissions.delete(a),s?.({sessionId:r,update:{sessionUpdate:"permission_resolved",permissionId:a,outcome:x}}),m(w)},T=()=>y({permissionId:a,outcome:"cancelled",response:{reason:"runtime turn ended"}},"cancelled"),C=setTimeout(()=>y({permissionId:a,outcome:"denied",response:{reason:"permission request timed out"}},"expired"),h);o?.addEventListener("abort",T,{once:!0}),this.pendingPermissions.set(a,{settle:y,permission:f}),s?.({sessionId:r,update:{sessionUpdate:"permission_request",permission:f}})})}async respondPermission(t){let r=u(t.permissionId),n=this.pendingPermissions.get(r),s=u(t.outcome||"approved")||"approved";return n?(n.settle({permissionId:r,outcome:s,response:d(t.response)?t.response:{},userId:u(t.userId),metadata:d(t.metadata)?t.metadata:{}},s),{accepted:!0,permissionId:r,outcome:s}):{accepted:!1,permissionId:r,outcome:s}}health(){return{status:this.config.sandboxRequired&&!this.sandboxCapabilities.dispatchable?"unavailable":"ok",bridgeVersion:K,startedAt:this.startedAt,agents:[...this.agents.values()].map(t=>({agentId:t.agentId,targetCode:t.targetCode,framework:t.framework,runtimeKind:t.runtimeKind})),sessions:this.sessions.size,pendingPermissions:this.pendingPermissions.size,targets:Object.keys(this.targets),sandboxCapabilities:this.sandboxCapabilities}}};import Zc from"node:http";import tu from"node:https";import{randomBytes as bs}from"node:crypto";var St=1,lt=3,eu=1e4,he=class{constructor(t,r={}){this.url=t,this.readyState=0,this.socket=null,this.request=null,this.buffer=Buffer.alloc(0),this.listeners=new Map,this.connectTimeoutMs=ru(r.connectTimeoutMs,eu),this.connectTimer=null,this.connect()}addEventListener(t,r){let n=this.listeners.get(t)||new Set;n.add(r),this.listeners.set(t,n)}emit(t,r={}){let n=this.listeners.get(t);if(n)for(let s of n)s(r)}connect(){let t=new URL(this.url),r=t.protocol==="wss:"?tu:Zc,n=bs(16).toString("base64"),s=r.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":n,"Sec-WebSocket-Version":"13"}});this.request=s,this.startConnectTimer(s),s.on("upgrade",(i,o,a)=>{if(this.clearConnectTimer(),this.readyState===lt){o.destroy();return}this.socket=o,this.readyState=St,o.on("data",c=>this.onData(c)),o.on("close",()=>this.onClose()),o.on("error",c=>{this.readyState!==lt&&this.emit("error",{error:c,message:c.message,type:"error"}),this.onClose()}),a?.length&&this.onData(a),this.emit("open")}),s.on("response",i=>{this.clearConnectTimer(),this.emit("error",{message:`websocket upgrade failed: HTTP ${i.statusCode}`,type:"error"}),i.resume(),this.onClose()}),s.on("error",i=>{this.clearConnectTimer(),this.readyState!==lt&&this.emit("error",{error:i,message:i.message,type:"error"}),this.onClose()}),s.end()}startConnectTimer(t){this.connectTimeoutMs<=0||(this.connectTimer=setTimeout(()=>{if(this.readyState===St||this.readyState===lt)return;let r=`websocket connect timeout after ${this.connectTimeoutMs}ms`;this.emit("error",{message:r,type:"timeout"}),this.onClose(),t.destroy(new Error(r))},this.connectTimeoutMs),this.connectTimer.unref?.())}clearConnectTimer(){this.connectTimer&&(clearTimeout(this.connectTimer),this.connectTimer=null)}send(t){!this.socket||this.readyState!==St||this.socket.write(Lr(1,Buffer.from(String(t),"utf8")))}close(){if(this.readyState!==lt){if(this.clearConnectTimer(),!this.socket){this.request?.destroy(),this.onClose();return}try{this.readyState===St&&this.socket.write(Lr(8,Buffer.alloc(0))),this.socket.end()}catch{this.socket.destroy()}this.onClose()}}onClose(){this.readyState!==lt&&(this.clearConnectTimer(),this.readyState=lt,this.request=null,this.emit("close"))}onData(t){for(this.buffer=Buffer.concat([this.buffer,t]);this.buffer.length>=2;){let r=this.buffer[0],n=this.buffer[1],s=r&15,i=(n&128)!==0,o=n&127,a=2;if(o===126){if(this.buffer.length<a+2)return;o=this.buffer.readUInt16BE(a),a+=2}else if(o===127){if(this.buffer.length<a+8)return;let p=this.buffer.readUInt32BE(a),h=this.buffer.readUInt32BE(a+4);o=p*2**32+h,a+=8}let c=a;if(i&&(a+=4),this.buffer.length<a+o)return;let l=this.buffer.subarray(a,a+o);if(i){let p=this.buffer.subarray(c,c+4);l=Buffer.from(l.map((h,f)=>h^p[f%4]))}this.buffer=this.buffer.subarray(a+o),s===1?this.emit("message",{data:l.toString("utf8")}):s===8?this.close():s===9&&this.socket?.write(Lr(10,l))}}};function ru(e,t){let r=Number.parseInt(String(e??""),10);return Number.isFinite(r)&&r>=0?r:t}function Lr(e,t){let r=t.length,n=2;r>=126&&r<=65535?n+=2:r>65535&&(n+=8);let s=bs(4),i=Buffer.alloc(n+4+r);i[0]=128|e;let o=2;r<126?i[1]=128|r:r<=65535?(i[1]=254,i.writeUInt16BE(r,o),o+=2):(i[1]=255,i.writeUInt32BE(Math.floor(r/2**32),o),i.writeUInt32BE(r>>>0,o+4),o+=8),s.copy(i,o),o+=4;for(let a=0;a<r;a+=1)i[o+a]=t[a]^s[a%4];return i}function nu(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 su(e,t=!0){return Object.entries(e||{}).map(([r,n])=>({targetCode:r,targetName:u(n?.name||n?.targetName||r),targetType:u(n?.type||"echo"),status:t?"available":"unavailable"}))}var iu=Object.freeze(["health","agents/create","agents/dispatch","sessions/prompt","sessions/policy","sessions/cancel","permissions/respond"]),me=class{constructor(t,r){this.config=t,this.bridge=r,this.ws=null,this.stopped=!1,this.connected=!1,this.reconnectTimer=null,this.heartbeatTimer=null,this.capacityHeartbeatTimer=null,this.bridge.onCapacityChanged=()=>this.scheduleCapacityHeartbeat()}sandboxCapabilities(){return this.bridge.sandboxCapabilities||{dispatchable:this.config.sandboxRequired!==!0,enforced:!1,backend:"development_direct",daemonStatus:"development_only",policySchemaVersions:[1],runtimePolicyUpdates:!0,workspaceSync:!1,egressProxy:!1}}supportedMethods(){return[...iu,...this.config.deviceConnection?["devices/discover","devices/configure"]:[]]}runtimeTargets(){let t=this.sandboxCapabilities().dispatchable===!0;return typeof this.bridge.targetCapacitySnapshot=="function"?this.bridge.targetCapacitySnapshot(t):su(this.config.targets,t)}start(){this.connect()}stop(){this.stopped=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.heartbeatTimer=null,this.capacityHeartbeatTimer&&clearTimeout(this.capacityHeartbeatTimer),this.capacityHeartbeatTimer=null,this.bridge.onCapacityChanged=null,this.ws?.close()}connect(){if(this.stopped)return;let t=nu(this.config.orchaUrl),r=new he(t,{connectTimeoutMs:this.config.connectTimeoutMs});this.ws=r,r.addEventListener("open",()=>{if(this.ws!==r||this.stopped){r.close();return}this.authenticate(r)}),r.addEventListener("message",n=>this.handleMessage(n.data,r)),r.addEventListener("close",()=>this.scheduleReconnect("close",r)),r.addEventListener("error",n=>{_("warn","orcha-client","runtime node websocket error",{error:String(n?.message||n?.type||n)})})}authenticate(t=this.ws){this.send({type:"runtime_node.authenticate",token:this.config.nodeToken,nodeId:this.config.nodeId,nodeName:this.config.nodeName,version:K,protocolVersion:"orcha-runtime-node.v2",defaultTargetCode:this.config.defaultTargetCode,supportedMethods:this.supportedMethods(),sandboxCapabilities:this.sandboxCapabilities(),targets:this.runtimeTargets()},t)}scheduleReconnect(t,r=this.ws){r&&this.ws!==r||(this.connected=!1,this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.heartbeatTimer=null,this.capacityHeartbeatTimer&&clearTimeout(this.capacityHeartbeatTimer),this.capacityHeartbeatTimer=null,r&&this.ws===r&&(this.ws=null),!this.stopped&&(this.reconnectTimer||(_("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,r=this.ws){if(r&&this.ws!==r)return;let n;try{n=JSON.parse(String(t))}catch(s){_("warn","orcha-client","invalid Orcha websocket frame",{error:String(s)});return}if(d(n)){if(n.type==="runtime_node.authenticated"){if(r&&this.ws!==r)return;this.connected=!0,this.startHeartbeat(r),_("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(),supportedMethods:this.supportedMethods(),sandboxCapabilities:this.sandboxCapabilities(),targets:this.runtimeTargets()})}}startHeartbeat(t){this.heartbeatTimer&&clearInterval(this.heartbeatTimer);let r=Math.max(1e3,Number(this.config.heartbeatIntervalMs||15e3)),n=()=>this.sendCapacityHeartbeat(t);n(),this.heartbeatTimer=setInterval(n,r),this.heartbeatTimer.unref?.()}scheduleCapacityHeartbeat(){if(!this.connected||this.capacityHeartbeatTimer)return;let t=Math.max(25,Math.min(1e3,Number(this.config.capacityHeartbeatDebounceMs||100)));this.capacityHeartbeatTimer=setTimeout(()=>{this.capacityHeartbeatTimer=null,this.sendCapacityHeartbeat()},t),this.capacityHeartbeatTimer.unref?.()}sendCapacityHeartbeat(t=this.ws){return this.connected?this.send({type:"runtime_node.heartbeat",ts:new Date().toISOString(),supportedMethods:this.supportedMethods(),sandboxCapabilities:this.sandboxCapabilities(),targets:this.runtimeTargets()},t):!1}async handleRequest(t){let r=u(t.id),n=u(t.method),s=d(t.params)?t.params:{};try{let i=await this.invoke(n,s,r);this.send({type:"orcha.runtime.response",id:r,ok:!0,result:i})}catch(i){this.send({type:"orcha.runtime.response",id:r,ok:!1,error:{code:i.code||"RUNTIME_NODE_ERROR",message:i.message||String(i),...i.detail===void 0?{}:{detail:i.detail}}})}}async invoke(t,r,n){if(t==="devices/discover"&&this.config.deviceConnection)return this.config.deviceConnection.candidates();if(t==="devices/configure"&&this.config.deviceConnection)return this.config.deviceConnection.configure(r,this.bridge);if(t==="health")return this.bridge.health();if(t==="agents/create")return this.bridge.createAgent(r);if(t==="agents/dispatch")return this.bridge.dispatch(r,{onUpdate:s=>this.sendUpdate(n,s)});if(t==="sessions/prompt")return this.bridge.prompt(r,{onUpdate:s=>this.sendUpdate(n,s)});if(t==="sessions/policy")return this.bridge.updatePolicy(r);if(t==="sessions/cancel")return this.bridge.cancel(r);if(t==="permissions/respond")return this.bridge.respondPermission(r);throw Object.assign(new Error(`unsupported Orcha runtime method: ${t}`),{code:"METHOD_NOT_FOUND"})}sendUpdate(t,r){this.send({type:"orcha.runtime.event",requestId:t,eventType:"runtime.update",payload:r})}send(t,r=this.ws){return!r||r!==this.ws||r.readyState!==St?!1:(r.send(JSON.stringify(t)),!0)}};import{createServer as ou}from"node:http";function ge(e,t,r){let n=JSON.stringify(r);e.writeHead(t,{"content-type":"application/json; charset=utf-8","content-length":Buffer.byteLength(n)}),e.end(n)}function dt(e={}){return{ok:!0,...e}}function kr(e,t,r){return{ok:!1,error:{code:e,message:t,...r===void 0?{}:{detail:r}}}}async function Ms(e,t){let r=[],n=0;for await(let i of e){if(n+=i.length,n>t)throw Object.assign(new Error("request body too large"),{status:413,code:"REQUEST_TOO_LARGE"});r.push(i)}if(r.length===0)return{};let s=Buffer.concat(r).toString("utf8");if(!s.trim())return{};try{let i=JSON.parse(s);if(!d(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 Us(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 Ps(e,t){let r={"GET /health":async()=>dt(t.health()),"POST /agents/create":async n=>dt(await t.createAgent(n)),"POST /agents/dispatch":async n=>dt(await t.dispatch(n)),"POST /sessions/prompt":async n=>dt(await t.prompt(n)),"POST /sessions/cancel":async n=>dt(await t.cancel(n)),"POST /permissions/respond":async n=>dt(await t.respondPermission(n))};return ou(async(n,s)=>{let i=new URL(n.url||"/",`http://${n.headers.host||`${e.host}:${e.port}`}`),o=`${n.method||"GET"} ${i.pathname}`,a=r[o];if(!a){ge(s,404,kr("NOT_FOUND",`No route for ${o}`));return}try{Us(n,e.token);let c=n.method==="GET"?{}:await Ms(n,e.requestLimitBytes);ge(s,200,await a(c))}catch(c){let l=c.status||500,p=c.code||"BRIDGE_INTERNAL";ge(s,l,kr(p,c.message||String(c),c.detail))}})}var Bs=pu(import.meta.url),fu=".orcha-runtime-bridge.pid",hu=".orcha-runtime-bridge.log",mu=3,gu=36e5,{command:_u,options:js}=wu(process.argv.slice(2));Eu(js);Rn();var yu=On();await qs(_u,yu,js);async function qs(e,t,r){if(r.url){let s=Ae(r.url);r.pidFile||(process.env.ORCHA_RUNTIME_PID_FILE=s.pidFile),r.logFile||(process.env.ORCHA_RUNTIME_LOG_FILE=s.logFile)}let n=()=>["connect","--url",t.orchaUrl,"--foreground"];switch(e){case"connect":if(r.pairCode&&pt(ye(_e())))throw new Error("\u8BBE\u5907\u8FDE\u63A5\u4ECD\u5728\u540E\u53F0\u8FD0\u884C\uFF0C\u8BF7\u5148\u6267\u884C stop --url \u540E\u91CD\u65B0\u914D\u5BF9");await Ft(t,r),r.foreground?await vr(t):Dr(n());return;case"run":case"foreground":r.url&&await Ft(t,r),await vr(t);return;case"start":if(r.url)return qs("connect",t,r);if(r.foreground){await vr(t);return}Dr();return;case"reload":case"restart":{r.url&&await Ft(t,{url:r.url});let s=Rt(Fs(Bs),".."),i=Rt(s,...Br(Rt(s,"src","index.js"))?["dist","package"]:[],"openclaw-plugin"),o=await un(t.targets,i);await vs({quiet:!0}),await o(),Dr(r.url?n():void 0);return}case"stop":await vs();return;case"status":Tu();return;case"help":case"--help":case"-h":Iu();return;default:throw new Error(`Unknown command: ${e}`)}}async function vr(e){Su();let t=new fe(e);if(await t.start(),e.mode==="server"){let n=Ps(e,t);ks({bridge:t,server:n}),n.listen(e.port,e.host,()=>{_("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 r=new me(e,t);ks({bridge:t,client:r}),r.start(),_("info","runtime-bridge","Orcha runtime node started",{nodeId:e.nodeId,nodeName:e.nodeName,orchaUrl:e.orchaUrl,targets:Object.keys(t.targets)})}function ks({bridge:e,client:t,server:r}){let n=!1,s=i=>{if(n)return;n=!0;let o=Number(e?.sessions?.size||0)>0;_("info","runtime-bridge","runtime bridge shutting down",{signal:i});try{t?.stop?.()}catch(a){_("warn","runtime-bridge","runtime client stop failed",{error:String(a)})}Promise.resolve(e?.stop?.(`process_${String(i||"shutdown").toLowerCase()}`)).catch(a=>{_("warn","runtime-bridge","runtime bridge stop failed",{error:String(a)})}).finally(()=>{try{r?.close?.()}catch(a){_("warn","runtime-bridge","runtime server close failed",{error:String(a)})}}),setTimeout(()=>process.exit(0),o?8500:200)};process.once("SIGTERM",()=>s("SIGTERM")),process.once("SIGINT",()=>s("SIGINT"))}function Dr(e=["run"]){let t=_e(),r=Gs(),n=ye(t);if(n&&pt(n)){console.log(JSON.stringify({status:"already_running",pid:n,pidFile:t,logFile:r}));return}n&&Fr(t),$s(t),$s(r),Hr(r);let s=lu(r,"a"),i={...process.env,ORCHA_RUNTIME_PID_FILE:t,ORCHA_RUNTIME_LOG_FILE:r},o=au(process.execPath,[Bs,...e,"--pid-file",t,"--log-file",r],{cwd:process.cwd(),detached:!0,env:i,stdio:["ignore",s,s]});o.unref(),cu(s),Hs(t,`${o.pid}
31
- `),console.log(JSON.stringify({status:"started",pid:o.pid,pidFile:t,logFile:r}))}async function vs({quiet:e=!1}={}){let t=_e(),r=ye(t);if(!r){e||console.log(JSON.stringify({status:"not_running",pidFile:t}));return}if(!pt(r)){Fr(t),e||console.log(JSON.stringify({status:"not_running",pid:r,pidFile:t}));return}process.kill(r,"SIGTERM"),!await Ds(r,1e4)&&pt(r)&&(process.kill(r,"SIGKILL"),await Ds(r,3e3)),Fr(t),e||console.log(JSON.stringify({status:"stopped",pid:r,pidFile:t}))}function Tu(){let e=_e(),t=Gs(),r=ye(e),n=!!(r&&pt(r));console.log(JSON.stringify({status:n?"running":"not_running",running:n,pid:n?r:null,pidFile:e,logFile:t}))}function wu(e){let t=[],r={};for(let s=0;s<e.length;s+=1){let i=e[s];i==="--url"?r.url=e[++s]:i==="--pair-code"?r.pairCode=e[++s]:i==="--daemon"?r.daemon=!0:i==="--foreground"?r.foreground=!0:i==="--env-file"?r.envFile=e[++s]:i==="--pid-file"?r.pidFile=e[++s]:i==="--log-file"?r.logFile=e[++s]:t.push(i)}return{command:t[0]||"run",options:r}}function Eu(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 _e(){return Rt(process.cwd(),process.env.ORCHA_RUNTIME_PID_FILE||fu)}function Gs(){return Rt(process.cwd(),process.env.ORCHA_RUNTIME_LOG_FILE||hu)}function Su(){let e=process.env.ORCHA_RUNTIME_LOG_FILE;if(!e)return;let t=Ks();if(t<=0)return;let r=Rt(process.cwd(),e);Hr(r,t);let n=Ou();n<=0||setInterval(()=>Hr(r,t),n).unref()}function Hr(e,t=Ks()){if(t<=0||!Br(e))return;let r=0,n="";try{if(r=Ls(e).size,r<=0)return;n=$r(e,"utf8")}catch(l){_("warn","runtime-bridge","runtime log cleanup skipped",{logFile:e,error:String(l)});return}let s=Date.now()-t*24*60*60*1e3,i=n.split(/\r?\n/),o=[],a=0;for(let l of i)l&&(Ru(l,s)?o.push(l):a+=1);if(a===0)return;let c="";try{Ls(e).size>r&&(c=$r(e,"utf8").slice(n.length));let p=[...o,...c.split(/\r?\n/).filter(Boolean)].join(`
30
+ `?1:0)).trim()}function Ts(e){let t=String(e||"").trim();if(!t)return null;try{let r=JSON.parse(t);if(d(r)&&(Is(r)||F(r._artifacts)||F(r.artifacts)||F(r._decision)||F(r._meta)))return r}catch{}return null}function $t(e){try{return cr(e)}catch{return null}}function le(...e){let t=null;for(let r of e)try{if(cr(r))return}catch(n){t||=n}if(t)throw t}function Ir(e){let t=String(e||"").trim();if(!t)return null;let r=$t(t);if(r)return r;let n=[...t.matchAll(/```(?:json)?\s*([\s\S]*?)```/gi)];for(let s=n.length-1;s>=0;s-=1){let i=Ts(n[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=Ts(t.slice(s));if(i)return i}return null}function Gc(e){let t=$t(Mr(e));if(t)return t;let r=pe(e);for(let n=r.length-1;n>=0;n-=1){let s=$t(r[n]);if(s)return s}return $t(St(r))}function Is(e){if(!d(e))return!1;if(F(e.output))return!0;for(let t of["content","text","message","summary"])if(u(e[t]))return!0;return!!(Ss(e.status)||u(e.error)||u(e.errorMessage))}function V(e){let t=d(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 Kc(e){return d(e)?typeof(d(e._decision)?e._decision:d(e.decision)?e.decision:e).passed=="boolean":!1}function Cs(e){return d(e)?d(e._decision)&&typeof e._decision.passed=="boolean"?!0:Kc(e.output):!1}function Cr(e,t,r){let n=d(e)?{...e}:{};if(!F(n.output)){for(let s of["summary","message","content","text"])if(u(n[s])){n.output=u(n[s]);break}}return!F(n.output)&&u(r)&&(n.output=u(r)),{...n,_meta:{...d(n._meta)?n._meta:{},runtimeOutputSource:t,requiredRuntimeResult:!0,finalMessagePreview:u(r).slice(0,1e3)}}}var zc=["dataUrl","dataURL","contentDataUrl","contentDataURL","contentBase64","base64","data"];function ws(e){if(!d(e))return"";let t=d(e.content)?e.content:{},r=d(e.metadata)?e.metadata:{};return u(e.fieldKey||e.field_key||t.fieldKey||r.fieldKey)}function Vc(e,t){let r=d(e.content)?e.content:{},n=d(t.content)?t.content:{},s={...e,...t,content:{...r,...n},metadata:{...d(e.metadata)?e.metadata:{},...d(t.metadata)?t.metadata:{}}};for(let i of zc)F(e[i])&&(s[i]=e[i]),F(r[i])&&(s.content[i]=r[i]);return s}function xs(e,t){let r=Array.isArray(e)?e.filter(d):[],n=Array.isArray(t)?t.filter(d):[];if(!r.length)return n;if(!n.length)return r;let s=[...r],i=new Map;for(let a=0;a<r.length;a+=1){let c=ws(r[a]),l=i.get(c)||[];l.push(a),i.set(c,l)}let o=new Map;for(let a of n){let c=ws(a),l=o.get(c)||0;o.set(c,l+1);let p=i.get(c)?.[l];p===void 0?s.push(a):s[p]=Vc(s[p],a)}return s}function Q(e,t,r){let n={...e,...t,_meta:{...d(e._meta)?e._meta:{},...d(t._meta)?t._meta:{},runtimeOutputSource:r}};return(Array.isArray(e._artifacts)||Array.isArray(t._artifacts))&&(n._artifacts=xs(e._artifacts,t._artifacts)),n}function As(e,t,r={}){let n=u(r.promptKind),s=r.requiresRuntimeResult===!0,i=s||n==="dispatch",o=V(e),a=typeof o.output=="string"?$t(o.output):null;if(a)return Q(o,V(a),"result_block");let c=jc(t),l=c?Ir(c):null,p=i?Gc(t):null;if(Is(o))return Ss(o.status)||u(o.error)||u(o.errorMessage)?o:n==="dispatch"&&l?Q(o,V(l),"final_event"):n==="dispatch"&&p?Q(o,V(p),"updates"):!s||Cs(o)?o:l?Q(o,V(l),"final_event"):p?Q(o,V(p),"updates"):(le(o.output,c,St(pe(t))),Cr(o,"result",o.output));if(l)return Q(o,V(l),"final_event");if(p)return Q(o,V(p),"updates");if(c)return s?(le(c,St(pe(t))),Cr(o,"final_event",c)):{...o,output:c,_meta:{...d(o._meta)?o._meta:{},runtimeOutputSource:"final_event"}};let h=Mr(t),f=Ir(h);if(f)return Q(o,V(f),"updates");let m=qc(h);if(!m)return s&&le(St(pe(t))),o;let g=Ir(m);return g?Q(o,V(g),"updates"):s?(le(h,m),Cr(o,"updates",m)):{...o,output:m,_meta:{...d(o._meta)?o._meta:{},runtimeOutputSource:"updates"}}}function Ur(e){return d(e)?u(e.stopReason||e.stop_reason).toLowerCase():""}function bs(e){return wc.has(Ur(e))}function Jc(e,t,r){if(r.promptKind!=="dispatch"||r.requiresRuntimeResult!==!0||!bs(e))return!1;try{return!Cs(As(e,t,r))}catch{return!0}}function Wc(){return["Your previous final response reached the output limit before the Runtime Result protocol was complete.","Re-emit the complete final Runtime Result from scratch using the conclusion you already reached.","Do not repeat analysis, process notes, tool calls, or task work.",`Keep the OUTPUT report within ${Es} Unicode characters.`,`Output ${rr}, ${nr}, ${sr}, and ${ir} on their own lines.`,"The CONTROL block must be valid JSON containing _decision and must be fully closed.","Return only the two protocol blocks."].join(`
31
+ `)}function Xc(e,t){let r=d(t)?{...t}:{},n=xs(e?._artifacts,t?._artifacts);return n.length>0&&(r._artifacts=n),r}function Yc(e,t){return{...e,_meta:{...d(e?._meta)?e._meta:{},runtimeProtocolRetry:{attempted:!0,recovered:!0,reason:Ur(t)||"max_tokens"}}}}function Qc(e,t){let r=typeof e?.output=="string"?e.output:Mr(t),n=new H("runtime_output_truncated","Runtime Result \u8FBE\u5230\u6700\u5927\u8F93\u51FA\u957F\u5EA6\uFF0C\u7D27\u51D1\u91CD\u8BD5\u540E\u4ECD\u672A\u5B8C\u6574\u8FD4\u56DE",r);return n.detail={...n.detail,stopReason:Ur(e)||"max_tokens",retryAttempted:!0},n}var fe=class{constructor(t){this.config=t,this.targets=t.targets||{},this.agents=new Map,this.sessions=new Map,this.startingSessions=new Set,this.targetReservations=new Map,this.runtimeSessionIndex=new Map,this.pendingPermissions=new Map,this.operations=new Map,this.startedAt=At(),this.sandboxCapabilities={dispatchable:t.sandboxRequired!==!0,enforced:!1,backend:t.sandboxRequired?"unavailable":"direct",daemonStatus:t.sandboxRequired?"pending":"not_required",policySchemaVersions:[1],runtimePolicyUpdates:t.sandboxRequired===!0,workspaceSync:!1,egressProxy:!1},this.cleanupTimer=null,this.onCapacityChanged=null,this.startSessionCleanup()}async start(){try{this.sandboxCapabilities=await ms(this.config)}catch(t){this.sandboxCapabilities={...this.sandboxCapabilities,dispatchable:!1,enforced:!1,backend:"unavailable",daemonStatus:"unavailable",reason:u(t?.code||t?.message||t)||"sandbox_probe_failed"},_("error","runtime-bridge","runtime node sandbox probe failed; node will not accept work",{reason:this.sandboxCapabilities.reason})}return this.sandboxCapabilities}assertDispatchable(){if(this.config.sandboxRequired&&!(this.sandboxCapabilities.dispatchable===!0&&this.sandboxCapabilities.enforced===!0))throw Object.assign(new Error("runtime node strong sandbox is unavailable"),{code:"RUNTIME_NODE_SANDBOX_UNAVAILABLE"})}operationIdentity(t,r,n){let s=d(t.goalContract)?pr(t.goalContract):u(t.goalContractHash),i=lc("sha256").update(Y({prompt:Array.isArray(t.prompt)?t.prompt:[],mcpServers:Ic(t.mcpServers),metadata:d(t.metadata)?t.metadata:{}})).digest("hex");return{agentId:r,runId:u(t.runId),sessionId:n,targetCode:u(t.targetCode||t.framework),workspace:u(t.workspace),goalContractHash:s,requestHash:i}}assertOperationIdentity(t,r,n,s){let i=this.operationIdentity(r,n,s),o=Object.keys(t.identity).find(a=>t.identity[a]!==i[a]);if(o)throw Object.assign(new Error(`runtime operation correlation conflict: ${t.correlationId}`),{code:"RUNTIME_OPERATION_CORRELATION_CONFLICT",field:o})}createOperation(t,r,n,s){let i={correlationId:t,agentId:n,sessionId:s,identity:this.operationIdentity(r,n,s),sandboxPolicy:d(r.sandboxPolicy)?structuredClone(r.sandboxPolicy):null,status:"running",updates:[],listeners:new Set,waiters:[],response:null,error:null,mcpServers:r.mcpServers,createdAtMs:Date.now(),completedAtMs:null};return this.operations.set(t,i),i}async attachOperation(t,r={}){let n=()=>{if(r.onUpdate)for(let s of t.updates)r.onUpdate(s)};if(t.status==="completed")return n(),t.response;if(t.status==="failed")throw n(),t.error;r.onUpdate&&t.listeners.add(r.onUpdate);try{return n(),await new Promise((s,i)=>t.waiters.push({resolve:s,reject:i}))}finally{r.onUpdate&&t.listeners.delete(r.onUpdate)}}completeOperation(t,r){if(t.status==="running"){t.status="completed",t.response=r,t.mcpServers=null,t.completedAtMs=Date.now();for(let n of t.waiters.splice(0))n.resolve(r);t.listeners.clear()}}promptResponse(t,r,n,s,i,o=s){let a=d(t.metadata)?t.metadata:{},c=d(a._runtimeBridge)?a._runtimeBridge:{},l=a.source==="channel_message"?i:As(i,o,c),p=ds(t.goalContract,s,t.goalContractHash);return{sessionId:n,runtimeSessionId:r.runtimeSessionId,result:l,updates:s,...p?{verification:p}:{}}}failOperation(t,r){if(t.status!=="running")return;let n=r instanceof Error?r:Object.assign(new Error(String(r||"runtime operation failed")),{code:"RUNTIME_NODE_ERROR"});t.status="failed",t.error=n,t.mcpServers=null,t.completedAtMs=Date.now();for(let s of t.waiters.splice(0))s.reject(n);t.listeners.clear()}cleanupOperations(t=Date.now()){let r=rt(this.config.operationTtlMs,mc);for(let[n,s]of this.operations)s.status!=="running"&&t-(s.completedAtMs||s.createdAtMs)>r&&this.operations.delete(n)}targetFor(t){let r=u(t)||this.config.defaultTargetCode,n=this.targets[r];if(!r||!d(n)){let s=new Error(`runtime target is not configured: ${r||"<empty>"}`);throw s.code="RUNTIME_TARGET_NOT_FOUND",s}return{code:r,target:n}}targetIdleTtlMs(t){let n=Z(t)==="openclaw"?rt(this.config.openClawSessionIdleTtlMs,yc):rt(this.config.sessionIdleTtlMs,pc);return rt(t?.sessionIdleTtlMs??t?.idleTtlMs,n)}targetMaxSessions(t){let n=Z(t)==="openclaw"?rt(this.config.openClawMaxSessions,Tc):rt(this.config.maxSessionsPerTarget,hc);return rt(t?.maxSessions,n)}targetReservationCount(t){return Number(this.targetReservations.get(t)||0)}notifyCapacityChanged(){try{this.onCapacityChanged?.()}catch(t){_("warn","runtime-bridge","capacity heartbeat callback failed",{error:String(t)})}}targetCapacitySnapshot(t=!0){return Object.entries(this.targets).map(([r,n])=>{let s=[...this.sessions.values()].filter(p=>p.targetCode===r),i=s.filter(p=>p.busy).length,o=s.length-i,a=this.targetReservationCount(r),c=this.targetMaxSessions(n),l=t?Math.max(0,c-i-a):0;return{targetCode:r,targetName:u(n?.name||n?.targetName||r),targetType:u(n?.type||"echo"),status:t?l>0?"available":"busy":"unavailable",maxSessions:c,busySessions:i,idleSessions:o,reservedSessions:a,availableSessions:l}})}targetReleaseAfterPrompt(t,r={}){let n=Z(t),s=d(r?._runtimeBridge)?r._runtimeBridge:{},i=xr(s);return i!==void 0?Dt(i,!1):Dt(t?.releaseAfterPrompt??t?.disposeAfterPrompt,n==="openclaw")}promptReleaseAfterPrompt(t,r={}){if(this.config.sandboxRequired)return!0;let n=d(r?._runtimeBridge)?r._runtimeBridge:{},s=xr(n);return s!==void 0?Dt(s,t.releaseAfterPrompt):t.releaseAfterPrompt}startSessionCleanup(){let t=rt(this.config.sessionCleanupIntervalMs,fc);t<=0||(this.cleanupTimer=setInterval(()=>{this.cleanupExpiredSessions().catch(r=>{_("warn","runtime-bridge","runtime session cleanup failed",{error:String(r)})})},t),this.cleanupTimer.unref?.())}sessionCountForTarget(t){let r=0;for(let n of this.sessions.values())n.targetCode===t&&(r+=1);return r}idleTargetSessions(t){return[...this.sessions.entries()].filter(([,r])=>r.targetCode===t&&!r.busy).sort((r,n)=>(r[1].lastUsedAtMs||0)-(n[1].lastUsedAtMs||0))}async closeSession(t,r="session_closed"){let n=this.sessions.get(t);if(!n)return!1;try{await n.runtime?.stop?.(r)}catch(s){_("warn","runtime-bridge","runtime session stop failed",{sessionId:n.sessionId,runtimeSessionId:n.runtimeSessionId,targetCode:n.targetCode,runtimeKind:n.runtimeKind,error:String(s)})}return this.sessions.delete(t),this.runtimeSessionIndex.delete(`${n.agentId}:${n.runtimeSessionId}`),this.notifyCapacityChanged(),_("info","runtime-bridge","runtime session closed",{sessionId:n.sessionId,runtimeSessionId:n.runtimeSessionId,targetCode:n.targetCode,runtimeKind:n.runtimeKind,reason:r}),!0}async closeAllSessions(t="bridge_shutdown"){for(let r of[...this.sessions.keys()])await this.closeSession(r,t)}async stop(t="bridge_stop"){this.cleanupTimer&&clearInterval(this.cleanupTimer),this.cleanupTimer=null,await this.closeAllSessions(t)}async cleanupExpiredSessions(t=Date.now()){for(let[r,n]of[...this.sessions.entries()])n.busy||t-(n.lastUsedAtMs||n.createdAtMs||t)>n.idleTtlMs&&await this.closeSession(r,"idle_timeout")}async reserveTargetSlot(t,r){let n=this.targetMaxSessions(r);for(;this.sessionCountForTarget(t)+this.targetReservationCount(t)>=n;){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}await this.closeSession(s[0][0],"target_session_limit")}this.targetReservations.set(t,this.targetReservationCount(t)+1),this.notifyCapacityChanged()}releaseTargetSlot(t){let r=Math.max(0,this.targetReservationCount(t)-1);r>0?this.targetReservations.set(t,r):this.targetReservations.delete(t),this.notifyCapacityChanged()}async createAgent(t){let r=u(t.agentId);if(!r)throw Object.assign(new Error("agentId is required"),{status:400,code:"BAD_REQUEST"});let{code:n,target:s}=this.targetFor(t.targetCode||t.framework),i=this.agents.get(r);if(i&&i.targetCode!==n)throw Object.assign(new Error(`runtime agent target conflict: ${r}`),{code:"RUNTIME_AGENT_TARGET_CONFLICT"});let o=this.config.sandboxRequired?await yr(this.config,s,t.workspace):u(t.workspace),a={agentId:r,targetCode:n,framework:u(t.framework||n),workspace:o,metadata:d(t.metadata)?t.metadata:{},createdAt:At(),runtimeKind:Z(s)};return this.agents.set(r,a),{agent:a}}runtimeFor(t,r,n={}){let{target:s}=this.targetFor(t.targetCode),i=Z(s),o={onPermissionRequest:c=>n.source==="conversation_delegation"?{outcome:"denied",reason:"External group member permission continuation is not supported"}:this.requestPermission(c)},a={sessionPromptTimeoutMs:this.config.sessionPromptTimeoutMs,initializeTimeoutMs:this.config.initializeTimeoutMs,sandboxRequired:this.config.sandboxRequired,runId:n.runId,source:n.source,cloudSessionId:r,orchaUrl:this.config.orchaUrl,attachOnly:n.attachOnly,sandboxPolicy:n.sandboxPolicy,...this.config.sandboxRequired?{prepareLaunch:c=>gs({config:this.config,target:s,...c,runId:n.runId,agentId:t.agentId,sessionId:r,sandboxPolicy:n.sandboxPolicy})}:{}};return i==="stdio-acp"||i==="acp"?new gt(t,s,o,a):i==="openclaw"?new Yt(t,s,r,o,a):i==="cli"?as(s)?new se(t,s,a,o):new Tt(t,s,a,o):new Gt(t)}async prompt(t,r={}){if(this.assertDispatchable(),this.config.sandboxRequired){let a=u(t.runId);if(!a)throw Object.assign(new Error("runId is required"),{code:"BAD_REQUEST"});t={...t,runId:a,sandboxPolicy:dt(t.sandboxPolicy)}}let n=u(t.agentId),s=u(t.sessionId)||de(),i=u(t.correlationId);if(!n)throw Object.assign(new Error("agentId is required"),{status:400,code:"BAD_REQUEST"});if(this.cleanupOperations(),i){let a=this.operations.get(i);if(a){if(this.assertOperationIdentity(a,t,n,s),a.status==="running"&&(["conversation_delegation","channel_message"].includes(t.metadata?.source)||t.metadata?.source==="ai_chat_runtime_node"&&Object.hasOwn(lt,t.framework||""))){a.mcpServers=t.mcpServers;let c=this.sessions.get(`${n}:${s}`);if(c){if(!c.runtime.refreshMcpServers)throw Object.assign(new Error("This runtime cannot refresh task MCP credentials"),{code:"unsupported_dynamic_mcp"});await c.runtime.refreshMcpServers(t.mcpServers)}}return this.attachOperation(a,r)}if(t.attachOnly===!0&&!(t.metadata?.source==="channel_message"&&this.targetFor(t.targetCode||t.framework).target.type==="openclaw"))throw Object.assign(new Error(`runtime operation is no longer available: ${i}`),{code:"RUNTIME_OPERATION_NOT_FOUND"})}else if(t.attachOnly===!0)throw Object.assign(new Error("correlationId is required for attachOnly"),{code:"BAD_REQUEST"});let o=i?this.createOperation(i,t,n,s):null;if(o){let a=this.attachOperation(o,r);return(async()=>{try{await this._promptOwned(t,{},o,n,s)}catch(c){let l=o.status==="completed";this.failOperation(o,c),l&&_("warn","runtime-bridge","runtime cleanup failed after operation completion",{correlationId:o.correlationId,error:String(c)})}})(),await a}return await this._promptOwned(t,r,o,n,s)}async _promptOwned(t,r,n,s,i){let o=u(t.runId),a=this.config.sandboxRequired?dt(n?.sandboxPolicy||t.sandboxPolicy):null,c=this.agents.get(s),l=this.targetFor(t.targetCode||t.framework||c?.targetCode);if(c&&c.targetCode!==l.code)throw Object.assign(new Error(`runtime agent target conflict: ${s}`),{code:"RUNTIME_AGENT_TARGET_CONFLICT"});if(Z(l.target)==="cli"&&Cc(t.goalContract))throw Object.assign(new Error("CLI runtimes do not support per-run dynamic MCP required by plugin_operation"),{code:"unsupported_dynamic_mcp"});let p=c||(await this.createAgent({agentId:s,targetCode:l.code,framework:t.framework,workspace:t.workspace,metadata:t.metadata})).agent;if(!this.config.sandboxRequired){let y=u(t.workspace);y&&y!==p.workspace&&(p.workspace=y)}let h=`${s}:${i}`;await this.cleanupExpiredSessions();let f=this.sessions.get(h),m=null;if(f&&f.targetCode!==l.code)throw Object.assign(new Error(`runtime session target conflict: ${i}`),{code:"RUNTIME_SESSION_TARGET_CONFLICT"});if(f&&this.config.sandboxRequired&&f.runId!==o)throw Object.assign(new Error(`runtime session cannot be shared across runs: ${i}`),{code:"RUNTIME_SESSION_RUN_CONFLICT"});if(!f){if(this.startingSessions.has(h))throw Object.assign(new Error(`runtime session is already starting: ${i}`),{code:"RUNTIME_SESSION_BUSY"});this.startingSessions.add(h);let{code:y,target:S}=l,N;try{await this.reserveTargetSlot(y,S),m=y;let A=this.runtimeFor(p,i,{runId:o,sandboxPolicy:a,source:t.metadata?.source,attachOnly:t.attachOnly});N=A;let E=n?.mcpServers||t.mcpServers||[],O=await A.sessionNew({cwd:W(S,p.workspace),mcpServers:E,metadata:d(t.metadata)?t.metadata:{}});if(n&&n.status!=="running")throw Object.assign(new Error("Runtime operation was cancelled before prompt dispatch"),{code:"RUNTIME_OPERATION_CANCELLED"});let C=Date.now();f={agentId:s,sessionId:i,runtime:A,targetCode:y,runtimeKind:Z(S),runId:o,sandboxPolicy:a?structuredClone(a):null,runtimeSessionId:u(d(O)?O.sessionId:"")||i,idleTtlMs:this.targetIdleTtlMs(S),releaseAfterPrompt:this.config.sandboxRequired?!0:this.targetReleaseAfterPrompt(S,t.metadata),createdAtMs:C,lastUsedAtMs:C,busy:!1,createdAt:At()},this.sessions.set(h,f),this.runtimeSessionIndex.set(`${s}:${f.runtimeSessionId}`,f),n?.mcpServers!==E&&n?.mcpServers&&A.refreshMcpServers&&await A.refreshMcpServers(n.mcpServers)}catch(A){throw this.sessions.get(h)?.runtime===N?await this.closeSession(h,"session_start_failed"):await N?.stop("session_start_failed"),m&&(this.releaseTargetSlot(m),m=null),A}finally{this.startingSessions.delete(h)}}if(f.busy){let y=new Error(`runtime session is already running: ${i}`);throw y.code="RUNTIME_SESSION_BUSY",y}f.busy=!0,m&&this.releaseTargetSlot(m),this.notifyCapacityChanged(),f.operationCorrelationId=n?.correlationId||null,f.lastUsedAtMs=Date.now();let g=n?.updates||[],T=bc(y=>{let S=xc(y,i,f);if(g.push(S),n)for(let N of n.listeners)try{N?.(S)}catch(A){_("warn","runtime-bridge","runtime operation update listener failed",{correlationId:n.correlationId,error:String(A)})}else r.onUpdate?.(S)}),x=T.push,w=y=>{if(T.flush(),!(!n||n.status!=="running"||!d(y))){if(y.status==="failed"){let S=y.error;if(S instanceof Error){this.failOperation(n,S);return}let N=d(S)?S:{},A=Object.assign(new Error(u(N.message||y.message)||"runtime terminal failure"),{code:u(N.code||y.code)||"RUNTIME_TERMINAL_FAILED"});this.failOperation(n,A);return}this.completeOperation(n,this.promptResponse(t,f,i,g,d(y.result)?y.result:{stopReason:"end_turn"}))}},I=async y=>{try{return await f.runtime.sessionPrompt(y,x,w)}finally{T.flush()}};try{let y=ls(t.goalContract),S=Array.isArray(t.prompt)?[...t.prompt]:[];y&&S.unshift({type:"text",text:y,metadata:{source:"orcha_goal_contract"}});let N=d(t.metadata)?t.metadata:{},A=d(N._runtimeBridge)?N._runtimeBridge:{},E=await I({sessionId:f.runtimeSessionId,prompt:S,metadata:N}),O=g,C=null;if(Rs({type:f.runtimeKind})&&Jc(E,g,A)){C=E;let nt=g.length,M=await I({sessionId:f.runtimeSessionId,prompt:[{type:"text",text:Wc()}],metadata:N,_meta:{thinking:"off"}});E=Xc(C,M),O=g.slice(nt)}let L;try{L=this.promptResponse(t,f,i,g,E,O)}catch(nt){throw C&&bs(E)?Qc(E,O):nt}return C&&(L.result=Yc(L.result,C)),n&&this.completeOperation(n,L),L}finally{f.busy=!1,this.notifyCapacityChanged(),f.operationCorrelationId===n?.correlationId&&(f.operationCorrelationId=null),f.lastUsedAtMs=Date.now(),this.promptReleaseAfterPrompt(f,d(t.metadata)?t.metadata:{})&&await this.closeSession(h,"release_after_prompt"),n&&(n.mcpServers=null)}}async updatePolicy(t){if(this.assertDispatchable(),!this.config.sandboxRequired)throw Object.assign(new Error("runtime sandbox policy updates require an enforced sandbox"),{code:"RUNTIME_NODE_SANDBOX_UNAVAILABLE"});let r=u(t.agentId),n=u(t.runId),s=u(t.sessionId),i=u(t.correlationId);if(!r||!n||!s||!i)throw Object.assign(new Error("agentId, runId, sessionId and correlationId are required"),{code:"BAD_REQUEST"});let o=dt(t.sandboxPolicy),a=this.operations.get(i);if(a&&(a.agentId!==r||a.sessionId!==s||a.identity.runId!==n))throw Object.assign(new Error(`runtime operation policy identity conflict: ${i}`),{code:"RUNTIME_OPERATION_CORRELATION_CONFLICT"});let c=`${r}:${s}`,l=this.sessions.get(c);if(l&&l.runId!==n)throw Object.assign(new Error(`runtime session policy identity conflict: ${s}`),{code:"RUNTIME_SESSION_RUN_CONFLICT"});let p=l?.sandboxPolicy||a?.sandboxPolicy;if(!p)throw Object.assign(new Error(`runtime operation is no longer available: ${i}`),{code:"RUNTIME_OPERATION_NOT_FOUND"});let h=Number(p.policyRevision),f=Number(o.policyRevision);if(f<h)throw Object.assign(new Error("runtime sandbox policy revision is stale"),{code:"RUNTIME_POLICY_REVISION_CONFLICT",currentPolicyRevision:h});if(f===h){if(Y(p)!==Y(o))throw Object.assign(new Error("runtime sandbox policy revision payload conflicts"),{code:"RUNTIME_POLICY_REVISION_CONFLICT",currentPolicyRevision:h});return{updated:!1,idempotent:!0,policyRevision:h,accessMode:p.accessMode}}let m=hs(p,o);a&&(a.sandboxPolicy=structuredClone(o)),l&&(l.sandboxPolicy=structuredClone(o));let g=!1;return m&&l?.busy===!0&&(await l.runtime.sessionCancel({sessionId:l.runtimeSessionId}),g=await this.closeSession(c,"sandbox_policy_downgrade")),{updated:!0,policyRevision:f,accessMode:o.accessMode,activeCommandCancelled:g,deferredToNextLaunch:!m&&l?.busy===!0}}async cancel(t){let r=u(t.agentId),n=u(t.sessionId),s=u(t.correlationId);if(s){let a=this.operations.get(s);if(!a||a.status!=="running")return{cancelled:!1,correlationId:s,reason:"operation_not_running"};if(a.agentId!==r||a.sessionId!==n)throw Object.assign(new Error(`runtime operation cancellation identity conflict: ${s}`),{code:"RUNTIME_OPERATION_CORRELATION_CONFLICT"});let c=this.sessions.get(`${r}:${n}`);return!c||c.busy!==!0||c.operationCorrelationId!==s?(this.failOperation(a,Object.assign(new Error("Runtime operation cancelled before dispatch"),{code:"RUNTIME_OPERATION_CANCELLED"})),{cancelled:!0,correlationId:s,reason:"cancelled_before_dispatch"}):(await c.runtime.sessionCancel({sessionId:c.runtimeSessionId}),await this.closeSession(`${r}:${n}`,"cancelled"),{cancelled:!0,correlationId:s})}let i=`${r}:${n}`,o=this.sessions.get(i);return o?(await o.runtime.sessionCancel({sessionId:o.runtimeSessionId}),await this.closeSession(i,"cancelled"),{cancelled:!0}):{cancelled:!1}}async dispatch(t,r={}){let n=u(t.agentId),s=u(t.taskId),i=u(t.executionId);if(!n||!s)throw Object.assign(new Error("agentId and taskId are required"),{status:400,code:"BAD_REQUEST"});let o=u(t.sessionId)||`dispatch-${i||s}`,a=u(t.instructions),c=$c(t),l=Os(t),{target:p}=this.targetFor(t.targetCode||t.framework),h=[{type:"text",text:["Task dispatch received.",`taskId: ${s}`,i?`executionId: ${i}`:"",a?`instructions: ${a}`:"",c?"orchaContext:":"",c,c?"Use orchaContext as the source of truth for upstream outputs, review reports, artifacts, and workflow metadata.":"","Follow the execution protocol in instructions exactly.","When embedding a generated artifact in final Markdown, use the Orcha artifact placeholder as the link target: orcha-artifact://<fieldKey>/<index>.","Example: use ![illustration](orcha-artifact://image/0) for the first generated image artifact.","Do not use local filesystem paths, file:// URLs, or data: URLs in final Markdown; Orcha replaces artifact placeholders after ingestion.",l?`For decision results, put the raw report between ${rr} and ${nr}.`:"",l?`Then put a JSON object containing _decision between ${sr} and ${ir}.`:"",l?"Do not JSON-escape the report. Keep output out of the CONTROL JSON, and put every protocol marker on its own line.":"",l?`Keep the report within ${Es} Unicode characters so the CONTROL block fits before the output limit.`:"","Return only the final answer required by that protocol.","Do not include process notes, logs, or explanations."].filter(Boolean).join(`
32
+ `)}];return this.prompt({...t,agentId:n,sessionId:o,prompt:h,metadata:Dc(t,p)},r)}async requestPermission({agent:t,runtimeSessionId:r,request:n,emitUpdate:s,signal:i}){let o=de(),c=this.runtimeSessionIndex.get(`${t.agentId}:${r}`)?.sessionId||r||de(),l=R(n?.timeoutMs,this.config.permissionRequestTimeoutMs),p={permissionId:o,agentId:t.agentId,sessionId:c,runtimeSessionId:r,request:d(n)?n:{},status:"pending",createdAt:At(),expiresAt:new Date(Date.now()+l).toISOString()};return i?.aborted?{permissionId:o,outcome:"cancelled",response:{reason:"runtime turn ended"}}:await new Promise(h=>{let f=(T,x)=>{clearTimeout(g),i?.removeEventListener("abort",m),this.pendingPermissions.delete(o),s?.({sessionId:r,update:{sessionUpdate:"permission_resolved",permissionId:o,outcome:x}}),h(T)},m=()=>f({permissionId:o,outcome:"cancelled",response:{reason:"runtime turn ended"}},"cancelled"),g=setTimeout(()=>f({permissionId:o,outcome:"denied",response:{reason:"permission request timed out"}},"expired"),l);i?.addEventListener("abort",m,{once:!0}),this.pendingPermissions.set(o,{settle:f,permission:p}),s?.({sessionId:r,update:{sessionUpdate:"permission_request",permission:p}})})}async respondPermission(t){let r=u(t.permissionId),n=this.pendingPermissions.get(r),s=u(t.outcome||"approved")||"approved";return n?(n.settle({permissionId:r,outcome:s,response:d(t.response)?t.response:{},userId:u(t.userId),metadata:d(t.metadata)?t.metadata:{}},s),{accepted:!0,permissionId:r,outcome:s}):{accepted:!1,permissionId:r,outcome:s}}health(){return{status:this.config.sandboxRequired&&!this.sandboxCapabilities.dispatchable?"unavailable":"ok",bridgeVersion:K,startedAt:this.startedAt,agents:[...this.agents.values()].map(t=>({agentId:t.agentId,targetCode:t.targetCode,framework:t.framework,runtimeKind:t.runtimeKind})),sessions:this.sessions.size,pendingPermissions:this.pendingPermissions.size,targets:Object.keys(this.targets),sandboxCapabilities:this.sandboxCapabilities}}};import Zc from"node:http";import tu from"node:https";import{randomBytes as Ns}from"node:crypto";var Rt=1,pt=3,eu=1e4,he=class{constructor(t,r={}){this.url=t,this.readyState=0,this.socket=null,this.request=null,this.buffer=Buffer.alloc(0),this.listeners=new Map,this.connectTimeoutMs=ru(r.connectTimeoutMs,eu),this.connectTimer=null,this.connect()}addEventListener(t,r){let n=this.listeners.get(t)||new Set;n.add(r),this.listeners.set(t,n)}emit(t,r={}){let n=this.listeners.get(t);if(n)for(let s of n)s(r)}connect(){let t=new URL(this.url),r=t.protocol==="wss:"?tu:Zc,n=Ns(16).toString("base64"),s=r.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":n,"Sec-WebSocket-Version":"13"}});this.request=s,this.startConnectTimer(s),s.on("upgrade",(i,o,a)=>{if(this.clearConnectTimer(),this.readyState===pt){o.destroy();return}this.socket=o,this.readyState=Rt,o.on("data",c=>this.onData(c)),o.on("close",()=>this.onClose()),o.on("error",c=>{this.readyState!==pt&&this.emit("error",{error:c,message:c.message,type:"error"}),this.onClose()}),a?.length&&this.onData(a),this.emit("open")}),s.on("response",i=>{this.clearConnectTimer(),this.emit("error",{message:`websocket upgrade failed: HTTP ${i.statusCode}`,type:"error"}),i.resume(),this.onClose()}),s.on("error",i=>{this.clearConnectTimer(),this.readyState!==pt&&this.emit("error",{error:i,message:i.message,type:"error"}),this.onClose()}),s.end()}startConnectTimer(t){this.connectTimeoutMs<=0||(this.connectTimer=setTimeout(()=>{if(this.readyState===Rt||this.readyState===pt)return;let r=`websocket connect timeout after ${this.connectTimeoutMs}ms`;this.emit("error",{message:r,type:"timeout"}),this.onClose(),t.destroy(new Error(r))},this.connectTimeoutMs),this.connectTimer.unref?.())}clearConnectTimer(){this.connectTimer&&(clearTimeout(this.connectTimer),this.connectTimer=null)}send(t){!this.socket||this.readyState!==Rt||this.socket.write(Pr(1,Buffer.from(String(t),"utf8")))}close(){if(this.readyState!==pt){if(this.clearConnectTimer(),!this.socket){this.request?.destroy(),this.onClose();return}try{this.readyState===Rt&&this.socket.write(Pr(8,Buffer.alloc(0))),this.socket.end()}catch{this.socket.destroy()}this.onClose()}}onClose(){this.readyState!==pt&&(this.clearConnectTimer(),this.readyState=pt,this.request=null,this.emit("close"))}onData(t){for(this.buffer=Buffer.concat([this.buffer,t]);this.buffer.length>=2;){let r=this.buffer[0],n=this.buffer[1],s=r&15,i=(n&128)!==0,o=n&127,a=2;if(o===126){if(this.buffer.length<a+2)return;o=this.buffer.readUInt16BE(a),a+=2}else if(o===127){if(this.buffer.length<a+8)return;let p=this.buffer.readUInt32BE(a),h=this.buffer.readUInt32BE(a+4);o=p*2**32+h,a+=8}let c=a;if(i&&(a+=4),this.buffer.length<a+o)return;let l=this.buffer.subarray(a,a+o);if(i){let p=this.buffer.subarray(c,c+4);l=Buffer.from(l.map((h,f)=>h^p[f%4]))}this.buffer=this.buffer.subarray(a+o),s===1?this.emit("message",{data:l.toString("utf8")}):s===8?this.close():s===9&&this.socket?.write(Pr(10,l))}}};function ru(e,t){let r=Number.parseInt(String(e??""),10);return Number.isFinite(r)&&r>=0?r:t}function Pr(e,t){let r=t.length,n=2;r>=126&&r<=65535?n+=2:r>65535&&(n+=8);let s=Ns(4),i=Buffer.alloc(n+4+r);i[0]=128|e;let o=2;r<126?i[1]=128|r:r<=65535?(i[1]=254,i.writeUInt16BE(r,o),o+=2):(i[1]=255,i.writeUInt32BE(Math.floor(r/2**32),o),i.writeUInt32BE(r>>>0,o+4),o+=8),s.copy(i,o),o+=4;for(let a=0;a<r;a+=1)i[o+a]=t[a]^s[a%4];return i}function nu(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 su(e,t=!0){return Object.entries(e||{}).map(([r,n])=>({targetCode:r,targetName:u(n?.name||n?.targetName||r),targetType:u(n?.type||"echo"),status:t?"available":"unavailable"}))}var iu=Object.freeze(["health","agents/create","agents/dispatch","sessions/prompt","sessions/policy","sessions/cancel","permissions/respond"]),me=class{constructor(t,r){this.config=t,this.bridge=r,this.ws=null,this.stopped=!1,this.connected=!1,this.reconnectTimer=null,this.heartbeatTimer=null,this.capacityHeartbeatTimer=null,this.bridge.onCapacityChanged=()=>this.scheduleCapacityHeartbeat()}sandboxCapabilities(){return this.bridge.sandboxCapabilities||{dispatchable:this.config.sandboxRequired!==!0,enforced:!1,backend:"development_direct",daemonStatus:"development_only",policySchemaVersions:[1],runtimePolicyUpdates:!0,workspaceSync:!1,egressProxy:!1}}supportedMethods(){return[...iu,...this.config.deviceConnection?["devices/discover","devices/configure"]:[]]}runtimeTargets(){let t=this.sandboxCapabilities().dispatchable===!0;return typeof this.bridge.targetCapacitySnapshot=="function"?this.bridge.targetCapacitySnapshot(t):su(this.config.targets,t)}start(){this.connect()}stop(){this.stopped=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.heartbeatTimer=null,this.capacityHeartbeatTimer&&clearTimeout(this.capacityHeartbeatTimer),this.capacityHeartbeatTimer=null,this.bridge.onCapacityChanged=null,this.ws?.close()}connect(){if(this.stopped)return;let t=nu(this.config.orchaUrl),r=new he(t,{connectTimeoutMs:this.config.connectTimeoutMs});this.ws=r,r.addEventListener("open",()=>{if(this.ws!==r||this.stopped){r.close();return}this.authenticate(r)}),r.addEventListener("message",n=>this.handleMessage(n.data,r)),r.addEventListener("close",()=>this.scheduleReconnect("close",r)),r.addEventListener("error",n=>{_("warn","orcha-client","runtime node websocket error",{error:String(n?.message||n?.type||n)})})}authenticate(t=this.ws){this.send({type:"runtime_node.authenticate",token:this.config.nodeToken,nodeId:this.config.nodeId,nodeName:this.config.nodeName,version:K,protocolVersion:"orcha-runtime-node.v2",defaultTargetCode:this.config.defaultTargetCode,supportedMethods:this.supportedMethods(),sandboxCapabilities:this.sandboxCapabilities(),targets:this.runtimeTargets()},t)}scheduleReconnect(t,r=this.ws){r&&this.ws!==r||(this.connected=!1,this.heartbeatTimer&&clearInterval(this.heartbeatTimer),this.heartbeatTimer=null,this.capacityHeartbeatTimer&&clearTimeout(this.capacityHeartbeatTimer),this.capacityHeartbeatTimer=null,r&&this.ws===r&&(this.ws=null),!this.stopped&&(this.reconnectTimer||(_("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,r=this.ws){if(r&&this.ws!==r)return;let n;try{n=JSON.parse(String(t))}catch(s){_("warn","orcha-client","invalid Orcha websocket frame",{error:String(s)});return}if(d(n)){if(n.type==="runtime_node.authenticated"){if(r&&this.ws!==r)return;this.connected=!0,this.startHeartbeat(r),_("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(),supportedMethods:this.supportedMethods(),sandboxCapabilities:this.sandboxCapabilities(),targets:this.runtimeTargets()})}}startHeartbeat(t){this.heartbeatTimer&&clearInterval(this.heartbeatTimer);let r=Math.max(1e3,Number(this.config.heartbeatIntervalMs||15e3)),n=()=>this.sendCapacityHeartbeat(t);n(),this.heartbeatTimer=setInterval(n,r),this.heartbeatTimer.unref?.()}scheduleCapacityHeartbeat(){if(!this.connected||this.capacityHeartbeatTimer)return;let t=Math.max(25,Math.min(1e3,Number(this.config.capacityHeartbeatDebounceMs||100)));this.capacityHeartbeatTimer=setTimeout(()=>{this.capacityHeartbeatTimer=null,this.sendCapacityHeartbeat()},t),this.capacityHeartbeatTimer.unref?.()}sendCapacityHeartbeat(t=this.ws){return this.connected?this.send({type:"runtime_node.heartbeat",ts:new Date().toISOString(),supportedMethods:this.supportedMethods(),sandboxCapabilities:this.sandboxCapabilities(),targets:this.runtimeTargets()},t):!1}async handleRequest(t){let r=u(t.id),n=u(t.method),s=d(t.params)?t.params:{};try{let i=await this.invoke(n,s,r);this.send({type:"orcha.runtime.response",id:r,ok:!0,result:i})}catch(i){this.send({type:"orcha.runtime.response",id:r,ok:!1,error:{code:i.code||"RUNTIME_NODE_ERROR",message:i.message||String(i),...i.detail===void 0?{}:{detail:i.detail}}})}}async invoke(t,r,n){if(t==="devices/discover"&&this.config.deviceConnection)return this.config.deviceConnection.candidates();if(t==="devices/configure"&&this.config.deviceConnection)return this.config.deviceConnection.configure(r,this.bridge);if(t==="health")return this.bridge.health();if(t==="agents/create")return this.bridge.createAgent(r);if(t==="agents/dispatch")return this.bridge.dispatch(r,{onUpdate:s=>this.sendUpdate(n,s)});if(t==="sessions/prompt")return this.bridge.prompt(r,{onUpdate:s=>this.sendUpdate(n,s)});if(t==="sessions/policy")return this.bridge.updatePolicy(r);if(t==="sessions/cancel")return this.bridge.cancel(r);if(t==="permissions/respond")return this.bridge.respondPermission(r);throw Object.assign(new Error(`unsupported Orcha runtime method: ${t}`),{code:"METHOD_NOT_FOUND"})}sendUpdate(t,r){this.send({type:"orcha.runtime.event",requestId:t,eventType:"runtime.update",payload:r})}send(t,r=this.ws){return!r||r!==this.ws||r.readyState!==Rt?!1:(r.send(JSON.stringify(t)),!0)}};import{createServer as ou}from"node:http";function ge(e,t,r){let n=JSON.stringify(r);e.writeHead(t,{"content-type":"application/json; charset=utf-8","content-length":Buffer.byteLength(n)}),e.end(n)}function ft(e={}){return{ok:!0,...e}}function Lr(e,t,r){return{ok:!1,error:{code:e,message:t,...r===void 0?{}:{detail:r}}}}async function Ms(e,t){let r=[],n=0;for await(let i of e){if(n+=i.length,n>t)throw Object.assign(new Error("request body too large"),{status:413,code:"REQUEST_TOO_LARGE"});r.push(i)}if(r.length===0)return{};let s=Buffer.concat(r).toString("utf8");if(!s.trim())return{};try{let i=JSON.parse(s);if(!d(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 Us(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 Ps(e,t){let r={"GET /health":async()=>ft(t.health()),"POST /agents/create":async n=>ft(await t.createAgent(n)),"POST /agents/dispatch":async n=>ft(await t.dispatch(n)),"POST /sessions/prompt":async n=>ft(await t.prompt(n)),"POST /sessions/cancel":async n=>ft(await t.cancel(n)),"POST /permissions/respond":async n=>ft(await t.respondPermission(n))};return ou(async(n,s)=>{let i=new URL(n.url||"/",`http://${n.headers.host||`${e.host}:${e.port}`}`),o=`${n.method||"GET"} ${i.pathname}`,a=r[o];if(!a){ge(s,404,Lr("NOT_FOUND",`No route for ${o}`));return}try{Us(n,e.token);let c=n.method==="GET"?{}:await Ms(n,e.requestLimitBytes);ge(s,200,await a(c))}catch(c){let l=c.status||500,p=c.code||"BRIDGE_INTERNAL";ge(s,l,Lr(p,c.message||String(c),c.detail))}})}var Bs=pu(import.meta.url),fu=".orcha-runtime-bridge.pid",hu=".orcha-runtime-bridge.log",mu=3,gu=36e5,{command:_u,options:js}=wu(process.argv.slice(2));Eu(js);Rn();var yu=On();await qs(_u,yu,js);async function qs(e,t,r){if(r.url){let s=Ae(r.url);r.pidFile||(process.env.ORCHA_RUNTIME_PID_FILE=s.pidFile),r.logFile||(process.env.ORCHA_RUNTIME_LOG_FILE=s.logFile)}let n=()=>["connect","--url",t.orchaUrl,"--foreground"];switch(e){case"connect":if(r.pairCode&&ht(ye(_e())))throw new Error("\u8BBE\u5907\u8FDE\u63A5\u4ECD\u5728\u540E\u53F0\u8FD0\u884C\uFF0C\u8BF7\u5148\u6267\u884C stop --url \u540E\u91CD\u65B0\u914D\u5BF9");await Ft(t,r),r.foreground?await kr(t):vr(n());return;case"run":case"foreground":r.url&&await Ft(t,r),await kr(t);return;case"start":if(r.url)return qs("connect",t,r);if(r.foreground){await kr(t);return}vr();return;case"reload":case"restart":{r.url&&await Ft(t,{url:r.url});let s=Ot(Fs(Bs),".."),i=Ot(s,...Fr(Ot(s,"src","index.js"))?["dist","package"]:[],"openclaw-plugin"),o=await un(t.targets,i);await vs({quiet:!0}),await o(),vr(r.url?n():void 0);return}case"stop":await vs();return;case"status":Tu();return;case"help":case"--help":case"-h":Iu();return;default:throw new Error(`Unknown command: ${e}`)}}async function kr(e){Su();let t=new fe(e);if(await t.start(),e.mode==="server"){let n=Ps(e,t);ks({bridge:t,server:n}),n.listen(e.port,e.host,()=>{_("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 r=new me(e,t);ks({bridge:t,client:r}),r.start(),_("info","runtime-bridge","Orcha runtime node started",{nodeId:e.nodeId,nodeName:e.nodeName,orchaUrl:e.orchaUrl,targets:Object.keys(t.targets)})}function ks({bridge:e,client:t,server:r}){let n=!1,s=i=>{if(n)return;n=!0;let o=Number(e?.sessions?.size||0)>0;_("info","runtime-bridge","runtime bridge shutting down",{signal:i});try{t?.stop?.()}catch(a){_("warn","runtime-bridge","runtime client stop failed",{error:String(a)})}Promise.resolve(e?.stop?.(`process_${String(i||"shutdown").toLowerCase()}`)).catch(a=>{_("warn","runtime-bridge","runtime bridge stop failed",{error:String(a)})}).finally(()=>{try{r?.close?.()}catch(a){_("warn","runtime-bridge","runtime server close failed",{error:String(a)})}}),setTimeout(()=>process.exit(0),o?8500:200)};process.once("SIGTERM",()=>s("SIGTERM")),process.once("SIGINT",()=>s("SIGINT"))}function vr(e=["run"]){let t=_e(),r=Gs(),n=ye(t);if(n&&ht(n)){console.log(JSON.stringify({status:"already_running",pid:n,pidFile:t,logFile:r}));return}n&&Hr(t),$s(t),$s(r),$r(r);let s=lu(r,"a"),i={...process.env,ORCHA_RUNTIME_PID_FILE:t,ORCHA_RUNTIME_LOG_FILE:r},o=au(process.execPath,[Bs,...e,"--pid-file",t,"--log-file",r],{cwd:process.cwd(),detached:!0,env:i,stdio:["ignore",s,s]});o.unref(),cu(s),Hs(t,`${o.pid}
33
+ `),console.log(JSON.stringify({status:"started",pid:o.pid,pidFile:t,logFile:r}))}async function vs({quiet:e=!1}={}){let t=_e(),r=ye(t);if(!r){e||console.log(JSON.stringify({status:"not_running",pidFile:t}));return}if(!ht(r)){Hr(t),e||console.log(JSON.stringify({status:"not_running",pid:r,pidFile:t}));return}process.kill(r,"SIGTERM"),!await Ds(r,1e4)&&ht(r)&&(process.kill(r,"SIGKILL"),await Ds(r,3e3)),Hr(t),e||console.log(JSON.stringify({status:"stopped",pid:r,pidFile:t}))}function Tu(){let e=_e(),t=Gs(),r=ye(e),n=!!(r&&ht(r));console.log(JSON.stringify({status:n?"running":"not_running",running:n,pid:n?r:null,pidFile:e,logFile:t}))}function wu(e){let t=[],r={};for(let s=0;s<e.length;s+=1){let i=e[s];i==="--url"?r.url=e[++s]:i==="--pair-code"?r.pairCode=e[++s]:i==="--daemon"?r.daemon=!0:i==="--foreground"?r.foreground=!0:i==="--env-file"?r.envFile=e[++s]:i==="--pid-file"?r.pidFile=e[++s]:i==="--log-file"?r.logFile=e[++s]:t.push(i)}return{command:t[0]||"run",options:r}}function Eu(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 _e(){return Ot(process.cwd(),process.env.ORCHA_RUNTIME_PID_FILE||fu)}function Gs(){return Ot(process.cwd(),process.env.ORCHA_RUNTIME_LOG_FILE||hu)}function Su(){let e=process.env.ORCHA_RUNTIME_LOG_FILE;if(!e)return;let t=Ks();if(t<=0)return;let r=Ot(process.cwd(),e);$r(r,t);let n=Ou();n<=0||setInterval(()=>$r(r,t),n).unref()}function $r(e,t=Ks()){if(t<=0||!Fr(e))return;let r=0,n="";try{if(r=Ls(e).size,r<=0)return;n=Dr(e,"utf8")}catch(l){_("warn","runtime-bridge","runtime log cleanup skipped",{logFile:e,error:String(l)});return}let s=Date.now()-t*24*60*60*1e3,i=n.split(/\r?\n/),o=[],a=0;for(let l of i)l&&(Ru(l,s)?o.push(l):a+=1);if(a===0)return;let c="";try{Ls(e).size>r&&(c=Dr(e,"utf8").slice(n.length));let p=[...o,...c.split(/\r?\n/).filter(Boolean)].join(`
32
34
  `);Hs(e,p?`${p}
33
- `:""),_("info","runtime-bridge","runtime log cleanup completed",{logFile:e,retentionDays:t,removed:a})}catch(l){_("warn","runtime-bridge","runtime log cleanup failed",{logFile:e,error:String(l)})}}function Ru(e,t){try{let r=JSON.parse(e);if(!r||typeof r!="object")return!0;let n=typeof r.ts=="string"?Date.parse(r.ts):Number.NaN;return!Number.isFinite(n)||n>=t}catch{return!0}}function Ks(){return zs(process.env.ORCHA_RUNTIME_LOG_RETENTION_DAYS,mu)}function Ou(){return zs(process.env.ORCHA_RUNTIME_LOG_CLEANUP_INTERVAL_MS,gu)}function zs(e,t){let r=Number.parseInt(String(e??""),10);return Number.isFinite(r)&&r>=0?r:t}function ye(e){if(!Br(e))return null;let t=Number.parseInt($r(e,"utf8").trim(),10);return Number.isInteger(t)&&t>0?t:null}function pt(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}async function Ds(e,t){let r=Date.now();for(;Date.now()-r<t;){if(!pt(e))return!0;await new Promise(n=>setTimeout(n,100))}return!pt(e)}function $s(e){uu(Fs(e),{recursive:!0})}function Fr(e){try{du(e,{force:!0})}catch{}}function Iu(){console.log(`Usage: orcha-runtime-bridge [command] [options]
35
+ `:""),_("info","runtime-bridge","runtime log cleanup completed",{logFile:e,retentionDays:t,removed:a})}catch(l){_("warn","runtime-bridge","runtime log cleanup failed",{logFile:e,error:String(l)})}}function Ru(e,t){try{let r=JSON.parse(e);if(!r||typeof r!="object")return!0;let n=typeof r.ts=="string"?Date.parse(r.ts):Number.NaN;return!Number.isFinite(n)||n>=t}catch{return!0}}function Ks(){return zs(process.env.ORCHA_RUNTIME_LOG_RETENTION_DAYS,mu)}function Ou(){return zs(process.env.ORCHA_RUNTIME_LOG_CLEANUP_INTERVAL_MS,gu)}function zs(e,t){let r=Number.parseInt(String(e??""),10);return Number.isFinite(r)&&r>=0?r:t}function ye(e){if(!Fr(e))return null;let t=Number.parseInt(Dr(e,"utf8").trim(),10);return Number.isInteger(t)&&t>0?t:null}function ht(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t?.code==="EPERM"}}async function Ds(e,t){let r=Date.now();for(;Date.now()-r<t;){if(!ht(e))return!0;await new Promise(n=>setTimeout(n,100))}return!ht(e)}function $s(e){uu(Fs(e),{recursive:!0})}function Hr(e){try{du(e,{force:!0})}catch{}}function Iu(){console.log(`Usage: orcha-runtime-bridge [command] [options]
34
36
 
35
37
  Commands:
36
38
  connect Pair or reconnect this device, then run in the background.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orcha-ai/openclaw-tools",
3
- "version": "0.1.55",
3
+ "version": "0.1.56",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "openclaw": { "extensions": ["./index.js"] }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orcha-ai/runtime-bridge",
3
- "version": "0.1.55",
3
+ "version": "0.1.56",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Local Orcha runtime bridge for ACP-compatible agent runtimes.",