openclaw-code-agent 4.7.5 → 4.7.7

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