openclaw-code-agent 4.7.8 → 4.7.10

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.
@@ -1,50 +1,50 @@
1
- var kt=Symbol("optionalSchema");function Ee(e,t){return t?{...t,...e}:e}function $r(e){return{...e,[kt]:!0}}function Or(e){return{const:e,type:typeof e}}var D={Object(e,t){let n=Object.entries(e).filter(([,s])=>!s[kt]).map(([s])=>s),r=Object.fromEntries(Object.entries(e).map(([s,i])=>{let{[kt]:o,...d}=i;return[s,d]}));return{...t,type:"object",...n.length>0?{required:n}:{},properties:r}},String(e){return Ee({type:"string"},e)},Number(e){return Ee({type:"number"},e)},Boolean(e){return Ee({type:"boolean"},e)},Array(e,t){return Ee({type:"array",items:e},t)},Literal:Or,Union(e,t){return Ee({anyOf:e},t)},Optional:$r};import{execFileSync as yt}from"child_process";import{existsSync as Vi}from"fs";var ee=null,Br=null,qr=null;function oo(e){ee=e}function ao(e){Br=e}function uo(e){qr=e}import{execFileSync as W}from"child_process";import*as Ze from"fs";import{tmpdir as ts}from"os";import{dirname as mn,join as ns}from"path";import{readFileSync as Kr}from"fs";import{homedir as Zr}from"os";import{join as Vr}from"path";var Nr=new Set(["telegram","discord","slack","system","mattermost","feishu","line","whatsapp","signal","matrix","googlechat","bluebubbles","imessage","msteams"]);function un(e){let t=e.chatId.trim(),n=e.topicId.trim();return!/^-?\d+$/.test(t)||!/^\d+$/.test(n)?null:`${t}:topic:${n}`}function Lr(e){let t=e.conversationId.trim(),n=t.match(/^(-?\d+):topic:(\d+)$/i);if(n?.[1]&&n[2]){let i=un({chatId:n[1],topicId:n[2]});return i?{chatId:n[1],topicId:n[2],canonicalConversationId:i}:null}if(!/^\d+$/.test(t))return null;let r=e.parentConversationId?.trim();if(!r||!/^-?\d+$/.test(r))return null;let s=un({chatId:r,topicId:t});return s?{chatId:r,topicId:t,canonicalConversationId:s}:null}function Fr(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 Wr(e,t){if(!/^\d+$/.test(e))return e;let n=Fr(t);return n?`${n}:${e}`:`channel:${e}`}function Hr(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 Dr(e){let t=e.toLowerCase(),n=[":thread:",":topic:"];for(let r of n){let s=t.lastIndexOf(r);if(s===-1)continue;let i=e.slice(0,s).trim(),o=e.slice(s+r.length).trim()||void 0;return{id:i||e,threadId:o}}return{id:e}}function Ur(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||!Nr.has(s))continue;let i=n[r+1]?.trim().toLowerCase(),o=n.slice(r+2).join(":").trim();if(!(!i||!o))return{provider:s,kind:i,rawId:o}}}function zr(e,t=Lr){try{return t({conversationId:e})}catch{return null}}var jr={safeParseTelegramTopicConversation:zr};function Rt(e){return{provider:"system",target:"system",sessionKey:e?.trim()||void 0}}function vt(e,t){return{...e,threadId:t??e.threadId}}function Jr(e,t,n){return e==="telegram"&&n?.provider==="telegram"&&!!n.target&&t!==n.target}function Qr(e){let t=e?.trim();if(!t)return;let n=Ur(t);if(!n)return;let{provider:r,kind:s,rawId:i}=n,o=Dr(i),d=null;if(r==="telegram")try{d=jr.safeParseTelegramTopicConversation(i)}catch{d=null}let a=d?.chatId??o.id,l=d?.topicId??o.threadId,p=r==="discord"?s==="direct"||s==="dm"?`user:${a}`:`channel:${a}`:a;return{provider:r,target:p,threadId:l,sessionKey:t}}function St(e){let t=e?.match(/:topic:(\d+)$/i);return t?parseInt(t[1],10):void 0}function cn(e){return!!(e?.provider&&e.target&&e.provider!=="system"&&e.target!=="system")}function xt(e,t,n){let r=Qr(n),s=t!=null?String(t):void 0,i=e?.trim();if(!i||i.toLowerCase()==="unknown")return r?vt(r,s):Rt(n);let o=i.split("|").map(m=>m.trim());if(o.length<2)return r?vt(r,s):Rt(n);let[d,a,l]=o,p=o.length>=3?l:a,g=o.length>=3?a:void 0,u=d?.toLowerCase();if(!u||!p)return r?vt(r,s):Rt(n);let b=u==="discord"?Wr(p,n):p;return Jr(u,b,r)?{provider:u,accountId:g,target:r.target,threadId:s??r.threadId,sessionKey:n?.trim()||void 0}:{provider:u,accountId:g,target:b,threadId:s??(r?.provider===u?r.threadId:void 0),sessionKey:n?.trim()||void 0}}function ln(e){return xt(Hr(e.route)??e.originChannel,e.route?.threadId??e.originThreadId,e.route?.sessionKey??e.originSessionKey)??e.route}function lo(e){let t=ln(e);return cn(t)?t:void 0}function Gr(e){return Object.fromEntries(Object.entries(e).filter(t=>!!t[1]))}function po(e){let t=ln(e);if(!cn(t))return"";let n=Gr({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 $e,pn="claude-code",Oe={"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 yo(){if($e!==void 0)return $e;try{let e=Kr(Vr(Zr(),".claude.json"),"utf-8");$e=JSON.parse(e).mcpServers??{}}catch{$e={}}return $e}var G={maxSessions:20,idleTimeoutMinutes:15,sessionGcAgeMinutes:1440,maxPersistedSessions:1e4,maxAutoResponds:10,permissionMode:"plan",planApproval:"delegate",defaultWorktreeStrategy:"delegate",harnesses:{"claude-code":{...Oe["claude-code"]},codex:{...Oe.codex},opencode:{...Oe.opencode}}};function bo(e){let t=e.defaultHarness??pn,n={};for(let[r,s]of Object.entries(Oe)){let i={...s};s.allowedModels&&(i.allowedModels=[...s.allowedModels]),n[r]=i}for(let[r,s]of Object.entries(e.harnesses??{})){let i=n[r]??{},o={...i,defaultModel:s.defaultModel??i.defaultModel,reasoningEffort:s.reasoningEffort??i.reasoningEffort,fastMode:s.fastMode??i.fastMode};s.allowedModels!==void 0?o.allowedModels=s.allowedModels?[...s.allowedModels]:s.allowedModels:s.defaultModel!==void 0&&(o.allowedModels=void 0),n[r]=o}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});G={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 Qe(){return G.defaultHarness??pn}function _t(e){let t=Oe[e],n=G.harnesses[e];return{...t,...n,allowedModels:n?.allowedModels??t?.allowedModels}}function Po(e){return _t(e).defaultModel}function ko(e){return G.harnesses[e]?.allowedModels??G.allowedModels}function Ro(e){return _t(e).reasoningEffort}function vo(e){return e==="codex"?_t(e).fastMode:void 0}function j(e){return e==null?void 0:String(e).trim()||void 0}function Tt(e){return{channel:j(e?.deliveryContext?.channel),to:j(e?.deliveryContext?.to),accountId:j(e?.deliveryContext?.accountId),threadId:j(e?.deliveryContext?.threadId)}}function fn(e,t,n){if(!(!e||!t))return n?`${e}|${n}|${t}`:`${e}|${t}`}function It(e){return j(e?.requesterSenderId??e?.senderId)}function Ct(e){return(j(e.deliveryContext?.channel)??e.messageChannel??e.channel)?.toLowerCase()!=="telegram"?!1:!!(St(e.sessionKey)||j(e.messageThreadId)||j(e.deliveryContext?.threadId))}function So(e){let t=Tt(e),n=fn(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=j(e.chatId);if(r.length===1&&s)return`${r[0]}|${s}`;let i=It(e);if(r.length===1&&i&&!Ct(e))return`${r[0]}|${i}`}if(e.workspaceDir){let r=es(e.workspaceDir);if(r)return r}if(e.messageChannel&&e.messageChannel.includes("|"))return e.messageChannel}function Xr(e,t){if(t&&String(t).includes("|"))return String(t);let n=Tt(e),r=fn(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=j(e.chatId);if(a)return`${d}|${a}`;let l=It(e);if(l&&!Ct(e))return`${d}|${l}`}let s=j(e?.channel),i=j(e?.chatId);if(s&&i)return`${s}|${i}`;let o=It(e);return s&&o&&!Ct(e)?`${s}|${o}`:e?.id&&/^-?\d+$/.test(String(e.id))?`telegram|${e.id}`:G.fallbackChannel??"unknown"}function Yr(e){return Tt(e).threadId??e?.messageThreadId??void 0}function xo(e,t,n){return xt(Xr(e,t),Yr(e),n??e?.sessionKey)}function es(e){let t=G.agentChannels;if(!t)return;let n=i=>{let o=i.length;for(;o>0&&i[o-1]==="/";)o-=1;return i.slice(0,o)},r=n(e),s=Object.entries(t).sort((i,o)=>o[0].length-i[0].length);for(let[i,o]of s)if(r===n(i)||r.startsWith(n(i)+"/"))return o}function Io(e){return St(e)}var Ge,Ke;function rs(e){try{return W("git",["rev-parse","--show-toplevel"],{cwd:e,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{return}}function Ve(e){if(process.env.OPENCLAW_WORKTREE_DIR)return process.env.OPENCLAW_WORKTREE_DIR;if(G.worktreeDir)return G.worktreeDir;if(e){let t=rs(e);if(t)return ns(t,".worktrees")}return ts()}function gn(e){return e.replace(/[^a-zA-Z0-9._-]/g,"-").replace(/\.{2,}/g,"-").replace(/^[-.]|[-.]$/g,"").slice(0,100).replace(/[-.]+$/,"")||"session"}function Eo(e){try{let t=W("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")?mn(t):void 0}catch{return}}function ss(){if(Ge!==void 0)return Ge;try{return W("git",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),Ge=!0,!0}catch{return Ge=!1,!1}}function K(){if(Ke!==void 0)return Ke;try{return W("gh",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),Ke=!0,!0}catch{return Ke=!1,!1}}function $o(e){if(!ss())return!1;try{return W("git",["rev-parse","--git-dir"],{cwd:e,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function Oo(e){try{let t=os(e);if(!t)return`${Ve(e)}`,!0;let n=Ze.statfsSync(t),r=n.bavail*n.bsize;return as(r)}catch(t){return`${t instanceof Error?t.message:String(t)}`,!0}}function ge(e,t){try{return W("git",["-C",e,"rev-parse","--verify",t],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function hn(e,t,n="origin"){let r=`refs/remotes/${n}/${t}`;try{return W("git",["-C",e,"fetch",n,`+${t}:${r}`],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),W("git",["-C",e,"rev-parse","--verify",r],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),r}catch{return}}function is(e){let t=e;for(;;){if(Ze.existsSync(t))return t;let n=mn(t);if(n===t)return;t=n}}function os(e){return is(Ve(e))}function as(e){return e>=104857600}function Xe(e){let t=process.env.OPENCLAW_WORKTREE_BASE_BRANCH?.trim();if(t)return t;try{let r=W("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 W("git",["-C",e,"rev-parse","--verify","main"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"main"}catch{}try{return W("git",["-C",e,"rev-parse","--verify","master"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"master"}catch{return"main"}}function he(e){try{let n=W("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 Bo(e,t,n){try{let r=W("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 wn(e,t,n){try{let r=W("git",["-C",e,"rev-list","--left-right","--count",`${t}...${n}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),[s,i]=r.split(/\s+/);return{ahead:parseInt(s??"0",10)||0,behind:parseInt(i??"0",10)||0}}catch{return}}function Z(e,t,n){try{return W("git",["-C",e,"merge-base","--is-ancestor",t,n],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function yn(e,t,n){try{let r=W("git",["-C",e,"merge-tree","--write-tree",n,t],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),s=W("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 qo(e,t){try{return W("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 bn(e,t){if(t)return t;let n;try{n=W("git",["-C",e,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{}try{let r=W("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 ke}from"child_process";import{randomBytes as ds}from"crypto";import{appendFileSync as us,existsSync as At,mkdirSync as Pn,readFileSync as cs,rmSync as Mt}from"fs";import{relative as ls,sep as kn}from"path";function ps(e,t){return!!(e&&typeof e=="object"&&"code"in e&&e.code===t)}function fs(e){try{return ke("git",["-C",e,"rev-parse","--show-toplevel"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{return}}function ms(e){return e===0?"":`-${e}-${ds(8).toString("hex")}`}function gs(e,t){let n=fs(e);if(!n)return;let r=ls(n,t);if(!r||r.startsWith("..")||r.includes(`..${kn}`))return;let s=`${n}/.git/info/exclude`,i=`${r.split(kn).join("/").replace(/\/$/,"")}/`;try{let o=At(s)?cs(s,"utf-8"):"";o.split(/\r?\n/).map(a=>a.trim()).some(a=>a===i||a===`/${i}`)||us(s,`${o.endsWith(`
3
- `)||o.length===0?"":`
4
- `}${i}
5
- `,"utf-8")}catch(o){`${i}${s}${o instanceof Error?o.message:String(o)}`}}function Uo(e,t,n={}){let r=gn(t),s=Ve(e);gs(e,s),Pn(s,{recursive:!0});let i=n.allowExistingBranch===!0,o,d,a=10,l=!1;for(let g=0;g<a;g++){let u=ms(g),b=`${s}/openclaw-worktree-${r}${u}`,m=`agent/${r}${u}`;if(!i&&ge(e,m))continue;let h=!1;do{h=!1;try{Pn(b,{recursive:!1}),o=b,d=m;break}catch(k){if(ps(k,"EEXIST")){if(i&&g===0&&!l)try{Mt(b,{recursive:!0,force:!0}),l=!0,h=!0}catch(f){throw new Error(`Failed to recreate existing worktree branch ${m}: could not clear blocked path ${b}: ${f instanceof Error?f.message:String(f)}`)}else if(i&&g===0)throw new Error(`Failed to recreate existing worktree branch ${m}: path ${b} remains blocked after one cleanup attempt`);continue}throw k}}while(h);if(o&&d)break}if(!o||!d)throw new Error(`Failed to create unique worktree directory and branch after ${a} attempts`);let p=ge(e,d);try{p?ke("git",["-C",e,"worktree","add",o,d],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}):ke("git",["-C",e,"worktree","add","-b",d,o],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(g){try{Mt(o,{recursive:!0,force:!0})}catch{}throw g}return o}function Rn(e){if(!At(e))return[];try{let t=ke("git",["-C",e,"status","--porcelain","--untracked-files=all"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return t?t.split(`
6
- `).map(n=>n.trim()).filter(Boolean):[]}catch{return[]}}function vn(e){return Rn(e).length>0}function zo(e,t,n={}){let r=n.destructive===!0,s=Rn(t);if(s.length>0&&!r)return`${t}${s[0]}`,!1;try{return ke("git",["-C",e,"worktree","remove",...r?["--force"]:[],t],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(i){if(`${t}${i instanceof Error?i.message:String(i)}`,!r)return!1;try{return Mt(t,{recursive:!0,force:!0}),`${t}`,!0}catch(o){return console.error(`[worktree] Both git worktree remove and rmSync failed for ${t}: ${o instanceof Error?o.message:String(o)}`),!1}}}function jo(e){try{ke("git",["-C",e,"worktree","prune"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(t){let n=t instanceof Error?t.message.split(/\r?\n/,1)[0]:String(t);`${e}${n}`}}function Jo(e){return At(e)}import{execFileSync as B}from"child_process";import{existsSync as hs}from"fs";function ws(e){return(e.warnings??[]).filter(t=>!(e.stashPopConflict&&t.startsWith("Failed to pop auto-stash after merge"))).map(t=>`Recovery warning: ${t}`)}function Zo(e,t){let n=ws(t);return n.length===0?e:`${e}
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(`
3
+ `)||i.length===0?"":`
4
+ `}${o}
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(`
6
+ `).map(n=>n.trim()).filter(Boolean):[]}catch{return[]}}function Cn(e){return In(e).length>0}function sa(e,t,n={}){let r=n.destructive===!0,s=In(t);if(s.length>0&&!r)return`${t}${s[0]}`,!1;try{return Ce("git",["-C",e,"worktree","remove",...r?["--force"]:[],t],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(o){if(`${t}${o instanceof Error?o.message:String(o)}`,!r)return!1;try{return Ot(t,{recursive:!0,force:!0}),`${t}`,!0}catch(i){return console.error(`[worktree] Both git worktree remove and rmSync failed for ${t}: ${i instanceof Error?i.message:String(i)}`),!1}}}function oa(e){try{Ce("git",["-C",e,"worktree","prune"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(t){let n=t instanceof Error?t.message.split(/\r?\n/,1)[0]:String(t);`${e}${n}`}}function ia(e){return Bt(e)}import{execFileSync as q}from"child_process";import{existsSync as Rs}from"fs";function vs(e){return(e.warnings??[]).filter(t=>!(e.stashPopConflict&&t.startsWith("Failed to pop auto-stash after merge"))).map(t=>`Recovery warning: ${t}`)}function ca(e,t){let n=vs(t);return n.length===0?e:`${e}
7
7
  ${n.map(r=>`âš ī¸ ${r}`).join(`
8
- `)}`}function Ye(e){return e instanceof Error?e.message:String(e)}function Et(e,t,n){try{let r=B("git",["-C",e,"rev-list","--count",`${n}..${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),s=parseInt(r.trim(),10),o=B("git",["-C",e,"diff","--shortstat",`${n}...${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),d=0,a=0,l=0,p=o.match(/(\d+)\s+files?\s+changed/);p&&(d=parseInt(p[1],10));let g=o.match(/(\d+)\s+insertions?\(/);g&&(a=parseInt(g[1],10));let u=o.match(/(\d+)\s+deletions?\(/);u&&(l=parseInt(u[1],10));let m=B("git",["-C",e,"diff","--name-only","--diff-filter=ACMR",`${n}...${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().split(`
9
- `).map(f=>f.trim()).filter(Boolean),k=B("git",["-C",e,"log",`${n}..${t}`,"--format=%h|%s|%an","-n","5"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().split(`
10
- `).filter(Boolean).map(f=>{let[S,$,q]=f.split("|");return{hash:S||"",message:$||"",author:q||""}});return{commits:s,filesChanged:d,insertions:a,deletions:l,changedFiles:m,commitMessages:k}}catch(r){`${r instanceof Error?r.message:String(r)}`;return}}function xn(e,t,n="origin"){try{return B("git",["-C",e,"push",n,t],{timeout:6e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(r){return`${t}${r instanceof Error?r.message:String(r)}`,!1}}function Sn(e){try{return B("git",["-C",e,"status","--porcelain"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
11
- `).some(n=>n.length>0&&!n.startsWith("??")&&!n.startsWith("!!"))}catch{return!1}}function Vo(e,t,n,r="merge",s){let i=!1,o,d=[],a=g=>d.length>0?{...g,warnings:[...d]}:g,l=(g,u)=>{d.push(`${g}: ${Ye(u)}`)},p=g=>{if(i)try{B("git",["-C",g,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(u){l("Failed to pop auto-stash during recovery",u)}};try{if(r==="squash"){if(B("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),Sn(e)){let h;try{h=B("git",["-C",e,"stash","push","-m",`pre-merge stash before ${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(k){return a({success:!1,dirtyError:!0,error:`Auto-stash failed: ${Ye(k)}. Commit or stash changes manually, then retry.`})}if(!h.includes("No local changes to save")){i=!0;try{o=B("git",["-C",e,"stash","list","--format=%gd","-n","1"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch(k){l("Failed to determine auto-stash ref",k)}}}B("git",["-C",e,"merge","--squash",t],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),B("git",["-C",e,"commit","-m",`Squash merge ${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let m=!1;if(i)try{B("git",["-C",e,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(h){m=!0,l("Failed to pop auto-stash after merge",h)}return a({success:!0,stashed:i||void 0,stashRef:o,stashPopConflict:m||void 0})}let g=s&&hs(s),u=g?s:e;if(g||B("git",["-C",e,"checkout",t],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),Sn(e)){let m;try{m=B("git",["-C",e,"stash","push","-m",`pre-merge stash before ${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(h){try{B("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(k){l(`Failed to check out ${n} after auto-stash failure`,k)}return a({success:!1,dirtyError:!0,error:`Auto-stash failed: ${Ye(h)}. Commit or stash changes manually, then retry.`})}if(!m.includes("No local changes to save")){i=!0;try{o=B("git",["-C",e,"stash","list","--format=%gd","-n","1"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch(h){l("Failed to determine auto-stash ref",h)}}}try{B("git",["-C",u,"rebase",n],{timeout:6e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{try{B("git",["-C",u,"rebase","--abort"],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(m){l("Failed to abort rebase during recovery",m)}try{B("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(m){l(`Failed to check out ${n} during recovery`,m)}return p(e),a({success:!1,rebaseConflict:!0,stashed:i||void 0,stashRef:o,error:[`Rebase of ${t} onto ${n} hit conflicts.`,"To resolve manually:",` cd ${u}`,` git rebase ${n}`," # resolve conflicts in each file, then:"," git add <file>"," git rebase --continue"," # repeat until rebase finishes, then re-run agent_merge."].join(`
12
- `)})}B("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),B("git",["-C",e,"merge","--ff-only",t],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let b=!1;if(i)try{B("git",["-C",e,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(m){b=!0,l("Failed to pop auto-stash after merge",m)}return a({success:!0,fastForward:!0,stashed:i||void 0,stashRef:o,stashPopConflict:b||void 0})}catch(g){try{B("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(u){l(`Failed to check out ${n} during recovery`,u)}return p(e),a({success:!1,error:Ye(g),stashed:i||void 0,stashRef:o})}}import{execFileSync as te}from"child_process";function _n(e){let t=e.toLowerCase();return t==="open"?"open":t==="merged"?"merged":t==="closed"?"closed":"none"}var ys=/(?<!\\)\\(?:r\\)?n/g;function Tn(e){if(/\r|\n/.test(e)||!/(?<!\\)\\n\\n/.test(e))return e;let t=e.replace(ys,`
8
+ `)}`}function st(e){return e instanceof Error?e.message:String(e)}function Nt(e,t,n){try{let r=q("git",["-C",e,"rev-list","--count",`${n}..${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),s=parseInt(r.trim(),10),i=q("git",["-C",e,"diff","--shortstat",`${n}...${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),d=0,a=0,c=0,l=i.match(/(\d+)\s+files?\s+changed/);l&&(d=parseInt(l[1],10));let m=i.match(/(\d+)\s+insertions?\(/);m&&(a=parseInt(m[1],10));let u=i.match(/(\d+)\s+deletions?\(/);u&&(c=parseInt(u[1],10));let p=q("git",["-C",e,"diff","--name-only","--diff-filter=ACMR",`${n}...${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().split(`
9
+ `).map(f=>f.trim()).filter(Boolean),P=q("git",["-C",e,"log",`${n}..${t}`,"--format=%h|%s|%an","-n","5"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().split(`
10
+ `).filter(Boolean).map(f=>{let[I,N,E]=f.split("|");return{hash:I||"",message:N||"",author:E||""}});return{commits:s,filesChanged:d,insertions:a,deletions:c,changedFiles:p,commitMessages:P}}catch(r){`${r instanceof Error?r.message:String(r)}`;return}}function _n(e,t,n="origin"){try{return q("git",["-C",e,"push",n,t],{timeout:6e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(r){return`${t}${r instanceof Error?r.message:String(r)}`,!1}}function Tn(e){try{return q("git",["-C",e,"status","--porcelain"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).split(`
11
+ `).some(n=>n.length>0&&!n.startsWith("??")&&!n.startsWith("!!"))}catch{return!1}}function la(e,t,n,r="merge",s){let o=!1,i,d=[],a=m=>d.length>0?{...m,warnings:[...d]}:m,c=(m,u)=>{d.push(`${m}: ${st(u)}`)},l=m=>{if(o)try{q("git",["-C",m,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(u){c("Failed to pop auto-stash during recovery",u)}};try{if(r==="squash"){if(q("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),Tn(e)){let h;try{h=q("git",["-C",e,"stash","push","-m",`pre-merge stash before ${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(P){return a({success:!1,dirtyError:!0,error:`Auto-stash failed: ${st(P)}. Commit or stash changes manually, then retry.`})}if(!h.includes("No local changes to save")){o=!0;try{i=q("git",["-C",e,"stash","list","--format=%gd","-n","1"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch(P){c("Failed to determine auto-stash ref",P)}}}q("git",["-C",e,"merge","--squash",t],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),q("git",["-C",e,"commit","-m",`Squash merge ${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let p=!1;if(o)try{q("git",["-C",e,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(h){p=!0,c("Failed to pop auto-stash after merge",h)}return a({success:!0,stashed:o||void 0,stashRef:i,stashPopConflict:p||void 0})}let m=s&&Rs(s),u=m?s:e;if(m||q("git",["-C",e,"checkout",t],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),Tn(e)){let p;try{p=q("git",["-C",e,"stash","push","-m",`pre-merge stash before ${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(h){try{q("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(P){c(`Failed to check out ${n} after auto-stash failure`,P)}return a({success:!1,dirtyError:!0,error:`Auto-stash failed: ${st(h)}. Commit or stash changes manually, then retry.`})}if(!p.includes("No local changes to save")){o=!0;try{i=q("git",["-C",e,"stash","list","--format=%gd","-n","1"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch(h){c("Failed to determine auto-stash ref",h)}}}try{q("git",["-C",u,"rebase",n],{timeout:6e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{try{q("git",["-C",u,"rebase","--abort"],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(p){c("Failed to abort rebase during recovery",p)}try{q("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(p){c(`Failed to check out ${n} during recovery`,p)}return l(e),a({success:!1,rebaseConflict:!0,stashed:o||void 0,stashRef:i,error:[`Rebase of ${t} onto ${n} hit conflicts.`,"To resolve manually:",` cd ${u}`,` git rebase ${n}`," # resolve conflicts in each file, then:"," git add <file>"," git rebase --continue"," # repeat until rebase finishes, then re-run agent_merge."].join(`
12
+ `)})}q("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),q("git",["-C",e,"merge","--ff-only",t],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let b=!1;if(o)try{q("git",["-C",e,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(p){b=!0,c("Failed to pop auto-stash after merge",p)}return a({success:!0,fastForward:!0,stashed:o||void 0,stashRef:i,stashPopConflict:b||void 0})}catch(m){try{q("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(u){c(`Failed to check out ${n} during recovery`,u)}return l(e),a({success:!1,error:st(m),stashed:o||void 0,stashRef:i})}}import{execFileSync as ie}from"child_process";function En(e){let t=e.toLowerCase();return t==="open"?"open":t==="merged"?"merged":t==="closed"?"closed":"none"}var Ss=/(?<!\\)\\(?:r\\)?n/g;function $n(e){if(/\r|\n/.test(e)||!/(?<!\\)\\n\\n/.test(e))return e;let t=e.replace(Ss,`
13
13
  `),n=t.split(`
14
- `);return n.some(s=>/^#{1,6}\s+\S/.test(s.trim()))&&n.some(s=>/^(?:[-*+]\s+|\d+\.\s+|```)/.test(s.trim()))?t:e}function bs(e){return e.filesChanged!==void 0?` (${e.filesChanged} files, +${e.insertions??0}/-${e.deletions??0})`:""}function In(e){return/pull request already exists/i.test(e)||/createPullRequest/i.test(e)&&/already exists/i.test(e)}function Cn(e,t,n){let r=ue(e,t,n);if(r.exists&&r.state==="open"&&r.url)return{success:!0,prUrl:r.url,warnings:["A PR already exists for this branch; reused the existing open PR."]};if(r.exists&&r.url)return{success:!1,error:`A PR already exists for ${t}, but it is ${r.state}: ${r.url}`}}function Mn(e){try{return te("git",["-C",e,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().match(/[:/]([^/]+)\/[^/]+(?:\.git)?$/)?.[1]}catch{return}}function Ps(e,t,n){if(!n)return t;let r=Mn(e);return r?`${r}:${t}`:t}function An(e,t,n,r,s,i,o={}){if(!K())return{success:!1,error:"GitHub CLI (gh) is not available"};let d;try{return d=["pr","create","--base",n],(o.draft??!0)&&d.push("--draft"),i&&d.push("--repo",i),d.push("--head",Ps(e,t,i)),r&&s?d.push("--title",r,"--body",Tn(s)):d.push("--fill-verbose"),{success:!0,prUrl:te("gh",d,{cwd:e,timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}}catch(a){let l=a instanceof Error?a.message:String(a);if(In(l))return Cn(e,t,i)??{success:!1,error:l};if((o.draft??!0)&&d&&/draft/i.test(l))try{let p=d.filter(b=>b!=="--draft");return{success:!0,prUrl:te("gh",p,{cwd:e,timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),warnings:["Target repo does not support draft PRs; created as regular (non-draft) PR instead."]}}catch(p){let g=p instanceof Error?p.message:String(p);return In(g)?Cn(e,t,i)??{success:!1,error:`Draft PR creation failed (${l}); non-draft retry also failed: ${g}`}:{success:!1,error:`Draft PR creation failed (${l}); non-draft retry also failed: ${g}`}}return{success:!1,error:l}}}function ue(e,t,n){if(!K())return{exists:!1,state:"none"};try{let r=["pr","list","--head",t,"--state","all","--json","url,number,title,state,headRepositoryOwner,headRefName,baseRefName"];n&&r.push("--repo",n);let i=te("gh",r,{cwd:e,timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(!i)return{exists:!1,state:"none"};let o=JSON.parse(i),d=n?Mn(e)?.toLowerCase():void 0,a=o.find(g=>g.headRefName===t&&(!d||g.headRepositoryOwner?.login?.toLowerCase()===d));if(!a)return{exists:!1,state:"none"};let p={exists:!0,state:_n(a.state),url:a.url,number:a.number,title:a.title};return a.headRefName!==void 0&&(p.headRefName=a.headRefName),a.baseRefName!==void 0&&(p.baseRefName=a.baseRefName),p}catch(r){return`${t}${r instanceof Error?r.message:String(r)}`,{exists:!1,state:"none"}}}function Be(e,t,n){if(!K())return{exists:!1,state:"none"};try{let r=["pr","view",t,"--json","url,number,title,state,headRefName,baseRefName"];n&&r.push("--repo",n);let s=te("gh",r,{cwd:e,timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),i=JSON.parse(s.trim()),o={exists:!0,state:_n(i.state),url:i.url,number:i.number,title:i.title};return i.headRefName!==void 0&&(o.headRefName=i.headRefName),i.baseRefName!==void 0&&(o.baseRefName=i.baseRefName),o}catch(r){return`${t}${r instanceof Error?r.message:String(r)}`,{exists:!1,state:"none"}}}function En(e,t,n){if(!K())return{ok:!1,error:"GitHub CLI (gh) is not available"};try{let r=["pr","view",String(t),"--json","body"];n&&r.push("--repo",n);let s=te("gh",r,{cwd:e,timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),i=JSON.parse(s.trim());return{ok:!0,body:typeof i.body=="string"?i.body:void 0}}catch(r){let s=r instanceof Error?r.message:String(r);return`${t}${s}`,{ok:!1,error:s}}}function $n(e,t,n,r){if(!K())return!1;try{let s=["pr","edit",String(t),"--body",Tn(n)];return r&&s.push("--repo",r),te("gh",s,{cwd:e,timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(s){return`${t}${s instanceof Error?s.message:String(s)}`,!1}}function On(e,t,n,r){if(!K())return!1;try{let s=["pr","edit",String(t),"--title",n];return r&&s.push("--repo",r),te("gh",s,{cwd:e,timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(s){return`${t}${s instanceof Error?s.message:String(s)}`,!1}}function Bn(e,t,n,r){if(!K())return!1;try{let s=["pr","comment",String(t),"--body",n];return r&&s.push("--repo",r),te("gh",s,{cwd:e,timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(s){return`${t}${s instanceof Error?s.message:String(s)}`,!1}}function $t(e){let t=bs(e);return e.kind==="merge"?`✅ Merged: ${e.branch} → ${e.base??"main"}${t}`:e.kind==="pr-updated"?`✅ PR updated: ${e.prUrl??""}${t}`:e.targetRepo?`✅ PR opened against ${e.targetRepo}: ${e.prUrl??""}${t}`:`✅ PR opened: ${e.prUrl??""}${t}`}import{existsSync as Ot}from"fs";function qn(){return new Date().toISOString()}function ks(e){return e.worktreeLifecycle??{state:e.worktreePath||e.worktreeBranch?"provisioned":"none",updatedAt:qn(),baseBranch:e.worktreeBaseBranch,targetRepo:e.worktreePrTargetRepo,pushRemote:e.worktreePushRemote}}function Rs(e){let t=Nn(e);return e.worktreeLifecycle?.baseBranch??e.worktreeBaseBranch??(t&&Ot(t)?Xe(t):void 0)}function Nn(e){return typeof e.workdir=="string"&&e.workdir.length>0?e.workdir:void 0}function Ln(e,t={}){let n=ks(e),r=qn(),s=new Set,i=Nn(e),o=!!(i&&Ot(i)),d=!!(e.worktreePath&&Ot(e.worktreePath)),a=e.worktreeBranch,l=Rs(e),p=!1,g=!1,u=!1,b=!1,m=!1,h,k,f="none",S=e.worktreePrUrl,$=e.worktreePrNumber;if(o||s.add("repo_missing"),a||s.add("branch_missing"),!d&&e.worktreePath&&s.add("worktree_missing"),t.activeSession&&s.add("active_session"),n.state==="pending_decision"&&s.add("pending_decision"),n.state==="merge_conflict_resolving"&&s.add("merge_conflict_resolving"),o&&i&&a&&(p=ge(i,a),p||s.add("branch_missing")),d&&e.worktreePath&&(g=vn(e.worktreePath),g&&s.add("dirty_worktree_entries")),o&&i&&p&&a&&l){let c=wn(i,a,l);h=c?.ahead,k=c?.behind,u=Z(i,a,l),u?s.add("topology_merged"):(b=yn(i,a,l),b&&s.add("merge_noop_content_already_on_base"),!b&&(h??0)>0&&s.add("unique_content"));let R=he(i);if(t.includePrSync&&e.worktreePrUrl&&R&&R!==a&&R!==l){let T=Be(i,e.worktreePrUrl,e.worktreePrTargetRepo??n.targetRepo);m=!!((T.state==="open"||T.state==="merged")&&T.headRefName===R&&T.baseRefName===l&&Z(i,a,R)),m&&(s.delete("unique_content"),s.add(`released_by_branch:${R}`))}}else l||s.add("base_branch_missing");if(t.includePrSync&&o&&i&&a){let c=ue(i,a,e.worktreePrTargetRepo??n.targetRepo);f=c.state,S=c.url??S,$=c.number??$}f==="open"&&s.add("pr_open"),f==="merged"&&!u&&!b&&s.add("pr_merged_not_reflected_locally");let q=t.includePrSync&&n.state==="pr_open"&&f!=="open";q&&s.add("stale_pr_open");let F;u?F="merged":(b||m)&&(F="released");let Q=t.activeSession||g,N=n.state;!Q&&F?N=F:q?N="pending_decision":!p&&n.state==="pending_decision"&&(N="cleanup_failed");let Y=N==="merged"||N==="released",ie=t.activeSession||g||!Y&&n.state==="pending_decision"||n.state==="merge_conflict_resolving"||f==="open"||s.has("pr_merged_not_reflected_locally"),x=!ie&&(N==="merged"||N==="released"||n.state==="dismissed"||n.state==="no_change"),w={checkedAt:r,repoExists:o,branchExists:p,worktreeExists:d,activeSession:t.activeSession===!0,dirtyTracked:g,topologyMerged:u,releaseNoopMerge:b,representedByTargetPrBranch:m,branchAheadCount:h,baseAheadCount:k,prState:f,prUrl:S,prNumber:$,reasons:[...s]};return{lifecycle:n,evidence:w,derivedState:N,cleanupSafe:x,preserve:ie,reasons:[...s]}}var we,qe,Re=!1;function Fn(e){try{return e?.config?.current?.()}catch{return}}function fa(e,t){if(e&&typeof e=="object"){we=e,arguments.length>=2?(qe=t,Re=!0):Re||(qe=Fn(we),Re=!0);return}we=void 0,qe=void 0,Re=!1}function Wn(){return we}function ma(){return we?.tasks?.managedFlows??we?.taskFlow}function ga(){return Re||(qe=Fn(we),Re=!0),qe}var Dn=32,Lt="Generated with [openclaw-code-agent](https://github.com/goldmar/openclaw-code-agent)",Ft="Deterministic fallback metadata generated because no LLM PR metadata provider is configured.",Wt="Deterministic fallback metadata generated because the LLM PR metadata provider failed or returned unusable output.",vs="PR metadata generated from the coding agent's final session report.";function Un(e,t={preserveBlankLines:!0}){return e?.replace(/\r\n/g,`
14
+ `);return n.some(s=>/^#{1,6}\s+\S/.test(s.trim()))&&n.some(s=>/^(?:[-*+]\s+|\d+\.\s+|```)/.test(s.trim()))?t:e}function xs(e){return e.filesChanged!==void 0?` (${e.filesChanged} files, +${e.insertions??0}/-${e.deletions??0})`:""}function Mn(e){return/pull request already exists/i.test(e)||/createPullRequest/i.test(e)&&/already exists/i.test(e)}function An(e,t,n){let r=me(e,t,n);if(r.exists&&r.state==="open"&&r.url)return{success:!0,prUrl:r.url,warnings:["A PR already exists for this branch; reused the existing open PR."]};if(r.exists&&r.url)return{success:!1,error:`A PR already exists for ${t}, but it is ${r.state}: ${r.url}`}}function On(e){try{return ie("git",["-C",e,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().match(/[:/]([^/]+)\/[^/]+(?:\.git)?$/)?.[1]}catch{return}}function Is(e,t,n){if(!n)return t;let r=On(e);return r?`${r}:${t}`:t}function Bn(e,t,n,r,s,o,i={}){if(!ee())return{success:!1,error:"GitHub CLI (gh) is not available"};let d;try{return d=["pr","create","--base",n],(i.draft??!0)&&d.push("--draft"),o&&d.push("--repo",o),d.push("--head",Is(e,t,o)),r&&s?d.push("--title",r,"--body",$n(s)):d.push("--fill-verbose"),{success:!0,prUrl:ie("gh",d,{cwd:e,timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()}}catch(a){let c=a instanceof Error?a.message:String(a);if(Mn(c))return An(e,t,o)??{success:!1,error:c};if((i.draft??!0)&&d&&/draft/i.test(c))try{let l=d.filter(b=>b!=="--draft");return{success:!0,prUrl:ie("gh",l,{cwd:e,timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),warnings:["Target repo does not support draft PRs; created as regular (non-draft) PR instead."]}}catch(l){let m=l instanceof Error?l.message:String(l);return Mn(m)?An(e,t,o)??{success:!1,error:`Draft PR creation failed (${c}); non-draft retry also failed: ${m}`}:{success:!1,error:`Draft PR creation failed (${c}); non-draft retry also failed: ${m}`}}return{success:!1,error:c}}}function me(e,t,n){if(!ee())return{exists:!1,state:"none"};try{let r=["pr","list","--head",t,"--state","all","--json","url,number,title,state,headRepositoryOwner,headRefName,baseRefName"];n&&r.push("--repo",n);let o=ie("gh",r,{cwd:e,timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(!o)return{exists:!1,state:"none"};let i=JSON.parse(o),d=n?On(e)?.toLowerCase():void 0,a=i.find(m=>m.headRefName===t&&(!d||m.headRepositoryOwner?.login?.toLowerCase()===d));if(!a)return{exists:!1,state:"none"};let l={exists:!0,state:En(a.state),url:a.url,number:a.number,title:a.title};return a.headRefName!==void 0&&(l.headRefName=a.headRefName),a.baseRefName!==void 0&&(l.baseRefName=a.baseRefName),l}catch(r){return`${t}${r instanceof Error?r.message:String(r)}`,{exists:!1,state:"none"}}}function We(e,t,n){if(!ee())return{exists:!1,state:"none"};try{let r=["pr","view",t,"--json","url,number,title,state,headRefName,baseRefName"];n&&r.push("--repo",n);let s=ie("gh",r,{cwd:e,timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),o=JSON.parse(s.trim()),i={exists:!0,state:En(o.state),url:o.url,number:o.number,title:o.title};return o.headRefName!==void 0&&(i.headRefName=o.headRefName),o.baseRefName!==void 0&&(i.baseRefName=o.baseRefName),i}catch(r){return`${t}${r instanceof Error?r.message:String(r)}`,{exists:!1,state:"none"}}}function Nn(e,t,n){if(!ee())return{ok:!1,error:"GitHub CLI (gh) is not available"};try{let r=["pr","view",String(t),"--json","body"];n&&r.push("--repo",n);let s=ie("gh",r,{cwd:e,timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),o=JSON.parse(s.trim());return{ok:!0,body:typeof o.body=="string"?o.body:void 0}}catch(r){let s=r instanceof Error?r.message:String(r);return`${t}${s}`,{ok:!1,error:s}}}function qn(e,t,n,r){if(!ee())return!1;try{let s=["pr","edit",String(t),"--body",$n(n)];return r&&s.push("--repo",r),ie("gh",s,{cwd:e,timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(s){return`${t}${s instanceof Error?s.message:String(s)}`,!1}}function Ln(e,t,n,r){if(!ee())return!1;try{let s=["pr","edit",String(t),"--title",n];return r&&s.push("--repo",r),ie("gh",s,{cwd:e,timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(s){return`${t}${s instanceof Error?s.message:String(s)}`,!1}}function Fn(e,t,n,r){if(!ee())return!1;try{let s=["pr","comment",String(t),"--body",n];return r&&s.push("--repo",r),ie("gh",s,{cwd:e,timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(s){return`${t}${s instanceof Error?s.message:String(s)}`,!1}}function qt(e){let t=xs(e);return e.kind==="merge"?`✅ Merged: ${e.branch} → ${e.base??"main"}${t}`:e.kind==="pr-updated"?`✅ PR updated: ${e.prUrl??""}${t}`:e.targetRepo?`✅ PR opened against ${e.targetRepo}: ${e.prUrl??""}${t}`:`✅ PR opened: ${e.prUrl??""}${t}`}import{existsSync as Lt}from"fs";function Wn(){return new Date().toISOString()}function Cs(e){return e.worktreeLifecycle??{state:e.worktreePath||e.worktreeBranch?"provisioned":"none",updatedAt:Wn(),baseBranch:e.worktreeBaseBranch,targetRepo:e.worktreePrTargetRepo,pushRemote:e.worktreePushRemote}}function Ts(e){let t=Un(e);return e.worktreeLifecycle?.baseBranch??e.worktreeBaseBranch??(t&&Lt(t)?rt(t):void 0)}function Un(e){return typeof e.workdir=="string"&&e.workdir.length>0?e.workdir:void 0}function Dn(e,t={}){let n=Cs(e),r=Wn(),s=new Set,o=Un(e),i=!!(o&&Lt(o)),d=!!(e.worktreePath&&Lt(e.worktreePath)),a=e.worktreeBranch,c=Ts(e),l=!1,m=!1,u=!1,b=!1,p=!1,h,P,f="none",I=e.worktreePrUrl,N=e.worktreePrNumber;if(i||s.add("repo_missing"),a||s.add("branch_missing"),!d&&e.worktreePath&&s.add("worktree_missing"),t.activeSession&&s.add("active_session"),n.state==="pending_decision"&&s.add("pending_decision"),n.state==="merge_conflict_resolving"&&s.add("merge_conflict_resolving"),i&&o&&a&&(l=be(o,a),l||s.add("branch_missing")),d&&e.worktreePath&&(m=Cn(e.worktreePath),m&&s.add("dirty_worktree_entries")),i&&o&&l&&a&&c){let R=Pn(o,a,c);h=R?.ahead,P=R?.behind,u=te(o,a,c),u?s.add("topology_merged"):(b=Rn(o,a,c),b&&s.add("merge_noop_content_already_on_base"),!b&&(h??0)>0&&s.add("unique_content"));let $=ke(o);if(t.includePrSync&&e.worktreePrUrl&&$&&$!==a&&$!==c){let D=We(o,e.worktreePrUrl,e.worktreePrTargetRepo??n.targetRepo);p=!!((D.state==="open"||D.state==="merged")&&D.headRefName===$&&D.baseRefName===c&&te(o,a,$)),p&&(s.delete("unique_content"),s.add(`released_by_branch:${$}`))}}else c||s.add("base_branch_missing");if(t.includePrSync&&i&&o&&a){let R=me(o,a,e.worktreePrTargetRepo??n.targetRepo);f=R.state,I=R.url??I,N=R.number??N}f==="open"&&s.add("pr_open"),f==="merged"&&!u&&!b&&s.add("pr_merged_not_reflected_locally");let E=t.includePrSync&&n.state==="pr_open"&&f!=="open";E&&s.add("stale_pr_open");let L;u?L="merged":(b||p)&&(L="released");let Z=t.activeSession||m,B=n.state;!Z&&L?B=L:E?B="pending_decision":!l&&n.state==="pending_decision"&&(B="cleanup_failed");let G=B==="merged"||B==="released",ce=t.activeSession||m||!G&&n.state==="pending_decision"||n.state==="merge_conflict_resolving"||f==="open"||s.has("pr_merged_not_reflected_locally"),se=!ce&&(B==="merged"||B==="released"||n.state==="dismissed"||n.state==="no_change"),A={checkedAt:r,repoExists:i,branchExists:l,worktreeExists:d,activeSession:t.activeSession===!0,dirtyTracked:m,topologyMerged:u,releaseNoopMerge:b,representedByTargetPrBranch:p,branchAheadCount:h,baseAheadCount:P,prState:f,prUrl:I,prNumber:N,reasons:[...s]};return{lifecycle:n,evidence:A,derivedState:B,cleanupSafe:se,preserve:ce,reasons:[...s]}}var Pe,Ue,Te=!1;function Hn(e){try{return e?.config?.current?.()}catch{return}}function Ca(e,t){if(e&&typeof e=="object"){Pe=e,arguments.length>=2?(Ue=t,Te=!0):Te||(Ue=Hn(Pe),Te=!0);return}Pe=void 0,Ue=void 0,Te=!1}function zn(){return Pe}function Ta(){return Pe?.tasks?.managedFlows??Pe?.taskFlow}function _a(){return Te||(Ue=Hn(Pe),Te=!0),Ue}var Jn=32,Dt="Generated with [openclaw-code-agent](https://github.com/goldmar/openclaw-code-agent)",Ht="Deterministic fallback metadata generated because no LLM PR metadata provider is configured.",zt="Deterministic fallback metadata generated because the LLM PR metadata provider failed or returned unusable output.",_s="PR metadata generated from the coding agent's final session report.";function Qn(e,t={preserveBlankLines:!0}){return e?.replace(/\r\n/g,`
15
15
  `).split(`
16
16
  `).map(r=>r.trim()).reduce((r,s)=>s?(r.push(s),r):(t.preserveBlankLines&&r[r.length-1]!==""&&r.push(s),r),[]).join(t.preserveBlankLines?`
17
- `:" ").replace(/[ \t]+/g," ").trim()||void 0}function ye(e,t){return e.length<=t?e:`${e.slice(0,Math.max(0,t-3)).trimEnd()}...`}function Le(e){return e.replace(/\b[A-Za-z0-9_-]*(?:api[_-]?key|token|secret|password|passwd|pwd|credential|credentials|authorization|auth)[A-Za-z0-9_-]*\b\s*[:=]\s*["']?[^"'\s,;)]+/gi,"[redacted credential]").replace(/\b(?:api key|token|secret|password|credential|credentials)\s+\[redacted credential\]/gi,"[redacted credential]").replace(/\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{16,}\b/g,"[redacted token]").replace(/\bgithub_pat_[A-Za-z0-9_]{20,}\b/g,"[redacted token]").replace(/\bsk-[A-Za-z0-9_-]{20,}\b/g,"[redacted token]").replace(/\bxox[baprs]-[A-Za-z0-9-]{20,}\b/g,"[redacted token]").replace(/\bAKIA[0-9A-Z]{16}\b/g,"[redacted token]").replace(/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{10,}\b/g,"[redacted token]").replace(/\bhttps?:\/\/\S+/gi,"[redacted link]").replace(/\b[A-Z]:\\(?:Users|Documents and Settings)\\[^\s`'")]+/gi,"[redacted path]").replace(/(?:^|[\s(])\/(?:home|Users|var|etc|private|tmp)\/[^\s`'").]+/g,t=>`${t.startsWith(" ")||t.startsWith("(")?t[0]:""}[redacted path]`).replace(new RegExp(`\\b[A-Za-z0-9_-]{${Dn},}\\b`,"g"),"[redacted token]")}function Fe(e){return/\b[A-Za-z0-9_-]*(?:api[_-]?key|token|secret|password|passwd|pwd|credential|credentials|authorization|auth)[A-Za-z0-9_-]*\b\s*[:=]\s*["']?[^"'\s,;)]+/i.test(e)||/\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{16,}\b/.test(e)||/\bgithub_pat_[A-Za-z0-9_]{20,}\b/.test(e)||/\bsk-[A-Za-z0-9_-]{20,}\b/.test(e)||/\bxox[baprs]-[A-Za-z0-9-]{20,}\b/.test(e)||/\bAKIA[0-9A-Z]{16}\b/.test(e)||/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{10,}\b/.test(e)||/\bhttps?:\/\/\S+/i.test(e)||/\b[A-Z]:\\(?:Users|Documents and Settings)\\[^\s`'")]+/i.test(e)||/(?:^|[\s(])\/(?:home|Users|var|etc|private|tmp)\/[^\s`'").]+/.test(e)||new RegExp(`\\b[A-Za-z0-9_-]{${Dn},}\\b`).test(e)}function Ss(e){let t=Un(e);if(!t)return;let n=t.match(/^[^.!?]+[.!?]/)?.[0]??t,r=Le(n).replace(/\s+/g," ").trim();return r?ye(r,180):void 0}function zn(e){return Le(e.trim()).replace(/\s+/g," ").trim()}function xs(e,t){return e?.commitMessages.map(n=>zn(n.message)).filter(Boolean).slice(0,t)??[]}function qt(){return["Not recorded by agent_pr. Review CI/checks and session output before merging."]}function jn(){return["Generated PR metadata omits full task prompts and redacts sensitive-looking prompt details.","Review touched areas for behavior, security, and privacy impact."]}function Is(e){let t={summary:[],changes:[],validation:[]},n;for(let r of(e??"").split(/\r?\n/)){let s=r.trim(),i=s.replace(/^[#*_\s]+|[:*_\s]+$/g,"").toLowerCase();if(/^(?:root cause|summary|result)$/.test(i)){n="summary";continue}if(/^(?:fix|changes|implementation|implemented)$/.test(i)){n="changes";continue}if(/^(?:validation|verification|tests)$/.test(i)){n="validation";continue}if(/^[A-Za-z][A-Za-z /_-]{2,30}:$/.test(s)){n=void 0;continue}let o=s.match(/^[-*â€ĸ]\s+(.+)$/)?.[1]?.trim();if(!n||!o||o.length<8)continue;let d=ye(V(o),n==="validation"?160:180);d&&!Fe(d)&&t[n].push(d)}return{summary:t.summary.slice(0,5),changes:t.changes.slice(0,10),validation:t.validation.slice(0,5)}}function Cs(e){let t=Ss(e.prompt),n=e.diffSummary,r=Is(e.outputPreview);return{sessionName:e.sessionName,branchName:e.branchName,objective:t,stats:n?{commits:n.commits,filesChanged:n.filesChanged,insertions:n.insertions,deletions:n.deletions}:void 0,changedFiles:n?.changedFiles??[],commitSubjects:xs(n,5),sessionSummary:r.summary,sessionChanges:r.changes,validation:r.validation.length>0?r.validation:qt(),notes:jn()}}function et(e,t,n){return Array.isArray(e)&&e.length>0&&e.length<=t&&e.every(r=>typeof r=="string"&&r.trim().length>0&&r.length<=n)}function Jn(e,t){let n=Un(e);if(!n)return[];let r=t?.toLowerCase();return n.split(/[.!?\n]/).map(s=>s.trim()).filter(s=>s.length>=24).filter(s=>!r||s.toLowerCase()!==r.replace(/[.!?]$/,"")).map(s=>s.toLowerCase())}function Ne(e,t,n){let r=e.toLowerCase();return Jn(t,n.objective).some(s=>r.includes(s))}function Hn(e){return/^(?:node|next|nuxt|vue|express|nest|three|d3|chart|ember|backbone|require)\.js$/i.test(e)}function Nt(e,t){let n=new Set(t.changedFiles);if([...e.matchAll(/(?:^|[^\w.-])((?:\.?[\w-][\w.-]*\/)+(?:\.?[\w-][\w.-]*))(?![\w.-])/g)].map(u=>u[1]).some(u=>/\.[A-Za-z0-9]+$/.test(u)&&!n.has(u)))return!0;let s=new Set(t.changedFiles.filter(u=>!u.includes("/"))),i=String.raw`\.[a-z0-9][\w.-]*`,o=e.matchAll(new RegExp(`[\\\`"'](${i})[\\\`"']`,"g"));for(let u of o)if(!s.has(u[1]))return!0;let d=e.matchAll(new RegExp(String.raw`\b(?:file|files|path|paths|changed|changes|updated?|updates?|modified?|modifies|touched?|touches|added?|adds?|removed?|removes?|deleted?|deletes?)\s+(?:the\s+)?(${i})(?![\w.-])`,"gi"));for(let u of d)if(!s.has(u[1]))return!0;if(s.size===0)return!1;let a=new Set([...s].map(u=>u.match(/\.([A-Za-z0-9]+)$/)?.[1]?.toLowerCase()).filter(u=>!!u)),l=String.raw`[A-Za-z0-9][\w.-]*\.([A-Za-z0-9]+)`,p=e.matchAll(new RegExp(`[\\\`"'](${l})[\\\`"']`,"g"));for(let u of p){let b=u[1],m=u[2]?.toLowerCase();if(m!==void 0&&a.has(m)&&!s.has(b)&&!Hn(b))return!0}return[...e.matchAll(new RegExp(String.raw`\b(?:file|files|path|paths|changed|changes|updated?|updates?|modified?|modifies|touched?|touches|added?|adds?|removed?|removes?|deleted?|deletes?)\s+(?:the\s+)?(${l})\b`,"gi"))].some(u=>{let b=u[1],m=u[2]?.toLowerCase();return m!==void 0&&a.has(m)&&!s.has(b)&&!Hn(b)})}function V(e){return Le(e).replace(/\s+/g," ").trim()}function _s(e,t,n){if(!e||typeof e!="object")return;let r=e;if(typeof r.title!="string"||r.title.trim().length===0||r.title.length>90||!et(r.summary,5,180)||!et(r.changes,10,160)||!et(r.validation,5,160)||!et(r.notes,5,180)||[r.title,...r.summary,...r.changes,...r.validation,...r.notes].some(d=>Fe(d)||Ne(d,n,t)))return;let i={title:V(r.title),summary:r.summary.map(V),changes:r.changes.map(V),validation:r.validation.map(V),notes:r.notes.map(V)},o=[i.title,...i.summary,...i.changes,...i.validation,...i.notes];if(!o.some(d=>!d||Fe(d)||Ne(d,n,t))&&!o.some(d=>Nt(d,t)))return i}function Bt(e,t,n={}){let r=ye(Le(e.sessionName).replace(/[-_]+/g," ").replace(/\s+/g," ").trim()||"agent worktree",80),s=e.sessionSummary.length>0||e.sessionChanges.length>0,i=s?e.commitSubjects[0]?.replace(/^(?:feat|fix|chore|refactor|test|docs|build|ci|perf)(?:\([^)]*\))?!?:\s*/i,""):void 0,o=ye(i||`OpenClaw agent changes: ${r}`,90),d=s?vs:n.reason==="provider-failed"||n.reason==="provider-invalid"?Wt:Ft,a=[d,...e.sessionSummary,`Session: ${r}.`,...e.objective?[`Objective: ${e.objective}`]:[],...e.stats?[`Scope: ${e.stats.commits} commits, ${e.stats.filesChanged} files changed (+${e.stats.insertions} / -${e.stats.deletions}).`]:["Scope: Diff summary was unavailable when the PR body was generated."]],l=e.sessionChanges.length>0?e.sessionChanges:e.changedFiles.length>0?e.changedFiles.slice(0,10).map(f=>`\`${f}\``):["Review the pushed worktree branch for the full set of changes."],p=e.sessionChanges.length===0&&e.changedFiles.length>10?[`...and ${e.changedFiles.length-10} more changed files.`]:[],g=["Fallback metadata is conservative; review the diff and CI/checks before marking the draft PR ready.",...e.notes],u={title:o,summary:a,changes:[...l,...p],validation:e.validation,notes:g},b=!1,m=!1,h=f=>{let S=V(f);if(Ne(S,t,e)){b=!0;let $=Jn(t,e.objective);for(let q of $){let F=new RegExp(q.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"gi");S=S.replace(F,"[redacted prompt detail]")}S=V(S)}return Nt(S,e)&&(m=!0,S="[redacted file reference outside change set]"),S=V(S),(Ne(S,t,e)||Fe(S))&&(b=!0,S="[redacted prompt detail]"),S};if(u={title:h(u.title)||ye(`OpenClaw agent changes: ${r}`,90),summary:u.summary.map(h).filter(f=>f&&f.length>0),changes:u.changes.map(h).filter(f=>f&&f.length>0),validation:u.validation.map(h).filter(f=>f&&f.length>0),notes:u.notes.map(h).filter(f=>f&&f.length>0)},u.summary.length===0&&(u.summary=[d]),u.changes.length===0&&(u.changes=["Review the pushed worktree branch for the full set of changes."]),u.validation.length===0&&(u.validation=qt()),u.notes.length===0&&(u.notes=jn()),b||m){let f="Some content was stripped from fallback metadata due to safety checks (prompt leak guard or references to files outside the diff).";u.notes.some(S=>S.toLowerCase().includes("stripped")||S.toLowerCase().includes("sanitized"))||(u.notes=[...u.notes,f])}let k=[u.title,...u.summary,...u.changes,...u.validation,...u.notes];if(k.some(f=>!f)||k.some(f=>Fe(f)||Ne(f,t,e))||k.some(f=>Nt(f,e))){let f=ye(Le(e.sessionName).replace(/[-_]+/g," ").trim()||"session",60);u={title:ye(`OpenClaw agent changes: ${f}`,90),summary:["Deterministic fallback metadata (sanitized for safety)."],changes:e.changedFiles.length>0?e.changedFiles.slice(0,5).map(S=>`\`${S}\``):["See the worktree branch diff for the full set of changes."],validation:qt(),notes:["Fallback metadata was hardened because prompt-leak or unknown-file checks were triggered after initial construction.","Review the actual diff, session output, and CI before merging."]}}if(e.branchName){let f=V(e.branchName);u.notes.some(S=>S.toLowerCase().includes(f.toLowerCase()))||(u.notes=[...u.notes,`Branch: ${f}`])}return u}async function tt(e){let t=Cs({sessionName:e.sessionName,branchName:e.branchName,prompt:e.prompt,outputPreview:e.outputPreview,diffSummary:e.diffSummary});if(!e.provider)return{ok:!0,metadata:Bt(t,e.prompt,{reason:"no-provider"}),evidence:t,fallbackReason:"no-provider"};try{let n=await e.provider.generatePrMetadata(t),r=_s(As(n),t,e.prompt);return r?{ok:!0,metadata:r,evidence:t}:{ok:!0,metadata:Bt(t,e.prompt,{reason:"provider-invalid"}),evidence:t,fallbackReason:"provider-invalid"}}catch(n){return`${n instanceof Error?n.message:String(n)}`,{ok:!0,metadata:Bt(t,e.prompt,{reason:"provider-failed"}),evidence:t,fallbackReason:"provider-failed"}}}function Ht(){let e=Wn(),t=Ts(e);if(t)return{async generatePrMetadata(n){if(typeof t.generatePrMetadata=="function")return await t.generatePrMetadata(n);if(typeof t.generatePullRequestMetadata=="function")return await t.generatePullRequestMetadata(n);let r=Ms(n);if(typeof t.generateObject=="function")return await t.generateObject({task:"openclaw-code-agent.pr-metadata",prompt:r,input:n});if(typeof t.generateText=="function")return await t.generateText({task:"openclaw-code-agent.pr-metadata",prompt:r});if(typeof t.complete=="function")return await t.complete({prompt:r})}}}function Ts(e){return[e?.prMetadata,e?.pullRequestMetadata,e?.llm,e?.ai,e?.model,e?.models].find(n=>!!(n&&typeof n=="object"&&(typeof n.generatePrMetadata=="function"||typeof n.generatePullRequestMetadata=="function"||typeof n.generateObject=="function"||typeof n.generateText=="function"||typeof n.complete=="function")))}function Ms(e){return["Generate concise pull request metadata for OpenClaw Code Agent work.",'Return only JSON with shape {"title":"...","summary":["..."],"changes":["..."],"validation":["..."],"notes":["..."]}.',"Use only the supplied evidence. Do not invent files, commands, tests, risks, links, paths, prompts, chat IDs, credentials, tokens, or secrets.","Keep the title under 90 characters. Keep bullets short and reviewable.","","Evidence:",JSON.stringify(e,null,2)].join(`
18
- `)}function As(e){if(typeof e!="string")return e&&typeof e=="object"&&"object"in e?e.object:e&&typeof e=="object"&&"data"in e?e.data:e;let t=e.trim();if(!t)return;let n=t.replace(/^```(?:json)?\s*/i,"").replace(/\s*```$/,"").trim();try{return JSON.parse(n)}catch{return}}function Dt(e){return e?e.includes(Lt)||e.includes(Ft)||e.includes(Wt):!1}function Ut(e){return e?e.trim()===Lt||e.includes(Ft)||e.includes(Wt):!1}function zt(e){return e?/^OpenClaw agent changes:/i.test(e.trim()):!1}function nt(e){let t=[`OpenClaw Code Agent session: ${e.sessionName}`,"","## Summary",...e.metadata.summary.map(n=>`- ${n}`),"","## Changes",...e.metadata.changes.map(n=>`- ${n}`),""];if(e.diffSummary){let n=e.diffSummary.commitMessages.slice(0,5).map(s=>`- ${s.hash} ${zn(s.message)} (${s.author})`),r=e.diffSummary.commits>5?[`- ...and ${e.diffSummary.commits-5} more`]:[];n.length>0&&t.push("## Commits",...n,...r,"")}return t.push("## Validation",...e.metadata.validation.map(n=>`- ${n}`),"","## Notes / Risks",...e.metadata.notes.map(n=>`- ${n}`),""),t.push("---",Lt),t.join(`
19
- `)}function rt(e,t){return{...t,baseBranch:t.baseBranch??e.worktreeBaseBranch,targetRepo:t.targetRepo??e.worktreePrTargetRepo,pushRemote:t.pushRemote??e.worktreePushRemote}}function ba(e,t={}){let n=t.updatedAt??new Date().toISOString(),r={pendingWorktreeDecisionSince:t.pendingSince??n,lastWorktreeReminderAt:void 0,worktreeDecisionSnoozedUntil:void 0,lifecycle:"awaiting_worktree_decision",worktreeState:"pending_decision",worktreeLifecycle:rt(e,{state:"pending_decision",updatedAt:n,notes:t.notes})};return t.clearResolverSessionId&&(r.autoMergeResolverSessionId=void 0),r}function Pa(e,t,n,r={}){let s=r.updatedAt??new Date().toISOString();return{autoMergeConflictResolutionAttemptCount:n,autoMergeResolverSessionId:t,pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeDecisionSnoozedUntil:void 0,lifecycle:"terminal",worktreeState:"merge_conflict_resolving",worktreeLifecycle:rt(e,{state:"merge_conflict_resolving",updatedAt:s,notes:r.notes})}}function Qn(e,t={}){let n=t.updatedAt??new Date().toISOString(),r=t.resolvedAt??n,s={worktreeMerged:!0,worktreeMergedAt:t.mergedAt??r,lifecycle:"terminal",worktreeState:"merged",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeDecisionSnoozedUntil:void 0,worktreeLifecycle:rt(e,{state:"merged",updatedAt:n,resolvedAt:r,resolutionSource:t.resolutionSource??"agent_merge"})};return t.clearResolverSessionId&&(s.autoMergeResolverSessionId=void 0),s}function Gn(e,t){let n=t.updatedAt??new Date().toISOString(),r={worktreePrUrl:t.prUrl,lifecycle:"terminal",worktreeState:"pr_open",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeDecisionSnoozedUntil:void 0,worktreeLifecycle:rt(e,{state:"pr_open",updatedAt:n,resolutionSource:"agent_pr",baseBranch:t.baseBranch,targetRepo:t.targetRepo})};return t.prNumber!==void 0&&(r.worktreePrNumber=t.prNumber),t.disposition!==void 0&&(r.worktreeDisposition=t.disposition),r}import{existsSync as Gi,readFileSync as Ki}from"fs";import*as ut from"@anthropic-ai/claude-agent-sdk";function M(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function E(e,t,n){for(let r of t){let s=e?.[r];if(typeof s!="string")continue;let i=n?.trim===!1?s:s.trim();if(i)return i}}function Kn(e,t){return t&&typeof t.recommended=="boolean"?t.recommended:t&&typeof t.isRecommended=="boolean"?t.isRecommended:/\b(?:not\s+(?:a\s+)?|non[-\s]?|un)recommended\b/i.test(e)?!1:/\brecommended\b/i.test(e)}function Zn(e){if(typeof e=="string"){let o=e.trim();return o?{label:o,value:o,recommended:Kn(o)}:void 0}let t=M(e);if(!t)return;let n=E(t,["label","title","text","value","name","id"])?.trim();if(!n)return;let r=E(t,["description","preview","detail","details"]),s=E(t,["value","id","name"]),i=t.isOther===!0||t.is_other===!0||t.other===!0;return{label:n,...r?{description:r}:{},...s?{value:s}:{},...i?{isOther:!0}:{},recommended:Kn(n,t)}}function st(e){let t=M(e);if(!t)return[];let n=t.options??t.choices??t.availableDecisions??t.decisions;return Array.isArray(n)?n.map(Zn).filter(r=>!!r):[]}function ve(e){let t=M(e);return(Array.isArray(t?.questions)?t.questions:[]).map((r,s)=>Es(r,s)).filter(r=>!!r)}function Es(e,t=0){let n=M(e);if(!n)return;let r=E(n,["question","prompt","message","text","summary"])?.trim();if(!r)return;let s=E(n,["id","questionId","question_id","name"]),i=E(n,["header","title","label"]),d=(Array.isArray(n.options)?n.options:Array.isArray(n.choices)?n.choices:[]).map(Zn).filter(p=>!!p),a=n.multiSelect===!0||n.multi_select===!0,l=n.isOther===!0||n.is_other===!0||n.allowFreeText===!0||n.allowsFreeText===!0||a||d.some(p=>p.isOther);return{id:s??`question_${t+1}`,...i?{header:i}:{},question:r,options:d,...a?{multiSelect:!0}:{},...l?{allowsFreeText:!0}:{},...n.isSecret===!0||n.is_secret===!0?{isSecret:!0}:{}}}function Vn(e,t,n){let r=[n>1?`Question ${t+1}`:void 0,e.header].filter(Boolean).join(" - "),s=[...r?[r]:[],e.question];return e.options.length>0&&s.push("Options:",...e.options.map((i,o)=>{let d=i.recommended&&!/\brecommended\b/i.test(i.label)?" (recommended)":"",a=i.description?` - ${i.description}`:"",l=i.isOther?" (free text)":"";return` ${o+1}. ${i.label}${d}${l}${a}`})),e.allowsFreeText&&!e.options.some(i=>i.isOther)&&s.push(e.multiSelect?"Reply with one or more option labels.":"Free-form answer is allowed."),s}function it(e){if(e.length===0)return;let t=e.flatMap((n,r)=>[...r>0?[""]:[],...Vn(n,r,e.length)]);return e.length>1&&t.push("","Reply with answers by question, for example: Q1: ..., Q2: ..."),t.join(`
20
- `)}function ne(e,t,n){return Vn(e,t,n).join(`
21
- `)}function Se(e){return{type:"backend_ref",ref:e}}function xe(e){return{type:"run_started",...e?{runId:e}:{}}}function be(e){return{type:"text_delta",text:e}}function ot(e,t){return{type:"tool_call",name:e,input:t}}function X(e){return{type:"pending_input",state:e}}function le(e){return e?{type:"pending_input_resolved",requestId:e}:{type:"pending_input_resolved"}}function at(e,t){return{type:"plan_artifact",artifact:e,finalized:t}}function Ie(e){return e?{type:"settings_changed",permissionMode:e}:{type:"settings_changed"}}function re(e){return{type:"run_completed",data:e}}var ce=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 $s(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
- `)}}function Os(e,t,n){let r=ve(n),s=r.length>0?0:void 0,i=s!=null?r[s]:void 0,o=i?.options.map(a=>a.label)??[],d=i?ne(i,s,r.length):it(r);return{requestId:`${e||"claude"}-ask-${t}`,kind:"question",promptText:d,options:o,...r.length>0?{questions:r}:{},...s!=null?{activeQuestionIndex:s}:{},allowsFreeText:i?.allowsFreeText===!0||o.length===0}}var dt=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 ce,r=!1,s="",i=!1,o=0,d=t.resumeSessionId??"",a=t.canUseTool,l={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(m,h)=>{if(m!=="AskUserQuestion")return{behavior:"allow"};let k=Os(d,++o,h);n.enqueue(X(k));try{let f=await a(m,h);return n.enqueue(le(k.requestId)),f}catch(f){throw n.enqueue(le(k.requestId)),f}}}:{}};t.resumeSessionId&&(l.resume=t.resumeSessionId,l.forkSession=t.forkSession??!1);let p=t.prompt,g=this.deps.query??ut.query,u=this.deps.startup??ut.startup,b=(async()=>{if(typeof u!="function")return g({prompt:p,options:l});let m=await u({options:l});try{return m.query(p)}catch(h){throw await m.close?.(),h}})();return(async()=>{try{let m=await b;for await(let h of m){let k=h;if(k.type==="system"&&k.subtype==="init"){d=k.session_id??d,n.enqueue(Se({kind:"claude-code",conversationId:d}));continue}if(k.type==="system"&&k.subtype==="status"&&k.permissionMode){n.enqueue(Ie(k.permissionMode));continue}if(k.type==="assistant"){r||(r=!0,n.enqueue(xe()));for(let f of k.message?.content??[]){if(f.type==="text"){s+=s?`
23
- ${f.text}`:f.text,n.enqueue(be(f.text));continue}f.type==="tool_use"&&((f.name==="ExitPlanMode"||f.name==="set_permission_mode")&&(i=!0),f.name!=="AskUserQuestion"&&n.enqueue(ot(f.name,f.input)))}continue}if(k.type==="result"){let f=s.trim();if(f&&(t.permissionMode==="plan"||i)){let S={explanation:void 0,steps:[],markdown:f};n.enqueue(at(S,!0))}n.enqueue(re({success:k.subtype==="success",duration_ms:k.duration_ms??0,total_cost_usd:k.total_cost_usd??0,num_turns:k.num_turns??0,result:$s(k),session_id:k.session_id??d})),s="",i=!1,r=!1}}}finally{n.close()}})().catch(m=>{n.enqueue(re({success:!1,duration_ms:0,total_cost_usd:0,num_turns:0,result:m instanceof Error?m.message:String(m),session_id:d})),n.close()}),{messages:n.messages(),async setPermissionMode(m){let h=await b;typeof h.setPermissionMode=="function"&&await h.setPermissionMode(m)},async streamInput(m){let h=await b;typeof h.streamInput=="function"&&await h.streamInput(m)},async interrupt(){let m=await b;typeof m.interrupt=="function"&&await m.interrupt()}}}buildUserMessage(t,n){return{type:"user",message:{role:"user",content:t},parent_tool_use_id:null,session_id:n}}};import{spawn as Bs}from"node:child_process";import qs from"node:readline";function Xn(e){return e instanceof Error?e.message:String(e)}function Ce(e,t){JSON.stringify({component:"CodexAppServerRpc",event:e,at:new Date().toISOString(),...t})}function Ns(e,t){return{commandKind:e==="codex"?"codex":"custom",appServerSubcommand:!0,configuredArgCount:t.length}}function Ls(e){try{let t=JSON.parse(e);return!t||typeof t!="object"||Array.isArray(t)?null:t}catch{return null}}async function Fs(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:Xn(r)}})}}}var ct=class{constructor(t,n,r){this.command=t;this.args=n;this.requestTimeoutMs=r}command;args;requestTimeoutMs;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=Bs(this.command,["app-server",...this.args],{stdio:["pipe","pipe","pipe"],env:process.env});if(Ce("process.spawn",{...Ns(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,qs.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=>{Ce("process.error",{pid:t.pid,error:Xn(r)})}),t.on("close",(r,s)=>{Ce("process.close",{pid:t.pid,code:r,signal:s,pendingRequests:this.pending.size,recentStderr:jt(this.stderrTail.trim())}),this.flushPending(new Error("codex app server stdio closed")),this.process=null})}async close(){Ce("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.kill()}async notify(t,n){this.write({jsonrpc:"2.0",method:t,params:n??{}})}async request(t,n,r){let s=`rpc-${++this.counter}`,i=new Promise((o,d)=>{let a=Math.max(100,r??this.requestTimeoutMs),l=setTimeout(()=>{this.pending.delete(s),Ce("request.timeout",{id:s,method:t,timeoutMs:a,pid:this.process?.pid,recentStderr:jt(this.stderrTail.trim())}),d(new Error(this.buildTimeoutErrorMessage(t,a)))},a);l.unref?.(),this.pending.set(s,{resolve:o,reject:d,timer:l})});return this.write({jsonrpc:"2.0",id:s,method:t,params:n??{}}),await i}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=Ls(t);n&&await Fs(n,{pending:this.pending,onNotification:this.onNotification,onRequest:this.onRequest,respond:r=>this.write(r)})}flushPending(t){this.pending.size>0&&Ce("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: ${jt(r)}`:"";return`codex app server timeout after ${n}ms: ${t}${s}`}};function jt(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)}function Yn(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 We(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 Ws(e,t){if(!t||t.length===0)return!0;if(!e)return!1;let n=e.toLowerCase();return t.some(r=>We("codex",r)?.toLowerCase()===n)}function Ea(e,t,n){return e==="codex"?Ws(t,n):Yn(t,n)}function er(e,t){return e!=="codex"||!t?!0:!t.includes("/")}function $a(e,t,n){if(e!=="codex"||!t||!n||n.length===0)return t;let r=t.toLowerCase(),s=n.find(i=>We("codex",i)?.toLowerCase()===r);return We("codex",s)??t}function Hs(e){return e instanceof Error?e.message:String(e)}function tr(e){return e?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function pe(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(n=>pe(n)).join("");let t=M(e);if(!t)return"";for(let n of["delta","text","content","message","input","output","parts"]){let r=pe(t[n]);if(r)return r}for(let n of["item","turn","thread","response","result","data"]){let r=pe(t[n]);if(r)return r}return""}function He(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),i=M(t.serverRequest);return{threadId:E(t,["threadId","thread_id","conversationId","conversation_id"])??E(n,["id","threadId","thread_id","conversationId"]),runId:E(t,["turnId","turn_id","runId","run_id"])??E(r,["id","turnId","turn_id","runId","run_id"]),requestId:E(t,["requestId","request_id","serverRequestId"])??E(i,["id","requestId","request_id"]),itemId:E(t,["itemId","item_id"])??E(s,["id","itemId","item_id"])}}function lt(e,t,n=0){if(n>6)return;if(Array.isArray(e)){for(let i of e){let o=lt(i,t,n+1);if(o)return o}return}let r=M(e);if(!r)return;let s=E(r,t);if(s)return s;for(let i of Object.values(r)){let o=lt(i,t,n+1);if(o)return o}}function De(e){return{threadId:He(e).threadId,cwd:lt(e,["cwd","workdir","directory"])}}function nr(e){let t=e?.trim();return!!(t&&/[/\\]worktrees[/\\][^/\\]+[/\\][^/\\]+/.test(t))}function rr(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 pt(e){let t=M(e);if(!t)return;let n=M(t.item)??t;return E(n,["id","itemId","item_id","messageId","message_id"])}function Ds(e,t=!1){let n=M(e);if(!n)return"";let r=M(n.item)??n;return E(r,["type"])?.toLowerCase()!=="agentmessage"?"":t?pe(r):E(r,["text"],{trim:!1})??pe(r)}function sr(e,t){let n=e.trim().toLowerCase();return n==="item/agentmessage/delta"?{mode:"delta",text:pe(t),itemId:pt(t)}:n==="item/completed"?{mode:"snapshot",text:Ds(t),itemId:pt(t)}:{mode:"ignore",text:""}}function ir(e){return{itemId:pt(e),delta:pe(e)}}function or(e){let t=M(e),n=M(t?.plan),s=(Array.isArray(t?.plan)?t.plan:Array.isArray(n?.steps)?n.steps:[]).map(i=>{let o=M(i),d=E(o,["step","title","text"]);if(!d)return null;let a=E(o,["status"])?.toLowerCase()??"pending";return{step:d,status:a==="inprogress"||a==="in_progress"?"inProgress":a==="completed"?"completed":"pending"}}).filter(Boolean);return{explanation:E(n,["explanation"])??E(t,["explanation"]),steps:s}}function ar(e){let t=M(e);if(!t)return{};let n=M(t.item)??t;return E(n,["type"])?.toLowerCase()!=="plan"?{}:{itemId:pt(n),text:E(n,["text"],{trim:!1})??pe(n)}}function dr(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,i=E(s,["status"])?.toLowerCase();return i==="failed"?"failed":i==="interrupted"||i==="cancelled"?"interrupted":"completed"}function ur(e,t){let n=M(t)??{},r=M(n.turn)??n,s=M(r.error)??M(n.error);if(s)return E(s,["message","text","summary","reason"])}function Us(e,t){let n=Hs(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 zs=new Set(["thread/resume","turn/start","turn/steer","turn/interrupt"]);function js(e){return zs.has(e.trim().toLowerCase())}function Js(e){let t=M(e);return t?!!E(t,["threadId","thread_id"]):!1}async function Ue(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(js(n)&&!Js(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,!Us(s,n))continue}}throw t instanceof Error?t:new Error(String(t))}function cr(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 lr(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 Qs(e){return[{type:"text",text:e}]}function Gs(e,t,n,r){let s=t?.trim(),i=n?.trim(),o=r?.trim();if(e!=="plan")return s||i||o?{mode:"default",settings:{...s?{model:s}:{},...i?{reasoningEffort:i}:{},developerInstructions:o??null}}:void 0;if(!(!s&&!i&&!o))return{mode:"plan",settings:{...s?{model:s}:{},...i?{reasoningEffort:i}:{},developerInstructions:o??null}}}function pr(e){let t={threadId:e.threadId,input:Qs(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=Gs(e.permissionMode??"default",e.model,e.reasoningEffort,e.systemPrompt);return n?[{...t,collaborationMode:n}]:[t]}function fr(e){return[{threadId:e.threadId,turnId:e.turnId}]}function Ks(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 mr(e,t,n){let r=e.trim().toLowerCase(),s=r.includes("requestapproval"),i=r.includes("requestuserinput"),o=ve(n);if(i&&o.length===0)throw new Error(`Malformed Codex request_user_input payload for ${t}: expected non-empty questions[]`);let d=s?st(n):[],a=o.length>0?0:void 0,l=a!=null?o[a]:void 0,p=l?l.options:[],u=(s&&p.length===0?d:p).map(h=>h.label),b=(l?ne(l,a??0,o.length):it(o))??(s?lt(n,["question","prompt","message","text","summary","reason"]):void 0)??void 0,m=s?u.map(h=>({kind:"approval",label:h,decision:Ks(h),responseDecision:h})):u.map(h=>({kind:"option",label:h,value:h}));return{requestId:t,kind:s?"approval":"question",promptText:b,options:u,...o.length>0?{questions:o}:{},...a!=null?{activeQuestionIndex:a}:{},actions:m,allowsFreeText:!0}}function gr(e){let t=e.trim().toLowerCase();return t.includes("requestuserinput")||t.includes("requestapproval")}function Jt(e,t){let n=e==="bypassPermissions"?"never":t?.trim()||"never";return{approvalPolicy:n,sandbox:n==="never"?"danger-full-access":void 0}}var Zs="1.0",Qt=12e4,hr=["--listen","stdio://"],Vs="OPENCLAW_CODEX_APP_SERVER_COMMAND",Xs="OPENCLAW_CODEX_APP_SERVER_ARGS",Ys="OPENCLAW_CODEX_APP_SERVER_TIMEOUT_MS",ei=/^(?: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 ti(e){let t=e?.trim();return t&&ei.test(t)?t:void 0}function ni(e){let t=e?.trim();if(!t||!/^\d+$/.test(t))return Qt;let n=Number(t);return Number.isSafeInteger(n)&&n>0?n:Qt}function ze(e){return e instanceof Error?e.message:String(e)}function J(e,t){JSON.stringify({component:"CodexHarness",event:e,at:new Date().toISOString(),...t})}function ri(e){return{commandKind:e.command==="codex"?"codex":"custom",configuredArgCount:e.args.length,requestTimeoutMs:e.requestTimeoutMs}}function se(e){return{hasThreadId:!!e.threadId,hasTurnId:!!e.turnId,hasBackendWorktreePath:!!e.backendWorktreePath,hasBackendWorktreeId:!!e.backendWorktreeId}}function si(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 wr(e,t,n){let r=e.questions??[],s=r[t];return s?{...e,promptText:ne(s,t,r.length),options:s.options.map(i=>i.label),activeQuestionIndex:t,answers:n}:e}var ft=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[Vs]?.trim()||"codex",args:ii(process.env[Xs]),requestTimeoutMs:ni(process.env[Ys])},r=this.deps.createClient?.(n)??new ct(n.command,n.args,n.requestTimeoutMs),s=new ce,i=ti(t.resumeSessionId);t.resumeSessionId;let o,d=t.backendRef?.worktreePath,a=t.backendRef?.worktreeId,l=t.permissionMode??"default",p=We(this.name,t.model);if(!er(this.name,p))throw new Error(`Codex model "${t.model}" is not supported. Use a bare Codex model id such as "gpt-5.6-sol".`);let g,u=0,b="",m=[],h,k=new Map,f=new Set,S=x=>{let w=x?.trim();if(!w)return;let c=t.originalWorkdir?.trim()||t.cwd.trim();t.worktreeStrategy&&t.worktreeStrategy!=="off"&&w!==c&&nr(w)&&(d=w,a=rr(w))},$=()=>{i&&s.enqueue(Se({kind:"codex-app-server",conversationId:i,...o?{runId:o}:{},...a?{worktreeId:a}:{},...d?{worktreePath:d}:{}}))};r.setNotificationHandler(async(x,w)=>{let c=x.trim().toLowerCase(),R=He(w),T=De(w);if(R.threadId&&i&&R.threadId!==i)return;if(R.threadId&&(i=R.threadId),R.runId&&(o=R.runId),S(T.cwd),(R.threadId||R.runId||T.cwd)&&$(),c==="serverrequest/resolved"){g&&(s.enqueue(le(g.requestId)),g=void 0);return}if(c==="turn/plan/updated"){let _=or(w);b=_.explanation??b,_.steps.length>0&&(m=_.steps);return}if(c==="item/plan/delta"){let _=ir(w);if(_.itemId&&_.delta){let O=k.get(_.itemId)??"";k.set(_.itemId,`${O}${_.delta}`)}return}if(c==="item/completed"){let _=ar(w);if(_.text?.trim()){let O={explanation:b||void 0,steps:m,markdown:_.text.trim()};s.enqueue(at(O,!0));return}}let C=sr(c,w);if(C.mode==="delta"&&C.text){C.itemId&&f.add(C.itemId),s.enqueue(be(C.text));return}C.mode==="snapshot"&&C.text&&(!C.itemId||!f.has(C.itemId))&&s.enqueue(be(C.text)),(c==="turn/completed"||c==="turn/failed"||c==="turn/cancelled")&&h&&(h.method=x,h.params=w,h.resolve())}),r.setRequestHandler(async(x,w)=>{if(!gr(x))return{};let c=He(w),R=De(w);if(c.threadId&&i&&c.threadId!==i)return{};c.threadId&&(i=c.threadId),c.runId&&(o=c.runId),S(R.cwd),(c.threadId||c.runId||R.cwd)&&$();let T=c.requestId??`${i??"codex"}-${Date.now().toString(36)}`,C;try{C=mr(x,T,w)}catch(Me){let Je=ze(Me);return`${Je}`,{error:Je}}let _=x.trim().toLowerCase(),O=C.options,A=C.actions??[],fe=await new Promise(Me=>{g={requestId:T,methodLower:_,state:C,options:O,actions:A,answers:{...C.answers??{}},resolveResponse:Me},s.enqueue(X(C))});return g=void 0,s.enqueue(le(T)),fe});let q=async()=>{J("client.initialize.start",{...ri(n),hasResumeSessionId:!!t.resumeSessionId}),await r.connect(),await r.request("initialize",{protocolVersion:Zs,clientInfo:{name:"openclaw-code-agent",version:"3.1.0"},capabilities:{experimentalApi:!0}},n.requestTimeoutMs),await r.notify("initialized",{}),J("client.initialize.done",{hasResumeSessionId:!!t.resumeSessionId})},F=async()=>{let x=Jt(l,t.codexApprovalPolicy);if(i){J("thread.resume.start",se({threadId:i}));let R=await Ue({client:r,methods:["thread/resume"],payloads:lr({threadId:i,model:p,reasoningEffort:t.reasoningEffort,fastMode:t.fastMode,approvalPolicy:x.approvalPolicy,sandbox:x.sandbox}),timeoutMs:n.requestTimeoutMs}),T=De(R);i=T.threadId??i,S(T.cwd),$(),J("thread.resume.done",{...se({threadId:i,backendWorktreePath:d,backendWorktreeId:a})});return}J("thread.start.start",{hasCwd:!!t.cwd});let w=await Ue({client:r,methods:["thread/start","thread/new"],payloads:cr({cwd:t.cwd,model:p,reasoningEffort:t.reasoningEffort,fastMode:t.fastMode,approvalPolicy:x.approvalPolicy,sandbox:x.sandbox}),timeoutMs:n.requestTimeoutMs}),c=De(w);if(i=c.threadId,!i)throw new Error("Codex App Server did not return a thread id.");S(c.cwd),$(),J("thread.start.done",{...se({threadId:i,backendWorktreePath:d,backendWorktreeId:a})})},Q=async x=>{await F(),J("turn.start",{...se({threadId:i}),runCounter:u+1,promptChars:x.length,permissionMode:l}),s.enqueue(xe()),u+=1,b="",m=[],k.clear(),f.clear();let w="",c,R,T=new Promise(C=>{R=C});h={resolve:R};try{let C=Jt(l,t.codexApprovalPolicy),_=await Ue({client:r,methods:["turn/start"],payloads:pr({threadId:i,prompt:x,model:p,reasoningEffort:t.reasoningEffort,fastMode:t.fastMode,systemPrompt:t.systemPrompt,permissionMode:l,approvalPolicy:C.approvalPolicy,sandbox:C.sandbox}),timeoutMs:n.requestTimeoutMs}),O=He(_);O.runId&&(o=O.runId,$()),await T,w=h?.method??"turn/failed",c=h?.params;let A=dr(w,c);J("turn.terminal",{...se({threadId:i,turnId:o}),terminalMethod:w,outcome:A}),s.enqueue(re({success:A==="completed",outcome:A,duration_ms:0,total_cost_usd:0,num_turns:u,result:ur(w,c),session_id:i}))}catch(C){J("turn.error",{...se({threadId:i,turnId:o}),error:ze(C)}),s.enqueue(re({success:!1,duration_ms:0,total_cost_usd:0,num_turns:u,result:ze(C),session_id:i??""}))}finally{h=void 0}},N=async x=>{let w=g;if(!w)return!1;let c=x.trim();if(w.methodLower.includes("requestapproval"))return w.resolveResponse({decision:c||"decline"}),!0;let R=w.state.questions??[];if(R.length>0){if(!c)return!1;let T=w.state.activeQuestionIndex??0,C=R[T];if(!C)return!1;w.answers={...w.answers,[C.id]:{answers:[c]}};let _=T+1;if(_<R.length)return w.state=wr(w.state,_,w.answers),w.options=w.state.options,s.enqueue(X(w.state)),!0;w.resolveResponse({answers:w.answers})}else w.resolveResponse({text:c});return!0},Y=async(x,w={})=>{let c=g;if(!c||w.requestId&&w.requestId!==c.state.requestId)return!1;let R=c.actions[x];if(R?.kind==="approval")return c.resolveResponse({decision:R.responseDecision,...R.proposedExecpolicyAmendment?{proposedExecpolicyAmendment:R.proposedExecpolicyAmendment}:{}}),!0;let T=c.state.questions??[],C=c.state.activeQuestionIndex??0,_=T.length>0?T[C]:void 0;if(w.questionId&&w.questionId!==_?.id)return!1;let O=_?.options[x];if(_&&O){c.answers={...c.answers,[_.id]:{answers:[O.value??O.label]}};let fe=C+1;return fe<T.length?(c.state=wr(c.state,fe,c.answers),c.options=c.state.options,s.enqueue(X(c.state)),!0):(c.resolveResponse({answers:c.answers}),!0)}let A=c.options[x];return A?(c.methodLower.includes("requestapproval")?c.resolveResponse({decision:A}):c.resolveResponse({option:A,index:x}),!0):!1},ie=typeof t.prompt=="string"?(async function*(){yield{type:"user",text:t.prompt,session_id:t.resumeSessionId??""}})():t.prompt;return(async()=>{try{await q();for await(let x of ie){let w=si(x).trim();!w||await N(w)||await Q(w)}}catch(x){J("session.error",{...se({threadId:i,turnId:o}),error:ze(x)}),s.enqueue(re({success:!1,duration_ms:0,total_cost_usd:0,num_turns:u,result:ze(x),session_id:i??t.resumeSessionId??""}))}finally{J("client.close.start",se({threadId:i,turnId:o})),await r.close().catch(()=>{}),J("client.close.done",se({threadId:i,turnId:o})),s.close()}})(),{messages:s.messages(),async setPermissionMode(x){l=x,s.enqueue(Ie(x))},async submitPendingInputOption(x,w){return Y(x,w)},async submitPendingInputText(x){return N(x)},async interrupt(){!i||!o||await Ue({client:r,methods:["turn/interrupt"],payloads:fr({threadId:i,turnId:o}),timeoutMs:n.requestTimeoutMs}).catch(()=>{})}}}buildUserMessage(t,n){return{type:"user",text:t,session_id:n}}};function ii(e){if(e===void 0)return hr;let t=tr(e);return t.length>0?t:hr}import{spawn as oi}from"node:child_process";import{constants as ai,accessSync as di}from"node:fs";import{createServer as ui}from"node:net";import{delimiter as ci,dirname as Gt,join as Pr,sep as li}from"node:path";var pi="OPENCLAW_OPENCODE_COMMAND",fi=15e3,gt=6e4,mi=250,gi=15*6e4,hi=["edit","bash","task","todowrite","external_directory"];function Te(e){return e instanceof Error?e.message:String(e)}function wi(e){try{return di(e,ai.X_OK),!0}catch{return!1}}function yi(e){return e.includes("/")||li==="\\"&&e.includes("\\")}function bi(e){let t=(e??"").split(ci).map(r=>r.trim()).filter(Boolean),n=[...t];for(let r of t)r.replaceAll("\\","/").endsWith("/opt/node/bin")&&n.push(Pr(Gt(Gt(Gt(r))),"bin"));return n.push("/home/linuxbrew/.linuxbrew/bin","/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin"),[...new Set(n)]}function Pi(e,t=process.env.PATH){if(yi(e))return e;for(let n of bi(t)){let r=Pr(n,e);if(wi(r))return r}return e}function H(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function ki(e){return typeof e?.cost=="number"&&Number.isFinite(e.cost)&&e.cost>=0?e.cost:0}function Ri(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 kr(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 vi(e){let t=kr(e);return t?{id:t.modelID,providerID:t.providerID}:void 0}function yr(e){let t=e??"default",n=t==="plan"?"deny":t==="bypassPermissions"?"allow":"ask";return hi.map(r=>({permission:r,pattern:"*",action:n}))}function Kt(){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 Si(){return new Promise((e,t)=>{let n=ui();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 Rr(e){await new Promise(t=>setTimeout(t,e))}async function mt(e,t){if(t.signal?.aborted)throw new Error(t.abortMessage??"Operation was aborted.");return await new Promise((n,r)=>{let s=!1,i=()=>{clearTimeout(a),t.signal?.removeEventListener("abort",d)},o=l=>{s||(s=!0,i(),l())},d=()=>{o(()=>r(new Error(t.abortMessage??"Operation was aborted.")))},a=setTimeout(()=>{o(()=>{t.onTimeout?.(),r(new Error(t.timeoutMessage))})},t.timeoutMs);t.signal?.addEventListener("abort",d,{once:!0}),e.then(l=>o(()=>n(l)),l=>o(()=>r(l)))})}async function _e(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 Zt=class extends Error{constructor(n,r,s,i){super(`OpenCode ${n} ${r} failed with ${s}${i?`: ${i}`:""}`);this.method=n;this.path=r;this.status=s;this.body=i}method;path;status;body};function xi(e){return e.headers.get("content-type")?.toLowerCase()??""}function Vt(e){return e.replace(/\s+/g," ").trim().slice(0,300)}function Ii(e,t){return e.includes("text/html")||/^\s*<!doctype html\b/i.test(t)||/^\s*<html[\s>]/i.test(t)}function Ci(e,t,n,r){let s=n?`content-type ${n}`:"missing content-type",i=Vt(r),o=Ii(n,r)?" (looks like the OpenCode web UI HTML app shell)":"";return`OpenCode ${e} ${t} expected JSON API response but received ${s}${o}${i?`: ${i}`:""}`}function _i(e,t,n){let r=kr(t);return{...r?{model:{providerID:r.providerID,modelID:r.modelID}}:{},...n?.trim()?{system:n.trim()}:{},parts:[{type:"text",text:e}]}}function Ti(e,t){if(!H(e))return!1;if(!(t in e))return!0;let n=e[t];return H(n)&&n.type==="idle"}function Mi(e){return e.type==="session.idle"?!0:e.type!=="session.status"?!1:(e.properties.status??e.properties.type)==="idle"}var br=Promise.resolve();function Ai(e){return new Promise((t,n)=>{br=br.then(()=>e().then(t,n)).catch(()=>{})})}async function Ei(e){return Ai(async()=>{let t=await Si(),n=process.env[pi]?.trim()||"opencode",r=Pi(n),s=["serve","--hostname","127.0.0.1","--port",String(t),"--print-logs"],i=e.fetch??fetch,o=Math.min(e.requestTimeoutMs??gt,1e4),d=e.startupTimeoutMs??fi,a=oi(r,s,{cwd:e.cwd,stdio:["ignore","pipe","pipe"]}),l=`http://127.0.0.1:${t}`,p="",g="",u,b=(f,S)=>{let $=f+String(S);return $.length>8e3?$.slice(-8e3):$};a.stdout.on("data",f=>{p=b(p,f)}),a.stderr.on("data",f=>{g=b(g,f)}),a.once("error",f=>{u=f});let m=()=>` Command: ${n===r?r:`${r} (resolved from ${n})`} ${s.join(" ")}. Cwd: ${e.cwd}. Port: ${t}. PATH: ${process.env.PATH??""}.`,h=()=>{let f=[p.trim(),g.trim()].filter(Boolean).join(`
25
- `).trim();return`${m()}${f?` Output:
26
- ${f}`:""}`},k=()=>{_e(a)};if(e.signal?.aborted)throw await _e(a),new Error(`OpenCode server startup aborted before readiness.${h()}`);e.signal?.addEventListener("abort",k,{once:!0});try{let f=Date.now();for(;Date.now()-f<d;){if(e.signal?.aborted)throw await _e(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 Oi({baseUrl:l,fetchImpl:i,requestTimeoutMs:o,startupSignal:e.signal,timeoutMessage:`OpenCode GET /api/health timed out after ${o}ms during server readiness.${h()}`,abortMessage:`OpenCode server startup aborted before readiness.${h()}`}))return{baseUrl:l,close:async()=>{await _e(a)}}}catch{if(e.signal?.aborted)throw await _e(a),new Error(`OpenCode server startup aborted before readiness.${h()}`)}await Rr(100)}throw await _e(a),new Error(`Timed out waiting for OpenCode server readiness.${h()}`)}finally{e.signal?.removeEventListener("abort",k)}})}async function $i(e){for(let t=1;;t+=1)try{return await Ei(e)}catch(n){if(t>=3||!/EADDRINUSE|address already in use|bind: address already in use/i.test(Te(n)))throw n}}async function Oi(e){let t=new AbortController,n=()=>t.abort();e.startupSignal?.aborted?t.abort():e.startupSignal?.addEventListener("abort",n,{once:!0});try{return(await mt(e.fetchImpl(`${e.baseUrl}/api/health`,{headers:Kt(),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 Xt=class{constructor(t,n,r=gt){this.baseUrl=t;this.fetchImpl=n;this.requestTimeoutMs=r}baseUrl;fetchImpl;requestTimeoutMs;async request(t,n,r,s={}){let i=new AbortController,o=!1,d=!1,a=s.timeoutMs??this.requestTimeoutMs,l=`OpenCode ${t} ${n} timed out after ${a}ms.`,p=`OpenCode ${t} ${n} was aborted.`,g=()=>{o=!0,i.abort()};s.signal?.aborted?(o=!0,i.abort()):s.signal?.addEventListener("abort",g,{once:!0});try{let u=await mt(this.fetchImpl(`${this.baseUrl}${n}`,{method:t,headers:{...Kt(),...r===void 0?{}:{"content-type":"application/json"}},body:r===void 0?void 0:JSON.stringify(r),signal:i.signal}),{timeoutMs:a,timeoutMessage:l,signal:s.signal,abortMessage:p,onTimeout:()=>{d=!0,i.abort()}});if(!u.ok){let h=await mt(u.text(),{timeoutMs:a,timeoutMessage:l,signal:s.signal,abortMessage:p,onTimeout:()=>{d=!0,i.abort()}}).catch(()=>"");throw new Zt(t,n,u.status,Vt(h))}if(u.status===204)return;let b=await mt(u.text(),{timeoutMs:a,timeoutMessage:l,signal:s.signal,abortMessage:p,onTimeout:()=>{d=!0,i.abort()}});if(!b)return;let m=xi(u);if(!m.includes("application/json")&&!m.includes("+json"))throw new Error(Ci(t,n,m,b));try{return JSON.parse(b)}catch(h){let k=Vt(b);throw new Error(`OpenCode ${t} ${n} returned invalid JSON: ${Te(h)}${k?`: ${k}`:""}`)}}catch(u){if(i.signal.aborted){if(d)throw new Error(`OpenCode ${t} ${n} timed out after ${a}ms.`);if(o)throw new Error(`OpenCode ${t} ${n} was aborted.`)}throw u}finally{s.signal?.removeEventListener("abort",g)}}async streamEvents(t,n){let r=await this.fetchImpl(`${this.baseUrl}/event`,{headers:Kt(),signal:n});if(!r.ok)throw new Error(`OpenCode event stream failed with ${r.status}`);if(!r.body)return;let s=r.body.getReader(),i=new TextDecoder,o="",d=async l=>{let p=l.split(/\r?\n/).filter(g=>g.startsWith("data:")).map(g=>g.slice(5).trimStart()).join(`
27
- `).trim();!p||p==="[DONE]"||await t(JSON.parse(p))};for(;;){let{done:l,value:p}=await s.read();if(l)break;o+=i.decode(p,{stream:!0});let g=/\r?\n\r?\n/.exec(o);for(;g;){let u=o.slice(0,g.index);o=o.slice(g.index+g[0].length),await d(u),g=/\r?\n\r?\n/.exec(o)}}let a=o.trim();a&&await d(a)}};function Bi(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 qi(e){return typeof e.sessionID=="string"?e.sessionID:void 0}function Ni(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(o=>typeof o=="string"):[],s=r.length>0?`OpenCode requests ${n} permission for ${r.join(", ")}.`:`OpenCode requests ${n} permission.`,i=[{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:i.map(o=>o.label),actions:i,responseMode:"structured"}}function Li(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=ve(e),s=st(e),i=r.length>0?r:[{id:t,question:n,options:s,allowsFreeText:!0}],o=i.length>0?0:void 0,d=o!=null?i[o]:void 0,a=d?.options.map(l=>l.label)??s.map(l=>l.label);return{requestId:t,kind:"question",promptText:d?ne(d,o??0,i.length):n,options:a,...i.length>0?{questions:i}:{},...o!=null?{activeQuestionIndex:o}:{},allowsFreeText:!0}}function Fi(e,t,n){let r=e.questions??[],s=r[t],i=s?.options.map(o=>o.label)??[];return{...e,promptText:s?ne(s,t,r.length):e.promptText,options:i,activeQuestionIndex:t,answers:n}}function Wi(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}
17
+ `:" ").replace(/[ \t]+/g," ").trim()||void 0}function Re(e,t){return e.length<=t?e:`${e.slice(0,Math.max(0,t-3)).trimEnd()}...`}function He(e){return e.replace(/\b[A-Za-z0-9_-]*(?:api[_-]?key|token|secret|password|passwd|pwd|credential|credentials|authorization|auth)[A-Za-z0-9_-]*\b\s*[:=]\s*["']?[^"'\s,;)]+/gi,"[redacted credential]").replace(/\b(?:api key|token|secret|password|credential|credentials)\s+\[redacted credential\]/gi,"[redacted credential]").replace(/\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{16,}\b/g,"[redacted token]").replace(/\bgithub_pat_[A-Za-z0-9_]{20,}\b/g,"[redacted token]").replace(/\bsk-[A-Za-z0-9_-]{20,}\b/g,"[redacted token]").replace(/\bxox[baprs]-[A-Za-z0-9-]{20,}\b/g,"[redacted token]").replace(/\bAKIA[0-9A-Z]{16}\b/g,"[redacted token]").replace(/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{10,}\b/g,"[redacted token]").replace(/\bhttps?:\/\/\S+/gi,"[redacted link]").replace(/\b[A-Z]:\\(?:Users|Documents and Settings)\\[^\s`'")]+/gi,"[redacted path]").replace(/(?:^|[\s(])\/(?:home|Users|var|etc|private|tmp)\/[^\s`'").]+/g,t=>`${t.startsWith(" ")||t.startsWith("(")?t[0]:""}[redacted path]`).replace(new RegExp(`\\b[A-Za-z0-9_-]{${Jn},}\\b`,"g"),"[redacted token]")}function ze(e){return/\b[A-Za-z0-9_-]*(?:api[_-]?key|token|secret|password|passwd|pwd|credential|credentials|authorization|auth)[A-Za-z0-9_-]*\b\s*[:=]\s*["']?[^"'\s,;)]+/i.test(e)||/\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9_]{16,}\b/.test(e)||/\bgithub_pat_[A-Za-z0-9_]{20,}\b/.test(e)||/\bsk-[A-Za-z0-9_-]{20,}\b/.test(e)||/\bxox[baprs]-[A-Za-z0-9-]{20,}\b/.test(e)||/\bAKIA[0-9A-Z]{16}\b/.test(e)||/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]{10,}\b/.test(e)||/\bhttps?:\/\/\S+/i.test(e)||/\b[A-Z]:\\(?:Users|Documents and Settings)\\[^\s`'")]+/i.test(e)||/(?:^|[\s(])\/(?:home|Users|var|etc|private|tmp)\/[^\s`'").]+/.test(e)||new RegExp(`\\b[A-Za-z0-9_-]{${Jn},}\\b`).test(e)}function Ms(e){let t=Qn(e);if(!t)return;let n=t.match(/^[^.!?]+[.!?]/)?.[0]??t,r=He(n).replace(/\s+/g," ").trim();return r?Re(r,180):void 0}function Gn(e){return He(e.trim()).replace(/\s+/g," ").trim()}function As(e,t){return e?.commitMessages.map(n=>Gn(n.message)).filter(Boolean).slice(0,t)??[]}function Wt(){return["Not recorded by agent_pr. Review CI/checks and session output before merging."]}function Kn(){return["Generated PR metadata omits full task prompts and redacts sensitive-looking prompt details.","Review touched areas for behavior, security, and privacy impact."]}function Es(e){let t={summary:[],changes:[],validation:[]},n;for(let r of(e??"").split(/\r?\n/)){let s=r.trim(),o=s.replace(/^[#*_\s]+|[:*_\s]+$/g,"").toLowerCase();if(/^(?:root cause|summary|result)$/.test(o)){n="summary";continue}if(/^(?:fix|changes|implementation|implemented)$/.test(o)){n="changes";continue}if(/^(?:validation|verification|tests)$/.test(o)){n="validation";continue}if(/^[A-Za-z][A-Za-z /_-]{2,30}:$/.test(s)){n=void 0;continue}let i=s.match(/^[-*â€ĸ]\s+(.+)$/)?.[1]?.trim();if(!n||!i||i.length<8)continue;let d=Re(ne(i),n==="validation"?160:180);d&&!ze(d)&&t[n].push(d)}return{summary:t.summary.slice(0,5),changes:t.changes.slice(0,10),validation:t.validation.slice(0,5)}}function $s(e){let t=Ms(e.prompt),n=e.diffSummary,r=Es(e.outputPreview);return{sessionName:e.sessionName,branchName:e.branchName,objective:t,stats:n?{commits:n.commits,filesChanged:n.filesChanged,insertions:n.insertions,deletions:n.deletions}:void 0,changedFiles:n?.changedFiles??[],commitSubjects:As(n,5),sessionSummary:r.summary,sessionChanges:r.changes,validation:r.validation.length>0?r.validation:Wt(),notes:Kn()}}function ot(e,t,n){return Array.isArray(e)&&e.length>0&&e.length<=t&&e.every(r=>typeof r=="string"&&r.trim().length>0&&r.length<=n)}function Zn(e,t){let n=Qn(e);if(!n)return[];let r=t?.toLowerCase();return n.split(/[.!?\n]/).map(s=>s.trim()).filter(s=>s.length>=24).filter(s=>!r||s.toLowerCase()!==r.replace(/[.!?]$/,"")).map(s=>s.toLowerCase())}function De(e,t,n){let r=e.toLowerCase();return Zn(t,n.objective).some(s=>r.includes(s))}function jn(e){return/^(?:node|next|nuxt|vue|express|nest|three|d3|chart|ember|backbone|require)\.js$/i.test(e)}function Ut(e,t){let n=new Set(t.changedFiles);if([...e.matchAll(/(?:^|[^\w.-])((?:\.?[\w-][\w.-]*\/)+(?:\.?[\w-][\w.-]*))(?![\w.-])/g)].map(u=>u[1]).some(u=>/\.[A-Za-z0-9]+$/.test(u)&&!n.has(u)))return!0;let s=new Set(t.changedFiles.filter(u=>!u.includes("/"))),o=String.raw`\.[a-z0-9][\w.-]*`,i=e.matchAll(new RegExp(`[\\\`"'](${o})[\\\`"']`,"g"));for(let u of i)if(!s.has(u[1]))return!0;let d=e.matchAll(new RegExp(String.raw`\b(?:file|files|path|paths|changed|changes|updated?|updates?|modified?|modifies|touched?|touches|added?|adds?|removed?|removes?|deleted?|deletes?)\s+(?:the\s+)?(${o})(?![\w.-])`,"gi"));for(let u of d)if(!s.has(u[1]))return!0;if(s.size===0)return!1;let a=new Set([...s].map(u=>u.match(/\.([A-Za-z0-9]+)$/)?.[1]?.toLowerCase()).filter(u=>!!u)),c=String.raw`[A-Za-z0-9][\w.-]*\.([A-Za-z0-9]+)`,l=e.matchAll(new RegExp(`[\\\`"'](${c})[\\\`"']`,"g"));for(let u of l){let b=u[1],p=u[2]?.toLowerCase();if(p!==void 0&&a.has(p)&&!s.has(b)&&!jn(b))return!0}return[...e.matchAll(new RegExp(String.raw`\b(?:file|files|path|paths|changed|changes|updated?|updates?|modified?|modifies|touched?|touches|added?|adds?|removed?|removes?|deleted?|deletes?)\s+(?:the\s+)?(${c})\b`,"gi"))].some(u=>{let b=u[1],p=u[2]?.toLowerCase();return p!==void 0&&a.has(p)&&!s.has(b)&&!jn(b)})}function ne(e){return He(e).replace(/\s+/g," ").trim()}function Os(e,t,n){if(!e||typeof e!="object")return;let r=e;if(typeof r.title!="string"||r.title.trim().length===0||r.title.length>90||!ot(r.summary,5,180)||!ot(r.changes,10,160)||!ot(r.validation,5,160)||!ot(r.notes,5,180)||[r.title,...r.summary,...r.changes,...r.validation,...r.notes].some(d=>ze(d)||De(d,n,t)))return;let o={title:ne(r.title),summary:r.summary.map(ne),changes:r.changes.map(ne),validation:r.validation.map(ne),notes:r.notes.map(ne)},i=[o.title,...o.summary,...o.changes,...o.validation,...o.notes];if(!i.some(d=>!d||ze(d)||De(d,n,t))&&!i.some(d=>Ut(d,t)))return o}function Ft(e,t,n={}){let r=Re(He(e.sessionName).replace(/[-_]+/g," ").replace(/\s+/g," ").trim()||"agent worktree",80),s=e.sessionSummary.length>0||e.sessionChanges.length>0,o=s?e.commitSubjects[0]?.replace(/^(?:feat|fix|chore|refactor|test|docs|build|ci|perf)(?:\([^)]*\))?!?:\s*/i,""):void 0,i=Re(o||`OpenClaw agent changes: ${r}`,90),d=s?_s:n.reason==="provider-failed"||n.reason==="provider-invalid"?zt:Ht,a=[d,...e.sessionSummary,`Session: ${r}.`,...e.objective?[`Objective: ${e.objective}`]:[],...e.stats?[`Scope: ${e.stats.commits} commits, ${e.stats.filesChanged} files changed (+${e.stats.insertions} / -${e.stats.deletions}).`]:["Scope: Diff summary was unavailable when the PR body was generated."]],c=e.sessionChanges.length>0?e.sessionChanges:e.changedFiles.length>0?e.changedFiles.slice(0,10).map(f=>`\`${f}\``):["Review the pushed worktree branch for the full set of changes."],l=e.sessionChanges.length===0&&e.changedFiles.length>10?[`...and ${e.changedFiles.length-10} more changed files.`]:[],m=["Fallback metadata is conservative; review the diff and CI/checks before marking the draft PR ready.",...e.notes],u={title:i,summary:a,changes:[...c,...l],validation:e.validation,notes:m},b=!1,p=!1,h=f=>{let I=ne(f);if(De(I,t,e)){b=!0;let N=Zn(t,e.objective);for(let E of N){let L=new RegExp(E.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"gi");I=I.replace(L,"[redacted prompt detail]")}I=ne(I)}return Ut(I,e)&&(p=!0,I="[redacted file reference outside change set]"),I=ne(I),(De(I,t,e)||ze(I))&&(b=!0,I="[redacted prompt detail]"),I};if(u={title:h(u.title)||Re(`OpenClaw agent changes: ${r}`,90),summary:u.summary.map(h).filter(f=>f&&f.length>0),changes:u.changes.map(h).filter(f=>f&&f.length>0),validation:u.validation.map(h).filter(f=>f&&f.length>0),notes:u.notes.map(h).filter(f=>f&&f.length>0)},u.summary.length===0&&(u.summary=[d]),u.changes.length===0&&(u.changes=["Review the pushed worktree branch for the full set of changes."]),u.validation.length===0&&(u.validation=Wt()),u.notes.length===0&&(u.notes=Kn()),b||p){let f="Some content was stripped from fallback metadata due to safety checks (prompt leak guard or references to files outside the diff).";u.notes.some(I=>I.toLowerCase().includes("stripped")||I.toLowerCase().includes("sanitized"))||(u.notes=[...u.notes,f])}let P=[u.title,...u.summary,...u.changes,...u.validation,...u.notes];if(P.some(f=>!f)||P.some(f=>ze(f)||De(f,t,e))||P.some(f=>Ut(f,e))){let f=Re(He(e.sessionName).replace(/[-_]+/g," ").trim()||"session",60);u={title:Re(`OpenClaw agent changes: ${f}`,90),summary:["Deterministic fallback metadata (sanitized for safety)."],changes:e.changedFiles.length>0?e.changedFiles.slice(0,5).map(I=>`\`${I}\``):["See the worktree branch diff for the full set of changes."],validation:Wt(),notes:["Fallback metadata was hardened because prompt-leak or unknown-file checks were triggered after initial construction.","Review the actual diff, session output, and CI before merging."]}}if(e.branchName){let f=ne(e.branchName);u.notes.some(I=>I.toLowerCase().includes(f.toLowerCase()))||(u.notes=[...u.notes,`Branch: ${f}`])}return u}async function it(e){let t=$s({sessionName:e.sessionName,branchName:e.branchName,prompt:e.prompt,outputPreview:e.outputPreview,diffSummary:e.diffSummary});if(!e.provider)return{ok:!0,metadata:Ft(t,e.prompt,{reason:"no-provider"}),evidence:t,fallbackReason:"no-provider"};try{let n=await e.provider.generatePrMetadata(t),r=Os(qs(n),t,e.prompt);return r?{ok:!0,metadata:r,evidence:t}:{ok:!0,metadata:Ft(t,e.prompt,{reason:"provider-invalid"}),evidence:t,fallbackReason:"provider-invalid"}}catch(n){return`${n instanceof Error?n.message:String(n)}`,{ok:!0,metadata:Ft(t,e.prompt,{reason:"provider-failed"}),evidence:t,fallbackReason:"provider-failed"}}}function jt(){let e=zn(),t=Bs(e);if(t)return{async generatePrMetadata(n){if(typeof t.generatePrMetadata=="function")return await t.generatePrMetadata(n);if(typeof t.generatePullRequestMetadata=="function")return await t.generatePullRequestMetadata(n);let r=Ns(n);if(typeof t.generateObject=="function")return await t.generateObject({task:"openclaw-code-agent.pr-metadata",prompt:r,input:n});if(typeof t.generateText=="function")return await t.generateText({task:"openclaw-code-agent.pr-metadata",prompt:r});if(typeof t.complete=="function")return await t.complete({prompt:r})}}}function Bs(e){return[e?.prMetadata,e?.pullRequestMetadata,e?.llm,e?.ai,e?.model,e?.models].find(n=>!!(n&&typeof n=="object"&&(typeof n.generatePrMetadata=="function"||typeof n.generatePullRequestMetadata=="function"||typeof n.generateObject=="function"||typeof n.generateText=="function"||typeof n.complete=="function")))}function Ns(e){return["Generate concise pull request metadata for OpenClaw Code Agent work.",'Return only JSON with shape {"title":"...","summary":["..."],"changes":["..."],"validation":["..."],"notes":["..."]}.',"Use only the supplied evidence. Do not invent files, commands, tests, risks, links, paths, prompts, chat IDs, credentials, tokens, or secrets.","Keep the title under 90 characters. Keep bullets short and reviewable.","","Evidence:",JSON.stringify(e,null,2)].join(`
18
+ `)}function qs(e){if(typeof e!="string")return e&&typeof e=="object"&&"object"in e?e.object:e&&typeof e=="object"&&"data"in e?e.data:e;let t=e.trim();if(!t)return;let n=t.replace(/^```(?:json)?\s*/i,"").replace(/\s*```$/,"").trim();try{return JSON.parse(n)}catch{return}}function Jt(e){return e?e.includes(Dt)||e.includes(Ht)||e.includes(zt):!1}function Qt(e){return e?e.trim()===Dt||e.includes(Ht)||e.includes(zt):!1}function Gt(e){return e?/^OpenClaw agent changes:/i.test(e.trim()):!1}function at(e){let t=[`OpenClaw Code Agent session: ${e.sessionName}`,"","## Summary",...e.metadata.summary.map(n=>`- ${n}`),"","## Changes",...e.metadata.changes.map(n=>`- ${n}`),""];if(e.diffSummary){let n=e.diffSummary.commitMessages.slice(0,5).map(s=>`- ${s.hash} ${Gn(s.message)} (${s.author})`),r=e.diffSummary.commits>5?[`- ...and ${e.diffSummary.commits-5} more`]:[];n.length>0&&t.push("## Commits",...n,...r,"")}return t.push("## Validation",...e.metadata.validation.map(n=>`- ${n}`),"","## Notes / Risks",...e.metadata.notes.map(n=>`- ${n}`),""),t.push("---",Dt),t.join(`
19
+ `)}function dt(e,t){return{...t,baseBranch:t.baseBranch??e.worktreeBaseBranch,targetRepo:t.targetRepo??e.worktreePrTargetRepo,pushRemote:t.pushRemote??e.worktreePushRemote}}function $a(e,t={}){let n=t.updatedAt??new Date().toISOString(),r={pendingWorktreeDecisionSince:t.pendingSince??n,lastWorktreeReminderAt:void 0,worktreeDecisionSnoozedUntil:void 0,lifecycle:"awaiting_worktree_decision",worktreeState:"pending_decision",worktreeLifecycle:dt(e,{state:"pending_decision",updatedAt:n,notes:t.notes})};return t.clearResolverSessionId&&(r.autoMergeResolverSessionId=void 0),r}function Oa(e,t,n,r={}){let s=r.updatedAt??new Date().toISOString();return{autoMergeConflictResolutionAttemptCount:n,autoMergeResolverSessionId:t,pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeDecisionSnoozedUntil:void 0,lifecycle:"terminal",worktreeState:"merge_conflict_resolving",worktreeLifecycle:dt(e,{state:"merge_conflict_resolving",updatedAt:s,notes:r.notes})}}function Vn(e,t={}){let n=t.updatedAt??new Date().toISOString(),r=t.resolvedAt??n,s={worktreeMerged:!0,worktreeMergedAt:t.mergedAt??r,lifecycle:"terminal",worktreeState:"merged",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeDecisionSnoozedUntil:void 0,worktreeLifecycle:dt(e,{state:"merged",updatedAt:n,resolvedAt:r,resolutionSource:t.resolutionSource??"agent_merge"})};return t.clearResolverSessionId&&(s.autoMergeResolverSessionId=void 0),s}function Xn(e,t){let n=t.updatedAt??new Date().toISOString(),r={worktreePrUrl:t.prUrl,lifecycle:"terminal",worktreeState:"pr_open",pendingWorktreeDecisionSince:void 0,lastWorktreeReminderAt:void 0,worktreeDecisionSnoozedUntil:void 0,worktreeLifecycle:dt(e,{state:"pr_open",updatedAt:n,resolutionSource:"agent_pr",baseBranch:t.baseBranch,targetRepo:t.targetRepo})};return t.prNumber!==void 0&&(r.worktreePrNumber=t.prNumber),t.disposition!==void 0&&(r.worktreeDisposition=t.disposition),r}import{existsSync as ui,readFileSync as ci}from"fs";import*as mt from"@anthropic-ai/claude-agent-sdk";function M(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function O(e,t,n){for(let r of t){let s=e?.[r];if(typeof s!="string")continue;let o=n?.trim===!1?s:s.trim();if(o)return o}}function Yn(e,t){return t&&typeof t.recommended=="boolean"?t.recommended:t&&typeof t.isRecommended=="boolean"?t.isRecommended:/\b(?:not\s+(?:a\s+)?|non[-\s]?|un)recommended\b/i.test(e)?!1:/\brecommended\b/i.test(e)}function er(e){if(typeof e=="string"){let i=e.trim();return i?{label:i,value:i,recommended:Yn(i)}:void 0}let t=M(e);if(!t)return;let n=O(t,["label","title","text","value","name","id"])?.trim();if(!n)return;let r=O(t,["description","preview","detail","details"]),s=O(t,["value","id","name"]),o=t.isOther===!0||t.is_other===!0||t.other===!0;return{label:n,...r?{description:r}:{},...s?{value:s}:{},...o?{isOther:!0}:{},recommended:Yn(n,t)}}function ut(e){let t=M(e);if(!t)return[];let n=t.options??t.choices??t.availableDecisions??t.decisions;return Array.isArray(n)?n.map(er).filter(r=>!!r):[]}function _e(e){let t=M(e);return(Array.isArray(t?.questions)?t.questions:[]).map((r,s)=>Ls(r,s)).filter(r=>!!r)}function Ls(e,t=0){let n=M(e);if(!n)return;let r=O(n,["question","prompt","message","text","summary"])?.trim();if(!r)return;let s=O(n,["id","questionId","question_id","name"]),o=O(n,["header","title","label"]),d=(Array.isArray(n.options)?n.options:Array.isArray(n.choices)?n.choices:[]).map(er).filter(l=>!!l),a=n.multiSelect===!0||n.multi_select===!0,c=n.isOther===!0||n.is_other===!0||n.allowFreeText===!0||n.allowsFreeText===!0||a||d.some(l=>l.isOther);return{id:s??`question_${t+1}`,...o?{header:o}:{},question:r,options:d,...a?{multiSelect:!0}:{},...c?{allowsFreeText:!0}:{},...n.isSecret===!0||n.is_secret===!0?{isSecret:!0}:{}}}function tr(e,t,n){let r=[n>1?`Question ${t+1}`:void 0,e.header].filter(Boolean).join(" - "),s=[...r?[r]:[],e.question];return e.options.length>0&&s.push("Options:",...e.options.map((o,i)=>{let d=o.recommended&&!/\brecommended\b/i.test(o.label)?" (recommended)":"",a=o.description?` - ${o.description}`:"",c=o.isOther?" (free text)":"";return` ${i+1}. ${o.label}${d}${c}${a}`})),e.allowsFreeText&&!e.options.some(o=>o.isOther)&&s.push(e.multiSelect?"Reply with one or more option labels.":"Free-form answer is allowed."),s}function ct(e){if(e.length===0)return;let t=e.flatMap((n,r)=>[...r>0?[""]:[],...tr(n,r,e.length)]);return e.length>1&&t.push("","Reply with answers by question, for example: Q1: ..., Q2: ..."),t.join(`
20
+ `)}function ae(e,t,n){return tr(e,t,n).join(`
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
+ `)}}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
+ ${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(`
25
+ `).trim();return`${p()}${f?` Output:
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
+ `).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}
28
28
  A${r+1}: ${s}`}).join(`
29
29
 
30
- `)}function Hi(e){return Yt(e).result}function Yt(e){let t=Array.isArray(e)?e:H(e)&&Array.isArray(e.messages)?e.messages:H(e)&&Array.isArray(e.items)?e.items:[],n=[];for(let r of t){let s=H(r)&&H(r.info)?r.info:r;if(!H(s)||(typeof s.role=="string"?s.role:s.type)!=="assistant")continue;let o=Array.isArray(s.content)?s.content:[],d=H(r)&&Array.isArray(r.parts)?r.parts:[];for(let a of[...o,...d])H(a)&&a.type==="text"&&typeof a.text=="string"&&n.push(a.text)}return{count:n.length,result:n.at(-1)}}var ht=class{constructor(t={}){this.deps=t}deps;name="opencode";backendKind="opencode-server";supportedPermissionModes=["default","plan","bypassPermissions"];capabilities={nativePendingInput:!0,nativePlanArtifacts:!1,worktrees:"plugin-managed"};launch(t){let n=new ce,r=this.deps.fetch??fetch,s,i,o,d=t.resumeSessionId,a=0,l=t.permissionMode??"default",p,g=!t.resumeSessionId,u=!1,b=!1,m=new AbortController,h,k=!1,f=!1,S=!1,$=!1,q,F=!1,Q=!1,N,Y=new Set,ie=P=>$?!1:($=!0,n.enqueue(re(P)),!0),x=(P,y,v,I=0)=>ie({success:P,outcome:y,duration_ms:0,total_cost_usd:I,num_turns:a,result:v,session_id:d??""}),w=()=>{d&&N!==d&&(N=d,n.enqueue(Se({kind:"opencode-server",conversationId:d})))},c=P=>{P&&Y.has(P)||(P&&Y.add(P),n.enqueue(le(P)),P&&p?.requestId===P&&(p=void 0))},R=async()=>{if(i)return i;o??=(async()=>{let P=await(this.deps.createServer??$i)({cwd:t.cwd,signal:t.abortController?.signal,fetch:r,requestTimeoutMs:this.deps.requestTimeoutMs,startupTimeoutMs:this.deps.startupTimeoutMs});if(F||t.abortController?.signal.aborted)throw await P.close().catch(()=>{}),new Error("OpenCode startup was interrupted before session creation.");return s=P,i=new Xt(P.baseUrl,r,this.deps.requestTimeoutMs),i})();try{return await o}catch(P){throw o=void 0,P}},T=async(P,y)=>{!i||!d||await i.request("POST",`/permission/${encodeURIComponent(P)}/reply`,{reply:y})},C=async(P,y)=>{!i||!d||await i.request("POST",`/question/${encodeURIComponent(P)}/reply`,{answers:[[y]]})},_=async P=>{let y=Bi(P),v=qi(y.properties);if(!(v&&v!==d)){if((y.type==="session.next.text.delta"||y.type==="message.part.delta")&&y.properties.field!=="reasoning"&&typeof y.properties.delta=="string"){n.enqueue(be(y.properties.delta));return}if(y.type==="session.next.tool.called"||y.type==="message.part.updated"){let I=H(y.properties.part)?y.properties.part:void 0;if(y.type==="message.part.updated"&&I?.type!=="tool"){n.enqueue({type:"activity"});return}let L=typeof y.properties.tool=="string"?y.properties.tool:typeof I?.tool=="string"?I.tool:"tool";n.enqueue(ot(L,y.properties.input));return}if(y.type==="session.next.step.failed"||y.type==="session.error"){let I=H(y.properties.error)&&typeof y.properties.error.message=="string"?y.properties.error.message:`${y.type} failed`;f&&!S&&(h?.abort(),await me(!1,I));return}if(y.type==="permission.asked"){if(l==="bypassPermissions"){let L=typeof y.properties.id=="string"?y.properties.id:void 0;L&&(await T(L,"once").catch(()=>{}),c(L));return}let I=Ni(y.properties);p={requestId:I.requestId,kind:"approval",options:I.options,actions:I.actions??[],state:I},n.enqueue(X(I));return}if(y.type==="permission.replied"){let I=typeof y.properties.requestID=="string"?y.properties.requestID:void 0;c(I);return}if(y.type==="question.asked"){let I=Li(y.properties);p={requestId:I.requestId,kind:"question",options:I.options,actions:[],state:I},n.enqueue(X(I));return}if(y.type==="question.replied"||y.type==="question.rejected"){let I=typeof y.properties.requestID=="string"?y.properties.requestID:void 0;c(I);return}(y.type?.startsWith("session.next.")||y.type?.startsWith("message.")||y.type==="session.status"||y.type==="session.idle")&&(Mi(y)&&(Q=!0),n.enqueue({type:"activity"}))}},O=()=>{k||!i||(k=!0,i.streamEvents(_,m.signal).catch(async P=>{!m.signal.aborted&&f&&!S&&(h?.abort(),await me(!1,Te(P)))}).finally(()=>{k=!1}))},A=async(P,y)=>await P.request("GET",`/session/${encodeURIComponent(y)}/message`),fe=async(P,y)=>await P.request("GET",`/session/${encodeURIComponent(y)}`,void 0,{timeoutMs:Math.min(this.deps.requestTimeoutMs??gt,mi)}),Me=async(P,y,v,I,L)=>{await P.request("POST",`/session/${encodeURIComponent(y)}/prompt_async`,_i(v,t.model,I),{signal:L})},Je=async(P,y,v,I)=>{let L=Date.now(),z=!1,U=v,oe,Pe=0,ae,an=this.deps.turnTimeoutMs??gi;for(;;){if(I.aborted)throw new Error("wait aborted");let Er=await A(P,y).catch(()=>{}),de=Yt(Er),dn=de.count>v&&!!de.result;dn&&de.count===U&&de.result===oe?Pe+=1:(Pe=dn?1:0,U=de.count,oe=de.result);let Pt=!1;try{let Ae=await P.request("GET","/session/status",void 0,{signal:I,timeoutMs:Math.min(this.deps.requestTimeoutMs??gt,1e4)});Pt=Ti(Ae,y),ae=void 0,Pt||(z=!0)}catch(Ae){if(I.aborted)throw new Error("wait aborted");ae=Te(Ae)}if(Pt&&(z||de.count>v)||Q&&de.count>v||Pe>=2&&ae)return;if(Date.now()-L>an){let Ae=ae?` Last status error: ${ae}`:"";throw new Error(`Timed out waiting for OpenCode session ${y} to become idle after ${an}ms.${Ae}`)}await Rr(250)}},Tr=async()=>{let P=await R();if(d){if(t.forkSession&&!u){let I=await P.request("POST",`/session/${encodeURIComponent(d)}/fork`,{});if(!I.id)throw new Error("OpenCode fork did not return a session id.");d=I.id,u=!0,g=!0}else g||(await A(P,d),g=!0);return w(),O(),d}let y=vi(t.model),v=await P.request("POST","/session",{...y?{model:y}:{},metadata:{client:"openclaw-code-agent"},permission:yr(l)});if(!v.id)throw new Error("OpenCode did not return a session id.");return d=v.id,g=!0,w(),O(),d},me=(P,y,v=P?"completed":"failed")=>(q??=(async()=>{let I=y,L=0;if(i&&d){let[z,U]=await Promise.all([P?A(i,d).catch(()=>{}):Promise.resolve(void 0),fe(i,d).catch(()=>{})]);I=I??Hi(z),L=ki(U)}F?x(!1,"interrupted",void 0,L):x(P,v,I,L)})(),q),Mr=async P=>{f=!0,S=!1,$=!1,q=void 0,Q=!1;try{let y=await R();if(F)return;let v=await Tr();if(F)return;n.enqueue(xe()),a+=1;let I=b?void 0:t.systemPrompt,L=await A(y,v).catch(()=>{}),z=Yt(L).count,U=new AbortController;h=U,await Me(y,v,P,I,U.signal),b=!0,await Je(y,v,z,U.signal),h=void 0,S=!0,await me(!0)}catch(y){h=void 0,F?await me(!1,void 0,"interrupted"):await me(!1,Te(y))}finally{f=!1,S=!1}},bt=async(P,y={})=>{let v=p;if(!v||v.kind!=="question"||y.requestId&&y.requestId!==v.requestId)return!1;let I=P.trim();if(!I)return!1;let L=v.state?.questions??[];if(L.length>0){let z=v.state?.activeQuestionIndex??0,U=L[z];if(!U||y.questionId&&y.questionId!==U.id)return!1;v.answers={...v.answers,[U.id]:{answers:[I]}};let oe=z+1;return oe<L.length?(v.state=Fi(v.state,oe,v.answers),v.options=v.state.options,n.enqueue(X(v.state)),!0):(await C(v.requestId,Wi(L,v.answers)),c(v.requestId),!0)}return await C(v.requestId,I),c(v.requestId),!0},Ar=typeof t.prompt=="string"?(async function*(){yield{type:"user",text:t.prompt,session_id:t.resumeSessionId??""}})():t.prompt;return(async()=>{try{for await(let P of Ar){if(F)break;let y=Ri(P).trim();if(y){if(p?.kind==="question"){await bt(y);continue}if(await Mr(y),F)break}}}catch(P){F||(f||($=!1,q=void 0),await me(!1,Te(P)))}finally{m.abort(),await s?.close().catch(()=>{}),n.close()}})(),{messages:n.messages(),async setPermissionMode(P){d&&await(await R()).request("PATCH",`/session/${encodeURIComponent(d)}`,{permission:yr(P)}),l=P,n.enqueue(Ie(P))},async submitPendingInputOption(P,y={}){let v=p;if(!v||y.requestId&&y.requestId!==v.requestId)return!1;if(v.kind==="approval"){let Pe=v.actions[P],ae=Pe?.kind==="approval"?Pe.responseDecision:void 0;return ae?(await T(v.requestId,ae),c(v.requestId),!0):!1}let I=v.state?.questions??[],L=v.state?.activeQuestionIndex??0,z=I[L];if(y.questionId&&y.questionId!==z?.id)return!1;let U=z?.options[P],oe=U?.value??U?.label??v.options[P];return oe?await bt(oe,y):!1},async submitPendingInputText(P){return await bt(P)},async interrupt(){if(F=!0,m.abort(),h?.abort(),f||($=!1,q=void 0),!i){x(!1,"interrupted"),await s?.close().catch(()=>{});return}if(!d){x(!1,"interrupted");return}await i.request("POST",`/session/${encodeURIComponent(d)}/abort`).catch(()=>{}),await me(!1,void 0,"interrupted")}}}buildUserMessage(t,n){return{type:"user",text:t,session_id:n}}};var en=new Map;function tn(e){en.set(e.name,e)}function nn(e){let t=en.get(e);if(!t)throw new Error(`Unknown agent harness: "${e}". Available: ${[...en.keys()].join(", ")}`);return t}function ed(){return nn(Qe())}tn(new dt);tn(new ft);tn(new ht);function je(e){return e.backendRef?.conversationId??e.harnessSessionId}function wt(e){return e.id??e.sessionId??e.name??je(e)??e.harnessSessionId}function Di(e){return e.harnessSessionId}function rn(e){let t=[wt(e),je(e),Di(e)].filter(n=>!!n);return[...new Set(t)]}function Ui(e){return e.harnessName??e.persistedHarness??Qe()}function zi(e){if(e.backendRef?.kind==="codex-app-server")return"native-restore";try{return nn(Ui(e)).capabilities.worktrees}catch{return"plugin-managed"}}function ji(e){return e==="native-execution"}function Ji(e){return e==="native-restore"}function Qi(e){return!!(e.backendRef?.worktreePath||e.backendRef?.worktreeId)}function sd(e){let t=zi(e);return(ji(t)||Ji(t))&&Qi(e)}function vr(e){if(!e)return!1;let t=new Set(e.split(/\r?\n/).map(i=>i.trim().replace(/^[#*_\s]+|[:*_\s]+$/g,"").toLowerCase())),n=["root cause","summary","result"].some(i=>t.has(i)),r=["fix","changes","implementation","implemented"].some(i=>t.has(i)),s=["validation","verification","tests"].some(i=>t.has(i));return n&&r&&s}function Sr(e,t){let n=e.resolve(t),r=e.getPersistedSession(t),s=n?wt(n):r?wt(r):void 0,i=n?.getOutput?.().join(`
31
- `).trim(),o;if(r?.outputPath&&Gi(r.outputPath))try{o=Ki(r.outputPath,"utf-8").trim()}catch{}let d=vr(i),a=vr(o),l=d===a?(o?.length??0)>(i?.length??0)?o:i:a?o:i;return{activeSession:n,persistedSession:r,persistedRef:s,sessionName:n?.name??r?.name??t,prompt:n?.prompt??r?.prompt,outputPreview:l?l.slice(-12e3):void 0,worktreePath:n?.worktreePath??r?.worktreePath,originalWorkdir:n?.originalWorkdir??r?.workdir,branchName:n?.worktreeBranch??r?.worktreeBranch,notificationTarget:n??(r?{id:s??t,name:r.name,harnessSessionId:r.harnessSessionId,backendRef:r.backendRef,route:r.route,originChannel:r.originChannel,originThreadId:r.originThreadId,originSessionKey:r.originSessionKey,goalTaskId:r.goalTaskId,...r.costUsd!==void 0?{costUsd:r.costUsd}:{},...r.createdAt!==void 0?{createdAt:r.createdAt}:{},...r.completedAt!==void 0?{completedAt:r.completedAt}:{},...r.harness!==void 0?{harnessName:r.harness}:{},...r.model!==void 0?{model:r.model}:{}}:void 0)}}function sn(e){return[...e.persistedSession?rn(e.persistedSession):[],...e.activeSession?rn(e.activeSession):[]].filter((t,n,r)=>r.indexOf(t)===n)}function Zi(e,t){let n=[t.id,t.backendConversationId,t.harnessSessionId,t.name],r,s;for(let i of n)if(i&&(r??=e.resolve(i),s??=e.getPersistedSession(i),r&&s))break;return{activeSession:r,persistedSession:s}}function ud(e,t,n={}){let{activeSession:r,persistedSession:s}=Zi(e,t),i=Ln({workdir:t.workdir,worktreePath:t.worktreePath,worktreeBranch:t.worktreeBranch,worktreeBaseBranch:n.baseBranch??s?.worktreeBaseBranch,worktreePrTargetRepo:s?.worktreePrTargetRepo,worktreePushRemote:s?.worktreePushRemote,worktreePrUrl:s?.worktreePrUrl,worktreePrNumber:s?.worktreePrNumber,worktreeLifecycle:s?.worktreeLifecycle},{activeSession:!!(r&&(r.status==="starting"||r.status==="running")),includePrSync:!!(s?.worktreeLifecycle?.state==="pr_open"||s?.worktreePrUrl)});return{activeSession:r,persistedSession:s,resolvedLifecycle:i}}function cd(e){let t=e.list("all").filter(s=>s.worktreePath),n=e.listPersistedSessions().filter(s=>s.worktreePath),r=new Map;for(let s of n){if(!s.worktreePath)continue;let i=je(s),o=s.sessionId??i??s.harnessSessionId;o&&r.set(o,{id:s.sessionId??i??s.harnessSessionId,name:s.name,worktreePath:s.worktreePath,worktreeBranch:s.worktreeBranch,worktreeStrategy:s.worktreeStrategy,workdir:s.workdir,worktreeMerged:s.worktreeMerged,worktreeMergedAt:s.worktreeMergedAt,worktreePrUrl:s.worktreePrUrl,backendConversationId:i,harnessSessionId:s.harnessSessionId})}for(let s of t)s.worktreePath&&r.set(s.id,{id:s.id,name:s.name,worktreePath:s.worktreePath,worktreeBranch:s.worktreeBranch,worktreeStrategy:s.worktreeStrategy,workdir:s.originalWorkdir??s.workdir,worktreeMerged:void 0,worktreeMergedAt:void 0,worktreePrUrl:void 0,backendConversationId:je(s),harnessSessionId:s.harnessSessionId});return Array.from(r.values())}function ld(e,t){return e.id===t||e.name===t||e.backendConversationId===t||e.harnessSessionId===t}function pd(e){switch(e){case"none":return"none";case"provisioned":return"active";case"pending_decision":return"needs decision";case"merge_conflict_resolving":return"conflict resolving";case"pr_open":return"pr open";case"merged":return"merged";case"released":return"released";case"dismissed":return"dismissed";case"no_change":return"no change";case"cleanup_failed":return"cleanup failed";default:return e}}function fd(e){switch(e){case"active_session":return"active session";case"pending_decision":return"pending decision";case"merge_conflict_resolving":return"conflict resolving";case"dirty_tracked_changes":case"dirty_worktree_entries":return"dirty worktree";case"unique_content":return"still has unique content";case"topology_merged":return"merged by ancestry";case"merge_noop_content_already_on_base":return"content already on base";case"pr_open":return"PR open";case"pr_merged_not_reflected_locally":return"merged PR not reflected locally";case"stale_pr_open":return"stale PR-open metadata";case"repo_missing":return"repo missing";case"branch_missing":return"branch missing";case"worktree_missing":return"worktree missing";case"base_branch_missing":return"base branch missing";default:return e.startsWith("released_by_branch:")?`represented by ${e.slice(19)}`:e.startsWith("represented_by_branch:")?`represented by ${e.slice(22)}`:e.replaceAll("_"," ")}}function Xi(e){return!e||typeof e!="object"?!1:typeof e.session=="string"}function Yi(e,t){return e===!0&&t?.exists===!0&&t.state!=="open"}function xr(e,t,n){return n.forceNewIgnoresClosedTargetPr&&e.exists&&e.state!=="open"&&t?.exists===!0&&(e.url!==void 0&&e.url===t.url||e.number!==void 0&&e.number===t.number)?{exists:!1,state:"none"}:e}function eo(e,t){try{let n=yt("git",["-C",e,"worktree","list","--porcelain"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),r;for(let s of n.split(/\r?\n/)){if(s.startsWith("worktree ")){r=s.slice(9);continue}if(s===`branch refs/heads/${t}`)return r;s===""&&(r=void 0)}}catch{return}}function Ir(e,t,n){try{let r=eo(e,t);return r?(yt("git",["-C",r,"merge","--ff-only",n],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),{success:!0,branchName:t,alreadyRepresented:!1}):(he(e)===t?yt("git",["-C",e,"merge","--ff-only",n],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}):yt("git",["-C",e,"branch","-f",t,n],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),{success:!0,branchName:t,alreadyRepresented:!1})}catch(r){return{success:!1,error:`Failed to fast-forward existing PR branch ${t} from ${n}: ${r instanceof Error?r.message:String(r)}`}}}function to(e){let{repoDir:t,sourceBranch:n,targetPrStatus:r}=e;if(!r.exists||r.state!=="open"||!r.headRefName)return{success:!1,error:"Target PR is not an open PR with a resolvable head branch."};let s=r.headRefName,i=hn(t,s),o=i??s;if(s===n&&!i)return{success:!0,branchName:n,alreadyRepresented:!1};if(!ge(t,s)&&!i)return{success:!1,error:`Target PR branch ${s} is not available locally. Fetch it before updating the PR.`};if(Z(t,n,o)){if(i&&!Z(t,i,s)&&Z(t,s,i)){let d=Ir(t,s,i);if("error"in d)return d}return{success:!0,branchName:s,alreadyRepresented:!!i}}return he(t)===s&&Z(t,o,s)&&Z(t,n,s)?{success:!0,branchName:s,alreadyRepresented:!1}:Z(t,o,n)?Ir(t,s,n):{success:!1,error:`Refusing to create a sibling PR: target PR branch ${s} and follow-up branch ${n} have diverged. Reconcile them manually, then run agent_pr again.`}}function no(e){let t=he(e.repoDir);if(!t||t!==e.expectedParentBranch||t===e.worktreeBranch||t===e.baseBranch)return;let n=ue(e.repoDir,t,e.targetRepo);return n.exists&&n.state==="open"&&n.headRefName===t&&(!n.baseRefName||n.baseRefName===e.baseBranch)?n:void 0}function ro(e){let t=e.targetPrStatus.headRefName;if(!t||t===e.fallbackBranch)return e.fallbackBranch;let n=he(e.repoDir);return n===t?n:e.fallbackBranch}function Cr(e){return[e.action==="opened"?`Opened PR for branch ${e.branchName} into ${e.baseBranch}.`:`Updated PR for branch ${e.branchName} into ${e.baseBranch}.`,...e.prUrl?[`PR URL: ${e.prUrl}.`]:[],...e.prNumber?[`PR number: #${e.prNumber}.`]:[],...e.targetRepo?[`Target repository: ${e.targetRepo}.`]:[],...e.commits!==void 0?[`Pushed ${e.commits} new commits (+${e.insertions??0}/-${e.deletions??0}).`]:[]]}function _r(e){let t=e.prNumber!==void 0?`#${e.prNumber}`:e.prUrl??"unknown-pr",n=e.diffSummary?.commitMessages.map(s=>s.hash.trim()).filter(Boolean).join(","),r=e.action==="updated"?n||[`commits:${e.diffSummary?.commits??"unknown"}`,`insertions:${e.diffSummary?.insertions??"unknown"}`,`deletions:${e.diffSummary?.deletions??"unknown"}`].join(","):"created";return["worktree-pr",e.action,e.targetRepo??"default-repo",t,e.branchName,r].join(":")}async function so(e){let t=e.prStatus.number??e.prStatus.url;if(!t)return{status:"skipped",reason:"missing-pr-identity"};let n=e.operations?.getBody??En,r=e.operations?.updateBody??$n,s=e.operations?.updateTitle??On;if(e.explicitTitle!==void 0||e.explicitBody!==void 0){let m=e.explicitTitle===void 0?!1:s(e.repoDir,t,e.explicitTitle,e.targetRepo);if(e.explicitTitle!==void 0&&!m)return{status:"failed",reason:"failed to update explicit PR title"};let h=e.explicitBody===void 0?!1:r(e.repoDir,t,e.explicitBody,e.targetRepo);return e.explicitBody!==void 0&&!h?{status:"failed",reason:"failed to update explicit PR body"}:{status:"updated",updatedTitle:m,updatedBody:h,reason:"explicit"}}let i=n(e.repoDir,t,e.targetRepo);if(i.ok===!1)return{status:"failed",reason:`failed to read PR body: ${i.error}`};let o=i.body??"";if(o.trim()===""&&!e.forceRefresh)return{status:"skipped",reason:"empty-body"};if(!(e.forceRefresh||Dt(o)))return{status:"skipped",reason:"human-edited"};let a=await tt({sessionName:e.sessionName,branchName:e.branchName,prompt:e.prompt,outputPreview:e.outputPreview,diffSummary:e.diffSummary,provider:e.metadataProvider});if(a.ok===!1)return{status:"failed",reason:a.error};let l=a.evidence.sessionSummary.length>0||a.evidence.sessionChanges.length>0;if(a.fallbackReason!==void 0&&(!l||!Ut(o)))return{status:"failed",reason:"generated PR metadata was unavailable; preserved existing generated PR metadata"};let p=nt({sessionName:e.sessionName,metadata:a.metadata,diffSummary:e.diffSummary}),g=e.forceRefresh||zt(e.prStatus.title),u=!1;if(g&&e.prStatus.title?.trim()!==a.metadata.title.trim()&&(u=s(e.repoDir,t,a.metadata.title,e.targetRepo),!u))return{status:"failed",reason:"failed to update generated PR title"};if(p.trim()===o.trim())return u?{status:"updated",updatedTitle:u,updatedBody:!1,reason:e.forceRefresh?"forced":"generated"}:{status:"skipped",reason:"unchanged"};let b=r(e.repoDir,t,p,e.targetRepo);return b?{status:"updated",updatedTitle:u,updatedBody:b,reason:e.forceRefresh?"forced":"generated"}:{status:"failed",reason:"failed to update generated PR body"}}function on(e){if(e.status==="updated"){if(e.updatedTitle&&e.updatedBody)return e.reason==="explicit"?"📝 Replaced PR title/body with explicitly provided metadata.":"📝 Refreshed PR title/body from current OpenClaw metadata.";if(e.updatedTitle)return e.reason==="explicit"?"📝 Replaced PR title with the explicitly provided title.":"📝 Refreshed PR title from current OpenClaw metadata.";if(e.updatedBody)return e.reason==="explicit"?"📝 Replaced PR body with the explicitly provided body.":"📝 Refreshed PR body from current OpenClaw metadata."}if(e.status==="failed")return`âš ī¸ PR metadata refresh failed: ${e.reason}`}function vd(e,t={}){return{name:"agent_pr",description:"Create or update a GitHub PR for a worktree branch. Handles full PR lifecycle: creates new PRs, updates existing open PRs with comments, and handles merged/closed PRs. Pushes the branch, syncs PR state, and persists metadata.",parameters:D.Object({session:D.String({description:"Session name or ID to create/update PR for"}),title:D.Optional(D.String({description:"PR title (default: auto-generated from session name)"})),body:D.Optional(D.String({description:"PR body (default: auto-generated from commit summary). For existing open PRs, passing body explicitly replaces the PR body."})),update_body:D.Optional(D.Boolean({description:"For existing open PRs, refresh generated PR metadata when true. Alias for update_metadata; retained for compatibility."})),update_metadata:D.Optional(D.Boolean({description:"For existing open PRs, refresh title/body when true. Default: only refresh bodies clearly generated by OpenClaw and titles that are fallback-generated, or explicit title/body values."})),base_branch:D.Optional(D.String({description:"Base branch for the PR (default: detected from repo)"})),force_new:D.Optional(D.Boolean({description:"Force creation of a new PR even if one exists (default: false)"})),target_repo:D.Optional(D.String({description:"Target repository for cross-repo PRs (e.g. 'openai/codex'). Auto-detected from 'upstream' remote if not set."}))}),async execute(n,r){if(!ee)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}],meta:{success:!1,state:"error"}};if(!Xi(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, title?, body?, update_body?, update_metadata?, base_branch?, force_new? }."}],meta:{success:!1,state:"error"}};if(!K())return{content:[{type:"text",text:"Error: GitHub CLI (gh) is not available. Install it and authenticate to create PRs."}],meta:{success:!1,state:"error"}};let s=Sr(ee,r.session),i=s.activeSession,o=s.persistedSession;if(!i&&!o)return{content:[{type:"text",text:`Error: Session "${r.session}" not found.`}],meta:{success:!1,state:"error"}};let{worktreePath:d,originalWorkdir:a,sessionName:l}=s,{branchName:p}=s;if(!d||!a)return{content:[{type:"text",text:`Error: Session "${r.session}" does not have a worktree.`}],meta:{success:!1,state:"error"}};if(!p)return{content:[{type:"text",text:`Error: Cannot determine branch name for worktree ${d}. The worktree may have been removed and no persisted branch name is available.`}],meta:{success:!1,state:"error"}};Vi(d)||`${d}${p}${a}`;let g=r.base_branch??Xe(a),u=t.metadataProvider??Ht(),b=c=>{let R=Gn({worktreeBaseBranch:o?.worktreeBaseBranch??i?.worktreeBaseBranch??g,worktreePrTargetRepo:o?.worktreePrTargetRepo??i?.worktreePrTargetRepo,worktreePushRemote:o?.worktreePushRemote??i?.worktreePushRemote},{prUrl:c.prUrl,prNumber:c.prNumber,baseBranch:g,targetRepo:c.targetRepo,disposition:c.disposition});for(let T of sn(s))ee.updatePersistedSession(T,R)},m=bn(a,r.target_repo??o?.worktreePrTargetRepo),h=o?.worktreePrUrl??i?.worktreePrUrl,k=h?Be(a,h,m):void 0;if(h&&!k?.exists)return{content:[{type:"text",text:`Error: Session is associated with ${h}, but that PR could not be resolved. Refusing to create a sibling PR from ${p}.`}],meta:{success:!1,state:"error"}};let f=Yi(r.force_new,k),S=f?void 0:h,$=!h&&!r.force_new?no({repoDir:a,worktreeBranch:p,expectedParentBranch:o?.worktreeParentBranch??i?.worktreeParentBranch,baseBranch:g,targetRepo:m}):void 0,q=f?void 0:k??$,F=S??$?.url,Q=!1;if(q?.exists&&q.state==="open"){let c=ro({repoDir:a,fallbackBranch:p,targetPrStatus:q}),R=to({repoDir:a,sourceBranch:c,targetPrStatus:q});if("error"in R)return{content:[{type:"text",text:`Error: ${R.error}`}],meta:{success:!1,state:"error"}};p=R.branchName,Q=R.alreadyRepresented}let N=ee.resolveRepoPolicy(a),Y=xr(q?.exists?q:ue(a,p,m),k,{forceNewIgnoresClosedTargetPr:f}),ie=Y.exists&&Y.state==="open";if(N?.policy==="never-pr"&&!ie)return{content:[{type:"text",text:`Error: Repo policy forbids PR creation for ${N.identity?.repoRoot??a}.`}],meta:{success:!1,state:"error"}};if(N&&!N.prAvailable)return{content:[{type:"text",text:`Error: PR automation is unavailable for ${N.identity?.repoRoot??a}. Provider: ${N.provider}.`}],meta:{success:!1,state:"error"}};if((!q||q.state==="open")&&!Q&&!xn(a,p))return{content:[{type:"text",text:`❌ Failed to push ${p} — cannot create/update PR`}],meta:{success:!1,state:"error"}};let w=xr(F?Be(a,F,m):ue(a,p,m),k,{forceNewIgnoresClosedTargetPr:f});if(r.force_new&&w.exists)return{content:[{type:"text",text:`âš ī¸ Cannot create new PR: A PR already exists for ${p} (${w.state}).
30
+ `)}function ni(e){return rn(e).result}function rn(e){let t=Array.isArray(e)?e:H(e)&&Array.isArray(e.messages)?e.messages:H(e)&&Array.isArray(e.items)?e.items:[],n=[];for(let r of t){let s=H(r)&&H(r.info)?r.info:r;if(!H(s)||(typeof s.role=="string"?s.role:s.type)!=="assistant")continue;let i=Array.isArray(s.content)?s.content:[],d=H(r)&&Array.isArray(r.parts)?r.parts:[];for(let a of[...i,...d])H(a)&&a.type==="text"&&typeof a.text=="string"&&n.push(a.text)}return{count:n.length,result:n.at(-1)}}var Pt=class{constructor(t={}){this.deps=t}deps;name="opencode";backendKind="opencode-server";supportedPermissionModes=["default","plan","bypassPermissions"];capabilities={nativePendingInput:!0,nativePlanArtifacts:!1,worktrees:"plugin-managed"};launch(t){let n=new ge,r=this.deps.fetch??fetch,s,o,i,d=t.resumeSessionId,a=0,c=t.permissionMode??"default",l,m=!t.resumeSessionId,u=!1,b=!1,p=new AbortController,h,P=!1,f=!1,I=!1,N=!1,E,L=!1,Z=!1,B,G=new Set,ce=k=>N?!1:(N=!0,n.enqueue(de(k)),!0),se=(k,g,x,C=0)=>ce({success:k,outcome:g,duration_ms:0,total_cost_usd:C,num_turns:a,result:x,session_id:d??""}),A=()=>{d&&B!==d&&(B=d,n.enqueue(Me({kind:"opencode-server",conversationId:d})))},R=k=>{k&&G.has(k)||(k&&G.add(k),n.enqueue(he(k)),k&&l?.requestId===k&&(l=void 0))},$=async()=>{if(o)return o;i??=(async()=>{let k=await(this.deps.createServer??Go)({cwd:t.cwd,signal:t.abortController?.signal,fetch:r,requestTimeoutMs:this.deps.requestTimeoutMs,startupTimeoutMs:this.deps.startupTimeoutMs});if(L||t.abortController?.signal.aborted)throw await k.close().catch(()=>{}),new Error("OpenCode startup was interrupted before session creation.");return s=k,o=new nn(k.baseUrl,r,this.deps.requestTimeoutMs),o})();try{return await i}catch(k){throw i=void 0,k}},D=async(k,g)=>{!o||!d||await o.request("POST",`/permission/${encodeURIComponent(k)}/reply`,{reply:g})},v=async(k,g)=>{!o||!d||await o.request("POST",`/question/${encodeURIComponent(k)}/reply`,{answers:[[g]]})},w=async k=>{let g=Zo(k),x=Vo(g.properties);if(!(x&&x!==d)){if((g.type==="session.next.text.delta"||g.type==="message.part.delta")&&g.properties.field!=="reasoning"&&typeof g.properties.delta=="string"){n.enqueue(ve(g.properties.delta));return}if(g.type==="session.next.tool.called"||g.type==="message.part.updated"){let C=H(g.properties.part)?g.properties.part:void 0;if(g.type==="message.part.updated"&&C?.type!=="tool"){n.enqueue({type:"activity"});return}let F=typeof g.properties.tool=="string"?g.properties.tool:typeof C?.tool=="string"?C.tool:"tool";n.enqueue(lt(F,g.properties.input));return}if(g.type==="session.next.step.failed"||g.type==="session.error"){let C=H(g.properties.error)&&typeof g.properties.error.message=="string"?g.properties.error.message:`${g.type} failed`;f&&!I&&(h?.abort(),await j(!1,C));return}if(g.type==="permission.asked"){if(c==="bypassPermissions"){let F=typeof g.properties.id=="string"?g.properties.id:void 0;F&&(await D(F,"once").catch(()=>{}),R(F));return}let C=Xo(g.properties);l={requestId:C.requestId,kind:"approval",options:C.options,actions:C.actions??[],state:C},n.enqueue(re(C));return}if(g.type==="permission.replied"){let C=typeof g.properties.requestID=="string"?g.properties.requestID:void 0;R(C);return}if(g.type==="question.asked"){let C=Yo(g.properties);l={requestId:C.requestId,kind:"question",options:C.options,actions:[],state:C},n.enqueue(re(C));return}if(g.type==="question.replied"||g.type==="question.rejected"){let C=typeof g.properties.requestID=="string"?g.properties.requestID:void 0;R(C);return}(g.type?.startsWith("session.next.")||g.type?.startsWith("message.")||g.type==="session.status"||g.type==="session.idle")&&(jo(g)&&(Z=!0),n.enqueue({type:"activity"}))}},y=()=>{P||!o||(P=!0,o.streamEvents(w,p.signal).catch(async k=>{!p.signal.aborted&&f&&!I&&(h?.abort(),await j(!1,Be(k)))}).finally(()=>{P=!1}))},S=async(k,g)=>await k.request("GET",`/session/${encodeURIComponent(g)}/message`),W=async(k,g)=>await k.request("GET",`/session/${encodeURIComponent(g)}`,void 0,{timeoutMs:Math.min(this.deps.requestTimeoutMs??kt,_o)}),_=async(k,g,x,C,F)=>{await k.request("POST",`/session/${encodeURIComponent(g)}/prompt_async`,Ho(x,t.model,C),{signal:F})},T=async(k,g,x,C)=>{let F=Date.now(),V=!1,Q=x,le,Ie=0,pe,ln=this.deps.turnTimeoutMs??Mo;for(;;){if(C.aborted)throw new Error("wait aborted");let Lr=await S(k,g).catch(()=>{}),fe=rn(Lr),pn=fe.count>x&&!!fe.result;pn&&fe.count===Q&&fe.result===le?Ie+=1:(Ie=pn?1:0,Q=fe.count,le=fe.result);let St=!1;try{let Ne=await k.request("GET","/session/status",void 0,{signal:C,timeoutMs:Math.min(this.deps.requestTimeoutMs??kt,1e4)});St=zo(Ne,g),pe=void 0,St||(V=!0)}catch(Ne){if(C.aborted)throw new Error("wait aborted");pe=Be(Ne)}if(St&&(V||fe.count>x)||Z&&fe.count>x||Ie>=2&&pe)return;if(Date.now()-F>ln){let Ne=pe?` Last status error: ${pe}`:"";throw new Error(`Timed out waiting for OpenCode session ${g} to become idle after ${ln}ms.${Ne}`)}await Ar(250)}},z=async()=>{let k=await $();if(d){if(t.forkSession&&!u){let C=await k.request("POST",`/session/${encodeURIComponent(d)}/fork`,{});if(!C.id)throw new Error("OpenCode fork did not return a session id.");d=C.id,u=!0,m=!0}else m||(await S(k,d),m=!0);return A(),y(),d}let g=Lo(t.model),x=await k.request("POST","/session",{...g?{model:g}:{},metadata:{client:"openclaw-code-agent"},permission:Cr(c)});if(!x.id)throw new Error("OpenCode did not return a session id.");return d=x.id,m=!0,A(),y(),d},j=(k,g,x=k?"completed":"failed")=>(E??=(async()=>{let C=g,F=0;if(o&&d){let[V,Q]=await Promise.all([k?S(o,d).catch(()=>{}):Promise.resolve(void 0),W(o,d).catch(()=>{})]);C=C??ni(V),F=No(Q)}L?se(!1,"interrupted",void 0,F):se(k,x,C,F)})(),E),xe=async k=>{f=!0,I=!1,N=!1,E=void 0,Z=!1;try{let g=await $();if(L)return;let x=await z();if(L)return;n.enqueue(Ae()),a+=1;let C=b?void 0:t.systemPrompt,F=await S(g,x).catch(()=>{}),V=rn(F).count,Q=new AbortController;h=Q,await _(g,x,k,C,Q.signal),b=!0,await T(g,x,V,Q.signal),h=void 0,I=!0,await j(!0)}catch(g){h=void 0,L?await j(!1,void 0,"interrupted"):await j(!1,Be(g))}finally{f=!1,I=!1}},ye=async(k,g={})=>{let x=l;if(!x||x.kind!=="question"||g.requestId&&g.requestId!==x.requestId)return!1;let C=k.trim();if(!C)return!1;let F=x.state?.questions??[];if(F.length>0){let V=x.state?.activeQuestionIndex??0,Q=F[V];if(!Q||g.questionId&&g.questionId!==Q.id)return!1;x.answers={...x.answers,[Q.id]:{answers:[C]}};let le=V+1;return le<F.length?(x.state=ei(x.state,le,x.answers),x.options=x.state.options,n.enqueue(re(x.state)),!0):(await v(x.requestId,ti(F,x.answers)),R(x.requestId),!0)}return await v(x.requestId,C),R(x.requestId),!0},Ve=typeof t.prompt=="string"?(async function*(){yield{type:"user",text:t.prompt,session_id:t.resumeSessionId??""}})():t.prompt;return(async()=>{try{for await(let k of Ve){if(L)break;let g=qo(k).trim();if(g){if(l?.kind==="question"){await ye(g);continue}if(await xe(g),L)break}}}catch(k){L||(f||(N=!1,E=void 0),await j(!1,Be(k)))}finally{p.abort(),await s?.close().catch(()=>{}),n.close()}})(),{messages:n.messages(),async setPermissionMode(k){d&&await(await $()).request("PATCH",`/session/${encodeURIComponent(d)}`,{permission:Cr(k)}),c=k,n.enqueue(Ee(k))},async submitPendingInputOption(k,g={}){let x=l;if(!x||g.requestId&&g.requestId!==x.requestId)return!1;if(x.kind==="approval"){let Ie=x.actions[k],pe=Ie?.kind==="approval"?Ie.responseDecision:void 0;return pe?(await D(x.requestId,pe),R(x.requestId),!0):!1}let C=x.state?.questions??[],F=x.state?.activeQuestionIndex??0,V=C[F];if(g.questionId&&g.questionId!==V?.id)return!1;let Q=V?.options[k],le=Q?.value??Q?.label??x.options[k];return le?await ye(le,g):!1},async submitPendingInputText(k){return await ye(k)},async interrupt(){if(L=!0,p.abort(),h?.abort(),f||(N=!1,E=void 0),!o){se(!1,"interrupted"),await s?.close().catch(()=>{});return}if(!d){se(!1,"interrupted");return}await o.request("POST",`/session/${encodeURIComponent(d)}/abort`).catch(()=>{}),await j(!1,void 0,"interrupted")}}}buildUserMessage(t,n){return{type:"user",text:t,session_id:n}}};var sn=new Map;function on(e){sn.set(e.name,e)}function an(e){let t=sn.get(e);if(!t)throw new Error(`Unknown agent harness: "${e}". Available: ${[...sn.keys()].join(", ")}`);return t}function wd(){return an(Xe())}on(new ft);on(new yt);on(new Pt);function Ze(e){return e.backendRef?.conversationId??e.harnessSessionId}function Rt(e){return e.id??e.sessionId??e.name??Ze(e)??e.harnessSessionId}function ri(e){return e.harnessSessionId}function dn(e){let t=[Rt(e),Ze(e),ri(e)].filter(n=>!!n);return[...new Set(t)]}function si(e){return e.harnessName??e.persistedHarness??Xe()}function oi(e){if(e.backendRef?.kind==="codex-app-server")return"native-restore";try{return an(si(e)).capabilities.worktrees}catch{return"plugin-managed"}}function ii(e){return e==="native-execution"}function ai(e){return e==="native-restore"}function di(e){return!!(e.backendRef?.worktreePath||e.backendRef?.worktreeId)}function Pd(e){let t=oi(e);return(ii(t)||ai(t))&&di(e)}function Er(e){if(!e)return!1;let t=new Set(e.split(/\r?\n/).map(o=>o.trim().replace(/^[#*_\s]+|[:*_\s]+$/g,"").toLowerCase())),n=["root cause","summary","result"].some(o=>t.has(o)),r=["fix","changes","implementation","implemented"].some(o=>t.has(o)),s=["validation","verification","tests"].some(o=>t.has(o));return n&&r&&s}function $r(e,t){let n=e.resolve(t),r=e.getPersistedSession(t),s=n?Rt(n):r?Rt(r):void 0,o=n?.getOutput?.().join(`
31
+ `).trim(),i;if(r?.outputPath&&ui(r.outputPath))try{i=ci(r.outputPath,"utf-8").trim()}catch{}let d=Er(o),a=Er(i),c=d===a?(i?.length??0)>(o?.length??0)?i:o:a?i:o;return{activeSession:n,persistedSession:r,persistedRef:s,sessionName:n?.name??r?.name??t,prompt:n?.prompt??r?.prompt,outputPreview:c?c.slice(-12e3):void 0,worktreePath:n?.worktreePath??r?.worktreePath,originalWorkdir:n?.originalWorkdir??r?.workdir,branchName:n?.worktreeBranch??r?.worktreeBranch,notificationTarget:n??(r?{id:s??t,name:r.name,harnessSessionId:r.harnessSessionId,backendRef:r.backendRef,route:r.route,originChannel:r.originChannel,originThreadId:r.originThreadId,originSessionKey:r.originSessionKey,goalTaskId:r.goalTaskId,...r.costUsd!==void 0?{costUsd:r.costUsd}:{},...r.createdAt!==void 0?{createdAt:r.createdAt}:{},...r.completedAt!==void 0?{completedAt:r.completedAt}:{},...r.harness!==void 0?{harnessName:r.harness}:{},...r.model!==void 0?{model:r.model}:{}}:void 0)}}function un(e){return[...e.persistedSession?dn(e.persistedSession):[],...e.activeSession?dn(e.activeSession):[]].filter((t,n,r)=>r.indexOf(t)===n)}function li(e,t){let n=[t.id,t.backendConversationId,t.harnessSessionId,t.name],r,s;for(let o of n)if(o&&(r??=e.resolve(o),s??=e.getPersistedSession(o),r&&s))break;return{activeSession:r,persistedSession:s}}function Id(e,t,n={}){let{activeSession:r,persistedSession:s}=li(e,t),o=Dn({workdir:t.workdir,worktreePath:t.worktreePath,worktreeBranch:t.worktreeBranch,worktreeBaseBranch:n.baseBranch??s?.worktreeBaseBranch,worktreePrTargetRepo:s?.worktreePrTargetRepo,worktreePushRemote:s?.worktreePushRemote,worktreePrUrl:s?.worktreePrUrl,worktreePrNumber:s?.worktreePrNumber,worktreeLifecycle:s?.worktreeLifecycle},{activeSession:!!(r&&(r.status==="starting"||r.status==="running")),includePrSync:!!(s?.worktreeLifecycle?.state==="pr_open"||s?.worktreePrUrl)});return{activeSession:r,persistedSession:s,resolvedLifecycle:o}}function Cd(e){let t=e.list("all").filter(s=>s.worktreePath),n=e.listPersistedSessions().filter(s=>s.worktreePath),r=new Map;for(let s of n){if(!s.worktreePath)continue;let o=Ze(s),i=s.sessionId??o??s.harnessSessionId;i&&r.set(i,{id:s.sessionId??o??s.harnessSessionId,name:s.name,worktreePath:s.worktreePath,worktreeBranch:s.worktreeBranch,worktreeStrategy:s.worktreeStrategy,workdir:s.workdir,worktreeMerged:s.worktreeMerged,worktreeMergedAt:s.worktreeMergedAt,worktreePrUrl:s.worktreePrUrl,backendConversationId:o,harnessSessionId:s.harnessSessionId})}for(let s of t)s.worktreePath&&r.set(s.id,{id:s.id,name:s.name,worktreePath:s.worktreePath,worktreeBranch:s.worktreeBranch,worktreeStrategy:s.worktreeStrategy,workdir:s.originalWorkdir??s.workdir,worktreeMerged:void 0,worktreeMergedAt:void 0,worktreePrUrl:void 0,backendConversationId:Ze(s),harnessSessionId:s.harnessSessionId});return Array.from(r.values())}function Td(e,t){return e.id===t||e.name===t||e.backendConversationId===t||e.harnessSessionId===t}function _d(e){switch(e){case"none":return"none";case"provisioned":return"active";case"pending_decision":return"needs decision";case"merge_conflict_resolving":return"conflict resolving";case"pr_open":return"pr open";case"merged":return"merged";case"released":return"released";case"dismissed":return"dismissed";case"no_change":return"no change";case"cleanup_failed":return"cleanup failed";default:return e}}function Md(e){switch(e){case"active_session":return"active session";case"pending_decision":return"pending decision";case"merge_conflict_resolving":return"conflict resolving";case"dirty_tracked_changes":case"dirty_worktree_entries":return"dirty worktree";case"unique_content":return"still has unique content";case"topology_merged":return"merged by ancestry";case"merge_noop_content_already_on_base":return"content already on base";case"pr_open":return"PR open";case"pr_merged_not_reflected_locally":return"merged PR not reflected locally";case"stale_pr_open":return"stale PR-open metadata";case"repo_missing":return"repo missing";case"branch_missing":return"branch missing";case"worktree_missing":return"worktree missing";case"base_branch_missing":return"base branch missing";default:return e.startsWith("released_by_branch:")?`represented by ${e.slice(19)}`:e.startsWith("represented_by_branch:")?`represented by ${e.slice(22)}`:e.replaceAll("_"," ")}}function fi(e){return!e||typeof e!="object"?!1:typeof e.session=="string"}function mi(e,t){return e===!0&&t?.exists===!0&&t.state!=="open"}function Or(e,t,n){return n.forceNewIgnoresClosedTargetPr&&e.exists&&e.state!=="open"&&t?.exists===!0&&(e.url!==void 0&&e.url===t.url||e.number!==void 0&&e.number===t.number)?{exists:!1,state:"none"}:e}function gi(e,t){try{let n=vt("git",["-C",e,"worktree","list","--porcelain"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),r;for(let s of n.split(/\r?\n/)){if(s.startsWith("worktree ")){r=s.slice(9);continue}if(s===`branch refs/heads/${t}`)return r;s===""&&(r=void 0)}}catch{return}}function Br(e,t,n){try{let r=gi(e,t);return r?(vt("git",["-C",r,"merge","--ff-only",n],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),{success:!0,branchName:t,alreadyRepresented:!1}):(ke(e)===t?vt("git",["-C",e,"merge","--ff-only",n],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}):vt("git",["-C",e,"branch","-f",t,n],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),{success:!0,branchName:t,alreadyRepresented:!1})}catch(r){return{success:!1,error:`Failed to fast-forward existing PR branch ${t} from ${n}: ${r instanceof Error?r.message:String(r)}`}}}function hi(e){let{repoDir:t,sourceBranch:n,targetPrStatus:r}=e;if(!r.exists||r.state!=="open"||!r.headRefName)return{success:!1,error:"Target PR is not an open PR with a resolvable head branch."};let s=r.headRefName,o=kn(t,s),i=o??s;if(s===n&&!o)return{success:!0,branchName:n,alreadyRepresented:!1};if(!be(t,s)&&!o)return{success:!1,error:`Target PR branch ${s} is not available locally. Fetch it before updating the PR.`};if(te(t,n,i)){if(o&&!te(t,o,s)&&te(t,s,o)){let d=Br(t,s,o);if("error"in d)return d}return{success:!0,branchName:s,alreadyRepresented:!!o}}return ke(t)===s&&te(t,i,s)&&te(t,n,s)?{success:!0,branchName:s,alreadyRepresented:!1}:te(t,i,n)?Br(t,s,n):{success:!1,error:`Refusing to create a sibling PR: target PR branch ${s} and follow-up branch ${n} have diverged. Reconcile them manually, then run agent_pr again.`}}function wi(e){let t=ke(e.repoDir);if(!t||t!==e.expectedParentBranch||t===e.worktreeBranch||t===e.baseBranch)return;let n=me(e.repoDir,t,e.targetRepo);return n.exists&&n.state==="open"&&n.headRefName===t&&(!n.baseRefName||n.baseRefName===e.baseBranch)?n:void 0}function yi(e){let t=e.targetPrStatus.headRefName;if(!t||t===e.fallbackBranch)return e.fallbackBranch;let n=ke(e.repoDir);return n===t?n:e.fallbackBranch}function Nr(e){return[e.action==="opened"?`Opened PR for branch ${e.branchName} into ${e.baseBranch}.`:`Updated PR for branch ${e.branchName} into ${e.baseBranch}.`,...e.prUrl?[`PR URL: ${e.prUrl}.`]:[],...e.prNumber?[`PR number: #${e.prNumber}.`]:[],...e.targetRepo?[`Target repository: ${e.targetRepo}.`]:[],...e.commits!==void 0?[`Pushed ${e.commits} new commits (+${e.insertions??0}/-${e.deletions??0}).`]:[]]}function qr(e){let t=e.prNumber!==void 0?`#${e.prNumber}`:e.prUrl??"unknown-pr",n=e.diffSummary?.commitMessages.map(s=>s.hash.trim()).filter(Boolean).join(","),r=e.action==="updated"?n||[`commits:${e.diffSummary?.commits??"unknown"}`,`insertions:${e.diffSummary?.insertions??"unknown"}`,`deletions:${e.diffSummary?.deletions??"unknown"}`].join(","):"created";return["worktree-pr",e.action,e.targetRepo??"default-repo",t,e.branchName,r].join(":")}async function bi(e){let t=e.prStatus.number??e.prStatus.url;if(!t)return{status:"skipped",reason:"missing-pr-identity"};let n=e.operations?.getBody??Nn,r=e.operations?.updateBody??qn,s=e.operations?.updateTitle??Ln;if(e.explicitTitle!==void 0||e.explicitBody!==void 0){let p=e.explicitTitle===void 0?!1:s(e.repoDir,t,e.explicitTitle,e.targetRepo);if(e.explicitTitle!==void 0&&!p)return{status:"failed",reason:"failed to update explicit PR title"};let h=e.explicitBody===void 0?!1:r(e.repoDir,t,e.explicitBody,e.targetRepo);return e.explicitBody!==void 0&&!h?{status:"failed",reason:"failed to update explicit PR body"}:{status:"updated",updatedTitle:p,updatedBody:h,reason:"explicit"}}let o=n(e.repoDir,t,e.targetRepo);if(o.ok===!1)return{status:"failed",reason:`failed to read PR body: ${o.error}`};let i=o.body??"";if(i.trim()===""&&!e.forceRefresh)return{status:"skipped",reason:"empty-body"};if(!(e.forceRefresh||Jt(i)))return{status:"skipped",reason:"human-edited"};let a=await it({sessionName:e.sessionName,branchName:e.branchName,prompt:e.prompt,outputPreview:e.outputPreview,diffSummary:e.diffSummary,provider:e.metadataProvider});if(a.ok===!1)return{status:"failed",reason:a.error};let c=a.evidence.sessionSummary.length>0||a.evidence.sessionChanges.length>0;if(a.fallbackReason!==void 0&&(!c||!Qt(i)))return{status:"failed",reason:"generated PR metadata was unavailable; preserved existing generated PR metadata"};let l=at({sessionName:e.sessionName,metadata:a.metadata,diffSummary:e.diffSummary}),m=e.forceRefresh||Gt(e.prStatus.title),u=!1;if(m&&e.prStatus.title?.trim()!==a.metadata.title.trim()&&(u=s(e.repoDir,t,a.metadata.title,e.targetRepo),!u))return{status:"failed",reason:"failed to update generated PR title"};if(l.trim()===i.trim())return u?{status:"updated",updatedTitle:u,updatedBody:!1,reason:e.forceRefresh?"forced":"generated"}:{status:"skipped",reason:"unchanged"};let b=r(e.repoDir,t,l,e.targetRepo);return b?{status:"updated",updatedTitle:u,updatedBody:b,reason:e.forceRefresh?"forced":"generated"}:{status:"failed",reason:"failed to update generated PR body"}}function cn(e){if(e.status==="updated"){if(e.updatedTitle&&e.updatedBody)return e.reason==="explicit"?"📝 Replaced PR title/body with explicitly provided metadata.":"📝 Refreshed PR title/body from current OpenClaw metadata.";if(e.updatedTitle)return e.reason==="explicit"?"📝 Replaced PR title with the explicitly provided title.":"📝 Refreshed PR title from current OpenClaw metadata.";if(e.updatedBody)return e.reason==="explicit"?"📝 Replaced PR body with the explicitly provided body.":"📝 Refreshed PR body from current OpenClaw metadata."}if(e.status==="failed")return`âš ī¸ PR metadata refresh failed: ${e.reason}`}function Wd(e,t={}){return{name:"agent_pr",description:"Create or update a GitHub PR for a worktree branch. Handles full PR lifecycle: creates new PRs, updates existing open PRs with comments, and handles merged/closed PRs. Pushes the branch, syncs PR state, and persists metadata.",parameters:J.Object({session:J.String({description:"Session name or ID to create/update PR for"}),title:J.Optional(J.String({description:"PR title (default: auto-generated from session name)"})),body:J.Optional(J.String({description:"PR body (default: auto-generated from commit summary). For existing open PRs, passing body explicitly replaces the PR body."})),update_body:J.Optional(J.Boolean({description:"For existing open PRs, refresh generated PR metadata when true. Alias for update_metadata; retained for compatibility."})),update_metadata:J.Optional(J.Boolean({description:"For existing open PRs, refresh title/body when true. Default: only refresh bodies clearly generated by OpenClaw and titles that are fallback-generated, or explicit title/body values."})),base_branch:J.Optional(J.String({description:"Base branch for the PR (default: detected from repo)"})),force_new:J.Optional(J.Boolean({description:"Force creation of a new PR even if one exists (default: false)"})),target_repo:J.Optional(J.String({description:"Target repository for cross-repo PRs (e.g. 'openai/codex'). Auto-detected from 'upstream' remote if not set."}))}),async execute(n,r){if(!oe)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}],meta:{success:!1,state:"error"}};if(!fi(r))return{content:[{type:"text",text:"Error: Invalid parameters. Expected { session, title?, body?, update_body?, update_metadata?, base_branch?, force_new? }."}],meta:{success:!1,state:"error"}};if(!ee())return{content:[{type:"text",text:"Error: GitHub CLI (gh) is not available. Install it and authenticate to create PRs."}],meta:{success:!1,state:"error"}};let s=$r(oe,r.session),o=s.activeSession,i=s.persistedSession;if(!o&&!i)return{content:[{type:"text",text:`Error: Session "${r.session}" not found.`}],meta:{success:!1,state:"error"}};let{worktreePath:d,originalWorkdir:a,sessionName:c}=s,{branchName:l}=s;if(!d||!a)return{content:[{type:"text",text:`Error: Session "${r.session}" does not have a worktree.`}],meta:{success:!1,state:"error"}};if(!l)return{content:[{type:"text",text:`Error: Cannot determine branch name for worktree ${d}. The worktree may have been removed and no persisted branch name is available.`}],meta:{success:!1,state:"error"}};pi(d)||`${d}${l}${a}`;let m=r.base_branch??rt(a),u=t.metadataProvider??jt(),b=R=>{let $=Xn({worktreeBaseBranch:i?.worktreeBaseBranch??o?.worktreeBaseBranch??m,worktreePrTargetRepo:i?.worktreePrTargetRepo??o?.worktreePrTargetRepo,worktreePushRemote:i?.worktreePushRemote??o?.worktreePushRemote},{prUrl:R.prUrl,prNumber:R.prNumber,baseBranch:m,targetRepo:R.targetRepo,disposition:R.disposition});for(let D of un(s))oe.updatePersistedSession(D,$)},p=vn(a,r.target_repo??i?.worktreePrTargetRepo),h=i?.worktreePrUrl??o?.worktreePrUrl,P=h?We(a,h,p):void 0;if(h&&!P?.exists)return{content:[{type:"text",text:`Error: Session is associated with ${h}, but that PR could not be resolved. Refusing to create a sibling PR from ${l}.`}],meta:{success:!1,state:"error"}};let f=mi(r.force_new,P),I=f?void 0:h,N=!h&&!r.force_new?wi({repoDir:a,worktreeBranch:l,expectedParentBranch:i?.worktreeParentBranch??o?.worktreeParentBranch,baseBranch:m,targetRepo:p}):void 0,E=f?void 0:P??N,L=I??N?.url,Z=!1;if(E?.exists&&E.state==="open"){let R=yi({repoDir:a,fallbackBranch:l,targetPrStatus:E}),$=hi({repoDir:a,sourceBranch:R,targetPrStatus:E});if("error"in $)return{content:[{type:"text",text:`Error: ${$.error}`}],meta:{success:!1,state:"error"}};l=$.branchName,Z=$.alreadyRepresented}let B=oe.resolveRepoPolicy(a),G=Or(E?.exists?E:me(a,l,p),P,{forceNewIgnoresClosedTargetPr:f}),ce=G.exists&&G.state==="open";if(B?.policy==="never-pr"&&!ce)return{content:[{type:"text",text:`Error: Repo policy forbids PR creation for ${B.identity?.repoRoot??a}.`}],meta:{success:!1,state:"error"}};if(B&&!B.prAvailable)return{content:[{type:"text",text:`Error: PR automation is unavailable for ${B.identity?.repoRoot??a}. Provider: ${B.provider}.`}],meta:{success:!1,state:"error"}};if((!E||E.state==="open")&&!Z&&!_n(a,l))return{content:[{type:"text",text:`❌ Failed to push ${l} — cannot create/update PR`}],meta:{success:!1,state:"error"}};let A=Or(L?We(a,L,p):me(a,l,p),P,{forceNewIgnoresClosedTargetPr:f});if(r.force_new&&A.exists)return{content:[{type:"text",text:`âš ī¸ Cannot create new PR: A PR already exists for ${l} (${A.state}).
32
32
 
33
- Existing PR: ${w.url}
33
+ Existing PR: ${A.url}
34
34
 
35
- To create a new PR, you must first close/merge the existing PR manually or use a different branch.`}],meta:{success:!1,state:"error"}};if(w.exists&&w.state==="open"){let c=Et(a,p,g),R=await so({repoDir:a,prStatus:w,targetRepo:m,sessionName:l,branchName:p,prompt:s.prompt,outputPreview:s.outputPreview,diffSummary:c,explicitTitle:r.title,explicitBody:r.body,forceRefresh:r.update_body===!0||r.update_metadata===!0,metadataProvider:u});if(c&&c.commits>0){let T=c.commitMessages.slice(0,5).map(A=>`â€ĸ ${A.hash} ${A.message} (${A.author})`).join(`
36
- `),C=c.commits>5?`
37
- ...and ${c.commits-5} more commits`:"",_=["🔄 **New commits pushed**","",`${c.commits} new commits (+${c.insertions} / -${c.deletions})`,"","### Latest commits:",T+C,"","---","🤖 [openclaw-code-agent](https://github.com/goldmar/openclaw-code-agent)"].join(`
38
- `);if(Bn(a,w.number,_,m)){b({prUrl:w.url,prNumber:w.number,targetRepo:m});let A=$t({kind:"pr-updated",branch:p,prUrl:w.url,filesChanged:c.filesChanged,insertions:c.insertions,deletions:c.deletions});return ee.notifyWorktreeOutcome(s.notificationTarget,A,{completionWakeOutcomeKey:_r({action:"updated",branchName:p,prUrl:w.url,prNumber:w.number,targetRepo:m,diffSummary:c}),detailLines:Cr({action:"updated",branchName:p,baseBranch:g,prUrl:w.url,prNumber:w.number,targetRepo:m,commits:c.commits,insertions:c.insertions,deletions:c.deletions})}),{content:[{type:"text",text:[`${A}`,"",`📝 Added comment detailing ${c.commits} new commits (+${c.insertions} / -${c.deletions})`,on(R)].filter(Boolean).join(`
39
- `)}],meta:{success:!0,state:"pr_updated"}}}else{let A=on(R);return{content:[{type:"text",text:`âš ī¸ Pushed to ${w.url} but failed to add comment.
35
+ To create a new PR, you must first close/merge the existing PR manually or use a different branch.`}],meta:{success:!1,state:"error"}};if(A.exists&&A.state==="open"){let R=Nt(a,l,m),$=await bi({repoDir:a,prStatus:A,targetRepo:p,sessionName:c,branchName:l,prompt:s.prompt,outputPreview:s.outputPreview,diffSummary:R,explicitTitle:r.title,explicitBody:r.body,forceRefresh:r.update_body===!0||r.update_metadata===!0,metadataProvider:u});if(R&&R.commits>0){let D=R.commitMessages.slice(0,5).map(S=>`â€ĸ ${S.hash} ${S.message} (${S.author})`).join(`
36
+ `),v=R.commits>5?`
37
+ ...and ${R.commits-5} more commits`:"",w=["🔄 **New commits pushed**","",`${R.commits} new commits (+${R.insertions} / -${R.deletions})`,"","### Latest commits:",D+v,"","---","🤖 [openclaw-code-agent](https://github.com/goldmar/openclaw-code-agent)"].join(`
38
+ `);if(Fn(a,A.number,w,p)){b({prUrl:A.url,prNumber:A.number,targetRepo:p});let S=qt({kind:"pr-updated",branch:l,prUrl:A.url,filesChanged:R.filesChanged,insertions:R.insertions,deletions:R.deletions});return oe.notifyWorktreeOutcome(s.notificationTarget,S,{completionWakeOutcomeKey:qr({action:"updated",branchName:l,prUrl:A.url,prNumber:A.number,targetRepo:p,diffSummary:R}),detailLines:Nr({action:"updated",branchName:l,baseBranch:m,prUrl:A.url,prNumber:A.number,targetRepo:p,commits:R.commits,insertions:R.insertions,deletions:R.deletions})}),{content:[{type:"text",text:[`${S}`,"",`📝 Added comment detailing ${R.commits} new commits (+${R.insertions} / -${R.deletions})`,cn($)].filter(Boolean).join(`
39
+ `)}],meta:{success:!0,state:"pr_updated"}}}else{let S=cn($);return{content:[{type:"text",text:`âš ī¸ Pushed to ${A.url} but failed to add comment.
40
40
 
41
- ${c.commits} new commits (+${c.insertions} / -${c.deletions})${A?`
42
- ${A}`:""}`}],meta:{success:!0,state:"pr_open"}}}}else{b({prUrl:w.url,prNumber:w.number,targetRepo:m});let T=on(R);return{content:[{type:"text",text:`â„šī¸ PR already exists and is up to date: ${w.url}
41
+ ${R.commits} new commits (+${R.insertions} / -${R.deletions})${S?`
42
+ ${S}`:""}`}],meta:{success:!0,state:"pr_open"}}}}else{b({prUrl:A.url,prNumber:A.number,targetRepo:p});let D=cn($);return{content:[{type:"text",text:`â„šī¸ PR already exists and is up to date: ${A.url}
43
43
 
44
- No new commits to push.${T?`
45
- ${T}`:""}`}],meta:{success:!0,state:"pr_open"}}}}else if(w.exists&&w.state==="merged"){let c={...Qn({worktreeBaseBranch:o?.worktreeBaseBranch??i?.worktreeBaseBranch??g,worktreePrTargetRepo:o?.worktreePrTargetRepo??i?.worktreePrTargetRepo,worktreePushRemote:o?.worktreePushRemote??i?.worktreePushRemote},{resolutionSource:"agent_pr",clearResolverSessionId:!0}),worktreePrUrl:w.url,worktreePrNumber:w.number,worktreeDisposition:"merged",worktreeDecisionSnoozedUntil:void 0};for(let R of sn(s))ee.updatePersistedSession(R,c);return{content:[{type:"text",text:`✅ PR was already merged: ${w.url}
44
+ No new commits to push.${D?`
45
+ ${D}`:""}`}],meta:{success:!0,state:"pr_open"}}}}else if(A.exists&&A.state==="merged"){let R={...Vn({worktreeBaseBranch:i?.worktreeBaseBranch??o?.worktreeBaseBranch??m,worktreePrTargetRepo:i?.worktreePrTargetRepo??o?.worktreePrTargetRepo,worktreePushRemote:i?.worktreePushRemote??o?.worktreePushRemote},{resolutionSource:"agent_pr",clearResolverSessionId:!0}),worktreePrUrl:A.url,worktreePrNumber:A.number,worktreeDisposition:"merged",worktreeDecisionSnoozedUntil:void 0};for(let $ of un(s))oe.updatePersistedSession($,R);return{content:[{type:"text",text:`✅ PR was already merged: ${A.url}
46
46
 
47
- The worktree branch ${p} can be cleaned up with agent_merge(delete_branch=true).`}],meta:{success:!0,state:"merged"}}}else{if(w.exists&&w.state==="closed")return{content:[{type:"text",text:`âš ī¸ A PR exists but was closed without merging: ${w.url}
47
+ The worktree branch ${l} can be cleaned up with agent_merge(delete_branch=true).`}],meta:{success:!0,state:"merged"}}}else{if(A.exists&&A.state==="closed")return{content:[{type:"text",text:`âš ī¸ A PR exists but was closed without merging: ${A.url}
48
48
 
49
49
  What would you like to do?
50
50
 
@@ -52,6 +52,6 @@ What would you like to do?
52
52
  2. Close and delete the branch with agent_merge(delete_branch=true), then start a new session/worktree
53
53
  3. Manually delete the closed PR on GitHub, then call agent_pr(force_new=true) to create a fresh PR
54
54
 
55
- (This tool cannot automatically reopen or recreate PRs to avoid unintended actions.)`}],meta:{success:!1,state:"closed"}};{if(N?.policy==="never-pr")return{content:[{type:"text",text:`Error: Repo policy forbids PR creation for ${N.identity?.repoRoot??a}.`}],meta:{success:!1,state:"error"}};let c=!r.title||!r.body?Et(a,p,g):void 0,R;if(!r.title||!r.body){let O=await tt({sessionName:l,branchName:p,prompt:s.prompt,outputPreview:s.outputPreview,diffSummary:c,provider:u});if(O.ok===!1)return{content:[{type:"text",text:`❌ ${O.error}`}],meta:{success:!1,state:"error"}};R=O.metadata}let T=r.title??R.title,C=r.body;C||(C=nt({sessionName:l,metadata:R,diffSummary:c}));let _=An(a,p,g,T,C,m,{draft:!0});if(_.success&&_.prUrl){let O=ue(a,p,m);b({prUrl:_.prUrl,prNumber:O.number,targetRepo:m,disposition:"pr-opened"});let A=$t({kind:"pr-opened",branch:p,targetRepo:m,prUrl:_.prUrl});return ee.notifyWorktreeOutcome(s.notificationTarget,A,{completionWakeOutcomeKey:_r({action:"opened",branchName:p,prUrl:_.prUrl,prNumber:O.number,targetRepo:m}),detailLines:Cr({action:"opened",branchName:p,baseBranch:g,prUrl:_.prUrl,prNumber:O.number,targetRepo:m})}),{content:[{type:"text",text:_.warnings&&_.warnings.length>0?`${A}
55
+ (This tool cannot automatically reopen or recreate PRs to avoid unintended actions.)`}],meta:{success:!1,state:"closed"}};{if(B?.policy==="never-pr")return{content:[{type:"text",text:`Error: Repo policy forbids PR creation for ${B.identity?.repoRoot??a}.`}],meta:{success:!1,state:"error"}};let R=!r.title||!r.body?Nt(a,l,m):void 0,$;if(!r.title||!r.body){let y=await it({sessionName:c,branchName:l,prompt:s.prompt,outputPreview:s.outputPreview,diffSummary:R,provider:u});if(y.ok===!1)return{content:[{type:"text",text:`❌ ${y.error}`}],meta:{success:!1,state:"error"}};$=y.metadata}let D=r.title??$.title,v=r.body;v||(v=at({sessionName:c,metadata:$,diffSummary:R}));let w=Bn(a,l,m,D,v,p,{draft:!0});if(w.success&&w.prUrl){let y=me(a,l,p);b({prUrl:w.prUrl,prNumber:y.number,targetRepo:p,disposition:"pr-opened"});let S=qt({kind:"pr-opened",branch:l,targetRepo:p,prUrl:w.prUrl});return oe.notifyWorktreeOutcome(s.notificationTarget,S,{completionWakeOutcomeKey:qr({action:"opened",branchName:l,prUrl:w.prUrl,prNumber:y.number,targetRepo:p}),detailLines:Nr({action:"opened",branchName:l,baseBranch:m,prUrl:w.prUrl,prNumber:y.number,targetRepo:p})}),{content:[{type:"text",text:w.warnings&&w.warnings.length>0?`${S}
56
56
 
57
- âš ī¸ ${_.warnings.join("; ")}`:A}],meta:{success:!0,state:"created"}}}else return{content:[{type:"text",text:`❌ Failed to create PR: ${_.error??"unknown error"}`}],meta:{success:!1,state:"error"}}}}}}}export{fa as a,Wn as b,ma as c,ga as d,cn as e,xt as f,ln as g,lo as h,po as i,yo as j,G as k,bo as l,Qe as m,Po as n,ko as o,Ro as p,vo as q,So as r,Xr as s,Yr as t,xo as u,es as v,Io as w,D as x,ee as y,Br as z,qr as A,oo as B,ao as C,uo as D,We as E,Ea as F,er as G,$a as H,nn as I,ed as J,je as K,wt as L,rn as M,Ui as N,zi as O,ji as P,Ji as Q,sd as R,Eo as S,K as T,$o as U,Oo as V,hn as W,Xe as X,he as Y,Bo as Z,Z as _,yn as $,qo as aa,bn as ba,Uo as ca,Rn as da,vn as ea,zo as fa,jo as ga,Jo as ha,ws as ia,Zo as ja,Et as ka,xn as la,Vo as ma,ue as na,Be as oa,$t as pa,Ln as qa,ba as ra,Pa as sa,Qn as ta,Sr as ua,sn as va,ud as wa,cd as xa,ld as ya,pd as za,fd as Aa,tt as Ba,Ht as Ca,Dt as Da,Ut as Ea,zt as Fa,nt as Ga,Yi as Ha,xr as Ia,to as Ja,no as Ka,ro as La,Cr as Ma,_r as Na,so as Oa,vd as Pa};
57
+ âš ī¸ ${w.warnings.join("; ")}`:S}],meta:{success:!0,state:"created"}}}else return{content:[{type:"text",text:`❌ Failed to create PR: ${w.error??"unknown error"}`}],meta:{success:!1,state:"error"}}}}}}}export{Ca as a,zn as b,Ta as c,_a as d,mn as e,_t as f,gn as g,xi as h,Ii as i,Ei as j,Y as k,$i as l,Xe as m,Oi as n,Bi as o,Ni as p,qi as q,Li as r,ss as s,os as t,Fi as u,is as v,Wi as w,J as x,oe as y,Ur as z,Dr as A,Pi as B,Ri as C,vi as D,Je as E,Ga as F,dr as G,Ka as H,an as I,wd as J,Ze as K,Rt as L,dn as M,si as N,oi as O,ii as P,ai as Q,Pd as R,Ji as S,ee as T,Qi as U,Gi as V,kn as W,rt as X,ke as Y,Ki as Z,te as _,Rn as $,Zi as aa,vn as ba,ra as ca,In as da,Cn as ea,sa as fa,oa as ga,ia as ha,vs as ia,ca as ja,Nt as ka,_n as la,la as ma,me as na,We as oa,qt as pa,Dn as qa,$a as ra,Oa as sa,Vn as ta,$r as ua,un as va,Id as wa,Cd as xa,Td as ya,_d as za,Md as Aa,it as Ba,jt as Ca,Jt as Da,Qt as Ea,Gt as Fa,at as Ga,mi as Ha,Or as Ia,hi as Ja,wi as Ka,yi as La,Nr as Ma,qr as Na,bi as Oa,Wd as Pa};