openclaw-code-agent 4.7.11 → 4.7.13

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
@@ -128,15 +128,15 @@ Because worktree isolation defaults to `delegate`, `defaultWorkdir` should norma
128
128
 
129
129
  Chat-launched sessions route updates back to their originating chat thread. For agent-launched tool sessions without an origin route, configure `fallbackChannel` or `agentChannels` in the reference guide.
130
130
 
131
- The current package requires, is built against, and is validated against OpenClaw `2026.8.2`, while its plugin API, Gateway, and peer dependency contracts retain the verified `2026.8.1` compatibility floor. The manifest still declares `contracts.tools`, the plugin still imports only `openclaw/plugin-sdk/plugin-entry`, and its session store, wake routing, callbacks, worktree flows, and Codex/Claude model restrictions remain plugin-owned. OpenClaw's host-side migration of `codex/*` and `openai-codex/*` model routes to `openai/*` does not rewrite Code Agent's unprefixed Codex harness models (`gpt-5.6-sol`, `gpt-5.6-terra`, and `gpt-5.6-luna`) or bypass `harnesses.codex.allowedModels`. Existing sessions, permissions, Telegram/topic routes, automation delivery context, callback ownership, and tool allowlists remain under the same plugin contracts. OpenClaw `2026.8.2` broadens the default visibility of unsandboxed same-agent sessions, including retained cron sessions; operators who need narrower isolation can explicitly configure `tools.sessions.visibility` as `tree` or `self`. Installing this package performs no host-side configuration migration.
131
+ The current package requires, is built against, and is validated against OpenClaw `2026.9.1`, while its plugin API, Gateway, and peer dependency contracts retain the verified `2026.8.1` compatibility floor. The manifest still declares `contracts.tools`, the plugin still imports only `openclaw/plugin-sdk/plugin-entry`, and its session store, wake routing, callbacks, worktree flows, and Codex/Claude model restrictions remain plugin-owned. OpenClaw's host-side model catalog and activatable-harness checks do not rewrite Code Agent's unprefixed Codex harness models (`gpt-6-astra`, `gpt-5.6-sol`, `gpt-5.6-terra`, and `gpt-5.6-luna`), its Claude Code aliases (`sonnet` and `opus`), or either harness-scoped allowlist. Existing sessions, permissions, Telegram/topic routes, automation delivery context, callback ownership, and namespaced tool allowlists remain under the same plugin contracts. OpenClaw `2026.9.1` improves origin-channel approvals, callback acknowledgement, cron delivery recovery, managed worktrees, and Codex lifecycle behavior; these are host-side improvements and do not transfer ownership of Code Agent's routing or follow-through state. Installing this package performs no host-side configuration migration.
132
132
 
133
- If you use Codex, make sure the local `codex` command or `OPENCLAW_CODEX_APP_SERVER_COMMAND` override is available and authenticated. Codex-specific defaults live under `harnesses.codex`: `reasoningEffort` is sent as `reasoningEffort`, and `fastMode: true` sends `service_tier: "fast"` on Codex App Server thread, resume, and turn payloads. The Codex harness starts the app server with stdio listener args by default, only sends UUID-shaped backend thread IDs to `thread/resume`, and reports startup timeouts with redacted recent stderr. When Codex auth is inconsistent, this is the recommended `~/.codex/config.toml` setting:
133
+ If you use Codex, make sure the local `codex` command or `OPENCLAW_CODEX_APP_SERVER_COMMAND` override is available and authenticated. GPT-6 Astra is the default Codex model; GPT-5.6 Sol, Terra, and Luna remain supported explicit overrides. Codex-specific defaults live under `harnesses.codex`: `reasoningEffort` is sent as `reasoningEffort`, and `fastMode: true` sends `service_tier: "fast"` on Codex App Server thread, resume, and turn payloads. The Codex harness starts the app server with stdio listener args by default, only sends UUID-shaped backend thread IDs to `thread/resume`, and reports startup timeouts with redacted recent stderr. When Codex auth is inconsistent, this is the recommended `~/.codex/config.toml` setting:
134
134
 
135
135
  ```toml
136
136
  forced_login_method = "chatgpt"
137
137
  ```
138
138
 
139
- For Codex sessions authenticated with an OpenAI API key, the plugin estimates token charges from the App Server's per-response usage and shows the cumulative amount in session listings and `agent_stats`. ChatGPT OAuth/subscription sessions remain `$0` because they are quota-backed rather than pay-as-you-go API calls. The estimator covers the built-in GPT-5.6 Sol, Terra, and Luna models, including cached input, cache writes, Fast mode, and long-context rates; unknown models remain unpriced. Reasoning tokens are already included in App Server `outputTokens` and are not added a second time.
139
+ For Codex sessions authenticated with an OpenAI API key, the plugin estimates token charges from the App Server's per-response usage and shows the cumulative amount in session listings and `agent_stats`. ChatGPT OAuth/subscription sessions remain `$0` because they are quota-backed rather than pay-as-you-go API calls. The estimator covers the built-in GPT-6 Astra and GPT-5.6 Sol, Terra, and Luna models, including cached input, cache writes, Fast mode, and long-context rates; unknown models remain unpriced. Reasoning tokens are already included in App Server `outputTokens` and are not added a second time.
140
140
 
141
141
  If you use experimental OpenCode, make sure local `opencode >= 1.16.2` is available and configured with provider auth. The plugin starts `opencode serve` per session on localhost and uses OpenCode's classic session lifecycle routes while v2 session wait remains unavailable. Leave `harnesses.opencode.defaultModel` unset to let OpenCode choose its configured provider default, or pass an explicit `provider/model` string for a launch.
142
142
 
@@ -1,5 +1,5 @@
1
1
  var xt=Symbol("optionalSchema");function qe(e,t){return t?{...t,...e}:e}function Fr(e){return{...e,[xt]:!0}}function Wr(e){return{const:e,type:typeof e}}var J={Object(e,t){let n=Object.entries(e).filter(([,s])=>!s[xt]).map(([s])=>s),r=Object.fromEntries(Object.entries(e).map(([s,o])=>{let{[xt]:i,...d}=o;return[s,d]}));return{...t,type:"object",...n.length>0?{required:n}:{},properties:r}},String(e){return qe({type:"string"},e)},Number(e){return qe({type:"number"},e)},Boolean(e){return qe({type:"boolean"},e)},Array(e,t){return qe({type:"array",items:e},t)},Literal:Wr,Union(e,t){return qe({anyOf:e},t)},Optional:Fr};import{execFileSync as vt}from"child_process";import{existsSync as pi}from"fs";var oe=null,Ur=null,Dr=null;function Pi(e){oe=e}function Ri(e){Ur=e}function vi(e){Dr=e}import{execFileSync as U}from"child_process";import*as tt from"fs";import{tmpdir as as}from"os";import{dirname as yn,join as ds}from"path";import{readFileSync as ts}from"fs";import{homedir as ns}from"os";import{join as rs}from"path";var Hr=new Set(["telegram","discord","slack","system","mattermost","feishu","line","whatsapp","signal","matrix","googlechat","bluebubbles","imessage","msteams"]);function fn(e){let t=e.chatId.trim(),n=e.topicId.trim();return!/^-?\d+$/.test(t)||!/^\d+$/.test(n)?null:`${t}:topic:${n}`}function zr(e){let t=e.conversationId.trim(),n=t.match(/^(-?\d+):topic:(\d+)$/i);if(n?.[1]&&n[2]){let o=fn({chatId:n[1],topicId:n[2]});return o?{chatId:n[1],topicId:n[2],canonicalConversationId:o}:null}if(!/^\d+$/.test(t))return null;let r=e.parentConversationId?.trim();if(!r||!/^-?\d+$/.test(r))return null;let s=fn({chatId:r,topicId:t});return s?{chatId:r,topicId:t,canonicalConversationId:s}:null}function jr(e){if(!e)return;let t=e.match(/^agent:[^:]+:discord:(direct|dm|channel|group):/i);if(!t?.[1])return;let n=t[1].toLowerCase();return n==="direct"||n==="dm"?"user":"channel"}function Jr(e,t){if(!/^\d+$/.test(e))return e;let n=jr(t);return n?`${n}:${e}`:`channel:${e}`}function Qr(e){if(!(!e?.provider||!e.target)&&!(e.provider==="system"||e.target==="system"))return e.accountId?`${e.provider}|${e.accountId}|${e.target}`:`${e.provider}|${e.target}`}function Gr(e){let t=e.toLowerCase(),n=[":thread:",":topic:"];for(let r of n){let s=t.lastIndexOf(r);if(s===-1)continue;let o=e.slice(0,s).trim(),i=e.slice(s+r.length).trim()||void 0;return{id:o||e,threadId:i}}return{id:e}}function Kr(e){let t=e?.trim();if(!t)return;let n=t.split(":").filter(Boolean);if(n[0]?.trim().toLowerCase()==="agent")for(let r=2;r<=n.length-3;r+=1){let s=n[r]?.trim().toLowerCase();if(!s||!Hr.has(s))continue;let o=n[r+1]?.trim().toLowerCase(),i=n.slice(r+2).join(":").trim();if(!(!o||!i))return{provider:s,kind:o,rawId:i}}}function Zr(e,t=zr){try{return t({conversationId:e})}catch{return null}}var Vr={safeParseTelegramTopicConversation:Zr};function It(e){return{provider:"system",target:"system",sessionKey:e?.trim()||void 0}}function Ct(e,t){return{...e,threadId:t??e.threadId}}function Xr(e,t,n){return e==="telegram"&&n?.provider==="telegram"&&!!n.target&&t!==n.target}function Yr(e){let t=e?.trim();if(!t)return;let n=Kr(t);if(!n)return;let{provider:r,kind:s,rawId:o}=n,i=Gr(o),d=null;if(r==="telegram")try{d=Vr.safeParseTelegramTopicConversation(o)}catch{d=null}let a=d?.chatId??i.id,c=d?.topicId??i.threadId,l=r==="discord"?s==="direct"||s==="dm"?`user:${a}`:`channel:${a}`:a;return{provider:r,target:l,threadId:c,sessionKey:t}}function Tt(e){let t=e?.match(/:topic:(\d+)$/i);return t?parseInt(t[1],10):void 0}function mn(e){return!!(e?.provider&&e.target&&e.provider!=="system"&&e.target!=="system")}function _t(e,t,n){let r=Yr(n),s=t!=null?String(t):void 0,o=e?.trim();if(!o||o.toLowerCase()==="unknown")return r?Ct(r,s):It(n);let i=o.split("|").map(p=>p.trim());if(i.length<2)return r?Ct(r,s):It(n);let[d,a,c]=i,l=i.length>=3?c:a,m=i.length>=3?a:void 0,u=d?.toLowerCase();if(!u||!l)return r?Ct(r,s):It(n);let b=u==="discord"?Jr(l,n):l;return Xr(u,b,r)?{provider:u,accountId:m,target:r.target,threadId:s??r.threadId,sessionKey:n?.trim()||void 0}:{provider:u,accountId:m,target:b,threadId:s??(r?.provider===u?r.threadId:void 0),sessionKey:n?.trim()||void 0}}function gn(e){return _t(Qr(e.route)??e.originChannel,e.route?.threadId??e.originThreadId,e.route?.sessionKey??e.originSessionKey)??e.route}function xi(e){let t=gn(e);return mn(t)?t:void 0}function es(e){return Object.fromEntries(Object.entries(e).filter(t=>!!t[1]))}function Ii(e){let t=gn(e);if(!mn(t))return"";let n=es({provider:t?.provider,accountId:t?.accountId,target:t?.target,threadId:t?.threadId??(e.originThreadId!=null?String(e.originThreadId):void 0),sessionKey:t?.sessionKey??e.originSessionKey});return Object.keys(n).length===0?"":["Session origin route (authoritative for human follow-ups):",`originRoute: ${JSON.stringify(n)}`,"Routing rule: Send any human follow-up for this wake to originRoute. If originRoute differs from the current chat, do not use a plain final assistant reply; use a routed send path that preserves provider/target/threadId."].join(`
2
- `)}var Le,hn="claude-code",Fe={"claude-code":{defaultModel:"anthropic/claude-sonnet-4-7",allowedModels:["sonnet","opus"]},codex:{defaultModel:"gpt-5.6-sol",allowedModels:["gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna"],reasoningEffort:"medium"},opencode:{}};function Ei(){if(Le!==void 0)return Le;try{let e=ts(rs(ns(),".claude.json"),"utf-8");Le=JSON.parse(e).mcpServers??{}}catch{Le={}}return Le}var Y={maxSessions:20,idleTimeoutMinutes:15,sessionGcAgeMinutes:1440,maxPersistedSessions:1e4,maxAutoResponds:10,permissionMode:"plan",planApproval:"delegate",defaultWorktreeStrategy:"delegate",harnesses:{"claude-code":{...Fe["claude-code"]},codex:{...Fe.codex},opencode:{...Fe.opencode}}};function $i(e){let t=e.defaultHarness??hn,n={};for(let[r,s]of Object.entries(Fe)){let o={...s};s.allowedModels&&(o.allowedModels=[...s.allowedModels]),n[r]=o}for(let[r,s]of Object.entries(e.harnesses??{})){let o=n[r]??{},i={...o,defaultModel:s.defaultModel??o.defaultModel,reasoningEffort:s.reasoningEffort??o.reasoningEffort,fastMode:s.fastMode??o.fastMode};s.allowedModels!==void 0?i.allowedModels=s.allowedModels?[...s.allowedModels]:s.allowedModels:s.defaultModel!==void 0&&(i.allowedModels=void 0),n[r]=i}if(e.defaultModel!==void 0){let r=n[t]??{};n[t]={...r,defaultModel:e.harnesses?.[t]?.defaultModel??e.defaultModel,allowedModels:e.harnesses?.[t]?.allowedModels!==void 0?r.allowedModels:e.allowedModels},`${t}`}if(e.model!==void 0){let r=n.codex??{};n.codex={...r,defaultModel:e.harnesses?.codex?.defaultModel??e.model,allowedModels:e.harnesses?.codex?.allowedModels!==void 0?r.allowedModels:e.allowedModels}}if(e.reasoningEffort!==void 0){let r=n.codex??{};n.codex={...r,reasoningEffort:e.harnesses?.codex?.reasoningEffort??e.reasoningEffort}}if(e.allowedModels!==void 0)for(let[r,s]of Object.entries(n))e.harnesses?.[r]?.allowedModels===void 0&&(n[r]={...s,allowedModels:void 0});Y={maxSessions:e.maxSessions??20,defaultWorkdir:e.defaultWorkdir,idleTimeoutMinutes:e.idleTimeoutMinutes??15,sessionGcAgeMinutes:e.sessionGcAgeMinutes??1440,maxPersistedSessions:e.maxPersistedSessions??1e4,fallbackChannel:e.fallbackChannel,agentChannels:e.agentChannels,maxAutoResponds:e.maxAutoResponds??10,permissionMode:e.permissionMode??"plan",planApproval:e.planApproval??"delegate",defaultHarness:t,harnesses:n,allowedModels:e.allowedModels,defaultWorktreeStrategy:e.defaultWorktreeStrategy??"delegate",worktreeDir:e.worktreeDir}}function Xe(){return Y.defaultHarness??hn}function Et(e){let t=Fe[e],n=Y.harnesses[e];return{...t,...n,allowedModels:n?.allowedModels??t?.allowedModels}}function Oi(e){return Et(e).defaultModel}function Bi(e){return Y.harnesses[e]?.allowedModels??Y.allowedModels}function Ni(e){return Et(e).reasoningEffort}function qi(e){return e==="codex"?Et(e).fastMode:void 0}function X(e){return e==null?void 0:String(e).trim()||void 0}function $t(e){return{channel:X(e?.deliveryContext?.channel),to:X(e?.deliveryContext?.to),accountId:X(e?.deliveryContext?.accountId),threadId:X(e?.deliveryContext?.threadId)}}function wn(e,t,n){if(!(!e||!t))return n?`${e}|${n}|${t}`:`${e}|${t}`}function Mt(e){return X(e?.requesterSenderId??e?.senderId)}function At(e){return(X(e.deliveryContext?.channel)??e.messageChannel??e.channel)?.toLowerCase()!=="telegram"?!1:!!(Tt(e.sessionKey)||X(e.messageThreadId)||X(e.deliveryContext?.threadId))}function Li(e){let t=$t(e),n=wn(t.channel,t.to,t.accountId);if(n)return n;if(e.messageChannel){let r=e.messageChannel.split("|");if(r.length>=3)return e.messageChannel;if(e.agentAccountId&&r.length>=2)return`${r[0]}|${e.agentAccountId}|${r.slice(1).join("|")}`;let s=X(e.chatId);if(r.length===1&&s)return`${r[0]}|${s}`;let o=Mt(e);if(r.length===1&&o&&!At(e))return`${r[0]}|${o}`}if(e.workspaceDir){let r=is(e.workspaceDir);if(r)return r}if(e.messageChannel&&e.messageChannel.includes("|"))return e.messageChannel}function ss(e,t){if(t&&String(t).includes("|"))return String(t);let n=$t(e),r=wn(n.channel,n.to,n.accountId);if(r)return r;if(e?.channelId&&String(e.channelId).includes("|"))return String(e.channelId);if(e?.messageChannel){let d=String(e.messageChannel);if(d.includes("|"))return d;let a=X(e.chatId);if(a)return`${d}|${a}`;let c=Mt(e);if(c&&!At(e))return`${d}|${c}`}let s=X(e?.channel),o=X(e?.chatId);if(s&&o)return`${s}|${o}`;let i=Mt(e);return s&&i&&!At(e)?`${s}|${i}`:e?.id&&/^-?\d+$/.test(String(e.id))?`telegram|${e.id}`:Y.fallbackChannel??"unknown"}function os(e){return $t(e).threadId??e?.messageThreadId??void 0}function Fi(e,t,n){return _t(ss(e,t),os(e),n??e?.sessionKey)}function is(e){let t=Y.agentChannels;if(!t)return;let n=o=>{let i=o.length;for(;i>0&&o[i-1]==="/";)i-=1;return o.slice(0,i)},r=n(e),s=Object.entries(t).sort((o,i)=>i[0].length-o[0].length);for(let[o,i]of s)if(r===n(o)||r.startsWith(n(o)+"/"))return i}function Wi(e){return Tt(e)}var Ye,et;function us(e){try{return U("git",["rev-parse","--show-toplevel"],{cwd:e,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{return}}function nt(e){if(process.env.OPENCLAW_WORKTREE_DIR)return process.env.OPENCLAW_WORKTREE_DIR;if(Y.worktreeDir)return Y.worktreeDir;if(e){let t=us(e);if(t)return ds(t,".worktrees")}return as()}function bn(e){return e.replace(/[^a-zA-Z0-9._-]/g,"-").replace(/\.{2,}/g,"-").replace(/^[-.]|[-.]$/g,"").slice(0,100).replace(/[-.]+$/,"")||"session"}function Ji(e){try{let t=U("git",["-C",e,"rev-parse","--git-common-dir"],{cwd:e,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return t&&t.endsWith("/.git")?yn(t):void 0}catch{return}}function cs(){if(Ye!==void 0)return Ye;try{return U("git",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),Ye=!0,!0}catch{return Ye=!1,!1}}function ee(){if(et!==void 0)return et;try{return U("gh",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),et=!0,!0}catch{return et=!1,!1}}function Qi(e){if(!cs())return!1;try{return U("git",["rev-parse","--git-dir"],{cwd:e,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function Gi(e){try{let t=ps(e);if(!t)return`${nt(e)}`,!0;let n=tt.statfsSync(t),r=n.bavail*n.bsize;return fs(r)}catch(t){return`${t instanceof Error?t.message:String(t)}`,!0}}function be(e,t){try{return U("git",["-C",e,"rev-parse","--verify",t],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function kn(e,t,n="origin"){let r=`refs/remotes/${n}/${t}`;try{return U("git",["-C",e,"fetch",n,`+${t}:${r}`],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),U("git",["-C",e,"rev-parse","--verify",r],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),r}catch{return}}function ls(e){let t=e;for(;;){if(tt.existsSync(t))return t;let n=yn(t);if(n===t)return;t=n}}function ps(e){return ls(nt(e))}function fs(e){return e>=104857600}function rt(e){let t=process.env.OPENCLAW_WORKTREE_BASE_BRANCH?.trim();if(t)return t;try{let r=U("git",["-C",e,"rev-parse","--abbrev-ref","origin/HEAD"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().replace(/^origin\//,"");if(r)return r}catch{}try{return U("git",["-C",e,"rev-parse","--verify","main"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"main"}catch{}try{return U("git",["-C",e,"rev-parse","--verify","master"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"master"}catch{return"main"}}function ke(e){try{let n=U("git",["-C",e,"rev-parse","--abbrev-ref","HEAD"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(n==="HEAD"){`${e}`;return}return n||void 0}catch{return}}function Ki(e,t,n){try{let r=U("git",["-C",e,"rev-list","--count",`${n}..${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),s=parseInt(r.trim(),10);return Number.isFinite(s)?s:void 0}catch{return}}function Pn(e,t,n){try{let r=U("git",["-C",e,"rev-list","--left-right","--count",`${t}...${n}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),[s,o]=r.split(/\s+/);return{ahead:parseInt(s??"0",10)||0,behind:parseInt(o??"0",10)||0}}catch{return}}function te(e,t,n){try{return U("git",["-C",e,"merge-base","--is-ancestor",t,n],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function Rn(e,t,n){try{let r=U("git",["-C",e,"merge-tree","--write-tree",n,t],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),s=U("git",["-C",e,"rev-parse",`${n}^{tree}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return!!r&&r===s}catch{return!1}}function Zi(e,t){try{return U("git",["-C",e,"branch","-D",t],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(n){return`${t}${n instanceof Error?n.message:String(n)}`,!1}}function vn(e,t){if(t)return t;let n;try{n=U("git",["-C",e,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{}try{let r=U("git",["-C",e,"remote","get-url","upstream"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(r&&r!==n){let s=r.match(/[:/]([^/]+\/[^/]+?)(?:\.git)?$/);if(s)return s[1]}}catch{}}import{execFileSync as Ce}from"child_process";import{randomBytes as ms}from"crypto";import{appendFileSync as gs,existsSync as Bt,mkdirSync as Sn,readFileSync as hs,rmSync as Ot}from"fs";import{relative as ws,sep as xn}from"path";function ys(e,t){return!!(e&&typeof e=="object"&&"code"in e&&e.code===t)}function bs(e){try{return Ce("git",["-C",e,"rev-parse","--show-toplevel"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{return}}function ks(e){return e===0?"":`-${e}-${ms(8).toString("hex")}`}function Ps(e,t){let n=bs(e);if(!n)return;let r=ws(n,t);if(!r||r.startsWith("..")||r.includes(`..${xn}`))return;let s=`${n}/.git/info/exclude`,o=`${r.split(xn).join("/").replace(/\/$/,"")}/`;try{let i=Bt(s)?hs(s,"utf-8"):"";i.split(/\r?\n/).map(a=>a.trim()).some(a=>a===o||a===`/${o}`)||gs(s,`${i.endsWith(`
2
+ `)}var Le,hn="claude-code",Fe={"claude-code":{defaultModel:"anthropic/claude-sonnet-4-7",allowedModels:["sonnet","opus"]},codex:{defaultModel:"gpt-6-astra",allowedModels:["gpt-6-astra","gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna"],reasoningEffort:"medium"},opencode:{}};function Ei(){if(Le!==void 0)return Le;try{let e=ts(rs(ns(),".claude.json"),"utf-8");Le=JSON.parse(e).mcpServers??{}}catch{Le={}}return Le}var Y={maxSessions:20,idleTimeoutMinutes:15,sessionGcAgeMinutes:1440,maxPersistedSessions:1e4,maxAutoResponds:10,permissionMode:"plan",planApproval:"delegate",defaultWorktreeStrategy:"delegate",harnesses:{"claude-code":{...Fe["claude-code"]},codex:{...Fe.codex},opencode:{...Fe.opencode}}};function $i(e){let t=e.defaultHarness??hn,n={};for(let[r,s]of Object.entries(Fe)){let o={...s};s.allowedModels&&(o.allowedModels=[...s.allowedModels]),n[r]=o}for(let[r,s]of Object.entries(e.harnesses??{})){let o=n[r]??{},i={...o,defaultModel:s.defaultModel??o.defaultModel,reasoningEffort:s.reasoningEffort??o.reasoningEffort,fastMode:s.fastMode??o.fastMode};s.allowedModels!==void 0?i.allowedModels=s.allowedModels?[...s.allowedModels]:s.allowedModels:s.defaultModel!==void 0&&(i.allowedModels=void 0),n[r]=i}if(e.defaultModel!==void 0){let r=n[t]??{};n[t]={...r,defaultModel:e.harnesses?.[t]?.defaultModel??e.defaultModel,allowedModels:e.harnesses?.[t]?.allowedModels!==void 0?r.allowedModels:e.allowedModels},`${t}`}if(e.model!==void 0){let r=n.codex??{};n.codex={...r,defaultModel:e.harnesses?.codex?.defaultModel??e.model,allowedModels:e.harnesses?.codex?.allowedModels!==void 0?r.allowedModels:e.allowedModels}}if(e.reasoningEffort!==void 0){let r=n.codex??{};n.codex={...r,reasoningEffort:e.harnesses?.codex?.reasoningEffort??e.reasoningEffort}}if(e.allowedModels!==void 0)for(let[r,s]of Object.entries(n))e.harnesses?.[r]?.allowedModels===void 0&&(n[r]={...s,allowedModels:void 0});Y={maxSessions:e.maxSessions??20,defaultWorkdir:e.defaultWorkdir,idleTimeoutMinutes:e.idleTimeoutMinutes??15,sessionGcAgeMinutes:e.sessionGcAgeMinutes??1440,maxPersistedSessions:e.maxPersistedSessions??1e4,fallbackChannel:e.fallbackChannel,agentChannels:e.agentChannels,maxAutoResponds:e.maxAutoResponds??10,permissionMode:e.permissionMode??"plan",planApproval:e.planApproval??"delegate",defaultHarness:t,harnesses:n,allowedModels:e.allowedModels,defaultWorktreeStrategy:e.defaultWorktreeStrategy??"delegate",worktreeDir:e.worktreeDir}}function Xe(){return Y.defaultHarness??hn}function Et(e){let t=Fe[e],n=Y.harnesses[e];return{...t,...n,allowedModels:n?.allowedModels??t?.allowedModels}}function Oi(e){return Et(e).defaultModel}function Bi(e){return Y.harnesses[e]?.allowedModels??Y.allowedModels}function Ni(e){return Et(e).reasoningEffort}function qi(e){return e==="codex"?Et(e).fastMode:void 0}function X(e){return e==null?void 0:String(e).trim()||void 0}function $t(e){return{channel:X(e?.deliveryContext?.channel),to:X(e?.deliveryContext?.to),accountId:X(e?.deliveryContext?.accountId),threadId:X(e?.deliveryContext?.threadId)}}function wn(e,t,n){if(!(!e||!t))return n?`${e}|${n}|${t}`:`${e}|${t}`}function Mt(e){return X(e?.requesterSenderId??e?.senderId)}function At(e){return(X(e.deliveryContext?.channel)??e.messageChannel??e.channel)?.toLowerCase()!=="telegram"?!1:!!(Tt(e.sessionKey)||X(e.messageThreadId)||X(e.deliveryContext?.threadId))}function Li(e){let t=$t(e),n=wn(t.channel,t.to,t.accountId);if(n)return n;if(e.messageChannel){let r=e.messageChannel.split("|");if(r.length>=3)return e.messageChannel;if(e.agentAccountId&&r.length>=2)return`${r[0]}|${e.agentAccountId}|${r.slice(1).join("|")}`;let s=X(e.chatId);if(r.length===1&&s)return`${r[0]}|${s}`;let o=Mt(e);if(r.length===1&&o&&!At(e))return`${r[0]}|${o}`}if(e.workspaceDir){let r=is(e.workspaceDir);if(r)return r}if(e.messageChannel&&e.messageChannel.includes("|"))return e.messageChannel}function ss(e,t){if(t&&String(t).includes("|"))return String(t);let n=$t(e),r=wn(n.channel,n.to,n.accountId);if(r)return r;if(e?.channelId&&String(e.channelId).includes("|"))return String(e.channelId);if(e?.messageChannel){let d=String(e.messageChannel);if(d.includes("|"))return d;let a=X(e.chatId);if(a)return`${d}|${a}`;let c=Mt(e);if(c&&!At(e))return`${d}|${c}`}let s=X(e?.channel),o=X(e?.chatId);if(s&&o)return`${s}|${o}`;let i=Mt(e);return s&&i&&!At(e)?`${s}|${i}`:e?.id&&/^-?\d+$/.test(String(e.id))?`telegram|${e.id}`:Y.fallbackChannel??"unknown"}function os(e){return $t(e).threadId??e?.messageThreadId??void 0}function Fi(e,t,n){return _t(ss(e,t),os(e),n??e?.sessionKey)}function is(e){let t=Y.agentChannels;if(!t)return;let n=o=>{let i=o.length;for(;i>0&&o[i-1]==="/";)i-=1;return o.slice(0,i)},r=n(e),s=Object.entries(t).sort((o,i)=>i[0].length-o[0].length);for(let[o,i]of s)if(r===n(o)||r.startsWith(n(o)+"/"))return i}function Wi(e){return Tt(e)}var Ye,et;function us(e){try{return U("git",["rev-parse","--show-toplevel"],{cwd:e,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{return}}function nt(e){if(process.env.OPENCLAW_WORKTREE_DIR)return process.env.OPENCLAW_WORKTREE_DIR;if(Y.worktreeDir)return Y.worktreeDir;if(e){let t=us(e);if(t)return ds(t,".worktrees")}return as()}function bn(e){return e.replace(/[^a-zA-Z0-9._-]/g,"-").replace(/\.{2,}/g,"-").replace(/^[-.]|[-.]$/g,"").slice(0,100).replace(/[-.]+$/,"")||"session"}function Ji(e){try{let t=U("git",["-C",e,"rev-parse","--git-common-dir"],{cwd:e,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return t&&t.endsWith("/.git")?yn(t):void 0}catch{return}}function cs(){if(Ye!==void 0)return Ye;try{return U("git",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),Ye=!0,!0}catch{return Ye=!1,!1}}function ee(){if(et!==void 0)return et;try{return U("gh",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),et=!0,!0}catch{return et=!1,!1}}function Qi(e){if(!cs())return!1;try{return U("git",["rev-parse","--git-dir"],{cwd:e,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function Gi(e){try{let t=ps(e);if(!t)return`${nt(e)}`,!0;let n=tt.statfsSync(t),r=n.bavail*n.bsize;return fs(r)}catch(t){return`${t instanceof Error?t.message:String(t)}`,!0}}function be(e,t){try{return U("git",["-C",e,"rev-parse","--verify",t],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function kn(e,t,n="origin"){let r=`refs/remotes/${n}/${t}`;try{return U("git",["-C",e,"fetch",n,`+${t}:${r}`],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),U("git",["-C",e,"rev-parse","--verify",r],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),r}catch{return}}function ls(e){let t=e;for(;;){if(tt.existsSync(t))return t;let n=yn(t);if(n===t)return;t=n}}function ps(e){return ls(nt(e))}function fs(e){return e>=104857600}function rt(e){let t=process.env.OPENCLAW_WORKTREE_BASE_BRANCH?.trim();if(t)return t;try{let r=U("git",["-C",e,"rev-parse","--abbrev-ref","origin/HEAD"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().replace(/^origin\//,"");if(r)return r}catch{}try{return U("git",["-C",e,"rev-parse","--verify","main"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"main"}catch{}try{return U("git",["-C",e,"rev-parse","--verify","master"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"master"}catch{return"main"}}function ke(e){try{let n=U("git",["-C",e,"rev-parse","--abbrev-ref","HEAD"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(n==="HEAD"){`${e}`;return}return n||void 0}catch{return}}function Ki(e,t,n){try{let r=U("git",["-C",e,"rev-list","--count",`${n}..${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),s=parseInt(r.trim(),10);return Number.isFinite(s)?s:void 0}catch{return}}function Pn(e,t,n){try{let r=U("git",["-C",e,"rev-list","--left-right","--count",`${t}...${n}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),[s,o]=r.split(/\s+/);return{ahead:parseInt(s??"0",10)||0,behind:parseInt(o??"0",10)||0}}catch{return}}function te(e,t,n){try{return U("git",["-C",e,"merge-base","--is-ancestor",t,n],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function Rn(e,t,n){try{let r=U("git",["-C",e,"merge-tree","--write-tree",n,t],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),s=U("git",["-C",e,"rev-parse",`${n}^{tree}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return!!r&&r===s}catch{return!1}}function Zi(e,t){try{return U("git",["-C",e,"branch","-D",t],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(n){return`${t}${n instanceof Error?n.message:String(n)}`,!1}}function vn(e,t){if(t)return t;let n;try{n=U("git",["-C",e,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{}try{let r=U("git",["-C",e,"remote","get-url","upstream"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(r&&r!==n){let s=r.match(/[:/]([^/]+\/[^/]+?)(?:\.git)?$/);if(s)return s[1]}}catch{}}import{execFileSync as Ce}from"child_process";import{randomBytes as ms}from"crypto";import{appendFileSync as gs,existsSync as Bt,mkdirSync as Sn,readFileSync as hs,rmSync as Ot}from"fs";import{relative as ws,sep as xn}from"path";function ys(e,t){return!!(e&&typeof e=="object"&&"code"in e&&e.code===t)}function bs(e){try{return Ce("git",["-C",e,"rev-parse","--show-toplevel"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{return}}function ks(e){return e===0?"":`-${e}-${ms(8).toString("hex")}`}function Ps(e,t){let n=bs(e);if(!n)return;let r=ws(n,t);if(!r||r.startsWith("..")||r.includes(`..${xn}`))return;let s=`${n}/.git/info/exclude`,o=`${r.split(xn).join("/").replace(/\/$/,"")}/`;try{let i=Bt(s)?hs(s,"utf-8"):"";i.split(/\r?\n/).map(a=>a.trim()).some(a=>a===o||a===`/${o}`)||gs(s,`${i.endsWith(`
3
3
  `)||i.length===0?"":`
4
4
  `}${o}
5
5
  `,"utf-8")}catch(i){`${o}${s}${i instanceof Error?i.message:String(i)}`}}function ra(e,t,n={}){let r=bn(t),s=nt(e);Ps(e,s),Sn(s,{recursive:!0});let o=n.allowExistingBranch===!0,i,d,a=10,c=!1;for(let m=0;m<a;m++){let u=ks(m),b=`${s}/openclaw-worktree-${r}${u}`,p=`agent/${r}${u}`;if(!o&&be(e,p))continue;let h=!1;do{h=!1;try{Sn(b,{recursive:!1}),i=b,d=p;break}catch(P){if(ys(P,"EEXIST")){if(o&&m===0&&!c)try{Ot(b,{recursive:!0,force:!0}),c=!0,h=!0}catch(f){throw new Error(`Failed to recreate existing worktree branch ${p}: could not clear blocked path ${b}: ${f instanceof Error?f.message:String(f)}`)}else if(o&&m===0)throw new Error(`Failed to recreate existing worktree branch ${p}: path ${b} remains blocked after one cleanup attempt`);continue}throw P}}while(h);if(i&&d)break}if(!i||!d)throw new Error(`Failed to create unique worktree directory and branch after ${a} attempts`);let l=be(e,d);try{l?Ce("git",["-C",e,"worktree","add",i,d],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}):Ce("git",["-C",e,"worktree","add","-b",d,i],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(m){try{Ot(i,{recursive:!0,force:!0})}catch{}throw m}return i}function In(e){if(!Bt(e))return[];try{let t=Ce("git",["-C",e,"status","--porcelain","--untracked-files=all"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return t?t.split(`
@@ -21,7 +21,7 @@ ${n.map(r=>`⚠️ ${r}`).join(`
21
21
  `)}function Me(e){return{type:"backend_ref",ref:e}}function Ae(e){return{type:"run_started",...e?{runId:e}:{}}}function ve(e){return{type:"text_delta",text:e}}function lt(e,t){return{type:"tool_call",name:e,input:t}}function re(e){return{type:"pending_input",state:e}}function he(e){return e?{type:"pending_input_resolved",requestId:e}:{type:"pending_input_resolved"}}function pt(e,t){return{type:"plan_artifact",artifact:e,finalized:t}}function Ee(e){return e?{type:"settings_changed",permissionMode:e}:{type:"settings_changed"}}function de(e){return{type:"run_completed",data:e}}var ge=class{queue=[];resolvePending=null;done=!1;enqueue(t){this.queue.push(t),this.flush()}close(){this.done=!0,this.flush()}flush(){this.resolvePending&&(this.resolvePending(),this.resolvePending=null)}messages(){let t=this;return(async function*(){for(;;){for(;t.queue.length>0;)yield t.queue.shift();if(t.done)return;await new Promise(n=>{t.resolvePending=n})}})()}};function Fs(e){if(typeof e.result=="string"&&e.result.length>0)return e.result;if(Array.isArray(e.errors)){let t=e.errors.filter(n=>typeof n=="string"&&n.length>0);if(t.length>0)return t.join(`
22
22
  `)}}function Ws(e,t,n){let r=_e(n),s=r.length>0?0:void 0,o=s!=null?r[s]:void 0,i=o?.options.map(a=>a.label)??[],d=o?ae(o,s,r.length):ct(r);return{requestId:`${e||"claude"}-ask-${t}`,kind:"question",promptText:d,options:i,...r.length>0?{questions:r}:{},...s!=null?{activeQuestionIndex:s}:{},allowsFreeText:o?.allowsFreeText===!0||i.length===0}}var ft=class{constructor(t={}){this.deps=t}deps;name="claude-code";backendKind="claude-code";supportedPermissionModes=["default","plan","bypassPermissions"];capabilities={nativePendingInput:!1,nativePlanArtifacts:!1,worktrees:"plugin-managed"};launch(t){let n=new ge,r=!1,s="",o=!1,i=0,d=t.resumeSessionId??"",a=t.canUseTool,c={cwd:t.cwd,model:t.model,...t.reasoningEffort?{effort:t.reasoningEffort}:{},permissionMode:t.permissionMode,allowDangerouslySkipPermissions:!0,allowedTools:t.allowedTools,systemPrompt:t.systemPrompt,includePartialMessages:!0,abortController:t.abortController,mcpServers:t.mcpServers,...a?{canUseTool:async(p,h)=>{if(p!=="AskUserQuestion")return{behavior:"allow"};let P=Ws(d,++i,h);n.enqueue(re(P));try{let f=await a(p,h);return n.enqueue(he(P.requestId)),f}catch(f){throw n.enqueue(he(P.requestId)),f}}}:{}};t.resumeSessionId&&(c.resume=t.resumeSessionId,c.forkSession=t.forkSession??!1);let l=t.prompt,m=this.deps.query??mt.query,u=this.deps.startup??mt.startup,b=(async()=>{if(typeof u!="function")return m({prompt:l,options:c});let p=await u({options:c});try{return p.query(l)}catch(h){throw await p.close?.(),h}})();return(async()=>{try{let p=await b;for await(let h of p){let P=h;if(P.type==="system"&&P.subtype==="init"){d=P.session_id??d,n.enqueue(Me({kind:"claude-code",conversationId:d}));continue}if(P.type==="system"&&P.subtype==="status"&&P.permissionMode){n.enqueue(Ee(P.permissionMode));continue}if(P.type==="assistant"){r||(r=!0,n.enqueue(Ae()));for(let f of P.message?.content??[]){if(f.type==="text"){s+=s?`
23
23
  ${f.text}`:f.text,n.enqueue(ve(f.text));continue}f.type==="tool_use"&&((f.name==="ExitPlanMode"||f.name==="set_permission_mode")&&(o=!0),f.name!=="AskUserQuestion"&&n.enqueue(lt(f.name,f.input)))}continue}if(P.type==="result"){let f=s.trim();if(f&&(t.permissionMode==="plan"||o)){let I={explanation:void 0,steps:[],markdown:f};n.enqueue(pt(I,!0))}n.enqueue(de({success:P.subtype==="success",duration_ms:P.duration_ms??0,total_cost_usd:P.total_cost_usd??0,num_turns:P.num_turns??0,result:Fs(P),session_id:P.session_id??d})),s="",o=!1,r=!1}}}finally{n.close()}})().catch(p=>{n.enqueue(de({success:!1,duration_ms:0,total_cost_usd:0,num_turns:0,result:p instanceof Error?p.message:String(p),session_id:d})),n.close()}),{messages:n.messages(),async setPermissionMode(p){let h=await b;typeof h.setPermissionMode=="function"&&await h.setPermissionMode(p)},async streamInput(p){let h=await b;typeof h.streamInput=="function"&&await h.streamInput(p)},async interrupt(){let p=await b;typeof p.interrupt=="function"&&await p.interrupt()}}}buildUserMessage(t,n){return{type:"user",message:{role:"user",content:t},parent_tool_use_id:null,session_id:n}}};import{spawn as Us}from"node:child_process";import Ds from"node:readline";function nr(e){return e instanceof Error?e.message:String(e)}function Se(e,t){JSON.stringify({component:"CodexAppServerRpc",event:e,at:new Date().toISOString(),...t})}function Hs(e,t){return{commandKind:e==="codex"?"codex":"custom",appServerSubcommand:!0,configuredArgCount:t.length}}function zs(e){try{let t=JSON.parse(e);return!t||typeof t!="object"||Array.isArray(t)?null:t}catch{return null}}async function js(e,t){if(e.id!=null&&(Object.hasOwn(e,"result")||Object.hasOwn(e,"error"))){let r=String(e.id),s=t.pending.get(r);if(!s)return;if(clearTimeout(s.timer),t.pending.delete(r),e.error){s.reject(new Error(`codex app server rpc error (${e.error.code??"unknown"}): ${e.error.message??"unknown error"}`));return}s.resolve(e.result);return}let n=e.method?.trim();if(n){if(e.id==null){await t.onNotification(n,e.params);return}try{let r=await t.onRequest(n,e.params);t.respond({jsonrpc:"2.0",id:e.id,result:r??{}})}catch(r){t.respond({jsonrpc:"2.0",id:e.id,error:{code:-32603,message:nr(r)}})}}}var gt=class{constructor(t,n,r,s=1e3){this.command=t;this.args=n;this.requestTimeoutMs=r;this.shutdownGraceMs=s}command;args;requestTimeoutMs;shutdownGraceMs;process=null;pending=new Map;stderrTail="";counter=0;onNotification=()=>{};onRequest=async()=>({});setNotificationHandler(t){this.onNotification=t}setRequestHandler(t){this.onRequest=t}async connect(){if(this.process)return;let t=Us(this.command,["app-server",...this.args],{stdio:["pipe","pipe","pipe"],env:process.env});if(Se("process.spawn",{...Hs(this.command,this.args),pid:t.pid,requestTimeoutMs:this.requestTimeoutMs}),!t.stdin||!t.stdout||!t.stderr)throw new Error("codex app server stdio pipes unavailable");this.process=t,Ds.createInterface({input:t.stdout}).on("line",r=>{this.handleLine(r)}),t.stderr.on("data",r=>{this.stderrTail=`${this.stderrTail}${r.toString("utf8")}`.slice(-4e3)}),t.on("error",r=>{Se("process.error",{pid:t.pid,error:nr(r)})}),t.on("close",(r,s)=>{Se("process.close",{pid:t.pid,code:r,signal:s,pendingRequests:this.pending.size,recentStderr:Kt(this.stderrTail.trim())}),this.flushPending(new Error("codex app server stdio closed")),this.process=null})}async close(){Se("client.close",{pid:this.process?.pid,pendingRequests:this.pending.size}),this.flushPending(new Error("codex app server stdio closed"));let t=this.process;this.process=null,t&&(t.exitCode!==null||t.signalCode!==null||await new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(o),n())};t.once("close",s);let o=setTimeout(()=>{t.exitCode===null&&t.signalCode===null&&(Se("process.force_kill",{pid:t.pid}),t.kill("SIGKILL"))},Math.max(1,this.shutdownGraceMs));o.unref?.(),t.kill("SIGTERM")}))}async notify(t,n){this.write({jsonrpc:"2.0",method:t,params:n??{}})}async request(t,n,r){let s=`rpc-${++this.counter}`,o=new Promise((i,d)=>{let a=Math.max(100,r??this.requestTimeoutMs),c=setTimeout(()=>{this.pending.delete(s),Se("request.timeout",{id:s,method:t,timeoutMs:a,pid:this.process?.pid,recentStderr:Kt(this.stderrTail.trim())}),d(new Error(this.buildTimeoutErrorMessage(t,a)))},a);c.unref?.(),this.pending.set(s,{resolve:i,reject:d,timer:c})});return this.write({jsonrpc:"2.0",id:s,method:t,params:n??{}}),await o}write(t){if(!this.process?.stdin)throw new Error("codex app server stdio not connected");this.process.stdin.write(`${JSON.stringify(t)}
24
- `)}async handleLine(t){let n=zs(t);n&&await js(n,{pending:this.pending,onNotification:this.onNotification,onRequest:this.onRequest,respond:r=>this.write(r)})}flushPending(t){this.pending.size>0&&Se("pending.flush",{pendingRequests:this.pending.size,error:t.message,pid:this.process?.pid});for(let[n,r]of this.pending)clearTimeout(r.timer),r.reject(t),this.pending.delete(n)}buildTimeoutErrorMessage(t,n){let r=this.stderrTail.trim(),s=r?`; recent stderr: ${Kt(r)}`:"";return`codex app server timeout after ${n}ms: ${t}${s}`}};function Kt(e){return e.replace(/\b([a-z][a-z0-9+.-]*:\/\/)[^\s/?#@]+@/gi,"$1[redacted credential]@").replace(/\b(authorization\s*[:=]\s*)[^\r\n,;}]+/gi,"$1[redacted credential]").replace(/\b(Bearer\s+)[^\s]+/gi,"$1[redacted credential]").replace(/(["'][A-Za-z0-9_.-]*(?:api[_-]?key|token|secret|password|authorization)[A-Za-z0-9_.-]*["']\s*:\s*["'])[^"']+(["'])/gi,"$1[redacted credential]$2").replace(/\b([A-Za-z0-9_.-]*(?:api[_-]?key|token|secret|password|authorization)[A-Za-z0-9_.-]*\s*[:=]\s*)[^\s,}]+/gi,"$1[redacted credential]").replace(/\b(?:sk-[A-Za-z0-9_-]{8,}|gh[opsru]_[A-Za-z0-9_]{8,}|[A-Za-z0-9_-]{32,})\b/g,"[redacted token]").replace(/(?:\/Users|\/home)\/[^\s]+/g,"[redacted path]").replace(/\s+/g," ").slice(-1e3)}var rr={"gpt-5.6-sol":{input:4,cachedInput:.4,output:20},"gpt-5.6-terra":{input:2,cachedInput:.2,output:12},"gpt-5.6-luna":{input:.2,cachedInput:.02,output:1.2}},Js=272e3,Qs=1.25,Gs=2,Ks=2,Zs=1.5,Vs=1e6;function je(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:void 0}function Xs(e){let t=e?.trim().toLowerCase();if(t){if(t==="gpt-5.6")return"gpt-5.6-sol";for(let n of Object.keys(rr))if(t===n||t.startsWith(`${n}-`))return n}}function sr(e){let t=M(e),r=M(t?.account)?.type;return r==="apiKey"||r==="chatgpt"||r==="amazonBedrock"?r:void 0}function or(e){let t=M(e),n=M(t?.usage),r=typeof t?.responseId=="string"?t.responseId.trim():"";if(!r||!n)return;let s=je(n.inputTokens),o=je(n.cachedInputTokens),i=je(n.cacheWriteInputTokens),d=je(n.outputTokens),a=je(n.reasoningOutputTokens);if(!(s===void 0||o===void 0||i===void 0||d===void 0||a===void 0||o+i>s||a>d))return{responseId:r,usage:{inputTokens:s,cachedInputTokens:o,cacheWriteInputTokens:i,outputTokens:d,reasoningOutputTokens:a}}}function ir(e){let t=Xs(e.model),n=t?rr[t]:void 0;if(!n)return;let{inputTokens:r,cachedInputTokens:s,cacheWriteInputTokens:o,outputTokens:i,reasoningOutputTokens:d}=e.usage;if(![r,s,o,i,d].every(b=>Number.isSafeInteger(b)&&b>=0)||s+o>r||d>i)return;let a=r>Js,c=e.fastMode?Gs:1,l=c*(a?Ks:1),m=c*(a?Zs:1);return((r-s-o)*n.input*l+s*n.cachedInput*l+o*n.input*Qs*l+i*n.output*m)/Vs}function ar(e,t){if(!t||t.length===0)return!0;if(!e)return!1;let n=e.toLowerCase();return t.some(r=>n.includes(r.toLowerCase()))}function Je(e,t){let n=t?.trim();if(!n)return;if(e!=="codex")return n;let[r,...s]=n.split("/");return r?.toLowerCase()==="openai"&&s.length===1&&s[0]?.trim()?s[0].trim():n}function Ys(e,t){if(!t||t.length===0)return!0;if(!e)return!1;let n=e.toLowerCase();return t.some(r=>Je("codex",r)?.toLowerCase()===n)}function Ga(e,t,n){return e==="codex"?Ys(t,n):ar(t,n)}function dr(e,t){return e!=="codex"||!t?!0:!t.includes("/")}function Ka(e,t,n){if(e!=="codex"||!t||!n||n.length===0)return t;let r=t.toLowerCase(),s=n.find(o=>Je("codex",o)?.toLowerCase()===r);return Je("codex",s)??t}function eo(e){return e instanceof Error?e.message:String(e)}function ur(e){return e?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function we(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(n=>we(n)).join("");let t=M(e);if(!t)return"";for(let n of["delta","text","content","message","input","output","parts"]){let r=we(t[n]);if(r)return r}for(let n of["item","turn","thread","response","result","data"]){let r=we(t[n]);if(r)return r}return""}function Qe(e){let t=M(e);if(!t)return{};let n=M(t.thread)??M(t.session),r=M(t.turn)??M(t.run),s=M(t.item),o=M(t.serverRequest);return{threadId:O(t,["threadId","thread_id","conversationId","conversation_id"])??O(n,["id","threadId","thread_id","conversationId"]),runId:O(t,["turnId","turn_id","runId","run_id"])??O(r,["id","turnId","turn_id","runId","run_id"]),requestId:O(t,["requestId","request_id","serverRequestId"])??O(o,["id","requestId","request_id"]),itemId:O(t,["itemId","item_id"])??O(s,["id","itemId","item_id"])}}function ht(e,t,n=0){if(n>6)return;if(Array.isArray(e)){for(let o of e){let i=ht(o,t,n+1);if(i)return i}return}let r=M(e);if(!r)return;let s=O(r,t);if(s)return s;for(let o of Object.values(r)){let i=ht(o,t,n+1);if(i)return i}}function Ge(e){return{threadId:Qe(e).threadId,cwd:ht(e,["cwd","workdir","directory"])}}function cr(e){let t=e?.trim();return!!(t&&/[/\\]worktrees[/\\][^/\\]+[/\\][^/\\]+/.test(t))}function lr(e){let t=e?.trim();if(!t)return;let n=t.split(/[/\\]+/).filter(Boolean),r=n.lastIndexOf("worktrees");if(!(r<0||r+1>=n.length))return n[r+1]}function wt(e){let t=M(e);if(!t)return;let n=M(t.item)??t;return O(n,["id","itemId","item_id","messageId","message_id"])}function to(e,t=!1){let n=M(e);if(!n)return"";let r=M(n.item)??n;return O(r,["type"])?.toLowerCase()!=="agentmessage"?"":t?we(r):O(r,["text"],{trim:!1})??we(r)}function pr(e,t){let n=e.trim().toLowerCase();return n==="item/agentmessage/delta"?{mode:"delta",text:we(t),itemId:wt(t)}:n==="item/completed"?{mode:"snapshot",text:to(t),itemId:wt(t)}:{mode:"ignore",text:""}}function fr(e){return{itemId:wt(e),delta:we(e)}}function mr(e){let t=M(e),n=M(t?.plan),s=(Array.isArray(t?.plan)?t.plan:Array.isArray(n?.steps)?n.steps:[]).map(o=>{let i=M(o),d=O(i,["step","title","text"]);if(!d)return null;let a=O(i,["status"])?.toLowerCase()??"pending";return{step:d,status:a==="inprogress"||a==="in_progress"?"inProgress":a==="completed"?"completed":"pending"}}).filter(Boolean);return{explanation:O(n,["explanation"])??O(t,["explanation"]),steps:s}}function gr(e){let t=M(e);if(!t)return{};let n=M(t.item)??t;return O(n,["type"])?.toLowerCase()!=="plan"?{}:{itemId:wt(n),text:O(n,["text"],{trim:!1})??we(n)}}function hr(e,t){let n=e.trim().toLowerCase();if(n==="turn/failed")return"failed";if(n==="turn/cancelled")return"interrupted";let r=M(t)??{},s=M(r.turn)??r,o=O(s,["status"])?.toLowerCase();return o==="failed"?"failed":o==="interrupted"||o==="cancelled"?"interrupted":"completed"}function wr(e,t){let n=M(t)??{},r=M(n.turn)??n,s=M(r.error)??M(n.error);if(s)return O(s,["message","text","summary","reason"])}function no(e,t){let n=eo(e).toLowerCase();return n.includes("method not found")||n.includes("unknown method")?!0:n.includes("unknown variant")?t?n.includes(`unknown variant \`${t.toLowerCase()}\``):!0:!1}var ro=new Set(["thread/resume","turn/start","turn/steer","turn/interrupt"]);function so(e){return ro.has(e.trim().toLowerCase())}function oo(e){let t=M(e);return t?!!O(t,["threadId","thread_id"]):!1}async function Ke(e){if(e.payloads.length===0)throw new Error(`codex app server request skipped: no payloads for ${e.methods.join(", ")||"<none>"}`);let t;for(let n of e.methods)for(let r of e.payloads){if(so(n)&&!oo(r))throw new Error(`codex app server request missing threadId: ${n}`);try{return await e.client.request(n,r,e.timeoutMs)}catch(s){if(t=s,!no(s,n))continue}}throw t instanceof Error?t:new Error(String(t))}function yr(e){let t={cwd:e.cwd};return e.model?.trim()&&(t.model=e.model.trim()),e.reasoningEffort?.trim()&&(t.reasoningEffort=e.reasoningEffort.trim()),e.fastMode===!0&&(t.service_tier="fast"),e.approvalPolicy?.trim()&&(t.approvalPolicy=e.approvalPolicy.trim()),e.sandbox?.trim()&&(t.sandbox=e.sandbox.trim()),[t]}function br(e){let t={threadId:e.threadId,persistExtendedHistory:!1};return e.model?.trim()&&(t.model=e.model.trim()),e.reasoningEffort?.trim()&&(t.reasoningEffort=e.reasoningEffort.trim()),e.fastMode===!0&&(t.service_tier="fast"),e.cwd?.trim()&&(t.cwd=e.cwd.trim()),e.approvalPolicy?.trim()&&(t.approvalPolicy=e.approvalPolicy.trim()),e.sandbox?.trim()&&(t.sandbox=e.sandbox.trim()),[t]}function kr(e){let t={threadId:e.threadId};return e.model?.trim()&&(t.model=e.model.trim()),e.fastMode===!0&&(t.service_tier="fast"),e.cwd?.trim()&&(t.cwd=e.cwd.trim()),e.approvalPolicy?.trim()&&(t.approvalPolicy=e.approvalPolicy.trim()),e.sandbox?.trim()&&(t.sandbox=e.sandbox.trim()),[t]}function io(e){return[{type:"text",text:e}]}function ao(e,t,n,r){let s=t?.trim(),o=n?.trim(),i=r?.trim();if(e!=="plan")return s||o||i?{mode:"default",settings:{...s?{model:s}:{},...o?{reasoningEffort:o}:{},developerInstructions:i??null}}:void 0;if(!(!s&&!o&&!i))return{mode:"plan",settings:{...s?{model:s}:{},...o?{reasoningEffort:o}:{},developerInstructions:i??null}}}function Pr(e){let t={threadId:e.threadId,input:io(e.prompt)};e.model?.trim()&&(t.model=e.model.trim()),e.fastMode===!0&&(t.service_tier="fast"),e.approvalPolicy?.trim()&&(t.approvalPolicy=e.approvalPolicy.trim()),e.sandbox?.trim()&&(t.sandbox=e.sandbox.trim());let n=ao(e.permissionMode??"default",e.model,e.reasoningEffort,e.systemPrompt);return n?[{...t,collaborationMode:n}]:[t]}function Rr(e){return[{threadId:e.threadId,turnId:e.turnId}]}function uo(e){let t=e.trim().toLowerCase();return t.includes("session")?"acceptForSession":/cancel|abort|stop/.test(t)?"cancel":/deny|decline|reject|block|no/.test(t)?"decline":/approve|allow|accept|yes/.test(t)?"accept":e.trim()}function vr(e,t,n){let r=e.trim().toLowerCase(),s=r.includes("requestapproval"),o=r.includes("requestuserinput"),i=_e(n);if(o&&i.length===0)throw new Error(`Malformed Codex request_user_input payload for ${t}: expected non-empty questions[]`);let d=s?ut(n):[],a=i.length>0?0:void 0,c=a!=null?i[a]:void 0,l=c?c.options:[],u=(s&&l.length===0?d:l).map(h=>h.label),b=(c?ae(c,a??0,i.length):ct(i))??(s?ht(n,["question","prompt","message","text","summary","reason"]):void 0)??void 0,p=s?u.map(h=>({kind:"approval",label:h,decision:uo(h),responseDecision:h})):u.map(h=>({kind:"option",label:h,value:h}));return{requestId:t,kind:s?"approval":"question",promptText:b,options:u,...i.length>0?{questions:i}:{},...a!=null?{activeQuestionIndex:a}:{},actions:p,allowsFreeText:!0}}function Sr(e){let t=e.trim().toLowerCase();return t.includes("requestuserinput")||t.includes("requestapproval")}function Zt(e,t){let n=e==="bypassPermissions"?"never":t?.trim()||"never";return{approvalPolicy:n,sandbox:n==="never"?"danger-full-access":void 0}}var co="1.0",Vt=12e4,xr=["--listen","stdio://"],lo=5e3,po="OPENCLAW_CODEX_APP_SERVER_COMMAND",fo="OPENCLAW_CODEX_APP_SERVER_ARGS",mo="OPENCLAW_CODEX_APP_SERVER_TIMEOUT_MS",go=/^(?:urn:uuid:)?[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;function ho(e){let t=e?.trim();return t&&go.test(t)?t:void 0}function wo(e){let t=e?.trim();if(!t||!/^\d+$/.test(t))return Vt;let n=Number(t);return Number.isSafeInteger(n)&&n>0?n:Vt}function $e(e){return e instanceof Error?e.message:String(e)}function K(e,t){JSON.stringify({component:"CodexHarness",event:e,at:new Date().toISOString(),...t})}function yo(e){return{commandKind:e.command==="codex"?"codex":"custom",configuredArgCount:e.args.length,requestTimeoutMs:e.requestTimeoutMs}}function ue(e){return{hasThreadId:!!e.threadId,hasTurnId:!!e.turnId,hasBackendWorktreePath:!!e.backendWorktreePath,hasBackendWorktreeId:!!e.backendWorktreeId}}function bo(e){if(typeof e=="string")return e;if(!e||typeof e!="object")return String(e);let t=e;return typeof t.message?.content=="string"?t.message.content:typeof t.text=="string"?t.text:String(e)}function Ir(e,t,n){let r=e.questions??[],s=r[t];return s?{...e,promptText:ae(s,t,r.length),options:s.options.map(o=>o.label),activeQuestionIndex:t,answers:n}:e}var yt=class{constructor(t={}){this.deps=t}deps;name="codex";backendKind="codex-app-server";supportedPermissionModes=["default","plan","bypassPermissions"];capabilities={nativePendingInput:!0,nativePlanArtifacts:!0,worktrees:"native-restore"};launch(t){let n={command:process.env[po]?.trim()||"codex",args:ko(process.env[fo]),requestTimeoutMs:wo(process.env[mo])},r=this.deps.createClient?.(n)??new gt(n.command,n.args,n.requestTimeoutMs),s=new ge,o=ho(t.resumeSessionId),i=t.forkSession===!0;t.resumeSessionId;let d,a=t.backendRef?.worktreePath,c=t.backendRef?.worktreeId,l=t.permissionMode??"default",m=Je(this.name,t.model);if(!dr(this.name,m))throw new Error(`Codex model "${t.model}" is not supported. Use a bare Codex model id such as "gpt-5.6-sol".`);let u,b=0,p,h=m,P=0,f=new Set,I="",N=[],E,L=new Map,Z=new Set,B=v=>{let w=v?.trim();if(!w)return;let y=t.originalWorkdir?.trim()||t.cwd.trim();t.worktreeStrategy&&t.worktreeStrategy!=="off"&&w!==y&&cr(w)&&(a=w,c=lr(w))},G=()=>{o&&s.enqueue(Me({kind:"codex-app-server",conversationId:o,...d?{runId:d}:{},...c?{worktreeId:c}:{},...a?{worktreePath:a}:{}}))};r.setNotificationHandler(async(v,w)=>{let y=v.trim().toLowerCase(),S=Qe(w),W=Ge(w);if(S.threadId&&o&&S.threadId!==o)return;if(S.threadId&&(o=S.threadId),S.runId&&(d=S.runId),B(W.cwd),(S.threadId||S.runId||W.cwd)&&G(),y==="serverrequest/resolved"){u&&(s.enqueue(he(u.requestId)),u=void 0);return}if(y==="model/rerouted"){let T=w&&typeof w=="object"&&!Array.isArray(w)?w:void 0;typeof T?.toModel=="string"&&T.toModel.trim()&&(h=T.toModel.trim());return}if(y==="rawresponse/completed"&&p==="apiKey"){let T=or(w);if(!T||f.has(T.responseId))return;let z=ir({model:h,fastMode:t.fastMode,usage:T.usage});if(z===void 0)return;f.add(T.responseId),P+=z;return}if(y==="turn/plan/updated"){let T=mr(w);I=T.explanation??I,T.steps.length>0&&(N=T.steps);return}if(y==="item/plan/delta"){let T=fr(w);if(T.itemId&&T.delta){let z=L.get(T.itemId)??"";L.set(T.itemId,`${z}${T.delta}`)}return}if(y==="item/completed"){let T=gr(w);if(T.text?.trim()){let z={explanation:I||void 0,steps:N,markdown:T.text.trim()};s.enqueue(pt(z,!0));return}}let _=pr(y,w);if(_.mode==="delta"&&_.text){_.itemId&&Z.add(_.itemId),s.enqueue(ve(_.text));return}_.mode==="snapshot"&&_.text&&(!_.itemId||!Z.has(_.itemId))&&s.enqueue(ve(_.text)),(y==="turn/completed"||y==="turn/failed"||y==="turn/cancelled")&&E&&(E.method=v,E.params=w,E.resolve())}),r.setRequestHandler(async(v,w)=>{if(!Sr(v))return{};let y=Qe(w),S=Ge(w);if(y.threadId&&o&&y.threadId!==o)return{};y.threadId&&(o=y.threadId),y.runId&&(d=y.runId),B(S.cwd),(y.threadId||y.runId||S.cwd)&&G();let W=y.requestId??`${o??"codex"}-${Date.now().toString(36)}`,_;try{_=vr(v,W,w)}catch(ye){let Ve=$e(ye);return`${Ve}`,{error:Ve}}let T=v.trim().toLowerCase(),z=_.options,j=_.actions??[],xe=await new Promise(ye=>{u={requestId:W,methodLower:T,state:_,options:z,actions:j,answers:{..._.answers??{}},resolveResponse:ye},s.enqueue(re(_))});return u=void 0,s.enqueue(he(W)),xe});let ce=async()=>{K("client.initialize.start",{...yo(n),hasResumeSessionId:!!t.resumeSessionId}),await r.connect(),await r.request("initialize",{protocolVersion:co,clientInfo:{name:"openclaw-code-agent",version:"3.1.0"},capabilities:{experimentalApi:!0}},n.requestTimeoutMs),await r.notify("initialized",{});try{let v=await r.request("account/read",{refreshToken:!1},Math.min(n.requestTimeoutMs,lo));p=sr(v)}catch(v){K("account.read.unavailable",{error:$e(v)})}K("client.initialize.done",{hasResumeSessionId:!!t.resumeSessionId,accountType:p??"unknown"})},se=async()=>{let v=Zt(l,t.codexApprovalPolicy);if(o){let S=i,W=S?"thread/fork":"thread/resume";K(S?"thread.fork.start":"thread.resume.start",ue({threadId:o}));let _=await Ke({client:r,methods:[W],payloads:S?kr({threadId:o,cwd:t.cwd,model:m,fastMode:t.fastMode,approvalPolicy:v.approvalPolicy,sandbox:v.sandbox}):br({threadId:o,model:m,reasoningEffort:t.reasoningEffort,fastMode:t.fastMode,approvalPolicy:v.approvalPolicy,sandbox:v.sandbox}),timeoutMs:n.requestTimeoutMs}),T=Ge(_);o=T.threadId??o,S&&(i=!1),B(T.cwd),G(),K(S?"thread.fork.done":"thread.resume.done",{...ue({threadId:o,backendWorktreePath:a,backendWorktreeId:c})});return}K("thread.start.start",{hasCwd:!!t.cwd});let w=await Ke({client:r,methods:["thread/start","thread/new"],payloads:yr({cwd:t.cwd,model:m,reasoningEffort:t.reasoningEffort,fastMode:t.fastMode,approvalPolicy:v.approvalPolicy,sandbox:v.sandbox}),timeoutMs:n.requestTimeoutMs}),y=Ge(w);if(o=y.threadId,!o)throw new Error("Codex App Server did not return a thread id.");B(y.cwd),G(),K("thread.start.done",{...ue({threadId:o,backendWorktreePath:a,backendWorktreeId:c})})},A=async v=>{await se(),h=m,K("turn.start",{...ue({threadId:o}),runCounter:b+1,promptChars:v.length,permissionMode:l}),s.enqueue(Ae()),b+=1,I="",N=[],L.clear(),Z.clear();let w="",y,S,W=new Promise(_=>{S=_});E={resolve:S};try{let _=Zt(l,t.codexApprovalPolicy),T=await Ke({client:r,methods:["turn/start"],payloads:Pr({threadId:o,prompt:v,model:m,reasoningEffort:t.reasoningEffort,fastMode:t.fastMode,systemPrompt:t.systemPrompt,permissionMode:l,approvalPolicy:_.approvalPolicy,sandbox:_.sandbox}),timeoutMs:n.requestTimeoutMs}),z=Qe(T);z.runId&&(d=z.runId,G()),await W,w=E?.method??"turn/failed",y=E?.params;let j=hr(w,y);K("turn.terminal",{...ue({threadId:o,turnId:d}),terminalMethod:w,outcome:j}),s.enqueue(de({success:j==="completed",outcome:j,duration_ms:0,total_cost_usd:P,num_turns:b,result:wr(w,y),session_id:o}))}catch(_){K("turn.error",{...ue({threadId:o,turnId:d}),error:$e(_)}),s.enqueue(de({success:!1,duration_ms:0,total_cost_usd:P,num_turns:b,result:$e(_),session_id:o??""}))}finally{E=void 0}},R=async v=>{let w=u;if(!w)return!1;let y=v.trim();if(w.methodLower.includes("requestapproval"))return w.resolveResponse({decision:y||"decline"}),!0;let S=w.state.questions??[];if(S.length>0){if(!y)return!1;let W=w.state.activeQuestionIndex??0,_=S[W];if(!_)return!1;w.answers={...w.answers,[_.id]:{answers:[y]}};let T=W+1;if(T<S.length)return w.state=Ir(w.state,T,w.answers),w.options=w.state.options,s.enqueue(re(w.state)),!0;w.resolveResponse({answers:w.answers})}else w.resolveResponse({text:y});return!0},$=async(v,w={})=>{let y=u;if(!y||w.requestId&&w.requestId!==y.state.requestId)return!1;let S=y.actions[v];if(S?.kind==="approval")return y.resolveResponse({decision:S.responseDecision,...S.proposedExecpolicyAmendment?{proposedExecpolicyAmendment:S.proposedExecpolicyAmendment}:{}}),!0;let W=y.state.questions??[],_=y.state.activeQuestionIndex??0,T=W.length>0?W[_]:void 0;if(w.questionId&&w.questionId!==T?.id)return!1;let z=T?.options[v];if(T&&z){y.answers={...y.answers,[T.id]:{answers:[z.value??z.label]}};let xe=_+1;return xe<W.length?(y.state=Ir(y.state,xe,y.answers),y.options=y.state.options,s.enqueue(re(y.state)),!0):(y.resolveResponse({answers:y.answers}),!0)}let j=y.options[v];return j?(y.methodLower.includes("requestapproval")?y.resolveResponse({decision:j}):y.resolveResponse({option:j,index:v}),!0):!1},D=typeof t.prompt=="string"?(async function*(){yield{type:"user",text:t.prompt,session_id:t.resumeSessionId??""}})():t.prompt;return(async()=>{try{await ce();for await(let v of D){let w=bo(v).trim();!w||await R(w)||await A(w)}}catch(v){K("session.error",{...ue({threadId:o,turnId:d}),error:$e(v)}),s.enqueue(de({success:!1,duration_ms:0,total_cost_usd:P,num_turns:b,result:$e(v),session_id:o??t.resumeSessionId??""}))}finally{K("client.close.start",ue({threadId:o,turnId:d})),await r.close().catch(()=>{}),K("client.close.done",ue({threadId:o,turnId:d})),s.close()}})(),{messages:s.messages(),async setPermissionMode(v){l=v,s.enqueue(Ee(v))},async submitPendingInputOption(v,w){return $(v,w)},async submitPendingInputText(v){return R(v)},async interrupt(){!o||!d||await Ke({client:r,methods:["turn/interrupt"],payloads:Rr({threadId:o,turnId:d}),timeoutMs:n.requestTimeoutMs}).catch(()=>{})},async close(){await r.close()}}}buildUserMessage(t,n){return{type:"user",text:t,session_id:n}}};function ko(e){if(e===void 0)return xr;let t=ur(e);return t.length>0?t:xr}import{spawn as Po}from"node:child_process";import{constants as Ro,accessSync as vo}from"node:fs";import{createServer as So}from"node:net";import{delimiter as xo,dirname as Xt,join as _r,sep as Io}from"node:path";var Co="OPENCLAW_OPENCODE_COMMAND",To=15e3,kt=6e4,_o=250,Mo=15*6e4,Ao=["edit","bash","task","todowrite","external_directory"];function Be(e){return e instanceof Error?e.message:String(e)}function Eo(e){try{return vo(e,Ro.X_OK),!0}catch{return!1}}function $o(e){return e.includes("/")||Io==="\\"&&e.includes("\\")}function Oo(e){let t=(e??"").split(xo).map(r=>r.trim()).filter(Boolean),n=[...t];for(let r of t)r.replaceAll("\\","/").endsWith("/opt/node/bin")&&n.push(_r(Xt(Xt(Xt(r))),"bin"));return n.push("/home/linuxbrew/.linuxbrew/bin","/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin"),[...new Set(n)]}function Bo(e,t=process.env.PATH){if($o(e))return e;for(let n of Oo(t)){let r=_r(n,e);if(Eo(r))return r}return e}function H(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function No(e){return typeof e?.cost=="number"&&Number.isFinite(e.cost)&&e.cost>=0?e.cost:0}function qo(e){if(typeof e=="string")return e;if(!H(e))return String(e);if(typeof e.text=="string")return e.text;let t=H(e.message)?e.message:void 0;return typeof t?.content=="string"?t.content:String(e)}function Mr(e){let t=e?.trim();if(!t)return;let n=t.indexOf("/");if(!(n<=0||n===t.length-1))return{providerID:t.slice(0,n),modelID:t.slice(n+1)}}function Lo(e){let t=Mr(e);return t?{id:t.modelID,providerID:t.providerID}:void 0}function Cr(e){let t=e??"default",n=t==="plan"?"deny":t==="bypassPermissions"?"allow":"ask";return Ao.map(r=>({permission:r,pattern:"*",action:n}))}function Yt(){let e=process.env.OPENCODE_SERVER_PASSWORD;if(!e)return{};let t=process.env.OPENCODE_SERVER_USERNAME||"opencode";return{Authorization:`Basic ${Buffer.from(`${t}:${e}`).toString("base64")}`}}async function Fo(){return new Promise((e,t)=>{let n=So();n.once("error",t),n.listen(0,"127.0.0.1",()=>{let r=n.address();n.close(()=>{r&&typeof r=="object"?e(r.port):t(new Error("Could not allocate local OpenCode server port."))})})})}async function Ar(e){await new Promise(t=>setTimeout(t,e))}async function bt(e,t){if(t.signal?.aborted)throw new Error(t.abortMessage??"Operation was aborted.");return await new Promise((n,r)=>{let s=!1,o=()=>{clearTimeout(a),t.signal?.removeEventListener("abort",d)},i=c=>{s||(s=!0,o(),c())},d=()=>{i(()=>r(new Error(t.abortMessage??"Operation was aborted.")))},a=setTimeout(()=>{i(()=>{t.onTimeout?.(),r(new Error(t.timeoutMessage))})},t.timeoutMs);t.signal?.addEventListener("abort",d,{once:!0}),e.then(c=>i(()=>n(c)),c=>i(()=>r(c)))})}async function Oe(e){e.exitCode===null&&await new Promise(t=>{let n,r=setTimeout(()=>{e.exitCode===null&&e.kill("SIGKILL"),n=setTimeout(t,1e3)},2e3);e.once("exit",()=>{clearTimeout(r),n&&clearTimeout(n),t()}),e.kill("SIGTERM")})}var en=class extends Error{constructor(n,r,s,o){super(`OpenCode ${n} ${r} failed with ${s}${o?`: ${o}`:""}`);this.method=n;this.path=r;this.status=s;this.body=o}method;path;status;body};function Wo(e){return e.headers.get("content-type")?.toLowerCase()??""}function tn(e){return e.replace(/\s+/g," ").trim().slice(0,300)}function Uo(e,t){return e.includes("text/html")||/^\s*<!doctype html\b/i.test(t)||/^\s*<html[\s>]/i.test(t)}function Do(e,t,n,r){let s=n?`content-type ${n}`:"missing content-type",o=tn(r),i=Uo(n,r)?" (looks like the OpenCode web UI HTML app shell)":"";return`OpenCode ${e} ${t} expected JSON API response but received ${s}${i}${o?`: ${o}`:""}`}function Ho(e,t,n){let r=Mr(t);return{...r?{model:{providerID:r.providerID,modelID:r.modelID}}:{},...n?.trim()?{system:n.trim()}:{},parts:[{type:"text",text:e}]}}function zo(e,t){if(!H(e))return!1;if(!(t in e))return!0;let n=e[t];return H(n)&&n.type==="idle"}function jo(e){return e.type==="session.idle"?!0:e.type!=="session.status"?!1:(e.properties.status??e.properties.type)==="idle"}var Tr=Promise.resolve();function Jo(e){return new Promise((t,n)=>{Tr=Tr.then(()=>e().then(t,n)).catch(()=>{})})}async function Qo(e){return Jo(async()=>{let t=await Fo(),n=process.env[Co]?.trim()||"opencode",r=Bo(n),s=["serve","--hostname","127.0.0.1","--port",String(t),"--print-logs"],o=e.fetch??fetch,i=Math.min(e.requestTimeoutMs??kt,1e4),d=e.startupTimeoutMs??To,a=Po(r,s,{cwd:e.cwd,stdio:["ignore","pipe","pipe"]}),c=`http://127.0.0.1:${t}`,l="",m="",u,b=(f,I)=>{let N=f+String(I);return N.length>8e3?N.slice(-8e3):N};a.stdout.on("data",f=>{l=b(l,f)}),a.stderr.on("data",f=>{m=b(m,f)}),a.once("error",f=>{u=f});let p=()=>` Command: ${n===r?r:`${r} (resolved from ${n})`} ${s.join(" ")}. Cwd: ${e.cwd}. Port: ${t}. PATH: ${process.env.PATH??""}.`,h=()=>{let f=[l.trim(),m.trim()].filter(Boolean).join(`
24
+ `)}async handleLine(t){let n=zs(t);n&&await js(n,{pending:this.pending,onNotification:this.onNotification,onRequest:this.onRequest,respond:r=>this.write(r)})}flushPending(t){this.pending.size>0&&Se("pending.flush",{pendingRequests:this.pending.size,error:t.message,pid:this.process?.pid});for(let[n,r]of this.pending)clearTimeout(r.timer),r.reject(t),this.pending.delete(n)}buildTimeoutErrorMessage(t,n){let r=this.stderrTail.trim(),s=r?`; recent stderr: ${Kt(r)}`:"";return`codex app server timeout after ${n}ms: ${t}${s}`}};function Kt(e){return e.replace(/\b([a-z][a-z0-9+.-]*:\/\/)[^\s/?#@]+@/gi,"$1[redacted credential]@").replace(/\b(authorization\s*[:=]\s*)[^\r\n,;}]+/gi,"$1[redacted credential]").replace(/\b(Bearer\s+)[^\s]+/gi,"$1[redacted credential]").replace(/(["'][A-Za-z0-9_.-]*(?:api[_-]?key|token|secret|password|authorization)[A-Za-z0-9_.-]*["']\s*:\s*["'])[^"']+(["'])/gi,"$1[redacted credential]$2").replace(/\b([A-Za-z0-9_.-]*(?:api[_-]?key|token|secret|password|authorization)[A-Za-z0-9_.-]*\s*[:=]\s*)[^\s,}]+/gi,"$1[redacted credential]").replace(/\b(?:sk-[A-Za-z0-9_-]{8,}|gh[opsru]_[A-Za-z0-9_]{8,}|[A-Za-z0-9_-]{32,})\b/g,"[redacted token]").replace(/(?:\/Users|\/home)\/[^\s]+/g,"[redacted path]").replace(/\s+/g," ").slice(-1e3)}var rr={"gpt-6-astra":{input:10,cachedInput:1,output:50},"gpt-5.6-sol":{input:4,cachedInput:.4,output:20},"gpt-5.6-terra":{input:2,cachedInput:.2,output:12},"gpt-5.6-luna":{input:.2,cachedInput:.02,output:1.2}},Js=272e3,Qs=1.25,Gs=2,Ks=2,Zs=1.5,Vs=1e6;function je(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:void 0}function Xs(e){let t=e?.trim().toLowerCase();if(t){if(t==="gpt-5.6")return"gpt-5.6-sol";if(t==="gpt-6-astra")return"gpt-6-astra";for(let n of Object.keys(rr))if(n!=="gpt-6-astra"&&(t===n||t.startsWith(`${n}-`)))return n}}function sr(e){let t=M(e),r=M(t?.account)?.type;return r==="apiKey"||r==="chatgpt"||r==="amazonBedrock"?r:void 0}function or(e){let t=M(e),n=M(t?.usage),r=typeof t?.responseId=="string"?t.responseId.trim():"";if(!r||!n)return;let s=je(n.inputTokens),o=je(n.cachedInputTokens),i=je(n.cacheWriteInputTokens),d=je(n.outputTokens),a=je(n.reasoningOutputTokens);if(!(s===void 0||o===void 0||i===void 0||d===void 0||a===void 0||o+i>s||a>d))return{responseId:r,usage:{inputTokens:s,cachedInputTokens:o,cacheWriteInputTokens:i,outputTokens:d,reasoningOutputTokens:a}}}function ir(e){let t=Xs(e.model),n=t?rr[t]:void 0;if(!n)return;let{inputTokens:r,cachedInputTokens:s,cacheWriteInputTokens:o,outputTokens:i,reasoningOutputTokens:d}=e.usage;if(![r,s,o,i,d].every(b=>Number.isSafeInteger(b)&&b>=0)||s+o>r||d>i)return;let a=r>Js,c=e.fastMode?Gs:1,l=c*(a?Ks:1),m=c*(a?Zs:1);return((r-s-o)*n.input*l+s*n.cachedInput*l+o*n.input*Qs*l+i*n.output*m)/Vs}function ar(e,t){if(!t||t.length===0)return!0;if(!e)return!1;let n=e.toLowerCase();return t.some(r=>n.includes(r.toLowerCase()))}function Je(e,t){let n=t?.trim();if(!n)return;if(e!=="codex")return n;let[r,...s]=n.split("/");return r?.toLowerCase()==="openai"&&s.length===1&&s[0]?.trim()?s[0].trim():n}function Ys(e,t){if(!t||t.length===0)return!0;if(!e)return!1;let n=e.toLowerCase();return t.some(r=>Je("codex",r)?.toLowerCase()===n)}function Ga(e,t,n){return e==="codex"?Ys(t,n):ar(t,n)}function dr(e,t){return e!=="codex"||!t?!0:!t.includes("/")}function Ka(e,t,n){if(e!=="codex"||!t||!n||n.length===0)return t;let r=t.toLowerCase(),s=n.find(o=>Je("codex",o)?.toLowerCase()===r);return Je("codex",s)??t}function eo(e){return e instanceof Error?e.message:String(e)}function ur(e){return e?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function we(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(n=>we(n)).join("");let t=M(e);if(!t)return"";for(let n of["delta","text","content","message","input","output","parts"]){let r=we(t[n]);if(r)return r}for(let n of["item","turn","thread","response","result","data"]){let r=we(t[n]);if(r)return r}return""}function Qe(e){let t=M(e);if(!t)return{};let n=M(t.thread)??M(t.session),r=M(t.turn)??M(t.run),s=M(t.item),o=M(t.serverRequest);return{threadId:O(t,["threadId","thread_id","conversationId","conversation_id"])??O(n,["id","threadId","thread_id","conversationId"]),runId:O(t,["turnId","turn_id","runId","run_id"])??O(r,["id","turnId","turn_id","runId","run_id"]),requestId:O(t,["requestId","request_id","serverRequestId"])??O(o,["id","requestId","request_id"]),itemId:O(t,["itemId","item_id"])??O(s,["id","itemId","item_id"])}}function ht(e,t,n=0){if(n>6)return;if(Array.isArray(e)){for(let o of e){let i=ht(o,t,n+1);if(i)return i}return}let r=M(e);if(!r)return;let s=O(r,t);if(s)return s;for(let o of Object.values(r)){let i=ht(o,t,n+1);if(i)return i}}function Ge(e){return{threadId:Qe(e).threadId,cwd:ht(e,["cwd","workdir","directory"])}}function cr(e){let t=e?.trim();return!!(t&&/[/\\]worktrees[/\\][^/\\]+[/\\][^/\\]+/.test(t))}function lr(e){let t=e?.trim();if(!t)return;let n=t.split(/[/\\]+/).filter(Boolean),r=n.lastIndexOf("worktrees");if(!(r<0||r+1>=n.length))return n[r+1]}function wt(e){let t=M(e);if(!t)return;let n=M(t.item)??t;return O(n,["id","itemId","item_id","messageId","message_id"])}function to(e,t=!1){let n=M(e);if(!n)return"";let r=M(n.item)??n;return O(r,["type"])?.toLowerCase()!=="agentmessage"?"":t?we(r):O(r,["text"],{trim:!1})??we(r)}function pr(e,t){let n=e.trim().toLowerCase();return n==="item/agentmessage/delta"?{mode:"delta",text:we(t),itemId:wt(t)}:n==="item/completed"?{mode:"snapshot",text:to(t),itemId:wt(t)}:{mode:"ignore",text:""}}function fr(e){return{itemId:wt(e),delta:we(e)}}function mr(e){let t=M(e),n=M(t?.plan),s=(Array.isArray(t?.plan)?t.plan:Array.isArray(n?.steps)?n.steps:[]).map(o=>{let i=M(o),d=O(i,["step","title","text"]);if(!d)return null;let a=O(i,["status"])?.toLowerCase()??"pending";return{step:d,status:a==="inprogress"||a==="in_progress"?"inProgress":a==="completed"?"completed":"pending"}}).filter(Boolean);return{explanation:O(n,["explanation"])??O(t,["explanation"]),steps:s}}function gr(e){let t=M(e);if(!t)return{};let n=M(t.item)??t;return O(n,["type"])?.toLowerCase()!=="plan"?{}:{itemId:wt(n),text:O(n,["text"],{trim:!1})??we(n)}}function hr(e,t){let n=e.trim().toLowerCase();if(n==="turn/failed")return"failed";if(n==="turn/cancelled")return"interrupted";let r=M(t)??{},s=M(r.turn)??r,o=O(s,["status"])?.toLowerCase();return o==="failed"?"failed":o==="interrupted"||o==="cancelled"?"interrupted":"completed"}function wr(e,t){let n=M(t)??{},r=M(n.turn)??n,s=M(r.error)??M(n.error);if(s)return O(s,["message","text","summary","reason"])}function no(e,t){let n=eo(e).toLowerCase();return n.includes("method not found")||n.includes("unknown method")?!0:n.includes("unknown variant")?t?n.includes(`unknown variant \`${t.toLowerCase()}\``):!0:!1}var ro=new Set(["thread/resume","turn/start","turn/steer","turn/interrupt"]);function so(e){return ro.has(e.trim().toLowerCase())}function oo(e){let t=M(e);return t?!!O(t,["threadId","thread_id"]):!1}async function Ke(e){if(e.payloads.length===0)throw new Error(`codex app server request skipped: no payloads for ${e.methods.join(", ")||"<none>"}`);let t;for(let n of e.methods)for(let r of e.payloads){if(so(n)&&!oo(r))throw new Error(`codex app server request missing threadId: ${n}`);try{return await e.client.request(n,r,e.timeoutMs)}catch(s){if(t=s,!no(s,n))continue}}throw t instanceof Error?t:new Error(String(t))}function yr(e){let t={cwd:e.cwd};return e.model?.trim()&&(t.model=e.model.trim()),e.reasoningEffort?.trim()&&(t.reasoningEffort=e.reasoningEffort.trim()),e.fastMode===!0&&(t.service_tier="fast"),e.approvalPolicy?.trim()&&(t.approvalPolicy=e.approvalPolicy.trim()),e.sandbox?.trim()&&(t.sandbox=e.sandbox.trim()),[t]}function br(e){let t={threadId:e.threadId,persistExtendedHistory:!1};return e.model?.trim()&&(t.model=e.model.trim()),e.reasoningEffort?.trim()&&(t.reasoningEffort=e.reasoningEffort.trim()),e.fastMode===!0&&(t.service_tier="fast"),e.cwd?.trim()&&(t.cwd=e.cwd.trim()),e.approvalPolicy?.trim()&&(t.approvalPolicy=e.approvalPolicy.trim()),e.sandbox?.trim()&&(t.sandbox=e.sandbox.trim()),[t]}function kr(e){let t={threadId:e.threadId};return e.model?.trim()&&(t.model=e.model.trim()),e.fastMode===!0&&(t.service_tier="fast"),e.cwd?.trim()&&(t.cwd=e.cwd.trim()),e.approvalPolicy?.trim()&&(t.approvalPolicy=e.approvalPolicy.trim()),e.sandbox?.trim()&&(t.sandbox=e.sandbox.trim()),[t]}function io(e){return[{type:"text",text:e}]}function ao(e,t,n,r){let s=t?.trim(),o=n?.trim(),i=r?.trim();if(e!=="plan")return s||o||i?{mode:"default",settings:{...s?{model:s}:{},...o?{reasoningEffort:o}:{},developerInstructions:i??null}}:void 0;if(!(!s&&!o&&!i))return{mode:"plan",settings:{...s?{model:s}:{},...o?{reasoningEffort:o}:{},developerInstructions:i??null}}}function Pr(e){let t={threadId:e.threadId,input:io(e.prompt)};e.model?.trim()&&(t.model=e.model.trim()),e.fastMode===!0&&(t.service_tier="fast"),e.approvalPolicy?.trim()&&(t.approvalPolicy=e.approvalPolicy.trim()),e.sandbox?.trim()&&(t.sandbox=e.sandbox.trim());let n=ao(e.permissionMode??"default",e.model,e.reasoningEffort,e.systemPrompt);return n?[{...t,collaborationMode:n}]:[t]}function Rr(e){return[{threadId:e.threadId,turnId:e.turnId}]}function uo(e){let t=e.trim().toLowerCase();return t.includes("session")?"acceptForSession":/cancel|abort|stop/.test(t)?"cancel":/deny|decline|reject|block|no/.test(t)?"decline":/approve|allow|accept|yes/.test(t)?"accept":e.trim()}function vr(e,t,n){let r=e.trim().toLowerCase(),s=r.includes("requestapproval"),o=r.includes("requestuserinput"),i=_e(n);if(o&&i.length===0)throw new Error(`Malformed Codex request_user_input payload for ${t}: expected non-empty questions[]`);let d=s?ut(n):[],a=i.length>0?0:void 0,c=a!=null?i[a]:void 0,l=c?c.options:[],u=(s&&l.length===0?d:l).map(h=>h.label),b=(c?ae(c,a??0,i.length):ct(i))??(s?ht(n,["question","prompt","message","text","summary","reason"]):void 0)??void 0,p=s?u.map(h=>({kind:"approval",label:h,decision:uo(h),responseDecision:h})):u.map(h=>({kind:"option",label:h,value:h}));return{requestId:t,kind:s?"approval":"question",promptText:b,options:u,...i.length>0?{questions:i}:{},...a!=null?{activeQuestionIndex:a}:{},actions:p,allowsFreeText:!0}}function Sr(e){let t=e.trim().toLowerCase();return t.includes("requestuserinput")||t.includes("requestapproval")}function Zt(e,t){let n=e==="bypassPermissions"?"never":t?.trim()||"never";return{approvalPolicy:n,sandbox:n==="never"?"danger-full-access":void 0}}var co="1.0",Vt=12e4,xr=["--listen","stdio://"],lo=5e3,po="OPENCLAW_CODEX_APP_SERVER_COMMAND",fo="OPENCLAW_CODEX_APP_SERVER_ARGS",mo="OPENCLAW_CODEX_APP_SERVER_TIMEOUT_MS",go=/^(?:urn:uuid:)?[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;function ho(e){let t=e?.trim();return t&&go.test(t)?t:void 0}function wo(e){let t=e?.trim();if(!t||!/^\d+$/.test(t))return Vt;let n=Number(t);return Number.isSafeInteger(n)&&n>0?n:Vt}function $e(e){return e instanceof Error?e.message:String(e)}function K(e,t){JSON.stringify({component:"CodexHarness",event:e,at:new Date().toISOString(),...t})}function yo(e){return{commandKind:e.command==="codex"?"codex":"custom",configuredArgCount:e.args.length,requestTimeoutMs:e.requestTimeoutMs}}function ue(e){return{hasThreadId:!!e.threadId,hasTurnId:!!e.turnId,hasBackendWorktreePath:!!e.backendWorktreePath,hasBackendWorktreeId:!!e.backendWorktreeId}}function bo(e){if(typeof e=="string")return e;if(!e||typeof e!="object")return String(e);let t=e;return typeof t.message?.content=="string"?t.message.content:typeof t.text=="string"?t.text:String(e)}function Ir(e,t,n){let r=e.questions??[],s=r[t];return s?{...e,promptText:ae(s,t,r.length),options:s.options.map(o=>o.label),activeQuestionIndex:t,answers:n}:e}var yt=class{constructor(t={}){this.deps=t}deps;name="codex";backendKind="codex-app-server";supportedPermissionModes=["default","plan","bypassPermissions"];capabilities={nativePendingInput:!0,nativePlanArtifacts:!0,worktrees:"native-restore"};launch(t){let n={command:process.env[po]?.trim()||"codex",args:ko(process.env[fo]),requestTimeoutMs:wo(process.env[mo])},r=this.deps.createClient?.(n)??new gt(n.command,n.args,n.requestTimeoutMs),s=new ge,o=ho(t.resumeSessionId),i=t.forkSession===!0;t.resumeSessionId;let d,a=t.backendRef?.worktreePath,c=t.backendRef?.worktreeId,l=t.permissionMode??"default",m=Je(this.name,t.model);if(!dr(this.name,m))throw new Error(`Codex model "${t.model}" is not supported. Use a bare Codex model id such as "gpt-6-astra" or "gpt-5.6-sol".`);let u,b=0,p,h=m,P=0,f=new Set,I="",N=[],E,L=new Map,Z=new Set,B=v=>{let w=v?.trim();if(!w)return;let y=t.originalWorkdir?.trim()||t.cwd.trim();t.worktreeStrategy&&t.worktreeStrategy!=="off"&&w!==y&&cr(w)&&(a=w,c=lr(w))},G=()=>{o&&s.enqueue(Me({kind:"codex-app-server",conversationId:o,...d?{runId:d}:{},...c?{worktreeId:c}:{},...a?{worktreePath:a}:{}}))};r.setNotificationHandler(async(v,w)=>{let y=v.trim().toLowerCase(),S=Qe(w),W=Ge(w);if(S.threadId&&o&&S.threadId!==o)return;if(S.threadId&&(o=S.threadId),S.runId&&(d=S.runId),B(W.cwd),(S.threadId||S.runId||W.cwd)&&G(),y==="serverrequest/resolved"){u&&(s.enqueue(he(u.requestId)),u=void 0);return}if(y==="model/rerouted"){let T=w&&typeof w=="object"&&!Array.isArray(w)?w:void 0;typeof T?.toModel=="string"&&T.toModel.trim()&&(h=T.toModel.trim());return}if(y==="rawresponse/completed"&&p==="apiKey"){let T=or(w);if(!T||f.has(T.responseId))return;let z=ir({model:h,fastMode:t.fastMode,usage:T.usage});if(z===void 0)return;f.add(T.responseId),P+=z;return}if(y==="turn/plan/updated"){let T=mr(w);I=T.explanation??I,T.steps.length>0&&(N=T.steps);return}if(y==="item/plan/delta"){let T=fr(w);if(T.itemId&&T.delta){let z=L.get(T.itemId)??"";L.set(T.itemId,`${z}${T.delta}`)}return}if(y==="item/completed"){let T=gr(w);if(T.text?.trim()){let z={explanation:I||void 0,steps:N,markdown:T.text.trim()};s.enqueue(pt(z,!0));return}}let _=pr(y,w);if(_.mode==="delta"&&_.text){_.itemId&&Z.add(_.itemId),s.enqueue(ve(_.text));return}_.mode==="snapshot"&&_.text&&(!_.itemId||!Z.has(_.itemId))&&s.enqueue(ve(_.text)),(y==="turn/completed"||y==="turn/failed"||y==="turn/cancelled")&&E&&(E.method=v,E.params=w,E.resolve())}),r.setRequestHandler(async(v,w)=>{if(!Sr(v))return{};let y=Qe(w),S=Ge(w);if(y.threadId&&o&&y.threadId!==o)return{};y.threadId&&(o=y.threadId),y.runId&&(d=y.runId),B(S.cwd),(y.threadId||y.runId||S.cwd)&&G();let W=y.requestId??`${o??"codex"}-${Date.now().toString(36)}`,_;try{_=vr(v,W,w)}catch(ye){let Ve=$e(ye);return`${Ve}`,{error:Ve}}let T=v.trim().toLowerCase(),z=_.options,j=_.actions??[],xe=await new Promise(ye=>{u={requestId:W,methodLower:T,state:_,options:z,actions:j,answers:{..._.answers??{}},resolveResponse:ye},s.enqueue(re(_))});return u=void 0,s.enqueue(he(W)),xe});let ce=async()=>{K("client.initialize.start",{...yo(n),hasResumeSessionId:!!t.resumeSessionId}),await r.connect(),await r.request("initialize",{protocolVersion:co,clientInfo:{name:"openclaw-code-agent",version:"3.1.0"},capabilities:{experimentalApi:!0}},n.requestTimeoutMs),await r.notify("initialized",{});try{let v=await r.request("account/read",{refreshToken:!1},Math.min(n.requestTimeoutMs,lo));p=sr(v)}catch(v){K("account.read.unavailable",{error:$e(v)})}K("client.initialize.done",{hasResumeSessionId:!!t.resumeSessionId,accountType:p??"unknown"})},se=async()=>{let v=Zt(l,t.codexApprovalPolicy);if(o){let S=i,W=S?"thread/fork":"thread/resume";K(S?"thread.fork.start":"thread.resume.start",ue({threadId:o}));let _=await Ke({client:r,methods:[W],payloads:S?kr({threadId:o,cwd:t.cwd,model:m,fastMode:t.fastMode,approvalPolicy:v.approvalPolicy,sandbox:v.sandbox}):br({threadId:o,model:m,reasoningEffort:t.reasoningEffort,fastMode:t.fastMode,approvalPolicy:v.approvalPolicy,sandbox:v.sandbox}),timeoutMs:n.requestTimeoutMs}),T=Ge(_);o=T.threadId??o,S&&(i=!1),B(T.cwd),G(),K(S?"thread.fork.done":"thread.resume.done",{...ue({threadId:o,backendWorktreePath:a,backendWorktreeId:c})});return}K("thread.start.start",{hasCwd:!!t.cwd});let w=await Ke({client:r,methods:["thread/start","thread/new"],payloads:yr({cwd:t.cwd,model:m,reasoningEffort:t.reasoningEffort,fastMode:t.fastMode,approvalPolicy:v.approvalPolicy,sandbox:v.sandbox}),timeoutMs:n.requestTimeoutMs}),y=Ge(w);if(o=y.threadId,!o)throw new Error("Codex App Server did not return a thread id.");B(y.cwd),G(),K("thread.start.done",{...ue({threadId:o,backendWorktreePath:a,backendWorktreeId:c})})},A=async v=>{await se(),h=m,K("turn.start",{...ue({threadId:o}),runCounter:b+1,promptChars:v.length,permissionMode:l}),s.enqueue(Ae()),b+=1,I="",N=[],L.clear(),Z.clear();let w="",y,S,W=new Promise(_=>{S=_});E={resolve:S};try{let _=Zt(l,t.codexApprovalPolicy),T=await Ke({client:r,methods:["turn/start"],payloads:Pr({threadId:o,prompt:v,model:m,reasoningEffort:t.reasoningEffort,fastMode:t.fastMode,systemPrompt:t.systemPrompt,permissionMode:l,approvalPolicy:_.approvalPolicy,sandbox:_.sandbox}),timeoutMs:n.requestTimeoutMs}),z=Qe(T);z.runId&&(d=z.runId,G()),await W,w=E?.method??"turn/failed",y=E?.params;let j=hr(w,y);K("turn.terminal",{...ue({threadId:o,turnId:d}),terminalMethod:w,outcome:j}),s.enqueue(de({success:j==="completed",outcome:j,duration_ms:0,total_cost_usd:P,num_turns:b,result:wr(w,y),session_id:o}))}catch(_){K("turn.error",{...ue({threadId:o,turnId:d}),error:$e(_)}),s.enqueue(de({success:!1,duration_ms:0,total_cost_usd:P,num_turns:b,result:$e(_),session_id:o??""}))}finally{E=void 0}},R=async v=>{let w=u;if(!w)return!1;let y=v.trim();if(w.methodLower.includes("requestapproval"))return w.resolveResponse({decision:y||"decline"}),!0;let S=w.state.questions??[];if(S.length>0){if(!y)return!1;let W=w.state.activeQuestionIndex??0,_=S[W];if(!_)return!1;w.answers={...w.answers,[_.id]:{answers:[y]}};let T=W+1;if(T<S.length)return w.state=Ir(w.state,T,w.answers),w.options=w.state.options,s.enqueue(re(w.state)),!0;w.resolveResponse({answers:w.answers})}else w.resolveResponse({text:y});return!0},$=async(v,w={})=>{let y=u;if(!y||w.requestId&&w.requestId!==y.state.requestId)return!1;let S=y.actions[v];if(S?.kind==="approval")return y.resolveResponse({decision:S.responseDecision,...S.proposedExecpolicyAmendment?{proposedExecpolicyAmendment:S.proposedExecpolicyAmendment}:{}}),!0;let W=y.state.questions??[],_=y.state.activeQuestionIndex??0,T=W.length>0?W[_]:void 0;if(w.questionId&&w.questionId!==T?.id)return!1;let z=T?.options[v];if(T&&z){y.answers={...y.answers,[T.id]:{answers:[z.value??z.label]}};let xe=_+1;return xe<W.length?(y.state=Ir(y.state,xe,y.answers),y.options=y.state.options,s.enqueue(re(y.state)),!0):(y.resolveResponse({answers:y.answers}),!0)}let j=y.options[v];return j?(y.methodLower.includes("requestapproval")?y.resolveResponse({decision:j}):y.resolveResponse({option:j,index:v}),!0):!1},D=typeof t.prompt=="string"?(async function*(){yield{type:"user",text:t.prompt,session_id:t.resumeSessionId??""}})():t.prompt;return(async()=>{try{await ce();for await(let v of D){let w=bo(v).trim();!w||await R(w)||await A(w)}}catch(v){K("session.error",{...ue({threadId:o,turnId:d}),error:$e(v)}),s.enqueue(de({success:!1,duration_ms:0,total_cost_usd:P,num_turns:b,result:$e(v),session_id:o??t.resumeSessionId??""}))}finally{K("client.close.start",ue({threadId:o,turnId:d})),await r.close().catch(()=>{}),K("client.close.done",ue({threadId:o,turnId:d})),s.close()}})(),{messages:s.messages(),async setPermissionMode(v){l=v,s.enqueue(Ee(v))},async submitPendingInputOption(v,w){return $(v,w)},async submitPendingInputText(v){return R(v)},async interrupt(){!o||!d||await Ke({client:r,methods:["turn/interrupt"],payloads:Rr({threadId:o,turnId:d}),timeoutMs:n.requestTimeoutMs}).catch(()=>{})},async close(){await r.close()}}}buildUserMessage(t,n){return{type:"user",text:t,session_id:n}}};function ko(e){if(e===void 0)return xr;let t=ur(e);return t.length>0?t:xr}import{spawn as Po}from"node:child_process";import{constants as Ro,accessSync as vo}from"node:fs";import{createServer as So}from"node:net";import{delimiter as xo,dirname as Xt,join as _r,sep as Io}from"node:path";var Co="OPENCLAW_OPENCODE_COMMAND",To=15e3,kt=6e4,_o=250,Mo=15*6e4,Ao=["edit","bash","task","todowrite","external_directory"];function Be(e){return e instanceof Error?e.message:String(e)}function Eo(e){try{return vo(e,Ro.X_OK),!0}catch{return!1}}function $o(e){return e.includes("/")||Io==="\\"&&e.includes("\\")}function Oo(e){let t=(e??"").split(xo).map(r=>r.trim()).filter(Boolean),n=[...t];for(let r of t)r.replaceAll("\\","/").endsWith("/opt/node/bin")&&n.push(_r(Xt(Xt(Xt(r))),"bin"));return n.push("/home/linuxbrew/.linuxbrew/bin","/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin"),[...new Set(n)]}function Bo(e,t=process.env.PATH){if($o(e))return e;for(let n of Oo(t)){let r=_r(n,e);if(Eo(r))return r}return e}function H(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function No(e){return typeof e?.cost=="number"&&Number.isFinite(e.cost)&&e.cost>=0?e.cost:0}function qo(e){if(typeof e=="string")return e;if(!H(e))return String(e);if(typeof e.text=="string")return e.text;let t=H(e.message)?e.message:void 0;return typeof t?.content=="string"?t.content:String(e)}function Mr(e){let t=e?.trim();if(!t)return;let n=t.indexOf("/");if(!(n<=0||n===t.length-1))return{providerID:t.slice(0,n),modelID:t.slice(n+1)}}function Lo(e){let t=Mr(e);return t?{id:t.modelID,providerID:t.providerID}:void 0}function Cr(e){let t=e??"default",n=t==="plan"?"deny":t==="bypassPermissions"?"allow":"ask";return Ao.map(r=>({permission:r,pattern:"*",action:n}))}function Yt(){let e=process.env.OPENCODE_SERVER_PASSWORD;if(!e)return{};let t=process.env.OPENCODE_SERVER_USERNAME||"opencode";return{Authorization:`Basic ${Buffer.from(`${t}:${e}`).toString("base64")}`}}async function Fo(){return new Promise((e,t)=>{let n=So();n.once("error",t),n.listen(0,"127.0.0.1",()=>{let r=n.address();n.close(()=>{r&&typeof r=="object"?e(r.port):t(new Error("Could not allocate local OpenCode server port."))})})})}async function Ar(e){await new Promise(t=>setTimeout(t,e))}async function bt(e,t){if(t.signal?.aborted)throw new Error(t.abortMessage??"Operation was aborted.");return await new Promise((n,r)=>{let s=!1,o=()=>{clearTimeout(a),t.signal?.removeEventListener("abort",d)},i=c=>{s||(s=!0,o(),c())},d=()=>{i(()=>r(new Error(t.abortMessage??"Operation was aborted.")))},a=setTimeout(()=>{i(()=>{t.onTimeout?.(),r(new Error(t.timeoutMessage))})},t.timeoutMs);t.signal?.addEventListener("abort",d,{once:!0}),e.then(c=>i(()=>n(c)),c=>i(()=>r(c)))})}async function Oe(e){e.exitCode===null&&await new Promise(t=>{let n,r=setTimeout(()=>{e.exitCode===null&&e.kill("SIGKILL"),n=setTimeout(t,1e3)},2e3);e.once("exit",()=>{clearTimeout(r),n&&clearTimeout(n),t()}),e.kill("SIGTERM")})}var en=class extends Error{constructor(n,r,s,o){super(`OpenCode ${n} ${r} failed with ${s}${o?`: ${o}`:""}`);this.method=n;this.path=r;this.status=s;this.body=o}method;path;status;body};function Wo(e){return e.headers.get("content-type")?.toLowerCase()??""}function tn(e){return e.replace(/\s+/g," ").trim().slice(0,300)}function Uo(e,t){return e.includes("text/html")||/^\s*<!doctype html\b/i.test(t)||/^\s*<html[\s>]/i.test(t)}function Do(e,t,n,r){let s=n?`content-type ${n}`:"missing content-type",o=tn(r),i=Uo(n,r)?" (looks like the OpenCode web UI HTML app shell)":"";return`OpenCode ${e} ${t} expected JSON API response but received ${s}${i}${o?`: ${o}`:""}`}function Ho(e,t,n){let r=Mr(t);return{...r?{model:{providerID:r.providerID,modelID:r.modelID}}:{},...n?.trim()?{system:n.trim()}:{},parts:[{type:"text",text:e}]}}function zo(e,t){if(!H(e))return!1;if(!(t in e))return!0;let n=e[t];return H(n)&&n.type==="idle"}function jo(e){return e.type==="session.idle"?!0:e.type!=="session.status"?!1:(e.properties.status??e.properties.type)==="idle"}var Tr=Promise.resolve();function Jo(e){return new Promise((t,n)=>{Tr=Tr.then(()=>e().then(t,n)).catch(()=>{})})}async function Qo(e){return Jo(async()=>{let t=await Fo(),n=process.env[Co]?.trim()||"opencode",r=Bo(n),s=["serve","--hostname","127.0.0.1","--port",String(t),"--print-logs"],o=e.fetch??fetch,i=Math.min(e.requestTimeoutMs??kt,1e4),d=e.startupTimeoutMs??To,a=Po(r,s,{cwd:e.cwd,stdio:["ignore","pipe","pipe"]}),c=`http://127.0.0.1:${t}`,l="",m="",u,b=(f,I)=>{let N=f+String(I);return N.length>8e3?N.slice(-8e3):N};a.stdout.on("data",f=>{l=b(l,f)}),a.stderr.on("data",f=>{m=b(m,f)}),a.once("error",f=>{u=f});let p=()=>` Command: ${n===r?r:`${r} (resolved from ${n})`} ${s.join(" ")}. Cwd: ${e.cwd}. Port: ${t}. PATH: ${process.env.PATH??""}.`,h=()=>{let f=[l.trim(),m.trim()].filter(Boolean).join(`
25
25
  `).trim();return`${p()}${f?` Output:
26
26
  ${f}`:""}`},P=()=>{Oe(a)};if(e.signal?.aborted)throw await Oe(a),new Error(`OpenCode server startup aborted before readiness.${h()}`);e.signal?.addEventListener("abort",P,{once:!0});try{let f=Date.now();for(;Date.now()-f<d;){if(e.signal?.aborted)throw await Oe(a),new Error(`OpenCode server startup aborted before readiness.${h()}`);if(u)throw new Error(`OpenCode server failed to start: ${u.message}${h()}`);if(a.exitCode!==null)throw new Error(`OpenCode server exited before readiness.${h()}`);try{if(await Ko({baseUrl:c,fetchImpl:o,requestTimeoutMs:i,startupSignal:e.signal,timeoutMessage:`OpenCode GET /api/health timed out after ${i}ms during server readiness.${h()}`,abortMessage:`OpenCode server startup aborted before readiness.${h()}`}))return{baseUrl:c,close:async()=>{await Oe(a)}}}catch{if(e.signal?.aborted)throw await Oe(a),new Error(`OpenCode server startup aborted before readiness.${h()}`)}await Ar(100)}throw await Oe(a),new Error(`Timed out waiting for OpenCode server readiness.${h()}`)}finally{e.signal?.removeEventListener("abort",P)}})}async function Go(e){for(let t=1;;t+=1)try{return await Qo(e)}catch(n){if(t>=3||!/EADDRINUSE|address already in use|bind: address already in use/i.test(Be(n)))throw n}}async function Ko(e){let t=new AbortController,n=()=>t.abort();e.startupSignal?.aborted?t.abort():e.startupSignal?.addEventListener("abort",n,{once:!0});try{return(await bt(e.fetchImpl(`${e.baseUrl}/api/health`,{headers:Yt(),signal:t.signal}),{timeoutMs:e.requestTimeoutMs,timeoutMessage:e.timeoutMessage,signal:e.startupSignal,abortMessage:e.abortMessage,onTimeout:()=>t.abort()})).ok}finally{e.startupSignal?.removeEventListener("abort",n)}}var nn=class{constructor(t,n,r=kt){this.baseUrl=t;this.fetchImpl=n;this.requestTimeoutMs=r}baseUrl;fetchImpl;requestTimeoutMs;async request(t,n,r,s={}){let o=new AbortController,i=!1,d=!1,a=s.timeoutMs??this.requestTimeoutMs,c=`OpenCode ${t} ${n} timed out after ${a}ms.`,l=`OpenCode ${t} ${n} was aborted.`,m=()=>{i=!0,o.abort()};s.signal?.aborted?(i=!0,o.abort()):s.signal?.addEventListener("abort",m,{once:!0});try{let u=await bt(this.fetchImpl(`${this.baseUrl}${n}`,{method:t,headers:{...Yt(),...r===void 0?{}:{"content-type":"application/json"}},body:r===void 0?void 0:JSON.stringify(r),signal:o.signal}),{timeoutMs:a,timeoutMessage:c,signal:s.signal,abortMessage:l,onTimeout:()=>{d=!0,o.abort()}});if(!u.ok){let h=await bt(u.text(),{timeoutMs:a,timeoutMessage:c,signal:s.signal,abortMessage:l,onTimeout:()=>{d=!0,o.abort()}}).catch(()=>"");throw new en(t,n,u.status,tn(h))}if(u.status===204)return;let b=await bt(u.text(),{timeoutMs:a,timeoutMessage:c,signal:s.signal,abortMessage:l,onTimeout:()=>{d=!0,o.abort()}});if(!b)return;let p=Wo(u);if(!p.includes("application/json")&&!p.includes("+json"))throw new Error(Do(t,n,p,b));try{return JSON.parse(b)}catch(h){let P=tn(b);throw new Error(`OpenCode ${t} ${n} returned invalid JSON: ${Be(h)}${P?`: ${P}`:""}`)}}catch(u){if(o.signal.aborted){if(d)throw new Error(`OpenCode ${t} ${n} timed out after ${a}ms.`);if(i)throw new Error(`OpenCode ${t} ${n} was aborted.`)}throw u}finally{s.signal?.removeEventListener("abort",m)}}async streamEvents(t,n){let r=await this.fetchImpl(`${this.baseUrl}/event`,{headers:Yt(),signal:n});if(!r.ok)throw new Error(`OpenCode event stream failed with ${r.status}`);if(!r.body)return;let s=r.body.getReader(),o=new TextDecoder,i="",d=async c=>{let l=c.split(/\r?\n/).filter(m=>m.startsWith("data:")).map(m=>m.slice(5).trimStart()).join(`
27
27
  `).trim();!l||l==="[DONE]"||await t(JSON.parse(l))};for(;;){let{done:c,value:l}=await s.read();if(c)break;i+=o.decode(l,{stream:!0});let m=/\r?\n\r?\n/.exec(i);for(;m;){let u=i.slice(0,m.index);i=i.slice(m.index+m[0].length),await d(u),m=/\r?\n\r?\n/.exec(i)}}let a=i.trim();a&&await d(a)}};function Zo(e){let t=H(e)&&H(e.payload)?e.payload:e;return H(t)?t.type==="sync"?{type:typeof t.name=="string"?t.name.replace(/\.\d+$/,""):void 0,properties:H(t.data)?t.data:{}}:{type:typeof t.type=="string"?t.type:void 0,properties:H(t.properties)?t.properties:t}:{properties:{}}}function Vo(e){return typeof e.sessionID=="string"?e.sessionID:void 0}function Xo(e){let t=typeof e.id=="string"?e.id:"opencode-permission",n=typeof e.permission=="string"?e.permission:"permission",r=Array.isArray(e.patterns)?e.patterns.filter(i=>typeof i=="string"):[],s=r.length>0?`OpenCode requests ${n} permission for ${r.join(", ")}.`:`OpenCode requests ${n} permission.`,o=[{kind:"approval",label:"Allow once",decision:"accept",responseDecision:"once"},{kind:"approval",label:"Always allow",decision:"acceptForSession",responseDecision:"always"},{kind:"approval",label:"Reject",decision:"decline",responseDecision:"reject"}];return{requestId:t,kind:"approval",promptText:s,options:o.map(i=>i.label),actions:o,responseMode:"structured"}}function Yo(e){let t=typeof e.id=="string"?e.id:"opencode-question",n=typeof e.question=="string"?e.question:typeof e.prompt=="string"?e.prompt:"OpenCode is asking for input.",r=_e(e),s=ut(e),o=r.length>0?r:[{id:t,question:n,options:s,allowsFreeText:!0}],i=o.length>0?0:void 0,d=i!=null?o[i]:void 0,a=d?.options.map(c=>c.label)??s.map(c=>c.label);return{requestId:t,kind:"question",promptText:d?ae(d,i??0,o.length):n,options:a,...o.length>0?{questions:o}:{},...i!=null?{activeQuestionIndex:i}:{},allowsFreeText:!0}}function ei(e,t,n){let r=e.questions??[],s=r[t],o=s?.options.map(i=>i.label)??[];return{...e,promptText:s?ae(s,t,r.length):e.promptText,options:o,activeQuestionIndex:t,answers:n}}function ti(e,t){return e.length===1?t[e[0].id]?.answers.join(", ")??"":e.map((n,r)=>{let s=t[n.id]?.answers.join(", ")??"";return`Q${r+1}: ${n.question}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{$ as Zo,A as de,Aa as qt,B as br,C as Rr,D as Ar,E as Rt,F as At,G as It,H as Tt,I as zo,J as Ho,K as C,L as D,M as z,N as Qo,O as xt,P as Yo,Pa as Vt,Q as Ir,R as L,S as Ct,T as Je,U as Mt,V as Jo,W as Xo,X as Ee,Y as oe,Z as Xe,_ as _t,a as Te,aa as H,b as xe,ba as Tr,c as wr,ca as xr,d as qo,da as Ze,e as Ce,ea as et,f as ue,fa as B,g as Z,ga as Dt,h as le,ha as ei,i as Ye,ia as tt,j as Vo,ja as ie,k as _,ka as Ne,l as Uo,la as ti,m as Y,ma as $t,n as Me,na as nt,o as Pt,oa as Et,p as ce,pa as Nt,q as _e,qa as Oe,r as wt,ra as Ot,s as bt,sa as ni,t as Go,ta as Wt,u as De,ua as Ft,v as $e,va as ri,w as jo,wa as Lt,x as p,xa as Bt,y as k,ya as Kt,z as $,za as Se}from"./chunks/chunk.js";import{readdirSync as hf,statSync as yf,rmSync as Sf}from"fs";import{execFileSync as kf}from"child_process";import{join as Bo}from"path";var oi={name:"openclaw-code-agent",version:"4.7.11",type:"module",packageManager:"pnpm@11.15.1",main:"dist/index.js",scripts:{"audit:prod":"pnpm audit --prod",build:"esbuild index.ts --bundle --splitting --platform=node --target=node22 --format=esm --outdir=dist --entry-names=index --chunk-names=chunks/[name] --minify --charset=utf8 --pure:console.log --pure:console.warn --pure:console.info --pure:console.debug --external:@anthropic-ai/claude-agent-sdk --external:openclaw/plugin-sdk/plugin-entry","generate:npm-shrinkwrap":"node scripts/generate-npm-shrinkwrap.mjs","check-static-guardrails":"node scripts/check-static-guardrails.mjs && node scripts/check-npm-shrinkwrap.mjs","check-plugin-security":"node scripts/check-plugin-security.mjs",test:"node scripts/run-tests.mjs","test:integ:crabbox":"node scripts/run-tests.mjs tests/oca-codex-crabbox-integ.test.ts tests/oca-plugin-workflows-integ.test.ts tests/oca-codex-telegram-proof.test.ts tests/oca-codex-proof-app-server.test.ts tests/oca-codex-proof-workflow.test.ts","test:serial":"node scripts/run-tests.mjs","test:file":"node scripts/run-tests.mjs","smoke:backend":"node scripts/run-tests.mjs tests/codex-harness.test.ts tests/plan-mode-e2e.test.ts tests/session-restore-service.test.ts","smoke:backend-parity":"node scripts/run-tests.mjs tests/backend-contract-smoke.test.ts tests/codex-harness.test.ts tests/harness-registry.test.ts","smoke:codex-worktrees":"node scripts/run-tests.mjs tests/codex-harness.test.ts tests/session-bootstrap.test.ts tests/session-restore-service.test.ts","smoke:codex-live":"OPENCLAW_RUN_LIVE_CODEX_SMOKE=1 node scripts/run-tests.mjs tests/live-codex-app-server-smoke.test.ts","proof:codex-doctor":"node --import tsx scripts/e2e/oca-codex-telegram-proof.ts doctor","proof:codex-local":"node --import tsx scripts/e2e/oca-codex-telegram-proof.ts local-smoke","proof:codex-telegram":"node scripts/e2e/run-oca-codex-telegram-proof.mjs","smoke:codex-release":"OPENCLAW_RUN_LIVE_CODEX_RELEASE_SMOKE=1 node scripts/run-tests.mjs tests/live-codex-app-server-smoke.test.ts","smoke:opencode-live":"OPENCLAW_RUN_LIVE_OPENCODE_SMOKE=1 node scripts/run-tests.mjs tests/live-opencode-server-smoke.test.ts",typecheck:"tsc -p tsconfig.typecheck.json --noEmit","validate:release-metadata":"node scripts/validate-release-metadata.mjs","verify:npm-consumer":"node scripts/verify-npm-consumer-install.mjs",verify:"pnpm check-static-guardrails && pnpm typecheck && pnpm build && pnpm test"},openclaw:{extensions:["./dist/index.js"],install:{npmSpec:"openclaw-code-agent",defaultChoice:"npm",minHostVersion:">=2026.8.2"},compat:{pluginApi:">=2026.8.1",minGatewayVersion:"2026.8.1"},build:{openclawVersion:"2026.8.2",pluginSdkVersion:"2026.8.2"}},files:["dist/","skills/","openclaw.plugin.json","npm-shrinkwrap.json","README.md","LICENSE"],dependencies:{"@anthropic-ai/claude-agent-sdk":"0.3.251","@anthropic-ai/sdk":"0.122.0","@hono/node-server":"2.1.1","@modelcontextprotocol/sdk":"1.30.0","express-rate-limit":"8.7.0","fast-uri":"3.1.5",hono:"4.12.34","ip-address":"10.7.0",zod:"4.5.4"},devDependencies:{"@types/node":"^26.0.1",esbuild:"^0.28.1",nanoid:"^6.0.0",openclaw:"2026.8.2",tsx:"^4.21.0",typescript:"^7.0.2"},keywords:["openclaw","plugin","claude","claude-code","opencode","coding-agent","codex","ai","anthropic","agent","code-generation","automation","cli","background-process","developer-tools"],repository:{type:"git",url:"git+https://github.com/goldmar/openclaw-code-agent.git"},homepage:"https://github.com/goldmar/openclaw-code-agent#readme",bugs:{url:"https://github.com/goldmar/openclaw-code-agent/issues"},license:"MIT",author:"Mark Goldenstein",publishConfig:{access:"public",provenance:!0},description:"An OpenClaw plugin that orchestrates coding agent sessions as managed background processes. Launch, monitor, and control coding agents (Claude Code, Codex, experimental OpenCode, and more) directly from your AI gateway.",peerDependencies:{openclaw:">=2026.8.1"}};import{execFile as xl}from"node:child_process";import{mkdirSync as Cl,readFileSync as Ml,renameSync as _l,writeFileSync as Dl}from"node:fs";import{dirname as $l,join as El}from"node:path";import{promisify as Nl}from"node:util";import*as pi from"child_process";import{createHash as fl}from"crypto";var W="code-agent";var gl=new Set(["1","true","yes","on"]);function Mr(){let n=process.env.OPENCLAW_CODE_AGENT_BUTTON_DIAGNOSTICS?.trim().toLowerCase();return!!(n&&gl.has(n))}function K(n){if(!(typeof n!="string"||n.length===0))return fl("sha256").update(n).digest("hex").slice(0,12)}function ii(n){return typeof n.callbackData=="string"?n.callbackData:typeof n.value=="string"?n.value:void 0}function E(n){let e=(n??[]).filter(r=>Array.isArray(r)&&r.length>0),t=e.flat();return{buttonRows:e.length||void 0,buttonCount:t.length||void 0,buttonLabels:t.length>0?t.map(r=>typeof r.label=="string"?r.label:void 0):void 0,callbackByteLengths:t.length>0?t.map(r=>{let o=ii(r);return o?Buffer.byteLength(o,"utf8"):void 0}):void 0,callbackHashes:t.length>0?t.map(r=>K(ii(r))):void 0,buttonStyles:t.length>0?t.map(r=>typeof r.style=="string"?r.style:void 0):void 0}}function pe(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:void 0}function ai(n){let e=pe(n),t=Array.isArray(e?.blocks)?e.blocks:void 0;if(t)return t.map(r=>pe(r)?.type).filter(r=>typeof r=="string"&&r.length>0)}function li(n){let e=pe(n),t=Array.isArray(e?.blocks)?e.blocks:void 0;if(!t)return;let r=t.map(o=>{let i=pe(o);return i?.type!=="buttons"||!Array.isArray(i.buttons)?[]:i.buttons}).filter(o=>o.length>0);return r.length>0?r:void 0}function _r(n){let e=li(n);return{presentationBlockTypes:ai(n),...E(e)}}function Dr(n){let e=pe(n),t=e?.interactive,r=pe(e?.channelData),o=pe(r?.telegram),i=Array.isArray(o?.buttons)?o.buttons:void 0;return{renderedPayloadKeys:e?Object.keys(e).sort():void 0,interactiveBlockTypes:ai(t),...si("interactive",E(li(t))),...si("telegramChannelData",E(i)),hasPresentation:!!e?.presentation,hasInteractive:!!t,hasTelegramChannelDataButtons:!!i?.some(s=>s.length>0)}}function di(n){let e=pe(n);return e?{sendResultKeys:Object.keys(e).sort(),messageId:Cr(e.messageId),chatId:Cr(e.chatId),telegramThreadId:Cr(e.messageThreadId??e.threadId),channel:typeof e.channel=="string"?e.channel:void 0}:{sendResultType:typeof n}}function Cr(n){return typeof n=="string"||typeof n=="number"?n:void 0}function si(n,e){let t={};for(let[r,o]of Object.entries(e))o!==void 0&&(t[`${n}${r.charAt(0).toUpperCase()}${r.slice(1)}`]=o);return t}function M(n,e){if(!Mr())return;let t=Object.fromEntries(Object.entries(e).filter(([,r])=>r!==void 0));`${JSON.stringify({event:n,callbackNamespace:W,...t})}`}var ui=5e3,mi=64,hl={primary:"primary",success:"success",positive:"success",danger:"danger",destructive:"danger",negative:"danger"},yl={execFile:pi.execFile},me=class extends Error{constructor(e){super(e),this.name="MissingRuntimeDirectNotificationCapabilityError"}},We=class{constructor(e=yl.execFile){this.execFile=e}execFile;async send(e,t,r){M("direct_send_started",{...J(e),messageTextLength:t.length,...E(r)});try{await this.sendViaRuntime(e,t,r),M("direct_send_succeeded",{...J(e),deliveryPath:"runtime",...E(r)});return}catch(o){if(!(o instanceof me))throw M("direct_send_failed",{...J(e),deliveryPath:"runtime",...E(r),error:$r(o)}),o;M("direct_send_runtime_capability_missing",{...J(e),deliveryPath:"runtime",...E(r),reason:o.message}),await this.sendViaBoundedCliFallback(e,t,r,o.message),M("direct_send_succeeded",{...J(e),deliveryPath:"cli-fallback",...E(r)})}}async sendViaRuntime(e,t,r){let o=xe(),i=qo(),s=o?.channel?.outbound?.loadAdapter;if(!o)throw new me("OpenClaw plugin runtime is unavailable for direct notification delivery");if(i==null)throw new me("OpenClaw runtime config snapshot is unavailable for direct notification delivery");if(!o.channel)throw new me(`OpenClaw plugin runtime channel surface is unavailable for direct notification delivery (runtimeVersion=${Er(o)})`);if(!o.channel.outbound)throw new me(`OpenClaw plugin runtime channel outbound surface is unavailable for direct notification delivery (runtimeVersion=${Er(o)})`);if(!s)throw new me(`OpenClaw plugin runtime channel outbound loadAdapter is unavailable for direct notification delivery (runtimeVersion=${Er(o)})`);let a=await s(e.channel);if(!a)throw new Error(`OpenClaw outbound adapter for channel "${e.channel}" is unavailable`);let l=jt(r);if(M("runtime_adapter_loaded",{...J(e),adapterHasRenderPresentation:typeof a.renderPresentation=="function",adapterHasSendPayload:typeof a.sendPayload=="function",adapterHasSendText:typeof a.sendText=="function",...E(r),...l?_r(l):{}}),l){await this.sendPresentation(a,i,e,t,l);return}if(!a.sendText)throw new Error(`OpenClaw outbound adapter for channel "${e.channel}" cannot send text`);await a.sendText({cfg:i,to:e.target,text:t,accountId:e.accountId,threadId:e.threadId})}async sendPresentation(e,t,r,o,i){let s=kl(i),a={text:o,presentation:i,interactive:s};M("presentation_render_started",{...J(r),messageTextLength:o.length,adapterHasRenderPresentation:typeof e.renderPresentation=="function",adapterHasSendPayload:typeof e.sendPayload=="function",..._r(i)});let l={cfg:t,to:r.target,text:o,payload:a,accountId:r.accountId,threadId:r.threadId},d=e.renderPresentation?await e.renderPresentation({payload:a,presentation:i,ctx:l}):a,u=Pl(d,s,r.channel);if(M("presentation_render_completed",{...J(r),adapterHasRenderPresentation:typeof e.renderPresentation=="function",adapterHasSendPayload:typeof e.sendPayload=="function",...Dr(u)}),!u||typeof u!="object"||!e.sendPayload)throw new Error(`OpenClaw outbound adapter for channel "${r.channel}" cannot preserve interactive presentation`);let f=await e.sendPayload({...l,payload:u});M("presentation_send_payload_completed",{...J(r),...Dr(u),...di(f)})}sendViaBoundedCliFallback(e,t,r,o){return new Promise((i,s)=>{let a=Sl(e,t,r);M("direct_send_cli_fallback_started",{...J(e),deliveryPath:"cli-fallback",reason:o,messageTextLength:t.length,...E(r)}),this.execFile("openclaw",a,{timeout:ui,killSignal:"SIGKILL"},(l,d,u)=>{if(!l){M("direct_send_cli_fallback_completed",{...J(e),deliveryPath:"cli-fallback",...E(r)}),i();return}let f=u?.trim()?` | stderr: ${u.trim()}`:"";M("direct_send_cli_fallback_failed",{...J(e),deliveryPath:"cli-fallback",...E(r),error:$r(l),stderrLength:u?.length}),s(new Error(`${o}; bounded openclaw message send fallback failed within ${ui}ms timeout: ${$r(l)}${f}`))})})}};function J(n){return{channel:n.channel,target:n.target,accountId:n.accountId,threadId:n.threadId,sessionKey:n.sessionKey}}function Sl(n,e,t){let r=jt(t),o=["message","send","--channel",n.channel,"--target",n.target,"--message",e];return n.accountId&&o.push("--account",n.accountId),n.threadId&&o.push("--thread-id",n.threadId),r&&o.push("--presentation",JSON.stringify(r)),o}function $r(n){return n instanceof Error?n.message:String(n)}function Er(n){if(!n||typeof n!="object")return"unknown";let e=n.version;return typeof e=="string"&&e.trim()?e:"unknown"}function jt(n){let e=(n??[]).filter(t=>Array.isArray(t)&&t.length>0).map(t=>({type:"buttons",buttons:t.map(r=>({label:r.label,value:Tl(r.callbackData),...r.style?{style:r.style}:{}}))}));return e.length>0?{blocks:e}:void 0}function kl(n){let e=n.blocks.filter(t=>t.type==="buttons"&&t.buttons.length>0).map(t=>({type:"buttons",buttons:t.buttons.map(r=>({label:r.label,value:r.value,...r.style?{style:r.style}:{}}))}));return e.length>0?{blocks:e}:void 0}function vl(n){if(!n||typeof n!="object"||Array.isArray(n))return!1;let e=n.interactive;if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e.blocks;return Array.isArray(t)&&t.some(r=>{if(!r||typeof r!="object"||Array.isArray(r))return!1;let o=r;return o.type==="buttons"&&Array.isArray(o.buttons)&&o.buttons.length>0})}function Pl(n,e,t){if(!e)return n;let r=vl(n)?n:wl(n,e);return t!=="telegram"?r:bl(r,e)}function wl(n,e){return!n||typeof n!="object"||Array.isArray(n)?n:{...n,interactive:e}}function bl(n,e){if(!n||typeof n!="object"||Array.isArray(n))return n;let t=n,r=Fe(t.channelData),o=Fe(r?.telegram),i=Al(o?.buttons);if(i)return{...t,channelData:{...r??{},telegram:{...o??{},buttons:i}}};let s=Rl(e);return s?{...t,channelData:{...r??{},telegram:{...o??{},buttons:s}}}:n}function Rl(n){let e=n.blocks.filter(t=>t.type==="buttons"&&t.buttons.length>0).map(t=>t.buttons.filter(r=>typeof r.value=="string"&&r.value.trim().length>0&&Buffer.byteLength(r.value,"utf8")<=mi).map(r=>({text:r.label,callback_data:r.value,...fi(r.style)}))).filter(t=>t.length>0);return e.length>0?e:void 0}function Al(n){if(!Array.isArray(n))return;let e=n.map(t=>Array.isArray(t)?t.map(r=>{if(!r||typeof r!="object"||Array.isArray(r))return;let{style:o,...i}=r;if(!(typeof i.text!="string"||i.text.trim().length===0)&&!(i.callback_data!==void 0&&(typeof i.callback_data!="string"||i.callback_data.trim().length===0||Buffer.byteLength(i.callback_data,"utf8")>mi))&&Il(i))return{...i,...fi(o)}}).filter(r=>!!r):[]).filter(t=>t.length>0);return e.length>0?e:void 0}function Il(n){return Gt(n.callback_data)||Gt(n.url)||Ut(n.web_app)||Ut(n.webApp)||Ut(n.login_url)||Ut(n.loginUrl)||typeof n.switch_inline_query=="string"||typeof n.switch_inline_query_current_chat=="string"||Fe(n.switch_inline_query_chosen_chat)!==void 0||Fe(n.callback_game)!==void 0||n.pay===!0||ci(n.copy_text)||ci(n.copyText)}function Gt(n){return typeof n=="string"&&n.trim().length>0}function Ut(n){let e=Fe(n);return Gt(e?.url)}function ci(n){let e=Fe(n);return Gt(e?.text)}function fi(n){if(typeof n!="string")return{};let e=n.trim().toLowerCase(),t=hl[e];return t?{style:t}:{}}function Fe(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:void 0}function Tl(n){return n.startsWith(`${W}:`)?n:`${W}:${n}`}var Ol=Nl(xl),rt="openclaw-code-agent",Wl=`https://registry.npmjs.org/${encodeURIComponent(rt)}/latest`,Fl="openclaw-code-agent-auto-update.json",Si=1440*60*1e3,Ll=7*Si,Bl=1e4,Le="plugin:auto-update";function fe(n){return!!n&&typeof n=="object"&&!Array.isArray(n)}function Nr(n){return n instanceof Error?n.message:String(n)}function te(n){return n?.trim().replace(/^v/i,"")||void 0}function ee(n,e){let t=n[e];return typeof t=="string"&&t.trim()?t.trim():void 0}function gi(n){let e=n?.trim().replace(/^npm:/,"");if(!e)return;if(e.startsWith("@")){let r=e.indexOf("@",1);return r===-1?e:e.slice(0,r)}let t=e.indexOf("@");return t===-1?e:e.slice(0,t)}function Or(n){let e=`${n.stdout}
1
+ import{$ as Zo,A as de,Aa as qt,B as br,C as Rr,D as Ar,E as Rt,F as At,G as It,H as Tt,I as zo,J as Ho,K as C,L as D,M as z,N as Qo,O as xt,P as Yo,Pa as Vt,Q as Ir,R as L,S as Ct,T as Je,U as Mt,V as Jo,W as Xo,X as Ee,Y as oe,Z as Xe,_ as _t,a as Te,aa as H,b as xe,ba as Tr,c as wr,ca as xr,d as qo,da as Ze,e as Ce,ea as et,f as ue,fa as B,g as Z,ga as Dt,h as le,ha as ei,i as Ye,ia as tt,j as Vo,ja as ie,k as _,ka as Ne,l as Uo,la as ti,m as Y,ma as $t,n as Me,na as nt,o as Pt,oa as Et,p as ce,pa as Nt,q as _e,qa as Oe,r as wt,ra as Ot,s as bt,sa as ni,t as Go,ta as Wt,u as De,ua as Ft,v as $e,va as ri,w as jo,wa as Lt,x as p,xa as Bt,y as k,ya as Kt,z as $,za as Se}from"./chunks/chunk.js";import{readdirSync as hf,statSync as yf,rmSync as Sf}from"fs";import{execFileSync as kf}from"child_process";import{join as Bo}from"path";var oi={name:"openclaw-code-agent",version:"4.7.13",type:"module",packageManager:"pnpm@11.15.1",main:"dist/index.js",scripts:{"audit:prod":"pnpm audit --prod",build:"esbuild index.ts --bundle --splitting --platform=node --target=node22 --format=esm --outdir=dist --entry-names=index --chunk-names=chunks/[name] --minify --charset=utf8 --pure:console.log --pure:console.warn --pure:console.info --pure:console.debug --external:@anthropic-ai/claude-agent-sdk --external:openclaw/plugin-sdk/plugin-entry","generate:npm-shrinkwrap":"node scripts/generate-npm-shrinkwrap.mjs","check-static-guardrails":"node scripts/check-static-guardrails.mjs && node scripts/check-npm-shrinkwrap.mjs","check-plugin-security":"node scripts/check-plugin-security.mjs",test:"node scripts/run-tests.mjs","test:integ:crabbox":"node scripts/run-tests.mjs tests/oca-codex-crabbox-integ.test.ts tests/oca-plugin-workflows-integ.test.ts tests/oca-codex-telegram-proof.test.ts tests/oca-codex-proof-app-server.test.ts tests/oca-codex-proof-workflow.test.ts","test:serial":"node scripts/run-tests.mjs","test:file":"node scripts/run-tests.mjs","smoke:backend":"node scripts/run-tests.mjs tests/codex-harness.test.ts tests/plan-mode-e2e.test.ts tests/session-restore-service.test.ts","smoke:backend-parity":"node scripts/run-tests.mjs tests/backend-contract-smoke.test.ts tests/codex-harness.test.ts tests/harness-registry.test.ts","smoke:codex-worktrees":"node scripts/run-tests.mjs tests/codex-harness.test.ts tests/session-bootstrap.test.ts tests/session-restore-service.test.ts","smoke:codex-live":"OPENCLAW_RUN_LIVE_CODEX_SMOKE=1 node scripts/run-tests.mjs tests/live-codex-app-server-smoke.test.ts","proof:codex-doctor":"node --import tsx scripts/e2e/oca-codex-telegram-proof.ts doctor","proof:codex-local":"node --import tsx scripts/e2e/oca-codex-telegram-proof.ts local-smoke","proof:codex-telegram":"node scripts/e2e/run-oca-codex-telegram-proof.mjs","smoke:codex-release":"OPENCLAW_RUN_LIVE_CODEX_RELEASE_SMOKE=1 node scripts/run-tests.mjs tests/live-codex-app-server-smoke.test.ts","smoke:opencode-live":"OPENCLAW_RUN_LIVE_OPENCODE_SMOKE=1 node scripts/run-tests.mjs tests/live-opencode-server-smoke.test.ts",typecheck:"tsc -p tsconfig.typecheck.json --noEmit","validate:release-metadata":"node scripts/validate-release-metadata.mjs","verify:npm-consumer":"node scripts/verify-npm-consumer-install.mjs",verify:"pnpm check-static-guardrails && pnpm typecheck && pnpm build && pnpm test"},openclaw:{extensions:["./dist/index.js"],install:{npmSpec:"openclaw-code-agent",defaultChoice:"npm",minHostVersion:">=2026.9.1"},compat:{pluginApi:">=2026.8.1",minGatewayVersion:"2026.8.1"},build:{openclawVersion:"2026.9.1",pluginSdkVersion:"2026.9.1"}},files:["dist/","skills/","openclaw.plugin.json","npm-shrinkwrap.json","README.md","LICENSE"],dependencies:{"@anthropic-ai/claude-agent-sdk":"0.3.251","@anthropic-ai/sdk":"0.122.0","@hono/node-server":"2.1.1","@modelcontextprotocol/sdk":"1.30.0","express-rate-limit":"8.7.0","fast-uri":"3.1.6",hono:"4.12.34","ip-address":"10.7.0",qs:"6.16.0",zod:"4.5.4"},devDependencies:{"@types/node":"^26.0.1",esbuild:"^0.28.1",nanoid:"^6.0.0",openclaw:"2026.9.1",tsx:"^4.21.0",typescript:"^7.0.2"},keywords:["openclaw","plugin","claude","claude-code","opencode","coding-agent","codex","ai","anthropic","agent","code-generation","automation","cli","background-process","developer-tools"],repository:{type:"git",url:"git+https://github.com/goldmar/openclaw-code-agent.git"},homepage:"https://github.com/goldmar/openclaw-code-agent#readme",bugs:{url:"https://github.com/goldmar/openclaw-code-agent/issues"},license:"MIT",author:"Mark Goldenstein",publishConfig:{access:"public",provenance:!0},description:"An OpenClaw plugin that orchestrates coding agent sessions as managed background processes. Launch, monitor, and control coding agents (Claude Code, Codex, experimental OpenCode, and more) directly from your AI gateway.",peerDependencies:{openclaw:">=2026.8.1"}};import{execFile as xl}from"node:child_process";import{mkdirSync as Cl,readFileSync as Ml,renameSync as _l,writeFileSync as Dl}from"node:fs";import{dirname as $l,join as El}from"node:path";import{promisify as Nl}from"node:util";import*as pi from"child_process";import{createHash as fl}from"crypto";var W="code-agent";var gl=new Set(["1","true","yes","on"]);function Mr(){let n=process.env.OPENCLAW_CODE_AGENT_BUTTON_DIAGNOSTICS?.trim().toLowerCase();return!!(n&&gl.has(n))}function K(n){if(!(typeof n!="string"||n.length===0))return fl("sha256").update(n).digest("hex").slice(0,12)}function ii(n){return typeof n.callbackData=="string"?n.callbackData:typeof n.value=="string"?n.value:void 0}function E(n){let e=(n??[]).filter(r=>Array.isArray(r)&&r.length>0),t=e.flat();return{buttonRows:e.length||void 0,buttonCount:t.length||void 0,buttonLabels:t.length>0?t.map(r=>typeof r.label=="string"?r.label:void 0):void 0,callbackByteLengths:t.length>0?t.map(r=>{let o=ii(r);return o?Buffer.byteLength(o,"utf8"):void 0}):void 0,callbackHashes:t.length>0?t.map(r=>K(ii(r))):void 0,buttonStyles:t.length>0?t.map(r=>typeof r.style=="string"?r.style:void 0):void 0}}function pe(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:void 0}function ai(n){let e=pe(n),t=Array.isArray(e?.blocks)?e.blocks:void 0;if(t)return t.map(r=>pe(r)?.type).filter(r=>typeof r=="string"&&r.length>0)}function li(n){let e=pe(n),t=Array.isArray(e?.blocks)?e.blocks:void 0;if(!t)return;let r=t.map(o=>{let i=pe(o);return i?.type!=="buttons"||!Array.isArray(i.buttons)?[]:i.buttons}).filter(o=>o.length>0);return r.length>0?r:void 0}function _r(n){let e=li(n);return{presentationBlockTypes:ai(n),...E(e)}}function Dr(n){let e=pe(n),t=e?.interactive,r=pe(e?.channelData),o=pe(r?.telegram),i=Array.isArray(o?.buttons)?o.buttons:void 0;return{renderedPayloadKeys:e?Object.keys(e).sort():void 0,interactiveBlockTypes:ai(t),...si("interactive",E(li(t))),...si("telegramChannelData",E(i)),hasPresentation:!!e?.presentation,hasInteractive:!!t,hasTelegramChannelDataButtons:!!i?.some(s=>s.length>0)}}function di(n){let e=pe(n);return e?{sendResultKeys:Object.keys(e).sort(),messageId:Cr(e.messageId),chatId:Cr(e.chatId),telegramThreadId:Cr(e.messageThreadId??e.threadId),channel:typeof e.channel=="string"?e.channel:void 0}:{sendResultType:typeof n}}function Cr(n){return typeof n=="string"||typeof n=="number"?n:void 0}function si(n,e){let t={};for(let[r,o]of Object.entries(e))o!==void 0&&(t[`${n}${r.charAt(0).toUpperCase()}${r.slice(1)}`]=o);return t}function M(n,e){if(!Mr())return;let t=Object.fromEntries(Object.entries(e).filter(([,r])=>r!==void 0));`${JSON.stringify({event:n,callbackNamespace:W,...t})}`}var ui=5e3,mi=64,hl={primary:"primary",success:"success",positive:"success",danger:"danger",destructive:"danger",negative:"danger"},yl={execFile:pi.execFile},me=class extends Error{constructor(e){super(e),this.name="MissingRuntimeDirectNotificationCapabilityError"}},We=class{constructor(e=yl.execFile){this.execFile=e}execFile;async send(e,t,r){M("direct_send_started",{...J(e),messageTextLength:t.length,...E(r)});try{await this.sendViaRuntime(e,t,r),M("direct_send_succeeded",{...J(e),deliveryPath:"runtime",...E(r)});return}catch(o){if(!(o instanceof me))throw M("direct_send_failed",{...J(e),deliveryPath:"runtime",...E(r),error:$r(o)}),o;M("direct_send_runtime_capability_missing",{...J(e),deliveryPath:"runtime",...E(r),reason:o.message}),await this.sendViaBoundedCliFallback(e,t,r,o.message),M("direct_send_succeeded",{...J(e),deliveryPath:"cli-fallback",...E(r)})}}async sendViaRuntime(e,t,r){let o=xe(),i=qo(),s=o?.channel?.outbound?.loadAdapter;if(!o)throw new me("OpenClaw plugin runtime is unavailable for direct notification delivery");if(i==null)throw new me("OpenClaw runtime config snapshot is unavailable for direct notification delivery");if(!o.channel)throw new me(`OpenClaw plugin runtime channel surface is unavailable for direct notification delivery (runtimeVersion=${Er(o)})`);if(!o.channel.outbound)throw new me(`OpenClaw plugin runtime channel outbound surface is unavailable for direct notification delivery (runtimeVersion=${Er(o)})`);if(!s)throw new me(`OpenClaw plugin runtime channel outbound loadAdapter is unavailable for direct notification delivery (runtimeVersion=${Er(o)})`);let a=await s(e.channel);if(!a)throw new Error(`OpenClaw outbound adapter for channel "${e.channel}" is unavailable`);let l=jt(r);if(M("runtime_adapter_loaded",{...J(e),adapterHasRenderPresentation:typeof a.renderPresentation=="function",adapterHasSendPayload:typeof a.sendPayload=="function",adapterHasSendText:typeof a.sendText=="function",...E(r),...l?_r(l):{}}),l){await this.sendPresentation(a,i,e,t,l);return}if(!a.sendText)throw new Error(`OpenClaw outbound adapter for channel "${e.channel}" cannot send text`);await a.sendText({cfg:i,to:e.target,text:t,accountId:e.accountId,threadId:e.threadId})}async sendPresentation(e,t,r,o,i){let s=kl(i),a={text:o,presentation:i,interactive:s};M("presentation_render_started",{...J(r),messageTextLength:o.length,adapterHasRenderPresentation:typeof e.renderPresentation=="function",adapterHasSendPayload:typeof e.sendPayload=="function",..._r(i)});let l={cfg:t,to:r.target,text:o,payload:a,accountId:r.accountId,threadId:r.threadId},d=e.renderPresentation?await e.renderPresentation({payload:a,presentation:i,ctx:l}):a,u=Pl(d,s,r.channel);if(M("presentation_render_completed",{...J(r),adapterHasRenderPresentation:typeof e.renderPresentation=="function",adapterHasSendPayload:typeof e.sendPayload=="function",...Dr(u)}),!u||typeof u!="object"||!e.sendPayload)throw new Error(`OpenClaw outbound adapter for channel "${r.channel}" cannot preserve interactive presentation`);let f=await e.sendPayload({...l,payload:u});M("presentation_send_payload_completed",{...J(r),...Dr(u),...di(f)})}sendViaBoundedCliFallback(e,t,r,o){return new Promise((i,s)=>{let a=Sl(e,t,r);M("direct_send_cli_fallback_started",{...J(e),deliveryPath:"cli-fallback",reason:o,messageTextLength:t.length,...E(r)}),this.execFile("openclaw",a,{timeout:ui,killSignal:"SIGKILL"},(l,d,u)=>{if(!l){M("direct_send_cli_fallback_completed",{...J(e),deliveryPath:"cli-fallback",...E(r)}),i();return}let f=u?.trim()?` | stderr: ${u.trim()}`:"";M("direct_send_cli_fallback_failed",{...J(e),deliveryPath:"cli-fallback",...E(r),error:$r(l),stderrLength:u?.length}),s(new Error(`${o}; bounded openclaw message send fallback failed within ${ui}ms timeout: ${$r(l)}${f}`))})})}};function J(n){return{channel:n.channel,target:n.target,accountId:n.accountId,threadId:n.threadId,sessionKey:n.sessionKey}}function Sl(n,e,t){let r=jt(t),o=["message","send","--channel",n.channel,"--target",n.target,"--message",e];return n.accountId&&o.push("--account",n.accountId),n.threadId&&o.push("--thread-id",n.threadId),r&&o.push("--presentation",JSON.stringify(r)),o}function $r(n){return n instanceof Error?n.message:String(n)}function Er(n){if(!n||typeof n!="object")return"unknown";let e=n.version;return typeof e=="string"&&e.trim()?e:"unknown"}function jt(n){let e=(n??[]).filter(t=>Array.isArray(t)&&t.length>0).map(t=>({type:"buttons",buttons:t.map(r=>({label:r.label,value:Tl(r.callbackData),...r.style?{style:r.style}:{}}))}));return e.length>0?{blocks:e}:void 0}function kl(n){let e=n.blocks.filter(t=>t.type==="buttons"&&t.buttons.length>0).map(t=>({type:"buttons",buttons:t.buttons.map(r=>({label:r.label,value:r.value,...r.style?{style:r.style}:{}}))}));return e.length>0?{blocks:e}:void 0}function vl(n){if(!n||typeof n!="object"||Array.isArray(n))return!1;let e=n.interactive;if(!e||typeof e!="object"||Array.isArray(e))return!1;let t=e.blocks;return Array.isArray(t)&&t.some(r=>{if(!r||typeof r!="object"||Array.isArray(r))return!1;let o=r;return o.type==="buttons"&&Array.isArray(o.buttons)&&o.buttons.length>0})}function Pl(n,e,t){if(!e)return n;let r=vl(n)?n:wl(n,e);return t!=="telegram"?r:bl(r,e)}function wl(n,e){return!n||typeof n!="object"||Array.isArray(n)?n:{...n,interactive:e}}function bl(n,e){if(!n||typeof n!="object"||Array.isArray(n))return n;let t=n,r=Fe(t.channelData),o=Fe(r?.telegram),i=Al(o?.buttons);if(i)return{...t,channelData:{...r??{},telegram:{...o??{},buttons:i}}};let s=Rl(e);return s?{...t,channelData:{...r??{},telegram:{...o??{},buttons:s}}}:n}function Rl(n){let e=n.blocks.filter(t=>t.type==="buttons"&&t.buttons.length>0).map(t=>t.buttons.filter(r=>typeof r.value=="string"&&r.value.trim().length>0&&Buffer.byteLength(r.value,"utf8")<=mi).map(r=>({text:r.label,callback_data:r.value,...fi(r.style)}))).filter(t=>t.length>0);return e.length>0?e:void 0}function Al(n){if(!Array.isArray(n))return;let e=n.map(t=>Array.isArray(t)?t.map(r=>{if(!r||typeof r!="object"||Array.isArray(r))return;let{style:o,...i}=r;if(!(typeof i.text!="string"||i.text.trim().length===0)&&!(i.callback_data!==void 0&&(typeof i.callback_data!="string"||i.callback_data.trim().length===0||Buffer.byteLength(i.callback_data,"utf8")>mi))&&Il(i))return{...i,...fi(o)}}).filter(r=>!!r):[]).filter(t=>t.length>0);return e.length>0?e:void 0}function Il(n){return Gt(n.callback_data)||Gt(n.url)||Ut(n.web_app)||Ut(n.webApp)||Ut(n.login_url)||Ut(n.loginUrl)||typeof n.switch_inline_query=="string"||typeof n.switch_inline_query_current_chat=="string"||Fe(n.switch_inline_query_chosen_chat)!==void 0||Fe(n.callback_game)!==void 0||n.pay===!0||ci(n.copy_text)||ci(n.copyText)}function Gt(n){return typeof n=="string"&&n.trim().length>0}function Ut(n){let e=Fe(n);return Gt(e?.url)}function ci(n){let e=Fe(n);return Gt(e?.text)}function fi(n){if(typeof n!="string")return{};let e=n.trim().toLowerCase(),t=hl[e];return t?{style:t}:{}}function Fe(n){return n&&typeof n=="object"&&!Array.isArray(n)?n:void 0}function Tl(n){return n.startsWith(`${W}:`)?n:`${W}:${n}`}var Ol=Nl(xl),rt="openclaw-code-agent",Wl=`https://registry.npmjs.org/${encodeURIComponent(rt)}/latest`,Fl="openclaw-code-agent-auto-update.json",Si=1440*60*1e3,Ll=7*Si,Bl=1e4,Le="plugin:auto-update";function fe(n){return!!n&&typeof n=="object"&&!Array.isArray(n)}function Nr(n){return n instanceof Error?n.message:String(n)}function te(n){return n?.trim().replace(/^v/i,"")||void 0}function ee(n,e){let t=n[e];return typeof t=="string"&&t.trim()?t.trim():void 0}function gi(n){let e=n?.trim().replace(/^npm:/,"");if(!e)return;if(e.startsWith("@")){let r=e.indexOf("@",1);return r===-1?e:e.slice(0,r)}let t=e.indexOf("@");return t===-1?e:e.slice(0,t)}function Or(n){let e=`${n.stdout}
2
2
  ${n.stderr}`;if(/No install record/i.test(e))throw new Error("OpenClaw reported no managed install record for OpenClaw Code Agent.");let t;try{t=JSON.parse(n.stdout)}catch{throw new Error("OpenClaw returned invalid JSON while inspecting the OpenClaw Code Agent install.")}if(!fe(t)||!fe(t.plugin)||!fe(t.install))throw new Error("OpenClaw inspection did not include the OpenClaw Code Agent plugin and managed install record.");let r=ee(t.plugin,"id"),o=te(ee(t.plugin,"version"));if(r!==rt||!o)throw new Error("OpenClaw inspection returned an unexpected OpenClaw Code Agent plugin identity or version.");let i=ee(t.install,"source"),s=te(ee(t.install,"version")),a=te(ee(t.install,"resolvedVersion"));if(i==="npm"){let l=ee(t.install,"resolvedName")??gi(ee(t.install,"spec"))??gi(ee(t.install,"resolvedSpec"));if(!l)throw new Error("The OpenClaw Code Agent npm install record does not identify its package.");return{pluginVersion:o,install:{source:i,packageName:l,recordedVersion:s,resolvedVersion:a}}}if(i==="clawhub"){let l=ee(t.install,"clawhubPackage");if(!l)throw new Error("The OpenClaw Code Agent ClawHub install record does not identify its package.");return{pluginVersion:o,install:{source:i,packageName:l,recordedVersion:s,resolvedVersion:a}}}throw new Error(`OpenClaw Code Agent self-update does not support managed install source ${i??"unknown"}.`)}function Kl(n,e){return["plugins","install",n.source==="npm"?`${n.packageName}@${e}`:`clawhub:${n.packageName}@${e}`,"--force"]}function ql(n,e,t){if(e.install.source!==n.install.source||e.install.packageName!==n.install.packageName)throw new Error("OpenClaw Code Agent update verification found that the managed install source or package changed.");if(e.pluginVersion!==t)throw new Error(`OpenClaw Code Agent update verification found installed plugin version ${e.pluginVersion}, expected ${t}.`);let r=[e.install.recordedVersion,e.install.resolvedVersion].filter(o=>!!o);if(r.length===0||r.some(o=>o!==t))throw new Error(`OpenClaw Code Agent update verification found managed install version ${r.join("/")||"unknown"}, expected ${t}.`)}function Wr(n){let t=te(n)?.match(/^((?:0|[1-9]\d*))\.((?:0|[1-9]\d*))\.((?:0|[1-9]\d*))$/);if(!t?.[1]||!t[2]||!t[3])return;let r=[Number(t[1]),Number(t[2]),Number(t[3])];return r.every(Number.isSafeInteger)?r:void 0}function Vl(n,e){let t=Wr(n),r=Wr(e);if(!t||!r)return!1;for(let o=0;o<3;o+=1){if(t[o]>r[o])return!0;if(t[o]<r[o])return!1}return!1}function Ul(n){if(!fe(n))return{};let e={};for(let t of["lastCheckedAt","latestVersion","promptedVersion","lastPromptedAt","dismissedVersion","lastDismissedAt","updateInstalledVersion","restartPromptedVersion","lastError"]){let r=n[t];typeof r=="string"&&r.trim()&&(e[t]=r)}return e}function hi(n){if(!(!n?.provider||!n.target||n.provider==="system"||n.target==="system"))return{channel:n.provider,target:n.target,accountId:n.accountId,threadId:n.threadId,sessionKey:n.sessionKey}}function yi(){if(_.fallbackChannel)return ue(_.fallbackChannel)}async function Gl(){let{fetchNpmReleaseMetadata:n}=await import("./chunks/npm-release-client.js"),e=await n(Wl,Bl),t=fe(e)&&typeof e.version=="string"?te(e.version):void 0;return t?{version:t}:void 0}async function jl(n,e){let t=await n("openclaw",["plugins","search",e,"--limit","100","--json"]),r;try{r=JSON.parse(t.stdout)}catch{throw new Error("OpenClaw returned invalid JSON while checking ClawHub for OpenClaw Code Agent updates.")}let o=fe(r)&&Array.isArray(r.results)?r.results:[];for(let i of o){if(!fe(i)||!fe(i.package)||ee(i.package,"name")!==e)continue;let s=te(ee(i.package,"latestVersion"));return s?{version:s}:void 0}}async function zl(n){let e=Or(await n("openclaw",["plugins","inspect",rt,"--json"]));return e.install.source==="npm"?Gl():jl(n,e.install.packageName)}async function Hl(n,e){let t=await Ol(n,e,{timeout:12e4,maxBuffer:1048576});return{stdout:t.stdout?.toString()??"",stderr:t.stderr?.toString()??""}}var zt=class{constructor(e){this.options=e;this.statePath=El(e.stateDir,Fl),this.notifier=e.notifier??new We,this.runCommand=e.runCommand??Hl,this.fetchLatestRelease=e.fetchLatestRelease??(()=>zl(this.runCommand)),this.now=e.now??Date.now}options;statePath;notifier;fetchLatestRelease;runCommand;now;checkInFlight;maybeCheckForUpdate(e={}){this.checkInFlight||(this.checkInFlight=this.checkForUpdate(e).catch(t=>{`${Nr(t)}`}).finally(()=>{this.checkInFlight=void 0}))}async waitForIdle(){await this.checkInFlight}async installConfirmed(e,t){let r=te(e);if(!r||!Wr(r))return"Could not determine which stable OpenClaw Code Agent version to update to.";let o=Or(await this.runCommand("openclaw",["plugins","inspect",rt,"--json"])),i=await this.runCommand("openclaw",Kl(o.install,r));if(/No install record/i.test(`${i.stdout}
3
3
  ${i.stderr}`))throw new Error("OpenClaw reported no managed install record while updating OpenClaw Code Agent.");let s=Or(await this.runCommand("openclaw",["plugins","inspect",rt,"--json"]));ql(o,s,r);let a=this.readState();this.writeState({...a,updateInstalledVersion:r});let l=hi(t?.route??yi());if(l)try{return await this.sendRestartPrompt(l,r),`OpenClaw Code Agent ${r} installation was verified. Restart confirmation was sent.`}catch(d){`${r}${Nr(d)}`}return[`OpenClaw Code Agent ${r} installation was verified.`,"Restart the Gateway explicitly to load it: openclaw gateway restart"].join(`
4
4
  `)}async restartConfirmed(e){let t=te(e);return await this.runCommand("openclaw",["gateway","restart"]),t?`Gateway restart requested for OpenClaw Code Agent ${t}.`:"Gateway restart requested."}dismiss(e){return this.postpone(e,"Dismissed")}remindLater(e){return this.postpone(e,"Will remind later about")}postpone(e,t){let r=te(e),o=this.readState();return this.writeState({...o,...r?{dismissedVersion:r,lastDismissedAt:new Date(this.now()).toISOString()}:{}}),r?`${t} OpenClaw Code Agent ${r} update reminder.`:`${t} OpenClaw Code Agent update reminder.`}async checkForUpdate(e){let t=this.readState(),r=t.lastCheckedAt?Date.parse(t.lastCheckedAt):Number.NaN;if(Number.isFinite(r)&&this.now()-r<Si){await this.promptFromState(t,e);return}let o=new Date(this.now()).toISOString(),i={...t,lastCheckedAt:o};delete i.lastError,this.writeState(i);try{let s=await this.fetchLatestRelease(),a=te(s?.version),l={...this.readState(),latestVersion:a};delete l.lastError,this.writeState(l),await this.promptFromState(l,e)}catch(s){throw this.writeState({...this.readState(),lastError:Nr(s)}),s}}async promptFromState(e,t){let r=te(e.latestVersion);if(!Vl(r,this.options.currentVersion)||!this.shouldPromptForVersion(e,r))return;let o=hi(t.route??yi());o&&(await this.sendUpdatePrompt(o,r),this.writeState({...this.readState(),latestVersion:r,promptedVersion:r,lastPromptedAt:new Date(this.now()).toISOString()}))}async sendUpdatePrompt(e,t){await this.notifier.send(e,[`OpenClaw Code Agent update available: ${this.options.currentVersion} -> ${t}.`,"","Update now will reinstall the exact approved version from OpenClaw Code Agent's recorded npm or ClawHub source, then verify it.","If the update succeeds, OpenClaw Code Agent will ask separately before restarting the Gateway."].join(`
@@ -6,7 +6,7 @@ ${i.stderr}`))throw new Error("OpenClaw reported no managed install record while
6
6
  `),[[this.options.actionButtonFactory(Le,"plugin-update-restart","Restart Gateway",{pluginUpdateVersion:t}),this.options.actionButtonFactory(Le,"plugin-update-remind-later","Remind later",{pluginUpdateVersion:t}),this.options.actionButtonFactory(Le,"plugin-update-dismiss","Dismiss",{pluginUpdateVersion:t})]]),this.writeState({...this.readState(),restartPromptedVersion:t})}readState(){try{return Ul(JSON.parse(Ml(this.statePath,"utf-8")))}catch{return{}}}writeState(e){Cl($l(this.statePath),{recursive:!0});let t=`${this.statePath}.tmp`;Dl(t,JSON.stringify(e,null,2),"utf-8"),_l(t,this.statePath)}};function Ql(n){return n.length>80?`${n.slice(0,80)}...`:n}function Yl(n){return n.worktreePath?!n.originalWorkdir||n.originalWorkdir===n.worktreePath?`${n.worktreePath} (worktree)`:`${n.worktreePath} (worktree of ${n.originalWorkdir})`:n.workdir}function Jl(n){let e=["Session launched successfully.",` Name: ${n.sessionName}`,` ID: ${n.sessionId}`,` Harness: ${n.harness}`,` Permission mode: ${n.permissionMode}`,` Plan approval: ${n.planApproval}`,` Worktree strategy: ${n.worktreeStrategy??"off"}`,...n.repoIntegrationPolicy?[` Repo policy: ${n.repoIntegrationPolicy}${n.repoProvider?` (${n.repoProvider})`:""}`]:[],` Resolved workdir: ${Yl(n)}`,` Model: ${n.model??"default"}`,` Prompt: "${Ql(n.prompt)}"`];if(n.reasoningEffort&&e.push(` Reasoning effort: ${n.reasoningEffort}`),n.fastMode&&e.push(" Fast mode: enabled"),n.resumeSessionId){let t=n.resumeSessionName?`${n.resumeSessionName} [${n.resumeSessionId}]`:n.resumeSessionId;e.push(` Resume: ${t}${n.forkSession?" (forked)":""}`),!n.forkSession&&n.resumeSessionName&&n.sessionName!==n.resumeSessionName&&e.push(` Follow-up label: ${n.sessionName}`)}else n.forceNewSession&&e.push(" Force new session: true");return n.clearedPersistedCodexResume&&e.push(" Thread state: historical Codex state cleared; starting a fresh thread."),e.push(" Mode: multi-turn (use agent_respond to send follow-up messages)"),e.push("","Use agent_sessions to check status, agent_output to see output."),e.join(`
7
7
  `)}function Ht(n,e){return Jl({...n,sessionId:e.id,sessionName:e.name,model:e.model,reasoningEffort:e.reasoningEffort,fastMode:e.fastMode,worktreeStrategy:e.worktreeStrategy??"off",repoIntegrationPolicy:e.repoIntegrationPolicy,repoProvider:e.repoProvider,worktreePath:e.worktreePath,originalWorkdir:e.originalWorkdir,resumeSessionName:e.resumedFromSessionName??n.resumeSessionName})}function Qt(n){let e=n.resumedFromSessionName||n.sessionName,t=n.resumedFromSessionName&&n.sessionName!==n.resumedFromSessionName?` | Follow-up label: ${n.sessionName}`:"";return`▶️ [${e}] Resumed${t} | ${n.workdirLabel} | ${n.harnessLabel}`}function Be(n){let{requestedResumeSessionId:e,activeSession:t,persistedSession:r}=n;return e?t?{resumeSessionId:e,clearedPersistedCodexResume:!1}:r?.harness==="codex"&&r.backendRef?.kind!=="codex-app-server"?{resumeSessionId:void 0,clearedPersistedCodexResume:!0}:{resumeSessionId:e,clearedPersistedCodexResume:!1}:{resumeSessionId:void 0,clearedPersistedCodexResume:!1}}function Yt(n){return"id"in n?n.id:n.sessionId}function ot(n){return n.status==="completed"||n.killReason==="done"}function Xl(n){return!ot(n)||!C(n)?!1:n.backendRef?.kind==="codex-app-server"||n.backendRef?.kind==="opencode-server"}function Zl(n){return(n.killReason==="shutdown"||n.killReason==="startup-timeout")&&!C(n)}function ke(n){if(n.status==="running")return{kind:"direct",reason:"already_running"};let e=Yt(n);if(ot(n)&&!Xl(n))return{kind:"unavailable",reason:"completed",stableSessionId:e};let t=C(n);if(t){let r="harnessName"in n?void 0:n,{resumeSessionId:o,clearedPersistedCodexResume:i}=Be({requestedResumeSessionId:t,activeSession:"harnessName"in n?{harnessSessionId:t}:void 0,persistedSession:r?{harness:r.harness,backendRef:r.backendRef}:void 0});return o?{kind:"resume",resumeSessionId:o,stableSessionId:e,clearedPersistedCodexResume:i}:{kind:"unavailable",reason:"legacy_non_resumable",stableSessionId:e,clearedPersistedCodexResume:i}}return Zl(n)?{kind:"relaunch",stableSessionId:e}:{kind:"unavailable",reason:"missing_backend_state",stableSessionId:e}}import{existsSync as wi}from"fs";function ed(n){return n.oneShotCliRun===!0?!0:!!n.sessionKey?.includes(":cron:")}function Jt(n){let e=Z({route:n.route});if(Ce(e))return{kind:"resolved",route:e,recovered:!1};let t=n.recoveredRouteSource?Z(n.recoveredRouteSource):void 0;return Ce(t)?{kind:"resolved",route:t,recovered:!0}:ed(n.ctx)?{kind:"resolved",route:e??{provider:"system",target:"system",sessionKey:n.ctx.sessionKey},recovered:!1}:{kind:"error",text:[`Error: Cannot launch the asynchronous ${n.operation} because OpenClaw did not provide a trustworthy lifecycle delivery route.`,"The invocation context is missing session, delivery, and workspace identity (as occurs in the standalone deferred/nested plugin-tool bridge).","Retry from the originating chat/session or update OpenClaw so nested plugin-tool invocations preserve ToolContext routing fields. No coding session was started."].join(" ")}}function ki(n){return n==null?void 0:String(n).trim()||void 0}function td(n){return n.trim().replace(/^['"`](.*)['"`]$/s,"$1").trim()}function nd(n){let e=n.split(/\n\s*\n/,1)[0]?.split(`
8
8
  `).map(t=>t.trim()).filter(Boolean)??[];if(e.length!==0)for(let t of e){let r=t.match(/^(Workdir|Repo):\s*(.+)$/),o=td(r?.[2]??"");if(o.startsWith("/")&&wi(o))return o}}function vi(n,e){return n.workdir!==e.workdir?!1:e.originSessionKey&&n.originSessionKey?n.originSessionKey===e.originSessionKey:!e.originChannel||!n.originChannel?!1:n.originChannel===e.originChannel&&ki(n.originThreadId)===ki(e.originThreadId)}function Pi(n){return n.slice(0,3).map(e=>` - ${e.name} [${e.ref}] | status=${e.status}${e.lifecycle?` | lifecycle=${e.lifecycle}`:""}`).join(`
9
- `)}function rd(n,e){let t=[],r=[],o=new Set;for(let i of n.list?.("all")??[]){if(!vi(i,e))continue;let s=i.id;if(!o.has(s)){if(o.add(s),i.isExplicitlyResumable){t.push({ref:i.id,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!0});continue}(i.status==="starting"||i.status==="running")&&r.push({ref:i.id,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!1})}}for(let i of n.listPersistedSessions?.()??[]){if(!i.resumable||!vi(i,e))continue;let s=D(i)??i.harnessSessionId,a=i.sessionId??C(i)??i.harnessSessionId;!s||!a||o.has(a)||(o.add(a),t.push({ref:s,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!0}))}return{resumable:t,active:r}}function Xt(n,e,t){let r=n.workdir||nd(n.prompt)||e.workspaceDir||_.defaultWorkdir||process.cwd();if(!wi(r))return{kind:"error",text:`Error: Working directory does not exist: ${r}`};let o=n.harness??Y(),i=Me(o),s=n.model??i,a=Rt(o,s),l=n.model!==void 0,d=Pt(o);if(!a&&(o!=="opencode"||d&&d.length>0))return{kind:"error",text:`Error: No default model configured for harness "${o}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${o}.defaultModel or pass model explicitly.`};if(a&&!It(o,a))return{kind:"error",text:`Error: Model "${s}" is not supported for harness "${o}". Use a bare Codex model id such as "gpt-5.6-sol".`};if(a&&d&&d.length>0&&!At(o,a,d))return{kind:"error",text:l?`Error: Model "${s}" is not allowed. Permitted models: ${d.join(", ")}`:`Error: Default model "${s||"undefined"}" is not in allowedModels (${d.join(", ")}). Update your plugin config to set a compatible defaultModel.`};let u=Tt(o,a,d),f=wt(e),g=bt(e,f||$e(r)),S=e.sessionKey||void 0,y=jo(S)??Go(e);if(!n.resume_session_id&&!n.force_new_session){let T=rd(t,{workdir:r,originSessionKey:S,originChannel:g,originThreadId:y});if(T.resumable.length>0||T.active.length>0){let F=T.resumable.length>0?["Linked resumable session(s) already exist for this thread/workdir:",Pi(T.resumable),"","Resume the latest one with:",` agent_respond(session='${T.resumable[0].ref}', message='<next instruction>')`,"Fork from it with:",` agent_launch(prompt='<new task>', resume_session_id='${T.resumable[0].ref}', fork_session=true)`].join(`
9
+ `)}function rd(n,e){let t=[],r=[],o=new Set;for(let i of n.list?.("all")??[]){if(!vi(i,e))continue;let s=i.id;if(!o.has(s)){if(o.add(s),i.isExplicitlyResumable){t.push({ref:i.id,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!0});continue}(i.status==="starting"||i.status==="running")&&r.push({ref:i.id,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!1})}}for(let i of n.listPersistedSessions?.()??[]){if(!i.resumable||!vi(i,e))continue;let s=D(i)??i.harnessSessionId,a=i.sessionId??C(i)??i.harnessSessionId;!s||!a||o.has(a)||(o.add(a),t.push({ref:s,name:i.name,status:i.status,lifecycle:i.lifecycle,resumable:!0}))}return{resumable:t,active:r}}function Xt(n,e,t){let r=n.workdir||nd(n.prompt)||e.workspaceDir||_.defaultWorkdir||process.cwd();if(!wi(r))return{kind:"error",text:`Error: Working directory does not exist: ${r}`};let o=n.harness??Y(),i=Me(o),s=n.model??i,a=Rt(o,s),l=n.model!==void 0,d=Pt(o);if(!a&&(o!=="opencode"||d&&d.length>0))return{kind:"error",text:`Error: No default model configured for harness "${o}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${o}.defaultModel or pass model explicitly.`};if(a&&!It(o,a))return{kind:"error",text:`Error: Model "${s}" is not supported for harness "${o}". Use a bare Codex model id such as "gpt-6-astra" or "gpt-5.6-sol".`};if(a&&d&&d.length>0&&!At(o,a,d))return{kind:"error",text:l?`Error: Model "${s}" is not allowed. Permitted models: ${d.join(", ")}`:`Error: Default model "${s||"undefined"}" is not in allowedModels (${d.join(", ")}). Update your plugin config to set a compatible defaultModel.`};let u=Tt(o,a,d),f=wt(e),g=bt(e,f||$e(r)),S=e.sessionKey||void 0,y=jo(S)??Go(e);if(!n.resume_session_id&&!n.force_new_session){let T=rd(t,{workdir:r,originSessionKey:S,originChannel:g,originThreadId:y});if(T.resumable.length>0||T.active.length>0){let F=T.resumable.length>0?["Linked resumable session(s) already exist for this thread/workdir:",Pi(T.resumable),"","Resume the latest one with:",` agent_respond(session='${T.resumable[0].ref}', message='<next instruction>')`,"Fork from it with:",` agent_launch(prompt='<new task>', resume_session_id='${T.resumable[0].ref}', fork_session=true)`].join(`
10
10
  `):"",V=T.active.length>0?[T.resumable.length>0?"Linked active session(s):":"Linked active session(s) already exist for this thread/workdir:",Pi(T.active),"","Send a follow-up instead of launching a duplicate:",` agent_respond(session='${T.active[0].ref}', message='<next instruction>')`].join(`
11
11
  `):"";return{kind:"blocked",text:["Resume-first protection blocked a fresh launch.","",F,V,["If you intentionally want a brand-new independent session here, call:"," agent_launch(prompt='<new task>', force_new_session=true)"].join(`
12
12
  `)].filter(Boolean).join(`
@@ -72,7 +72,7 @@ ${d}`}}catch{}return l}function hn(n,e="all",t,r={}){let o=n.listPersistedSessio
72
72
  ${I.error}`,I)}]};else if(I.conflictFiles&&I.conflictFiles.length>0){let m=["Resolve merge conflicts in the following files and commit the resolution:","",...I.conflictFiles.map(w=>`- ${w}`),"",`After resolving, commit with message: "Resolve merge conflicts from ${l}"`].join(`
73
73
  `);try{let w=k.spawn({prompt:m,workdir:d,name:`${t.session}-conflict-resolver`,harness:Y(),permissionMode:"bypassPermissions",multiTurn:!0,route:o?.route??i?.route,originChannel:o?.originChannel??i?.originChannel,originThreadId:o?.originThreadId??i?.originThreadId,originAgentId:o?.originAgentId??i?.originAgentId,originSessionKey:o?.originSessionKey??i?.originSessionKey});v={content:[{type:"text",text:ie(`⚠️ Merge conflicts in ${I.conflictFiles.length} file(s) — spawned conflict resolver session: ${w.name}`,I)}]}}catch(w){v={content:[{type:"text",text:ie(`❌ Merge conflicts detected, but failed to spawn resolver: ${w instanceof Error?w.message:String(w)}`,I)}]}}}else{let m=I.dirtyError?`❌ Merge blocked: ${I.error}`:`❌ Merge failed: ${I.error??"unknown error"}`;v={content:[{type:"text",text:ie(m,I)}]}}}),v}}}function Tu(n){return!!n&&typeof n=="object"}function ms(n){return{name:"agent_worktree_cleanup",description:"Manage worktree cleanup with lifecycle-aware safety rules. Use preview_safe to list what Clean all safe would remove, clean_safe to execute it, or preview_all to see both safe and retained sandboxes with kept reasons.",parameters:p.Object({workdir:p.Optional(p.String({description:"Restrict cleanup to sessions rooted in this repository"})),base_branch:p.Optional(p.String({description:"Override base branch for lifecycle resolution"})),mode:p.Optional(p.Union([p.Literal("preview_safe"),p.Literal("clean_safe"),p.Literal("preview_all")],{description:"Cleanup mode. preview_safe shows what Clean all safe would remove, clean_safe performs that cleanup, preview_all shows both safe and retained worktrees. Defaults to preview_safe when dry_run=true, otherwise clean_safe."})),skip_session_check:p.Optional(p.Boolean({description:"Deprecated. Safe cleanup never removes live sessions."})),force:p.Optional(p.Boolean({description:"Deprecated alias for skip_session_check."})),dry_run:p.Optional(p.Boolean({description:"Show what would be cleaned without deleting anything."})),session:p.Optional(p.String({description:"Session name or ID to clean or dismiss."})),dismiss_session:p.Optional(p.Boolean({description:"When true and session is provided, permanently dismiss the worktree."}))}),async execute(e,t){if(!k)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!Tu(t))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { workdir?, base_branch?, mode?, dry_run?, session?, dismiss_session? }."}]};let r=t.session,o=t.mode??(t.dry_run===!0?"preview_safe":"clean_safe"),i=o!=="clean_safe",s=o==="preview_all"||o==="clean_safe";if(r&&t.dismiss_session===!0)return{content:[{type:"text",text:await k.dismissWorktree(r)}]};let a=Bt(k);if(r&&(a=a.filter(S=>Kt(S,r)),a.length===0)){let S=Ft(k,r);if(!S.persistedSession&&!S.activeSession)return{content:[{type:"text",text:`Error: Session "${r}" not found.`}]}}if(t.workdir&&(a=a.filter(S=>S.workdir===t.workdir)),a.length===0)return{content:[{type:"text",text:"No managed worktrees matched the requested scope."}]};let l=[],d=[],u=[],f=[];for(let S of a){let{persistedSession:y,activeSession:c,resolvedLifecycle:h}=Lt(k,S,{baseBranch:t.base_branch});if(!h.cleanupSafe){if(s){let v=h.reasons.length>0?h.reasons.map(qt).join(", "):Se(h.derivedState);d.push(`${S.name} [kept: ${v}]`)}continue}if(l.push(`${S.name} (${Se(h.derivedState)})`),!i)try{let v=S.workdir;if(!((y??c)&&L(y??c))&&S.worktreePath&&B(v,S.worktreePath,{destructive:!1}),S.worktreeBranch&&H(v,S.worktreeBranch),y){let A=h.derivedState==="merged"||h.derivedState==="released"?h.derivedState:h.lifecycle.state,I=new Date().toISOString(),R=A==="merged"?y.worktreeMergedAt:A==="dismissed"?y.worktreeDismissedAt:void 0;k.updatePersistedSession(S.id,{worktreePath:void 0,worktreeBranch:void 0,lifecycle:"terminal",worktreeState:"none",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeDecisionSnoozedUntil:void 0,worktreeMerged:A==="merged"?!0:y.worktreeMerged,worktreeMergedAt:A==="merged"?y.worktreeMergedAt??I:y.worktreeMergedAt,worktreeLifecycle:{...y.worktreeLifecycle??h.lifecycle,state:A,updatedAt:I,resolvedAt:y.worktreeLifecycle?.resolvedAt??R??I,resolutionSource:y.worktreeLifecycle?.resolutionSource??"maintenance",baseBranch:t.base_branch??h.lifecycle.baseBranch??y.worktreeBaseBranch,targetRepo:y.worktreePrTargetRepo,pushRemote:y.worktreePushRemote,notes:h.reasons}})}u.push(`${S.name} (${Se(h.derivedState)})`)}catch(v){f.push(`${S.name}: ${v instanceof Error?v.message:String(v)}`)}}let g=[o==="clean_safe"?"Clean all safe:":o==="preview_all"?"Worktree lifecycle review:":"Clean all safe preview:"];return g.push(` SAFE ${i?"NOW":"FOUND"} (${l.length}): ${l.join(", ")||"(none)"}`),s&&g.push(` KEPT (${d.length}): ${d.join(", ")||"(none)"}`),i||(g.push(` CLEANED (${u.length}): ${u.join(", ")||"(none)"}`),g.push(` FAILURES (${f.length}): ${f.join(", ")||"(none)"}`)),{content:[{type:"text",text:g.join(`
74
74
  `)}]}}}}function xu(n){if(n==null)return!0;if(Array.isArray(n)||typeof n!="object")return!1;let e=n.session;return e===void 0||typeof e=="string"}function fs(n){return{name:"agent_worktree_status",description:"Show lifecycle-first worktree status for coding agent sessions. Displays product-facing lifecycle state, released handling, cleanup safety, and retained reasons.",parameters:p.Object({session:p.Optional(p.String({description:"Session name or ID to show status for (optional, shows all if omitted)"}))}),async execute(e,t){if(!k)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}]};if(!xu(t))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session? }."}]};let r=t&&typeof t=="object"?t.session:void 0,o=Bt(k);if(r&&(o=o.filter(s=>Kt(s,r)),o.length===0))return{content:[{type:"text",text:`Error: Session "${r}" not found or has no worktree.`}]};if(o.length===0)return{content:[{type:"text",text:"No sessions with worktrees found."}]};let i=[];for(let s of o){let{persistedSession:a,resolvedLifecycle:l}=Lt(k,s),d=l.cleanupSafe?"safe now":l.preserve?"preserve":"blocked";i.push(`Session: ${s.name} [${s.id}]`),i.push(` Branch: ${s.worktreeBranch??"(unknown)"} → ${l.lifecycle.baseBranch??a?.worktreeBaseBranch??"main"}`),i.push(` Repo: ${s.workdir}`),i.push(` Lifecycle:${Se(l.lifecycle.state)}`),l.derivedState!==l.lifecycle.state&&i.push(` Derived: ${Se(l.derivedState)}`),i.push(` Cleanup: ${d}`),l.evidence.prUrl&&i.push(` PR: ${l.evidence.prUrl} (${l.evidence.prState??"unknown"})`),(l.evidence.branchAheadCount!=null||l.evidence.baseAheadCount!=null)&&i.push(` Ahead: ${l.evidence.branchAheadCount??0} ahead / ${l.evidence.baseAheadCount??0} behind`),i.push(` Reasons: ${l.reasons.length>0?l.reasons.map(qt).join(", "):"none"}`),i.push("")}return{content:[{type:"text",text:i.join(`
75
- `).trim()}]}}}}import{existsSync as Cu}from"fs";function Mu(n=[]){return n.map((e,t)=>({label:`check-${t+1}`,command:e.trim()})).filter(e=>e.command.length>0)}function bn(n,e){let t=n.goal.trim();if(!t)return{kind:"error",text:"Error: goal must not be empty."};let r=n.workdir||e.workspaceDir||_.defaultWorkdir||process.cwd();if(!Cu(r))return{kind:"error",text:`Error: Working directory does not exist: ${r}`};let o=Mu(n.verifierCommands),i=n.goalMode??(o.length>0?"verifier":"ralph");if(i==="verifier"&&o.length===0)return{kind:"error",text:"Error: verifier mode requires at least one non-empty verifier command."};let s=n.harness??Y(),a=n.model??Me(s),l=Rt(s,a),d=Pt(s);if(!l&&(s!=="opencode"||d&&d.length>0))return{kind:"error",text:`Error: No default model configured for harness "${s}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${s}.defaultModel or pass model explicitly.`};if(l&&!It(s,l))return{kind:"error",text:`Error: Model "${a}" is not supported for harness "${s}". Use a bare Codex model id such as "gpt-5.6-sol".`};if(l&&!At(s,l,d))return{kind:"error",text:`Error: Model "${a}" is not allowed. Permitted models: ${d?.join(", ")}`};let u=Tt(s,l,d),f=e.sessionKey||void 0,g=wt(e),S=bt(e,g||$e(r)),y=De(e,S,f),c=Jt({ctx:e,route:y,operation:"goal task"});if(c.kind==="error")return c;let h=c.route;return{kind:"resolved",goal:t,name:n.name,workdir:r,model:u,reasoningEffort:ce(s),fastMode:_e(s),systemPrompt:n.systemPrompt,allowedTools:n.allowedTools,maxIterations:n.maxIterations,permissionMode:n.permissionMode??"bypassPermissions",harness:s,loopMode:i,completionPromise:n.completionPromise,originChannel:S,originThreadId:y?.threadId,originAgentId:e.agentId||void 0,originSessionKey:f,route:h,verifierCommands:o}}function Rn(n,e){return["Goal task launched.",` Name: ${n.name}`,` ID: ${n.id}`,` Dir: ${n.workdir}`,` Session: ${n.sessionName} [${n.sessionId}]`,` Harness: ${e.harness}`,` Model: ${e.model??"default"}`,...e.fastMode?[" Fast mode: enabled"]:[],` Loop mode: ${n.loopMode}`,` Max controller iterations: ${n.maxIterations}`,` Goal: "${e.goal.length>100?`${e.goal.slice(0,100)}...`:e.goal}"`,...n.loopMode==="ralph"?[` Completion promise: ${n.completionPromise}`]:[" Verifiers:",...e.verifierCommands.map(r=>` - ${r.command}`)],"","Controller iteration progress advances only when the goal controller starts another agent turn; internal agent review passes are reported in the completion summary.","","Use /agent_goal_status to follow progress or /agent_goal_stop to terminate the task in chat."].join(`
75
+ `).trim()}]}}}}import{existsSync as Cu}from"fs";function Mu(n=[]){return n.map((e,t)=>({label:`check-${t+1}`,command:e.trim()})).filter(e=>e.command.length>0)}function bn(n,e){let t=n.goal.trim();if(!t)return{kind:"error",text:"Error: goal must not be empty."};let r=n.workdir||e.workspaceDir||_.defaultWorkdir||process.cwd();if(!Cu(r))return{kind:"error",text:`Error: Working directory does not exist: ${r}`};let o=Mu(n.verifierCommands),i=n.goalMode??(o.length>0?"verifier":"ralph");if(i==="verifier"&&o.length===0)return{kind:"error",text:"Error: verifier mode requires at least one non-empty verifier command."};let s=n.harness??Y(),a=n.model??Me(s),l=Rt(s,a),d=Pt(s);if(!l&&(s!=="opencode"||d&&d.length>0))return{kind:"error",text:`Error: No default model configured for harness "${s}". Set plugins.entries["openclaw-code-agent"].config.harnesses.${s}.defaultModel or pass model explicitly.`};if(l&&!It(s,l))return{kind:"error",text:`Error: Model "${a}" is not supported for harness "${s}". Use a bare Codex model id such as "gpt-6-astra" or "gpt-5.6-sol".`};if(l&&!At(s,l,d))return{kind:"error",text:`Error: Model "${a}" is not allowed. Permitted models: ${d?.join(", ")}`};let u=Tt(s,l,d),f=e.sessionKey||void 0,g=wt(e),S=bt(e,g||$e(r)),y=De(e,S,f),c=Jt({ctx:e,route:y,operation:"goal task"});if(c.kind==="error")return c;let h=c.route;return{kind:"resolved",goal:t,name:n.name,workdir:r,model:u,reasoningEffort:ce(s),fastMode:_e(s),systemPrompt:n.systemPrompt,allowedTools:n.allowedTools,maxIterations:n.maxIterations,permissionMode:n.permissionMode??"bypassPermissions",harness:s,loopMode:i,completionPromise:n.completionPromise,originChannel:S,originThreadId:y?.threadId,originAgentId:e.agentId||void 0,originSessionKey:f,route:h,verifierCommands:o}}function Rn(n,e){return["Goal task launched.",` Name: ${n.name}`,` ID: ${n.id}`,` Dir: ${n.workdir}`,` Session: ${n.sessionName} [${n.sessionId}]`,` Harness: ${e.harness}`,` Model: ${e.model??"default"}`,...e.fastMode?[" Fast mode: enabled"]:[],` Loop mode: ${n.loopMode}`,` Max controller iterations: ${n.maxIterations}`,` Goal: "${e.goal.length>100?`${e.goal.slice(0,100)}...`:e.goal}"`,...n.loopMode==="ralph"?[` Completion promise: ${n.completionPromise}`]:[" Verifiers:",...e.verifierCommands.map(r=>` - ${r.command}`)],"","Controller iteration progress advances only when the goal controller starts another agent turn; internal agent review passes are reported in the completion summary.","","Use /agent_goal_status to follow progress or /agent_goal_stop to terminate the task in chat."].join(`
76
76
  `)}function _u(n){return!n||typeof n!="object"?!1:typeof n.goal=="string"}function gs(n){return{name:"agent_goal_launch",description:"Launch an explicit goal loop. Use this only when the user specifically asks for a goal task, Ralph-style autonomous loop, iterative loop, autonomous repair loop, or keep-going-until-checks-pass workflow. This is not the default session path.",parameters:p.Object({goal:p.String({description:"End goal for the autonomous task"}),verifier_commands:p.Optional(p.Array(p.String({description:"Shell command that must pass for the goal to be considered complete"}),{minItems:1,description:"Verifier commands run after each coding turn"})),name:p.Optional(p.String({description:"Short task name (kebab-case preferred)"})),workdir:p.Optional(p.String({description:"Working directory (defaults to cwd / configured workspace)"})),model:p.Optional(p.String({description:"Model name to use"})),system_prompt:p.Optional(p.String({description:"Additional system prompt"})),allowed_tools:p.Optional(p.Array(p.String(),{description:"Allowed tools for the underlying agent session"})),max_iterations:p.Optional(p.Number({description:"Maximum verifier-driven repair iterations",minimum:1})),goal_mode:p.Optional(p.Union([p.Literal("ralph"),p.Literal("verifier")],{description:"Loop strategy. 'ralph' repeats until a completion promise appears. 'verifier' repeats until verifier commands pass. Defaults to 'ralph' when no verifiers are provided, otherwise 'verifier'."})),completion_promise:p.Optional(p.String({description:"Exact completion promise for Ralph-mode loops. Defaults to 'DONE'."})),permission_mode:p.Optional(p.Union([p.Literal("default"),p.Literal("plan"),p.Literal("bypassPermissions")],{description:"Permission mode for the underlying agent session. Defaults to bypassPermissions for autonomous goal loops."})),harness:p.Optional(p.String({description:"Agent harness to use ('claude-code', 'codex', or experimental 'opencode')."}))}),async execute(e,t){if(!$)return{content:[{type:"text",text:"Error: GoalController not initialized. The code-agent service must be running."}]};if(!_u(t))return{content:[{type:"text",text:"Error: Invalid parameters. Expected at least { goal }."}]};let r=bn({goal:t.goal,verifierCommands:t.verifier_commands,name:t.name,workdir:t.workdir,model:t.model,systemPrompt:t.system_prompt,allowedTools:t.allowed_tools,maxIterations:t.max_iterations,permissionMode:t.permission_mode,harness:t.harness,goalMode:t.goal_mode,completionPromise:t.completion_promise},n);if(r.kind!=="resolved")return{content:[{type:"text",text:r.text}]};try{let o=await $.launchTask({goal:r.goal,name:r.name,workdir:r.workdir,model:r.model,reasoningEffort:r.reasoningEffort,fastMode:r.fastMode,systemPrompt:r.systemPrompt,allowedTools:r.allowedTools,maxIterations:r.maxIterations,permissionMode:r.permissionMode,loopMode:r.loopMode,completionPromise:r.completionPromise,originChannel:r.originChannel,originThreadId:r.originThreadId,originAgentId:r.originAgentId,originSessionKey:r.originSessionKey,route:r.route,harness:r.harness,verifierCommands:r.verifierCommands});return{content:[{type:"text",text:Rn(o,r)}]}}catch(o){return{content:[{type:"text",text:`Error launching goal task: ${o instanceof Error?o.message:String(o)}`}]}}}}}function io(n,e){return n.split(`
77
77
  `).map(t=>`${e}${t}`)}function hs(n,e){return n.length<=e?n:`${n.slice(0,e-3).trimEnd()}...`}function Du(n,e=8,t=600){let r=n.map(i=>i.trimEnd()).filter(i=>i.trim().length>0);if(r.length===0)return;let o=r.slice(-e).join(`
78
78
  `);return o.length<=t?o:`...${o.slice(-(t-3))}`}function $u(n,e){let t=e?.trim(),r=(n??"").split(/\r?\n/).map(o=>o.trim().replace(/^[-*]\s+/,"")).filter(o=>o.length>0).filter(o=>!(t&&o===t)).filter(o=>!/^<promise>.*<\/promise>$/.test(o));return r.length===0?[]:r.slice(-3).map(o=>hs(o,180))}function Eu(n){let e=(n??"").split(/\r?\n/).map(t=>t.trim()).filter(t=>t.length>0);return e.length===0?[]:e.slice(0,2).map(t=>hs(t,180))}function An(n){let e=[],t=Eu(n.verifierSummary),r=$u(n.output,n.completionPromise);if(t.length===0&&r.length===0)return;n.completionDetected===!0&&e.push("Completion was claimed, but the loop is continuing after verification.");for(let i of t)e.push(`Verifier: ${i}`);let o=Math.max(0,3-e.length);if(o>0)for(let i of r.slice(-o))e.push(`Agent: ${i}`);return["Iteration summary:",...e.map(i=>`- ${i}`)].join(`
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "openclaw-code-agent",
3
- "version": "4.7.11",
3
+ "version": "4.7.13",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "openclaw-code-agent",
9
- "version": "4.7.11",
9
+ "version": "4.7.13",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@anthropic-ai/claude-agent-sdk": "0.3.251",
@@ -14,9 +14,10 @@
14
14
  "@hono/node-server": "2.1.1",
15
15
  "@modelcontextprotocol/sdk": "1.30.0",
16
16
  "express-rate-limit": "8.7.0",
17
- "fast-uri": "3.1.5",
17
+ "fast-uri": "3.1.6",
18
18
  "hono": "4.12.34",
19
19
  "ip-address": "10.7.0",
20
+ "qs": "6.16.0",
20
21
  "zod": "4.5.4"
21
22
  },
22
23
  "peerDependencies": {
@@ -639,9 +640,9 @@
639
640
  "license": "Unlicense"
640
641
  },
641
642
  "node_modules/fast-uri": {
642
- "version": "3.1.5",
643
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz",
644
- "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==",
643
+ "version": "3.1.6",
644
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.6.tgz",
645
+ "integrity": "sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==",
645
646
  "funding": [
646
647
  {
647
648
  "type": "github",
@@ -857,9 +858,9 @@
857
858
  "license": "ISC"
858
859
  },
859
860
  "node_modules/jose": {
860
- "version": "6.2.10",
861
- "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.10.tgz",
862
- "integrity": "sha512-iiW7J9qRFlGxvCOIBDBDxFePQSn7ZMAnrYGhrrOo6siO/MIqwfyilLR27pkfDgUk+raLuzADS8A3S/KLBisc0g==",
861
+ "version": "6.2.11",
862
+ "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.11.tgz",
863
+ "integrity": "sha512-A5NPn7g8EAzGU3IzRs+Yiq8K5n3ypYS75M5+KKiVHdUexfpWK1kP4ZMq7QnTGDoMj6TJ1dtcEJjW60yZDXS4hg==",
863
864
  "license": "MIT",
864
865
  "funding": {
865
866
  "url": "https://github.com/sponsors/panva"
@@ -2,7 +2,7 @@
2
2
  "id": "openclaw-code-agent",
3
3
  "name": "Code Agent",
4
4
  "description": "Multi-session coding-agent orchestration from OpenClaw chat",
5
- "version": "4.7.11",
5
+ "version": "4.7.13",
6
6
  "contracts": {
7
7
  "tools": [
8
8
  "agent_launch",
@@ -77,8 +77,9 @@
77
77
  "description": "Per-harness launch defaults and model restrictions.",
78
78
  "default": {
79
79
  "codex": {
80
- "defaultModel": "gpt-5.6-sol",
80
+ "defaultModel": "gpt-6-astra",
81
81
  "allowedModels": [
82
+ "gpt-6-astra",
82
83
  "gpt-5.6-sol",
83
84
  "gpt-5.6-terra",
84
85
  "gpt-5.6-luna"
@@ -247,7 +248,7 @@
247
248
  },
248
249
  "harnesses": {
249
250
  "label": "Harness configuration",
250
- "help": "Per-harness defaults and model restrictions. Set harnesses.codex.fastMode=true to send service_tier=\"fast\" on Codex App Server thread/resume/turn payloads for Codex sessions. OpenCode is experimental; leave harnesses.opencode.defaultModel unset to use OpenCode's provider default, or pass provider/model explicitly. Default: {\"codex\":{\"defaultModel\":\"gpt-5.6-sol\",\"allowedModels\":[\"gpt-5.6-sol\",\"gpt-5.6-terra\",\"gpt-5.6-luna\"],\"reasoningEffort\":\"medium\",\"fastMode\":false},\"claude-code\":{\"defaultModel\":\"anthropic/claude-sonnet-4-7\",\"allowedModels\":[\"sonnet\",\"opus\"]},\"opencode\":{}}.",
251
+ "help": "Per-harness defaults and model restrictions. Set harnesses.codex.fastMode=true to send service_tier=\"fast\" on Codex App Server thread/resume/turn payloads for Codex sessions. OpenCode is experimental; leave harnesses.opencode.defaultModel unset to use OpenCode's provider default, or pass provider/model explicitly. Default: {\"codex\":{\"defaultModel\":\"gpt-6-astra\",\"allowedModels\":[\"gpt-6-astra\",\"gpt-5.6-sol\",\"gpt-5.6-terra\",\"gpt-5.6-luna\"],\"reasoningEffort\":\"medium\",\"fastMode\":false},\"claude-code\":{\"defaultModel\":\"anthropic/claude-sonnet-4-7\",\"allowedModels\":[\"sonnet\",\"opus\"]},\"opencode\":{}}.",
251
252
  "advanced": true
252
253
  },
253
254
  "maxSessions": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openclaw-code-agent",
3
- "version": "4.7.11",
3
+ "version": "4.7.13",
4
4
  "type": "module",
5
5
  "packageManager": "pnpm@11.15.1",
6
6
  "main": "dist/index.js",
@@ -35,15 +35,15 @@
35
35
  "install": {
36
36
  "npmSpec": "openclaw-code-agent",
37
37
  "defaultChoice": "npm",
38
- "minHostVersion": ">=2026.8.2"
38
+ "minHostVersion": ">=2026.9.1"
39
39
  },
40
40
  "compat": {
41
41
  "pluginApi": ">=2026.8.1",
42
42
  "minGatewayVersion": "2026.8.1"
43
43
  },
44
44
  "build": {
45
- "openclawVersion": "2026.8.2",
46
- "pluginSdkVersion": "2026.8.2"
45
+ "openclawVersion": "2026.9.1",
46
+ "pluginSdkVersion": "2026.9.1"
47
47
  }
48
48
  },
49
49
  "files": [
@@ -60,16 +60,17 @@
60
60
  "@hono/node-server": "2.1.1",
61
61
  "@modelcontextprotocol/sdk": "1.30.0",
62
62
  "express-rate-limit": "8.7.0",
63
- "fast-uri": "3.1.5",
63
+ "fast-uri": "3.1.6",
64
64
  "hono": "4.12.34",
65
65
  "ip-address": "10.7.0",
66
+ "qs": "6.16.0",
66
67
  "zod": "4.5.4"
67
68
  },
68
69
  "devDependencies": {
69
70
  "@types/node": "^26.0.1",
70
71
  "esbuild": "^0.28.1",
71
72
  "nanoid": "^6.0.0",
72
- "openclaw": "2026.8.2",
73
+ "openclaw": "2026.9.1",
73
74
  "tsx": "^4.21.0",
74
75
  "typescript": "^7.0.2"
75
76
  },