openclaw-code-agent 4.7.12 → 4.7.14

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 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(`
1
+ import{execFileSync as wn}from"node:child_process";function Ct(e){if(typeof e!="string"||!e||e.startsWith("-")||/^refs\/(?:heads|remotes|tags)\//u.test(e)||e==="HEAD"||e==="@"||/\s|[\x00-\x1f\x7f]/u.test(e))return"Expected a literal Git branch name (local branch only; not a full ref, option, or revision expression).";try{wn("git",["check-ref-format",`refs/heads/${e}`],{timeout:5e3,stdio:["ignore","ignore","ignore"]});return}catch{return"Expected a valid literal Git branch name; Git ref validation failed."}}function A(e){let t=Ct(e);if(t)throw new Error(t)}function F(e){return A(e),`refs/heads/${e}`}function zr(e){if(typeof e=="string"&&e.startsWith("refs/remotes/"))try{wn("git",["check-ref-format",e],{timeout:5e3,stdio:["ignore","ignore","ignore"]});return}catch{throw new Error("Expected a valid literal Git branch or remote-tracking ref.")}A(e)}function Tt(e){return zr(e),e.startsWith("refs/remotes/")?e:F(e)}var _t=Symbol("optionalSchema");function We(e,t){return t?{...t,...e}:e}function jr(e){return{...e,[_t]:!0}}function Jr(e){return{const:e,type:typeof e}}var G={Object(e,t){let n=Object.entries(e).filter(([,s])=>!s[_t]).map(([s])=>s),r=Object.fromEntries(Object.entries(e).map(([s,o])=>{let{[_t]:i,...d}=o;return[s,d]}));return{...t,type:"object",...n.length>0?{required:n}:{},properties:r}},String(e){return We({type:"string"},e)},Number(e){return We({type:"number"},e)},Boolean(e){return We({type:"boolean"},e)},Array(e,t){return We({type:"array",items:e},t)},Literal:Jr,Union(e,t){return We({anyOf:e},t)},Optional:jr};import{execFileSync as vt}from"child_process";import{existsSync as yi}from"fs";var ae=null,Qr=null,Gr=null;function _i(e){ae=e}function Mi(e){Qr=e}function Ei(e){Gr=e}import{execFileSync as H}from"child_process";import*as rt from"fs";import{tmpdir as fs}from"os";import{dirname as xn,join as ms}from"path";import{readFileSync as as}from"fs";import{homedir as ds}from"os";import{join as us}from"path";var Kr=new Set(["telegram","discord","slack","system","mattermost","feishu","line","whatsapp","signal","matrix","googlechat","bluebubbles","imessage","msteams"]);function yn(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=yn({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=yn({chatId:r,topicId:t});return s?{chatId:r,topicId:t,canonicalConversationId:s}:null}function Vr(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 Xr(e,t){if(!/^\d+$/.test(e))return e;let n=Vr(t);return n?`${n}:${e}`:`channel:${e}`}function Yr(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 es(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 ts(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||!Kr.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 ns(e,t=Zr){try{return t({conversationId:e})}catch{return null}}var rs={safeParseTelegramTopicConversation:ns};function Mt(e){return{provider:"system",target:"system",sessionKey:e?.trim()||void 0}}function Et(e,t){return{...e,threadId:t??e.threadId}}function ss(e,t,n){return e==="telegram"&&n?.provider==="telegram"&&!!n.target&&t!==n.target}function os(e){let t=e?.trim();if(!t)return;let n=ts(t);if(!n)return;let{provider:r,kind:s,rawId:o}=n,i=es(o),d=null;if(r==="telegram")try{d=rs.safeParseTelegramTopicConversation(o)}catch{d=null}let a=d?.chatId??i.id,l=d?.topicId??i.threadId,c=r==="discord"?s==="direct"||s==="dm"?`user:${a}`:`channel:${a}`:a;return{provider:r,target:c,threadId:l,sessionKey:t}}function At(e){let t=e?.match(/:topic:(\d+)$/i);return t?parseInt(t[1],10):void 0}function bn(e){return!!(e?.provider&&e.target&&e.provider!=="system"&&e.target!=="system")}function $t(e,t,n){let r=os(n),s=t!=null?String(t):void 0,o=e?.trim();if(!o||o.toLowerCase()==="unknown")return r?Et(r,s):Mt(n);let i=o.split("|").map(f=>f.trim());if(i.length<2)return r?Et(r,s):Mt(n);let[d,a,l]=i,c=i.length>=3?l:a,m=i.length>=3?a:void 0,u=d?.toLowerCase();if(!u||!c)return r?Et(r,s):Mt(n);let h=u==="discord"?Xr(c,n):c;return ss(u,h,r)?{provider:u,accountId:m,target:r.target,threadId:s??r.threadId,sessionKey:n?.trim()||void 0}:{provider:u,accountId:m,target:h,threadId:s??(r?.provider===u?r.threadId:void 0),sessionKey:n?.trim()||void 0}}function kn(e){return $t(Yr(e.route)??e.originChannel,e.route?.threadId??e.originThreadId,e.route?.sessionKey??e.originSessionKey)??e.route}function $i(e){let t=kn(e);return bn(t)?t:void 0}function is(e){return Object.fromEntries(Object.entries(e).filter(t=>!!t[1]))}function Oi(e){let t=kn(e);if(!bn(t))return"";let n=is({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 Fe,Pn="claude-code",Ue={"claude-code":{defaultModel:"anthropic/claude-sonnet-4-7",allowedModels:["sonnet","opus"]},codex:{defaultModel:"gpt-6-astra",allowedModels:["gpt-6-astra","gpt-5.6-sol","gpt-5.6-terra","gpt-5.6-luna"],reasoningEffort:"medium"},opencode:{}};function Fi(){if(Fe!==void 0)return Fe;try{let e=as(us(ds(),".claude.json"),"utf-8");Fe=JSON.parse(e).mcpServers??{}}catch{Fe={}}return Fe}var te={maxSessions:20,idleTimeoutMinutes:15,sessionGcAgeMinutes:1440,maxPersistedSessions:1e4,maxAutoResponds:10,permissionMode:"plan",planApproval:"delegate",defaultWorktreeStrategy:"delegate",harnesses:{"claude-code":{...Ue["claude-code"]},codex:{...Ue.codex},opencode:{...Ue.opencode}}};function Ui(e){let t=e.defaultHarness??Pn,n={};for(let[r,s]of Object.entries(Ue)){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});te={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 et(){return te.defaultHarness??Pn}function Nt(e){let t=Ue[e],n=te.harnesses[e];return{...t,...n,allowedModels:n?.allowedModels??t?.allowedModels}}function Di(e){return Nt(e).defaultModel}function Hi(e){return te.harnesses[e]?.allowedModels??te.allowedModels}function zi(e){return Nt(e).reasoningEffort}function ji(e){return e==="codex"?Nt(e).fastMode:void 0}function ee(e){return e==null?void 0:String(e).trim()||void 0}function qt(e){return{channel:ee(e?.deliveryContext?.channel),to:ee(e?.deliveryContext?.to),accountId:ee(e?.deliveryContext?.accountId),threadId:ee(e?.deliveryContext?.threadId)}}function Rn(e,t,n){if(!(!e||!t))return n?`${e}|${n}|${t}`:`${e}|${t}`}function Ot(e){return ee(e?.requesterSenderId??e?.senderId)}function Bt(e){return(ee(e.deliveryContext?.channel)??e.messageChannel??e.channel)?.toLowerCase()!=="telegram"?!1:!!(At(e.sessionKey)||ee(e.messageThreadId)||ee(e.deliveryContext?.threadId))}function Ji(e){let t=qt(e),n=Rn(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=ee(e.chatId);if(r.length===1&&s)return`${r[0]}|${s}`;let o=Ot(e);if(r.length===1&&o&&!Bt(e))return`${r[0]}|${o}`}if(e.workspaceDir){let r=ps(e.workspaceDir);if(r)return r}if(e.messageChannel&&e.messageChannel.includes("|"))return e.messageChannel}function cs(e,t){if(t&&String(t).includes("|"))return String(t);let n=qt(e),r=Rn(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=ee(e.chatId);if(a)return`${d}|${a}`;let l=Ot(e);if(l&&!Bt(e))return`${d}|${l}`}let s=ee(e?.channel),o=ee(e?.chatId);if(s&&o)return`${s}|${o}`;let i=Ot(e);return s&&i&&!Bt(e)?`${s}|${i}`:e?.id&&/^-?\d+$/.test(String(e.id))?`telegram|${e.id}`:te.fallbackChannel??"unknown"}function ls(e){return qt(e).threadId??e?.messageThreadId??void 0}function Qi(e,t,n){return $t(cs(e,t),ls(e),n??e?.sessionKey)}function ps(e){let t=te.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 Gi(e){return At(e)}var tt,nt;function gs(e){try{return H("git",["rev-parse","--show-toplevel"],{cwd:e,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{return}}function st(e){if(process.env.OPENCLAW_WORKTREE_DIR)return process.env.OPENCLAW_WORKTREE_DIR;if(te.worktreeDir)return te.worktreeDir;if(e){let t=gs(e);if(t)return ms(t,".worktrees")}return fs()}function Sn(e){return e.replace(/[^a-zA-Z0-9._-]/g,"-").replace(/\.{2,}/g,"-").replace(/^[-.]|[-.]$/g,"").slice(0,100).replace(/[-.]+$/,"")||"session"}function ta(e){try{let t=H("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")?xn(t):void 0}catch{return}}function hs(){if(tt!==void 0)return tt;try{return H("git",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),tt=!0,!0}catch{return tt=!1,!1}}function ne(){if(nt!==void 0)return nt;try{return H("gh",["--version"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),nt=!0,!0}catch{return nt=!1,!1}}function na(e){if(!hs())return!1;try{return H("git",["rev-parse","--git-dir"],{cwd:e,timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function ra(e){try{let t=ys(e);if(!t)return`${st(e)}`,!0;let n=rt.statfsSync(t),r=n.bavail*n.bsize;return bs(r)}catch(t){return`${t instanceof Error?t.message:String(t)}`,!0}}function Pe(e,t){A(t);try{return H("git",["-C",e,"rev-parse","--verify",F(t)],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function vn(e,t,n="origin"){A(t),A(n);let r=`refs/remotes/${n}/${t}`;try{return H("git",["-C",e,"fetch",n,`+${F(t)}:${r}`],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),H("git",["-C",e,"rev-parse","--verify",r],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),r}catch{return}}function ws(e){let t=e;for(;;){if(rt.existsSync(t))return t;let n=xn(t);if(n===t)return;t=n}}function ys(e){return ws(st(e))}function bs(e){return e>=104857600}function ot(e){let t=process.env.OPENCLAW_WORKTREE_BASE_BRANCH;if(t!==void 0)return A(t),t;try{let r=H("git",["-C",e,"rev-parse","--abbrev-ref","origin/HEAD"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().replace(/^origin\//,"");if(r)return A(r),r}catch{}try{return H("git",["-C",e,"rev-parse","--verify",F("main")],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"main"}catch{}try{return H("git",["-C",e,"rev-parse","--verify",F("master")],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),"master"}catch{return"main"}}function Re(e){try{let n=H("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 sa(e,t,n){A(t),A(n);try{let r=H("git",["-C",e,"rev-list","--count",`${F(n)}..${F(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 In(e,t,n){A(t),A(n);try{let r=H("git",["-C",e,"rev-list","--left-right","--count",`${F(t)}...${F(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 re(e,t,n){let r=Tt(t),s=Tt(n);try{return H("git",["-C",e,"merge-base","--is-ancestor",r,s],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch{return!1}}function Cn(e,t,n){A(t),A(n);try{let r=H("git",["-C",e,"merge-tree","--write-tree",F(n),F(t)],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),s=H("git",["-C",e,"rev-parse",`${F(n)}^{tree}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();return!!r&&r===s}catch{return!1}}function oa(e,t){A(t);try{return H("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 Tn(e,t){if(t)return t;let n;try{n=H("git",["-C",e,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{}try{let r=H("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 _e}from"child_process";import{randomBytes as ks}from"crypto";import{appendFileSync as Ps,existsSync as Wt,mkdirSync as _n,readFileSync as Rs,rmSync as Lt}from"fs";import{relative as xs,sep as Mn}from"path";function Ss(e,t){return!!(e&&typeof e=="object"&&"code"in e&&e.code===t)}function vs(e){try{return _e("git",["-C",e,"rev-parse","--show-toplevel"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch{return}}function Is(e){return e===0?"":`-${e}-${ks(8).toString("hex")}`}function Cs(e,t){let n=vs(e);if(!n)return;let r=xs(n,t);if(!r||r.startsWith("..")||r.includes(`..${Mn}`))return;let s=`${n}/.git/info/exclude`,o=`${r.split(Mn).join("/").replace(/\/$/,"")}/`;try{let i=Wt(s)?Rs(s,"utf-8"):"";i.split(/\r?\n/).map(a=>a.trim()).some(a=>a===o||a===`/${o}`)||Ps(s,`${i.endsWith(`
3
3
  `)||i.length===0?"":`
4
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}
5
+ `,"utf-8")}catch(i){`${o}${s}${i instanceof Error?i.message:String(i)}`}}function pa(e,t,n={}){let r=Sn(t),s=st(e);Cs(e,s),_n(s,{recursive:!0});let o=n.allowExistingBranch===!0,i,d,a=10,l=!1;for(let m=0;m<a;m++){let u=Is(m),h=`${s}/openclaw-worktree-${r}${u}`,f=`agent/${r}${u}`;if(!o&&Pe(e,f))continue;let w=!1;do{w=!1;try{_n(h,{recursive:!1}),i=h,d=f;break}catch(k){if(Ss(k,"EEXIST")){if(o&&m===0&&!l)try{Lt(h,{recursive:!0,force:!0}),l=!0,w=!0}catch(p){throw new Error(`Failed to recreate existing worktree branch ${f}: could not clear blocked path ${h}: ${p instanceof Error?p.message:String(p)}`)}else if(o&&m===0)throw new Error(`Failed to recreate existing worktree branch ${f}: path ${h} remains blocked after one cleanup attempt`);continue}throw k}}while(w);if(i&&d)break}if(!i||!d)throw new Error(`Failed to create unique worktree directory and branch after ${a} attempts`);let c=Pe(e,d);try{c?_e("git",["-C",e,"worktree","add",i,d],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}):_e("git",["-C",e,"worktree","add","-b",d,i],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(m){try{Lt(i,{recursive:!0,force:!0})}catch{}throw m}return i}function En(e){if(!Wt(e))return[];try{let t=_e("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 An(e){return En(e).length>0}function fa(e,t,n={}){let r=n.destructive===!0,s=En(t);if(s.length>0&&!r)return`${t}${s[0]}`,!1;try{return _e("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 Lt(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 ma(e){try{_e("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 ga(e){return Wt(e)}import{execFileSync as W}from"child_process";import{existsSync as Ts}from"fs";function _s(e){return(e.warnings??[]).filter(t=>!(e.stashPopConflict&&t.startsWith("Failed to pop auto-stash after merge"))).map(t=>`Recovery warning: ${t}`)}function ka(e,t){let n=_s(t);return n.length===0?e:`${e}
7
7
  ${n.map(r=>`⚠️ ${r}`).join(`
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,`
8
+ `)}`}function it(e){return e instanceof Error?e.message:String(e)}function Ft(e,t,n){A(t),A(n);let r=F(t),s=F(n);try{let o=W("git",["-C",e,"rev-list","--count",`${s}..${r}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),i=parseInt(o.trim(),10),a=W("git",["-C",e,"diff","--shortstat",`${s}...${r}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim(),l=0,c=0,m=0,u=a.match(/(\d+)\s+files?\s+changed/);u&&(l=parseInt(u[1],10));let h=a.match(/(\d+)\s+insertions?\(/);h&&(c=parseInt(h[1],10));let f=a.match(/(\d+)\s+deletions?\(/);f&&(m=parseInt(f[1],10));let k=W("git",["-C",e,"diff","--name-only","--diff-filter=ACMR",`${s}...${r}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().split(`
9
+ `).map(N=>N.trim()).filter(Boolean),x=W("git",["-C",e,"log",`${s}..${r}`,"--format=%h|%s|%an","-n","5"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().split(`
10
+ `).filter(Boolean).map(N=>{let[$,q,Z]=N.split("|");return{hash:$||"",message:q||"",author:Z||""}});return{commits:i,filesChanged:l,insertions:c,deletions:m,changedFiles:k,commitMessages:x}}catch(o){`${o instanceof Error?o.message:String(o)}`;return}}function On(e,t,n="origin"){A(t),A(n);let r=F(t);try{return W("git",["-C",e,"push",n,`${r}:${r}`],{timeout:6e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),!0}catch(s){return`${t}${s instanceof Error?s.message:String(s)}`,!1}}function $n(e){try{return W("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 Pa(e,t,n,r="merge",s){A(t),A(n);let o=F(t),i=F(n),d=!1,a,l=[],c=h=>l.length>0?{...h,warnings:[...l]}:h,m=(h,f)=>{l.push(`${h}: ${it(f)}`)},u=h=>{if(d)try{W("git",["-C",h,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(f){m("Failed to pop auto-stash during recovery",f)}};try{if(r==="squash"){if(W("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),$n(e)){let p;try{p=W("git",["-C",e,"stash","push","-m",`pre-merge stash before ${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(x){return c({success:!1,dirtyError:!0,error:`Auto-stash failed: ${it(x)}. Commit or stash changes manually, then retry.`})}if(!p.includes("No local changes to save")){d=!0;try{a=W("git",["-C",e,"stash","list","--format=%gd","-n","1"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch(x){m("Failed to determine auto-stash ref",x)}}}W("git",["-C",e,"merge","--squash",o],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),W("git",["-C",e,"commit","-m",`Squash merge ${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let k=!1;if(d)try{W("git",["-C",e,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(p){k=!0,m("Failed to pop auto-stash after merge",p)}return c({success:!0,stashed:d||void 0,stashRef:a,stashPopConflict:k||void 0})}let h=s&&Ts(s),f=h?s:e;if(h||W("git",["-C",e,"checkout",t],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),$n(e)){let k;try{k=W("git",["-C",e,"stash","push","-m",`pre-merge stash before ${t}`],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(p){try{W("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(x){m(`Failed to check out ${n} after auto-stash failure`,x)}return c({success:!1,dirtyError:!0,error:`Auto-stash failed: ${it(p)}. Commit or stash changes manually, then retry.`})}if(!k.includes("No local changes to save")){d=!0;try{a=W("git",["-C",e,"stash","list","--format=%gd","-n","1"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||void 0}catch(p){m("Failed to determine auto-stash ref",p)}}}try{W("git",["-C",f,"rebase",i],{timeout:6e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch{try{W("git",["-C",f,"rebase","--abort"],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(k){m("Failed to abort rebase during recovery",k)}try{W("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(k){m(`Failed to check out ${n} during recovery`,k)}return u(e),c({success:!1,rebaseConflict:!0,stashed:d||void 0,stashRef:a,error:[`Rebase of ${t} onto ${n} hit conflicts.`,"To resolve manually:",` cd ${f}`,` 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
+ `)})}W("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),W("git",["-C",e,"merge","--ff-only",o],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]});let w=!1;if(d)try{W("git",["-C",e,"stash","pop"],{timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(k){w=!0,m("Failed to pop auto-stash after merge",k)}return c({success:!0,fastForward:!0,stashed:d||void 0,stashRef:a,stashPopConflict:w||void 0})}catch(h){try{W("git",["-C",e,"checkout",n],{timeout:15e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]})}catch(f){m(`Failed to check out ${n} during recovery`,f)}return u(e),c({success:!1,error:it(h),stashed:d||void 0,stashRef:a})}}import{execFileSync as de}from"child_process";function qn(e){let t=e.toLowerCase();return t==="open"?"open":t==="merged"?"merged":t==="closed"?"closed":"none"}var Ms=/(?<!\\)\\(?:r\\)?n/g;function Ln(e){if(/\r|\n/.test(e)||!/(?<!\\)\\n\\n/.test(e))return e;let t=e.replace(Ms,`
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 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,`
14
+ `);return n.some(s=>/^#{1,6}\s+\S/.test(s.trim()))&&n.some(s=>/^(?:[-*+]\s+|\d+\.\s+|```)/.test(s.trim()))?t:e}function Es(e){return e.filesChanged!==void 0?` (${e.filesChanged} files, +${e.insertions??0}/-${e.deletions??0})`:""}function Bn(e){return/pull request already exists/i.test(e)||/createPullRequest/i.test(e)&&/already exists/i.test(e)}function Nn(e,t,n){let r=he(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 Wn(e){try{return de("git",["-C",e,"remote","get-url","origin"],{timeout:5e3,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim().match(/[:/]([^/]+)\/[^/]+(?:\.git)?$/)?.[1]}catch{return}}function As(e,t,n){if(!n)return t;let r=Wn(e);return r?`${r}:${t}`:t}function Fn(e,t,n,r,s,o,i={}){if(A(t),A(n),!ne())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",As(e,t,o)),r&&s?d.push("--title",r,"--body",Ln(s)):d.push("--fill-verbose"),{success:!0,prUrl:de("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(Bn(l))return Nn(e,t,o)??{success:!1,error:l};if((i.draft??!0)&&d&&/draft/i.test(l))try{let c=d.filter(h=>h!=="--draft");return{success:!0,prUrl:de("gh",c,{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(c){let m=c instanceof Error?c.message:String(c);return Bn(m)?Nn(e,t,o)??{success:!1,error:`Draft PR creation failed (${l}); non-draft retry also failed: ${m}`}:{success:!1,error:`Draft PR creation failed (${l}); non-draft retry also failed: ${m}`}}return{success:!1,error:l}}}function he(e,t,n){if(A(t),!ne())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=de("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?Wn(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 c={exists:!0,state:qn(a.state),url:a.url,number:a.number,title:a.title};return a.headRefName!==void 0&&(c.headRefName=a.headRefName),a.baseRefName!==void 0&&(c.baseRefName=a.baseRefName),c}catch(r){return`${t}${r instanceof Error?r.message:String(r)}`,{exists:!1,state:"none"}}}function De(e,t,n){if(!ne())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=de("gh",r,{cwd:e,timeout:1e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),o=JSON.parse(s.trim()),i={exists:!0,state:qn(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 Un(e,t,n){if(!ne())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=de("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 Dn(e,t,n,r){if(!ne())return!1;try{let s=["pr","edit",String(t),"--body",Ln(n)];return r&&s.push("--repo",r),de("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 Hn(e,t,n,r){if(!ne())return!1;try{let s=["pr","edit",String(t),"--title",n];return r&&s.push("--repo",r),de("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 zn(e,t,n,r){if(!ne())return!1;try{let s=["pr","comment",String(t),"--body",n];return r&&s.push("--repo",r),de("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 Ut(e){let t=Es(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 Dt}from"fs";function jn(){return new Date().toISOString()}function $s(e){return e.worktreeLifecycle??{state:e.worktreePath||e.worktreeBranch?"provisioned":"none",updatedAt:jn(),baseBranch:e.worktreeBaseBranch,targetRepo:e.worktreePrTargetRepo,pushRemote:e.worktreePushRemote}}function Os(e){let t=Jn(e);return e.worktreeLifecycle?.baseBranch??e.worktreeBaseBranch??(t&&Dt(t)?ot(t):void 0)}function Jn(e){return typeof e.workdir=="string"&&e.workdir.length>0?e.workdir:void 0}function Qn(e,t={}){let n=$s(e),r=jn(),s=new Set,o=Jn(e),i=!!(o&&Dt(o)),d=!!(e.worktreePath&&Dt(e.worktreePath)),a=e.worktreeBranch,l=Os(e),c=!1,m=!1,u=!1,h=!1,f=!1,w,k,p="none",x=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&&(c=Pe(o,a),c||s.add("branch_missing")),d&&e.worktreePath&&(m=An(e.worktreePath),m&&s.add("dirty_worktree_entries")),i&&o&&c&&a&&l){let R=In(o,a,l);w=R?.ahead,k=R?.behind,u=re(o,a,l),u?s.add("topology_merged"):(h=Cn(o,a,l),h&&s.add("merge_noop_content_already_on_base"),!h&&(w??0)>0&&s.add("unique_content"));let O=Re(o);if(t.includePrSync&&e.worktreePrUrl&&O&&O!==a&&O!==l){let z=De(o,e.worktreePrUrl,e.worktreePrTargetRepo??n.targetRepo);f=!!((z.state==="open"||z.state==="merged")&&z.headRefName===O&&z.baseRefName===l&&re(o,a,O)),f&&(s.delete("unique_content"),s.add(`released_by_branch:${O}`))}}else l||s.add("base_branch_missing");if(t.includePrSync&&i&&o&&a){let R=he(o,a,e.worktreePrTargetRepo??n.targetRepo);p=R.state,x=R.url??x,N=R.number??N}p==="open"&&s.add("pr_open"),p==="merged"&&!u&&!h&&s.add("pr_merged_not_reflected_locally");let $=t.includePrSync&&n.state==="pr_open"&&p!=="open";$&&s.add("stale_pr_open");let q;u?q="merged":(h||f)&&(q="released");let Z=t.activeSession||m,L=n.state;!Z&&q?L=q:$?L="pending_decision":!c&&n.state==="pending_decision"&&(L="cleanup_failed");let V=L==="merged"||L==="released",pe=t.activeSession||m||!V&&n.state==="pending_decision"||n.state==="merge_conflict_resolving"||p==="open"||s.has("pr_merged_not_reflected_locally"),ie=!pe&&(L==="merged"||L==="released"||n.state==="dismissed"||n.state==="no_change"),E={checkedAt:r,repoExists:i,branchExists:c,worktreeExists:d,activeSession:t.activeSession===!0,dirtyTracked:m,topologyMerged:u,releaseNoopMerge:h,representedByTargetPrBranch:f,branchAheadCount:w,baseAheadCount:k,prState:p,prUrl:x,prNumber:N,reasons:[...s]};return{lifecycle:n,evidence:E,derivedState:L,cleanupSafe:ie,preserve:pe,reasons:[...s]}}var xe,He,Me=!1;function Gn(e){try{return e?.config?.current?.()}catch{return}}function La(e,t){if(e&&typeof e=="object"){xe=e,arguments.length>=2?(He=t,Me=!0):Me||(He=Gn(xe),Me=!0);return}xe=void 0,He=void 0,Me=!1}function Kn(){return xe}function Wa(){return xe?.tasks?.managedFlows??xe?.taskFlow}function Fa(){return Me||(He=Gn(xe),Me=!0),He}var Vn=32,Jt="Generated with [openclaw-code-agent](https://github.com/goldmar/openclaw-code-agent)",Qt="Deterministic fallback metadata generated because no LLM PR metadata provider is configured.",Gt="Deterministic fallback metadata generated because the LLM PR metadata provider failed or returned unusable output.",Bs="PR metadata generated from the coding agent's final session report.";function Xn(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 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}
17
+ `:" ").replace(/[ \t]+/g," ").trim()||void 0}function Se(e,t){return e.length<=t?e:`${e.slice(0,Math.max(0,t-3)).trimEnd()}...`}function je(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_-]{${Vn},}\\b`,"g"),"[redacted token]")}function Je(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_-]{${Vn},}\\b`).test(e)}function Ns(e){let t=Xn(e);if(!t)return;let n=t.match(/^[^.!?]+[.!?]/)?.[0]??t,r=je(n).replace(/\s+/g," ").trim();return r?Se(r,180):void 0}function Yn(e){return je(e.trim()).replace(/\s+/g," ").trim()}function qs(e,t){return e?.commitMessages.map(n=>Yn(n.message)).filter(Boolean).slice(0,t)??[]}function zt(){return["Not recorded by agent_pr. Review CI/checks and session output before merging."]}function er(){return["Generated PR metadata omits full task prompts and redacts sensitive-looking prompt details.","Review touched areas for behavior, security, and privacy impact."]}function Ls(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=Se(se(i),n==="validation"?160:180);d&&!Je(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 Ws(e){let t=Ns(e.prompt),n=e.diffSummary,r=Ls(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:qs(n,5),sessionSummary:r.summary,sessionChanges:r.changes,validation:r.validation.length>0?r.validation:zt(),notes:er()}}function at(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 tr(e,t){let n=Xn(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 ze(e,t,n){let r=e.toLowerCase();return tr(t,n.objective).some(s=>r.includes(s))}function Zn(e){return/^(?:node|next|nuxt|vue|express|nest|three|d3|chart|ember|backbone|require)\.js$/i.test(e)}function jt(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)),l=String.raw`[A-Za-z0-9][\w.-]*\.([A-Za-z0-9]+)`,c=e.matchAll(new RegExp(`[\\\`"'](${l})[\\\`"']`,"g"));for(let u of c){let h=u[1],f=u[2]?.toLowerCase();if(f!==void 0&&a.has(f)&&!s.has(h)&&!Zn(h))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 h=u[1],f=u[2]?.toLowerCase();return f!==void 0&&a.has(f)&&!s.has(h)&&!Zn(h)})}function se(e){return je(e).replace(/\s+/g," ").trim()}function Fs(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||!at(r.summary,5,180)||!at(r.changes,10,160)||!at(r.validation,5,160)||!at(r.notes,5,180)||[r.title,...r.summary,...r.changes,...r.validation,...r.notes].some(d=>Je(d)||ze(d,n,t)))return;let o={title:se(r.title),summary:r.summary.map(se),changes:r.changes.map(se),validation:r.validation.map(se),notes:r.notes.map(se)},i=[o.title,...o.summary,...o.changes,...o.validation,...o.notes];if(!i.some(d=>!d||Je(d)||ze(d,n,t))&&!i.some(d=>jt(d,t)))return o}function Ht(e,t,n={}){let r=Se(je(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=Se(o||`OpenClaw agent changes: ${r}`,90),d=s?Bs:n.reason==="provider-failed"||n.reason==="provider-invalid"?Gt:Qt,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(p=>`\`${p}\``):["Review the pushed worktree branch for the full set of changes."],c=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:[...l,...c],validation:e.validation,notes:m},h=!1,f=!1,w=p=>{let x=se(p);if(ze(x,t,e)){h=!0;let N=tr(t,e.objective);for(let $ of N){let q=new RegExp($.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"gi");x=x.replace(q,"[redacted prompt detail]")}x=se(x)}return jt(x,e)&&(f=!0,x="[redacted file reference outside change set]"),x=se(x),(ze(x,t,e)||Je(x))&&(h=!0,x="[redacted prompt detail]"),x};if(u={title:w(u.title)||Se(`OpenClaw agent changes: ${r}`,90),summary:u.summary.map(w).filter(p=>p&&p.length>0),changes:u.changes.map(w).filter(p=>p&&p.length>0),validation:u.validation.map(w).filter(p=>p&&p.length>0),notes:u.notes.map(w).filter(p=>p&&p.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=zt()),u.notes.length===0&&(u.notes=er()),h||f){let p="Some content was stripped from fallback metadata due to safety checks (prompt leak guard or references to files outside the diff).";u.notes.some(x=>x.toLowerCase().includes("stripped")||x.toLowerCase().includes("sanitized"))||(u.notes=[...u.notes,p])}let k=[u.title,...u.summary,...u.changes,...u.validation,...u.notes];if(k.some(p=>!p)||k.some(p=>Je(p)||ze(p,t,e))||k.some(p=>jt(p,e))){let p=Se(je(e.sessionName).replace(/[-_]+/g," ").trim()||"session",60);u={title:Se(`OpenClaw agent changes: ${p}`,90),summary:["Deterministic fallback metadata (sanitized for safety)."],changes:e.changedFiles.length>0?e.changedFiles.slice(0,5).map(x=>`\`${x}\``):["See the worktree branch diff for the full set of changes."],validation:zt(),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 p=se(e.branchName);u.notes.some(x=>x.toLowerCase().includes(p.toLowerCase()))||(u.notes=[...u.notes,`Branch: ${p}`])}return u}async function dt(e){let t=Ws({sessionName:e.sessionName,branchName:e.branchName,prompt:e.prompt,outputPreview:e.outputPreview,diffSummary:e.diffSummary});if(!e.provider)return{ok:!0,metadata:Ht(t,e.prompt,{reason:"no-provider"}),evidence:t,fallbackReason:"no-provider"};try{let n=await e.provider.generatePrMetadata(t),r=Fs(Hs(n),t,e.prompt);return r?{ok:!0,metadata:r,evidence:t}:{ok:!0,metadata:Ht(t,e.prompt,{reason:"provider-invalid"}),evidence:t,fallbackReason:"provider-invalid"}}catch(n){return`${n instanceof Error?n.message:String(n)}`,{ok:!0,metadata:Ht(t,e.prompt,{reason:"provider-failed"}),evidence:t,fallbackReason:"provider-failed"}}}function Kt(){let e=Kn(),t=Us(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=Ds(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 Us(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 Ds(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 Hs(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 Zt(e){return e?e.includes(Jt)||e.includes(Qt)||e.includes(Gt):!1}function Vt(e){return e?e.trim()===Jt||e.includes(Qt)||e.includes(Gt):!1}function Xt(e){return e?/^OpenClaw agent changes:/i.test(e.trim()):!1}function ut(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} ${Yn(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("---",Jt),t.join(`
19
+ `)}function ct(e,t){return{...t,baseBranch:t.baseBranch??e.worktreeBaseBranch,targetRepo:t.targetRepo??e.worktreePrTargetRepo,pushRemote:t.pushRemote??e.worktreePushRemote}}function za(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:ct(e,{state:"pending_decision",updatedAt:n,notes:t.notes})};return t.clearResolverSessionId&&(r.autoMergeResolverSessionId=void 0),r}function ja(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:ct(e,{state:"merge_conflict_resolving",updatedAt:s,notes:r.notes})}}function nr(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:ct(e,{state:"merged",updatedAt:n,resolvedAt:r,resolutionSource:t.resolutionSource??"agent_merge"})};return t.clearResolverSessionId&&(s.autoMergeResolverSessionId=void 0),s}function rr(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:ct(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 hi}from"fs";import*as ht from"@anthropic-ai/claude-agent-sdk";function M(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function B(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 sr(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 or(e){if(typeof e=="string"){let i=e.trim();return i?{label:i,value:i,recommended:sr(i)}:void 0}let t=M(e);if(!t)return;let n=B(t,["label","title","text","value","name","id"])?.trim();if(!n)return;let r=B(t,["description","preview","detail","details"]),s=B(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:sr(n,t)}}function lt(e){let t=M(e);if(!t)return[];let n=t.options??t.choices??t.availableDecisions??t.decisions;return Array.isArray(n)?n.map(or).filter(r=>!!r):[]}function Ee(e){let t=M(e);return(Array.isArray(t?.questions)?t.questions:[]).map((r,s)=>zs(r,s)).filter(r=>!!r)}function zs(e,t=0){let n=M(e);if(!n)return;let r=B(n,["question","prompt","message","text","summary"])?.trim();if(!r)return;let s=B(n,["id","questionId","question_id","name"]),o=B(n,["header","title","label"]),d=(Array.isArray(n.options)?n.options:Array.isArray(n.choices)?n.choices:[]).map(or).filter(c=>!!c),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(c=>c.isOther);return{id:s??`question_${t+1}`,...o?{header:o}:{},question:r,options:d,...a?{multiSelect:!0}:{},...l?{allowsFreeText:!0}:{},...n.isSecret===!0||n.is_secret===!0?{isSecret:!0}:{}}}function ir(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}`:"",l=o.isOther?" (free text)":"";return` ${i+1}. ${o.label}${d}${l}${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 pt(e){if(e.length===0)return;let t=e.flatMap((n,r)=>[...r>0?[""]:[],...ir(n,r,e.length)]);return e.length>1&&t.push("","Reply with answers by question, for example: Q1: ..., Q2: ..."),t.join(`
20
+ `)}function ue(e,t,n){return ir(e,t,n).join(`
21
+ `)}function Ae(e){return{type:"backend_ref",ref:e}}function $e(e){return{type:"run_started",...e?{runId:e}:{}}}function ve(e){return{type:"text_delta",text:e}}function ft(e,t){return{type:"tool_call",name:e,input:t}}function oe(e){return{type:"pending_input",state:e}}function ye(e){return e?{type:"pending_input_resolved",requestId:e}:{type:"pending_input_resolved"}}function mt(e,t){return{type:"plan_artifact",artifact:e,finalized:t}}function Oe(e){return e?{type:"settings_changed",permissionMode:e}:{type:"settings_changed"}}function ce(e){return{type:"run_completed",data:e}}var we=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 js(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 Js(e,t,n){let r=Ee(n),s=r.length>0?0:void 0,o=s!=null?r[s]:void 0,i=o?.options.map(a=>a.label)??[],d=o?ue(o,s,r.length):pt(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 gt=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 we,r=!1,s="",o=!1,i=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(f,w)=>{if(f!=="AskUserQuestion")return{behavior:"allow"};let k=Js(d,++i,w);n.enqueue(oe(k));try{let p=await a(f,w);return n.enqueue(ye(k.requestId)),p}catch(p){throw n.enqueue(ye(k.requestId)),p}}}:{}};t.resumeSessionId&&(l.resume=t.resumeSessionId,l.forkSession=t.forkSession??!1);let c=t.prompt,m=this.deps.query??ht.query,u=this.deps.startup??ht.startup,h=(async()=>{if(typeof u!="function")return m({prompt:c,options:l});let f=await u({options:l});try{return f.query(c)}catch(w){throw await f.close?.(),w}})();return(async()=>{try{let f=await h;for await(let w of f){let k=w;if(k.type==="system"&&k.subtype==="init"){d=k.session_id??d,n.enqueue(Ae({kind:"claude-code",conversationId:d}));continue}if(k.type==="system"&&k.subtype==="status"&&k.permissionMode){n.enqueue(Oe(k.permissionMode));continue}if(k.type==="assistant"){r||(r=!0,n.enqueue($e()));for(let p of k.message?.content??[]){if(p.type==="text"){s+=s?`
23
+ ${p.text}`:p.text,n.enqueue(ve(p.text));continue}p.type==="tool_use"&&((p.name==="ExitPlanMode"||p.name==="set_permission_mode")&&(o=!0),p.name!=="AskUserQuestion"&&n.enqueue(ft(p.name,p.input)))}continue}if(k.type==="result"){let p=s.trim();if(p&&(t.permissionMode==="plan"||o)){let x={explanation:void 0,steps:[],markdown:p};n.enqueue(mt(x,!0))}n.enqueue(ce({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:js(k),session_id:k.session_id??d})),s="",o=!1,r=!1}}}finally{n.close()}})().catch(f=>{n.enqueue(ce({success:!1,duration_ms:0,total_cost_usd:0,num_turns:0,result:f instanceof Error?f.message:String(f),session_id:d})),n.close()}),{messages:n.messages(),async setPermissionMode(f){let w=await h;typeof w.setPermissionMode=="function"&&await w.setPermissionMode(f)},async streamInput(f){let w=await h;typeof w.streamInput=="function"&&await w.streamInput(f)},async interrupt(){let f=await h;typeof f.interrupt=="function"&&await f.interrupt()}}}buildUserMessage(t,n){return{type:"user",message:{role:"user",content:t},parent_tool_use_id:null,session_id:n}}};import{spawn as Qs}from"node:child_process";import Gs from"node:readline";function ar(e){return e instanceof Error?e.message:String(e)}function Ie(e,t){JSON.stringify({component:"CodexAppServerRpc",event:e,at:new Date().toISOString(),...t})}function Ks(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 Vs(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:ar(r)}})}}}var wt=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=Qs(this.command,["app-server",...this.args],{stdio:["pipe","pipe","pipe"],env:process.env});if(Ie("process.spawn",{...Ks(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,Gs.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=>{Ie("process.error",{pid:t.pid,error:ar(r)})}),t.on("close",(r,s)=>{Ie("process.close",{pid:t.pid,code:r,signal:s,pendingRequests:this.pending.size,recentStderr:Yt(this.stderrTail.trim())}),this.flushPending(new Error("codex app server stdio closed")),this.process=null})}async close(){Ie("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&&(Ie("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),l=setTimeout(()=>{this.pending.delete(s),Ie("request.timeout",{id:s,method:t,timeoutMs:a,pid:this.process?.pid,recentStderr:Yt(this.stderrTail.trim())}),d(new Error(this.buildTimeoutErrorMessage(t,a)))},a);l.unref?.(),this.pending.set(s,{resolve:i,reject:d,timer:l})});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 Vs(n,{pending:this.pending,onNotification:this.onNotification,onRequest:this.onRequest,respond:r=>this.write(r)})}flushPending(t){this.pending.size>0&&Ie("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: ${Yt(r)}`:"";return`codex app server timeout after ${n}ms: ${t}${s}`}};function Yt(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 dr={"gpt-6-astra":{input:10,cachedInput:1,output:50},"gpt-5.6-sol":{input:4,cachedInput:.4,output:20},"gpt-5.6-terra":{input:2,cachedInput:.2,output:12},"gpt-5.6-luna":{input:.2,cachedInput:.02,output:1.2}},Xs=272e3,Ys=1.25,eo=2,to=2,no=1.5,ro=1e6;function Qe(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?e:void 0}function so(e){let t=e?.trim().toLowerCase();if(t){if(t==="gpt-5.6")return"gpt-5.6-sol";if(t==="gpt-6-astra")return"gpt-6-astra";for(let n of Object.keys(dr))if(n!=="gpt-6-astra"&&(t===n||t.startsWith(`${n}-`)))return n}}function ur(e){let t=M(e),r=M(t?.account)?.type;return r==="apiKey"||r==="chatgpt"||r==="amazonBedrock"?r:void 0}function cr(e){let t=M(e),n=M(t?.usage),r=typeof t?.responseId=="string"?t.responseId.trim():"";if(!r||!n)return;let s=Qe(n.inputTokens),o=Qe(n.cachedInputTokens),i=Qe(n.cacheWriteInputTokens),d=Qe(n.outputTokens),a=Qe(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 lr(e){let t=so(e.model),n=t?dr[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(h=>Number.isSafeInteger(h)&&h>=0)||s+o>r||d>i)return;let a=r>Xs,l=e.fastMode?eo:1,c=l*(a?to:1),m=l*(a?no:1);return((r-s-o)*n.input*c+s*n.cachedInput*c+o*n.input*Ys*c+i*n.output*m)/ro}function pr(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 Ge(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 oo(e,t){if(!t||t.length===0)return!0;if(!e)return!1;let n=e.toLowerCase();return t.some(r=>Ge("codex",r)?.toLowerCase()===n)}function od(e,t,n){return e==="codex"?oo(t,n):pr(t,n)}function fr(e,t){return e!=="codex"||!t?!0:!t.includes("/")}function id(e,t,n){if(e!=="codex"||!t||!n||n.length===0)return t;let r=t.toLowerCase(),s=n.find(o=>Ge("codex",o)?.toLowerCase()===r);return Ge("codex",s)??t}function io(e){return e instanceof Error?e.message:String(e)}function mr(e){return e?e.split(",").map(t=>t.trim()).filter(Boolean):[]}function be(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(n=>be(n)).join("");let t=M(e);if(!t)return"";for(let n of["delta","text","content","message","input","output","parts"]){let r=be(t[n]);if(r)return r}for(let n of["item","turn","thread","response","result","data"]){let r=be(t[n]);if(r)return r}return""}function Ke(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:B(t,["threadId","thread_id","conversationId","conversation_id"])??B(n,["id","threadId","thread_id","conversationId"]),runId:B(t,["turnId","turn_id","runId","run_id"])??B(r,["id","turnId","turn_id","runId","run_id"]),requestId:B(t,["requestId","request_id","serverRequestId"])??B(o,["id","requestId","request_id"]),itemId:B(t,["itemId","item_id"])??B(s,["id","itemId","item_id"])}}function yt(e,t,n=0){if(n>6)return;if(Array.isArray(e)){for(let o of e){let i=yt(o,t,n+1);if(i)return i}return}let r=M(e);if(!r)return;let s=B(r,t);if(s)return s;for(let o of Object.values(r)){let i=yt(o,t,n+1);if(i)return i}}function Ze(e){return{threadId:Ke(e).threadId,cwd:yt(e,["cwd","workdir","directory"])}}function gr(e){let t=e?.trim();return!!(t&&/[/\\]worktrees[/\\][^/\\]+[/\\][^/\\]+/.test(t))}function hr(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 bt(e){let t=M(e);if(!t)return;let n=M(t.item)??t;return B(n,["id","itemId","item_id","messageId","message_id"])}function ao(e,t=!1){let n=M(e);if(!n)return"";let r=M(n.item)??n;return B(r,["type"])?.toLowerCase()!=="agentmessage"?"":t?be(r):B(r,["text"],{trim:!1})??be(r)}function wr(e,t){let n=e.trim().toLowerCase();return n==="item/agentmessage/delta"?{mode:"delta",text:be(t),itemId:bt(t)}:n==="item/completed"?{mode:"snapshot",text:ao(t),itemId:bt(t)}:{mode:"ignore",text:""}}function yr(e){return{itemId:bt(e),delta:be(e)}}function br(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=B(i,["step","title","text"]);if(!d)return null;let a=B(i,["status"])?.toLowerCase()??"pending";return{step:d,status:a==="inprogress"||a==="in_progress"?"inProgress":a==="completed"?"completed":"pending"}}).filter(Boolean);return{explanation:B(n,["explanation"])??B(t,["explanation"]),steps:s}}function kr(e){let t=M(e);if(!t)return{};let n=M(t.item)??t;return B(n,["type"])?.toLowerCase()!=="plan"?{}:{itemId:bt(n),text:B(n,["text"],{trim:!1})??be(n)}}function Pr(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=B(s,["status"])?.toLowerCase();return o==="failed"?"failed":o==="interrupted"||o==="cancelled"?"interrupted":"completed"}function Rr(e,t){let n=M(t)??{},r=M(n.turn)??n,s=M(r.error)??M(n.error);if(s)return B(s,["message","text","summary","reason"])}function uo(e,t){let n=io(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 co=new Set(["thread/resume","turn/start","turn/steer","turn/interrupt"]);function lo(e){return co.has(e.trim().toLowerCase())}function po(e){let t=M(e);return t?!!B(t,["threadId","thread_id"]):!1}async function Ve(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(lo(n)&&!po(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,!uo(s,n))continue}}throw t instanceof Error?t:new Error(String(t))}function xr(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 Sr(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 vr(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 fo(e){return[{type:"text",text:e}]}function mo(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 Ir(e){let t={threadId:e.threadId,input:fo(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=mo(e.permissionMode??"default",e.model,e.reasoningEffort,e.systemPrompt);return n?[{...t,collaborationMode:n}]:[t]}function Cr(e){return[{threadId:e.threadId,turnId:e.turnId}]}function go(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 Tr(e,t,n){let r=e.trim().toLowerCase(),s=r.includes("requestapproval"),o=r.includes("requestuserinput"),i=Ee(n);if(o&&i.length===0)throw new Error(`Malformed Codex request_user_input payload for ${t}: expected non-empty questions[]`);let d=s?lt(n):[],a=i.length>0?0:void 0,l=a!=null?i[a]:void 0,c=l?l.options:[],u=(s&&c.length===0?d:c).map(w=>w.label),h=(l?ue(l,a??0,i.length):pt(i))??(s?yt(n,["question","prompt","message","text","summary","reason"]):void 0)??void 0,f=s?u.map(w=>({kind:"approval",label:w,decision:go(w),responseDecision:w})):u.map(w=>({kind:"option",label:w,value:w}));return{requestId:t,kind:s?"approval":"question",promptText:h,options:u,...i.length>0?{questions:i}:{},...a!=null?{activeQuestionIndex:a}:{},actions:f,allowsFreeText:!0}}function _r(e){let t=e.trim().toLowerCase();return t.includes("requestuserinput")||t.includes("requestapproval")}function en(e,t){let n=e==="bypassPermissions"?"never":t?.trim()||"never";return{approvalPolicy:n,sandbox:n==="never"?"danger-full-access":void 0}}var ho="1.0",tn=12e4,Mr=["--listen","stdio://"],wo=5e3,yo="OPENCLAW_CODEX_APP_SERVER_COMMAND",bo="OPENCLAW_CODEX_APP_SERVER_ARGS",ko="OPENCLAW_CODEX_APP_SERVER_TIMEOUT_MS",Po=/^(?: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 Ro(e){let t=e?.trim();return t&&Po.test(t)?t:void 0}function xo(e){let t=e?.trim();if(!t||!/^\d+$/.test(t))return tn;let n=Number(t);return Number.isSafeInteger(n)&&n>0?n:tn}function Be(e){return e instanceof Error?e.message:String(e)}function X(e,t){JSON.stringify({component:"CodexHarness",event:e,at:new Date().toISOString(),...t})}function So(e){return{commandKind:e.command==="codex"?"codex":"custom",configuredArgCount:e.args.length,requestTimeoutMs:e.requestTimeoutMs}}function le(e){return{hasThreadId:!!e.threadId,hasTurnId:!!e.turnId,hasBackendWorktreePath:!!e.backendWorktreePath,hasBackendWorktreeId:!!e.backendWorktreeId}}function vo(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 Er(e,t,n){let r=e.questions??[],s=r[t];return s?{...e,promptText:ue(s,t,r.length),options:s.options.map(o=>o.label),activeQuestionIndex:t,answers:n}:e}var kt=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[yo]?.trim()||"codex",args:Io(process.env[bo]),requestTimeoutMs:xo(process.env[ko])},r=this.deps.createClient?.(n)??new wt(n.command,n.args,n.requestTimeoutMs),s=new we,o=Ro(t.resumeSessionId),i=t.forkSession===!0;t.resumeSessionId;let d,a=t.backendRef?.worktreePath,l=t.backendRef?.worktreeId,c=t.permissionMode??"default",m=Ge(this.name,t.model);if(!fr(this.name,m))throw new Error(`Codex model "${t.model}" is not supported. Use a bare Codex model id such as "gpt-6-astra" or "gpt-5.6-sol".`);let u,h=0,f,w=m,k=0,p=new Set,x="",N=[],$,q=new Map,Z=new Set,L=S=>{let y=S?.trim();if(!y)return;let b=t.originalWorkdir?.trim()||t.cwd.trim();t.worktreeStrategy&&t.worktreeStrategy!=="off"&&y!==b&&gr(y)&&(a=y,l=hr(y))},V=()=>{o&&s.enqueue(Ae({kind:"codex-app-server",conversationId:o,...d?{runId:d}:{},...l?{worktreeId:l}:{},...a?{worktreePath:a}:{}}))};r.setNotificationHandler(async(S,y)=>{let b=S.trim().toLowerCase(),v=Ke(y),D=Ze(y);if(v.threadId&&o&&v.threadId!==o)return;if(v.threadId&&(o=v.threadId),v.runId&&(d=v.runId),L(D.cwd),(v.threadId||v.runId||D.cwd)&&V(),b==="serverrequest/resolved"){u&&(s.enqueue(ye(u.requestId)),u=void 0);return}if(b==="model/rerouted"){let T=y&&typeof y=="object"&&!Array.isArray(y)?y:void 0;typeof T?.toModel=="string"&&T.toModel.trim()&&(w=T.toModel.trim());return}if(b==="rawresponse/completed"&&f==="apiKey"){let T=cr(y);if(!T||p.has(T.responseId))return;let J=lr({model:w,fastMode:t.fastMode,usage:T.usage});if(J===void 0)return;p.add(T.responseId),k+=J;return}if(b==="turn/plan/updated"){let T=br(y);x=T.explanation??x,T.steps.length>0&&(N=T.steps);return}if(b==="item/plan/delta"){let T=yr(y);if(T.itemId&&T.delta){let J=q.get(T.itemId)??"";q.set(T.itemId,`${J}${T.delta}`)}return}if(b==="item/completed"){let T=kr(y);if(T.text?.trim()){let J={explanation:x||void 0,steps:N,markdown:T.text.trim()};s.enqueue(mt(J,!0));return}}let _=wr(b,y);if(_.mode==="delta"&&_.text){_.itemId&&Z.add(_.itemId),s.enqueue(ve(_.text));return}_.mode==="snapshot"&&_.text&&(!_.itemId||!Z.has(_.itemId))&&s.enqueue(ve(_.text)),(b==="turn/completed"||b==="turn/failed"||b==="turn/cancelled")&&$&&($.method=S,$.params=y,$.resolve())}),r.setRequestHandler(async(S,y)=>{if(!_r(S))return{};let b=Ke(y),v=Ze(y);if(b.threadId&&o&&b.threadId!==o)return{};b.threadId&&(o=b.threadId),b.runId&&(d=b.runId),L(v.cwd),(b.threadId||b.runId||v.cwd)&&V();let D=b.requestId??`${o??"codex"}-${Date.now().toString(36)}`,_;try{_=Tr(S,D,y)}catch(ke){let Ye=Be(ke);return`${Ye}`,{error:Ye}}let T=S.trim().toLowerCase(),J=_.options,Q=_.actions??[],Ce=await new Promise(ke=>{u={requestId:D,methodLower:T,state:_,options:J,actions:Q,answers:{..._.answers??{}},resolveResponse:ke},s.enqueue(oe(_))});return u=void 0,s.enqueue(ye(D)),Ce});let pe=async()=>{X("client.initialize.start",{...So(n),hasResumeSessionId:!!t.resumeSessionId}),await r.connect(),await r.request("initialize",{protocolVersion:ho,clientInfo:{name:"openclaw-code-agent",version:"3.1.0"},capabilities:{experimentalApi:!0}},n.requestTimeoutMs),await r.notify("initialized",{});try{let S=await r.request("account/read",{refreshToken:!1},Math.min(n.requestTimeoutMs,wo));f=ur(S)}catch(S){X("account.read.unavailable",{error:Be(S)})}X("client.initialize.done",{hasResumeSessionId:!!t.resumeSessionId,accountType:f??"unknown"})},ie=async()=>{let S=en(c,t.codexApprovalPolicy);if(o){let v=i,D=v?"thread/fork":"thread/resume";X(v?"thread.fork.start":"thread.resume.start",le({threadId:o}));let _=await Ve({client:r,methods:[D],payloads:v?vr({threadId:o,cwd:t.cwd,model:m,fastMode:t.fastMode,approvalPolicy:S.approvalPolicy,sandbox:S.sandbox}):Sr({threadId:o,model:m,reasoningEffort:t.reasoningEffort,fastMode:t.fastMode,approvalPolicy:S.approvalPolicy,sandbox:S.sandbox}),timeoutMs:n.requestTimeoutMs}),T=Ze(_);o=T.threadId??o,v&&(i=!1),L(T.cwd),V(),X(v?"thread.fork.done":"thread.resume.done",{...le({threadId:o,backendWorktreePath:a,backendWorktreeId:l})});return}X("thread.start.start",{hasCwd:!!t.cwd});let y=await Ve({client:r,methods:["thread/start","thread/new"],payloads:xr({cwd:t.cwd,model:m,reasoningEffort:t.reasoningEffort,fastMode:t.fastMode,approvalPolicy:S.approvalPolicy,sandbox:S.sandbox}),timeoutMs:n.requestTimeoutMs}),b=Ze(y);if(o=b.threadId,!o)throw new Error("Codex App Server did not return a thread id.");L(b.cwd),V(),X("thread.start.done",{...le({threadId:o,backendWorktreePath:a,backendWorktreeId:l})})},E=async S=>{await ie(),w=m,X("turn.start",{...le({threadId:o}),runCounter:h+1,promptChars:S.length,permissionMode:c}),s.enqueue($e()),h+=1,x="",N=[],q.clear(),Z.clear();let y="",b,v,D=new Promise(_=>{v=_});$={resolve:v};try{let _=en(c,t.codexApprovalPolicy),T=await Ve({client:r,methods:["turn/start"],payloads:Ir({threadId:o,prompt:S,model:m,reasoningEffort:t.reasoningEffort,fastMode:t.fastMode,systemPrompt:t.systemPrompt,permissionMode:c,approvalPolicy:_.approvalPolicy,sandbox:_.sandbox}),timeoutMs:n.requestTimeoutMs}),J=Ke(T);J.runId&&(d=J.runId,V()),await D,y=$?.method??"turn/failed",b=$?.params;let Q=Pr(y,b);X("turn.terminal",{...le({threadId:o,turnId:d}),terminalMethod:y,outcome:Q}),s.enqueue(ce({success:Q==="completed",outcome:Q,duration_ms:0,total_cost_usd:k,num_turns:h,result:Rr(y,b),session_id:o}))}catch(_){X("turn.error",{...le({threadId:o,turnId:d}),error:Be(_)}),s.enqueue(ce({success:!1,duration_ms:0,total_cost_usd:k,num_turns:h,result:Be(_),session_id:o??""}))}finally{$=void 0}},R=async S=>{let y=u;if(!y)return!1;let b=S.trim();if(y.methodLower.includes("requestapproval"))return y.resolveResponse({decision:b||"decline"}),!0;let v=y.state.questions??[];if(v.length>0){if(!b)return!1;let D=y.state.activeQuestionIndex??0,_=v[D];if(!_)return!1;y.answers={...y.answers,[_.id]:{answers:[b]}};let T=D+1;if(T<v.length)return y.state=Er(y.state,T,y.answers),y.options=y.state.options,s.enqueue(oe(y.state)),!0;y.resolveResponse({answers:y.answers})}else y.resolveResponse({text:b});return!0},O=async(S,y={})=>{let b=u;if(!b||y.requestId&&y.requestId!==b.state.requestId)return!1;let v=b.actions[S];if(v?.kind==="approval")return b.resolveResponse({decision:v.responseDecision,...v.proposedExecpolicyAmendment?{proposedExecpolicyAmendment:v.proposedExecpolicyAmendment}:{}}),!0;let D=b.state.questions??[],_=b.state.activeQuestionIndex??0,T=D.length>0?D[_]:void 0;if(y.questionId&&y.questionId!==T?.id)return!1;let J=T?.options[S];if(T&&J){b.answers={...b.answers,[T.id]:{answers:[J.value??J.label]}};let Ce=_+1;return Ce<D.length?(b.state=Er(b.state,Ce,b.answers),b.options=b.state.options,s.enqueue(oe(b.state)),!0):(b.resolveResponse({answers:b.answers}),!0)}let Q=b.options[S];return Q?(b.methodLower.includes("requestapproval")?b.resolveResponse({decision:Q}):b.resolveResponse({option:Q,index:S}),!0):!1},z=typeof t.prompt=="string"?(async function*(){yield{type:"user",text:t.prompt,session_id:t.resumeSessionId??""}})():t.prompt;return(async()=>{try{await pe();for await(let S of z){let y=vo(S).trim();!y||await R(y)||await E(y)}}catch(S){X("session.error",{...le({threadId:o,turnId:d}),error:Be(S)}),s.enqueue(ce({success:!1,duration_ms:0,total_cost_usd:k,num_turns:h,result:Be(S),session_id:o??t.resumeSessionId??""}))}finally{X("client.close.start",le({threadId:o,turnId:d})),await r.close().catch(()=>{}),X("client.close.done",le({threadId:o,turnId:d})),s.close()}})(),{messages:s.messages(),async setPermissionMode(S){c=S,s.enqueue(Oe(S))},async submitPendingInputOption(S,y){return O(S,y)},async submitPendingInputText(S){return R(S)},async interrupt(){!o||!d||await Ve({client:r,methods:["turn/interrupt"],payloads:Cr({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 Io(e){if(e===void 0)return Mr;let t=mr(e);return t.length>0?t:Mr}import{spawn as Co}from"node:child_process";import{constants as To,accessSync as _o}from"node:fs";import{createServer as Mo}from"node:net";import{delimiter as Eo,dirname as nn,join as Or,sep as Ao}from"node:path";var $o="OPENCLAW_OPENCODE_COMMAND",Oo=15e3,Rt=6e4,Bo=250,No=15*6e4,qo=["edit","bash","task","todowrite","external_directory"];function qe(e){return e instanceof Error?e.message:String(e)}function Lo(e){try{return _o(e,To.X_OK),!0}catch{return!1}}function Wo(e){return e.includes("/")||Ao==="\\"&&e.includes("\\")}function Fo(e){let t=(e??"").split(Eo).map(r=>r.trim()).filter(Boolean),n=[...t];for(let r of t)r.replaceAll("\\","/").endsWith("/opt/node/bin")&&n.push(Or(nn(nn(nn(r))),"bin"));return n.push("/home/linuxbrew/.linuxbrew/bin","/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin"),[...new Set(n)]}function Uo(e,t=process.env.PATH){if(Wo(e))return e;for(let n of Fo(t)){let r=Or(n,e);if(Lo(r))return r}return e}function j(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Do(e){return typeof e?.cost=="number"&&Number.isFinite(e.cost)&&e.cost>=0?e.cost:0}function Ho(e){if(typeof e=="string")return e;if(!j(e))return String(e);if(typeof e.text=="string")return e.text;let t=j(e.message)?e.message:void 0;return typeof t?.content=="string"?t.content:String(e)}function Br(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 zo(e){let t=Br(e);return t?{id:t.modelID,providerID:t.providerID}:void 0}function Ar(e){let t=e??"default",n=t==="plan"?"deny":t==="bypassPermissions"?"allow":"ask";return qo.map(r=>({permission:r,pattern:"*",action:n}))}function rn(){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 jo(){return new Promise((e,t)=>{let n=Mo();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 Nr(e){await new Promise(t=>setTimeout(t,e))}async function Pt(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=l=>{s||(s=!0,o(),l())},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(l=>i(()=>n(l)),l=>i(()=>r(l)))})}async function Ne(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 sn=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 Jo(e){return e.headers.get("content-type")?.toLowerCase()??""}function on(e){return e.replace(/\s+/g," ").trim().slice(0,300)}function Qo(e,t){return e.includes("text/html")||/^\s*<!doctype html\b/i.test(t)||/^\s*<html[\s>]/i.test(t)}function Go(e,t,n,r){let s=n?`content-type ${n}`:"missing content-type",o=on(r),i=Qo(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 Ko(e,t,n){let r=Br(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(!j(e))return!1;if(!(t in e))return!0;let n=e[t];return j(n)&&n.type==="idle"}function Vo(e){return e.type==="session.idle"?!0:e.type!=="session.status"?!1:(e.properties.status??e.properties.type)==="idle"}var $r=Promise.resolve();function Xo(e){return new Promise((t,n)=>{$r=$r.then(()=>e().then(t,n)).catch(()=>{})})}async function Yo(e){return Xo(async()=>{let t=await jo(),n=process.env[$o]?.trim()||"opencode",r=Uo(n),s=["serve","--hostname","127.0.0.1","--port",String(t),"--print-logs"],o=e.fetch??fetch,i=Math.min(e.requestTimeoutMs??Rt,1e4),d=e.startupTimeoutMs??Oo,a=Co(r,s,{cwd:e.cwd,stdio:["ignore","pipe","pipe"]}),l=`http://127.0.0.1:${t}`,c="",m="",u,h=(p,x)=>{let N=p+String(x);return N.length>8e3?N.slice(-8e3):N};a.stdout.on("data",p=>{c=h(c,p)}),a.stderr.on("data",p=>{m=h(m,p)}),a.once("error",p=>{u=p});let f=()=>` Command: ${n===r?r:`${r} (resolved from ${n})`} ${s.join(" ")}. Cwd: ${e.cwd}. Port: ${t}. PATH: ${process.env.PATH??""}.`,w=()=>{let p=[c.trim(),m.trim()].filter(Boolean).join(`
25
+ `).trim();return`${f()}${p?` Output:
26
+ ${p}`:""}`},k=()=>{Ne(a)};if(e.signal?.aborted)throw await Ne(a),new Error(`OpenCode server startup aborted before readiness.${w()}`);e.signal?.addEventListener("abort",k,{once:!0});try{let p=Date.now();for(;Date.now()-p<d;){if(e.signal?.aborted)throw await Ne(a),new Error(`OpenCode server startup aborted before readiness.${w()}`);if(u)throw new Error(`OpenCode server failed to start: ${u.message}${w()}`);if(a.exitCode!==null)throw new Error(`OpenCode server exited before readiness.${w()}`);try{if(await ti({baseUrl:l,fetchImpl:o,requestTimeoutMs:i,startupSignal:e.signal,timeoutMessage:`OpenCode GET /api/health timed out after ${i}ms during server readiness.${w()}`,abortMessage:`OpenCode server startup aborted before readiness.${w()}`}))return{baseUrl:l,close:async()=>{await Ne(a)}}}catch{if(e.signal?.aborted)throw await Ne(a),new Error(`OpenCode server startup aborted before readiness.${w()}`)}await Nr(100)}throw await Ne(a),new Error(`Timed out waiting for OpenCode server readiness.${w()}`)}finally{e.signal?.removeEventListener("abort",k)}})}async function ei(e){for(let t=1;;t+=1)try{return await Yo(e)}catch(n){if(t>=3||!/EADDRINUSE|address already in use|bind: address already in use/i.test(qe(n)))throw n}}async function ti(e){let t=new AbortController,n=()=>t.abort();e.startupSignal?.aborted?t.abort():e.startupSignal?.addEventListener("abort",n,{once:!0});try{return(await Pt(e.fetchImpl(`${e.baseUrl}/api/health`,{headers:rn(),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 an=class{constructor(t,n,r=Rt){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,l=`OpenCode ${t} ${n} timed out after ${a}ms.`,c=`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 Pt(this.fetchImpl(`${this.baseUrl}${n}`,{method:t,headers:{...rn(),...r===void 0?{}:{"content-type":"application/json"}},body:r===void 0?void 0:JSON.stringify(r),signal:o.signal}),{timeoutMs:a,timeoutMessage:l,signal:s.signal,abortMessage:c,onTimeout:()=>{d=!0,o.abort()}});if(!u.ok){let w=await Pt(u.text(),{timeoutMs:a,timeoutMessage:l,signal:s.signal,abortMessage:c,onTimeout:()=>{d=!0,o.abort()}}).catch(()=>"");throw new sn(t,n,u.status,on(w))}if(u.status===204)return;let h=await Pt(u.text(),{timeoutMs:a,timeoutMessage:l,signal:s.signal,abortMessage:c,onTimeout:()=>{d=!0,o.abort()}});if(!h)return;let f=Jo(u);if(!f.includes("application/json")&&!f.includes("+json"))throw new Error(Go(t,n,f,h));try{return JSON.parse(h)}catch(w){let k=on(h);throw new Error(`OpenCode ${t} ${n} returned invalid JSON: ${qe(w)}${k?`: ${k}`:""}`)}}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:rn(),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 l=>{let c=l.split(/\r?\n/).filter(m=>m.startsWith("data:")).map(m=>m.slice(5).trimStart()).join(`
27
+ `).trim();!c||c==="[DONE]"||await t(JSON.parse(c))};for(;;){let{done:l,value:c}=await s.read();if(l)break;i+=o.decode(c,{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 ni(e){let t=j(e)&&j(e.payload)?e.payload:e;return j(t)?t.type==="sync"?{type:typeof t.name=="string"?t.name.replace(/\.\d+$/,""):void 0,properties:j(t.data)?t.data:{}}:{type:typeof t.type=="string"?t.type:void 0,properties:j(t.properties)?t.properties:t}:{properties:{}}}function ri(e){return typeof e.sessionID=="string"?e.sessionID:void 0}function si(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 oi(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=Ee(e),s=lt(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(l=>l.label)??s.map(l=>l.label);return{requestId:t,kind:"question",promptText:d?ue(d,i??0,o.length):n,options:a,...o.length>0?{questions:o}:{},...i!=null?{activeQuestionIndex:i}:{},allowsFreeText:!0}}function ii(e,t,n){let r=e.questions??[],s=r[t],o=s?.options.map(i=>i.label)??[];return{...e,promptText:s?ue(s,t,r.length):e.promptText,options:o,activeQuestionIndex:t,answers:n}}function ai(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 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}).
30
+ `)}function di(e){return dn(e).result}function dn(e){let t=Array.isArray(e)?e:j(e)&&Array.isArray(e.messages)?e.messages:j(e)&&Array.isArray(e.items)?e.items:[],n=[];for(let r of t){let s=j(r)&&j(r.info)?r.info:r;if(!j(s)||(typeof s.role=="string"?s.role:s.type)!=="assistant")continue;let i=Array.isArray(s.content)?s.content:[],d=j(r)&&Array.isArray(r.parts)?r.parts:[];for(let a of[...i,...d])j(a)&&a.type==="text"&&typeof a.text=="string"&&n.push(a.text)}return{count:n.length,result:n.at(-1)}}var xt=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 we,r=this.deps.fetch??fetch,s,o,i,d=t.resumeSessionId,a=0,l=t.permissionMode??"default",c,m=!t.resumeSessionId,u=!1,h=!1,f=new AbortController,w,k=!1,p=!1,x=!1,N=!1,$,q=!1,Z=!1,L,V=new Set,pe=P=>N?!1:(N=!0,n.enqueue(ce(P)),!0),ie=(P,g,I,C=0)=>pe({success:P,outcome:g,duration_ms:0,total_cost_usd:C,num_turns:a,result:I,session_id:d??""}),E=()=>{d&&L!==d&&(L=d,n.enqueue(Ae({kind:"opencode-server",conversationId:d})))},R=P=>{P&&V.has(P)||(P&&V.add(P),n.enqueue(ye(P)),P&&c?.requestId===P&&(c=void 0))},O=async()=>{if(o)return o;i??=(async()=>{let P=await(this.deps.createServer??ei)({cwd:t.cwd,signal:t.abortController?.signal,fetch:r,requestTimeoutMs:this.deps.requestTimeoutMs,startupTimeoutMs:this.deps.startupTimeoutMs});if(q||t.abortController?.signal.aborted)throw await P.close().catch(()=>{}),new Error("OpenCode startup was interrupted before session creation.");return s=P,o=new an(P.baseUrl,r,this.deps.requestTimeoutMs),o})();try{return await i}catch(P){throw i=void 0,P}},z=async(P,g)=>{!o||!d||await o.request("POST",`/permission/${encodeURIComponent(P)}/reply`,{reply:g})},S=async(P,g)=>{!o||!d||await o.request("POST",`/question/${encodeURIComponent(P)}/reply`,{answers:[[g]]})},y=async P=>{let g=ni(P),I=ri(g.properties);if(!(I&&I!==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=j(g.properties.part)?g.properties.part:void 0;if(g.type==="message.part.updated"&&C?.type!=="tool"){n.enqueue({type:"activity"});return}let U=typeof g.properties.tool=="string"?g.properties.tool:typeof C?.tool=="string"?C.tool:"tool";n.enqueue(ft(U,g.properties.input));return}if(g.type==="session.next.step.failed"||g.type==="session.error"){let C=j(g.properties.error)&&typeof g.properties.error.message=="string"?g.properties.error.message:`${g.type} failed`;p&&!x&&(w?.abort(),await Q(!1,C));return}if(g.type==="permission.asked"){if(l==="bypassPermissions"){let U=typeof g.properties.id=="string"?g.properties.id:void 0;U&&(await z(U,"once").catch(()=>{}),R(U));return}let C=si(g.properties);c={requestId:C.requestId,kind:"approval",options:C.options,actions:C.actions??[],state:C},n.enqueue(oe(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=oi(g.properties);c={requestId:C.requestId,kind:"question",options:C.options,actions:[],state:C},n.enqueue(oe(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")&&(Vo(g)&&(Z=!0),n.enqueue({type:"activity"}))}},b=()=>{k||!o||(k=!0,o.streamEvents(y,f.signal).catch(async P=>{!f.signal.aborted&&p&&!x&&(w?.abort(),await Q(!1,qe(P)))}).finally(()=>{k=!1}))},v=async(P,g)=>await P.request("GET",`/session/${encodeURIComponent(g)}/message`),D=async(P,g)=>await P.request("GET",`/session/${encodeURIComponent(g)}`,void 0,{timeoutMs:Math.min(this.deps.requestTimeoutMs??Rt,Bo)}),_=async(P,g,I,C,U)=>{await P.request("POST",`/session/${encodeURIComponent(g)}/prompt_async`,Ko(I,t.model,C),{signal:U})},T=async(P,g,I,C)=>{let U=Date.now(),Y=!1,K=I,fe,Te=0,me,gn=this.deps.turnTimeoutMs??No;for(;;){if(C.aborted)throw new Error("wait aborted");let Hr=await v(P,g).catch(()=>{}),ge=dn(Hr),hn=ge.count>I&&!!ge.result;hn&&ge.count===K&&ge.result===fe?Te+=1:(Te=hn?1:0,K=ge.count,fe=ge.result);let It=!1;try{let Le=await P.request("GET","/session/status",void 0,{signal:C,timeoutMs:Math.min(this.deps.requestTimeoutMs??Rt,1e4)});It=Zo(Le,g),me=void 0,It||(Y=!0)}catch(Le){if(C.aborted)throw new Error("wait aborted");me=qe(Le)}if(It&&(Y||ge.count>I)||Z&&ge.count>I||Te>=2&&me)return;if(Date.now()-U>gn){let Le=me?` Last status error: ${me}`:"";throw new Error(`Timed out waiting for OpenCode session ${g} to become idle after ${gn}ms.${Le}`)}await Nr(250)}},J=async()=>{let P=await O();if(d){if(t.forkSession&&!u){let C=await P.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 v(P,d),m=!0);return E(),b(),d}let g=zo(t.model),I=await P.request("POST","/session",{...g?{model:g}:{},metadata:{client:"openclaw-code-agent"},permission:Ar(l)});if(!I.id)throw new Error("OpenCode did not return a session id.");return d=I.id,m=!0,E(),b(),d},Q=(P,g,I=P?"completed":"failed")=>($??=(async()=>{let C=g,U=0;if(o&&d){let[Y,K]=await Promise.all([P?v(o,d).catch(()=>{}):Promise.resolve(void 0),D(o,d).catch(()=>{})]);C=C??di(Y),U=Do(K)}q?ie(!1,"interrupted",void 0,U):ie(P,I,C,U)})(),$),Ce=async P=>{p=!0,x=!1,N=!1,$=void 0,Z=!1;try{let g=await O();if(q)return;let I=await J();if(q)return;n.enqueue($e()),a+=1;let C=h?void 0:t.systemPrompt,U=await v(g,I).catch(()=>{}),Y=dn(U).count,K=new AbortController;w=K,await _(g,I,P,C,K.signal),h=!0,await T(g,I,Y,K.signal),w=void 0,x=!0,await Q(!0)}catch(g){w=void 0,q?await Q(!1,void 0,"interrupted"):await Q(!1,qe(g))}finally{p=!1,x=!1}},ke=async(P,g={})=>{let I=c;if(!I||I.kind!=="question"||g.requestId&&g.requestId!==I.requestId)return!1;let C=P.trim();if(!C)return!1;let U=I.state?.questions??[];if(U.length>0){let Y=I.state?.activeQuestionIndex??0,K=U[Y];if(!K||g.questionId&&g.questionId!==K.id)return!1;I.answers={...I.answers,[K.id]:{answers:[C]}};let fe=Y+1;return fe<U.length?(I.state=ii(I.state,fe,I.answers),I.options=I.state.options,n.enqueue(oe(I.state)),!0):(await S(I.requestId,ai(U,I.answers)),R(I.requestId),!0)}return await S(I.requestId,C),R(I.requestId),!0},Ye=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 Ye){if(q)break;let g=Ho(P).trim();if(g){if(c?.kind==="question"){await ke(g);continue}if(await Ce(g),q)break}}}catch(P){q||(p||(N=!1,$=void 0),await Q(!1,qe(P)))}finally{f.abort(),await s?.close().catch(()=>{}),n.close()}})(),{messages:n.messages(),async setPermissionMode(P){d&&await(await O()).request("PATCH",`/session/${encodeURIComponent(d)}`,{permission:Ar(P)}),l=P,n.enqueue(Oe(P))},async submitPendingInputOption(P,g={}){let I=c;if(!I||g.requestId&&g.requestId!==I.requestId)return!1;if(I.kind==="approval"){let Te=I.actions[P],me=Te?.kind==="approval"?Te.responseDecision:void 0;return me?(await z(I.requestId,me),R(I.requestId),!0):!1}let C=I.state?.questions??[],U=I.state?.activeQuestionIndex??0,Y=C[U];if(g.questionId&&g.questionId!==Y?.id)return!1;let K=Y?.options[P],fe=K?.value??K?.label??I.options[P];return fe?await ke(fe,g):!1},async submitPendingInputText(P){return await ke(P)},async interrupt(){if(q=!0,f.abort(),w?.abort(),p||(N=!1,$=void 0),!o){ie(!1,"interrupted"),await s?.close().catch(()=>{});return}if(!d){ie(!1,"interrupted");return}await o.request("POST",`/session/${encodeURIComponent(d)}/abort`).catch(()=>{}),await Q(!1,void 0,"interrupted")}}}buildUserMessage(t,n){return{type:"user",text:t,session_id:n}}};var un=new Map;function cn(e){un.set(e.name,e)}function ln(e){let t=un.get(e);if(!t)throw new Error(`Unknown agent harness: "${e}". Available: ${[...un.keys()].join(", ")}`);return t}function Td(){return ln(et())}cn(new gt);cn(new kt);cn(new xt);function Xe(e){return e.backendRef?.conversationId??e.harnessSessionId}function St(e){return e.id??e.sessionId??e.name??Xe(e)??e.harnessSessionId}function ui(e){return e.harnessSessionId}function pn(e){let t=[St(e),Xe(e),ui(e)].filter(n=>!!n);return[...new Set(t)]}function ci(e){return e.harnessName??e.persistedHarness??et()}function li(e){if(e.backendRef?.kind==="codex-app-server")return"native-restore";try{return ln(ci(e)).capabilities.worktrees}catch{return"plugin-managed"}}function pi(e){return e==="native-execution"}function fi(e){return e==="native-restore"}function mi(e){return!!(e.backendRef?.worktreePath||e.backendRef?.worktreeId)}function Ad(e){let t=li(e);return(pi(t)||fi(t))&&mi(e)}function qr(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 Lr(e,t){let n=e.resolve(t),r=e.getPersistedSession(t),s=n?St(n):r?St(r):void 0,o=n?.getOutput?.().join(`
31
+ `).trim(),i;if(r?.outputPath&&gi(r.outputPath))try{i=hi(r.outputPath,"utf-8").trim()}catch{}let d=qr(o),a=qr(i),l=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: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}:{},...r.reasoningEffort!==void 0?{reasoningEffort:r.reasoningEffort}:{}}:void 0)}}function fn(e){return[...e.persistedSession?pn(e.persistedSession):[],...e.activeSession?pn(e.activeSession):[]].filter((t,n,r)=>r.indexOf(t)===n)}function wi(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 qd(e,t,n={}){let{activeSession:r,persistedSession:s}=wi(e,t),o=Qn({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 Ld(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=Xe(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:Xe(s),harnessSessionId:s.harnessSessionId});return Array.from(r.values())}function Wd(e,t){return e.id===t||e.name===t||e.backendConversationId===t||e.harnessSessionId===t}function Fd(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 Ud(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 bi(e){return!e||typeof e!="object"?!1:typeof e.session=="string"}function ki(e,t){return e===!0&&t?.exists===!0&&t.state!=="open"}function Wr(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 Pi(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 Fr(e,t,n){A(t),A(n);try{let r=Pi(e,t);return r?(vt("git",["-C",r,"merge","--ff-only",F(n)],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),{success:!0,branchName:t,alreadyRepresented:!1}):(Re(e)===t?vt("git",["-C",e,"merge","--ff-only",F(n)],{timeout:3e4,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}):vt("git",["-C",e,"branch","-f",t,F(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 Ri(e){let{repoDir:t,sourceBranch:n,targetPrStatus:r}=e;if(A(n),!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;A(s);let o=vn(t,s),i=o??s;if(s===n&&!o)return{success:!0,branchName:n,alreadyRepresented:!1};if(!Pe(t,s)&&!o)return{success:!1,error:`Target PR branch ${s} is not available locally. Fetch it before updating the PR.`};if(re(t,n,i)){if(o&&!re(t,o,s)&&re(t,s,o)){let d=Fr(t,s,o);if("error"in d)return d}return{success:!0,branchName:s,alreadyRepresented:!!o}}return Re(t)===s&&re(t,i,s)&&re(t,n,s)?{success:!0,branchName:s,alreadyRepresented:!1}:re(t,i,n)?Fr(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 xi(e){let t=Re(e.repoDir);if(!t||t!==e.expectedParentBranch||t===e.worktreeBranch||t===e.baseBranch)return;let n=he(e.repoDir,t,e.targetRepo);return n.exists&&n.state==="open"&&n.headRefName===t&&(!n.baseRefName||n.baseRefName===e.baseBranch)?n:void 0}function Si(e){let t=e.targetPrStatus.headRefName;if(!t||t===e.fallbackBranch)return e.fallbackBranch;let n=Re(e.repoDir);return n===t?n:e.fallbackBranch}function Ur(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 Dr(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 vi(e){let t=e.prStatus.number??e.prStatus.url;if(!t)return{status:"skipped",reason:"missing-pr-identity"};let n=e.operations?.getBody??Un,r=e.operations?.updateBody??Dn,s=e.operations?.updateTitle??Hn;if(e.explicitTitle!==void 0||e.explicitBody!==void 0){let f=e.explicitTitle===void 0?!1:s(e.repoDir,t,e.explicitTitle,e.targetRepo);if(e.explicitTitle!==void 0&&!f)return{status:"failed",reason:"failed to update explicit PR title"};let w=e.explicitBody===void 0?!1:r(e.repoDir,t,e.explicitBody,e.targetRepo);return e.explicitBody!==void 0&&!w?{status:"failed",reason:"failed to update explicit PR body"}:{status:"updated",updatedTitle:f,updatedBody:w,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||Zt(i)))return{status:"skipped",reason:"human-edited"};let a=await dt({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||!Vt(i)))return{status:"failed",reason:"generated PR metadata was unavailable; preserved existing generated PR metadata"};let c=ut({sessionName:e.sessionName,metadata:a.metadata,diffSummary:e.diffSummary}),m=e.forceRefresh||Xt(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(c.trim()===i.trim())return u?{status:"updated",updatedTitle:u,updatedBody:!1,reason:e.forceRefresh?"forced":"generated"}:{status:"skipped",reason:"unchanged"};let h=r(e.repoDir,t,c,e.targetRepo);return h?{status:"updated",updatedTitle:u,updatedBody:h,reason:e.forceRefresh?"forced":"generated"}:{status:"failed",reason:"failed to update generated PR body"}}function mn(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 Xd(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:G.Object({session:G.String({description:"Session name or ID to create/update PR for"}),title:G.Optional(G.String({description:"PR title (default: auto-generated from session name)"})),body:G.Optional(G.String({description:"PR body (default: auto-generated from commit summary). For existing open PRs, passing body explicitly replaces the PR body."})),update_body:G.Optional(G.Boolean({description:"For existing open PRs, refresh generated PR metadata when true. Alias for update_metadata; retained for compatibility."})),update_metadata:G.Optional(G.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:G.Optional(G.String({description:"Literal Git branch name for the PR; options and revision expressions are rejected (default: detected from repo)"})),force_new:G.Optional(G.Boolean({description:"Force creation of a new PR even if one exists (default: false)"})),target_repo:G.Optional(G.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(!ae)return{content:[{type:"text",text:"Error: SessionManager not initialized. The code-agent service must be running."}],meta:{success:!1,state:"error"}};if(!bi(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(r.base_branch!==void 0){let R=Ct(r.base_branch);if(R)return{content:[{type:"text",text:`Error: ${R}`}],meta:{success:!1,state:"error"}}}if(!ne())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=Lr(ae,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:l}=s,{branchName:c}=s;if(!d||!a)return{content:[{type:"text",text:`Error: Session "${r.session}" does not have a worktree.`}],meta:{success:!1,state:"error"}};if(!c)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"}};yi(d)||`${d}${c}${a}`;let m=r.base_branch??ot(a),u=t.metadataProvider??Kt(),h=R=>{let O=rr({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 z of fn(s))ae.updatePersistedSession(z,O)},f=Tn(a,r.target_repo??i?.worktreePrTargetRepo),w=i?.worktreePrUrl??o?.worktreePrUrl,k=w?De(a,w,f):void 0;if(w&&!k?.exists)return{content:[{type:"text",text:`Error: Session is associated with ${w}, but that PR could not be resolved. Refusing to create a sibling PR from ${c}.`}],meta:{success:!1,state:"error"}};let p=ki(r.force_new,k),x=p?void 0:w,N=!w&&!r.force_new?xi({repoDir:a,worktreeBranch:c,expectedParentBranch:i?.worktreeParentBranch??o?.worktreeParentBranch,baseBranch:m,targetRepo:f}):void 0,$=p?void 0:k??N,q=x??N?.url,Z=!1;if($?.exists&&$.state==="open"){let R=Si({repoDir:a,fallbackBranch:c,targetPrStatus:$}),O=Ri({repoDir:a,sourceBranch:R,targetPrStatus:$});if("error"in O)return{content:[{type:"text",text:`Error: ${O.error}`}],meta:{success:!1,state:"error"}};c=O.branchName,Z=O.alreadyRepresented}let L=ae.resolveRepoPolicy(a),V=Wr($?.exists?$:he(a,c,f),k,{forceNewIgnoresClosedTargetPr:p}),pe=V.exists&&V.state==="open";if(L?.policy==="never-pr"&&!pe)return{content:[{type:"text",text:`Error: Repo policy forbids PR creation for ${L.identity?.repoRoot??a}.`}],meta:{success:!1,state:"error"}};if(L&&!L.prAvailable)return{content:[{type:"text",text:`Error: PR automation is unavailable for ${L.identity?.repoRoot??a}. Provider: ${L.provider}.`}],meta:{success:!1,state:"error"}};if((!$||$.state==="open")&&!Z&&!On(a,c))return{content:[{type:"text",text:`❌ Failed to push ${c} — cannot create/update PR`}],meta:{success:!1,state:"error"}};let E=Wr(q?De(a,q,f):he(a,c,f),k,{forceNewIgnoresClosedTargetPr:p});if(r.force_new&&E.exists)return{content:[{type:"text",text:`⚠️ Cannot create new PR: A PR already exists for ${c} (${E.state}).
32
32
 
33
- Existing PR: ${A.url}
33
+ Existing PR: ${E.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(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.
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(E.exists&&E.state==="open"){let R=Ft(a,c,m),O=await vi({repoDir:a,prStatus:E,targetRepo:f,sessionName:l,branchName:c,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 z=R.commitMessages.slice(0,5).map(v=>`• ${v.hash} ${v.message} (${v.author})`).join(`
36
+ `),S=R.commits>5?`
37
+ ...and ${R.commits-5} more commits`:"",y=["🔄 **New commits pushed**","",`${R.commits} new commits (+${R.insertions} / -${R.deletions})`,"","### Latest commits:",z+S,"","---","🤖 [openclaw-code-agent](https://github.com/goldmar/openclaw-code-agent)"].join(`
38
+ `);if(zn(a,E.number,y,f)){h({prUrl:E.url,prNumber:E.number,targetRepo:f});let v=Ut({kind:"pr-updated",branch:c,prUrl:E.url,filesChanged:R.filesChanged,insertions:R.insertions,deletions:R.deletions});return ae.notifyWorktreeOutcome(s.notificationTarget,v,{completionWakeOutcomeKey:Dr({action:"updated",branchName:c,prUrl:E.url,prNumber:E.number,targetRepo:f,diffSummary:R}),detailLines:Ur({action:"updated",branchName:c,baseBranch:m,prUrl:E.url,prNumber:E.number,targetRepo:f,commits:R.commits,insertions:R.insertions,deletions:R.deletions})}),{content:[{type:"text",text:[`${v}`,"",`📝 Added comment detailing ${R.commits} new commits (+${R.insertions} / -${R.deletions})`,mn(O)].filter(Boolean).join(`
39
+ `)}],meta:{success:!0,state:"pr_updated"}}}else{let v=mn(O);return{content:[{type:"text",text:`⚠️ Pushed to ${E.url} but failed to add comment.
40
40
 
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}
41
+ ${R.commits} new commits (+${R.insertions} / -${R.deletions})${v?`
42
+ ${v}`:""}`}],meta:{success:!0,state:"pr_open"}}}}else{h({prUrl:E.url,prNumber:E.number,targetRepo:f});let z=mn(O);return{content:[{type:"text",text:`ℹ️ PR already exists and is up to date: ${E.url}
43
43
 
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}
44
+ No new commits to push.${z?`
45
+ ${z}`:""}`}],meta:{success:!0,state:"pr_open"}}}}else if(E.exists&&E.state==="merged"){let R={...nr({worktreeBaseBranch:i?.worktreeBaseBranch??o?.worktreeBaseBranch??m,worktreePrTargetRepo:i?.worktreePrTargetRepo??o?.worktreePrTargetRepo,worktreePushRemote:i?.worktreePushRemote??o?.worktreePushRemote},{resolutionSource:"agent_pr",clearResolverSessionId:!0}),worktreePrUrl:E.url,worktreePrNumber:E.number,worktreeDisposition:"merged",worktreeDecisionSnoozedUntil:void 0};for(let O of fn(s))ae.updatePersistedSession(O,R);return{content:[{type:"text",text:`✅ PR was already merged: ${E.url}
46
46
 
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}
47
+ The worktree branch ${c} can be cleaned up with agent_merge(delete_branch=true).`}],meta:{success:!0,state:"merged"}}}else{if(E.exists&&E.state==="closed")return{content:[{type:"text",text:`⚠️ A PR exists but was closed without merging: ${E.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(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}
55
+ (This tool cannot automatically reopen or recreate PRs to avoid unintended actions.)`}],meta:{success:!1,state:"closed"}};{if(L?.policy==="never-pr")return{content:[{type:"text",text:`Error: Repo policy forbids PR creation for ${L.identity?.repoRoot??a}.`}],meta:{success:!1,state:"error"}};let R=!r.title||!r.body?Ft(a,c,m):void 0,O;if(!r.title||!r.body){let b=await dt({sessionName:l,branchName:c,prompt:s.prompt,outputPreview:s.outputPreview,diffSummary:R,provider:u});if(b.ok===!1)return{content:[{type:"text",text:`❌ ${b.error}`}],meta:{success:!1,state:"error"}};O=b.metadata}let z=r.title??O.title,S=r.body;S||(S=ut({sessionName:l,metadata:O,diffSummary:R}));let y=Fn(a,c,m,z,S,f,{draft:!0});if(y.success&&y.prUrl){let b=he(a,c,f);h({prUrl:y.prUrl,prNumber:b.number,targetRepo:f,disposition:"pr-opened"});let v=Ut({kind:"pr-opened",branch:c,targetRepo:f,prUrl:y.prUrl});return ae.notifyWorktreeOutcome(s.notificationTarget,v,{completionWakeOutcomeKey:Dr({action:"opened",branchName:c,prUrl:y.prUrl,prNumber:b.number,targetRepo:f}),detailLines:Ur({action:"opened",branchName:c,baseBranch:m,prUrl:y.prUrl,prNumber:b.number,targetRepo:f})}),{content:[{type:"text",text:y.warnings&&y.warnings.length>0?`${v}
56
56
 
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};
57
+ ⚠️ ${y.warnings.join("; ")}`:v}],meta:{success:!0,state:"created"}}}else return{content:[{type:"text",text:`❌ Failed to create PR: ${y.error??"unknown error"}`}],meta:{success:!1,state:"error"}}}}}}}export{La as a,Kn as b,Wa as c,Fa as d,bn as e,$t as f,kn as g,$i as h,Oi as i,Fi as j,te as k,Ui as l,et as m,Di as n,Hi as o,zi as p,ji as q,Ji as r,cs as s,ls as t,Qi as u,ps as v,Gi as w,Ct as x,A as y,G as z,ae as A,Qr as B,Gr as C,_i as D,Mi as E,Ei as F,Ge as G,od as H,fr as I,id as J,ln as K,Td as L,Xe as M,St as N,pn as O,ci as P,li as Q,pi as R,fi as S,Ad as T,ta as U,ne as V,na as W,ra as X,vn as Y,ot as Z,Re as _,sa as $,re as aa,Cn as ba,oa as ca,Tn as da,pa as ea,En as fa,An as ga,fa as ha,ma as ia,ga as ja,_s as ka,ka as la,Ft as ma,On as na,Pa as oa,he as pa,De as qa,Ut as ra,Qn as sa,za as ta,ja as ua,nr as va,Lr as wa,fn as xa,qd as ya,Ld as za,Wd as Aa,Fd as Ba,Ud as Ca,dt as Da,Kt as Ea,Zt as Fa,Vt as Ga,Xt as Ha,ut as Ia,ki as Ja,Wr as Ka,Ri as La,xi as Ma,Si as Na,Ur as Oa,Dr as Pa,vi as Qa,Xd as Ra};